metamaps/metamaps

View on GitHub
app/assets/javascripts/metamaps.secret.bundle.js

Summary

Maintainability
A
0 mins
Test Coverage
/******/ (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] = {
/******/             exports: {},
/******/             id: moduleId,
/******/             loaded: false
/******/         };

/******/         // Execute the module function
/******/         modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);

/******/         // Flag the module as loaded
/******/         module.loaded = 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;

/******/     // __webpack_public_path__
/******/     __webpack_require__.p = "";

/******/     // Load entry module and return exports
/******/     return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';\nvar _backbone = __webpack_require__(1);var _backbone2 = _interopRequireDefault(_backbone);\n\n\n\n\nvar _Metamaps = __webpack_require__(4);var _Metamaps2 = _interopRequireDefault(_Metamaps);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}try {_backbone2.default.$ = window.$;} catch (err) {} // make changes to Backbone before loading Metamaps code\n_backbone2.default.ajax = function (opts) {return window.$.ajaxq('backbone-ajaxq', opts);};\n// create global references\nwindow._ = undefined;\nwindow.Metamaps = _Metamaps2.default;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMC5qcyIsInNvdXJjZXMiOlsiZnJvbnRlbmQvc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIG1ha2UgY2hhbmdlcyB0byBCYWNrYm9uZSBiZWZvcmUgbG9hZGluZyBNZXRhbWFwcyBjb2RlXG5pbXBvcnQgQmFja2JvbmUgZnJvbSAnYmFja2JvbmUnXG50cnkgeyBCYWNrYm9uZS4kID0gd2luZG93LiQgfSBjYXRjaCAoZXJyKSB7fVxuQmFja2JvbmUuYWpheCA9IChvcHRzKSA9PiB3aW5kb3cuJC5hamF4cSgnYmFja2JvbmUtYWpheHEnLCBvcHRzKVxuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgTWV0YW1hcHMgZnJvbSAnLi9NZXRhbWFwcydcblxuLy8gY3JlYXRlIGdsb2JhbCByZWZlcmVuY2VzXG53aW5kb3cuXyA9IF9cbndpbmRvdy5NZXRhbWFwcyA9IE1ldGFtYXBzXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL2luZGV4LmpzIl0sIm1hcHBpbmdzIjoiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 1 */
/***/ function(module, exports, __webpack_require__) {

    eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(global) {//     Backbone.js 1.3.3\n\n//     (c) 2010-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n//     Backbone may be freely distributed under the MIT license.\n//     For all details and documentation:\n//     http://backbonejs.org\n\n(function(factory) {\n\n  // Establish the root object, `window` (`self`) in the browser, or `global` on the server.\n  // We use `self` instead of `window` for `WebWorker` support.\n  var root = (typeof self == 'object' && self.self === self && self) ||\n            (typeof global == 'object' && global.global === global && global);\n\n  // Set up Backbone appropriately for the environment. Start with AMD.\n  if (true) {\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(2), __webpack_require__(3), exports], __WEBPACK_AMD_DEFINE_RESULT__ = function(_, $, exports) {\n      // Export global even in AMD case in case this script is loaded with\n      // others that may still expect a global Backbone.\n      root.Backbone = factory(root, exports, _, $);\n    }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n  // Next for Node.js or CommonJS. jQuery may not be needed as a module.\n  } else if (typeof exports !== 'undefined') {\n    var _ = require('underscore'), $;\n    try { $ = require('jquery'); } catch (e) {}\n    factory(root, exports, _, $);\n\n  // Finally, as a browser global.\n  } else {\n    root.Backbone = factory(root, {}, root._, (root.jQuery || root.Zepto || root.ender || root.$));\n  }\n\n})(function(root, Backbone, _, $) {\n\n  // Initial Setup\n  // -------------\n\n  // Save the previous value of the `Backbone` variable, so that it can be\n  // restored later on, if `noConflict` is used.\n  var previousBackbone = root.Backbone;\n\n  // Create a local reference to a common array method we'll want to use later.\n  var slice = Array.prototype.slice;\n\n  // Current version of the library. Keep in sync with `package.json`.\n  Backbone.VERSION = '1.3.3';\n\n  // For Backbone's purposes, jQuery, Zepto, Ender, or My Library (kidding) owns\n  // the `$` variable.\n  Backbone.$ = $;\n\n  // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable\n  // to its previous owner. Returns a reference to this Backbone object.\n  Backbone.noConflict = function() {\n    root.Backbone = previousBackbone;\n    return this;\n  };\n\n  // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option\n  // will fake `\"PATCH\"`, `\"PUT\"` and `\"DELETE\"` requests via the `_method` parameter and\n  // set a `X-Http-Method-Override` header.\n  Backbone.emulateHTTP = false;\n\n  // Turn on `emulateJSON` to support legacy servers that can't deal with direct\n  // `application/json` requests ... this will encode the body as\n  // `application/x-www-form-urlencoded` instead and will send the model in a\n  // form param named `model`.\n  Backbone.emulateJSON = false;\n\n  // Proxy Backbone class methods to Underscore functions, wrapping the model's\n  // `attributes` object or collection's `models` array behind the scenes.\n  //\n  // collection.filter(function(model) { return model.get('age') > 10 });\n  // collection.each(this.addView);\n  //\n  // `Function#apply` can be slow so we use the method's arg count, if we know it.\n  var addMethod = function(length, method, attribute) {\n    switch (length) {\n      case 1: return function() {\n        return _[method](this[attribute]);\n      };\n      case 2: return function(value) {\n        return _[method](this[attribute], value);\n      };\n      case 3: return function(iteratee, context) {\n        return _[method](this[attribute], cb(iteratee, this), context);\n      };\n      case 4: return function(iteratee, defaultVal, context) {\n        return _[method](this[attribute], cb(iteratee, this), defaultVal, context);\n      };\n      default: return function() {\n        var args = slice.call(arguments);\n        args.unshift(this[attribute]);\n        return _[method].apply(_, args);\n      };\n    }\n  };\n  var addUnderscoreMethods = function(Class, methods, attribute) {\n    _.each(methods, function(length, method) {\n      if (_[method]) Class.prototype[method] = addMethod(length, method, attribute);\n    });\n  };\n\n  // Support `collection.sortBy('attr')` and `collection.findWhere({id: 1})`.\n  var cb = function(iteratee, instance) {\n    if (_.isFunction(iteratee)) return iteratee;\n    if (_.isObject(iteratee) && !instance._isModel(iteratee)) return modelMatcher(iteratee);\n    if (_.isString(iteratee)) return function(model) { return model.get(iteratee); };\n    return iteratee;\n  };\n  var modelMatcher = function(attrs) {\n    var matcher = _.matches(attrs);\n    return function(model) {\n      return matcher(model.attributes);\n    };\n  };\n\n  // Backbone.Events\n  // ---------------\n\n  // A module that can be mixed in to *any object* in order to provide it with\n  // a custom event channel. You may bind a callback to an event with `on` or\n  // remove with `off`; `trigger`-ing an event fires all callbacks in\n  // succession.\n  //\n  //     var object = {};\n  //     _.extend(object, Backbone.Events);\n  //     object.on('expand', function(){ alert('expanded'); });\n  //     object.trigger('expand');\n  //\n  var Events = Backbone.Events = {};\n\n  // Regular expression used to split event strings.\n  var eventSplitter = /\\s+/;\n\n  // Iterates over the standard `event, callback` (as well as the fancy multiple\n  // space-separated events `\"change blur\", callback` and jQuery-style event\n  // maps `{event: callback}`).\n  var eventsApi = function(iteratee, events, name, callback, opts) {\n    var i = 0, names;\n    if (name && typeof name === 'object') {\n      // Handle event maps.\n      if (callback !== void 0 && 'context' in opts && opts.context === void 0) opts.context = callback;\n      for (names = _.keys(name); i < names.length ; i++) {\n        events = eventsApi(iteratee, events, names[i], name[names[i]], opts);\n      }\n    } else if (name && eventSplitter.test(name)) {\n      // Handle space-separated event names by delegating them individually.\n      for (names = name.split(eventSplitter); i < names.length; i++) {\n        events = iteratee(events, names[i], callback, opts);\n      }\n    } else {\n      // Finally, standard events.\n      events = iteratee(events, name, callback, opts);\n    }\n    return events;\n  };\n\n  // Bind an event to a `callback` function. Passing `\"all\"` will bind\n  // the callback to all events fired.\n  Events.on = function(name, callback, context) {\n    return internalOn(this, name, callback, context);\n  };\n\n  // Guard the `listening` argument from the public API.\n  var internalOn = function(obj, name, callback, context, listening) {\n    obj._events = eventsApi(onApi, obj._events || {}, name, callback, {\n      context: context,\n      ctx: obj,\n      listening: listening\n    });\n\n    if (listening) {\n      var listeners = obj._listeners || (obj._listeners = {});\n      listeners[listening.id] = listening;\n    }\n\n    return obj;\n  };\n\n  // Inversion-of-control versions of `on`. Tell *this* object to listen to\n  // an event in another object... keeping track of what it's listening to\n  // for easier unbinding later.\n  Events.listenTo = function(obj, name, callback) {\n    if (!obj) return this;\n    var id = obj._listenId || (obj._listenId = _.uniqueId('l'));\n    var listeningTo = this._listeningTo || (this._listeningTo = {});\n    var listening = listeningTo[id];\n\n    // This object is not listening to any other events on `obj` yet.\n    // Setup the necessary references to track the listening callbacks.\n    if (!listening) {\n      var thisId = this._listenId || (this._listenId = _.uniqueId('l'));\n      listening = listeningTo[id] = {obj: obj, objId: id, id: thisId, listeningTo: listeningTo, count: 0};\n    }\n\n    // Bind callbacks on obj, and keep track of them on listening.\n    internalOn(obj, name, callback, this, listening);\n    return this;\n  };\n\n  // The reducing API that adds a callback to the `events` object.\n  var onApi = function(events, name, callback, options) {\n    if (callback) {\n      var handlers = events[name] || (events[name] = []);\n      var context = options.context, ctx = options.ctx, listening = options.listening;\n      if (listening) listening.count++;\n\n      handlers.push({callback: callback, context: context, ctx: context || ctx, listening: listening});\n    }\n    return events;\n  };\n\n  // Remove one or many callbacks. If `context` is null, removes all\n  // callbacks with that function. If `callback` is null, removes all\n  // callbacks for the event. If `name` is null, removes all bound\n  // callbacks for all events.\n  Events.off = function(name, callback, context) {\n    if (!this._events) return this;\n    this._events = eventsApi(offApi, this._events, name, callback, {\n      context: context,\n      listeners: this._listeners\n    });\n    return this;\n  };\n\n  // Tell this object to stop listening to either specific events ... or\n  // to every object it's currently listening to.\n  Events.stopListening = function(obj, name, callback) {\n    var listeningTo = this._listeningTo;\n    if (!listeningTo) return this;\n\n    var ids = obj ? [obj._listenId] : _.keys(listeningTo);\n\n    for (var i = 0; i < ids.length; i++) {\n      var listening = listeningTo[ids[i]];\n\n      // If listening doesn't exist, this object is not currently\n      // listening to obj. Break out early.\n      if (!listening) break;\n\n      listening.obj.off(name, callback, this);\n    }\n\n    return this;\n  };\n\n  // The reducing API that removes a callback from the `events` object.\n  var offApi = function(events, name, callback, options) {\n    if (!events) return;\n\n    var i = 0, listening;\n    var context = options.context, listeners = options.listeners;\n\n    // Delete all events listeners and \"drop\" events.\n    if (!name && !callback && !context) {\n      var ids = _.keys(listeners);\n      for (; i < ids.length; i++) {\n        listening = listeners[ids[i]];\n        delete listeners[listening.id];\n        delete listening.listeningTo[listening.objId];\n      }\n      return;\n    }\n\n    var names = name ? [name] : _.keys(events);\n    for (; i < names.length; i++) {\n      name = names[i];\n      var handlers = events[name];\n\n      // Bail out if there are no events stored.\n      if (!handlers) break;\n\n      // Replace events if there are any remaining.  Otherwise, clean up.\n      var remaining = [];\n      for (var j = 0; j < handlers.length; j++) {\n        var handler = handlers[j];\n        if (\n          callback && callback !== handler.callback &&\n            callback !== handler.callback._callback ||\n              context && context !== handler.context\n        ) {\n          remaining.push(handler);\n        } else {\n          listening = handler.listening;\n          if (listening && --listening.count === 0) {\n            delete listeners[listening.id];\n            delete listening.listeningTo[listening.objId];\n          }\n        }\n      }\n\n      // Update tail event if the list has any events.  Otherwise, clean up.\n      if (remaining.length) {\n        events[name] = remaining;\n      } else {\n        delete events[name];\n      }\n    }\n    return events;\n  };\n\n  // Bind an event to only be triggered a single time. After the first time\n  // the callback is invoked, its listener will be removed. If multiple events\n  // are passed in using the space-separated syntax, the handler will fire\n  // once for each event, not once for a combination of all events.\n  Events.once = function(name, callback, context) {\n    // Map the event into a `{event: once}` object.\n    var events = eventsApi(onceMap, {}, name, callback, _.bind(this.off, this));\n    if (typeof name === 'string' && context == null) callback = void 0;\n    return this.on(events, callback, context);\n  };\n\n  // Inversion-of-control versions of `once`.\n  Events.listenToOnce = function(obj, name, callback) {\n    // Map the event into a `{event: once}` object.\n    var events = eventsApi(onceMap, {}, name, callback, _.bind(this.stopListening, this, obj));\n    return this.listenTo(obj, events);\n  };\n\n  // Reduces the event callbacks into a map of `{event: onceWrapper}`.\n  // `offer` unbinds the `onceWrapper` after it has been called.\n  var onceMap = function(map, name, callback, offer) {\n    if (callback) {\n      var once = map[name] = _.once(function() {\n        offer(name, once);\n        callback.apply(this, arguments);\n      });\n      once._callback = callback;\n    }\n    return map;\n  };\n\n  // Trigger one or many events, firing all bound callbacks. Callbacks are\n  // passed the same arguments as `trigger` is, apart from the event name\n  // (unless you're listening on `\"all\"`, which will cause your callback to\n  // receive the true name of the event as the first argument).\n  Events.trigger = function(name) {\n    if (!this._events) return this;\n\n    var length = Math.max(0, arguments.length - 1);\n    var args = Array(length);\n    for (var i = 0; i < length; i++) args[i] = arguments[i + 1];\n\n    eventsApi(triggerApi, this._events, name, void 0, args);\n    return this;\n  };\n\n  // Handles triggering the appropriate event callbacks.\n  var triggerApi = function(objEvents, name, callback, args) {\n    if (objEvents) {\n      var events = objEvents[name];\n      var allEvents = objEvents.all;\n      if (events && allEvents) allEvents = allEvents.slice();\n      if (events) triggerEvents(events, args);\n      if (allEvents) triggerEvents(allEvents, [name].concat(args));\n    }\n    return objEvents;\n  };\n\n  // A difficult-to-believe, but optimized internal dispatch function for\n  // triggering events. Tries to keep the usual cases speedy (most internal\n  // Backbone events have 3 arguments).\n  var triggerEvents = function(events, args) {\n    var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];\n    switch (args.length) {\n      case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return;\n      case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;\n      case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;\n      case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;\n      default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); return;\n    }\n  };\n\n  // Aliases for backwards compatibility.\n  Events.bind   = Events.on;\n  Events.unbind = Events.off;\n\n  // Allow the `Backbone` object to serve as a global event bus, for folks who\n  // want global \"pubsub\" in a convenient place.\n  _.extend(Backbone, Events);\n\n  // Backbone.Model\n  // --------------\n\n  // Backbone **Models** are the basic data object in the framework --\n  // frequently representing a row in a table in a database on your server.\n  // A discrete chunk of data and a bunch of useful, related methods for\n  // performing computations and transformations on that data.\n\n  // Create a new model with the specified attributes. A client id (`cid`)\n  // is automatically generated and assigned for you.\n  var Model = Backbone.Model = function(attributes, options) {\n    var attrs = attributes || {};\n    options || (options = {});\n    this.cid = _.uniqueId(this.cidPrefix);\n    this.attributes = {};\n    if (options.collection) this.collection = options.collection;\n    if (options.parse) attrs = this.parse(attrs, options) || {};\n    var defaults = _.result(this, 'defaults');\n    attrs = _.defaults(_.extend({}, defaults, attrs), defaults);\n    this.set(attrs, options);\n    this.changed = {};\n    this.initialize.apply(this, arguments);\n  };\n\n  // Attach all inheritable methods to the Model prototype.\n  _.extend(Model.prototype, Events, {\n\n    // A hash of attributes whose current and previous value differ.\n    changed: null,\n\n    // The value returned during the last failed validation.\n    validationError: null,\n\n    // The default name for the JSON `id` attribute is `\"id\"`. MongoDB and\n    // CouchDB users may want to set this to `\"_id\"`.\n    idAttribute: 'id',\n\n    // The prefix is used to create the client id which is used to identify models locally.\n    // You may want to override this if you're experiencing name clashes with model ids.\n    cidPrefix: 'c',\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // Return a copy of the model's `attributes` object.\n    toJSON: function(options) {\n      return _.clone(this.attributes);\n    },\n\n    // Proxy `Backbone.sync` by default -- but override this if you need\n    // custom syncing semantics for *this* particular model.\n    sync: function() {\n      return Backbone.sync.apply(this, arguments);\n    },\n\n    // Get the value of an attribute.\n    get: function(attr) {\n      return this.attributes[attr];\n    },\n\n    // Get the HTML-escaped value of an attribute.\n    escape: function(attr) {\n      return _.escape(this.get(attr));\n    },\n\n    // Returns `true` if the attribute contains a value that is not null\n    // or undefined.\n    has: function(attr) {\n      return this.get(attr) != null;\n    },\n\n    // Special-cased proxy to underscore's `_.matches` method.\n    matches: function(attrs) {\n      return !!_.iteratee(attrs, this)(this.attributes);\n    },\n\n    // Set a hash of model attributes on the object, firing `\"change\"`. This is\n    // the core primitive operation of a model, updating the data and notifying\n    // anyone who needs to know about the change in state. The heart of the beast.\n    set: function(key, val, options) {\n      if (key == null) return this;\n\n      // Handle both `\"key\", value` and `{key: value}` -style arguments.\n      var attrs;\n      if (typeof key === 'object') {\n        attrs = key;\n        options = val;\n      } else {\n        (attrs = {})[key] = val;\n      }\n\n      options || (options = {});\n\n      // Run validation.\n      if (!this._validate(attrs, options)) return false;\n\n      // Extract attributes and options.\n      var unset      = options.unset;\n      var silent     = options.silent;\n      var changes    = [];\n      var changing   = this._changing;\n      this._changing = true;\n\n      if (!changing) {\n        this._previousAttributes = _.clone(this.attributes);\n        this.changed = {};\n      }\n\n      var current = this.attributes;\n      var changed = this.changed;\n      var prev    = this._previousAttributes;\n\n      // For each `set` attribute, update or delete the current value.\n      for (var attr in attrs) {\n        val = attrs[attr];\n        if (!_.isEqual(current[attr], val)) changes.push(attr);\n        if (!_.isEqual(prev[attr], val)) {\n          changed[attr] = val;\n        } else {\n          delete changed[attr];\n        }\n        unset ? delete current[attr] : current[attr] = val;\n      }\n\n      // Update the `id`.\n      if (this.idAttribute in attrs) this.id = this.get(this.idAttribute);\n\n      // Trigger all relevant attribute changes.\n      if (!silent) {\n        if (changes.length) this._pending = options;\n        for (var i = 0; i < changes.length; i++) {\n          this.trigger('change:' + changes[i], this, current[changes[i]], options);\n        }\n      }\n\n      // You might be wondering why there's a `while` loop here. Changes can\n      // be recursively nested within `\"change\"` events.\n      if (changing) return this;\n      if (!silent) {\n        while (this._pending) {\n          options = this._pending;\n          this._pending = false;\n          this.trigger('change', this, options);\n        }\n      }\n      this._pending = false;\n      this._changing = false;\n      return this;\n    },\n\n    // Remove an attribute from the model, firing `\"change\"`. `unset` is a noop\n    // if the attribute doesn't exist.\n    unset: function(attr, options) {\n      return this.set(attr, void 0, _.extend({}, options, {unset: true}));\n    },\n\n    // Clear all attributes on the model, firing `\"change\"`.\n    clear: function(options) {\n      var attrs = {};\n      for (var key in this.attributes) attrs[key] = void 0;\n      return this.set(attrs, _.extend({}, options, {unset: true}));\n    },\n\n    // Determine if the model has changed since the last `\"change\"` event.\n    // If you specify an attribute name, determine if that attribute has changed.\n    hasChanged: function(attr) {\n      if (attr == null) return !_.isEmpty(this.changed);\n      return _.has(this.changed, attr);\n    },\n\n    // Return an object containing all the attributes that have changed, or\n    // false if there are no changed attributes. Useful for determining what\n    // parts of a view need to be updated and/or what attributes need to be\n    // persisted to the server. Unset attributes will be set to undefined.\n    // You can also pass an attributes object to diff against the model,\n    // determining if there *would be* a change.\n    changedAttributes: function(diff) {\n      if (!diff) return this.hasChanged() ? _.clone(this.changed) : false;\n      var old = this._changing ? this._previousAttributes : this.attributes;\n      var changed = {};\n      for (var attr in diff) {\n        var val = diff[attr];\n        if (_.isEqual(old[attr], val)) continue;\n        changed[attr] = val;\n      }\n      return _.size(changed) ? changed : false;\n    },\n\n    // Get the previous value of an attribute, recorded at the time the last\n    // `\"change\"` event was fired.\n    previous: function(attr) {\n      if (attr == null || !this._previousAttributes) return null;\n      return this._previousAttributes[attr];\n    },\n\n    // Get all of the attributes of the model at the time of the previous\n    // `\"change\"` event.\n    previousAttributes: function() {\n      return _.clone(this._previousAttributes);\n    },\n\n    // Fetch the model from the server, merging the response with the model's\n    // local attributes. Any changed attributes will trigger a \"change\" event.\n    fetch: function(options) {\n      options = _.extend({parse: true}, options);\n      var model = this;\n      var success = options.success;\n      options.success = function(resp) {\n        var serverAttrs = options.parse ? model.parse(resp, options) : resp;\n        if (!model.set(serverAttrs, options)) return false;\n        if (success) success.call(options.context, model, resp, options);\n        model.trigger('sync', model, resp, options);\n      };\n      wrapError(this, options);\n      return this.sync('read', this, options);\n    },\n\n    // Set a hash of model attributes, and sync the model to the server.\n    // If the server returns an attributes hash that differs, the model's\n    // state will be `set` again.\n    save: function(key, val, options) {\n      // Handle both `\"key\", value` and `{key: value}` -style arguments.\n      var attrs;\n      if (key == null || typeof key === 'object') {\n        attrs = key;\n        options = val;\n      } else {\n        (attrs = {})[key] = val;\n      }\n\n      options = _.extend({validate: true, parse: true}, options);\n      var wait = options.wait;\n\n      // If we're not waiting and attributes exist, save acts as\n      // `set(attr).save(null, opts)` with validation. Otherwise, check if\n      // the model will be valid when the attributes, if any, are set.\n      if (attrs && !wait) {\n        if (!this.set(attrs, options)) return false;\n      } else if (!this._validate(attrs, options)) {\n        return false;\n      }\n\n      // After a successful server-side save, the client is (optionally)\n      // updated with the server-side state.\n      var model = this;\n      var success = options.success;\n      var attributes = this.attributes;\n      options.success = function(resp) {\n        // Ensure attributes are restored during synchronous saves.\n        model.attributes = attributes;\n        var serverAttrs = options.parse ? model.parse(resp, options) : resp;\n        if (wait) serverAttrs = _.extend({}, attrs, serverAttrs);\n        if (serverAttrs && !model.set(serverAttrs, options)) return false;\n        if (success) success.call(options.context, model, resp, options);\n        model.trigger('sync', model, resp, options);\n      };\n      wrapError(this, options);\n\n      // Set temporary attributes if `{wait: true}` to properly find new ids.\n      if (attrs && wait) this.attributes = _.extend({}, attributes, attrs);\n\n      var method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update');\n      if (method === 'patch' && !options.attrs) options.attrs = attrs;\n      var xhr = this.sync(method, this, options);\n\n      // Restore attributes.\n      this.attributes = attributes;\n\n      return xhr;\n    },\n\n    // Destroy this model on the server if it was already persisted.\n    // Optimistically removes the model from its collection, if it has one.\n    // If `wait: true` is passed, waits for the server to respond before removal.\n    destroy: function(options) {\n      options = options ? _.clone(options) : {};\n      var model = this;\n      var success = options.success;\n      var wait = options.wait;\n\n      var destroy = function() {\n        model.stopListening();\n        model.trigger('destroy', model, model.collection, options);\n      };\n\n      options.success = function(resp) {\n        if (wait) destroy();\n        if (success) success.call(options.context, model, resp, options);\n        if (!model.isNew()) model.trigger('sync', model, resp, options);\n      };\n\n      var xhr = false;\n      if (this.isNew()) {\n        _.defer(options.success);\n      } else {\n        wrapError(this, options);\n        xhr = this.sync('delete', this, options);\n      }\n      if (!wait) destroy();\n      return xhr;\n    },\n\n    // Default URL for the model's representation on the server -- if you're\n    // using Backbone's restful methods, override this to change the endpoint\n    // that will be called.\n    url: function() {\n      var base =\n        _.result(this, 'urlRoot') ||\n        _.result(this.collection, 'url') ||\n        urlError();\n      if (this.isNew()) return base;\n      var id = this.get(this.idAttribute);\n      return base.replace(/[^\\/]$/, '$&/') + encodeURIComponent(id);\n    },\n\n    // **parse** converts a response into the hash of attributes to be `set` on\n    // the model. The default implementation is just to pass the response along.\n    parse: function(resp, options) {\n      return resp;\n    },\n\n    // Create a new model with identical attributes to this one.\n    clone: function() {\n      return new this.constructor(this.attributes);\n    },\n\n    // A model is new if it has never been saved to the server, and lacks an id.\n    isNew: function() {\n      return !this.has(this.idAttribute);\n    },\n\n    // Check if the model is currently in a valid state.\n    isValid: function(options) {\n      return this._validate({}, _.extend({}, options, {validate: true}));\n    },\n\n    // Run validation against the next complete set of model attributes,\n    // returning `true` if all is well. Otherwise, fire an `\"invalid\"` event.\n    _validate: function(attrs, options) {\n      if (!options.validate || !this.validate) return true;\n      attrs = _.extend({}, this.attributes, attrs);\n      var error = this.validationError = this.validate(attrs, options) || null;\n      if (!error) return true;\n      this.trigger('invalid', this, error, _.extend(options, {validationError: error}));\n      return false;\n    }\n\n  });\n\n  // Underscore methods that we want to implement on the Model, mapped to the\n  // number of arguments they take.\n  var modelMethods = {keys: 1, values: 1, pairs: 1, invert: 1, pick: 0,\n      omit: 0, chain: 1, isEmpty: 1};\n\n  // Mix in each Underscore method as a proxy to `Model#attributes`.\n  addUnderscoreMethods(Model, modelMethods, 'attributes');\n\n  // Backbone.Collection\n  // -------------------\n\n  // If models tend to represent a single row of data, a Backbone Collection is\n  // more analogous to a table full of data ... or a small slice or page of that\n  // table, or a collection of rows that belong together for a particular reason\n  // -- all of the messages in this particular folder, all of the documents\n  // belonging to this particular author, and so on. Collections maintain\n  // indexes of their models, both in order, and for lookup by `id`.\n\n  // Create a new **Collection**, perhaps to contain a specific type of `model`.\n  // If a `comparator` is specified, the Collection will maintain\n  // its models in sort order, as they're added and removed.\n  var Collection = Backbone.Collection = function(models, options) {\n    options || (options = {});\n    if (options.model) this.model = options.model;\n    if (options.comparator !== void 0) this.comparator = options.comparator;\n    this._reset();\n    this.initialize.apply(this, arguments);\n    if (models) this.reset(models, _.extend({silent: true}, options));\n  };\n\n  // Default options for `Collection#set`.\n  var setOptions = {add: true, remove: true, merge: true};\n  var addOptions = {add: true, remove: false};\n\n  // Splices `insert` into `array` at index `at`.\n  var splice = function(array, insert, at) {\n    at = Math.min(Math.max(at, 0), array.length);\n    var tail = Array(array.length - at);\n    var length = insert.length;\n    var i;\n    for (i = 0; i < tail.length; i++) tail[i] = array[i + at];\n    for (i = 0; i < length; i++) array[i + at] = insert[i];\n    for (i = 0; i < tail.length; i++) array[i + length + at] = tail[i];\n  };\n\n  // Define the Collection's inheritable methods.\n  _.extend(Collection.prototype, Events, {\n\n    // The default model for a collection is just a **Backbone.Model**.\n    // This should be overridden in most cases.\n    model: Model,\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // The JSON representation of a Collection is an array of the\n    // models' attributes.\n    toJSON: function(options) {\n      return this.map(function(model) { return model.toJSON(options); });\n    },\n\n    // Proxy `Backbone.sync` by default.\n    sync: function() {\n      return Backbone.sync.apply(this, arguments);\n    },\n\n    // Add a model, or list of models to the set. `models` may be Backbone\n    // Models or raw JavaScript objects to be converted to Models, or any\n    // combination of the two.\n    add: function(models, options) {\n      return this.set(models, _.extend({merge: false}, options, addOptions));\n    },\n\n    // Remove a model, or a list of models from the set.\n    remove: function(models, options) {\n      options = _.extend({}, options);\n      var singular = !_.isArray(models);\n      models = singular ? [models] : models.slice();\n      var removed = this._removeModels(models, options);\n      if (!options.silent && removed.length) {\n        options.changes = {added: [], merged: [], removed: removed};\n        this.trigger('update', this, options);\n      }\n      return singular ? removed[0] : removed;\n    },\n\n    // Update a collection by `set`-ing a new list of models, adding new ones,\n    // removing models that are no longer present, and merging models that\n    // already exist in the collection, as necessary. Similar to **Model#set**,\n    // the core operation for updating the data contained by the collection.\n    set: function(models, options) {\n      if (models == null) return;\n\n      options = _.extend({}, setOptions, options);\n      if (options.parse && !this._isModel(models)) {\n        models = this.parse(models, options) || [];\n      }\n\n      var singular = !_.isArray(models);\n      models = singular ? [models] : models.slice();\n\n      var at = options.at;\n      if (at != null) at = +at;\n      if (at > this.length) at = this.length;\n      if (at < 0) at += this.length + 1;\n\n      var set = [];\n      var toAdd = [];\n      var toMerge = [];\n      var toRemove = [];\n      var modelMap = {};\n\n      var add = options.add;\n      var merge = options.merge;\n      var remove = options.remove;\n\n      var sort = false;\n      var sortable = this.comparator && at == null && options.sort !== false;\n      var sortAttr = _.isString(this.comparator) ? this.comparator : null;\n\n      // Turn bare objects into model references, and prevent invalid models\n      // from being added.\n      var model, i;\n      for (i = 0; i < models.length; i++) {\n        model = models[i];\n\n        // If a duplicate is found, prevent it from being added and\n        // optionally merge it into the existing model.\n        var existing = this.get(model);\n        if (existing) {\n          if (merge && model !== existing) {\n            var attrs = this._isModel(model) ? model.attributes : model;\n            if (options.parse) attrs = existing.parse(attrs, options);\n            existing.set(attrs, options);\n            toMerge.push(existing);\n            if (sortable && !sort) sort = existing.hasChanged(sortAttr);\n          }\n          if (!modelMap[existing.cid]) {\n            modelMap[existing.cid] = true;\n            set.push(existing);\n          }\n          models[i] = existing;\n\n        // If this is a new, valid model, push it to the `toAdd` list.\n        } else if (add) {\n          model = models[i] = this._prepareModel(model, options);\n          if (model) {\n            toAdd.push(model);\n            this._addReference(model, options);\n            modelMap[model.cid] = true;\n            set.push(model);\n          }\n        }\n      }\n\n      // Remove stale models.\n      if (remove) {\n        for (i = 0; i < this.length; i++) {\n          model = this.models[i];\n          if (!modelMap[model.cid]) toRemove.push(model);\n        }\n        if (toRemove.length) this._removeModels(toRemove, options);\n      }\n\n      // See if sorting is needed, update `length` and splice in new models.\n      var orderChanged = false;\n      var replace = !sortable && add && remove;\n      if (set.length && replace) {\n        orderChanged = this.length !== set.length || _.some(this.models, function(m, index) {\n          return m !== set[index];\n        });\n        this.models.length = 0;\n        splice(this.models, set, 0);\n        this.length = this.models.length;\n      } else if (toAdd.length) {\n        if (sortable) sort = true;\n        splice(this.models, toAdd, at == null ? this.length : at);\n        this.length = this.models.length;\n      }\n\n      // Silently sort the collection if appropriate.\n      if (sort) this.sort({silent: true});\n\n      // Unless silenced, it's time to fire all appropriate add/sort/update events.\n      if (!options.silent) {\n        for (i = 0; i < toAdd.length; i++) {\n          if (at != null) options.index = at + i;\n          model = toAdd[i];\n          model.trigger('add', model, this, options);\n        }\n        if (sort || orderChanged) this.trigger('sort', this, options);\n        if (toAdd.length || toRemove.length || toMerge.length) {\n          options.changes = {\n            added: toAdd,\n            removed: toRemove,\n            merged: toMerge\n          };\n          this.trigger('update', this, options);\n        }\n      }\n\n      // Return the added (or merged) model (or models).\n      return singular ? models[0] : models;\n    },\n\n    // When you have more items than you want to add or remove individually,\n    // you can reset the entire set with a new list of models, without firing\n    // any granular `add` or `remove` events. Fires `reset` when finished.\n    // Useful for bulk operations and optimizations.\n    reset: function(models, options) {\n      options = options ? _.clone(options) : {};\n      for (var i = 0; i < this.models.length; i++) {\n        this._removeReference(this.models[i], options);\n      }\n      options.previousModels = this.models;\n      this._reset();\n      models = this.add(models, _.extend({silent: true}, options));\n      if (!options.silent) this.trigger('reset', this, options);\n      return models;\n    },\n\n    // Add a model to the end of the collection.\n    push: function(model, options) {\n      return this.add(model, _.extend({at: this.length}, options));\n    },\n\n    // Remove a model from the end of the collection.\n    pop: function(options) {\n      var model = this.at(this.length - 1);\n      return this.remove(model, options);\n    },\n\n    // Add a model to the beginning of the collection.\n    unshift: function(model, options) {\n      return this.add(model, _.extend({at: 0}, options));\n    },\n\n    // Remove a model from the beginning of the collection.\n    shift: function(options) {\n      var model = this.at(0);\n      return this.remove(model, options);\n    },\n\n    // Slice out a sub-array of models from the collection.\n    slice: function() {\n      return slice.apply(this.models, arguments);\n    },\n\n    // Get a model from the set by id, cid, model object with id or cid\n    // properties, or an attributes object that is transformed through modelId.\n    get: function(obj) {\n      if (obj == null) return void 0;\n      return this._byId[obj] ||\n        this._byId[this.modelId(obj.attributes || obj)] ||\n        obj.cid && this._byId[obj.cid];\n    },\n\n    // Returns `true` if the model is in the collection.\n    has: function(obj) {\n      return this.get(obj) != null;\n    },\n\n    // Get the model at the given index.\n    at: function(index) {\n      if (index < 0) index += this.length;\n      return this.models[index];\n    },\n\n    // Return models with matching attributes. Useful for simple cases of\n    // `filter`.\n    where: function(attrs, first) {\n      return this[first ? 'find' : 'filter'](attrs);\n    },\n\n    // Return the first model with matching attributes. Useful for simple cases\n    // of `find`.\n    findWhere: function(attrs) {\n      return this.where(attrs, true);\n    },\n\n    // Force the collection to re-sort itself. You don't need to call this under\n    // normal circumstances, as the set will maintain sort order as each item\n    // is added.\n    sort: function(options) {\n      var comparator = this.comparator;\n      if (!comparator) throw new Error('Cannot sort a set without a comparator');\n      options || (options = {});\n\n      var length = comparator.length;\n      if (_.isFunction(comparator)) comparator = _.bind(comparator, this);\n\n      // Run sort based on type of `comparator`.\n      if (length === 1 || _.isString(comparator)) {\n        this.models = this.sortBy(comparator);\n      } else {\n        this.models.sort(comparator);\n      }\n      if (!options.silent) this.trigger('sort', this, options);\n      return this;\n    },\n\n    // Pluck an attribute from each model in the collection.\n    pluck: function(attr) {\n      return this.map(attr + '');\n    },\n\n    // Fetch the default set of models for this collection, resetting the\n    // collection when they arrive. If `reset: true` is passed, the response\n    // data will be passed through the `reset` method instead of `set`.\n    fetch: function(options) {\n      options = _.extend({parse: true}, options);\n      var success = options.success;\n      var collection = this;\n      options.success = function(resp) {\n        var method = options.reset ? 'reset' : 'set';\n        collection[method](resp, options);\n        if (success) success.call(options.context, collection, resp, options);\n        collection.trigger('sync', collection, resp, options);\n      };\n      wrapError(this, options);\n      return this.sync('read', this, options);\n    },\n\n    // Create a new instance of a model in this collection. Add the model to the\n    // collection immediately, unless `wait: true` is passed, in which case we\n    // wait for the server to agree.\n    create: function(model, options) {\n      options = options ? _.clone(options) : {};\n      var wait = options.wait;\n      model = this._prepareModel(model, options);\n      if (!model) return false;\n      if (!wait) this.add(model, options);\n      var collection = this;\n      var success = options.success;\n      options.success = function(m, resp, callbackOpts) {\n        if (wait) collection.add(m, callbackOpts);\n        if (success) success.call(callbackOpts.context, m, resp, callbackOpts);\n      };\n      model.save(null, options);\n      return model;\n    },\n\n    // **parse** converts a response into a list of models to be added to the\n    // collection. The default implementation is just to pass it through.\n    parse: function(resp, options) {\n      return resp;\n    },\n\n    // Create a new collection with an identical list of models as this one.\n    clone: function() {\n      return new this.constructor(this.models, {\n        model: this.model,\n        comparator: this.comparator\n      });\n    },\n\n    // Define how to uniquely identify models in the collection.\n    modelId: function(attrs) {\n      return attrs[this.model.prototype.idAttribute || 'id'];\n    },\n\n    // Private method to reset all internal state. Called when the collection\n    // is first initialized or reset.\n    _reset: function() {\n      this.length = 0;\n      this.models = [];\n      this._byId  = {};\n    },\n\n    // Prepare a hash of attributes (or other model) to be added to this\n    // collection.\n    _prepareModel: function(attrs, options) {\n      if (this._isModel(attrs)) {\n        if (!attrs.collection) attrs.collection = this;\n        return attrs;\n      }\n      options = options ? _.clone(options) : {};\n      options.collection = this;\n      var model = new this.model(attrs, options);\n      if (!model.validationError) return model;\n      this.trigger('invalid', this, model.validationError, options);\n      return false;\n    },\n\n    // Internal method called by both remove and set.\n    _removeModels: function(models, options) {\n      var removed = [];\n      for (var i = 0; i < models.length; i++) {\n        var model = this.get(models[i]);\n        if (!model) continue;\n\n        var index = this.indexOf(model);\n        this.models.splice(index, 1);\n        this.length--;\n\n        // Remove references before triggering 'remove' event to prevent an\n        // infinite loop. #3693\n        delete this._byId[model.cid];\n        var id = this.modelId(model.attributes);\n        if (id != null) delete this._byId[id];\n\n        if (!options.silent) {\n          options.index = index;\n          model.trigger('remove', model, this, options);\n        }\n\n        removed.push(model);\n        this._removeReference(model, options);\n      }\n      return removed;\n    },\n\n    // Method for checking whether an object should be considered a model for\n    // the purposes of adding to the collection.\n    _isModel: function(model) {\n      return model instanceof Model;\n    },\n\n    // Internal method to create a model's ties to a collection.\n    _addReference: function(model, options) {\n      this._byId[model.cid] = model;\n      var id = this.modelId(model.attributes);\n      if (id != null) this._byId[id] = model;\n      model.on('all', this._onModelEvent, this);\n    },\n\n    // Internal method to sever a model's ties to a collection.\n    _removeReference: function(model, options) {\n      delete this._byId[model.cid];\n      var id = this.modelId(model.attributes);\n      if (id != null) delete this._byId[id];\n      if (this === model.collection) delete model.collection;\n      model.off('all', this._onModelEvent, this);\n    },\n\n    // Internal method called every time a model in the set fires an event.\n    // Sets need to update their indexes when models change ids. All other\n    // events simply proxy through. \"add\" and \"remove\" events that originate\n    // in other collections are ignored.\n    _onModelEvent: function(event, model, collection, options) {\n      if (model) {\n        if ((event === 'add' || event === 'remove') && collection !== this) return;\n        if (event === 'destroy') this.remove(model, options);\n        if (event === 'change') {\n          var prevId = this.modelId(model.previousAttributes());\n          var id = this.modelId(model.attributes);\n          if (prevId !== id) {\n            if (prevId != null) delete this._byId[prevId];\n            if (id != null) this._byId[id] = model;\n          }\n        }\n      }\n      this.trigger.apply(this, arguments);\n    }\n\n  });\n\n  // Underscore methods that we want to implement on the Collection.\n  // 90% of the core usefulness of Backbone Collections is actually implemented\n  // right here:\n  var collectionMethods = {forEach: 3, each: 3, map: 3, collect: 3, reduce: 0,\n      foldl: 0, inject: 0, reduceRight: 0, foldr: 0, find: 3, detect: 3, filter: 3,\n      select: 3, reject: 3, every: 3, all: 3, some: 3, any: 3, include: 3, includes: 3,\n      contains: 3, invoke: 0, max: 3, min: 3, toArray: 1, size: 1, first: 3,\n      head: 3, take: 3, initial: 3, rest: 3, tail: 3, drop: 3, last: 3,\n      without: 0, difference: 0, indexOf: 3, shuffle: 1, lastIndexOf: 3,\n      isEmpty: 1, chain: 1, sample: 3, partition: 3, groupBy: 3, countBy: 3,\n      sortBy: 3, indexBy: 3, findIndex: 3, findLastIndex: 3};\n\n  // Mix in each Underscore method as a proxy to `Collection#models`.\n  addUnderscoreMethods(Collection, collectionMethods, 'models');\n\n  // Backbone.View\n  // -------------\n\n  // Backbone Views are almost more convention than they are actual code. A View\n  // is simply a JavaScript object that represents a logical chunk of UI in the\n  // DOM. This might be a single item, an entire list, a sidebar or panel, or\n  // even the surrounding frame which wraps your whole app. Defining a chunk of\n  // UI as a **View** allows you to define your DOM events declaratively, without\n  // having to worry about render order ... and makes it easy for the view to\n  // react to specific changes in the state of your models.\n\n  // Creating a Backbone.View creates its initial element outside of the DOM,\n  // if an existing element is not provided...\n  var View = Backbone.View = function(options) {\n    this.cid = _.uniqueId('view');\n    _.extend(this, _.pick(options, viewOptions));\n    this._ensureElement();\n    this.initialize.apply(this, arguments);\n  };\n\n  // Cached regex to split keys for `delegate`.\n  var delegateEventSplitter = /^(\\S+)\\s*(.*)$/;\n\n  // List of view options to be set as properties.\n  var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events'];\n\n  // Set up all inheritable **Backbone.View** properties and methods.\n  _.extend(View.prototype, Events, {\n\n    // The default `tagName` of a View's element is `\"div\"`.\n    tagName: 'div',\n\n    // jQuery delegate for element lookup, scoped to DOM elements within the\n    // current view. This should be preferred to global lookups where possible.\n    $: function(selector) {\n      return this.$el.find(selector);\n    },\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // **render** is the core function that your view should override, in order\n    // to populate its element (`this.el`), with the appropriate HTML. The\n    // convention is for **render** to always return `this`.\n    render: function() {\n      return this;\n    },\n\n    // Remove this view by taking the element out of the DOM, and removing any\n    // applicable Backbone.Events listeners.\n    remove: function() {\n      this._removeElement();\n      this.stopListening();\n      return this;\n    },\n\n    // Remove this view's element from the document and all event listeners\n    // attached to it. Exposed for subclasses using an alternative DOM\n    // manipulation API.\n    _removeElement: function() {\n      this.$el.remove();\n    },\n\n    // Change the view's element (`this.el` property) and re-delegate the\n    // view's events on the new element.\n    setElement: function(element) {\n      this.undelegateEvents();\n      this._setElement(element);\n      this.delegateEvents();\n      return this;\n    },\n\n    // Creates the `this.el` and `this.$el` references for this view using the\n    // given `el`. `el` can be a CSS selector or an HTML string, a jQuery\n    // context or an element. Subclasses can override this to utilize an\n    // alternative DOM manipulation API and are only required to set the\n    // `this.el` property.\n    _setElement: function(el) {\n      this.$el = el instanceof Backbone.$ ? el : Backbone.$(el);\n      this.el = this.$el[0];\n    },\n\n    // Set callbacks, where `this.events` is a hash of\n    //\n    // *{\"event selector\": \"callback\"}*\n    //\n    //     {\n    //       'mousedown .title':  'edit',\n    //       'click .button':     'save',\n    //       'click .open':       function(e) { ... }\n    //     }\n    //\n    // pairs. Callbacks will be bound to the view, with `this` set properly.\n    // Uses event delegation for efficiency.\n    // Omitting the selector binds the event to `this.el`.\n    delegateEvents: function(events) {\n      events || (events = _.result(this, 'events'));\n      if (!events) return this;\n      this.undelegateEvents();\n      for (var key in events) {\n        var method = events[key];\n        if (!_.isFunction(method)) method = this[method];\n        if (!method) continue;\n        var match = key.match(delegateEventSplitter);\n        this.delegate(match[1], match[2], _.bind(method, this));\n      }\n      return this;\n    },\n\n    // Add a single event listener to the view's element (or a child element\n    // using `selector`). This only works for delegate-able events: not `focus`,\n    // `blur`, and not `change`, `submit`, and `reset` in Internet Explorer.\n    delegate: function(eventName, selector, listener) {\n      this.$el.on(eventName + '.delegateEvents' + this.cid, selector, listener);\n      return this;\n    },\n\n    // Clears all callbacks previously bound to the view by `delegateEvents`.\n    // You usually don't need to use this, but may wish to if you have multiple\n    // Backbone views attached to the same DOM element.\n    undelegateEvents: function() {\n      if (this.$el) this.$el.off('.delegateEvents' + this.cid);\n      return this;\n    },\n\n    // A finer-grained `undelegateEvents` for removing a single delegated event.\n    // `selector` and `listener` are both optional.\n    undelegate: function(eventName, selector, listener) {\n      this.$el.off(eventName + '.delegateEvents' + this.cid, selector, listener);\n      return this;\n    },\n\n    // Produces a DOM element to be assigned to your view. Exposed for\n    // subclasses using an alternative DOM manipulation API.\n    _createElement: function(tagName) {\n      return document.createElement(tagName);\n    },\n\n    // Ensure that the View has a DOM element to render into.\n    // If `this.el` is a string, pass it through `$()`, take the first\n    // matching element, and re-assign it to `el`. Otherwise, create\n    // an element from the `id`, `className` and `tagName` properties.\n    _ensureElement: function() {\n      if (!this.el) {\n        var attrs = _.extend({}, _.result(this, 'attributes'));\n        if (this.id) attrs.id = _.result(this, 'id');\n        if (this.className) attrs['class'] = _.result(this, 'className');\n        this.setElement(this._createElement(_.result(this, 'tagName')));\n        this._setAttributes(attrs);\n      } else {\n        this.setElement(_.result(this, 'el'));\n      }\n    },\n\n    // Set attributes from a hash on this view's element.  Exposed for\n    // subclasses using an alternative DOM manipulation API.\n    _setAttributes: function(attributes) {\n      this.$el.attr(attributes);\n    }\n\n  });\n\n  // Backbone.sync\n  // -------------\n\n  // Override this function to change the manner in which Backbone persists\n  // models to the server. You will be passed the type of request, and the\n  // model in question. By default, makes a RESTful Ajax request\n  // to the model's `url()`. Some possible customizations could be:\n  //\n  // * Use `setTimeout` to batch rapid-fire updates into a single request.\n  // * Send up the models as XML instead of JSON.\n  // * Persist models via WebSockets instead of Ajax.\n  //\n  // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests\n  // as `POST`, with a `_method` parameter containing the true HTTP method,\n  // as well as all requests with the body as `application/x-www-form-urlencoded`\n  // instead of `application/json` with the model in a param named `model`.\n  // Useful when interfacing with server-side languages like **PHP** that make\n  // it difficult to read the body of `PUT` requests.\n  Backbone.sync = function(method, model, options) {\n    var type = methodMap[method];\n\n    // Default options, unless specified.\n    _.defaults(options || (options = {}), {\n      emulateHTTP: Backbone.emulateHTTP,\n      emulateJSON: Backbone.emulateJSON\n    });\n\n    // Default JSON-request options.\n    var params = {type: type, dataType: 'json'};\n\n    // Ensure that we have a URL.\n    if (!options.url) {\n      params.url = _.result(model, 'url') || urlError();\n    }\n\n    // Ensure that we have the appropriate request data.\n    if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) {\n      params.contentType = 'application/json';\n      params.data = JSON.stringify(options.attrs || model.toJSON(options));\n    }\n\n    // For older servers, emulate JSON by encoding the request into an HTML-form.\n    if (options.emulateJSON) {\n      params.contentType = 'application/x-www-form-urlencoded';\n      params.data = params.data ? {model: params.data} : {};\n    }\n\n    // For older servers, emulate HTTP by mimicking the HTTP method with `_method`\n    // And an `X-HTTP-Method-Override` header.\n    if (options.emulateHTTP && (type === 'PUT' || type === 'DELETE' || type === 'PATCH')) {\n      params.type = 'POST';\n      if (options.emulateJSON) params.data._method = type;\n      var beforeSend = options.beforeSend;\n      options.beforeSend = function(xhr) {\n        xhr.setRequestHeader('X-HTTP-Method-Override', type);\n        if (beforeSend) return beforeSend.apply(this, arguments);\n      };\n    }\n\n    // Don't process data on a non-GET request.\n    if (params.type !== 'GET' && !options.emulateJSON) {\n      params.processData = false;\n    }\n\n    // Pass along `textStatus` and `errorThrown` from jQuery.\n    var error = options.error;\n    options.error = function(xhr, textStatus, errorThrown) {\n      options.textStatus = textStatus;\n      options.errorThrown = errorThrown;\n      if (error) error.call(options.context, xhr, textStatus, errorThrown);\n    };\n\n    // Make the request, allowing the user to override any Ajax options.\n    var xhr = options.xhr = Backbone.ajax(_.extend(params, options));\n    model.trigger('request', model, xhr, options);\n    return xhr;\n  };\n\n  // Map from CRUD to HTTP for our default `Backbone.sync` implementation.\n  var methodMap = {\n    'create': 'POST',\n    'update': 'PUT',\n    'patch': 'PATCH',\n    'delete': 'DELETE',\n    'read': 'GET'\n  };\n\n  // Set the default implementation of `Backbone.ajax` to proxy through to `$`.\n  // Override this if you'd like to use a different library.\n  Backbone.ajax = function() {\n    return Backbone.$.ajax.apply(Backbone.$, arguments);\n  };\n\n  // Backbone.Router\n  // ---------------\n\n  // Routers map faux-URLs to actions, and fire events when routes are\n  // matched. Creating a new one sets its `routes` hash, if not set statically.\n  var Router = Backbone.Router = function(options) {\n    options || (options = {});\n    if (options.routes) this.routes = options.routes;\n    this._bindRoutes();\n    this.initialize.apply(this, arguments);\n  };\n\n  // Cached regular expressions for matching named param parts and splatted\n  // parts of route strings.\n  var optionalParam = /\\((.*?)\\)/g;\n  var namedParam    = /(\\(\\?)?:\\w+/g;\n  var splatParam    = /\\*\\w+/g;\n  var escapeRegExp  = /[\\-{}\\[\\]+?.,\\\\\\^$|#\\s]/g;\n\n  // Set up all inheritable **Backbone.Router** properties and methods.\n  _.extend(Router.prototype, Events, {\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // Manually bind a single named route to a callback. For example:\n    //\n    //     this.route('search/:query/p:num', 'search', function(query, num) {\n    //       ...\n    //     });\n    //\n    route: function(route, name, callback) {\n      if (!_.isRegExp(route)) route = this._routeToRegExp(route);\n      if (_.isFunction(name)) {\n        callback = name;\n        name = '';\n      }\n      if (!callback) callback = this[name];\n      var router = this;\n      Backbone.history.route(route, function(fragment) {\n        var args = router._extractParameters(route, fragment);\n        if (router.execute(callback, args, name) !== false) {\n          router.trigger.apply(router, ['route:' + name].concat(args));\n          router.trigger('route', name, args);\n          Backbone.history.trigger('route', router, name, args);\n        }\n      });\n      return this;\n    },\n\n    // Execute a route handler with the provided parameters.  This is an\n    // excellent place to do pre-route setup or post-route cleanup.\n    execute: function(callback, args, name) {\n      if (callback) callback.apply(this, args);\n    },\n\n    // Simple proxy to `Backbone.history` to save a fragment into the history.\n    navigate: function(fragment, options) {\n      Backbone.history.navigate(fragment, options);\n      return this;\n    },\n\n    // Bind all defined routes to `Backbone.history`. We have to reverse the\n    // order of the routes here to support behavior where the most general\n    // routes can be defined at the bottom of the route map.\n    _bindRoutes: function() {\n      if (!this.routes) return;\n      this.routes = _.result(this, 'routes');\n      var route, routes = _.keys(this.routes);\n      while ((route = routes.pop()) != null) {\n        this.route(route, this.routes[route]);\n      }\n    },\n\n    // Convert a route string into a regular expression, suitable for matching\n    // against the current location hash.\n    _routeToRegExp: function(route) {\n      route = route.replace(escapeRegExp, '\\\\$&')\n                   .replace(optionalParam, '(?:$1)?')\n                   .replace(namedParam, function(match, optional) {\n                     return optional ? match : '([^/?]+)';\n                   })\n                   .replace(splatParam, '([^?]*?)');\n      return new RegExp('^' + route + '(?:\\\\?([\\\\s\\\\S]*))?$');\n    },\n\n    // Given a route, and a URL fragment that it matches, return the array of\n    // extracted decoded parameters. Empty or unmatched parameters will be\n    // treated as `null` to normalize cross-browser behavior.\n    _extractParameters: function(route, fragment) {\n      var params = route.exec(fragment).slice(1);\n      return _.map(params, function(param, i) {\n        // Don't decode the search params.\n        if (i === params.length - 1) return param || null;\n        return param ? decodeURIComponent(param) : null;\n      });\n    }\n\n  });\n\n  // Backbone.History\n  // ----------------\n\n  // Handles cross-browser history management, based on either\n  // [pushState](http://diveintohtml5.info/history.html) and real URLs, or\n  // [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange)\n  // and URL fragments. If the browser supports neither (old IE, natch),\n  // falls back to polling.\n  var History = Backbone.History = function() {\n    this.handlers = [];\n    this.checkUrl = _.bind(this.checkUrl, this);\n\n    // Ensure that `History` can be used outside of the browser.\n    if (typeof window !== 'undefined') {\n      this.location = window.location;\n      this.history = window.history;\n    }\n  };\n\n  // Cached regex for stripping a leading hash/slash and trailing space.\n  var routeStripper = /^[#\\/]|\\s+$/g;\n\n  // Cached regex for stripping leading and trailing slashes.\n  var rootStripper = /^\\/+|\\/+$/g;\n\n  // Cached regex for stripping urls of hash.\n  var pathStripper = /#.*$/;\n\n  // Has the history handling already been started?\n  History.started = false;\n\n  // Set up all inheritable **Backbone.History** properties and methods.\n  _.extend(History.prototype, Events, {\n\n    // The default interval to poll for hash changes, if necessary, is\n    // twenty times a second.\n    interval: 50,\n\n    // Are we at the app root?\n    atRoot: function() {\n      var path = this.location.pathname.replace(/[^\\/]$/, '$&/');\n      return path === this.root && !this.getSearch();\n    },\n\n    // Does the pathname match the root?\n    matchRoot: function() {\n      var path = this.decodeFragment(this.location.pathname);\n      var rootPath = path.slice(0, this.root.length - 1) + '/';\n      return rootPath === this.root;\n    },\n\n    // Unicode characters in `location.pathname` are percent encoded so they're\n    // decoded for comparison. `%25` should not be decoded since it may be part\n    // of an encoded parameter.\n    decodeFragment: function(fragment) {\n      return decodeURI(fragment.replace(/%25/g, '%2525'));\n    },\n\n    // In IE6, the hash fragment and search params are incorrect if the\n    // fragment contains `?`.\n    getSearch: function() {\n      var match = this.location.href.replace(/#.*/, '').match(/\\?.+/);\n      return match ? match[0] : '';\n    },\n\n    // Gets the true hash value. Cannot use location.hash directly due to bug\n    // in Firefox where location.hash will always be decoded.\n    getHash: function(window) {\n      var match = (window || this).location.href.match(/#(.*)$/);\n      return match ? match[1] : '';\n    },\n\n    // Get the pathname and search params, without the root.\n    getPath: function() {\n      var path = this.decodeFragment(\n        this.location.pathname + this.getSearch()\n      ).slice(this.root.length - 1);\n      return path.charAt(0) === '/' ? path.slice(1) : path;\n    },\n\n    // Get the cross-browser normalized URL fragment from the path or hash.\n    getFragment: function(fragment) {\n      if (fragment == null) {\n        if (this._usePushState || !this._wantsHashChange) {\n          fragment = this.getPath();\n        } else {\n          fragment = this.getHash();\n        }\n      }\n      return fragment.replace(routeStripper, '');\n    },\n\n    // Start the hash change handling, returning `true` if the current URL matches\n    // an existing route, and `false` otherwise.\n    start: function(options) {\n      if (History.started) throw new Error('Backbone.history has already been started');\n      History.started = true;\n\n      // Figure out the initial configuration. Do we need an iframe?\n      // Is pushState desired ... is it available?\n      this.options          = _.extend({root: '/'}, this.options, options);\n      this.root             = this.options.root;\n      this._wantsHashChange = this.options.hashChange !== false;\n      this._hasHashChange   = 'onhashchange' in window && (document.documentMode === void 0 || document.documentMode > 7);\n      this._useHashChange   = this._wantsHashChange && this._hasHashChange;\n      this._wantsPushState  = !!this.options.pushState;\n      this._hasPushState    = !!(this.history && this.history.pushState);\n      this._usePushState    = this._wantsPushState && this._hasPushState;\n      this.fragment         = this.getFragment();\n\n      // Normalize root to always include a leading and trailing slash.\n      this.root = ('/' + this.root + '/').replace(rootStripper, '/');\n\n      // Transition from hashChange to pushState or vice versa if both are\n      // requested.\n      if (this._wantsHashChange && this._wantsPushState) {\n\n        // If we've started off with a route from a `pushState`-enabled\n        // browser, but we're currently in a browser that doesn't support it...\n        if (!this._hasPushState && !this.atRoot()) {\n          var rootPath = this.root.slice(0, -1) || '/';\n          this.location.replace(rootPath + '#' + this.getPath());\n          // Return immediately as browser will do redirect to new url\n          return true;\n\n        // Or if we've started out with a hash-based route, but we're currently\n        // in a browser where it could be `pushState`-based instead...\n        } else if (this._hasPushState && this.atRoot()) {\n          this.navigate(this.getHash(), {replace: true});\n        }\n\n      }\n\n      // Proxy an iframe to handle location events if the browser doesn't\n      // support the `hashchange` event, HTML5 history, or the user wants\n      // `hashChange` but not `pushState`.\n      if (!this._hasHashChange && this._wantsHashChange && !this._usePushState) {\n        this.iframe = document.createElement('iframe');\n        this.iframe.src = 'javascript:0';\n        this.iframe.style.display = 'none';\n        this.iframe.tabIndex = -1;\n        var body = document.body;\n        // Using `appendChild` will throw on IE < 9 if the document is not ready.\n        var iWindow = body.insertBefore(this.iframe, body.firstChild).contentWindow;\n        iWindow.document.open();\n        iWindow.document.close();\n        iWindow.location.hash = '#' + this.fragment;\n      }\n\n      // Add a cross-platform `addEventListener` shim for older browsers.\n      var addEventListener = window.addEventListener || function(eventName, listener) {\n        return attachEvent('on' + eventName, listener);\n      };\n\n      // Depending on whether we're using pushState or hashes, and whether\n      // 'onhashchange' is supported, determine how we check the URL state.\n      if (this._usePushState) {\n        addEventListener('popstate', this.checkUrl, false);\n      } else if (this._useHashChange && !this.iframe) {\n        addEventListener('hashchange', this.checkUrl, false);\n      } else if (this._wantsHashChange) {\n        this._checkUrlInterval = setInterval(this.checkUrl, this.interval);\n      }\n\n      if (!this.options.silent) return this.loadUrl();\n    },\n\n    // Disable Backbone.history, perhaps temporarily. Not useful in a real app,\n    // but possibly useful for unit testing Routers.\n    stop: function() {\n      // Add a cross-platform `removeEventListener` shim for older browsers.\n      var removeEventListener = window.removeEventListener || function(eventName, listener) {\n        return detachEvent('on' + eventName, listener);\n      };\n\n      // Remove window listeners.\n      if (this._usePushState) {\n        removeEventListener('popstate', this.checkUrl, false);\n      } else if (this._useHashChange && !this.iframe) {\n        removeEventListener('hashchange', this.checkUrl, false);\n      }\n\n      // Clean up the iframe if necessary.\n      if (this.iframe) {\n        document.body.removeChild(this.iframe);\n        this.iframe = null;\n      }\n\n      // Some environments will throw when clearing an undefined interval.\n      if (this._checkUrlInterval) clearInterval(this._checkUrlInterval);\n      History.started = false;\n    },\n\n    // Add a route to be tested when the fragment changes. Routes added later\n    // may override previous routes.\n    route: function(route, callback) {\n      this.handlers.unshift({route: route, callback: callback});\n    },\n\n    // Checks the current URL to see if it has changed, and if it has,\n    // calls `loadUrl`, normalizing across the hidden iframe.\n    checkUrl: function(e) {\n      var current = this.getFragment();\n\n      // If the user pressed the back button, the iframe's hash will have\n      // changed and we should use that for comparison.\n      if (current === this.fragment && this.iframe) {\n        current = this.getHash(this.iframe.contentWindow);\n      }\n\n      if (current === this.fragment) return false;\n      if (this.iframe) this.navigate(current);\n      this.loadUrl();\n    },\n\n    // Attempt to load the current URL fragment. If a route succeeds with a\n    // match, returns `true`. If no defined routes matches the fragment,\n    // returns `false`.\n    loadUrl: function(fragment) {\n      // If the root doesn't match, no routes can match either.\n      if (!this.matchRoot()) return false;\n      fragment = this.fragment = this.getFragment(fragment);\n      return _.some(this.handlers, function(handler) {\n        if (handler.route.test(fragment)) {\n          handler.callback(fragment);\n          return true;\n        }\n      });\n    },\n\n    // Save a fragment into the hash history, or replace the URL state if the\n    // 'replace' option is passed. You are responsible for properly URL-encoding\n    // the fragment in advance.\n    //\n    // The options object can contain `trigger: true` if you wish to have the\n    // route callback be fired (not usually desirable), or `replace: true`, if\n    // you wish to modify the current URL without adding an entry to the history.\n    navigate: function(fragment, options) {\n      if (!History.started) return false;\n      if (!options || options === true) options = {trigger: !!options};\n\n      // Normalize the fragment.\n      fragment = this.getFragment(fragment || '');\n\n      // Don't include a trailing slash on the root.\n      var rootPath = this.root;\n      if (fragment === '' || fragment.charAt(0) === '?') {\n        rootPath = rootPath.slice(0, -1) || '/';\n      }\n      var url = rootPath + fragment;\n\n      // Strip the hash and decode for matching.\n      fragment = this.decodeFragment(fragment.replace(pathStripper, ''));\n\n      if (this.fragment === fragment) return;\n      this.fragment = fragment;\n\n      // If pushState is available, we use it to set the fragment as a real URL.\n      if (this._usePushState) {\n        this.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url);\n\n      // If hash changes haven't been explicitly disabled, update the hash\n      // fragment to store history.\n      } else if (this._wantsHashChange) {\n        this._updateHash(this.location, fragment, options.replace);\n        if (this.iframe && fragment !== this.getHash(this.iframe.contentWindow)) {\n          var iWindow = this.iframe.contentWindow;\n\n          // Opening and closing the iframe tricks IE7 and earlier to push a\n          // history entry on hash-tag change.  When replace is true, we don't\n          // want this.\n          if (!options.replace) {\n            iWindow.document.open();\n            iWindow.document.close();\n          }\n\n          this._updateHash(iWindow.location, fragment, options.replace);\n        }\n\n      // If you've told us that you explicitly don't want fallback hashchange-\n      // based history, then `navigate` becomes a page refresh.\n      } else {\n        return this.location.assign(url);\n      }\n      if (options.trigger) return this.loadUrl(fragment);\n    },\n\n    // Update the hash location, either replacing the current entry, or adding\n    // a new one to the browser history.\n    _updateHash: function(location, fragment, replace) {\n      if (replace) {\n        var href = location.href.replace(/(javascript:|#).*$/, '');\n        location.replace(href + '#' + fragment);\n      } else {\n        // Some browsers require that `hash` contains a leading #.\n        location.hash = '#' + fragment;\n      }\n    }\n\n  });\n\n  // Create the default Backbone.history.\n  Backbone.history = new History;\n\n  // Helpers\n  // -------\n\n  // Helper function to correctly set up the prototype chain for subclasses.\n  // Similar to `goog.inherits`, but uses a hash of prototype properties and\n  // class properties to be extended.\n  var extend = function(protoProps, staticProps) {\n    var parent = this;\n    var child;\n\n    // The constructor function for the new subclass is either defined by you\n    // (the \"constructor\" property in your `extend` definition), or defaulted\n    // by us to simply call the parent constructor.\n    if (protoProps && _.has(protoProps, 'constructor')) {\n      child = protoProps.constructor;\n    } else {\n      child = function(){ return parent.apply(this, arguments); };\n    }\n\n    // Add static properties to the constructor function, if supplied.\n    _.extend(child, parent, staticProps);\n\n    // Set the prototype chain to inherit from `parent`, without calling\n    // `parent`'s constructor function and add the prototype properties.\n    child.prototype = _.create(parent.prototype, protoProps);\n    child.prototype.constructor = child;\n\n    // Set a convenience property in case the parent's prototype is needed\n    // later.\n    child.__super__ = parent.prototype;\n\n    return child;\n  };\n\n  // Set up inheritance for the model, collection, router, view and history.\n  Model.extend = Collection.extend = Router.extend = View.extend = History.extend = extend;\n\n  // Throw an error when a URL is needed, and none is supplied.\n  var urlError = function() {\n    throw new Error('A \"url\" property or function must be specified');\n  };\n\n  // Wrap an optional error callback with a fallback error event.\n  var wrapError = function(model, options) {\n    var error = options.error;\n    options.error = function(resp) {\n      if (error) error.call(options.context, model, resp, options);\n      model.trigger('error', model, resp, options);\n    };\n  };\n\n  return Backbone;\n});\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsiL2hvbWUvdWJ1bnR1L3dvcmtzcGFjZS9ub2RlX21vZHVsZXMvYmFja2JvbmUvYmFja2JvbmUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gICAgIEJhY2tib25lLmpzIDEuMy4zXG5cbi8vICAgICAoYykgMjAxMC0yMDE2IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4vLyAgICAgQmFja2JvbmUgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4vLyAgICAgRm9yIGFsbCBkZXRhaWxzIGFuZCBkb2N1bWVudGF0aW9uOlxuLy8gICAgIGh0dHA6Ly9iYWNrYm9uZWpzLm9yZ1xuXG4oZnVuY3Rpb24oZmFjdG9yeSkge1xuXG4gIC8vIEVzdGFibGlzaCB0aGUgcm9vdCBvYmplY3QsIGB3aW5kb3dgIChgc2VsZmApIGluIHRoZSBicm93c2VyLCBvciBgZ2xvYmFsYCBvbiB0aGUgc2VydmVyLlxuICAvLyBXZSB1c2UgYHNlbGZgIGluc3RlYWQgb2YgYHdpbmRvd2AgZm9yIGBXZWJXb3JrZXJgIHN1cHBvcnQuXG4gIHZhciByb290ID0gKHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYuc2VsZiA9PT0gc2VsZiAmJiBzZWxmKSB8fFxuICAgICAgICAgICAgKHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsLmdsb2JhbCA9PT0gZ2xvYmFsICYmIGdsb2JhbCk7XG5cbiAgLy8gU2V0IHVwIEJhY2tib25lIGFwcHJvcHJpYXRlbHkgZm9yIHRoZSBlbnZpcm9ubWVudC4gU3RhcnQgd2l0aCBBTUQuXG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoWyd1bmRlcnNjb3JlJywgJ2pxdWVyeScsICdleHBvcnRzJ10sIGZ1bmN0aW9uKF8sICQsIGV4cG9ydHMpIHtcbiAgICAgIC8vIEV4cG9ydCBnbG9iYWwgZXZlbiBpbiBBTUQgY2FzZSBpbiBjYXNlIHRoaXMgc2NyaXB0IGlzIGxvYWRlZCB3aXRoXG4gICAgICAvLyBvdGhlcnMgdGhhdCBtYXkgc3RpbGwgZXhwZWN0IGEgZ2xvYmFsIEJhY2tib25lLlxuICAgICAgcm9vdC5CYWNrYm9uZSA9IGZhY3Rvcnkocm9vdCwgZXhwb3J0cywgXywgJCk7XG4gICAgfSk7XG5cbiAgLy8gTmV4dCBmb3IgTm9kZS5qcyBvciBDb21tb25KUy4galF1ZXJ5IG1heSBub3QgYmUgbmVlZGVkIGFzIGEgbW9kdWxlLlxuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgIHZhciBfID0gcmVxdWlyZSgndW5kZXJzY29yZScpLCAkO1xuICAgIHRyeSB7ICQgPSByZXF1aXJlKCdqcXVlcnknKTsgfSBjYXRjaCAoZSkge31cbiAgICBmYWN0b3J5KHJvb3QsIGV4cG9ydHMsIF8sICQpO1xuXG4gIC8vIEZpbmFsbHksIGFzIGEgYnJvd3NlciBnbG9iYWwuXG4gIH0gZWxzZSB7XG4gICAgcm9vdC5CYWNrYm9uZSA9IGZhY3Rvcnkocm9vdCwge30sIHJvb3QuXywgKHJvb3QualF1ZXJ5IHx8IHJvb3QuWmVwdG8gfHwgcm9vdC5lbmRlciB8fCByb290LiQpKTtcbiAgfVxuXG59KShmdW5jdGlvbihyb290LCBCYWNrYm9uZSwgXywgJCkge1xuXG4gIC8vIEluaXRpYWwgU2V0dXBcbiAgLy8gLS0tLS0tLS0tLS0tLVxuXG4gIC8vIFNhdmUgdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBgQmFja2JvbmVgIHZhcmlhYmxlLCBzbyB0aGF0IGl0IGNhbiBiZVxuICAvLyByZXN0b3JlZCBsYXRlciBvbiwgaWYgYG5vQ29uZmxpY3RgIGlzIHVzZWQuXG4gIHZhciBwcmV2aW91c0JhY2tib25lID0gcm9vdC5CYWNrYm9uZTtcblxuICAvLyBDcmVhdGUgYSBsb2NhbCByZWZlcmVuY2UgdG8gYSBjb21tb24gYXJyYXkgbWV0aG9kIHdlJ2xsIHdhbnQgdG8gdXNlIGxhdGVyLlxuICB2YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbiAgLy8gQ3VycmVudCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiBLZWVwIGluIHN5bmMgd2l0aCBgcGFja2FnZS5qc29uYC5cbiAgQmFja2JvbmUuVkVSU0lPTiA9ICcxLjMuMyc7XG5cbiAgLy8gRm9yIEJhY2tib25lJ3MgcHVycG9zZXMsIGpRdWVyeSwgWmVwdG8sIEVuZGVyLCBvciBNeSBMaWJyYXJ5IChraWRkaW5nKSBvd25zXG4gIC8vIHRoZSBgJGAgdmFyaWFibGUuXG4gIEJhY2tib25lLiQgPSAkO1xuXG4gIC8vIFJ1bnMgQmFja2JvbmUuanMgaW4gKm5vQ29uZmxpY3QqIG1vZGUsIHJldHVybmluZyB0aGUgYEJhY2tib25lYCB2YXJpYWJsZVxuICAvLyB0byBpdHMgcHJldmlvdXMgb3duZXIuIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhpcyBCYWNrYm9uZSBvYmplY3QuXG4gIEJhY2tib25lLm5vQ29uZmxpY3QgPSBmdW5jdGlvbigpIHtcbiAgICByb290LkJhY2tib25lID0gcHJldmlvdXNCYWNrYm9uZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBUdXJuIG9uIGBlbXVsYXRlSFRUUGAgdG8gc3VwcG9ydCBsZWdhY3kgSFRUUCBzZXJ2ZXJzLiBTZXR0aW5nIHRoaXMgb3B0aW9uXG4gIC8vIHdpbGwgZmFrZSBgXCJQQVRDSFwiYCwgYFwiUFVUXCJgIGFuZCBgXCJERUxFVEVcImAgcmVxdWVzdHMgdmlhIHRoZSBgX21ldGhvZGAgcGFyYW1ldGVyIGFuZFxuICAvLyBzZXQgYSBgWC1IdHRwLU1ldGhvZC1PdmVycmlkZWAgaGVhZGVyLlxuICBCYWNrYm9uZS5lbXVsYXRlSFRUUCA9IGZhbHNlO1xuXG4gIC8vIFR1cm4gb24gYGVtdWxhdGVKU09OYCB0byBzdXBwb3J0IGxlZ2FjeSBzZXJ2ZXJzIHRoYXQgY2FuJ3QgZGVhbCB3aXRoIGRpcmVjdFxuICAvLyBgYXBwbGljYXRpb24vanNvbmAgcmVxdWVzdHMgLi4uIHRoaXMgd2lsbCBlbmNvZGUgdGhlIGJvZHkgYXNcbiAgLy8gYGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZGAgaW5zdGVhZCBhbmQgd2lsbCBzZW5kIHRoZSBtb2RlbCBpbiBhXG4gIC8vIGZvcm0gcGFyYW0gbmFtZWQgYG1vZGVsYC5cbiAgQmFja2JvbmUuZW11bGF0ZUpTT04gPSBmYWxzZTtcblxuICAvLyBQcm94eSBCYWNrYm9uZSBjbGFzcyBtZXRob2RzIHRvIFVuZGVyc2NvcmUgZnVuY3Rpb25zLCB3cmFwcGluZyB0aGUgbW9kZWwnc1xuICAvLyBgYXR0cmlidXRlc2Agb2JqZWN0IG9yIGNvbGxlY3Rpb24ncyBgbW9kZWxzYCBhcnJheSBiZWhpbmQgdGhlIHNjZW5lcy5cbiAgLy9cbiAgLy8gY29sbGVjdGlvbi5maWx0ZXIoZnVuY3Rpb24obW9kZWwpIHsgcmV0dXJuIG1vZGVsLmdldCgnYWdlJykgPiAxMCB9KTtcbiAgLy8gY29sbGVjdGlvbi5lYWNoKHRoaXMuYWRkVmlldyk7XG4gIC8vXG4gIC8vIGBGdW5jdGlvbiNhcHBseWAgY2FuIGJlIHNsb3cgc28gd2UgdXNlIHRoZSBtZXRob2QncyBhcmcgY291bnQsIGlmIHdlIGtub3cgaXQuXG4gIHZhciBhZGRNZXRob2QgPSBmdW5jdGlvbihsZW5ndGgsIG1ldGhvZCwgYXR0cmlidXRlKSB7XG4gICAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gX1ttZXRob2RdKHRoaXNbYXR0cmlidXRlXSk7XG4gICAgICB9O1xuICAgICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF9bbWV0aG9kXSh0aGlzW2F0dHJpYnV0ZV0sIHZhbHVlKTtcbiAgICAgIH07XG4gICAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbihpdGVyYXRlZSwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gX1ttZXRob2RdKHRoaXNbYXR0cmlidXRlXSwgY2IoaXRlcmF0ZWUsIHRoaXMpLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICBjYXNlIDQ6IHJldHVybiBmdW5jdGlvbihpdGVyYXRlZSwgZGVmYXVsdFZhbCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gX1ttZXRob2RdKHRoaXNbYXR0cmlidXRlXSwgY2IoaXRlcmF0ZWUsIHRoaXMpLCBkZWZhdWx0VmFsLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICBkZWZhdWx0OiByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICBhcmdzLnVuc2hpZnQodGhpc1thdHRyaWJ1dGVdKTtcbiAgICAgICAgcmV0dXJuIF9bbWV0aG9kXS5hcHBseShfLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfVxuICB9O1xuICB2YXIgYWRkVW5kZXJzY29yZU1ldGhvZHMgPSBmdW5jdGlvbihDbGFzcywgbWV0aG9kcywgYXR0cmlidXRlKSB7XG4gICAgXy5lYWNoKG1ldGhvZHMsIGZ1bmN0aW9uKGxlbmd0aCwgbWV0aG9kKSB7XG4gICAgICBpZiAoX1ttZXRob2RdKSBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGFkZE1ldGhvZChsZW5ndGgsIG1ldGhvZCwgYXR0cmlidXRlKTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBTdXBwb3J0IGBjb2xsZWN0aW9uLnNvcnRCeSgnYXR0cicpYCBhbmQgYGNvbGxlY3Rpb24uZmluZFdoZXJlKHtpZDogMX0pYC5cbiAgdmFyIGNiID0gZnVuY3Rpb24oaXRlcmF0ZWUsIGluc3RhbmNlKSB7XG4gICAgaWYgKF8uaXNGdW5jdGlvbihpdGVyYXRlZSkpIHJldHVybiBpdGVyYXRlZTtcbiAgICBpZiAoXy5pc09iamVjdChpdGVyYXRlZSkgJiYgIWluc3RhbmNlLl9pc01vZGVsKGl0ZXJhdGVlKSkgcmV0dXJuIG1vZGVsTWF0Y2hlcihpdGVyYXRlZSk7XG4gICAgaWYgKF8uaXNTdHJpbmcoaXRlcmF0ZWUpKSByZXR1cm4gZnVuY3Rpb24obW9kZWwpIHsgcmV0dXJuIG1vZGVsLmdldChpdGVyYXRlZSk7IH07XG4gICAgcmV0dXJuIGl0ZXJhdGVlO1xuICB9O1xuICB2YXIgbW9kZWxNYXRjaGVyID0gZnVuY3Rpb24oYXR0cnMpIHtcbiAgICB2YXIgbWF0Y2hlciA9IF8ubWF0Y2hlcyhhdHRycyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG1vZGVsKSB7XG4gICAgICByZXR1cm4gbWF0Y2hlcihtb2RlbC5hdHRyaWJ1dGVzKTtcbiAgICB9O1xuICB9O1xuXG4gIC8vIEJhY2tib25lLkV2ZW50c1xuICAvLyAtLS0tLS0tLS0tLS0tLS1cblxuICAvLyBBIG1vZHVsZSB0aGF0IGNhbiBiZSBtaXhlZCBpbiB0byAqYW55IG9iamVjdCogaW4gb3JkZXIgdG8gcHJvdmlkZSBpdCB3aXRoXG4gIC8vIGEgY3VzdG9tIGV2ZW50IGNoYW5uZWwuIFlvdSBtYXkgYmluZCBhIGNhbGxiYWNrIHRvIGFuIGV2ZW50IHdpdGggYG9uYCBvclxuICAvLyByZW1vdmUgd2l0aCBgb2ZmYDsgYHRyaWdnZXJgLWluZyBhbiBldmVudCBmaXJlcyBhbGwgY2FsbGJhY2tzIGluXG4gIC8vIHN1Y2Nlc3Npb24uXG4gIC8vXG4gIC8vICAgICB2YXIgb2JqZWN0ID0ge307XG4gIC8vICAgICBfLmV4dGVuZChvYmplY3QsIEJhY2tib25lLkV2ZW50cyk7XG4gIC8vICAgICBvYmplY3Qub24oJ2V4cGFuZCcsIGZ1bmN0aW9uKCl7IGFsZXJ0KCdleHBhbmRlZCcpOyB9KTtcbiAgLy8gICAgIG9iamVjdC50cmlnZ2VyKCdleHBhbmQnKTtcbiAgLy9cbiAgdmFyIEV2ZW50cyA9IEJhY2tib25lLkV2ZW50cyA9IHt9O1xuXG4gIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIHNwbGl0IGV2ZW50IHN0cmluZ3MuXG4gIHZhciBldmVudFNwbGl0dGVyID0gL1xccysvO1xuXG4gIC8vIEl0ZXJhdGVzIG92ZXIgdGhlIHN0YW5kYXJkIGBldmVudCwgY2FsbGJhY2tgIChhcyB3ZWxsIGFzIHRoZSBmYW5jeSBtdWx0aXBsZVxuICAvLyBzcGFjZS1zZXBhcmF0ZWQgZXZlbnRzIGBcImNoYW5nZSBibHVyXCIsIGNhbGxiYWNrYCBhbmQgalF1ZXJ5LXN0eWxlIGV2ZW50XG4gIC8vIG1hcHMgYHtldmVudDogY2FsbGJhY2t9YCkuXG4gIHZhciBldmVudHNBcGkgPSBmdW5jdGlvbihpdGVyYXRlZSwgZXZlbnRzLCBuYW1lLCBjYWxsYmFjaywgb3B0cykge1xuICAgIHZhciBpID0gMCwgbmFtZXM7XG4gICAgaWYgKG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBIYW5kbGUgZXZlbnQgbWFwcy5cbiAgICAgIGlmIChjYWxsYmFjayAhPT0gdm9pZCAwICYmICdjb250ZXh0JyBpbiBvcHRzICYmIG9wdHMuY29udGV4dCA9PT0gdm9pZCAwKSBvcHRzLmNvbnRleHQgPSBjYWxsYmFjaztcbiAgICAgIGZvciAobmFtZXMgPSBfLmtleXMobmFtZSk7IGkgPCBuYW1lcy5sZW5ndGggOyBpKyspIHtcbiAgICAgICAgZXZlbnRzID0gZXZlbnRzQXBpKGl0ZXJhdGVlLCBldmVudHMsIG5hbWVzW2ldLCBuYW1lW25hbWVzW2ldXSwgb3B0cyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChuYW1lICYmIGV2ZW50U3BsaXR0ZXIudGVzdChuYW1lKSkge1xuICAgICAgLy8gSGFuZGxlIHNwYWNlLXNlcGFyYXRlZCBldmVudCBuYW1lcyBieSBkZWxlZ2F0aW5nIHRoZW0gaW5kaXZpZHVhbGx5LlxuICAgICAgZm9yIChuYW1lcyA9IG5hbWUuc3BsaXQoZXZlbnRTcGxpdHRlcik7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBldmVudHMgPSBpdGVyYXRlZShldmVudHMsIG5hbWVzW2ldLCBjYWxsYmFjaywgb3B0cyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpbmFsbHksIHN0YW5kYXJkIGV2ZW50cy5cbiAgICAgIGV2ZW50cyA9IGl0ZXJhdGVlKGV2ZW50cywgbmFtZSwgY2FsbGJhY2ssIG9wdHMpO1xuICAgIH1cbiAgICByZXR1cm4gZXZlbnRzO1xuICB9O1xuXG4gIC8vIEJpbmQgYW4gZXZlbnQgdG8gYSBgY2FsbGJhY2tgIGZ1bmN0aW9uLiBQYXNzaW5nIGBcImFsbFwiYCB3aWxsIGJpbmRcbiAgLy8gdGhlIGNhbGxiYWNrIHRvIGFsbCBldmVudHMgZmlyZWQuXG4gIEV2ZW50cy5vbiA9IGZ1bmN0aW9uKG5hbWUsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGludGVybmFsT24odGhpcywgbmFtZSwgY2FsbGJhY2ssIGNvbnRleHQpO1xuICB9O1xuXG4gIC8vIEd1YXJkIHRoZSBgbGlzdGVuaW5nYCBhcmd1bWVudCBmcm9tIHRoZSBwdWJsaWMgQVBJLlxuICB2YXIgaW50ZXJuYWxPbiA9IGZ1bmN0aW9uKG9iaiwgbmFtZSwgY2FsbGJhY2ssIGNvbnRleHQsIGxpc3RlbmluZykge1xuICAgIG9iai5fZXZlbnRzID0gZXZlbnRzQXBpKG9uQXBpLCBvYmouX2V2ZW50cyB8fCB7fSwgbmFtZSwgY2FsbGJhY2ssIHtcbiAgICAgIGNvbnRleHQ6IGNvbnRleHQsXG4gICAgICBjdHg6IG9iaixcbiAgICAgIGxpc3RlbmluZzogbGlzdGVuaW5nXG4gICAgfSk7XG5cbiAgICBpZiAobGlzdGVuaW5nKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzID0gb2JqLl9saXN0ZW5lcnMgfHwgKG9iai5fbGlzdGVuZXJzID0ge30pO1xuICAgICAgbGlzdGVuZXJzW2xpc3RlbmluZy5pZF0gPSBsaXN0ZW5pbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbiAgfTtcblxuICAvLyBJbnZlcnNpb24tb2YtY29udHJvbCB2ZXJzaW9ucyBvZiBgb25gLiBUZWxsICp0aGlzKiBvYmplY3QgdG8gbGlzdGVuIHRvXG4gIC8vIGFuIGV2ZW50IGluIGFub3RoZXIgb2JqZWN0Li4uIGtlZXBpbmcgdHJhY2sgb2Ygd2hhdCBpdCdzIGxpc3RlbmluZyB0b1xuICAvLyBmb3IgZWFzaWVyIHVuYmluZGluZyBsYXRlci5cbiAgRXZlbnRzLmxpc3RlblRvID0gZnVuY3Rpb24ob2JqLCBuYW1lLCBjYWxsYmFjaykge1xuICAgIGlmICghb2JqKSByZXR1cm4gdGhpcztcbiAgICB2YXIgaWQgPSBvYmouX2xpc3RlbklkIHx8IChvYmouX2xpc3RlbklkID0gXy51bmlxdWVJZCgnbCcpKTtcbiAgICB2YXIgbGlzdGVuaW5nVG8gPSB0aGlzLl9saXN0ZW5pbmdUbyB8fCAodGhpcy5fbGlzdGVuaW5nVG8gPSB7fSk7XG4gICAgdmFyIGxpc3RlbmluZyA9IGxpc3RlbmluZ1RvW2lkXTtcblxuICAgIC8vIFRoaXMgb2JqZWN0IGlzIG5vdCBsaXN0ZW5pbmcgdG8gYW55IG90aGVyIGV2ZW50cyBvbiBgb2JqYCB5ZXQuXG4gICAgLy8gU2V0dXAgdGhlIG5lY2Vzc2FyeSByZWZlcmVuY2VzIHRvIHRyYWNrIHRoZSBsaXN0ZW5pbmcgY2FsbGJhY2tzLlxuICAgIGlmICghbGlzdGVuaW5nKSB7XG4gICAgICB2YXIgdGhpc0lkID0gdGhpcy5fbGlzdGVuSWQgfHwgKHRoaXMuX2xpc3RlbklkID0gXy51bmlxdWVJZCgnbCcpKTtcbiAgICAgIGxpc3RlbmluZyA9IGxpc3RlbmluZ1RvW2lkXSA9IHtvYmo6IG9iaiwgb2JqSWQ6IGlkLCBpZDogdGhpc0lkLCBsaXN0ZW5pbmdUbzogbGlzdGVuaW5nVG8sIGNvdW50OiAwfTtcbiAgICB9XG5cbiAgICAvLyBCaW5kIGNhbGxiYWNrcyBvbiBvYmosIGFuZCBrZWVwIHRyYWNrIG9mIHRoZW0gb24gbGlzdGVuaW5nLlxuICAgIGludGVybmFsT24ob2JqLCBuYW1lLCBjYWxsYmFjaywgdGhpcywgbGlzdGVuaW5nKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBUaGUgcmVkdWNpbmcgQVBJIHRoYXQgYWRkcyBhIGNhbGxiYWNrIHRvIHRoZSBgZXZlbnRzYCBvYmplY3QuXG4gIHZhciBvbkFwaSA9IGZ1bmN0aW9uKGV2ZW50cywgbmFtZSwgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHZhciBoYW5kbGVycyA9IGV2ZW50c1tuYW1lXSB8fCAoZXZlbnRzW25hbWVdID0gW10pO1xuICAgICAgdmFyIGNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQsIGN0eCA9IG9wdGlvbnMuY3R4LCBsaXN0ZW5pbmcgPSBvcHRpb25zLmxpc3RlbmluZztcbiAgICAgIGlmIChsaXN0ZW5pbmcpIGxpc3RlbmluZy5jb3VudCsrO1xuXG4gICAgICBoYW5kbGVycy5wdXNoKHtjYWxsYmFjazogY2FsbGJhY2ssIGNvbnRleHQ6IGNvbnRleHQsIGN0eDogY29udGV4dCB8fCBjdHgsIGxpc3RlbmluZzogbGlzdGVuaW5nfSk7XG4gICAgfVxuICAgIHJldHVybiBldmVudHM7XG4gIH07XG5cbiAgLy8gUmVtb3ZlIG9uZSBvciBtYW55IGNhbGxiYWNrcy4gSWYgYGNvbnRleHRgIGlzIG51bGwsIHJlbW92ZXMgYWxsXG4gIC8vIGNhbGxiYWNrcyB3aXRoIHRoYXQgZnVuY3Rpb24uIElmIGBjYWxsYmFja2AgaXMgbnVsbCwgcmVtb3ZlcyBhbGxcbiAgLy8gY2FsbGJhY2tzIGZvciB0aGUgZXZlbnQuIElmIGBuYW1lYCBpcyBudWxsLCByZW1vdmVzIGFsbCBib3VuZFxuICAvLyBjYWxsYmFja3MgZm9yIGFsbCBldmVudHMuXG4gIEV2ZW50cy5vZmYgPSBmdW5jdGlvbihuYW1lLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIGlmICghdGhpcy5fZXZlbnRzKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLl9ldmVudHMgPSBldmVudHNBcGkob2ZmQXBpLCB0aGlzLl9ldmVudHMsIG5hbWUsIGNhbGxiYWNrLCB7XG4gICAgICBjb250ZXh0OiBjb250ZXh0LFxuICAgICAgbGlzdGVuZXJzOiB0aGlzLl9saXN0ZW5lcnNcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBUZWxsIHRoaXMgb2JqZWN0IHRvIHN0b3AgbGlzdGVuaW5nIHRvIGVpdGhlciBzcGVjaWZpYyBldmVudHMgLi4uIG9yXG4gIC8vIHRvIGV2ZXJ5IG9iamVjdCBpdCdzIGN1cnJlbnRseSBsaXN0ZW5pbmcgdG8uXG4gIEV2ZW50cy5zdG9wTGlzdGVuaW5nID0gZnVuY3Rpb24ob2JqLCBuYW1lLCBjYWxsYmFjaykge1xuICAgIHZhciBsaXN0ZW5pbmdUbyA9IHRoaXMuX2xpc3RlbmluZ1RvO1xuICAgIGlmICghbGlzdGVuaW5nVG8pIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGlkcyA9IG9iaiA/IFtvYmouX2xpc3RlbklkXSA6IF8ua2V5cyhsaXN0ZW5pbmdUbyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGxpc3RlbmluZyA9IGxpc3RlbmluZ1RvW2lkc1tpXV07XG5cbiAgICAgIC8vIElmIGxpc3RlbmluZyBkb2Vzbid0IGV4aXN0LCB0aGlzIG9iamVjdCBpcyBub3QgY3VycmVudGx5XG4gICAgICAvLyBsaXN0ZW5pbmcgdG8gb2JqLiBCcmVhayBvdXQgZWFybHkuXG4gICAgICBpZiAoIWxpc3RlbmluZykgYnJlYWs7XG5cbiAgICAgIGxpc3RlbmluZy5vYmoub2ZmKG5hbWUsIGNhbGxiYWNrLCB0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBUaGUgcmVkdWNpbmcgQVBJIHRoYXQgcmVtb3ZlcyBhIGNhbGxiYWNrIGZyb20gdGhlIGBldmVudHNgIG9iamVjdC5cbiAgdmFyIG9mZkFwaSA9IGZ1bmN0aW9uKGV2ZW50cywgbmFtZSwgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgICBpZiAoIWV2ZW50cykgcmV0dXJuO1xuXG4gICAgdmFyIGkgPSAwLCBsaXN0ZW5pbmc7XG4gICAgdmFyIGNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQsIGxpc3RlbmVycyA9IG9wdGlvbnMubGlzdGVuZXJzO1xuXG4gICAgLy8gRGVsZXRlIGFsbCBldmVudHMgbGlzdGVuZXJzIGFuZCBcImRyb3BcIiBldmVudHMuXG4gICAgaWYgKCFuYW1lICYmICFjYWxsYmFjayAmJiAhY29udGV4dCkge1xuICAgICAgdmFyIGlkcyA9IF8ua2V5cyhsaXN0ZW5lcnMpO1xuICAgICAgZm9yICg7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGlzdGVuaW5nID0gbGlzdGVuZXJzW2lkc1tpXV07XG4gICAgICAgIGRlbGV0ZSBsaXN0ZW5lcnNbbGlzdGVuaW5nLmlkXTtcbiAgICAgICAgZGVsZXRlIGxpc3RlbmluZy5saXN0ZW5pbmdUb1tsaXN0ZW5pbmcub2JqSWRdO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBuYW1lcyA9IG5hbWUgPyBbbmFtZV0gOiBfLmtleXMoZXZlbnRzKTtcbiAgICBmb3IgKDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBuYW1lID0gbmFtZXNbaV07XG4gICAgICB2YXIgaGFuZGxlcnMgPSBldmVudHNbbmFtZV07XG5cbiAgICAgIC8vIEJhaWwgb3V0IGlmIHRoZXJlIGFyZSBubyBldmVudHMgc3RvcmVkLlxuICAgICAgaWYgKCFoYW5kbGVycykgYnJlYWs7XG5cbiAgICAgIC8vIFJlcGxhY2UgZXZlbnRzIGlmIHRoZXJlIGFyZSBhbnkgcmVtYWluaW5nLiAgT3RoZXJ3aXNlLCBjbGVhbiB1cC5cbiAgICAgIHZhciByZW1haW5pbmcgPSBbXTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaGFuZGxlcnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGhhbmRsZXIgPSBoYW5kbGVyc1tqXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrICE9PSBoYW5kbGVyLmNhbGxiYWNrICYmXG4gICAgICAgICAgICBjYWxsYmFjayAhPT0gaGFuZGxlci5jYWxsYmFjay5fY2FsbGJhY2sgfHxcbiAgICAgICAgICAgICAgY29udGV4dCAmJiBjb250ZXh0ICE9PSBoYW5kbGVyLmNvbnRleHRcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmVtYWluaW5nLnB1c2goaGFuZGxlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGlzdGVuaW5nID0gaGFuZGxlci5saXN0ZW5pbmc7XG4gICAgICAgICAgaWYgKGxpc3RlbmluZyAmJiAtLWxpc3RlbmluZy5jb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgZGVsZXRlIGxpc3RlbmVyc1tsaXN0ZW5pbmcuaWRdO1xuICAgICAgICAgICAgZGVsZXRlIGxpc3RlbmluZy5saXN0ZW5pbmdUb1tsaXN0ZW5pbmcub2JqSWRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgdGFpbCBldmVudCBpZiB0aGUgbGlzdCBoYXMgYW55IGV2ZW50cy4gIE90aGVyd2lzZSwgY2xlYW4gdXAuXG4gICAgICBpZiAocmVtYWluaW5nLmxlbmd0aCkge1xuICAgICAgICBldmVudHNbbmFtZV0gPSByZW1haW5pbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgZXZlbnRzW25hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXZlbnRzO1xuICB9O1xuXG4gIC8vIEJpbmQgYW4gZXZlbnQgdG8gb25seSBiZSB0cmlnZ2VyZWQgYSBzaW5nbGUgdGltZS4gQWZ0ZXIgdGhlIGZpcnN0IHRpbWVcbiAgLy8gdGhlIGNhbGxiYWNrIGlzIGludm9rZWQsIGl0cyBsaXN0ZW5lciB3aWxsIGJlIHJlbW92ZWQuIElmIG11bHRpcGxlIGV2ZW50c1xuICAvLyBhcmUgcGFzc2VkIGluIHVzaW5nIHRoZSBzcGFjZS1zZXBhcmF0ZWQgc3ludGF4LCB0aGUgaGFuZGxlciB3aWxsIGZpcmVcbiAgLy8gb25jZSBmb3IgZWFjaCBldmVudCwgbm90IG9uY2UgZm9yIGEgY29tYmluYXRpb24gb2YgYWxsIGV2ZW50cy5cbiAgRXZlbnRzLm9uY2UgPSBmdW5jdGlvbihuYW1lLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIC8vIE1hcCB0aGUgZXZlbnQgaW50byBhIGB7ZXZlbnQ6IG9uY2V9YCBvYmplY3QuXG4gICAgdmFyIGV2ZW50cyA9IGV2ZW50c0FwaShvbmNlTWFwLCB7fSwgbmFtZSwgY2FsbGJhY2ssIF8uYmluZCh0aGlzLm9mZiwgdGhpcykpO1xuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgJiYgY29udGV4dCA9PSBudWxsKSBjYWxsYmFjayA9IHZvaWQgMDtcbiAgICByZXR1cm4gdGhpcy5vbihldmVudHMsIGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgfTtcblxuICAvLyBJbnZlcnNpb24tb2YtY29udHJvbCB2ZXJzaW9ucyBvZiBgb25jZWAuXG4gIEV2ZW50cy5saXN0ZW5Ub09uY2UgPSBmdW5jdGlvbihvYmosIG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgLy8gTWFwIHRoZSBldmVudCBpbnRvIGEgYHtldmVudDogb25jZX1gIG9iamVjdC5cbiAgICB2YXIgZXZlbnRzID0gZXZlbnRzQXBpKG9uY2VNYXAsIHt9LCBuYW1lLCBjYWxsYmFjaywgXy5iaW5kKHRoaXMuc3RvcExpc3RlbmluZywgdGhpcywgb2JqKSk7XG4gICAgcmV0dXJuIHRoaXMubGlzdGVuVG8ob2JqLCBldmVudHMpO1xuICB9O1xuXG4gIC8vIFJlZHVjZXMgdGhlIGV2ZW50IGNhbGxiYWNrcyBpbnRvIGEgbWFwIG9mIGB7ZXZlbnQ6IG9uY2VXcmFwcGVyfWAuXG4gIC8vIGBvZmZlcmAgdW5iaW5kcyB0aGUgYG9uY2VXcmFwcGVyYCBhZnRlciBpdCBoYXMgYmVlbiBjYWxsZWQuXG4gIHZhciBvbmNlTWFwID0gZnVuY3Rpb24obWFwLCBuYW1lLCBjYWxsYmFjaywgb2ZmZXIpIHtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHZhciBvbmNlID0gbWFwW25hbWVdID0gXy5vbmNlKGZ1bmN0aW9uKCkge1xuICAgICAgICBvZmZlcihuYW1lLCBvbmNlKTtcbiAgICAgICAgY2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH0pO1xuICAgICAgb25jZS5fY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfTtcblxuICAvLyBUcmlnZ2VyIG9uZSBvciBtYW55IGV2ZW50cywgZmlyaW5nIGFsbCBib3VuZCBjYWxsYmFja3MuIENhbGxiYWNrcyBhcmVcbiAgLy8gcGFzc2VkIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyBgdHJpZ2dlcmAgaXMsIGFwYXJ0IGZyb20gdGhlIGV2ZW50IG5hbWVcbiAgLy8gKHVubGVzcyB5b3UncmUgbGlzdGVuaW5nIG9uIGBcImFsbFwiYCwgd2hpY2ggd2lsbCBjYXVzZSB5b3VyIGNhbGxiYWNrIHRvXG4gIC8vIHJlY2VpdmUgdGhlIHRydWUgbmFtZSBvZiB0aGUgZXZlbnQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50KS5cbiAgRXZlbnRzLnRyaWdnZXIgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgaWYgKCF0aGlzLl9ldmVudHMpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGxlbmd0aCA9IE1hdGgubWF4KDAsIGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICB2YXIgYXJncyA9IEFycmF5KGxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMV07XG5cbiAgICBldmVudHNBcGkodHJpZ2dlckFwaSwgdGhpcy5fZXZlbnRzLCBuYW1lLCB2b2lkIDAsIGFyZ3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIEhhbmRsZXMgdHJpZ2dlcmluZyB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgY2FsbGJhY2tzLlxuICB2YXIgdHJpZ2dlckFwaSA9IGZ1bmN0aW9uKG9iakV2ZW50cywgbmFtZSwgY2FsbGJhY2ssIGFyZ3MpIHtcbiAgICBpZiAob2JqRXZlbnRzKSB7XG4gICAgICB2YXIgZXZlbnRzID0gb2JqRXZlbnRzW25hbWVdO1xuICAgICAgdmFyIGFsbEV2ZW50cyA9IG9iakV2ZW50cy5hbGw7XG4gICAgICBpZiAoZXZlbnRzICYmIGFsbEV2ZW50cykgYWxsRXZlbnRzID0gYWxsRXZlbnRzLnNsaWNlKCk7XG4gICAgICBpZiAoZXZlbnRzKSB0cmlnZ2VyRXZlbnRzKGV2ZW50cywgYXJncyk7XG4gICAgICBpZiAoYWxsRXZlbnRzKSB0cmlnZ2VyRXZlbnRzKGFsbEV2ZW50cywgW25hbWVdLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmpFdmVudHM7XG4gIH07XG5cbiAgLy8gQSBkaWZmaWN1bHQtdG8tYmVsaWV2ZSwgYnV0IG9wdGltaXplZCBpbnRlcm5hbCBkaXNwYXRjaCBmdW5jdGlvbiBmb3JcbiAgLy8gdHJpZ2dlcmluZyBldmVudHMuIFRyaWVzIHRvIGtlZXAgdGhlIHVzdWFsIGNhc2VzIHNwZWVkeSAobW9zdCBpbnRlcm5hbFxuICAvLyBCYWNrYm9uZSBldmVudHMgaGF2ZSAzIGFyZ3VtZW50cykuXG4gIHZhciB0cmlnZ2VyRXZlbnRzID0gZnVuY3Rpb24oZXZlbnRzLCBhcmdzKSB7XG4gICAgdmFyIGV2LCBpID0gLTEsIGwgPSBldmVudHMubGVuZ3RoLCBhMSA9IGFyZ3NbMF0sIGEyID0gYXJnc1sxXSwgYTMgPSBhcmdzWzJdO1xuICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDogd2hpbGUgKCsraSA8IGwpIChldiA9IGV2ZW50c1tpXSkuY2FsbGJhY2suY2FsbChldi5jdHgpOyByZXR1cm47XG4gICAgICBjYXNlIDE6IHdoaWxlICgrK2kgPCBsKSAoZXYgPSBldmVudHNbaV0pLmNhbGxiYWNrLmNhbGwoZXYuY3R4LCBhMSk7IHJldHVybjtcbiAgICAgIGNhc2UgMjogd2hpbGUgKCsraSA8IGwpIChldiA9IGV2ZW50c1tpXSkuY2FsbGJhY2suY2FsbChldi5jdHgsIGExLCBhMik7IHJldHVybjtcbiAgICAgIGNhc2UgMzogd2hpbGUgKCsraSA8IGwpIChldiA9IGV2ZW50c1tpXSkuY2FsbGJhY2suY2FsbChldi5jdHgsIGExLCBhMiwgYTMpOyByZXR1cm47XG4gICAgICBkZWZhdWx0OiB3aGlsZSAoKytpIDwgbCkgKGV2ID0gZXZlbnRzW2ldKS5jYWxsYmFjay5hcHBseShldi5jdHgsIGFyZ3MpOyByZXR1cm47XG4gICAgfVxuICB9O1xuXG4gIC8vIEFsaWFzZXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICBFdmVudHMuYmluZCAgID0gRXZlbnRzLm9uO1xuICBFdmVudHMudW5iaW5kID0gRXZlbnRzLm9mZjtcblxuICAvLyBBbGxvdyB0aGUgYEJhY2tib25lYCBvYmplY3QgdG8gc2VydmUgYXMgYSBnbG9iYWwgZXZlbnQgYnVzLCBmb3IgZm9sa3Mgd2hvXG4gIC8vIHdhbnQgZ2xvYmFsIFwicHVic3ViXCIgaW4gYSBjb252ZW5pZW50IHBsYWNlLlxuICBfLmV4dGVuZChCYWNrYm9uZSwgRXZlbnRzKTtcblxuICAvLyBCYWNrYm9uZS5Nb2RlbFxuICAvLyAtLS0tLS0tLS0tLS0tLVxuXG4gIC8vIEJhY2tib25lICoqTW9kZWxzKiogYXJlIHRoZSBiYXNpYyBkYXRhIG9iamVjdCBpbiB0aGUgZnJhbWV3b3JrIC0tXG4gIC8vIGZyZXF1ZW50bHkgcmVwcmVzZW50aW5nIGEgcm93IGluIGEgdGFibGUgaW4gYSBkYXRhYmFzZSBvbiB5b3VyIHNlcnZlci5cbiAgLy8gQSBkaXNjcmV0ZSBjaHVuayBvZiBkYXRhIGFuZCBhIGJ1bmNoIG9mIHVzZWZ1bCwgcmVsYXRlZCBtZXRob2RzIGZvclxuICAvLyBwZXJmb3JtaW5nIGNvbXB1dGF0aW9ucyBhbmQgdHJhbnNmb3JtYXRpb25zIG9uIHRoYXQgZGF0YS5cblxuICAvLyBDcmVhdGUgYSBuZXcgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZXMuIEEgY2xpZW50IGlkIChgY2lkYClcbiAgLy8gaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYW5kIGFzc2lnbmVkIGZvciB5b3UuXG4gIHZhciBNb2RlbCA9IEJhY2tib25lLk1vZGVsID0gZnVuY3Rpb24oYXR0cmlidXRlcywgb3B0aW9ucykge1xuICAgIHZhciBhdHRycyA9IGF0dHJpYnV0ZXMgfHwge307XG4gICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcbiAgICB0aGlzLmNpZCA9IF8udW5pcXVlSWQodGhpcy5jaWRQcmVmaXgpO1xuICAgIHRoaXMuYXR0cmlidXRlcyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmNvbGxlY3Rpb24pIHRoaXMuY29sbGVjdGlvbiA9IG9wdGlvbnMuY29sbGVjdGlvbjtcbiAgICBpZiAob3B0aW9ucy5wYXJzZSkgYXR0cnMgPSB0aGlzLnBhcnNlKGF0dHJzLCBvcHRpb25zKSB8fCB7fTtcbiAgICB2YXIgZGVmYXVsdHMgPSBfLnJlc3VsdCh0aGlzLCAnZGVmYXVsdHMnKTtcbiAgICBhdHRycyA9IF8uZGVmYXVsdHMoXy5leHRlbmQoe30sIGRlZmF1bHRzLCBhdHRycyksIGRlZmF1bHRzKTtcbiAgICB0aGlzLnNldChhdHRycywgb3B0aW9ucyk7XG4gICAgdGhpcy5jaGFuZ2VkID0ge307XG4gICAgdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgLy8gQXR0YWNoIGFsbCBpbmhlcml0YWJsZSBtZXRob2RzIHRvIHRoZSBNb2RlbCBwcm90b3R5cGUuXG4gIF8uZXh0ZW5kKE1vZGVsLnByb3RvdHlwZSwgRXZlbnRzLCB7XG5cbiAgICAvLyBBIGhhc2ggb2YgYXR0cmlidXRlcyB3aG9zZSBjdXJyZW50IGFuZCBwcmV2aW91cyB2YWx1ZSBkaWZmZXIuXG4gICAgY2hhbmdlZDogbnVsbCxcblxuICAgIC8vIFRoZSB2YWx1ZSByZXR1cm5lZCBkdXJpbmcgdGhlIGxhc3QgZmFpbGVkIHZhbGlkYXRpb24uXG4gICAgdmFsaWRhdGlvbkVycm9yOiBudWxsLFxuXG4gICAgLy8gVGhlIGRlZmF1bHQgbmFtZSBmb3IgdGhlIEpTT04gYGlkYCBhdHRyaWJ1dGUgaXMgYFwiaWRcImAuIE1vbmdvREIgYW5kXG4gICAgLy8gQ291Y2hEQiB1c2VycyBtYXkgd2FudCB0byBzZXQgdGhpcyB0byBgXCJfaWRcImAuXG4gICAgaWRBdHRyaWJ1dGU6ICdpZCcsXG5cbiAgICAvLyBUaGUgcHJlZml4IGlzIHVzZWQgdG8gY3JlYXRlIHRoZSBjbGllbnQgaWQgd2hpY2ggaXMgdXNlZCB0byBpZGVudGlmeSBtb2RlbHMgbG9jYWxseS5cbiAgICAvLyBZb3UgbWF5IHdhbnQgdG8gb3ZlcnJpZGUgdGhpcyBpZiB5b3UncmUgZXhwZXJpZW5jaW5nIG5hbWUgY2xhc2hlcyB3aXRoIG1vZGVsIGlkcy5cbiAgICBjaWRQcmVmaXg6ICdjJyxcblxuICAgIC8vIEluaXRpYWxpemUgaXMgYW4gZW1wdHkgZnVuY3Rpb24gYnkgZGVmYXVsdC4gT3ZlcnJpZGUgaXQgd2l0aCB5b3VyIG93blxuICAgIC8vIGluaXRpYWxpemF0aW9uIGxvZ2ljLlxuICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKCl7fSxcblxuICAgIC8vIFJldHVybiBhIGNvcHkgb2YgdGhlIG1vZGVsJ3MgYGF0dHJpYnV0ZXNgIG9iamVjdC5cbiAgICB0b0pTT046IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBfLmNsb25lKHRoaXMuYXR0cmlidXRlcyk7XG4gICAgfSxcblxuICAgIC8vIFByb3h5IGBCYWNrYm9uZS5zeW5jYCBieSBkZWZhdWx0IC0tIGJ1dCBvdmVycmlkZSB0aGlzIGlmIHlvdSBuZWVkXG4gICAgLy8gY3VzdG9tIHN5bmNpbmcgc2VtYW50aWNzIGZvciAqdGhpcyogcGFydGljdWxhciBtb2RlbC5cbiAgICBzeW5jOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBCYWNrYm9uZS5zeW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcblxuICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlLlxuICAgIGdldDogZnVuY3Rpb24oYXR0cikge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlc1thdHRyXTtcbiAgICB9LFxuXG4gICAgLy8gR2V0IHRoZSBIVE1MLWVzY2FwZWQgdmFsdWUgb2YgYW4gYXR0cmlidXRlLlxuICAgIGVzY2FwZTogZnVuY3Rpb24oYXR0cikge1xuICAgICAgcmV0dXJuIF8uZXNjYXBlKHRoaXMuZ2V0KGF0dHIpKTtcbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGF0dHJpYnV0ZSBjb250YWlucyBhIHZhbHVlIHRoYXQgaXMgbm90IG51bGxcbiAgICAvLyBvciB1bmRlZmluZWQuXG4gICAgaGFzOiBmdW5jdGlvbihhdHRyKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoYXR0cikgIT0gbnVsbDtcbiAgICB9LFxuXG4gICAgLy8gU3BlY2lhbC1jYXNlZCBwcm94eSB0byB1bmRlcnNjb3JlJ3MgYF8ubWF0Y2hlc2AgbWV0aG9kLlxuICAgIG1hdGNoZXM6IGZ1bmN0aW9uKGF0dHJzKSB7XG4gICAgICByZXR1cm4gISFfLml0ZXJhdGVlKGF0dHJzLCB0aGlzKSh0aGlzLmF0dHJpYnV0ZXMpO1xuICAgIH0sXG5cbiAgICAvLyBTZXQgYSBoYXNoIG9mIG1vZGVsIGF0dHJpYnV0ZXMgb24gdGhlIG9iamVjdCwgZmlyaW5nIGBcImNoYW5nZVwiYC4gVGhpcyBpc1xuICAgIC8vIHRoZSBjb3JlIHByaW1pdGl2ZSBvcGVyYXRpb24gb2YgYSBtb2RlbCwgdXBkYXRpbmcgdGhlIGRhdGEgYW5kIG5vdGlmeWluZ1xuICAgIC8vIGFueW9uZSB3aG8gbmVlZHMgdG8ga25vdyBhYm91dCB0aGUgY2hhbmdlIGluIHN0YXRlLiBUaGUgaGVhcnQgb2YgdGhlIGJlYXN0LlxuICAgIHNldDogZnVuY3Rpb24oa2V5LCB2YWwsIG9wdGlvbnMpIHtcbiAgICAgIGlmIChrZXkgPT0gbnVsbCkgcmV0dXJuIHRoaXM7XG5cbiAgICAgIC8vIEhhbmRsZSBib3RoIGBcImtleVwiLCB2YWx1ZWAgYW5kIGB7a2V5OiB2YWx1ZX1gIC1zdHlsZSBhcmd1bWVudHMuXG4gICAgICB2YXIgYXR0cnM7XG4gICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYXR0cnMgPSBrZXk7XG4gICAgICAgIG9wdGlvbnMgPSB2YWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAoYXR0cnMgPSB7fSlba2V5XSA9IHZhbDtcbiAgICAgIH1cblxuICAgICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcblxuICAgICAgLy8gUnVuIHZhbGlkYXRpb24uXG4gICAgICBpZiAoIXRoaXMuX3ZhbGlkYXRlKGF0dHJzLCBvcHRpb25zKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBFeHRyYWN0IGF0dHJpYnV0ZXMgYW5kIG9wdGlvbnMuXG4gICAgICB2YXIgdW5zZXQgICAgICA9IG9wdGlvbnMudW5zZXQ7XG4gICAgICB2YXIgc2lsZW50ICAgICA9IG9wdGlvbnMuc2lsZW50O1xuICAgICAgdmFyIGNoYW5nZXMgICAgPSBbXTtcbiAgICAgIHZhciBjaGFuZ2luZyAgID0gdGhpcy5fY2hhbmdpbmc7XG4gICAgICB0aGlzLl9jaGFuZ2luZyA9IHRydWU7XG5cbiAgICAgIGlmICghY2hhbmdpbmcpIHtcbiAgICAgICAgdGhpcy5fcHJldmlvdXNBdHRyaWJ1dGVzID0gXy5jbG9uZSh0aGlzLmF0dHJpYnV0ZXMpO1xuICAgICAgICB0aGlzLmNoYW5nZWQgPSB7fTtcbiAgICAgIH1cblxuICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLmF0dHJpYnV0ZXM7XG4gICAgICB2YXIgY2hhbmdlZCA9IHRoaXMuY2hhbmdlZDtcbiAgICAgIHZhciBwcmV2ICAgID0gdGhpcy5fcHJldmlvdXNBdHRyaWJ1dGVzO1xuXG4gICAgICAvLyBGb3IgZWFjaCBgc2V0YCBhdHRyaWJ1dGUsIHVwZGF0ZSBvciBkZWxldGUgdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAgICBmb3IgKHZhciBhdHRyIGluIGF0dHJzKSB7XG4gICAgICAgIHZhbCA9IGF0dHJzW2F0dHJdO1xuICAgICAgICBpZiAoIV8uaXNFcXVhbChjdXJyZW50W2F0dHJdLCB2YWwpKSBjaGFuZ2VzLnB1c2goYXR0cik7XG4gICAgICAgIGlmICghXy5pc0VxdWFsKHByZXZbYXR0cl0sIHZhbCkpIHtcbiAgICAgICAgICBjaGFuZ2VkW2F0dHJdID0gdmFsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBjaGFuZ2VkW2F0dHJdO1xuICAgICAgICB9XG4gICAgICAgIHVuc2V0ID8gZGVsZXRlIGN1cnJlbnRbYXR0cl0gOiBjdXJyZW50W2F0dHJdID0gdmFsO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgdGhlIGBpZGAuXG4gICAgICBpZiAodGhpcy5pZEF0dHJpYnV0ZSBpbiBhdHRycykgdGhpcy5pZCA9IHRoaXMuZ2V0KHRoaXMuaWRBdHRyaWJ1dGUpO1xuXG4gICAgICAvLyBUcmlnZ2VyIGFsbCByZWxldmFudCBhdHRyaWJ1dGUgY2hhbmdlcy5cbiAgICAgIGlmICghc2lsZW50KSB7XG4gICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCkgdGhpcy5fcGVuZGluZyA9IG9wdGlvbnM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHRoaXMudHJpZ2dlcignY2hhbmdlOicgKyBjaGFuZ2VzW2ldLCB0aGlzLCBjdXJyZW50W2NoYW5nZXNbaV1dLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBZb3UgbWlnaHQgYmUgd29uZGVyaW5nIHdoeSB0aGVyZSdzIGEgYHdoaWxlYCBsb29wIGhlcmUuIENoYW5nZXMgY2FuXG4gICAgICAvLyBiZSByZWN1cnNpdmVseSBuZXN0ZWQgd2l0aGluIGBcImNoYW5nZVwiYCBldmVudHMuXG4gICAgICBpZiAoY2hhbmdpbmcpIHJldHVybiB0aGlzO1xuICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuX3BlbmRpbmcpIHtcbiAgICAgICAgICBvcHRpb25zID0gdGhpcy5fcGVuZGluZztcbiAgICAgICAgICB0aGlzLl9wZW5kaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyKCdjaGFuZ2UnLCB0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fcGVuZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5fY2hhbmdpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvLyBSZW1vdmUgYW4gYXR0cmlidXRlIGZyb20gdGhlIG1vZGVsLCBmaXJpbmcgYFwiY2hhbmdlXCJgLiBgdW5zZXRgIGlzIGEgbm9vcFxuICAgIC8vIGlmIHRoZSBhdHRyaWJ1dGUgZG9lc24ndCBleGlzdC5cbiAgICB1bnNldDogZnVuY3Rpb24oYXR0ciwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0KGF0dHIsIHZvaWQgMCwgXy5leHRlbmQoe30sIG9wdGlvbnMsIHt1bnNldDogdHJ1ZX0pKTtcbiAgICB9LFxuXG4gICAgLy8gQ2xlYXIgYWxsIGF0dHJpYnV0ZXMgb24gdGhlIG1vZGVsLCBmaXJpbmcgYFwiY2hhbmdlXCJgLlxuICAgIGNsZWFyOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICB2YXIgYXR0cnMgPSB7fTtcbiAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmF0dHJpYnV0ZXMpIGF0dHJzW2tleV0gPSB2b2lkIDA7XG4gICAgICByZXR1cm4gdGhpcy5zZXQoYXR0cnMsIF8uZXh0ZW5kKHt9LCBvcHRpb25zLCB7dW5zZXQ6IHRydWV9KSk7XG4gICAgfSxcblxuICAgIC8vIERldGVybWluZSBpZiB0aGUgbW9kZWwgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgYFwiY2hhbmdlXCJgIGV2ZW50LlxuICAgIC8vIElmIHlvdSBzcGVjaWZ5IGFuIGF0dHJpYnV0ZSBuYW1lLCBkZXRlcm1pbmUgaWYgdGhhdCBhdHRyaWJ1dGUgaGFzIGNoYW5nZWQuXG4gICAgaGFzQ2hhbmdlZDogZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKGF0dHIgPT0gbnVsbCkgcmV0dXJuICFfLmlzRW1wdHkodGhpcy5jaGFuZ2VkKTtcbiAgICAgIHJldHVybiBfLmhhcyh0aGlzLmNoYW5nZWQsIGF0dHIpO1xuICAgIH0sXG5cbiAgICAvLyBSZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHRoZSBhdHRyaWJ1dGVzIHRoYXQgaGF2ZSBjaGFuZ2VkLCBvclxuICAgIC8vIGZhbHNlIGlmIHRoZXJlIGFyZSBubyBjaGFuZ2VkIGF0dHJpYnV0ZXMuIFVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgd2hhdFxuICAgIC8vIHBhcnRzIG9mIGEgdmlldyBuZWVkIHRvIGJlIHVwZGF0ZWQgYW5kL29yIHdoYXQgYXR0cmlidXRlcyBuZWVkIHRvIGJlXG4gICAgLy8gcGVyc2lzdGVkIHRvIHRoZSBzZXJ2ZXIuIFVuc2V0IGF0dHJpYnV0ZXMgd2lsbCBiZSBzZXQgdG8gdW5kZWZpbmVkLlxuICAgIC8vIFlvdSBjYW4gYWxzbyBwYXNzIGFuIGF0dHJpYnV0ZXMgb2JqZWN0IHRvIGRpZmYgYWdhaW5zdCB0aGUgbW9kZWwsXG4gICAgLy8gZGV0ZXJtaW5pbmcgaWYgdGhlcmUgKndvdWxkIGJlKiBhIGNoYW5nZS5cbiAgICBjaGFuZ2VkQXR0cmlidXRlczogZnVuY3Rpb24oZGlmZikge1xuICAgICAgaWYgKCFkaWZmKSByZXR1cm4gdGhpcy5oYXNDaGFuZ2VkKCkgPyBfLmNsb25lKHRoaXMuY2hhbmdlZCkgOiBmYWxzZTtcbiAgICAgIHZhciBvbGQgPSB0aGlzLl9jaGFuZ2luZyA/IHRoaXMuX3ByZXZpb3VzQXR0cmlidXRlcyA6IHRoaXMuYXR0cmlidXRlcztcbiAgICAgIHZhciBjaGFuZ2VkID0ge307XG4gICAgICBmb3IgKHZhciBhdHRyIGluIGRpZmYpIHtcbiAgICAgICAgdmFyIHZhbCA9IGRpZmZbYXR0cl07XG4gICAgICAgIGlmIChfLmlzRXF1YWwob2xkW2F0dHJdLCB2YWwpKSBjb250aW51ZTtcbiAgICAgICAgY2hhbmdlZFthdHRyXSA9IHZhbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfLnNpemUoY2hhbmdlZCkgPyBjaGFuZ2VkIDogZmFsc2U7XG4gICAgfSxcblxuICAgIC8vIEdldCB0aGUgcHJldmlvdXMgdmFsdWUgb2YgYW4gYXR0cmlidXRlLCByZWNvcmRlZCBhdCB0aGUgdGltZSB0aGUgbGFzdFxuICAgIC8vIGBcImNoYW5nZVwiYCBldmVudCB3YXMgZmlyZWQuXG4gICAgcHJldmlvdXM6IGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmIChhdHRyID09IG51bGwgfHwgIXRoaXMuX3ByZXZpb3VzQXR0cmlidXRlcykgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gdGhpcy5fcHJldmlvdXNBdHRyaWJ1dGVzW2F0dHJdO1xuICAgIH0sXG5cbiAgICAvLyBHZXQgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBtb2RlbCBhdCB0aGUgdGltZSBvZiB0aGUgcHJldmlvdXNcbiAgICAvLyBgXCJjaGFuZ2VcImAgZXZlbnQuXG4gICAgcHJldmlvdXNBdHRyaWJ1dGVzOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBfLmNsb25lKHRoaXMuX3ByZXZpb3VzQXR0cmlidXRlcyk7XG4gICAgfSxcblxuICAgIC8vIEZldGNoIHRoZSBtb2RlbCBmcm9tIHRoZSBzZXJ2ZXIsIG1lcmdpbmcgdGhlIHJlc3BvbnNlIHdpdGggdGhlIG1vZGVsJ3NcbiAgICAvLyBsb2NhbCBhdHRyaWJ1dGVzLiBBbnkgY2hhbmdlZCBhdHRyaWJ1dGVzIHdpbGwgdHJpZ2dlciBhIFwiY2hhbmdlXCIgZXZlbnQuXG4gICAgZmV0Y2g6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSBfLmV4dGVuZCh7cGFyc2U6IHRydWV9LCBvcHRpb25zKTtcbiAgICAgIHZhciBtb2RlbCA9IHRoaXM7XG4gICAgICB2YXIgc3VjY2VzcyA9IG9wdGlvbnMuc3VjY2VzcztcbiAgICAgIG9wdGlvbnMuc3VjY2VzcyA9IGZ1bmN0aW9uKHJlc3ApIHtcbiAgICAgICAgdmFyIHNlcnZlckF0dHJzID0gb3B0aW9ucy5wYXJzZSA/IG1vZGVsLnBhcnNlKHJlc3AsIG9wdGlvbnMpIDogcmVzcDtcbiAgICAgICAgaWYgKCFtb2RlbC5zZXQoc2VydmVyQXR0cnMsIG9wdGlvbnMpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChzdWNjZXNzKSBzdWNjZXNzLmNhbGwob3B0aW9ucy5jb250ZXh0LCBtb2RlbCwgcmVzcCwgb3B0aW9ucyk7XG4gICAgICAgIG1vZGVsLnRyaWdnZXIoJ3N5bmMnLCBtb2RlbCwgcmVzcCwgb3B0aW9ucyk7XG4gICAgICB9O1xuICAgICAgd3JhcEVycm9yKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHRoaXMuc3luYygncmVhZCcsIHRoaXMsIG9wdGlvbnMpO1xuICAgIH0sXG5cbiAgICAvLyBTZXQgYSBoYXNoIG9mIG1vZGVsIGF0dHJpYnV0ZXMsIGFuZCBzeW5jIHRoZSBtb2RlbCB0byB0aGUgc2VydmVyLlxuICAgIC8vIElmIHRoZSBzZXJ2ZXIgcmV0dXJucyBhbiBhdHRyaWJ1dGVzIGhhc2ggdGhhdCBkaWZmZXJzLCB0aGUgbW9kZWwnc1xuICAgIC8vIHN0YXRlIHdpbGwgYmUgYHNldGAgYWdhaW4uXG4gICAgc2F2ZTogZnVuY3Rpb24oa2V5LCB2YWwsIG9wdGlvbnMpIHtcbiAgICAgIC8vIEhhbmRsZSBib3RoIGBcImtleVwiLCB2YWx1ZWAgYW5kIGB7a2V5OiB2YWx1ZX1gIC1zdHlsZSBhcmd1bWVudHMuXG4gICAgICB2YXIgYXR0cnM7XG4gICAgICBpZiAoa2V5ID09IG51bGwgfHwgdHlwZW9mIGtleSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYXR0cnMgPSBrZXk7XG4gICAgICAgIG9wdGlvbnMgPSB2YWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAoYXR0cnMgPSB7fSlba2V5XSA9IHZhbDtcbiAgICAgIH1cblxuICAgICAgb3B0aW9ucyA9IF8uZXh0ZW5kKHt2YWxpZGF0ZTogdHJ1ZSwgcGFyc2U6IHRydWV9LCBvcHRpb25zKTtcbiAgICAgIHZhciB3YWl0ID0gb3B0aW9ucy53YWl0O1xuXG4gICAgICAvLyBJZiB3ZSdyZSBub3Qgd2FpdGluZyBhbmQgYXR0cmlidXRlcyBleGlzdCwgc2F2ZSBhY3RzIGFzXG4gICAgICAvLyBgc2V0KGF0dHIpLnNhdmUobnVsbCwgb3B0cylgIHdpdGggdmFsaWRhdGlvbi4gT3RoZXJ3aXNlLCBjaGVjayBpZlxuICAgICAgLy8gdGhlIG1vZGVsIHdpbGwgYmUgdmFsaWQgd2hlbiB0aGUgYXR0cmlidXRlcywgaWYgYW55LCBhcmUgc2V0LlxuICAgICAgaWYgKGF0dHJzICYmICF3YWl0KSB7XG4gICAgICAgIGlmICghdGhpcy5zZXQoYXR0cnMsIG9wdGlvbnMpKSByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLl92YWxpZGF0ZShhdHRycywgb3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBBZnRlciBhIHN1Y2Nlc3NmdWwgc2VydmVyLXNpZGUgc2F2ZSwgdGhlIGNsaWVudCBpcyAob3B0aW9uYWxseSlcbiAgICAgIC8vIHVwZGF0ZWQgd2l0aCB0aGUgc2VydmVyLXNpZGUgc3RhdGUuXG4gICAgICB2YXIgbW9kZWwgPSB0aGlzO1xuICAgICAgdmFyIHN1Y2Nlc3MgPSBvcHRpb25zLnN1Y2Nlc3M7XG4gICAgICB2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcbiAgICAgIG9wdGlvbnMuc3VjY2VzcyA9IGZ1bmN0aW9uKHJlc3ApIHtcbiAgICAgICAgLy8gRW5zdXJlIGF0dHJpYnV0ZXMgYXJlIHJlc3RvcmVkIGR1cmluZyBzeW5jaHJvbm91cyBzYXZlcy5cbiAgICAgICAgbW9kZWwuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG4gICAgICAgIHZhciBzZXJ2ZXJBdHRycyA9IG9wdGlvbnMucGFyc2UgPyBtb2RlbC5wYXJzZShyZXNwLCBvcHRpb25zKSA6IHJlc3A7XG4gICAgICAgIGlmICh3YWl0KSBzZXJ2ZXJBdHRycyA9IF8uZXh0ZW5kKHt9LCBhdHRycywgc2VydmVyQXR0cnMpO1xuICAgICAgICBpZiAoc2VydmVyQXR0cnMgJiYgIW1vZGVsLnNldChzZXJ2ZXJBdHRycywgb3B0aW9ucykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHN1Y2Nlc3MuY2FsbChvcHRpb25zLmNvbnRleHQsIG1vZGVsLCByZXNwLCBvcHRpb25zKTtcbiAgICAgICAgbW9kZWwudHJpZ2dlcignc3luYycsIG1vZGVsLCByZXNwLCBvcHRpb25zKTtcbiAgICAgIH07XG4gICAgICB3cmFwRXJyb3IodGhpcywgb3B0aW9ucyk7XG5cbiAgICAgIC8vIFNldCB0ZW1wb3JhcnkgYXR0cmlidXRlcyBpZiBge3dhaXQ6IHRydWV9YCB0byBwcm9wZXJseSBmaW5kIG5ldyBpZHMuXG4gICAgICBpZiAoYXR0cnMgJiYgd2FpdCkgdGhpcy5hdHRyaWJ1dGVzID0gXy5leHRlbmQoe30sIGF0dHJpYnV0ZXMsIGF0dHJzKTtcblxuICAgICAgdmFyIG1ldGhvZCA9IHRoaXMuaXNOZXcoKSA/ICdjcmVhdGUnIDogKG9wdGlvbnMucGF0Y2ggPyAncGF0Y2gnIDogJ3VwZGF0ZScpO1xuICAgICAgaWYgKG1ldGhvZCA9PT0gJ3BhdGNoJyAmJiAhb3B0aW9ucy5hdHRycykgb3B0aW9ucy5hdHRycyA9IGF0dHJzO1xuICAgICAgdmFyIHhociA9IHRoaXMuc3luYyhtZXRob2QsIHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgICAvLyBSZXN0b3JlIGF0dHJpYnV0ZXMuXG4gICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuXG4gICAgICByZXR1cm4geGhyO1xuICAgIH0sXG5cbiAgICAvLyBEZXN0cm95IHRoaXMgbW9kZWwgb24gdGhlIHNlcnZlciBpZiBpdCB3YXMgYWxyZWFkeSBwZXJzaXN0ZWQuXG4gICAgLy8gT3B0aW1pc3RpY2FsbHkgcmVtb3ZlcyB0aGUgbW9kZWwgZnJvbSBpdHMgY29sbGVjdGlvbiwgaWYgaXQgaGFzIG9uZS5cbiAgICAvLyBJZiBgd2FpdDogdHJ1ZWAgaXMgcGFzc2VkLCB3YWl0cyBmb3IgdGhlIHNlcnZlciB0byByZXNwb25kIGJlZm9yZSByZW1vdmFsLlxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zID8gXy5jbG9uZShvcHRpb25zKSA6IHt9O1xuICAgICAgdmFyIG1vZGVsID0gdGhpcztcbiAgICAgIHZhciBzdWNjZXNzID0gb3B0aW9ucy5zdWNjZXNzO1xuICAgICAgdmFyIHdhaXQgPSBvcHRpb25zLndhaXQ7XG5cbiAgICAgIHZhciBkZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIG1vZGVsLnN0b3BMaXN0ZW5pbmcoKTtcbiAgICAgICAgbW9kZWwudHJpZ2dlcignZGVzdHJveScsIG1vZGVsLCBtb2RlbC5jb2xsZWN0aW9uLCBvcHRpb25zKTtcbiAgICAgIH07XG5cbiAgICAgIG9wdGlvbnMuc3VjY2VzcyA9IGZ1bmN0aW9uKHJlc3ApIHtcbiAgICAgICAgaWYgKHdhaXQpIGRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHN1Y2Nlc3MuY2FsbChvcHRpb25zLmNvbnRleHQsIG1vZGVsLCByZXNwLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKCFtb2RlbC5pc05ldygpKSBtb2RlbC50cmlnZ2VyKCdzeW5jJywgbW9kZWwsIHJlc3AsIG9wdGlvbnMpO1xuICAgICAgfTtcblxuICAgICAgdmFyIHhociA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuaXNOZXcoKSkge1xuICAgICAgICBfLmRlZmVyKG9wdGlvbnMuc3VjY2Vzcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3cmFwRXJyb3IodGhpcywgb3B0aW9ucyk7XG4gICAgICAgIHhociA9IHRoaXMuc3luYygnZGVsZXRlJywgdGhpcywgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgICBpZiAoIXdhaXQpIGRlc3Ryb3koKTtcbiAgICAgIHJldHVybiB4aHI7XG4gICAgfSxcblxuICAgIC8vIERlZmF1bHQgVVJMIGZvciB0aGUgbW9kZWwncyByZXByZXNlbnRhdGlvbiBvbiB0aGUgc2VydmVyIC0tIGlmIHlvdSdyZVxuICAgIC8vIHVzaW5nIEJhY2tib25lJ3MgcmVzdGZ1bCBtZXRob2RzLCBvdmVycmlkZSB0aGlzIHRvIGNoYW5nZSB0aGUgZW5kcG9pbnRcbiAgICAvLyB0aGF0IHdpbGwgYmUgY2FsbGVkLlxuICAgIHVybDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYmFzZSA9XG4gICAgICAgIF8ucmVzdWx0KHRoaXMsICd1cmxSb290JykgfHxcbiAgICAgICAgXy5yZXN1bHQodGhpcy5jb2xsZWN0aW9uLCAndXJsJykgfHxcbiAgICAgICAgdXJsRXJyb3IoKTtcbiAgICAgIGlmICh0aGlzLmlzTmV3KCkpIHJldHVybiBiYXNlO1xuICAgICAgdmFyIGlkID0gdGhpcy5nZXQodGhpcy5pZEF0dHJpYnV0ZSk7XG4gICAgICByZXR1cm4gYmFzZS5yZXBsYWNlKC9bXlxcL10kLywgJyQmLycpICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkKTtcbiAgICB9LFxuXG4gICAgLy8gKipwYXJzZSoqIGNvbnZlcnRzIGEgcmVzcG9uc2UgaW50byB0aGUgaGFzaCBvZiBhdHRyaWJ1dGVzIHRvIGJlIGBzZXRgIG9uXG4gICAgLy8gdGhlIG1vZGVsLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBqdXN0IHRvIHBhc3MgdGhlIHJlc3BvbnNlIGFsb25nLlxuICAgIHBhcnNlOiBmdW5jdGlvbihyZXNwLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gcmVzcDtcbiAgICB9LFxuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IG1vZGVsIHdpdGggaWRlbnRpY2FsIGF0dHJpYnV0ZXMgdG8gdGhpcyBvbmUuXG4gICAgY2xvbmU6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuYXR0cmlidXRlcyk7XG4gICAgfSxcblxuICAgIC8vIEEgbW9kZWwgaXMgbmV3IGlmIGl0IGhhcyBuZXZlciBiZWVuIHNhdmVkIHRvIHRoZSBzZXJ2ZXIsIGFuZCBsYWNrcyBhbiBpZC5cbiAgICBpc05ldzogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gIXRoaXMuaGFzKHRoaXMuaWRBdHRyaWJ1dGUpO1xuICAgIH0sXG5cbiAgICAvLyBDaGVjayBpZiB0aGUgbW9kZWwgaXMgY3VycmVudGx5IGluIGEgdmFsaWQgc3RhdGUuXG4gICAgaXNWYWxpZDogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlKHt9LCBfLmV4dGVuZCh7fSwgb3B0aW9ucywge3ZhbGlkYXRlOiB0cnVlfSkpO1xuICAgIH0sXG5cbiAgICAvLyBSdW4gdmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBuZXh0IGNvbXBsZXRlIHNldCBvZiBtb2RlbCBhdHRyaWJ1dGVzLFxuICAgIC8vIHJldHVybmluZyBgdHJ1ZWAgaWYgYWxsIGlzIHdlbGwuIE90aGVyd2lzZSwgZmlyZSBhbiBgXCJpbnZhbGlkXCJgIGV2ZW50LlxuICAgIF92YWxpZGF0ZTogZnVuY3Rpb24oYXR0cnMsIG9wdGlvbnMpIHtcbiAgICAgIGlmICghb3B0aW9ucy52YWxpZGF0ZSB8fCAhdGhpcy52YWxpZGF0ZSkgcmV0dXJuIHRydWU7XG4gICAgICBhdHRycyA9IF8uZXh0ZW5kKHt9LCB0aGlzLmF0dHJpYnV0ZXMsIGF0dHJzKTtcbiAgICAgIHZhciBlcnJvciA9IHRoaXMudmFsaWRhdGlvbkVycm9yID0gdGhpcy52YWxpZGF0ZShhdHRycywgb3B0aW9ucykgfHwgbnVsbDtcbiAgICAgIGlmICghZXJyb3IpIHJldHVybiB0cnVlO1xuICAgICAgdGhpcy50cmlnZ2VyKCdpbnZhbGlkJywgdGhpcywgZXJyb3IsIF8uZXh0ZW5kKG9wdGlvbnMsIHt2YWxpZGF0aW9uRXJyb3I6IGVycm9yfSkpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICB9KTtcblxuICAvLyBVbmRlcnNjb3JlIG1ldGhvZHMgdGhhdCB3ZSB3YW50IHRvIGltcGxlbWVudCBvbiB0aGUgTW9kZWwsIG1hcHBlZCB0byB0aGVcbiAgLy8gbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGV5IHRha2UuXG4gIHZhciBtb2RlbE1ldGhvZHMgPSB7a2V5czogMSwgdmFsdWVzOiAxLCBwYWlyczogMSwgaW52ZXJ0OiAxLCBwaWNrOiAwLFxuICAgICAgb21pdDogMCwgY2hhaW46IDEsIGlzRW1wdHk6IDF9O1xuXG4gIC8vIE1peCBpbiBlYWNoIFVuZGVyc2NvcmUgbWV0aG9kIGFzIGEgcHJveHkgdG8gYE1vZGVsI2F0dHJpYnV0ZXNgLlxuICBhZGRVbmRlcnNjb3JlTWV0aG9kcyhNb2RlbCwgbW9kZWxNZXRob2RzLCAnYXR0cmlidXRlcycpO1xuXG4gIC8vIEJhY2tib25lLkNvbGxlY3Rpb25cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIElmIG1vZGVscyB0ZW5kIHRvIHJlcHJlc2VudCBhIHNpbmdsZSByb3cgb2YgZGF0YSwgYSBCYWNrYm9uZSBDb2xsZWN0aW9uIGlzXG4gIC8vIG1vcmUgYW5hbG9nb3VzIHRvIGEgdGFibGUgZnVsbCBvZiBkYXRhIC4uLiBvciBhIHNtYWxsIHNsaWNlIG9yIHBhZ2Ugb2YgdGhhdFxuICAvLyB0YWJsZSwgb3IgYSBjb2xsZWN0aW9uIG9mIHJvd3MgdGhhdCBiZWxvbmcgdG9nZXRoZXIgZm9yIGEgcGFydGljdWxhciByZWFzb25cbiAgLy8gLS0gYWxsIG9mIHRoZSBtZXNzYWdlcyBpbiB0aGlzIHBhcnRpY3VsYXIgZm9sZGVyLCBhbGwgb2YgdGhlIGRvY3VtZW50c1xuICAvLyBiZWxvbmdpbmcgdG8gdGhpcyBwYXJ0aWN1bGFyIGF1dGhvciwgYW5kIHNvIG9uLiBDb2xsZWN0aW9ucyBtYWludGFpblxuICAvLyBpbmRleGVzIG9mIHRoZWlyIG1vZGVscywgYm90aCBpbiBvcmRlciwgYW5kIGZvciBsb29rdXAgYnkgYGlkYC5cblxuICAvLyBDcmVhdGUgYSBuZXcgKipDb2xsZWN0aW9uKiosIHBlcmhhcHMgdG8gY29udGFpbiBhIHNwZWNpZmljIHR5cGUgb2YgYG1vZGVsYC5cbiAgLy8gSWYgYSBgY29tcGFyYXRvcmAgaXMgc3BlY2lmaWVkLCB0aGUgQ29sbGVjdGlvbiB3aWxsIG1haW50YWluXG4gIC8vIGl0cyBtb2RlbHMgaW4gc29ydCBvcmRlciwgYXMgdGhleSdyZSBhZGRlZCBhbmQgcmVtb3ZlZC5cbiAgdmFyIENvbGxlY3Rpb24gPSBCYWNrYm9uZS5Db2xsZWN0aW9uID0gZnVuY3Rpb24obW9kZWxzLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcbiAgICBpZiAob3B0aW9ucy5tb2RlbCkgdGhpcy5tb2RlbCA9IG9wdGlvbnMubW9kZWw7XG4gICAgaWYgKG9wdGlvbnMuY29tcGFyYXRvciAhPT0gdm9pZCAwKSB0aGlzLmNvbXBhcmF0b3IgPSBvcHRpb25zLmNvbXBhcmF0b3I7XG4gICAgdGhpcy5fcmVzZXQoKTtcbiAgICB0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAobW9kZWxzKSB0aGlzLnJlc2V0KG1vZGVscywgXy5leHRlbmQoe3NpbGVudDogdHJ1ZX0sIG9wdGlvbnMpKTtcbiAgfTtcblxuICAvLyBEZWZhdWx0IG9wdGlvbnMgZm9yIGBDb2xsZWN0aW9uI3NldGAuXG4gIHZhciBzZXRPcHRpb25zID0ge2FkZDogdHJ1ZSwgcmVtb3ZlOiB0cnVlLCBtZXJnZTogdHJ1ZX07XG4gIHZhciBhZGRPcHRpb25zID0ge2FkZDogdHJ1ZSwgcmVtb3ZlOiBmYWxzZX07XG5cbiAgLy8gU3BsaWNlcyBgaW5zZXJ0YCBpbnRvIGBhcnJheWAgYXQgaW5kZXggYGF0YC5cbiAgdmFyIHNwbGljZSA9IGZ1bmN0aW9uKGFycmF5LCBpbnNlcnQsIGF0KSB7XG4gICAgYXQgPSBNYXRoLm1pbihNYXRoLm1heChhdCwgMCksIGFycmF5Lmxlbmd0aCk7XG4gICAgdmFyIHRhaWwgPSBBcnJheShhcnJheS5sZW5ndGggLSBhdCk7XG4gICAgdmFyIGxlbmd0aCA9IGluc2VydC5sZW5ndGg7XG4gICAgdmFyIGk7XG4gICAgZm9yIChpID0gMDsgaSA8IHRhaWwubGVuZ3RoOyBpKyspIHRhaWxbaV0gPSBhcnJheVtpICsgYXRdO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgYXJyYXlbaSArIGF0XSA9IGluc2VydFtpXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGFpbC5sZW5ndGg7IGkrKykgYXJyYXlbaSArIGxlbmd0aCArIGF0XSA9IHRhaWxbaV07XG4gIH07XG5cbiAgLy8gRGVmaW5lIHRoZSBDb2xsZWN0aW9uJ3MgaW5oZXJpdGFibGUgbWV0aG9kcy5cbiAgXy5leHRlbmQoQ29sbGVjdGlvbi5wcm90b3R5cGUsIEV2ZW50cywge1xuXG4gICAgLy8gVGhlIGRlZmF1bHQgbW9kZWwgZm9yIGEgY29sbGVjdGlvbiBpcyBqdXN0IGEgKipCYWNrYm9uZS5Nb2RlbCoqLlxuICAgIC8vIFRoaXMgc2hvdWxkIGJlIG92ZXJyaWRkZW4gaW4gbW9zdCBjYXNlcy5cbiAgICBtb2RlbDogTW9kZWwsXG5cbiAgICAvLyBJbml0aWFsaXplIGlzIGFuIGVtcHR5IGZ1bmN0aW9uIGJ5IGRlZmF1bHQuIE92ZXJyaWRlIGl0IHdpdGggeW91ciBvd25cbiAgICAvLyBpbml0aWFsaXphdGlvbiBsb2dpYy5cbiAgICBpbml0aWFsaXplOiBmdW5jdGlvbigpe30sXG5cbiAgICAvLyBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBhIENvbGxlY3Rpb24gaXMgYW4gYXJyYXkgb2YgdGhlXG4gICAgLy8gbW9kZWxzJyBhdHRyaWJ1dGVzLlxuICAgIHRvSlNPTjogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKG1vZGVsKSB7IHJldHVybiBtb2RlbC50b0pTT04ob3B0aW9ucyk7IH0pO1xuICAgIH0sXG5cbiAgICAvLyBQcm94eSBgQmFja2JvbmUuc3luY2AgYnkgZGVmYXVsdC5cbiAgICBzeW5jOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBCYWNrYm9uZS5zeW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcblxuICAgIC8vIEFkZCBhIG1vZGVsLCBvciBsaXN0IG9mIG1vZGVscyB0byB0aGUgc2V0LiBgbW9kZWxzYCBtYXkgYmUgQmFja2JvbmVcbiAgICAvLyBNb2RlbHMgb3IgcmF3IEphdmFTY3JpcHQgb2JqZWN0cyB0byBiZSBjb252ZXJ0ZWQgdG8gTW9kZWxzLCBvciBhbnlcbiAgICAvLyBjb21iaW5hdGlvbiBvZiB0aGUgdHdvLlxuICAgIGFkZDogZnVuY3Rpb24obW9kZWxzLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXQobW9kZWxzLCBfLmV4dGVuZCh7bWVyZ2U6IGZhbHNlfSwgb3B0aW9ucywgYWRkT3B0aW9ucykpO1xuICAgIH0sXG5cbiAgICAvLyBSZW1vdmUgYSBtb2RlbCwgb3IgYSBsaXN0IG9mIG1vZGVscyBmcm9tIHRoZSBzZXQuXG4gICAgcmVtb3ZlOiBmdW5jdGlvbihtb2RlbHMsIG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSBfLmV4dGVuZCh7fSwgb3B0aW9ucyk7XG4gICAgICB2YXIgc2luZ3VsYXIgPSAhXy5pc0FycmF5KG1vZGVscyk7XG4gICAgICBtb2RlbHMgPSBzaW5ndWxhciA/IFttb2RlbHNdIDogbW9kZWxzLnNsaWNlKCk7XG4gICAgICB2YXIgcmVtb3ZlZCA9IHRoaXMuX3JlbW92ZU1vZGVscyhtb2RlbHMsIG9wdGlvbnMpO1xuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCAmJiByZW1vdmVkLmxlbmd0aCkge1xuICAgICAgICBvcHRpb25zLmNoYW5nZXMgPSB7YWRkZWQ6IFtdLCBtZXJnZWQ6IFtdLCByZW1vdmVkOiByZW1vdmVkfTtcbiAgICAgICAgdGhpcy50cmlnZ2VyKCd1cGRhdGUnLCB0aGlzLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzaW5ndWxhciA/IHJlbW92ZWRbMF0gOiByZW1vdmVkO1xuICAgIH0sXG5cbiAgICAvLyBVcGRhdGUgYSBjb2xsZWN0aW9uIGJ5IGBzZXRgLWluZyBhIG5ldyBsaXN0IG9mIG1vZGVscywgYWRkaW5nIG5ldyBvbmVzLFxuICAgIC8vIHJlbW92aW5nIG1vZGVscyB0aGF0IGFyZSBubyBsb25nZXIgcHJlc2VudCwgYW5kIG1lcmdpbmcgbW9kZWxzIHRoYXRcbiAgICAvLyBhbHJlYWR5IGV4aXN0IGluIHRoZSBjb2xsZWN0aW9uLCBhcyBuZWNlc3NhcnkuIFNpbWlsYXIgdG8gKipNb2RlbCNzZXQqKixcbiAgICAvLyB0aGUgY29yZSBvcGVyYXRpb24gZm9yIHVwZGF0aW5nIHRoZSBkYXRhIGNvbnRhaW5lZCBieSB0aGUgY29sbGVjdGlvbi5cbiAgICBzZXQ6IGZ1bmN0aW9uKG1vZGVscywgb3B0aW9ucykge1xuICAgICAgaWYgKG1vZGVscyA9PSBudWxsKSByZXR1cm47XG5cbiAgICAgIG9wdGlvbnMgPSBfLmV4dGVuZCh7fSwgc2V0T3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICBpZiAob3B0aW9ucy5wYXJzZSAmJiAhdGhpcy5faXNNb2RlbChtb2RlbHMpKSB7XG4gICAgICAgIG1vZGVscyA9IHRoaXMucGFyc2UobW9kZWxzLCBvcHRpb25zKSB8fCBbXTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNpbmd1bGFyID0gIV8uaXNBcnJheShtb2RlbHMpO1xuICAgICAgbW9kZWxzID0gc2luZ3VsYXIgPyBbbW9kZWxzXSA6IG1vZGVscy5zbGljZSgpO1xuXG4gICAgICB2YXIgYXQgPSBvcHRpb25zLmF0O1xuICAgICAgaWYgKGF0ICE9IG51bGwpIGF0ID0gK2F0O1xuICAgICAgaWYgKGF0ID4gdGhpcy5sZW5ndGgpIGF0ID0gdGhpcy5sZW5ndGg7XG4gICAgICBpZiAoYXQgPCAwKSBhdCArPSB0aGlzLmxlbmd0aCArIDE7XG5cbiAgICAgIHZhciBzZXQgPSBbXTtcbiAgICAgIHZhciB0b0FkZCA9IFtdO1xuICAgICAgdmFyIHRvTWVyZ2UgPSBbXTtcbiAgICAgIHZhciB0b1JlbW92ZSA9IFtdO1xuICAgICAgdmFyIG1vZGVsTWFwID0ge307XG5cbiAgICAgIHZhciBhZGQgPSBvcHRpb25zLmFkZDtcbiAgICAgIHZhciBtZXJnZSA9IG9wdGlvbnMubWVyZ2U7XG4gICAgICB2YXIgcmVtb3ZlID0gb3B0aW9ucy5yZW1vdmU7XG5cbiAgICAgIHZhciBzb3J0ID0gZmFsc2U7XG4gICAgICB2YXIgc29ydGFibGUgPSB0aGlzLmNvbXBhcmF0b3IgJiYgYXQgPT0gbnVsbCAmJiBvcHRpb25zLnNvcnQgIT09IGZhbHNlO1xuICAgICAgdmFyIHNvcnRBdHRyID0gXy5pc1N0cmluZyh0aGlzLmNvbXBhcmF0b3IpID8gdGhpcy5jb21wYXJhdG9yIDogbnVsbDtcblxuICAgICAgLy8gVHVybiBiYXJlIG9iamVjdHMgaW50byBtb2RlbCByZWZlcmVuY2VzLCBhbmQgcHJldmVudCBpbnZhbGlkIG1vZGVsc1xuICAgICAgLy8gZnJvbSBiZWluZyBhZGRlZC5cbiAgICAgIHZhciBtb2RlbCwgaTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBtb2RlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbW9kZWwgPSBtb2RlbHNbaV07XG5cbiAgICAgICAgLy8gSWYgYSBkdXBsaWNhdGUgaXMgZm91bmQsIHByZXZlbnQgaXQgZnJvbSBiZWluZyBhZGRlZCBhbmRcbiAgICAgICAgLy8gb3B0aW9uYWxseSBtZXJnZSBpdCBpbnRvIHRoZSBleGlzdGluZyBtb2RlbC5cbiAgICAgICAgdmFyIGV4aXN0aW5nID0gdGhpcy5nZXQobW9kZWwpO1xuICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICBpZiAobWVyZ2UgJiYgbW9kZWwgIT09IGV4aXN0aW5nKSB7XG4gICAgICAgICAgICB2YXIgYXR0cnMgPSB0aGlzLl9pc01vZGVsKG1vZGVsKSA/IG1vZGVsLmF0dHJpYnV0ZXMgOiBtb2RlbDtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnBhcnNlKSBhdHRycyA9IGV4aXN0aW5nLnBhcnNlKGF0dHJzLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGV4aXN0aW5nLnNldChhdHRycywgb3B0aW9ucyk7XG4gICAgICAgICAgICB0b01lcmdlLnB1c2goZXhpc3RpbmcpO1xuICAgICAgICAgICAgaWYgKHNvcnRhYmxlICYmICFzb3J0KSBzb3J0ID0gZXhpc3RpbmcuaGFzQ2hhbmdlZChzb3J0QXR0cik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghbW9kZWxNYXBbZXhpc3RpbmcuY2lkXSkge1xuICAgICAgICAgICAgbW9kZWxNYXBbZXhpc3RpbmcuY2lkXSA9IHRydWU7XG4gICAgICAgICAgICBzZXQucHVzaChleGlzdGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1vZGVsc1tpXSA9IGV4aXN0aW5nO1xuXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBuZXcsIHZhbGlkIG1vZGVsLCBwdXNoIGl0IHRvIHRoZSBgdG9BZGRgIGxpc3QuXG4gICAgICAgIH0gZWxzZSBpZiAoYWRkKSB7XG4gICAgICAgICAgbW9kZWwgPSBtb2RlbHNbaV0gPSB0aGlzLl9wcmVwYXJlTW9kZWwobW9kZWwsIG9wdGlvbnMpO1xuICAgICAgICAgIGlmIChtb2RlbCkge1xuICAgICAgICAgICAgdG9BZGQucHVzaChtb2RlbCk7XG4gICAgICAgICAgICB0aGlzLl9hZGRSZWZlcmVuY2UobW9kZWwsIG9wdGlvbnMpO1xuICAgICAgICAgICAgbW9kZWxNYXBbbW9kZWwuY2lkXSA9IHRydWU7XG4gICAgICAgICAgICBzZXQucHVzaChtb2RlbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSBzdGFsZSBtb2RlbHMuXG4gICAgICBpZiAocmVtb3ZlKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgbW9kZWwgPSB0aGlzLm1vZGVsc1tpXTtcbiAgICAgICAgICBpZiAoIW1vZGVsTWFwW21vZGVsLmNpZF0pIHRvUmVtb3ZlLnB1c2gobW9kZWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b1JlbW92ZS5sZW5ndGgpIHRoaXMuX3JlbW92ZU1vZGVscyh0b1JlbW92ZSwgb3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNlZSBpZiBzb3J0aW5nIGlzIG5lZWRlZCwgdXBkYXRlIGBsZW5ndGhgIGFuZCBzcGxpY2UgaW4gbmV3IG1vZGVscy5cbiAgICAgIHZhciBvcmRlckNoYW5nZWQgPSBmYWxzZTtcbiAgICAgIHZhciByZXBsYWNlID0gIXNvcnRhYmxlICYmIGFkZCAmJiByZW1vdmU7XG4gICAgICBpZiAoc2V0Lmxlbmd0aCAmJiByZXBsYWNlKSB7XG4gICAgICAgIG9yZGVyQ2hhbmdlZCA9IHRoaXMubGVuZ3RoICE9PSBzZXQubGVuZ3RoIHx8IF8uc29tZSh0aGlzLm1vZGVscywgZnVuY3Rpb24obSwgaW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gbSAhPT0gc2V0W2luZGV4XTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubW9kZWxzLmxlbmd0aCA9IDA7XG4gICAgICAgIHNwbGljZSh0aGlzLm1vZGVscywgc2V0LCAwKTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLm1vZGVscy5sZW5ndGg7XG4gICAgICB9IGVsc2UgaWYgKHRvQWRkLmxlbmd0aCkge1xuICAgICAgICBpZiAoc29ydGFibGUpIHNvcnQgPSB0cnVlO1xuICAgICAgICBzcGxpY2UodGhpcy5tb2RlbHMsIHRvQWRkLCBhdCA9PSBudWxsID8gdGhpcy5sZW5ndGggOiBhdCk7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5tb2RlbHMubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICAvLyBTaWxlbnRseSBzb3J0IHRoZSBjb2xsZWN0aW9uIGlmIGFwcHJvcHJpYXRlLlxuICAgICAgaWYgKHNvcnQpIHRoaXMuc29ydCh7c2lsZW50OiB0cnVlfSk7XG5cbiAgICAgIC8vIFVubGVzcyBzaWxlbmNlZCwgaXQncyB0aW1lIHRvIGZpcmUgYWxsIGFwcHJvcHJpYXRlIGFkZC9zb3J0L3VwZGF0ZSBldmVudHMuXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b0FkZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChhdCAhPSBudWxsKSBvcHRpb25zLmluZGV4ID0gYXQgKyBpO1xuICAgICAgICAgIG1vZGVsID0gdG9BZGRbaV07XG4gICAgICAgICAgbW9kZWwudHJpZ2dlcignYWRkJywgbW9kZWwsIHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3J0IHx8IG9yZGVyQ2hhbmdlZCkgdGhpcy50cmlnZ2VyKCdzb3J0JywgdGhpcywgb3B0aW9ucyk7XG4gICAgICAgIGlmICh0b0FkZC5sZW5ndGggfHwgdG9SZW1vdmUubGVuZ3RoIHx8IHRvTWVyZ2UubGVuZ3RoKSB7XG4gICAgICAgICAgb3B0aW9ucy5jaGFuZ2VzID0ge1xuICAgICAgICAgICAgYWRkZWQ6IHRvQWRkLFxuICAgICAgICAgICAgcmVtb3ZlZDogdG9SZW1vdmUsXG4gICAgICAgICAgICBtZXJnZWQ6IHRvTWVyZ2VcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMudHJpZ2dlcigndXBkYXRlJywgdGhpcywgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmV0dXJuIHRoZSBhZGRlZCAob3IgbWVyZ2VkKSBtb2RlbCAob3IgbW9kZWxzKS5cbiAgICAgIHJldHVybiBzaW5ndWxhciA/IG1vZGVsc1swXSA6IG1vZGVscztcbiAgICB9LFxuXG4gICAgLy8gV2hlbiB5b3UgaGF2ZSBtb3JlIGl0ZW1zIHRoYW4geW91IHdhbnQgdG8gYWRkIG9yIHJlbW92ZSBpbmRpdmlkdWFsbHksXG4gICAgLy8geW91IGNhbiByZXNldCB0aGUgZW50aXJlIHNldCB3aXRoIGEgbmV3IGxpc3Qgb2YgbW9kZWxzLCB3aXRob3V0IGZpcmluZ1xuICAgIC8vIGFueSBncmFudWxhciBgYWRkYCBvciBgcmVtb3ZlYCBldmVudHMuIEZpcmVzIGByZXNldGAgd2hlbiBmaW5pc2hlZC5cbiAgICAvLyBVc2VmdWwgZm9yIGJ1bGsgb3BlcmF0aW9ucyBhbmQgb3B0aW1pemF0aW9ucy5cbiAgICByZXNldDogZnVuY3Rpb24obW9kZWxzLCBvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyA/IF8uY2xvbmUob3B0aW9ucykgOiB7fTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5tb2RlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5fcmVtb3ZlUmVmZXJlbmNlKHRoaXMubW9kZWxzW2ldLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMucHJldmlvdXNNb2RlbHMgPSB0aGlzLm1vZGVscztcbiAgICAgIHRoaXMuX3Jlc2V0KCk7XG4gICAgICBtb2RlbHMgPSB0aGlzLmFkZChtb2RlbHMsIF8uZXh0ZW5kKHtzaWxlbnQ6IHRydWV9LCBvcHRpb25zKSk7XG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB0aGlzLnRyaWdnZXIoJ3Jlc2V0JywgdGhpcywgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gbW9kZWxzO1xuICAgIH0sXG5cbiAgICAvLyBBZGQgYSBtb2RlbCB0byB0aGUgZW5kIG9mIHRoZSBjb2xsZWN0aW9uLlxuICAgIHB1c2g6IGZ1bmN0aW9uKG1vZGVsLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGQobW9kZWwsIF8uZXh0ZW5kKHthdDogdGhpcy5sZW5ndGh9LCBvcHRpb25zKSk7XG4gICAgfSxcblxuICAgIC8vIFJlbW92ZSBhIG1vZGVsIGZyb20gdGhlIGVuZCBvZiB0aGUgY29sbGVjdGlvbi5cbiAgICBwb3A6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIHZhciBtb2RlbCA9IHRoaXMuYXQodGhpcy5sZW5ndGggLSAxKTtcbiAgICAgIHJldHVybiB0aGlzLnJlbW92ZShtb2RlbCwgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIC8vIEFkZCBhIG1vZGVsIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbGxlY3Rpb24uXG4gICAgdW5zaGlmdDogZnVuY3Rpb24obW9kZWwsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkZChtb2RlbCwgXy5leHRlbmQoe2F0OiAwfSwgb3B0aW9ucykpO1xuICAgIH0sXG5cbiAgICAvLyBSZW1vdmUgYSBtb2RlbCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbGxlY3Rpb24uXG4gICAgc2hpZnQ6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIHZhciBtb2RlbCA9IHRoaXMuYXQoMCk7XG4gICAgICByZXR1cm4gdGhpcy5yZW1vdmUobW9kZWwsIG9wdGlvbnMpO1xuICAgIH0sXG5cbiAgICAvLyBTbGljZSBvdXQgYSBzdWItYXJyYXkgb2YgbW9kZWxzIGZyb20gdGhlIGNvbGxlY3Rpb24uXG4gICAgc2xpY2U6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHNsaWNlLmFwcGx5KHRoaXMubW9kZWxzLCBhcmd1bWVudHMpO1xuICAgIH0sXG5cbiAgICAvLyBHZXQgYSBtb2RlbCBmcm9tIHRoZSBzZXQgYnkgaWQsIGNpZCwgbW9kZWwgb2JqZWN0IHdpdGggaWQgb3IgY2lkXG4gICAgLy8gcHJvcGVydGllcywgb3IgYW4gYXR0cmlidXRlcyBvYmplY3QgdGhhdCBpcyB0cmFuc2Zvcm1lZCB0aHJvdWdoIG1vZGVsSWQuXG4gICAgZ2V0OiBmdW5jdGlvbihvYmopIHtcbiAgICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIHZvaWQgMDtcbiAgICAgIHJldHVybiB0aGlzLl9ieUlkW29ial0gfHxcbiAgICAgICAgdGhpcy5fYnlJZFt0aGlzLm1vZGVsSWQob2JqLmF0dHJpYnV0ZXMgfHwgb2JqKV0gfHxcbiAgICAgICAgb2JqLmNpZCAmJiB0aGlzLl9ieUlkW29iai5jaWRdO1xuICAgIH0sXG5cbiAgICAvLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgbW9kZWwgaXMgaW4gdGhlIGNvbGxlY3Rpb24uXG4gICAgaGFzOiBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiB0aGlzLmdldChvYmopICE9IG51bGw7XG4gICAgfSxcblxuICAgIC8vIEdldCB0aGUgbW9kZWwgYXQgdGhlIGdpdmVuIGluZGV4LlxuICAgIGF0OiBmdW5jdGlvbihpbmRleCkge1xuICAgICAgaWYgKGluZGV4IDwgMCkgaW5kZXggKz0gdGhpcy5sZW5ndGg7XG4gICAgICByZXR1cm4gdGhpcy5tb2RlbHNbaW5kZXhdO1xuICAgIH0sXG5cbiAgICAvLyBSZXR1cm4gbW9kZWxzIHdpdGggbWF0Y2hpbmcgYXR0cmlidXRlcy4gVXNlZnVsIGZvciBzaW1wbGUgY2FzZXMgb2ZcbiAgICAvLyBgZmlsdGVyYC5cbiAgICB3aGVyZTogZnVuY3Rpb24oYXR0cnMsIGZpcnN0KSB7XG4gICAgICByZXR1cm4gdGhpc1tmaXJzdCA/ICdmaW5kJyA6ICdmaWx0ZXInXShhdHRycyk7XG4gICAgfSxcblxuICAgIC8vIFJldHVybiB0aGUgZmlyc3QgbW9kZWwgd2l0aCBtYXRjaGluZyBhdHRyaWJ1dGVzLiBVc2VmdWwgZm9yIHNpbXBsZSBjYXNlc1xuICAgIC8vIG9mIGBmaW5kYC5cbiAgICBmaW5kV2hlcmU6IGZ1bmN0aW9uKGF0dHJzKSB7XG4gICAgICByZXR1cm4gdGhpcy53aGVyZShhdHRycywgdHJ1ZSk7XG4gICAgfSxcblxuICAgIC8vIEZvcmNlIHRoZSBjb2xsZWN0aW9uIHRvIHJlLXNvcnQgaXRzZWxmLiBZb3UgZG9uJ3QgbmVlZCB0byBjYWxsIHRoaXMgdW5kZXJcbiAgICAvLyBub3JtYWwgY2lyY3Vtc3RhbmNlcywgYXMgdGhlIHNldCB3aWxsIG1haW50YWluIHNvcnQgb3JkZXIgYXMgZWFjaCBpdGVtXG4gICAgLy8gaXMgYWRkZWQuXG4gICAgc29ydDogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSB0aGlzLmNvbXBhcmF0b3I7XG4gICAgICBpZiAoIWNvbXBhcmF0b3IpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHNvcnQgYSBzZXQgd2l0aG91dCBhIGNvbXBhcmF0b3InKTtcbiAgICAgIG9wdGlvbnMgfHwgKG9wdGlvbnMgPSB7fSk7XG5cbiAgICAgIHZhciBsZW5ndGggPSBjb21wYXJhdG9yLmxlbmd0aDtcbiAgICAgIGlmIChfLmlzRnVuY3Rpb24oY29tcGFyYXRvcikpIGNvbXBhcmF0b3IgPSBfLmJpbmQoY29tcGFyYXRvciwgdGhpcyk7XG5cbiAgICAgIC8vIFJ1biBzb3J0IGJhc2VkIG9uIHR5cGUgb2YgYGNvbXBhcmF0b3JgLlxuICAgICAgaWYgKGxlbmd0aCA9PT0gMSB8fCBfLmlzU3RyaW5nKGNvbXBhcmF0b3IpKSB7XG4gICAgICAgIHRoaXMubW9kZWxzID0gdGhpcy5zb3J0QnkoY29tcGFyYXRvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1vZGVscy5zb3J0KGNvbXBhcmF0b3IpO1xuICAgICAgfVxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkgdGhpcy50cmlnZ2VyKCdzb3J0JywgdGhpcywgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLy8gUGx1Y2sgYW4gYXR0cmlidXRlIGZyb20gZWFjaCBtb2RlbCBpbiB0aGUgY29sbGVjdGlvbi5cbiAgICBwbHVjazogZnVuY3Rpb24oYXR0cikge1xuICAgICAgcmV0dXJuIHRoaXMubWFwKGF0dHIgKyAnJyk7XG4gICAgfSxcblxuICAgIC8vIEZldGNoIHRoZSBkZWZhdWx0IHNldCBvZiBtb2RlbHMgZm9yIHRoaXMgY29sbGVjdGlvbiwgcmVzZXR0aW5nIHRoZVxuICAgIC8vIGNvbGxlY3Rpb24gd2hlbiB0aGV5IGFycml2ZS4gSWYgYHJlc2V0OiB0cnVlYCBpcyBwYXNzZWQsIHRoZSByZXNwb25zZVxuICAgIC8vIGRhdGEgd2lsbCBiZSBwYXNzZWQgdGhyb3VnaCB0aGUgYHJlc2V0YCBtZXRob2QgaW5zdGVhZCBvZiBgc2V0YC5cbiAgICBmZXRjaDogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IF8uZXh0ZW5kKHtwYXJzZTogdHJ1ZX0sIG9wdGlvbnMpO1xuICAgICAgdmFyIHN1Y2Nlc3MgPSBvcHRpb25zLnN1Y2Nlc3M7XG4gICAgICB2YXIgY29sbGVjdGlvbiA9IHRoaXM7XG4gICAgICBvcHRpb25zLnN1Y2Nlc3MgPSBmdW5jdGlvbihyZXNwKSB7XG4gICAgICAgIHZhciBtZXRob2QgPSBvcHRpb25zLnJlc2V0ID8gJ3Jlc2V0JyA6ICdzZXQnO1xuICAgICAgICBjb2xsZWN0aW9uW21ldGhvZF0ocmVzcCwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChzdWNjZXNzKSBzdWNjZXNzLmNhbGwob3B0aW9ucy5jb250ZXh0LCBjb2xsZWN0aW9uLCByZXNwLCBvcHRpb25zKTtcbiAgICAgICAgY29sbGVjdGlvbi50cmlnZ2VyKCdzeW5jJywgY29sbGVjdGlvbiwgcmVzcCwgb3B0aW9ucyk7XG4gICAgICB9O1xuICAgICAgd3JhcEVycm9yKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHRoaXMuc3luYygncmVhZCcsIHRoaXMsIG9wdGlvbnMpO1xuICAgIH0sXG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSBtb2RlbCBpbiB0aGlzIGNvbGxlY3Rpb24uIEFkZCB0aGUgbW9kZWwgdG8gdGhlXG4gICAgLy8gY29sbGVjdGlvbiBpbW1lZGlhdGVseSwgdW5sZXNzIGB3YWl0OiB0cnVlYCBpcyBwYXNzZWQsIGluIHdoaWNoIGNhc2Ugd2VcbiAgICAvLyB3YWl0IGZvciB0aGUgc2VydmVyIHRvIGFncmVlLlxuICAgIGNyZWF0ZTogZnVuY3Rpb24obW9kZWwsIG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zID8gXy5jbG9uZShvcHRpb25zKSA6IHt9O1xuICAgICAgdmFyIHdhaXQgPSBvcHRpb25zLndhaXQ7XG4gICAgICBtb2RlbCA9IHRoaXMuX3ByZXBhcmVNb2RlbChtb2RlbCwgb3B0aW9ucyk7XG4gICAgICBpZiAoIW1vZGVsKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoIXdhaXQpIHRoaXMuYWRkKG1vZGVsLCBvcHRpb25zKTtcbiAgICAgIHZhciBjb2xsZWN0aW9uID0gdGhpcztcbiAgICAgIHZhciBzdWNjZXNzID0gb3B0aW9ucy5zdWNjZXNzO1xuICAgICAgb3B0aW9ucy5zdWNjZXNzID0gZnVuY3Rpb24obSwgcmVzcCwgY2FsbGJhY2tPcHRzKSB7XG4gICAgICAgIGlmICh3YWl0KSBjb2xsZWN0aW9uLmFkZChtLCBjYWxsYmFja09wdHMpO1xuICAgICAgICBpZiAoc3VjY2Vzcykgc3VjY2Vzcy5jYWxsKGNhbGxiYWNrT3B0cy5jb250ZXh0LCBtLCByZXNwLCBjYWxsYmFja09wdHMpO1xuICAgICAgfTtcbiAgICAgIG1vZGVsLnNhdmUobnVsbCwgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gbW9kZWw7XG4gICAgfSxcblxuICAgIC8vICoqcGFyc2UqKiBjb252ZXJ0cyBhIHJlc3BvbnNlIGludG8gYSBsaXN0IG9mIG1vZGVscyB0byBiZSBhZGRlZCB0byB0aGVcbiAgICAvLyBjb2xsZWN0aW9uLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBqdXN0IHRvIHBhc3MgaXQgdGhyb3VnaC5cbiAgICBwYXJzZTogZnVuY3Rpb24ocmVzcCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIHJlc3A7XG4gICAgfSxcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBjb2xsZWN0aW9uIHdpdGggYW4gaWRlbnRpY2FsIGxpc3Qgb2YgbW9kZWxzIGFzIHRoaXMgb25lLlxuICAgIGNsb25lOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLm1vZGVscywge1xuICAgICAgICBtb2RlbDogdGhpcy5tb2RlbCxcbiAgICAgICAgY29tcGFyYXRvcjogdGhpcy5jb21wYXJhdG9yXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gRGVmaW5lIGhvdyB0byB1bmlxdWVseSBpZGVudGlmeSBtb2RlbHMgaW4gdGhlIGNvbGxlY3Rpb24uXG4gICAgbW9kZWxJZDogZnVuY3Rpb24oYXR0cnMpIHtcbiAgICAgIHJldHVybiBhdHRyc1t0aGlzLm1vZGVsLnByb3RvdHlwZS5pZEF0dHJpYnV0ZSB8fCAnaWQnXTtcbiAgICB9LFxuXG4gICAgLy8gUHJpdmF0ZSBtZXRob2QgdG8gcmVzZXQgYWxsIGludGVybmFsIHN0YXRlLiBDYWxsZWQgd2hlbiB0aGUgY29sbGVjdGlvblxuICAgIC8vIGlzIGZpcnN0IGluaXRpYWxpemVkIG9yIHJlc2V0LlxuICAgIF9yZXNldDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgICB0aGlzLm1vZGVscyA9IFtdO1xuICAgICAgdGhpcy5fYnlJZCAgPSB7fTtcbiAgICB9LFxuXG4gICAgLy8gUHJlcGFyZSBhIGhhc2ggb2YgYXR0cmlidXRlcyAob3Igb3RoZXIgbW9kZWwpIHRvIGJlIGFkZGVkIHRvIHRoaXNcbiAgICAvLyBjb2xsZWN0aW9uLlxuICAgIF9wcmVwYXJlTW9kZWw6IGZ1bmN0aW9uKGF0dHJzLCBvcHRpb25zKSB7XG4gICAgICBpZiAodGhpcy5faXNNb2RlbChhdHRycykpIHtcbiAgICAgICAgaWYgKCFhdHRycy5jb2xsZWN0aW9uKSBhdHRycy5jb2xsZWN0aW9uID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGF0dHJzO1xuICAgICAgfVxuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgPyBfLmNsb25lKG9wdGlvbnMpIDoge307XG4gICAgICBvcHRpb25zLmNvbGxlY3Rpb24gPSB0aGlzO1xuICAgICAgdmFyIG1vZGVsID0gbmV3IHRoaXMubW9kZWwoYXR0cnMsIG9wdGlvbnMpO1xuICAgICAgaWYgKCFtb2RlbC52YWxpZGF0aW9uRXJyb3IpIHJldHVybiBtb2RlbDtcbiAgICAgIHRoaXMudHJpZ2dlcignaW52YWxpZCcsIHRoaXMsIG1vZGVsLnZhbGlkYXRpb25FcnJvciwgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIC8vIEludGVybmFsIG1ldGhvZCBjYWxsZWQgYnkgYm90aCByZW1vdmUgYW5kIHNldC5cbiAgICBfcmVtb3ZlTW9kZWxzOiBmdW5jdGlvbihtb2RlbHMsIG9wdGlvbnMpIHtcbiAgICAgIHZhciByZW1vdmVkID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbW9kZWwgPSB0aGlzLmdldChtb2RlbHNbaV0pO1xuICAgICAgICBpZiAoIW1vZGVsKSBjb250aW51ZTtcblxuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmluZGV4T2YobW9kZWwpO1xuICAgICAgICB0aGlzLm1vZGVscy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB0aGlzLmxlbmd0aC0tO1xuXG4gICAgICAgIC8vIFJlbW92ZSByZWZlcmVuY2VzIGJlZm9yZSB0cmlnZ2VyaW5nICdyZW1vdmUnIGV2ZW50IHRvIHByZXZlbnQgYW5cbiAgICAgICAgLy8gaW5maW5pdGUgbG9vcC4gIzM2OTNcbiAgICAgICAgZGVsZXRlIHRoaXMuX2J5SWRbbW9kZWwuY2lkXTtcbiAgICAgICAgdmFyIGlkID0gdGhpcy5tb2RlbElkKG1vZGVsLmF0dHJpYnV0ZXMpO1xuICAgICAgICBpZiAoaWQgIT0gbnVsbCkgZGVsZXRlIHRoaXMuX2J5SWRbaWRdO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICBvcHRpb25zLmluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgbW9kZWwudHJpZ2dlcigncmVtb3ZlJywgbW9kZWwsIHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVtb3ZlZC5wdXNoKG1vZGVsKTtcbiAgICAgICAgdGhpcy5fcmVtb3ZlUmVmZXJlbmNlKG1vZGVsLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZW1vdmVkO1xuICAgIH0sXG5cbiAgICAvLyBNZXRob2QgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gb2JqZWN0IHNob3VsZCBiZSBjb25zaWRlcmVkIGEgbW9kZWwgZm9yXG4gICAgLy8gdGhlIHB1cnBvc2VzIG9mIGFkZGluZyB0byB0aGUgY29sbGVjdGlvbi5cbiAgICBfaXNNb2RlbDogZnVuY3Rpb24obW9kZWwpIHtcbiAgICAgIHJldHVybiBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsO1xuICAgIH0sXG5cbiAgICAvLyBJbnRlcm5hbCBtZXRob2QgdG8gY3JlYXRlIGEgbW9kZWwncyB0aWVzIHRvIGEgY29sbGVjdGlvbi5cbiAgICBfYWRkUmVmZXJlbmNlOiBmdW5jdGlvbihtb2RlbCwgb3B0aW9ucykge1xuICAgICAgdGhpcy5fYnlJZFttb2RlbC5jaWRdID0gbW9kZWw7XG4gICAgICB2YXIgaWQgPSB0aGlzLm1vZGVsSWQobW9kZWwuYXR0cmlidXRlcyk7XG4gICAgICBpZiAoaWQgIT0gbnVsbCkgdGhpcy5fYnlJZFtpZF0gPSBtb2RlbDtcbiAgICAgIG1vZGVsLm9uKCdhbGwnLCB0aGlzLl9vbk1vZGVsRXZlbnQsIHRoaXMpO1xuICAgIH0sXG5cbiAgICAvLyBJbnRlcm5hbCBtZXRob2QgdG8gc2V2ZXIgYSBtb2RlbCdzIHRpZXMgdG8gYSBjb2xsZWN0aW9uLlxuICAgIF9yZW1vdmVSZWZlcmVuY2U6IGZ1bmN0aW9uKG1vZGVsLCBvcHRpb25zKSB7XG4gICAgICBkZWxldGUgdGhpcy5fYnlJZFttb2RlbC5jaWRdO1xuICAgICAgdmFyIGlkID0gdGhpcy5tb2RlbElkKG1vZGVsLmF0dHJpYnV0ZXMpO1xuICAgICAgaWYgKGlkICE9IG51bGwpIGRlbGV0ZSB0aGlzLl9ieUlkW2lkXTtcbiAgICAgIGlmICh0aGlzID09PSBtb2RlbC5jb2xsZWN0aW9uKSBkZWxldGUgbW9kZWwuY29sbGVjdGlvbjtcbiAgICAgIG1vZGVsLm9mZignYWxsJywgdGhpcy5fb25Nb2RlbEV2ZW50LCB0aGlzKTtcbiAgICB9LFxuXG4gICAgLy8gSW50ZXJuYWwgbWV0aG9kIGNhbGxlZCBldmVyeSB0aW1lIGEgbW9kZWwgaW4gdGhlIHNldCBmaXJlcyBhbiBldmVudC5cbiAgICAvLyBTZXRzIG5lZWQgdG8gdXBkYXRlIHRoZWlyIGluZGV4ZXMgd2hlbiBtb2RlbHMgY2hhbmdlIGlkcy4gQWxsIG90aGVyXG4gICAgLy8gZXZlbnRzIHNpbXBseSBwcm94eSB0aHJvdWdoLiBcImFkZFwiIGFuZCBcInJlbW92ZVwiIGV2ZW50cyB0aGF0IG9yaWdpbmF0ZVxuICAgIC8vIGluIG90aGVyIGNvbGxlY3Rpb25zIGFyZSBpZ25vcmVkLlxuICAgIF9vbk1vZGVsRXZlbnQ6IGZ1bmN0aW9uKGV2ZW50LCBtb2RlbCwgY29sbGVjdGlvbiwgb3B0aW9ucykge1xuICAgICAgaWYgKG1vZGVsKSB7XG4gICAgICAgIGlmICgoZXZlbnQgPT09ICdhZGQnIHx8IGV2ZW50ID09PSAncmVtb3ZlJykgJiYgY29sbGVjdGlvbiAhPT0gdGhpcykgcmV0dXJuO1xuICAgICAgICBpZiAoZXZlbnQgPT09ICdkZXN0cm95JykgdGhpcy5yZW1vdmUobW9kZWwsIG9wdGlvbnMpO1xuICAgICAgICBpZiAoZXZlbnQgPT09ICdjaGFuZ2UnKSB7XG4gICAgICAgICAgdmFyIHByZXZJZCA9IHRoaXMubW9kZWxJZChtb2RlbC5wcmV2aW91c0F0dHJpYnV0ZXMoKSk7XG4gICAgICAgICAgdmFyIGlkID0gdGhpcy5tb2RlbElkKG1vZGVsLmF0dHJpYnV0ZXMpO1xuICAgICAgICAgIGlmIChwcmV2SWQgIT09IGlkKSB7XG4gICAgICAgICAgICBpZiAocHJldklkICE9IG51bGwpIGRlbGV0ZSB0aGlzLl9ieUlkW3ByZXZJZF07XG4gICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCkgdGhpcy5fYnlJZFtpZF0gPSBtb2RlbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudHJpZ2dlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICB9KTtcblxuICAvLyBVbmRlcnNjb3JlIG1ldGhvZHMgdGhhdCB3ZSB3YW50IHRvIGltcGxlbWVudCBvbiB0aGUgQ29sbGVjdGlvbi5cbiAgLy8gOTAlIG9mIHRoZSBjb3JlIHVzZWZ1bG5lc3Mgb2YgQmFja2JvbmUgQ29sbGVjdGlvbnMgaXMgYWN0dWFsbHkgaW1wbGVtZW50ZWRcbiAgLy8gcmlnaHQgaGVyZTpcbiAgdmFyIGNvbGxlY3Rpb25NZXRob2RzID0ge2ZvckVhY2g6IDMsIGVhY2g6IDMsIG1hcDogMywgY29sbGVjdDogMywgcmVkdWNlOiAwLFxuICAgICAgZm9sZGw6IDAsIGluamVjdDogMCwgcmVkdWNlUmlnaHQ6IDAsIGZvbGRyOiAwLCBmaW5kOiAzLCBkZXRlY3Q6IDMsIGZpbHRlcjogMyxcbiAgICAgIHNlbGVjdDogMywgcmVqZWN0OiAzLCBldmVyeTogMywgYWxsOiAzLCBzb21lOiAzLCBhbnk6IDMsIGluY2x1ZGU6IDMsIGluY2x1ZGVzOiAzLFxuICAgICAgY29udGFpbnM6IDMsIGludm9rZTogMCwgbWF4OiAzLCBtaW46IDMsIHRvQXJyYXk6IDEsIHNpemU6IDEsIGZpcnN0OiAzLFxuICAgICAgaGVhZDogMywgdGFrZTogMywgaW5pdGlhbDogMywgcmVzdDogMywgdGFpbDogMywgZHJvcDogMywgbGFzdDogMyxcbiAgICAgIHdpdGhvdXQ6IDAsIGRpZmZlcmVuY2U6IDAsIGluZGV4T2Y6IDMsIHNodWZmbGU6IDEsIGxhc3RJbmRleE9mOiAzLFxuICAgICAgaXNFbXB0eTogMSwgY2hhaW46IDEsIHNhbXBsZTogMywgcGFydGl0aW9uOiAzLCBncm91cEJ5OiAzLCBjb3VudEJ5OiAzLFxuICAgICAgc29ydEJ5OiAzLCBpbmRleEJ5OiAzLCBmaW5kSW5kZXg6IDMsIGZpbmRMYXN0SW5kZXg6IDN9O1xuXG4gIC8vIE1peCBpbiBlYWNoIFVuZGVyc2NvcmUgbWV0aG9kIGFzIGEgcHJveHkgdG8gYENvbGxlY3Rpb24jbW9kZWxzYC5cbiAgYWRkVW5kZXJzY29yZU1ldGhvZHMoQ29sbGVjdGlvbiwgY29sbGVjdGlvbk1ldGhvZHMsICdtb2RlbHMnKTtcblxuICAvLyBCYWNrYm9uZS5WaWV3XG4gIC8vIC0tLS0tLS0tLS0tLS1cblxuICAvLyBCYWNrYm9uZSBWaWV3cyBhcmUgYWxtb3N0IG1vcmUgY29udmVudGlvbiB0aGFuIHRoZXkgYXJlIGFjdHVhbCBjb2RlLiBBIFZpZXdcbiAgLy8gaXMgc2ltcGx5IGEgSmF2YVNjcmlwdCBvYmplY3QgdGhhdCByZXByZXNlbnRzIGEgbG9naWNhbCBjaHVuayBvZiBVSSBpbiB0aGVcbiAgLy8gRE9NLiBUaGlzIG1pZ2h0IGJlIGEgc2luZ2xlIGl0ZW0sIGFuIGVudGlyZSBsaXN0LCBhIHNpZGViYXIgb3IgcGFuZWwsIG9yXG4gIC8vIGV2ZW4gdGhlIHN1cnJvdW5kaW5nIGZyYW1lIHdoaWNoIHdyYXBzIHlvdXIgd2hvbGUgYXBwLiBEZWZpbmluZyBhIGNodW5rIG9mXG4gIC8vIFVJIGFzIGEgKipWaWV3KiogYWxsb3dzIHlvdSB0byBkZWZpbmUgeW91ciBET00gZXZlbnRzIGRlY2xhcmF0aXZlbHksIHdpdGhvdXRcbiAgLy8gaGF2aW5nIHRvIHdvcnJ5IGFib3V0IHJlbmRlciBvcmRlciAuLi4gYW5kIG1ha2VzIGl0IGVhc3kgZm9yIHRoZSB2aWV3IHRvXG4gIC8vIHJlYWN0IHRvIHNwZWNpZmljIGNoYW5nZXMgaW4gdGhlIHN0YXRlIG9mIHlvdXIgbW9kZWxzLlxuXG4gIC8vIENyZWF0aW5nIGEgQmFja2JvbmUuVmlldyBjcmVhdGVzIGl0cyBpbml0aWFsIGVsZW1lbnQgb3V0c2lkZSBvZiB0aGUgRE9NLFxuICAvLyBpZiBhbiBleGlzdGluZyBlbGVtZW50IGlzIG5vdCBwcm92aWRlZC4uLlxuICB2YXIgVmlldyA9IEJhY2tib25lLlZpZXcgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgdGhpcy5jaWQgPSBfLnVuaXF1ZUlkKCd2aWV3Jyk7XG4gICAgXy5leHRlbmQodGhpcywgXy5waWNrKG9wdGlvbnMsIHZpZXdPcHRpb25zKSk7XG4gICAgdGhpcy5fZW5zdXJlRWxlbWVudCgpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xuXG4gIC8vIENhY2hlZCByZWdleCB0byBzcGxpdCBrZXlzIGZvciBgZGVsZWdhdGVgLlxuICB2YXIgZGVsZWdhdGVFdmVudFNwbGl0dGVyID0gL14oXFxTKylcXHMqKC4qKSQvO1xuXG4gIC8vIExpc3Qgb2YgdmlldyBvcHRpb25zIHRvIGJlIHNldCBhcyBwcm9wZXJ0aWVzLlxuICB2YXIgdmlld09wdGlvbnMgPSBbJ21vZGVsJywgJ2NvbGxlY3Rpb24nLCAnZWwnLCAnaWQnLCAnYXR0cmlidXRlcycsICdjbGFzc05hbWUnLCAndGFnTmFtZScsICdldmVudHMnXTtcblxuICAvLyBTZXQgdXAgYWxsIGluaGVyaXRhYmxlICoqQmFja2JvbmUuVmlldyoqIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMuXG4gIF8uZXh0ZW5kKFZpZXcucHJvdG90eXBlLCBFdmVudHMsIHtcblxuICAgIC8vIFRoZSBkZWZhdWx0IGB0YWdOYW1lYCBvZiBhIFZpZXcncyBlbGVtZW50IGlzIGBcImRpdlwiYC5cbiAgICB0YWdOYW1lOiAnZGl2JyxcblxuICAgIC8vIGpRdWVyeSBkZWxlZ2F0ZSBmb3IgZWxlbWVudCBsb29rdXAsIHNjb3BlZCB0byBET00gZWxlbWVudHMgd2l0aGluIHRoZVxuICAgIC8vIGN1cnJlbnQgdmlldy4gVGhpcyBzaG91bGQgYmUgcHJlZmVycmVkIHRvIGdsb2JhbCBsb29rdXBzIHdoZXJlIHBvc3NpYmxlLlxuICAgICQ6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy4kZWwuZmluZChzZWxlY3Rvcik7XG4gICAgfSxcblxuICAgIC8vIEluaXRpYWxpemUgaXMgYW4gZW1wdHkgZnVuY3Rpb24gYnkgZGVmYXVsdC4gT3ZlcnJpZGUgaXQgd2l0aCB5b3VyIG93blxuICAgIC8vIGluaXRpYWxpemF0aW9uIGxvZ2ljLlxuICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKCl7fSxcblxuICAgIC8vICoqcmVuZGVyKiogaXMgdGhlIGNvcmUgZnVuY3Rpb24gdGhhdCB5b3VyIHZpZXcgc2hvdWxkIG92ZXJyaWRlLCBpbiBvcmRlclxuICAgIC8vIHRvIHBvcHVsYXRlIGl0cyBlbGVtZW50IChgdGhpcy5lbGApLCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBIVE1MLiBUaGVcbiAgICAvLyBjb252ZW50aW9uIGlzIGZvciAqKnJlbmRlcioqIHRvIGFsd2F5cyByZXR1cm4gYHRoaXNgLlxuICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLy8gUmVtb3ZlIHRoaXMgdmlldyBieSB0YWtpbmcgdGhlIGVsZW1lbnQgb3V0IG9mIHRoZSBET00sIGFuZCByZW1vdmluZyBhbnlcbiAgICAvLyBhcHBsaWNhYmxlIEJhY2tib25lLkV2ZW50cyBsaXN0ZW5lcnMuXG4gICAgcmVtb3ZlOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuX3JlbW92ZUVsZW1lbnQoKTtcbiAgICAgIHRoaXMuc3RvcExpc3RlbmluZygpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8vIFJlbW92ZSB0aGlzIHZpZXcncyBlbGVtZW50IGZyb20gdGhlIGRvY3VtZW50IGFuZCBhbGwgZXZlbnQgbGlzdGVuZXJzXG4gICAgLy8gYXR0YWNoZWQgdG8gaXQuIEV4cG9zZWQgZm9yIHN1YmNsYXNzZXMgdXNpbmcgYW4gYWx0ZXJuYXRpdmUgRE9NXG4gICAgLy8gbWFuaXB1bGF0aW9uIEFQSS5cbiAgICBfcmVtb3ZlRWxlbWVudDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLiRlbC5yZW1vdmUoKTtcbiAgICB9LFxuXG4gICAgLy8gQ2hhbmdlIHRoZSB2aWV3J3MgZWxlbWVudCAoYHRoaXMuZWxgIHByb3BlcnR5KSBhbmQgcmUtZGVsZWdhdGUgdGhlXG4gICAgLy8gdmlldydzIGV2ZW50cyBvbiB0aGUgbmV3IGVsZW1lbnQuXG4gICAgc2V0RWxlbWVudDogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgdGhpcy51bmRlbGVnYXRlRXZlbnRzKCk7XG4gICAgICB0aGlzLl9zZXRFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgdGhpcy5kZWxlZ2F0ZUV2ZW50cygpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8vIENyZWF0ZXMgdGhlIGB0aGlzLmVsYCBhbmQgYHRoaXMuJGVsYCByZWZlcmVuY2VzIGZvciB0aGlzIHZpZXcgdXNpbmcgdGhlXG4gICAgLy8gZ2l2ZW4gYGVsYC4gYGVsYCBjYW4gYmUgYSBDU1Mgc2VsZWN0b3Igb3IgYW4gSFRNTCBzdHJpbmcsIGEgalF1ZXJ5XG4gICAgLy8gY29udGV4dCBvciBhbiBlbGVtZW50LiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIHRvIHV0aWxpemUgYW5cbiAgICAvLyBhbHRlcm5hdGl2ZSBET00gbWFuaXB1bGF0aW9uIEFQSSBhbmQgYXJlIG9ubHkgcmVxdWlyZWQgdG8gc2V0IHRoZVxuICAgIC8vIGB0aGlzLmVsYCBwcm9wZXJ0eS5cbiAgICBfc2V0RWxlbWVudDogZnVuY3Rpb24oZWwpIHtcbiAgICAgIHRoaXMuJGVsID0gZWwgaW5zdGFuY2VvZiBCYWNrYm9uZS4kID8gZWwgOiBCYWNrYm9uZS4kKGVsKTtcbiAgICAgIHRoaXMuZWwgPSB0aGlzLiRlbFswXTtcbiAgICB9LFxuXG4gICAgLy8gU2V0IGNhbGxiYWNrcywgd2hlcmUgYHRoaXMuZXZlbnRzYCBpcyBhIGhhc2ggb2ZcbiAgICAvL1xuICAgIC8vICp7XCJldmVudCBzZWxlY3RvclwiOiBcImNhbGxiYWNrXCJ9KlxuICAgIC8vXG4gICAgLy8gICAgIHtcbiAgICAvLyAgICAgICAnbW91c2Vkb3duIC50aXRsZSc6ICAnZWRpdCcsXG4gICAgLy8gICAgICAgJ2NsaWNrIC5idXR0b24nOiAgICAgJ3NhdmUnLFxuICAgIC8vICAgICAgICdjbGljayAub3Blbic6ICAgICAgIGZ1bmN0aW9uKGUpIHsgLi4uIH1cbiAgICAvLyAgICAgfVxuICAgIC8vXG4gICAgLy8gcGFpcnMuIENhbGxiYWNrcyB3aWxsIGJlIGJvdW5kIHRvIHRoZSB2aWV3LCB3aXRoIGB0aGlzYCBzZXQgcHJvcGVybHkuXG4gICAgLy8gVXNlcyBldmVudCBkZWxlZ2F0aW9uIGZvciBlZmZpY2llbmN5LlxuICAgIC8vIE9taXR0aW5nIHRoZSBzZWxlY3RvciBiaW5kcyB0aGUgZXZlbnQgdG8gYHRoaXMuZWxgLlxuICAgIGRlbGVnYXRlRXZlbnRzOiBmdW5jdGlvbihldmVudHMpIHtcbiAgICAgIGV2ZW50cyB8fCAoZXZlbnRzID0gXy5yZXN1bHQodGhpcywgJ2V2ZW50cycpKTtcbiAgICAgIGlmICghZXZlbnRzKSByZXR1cm4gdGhpcztcbiAgICAgIHRoaXMudW5kZWxlZ2F0ZUV2ZW50cygpO1xuICAgICAgZm9yICh2YXIga2V5IGluIGV2ZW50cykge1xuICAgICAgICB2YXIgbWV0aG9kID0gZXZlbnRzW2tleV07XG4gICAgICAgIGlmICghXy5pc0Z1bmN0aW9uKG1ldGhvZCkpIG1ldGhvZCA9IHRoaXNbbWV0aG9kXTtcbiAgICAgICAgaWYgKCFtZXRob2QpIGNvbnRpbnVlO1xuICAgICAgICB2YXIgbWF0Y2ggPSBrZXkubWF0Y2goZGVsZWdhdGVFdmVudFNwbGl0dGVyKTtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZShtYXRjaFsxXSwgbWF0Y2hbMl0sIF8uYmluZChtZXRob2QsIHRoaXMpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvLyBBZGQgYSBzaW5nbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIHZpZXcncyBlbGVtZW50IChvciBhIGNoaWxkIGVsZW1lbnRcbiAgICAvLyB1c2luZyBgc2VsZWN0b3JgKS4gVGhpcyBvbmx5IHdvcmtzIGZvciBkZWxlZ2F0ZS1hYmxlIGV2ZW50czogbm90IGBmb2N1c2AsXG4gICAgLy8gYGJsdXJgLCBhbmQgbm90IGBjaGFuZ2VgLCBgc3VibWl0YCwgYW5kIGByZXNldGAgaW4gSW50ZXJuZXQgRXhwbG9yZXIuXG4gICAgZGVsZWdhdGU6IGZ1bmN0aW9uKGV2ZW50TmFtZSwgc2VsZWN0b3IsIGxpc3RlbmVyKSB7XG4gICAgICB0aGlzLiRlbC5vbihldmVudE5hbWUgKyAnLmRlbGVnYXRlRXZlbnRzJyArIHRoaXMuY2lkLCBzZWxlY3RvciwgbGlzdGVuZXIpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8vIENsZWFycyBhbGwgY2FsbGJhY2tzIHByZXZpb3VzbHkgYm91bmQgdG8gdGhlIHZpZXcgYnkgYGRlbGVnYXRlRXZlbnRzYC5cbiAgICAvLyBZb3UgdXN1YWxseSBkb24ndCBuZWVkIHRvIHVzZSB0aGlzLCBidXQgbWF5IHdpc2ggdG8gaWYgeW91IGhhdmUgbXVsdGlwbGVcbiAgICAvLyBCYWNrYm9uZSB2aWV3cyBhdHRhY2hlZCB0byB0aGUgc2FtZSBET00gZWxlbWVudC5cbiAgICB1bmRlbGVnYXRlRXZlbnRzOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLiRlbCkgdGhpcy4kZWwub2ZmKCcuZGVsZWdhdGVFdmVudHMnICsgdGhpcy5jaWQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8vIEEgZmluZXItZ3JhaW5lZCBgdW5kZWxlZ2F0ZUV2ZW50c2AgZm9yIHJlbW92aW5nIGEgc2luZ2xlIGRlbGVnYXRlZCBldmVudC5cbiAgICAvLyBgc2VsZWN0b3JgIGFuZCBgbGlzdGVuZXJgIGFyZSBib3RoIG9wdGlvbmFsLlxuICAgIHVuZGVsZWdhdGU6IGZ1bmN0aW9uKGV2ZW50TmFtZSwgc2VsZWN0b3IsIGxpc3RlbmVyKSB7XG4gICAgICB0aGlzLiRlbC5vZmYoZXZlbnROYW1lICsgJy5kZWxlZ2F0ZUV2ZW50cycgKyB0aGlzLmNpZCwgc2VsZWN0b3IsIGxpc3RlbmVyKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvLyBQcm9kdWNlcyBhIERPTSBlbGVtZW50IHRvIGJlIGFzc2lnbmVkIHRvIHlvdXIgdmlldy4gRXhwb3NlZCBmb3JcbiAgICAvLyBzdWJjbGFzc2VzIHVzaW5nIGFuIGFsdGVybmF0aXZlIERPTSBtYW5pcHVsYXRpb24gQVBJLlxuICAgIF9jcmVhdGVFbGVtZW50OiBmdW5jdGlvbih0YWdOYW1lKSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcbiAgICB9LFxuXG4gICAgLy8gRW5zdXJlIHRoYXQgdGhlIFZpZXcgaGFzIGEgRE9NIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAgLy8gSWYgYHRoaXMuZWxgIGlzIGEgc3RyaW5nLCBwYXNzIGl0IHRocm91Z2ggYCQoKWAsIHRha2UgdGhlIGZpcnN0XG4gICAgLy8gbWF0Y2hpbmcgZWxlbWVudCwgYW5kIHJlLWFzc2lnbiBpdCB0byBgZWxgLiBPdGhlcndpc2UsIGNyZWF0ZVxuICAgIC8vIGFuIGVsZW1lbnQgZnJvbSB0aGUgYGlkYCwgYGNsYXNzTmFtZWAgYW5kIGB0YWdOYW1lYCBwcm9wZXJ0aWVzLlxuICAgIF9lbnN1cmVFbGVtZW50OiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghdGhpcy5lbCkge1xuICAgICAgICB2YXIgYXR0cnMgPSBfLmV4dGVuZCh7fSwgXy5yZXN1bHQodGhpcywgJ2F0dHJpYnV0ZXMnKSk7XG4gICAgICAgIGlmICh0aGlzLmlkKSBhdHRycy5pZCA9IF8ucmVzdWx0KHRoaXMsICdpZCcpO1xuICAgICAgICBpZiAodGhpcy5jbGFzc05hbWUpIGF0dHJzWydjbGFzcyddID0gXy5yZXN1bHQodGhpcywgJ2NsYXNzTmFtZScpO1xuICAgICAgICB0aGlzLnNldEVsZW1lbnQodGhpcy5fY3JlYXRlRWxlbWVudChfLnJlc3VsdCh0aGlzLCAndGFnTmFtZScpKSk7XG4gICAgICAgIHRoaXMuX3NldEF0dHJpYnV0ZXMoYXR0cnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRFbGVtZW50KF8ucmVzdWx0KHRoaXMsICdlbCcpKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gU2V0IGF0dHJpYnV0ZXMgZnJvbSBhIGhhc2ggb24gdGhpcyB2aWV3J3MgZWxlbWVudC4gIEV4cG9zZWQgZm9yXG4gICAgLy8gc3ViY2xhc3NlcyB1c2luZyBhbiBhbHRlcm5hdGl2ZSBET00gbWFuaXB1bGF0aW9uIEFQSS5cbiAgICBfc2V0QXR0cmlidXRlczogZnVuY3Rpb24oYXR0cmlidXRlcykge1xuICAgICAgdGhpcy4kZWwuYXR0cihhdHRyaWJ1dGVzKTtcbiAgICB9XG5cbiAgfSk7XG5cbiAgLy8gQmFja2JvbmUuc3luY1xuICAvLyAtLS0tLS0tLS0tLS0tXG5cbiAgLy8gT3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiB0byBjaGFuZ2UgdGhlIG1hbm5lciBpbiB3aGljaCBCYWNrYm9uZSBwZXJzaXN0c1xuICAvLyBtb2RlbHMgdG8gdGhlIHNlcnZlci4gWW91IHdpbGwgYmUgcGFzc2VkIHRoZSB0eXBlIG9mIHJlcXVlc3QsIGFuZCB0aGVcbiAgLy8gbW9kZWwgaW4gcXVlc3Rpb24uIEJ5IGRlZmF1bHQsIG1ha2VzIGEgUkVTVGZ1bCBBamF4IHJlcXVlc3RcbiAgLy8gdG8gdGhlIG1vZGVsJ3MgYHVybCgpYC4gU29tZSBwb3NzaWJsZSBjdXN0b21pemF0aW9ucyBjb3VsZCBiZTpcbiAgLy9cbiAgLy8gKiBVc2UgYHNldFRpbWVvdXRgIHRvIGJhdGNoIHJhcGlkLWZpcmUgdXBkYXRlcyBpbnRvIGEgc2luZ2xlIHJlcXVlc3QuXG4gIC8vICogU2VuZCB1cCB0aGUgbW9kZWxzIGFzIFhNTCBpbnN0ZWFkIG9mIEpTT04uXG4gIC8vICogUGVyc2lzdCBtb2RlbHMgdmlhIFdlYlNvY2tldHMgaW5zdGVhZCBvZiBBamF4LlxuICAvL1xuICAvLyBUdXJuIG9uIGBCYWNrYm9uZS5lbXVsYXRlSFRUUGAgaW4gb3JkZXIgdG8gc2VuZCBgUFVUYCBhbmQgYERFTEVURWAgcmVxdWVzdHNcbiAgLy8gYXMgYFBPU1RgLCB3aXRoIGEgYF9tZXRob2RgIHBhcmFtZXRlciBjb250YWluaW5nIHRoZSB0cnVlIEhUVFAgbWV0aG9kLFxuICAvLyBhcyB3ZWxsIGFzIGFsbCByZXF1ZXN0cyB3aXRoIHRoZSBib2R5IGFzIGBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRgXG4gIC8vIGluc3RlYWQgb2YgYGFwcGxpY2F0aW9uL2pzb25gIHdpdGggdGhlIG1vZGVsIGluIGEgcGFyYW0gbmFtZWQgYG1vZGVsYC5cbiAgLy8gVXNlZnVsIHdoZW4gaW50ZXJmYWNpbmcgd2l0aCBzZXJ2ZXItc2lkZSBsYW5ndWFnZXMgbGlrZSAqKlBIUCoqIHRoYXQgbWFrZVxuICAvLyBpdCBkaWZmaWN1bHQgdG8gcmVhZCB0aGUgYm9keSBvZiBgUFVUYCByZXF1ZXN0cy5cbiAgQmFja2JvbmUuc3luYyA9IGZ1bmN0aW9uKG1ldGhvZCwgbW9kZWwsIG9wdGlvbnMpIHtcbiAgICB2YXIgdHlwZSA9IG1ldGhvZE1hcFttZXRob2RdO1xuXG4gICAgLy8gRGVmYXVsdCBvcHRpb25zLCB1bmxlc3Mgc3BlY2lmaWVkLlxuICAgIF8uZGVmYXVsdHMob3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KSwge1xuICAgICAgZW11bGF0ZUhUVFA6IEJhY2tib25lLmVtdWxhdGVIVFRQLFxuICAgICAgZW11bGF0ZUpTT046IEJhY2tib25lLmVtdWxhdGVKU09OXG4gICAgfSk7XG5cbiAgICAvLyBEZWZhdWx0IEpTT04tcmVxdWVzdCBvcHRpb25zLlxuICAgIHZhciBwYXJhbXMgPSB7dHlwZTogdHlwZSwgZGF0YVR5cGU6ICdqc29uJ307XG5cbiAgICAvLyBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgVVJMLlxuICAgIGlmICghb3B0aW9ucy51cmwpIHtcbiAgICAgIHBhcmFtcy51cmwgPSBfLnJlc3VsdChtb2RlbCwgJ3VybCcpIHx8IHVybEVycm9yKCk7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIHRoYXQgd2UgaGF2ZSB0aGUgYXBwcm9wcmlhdGUgcmVxdWVzdCBkYXRhLlxuICAgIGlmIChvcHRpb25zLmRhdGEgPT0gbnVsbCAmJiBtb2RlbCAmJiAobWV0aG9kID09PSAnY3JlYXRlJyB8fCBtZXRob2QgPT09ICd1cGRhdGUnIHx8IG1ldGhvZCA9PT0gJ3BhdGNoJykpIHtcbiAgICAgIHBhcmFtcy5jb250ZW50VHlwZSA9ICdhcHBsaWNhdGlvbi9qc29uJztcbiAgICAgIHBhcmFtcy5kYXRhID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5hdHRycyB8fCBtb2RlbC50b0pTT04ob3B0aW9ucykpO1xuICAgIH1cblxuICAgIC8vIEZvciBvbGRlciBzZXJ2ZXJzLCBlbXVsYXRlIEpTT04gYnkgZW5jb2RpbmcgdGhlIHJlcXVlc3QgaW50byBhbiBIVE1MLWZvcm0uXG4gICAgaWYgKG9wdGlvbnMuZW11bGF0ZUpTT04pIHtcbiAgICAgIHBhcmFtcy5jb250ZW50VHlwZSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnO1xuICAgICAgcGFyYW1zLmRhdGEgPSBwYXJhbXMuZGF0YSA/IHttb2RlbDogcGFyYW1zLmRhdGF9IDoge307XG4gICAgfVxuXG4gICAgLy8gRm9yIG9sZGVyIHNlcnZlcnMsIGVtdWxhdGUgSFRUUCBieSBtaW1pY2tpbmcgdGhlIEhUVFAgbWV0aG9kIHdpdGggYF9tZXRob2RgXG4gICAgLy8gQW5kIGFuIGBYLUhUVFAtTWV0aG9kLU92ZXJyaWRlYCBoZWFkZXIuXG4gICAgaWYgKG9wdGlvbnMuZW11bGF0ZUhUVFAgJiYgKHR5cGUgPT09ICdQVVQnIHx8IHR5cGUgPT09ICdERUxFVEUnIHx8IHR5cGUgPT09ICdQQVRDSCcpKSB7XG4gICAgICBwYXJhbXMudHlwZSA9ICdQT1NUJztcbiAgICAgIGlmIChvcHRpb25zLmVtdWxhdGVKU09OKSBwYXJhbXMuZGF0YS5fbWV0aG9kID0gdHlwZTtcbiAgICAgIHZhciBiZWZvcmVTZW5kID0gb3B0aW9ucy5iZWZvcmVTZW5kO1xuICAgICAgb3B0aW9ucy5iZWZvcmVTZW5kID0gZnVuY3Rpb24oeGhyKSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdYLUhUVFAtTWV0aG9kLU92ZXJyaWRlJywgdHlwZSk7XG4gICAgICAgIGlmIChiZWZvcmVTZW5kKSByZXR1cm4gYmVmb3JlU2VuZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBEb24ndCBwcm9jZXNzIGRhdGEgb24gYSBub24tR0VUIHJlcXVlc3QuXG4gICAgaWYgKHBhcmFtcy50eXBlICE9PSAnR0VUJyAmJiAhb3B0aW9ucy5lbXVsYXRlSlNPTikge1xuICAgICAgcGFyYW1zLnByb2Nlc3NEYXRhID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUGFzcyBhbG9uZyBgdGV4dFN0YXR1c2AgYW5kIGBlcnJvclRocm93bmAgZnJvbSBqUXVlcnkuXG4gICAgdmFyIGVycm9yID0gb3B0aW9ucy5lcnJvcjtcbiAgICBvcHRpb25zLmVycm9yID0gZnVuY3Rpb24oeGhyLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikge1xuICAgICAgb3B0aW9ucy50ZXh0U3RhdHVzID0gdGV4dFN0YXR1cztcbiAgICAgIG9wdGlvbnMuZXJyb3JUaHJvd24gPSBlcnJvclRocm93bjtcbiAgICAgIGlmIChlcnJvcikgZXJyb3IuY2FsbChvcHRpb25zLmNvbnRleHQsIHhociwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pO1xuICAgIH07XG5cbiAgICAvLyBNYWtlIHRoZSByZXF1ZXN0LCBhbGxvd2luZyB0aGUgdXNlciB0byBvdmVycmlkZSBhbnkgQWpheCBvcHRpb25zLlxuICAgIHZhciB4aHIgPSBvcHRpb25zLnhociA9IEJhY2tib25lLmFqYXgoXy5leHRlbmQocGFyYW1zLCBvcHRpb25zKSk7XG4gICAgbW9kZWwudHJpZ2dlcigncmVxdWVzdCcsIG1vZGVsLCB4aHIsIG9wdGlvbnMpO1xuICAgIHJldHVybiB4aHI7XG4gIH07XG5cbiAgLy8gTWFwIGZyb20gQ1JVRCB0byBIVFRQIGZvciBvdXIgZGVmYXVsdCBgQmFja2JvbmUuc3luY2AgaW1wbGVtZW50YXRpb24uXG4gIHZhciBtZXRob2RNYXAgPSB7XG4gICAgJ2NyZWF0ZSc6ICdQT1NUJyxcbiAgICAndXBkYXRlJzogJ1BVVCcsXG4gICAgJ3BhdGNoJzogJ1BBVENIJyxcbiAgICAnZGVsZXRlJzogJ0RFTEVURScsXG4gICAgJ3JlYWQnOiAnR0VUJ1xuICB9O1xuXG4gIC8vIFNldCB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBgQmFja2JvbmUuYWpheGAgdG8gcHJveHkgdGhyb3VnaCB0byBgJGAuXG4gIC8vIE92ZXJyaWRlIHRoaXMgaWYgeW91J2QgbGlrZSB0byB1c2UgYSBkaWZmZXJlbnQgbGlicmFyeS5cbiAgQmFja2JvbmUuYWpheCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBCYWNrYm9uZS4kLmFqYXguYXBwbHkoQmFja2JvbmUuJCwgYXJndW1lbnRzKTtcbiAgfTtcblxuICAvLyBCYWNrYm9uZS5Sb3V0ZXJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gUm91dGVycyBtYXAgZmF1eC1VUkxzIHRvIGFjdGlvbnMsIGFuZCBmaXJlIGV2ZW50cyB3aGVuIHJvdXRlcyBhcmVcbiAgLy8gbWF0Y2hlZC4gQ3JlYXRpbmcgYSBuZXcgb25lIHNldHMgaXRzIGByb3V0ZXNgIGhhc2gsIGlmIG5vdCBzZXQgc3RhdGljYWxseS5cbiAgdmFyIFJvdXRlciA9IEJhY2tib25lLlJvdXRlciA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zIHx8IChvcHRpb25zID0ge30pO1xuICAgIGlmIChvcHRpb25zLnJvdXRlcykgdGhpcy5yb3V0ZXMgPSBvcHRpb25zLnJvdXRlcztcbiAgICB0aGlzLl9iaW5kUm91dGVzKCk7XG4gICAgdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgLy8gQ2FjaGVkIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIG1hdGNoaW5nIG5hbWVkIHBhcmFtIHBhcnRzIGFuZCBzcGxhdHRlZFxuICAvLyBwYXJ0cyBvZiByb3V0ZSBzdHJpbmdzLlxuICB2YXIgb3B0aW9uYWxQYXJhbSA9IC9cXCgoLio/KVxcKS9nO1xuICB2YXIgbmFtZWRQYXJhbSAgICA9IC8oXFwoXFw/KT86XFx3Ky9nO1xuICB2YXIgc3BsYXRQYXJhbSAgICA9IC9cXCpcXHcrL2c7XG4gIHZhciBlc2NhcGVSZWdFeHAgID0gL1tcXC17fVxcW1xcXSs/LixcXFxcXFxeJHwjXFxzXS9nO1xuXG4gIC8vIFNldCB1cCBhbGwgaW5oZXJpdGFibGUgKipCYWNrYm9uZS5Sb3V0ZXIqKiBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzLlxuICBfLmV4dGVuZChSb3V0ZXIucHJvdG90eXBlLCBFdmVudHMsIHtcblxuICAgIC8vIEluaXRpYWxpemUgaXMgYW4gZW1wdHkgZnVuY3Rpb24gYnkgZGVmYXVsdC4gT3ZlcnJpZGUgaXQgd2l0aCB5b3VyIG93blxuICAgIC8vIGluaXRpYWxpemF0aW9uIGxvZ2ljLlxuICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKCl7fSxcblxuICAgIC8vIE1hbnVhbGx5IGJpbmQgYSBzaW5nbGUgbmFtZWQgcm91dGUgdG8gYSBjYWxsYmFjay4gRm9yIGV4YW1wbGU6XG4gICAgLy9cbiAgICAvLyAgICAgdGhpcy5yb3V0ZSgnc2VhcmNoLzpxdWVyeS9wOm51bScsICdzZWFyY2gnLCBmdW5jdGlvbihxdWVyeSwgbnVtKSB7XG4gICAgLy8gICAgICAgLi4uXG4gICAgLy8gICAgIH0pO1xuICAgIC8vXG4gICAgcm91dGU6IGZ1bmN0aW9uKHJvdXRlLCBuYW1lLCBjYWxsYmFjaykge1xuICAgICAgaWYgKCFfLmlzUmVnRXhwKHJvdXRlKSkgcm91dGUgPSB0aGlzLl9yb3V0ZVRvUmVnRXhwKHJvdXRlKTtcbiAgICAgIGlmIChfLmlzRnVuY3Rpb24obmFtZSkpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBuYW1lO1xuICAgICAgICBuYW1lID0gJyc7XG4gICAgICB9XG4gICAgICBpZiAoIWNhbGxiYWNrKSBjYWxsYmFjayA9IHRoaXNbbmFtZV07XG4gICAgICB2YXIgcm91dGVyID0gdGhpcztcbiAgICAgIEJhY2tib25lLmhpc3Rvcnkucm91dGUocm91dGUsIGZ1bmN0aW9uKGZyYWdtZW50KSB7XG4gICAgICAgIHZhciBhcmdzID0gcm91dGVyLl9leHRyYWN0UGFyYW1ldGVycyhyb3V0ZSwgZnJhZ21lbnQpO1xuICAgICAgICBpZiAocm91dGVyLmV4ZWN1dGUoY2FsbGJhY2ssIGFyZ3MsIG5hbWUpICE9PSBmYWxzZSkge1xuICAgICAgICAgIHJvdXRlci50cmlnZ2VyLmFwcGx5KHJvdXRlciwgWydyb3V0ZTonICsgbmFtZV0uY29uY2F0KGFyZ3MpKTtcbiAgICAgICAgICByb3V0ZXIudHJpZ2dlcigncm91dGUnLCBuYW1lLCBhcmdzKTtcbiAgICAgICAgICBCYWNrYm9uZS5oaXN0b3J5LnRyaWdnZXIoJ3JvdXRlJywgcm91dGVyLCBuYW1lLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLy8gRXhlY3V0ZSBhIHJvdXRlIGhhbmRsZXIgd2l0aCB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy4gIFRoaXMgaXMgYW5cbiAgICAvLyBleGNlbGxlbnQgcGxhY2UgdG8gZG8gcHJlLXJvdXRlIHNldHVwIG9yIHBvc3Qtcm91dGUgY2xlYW51cC5cbiAgICBleGVjdXRlOiBmdW5jdGlvbihjYWxsYmFjaywgYXJncywgbmFtZSkge1xuICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9LFxuXG4gICAgLy8gU2ltcGxlIHByb3h5IHRvIGBCYWNrYm9uZS5oaXN0b3J5YCB0byBzYXZlIGEgZnJhZ21lbnQgaW50byB0aGUgaGlzdG9yeS5cbiAgICBuYXZpZ2F0ZTogZnVuY3Rpb24oZnJhZ21lbnQsIG9wdGlvbnMpIHtcbiAgICAgIEJhY2tib25lLmhpc3RvcnkubmF2aWdhdGUoZnJhZ21lbnQsIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8vIEJpbmQgYWxsIGRlZmluZWQgcm91dGVzIHRvIGBCYWNrYm9uZS5oaXN0b3J5YC4gV2UgaGF2ZSB0byByZXZlcnNlIHRoZVxuICAgIC8vIG9yZGVyIG9mIHRoZSByb3V0ZXMgaGVyZSB0byBzdXBwb3J0IGJlaGF2aW9yIHdoZXJlIHRoZSBtb3N0IGdlbmVyYWxcbiAgICAvLyByb3V0ZXMgY2FuIGJlIGRlZmluZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcm91dGUgbWFwLlxuICAgIF9iaW5kUm91dGVzOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghdGhpcy5yb3V0ZXMpIHJldHVybjtcbiAgICAgIHRoaXMucm91dGVzID0gXy5yZXN1bHQodGhpcywgJ3JvdXRlcycpO1xuICAgICAgdmFyIHJvdXRlLCByb3V0ZXMgPSBfLmtleXModGhpcy5yb3V0ZXMpO1xuICAgICAgd2hpbGUgKChyb3V0ZSA9IHJvdXRlcy5wb3AoKSkgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnJvdXRlKHJvdXRlLCB0aGlzLnJvdXRlc1tyb3V0ZV0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBDb252ZXJ0IGEgcm91dGUgc3RyaW5nIGludG8gYSByZWd1bGFyIGV4cHJlc3Npb24sIHN1aXRhYmxlIGZvciBtYXRjaGluZ1xuICAgIC8vIGFnYWluc3QgdGhlIGN1cnJlbnQgbG9jYXRpb24gaGFzaC5cbiAgICBfcm91dGVUb1JlZ0V4cDogZnVuY3Rpb24ocm91dGUpIHtcbiAgICAgIHJvdXRlID0gcm91dGUucmVwbGFjZShlc2NhcGVSZWdFeHAsICdcXFxcJCYnKVxuICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKG9wdGlvbmFsUGFyYW0sICcoPzokMSk/JylcbiAgICAgICAgICAgICAgICAgICAucmVwbGFjZShuYW1lZFBhcmFtLCBmdW5jdGlvbihtYXRjaCwgb3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25hbCA/IG1hdGNoIDogJyhbXi8/XSspJztcbiAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKHNwbGF0UGFyYW0sICcoW14/XSo/KScpO1xuICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoJ14nICsgcm91dGUgKyAnKD86XFxcXD8oW1xcXFxzXFxcXFNdKikpPyQnKTtcbiAgICB9LFxuXG4gICAgLy8gR2l2ZW4gYSByb3V0ZSwgYW5kIGEgVVJMIGZyYWdtZW50IHRoYXQgaXQgbWF0Y2hlcywgcmV0dXJuIHRoZSBhcnJheSBvZlxuICAgIC8vIGV4dHJhY3RlZCBkZWNvZGVkIHBhcmFtZXRlcnMuIEVtcHR5IG9yIHVubWF0Y2hlZCBwYXJhbWV0ZXJzIHdpbGwgYmVcbiAgICAvLyB0cmVhdGVkIGFzIGBudWxsYCB0byBub3JtYWxpemUgY3Jvc3MtYnJvd3NlciBiZWhhdmlvci5cbiAgICBfZXh0cmFjdFBhcmFtZXRlcnM6IGZ1bmN0aW9uKHJvdXRlLCBmcmFnbWVudCkge1xuICAgICAgdmFyIHBhcmFtcyA9IHJvdXRlLmV4ZWMoZnJhZ21lbnQpLnNsaWNlKDEpO1xuICAgICAgcmV0dXJuIF8ubWFwKHBhcmFtcywgZnVuY3Rpb24ocGFyYW0sIGkpIHtcbiAgICAgICAgLy8gRG9uJ3QgZGVjb2RlIHRoZSBzZWFyY2ggcGFyYW1zLlxuICAgICAgICBpZiAoaSA9PT0gcGFyYW1zLmxlbmd0aCAtIDEpIHJldHVybiBwYXJhbSB8fCBudWxsO1xuICAgICAgICByZXR1cm4gcGFyYW0gPyBkZWNvZGVVUklDb21wb25lbnQocGFyYW0pIDogbnVsbDtcbiAgICAgIH0pO1xuICAgIH1cblxuICB9KTtcblxuICAvLyBCYWNrYm9uZS5IaXN0b3J5XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBIYW5kbGVzIGNyb3NzLWJyb3dzZXIgaGlzdG9yeSBtYW5hZ2VtZW50LCBiYXNlZCBvbiBlaXRoZXJcbiAgLy8gW3B1c2hTdGF0ZV0oaHR0cDovL2RpdmVpbnRvaHRtbDUuaW5mby9oaXN0b3J5Lmh0bWwpIGFuZCByZWFsIFVSTHMsIG9yXG4gIC8vIFtvbmhhc2hjaGFuZ2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvRE9NL3dpbmRvdy5vbmhhc2hjaGFuZ2UpXG4gIC8vIGFuZCBVUkwgZnJhZ21lbnRzLiBJZiB0aGUgYnJvd3NlciBzdXBwb3J0cyBuZWl0aGVyIChvbGQgSUUsIG5hdGNoKSxcbiAgLy8gZmFsbHMgYmFjayB0byBwb2xsaW5nLlxuICB2YXIgSGlzdG9yeSA9IEJhY2tib25lLkhpc3RvcnkgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmhhbmRsZXJzID0gW107XG4gICAgdGhpcy5jaGVja1VybCA9IF8uYmluZCh0aGlzLmNoZWNrVXJsLCB0aGlzKTtcblxuICAgIC8vIEVuc3VyZSB0aGF0IGBIaXN0b3J5YCBjYW4gYmUgdXNlZCBvdXRzaWRlIG9mIHRoZSBicm93c2VyLlxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5sb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjtcbiAgICAgIHRoaXMuaGlzdG9yeSA9IHdpbmRvdy5oaXN0b3J5O1xuICAgIH1cbiAgfTtcblxuICAvLyBDYWNoZWQgcmVnZXggZm9yIHN0cmlwcGluZyBhIGxlYWRpbmcgaGFzaC9zbGFzaCBhbmQgdHJhaWxpbmcgc3BhY2UuXG4gIHZhciByb3V0ZVN0cmlwcGVyID0gL15bI1xcL118XFxzKyQvZztcblxuICAvLyBDYWNoZWQgcmVnZXggZm9yIHN0cmlwcGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzLlxuICB2YXIgcm9vdFN0cmlwcGVyID0gL15cXC8rfFxcLyskL2c7XG5cbiAgLy8gQ2FjaGVkIHJlZ2V4IGZvciBzdHJpcHBpbmcgdXJscyBvZiBoYXNoLlxuICB2YXIgcGF0aFN0cmlwcGVyID0gLyMuKiQvO1xuXG4gIC8vIEhhcyB0aGUgaGlzdG9yeSBoYW5kbGluZyBhbHJlYWR5IGJlZW4gc3RhcnRlZD9cbiAgSGlzdG9yeS5zdGFydGVkID0gZmFsc2U7XG5cbiAgLy8gU2V0IHVwIGFsbCBpbmhlcml0YWJsZSAqKkJhY2tib25lLkhpc3RvcnkqKiBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzLlxuICBfLmV4dGVuZChIaXN0b3J5LnByb3RvdHlwZSwgRXZlbnRzLCB7XG5cbiAgICAvLyBUaGUgZGVmYXVsdCBpbnRlcnZhbCB0byBwb2xsIGZvciBoYXNoIGNoYW5nZXMsIGlmIG5lY2Vzc2FyeSwgaXNcbiAgICAvLyB0d2VudHkgdGltZXMgYSBzZWNvbmQuXG4gICAgaW50ZXJ2YWw6IDUwLFxuXG4gICAgLy8gQXJlIHdlIGF0IHRoZSBhcHAgcm9vdD9cbiAgICBhdFJvb3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHBhdGggPSB0aGlzLmxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoL1teXFwvXSQvLCAnJCYvJyk7XG4gICAgICByZXR1cm4gcGF0aCA9PT0gdGhpcy5yb290ICYmICF0aGlzLmdldFNlYXJjaCgpO1xuICAgIH0sXG5cbiAgICAvLyBEb2VzIHRoZSBwYXRobmFtZSBtYXRjaCB0aGUgcm9vdD9cbiAgICBtYXRjaFJvb3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHBhdGggPSB0aGlzLmRlY29kZUZyYWdtZW50KHRoaXMubG9jYXRpb24ucGF0aG5hbWUpO1xuICAgICAgdmFyIHJvb3RQYXRoID0gcGF0aC5zbGljZSgwLCB0aGlzLnJvb3QubGVuZ3RoIC0gMSkgKyAnLyc7XG4gICAgICByZXR1cm4gcm9vdFBhdGggPT09IHRoaXMucm9vdDtcbiAgICB9LFxuXG4gICAgLy8gVW5pY29kZSBjaGFyYWN0ZXJzIGluIGBsb2NhdGlvbi5wYXRobmFtZWAgYXJlIHBlcmNlbnQgZW5jb2RlZCBzbyB0aGV5J3JlXG4gICAgLy8gZGVjb2RlZCBmb3IgY29tcGFyaXNvbi4gYCUyNWAgc2hvdWxkIG5vdCBiZSBkZWNvZGVkIHNpbmNlIGl0IG1heSBiZSBwYXJ0XG4gICAgLy8gb2YgYW4gZW5jb2RlZCBwYXJhbWV0ZXIuXG4gICAgZGVjb2RlRnJhZ21lbnQ6IGZ1bmN0aW9uKGZyYWdtZW50KSB7XG4gICAgICByZXR1cm4gZGVjb2RlVVJJKGZyYWdtZW50LnJlcGxhY2UoLyUyNS9nLCAnJTI1MjUnKSk7XG4gICAgfSxcblxuICAgIC8vIEluIElFNiwgdGhlIGhhc2ggZnJhZ21lbnQgYW5kIHNlYXJjaCBwYXJhbXMgYXJlIGluY29ycmVjdCBpZiB0aGVcbiAgICAvLyBmcmFnbWVudCBjb250YWlucyBgP2AuXG4gICAgZ2V0U2VhcmNoOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBtYXRjaCA9IHRoaXMubG9jYXRpb24uaHJlZi5yZXBsYWNlKC8jLiovLCAnJykubWF0Y2goL1xcPy4rLyk7XG4gICAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFswXSA6ICcnO1xuICAgIH0sXG5cbiAgICAvLyBHZXRzIHRoZSB0cnVlIGhhc2ggdmFsdWUuIENhbm5vdCB1c2UgbG9jYXRpb24uaGFzaCBkaXJlY3RseSBkdWUgdG8gYnVnXG4gICAgLy8gaW4gRmlyZWZveCB3aGVyZSBsb2NhdGlvbi5oYXNoIHdpbGwgYWx3YXlzIGJlIGRlY29kZWQuXG4gICAgZ2V0SGFzaDogZnVuY3Rpb24od2luZG93KSB7XG4gICAgICB2YXIgbWF0Y2ggPSAod2luZG93IHx8IHRoaXMpLmxvY2F0aW9uLmhyZWYubWF0Y2goLyMoLiopJC8pO1xuICAgICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiAnJztcbiAgICB9LFxuXG4gICAgLy8gR2V0IHRoZSBwYXRobmFtZSBhbmQgc2VhcmNoIHBhcmFtcywgd2l0aG91dCB0aGUgcm9vdC5cbiAgICBnZXRQYXRoOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBwYXRoID0gdGhpcy5kZWNvZGVGcmFnbWVudChcbiAgICAgICAgdGhpcy5sb2NhdGlvbi5wYXRobmFtZSArIHRoaXMuZ2V0U2VhcmNoKClcbiAgICAgICkuc2xpY2UodGhpcy5yb290Lmxlbmd0aCAtIDEpO1xuICAgICAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLycgPyBwYXRoLnNsaWNlKDEpIDogcGF0aDtcbiAgICB9LFxuXG4gICAgLy8gR2V0IHRoZSBjcm9zcy1icm93c2VyIG5vcm1hbGl6ZWQgVVJMIGZyYWdtZW50IGZyb20gdGhlIHBhdGggb3IgaGFzaC5cbiAgICBnZXRGcmFnbWVudDogZnVuY3Rpb24oZnJhZ21lbnQpIHtcbiAgICAgIGlmIChmcmFnbWVudCA9PSBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLl91c2VQdXNoU3RhdGUgfHwgIXRoaXMuX3dhbnRzSGFzaENoYW5nZSkge1xuICAgICAgICAgIGZyYWdtZW50ID0gdGhpcy5nZXRQYXRoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZnJhZ21lbnQgPSB0aGlzLmdldEhhc2goKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZyYWdtZW50LnJlcGxhY2Uocm91dGVTdHJpcHBlciwgJycpO1xuICAgIH0sXG5cbiAgICAvLyBTdGFydCB0aGUgaGFzaCBjaGFuZ2UgaGFuZGxpbmcsIHJldHVybmluZyBgdHJ1ZWAgaWYgdGhlIGN1cnJlbnQgVVJMIG1hdGNoZXNcbiAgICAvLyBhbiBleGlzdGluZyByb3V0ZSwgYW5kIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgIHN0YXJ0OiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICBpZiAoSGlzdG9yeS5zdGFydGVkKSB0aHJvdyBuZXcgRXJyb3IoJ0JhY2tib25lLmhpc3RvcnkgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkJyk7XG4gICAgICBIaXN0b3J5LnN0YXJ0ZWQgPSB0cnVlO1xuXG4gICAgICAvLyBGaWd1cmUgb3V0IHRoZSBpbml0aWFsIGNvbmZpZ3VyYXRpb24uIERvIHdlIG5lZWQgYW4gaWZyYW1lP1xuICAgICAgLy8gSXMgcHVzaFN0YXRlIGRlc2lyZWQgLi4uIGlzIGl0IGF2YWlsYWJsZT9cbiAgICAgIHRoaXMub3B0aW9ucyAgICAgICAgICA9IF8uZXh0ZW5kKHtyb290OiAnLyd9LCB0aGlzLm9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgdGhpcy5yb290ICAgICAgICAgICAgID0gdGhpcy5vcHRpb25zLnJvb3Q7XG4gICAgICB0aGlzLl93YW50c0hhc2hDaGFuZ2UgPSB0aGlzLm9wdGlvbnMuaGFzaENoYW5nZSAhPT0gZmFsc2U7XG4gICAgICB0aGlzLl9oYXNIYXNoQ2hhbmdlICAgPSAnb25oYXNoY2hhbmdlJyBpbiB3aW5kb3cgJiYgKGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PT0gdm9pZCAwIHx8IGRvY3VtZW50LmRvY3VtZW50TW9kZSA+IDcpO1xuICAgICAgdGhpcy5fdXNlSGFzaENoYW5nZSAgID0gdGhpcy5fd2FudHNIYXNoQ2hhbmdlICYmIHRoaXMuX2hhc0hhc2hDaGFuZ2U7XG4gICAgICB0aGlzLl93YW50c1B1c2hTdGF0ZSAgPSAhIXRoaXMub3B0aW9ucy5wdXNoU3RhdGU7XG4gICAgICB0aGlzLl9oYXNQdXNoU3RhdGUgICAgPSAhISh0aGlzLmhpc3RvcnkgJiYgdGhpcy5oaXN0b3J5LnB1c2hTdGF0ZSk7XG4gICAgICB0aGlzLl91c2VQdXNoU3RhdGUgICAgPSB0aGlzLl93YW50c1B1c2hTdGF0ZSAmJiB0aGlzLl9oYXNQdXNoU3RhdGU7XG4gICAgICB0aGlzLmZyYWdtZW50ICAgICAgICAgPSB0aGlzLmdldEZyYWdtZW50KCk7XG5cbiAgICAgIC8vIE5vcm1hbGl6ZSByb290IHRvIGFsd2F5cyBpbmNsdWRlIGEgbGVhZGluZyBhbmQgdHJhaWxpbmcgc2xhc2guXG4gICAgICB0aGlzLnJvb3QgPSAoJy8nICsgdGhpcy5yb290ICsgJy8nKS5yZXBsYWNlKHJvb3RTdHJpcHBlciwgJy8nKTtcblxuICAgICAgLy8gVHJhbnNpdGlvbiBmcm9tIGhhc2hDaGFuZ2UgdG8gcHVzaFN0YXRlIG9yIHZpY2UgdmVyc2EgaWYgYm90aCBhcmVcbiAgICAgIC8vIHJlcXVlc3RlZC5cbiAgICAgIGlmICh0aGlzLl93YW50c0hhc2hDaGFuZ2UgJiYgdGhpcy5fd2FudHNQdXNoU3RhdGUpIHtcblxuICAgICAgICAvLyBJZiB3ZSd2ZSBzdGFydGVkIG9mZiB3aXRoIGEgcm91dGUgZnJvbSBhIGBwdXNoU3RhdGVgLWVuYWJsZWRcbiAgICAgICAgLy8gYnJvd3NlciwgYnV0IHdlJ3JlIGN1cnJlbnRseSBpbiBhIGJyb3dzZXIgdGhhdCBkb2Vzbid0IHN1cHBvcnQgaXQuLi5cbiAgICAgICAgaWYgKCF0aGlzLl9oYXNQdXNoU3RhdGUgJiYgIXRoaXMuYXRSb290KCkpIHtcbiAgICAgICAgICB2YXIgcm9vdFBhdGggPSB0aGlzLnJvb3Quc2xpY2UoMCwgLTEpIHx8ICcvJztcbiAgICAgICAgICB0aGlzLmxvY2F0aW9uLnJlcGxhY2Uocm9vdFBhdGggKyAnIycgKyB0aGlzLmdldFBhdGgoKSk7XG4gICAgICAgICAgLy8gUmV0dXJuIGltbWVkaWF0ZWx5IGFzIGJyb3dzZXIgd2lsbCBkbyByZWRpcmVjdCB0byBuZXcgdXJsXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgLy8gT3IgaWYgd2UndmUgc3RhcnRlZCBvdXQgd2l0aCBhIGhhc2gtYmFzZWQgcm91dGUsIGJ1dCB3ZSdyZSBjdXJyZW50bHlcbiAgICAgICAgLy8gaW4gYSBicm93c2VyIHdoZXJlIGl0IGNvdWxkIGJlIGBwdXNoU3RhdGVgLWJhc2VkIGluc3RlYWQuLi5cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9oYXNQdXNoU3RhdGUgJiYgdGhpcy5hdFJvb3QoKSkge1xuICAgICAgICAgIHRoaXMubmF2aWdhdGUodGhpcy5nZXRIYXNoKCksIHtyZXBsYWNlOiB0cnVlfSk7XG4gICAgICAgIH1cblxuICAgICAgfVxuXG4gICAgICAvLyBQcm94eSBhbiBpZnJhbWUgdG8gaGFuZGxlIGxvY2F0aW9uIGV2ZW50cyBpZiB0aGUgYnJvd3NlciBkb2Vzbid0XG4gICAgICAvLyBzdXBwb3J0IHRoZSBgaGFzaGNoYW5nZWAgZXZlbnQsIEhUTUw1IGhpc3RvcnksIG9yIHRoZSB1c2VyIHdhbnRzXG4gICAgICAvLyBgaGFzaENoYW5nZWAgYnV0IG5vdCBgcHVzaFN0YXRlYC5cbiAgICAgIGlmICghdGhpcy5faGFzSGFzaENoYW5nZSAmJiB0aGlzLl93YW50c0hhc2hDaGFuZ2UgJiYgIXRoaXMuX3VzZVB1c2hTdGF0ZSkge1xuICAgICAgICB0aGlzLmlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICB0aGlzLmlmcmFtZS5zcmMgPSAnamF2YXNjcmlwdDowJztcbiAgICAgICAgdGhpcy5pZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgdGhpcy5pZnJhbWUudGFiSW5kZXggPSAtMTtcbiAgICAgICAgdmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICAvLyBVc2luZyBgYXBwZW5kQ2hpbGRgIHdpbGwgdGhyb3cgb24gSUUgPCA5IGlmIHRoZSBkb2N1bWVudCBpcyBub3QgcmVhZHkuXG4gICAgICAgIHZhciBpV2luZG93ID0gYm9keS5pbnNlcnRCZWZvcmUodGhpcy5pZnJhbWUsIGJvZHkuZmlyc3RDaGlsZCkuY29udGVudFdpbmRvdztcbiAgICAgICAgaVdpbmRvdy5kb2N1bWVudC5vcGVuKCk7XG4gICAgICAgIGlXaW5kb3cuZG9jdW1lbnQuY2xvc2UoKTtcbiAgICAgICAgaVdpbmRvdy5sb2NhdGlvbi5oYXNoID0gJyMnICsgdGhpcy5mcmFnbWVudDtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGEgY3Jvc3MtcGxhdGZvcm0gYGFkZEV2ZW50TGlzdGVuZXJgIHNoaW0gZm9yIG9sZGVyIGJyb3dzZXJzLlxuICAgICAgdmFyIGFkZEV2ZW50TGlzdGVuZXIgPSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciB8fCBmdW5jdGlvbihldmVudE5hbWUsIGxpc3RlbmVyKSB7XG4gICAgICAgIHJldHVybiBhdHRhY2hFdmVudCgnb24nICsgZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgICB9O1xuXG4gICAgICAvLyBEZXBlbmRpbmcgb24gd2hldGhlciB3ZSdyZSB1c2luZyBwdXNoU3RhdGUgb3IgaGFzaGVzLCBhbmQgd2hldGhlclxuICAgICAgLy8gJ29uaGFzaGNoYW5nZScgaXMgc3VwcG9ydGVkLCBkZXRlcm1pbmUgaG93IHdlIGNoZWNrIHRoZSBVUkwgc3RhdGUuXG4gICAgICBpZiAodGhpcy5fdXNlUHVzaFN0YXRlKSB7XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoJ3BvcHN0YXRlJywgdGhpcy5jaGVja1VybCwgZmFsc2UpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl91c2VIYXNoQ2hhbmdlICYmICF0aGlzLmlmcmFtZSkge1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJywgdGhpcy5jaGVja1VybCwgZmFsc2UpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl93YW50c0hhc2hDaGFuZ2UpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tVcmxJbnRlcnZhbCA9IHNldEludGVydmFsKHRoaXMuY2hlY2tVcmwsIHRoaXMuaW50ZXJ2YWwpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5zaWxlbnQpIHJldHVybiB0aGlzLmxvYWRVcmwoKTtcbiAgICB9LFxuXG4gICAgLy8gRGlzYWJsZSBCYWNrYm9uZS5oaXN0b3J5LCBwZXJoYXBzIHRlbXBvcmFyaWx5LiBOb3QgdXNlZnVsIGluIGEgcmVhbCBhcHAsXG4gICAgLy8gYnV0IHBvc3NpYmx5IHVzZWZ1bCBmb3IgdW5pdCB0ZXN0aW5nIFJvdXRlcnMuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICAvLyBBZGQgYSBjcm9zcy1wbGF0Zm9ybSBgcmVtb3ZlRXZlbnRMaXN0ZW5lcmAgc2hpbSBmb3Igb2xkZXIgYnJvd3NlcnMuXG4gICAgICB2YXIgcmVtb3ZlRXZlbnRMaXN0ZW5lciA9IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyIHx8IGZ1bmN0aW9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIGRldGFjaEV2ZW50KCdvbicgKyBldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFJlbW92ZSB3aW5kb3cgbGlzdGVuZXJzLlxuICAgICAgaWYgKHRoaXMuX3VzZVB1c2hTdGF0ZSkge1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsIHRoaXMuY2hlY2tVcmwsIGZhbHNlKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fdXNlSGFzaENoYW5nZSAmJiAhdGhpcy5pZnJhbWUpIHtcbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIHRoaXMuY2hlY2tVcmwsIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYW4gdXAgdGhlIGlmcmFtZSBpZiBuZWNlc3NhcnkuXG4gICAgICBpZiAodGhpcy5pZnJhbWUpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLmlmcmFtZSk7XG4gICAgICAgIHRoaXMuaWZyYW1lID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gU29tZSBlbnZpcm9ubWVudHMgd2lsbCB0aHJvdyB3aGVuIGNsZWFyaW5nIGFuIHVuZGVmaW5lZCBpbnRlcnZhbC5cbiAgICAgIGlmICh0aGlzLl9jaGVja1VybEludGVydmFsKSBjbGVhckludGVydmFsKHRoaXMuX2NoZWNrVXJsSW50ZXJ2YWwpO1xuICAgICAgSGlzdG9yeS5zdGFydGVkID0gZmFsc2U7XG4gICAgfSxcblxuICAgIC8vIEFkZCBhIHJvdXRlIHRvIGJlIHRlc3RlZCB3aGVuIHRoZSBmcmFnbWVudCBjaGFuZ2VzLiBSb3V0ZXMgYWRkZWQgbGF0ZXJcbiAgICAvLyBtYXkgb3ZlcnJpZGUgcHJldmlvdXMgcm91dGVzLlxuICAgIHJvdXRlOiBmdW5jdGlvbihyb3V0ZSwgY2FsbGJhY2spIHtcbiAgICAgIHRoaXMuaGFuZGxlcnMudW5zaGlmdCh7cm91dGU6IHJvdXRlLCBjYWxsYmFjazogY2FsbGJhY2t9KTtcbiAgICB9LFxuXG4gICAgLy8gQ2hlY2tzIHRoZSBjdXJyZW50IFVSTCB0byBzZWUgaWYgaXQgaGFzIGNoYW5nZWQsIGFuZCBpZiBpdCBoYXMsXG4gICAgLy8gY2FsbHMgYGxvYWRVcmxgLCBub3JtYWxpemluZyBhY3Jvc3MgdGhlIGhpZGRlbiBpZnJhbWUuXG4gICAgY2hlY2tVcmw6IGZ1bmN0aW9uKGUpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5nZXRGcmFnbWVudCgpO1xuXG4gICAgICAvLyBJZiB0aGUgdXNlciBwcmVzc2VkIHRoZSBiYWNrIGJ1dHRvbiwgdGhlIGlmcmFtZSdzIGhhc2ggd2lsbCBoYXZlXG4gICAgICAvLyBjaGFuZ2VkIGFuZCB3ZSBzaG91bGQgdXNlIHRoYXQgZm9yIGNvbXBhcmlzb24uXG4gICAgICBpZiAoY3VycmVudCA9PT0gdGhpcy5mcmFnbWVudCAmJiB0aGlzLmlmcmFtZSkge1xuICAgICAgICBjdXJyZW50ID0gdGhpcy5nZXRIYXNoKHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3VycmVudCA9PT0gdGhpcy5mcmFnbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHRoaXMuaWZyYW1lKSB0aGlzLm5hdmlnYXRlKGN1cnJlbnQpO1xuICAgICAgdGhpcy5sb2FkVXJsKCk7XG4gICAgfSxcblxuICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgY3VycmVudCBVUkwgZnJhZ21lbnQuIElmIGEgcm91dGUgc3VjY2VlZHMgd2l0aCBhXG4gICAgLy8gbWF0Y2gsIHJldHVybnMgYHRydWVgLiBJZiBubyBkZWZpbmVkIHJvdXRlcyBtYXRjaGVzIHRoZSBmcmFnbWVudCxcbiAgICAvLyByZXR1cm5zIGBmYWxzZWAuXG4gICAgbG9hZFVybDogZnVuY3Rpb24oZnJhZ21lbnQpIHtcbiAgICAgIC8vIElmIHRoZSByb290IGRvZXNuJ3QgbWF0Y2gsIG5vIHJvdXRlcyBjYW4gbWF0Y2ggZWl0aGVyLlxuICAgICAgaWYgKCF0aGlzLm1hdGNoUm9vdCgpKSByZXR1cm4gZmFsc2U7XG4gICAgICBmcmFnbWVudCA9IHRoaXMuZnJhZ21lbnQgPSB0aGlzLmdldEZyYWdtZW50KGZyYWdtZW50KTtcbiAgICAgIHJldHVybiBfLnNvbWUodGhpcy5oYW5kbGVycywgZnVuY3Rpb24oaGFuZGxlcikge1xuICAgICAgICBpZiAoaGFuZGxlci5yb3V0ZS50ZXN0KGZyYWdtZW50KSkge1xuICAgICAgICAgIGhhbmRsZXIuY2FsbGJhY2soZnJhZ21lbnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gU2F2ZSBhIGZyYWdtZW50IGludG8gdGhlIGhhc2ggaGlzdG9yeSwgb3IgcmVwbGFjZSB0aGUgVVJMIHN0YXRlIGlmIHRoZVxuICAgIC8vICdyZXBsYWNlJyBvcHRpb24gaXMgcGFzc2VkLiBZb3UgYXJlIHJlc3BvbnNpYmxlIGZvciBwcm9wZXJseSBVUkwtZW5jb2RpbmdcbiAgICAvLyB0aGUgZnJhZ21lbnQgaW4gYWR2YW5jZS5cbiAgICAvL1xuICAgIC8vIFRoZSBvcHRpb25zIG9iamVjdCBjYW4gY29udGFpbiBgdHJpZ2dlcjogdHJ1ZWAgaWYgeW91IHdpc2ggdG8gaGF2ZSB0aGVcbiAgICAvLyByb3V0ZSBjYWxsYmFjayBiZSBmaXJlZCAobm90IHVzdWFsbHkgZGVzaXJhYmxlKSwgb3IgYHJlcGxhY2U6IHRydWVgLCBpZlxuICAgIC8vIHlvdSB3aXNoIHRvIG1vZGlmeSB0aGUgY3VycmVudCBVUkwgd2l0aG91dCBhZGRpbmcgYW4gZW50cnkgdG8gdGhlIGhpc3RvcnkuXG4gICAgbmF2aWdhdGU6IGZ1bmN0aW9uKGZyYWdtZW50LCBvcHRpb25zKSB7XG4gICAgICBpZiAoIUhpc3Rvcnkuc3RhcnRlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMgPT09IHRydWUpIG9wdGlvbnMgPSB7dHJpZ2dlcjogISFvcHRpb25zfTtcblxuICAgICAgLy8gTm9ybWFsaXplIHRoZSBmcmFnbWVudC5cbiAgICAgIGZyYWdtZW50ID0gdGhpcy5nZXRGcmFnbWVudChmcmFnbWVudCB8fCAnJyk7XG5cbiAgICAgIC8vIERvbid0IGluY2x1ZGUgYSB0cmFpbGluZyBzbGFzaCBvbiB0aGUgcm9vdC5cbiAgICAgIHZhciByb290UGF0aCA9IHRoaXMucm9vdDtcbiAgICAgIGlmIChmcmFnbWVudCA9PT0gJycgfHwgZnJhZ21lbnQuY2hhckF0KDApID09PSAnPycpIHtcbiAgICAgICAgcm9vdFBhdGggPSByb290UGF0aC5zbGljZSgwLCAtMSkgfHwgJy8nO1xuICAgICAgfVxuICAgICAgdmFyIHVybCA9IHJvb3RQYXRoICsgZnJhZ21lbnQ7XG5cbiAgICAgIC8vIFN0cmlwIHRoZSBoYXNoIGFuZCBkZWNvZGUgZm9yIG1hdGNoaW5nLlxuICAgICAgZnJhZ21lbnQgPSB0aGlzLmRlY29kZUZyYWdtZW50KGZyYWdtZW50LnJlcGxhY2UocGF0aFN0cmlwcGVyLCAnJykpO1xuXG4gICAgICBpZiAodGhpcy5mcmFnbWVudCA9PT0gZnJhZ21lbnQpIHJldHVybjtcbiAgICAgIHRoaXMuZnJhZ21lbnQgPSBmcmFnbWVudDtcblxuICAgICAgLy8gSWYgcHVzaFN0YXRlIGlzIGF2YWlsYWJsZSwgd2UgdXNlIGl0IHRvIHNldCB0aGUgZnJhZ21lbnQgYXMgYSByZWFsIFVSTC5cbiAgICAgIGlmICh0aGlzLl91c2VQdXNoU3RhdGUpIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5W29wdGlvbnMucmVwbGFjZSA/ICdyZXBsYWNlU3RhdGUnIDogJ3B1c2hTdGF0ZSddKHt9LCBkb2N1bWVudC50aXRsZSwgdXJsKTtcblxuICAgICAgLy8gSWYgaGFzaCBjaGFuZ2VzIGhhdmVuJ3QgYmVlbiBleHBsaWNpdGx5IGRpc2FibGVkLCB1cGRhdGUgdGhlIGhhc2hcbiAgICAgIC8vIGZyYWdtZW50IHRvIHN0b3JlIGhpc3RvcnkuXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3dhbnRzSGFzaENoYW5nZSkge1xuICAgICAgICB0aGlzLl91cGRhdGVIYXNoKHRoaXMubG9jYXRpb24sIGZyYWdtZW50LCBvcHRpb25zLnJlcGxhY2UpO1xuICAgICAgICBpZiAodGhpcy5pZnJhbWUgJiYgZnJhZ21lbnQgIT09IHRoaXMuZ2V0SGFzaCh0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSkge1xuICAgICAgICAgIHZhciBpV2luZG93ID0gdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdztcblxuICAgICAgICAgIC8vIE9wZW5pbmcgYW5kIGNsb3NpbmcgdGhlIGlmcmFtZSB0cmlja3MgSUU3IGFuZCBlYXJsaWVyIHRvIHB1c2ggYVxuICAgICAgICAgIC8vIGhpc3RvcnkgZW50cnkgb24gaGFzaC10YWcgY2hhbmdlLiAgV2hlbiByZXBsYWNlIGlzIHRydWUsIHdlIGRvbid0XG4gICAgICAgICAgLy8gd2FudCB0aGlzLlxuICAgICAgICAgIGlmICghb3B0aW9ucy5yZXBsYWNlKSB7XG4gICAgICAgICAgICBpV2luZG93LmRvY3VtZW50Lm9wZW4oKTtcbiAgICAgICAgICAgIGlXaW5kb3cuZG9jdW1lbnQuY2xvc2UoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl91cGRhdGVIYXNoKGlXaW5kb3cubG9jYXRpb24sIGZyYWdtZW50LCBvcHRpb25zLnJlcGxhY2UpO1xuICAgICAgICB9XG5cbiAgICAgIC8vIElmIHlvdSd2ZSB0b2xkIHVzIHRoYXQgeW91IGV4cGxpY2l0bHkgZG9uJ3Qgd2FudCBmYWxsYmFjayBoYXNoY2hhbmdlLVxuICAgICAgLy8gYmFzZWQgaGlzdG9yeSwgdGhlbiBgbmF2aWdhdGVgIGJlY29tZXMgYSBwYWdlIHJlZnJlc2guXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhdGlvbi5hc3NpZ24odXJsKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnRyaWdnZXIpIHJldHVybiB0aGlzLmxvYWRVcmwoZnJhZ21lbnQpO1xuICAgIH0sXG5cbiAgICAvLyBVcGRhdGUgdGhlIGhhc2ggbG9jYXRpb24sIGVpdGhlciByZXBsYWNpbmcgdGhlIGN1cnJlbnQgZW50cnksIG9yIGFkZGluZ1xuICAgIC8vIGEgbmV3IG9uZSB0byB0aGUgYnJvd3NlciBoaXN0b3J5LlxuICAgIF91cGRhdGVIYXNoOiBmdW5jdGlvbihsb2NhdGlvbiwgZnJhZ21lbnQsIHJlcGxhY2UpIHtcbiAgICAgIGlmIChyZXBsYWNlKSB7XG4gICAgICAgIHZhciBocmVmID0gbG9jYXRpb24uaHJlZi5yZXBsYWNlKC8oamF2YXNjcmlwdDp8IykuKiQvLCAnJyk7XG4gICAgICAgIGxvY2F0aW9uLnJlcGxhY2UoaHJlZiArICcjJyArIGZyYWdtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNvbWUgYnJvd3NlcnMgcmVxdWlyZSB0aGF0IGBoYXNoYCBjb250YWlucyBhIGxlYWRpbmcgIy5cbiAgICAgICAgbG9jYXRpb24uaGFzaCA9ICcjJyArIGZyYWdtZW50O1xuICAgICAgfVxuICAgIH1cblxuICB9KTtcblxuICAvLyBDcmVhdGUgdGhlIGRlZmF1bHQgQmFja2JvbmUuaGlzdG9yeS5cbiAgQmFja2JvbmUuaGlzdG9yeSA9IG5ldyBIaXN0b3J5O1xuXG4gIC8vIEhlbHBlcnNcbiAgLy8gLS0tLS0tLVxuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjb3JyZWN0bHkgc2V0IHVwIHRoZSBwcm90b3R5cGUgY2hhaW4gZm9yIHN1YmNsYXNzZXMuXG4gIC8vIFNpbWlsYXIgdG8gYGdvb2cuaW5oZXJpdHNgLCBidXQgdXNlcyBhIGhhc2ggb2YgcHJvdG90eXBlIHByb3BlcnRpZXMgYW5kXG4gIC8vIGNsYXNzIHByb3BlcnRpZXMgdG8gYmUgZXh0ZW5kZWQuXG4gIHZhciBleHRlbmQgPSBmdW5jdGlvbihwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzO1xuICAgIHZhciBjaGlsZDtcblxuICAgIC8vIFRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgdGhlIG5ldyBzdWJjbGFzcyBpcyBlaXRoZXIgZGVmaW5lZCBieSB5b3VcbiAgICAvLyAodGhlIFwiY29uc3RydWN0b3JcIiBwcm9wZXJ0eSBpbiB5b3VyIGBleHRlbmRgIGRlZmluaXRpb24pLCBvciBkZWZhdWx0ZWRcbiAgICAvLyBieSB1cyB0byBzaW1wbHkgY2FsbCB0aGUgcGFyZW50IGNvbnN0cnVjdG9yLlxuICAgIGlmIChwcm90b1Byb3BzICYmIF8uaGFzKHByb3RvUHJvcHMsICdjb25zdHJ1Y3RvcicpKSB7XG4gICAgICBjaGlsZCA9IHByb3RvUHJvcHMuY29uc3RydWN0b3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoaWxkID0gZnVuY3Rpb24oKXsgcmV0dXJuIHBhcmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9O1xuICAgIH1cblxuICAgIC8vIEFkZCBzdGF0aWMgcHJvcGVydGllcyB0byB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24sIGlmIHN1cHBsaWVkLlxuICAgIF8uZXh0ZW5kKGNoaWxkLCBwYXJlbnQsIHN0YXRpY1Byb3BzKTtcblxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGNoYWluIHRvIGluaGVyaXQgZnJvbSBgcGFyZW50YCwgd2l0aG91dCBjYWxsaW5nXG4gICAgLy8gYHBhcmVudGAncyBjb25zdHJ1Y3RvciBmdW5jdGlvbiBhbmQgYWRkIHRoZSBwcm90b3R5cGUgcHJvcGVydGllcy5cbiAgICBjaGlsZC5wcm90b3R5cGUgPSBfLmNyZWF0ZShwYXJlbnQucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICBjaGlsZC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjaGlsZDtcblxuICAgIC8vIFNldCBhIGNvbnZlbmllbmNlIHByb3BlcnR5IGluIGNhc2UgdGhlIHBhcmVudCdzIHByb3RvdHlwZSBpcyBuZWVkZWRcbiAgICAvLyBsYXRlci5cbiAgICBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlO1xuXG4gICAgcmV0dXJuIGNoaWxkO1xuICB9O1xuXG4gIC8vIFNldCB1cCBpbmhlcml0YW5jZSBmb3IgdGhlIG1vZGVsLCBjb2xsZWN0aW9uLCByb3V0ZXIsIHZpZXcgYW5kIGhpc3RvcnkuXG4gIE1vZGVsLmV4dGVuZCA9IENvbGxlY3Rpb24uZXh0ZW5kID0gUm91dGVyLmV4dGVuZCA9IFZpZXcuZXh0ZW5kID0gSGlzdG9yeS5leHRlbmQgPSBleHRlbmQ7XG5cbiAgLy8gVGhyb3cgYW4gZXJyb3Igd2hlbiBhIFVSTCBpcyBuZWVkZWQsIGFuZCBub25lIGlzIHN1cHBsaWVkLlxuICB2YXIgdXJsRXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgXCJ1cmxcIiBwcm9wZXJ0eSBvciBmdW5jdGlvbiBtdXN0IGJlIHNwZWNpZmllZCcpO1xuICB9O1xuXG4gIC8vIFdyYXAgYW4gb3B0aW9uYWwgZXJyb3IgY2FsbGJhY2sgd2l0aCBhIGZhbGxiYWNrIGVycm9yIGV2ZW50LlxuICB2YXIgd3JhcEVycm9yID0gZnVuY3Rpb24obW9kZWwsIG9wdGlvbnMpIHtcbiAgICB2YXIgZXJyb3IgPSBvcHRpb25zLmVycm9yO1xuICAgIG9wdGlvbnMuZXJyb3IgPSBmdW5jdGlvbihyZXNwKSB7XG4gICAgICBpZiAoZXJyb3IpIGVycm9yLmNhbGwob3B0aW9ucy5jb250ZXh0LCBtb2RlbCwgcmVzcCwgb3B0aW9ucyk7XG4gICAgICBtb2RlbC50cmlnZ2VyKCdlcnJvcicsIG1vZGVsLCByZXNwLCBvcHRpb25zKTtcbiAgICB9O1xuICB9O1xuXG4gIHJldHVybiBCYWNrYm9uZTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JhY2tib25lL2JhY2tib25lLmpzXG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 2 */
/***/ function(module, exports, __webpack_require__) {

    eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;//     Underscore.js 1.8.3\n//     http://underscorejs.org\n//     (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n//     Underscore may be freely distributed under the MIT license.\n\n(function() {\n\n  // Baseline setup\n  // --------------\n\n  // Establish the root object, `window` in the browser, or `exports` on the server.\n  var root = this;\n\n  // Save the previous value of the `_` variable.\n  var previousUnderscore = root._;\n\n  // Save bytes in the minified (but not gzipped) version:\n  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;\n\n  // Create quick reference variables for speed access to core prototypes.\n  var\n    push             = ArrayProto.push,\n    slice            = ArrayProto.slice,\n    toString         = ObjProto.toString,\n    hasOwnProperty   = ObjProto.hasOwnProperty;\n\n  // All **ECMAScript 5** native function implementations that we hope to use\n  // are declared here.\n  var\n    nativeIsArray      = Array.isArray,\n    nativeKeys         = Object.keys,\n    nativeBind         = FuncProto.bind,\n    nativeCreate       = Object.create;\n\n  // Naked function reference for surrogate-prototype-swapping.\n  var Ctor = function(){};\n\n  // Create a safe reference to the Underscore object for use below.\n  var _ = function(obj) {\n    if (obj instanceof _) return obj;\n    if (!(this instanceof _)) return new _(obj);\n    this._wrapped = obj;\n  };\n\n  // Export the Underscore object for **Node.js**, with\n  // backwards-compatibility for the old `require()` API. If we're in\n  // the browser, add `_` as a global object.\n  if (true) {\n    if (typeof module !== 'undefined' && module.exports) {\n      exports = module.exports = _;\n    }\n    exports._ = _;\n  } else {\n    root._ = _;\n  }\n\n  // Current version.\n  _.VERSION = '1.8.3';\n\n  // Internal function that returns an efficient (for current engines) version\n  // of the passed-in callback, to be repeatedly applied in other Underscore\n  // functions.\n  var optimizeCb = function(func, context, argCount) {\n    if (context === void 0) return func;\n    switch (argCount == null ? 3 : argCount) {\n      case 1: return function(value) {\n        return func.call(context, value);\n      };\n      case 2: return function(value, other) {\n        return func.call(context, value, other);\n      };\n      case 3: return function(value, index, collection) {\n        return func.call(context, value, index, collection);\n      };\n      case 4: return function(accumulator, value, index, collection) {\n        return func.call(context, accumulator, value, index, collection);\n      };\n    }\n    return function() {\n      return func.apply(context, arguments);\n    };\n  };\n\n  // A mostly-internal function to generate callbacks that can be applied\n  // to each element in a collection, returning the desired result — either\n  // identity, an arbitrary callback, a property matcher, or a property accessor.\n  var cb = function(value, context, argCount) {\n    if (value == null) return _.identity;\n    if (_.isFunction(value)) return optimizeCb(value, context, argCount);\n    if (_.isObject(value)) return _.matcher(value);\n    return _.property(value);\n  };\n  _.iteratee = function(value, context) {\n    return cb(value, context, Infinity);\n  };\n\n  // An internal function for creating assigner functions.\n  var createAssigner = function(keysFunc, undefinedOnly) {\n    return function(obj) {\n      var length = arguments.length;\n      if (length < 2 || obj == null) return obj;\n      for (var index = 1; index < length; index++) {\n        var source = arguments[index],\n            keys = keysFunc(source),\n            l = keys.length;\n        for (var i = 0; i < l; i++) {\n          var key = keys[i];\n          if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];\n        }\n      }\n      return obj;\n    };\n  };\n\n  // An internal function for creating a new object that inherits from another.\n  var baseCreate = function(prototype) {\n    if (!_.isObject(prototype)) return {};\n    if (nativeCreate) return nativeCreate(prototype);\n    Ctor.prototype = prototype;\n    var result = new Ctor;\n    Ctor.prototype = null;\n    return result;\n  };\n\n  var property = function(key) {\n    return function(obj) {\n      return obj == null ? void 0 : obj[key];\n    };\n  };\n\n  // Helper for collection methods to determine whether a collection\n  // should be iterated as an array or as an object\n  // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094\n  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\n  var getLength = property('length');\n  var isArrayLike = function(collection) {\n    var length = getLength(collection);\n    return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;\n  };\n\n  // Collection Functions\n  // --------------------\n\n  // The cornerstone, an `each` implementation, aka `forEach`.\n  // Handles raw objects in addition to array-likes. Treats all\n  // sparse array-likes as if they were dense.\n  _.each = _.forEach = function(obj, iteratee, context) {\n    iteratee = optimizeCb(iteratee, context);\n    var i, length;\n    if (isArrayLike(obj)) {\n      for (i = 0, length = obj.length; i < length; i++) {\n        iteratee(obj[i], i, obj);\n      }\n    } else {\n      var keys = _.keys(obj);\n      for (i = 0, length = keys.length; i < length; i++) {\n        iteratee(obj[keys[i]], keys[i], obj);\n      }\n    }\n    return obj;\n  };\n\n  // Return the results of applying the iteratee to each element.\n  _.map = _.collect = function(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    var keys = !isArrayLike(obj) && _.keys(obj),\n        length = (keys || obj).length,\n        results = Array(length);\n    for (var index = 0; index < length; index++) {\n      var currentKey = keys ? keys[index] : index;\n      results[index] = iteratee(obj[currentKey], currentKey, obj);\n    }\n    return results;\n  };\n\n  // Create a reducing function iterating left or right.\n  function createReduce(dir) {\n    // Optimized iterator function as using arguments.length\n    // in the main function will deoptimize the, see #1991.\n    function iterator(obj, iteratee, memo, keys, index, length) {\n      for (; index >= 0 && index < length; index += dir) {\n        var currentKey = keys ? keys[index] : index;\n        memo = iteratee(memo, obj[currentKey], currentKey, obj);\n      }\n      return memo;\n    }\n\n    return function(obj, iteratee, memo, context) {\n      iteratee = optimizeCb(iteratee, context, 4);\n      var keys = !isArrayLike(obj) && _.keys(obj),\n          length = (keys || obj).length,\n          index = dir > 0 ? 0 : length - 1;\n      // Determine the initial value if none is provided.\n      if (arguments.length < 3) {\n        memo = obj[keys ? keys[index] : index];\n        index += dir;\n      }\n      return iterator(obj, iteratee, memo, keys, index, length);\n    };\n  }\n\n  // **Reduce** builds up a single result from a list of values, aka `inject`,\n  // or `foldl`.\n  _.reduce = _.foldl = _.inject = createReduce(1);\n\n  // The right-associative version of reduce, also known as `foldr`.\n  _.reduceRight = _.foldr = createReduce(-1);\n\n  // Return the first value which passes a truth test. Aliased as `detect`.\n  _.find = _.detect = function(obj, predicate, context) {\n    var key;\n    if (isArrayLike(obj)) {\n      key = _.findIndex(obj, predicate, context);\n    } else {\n      key = _.findKey(obj, predicate, context);\n    }\n    if (key !== void 0 && key !== -1) return obj[key];\n  };\n\n  // Return all the elements that pass a truth test.\n  // Aliased as `select`.\n  _.filter = _.select = function(obj, predicate, context) {\n    var results = [];\n    predicate = cb(predicate, context);\n    _.each(obj, function(value, index, list) {\n      if (predicate(value, index, list)) results.push(value);\n    });\n    return results;\n  };\n\n  // Return all the elements for which a truth test fails.\n  _.reject = function(obj, predicate, context) {\n    return _.filter(obj, _.negate(cb(predicate)), context);\n  };\n\n  // Determine whether all of the elements match a truth test.\n  // Aliased as `all`.\n  _.every = _.all = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var keys = !isArrayLike(obj) && _.keys(obj),\n        length = (keys || obj).length;\n    for (var index = 0; index < length; index++) {\n      var currentKey = keys ? keys[index] : index;\n      if (!predicate(obj[currentKey], currentKey, obj)) return false;\n    }\n    return true;\n  };\n\n  // Determine if at least one element in the object matches a truth test.\n  // Aliased as `any`.\n  _.some = _.any = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var keys = !isArrayLike(obj) && _.keys(obj),\n        length = (keys || obj).length;\n    for (var index = 0; index < length; index++) {\n      var currentKey = keys ? keys[index] : index;\n      if (predicate(obj[currentKey], currentKey, obj)) return true;\n    }\n    return false;\n  };\n\n  // Determine if the array or object contains a given item (using `===`).\n  // Aliased as `includes` and `include`.\n  _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {\n    if (!isArrayLike(obj)) obj = _.values(obj);\n    if (typeof fromIndex != 'number' || guard) fromIndex = 0;\n    return _.indexOf(obj, item, fromIndex) >= 0;\n  };\n\n  // Invoke a method (with arguments) on every item in a collection.\n  _.invoke = function(obj, method) {\n    var args = slice.call(arguments, 2);\n    var isFunc = _.isFunction(method);\n    return _.map(obj, function(value) {\n      var func = isFunc ? method : value[method];\n      return func == null ? func : func.apply(value, args);\n    });\n  };\n\n  // Convenience version of a common use case of `map`: fetching a property.\n  _.pluck = function(obj, key) {\n    return _.map(obj, _.property(key));\n  };\n\n  // Convenience version of a common use case of `filter`: selecting only objects\n  // containing specific `key:value` pairs.\n  _.where = function(obj, attrs) {\n    return _.filter(obj, _.matcher(attrs));\n  };\n\n  // Convenience version of a common use case of `find`: getting the first object\n  // containing specific `key:value` pairs.\n  _.findWhere = function(obj, attrs) {\n    return _.find(obj, _.matcher(attrs));\n  };\n\n  // Return the maximum element (or element-based computation).\n  _.max = function(obj, iteratee, context) {\n    var result = -Infinity, lastComputed = -Infinity,\n        value, computed;\n    if (iteratee == null && obj != null) {\n      obj = isArrayLike(obj) ? obj : _.values(obj);\n      for (var i = 0, length = obj.length; i < length; i++) {\n        value = obj[i];\n        if (value > result) {\n          result = value;\n        }\n      }\n    } else {\n      iteratee = cb(iteratee, context);\n      _.each(obj, function(value, index, list) {\n        computed = iteratee(value, index, list);\n        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {\n          result = value;\n          lastComputed = computed;\n        }\n      });\n    }\n    return result;\n  };\n\n  // Return the minimum element (or element-based computation).\n  _.min = function(obj, iteratee, context) {\n    var result = Infinity, lastComputed = Infinity,\n        value, computed;\n    if (iteratee == null && obj != null) {\n      obj = isArrayLike(obj) ? obj : _.values(obj);\n      for (var i = 0, length = obj.length; i < length; i++) {\n        value = obj[i];\n        if (value < result) {\n          result = value;\n        }\n      }\n    } else {\n      iteratee = cb(iteratee, context);\n      _.each(obj, function(value, index, list) {\n        computed = iteratee(value, index, list);\n        if (computed < lastComputed || computed === Infinity && result === Infinity) {\n          result = value;\n          lastComputed = computed;\n        }\n      });\n    }\n    return result;\n  };\n\n  // Shuffle a collection, using the modern version of the\n  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n  _.shuffle = function(obj) {\n    var set = isArrayLike(obj) ? obj : _.values(obj);\n    var length = set.length;\n    var shuffled = Array(length);\n    for (var index = 0, rand; index < length; index++) {\n      rand = _.random(0, index);\n      if (rand !== index) shuffled[index] = shuffled[rand];\n      shuffled[rand] = set[index];\n    }\n    return shuffled;\n  };\n\n  // Sample **n** random values from a collection.\n  // If **n** is not specified, returns a single random element.\n  // The internal `guard` argument allows it to work with `map`.\n  _.sample = function(obj, n, guard) {\n    if (n == null || guard) {\n      if (!isArrayLike(obj)) obj = _.values(obj);\n      return obj[_.random(obj.length - 1)];\n    }\n    return _.shuffle(obj).slice(0, Math.max(0, n));\n  };\n\n  // Sort the object's values by a criterion produced by an iteratee.\n  _.sortBy = function(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    return _.pluck(_.map(obj, function(value, index, list) {\n      return {\n        value: value,\n        index: index,\n        criteria: iteratee(value, index, list)\n      };\n    }).sort(function(left, right) {\n      var a = left.criteria;\n      var b = right.criteria;\n      if (a !== b) {\n        if (a > b || a === void 0) return 1;\n        if (a < b || b === void 0) return -1;\n      }\n      return left.index - right.index;\n    }), 'value');\n  };\n\n  // An internal function used for aggregate \"group by\" operations.\n  var group = function(behavior) {\n    return function(obj, iteratee, context) {\n      var result = {};\n      iteratee = cb(iteratee, context);\n      _.each(obj, function(value, index) {\n        var key = iteratee(value, index, obj);\n        behavior(result, value, key);\n      });\n      return result;\n    };\n  };\n\n  // Groups the object's values by a criterion. Pass either a string attribute\n  // to group by, or a function that returns the criterion.\n  _.groupBy = group(function(result, value, key) {\n    if (_.has(result, key)) result[key].push(value); else result[key] = [value];\n  });\n\n  // Indexes the object's values by a criterion, similar to `groupBy`, but for\n  // when you know that your index values will be unique.\n  _.indexBy = group(function(result, value, key) {\n    result[key] = value;\n  });\n\n  // Counts instances of an object that group by a certain criterion. Pass\n  // either a string attribute to count by, or a function that returns the\n  // criterion.\n  _.countBy = group(function(result, value, key) {\n    if (_.has(result, key)) result[key]++; else result[key] = 1;\n  });\n\n  // Safely create a real, live array from anything iterable.\n  _.toArray = function(obj) {\n    if (!obj) return [];\n    if (_.isArray(obj)) return slice.call(obj);\n    if (isArrayLike(obj)) return _.map(obj, _.identity);\n    return _.values(obj);\n  };\n\n  // Return the number of elements in an object.\n  _.size = function(obj) {\n    if (obj == null) return 0;\n    return isArrayLike(obj) ? obj.length : _.keys(obj).length;\n  };\n\n  // Split a collection into two arrays: one whose elements all satisfy the given\n  // predicate, and one whose elements all do not satisfy the predicate.\n  _.partition = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var pass = [], fail = [];\n    _.each(obj, function(value, key, obj) {\n      (predicate(value, key, obj) ? pass : fail).push(value);\n    });\n    return [pass, fail];\n  };\n\n  // Array Functions\n  // ---------------\n\n  // Get the first element of an array. Passing **n** will return the first N\n  // values in the array. Aliased as `head` and `take`. The **guard** check\n  // allows it to work with `_.map`.\n  _.first = _.head = _.take = function(array, n, guard) {\n    if (array == null) return void 0;\n    if (n == null || guard) return array[0];\n    return _.initial(array, array.length - n);\n  };\n\n  // Returns everything but the last entry of the array. Especially useful on\n  // the arguments object. Passing **n** will return all the values in\n  // the array, excluding the last N.\n  _.initial = function(array, n, guard) {\n    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n  };\n\n  // Get the last element of an array. Passing **n** will return the last N\n  // values in the array.\n  _.last = function(array, n, guard) {\n    if (array == null) return void 0;\n    if (n == null || guard) return array[array.length - 1];\n    return _.rest(array, Math.max(0, array.length - n));\n  };\n\n  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.\n  // Especially useful on the arguments object. Passing an **n** will return\n  // the rest N values in the array.\n  _.rest = _.tail = _.drop = function(array, n, guard) {\n    return slice.call(array, n == null || guard ? 1 : n);\n  };\n\n  // Trim out all falsy values from an array.\n  _.compact = function(array) {\n    return _.filter(array, _.identity);\n  };\n\n  // Internal implementation of a recursive `flatten` function.\n  var flatten = function(input, shallow, strict, startIndex) {\n    var output = [], idx = 0;\n    for (var i = startIndex || 0, length = getLength(input); i < length; i++) {\n      var value = input[i];\n      if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {\n        //flatten current level of array or arguments object\n        if (!shallow) value = flatten(value, shallow, strict);\n        var j = 0, len = value.length;\n        output.length += len;\n        while (j < len) {\n          output[idx++] = value[j++];\n        }\n      } else if (!strict) {\n        output[idx++] = value;\n      }\n    }\n    return output;\n  };\n\n  // Flatten out an array, either recursively (by default), or just one level.\n  _.flatten = function(array, shallow) {\n    return flatten(array, shallow, false);\n  };\n\n  // Return a version of the array that does not contain the specified value(s).\n  _.without = function(array) {\n    return _.difference(array, slice.call(arguments, 1));\n  };\n\n  // Produce a duplicate-free version of the array. If the array has already\n  // been sorted, you have the option of using a faster algorithm.\n  // Aliased as `unique`.\n  _.uniq = _.unique = function(array, isSorted, iteratee, context) {\n    if (!_.isBoolean(isSorted)) {\n      context = iteratee;\n      iteratee = isSorted;\n      isSorted = false;\n    }\n    if (iteratee != null) iteratee = cb(iteratee, context);\n    var result = [];\n    var seen = [];\n    for (var i = 0, length = getLength(array); i < length; i++) {\n      var value = array[i],\n          computed = iteratee ? iteratee(value, i, array) : value;\n      if (isSorted) {\n        if (!i || seen !== computed) result.push(value);\n        seen = computed;\n      } else if (iteratee) {\n        if (!_.contains(seen, computed)) {\n          seen.push(computed);\n          result.push(value);\n        }\n      } else if (!_.contains(result, value)) {\n        result.push(value);\n      }\n    }\n    return result;\n  };\n\n  // Produce an array that contains the union: each distinct element from all of\n  // the passed-in arrays.\n  _.union = function() {\n    return _.uniq(flatten(arguments, true, true));\n  };\n\n  // Produce an array that contains every item shared between all the\n  // passed-in arrays.\n  _.intersection = function(array) {\n    var result = [];\n    var argsLength = arguments.length;\n    for (var i = 0, length = getLength(array); i < length; i++) {\n      var item = array[i];\n      if (_.contains(result, item)) continue;\n      for (var j = 1; j < argsLength; j++) {\n        if (!_.contains(arguments[j], item)) break;\n      }\n      if (j === argsLength) result.push(item);\n    }\n    return result;\n  };\n\n  // Take the difference between one array and a number of other arrays.\n  // Only the elements present in just the first array will remain.\n  _.difference = function(array) {\n    var rest = flatten(arguments, true, true, 1);\n    return _.filter(array, function(value){\n      return !_.contains(rest, value);\n    });\n  };\n\n  // Zip together multiple lists into a single array -- elements that share\n  // an index go together.\n  _.zip = function() {\n    return _.unzip(arguments);\n  };\n\n  // Complement of _.zip. Unzip accepts an array of arrays and groups\n  // each array's elements on shared indices\n  _.unzip = function(array) {\n    var length = array && _.max(array, getLength).length || 0;\n    var result = Array(length);\n\n    for (var index = 0; index < length; index++) {\n      result[index] = _.pluck(array, index);\n    }\n    return result;\n  };\n\n  // Converts lists into objects. Pass either a single array of `[key, value]`\n  // pairs, or two parallel arrays of the same length -- one of keys, and one of\n  // the corresponding values.\n  _.object = function(list, values) {\n    var result = {};\n    for (var i = 0, length = getLength(list); i < length; i++) {\n      if (values) {\n        result[list[i]] = values[i];\n      } else {\n        result[list[i][0]] = list[i][1];\n      }\n    }\n    return result;\n  };\n\n  // Generator function to create the findIndex and findLastIndex functions\n  function createPredicateIndexFinder(dir) {\n    return function(array, predicate, context) {\n      predicate = cb(predicate, context);\n      var length = getLength(array);\n      var index = dir > 0 ? 0 : length - 1;\n      for (; index >= 0 && index < length; index += dir) {\n        if (predicate(array[index], index, array)) return index;\n      }\n      return -1;\n    };\n  }\n\n  // Returns the first index on an array-like that passes a predicate test\n  _.findIndex = createPredicateIndexFinder(1);\n  _.findLastIndex = createPredicateIndexFinder(-1);\n\n  // Use a comparator function to figure out the smallest index at which\n  // an object should be inserted so as to maintain order. Uses binary search.\n  _.sortedIndex = function(array, obj, iteratee, context) {\n    iteratee = cb(iteratee, context, 1);\n    var value = iteratee(obj);\n    var low = 0, high = getLength(array);\n    while (low < high) {\n      var mid = Math.floor((low + high) / 2);\n      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;\n    }\n    return low;\n  };\n\n  // Generator function to create the indexOf and lastIndexOf functions\n  function createIndexFinder(dir, predicateFind, sortedIndex) {\n    return function(array, item, idx) {\n      var i = 0, length = getLength(array);\n      if (typeof idx == 'number') {\n        if (dir > 0) {\n            i = idx >= 0 ? idx : Math.max(idx + length, i);\n        } else {\n            length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n        }\n      } else if (sortedIndex && idx && length) {\n        idx = sortedIndex(array, item);\n        return array[idx] === item ? idx : -1;\n      }\n      if (item !== item) {\n        idx = predicateFind(slice.call(array, i, length), _.isNaN);\n        return idx >= 0 ? idx + i : -1;\n      }\n      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {\n        if (array[idx] === item) return idx;\n      }\n      return -1;\n    };\n  }\n\n  // Return the position of the first occurrence of an item in an array,\n  // or -1 if the item is not included in the array.\n  // If the array is large and already in sort order, pass `true`\n  // for **isSorted** to use binary search.\n  _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);\n  _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);\n\n  // Generate an integer Array containing an arithmetic progression. A port of\n  // the native Python `range()` function. See\n  // [the Python documentation](http://docs.python.org/library/functions.html#range).\n  _.range = function(start, stop, step) {\n    if (stop == null) {\n      stop = start || 0;\n      start = 0;\n    }\n    step = step || 1;\n\n    var length = Math.max(Math.ceil((stop - start) / step), 0);\n    var range = Array(length);\n\n    for (var idx = 0; idx < length; idx++, start += step) {\n      range[idx] = start;\n    }\n\n    return range;\n  };\n\n  // Function (ahem) Functions\n  // ------------------\n\n  // Determines whether to execute a function as a constructor\n  // or a normal function with the provided arguments\n  var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {\n    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);\n    var self = baseCreate(sourceFunc.prototype);\n    var result = sourceFunc.apply(self, args);\n    if (_.isObject(result)) return result;\n    return self;\n  };\n\n  // Create a function bound to a given object (assigning `this`, and arguments,\n  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if\n  // available.\n  _.bind = function(func, context) {\n    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));\n    if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');\n    var args = slice.call(arguments, 2);\n    var bound = function() {\n      return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));\n    };\n    return bound;\n  };\n\n  // Partially apply a function by creating a version that has had some of its\n  // arguments pre-filled, without changing its dynamic `this` context. _ acts\n  // as a placeholder, allowing any combination of arguments to be pre-filled.\n  _.partial = function(func) {\n    var boundArgs = slice.call(arguments, 1);\n    var bound = function() {\n      var position = 0, length = boundArgs.length;\n      var args = Array(length);\n      for (var i = 0; i < length; i++) {\n        args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];\n      }\n      while (position < arguments.length) args.push(arguments[position++]);\n      return executeBound(func, bound, this, this, args);\n    };\n    return bound;\n  };\n\n  // Bind a number of an object's methods to that object. Remaining arguments\n  // are the method names to be bound. Useful for ensuring that all callbacks\n  // defined on an object belong to it.\n  _.bindAll = function(obj) {\n    var i, length = arguments.length, key;\n    if (length <= 1) throw new Error('bindAll must be passed function names');\n    for (i = 1; i < length; i++) {\n      key = arguments[i];\n      obj[key] = _.bind(obj[key], obj);\n    }\n    return obj;\n  };\n\n  // Memoize an expensive function by storing its results.\n  _.memoize = function(func, hasher) {\n    var memoize = function(key) {\n      var cache = memoize.cache;\n      var address = '' + (hasher ? hasher.apply(this, arguments) : key);\n      if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);\n      return cache[address];\n    };\n    memoize.cache = {};\n    return memoize;\n  };\n\n  // Delays a function for the given number of milliseconds, and then calls\n  // it with the arguments supplied.\n  _.delay = function(func, wait) {\n    var args = slice.call(arguments, 2);\n    return setTimeout(function(){\n      return func.apply(null, args);\n    }, wait);\n  };\n\n  // Defers a function, scheduling it to run after the current call stack has\n  // cleared.\n  _.defer = _.partial(_.delay, _, 1);\n\n  // Returns a function, that, when invoked, will only be triggered at most once\n  // during a given window of time. Normally, the throttled function will run\n  // as much as it can, without ever going more than once per `wait` duration;\n  // but if you'd like to disable the execution on the leading edge, pass\n  // `{leading: false}`. To disable execution on the trailing edge, ditto.\n  _.throttle = function(func, wait, options) {\n    var context, args, result;\n    var timeout = null;\n    var previous = 0;\n    if (!options) options = {};\n    var later = function() {\n      previous = options.leading === false ? 0 : _.now();\n      timeout = null;\n      result = func.apply(context, args);\n      if (!timeout) context = args = null;\n    };\n    return function() {\n      var now = _.now();\n      if (!previous && options.leading === false) previous = now;\n      var remaining = wait - (now - previous);\n      context = this;\n      args = arguments;\n      if (remaining <= 0 || remaining > wait) {\n        if (timeout) {\n          clearTimeout(timeout);\n          timeout = null;\n        }\n        previous = now;\n        result = func.apply(context, args);\n        if (!timeout) context = args = null;\n      } else if (!timeout && options.trailing !== false) {\n        timeout = setTimeout(later, remaining);\n      }\n      return result;\n    };\n  };\n\n  // Returns a function, that, as long as it continues to be invoked, will not\n  // be triggered. The function will be called after it stops being called for\n  // N milliseconds. If `immediate` is passed, trigger the function on the\n  // leading edge, instead of the trailing.\n  _.debounce = function(func, wait, immediate) {\n    var timeout, args, context, timestamp, result;\n\n    var later = function() {\n      var last = _.now() - timestamp;\n\n      if (last < wait && last >= 0) {\n        timeout = setTimeout(later, wait - last);\n      } else {\n        timeout = null;\n        if (!immediate) {\n          result = func.apply(context, args);\n          if (!timeout) context = args = null;\n        }\n      }\n    };\n\n    return function() {\n      context = this;\n      args = arguments;\n      timestamp = _.now();\n      var callNow = immediate && !timeout;\n      if (!timeout) timeout = setTimeout(later, wait);\n      if (callNow) {\n        result = func.apply(context, args);\n        context = args = null;\n      }\n\n      return result;\n    };\n  };\n\n  // Returns the first function passed as an argument to the second,\n  // allowing you to adjust arguments, run code before and after, and\n  // conditionally execute the original function.\n  _.wrap = function(func, wrapper) {\n    return _.partial(wrapper, func);\n  };\n\n  // Returns a negated version of the passed-in predicate.\n  _.negate = function(predicate) {\n    return function() {\n      return !predicate.apply(this, arguments);\n    };\n  };\n\n  // Returns a function that is the composition of a list of functions, each\n  // consuming the return value of the function that follows.\n  _.compose = function() {\n    var args = arguments;\n    var start = args.length - 1;\n    return function() {\n      var i = start;\n      var result = args[start].apply(this, arguments);\n      while (i--) result = args[i].call(this, result);\n      return result;\n    };\n  };\n\n  // Returns a function that will only be executed on and after the Nth call.\n  _.after = function(times, func) {\n    return function() {\n      if (--times < 1) {\n        return func.apply(this, arguments);\n      }\n    };\n  };\n\n  // Returns a function that will only be executed up to (but not including) the Nth call.\n  _.before = function(times, func) {\n    var memo;\n    return function() {\n      if (--times > 0) {\n        memo = func.apply(this, arguments);\n      }\n      if (times <= 1) func = null;\n      return memo;\n    };\n  };\n\n  // Returns a function that will be executed at most one time, no matter how\n  // often you call it. Useful for lazy initialization.\n  _.once = _.partial(_.before, 2);\n\n  // Object Functions\n  // ----------------\n\n  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\n  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');\n  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',\n                      'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n\n  function collectNonEnumProps(obj, keys) {\n    var nonEnumIdx = nonEnumerableProps.length;\n    var constructor = obj.constructor;\n    var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;\n\n    // Constructor is a special case.\n    var prop = 'constructor';\n    if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);\n\n    while (nonEnumIdx--) {\n      prop = nonEnumerableProps[nonEnumIdx];\n      if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {\n        keys.push(prop);\n      }\n    }\n  }\n\n  // Retrieve the names of an object's own properties.\n  // Delegates to **ECMAScript 5**'s native `Object.keys`\n  _.keys = function(obj) {\n    if (!_.isObject(obj)) return [];\n    if (nativeKeys) return nativeKeys(obj);\n    var keys = [];\n    for (var key in obj) if (_.has(obj, key)) keys.push(key);\n    // Ahem, IE < 9.\n    if (hasEnumBug) collectNonEnumProps(obj, keys);\n    return keys;\n  };\n\n  // Retrieve all the property names of an object.\n  _.allKeys = function(obj) {\n    if (!_.isObject(obj)) return [];\n    var keys = [];\n    for (var key in obj) keys.push(key);\n    // Ahem, IE < 9.\n    if (hasEnumBug) collectNonEnumProps(obj, keys);\n    return keys;\n  };\n\n  // Retrieve the values of an object's properties.\n  _.values = function(obj) {\n    var keys = _.keys(obj);\n    var length = keys.length;\n    var values = Array(length);\n    for (var i = 0; i < length; i++) {\n      values[i] = obj[keys[i]];\n    }\n    return values;\n  };\n\n  // Returns the results of applying the iteratee to each element of the object\n  // In contrast to _.map it returns an object\n  _.mapObject = function(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    var keys =  _.keys(obj),\n          length = keys.length,\n          results = {},\n          currentKey;\n      for (var index = 0; index < length; index++) {\n        currentKey = keys[index];\n        results[currentKey] = iteratee(obj[currentKey], currentKey, obj);\n      }\n      return results;\n  };\n\n  // Convert an object into a list of `[key, value]` pairs.\n  _.pairs = function(obj) {\n    var keys = _.keys(obj);\n    var length = keys.length;\n    var pairs = Array(length);\n    for (var i = 0; i < length; i++) {\n      pairs[i] = [keys[i], obj[keys[i]]];\n    }\n    return pairs;\n  };\n\n  // Invert the keys and values of an object. The values must be serializable.\n  _.invert = function(obj) {\n    var result = {};\n    var keys = _.keys(obj);\n    for (var i = 0, length = keys.length; i < length; i++) {\n      result[obj[keys[i]]] = keys[i];\n    }\n    return result;\n  };\n\n  // Return a sorted list of the function names available on the object.\n  // Aliased as `methods`\n  _.functions = _.methods = function(obj) {\n    var names = [];\n    for (var key in obj) {\n      if (_.isFunction(obj[key])) names.push(key);\n    }\n    return names.sort();\n  };\n\n  // Extend a given object with all the properties in passed-in object(s).\n  _.extend = createAssigner(_.allKeys);\n\n  // Assigns a given object with all the own properties in the passed-in object(s)\n  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\n  _.extendOwn = _.assign = createAssigner(_.keys);\n\n  // Returns the first key on an object that passes a predicate test\n  _.findKey = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var keys = _.keys(obj), key;\n    for (var i = 0, length = keys.length; i < length; i++) {\n      key = keys[i];\n      if (predicate(obj[key], key, obj)) return key;\n    }\n  };\n\n  // Return a copy of the object only containing the whitelisted properties.\n  _.pick = function(object, oiteratee, context) {\n    var result = {}, obj = object, iteratee, keys;\n    if (obj == null) return result;\n    if (_.isFunction(oiteratee)) {\n      keys = _.allKeys(obj);\n      iteratee = optimizeCb(oiteratee, context);\n    } else {\n      keys = flatten(arguments, false, false, 1);\n      iteratee = function(value, key, obj) { return key in obj; };\n      obj = Object(obj);\n    }\n    for (var i = 0, length = keys.length; i < length; i++) {\n      var key = keys[i];\n      var value = obj[key];\n      if (iteratee(value, key, obj)) result[key] = value;\n    }\n    return result;\n  };\n\n   // Return a copy of the object without the blacklisted properties.\n  _.omit = function(obj, iteratee, context) {\n    if (_.isFunction(iteratee)) {\n      iteratee = _.negate(iteratee);\n    } else {\n      var keys = _.map(flatten(arguments, false, false, 1), String);\n      iteratee = function(value, key) {\n        return !_.contains(keys, key);\n      };\n    }\n    return _.pick(obj, iteratee, context);\n  };\n\n  // Fill in a given object with default properties.\n  _.defaults = createAssigner(_.allKeys, true);\n\n  // Creates an object that inherits from the given prototype object.\n  // If additional properties are provided then they will be added to the\n  // created object.\n  _.create = function(prototype, props) {\n    var result = baseCreate(prototype);\n    if (props) _.extendOwn(result, props);\n    return result;\n  };\n\n  // Create a (shallow-cloned) duplicate of an object.\n  _.clone = function(obj) {\n    if (!_.isObject(obj)) return obj;\n    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);\n  };\n\n  // Invokes interceptor with the obj, and then returns obj.\n  // The primary purpose of this method is to \"tap into\" a method chain, in\n  // order to perform operations on intermediate results within the chain.\n  _.tap = function(obj, interceptor) {\n    interceptor(obj);\n    return obj;\n  };\n\n  // Returns whether an object has a given set of `key:value` pairs.\n  _.isMatch = function(object, attrs) {\n    var keys = _.keys(attrs), length = keys.length;\n    if (object == null) return !length;\n    var obj = Object(object);\n    for (var i = 0; i < length; i++) {\n      var key = keys[i];\n      if (attrs[key] !== obj[key] || !(key in obj)) return false;\n    }\n    return true;\n  };\n\n\n  // Internal recursive comparison function for `isEqual`.\n  var eq = function(a, b, aStack, bStack) {\n    // Identical objects are equal. `0 === -0`, but they aren't identical.\n    // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).\n    if (a === b) return a !== 0 || 1 / a === 1 / b;\n    // A strict comparison is necessary because `null == undefined`.\n    if (a == null || b == null) return a === b;\n    // Unwrap any wrapped objects.\n    if (a instanceof _) a = a._wrapped;\n    if (b instanceof _) b = b._wrapped;\n    // Compare `[[Class]]` names.\n    var className = toString.call(a);\n    if (className !== toString.call(b)) return false;\n    switch (className) {\n      // Strings, numbers, regular expressions, dates, and booleans are compared by value.\n      case '[object RegExp]':\n      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n      case '[object String]':\n        // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n        // equivalent to `new String(\"5\")`.\n        return '' + a === '' + b;\n      case '[object Number]':\n        // `NaN`s are equivalent, but non-reflexive.\n        // Object(NaN) is equivalent to NaN\n        if (+a !== +a) return +b !== +b;\n        // An `egal` comparison is performed for other numeric values.\n        return +a === 0 ? 1 / +a === 1 / b : +a === +b;\n      case '[object Date]':\n      case '[object Boolean]':\n        // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n        // millisecond representations. Note that invalid dates with millisecond representations\n        // of `NaN` are not equivalent.\n        return +a === +b;\n    }\n\n    var areArrays = className === '[object Array]';\n    if (!areArrays) {\n      if (typeof a != 'object' || typeof b != 'object') return false;\n\n      // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n      // from different frames are.\n      var aCtor = a.constructor, bCtor = b.constructor;\n      if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&\n                               _.isFunction(bCtor) && bCtor instanceof bCtor)\n                          && ('constructor' in a && 'constructor' in b)) {\n        return false;\n      }\n    }\n    // Assume equality for cyclic structures. The algorithm for detecting cyclic\n    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n\n    // Initializing stack of traversed objects.\n    // It's done here since we only need them for objects and arrays comparison.\n    aStack = aStack || [];\n    bStack = bStack || [];\n    var length = aStack.length;\n    while (length--) {\n      // Linear search. Performance is inversely proportional to the number of\n      // unique nested structures.\n      if (aStack[length] === a) return bStack[length] === b;\n    }\n\n    // Add the first object to the stack of traversed objects.\n    aStack.push(a);\n    bStack.push(b);\n\n    // Recursively compare objects and arrays.\n    if (areArrays) {\n      // Compare array lengths to determine if a deep comparison is necessary.\n      length = a.length;\n      if (length !== b.length) return false;\n      // Deep compare the contents, ignoring non-numeric properties.\n      while (length--) {\n        if (!eq(a[length], b[length], aStack, bStack)) return false;\n      }\n    } else {\n      // Deep compare objects.\n      var keys = _.keys(a), key;\n      length = keys.length;\n      // Ensure that both objects contain the same number of properties before comparing deep equality.\n      if (_.keys(b).length !== length) return false;\n      while (length--) {\n        // Deep compare each member\n        key = keys[length];\n        if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;\n      }\n    }\n    // Remove the first object from the stack of traversed objects.\n    aStack.pop();\n    bStack.pop();\n    return true;\n  };\n\n  // Perform a deep comparison to check if two objects are equal.\n  _.isEqual = function(a, b) {\n    return eq(a, b);\n  };\n\n  // Is a given array, string, or object empty?\n  // An \"empty\" object has no enumerable own-properties.\n  _.isEmpty = function(obj) {\n    if (obj == null) return true;\n    if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;\n    return _.keys(obj).length === 0;\n  };\n\n  // Is a given value a DOM element?\n  _.isElement = function(obj) {\n    return !!(obj && obj.nodeType === 1);\n  };\n\n  // Is a given value an array?\n  // Delegates to ECMA5's native Array.isArray\n  _.isArray = nativeIsArray || function(obj) {\n    return toString.call(obj) === '[object Array]';\n  };\n\n  // Is a given variable an object?\n  _.isObject = function(obj) {\n    var type = typeof obj;\n    return type === 'function' || type === 'object' && !!obj;\n  };\n\n  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.\n  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {\n    _['is' + name] = function(obj) {\n      return toString.call(obj) === '[object ' + name + ']';\n    };\n  });\n\n  // Define a fallback version of the method in browsers (ahem, IE < 9), where\n  // there isn't any inspectable \"Arguments\" type.\n  if (!_.isArguments(arguments)) {\n    _.isArguments = function(obj) {\n      return _.has(obj, 'callee');\n    };\n  }\n\n  // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,\n  // IE 11 (#1621), and in Safari 8 (#1929).\n  if (typeof /./ != 'function' && typeof Int8Array != 'object') {\n    _.isFunction = function(obj) {\n      return typeof obj == 'function' || false;\n    };\n  }\n\n  // Is a given object a finite number?\n  _.isFinite = function(obj) {\n    return isFinite(obj) && !isNaN(parseFloat(obj));\n  };\n\n  // Is the given value `NaN`? (NaN is the only number which does not equal itself).\n  _.isNaN = function(obj) {\n    return _.isNumber(obj) && obj !== +obj;\n  };\n\n  // Is a given value a boolean?\n  _.isBoolean = function(obj) {\n    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n  };\n\n  // Is a given value equal to null?\n  _.isNull = function(obj) {\n    return obj === null;\n  };\n\n  // Is a given variable undefined?\n  _.isUndefined = function(obj) {\n    return obj === void 0;\n  };\n\n  // Shortcut function for checking if an object has a given property directly\n  // on itself (in other words, not on a prototype).\n  _.has = function(obj, key) {\n    return obj != null && hasOwnProperty.call(obj, key);\n  };\n\n  // Utility Functions\n  // -----------------\n\n  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its\n  // previous owner. Returns a reference to the Underscore object.\n  _.noConflict = function() {\n    root._ = previousUnderscore;\n    return this;\n  };\n\n  // Keep the identity function around for default iteratees.\n  _.identity = function(value) {\n    return value;\n  };\n\n  // Predicate-generating functions. Often useful outside of Underscore.\n  _.constant = function(value) {\n    return function() {\n      return value;\n    };\n  };\n\n  _.noop = function(){};\n\n  _.property = property;\n\n  // Generates a function for a given object that returns a given property.\n  _.propertyOf = function(obj) {\n    return obj == null ? function(){} : function(key) {\n      return obj[key];\n    };\n  };\n\n  // Returns a predicate for checking whether an object has a given set of\n  // `key:value` pairs.\n  _.matcher = _.matches = function(attrs) {\n    attrs = _.extendOwn({}, attrs);\n    return function(obj) {\n      return _.isMatch(obj, attrs);\n    };\n  };\n\n  // Run a function **n** times.\n  _.times = function(n, iteratee, context) {\n    var accum = Array(Math.max(0, n));\n    iteratee = optimizeCb(iteratee, context, 1);\n    for (var i = 0; i < n; i++) accum[i] = iteratee(i);\n    return accum;\n  };\n\n  // Return a random integer between min and max (inclusive).\n  _.random = function(min, max) {\n    if (max == null) {\n      max = min;\n      min = 0;\n    }\n    return min + Math.floor(Math.random() * (max - min + 1));\n  };\n\n  // A (possibly faster) way to get the current timestamp as an integer.\n  _.now = Date.now || function() {\n    return new Date().getTime();\n  };\n\n   // List of HTML entities for escaping.\n  var escapeMap = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#x27;',\n    '`': '&#x60;'\n  };\n  var unescapeMap = _.invert(escapeMap);\n\n  // Functions for escaping and unescaping strings to/from HTML interpolation.\n  var createEscaper = function(map) {\n    var escaper = function(match) {\n      return map[match];\n    };\n    // Regexes for identifying a key that needs to be escaped\n    var source = '(?:' + _.keys(map).join('|') + ')';\n    var testRegexp = RegExp(source);\n    var replaceRegexp = RegExp(source, 'g');\n    return function(string) {\n      string = string == null ? '' : '' + string;\n      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n    };\n  };\n  _.escape = createEscaper(escapeMap);\n  _.unescape = createEscaper(unescapeMap);\n\n  // If the value of the named `property` is a function then invoke it with the\n  // `object` as context; otherwise, return it.\n  _.result = function(object, property, fallback) {\n    var value = object == null ? void 0 : object[property];\n    if (value === void 0) {\n      value = fallback;\n    }\n    return _.isFunction(value) ? value.call(object) : value;\n  };\n\n  // Generate a unique integer id (unique within the entire client session).\n  // Useful for temporary DOM ids.\n  var idCounter = 0;\n  _.uniqueId = function(prefix) {\n    var id = ++idCounter + '';\n    return prefix ? prefix + id : id;\n  };\n\n  // By default, Underscore uses ERB-style template delimiters, change the\n  // following template settings to use alternative delimiters.\n  _.templateSettings = {\n    evaluate    : /<%([\\s\\S]+?)%>/g,\n    interpolate : /<%=([\\s\\S]+?)%>/g,\n    escape      : /<%-([\\s\\S]+?)%>/g\n  };\n\n  // When customizing `templateSettings`, if you don't want to define an\n  // interpolation, evaluation or escaping regex, we need one that is\n  // guaranteed not to match.\n  var noMatch = /(.)^/;\n\n  // Certain characters need to be escaped so that they can be put into a\n  // string literal.\n  var escapes = {\n    \"'\":      \"'\",\n    '\\\\':     '\\\\',\n    '\\r':     'r',\n    '\\n':     'n',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  var escaper = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\n  var escapeChar = function(match) {\n    return '\\\\' + escapes[match];\n  };\n\n  // JavaScript micro-templating, similar to John Resig's implementation.\n  // Underscore templating handles arbitrary delimiters, preserves whitespace,\n  // and correctly escapes quotes within interpolated code.\n  // NB: `oldSettings` only exists for backwards compatibility.\n  _.template = function(text, settings, oldSettings) {\n    if (!settings && oldSettings) settings = oldSettings;\n    settings = _.defaults({}, settings, _.templateSettings);\n\n    // Combine delimiters into one regular expression via alternation.\n    var matcher = RegExp([\n      (settings.escape || noMatch).source,\n      (settings.interpolate || noMatch).source,\n      (settings.evaluate || noMatch).source\n    ].join('|') + '|$', 'g');\n\n    // Compile the template source, escaping string literals appropriately.\n    var index = 0;\n    var source = \"__p+='\";\n    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n      source += text.slice(index, offset).replace(escaper, escapeChar);\n      index = offset + match.length;\n\n      if (escape) {\n        source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n      } else if (interpolate) {\n        source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n      } else if (evaluate) {\n        source += \"';\\n\" + evaluate + \"\\n__p+='\";\n      }\n\n      // Adobe VMs need the match returned to produce the correct offest.\n      return match;\n    });\n    source += \"';\\n\";\n\n    // If a variable is not specified, place data values in local scope.\n    if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\n\n    source = \"var __t,__p='',__j=Array.prototype.join,\" +\n      \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n      source + 'return __p;\\n';\n\n    try {\n      var render = new Function(settings.variable || 'obj', '_', source);\n    } catch (e) {\n      e.source = source;\n      throw e;\n    }\n\n    var template = function(data) {\n      return render.call(this, data, _);\n    };\n\n    // Provide the compiled source as a convenience for precompilation.\n    var argument = settings.variable || 'obj';\n    template.source = 'function(' + argument + '){\\n' + source + '}';\n\n    return template;\n  };\n\n  // Add a \"chain\" function. Start chaining a wrapped Underscore object.\n  _.chain = function(obj) {\n    var instance = _(obj);\n    instance._chain = true;\n    return instance;\n  };\n\n  // OOP\n  // ---------------\n  // If Underscore is called as a function, it returns a wrapped object that\n  // can be used OO-style. This wrapper holds altered versions of all the\n  // underscore functions. Wrapped objects may be chained.\n\n  // Helper function to continue chaining intermediate results.\n  var result = function(instance, obj) {\n    return instance._chain ? _(obj).chain() : obj;\n  };\n\n  // Add your own custom functions to the Underscore object.\n  _.mixin = function(obj) {\n    _.each(_.functions(obj), function(name) {\n      var func = _[name] = obj[name];\n      _.prototype[name] = function() {\n        var args = [this._wrapped];\n        push.apply(args, arguments);\n        return result(this, func.apply(_, args));\n      };\n    });\n  };\n\n  // Add all of the Underscore functions to the wrapper object.\n  _.mixin(_);\n\n  // Add all mutator Array functions to the wrapper.\n  _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      var obj = this._wrapped;\n      method.apply(obj, arguments);\n      if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];\n      return result(this, obj);\n    };\n  });\n\n  // Add all accessor Array functions to the wrapper.\n  _.each(['concat', 'join', 'slice'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      return result(this, method.apply(this._wrapped, arguments));\n    };\n  });\n\n  // Extracts the result from a wrapped and chained object.\n  _.prototype.value = function() {\n    return this._wrapped;\n  };\n\n  // Provide unwrapping proxy for some methods used in engine operations\n  // such as arithmetic and JSON stringification.\n  _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;\n\n  _.prototype.toString = function() {\n    return '' + this._wrapped;\n  };\n\n  // AMD registration happens at the end for compatibility with AMD loaders\n  // that may not enforce next-turn semantics on modules. Even though general\n  // practice for AMD registration is to be anonymous, underscore registers\n  // as a named module because, like jQuery, it is a base library that is\n  // popular enough to be bundled in a third party lib, but not be part of\n  // an AMD load request. Those cases could generate an error when an\n  // anonymous define() is called outside of a loader request.\n  if (true) {\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function() {\n      return _;\n    }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  }\n}.call(this));\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMi5qcyIsInNvdXJjZXMiOlsiL2hvbWUvdWJ1bnR1L3dvcmtzcGFjZS9ub2RlX21vZHVsZXMvdW5kZXJzY29yZS91bmRlcnNjb3JlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vICAgICBVbmRlcnNjb3JlLmpzIDEuOC4zXG4vLyAgICAgaHR0cDovL3VuZGVyc2NvcmVqcy5vcmdcbi8vICAgICAoYykgMjAwOS0yMDE1IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4vLyAgICAgVW5kZXJzY29yZSBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cblxuKGZ1bmN0aW9uKCkge1xuXG4gIC8vIEJhc2VsaW5lIHNldHVwXG4gIC8vIC0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gRXN0YWJsaXNoIHRoZSByb290IG9iamVjdCwgYHdpbmRvd2AgaW4gdGhlIGJyb3dzZXIsIG9yIGBleHBvcnRzYCBvbiB0aGUgc2VydmVyLlxuICB2YXIgcm9vdCA9IHRoaXM7XG5cbiAgLy8gU2F2ZSB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIGBfYCB2YXJpYWJsZS5cbiAgdmFyIHByZXZpb3VzVW5kZXJzY29yZSA9IHJvb3QuXztcblxuICAvLyBTYXZlIGJ5dGVzIGluIHRoZSBtaW5pZmllZCAoYnV0IG5vdCBnemlwcGVkKSB2ZXJzaW9uOlxuICB2YXIgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZSwgT2JqUHJvdG8gPSBPYmplY3QucHJvdG90eXBlLCBGdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG5cbiAgLy8gQ3JlYXRlIHF1aWNrIHJlZmVyZW5jZSB2YXJpYWJsZXMgZm9yIHNwZWVkIGFjY2VzcyB0byBjb3JlIHByb3RvdHlwZXMuXG4gIHZhclxuICAgIHB1c2ggICAgICAgICAgICAgPSBBcnJheVByb3RvLnB1c2gsXG4gICAgc2xpY2UgICAgICAgICAgICA9IEFycmF5UHJvdG8uc2xpY2UsXG4gICAgdG9TdHJpbmcgICAgICAgICA9IE9ialByb3RvLnRvU3RyaW5nLFxuICAgIGhhc093blByb3BlcnR5ICAgPSBPYmpQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuICAvLyBBbGwgKipFQ01BU2NyaXB0IDUqKiBuYXRpdmUgZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zIHRoYXQgd2UgaG9wZSB0byB1c2VcbiAgLy8gYXJlIGRlY2xhcmVkIGhlcmUuXG4gIHZhclxuICAgIG5hdGl2ZUlzQXJyYXkgICAgICA9IEFycmF5LmlzQXJyYXksXG4gICAgbmF0aXZlS2V5cyAgICAgICAgID0gT2JqZWN0LmtleXMsXG4gICAgbmF0aXZlQmluZCAgICAgICAgID0gRnVuY1Byb3RvLmJpbmQsXG4gICAgbmF0aXZlQ3JlYXRlICAgICAgID0gT2JqZWN0LmNyZWF0ZTtcblxuICAvLyBOYWtlZCBmdW5jdGlvbiByZWZlcmVuY2UgZm9yIHN1cnJvZ2F0ZS1wcm90b3R5cGUtc3dhcHBpbmcuXG4gIHZhciBDdG9yID0gZnVuY3Rpb24oKXt9O1xuXG4gIC8vIENyZWF0ZSBhIHNhZmUgcmVmZXJlbmNlIHRvIHRoZSBVbmRlcnNjb3JlIG9iamVjdCBmb3IgdXNlIGJlbG93LlxuICB2YXIgXyA9IGZ1bmN0aW9uKG9iaikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBfKSByZXR1cm4gb2JqO1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBfKSkgcmV0dXJuIG5ldyBfKG9iaik7XG4gICAgdGhpcy5fd3JhcHBlZCA9IG9iajtcbiAgfTtcblxuICAvLyBFeHBvcnQgdGhlIFVuZGVyc2NvcmUgb2JqZWN0IGZvciAqKk5vZGUuanMqKiwgd2l0aFxuICAvLyBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBmb3IgdGhlIG9sZCBgcmVxdWlyZSgpYCBBUEkuIElmIHdlJ3JlIGluXG4gIC8vIHRoZSBicm93c2VyLCBhZGQgYF9gIGFzIGEgZ2xvYmFsIG9iamVjdC5cbiAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgICAgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gXztcbiAgICB9XG4gICAgZXhwb3J0cy5fID0gXztcbiAgfSBlbHNlIHtcbiAgICByb290Ll8gPSBfO1xuICB9XG5cbiAgLy8gQ3VycmVudCB2ZXJzaW9uLlxuICBfLlZFUlNJT04gPSAnMS44LjMnO1xuXG4gIC8vIEludGVybmFsIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBlZmZpY2llbnQgKGZvciBjdXJyZW50IGVuZ2luZXMpIHZlcnNpb25cbiAgLy8gb2YgdGhlIHBhc3NlZC1pbiBjYWxsYmFjaywgdG8gYmUgcmVwZWF0ZWRseSBhcHBsaWVkIGluIG90aGVyIFVuZGVyc2NvcmVcbiAgLy8gZnVuY3Rpb25zLlxuICB2YXIgb3B0aW1pemVDYiA9IGZ1bmN0aW9uKGZ1bmMsIGNvbnRleHQsIGFyZ0NvdW50KSB7XG4gICAgaWYgKGNvbnRleHQgPT09IHZvaWQgMCkgcmV0dXJuIGZ1bmM7XG4gICAgc3dpdGNoIChhcmdDb3VudCA9PSBudWxsID8gMyA6IGFyZ0NvdW50KSB7XG4gICAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIHZhbHVlKTtcbiAgICAgIH07XG4gICAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChjb250ZXh0LCB2YWx1ZSwgb3RoZXIpO1xuICAgICAgfTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICB9O1xuICAgICAgY2FzZSA0OiByZXR1cm4gZnVuY3Rpb24oYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9O1xuXG4gIC8vIEEgbW9zdGx5LWludGVybmFsIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGNhbGxiYWNrcyB0aGF0IGNhbiBiZSBhcHBsaWVkXG4gIC8vIHRvIGVhY2ggZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24sIHJldHVybmluZyB0aGUgZGVzaXJlZCByZXN1bHQg4oCUIGVpdGhlclxuICAvLyBpZGVudGl0eSwgYW4gYXJiaXRyYXJ5IGNhbGxiYWNrLCBhIHByb3BlcnR5IG1hdGNoZXIsIG9yIGEgcHJvcGVydHkgYWNjZXNzb3IuXG4gIHZhciBjYiA9IGZ1bmN0aW9uKHZhbHVlLCBjb250ZXh0LCBhcmdDb3VudCkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gXy5pZGVudGl0eTtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHZhbHVlKSkgcmV0dXJuIG9wdGltaXplQ2IodmFsdWUsIGNvbnRleHQsIGFyZ0NvdW50KTtcbiAgICBpZiAoXy5pc09iamVjdCh2YWx1ZSkpIHJldHVybiBfLm1hdGNoZXIodmFsdWUpO1xuICAgIHJldHVybiBfLnByb3BlcnR5KHZhbHVlKTtcbiAgfTtcbiAgXy5pdGVyYXRlZSA9IGZ1bmN0aW9uKHZhbHVlLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGNiKHZhbHVlLCBjb250ZXh0LCBJbmZpbml0eSk7XG4gIH07XG5cbiAgLy8gQW4gaW50ZXJuYWwgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGFzc2lnbmVyIGZ1bmN0aW9ucy5cbiAgdmFyIGNyZWF0ZUFzc2lnbmVyID0gZnVuY3Rpb24oa2V5c0Z1bmMsIHVuZGVmaW5lZE9ubHkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPCAyIHx8IG9iaiA9PSBudWxsKSByZXR1cm4gb2JqO1xuICAgICAgZm9yICh2YXIgaW5kZXggPSAxOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2luZGV4XSxcbiAgICAgICAgICAgIGtleXMgPSBrZXlzRnVuYyhzb3VyY2UpLFxuICAgICAgICAgICAgbCA9IGtleXMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIGlmICghdW5kZWZpbmVkT25seSB8fCBvYmpba2V5XSA9PT0gdm9pZCAwKSBvYmpba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH07XG4gIH07XG5cbiAgLy8gQW4gaW50ZXJuYWwgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgbmV3IG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20gYW5vdGhlci5cbiAgdmFyIGJhc2VDcmVhdGUgPSBmdW5jdGlvbihwcm90b3R5cGUpIHtcbiAgICBpZiAoIV8uaXNPYmplY3QocHJvdG90eXBlKSkgcmV0dXJuIHt9O1xuICAgIGlmIChuYXRpdmVDcmVhdGUpIHJldHVybiBuYXRpdmVDcmVhdGUocHJvdG90eXBlKTtcbiAgICBDdG9yLnByb3RvdHlwZSA9IHByb3RvdHlwZTtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEN0b3I7XG4gICAgQ3Rvci5wcm90b3R5cGUgPSBudWxsO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgdmFyIHByb3BlcnR5ID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiA9PSBudWxsID8gdm9pZCAwIDogb2JqW2tleV07XG4gICAgfTtcbiAgfTtcblxuICAvLyBIZWxwZXIgZm9yIGNvbGxlY3Rpb24gbWV0aG9kcyB0byBkZXRlcm1pbmUgd2hldGhlciBhIGNvbGxlY3Rpb25cbiAgLy8gc2hvdWxkIGJlIGl0ZXJhdGVkIGFzIGFuIGFycmF5IG9yIGFzIGFuIG9iamVjdFxuICAvLyBSZWxhdGVkOiBodHRwOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy10b2xlbmd0aFxuICAvLyBBdm9pZHMgYSB2ZXJ5IG5hc3R5IGlPUyA4IEpJVCBidWcgb24gQVJNLTY0LiAjMjA5NFxuICB2YXIgTUFYX0FSUkFZX0lOREVYID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcbiAgdmFyIGdldExlbmd0aCA9IHByb3BlcnR5KCdsZW5ndGgnKTtcbiAgdmFyIGlzQXJyYXlMaWtlID0gZnVuY3Rpb24oY29sbGVjdGlvbikge1xuICAgIHZhciBsZW5ndGggPSBnZXRMZW5ndGgoY29sbGVjdGlvbik7XG4gICAgcmV0dXJuIHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicgJiYgbGVuZ3RoID49IDAgJiYgbGVuZ3RoIDw9IE1BWF9BUlJBWV9JTkRFWDtcbiAgfTtcblxuICAvLyBDb2xsZWN0aW9uIEZ1bmN0aW9uc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIFRoZSBjb3JuZXJzdG9uZSwgYW4gYGVhY2hgIGltcGxlbWVudGF0aW9uLCBha2EgYGZvckVhY2hgLlxuICAvLyBIYW5kbGVzIHJhdyBvYmplY3RzIGluIGFkZGl0aW9uIHRvIGFycmF5LWxpa2VzLiBUcmVhdHMgYWxsXG4gIC8vIHNwYXJzZSBhcnJheS1saWtlcyBhcyBpZiB0aGV5IHdlcmUgZGVuc2UuXG4gIF8uZWFjaCA9IF8uZm9yRWFjaCA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICBpdGVyYXRlZSA9IG9wdGltaXplQ2IoaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgIHZhciBpLCBsZW5ndGg7XG4gICAgaWYgKGlzQXJyYXlMaWtlKG9iaikpIHtcbiAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IG9iai5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBpdGVyYXRlZShvYmpbaV0sIGksIG9iaik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBrZXlzID0gXy5rZXlzKG9iaik7XG4gICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGl0ZXJhdGVlKG9ialtrZXlzW2ldXSwga2V5c1tpXSwgb2JqKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfTtcblxuICAvLyBSZXR1cm4gdGhlIHJlc3VsdHMgb2YgYXBwbHlpbmcgdGhlIGl0ZXJhdGVlIHRvIGVhY2ggZWxlbWVudC5cbiAgXy5tYXAgPSBfLmNvbGxlY3QgPSBmdW5jdGlvbihvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgaXRlcmF0ZWUgPSBjYihpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgdmFyIGtleXMgPSAhaXNBcnJheUxpa2Uob2JqKSAmJiBfLmtleXMob2JqKSxcbiAgICAgICAgbGVuZ3RoID0gKGtleXMgfHwgb2JqKS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdHMgPSBBcnJheShsZW5ndGgpO1xuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBjdXJyZW50S2V5ID0ga2V5cyA/IGtleXNbaW5kZXhdIDogaW5kZXg7XG4gICAgICByZXN1bHRzW2luZGV4XSA9IGl0ZXJhdGVlKG9ialtjdXJyZW50S2V5XSwgY3VycmVudEtleSwgb2JqKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH07XG5cbiAgLy8gQ3JlYXRlIGEgcmVkdWNpbmcgZnVuY3Rpb24gaXRlcmF0aW5nIGxlZnQgb3IgcmlnaHQuXG4gIGZ1bmN0aW9uIGNyZWF0ZVJlZHVjZShkaXIpIHtcbiAgICAvLyBPcHRpbWl6ZWQgaXRlcmF0b3IgZnVuY3Rpb24gYXMgdXNpbmcgYXJndW1lbnRzLmxlbmd0aFxuICAgIC8vIGluIHRoZSBtYWluIGZ1bmN0aW9uIHdpbGwgZGVvcHRpbWl6ZSB0aGUsIHNlZSAjMTk5MS5cbiAgICBmdW5jdGlvbiBpdGVyYXRvcihvYmosIGl0ZXJhdGVlLCBtZW1vLCBrZXlzLCBpbmRleCwgbGVuZ3RoKSB7XG4gICAgICBmb3IgKDsgaW5kZXggPj0gMCAmJiBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gZGlyKSB7XG4gICAgICAgIHZhciBjdXJyZW50S2V5ID0ga2V5cyA/IGtleXNbaW5kZXhdIDogaW5kZXg7XG4gICAgICAgIG1lbW8gPSBpdGVyYXRlZShtZW1vLCBvYmpbY3VycmVudEtleV0sIGN1cnJlbnRLZXksIG9iaik7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWVtbztcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgbWVtbywgY29udGV4dCkge1xuICAgICAgaXRlcmF0ZWUgPSBvcHRpbWl6ZUNiKGl0ZXJhdGVlLCBjb250ZXh0LCA0KTtcbiAgICAgIHZhciBrZXlzID0gIWlzQXJyYXlMaWtlKG9iaikgJiYgXy5rZXlzKG9iaiksXG4gICAgICAgICAgbGVuZ3RoID0gKGtleXMgfHwgb2JqKS5sZW5ndGgsXG4gICAgICAgICAgaW5kZXggPSBkaXIgPiAwID8gMCA6IGxlbmd0aCAtIDE7XG4gICAgICAvLyBEZXRlcm1pbmUgdGhlIGluaXRpYWwgdmFsdWUgaWYgbm9uZSBpcyBwcm92aWRlZC5cbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykge1xuICAgICAgICBtZW1vID0gb2JqW2tleXMgPyBrZXlzW2luZGV4XSA6IGluZGV4XTtcbiAgICAgICAgaW5kZXggKz0gZGlyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZXJhdG9yKG9iaiwgaXRlcmF0ZWUsIG1lbW8sIGtleXMsIGluZGV4LCBsZW5ndGgpO1xuICAgIH07XG4gIH1cblxuICAvLyAqKlJlZHVjZSoqIGJ1aWxkcyB1cCBhIHNpbmdsZSByZXN1bHQgZnJvbSBhIGxpc3Qgb2YgdmFsdWVzLCBha2EgYGluamVjdGAsXG4gIC8vIG9yIGBmb2xkbGAuXG4gIF8ucmVkdWNlID0gXy5mb2xkbCA9IF8uaW5qZWN0ID0gY3JlYXRlUmVkdWNlKDEpO1xuXG4gIC8vIFRoZSByaWdodC1hc3NvY2lhdGl2ZSB2ZXJzaW9uIG9mIHJlZHVjZSwgYWxzbyBrbm93biBhcyBgZm9sZHJgLlxuICBfLnJlZHVjZVJpZ2h0ID0gXy5mb2xkciA9IGNyZWF0ZVJlZHVjZSgtMSk7XG5cbiAgLy8gUmV0dXJuIHRoZSBmaXJzdCB2YWx1ZSB3aGljaCBwYXNzZXMgYSB0cnV0aCB0ZXN0LiBBbGlhc2VkIGFzIGBkZXRlY3RgLlxuICBfLmZpbmQgPSBfLmRldGVjdCA9IGZ1bmN0aW9uKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIGtleTtcbiAgICBpZiAoaXNBcnJheUxpa2Uob2JqKSkge1xuICAgICAga2V5ID0gXy5maW5kSW5kZXgob2JqLCBwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBrZXkgPSBfLmZpbmRLZXkob2JqLCBwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgIH1cbiAgICBpZiAoa2V5ICE9PSB2b2lkIDAgJiYga2V5ICE9PSAtMSkgcmV0dXJuIG9ialtrZXldO1xuICB9O1xuXG4gIC8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgcGFzcyBhIHRydXRoIHRlc3QuXG4gIC8vIEFsaWFzZWQgYXMgYHNlbGVjdGAuXG4gIF8uZmlsdGVyID0gXy5zZWxlY3QgPSBmdW5jdGlvbihvYmosIHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgcHJlZGljYXRlID0gY2IocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICBfLmVhY2gob2JqLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGxpc3QpIHtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBsaXN0KSkgcmVzdWx0cy5wdXNoKHZhbHVlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfTtcblxuICAvLyBSZXR1cm4gYWxsIHRoZSBlbGVtZW50cyBmb3Igd2hpY2ggYSB0cnV0aCB0ZXN0IGZhaWxzLlxuICBfLnJlamVjdCA9IGZ1bmN0aW9uKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIF8uZmlsdGVyKG9iaiwgXy5uZWdhdGUoY2IocHJlZGljYXRlKSksIGNvbnRleHQpO1xuICB9O1xuXG4gIC8vIERldGVybWluZSB3aGV0aGVyIGFsbCBvZiB0aGUgZWxlbWVudHMgbWF0Y2ggYSB0cnV0aCB0ZXN0LlxuICAvLyBBbGlhc2VkIGFzIGBhbGxgLlxuICBfLmV2ZXJ5ID0gXy5hbGwgPSBmdW5jdGlvbihvYmosIHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHByZWRpY2F0ZSA9IGNiKHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgdmFyIGtleXMgPSAhaXNBcnJheUxpa2Uob2JqKSAmJiBfLmtleXMob2JqKSxcbiAgICAgICAgbGVuZ3RoID0gKGtleXMgfHwgb2JqKS5sZW5ndGg7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgdmFyIGN1cnJlbnRLZXkgPSBrZXlzID8ga2V5c1tpbmRleF0gOiBpbmRleDtcbiAgICAgIGlmICghcHJlZGljYXRlKG9ialtjdXJyZW50S2V5XSwgY3VycmVudEtleSwgb2JqKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICAvLyBEZXRlcm1pbmUgaWYgYXQgbGVhc3Qgb25lIGVsZW1lbnQgaW4gdGhlIG9iamVjdCBtYXRjaGVzIGEgdHJ1dGggdGVzdC5cbiAgLy8gQWxpYXNlZCBhcyBgYW55YC5cbiAgXy5zb21lID0gXy5hbnkgPSBmdW5jdGlvbihvYmosIHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHByZWRpY2F0ZSA9IGNiKHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgdmFyIGtleXMgPSAhaXNBcnJheUxpa2Uob2JqKSAmJiBfLmtleXMob2JqKSxcbiAgICAgICAgbGVuZ3RoID0gKGtleXMgfHwgb2JqKS5sZW5ndGg7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgdmFyIGN1cnJlbnRLZXkgPSBrZXlzID8ga2V5c1tpbmRleF0gOiBpbmRleDtcbiAgICAgIGlmIChwcmVkaWNhdGUob2JqW2N1cnJlbnRLZXldLCBjdXJyZW50S2V5LCBvYmopKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8vIERldGVybWluZSBpZiB0aGUgYXJyYXkgb3Igb2JqZWN0IGNvbnRhaW5zIGEgZ2l2ZW4gaXRlbSAodXNpbmcgYD09PWApLlxuICAvLyBBbGlhc2VkIGFzIGBpbmNsdWRlc2AgYW5kIGBpbmNsdWRlYC5cbiAgXy5jb250YWlucyA9IF8uaW5jbHVkZXMgPSBfLmluY2x1ZGUgPSBmdW5jdGlvbihvYmosIGl0ZW0sIGZyb21JbmRleCwgZ3VhcmQpIHtcbiAgICBpZiAoIWlzQXJyYXlMaWtlKG9iaikpIG9iaiA9IF8udmFsdWVzKG9iaik7XG4gICAgaWYgKHR5cGVvZiBmcm9tSW5kZXggIT0gJ251bWJlcicgfHwgZ3VhcmQpIGZyb21JbmRleCA9IDA7XG4gICAgcmV0dXJuIF8uaW5kZXhPZihvYmosIGl0ZW0sIGZyb21JbmRleCkgPj0gMDtcbiAgfTtcblxuICAvLyBJbnZva2UgYSBtZXRob2QgKHdpdGggYXJndW1lbnRzKSBvbiBldmVyeSBpdGVtIGluIGEgY29sbGVjdGlvbi5cbiAgXy5pbnZva2UgPSBmdW5jdGlvbihvYmosIG1ldGhvZCkge1xuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgIHZhciBpc0Z1bmMgPSBfLmlzRnVuY3Rpb24obWV0aG9kKTtcbiAgICByZXR1cm4gXy5tYXAob2JqLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0Z1bmMgPyBtZXRob2QgOiB2YWx1ZVttZXRob2RdO1xuICAgICAgcmV0dXJuIGZ1bmMgPT0gbnVsbCA/IGZ1bmMgOiBmdW5jLmFwcGx5KHZhbHVlLCBhcmdzKTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBDb252ZW5pZW5jZSB2ZXJzaW9uIG9mIGEgY29tbW9uIHVzZSBjYXNlIG9mIGBtYXBgOiBmZXRjaGluZyBhIHByb3BlcnR5LlxuICBfLnBsdWNrID0gZnVuY3Rpb24ob2JqLCBrZXkpIHtcbiAgICByZXR1cm4gXy5tYXAob2JqLCBfLnByb3BlcnR5KGtleSkpO1xuICB9O1xuXG4gIC8vIENvbnZlbmllbmNlIHZlcnNpb24gb2YgYSBjb21tb24gdXNlIGNhc2Ugb2YgYGZpbHRlcmA6IHNlbGVjdGluZyBvbmx5IG9iamVjdHNcbiAgLy8gY29udGFpbmluZyBzcGVjaWZpYyBga2V5OnZhbHVlYCBwYWlycy5cbiAgXy53aGVyZSA9IGZ1bmN0aW9uKG9iaiwgYXR0cnMpIHtcbiAgICByZXR1cm4gXy5maWx0ZXIob2JqLCBfLm1hdGNoZXIoYXR0cnMpKTtcbiAgfTtcblxuICAvLyBDb252ZW5pZW5jZSB2ZXJzaW9uIG9mIGEgY29tbW9uIHVzZSBjYXNlIG9mIGBmaW5kYDogZ2V0dGluZyB0aGUgZmlyc3Qgb2JqZWN0XG4gIC8vIGNvbnRhaW5pbmcgc3BlY2lmaWMgYGtleTp2YWx1ZWAgcGFpcnMuXG4gIF8uZmluZFdoZXJlID0gZnVuY3Rpb24ob2JqLCBhdHRycykge1xuICAgIHJldHVybiBfLmZpbmQob2JqLCBfLm1hdGNoZXIoYXR0cnMpKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gdGhlIG1heGltdW0gZWxlbWVudCAob3IgZWxlbWVudC1iYXNlZCBjb21wdXRhdGlvbikuXG4gIF8ubWF4ID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIHZhciByZXN1bHQgPSAtSW5maW5pdHksIGxhc3RDb21wdXRlZCA9IC1JbmZpbml0eSxcbiAgICAgICAgdmFsdWUsIGNvbXB1dGVkO1xuICAgIGlmIChpdGVyYXRlZSA9PSBudWxsICYmIG9iaiAhPSBudWxsKSB7XG4gICAgICBvYmogPSBpc0FycmF5TGlrZShvYmopID8gb2JqIDogXy52YWx1ZXMob2JqKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBvYmoubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsdWUgPSBvYmpbaV07XG4gICAgICAgIGlmICh2YWx1ZSA+IHJlc3VsdCkge1xuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZXJhdGVlID0gY2IoaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgICAgXy5lYWNoKG9iaiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBsaXN0KSB7XG4gICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUodmFsdWUsIGluZGV4LCBsaXN0KTtcbiAgICAgICAgaWYgKGNvbXB1dGVkID4gbGFzdENvbXB1dGVkIHx8IGNvbXB1dGVkID09PSAtSW5maW5pdHkgJiYgcmVzdWx0ID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBsYXN0Q29tcHV0ZWQgPSBjb21wdXRlZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gUmV0dXJuIHRoZSBtaW5pbXVtIGVsZW1lbnQgKG9yIGVsZW1lbnQtYmFzZWQgY29tcHV0YXRpb24pLlxuICBfLm1pbiA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICB2YXIgcmVzdWx0ID0gSW5maW5pdHksIGxhc3RDb21wdXRlZCA9IEluZmluaXR5LFxuICAgICAgICB2YWx1ZSwgY29tcHV0ZWQ7XG4gICAgaWYgKGl0ZXJhdGVlID09IG51bGwgJiYgb2JqICE9IG51bGwpIHtcbiAgICAgIG9iaiA9IGlzQXJyYXlMaWtlKG9iaikgPyBvYmogOiBfLnZhbHVlcyhvYmopO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IG9iai5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICB2YWx1ZSA9IG9ialtpXTtcbiAgICAgICAgaWYgKHZhbHVlIDwgcmVzdWx0KSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaXRlcmF0ZWUgPSBjYihpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgICBfLmVhY2gob2JqLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGxpc3QpIHtcbiAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSh2YWx1ZSwgaW5kZXgsIGxpc3QpO1xuICAgICAgICBpZiAoY29tcHV0ZWQgPCBsYXN0Q29tcHV0ZWQgfHwgY29tcHV0ZWQgPT09IEluZmluaXR5ICYmIHJlc3VsdCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBsYXN0Q29tcHV0ZWQgPSBjb21wdXRlZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gU2h1ZmZsZSBhIGNvbGxlY3Rpb24sIHVzaW5nIHRoZSBtb2Rlcm4gdmVyc2lvbiBvZiB0aGVcbiAgLy8gW0Zpc2hlci1ZYXRlcyBzaHVmZmxlXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Zpc2hlcuKAk1lhdGVzX3NodWZmbGUpLlxuICBfLnNodWZmbGUgPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgc2V0ID0gaXNBcnJheUxpa2Uob2JqKSA/IG9iaiA6IF8udmFsdWVzKG9iaik7XG4gICAgdmFyIGxlbmd0aCA9IHNldC5sZW5ndGg7XG4gICAgdmFyIHNodWZmbGVkID0gQXJyYXkobGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpbmRleCA9IDAsIHJhbmQ7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICByYW5kID0gXy5yYW5kb20oMCwgaW5kZXgpO1xuICAgICAgaWYgKHJhbmQgIT09IGluZGV4KSBzaHVmZmxlZFtpbmRleF0gPSBzaHVmZmxlZFtyYW5kXTtcbiAgICAgIHNodWZmbGVkW3JhbmRdID0gc2V0W2luZGV4XTtcbiAgICB9XG4gICAgcmV0dXJuIHNodWZmbGVkO1xuICB9O1xuXG4gIC8vIFNhbXBsZSAqKm4qKiByYW5kb20gdmFsdWVzIGZyb20gYSBjb2xsZWN0aW9uLlxuICAvLyBJZiAqKm4qKiBpcyBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIGEgc2luZ2xlIHJhbmRvbSBlbGVtZW50LlxuICAvLyBUaGUgaW50ZXJuYWwgYGd1YXJkYCBhcmd1bWVudCBhbGxvd3MgaXQgdG8gd29yayB3aXRoIGBtYXBgLlxuICBfLnNhbXBsZSA9IGZ1bmN0aW9uKG9iaiwgbiwgZ3VhcmQpIHtcbiAgICBpZiAobiA9PSBudWxsIHx8IGd1YXJkKSB7XG4gICAgICBpZiAoIWlzQXJyYXlMaWtlKG9iaikpIG9iaiA9IF8udmFsdWVzKG9iaik7XG4gICAgICByZXR1cm4gb2JqW18ucmFuZG9tKG9iai5sZW5ndGggLSAxKV07XG4gICAgfVxuICAgIHJldHVybiBfLnNodWZmbGUob2JqKS5zbGljZSgwLCBNYXRoLm1heCgwLCBuKSk7XG4gIH07XG5cbiAgLy8gU29ydCB0aGUgb2JqZWN0J3MgdmFsdWVzIGJ5IGEgY3JpdGVyaW9uIHByb2R1Y2VkIGJ5IGFuIGl0ZXJhdGVlLlxuICBfLnNvcnRCeSA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICBpdGVyYXRlZSA9IGNiKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICByZXR1cm4gXy5wbHVjayhfLm1hcChvYmosIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgbGlzdCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgIGNyaXRlcmlhOiBpdGVyYXRlZSh2YWx1ZSwgaW5kZXgsIGxpc3QpXG4gICAgICB9O1xuICAgIH0pLnNvcnQoZnVuY3Rpb24obGVmdCwgcmlnaHQpIHtcbiAgICAgIHZhciBhID0gbGVmdC5jcml0ZXJpYTtcbiAgICAgIHZhciBiID0gcmlnaHQuY3JpdGVyaWE7XG4gICAgICBpZiAoYSAhPT0gYikge1xuICAgICAgICBpZiAoYSA+IGIgfHwgYSA9PT0gdm9pZCAwKSByZXR1cm4gMTtcbiAgICAgICAgaWYgKGEgPCBiIHx8IGIgPT09IHZvaWQgMCkgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxlZnQuaW5kZXggLSByaWdodC5pbmRleDtcbiAgICB9KSwgJ3ZhbHVlJyk7XG4gIH07XG5cbiAgLy8gQW4gaW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBmb3IgYWdncmVnYXRlIFwiZ3JvdXAgYnlcIiBvcGVyYXRpb25zLlxuICB2YXIgZ3JvdXAgPSBmdW5jdGlvbihiZWhhdmlvcikge1xuICAgIHJldHVybiBmdW5jdGlvbihvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICBpdGVyYXRlZSA9IGNiKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICAgIF8uZWFjaChvYmosIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkge1xuICAgICAgICB2YXIga2V5ID0gaXRlcmF0ZWUodmFsdWUsIGluZGV4LCBvYmopO1xuICAgICAgICBiZWhhdmlvcihyZXN1bHQsIHZhbHVlLCBrZXkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gIH07XG5cbiAgLy8gR3JvdXBzIHRoZSBvYmplY3QncyB2YWx1ZXMgYnkgYSBjcml0ZXJpb24uIFBhc3MgZWl0aGVyIGEgc3RyaW5nIGF0dHJpYnV0ZVxuICAvLyB0byBncm91cCBieSwgb3IgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGNyaXRlcmlvbi5cbiAgXy5ncm91cEJ5ID0gZ3JvdXAoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgaWYgKF8uaGFzKHJlc3VsdCwga2V5KSkgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSk7IGVsc2UgcmVzdWx0W2tleV0gPSBbdmFsdWVdO1xuICB9KTtcblxuICAvLyBJbmRleGVzIHRoZSBvYmplY3QncyB2YWx1ZXMgYnkgYSBjcml0ZXJpb24sIHNpbWlsYXIgdG8gYGdyb3VwQnlgLCBidXQgZm9yXG4gIC8vIHdoZW4geW91IGtub3cgdGhhdCB5b3VyIGluZGV4IHZhbHVlcyB3aWxsIGJlIHVuaXF1ZS5cbiAgXy5pbmRleEJ5ID0gZ3JvdXAoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgfSk7XG5cbiAgLy8gQ291bnRzIGluc3RhbmNlcyBvZiBhbiBvYmplY3QgdGhhdCBncm91cCBieSBhIGNlcnRhaW4gY3JpdGVyaW9uLiBQYXNzXG4gIC8vIGVpdGhlciBhIHN0cmluZyBhdHRyaWJ1dGUgdG8gY291bnQgYnksIG9yIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZVxuICAvLyBjcml0ZXJpb24uXG4gIF8uY291bnRCeSA9IGdyb3VwKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgIGlmIChfLmhhcyhyZXN1bHQsIGtleSkpIHJlc3VsdFtrZXldKys7IGVsc2UgcmVzdWx0W2tleV0gPSAxO1xuICB9KTtcblxuICAvLyBTYWZlbHkgY3JlYXRlIGEgcmVhbCwgbGl2ZSBhcnJheSBmcm9tIGFueXRoaW5nIGl0ZXJhYmxlLlxuICBfLnRvQXJyYXkgPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAoIW9iaikgcmV0dXJuIFtdO1xuICAgIGlmIChfLmlzQXJyYXkob2JqKSkgcmV0dXJuIHNsaWNlLmNhbGwob2JqKTtcbiAgICBpZiAoaXNBcnJheUxpa2Uob2JqKSkgcmV0dXJuIF8ubWFwKG9iaiwgXy5pZGVudGl0eSk7XG4gICAgcmV0dXJuIF8udmFsdWVzKG9iaik7XG4gIH07XG5cbiAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYW4gb2JqZWN0LlxuICBfLnNpemUgPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAob2JqID09IG51bGwpIHJldHVybiAwO1xuICAgIHJldHVybiBpc0FycmF5TGlrZShvYmopID8gb2JqLmxlbmd0aCA6IF8ua2V5cyhvYmopLmxlbmd0aDtcbiAgfTtcblxuICAvLyBTcGxpdCBhIGNvbGxlY3Rpb24gaW50byB0d28gYXJyYXlzOiBvbmUgd2hvc2UgZWxlbWVudHMgYWxsIHNhdGlzZnkgdGhlIGdpdmVuXG4gIC8vIHByZWRpY2F0ZSwgYW5kIG9uZSB3aG9zZSBlbGVtZW50cyBhbGwgZG8gbm90IHNhdGlzZnkgdGhlIHByZWRpY2F0ZS5cbiAgXy5wYXJ0aXRpb24gPSBmdW5jdGlvbihvYmosIHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHByZWRpY2F0ZSA9IGNiKHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgdmFyIHBhc3MgPSBbXSwgZmFpbCA9IFtdO1xuICAgIF8uZWFjaChvYmosIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iaikge1xuICAgICAgKHByZWRpY2F0ZSh2YWx1ZSwga2V5LCBvYmopID8gcGFzcyA6IGZhaWwpLnB1c2godmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBbcGFzcywgZmFpbF07XG4gIH07XG5cbiAgLy8gQXJyYXkgRnVuY3Rpb25zXG4gIC8vIC0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIEdldCB0aGUgZmlyc3QgZWxlbWVudCBvZiBhbiBhcnJheS4gUGFzc2luZyAqKm4qKiB3aWxsIHJldHVybiB0aGUgZmlyc3QgTlxuICAvLyB2YWx1ZXMgaW4gdGhlIGFycmF5LiBBbGlhc2VkIGFzIGBoZWFkYCBhbmQgYHRha2VgLiBUaGUgKipndWFyZCoqIGNoZWNrXG4gIC8vIGFsbG93cyBpdCB0byB3b3JrIHdpdGggYF8ubWFwYC5cbiAgXy5maXJzdCA9IF8uaGVhZCA9IF8udGFrZSA9IGZ1bmN0aW9uKGFycmF5LCBuLCBndWFyZCkge1xuICAgIGlmIChhcnJheSA9PSBudWxsKSByZXR1cm4gdm9pZCAwO1xuICAgIGlmIChuID09IG51bGwgfHwgZ3VhcmQpIHJldHVybiBhcnJheVswXTtcbiAgICByZXR1cm4gXy5pbml0aWFsKGFycmF5LCBhcnJheS5sZW5ndGggLSBuKTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGV2ZXJ5dGhpbmcgYnV0IHRoZSBsYXN0IGVudHJ5IG9mIHRoZSBhcnJheS4gRXNwZWNpYWxseSB1c2VmdWwgb25cbiAgLy8gdGhlIGFyZ3VtZW50cyBvYmplY3QuIFBhc3NpbmcgKipuKiogd2lsbCByZXR1cm4gYWxsIHRoZSB2YWx1ZXMgaW5cbiAgLy8gdGhlIGFycmF5LCBleGNsdWRpbmcgdGhlIGxhc3QgTi5cbiAgXy5pbml0aWFsID0gZnVuY3Rpb24oYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgcmV0dXJuIHNsaWNlLmNhbGwoYXJyYXksIDAsIE1hdGgubWF4KDAsIGFycmF5Lmxlbmd0aCAtIChuID09IG51bGwgfHwgZ3VhcmQgPyAxIDogbikpKTtcbiAgfTtcblxuICAvLyBHZXQgdGhlIGxhc3QgZWxlbWVudCBvZiBhbiBhcnJheS4gUGFzc2luZyAqKm4qKiB3aWxsIHJldHVybiB0aGUgbGFzdCBOXG4gIC8vIHZhbHVlcyBpbiB0aGUgYXJyYXkuXG4gIF8ubGFzdCA9IGZ1bmN0aW9uKGFycmF5LCBuLCBndWFyZCkge1xuICAgIGlmIChhcnJheSA9PSBudWxsKSByZXR1cm4gdm9pZCAwO1xuICAgIGlmIChuID09IG51bGwgfHwgZ3VhcmQpIHJldHVybiBhcnJheVthcnJheS5sZW5ndGggLSAxXTtcbiAgICByZXR1cm4gXy5yZXN0KGFycmF5LCBNYXRoLm1heCgwLCBhcnJheS5sZW5ndGggLSBuKSk7XG4gIH07XG5cbiAgLy8gUmV0dXJucyBldmVyeXRoaW5nIGJ1dCB0aGUgZmlyc3QgZW50cnkgb2YgdGhlIGFycmF5LiBBbGlhc2VkIGFzIGB0YWlsYCBhbmQgYGRyb3BgLlxuICAvLyBFc3BlY2lhbGx5IHVzZWZ1bCBvbiB0aGUgYXJndW1lbnRzIG9iamVjdC4gUGFzc2luZyBhbiAqKm4qKiB3aWxsIHJldHVyblxuICAvLyB0aGUgcmVzdCBOIHZhbHVlcyBpbiB0aGUgYXJyYXkuXG4gIF8ucmVzdCA9IF8udGFpbCA9IF8uZHJvcCA9IGZ1bmN0aW9uKGFycmF5LCBuLCBndWFyZCkge1xuICAgIHJldHVybiBzbGljZS5jYWxsKGFycmF5LCBuID09IG51bGwgfHwgZ3VhcmQgPyAxIDogbik7XG4gIH07XG5cbiAgLy8gVHJpbSBvdXQgYWxsIGZhbHN5IHZhbHVlcyBmcm9tIGFuIGFycmF5LlxuICBfLmNvbXBhY3QgPSBmdW5jdGlvbihhcnJheSkge1xuICAgIHJldHVybiBfLmZpbHRlcihhcnJheSwgXy5pZGVudGl0eSk7XG4gIH07XG5cbiAgLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgYSByZWN1cnNpdmUgYGZsYXR0ZW5gIGZ1bmN0aW9uLlxuICB2YXIgZmxhdHRlbiA9IGZ1bmN0aW9uKGlucHV0LCBzaGFsbG93LCBzdHJpY3QsIHN0YXJ0SW5kZXgpIHtcbiAgICB2YXIgb3V0cHV0ID0gW10sIGlkeCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0SW5kZXggfHwgMCwgbGVuZ3RoID0gZ2V0TGVuZ3RoKGlucHV0KTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsdWUgPSBpbnB1dFtpXTtcbiAgICAgIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkgJiYgKF8uaXNBcnJheSh2YWx1ZSkgfHwgXy5pc0FyZ3VtZW50cyh2YWx1ZSkpKSB7XG4gICAgICAgIC8vZmxhdHRlbiBjdXJyZW50IGxldmVsIG9mIGFycmF5IG9yIGFyZ3VtZW50cyBvYmplY3RcbiAgICAgICAgaWYgKCFzaGFsbG93KSB2YWx1ZSA9IGZsYXR0ZW4odmFsdWUsIHNoYWxsb3csIHN0cmljdCk7XG4gICAgICAgIHZhciBqID0gMCwgbGVuID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICBvdXRwdXQubGVuZ3RoICs9IGxlbjtcbiAgICAgICAgd2hpbGUgKGogPCBsZW4pIHtcbiAgICAgICAgICBvdXRwdXRbaWR4KytdID0gdmFsdWVbaisrXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghc3RyaWN0KSB7XG4gICAgICAgIG91dHB1dFtpZHgrK10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfTtcblxuICAvLyBGbGF0dGVuIG91dCBhbiBhcnJheSwgZWl0aGVyIHJlY3Vyc2l2ZWx5IChieSBkZWZhdWx0KSwgb3IganVzdCBvbmUgbGV2ZWwuXG4gIF8uZmxhdHRlbiA9IGZ1bmN0aW9uKGFycmF5LCBzaGFsbG93KSB7XG4gICAgcmV0dXJuIGZsYXR0ZW4oYXJyYXksIHNoYWxsb3csIGZhbHNlKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gYSB2ZXJzaW9uIG9mIHRoZSBhcnJheSB0aGF0IGRvZXMgbm90IGNvbnRhaW4gdGhlIHNwZWNpZmllZCB2YWx1ZShzKS5cbiAgXy53aXRob3V0ID0gZnVuY3Rpb24oYXJyYXkpIHtcbiAgICByZXR1cm4gXy5kaWZmZXJlbmNlKGFycmF5LCBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpO1xuICB9O1xuXG4gIC8vIFByb2R1Y2UgYSBkdXBsaWNhdGUtZnJlZSB2ZXJzaW9uIG9mIHRoZSBhcnJheS4gSWYgdGhlIGFycmF5IGhhcyBhbHJlYWR5XG4gIC8vIGJlZW4gc29ydGVkLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIHVzaW5nIGEgZmFzdGVyIGFsZ29yaXRobS5cbiAgLy8gQWxpYXNlZCBhcyBgdW5pcXVlYC5cbiAgXy51bmlxID0gXy51bmlxdWUgPSBmdW5jdGlvbihhcnJheSwgaXNTb3J0ZWQsIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgaWYgKCFfLmlzQm9vbGVhbihpc1NvcnRlZCkpIHtcbiAgICAgIGNvbnRleHQgPSBpdGVyYXRlZTtcbiAgICAgIGl0ZXJhdGVlID0gaXNTb3J0ZWQ7XG4gICAgICBpc1NvcnRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoaXRlcmF0ZWUgIT0gbnVsbCkgaXRlcmF0ZWUgPSBjYihpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBzZWVuID0gW107XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGdldExlbmd0aChhcnJheSk7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaV0sXG4gICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlLCBpLCBhcnJheSkgOiB2YWx1ZTtcbiAgICAgIGlmIChpc1NvcnRlZCkge1xuICAgICAgICBpZiAoIWkgfHwgc2VlbiAhPT0gY29tcHV0ZWQpIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgc2VlbiA9IGNvbXB1dGVkO1xuICAgICAgfSBlbHNlIGlmIChpdGVyYXRlZSkge1xuICAgICAgICBpZiAoIV8uY29udGFpbnMoc2VlbiwgY29tcHV0ZWQpKSB7XG4gICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIV8uY29udGFpbnMocmVzdWx0LCB2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIFByb2R1Y2UgYW4gYXJyYXkgdGhhdCBjb250YWlucyB0aGUgdW5pb246IGVhY2ggZGlzdGluY3QgZWxlbWVudCBmcm9tIGFsbCBvZlxuICAvLyB0aGUgcGFzc2VkLWluIGFycmF5cy5cbiAgXy51bmlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBfLnVuaXEoZmxhdHRlbihhcmd1bWVudHMsIHRydWUsIHRydWUpKTtcbiAgfTtcblxuICAvLyBQcm9kdWNlIGFuIGFycmF5IHRoYXQgY29udGFpbnMgZXZlcnkgaXRlbSBzaGFyZWQgYmV0d2VlbiBhbGwgdGhlXG4gIC8vIHBhc3NlZC1pbiBhcnJheXMuXG4gIF8uaW50ZXJzZWN0aW9uID0gZnVuY3Rpb24oYXJyYXkpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGFyZ3NMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBnZXRMZW5ndGgoYXJyYXkpOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gYXJyYXlbaV07XG4gICAgICBpZiAoXy5jb250YWlucyhyZXN1bHQsIGl0ZW0pKSBjb250aW51ZTtcbiAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgYXJnc0xlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmICghXy5jb250YWlucyhhcmd1bWVudHNbal0sIGl0ZW0pKSBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChqID09PSBhcmdzTGVuZ3RoKSByZXN1bHQucHVzaChpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBUYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gb25lIGFycmF5IGFuZCBhIG51bWJlciBvZiBvdGhlciBhcnJheXMuXG4gIC8vIE9ubHkgdGhlIGVsZW1lbnRzIHByZXNlbnQgaW4ganVzdCB0aGUgZmlyc3QgYXJyYXkgd2lsbCByZW1haW4uXG4gIF8uZGlmZmVyZW5jZSA9IGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgdmFyIHJlc3QgPSBmbGF0dGVuKGFyZ3VtZW50cywgdHJ1ZSwgdHJ1ZSwgMSk7XG4gICAgcmV0dXJuIF8uZmlsdGVyKGFycmF5LCBmdW5jdGlvbih2YWx1ZSl7XG4gICAgICByZXR1cm4gIV8uY29udGFpbnMocmVzdCwgdmFsdWUpO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIFppcCB0b2dldGhlciBtdWx0aXBsZSBsaXN0cyBpbnRvIGEgc2luZ2xlIGFycmF5IC0tIGVsZW1lbnRzIHRoYXQgc2hhcmVcbiAgLy8gYW4gaW5kZXggZ28gdG9nZXRoZXIuXG4gIF8uemlwID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIF8udW56aXAoYXJndW1lbnRzKTtcbiAgfTtcblxuICAvLyBDb21wbGVtZW50IG9mIF8uemlwLiBVbnppcCBhY2NlcHRzIGFuIGFycmF5IG9mIGFycmF5cyBhbmQgZ3JvdXBzXG4gIC8vIGVhY2ggYXJyYXkncyBlbGVtZW50cyBvbiBzaGFyZWQgaW5kaWNlc1xuICBfLnVuemlwID0gZnVuY3Rpb24oYXJyYXkpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgJiYgXy5tYXgoYXJyYXksIGdldExlbmd0aCkubGVuZ3RoIHx8IDA7XG4gICAgdmFyIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gXy5wbHVjayhhcnJheSwgaW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIENvbnZlcnRzIGxpc3RzIGludG8gb2JqZWN0cy4gUGFzcyBlaXRoZXIgYSBzaW5nbGUgYXJyYXkgb2YgYFtrZXksIHZhbHVlXWBcbiAgLy8gcGFpcnMsIG9yIHR3byBwYXJhbGxlbCBhcnJheXMgb2YgdGhlIHNhbWUgbGVuZ3RoIC0tIG9uZSBvZiBrZXlzLCBhbmQgb25lIG9mXG4gIC8vIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAgXy5vYmplY3QgPSBmdW5jdGlvbihsaXN0LCB2YWx1ZXMpIHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGdldExlbmd0aChsaXN0KTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodmFsdWVzKSB7XG4gICAgICAgIHJlc3VsdFtsaXN0W2ldXSA9IHZhbHVlc1tpXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtsaXN0W2ldWzBdXSA9IGxpc3RbaV1bMV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gR2VuZXJhdG9yIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgZmluZEluZGV4IGFuZCBmaW5kTGFzdEluZGV4IGZ1bmN0aW9uc1xuICBmdW5jdGlvbiBjcmVhdGVQcmVkaWNhdGVJbmRleEZpbmRlcihkaXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oYXJyYXksIHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgICAgcHJlZGljYXRlID0gY2IocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICAgIHZhciBsZW5ndGggPSBnZXRMZW5ndGgoYXJyYXkpO1xuICAgICAgdmFyIGluZGV4ID0gZGlyID4gMCA/IDAgOiBsZW5ndGggLSAxO1xuICAgICAgZm9yICg7IGluZGV4ID49IDAgJiYgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IGRpcikge1xuICAgICAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH07XG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBmaXJzdCBpbmRleCBvbiBhbiBhcnJheS1saWtlIHRoYXQgcGFzc2VzIGEgcHJlZGljYXRlIHRlc3RcbiAgXy5maW5kSW5kZXggPSBjcmVhdGVQcmVkaWNhdGVJbmRleEZpbmRlcigxKTtcbiAgXy5maW5kTGFzdEluZGV4ID0gY3JlYXRlUHJlZGljYXRlSW5kZXhGaW5kZXIoLTEpO1xuXG4gIC8vIFVzZSBhIGNvbXBhcmF0b3IgZnVuY3Rpb24gdG8gZmlndXJlIG91dCB0aGUgc21hbGxlc3QgaW5kZXggYXQgd2hpY2hcbiAgLy8gYW4gb2JqZWN0IHNob3VsZCBiZSBpbnNlcnRlZCBzbyBhcyB0byBtYWludGFpbiBvcmRlci4gVXNlcyBiaW5hcnkgc2VhcmNoLlxuICBfLnNvcnRlZEluZGV4ID0gZnVuY3Rpb24oYXJyYXksIG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICBpdGVyYXRlZSA9IGNiKGl0ZXJhdGVlLCBjb250ZXh0LCAxKTtcbiAgICB2YXIgdmFsdWUgPSBpdGVyYXRlZShvYmopO1xuICAgIHZhciBsb3cgPSAwLCBoaWdoID0gZ2V0TGVuZ3RoKGFycmF5KTtcbiAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgdmFyIG1pZCA9IE1hdGguZmxvb3IoKGxvdyArIGhpZ2gpIC8gMik7XG4gICAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbbWlkXSkgPCB2YWx1ZSkgbG93ID0gbWlkICsgMTsgZWxzZSBoaWdoID0gbWlkO1xuICAgIH1cbiAgICByZXR1cm4gbG93O1xuICB9O1xuXG4gIC8vIEdlbmVyYXRvciBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIGluZGV4T2YgYW5kIGxhc3RJbmRleE9mIGZ1bmN0aW9uc1xuICBmdW5jdGlvbiBjcmVhdGVJbmRleEZpbmRlcihkaXIsIHByZWRpY2F0ZUZpbmQsIHNvcnRlZEluZGV4KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGFycmF5LCBpdGVtLCBpZHgpIHtcbiAgICAgIHZhciBpID0gMCwgbGVuZ3RoID0gZ2V0TGVuZ3RoKGFycmF5KTtcbiAgICAgIGlmICh0eXBlb2YgaWR4ID09ICdudW1iZXInKSB7XG4gICAgICAgIGlmIChkaXIgPiAwKSB7XG4gICAgICAgICAgICBpID0gaWR4ID49IDAgPyBpZHggOiBNYXRoLm1heChpZHggKyBsZW5ndGgsIGkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGVuZ3RoID0gaWR4ID49IDAgPyBNYXRoLm1pbihpZHggKyAxLCBsZW5ndGgpIDogaWR4ICsgbGVuZ3RoICsgMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzb3J0ZWRJbmRleCAmJiBpZHggJiYgbGVuZ3RoKSB7XG4gICAgICAgIGlkeCA9IHNvcnRlZEluZGV4KGFycmF5LCBpdGVtKTtcbiAgICAgICAgcmV0dXJuIGFycmF5W2lkeF0gPT09IGl0ZW0gPyBpZHggOiAtMTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtICE9PSBpdGVtKSB7XG4gICAgICAgIGlkeCA9IHByZWRpY2F0ZUZpbmQoc2xpY2UuY2FsbChhcnJheSwgaSwgbGVuZ3RoKSwgXy5pc05hTik7XG4gICAgICAgIHJldHVybiBpZHggPj0gMCA/IGlkeCArIGkgOiAtMTtcbiAgICAgIH1cbiAgICAgIGZvciAoaWR4ID0gZGlyID4gMCA/IGkgOiBsZW5ndGggLSAxOyBpZHggPj0gMCAmJiBpZHggPCBsZW5ndGg7IGlkeCArPSBkaXIpIHtcbiAgICAgICAgaWYgKGFycmF5W2lkeF0gPT09IGl0ZW0pIHJldHVybiBpZHg7XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfTtcbiAgfVxuXG4gIC8vIFJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYW4gaXRlbSBpbiBhbiBhcnJheSxcbiAgLy8gb3IgLTEgaWYgdGhlIGl0ZW0gaXMgbm90IGluY2x1ZGVkIGluIHRoZSBhcnJheS5cbiAgLy8gSWYgdGhlIGFycmF5IGlzIGxhcmdlIGFuZCBhbHJlYWR5IGluIHNvcnQgb3JkZXIsIHBhc3MgYHRydWVgXG4gIC8vIGZvciAqKmlzU29ydGVkKiogdG8gdXNlIGJpbmFyeSBzZWFyY2guXG4gIF8uaW5kZXhPZiA9IGNyZWF0ZUluZGV4RmluZGVyKDEsIF8uZmluZEluZGV4LCBfLnNvcnRlZEluZGV4KTtcbiAgXy5sYXN0SW5kZXhPZiA9IGNyZWF0ZUluZGV4RmluZGVyKC0xLCBfLmZpbmRMYXN0SW5kZXgpO1xuXG4gIC8vIEdlbmVyYXRlIGFuIGludGVnZXIgQXJyYXkgY29udGFpbmluZyBhbiBhcml0aG1ldGljIHByb2dyZXNzaW9uLiBBIHBvcnQgb2ZcbiAgLy8gdGhlIG5hdGl2ZSBQeXRob24gYHJhbmdlKClgIGZ1bmN0aW9uLiBTZWVcbiAgLy8gW3RoZSBQeXRob24gZG9jdW1lbnRhdGlvbl0oaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L2Z1bmN0aW9ucy5odG1sI3JhbmdlKS5cbiAgXy5yYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0LCBzdG9wLCBzdGVwKSB7XG4gICAgaWYgKHN0b3AgPT0gbnVsbCkge1xuICAgICAgc3RvcCA9IHN0YXJ0IHx8IDA7XG4gICAgICBzdGFydCA9IDA7XG4gICAgfVxuICAgIHN0ZXAgPSBzdGVwIHx8IDE7XG5cbiAgICB2YXIgbGVuZ3RoID0gTWF0aC5tYXgoTWF0aC5jZWlsKChzdG9wIC0gc3RhcnQpIC8gc3RlcCksIDApO1xuICAgIHZhciByYW5nZSA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBsZW5ndGg7IGlkeCsrLCBzdGFydCArPSBzdGVwKSB7XG4gICAgICByYW5nZVtpZHhdID0gc3RhcnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJhbmdlO1xuICB9O1xuXG4gIC8vIEZ1bmN0aW9uIChhaGVtKSBGdW5jdGlvbnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGV4ZWN1dGUgYSBmdW5jdGlvbiBhcyBhIGNvbnN0cnVjdG9yXG4gIC8vIG9yIGEgbm9ybWFsIGZ1bmN0aW9uIHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50c1xuICB2YXIgZXhlY3V0ZUJvdW5kID0gZnVuY3Rpb24oc291cmNlRnVuYywgYm91bmRGdW5jLCBjb250ZXh0LCBjYWxsaW5nQ29udGV4dCwgYXJncykge1xuICAgIGlmICghKGNhbGxpbmdDb250ZXh0IGluc3RhbmNlb2YgYm91bmRGdW5jKSkgcmV0dXJuIHNvdXJjZUZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgdmFyIHNlbGYgPSBiYXNlQ3JlYXRlKHNvdXJjZUZ1bmMucHJvdG90eXBlKTtcbiAgICB2YXIgcmVzdWx0ID0gc291cmNlRnVuYy5hcHBseShzZWxmLCBhcmdzKTtcbiAgICBpZiAoXy5pc09iamVjdChyZXN1bHQpKSByZXR1cm4gcmVzdWx0O1xuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIC8vIENyZWF0ZSBhIGZ1bmN0aW9uIGJvdW5kIHRvIGEgZ2l2ZW4gb2JqZWN0IChhc3NpZ25pbmcgYHRoaXNgLCBhbmQgYXJndW1lbnRzLFxuICAvLyBvcHRpb25hbGx5KS4gRGVsZWdhdGVzIHRvICoqRUNNQVNjcmlwdCA1KioncyBuYXRpdmUgYEZ1bmN0aW9uLmJpbmRgIGlmXG4gIC8vIGF2YWlsYWJsZS5cbiAgXy5iaW5kID0gZnVuY3Rpb24oZnVuYywgY29udGV4dCkge1xuICAgIGlmIChuYXRpdmVCaW5kICYmIGZ1bmMuYmluZCA9PT0gbmF0aXZlQmluZCkgcmV0dXJuIG5hdGl2ZUJpbmQuYXBwbHkoZnVuYywgc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcbiAgICBpZiAoIV8uaXNGdW5jdGlvbihmdW5jKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQmluZCBtdXN0IGJlIGNhbGxlZCBvbiBhIGZ1bmN0aW9uJyk7XG4gICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gICAgdmFyIGJvdW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXhlY3V0ZUJvdW5kKGZ1bmMsIGJvdW5kLCBjb250ZXh0LCB0aGlzLCBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpKTtcbiAgICB9O1xuICAgIHJldHVybiBib3VuZDtcbiAgfTtcblxuICAvLyBQYXJ0aWFsbHkgYXBwbHkgYSBmdW5jdGlvbiBieSBjcmVhdGluZyBhIHZlcnNpb24gdGhhdCBoYXMgaGFkIHNvbWUgb2YgaXRzXG4gIC8vIGFyZ3VtZW50cyBwcmUtZmlsbGVkLCB3aXRob3V0IGNoYW5naW5nIGl0cyBkeW5hbWljIGB0aGlzYCBjb250ZXh0LiBfIGFjdHNcbiAgLy8gYXMgYSBwbGFjZWhvbGRlciwgYWxsb3dpbmcgYW55IGNvbWJpbmF0aW9uIG9mIGFyZ3VtZW50cyB0byBiZSBwcmUtZmlsbGVkLlxuICBfLnBhcnRpYWwgPSBmdW5jdGlvbihmdW5jKSB7XG4gICAgdmFyIGJvdW5kQXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICB2YXIgYm91bmQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBwb3NpdGlvbiA9IDAsIGxlbmd0aCA9IGJvdW5kQXJncy5sZW5ndGg7XG4gICAgICB2YXIgYXJncyA9IEFycmF5KGxlbmd0aCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFyZ3NbaV0gPSBib3VuZEFyZ3NbaV0gPT09IF8gPyBhcmd1bWVudHNbcG9zaXRpb24rK10gOiBib3VuZEFyZ3NbaV07XG4gICAgICB9XG4gICAgICB3aGlsZSAocG9zaXRpb24gPCBhcmd1bWVudHMubGVuZ3RoKSBhcmdzLnB1c2goYXJndW1lbnRzW3Bvc2l0aW9uKytdKTtcbiAgICAgIHJldHVybiBleGVjdXRlQm91bmQoZnVuYywgYm91bmQsIHRoaXMsIHRoaXMsIGFyZ3MpO1xuICAgIH07XG4gICAgcmV0dXJuIGJvdW5kO1xuICB9O1xuXG4gIC8vIEJpbmQgYSBudW1iZXIgb2YgYW4gb2JqZWN0J3MgbWV0aG9kcyB0byB0aGF0IG9iamVjdC4gUmVtYWluaW5nIGFyZ3VtZW50c1xuICAvLyBhcmUgdGhlIG1ldGhvZCBuYW1lcyB0byBiZSBib3VuZC4gVXNlZnVsIGZvciBlbnN1cmluZyB0aGF0IGFsbCBjYWxsYmFja3NcbiAgLy8gZGVmaW5lZCBvbiBhbiBvYmplY3QgYmVsb25nIHRvIGl0LlxuICBfLmJpbmRBbGwgPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgaSwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCwga2V5O1xuICAgIGlmIChsZW5ndGggPD0gMSkgdGhyb3cgbmV3IEVycm9yKCdiaW5kQWxsIG11c3QgYmUgcGFzc2VkIGZ1bmN0aW9uIG5hbWVzJyk7XG4gICAgZm9yIChpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXkgPSBhcmd1bWVudHNbaV07XG4gICAgICBvYmpba2V5XSA9IF8uYmluZChvYmpba2V5XSwgb2JqKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfTtcblxuICAvLyBNZW1vaXplIGFuIGV4cGVuc2l2ZSBmdW5jdGlvbiBieSBzdG9yaW5nIGl0cyByZXN1bHRzLlxuICBfLm1lbW9pemUgPSBmdW5jdGlvbihmdW5jLCBoYXNoZXIpIHtcbiAgICB2YXIgbWVtb2l6ZSA9IGZ1bmN0aW9uKGtleSkge1xuICAgICAgdmFyIGNhY2hlID0gbWVtb2l6ZS5jYWNoZTtcbiAgICAgIHZhciBhZGRyZXNzID0gJycgKyAoaGFzaGVyID8gaGFzaGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrZXkpO1xuICAgICAgaWYgKCFfLmhhcyhjYWNoZSwgYWRkcmVzcykpIGNhY2hlW2FkZHJlc3NdID0gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgcmV0dXJuIGNhY2hlW2FkZHJlc3NdO1xuICAgIH07XG4gICAgbWVtb2l6ZS5jYWNoZSA9IHt9O1xuICAgIHJldHVybiBtZW1vaXplO1xuICB9O1xuXG4gIC8vIERlbGF5cyBhIGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgYW5kIHRoZW4gY2FsbHNcbiAgLy8gaXQgd2l0aCB0aGUgYXJndW1lbnRzIHN1cHBsaWVkLlxuICBfLmRlbGF5ID0gZnVuY3Rpb24oZnVuYywgd2FpdCkge1xuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICByZXR1cm4gZnVuYy5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9LCB3YWl0KTtcbiAgfTtcblxuICAvLyBEZWZlcnMgYSBmdW5jdGlvbiwgc2NoZWR1bGluZyBpdCB0byBydW4gYWZ0ZXIgdGhlIGN1cnJlbnQgY2FsbCBzdGFjayBoYXNcbiAgLy8gY2xlYXJlZC5cbiAgXy5kZWZlciA9IF8ucGFydGlhbChfLmRlbGF5LCBfLCAxKTtcblxuICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIHdoZW4gaW52b2tlZCwgd2lsbCBvbmx5IGJlIHRyaWdnZXJlZCBhdCBtb3N0IG9uY2VcbiAgLy8gZHVyaW5nIGEgZ2l2ZW4gd2luZG93IG9mIHRpbWUuIE5vcm1hbGx5LCB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uIHdpbGwgcnVuXG4gIC8vIGFzIG11Y2ggYXMgaXQgY2FuLCB3aXRob3V0IGV2ZXIgZ29pbmcgbW9yZSB0aGFuIG9uY2UgcGVyIGB3YWl0YCBkdXJhdGlvbjtcbiAgLy8gYnV0IGlmIHlvdSdkIGxpa2UgdG8gZGlzYWJsZSB0aGUgZXhlY3V0aW9uIG9uIHRoZSBsZWFkaW5nIGVkZ2UsIHBhc3NcbiAgLy8gYHtsZWFkaW5nOiBmYWxzZX1gLiBUbyBkaXNhYmxlIGV4ZWN1dGlvbiBvbiB0aGUgdHJhaWxpbmcgZWRnZSwgZGl0dG8uXG4gIF8udGhyb3R0bGUgPSBmdW5jdGlvbihmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gICAgdmFyIGNvbnRleHQsIGFyZ3MsIHJlc3VsdDtcbiAgICB2YXIgdGltZW91dCA9IG51bGw7XG4gICAgdmFyIHByZXZpb3VzID0gMDtcbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTtcbiAgICB2YXIgbGF0ZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgIHByZXZpb3VzID0gb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSA/IDAgOiBfLm5vdygpO1xuICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgaWYgKCF0aW1lb3V0KSBjb250ZXh0ID0gYXJncyA9IG51bGw7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbm93ID0gXy5ub3coKTtcbiAgICAgIGlmICghcHJldmlvdXMgJiYgb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSkgcHJldmlvdXMgPSBub3c7XG4gICAgICB2YXIgcmVtYWluaW5nID0gd2FpdCAtIChub3cgLSBwcmV2aW91cyk7XG4gICAgICBjb250ZXh0ID0gdGhpcztcbiAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICBpZiAocmVtYWluaW5nIDw9IDAgfHwgcmVtYWluaW5nID4gd2FpdCkge1xuICAgICAgICBpZiAodGltZW91dCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBwcmV2aW91cyA9IG5vdztcbiAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgaWYgKCF0aW1lb3V0KSBjb250ZXh0ID0gYXJncyA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKCF0aW1lb3V0ICYmIG9wdGlvbnMudHJhaWxpbmcgIT09IGZhbHNlKSB7XG4gICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCByZW1haW5pbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICB9O1xuXG4gIC8vIFJldHVybnMgYSBmdW5jdGlvbiwgdGhhdCwgYXMgbG9uZyBhcyBpdCBjb250aW51ZXMgdG8gYmUgaW52b2tlZCwgd2lsbCBub3RcbiAgLy8gYmUgdHJpZ2dlcmVkLiBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgaXQgc3RvcHMgYmVpbmcgY2FsbGVkIGZvclxuICAvLyBOIG1pbGxpc2Vjb25kcy4gSWYgYGltbWVkaWF0ZWAgaXMgcGFzc2VkLCB0cmlnZ2VyIHRoZSBmdW5jdGlvbiBvbiB0aGVcbiAgLy8gbGVhZGluZyBlZGdlLCBpbnN0ZWFkIG9mIHRoZSB0cmFpbGluZy5cbiAgXy5kZWJvdW5jZSA9IGZ1bmN0aW9uKGZ1bmMsIHdhaXQsIGltbWVkaWF0ZSkge1xuICAgIHZhciB0aW1lb3V0LCBhcmdzLCBjb250ZXh0LCB0aW1lc3RhbXAsIHJlc3VsdDtcblxuICAgIHZhciBsYXRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGxhc3QgPSBfLm5vdygpIC0gdGltZXN0YW1wO1xuXG4gICAgICBpZiAobGFzdCA8IHdhaXQgJiYgbGFzdCA+PSAwKSB7XG4gICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCB3YWl0IC0gbGFzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgaWYgKCFpbW1lZGlhdGUpIHtcbiAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnRleHQgPSB0aGlzO1xuICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIHRpbWVzdGFtcCA9IF8ubm93KCk7XG4gICAgICB2YXIgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiAhdGltZW91dDtcbiAgICAgIGlmICghdGltZW91dCkgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuICAgICAgaWYgKGNhbGxOb3cpIHtcbiAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gIH07XG5cbiAgLy8gUmV0dXJucyB0aGUgZmlyc3QgZnVuY3Rpb24gcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBzZWNvbmQsXG4gIC8vIGFsbG93aW5nIHlvdSB0byBhZGp1c3QgYXJndW1lbnRzLCBydW4gY29kZSBiZWZvcmUgYW5kIGFmdGVyLCBhbmRcbiAgLy8gY29uZGl0aW9uYWxseSBleGVjdXRlIHRoZSBvcmlnaW5hbCBmdW5jdGlvbi5cbiAgXy53cmFwID0gZnVuY3Rpb24oZnVuYywgd3JhcHBlcikge1xuICAgIHJldHVybiBfLnBhcnRpYWwod3JhcHBlciwgZnVuYyk7XG4gIH07XG5cbiAgLy8gUmV0dXJucyBhIG5lZ2F0ZWQgdmVyc2lvbiBvZiB0aGUgcGFzc2VkLWluIHByZWRpY2F0ZS5cbiAgXy5uZWdhdGUgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gIXByZWRpY2F0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH07XG5cbiAgLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgaXMgdGhlIGNvbXBvc2l0aW9uIG9mIGEgbGlzdCBvZiBmdW5jdGlvbnMsIGVhY2hcbiAgLy8gY29uc3VtaW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIHRoYXQgZm9sbG93cy5cbiAgXy5jb21wb3NlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIHN0YXJ0ID0gYXJncy5sZW5ndGggLSAxO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBpID0gc3RhcnQ7XG4gICAgICB2YXIgcmVzdWx0ID0gYXJnc1tzdGFydF0uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIHdoaWxlIChpLS0pIHJlc3VsdCA9IGFyZ3NbaV0uY2FsbCh0aGlzLCByZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICB9O1xuXG4gIC8vIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgb25seSBiZSBleGVjdXRlZCBvbiBhbmQgYWZ0ZXIgdGhlIE50aCBjYWxsLlxuICBfLmFmdGVyID0gZnVuY3Rpb24odGltZXMsIGZ1bmMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoLS10aW1lcyA8IDEpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIC8vIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgb25seSBiZSBleGVjdXRlZCB1cCB0byAoYnV0IG5vdCBpbmNsdWRpbmcpIHRoZSBOdGggY2FsbC5cbiAgXy5iZWZvcmUgPSBmdW5jdGlvbih0aW1lcywgZnVuYykge1xuICAgIHZhciBtZW1vO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICgtLXRpbWVzID4gMCkge1xuICAgICAgICBtZW1vID0gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgaWYgKHRpbWVzIDw9IDEpIGZ1bmMgPSBudWxsO1xuICAgICAgcmV0dXJuIG1lbW87XG4gICAgfTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGF0IG1vc3Qgb25lIHRpbWUsIG5vIG1hdHRlciBob3dcbiAgLy8gb2Z0ZW4geW91IGNhbGwgaXQuIFVzZWZ1bCBmb3IgbGF6eSBpbml0aWFsaXphdGlvbi5cbiAgXy5vbmNlID0gXy5wYXJ0aWFsKF8uYmVmb3JlLCAyKTtcblxuICAvLyBPYmplY3QgRnVuY3Rpb25zXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBLZXlzIGluIElFIDwgOSB0aGF0IHdvbid0IGJlIGl0ZXJhdGVkIGJ5IGBmb3Iga2V5IGluIC4uLmAgYW5kIHRodXMgbWlzc2VkLlxuICB2YXIgaGFzRW51bUJ1ZyA9ICF7dG9TdHJpbmc6IG51bGx9LnByb3BlcnR5SXNFbnVtZXJhYmxlKCd0b1N0cmluZycpO1xuICB2YXIgbm9uRW51bWVyYWJsZVByb3BzID0gWyd2YWx1ZU9mJywgJ2lzUHJvdG90eXBlT2YnLCAndG9TdHJpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICdoYXNPd25Qcm9wZXJ0eScsICd0b0xvY2FsZVN0cmluZyddO1xuXG4gIGZ1bmN0aW9uIGNvbGxlY3ROb25FbnVtUHJvcHMob2JqLCBrZXlzKSB7XG4gICAgdmFyIG5vbkVudW1JZHggPSBub25FbnVtZXJhYmxlUHJvcHMubGVuZ3RoO1xuICAgIHZhciBjb25zdHJ1Y3RvciA9IG9iai5jb25zdHJ1Y3RvcjtcbiAgICB2YXIgcHJvdG8gPSAoXy5pc0Z1bmN0aW9uKGNvbnN0cnVjdG9yKSAmJiBjb25zdHJ1Y3Rvci5wcm90b3R5cGUpIHx8IE9ialByb3RvO1xuXG4gICAgLy8gQ29uc3RydWN0b3IgaXMgYSBzcGVjaWFsIGNhc2UuXG4gICAgdmFyIHByb3AgPSAnY29uc3RydWN0b3InO1xuICAgIGlmIChfLmhhcyhvYmosIHByb3ApICYmICFfLmNvbnRhaW5zKGtleXMsIHByb3ApKSBrZXlzLnB1c2gocHJvcCk7XG5cbiAgICB3aGlsZSAobm9uRW51bUlkeC0tKSB7XG4gICAgICBwcm9wID0gbm9uRW51bWVyYWJsZVByb3BzW25vbkVudW1JZHhdO1xuICAgICAgaWYgKHByb3AgaW4gb2JqICYmIG9ialtwcm9wXSAhPT0gcHJvdG9bcHJvcF0gJiYgIV8uY29udGFpbnMoa2V5cywgcHJvcCkpIHtcbiAgICAgICAga2V5cy5wdXNoKHByb3ApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFJldHJpZXZlIHRoZSBuYW1lcyBvZiBhbiBvYmplY3QncyBvd24gcHJvcGVydGllcy5cbiAgLy8gRGVsZWdhdGVzIHRvICoqRUNNQVNjcmlwdCA1KioncyBuYXRpdmUgYE9iamVjdC5rZXlzYFxuICBfLmtleXMgPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAoIV8uaXNPYmplY3Qob2JqKSkgcmV0dXJuIFtdO1xuICAgIGlmIChuYXRpdmVLZXlzKSByZXR1cm4gbmF0aXZlS2V5cyhvYmopO1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikgaWYgKF8uaGFzKG9iaiwga2V5KSkga2V5cy5wdXNoKGtleSk7XG4gICAgLy8gQWhlbSwgSUUgPCA5LlxuICAgIGlmIChoYXNFbnVtQnVnKSBjb2xsZWN0Tm9uRW51bVByb3BzKG9iaiwga2V5cyk7XG4gICAgcmV0dXJuIGtleXM7XG4gIH07XG5cbiAgLy8gUmV0cmlldmUgYWxsIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBhbiBvYmplY3QuXG4gIF8uYWxsS2V5cyA9IGZ1bmN0aW9uKG9iaikge1xuICAgIGlmICghXy5pc09iamVjdChvYmopKSByZXR1cm4gW107XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSBrZXlzLnB1c2goa2V5KTtcbiAgICAvLyBBaGVtLCBJRSA8IDkuXG4gICAgaWYgKGhhc0VudW1CdWcpIGNvbGxlY3ROb25FbnVtUHJvcHMob2JqLCBrZXlzKTtcbiAgICByZXR1cm4ga2V5cztcbiAgfTtcblxuICAvLyBSZXRyaWV2ZSB0aGUgdmFsdWVzIG9mIGFuIG9iamVjdCdzIHByb3BlcnRpZXMuXG4gIF8udmFsdWVzID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgdmFyIGtleXMgPSBfLmtleXMob2JqKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIHZhbHVlcyA9IEFycmF5KGxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWVzW2ldID0gb2JqW2tleXNbaV1dO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9O1xuXG4gIC8vIFJldHVybnMgdGhlIHJlc3VsdHMgb2YgYXBwbHlpbmcgdGhlIGl0ZXJhdGVlIHRvIGVhY2ggZWxlbWVudCBvZiB0aGUgb2JqZWN0XG4gIC8vIEluIGNvbnRyYXN0IHRvIF8ubWFwIGl0IHJldHVybnMgYW4gb2JqZWN0XG4gIF8ubWFwT2JqZWN0ID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIGl0ZXJhdGVlID0gY2IoaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgIHZhciBrZXlzID0gIF8ua2V5cyhvYmopLFxuICAgICAgICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdHMgPSB7fSxcbiAgICAgICAgICBjdXJyZW50S2V5O1xuICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBjdXJyZW50S2V5ID0ga2V5c1tpbmRleF07XG4gICAgICAgIHJlc3VsdHNbY3VycmVudEtleV0gPSBpdGVyYXRlZShvYmpbY3VycmVudEtleV0sIGN1cnJlbnRLZXksIG9iaik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgfTtcblxuICAvLyBDb252ZXJ0IGFuIG9iamVjdCBpbnRvIGEgbGlzdCBvZiBgW2tleSwgdmFsdWVdYCBwYWlycy5cbiAgXy5wYWlycyA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHZhciBrZXlzID0gXy5rZXlzKG9iaik7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBwYWlycyA9IEFycmF5KGxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgcGFpcnNbaV0gPSBba2V5c1tpXSwgb2JqW2tleXNbaV1dXTtcbiAgICB9XG4gICAgcmV0dXJuIHBhaXJzO1xuICB9O1xuXG4gIC8vIEludmVydCB0aGUga2V5cyBhbmQgdmFsdWVzIG9mIGFuIG9iamVjdC4gVGhlIHZhbHVlcyBtdXN0IGJlIHNlcmlhbGl6YWJsZS5cbiAgXy5pbnZlcnQgPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgdmFyIGtleXMgPSBfLmtleXMob2JqKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0W29ialtrZXlzW2ldXV0gPSBrZXlzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIFJldHVybiBhIHNvcnRlZCBsaXN0IG9mIHRoZSBmdW5jdGlvbiBuYW1lcyBhdmFpbGFibGUgb24gdGhlIG9iamVjdC5cbiAgLy8gQWxpYXNlZCBhcyBgbWV0aG9kc2BcbiAgXy5mdW5jdGlvbnMgPSBfLm1ldGhvZHMgPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgbmFtZXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAoXy5pc0Z1bmN0aW9uKG9ialtrZXldKSkgbmFtZXMucHVzaChrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZXMuc29ydCgpO1xuICB9O1xuXG4gIC8vIEV4dGVuZCBhIGdpdmVuIG9iamVjdCB3aXRoIGFsbCB0aGUgcHJvcGVydGllcyBpbiBwYXNzZWQtaW4gb2JqZWN0KHMpLlxuICBfLmV4dGVuZCA9IGNyZWF0ZUFzc2lnbmVyKF8uYWxsS2V5cyk7XG5cbiAgLy8gQXNzaWducyBhIGdpdmVuIG9iamVjdCB3aXRoIGFsbCB0aGUgb3duIHByb3BlcnRpZXMgaW4gdGhlIHBhc3NlZC1pbiBvYmplY3QocylcbiAgLy8gKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ24pXG4gIF8uZXh0ZW5kT3duID0gXy5hc3NpZ24gPSBjcmVhdGVBc3NpZ25lcihfLmtleXMpO1xuXG4gIC8vIFJldHVybnMgdGhlIGZpcnN0IGtleSBvbiBhbiBvYmplY3QgdGhhdCBwYXNzZXMgYSBwcmVkaWNhdGUgdGVzdFxuICBfLmZpbmRLZXkgPSBmdW5jdGlvbihvYmosIHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHByZWRpY2F0ZSA9IGNiKHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgdmFyIGtleXMgPSBfLmtleXMob2JqKSwga2V5O1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgaWYgKHByZWRpY2F0ZShvYmpba2V5XSwga2V5LCBvYmopKSByZXR1cm4ga2V5O1xuICAgIH1cbiAgfTtcblxuICAvLyBSZXR1cm4gYSBjb3B5IG9mIHRoZSBvYmplY3Qgb25seSBjb250YWluaW5nIHRoZSB3aGl0ZWxpc3RlZCBwcm9wZXJ0aWVzLlxuICBfLnBpY2sgPSBmdW5jdGlvbihvYmplY3QsIG9pdGVyYXRlZSwgY29udGV4dCkge1xuICAgIHZhciByZXN1bHQgPSB7fSwgb2JqID0gb2JqZWN0LCBpdGVyYXRlZSwga2V5cztcbiAgICBpZiAob2JqID09IG51bGwpIHJldHVybiByZXN1bHQ7XG4gICAgaWYgKF8uaXNGdW5jdGlvbihvaXRlcmF0ZWUpKSB7XG4gICAgICBrZXlzID0gXy5hbGxLZXlzKG9iaik7XG4gICAgICBpdGVyYXRlZSA9IG9wdGltaXplQ2Iob2l0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAga2V5cyA9IGZsYXR0ZW4oYXJndW1lbnRzLCBmYWxzZSwgZmFsc2UsIDEpO1xuICAgICAgaXRlcmF0ZWUgPSBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmopIHsgcmV0dXJuIGtleSBpbiBvYmo7IH07XG4gICAgICBvYmogPSBPYmplY3Qob2JqKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgdmFyIHZhbHVlID0gb2JqW2tleV07XG4gICAgICBpZiAoaXRlcmF0ZWUodmFsdWUsIGtleSwgb2JqKSkgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAgLy8gUmV0dXJuIGEgY29weSBvZiB0aGUgb2JqZWN0IHdpdGhvdXQgdGhlIGJsYWNrbGlzdGVkIHByb3BlcnRpZXMuXG4gIF8ub21pdCA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKGl0ZXJhdGVlKSkge1xuICAgICAgaXRlcmF0ZWUgPSBfLm5lZ2F0ZShpdGVyYXRlZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBrZXlzID0gXy5tYXAoZmxhdHRlbihhcmd1bWVudHMsIGZhbHNlLCBmYWxzZSwgMSksIFN0cmluZyk7XG4gICAgICBpdGVyYXRlZSA9IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgcmV0dXJuICFfLmNvbnRhaW5zKGtleXMsIGtleSk7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gXy5waWNrKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpO1xuICB9O1xuXG4gIC8vIEZpbGwgaW4gYSBnaXZlbiBvYmplY3Qgd2l0aCBkZWZhdWx0IHByb3BlcnRpZXMuXG4gIF8uZGVmYXVsdHMgPSBjcmVhdGVBc3NpZ25lcihfLmFsbEtleXMsIHRydWUpO1xuXG4gIC8vIENyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgaW5oZXJpdHMgZnJvbSB0aGUgZ2l2ZW4gcHJvdG90eXBlIG9iamVjdC5cbiAgLy8gSWYgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGFyZSBwcm92aWRlZCB0aGVuIHRoZXkgd2lsbCBiZSBhZGRlZCB0byB0aGVcbiAgLy8gY3JlYXRlZCBvYmplY3QuXG4gIF8uY3JlYXRlID0gZnVuY3Rpb24ocHJvdG90eXBlLCBwcm9wcykge1xuICAgIHZhciByZXN1bHQgPSBiYXNlQ3JlYXRlKHByb3RvdHlwZSk7XG4gICAgaWYgKHByb3BzKSBfLmV4dGVuZE93bihyZXN1bHQsIHByb3BzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIENyZWF0ZSBhIChzaGFsbG93LWNsb25lZCkgZHVwbGljYXRlIG9mIGFuIG9iamVjdC5cbiAgXy5jbG9uZSA9IGZ1bmN0aW9uKG9iaikge1xuICAgIGlmICghXy5pc09iamVjdChvYmopKSByZXR1cm4gb2JqO1xuICAgIHJldHVybiBfLmlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogXy5leHRlbmQoe30sIG9iaik7XG4gIH07XG5cbiAgLy8gSW52b2tlcyBpbnRlcmNlcHRvciB3aXRoIHRoZSBvYmosIGFuZCB0aGVuIHJldHVybnMgb2JqLlxuICAvLyBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIFwidGFwIGludG9cIiBhIG1ldGhvZCBjaGFpbiwgaW5cbiAgLy8gb3JkZXIgdG8gcGVyZm9ybSBvcGVyYXRpb25zIG9uIGludGVybWVkaWF0ZSByZXN1bHRzIHdpdGhpbiB0aGUgY2hhaW4uXG4gIF8udGFwID0gZnVuY3Rpb24ob2JqLCBpbnRlcmNlcHRvcikge1xuICAgIGludGVyY2VwdG9yKG9iaik7XG4gICAgcmV0dXJuIG9iajtcbiAgfTtcblxuICAvLyBSZXR1cm5zIHdoZXRoZXIgYW4gb2JqZWN0IGhhcyBhIGdpdmVuIHNldCBvZiBga2V5OnZhbHVlYCBwYWlycy5cbiAgXy5pc01hdGNoID0gZnVuY3Rpb24ob2JqZWN0LCBhdHRycykge1xuICAgIHZhciBrZXlzID0gXy5rZXlzKGF0dHJzKSwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgaWYgKG9iamVjdCA9PSBudWxsKSByZXR1cm4gIWxlbmd0aDtcbiAgICB2YXIgb2JqID0gT2JqZWN0KG9iamVjdCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICBpZiAoYXR0cnNba2V5XSAhPT0gb2JqW2tleV0gfHwgIShrZXkgaW4gb2JqKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuXG4gIC8vIEludGVybmFsIHJlY3Vyc2l2ZSBjb21wYXJpc29uIGZ1bmN0aW9uIGZvciBgaXNFcXVhbGAuXG4gIHZhciBlcSA9IGZ1bmN0aW9uKGEsIGIsIGFTdGFjaywgYlN0YWNrKSB7XG4gICAgLy8gSWRlbnRpY2FsIG9iamVjdHMgYXJlIGVxdWFsLiBgMCA9PT0gLTBgLCBidXQgdGhleSBhcmVuJ3QgaWRlbnRpY2FsLlxuICAgIC8vIFNlZSB0aGUgW0hhcm1vbnkgYGVnYWxgIHByb3Bvc2FsXShodHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1oYXJtb255OmVnYWwpLlxuICAgIGlmIChhID09PSBiKSByZXR1cm4gYSAhPT0gMCB8fCAxIC8gYSA9PT0gMSAvIGI7XG4gICAgLy8gQSBzdHJpY3QgY29tcGFyaXNvbiBpcyBuZWNlc3NhcnkgYmVjYXVzZSBgbnVsbCA9PSB1bmRlZmluZWRgLlxuICAgIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gYSA9PT0gYjtcbiAgICAvLyBVbndyYXAgYW55IHdyYXBwZWQgb2JqZWN0cy5cbiAgICBpZiAoYSBpbnN0YW5jZW9mIF8pIGEgPSBhLl93cmFwcGVkO1xuICAgIGlmIChiIGluc3RhbmNlb2YgXykgYiA9IGIuX3dyYXBwZWQ7XG4gICAgLy8gQ29tcGFyZSBgW1tDbGFzc11dYCBuYW1lcy5cbiAgICB2YXIgY2xhc3NOYW1lID0gdG9TdHJpbmcuY2FsbChhKTtcbiAgICBpZiAoY2xhc3NOYW1lICE9PSB0b1N0cmluZy5jYWxsKGIpKSByZXR1cm4gZmFsc2U7XG4gICAgc3dpdGNoIChjbGFzc05hbWUpIHtcbiAgICAgIC8vIFN0cmluZ3MsIG51bWJlcnMsIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGRhdGVzLCBhbmQgYm9vbGVhbnMgYXJlIGNvbXBhcmVkIGJ5IHZhbHVlLlxuICAgICAgY2FzZSAnW29iamVjdCBSZWdFeHBdJzpcbiAgICAgIC8vIFJlZ0V4cHMgYXJlIGNvZXJjZWQgdG8gc3RyaW5ncyBmb3IgY29tcGFyaXNvbiAoTm90ZTogJycgKyAvYS9pID09PSAnL2EvaScpXG4gICAgICBjYXNlICdbb2JqZWN0IFN0cmluZ10nOlxuICAgICAgICAvLyBQcmltaXRpdmVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIG9iamVjdCB3cmFwcGVycyBhcmUgZXF1aXZhbGVudDsgdGh1cywgYFwiNVwiYCBpc1xuICAgICAgICAvLyBlcXVpdmFsZW50IHRvIGBuZXcgU3RyaW5nKFwiNVwiKWAuXG4gICAgICAgIHJldHVybiAnJyArIGEgPT09ICcnICsgYjtcbiAgICAgIGNhc2UgJ1tvYmplY3QgTnVtYmVyXSc6XG4gICAgICAgIC8vIGBOYU5gcyBhcmUgZXF1aXZhbGVudCwgYnV0IG5vbi1yZWZsZXhpdmUuXG4gICAgICAgIC8vIE9iamVjdChOYU4pIGlzIGVxdWl2YWxlbnQgdG8gTmFOXG4gICAgICAgIGlmICgrYSAhPT0gK2EpIHJldHVybiArYiAhPT0gK2I7XG4gICAgICAgIC8vIEFuIGBlZ2FsYCBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCBmb3Igb3RoZXIgbnVtZXJpYyB2YWx1ZXMuXG4gICAgICAgIHJldHVybiArYSA9PT0gMCA/IDEgLyArYSA9PT0gMSAvIGIgOiArYSA9PT0gK2I7XG4gICAgICBjYXNlICdbb2JqZWN0IERhdGVdJzpcbiAgICAgIGNhc2UgJ1tvYmplY3QgQm9vbGVhbl0nOlxuICAgICAgICAvLyBDb2VyY2UgZGF0ZXMgYW5kIGJvb2xlYW5zIHRvIG51bWVyaWMgcHJpbWl0aXZlIHZhbHVlcy4gRGF0ZXMgYXJlIGNvbXBhcmVkIGJ5IHRoZWlyXG4gICAgICAgIC8vIG1pbGxpc2Vjb25kIHJlcHJlc2VudGF0aW9ucy4gTm90ZSB0aGF0IGludmFsaWQgZGF0ZXMgd2l0aCBtaWxsaXNlY29uZCByZXByZXNlbnRhdGlvbnNcbiAgICAgICAgLy8gb2YgYE5hTmAgYXJlIG5vdCBlcXVpdmFsZW50LlxuICAgICAgICByZXR1cm4gK2EgPT09ICtiO1xuICAgIH1cblxuICAgIHZhciBhcmVBcnJheXMgPSBjbGFzc05hbWUgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgaWYgKCFhcmVBcnJheXMpIHtcbiAgICAgIGlmICh0eXBlb2YgYSAhPSAnb2JqZWN0JyB8fCB0eXBlb2YgYiAhPSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBPYmplY3RzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWl2YWxlbnQsIGJ1dCBgT2JqZWN0YHMgb3IgYEFycmF5YHNcbiAgICAgIC8vIGZyb20gZGlmZmVyZW50IGZyYW1lcyBhcmUuXG4gICAgICB2YXIgYUN0b3IgPSBhLmNvbnN0cnVjdG9yLCBiQ3RvciA9IGIuY29uc3RydWN0b3I7XG4gICAgICBpZiAoYUN0b3IgIT09IGJDdG9yICYmICEoXy5pc0Z1bmN0aW9uKGFDdG9yKSAmJiBhQ3RvciBpbnN0YW5jZW9mIGFDdG9yICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5pc0Z1bmN0aW9uKGJDdG9yKSAmJiBiQ3RvciBpbnN0YW5jZW9mIGJDdG9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoJ2NvbnN0cnVjdG9yJyBpbiBhICYmICdjb25zdHJ1Y3RvcicgaW4gYikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBBc3N1bWUgZXF1YWxpdHkgZm9yIGN5Y2xpYyBzdHJ1Y3R1cmVzLiBUaGUgYWxnb3JpdGhtIGZvciBkZXRlY3RpbmcgY3ljbGljXG4gICAgLy8gc3RydWN0dXJlcyBpcyBhZGFwdGVkIGZyb20gRVMgNS4xIHNlY3Rpb24gMTUuMTIuMywgYWJzdHJhY3Qgb3BlcmF0aW9uIGBKT2AuXG5cbiAgICAvLyBJbml0aWFsaXppbmcgc3RhY2sgb2YgdHJhdmVyc2VkIG9iamVjdHMuXG4gICAgLy8gSXQncyBkb25lIGhlcmUgc2luY2Ugd2Ugb25seSBuZWVkIHRoZW0gZm9yIG9iamVjdHMgYW5kIGFycmF5cyBjb21wYXJpc29uLlxuICAgIGFTdGFjayA9IGFTdGFjayB8fCBbXTtcbiAgICBiU3RhY2sgPSBiU3RhY2sgfHwgW107XG4gICAgdmFyIGxlbmd0aCA9IGFTdGFjay5sZW5ndGg7XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAvLyBMaW5lYXIgc2VhcmNoLiBQZXJmb3JtYW5jZSBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2ZcbiAgICAgIC8vIHVuaXF1ZSBuZXN0ZWQgc3RydWN0dXJlcy5cbiAgICAgIGlmIChhU3RhY2tbbGVuZ3RoXSA9PT0gYSkgcmV0dXJuIGJTdGFja1tsZW5ndGhdID09PSBiO1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgZmlyc3Qgb2JqZWN0IHRvIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgICBhU3RhY2sucHVzaChhKTtcbiAgICBiU3RhY2sucHVzaChiKTtcblxuICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyBhbmQgYXJyYXlzLlxuICAgIGlmIChhcmVBcnJheXMpIHtcbiAgICAgIC8vIENvbXBhcmUgYXJyYXkgbGVuZ3RocyB0byBkZXRlcm1pbmUgaWYgYSBkZWVwIGNvbXBhcmlzb24gaXMgbmVjZXNzYXJ5LlxuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gRGVlcCBjb21wYXJlIHRoZSBjb250ZW50cywgaWdub3Jpbmcgbm9uLW51bWVyaWMgcHJvcGVydGllcy5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBpZiAoIWVxKGFbbGVuZ3RoXSwgYltsZW5ndGhdLCBhU3RhY2ssIGJTdGFjaykpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVlcCBjb21wYXJlIG9iamVjdHMuXG4gICAgICB2YXIga2V5cyA9IF8ua2V5cyhhKSwga2V5O1xuICAgICAgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgICAvLyBFbnN1cmUgdGhhdCBib3RoIG9iamVjdHMgY29udGFpbiB0aGUgc2FtZSBudW1iZXIgb2YgcHJvcGVydGllcyBiZWZvcmUgY29tcGFyaW5nIGRlZXAgZXF1YWxpdHkuXG4gICAgICBpZiAoXy5rZXlzKGIpLmxlbmd0aCAhPT0gbGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgLy8gRGVlcCBjb21wYXJlIGVhY2ggbWVtYmVyXG4gICAgICAgIGtleSA9IGtleXNbbGVuZ3RoXTtcbiAgICAgICAgaWYgKCEoXy5oYXMoYiwga2V5KSAmJiBlcShhW2tleV0sIGJba2V5XSwgYVN0YWNrLCBiU3RhY2spKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZW1vdmUgdGhlIGZpcnN0IG9iamVjdCBmcm9tIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgICBhU3RhY2sucG9wKCk7XG4gICAgYlN0YWNrLnBvcCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIC8vIFBlcmZvcm0gYSBkZWVwIGNvbXBhcmlzb24gdG8gY2hlY2sgaWYgdHdvIG9iamVjdHMgYXJlIGVxdWFsLlxuICBfLmlzRXF1YWwgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGVxKGEsIGIpO1xuICB9O1xuXG4gIC8vIElzIGEgZ2l2ZW4gYXJyYXksIHN0cmluZywgb3Igb2JqZWN0IGVtcHR5P1xuICAvLyBBbiBcImVtcHR5XCIgb2JqZWN0IGhhcyBubyBlbnVtZXJhYmxlIG93bi1wcm9wZXJ0aWVzLlxuICBfLmlzRW1wdHkgPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAob2JqID09IG51bGwpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0FycmF5TGlrZShvYmopICYmIChfLmlzQXJyYXkob2JqKSB8fCBfLmlzU3RyaW5nKG9iaikgfHwgXy5pc0FyZ3VtZW50cyhvYmopKSkgcmV0dXJuIG9iai5sZW5ndGggPT09IDA7XG4gICAgcmV0dXJuIF8ua2V5cyhvYmopLmxlbmd0aCA9PT0gMDtcbiAgfTtcblxuICAvLyBJcyBhIGdpdmVuIHZhbHVlIGEgRE9NIGVsZW1lbnQ/XG4gIF8uaXNFbGVtZW50ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuICEhKG9iaiAmJiBvYmoubm9kZVR5cGUgPT09IDEpO1xuICB9O1xuXG4gIC8vIElzIGEgZ2l2ZW4gdmFsdWUgYW4gYXJyYXk/XG4gIC8vIERlbGVnYXRlcyB0byBFQ01BNSdzIG5hdGl2ZSBBcnJheS5pc0FycmF5XG4gIF8uaXNBcnJheSA9IG5hdGl2ZUlzQXJyYXkgfHwgZnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgfTtcblxuICAvLyBJcyBhIGdpdmVuIHZhcmlhYmxlIGFuIG9iamVjdD9cbiAgXy5pc09iamVjdCA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHZhciB0eXBlID0gdHlwZW9mIG9iajtcbiAgICByZXR1cm4gdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlID09PSAnb2JqZWN0JyAmJiAhIW9iajtcbiAgfTtcblxuICAvLyBBZGQgc29tZSBpc1R5cGUgbWV0aG9kczogaXNBcmd1bWVudHMsIGlzRnVuY3Rpb24sIGlzU3RyaW5nLCBpc051bWJlciwgaXNEYXRlLCBpc1JlZ0V4cCwgaXNFcnJvci5cbiAgXy5lYWNoKFsnQXJndW1lbnRzJywgJ0Z1bmN0aW9uJywgJ1N0cmluZycsICdOdW1iZXInLCAnRGF0ZScsICdSZWdFeHAnLCAnRXJyb3InXSwgZnVuY3Rpb24obmFtZSkge1xuICAgIF9bJ2lzJyArIG5hbWVdID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCAnICsgbmFtZSArICddJztcbiAgICB9O1xuICB9KTtcblxuICAvLyBEZWZpbmUgYSBmYWxsYmFjayB2ZXJzaW9uIG9mIHRoZSBtZXRob2QgaW4gYnJvd3NlcnMgKGFoZW0sIElFIDwgOSksIHdoZXJlXG4gIC8vIHRoZXJlIGlzbid0IGFueSBpbnNwZWN0YWJsZSBcIkFyZ3VtZW50c1wiIHR5cGUuXG4gIGlmICghXy5pc0FyZ3VtZW50cyhhcmd1bWVudHMpKSB7XG4gICAgXy5pc0FyZ3VtZW50cyA9IGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIF8uaGFzKG9iaiwgJ2NhbGxlZScpO1xuICAgIH07XG4gIH1cblxuICAvLyBPcHRpbWl6ZSBgaXNGdW5jdGlvbmAgaWYgYXBwcm9wcmlhdGUuIFdvcmsgYXJvdW5kIHNvbWUgdHlwZW9mIGJ1Z3MgaW4gb2xkIHY4LFxuICAvLyBJRSAxMSAoIzE2MjEpLCBhbmQgaW4gU2FmYXJpIDggKCMxOTI5KS5cbiAgaWYgKHR5cGVvZiAvLi8gIT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgSW50OEFycmF5ICE9ICdvYmplY3QnKSB7XG4gICAgXy5pc0Z1bmN0aW9uID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PSAnZnVuY3Rpb24nIHx8IGZhbHNlO1xuICAgIH07XG4gIH1cblxuICAvLyBJcyBhIGdpdmVuIG9iamVjdCBhIGZpbml0ZSBudW1iZXI/XG4gIF8uaXNGaW5pdGUgPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gaXNGaW5pdGUob2JqKSAmJiAhaXNOYU4ocGFyc2VGbG9hdChvYmopKTtcbiAgfTtcblxuICAvLyBJcyB0aGUgZ2l2ZW4gdmFsdWUgYE5hTmA/IChOYU4gaXMgdGhlIG9ubHkgbnVtYmVyIHdoaWNoIGRvZXMgbm90IGVxdWFsIGl0c2VsZikuXG4gIF8uaXNOYU4gPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gXy5pc051bWJlcihvYmopICYmIG9iaiAhPT0gK29iajtcbiAgfTtcblxuICAvLyBJcyBhIGdpdmVuIHZhbHVlIGEgYm9vbGVhbj9cbiAgXy5pc0Jvb2xlYW4gPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSB0cnVlIHx8IG9iaiA9PT0gZmFsc2UgfHwgdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBCb29sZWFuXSc7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiB2YWx1ZSBlcXVhbCB0byBudWxsP1xuICBfLmlzTnVsbCA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiBvYmogPT09IG51bGw7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiB2YXJpYWJsZSB1bmRlZmluZWQ/XG4gIF8uaXNVbmRlZmluZWQgPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSB2b2lkIDA7XG4gIH07XG5cbiAgLy8gU2hvcnRjdXQgZnVuY3Rpb24gZm9yIGNoZWNraW5nIGlmIGFuIG9iamVjdCBoYXMgYSBnaXZlbiBwcm9wZXJ0eSBkaXJlY3RseVxuICAvLyBvbiBpdHNlbGYgKGluIG90aGVyIHdvcmRzLCBub3Qgb24gYSBwcm90b3R5cGUpLlxuICBfLmhhcyA9IGZ1bmN0aW9uKG9iaiwga2V5KSB7XG4gICAgcmV0dXJuIG9iaiAhPSBudWxsICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpO1xuICB9O1xuXG4gIC8vIFV0aWxpdHkgRnVuY3Rpb25zXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gUnVuIFVuZGVyc2NvcmUuanMgaW4gKm5vQ29uZmxpY3QqIG1vZGUsIHJldHVybmluZyB0aGUgYF9gIHZhcmlhYmxlIHRvIGl0c1xuICAvLyBwcmV2aW91cyBvd25lci4gUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgVW5kZXJzY29yZSBvYmplY3QuXG4gIF8ubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgIHJvb3QuXyA9IHByZXZpb3VzVW5kZXJzY29yZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBLZWVwIHRoZSBpZGVudGl0eSBmdW5jdGlvbiBhcm91bmQgZm9yIGRlZmF1bHQgaXRlcmF0ZWVzLlxuICBfLmlkZW50aXR5ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgLy8gUHJlZGljYXRlLWdlbmVyYXRpbmcgZnVuY3Rpb25zLiBPZnRlbiB1c2VmdWwgb3V0c2lkZSBvZiBVbmRlcnNjb3JlLlxuICBfLmNvbnN0YW50ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgfTtcblxuICBfLm5vb3AgPSBmdW5jdGlvbigpe307XG5cbiAgXy5wcm9wZXJ0eSA9IHByb3BlcnR5O1xuXG4gIC8vIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIGZvciBhIGdpdmVuIG9iamVjdCB0aGF0IHJldHVybnMgYSBnaXZlbiBwcm9wZXJ0eS5cbiAgXy5wcm9wZXJ0eU9mID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuIG9iaiA9PSBudWxsID8gZnVuY3Rpb24oKXt9IDogZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gb2JqW2tleV07XG4gICAgfTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGEgcHJlZGljYXRlIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIG9iamVjdCBoYXMgYSBnaXZlbiBzZXQgb2ZcbiAgLy8gYGtleTp2YWx1ZWAgcGFpcnMuXG4gIF8ubWF0Y2hlciA9IF8ubWF0Y2hlcyA9IGZ1bmN0aW9uKGF0dHJzKSB7XG4gICAgYXR0cnMgPSBfLmV4dGVuZE93bih7fSwgYXR0cnMpO1xuICAgIHJldHVybiBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBfLmlzTWF0Y2gob2JqLCBhdHRycyk7XG4gICAgfTtcbiAgfTtcblxuICAvLyBSdW4gYSBmdW5jdGlvbiAqKm4qKiB0aW1lcy5cbiAgXy50aW1lcyA9IGZ1bmN0aW9uKG4sIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgdmFyIGFjY3VtID0gQXJyYXkoTWF0aC5tYXgoMCwgbikpO1xuICAgIGl0ZXJhdGVlID0gb3B0aW1pemVDYihpdGVyYXRlZSwgY29udGV4dCwgMSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIGFjY3VtW2ldID0gaXRlcmF0ZWUoaSk7XG4gICAgcmV0dXJuIGFjY3VtO1xuICB9O1xuXG4gIC8vIFJldHVybiBhIHJhbmRvbSBpbnRlZ2VyIGJldHdlZW4gbWluIGFuZCBtYXggKGluY2x1c2l2ZSkuXG4gIF8ucmFuZG9tID0gZnVuY3Rpb24obWluLCBtYXgpIHtcbiAgICBpZiAobWF4ID09IG51bGwpIHtcbiAgICAgIG1heCA9IG1pbjtcbiAgICAgIG1pbiA9IDA7XG4gICAgfVxuICAgIHJldHVybiBtaW4gKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpO1xuICB9O1xuXG4gIC8vIEEgKHBvc3NpYmx5IGZhc3Rlcikgd2F5IHRvIGdldCB0aGUgY3VycmVudCB0aW1lc3RhbXAgYXMgYW4gaW50ZWdlci5cbiAgXy5ub3cgPSBEYXRlLm5vdyB8fCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIH07XG5cbiAgIC8vIExpc3Qgb2YgSFRNTCBlbnRpdGllcyBmb3IgZXNjYXBpbmcuXG4gIHZhciBlc2NhcGVNYXAgPSB7XG4gICAgJyYnOiAnJmFtcDsnLFxuICAgICc8JzogJyZsdDsnLFxuICAgICc+JzogJyZndDsnLFxuICAgICdcIic6ICcmcXVvdDsnLFxuICAgIFwiJ1wiOiAnJiN4Mjc7JyxcbiAgICAnYCc6ICcmI3g2MDsnXG4gIH07XG4gIHZhciB1bmVzY2FwZU1hcCA9IF8uaW52ZXJ0KGVzY2FwZU1hcCk7XG5cbiAgLy8gRnVuY3Rpb25zIGZvciBlc2NhcGluZyBhbmQgdW5lc2NhcGluZyBzdHJpbmdzIHRvL2Zyb20gSFRNTCBpbnRlcnBvbGF0aW9uLlxuICB2YXIgY3JlYXRlRXNjYXBlciA9IGZ1bmN0aW9uKG1hcCkge1xuICAgIHZhciBlc2NhcGVyID0gZnVuY3Rpb24obWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXBbbWF0Y2hdO1xuICAgIH07XG4gICAgLy8gUmVnZXhlcyBmb3IgaWRlbnRpZnlpbmcgYSBrZXkgdGhhdCBuZWVkcyB0byBiZSBlc2NhcGVkXG4gICAgdmFyIHNvdXJjZSA9ICcoPzonICsgXy5rZXlzKG1hcCkuam9pbignfCcpICsgJyknO1xuICAgIHZhciB0ZXN0UmVnZXhwID0gUmVnRXhwKHNvdXJjZSk7XG4gICAgdmFyIHJlcGxhY2VSZWdleHAgPSBSZWdFeHAoc291cmNlLCAnZycpO1xuICAgIHJldHVybiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHN0cmluZyA9PSBudWxsID8gJycgOiAnJyArIHN0cmluZztcbiAgICAgIHJldHVybiB0ZXN0UmVnZXhwLnRlc3Qoc3RyaW5nKSA/IHN0cmluZy5yZXBsYWNlKHJlcGxhY2VSZWdleHAsIGVzY2FwZXIpIDogc3RyaW5nO1xuICAgIH07XG4gIH07XG4gIF8uZXNjYXBlID0gY3JlYXRlRXNjYXBlcihlc2NhcGVNYXApO1xuICBfLnVuZXNjYXBlID0gY3JlYXRlRXNjYXBlcih1bmVzY2FwZU1hcCk7XG5cbiAgLy8gSWYgdGhlIHZhbHVlIG9mIHRoZSBuYW1lZCBgcHJvcGVydHlgIGlzIGEgZnVuY3Rpb24gdGhlbiBpbnZva2UgaXQgd2l0aCB0aGVcbiAgLy8gYG9iamVjdGAgYXMgY29udGV4dDsgb3RoZXJ3aXNlLCByZXR1cm4gaXQuXG4gIF8ucmVzdWx0ID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSwgZmFsbGJhY2spIHtcbiAgICB2YXIgdmFsdWUgPSBvYmplY3QgPT0gbnVsbCA/IHZvaWQgMCA6IG9iamVjdFtwcm9wZXJ0eV07XG4gICAgaWYgKHZhbHVlID09PSB2b2lkIDApIHtcbiAgICAgIHZhbHVlID0gZmFsbGJhY2s7XG4gICAgfVxuICAgIHJldHVybiBfLmlzRnVuY3Rpb24odmFsdWUpID8gdmFsdWUuY2FsbChvYmplY3QpIDogdmFsdWU7XG4gIH07XG5cbiAgLy8gR2VuZXJhdGUgYSB1bmlxdWUgaW50ZWdlciBpZCAodW5pcXVlIHdpdGhpbiB0aGUgZW50aXJlIGNsaWVudCBzZXNzaW9uKS5cbiAgLy8gVXNlZnVsIGZvciB0ZW1wb3JhcnkgRE9NIGlkcy5cbiAgdmFyIGlkQ291bnRlciA9IDA7XG4gIF8udW5pcXVlSWQgPSBmdW5jdGlvbihwcmVmaXgpIHtcbiAgICB2YXIgaWQgPSArK2lkQ291bnRlciArICcnO1xuICAgIHJldHVybiBwcmVmaXggPyBwcmVmaXggKyBpZCA6IGlkO1xuICB9O1xuXG4gIC8vIEJ5IGRlZmF1bHQsIFVuZGVyc2NvcmUgdXNlcyBFUkItc3R5bGUgdGVtcGxhdGUgZGVsaW1pdGVycywgY2hhbmdlIHRoZVxuICAvLyBmb2xsb3dpbmcgdGVtcGxhdGUgc2V0dGluZ3MgdG8gdXNlIGFsdGVybmF0aXZlIGRlbGltaXRlcnMuXG4gIF8udGVtcGxhdGVTZXR0aW5ncyA9IHtcbiAgICBldmFsdWF0ZSAgICA6IC88JShbXFxzXFxTXSs/KSU+L2csXG4gICAgaW50ZXJwb2xhdGUgOiAvPCU9KFtcXHNcXFNdKz8pJT4vZyxcbiAgICBlc2NhcGUgICAgICA6IC88JS0oW1xcc1xcU10rPyklPi9nXG4gIH07XG5cbiAgLy8gV2hlbiBjdXN0b21pemluZyBgdGVtcGxhdGVTZXR0aW5nc2AsIGlmIHlvdSBkb24ndCB3YW50IHRvIGRlZmluZSBhblxuICAvLyBpbnRlcnBvbGF0aW9uLCBldmFsdWF0aW9uIG9yIGVzY2FwaW5nIHJlZ2V4LCB3ZSBuZWVkIG9uZSB0aGF0IGlzXG4gIC8vIGd1YXJhbnRlZWQgbm90IHRvIG1hdGNoLlxuICB2YXIgbm9NYXRjaCA9IC8oLileLztcblxuICAvLyBDZXJ0YWluIGNoYXJhY3RlcnMgbmVlZCB0byBiZSBlc2NhcGVkIHNvIHRoYXQgdGhleSBjYW4gYmUgcHV0IGludG8gYVxuICAvLyBzdHJpbmcgbGl0ZXJhbC5cbiAgdmFyIGVzY2FwZXMgPSB7XG4gICAgXCInXCI6ICAgICAgXCInXCIsXG4gICAgJ1xcXFwnOiAgICAgJ1xcXFwnLFxuICAgICdcXHInOiAgICAgJ3InLFxuICAgICdcXG4nOiAgICAgJ24nLFxuICAgICdcXHUyMDI4JzogJ3UyMDI4JyxcbiAgICAnXFx1MjAyOSc6ICd1MjAyOSdcbiAgfTtcblxuICB2YXIgZXNjYXBlciA9IC9cXFxcfCd8XFxyfFxcbnxcXHUyMDI4fFxcdTIwMjkvZztcblxuICB2YXIgZXNjYXBlQ2hhciA9IGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgcmV0dXJuICdcXFxcJyArIGVzY2FwZXNbbWF0Y2hdO1xuICB9O1xuXG4gIC8vIEphdmFTY3JpcHQgbWljcm8tdGVtcGxhdGluZywgc2ltaWxhciB0byBKb2huIFJlc2lnJ3MgaW1wbGVtZW50YXRpb24uXG4gIC8vIFVuZGVyc2NvcmUgdGVtcGxhdGluZyBoYW5kbGVzIGFyYml0cmFyeSBkZWxpbWl0ZXJzLCBwcmVzZXJ2ZXMgd2hpdGVzcGFjZSxcbiAgLy8gYW5kIGNvcnJlY3RseSBlc2NhcGVzIHF1b3RlcyB3aXRoaW4gaW50ZXJwb2xhdGVkIGNvZGUuXG4gIC8vIE5COiBgb2xkU2V0dGluZ3NgIG9ubHkgZXhpc3RzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAgXy50ZW1wbGF0ZSA9IGZ1bmN0aW9uKHRleHQsIHNldHRpbmdzLCBvbGRTZXR0aW5ncykge1xuICAgIGlmICghc2V0dGluZ3MgJiYgb2xkU2V0dGluZ3MpIHNldHRpbmdzID0gb2xkU2V0dGluZ3M7XG4gICAgc2V0dGluZ3MgPSBfLmRlZmF1bHRzKHt9LCBzZXR0aW5ncywgXy50ZW1wbGF0ZVNldHRpbmdzKTtcblxuICAgIC8vIENvbWJpbmUgZGVsaW1pdGVycyBpbnRvIG9uZSByZWd1bGFyIGV4cHJlc3Npb24gdmlhIGFsdGVybmF0aW9uLlxuICAgIHZhciBtYXRjaGVyID0gUmVnRXhwKFtcbiAgICAgIChzZXR0aW5ncy5lc2NhcGUgfHwgbm9NYXRjaCkuc291cmNlLFxuICAgICAgKHNldHRpbmdzLmludGVycG9sYXRlIHx8IG5vTWF0Y2gpLnNvdXJjZSxcbiAgICAgIChzZXR0aW5ncy5ldmFsdWF0ZSB8fCBub01hdGNoKS5zb3VyY2VcbiAgICBdLmpvaW4oJ3wnKSArICd8JCcsICdnJyk7XG5cbiAgICAvLyBDb21waWxlIHRoZSB0ZW1wbGF0ZSBzb3VyY2UsIGVzY2FwaW5nIHN0cmluZyBsaXRlcmFscyBhcHByb3ByaWF0ZWx5LlxuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIHNvdXJjZSA9IFwiX19wKz0nXCI7XG4gICAgdGV4dC5yZXBsYWNlKG1hdGNoZXIsIGZ1bmN0aW9uKG1hdGNoLCBlc2NhcGUsIGludGVycG9sYXRlLCBldmFsdWF0ZSwgb2Zmc2V0KSB7XG4gICAgICBzb3VyY2UgKz0gdGV4dC5zbGljZShpbmRleCwgb2Zmc2V0KS5yZXBsYWNlKGVzY2FwZXIsIGVzY2FwZUNoYXIpO1xuICAgICAgaW5kZXggPSBvZmZzZXQgKyBtYXRjaC5sZW5ndGg7XG5cbiAgICAgIGlmIChlc2NhcGUpIHtcbiAgICAgICAgc291cmNlICs9IFwiJytcXG4oKF9fdD0oXCIgKyBlc2NhcGUgKyBcIikpPT1udWxsPycnOl8uZXNjYXBlKF9fdCkpK1xcbidcIjtcbiAgICAgIH0gZWxzZSBpZiAoaW50ZXJwb2xhdGUpIHtcbiAgICAgICAgc291cmNlICs9IFwiJytcXG4oKF9fdD0oXCIgKyBpbnRlcnBvbGF0ZSArIFwiKSk9PW51bGw/Jyc6X190KStcXG4nXCI7XG4gICAgICB9IGVsc2UgaWYgKGV2YWx1YXRlKSB7XG4gICAgICAgIHNvdXJjZSArPSBcIic7XFxuXCIgKyBldmFsdWF0ZSArIFwiXFxuX19wKz0nXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkb2JlIFZNcyBuZWVkIHRoZSBtYXRjaCByZXR1cm5lZCB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IG9mZmVzdC5cbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9KTtcbiAgICBzb3VyY2UgKz0gXCInO1xcblwiO1xuXG4gICAgLy8gSWYgYSB2YXJpYWJsZSBpcyBub3Qgc3BlY2lmaWVkLCBwbGFjZSBkYXRhIHZhbHVlcyBpbiBsb2NhbCBzY29wZS5cbiAgICBpZiAoIXNldHRpbmdzLnZhcmlhYmxlKSBzb3VyY2UgPSAnd2l0aChvYmp8fHt9KXtcXG4nICsgc291cmNlICsgJ31cXG4nO1xuXG4gICAgc291cmNlID0gXCJ2YXIgX190LF9fcD0nJyxfX2o9QXJyYXkucHJvdG90eXBlLmpvaW4sXCIgK1xuICAgICAgXCJwcmludD1mdW5jdGlvbigpe19fcCs9X19qLmNhbGwoYXJndW1lbnRzLCcnKTt9O1xcblwiICtcbiAgICAgIHNvdXJjZSArICdyZXR1cm4gX19wO1xcbic7XG5cbiAgICB0cnkge1xuICAgICAgdmFyIHJlbmRlciA9IG5ldyBGdW5jdGlvbihzZXR0aW5ncy52YXJpYWJsZSB8fCAnb2JqJywgJ18nLCBzb3VyY2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGUuc291cmNlID0gc291cmNlO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICB2YXIgdGVtcGxhdGUgPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgICByZXR1cm4gcmVuZGVyLmNhbGwodGhpcywgZGF0YSwgXyk7XG4gICAgfTtcblxuICAgIC8vIFByb3ZpZGUgdGhlIGNvbXBpbGVkIHNvdXJjZSBhcyBhIGNvbnZlbmllbmNlIGZvciBwcmVjb21waWxhdGlvbi5cbiAgICB2YXIgYXJndW1lbnQgPSBzZXR0aW5ncy52YXJpYWJsZSB8fCAnb2JqJztcbiAgICB0ZW1wbGF0ZS5zb3VyY2UgPSAnZnVuY3Rpb24oJyArIGFyZ3VtZW50ICsgJyl7XFxuJyArIHNvdXJjZSArICd9JztcblxuICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgfTtcblxuICAvLyBBZGQgYSBcImNoYWluXCIgZnVuY3Rpb24uIFN0YXJ0IGNoYWluaW5nIGEgd3JhcHBlZCBVbmRlcnNjb3JlIG9iamVjdC5cbiAgXy5jaGFpbiA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHZhciBpbnN0YW5jZSA9IF8ob2JqKTtcbiAgICBpbnN0YW5jZS5fY2hhaW4gPSB0cnVlO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfTtcblxuICAvLyBPT1BcbiAgLy8gLS0tLS0tLS0tLS0tLS0tXG4gIC8vIElmIFVuZGVyc2NvcmUgaXMgY2FsbGVkIGFzIGEgZnVuY3Rpb24sIGl0IHJldHVybnMgYSB3cmFwcGVkIG9iamVjdCB0aGF0XG4gIC8vIGNhbiBiZSB1c2VkIE9PLXN0eWxlLiBUaGlzIHdyYXBwZXIgaG9sZHMgYWx0ZXJlZCB2ZXJzaW9ucyBvZiBhbGwgdGhlXG4gIC8vIHVuZGVyc2NvcmUgZnVuY3Rpb25zLiBXcmFwcGVkIG9iamVjdHMgbWF5IGJlIGNoYWluZWQuXG5cbiAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNvbnRpbnVlIGNoYWluaW5nIGludGVybWVkaWF0ZSByZXN1bHRzLlxuICB2YXIgcmVzdWx0ID0gZnVuY3Rpb24oaW5zdGFuY2UsIG9iaikge1xuICAgIHJldHVybiBpbnN0YW5jZS5fY2hhaW4gPyBfKG9iaikuY2hhaW4oKSA6IG9iajtcbiAgfTtcblxuICAvLyBBZGQgeW91ciBvd24gY3VzdG9tIGZ1bmN0aW9ucyB0byB0aGUgVW5kZXJzY29yZSBvYmplY3QuXG4gIF8ubWl4aW4gPSBmdW5jdGlvbihvYmopIHtcbiAgICBfLmVhY2goXy5mdW5jdGlvbnMob2JqKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgdmFyIGZ1bmMgPSBfW25hbWVdID0gb2JqW25hbWVdO1xuICAgICAgXy5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbdGhpcy5fd3JhcHBlZF07XG4gICAgICAgIHB1c2guYXBwbHkoYXJncywgYXJndW1lbnRzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCh0aGlzLCBmdW5jLmFwcGx5KF8sIGFyZ3MpKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gQWRkIGFsbCBvZiB0aGUgVW5kZXJzY29yZSBmdW5jdGlvbnMgdG8gdGhlIHdyYXBwZXIgb2JqZWN0LlxuICBfLm1peGluKF8pO1xuXG4gIC8vIEFkZCBhbGwgbXV0YXRvciBBcnJheSBmdW5jdGlvbnMgdG8gdGhlIHdyYXBwZXIuXG4gIF8uZWFjaChbJ3BvcCcsICdwdXNoJywgJ3JldmVyc2UnLCAnc2hpZnQnLCAnc29ydCcsICdzcGxpY2UnLCAndW5zaGlmdCddLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIG1ldGhvZCA9IEFycmF5UHJvdG9bbmFtZV07XG4gICAgXy5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBvYmogPSB0aGlzLl93cmFwcGVkO1xuICAgICAgbWV0aG9kLmFwcGx5KG9iaiwgYXJndW1lbnRzKTtcbiAgICAgIGlmICgobmFtZSA9PT0gJ3NoaWZ0JyB8fCBuYW1lID09PSAnc3BsaWNlJykgJiYgb2JqLmxlbmd0aCA9PT0gMCkgZGVsZXRlIG9ialswXTtcbiAgICAgIHJldHVybiByZXN1bHQodGhpcywgb2JqKTtcbiAgICB9O1xuICB9KTtcblxuICAvLyBBZGQgYWxsIGFjY2Vzc29yIEFycmF5IGZ1bmN0aW9ucyB0byB0aGUgd3JhcHBlci5cbiAgXy5lYWNoKFsnY29uY2F0JywgJ2pvaW4nLCAnc2xpY2UnXSwgZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBtZXRob2QgPSBBcnJheVByb3RvW25hbWVdO1xuICAgIF8ucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gcmVzdWx0KHRoaXMsIG1ldGhvZC5hcHBseSh0aGlzLl93cmFwcGVkLCBhcmd1bWVudHMpKTtcbiAgICB9O1xuICB9KTtcblxuICAvLyBFeHRyYWN0cyB0aGUgcmVzdWx0IGZyb20gYSB3cmFwcGVkIGFuZCBjaGFpbmVkIG9iamVjdC5cbiAgXy5wcm90b3R5cGUudmFsdWUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JhcHBlZDtcbiAgfTtcblxuICAvLyBQcm92aWRlIHVud3JhcHBpbmcgcHJveHkgZm9yIHNvbWUgbWV0aG9kcyB1c2VkIGluIGVuZ2luZSBvcGVyYXRpb25zXG4gIC8vIHN1Y2ggYXMgYXJpdGhtZXRpYyBhbmQgSlNPTiBzdHJpbmdpZmljYXRpb24uXG4gIF8ucHJvdG90eXBlLnZhbHVlT2YgPSBfLnByb3RvdHlwZS50b0pTT04gPSBfLnByb3RvdHlwZS52YWx1ZTtcblxuICBfLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAnJyArIHRoaXMuX3dyYXBwZWQ7XG4gIH07XG5cbiAgLy8gQU1EIHJlZ2lzdHJhdGlvbiBoYXBwZW5zIGF0IHRoZSBlbmQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBBTUQgbG9hZGVyc1xuICAvLyB0aGF0IG1heSBub3QgZW5mb3JjZSBuZXh0LXR1cm4gc2VtYW50aWNzIG9uIG1vZHVsZXMuIEV2ZW4gdGhvdWdoIGdlbmVyYWxcbiAgLy8gcHJhY3RpY2UgZm9yIEFNRCByZWdpc3RyYXRpb24gaXMgdG8gYmUgYW5vbnltb3VzLCB1bmRlcnNjb3JlIHJlZ2lzdGVyc1xuICAvLyBhcyBhIG5hbWVkIG1vZHVsZSBiZWNhdXNlLCBsaWtlIGpRdWVyeSwgaXQgaXMgYSBiYXNlIGxpYnJhcnkgdGhhdCBpc1xuICAvLyBwb3B1bGFyIGVub3VnaCB0byBiZSBidW5kbGVkIGluIGEgdGhpcmQgcGFydHkgbGliLCBidXQgbm90IGJlIHBhcnQgb2ZcbiAgLy8gYW4gQU1EIGxvYWQgcmVxdWVzdC4gVGhvc2UgY2FzZXMgY291bGQgZ2VuZXJhdGUgYW4gZXJyb3Igd2hlbiBhblxuICAvLyBhbm9ueW1vdXMgZGVmaW5lKCkgaXMgY2FsbGVkIG91dHNpZGUgb2YgYSBsb2FkZXIgcmVxdWVzdC5cbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZSgndW5kZXJzY29yZScsIFtdLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBfO1xuICAgIH0pO1xuICB9XG59LmNhbGwodGhpcykpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3VuZGVyc2NvcmUvdW5kZXJzY29yZS5qc1xuLy8gbW9kdWxlIGlkID0gMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 3 */
/***/ function(module, exports, __webpack_require__) {

    eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * jQuery JavaScript Library v3.1.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2016-09-22T22:30Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar document = window.document;\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar concat = arr.concat;\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\n\n\n\tfunction DOMEval( code, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar script = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.1.1\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android <=4.0 only\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = jQuery.isArray( copy ) ) ) ) {\n\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray( src ) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject( src ) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type( obj ) === \"function\";\n\t},\n\n\tisArray: Array.isArray,\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\n\t\t// As of jQuery 3.0, isNumeric is limited to\n\t\t// strings and numbers (primitives or objects)\n\t\t// that can be coerced to finite numbers (gh-2662)\n\t\tvar type = jQuery.type( obj );\n\t\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t\t// subtraction forces infinities to NaN\n\t\t\t!isNaN( obj - parseFloat( obj ) );\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\n\t\t/* eslint-disable no-unused-vars */\n\t\t// See https://github.com/eslint/eslint/issues/6125\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn obj + \"\";\n\t\t}\n\n\t\t// Support: Android <=2.3 only (functionish RegExp)\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tDOMEval( code );\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Support: IE <=9 - 11, Edge 12 - 13\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android <=4.0 only\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar tmp, args, proxy;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\tnow: Date.now,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( type === \"function\" || jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.3\n * https://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2016-08-08\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = \"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tdisabledAncestor = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && (\"form\" in elem || \"label\" in elem);\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\n\t\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\t\tsetDocument( context );\n\t\t}\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( (m = match[1]) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( (elem = context.getElementById( m )) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && (elem = newContext.getElementById( m )) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[2] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!compilerCache[ selector + \" \" ] &&\n\t\t\t\t(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\n\t\t\t\tif ( nodeType !== 1 ) {\n\t\t\t\t\tnewContext = context;\n\t\t\t\t\tnewSelector = selector;\n\n\t\t\t\t// qSA looks outside Element context, which is not what we want\n\t\t\t\t// Thanks to Andrew Dupont for this workaround technique\n\t\t\t\t// Support: IE <=8\n\t\t\t\t// Exclude object elements\n\t\t\t\t} else if ( context.nodeName.toLowerCase() !== \"object\" ) {\n\n\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\tif ( (nid = context.getAttribute( \"id\" )) ) {\n\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", (nid = expando) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[i] = \"#\" + nid + \" \" + toSelector( groups[i] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\t\t\t\t}\n\n\t\t\t\tif ( newSelector ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement(\"fieldset\");\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\t\tdisabledAncestor( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9-11, Edge\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\tif ( preferredDoc !== document &&\n\t\t(subWindow = document.defaultView) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( el ) {\n\t\tel.appendChild( document.createComment(\"\") );\n\t\treturn !el.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t});\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( (elem = elems[i++]) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( el ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll(\":enabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll(\":disabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( el ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === document ? -1 :\n\t\t\t\tb === document ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!compilerCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn (sel + \"\").replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( (oldCache = uniqueCache[ key ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context === document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\tif ( !context && elem.ownerDocument !== document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( el ) {\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement(\"fieldset\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( el ) {\n\treturn el.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\nvar risSimple = /^.[^:#\\[\\.,]*$/;\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Simple selector that can be filtered directly, removing non-Elements\n\tif ( risSimple.test( qualifier ) ) {\n\t\treturn jQuery.filter( qualifier, elements, not );\n\t}\n\n\t// Complex selector, compare the two sets, removing non-Elements\n\tqualifier = jQuery.filter( qualifier, elements );\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;\n\t} );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn elem.contentDocument || jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( jQuery.isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && jQuery.type( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && jQuery.isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Support: Android 4.0 only\n\t\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\t\tresolve.call( undefined, value );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.call( undefined, value );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( jQuery.isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tjQuery.isFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tjQuery.isFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tjQuery.isFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the master Deferred\n\t\t\tmaster = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tmaster.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( master.state() === \"pending\" ||\n\t\t\t\tjQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), master.reject );\n\t\t}\n\n\t\treturn master.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( jQuery.type( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ jQuery.camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ jQuery.camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( jQuery.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( jQuery.camelCase );\n\t\t\t} else {\n\t\t\t\tkey = jQuery.camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tjQuery.contains( elem.ownerDocument, elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\nvar swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted,\n\t\tscale = 1,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\tdo {\n\n\t\t\t// If previous iteration zeroed out, double until we get *something*.\n\t\t\t// Use string for doubling so we don't accidentally see scale as unchanged below\n\t\t\tscale = scale || \".5\";\n\n\t\t\t// Adjust and apply\n\t\t\tinitialInUnit = initialInUnit / scale;\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t// Break the loop if scale is unchanged or perfect, or if we've just had enough.\n\t\t} while (\n\t\t\tscale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations\n\t\t);\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]+)/i );\n\nvar rscriptType = ( /^$|\\/(?:java|ecma)script/i );\n\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// Support: IE <=9 only\n\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\n// Support: IE <=9 only\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && jQuery.nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, contains, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( contains ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n} )();\nvar documentElement = document.documentElement;\n\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 only\n// See #13393 for more info\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tvar event = jQuery.event.fix( nativeEvent );\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\t\t\thandlers = ( dataPriv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: jQuery.isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === \"checkbox\" && this.click && jQuery.nodeName( this, \"input\" ) ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t/* eslint-disable max-len */\n\n\t// See https://github.com/eslint/eslint/issues/3229\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,\n\n\t/* eslint-enable */\n\n\t// Support: IE <=10 - 11, Edge 12 - 13\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\nfunction manipulationTarget( elem, content ) {\n\tif ( jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn elem.getElementsByTagName( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\n\tif ( match ) {\n\t\telem.type = match[ 1 ];\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.access( src );\n\t\tpdataCur = dataPriv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = concat.apply( [], args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tisFunction = jQuery.isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( isFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( isFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html.replace( rxhtmlTag, \"<$1></$2>\" );\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rmargin = ( /^margin/ );\n\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdiv.style.cssText =\n\t\t\t\"box-sizing:border-box;\" +\n\t\t\t\"position:relative;display:block;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"top:1%;width:50%\";\n\t\tdiv.innerHTML = \"\";\n\t\tdocumentElement.appendChild( container );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = divStyle.marginLeft === \"2px\";\n\t\tboxSizingReliableVal = divStyle.width === \"4px\";\n\n\t\t// Support: Android 4.0 - 4.3 only\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.marginRight = \"50%\";\n\t\tpixelMarginRightVal = divStyle.marginRight === \"4px\";\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tcontainer.style.cssText = \"border:0;width:8px;height:0;top:0;left:-9999px;\" +\n\t\t\"padding:0;margin-top:1px;position:absolute\";\n\tcontainer.appendChild( div );\n\n\tjQuery.extend( support, {\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelMarginRight: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelMarginRightVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// Support: IE <=9 only\n\t// getPropertyValue is only needed for .css('filter') (#12537)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t},\n\n\tcssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style;\n\n// Return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( name ) {\n\n\t// Shortcut for names that are not vendor prefixed\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i,\n\t\tval = 0;\n\n\t// If we already have the right measurement, avoid augmentation\n\tif ( extra === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\ti = 4;\n\n\t// Otherwise initialize for horizontal or vertical properties\n\t} else {\n\t\ti = name === \"width\" ? 1 : 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// At this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// At this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// At this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar val,\n\t\tvalueIsBorderBox = true,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// Support: IE <=11 only\n\t// Running getBoundingClientRect on a disconnected node\n\t// in IE throws an error.\n\tif ( elem.getClientRects().length ) {\n\t\tval = elem.getBoundingClientRect()[ name ];\n\t}\n\n\t// Some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test( val ) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// Check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox &&\n\t\t\t( support.boxSizingReliable() || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// Use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t\"float\": \"cssFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] ||\n\t\t\t( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\tif ( type === \"number\" ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tstyle[ name ] = value;\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] ||\n\t\t\t( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = extra && getStyles( elem ),\n\t\t\t\tsubtract = extra && augmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t);\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ name ] = value;\n\t\t\t\tvalue = jQuery.css( elem, name );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 &&\n\t\t\t\t( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction raf() {\n\tif ( timerId ) {\n\t\twindow.requestAnimationFrame( raf );\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = jQuery.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 13\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( jQuery.isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tjQuery.proxy( result.stop, result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off or if document is hidden\n\tif ( jQuery.fx.off || document.hidden ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tif ( timer() ) {\n\t\tjQuery.fx.start();\n\t} else {\n\t\tjQuery.timers.pop();\n\t}\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = window.requestAnimationFrame ?\n\t\t\twindow.requestAnimationFrame( raf ) :\n\t\t\twindow.setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\tif ( window.cancelAnimationFrame ) {\n\t\twindow.cancelAnimationFrame( timerId );\n\t} else {\n\t\twindow.clearInterval( timerId );\n\t}\n\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tjQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( typeof value === \"string\" && value ) {\n\t\t\tclasses = value.match( rnothtmlwhite ) || [];\n\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tif ( typeof value === \"string\" && value ) {\n\t\t\tclasses = value.match( rnothtmlwhite ) || [];\n\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( type === \"string\" ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = value.match( rnothtmlwhite ) || [];\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || {} )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\telem[ type ]();\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\njQuery.each( ( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n} );\n\njQuery.fn.extend( {\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\n\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = jQuery.now();\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = jQuery.isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( jQuery.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\toriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 13\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce++ ) + uncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\n\njQuery._evalUrl = function( url ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\t\t\"throws\": true\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" ).prop( {\n\t\t\t\t\tcharset: s.scriptCharset,\n\t\t\t\t\tsrc: s.url\n\t\t\t\t} ).on(\n\t\t\t\t\t\"load error\",\n\t\t\t\t\tcallback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\n/**\n * Gets a window from an element\n */\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;\n}\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar docElem, win, rect, doc,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\trect = elem.getBoundingClientRect();\n\n\t\t// Make sure element is not hidden (display: none)\n\t\tif ( rect.width || rect.height ) {\n\t\t\tdoc = elem.ownerDocument;\n\t\t\twin = getWindow( doc );\n\t\t\tdocElem = doc.documentElement;\n\n\t\t\treturn {\n\t\t\t\ttop: rect.top + win.pageYOffset - docElem.clientTop,\n\t\t\t\tleft: rect.left + win.pageXOffset - docElem.clientLeft\n\t\t\t};\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden elements (gh-2310)\n\t\treturn rect;\n\t},\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// Fixed elements are offset from window (parentOffset = {top:0, left: 0},\n\t\t// because it is its only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume getBoundingClientRect is there when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset = {\n\t\t\t\ttop: parentOffset.top + jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true ),\n\t\t\t\tleft: parentOffset.left + jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true )\n\t\t\t};\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\t\tfunction( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t}\n} );\n\njQuery.parseJSON = JSON.parse;\n\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( true ) {\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function() {\n\t\treturn jQuery;\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( !noGlobal ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\n\nreturn jQuery;\n} );\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMy5qcyIsInNvdXJjZXMiOlsiL2hvbWUvdWJ1bnR1L3dvcmtzcGFjZS9ub2RlX21vZHVsZXMvanF1ZXJ5L2Rpc3QvanF1ZXJ5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My4xLjFcbiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS9cbiAqXG4gKiBJbmNsdWRlcyBTaXp6bGUuanNcbiAqIGh0dHBzOi8vc2l6emxlanMuY29tL1xuICpcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAxNi0wOS0yMlQyMjozMFpcbiAqL1xuKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdGlmICggdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHQvLyBGb3IgQ29tbW9uSlMgYW5kIENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHdoZXJlIGEgcHJvcGVyIGB3aW5kb3dgXG5cdFx0Ly8gaXMgcHJlc2VudCwgZXhlY3V0ZSB0aGUgZmFjdG9yeSBhbmQgZ2V0IGpRdWVyeS5cblx0XHQvLyBGb3IgZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IGhhdmUgYSBgd2luZG93YCB3aXRoIGEgYGRvY3VtZW50YFxuXHRcdC8vIChzdWNoIGFzIE5vZGUuanMpLCBleHBvc2UgYSBmYWN0b3J5IGFzIG1vZHVsZS5leHBvcnRzLlxuXHRcdC8vIFRoaXMgYWNjZW50dWF0ZXMgdGhlIG5lZWQgZm9yIHRoZSBjcmVhdGlvbiBvZiBhIHJlYWwgYHdpbmRvd2AuXG5cdFx0Ly8gZS5nLiB2YXIgalF1ZXJ5ID0gcmVxdWlyZShcImpxdWVyeVwiKSh3aW5kb3cpO1xuXHRcdC8vIFNlZSB0aWNrZXQgIzE0NTQ5IGZvciBtb3JlIGluZm8uXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuZG9jdW1lbnQgP1xuXHRcdFx0ZmFjdG9yeSggZ2xvYmFsLCB0cnVlICkgOlxuXHRcdFx0ZnVuY3Rpb24oIHcgKSB7XG5cdFx0XHRcdGlmICggIXcuZG9jdW1lbnQgKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBcImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnRcIiApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWN0b3J5KCB3ICk7XG5cdFx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdGZhY3RvcnkoIGdsb2JhbCApO1xuXHR9XG5cbi8vIFBhc3MgdGhpcyBpZiB3aW5kb3cgaXMgbm90IGRlZmluZWQgeWV0XG59ICkoIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB0aGlzLCBmdW5jdGlvbiggd2luZG93LCBub0dsb2JhbCApIHtcblxuLy8gRWRnZSA8PSAxMiAtIDEzKywgRmlyZWZveCA8PTE4IC0gNDUrLCBJRSAxMCAtIDExLCBTYWZhcmkgNS4xIC0gOSssIGlPUyA2IC0gOS4xXG4vLyB0aHJvdyBleGNlcHRpb25zIHdoZW4gbm9uLXN0cmljdCBjb2RlIChlLmcuLCBBU1AuTkVUIDQuNSkgYWNjZXNzZXMgc3RyaWN0IG1vZGVcbi8vIGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyICh0cmFjLTEzMzM1KS4gQnV0IGFzIG9mIGpRdWVyeSAzLjAgKDIwMTYpLCBzdHJpY3QgbW9kZSBzaG91bGQgYmUgY29tbW9uXG4vLyBlbm91Z2ggdGhhdCBhbGwgc3VjaCBhdHRlbXB0cyBhcmUgZ3VhcmRlZCBpbiBhIHRyeSBibG9jay5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgYXJyID0gW107XG5cbnZhciBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudDtcblxudmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuXG52YXIgc2xpY2UgPSBhcnIuc2xpY2U7XG5cbnZhciBjb25jYXQgPSBhcnIuY29uY2F0O1xuXG52YXIgcHVzaCA9IGFyci5wdXNoO1xuXG52YXIgaW5kZXhPZiA9IGFyci5pbmRleE9mO1xuXG52YXIgY2xhc3MydHlwZSA9IHt9O1xuXG52YXIgdG9TdHJpbmcgPSBjbGFzczJ0eXBlLnRvU3RyaW5nO1xuXG52YXIgaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIGZuVG9TdHJpbmcgPSBoYXNPd24udG9TdHJpbmc7XG5cbnZhciBPYmplY3RGdW5jdGlvblN0cmluZyA9IGZuVG9TdHJpbmcuY2FsbCggT2JqZWN0ICk7XG5cbnZhciBzdXBwb3J0ID0ge307XG5cblxuXG5cdGZ1bmN0aW9uIERPTUV2YWwoIGNvZGUsIGRvYyApIHtcblx0XHRkb2MgPSBkb2MgfHwgZG9jdW1lbnQ7XG5cblx0XHR2YXIgc2NyaXB0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoIFwic2NyaXB0XCIgKTtcblxuXHRcdHNjcmlwdC50ZXh0ID0gY29kZTtcblx0XHRkb2MuaGVhZC5hcHBlbmRDaGlsZCggc2NyaXB0ICkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggc2NyaXB0ICk7XG5cdH1cbi8qIGdsb2JhbCBTeW1ib2wgKi9cbi8vIERlZmluaW5nIHRoaXMgZ2xvYmFsIGluIC5lc2xpbnRyYy5qc29uIHdvdWxkIGNyZWF0ZSBhIGRhbmdlciBvZiB1c2luZyB0aGUgZ2xvYmFsXG4vLyB1bmd1YXJkZWQgaW4gYW5vdGhlciBwbGFjZSwgaXQgc2VlbXMgc2FmZXIgdG8gZGVmaW5lIGdsb2JhbCBvbmx5IGZvciB0aGlzIG1vZHVsZVxuXG5cblxudmFyXG5cdHZlcnNpb24gPSBcIjMuMS4xXCIsXG5cblx0Ly8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnlcblx0alF1ZXJ5ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xuXG5cdFx0Ly8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnXG5cdFx0Ly8gTmVlZCBpbml0IGlmIGpRdWVyeSBpcyBjYWxsZWQgKGp1c3QgYWxsb3cgZXJyb3IgdG8gYmUgdGhyb3duIGlmIG5vdCBpbmNsdWRlZClcblx0XHRyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seVxuXHQvLyBNYWtlIHN1cmUgd2UgdHJpbSBCT00gYW5kIE5CU1Bcblx0cnRyaW0gPSAvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2csXG5cblx0Ly8gTWF0Y2hlcyBkYXNoZWQgc3RyaW5nIGZvciBjYW1lbGl6aW5nXG5cdHJtc1ByZWZpeCA9IC9eLW1zLS8sXG5cdHJkYXNoQWxwaGEgPSAvLShbYS16XSkvZyxcblxuXHQvLyBVc2VkIGJ5IGpRdWVyeS5jYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpXG5cdGZjYW1lbENhc2UgPSBmdW5jdGlvbiggYWxsLCBsZXR0ZXIgKSB7XG5cdFx0cmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO1xuXHR9O1xuXG5qUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0ge1xuXG5cdC8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWRcblx0anF1ZXJ5OiB2ZXJzaW9uLFxuXG5cdGNvbnN0cnVjdG9yOiBqUXVlcnksXG5cblx0Ly8gVGhlIGRlZmF1bHQgbGVuZ3RoIG9mIGEgalF1ZXJ5IG9iamVjdCBpcyAwXG5cdGxlbmd0aDogMCxcblxuXHR0b0FycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHR9LFxuXG5cdC8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1Jcblx0Ly8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXlcblx0Z2V0OiBmdW5jdGlvbiggbnVtICkge1xuXG5cdFx0Ly8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgaW4gYSBjbGVhbiBhcnJheVxuXHRcdGlmICggbnVtID09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiBqdXN0IHRoZSBvbmUgZWxlbWVudCBmcm9tIHRoZSBzZXRcblx0XHRyZXR1cm4gbnVtIDwgMCA/IHRoaXNbIG51bSArIHRoaXMubGVuZ3RoIF0gOiB0aGlzWyBudW0gXTtcblx0fSxcblxuXHQvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrXG5cdC8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KVxuXHRwdXNoU3RhY2s6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblxuXHRcdC8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0XG5cdFx0dmFyIHJldCA9IGpRdWVyeS5tZXJnZSggdGhpcy5jb25zdHJ1Y3RvcigpLCBlbGVtcyApO1xuXG5cdFx0Ly8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSlcblx0XHRyZXQucHJldk9iamVjdCA9IHRoaXM7XG5cblx0XHQvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldFxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0Ly8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC5cblx0ZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2sgKTtcblx0fSxcblxuXHRtYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTtcblx0XHR9ICkgKTtcblx0fSxcblxuXHRzbGljZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgKTtcblx0fSxcblxuXHRmaXJzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIDAgKTtcblx0fSxcblxuXHRsYXN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggLTEgKTtcblx0fSxcblxuXHRlcTogZnVuY3Rpb24oIGkgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0aiA9ICtpICsgKCBpIDwgMCA/IGxlbiA6IDAgKTtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGogPj0gMCAmJiBqIDwgbGVuID8gWyB0aGlzWyBqIF0gXSA6IFtdICk7XG5cdH0sXG5cblx0ZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IHRoaXMuY29uc3RydWN0b3IoKTtcblx0fSxcblxuXHQvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG5cdC8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLlxuXHRwdXNoOiBwdXNoLFxuXHRzb3J0OiBhcnIuc29ydCxcblx0c3BsaWNlOiBhcnIuc3BsaWNlXG59O1xuXG5qUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsXG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyAwIF0gfHwge30sXG5cdFx0aSA9IDEsXG5cdFx0bGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcblx0XHRkZWVwID0gZmFsc2U7XG5cblx0Ly8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvblxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGRlZXAgPSB0YXJnZXQ7XG5cblx0XHQvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0XG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307XG5cdFx0aSsrO1xuXHR9XG5cblx0Ly8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpXG5cdGlmICggdHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24oIHRhcmdldCApICkge1xuXHRcdHRhcmdldCA9IHt9O1xuXHR9XG5cblx0Ly8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkXG5cdGlmICggaSA9PT0gbGVuZ3RoICkge1xuXHRcdHRhcmdldCA9IHRoaXM7XG5cdFx0aS0tO1xuXHR9XG5cblx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cblx0XHQvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzXG5cdFx0aWYgKCAoIG9wdGlvbnMgPSBhcmd1bWVudHNbIGkgXSApICE9IG51bGwgKSB7XG5cblx0XHRcdC8vIEV4dGVuZCB0aGUgYmFzZSBvYmplY3Rcblx0XHRcdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRcdFx0c3JjID0gdGFyZ2V0WyBuYW1lIF07XG5cdFx0XHRcdGNvcHkgPSBvcHRpb25zWyBuYW1lIF07XG5cblx0XHRcdFx0Ly8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcFxuXHRcdFx0XHRpZiAoIHRhcmdldCA9PT0gY29weSApIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBwbGFpbiBvYmplY3RzIG9yIGFycmF5c1xuXHRcdFx0XHRpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb3B5ICkgfHxcblx0XHRcdFx0XHQoIGNvcHlJc0FycmF5ID0galF1ZXJ5LmlzQXJyYXkoIGNvcHkgKSApICkgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGNvcHlJc0FycmF5ICkge1xuXHRcdFx0XHRcdFx0Y29weUlzQXJyYXkgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGpRdWVyeS5pc0FycmF5KCBzcmMgKSA/IHNyYyA6IFtdO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBzcmMgKSA/IHNyYyA6IHt9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTtcblxuXHRcdFx0XHQvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGNvcHk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZVxuXHRleHBhbmRvOiBcImpRdWVyeVwiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cXEQvZywgXCJcIiApLFxuXG5cdC8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlXG5cdGlzUmVhZHk6IHRydWUsXG5cblx0ZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblx0fSxcblxuXHRub29wOiBmdW5jdGlvbigpIHt9LFxuXG5cdGlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS50eXBlKCBvYmogKSA9PT0gXCJmdW5jdGlvblwiO1xuXHR9LFxuXG5cdGlzQXJyYXk6IEFycmF5LmlzQXJyYXksXG5cblx0aXNXaW5kb3c6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0cmV0dXJuIG9iaiAhPSBudWxsICYmIG9iaiA9PT0gb2JqLndpbmRvdztcblx0fSxcblxuXHRpc051bWVyaWM6IGZ1bmN0aW9uKCBvYmogKSB7XG5cblx0XHQvLyBBcyBvZiBqUXVlcnkgMy4wLCBpc051bWVyaWMgaXMgbGltaXRlZCB0b1xuXHRcdC8vIHN0cmluZ3MgYW5kIG51bWJlcnMgKHByaW1pdGl2ZXMgb3Igb2JqZWN0cylcblx0XHQvLyB0aGF0IGNhbiBiZSBjb2VyY2VkIHRvIGZpbml0ZSBudW1iZXJzIChnaC0yNjYyKVxuXHRcdHZhciB0eXBlID0galF1ZXJ5LnR5cGUoIG9iaiApO1xuXHRcdHJldHVybiAoIHR5cGUgPT09IFwibnVtYmVyXCIgfHwgdHlwZSA9PT0gXCJzdHJpbmdcIiApICYmXG5cblx0XHRcdC8vIHBhcnNlRmxvYXQgTmFOcyBudW1lcmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzIChcIlwiKVxuXHRcdFx0Ly8gLi4uYnV0IG1pc2ludGVycHJldHMgbGVhZGluZy1udW1iZXIgc3RyaW5ncywgcGFydGljdWxhcmx5IGhleCBsaXRlcmFscyAoXCIweC4uLlwiKVxuXHRcdFx0Ly8gc3VidHJhY3Rpb24gZm9yY2VzIGluZmluaXRpZXMgdG8gTmFOXG5cdFx0XHQhaXNOYU4oIG9iaiAtIHBhcnNlRmxvYXQoIG9iaiApICk7XG5cdH0sXG5cblx0aXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHtcblx0XHR2YXIgcHJvdG8sIEN0b3I7XG5cblx0XHQvLyBEZXRlY3Qgb2J2aW91cyBuZWdhdGl2ZXNcblx0XHQvLyBVc2UgdG9TdHJpbmcgaW5zdGVhZCBvZiBqUXVlcnkudHlwZSB0byBjYXRjaCBob3N0IG9iamVjdHNcblx0XHRpZiAoICFvYmogfHwgdG9TdHJpbmcuY2FsbCggb2JqICkgIT09IFwiW29iamVjdCBPYmplY3RdXCIgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cHJvdG8gPSBnZXRQcm90byggb2JqICk7XG5cblx0XHQvLyBPYmplY3RzIHdpdGggbm8gcHJvdG90eXBlIChlLmcuLCBgT2JqZWN0LmNyZWF0ZSggbnVsbCApYCkgYXJlIHBsYWluXG5cdFx0aWYgKCAhcHJvdG8gKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBPYmplY3RzIHdpdGggcHJvdG90eXBlIGFyZSBwbGFpbiBpZmYgdGhleSB3ZXJlIGNvbnN0cnVjdGVkIGJ5IGEgZ2xvYmFsIE9iamVjdCBmdW5jdGlvblxuXHRcdEN0b3IgPSBoYXNPd24uY2FsbCggcHJvdG8sIFwiY29uc3RydWN0b3JcIiApICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuXHRcdHJldHVybiB0eXBlb2YgQ3RvciA9PT0gXCJmdW5jdGlvblwiICYmIGZuVG9TdHJpbmcuY2FsbCggQ3RvciApID09PSBPYmplY3RGdW5jdGlvblN0cmluZztcblx0fSxcblxuXHRpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xuXG5cdFx0LyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cblx0XHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvaXNzdWVzLzYxMjVcblx0XHR2YXIgbmFtZTtcblxuXHRcdGZvciAoIG5hbWUgaW4gb2JqICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHR0eXBlOiBmdW5jdGlvbiggb2JqICkge1xuXHRcdGlmICggb2JqID09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gb2JqICsgXCJcIjtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHkgKGZ1bmN0aW9uaXNoIFJlZ0V4cClcblx0XHRyZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgP1xuXHRcdFx0Y2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbCggb2JqICkgXSB8fCBcIm9iamVjdFwiIDpcblx0XHRcdHR5cGVvZiBvYmo7XG5cdH0sXG5cblx0Ly8gRXZhbHVhdGVzIGEgc2NyaXB0IGluIGEgZ2xvYmFsIGNvbnRleHRcblx0Z2xvYmFsRXZhbDogZnVuY3Rpb24oIGNvZGUgKSB7XG5cdFx0RE9NRXZhbCggY29kZSApO1xuXHR9LFxuXG5cdC8vIENvbnZlcnQgZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFuZCBkYXRhIG1vZHVsZXNcblx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxM1xuXHQvLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpXG5cdGNhbWVsQ2FzZTogZnVuY3Rpb24oIHN0cmluZyApIHtcblx0XHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHJtc1ByZWZpeCwgXCJtcy1cIiApLnJlcGxhY2UoIHJkYXNoQWxwaGEsIGZjYW1lbENhc2UgKTtcblx0fSxcblxuXHRub2RlTmFtZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0cmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cdH0sXG5cblx0ZWFjaDogZnVuY3Rpb24oIG9iaiwgY2FsbGJhY2sgKSB7XG5cdFx0dmFyIGxlbmd0aCwgaSA9IDA7XG5cblx0XHRpZiAoIGlzQXJyYXlMaWtlKCBvYmogKSApIHtcblx0XHRcdGxlbmd0aCA9IG9iai5sZW5ndGg7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICggaSBpbiBvYmogKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9iajtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHlcblx0dHJpbTogZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0cmV0dXJuIHRleHQgPT0gbnVsbCA/XG5cdFx0XHRcIlwiIDpcblx0XHRcdCggdGV4dCArIFwiXCIgKS5yZXBsYWNlKCBydHJpbSwgXCJcIiApO1xuXHR9LFxuXG5cdC8vIHJlc3VsdHMgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcblx0bWFrZUFycmF5OiBmdW5jdGlvbiggYXJyLCByZXN1bHRzICkge1xuXHRcdHZhciByZXQgPSByZXN1bHRzIHx8IFtdO1xuXG5cdFx0aWYgKCBhcnIgIT0gbnVsbCApIHtcblx0XHRcdGlmICggaXNBcnJheUxpa2UoIE9iamVjdCggYXJyICkgKSApIHtcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCByZXQsXG5cdFx0XHRcdFx0dHlwZW9mIGFyciA9PT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0WyBhcnIgXSA6IGFyclxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHVzaC5jYWxsKCByZXQsIGFyciApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0aW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHtcblx0XHRyZXR1cm4gYXJyID09IG51bGwgPyAtMSA6IGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7XG5cdH0sXG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0bWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkge1xuXHRcdHZhciBsZW4gPSArc2Vjb25kLmxlbmd0aCxcblx0XHRcdGogPSAwLFxuXHRcdFx0aSA9IGZpcnN0Lmxlbmd0aDtcblxuXHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0Zmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqIF07XG5cdFx0fVxuXG5cdFx0Zmlyc3QubGVuZ3RoID0gaTtcblxuXHRcdHJldHVybiBmaXJzdDtcblx0fSxcblxuXHRncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnZlcnQgKSB7XG5cdFx0dmFyIGNhbGxiYWNrSW52ZXJzZSxcblx0XHRcdG1hdGNoZXMgPSBbXSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoLFxuXHRcdFx0Y2FsbGJhY2tFeHBlY3QgPSAhaW52ZXJ0O1xuXG5cdFx0Ly8gR28gdGhyb3VnaCB0aGUgYXJyYXksIG9ubHkgc2F2aW5nIHRoZSBpdGVtc1xuXHRcdC8vIHRoYXQgcGFzcyB0aGUgdmFsaWRhdG9yIGZ1bmN0aW9uXG5cdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRjYWxsYmFja0ludmVyc2UgPSAhY2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKTtcblx0XHRcdGlmICggY2FsbGJhY2tJbnZlcnNlICE9PSBjYWxsYmFja0V4cGVjdCApIHtcblx0XHRcdFx0bWF0Y2hlcy5wdXNoKCBlbGVtc1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hdGNoZXM7XG5cdH0sXG5cblx0Ly8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1hcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgYXJnICkge1xuXHRcdHZhciBsZW5ndGgsIHZhbHVlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRyZXQgPSBbXTtcblxuXHRcdC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCB0cmFuc2xhdGluZyBlYWNoIG9mIHRoZSBpdGVtcyB0byB0aGVpciBuZXcgdmFsdWVzXG5cdFx0aWYgKCBpc0FycmF5TGlrZSggZWxlbXMgKSApIHtcblx0XHRcdGxlbmd0aCA9IGVsZW1zLmxlbmd0aDtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEdvIHRocm91Z2ggZXZlcnkga2V5IG9uIHRoZSBvYmplY3QsXG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoIGkgaW4gZWxlbXMgKSB7XG5cdFx0XHRcdHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXQucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXNcblx0XHRyZXR1cm4gY29uY2F0LmFwcGx5KCBbXSwgcmV0ICk7XG5cdH0sXG5cblx0Ly8gQSBnbG9iYWwgR1VJRCBjb3VudGVyIGZvciBvYmplY3RzXG5cdGd1aWQ6IDEsXG5cblx0Ly8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55XG5cdC8vIGFyZ3VtZW50cy5cblx0cHJveHk6IGZ1bmN0aW9uKCBmbiwgY29udGV4dCApIHtcblx0XHR2YXIgdG1wLCBhcmdzLCBwcm94eTtcblxuXHRcdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHR0bXAgPSBmblsgY29udGV4dCBdO1xuXHRcdFx0Y29udGV4dCA9IGZuO1xuXHRcdFx0Zm4gPSB0bXA7XG5cdFx0fVxuXG5cdFx0Ly8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWNcblx0XHQvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLlxuXHRcdGlmICggIWpRdWVyeS5pc0Z1bmN0aW9uKCBmbiApICkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBTaW11bGF0ZWQgYmluZFxuXHRcdGFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTtcblx0XHRwcm94eSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7XG5cdFx0fTtcblxuXHRcdC8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZFxuXHRcdHByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrO1xuXG5cdFx0cmV0dXJuIHByb3h5O1xuXHR9LFxuXG5cdG5vdzogRGF0ZS5ub3csXG5cblx0Ly8galF1ZXJ5LnN1cHBvcnQgaXMgbm90IHVzZWQgaW4gQ29yZSBidXQgb3RoZXIgcHJvamVjdHMgYXR0YWNoIHRoZWlyXG5cdC8vIHByb3BlcnRpZXMgdG8gaXQgc28gaXQgbmVlZHMgdG8gZXhpc3QuXG5cdHN1cHBvcnQ6IHN1cHBvcnRcbn0gKTtcblxuaWYgKCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgKSB7XG5cdGpRdWVyeS5mblsgU3ltYm9sLml0ZXJhdG9yIF0gPSBhcnJbIFN5bWJvbC5pdGVyYXRvciBdO1xufVxuXG4vLyBQb3B1bGF0ZSB0aGUgY2xhc3MydHlwZSBtYXBcbmpRdWVyeS5lYWNoKCBcIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sXCIuc3BsaXQoIFwiIFwiICksXG5mdW5jdGlvbiggaSwgbmFtZSApIHtcblx0Y2xhc3MydHlwZVsgXCJbb2JqZWN0IFwiICsgbmFtZSArIFwiXVwiIF0gPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG59ICk7XG5cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKCBvYmogKSB7XG5cblx0Ly8gU3VwcG9ydDogcmVhbCBpT1MgOC4yIG9ubHkgKG5vdCByZXByb2R1Y2libGUgaW4gc2ltdWxhdG9yKVxuXHQvLyBgaW5gIGNoZWNrIHVzZWQgdG8gcHJldmVudCBKSVQgZXJyb3IgKGdoLTIxNDUpXG5cdC8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlc1xuXHQvLyByZWdhcmRpbmcgTm9kZWxpc3QgbGVuZ3RoIGluIElFXG5cdHZhciBsZW5ndGggPSAhIW9iaiAmJiBcImxlbmd0aFwiIGluIG9iaiAmJiBvYmoubGVuZ3RoLFxuXHRcdHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7XG5cblx0aWYgKCB0eXBlID09PSBcImZ1bmN0aW9uXCIgfHwgalF1ZXJ5LmlzV2luZG93KCBvYmogKSApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4gdHlwZSA9PT0gXCJhcnJheVwiIHx8IGxlbmd0aCA9PT0gMCB8fFxuXHRcdHR5cGVvZiBsZW5ndGggPT09IFwibnVtYmVyXCIgJiYgbGVuZ3RoID4gMCAmJiAoIGxlbmd0aCAtIDEgKSBpbiBvYmo7XG59XG52YXIgU2l6emxlID1cbi8qIVxuICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgdjIuMy4zXG4gKiBodHRwczovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAxNi0wOC0wOFxuICovXG4oZnVuY3Rpb24oIHdpbmRvdyApIHtcblxudmFyIGksXG5cdHN1cHBvcnQsXG5cdEV4cHIsXG5cdGdldFRleHQsXG5cdGlzWE1MLFxuXHR0b2tlbml6ZSxcblx0Y29tcGlsZSxcblx0c2VsZWN0LFxuXHRvdXRlcm1vc3RDb250ZXh0LFxuXHRzb3J0SW5wdXQsXG5cdGhhc0R1cGxpY2F0ZSxcblxuXHQvLyBMb2NhbCBkb2N1bWVudCB2YXJzXG5cdHNldERvY3VtZW50LFxuXHRkb2N1bWVudCxcblx0ZG9jRWxlbSxcblx0ZG9jdW1lbnRJc0hUTUwsXG5cdHJidWdneVFTQSxcblx0cmJ1Z2d5TWF0Y2hlcyxcblx0bWF0Y2hlcyxcblx0Y29udGFpbnMsXG5cblx0Ly8gSW5zdGFuY2Utc3BlY2lmaWMgZGF0YVxuXHRleHBhbmRvID0gXCJzaXp6bGVcIiArIDEgKiBuZXcgRGF0ZSgpLFxuXHRwcmVmZXJyZWREb2MgPSB3aW5kb3cuZG9jdW1lbnQsXG5cdGRpcnJ1bnMgPSAwLFxuXHRkb25lID0gMCxcblx0Y2xhc3NDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRjb21waWxlckNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0c29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIDA7XG5cdH0sXG5cblx0Ly8gSW5zdGFuY2UgbWV0aG9kc1xuXHRoYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LFxuXHRhcnIgPSBbXSxcblx0cG9wID0gYXJyLnBvcCxcblx0cHVzaF9uYXRpdmUgPSBhcnIucHVzaCxcblx0cHVzaCA9IGFyci5wdXNoLFxuXHRzbGljZSA9IGFyci5zbGljZSxcblx0Ly8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlXG5cdC8vIGh0dHBzOi8vanNwZXJmLmNvbS90aG9yLWluZGV4b2YtdnMtZm9yLzVcblx0aW5kZXhPZiA9IGZ1bmN0aW9uKCBsaXN0LCBlbGVtICkge1xuXHRcdHZhciBpID0gMCxcblx0XHRcdGxlbiA9IGxpc3QubGVuZ3RoO1xuXHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0aWYgKCBsaXN0W2ldID09PSBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIC0xO1xuXHR9LFxuXG5cdGJvb2xlYW5zID0gXCJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZFwiLFxuXG5cdC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnNcblxuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jd2hpdGVzcGFjZVxuXHR3aGl0ZXNwYWNlID0gXCJbXFxcXHgyMFxcXFx0XFxcXHJcXFxcblxcXFxmXVwiLFxuXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllclxuXHRpZGVudGlmaWVyID0gXCIoPzpcXFxcXFxcXC58W1xcXFx3LV18W15cXDAtXFxcXHhhMF0pK1wiLFxuXG5cdC8vIEF0dHJpYnV0ZSBzZWxlY3RvcnM6IGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9yc1xuXHRhdHRyaWJ1dGVzID0gXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKihcIiArIGlkZW50aWZpZXIgKyBcIikoPzpcIiArIHdoaXRlc3BhY2UgK1xuXHRcdC8vIE9wZXJhdG9yIChjYXB0dXJlIDIpXG5cdFx0XCIqKFsqXiR8IX5dPz0pXCIgKyB3aGl0ZXNwYWNlICtcblx0XHQvLyBcIkF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBiZSBDU1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV0gb3Igc3RyaW5ncyBbY2FwdHVyZSAzIG9yIGNhcHR1cmUgNF1cIlxuXHRcdFwiKig/OicoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcInwoXCIgKyBpZGVudGlmaWVyICsgXCIpKXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcIipcXFxcXVwiLFxuXG5cdHBzZXVkb3MgPSBcIjooXCIgKyBpZGVudGlmaWVyICsgXCIpKD86XFxcXCgoXCIgK1xuXHRcdC8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6XG5cdFx0Ly8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpXG5cdFx0XCIoJygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwiKXxcIiArXG5cdFx0Ly8gMi4gc2ltcGxlIChjYXB0dXJlIDYpXG5cdFx0XCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKVtcXFxcXV18XCIgKyBhdHRyaWJ1dGVzICsgXCIpKil8XCIgK1xuXHRcdC8vIDMuIGFueXRoaW5nIGVsc2UgKGNhcHR1cmUgMilcblx0XHRcIi4qXCIgK1xuXHRcdFwiKVxcXFwpfClcIixcblxuXHQvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyXG5cdHJ3aGl0ZXNwYWNlID0gbmV3IFJlZ0V4cCggd2hpdGVzcGFjZSArIFwiK1wiLCBcImdcIiApLFxuXHRydHJpbSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiK3woKD86XnxbXlxcXFxcXFxcXSkoPzpcXFxcXFxcXC4pKilcIiArIHdoaXRlc3BhY2UgKyBcIiskXCIsIFwiZ1wiICksXG5cblx0cmNvbW1hID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqLFwiICsgd2hpdGVzcGFjZSArIFwiKlwiICksXG5cdHJjb21iaW5hdG9ycyA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKihbPit+XXxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXG5cdHJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCBcIj1cIiArIHdoaXRlc3BhY2UgKyBcIiooW15cXFxcXSdcXFwiXSo/KVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFxdXCIsIFwiZ1wiICksXG5cblx0cnBzZXVkbyA9IG5ldyBSZWdFeHAoIHBzZXVkb3MgKSxcblx0cmlkZW50aWZpZXIgPSBuZXcgUmVnRXhwKCBcIl5cIiArIGlkZW50aWZpZXIgKyBcIiRcIiApLFxuXG5cdG1hdGNoRXhwciA9IHtcblx0XHRcIklEXCI6IG5ldyBSZWdFeHAoIFwiXiMoXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRcIkNMQVNTXCI6IG5ldyBSZWdFeHAoIFwiXlxcXFwuKFwiICsgaWRlbnRpZmllciArIFwiKVwiICksXG5cdFx0XCJUQUdcIjogbmV3IFJlZ0V4cCggXCJeKFwiICsgaWRlbnRpZmllciArIFwifFsqXSlcIiApLFxuXHRcdFwiQVRUUlwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIGF0dHJpYnV0ZXMgKSxcblx0XHRcIlBTRVVET1wiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHBzZXVkb3MgKSxcblx0XHRcIkNISUxEXCI6IG5ldyBSZWdFeHAoIFwiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFxcXChcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqKGV2ZW58b2RkfCgoWystXXwpKFxcXFxkKilufClcIiArIHdoaXRlc3BhY2UgKyBcIiooPzooWystXXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKihcXFxcZCspfCkpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KVwiLCBcImlcIiApLFxuXHRcdFwiYm9vbFwiOiBuZXcgUmVnRXhwKCBcIl4oPzpcIiArIGJvb2xlYW5zICsgXCIpJFwiLCBcImlcIiApLFxuXHRcdC8vIEZvciB1c2UgaW4gbGlicmFyaWVzIGltcGxlbWVudGluZyAuaXMoKVxuXHRcdC8vIFdlIHVzZSB0aGlzIGZvciBQT1MgbWF0Y2hpbmcgaW4gYHNlbGVjdGBcblx0XHRcIm5lZWRzQ29udGV4dFwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcXFwoXCIgK1xuXHRcdFx0d2hpdGVzcGFjZSArIFwiKigoPzotXFxcXGQpP1xcXFxkKilcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcKXwpKD89W14tXXwkKVwiLCBcImlcIiApXG5cdH0sXG5cblx0cmlucHV0cyA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksXG5cdHJoZWFkZXIgPSAvXmhcXGQkL2ksXG5cblx0cm5hdGl2ZSA9IC9eW157XStcXHtcXHMqXFxbbmF0aXZlIFxcdy8sXG5cblx0Ly8gRWFzaWx5LXBhcnNlYWJsZS9yZXRyaWV2YWJsZSBJRCBvciBUQUcgb3IgQ0xBU1Mgc2VsZWN0b3JzXG5cdHJxdWlja0V4cHIgPSAvXig/OiMoW1xcdy1dKyl8KFxcdyspfFxcLihbXFx3LV0rKSkkLyxcblxuXHRyc2libGluZyA9IC9bK35dLyxcblxuXHQvLyBDU1MgZXNjYXBlc1xuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjZXNjYXBlZC1jaGFyYWN0ZXJzXG5cdHJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoIFwiXFxcXFxcXFwoW1xcXFxkYS1mXXsxLDZ9XCIgKyB3aGl0ZXNwYWNlICsgXCI/fChcIiArIHdoaXRlc3BhY2UgKyBcIil8LilcIiwgXCJpZ1wiICksXG5cdGZ1bmVzY2FwZSA9IGZ1bmN0aW9uKCBfLCBlc2NhcGVkLCBlc2NhcGVkV2hpdGVzcGFjZSApIHtcblx0XHR2YXIgaGlnaCA9IFwiMHhcIiArIGVzY2FwZWQgLSAweDEwMDAwO1xuXHRcdC8vIE5hTiBtZWFucyBub24tY29kZXBvaW50XG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveDwyNFxuXHRcdC8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgK1wiMHhcIlxuXHRcdHJldHVybiBoaWdoICE9PSBoaWdoIHx8IGVzY2FwZWRXaGl0ZXNwYWNlID9cblx0XHRcdGVzY2FwZWQgOlxuXHRcdFx0aGlnaCA8IDAgP1xuXHRcdFx0XHQvLyBCTVAgY29kZXBvaW50XG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOlxuXHRcdFx0XHQvLyBTdXBwbGVtZW50YWwgUGxhbmUgY29kZXBvaW50IChzdXJyb2dhdGUgcGFpcilcblx0XHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7XG5cdH0sXG5cblx0Ly8gQ1NTIHN0cmluZy9pZGVudGlmaWVyIHNlcmlhbGl6YXRpb25cblx0Ly8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNjb21tb24tc2VyaWFsaXppbmctaWRpb21zXG5cdHJjc3Nlc2NhcGUgPSAvKFtcXDAtXFx4MWZcXHg3Zl18Xi0/XFxkKXxeLSR8W15cXDAtXFx4MWZcXHg3Zi1cXHVGRkZGXFx3LV0vZyxcblx0ZmNzc2VzY2FwZSA9IGZ1bmN0aW9uKCBjaCwgYXNDb2RlUG9pbnQgKSB7XG5cdFx0aWYgKCBhc0NvZGVQb2ludCApIHtcblxuXHRcdFx0Ly8gVSswMDAwIE5VTEwgYmVjb21lcyBVK0ZGRkQgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSXG5cdFx0XHRpZiAoIGNoID09PSBcIlxcMFwiICkge1xuXHRcdFx0XHRyZXR1cm4gXCJcXHVGRkZEXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnRyb2wgY2hhcmFjdGVycyBhbmQgKGRlcGVuZGVudCB1cG9uIHBvc2l0aW9uKSBudW1iZXJzIGdldCBlc2NhcGVkIGFzIGNvZGUgcG9pbnRzXG5cdFx0XHRyZXR1cm4gY2guc2xpY2UoIDAsIC0xICkgKyBcIlxcXFxcIiArIGNoLmNoYXJDb2RlQXQoIGNoLmxlbmd0aCAtIDEgKS50b1N0cmluZyggMTYgKSArIFwiIFwiO1xuXHRcdH1cblxuXHRcdC8vIE90aGVyIHBvdGVudGlhbGx5LXNwZWNpYWwgQVNDSUkgY2hhcmFjdGVycyBnZXQgYmFja3NsYXNoLWVzY2FwZWRcblx0XHRyZXR1cm4gXCJcXFxcXCIgKyBjaDtcblx0fSxcblxuXHQvLyBVc2VkIGZvciBpZnJhbWVzXG5cdC8vIFNlZSBzZXREb2N1bWVudCgpXG5cdC8vIFJlbW92aW5nIHRoZSBmdW5jdGlvbiB3cmFwcGVyIGNhdXNlcyBhIFwiUGVybWlzc2lvbiBEZW5pZWRcIlxuXHQvLyBlcnJvciBpbiBJRVxuXHR1bmxvYWRIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG5cdFx0c2V0RG9jdW1lbnQoKTtcblx0fSxcblxuXHRkaXNhYmxlZEFuY2VzdG9yID0gYWRkQ29tYmluYXRvcihcblx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSB0cnVlICYmIChcImZvcm1cIiBpbiBlbGVtIHx8IFwibGFiZWxcIiBpbiBlbGVtKTtcblx0XHR9LFxuXHRcdHsgZGlyOiBcInBhcmVudE5vZGVcIiwgbmV4dDogXCJsZWdlbmRcIiB9XG5cdCk7XG5cbi8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5KCBfLCBOb2RlTGlzdCApXG50cnkge1xuXHRwdXNoLmFwcGx5KFxuXHRcdChhcnIgPSBzbGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGROb2RlcyApKSxcblx0XHRwcmVmZXJyZWREb2MuY2hpbGROb2Rlc1xuXHQpO1xuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMFxuXHQvLyBEZXRlY3Qgc2lsZW50bHkgZmFpbGluZyBwdXNoLmFwcGx5XG5cdGFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7XG59IGNhdGNoICggZSApIHtcblx0cHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggP1xuXG5cdFx0Ly8gTGV2ZXJhZ2Ugc2xpY2UgaWYgcG9zc2libGVcblx0XHRmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHRwdXNoX25hdGl2ZS5hcHBseSggdGFyZ2V0LCBzbGljZS5jYWxsKGVscykgKTtcblx0XHR9IDpcblxuXHRcdC8vIFN1cHBvcnQ6IElFPDlcblx0XHQvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5XG5cdFx0ZnVuY3Rpb24oIHRhcmdldCwgZWxzICkge1xuXHRcdFx0dmFyIGogPSB0YXJnZXQubGVuZ3RoLFxuXHRcdFx0XHRpID0gMDtcblx0XHRcdC8vIENhbid0IHRydXN0IE5vZGVMaXN0Lmxlbmd0aFxuXHRcdFx0d2hpbGUgKCAodGFyZ2V0W2orK10gPSBlbHNbaSsrXSkgKSB7fVxuXHRcdFx0dGFyZ2V0Lmxlbmd0aCA9IGogLSAxO1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIG0sIGksIGVsZW0sIG5pZCwgbWF0Y2gsIGdyb3VwcywgbmV3U2VsZWN0b3IsXG5cdFx0bmV3Q29udGV4dCA9IGNvbnRleHQgJiYgY29udGV4dC5vd25lckRvY3VtZW50LFxuXG5cdFx0Ly8gbm9kZVR5cGUgZGVmYXVsdHMgdG8gOSwgc2luY2UgY29udGV4dCBkZWZhdWx0cyB0byBkb2N1bWVudFxuXHRcdG5vZGVUeXBlID0gY29udGV4dCA/IGNvbnRleHQubm9kZVR5cGUgOiA5O1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFJldHVybiBlYXJseSBmcm9tIGNhbGxzIHdpdGggaW52YWxpZCBzZWxlY3RvciBvciBjb250ZXh0XG5cdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiIHx8ICFzZWxlY3RvciB8fFxuXHRcdG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHtcblxuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0Ly8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50c1xuXHRpZiAoICFzZWVkICkge1xuXG5cdFx0aWYgKCAoIGNvbnRleHQgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IHByZWZlcnJlZERvYyApICE9PSBkb2N1bWVudCApIHtcblx0XHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdFx0fVxuXHRcdGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50O1xuXG5cdFx0aWYgKCBkb2N1bWVudElzSFRNTCApIHtcblxuXHRcdFx0Ly8gSWYgdGhlIHNlbGVjdG9yIGlzIHN1ZmZpY2llbnRseSBzaW1wbGUsIHRyeSB1c2luZyBhIFwiZ2V0KkJ5KlwiIERPTSBtZXRob2Rcblx0XHRcdC8vIChleGNlcHRpbmcgRG9jdW1lbnRGcmFnbWVudCBjb250ZXh0LCB3aGVyZSB0aGUgbWV0aG9kcyBkb24ndCBleGlzdClcblx0XHRcdGlmICggbm9kZVR5cGUgIT09IDExICYmIChtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKSkgKSB7XG5cblx0XHRcdFx0Ly8gSUQgc2VsZWN0b3Jcblx0XHRcdFx0aWYgKCAobSA9IG1hdGNoWzFdKSApIHtcblxuXHRcdFx0XHRcdC8vIERvY3VtZW50IGNvbnRleHRcblx0XHRcdFx0XHRpZiAoIG5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXRcblx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnNcblx0XHRcdFx0XHRcdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0XHRpZiAoIGVsZW0uaWQgPT09IG0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRWxlbWVudCBjb250ZXh0XG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXRcblx0XHRcdFx0XHRcdC8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zXG5cdFx0XHRcdFx0XHQvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElEXG5cdFx0XHRcdFx0XHRpZiAoIG5ld0NvbnRleHQgJiYgKGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICYmXG5cdFx0XHRcdFx0XHRcdGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiZcblx0XHRcdFx0XHRcdFx0ZWxlbS5pZCA9PT0gbSApIHtcblxuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFR5cGUgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7XG5cdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHRcdC8vIENsYXNzIHNlbGVjdG9yXG5cdFx0XHRcdH0gZWxzZSBpZiAoIChtID0gbWF0Y2hbM10pICYmIHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJlxuXHRcdFx0XHRcdGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHtcblxuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGFrZSBhZHZhbnRhZ2Ugb2YgcXVlcnlTZWxlY3RvckFsbFxuXHRcdFx0aWYgKCBzdXBwb3J0LnFzYSAmJlxuXHRcdFx0XHQhY29tcGlsZXJDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdICYmXG5cdFx0XHRcdCghcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSkgKSB7XG5cblx0XHRcdFx0aWYgKCBub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0XHRuZXdDb250ZXh0ID0gY29udGV4dDtcblx0XHRcdFx0XHRuZXdTZWxlY3RvciA9IHNlbGVjdG9yO1xuXG5cdFx0XHRcdC8vIHFTQSBsb29rcyBvdXRzaWRlIEVsZW1lbnQgY29udGV4dCwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudFxuXHRcdFx0XHQvLyBUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhpcyB3b3JrYXJvdW5kIHRlY2huaXF1ZVxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PThcblx0XHRcdFx0Ly8gRXhjbHVkZSBvYmplY3QgZWxlbWVudHNcblx0XHRcdFx0fSBlbHNlIGlmICggY29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHRcdFx0Ly8gQ2FwdHVyZSB0aGUgY29udGV4dCBJRCwgc2V0dGluZyBpdCBmaXJzdCBpZiBuZWNlc3Nhcnlcblx0XHRcdFx0XHRpZiAoIChuaWQgPSBjb250ZXh0LmdldEF0dHJpYnV0ZSggXCJpZFwiICkpICkge1xuXHRcdFx0XHRcdFx0bmlkID0gbmlkLnJlcGxhY2UoIHJjc3Nlc2NhcGUsIGZjc3Nlc2NhcGUgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5zZXRBdHRyaWJ1dGUoIFwiaWRcIiwgKG5pZCA9IGV4cGFuZG8pICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUHJlZml4IGV2ZXJ5IHNlbGVjdG9yIGluIHRoZSBsaXN0XG5cdFx0XHRcdFx0Z3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7XG5cdFx0XHRcdFx0aSA9IGdyb3Vwcy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRncm91cHNbaV0gPSBcIiNcIiArIG5pZCArIFwiIFwiICsgdG9TZWxlY3RvciggZ3JvdXBzW2ldICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5ld1NlbGVjdG9yID0gZ3JvdXBzLmpvaW4oIFwiLFwiICk7XG5cblx0XHRcdFx0XHQvLyBFeHBhbmQgY29udGV4dCBmb3Igc2libGluZyBzZWxlY3RvcnNcblx0XHRcdFx0XHRuZXdDb250ZXh0ID0gcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHxcblx0XHRcdFx0XHRcdGNvbnRleHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIG5ld1NlbGVjdG9yICkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLFxuXHRcdFx0XHRcdFx0XHRuZXdDb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIG5ld1NlbGVjdG9yIClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9IGNhdGNoICggcXNhRXJyb3IgKSB7XG5cdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdGlmICggbmlkID09PSBleHBhbmRvICkge1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSggXCJpZFwiICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWxsIG90aGVyc1xuXHRyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUga2V5LXZhbHVlIGNhY2hlcyBvZiBsaW1pdGVkIHNpemVcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGhcbiAqXHRwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKVxuICpcdGRlbGV0aW5nIHRoZSBvbGRlc3QgZW50cnlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7XG5cdHZhciBrZXlzID0gW107XG5cblx0ZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7XG5cdFx0Ly8gVXNlIChrZXkgKyBcIiBcIikgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggbmF0aXZlIHByb3RvdHlwZSBwcm9wZXJ0aWVzIChzZWUgSXNzdWUgIzE1Nylcblx0XHRpZiAoIGtleXMucHVzaCgga2V5ICsgXCIgXCIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7XG5cdFx0XHQvLyBPbmx5IGtlZXAgdGhlIG1vc3QgcmVjZW50IGVudHJpZXNcblx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5cy5zaGlmdCgpIF07XG5cdFx0fVxuXHRcdHJldHVybiAoY2FjaGVbIGtleSArIFwiIFwiIF0gPSB2YWx1ZSk7XG5cdH1cblx0cmV0dXJuIGNhY2hlO1xufVxuXG4vKipcbiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFya1xuICovXG5mdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkge1xuXHRmblsgZXhwYW5kbyBdID0gdHJ1ZTtcblx0cmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIFN1cHBvcnQgdGVzdGluZyB1c2luZyBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGFzc2VydCggZm4gKSB7XG5cdHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJmaWVsZHNldFwiKTtcblxuXHR0cnkge1xuXHRcdHJldHVybiAhIWZuKCBlbCApO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9IGZpbmFsbHkge1xuXHRcdC8vIFJlbW92ZSBmcm9tIGl0cyBwYXJlbnQgYnkgZGVmYXVsdFxuXHRcdGlmICggZWwucGFyZW50Tm9kZSApIHtcblx0XHRcdGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsICk7XG5cdFx0fVxuXHRcdC8vIHJlbGVhc2UgbWVtb3J5IGluIElFXG5cdFx0ZWwgPSBudWxsO1xuXHR9XG59XG5cbi8qKlxuICogQWRkcyB0aGUgc2FtZSBoYW5kbGVyIGZvciBhbGwgb2YgdGhlIHNwZWNpZmllZCBhdHRyc1xuICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlciBUaGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBhcHBsaWVkXG4gKi9cbmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7XG5cdHZhciBhcnIgPSBhdHRycy5zcGxpdChcInxcIiksXG5cdFx0aSA9IGFyci5sZW5ndGg7XG5cblx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0RXhwci5hdHRySGFuZGxlWyBhcnJbaV0gXSA9IGhhbmRsZXI7XG5cdH1cbn1cblxuLyoqXG4gKiBDaGVja3MgZG9jdW1lbnQgb3JkZXIgb2YgdHdvIHNpYmxpbmdzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGFcbiAqIEBwYXJhbSB7RWxlbWVudH0gYlxuICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyBsZXNzIHRoYW4gMCBpZiBhIHByZWNlZGVzIGIsIGdyZWF0ZXIgdGhhbiAwIGlmIGEgZm9sbG93cyBiXG4gKi9cbmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHtcblx0dmFyIGN1ciA9IGIgJiYgYSxcblx0XHRkaWZmID0gY3VyICYmIGEubm9kZVR5cGUgPT09IDEgJiYgYi5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0YS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7XG5cblx0Ly8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzXG5cdGlmICggZGlmZiApIHtcblx0XHRyZXR1cm4gZGlmZjtcblx0fVxuXG5cdC8vIENoZWNrIGlmIGIgZm9sbG93cyBhXG5cdGlmICggY3VyICkge1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7XG5cdFx0XHRpZiAoIGN1ciA9PT0gYiApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhID8gMSA6IC0xO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgaW5wdXQgdHlwZXNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUlucHV0UHNldWRvKCB0eXBlICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBidXR0b25zXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjcmVhdGVCdXR0b25Qc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gKG5hbWUgPT09IFwiaW5wdXRcIiB8fCBuYW1lID09PSBcImJ1dHRvblwiKSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciA6ZW5hYmxlZC86ZGlzYWJsZWRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzYWJsZWQgdHJ1ZSBmb3IgOmRpc2FibGVkOyBmYWxzZSBmb3IgOmVuYWJsZWRcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGRpc2FibGVkICkge1xuXG5cdC8vIEtub3duIDpkaXNhYmxlZCBmYWxzZSBwb3NpdGl2ZXM6IGZpZWxkc2V0W2Rpc2FibGVkXSA+IGxlZ2VuZDpudGgtb2YtdHlwZShuKzIpIDpjYW4tZGlzYWJsZVxuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBPbmx5IGNlcnRhaW4gZWxlbWVudHMgY2FuIG1hdGNoIDplbmFibGVkIG9yIDpkaXNhYmxlZFxuXHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NjcmlwdGluZy5odG1sI3NlbGVjdG9yLWVuYWJsZWRcblx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1kaXNhYmxlZFxuXHRcdGlmICggXCJmb3JtXCIgaW4gZWxlbSApIHtcblxuXHRcdFx0Ly8gQ2hlY2sgZm9yIGluaGVyaXRlZCBkaXNhYmxlZG5lc3Mgb24gcmVsZXZhbnQgbm9uLWRpc2FibGVkIGVsZW1lbnRzOlxuXHRcdFx0Ly8gKiBsaXN0ZWQgZm9ybS1hc3NvY2lhdGVkIGVsZW1lbnRzIGluIGEgZGlzYWJsZWQgZmllbGRzZXRcblx0XHRcdC8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjYXRlZ29yeS1saXN0ZWRcblx0XHRcdC8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjb25jZXB0LWZlLWRpc2FibGVkXG5cdFx0XHQvLyAqIG9wdGlvbiBlbGVtZW50cyBpbiBhIGRpc2FibGVkIG9wdGdyb3VwXG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY29uY2VwdC1vcHRpb24tZGlzYWJsZWRcblx0XHRcdC8vIEFsbCBzdWNoIGVsZW1lbnRzIGhhdmUgYSBcImZvcm1cIiBwcm9wZXJ0eS5cblx0XHRcdGlmICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdC8vIE9wdGlvbiBlbGVtZW50cyBkZWZlciB0byBhIHBhcmVudCBvcHRncm91cCBpZiBwcmVzZW50XG5cdFx0XHRcdGlmICggXCJsYWJlbFwiIGluIGVsZW0gKSB7XG5cdFx0XHRcdFx0aWYgKCBcImxhYmVsXCIgaW4gZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW0ucGFyZW50Tm9kZS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA2IC0gMTFcblx0XHRcdFx0Ly8gVXNlIHRoZSBpc0Rpc2FibGVkIHNob3J0Y3V0IHByb3BlcnR5IHRvIGNoZWNrIGZvciBkaXNhYmxlZCBmaWVsZHNldCBhbmNlc3RvcnNcblx0XHRcdFx0cmV0dXJuIGVsZW0uaXNEaXNhYmxlZCA9PT0gZGlzYWJsZWQgfHxcblxuXHRcdFx0XHRcdC8vIFdoZXJlIHRoZXJlIGlzIG5vIGlzRGlzYWJsZWQsIGNoZWNrIG1hbnVhbGx5XG5cdFx0XHRcdFx0LyoganNoaW50IC1XMDE4ICovXG5cdFx0XHRcdFx0ZWxlbS5pc0Rpc2FibGVkICE9PSAhZGlzYWJsZWQgJiZcblx0XHRcdFx0XHRcdGRpc2FibGVkQW5jZXN0b3IoIGVsZW0gKSA9PT0gZGlzYWJsZWQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblxuXHRcdC8vIFRyeSB0byB3aW5ub3cgb3V0IGVsZW1lbnRzIHRoYXQgY2FuJ3QgYmUgZGlzYWJsZWQgYmVmb3JlIHRydXN0aW5nIHRoZSBkaXNhYmxlZCBwcm9wZXJ0eS5cblx0XHQvLyBTb21lIHZpY3RpbXMgZ2V0IGNhdWdodCBpbiBvdXIgbmV0IChsYWJlbCwgbGVnZW5kLCBtZW51LCB0cmFjayksIGJ1dCBpdCBzaG91bGRuJ3Rcblx0XHQvLyBldmVuIGV4aXN0IG9uIHRoZW0sIGxldCBhbG9uZSBoYXZlIGEgYm9vbGVhbiB2YWx1ZS5cblx0XHR9IGVsc2UgaWYgKCBcImxhYmVsXCIgaW4gZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblx0XHR9XG5cblx0XHQvLyBSZW1haW5pbmcgZWxlbWVudHMgYXJlIG5laXRoZXIgOmVuYWJsZWQgbm9yIDpkaXNhYmxlZFxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICovXG5mdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHtcblx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggYXJndW1lbnQgKSB7XG5cdFx0YXJndW1lbnQgPSArYXJndW1lbnQ7XG5cdFx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdHZhciBqLFxuXHRcdFx0XHRtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLFxuXHRcdFx0XHRpID0gbWF0Y2hJbmRleGVzLmxlbmd0aDtcblxuXHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHtcblx0XHRcdFx0XHRzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdD19IGNvbnRleHRcbiAqIEByZXR1cm5zIHtFbGVtZW50fE9iamVjdHxCb29sZWFufSBUaGUgaW5wdXQgbm9kZSBpZiBhY2NlcHRhYmxlLCBvdGhlcndpc2UgYSBmYWxzeSB2YWx1ZVxuICovXG5mdW5jdGlvbiB0ZXN0Q29udGV4dCggY29udGV4dCApIHtcblx0cmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgY29udGV4dDtcbn1cblxuLy8gRXhwb3NlIHN1cHBvcnQgdmFycyBmb3IgY29udmVuaWVuY2VcbnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9O1xuXG4vKipcbiAqIERldGVjdHMgWE1MIG5vZGVzXG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBlbGVtIEFuIGVsZW1lbnQgb3IgYSBkb2N1bWVudFxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWZmIGVsZW0gaXMgYSBub24tSFRNTCBYTUwgbm9kZVxuICovXG5pc1hNTCA9IFNpenpsZS5pc1hNTCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHQvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0XG5cdC8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBpbiBJRSAtICM0ODMzKVxuXHR2YXIgZG9jdW1lbnRFbGVtZW50ID0gZWxlbSAmJiAoZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0pLmRvY3VtZW50RWxlbWVudDtcblx0cmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gXCJIVE1MXCIgOiBmYWxzZTtcbn07XG5cbi8qKlxuICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBbZG9jXSBBbiBlbGVtZW50IG9yIGRvY3VtZW50IG9iamVjdCB0byB1c2UgdG8gc2V0IHRoZSBkb2N1bWVudFxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY3VycmVudCBkb2N1bWVudFxuICovXG5zZXREb2N1bWVudCA9IFNpenpsZS5zZXREb2N1bWVudCA9IGZ1bmN0aW9uKCBub2RlICkge1xuXHR2YXIgaGFzQ29tcGFyZSwgc3ViV2luZG93LFxuXHRcdGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYztcblxuXHQvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZFxuXHRpZiAoIGRvYyA9PT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBlICE9PSA5IHx8ICFkb2MuZG9jdW1lbnRFbGVtZW50ICkge1xuXHRcdHJldHVybiBkb2N1bWVudDtcblx0fVxuXG5cdC8vIFVwZGF0ZSBnbG9iYWwgdmFyaWFibGVzXG5cdGRvY3VtZW50ID0gZG9jO1xuXHRkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXHRkb2N1bWVudElzSFRNTCA9ICFpc1hNTCggZG9jdW1lbnQgKTtcblxuXHQvLyBTdXBwb3J0OiBJRSA5LTExLCBFZGdlXG5cdC8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgXCJwZXJtaXNzaW9uIGRlbmllZFwiIGVycm9ycyAoalF1ZXJ5ICMxMzkzNilcblx0aWYgKCBwcmVmZXJyZWREb2MgIT09IGRvY3VtZW50ICYmXG5cdFx0KHN1YldpbmRvdyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3KSAmJiBzdWJXaW5kb3cudG9wICE9PSBzdWJXaW5kb3cgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSAxMSwgRWRnZVxuXHRcdGlmICggc3ViV2luZG93LmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggXCJ1bmxvYWRcIiwgdW5sb2FkSGFuZGxlciwgZmFsc2UgKTtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5XG5cdFx0fSBlbHNlIGlmICggc3ViV2luZG93LmF0dGFjaEV2ZW50ICkge1xuXHRcdFx0c3ViV2luZG93LmF0dGFjaEV2ZW50KCBcIm9udW5sb2FkXCIsIHVubG9hZEhhbmRsZXIgKTtcblx0XHR9XG5cdH1cblxuXHQvKiBBdHRyaWJ1dGVzXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBTdXBwb3J0OiBJRTw4XG5cdC8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllc1xuXHQvLyAoZXhjZXB0aW5nIElFOCBib29sZWFucylcblx0c3VwcG9ydC5hdHRyaWJ1dGVzID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRlbC5jbGFzc05hbWUgPSBcImlcIjtcblx0XHRyZXR1cm4gIWVsLmdldEF0dHJpYnV0ZShcImNsYXNzTmFtZVwiKTtcblx0fSk7XG5cblx0LyogZ2V0RWxlbWVudChzKUJ5KlxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpIHJldHVybnMgb25seSBlbGVtZW50c1xuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRlbC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcIlwiKSApO1xuXHRcdHJldHVybiAhZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gU3VwcG9ydDogSUU8OVxuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTtcblxuXHQvLyBTdXBwb3J0OiBJRTwxMFxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWVcblx0Ly8gVGhlIGJyb2tlbiBnZXRFbGVtZW50QnlJZCBtZXRob2RzIGRvbid0IHBpY2sgdXAgcHJvZ3JhbW1hdGljYWxseS1zZXQgbmFtZXMsXG5cdC8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdFxuXHRzdXBwb3J0LmdldEJ5SWQgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuaWQgPSBleHBhbmRvO1xuXHRcdHJldHVybiAhZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUgfHwgIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCBleHBhbmRvICkubGVuZ3RoO1xuXHR9KTtcblxuXHQvLyBJRCBmaWx0ZXIgYW5kIGZpbmRcblx0aWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7XG5cdFx0RXhwci5maWx0ZXJbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXHRcdEV4cHIuZmluZFtcIklEXCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXHRcdFx0XHRyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107XG5cdFx0XHR9XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRFeHByLmZpbHRlcltcIklEXCJdID0gIGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09IFwidW5kZWZpbmVkXCIgJiZcblx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDcgb25seVxuXHRcdC8vIGdldEVsZW1lbnRCeUlkIGlzIG5vdCByZWxpYWJsZSBhcyBhIGZpbmQgc2hvcnRjdXRcblx0XHRFeHByLmZpbmRbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRcdHZhciBub2RlLCBpLCBlbGVtcyxcblx0XHRcdFx0XHRlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTtcblxuXHRcdFx0XHRpZiAoIGVsZW0gKSB7XG5cblx0XHRcdFx0XHQvLyBWZXJpZnkgdGhlIGlkIGF0dHJpYnV0ZVxuXHRcdFx0XHRcdG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0XHRpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gWyBlbGVtIF07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRmFsbCBiYWNrIG9uIGdldEVsZW1lbnRzQnlOYW1lXG5cdFx0XHRcdFx0ZWxlbXMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lKCBpZCApO1xuXHRcdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtc1tpKytdKSApIHtcblx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0XHRcdGlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFsgZWxlbSBdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBbXTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0Ly8gVGFnXG5cdEV4cHIuZmluZFtcIlRBR1wiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgP1xuXHRcdGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XG5cblx0XHRcdC8vIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgZG9uJ3QgaGF2ZSBnRUJUTlxuXHRcdFx0fSBlbHNlIGlmICggc3VwcG9ydC5xc2EgKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyApO1xuXHRcdFx0fVxuXHRcdH0gOlxuXG5cdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcblx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHR0bXAgPSBbXSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdC8vIEJ5IGhhcHB5IGNvaW5jaWRlbmNlLCBhIChicm9rZW4pIGdFQlROIGFwcGVhcnMgb24gRG9jdW1lbnRGcmFnbWVudCBub2RlcyB0b29cblx0XHRcdFx0cmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0XHQvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzXG5cdFx0XHRpZiAoIHRhZyA9PT0gXCIqXCIgKSB7XG5cdFx0XHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0XHRcdHRtcC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRtcDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdH07XG5cblx0Ly8gQ2xhc3Ncblx0RXhwci5maW5kW1wiQ0xBU1NcIl0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYgZnVuY3Rpb24oIGNsYXNzTmFtZSwgY29udGV4dCApIHtcblx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBjbGFzc05hbWUgKTtcblx0XHR9XG5cdH07XG5cblx0LyogUVNBL21hdGNoZXNTZWxlY3RvclxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gUVNBIGFuZCBtYXRjaGVzU2VsZWN0b3Igc3VwcG9ydFxuXG5cdC8vIG1hdGNoZXNTZWxlY3Rvcig6YWN0aXZlKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoSUU5L09wZXJhIDExLjUpXG5cdHJidWdneU1hdGNoZXMgPSBbXTtcblxuXHQvLyBxU2EoOmZvY3VzKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoQ2hyb21lIDIxKVxuXHQvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3Jcblx0Ly8gd2hlbmV2ZXIgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgIGlzIGFjY2Vzc2VkIG9uIGFuIGlmcmFtZVxuXHQvLyBTbywgd2UgYWxsb3cgOmZvY3VzIHRvIHBhc3MgdGhyb3VnaCBRU0EgYWxsIHRoZSB0aW1lIHRvIGF2b2lkIHRoZSBJRSBlcnJvclxuXHQvLyBTZWUgaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4XG5cdHJidWdneVFTQSA9IFtdO1xuXG5cdGlmICggKHN1cHBvcnQucXNhID0gcm5hdGl2ZS50ZXN0KCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsICkpICkge1xuXHRcdC8vIEJ1aWxkIFFTQSByZWdleFxuXHRcdC8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmlcblx0XHRhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdFx0Ly8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZVxuXHRcdFx0Ly8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWNpdGx5XG5cdFx0XHQvLyBzZXR0aW5nIGEgYm9vbGVhbiBjb250ZW50IGF0dHJpYnV0ZSxcblx0XHRcdC8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoXG5cdFx0XHQvLyBodHRwczovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIzNTlcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuaW5uZXJIVE1MID0gXCI8YSBpZD0nXCIgKyBleHBhbmRvICsgXCInPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBpZD0nXCIgKyBleHBhbmRvICsgXCItXFxyXFxcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+XCIgK1xuXHRcdFx0XHRcIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+XCI7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTZcblx0XHRcdC8vIE5vdGhpbmcgc2hvdWxkIGJlIHNlbGVjdGVkIHdoZW4gZW1wdHkgc3RyaW5ncyBmb2xsb3cgXj0gb3IgJD0gb3IgKj1cblx0XHRcdC8vIFRoZSB0ZXN0IGF0dHJpYnV0ZSBtdXN0IGJlIHVua25vd24gaW4gT3BlcmEgYnV0IFwic2FmZVwiIGZvciBXaW5SVFxuXHRcdFx0Ly8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9oaDQ2NTM4OC5hc3B4I2F0dHJpYnV0ZV9zZWN0aW9uXG5cdFx0XHRpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbXNhbGxvd2NhcHR1cmVePScnXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlsqXiRdPVwiICsgd2hpdGVzcGFjZSArIFwiKig/OicnfFxcXCJcXFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gQm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCBcInZhbHVlXCIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseVxuXHRcdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbChcIltzZWxlY3RlZF1cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKig/OnZhbHVlfFwiICsgYm9vbGVhbnMgKyBcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWU8MjksIEFuZHJvaWQ8NC40LCBTYWZhcmk8Ny4wKywgaU9TPDcuMCssIFBoYW50b21KUzwxLjkuOCtcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW2lkfj1cIiArIGV4cGFuZG8gKyBcIi1dXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwifj1cIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlYmtpdC9PcGVyYSAtIDpjaGVja2VkIHNob3VsZCByZXR1cm4gc2VsZWN0ZWQgb3B0aW9uIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6Y2hlY2tlZFwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwiOmNoZWNrZWRcIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IFNhZmFyaSA4KywgaU9TIDgrXG5cdFx0XHQvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM2ODUxXG5cdFx0XHQvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJsaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzXG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcImEjXCIgKyBleHBhbmRvICsgXCIrKlwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIi4jLitbK35dXCIpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRcdGVsLmlubmVySFRNTCA9IFwiPGEgaHJlZj0nJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PlwiO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBXaW5kb3dzIDggTmF0aXZlIEFwcHNcblx0XHRcdC8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudFxuXHRcdFx0dmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuXHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJoaWRkZW5cIiApO1xuXHRcdFx0ZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJEXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4XG5cdFx0XHQvLyBFbmZvcmNlIGNhc2Utc2Vuc2l0aXZpdHkgb2YgbmFtZSBhdHRyaWJ1dGVcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbChcIltuYW1lPWRdXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwibmFtZVwiICsgd2hpdGVzcGFjZSArIFwiKlsqXiR8IX5dPz1cIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKVxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbChcIjplbmFibGVkXCIpLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdFx0XHQvLyBJRSdzIDpkaXNhYmxlZCBzZWxlY3RvciBkb2VzIG5vdCBwaWNrIHVwIHRoZSBjaGlsZHJlbiBvZiBkaXNhYmxlZCBmaWVsZHNldHNcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuZGlzYWJsZWQgPSB0cnVlO1xuXHRcdFx0aWYgKCBlbC5xdWVyeVNlbGVjdG9yQWxsKFwiOmRpc2FibGVkXCIpLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPcGVyYSAxMC0xMSBkb2VzIG5vdCB0aHJvdyBvbiBwb3N0LWNvbW1hIGludmFsaWQgcHNldWRvc1xuXHRcdFx0ZWwucXVlcnlTZWxlY3RvckFsbChcIiosOnhcIik7XG5cdFx0XHRyYnVnZ3lRU0EucHVzaChcIiwuKjpcIik7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHxcblx0XHRkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7XG5cblx0XHRhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdFx0Ly8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgcG9zc2libGUgdG8gZG8gbWF0Y2hlc1NlbGVjdG9yXG5cdFx0XHQvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KVxuXHRcdFx0c3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCA9IG1hdGNoZXMuY2FsbCggZWwsIFwiKlwiICk7XG5cblx0XHRcdC8vIFRoaXMgc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb25cblx0XHRcdC8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWRcblx0XHRcdG1hdGNoZXMuY2FsbCggZWwsIFwiW3MhPScnXTp4XCIgKTtcblx0XHRcdHJidWdneU1hdGNoZXMucHVzaCggXCIhPVwiLCBwc2V1ZG9zICk7XG5cdFx0fSk7XG5cdH1cblxuXHRyYnVnZ3lRU0EgPSByYnVnZ3lRU0EubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneVFTQS5qb2luKFwifFwiKSApO1xuXHRyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKFwifFwiKSApO1xuXG5cdC8qIENvbnRhaW5zXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblx0aGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApO1xuXG5cdC8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlclxuXHQvLyBQdXJwb3NlZnVsbHkgc2VsZi1leGNsdXNpdmVcblx0Ly8gQXMgaW4sIGFuIGVsZW1lbnQgZG9lcyBub3QgY29udGFpbiBpdHNlbGZcblx0Y29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID9cblx0XHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdHZhciBhZG93biA9IGEubm9kZVR5cGUgPT09IDkgPyBhLmRvY3VtZW50RWxlbWVudCA6IGEsXG5cdFx0XHRcdGJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlO1xuXHRcdFx0cmV0dXJuIGEgPT09IGJ1cCB8fCAhISggYnVwICYmIGJ1cC5ub2RlVHlwZSA9PT0gMSAmJiAoXG5cdFx0XHRcdGFkb3duLmNvbnRhaW5zID9cblx0XHRcdFx0XHRhZG93bi5jb250YWlucyggYnVwICkgOlxuXHRcdFx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNlxuXHRcdFx0KSk7XG5cdFx0fSA6XG5cdFx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHRpZiAoIGIgKSB7XG5cdFx0XHRcdHdoaWxlICggKGIgPSBiLnBhcmVudE5vZGUpICkge1xuXHRcdFx0XHRcdGlmICggYiA9PT0gYSApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0LyogU29ydGluZ1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gRG9jdW1lbnQgb3JkZXIgc29ydGluZ1xuXHRzb3J0T3JkZXIgPSBoYXNDb21wYXJlID9cblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cblx0XHQvLyBGbGFnIGZvciBkdXBsaWNhdGUgcmVtb3ZhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHQvLyBTb3J0IG9uIG1ldGhvZCBleGlzdGVuY2UgaWYgb25seSBvbmUgaW5wdXQgaGFzIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uXG5cdFx0dmFyIGNvbXBhcmUgPSAhYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAtICFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO1xuXHRcdGlmICggY29tcGFyZSApIHtcblx0XHRcdHJldHVybiBjb21wYXJlO1xuXHRcdH1cblxuXHRcdC8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnRcblx0XHRjb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgP1xuXHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYiApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkXG5cdFx0XHQxO1xuXG5cdFx0Ly8gRGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0aWYgKCBjb21wYXJlICYgMSB8fFxuXHRcdFx0KCFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUpICkge1xuXG5cdFx0XHQvLyBDaG9vc2UgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyByZWxhdGVkIHRvIG91ciBwcmVmZXJyZWQgZG9jdW1lbnRcblx0XHRcdGlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBiID09PSBkb2N1bWVudCB8fCBiLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBjb250YWlucyhwcmVmZXJyZWREb2MsIGIpICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXJcblx0XHRcdHJldHVybiBzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6XG5cdFx0XHRcdDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxO1xuXHR9IDpcblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0Ly8gRXhpdCBlYXJseSBpZiB0aGUgbm9kZXMgYXJlIGlkZW50aWNhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHR2YXIgY3VyLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRhdXAgPSBhLnBhcmVudE5vZGUsXG5cdFx0XHRidXAgPSBiLnBhcmVudE5vZGUsXG5cdFx0XHRhcCA9IFsgYSBdLFxuXHRcdFx0YnAgPSBbIGIgXTtcblxuXHRcdC8vIFBhcmVudGxlc3Mgbm9kZXMgYXJlIGVpdGhlciBkb2N1bWVudHMgb3IgZGlzY29ubmVjdGVkXG5cdFx0aWYgKCAhYXVwIHx8ICFidXAgKSB7XG5cdFx0XHRyZXR1cm4gYSA9PT0gZG9jdW1lbnQgPyAtMSA6XG5cdFx0XHRcdGIgPT09IGRvY3VtZW50ID8gMSA6XG5cdFx0XHRcdGF1cCA/IC0xIDpcblx0XHRcdFx0YnVwID8gMSA6XG5cdFx0XHRcdHNvcnRJbnB1dCA/XG5cdFx0XHRcdCggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDpcblx0XHRcdFx0MDtcblxuXHRcdC8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrXG5cdFx0fSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7XG5cdFx0XHRyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlIHdlIG5lZWQgZnVsbCBsaXN0cyBvZiB0aGVpciBhbmNlc3RvcnMgZm9yIGNvbXBhcmlzb25cblx0XHRjdXIgPSBhO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGFwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblx0XHRjdXIgPSBiO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGJwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblxuXHRcdC8vIFdhbGsgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5XG5cdFx0d2hpbGUgKCBhcFtpXSA9PT0gYnBbaV0gKSB7XG5cdFx0XHRpKys7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGkgP1xuXHRcdFx0Ly8gRG8gYSBzaWJsaW5nIGNoZWNrIGlmIHRoZSBub2RlcyBoYXZlIGEgY29tbW9uIGFuY2VzdG9yXG5cdFx0XHRzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIG5vZGVzIGluIG91ciBkb2N1bWVudCBzb3J0IGZpcnN0XG5cdFx0XHRhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOlxuXHRcdFx0YnBbaV0gPT09IHByZWZlcnJlZERvYyA/IDEgOlxuXHRcdFx0MDtcblx0fTtcblxuXHRyZXR1cm4gZG9jdW1lbnQ7XG59O1xuXG5TaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHtcblx0cmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTtcbn07XG5cblNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHtcblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdGlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHR9XG5cblx0Ly8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkXG5cdGV4cHIgPSBleHByLnJlcGxhY2UoIHJhdHRyaWJ1dGVRdW90ZXMsIFwiPSckMSddXCIgKTtcblxuXHRpZiAoIHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yICYmIGRvY3VtZW50SXNIVE1MICYmXG5cdFx0IWNvbXBpbGVyQ2FjaGVbIGV4cHIgKyBcIiBcIiBdICYmXG5cdFx0KCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJlxuXHRcdCggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHtcblxuXHRcdHRyeSB7XG5cdFx0XHR2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7XG5cblx0XHRcdC8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRcdGlmICggcmV0IHx8IHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggfHxcblx0XHRcdFx0XHQvLyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9kZXMgYXJlIHNhaWQgdG8gYmUgaW4gYSBkb2N1bWVudFxuXHRcdFx0XHRcdC8vIGZyYWdtZW50IGluIElFIDlcblx0XHRcdFx0XHRlbGVtLmRvY3VtZW50ICYmIGVsZW0uZG9jdW1lbnQubm9kZVR5cGUgIT09IDExICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGUpIHt9XG5cdH1cblxuXHRyZXR1cm4gU2l6emxlKCBleHByLCBkb2N1bWVudCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwO1xufTtcblxuU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGNvbnRleHQgKTtcblx0fVxuXHRyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTtcbn07XG5cblNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdHZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sXG5cdFx0Ly8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpXG5cdFx0dmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0Zm4oIGVsZW0sIG5hbWUsICFkb2N1bWVudElzSFRNTCApIDpcblx0XHRcdHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgP1xuXHRcdHZhbCA6XG5cdFx0c3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDpcblx0XHRcdCh2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkpICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xufTtcblxuU2l6emxlLmVzY2FwZSA9IGZ1bmN0aW9uKCBzZWwgKSB7XG5cdHJldHVybiAoc2VsICsgXCJcIikucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApO1xufTtcblxuU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHtcblx0dGhyb3cgbmV3IEVycm9yKCBcIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246IFwiICsgbXNnICk7XG59O1xuXG4vKipcbiAqIERvY3VtZW50IHNvcnRpbmcgYW5kIHJlbW92aW5nIGR1cGxpY2F0ZXNcbiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzXG4gKi9cblNpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24oIHJlc3VsdHMgKSB7XG5cdHZhciBlbGVtLFxuXHRcdGR1cGxpY2F0ZXMgPSBbXSxcblx0XHRqID0gMCxcblx0XHRpID0gMDtcblxuXHQvLyBVbmxlc3Mgd2UgKmtub3cqIHdlIGNhbiBkZXRlY3QgZHVwbGljYXRlcywgYXNzdW1lIHRoZWlyIHByZXNlbmNlXG5cdGhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7XG5cdHNvcnRJbnB1dCA9ICFzdXBwb3J0LnNvcnRTdGFibGUgJiYgcmVzdWx0cy5zbGljZSggMCApO1xuXHRyZXN1bHRzLnNvcnQoIHNvcnRPcmRlciApO1xuXG5cdGlmICggaGFzRHVwbGljYXRlICkge1xuXHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0aWYgKCBlbGVtID09PSByZXN1bHRzWyBpIF0gKSB7XG5cdFx0XHRcdGogPSBkdXBsaWNhdGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2xlYXIgaW5wdXQgYWZ0ZXIgc29ydGluZyB0byByZWxlYXNlIG9iamVjdHNcblx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL3B1bGwvMjI1XG5cdHNvcnRJbnB1dCA9IG51bGw7XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzXG4gKiBAcGFyYW0ge0FycmF5fEVsZW1lbnR9IGVsZW1cbiAqL1xuZ2V0VGV4dCA9IFNpenpsZS5nZXRUZXh0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHZhciBub2RlLFxuXHRcdHJldCA9IFwiXCIsXG5cdFx0aSA9IDAsXG5cdFx0bm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdGlmICggIW5vZGVUeXBlICkge1xuXHRcdC8vIElmIG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5XG5cdFx0d2hpbGUgKCAobm9kZSA9IGVsZW1baSsrXSkgKSB7XG5cdFx0XHQvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2Rlc1xuXHRcdFx0cmV0ICs9IGdldFRleHQoIG5vZGUgKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHtcblx0XHQvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzXG5cdFx0Ly8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1Mylcblx0XHRpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRyYXZlcnNlIGl0cyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdHJldCArPSBnZXRUZXh0KCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMyB8fCBub2RlVHlwZSA9PT0gNCApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVmFsdWU7XG5cdH1cblx0Ly8gRG8gbm90IGluY2x1ZGUgY29tbWVudCBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5vZGVzXG5cblx0cmV0dXJuIHJldDtcbn07XG5cbkV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzID0ge1xuXG5cdC8vIENhbiBiZSBhZGp1c3RlZCBieSB0aGUgdXNlclxuXHRjYWNoZUxlbmd0aDogNTAsXG5cblx0Y3JlYXRlUHNldWRvOiBtYXJrRnVuY3Rpb24sXG5cblx0bWF0Y2g6IG1hdGNoRXhwcixcblxuXHRhdHRySGFuZGxlOiB7fSxcblxuXHRmaW5kOiB7fSxcblxuXHRyZWxhdGl2ZToge1xuXHRcdFwiPlwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCIgXCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiB9LFxuXHRcdFwiK1wiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIn5cIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIgfVxuXHR9LFxuXG5cdHByZUZpbHRlcjoge1xuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdC8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkXG5cdFx0XHRtYXRjaFszXSA9ICggbWF0Y2hbM10gfHwgbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgXCJcIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdGlmICggbWF0Y2hbMl0gPT09IFwifj1cIiApIHtcblx0XHRcdFx0bWF0Y2hbM10gPSBcIiBcIiArIG1hdGNoWzNdICsgXCIgXCI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgNCApO1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdC8qIG1hdGNoZXMgZnJvbSBtYXRjaEV4cHJbXCJDSElMRFwiXVxuXHRcdFx0XHQxIHR5cGUgKG9ubHl8bnRofC4uLilcblx0XHRcdFx0MiB3aGF0IChjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHQzIGFyZ3VtZW50IChldmVufG9kZHxcXGQqfFxcZCpuKFsrLV1cXGQrKT98Li4uKVxuXHRcdFx0XHQ0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xcZCpufClcblx0XHRcdFx0NSBzaWduIG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ2IHggb2YgeG4tY29tcG9uZW50XG5cdFx0XHRcdDcgc2lnbiBvZiB5LWNvbXBvbmVudFxuXHRcdFx0XHQ4IHkgb2YgeS1jb21wb25lbnRcblx0XHRcdCovXG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdGlmICggbWF0Y2hbMV0uc2xpY2UoIDAsIDMgKSA9PT0gXCJudGhcIiApIHtcblx0XHRcdFx0Ly8gbnRoLSogcmVxdWlyZXMgYXJndW1lbnRcblx0XHRcdFx0aWYgKCAhbWF0Y2hbM10gKSB7XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFswXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxEXG5cdFx0XHRcdC8vIHJlbWVtYmVyIHRoYXQgZmFsc2UvdHJ1ZSBjYXN0IHJlc3BlY3RpdmVseSB0byAwLzFcblx0XHRcdFx0bWF0Y2hbNF0gPSArKCBtYXRjaFs0XSA/IG1hdGNoWzVdICsgKG1hdGNoWzZdIHx8IDEpIDogMiAqICggbWF0Y2hbM10gPT09IFwiZXZlblwiIHx8IG1hdGNoWzNdID09PSBcIm9kZFwiICkgKTtcblx0XHRcdFx0bWF0Y2hbNV0gPSArKCAoIG1hdGNoWzddICsgbWF0Y2hbOF0gKSB8fCBtYXRjaFszXSA9PT0gXCJvZGRcIiApO1xuXG5cdFx0XHQvLyBvdGhlciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaDtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0dmFyIGV4Y2Vzcyxcblx0XHRcdFx0dW5xdW90ZWQgPSAhbWF0Y2hbNl0gJiYgbWF0Y2hbMl07XG5cblx0XHRcdGlmICggbWF0Y2hFeHByW1wiQ0hJTERcIl0udGVzdCggbWF0Y2hbMF0gKSApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFjY2VwdCBxdW90ZWQgYXJndW1lbnRzIGFzLWlzXG5cdFx0XHRpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRtYXRjaFsyXSA9IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IFwiXCI7XG5cblx0XHRcdC8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkgJiZcblx0XHRcdFx0Ly8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSlcblx0XHRcdFx0KGV4Y2VzcyA9IHRva2VuaXplKCB1bnF1b3RlZCwgdHJ1ZSApKSAmJlxuXHRcdFx0XHQvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVzaXNcblx0XHRcdFx0KGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoIFwiKVwiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7XG5cblx0XHRcdFx0Ly8gZXhjZXNzIGlzIGEgbmVnYXRpdmUgaW5kZXhcblx0XHRcdFx0bWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCwgZXhjZXNzICk7XG5cdFx0XHRcdG1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudClcblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgMyApO1xuXHRcdH1cblx0fSxcblxuXHRmaWx0ZXI6IHtcblxuXHRcdFwiVEFHXCI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkge1xuXHRcdFx0dmFyIG5vZGVOYW1lID0gbm9kZU5hbWVTZWxlY3Rvci5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbm9kZU5hbWVTZWxlY3RvciA9PT0gXCIqXCIgP1xuXHRcdFx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lO1xuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNMQVNTXCI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7XG5cdFx0XHR2YXIgcGF0dGVybiA9IGNsYXNzQ2FjaGVbIGNsYXNzTmFtZSArIFwiIFwiIF07XG5cblx0XHRcdHJldHVybiBwYXR0ZXJuIHx8XG5cdFx0XHRcdChwYXR0ZXJuID0gbmV3IFJlZ0V4cCggXCIoXnxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIGNsYXNzTmFtZSArIFwiKFwiICsgd2hpdGVzcGFjZSArIFwifCQpXCIgKSkgJiZcblx0XHRcdFx0Y2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbS5jbGFzc05hbWUgfHwgdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBcInVuZGVmaW5lZFwiICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIiApO1xuXHRcdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0XCJBVFRSXCI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciByZXN1bHQgPSBTaXp6bGUuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0XHRcdGlmICggcmVzdWx0ID09IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIiE9XCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCAhb3BlcmF0b3IgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHQgKz0gXCJcIjtcblxuXHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiPVwiID8gcmVzdWx0ID09PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiIT1cIiA/IHJlc3VsdCAhPT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIl49XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA9PT0gMCA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiKj1cIiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiQ9XCIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIn49XCIgPyAoIFwiIFwiICsgcmVzdWx0LnJlcGxhY2UoIHJ3aGl0ZXNwYWNlLCBcIiBcIiApICsgXCIgXCIgKS5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcInw9XCIgPyByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArIFwiLVwiIDpcblx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiQ0hJTERcIjogZnVuY3Rpb24oIHR5cGUsIHdoYXQsIGFyZ3VtZW50LCBmaXJzdCwgbGFzdCApIHtcblx0XHRcdHZhciBzaW1wbGUgPSB0eXBlLnNsaWNlKCAwLCAzICkgIT09IFwibnRoXCIsXG5cdFx0XHRcdGZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSBcImxhc3RcIixcblx0XHRcdFx0b2ZUeXBlID0gd2hhdCA9PT0gXCJvZi10eXBlXCI7XG5cblx0XHRcdHJldHVybiBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwID9cblxuXHRcdFx0XHQvLyBTaG9ydGN1dCBmb3IgOm50aC0qKG4pXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiAhIWVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdFx0fSA6XG5cblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgY2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LFxuXHRcdFx0XHRcdFx0ZGlyID0gc2ltcGxlICE9PSBmb3J3YXJkID8gXCJuZXh0U2libGluZ1wiIDogXCJwcmV2aW91c1NpYmxpbmdcIixcblx0XHRcdFx0XHRcdHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSxcblx0XHRcdFx0XHRcdG5hbWUgPSBvZlR5cGUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFxuXHRcdFx0XHRcdFx0dXNlQ2FjaGUgPSAheG1sICYmICFvZlR5cGUsXG5cdFx0XHRcdFx0XHRkaWZmID0gZmFsc2U7XG5cblx0XHRcdFx0XHRpZiAoIHBhcmVudCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHRcdFx0aWYgKCBzaW1wbGUgKSB7XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggZGlyICkge1xuXHRcdFx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtO1xuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG9mVHlwZSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbylcblx0XHRcdFx0XHRcdFx0XHRzdGFydCA9IGRpciA9IHR5cGUgPT09IFwib25seVwiICYmICFzdGFydCAmJiBcIm5leHRTaWJsaW5nXCI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHN0YXJ0ID0gWyBmb3J3YXJkID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBwYXJlbnQubGFzdENoaWxkIF07XG5cblx0XHRcdFx0XHRcdC8vIG5vbi14bWwgOm50aC1jaGlsZCguLi4pIHN0b3JlcyBjYWNoZSBkYXRhIG9uIGBwYXJlbnRgXG5cdFx0XHRcdFx0XHRpZiAoIGZvcndhcmQgJiYgdXNlQ2FjaGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU2VlayBgZWxlbWAgZnJvbSBhIHByZXZpb3VzbHktY2FjaGVkIGluZGV4XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uaW4gYSBnemlwLWZyaWVuZGx5IHdheVxuXHRcdFx0XHRcdFx0XHRub2RlID0gcGFyZW50O1xuXHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdGNhY2hlID0gdW5pcXVlQ2FjaGVbIHR5cGUgXSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdO1xuXHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4ICYmIGNhY2hlWyAyIF07XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBub2RlSW5kZXggJiYgcGFyZW50LmNoaWxkTm9kZXNbIG5vZGVJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBub2RlSW5kZXgsIGRpZmYgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBVc2UgcHJldmlvdXNseS1jYWNoZWQgZWxlbWVudCBpbmRleCBpZiBhdmFpbGFibGVcblx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHQvLyAuLi5pbiBhIGd6aXAtZnJpZW5kbHkgd2F5XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0Y2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRcdG5vZGVJbmRleCA9IGNhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbIDEgXTtcblx0XHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4O1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8geG1sIDpudGgtY2hpbGQoLi4uKVxuXHRcdFx0XHRcdFx0XHQvLyBvciA6bnRoLWxhc3QtY2hpbGQoLi4uKSBvciA6bnRoKC1sYXN0KT8tb2YtdHlwZSguLi4pXG5cdFx0XHRcdFx0XHRcdGlmICggZGlmZiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVXNlIHRoZSBzYW1lIGxvb3AgYXMgYWJvdmUgdG8gc2VlayBgZWxlbWAgZnJvbSB0aGUgc3RhcnRcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoIChub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KGRpZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICggKCBvZlR5cGUgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVUeXBlID09PSAxICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0KytkaWZmICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIENhY2hlIHRoZSBpbmRleCBvZiBlYWNoIGVuY291bnRlcmVkIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdChvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gSW5jb3Jwb3JhdGUgdGhlIG9mZnNldCwgdGhlbiBjaGVjayBhZ2FpbnN0IGN5Y2xlIHNpemVcblx0XHRcdFx0XHRcdGRpZmYgLT0gbGFzdDtcblx0XHRcdFx0XHRcdHJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIHBzZXVkbywgYXJndW1lbnQgKSB7XG5cdFx0XHQvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmVcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jcHNldWRvLWNsYXNzZXNcblx0XHRcdC8vIFByaW9yaXRpemUgYnkgY2FzZSBzZW5zaXRpdml0eSBpbiBjYXNlIGN1c3RvbSBwc2V1ZG9zIGFyZSBhZGRlZCB3aXRoIHVwcGVyY2FzZSBsZXR0ZXJzXG5cdFx0XHQvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zXG5cdFx0XHR2YXIgYXJncyxcblx0XHRcdFx0Zm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fFxuXHRcdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBwc2V1ZG86IFwiICsgcHNldWRvICk7XG5cblx0XHRcdC8vIFRoZSB1c2VyIG1heSB1c2UgY3JlYXRlUHNldWRvIHRvIGluZGljYXRlIHRoYXRcblx0XHRcdC8vIGFyZ3VtZW50cyBhcmUgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uXG5cdFx0XHQvLyBqdXN0IGFzIFNpenpsZSBkb2VzXG5cdFx0XHRpZiAoIGZuWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdHJldHVybiBmbiggYXJndW1lbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzXG5cdFx0XHRpZiAoIGZuLmxlbmd0aCA+IDEgKSB7XG5cdFx0XHRcdGFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCBcIlwiLCBhcmd1bWVudCBdO1xuXHRcdFx0XHRyZXR1cm4gRXhwci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KCBwc2V1ZG8udG9Mb3dlckNhc2UoKSApID9cblx0XHRcdFx0XHRtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7XG5cdFx0XHRcdFx0XHR2YXIgaWR4LFxuXHRcdFx0XHRcdFx0XHRtYXRjaGVkID0gZm4oIHNlZWQsIGFyZ3VtZW50ICksXG5cdFx0XHRcdFx0XHRcdGkgPSBtYXRjaGVkLmxlbmd0aDtcblx0XHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0XHRpZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkW2ldICk7XG5cdFx0XHRcdFx0XHRcdHNlZWRbIGlkeCBdID0gISggbWF0Y2hlc1sgaWR4IF0gPSBtYXRjaGVkW2ldICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSkgOlxuXHRcdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuKCBlbGVtLCAwLCBhcmdzICk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZuO1xuXHRcdH1cblx0fSxcblxuXHRwc2V1ZG9zOiB7XG5cdFx0Ly8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zXG5cdFx0XCJub3RcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRcdC8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlXG5cdFx0XHQvLyB0byBhdm9pZCB0cmVhdGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZ1xuXHRcdFx0Ly8gc3BhY2VzIGFzIGNvbWJpbmF0b3JzXG5cdFx0XHR2YXIgaW5wdXQgPSBbXSxcblx0XHRcdFx0cmVzdWx0cyA9IFtdLFxuXHRcdFx0XHRtYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApICk7XG5cblx0XHRcdHJldHVybiBtYXRjaGVyWyBleHBhbmRvIF0gP1xuXHRcdFx0XHRtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMsIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0XHRcdHVubWF0Y2hlZCA9IG1hdGNoZXIoIHNlZWQsIG51bGwsIHhtbCwgW10gKSxcblx0XHRcdFx0XHRcdGkgPSBzZWVkLmxlbmd0aDtcblxuXHRcdFx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIHVubWF0Y2hlZCBieSBgbWF0Y2hlcmBcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0XHRcdFx0XHRzZWVkW2ldID0gIShtYXRjaGVzW2ldID0gZWxlbSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSA6XG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0aW5wdXRbMF0gPSBlbGVtO1xuXHRcdFx0XHRcdG1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTtcblx0XHRcdFx0XHQvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0XHRcdGlucHV0WzBdID0gbnVsbDtcblx0XHRcdFx0XHRyZXR1cm4gIXJlc3VsdHMucG9wKCk7XG5cdFx0XHRcdH07XG5cdFx0fSksXG5cblx0XHRcImhhc1wiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gU2l6emxlKCBzZWxlY3RvciwgZWxlbSApLmxlbmd0aCA+IDA7XG5cdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0XCJjb250YWluc1wiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHR0ZXh0ID0gdGV4dC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJUZXh0IHx8IGdldFRleHQoIGVsZW0gKSApLmluZGV4T2YoIHRleHQgKSA+IC0xO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdC8vIFwiV2hldGhlciBhbiBlbGVtZW50IGlzIHJlcHJlc2VudGVkIGJ5IGEgOmxhbmcoKSBzZWxlY3RvclxuXHRcdC8vIGlzIGJhc2VkIHNvbGVseSBvbiB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlXG5cdFx0Ly8gYmVpbmcgZXF1YWwgdG8gdGhlIGlkZW50aWZpZXIgQyxcblx0XHQvLyBvciBiZWdpbm5pbmcgd2l0aCB0aGUgaWRlbnRpZmllciBDIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IFwiLVwiLlxuXHRcdC8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuXHRcdC8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuXCJcblx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2xhbmctcHNldWRvXG5cdFx0XCJsYW5nXCI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7XG5cdFx0XHQvLyBsYW5nIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyXG5cdFx0XHRpZiAoICFyaWRlbnRpZmllci50ZXN0KGxhbmcgfHwgXCJcIikgKSB7XG5cdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBsYW5nOiBcIiArIGxhbmcgKTtcblx0XHRcdH1cblx0XHRcdGxhbmcgPSBsYW5nLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIGVsZW1MYW5nO1xuXHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0aWYgKCAoZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRcdFx0XHRlbGVtLmxhbmcgOlxuXHRcdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoXCJ4bWw6bGFuZ1wiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImxhbmdcIikpICkge1xuXG5cdFx0XHRcdFx0XHRlbGVtTGFuZyA9IGVsZW1MYW5nLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArIFwiLVwiICkgPT09IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IHdoaWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdC8vIE1pc2NlbGxhbmVvdXNcblx0XHRcInRhcmdldFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBoYXNoID0gd2luZG93LmxvY2F0aW9uICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoO1xuXHRcdFx0cmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkO1xuXHRcdH0sXG5cblx0XHRcInJvb3RcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jRWxlbTtcblx0XHR9LFxuXG5cdFx0XCJmb2N1c1wiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmICghZG9jdW1lbnQuaGFzRm9jdXMgfHwgZG9jdW1lbnQuaGFzRm9jdXMoKSkgJiYgISEoZWxlbS50eXBlIHx8IGVsZW0uaHJlZiB8fCB+ZWxlbS50YWJJbmRleCk7XG5cdFx0fSxcblxuXHRcdC8vIEJvb2xlYW4gcHJvcGVydGllc1xuXHRcdFwiZW5hYmxlZFwiOiBjcmVhdGVEaXNhYmxlZFBzZXVkbyggZmFsc2UgKSxcblx0XHRcImRpc2FibGVkXCI6IGNyZWF0ZURpc2FibGVkUHNldWRvKCB0cnVlICksXG5cblx0XHRcImNoZWNrZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHQvLyBJbiBDU1MzLCA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIGJvdGggY2hlY2tlZCBhbmQgc2VsZWN0ZWQgZWxlbWVudHNcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkXG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gKG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgISFlbGVtLmNoZWNrZWQpIHx8IChub2RlTmFtZSA9PT0gXCJvcHRpb25cIiAmJiAhIWVsZW0uc2VsZWN0ZWQpO1xuXHRcdH0sXG5cblx0XHRcInNlbGVjdGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdFxuXHRcdFx0Ly8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseVxuXHRcdFx0aWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0Ly8gQ29udGVudHNcblx0XHRcImVtcHR5XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG9cblx0XHRcdC8vIDplbXB0eSBpcyBuZWdhdGVkIGJ5IGVsZW1lbnQgKDEpIG9yIGNvbnRlbnQgbm9kZXMgKHRleHQ6IDM7IGNkYXRhOiA0OyBlbnRpdHkgcmVmOiA1KSxcblx0XHRcdC8vICAgYnV0IG5vdCBieSBvdGhlcnMgKGNvbW1lbnQ6IDg7IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb246IDc7IGV0Yy4pXG5cdFx0XHQvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuXG5cdFx0XHRmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHtcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHRcInBhcmVudFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAhRXhwci5wc2V1ZG9zW1wiZW1wdHlcIl0oIGVsZW0gKTtcblx0XHR9LFxuXG5cdFx0Ly8gRWxlbWVudC9pbnB1dCB0eXBlc1xuXHRcdFwiaGVhZGVyXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImlucHV0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImJ1dHRvblwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IFwiYnV0dG9uXCIgfHwgbmFtZSA9PT0gXCJidXR0b25cIjtcblx0XHR9LFxuXG5cdFx0XCJ0ZXh0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGF0dHI7XG5cdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgJiZcblx0XHRcdFx0ZWxlbS50eXBlID09PSBcInRleHRcIiAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFPDhcblx0XHRcdFx0Ly8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sIFwic2VhcmNoXCIpIGFwcGVhciB3aXRoIGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCJcblx0XHRcdFx0KCAoYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSkgPT0gbnVsbCB8fCBhdHRyLnRvTG93ZXJDYXNlKCkgPT09IFwidGV4dFwiICk7XG5cdFx0fSxcblxuXHRcdC8vIFBvc2l0aW9uLWluLWNvbGxlY3Rpb25cblx0XHRcImZpcnN0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gWyAwIF07XG5cdFx0fSksXG5cblx0XHRcImxhc3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gWyBsZW5ndGggLSAxIF07XG5cdFx0fSksXG5cblx0XHRcImVxXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHJldHVybiBbIGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTtcblx0XHR9KSxcblxuXHRcdFwiZXZlblwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwib2RkXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0dmFyIGkgPSAxO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJsdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7IC0taSA+PSAwOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcImd0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudDtcblx0XHRcdGZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSlcblx0fVxufTtcblxuRXhwci5wc2V1ZG9zW1wibnRoXCJdID0gRXhwci5wc2V1ZG9zW1wiZXFcIl07XG5cbi8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zXG5mb3IgKCBpIGluIHsgcmFkaW86IHRydWUsIGNoZWNrYm94OiB0cnVlLCBmaWxlOiB0cnVlLCBwYXNzd29yZDogdHJ1ZSwgaW1hZ2U6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApO1xufVxuZm9yICggaSBpbiB7IHN1Ym1pdDogdHJ1ZSwgcmVzZXQ6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVCdXR0b25Qc2V1ZG8oIGkgKTtcbn1cblxuLy8gRWFzeSBBUEkgZm9yIGNyZWF0aW5nIG5ldyBzZXRGaWx0ZXJzXG5mdW5jdGlvbiBzZXRGaWx0ZXJzKCkge31cbnNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zO1xuRXhwci5zZXRGaWx0ZXJzID0gbmV3IHNldEZpbHRlcnMoKTtcblxudG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHtcblx0dmFyIG1hdGNoZWQsIG1hdGNoLCB0b2tlbnMsIHR5cGUsXG5cdFx0c29GYXIsIGdyb3VwcywgcHJlRmlsdGVycyxcblx0XHRjYWNoZWQgPSB0b2tlbkNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF07XG5cblx0aWYgKCBjYWNoZWQgKSB7XG5cdFx0cmV0dXJuIHBhcnNlT25seSA/IDAgOiBjYWNoZWQuc2xpY2UoIDAgKTtcblx0fVxuXG5cdHNvRmFyID0gc2VsZWN0b3I7XG5cdGdyb3VwcyA9IFtdO1xuXHRwcmVGaWx0ZXJzID0gRXhwci5wcmVGaWx0ZXI7XG5cblx0d2hpbGUgKCBzb0ZhciApIHtcblxuXHRcdC8vIENvbW1hIGFuZCBmaXJzdCBydW5cblx0XHRpZiAoICFtYXRjaGVkIHx8IChtYXRjaCA9IHJjb21tYS5leGVjKCBzb0ZhciApKSApIHtcblx0XHRcdGlmICggbWF0Y2ggKSB7XG5cdFx0XHRcdC8vIERvbid0IGNvbnN1bWUgdHJhaWxpbmcgY29tbWFzIGFzIHZhbGlkXG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWzBdLmxlbmd0aCApIHx8IHNvRmFyO1xuXHRcdFx0fVxuXHRcdFx0Z3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTtcblx0XHR9XG5cblx0XHRtYXRjaGVkID0gZmFsc2U7XG5cblx0XHQvLyBDb21iaW5hdG9yc1xuXHRcdGlmICggKG1hdGNoID0gcmNvbWJpbmF0b3JzLmV4ZWMoIHNvRmFyICkpICkge1xuXHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXHRcdFx0XHQvLyBDYXN0IGRlc2NlbmRhbnQgY29tYmluYXRvcnMgdG8gc3BhY2Vcblx0XHRcdFx0dHlwZTogbWF0Y2hbMF0ucmVwbGFjZSggcnRyaW0sIFwiIFwiIClcblx0XHRcdH0pO1xuXHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGaWx0ZXJzXG5cdFx0Zm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHtcblx0XHRcdGlmICggKG1hdGNoID0gbWF0Y2hFeHByWyB0eXBlIF0uZXhlYyggc29GYXIgKSkgJiYgKCFwcmVGaWx0ZXJzWyB0eXBlIF0gfHxcblx0XHRcdFx0KG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7XG5cdFx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdFx0dmFsdWU6IG1hdGNoZWQsXG5cdFx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0XHRtYXRjaGVzOiBtYXRjaFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoICFtYXRjaGVkICkge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGludmFsaWQgZXhjZXNzXG5cdC8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZ1xuXHQvLyBPdGhlcndpc2UsIHRocm93IGFuIGVycm9yIG9yIHJldHVybiB0b2tlbnNcblx0cmV0dXJuIHBhcnNlT25seSA/XG5cdFx0c29GYXIubGVuZ3RoIDpcblx0XHRzb0ZhciA/XG5cdFx0XHRTaXp6bGUuZXJyb3IoIHNlbGVjdG9yICkgOlxuXHRcdFx0Ly8gQ2FjaGUgdGhlIHRva2Vuc1xuXHRcdFx0dG9rZW5DYWNoZSggc2VsZWN0b3IsIGdyb3VwcyApLnNsaWNlKCAwICk7XG59O1xuXG5mdW5jdGlvbiB0b1NlbGVjdG9yKCB0b2tlbnMgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdHNlbGVjdG9yID0gXCJcIjtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0c2VsZWN0b3IgKz0gdG9rZW5zW2ldLnZhbHVlO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rvcjtcbn1cblxuZnVuY3Rpb24gYWRkQ29tYmluYXRvciggbWF0Y2hlciwgY29tYmluYXRvciwgYmFzZSApIHtcblx0dmFyIGRpciA9IGNvbWJpbmF0b3IuZGlyLFxuXHRcdHNraXAgPSBjb21iaW5hdG9yLm5leHQsXG5cdFx0a2V5ID0gc2tpcCB8fCBkaXIsXG5cdFx0Y2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYga2V5ID09PSBcInBhcmVudE5vZGVcIixcblx0XHRkb25lTmFtZSA9IGRvbmUrKztcblxuXHRyZXR1cm4gY29tYmluYXRvci5maXJzdCA/XG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdHJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gOlxuXG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBhbGwgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRzXG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsXG5cdFx0XHRcdG5ld0NhY2hlID0gWyBkaXJydW5zLCBkb25lTmFtZSBdO1xuXG5cdFx0XHQvLyBXZSBjYW4ndCBzZXQgYXJiaXRyYXJ5IGRhdGEgb24gWE1MIG5vZGVzLCBzbyB0aGV5IGRvbid0IGJlbmVmaXQgZnJvbSBjb21iaW5hdG9yIGNhY2hpbmdcblx0XHRcdGlmICggeG1sICkge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdGlmICggc2tpcCAmJiBza2lwID09PSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgKSB7XG5cdFx0XHRcdFx0XHRcdGVsZW0gPSBlbGVtWyBkaXIgXSB8fCBlbGVtO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggKG9sZENhY2hlID0gdW5pcXVlQ2FjaGVbIGtleSBdKSAmJlxuXHRcdFx0XHRcdFx0XHRvbGRDYWNoZVsgMCBdID09PSBkaXJydW5zICYmIG9sZENhY2hlWyAxIF0gPT09IGRvbmVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFzc2lnbiB0byBuZXdDYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdHJldHVybiAobmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsga2V5IF0gPSBuZXdDYWNoZTtcblxuXHRcdFx0XHRcdFx0XHQvLyBBIG1hdGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFpbCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tpbmdcblx0XHRcdFx0XHRcdFx0aWYgKCAobmV3Q2FjaGVbIDIgXSA9IG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG59XG5cbmZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApIHtcblx0cmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgP1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoICFtYXRjaGVyc1tpXSggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IDpcblx0XHRtYXRjaGVyc1swXTtcbn1cblxuZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gY29udGV4dHMubGVuZ3RoO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0c1tpXSwgcmVzdWx0cyApO1xuXHR9XG5cdHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkge1xuXHR2YXIgZWxlbSxcblx0XHRuZXdVbm1hdGNoZWQgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsZW4gPSB1bm1hdGNoZWQubGVuZ3RoLFxuXHRcdG1hcHBlZCA9IG1hcCAhPSBudWxsO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0aWYgKCAhZmlsdGVyIHx8IGZpbHRlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdG5ld1VubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdGlmICggbWFwcGVkICkge1xuXHRcdFx0XHRcdG1hcC5wdXNoKCBpICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbmV3VW5tYXRjaGVkO1xufVxuXG5mdW5jdGlvbiBzZXRNYXRjaGVyKCBwcmVGaWx0ZXIsIHNlbGVjdG9yLCBtYXRjaGVyLCBwb3N0RmlsdGVyLCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKSB7XG5cdGlmICggcG9zdEZpbHRlciAmJiAhcG9zdEZpbHRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaWx0ZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmlsdGVyICk7XG5cdH1cblx0aWYgKCBwb3N0RmluZGVyICYmICFwb3N0RmluZGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0cG9zdEZpbmRlciA9IHNldE1hdGNoZXIoIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApO1xuXHR9XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHtcblx0XHR2YXIgdGVtcCwgaSwgZWxlbSxcblx0XHRcdHByZU1hcCA9IFtdLFxuXHRcdFx0cG9zdE1hcCA9IFtdLFxuXHRcdFx0cHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCxcblxuXHRcdFx0Ly8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBzZWVkIG9yIGNvbnRleHRcblx0XHRcdGVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCBcIipcIiwgY29udGV4dC5ub2RlVHlwZSA/IFsgY29udGV4dCBdIDogY29udGV4dCwgW10gKSxcblxuXHRcdFx0Ly8gUHJlZmlsdGVyIHRvIGdldCBtYXRjaGVyIGlucHV0LCBwcmVzZXJ2aW5nIGEgbWFwIGZvciBzZWVkLXJlc3VsdHMgc3luY2hyb25pemF0aW9uXG5cdFx0XHRtYXRjaGVySW4gPSBwcmVGaWx0ZXIgJiYgKCBzZWVkIHx8ICFzZWxlY3RvciApID9cblx0XHRcdFx0Y29uZGVuc2UoIGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRlbGVtcyxcblxuXHRcdFx0bWF0Y2hlck91dCA9IG1hdGNoZXIgP1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGEgcG9zdEZpbmRlciwgb3IgZmlsdGVyZWQgc2VlZCwgb3Igbm9uLXNlZWQgcG9zdEZpbHRlciBvciBwcmVleGlzdGluZyByZXN1bHRzLFxuXHRcdFx0XHRwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/XG5cblx0XHRcdFx0XHQvLyAuLi5pbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBpcyBuZWNlc3Nhcnlcblx0XHRcdFx0XHRbXSA6XG5cblx0XHRcdFx0XHQvLyAuLi5vdGhlcndpc2UgdXNlIHJlc3VsdHMgZGlyZWN0bHlcblx0XHRcdFx0XHRyZXN1bHRzIDpcblx0XHRcdFx0bWF0Y2hlckluO1xuXG5cdFx0Ly8gRmluZCBwcmltYXJ5IG1hdGNoZXNcblx0XHRpZiAoIG1hdGNoZXIgKSB7XG5cdFx0XHRtYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHBvc3RGaWx0ZXJcblx0XHRpZiAoIHBvc3RGaWx0ZXIgKSB7XG5cdFx0XHR0ZW1wID0gY29uZGVuc2UoIG1hdGNoZXJPdXQsIHBvc3RNYXAgKTtcblx0XHRcdHBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTtcblxuXHRcdFx0Ly8gVW4tbWF0Y2ggZmFpbGluZyBlbGVtZW50cyBieSBtb3ZpbmcgdGhlbSBiYWNrIHRvIG1hdGNoZXJJblxuXHRcdFx0aSA9IHRlbXAubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkge1xuXHRcdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cdFx0XHRcdFx0Ly8gR2V0IHRoZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNvbmRlbnNpbmcgdGhpcyBpbnRlcm1lZGlhdGUgaW50byBwb3N0RmluZGVyIGNvbnRleHRzXG5cdFx0XHRcdFx0dGVtcCA9IFtdO1xuXHRcdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSApIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmVzdG9yZSBtYXRjaGVySW4gc2luY2UgZWxlbSBpcyBub3QgeWV0IGEgZmluYWwgbWF0Y2hcblx0XHRcdFx0XHRcdFx0dGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgKG1hdGNoZXJPdXQgPSBbXSksIHRlbXAsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWRcblx0XHRcdFx0aSA9IG1hdGNoZXJPdXQubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgJiZcblx0XHRcdFx0XHRcdCh0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFtpXSkgPiAtMSApIHtcblxuXHRcdFx0XHRcdFx0c2VlZFt0ZW1wXSA9ICEocmVzdWx0c1t0ZW1wXSA9IGVsZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gQWRkIGVsZW1lbnRzIHRvIHJlc3VsdHMsIHRocm91Z2ggcG9zdEZpbmRlciBpZiBkZWZpbmVkXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXJPdXQgPSBjb25kZW5zZShcblx0XHRcdFx0bWF0Y2hlck91dCA9PT0gcmVzdWx0cyA/XG5cdFx0XHRcdFx0bWF0Y2hlck91dC5zcGxpY2UoIHByZWV4aXN0aW5nLCBtYXRjaGVyT3V0Lmxlbmd0aCApIDpcblx0XHRcdFx0XHRtYXRjaGVyT3V0XG5cdFx0XHQpO1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkge1xuXHR2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0bGVhZGluZ1JlbGF0aXZlID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzBdLnR5cGUgXSxcblx0XHRpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbXCIgXCJdLFxuXHRcdGkgPSBsZWFkaW5nUmVsYXRpdmUgPyAxIDogMCxcblxuXHRcdC8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpXG5cdFx0bWF0Y2hDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0O1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBpbmRleE9mKCBjaGVja0NvbnRleHQsIGVsZW0gKSA+IC0xO1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaGVycyA9IFsgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciByZXQgPSAoICFsZWFkaW5nUmVsYXRpdmUgJiYgKCB4bWwgfHwgY29udGV4dCAhPT0gb3V0ZXJtb3N0Q29udGV4dCApICkgfHwgKFxuXHRcdFx0XHQoY2hlY2tDb250ZXh0ID0gY29udGV4dCkubm9kZVR5cGUgP1xuXHRcdFx0XHRcdG1hdGNoQ29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRcdG1hdGNoQW55Q29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgKTtcblx0XHRcdC8vIEF2b2lkIGhhbmdpbmcgb250byBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0Y2hlY2tDb250ZXh0ID0gbnVsbDtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fSBdO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKG1hdGNoZXIgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbaV0udHlwZSBdKSApIHtcblx0XHRcdG1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9yKGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLCBtYXRjaGVyKSBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7XG5cblx0XHRcdC8vIFJldHVybiBzcGVjaWFsIHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyXG5cdFx0XHRpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0Ly8gRmluZCB0aGUgbmV4dCByZWxhdGl2ZSBvcGVyYXRvciAoaWYgYW55KSBmb3IgcHJvcGVyIGhhbmRsaW5nXG5cdFx0XHRcdGogPSArK2k7XG5cdFx0XHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gc2V0TWF0Y2hlcihcblx0XHRcdFx0XHRpID4gMSAmJiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSxcblx0XHRcdFx0XHRpID4gMSAmJiB0b1NlbGVjdG9yKFxuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmBcblx0XHRcdFx0XHRcdHRva2Vucy5zbGljZSggMCwgaSAtIDEgKS5jb25jYXQoeyB2YWx1ZTogdG9rZW5zWyBpIC0gMiBdLnR5cGUgPT09IFwiIFwiID8gXCIqXCIgOiBcIlwiIH0pXG5cdFx0XHRcdFx0KS5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksXG5cdFx0XHRcdFx0bWF0Y2hlcixcblx0XHRcdFx0XHRpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlcnMucHVzaCggbWF0Y2hlciApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkge1xuXHR2YXIgYnlTZXQgPSBzZXRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdGJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdHN1cGVyTWF0Y2hlciA9IGZ1bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIG91dGVybW9zdCApIHtcblx0XHRcdHZhciBlbGVtLCBqLCBtYXRjaGVyLFxuXHRcdFx0XHRtYXRjaGVkQ291bnQgPSAwLFxuXHRcdFx0XHRpID0gXCIwXCIsXG5cdFx0XHRcdHVubWF0Y2hlZCA9IHNlZWQgJiYgW10sXG5cdFx0XHRcdHNldE1hdGNoZWQgPSBbXSxcblx0XHRcdFx0Y29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsXG5cdFx0XHRcdC8vIFdlIG11c3QgYWx3YXlzIGhhdmUgZWl0aGVyIHNlZWQgZWxlbWVudHMgb3Igb3V0ZXJtb3N0IGNvbnRleHRcblx0XHRcdFx0ZWxlbXMgPSBzZWVkIHx8IGJ5RWxlbWVudCAmJiBFeHByLmZpbmRbXCJUQUdcIl0oIFwiKlwiLCBvdXRlcm1vc3QgKSxcblx0XHRcdFx0Ly8gVXNlIGludGVnZXIgZGlycnVucyBpZmYgdGhpcyBpcyB0aGUgb3V0ZXJtb3N0IG1hdGNoZXJcblx0XHRcdFx0ZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksXG5cdFx0XHRcdGxlbiA9IGVsZW1zLmxlbmd0aDtcblxuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHNcblx0XHRcdC8vIFN1cHBvcnQ6IElFPDksIFNhZmFyaVxuXHRcdFx0Ly8gVG9sZXJhdGUgTm9kZUxpc3QgcHJvcGVydGllcyAoSUU6IFwibGVuZ3RoXCI7IFNhZmFyaTogPG51bWJlcj4pIG1hdGNoaW5nIGVsZW1lbnRzIGJ5IGlkXG5cdFx0XHRmb3IgKCA7IGkgIT09IGxlbiAmJiAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggYnlFbGVtZW50ICYmIGVsZW0gKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0aWYgKCAhY29udGV4dCAmJiBlbGVtLm93bmVyRG9jdW1lbnQgIT09IGRvY3VtZW50ICkge1xuXHRcdFx0XHRcdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0XHRcdFx0XHRcdHhtbCA9ICFkb2N1bWVudElzSFRNTDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0d2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCB8fCBkb2N1bWVudCwgeG1sKSApIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnNcblx0XHRcdFx0aWYgKCBieVNldCApIHtcblx0XHRcdFx0XHQvLyBUaGV5IHdpbGwgaGF2ZSBnb25lIHRocm91Z2ggYWxsIHBvc3NpYmxlIG1hdGNoZXJzXG5cdFx0XHRcdFx0aWYgKCAoZWxlbSA9ICFtYXRjaGVyICYmIGVsZW0pICkge1xuXHRcdFx0XHRcdFx0bWF0Y2hlZENvdW50LS07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTGVuZ3RoZW4gdGhlIGFycmF5IGZvciBldmVyeSBlbGVtZW50LCBtYXRjaGVkIG9yIG5vdFxuXHRcdFx0XHRcdGlmICggc2VlZCApIHtcblx0XHRcdFx0XHRcdHVubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGBpYCBpcyBub3cgdGhlIGNvdW50IG9mIGVsZW1lbnRzIHZpc2l0ZWQgYWJvdmUsIGFuZCBhZGRpbmcgaXQgdG8gYG1hdGNoZWRDb3VudGBcblx0XHRcdC8vIG1ha2VzIHRoZSBsYXR0ZXIgbm9ubmVnYXRpdmUuXG5cdFx0XHRtYXRjaGVkQ291bnQgKz0gaTtcblxuXHRcdFx0Ly8gQXBwbHkgc2V0IGZpbHRlcnMgdG8gdW5tYXRjaGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBlcXVhbHMgYGlgKSwgdW5sZXNzIHdlIGRpZG4ndCB2aXNpdCBfYW55XyBlbGVtZW50cyBpbiB0aGUgYWJvdmUgbG9vcCBiZWNhdXNlIHdlIGhhdmVcblx0XHRcdC8vIG5vIGVsZW1lbnQgbWF0Y2hlcnMgYW5kIG5vIHNlZWQuXG5cdFx0XHQvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyBcIjBcIiBgaWAgYWxsb3dzIGBpYCB0byByZW1haW4gYSBzdHJpbmcgb25seSBpbiB0aGF0XG5cdFx0XHQvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIFwiMDBcIiBgbWF0Y2hlZENvdW50YCB0aGF0IGRpZmZlcnMgZnJvbSBgaWAgYnV0IGlzIGFsc29cblx0XHRcdC8vIG51bWVyaWNhbGx5IHplcm8uXG5cdFx0XHRpZiAoIGJ5U2V0ICYmIGkgIT09IG1hdGNoZWRDb3VudCApIHtcblx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdHdoaWxlICggKG1hdGNoZXIgPSBzZXRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyKCB1bm1hdGNoZWQsIHNldE1hdGNoZWQsIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0XHRcdC8vIFJlaW50ZWdyYXRlIGVsZW1lbnQgbWF0Y2hlcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHNvcnRpbmdcblx0XHRcdFx0XHRpZiAoIG1hdGNoZWRDb3VudCA+IDAgKSB7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCAhKHVubWF0Y2hlZFtpXSB8fCBzZXRNYXRjaGVkW2ldKSApIHtcblx0XHRcdFx0XHRcdFx0XHRzZXRNYXRjaGVkW2ldID0gcG9wLmNhbGwoIHJlc3VsdHMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzXG5cdFx0XHRcdFx0c2V0TWF0Y2hlZCA9IGNvbmRlbnNlKCBzZXRNYXRjaGVkICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzXG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTtcblxuXHRcdFx0XHQvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmdcblx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0KCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7XG5cblx0XHRcdFx0XHRTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVyc1xuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJhY2t1cDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVubWF0Y2hlZDtcblx0XHR9O1xuXG5cdHJldHVybiBieVNldCA/XG5cdFx0bWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIgKSA6XG5cdFx0c3VwZXJNYXRjaGVyO1xufVxuXG5jb21waWxlID0gU2l6emxlLmNvbXBpbGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIG1hdGNoIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkge1xuXHR2YXIgaSxcblx0XHRzZXRNYXRjaGVycyA9IFtdLFxuXHRcdGVsZW1lbnRNYXRjaGVycyA9IFtdLFxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoICFjYWNoZWQgKSB7XG5cdFx0Ly8gR2VuZXJhdGUgYSBmdW5jdGlvbiBvZiByZWN1cnNpdmUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZWFjaCBlbGVtZW50XG5cdFx0aWYgKCAhbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdH1cblx0XHRpID0gbWF0Y2gubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0Y2FjaGVkID0gbWF0Y2hlckZyb21Ub2tlbnMoIG1hdGNoW2ldICk7XG5cdFx0XHRpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRzZXRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1lbnRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb25cblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTtcblxuXHRcdC8vIFNhdmUgc2VsZWN0b3IgYW5kIHRva2VuaXphdGlvblxuXHRcdGNhY2hlZC5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHR9XG5cdHJldHVybiBjYWNoZWQ7XG59O1xuXG4vKipcbiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzZWxlY3RvciBBIHNlbGVjdG9yIG9yIGEgcHJlLWNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZVxuICogQHBhcmFtIHtFbGVtZW50fSBjb250ZXh0XG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0c11cbiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0XG4gKi9cbnNlbGVjdCA9IFNpenpsZS5zZWxlY3QgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLFxuXHRcdGNvbXBpbGVkID0gdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgc2VsZWN0b3IsXG5cdFx0bWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7XG5cblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cblx0Ly8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWRcblx0Ly8gKHRoZSBsYXR0ZXIgb2Ygd2hpY2ggZ3VhcmFudGVlcyB1cyBjb250ZXh0KVxuXHRpZiAoIG1hdGNoLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdC8vIFJlZHVjZSBjb250ZXh0IGlmIHRoZSBsZWFkaW5nIGNvbXBvdW5kIHNlbGVjdG9yIGlzIGFuIElEXG5cdFx0dG9rZW5zID0gbWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCApO1xuXHRcdGlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKHRva2VuID0gdG9rZW5zWzBdKS50eXBlID09PSBcIklEXCIgJiZcblx0XHRcdFx0Y29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJiBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkge1xuXG5cdFx0XHRjb250ZXh0ID0gKCBFeHByLmZpbmRbXCJJRFwiXSggdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKHJ1bmVzY2FwZSwgZnVuZXNjYXBlKSwgY29udGV4dCApIHx8IFtdIClbMF07XG5cdFx0XHRpZiAoICFjb250ZXh0ICkge1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdFx0Ly8gUHJlY29tcGlsZWQgbWF0Y2hlcnMgd2lsbCBzdGlsbCB2ZXJpZnkgYW5jZXN0cnksIHNvIHN0ZXAgdXAgYSBsZXZlbFxuXHRcdFx0fSBlbHNlIGlmICggY29tcGlsZWQgKSB7XG5cdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApO1xuXHRcdH1cblxuXHRcdC8vIEZldGNoIGEgc2VlZCBzZXQgZm9yIHJpZ2h0LXRvLWxlZnQgbWF0Y2hpbmdcblx0XHRpID0gbWF0Y2hFeHByW1wibmVlZHNDb250ZXh0XCJdLnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHRva2VuID0gdG9rZW5zW2ldO1xuXG5cdFx0XHQvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yXG5cdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbICh0eXBlID0gdG9rZW4udHlwZSkgXSApIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIChmaW5kID0gRXhwci5maW5kWyB0eXBlIF0pICkge1xuXHRcdFx0XHQvLyBTZWFyY2gsIGV4cGFuZGluZyBjb250ZXh0IGZvciBsZWFkaW5nIHNpYmxpbmcgY29tYmluYXRvcnNcblx0XHRcdFx0aWYgKCAoc2VlZCA9IGZpbmQoXG5cdFx0XHRcdFx0dG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLFxuXHRcdFx0XHRcdHJzaWJsaW5nLnRlc3QoIHRva2Vuc1swXS50eXBlICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHRcblx0XHRcdFx0KSkgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHlcblx0XHRcdFx0XHR0b2tlbnMuc3BsaWNlKCBpLCAxICk7XG5cdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTtcblx0XHRcdFx0XHRpZiAoICFzZWxlY3RvciApIHtcblx0XHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNlZWQgKTtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ29tcGlsZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmluZyBmdW5jdGlvbiBpZiBvbmUgaXMgbm90IHByb3ZpZGVkXG5cdC8vIFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXphdGlvbiBpZiB3ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmVcblx0KCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKFxuXHRcdHNlZWQsXG5cdFx0Y29udGV4dCxcblx0XHQhZG9jdW1lbnRJc0hUTUwsXG5cdFx0cmVzdWx0cyxcblx0XHQhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdCk7XG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuLy8gT25lLXRpbWUgYXNzaWdubWVudHNcblxuLy8gU29ydCBzdGFiaWxpdHlcbnN1cHBvcnQuc29ydFN0YWJsZSA9IGV4cGFuZG8uc3BsaXQoXCJcIikuc29ydCggc29ydE9yZGVyICkuam9pbihcIlwiKSA9PT0gZXhwYW5kbztcblxuLy8gU3VwcG9ydDogQ2hyb21lIDE0LTM1K1xuLy8gQWx3YXlzIGFzc3VtZSBkdXBsaWNhdGVzIGlmIHRoZXkgYXJlbid0IHBhc3NlZCB0byB0aGUgY29tcGFyaXNvbiBmdW5jdGlvblxuc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gISFoYXNEdXBsaWNhdGU7XG5cbi8vIEluaXRpYWxpemUgYWdhaW5zdCB0aGUgZGVmYXVsdCBkb2N1bWVudFxuc2V0RG9jdW1lbnQoKTtcblxuLy8gU3VwcG9ydDogV2Via2l0PDUzNy4zMiAtIFNhZmFyaSA2LjAuMy9DaHJvbWUgMjUgKGZpeGVkIGluIENocm9tZSAyNylcbi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKlxuc3VwcG9ydC5zb3J0RGV0YWNoZWQgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHQvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZylcblx0cmV0dXJuIGVsLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZmllbGRzZXRcIikgKSAmIDE7XG59KTtcblxuLy8gU3VwcG9ydDogSUU8OFxuLy8gUHJldmVudCBhdHRyaWJ1dGUvcHJvcGVydHkgXCJpbnRlcnBvbGF0aW9uXCJcbi8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzY0MjklMjhWUy44NSUyOS5hc3B4XG5pZiAoICFhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRlbC5pbm5lckhUTUwgPSBcIjxhIGhyZWY9JyMnPjwvYT5cIjtcblx0cmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT0gXCIjXCIgO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggXCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInR5cGVcIiA/IDEgOiAyICk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8gU3VwcG9ydDogSUU8OVxuLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRlbC5pbm5lckhUTUwgPSBcIjxpbnB1dC8+XCI7XG5cdGVsLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCBcInZhbHVlXCIsIFwiXCIgKTtcblx0cmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gXCJcIjtcbn0pICkge1xuXHRhZGRIYW5kbGUoIFwidmFsdWVcIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXNcbmlmICggIWFzc2VydChmdW5jdGlvbiggZWwgKSB7XG5cdHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA9PSBudWxsO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggYm9vbGVhbnMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgdmFsO1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6XG5cdFx0XHRcdFx0KHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xuXHRcdH1cblx0fSk7XG59XG5cbnJldHVybiBTaXp6bGU7XG5cbn0pKCB3aW5kb3cgKTtcblxuXG5cbmpRdWVyeS5maW5kID0gU2l6emxlO1xualF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzO1xuXG4vLyBEZXByZWNhdGVkXG5qUXVlcnkuZXhwclsgXCI6XCIgXSA9IGpRdWVyeS5leHByLnBzZXVkb3M7XG5qUXVlcnkudW5pcXVlU29ydCA9IGpRdWVyeS51bmlxdWUgPSBTaXp6bGUudW5pcXVlU29ydDtcbmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7XG5qUXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7XG5qUXVlcnkuY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnM7XG5qUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBTaXp6bGUuZXNjYXBlO1xuXG5cblxuXG52YXIgZGlyID0gZnVuY3Rpb24oIGVsZW0sIGRpciwgdW50aWwgKSB7XG5cdHZhciBtYXRjaGVkID0gW10sXG5cdFx0dHJ1bmNhdGUgPSB1bnRpbCAhPT0gdW5kZWZpbmVkO1xuXG5cdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSAmJiBlbGVtLm5vZGVUeXBlICE9PSA5ICkge1xuXHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdGlmICggdHJ1bmNhdGUgJiYgalF1ZXJ5KCBlbGVtICkuaXMoIHVudGlsICkgKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBtYXRjaGVkO1xufTtcblxuXG52YXIgc2libGluZ3MgPSBmdW5jdGlvbiggbiwgZWxlbSApIHtcblx0dmFyIG1hdGNoZWQgPSBbXTtcblxuXHRmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkge1xuXHRcdGlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkge1xuXHRcdFx0bWF0Y2hlZC5wdXNoKCBuICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG1hdGNoZWQ7XG59O1xuXG5cbnZhciBybmVlZHNDb250ZXh0ID0galF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O1xuXG52YXIgcnNpbmdsZVRhZyA9ICggL148KFthLXpdW15cXC9cXDA+OlxceDIwXFx0XFxyXFxuXFxmXSopW1xceDIwXFx0XFxyXFxuXFxmXSpcXC8/Pig/OjxcXC9cXDE+fCkkL2kgKTtcblxuXG5cbnZhciByaXNTaW1wbGUgPSAvXi5bXjojXFxbXFwuLF0qJC87XG5cbi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90XG5mdW5jdGlvbiB3aW5ub3coIGVsZW1lbnRzLCBxdWFsaWZpZXIsIG5vdCApIHtcblx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gISFxdWFsaWZpZXIuY2FsbCggZWxlbSwgaSwgZWxlbSApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gU2luZ2xlIGVsZW1lbnRcblx0aWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBlbGVtID09PSBxdWFsaWZpZXIgKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEFycmF5bGlrZSBvZiBlbGVtZW50cyAoalF1ZXJ5LCBhcmd1bWVudHMsIEFycmF5KVxuXHRpZiAoIHR5cGVvZiBxdWFsaWZpZXIgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBpbmRleE9mLmNhbGwoIHF1YWxpZmllciwgZWxlbSApID4gLTEgKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIFNpbXBsZSBzZWxlY3RvciB0aGF0IGNhbiBiZSBmaWx0ZXJlZCBkaXJlY3RseSwgcmVtb3Zpbmcgbm9uLUVsZW1lbnRzXG5cdGlmICggcmlzU2ltcGxlLnRlc3QoIHF1YWxpZmllciApICkge1xuXHRcdHJldHVybiBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGVsZW1lbnRzLCBub3QgKTtcblx0fVxuXG5cdC8vIENvbXBsZXggc2VsZWN0b3IsIGNvbXBhcmUgdGhlIHR3byBzZXRzLCByZW1vdmluZyBub24tRWxlbWVudHNcblx0cXVhbGlmaWVyID0galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cyApO1xuXHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gKCBpbmRleE9mLmNhbGwoIHF1YWxpZmllciwgZWxlbSApID4gLTEgKSAhPT0gbm90ICYmIGVsZW0ubm9kZVR5cGUgPT09IDE7XG5cdH0gKTtcbn1cblxualF1ZXJ5LmZpbHRlciA9IGZ1bmN0aW9uKCBleHByLCBlbGVtcywgbm90ICkge1xuXHR2YXIgZWxlbSA9IGVsZW1zWyAwIF07XG5cblx0aWYgKCBub3QgKSB7XG5cdFx0ZXhwciA9IFwiOm5vdChcIiArIGV4cHIgKyBcIilcIjtcblx0fVxuXG5cdGlmICggZWxlbXMubGVuZ3RoID09PSAxICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZWxlbSwgZXhwciApID8gWyBlbGVtIF0gOiBbXTtcblx0fVxuXG5cdHJldHVybiBqUXVlcnkuZmluZC5tYXRjaGVzKCBleHByLCBqUXVlcnkuZ3JlcCggZWxlbXMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxO1xuXHR9ICkgKTtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBpLCByZXQsXG5cdFx0XHRsZW4gPSB0aGlzLmxlbmd0aCxcblx0XHRcdHNlbGYgPSB0aGlzO1xuXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCBzZWxmWyBpIF0sIHRoaXMgKSApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSApICk7XG5cdFx0fVxuXG5cdFx0cmV0ID0gdGhpcy5wdXNoU3RhY2soIFtdICk7XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0alF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCBzZWxmWyBpIF0sIHJldCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBsZW4gPiAxID8galF1ZXJ5LnVuaXF1ZVNvcnQoIHJldCApIDogcmV0O1xuXHR9LFxuXHRmaWx0ZXI6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyggdGhpcywgc2VsZWN0b3IgfHwgW10sIGZhbHNlICkgKTtcblx0fSxcblx0bm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCB0cnVlICkgKTtcblx0fSxcblx0aXM6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gISF3aW5ub3coXG5cdFx0XHR0aGlzLFxuXG5cdFx0XHQvLyBJZiB0aGlzIGlzIGEgcG9zaXRpb25hbC9yZWxhdGl2ZSBzZWxlY3RvciwgY2hlY2sgbWVtYmVyc2hpcCBpbiB0aGUgcmV0dXJuZWQgc2V0XG5cdFx0XHQvLyBzbyAkKFwicDpmaXJzdFwiKS5pcyhcInA6bGFzdFwiKSB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gXCJwXCIuXG5cdFx0XHR0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgJiYgcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApID9cblx0XHRcdFx0alF1ZXJ5KCBzZWxlY3RvciApIDpcblx0XHRcdFx0c2VsZWN0b3IgfHwgW10sXG5cdFx0XHRmYWxzZVxuXHRcdCkubGVuZ3RoO1xuXHR9XG59ICk7XG5cblxuLy8gSW5pdGlhbGl6ZSBhIGpRdWVyeSBvYmplY3RcblxuXG4vLyBBIGNlbnRyYWwgcmVmZXJlbmNlIHRvIHRoZSByb290IGpRdWVyeShkb2N1bWVudClcbnZhciByb290alF1ZXJ5LFxuXG5cdC8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzXG5cdC8vIFByaW9yaXRpemUgI2lkIG92ZXIgPHRhZz4gdG8gYXZvaWQgWFNTIHZpYSBsb2NhdGlvbi5oYXNoICgjOTUyMSlcblx0Ly8gU3RyaWN0IEhUTUwgcmVjb2duaXRpb24gKCMxMTI5MDogbXVzdCBzdGFydCB3aXRoIDwpXG5cdC8vIFNob3J0Y3V0IHNpbXBsZSAjaWQgY2FzZSBmb3Igc3BlZWRcblx0cnF1aWNrRXhwciA9IC9eKD86XFxzKig8W1xcd1xcV10rPilbXj5dKnwjKFtcXHctXSspKSQvLFxuXG5cdGluaXQgPSBqUXVlcnkuZm4uaW5pdCA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCwgcm9vdCApIHtcblx0XHR2YXIgbWF0Y2gsIGVsZW07XG5cblx0XHQvLyBIQU5ETEU6ICQoXCJcIiksICQobnVsbCksICQodW5kZWZpbmVkKSwgJChmYWxzZSlcblx0XHRpZiAoICFzZWxlY3RvciApIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdC8vIE1ldGhvZCBpbml0KCkgYWNjZXB0cyBhbiBhbHRlcm5hdGUgcm9vdGpRdWVyeVxuXHRcdC8vIHNvIG1pZ3JhdGUgY2FuIHN1cHBvcnQgalF1ZXJ5LnN1YiAoZ2gtMjEwMSlcblx0XHRyb290ID0gcm9vdCB8fCByb290alF1ZXJ5O1xuXG5cdFx0Ly8gSGFuZGxlIEhUTUwgc3RyaW5nc1xuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0aWYgKCBzZWxlY3RvclsgMCBdID09PSBcIjxcIiAmJlxuXHRcdFx0XHRzZWxlY3Rvclsgc2VsZWN0b3IubGVuZ3RoIC0gMSBdID09PSBcIj5cIiAmJlxuXHRcdFx0XHRzZWxlY3Rvci5sZW5ndGggPj0gMyApIHtcblxuXHRcdFx0XHQvLyBBc3N1bWUgdGhhdCBzdHJpbmdzIHRoYXQgc3RhcnQgYW5kIGVuZCB3aXRoIDw+IGFyZSBIVE1MIGFuZCBza2lwIHRoZSByZWdleCBjaGVja1xuXHRcdFx0XHRtYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1hdGNoIGh0bWwgb3IgbWFrZSBzdXJlIG5vIGNvbnRleHQgaXMgc3BlY2lmaWVkIGZvciAjaWRcblx0XHRcdGlmICggbWF0Y2ggJiYgKCBtYXRjaFsgMSBdIHx8ICFjb250ZXh0ICkgKSB7XG5cblx0XHRcdFx0Ly8gSEFORExFOiAkKGh0bWwpIC0+ICQoYXJyYXkpXG5cdFx0XHRcdGlmICggbWF0Y2hbIDEgXSApIHtcblx0XHRcdFx0XHRjb250ZXh0ID0gY29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSA/IGNvbnRleHRbIDAgXSA6IGNvbnRleHQ7XG5cblx0XHRcdFx0XHQvLyBPcHRpb24gdG8gcnVuIHNjcmlwdHMgaXMgdHJ1ZSBmb3IgYmFjay1jb21wYXRcblx0XHRcdFx0XHQvLyBJbnRlbnRpb25hbGx5IGxldCB0aGUgZXJyb3IgYmUgdGhyb3duIGlmIHBhcnNlSFRNTCBpcyBub3QgcHJlc2VudFxuXHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggdGhpcywgalF1ZXJ5LnBhcnNlSFRNTChcblx0XHRcdFx0XHRcdG1hdGNoWyAxIF0sXG5cdFx0XHRcdFx0XHRjb250ZXh0ICYmIGNvbnRleHQubm9kZVR5cGUgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IGRvY3VtZW50LFxuXHRcdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHRcdCkgKTtcblxuXHRcdFx0XHRcdC8vIEhBTkRMRTogJChodG1sLCBwcm9wcylcblx0XHRcdFx0XHRpZiAoIHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbIDEgXSApICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7XG5cdFx0XHRcdFx0XHRmb3IgKCBtYXRjaCBpbiBjb250ZXh0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFByb3BlcnRpZXMgb2YgY29udGV4dCBhcmUgY2FsbGVkIGFzIG1ldGhvZHMgaWYgcG9zc2libGVcblx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdGhpc1sgbWF0Y2ggXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXNbIG1hdGNoIF0oIGNvbnRleHRbIG1hdGNoIF0gKTtcblxuXHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgb3RoZXJ3aXNlIHNldCBhcyBhdHRyaWJ1dGVzXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0Ly8gSEFORExFOiAkKCNpZClcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTtcblxuXHRcdFx0XHRcdGlmICggZWxlbSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3Rcblx0XHRcdFx0XHRcdHRoaXNbIDAgXSA9IGVsZW07XG5cdFx0XHRcdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCAkKC4uLikpXG5cdFx0XHR9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHtcblx0XHRcdFx0cmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTtcblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpXG5cdFx0XHQvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcilcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdC8vIEhBTkRMRTogJChET01FbGVtZW50KVxuXHRcdH0gZWxzZSBpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkge1xuXHRcdFx0dGhpc1sgMCBdID0gc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdC8vIEhBTkRMRTogJChmdW5jdGlvbilcblx0XHQvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHlcblx0XHR9IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApIHtcblx0XHRcdHJldHVybiByb290LnJlYWR5ICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRyb290LnJlYWR5KCBzZWxlY3RvciApIDpcblxuXHRcdFx0XHQvLyBFeGVjdXRlIGltbWVkaWF0ZWx5IGlmIHJlYWR5IGlzIG5vdCBwcmVzZW50XG5cdFx0XHRcdHNlbGVjdG9yKCBqUXVlcnkgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTtcblx0fTtcblxuLy8gR2l2ZSB0aGUgaW5pdCBmdW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvblxuaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47XG5cbi8vIEluaXRpYWxpemUgY2VudHJhbCByZWZlcmVuY2VcbnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7XG5cblxudmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLFxuXG5cdC8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0XG5cdGd1YXJhbnRlZWRVbmlxdWUgPSB7XG5cdFx0Y2hpbGRyZW46IHRydWUsXG5cdFx0Y29udGVudHM6IHRydWUsXG5cdFx0bmV4dDogdHJ1ZSxcblx0XHRwcmV2OiB0cnVlXG5cdH07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0aGFzOiBmdW5jdGlvbiggdGFyZ2V0ICkge1xuXHRcdHZhciB0YXJnZXRzID0galF1ZXJ5KCB0YXJnZXQsIHRoaXMgKSxcblx0XHRcdGwgPSB0YXJnZXRzLmxlbmd0aDtcblxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzWyBpIF0gKSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRjbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkge1xuXHRcdHZhciBjdXIsXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSB0aGlzLmxlbmd0aCxcblx0XHRcdG1hdGNoZWQgPSBbXSxcblx0XHRcdHRhcmdldHMgPSB0eXBlb2Ygc2VsZWN0b3JzICE9PSBcInN0cmluZ1wiICYmIGpRdWVyeSggc2VsZWN0b3JzICk7XG5cblx0XHQvLyBQb3NpdGlvbmFsIHNlbGVjdG9ycyBuZXZlciBtYXRjaCwgc2luY2UgdGhlcmUncyBubyBfc2VsZWN0aW9uXyBjb250ZXh0XG5cdFx0aWYgKCAhcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvcnMgKSApIHtcblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zm9yICggY3VyID0gdGhpc1sgaSBdOyBjdXIgJiYgY3VyICE9PSBjb250ZXh0OyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblxuXHRcdFx0XHRcdC8vIEFsd2F5cyBza2lwIGRvY3VtZW50IGZyYWdtZW50c1xuXHRcdFx0XHRcdGlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKCB0YXJnZXRzID9cblx0XHRcdFx0XHRcdHRhcmdldHMuaW5kZXgoIGN1ciApID4gLTEgOlxuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGVcblx0XHRcdFx0XHRcdGN1ci5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHRcdFx0XHRqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGN1ciwgc2VsZWN0b3JzICkgKSApIHtcblxuXHRcdFx0XHRcdFx0bWF0Y2hlZC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZVNvcnQoIG1hdGNoZWQgKSA6IG1hdGNoZWQgKTtcblx0fSxcblxuXHQvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBzZXRcblx0aW5kZXg6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnRcblx0XHRpZiAoICFlbGVtICkge1xuXHRcdFx0cmV0dXJuICggdGhpc1sgMCBdICYmIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgPyB0aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aCA6IC0xO1xuXHRcdH1cblxuXHRcdC8vIEluZGV4IGluIHNlbGVjdG9yXG5cdFx0aWYgKCB0eXBlb2YgZWxlbSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBpbmRleE9mLmNhbGwoIGpRdWVyeSggZWxlbSApLCB0aGlzWyAwIF0gKTtcblx0XHR9XG5cblx0XHQvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnRcblx0XHRyZXR1cm4gaW5kZXhPZi5jYWxsKCB0aGlzLFxuXG5cdFx0XHQvLyBJZiBpdCByZWNlaXZlcyBhIGpRdWVyeSBvYmplY3QsIHRoZSBmaXJzdCBlbGVtZW50IGlzIHVzZWRcblx0XHRcdGVsZW0uanF1ZXJ5ID8gZWxlbVsgMCBdIDogZWxlbVxuXHRcdCk7XG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKFxuXHRcdFx0alF1ZXJ5LnVuaXF1ZVNvcnQoXG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgalF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCApIClcblx0XHRcdClcblx0XHQpO1xuXHR9LFxuXG5cdGFkZEJhY2s6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgP1xuXHRcdFx0dGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKVxuXHRcdCk7XG5cdH1cbn0gKTtcblxuZnVuY3Rpb24gc2libGluZyggY3VyLCBkaXIgKSB7XG5cdHdoaWxlICggKCBjdXIgPSBjdXJbIGRpciBdICkgJiYgY3VyLm5vZGVUeXBlICE9PSAxICkge31cblx0cmV0dXJuIGN1cjtcbn1cblxualF1ZXJ5LmVhY2goIHtcblx0cGFyZW50OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdHJldHVybiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAxMSA/IHBhcmVudCA6IG51bGw7XG5cdH0sXG5cdHBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiICk7XG5cdH0sXG5cdHBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiLCB1bnRpbCApO1xuXHR9LFxuXHRuZXh0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXY6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiApO1xuXHR9LFxuXHRwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiwgdW50aWwgKTtcblx0fSxcblx0cHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiwgdW50aWwgKTtcblx0fSxcblx0c2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5ncyggKCBlbGVtLnBhcmVudE5vZGUgfHwge30gKS5maXJzdENoaWxkLCBlbGVtICk7XG5cdH0sXG5cdGNoaWxkcmVuOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZ3MoIGVsZW0uZmlyc3RDaGlsZCApO1xuXHR9LFxuXHRjb250ZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGVsZW0uY29udGVudERvY3VtZW50IHx8IGpRdWVyeS5tZXJnZSggW10sIGVsZW0uY2hpbGROb2RlcyApO1xuXHR9XG59LCBmdW5jdGlvbiggbmFtZSwgZm4gKSB7XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHtcblx0XHR2YXIgbWF0Y2hlZCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApO1xuXG5cdFx0aWYgKCBuYW1lLnNsaWNlKCAtNSApICE9PSBcIlVudGlsXCIgKSB7XG5cdFx0XHRzZWxlY3RvciA9IHVudGlsO1xuXHRcdH1cblxuXHRcdGlmICggc2VsZWN0b3IgJiYgdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0bWF0Y2hlZCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCBtYXRjaGVkICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdC8vIFJlbW92ZSBkdXBsaWNhdGVzXG5cdFx0XHRpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS51bmlxdWVTb3J0KCBtYXRjaGVkICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJldmVyc2Ugb3JkZXIgZm9yIHBhcmVudHMqIGFuZCBwcmV2LWRlcml2YXRpdmVzXG5cdFx0XHRpZiAoIHJwYXJlbnRzcHJldi50ZXN0KCBuYW1lICkgKSB7XG5cdFx0XHRcdG1hdGNoZWQucmV2ZXJzZSgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZCApO1xuXHR9O1xufSApO1xudmFyIHJub3RodG1sd2hpdGUgPSAoIC9bXlxceDIwXFx0XFxyXFxuXFxmXSsvZyApO1xuXG5cblxuLy8gQ29udmVydCBTdHJpbmctZm9ybWF0dGVkIG9wdGlvbnMgaW50byBPYmplY3QtZm9ybWF0dGVkIG9uZXNcbmZ1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7XG5cdHZhciBvYmplY3QgPSB7fTtcblx0alF1ZXJ5LmVhY2goIG9wdGlvbnMubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXSwgZnVuY3Rpb24oIF8sIGZsYWcgKSB7XG5cdFx0b2JqZWN0WyBmbGFnIF0gPSB0cnVlO1xuXHR9ICk7XG5cdHJldHVybiBvYmplY3Q7XG59XG5cbi8qXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBsaXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczpcbiAqXG4gKlx0b3B0aW9uczogYW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvd1xuICpcdFx0XHR0aGUgY2FsbGJhY2sgbGlzdCBiZWhhdmVzIG9yIGEgbW9yZSB0cmFkaXRpb25hbCBvcHRpb24gb2JqZWN0XG4gKlxuICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmVcbiAqIFwiZmlyZWRcIiBtdWx0aXBsZSB0aW1lcy5cbiAqXG4gKiBQb3NzaWJsZSBvcHRpb25zOlxuICpcbiAqXHRvbmNlOlx0XHRcdHdpbGwgZW5zdXJlIHRoZSBjYWxsYmFjayBsaXN0IGNhbiBvbmx5IGJlIGZpcmVkIG9uY2UgKGxpa2UgYSBEZWZlcnJlZClcbiAqXG4gKlx0bWVtb3J5Olx0XHRcdHdpbGwga2VlcCB0cmFjayBvZiBwcmV2aW91cyB2YWx1ZXMgYW5kIHdpbGwgY2FsbCBhbnkgY2FsbGJhY2sgYWRkZWRcbiAqXHRcdFx0XHRcdGFmdGVyIHRoZSBsaXN0IGhhcyBiZWVuIGZpcmVkIHJpZ2h0IGF3YXkgd2l0aCB0aGUgbGF0ZXN0IFwibWVtb3JpemVkXCJcbiAqXHRcdFx0XHRcdHZhbHVlcyAobGlrZSBhIERlZmVycmVkKVxuICpcbiAqXHR1bmlxdWU6XHRcdFx0d2lsbCBlbnN1cmUgYSBjYWxsYmFjayBjYW4gb25seSBiZSBhZGRlZCBvbmNlIChubyBkdXBsaWNhdGUgaW4gdGhlIGxpc3QpXG4gKlxuICpcdHN0b3BPbkZhbHNlOlx0aW50ZXJydXB0IGNhbGxpbmdzIHdoZW4gYSBjYWxsYmFjayByZXR1cm5zIGZhbHNlXG4gKlxuICovXG5qUXVlcnkuQ2FsbGJhY2tzID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cblx0Ly8gQ29udmVydCBvcHRpb25zIGZyb20gU3RyaW5nLWZvcm1hdHRlZCB0byBPYmplY3QtZm9ybWF0dGVkIGlmIG5lZWRlZFxuXHQvLyAod2UgY2hlY2sgaW4gY2FjaGUgZmlyc3QpXG5cdG9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJzdHJpbmdcIiA/XG5cdFx0Y3JlYXRlT3B0aW9ucyggb3B0aW9ucyApIDpcblx0XHRqUXVlcnkuZXh0ZW5kKCB7fSwgb3B0aW9ucyApO1xuXG5cdHZhciAvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCBpcyBjdXJyZW50bHkgZmlyaW5nXG5cdFx0ZmlyaW5nLFxuXG5cdFx0Ly8gTGFzdCBmaXJlIHZhbHVlIGZvciBub24tZm9yZ2V0dGFibGUgbGlzdHNcblx0XHRtZW1vcnksXG5cblx0XHQvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCB3YXMgYWxyZWFkeSBmaXJlZFxuXHRcdGZpcmVkLFxuXG5cdFx0Ly8gRmxhZyB0byBwcmV2ZW50IGZpcmluZ1xuXHRcdGxvY2tlZCxcblxuXHRcdC8vIEFjdHVhbCBjYWxsYmFjayBsaXN0XG5cdFx0bGlzdCA9IFtdLFxuXG5cdFx0Ly8gUXVldWUgb2YgZXhlY3V0aW9uIGRhdGEgZm9yIHJlcGVhdGFibGUgbGlzdHNcblx0XHRxdWV1ZSA9IFtdLFxuXG5cdFx0Ly8gSW5kZXggb2YgY3VycmVudGx5IGZpcmluZyBjYWxsYmFjayAobW9kaWZpZWQgYnkgYWRkL3JlbW92ZSBhcyBuZWVkZWQpXG5cdFx0ZmlyaW5nSW5kZXggPSAtMSxcblxuXHRcdC8vIEZpcmUgY2FsbGJhY2tzXG5cdFx0ZmlyZSA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBFbmZvcmNlIHNpbmdsZS1maXJpbmdcblx0XHRcdGxvY2tlZCA9IG9wdGlvbnMub25jZTtcblxuXHRcdFx0Ly8gRXhlY3V0ZSBjYWxsYmFja3MgZm9yIGFsbCBwZW5kaW5nIGV4ZWN1dGlvbnMsXG5cdFx0XHQvLyByZXNwZWN0aW5nIGZpcmluZ0luZGV4IG92ZXJyaWRlcyBhbmQgcnVudGltZSBjaGFuZ2VzXG5cdFx0XHRmaXJlZCA9IGZpcmluZyA9IHRydWU7XG5cdFx0XHRmb3IgKCA7IHF1ZXVlLmxlbmd0aDsgZmlyaW5nSW5kZXggPSAtMSApIHtcblx0XHRcdFx0bWVtb3J5ID0gcXVldWUuc2hpZnQoKTtcblx0XHRcdFx0d2hpbGUgKCArK2ZpcmluZ0luZGV4IDwgbGlzdC5sZW5ndGggKSB7XG5cblx0XHRcdFx0XHQvLyBSdW4gY2FsbGJhY2sgYW5kIGNoZWNrIGZvciBlYXJseSB0ZXJtaW5hdGlvblxuXHRcdFx0XHRcdGlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggbWVtb3J5WyAwIF0sIG1lbW9yeVsgMSBdICkgPT09IGZhbHNlICYmXG5cdFx0XHRcdFx0XHRvcHRpb25zLnN0b3BPbkZhbHNlICkge1xuXG5cdFx0XHRcdFx0XHQvLyBKdW1wIHRvIGVuZCBhbmQgZm9yZ2V0IHRoZSBkYXRhIHNvIC5hZGQgZG9lc24ndCByZS1maXJlXG5cdFx0XHRcdFx0XHRmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoO1xuXHRcdFx0XHRcdFx0bWVtb3J5ID0gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvcmdldCB0aGUgZGF0YSBpZiB3ZSdyZSBkb25lIHdpdGggaXRcblx0XHRcdGlmICggIW9wdGlvbnMubWVtb3J5ICkge1xuXHRcdFx0XHRtZW1vcnkgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0ZmlyaW5nID0gZmFsc2U7XG5cblx0XHRcdC8vIENsZWFuIHVwIGlmIHdlJ3JlIGRvbmUgZmlyaW5nIGZvciBnb29kXG5cdFx0XHRpZiAoIGxvY2tlZCApIHtcblxuXHRcdFx0XHQvLyBLZWVwIGFuIGVtcHR5IGxpc3QgaWYgd2UgaGF2ZSBkYXRhIGZvciBmdXR1cmUgYWRkIGNhbGxzXG5cdFx0XHRcdGlmICggbWVtb3J5ICkge1xuXHRcdFx0XHRcdGxpc3QgPSBbXTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UsIHRoaXMgb2JqZWN0IGlzIHNwZW50XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGlzdCA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gQWN0dWFsIENhbGxiYWNrcyBvYmplY3Rcblx0XHRzZWxmID0ge1xuXG5cdFx0XHQvLyBBZGQgYSBjYWxsYmFjayBvciBhIGNvbGxlY3Rpb24gb2YgY2FsbGJhY2tzIHRvIHRoZSBsaXN0XG5cdFx0XHRhZGQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiB3ZSBoYXZlIG1lbW9yeSBmcm9tIGEgcGFzdCBydW4sIHdlIHNob3VsZCBmaXJlIGFmdGVyIGFkZGluZ1xuXHRcdFx0XHRcdGlmICggbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoIC0gMTtcblx0XHRcdFx0XHRcdHF1ZXVlLnB1c2goIG1lbW9yeSApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCggZnVuY3Rpb24gYWRkKCBhcmdzICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmVhY2goIGFyZ3MsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGFyZyApICkge1xuXHRcdFx0XHRcdFx0XHRcdGlmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRsaXN0LnB1c2goIGFyZyApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgalF1ZXJ5LnR5cGUoIGFyZyApICE9PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gSW5zcGVjdCByZWN1cnNpdmVseVxuXHRcdFx0XHRcdFx0XHRcdGFkZCggYXJnICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHR9ICkoIGFyZ3VtZW50cyApO1xuXG5cdFx0XHRcdFx0aWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBSZW1vdmUgYSBjYWxsYmFjayBmcm9tIHRoZSBsaXN0XG5cdFx0XHRyZW1vdmU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkuZWFjaCggYXJndW1lbnRzLCBmdW5jdGlvbiggXywgYXJnICkge1xuXHRcdFx0XHRcdHZhciBpbmRleDtcblx0XHRcdFx0XHR3aGlsZSAoICggaW5kZXggPSBqUXVlcnkuaW5BcnJheSggYXJnLCBsaXN0LCBpbmRleCApICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdGxpc3Quc3BsaWNlKCBpbmRleCwgMSApO1xuXG5cdFx0XHRcdFx0XHQvLyBIYW5kbGUgZmlyaW5nIGluZGV4ZXNcblx0XHRcdFx0XHRcdGlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7XG5cdFx0XHRcdFx0XHRcdGZpcmluZ0luZGV4LS07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYSBnaXZlbiBjYWxsYmFjayBpcyBpbiB0aGUgbGlzdC5cblx0XHRcdC8vIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCByZXR1cm4gd2hldGhlciBvciBub3QgbGlzdCBoYXMgY2FsbGJhY2tzIGF0dGFjaGVkLlxuXHRcdFx0aGFzOiBmdW5jdGlvbiggZm4gKSB7XG5cdFx0XHRcdHJldHVybiBmbiA/XG5cdFx0XHRcdFx0alF1ZXJ5LmluQXJyYXkoIGZuLCBsaXN0ICkgPiAtMSA6XG5cdFx0XHRcdFx0bGlzdC5sZW5ndGggPiAwO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gUmVtb3ZlIGFsbCBjYWxsYmFja3MgZnJvbSB0aGUgbGlzdFxuXHRcdFx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRGlzYWJsZSAuZmlyZSBhbmQgLmFkZFxuXHRcdFx0Ly8gQWJvcnQgYW55IGN1cnJlbnQvcGVuZGluZyBleGVjdXRpb25zXG5cdFx0XHQvLyBDbGVhciBhbGwgY2FsbGJhY2tzIGFuZCB2YWx1ZXNcblx0XHRcdGRpc2FibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsb2NrZWQgPSBxdWV1ZSA9IFtdO1xuXHRcdFx0XHRsaXN0ID0gbWVtb3J5ID0gXCJcIjtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0ZGlzYWJsZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gIWxpc3Q7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBEaXNhYmxlIC5maXJlXG5cdFx0XHQvLyBBbHNvIGRpc2FibGUgLmFkZCB1bmxlc3Mgd2UgaGF2ZSBtZW1vcnkgKHNpbmNlIGl0IHdvdWxkIGhhdmUgbm8gZWZmZWN0KVxuXHRcdFx0Ly8gQWJvcnQgYW55IHBlbmRpbmcgZXhlY3V0aW9uc1xuXHRcdFx0bG9jazogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxvY2tlZCA9IHF1ZXVlID0gW107XG5cdFx0XHRcdGlmICggIW1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdGxpc3QgPSBtZW1vcnkgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdGxvY2tlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWxvY2tlZDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIENhbGwgYWxsIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBhcmd1bWVudHNcblx0XHRcdGZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHtcblx0XHRcdFx0aWYgKCAhbG9ja2VkICkge1xuXHRcdFx0XHRcdGFyZ3MgPSBhcmdzIHx8IFtdO1xuXHRcdFx0XHRcdGFyZ3MgPSBbIGNvbnRleHQsIGFyZ3Muc2xpY2UgPyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07XG5cdFx0XHRcdFx0cXVldWUucHVzaCggYXJncyApO1xuXHRcdFx0XHRcdGlmICggIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDYWxsIGFsbCB0aGUgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHNlbGYuZmlyZVdpdGgoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZVxuXHRcdFx0ZmlyZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISFmaXJlZDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdHJldHVybiBzZWxmO1xufTtcblxuXG5mdW5jdGlvbiBJZGVudGl0eSggdiApIHtcblx0cmV0dXJuIHY7XG59XG5mdW5jdGlvbiBUaHJvd2VyKCBleCApIHtcblx0dGhyb3cgZXg7XG59XG5cbmZ1bmN0aW9uIGFkb3B0VmFsdWUoIHZhbHVlLCByZXNvbHZlLCByZWplY3QgKSB7XG5cdHZhciBtZXRob2Q7XG5cblx0dHJ5IHtcblxuXHRcdC8vIENoZWNrIGZvciBwcm9taXNlIGFzcGVjdCBmaXJzdCB0byBwcml2aWxlZ2Ugc3luY2hyb25vdXMgYmVoYXZpb3Jcblx0XHRpZiAoIHZhbHVlICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCAoIG1ldGhvZCA9IHZhbHVlLnByb21pc2UgKSApICkge1xuXHRcdFx0bWV0aG9kLmNhbGwoIHZhbHVlICkuZG9uZSggcmVzb2x2ZSApLmZhaWwoIHJlamVjdCApO1xuXG5cdFx0Ly8gT3RoZXIgdGhlbmFibGVzXG5cdFx0fSBlbHNlIGlmICggdmFsdWUgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUudGhlbiApICkgKSB7XG5cdFx0XHRtZXRob2QuY2FsbCggdmFsdWUsIHJlc29sdmUsIHJlamVjdCApO1xuXG5cdFx0Ly8gT3RoZXIgbm9uLXRoZW5hYmxlc1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIG9ubHlcblx0XHRcdC8vIFN0cmljdCBtb2RlIGZ1bmN0aW9ucyBpbnZva2VkIHdpdGhvdXQgLmNhbGwvLmFwcGx5IGdldCBnbG9iYWwtb2JqZWN0IGNvbnRleHRcblx0XHRcdHJlc29sdmUuY2FsbCggdW5kZWZpbmVkLCB2YWx1ZSApO1xuXHRcdH1cblxuXHQvLyBGb3IgUHJvbWlzZXMvQSssIGNvbnZlcnQgZXhjZXB0aW9ucyBpbnRvIHJlamVjdGlvbnNcblx0Ly8gU2luY2UgalF1ZXJ5LndoZW4gZG9lc24ndCB1bndyYXAgdGhlbmFibGVzLCB3ZSBjYW4gc2tpcCB0aGUgZXh0cmEgY2hlY2tzIGFwcGVhcmluZyBpblxuXHQvLyBEZWZlcnJlZCN0aGVuIHRvIGNvbmRpdGlvbmFsbHkgc3VwcHJlc3MgcmVqZWN0aW9uLlxuXHR9IGNhdGNoICggdmFsdWUgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCBvbmx5XG5cdFx0Ly8gU3RyaWN0IG1vZGUgZnVuY3Rpb25zIGludm9rZWQgd2l0aG91dCAuY2FsbC8uYXBwbHkgZ2V0IGdsb2JhbC1vYmplY3QgY29udGV4dFxuXHRcdHJlamVjdC5jYWxsKCB1bmRlZmluZWQsIHZhbHVlICk7XG5cdH1cbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdERlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHtcblx0XHR2YXIgdHVwbGVzID0gW1xuXG5cdFx0XHRcdC8vIGFjdGlvbiwgYWRkIGxpc3RlbmVyLCBjYWxsYmFja3MsXG5cdFx0XHRcdC8vIC4uLiAudGhlbiBoYW5kbGVycywgYXJndW1lbnQgaW5kZXgsIFtmaW5hbCBzdGF0ZV1cblx0XHRcdFx0WyBcIm5vdGlmeVwiLCBcInByb2dyZXNzXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwibWVtb3J5XCIgKSxcblx0XHRcdFx0XHRqUXVlcnkuQ2FsbGJhY2tzKCBcIm1lbW9yeVwiICksIDIgXSxcblx0XHRcdFx0WyBcInJlc29sdmVcIiwgXCJkb25lXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXHRcdFx0XHRcdGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLCAwLCBcInJlc29sdmVkXCIgXSxcblx0XHRcdFx0WyBcInJlamVjdFwiLCBcImZhaWxcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksXG5cdFx0XHRcdFx0alF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksIDEsIFwicmVqZWN0ZWRcIiBdXG5cdFx0XHRdLFxuXHRcdFx0c3RhdGUgPSBcInBlbmRpbmdcIixcblx0XHRcdHByb21pc2UgPSB7XG5cdFx0XHRcdHN0YXRlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gc3RhdGU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGFsd2F5czogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQuZG9uZSggYXJndW1lbnRzICkuZmFpbCggYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdFwiY2F0Y2hcIjogZnVuY3Rpb24oIGZuICkge1xuXHRcdFx0XHRcdHJldHVybiBwcm9taXNlLnRoZW4oIG51bGwsIGZuICk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gS2VlcCBwaXBlIGZvciBiYWNrLWNvbXBhdFxuXHRcdFx0XHRwaXBlOiBmdW5jdGlvbiggLyogZm5Eb25lLCBmbkZhaWwsIGZuUHJvZ3Jlc3MgKi8gKSB7XG5cdFx0XHRcdFx0dmFyIGZucyA9IGFyZ3VtZW50cztcblxuXHRcdFx0XHRcdHJldHVybiBqUXVlcnkuRGVmZXJyZWQoIGZ1bmN0aW9uKCBuZXdEZWZlciApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBNYXAgdHVwbGVzIChwcm9ncmVzcywgZG9uZSwgZmFpbCkgdG8gYXJndW1lbnRzIChkb25lLCBmYWlsLCBwcm9ncmVzcylcblx0XHRcdFx0XHRcdFx0dmFyIGZuID0galF1ZXJ5LmlzRnVuY3Rpb24oIGZuc1sgdHVwbGVbIDQgXSBdICkgJiYgZm5zWyB0dXBsZVsgNCBdIF07XG5cblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWQucHJvZ3Jlc3MoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIubm90aWZ5IH0pXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkLmRvbmUoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIucmVzb2x2ZSB9KVxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZC5mYWlsKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlamVjdCB9KVxuXHRcdFx0XHRcdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDEgXSBdKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHR2YXIgcmV0dXJuZWQgPSBmbiAmJiBmbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCByZXR1cm5lZCAmJiBqUXVlcnkuaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQucHJvbWlzZSgpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5IClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmRvbmUoIG5ld0RlZmVyLnJlc29sdmUgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZmFpbCggbmV3RGVmZXIucmVqZWN0ICk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXShcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm4gPyBbIHJldHVybmVkIF0gOiBhcmd1bWVudHNcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHRmbnMgPSBudWxsO1xuXHRcdFx0XHRcdH0gKS5wcm9taXNlKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoZW46IGZ1bmN0aW9uKCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCwgb25Qcm9ncmVzcyApIHtcblx0XHRcdFx0XHR2YXIgbWF4RGVwdGggPSAwO1xuXHRcdFx0XHRcdGZ1bmN0aW9uIHJlc29sdmUoIGRlcHRoLCBkZWZlcnJlZCwgaGFuZGxlciwgc3BlY2lhbCApIHtcblx0XHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0dmFyIHRoYXQgPSB0aGlzLFxuXHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBhcmd1bWVudHMsXG5cdFx0XHRcdFx0XHRcdFx0bWlnaHRUaHJvdyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIHJldHVybmVkLCB0aGVuO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuM1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElnbm9yZSBkb3VibGUtcmVzb2x1dGlvbiBhdHRlbXB0c1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBkZXB0aCA8IG1heERlcHRoICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkID0gaGFuZGxlci5hcHBseSggdGhhdCwgYXJncyApO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4xXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC00OFxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCByZXR1cm5lZCA9PT0gZGVmZXJyZWQucHJvbWlzZSgpICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCBcIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvblwiICk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb25zIDIuMy4zLjEsIDMuNVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTRcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTc1XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBSZXRyaWV2ZSBgdGhlbmAgb25seSBvbmNlXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGVuID0gcmV0dXJuZWQgJiZcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy40XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTY0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgY2hlY2sgb2JqZWN0cyBhbmQgZnVuY3Rpb25zIGZvciB0aGVuYWJpbGl0eVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQoIHR5cGVvZiByZXR1cm5lZCA9PT0gXCJvYmplY3RcIiB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR5cGVvZiByZXR1cm5lZCA9PT0gXCJmdW5jdGlvblwiICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQudGhlbjtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGEgcmV0dXJuZWQgdGhlbmFibGVcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHRoZW4gKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTcGVjaWFsIHByb2Nlc3NvcnMgKG5vdGlmeSkganVzdCB3YWl0IGZvciByZXNvbHV0aW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggc3BlY2lhbCApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGVuLmNhbGwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgVGhyb3dlciwgc3BlY2lhbCApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBOb3JtYWwgcHJvY2Vzc29ycyAocmVzb2x2ZSkgYWxzbyBob29rIGludG8gcHJvZ3Jlc3Ncblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIC4uLmFuZCBkaXNyZWdhcmQgb2xkZXIgcmVzb2x1dGlvbiB2YWx1ZXNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtYXhEZXB0aCsrO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhlbi5jYWxsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIFRocm93ZXIsIHNwZWNpYWwgKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGggKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGFsbCBvdGhlciByZXR1cm5lZCB2YWx1ZXNcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcilcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBoYW5kbGVyICE9PSBJZGVudGl0eSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGF0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBbIHJldHVybmVkIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBQcm9jZXNzIHRoZSB2YWx1ZShzKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBEZWZhdWx0IHByb2Nlc3MgaXMgcmVzb2x2ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQoIHNwZWNpYWwgfHwgZGVmZXJyZWQucmVzb2x2ZVdpdGggKSggdGhhdCwgYXJncyApO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cblx0XHRcdFx0XHRcdFx0XHQvLyBPbmx5IG5vcm1hbCBwcm9jZXNzb3JzIChyZXNvbHZlKSBjYXRjaCBhbmQgcmVqZWN0IGV4Y2VwdGlvbnNcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzID0gc3BlY2lhbCA/XG5cdFx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93IDpcblx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1pZ2h0VGhyb3coKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soIGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3Muc3RhY2tUcmFjZSApO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy40LjFcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC02MVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIElnbm9yZSBwb3N0LXJlc29sdXRpb24gZXhjZXB0aW9uc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggZGVwdGggKyAxID49IG1heERlcHRoICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBPbmx5IHN1YnN0aXR1dGUgaGFuZGxlcnMgcGFzcyBvbiBjb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggaGFuZGxlciAhPT0gVGhyb3dlciApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhhdCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncyA9IFsgZSBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCB0aGF0LCBhcmdzICk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy4xXG5cdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTU3XG5cdFx0XHRcdFx0XHRcdC8vIFJlLXJlc29sdmUgcHJvbWlzZXMgaW1tZWRpYXRlbHkgdG8gZG9kZ2UgZmFsc2UgcmVqZWN0aW9uIGZyb21cblx0XHRcdFx0XHRcdFx0Ly8gc3Vic2VxdWVudCBlcnJvcnNcblx0XHRcdFx0XHRcdFx0aWYgKCBkZXB0aCApIHtcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzKCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBDYWxsIGFuIG9wdGlvbmFsIGhvb2sgdG8gcmVjb3JkIHRoZSBzdGFjaywgaW4gY2FzZSBvZiBleGNlcHRpb25cblx0XHRcdFx0XHRcdFx0XHQvLyBzaW5jZSBpdCdzIG90aGVyd2lzZSBsb3N0IHdoZW4gZXhlY3V0aW9uIGdvZXMgYXN5bmNcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5EZWZlcnJlZC5nZXRTdGFja0hvb2sgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzLnN0YWNrVHJhY2UgPSBqUXVlcnkuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBwcm9jZXNzICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkge1xuXG5cdFx0XHRcdFx0XHQvLyBwcm9ncmVzc19oYW5kbGVycy5hZGQoIC4uLiApXG5cdFx0XHRcdFx0XHR0dXBsZXNbIDAgXVsgMyBdLmFkZChcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShcblx0XHRcdFx0XHRcdFx0XHQwLFxuXHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyLFxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5pc0Z1bmN0aW9uKCBvblByb2dyZXNzICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25Qcm9ncmVzcyA6XG5cdFx0XHRcdFx0XHRcdFx0XHRJZGVudGl0eSxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlci5ub3RpZnlXaXRoXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdC8vIGZ1bGZpbGxlZF9oYW5kbGVycy5hZGQoIC4uLiApXG5cdFx0XHRcdFx0XHR0dXBsZXNbIDEgXVsgMyBdLmFkZChcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShcblx0XHRcdFx0XHRcdFx0XHQwLFxuXHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyLFxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5pc0Z1bmN0aW9uKCBvbkZ1bGZpbGxlZCApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uRnVsZmlsbGVkIDpcblx0XHRcdFx0XHRcdFx0XHRcdElkZW50aXR5XG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmFkZCggLi4uIClcblx0XHRcdFx0XHRcdHR1cGxlc1sgMiBdWyAzIF0uYWRkKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIsXG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmlzRnVuY3Rpb24oIG9uUmVqZWN0ZWQgKSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRvblJlamVjdGVkIDpcblx0XHRcdFx0XHRcdFx0XHRcdFRocm93ZXJcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9ICkucHJvbWlzZSgpO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIEdldCBhIHByb21pc2UgZm9yIHRoaXMgZGVmZXJyZWRcblx0XHRcdFx0Ly8gSWYgb2JqIGlzIHByb3ZpZGVkLCB0aGUgcHJvbWlzZSBhc3BlY3QgaXMgYWRkZWQgdG8gdGhlIG9iamVjdFxuXHRcdFx0XHRwcm9taXNlOiBmdW5jdGlvbiggb2JqICkge1xuXHRcdFx0XHRcdHJldHVybiBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQoIG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGRlZmVycmVkID0ge307XG5cblx0XHQvLyBBZGQgbGlzdC1zcGVjaWZpYyBtZXRob2RzXG5cdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkge1xuXHRcdFx0dmFyIGxpc3QgPSB0dXBsZVsgMiBdLFxuXHRcdFx0XHRzdGF0ZVN0cmluZyA9IHR1cGxlWyA1IF07XG5cblx0XHRcdC8vIHByb21pc2UucHJvZ3Jlc3MgPSBsaXN0LmFkZFxuXHRcdFx0Ly8gcHJvbWlzZS5kb25lID0gbGlzdC5hZGRcblx0XHRcdC8vIHByb21pc2UuZmFpbCA9IGxpc3QuYWRkXG5cdFx0XHRwcm9taXNlWyB0dXBsZVsgMSBdIF0gPSBsaXN0LmFkZDtcblxuXHRcdFx0Ly8gSGFuZGxlIHN0YXRlXG5cdFx0XHRpZiAoIHN0YXRlU3RyaW5nICkge1xuXHRcdFx0XHRsaXN0LmFkZChcblx0XHRcdFx0XHRmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRcdFx0Ly8gc3RhdGUgPSBcInJlc29sdmVkXCIgKGkuZS4sIGZ1bGZpbGxlZClcblx0XHRcdFx0XHRcdC8vIHN0YXRlID0gXCJyZWplY3RlZFwiXG5cdFx0XHRcdFx0XHRzdGF0ZSA9IHN0YXRlU3RyaW5nO1xuXHRcdFx0XHRcdH0sXG5cblx0XHRcdFx0XHQvLyByZWplY3RlZF9jYWxsYmFja3MuZGlzYWJsZVxuXHRcdFx0XHRcdC8vIGZ1bGZpbGxlZF9jYWxsYmFja3MuZGlzYWJsZVxuXHRcdFx0XHRcdHR1cGxlc1sgMyAtIGkgXVsgMiBdLmRpc2FibGUsXG5cblx0XHRcdFx0XHQvLyBwcm9ncmVzc19jYWxsYmFja3MubG9ja1xuXHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAyIF0ubG9ja1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBwcm9ncmVzc19oYW5kbGVycy5maXJlXG5cdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZmlyZVxuXHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuZmlyZVxuXHRcdFx0bGlzdC5hZGQoIHR1cGxlWyAzIF0uZmlyZSApO1xuXG5cdFx0XHQvLyBkZWZlcnJlZC5ub3RpZnkgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQubm90aWZ5V2l0aCguLi4pIH1cblx0XHRcdC8vIGRlZmVycmVkLnJlc29sdmUgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZVdpdGgoLi4uKSB9XG5cdFx0XHQvLyBkZWZlcnJlZC5yZWplY3QgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVqZWN0V2l0aCguLi4pIH1cblx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHVuZGVmaW5lZCA6IHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH07XG5cblx0XHRcdC8vIGRlZmVycmVkLm5vdGlmeVdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHQvLyBkZWZlcnJlZC5yZXNvbHZlV2l0aCA9IGxpc3QuZmlyZVdpdGhcblx0XHRcdC8vIGRlZmVycmVkLnJlamVjdFdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0gPSBsaXN0LmZpcmVXaXRoO1xuXHRcdH0gKTtcblxuXHRcdC8vIE1ha2UgdGhlIGRlZmVycmVkIGEgcHJvbWlzZVxuXHRcdHByb21pc2UucHJvbWlzZSggZGVmZXJyZWQgKTtcblxuXHRcdC8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnlcblx0XHRpZiAoIGZ1bmMgKSB7XG5cdFx0XHRmdW5jLmNhbGwoIGRlZmVycmVkLCBkZWZlcnJlZCApO1xuXHRcdH1cblxuXHRcdC8vIEFsbCBkb25lIVxuXHRcdHJldHVybiBkZWZlcnJlZDtcblx0fSxcblxuXHQvLyBEZWZlcnJlZCBoZWxwZXJcblx0d2hlbjogZnVuY3Rpb24oIHNpbmdsZVZhbHVlICkge1xuXHRcdHZhclxuXG5cdFx0XHQvLyBjb3VudCBvZiB1bmNvbXBsZXRlZCBzdWJvcmRpbmF0ZXNcblx0XHRcdHJlbWFpbmluZyA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cblx0XHRcdC8vIGNvdW50IG9mIHVucHJvY2Vzc2VkIGFyZ3VtZW50c1xuXHRcdFx0aSA9IHJlbWFpbmluZyxcblxuXHRcdFx0Ly8gc3Vib3JkaW5hdGUgZnVsZmlsbG1lbnQgZGF0YVxuXHRcdFx0cmVzb2x2ZUNvbnRleHRzID0gQXJyYXkoIGkgKSxcblx0XHRcdHJlc29sdmVWYWx1ZXMgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSxcblxuXHRcdFx0Ly8gdGhlIG1hc3RlciBEZWZlcnJlZFxuXHRcdFx0bWFzdGVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cblx0XHRcdC8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3Rvcnlcblx0XHRcdHVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7XG5cdFx0XHRcdFx0cmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlO1xuXHRcdFx0XHRcdGlmICggISggLS1yZW1haW5pbmcgKSApIHtcblx0XHRcdFx0XHRcdG1hc3Rlci5yZXNvbHZlV2l0aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblxuXHRcdC8vIFNpbmdsZS0gYW5kIGVtcHR5IGFyZ3VtZW50cyBhcmUgYWRvcHRlZCBsaWtlIFByb21pc2UucmVzb2x2ZVxuXHRcdGlmICggcmVtYWluaW5nIDw9IDEgKSB7XG5cdFx0XHRhZG9wdFZhbHVlKCBzaW5nbGVWYWx1ZSwgbWFzdGVyLmRvbmUoIHVwZGF0ZUZ1bmMoIGkgKSApLnJlc29sdmUsIG1hc3Rlci5yZWplY3QgKTtcblxuXHRcdFx0Ly8gVXNlIC50aGVuKCkgdG8gdW53cmFwIHNlY29uZGFyeSB0aGVuYWJsZXMgKGNmLiBnaC0zMDAwKVxuXHRcdFx0aWYgKCBtYXN0ZXIuc3RhdGUoKSA9PT0gXCJwZW5kaW5nXCIgfHxcblx0XHRcdFx0alF1ZXJ5LmlzRnVuY3Rpb24oIHJlc29sdmVWYWx1ZXNbIGkgXSAmJiByZXNvbHZlVmFsdWVzWyBpIF0udGhlbiApICkge1xuXG5cdFx0XHRcdHJldHVybiBtYXN0ZXIudGhlbigpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE11bHRpcGxlIGFyZ3VtZW50cyBhcmUgYWdncmVnYXRlZCBsaWtlIFByb21pc2UuYWxsIGFycmF5IGVsZW1lbnRzXG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRhZG9wdFZhbHVlKCByZXNvbHZlVmFsdWVzWyBpIF0sIHVwZGF0ZUZ1bmMoIGkgKSwgbWFzdGVyLnJlamVjdCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBtYXN0ZXIucHJvbWlzZSgpO1xuXHR9XG59ICk7XG5cblxuLy8gVGhlc2UgdXN1YWxseSBpbmRpY2F0ZSBhIHByb2dyYW1tZXIgbWlzdGFrZSBkdXJpbmcgZGV2ZWxvcG1lbnQsXG4vLyB3YXJuIGFib3V0IHRoZW0gQVNBUCByYXRoZXIgdGhhbiBzd2FsbG93aW5nIHRoZW0gYnkgZGVmYXVsdC5cbnZhciByZXJyb3JOYW1lcyA9IC9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO1xuXG5qUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayA9IGZ1bmN0aW9uKCBlcnJvciwgc3RhY2sgKSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgOCAtIDkgb25seVxuXHQvLyBDb25zb2xlIGV4aXN0cyB3aGVuIGRldiB0b29scyBhcmUgb3Blbiwgd2hpY2ggY2FuIGhhcHBlbiBhdCBhbnkgdGltZVxuXHRpZiAoIHdpbmRvdy5jb25zb2xlICYmIHdpbmRvdy5jb25zb2xlLndhcm4gJiYgZXJyb3IgJiYgcmVycm9yTmFtZXMudGVzdCggZXJyb3IubmFtZSApICkge1xuXHRcdHdpbmRvdy5jb25zb2xlLndhcm4oIFwialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogXCIgKyBlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjaywgc3RhY2sgKTtcblx0fVxufTtcblxuXG5cblxualF1ZXJ5LnJlYWR5RXhjZXB0aW9uID0gZnVuY3Rpb24oIGVycm9yICkge1xuXHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0dGhyb3cgZXJyb3I7XG5cdH0gKTtcbn07XG5cblxuXG5cbi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeVxudmFyIHJlYWR5TGlzdCA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5qUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7XG5cblx0cmVhZHlMaXN0XG5cdFx0LnRoZW4oIGZuIClcblxuXHRcdC8vIFdyYXAgalF1ZXJ5LnJlYWR5RXhjZXB0aW9uIGluIGEgZnVuY3Rpb24gc28gdGhhdCB0aGUgbG9va3VwXG5cdFx0Ly8gaGFwcGVucyBhdCB0aGUgdGltZSBvZiBlcnJvciBoYW5kbGluZyBpbnN0ZWFkIG9mIGNhbGxiYWNrXG5cdFx0Ly8gcmVnaXN0cmF0aW9uLlxuXHRcdC5jYXRjaCggZnVuY3Rpb24oIGVycm9yICkge1xuXHRcdFx0alF1ZXJ5LnJlYWR5RXhjZXB0aW9uKCBlcnJvciApO1xuXHRcdH0gKTtcblxuXHRyZXR1cm4gdGhpcztcbn07XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLlxuXHRpc1JlYWR5OiBmYWxzZSxcblxuXHQvLyBBIGNvdW50ZXIgdG8gdHJhY2sgaG93IG1hbnkgaXRlbXMgdG8gd2FpdCBmb3IgYmVmb3JlXG5cdC8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxXG5cdHJlYWR5V2FpdDogMSxcblxuXHQvLyBIb2xkIChvciByZWxlYXNlKSB0aGUgcmVhZHkgZXZlbnRcblx0aG9sZFJlYWR5OiBmdW5jdGlvbiggaG9sZCApIHtcblx0XHRpZiAoIGhvbGQgKSB7XG5cdFx0XHRqUXVlcnkucmVhZHlXYWl0Kys7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGpRdWVyeS5yZWFkeSggdHJ1ZSApO1xuXHRcdH1cblx0fSxcblxuXHQvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5XG5cdHJlYWR5OiBmdW5jdGlvbiggd2FpdCApIHtcblxuXHRcdC8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkgcmVhZHlcblx0XHRpZiAoIHdhaXQgPT09IHRydWUgPyAtLWpRdWVyeS5yZWFkeVdhaXQgOiBqUXVlcnkuaXNSZWFkeSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHlcblx0XHRqUXVlcnkuaXNSZWFkeSA9IHRydWU7XG5cblx0XHQvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZVxuXHRcdGlmICggd2FpdCAhPT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRvIGV4ZWN1dGVcblx0XHRyZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LnJlYWR5LnRoZW4gPSByZWFkeUxpc3QudGhlbjtcblxuLy8gVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIgYW5kIHNlbGYgY2xlYW51cCBtZXRob2RcbmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHtcblx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJsb2FkXCIsIGNvbXBsZXRlZCApO1xuXHRqUXVlcnkucmVhZHkoKTtcbn1cblxuLy8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWRcbi8vIGFmdGVyIHRoZSBicm93c2VyIGV2ZW50IGhhcyBhbHJlYWR5IG9jY3VycmVkLlxuLy8gU3VwcG9ydDogSUUgPD05IC0gMTAgb25seVxuLy8gT2xkZXIgSUUgc29tZXRpbWVzIHNpZ25hbHMgXCJpbnRlcmFjdGl2ZVwiIHRvbyBzb29uXG5pZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIiB8fFxuXHQoIGRvY3VtZW50LnJlYWR5U3RhdGUgIT09IFwibG9hZGluZ1wiICYmICFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwgKSApIHtcblxuXHQvLyBIYW5kbGUgaXQgYXN5bmNocm9ub3VzbHkgdG8gYWxsb3cgc2NyaXB0cyB0aGUgb3Bwb3J0dW5pdHkgdG8gZGVsYXkgcmVhZHlcblx0d2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApO1xuXG59IGVsc2Uge1xuXG5cdC8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2tcblx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXG5cdC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG59XG5cblxuXG5cbi8vIE11bHRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIG9mIGEgY29sbGVjdGlvblxuLy8gVGhlIHZhbHVlL3MgY2FuIG9wdGlvbmFsbHkgYmUgZXhlY3V0ZWQgaWYgaXQncyBhIGZ1bmN0aW9uXG52YXIgYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gZWxlbXMubGVuZ3RoLFxuXHRcdGJ1bGsgPSBrZXkgPT0gbnVsbDtcblxuXHQvLyBTZXRzIG1hbnkgdmFsdWVzXG5cdGlmICggalF1ZXJ5LnR5cGUoIGtleSApID09PSBcIm9iamVjdFwiICkge1xuXHRcdGNoYWluYWJsZSA9IHRydWU7XG5cdFx0Zm9yICggaSBpbiBrZXkgKSB7XG5cdFx0XHRhY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5WyBpIF0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTtcblx0XHR9XG5cblx0Ly8gU2V0cyBvbmUgdmFsdWVcblx0fSBlbHNlIGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRjaGFpbmFibGUgPSB0cnVlO1xuXG5cdFx0aWYgKCAhalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyYXcgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICggYnVsayApIHtcblxuXHRcdFx0Ly8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2FpbnN0IHRoZSBlbnRpcmUgc2V0XG5cdFx0XHRpZiAoIHJhdyApIHtcblx0XHRcdFx0Zm4uY2FsbCggZWxlbXMsIHZhbHVlICk7XG5cdFx0XHRcdGZuID0gbnVsbDtcblxuXHRcdFx0Ly8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnVsayA9IGZuO1xuXHRcdFx0XHRmbiA9IGZ1bmN0aW9uKCBlbGVtLCBrZXksIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiBidWxrLmNhbGwoIGpRdWVyeSggZWxlbSApLCB2YWx1ZSApO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0Zm4oXG5cdFx0XHRcdFx0ZWxlbXNbIGkgXSwga2V5LCByYXcgP1xuXHRcdFx0XHRcdHZhbHVlIDpcblx0XHRcdFx0XHR2YWx1ZS5jYWxsKCBlbGVtc1sgaSBdLCBpLCBmbiggZWxlbXNbIGkgXSwga2V5ICkgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICggY2hhaW5hYmxlICkge1xuXHRcdHJldHVybiBlbGVtcztcblx0fVxuXG5cdC8vIEdldHNcblx0aWYgKCBidWxrICkge1xuXHRcdHJldHVybiBmbi5jYWxsKCBlbGVtcyApO1xuXHR9XG5cblx0cmV0dXJuIGxlbiA/IGZuKCBlbGVtc1sgMCBdLCBrZXkgKSA6IGVtcHR5R2V0O1xufTtcbnZhciBhY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkge1xuXG5cdC8vIEFjY2VwdHMgb25seTpcblx0Ly8gIC0gTm9kZVxuXHQvLyAgICAtIE5vZGUuRUxFTUVOVF9OT0RFXG5cdC8vICAgIC0gTm9kZS5ET0NVTUVOVF9OT0RFXG5cdC8vICAtIE9iamVjdFxuXHQvLyAgICAtIEFueVxuXHRyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7XG59O1xuXG5cblxuXG5mdW5jdGlvbiBEYXRhKCkge1xuXHR0aGlzLmV4cGFuZG8gPSBqUXVlcnkuZXhwYW5kbyArIERhdGEudWlkKys7XG59XG5cbkRhdGEudWlkID0gMTtcblxuRGF0YS5wcm90b3R5cGUgPSB7XG5cblx0Y2FjaGU6IGZ1bmN0aW9uKCBvd25lciApIHtcblxuXHRcdC8vIENoZWNrIGlmIHRoZSBvd25lciBvYmplY3QgYWxyZWFkeSBoYXMgYSBjYWNoZVxuXHRcdHZhciB2YWx1ZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblxuXHRcdC8vIElmIG5vdCwgY3JlYXRlIG9uZVxuXHRcdGlmICggIXZhbHVlICkge1xuXHRcdFx0dmFsdWUgPSB7fTtcblxuXHRcdFx0Ly8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsXG5cdFx0XHQvLyBidXQgd2Ugc2hvdWxkIG5vdCwgc2VlICM4MzM1LlxuXHRcdFx0Ly8gQWx3YXlzIHJldHVybiBhbiBlbXB0eSBvYmplY3QuXG5cdFx0XHRpZiAoIGFjY2VwdERhdGEoIG93bmVyICkgKSB7XG5cblx0XHRcdFx0Ly8gSWYgaXQgaXMgYSBub2RlIHVubGlrZWx5IHRvIGJlIHN0cmluZ2lmeS1lZCBvciBsb29wZWQgb3ZlclxuXHRcdFx0XHQvLyB1c2UgcGxhaW4gYXNzaWdubWVudFxuXHRcdFx0XHRpZiAoIG93bmVyLm5vZGVUeXBlICkge1xuXHRcdFx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSA9IHZhbHVlO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBzZWN1cmUgaXQgaW4gYSBub24tZW51bWVyYWJsZSBwcm9wZXJ0eVxuXHRcdFx0XHQvLyBjb25maWd1cmFibGUgbXVzdCBiZSB0cnVlIHRvIGFsbG93IHRoZSBwcm9wZXJ0eSB0byBiZVxuXHRcdFx0XHQvLyBkZWxldGVkIHdoZW4gZGF0YSBpcyByZW1vdmVkXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBvd25lciwgdGhpcy5leHBhbmRvLCB7XG5cdFx0XHRcdFx0XHR2YWx1ZTogdmFsdWUsXG5cdFx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWVcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH0sXG5cdHNldDogZnVuY3Rpb24oIG93bmVyLCBkYXRhLCB2YWx1ZSApIHtcblx0XHR2YXIgcHJvcCxcblx0XHRcdGNhY2hlID0gdGhpcy5jYWNoZSggb3duZXIgKTtcblxuXHRcdC8vIEhhbmRsZTogWyBvd25lciwga2V5LCB2YWx1ZSBdIGFyZ3Ncblx0XHQvLyBBbHdheXMgdXNlIGNhbWVsQ2FzZSBrZXkgKGdoLTIyNTcpXG5cdFx0aWYgKCB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGNhY2hlWyBqUXVlcnkuY2FtZWxDYXNlKCBkYXRhICkgXSA9IHZhbHVlO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3Ncblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBDb3B5IHRoZSBwcm9wZXJ0aWVzIG9uZS1ieS1vbmUgdG8gdGhlIGNhY2hlIG9iamVjdFxuXHRcdFx0Zm9yICggcHJvcCBpbiBkYXRhICkge1xuXHRcdFx0XHRjYWNoZVsgalF1ZXJ5LmNhbWVsQ2FzZSggcHJvcCApIF0gPSBkYXRhWyBwcm9wIF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBjYWNoZTtcblx0fSxcblx0Z2V0OiBmdW5jdGlvbiggb3duZXIsIGtleSApIHtcblx0XHRyZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgP1xuXHRcdFx0dGhpcy5jYWNoZSggb3duZXIgKSA6XG5cblx0XHRcdC8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1Nylcblx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSAmJiBvd25lclsgdGhpcy5leHBhbmRvIF1bIGpRdWVyeS5jYW1lbENhc2UoIGtleSApIF07XG5cdH0sXG5cdGFjY2VzczogZnVuY3Rpb24oIG93bmVyLCBrZXksIHZhbHVlICkge1xuXG5cdFx0Ly8gSW4gY2FzZXMgd2hlcmUgZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBObyBrZXkgd2FzIHNwZWNpZmllZFxuXHRcdC8vICAgMi4gQSBzdHJpbmcga2V5IHdhcyBzcGVjaWZpZWQsIGJ1dCBubyB2YWx1ZSBwcm92aWRlZFxuXHRcdC8vXG5cdFx0Ly8gVGFrZSB0aGUgXCJyZWFkXCIgcGF0aCBhbmQgYWxsb3cgdGhlIGdldCBtZXRob2QgdG8gZGV0ZXJtaW5lXG5cdFx0Ly8gd2hpY2ggdmFsdWUgdG8gcmV0dXJuLCByZXNwZWN0aXZlbHkgZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBUaGUgZW50aXJlIGNhY2hlIG9iamVjdFxuXHRcdC8vICAgMi4gVGhlIGRhdGEgc3RvcmVkIGF0IHRoZSBrZXlcblx0XHQvL1xuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgfHxcblx0XHRcdFx0KCAoIGtleSAmJiB0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiICkgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5nZXQoIG93bmVyLCBrZXkgKTtcblx0XHR9XG5cblx0XHQvLyBXaGVuIHRoZSBrZXkgaXMgbm90IGEgc3RyaW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vIGFyZSBzcGVjaWZpZWQsIHNldCBvciBleHRlbmQgKGV4aXN0aW5nIG9iamVjdHMpIHdpdGggZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBBbiBvYmplY3Qgb2YgcHJvcGVydGllc1xuXHRcdC8vICAgMi4gQSBrZXkgYW5kIHZhbHVlXG5cdFx0Ly9cblx0XHR0aGlzLnNldCggb3duZXIsIGtleSwgdmFsdWUgKTtcblxuXHRcdC8vIFNpbmNlIHRoZSBcInNldFwiIHBhdGggY2FuIGhhdmUgdHdvIHBvc3NpYmxlIGVudHJ5IHBvaW50c1xuXHRcdC8vIHJldHVybiB0aGUgZXhwZWN0ZWQgZGF0YSBiYXNlZCBvbiB3aGljaCBwYXRoIHdhcyB0YWtlblsqXVxuXHRcdHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrZXk7XG5cdH0sXG5cdHJlbW92ZTogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7XG5cdFx0dmFyIGksXG5cdFx0XHRjYWNoZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblxuXHRcdGlmICggY2FjaGUgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIGtleSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0IGFycmF5IG9yIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcgb2Yga2V5c1xuXHRcdFx0aWYgKCBqUXVlcnkuaXNBcnJheSgga2V5ICkgKSB7XG5cblx0XHRcdFx0Ly8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHNldCBjYW1lbENhc2Uga2V5cywgc28gcmVtb3ZlIHRoYXQuXG5cdFx0XHRcdGtleSA9IGtleS5tYXAoIGpRdWVyeS5jYW1lbENhc2UgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGtleSA9IGpRdWVyeS5jYW1lbENhc2UoIGtleSApO1xuXG5cdFx0XHRcdC8vIElmIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMsIHVzZSBpdC5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCBjcmVhdGUgYW4gYXJyYXkgYnkgbWF0Y2hpbmcgbm9uLXdoaXRlc3BhY2Vcblx0XHRcdFx0a2V5ID0ga2V5IGluIGNhY2hlID9cblx0XHRcdFx0XHRbIGtleSBdIDpcblx0XHRcdFx0XHQoIGtleS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdICk7XG5cdFx0XHR9XG5cblx0XHRcdGkgPSBrZXkubGVuZ3RoO1xuXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0ZGVsZXRlIGNhY2hlWyBrZXlbIGkgXSBdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSB0aGUgZXhwYW5kbyBpZiB0aGVyZSdzIG5vIG1vcmUgZGF0YVxuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgfHwgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGNhY2hlICkgKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDVcblx0XHRcdC8vIFdlYmtpdCAmIEJsaW5rIHBlcmZvcm1hbmNlIHN1ZmZlcnMgd2hlbiBkZWxldGluZyBwcm9wZXJ0aWVzXG5cdFx0XHQvLyBmcm9tIERPTSBub2Rlcywgc28gc2V0IHRvIHVuZGVmaW5lZCBpbnN0ZWFkXG5cdFx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNzg2MDcgKGJ1ZyByZXN0cmljdGVkKVxuXHRcdFx0aWYgKCBvd25lci5ub2RlVHlwZSApIHtcblx0XHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdW5kZWZpbmVkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVsZXRlIG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdGhhc0RhdGE6IGZ1bmN0aW9uKCBvd25lciApIHtcblx0XHR2YXIgY2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cdFx0cmV0dXJuIGNhY2hlICE9PSB1bmRlZmluZWQgJiYgIWpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApO1xuXHR9XG59O1xudmFyIGRhdGFQcml2ID0gbmV3IERhdGEoKTtcblxudmFyIGRhdGFVc2VyID0gbmV3IERhdGEoKTtcblxuXG5cbi8vXHRJbXBsZW1lbnRhdGlvbiBTdW1tYXJ5XG4vL1xuLy9cdDEuIEVuZm9yY2UgQVBJIHN1cmZhY2UgYW5kIHNlbWFudGljIGNvbXBhdGliaWxpdHkgd2l0aCAxLjkueCBicmFuY2hcbi8vXHQyLiBJbXByb3ZlIHRoZSBtb2R1bGUncyBtYWludGFpbmFiaWxpdHkgYnkgcmVkdWNpbmcgdGhlIHN0b3JhZ2Vcbi8vXHRcdHBhdGhzIHRvIGEgc2luZ2xlIG1lY2hhbmlzbS5cbi8vXHQzLiBVc2UgdGhlIHNhbWUgc2luZ2xlIG1lY2hhbmlzbSB0byBzdXBwb3J0IFwicHJpdmF0ZVwiIGFuZCBcInVzZXJcIiBkYXRhLlxuLy9cdDQuIF9OZXZlcl8gZXhwb3NlIFwicHJpdmF0ZVwiIGRhdGEgdG8gdXNlciBjb2RlIChUT0RPOiBEcm9wIF9kYXRhLCBfcmVtb3ZlRGF0YSlcbi8vXHQ1LiBBdm9pZCBleHBvc2luZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9uIHVzZXIgb2JqZWN0cyAoZWcuIGV4cGFuZG8gcHJvcGVydGllcylcbi8vXHQ2LiBQcm92aWRlIGEgY2xlYXIgcGF0aCBmb3IgaW1wbGVtZW50YXRpb24gdXBncmFkZSB0byBXZWFrTWFwIGluIDIwMTRcblxudmFyIHJicmFjZSA9IC9eKD86XFx7W1xcd1xcV10qXFx9fFxcW1tcXHdcXFddKlxcXSkkLyxcblx0cm11bHRpRGFzaCA9IC9bQS1aXS9nO1xuXG5mdW5jdGlvbiBnZXREYXRhKCBkYXRhICkge1xuXHRpZiAoIGRhdGEgPT09IFwidHJ1ZVwiICkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0aWYgKCBkYXRhID09PSBcImZhbHNlXCIgKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0aWYgKCBkYXRhID09PSBcIm51bGxcIiApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nXG5cdGlmICggZGF0YSA9PT0gK2RhdGEgKyBcIlwiICkge1xuXHRcdHJldHVybiArZGF0YTtcblx0fVxuXG5cdGlmICggcmJyYWNlLnRlc3QoIGRhdGEgKSApIHtcblx0XHRyZXR1cm4gSlNPTi5wYXJzZSggZGF0YSApO1xuXHR9XG5cblx0cmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIGRhdGFBdHRyKCBlbGVtLCBrZXksIGRhdGEgKSB7XG5cdHZhciBuYW1lO1xuXG5cdC8vIElmIG5vdGhpbmcgd2FzIGZvdW5kIGludGVybmFsbHksIHRyeSB0byBmZXRjaCBhbnlcblx0Ly8gZGF0YSBmcm9tIHRoZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlXG5cdGlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0bmFtZSA9IFwiZGF0YS1cIiArIGtleS5yZXBsYWNlKCBybXVsdGlEYXNoLCBcIi0kJlwiICkudG9Mb3dlckNhc2UoKTtcblx0XHRkYXRhID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTtcblxuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRkYXRhID0gZ2V0RGF0YSggZGF0YSApO1xuXHRcdFx0fSBjYXRjaCAoIGUgKSB7fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXJcblx0XHRcdGRhdGFVc2VyLnNldCggZWxlbSwga2V5LCBkYXRhICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBkYXRhO1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdGhhc0RhdGE6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkYXRhVXNlci5oYXNEYXRhKCBlbGVtICkgfHwgZGF0YVByaXYuaGFzRGF0YSggZWxlbSApO1xuXHR9LFxuXG5cdGRhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkge1xuXHRcdHJldHVybiBkYXRhVXNlci5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTtcblx0fSxcblxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0XHRkYXRhVXNlci5yZW1vdmUoIGVsZW0sIG5hbWUgKTtcblx0fSxcblxuXHQvLyBUT0RPOiBOb3cgdGhhdCBhbGwgY2FsbHMgdG8gX2RhdGEgYW5kIF9yZW1vdmVEYXRhIGhhdmUgYmVlbiByZXBsYWNlZFxuXHQvLyB3aXRoIGRpcmVjdCBjYWxscyB0byBkYXRhUHJpdiBtZXRob2RzLCB0aGVzZSBjYW4gYmUgZGVwcmVjYXRlZC5cblx0X2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkge1xuXHRcdHJldHVybiBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTtcblx0fSxcblxuXHRfcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBuYW1lICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHR2YXIgaSwgbmFtZSwgZGF0YSxcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRhdHRycyA9IGVsZW0gJiYgZWxlbS5hdHRyaWJ1dGVzO1xuXG5cdFx0Ly8gR2V0cyBhbGwgdmFsdWVzXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggdGhpcy5sZW5ndGggKSB7XG5cdFx0XHRcdGRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0gKTtcblxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWRhdGFQcml2LmdldCggZWxlbSwgXCJoYXNEYXRhQXR0cnNcIiApICkge1xuXHRcdFx0XHRcdGkgPSBhdHRycy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDExIG9ubHlcblx0XHRcdFx0XHRcdC8vIFRoZSBhdHRycyBlbGVtZW50cyBjYW4gYmUgbnVsbCAoIzE0ODk0KVxuXHRcdFx0XHRcdFx0aWYgKCBhdHRyc1sgaSBdICkge1xuXHRcdFx0XHRcdFx0XHRuYW1lID0gYXR0cnNbIGkgXS5uYW1lO1xuXHRcdFx0XHRcdFx0XHRpZiAoIG5hbWUuaW5kZXhPZiggXCJkYXRhLVwiICkgPT09IDAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0bmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUuc2xpY2UoIDUgKSApO1xuXHRcdFx0XHRcdFx0XHRcdGRhdGFBdHRyKCBlbGVtLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9XG5cblx0XHQvLyBTZXRzIG11bHRpcGxlIHZhbHVlc1xuXHRcdGlmICggdHlwZW9mIGtleSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGtleSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBkYXRhO1xuXG5cdFx0XHQvLyBUaGUgY2FsbGluZyBqUXVlcnkgb2JqZWN0IChlbGVtZW50IG1hdGNoZXMpIGlzIG5vdCBlbXB0eVxuXHRcdFx0Ly8gKGFuZCB0aGVyZWZvcmUgaGFzIGFuIGVsZW1lbnQgYXBwZWFycyBhdCB0aGlzWyAwIF0pIGFuZCB0aGVcblx0XHRcdC8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0XG5cdFx0XHQvLyB3aWxsIHJlc3VsdCBpbiBgdW5kZWZpbmVkYCBmb3IgZWxlbSA9IHRoaXNbIDAgXSB3aGljaCB3aWxsXG5cdFx0XHQvLyB0aHJvdyBhbiBleGNlcHRpb24gaWYgYW4gYXR0ZW1wdCB0byByZWFkIGEgZGF0YSBjYWNoZSBpcyBtYWRlLlxuXHRcdFx0aWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZVxuXHRcdFx0XHQvLyBUaGUga2V5IHdpbGwgYWx3YXlzIGJlIGNhbWVsQ2FzZWQgaW4gRGF0YVxuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtLCBrZXkgKTtcblx0XHRcdFx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIFwiZGlzY292ZXJcIiB0aGUgZGF0YSBpblxuXHRcdFx0XHQvLyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzXG5cdFx0XHRcdGRhdGEgPSBkYXRhQXR0ciggZWxlbSwga2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LlxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCB0aGUgZGF0YS4uLlxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBXZSBhbHdheXMgc3RvcmUgdGhlIGNhbWVsQ2FzZWQga2V5XG5cdFx0XHRcdGRhdGFVc2VyLnNldCggdGhpcywga2V5LCB2YWx1ZSApO1xuXHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgdHJ1ZSApO1xuXHR9LFxuXG5cdHJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkYXRhVXNlci5yZW1vdmUoIHRoaXMsIGtleSApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBxdWV1ZTtcblxuXHRcdGlmICggZWxlbSApIHtcblx0XHRcdHR5cGUgPSAoIHR5cGUgfHwgXCJmeFwiICkgKyBcInF1ZXVlXCI7XG5cdFx0XHRxdWV1ZSA9IGRhdGFQcml2LmdldCggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHQvLyBTcGVlZCB1cCBkZXF1ZXVlIGJ5IGdldHRpbmcgb3V0IHF1aWNrbHkgaWYgdGhpcyBpcyBqdXN0IGEgbG9va3VwXG5cdFx0XHRpZiAoIGRhdGEgKSB7XG5cdFx0XHRcdGlmICggIXF1ZXVlIHx8IGpRdWVyeS5pc0FycmF5KCBkYXRhICkgKSB7XG5cdFx0XHRcdFx0cXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHF1ZXVlLnB1c2goIGRhdGEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHF1ZXVlIHx8IFtdO1xuXHRcdH1cblx0fSxcblxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0XHR2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSxcblx0XHRcdHN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLFxuXHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpLFxuXHRcdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIHR5cGUgKSxcblx0XHRcdG5leHQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTtcblx0XHRcdH07XG5cblx0XHQvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUgdGhlIHByb2dyZXNzIHNlbnRpbmVsXG5cdFx0aWYgKCBmbiA9PT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCk7XG5cdFx0XHRzdGFydExlbmd0aC0tO1xuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cblx0XHRcdC8vIEFkZCBhIHByb2dyZXNzIHNlbnRpbmVsIHRvIHByZXZlbnQgdGhlIGZ4IHF1ZXVlIGZyb20gYmVpbmdcblx0XHRcdC8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWRcblx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICkge1xuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KCBcImlucHJvZ3Jlc3NcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDbGVhciB1cCB0aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1bmN0aW9uXG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdGZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhc3RhcnRMZW5ndGggJiYgaG9va3MgKSB7XG5cdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIE5vdCBwdWJsaWMgLSBnZW5lcmF0ZSBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciByZXR1cm4gdGhlIGN1cnJlbnQgb25lXG5cdF9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR2YXIga2V5ID0gdHlwZSArIFwicXVldWVIb29rc1wiO1xuXHRcdHJldHVybiBkYXRhUHJpdi5nZXQoIGVsZW0sIGtleSApIHx8IGRhdGFQcml2LmFjY2VzcyggZWxlbSwga2V5LCB7XG5cdFx0XHRlbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICkuYWRkKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBbIHR5cGUgKyBcInF1ZXVlXCIsIGtleSBdICk7XG5cdFx0XHR9IClcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHNldHRlciA9IDI7XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZGF0YSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gXCJmeFwiO1xuXHRcdFx0c2V0dGVyLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoIDwgc2V0dGVyICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzIDpcblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlXG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggdGhpcywgdHlwZSApO1xuXG5cdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICYmIHF1ZXVlWyAwIF0gIT09IFwiaW5wcm9ncmVzc1wiICkge1xuXHRcdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0fSxcblx0ZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdH0gKTtcblx0fSxcblx0Y2xlYXJRdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHR9LFxuXG5cdC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGVcblx0Ly8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpXG5cdHByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7XG5cdFx0dmFyIHRtcCxcblx0XHRcdGNvdW50ID0gMSxcblx0XHRcdGRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRlbGVtZW50cyA9IHRoaXMsXG5cdFx0XHRpID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRyZXNvbHZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggISggLS1jb3VudCApICkge1xuXHRcdFx0XHRcdGRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b2JqID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG1wID0gZGF0YVByaXYuZ2V0KCBlbGVtZW50c1sgaSBdLCB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgKTtcblx0XHRcdGlmICggdG1wICYmIHRtcC5lbXB0eSApIHtcblx0XHRcdFx0Y291bnQrKztcblx0XHRcdFx0dG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXNvbHZlKCk7XG5cdFx0cmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApO1xuXHR9XG59ICk7XG52YXIgcG51bSA9ICggL1srLV0/KD86XFxkKlxcLnwpXFxkKyg/OltlRV1bKy1dP1xcZCt8KS8gKS5zb3VyY2U7XG5cbnZhciByY3NzTnVtID0gbmV3IFJlZ0V4cCggXCJeKD86KFsrLV0pPXwpKFwiICsgcG51bSArIFwiKShbYS16JV0qKSRcIiwgXCJpXCIgKTtcblxuXG52YXIgY3NzRXhwYW5kID0gWyBcIlRvcFwiLCBcIlJpZ2h0XCIsIFwiQm90dG9tXCIsIFwiTGVmdFwiIF07XG5cbnZhciBpc0hpZGRlbldpdGhpblRyZWUgPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7XG5cblx0XHQvLyBpc0hpZGRlbldpdGhpblRyZWUgbWlnaHQgYmUgY2FsbGVkIGZyb20galF1ZXJ5I2ZpbHRlciBmdW5jdGlvbjtcblx0XHQvLyBpbiB0aGF0IGNhc2UsIGVsZW1lbnQgd2lsbCBiZSBzZWNvbmQgYXJndW1lbnRcblx0XHRlbGVtID0gZWwgfHwgZWxlbTtcblxuXHRcdC8vIElubGluZSBzdHlsZSB0cnVtcHMgYWxsXG5cdFx0cmV0dXJuIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIgfHxcblx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJlxuXG5cdFx0XHQvLyBPdGhlcndpc2UsIGNoZWNrIGNvbXB1dGVkIHN0eWxlXG5cdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDMgLSA0NVxuXHRcdFx0Ly8gRGlzY29ubmVjdGVkIGVsZW1lbnRzIGNhbiBoYXZlIGNvbXB1dGVkIGRpc3BsYXk6IG5vbmUsIHNvIGZpcnN0IGNvbmZpcm0gdGhhdCBlbGVtIGlzXG5cdFx0XHQvLyBpbiB0aGUgZG9jdW1lbnQuXG5cdFx0XHRqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICYmXG5cblx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgPT09IFwibm9uZVwiO1xuXHR9O1xuXG52YXIgc3dhcCA9IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBjYWxsYmFjaywgYXJncyApIHtcblx0dmFyIHJldCwgbmFtZSxcblx0XHRvbGQgPSB7fTtcblxuXHQvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXNcblx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdG9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdO1xuXHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTtcblx0fVxuXG5cdHJldCA9IGNhbGxiYWNrLmFwcGx5KCBlbGVtLCBhcmdzIHx8IFtdICk7XG5cblx0Ly8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzXG5cdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTtcblx0fVxuXG5cdHJldHVybiByZXQ7XG59O1xuXG5cblxuXG5mdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0sIHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkge1xuXHR2YXIgYWRqdXN0ZWQsXG5cdFx0c2NhbGUgPSAxLFxuXHRcdG1heEl0ZXJhdGlvbnMgPSAyMCxcblx0XHRjdXJyZW50VmFsdWUgPSB0d2VlbiA/XG5cdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuLmN1cigpO1xuXHRcdFx0fSA6XG5cdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AsIFwiXCIgKTtcblx0XHRcdH0sXG5cdFx0aW5pdGlhbCA9IGN1cnJlbnRWYWx1ZSgpLFxuXHRcdHVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKSxcblxuXHRcdC8vIFN0YXJ0aW5nIHZhbHVlIGNvbXB1dGF0aW9uIGlzIHJlcXVpcmVkIGZvciBwb3RlbnRpYWwgdW5pdCBtaXNtYXRjaGVzXG5cdFx0aW5pdGlhbEluVW5pdCA9ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdIHx8IHVuaXQgIT09IFwicHhcIiAmJiAraW5pdGlhbCApICYmXG5cdFx0XHRyY3NzTnVtLmV4ZWMoIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AgKSApO1xuXG5cdGlmICggaW5pdGlhbEluVW5pdCAmJiBpbml0aWFsSW5Vbml0WyAzIF0gIT09IHVuaXQgKSB7XG5cblx0XHQvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzXG5cdFx0dW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvblxuXHRcdHZhbHVlUGFydHMgPSB2YWx1ZVBhcnRzIHx8IFtdO1xuXG5cdFx0Ly8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJvbSBhIG5vbnplcm8gc3RhcnRpbmcgcG9pbnRcblx0XHRpbml0aWFsSW5Vbml0ID0gK2luaXRpYWwgfHwgMTtcblxuXHRcdGRvIHtcblxuXHRcdFx0Ly8gSWYgcHJldmlvdXMgaXRlcmF0aW9uIHplcm9lZCBvdXQsIGRvdWJsZSB1bnRpbCB3ZSBnZXQgKnNvbWV0aGluZyouXG5cdFx0XHQvLyBVc2Ugc3RyaW5nIGZvciBkb3VibGluZyBzbyB3ZSBkb24ndCBhY2NpZGVudGFsbHkgc2VlIHNjYWxlIGFzIHVuY2hhbmdlZCBiZWxvd1xuXHRcdFx0c2NhbGUgPSBzY2FsZSB8fCBcIi41XCI7XG5cblx0XHRcdC8vIEFkanVzdCBhbmQgYXBwbHlcblx0XHRcdGluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7XG5cdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIGluaXRpYWxJblVuaXQgKyB1bml0ICk7XG5cblx0XHQvLyBVcGRhdGUgc2NhbGUsIHRvbGVyYXRpbmcgemVybyBvciBOYU4gZnJvbSB0d2Vlbi5jdXIoKVxuXHRcdC8vIEJyZWFrIHRoZSBsb29wIGlmIHNjYWxlIGlzIHVuY2hhbmdlZCBvciBwZXJmZWN0LCBvciBpZiB3ZSd2ZSBqdXN0IGhhZCBlbm91Z2guXG5cdFx0fSB3aGlsZSAoXG5cdFx0XHRzY2FsZSAhPT0gKCBzY2FsZSA9IGN1cnJlbnRWYWx1ZSgpIC8gaW5pdGlhbCApICYmIHNjYWxlICE9PSAxICYmIC0tbWF4SXRlcmF0aW9uc1xuXHRcdCk7XG5cdH1cblxuXHRpZiAoIHZhbHVlUGFydHMgKSB7XG5cdFx0aW5pdGlhbEluVW5pdCA9ICtpbml0aWFsSW5Vbml0IHx8ICtpbml0aWFsIHx8IDA7XG5cblx0XHQvLyBBcHBseSByZWxhdGl2ZSBvZmZzZXQgKCs9Ly09KSBpZiBzcGVjaWZpZWRcblx0XHRhZGp1c3RlZCA9IHZhbHVlUGFydHNbIDEgXSA/XG5cdFx0XHRpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOlxuXHRcdFx0K3ZhbHVlUGFydHNbIDIgXTtcblx0XHRpZiAoIHR3ZWVuICkge1xuXHRcdFx0dHdlZW4udW5pdCA9IHVuaXQ7XG5cdFx0XHR0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7XG5cdFx0XHR0d2Vlbi5lbmQgPSBhZGp1c3RlZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFkanVzdGVkO1xufVxuXG5cbnZhciBkZWZhdWx0RGlzcGxheU1hcCA9IHt9O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0RGlzcGxheSggZWxlbSApIHtcblx0dmFyIHRlbXAsXG5cdFx0ZG9jID0gZWxlbS5vd25lckRvY3VtZW50LFxuXHRcdG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZSxcblx0XHRkaXNwbGF5ID0gZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF07XG5cblx0aWYgKCBkaXNwbGF5ICkge1xuXHRcdHJldHVybiBkaXNwbGF5O1xuXHR9XG5cblx0dGVtcCA9IGRvYy5ib2R5LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKSApO1xuXHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggdGVtcCwgXCJkaXNwbGF5XCIgKTtcblxuXHR0ZW1wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRlbXAgKTtcblxuXHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdGRpc3BsYXkgPSBcImJsb2NrXCI7XG5cdH1cblx0ZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF0gPSBkaXNwbGF5O1xuXG5cdHJldHVybiBkaXNwbGF5O1xufVxuXG5mdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7XG5cdHZhciBkaXNwbGF5LCBlbGVtLFxuXHRcdHZhbHVlcyA9IFtdLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG5cblx0Ly8gRGV0ZXJtaW5lIG5ldyBkaXNwbGF5IHZhbHVlIGZvciBlbGVtZW50cyB0aGF0IG5lZWQgdG8gY2hhbmdlXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdO1xuXHRcdGlmICggIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5O1xuXHRcdGlmICggc2hvdyApIHtcblxuXHRcdFx0Ly8gU2luY2Ugd2UgZm9yY2UgdmlzaWJpbGl0eSB1cG9uIGNhc2NhZGUtaGlkZGVuIGVsZW1lbnRzLCBhbiBpbW1lZGlhdGUgKGFuZCBzbG93KVxuXHRcdFx0Ly8gY2hlY2sgaXMgcmVxdWlyZWQgaW4gdGhpcyBmaXJzdCBsb29wIHVubGVzcyB3ZSBoYXZlIGEgbm9uZW1wdHkgZGlzcGxheSB2YWx1ZSAoZWl0aGVyXG5cdFx0XHQvLyBpbmxpbmUgb3IgYWJvdXQtdG8tYmUtcmVzdG9yZWQpXG5cdFx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBkYXRhUHJpdi5nZXQoIGVsZW0sIFwiZGlzcGxheVwiICkgfHwgbnVsbDtcblx0XHRcdFx0aWYgKCAhdmFsdWVzWyBpbmRleCBdICkge1xuXHRcdFx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICggZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBnZXREZWZhdWx0RGlzcGxheSggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIGRpc3BsYXkgIT09IFwibm9uZVwiICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBcIm5vbmVcIjtcblxuXHRcdFx0XHQvLyBSZW1lbWJlciB3aGF0IHdlJ3JlIG92ZXJ3cml0aW5nXG5cdFx0XHRcdGRhdGFQcml2LnNldCggZWxlbSwgXCJkaXNwbGF5XCIsIGRpc3BsYXkgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AgdG8gYXZvaWQgY29uc3RhbnQgcmVmbG93XG5cdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0aWYgKCB2YWx1ZXNbIGluZGV4IF0gIT0gbnVsbCApIHtcblx0XHRcdGVsZW1lbnRzWyBpbmRleCBdLnN0eWxlLmRpc3BsYXkgPSB2YWx1ZXNbIGluZGV4IF07XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnRzO1xufVxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHNob3c6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApO1xuXHR9LFxuXHRoaWRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMgKTtcblx0fSxcblx0dG9nZ2xlOiBmdW5jdGlvbiggc3RhdGUgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGUgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0cmV0dXJuIHN0YXRlID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggaXNIaWRkZW5XaXRoaW5UcmVlKCB0aGlzICkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnNob3coKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcbnZhciByY2hlY2thYmxlVHlwZSA9ICggL14oPzpjaGVja2JveHxyYWRpbykkL2kgKTtcblxudmFyIHJ0YWdOYW1lID0gKCAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSspL2kgKTtcblxudmFyIHJzY3JpcHRUeXBlID0gKCAvXiR8XFwvKD86amF2YXxlY21hKXNjcmlwdC9pICk7XG5cblxuXG4vLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKVxudmFyIHdyYXBNYXAgPSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0b3B0aW9uOiBbIDEsIFwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPlwiLCBcIjwvc2VsZWN0PlwiIF0sXG5cblx0Ly8gWEhUTUwgcGFyc2VycyBkbyBub3QgbWFnaWNhbGx5IGluc2VydCBlbGVtZW50cyBpbiB0aGVcblx0Ly8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlblxuXHQvLyB0aGlzIGJ5IG9taXR0aW5nIDx0Ym9keT4gb3Igb3RoZXIgcmVxdWlyZWQgZWxlbWVudHMuXG5cdHRoZWFkOiBbIDEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCIgXSxcblx0Y29sOiBbIDIsIFwiPHRhYmxlPjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCIgXSxcblx0dHI6IFsgMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXHR0ZDogWyAzLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiIF0sXG5cblx0X2RlZmF1bHQ6IFsgMCwgXCJcIiwgXCJcIiBdXG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxud3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uO1xuXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xud3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG5cblxuZnVuY3Rpb24gZ2V0QWxsKCBjb250ZXh0LCB0YWcgKSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHQvLyBVc2UgdHlwZW9mIHRvIGF2b2lkIHplcm8tYXJndW1lbnQgbWV0aG9kIGludm9jYXRpb24gb24gaG9zdCBvYmplY3RzICgjMTUxNTEpXG5cdHZhciByZXQ7XG5cblx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRyZXQgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgfHwgXCIqXCIgKTtcblxuXHR9IGVsc2UgaWYgKCB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdHJldCA9IGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnIHx8IFwiKlwiICk7XG5cblx0fSBlbHNlIHtcblx0XHRyZXQgPSBbXTtcblx0fVxuXG5cdGlmICggdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIGpRdWVyeS5ub2RlTmFtZSggY29udGV4dCwgdGFnICkgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5tZXJnZSggWyBjb250ZXh0IF0sIHJldCApO1xuXHR9XG5cblx0cmV0dXJuIHJldDtcbn1cblxuXG4vLyBNYXJrIHNjcmlwdHMgYXMgaGF2aW5nIGFscmVhZHkgYmVlbiBldmFsdWF0ZWRcbmZ1bmN0aW9uIHNldEdsb2JhbEV2YWwoIGVsZW1zLCByZWZFbGVtZW50cyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdGRhdGFQcml2LnNldChcblx0XHRcdGVsZW1zWyBpIF0sXG5cdFx0XHRcImdsb2JhbEV2YWxcIixcblx0XHRcdCFyZWZFbGVtZW50cyB8fCBkYXRhUHJpdi5nZXQoIHJlZkVsZW1lbnRzWyBpIF0sIFwiZ2xvYmFsRXZhbFwiIClcblx0XHQpO1xuXHR9XG59XG5cblxudmFyIHJodG1sID0gLzx8JiM/XFx3KzsvO1xuXG5mdW5jdGlvbiBidWlsZEZyYWdtZW50KCBlbGVtcywgY29udGV4dCwgc2NyaXB0cywgc2VsZWN0aW9uLCBpZ25vcmVkICkge1xuXHR2YXIgZWxlbSwgdG1wLCB0YWcsIHdyYXAsIGNvbnRhaW5zLCBqLFxuXHRcdGZyYWdtZW50ID0gY29udGV4dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG5cdFx0bm9kZXMgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsID0gZWxlbXMubGVuZ3RoO1xuXG5cdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRlbGVtID0gZWxlbXNbIGkgXTtcblxuXHRcdGlmICggZWxlbSB8fCBlbGVtID09PSAwICkge1xuXG5cdFx0XHQvLyBBZGQgbm9kZXMgZGlyZWN0bHlcblx0XHRcdGlmICggalF1ZXJ5LnR5cGUoIGVsZW0gKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCBlbGVtLm5vZGVUeXBlID8gWyBlbGVtIF0gOiBlbGVtICk7XG5cblx0XHRcdC8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZVxuXHRcdFx0fSBlbHNlIGlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHtcblx0XHRcdFx0bm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7XG5cblx0XHRcdC8vIENvbnZlcnQgaHRtbCBpbnRvIERPTSBub2Rlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dG1wID0gdG1wIHx8IGZyYWdtZW50LmFwcGVuZENoaWxkKCBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApO1xuXG5cdFx0XHRcdC8vIERlc2VyaWFsaXplIGEgc3RhbmRhcmQgcmVwcmVzZW50YXRpb25cblx0XHRcdFx0dGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdHdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0O1xuXHRcdFx0XHR0bXAuaW5uZXJIVE1MID0gd3JhcFsgMSBdICsgalF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIGVsZW0gKSArIHdyYXBbIDIgXTtcblxuXHRcdFx0XHQvLyBEZXNjZW5kIHRocm91Z2ggd3JhcHBlcnMgdG8gdGhlIHJpZ2h0IGNvbnRlbnRcblx0XHRcdFx0aiA9IHdyYXBbIDAgXTtcblx0XHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdFx0dG1wID0gdG1wLmxhc3RDaGlsZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7XG5cblx0XHRcdFx0Ly8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXJcblx0XHRcdFx0dG1wID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdFx0XHQvLyBFbnN1cmUgdGhlIGNyZWF0ZWQgbm9kZXMgYXJlIG9ycGhhbmVkICgjMTIzOTIpXG5cdFx0XHRcdHRtcC50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudFxuXHRmcmFnbWVudC50ZXh0Q29udGVudCA9IFwiXCI7XG5cblx0aSA9IDA7XG5cdHdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7XG5cblx0XHQvLyBTa2lwIGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgY29sbGVjdGlvbiAodHJhYy00MDg3KVxuXHRcdGlmICggc2VsZWN0aW9uICYmIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBzZWxlY3Rpb24gKSA+IC0xICkge1xuXHRcdFx0aWYgKCBpZ25vcmVkICkge1xuXHRcdFx0XHRpZ25vcmVkLnB1c2goIGVsZW0gKTtcblx0XHRcdH1cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnRhaW5zID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblxuXHRcdC8vIEFwcGVuZCB0byBmcmFnbWVudFxuXHRcdHRtcCA9IGdldEFsbCggZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGVsZW0gKSwgXCJzY3JpcHRcIiApO1xuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGlmICggY29udGFpbnMgKSB7XG5cdFx0XHRzZXRHbG9iYWxFdmFsKCB0bXAgKTtcblx0XHR9XG5cblx0XHQvLyBDYXB0dXJlIGV4ZWN1dGFibGVzXG5cdFx0aWYgKCBzY3JpcHRzICkge1xuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHtcblx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBlbGVtLnR5cGUgfHwgXCJcIiApICkge1xuXHRcdFx0XHRcdHNjcmlwdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZyYWdtZW50O1xufVxuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICksXG5cdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5XG5cdC8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpXG5cdC8vIFN1cHBvcnQ6IFdpbmRvd3MgV2ViIEFwcHMgKFdXQSlcblx0Ly8gYG5hbWVgIGFuZCBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICgjMTQ5MDEpXG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwicmFkaW9cIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwiY2hlY2tlZFwiLCBcImNoZWNrZWRcIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcInRcIiApO1xuXG5cdGRpdi5hcHBlbmRDaGlsZCggaW5wdXQgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4xIG9ubHlcblx0Ly8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzXG5cdHN1cHBvcnQuY2hlY2tDbG9uZSA9IGRpdi5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tlZDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gTWFrZSBzdXJlIHRleHRhcmVhIChhbmQgY2hlY2tib3gpIGRlZmF1bHRWYWx1ZSBpcyBwcm9wZXJseSBjbG9uZWRcblx0ZGl2LmlubmVySFRNTCA9IFwiPHRleHRhcmVhPng8L3RleHRhcmVhPlwiO1xuXHRzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gISFkaXYuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTtcbn0gKSgpO1xudmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuXG5cbnZhclxuXHRya2V5RXZlbnQgPSAvXmtleS8sXG5cdHJtb3VzZUV2ZW50ID0gL14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLFxuXHRydHlwZW5hbWVzcGFjZSA9IC9eKFteLl0qKSg/OlxcLiguKyl8KS87XG5cbmZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcblx0cmV0dXJuIGZhbHNlO1xufVxuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gU2VlICMxMzM5MyBmb3IgbW9yZSBpbmZvXG5mdW5jdGlvbiBzYWZlQWN0aXZlRWxlbWVudCgpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblx0fSBjYXRjaCAoIGVyciApIHsgfVxufVxuXG5mdW5jdGlvbiBvbiggZWxlbSwgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgb25lICkge1xuXHR2YXIgb3JpZ0ZuLCB0eXBlO1xuXG5cdC8vIFR5cGVzIGNhbiBiZSBhIG1hcCBvZiB0eXBlcy9oYW5kbGVyc1xuXHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMtT2JqZWN0LCBkYXRhIClcblx0XHRcdGRhdGEgPSBkYXRhIHx8IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRvbiggZWxlbSwgdHlwZSwgc2VsZWN0b3IsIGRhdGEsIHR5cGVzWyB0eXBlIF0sIG9uZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gZWxlbTtcblx0fVxuXG5cdGlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7XG5cblx0XHQvLyAoIHR5cGVzLCBmbiApXG5cdFx0Zm4gPSBzZWxlY3Rvcjtcblx0XHRkYXRhID0gc2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMsIHNlbGVjdG9yLCBmbiApXG5cdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vICggdHlwZXMsIGRhdGEsIGZuIClcblx0XHRcdGZuID0gZGF0YTtcblx0XHRcdGRhdGEgPSBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRpZiAoIGZuID09PSBmYWxzZSApIHtcblx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHR9IGVsc2UgaWYgKCAhZm4gKSB7XG5cdFx0cmV0dXJuIGVsZW07XG5cdH1cblxuXHRpZiAoIG9uZSA9PT0gMSApIHtcblx0XHRvcmlnRm4gPSBmbjtcblx0XHRmbiA9IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdFx0Ly8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvXG5cdFx0XHRqUXVlcnkoKS5vZmYoIGV2ZW50ICk7XG5cdFx0XHRyZXR1cm4gb3JpZ0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9O1xuXG5cdFx0Ly8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm5cblx0XHRmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTtcblx0fVxuXHRyZXR1cm4gZWxlbS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlcywgZm4sIGRhdGEsIHNlbGVjdG9yICk7XG5cdH0gKTtcbn1cblxuLypcbiAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIGV2ZW50cyAtLSBub3QgcGFydCBvZiB0aGUgcHVibGljIGludGVyZmFjZS5cbiAqIFByb3BzIHRvIERlYW4gRWR3YXJkcycgYWRkRXZlbnQgbGlicmFyeSBmb3IgbWFueSBvZiB0aGUgaWRlYXMuXG4gKi9cbmpRdWVyeS5ldmVudCA9IHtcblxuXHRnbG9iYWw6IHt9LFxuXG5cdGFkZDogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBkYXRhLCBzZWxlY3RvciApIHtcblxuXHRcdHZhciBoYW5kbGVPYmpJbiwgZXZlbnRIYW5kbGUsIHRtcCxcblx0XHRcdGV2ZW50cywgdCwgaGFuZGxlT2JqLFxuXHRcdFx0c3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdUeXBlLFxuXHRcdFx0ZWxlbURhdGEgPSBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdC8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpXG5cdFx0aWYgKCAhZWxlbURhdGEgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIG9iamVjdCBvZiBjdXN0b20gZGF0YSBpbiBsaWV1IG9mIHRoZSBoYW5kbGVyXG5cdFx0aWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7XG5cdFx0XHRoYW5kbGVPYmpJbiA9IGhhbmRsZXI7XG5cdFx0XHRoYW5kbGVyID0gaGFuZGxlT2JqSW4uaGFuZGxlcjtcblx0XHRcdHNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7XG5cdFx0fVxuXG5cdFx0Ly8gRW5zdXJlIHRoYXQgaW52YWxpZCBzZWxlY3RvcnMgdGhyb3cgZXhjZXB0aW9ucyBhdCBhdHRhY2ggdGltZVxuXHRcdC8vIEV2YWx1YXRlIGFnYWluc3QgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgZWxlbSBpcyBhIG5vbi1lbGVtZW50IG5vZGUgKGUuZy4sIGRvY3VtZW50KVxuXHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGRvY3VtZW50RWxlbWVudCwgc2VsZWN0b3IgKTtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXJcblx0XHRpZiAoICFoYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRoYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrO1xuXHRcdH1cblxuXHRcdC8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUgYW5kIG1haW4gaGFuZGxlciwgaWYgdGhpcyBpcyB0aGUgZmlyc3Rcblx0XHRpZiAoICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0ZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzID0ge307XG5cdFx0fVxuXHRcdGlmICggISggZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgKSApIHtcblx0XHRcdGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7XG5cblx0XHRcdFx0Ly8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmRcblx0XHRcdFx0Ly8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZFxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgP1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2Vcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx5IGhhbmRsZXJzXG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlXG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cblx0XHRcdC8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVyc1xuXHRcdFx0aGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCgge1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRvcmlnVHlwZTogb3JpZ1R5cGUsXG5cdFx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRcdGhhbmRsZXI6IGhhbmRsZXIsXG5cdFx0XHRcdGd1aWQ6IGhhbmRsZXIuZ3VpZCxcblx0XHRcdFx0c2VsZWN0b3I6IHNlbGVjdG9yLFxuXHRcdFx0XHRuZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLFxuXHRcdFx0XHRuYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKVxuXHRcdFx0fSwgaGFuZGxlT2JqSW4gKTtcblxuXHRcdFx0Ly8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZSBpZiB3ZSdyZSB0aGUgZmlyc3Rcblx0XHRcdGlmICggISggaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSApICkge1xuXHRcdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdID0gW107XG5cdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwO1xuXG5cdFx0XHRcdC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZVxuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnNldHVwIHx8XG5cdFx0XHRcdFx0c3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBldmVudEhhbmRsZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNwZWNpYWwuYWRkICkge1xuXHRcdFx0XHRzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblxuXHRcdFx0XHRpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkge1xuXHRcdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnRcblx0XHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uXG5cdFx0XHRqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlO1xuXHRcdH1cblxuXHR9LFxuXG5cdC8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZFR5cGVzICkge1xuXG5cdFx0dmFyIGosIG9yaWdDb3VudCwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKSAmJiBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdGlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE9uY2UgZm9yIGVhY2ggdHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWRcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50XG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdO1xuXHRcdFx0dG1wID0gdG1wWyAyIF0gJiZcblx0XHRcdFx0bmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbiggXCJcXFxcLig/Oi4qXFxcXC58KVwiICkgKyBcIihcXFxcLnwkKVwiICk7XG5cblx0XHRcdC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHNcblx0XHRcdG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTtcblxuXHRcdFx0XHRpZiAoICggbWFwcGVkVHlwZXMgfHwgb3JpZ1R5cGUgPT09IGhhbmRsZU9iai5vcmlnVHlwZSApICYmXG5cdFx0XHRcdFx0KCAhaGFuZGxlciB8fCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgJiZcblx0XHRcdFx0XHQoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmXG5cdFx0XHRcdFx0KCAhc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciB8fFxuXHRcdFx0XHRcdFx0c2VsZWN0b3IgPT09IFwiKipcIiAmJiBoYW5kbGVPYmouc2VsZWN0b3IgKSApIHtcblx0XHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGosIDEgKTtcblxuXHRcdFx0XHRcdGlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudC0tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIHNwZWNpYWwucmVtb3ZlICkge1xuXHRcdFx0XHRcdFx0c3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3Rcblx0XHRcdC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKVxuXHRcdFx0aWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fFxuXHRcdFx0XHRcdHNwZWNpYWwudGVhcmRvd24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRlbGV0ZSBldmVudHNbIHR5cGUgXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgZGF0YSBhbmQgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZFxuXHRcdGlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkge1xuXHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBcImhhbmRsZSBldmVudHNcIiApO1xuXHRcdH1cblx0fSxcblxuXHRkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkge1xuXG5cdFx0Ly8gTWFrZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRpdmUgZXZlbnQgb2JqZWN0XG5cdFx0dmFyIGV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggbmF0aXZlRXZlbnQgKTtcblxuXHRcdHZhciBpLCBqLCByZXQsIG1hdGNoZWQsIGhhbmRsZU9iaiwgaGFuZGxlclF1ZXVlLFxuXHRcdFx0YXJncyA9IG5ldyBBcnJheSggYXJndW1lbnRzLmxlbmd0aCApLFxuXHRcdFx0aGFuZGxlcnMgPSAoIGRhdGFQcml2LmdldCggdGhpcywgXCJldmVudHNcIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8IHt9O1xuXG5cdFx0Ly8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnRcblx0XHRhcmdzWyAwIF0gPSBldmVudDtcblxuXHRcdGZvciAoIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0YXJnc1sgaSBdID0gYXJndW1lbnRzWyBpIF07XG5cdFx0fVxuXG5cdFx0ZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzO1xuXG5cdFx0Ly8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZFxuXHRcdGlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBoYW5kbGVyc1xuXHRcdGhhbmRsZXJRdWV1ZSA9IGpRdWVyeS5ldmVudC5oYW5kbGVycy5jYWxsKCB0aGlzLCBldmVudCwgaGFuZGxlcnMgKTtcblxuXHRcdC8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAoIG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2hlZC5lbGVtO1xuXG5cdFx0XHRqID0gMDtcblx0XHRcdHdoaWxlICggKCBoYW5kbGVPYmogPSBtYXRjaGVkLmhhbmRsZXJzWyBqKysgXSApICYmXG5cdFx0XHRcdCFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXG5cdFx0XHRcdC8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IgMikgaGF2ZSBuYW1lc3BhY2Uocylcblx0XHRcdFx0Ly8gYSBzdWJzZXQgb3IgZXF1YWwgdG8gdGhvc2UgaW4gdGhlIGJvdW5kIGV2ZW50IChib3RoIGNhbiBoYXZlIG5vIG5hbWVzcGFjZSkuXG5cdFx0XHRcdGlmICggIWV2ZW50LnJuYW1lc3BhY2UgfHwgZXZlbnQucm5hbWVzcGFjZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7XG5cblx0XHRcdFx0XHRldmVudC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7XG5cdFx0XHRcdFx0ZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhO1xuXG5cdFx0XHRcdFx0cmV0ID0gKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSApLmhhbmRsZSB8fFxuXHRcdFx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXIgKS5hcHBseSggbWF0Y2hlZC5lbGVtLCBhcmdzICk7XG5cblx0XHRcdFx0XHRpZiAoIHJldCAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJldCApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZVxuXHRcdGlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7XG5cdFx0XHRzcGVjaWFsLnBvc3REaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0aGFuZGxlcnM6IGZ1bmN0aW9uKCBldmVudCwgaGFuZGxlcnMgKSB7XG5cdFx0dmFyIGksIGhhbmRsZU9iaiwgc2VsLCBtYXRjaGVkSGFuZGxlcnMsIG1hdGNoZWRTZWxlY3RvcnMsXG5cdFx0XHRoYW5kbGVyUXVldWUgPSBbXSxcblx0XHRcdGRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LFxuXHRcdFx0Y3VyID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0Ly8gRmluZCBkZWxlZ2F0ZSBoYW5kbGVyc1xuXHRcdGlmICggZGVsZWdhdGVDb3VudCAmJlxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTlcblx0XHRcdC8vIEJsYWNrLWhvbGUgU1ZHIDx1c2U+IGluc3RhbmNlIHRyZWVzICh0cmFjLTEzMTgwKVxuXHRcdFx0Y3VyLm5vZGVUeXBlICYmXG5cblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MlxuXHRcdFx0Ly8gU3VwcHJlc3Mgc3BlYy12aW9sYXRpbmcgY2xpY2tzIGluZGljYXRpbmcgYSBub24tcHJpbWFyeSBwb2ludGVyIGJ1dHRvbiAodHJhYy0zODYxKVxuXHRcdFx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnQtdHlwZS1jbGlja1xuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTEgb25seVxuXHRcdFx0Ly8gLi4uYnV0IG5vdCBhcnJvdyBrZXkgXCJjbGlja3NcIiBvZiByYWRpbyBpbnB1dHMsIHdoaWNoIGNhbiBoYXZlIGBidXR0b25gIC0xIChnaC0yMzQzKVxuXHRcdFx0ISggZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiICYmIGV2ZW50LmJ1dHRvbiA+PSAxICkgKSB7XG5cblx0XHRcdGZvciAoIDsgY3VyICE9PSB0aGlzOyBjdXIgPSBjdXIucGFyZW50Tm9kZSB8fCB0aGlzICkge1xuXG5cdFx0XHRcdC8vIERvbid0IGNoZWNrIG5vbi1lbGVtZW50cyAoIzEzMjA4KVxuXHRcdFx0XHQvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NClcblx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPT09IDEgJiYgISggZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiICYmIGN1ci5kaXNhYmxlZCA9PT0gdHJ1ZSApICkge1xuXHRcdFx0XHRcdG1hdGNoZWRIYW5kbGVycyA9IFtdO1xuXHRcdFx0XHRcdG1hdGNoZWRTZWxlY3RvcnMgPSB7fTtcblx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGRlbGVnYXRlQ291bnQ7IGkrKyApIHtcblx0XHRcdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IGNvbmZsaWN0IHdpdGggT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzICgjMTMyMDMpXG5cdFx0XHRcdFx0XHRzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3IgKyBcIiBcIjtcblxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9IGhhbmRsZU9iai5uZWVkc0NvbnRleHQgP1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID4gLTEgOlxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVkSGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggbWF0Y2hlZEhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJRdWV1ZS5wdXNoKCB7IGVsZW06IGN1ciwgaGFuZGxlcnM6IG1hdGNoZWRIYW5kbGVycyB9ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVyc1xuXHRcdGN1ciA9IHRoaXM7XG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogY3VyLCBoYW5kbGVyczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGhhbmRsZXJRdWV1ZTtcblx0fSxcblxuXHRhZGRQcm9wOiBmdW5jdGlvbiggbmFtZSwgaG9vayApIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIGpRdWVyeS5FdmVudC5wcm90b3R5cGUsIG5hbWUsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cblx0XHRcdGdldDogalF1ZXJ5LmlzRnVuY3Rpb24oIGhvb2sgKSA/XG5cdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5vcmlnaW5hbEV2ZW50ICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gaG9vayggdGhpcy5vcmlnaW5hbEV2ZW50ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IDpcblx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbIG5hbWUgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cblx0XHRcdHNldDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsIG5hbWUsIHtcblx0XHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHR3cml0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRmaXg6IGZ1bmN0aW9uKCBvcmlnaW5hbEV2ZW50ICkge1xuXHRcdHJldHVybiBvcmlnaW5hbEV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdG9yaWdpbmFsRXZlbnQgOlxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApO1xuXHR9LFxuXG5cdHNwZWNpYWw6IHtcblx0XHRsb2FkOiB7XG5cblx0XHRcdC8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWRcblx0XHRcdG5vQnViYmxlOiB0cnVlXG5cdFx0fSxcblx0XHRmb2N1czoge1xuXG5cdFx0XHQvLyBGaXJlIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3Rcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIHRoaXMgIT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5mb2N1cyApIHtcblx0XHRcdFx0XHR0aGlzLmZvY3VzKCk7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVsZWdhdGVUeXBlOiBcImZvY3VzaW5cIlxuXHRcdH0sXG5cdFx0Ymx1cjoge1xuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggdGhpcyA9PT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmJsdXIgKSB7XG5cdFx0XHRcdFx0dGhpcy5ibHVyKCk7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVsZWdhdGVUeXBlOiBcImZvY3Vzb3V0XCJcblx0XHR9LFxuXHRcdGNsaWNrOiB7XG5cblx0XHRcdC8vIEZvciBjaGVja2JveCwgZmlyZSBuYXRpdmUgZXZlbnQgc28gY2hlY2tlZCBzdGF0ZSB3aWxsIGJlIHJpZ2h0XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzLnR5cGUgPT09IFwiY2hlY2tib3hcIiAmJiB0aGlzLmNsaWNrICYmIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgXCJpbnB1dFwiICkgKSB7XG5cdFx0XHRcdFx0dGhpcy5jbGljaygpO1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIGRvbid0IGZpcmUgbmF0aXZlIC5jbGljaygpIG9uIGxpbmtzXG5cdFx0XHRfZGVmYXVsdDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKCBldmVudC50YXJnZXQsIFwiYVwiICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGJlZm9yZXVubG9hZDoge1xuXHRcdFx0cG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCAyMCtcblx0XHRcdFx0Ly8gRmlyZWZveCBkb2Vzbid0IGFsZXJ0IGlmIHRoZSByZXR1cm5WYWx1ZSBmaWVsZCBpcyBub3Qgc2V0LlxuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGV2ZW50LnJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHtcblxuXHQvLyBUaGlzIFwiaWZcIiBpcyBuZWVkZWQgZm9yIHBsYWluIG9iamVjdHNcblx0aWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0ZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUgKTtcblx0fVxufTtcblxualF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7XG5cblx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkXG5cdGlmICggISggdGhpcyBpbnN0YW5jZW9mIGpRdWVyeS5FdmVudCApICkge1xuXHRcdHJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBFdmVudCBvYmplY3Rcblx0aWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7XG5cdFx0dGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjO1xuXHRcdHRoaXMudHlwZSA9IHNyYy50eXBlO1xuXG5cdFx0Ly8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWRcblx0XHQvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHNyYy5kZWZhdWx0UHJldmVudGVkIHx8XG5cdFx0XHRcdHNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHlcblx0XHRcdFx0c3JjLnJldHVyblZhbHVlID09PSBmYWxzZSA/XG5cdFx0XHRyZXR1cm5UcnVlIDpcblx0XHRcdHJldHVybkZhbHNlO1xuXG5cdFx0Ly8gQ3JlYXRlIHRhcmdldCBwcm9wZXJ0aWVzXG5cdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDw9NiAtIDcgb25seVxuXHRcdC8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCAjMTMxNDMpXG5cdFx0dGhpcy50YXJnZXQgPSAoIHNyYy50YXJnZXQgJiYgc3JjLnRhcmdldC5ub2RlVHlwZSA9PT0gMyApID9cblx0XHRcdHNyYy50YXJnZXQucGFyZW50Tm9kZSA6XG5cdFx0XHRzcmMudGFyZ2V0O1xuXG5cdFx0dGhpcy5jdXJyZW50VGFyZ2V0ID0gc3JjLmN1cnJlbnRUYXJnZXQ7XG5cdFx0dGhpcy5yZWxhdGVkVGFyZ2V0ID0gc3JjLnJlbGF0ZWRUYXJnZXQ7XG5cblx0Ly8gRXZlbnQgdHlwZVxuXHR9IGVsc2Uge1xuXHRcdHRoaXMudHlwZSA9IHNyYztcblx0fVxuXG5cdC8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0XG5cdGlmICggcHJvcHMgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdGhpcywgcHJvcHMgKTtcblx0fVxuXG5cdC8vIENyZWF0ZSBhIHRpbWVzdGFtcCBpZiBpbmNvbWluZyBldmVudCBkb2Vzbid0IGhhdmUgb25lXG5cdHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgalF1ZXJ5Lm5vdygpO1xuXG5cdC8vIE1hcmsgaXQgYXMgZml4ZWRcblx0dGhpc1sgalF1ZXJ5LmV4cGFuZG8gXSA9IHRydWU7XG59O1xuXG4vLyBqUXVlcnkuRXZlbnQgaXMgYmFzZWQgb24gRE9NMyBFdmVudHMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBFQ01BU2NyaXB0IExhbmd1YWdlIEJpbmRpbmdcbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWxcbmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7XG5cdGNvbnN0cnVjdG9yOiBqUXVlcnkuRXZlbnQsXG5cdGlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsXG5cdGlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblx0aXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuXHRpc1NpbXVsYXRlZDogZmFsc2UsXG5cblx0cHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkge1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH1cblx0fSxcblx0c3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkge1xuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHR9XG5cdH0sXG5cdHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5zdG9wUHJvcGFnYXRpb24oKTtcblx0fVxufTtcblxuLy8gSW5jbHVkZXMgYWxsIGNvbW1vbiBldmVudCBwcm9wcyBpbmNsdWRpbmcgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnQgc3BlY2lmaWMgcHJvcHNcbmpRdWVyeS5lYWNoKCB7XG5cdGFsdEtleTogdHJ1ZSxcblx0YnViYmxlczogdHJ1ZSxcblx0Y2FuY2VsYWJsZTogdHJ1ZSxcblx0Y2hhbmdlZFRvdWNoZXM6IHRydWUsXG5cdGN0cmxLZXk6IHRydWUsXG5cdGRldGFpbDogdHJ1ZSxcblx0ZXZlbnRQaGFzZTogdHJ1ZSxcblx0bWV0YUtleTogdHJ1ZSxcblx0cGFnZVg6IHRydWUsXG5cdHBhZ2VZOiB0cnVlLFxuXHRzaGlmdEtleTogdHJ1ZSxcblx0dmlldzogdHJ1ZSxcblx0XCJjaGFyXCI6IHRydWUsXG5cdGNoYXJDb2RlOiB0cnVlLFxuXHRrZXk6IHRydWUsXG5cdGtleUNvZGU6IHRydWUsXG5cdGJ1dHRvbjogdHJ1ZSxcblx0YnV0dG9uczogdHJ1ZSxcblx0Y2xpZW50WDogdHJ1ZSxcblx0Y2xpZW50WTogdHJ1ZSxcblx0b2Zmc2V0WDogdHJ1ZSxcblx0b2Zmc2V0WTogdHJ1ZSxcblx0cG9pbnRlcklkOiB0cnVlLFxuXHRwb2ludGVyVHlwZTogdHJ1ZSxcblx0c2NyZWVuWDogdHJ1ZSxcblx0c2NyZWVuWTogdHJ1ZSxcblx0dGFyZ2V0VG91Y2hlczogdHJ1ZSxcblx0dG9FbGVtZW50OiB0cnVlLFxuXHR0b3VjaGVzOiB0cnVlLFxuXG5cdHdoaWNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0dmFyIGJ1dHRvbiA9IGV2ZW50LmJ1dHRvbjtcblxuXHRcdC8vIEFkZCB3aGljaCBmb3Iga2V5IGV2ZW50c1xuXHRcdGlmICggZXZlbnQud2hpY2ggPT0gbnVsbCAmJiBya2V5RXZlbnQudGVzdCggZXZlbnQudHlwZSApICkge1xuXHRcdFx0cmV0dXJuIGV2ZW50LmNoYXJDb2RlICE9IG51bGwgPyBldmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGU7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHdoaWNoIGZvciBjbGljazogMSA9PT0gbGVmdDsgMiA9PT0gbWlkZGxlOyAzID09PSByaWdodFxuXHRcdGlmICggIWV2ZW50LndoaWNoICYmIGJ1dHRvbiAhPT0gdW5kZWZpbmVkICYmIHJtb3VzZUV2ZW50LnRlc3QoIGV2ZW50LnR5cGUgKSApIHtcblx0XHRcdGlmICggYnV0dG9uICYgMSApIHtcblx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggYnV0dG9uICYgMiApIHtcblx0XHRcdFx0cmV0dXJuIDM7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggYnV0dG9uICYgNCApIHtcblx0XHRcdFx0cmV0dXJuIDI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC53aGljaDtcblx0fVxufSwgalF1ZXJ5LmV2ZW50LmFkZFByb3AgKTtcblxuLy8gQ3JlYXRlIG1vdXNlZW50ZXIvbGVhdmUgZXZlbnRzIHVzaW5nIG1vdXNlb3Zlci9vdXQgYW5kIGV2ZW50LXRpbWUgY2hlY2tzXG4vLyBzbyB0aGF0IGV2ZW50IGRlbGVnYXRpb24gd29ya3MgaW4galF1ZXJ5LlxuLy8gRG8gdGhlIHNhbWUgZm9yIHBvaW50ZXJlbnRlci9wb2ludGVybGVhdmUgYW5kIHBvaW50ZXJvdmVyL3BvaW50ZXJvdXRcbi8vXG4vLyBTdXBwb3J0OiBTYWZhcmkgNyBvbmx5XG4vLyBTYWZhcmkgc2VuZHMgbW91c2VlbnRlciB0b28gb2Z0ZW47IHNlZTpcbi8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ3MDI1OFxuLy8gZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYnVnIChpdCBleGlzdGVkIGluIG9sZGVyIENocm9tZSB2ZXJzaW9ucyBhcyB3ZWxsKS5cbmpRdWVyeS5lYWNoKCB7XG5cdG1vdXNlZW50ZXI6IFwibW91c2VvdmVyXCIsXG5cdG1vdXNlbGVhdmU6IFwibW91c2VvdXRcIixcblx0cG9pbnRlcmVudGVyOiBcInBvaW50ZXJvdmVyXCIsXG5cdHBvaW50ZXJsZWF2ZTogXCJwb2ludGVyb3V0XCJcbn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XG5cdGpRdWVyeS5ldmVudC5zcGVjaWFsWyBvcmlnIF0gPSB7XG5cdFx0ZGVsZWdhdGVUeXBlOiBmaXgsXG5cdFx0YmluZFR5cGU6IGZpeCxcblxuXHRcdGhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0dmFyIHJldCxcblx0XHRcdFx0dGFyZ2V0ID0gdGhpcyxcblx0XHRcdFx0cmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQsXG5cdFx0XHRcdGhhbmRsZU9iaiA9IGV2ZW50LmhhbmRsZU9iajtcblxuXHRcdFx0Ly8gRm9yIG1vdXNlZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC5cblx0XHRcdC8vIE5COiBObyByZWxhdGVkVGFyZ2V0IGlmIHRoZSBtb3VzZSBsZWZ0L2VudGVyZWQgdGhlIGJyb3dzZXIgd2luZG93XG5cdFx0XHRpZiAoICFyZWxhdGVkIHx8ICggcmVsYXRlZCAhPT0gdGFyZ2V0ICYmICFqUXVlcnkuY29udGFpbnMoIHRhcmdldCwgcmVsYXRlZCApICkgKSB7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBoYW5kbGVPYmoub3JpZ1R5cGU7XG5cdFx0XHRcdHJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0ZXZlbnQudHlwZSA9IGZpeDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHR9O1xufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0b246IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHRvbmU6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgMSApO1xuXHR9LFxuXHRvZmY6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGZuICkge1xuXHRcdHZhciBoYW5kbGVPYmosIHR5cGU7XG5cdFx0aWYgKCB0eXBlcyAmJiB0eXBlcy5wcmV2ZW50RGVmYXVsdCAmJiB0eXBlcy5oYW5kbGVPYmogKSB7XG5cblx0XHRcdC8vICggZXZlbnQgKSAgZGlzcGF0Y2hlZCBqUXVlcnkuRXZlbnRcblx0XHRcdGhhbmRsZU9iaiA9IHR5cGVzLmhhbmRsZU9iajtcblx0XHRcdGpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoXG5cdFx0XHRcdGhhbmRsZU9iai5uYW1lc3BhY2UgP1xuXHRcdFx0XHRcdGhhbmRsZU9iai5vcmlnVHlwZSArIFwiLlwiICsgaGFuZGxlT2JqLm5hbWVzcGFjZSA6XG5cdFx0XHRcdFx0aGFuZGxlT2JqLm9yaWdUeXBlLFxuXHRcdFx0XHRoYW5kbGVPYmouc2VsZWN0b3IsXG5cdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzLW9iamVjdCBbLCBzZWxlY3Rvcl0gKVxuXHRcdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcblx0XHRcdFx0dGhpcy5vZmYoIHR5cGUsIHNlbGVjdG9yLCB0eXBlc1sgdHlwZSBdICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdFx0aWYgKCBzZWxlY3RvciA9PT0gZmFsc2UgfHwgdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMgWywgZm5dIClcblx0XHRcdGZuID0gc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGVzLCBmbiwgc2VsZWN0b3IgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuXG52YXJcblxuXHQvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cblx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2lzc3Vlcy8zMjI5XG5cdHJ4aHRtbFRhZyA9IC88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKilbXj5dKilcXC8+L2dpLFxuXG5cdC8qIGVzbGludC1lbmFibGUgKi9cblxuXHQvLyBTdXBwb3J0OiBJRSA8PTEwIC0gMTEsIEVkZ2UgMTIgLSAxM1xuXHQvLyBJbiBJRS9FZGdlIHVzaW5nIHJlZ2V4IGdyb3VwcyBoZXJlIGNhdXNlcyBzZXZlcmUgc2xvd2Rvd25zLlxuXHQvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyL1xuXHRybm9Jbm5lcmh0bWwgPSAvPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxcblxuXHQvLyBjaGVja2VkPVwiY2hlY2tlZFwiIG9yIGNoZWNrZWRcblx0cmNoZWNrZWQgPSAvY2hlY2tlZFxccyooPzpbXj1dfD1cXHMqLmNoZWNrZWQuKS9pLFxuXHRyc2NyaXB0VHlwZU1hc2tlZCA9IC9edHJ1ZVxcLyguKikvLFxuXHRyY2xlYW5TY3JpcHQgPSAvXlxccyo8ISg/OlxcW0NEQVRBXFxbfC0tKXwoPzpcXF1cXF18LS0pPlxccyokL2c7XG5cbmZ1bmN0aW9uIG1hbmlwdWxhdGlvblRhcmdldCggZWxlbSwgY29udGVudCApIHtcblx0aWYgKCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sIFwidGFibGVcIiApICYmXG5cdFx0alF1ZXJ5Lm5vZGVOYW1lKCBjb250ZW50Lm5vZGVUeXBlICE9PSAxMSA/IGNvbnRlbnQgOiBjb250ZW50LmZpcnN0Q2hpbGQsIFwidHJcIiApICkge1xuXG5cdFx0cmV0dXJuIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwidGJvZHlcIiApWyAwIF0gfHwgZWxlbTtcblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG4vLyBSZXBsYWNlL3Jlc3RvcmUgdGhlIHR5cGUgYXR0cmlidXRlIG9mIHNjcmlwdCBlbGVtZW50cyBmb3Igc2FmZSBET00gbWFuaXB1bGF0aW9uXG5mdW5jdGlvbiBkaXNhYmxlU2NyaXB0KCBlbGVtICkge1xuXHRlbGVtLnR5cGUgPSAoIGVsZW0uZ2V0QXR0cmlidXRlKCBcInR5cGVcIiApICE9PSBudWxsICkgKyBcIi9cIiArIGVsZW0udHlwZTtcblx0cmV0dXJuIGVsZW07XG59XG5mdW5jdGlvbiByZXN0b3JlU2NyaXB0KCBlbGVtICkge1xuXHR2YXIgbWF0Y2ggPSByc2NyaXB0VHlwZU1hc2tlZC5leGVjKCBlbGVtLnR5cGUgKTtcblxuXHRpZiAoIG1hdGNoICkge1xuXHRcdGVsZW0udHlwZSA9IG1hdGNoWyAxIF07XG5cdH0gZWxzZSB7XG5cdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIFwidHlwZVwiICk7XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxuZnVuY3Rpb24gY2xvbmVDb3B5RXZlbnQoIHNyYywgZGVzdCApIHtcblx0dmFyIGksIGwsIHR5cGUsIHBkYXRhT2xkLCBwZGF0YUN1ciwgdWRhdGFPbGQsIHVkYXRhQ3VyLCBldmVudHM7XG5cblx0aWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIDEuIENvcHkgcHJpdmF0ZSBkYXRhOiBldmVudHMsIGhhbmRsZXJzLCBldGMuXG5cdGlmICggZGF0YVByaXYuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0cGRhdGFPbGQgPSBkYXRhUHJpdi5hY2Nlc3MoIHNyYyApO1xuXHRcdHBkYXRhQ3VyID0gZGF0YVByaXYuc2V0KCBkZXN0LCBwZGF0YU9sZCApO1xuXHRcdGV2ZW50cyA9IHBkYXRhT2xkLmV2ZW50cztcblxuXHRcdGlmICggZXZlbnRzICkge1xuXHRcdFx0ZGVsZXRlIHBkYXRhQ3VyLmhhbmRsZTtcblx0XHRcdHBkYXRhQ3VyLmV2ZW50cyA9IHt9O1xuXG5cdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBldmVudHNbIHR5cGUgXS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggZGVzdCwgdHlwZSwgZXZlbnRzWyB0eXBlIF1bIGkgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gMi4gQ29weSB1c2VyIGRhdGFcblx0aWYgKCBkYXRhVXNlci5oYXNEYXRhKCBzcmMgKSApIHtcblx0XHR1ZGF0YU9sZCA9IGRhdGFVc2VyLmFjY2Vzcyggc3JjICk7XG5cdFx0dWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTtcblxuXHRcdGRhdGFVc2VyLnNldCggZGVzdCwgdWRhdGFDdXIgKTtcblx0fVxufVxuXG4vLyBGaXggSUUgYnVncywgc2VlIHN1cHBvcnQgdGVzdHNcbmZ1bmN0aW9uIGZpeElucHV0KCBzcmMsIGRlc3QgKSB7XG5cdHZhciBub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuXHQvLyBGYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbi5cblx0aWYgKCBub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIHJjaGVja2FibGVUeXBlLnRlc3QoIHNyYy50eXBlICkgKSB7XG5cdFx0ZGVzdC5jaGVja2VkID0gc3JjLmNoZWNrZWQ7XG5cblx0Ly8gRmFpbHMgdG8gcmV0dXJuIHRoZSBzZWxlY3RlZCBvcHRpb24gdG8gdGhlIGRlZmF1bHQgc2VsZWN0ZWQgc3RhdGUgd2hlbiBjbG9uaW5nIG9wdGlvbnNcblx0fSBlbHNlIGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiB8fCBub2RlTmFtZSA9PT0gXCJ0ZXh0YXJlYVwiICkge1xuXHRcdGRlc3QuZGVmYXVsdFZhbHVlID0gc3JjLmRlZmF1bHRWYWx1ZTtcblx0fVxufVxuXG5mdW5jdGlvbiBkb21NYW5pcCggY29sbGVjdGlvbiwgYXJncywgY2FsbGJhY2ssIGlnbm9yZWQgKSB7XG5cblx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRhcmdzID0gY29uY2F0LmFwcGx5KCBbXSwgYXJncyApO1xuXG5cdHZhciBmcmFnbWVudCwgZmlyc3QsIHNjcmlwdHMsIGhhc1NjcmlwdHMsIG5vZGUsIGRvYyxcblx0XHRpID0gMCxcblx0XHRsID0gY29sbGVjdGlvbi5sZW5ndGgsXG5cdFx0aU5vQ2xvbmUgPSBsIC0gMSxcblx0XHR2YWx1ZSA9IGFyZ3NbIDAgXSxcblx0XHRpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0Ly8gV2UgY2FuJ3QgY2xvbmVOb2RlIGZyYWdtZW50cyB0aGF0IGNvbnRhaW4gY2hlY2tlZCwgaW4gV2ViS2l0XG5cdGlmICggaXNGdW5jdGlvbiB8fFxuXHRcdFx0KCBsID4gMSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0IXN1cHBvcnQuY2hlY2tDbG9uZSAmJiByY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgKSB7XG5cdFx0cmV0dXJuIGNvbGxlY3Rpb24uZWFjaCggZnVuY3Rpb24oIGluZGV4ICkge1xuXHRcdFx0dmFyIHNlbGYgPSBjb2xsZWN0aW9uLmVxKCBpbmRleCApO1xuXHRcdFx0aWYgKCBpc0Z1bmN0aW9uICkge1xuXHRcdFx0XHRhcmdzWyAwIF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwgc2VsZi5odG1sKCkgKTtcblx0XHRcdH1cblx0XHRcdGRvbU1hbmlwKCBzZWxmLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApO1xuXHRcdH0gKTtcblx0fVxuXG5cdGlmICggbCApIHtcblx0XHRmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApO1xuXHRcdGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdGlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7XG5cdFx0XHRmcmFnbWVudCA9IGZpcnN0O1xuXHRcdH1cblxuXHRcdC8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFja1xuXHRcdGlmICggZmlyc3QgfHwgaWdub3JlZCApIHtcblx0XHRcdHNjcmlwdHMgPSBqUXVlcnkubWFwKCBnZXRBbGwoIGZyYWdtZW50LCBcInNjcmlwdFwiICksIGRpc2FibGVTY3JpcHQgKTtcblx0XHRcdGhhc1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDtcblxuXHRcdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbVxuXHRcdFx0Ly8gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVjYXVzZSBpdCBjYW4gZW5kIHVwXG5cdFx0XHQvLyBiZWluZyBlbXB0aWVkIGluY29ycmVjdGx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyAoIzgwNzApLlxuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRub2RlID0gZnJhZ21lbnQ7XG5cblx0XHRcdFx0aWYgKCBpICE9PSBpTm9DbG9uZSApIHtcblx0XHRcdFx0XHRub2RlID0galF1ZXJ5LmNsb25lKCBub2RlLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHQvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggc2NyaXB0cywgZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjYWxsYmFjay5jYWxsKCBjb2xsZWN0aW9uWyBpIF0sIG5vZGUsIGkgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXHRcdFx0XHRkb2MgPSBzY3JpcHRzWyBzY3JpcHRzLmxlbmd0aCAtIDEgXS5vd25lckRvY3VtZW50O1xuXG5cdFx0XHRcdC8vIFJlZW5hYmxlIHNjcmlwdHNcblx0XHRcdFx0alF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApO1xuXG5cdFx0XHRcdC8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb25cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBoYXNTY3JpcHRzOyBpKysgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IHNjcmlwdHNbIGkgXTtcblx0XHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIG5vZGUudHlwZSB8fCBcIlwiICkgJiZcblx0XHRcdFx0XHRcdCFkYXRhUHJpdi5hY2Nlc3MoIG5vZGUsIFwiZ2xvYmFsRXZhbFwiICkgJiZcblx0XHRcdFx0XHRcdGpRdWVyeS5jb250YWlucyggZG9jLCBub2RlICkgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggbm9kZS5zcmMgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gT3B0aW9uYWwgQUpBWCBkZXBlbmRlbmN5LCBidXQgd29uJ3QgcnVuIHNjcmlwdHMgaWYgbm90IHByZXNlbnRcblx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuX2V2YWxVcmwgKSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRET01FdmFsKCBub2RlLnRleHRDb250ZW50LnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgXCJcIiApLCBkb2MgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gY29sbGVjdGlvbjtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlKCBlbGVtLCBzZWxlY3Rvciwga2VlcERhdGEgKSB7XG5cdHZhciBub2RlLFxuXHRcdG5vZGVzID0gc2VsZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgZWxlbSApIDogZWxlbSxcblx0XHRpID0gMDtcblxuXHRmb3IgKCA7ICggbm9kZSA9IG5vZGVzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0aWYgKCAha2VlcERhdGEgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggbm9kZSApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBub2RlLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRpZiAoIGtlZXBEYXRhICYmIGpRdWVyeS5jb250YWlucyggbm9kZS5vd25lckRvY3VtZW50LCBub2RlICkgKSB7XG5cdFx0XHRcdHNldEdsb2JhbEV2YWwoIGdldEFsbCggbm9kZSwgXCJzY3JpcHRcIiApICk7XG5cdFx0XHR9XG5cdFx0XHRub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG5vZGUgKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRodG1sUHJlZmlsdGVyOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHRyZXR1cm4gaHRtbC5yZXBsYWNlKCByeGh0bWxUYWcsIFwiPCQxPjwvJDI+XCIgKTtcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGVsZW0sIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdHZhciBpLCBsLCBzcmNFbGVtZW50cywgZGVzdEVsZW1lbnRzLFxuXHRcdFx0Y2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLFxuXHRcdFx0aW5QYWdlID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblxuXHRcdC8vIEZpeCBJRSBjbG9uaW5nIGlzc3Vlc1xuXHRcdGlmICggIXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgJiYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGVsZW0ubm9kZVR5cGUgPT09IDExICkgJiZcblx0XHRcdFx0IWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkge1xuXG5cdFx0XHQvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6IGh0dHBzOi8vanNwZXJmLmNvbS9nZXRhbGwtdnMtc2l6emxlLzJcblx0XHRcdGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUgKTtcblx0XHRcdHNyY0VsZW1lbnRzID0gZ2V0QWxsKCBlbGVtICk7XG5cblx0XHRcdGZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRmaXhJbnB1dCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lXG5cdFx0aWYgKCBkYXRhQW5kRXZlbnRzICkge1xuXHRcdFx0aWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdFx0c3JjRWxlbWVudHMgPSBzcmNFbGVtZW50cyB8fCBnZXRBbGwoIGVsZW0gKTtcblx0XHRcdFx0ZGVzdEVsZW1lbnRzID0gZGVzdEVsZW1lbnRzIHx8IGdldEFsbCggY2xvbmUgKTtcblxuXHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRjbG9uZUNvcHlFdmVudCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUsIFwic2NyaXB0XCIgKTtcblx0XHRpZiAoIGRlc3RFbGVtZW50cy5sZW5ndGggPiAwICkge1xuXHRcdFx0c2V0R2xvYmFsRXZhbCggZGVzdEVsZW1lbnRzLCAhaW5QYWdlICYmIGdldEFsbCggZWxlbSwgXCJzY3JpcHRcIiApICk7XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0XG5cdFx0cmV0dXJuIGNsb25lO1xuXHR9LFxuXG5cdGNsZWFuRGF0YTogZnVuY3Rpb24oIGVsZW1zICkge1xuXHRcdHZhciBkYXRhLCBlbGVtLCB0eXBlLFxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IGVsZW1zWyBpIF0gKSAhPT0gdW5kZWZpbmVkOyBpKysgKSB7XG5cdFx0XHRpZiAoIGFjY2VwdERhdGEoIGVsZW0gKSApIHtcblx0XHRcdFx0aWYgKCAoIGRhdGEgPSBlbGVtWyBkYXRhUHJpdi5leHBhbmRvIF0gKSApIHtcblx0XHRcdFx0XHRpZiAoIGRhdGEuZXZlbnRzICkge1xuXHRcdFx0XHRcdFx0Zm9yICggdHlwZSBpbiBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBzcGVjaWFsWyB0eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBhdm9pZCBqUXVlcnkuZXZlbnQucmVtb3ZlJ3Mgb3ZlcmhlYWRcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1K1xuXHRcdFx0XHRcdC8vIEFzc2lnbiB1bmRlZmluZWQgaW5zdGVhZCBvZiB1c2luZyBkZWxldGUsIHNlZSBEYXRhI3JlbW92ZVxuXHRcdFx0XHRcdGVsZW1bIGRhdGFQcml2LmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIGVsZW1bIGRhdGFVc2VyLmV4cGFuZG8gXSApIHtcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrXG5cdFx0XHRcdFx0Ly8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlXG5cdFx0XHRcdFx0ZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZGV0YWNoOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHJlbW92ZSggdGhpcywgc2VsZWN0b3IsIHRydWUgKTtcblx0fSxcblxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciApO1xuXHR9LFxuXG5cdHRleHQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS50ZXh0KCB0aGlzICkgOlxuXHRcdFx0XHR0aGlzLmVtcHR5KCkuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0fSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTtcblx0fSxcblxuXHRhcHBlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7XG5cdFx0XHRcdHRhcmdldC5hcHBlbmRDaGlsZCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRwcmVwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0YXJnZXQuZmlyc3RDaGlsZCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRiZWZvcmU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGFmdGVyOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5uZXh0U2libGluZyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRlbXB0eTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGVsZW0sXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgKCBlbGVtID0gdGhpc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdC8vIFByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXG5cdFx0XHRcdC8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzXG5cdFx0XHRcdGVsZW0udGV4dENvbnRlbnQgPSBcIlwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiggZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0ZGF0YUFuZEV2ZW50cyA9IGRhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGZhbHNlIDogZGF0YUFuZEV2ZW50cztcblx0XHRkZWVwRGF0YUFuZEV2ZW50cyA9IGRlZXBEYXRhQW5kRXZlbnRzID09IG51bGwgPyBkYXRhQW5kRXZlbnRzIDogZGVlcERhdGFBbmRFdmVudHM7XG5cblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5jbG9uZSggdGhpcywgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKTtcblx0XHR9ICk7XG5cdH0sXG5cblx0aHRtbDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBlbGVtID0gdGhpc1sgMCBdIHx8IHt9LFxuXHRcdFx0XHRpID0gMCxcblx0XHRcdFx0bCA9IHRoaXMubGVuZ3RoO1xuXG5cdFx0XHRpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0cmV0dXJuIGVsZW0uaW5uZXJIVE1MO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZWUgaWYgd2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5uZXJIVE1MXG5cdFx0XHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhcm5vSW5uZXJodG1sLnRlc3QoIHZhbHVlICkgJiZcblx0XHRcdFx0IXdyYXBNYXBbICggcnRhZ05hbWUuZXhlYyggdmFsdWUgKSB8fCBbIFwiXCIsIFwiXCIgXSApWyAxIF0udG9Mb3dlckNhc2UoKSBdICkge1xuXG5cdFx0XHRcdHZhbHVlID0galF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIHZhbHVlICk7XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0XHRlbGVtID0gdGhpc1sgaSBdIHx8IHt9O1xuXG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3Ncblx0XHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7XG5cdFx0XHRcdFx0XHRcdGVsZW0uaW5uZXJIVE1MID0gdmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZWxlbSA9IDA7XG5cblx0XHRcdFx0Ly8gSWYgdXNpbmcgaW5uZXJIVE1MIHRocm93cyBhbiBleGNlcHRpb24sIHVzZSB0aGUgZmFsbGJhY2sgbWV0aG9kXG5cdFx0XHRcdH0gY2F0Y2ggKCBlICkge31cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0XHR0aGlzLmVtcHR5KCkuYXBwZW5kKCB2YWx1ZSApO1xuXHRcdFx0fVxuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0cmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpZ25vcmVkID0gW107XG5cblx0XHQvLyBNYWtlIHRoZSBjaGFuZ2VzLCByZXBsYWNpbmcgZWFjaCBub24taWdub3JlZCBjb250ZXh0IGVsZW1lbnQgd2l0aCB0aGUgbmV3IGNvbnRlbnRcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuXG5cdFx0XHRpZiAoIGpRdWVyeS5pbkFycmF5KCB0aGlzLCBpZ25vcmVkICkgPCAwICkge1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIHRoaXMgKSApO1xuXHRcdFx0XHRpZiAoIHBhcmVudCApIHtcblx0XHRcdFx0XHRwYXJlbnQucmVwbGFjZUNoaWxkKCBlbGVtLCB0aGlzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEZvcmNlIGNhbGxiYWNrIGludm9jYXRpb25cblx0XHR9LCBpZ25vcmVkICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIHtcblx0YXBwZW5kVG86IFwiYXBwZW5kXCIsXG5cdHByZXBlbmRUbzogXCJwcmVwZW5kXCIsXG5cdGluc2VydEJlZm9yZTogXCJiZWZvcmVcIixcblx0aW5zZXJ0QWZ0ZXI6IFwiYWZ0ZXJcIixcblx0cmVwbGFjZUFsbDogXCJyZXBsYWNlV2l0aFwiXG59LCBmdW5jdGlvbiggbmFtZSwgb3JpZ2luYWwgKSB7XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBlbGVtcyxcblx0XHRcdHJldCA9IFtdLFxuXHRcdFx0aW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLFxuXHRcdFx0bGFzdCA9IGluc2VydC5sZW5ndGggLSAxLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7IGkgPD0gbGFzdDsgaSsrICkge1xuXHRcdFx0ZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUoIHRydWUgKTtcblx0XHRcdGpRdWVyeSggaW5zZXJ0WyBpIF0gKVsgb3JpZ2luYWwgXSggZWxlbXMgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdFx0XHQvLyAuZ2V0KCkgYmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRwdXNoLmFwcGx5KCByZXQsIGVsZW1zLmdldCgpICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTtcblx0fTtcbn0gKTtcbnZhciBybWFyZ2luID0gKCAvXm1hcmdpbi8gKTtcblxudmFyIHJudW1ub25weCA9IG5ldyBSZWdFeHAoIFwiXihcIiArIHBudW0gKyBcIikoPyFweClbYS16JV0rJFwiLCBcImlcIiApO1xuXG52YXIgZ2V0U3R5bGVzID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHksIEZpcmVmb3ggPD0zMCAoIzE1MDk4LCAjMTQxNTApXG5cdFx0Ly8gSUUgdGhyb3dzIG9uIGVsZW1lbnRzIGNyZWF0ZWQgaW4gcG9wdXBzXG5cdFx0Ly8gRkYgbWVhbndoaWxlIHRocm93cyBvbiBmcmFtZSBlbGVtZW50cyB0aHJvdWdoIFwiZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZVwiXG5cdFx0dmFyIHZpZXcgPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG5cblx0XHRpZiAoICF2aWV3IHx8ICF2aWV3Lm9wZW5lciApIHtcblx0XHRcdHZpZXcgPSB3aW5kb3c7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSApO1xuXHR9O1xuXG5cblxuKCBmdW5jdGlvbigpIHtcblxuXHQvLyBFeGVjdXRpbmcgYm90aCBwaXhlbFBvc2l0aW9uICYgYm94U2l6aW5nUmVsaWFibGUgdGVzdHMgcmVxdWlyZSBvbmx5IG9uZSBsYXlvdXRcblx0Ly8gc28gdGhleSdyZSBleGVjdXRlZCBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgdGhlIHNlY29uZCBjb21wdXRhdGlvbi5cblx0ZnVuY3Rpb24gY29tcHV0ZVN0eWxlVGVzdHMoKSB7XG5cblx0XHQvLyBUaGlzIGlzIGEgc2luZ2xldG9uLCB3ZSBuZWVkIHRvIGV4ZWN1dGUgaXQgb25seSBvbmNlXG5cdFx0aWYgKCAhZGl2ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGRpdi5zdHlsZS5jc3NUZXh0ID1cblx0XHRcdFwiYm94LXNpemluZzpib3JkZXItYm94O1wiICtcblx0XHRcdFwicG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztcIiArXG5cdFx0XHRcIm1hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7XCIgK1xuXHRcdFx0XCJ0b3A6MSU7d2lkdGg6NTAlXCI7XG5cdFx0ZGl2LmlubmVySFRNTCA9IFwiXCI7XG5cdFx0ZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdHZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYgKTtcblx0XHRwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSBcIjElXCI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBGaXJlZm94IDw9MyAtIDQ0XG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0VmFsID0gZGl2U3R5bGUubWFyZ2luTGVmdCA9PT0gXCIycHhcIjtcblx0XHRib3hTaXppbmdSZWxpYWJsZVZhbCA9IGRpdlN0eWxlLndpZHRoID09PSBcIjRweFwiO1xuXG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA0LjAgLSA0LjMgb25seVxuXHRcdC8vIFNvbWUgc3R5bGVzIGNvbWUgYmFjayB3aXRoIHBlcmNlbnRhZ2UgdmFsdWVzLCBldmVuIHRob3VnaCB0aGV5IHNob3VsZG4ndFxuXHRcdGRpdi5zdHlsZS5tYXJnaW5SaWdodCA9IFwiNTAlXCI7XG5cdFx0cGl4ZWxNYXJnaW5SaWdodFZhbCA9IGRpdlN0eWxlLm1hcmdpblJpZ2h0ID09PSBcIjRweFwiO1xuXG5cdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdC8vIE51bGxpZnkgdGhlIGRpdiBzbyBpdCB3b3VsZG4ndCBiZSBzdG9yZWQgaW4gdGhlIG1lbW9yeSBhbmRcblx0XHQvLyBpdCB3aWxsIGFsc28gYmUgYSBzaWduIHRoYXQgY2hlY2tzIGFscmVhZHkgcGVyZm9ybWVkXG5cdFx0ZGl2ID0gbnVsbDtcblx0fVxuXG5cdHZhciBwaXhlbFBvc2l0aW9uVmFsLCBib3hTaXppbmdSZWxpYWJsZVZhbCwgcGl4ZWxNYXJnaW5SaWdodFZhbCwgcmVsaWFibGVNYXJnaW5MZWZ0VmFsLFxuXHRcdGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSxcblx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cblx0Ly8gRmluaXNoIGVhcmx5IGluIGxpbWl0ZWQgKG5vbi1icm93c2VyKSBlbnZpcm9ubWVudHNcblx0aWYgKCAhZGl2LnN0eWxlICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0Ly8gU3R5bGUgb2YgY2xvbmVkIGVsZW1lbnQgYWZmZWN0cyBzb3VyY2UgZWxlbWVudCBjbG9uZWQgKCM4OTA4KVxuXHRkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcImNvbnRlbnQtYm94XCI7XG5cdGRpdi5jbG9uZU5vZGUoIHRydWUgKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9IFwiXCI7XG5cdHN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSBcImNvbnRlbnQtYm94XCI7XG5cblx0Y29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBcImJvcmRlcjowO3dpZHRoOjhweDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHg7XCIgK1xuXHRcdFwicGFkZGluZzowO21hcmdpbi10b3A6MXB4O3Bvc2l0aW9uOmFic29sdXRlXCI7XG5cdGNvbnRhaW5lci5hcHBlbmRDaGlsZCggZGl2ICk7XG5cblx0alF1ZXJ5LmV4dGVuZCggc3VwcG9ydCwge1xuXHRcdHBpeGVsUG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbFBvc2l0aW9uVmFsO1xuXHRcdH0sXG5cdFx0Ym94U2l6aW5nUmVsaWFibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBib3hTaXppbmdSZWxpYWJsZVZhbDtcblx0XHR9LFxuXHRcdHBpeGVsTWFyZ2luUmlnaHQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbE1hcmdpblJpZ2h0VmFsO1xuXHRcdH0sXG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gcmVsaWFibGVNYXJnaW5MZWZ0VmFsO1xuXHRcdH1cblx0fSApO1xufSApKCk7XG5cblxuZnVuY3Rpb24gY3VyQ1NTKCBlbGVtLCBuYW1lLCBjb21wdXRlZCApIHtcblx0dmFyIHdpZHRoLCBtaW5XaWR0aCwgbWF4V2lkdGgsIHJldCxcblx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XG5cblx0Y29tcHV0ZWQgPSBjb21wdXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKTtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuXHQvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG9ubHkgbmVlZGVkIGZvciAuY3NzKCdmaWx0ZXInKSAoIzEyNTM3KVxuXHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdHJldCA9IGNvbXB1dGVkLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKSB8fCBjb21wdXRlZFsgbmFtZSBdO1xuXG5cdFx0aWYgKCByZXQgPT09IFwiXCIgJiYgIWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgKSB7XG5cdFx0XHRyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTtcblx0XHR9XG5cblx0XHQvLyBBIHRyaWJ1dGUgdG8gdGhlIFwiYXdlc29tZSBoYWNrIGJ5IERlYW4gRWR3YXJkc1wiXG5cdFx0Ly8gQW5kcm9pZCBCcm93c2VyIHJldHVybnMgcGVyY2VudGFnZSBmb3Igc29tZSB2YWx1ZXMsXG5cdFx0Ly8gYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVscy5cblx0XHQvLyBUaGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6XG5cdFx0Ly8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXNcblx0XHRpZiAoICFzdXBwb3J0LnBpeGVsTWFyZ2luUmlnaHQoKSAmJiBybnVtbm9ucHgudGVzdCggcmV0ICkgJiYgcm1hcmdpbi50ZXN0KCBuYW1lICkgKSB7XG5cblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXNcblx0XHRcdHdpZHRoID0gc3R5bGUud2lkdGg7XG5cdFx0XHRtaW5XaWR0aCA9IHN0eWxlLm1pbldpZHRoO1xuXHRcdFx0bWF4V2lkdGggPSBzdHlsZS5tYXhXaWR0aDtcblxuXHRcdFx0Ly8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dFxuXHRcdFx0c3R5bGUubWluV2lkdGggPSBzdHlsZS5tYXhXaWR0aCA9IHN0eWxlLndpZHRoID0gcmV0O1xuXHRcdFx0cmV0ID0gY29tcHV0ZWQud2lkdGg7XG5cblx0XHRcdC8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXNcblx0XHRcdHN0eWxlLndpZHRoID0gd2lkdGg7XG5cdFx0XHRzdHlsZS5taW5XaWR0aCA9IG1pbldpZHRoO1xuXHRcdFx0c3R5bGUubWF4V2lkdGggPSBtYXhXaWR0aDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmV0ICE9PSB1bmRlZmluZWQgP1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHRcdC8vIElFIHJldHVybnMgekluZGV4IHZhbHVlIGFzIGFuIGludGVnZXIuXG5cdFx0cmV0ICsgXCJcIiA6XG5cdFx0cmV0O1xufVxuXG5cbmZ1bmN0aW9uIGFkZEdldEhvb2tJZiggY29uZGl0aW9uRm4sIGhvb2tGbiApIHtcblxuXHQvLyBEZWZpbmUgdGhlIGhvb2ssIHdlJ2xsIGNoZWNrIG9uIHRoZSBmaXJzdCBydW4gaWYgaXQncyByZWFsbHkgbmVlZGVkLlxuXHRyZXR1cm4ge1xuXHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGNvbmRpdGlvbkZuKCkgKSB7XG5cblx0XHRcdFx0Ly8gSG9vayBub3QgbmVlZGVkIChvciBpdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgaXQgZHVlXG5cdFx0XHRcdC8vIHRvIG1pc3NpbmcgZGVwZW5kZW5jeSksIHJlbW92ZSBpdC5cblx0XHRcdFx0ZGVsZXRlIHRoaXMuZ2V0O1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIEhvb2sgbmVlZGVkOyByZWRlZmluZSBpdCBzbyB0aGF0IHRoZSBzdXBwb3J0IHRlc3QgaXMgbm90IGV4ZWN1dGVkIGFnYWluLlxuXHRcdFx0cmV0dXJuICggdGhpcy5nZXQgPSBob29rRm4gKS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0fVxuXHR9O1xufVxuXG5cbnZhclxuXG5cdC8vIFN3YXBwYWJsZSBpZiBkaXNwbGF5IGlzIG5vbmUgb3Igc3RhcnRzIHdpdGggdGFibGVcblx0Ly8gZXhjZXB0IFwidGFibGVcIiwgXCJ0YWJsZS1jZWxsXCIsIG9yIFwidGFibGUtY2FwdGlvblwiXG5cdC8vIFNlZSBoZXJlIGZvciBkaXNwbGF5IHZhbHVlczogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9DU1MvZGlzcGxheVxuXHRyZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sXG5cdGNzc1Nob3cgPSB7IHBvc2l0aW9uOiBcImFic29sdXRlXCIsIHZpc2liaWxpdHk6IFwiaGlkZGVuXCIsIGRpc3BsYXk6IFwiYmxvY2tcIiB9LFxuXHRjc3NOb3JtYWxUcmFuc2Zvcm0gPSB7XG5cdFx0bGV0dGVyU3BhY2luZzogXCIwXCIsXG5cdFx0Zm9udFdlaWdodDogXCI0MDBcIlxuXHR9LFxuXG5cdGNzc1ByZWZpeGVzID0gWyBcIldlYmtpdFwiLCBcIk1velwiLCBcIm1zXCIgXSxcblx0ZW1wdHlTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKS5zdHlsZTtcblxuLy8gUmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eVxuZnVuY3Rpb24gdmVuZG9yUHJvcE5hbWUoIG5hbWUgKSB7XG5cblx0Ly8gU2hvcnRjdXQgZm9yIG5hbWVzIHRoYXQgYXJlIG5vdCB2ZW5kb3IgcHJlZml4ZWRcblx0aWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cblxuXHQvLyBDaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzXG5cdHZhciBjYXBOYW1lID0gbmFtZVsgMCBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKCAxICksXG5cdFx0aSA9IGNzc1ByZWZpeGVzLmxlbmd0aDtcblxuXHR3aGlsZSAoIGktLSApIHtcblx0XHRuYW1lID0gY3NzUHJlZml4ZXNbIGkgXSArIGNhcE5hbWU7XG5cdFx0aWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7XG5cdFx0XHRyZXR1cm4gbmFtZTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gc2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBzdWJ0cmFjdCApIHtcblxuXHQvLyBBbnkgcmVsYXRpdmUgKCsvLSkgdmFsdWVzIGhhdmUgYWxyZWFkeSBiZWVuXG5cdC8vIG5vcm1hbGl6ZWQgYXQgdGhpcyBwb2ludFxuXHR2YXIgbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKTtcblx0cmV0dXJuIG1hdGNoZXMgP1xuXG5cdFx0Ly8gR3VhcmQgYWdhaW5zdCB1bmRlZmluZWQgXCJzdWJ0cmFjdFwiLCBlLmcuLCB3aGVuIHVzZWQgYXMgaW4gY3NzSG9va3Ncblx0XHRNYXRoLm1heCggMCwgbWF0Y2hlc1sgMiBdIC0gKCBzdWJ0cmFjdCB8fCAwICkgKSArICggbWF0Y2hlc1sgMyBdIHx8IFwicHhcIiApIDpcblx0XHR2YWx1ZTtcbn1cblxuZnVuY3Rpb24gYXVnbWVudFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhLCBpc0JvcmRlckJveCwgc3R5bGVzICkge1xuXHR2YXIgaSxcblx0XHR2YWwgPSAwO1xuXG5cdC8vIElmIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQgbWVhc3VyZW1lbnQsIGF2b2lkIGF1Z21lbnRhdGlvblxuXHRpZiAoIGV4dHJhID09PSAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICkgKSB7XG5cdFx0aSA9IDQ7XG5cblx0Ly8gT3RoZXJ3aXNlIGluaXRpYWxpemUgZm9yIGhvcml6b250YWwgb3IgdmVydGljYWwgcHJvcGVydGllc1xuXHR9IGVsc2Uge1xuXHRcdGkgPSBuYW1lID09PSBcIndpZHRoXCIgPyAxIDogMDtcblx0fVxuXG5cdGZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHtcblxuXHRcdC8vIEJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpbiwgc28gYWRkIGl0IGlmIHdlIHdhbnQgaXRcblx0XHRpZiAoIGV4dHJhID09PSBcIm1hcmdpblwiICkge1xuXHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIGV4dHJhICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdGlmICggaXNCb3JkZXJCb3ggKSB7XG5cblx0XHRcdC8vIGJvcmRlci1ib3ggaW5jbHVkZXMgcGFkZGluZywgc28gcmVtb3ZlIGl0IGlmIHdlIHdhbnQgY29udGVudFxuXHRcdFx0aWYgKCBleHRyYSA9PT0gXCJjb250ZW50XCIgKSB7XG5cdFx0XHRcdHZhbCAtPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBhZGRpbmdcIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgYm9yZGVyIG5vciBtYXJnaW4sIHNvIHJlbW92ZSBib3JkZXJcblx0XHRcdGlmICggZXh0cmEgIT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHRcdHZhbCAtPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIEF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGNvbnRlbnQsIHNvIGFkZCBwYWRkaW5nXG5cdFx0XHR2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cblx0XHRcdC8vIEF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGNvbnRlbnQgbm9yIHBhZGRpbmcsIHNvIGFkZCBib3JkZXJcblx0XHRcdGlmICggZXh0cmEgIT09IFwicGFkZGluZ1wiICkge1xuXHRcdFx0XHR2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdmFsO1xufVxuXG5mdW5jdGlvbiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApIHtcblxuXHQvLyBTdGFydCB3aXRoIG9mZnNldCBwcm9wZXJ0eSwgd2hpY2ggaXMgZXF1aXZhbGVudCB0byB0aGUgYm9yZGVyLWJveCB2YWx1ZVxuXHR2YXIgdmFsLFxuXHRcdHZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlLFxuXHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLFxuXHRcdGlzQm9yZGVyQm94ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIjtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYSBkaXNjb25uZWN0ZWQgbm9kZVxuXHQvLyBpbiBJRSB0aHJvd3MgYW4gZXJyb3IuXG5cdGlmICggZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApIHtcblx0XHR2YWwgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpWyBuYW1lIF07XG5cdH1cblxuXHQvLyBTb21lIG5vbi1odG1sIGVsZW1lbnRzIHJldHVybiB1bmRlZmluZWQgZm9yIG9mZnNldFdpZHRoLCBzbyBjaGVjayBmb3IgbnVsbC91bmRlZmluZWRcblx0Ly8gc3ZnIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ5Mjg1XG5cdC8vIE1hdGhNTCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTQ5MTY2OFxuXHRpZiAoIHZhbCA8PSAwIHx8IHZhbCA9PSBudWxsICkge1xuXG5cdFx0Ly8gRmFsbCBiYWNrIHRvIGNvbXB1dGVkIHRoZW4gdW5jb21wdXRlZCBjc3MgaWYgbmVjZXNzYXJ5XG5cdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTtcblx0XHRpZiAoIHZhbCA8IDAgfHwgdmFsID09IG51bGwgKSB7XG5cdFx0XHR2YWwgPSBlbGVtLnN0eWxlWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0Ly8gQ29tcHV0ZWQgdW5pdCBpcyBub3QgcGl4ZWxzLiBTdG9wIGhlcmUgYW5kIHJldHVybi5cblx0XHRpZiAoIHJudW1ub25weC50ZXN0KCB2YWwgKSApIHtcblx0XHRcdHJldHVybiB2YWw7XG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXNcblx0XHQvLyBmb3IgZ2V0Q29tcHV0ZWRTdHlsZSBzaWxlbnRseSBmYWxscyBiYWNrIHRvIHRoZSByZWxpYWJsZSBlbGVtLnN0eWxlXG5cdFx0dmFsdWVJc0JvcmRlckJveCA9IGlzQm9yZGVyQm94ICYmXG5cdFx0XHQoIHN1cHBvcnQuYm94U2l6aW5nUmVsaWFibGUoKSB8fCB2YWwgPT09IGVsZW0uc3R5bGVbIG5hbWUgXSApO1xuXG5cdFx0Ly8gTm9ybWFsaXplIFwiXCIsIGF1dG8sIGFuZCBwcmVwYXJlIGZvciBleHRyYVxuXHRcdHZhbCA9IHBhcnNlRmxvYXQoIHZhbCApIHx8IDA7XG5cdH1cblxuXHQvLyBVc2UgdGhlIGFjdGl2ZSBib3gtc2l6aW5nIG1vZGVsIHRvIGFkZC9zdWJ0cmFjdCBpcnJlbGV2YW50IHN0eWxlc1xuXHRyZXR1cm4gKCB2YWwgK1xuXHRcdGF1Z21lbnRXaWR0aE9ySGVpZ2h0KFxuXHRcdFx0ZWxlbSxcblx0XHRcdG5hbWUsXG5cdFx0XHRleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICksXG5cdFx0XHR2YWx1ZUlzQm9yZGVyQm94LFxuXHRcdFx0c3R5bGVzXG5cdFx0KVxuXHQpICsgXCJweFwiO1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gQWRkIGluIHN0eWxlIHByb3BlcnR5IGhvb2tzIGZvciBvdmVycmlkaW5nIHRoZSBkZWZhdWx0XG5cdC8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eVxuXHRjc3NIb29rczoge1xuXHRcdG9wYWNpdHk6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0XHRcdFx0Ly8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHlcblx0XHRcdFx0XHR2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCBcIm9wYWNpdHlcIiApO1xuXHRcdFx0XHRcdHJldHVybiByZXQgPT09IFwiXCIgPyBcIjFcIiA6IHJldDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvLyBEb24ndCBhdXRvbWF0aWNhbGx5IGFkZCBcInB4XCIgdG8gdGhlc2UgcG9zc2libHktdW5pdGxlc3MgcHJvcGVydGllc1xuXHRjc3NOdW1iZXI6IHtcblx0XHRcImFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50XCI6IHRydWUsXG5cdFx0XCJjb2x1bW5Db3VudFwiOiB0cnVlLFxuXHRcdFwiZmlsbE9wYWNpdHlcIjogdHJ1ZSxcblx0XHRcImZsZXhHcm93XCI6IHRydWUsXG5cdFx0XCJmbGV4U2hyaW5rXCI6IHRydWUsXG5cdFx0XCJmb250V2VpZ2h0XCI6IHRydWUsXG5cdFx0XCJsaW5lSGVpZ2h0XCI6IHRydWUsXG5cdFx0XCJvcGFjaXR5XCI6IHRydWUsXG5cdFx0XCJvcmRlclwiOiB0cnVlLFxuXHRcdFwib3JwaGFuc1wiOiB0cnVlLFxuXHRcdFwid2lkb3dzXCI6IHRydWUsXG5cdFx0XCJ6SW5kZXhcIjogdHJ1ZSxcblx0XHRcInpvb21cIjogdHJ1ZVxuXHR9LFxuXG5cdC8vIEFkZCBpbiBwcm9wZXJ0aWVzIHdob3NlIG5hbWVzIHlvdSB3aXNoIHRvIGZpeCBiZWZvcmVcblx0Ly8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZVxuXHRjc3NQcm9wczoge1xuXHRcdFwiZmxvYXRcIjogXCJjc3NGbG9hdFwiXG5cdH0sXG5cblx0Ly8gR2V0IGFuZCBzZXQgdGhlIHN0eWxlIHByb3BlcnR5IG9uIGEgRE9NIE5vZGVcblx0c3R5bGU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSwgZXh0cmEgKSB7XG5cblx0XHQvLyBEb24ndCBzZXQgc3R5bGVzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXNcblx0XHRpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhZWxlbS5zdHlsZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWVcblx0XHR2YXIgcmV0LCB0eXBlLCBob29rcyxcblx0XHRcdG9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApLFxuXHRcdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdFx0bmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSB8fFxuXHRcdFx0KCBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggb3JpZ05hbWUgKSB8fCBvcmlnTmFtZSApO1xuXG5cdFx0Ly8gR2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbiwgdGhlbiB1bnByZWZpeGVkIHZlcnNpb25cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTtcblxuXHRcdC8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZVxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cblx0XHRcdC8vIENvbnZlcnQgXCIrPVwiIG9yIFwiLT1cIiB0byByZWxhdGl2ZSBudW1iZXJzICgjNzM0NSlcblx0XHRcdGlmICggdHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAoIHJldCA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmIHJldFsgMSBdICkge1xuXHRcdFx0XHR2YWx1ZSA9IGFkanVzdENTUyggZWxlbSwgbmFtZSwgcmV0ICk7XG5cblx0XHRcdFx0Ly8gRml4ZXMgYnVnICM5MjM3XG5cdFx0XHRcdHR5cGUgPSBcIm51bWJlclwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCBudWxsIGFuZCBOYU4gdmFsdWVzIGFyZW4ndCBzZXQgKCM3MTE2KVxuXHRcdFx0aWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBhIG51bWJlciB3YXMgcGFzc2VkIGluLCBhZGQgdGhlIHVuaXQgKGV4Y2VwdCBmb3IgY2VydGFpbiBDU1MgcHJvcGVydGllcylcblx0XHRcdGlmICggdHlwZSA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0dmFsdWUgKz0gcmV0ICYmIHJldFsgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgb3JpZ05hbWUgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gYmFja2dyb3VuZC0qIHByb3BzIGFmZmVjdCBvcmlnaW5hbCBjbG9uZSdzIHZhbHVlc1xuXHRcdFx0aWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09IFwiXCIgJiYgbmFtZS5pbmRleE9mKCBcImJhY2tncm91bmRcIiApID09PSAwICkge1xuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gXCJpbmhlcml0XCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQsIHVzZSB0aGF0IHZhbHVlLCBvdGhlcndpc2UganVzdCBzZXQgdGhlIHNwZWNpZmllZCB2YWx1ZVxuXHRcdFx0aWYgKCAhaG9va3MgfHwgISggXCJzZXRcIiBpbiBob29rcyApIHx8XG5cdFx0XHRcdCggdmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApICkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgbm9uLWNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmVcblx0XHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0XG5cdFx0XHRyZXR1cm4gc3R5bGVbIG5hbWUgXTtcblx0XHR9XG5cdH0sXG5cblx0Y3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHtcblx0XHR2YXIgdmFsLCBudW0sIGhvb2tzLFxuXHRcdFx0b3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICk7XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWVcblx0XHRuYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8XG5cdFx0XHQoIGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSA9IHZlbmRvclByb3BOYW1lKCBvcmlnTmFtZSApIHx8IG9yaWdOYW1lICk7XG5cblx0XHQvLyBUcnkgcHJlZml4ZWQgbmFtZSBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCBuYW1lXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07XG5cblx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbCA9IGhvb2tzLmdldCggZWxlbSwgdHJ1ZSwgZXh0cmEgKTtcblx0XHR9XG5cblx0XHQvLyBPdGhlcndpc2UsIGlmIGEgd2F5IHRvIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZXhpc3RzLCB1c2UgdGhhdFxuXHRcdGlmICggdmFsID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdC8vIENvbnZlcnQgXCJub3JtYWxcIiB0byBjb21wdXRlZCB2YWx1ZVxuXHRcdGlmICggdmFsID09PSBcIm5vcm1hbFwiICYmIG5hbWUgaW4gY3NzTm9ybWFsVHJhbnNmb3JtICkge1xuXHRcdFx0dmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBudW1lcmljIGlmIGZvcmNlZCBvciBhIHF1YWxpZmllciB3YXMgcHJvdmlkZWQgYW5kIHZhbCBsb29rcyBudW1lcmljXG5cdFx0aWYgKCBleHRyYSA9PT0gXCJcIiB8fCBleHRyYSApIHtcblx0XHRcdG51bSA9IHBhcnNlRmxvYXQoIHZhbCApO1xuXHRcdFx0cmV0dXJuIGV4dHJhID09PSB0cnVlIHx8IGlzRmluaXRlKCBudW0gKSA/IG51bSB8fCAwIDogdmFsO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiaGVpZ2h0XCIsIFwid2lkdGhcIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQsIGV4dHJhICkge1xuXHRcdFx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdFx0XHQvLyBDZXJ0YWluIGVsZW1lbnRzIGNhbiBoYXZlIGRpbWVuc2lvbiBpbmZvIGlmIHdlIGludmlzaWJseSBzaG93IHRoZW1cblx0XHRcdFx0Ly8gYnV0IGl0IG11c3QgaGF2ZSBhIGN1cnJlbnQgZGlzcGxheSBzdHlsZSB0aGF0IHdvdWxkIGJlbmVmaXRcblx0XHRcdFx0cmV0dXJuIHJkaXNwbGF5c3dhcC50ZXN0KCBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApICkgJiZcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFNhZmFyaSA4K1xuXHRcdFx0XHRcdC8vIFRhYmxlIGNvbHVtbnMgaW4gU2FmYXJpIGhhdmUgbm9uLXplcm8gb2Zmc2V0V2lkdGggJiB6ZXJvXG5cdFx0XHRcdFx0Ly8gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggdW5sZXNzIGRpc3BsYXkgaXMgY2hhbmdlZC5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0XHRcdFx0XHQvLyBSdW5uaW5nIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlXG5cdFx0XHRcdFx0Ly8gaW4gSUUgdGhyb3dzIGFuIGVycm9yLlxuXHRcdFx0XHRcdCggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggfHwgIWVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggKSA/XG5cdFx0XHRcdFx0XHRzd2FwKCBlbGVtLCBjc3NTaG93LCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7XG5cdFx0XHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRcdFx0Z2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIGV4dHJhICkge1xuXHRcdFx0dmFyIG1hdGNoZXMsXG5cdFx0XHRcdHN0eWxlcyA9IGV4dHJhICYmIGdldFN0eWxlcyggZWxlbSApLFxuXHRcdFx0XHRzdWJ0cmFjdCA9IGV4dHJhICYmIGF1Z21lbnRXaWR0aE9ySGVpZ2h0KFxuXHRcdFx0XHRcdGVsZW0sXG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHRleHRyYSxcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiLFxuXHRcdFx0XHRcdHN0eWxlc1xuXHRcdFx0XHQpO1xuXG5cdFx0XHQvLyBDb252ZXJ0IHRvIHBpeGVscyBpZiB2YWx1ZSBhZGp1c3RtZW50IGlzIG5lZWRlZFxuXHRcdFx0aWYgKCBzdWJ0cmFjdCAmJiAoIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJlxuXHRcdFx0XHQoIG1hdGNoZXNbIDMgXSB8fCBcInB4XCIgKSAhPT0gXCJweFwiICkge1xuXG5cdFx0XHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKTtcblx0XHR9XG5cdH07XG59ICk7XG5cbmpRdWVyeS5jc3NIb29rcy5tYXJnaW5MZWZ0ID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnJlbGlhYmxlTWFyZ2luTGVmdCxcblx0ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4gKCBwYXJzZUZsb2F0KCBjdXJDU1MoIGVsZW0sIFwibWFyZ2luTGVmdFwiICkgKSB8fFxuXHRcdFx0XHRlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLVxuXHRcdFx0XHRcdHN3YXAoIGVsZW0sIHsgbWFyZ2luTGVmdDogMCB9LCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG5cdFx0XHRcdFx0fSApXG5cdFx0XHRcdCkgKyBcInB4XCI7XG5cdFx0fVxuXHR9XG4pO1xuXG4vLyBUaGVzZSBob29rcyBhcmUgdXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzXG5qUXVlcnkuZWFjaCgge1xuXHRtYXJnaW46IFwiXCIsXG5cdHBhZGRpbmc6IFwiXCIsXG5cdGJvcmRlcjogXCJXaWR0aFwiXG59LCBmdW5jdGlvbiggcHJlZml4LCBzdWZmaXggKSB7XG5cdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0gPSB7XG5cdFx0ZXhwYW5kOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgaSA9IDAsXG5cdFx0XHRcdGV4cGFuZGVkID0ge30sXG5cblx0XHRcdFx0Ly8gQXNzdW1lcyBhIHNpbmdsZSBudW1iZXIgaWYgbm90IGEgc3RyaW5nXG5cdFx0XHRcdHBhcnRzID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUuc3BsaXQoIFwiIFwiICkgOiBbIHZhbHVlIF07XG5cblx0XHRcdGZvciAoIDsgaSA8IDQ7IGkrKyApIHtcblx0XHRcdFx0ZXhwYW5kZWRbIHByZWZpeCArIGNzc0V4cGFuZFsgaSBdICsgc3VmZml4IF0gPVxuXHRcdFx0XHRcdHBhcnRzWyBpIF0gfHwgcGFydHNbIGkgLSAyIF0gfHwgcGFydHNbIDAgXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGV4cGFuZGVkO1xuXHRcdH1cblx0fTtcblxuXHRpZiAoICFybWFyZ2luLnRlc3QoIHByZWZpeCApICkge1xuXHRcdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0uc2V0ID0gc2V0UG9zaXRpdmVOdW1iZXI7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRjc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgc3R5bGVzLCBsZW4sXG5cdFx0XHRcdG1hcCA9IHt9LFxuXHRcdFx0XHRpID0gMDtcblxuXHRcdFx0aWYgKCBqUXVlcnkuaXNBcnJheSggbmFtZSApICkge1xuXHRcdFx0XHRzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKTtcblx0XHRcdFx0bGVuID0gbmFtZS5sZW5ndGg7XG5cblx0XHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdFx0bWFwWyBuYW1lWyBpIF0gXSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWVbIGkgXSwgZmFsc2UsIHN0eWxlcyApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG1hcDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUsIHZhbHVlICkgOlxuXHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICk7XG5cdFx0fSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH1cbn0gKTtcblxuXG5mdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7XG5cdHJldHVybiBuZXcgVHdlZW4ucHJvdG90eXBlLmluaXQoIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICk7XG59XG5qUXVlcnkuVHdlZW4gPSBUd2VlbjtcblxuVHdlZW4ucHJvdG90eXBlID0ge1xuXHRjb25zdHJ1Y3RvcjogVHdlZW4sXG5cdGluaXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZywgdW5pdCApIHtcblx0XHR0aGlzLmVsZW0gPSBlbGVtO1xuXHRcdHRoaXMucHJvcCA9IHByb3A7XG5cdFx0dGhpcy5lYXNpbmcgPSBlYXNpbmcgfHwgalF1ZXJ5LmVhc2luZy5fZGVmYXVsdDtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXHRcdHRoaXMuc3RhcnQgPSB0aGlzLm5vdyA9IHRoaXMuY3VyKCk7XG5cdFx0dGhpcy5lbmQgPSBlbmQ7XG5cdFx0dGhpcy51bml0ID0gdW5pdCB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0fSxcblx0Y3VyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdO1xuXG5cdFx0cmV0dXJuIGhvb2tzICYmIGhvb2tzLmdldCA/XG5cdFx0XHRob29rcy5nZXQoIHRoaXMgKSA6XG5cdFx0XHRUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7XG5cdH0sXG5cdHJ1bjogZnVuY3Rpb24oIHBlcmNlbnQgKSB7XG5cdFx0dmFyIGVhc2VkLFxuXHRcdFx0aG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdO1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7XG5cdFx0XHR0aGlzLnBvcyA9IGVhc2VkID0galF1ZXJ5LmVhc2luZ1sgdGhpcy5lYXNpbmcgXShcblx0XHRcdFx0cGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVyY2VudCwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnBvcyA9IGVhc2VkID0gcGVyY2VudDtcblx0XHR9XG5cdFx0dGhpcy5ub3cgPSAoIHRoaXMuZW5kIC0gdGhpcy5zdGFydCApICogZWFzZWQgKyB0aGlzLnN0YXJ0O1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHtcblx0XHRcdHRoaXMub3B0aW9ucy5zdGVwLmNhbGwoIHRoaXMuZWxlbSwgdGhpcy5ub3csIHRoaXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIGhvb2tzLnNldCApIHtcblx0XHRcdGhvb2tzLnNldCggdGhpcyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KCB0aGlzICk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59O1xuXG5Ud2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7XG5cblR3ZWVuLnByb3BIb29rcyA9IHtcblx0X2RlZmF1bHQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblx0XHRcdHZhciByZXN1bHQ7XG5cblx0XHRcdC8vIFVzZSBhIHByb3BlcnR5IG9uIHRoZSBlbGVtZW50IGRpcmVjdGx5IHdoZW4gaXQgaXMgbm90IGEgRE9NIGVsZW1lbnQsXG5cdFx0XHQvLyBvciB3aGVuIHRoZXJlIGlzIG5vIG1hdGNoaW5nIHN0eWxlIHByb3BlcnR5IHRoYXQgZXhpc3RzLlxuXHRcdFx0aWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICE9PSAxIHx8XG5cdFx0XHRcdHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSAhPSBudWxsICYmIHR3ZWVuLmVsZW0uc3R5bGVbIHR3ZWVuLnByb3AgXSA9PSBudWxsICkge1xuXHRcdFx0XHRyZXR1cm4gdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBQYXNzaW5nIGFuIGVtcHR5IHN0cmluZyBhcyBhIDNyZCBwYXJhbWV0ZXIgdG8gLmNzcyB3aWxsIGF1dG9tYXRpY2FsbHlcblx0XHRcdC8vIGF0dGVtcHQgYSBwYXJzZUZsb2F0IGFuZCBmYWxsYmFjayB0byBhIHN0cmluZyBpZiB0aGUgcGFyc2UgZmFpbHMuXG5cdFx0XHQvLyBTaW1wbGUgdmFsdWVzIHN1Y2ggYXMgXCIxMHB4XCIgYXJlIHBhcnNlZCB0byBGbG9hdDtcblx0XHRcdC8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgXCJyb3RhdGUoMXJhZClcIiBhcmUgcmV0dXJuZWQgYXMtaXMuXG5cdFx0XHRyZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCBcIlwiICk7XG5cblx0XHRcdC8vIEVtcHR5IHN0cmluZ3MsIG51bGwsIHVuZGVmaW5lZCBhbmQgXCJhdXRvXCIgYXJlIGNvbnZlcnRlZCB0byAwLlxuXHRcdFx0cmV0dXJuICFyZXN1bHQgfHwgcmVzdWx0ID09PSBcImF1dG9cIiA/IDAgOiByZXN1bHQ7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblxuXHRcdFx0Ly8gVXNlIHN0ZXAgaG9vayBmb3IgYmFjayBjb21wYXQuXG5cdFx0XHQvLyBVc2UgY3NzSG9vayBpZiBpdHMgdGhlcmUuXG5cdFx0XHQvLyBVc2UgLnN0eWxlIGlmIGF2YWlsYWJsZSBhbmQgdXNlIHBsYWluIHByb3BlcnRpZXMgd2hlcmUgYXZhaWxhYmxlLlxuXHRcdFx0aWYgKCBqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdICkge1xuXHRcdFx0XHRqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdKCB0d2VlbiApO1xuXHRcdFx0fSBlbHNlIGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHQoIHR3ZWVuLmVsZW0uc3R5bGVbIGpRdWVyeS5jc3NQcm9wc1sgdHdlZW4ucHJvcCBdIF0gIT0gbnVsbCB8fFxuXHRcdFx0XHRcdGpRdWVyeS5jc3NIb29rc1sgdHdlZW4ucHJvcCBdICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuLy8gU3VwcG9ydDogSUUgPD05IG9ubHlcbi8vIFBhbmljIGJhc2VkIGFwcHJvYWNoIHRvIHNldHRpbmcgdGhpbmdzIG9uIGRpc2Nvbm5lY3RlZCBub2Rlc1xuVHdlZW4ucHJvcEhvb2tzLnNjcm9sbFRvcCA9IFR3ZWVuLnByb3BIb29rcy5zY3JvbGxMZWZ0ID0ge1xuXHRzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgJiYgdHdlZW4uZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LmVhc2luZyA9IHtcblx0bGluZWFyOiBmdW5jdGlvbiggcCApIHtcblx0XHRyZXR1cm4gcDtcblx0fSxcblx0c3dpbmc6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiAwLjUgLSBNYXRoLmNvcyggcCAqIE1hdGguUEkgKSAvIDI7XG5cdH0sXG5cdF9kZWZhdWx0OiBcInN3aW5nXCJcbn07XG5cbmpRdWVyeS5meCA9IFR3ZWVuLnByb3RvdHlwZS5pbml0O1xuXG4vLyBCYWNrIGNvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludFxualF1ZXJ5LmZ4LnN0ZXAgPSB7fTtcblxuXG5cblxudmFyXG5cdGZ4Tm93LCB0aW1lcklkLFxuXHRyZnh0eXBlcyA9IC9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxcblx0cnJ1biA9IC9xdWV1ZUhvb2tzJC87XG5cbmZ1bmN0aW9uIHJhZigpIHtcblx0aWYgKCB0aW1lcklkICkge1xuXHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIHJhZiApO1xuXHRcdGpRdWVyeS5meC50aWNrKCk7XG5cdH1cbn1cblxuLy8gQW5pbWF0aW9ucyBjcmVhdGVkIHN5bmNocm9ub3VzbHkgd2lsbCBydW4gc3luY2hyb25vdXNseVxuZnVuY3Rpb24gY3JlYXRlRnhOb3coKSB7XG5cdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRmeE5vdyA9IHVuZGVmaW5lZDtcblx0fSApO1xuXHRyZXR1cm4gKCBmeE5vdyA9IGpRdWVyeS5ub3coKSApO1xufVxuXG4vLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvblxuZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGluY2x1ZGVXaWR0aCApIHtcblx0dmFyIHdoaWNoLFxuXHRcdGkgPSAwLFxuXHRcdGF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTtcblxuXHQvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsXG5cdC8vIG90aGVyd2lzZSBzdGVwIHZhbHVlIGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0XG5cdGluY2x1ZGVXaWR0aCA9IGluY2x1ZGVXaWR0aCA/IDEgOiAwO1xuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7XG5cdFx0d2hpY2ggPSBjc3NFeHBhbmRbIGkgXTtcblx0XHRhdHRyc1sgXCJtYXJnaW5cIiArIHdoaWNoIF0gPSBhdHRyc1sgXCJwYWRkaW5nXCIgKyB3aGljaCBdID0gdHlwZTtcblx0fVxuXG5cdGlmICggaW5jbHVkZVdpZHRoICkge1xuXHRcdGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7XG5cdH1cblxuXHRyZXR1cm4gYXR0cnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVR3ZWVuKCB2YWx1ZSwgcHJvcCwgYW5pbWF0aW9uICkge1xuXHR2YXIgdHdlZW4sXG5cdFx0Y29sbGVjdGlvbiA9ICggQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW10gKS5jb25jYXQoIEFuaW1hdGlvbi50d2VlbmVyc1sgXCIqXCIgXSApLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRpZiAoICggdHdlZW4gPSBjb2xsZWN0aW9uWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgcHJvcCwgdmFsdWUgKSApICkge1xuXG5cdFx0XHQvLyBXZSdyZSBkb25lIHdpdGggdGhpcyBwcm9wZXJ0eVxuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0UHJlZmlsdGVyKCBlbGVtLCBwcm9wcywgb3B0cyApIHtcblx0dmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LFxuXHRcdGlzQm94ID0gXCJ3aWR0aFwiIGluIHByb3BzIHx8IFwiaGVpZ2h0XCIgaW4gcHJvcHMsXG5cdFx0YW5pbSA9IHRoaXMsXG5cdFx0b3JpZyA9IHt9LFxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZSxcblx0XHRoaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApLFxuXHRcdGRhdGFTaG93ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cblx0Ly8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzXG5cdGlmICggIW9wdHMucXVldWUgKSB7XG5cdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIFwiZnhcIiApO1xuXHRcdGlmICggaG9va3MudW5xdWV1ZWQgPT0gbnVsbCApIHtcblx0XHRcdGhvb2tzLnVucXVldWVkID0gMDtcblx0XHRcdG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlO1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICFob29rcy51bnF1ZXVlZCApIHtcblx0XHRcdFx0XHRvbGRmaXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdGhvb2tzLnVucXVldWVkKys7XG5cblx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzXG5cdFx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGhvb2tzLnVucXVldWVkLS07XG5cdFx0XHRcdGlmICggIWpRdWVyeS5xdWV1ZSggZWxlbSwgXCJmeFwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRmb3IgKCBwcm9wIGluIHByb3BzICkge1xuXHRcdHZhbHVlID0gcHJvcHNbIHByb3AgXTtcblx0XHRpZiAoIHJmeHR5cGVzLnRlc3QoIHZhbHVlICkgKSB7XG5cdFx0XHRkZWxldGUgcHJvcHNbIHByb3AgXTtcblx0XHRcdHRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gXCJ0b2dnbGVcIjtcblx0XHRcdGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gXCJoaWRlXCIgOiBcInNob3dcIiApICkge1xuXG5cdFx0XHRcdC8vIFByZXRlbmQgdG8gYmUgaGlkZGVuIGlmIHRoaXMgaXMgYSBcInNob3dcIiBhbmRcblx0XHRcdFx0Ly8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGVcblx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gXCJzaG93XCIgJiYgZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGhpZGRlbiA9IHRydWU7XG5cblx0XHRcdFx0Ly8gSWdub3JlIGFsbCBvdGhlciBuby1vcCBzaG93L2hpZGUgZGF0YVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvcmlnWyBwcm9wIF0gPSBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpXG5cdHByb3BUd2VlbiA9ICFqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcHMgKTtcblx0aWYgKCAhcHJvcFR3ZWVuICYmIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gUmVzdHJpY3QgXCJvdmVyZmxvd1wiIGFuZCBcImRpc3BsYXlcIiBzdHlsZXMgZHVyaW5nIGJveCBhbmltYXRpb25zXG5cdGlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExLCBFZGdlIDEyIC0gMTNcblx0XHQvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFIGRvZXMgbm90IGluZmVyIHRoZSBzaG9ydGhhbmRcblx0XHQvLyBmcm9tIGlkZW50aWNhbGx5LXZhbHVlZCBvdmVyZmxvd1ggYW5kIG92ZXJmbG93WVxuXHRcdG9wdHMub3ZlcmZsb3cgPSBbIHN0eWxlLm92ZXJmbG93LCBzdHlsZS5vdmVyZmxvd1gsIHN0eWxlLm92ZXJmbG93WSBdO1xuXG5cdFx0Ly8gSWRlbnRpZnkgYSBkaXNwbGF5IHR5cGUsIHByZWZlcnJpbmcgb2xkIHNob3cvaGlkZSBkYXRhIG92ZXIgdGhlIENTUyBjYXNjYWRlXG5cdFx0cmVzdG9yZURpc3BsYXkgPSBkYXRhU2hvdyAmJiBkYXRhU2hvdy5kaXNwbGF5O1xuXHRcdGlmICggcmVzdG9yZURpc3BsYXkgPT0gbnVsbCApIHtcblx0XHRcdHJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXHRcdH1cblx0XHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSApIHtcblx0XHRcdFx0ZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5O1xuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBHZXQgbm9uZW1wdHkgdmFsdWUocykgYnkgdGVtcG9yYXJpbHkgZm9yY2luZyB2aXNpYmlsaXR5XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApO1xuXHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheSB8fCByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFuaW1hdGUgaW5saW5lIGVsZW1lbnRzIGFzIGlubGluZS1ibG9ja1xuXHRcdGlmICggZGlzcGxheSA9PT0gXCJpbmxpbmVcIiB8fCBkaXNwbGF5ID09PSBcImlubGluZS1ibG9ja1wiICYmIHJlc3RvcmVEaXNwbGF5ICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZmxvYXRcIiApID09PSBcIm5vbmVcIiApIHtcblxuXHRcdFx0XHQvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBkaXNwbGF5IHZhbHVlIGF0IHRoZSBlbmQgb2YgcHVyZSBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRcdFx0XHRpZiAoICFwcm9wVHdlZW4gKSB7XG5cdFx0XHRcdFx0YW5pbS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0ZGlzcGxheSA9IHN0eWxlLmRpc3BsYXk7XG5cdFx0XHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09IFwibm9uZVwiID8gXCJcIiA6IGRpc3BsYXk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICggb3B0cy5vdmVyZmxvdyApIHtcblx0XHRzdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0c3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gSW1wbGVtZW50IHNob3cvaGlkZSBhbmltYXRpb25zXG5cdHByb3BUd2VlbiA9IGZhbHNlO1xuXHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cblx0XHQvLyBHZW5lcmFsIHNob3cvaGlkZSBzZXR1cCBmb3IgdGhpcyBlbGVtZW50IGFuaW1hdGlvblxuXHRcdGlmICggIXByb3BUd2VlbiApIHtcblx0XHRcdGlmICggZGF0YVNob3cgKSB7XG5cdFx0XHRcdGlmICggXCJoaWRkZW5cIiBpbiBkYXRhU2hvdyApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRhdGFTaG93ID0gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBcImZ4c2hvd1wiLCB7IGRpc3BsYXk6IHJlc3RvcmVEaXNwbGF5IH0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RvcmUgaGlkZGVuL3Zpc2libGUgZm9yIHRvZ2dsZSBzbyBgLnN0b3AoKS50b2dnbGUoKWAgXCJyZXZlcnNlc1wiXG5cdFx0XHRpZiAoIHRvZ2dsZSApIHtcblx0XHRcdFx0ZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW1cblx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8qIGVzbGludC1lbmFibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdFx0Ly8gVGhlIGZpbmFsIHN0ZXAgb2YgYSBcImhpZGVcIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50XG5cdFx0XHRcdGlmICggIWhpZGRlbiApIHtcblx0XHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFwiZnhzaG93XCIgKTtcblx0XHRcdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgb3JpZ1sgcHJvcCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHQvLyBQZXItcHJvcGVydHkgc2V0dXBcblx0XHRwcm9wVHdlZW4gPSBjcmVhdGVUd2VlbiggaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6IDAsIHByb3AsIGFuaW0gKTtcblx0XHRpZiAoICEoIHByb3AgaW4gZGF0YVNob3cgKSApIHtcblx0XHRcdGRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7XG5cdFx0XHRpZiAoIGhpZGRlbiApIHtcblx0XHRcdFx0cHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDtcblx0XHRcdFx0cHJvcFR3ZWVuLnN0YXJ0ID0gMDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJvcEZpbHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7XG5cdHZhciBpbmRleCwgbmFtZSwgZWFzaW5nLCB2YWx1ZSwgaG9va3M7XG5cblx0Ly8gY2FtZWxDYXNlLCBzcGVjaWFsRWFzaW5nIGFuZCBleHBhbmQgY3NzSG9vayBwYXNzXG5cdGZvciAoIGluZGV4IGluIHByb3BzICkge1xuXHRcdG5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBpbmRleCApO1xuXHRcdGVhc2luZyA9IHNwZWNpYWxFYXNpbmdbIG5hbWUgXTtcblx0XHR2YWx1ZSA9IHByb3BzWyBpbmRleCBdO1xuXHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRlYXNpbmcgPSB2YWx1ZVsgMSBdO1xuXHRcdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyAwIF07XG5cdFx0fVxuXG5cdFx0aWYgKCBpbmRleCAhPT0gbmFtZSApIHtcblx0XHRcdHByb3BzWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgaW5kZXggXTtcblx0XHR9XG5cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdO1xuXHRcdGlmICggaG9va3MgJiYgXCJleHBhbmRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbHVlID0gaG9va3MuZXhwYW5kKCB2YWx1ZSApO1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBuYW1lIF07XG5cblx0XHRcdC8vIE5vdCBxdWl0ZSAkLmV4dGVuZCwgdGhpcyB3b24ndCBvdmVyd3JpdGUgZXhpc3Rpbmcga2V5cy5cblx0XHRcdC8vIFJldXNpbmcgJ2luZGV4JyBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgXCJuYW1lXCJcblx0XHRcdGZvciAoIGluZGV4IGluIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICEoIGluZGV4IGluIHByb3BzICkgKSB7XG5cdFx0XHRcdFx0cHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgaW5kZXggXTtcblx0XHRcdFx0XHRzcGVjaWFsRWFzaW5nWyBpbmRleCBdID0gZWFzaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZztcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gQW5pbWF0aW9uKCBlbGVtLCBwcm9wZXJ0aWVzLCBvcHRpb25zICkge1xuXHR2YXIgcmVzdWx0LFxuXHRcdHN0b3BwZWQsXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IEFuaW1hdGlvbi5wcmVmaWx0ZXJzLmxlbmd0aCxcblx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvclxuXHRcdFx0ZGVsZXRlIHRpY2suZWxlbTtcblx0XHR9ICksXG5cdFx0dGljayA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBzdG9wcGVkICkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHR2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0XHRyZW1haW5pbmcgPSBNYXRoLm1heCggMCwgYW5pbWF0aW9uLnN0YXJ0VGltZSArIGFuaW1hdGlvbi5kdXJhdGlvbiAtIGN1cnJlbnRUaW1lICksXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCAyLjMgb25seVxuXHRcdFx0XHQvLyBBcmNoYWljIGNyYXNoIGJ1ZyB3b24ndCBhbGxvdyB1cyB0byB1c2UgYDEgLSAoIDAuNSB8fCAwIClgICgjMTI0OTcpXG5cdFx0XHRcdHRlbXAgPSByZW1haW5pbmcgLyBhbmltYXRpb24uZHVyYXRpb24gfHwgMCxcblx0XHRcdFx0cGVyY2VudCA9IDEgLSB0ZW1wLFxuXHRcdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRcdGxlbmd0aCA9IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoO1xuXG5cdFx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggcGVyY2VudCApO1xuXHRcdFx0fVxuXG5cdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgcGVyY2VudCwgcmVtYWluaW5nIF0gKTtcblxuXHRcdFx0aWYgKCBwZXJjZW50IDwgMSAmJiBsZW5ndGggKSB7XG5cdFx0XHRcdHJldHVybiByZW1haW5pbmc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggZWxlbSwgWyBhbmltYXRpb24gXSApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRhbmltYXRpb24gPSBkZWZlcnJlZC5wcm9taXNlKCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0cHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksXG5cdFx0XHRvcHRzOiBqUXVlcnkuZXh0ZW5kKCB0cnVlLCB7XG5cdFx0XHRcdHNwZWNpYWxFYXNpbmc6IHt9LFxuXHRcdFx0XHRlYXNpbmc6IGpRdWVyeS5lYXNpbmcuX2RlZmF1bHRcblx0XHRcdH0sIG9wdGlvbnMgKSxcblx0XHRcdG9yaWdpbmFsUHJvcGVydGllczogcHJvcGVydGllcyxcblx0XHRcdG9yaWdpbmFsT3B0aW9uczogb3B0aW9ucyxcblx0XHRcdHN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdGR1cmF0aW9uOiBvcHRpb25zLmR1cmF0aW9uLFxuXHRcdFx0dHdlZW5zOiBbXSxcblx0XHRcdGNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkge1xuXHRcdFx0XHR2YXIgdHdlZW4gPSBqUXVlcnkuVHdlZW4oIGVsZW0sIGFuaW1hdGlvbi5vcHRzLCBwcm9wLCBlbmQsXG5cdFx0XHRcdFx0XHRhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7XG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnMucHVzaCggdHdlZW4gKTtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdFx0fSxcblx0XHRcdHN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkge1xuXHRcdFx0XHR2YXIgaW5kZXggPSAwLFxuXG5cdFx0XHRcdFx0Ly8gSWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdlZW5zXG5cdFx0XHRcdFx0Ly8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0XG5cdFx0XHRcdFx0bGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDtcblx0XHRcdFx0aWYgKCBzdG9wcGVkICkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN0b3BwZWQgPSB0cnVlO1xuXHRcdFx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRcdGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCAxICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZXNvbHZlIHdoZW4gd2UgcGxheWVkIHRoZSBsYXN0IGZyYW1lOyBvdGhlcndpc2UsIHJlamVjdFxuXHRcdFx0XHRpZiAoIGdvdG9FbmQgKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApO1xuXHRcdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fVxuXHRcdH0gKSxcblx0XHRwcm9wcyA9IGFuaW1hdGlvbi5wcm9wcztcblxuXHRwcm9wRmlsdGVyKCBwcm9wcywgYW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZyApO1xuXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0cmVzdWx0ID0gQW5pbWF0aW9uLnByZWZpbHRlcnNbIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBlbGVtLCBwcm9wcywgYW5pbWF0aW9uLm9wdHMgKTtcblx0XHRpZiAoIHJlc3VsdCApIHtcblx0XHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHJlc3VsdC5zdG9wICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggYW5pbWF0aW9uLmVsZW0sIGFuaW1hdGlvbi5vcHRzLnF1ZXVlICkuc3RvcCA9XG5cdFx0XHRcdFx0alF1ZXJ5LnByb3h5KCByZXN1bHQuc3RvcCwgcmVzdWx0ICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0fVxuXG5cdGpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7XG5cblx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHtcblx0XHRhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTtcblx0fVxuXG5cdGpRdWVyeS5meC50aW1lcihcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0YW5pbTogYW5pbWF0aW9uLFxuXHRcdFx0cXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlXG5cdFx0fSApXG5cdCk7XG5cblx0Ly8gYXR0YWNoIGNhbGxiYWNrcyBmcm9tIG9wdGlvbnNcblx0cmV0dXJuIGFuaW1hdGlvbi5wcm9ncmVzcyggYW5pbWF0aW9uLm9wdHMucHJvZ3Jlc3MgKVxuXHRcdC5kb25lKCBhbmltYXRpb24ub3B0cy5kb25lLCBhbmltYXRpb24ub3B0cy5jb21wbGV0ZSApXG5cdFx0LmZhaWwoIGFuaW1hdGlvbi5vcHRzLmZhaWwgKVxuXHRcdC5hbHdheXMoIGFuaW1hdGlvbi5vcHRzLmFsd2F5cyApO1xufVxuXG5qUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7XG5cblx0dHdlZW5lcnM6IHtcblx0XHRcIipcIjogWyBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApO1xuXHRcdFx0YWRqdXN0Q1NTKCB0d2Vlbi5lbGVtLCBwcm9wLCByY3NzTnVtLmV4ZWMoIHZhbHVlICksIHR3ZWVuICk7XG5cdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0fSBdXG5cdH0sXG5cblx0dHdlZW5lcjogZnVuY3Rpb24oIHByb3BzLCBjYWxsYmFjayApIHtcblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwcm9wcyApICkge1xuXHRcdFx0Y2FsbGJhY2sgPSBwcm9wcztcblx0XHRcdHByb3BzID0gWyBcIipcIiBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wcyA9IHByb3BzLm1hdGNoKCBybm90aHRtbHdoaXRlICk7XG5cdFx0fVxuXG5cdFx0dmFyIHByb3AsXG5cdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0cHJvcCA9IHByb3BzWyBpbmRleCBdO1xuXHRcdFx0QW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gPSBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXTtcblx0XHRcdEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9LFxuXG5cdHByZWZpbHRlcnM6IFsgZGVmYXVsdFByZWZpbHRlciBdLFxuXG5cdHByZWZpbHRlcjogZnVuY3Rpb24oIGNhbGxiYWNrLCBwcmVwZW5kICkge1xuXHRcdGlmICggcHJlcGVuZCApIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cbmpRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBmbiApIHtcblx0dmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBzcGVlZCA9PT0gXCJvYmplY3RcIiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDoge1xuXHRcdGNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8XG5cdFx0XHRqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCxcblx0XHRkdXJhdGlvbjogc3BlZWQsXG5cdFx0ZWFzaW5nOiBmbiAmJiBlYXNpbmcgfHwgZWFzaW5nICYmICFqUXVlcnkuaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nXG5cdH07XG5cblx0Ly8gR28gdG8gdGhlIGVuZCBzdGF0ZSBpZiBmeCBhcmUgb2ZmIG9yIGlmIGRvY3VtZW50IGlzIGhpZGRlblxuXHRpZiAoIGpRdWVyeS5meC5vZmYgfHwgZG9jdW1lbnQuaGlkZGVuICkge1xuXHRcdG9wdC5kdXJhdGlvbiA9IDA7XG5cblx0fSBlbHNlIHtcblx0XHRpZiAoIHR5cGVvZiBvcHQuZHVyYXRpb24gIT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRpZiAoIG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzICkge1xuXHRcdFx0XHRvcHQuZHVyYXRpb24gPSBqUXVlcnkuZnguc3BlZWRzWyBvcHQuZHVyYXRpb24gXTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBOb3JtYWxpemUgb3B0LnF1ZXVlIC0gdHJ1ZS91bmRlZmluZWQvbnVsbCAtPiBcImZ4XCJcblx0aWYgKCBvcHQucXVldWUgPT0gbnVsbCB8fCBvcHQucXVldWUgPT09IHRydWUgKSB7XG5cdFx0b3B0LnF1ZXVlID0gXCJmeFwiO1xuXHR9XG5cblx0Ly8gUXVldWVpbmdcblx0b3B0Lm9sZCA9IG9wdC5jb21wbGV0ZTtcblxuXHRvcHQuY29tcGxldGUgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHQub2xkICkgKSB7XG5cdFx0XHRvcHQub2xkLmNhbGwoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIG9wdC5xdWV1ZSApIHtcblx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCBvcHQucXVldWUgKTtcblx0XHR9XG5cdH07XG5cblx0cmV0dXJuIG9wdDtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXG5cdFx0Ly8gU2hvdyBhbnkgaGlkZGVuIGVsZW1lbnRzIGFmdGVyIHNldHRpbmcgb3BhY2l0eSB0byAwXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBpc0hpZGRlbldpdGhpblRyZWUgKS5jc3MoIFwib3BhY2l0eVwiLCAwICkuc2hvdygpXG5cblx0XHRcdC8vIEFuaW1hdGUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZFxuXHRcdFx0LmVuZCgpLmFuaW1hdGUoIHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fSxcblx0YW5pbWF0ZTogZnVuY3Rpb24oIHByb3AsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHZhciBlbXB0eSA9IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBwcm9wICksXG5cdFx0XHRvcHRhbGwgPSBqUXVlcnkuc3BlZWQoIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICksXG5cdFx0XHRkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdC8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0XG5cdFx0XHRcdHZhciBhbmltID0gQW5pbWF0aW9uKCB0aGlzLCBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcCApLCBvcHRhbGwgKTtcblxuXHRcdFx0XHQvLyBFbXB0eSBhbmltYXRpb25zLCBvciBmaW5pc2hpbmcgcmVzb2x2ZXMgaW1tZWRpYXRlbHlcblx0XHRcdFx0aWYgKCBlbXB0eSB8fCBkYXRhUHJpdi5nZXQoIHRoaXMsIFwiZmluaXNoXCIgKSApIHtcblx0XHRcdFx0XHRhbmltLnN0b3AoIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGRvQW5pbWF0aW9uLmZpbmlzaCA9IGRvQW5pbWF0aW9uO1xuXG5cdFx0cmV0dXJuIGVtcHR5IHx8IG9wdGFsbC5xdWV1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0dGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDpcblx0XHRcdHRoaXMucXVldWUoIG9wdGFsbC5xdWV1ZSwgZG9BbmltYXRpb24gKTtcblx0fSxcblx0c3RvcDogZnVuY3Rpb24oIHR5cGUsIGNsZWFyUXVldWUsIGdvdG9FbmQgKSB7XG5cdFx0dmFyIHN0b3BRdWV1ZSA9IGZ1bmN0aW9uKCBob29rcyApIHtcblx0XHRcdHZhciBzdG9wID0gaG9va3Muc3RvcDtcblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xuXHRcdFx0c3RvcCggZ290b0VuZCApO1xuXHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0Z290b0VuZCA9IGNsZWFyUXVldWU7XG5cdFx0XHRjbGVhclF1ZXVlID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICggY2xlYXJRdWV1ZSAmJiB0eXBlICE9PSBmYWxzZSApIHtcblx0XHRcdHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGRlcXVldWUgPSB0cnVlLFxuXHRcdFx0XHRpbmRleCA9IHR5cGUgIT0gbnVsbCAmJiB0eXBlICsgXCJxdWV1ZUhvb2tzXCIsXG5cdFx0XHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXG5cdFx0XHRcdGRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKTtcblxuXHRcdFx0aWYgKCBpbmRleCApIHtcblx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCApIHtcblx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yICggaW5kZXggaW4gZGF0YSApIHtcblx0XHRcdFx0XHRpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHtcblx0XHRcdFx0XHRcdHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmXG5cdFx0XHRcdFx0KCB0eXBlID09IG51bGwgfHwgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlICkgKSB7XG5cblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7XG5cdFx0XHRcdFx0ZGVxdWV1ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhcnQgdGhlIG5leHQgaW4gdGhlIHF1ZXVlIGlmIHRoZSBsYXN0IHN0ZXAgd2Fzbid0IGZvcmNlZC5cblx0XHRcdC8vIFRpbWVycyBjdXJyZW50bHkgd2lsbCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2hcblx0XHRcdC8vIHdpbGwgZGVxdWV1ZSBidXQgb25seSBpZiB0aGV5IHdlcmUgZ290b0VuZC5cblx0XHRcdGlmICggZGVxdWV1ZSB8fCAhZ290b0VuZCApIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cdGZpbmlzaDogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0aWYgKCB0eXBlICE9PSBmYWxzZSApIHtcblx0XHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaW5kZXgsXG5cdFx0XHRcdGRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKSxcblx0XHRcdFx0cXVldWUgPSBkYXRhWyB0eXBlICsgXCJxdWV1ZVwiIF0sXG5cdFx0XHRcdGhvb2tzID0gZGF0YVsgdHlwZSArIFwicXVldWVIb29rc1wiIF0sXG5cdFx0XHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXG5cdFx0XHRcdGxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDtcblxuXHRcdFx0Ly8gRW5hYmxlIGZpbmlzaGluZyBmbGFnIG9uIHByaXZhdGUgZGF0YVxuXHRcdFx0ZGF0YS5maW5pc2ggPSB0cnVlO1xuXG5cdFx0XHQvLyBFbXB0eSB0aGUgcXVldWUgZmlyc3Rcblx0XHRcdGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTtcblxuXHRcdFx0aWYgKCBob29rcyAmJiBob29rcy5zdG9wICkge1xuXHRcdFx0XHRob29rcy5zdG9wLmNhbGwoIHRoaXMsIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTG9vayBmb3IgYW55IGFjdGl2ZSBhbmltYXRpb25zLCBhbmQgZmluaXNoIHRoZW1cblx0XHRcdGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7XG5cdFx0XHRcdGlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiYgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlICkge1xuXHRcdFx0XHRcdHRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIHRydWUgKTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIExvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRpZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHtcblx0XHRcdFx0XHRxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFR1cm4gb2ZmIGZpbmlzaGluZyBmbGFnXG5cdFx0XHRkZWxldGUgZGF0YS5maW5pc2g7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwidG9nZ2xlXCIsIFwic2hvd1wiLCBcImhpZGVcIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0dmFyIGNzc0ZuID0galF1ZXJ5LmZuWyBuYW1lIF07XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gXCJib29sZWFuXCIgP1xuXHRcdFx0Y3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDpcblx0XHRcdHRoaXMuYW5pbWF0ZSggZ2VuRngoIG5hbWUsIHRydWUgKSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0gKTtcblxuLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9uc1xualF1ZXJ5LmVhY2goIHtcblx0c2xpZGVEb3duOiBnZW5GeCggXCJzaG93XCIgKSxcblx0c2xpZGVVcDogZ2VuRngoIFwiaGlkZVwiICksXG5cdHNsaWRlVG9nZ2xlOiBnZW5GeCggXCJ0b2dnbGVcIiApLFxuXHRmYWRlSW46IHsgb3BhY2l0eTogXCJzaG93XCIgfSxcblx0ZmFkZU91dDogeyBvcGFjaXR5OiBcImhpZGVcIiB9LFxuXHRmYWRlVG9nZ2xlOiB7IG9wYWNpdHk6IFwidG9nZ2xlXCIgfVxufSwgZnVuY3Rpb24oIG5hbWUsIHByb3BzICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0gKTtcblxualF1ZXJ5LnRpbWVycyA9IFtdO1xualF1ZXJ5LmZ4LnRpY2sgPSBmdW5jdGlvbigpIHtcblx0dmFyIHRpbWVyLFxuXHRcdGkgPSAwLFxuXHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnM7XG5cblx0ZnhOb3cgPSBqUXVlcnkubm93KCk7XG5cblx0Zm9yICggOyBpIDwgdGltZXJzLmxlbmd0aDsgaSsrICkge1xuXHRcdHRpbWVyID0gdGltZXJzWyBpIF07XG5cblx0XHQvLyBDaGVja3MgdGhlIHRpbWVyIGhhcyBub3QgYWxyZWFkeSBiZWVuIHJlbW92ZWRcblx0XHRpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHtcblx0XHRcdHRpbWVycy5zcGxpY2UoIGktLSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdGlmICggIXRpbWVycy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0b3AoKTtcblx0fVxuXHRmeE5vdyA9IHVuZGVmaW5lZDtcbn07XG5cbmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHtcblx0alF1ZXJ5LnRpbWVycy5wdXNoKCB0aW1lciApO1xuXHRpZiAoIHRpbWVyKCkgKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0YXJ0KCk7XG5cdH0gZWxzZSB7XG5cdFx0alF1ZXJ5LnRpbWVycy5wb3AoKTtcblx0fVxufTtcblxualF1ZXJ5LmZ4LmludGVydmFsID0gMTM7XG5qUXVlcnkuZnguc3RhcnQgPSBmdW5jdGlvbigpIHtcblx0aWYgKCAhdGltZXJJZCApIHtcblx0XHR0aW1lcklkID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/XG5cdFx0XHR3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCByYWYgKSA6XG5cdFx0XHR3aW5kb3cuc2V0SW50ZXJ2YWwoIGpRdWVyeS5meC50aWNrLCBqUXVlcnkuZnguaW50ZXJ2YWwgKTtcblx0fVxufTtcblxualF1ZXJ5LmZ4LnN0b3AgPSBmdW5jdGlvbigpIHtcblx0aWYgKCB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgKSB7XG5cdFx0d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKCB0aW1lcklkICk7XG5cdH0gZWxzZSB7XG5cdFx0d2luZG93LmNsZWFySW50ZXJ2YWwoIHRpbWVySWQgKTtcblx0fVxuXG5cdHRpbWVySWQgPSBudWxsO1xufTtcblxualF1ZXJ5LmZ4LnNwZWVkcyA9IHtcblx0c2xvdzogNjAwLFxuXHRmYXN0OiAyMDAsXG5cblx0Ly8gRGVmYXVsdCBzcGVlZFxuXHRfZGVmYXVsdDogNDAwXG59O1xuXG5cbi8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2luIGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi5cbi8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEwMDMyNDAxNDc0Ny9odHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvXG5qUXVlcnkuZm4uZGVsYXkgPSBmdW5jdGlvbiggdGltZSwgdHlwZSApIHtcblx0dGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTtcblx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbiggbmV4dCwgaG9va3MgKSB7XG5cdFx0dmFyIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCggbmV4dCwgdGltZSApO1xuXHRcdGhvb2tzLnN0b3AgPSBmdW5jdGlvbigpIHtcblx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXQgKTtcblx0XHR9O1xuXHR9ICk7XG59O1xuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApLFxuXHRcdHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwic2VsZWN0XCIgKSxcblx0XHRvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwib3B0aW9uXCIgKSApO1xuXG5cdGlucHV0LnR5cGUgPSBcImNoZWNrYm94XCI7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMyBvbmx5XG5cdC8vIERlZmF1bHQgdmFsdWUgZm9yIGEgY2hlY2tib3ggc2hvdWxkIGJlIFwib25cIlxuXHRzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAhPT0gXCJcIjtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gTXVzdCBhY2Nlc3Mgc2VsZWN0ZWRJbmRleCB0byBtYWtlIGRlZmF1bHQgb3B0aW9ucyBzZWxlY3Rcblx0c3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gQW4gaW5wdXQgbG9zZXMgaXRzIHZhbHVlIGFmdGVyIGJlY29taW5nIGEgcmFkaW9cblx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblx0aW5wdXQudmFsdWUgPSBcInRcIjtcblx0aW5wdXQudHlwZSA9IFwicmFkaW9cIjtcblx0c3VwcG9ydC5yYWRpb1ZhbHVlID0gaW5wdXQudmFsdWUgPT09IFwidFwiO1xufSApKCk7XG5cblxudmFyIGJvb2xIb29rLFxuXHRhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LmF0dHIsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXG5cdHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIHRoaXMsIG5hbWUgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZFxuXHRcdGlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdC8vIEF0dHJpYnV0ZSBob29rcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbG93ZXJjYXNlIHZlcnNpb25cblx0XHQvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBkZWZpbmVkXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5hdHRySG9va3NbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8XG5cdFx0XHRcdCggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC50ZXN0KCBuYW1lICkgPyBib29sSG9vayA6IHVuZGVmaW5lZCApO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggdmFsdWUgPT09IG51bGwgKSB7XG5cdFx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBob29rcyAmJiBcInNldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIHZhbHVlICsgXCJcIiApO1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdC8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkXG5cdFx0cmV0dXJuIHJldCA9PSBudWxsID8gdW5kZWZpbmVkIDogcmV0O1xuXHR9LFxuXG5cdGF0dHJIb29rczoge1xuXHRcdHR5cGU6IHtcblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09IFwicmFkaW9cIiAmJlxuXHRcdFx0XHRcdGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgKSB7XG5cdFx0XHRcdFx0dmFyIHZhbCA9IGVsZW0udmFsdWU7XG5cdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCB2YWx1ZSApO1xuXHRcdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdFx0ZWxlbS52YWx1ZSA9IHZhbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHR2YXIgbmFtZSxcblx0XHRcdGkgPSAwLFxuXG5cdFx0XHQvLyBBdHRyaWJ1dGUgbmFtZXMgY2FuIGNvbnRhaW4gbm9uLUhUTUwgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzXG5cdFx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNhdHRyaWJ1dGVzLTJcblx0XHRcdGF0dHJOYW1lcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICk7XG5cblx0XHRpZiAoIGF0dHJOYW1lcyAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0d2hpbGUgKCAoIG5hbWUgPSBhdHRyTmFtZXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBuYW1lICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIEhvb2tzIGZvciBib29sZWFuIGF0dHJpYnV0ZXNcbmJvb2xIb29rID0ge1xuXHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHtcblx0XHRpZiAoIHZhbHVlID09PSBmYWxzZSApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZVxuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cbn07XG5cbmpRdWVyeS5lYWNoKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCggL1xcdysvZyApLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0dmFyIGdldHRlciA9IGF0dHJIYW5kbGVbIG5hbWUgXSB8fCBqUXVlcnkuZmluZC5hdHRyO1xuXG5cdGF0dHJIYW5kbGVbIG5hbWUgXSA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgcmV0LCBoYW5kbGUsXG5cdFx0XHRsb3dlcmNhc2VOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cblx0XHRcdC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3AgYnkgdGVtcG9yYXJpbHkgcmVtb3ZpbmcgdGhpcyBmdW5jdGlvbiBmcm9tIHRoZSBnZXR0ZXJcblx0XHRcdGhhbmRsZSA9IGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXTtcblx0XHRcdGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IHJldDtcblx0XHRcdHJldCA9IGdldHRlciggZWxlbSwgbmFtZSwgaXNYTUwgKSAhPSBudWxsID9cblx0XHRcdFx0bG93ZXJjYXNlTmFtZSA6XG5cdFx0XHRcdG51bGw7XG5cdFx0XHRhdHRySGFuZGxlWyBsb3dlcmNhc2VOYW1lIF0gPSBoYW5kbGU7XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG59ICk7XG5cblxuXG5cbnZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxcblx0cmNsaWNrYWJsZSA9IC9eKD86YXxhcmVhKSQvaTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRwcm9wOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXG5cdHJlbW92ZVByb3A6IGZ1bmN0aW9uKCBuYW1lICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0ZGVsZXRlIHRoaXNbIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSBdO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdHByb3A6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcblx0XHR2YXIgcmV0LCBob29rcyxcblx0XHRcdG5UeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRcdC8vIERvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXNcblx0XHRpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkge1xuXG5cdFx0XHQvLyBGaXggbmFtZSBhbmQgYXR0YWNoIGhvb2tzXG5cdFx0XHRuYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lO1xuXHRcdFx0aG9va3MgPSBqUXVlcnkucHJvcEhvb2tzWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0aWYgKCBob29rcyAmJiBcInNldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuICggZWxlbVsgbmFtZSBdID0gdmFsdWUgKTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKCByZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSApICE9PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZWxlbVsgbmFtZSBdO1xuXHR9LFxuXG5cdHByb3BIb29rczoge1xuXHRcdHRhYkluZGV4OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0XHRcdFx0Ly8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlXG5cdFx0XHRcdC8vIGNvcnJlY3QgdmFsdWUgd2hlbiBpdCBoYXNuJ3QgYmVlbiBleHBsaWNpdGx5IHNldFxuXHRcdFx0XHQvLyBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxNDExMTYyMzMzNDcvaHR0cDovL2ZsdWlkcHJvamVjdC5vcmcvYmxvZy8yMDA4LzAxLzA5L2dldHRpbmctc2V0dGluZy1hbmQtcmVtb3ZpbmctdGFiaW5kZXgtdmFsdWVzLXdpdGgtamF2YXNjcmlwdC9cblx0XHRcdFx0Ly8gVXNlIHByb3BlciBhdHRyaWJ1dGUgcmV0cmlldmFsKCMxMjA3Milcblx0XHRcdFx0dmFyIHRhYmluZGV4ID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ0YWJpbmRleFwiICk7XG5cblx0XHRcdFx0aWYgKCB0YWJpbmRleCApIHtcblx0XHRcdFx0XHRyZXR1cm4gcGFyc2VJbnQoIHRhYmluZGV4LCAxMCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8XG5cdFx0XHRcdFx0cmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiZcblx0XHRcdFx0XHRlbGVtLmhyZWZcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdHByb3BGaXg6IHtcblx0XHRcImZvclwiOiBcImh0bWxGb3JcIixcblx0XHRcImNsYXNzXCI6IFwiY2xhc3NOYW1lXCJcblx0fVxufSApO1xuXG4vLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcbi8vIEFjY2Vzc2luZyB0aGUgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eVxuLy8gZm9yY2VzIHRoZSBicm93c2VyIHRvIHJlc3BlY3Qgc2V0dGluZyBzZWxlY3RlZFxuLy8gb24gdGhlIG9wdGlvblxuLy8gVGhlIGdldHRlciBlbnN1cmVzIGEgZGVmYXVsdCBvcHRpb24gaXMgc2VsZWN0ZWRcbi8vIHdoZW4gaW4gYW4gb3B0Z3JvdXBcbi8vIGVzbGludCBydWxlIFwibm8tdW51c2VkLWV4cHJlc3Npb25zXCIgaXMgZGlzYWJsZWQgZm9yIHRoaXMgY29kZVxuLy8gc2luY2UgaXQgY29uc2lkZXJzIHN1Y2ggYWNjZXNzaW9ucyBub29wXG5pZiAoICFzdXBwb3J0Lm9wdFNlbGVjdGVkICkge1xuXHRqUXVlcnkucHJvcEhvb2tzLnNlbGVjdGVkID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8qIGVzbGludCBuby11bnVzZWQtZXhwcmVzc2lvbnM6IFwib2ZmXCIgKi9cblxuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvKiBlc2xpbnQgbm8tdW51c2VkLWV4cHJlc3Npb25zOiBcIm9mZlwiICovXG5cblx0XHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRpZiAoIHBhcmVudCApIHtcblx0XHRcdFx0cGFyZW50LnNlbGVjdGVkSW5kZXg7XG5cblx0XHRcdFx0aWYgKCBwYXJlbnQucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG5qUXVlcnkuZWFjaCggW1xuXHRcInRhYkluZGV4XCIsXG5cdFwicmVhZE9ubHlcIixcblx0XCJtYXhMZW5ndGhcIixcblx0XCJjZWxsU3BhY2luZ1wiLFxuXHRcImNlbGxQYWRkaW5nXCIsXG5cdFwicm93U3BhblwiLFxuXHRcImNvbFNwYW5cIixcblx0XCJ1c2VNYXBcIixcblx0XCJmcmFtZUJvcmRlclwiLFxuXHRcImNvbnRlbnRFZGl0YWJsZVwiXG5dLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnByb3BGaXhbIHRoaXMudG9Mb3dlckNhc2UoKSBdID0gdGhpcztcbn0gKTtcblxuXG5cblxuXHQvLyBTdHJpcCBhbmQgY29sbGFwc2Ugd2hpdGVzcGFjZSBhY2NvcmRpbmcgdG8gSFRNTCBzcGVjXG5cdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2luZnJhc3RydWN0dXJlLmh0bWwjc3RyaXAtYW5kLWNvbGxhcHNlLXdoaXRlc3BhY2Vcblx0ZnVuY3Rpb24gc3RyaXBBbmRDb2xsYXBzZSggdmFsdWUgKSB7XG5cdFx0dmFyIHRva2VucyA9IHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cdFx0cmV0dXJuIHRva2Vucy5qb2luKCBcIiBcIiApO1xuXHR9XG5cblxuZnVuY3Rpb24gZ2V0Q2xhc3MoIGVsZW0gKSB7XG5cdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSAmJiBlbGVtLmdldEF0dHJpYnV0ZSggXCJjbGFzc1wiICkgfHwgXCJcIjtcbn1cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRhZGRDbGFzczogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGN1clZhbHVlLCBjbGF6eiwgaiwgZmluYWxWYWx1ZSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5hZGRDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUgKSB7XG5cdFx0XHRjbGFzc2VzID0gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTtcblxuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7XG5cdFx0XHRcdGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCBcIiBcIiArIHN0cmlwQW5kQ29sbGFwc2UoIGN1clZhbHVlICkgKyBcIiBcIiApO1xuXG5cdFx0XHRcdGlmICggY3VyICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGN1ci5pbmRleE9mKCBcIiBcIiArIGNsYXp6ICsgXCIgXCIgKSA8IDAgKSB7XG5cdFx0XHRcdFx0XHRcdGN1ciArPSBjbGF6eiArIFwiIFwiO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuXG5cdFx0XHRcdFx0ZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApO1xuXHRcdFx0XHRcdGlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJjbGFzc1wiLCBmaW5hbFZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0cmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjdXJWYWx1ZSwgY2xhenosIGosIGZpbmFsVmFsdWUsXG5cdFx0XHRpID0gMDtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVtb3ZlQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIGdldENsYXNzKCB0aGlzICkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hdHRyKCBcImNsYXNzXCIsIFwiXCIgKTtcblx0XHR9XG5cblx0XHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSApIHtcblx0XHRcdGNsYXNzZXMgPSB2YWx1ZS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdGN1clZhbHVlID0gZ2V0Q2xhc3MoIGVsZW0gKTtcblxuXHRcdFx0XHQvLyBUaGlzIGV4cHJlc3Npb24gaXMgaGVyZSBmb3IgYmV0dGVyIGNvbXByZXNzaWJpbGl0eSAoc2VlIGFkZENsYXNzKVxuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBjdXJWYWx1ZSApICsgXCIgXCIgKTtcblxuXHRcdFx0XHRpZiAoIGN1ciApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoICggY2xhenogPSBjbGFzc2VzWyBqKysgXSApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgKmFsbCogaW5zdGFuY2VzXG5cdFx0XHRcdFx0XHR3aGlsZSAoIGN1ci5pbmRleE9mKCBcIiBcIiArIGNsYXp6ICsgXCIgXCIgKSA+IC0xICkge1xuXHRcdFx0XHRcdFx0XHRjdXIgPSBjdXIucmVwbGFjZSggXCIgXCIgKyBjbGF6eiArIFwiIFwiLCBcIiBcIiApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuXG5cdFx0XHRcdFx0ZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApO1xuXHRcdFx0XHRcdGlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJjbGFzc1wiLCBmaW5hbFZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0dG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7XG5cdFx0dmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cblx0XHRpZiAoIHR5cGVvZiBzdGF0ZVZhbCA9PT0gXCJib29sZWFuXCIgJiYgdHlwZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBzdGF0ZVZhbCA/IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkudG9nZ2xlQ2xhc3MoXG5cdFx0XHRcdFx0dmFsdWUuY2FsbCggdGhpcywgaSwgZ2V0Q2xhc3MoIHRoaXMgKSwgc3RhdGVWYWwgKSxcblx0XHRcdFx0XHRzdGF0ZVZhbFxuXHRcdFx0XHQpO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGNsYXNzTmFtZSwgaSwgc2VsZiwgY2xhc3NOYW1lcztcblxuXHRcdFx0aWYgKCB0eXBlID09PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHRcdC8vIFRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzXG5cdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRzZWxmID0galF1ZXJ5KCB0aGlzICk7XG5cdFx0XHRcdGNsYXNzTmFtZXMgPSB2YWx1ZS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXG5cdFx0XHRcdHdoaWxlICggKCBjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSApICkge1xuXG5cdFx0XHRcdFx0Ly8gQ2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0XG5cdFx0XHRcdFx0aWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHtcblx0XHRcdFx0XHRcdHNlbGYucmVtb3ZlQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzZWxmLmFkZENsYXNzKCBjbGFzc05hbWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0Ly8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWVcblx0XHRcdH0gZWxzZSBpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZSA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0XHRcdGNsYXNzTmFtZSA9IGdldENsYXNzKCB0aGlzICk7XG5cdFx0XHRcdGlmICggY2xhc3NOYW1lICkge1xuXG5cdFx0XHRcdFx0Ly8gU3RvcmUgY2xhc3NOYW1lIGlmIHNldFxuXHRcdFx0XHRcdGRhdGFQcml2LnNldCggdGhpcywgXCJfX2NsYXNzTmFtZV9fXCIsIGNsYXNzTmFtZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgY2xhc3MgbmFtZSBvciBpZiB3ZSdyZSBwYXNzZWQgYGZhbHNlYCxcblx0XHRcdFx0Ly8gdGhlbiByZW1vdmUgdGhlIHdob2xlIGNsYXNzbmFtZSAoaWYgdGhlcmUgd2FzIG9uZSwgdGhlIGFib3ZlIHNhdmVkIGl0KS5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIGJyaW5nIGJhY2sgd2hhdGV2ZXIgd2FzIHByZXZpb3VzbHkgc2F2ZWQgKGlmIGFueXRoaW5nKSxcblx0XHRcdFx0Ly8gZmFsbGluZyBiYWNrIHRvIHRoZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgc3RvcmVkLlxuXHRcdFx0XHRpZiAoIHRoaXMuc2V0QXR0cmlidXRlICkge1xuXHRcdFx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCBcImNsYXNzXCIsXG5cdFx0XHRcdFx0XHRjbGFzc05hbWUgfHwgdmFsdWUgPT09IGZhbHNlID9cblx0XHRcdFx0XHRcdFwiXCIgOlxuXHRcdFx0XHRcdFx0ZGF0YVByaXYuZ2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiApIHx8IFwiXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGNsYXNzTmFtZSwgZWxlbSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Y2xhc3NOYW1lID0gXCIgXCIgKyBzZWxlY3RvciArIFwiIFwiO1xuXHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHQoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggZ2V0Q2xhc3MoIGVsZW0gKSApICsgXCIgXCIgKS5pbmRleE9mKCBjbGFzc05hbWUgKSA+IC0xICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufSApO1xuXG5cblxuXG52YXIgcnJldHVybiA9IC9cXHIvZztcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHR2YWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgaG9va3MsIHJldCwgaXNGdW5jdGlvbixcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF07XG5cblx0XHRpZiAoICFhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgZWxlbS50eXBlIF0gfHxcblx0XHRcdFx0XHRqUXVlcnkudmFsSG9va3NbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdO1xuXG5cdFx0XHRcdGlmICggaG9va3MgJiZcblx0XHRcdFx0XHRcImdldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdFx0KCByZXQgPSBob29rcy5nZXQoIGVsZW0sIFwidmFsdWVcIiApICkgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0ID0gZWxlbS52YWx1ZTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzXG5cdFx0XHRcdGlmICggdHlwZW9mIHJldCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdFx0XHRyZXR1cm4gcmV0LnJlcGxhY2UoIHJyZXR1cm4sIFwiXCIgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEhhbmRsZSBjYXNlcyB3aGVyZSB2YWx1ZSBpcyBudWxsL3VuZGVmIG9yIG51bWJlclxuXHRcdFx0XHRyZXR1cm4gcmV0ID09IG51bGwgPyBcIlwiIDogcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHR2YXIgdmFsO1xuXG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgIT09IDEgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBpc0Z1bmN0aW9uICkge1xuXHRcdFx0XHR2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBqUXVlcnkoIHRoaXMgKS52YWwoKSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFsID0gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzIFwiXCI7IGNvbnZlcnQgbnVtYmVycyB0byBzdHJpbmdcblx0XHRcdGlmICggdmFsID09IG51bGwgKSB7XG5cdFx0XHRcdHZhbCA9IFwiXCI7XG5cblx0XHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdHZhbCArPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBqUXVlcnkuaXNBcnJheSggdmFsICkgKSB7XG5cdFx0XHRcdHZhbCA9IGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICsgXCJcIjtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0Ly8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmdcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoIFwic2V0XCIgaW4gaG9va3MgKSB8fCBob29rcy5zZXQoIHRoaXMsIHZhbCwgXCJ2YWx1ZVwiICkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IHZhbDtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHR2YWxIb29rczoge1xuXHRcdG9wdGlvbjoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0XHR2YXIgdmFsID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ2YWx1ZVwiICk7XG5cdFx0XHRcdHJldHVybiB2YWwgIT0gbnVsbCA/XG5cdFx0XHRcdFx0dmFsIDpcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSBvbmx5XG5cdFx0XHRcdFx0Ly8gb3B0aW9uLnRleHQgdGhyb3dzIGV4Y2VwdGlvbnMgKCMxNDY4NiwgIzE0ODU4KVxuXHRcdFx0XHRcdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlXG5cdFx0XHRcdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jc3RyaXAtYW5kLWNvbGxhcHNlLXdoaXRlc3BhY2Vcblx0XHRcdFx0XHRzdHJpcEFuZENvbGxhcHNlKCBqUXVlcnkudGV4dCggZWxlbSApICk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRzZWxlY3Q6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciB2YWx1ZSwgb3B0aW9uLCBpLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0aW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsXG5cdFx0XHRcdFx0b25lID0gZWxlbS50eXBlID09PSBcInNlbGVjdC1vbmVcIixcblx0XHRcdFx0XHR2YWx1ZXMgPSBvbmUgPyBudWxsIDogW10sXG5cdFx0XHRcdFx0bWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0aWYgKCBpbmRleCA8IDAgKSB7XG5cdFx0XHRcdFx0aSA9IG1heDtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGkgPSBvbmUgPyBpbmRleCA6IDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zXG5cdFx0XHRcdGZvciAoIDsgaSA8IG1heDsgaSsrICkge1xuXHRcdFx0XHRcdG9wdGlvbiA9IG9wdGlvbnNbIGkgXTtcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0Ly8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpXG5cdFx0XHRcdFx0aWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmXG5cblx0XHRcdFx0XHRcdFx0Ly8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0XHRcdFx0XHQhb3B0aW9uLmRpc2FibGVkICYmXG5cdFx0XHRcdFx0XHRcdCggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8XG5cdFx0XHRcdFx0XHRcdFx0IWpRdWVyeS5ub2RlTmFtZSggb3B0aW9uLnBhcmVudE5vZGUsIFwib3B0Z3JvdXBcIiApICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIEdldCB0aGUgc3BlY2lmaWMgdmFsdWUgZm9yIHRoZSBvcHRpb25cblx0XHRcdFx0XHRcdHZhbHVlID0galF1ZXJ5KCBvcHRpb24gKS52YWwoKTtcblxuXHRcdFx0XHRcdFx0Ly8gV2UgZG9uJ3QgbmVlZCBhbiBhcnJheSBmb3Igb25lIHNlbGVjdHNcblx0XHRcdFx0XHRcdGlmICggb25lICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5XG5cdFx0XHRcdFx0XHR2YWx1ZXMucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdmFsdWVzO1xuXHRcdFx0fSxcblxuXHRcdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRcdHZhciBvcHRpb25TZXQsIG9wdGlvbixcblx0XHRcdFx0XHRvcHRpb25zID0gZWxlbS5vcHRpb25zLFxuXHRcdFx0XHRcdHZhbHVlcyA9IGpRdWVyeS5tYWtlQXJyYXkoIHZhbHVlICksXG5cdFx0XHRcdFx0aSA9IG9wdGlvbnMubGVuZ3RoO1xuXG5cdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdG9wdGlvbiA9IG9wdGlvbnNbIGkgXTtcblxuXHRcdFx0XHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbmQtYXNzaWduICovXG5cblx0XHRcdFx0XHRpZiAoIG9wdGlvbi5zZWxlY3RlZCA9XG5cdFx0XHRcdFx0XHRqUXVlcnkuaW5BcnJheSggalF1ZXJ5LnZhbEhvb2tzLm9wdGlvbi5nZXQoIG9wdGlvbiApLCB2YWx1ZXMgKSA+IC0xXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvcHRpb25TZXQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8qIGVzbGludC1lbmFibGUgbm8tY29uZC1hc3NpZ24gKi9cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0XG5cdFx0XHRcdGlmICggIW9wdGlvblNldCApIHtcblx0XHRcdFx0XHRlbGVtLnNlbGVjdGVkSW5kZXggPSAtMTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdmFsdWVzO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG4vLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlclxualF1ZXJ5LmVhY2goIFsgXCJyYWRpb1wiLCBcImNoZWNrYm94XCIgXSwgZnVuY3Rpb24oKSB7XG5cdGpRdWVyeS52YWxIb29rc1sgdGhpcyBdID0ge1xuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0aWYgKCBqUXVlcnkuaXNBcnJheSggdmFsdWUgKSApIHtcblx0XHRcdFx0cmV0dXJuICggZWxlbS5jaGVja2VkID0galF1ZXJ5LmluQXJyYXkoIGpRdWVyeSggZWxlbSApLnZhbCgpLCB2YWx1ZSApID4gLTEgKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGlmICggIXN1cHBvcnQuY2hlY2tPbiApIHtcblx0XHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXS5nZXQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiICkgPT09IG51bGwgPyBcIm9uXCIgOiBlbGVtLnZhbHVlO1xuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gUmV0dXJuIGpRdWVyeSBmb3IgYXR0cmlidXRlcy1vbmx5IGluY2x1c2lvblxuXG5cbnZhciByZm9jdXNNb3JwaCA9IC9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLztcblxualF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmV2ZW50LCB7XG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7XG5cblx0XHR2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLFxuXHRcdFx0ZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sXG5cdFx0XHR0eXBlID0gaGFzT3duLmNhbGwoIGV2ZW50LCBcInR5cGVcIiApID8gZXZlbnQudHlwZSA6IGV2ZW50LFxuXHRcdFx0bmFtZXNwYWNlcyA9IGhhc093bi5jYWxsKCBldmVudCwgXCJuYW1lc3BhY2VcIiApID8gZXZlbnQubmFtZXNwYWNlLnNwbGl0KCBcIi5cIiApIDogW107XG5cblx0XHRjdXIgPSB0bXAgPSBlbGVtID0gZWxlbSB8fCBkb2N1bWVudDtcblxuXHRcdC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93XG5cdFx0aWYgKCByZm9jdXNNb3JwaC50ZXN0KCB0eXBlICsgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZS5pbmRleE9mKCBcIi5cIiApID4gLTEgKSB7XG5cblx0XHRcdC8vIE5hbWVzcGFjZWQgdHJpZ2dlcjsgY3JlYXRlIGEgcmVnZXhwIHRvIG1hdGNoIGV2ZW50IHR5cGUgaW4gaGFuZGxlKClcblx0XHRcdG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCBcIi5cIiApO1xuXHRcdFx0dHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTtcblx0XHRcdG5hbWVzcGFjZXMuc29ydCgpO1xuXHRcdH1cblx0XHRvbnR5cGUgPSB0eXBlLmluZGV4T2YoIFwiOlwiICkgPCAwICYmIFwib25cIiArIHR5cGU7XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVlcnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmdcblx0XHRldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdGV2ZW50IDpcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoIHR5cGUsIHR5cGVvZiBldmVudCA9PT0gXCJvYmplY3RcIiAmJiBldmVudCApO1xuXG5cdFx0Ly8gVHJpZ2dlciBiaXRtYXNrOiAmIDEgZm9yIG5hdGl2ZSBoYW5kbGVyczsgJiAyIGZvciBqUXVlcnkgKGFsd2F5cyB0cnVlKVxuXHRcdGV2ZW50LmlzVHJpZ2dlciA9IG9ubHlIYW5kbGVycyA/IDIgOiAzO1xuXHRcdGV2ZW50Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKTtcblx0XHRldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID9cblx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oIFwiXFxcXC4oPzouKlxcXFwufClcIiApICsgXCIoXFxcXC58JClcIiApIDpcblx0XHRcdG51bGw7XG5cblx0XHQvLyBDbGVhbiB1cCB0aGUgZXZlbnQgaW4gY2FzZSBpdCBpcyBiZWluZyByZXVzZWRcblx0XHRldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7XG5cdFx0aWYgKCAhZXZlbnQudGFyZ2V0ICkge1xuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gZWxlbTtcblx0XHR9XG5cblx0XHQvLyBDbG9uZSBhbnkgaW5jb21pbmcgZGF0YSBhbmQgcHJlcGVuZCB0aGUgZXZlbnQsIGNyZWF0aW5nIHRoZSBoYW5kbGVyIGFyZyBsaXN0XG5cdFx0ZGF0YSA9IGRhdGEgPT0gbnVsbCA/XG5cdFx0XHRbIGV2ZW50IF0gOlxuXHRcdFx0alF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7XG5cblx0XHQvLyBBbGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhlIGxpbmVzXG5cdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmIHNwZWNpYWwudHJpZ2dlciAmJiBzcGVjaWFsLnRyaWdnZXIuYXBwbHkoIGVsZW0sIGRhdGEgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpXG5cdFx0Ly8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNClcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTtcblx0XHRcdGlmICggIXJmb2N1c01vcnBoLnRlc3QoIGJ1YmJsZVR5cGUgKyB0eXBlICkgKSB7XG5cdFx0XHRcdGN1ciA9IGN1ci5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXHRcdFx0Zm9yICggOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggY3VyICk7XG5cdFx0XHRcdHRtcCA9IGN1cjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5nLiwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pXG5cdFx0XHRpZiAoIHRtcCA9PT0gKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQgKSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZpcmUgaGFuZGxlcnMgb24gdGhlIGV2ZW50IHBhdGhcblx0XHRpID0gMDtcblx0XHR3aGlsZSAoICggY3VyID0gZXZlbnRQYXRoWyBpKysgXSApICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXG5cdFx0XHRldmVudC50eXBlID0gaSA+IDEgP1xuXHRcdFx0XHRidWJibGVUeXBlIDpcblx0XHRcdFx0c3BlY2lhbC5iaW5kVHlwZSB8fCB0eXBlO1xuXG5cdFx0XHQvLyBqUXVlcnkgaGFuZGxlclxuXHRcdFx0aGFuZGxlID0gKCBkYXRhUHJpdi5nZXQoIGN1ciwgXCJldmVudHNcIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSAmJlxuXHRcdFx0XHRkYXRhUHJpdi5nZXQoIGN1ciwgXCJoYW5kbGVcIiApO1xuXHRcdFx0aWYgKCBoYW5kbGUgKSB7XG5cdFx0XHRcdGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE5hdGl2ZSBoYW5kbGVyXG5cdFx0XHRoYW5kbGUgPSBvbnR5cGUgJiYgY3VyWyBvbnR5cGUgXTtcblx0XHRcdGlmICggaGFuZGxlICYmIGhhbmRsZS5hcHBseSAmJiBhY2NlcHREYXRhKCBjdXIgKSApIHtcblx0XHRcdFx0ZXZlbnQucmVzdWx0ID0gaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTtcblx0XHRcdFx0aWYgKCBldmVudC5yZXN1bHQgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0ZXZlbnQudHlwZSA9IHR5cGU7XG5cblx0XHQvLyBJZiBub2JvZHkgcHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwgZG8gaXQgbm93XG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHtcblxuXHRcdFx0aWYgKCAoICFzcGVjaWFsLl9kZWZhdWx0IHx8XG5cdFx0XHRcdHNwZWNpYWwuX2RlZmF1bHQuYXBwbHkoIGV2ZW50UGF0aC5wb3AoKSwgZGF0YSApID09PSBmYWxzZSApICYmXG5cdFx0XHRcdGFjY2VwdERhdGEoIGVsZW0gKSApIHtcblxuXHRcdFx0XHQvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGV2ZW50LlxuXHRcdFx0XHQvLyBEb24ndCBkbyBkZWZhdWx0IGFjdGlvbnMgb24gd2luZG93LCB0aGF0J3Mgd2hlcmUgZ2xvYmFsIHZhcmlhYmxlcyBiZSAoIzYxNzApXG5cdFx0XHRcdGlmICggb250eXBlICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBlbGVtWyB0eXBlIF0gKSAmJiAhalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kXG5cdFx0XHRcdFx0dG1wID0gZWxlbVsgb250eXBlIF07XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZVxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlO1xuXHRcdFx0XHRcdGVsZW1bIHR5cGUgXSgpO1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB1bmRlZmluZWQ7XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gdG1wO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0Ly8gUGlnZ3liYWNrIG9uIGEgZG9ub3IgZXZlbnQgdG8gc2ltdWxhdGUgYSBkaWZmZXJlbnQgb25lXG5cdC8vIFVzZWQgb25seSBmb3IgYGZvY3VzKGluIHwgb3V0KWAgZXZlbnRzXG5cdHNpbXVsYXRlOiBmdW5jdGlvbiggdHlwZSwgZWxlbSwgZXZlbnQgKSB7XG5cdFx0dmFyIGUgPSBqUXVlcnkuZXh0ZW5kKFxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCgpLFxuXHRcdFx0ZXZlbnQsXG5cdFx0XHR7XG5cdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdGlzU2ltdWxhdGVkOiB0cnVlXG5cdFx0XHR9XG5cdFx0KTtcblxuXHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBlLCBudWxsLCBlbGVtICk7XG5cdH1cblxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApO1xuXHRcdH0gKTtcblx0fSxcblx0dHJpZ2dlckhhbmRsZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBlbGVtID0gdGhpc1sgMCBdO1xuXHRcdGlmICggZWxlbSApIHtcblx0XHRcdHJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgZWxlbSwgdHJ1ZSApO1xuXHRcdH1cblx0fVxufSApO1xuXG5cbmpRdWVyeS5lYWNoKCAoIFwiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgXCIgK1xuXHRcIm1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIFwiICtcblx0XCJjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGNvbnRleHRtZW51XCIgKS5zcGxpdCggXCIgXCIgKSxcblx0ZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cblx0Ly8gSGFuZGxlIGV2ZW50IGJpbmRpbmdcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID9cblx0XHRcdHRoaXMub24oIG5hbWUsIG51bGwsIGRhdGEsIGZuICkgOlxuXHRcdFx0dGhpcy50cmlnZ2VyKCBuYW1lICk7XG5cdH07XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0aG92ZXI6IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkge1xuXHRcdHJldHVybiB0aGlzLm1vdXNlZW50ZXIoIGZuT3ZlciApLm1vdXNlbGVhdmUoIGZuT3V0IHx8IGZuT3ZlciApO1xuXHR9XG59ICk7XG5cblxuXG5cbnN1cHBvcnQuZm9jdXNpbiA9IFwib25mb2N1c2luXCIgaW4gd2luZG93O1xuXG5cbi8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00NFxuLy8gRmlyZWZveCBkb2Vzbid0IGhhdmUgZm9jdXMoaW4gfCBvdXQpIGV2ZW50c1xuLy8gUmVsYXRlZCB0aWNrZXQgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02ODc3ODdcbi8vXG4vLyBTdXBwb3J0OiBDaHJvbWUgPD00OCAtIDQ5LCBTYWZhcmkgPD05LjAgLSA5LjFcbi8vIGZvY3VzKGluIHwgb3V0KSBldmVudHMgZmlyZSBhZnRlciBmb2N1cyAmIGJsdXIgZXZlbnRzLFxuLy8gd2hpY2ggaXMgc3BlYyB2aW9sYXRpb24gLSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2V2ZW50cy1mb2N1c2V2ZW50LWV2ZW50LW9yZGVyXG4vLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0OTg1N1xuaWYgKCAhc3VwcG9ydC5mb2N1c2luICkge1xuXHRqUXVlcnkuZWFjaCggeyBmb2N1czogXCJmb2N1c2luXCIsIGJsdXI6IFwiZm9jdXNvdXRcIiB9LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXG5cdFx0Ly8gQXR0YWNoIGEgc2luZ2xlIGNhcHR1cmluZyBoYW5kbGVyIG9uIHRoZSBkb2N1bWVudCB3aGlsZSBzb21lb25lIHdhbnRzIGZvY3VzaW4vZm9jdXNvdXRcblx0XHR2YXIgaGFuZGxlciA9IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdGpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICkgKTtcblx0XHR9O1xuXG5cdFx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGZpeCBdID0ge1xuXHRcdFx0c2V0dXA6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZG9jID0gdGhpcy5vd25lckRvY3VtZW50IHx8IHRoaXMsXG5cdFx0XHRcdFx0YXR0YWNoZXMgPSBkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4ICk7XG5cblx0XHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdFx0ZG9jLmFkZEV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCAoIGF0dGFjaGVzIHx8IDAgKSArIDEgKTtcblx0XHRcdH0sXG5cdFx0XHR0ZWFyZG93bjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKSAtIDE7XG5cblx0XHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdFx0ZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGRvYywgZml4ICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCBhdHRhY2hlcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fSApO1xufVxudmFyIGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uO1xuXG52YXIgbm9uY2UgPSBqUXVlcnkubm93KCk7XG5cbnZhciBycXVlcnkgPSAoIC9cXD8vICk7XG5cblxuXG4vLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nXG5qUXVlcnkucGFyc2VYTUwgPSBmdW5jdGlvbiggZGF0YSApIHtcblx0dmFyIHhtbDtcblx0aWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdC8vIElFIHRocm93cyBvbiBwYXJzZUZyb21TdHJpbmcgd2l0aCBpbnZhbGlkIGlucHV0LlxuXHR0cnkge1xuXHRcdHhtbCA9ICggbmV3IHdpbmRvdy5ET01QYXJzZXIoKSApLnBhcnNlRnJvbVN0cmluZyggZGF0YSwgXCJ0ZXh0L3htbFwiICk7XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHhtbCA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdGlmICggIXhtbCB8fCB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwicGFyc2VyZXJyb3JcIiApLmxlbmd0aCApIHtcblx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBYTUw6IFwiICsgZGF0YSApO1xuXHR9XG5cdHJldHVybiB4bWw7XG59O1xuXG5cbnZhclxuXHRyYnJhY2tldCA9IC9cXFtcXF0kLyxcblx0ckNSTEYgPSAvXFxyP1xcbi9nLFxuXHRyc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksXG5cdHJzdWJtaXR0YWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtcblxuZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkge1xuXHR2YXIgbmFtZTtcblxuXHRpZiAoIGpRdWVyeS5pc0FycmF5KCBvYmogKSApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBhcnJheSBpdGVtLlxuXHRcdGpRdWVyeS5lYWNoKCBvYmosIGZ1bmN0aW9uKCBpLCB2ICkge1xuXHRcdFx0aWYgKCB0cmFkaXRpb25hbCB8fCByYnJhY2tldC50ZXN0KCBwcmVmaXggKSApIHtcblxuXHRcdFx0XHQvLyBUcmVhdCBlYWNoIGFycmF5IGl0ZW0gYXMgYSBzY2FsYXIuXG5cdFx0XHRcdGFkZCggcHJlZml4LCB2ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gSXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51bWVyaWMgaW5kZXguXG5cdFx0XHRcdGJ1aWxkUGFyYW1zKFxuXHRcdFx0XHRcdHByZWZpeCArIFwiW1wiICsgKCB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9IG51bGwgPyBpIDogXCJcIiApICsgXCJdXCIsXG5cdFx0XHRcdFx0dixcblx0XHRcdFx0XHR0cmFkaXRpb25hbCxcblx0XHRcdFx0XHRhZGRcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9ICk7XG5cblx0fSBlbHNlIGlmICggIXRyYWRpdGlvbmFsICYmIGpRdWVyeS50eXBlKCBvYmogKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXggKyBcIltcIiArIG5hbWUgKyBcIl1cIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS5cblx0XHRhZGQoIHByZWZpeCwgb2JqICk7XG5cdH1cbn1cblxuLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2Zcbi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZ1xualF1ZXJ5LnBhcmFtID0gZnVuY3Rpb24oIGEsIHRyYWRpdGlvbmFsICkge1xuXHR2YXIgcHJlZml4LFxuXHRcdHMgPSBbXSxcblx0XHRhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7XG5cblx0XHRcdC8vIElmIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGludm9rZSBpdCBhbmQgdXNlIGl0cyByZXR1cm4gdmFsdWVcblx0XHRcdHZhciB2YWx1ZSA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZU9yRnVuY3Rpb24gKSA/XG5cdFx0XHRcdHZhbHVlT3JGdW5jdGlvbigpIDpcblx0XHRcdFx0dmFsdWVPckZ1bmN0aW9uO1xuXG5cdFx0XHRzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArIFwiPVwiICtcblx0XHRcdFx0ZW5jb2RlVVJJQ29tcG9uZW50KCB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICk7XG5cdFx0fTtcblxuXHQvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzLlxuXHRpZiAoIGpRdWVyeS5pc0FycmF5KCBhICkgfHwgKCBhLmpxdWVyeSAmJiAhalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGEgKSApICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzXG5cdFx0alF1ZXJ5LmVhY2goIGEsIGZ1bmN0aW9uKCkge1xuXHRcdFx0YWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTtcblx0XHR9ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIElmIHRyYWRpdGlvbmFsLCBlbmNvZGUgdGhlIFwib2xkXCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyXG5cdFx0Ly8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuXG5cdFx0Zm9yICggcHJlZml4IGluIGEgKSB7XG5cdFx0XHRidWlsZFBhcmFtcyggcHJlZml4LCBhWyBwcmVmaXggXSwgdHJhZGl0aW9uYWwsIGFkZCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb25cblx0cmV0dXJuIHMuam9pbiggXCImXCIgKTtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0c2VyaWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4galF1ZXJ5LnBhcmFtKCB0aGlzLnNlcmlhbGl6ZUFycmF5KCkgKTtcblx0fSxcblx0c2VyaWFsaXplQXJyYXk6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIENhbiBhZGQgcHJvcEhvb2sgZm9yIFwiZWxlbWVudHNcIiB0byBmaWx0ZXIgb3IgYWRkIGZvcm0gZWxlbWVudHNcblx0XHRcdHZhciBlbGVtZW50cyA9IGpRdWVyeS5wcm9wKCB0aGlzLCBcImVsZW1lbnRzXCIgKTtcblx0XHRcdHJldHVybiBlbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkoIGVsZW1lbnRzICkgOiB0aGlzO1xuXHRcdH0gKVxuXHRcdC5maWx0ZXIoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRcdC8vIFVzZSAuaXMoIFwiOmRpc2FibGVkXCIgKSBzbyB0aGF0IGZpZWxkc2V0W2Rpc2FibGVkXSB3b3Jrc1xuXHRcdFx0cmV0dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoIFwiOmRpc2FibGVkXCIgKSAmJlxuXHRcdFx0XHRyc3VibWl0dGFibGUudGVzdCggdGhpcy5ub2RlTmFtZSApICYmICFyc3VibWl0dGVyVHlwZXMudGVzdCggdHlwZSApICYmXG5cdFx0XHRcdCggdGhpcy5jaGVja2VkIHx8ICFyY2hlY2thYmxlVHlwZS50ZXN0KCB0eXBlICkgKTtcblx0XHR9IClcblx0XHQubWFwKCBmdW5jdGlvbiggaSwgZWxlbSApIHtcblx0XHRcdHZhciB2YWwgPSBqUXVlcnkoIHRoaXMgKS52YWwoKTtcblxuXHRcdFx0aWYgKCB2YWwgPT0gbnVsbCApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbCApICkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsICkge1xuXHRcdFx0XHRcdHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCBcIlxcclxcblwiICkgfTtcblx0XHR9ICkuZ2V0KCk7XG5cdH1cbn0gKTtcblxuXG52YXJcblx0cjIwID0gLyUyMC9nLFxuXHRyaGFzaCA9IC8jLiokLyxcblx0cmFudGlDYWNoZSA9IC8oWz8mXSlfPVteJl0qLyxcblx0cmhlYWRlcnMgPSAvXiguKj8pOlsgXFx0XSooW15cXHJcXG5dKikkL21nLFxuXG5cdC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvblxuXHRybG9jYWxQcm90b2NvbCA9IC9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFxuXHRybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLyxcblx0cnByb3RvY29sID0gL15cXC9cXC8vLFxuXG5cdC8qIFByZWZpbHRlcnNcblx0ICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSlcblx0ICogMikgVGhlc2UgYXJlIGNhbGxlZDpcblx0ICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydFxuXHQgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpXG5cdCAqIDMpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogNCkgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiA1KSBleGVjdXRpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0cHJlZmlsdGVycyA9IHt9LFxuXG5cdC8qIFRyYW5zcG9ydHMgYmluZGluZ3Ncblx0ICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0dHJhbnNwb3J0cyA9IHt9LFxuXG5cdC8vIEF2b2lkIGNvbW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvblxuXHRhbGxUeXBlcyA9IFwiKi9cIi5jb25jYXQoIFwiKlwiICksXG5cblx0Ly8gQW5jaG9yIHRhZyBmb3IgcGFyc2luZyB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiYVwiICk7XG5cdG9yaWdpbkFuY2hvci5ocmVmID0gbG9jYXRpb24uaHJlZjtcblxuLy8gQmFzZSBcImNvbnN0cnVjdG9yXCIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydFxuZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7XG5cblx0Ly8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byBcIipcIlxuXHRyZXR1cm4gZnVuY3Rpb24oIGRhdGFUeXBlRXhwcmVzc2lvbiwgZnVuYyApIHtcblxuXHRcdGlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGZ1bmMgPSBkYXRhVHlwZUV4cHJlc3Npb247XG5cdFx0XHRkYXRhVHlwZUV4cHJlc3Npb24gPSBcIipcIjtcblx0XHR9XG5cblx0XHR2YXIgZGF0YVR5cGUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGRhdGFUeXBlcyA9IGRhdGFUeXBlRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBmdW5jICkgKSB7XG5cblx0XHRcdC8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb25cblx0XHRcdHdoaWxlICggKCBkYXRhVHlwZSA9IGRhdGFUeXBlc1sgaSsrIF0gKSApIHtcblxuXHRcdFx0XHQvLyBQcmVwZW5kIGlmIHJlcXVlc3RlZFxuXHRcdFx0XHRpZiAoIGRhdGFUeXBlWyAwIF0gPT09IFwiK1wiICkge1xuXHRcdFx0XHRcdGRhdGFUeXBlID0gZGF0YVR5cGUuc2xpY2UoIDEgKSB8fCBcIipcIjtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnVuc2hpZnQoIGZ1bmMgKTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYXBwZW5kXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0KCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10gKS5wdXNoKCBmdW5jICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbi8vIEJhc2UgaW5zcGVjdGlvbiBmdW5jdGlvbiBmb3IgcHJlZmlsdGVycyBhbmQgdHJhbnNwb3J0c1xuZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHtcblxuXHR2YXIgaW5zcGVjdGVkID0ge30sXG5cdFx0c2Vla2luZ1RyYW5zcG9ydCA9ICggc3RydWN0dXJlID09PSB0cmFuc3BvcnRzICk7XG5cblx0ZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7XG5cdFx0dmFyIHNlbGVjdGVkO1xuXHRcdGluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7XG5cdFx0alF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHtcblx0XHRcdHZhciBkYXRhVHlwZU9yVHJhbnNwb3J0ID0gcHJlZmlsdGVyT3JGYWN0b3J5KCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICk7XG5cdFx0XHRpZiAoIHR5cGVvZiBkYXRhVHlwZU9yVHJhbnNwb3J0ID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHtcblxuXHRcdFx0XHRvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHRcdGluc3BlY3QoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSBlbHNlIGlmICggc2Vla2luZ1RyYW5zcG9ydCApIHtcblx0XHRcdFx0cmV0dXJuICEoIHNlbGVjdGVkID0gZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0XHRyZXR1cm4gc2VsZWN0ZWQ7XG5cdH1cblxuXHRyZXR1cm4gaW5zcGVjdCggb3B0aW9ucy5kYXRhVHlwZXNbIDAgXSApIHx8ICFpbnNwZWN0ZWRbIFwiKlwiIF0gJiYgaW5zcGVjdCggXCIqXCIgKTtcbn1cblxuLy8gQSBzcGVjaWFsIGV4dGVuZCBmb3IgYWpheCBvcHRpb25zXG4vLyB0aGF0IHRha2VzIFwiZmxhdFwiIG9wdGlvbnMgKG5vdCB0byBiZSBkZWVwIGV4dGVuZGVkKVxuLy8gRml4ZXMgIzk4ODdcbmZ1bmN0aW9uIGFqYXhFeHRlbmQoIHRhcmdldCwgc3JjICkge1xuXHR2YXIga2V5LCBkZWVwLFxuXHRcdGZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTtcblxuXHRmb3IgKCBrZXkgaW4gc3JjICkge1xuXHRcdGlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0KCBmbGF0T3B0aW9uc1sga2V5IF0gPyB0YXJnZXQgOiAoIGRlZXAgfHwgKCBkZWVwID0ge30gKSApIClbIGtleSBdID0gc3JjWyBrZXkgXTtcblx0XHR9XG5cdH1cblx0aWYgKCBkZWVwICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApO1xuXHR9XG5cblx0cmV0dXJuIHRhcmdldDtcbn1cblxuLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OlxuICogLSBmaW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBlIGFuZCBleHBlY3RlZCBkYXRhVHlwZSlcbiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuICovXG5mdW5jdGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICkge1xuXG5cdHZhciBjdCwgdHlwZSwgZmluYWxEYXRhVHlwZSwgZmlyc3REYXRhVHlwZSxcblx0XHRjb250ZW50cyA9IHMuY29udGVudHMsXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXM7XG5cblx0Ly8gUmVtb3ZlIGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250ZW50LXR5cGUgaW4gdGhlIHByb2Nlc3Ncblx0d2hpbGUgKCBkYXRhVHlwZXNbIDAgXSA9PT0gXCIqXCIgKSB7XG5cdFx0ZGF0YVR5cGVzLnNoaWZ0KCk7XG5cdFx0aWYgKCBjdCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0Y3QgPSBzLm1pbWVUeXBlIHx8IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEga25vd24gY29udGVudC10eXBlXG5cdGlmICggY3QgKSB7XG5cdFx0Zm9yICggdHlwZSBpbiBjb250ZW50cyApIHtcblx0XHRcdGlmICggY29udGVudHNbIHR5cGUgXSAmJiBjb250ZW50c1sgdHlwZSBdLnRlc3QoIGN0ICkgKSB7XG5cdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0eXBlICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZVxuXHRpZiAoIGRhdGFUeXBlc1sgMCBdIGluIHJlc3BvbnNlcyApIHtcblx0XHRmaW5hbERhdGFUeXBlID0gZGF0YVR5cGVzWyAwIF07XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzXG5cdFx0Zm9yICggdHlwZSBpbiByZXNwb25zZXMgKSB7XG5cdFx0XHRpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyBcIiBcIiArIGRhdGFUeXBlc1sgMCBdIF0gKSB7XG5cdFx0XHRcdGZpbmFsRGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggIWZpcnN0RGF0YVR5cGUgKSB7XG5cdFx0XHRcdGZpcnN0RGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZVxuXHRcdGZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7XG5cdH1cblxuXHQvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlXG5cdC8vIFdlIGFkZCB0aGUgZGF0YVR5cGUgdG8gdGhlIGxpc3QgaWYgbmVlZGVkXG5cdC8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2Vcblx0aWYgKCBmaW5hbERhdGFUeXBlICkge1xuXHRcdGlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAwIF0gKSB7XG5cdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07XG5cdH1cbn1cblxuLyogQ2hhaW4gY29udmVyc2lvbnMgZ2l2ZW4gdGhlIHJlcXVlc3QgYW5kIHRoZSBvcmlnaW5hbCByZXNwb25zZVxuICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApIHtcblx0dmFyIGNvbnYyLCBjdXJyZW50LCBjb252LCB0bXAsIHByZXYsXG5cdFx0Y29udmVydGVycyA9IHt9LFxuXG5cdFx0Ly8gV29yayB3aXRoIGEgY29weSBvZiBkYXRhVHlwZXMgaW4gY2FzZSB3ZSBuZWVkIHRvIG1vZGlmeSBpdCBmb3IgY29udmVyc2lvblxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzLnNsaWNlKCk7XG5cblx0Ly8gQ3JlYXRlIGNvbnZlcnRlcnMgbWFwIHdpdGggbG93ZXJjYXNlZCBrZXlzXG5cdGlmICggZGF0YVR5cGVzWyAxIF0gKSB7XG5cdFx0Zm9yICggY29udiBpbiBzLmNvbnZlcnRlcnMgKSB7XG5cdFx0XHRjb252ZXJ0ZXJzWyBjb252LnRvTG93ZXJDYXNlKCkgXSA9IHMuY29udmVydGVyc1sgY29udiBdO1xuXHRcdH1cblx0fVxuXG5cdGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTtcblxuXHQvLyBDb252ZXJ0IHRvIGVhY2ggc2VxdWVudGlhbCBkYXRhVHlwZVxuXHR3aGlsZSAoIGN1cnJlbnQgKSB7XG5cblx0XHRpZiAoIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSApIHtcblx0XHRcdGpxWEhSWyBzLnJlc3BvbnNlRmllbGRzWyBjdXJyZW50IF0gXSA9IHJlc3BvbnNlO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkXG5cdFx0aWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkge1xuXHRcdFx0cmVzcG9uc2UgPSBzLmRhdGFGaWx0ZXIoIHJlc3BvbnNlLCBzLmRhdGFUeXBlICk7XG5cdFx0fVxuXG5cdFx0cHJldiA9IGN1cnJlbnQ7XG5cdFx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdFx0aWYgKCBjdXJyZW50ICkge1xuXG5cdFx0XHQvLyBUaGVyZSdzIG9ubHkgd29yayB0byBkbyBpZiBjdXJyZW50IGRhdGFUeXBlIGlzIG5vbi1hdXRvXG5cdFx0XHRpZiAoIGN1cnJlbnQgPT09IFwiKlwiICkge1xuXG5cdFx0XHRcdGN1cnJlbnQgPSBwcmV2O1xuXG5cdFx0XHQvLyBDb252ZXJ0IHJlc3BvbnNlIGlmIHByZXYgZGF0YVR5cGUgaXMgbm9uLWF1dG8gYW5kIGRpZmZlcnMgZnJvbSBjdXJyZW50XG5cdFx0XHR9IGVsc2UgaWYgKCBwcmV2ICE9PSBcIipcIiAmJiBwcmV2ICE9PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdC8vIFNlZWsgYSBkaXJlY3QgY29udmVydGVyXG5cdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyBjdXJyZW50IF0gfHwgY29udmVydGVyc1sgXCIqIFwiICsgY3VycmVudCBdO1xuXG5cdFx0XHRcdC8vIElmIG5vbmUgZm91bmQsIHNlZWsgYSBwYWlyXG5cdFx0XHRcdGlmICggIWNvbnYgKSB7XG5cdFx0XHRcdFx0Zm9yICggY29udjIgaW4gY29udmVydGVycyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSWYgY29udjIgb3V0cHV0cyBjdXJyZW50XG5cdFx0XHRcdFx0XHR0bXAgPSBjb252Mi5zcGxpdCggXCIgXCIgKTtcblx0XHRcdFx0XHRcdGlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0XG5cdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyB0bXBbIDAgXSBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyc1sgXCIqIFwiICsgdG1wWyAwIF0gXTtcblx0XHRcdFx0XHRcdFx0aWYgKCBjb252ICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVyc1xuXHRcdFx0XHRcdFx0XHRcdGlmICggY29udiA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBjb252MiBdO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCBpbnNlcnQgdGhlIGludGVybWVkaWF0ZSBkYXRhVHlwZVxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGNvbnZlcnRlcnNbIGNvbnYyIF0gIT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50ID0gdG1wWyAwIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggdG1wWyAxIF0gKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSlcblx0XHRcdFx0aWYgKCBjb252ICE9PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0Ly8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbVxuXHRcdFx0XHRcdGlmICggY29udiAmJiBzLnRocm93cyApIHtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0c3RhdGU6IFwicGFyc2VyZXJyb3JcIixcblx0XHRcdFx0XHRcdFx0XHRlcnJvcjogY29udiA/IGUgOiBcIk5vIGNvbnZlcnNpb24gZnJvbSBcIiArIHByZXYgKyBcIiB0byBcIiArIGN1cnJlbnRcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4geyBzdGF0ZTogXCJzdWNjZXNzXCIsIGRhdGE6IHJlc3BvbnNlIH07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXNcblx0YWN0aXZlOiAwLFxuXG5cdC8vIExhc3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBuZXh0IHJlcXVlc3Rcblx0bGFzdE1vZGlmaWVkOiB7fSxcblx0ZXRhZzoge30sXG5cblx0YWpheFNldHRpbmdzOiB7XG5cdFx0dXJsOiBsb2NhdGlvbi5ocmVmLFxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0aXNMb2NhbDogcmxvY2FsUHJvdG9jb2wudGVzdCggbG9jYXRpb24ucHJvdG9jb2wgKSxcblx0XHRnbG9iYWw6IHRydWUsXG5cdFx0cHJvY2Vzc0RhdGE6IHRydWUsXG5cdFx0YXN5bmM6IHRydWUsXG5cdFx0Y29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04XCIsXG5cblx0XHQvKlxuXHRcdHRpbWVvdXQ6IDAsXG5cdFx0ZGF0YTogbnVsbCxcblx0XHRkYXRhVHlwZTogbnVsbCxcblx0XHR1c2VybmFtZTogbnVsbCxcblx0XHRwYXNzd29yZDogbnVsbCxcblx0XHRjYWNoZTogbnVsbCxcblx0XHR0aHJvd3M6IGZhbHNlLFxuXHRcdHRyYWRpdGlvbmFsOiBmYWxzZSxcblx0XHRoZWFkZXJzOiB7fSxcblx0XHQqL1xuXG5cdFx0YWNjZXB0czoge1xuXHRcdFx0XCIqXCI6IGFsbFR5cGVzLFxuXHRcdFx0dGV4dDogXCJ0ZXh0L3BsYWluXCIsXG5cdFx0XHRodG1sOiBcInRleHQvaHRtbFwiLFxuXHRcdFx0eG1sOiBcImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWxcIixcblx0XHRcdGpzb246IFwiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0XCJcblx0XHR9LFxuXG5cdFx0Y29udGVudHM6IHtcblx0XHRcdHhtbDogL1xcYnhtbFxcYi8sXG5cdFx0XHRodG1sOiAvXFxiaHRtbC8sXG5cdFx0XHRqc29uOiAvXFxianNvblxcYi9cblx0XHR9LFxuXG5cdFx0cmVzcG9uc2VGaWVsZHM6IHtcblx0XHRcdHhtbDogXCJyZXNwb25zZVhNTFwiLFxuXHRcdFx0dGV4dDogXCJyZXNwb25zZVRleHRcIixcblx0XHRcdGpzb246IFwicmVzcG9uc2VKU09OXCJcblx0XHR9LFxuXG5cdFx0Ly8gRGF0YSBjb252ZXJ0ZXJzXG5cdFx0Ly8gS2V5cyBzZXBhcmF0ZSBzb3VyY2UgKG9yIGNhdGNoYWxsIFwiKlwiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuXHRcdGNvbnZlcnRlcnM6IHtcblxuXHRcdFx0Ly8gQ29udmVydCBhbnl0aGluZyB0byB0ZXh0XG5cdFx0XHRcIiogdGV4dFwiOiBTdHJpbmcsXG5cblx0XHRcdC8vIFRleHQgdG8gaHRtbCAodHJ1ZSA9IG5vIHRyYW5zZm9ybWF0aW9uKVxuXHRcdFx0XCJ0ZXh0IGh0bWxcIjogdHJ1ZSxcblxuXHRcdFx0Ly8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvblxuXHRcdFx0XCJ0ZXh0IGpzb25cIjogSlNPTi5wYXJzZSxcblxuXHRcdFx0Ly8gUGFyc2UgdGV4dCBhcyB4bWxcblx0XHRcdFwidGV4dCB4bWxcIjogalF1ZXJ5LnBhcnNlWE1MXG5cdFx0fSxcblxuXHRcdC8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6XG5cdFx0Ly8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZlxuXHRcdC8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlXG5cdFx0Ly8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpXG5cdFx0ZmxhdE9wdGlvbnM6IHtcblx0XHRcdHVybDogdHJ1ZSxcblx0XHRcdGNvbnRleHQ6IHRydWVcblx0XHR9XG5cdH0sXG5cblx0Ly8gQ3JlYXRlcyBhIGZ1bGwgZmxlZGdlZCBzZXR0aW5ncyBvYmplY3QgaW50byB0YXJnZXRcblx0Ly8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLlxuXHQvLyBJZiB0YXJnZXQgaXMgb21pdHRlZCwgd3JpdGVzIGludG8gYWpheFNldHRpbmdzLlxuXHRhamF4U2V0dXA6IGZ1bmN0aW9uKCB0YXJnZXQsIHNldHRpbmdzICkge1xuXHRcdHJldHVybiBzZXR0aW5ncyA/XG5cblx0XHRcdC8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0XG5cdFx0XHRhamF4RXh0ZW5kKCBhamF4RXh0ZW5kKCB0YXJnZXQsIGpRdWVyeS5hamF4U2V0dGluZ3MgKSwgc2V0dGluZ3MgKSA6XG5cblx0XHRcdC8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3Ncblx0XHRcdGFqYXhFeHRlbmQoIGpRdWVyeS5hamF4U2V0dGluZ3MsIHRhcmdldCApO1xuXHR9LFxuXG5cdGFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLFxuXHRhamF4VHJhbnNwb3J0OiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMgKSxcblxuXHQvLyBNYWluIG1ldGhvZFxuXHRhamF4OiBmdW5jdGlvbiggdXJsLCBvcHRpb25zICkge1xuXG5cdFx0Ly8gSWYgdXJsIGlzIGFuIG9iamVjdCwgc2ltdWxhdGUgcHJlLTEuNSBzaWduYXR1cmVcblx0XHRpZiAoIHR5cGVvZiB1cmwgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRvcHRpb25zID0gdXJsO1xuXHRcdFx0dXJsID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIEZvcmNlIG9wdGlvbnMgdG8gYmUgYW4gb2JqZWN0XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0XHR2YXIgdHJhbnNwb3J0LFxuXG5cdFx0XHQvLyBVUkwgd2l0aG91dCBhbnRpLWNhY2hlIHBhcmFtXG5cdFx0XHRjYWNoZVVSTCxcblxuXHRcdFx0Ly8gUmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nLFxuXHRcdFx0cmVzcG9uc2VIZWFkZXJzLFxuXG5cdFx0XHQvLyB0aW1lb3V0IGhhbmRsZVxuXHRcdFx0dGltZW91dFRpbWVyLFxuXG5cdFx0XHQvLyBVcmwgY2xlYW51cCB2YXJcblx0XHRcdHVybEFuY2hvcixcblxuXHRcdFx0Ly8gUmVxdWVzdCBzdGF0ZSAoYmVjb21lcyBmYWxzZSB1cG9uIHNlbmQgYW5kIHRydWUgdXBvbiBjb21wbGV0aW9uKVxuXHRcdFx0Y29tcGxldGVkLFxuXG5cdFx0XHQvLyBUbyBrbm93IGlmIGdsb2JhbCBldmVudHMgYXJlIHRvIGJlIGRpc3BhdGNoZWRcblx0XHRcdGZpcmVHbG9iYWxzLFxuXG5cdFx0XHQvLyBMb29wIHZhcmlhYmxlXG5cdFx0XHRpLFxuXG5cdFx0XHQvLyB1bmNhY2hlZCBwYXJ0IG9mIHRoZSB1cmxcblx0XHRcdHVuY2FjaGVkLFxuXG5cdFx0XHQvLyBDcmVhdGUgdGhlIGZpbmFsIG9wdGlvbnMgb2JqZWN0XG5cdFx0XHRzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSxcblxuXHRcdFx0Ly8gQ2FsbGJhY2tzIGNvbnRleHRcblx0XHRcdGNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLFxuXG5cdFx0XHQvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzIGlzIGNhbGxiYWNrQ29udGV4dCBpZiBpdCBpcyBhIERPTSBub2RlIG9yIGpRdWVyeSBjb2xsZWN0aW9uXG5cdFx0XHRnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiZcblx0XHRcdFx0KCBjYWxsYmFja0NvbnRleHQubm9kZVR5cGUgfHwgY2FsbGJhY2tDb250ZXh0LmpxdWVyeSApID9cblx0XHRcdFx0XHRqUXVlcnkoIGNhbGxiYWNrQ29udGV4dCApIDpcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQsXG5cblx0XHRcdC8vIERlZmVycmVkc1xuXHRcdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblx0XHRcdGNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdHN0YXR1c0NvZGUgPSBzLnN0YXR1c0NvZGUgfHwge30sXG5cblx0XHRcdC8vIEhlYWRlcnMgKHRoZXkgYXJlIHNlbnQgYWxsIGF0IG9uY2UpXG5cdFx0XHRyZXF1ZXN0SGVhZGVycyA9IHt9LFxuXHRcdFx0cmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LFxuXG5cdFx0XHQvLyBEZWZhdWx0IGFib3J0IG1lc3NhZ2Vcblx0XHRcdHN0ckFib3J0ID0gXCJjYW5jZWxlZFwiLFxuXG5cdFx0XHQvLyBGYWtlIHhoclxuXHRcdFx0anFYSFIgPSB7XG5cdFx0XHRcdHJlYWR5U3RhdGU6IDAsXG5cblx0XHRcdFx0Ly8gQnVpbGRzIGhlYWRlcnMgaGFzaHRhYmxlIGlmIG5lZWRlZFxuXHRcdFx0XHRnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24oIGtleSApIHtcblx0XHRcdFx0XHR2YXIgbWF0Y2g7XG5cdFx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICFyZXNwb25zZUhlYWRlcnMgKSB7XG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVycyA9IHt9O1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoICggbWF0Y2ggPSByaGVhZGVycy5leGVjKCByZXNwb25zZUhlYWRlcnNTdHJpbmcgKSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hbIDEgXS50b0xvd2VyQ2FzZSgpIF0gPSBtYXRjaFsgMiBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoID09IG51bGwgPyBudWxsIDogbWF0Y2g7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gUmF3IHN0cmluZ1xuXHRcdFx0XHRnZXRBbGxSZXNwb25zZUhlYWRlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBjb21wbGV0ZWQgPyByZXNwb25zZUhlYWRlcnNTdHJpbmcgOiBudWxsO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENhY2hlcyB0aGUgaGVhZGVyXG5cdFx0XHRcdHNldFJlcXVlc3RIZWFkZXI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0bmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdID1cblx0XHRcdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnNOYW1lc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0gfHwgbmFtZTtcblx0XHRcdFx0XHRcdHJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gT3ZlcnJpZGVzIHJlc3BvbnNlIGNvbnRlbnQtdHlwZSBoZWFkZXJcblx0XHRcdFx0b3ZlcnJpZGVNaW1lVHlwZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRcdHMubWltZVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0XHRzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkge1xuXHRcdFx0XHRcdHZhciBjb2RlO1xuXHRcdFx0XHRcdGlmICggbWFwICkge1xuXHRcdFx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gRXhlY3V0ZSB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2tzXG5cdFx0XHRcdFx0XHRcdGpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBMYXp5LWFkZCB0aGUgbmV3IGNhbGxiYWNrcyBpbiBhIHdheSB0aGF0IHByZXNlcnZlcyBvbGQgb25lc1xuXHRcdFx0XHRcdFx0XHRmb3IgKCBjb2RlIGluIG1hcCApIHtcblx0XHRcdFx0XHRcdFx0XHRzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBDYW5jZWwgdGhlIHJlcXVlc3Rcblx0XHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCBzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHZhciBmaW5hbFRleHQgPSBzdGF0dXNUZXh0IHx8IHN0ckFib3J0O1xuXHRcdFx0XHRcdGlmICggdHJhbnNwb3J0ICkge1xuXHRcdFx0XHRcdFx0dHJhbnNwb3J0LmFib3J0KCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZG9uZSggMCwgZmluYWxUZXh0ICk7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHQvLyBBdHRhY2ggZGVmZXJyZWRzXG5cdFx0ZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKTtcblxuXHRcdC8vIEFkZCBwcm90b2NvbCBpZiBub3QgcHJvdmlkZWQgKHByZWZpbHRlcnMgbWlnaHQgZXhwZWN0IGl0KVxuXHRcdC8vIEhhbmRsZSBmYWxzeSB1cmwgaW4gdGhlIHNldHRpbmdzIG9iamVjdCAoIzEwMDkzOiBjb25zaXN0ZW5jeSB3aXRoIG9sZCBzaWduYXR1cmUpXG5cdFx0Ly8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlXG5cdFx0cy51cmwgPSAoICggdXJsIHx8IHMudXJsIHx8IGxvY2F0aW9uLmhyZWYgKSArIFwiXCIgKVxuXHRcdFx0LnJlcGxhY2UoIHJwcm90b2NvbCwgbG9jYXRpb24ucHJvdG9jb2wgKyBcIi8vXCIgKTtcblxuXHRcdC8vIEFsaWFzIG1ldGhvZCBvcHRpb24gdG8gdHlwZSBhcyBwZXIgdGlja2V0ICMxMjAwNFxuXHRcdHMudHlwZSA9IG9wdGlvbnMubWV0aG9kIHx8IG9wdGlvbnMudHlwZSB8fCBzLm1ldGhvZCB8fCBzLnR5cGU7XG5cblx0XHQvLyBFeHRyYWN0IGRhdGFUeXBlcyBsaXN0XG5cdFx0cy5kYXRhVHlwZXMgPSAoIHMuZGF0YVR5cGUgfHwgXCIqXCIgKS50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cblx0XHQvLyBBIGNyb3NzLWRvbWFpbiByZXF1ZXN0IGlzIGluIG9yZGVyIHdoZW4gdGhlIG9yaWdpbiBkb2Vzbid0IG1hdGNoIHRoZSBjdXJyZW50IG9yaWdpbi5cblx0XHRpZiAoIHMuY3Jvc3NEb21haW4gPT0gbnVsbCApIHtcblx0XHRcdHVybEFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiYVwiICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OCAtIDExLCBFZGdlIDEyIC0gMTNcblx0XHRcdC8vIElFIHRocm93cyBleGNlcHRpb24gb24gYWNjZXNzaW5nIHRoZSBocmVmIHByb3BlcnR5IGlmIHVybCBpcyBtYWxmb3JtZWQsXG5cdFx0XHQvLyBlLmcuIGh0dHA6Ly9leGFtcGxlLmNvbTo4MHgvXG5cdFx0XHR0cnkge1xuXHRcdFx0XHR1cmxBbmNob3IuaHJlZiA9IHMudXJsO1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OCAtIDExIG9ubHlcblx0XHRcdFx0Ly8gQW5jaG9yJ3MgaG9zdCBwcm9wZXJ0eSBpc24ndCBjb3JyZWN0bHkgc2V0IHdoZW4gcy51cmwgaXMgcmVsYXRpdmVcblx0XHRcdFx0dXJsQW5jaG9yLmhyZWYgPSB1cmxBbmNob3IuaHJlZjtcblx0XHRcdFx0cy5jcm9zc0RvbWFpbiA9IG9yaWdpbkFuY2hvci5wcm90b2NvbCArIFwiLy9cIiArIG9yaWdpbkFuY2hvci5ob3N0ICE9PVxuXHRcdFx0XHRcdHVybEFuY2hvci5wcm90b2NvbCArIFwiLy9cIiArIHVybEFuY2hvci5ob3N0O1xuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYW4gZXJyb3IgcGFyc2luZyB0aGUgVVJMLCBhc3N1bWUgaXQgaXMgY3Jvc3NEb21haW4sXG5cdFx0XHRcdC8vIGl0IGNhbiBiZSByZWplY3RlZCBieSB0aGUgdHJhbnNwb3J0IGlmIGl0IGlzIGludmFsaWRcblx0XHRcdFx0cy5jcm9zc0RvbWFpbiA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29udmVydCBkYXRhIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nXG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cy5kYXRhID0galF1ZXJ5LnBhcmFtKCBzLmRhdGEsIHMudHJhZGl0aW9uYWwgKTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSBwcmVmaWx0ZXJzXG5cdFx0aW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMsIHMsIG9wdGlvbnMsIGpxWEhSICk7XG5cblx0XHQvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZVxuXHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0cmV0dXJuIGpxWEhSO1xuXHRcdH1cblxuXHRcdC8vIFdlIGNhbiBmaXJlIGdsb2JhbCBldmVudHMgYXMgb2Ygbm93IGlmIGFza2VkIHRvXG5cdFx0Ly8gRG9uJ3QgZmlyZSBldmVudHMgaWYgalF1ZXJ5LmV2ZW50IGlzIHVuZGVmaW5lZCBpbiBhbiBBTUQtdXNhZ2Ugc2NlbmFyaW8gKCMxNTExOClcblx0XHRmaXJlR2xvYmFscyA9IGpRdWVyeS5ldmVudCAmJiBzLmdsb2JhbDtcblxuXHRcdC8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHNcblx0XHRpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBcImFqYXhTdGFydFwiICk7XG5cdFx0fVxuXG5cdFx0Ly8gVXBwZXJjYXNlIHRoZSB0eXBlXG5cdFx0cy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7XG5cblx0XHQvLyBEZXRlcm1pbmUgaWYgcmVxdWVzdCBoYXMgY29udGVudFxuXHRcdHMuaGFzQ29udGVudCA9ICFybm9Db250ZW50LnRlc3QoIHMudHlwZSApO1xuXG5cdFx0Ly8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlXG5cdFx0Ly8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uXG5cdFx0Ly8gUmVtb3ZlIGhhc2ggdG8gc2ltcGxpZnkgdXJsIG1hbmlwdWxhdGlvblxuXHRcdGNhY2hlVVJMID0gcy51cmwucmVwbGFjZSggcmhhc2gsIFwiXCIgKTtcblxuXHRcdC8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50XG5cdFx0aWYgKCAhcy5oYXNDb250ZW50ICkge1xuXG5cdFx0XHQvLyBSZW1lbWJlciB0aGUgaGFzaCBzbyB3ZSBjYW4gcHV0IGl0IGJhY2tcblx0XHRcdHVuY2FjaGVkID0gcy51cmwuc2xpY2UoIGNhY2hlVVJMLmxlbmd0aCApO1xuXG5cdFx0XHQvLyBJZiBkYXRhIGlzIGF2YWlsYWJsZSwgYXBwZW5kIGRhdGEgdG8gdXJsXG5cdFx0XHRpZiAoIHMuZGF0YSApIHtcblx0XHRcdFx0Y2FjaGVVUkwgKz0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuZGF0YTtcblxuXHRcdFx0XHQvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5XG5cdFx0XHRcdGRlbGV0ZSBzLmRhdGE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBvciB1cGRhdGUgYW50aS1jYWNoZSBwYXJhbSBpZiBuZWVkZWRcblx0XHRcdGlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdGNhY2hlVVJMID0gY2FjaGVVUkwucmVwbGFjZSggcmFudGlDYWNoZSwgXCIkMVwiICk7XG5cdFx0XHRcdHVuY2FjaGVkID0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/IFwiJlwiIDogXCI/XCIgKSArIFwiXz1cIiArICggbm9uY2UrKyApICsgdW5jYWNoZWQ7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFB1dCBoYXNoIGFuZCBhbnRpLWNhY2hlIG9uIHRoZSBVUkwgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZCAoZ2gtMTczMilcblx0XHRcdHMudXJsID0gY2FjaGVVUkwgKyB1bmNhY2hlZDtcblxuXHRcdC8vIENoYW5nZSAnJTIwJyB0byAnKycgaWYgdGhpcyBpcyBlbmNvZGVkIGZvcm0gYm9keSBjb250ZW50IChnaC0yNjU4KVxuXHRcdH0gZWxzZSBpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmXG5cdFx0XHQoIHMuY29udGVudFR5cGUgfHwgXCJcIiApLmluZGV4T2YoIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgKSA9PT0gMCApIHtcblx0XHRcdHMuZGF0YSA9IHMuZGF0YS5yZXBsYWNlKCByMjAsIFwiK1wiICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cblx0XHRpZiAoIHMuaWZNb2RpZmllZCApIHtcblx0XHRcdGlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Nb2RpZmllZC1TaW5jZVwiLCBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkge1xuXHRcdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIklmLU5vbmUtTWF0Y2hcIiwgalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnRcblx0XHRpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHtcblx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiQ29udGVudC1UeXBlXCIsIHMuY29udGVudFR5cGUgKTtcblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlXG5cdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlcihcblx0XHRcdFwiQWNjZXB0XCIsXG5cdFx0XHRzLmRhdGFUeXBlc1sgMCBdICYmIHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbIDAgXSBdID9cblx0XHRcdFx0cy5hY2NlcHRzWyBzLmRhdGFUeXBlc1sgMCBdIF0gK1xuXHRcdFx0XHRcdCggcy5kYXRhVHlwZXNbIDAgXSAhPT0gXCIqXCIgPyBcIiwgXCIgKyBhbGxUeXBlcyArIFwiOyBxPTAuMDFcIiA6IFwiXCIgKSA6XG5cdFx0XHRcdHMuYWNjZXB0c1sgXCIqXCIgXVxuXHRcdCk7XG5cblx0XHQvLyBDaGVjayBmb3IgaGVhZGVycyBvcHRpb25cblx0XHRmb3IgKCBpIGluIHMuaGVhZGVycyApIHtcblx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIGksIHMuaGVhZGVyc1sgaSBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsb3cgY3VzdG9tIGhlYWRlcnMvbWltZXR5cGVzIGFuZCBlYXJseSBhYm9ydFxuXHRcdGlmICggcy5iZWZvcmVTZW5kICYmXG5cdFx0XHQoIHMuYmVmb3JlU2VuZC5jYWxsKCBjYWxsYmFja0NvbnRleHQsIGpxWEhSLCBzICkgPT09IGZhbHNlIHx8IGNvbXBsZXRlZCApICkge1xuXG5cdFx0XHQvLyBBYm9ydCBpZiBub3QgZG9uZSBhbHJlYWR5IGFuZCByZXR1cm5cblx0XHRcdHJldHVybiBqcVhIUi5hYm9ydCgpO1xuXHRcdH1cblxuXHRcdC8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvblxuXHRcdHN0ckFib3J0ID0gXCJhYm9ydFwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzXG5cdFx0Y29tcGxldGVEZWZlcnJlZC5hZGQoIHMuY29tcGxldGUgKTtcblx0XHRqcVhIUi5kb25lKCBzLnN1Y2Nlc3MgKTtcblx0XHRqcVhIUi5mYWlsKCBzLmVycm9yICk7XG5cblx0XHQvLyBHZXQgdHJhbnNwb3J0XG5cdFx0dHJhbnNwb3J0ID0gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMsIHMsIG9wdGlvbnMsIGpxWEhSICk7XG5cblx0XHQvLyBJZiBubyB0cmFuc3BvcnQsIHdlIGF1dG8tYWJvcnRcblx0XHRpZiAoICF0cmFuc3BvcnQgKSB7XG5cdFx0XHRkb25lKCAtMSwgXCJObyBUcmFuc3BvcnRcIiApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gMTtcblxuXHRcdFx0Ly8gU2VuZCBnbG9iYWwgZXZlbnRcblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBcImFqYXhTZW5kXCIsIFsganFYSFIsIHMgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhamF4U2VuZCwgc3RvcCB0aGVyZVxuXHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdHJldHVybiBqcVhIUjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGltZW91dFxuXHRcdFx0aWYgKCBzLmFzeW5jICYmIHMudGltZW91dCA+IDAgKSB7XG5cdFx0XHRcdHRpbWVvdXRUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRqcVhIUi5hYm9ydCggXCJ0aW1lb3V0XCIgKTtcblx0XHRcdFx0fSwgcy50aW1lb3V0ICk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbXBsZXRlZCA9IGZhbHNlO1xuXHRcdFx0XHR0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdC8vIFJldGhyb3cgcG9zdC1jb21wbGV0aW9uIGV4Y2VwdGlvbnNcblx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFByb3BhZ2F0ZSBvdGhlcnMgYXMgcmVzdWx0c1xuXHRcdFx0XHRkb25lKCAtMSwgZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZVxuXHRcdGZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkge1xuXHRcdFx0dmFyIGlzU3VjY2Vzcywgc3VjY2VzcywgZXJyb3IsIHJlc3BvbnNlLCBtb2RpZmllZCxcblx0XHRcdFx0c3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7XG5cblx0XHRcdC8vIElnbm9yZSByZXBlYXQgaW52b2NhdGlvbnNcblx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbXBsZXRlZCA9IHRydWU7XG5cblx0XHRcdC8vIENsZWFyIHRpbWVvdXQgaWYgaXQgZXhpc3RzXG5cdFx0XHRpZiAoIHRpbWVvdXRUaW1lciApIHtcblx0XHRcdFx0d2luZG93LmNsZWFyVGltZW91dCggdGltZW91dFRpbWVyICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIERlcmVmZXJlbmNlIHRyYW5zcG9ydCBmb3IgZWFybHkgZ2FyYmFnZSBjb2xsZWN0aW9uXG5cdFx0XHQvLyAobm8gbWF0dGVyIGhvdyBsb25nIHRoZSBqcVhIUiBvYmplY3Qgd2lsbCBiZSB1c2VkKVxuXHRcdFx0dHJhbnNwb3J0ID0gdW5kZWZpbmVkO1xuXG5cdFx0XHQvLyBDYWNoZSByZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8IFwiXCI7XG5cblx0XHRcdC8vIFNldCByZWFkeVN0YXRlXG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gc3RhdHVzID4gMCA/IDQgOiAwO1xuXG5cdFx0XHQvLyBEZXRlcm1pbmUgaWYgc3VjY2Vzc2Z1bFxuXHRcdFx0aXNTdWNjZXNzID0gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDAgfHwgc3RhdHVzID09PSAzMDQ7XG5cblx0XHRcdC8vIEdldCByZXNwb25zZSBkYXRhXG5cdFx0XHRpZiAoIHJlc3BvbnNlcyApIHtcblx0XHRcdFx0cmVzcG9uc2UgPSBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnZlcnQgbm8gbWF0dGVyIHdoYXQgKHRoYXQgd2F5IHJlc3BvbnNlWFhYIGZpZWxkcyBhcmUgYWx3YXlzIHNldClcblx0XHRcdHJlc3BvbnNlID0gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICk7XG5cblx0XHRcdC8vIElmIHN1Y2Nlc3NmdWwsIGhhbmRsZSB0eXBlIGNoYWluaW5nXG5cdFx0XHRpZiAoIGlzU3VjY2VzcyApIHtcblxuXHRcdFx0XHQvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLlxuXHRcdFx0XHRpZiAoIHMuaWZNb2RpZmllZCApIHtcblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcIkxhc3QtTW9kaWZpZWRcIiApO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdID0gbW9kaWZpZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiZXRhZ1wiICk7XG5cdFx0XHRcdFx0aWYgKCBtb2RpZmllZCApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdID0gbW9kaWZpZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gaWYgbm8gY29udGVudFxuXHRcdFx0XHRpZiAoIHN0YXR1cyA9PT0gMjA0IHx8IHMudHlwZSA9PT0gXCJIRUFEXCIgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwibm9jb250ZW50XCI7XG5cblx0XHRcdFx0Ly8gaWYgbm90IG1vZGlmaWVkXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHN0YXR1cyA9PT0gMzA0ICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vdG1vZGlmaWVkXCI7XG5cblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBkYXRhLCBsZXQncyBjb252ZXJ0IGl0XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXRlO1xuXHRcdFx0XHRcdHN1Y2Nlc3MgPSByZXNwb25zZS5kYXRhO1xuXHRcdFx0XHRcdGVycm9yID0gcmVzcG9uc2UuZXJyb3I7XG5cdFx0XHRcdFx0aXNTdWNjZXNzID0gIWVycm9yO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0IGFuZCBub3JtYWxpemUgZm9yIG5vbi1hYm9ydHNcblx0XHRcdFx0ZXJyb3IgPSBzdGF0dXNUZXh0O1xuXHRcdFx0XHRpZiAoIHN0YXR1cyB8fCAhc3RhdHVzVGV4dCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJlcnJvclwiO1xuXHRcdFx0XHRcdGlmICggc3RhdHVzIDwgMCApIHtcblx0XHRcdFx0XHRcdHN0YXR1cyA9IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCBkYXRhIGZvciB0aGUgZmFrZSB4aHIgb2JqZWN0XG5cdFx0XHRqcVhIUi5zdGF0dXMgPSBzdGF0dXM7XG5cdFx0XHRqcVhIUi5zdGF0dXNUZXh0ID0gKCBuYXRpdmVTdGF0dXNUZXh0IHx8IHN0YXR1c1RleHQgKSArIFwiXCI7XG5cblx0XHRcdC8vIFN1Y2Nlc3MvRXJyb3Jcblx0XHRcdGlmICggaXNTdWNjZXNzICkge1xuXHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhSIF0gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0anFYSFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApO1xuXHRcdFx0c3RhdHVzQ29kZSA9IHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/IFwiYWpheFN1Y2Nlc3NcIiA6IFwiYWpheEVycm9yXCIsXG5cdFx0XHRcdFx0WyBqcVhIUiwgcywgaXNTdWNjZXNzID8gc3VjY2VzcyA6IGVycm9yIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29tcGxldGVcblx0XHRcdGNvbXBsZXRlRGVmZXJyZWQuZmlyZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCBdICk7XG5cblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBcImFqYXhDb21wbGV0ZVwiLCBbIGpxWEhSLCBzIF0gKTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXJcblx0XHRcdFx0aWYgKCAhKCAtLWpRdWVyeS5hY3RpdmUgKSApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggXCJhamF4U3RvcFwiICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ganFYSFI7XG5cdH0sXG5cblx0Z2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssIFwianNvblwiICk7XG5cdH0sXG5cblx0Z2V0U2NyaXB0OiBmdW5jdGlvbiggdXJsLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCB1bmRlZmluZWQsIGNhbGxiYWNrLCBcInNjcmlwdFwiICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIFsgXCJnZXRcIiwgXCJwb3N0XCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHtcblx0alF1ZXJ5WyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkge1xuXG5cdFx0Ly8gU2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWRcblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBkYXRhICkgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBjYWxsYmFjaztcblx0XHRcdGNhbGxiYWNrID0gZGF0YTtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gVGhlIHVybCBjYW4gYmUgYW4gb3B0aW9ucyBvYmplY3QgKHdoaWNoIHRoZW4gbXVzdCBoYXZlIC51cmwpXG5cdFx0cmV0dXJuIGpRdWVyeS5hamF4KCBqUXVlcnkuZXh0ZW5kKCB7XG5cdFx0XHR1cmw6IHVybCxcblx0XHRcdHR5cGU6IG1ldGhvZCxcblx0XHRcdGRhdGFUeXBlOiB0eXBlLFxuXHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdHN1Y2Nlc3M6IGNhbGxiYWNrXG5cdFx0fSwgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHVybCApICYmIHVybCApICk7XG5cdH07XG59ICk7XG5cblxualF1ZXJ5Ll9ldmFsVXJsID0gZnVuY3Rpb24oIHVybCApIHtcblx0cmV0dXJuIGpRdWVyeS5hamF4KCB7XG5cdFx0dXJsOiB1cmwsXG5cblx0XHQvLyBNYWtlIHRoaXMgZXhwbGljaXQsIHNpbmNlIHVzZXIgY2FuIG92ZXJyaWRlIHRoaXMgdGhyb3VnaCBhamF4U2V0dXAgKCMxMTI2NClcblx0XHR0eXBlOiBcIkdFVFwiLFxuXHRcdGRhdGFUeXBlOiBcInNjcmlwdFwiLFxuXHRcdGNhY2hlOiB0cnVlLFxuXHRcdGFzeW5jOiBmYWxzZSxcblx0XHRnbG9iYWw6IGZhbHNlLFxuXHRcdFwidGhyb3dzXCI6IHRydWVcblx0fSApO1xufTtcblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciB3cmFwO1xuXG5cdFx0aWYgKCB0aGlzWyAwIF0gKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICkgKSB7XG5cdFx0XHRcdGh0bWwgPSBodG1sLmNhbGwoIHRoaXNbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZFxuXHRcdFx0d3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7XG5cblx0XHRcdGlmICggdGhpc1sgMCBdLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0d3JhcC5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZWxlbSA9IHRoaXM7XG5cblx0XHRcdFx0d2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkge1xuXHRcdFx0XHRcdGVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVsZW07XG5cdFx0XHR9ICkuYXBwZW5kKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0d3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkud3JhcElubmVyKCBodG1sLmNhbGwoIHRoaXMsIGkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHNlbGYgPSBqUXVlcnkoIHRoaXMgKSxcblx0XHRcdFx0Y29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7XG5cblx0XHRcdGlmICggY29udGVudHMubGVuZ3RoICkge1xuXHRcdFx0XHRjb250ZW50cy53cmFwQWxsKCBodG1sICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNlbGYuYXBwZW5kKCBodG1sICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdHdyYXA6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciBpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKTtcblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0alF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaXNGdW5jdGlvbiA/IGh0bWwuY2FsbCggdGhpcywgaSApIDogaHRtbCApO1xuXHRcdH0gKTtcblx0fSxcblxuXHR1bndyYXA6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR0aGlzLnBhcmVudCggc2VsZWN0b3IgKS5ub3QoIFwiYm9keVwiICkuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkoIHRoaXMgKS5yZXBsYWNlV2l0aCggdGhpcy5jaGlsZE5vZGVzICk7XG5cdFx0fSApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59ICk7XG5cblxualF1ZXJ5LmV4cHIucHNldWRvcy5oaWRkZW4gPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuICFqUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUoIGVsZW0gKTtcbn07XG5qUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuICEhKCBlbGVtLm9mZnNldFdpZHRoIHx8IGVsZW0ub2Zmc2V0SGVpZ2h0IHx8IGVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKTtcbn07XG5cblxuXG5cbmpRdWVyeS5hamF4U2V0dGluZ3MueGhyID0gZnVuY3Rpb24oKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcblx0fSBjYXRjaCAoIGUgKSB7fVxufTtcblxudmFyIHhoclN1Y2Nlc3NTdGF0dXMgPSB7XG5cblx0XHQvLyBGaWxlIHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIGNvZGUgMCwgYXNzdW1lIDIwMFxuXHRcdDA6IDIwMCxcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0Ly8gIzE0NTA6IHNvbWV0aW1lcyBJRSByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0XG5cdFx0MTIyMzogMjA0XG5cdH0sXG5cdHhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7XG5cbnN1cHBvcnQuY29ycyA9ICEheGhyU3VwcG9ydGVkICYmICggXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiB4aHJTdXBwb3J0ZWQgKTtcbnN1cHBvcnQuYWpheCA9IHhoclN1cHBvcnRlZCA9ICEheGhyU3VwcG9ydGVkO1xuXG5qUXVlcnkuYWpheFRyYW5zcG9ydCggZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdHZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjaztcblxuXHQvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0XG5cdGlmICggc3VwcG9ydC5jb3JzIHx8IHhoclN1cHBvcnRlZCAmJiAhb3B0aW9ucy5jcm9zc0RvbWFpbiApIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkge1xuXHRcdFx0XHR2YXIgaSxcblx0XHRcdFx0XHR4aHIgPSBvcHRpb25zLnhocigpO1xuXG5cdFx0XHRcdHhoci5vcGVuKFxuXHRcdFx0XHRcdG9wdGlvbnMudHlwZSxcblx0XHRcdFx0XHRvcHRpb25zLnVybCxcblx0XHRcdFx0XHRvcHRpb25zLmFzeW5jLFxuXHRcdFx0XHRcdG9wdGlvbnMudXNlcm5hbWUsXG5cdFx0XHRcdFx0b3B0aW9ucy5wYXNzd29yZFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIEFwcGx5IGN1c3RvbSBmaWVsZHMgaWYgcHJvdmlkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLnhockZpZWxkcyApIHtcblx0XHRcdFx0XHRmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdFx0eGhyWyBpIF0gPSBvcHRpb25zLnhockZpZWxkc1sgaSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLm1pbWVUeXBlICYmIHhoci5vdmVycmlkZU1pbWVUeXBlICkge1xuXHRcdFx0XHRcdHhoci5vdmVycmlkZU1pbWVUeXBlKCBvcHRpb25zLm1pbWVUeXBlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlclxuXHRcdFx0XHQvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlXG5cdFx0XHRcdC8vIGFraW4gdG8gYSBqaWdzYXcgcHV6emxlLCB3ZSBzaW1wbHkgbmV2ZXIgc2V0IGl0IHRvIGJlIHN1cmUuXG5cdFx0XHRcdC8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKVxuXHRcdFx0XHQvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC5cblx0XHRcdFx0aWYgKCAhb3B0aW9ucy5jcm9zc0RvbWFpbiAmJiAhaGVhZGVyc1sgXCJYLVJlcXVlc3RlZC1XaXRoXCIgXSApIHtcblx0XHRcdFx0XHRoZWFkZXJzWyBcIlgtUmVxdWVzdGVkLVdpdGhcIiBdID0gXCJYTUxIdHRwUmVxdWVzdFwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU2V0IGhlYWRlcnNcblx0XHRcdFx0Zm9yICggaSBpbiBoZWFkZXJzICkge1xuXHRcdFx0XHRcdHhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBlcnJvckNhbGxiYWNrID0geGhyLm9ubG9hZCA9XG5cdFx0XHRcdFx0XHRcdFx0eGhyLm9uZXJyb3IgPSB4aHIub25hYm9ydCA9IHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdHlwZSA9PT0gXCJhYm9ydFwiICkge1xuXHRcdFx0XHRcdFx0XHRcdHhoci5hYm9ydCgpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSBcImVycm9yXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuXHRcdFx0XHRcdFx0XHRcdC8vIE9uIGEgbWFudWFsIG5hdGl2ZSBhYm9ydCwgSUU5IHRocm93c1xuXHRcdFx0XHRcdFx0XHRcdC8vIGVycm9ycyBvbiBhbnkgcHJvcGVydHkgYWNjZXNzIHRoYXQgaXMgbm90IHJlYWR5U3RhdGVcblx0XHRcdFx0XHRcdFx0XHRpZiAoIHR5cGVvZiB4aHIuc3RhdHVzICE9PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoIDAsIFwiZXJyb3JcIiApO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZShcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBGaWxlOiBwcm90b2NvbCBhbHdheXMgeWllbGRzIHN0YXR1cyAwOyBzZWUgIzg2MDUsICMxNDIwN1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzVGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHJTdWNjZXNzU3RhdHVzWyB4aHIuc3RhdHVzIF0gfHwgeGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXNUZXh0LFxuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSUU5IGhhcyBubyBYSFIyIGJ1dCB0aHJvd3Mgb24gYmluYXJ5ICh0cmFjLTExNDI2KVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gRm9yIFhIUjIgbm9uLXRleHQsIGxldCB0aGUgY2FsbGVyIGhhbmRsZSBpdCAoZ2gtMjQ5OClcblx0XHRcdFx0XHRcdFx0XHRcdCggeGhyLnJlc3BvbnNlVHlwZSB8fCBcInRleHRcIiApICE9PSBcInRleHRcIiAgfHxcblx0XHRcdFx0XHRcdFx0XHRcdHR5cGVvZiB4aHIucmVzcG9uc2VUZXh0ICE9PSBcInN0cmluZ1wiID9cblx0XHRcdFx0XHRcdFx0XHRcdFx0eyBiaW5hcnk6IHhoci5yZXNwb25zZSB9IDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0eyB0ZXh0OiB4aHIucmVzcG9uc2VUZXh0IH0sXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKClcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHQvLyBMaXN0ZW4gdG8gZXZlbnRzXG5cdFx0XHRcdHhoci5vbmxvYWQgPSBjYWxsYmFjaygpO1xuXHRcdFx0XHRlcnJvckNhbGxiYWNrID0geGhyLm9uZXJyb3IgPSBjYWxsYmFjayggXCJlcnJvclwiICk7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgOSBvbmx5XG5cdFx0XHRcdC8vIFVzZSBvbnJlYWR5c3RhdGVjaGFuZ2UgdG8gcmVwbGFjZSBvbmFib3J0XG5cdFx0XHRcdC8vIHRvIGhhbmRsZSB1bmNhdWdodCBhYm9ydHNcblx0XHRcdFx0aWYgKCB4aHIub25hYm9ydCAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHhoci5vbmFib3J0ID0gZXJyb3JDYWxsYmFjaztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0XHRcdC8vIENoZWNrIHJlYWR5U3RhdGUgYmVmb3JlIHRpbWVvdXQgYXMgaXQgY2hhbmdlc1xuXHRcdFx0XHRcdFx0aWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBBbGxvdyBvbmVycm9yIHRvIGJlIGNhbGxlZCBmaXJzdCxcblx0XHRcdFx0XHRcdFx0Ly8gYnV0IHRoYXQgd2lsbCBub3QgaGFuZGxlIGEgbmF0aXZlIGFib3J0XG5cdFx0XHRcdFx0XHRcdC8vIEFsc28sIHNhdmUgZXJyb3JDYWxsYmFjayB0byBhIHZhcmlhYmxlXG5cdFx0XHRcdFx0XHRcdC8vIGFzIHhoci5vbmVycm9yIGNhbm5vdCBiZSBhY2Nlc3NlZFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGVycm9yQ2FsbGJhY2soKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ3JlYXRlIHRoZSBhYm9ydCBjYWxsYmFja1xuXHRcdFx0XHRjYWxsYmFjayA9IGNhbGxiYWNrKCBcImFib3J0XCIgKTtcblxuXHRcdFx0XHR0cnkge1xuXG5cdFx0XHRcdFx0Ly8gRG8gc2VuZCB0aGUgcmVxdWVzdCAodGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uKVxuXHRcdFx0XHRcdHhoci5zZW5kKCBvcHRpb25zLmhhc0NvbnRlbnQgJiYgb3B0aW9ucy5kYXRhIHx8IG51bGwgKTtcblx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0XHQvLyAjMTQ2ODM6IE9ubHkgcmV0aHJvdyBpZiB0aGlzIGhhc24ndCBiZWVuIG5vdGlmaWVkIGFzIGFuIGVycm9yIHlldFxuXHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFByZXZlbnQgYXV0by1leGVjdXRpb24gb2Ygc2NyaXB0cyB3aGVuIG5vIGV4cGxpY2l0IGRhdGFUeXBlIHdhcyBwcm92aWRlZCAoU2VlIGdoLTI0MzIpXG5qUXVlcnkuYWpheFByZWZpbHRlciggZnVuY3Rpb24oIHMgKSB7XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLmNvbnRlbnRzLnNjcmlwdCA9IGZhbHNlO1xuXHR9XG59ICk7XG5cbi8vIEluc3RhbGwgc2NyaXB0IGRhdGFUeXBlXG5qUXVlcnkuYWpheFNldHVwKCB7XG5cdGFjY2VwdHM6IHtcblx0XHRzY3JpcHQ6IFwidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBcIiArXG5cdFx0XHRcImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdFwiXG5cdH0sXG5cdGNvbnRlbnRzOiB7XG5cdFx0c2NyaXB0OiAvXFxiKD86amF2YXxlY21hKXNjcmlwdFxcYi9cblx0fSxcblx0Y29udmVydGVyczoge1xuXHRcdFwidGV4dCBzY3JpcHRcIjogZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggdGV4dCApO1xuXHRcdFx0cmV0dXJuIHRleHQ7XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgY3Jvc3NEb21haW5cbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcInNjcmlwdFwiLCBmdW5jdGlvbiggcyApIHtcblx0aWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0cy5jYWNoZSA9IGZhbHNlO1xuXHR9XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLnR5cGUgPSBcIkdFVFwiO1xuXHR9XG59ICk7XG5cbi8vIEJpbmQgc2NyaXB0IHRhZyBoYWNrIHRyYW5zcG9ydFxualF1ZXJ5LmFqYXhUcmFuc3BvcnQoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXG5cdC8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gcmVxdWVzdHNcblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHZhciBzY3JpcHQsIGNhbGxiYWNrO1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggXywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHNjcmlwdCA9IGpRdWVyeSggXCI8c2NyaXB0PlwiICkucHJvcCgge1xuXHRcdFx0XHRcdGNoYXJzZXQ6IHMuc2NyaXB0Q2hhcnNldCxcblx0XHRcdFx0XHRzcmM6IHMudXJsXG5cdFx0XHRcdH0gKS5vbihcblx0XHRcdFx0XHRcImxvYWQgZXJyb3JcIixcblx0XHRcdFx0XHRjYWxsYmFjayA9IGZ1bmN0aW9uKCBldnQgKSB7XG5cdFx0XHRcdFx0XHRzY3JpcHQucmVtb3ZlKCk7XG5cdFx0XHRcdFx0XHRjYWxsYmFjayA9IG51bGw7XG5cdFx0XHRcdFx0XHRpZiAoIGV2dCApIHtcblx0XHRcdFx0XHRcdFx0Y29tcGxldGUoIGV2dC50eXBlID09PSBcImVycm9yXCIgPyA0MDQgOiAyMDAsIGV2dC50eXBlICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIFVzZSBuYXRpdmUgRE9NIG1hbmlwdWxhdGlvbiB0byBhdm9pZCBvdXIgZG9tTWFuaXAgQUpBWCB0cmlja2VyeVxuXHRcdFx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKCBzY3JpcHRbIDAgXSApO1xuXHRcdFx0fSxcblx0XHRcdGFib3J0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRjYWxsYmFjaygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxufSApO1xuXG5cblxuXG52YXIgb2xkQ2FsbGJhY2tzID0gW10sXG5cdHJqc29ucCA9IC8oPSlcXD8oPz0mfCQpfFxcP1xcPy87XG5cbi8vIERlZmF1bHQganNvbnAgc2V0dGluZ3NcbmpRdWVyeS5hamF4U2V0dXAoIHtcblx0anNvbnA6IFwiY2FsbGJhY2tcIixcblx0anNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyBcIl9cIiArICggbm9uY2UrKyApICk7XG5cdFx0dGhpc1sgY2FsbGJhY2sgXSA9IHRydWU7XG5cdFx0cmV0dXJuIGNhbGxiYWNrO1xuXHR9XG59ICk7XG5cbi8vIERldGVjdCwgbm9ybWFsaXplIG9wdGlvbnMgYW5kIGluc3RhbGwgY2FsbGJhY2tzIGZvciBqc29ucCByZXF1ZXN0c1xualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIFwianNvbiBqc29ucFwiLCBmdW5jdGlvbiggcywgb3JpZ2luYWxTZXR0aW5ncywganFYSFIgKSB7XG5cblx0dmFyIGNhbGxiYWNrTmFtZSwgb3ZlcndyaXR0ZW4sIHJlc3BvbnNlQ29udGFpbmVyLFxuXHRcdGpzb25Qcm9wID0gcy5qc29ucCAhPT0gZmFsc2UgJiYgKCByanNvbnAudGVzdCggcy51cmwgKSA/XG5cdFx0XHRcInVybFwiIDpcblx0XHRcdHR5cGVvZiBzLmRhdGEgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0KCBzLmNvbnRlbnRUeXBlIHx8IFwiXCIgKVxuXHRcdFx0XHRcdC5pbmRleE9mKCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiICkgPT09IDAgJiZcblx0XHRcdFx0cmpzb25wLnRlc3QoIHMuZGF0YSApICYmIFwiZGF0YVwiXG5cdFx0KTtcblxuXHQvLyBIYW5kbGUgaWZmIHRoZSBleHBlY3RlZCBkYXRhIHR5cGUgaXMgXCJqc29ucFwiIG9yIHdlIGhhdmUgYSBwYXJhbWV0ZXIgdG8gc2V0XG5cdGlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gXCJqc29ucFwiICkge1xuXG5cdFx0Ly8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdFxuXHRcdGNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2soKSA6XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2s7XG5cblx0XHQvLyBJbnNlcnQgY2FsbGJhY2sgaW50byB1cmwgb3IgZm9ybSBkYXRhXG5cdFx0aWYgKCBqc29uUHJvcCApIHtcblx0XHRcdHNbIGpzb25Qcm9wIF0gPSBzWyBqc29uUHJvcCBdLnJlcGxhY2UoIHJqc29ucCwgXCIkMVwiICsgY2FsbGJhY2tOYW1lICk7XG5cdFx0fSBlbHNlIGlmICggcy5qc29ucCAhPT0gZmFsc2UgKSB7XG5cdFx0XHRzLnVybCArPSAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gXCImXCIgOiBcIj9cIiApICsgcy5qc29ucCArIFwiPVwiICsgY2FsbGJhY2tOYW1lO1xuXHRcdH1cblxuXHRcdC8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb25cblx0XHRzLmNvbnZlcnRlcnNbIFwic2NyaXB0IGpzb25cIiBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHtcblx0XHRcdFx0alF1ZXJ5LmVycm9yKCBjYWxsYmFja05hbWUgKyBcIiB3YXMgbm90IGNhbGxlZFwiICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTtcblx0XHR9O1xuXG5cdFx0Ly8gRm9yY2UganNvbiBkYXRhVHlwZVxuXHRcdHMuZGF0YVR5cGVzWyAwIF0gPSBcImpzb25cIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tcblx0XHRvdmVyd3JpdHRlbiA9IHdpbmRvd1sgY2FsbGJhY2tOYW1lIF07XG5cdFx0d2luZG93WyBjYWxsYmFja05hbWUgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmVzcG9uc2VDb250YWluZXIgPSBhcmd1bWVudHM7XG5cdFx0fTtcblxuXHRcdC8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKVxuXHRcdGpxWEhSLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIElmIHByZXZpb3VzIHZhbHVlIGRpZG4ndCBleGlzdCAtIHJlbW92ZSBpdFxuXHRcdFx0aWYgKCBvdmVyd3JpdHRlbiA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRqUXVlcnkoIHdpbmRvdyApLnJlbW92ZVByb3AoIGNhbGxiYWNrTmFtZSApO1xuXG5cdFx0XHQvLyBPdGhlcndpc2UgcmVzdG9yZSBwcmVleGlzdGluZyB2YWx1ZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2luZG93WyBjYWxsYmFja05hbWUgXSA9IG92ZXJ3cml0dGVuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTYXZlIGJhY2sgYXMgZnJlZVxuXHRcdFx0aWYgKCBzWyBjYWxsYmFja05hbWUgXSApIHtcblxuXHRcdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCByZS11c2luZyB0aGUgb3B0aW9ucyBkb2Vzbid0IHNjcmV3IHRoaW5ncyBhcm91bmRcblx0XHRcdFx0cy5qc29ucENhbGxiYWNrID0gb3JpZ2luYWxTZXR0aW5ncy5qc29ucENhbGxiYWNrO1xuXG5cdFx0XHRcdC8vIFNhdmUgdGhlIGNhbGxiYWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2Vcblx0XHRcdFx0b2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2Vcblx0XHRcdGlmICggcmVzcG9uc2VDb250YWluZXIgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIG92ZXJ3cml0dGVuICkgKSB7XG5cdFx0XHRcdG92ZXJ3cml0dGVuKCByZXNwb25zZUNvbnRhaW5lclsgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gb3ZlcndyaXR0ZW4gPSB1bmRlZmluZWQ7XG5cdFx0fSApO1xuXG5cdFx0Ly8gRGVsZWdhdGUgdG8gc2NyaXB0XG5cdFx0cmV0dXJuIFwic2NyaXB0XCI7XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gU3VwcG9ydDogU2FmYXJpIDggb25seVxuLy8gSW4gU2FmYXJpIDggZG9jdW1lbnRzIGNyZWF0ZWQgdmlhIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudFxuLy8gY29sbGFwc2Ugc2libGluZyBmb3JtczogdGhlIHNlY29uZCBvbmUgYmVjb21lcyBhIGNoaWxkIG9mIHRoZSBmaXJzdCBvbmUuXG4vLyBCZWNhdXNlIG9mIHRoYXQsIHRoaXMgc2VjdXJpdHkgbWVhc3VyZSBoYXMgdG8gYmUgZGlzYWJsZWQgaW4gU2FmYXJpIDguXG4vLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MzM3XG5zdXBwb3J0LmNyZWF0ZUhUTUxEb2N1bWVudCA9ICggZnVuY3Rpb24oKSB7XG5cdHZhciBib2R5ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCBcIlwiICkuYm9keTtcblx0Ym9keS5pbm5lckhUTUwgPSBcIjxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+XCI7XG5cdHJldHVybiBib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09PSAyO1xufSApKCk7XG5cblxuLy8gQXJndW1lbnQgXCJkYXRhXCIgc2hvdWxkIGJlIHN0cmluZyBvZiBodG1sXG4vLyBjb250ZXh0IChvcHRpb25hbCk6IElmIHNwZWNpZmllZCwgdGhlIGZyYWdtZW50IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGlzIGNvbnRleHQsXG4vLyBkZWZhdWx0cyB0byBkb2N1bWVudFxuLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZ1xualF1ZXJ5LnBhcnNlSFRNTCA9IGZ1bmN0aW9uKCBkYXRhLCBjb250ZXh0LCBrZWVwU2NyaXB0cyApIHtcblx0aWYgKCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gW107XG5cdH1cblx0aWYgKCB0eXBlb2YgY29udGV4dCA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0a2VlcFNjcmlwdHMgPSBjb250ZXh0O1xuXHRcdGNvbnRleHQgPSBmYWxzZTtcblx0fVxuXG5cdHZhciBiYXNlLCBwYXJzZWQsIHNjcmlwdHM7XG5cblx0aWYgKCAhY29udGV4dCApIHtcblxuXHRcdC8vIFN0b3Agc2NyaXB0cyBvciBpbmxpbmUgZXZlbnQgaGFuZGxlcnMgZnJvbSBiZWluZyBleGVjdXRlZCBpbW1lZGlhdGVseVxuXHRcdC8vIGJ5IHVzaW5nIGRvY3VtZW50LmltcGxlbWVudGF0aW9uXG5cdFx0aWYgKCBzdXBwb3J0LmNyZWF0ZUhUTUxEb2N1bWVudCApIHtcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIFwiXCIgKTtcblxuXHRcdFx0Ly8gU2V0IHRoZSBiYXNlIGhyZWYgZm9yIHRoZSBjcmVhdGVkIGRvY3VtZW50XG5cdFx0XHQvLyBzbyBhbnkgcGFyc2VkIGVsZW1lbnRzIHdpdGggVVJMc1xuXHRcdFx0Ly8gYXJlIGJhc2VkIG9uIHRoZSBkb2N1bWVudCdzIFVSTCAoZ2gtMjk2NSlcblx0XHRcdGJhc2UgPSBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiYmFzZVwiICk7XG5cdFx0XHRiYXNlLmhyZWYgPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmO1xuXHRcdFx0Y29udGV4dC5oZWFkLmFwcGVuZENoaWxkKCBiYXNlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudDtcblx0XHR9XG5cdH1cblxuXHRwYXJzZWQgPSByc2luZ2xlVGFnLmV4ZWMoIGRhdGEgKTtcblx0c2NyaXB0cyA9ICFrZWVwU2NyaXB0cyAmJiBbXTtcblxuXHQvLyBTaW5nbGUgdGFnXG5cdGlmICggcGFyc2VkICkge1xuXHRcdHJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdO1xuXHR9XG5cblx0cGFyc2VkID0gYnVpbGRGcmFnbWVudCggWyBkYXRhIF0sIGNvbnRleHQsIHNjcmlwdHMgKTtcblxuXHRpZiAoIHNjcmlwdHMgJiYgc2NyaXB0cy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5KCBzY3JpcHRzICkucmVtb3ZlKCk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgcGFyc2VkLmNoaWxkTm9kZXMgKTtcbn07XG5cblxuLyoqXG4gKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlXG4gKi9cbmpRdWVyeS5mbi5sb2FkID0gZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHtcblx0dmFyIHNlbGVjdG9yLCB0eXBlLCByZXNwb25zZSxcblx0XHRzZWxmID0gdGhpcyxcblx0XHRvZmYgPSB1cmwuaW5kZXhPZiggXCIgXCIgKTtcblxuXHRpZiAoIG9mZiA+IC0xICkge1xuXHRcdHNlbGVjdG9yID0gc3RyaXBBbmRDb2xsYXBzZSggdXJsLnNsaWNlKCBvZmYgKSApO1xuXHRcdHVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7XG5cdH1cblxuXHQvLyBJZiBpdCdzIGEgZnVuY3Rpb25cblx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcGFyYW1zICkgKSB7XG5cblx0XHQvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFja1xuXHRcdGNhbGxiYWNrID0gcGFyYW1zO1xuXHRcdHBhcmFtcyA9IHVuZGVmaW5lZDtcblxuXHQvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nXG5cdH0gZWxzZSBpZiAoIHBhcmFtcyAmJiB0eXBlb2YgcGFyYW1zID09PSBcIm9iamVjdFwiICkge1xuXHRcdHR5cGUgPSBcIlBPU1RcIjtcblx0fVxuXG5cdC8vIElmIHdlIGhhdmUgZWxlbWVudHMgdG8gbW9kaWZ5LCBtYWtlIHRoZSByZXF1ZXN0XG5cdGlmICggc2VsZi5sZW5ndGggPiAwICkge1xuXHRcdGpRdWVyeS5hamF4KCB7XG5cdFx0XHR1cmw6IHVybCxcblxuXHRcdFx0Ly8gSWYgXCJ0eXBlXCIgdmFyaWFibGUgaXMgdW5kZWZpbmVkLCB0aGVuIFwiR0VUXCIgbWV0aG9kIHdpbGwgYmUgdXNlZC5cblx0XHRcdC8vIE1ha2UgdmFsdWUgb2YgdGhpcyBmaWVsZCBleHBsaWNpdCBzaW5jZVxuXHRcdFx0Ly8gdXNlciBjYW4gb3ZlcnJpZGUgaXQgdGhyb3VnaCBhamF4U2V0dXAgbWV0aG9kXG5cdFx0XHR0eXBlOiB0eXBlIHx8IFwiR0VUXCIsXG5cdFx0XHRkYXRhVHlwZTogXCJodG1sXCIsXG5cdFx0XHRkYXRhOiBwYXJhbXNcblx0XHR9ICkuZG9uZSggZnVuY3Rpb24oIHJlc3BvbnNlVGV4dCApIHtcblxuXHRcdFx0Ly8gU2F2ZSByZXNwb25zZSBmb3IgdXNlIGluIGNvbXBsZXRlIGNhbGxiYWNrXG5cdFx0XHRyZXNwb25zZSA9IGFyZ3VtZW50cztcblxuXHRcdFx0c2VsZi5odG1sKCBzZWxlY3RvciA/XG5cblx0XHRcdFx0Ly8gSWYgYSBzZWxlY3RvciB3YXMgc3BlY2lmaWVkLCBsb2NhdGUgdGhlIHJpZ2h0IGVsZW1lbnRzIGluIGEgZHVtbXkgZGl2XG5cdFx0XHRcdC8vIEV4Y2x1ZGUgc2NyaXB0cyB0byBhdm9pZCBJRSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9yc1xuXHRcdFx0XHRqUXVlcnkoIFwiPGRpdj5cIiApLmFwcGVuZCggalF1ZXJ5LnBhcnNlSFRNTCggcmVzcG9uc2VUZXh0ICkgKS5maW5kKCBzZWxlY3RvciApIDpcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UgdXNlIHRoZSBmdWxsIHJlc3VsdFxuXHRcdFx0XHRyZXNwb25zZVRleHQgKTtcblxuXHRcdC8vIElmIHRoZSByZXF1ZXN0IHN1Y2NlZWRzLCB0aGlzIGZ1bmN0aW9uIGdldHMgXCJkYXRhXCIsIFwic3RhdHVzXCIsIFwianFYSFJcIlxuXHRcdC8vIGJ1dCB0aGV5IGFyZSBpZ25vcmVkIGJlY2F1c2UgcmVzcG9uc2Ugd2FzIHNldCBhYm92ZS5cblx0XHQvLyBJZiBpdCBmYWlscywgdGhpcyBmdW5jdGlvbiBnZXRzIFwianFYSFJcIiwgXCJzdGF0dXNcIiwgXCJlcnJvclwiXG5cdFx0fSApLmFsd2F5cyggY2FsbGJhY2sgJiYgZnVuY3Rpb24oIGpxWEhSLCBzdGF0dXMgKSB7XG5cdFx0XHRzZWxmLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRjYWxsYmFjay5hcHBseSggdGhpcywgcmVzcG9uc2UgfHwgWyBqcVhIUi5yZXNwb25zZVRleHQsIHN0YXR1cywganFYSFIgXSApO1xuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdHJldHVybiB0aGlzO1xufTtcblxuXG5cblxuLy8gQXR0YWNoIGEgYnVuY2ggb2YgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBjb21tb24gQUpBWCBldmVudHNcbmpRdWVyeS5lYWNoKCBbXG5cdFwiYWpheFN0YXJ0XCIsXG5cdFwiYWpheFN0b3BcIixcblx0XCJhamF4Q29tcGxldGVcIixcblx0XCJhamF4RXJyb3JcIixcblx0XCJhamF4U3VjY2Vzc1wiLFxuXHRcImFqYXhTZW5kXCJcbl0sIGZ1bmN0aW9uKCBpLCB0eXBlICkge1xuXHRqUXVlcnkuZm5bIHR5cGUgXSA9IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZSwgZm4gKTtcblx0fTtcbn0gKTtcblxuXG5cblxualF1ZXJ5LmV4cHIucHNldWRvcy5hbmltYXRlZCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4galF1ZXJ5LmdyZXAoIGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHtcblx0XHRyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTtcblx0fSApLmxlbmd0aDtcbn07XG5cblxuXG5cbi8qKlxuICogR2V0cyBhIHdpbmRvdyBmcm9tIGFuIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gZ2V0V2luZG93KCBlbGVtICkge1xuXHRyZXR1cm4galF1ZXJ5LmlzV2luZG93KCBlbGVtICkgPyBlbGVtIDogZWxlbS5ub2RlVHlwZSA9PT0gOSAmJiBlbGVtLmRlZmF1bHRWaWV3O1xufVxuXG5qUXVlcnkub2Zmc2V0ID0ge1xuXHRzZXRPZmZzZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBpICkge1xuXHRcdHZhciBjdXJQb3NpdGlvbiwgY3VyTGVmdCwgY3VyQ1NTVG9wLCBjdXJUb3AsIGN1ck9mZnNldCwgY3VyQ1NTTGVmdCwgY2FsY3VsYXRlUG9zaXRpb24sXG5cdFx0XHRwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApLFxuXHRcdFx0Y3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLFxuXHRcdFx0cHJvcHMgPSB7fTtcblxuXHRcdC8vIFNldCBwb3NpdGlvbiBmaXJzdCwgaW4tY2FzZSB0b3AvbGVmdCBhcmUgc2V0IGV2ZW4gb24gc3RhdGljIGVsZW1cblx0XHRpZiAoIHBvc2l0aW9uID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0ZWxlbS5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcblx0XHR9XG5cblx0XHRjdXJPZmZzZXQgPSBjdXJFbGVtLm9mZnNldCgpO1xuXHRcdGN1ckNTU1RvcCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwidG9wXCIgKTtcblx0XHRjdXJDU1NMZWZ0ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJsZWZ0XCIgKTtcblx0XHRjYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09IFwiYWJzb2x1dGVcIiB8fCBwb3NpdGlvbiA9PT0gXCJmaXhlZFwiICkgJiZcblx0XHRcdCggY3VyQ1NTVG9wICsgY3VyQ1NTTGVmdCApLmluZGV4T2YoIFwiYXV0b1wiICkgPiAtMTtcblxuXHRcdC8vIE5lZWQgdG8gYmUgYWJsZSB0byBjYWxjdWxhdGUgcG9zaXRpb24gaWYgZWl0aGVyXG5cdFx0Ly8gdG9wIG9yIGxlZnQgaXMgYXV0byBhbmQgcG9zaXRpb24gaXMgZWl0aGVyIGFic29sdXRlIG9yIGZpeGVkXG5cdFx0aWYgKCBjYWxjdWxhdGVQb3NpdGlvbiApIHtcblx0XHRcdGN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpO1xuXHRcdFx0Y3VyVG9wID0gY3VyUG9zaXRpb24udG9wO1xuXHRcdFx0Y3VyTGVmdCA9IGN1clBvc2l0aW9uLmxlZnQ7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyVG9wID0gcGFyc2VGbG9hdCggY3VyQ1NTVG9wICkgfHwgMDtcblx0XHRcdGN1ckxlZnQgPSBwYXJzZUZsb2F0KCBjdXJDU1NMZWZ0ICkgfHwgMDtcblx0XHR9XG5cblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7XG5cblx0XHRcdC8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KVxuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMuY2FsbCggZWxlbSwgaSwgalF1ZXJ5LmV4dGVuZCgge30sIGN1ck9mZnNldCApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDtcblx0XHR9XG5cdFx0aWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLmxlZnQgPSAoIG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0ICkgKyBjdXJMZWZ0O1xuXHRcdH1cblxuXHRcdGlmICggXCJ1c2luZ1wiIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0sIHByb3BzICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyRWxlbS5jc3MoIHByb3BzICk7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdG9mZnNldDogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBQcmVzZXJ2ZSBjaGFpbmluZyBmb3Igc2V0dGVyXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHRoaXMgOlxuXHRcdFx0XHR0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRcdGpRdWVyeS5vZmZzZXQuc2V0T2Zmc2V0KCB0aGlzLCBvcHRpb25zLCBpICk7XG5cdFx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHR2YXIgZG9jRWxlbSwgd2luLCByZWN0LCBkb2MsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0aWYgKCAhZWxlbSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0XHQvLyBSdW5uaW5nIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBvbiBhXG5cdFx0Ly8gZGlzY29ubmVjdGVkIG5vZGUgaW4gSUUgdGhyb3dzIGFuIGVycm9yXG5cdFx0aWYgKCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9O1xuXHRcdH1cblxuXHRcdHJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIGVsZW1lbnQgaXMgbm90IGhpZGRlbiAoZGlzcGxheTogbm9uZSlcblx0XHRpZiAoIHJlY3Qud2lkdGggfHwgcmVjdC5oZWlnaHQgKSB7XG5cdFx0XHRkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQ7XG5cdFx0XHR3aW4gPSBnZXRXaW5kb3coIGRvYyApO1xuXHRcdFx0ZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRvcDogcmVjdC50b3AgKyB3aW4ucGFnZVlPZmZzZXQgLSBkb2NFbGVtLmNsaWVudFRvcCxcblx0XHRcdFx0bGVmdDogcmVjdC5sZWZ0ICsgd2luLnBhZ2VYT2Zmc2V0IC0gZG9jRWxlbS5jbGllbnRMZWZ0XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiB6ZXJvcyBmb3IgZGlzY29ubmVjdGVkIGFuZCBoaWRkZW4gZWxlbWVudHMgKGdoLTIzMTApXG5cdFx0cmV0dXJuIHJlY3Q7XG5cdH0sXG5cblx0cG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggIXRoaXNbIDAgXSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0cGFyZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfTtcblxuXHRcdC8vIEZpeGVkIGVsZW1lbnRzIGFyZSBvZmZzZXQgZnJvbSB3aW5kb3cgKHBhcmVudE9mZnNldCA9IHt0b3A6MCwgbGVmdDogMH0sXG5cdFx0Ly8gYmVjYXVzZSBpdCBpcyBpdHMgb25seSBvZmZzZXQgcGFyZW50XG5cdFx0aWYgKCBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSA9PT0gXCJmaXhlZFwiICkge1xuXG5cdFx0XHQvLyBBc3N1bWUgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGlzIHRoZXJlIHdoZW4gY29tcHV0ZWQgcG9zaXRpb24gaXMgZml4ZWRcblx0XHRcdG9mZnNldCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBHZXQgKnJlYWwqIG9mZnNldFBhcmVudFxuXHRcdFx0b2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQoKTtcblxuXHRcdFx0Ly8gR2V0IGNvcnJlY3Qgb2Zmc2V0c1xuXHRcdFx0b2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTtcblx0XHRcdGlmICggIWpRdWVyeS5ub2RlTmFtZSggb2Zmc2V0UGFyZW50WyAwIF0sIFwiaHRtbFwiICkgKSB7XG5cdFx0XHRcdHBhcmVudE9mZnNldCA9IG9mZnNldFBhcmVudC5vZmZzZXQoKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIG9mZnNldFBhcmVudCBib3JkZXJzXG5cdFx0XHRwYXJlbnRPZmZzZXQgPSB7XG5cdFx0XHRcdHRvcDogcGFyZW50T2Zmc2V0LnRvcCArIGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudFsgMCBdLCBcImJvcmRlclRvcFdpZHRoXCIsIHRydWUgKSxcblx0XHRcdFx0bGVmdDogcGFyZW50T2Zmc2V0LmxlZnQgKyBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnRbIDAgXSwgXCJib3JkZXJMZWZ0V2lkdGhcIiwgdHJ1ZSApXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIFN1YnRyYWN0IHBhcmVudCBvZmZzZXRzIGFuZCBlbGVtZW50IG1hcmdpbnNcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBvZmZzZXQudG9wIC0gcGFyZW50T2Zmc2V0LnRvcCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luVG9wXCIsIHRydWUgKSxcblx0XHRcdGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCBcIm1hcmdpbkxlZnRcIiwgdHJ1ZSApXG5cdFx0fTtcblx0fSxcblxuXHQvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBkb2N1bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczpcblx0Ly8gMSkgRm9yIHRoZSBlbGVtZW50IGluc2lkZSB0aGUgaWZyYW1lIHdpdGhvdXQgb2Zmc2V0UGFyZW50LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVyblxuXHQvLyAgICBkb2N1bWVudEVsZW1lbnQgb2YgdGhlIHBhcmVudCB3aW5kb3dcblx0Ly8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudFxuXHQvLyAzKSBGb3IgYm9keSBvciBodG1sIGVsZW1lbnQsIGkuZS4gaW4gY2FzZSBvZiB0aGUgaHRtbCBub2RlIC0gaXQgd2lsbCByZXR1cm4gaXRzZWxmXG5cdC8vXG5cdC8vIGJ1dCB0aG9zZSBleGNlcHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlc1xuXHQvLyBhbmQgbWlnaHQgYmUgY29uc2lkZXJlZCBhcyBtb3JlIHByZWZlcmFibGUgcmVzdWx0cy5cblx0Ly9cblx0Ly8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmVcblx0b2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50O1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldFBhcmVudCAmJiBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwicG9zaXRpb25cIiApID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0XHRvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50RWxlbWVudDtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzXG5qUXVlcnkuZWFjaCggeyBzY3JvbGxMZWZ0OiBcInBhZ2VYT2Zmc2V0XCIsIHNjcm9sbFRvcDogXCJwYWdlWU9mZnNldFwiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7XG5cdHZhciB0b3AgPSBcInBhZ2VZT2Zmc2V0XCIgPT09IHByb3A7XG5cblx0alF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkge1xuXHRcdFx0dmFyIHdpbiA9IGdldFdpbmRvdyggZWxlbSApO1xuXG5cdFx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB3aW4gKSB7XG5cdFx0XHRcdHdpbi5zY3JvbGxUbyhcblx0XHRcdFx0XHQhdG9wID8gdmFsIDogd2luLnBhZ2VYT2Zmc2V0LFxuXHRcdFx0XHRcdHRvcCA/IHZhbCA6IHdpbi5wYWdlWU9mZnNldFxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtWyBtZXRob2QgXSA9IHZhbDtcblx0XHRcdH1cblx0XHR9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9O1xufSApO1xuXG4vLyBTdXBwb3J0OiBTYWZhcmkgPD03IC0gOS4xLCBDaHJvbWUgPD0zNyAtIDQ5XG4vLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvblxuLy8gV2Via2l0IGJ1ZzogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDg0XG4vLyBCbGluayBidWc6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTU4OTM0N1xuLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDtcbi8vIHJhdGhlciB0aGFuIG1ha2UgdGhlIGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRoZSBvZmZzZXQgbW9kdWxlLCBqdXN0IGNoZWNrIGZvciBpdCBoZXJlXG5qUXVlcnkuZWFjaCggWyBcInRvcFwiLCBcImxlZnRcIiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucGl4ZWxQb3NpdGlvbixcblx0XHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0XHRjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApO1xuXG5cdFx0XHRcdC8vIElmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldFxuXHRcdFx0XHRyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHByb3AgXSArIFwicHhcIiA6XG5cdFx0XHRcdFx0Y29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufSApO1xuXG5cbi8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiBcImhlaWdodFwiLCBXaWR0aDogXCJ3aWR0aFwiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkge1xuXHRqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiBcImlubmVyXCIgKyBuYW1lLCBjb250ZW50OiB0eXBlLCBcIlwiOiBcIm91dGVyXCIgKyBuYW1lIH0sXG5cdFx0ZnVuY3Rpb24oIGRlZmF1bHRFeHRyYSwgZnVuY05hbWUgKSB7XG5cblx0XHQvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGhcblx0XHRqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHtcblx0XHRcdHZhciBjaGFpbmFibGUgPSBhcmd1bWVudHMubGVuZ3RoICYmICggZGVmYXVsdEV4dHJhIHx8IHR5cGVvZiBtYXJnaW4gIT09IFwiYm9vbGVhblwiICksXG5cdFx0XHRcdGV4dHJhID0gZGVmYXVsdEV4dHJhIHx8ICggbWFyZ2luID09PSB0cnVlIHx8IHZhbHVlID09PSB0cnVlID8gXCJtYXJnaW5cIiA6IFwiYm9yZGVyXCIgKTtcblxuXHRcdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIHR5cGUsIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgZG9jO1xuXG5cdFx0XHRcdGlmICggalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyAkKCB3aW5kb3cgKS5vdXRlcldpZHRoL0hlaWdodCByZXR1cm4gdy9oIGluY2x1ZGluZyBzY3JvbGxiYXJzIChnaC0xNzI5KVxuXHRcdFx0XHRcdHJldHVybiBmdW5jTmFtZS5pbmRleE9mKCBcIm91dGVyXCIgKSA9PT0gMCA/XG5cdFx0XHRcdFx0XHRlbGVtWyBcImlubmVyXCIgKyBuYW1lIF0gOlxuXHRcdFx0XHRcdFx0ZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIFwiY2xpZW50XCIgKyBuYW1lIF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBHZXQgZG9jdW1lbnQgd2lkdGggb3IgaGVpZ2h0XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDtcblxuXHRcdFx0XHRcdC8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSBvciBjbGllbnRbV2lkdGgvSGVpZ2h0XSxcblx0XHRcdFx0XHQvLyB3aGljaGV2ZXIgaXMgZ3JlYXRlc3Rcblx0XHRcdFx0XHRyZXR1cm4gTWF0aC5tYXgoXG5cdFx0XHRcdFx0XHRlbGVtLmJvZHlbIFwic2Nyb2xsXCIgKyBuYW1lIF0sIGRvY1sgXCJzY3JvbGxcIiArIG5hbWUgXSxcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJvZmZzZXRcIiArIG5hbWUgXSwgZG9jWyBcIm9mZnNldFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZG9jWyBcImNsaWVudFwiICsgbmFtZSBdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID9cblxuXHRcdFx0XHRcdC8vIEdldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQsIHJlcXVlc3RpbmcgYnV0IG5vdCBmb3JjaW5nIHBhcnNlRmxvYXRcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCB0eXBlLCBleHRyYSApIDpcblxuXHRcdFx0XHRcdC8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnRcblx0XHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApO1xuXHRcdFx0fSwgdHlwZSwgY2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFpbmFibGUgKTtcblx0XHR9O1xuXHR9ICk7XG59ICk7XG5cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdGJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub2ZmKCB0eXBlcywgbnVsbCwgZm4gKTtcblx0fSxcblxuXHRkZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0dW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7XG5cblx0XHQvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApXG5cdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgP1xuXHRcdFx0dGhpcy5vZmYoIHNlbGVjdG9yLCBcIioqXCIgKSA6XG5cdFx0XHR0aGlzLm9mZiggdHlwZXMsIHNlbGVjdG9yIHx8IFwiKipcIiwgZm4gKTtcblx0fVxufSApO1xuXG5qUXVlcnkucGFyc2VKU09OID0gSlNPTi5wYXJzZTtcblxuXG5cblxuLy8gUmVnaXN0ZXIgYXMgYSBuYW1lZCBBTUQgbW9kdWxlLCBzaW5jZSBqUXVlcnkgY2FuIGJlIGNvbmNhdGVuYXRlZCB3aXRoIG90aGVyXG4vLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0XG4vLyB1bmRlcnN0YW5kcyBhbm9ueW1vdXMgQU1EIG1vZHVsZXMuIEEgbmFtZWQgQU1EIGlzIHNhZmVzdCBhbmQgbW9zdCByb2J1c3Rcbi8vIHdheSB0byByZWdpc3Rlci4gTG93ZXJjYXNlIGpxdWVyeSBpcyB1c2VkIGJlY2F1c2UgQU1EIG1vZHVsZSBuYW1lcyBhcmVcbi8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZVxuLy8gZmlsZSBuYW1lLiBEbyB0aGlzIGFmdGVyIGNyZWF0aW5nIHRoZSBnbG9iYWwgc28gdGhhdCBpZiBhbiBBTUQgbW9kdWxlIHdhbnRzXG4vLyB0byBjYWxsIG5vQ29uZmxpY3QgdG8gaGlkZSB0aGlzIHZlcnNpb24gb2YgalF1ZXJ5LCBpdCB3aWxsIHdvcmsuXG5cbi8vIE5vdGUgdGhhdCBmb3IgbWF4aW11bSBwb3J0YWJpbGl0eSwgbGlicmFyaWVzIHRoYXQgYXJlIG5vdCBqUXVlcnkgc2hvdWxkXG4vLyBkZWNsYXJlIHRoZW1zZWx2ZXMgYXMgYW5vbnltb3VzIG1vZHVsZXMsIGFuZCBhdm9pZCBzZXR0aW5nIGEgZ2xvYmFsIGlmIGFuXG4vLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVyeSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2pyYnVya2UvcmVxdWlyZWpzL3dpa2kvVXBkYXRpbmctZXhpc3RpbmctbGlicmFyaWVzI3dpa2ktYW5vblxuXG5pZiAoIHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kICkge1xuXHRkZWZpbmUoIFwianF1ZXJ5XCIsIFtdLCBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4galF1ZXJ5O1xuXHR9ICk7XG59XG5cblxuXG5cbnZhclxuXG5cdC8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuXHRfalF1ZXJ5ID0gd2luZG93LmpRdWVyeSxcblxuXHQvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuXHRfJCA9IHdpbmRvdy4kO1xuXG5qUXVlcnkubm9Db25mbGljdCA9IGZ1bmN0aW9uKCBkZWVwICkge1xuXHRpZiAoIHdpbmRvdy4kID09PSBqUXVlcnkgKSB7XG5cdFx0d2luZG93LiQgPSBfJDtcblx0fVxuXG5cdGlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBqUXVlcnkgKSB7XG5cdFx0d2luZG93LmpRdWVyeSA9IF9qUXVlcnk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5O1xufTtcblxuLy8gRXhwb3NlIGpRdWVyeSBhbmQgJCBpZGVudGlmaWVycywgZXZlbiBpbiBBTURcbi8vICgjNzEwMiNjb21tZW50OjEwLCBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzU1Nylcbi8vIGFuZCBDb21tb25KUyBmb3IgYnJvd3NlciBlbXVsYXRvcnMgKCMxMzU2NilcbmlmICggIW5vR2xvYmFsICkge1xuXHR3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQgPSBqUXVlcnk7XG59XG5cblxuXG5cblxucmV0dXJuIGpRdWVyeTtcbn0gKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9qcXVlcnkvZGlzdC9qcXVlcnkuanNcbi8vIG1vZHVsZSBpZCA9IDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 4 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _Account = __webpack_require__(5);var _Account2 = _interopRequireDefault(_Account);\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _Admin = __webpack_require__(7);var _Admin2 = _interopRequireDefault(_Admin);\nvar _AutoLayout = __webpack_require__(8);var _AutoLayout2 = _interopRequireDefault(_AutoLayout);\nvar _Cable = __webpack_require__(9);var _Cable2 = _interopRequireDefault(_Cable);\nvar _Control = __webpack_require__(27);var _Control2 = _interopRequireDefault(_Control);\nvar _Create = __webpack_require__(173);var _Create2 = _interopRequireDefault(_Create);\nvar _DataModel = __webpack_require__(149);var _DataModel2 = _interopRequireDefault(_DataModel);\nvar _Debug = __webpack_require__(622);var _Debug2 = _interopRequireDefault(_Debug);\nvar _Engine = __webpack_require__(150);var _Engine2 = _interopRequireDefault(_Engine);\nvar _Filter = __webpack_require__(356);var _Filter2 = _interopRequireDefault(_Filter);\nvar _GlobalUI = __webpack_require__(362);var _GlobalUI2 = _interopRequireDefault(_GlobalUI);\n\n\n\nvar _Import = __webpack_require__(579);var _Import2 = _interopRequireDefault(_Import);\nvar _JIT = __webpack_require__(355);var _JIT2 = _interopRequireDefault(_JIT);\nvar _Listeners = __webpack_require__(623);var _Listeners2 = _interopRequireDefault(_Listeners);\nvar _Loading = __webpack_require__(368);var _Loading2 = _interopRequireDefault(_Loading);\nvar _Map = __webpack_require__(369);var _Map2 = _interopRequireDefault(_Map);\nvar _Mapper = __webpack_require__(434);var _Mapper2 = _interopRequireDefault(_Mapper);\nvar _Mobile = __webpack_require__(624);var _Mobile2 = _interopRequireDefault(_Mobile);\nvar _Mouse = __webpack_require__(352);var _Mouse2 = _interopRequireDefault(_Mouse);\nvar _Organize = __webpack_require__(625);var _Organize2 = _interopRequireDefault(_Organize);\nvar _PasteInput = __webpack_require__(578);var _PasteInput2 = _interopRequireDefault(_PasteInput);\nvar _Realtime = __webpack_require__(435);var _Realtime2 = _interopRequireDefault(_Realtime);\nvar _Router = __webpack_require__(367);var _Router2 = _interopRequireDefault(_Router);\nvar _Selected = __webpack_require__(353);var _Selected2 = _interopRequireDefault(_Selected);\nvar _Settings = __webpack_require__(572);var _Settings2 = _interopRequireDefault(_Settings);\nvar _Synapse = __webpack_require__(354);var _Synapse2 = _interopRequireDefault(_Synapse);\nvar _SynapseCard = __webpack_require__(569);var _SynapseCard2 = _interopRequireDefault(_SynapseCard);\nvar _Topic = __webpack_require__(571);var _Topic2 = _interopRequireDefault(_Topic);\nvar _TopicCard = __webpack_require__(566);var _TopicCard2 = _interopRequireDefault(_TopicCard);\nvar _Util = __webpack_require__(410);var _Util2 = _interopRequireDefault(_Util);\nvar _Views = __webpack_require__(541);var _Views2 = _interopRequireDefault(_Views);\nvar _Visualize = __webpack_require__(561);var _Visualize2 = _interopRequireDefault(_Visualize);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}\n\nvar Metamaps = window.Metamaps || {};\nMetamaps.Account = _Account2.default;\nMetamaps.Active = _Active2.default;\nMetamaps.Admin = _Admin2.default;\nMetamaps.AutoLayout = _AutoLayout2.default;\nMetamaps.Cable = _Cable2.default;\nMetamaps.Control = _Control2.default;\nMetamaps.Create = _Create2.default;\nMetamaps.DataModel = _DataModel2.default;\nMetamaps.Debug = _Debug2.default;\nMetamaps.Engine = _Engine2.default;\nMetamaps.Filter = _Filter2.default;\nMetamaps.GlobalUI = _GlobalUI2.default;\nMetamaps.GlobalUI.Search = _GlobalUI.Search;\nMetamaps.GlobalUI.CreateMap = _GlobalUI.CreateMap;\nMetamaps.GlobalUI.Account = _GlobalUI.Account;\nMetamaps.GlobalUI.ImportDialog = _GlobalUI.ImportDialog;\nMetamaps.GlobalUI.NotificationIcon = _GlobalUI.NotificationIcon;\nMetamaps.Import = _Import2.default;\nMetamaps.JIT = _JIT2.default;\nMetamaps.Listeners = _Listeners2.default;\nMetamaps.Loading = _Loading2.default;\nMetamaps.Map = _Map2.default;\nMetamaps.Map.CheatSheet = _Map.CheatSheet;\nMetamaps.Map.InfoBox = _Map.InfoBox;\nMetamaps.Maps = {};\nMetamaps.Mapper = _Mapper2.default;\nMetamaps.Mobile = _Mobile2.default;\nMetamaps.Mouse = _Mouse2.default;\nMetamaps.Organize = _Organize2.default;\nMetamaps.PasteInput = _PasteInput2.default;\nMetamaps.Realtime = _Realtime2.default;\nMetamaps.Router = _Router2.default;\nMetamaps.Selected = _Selected2.default;\nMetamaps.Settings = _Settings2.default;\nMetamaps.Synapse = _Synapse2.default;\nMetamaps.SynapseCard = _SynapseCard2.default;\nMetamaps.Topic = _Topic2.default;\nMetamaps.TopicCard = _TopicCard2.default;\nMetamaps.Util = _Util2.default;\nMetamaps.Views = _Views2.default;\nMetamaps.Visualize = _Visualize2.default;\n\ndocument.addEventListener('DOMContentLoaded', function () {\n  // initialize all the modules\n  for (var prop in Metamaps) {\n    // this runs the init function within each sub-object on the Metamaps one\n    if (Metamaps.hasOwnProperty(prop) &&\n    Metamaps[prop] != null &&\n    Metamaps[prop].hasOwnProperty('init') &&\n    typeof Metamaps[prop].init === 'function')\n    {\n      Metamaps[prop].init(Metamaps.ServerData);\n    }\n  }\n  // load whichever page you are on\n  if (Metamaps.currentSection === 'explore') {\n    var capitalize = Metamaps.currentPage.charAt(0).toUpperCase() + Metamaps.currentPage.slice(1);\n\n    _Views2.default.ExploreMaps.setCollection(_DataModel2.default.Maps[capitalize]);\n    if (Metamaps.currentPage === 'mapper') {\n      _Views2.default.ExploreMaps.fetchUserThenRender();\n    } else {\n      _Views2.default.ExploreMaps.render();\n    }\n    _GlobalUI2.default.showDiv('#explore');\n  } else if (Metamaps.currentSection === '' && _Active2.default.Mapper) {\n    _Views2.default.ExploreMaps.setCollection(_DataModel2.default.Maps.Active);\n    _Views2.default.ExploreMaps.render();\n    _GlobalUI2.default.showDiv('#explore');\n  } else if (_Active2.default.Map || _Active2.default.Topic) {\n    _Loading2.default.show();\n    _JIT2.default.prepareVizData();\n    _GlobalUI2.default.showDiv('#infovis');\n  }\n});exports.default =\n\nMetamaps;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNC5qcyIsInNvdXJjZXMiOlsiZnJvbnRlbmQvc3JjL01ldGFtYXBzL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBBY2NvdW50IGZyb20gJy4vQWNjb3VudCdcbmltcG9ydCBBY3RpdmUgZnJvbSAnLi9BY3RpdmUnXG5pbXBvcnQgQWRtaW4gZnJvbSAnLi9BZG1pbidcbmltcG9ydCBBdXRvTGF5b3V0IGZyb20gJy4vQXV0b0xheW91dCdcbmltcG9ydCBDYWJsZSBmcm9tICcuL0NhYmxlJ1xuaW1wb3J0IENvbnRyb2wgZnJvbSAnLi9Db250cm9sJ1xuaW1wb3J0IENyZWF0ZSBmcm9tICcuL0NyZWF0ZSdcbmltcG9ydCBEYXRhTW9kZWwgZnJvbSAnLi9EYXRhTW9kZWwnXG5pbXBvcnQgRGVidWcgZnJvbSAnLi9EZWJ1ZydcbmltcG9ydCBFbmdpbmUgZnJvbSAnLi9FbmdpbmUnXG5pbXBvcnQgRmlsdGVyIGZyb20gJy4vRmlsdGVyJ1xuaW1wb3J0IEdsb2JhbFVJLCB7XG4gIFNlYXJjaCwgQ3JlYXRlTWFwLCBJbXBvcnREaWFsb2csIEFjY291bnQgYXMgR2xvYmFsVUlBY2NvdW50LFxuICBOb3RpZmljYXRpb25JY29uXG59IGZyb20gJy4vR2xvYmFsVUknXG5pbXBvcnQgSW1wb3J0IGZyb20gJy4vSW1wb3J0J1xuaW1wb3J0IEpJVCBmcm9tICcuL0pJVCdcbmltcG9ydCBMaXN0ZW5lcnMgZnJvbSAnLi9MaXN0ZW5lcnMnXG5pbXBvcnQgTG9hZGluZyBmcm9tICcuL0xvYWRpbmcnXG5pbXBvcnQgTWFwLCB7IENoZWF0U2hlZXQsIEluZm9Cb3ggfSBmcm9tICcuL01hcCdcbmltcG9ydCBNYXBwZXIgZnJvbSAnLi9NYXBwZXInXG5pbXBvcnQgTW9iaWxlIGZyb20gJy4vTW9iaWxlJ1xuaW1wb3J0IE1vdXNlIGZyb20gJy4vTW91c2UnXG5pbXBvcnQgT3JnYW5pemUgZnJvbSAnLi9Pcmdhbml6ZSdcbmltcG9ydCBQYXN0ZUlucHV0IGZyb20gJy4vUGFzdGVJbnB1dCdcbmltcG9ydCBSZWFsdGltZSBmcm9tICcuL1JlYWx0aW1lJ1xuaW1wb3J0IFJvdXRlciBmcm9tICcuL1JvdXRlcidcbmltcG9ydCBTZWxlY3RlZCBmcm9tICcuL1NlbGVjdGVkJ1xuaW1wb3J0IFNldHRpbmdzIGZyb20gJy4vU2V0dGluZ3MnXG5pbXBvcnQgU3luYXBzZSBmcm9tICcuL1N5bmFwc2UnXG5pbXBvcnQgU3luYXBzZUNhcmQgZnJvbSAnLi9TeW5hcHNlQ2FyZCdcbmltcG9ydCBUb3BpYyBmcm9tICcuL1RvcGljJ1xuaW1wb3J0IFRvcGljQ2FyZCBmcm9tICcuL1RvcGljQ2FyZCdcbmltcG9ydCBVdGlsIGZyb20gJy4vVXRpbCdcbmltcG9ydCBWaWV3cyBmcm9tICcuL1ZpZXdzJ1xuaW1wb3J0IFZpc3VhbGl6ZSBmcm9tICcuL1Zpc3VhbGl6ZSdcblxuY29uc3QgTWV0YW1hcHMgPSB3aW5kb3cuTWV0YW1hcHMgfHwge31cbk1ldGFtYXBzLkFjY291bnQgPSBBY2NvdW50XG5NZXRhbWFwcy5BY3RpdmUgPSBBY3RpdmVcbk1ldGFtYXBzLkFkbWluID0gQWRtaW5cbk1ldGFtYXBzLkF1dG9MYXlvdXQgPSBBdXRvTGF5b3V0XG5NZXRhbWFwcy5DYWJsZSA9IENhYmxlXG5NZXRhbWFwcy5Db250cm9sID0gQ29udHJvbFxuTWV0YW1hcHMuQ3JlYXRlID0gQ3JlYXRlXG5NZXRhbWFwcy5EYXRhTW9kZWwgPSBEYXRhTW9kZWxcbk1ldGFtYXBzLkRlYnVnID0gRGVidWdcbk1ldGFtYXBzLkVuZ2luZSA9IEVuZ2luZVxuTWV0YW1hcHMuRmlsdGVyID0gRmlsdGVyXG5NZXRhbWFwcy5HbG9iYWxVSSA9IEdsb2JhbFVJXG5NZXRhbWFwcy5HbG9iYWxVSS5TZWFyY2ggPSBTZWFyY2hcbk1ldGFtYXBzLkdsb2JhbFVJLkNyZWF0ZU1hcCA9IENyZWF0ZU1hcFxuTWV0YW1hcHMuR2xvYmFsVUkuQWNjb3VudCA9IEdsb2JhbFVJQWNjb3VudFxuTWV0YW1hcHMuR2xvYmFsVUkuSW1wb3J0RGlhbG9nID0gSW1wb3J0RGlhbG9nXG5NZXRhbWFwcy5HbG9iYWxVSS5Ob3RpZmljYXRpb25JY29uID0gTm90aWZpY2F0aW9uSWNvblxuTWV0YW1hcHMuSW1wb3J0ID0gSW1wb3J0XG5NZXRhbWFwcy5KSVQgPSBKSVRcbk1ldGFtYXBzLkxpc3RlbmVycyA9IExpc3RlbmVyc1xuTWV0YW1hcHMuTG9hZGluZyA9IExvYWRpbmdcbk1ldGFtYXBzLk1hcCA9IE1hcFxuTWV0YW1hcHMuTWFwLkNoZWF0U2hlZXQgPSBDaGVhdFNoZWV0XG5NZXRhbWFwcy5NYXAuSW5mb0JveCA9IEluZm9Cb3hcbk1ldGFtYXBzLk1hcHMgPSB7fVxuTWV0YW1hcHMuTWFwcGVyID0gTWFwcGVyXG5NZXRhbWFwcy5Nb2JpbGUgPSBNb2JpbGVcbk1ldGFtYXBzLk1vdXNlID0gTW91c2Vcbk1ldGFtYXBzLk9yZ2FuaXplID0gT3JnYW5pemVcbk1ldGFtYXBzLlBhc3RlSW5wdXQgPSBQYXN0ZUlucHV0XG5NZXRhbWFwcy5SZWFsdGltZSA9IFJlYWx0aW1lXG5NZXRhbWFwcy5Sb3V0ZXIgPSBSb3V0ZXJcbk1ldGFtYXBzLlNlbGVjdGVkID0gU2VsZWN0ZWRcbk1ldGFtYXBzLlNldHRpbmdzID0gU2V0dGluZ3Ncbk1ldGFtYXBzLlN5bmFwc2UgPSBTeW5hcHNlXG5NZXRhbWFwcy5TeW5hcHNlQ2FyZCA9IFN5bmFwc2VDYXJkXG5NZXRhbWFwcy5Ub3BpYyA9IFRvcGljXG5NZXRhbWFwcy5Ub3BpY0NhcmQgPSBUb3BpY0NhcmRcbk1ldGFtYXBzLlV0aWwgPSBVdGlsXG5NZXRhbWFwcy5WaWV3cyA9IFZpZXdzXG5NZXRhbWFwcy5WaXN1YWxpemUgPSBWaXN1YWxpemVcblxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xuICAvLyBpbml0aWFsaXplIGFsbCB0aGUgbW9kdWxlc1xuICBmb3IgKGNvbnN0IHByb3AgaW4gTWV0YW1hcHMpIHtcbiAgICAvLyB0aGlzIHJ1bnMgdGhlIGluaXQgZnVuY3Rpb24gd2l0aGluIGVhY2ggc3ViLW9iamVjdCBvbiB0aGUgTWV0YW1hcHMgb25lXG4gICAgaWYgKE1ldGFtYXBzLmhhc093blByb3BlcnR5KHByb3ApICYmXG4gICAgICBNZXRhbWFwc1twcm9wXSAhPSBudWxsICYmXG4gICAgICBNZXRhbWFwc1twcm9wXS5oYXNPd25Qcm9wZXJ0eSgnaW5pdCcpICYmXG4gICAgICB0eXBlb2YgKE1ldGFtYXBzW3Byb3BdLmluaXQpID09PSAnZnVuY3Rpb24nXG4gICAgKSB7XG4gICAgICBNZXRhbWFwc1twcm9wXS5pbml0KE1ldGFtYXBzLlNlcnZlckRhdGEpXG4gICAgfVxuICB9XG4gIC8vIGxvYWQgd2hpY2hldmVyIHBhZ2UgeW91IGFyZSBvblxuICBpZiAoTWV0YW1hcHMuY3VycmVudFNlY3Rpb24gPT09ICdleHBsb3JlJykge1xuICAgIGNvbnN0IGNhcGl0YWxpemUgPSBNZXRhbWFwcy5jdXJyZW50UGFnZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIE1ldGFtYXBzLmN1cnJlbnRQYWdlLnNsaWNlKDEpXG5cbiAgICBWaWV3cy5FeHBsb3JlTWFwcy5zZXRDb2xsZWN0aW9uKERhdGFNb2RlbC5NYXBzW2NhcGl0YWxpemVdKVxuICAgIGlmIChNZXRhbWFwcy5jdXJyZW50UGFnZSA9PT0gJ21hcHBlcicpIHtcbiAgICAgIFZpZXdzLkV4cGxvcmVNYXBzLmZldGNoVXNlclRoZW5SZW5kZXIoKVxuICAgIH0gZWxzZSB7XG4gICAgICBWaWV3cy5FeHBsb3JlTWFwcy5yZW5kZXIoKVxuICAgIH1cbiAgICBHbG9iYWxVSS5zaG93RGl2KCcjZXhwbG9yZScpXG4gIH0gZWxzZSBpZiAoTWV0YW1hcHMuY3VycmVudFNlY3Rpb24gPT09ICcnICYmIEFjdGl2ZS5NYXBwZXIpIHtcbiAgICBWaWV3cy5FeHBsb3JlTWFwcy5zZXRDb2xsZWN0aW9uKERhdGFNb2RlbC5NYXBzLkFjdGl2ZSlcbiAgICBWaWV3cy5FeHBsb3JlTWFwcy5yZW5kZXIoKVxuICAgIEdsb2JhbFVJLnNob3dEaXYoJyNleHBsb3JlJylcbiAgfSBlbHNlIGlmIChBY3RpdmUuTWFwIHx8IEFjdGl2ZS5Ub3BpYykge1xuICAgIExvYWRpbmcuc2hvdygpXG4gICAgSklULnByZXBhcmVWaXpEYXRhKClcbiAgICBHbG9iYWxVSS5zaG93RGl2KCcjaW5mb3ZpcycpXG4gIH1cbn0pXG5cbmV4cG9ydCBkZWZhdWx0IE1ldGFtYXBzXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL01ldGFtYXBzL2luZGV4LmpzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 5 */
/***/ function(module, exports) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true }); /* global $, CanvasLoader */\n\nvar Account = {\n  init: function init(serverData) {\n    Account.userIconUrl = serverData['user.png'];\n  },\n  listenersInitialized: false,\n  userIconUrl: null,\n  initListeners: function initListeners() {\n    var self = Account;\n\n    $('#user_image').change(self.showImagePreview);\n    self.listenersInitialized = true;\n  },\n  toggleChangePicture: function toggleChangePicture() {\n    var self = Account;\n\n    $('.userImageMenu').toggle();\n    if (!self.listenersInitialized) self.initListeners();\n  },\n  openChangePicture: function openChangePicture() {\n    var self = Account;\n\n    $('.userImageMenu').show();\n    if (!self.listenersInitialized) self.initListeners();\n  },\n  closeChangePicture: function closeChangePicture() {\n    $('.userImageMenu').hide();\n  },\n  showLoading: function showLoading() {\n    var loader = new CanvasLoader('accountPageLoading');\n    loader.setColor('#4FC059'); // default is '#000000'\n    loader.setDiameter(28); // default is 40\n    loader.setDensity(41); // default is 40\n    loader.setRange(0.9); // default is 1.3\n    loader.show(); // Hidden by default\n    $('#accountPageLoading').show();\n  },\n  showImagePreview: function showImagePreview() {\n    var file = $('#user_image')[0].files[0];\n\n    var reader = new window.FileReader();\n\n    reader.onload = function (e) {\n      var $canvas = $('<canvas>').attr({\n        width: 84,\n        height: 84 });\n\n      var context = $canvas[0].getContext('2d');\n      var imageObj = new window.Image();\n\n      imageObj.onload = function () {\n        $('.userImageDiv canvas').remove();\n        $('.userImageDiv img').hide();\n\n        var imgWidth = imageObj.width;\n        var imgHeight = imageObj.height;\n\n        var dimensionToMatch = imgWidth > imgHeight ? imgHeight : imgWidth;\n        // draw cropped image\n        var nonZero = Math.abs(imgHeight - imgWidth) / 2;\n        var sourceX = dimensionToMatch === imgWidth ? 0 : nonZero;\n        var sourceY = dimensionToMatch === imgHeight ? 0 : nonZero;\n        var sourceWidth = dimensionToMatch;\n        var sourceHeight = dimensionToMatch;\n        var destX = 0;\n        var destY = 0;\n        var destWidth = 84;\n        var destHeight = 84;\n\n        context.drawImage(imageObj, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight);\n        $('.userImageDiv').prepend($canvas);\n      };\n      imageObj.src = reader.result;\n    };\n\n    if (file) {\n      reader.readAsDataURL(file);\n      $('.userImageMenu').hide();\n      $('#remove_image').val('0');\n    }\n  },\n  removePicture: function removePicture() {\n    var self = Account;\n\n    $('.userImageDiv canvas').remove();\n    $('.userImageDiv img').attr('src', self.userIconUrl).show();\n    $('.userImageMenu').hide();\n\n    var input = $('#user_image');\n    input.replaceWith(input.val('').clone(true));\n    $('#remove_image').val('1');\n  },\n  changeName: function changeName() {\n    $('.accountName').hide();\n    $('.changeName').show();\n  },\n  showPass: function showPass() {\n    $('.toHide').show();\n    $('.changePass').hide();\n  },\n  hidePass: function hidePass() {\n    $('.toHide').hide();\n    $('.changePass').show();\n\n    $('#current_password').val('');\n    $('#user_password').val('');\n    $('#user_password_confirmation').val('');\n  } };exports.default =\n\n\nAccount;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNS5qcyIsInNvdXJjZXMiOlsiZnJvbnRlbmQvc3JjL01ldGFtYXBzL0FjY291bnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsICQsIENhbnZhc0xvYWRlciAqL1xuXG5jb25zdCBBY2NvdW50ID0ge1xuICBpbml0OiBmdW5jdGlvbihzZXJ2ZXJEYXRhKSB7XG4gICAgQWNjb3VudC51c2VySWNvblVybCA9IHNlcnZlckRhdGFbJ3VzZXIucG5nJ11cbiAgfSxcbiAgbGlzdGVuZXJzSW5pdGlhbGl6ZWQ6IGZhbHNlLFxuICB1c2VySWNvblVybDogbnVsbCxcbiAgaW5pdExpc3RlbmVyczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSBBY2NvdW50XG5cbiAgICAkKCcjdXNlcl9pbWFnZScpLmNoYW5nZShzZWxmLnNob3dJbWFnZVByZXZpZXcpXG4gICAgc2VsZi5saXN0ZW5lcnNJbml0aWFsaXplZCA9IHRydWVcbiAgfSxcbiAgdG9nZ2xlQ2hhbmdlUGljdHVyZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSBBY2NvdW50XG5cbiAgICAkKCcudXNlckltYWdlTWVudScpLnRvZ2dsZSgpXG4gICAgaWYgKCFzZWxmLmxpc3RlbmVyc0luaXRpYWxpemVkKSBzZWxmLmluaXRMaXN0ZW5lcnMoKVxuICB9LFxuICBvcGVuQ2hhbmdlUGljdHVyZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSBBY2NvdW50XG5cbiAgICAkKCcudXNlckltYWdlTWVudScpLnNob3coKVxuICAgIGlmICghc2VsZi5saXN0ZW5lcnNJbml0aWFsaXplZCkgc2VsZi5pbml0TGlzdGVuZXJzKClcbiAgfSxcbiAgY2xvc2VDaGFuZ2VQaWN0dXJlOiBmdW5jdGlvbigpIHtcbiAgICAkKCcudXNlckltYWdlTWVudScpLmhpZGUoKVxuICB9LFxuICBzaG93TG9hZGluZzogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxvYWRlciA9IG5ldyBDYW52YXNMb2FkZXIoJ2FjY291bnRQYWdlTG9hZGluZycpXG4gICAgbG9hZGVyLnNldENvbG9yKCcjNEZDMDU5JykgLy8gZGVmYXVsdCBpcyAnIzAwMDAwMCdcbiAgICBsb2FkZXIuc2V0RGlhbWV0ZXIoMjgpIC8vIGRlZmF1bHQgaXMgNDBcbiAgICBsb2FkZXIuc2V0RGVuc2l0eSg0MSkgLy8gZGVmYXVsdCBpcyA0MFxuICAgIGxvYWRlci5zZXRSYW5nZSgwLjkpIC8vIGRlZmF1bHQgaXMgMS4zXG4gICAgbG9hZGVyLnNob3coKSAvLyBIaWRkZW4gYnkgZGVmYXVsdFxuICAgICQoJyNhY2NvdW50UGFnZUxvYWRpbmcnKS5zaG93KClcbiAgfSxcbiAgc2hvd0ltYWdlUHJldmlldzogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGZpbGUgPSAkKCcjdXNlcl9pbWFnZScpWzBdLmZpbGVzWzBdXG5cbiAgICB2YXIgcmVhZGVyID0gbmV3IHdpbmRvdy5GaWxlUmVhZGVyKClcblxuICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbihlKSB7XG4gICAgICB2YXIgJGNhbnZhcyA9ICQoJzxjYW52YXM+JykuYXR0cih7XG4gICAgICAgIHdpZHRoOiA4NCxcbiAgICAgICAgaGVpZ2h0OiA4NFxuICAgICAgfSlcbiAgICAgIHZhciBjb250ZXh0ID0gJGNhbnZhc1swXS5nZXRDb250ZXh0KCcyZCcpXG4gICAgICB2YXIgaW1hZ2VPYmogPSBuZXcgd2luZG93LkltYWdlKClcblxuICAgICAgaW1hZ2VPYmoub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICQoJy51c2VySW1hZ2VEaXYgY2FudmFzJykucmVtb3ZlKClcbiAgICAgICAgJCgnLnVzZXJJbWFnZURpdiBpbWcnKS5oaWRlKClcblxuICAgICAgICB2YXIgaW1nV2lkdGggPSBpbWFnZU9iai53aWR0aFxuICAgICAgICB2YXIgaW1nSGVpZ2h0ID0gaW1hZ2VPYmouaGVpZ2h0XG5cbiAgICAgICAgdmFyIGRpbWVuc2lvblRvTWF0Y2ggPSBpbWdXaWR0aCA+IGltZ0hlaWdodCA/IGltZ0hlaWdodCA6IGltZ1dpZHRoXG4gICAgICAgIC8vIGRyYXcgY3JvcHBlZCBpbWFnZVxuICAgICAgICB2YXIgbm9uWmVybyA9IE1hdGguYWJzKGltZ0hlaWdodCAtIGltZ1dpZHRoKSAvIDJcbiAgICAgICAgdmFyIHNvdXJjZVggPSBkaW1lbnNpb25Ub01hdGNoID09PSBpbWdXaWR0aCA/IDAgOiBub25aZXJvXG4gICAgICAgIHZhciBzb3VyY2VZID0gZGltZW5zaW9uVG9NYXRjaCA9PT0gaW1nSGVpZ2h0ID8gMCA6IG5vblplcm9cbiAgICAgICAgdmFyIHNvdXJjZVdpZHRoID0gZGltZW5zaW9uVG9NYXRjaFxuICAgICAgICB2YXIgc291cmNlSGVpZ2h0ID0gZGltZW5zaW9uVG9NYXRjaFxuICAgICAgICB2YXIgZGVzdFggPSAwXG4gICAgICAgIHZhciBkZXN0WSA9IDBcbiAgICAgICAgdmFyIGRlc3RXaWR0aCA9IDg0XG4gICAgICAgIHZhciBkZXN0SGVpZ2h0ID0gODRcblxuICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWFnZU9iaiwgc291cmNlWCwgc291cmNlWSwgc291cmNlV2lkdGgsIHNvdXJjZUhlaWdodCwgZGVzdFgsIGRlc3RZLCBkZXN0V2lkdGgsIGRlc3RIZWlnaHQpXG4gICAgICAgICQoJy51c2VySW1hZ2VEaXYnKS5wcmVwZW5kKCRjYW52YXMpXG4gICAgICB9XG4gICAgICBpbWFnZU9iai5zcmMgPSByZWFkZXIucmVzdWx0XG4gICAgfVxuXG4gICAgaWYgKGZpbGUpIHtcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpXG4gICAgICAkKCcudXNlckltYWdlTWVudScpLmhpZGUoKVxuICAgICAgJCgnI3JlbW92ZV9pbWFnZScpLnZhbCgnMCcpXG4gICAgfVxuICB9LFxuICByZW1vdmVQaWN0dXJlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IEFjY291bnRcblxuICAgICQoJy51c2VySW1hZ2VEaXYgY2FudmFzJykucmVtb3ZlKClcbiAgICAkKCcudXNlckltYWdlRGl2IGltZycpLmF0dHIoJ3NyYycsIHNlbGYudXNlckljb25VcmwpLnNob3coKVxuICAgICQoJy51c2VySW1hZ2VNZW51JykuaGlkZSgpXG5cbiAgICB2YXIgaW5wdXQgPSAkKCcjdXNlcl9pbWFnZScpXG4gICAgaW5wdXQucmVwbGFjZVdpdGgoaW5wdXQudmFsKCcnKS5jbG9uZSh0cnVlKSlcbiAgICAkKCcjcmVtb3ZlX2ltYWdlJykudmFsKCcxJylcbiAgfSxcbiAgY2hhbmdlTmFtZTogZnVuY3Rpb24oKSB7XG4gICAgJCgnLmFjY291bnROYW1lJykuaGlkZSgpXG4gICAgJCgnLmNoYW5nZU5hbWUnKS5zaG93KClcbiAgfSxcbiAgc2hvd1Bhc3M6IGZ1bmN0aW9uKCkge1xuICAgICQoJy50b0hpZGUnKS5zaG93KClcbiAgICAkKCcuY2hhbmdlUGFzcycpLmhpZGUoKVxuICB9LFxuICBoaWRlUGFzczogZnVuY3Rpb24oKSB7XG4gICAgJCgnLnRvSGlkZScpLmhpZGUoKVxuICAgICQoJy5jaGFuZ2VQYXNzJykuc2hvdygpXG5cbiAgICAkKCcjY3VycmVudF9wYXNzd29yZCcpLnZhbCgnJylcbiAgICAkKCcjdXNlcl9wYXNzd29yZCcpLnZhbCgnJylcbiAgICAkKCcjdXNlcl9wYXNzd29yZF9jb25maXJtYXRpb24nKS52YWwoJycpXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQWNjb3VudFxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9BY2NvdW50LmpzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 6 */
/***/ function(module, exports) {

    eval("\"use strict\";Object.defineProperty(exports, \"__esModule\", { value: true });var Active = {\n  Map: null,\n  Mapper: null,\n  Topic: null };exports.default =\n\n\nActive;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNi5qcyIsInNvdXJjZXMiOlsiZnJvbnRlbmQvc3JjL01ldGFtYXBzL0FjdGl2ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBBY3RpdmUgPSB7XG4gIE1hcDogbnVsbCxcbiAgTWFwcGVyOiBudWxsLFxuICBUb3BpYzogbnVsbFxufVxuXG5leHBvcnQgZGVmYXVsdCBBY3RpdmVcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBmcm9udGVuZC9zcmMvTWV0YW1hcHMvQWN0aXZlLmpzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 7 */
/***/ function(module, exports) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true }); /* global $ */\n\nvar Admin = {\n  selectMetacodes: [],\n  allMetacodes: [],\n  init: function init() {\n    var self = Admin;\n\n    $('#metacodes_value').val(self.selectMetacodes.toString());\n  },\n  selectAll: function selectAll() {\n    var self = Admin;\n\n    $('.editMetacodes li').removeClass('toggledOff');\n    self.selectMetacodes = self.allMetacodes.slice(0);\n    $('#metacodes_value').val(self.selectMetacodes.toString());\n  },\n  deselectAll: function deselectAll() {\n    var self = Admin;\n\n    $('.editMetacodes li').addClass('toggledOff');\n    self.selectMetacodes = [];\n    $('#metacodes_value').val(0);\n  },\n  liClickHandler: function liClickHandler() {\n    var self = Admin;\n\n    if ($(this).attr('class') !== 'toggledOff') {\n      $(this).addClass('toggledOff');\n      var valueToRemove = $(this).attr('id');\n      self.selectMetacodes.splice(self.selectMetacodes.indexOf(valueToRemove), 1);\n      $('#metacodes_value').val(self.selectMetacodes.toString());\n    } else if ($(this).attr('class') === 'toggledOff') {\n      $(this).removeClass('toggledOff');\n      self.selectMetacodes.push($(this).attr('id'));\n      $('#metacodes_value').val(self.selectMetacodes.toString());\n    }\n  },\n  validate: function validate() {\n    var self = Admin;\n\n    if (self.selectMetacodes.length === 0) {\n      window.alert('Would you pretty please select at least one metacode for the set?');\n      return false;\n    }\n  } };exports.default =\n\n\nAdmin;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNy5qcyIsInNvdXJjZXMiOlsiZnJvbnRlbmQvc3JjL01ldGFtYXBzL0FkbWluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGdsb2JhbCAkICovXG5cbmNvbnN0IEFkbWluID0ge1xuICBzZWxlY3RNZXRhY29kZXM6IFtdLFxuICBhbGxNZXRhY29kZXM6IFtdLFxuICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IEFkbWluXG5cbiAgICAkKCcjbWV0YWNvZGVzX3ZhbHVlJykudmFsKHNlbGYuc2VsZWN0TWV0YWNvZGVzLnRvU3RyaW5nKCkpXG4gIH0sXG4gIHNlbGVjdEFsbDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSBBZG1pblxuXG4gICAgJCgnLmVkaXRNZXRhY29kZXMgbGknKS5yZW1vdmVDbGFzcygndG9nZ2xlZE9mZicpXG4gICAgc2VsZi5zZWxlY3RNZXRhY29kZXMgPSBzZWxmLmFsbE1ldGFjb2Rlcy5zbGljZSgwKVxuICAgICQoJyNtZXRhY29kZXNfdmFsdWUnKS52YWwoc2VsZi5zZWxlY3RNZXRhY29kZXMudG9TdHJpbmcoKSlcbiAgfSxcbiAgZGVzZWxlY3RBbGw6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gQWRtaW5cblxuICAgICQoJy5lZGl0TWV0YWNvZGVzIGxpJykuYWRkQ2xhc3MoJ3RvZ2dsZWRPZmYnKVxuICAgIHNlbGYuc2VsZWN0TWV0YWNvZGVzID0gW11cbiAgICAkKCcjbWV0YWNvZGVzX3ZhbHVlJykudmFsKDApXG4gIH0sXG4gIGxpQ2xpY2tIYW5kbGVyOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IEFkbWluXG5cbiAgICBpZiAoJCh0aGlzKS5hdHRyKCdjbGFzcycpICE9PSAndG9nZ2xlZE9mZicpIHtcbiAgICAgICQodGhpcykuYWRkQ2xhc3MoJ3RvZ2dsZWRPZmYnKVxuICAgICAgY29uc3QgdmFsdWVUb1JlbW92ZSA9ICQodGhpcykuYXR0cignaWQnKVxuICAgICAgc2VsZi5zZWxlY3RNZXRhY29kZXMuc3BsaWNlKHNlbGYuc2VsZWN0TWV0YWNvZGVzLmluZGV4T2YodmFsdWVUb1JlbW92ZSksIDEpXG4gICAgICAkKCcjbWV0YWNvZGVzX3ZhbHVlJykudmFsKHNlbGYuc2VsZWN0TWV0YWNvZGVzLnRvU3RyaW5nKCkpXG4gICAgfSBlbHNlIGlmICgkKHRoaXMpLmF0dHIoJ2NsYXNzJykgPT09ICd0b2dnbGVkT2ZmJykge1xuICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygndG9nZ2xlZE9mZicpXG4gICAgICBzZWxmLnNlbGVjdE1ldGFjb2Rlcy5wdXNoKCQodGhpcykuYXR0cignaWQnKSlcbiAgICAgICQoJyNtZXRhY29kZXNfdmFsdWUnKS52YWwoc2VsZi5zZWxlY3RNZXRhY29kZXMudG9TdHJpbmcoKSlcbiAgICB9XG4gIH0sXG4gIHZhbGlkYXRlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IEFkbWluXG5cbiAgICBpZiAoc2VsZi5zZWxlY3RNZXRhY29kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB3aW5kb3cuYWxlcnQoJ1dvdWxkIHlvdSBwcmV0dHkgcGxlYXNlIHNlbGVjdCBhdCBsZWFzdCBvbmUgbWV0YWNvZGUgZm9yIHRoZSBzZXQ/JylcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBBZG1pblxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9BZG1pbi5qcyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 8 */
/***/ function(module, exports) {

    eval("\"use strict\";Object.defineProperty(exports, \"__esModule\", { value: true });var AutoLayout = {\n  nextX: 0,\n  nextY: 0,\n  sideLength: 1,\n  turnCount: 0,\n  nextXshift: 1,\n  nextYshift: 0,\n  timeToTurn: 0,\n\n  getNextCoord: function getNextCoord() {var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var self = AutoLayout;\n    var nextX = self.nextX;\n    var nextY = self.nextY;\n\n    var DISTANCE_BETWEEN = 120;\n\n    self.nextX = self.nextX + DISTANCE_BETWEEN * self.nextXshift;\n    self.nextY = self.nextY + DISTANCE_BETWEEN * self.nextYshift;\n\n    self.timeToTurn += 1;\n    // if true, it's time to turn\n    if (self.timeToTurn === self.sideLength) {\n      self.turnCount += 1;\n      // if true, it's time to increase side length\n      if (self.turnCount % 2 === 0) {\n        self.sideLength += 1;\n      }\n      self.timeToTurn = 0;\n\n      // going right? turn down\n      if (self.nextXshift === 1 && self.nextYshift === 0) {\n        self.nextXshift = 0;\n        self.nextYshift = 1;\n      } else if (self.nextXshift === 0 && self.nextYshift === 1) {\n        // going down? turn left\n        self.nextXshift = -1;\n        self.nextYshift = 0;\n      } else if (self.nextXshift === -1 && self.nextYshift === 0) {\n        // going left? turn up\n        self.nextXshift = 0;\n        self.nextYshift = -1;\n      } else if (self.nextXshift === 0 && self.nextYshift === -1) {\n        // going up? turn right\n        self.nextXshift = 1;\n        self.nextYshift = 0;\n      }\n    }\n\n    if (opts.mappings && self.coordsTaken(nextX, nextY, opts.mappings)) {\n      // check if the coordinate is already taken on the current map\n      return self.getNextCoord(opts);\n    } else {\n      return {\n        x: nextX,\n        y: nextY };\n\n    }\n  },\n  coordsTaken: function coordsTaken(x, y, mappings) {\n    if (mappings.findWhere({ xloc: x, yloc: y })) {\n      return true;\n    } else {\n      return false;\n    }\n  },\n  resetSpiral: function resetSpiral() {\n    var self = AutoLayout;\n    self.nextX = 0;\n    self.nextY = 0;\n    self.nextXshift = 1;\n    self.nextYshift = 0;\n    self.sideLength = 1;\n    self.timeToTurn = 0;\n    self.turnCount = 0;\n  } };exports.default =\n\n\nAutoLayout;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOC5qcyIsInNvdXJjZXMiOlsiZnJvbnRlbmQvc3JjL01ldGFtYXBzL0F1dG9MYXlvdXQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgQXV0b0xheW91dCA9IHtcbiAgbmV4dFg6IDAsXG4gIG5leHRZOiAwLFxuICBzaWRlTGVuZ3RoOiAxLFxuICB0dXJuQ291bnQ6IDAsXG4gIG5leHRYc2hpZnQ6IDEsXG4gIG5leHRZc2hpZnQ6IDAsXG4gIHRpbWVUb1R1cm46IDAsXG5cbiAgZ2V0TmV4dENvb3JkOiBmdW5jdGlvbihvcHRzID0ge30pIHtcbiAgICB2YXIgc2VsZiA9IEF1dG9MYXlvdXRcbiAgICB2YXIgbmV4dFggPSBzZWxmLm5leHRYXG4gICAgdmFyIG5leHRZID0gc2VsZi5uZXh0WVxuXG4gICAgdmFyIERJU1RBTkNFX0JFVFdFRU4gPSAxMjBcblxuICAgIHNlbGYubmV4dFggPSBzZWxmLm5leHRYICsgRElTVEFOQ0VfQkVUV0VFTiAqIHNlbGYubmV4dFhzaGlmdFxuICAgIHNlbGYubmV4dFkgPSBzZWxmLm5leHRZICsgRElTVEFOQ0VfQkVUV0VFTiAqIHNlbGYubmV4dFlzaGlmdFxuXG4gICAgc2VsZi50aW1lVG9UdXJuICs9IDFcbiAgICAvLyBpZiB0cnVlLCBpdCdzIHRpbWUgdG8gdHVyblxuICAgIGlmIChzZWxmLnRpbWVUb1R1cm4gPT09IHNlbGYuc2lkZUxlbmd0aCkge1xuICAgICAgc2VsZi50dXJuQ291bnQgKz0gMVxuICAgICAgLy8gaWYgdHJ1ZSwgaXQncyB0aW1lIHRvIGluY3JlYXNlIHNpZGUgbGVuZ3RoXG4gICAgICBpZiAoc2VsZi50dXJuQ291bnQgJSAyID09PSAwKSB7XG4gICAgICAgIHNlbGYuc2lkZUxlbmd0aCArPSAxXG4gICAgICB9XG4gICAgICBzZWxmLnRpbWVUb1R1cm4gPSAwXG5cbiAgICAgIC8vIGdvaW5nIHJpZ2h0PyB0dXJuIGRvd25cbiAgICAgIGlmIChzZWxmLm5leHRYc2hpZnQgPT09IDEgJiYgc2VsZi5uZXh0WXNoaWZ0ID09PSAwKSB7XG4gICAgICAgIHNlbGYubmV4dFhzaGlmdCA9IDBcbiAgICAgICAgc2VsZi5uZXh0WXNoaWZ0ID0gMVxuICAgICAgfSBlbHNlIGlmIChzZWxmLm5leHRYc2hpZnQgPT09IDAgJiYgc2VsZi5uZXh0WXNoaWZ0ID09PSAxKSB7XG4gICAgICAgIC8vIGdvaW5nIGRvd24/IHR1cm4gbGVmdFxuICAgICAgICBzZWxmLm5leHRYc2hpZnQgPSAtMVxuICAgICAgICBzZWxmLm5leHRZc2hpZnQgPSAwXG4gICAgICB9IGVsc2UgaWYgKHNlbGYubmV4dFhzaGlmdCA9PT0gLTEgJiYgc2VsZi5uZXh0WXNoaWZ0ID09PSAwKSB7XG4gICAgICAgIC8vIGdvaW5nIGxlZnQ/IHR1cm4gdXBcbiAgICAgICAgc2VsZi5uZXh0WHNoaWZ0ID0gMFxuICAgICAgICBzZWxmLm5leHRZc2hpZnQgPSAtMVxuICAgICAgfSBlbHNlIGlmIChzZWxmLm5leHRYc2hpZnQgPT09IDAgJiYgc2VsZi5uZXh0WXNoaWZ0ID09PSAtMSkge1xuICAgICAgICAvLyBnb2luZyB1cD8gdHVybiByaWdodFxuICAgICAgICBzZWxmLm5leHRYc2hpZnQgPSAxXG4gICAgICAgIHNlbGYubmV4dFlzaGlmdCA9IDBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0cy5tYXBwaW5ncyAmJiBzZWxmLmNvb3Jkc1Rha2VuKG5leHRYLCBuZXh0WSwgb3B0cy5tYXBwaW5ncykpIHtcbiAgICAgIC8vIGNoZWNrIGlmIHRoZSBjb29yZGluYXRlIGlzIGFscmVhZHkgdGFrZW4gb24gdGhlIGN1cnJlbnQgbWFwXG4gICAgICByZXR1cm4gc2VsZi5nZXROZXh0Q29vcmQob3B0cylcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogbmV4dFgsXG4gICAgICAgIHk6IG5leHRZXG4gICAgICB9XG4gICAgfVxuICB9LFxuICBjb29yZHNUYWtlbjogZnVuY3Rpb24oeCwgeSwgbWFwcGluZ3MpIHtcbiAgICBpZiAobWFwcGluZ3MuZmluZFdoZXJlKHsgeGxvYzogeCwgeWxvYzogeSB9KSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9LFxuICByZXNldFNwaXJhbDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSBBdXRvTGF5b3V0XG4gICAgc2VsZi5uZXh0WCA9IDBcbiAgICBzZWxmLm5leHRZID0gMFxuICAgIHNlbGYubmV4dFhzaGlmdCA9IDFcbiAgICBzZWxmLm5leHRZc2hpZnQgPSAwXG4gICAgc2VsZi5zaWRlTGVuZ3RoID0gMVxuICAgIHNlbGYudGltZVRvVHVybiA9IDBcbiAgICBzZWxmLnR1cm5Db3VudCA9IDBcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBBdXRvTGF5b3V0XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL01ldGFtYXBzL0F1dG9MYXlvdXQuanMiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 9 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _indexOf2 = __webpack_require__(10);var _indexOf3 = _interopRequireDefault(_indexOf2);\n\n\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _Control = __webpack_require__(27);var _Control2 = _interopRequireDefault(_Control);\nvar _Create = __webpack_require__(173);var _Create2 = _interopRequireDefault(_Create);\nvar _DataModel = __webpack_require__(149);var _DataModel2 = _interopRequireDefault(_DataModel);\nvar _Engine = __webpack_require__(150);var _Engine2 = _interopRequireDefault(_Engine);\nvar _Map = __webpack_require__(369);var _Map2 = _interopRequireDefault(_Map);\nvar _Mapper = __webpack_require__(434);var _Mapper2 = _interopRequireDefault(_Mapper);\nvar _Synapse = __webpack_require__(354);var _Synapse2 = _interopRequireDefault(_Synapse);\nvar _Topic = __webpack_require__(571);var _Topic2 = _interopRequireDefault(_Topic);\nvar _Views = __webpack_require__(541);\nvar _Visualize = __webpack_require__(561);var _Visualize2 = _interopRequireDefault(_Visualize);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}\n\nvar Cable = {\n  init: function init() {\n    var self = Cable;\n    self.cable = ActionCable.createConsumer();\n  },\n  subscribeToMap: function subscribeToMap(id) {\n    var self = Cable;\n    self.sub = self.cable.subscriptions.create({\n      channel: 'MapChannel',\n      id: id },\n    {\n      received: function received(event) {return self[event.type](event);} });\n\n  },\n  unsubscribeFromMap: function unsubscribeFromMap() {\n    var self = Cable;\n    self.sub && self.sub.unsubscribe();\n    delete self.sub;\n  },\n  synapseAdded: function synapseAdded(event) {\n    // we receive contentless models from the server\n    // containing only the information we need to determine whether the active mapper\n    // can view this synapse and the two topics it connects,\n    // then if we determine it can, we make a call for the full model\n    var m = _Active2.default.Mapper;\n    var s = new _DataModel2.default.Synapse(event.synapse);\n    var t1 = new _DataModel2.default.Topic(event.topic1);\n    var t2 = new _DataModel2.default.Topic(event.topic2);\n\n    if (t1.authorizeToShow(m) && t2.authorizeToShow(m) && s.authorizeToShow(m) && !_DataModel2.default.Synapses.get(event.synapse.id)) {var\n\n      topic1, topic2, node1, node2, synapse, mapping, cancel, mapper;(function () {\n\n        var waitThenRenderSynapse = function waitThenRenderSynapse() {\n          if (synapse && mapping && mapper && synapse.getTopic1() && synapse.getTopic2()) {\n            topic1 = synapse.getTopic1();\n            node1 = topic1.get('node');\n            topic2 = synapse.getTopic2();\n            node2 = topic2.get('node');\n            _Synapse2.default.renderSynapse(mapping, synapse, node1, node2, true);\n            _Engine2.default.runLayout();\n          } else if (!cancel) {\n            setTimeout(waitThenRenderSynapse, 10);\n          }\n        };\n\n        mapper = _DataModel2.default.Mappers.get(event.synapse.user_id);\n        if (mapper === undefined) {\n          _Mapper2.default.get(event.synapse.user_id, function (m) {\n            _DataModel2.default.Mappers.add(m);\n            mapper = m;\n          });\n        }\n        $.ajax({\n          url: '/synapses/' + event.synapse.id + '.json',\n          success: function success(response) {\n            _DataModel2.default.Synapses.add(response);\n            synapse = _DataModel2.default.Synapses.get(response.id);\n          },\n          error: function error() {\n            cancel = true;\n          } });\n\n        $.ajax({\n          url: '/mappings/' + event.mapping_id + '.json',\n          success: function success(response) {\n            _DataModel2.default.Mappings.add(response);\n            mapping = _DataModel2.default.Mappings.get(response.id);\n          },\n          error: function error() {\n            cancel = true;\n          } });\n\n        waitThenRenderSynapse();})();\n    }\n  },\n  synapseUpdated: function synapseUpdated(event) {\n    // TODO: handle case where permission changed\n    var synapse = _DataModel2.default.Synapses.get(event.id);\n    if (synapse) {\n      // edge reset necessary because fetch causes model reset\n      var edge = synapse.get('edge');\n      synapse.fetch({\n        success: function success(model) {\n          model.set({ edge: edge });\n          model.trigger('changeByOther');\n        } });\n\n    }\n  },\n  synapseRemoved: function synapseRemoved(event) {\n    var synapse = _DataModel2.default.Synapses.get(event.id);\n    if (synapse) {\n      var edge = synapse.get('edge');\n      var mapping = synapse.getMapping();\n      if (edge.getData('mappings').length - 1 === 0) {\n        _Control2.default.hideEdge(edge);\n      }\n\n      var index = (0, _indexOf3.default)(edge.getData('synapses'), synapse);\n      edge.getData('mappings').splice(index, 1);\n      edge.getData('synapses').splice(index, 1);\n      if (edge.getData('displayIndex')) {\n        delete edge.data.$displayIndex;\n      }\n      _DataModel2.default.Synapses.remove(synapse);\n      _DataModel2.default.Mappings.remove(mapping);\n      _Engine2.default.runLayout();\n    }\n  },\n  topicAdded: function topicAdded(event) {\n    var m = _Active2.default.Mapper;\n    // we receive a contentless model from the server\n    // containing only the information we need to determine whether the active mapper\n    // can view this topic, then if we determine it can, we make a call for the full model\n    var t = new _DataModel2.default.Topic(event.topic);\n\n    if (t.authorizeToShow(m) && !_DataModel2.default.Topics.get(event.topic.id)) {var\n\n      topic, mapping, mapper, cancel;(function () {\n\n        var waitThenRenderTopic = function waitThenRenderTopic() {\n          if (topic && mapping && mapper) {\n            _Topic2.default.renderTopic(mapping, topic, true);\n            _Engine2.default.runLayout();\n          } else if (!cancel) {\n            setTimeout(waitThenRenderTopic, 10);\n          }\n        };\n\n        mapper = _DataModel2.default.Mappers.get(event.topic.user_id);\n        if (mapper === undefined) {\n          _Mapper2.default.get(event.topic.user_id, function (m) {\n            _DataModel2.default.Mappers.add(m);\n            mapper = m;\n          });\n        }\n        $.ajax({\n          url: '/topics/' + event.topic.id + '.json',\n          success: function success(response) {\n            _DataModel2.default.Topics.add(response);\n            topic = _DataModel2.default.Topics.get(response.id);\n          },\n          error: function error() {\n            cancel = true;\n          } });\n\n        $.ajax({\n          url: '/mappings/' + event.mapping_id + '.json',\n          success: function success(response) {\n            _DataModel2.default.Mappings.add(response);\n            mapping = _DataModel2.default.Mappings.get(response.id);\n          },\n          error: function error() {\n            cancel = true;\n          } });\n\n        waitThenRenderTopic();})();\n    }\n  },\n  topicUpdated: function topicUpdated(event) {\n    // TODO: handle case where permission changed\n    var topic = _DataModel2.default.Topics.get(event.id);\n    if (topic) {\n      var node = topic.get('node');\n      topic.fetch({\n        success: function success(model) {\n          model.set({ node: node });\n          model.trigger('changeByOther');\n        } });\n\n    }\n  },\n  topicMoved: function topicMoved(event) {\n    var topic, node, mapping;\n    /*if (Active.Map) {\n                                topic = DataModel.Topics.get(event.id)\n                                mapping = DataModel.Mappings.get(event.mapping_id)\n                                mapping.set('xloc', event.x)\n                                mapping.set('yloc', event.y)\n                                if (topic) node = topic.get('node')\n                                if (node) node.pos.setc(event.x, event.y)\n                                Visualize.mGraph.plot()\n                              }*/\n  },\n  topicRemoved: function topicRemoved(event) {\n    var topic = _DataModel2.default.Topics.get(event.id);\n    if (topic) {\n      var node = topic.get('node');\n      var mapping = topic.getMapping();\n      _Control2.default.hideNode(node.id);\n      _DataModel2.default.Topics.remove(topic);\n      _DataModel2.default.Mappings.remove(mapping);\n      _Engine2.default.runLayout();\n    }\n  },\n  messageCreated: function messageCreated(event) {\n    if (_Active2.default.Mapper && _Active2.default.Mapper.id === event.message.user_id) return;\n    _Views.ChatView.addMessages(new _DataModel2.default.MessageCollection(event.message));\n  },\n  mapUpdated: function mapUpdated(event) {\n    var map = _Active2.default.Map;\n    var couldEditBefore = map.authorizeToEdit(_Active2.default.Mapper);\n    var idBefore = map.id;\n    map.fetch({\n      success: function success(model, response) {\n        var idNow = model.id;\n        var canEditNow = model.authorizeToEdit(_Active2.default.Mapper);\n        if (idNow !== idBefore) {\n          _Map2.default.leavePrivateMap(); // this means the map has been changed to private\n        } else if (couldEditBefore && !canEditNow) {\n          _Map2.default.cantEditNow();\n        } else if (!couldEditBefore && canEditNow) {\n          _Map2.default.canEditNow();\n        } else {\n          model.trigger('changeByOther');\n        }\n      } });\n\n  } }; /* global $, ActionCable */exports.default =\n\n\nCable;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOS5qcyIsInNvdXJjZXMiOlsiZnJvbnRlbmQvc3JjL01ldGFtYXBzL0NhYmxlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGdsb2JhbCAkLCBBY3Rpb25DYWJsZSAqL1xuXG5pbXBvcnQgeyBpbmRleE9mIH0gZnJvbSAnbG9kYXNoJ1xuXG5pbXBvcnQgQWN0aXZlIGZyb20gJy4vQWN0aXZlJ1xuaW1wb3J0IENvbnRyb2wgZnJvbSAnLi9Db250cm9sJ1xuaW1wb3J0IENyZWF0ZSBmcm9tICcuL0NyZWF0ZSdcbmltcG9ydCBEYXRhTW9kZWwgZnJvbSAnLi9EYXRhTW9kZWwnXG5pbXBvcnQgRW5naW5lIGZyb20gJy4vRW5naW5lJ1xuaW1wb3J0IE1hcCBmcm9tICcuL01hcCdcbmltcG9ydCBNYXBwZXIgZnJvbSAnLi9NYXBwZXInXG5pbXBvcnQgU3luYXBzZSBmcm9tICcuL1N5bmFwc2UnXG5pbXBvcnQgVG9waWMgZnJvbSAnLi9Ub3BpYydcbmltcG9ydCB7IENoYXRWaWV3IH0gZnJvbSAnLi9WaWV3cydcbmltcG9ydCBWaXN1YWxpemUgZnJvbSAnLi9WaXN1YWxpemUnXG5cbmNvbnN0IENhYmxlID0ge1xuICBpbml0OiAoKSA9PiB7XG4gICAgbGV0IHNlbGYgPSBDYWJsZVxuICAgIHNlbGYuY2FibGUgPSBBY3Rpb25DYWJsZS5jcmVhdGVDb25zdW1lcigpXG4gIH0sXG4gIHN1YnNjcmliZVRvTWFwOiBpZCA9PiB7XG4gICAgbGV0IHNlbGYgPSBDYWJsZVxuICAgIHNlbGYuc3ViID0gc2VsZi5jYWJsZS5zdWJzY3JpcHRpb25zLmNyZWF0ZSh7XG4gICAgICBjaGFubmVsOiAnTWFwQ2hhbm5lbCcsXG4gICAgICBpZDogaWRcbiAgICB9LCB7XG4gICAgICByZWNlaXZlZDogZXZlbnQgPT4gc2VsZltldmVudC50eXBlXShldmVudClcbiAgICB9KVxuICB9LFxuICB1bnN1YnNjcmliZUZyb21NYXA6ICgpID0+IHtcbiAgICBsZXQgc2VsZiA9IENhYmxlXG4gICAgc2VsZi5zdWIgJiYgc2VsZi5zdWIudW5zdWJzY3JpYmUoKVxuICAgIGRlbGV0ZSBzZWxmLnN1YlxuICB9LFxuICBzeW5hcHNlQWRkZWQ6IGV2ZW50ID0+IHtcbiAgICAvLyB3ZSByZWNlaXZlIGNvbnRlbnRsZXNzIG1vZGVscyBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAvLyBjb250YWluaW5nIG9ubHkgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFjdGl2ZSBtYXBwZXJcbiAgICAvLyBjYW4gdmlldyB0aGlzIHN5bmFwc2UgYW5kIHRoZSB0d28gdG9waWNzIGl0IGNvbm5lY3RzLFxuICAgIC8vIHRoZW4gaWYgd2UgZGV0ZXJtaW5lIGl0IGNhbiwgd2UgbWFrZSBhIGNhbGwgZm9yIHRoZSBmdWxsIG1vZGVsXG4gICAgY29uc3QgbSA9IEFjdGl2ZS5NYXBwZXJcbiAgICBjb25zdCBzID0gbmV3IERhdGFNb2RlbC5TeW5hcHNlKGV2ZW50LnN5bmFwc2UpXG4gICAgY29uc3QgdDEgPSBuZXcgRGF0YU1vZGVsLlRvcGljKGV2ZW50LnRvcGljMSlcbiAgICBjb25zdCB0MiA9IG5ldyBEYXRhTW9kZWwuVG9waWMoZXZlbnQudG9waWMyKVxuXG4gICAgaWYgKHQxLmF1dGhvcml6ZVRvU2hvdyhtKSAmJiB0Mi5hdXRob3JpemVUb1Nob3cobSkgJiYgcy5hdXRob3JpemVUb1Nob3cobSkgJiYgIURhdGFNb2RlbC5TeW5hcHNlcy5nZXQoZXZlbnQuc3luYXBzZS5pZCkpIHtcbiAgICAgIC8vIHJlZmFjdG9yIHRoZSBoZWNrIG91dHRhIHRoaXMsIGl0cyBhZGRpbmcgd2lja2VkIHdhaXQgdGltZVxuICAgICAgdmFyIHRvcGljMSwgdG9waWMyLCBub2RlMSwgbm9kZTIsIHN5bmFwc2UsIG1hcHBpbmcsIGNhbmNlbCwgbWFwcGVyXG4gXG4gICAgICBjb25zdCB3YWl0VGhlblJlbmRlclN5bmFwc2UgPSAoKSA9PiB7XG4gICAgICAgIGlmIChzeW5hcHNlICYmIG1hcHBpbmcgJiYgbWFwcGVyICYmIHN5bmFwc2UuZ2V0VG9waWMxKCkgJiYgc3luYXBzZS5nZXRUb3BpYzIoKSkge1xuICAgICAgICAgIHRvcGljMSA9IHN5bmFwc2UuZ2V0VG9waWMxKClcbiAgICAgICAgICBub2RlMSA9IHRvcGljMS5nZXQoJ25vZGUnKVxuICAgICAgICAgIHRvcGljMiA9IHN5bmFwc2UuZ2V0VG9waWMyKClcbiAgICAgICAgICBub2RlMiA9IHRvcGljMi5nZXQoJ25vZGUnKVxuICAgICAgICAgIFN5bmFwc2UucmVuZGVyU3luYXBzZShtYXBwaW5nLCBzeW5hcHNlLCBub2RlMSwgbm9kZTIsIHRydWUpXG4gICAgICAgICAgRW5naW5lLnJ1bkxheW91dCgpXG4gICAgICAgIH0gZWxzZSBpZiAoIWNhbmNlbCkge1xuICAgICAgICAgIHNldFRpbWVvdXQod2FpdFRoZW5SZW5kZXJTeW5hcHNlLCAxMClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBtYXBwZXIgPSBEYXRhTW9kZWwuTWFwcGVycy5nZXQoZXZlbnQuc3luYXBzZS51c2VyX2lkKVxuICAgICAgaWYgKG1hcHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIE1hcHBlci5nZXQoZXZlbnQuc3luYXBzZS51c2VyX2lkLCBmdW5jdGlvbihtKSB7XG4gICAgICAgICAgRGF0YU1vZGVsLk1hcHBlcnMuYWRkKG0pXG4gICAgICAgICAgbWFwcGVyID0gbVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgJC5hamF4KHtcbiAgICAgICAgdXJsOiAnL3N5bmFwc2VzLycgKyBldmVudC5zeW5hcHNlLmlkICsgJy5qc29uJyxcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICBEYXRhTW9kZWwuU3luYXBzZXMuYWRkKHJlc3BvbnNlKVxuICAgICAgICAgIHN5bmFwc2UgPSBEYXRhTW9kZWwuU3luYXBzZXMuZ2V0KHJlc3BvbnNlLmlkKVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgY2FuY2VsID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgJC5hamF4KHtcbiAgICAgICAgdXJsOiAnL21hcHBpbmdzLycgKyBldmVudC5tYXBwaW5nX2lkICsgJy5qc29uJyxcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICBEYXRhTW9kZWwuTWFwcGluZ3MuYWRkKHJlc3BvbnNlKVxuICAgICAgICAgIG1hcHBpbmcgPSBEYXRhTW9kZWwuTWFwcGluZ3MuZ2V0KHJlc3BvbnNlLmlkKVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgY2FuY2VsID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgd2FpdFRoZW5SZW5kZXJTeW5hcHNlKClcbiAgICB9XG4gIH0sXG4gIHN5bmFwc2VVcGRhdGVkOiBldmVudCA9PiB7XG4gICAgLy8gVE9ETzogaGFuZGxlIGNhc2Ugd2hlcmUgcGVybWlzc2lvbiBjaGFuZ2VkXG4gICAgdmFyIHN5bmFwc2UgPSBEYXRhTW9kZWwuU3luYXBzZXMuZ2V0KGV2ZW50LmlkKVxuICAgIGlmIChzeW5hcHNlKSB7XG4gICAgICAvLyBlZGdlIHJlc2V0IG5lY2Vzc2FyeSBiZWNhdXNlIGZldGNoIGNhdXNlcyBtb2RlbCByZXNldFxuICAgICAgdmFyIGVkZ2UgPSBzeW5hcHNlLmdldCgnZWRnZScpXG4gICAgICBzeW5hcHNlLmZldGNoKHtcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24obW9kZWwpIHtcbiAgICAgICAgICBtb2RlbC5zZXQoeyBlZGdlOiBlZGdlIH0pXG4gICAgICAgICAgbW9kZWwudHJpZ2dlcignY2hhbmdlQnlPdGhlcicpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9LFxuICBzeW5hcHNlUmVtb3ZlZDogZXZlbnQgPT4ge1xuICAgIHZhciBzeW5hcHNlID0gRGF0YU1vZGVsLlN5bmFwc2VzLmdldChldmVudC5pZClcbiAgICBpZiAoc3luYXBzZSkge1xuICAgICAgdmFyIGVkZ2UgPSBzeW5hcHNlLmdldCgnZWRnZScpXG4gICAgICB2YXIgbWFwcGluZyA9IHN5bmFwc2UuZ2V0TWFwcGluZygpXG4gICAgICBpZiAoZWRnZS5nZXREYXRhKCdtYXBwaW5ncycpLmxlbmd0aCAtIDEgPT09IDApIHtcbiAgICAgICAgQ29udHJvbC5oaWRlRWRnZShlZGdlKVxuICAgICAgfVxuXG4gICAgICB2YXIgaW5kZXggPSBpbmRleE9mKGVkZ2UuZ2V0RGF0YSgnc3luYXBzZXMnKSwgc3luYXBzZSlcbiAgICAgIGVkZ2UuZ2V0RGF0YSgnbWFwcGluZ3MnKS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICBlZGdlLmdldERhdGEoJ3N5bmFwc2VzJykuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgaWYgKGVkZ2UuZ2V0RGF0YSgnZGlzcGxheUluZGV4JykpIHtcbiAgICAgICAgZGVsZXRlIGVkZ2UuZGF0YS4kZGlzcGxheUluZGV4XG4gICAgICB9XG4gICAgICBEYXRhTW9kZWwuU3luYXBzZXMucmVtb3ZlKHN5bmFwc2UpXG4gICAgICBEYXRhTW9kZWwuTWFwcGluZ3MucmVtb3ZlKG1hcHBpbmcpXG4gICAgICBFbmdpbmUucnVuTGF5b3V0KClcbiAgICB9XG4gIH0sXG4gIHRvcGljQWRkZWQ6IGV2ZW50ID0+IHtcbiAgICBjb25zdCBtID0gQWN0aXZlLk1hcHBlclxuICAgIC8vIHdlIHJlY2VpdmUgYSBjb250ZW50bGVzcyBtb2RlbCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAvLyBjb250YWluaW5nIG9ubHkgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFjdGl2ZSBtYXBwZXJcbiAgICAvLyBjYW4gdmlldyB0aGlzIHRvcGljLCB0aGVuIGlmIHdlIGRldGVybWluZSBpdCBjYW4sIHdlIG1ha2UgYSBjYWxsIGZvciB0aGUgZnVsbCBtb2RlbFxuICAgIGNvbnN0IHQgPSBuZXcgRGF0YU1vZGVsLlRvcGljKGV2ZW50LnRvcGljKVxuXG4gICAgaWYgKHQuYXV0aG9yaXplVG9TaG93KG0pICYmICFEYXRhTW9kZWwuVG9waWNzLmdldChldmVudC50b3BpYy5pZCkpIHtcbiAgICAgIC8vIHJlZmFjdG9yIHRoZSBoZWNrIG91dHRhIHRoaXMsIGl0cyBhZGRpbmcgd2lja2VkIHdhaXQgdGltZVxuICAgICAgdmFyIHRvcGljLCBtYXBwaW5nLCBtYXBwZXIsIGNhbmNlbFxuXG4gICAgICBjb25zdCB3YWl0VGhlblJlbmRlclRvcGljID0gKCkgPT4ge1xuICAgICAgICBpZiAodG9waWMgJiYgbWFwcGluZyAmJiBtYXBwZXIpIHtcbiAgICAgICAgICBUb3BpYy5yZW5kZXJUb3BpYyhtYXBwaW5nLCB0b3BpYywgdHJ1ZSlcbiAgICAgICAgICBFbmdpbmUucnVuTGF5b3V0KClcbiAgICAgICAgfSBlbHNlIGlmICghY2FuY2VsKSB7XG4gICAgICAgICAgc2V0VGltZW91dCh3YWl0VGhlblJlbmRlclRvcGljLCAxMClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBtYXBwZXIgPSBEYXRhTW9kZWwuTWFwcGVycy5nZXQoZXZlbnQudG9waWMudXNlcl9pZClcbiAgICAgIGlmIChtYXBwZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBNYXBwZXIuZ2V0KGV2ZW50LnRvcGljLnVzZXJfaWQsIGZ1bmN0aW9uKG0pIHtcbiAgICAgICAgICBEYXRhTW9kZWwuTWFwcGVycy5hZGQobSlcbiAgICAgICAgICBtYXBwZXIgPSBtXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICAkLmFqYXgoe1xuICAgICAgICB1cmw6ICcvdG9waWNzLycgKyBldmVudC50b3BpYy5pZCArICcuanNvbicsXG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgRGF0YU1vZGVsLlRvcGljcy5hZGQocmVzcG9uc2UpXG4gICAgICAgICAgdG9waWMgPSBEYXRhTW9kZWwuVG9waWNzLmdldChyZXNwb25zZS5pZClcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGNhbmNlbCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgICQuYWpheCh7XG4gICAgICAgIHVybDogJy9tYXBwaW5ncy8nICsgZXZlbnQubWFwcGluZ19pZCArICcuanNvbicsXG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgRGF0YU1vZGVsLk1hcHBpbmdzLmFkZChyZXNwb25zZSlcbiAgICAgICAgICBtYXBwaW5nID0gRGF0YU1vZGVsLk1hcHBpbmdzLmdldChyZXNwb25zZS5pZClcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGNhbmNlbCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHdhaXRUaGVuUmVuZGVyVG9waWMoKVxuICAgIH1cbiAgfSxcbiAgdG9waWNVcGRhdGVkOiBldmVudCA9PiB7XG4gICAgLy8gVE9ETzogaGFuZGxlIGNhc2Ugd2hlcmUgcGVybWlzc2lvbiBjaGFuZ2VkXG4gICAgdmFyIHRvcGljID0gRGF0YU1vZGVsLlRvcGljcy5nZXQoZXZlbnQuaWQpXG4gICAgaWYgKHRvcGljKSB7XG4gICAgICB2YXIgbm9kZSA9IHRvcGljLmdldCgnbm9kZScpXG4gICAgICB0b3BpYy5mZXRjaCh7XG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKG1vZGVsKSB7XG4gICAgICAgICAgbW9kZWwuc2V0KHsgbm9kZTogbm9kZSB9KVxuICAgICAgICAgIG1vZGVsLnRyaWdnZXIoJ2NoYW5nZUJ5T3RoZXInKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfSxcbiAgdG9waWNNb3ZlZDogZXZlbnQgPT4ge1xuICAgIHZhciB0b3BpYywgbm9kZSwgbWFwcGluZ1xuICAgIC8qaWYgKEFjdGl2ZS5NYXApIHtcbiAgICAgIHRvcGljID0gRGF0YU1vZGVsLlRvcGljcy5nZXQoZXZlbnQuaWQpXG4gICAgICBtYXBwaW5nID0gRGF0YU1vZGVsLk1hcHBpbmdzLmdldChldmVudC5tYXBwaW5nX2lkKVxuICAgICAgbWFwcGluZy5zZXQoJ3hsb2MnLCBldmVudC54KVxuICAgICAgbWFwcGluZy5zZXQoJ3lsb2MnLCBldmVudC55KVxuICAgICAgaWYgKHRvcGljKSBub2RlID0gdG9waWMuZ2V0KCdub2RlJylcbiAgICAgIGlmIChub2RlKSBub2RlLnBvcy5zZXRjKGV2ZW50LngsIGV2ZW50LnkpXG4gICAgICBWaXN1YWxpemUubUdyYXBoLnBsb3QoKVxuICAgIH0qL1xuICB9LFxuICB0b3BpY1JlbW92ZWQ6IGV2ZW50ID0+IHtcbiAgICB2YXIgdG9waWMgPSBEYXRhTW9kZWwuVG9waWNzLmdldChldmVudC5pZClcbiAgICBpZiAodG9waWMpIHtcbiAgICAgIHZhciBub2RlID0gdG9waWMuZ2V0KCdub2RlJylcbiAgICAgIHZhciBtYXBwaW5nID0gdG9waWMuZ2V0TWFwcGluZygpXG4gICAgICBDb250cm9sLmhpZGVOb2RlKG5vZGUuaWQpXG4gICAgICBEYXRhTW9kZWwuVG9waWNzLnJlbW92ZSh0b3BpYylcbiAgICAgIERhdGFNb2RlbC5NYXBwaW5ncy5yZW1vdmUobWFwcGluZylcbiAgICAgIEVuZ2luZS5ydW5MYXlvdXQoKVxuICAgIH1cbiAgfSxcbiAgbWVzc2FnZUNyZWF0ZWQ6IGV2ZW50ID0+IHtcbiAgICBpZiAoQWN0aXZlLk1hcHBlciAmJiBBY3RpdmUuTWFwcGVyLmlkID09PSBldmVudC5tZXNzYWdlLnVzZXJfaWQpIHJldHVyblxuICAgIENoYXRWaWV3LmFkZE1lc3NhZ2VzKG5ldyBEYXRhTW9kZWwuTWVzc2FnZUNvbGxlY3Rpb24oZXZlbnQubWVzc2FnZSkpXG4gIH0sXG4gIG1hcFVwZGF0ZWQ6IGV2ZW50ID0+IHtcbiAgICB2YXIgbWFwID0gQWN0aXZlLk1hcFxuICAgIHZhciBjb3VsZEVkaXRCZWZvcmUgPSBtYXAuYXV0aG9yaXplVG9FZGl0KEFjdGl2ZS5NYXBwZXIpXG4gICAgdmFyIGlkQmVmb3JlID0gbWFwLmlkXG4gICAgbWFwLmZldGNoKHtcbiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKG1vZGVsLCByZXNwb25zZSkge1xuICAgICAgICB2YXIgaWROb3cgPSBtb2RlbC5pZFxuICAgICAgICB2YXIgY2FuRWRpdE5vdyA9IG1vZGVsLmF1dGhvcml6ZVRvRWRpdChBY3RpdmUuTWFwcGVyKVxuICAgICAgICBpZiAoaWROb3cgIT09IGlkQmVmb3JlKSB7XG4gICAgICAgICAgTWFwLmxlYXZlUHJpdmF0ZU1hcCgpIC8vIHRoaXMgbWVhbnMgdGhlIG1hcCBoYXMgYmVlbiBjaGFuZ2VkIHRvIHByaXZhdGVcbiAgICAgICAgfSBlbHNlIGlmIChjb3VsZEVkaXRCZWZvcmUgJiYgIWNhbkVkaXROb3cpIHtcbiAgICAgICAgICBNYXAuY2FudEVkaXROb3coKVxuICAgICAgICB9IGVsc2UgaWYgKCFjb3VsZEVkaXRCZWZvcmUgJiYgY2FuRWRpdE5vdykge1xuICAgICAgICAgIE1hcC5jYW5FZGl0Tm93KClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtb2RlbC50cmlnZ2VyKCdjaGFuZ2VCeU90aGVyJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2FibGVcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBmcm9udGVuZC9zcmMvTWV0YW1hcHMvQ2FibGUuanMiXSwibWFwcGluZ3MiOiI7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 10 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseIndexOf = __webpack_require__(11),\n    toInteger = __webpack_require__(15);\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Gets the index at which the first occurrence of `value` is found in `array`\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. If `fromIndex` is negative, it's used as the\n * offset from the end of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.indexOf([1, 2, 1, 2], 2);\n * // => 1\n *\n * // Search from the `fromIndex`.\n * _.indexOf([1, 2, 1, 2], 2, 2);\n * // => 3\n */\nfunction indexOf(array, value, fromIndex) {\n  var length = array == null ? 0 : array.length;\n  if (!length) {\n    return -1;\n  }\n  var index = fromIndex == null ? 0 : toInteger(fromIndex);\n  if (index < 0) {\n    index = nativeMax(length + index, 0);\n  }\n  return baseIndexOf(array, value, index);\n}\n\nmodule.exports = indexOf;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9pbmRleE9mLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Jhc2VJbmRleE9mJyksXG4gICAgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi90b0ludGVnZXInKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGB2YWx1ZWAgaXMgZm91bmQgaW4gYGFycmF5YFxuICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gSWYgYGZyb21JbmRleGAgaXMgbmVnYXRpdmUsIGl0J3MgdXNlZCBhcyB0aGVcbiAqIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgYGFycmF5YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaW5kZXhPZihbMSwgMiwgMSwgMl0sIDIpO1xuICogLy8gPT4gMVxuICpcbiAqIC8vIFNlYXJjaCBmcm9tIHRoZSBgZnJvbUluZGV4YC5cbiAqIF8uaW5kZXhPZihbMSwgMiwgMSwgMl0sIDIsIDIpO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiBpbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgdmFyIGluZGV4ID0gZnJvbUluZGV4ID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gIGlmIChpbmRleCA8IDApIHtcbiAgICBpbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCk7XG4gIH1cbiAgcmV0dXJuIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgaW5kZXgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluZGV4T2Y7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL2luZGV4T2YuanNcbi8vIG1vZHVsZSBpZCA9IDEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 11 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseFindIndex = __webpack_require__(12),\n    baseIsNaN = __webpack_require__(13),\n    strictIndexOf = __webpack_require__(14);\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n  return value === value\n    ? strictIndexOf(array, value, fromIndex)\n    : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUluZGV4T2YuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VGaW5kSW5kZXggPSByZXF1aXJlKCcuL19iYXNlRmluZEluZGV4JyksXG4gICAgYmFzZUlzTmFOID0gcmVxdWlyZSgnLi9fYmFzZUlzTmFOJyksXG4gICAgc3RyaWN0SW5kZXhPZiA9IHJlcXVpcmUoJy4vX3N0cmljdEluZGV4T2YnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZVxuICAgID8gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleClcbiAgICA6IGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJc05hTiwgZnJvbUluZGV4KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSW5kZXhPZjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2Jhc2VJbmRleE9mLmpzXG4vLyBtb2R1bGUgaWQgPSAxMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 12 */
/***/ function(module, exports) {

    eval("/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n  var length = array.length,\n      index = fromIndex + (fromRight ? 1 : -1);\n\n  while ((fromRight ? index-- : ++index < length)) {\n    if (predicate(array[index], index, array)) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = baseFindIndex;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUZpbmRJbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRmluZEluZGV4O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZUZpbmRJbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 13 */
/***/ function(module, exports) {

    eval("/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n  return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTmFOLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYU5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbnVtYmVyIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTmFOKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzTmFOO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZUlzTmFOLmpzXG4vLyBtb2R1bGUgaWQgPSAxM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 14 */
/***/ function(module, exports) {

    eval("/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n  var index = fromIndex - 1,\n      length = array.length;\n\n  while (++index < length) {\n    if (array[index] === value) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = strictIndexOf;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RyaWN0SW5kZXhPZi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmRleE9mYCB3aGljaCBwZXJmb3JtcyBzdHJpY3QgZXF1YWxpdHlcbiAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaWN0SW5kZXhPZjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX3N0cmljdEluZGV4T2YuanNcbi8vIG1vZHVsZSBpZCA9IDE0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 15 */
/***/ function(module, exports, __webpack_require__) {

    eval("var toFinite = __webpack_require__(16);\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n  var result = toFinite(value),\n      remainder = result % 1;\n\n  return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nmodule.exports = toInteger;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC90b0ludGVnZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHRvRmluaXRlID0gcmVxdWlyZSgnLi90b0Zpbml0ZScpO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvSW50ZWdlcigzLjIpO1xuICogLy8gPT4gM1xuICpcbiAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gMFxuICpcbiAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0ludGVnZXIoJzMuMicpO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSxcbiAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvSW50ZWdlcjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvdG9JbnRlZ2VyLmpzXG4vLyBtb2R1bGUgaWQgPSAxNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 16 */
/***/ function(module, exports, __webpack_require__) {

    eval("var toNumber = __webpack_require__(17);\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n    MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n  if (!value) {\n    return value === 0 ? value : 0;\n  }\n  value = toNumber(value);\n  if (value === INFINITY || value === -INFINITY) {\n    var sign = (value < 0 ? -1 : 1);\n    return sign * MAX_INTEGER;\n  }\n  return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC90b0Zpbml0ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9OdW1iZXIgPSByZXF1aXJlKCcuL3RvTnVtYmVyJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwODtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgZmluaXRlIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTIuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvRmluaXRlKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9GaW5pdGUoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6IDA7XG4gIH1cbiAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gIGlmICh2YWx1ZSA9PT0gSU5GSU5JVFkgfHwgdmFsdWUgPT09IC1JTkZJTklUWSkge1xuICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvRmluaXRlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC90b0Zpbml0ZS5qc1xuLy8gbW9kdWxlIGlkID0gMTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 17 */
/***/ function(module, exports, __webpack_require__) {

    eval("var isObject = __webpack_require__(18),\n    isSymbol = __webpack_require__(19);\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n  if (typeof value == 'number') {\n    return value;\n  }\n  if (isSymbol(value)) {\n    return NAN;\n  }\n  if (isObject(value)) {\n    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n    value = isObject(other) ? (other + '') : other;\n  }\n  if (typeof value != 'string') {\n    return value === 0 ? value : +value;\n  }\n  value = value.replace(reTrim, '');\n  var isBinary = reIsBinary.test(value);\n  return (isBinary || reIsOctal.test(value))\n    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n    : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC90b051bWJlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE5BTiA9IDAgLyAwO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b051bWJlcjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvdG9OdW1iZXIuanNcbi8vIG1vZHVsZSBpZCA9IDE3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 18 */
/***/ function(module, exports) {

    eval("/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTguanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvaXNPYmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IDE4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 19 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseGetTag = __webpack_require__(20),\n    isObjectLike = __webpack_require__(26);\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1N5bWJvbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTeW1ib2w7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL2lzU3ltYm9sLmpzXG4vLyBtb2R1bGUgaWQgPSAxOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 20 */
/***/ function(module, exports, __webpack_require__) {

    eval("var Symbol = __webpack_require__(21),\n    getRawTag = __webpack_require__(24),\n    objectToString = __webpack_require__(25);\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldFRhZy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgZ2V0UmF3VGFnID0gcmVxdWlyZSgnLi9fZ2V0UmF3VGFnJyksXG4gICAgb2JqZWN0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19vYmplY3RUb1N0cmluZycpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVsbFRhZyA9ICdbb2JqZWN0IE51bGxdJyxcbiAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnO1xuICB9XG4gIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICA/IGdldFJhd1RhZyh2YWx1ZSlcbiAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR2V0VGFnO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZUdldFRhZy5qc1xuLy8gbW9kdWxlIGlkID0gMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 21 */
/***/ function(module, exports, __webpack_require__) {

    eval("var root = __webpack_require__(22);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fU3ltYm9sLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBTeW1ib2wgPSByb290LlN5bWJvbDtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW1ib2w7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19TeW1ib2wuanNcbi8vIG1vZHVsZSBpZCA9IDIxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 22 */
/***/ function(module, exports, __webpack_require__) {

    eval("var freeGlobal = __webpack_require__(23);\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fcm9vdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJvb3Q7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19yb290LmpzXG4vLyBtb2R1bGUgaWQgPSAyMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 23 */
/***/ function(module, exports) {

    eval("/* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fZnJlZUdsb2JhbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZyZWVHbG9iYWw7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19mcmVlR2xvYmFsLmpzXG4vLyBtb2R1bGUgaWQgPSAyM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 24 */
/***/ function(module, exports, __webpack_require__) {

    eval("var Symbol = __webpack_require__(21);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0UmF3VGFnLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh1bm1hc2tlZCkge1xuICAgIGlmIChpc093bikge1xuICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFJhd1RhZztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2dldFJhd1RhZy5qc1xuLy8gbW9kdWxlIGlkID0gMjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 25 */
/***/ function(module, exports) {

    eval("/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fb2JqZWN0VG9TdHJpbmcuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb2JqZWN0VG9TdHJpbmc7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19vYmplY3RUb1N0cmluZy5qc1xuLy8gbW9kdWxlIGlkID0gMjVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 26 */
/***/ function(module, exports) {

    eval("/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdExpa2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3RMaWtlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9pc09iamVjdExpa2UuanNcbi8vIG1vZHVsZSBpZCA9IDI2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 27 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _find2 = __webpack_require__(28);var _find3 = _interopRequireDefault(_find2);var _each2 = __webpack_require__(137);var _each3 = _interopRequireDefault(_each2);var _map2 = __webpack_require__(146);var _map3 = _interopRequireDefault(_map2);var _templateObject = _taggedTemplateLiteral(['\\n      You have ', ' and ', ' selected. Are you sure you want\\n      to permanently delete them all? This will remove them from all\\n      maps they appear on.'], ['\\n      You have ', ' and ', ' selected. Are you sure you want\\n      to permanently delete them all? This will remove them from all\\n      maps they appear on.']);\nvar _outdent = __webpack_require__(148);var _outdent2 = _interopRequireDefault(_outdent);\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _DataModel = __webpack_require__(149);var _DataModel2 = _interopRequireDefault(_DataModel);\nvar _Engine = __webpack_require__(150);var _Engine2 = _interopRequireDefault(_Engine);\nvar _Filter = __webpack_require__(356);var _Filter2 = _interopRequireDefault(_Filter);\nvar _GlobalUI = __webpack_require__(362);var _GlobalUI2 = _interopRequireDefault(_GlobalUI);\nvar _Mouse = __webpack_require__(352);var _Mouse2 = _interopRequireDefault(_Mouse);\nvar _Selected = __webpack_require__(353);var _Selected2 = _interopRequireDefault(_Selected);\nvar _Settings = __webpack_require__(572);var _Settings2 = _interopRequireDefault(_Settings);\nvar _Visualize = __webpack_require__(561);var _Visualize2 = _interopRequireDefault(_Visualize);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}function _taggedTemplateLiteral(strings, raw) {return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } }));}\n\nvar Control = {\n  init: function init() {},\n  selectNode: function selectNode(node, e) {\n    var filtered = node.getData('alpha') === 0;\n\n    if (filtered || _Selected2.default.Nodes.indexOf(node) !== -1) return;\n    node.selected = true;\n    node.setData('dim', 30, 'current');\n    _Selected2.default.Nodes.push(node);\n  },\n  deselectAllNodes: function deselectAllNodes() {\n    var l = _Selected2.default.Nodes.length;\n    for (var i = l - 1; i >= 0; i -= 1) {\n      var node = _Selected2.default.Nodes[i];\n      Control.deselectNode(node);\n    }\n    _Visualize2.default.mGraph.plot();\n  },\n  deselectNode: function deselectNode(node) {\n    delete node.selected;\n    node.setData('dim', 25, 'current');\n\n    // remove the node\n    _Selected2.default.Nodes.splice(\n    _Selected2.default.Nodes.indexOf(node), 1);\n  },\n  deleteSelected: function deleteSelected() {\n    if (!_Active2.default.Map) return;\n\n    var n = _Selected2.default.Nodes.length;\n    var e = _Selected2.default.Edges.length;\n    var ntext = n === 1 ? '1 topic' : n + ' topics';\n    var etext = e === 1 ? '1 synapse' : e + ' synapses';\n\n    var authorized = _Active2.default.Map.authorizeToEdit(_Active2.default.Mapper);\n\n    if (!authorized) {\n      _GlobalUI2.default.notifyUser('Cannot edit Public map.');\n      return;\n    }\n\n    var r = window.confirm((0, _outdent2.default)(_templateObject,\n    ntext, etext));\n\n\n    if (r) {\n      Control.deleteSelectedEdges();\n      Control.deleteSelectedNodes();\n    }\n\n    if (_DataModel2.default.Topics.length === 0) {\n      _GlobalUI2.default.showDiv('#instructions');\n    }\n  },\n  deleteSelectedNodes: function deleteSelectedNodes() {// refers to deleting topics permanently\n    if (!_Active2.default.Map) return;\n\n    var authorized = _Active2.default.Map.authorizeToEdit(_Active2.default.Mapper);\n\n    if (!authorized) {\n      _GlobalUI2.default.notifyUser('Cannot edit Public map.');\n      return;\n    }\n\n    var l = _Selected2.default.Nodes.length;\n    for (var i = l - 1; i >= 0; i -= 1) {\n      var node = _Selected2.default.Nodes[i];\n      Control.deleteNode(node.id);\n    }\n  },\n  deleteNode: function deleteNode(nodeid) {// refers to deleting topics permanently\n    if (!_Active2.default.Map) return;\n\n    var authorized = _Active2.default.Map.authorizeToEdit(_Active2.default.Mapper);\n\n    if (!authorized) {\n      _GlobalUI2.default.notifyUser('Cannot edit Public map.');\n      return;\n    }\n\n    var node = _Visualize2.default.mGraph.graph.getNode(nodeid);\n    var topic = node.getData('topic');\n\n    var permToDelete = _Active2.default.Mapper.id === topic.get('user_id') || _Active2.default.Mapper.get('admin');\n    if (permToDelete) {\n      var mapping = node.getData('mapping');\n      topic.destroy();\n      _DataModel2.default.Mappings.remove(mapping);\n      Control.hideNode(nodeid);\n    } else {\n      _GlobalUI2.default.notifyUser('Only topics you created can be deleted');\n    }\n  },\n  removeSelectedNodes: function removeSelectedNodes() {// refers to removing topics permanently from a map\n    if (_Active2.default.Topic) {\n      // hideNode will handle synapses as well\n      var nodeids = (0, _map3.default)(_Selected2.default.Nodes, function (node) {\n        return node.id;\n      });\n      (0, _each3.default)(nodeids, function (nodeid) {\n        if (_Active2.default.Topic.id !== nodeid) {\n          _DataModel2.default.Topics.remove(nodeid);\n          Control.hideNode(nodeid);\n        }\n      });\n      return;\n    }\n    if (!_Active2.default.Map) return;\n\n    var l = _Selected2.default.Nodes.length;\n    var authorized = _Active2.default.Map.authorizeToEdit(_Active2.default.Mapper);\n\n    if (!authorized) {\n      _GlobalUI2.default.notifyUser('Cannot edit Public map.');\n      return;\n    }\n\n    for (var i = l - 1; i >= 0; i -= 1) {\n      var node = _Selected2.default.Nodes[i];\n      Control.removeNode(node.id);\n    }\n  },\n  removeNode: function removeNode(nodeid) {// refers to removing topics permanently from a map\n    if (!_Active2.default.Map) return;\n\n    var authorized = _Active2.default.Map.authorizeToEdit(_Active2.default.Mapper);\n    var node = _Visualize2.default.mGraph.graph.getNode(nodeid);\n\n    if (!authorized) {\n      _GlobalUI2.default.notifyUser('Cannot edit Public map.');\n      return;\n    }\n\n    var topic = node.getData('topic');\n    var mapping = node.getData('mapping');\n    mapping.destroy();\n    _DataModel2.default.Topics.remove(topic);\n    Control.hideNode(nodeid);\n  },\n  hideSelectedNodes: function hideSelectedNodes() {\n    var l = _Selected2.default.Nodes.length;\n    for (var i = l - 1; i >= 0; i -= 1) {\n      var node = _Selected2.default.Nodes[i];\n      Control.hideNode(node.id);\n    }\n  },\n  hideNode: function hideNode(nodeid) {\n    var node = _Visualize2.default.mGraph.graph.getNode(nodeid);\n    var graph = _Visualize2.default.mGraph;\n\n    Control.deselectNode(node);\n\n    node.setData('alpha', 0, 'end');\n    node.eachAdjacency(function (adj) {\n      adj.setData('alpha', 0, 'end');\n    });\n    _Visualize2.default.mGraph.fx.animate({\n      modes: ['node-property:alpha',\n      'edge-property:alpha'],\n\n      duration: 500 });\n\n    setTimeout(function () {\n      if (nodeid === _Visualize2.default.mGraph.root) {// && Visualize.type === \"RGraph\"\n        var newroot = (0, _find3.default)(graph.graph.nodes, function (n) {return n.id !== nodeid;});\n        graph.root = newroot ? newroot.id : null;\n      }\n      _Visualize2.default.mGraph.graph.removeNode(nodeid);\n    }, 500);\n    _Filter2.default.checkMetacodes();\n    _Filter2.default.checkMappers();\n  },\n  selectEdge: function selectEdge(edge) {\n    var filtered = edge.getData('alpha') === 0; // don't select if the edge is filtered\n\n    if (filtered || _Selected2.default.Edges.indexOf(edge) !== -1) return;\n\n    var width = _Mouse2.default.edgeHoveringOver === edge ? 4 : 2;\n    edge.setDataset('current', {\n      showDesc: true,\n      lineWidth: width,\n      color: _Settings2.default.colors.synapses.selected });\n\n    _Visualize2.default.mGraph.plot();\n\n    _Selected2.default.Edges.push(edge);\n  },\n  deselectAllEdges: function deselectAllEdges() {\n    var l = _Selected2.default.Edges.length;\n    for (var i = l - 1; i >= 0; i -= 1) {\n      var edge = _Selected2.default.Edges[i];\n      Control.deselectEdge(edge);\n    }\n    _Visualize2.default.mGraph.plot();\n  },\n  deselectEdge: function deselectEdge(edge) {\n    edge.setData('showDesc', false, 'current');\n\n    edge.setDataset('current', {\n      lineWidth: 2,\n      color: _Settings2.default.colors.synapses.normal });\n\n\n    if (_Mouse2.default.edgeHoveringOver === edge) {\n      edge.setDataset('current', {\n        showDesc: true,\n        lineWidth: 4 });\n\n    }\n\n    _Visualize2.default.mGraph.plot();\n\n    // remove the edge\n    _Selected2.default.Edges.splice(\n    _Selected2.default.Edges.indexOf(edge), 1);\n  },\n  deleteSelectedEdges: function deleteSelectedEdges() {// refers to deleting topics permanently\n    if (!_Active2.default.Map) return;\n\n    var authorized = _Active2.default.Map.authorizeToEdit(_Active2.default.Mapper);\n\n    if (!authorized) {\n      _GlobalUI2.default.notifyUser('Cannot edit Public map.');\n      return;\n    }\n\n    var l = _Selected2.default.Edges.length;\n    for (var i = l - 1; i >= 0; i -= 1) {\n      var edge = _Selected2.default.Edges[i];\n      Control.deleteEdge(edge);\n    }\n  },\n  deleteEdge: function deleteEdge(edge) {\n    if (!_Active2.default.Map) return;\n\n    var authorized = _Active2.default.Map.authorizeToEdit(_Active2.default.Mapper);\n\n    if (!authorized) {\n      _GlobalUI2.default.notifyUser('Cannot edit Public map.');\n      return;\n    }\n\n    var index = edge.getData('displayIndex') ? edge.getData('displayIndex') : 0;\n\n    var synapse = edge.getData('synapses')[index];\n    var mapping = edge.getData('mappings')[index];\n\n    var permToDelete = _Active2.default.Mapper.id === synapse.get('user_id') || _Active2.default.Mapper.get('admin');\n    if (permToDelete) {\n      if (edge.getData('synapses').length - 1 === 0) {\n        Control.hideEdge(edge);\n      }\n      synapse.destroy();\n\n      // the server will destroy the mapping, we just need to remove it here\n      _DataModel2.default.Mappings.remove(mapping);\n      edge.getData('mappings').splice(index, 1);\n      edge.getData('synapses').splice(index, 1);\n      if (edge.getData('displayIndex')) {\n        delete edge.data.$displayIndex;\n      }\n    } else {\n      _GlobalUI2.default.notifyUser('Only synapses you created can be deleted');\n    }\n  },\n  removeSelectedEdges: function removeSelectedEdges() {\n    // Topic view is handled by removeSelectedNodes\n    if (!_Active2.default.Map) return;\n\n    var l = _Selected2.default.Edges.length;\n\n    var authorized = _Active2.default.Map.authorizeToEdit(_Active2.default.Mapper);\n\n    if (!authorized) {\n      _GlobalUI2.default.notifyUser('Cannot edit Public map.');\n      return;\n    }\n\n    for (var i = l - 1; i >= 0; i -= 1) {\n      var edge = _Selected2.default.Edges[i];\n      Control.removeEdge(edge);\n    }\n    _Selected2.default.Edges = [];\n  },\n  removeEdge: function removeEdge(edge) {\n    if (!_Active2.default.Map) return;\n\n    var authorized = _Active2.default.Map.authorizeToEdit(_Active2.default.Mapper);\n\n    if (!authorized) {\n      _GlobalUI2.default.notifyUser('Cannot edit Public map.');\n      return;\n    }\n\n    if (edge.getData('mappings').length - 1 === 0) {\n      Control.hideEdge(edge);\n    }\n\n    var index = edge.getData('displayIndex') ? edge.getData('displayIndex') : 0;\n\n    var synapse = edge.getData('synapses')[index];\n    var mapping = edge.getData('mappings')[index];\n    mapping.destroy();\n\n    _DataModel2.default.Synapses.remove(synapse);\n\n    edge.getData('mappings').splice(index, 1);\n    edge.getData('synapses').splice(index, 1);\n    if (edge.getData('displayIndex')) {\n      delete edge.data.$displayIndex;\n    }\n  },\n  hideSelectedEdges: function hideSelectedEdges() {\n    var l = _Selected2.default.Edges.length;\n    for (var i = l - 1; i >= 0; i -= 1) {\n      var edge = _Selected2.default.Edges[i];\n      Control.hideEdge(edge);\n    }\n    _Selected2.default.Edges = [];\n  },\n  hideEdge: function hideEdge(edge) {\n    var from = edge.nodeFrom.id;\n    var to = edge.nodeTo.id;\n    edge.setData('alpha', 0, 'end');\n    Control.deselectEdge(edge);\n    _Visualize2.default.mGraph.fx.animate({\n      modes: ['edge-property:alpha'],\n      duration: 500 });\n\n    setTimeout(function () {\n      _Visualize2.default.mGraph.graph.removeAdjacence(from, to);\n    }, 500);\n    _Filter2.default.checkSynapses();\n    _Filter2.default.checkMappers();\n  },\n  updateSelectedPermissions: function updateSelectedPermissions(permission) {\n    var edge, synapse, node, topic;\n\n    _GlobalUI2.default.notifyUser('Working...');\n\n    // variables to keep track of how many nodes and synapses you had the ability to change the permission of\n    var nCount = 0;\n    var sCount = 0;\n\n    // change the permission of the selected synapses, if logged in user is the original creator\n    var edgesLength = _Selected2.default.Edges.length;\n    for (var i = edgesLength - 1; i >= 0; i -= 1) {\n      edge = _Selected2.default.Edges[i];\n      synapse = edge.getData('synapses')[0];\n\n      if (synapse.authorizePermissionChange(_Active2.default.Mapper)) {\n        synapse.save({\n          permission: permission });\n\n        sCount++;\n      }\n    }\n\n    // change the permission of the selected topics, if logged in user is the original creator\n    var nodesLength = _Selected2.default.Nodes.length;\n    for (var _i = nodesLength - 1; _i >= 0; _i -= 1) {\n      node = _Selected2.default.Nodes[_i];\n      topic = node.getData('topic');\n\n      if (topic.authorizePermissionChange(_Active2.default.Mapper)) {\n        topic.save({\n          permission: permission });\n\n        nCount++;\n      }\n    }\n\n    var nString = nCount === 1 ? nCount.toString() + ' topic and ' : nCount.toString() + ' topics and ';\n    var sString = sCount === 1 ? sCount.toString() + ' synapse' : sCount.toString() + ' synapses';\n\n    var message = nString + sString + ' you created updated to ' + permission;\n    _GlobalUI2.default.notifyUser(message);\n  },\n  updateSelectedMetacodes: function updateSelectedMetacodes(metacodeId) {\n    var node, topic;\n\n    _GlobalUI2.default.notifyUser('Working...');\n\n    var metacode = _DataModel2.default.Metacodes.get(metacodeId);\n\n    // variables to keep track of how many nodes and synapses you had the ability to change the permission of\n    var nCount = 0;\n\n    // change the permission of the selected topics, if logged in user is the original creator\n    var l = _Selected2.default.Nodes.length;\n    for (var i = l - 1; i >= 0; i -= 1) {\n      node = _Selected2.default.Nodes[i];\n      topic = node.getData('topic');\n\n      if (topic.authorizeToEdit(_Active2.default.Mapper)) {\n        topic.save({\n          'metacode_id': metacodeId });\n\n        nCount++;\n      }\n    }\n\n    var nString = nCount === 1 ? nCount.toString() + ' topic' : nCount.toString() + ' topics';\n\n    var message = nString + ' you can edit updated to ' + metacode.get('name');\n    _GlobalUI2.default.notifyUser(message);\n    _Visualize2.default.mGraph.plot();\n  } };exports.default =\n\n\nControl;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcuanMiLCJzb3VyY2VzIjpbImZyb250ZW5kL3NyYy9NZXRhbWFwcy9Db250cm9sLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCdcbmltcG9ydCBvdXRkZW50IGZyb20gJ291dGRlbnQnXG5cbmltcG9ydCBBY3RpdmUgZnJvbSAnLi9BY3RpdmUnXG5pbXBvcnQgRGF0YU1vZGVsIGZyb20gJy4vRGF0YU1vZGVsJ1xuaW1wb3J0IEVuZ2luZSBmcm9tICcuL0VuZ2luZSdcbmltcG9ydCBGaWx0ZXIgZnJvbSAnLi9GaWx0ZXInXG5pbXBvcnQgR2xvYmFsVUkgZnJvbSAnLi9HbG9iYWxVSSdcbmltcG9ydCBNb3VzZSBmcm9tICcuL01vdXNlJ1xuaW1wb3J0IFNlbGVjdGVkIGZyb20gJy4vU2VsZWN0ZWQnXG5pbXBvcnQgU2V0dGluZ3MgZnJvbSAnLi9TZXR0aW5ncydcbmltcG9ydCBWaXN1YWxpemUgZnJvbSAnLi9WaXN1YWxpemUnXG5cbmNvbnN0IENvbnRyb2wgPSB7XG4gIGluaXQ6IGZ1bmN0aW9uKCkge30sXG4gIHNlbGVjdE5vZGU6IGZ1bmN0aW9uKG5vZGUsIGUpIHtcbiAgICB2YXIgZmlsdGVyZWQgPSBub2RlLmdldERhdGEoJ2FscGhhJykgPT09IDBcblxuICAgIGlmIChmaWx0ZXJlZCB8fCBTZWxlY3RlZC5Ob2Rlcy5pbmRleE9mKG5vZGUpICE9PSAtMSkgcmV0dXJuXG4gICAgbm9kZS5zZWxlY3RlZCA9IHRydWVcbiAgICBub2RlLnNldERhdGEoJ2RpbScsIDMwLCAnY3VycmVudCcpXG4gICAgU2VsZWN0ZWQuTm9kZXMucHVzaChub2RlKVxuICB9LFxuICBkZXNlbGVjdEFsbE5vZGVzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbCA9IFNlbGVjdGVkLk5vZGVzLmxlbmd0aFxuICAgIGZvciAodmFyIGkgPSBsIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgIHZhciBub2RlID0gU2VsZWN0ZWQuTm9kZXNbaV1cbiAgICAgIENvbnRyb2wuZGVzZWxlY3ROb2RlKG5vZGUpXG4gICAgfVxuICAgIFZpc3VhbGl6ZS5tR3JhcGgucGxvdCgpXG4gIH0sXG4gIGRlc2VsZWN0Tm9kZTogZnVuY3Rpb24obm9kZSkge1xuICAgIGRlbGV0ZSBub2RlLnNlbGVjdGVkXG4gICAgbm9kZS5zZXREYXRhKCdkaW0nLCAyNSwgJ2N1cnJlbnQnKVxuXG4gICAgLy8gcmVtb3ZlIHRoZSBub2RlXG4gICAgU2VsZWN0ZWQuTm9kZXMuc3BsaWNlKFxuICAgICAgU2VsZWN0ZWQuTm9kZXMuaW5kZXhPZihub2RlKSwgMSlcbiAgfSxcbiAgZGVsZXRlU2VsZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgIGlmICghQWN0aXZlLk1hcCkgcmV0dXJuXG5cbiAgICB2YXIgbiA9IFNlbGVjdGVkLk5vZGVzLmxlbmd0aFxuICAgIHZhciBlID0gU2VsZWN0ZWQuRWRnZXMubGVuZ3RoXG4gICAgdmFyIG50ZXh0ID0gbiA9PT0gMSA/ICcxIHRvcGljJyA6IG4gKyAnIHRvcGljcydcbiAgICB2YXIgZXRleHQgPSBlID09PSAxID8gJzEgc3luYXBzZScgOiBlICsgJyBzeW5hcHNlcydcblxuICAgIHZhciBhdXRob3JpemVkID0gQWN0aXZlLk1hcC5hdXRob3JpemVUb0VkaXQoQWN0aXZlLk1hcHBlcilcblxuICAgIGlmICghYXV0aG9yaXplZCkge1xuICAgICAgR2xvYmFsVUkubm90aWZ5VXNlcignQ2Fubm90IGVkaXQgUHVibGljIG1hcC4nKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIHIgPSB3aW5kb3cuY29uZmlybShvdXRkZW50YFxuICAgICAgWW91IGhhdmUgJHtudGV4dH0gYW5kICR7ZXRleHR9IHNlbGVjdGVkLiBBcmUgeW91IHN1cmUgeW91IHdhbnRcbiAgICAgIHRvIHBlcm1hbmVudGx5IGRlbGV0ZSB0aGVtIGFsbD8gVGhpcyB3aWxsIHJlbW92ZSB0aGVtIGZyb20gYWxsXG4gICAgICBtYXBzIHRoZXkgYXBwZWFyIG9uLmApXG4gICAgaWYgKHIpIHtcbiAgICAgIENvbnRyb2wuZGVsZXRlU2VsZWN0ZWRFZGdlcygpXG4gICAgICBDb250cm9sLmRlbGV0ZVNlbGVjdGVkTm9kZXMoKVxuICAgIH1cblxuICAgIGlmIChEYXRhTW9kZWwuVG9waWNzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgR2xvYmFsVUkuc2hvd0RpdignI2luc3RydWN0aW9ucycpXG4gICAgfVxuICB9LFxuICBkZWxldGVTZWxlY3RlZE5vZGVzOiBmdW5jdGlvbigpIHsgLy8gcmVmZXJzIHRvIGRlbGV0aW5nIHRvcGljcyBwZXJtYW5lbnRseVxuICAgIGlmICghQWN0aXZlLk1hcCkgcmV0dXJuXG5cbiAgICB2YXIgYXV0aG9yaXplZCA9IEFjdGl2ZS5NYXAuYXV0aG9yaXplVG9FZGl0KEFjdGl2ZS5NYXBwZXIpXG5cbiAgICBpZiAoIWF1dGhvcml6ZWQpIHtcbiAgICAgIEdsb2JhbFVJLm5vdGlmeVVzZXIoJ0Nhbm5vdCBlZGl0IFB1YmxpYyBtYXAuJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciBsID0gU2VsZWN0ZWQuTm9kZXMubGVuZ3RoXG4gICAgZm9yICh2YXIgaSA9IGwgLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgdmFyIG5vZGUgPSBTZWxlY3RlZC5Ob2Rlc1tpXVxuICAgICAgQ29udHJvbC5kZWxldGVOb2RlKG5vZGUuaWQpXG4gICAgfVxuICB9LFxuICBkZWxldGVOb2RlOiBmdW5jdGlvbihub2RlaWQpIHsgLy8gcmVmZXJzIHRvIGRlbGV0aW5nIHRvcGljcyBwZXJtYW5lbnRseVxuICAgIGlmICghQWN0aXZlLk1hcCkgcmV0dXJuXG5cbiAgICB2YXIgYXV0aG9yaXplZCA9IEFjdGl2ZS5NYXAuYXV0aG9yaXplVG9FZGl0KEFjdGl2ZS5NYXBwZXIpXG5cbiAgICBpZiAoIWF1dGhvcml6ZWQpIHtcbiAgICAgIEdsb2JhbFVJLm5vdGlmeVVzZXIoJ0Nhbm5vdCBlZGl0IFB1YmxpYyBtYXAuJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciBub2RlID0gVmlzdWFsaXplLm1HcmFwaC5ncmFwaC5nZXROb2RlKG5vZGVpZClcbiAgICB2YXIgdG9waWMgPSBub2RlLmdldERhdGEoJ3RvcGljJylcblxuICAgIHZhciBwZXJtVG9EZWxldGUgPSBBY3RpdmUuTWFwcGVyLmlkID09PSB0b3BpYy5nZXQoJ3VzZXJfaWQnKSB8fCBBY3RpdmUuTWFwcGVyLmdldCgnYWRtaW4nKVxuICAgIGlmIChwZXJtVG9EZWxldGUpIHtcbiAgICAgIHZhciBtYXBwaW5nID0gbm9kZS5nZXREYXRhKCdtYXBwaW5nJylcbiAgICAgIHRvcGljLmRlc3Ryb3koKVxuICAgICAgRGF0YU1vZGVsLk1hcHBpbmdzLnJlbW92ZShtYXBwaW5nKVxuICAgICAgQ29udHJvbC5oaWRlTm9kZShub2RlaWQpXG4gICAgfSBlbHNlIHtcbiAgICAgIEdsb2JhbFVJLm5vdGlmeVVzZXIoJ09ubHkgdG9waWNzIHlvdSBjcmVhdGVkIGNhbiBiZSBkZWxldGVkJylcbiAgICB9XG4gIH0sXG4gIHJlbW92ZVNlbGVjdGVkTm9kZXM6IGZ1bmN0aW9uKCkgeyAvLyByZWZlcnMgdG8gcmVtb3ZpbmcgdG9waWNzIHBlcm1hbmVudGx5IGZyb20gYSBtYXBcbiAgICBpZiAoQWN0aXZlLlRvcGljKSB7XG4gICAgICAvLyBoaWRlTm9kZSB3aWxsIGhhbmRsZSBzeW5hcHNlcyBhcyB3ZWxsXG4gICAgICB2YXIgbm9kZWlkcyA9IF8ubWFwKFNlbGVjdGVkLk5vZGVzLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmlkXG4gICAgICB9KVxuICAgICAgXy5lYWNoKG5vZGVpZHMsIGZ1bmN0aW9uKG5vZGVpZCkge1xuICAgICAgICBpZiAoQWN0aXZlLlRvcGljLmlkICE9PSBub2RlaWQpIHtcbiAgICAgICAgICBEYXRhTW9kZWwuVG9waWNzLnJlbW92ZShub2RlaWQpXG4gICAgICAgICAgQ29udHJvbC5oaWRlTm9kZShub2RlaWQpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCFBY3RpdmUuTWFwKSByZXR1cm5cblxuICAgIGNvbnN0IGwgPSBTZWxlY3RlZC5Ob2Rlcy5sZW5ndGhcbiAgICBjb25zdCBhdXRob3JpemVkID0gQWN0aXZlLk1hcC5hdXRob3JpemVUb0VkaXQoQWN0aXZlLk1hcHBlcilcblxuICAgIGlmICghYXV0aG9yaXplZCkge1xuICAgICAgR2xvYmFsVUkubm90aWZ5VXNlcignQ2Fubm90IGVkaXQgUHVibGljIG1hcC4nKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IGwgLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgY29uc3Qgbm9kZSA9IFNlbGVjdGVkLk5vZGVzW2ldXG4gICAgICBDb250cm9sLnJlbW92ZU5vZGUobm9kZS5pZClcbiAgICB9XG4gIH0sXG4gIHJlbW92ZU5vZGU6IGZ1bmN0aW9uKG5vZGVpZCkgeyAvLyByZWZlcnMgdG8gcmVtb3ZpbmcgdG9waWNzIHBlcm1hbmVudGx5IGZyb20gYSBtYXBcbiAgICBpZiAoIUFjdGl2ZS5NYXApIHJldHVyblxuXG4gICAgdmFyIGF1dGhvcml6ZWQgPSBBY3RpdmUuTWFwLmF1dGhvcml6ZVRvRWRpdChBY3RpdmUuTWFwcGVyKVxuICAgIHZhciBub2RlID0gVmlzdWFsaXplLm1HcmFwaC5ncmFwaC5nZXROb2RlKG5vZGVpZClcblxuICAgIGlmICghYXV0aG9yaXplZCkge1xuICAgICAgR2xvYmFsVUkubm90aWZ5VXNlcignQ2Fubm90IGVkaXQgUHVibGljIG1hcC4nKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIHRvcGljID0gbm9kZS5nZXREYXRhKCd0b3BpYycpXG4gICAgdmFyIG1hcHBpbmcgPSBub2RlLmdldERhdGEoJ21hcHBpbmcnKVxuICAgIG1hcHBpbmcuZGVzdHJveSgpXG4gICAgRGF0YU1vZGVsLlRvcGljcy5yZW1vdmUodG9waWMpXG4gICAgQ29udHJvbC5oaWRlTm9kZShub2RlaWQpXG4gIH0sXG4gIGhpZGVTZWxlY3RlZE5vZGVzOiBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBsID0gU2VsZWN0ZWQuTm9kZXMubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IGwgLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgY29uc3Qgbm9kZSA9IFNlbGVjdGVkLk5vZGVzW2ldXG4gICAgICBDb250cm9sLmhpZGVOb2RlKG5vZGUuaWQpXG4gICAgfVxuICB9LFxuICBoaWRlTm9kZTogZnVuY3Rpb24obm9kZWlkKSB7XG4gICAgdmFyIG5vZGUgPSBWaXN1YWxpemUubUdyYXBoLmdyYXBoLmdldE5vZGUobm9kZWlkKVxuICAgIHZhciBncmFwaCA9IFZpc3VhbGl6ZS5tR3JhcGhcblxuICAgIENvbnRyb2wuZGVzZWxlY3ROb2RlKG5vZGUpXG5cbiAgICBub2RlLnNldERhdGEoJ2FscGhhJywgMCwgJ2VuZCcpXG4gICAgbm9kZS5lYWNoQWRqYWNlbmN5KGZ1bmN0aW9uKGFkaikge1xuICAgICAgYWRqLnNldERhdGEoJ2FscGhhJywgMCwgJ2VuZCcpXG4gICAgfSlcbiAgICBWaXN1YWxpemUubUdyYXBoLmZ4LmFuaW1hdGUoe1xuICAgICAgbW9kZXM6IFsnbm9kZS1wcm9wZXJ0eTphbHBoYScsXG4gICAgICAgICdlZGdlLXByb3BlcnR5OmFscGhhJ1xuICAgICAgXSxcbiAgICAgIGR1cmF0aW9uOiA1MDBcbiAgICB9KVxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAobm9kZWlkID09PSBWaXN1YWxpemUubUdyYXBoLnJvb3QpIHsgLy8gJiYgVmlzdWFsaXplLnR5cGUgPT09IFwiUkdyYXBoXCJcbiAgICAgICAgdmFyIG5ld3Jvb3QgPSBfLmZpbmQoZ3JhcGguZ3JhcGgubm9kZXMsIGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4uaWQgIT09IG5vZGVpZCB9KVxuICAgICAgICBncmFwaC5yb290ID0gbmV3cm9vdCA/IG5ld3Jvb3QuaWQgOiBudWxsXG4gICAgICB9XG4gICAgICBWaXN1YWxpemUubUdyYXBoLmdyYXBoLnJlbW92ZU5vZGUobm9kZWlkKVxuICAgIH0sIDUwMClcbiAgICBGaWx0ZXIuY2hlY2tNZXRhY29kZXMoKVxuICAgIEZpbHRlci5jaGVja01hcHBlcnMoKVxuICB9LFxuICBzZWxlY3RFZGdlOiBmdW5jdGlvbihlZGdlKSB7XG4gICAgdmFyIGZpbHRlcmVkID0gZWRnZS5nZXREYXRhKCdhbHBoYScpID09PSAwIC8vIGRvbid0IHNlbGVjdCBpZiB0aGUgZWRnZSBpcyBmaWx0ZXJlZFxuXG4gICAgaWYgKGZpbHRlcmVkIHx8IFNlbGVjdGVkLkVkZ2VzLmluZGV4T2YoZWRnZSkgIT09IC0xKSByZXR1cm5cblxuICAgIHZhciB3aWR0aCA9IE1vdXNlLmVkZ2VIb3ZlcmluZ092ZXIgPT09IGVkZ2UgPyA0IDogMlxuICAgIGVkZ2Uuc2V0RGF0YXNldCgnY3VycmVudCcsIHtcbiAgICAgIHNob3dEZXNjOiB0cnVlLFxuICAgICAgbGluZVdpZHRoOiB3aWR0aCxcbiAgICAgIGNvbG9yOiBTZXR0aW5ncy5jb2xvcnMuc3luYXBzZXMuc2VsZWN0ZWRcbiAgICB9KVxuICAgIFZpc3VhbGl6ZS5tR3JhcGgucGxvdCgpXG5cbiAgICBTZWxlY3RlZC5FZGdlcy5wdXNoKGVkZ2UpXG4gIH0sXG4gIGRlc2VsZWN0QWxsRWRnZXM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBsID0gU2VsZWN0ZWQuRWRnZXMubGVuZ3RoXG4gICAgZm9yICh2YXIgaSA9IGwgLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgdmFyIGVkZ2UgPSBTZWxlY3RlZC5FZGdlc1tpXVxuICAgICAgQ29udHJvbC5kZXNlbGVjdEVkZ2UoZWRnZSlcbiAgICB9XG4gICAgVmlzdWFsaXplLm1HcmFwaC5wbG90KClcbiAgfSxcbiAgZGVzZWxlY3RFZGdlOiBmdW5jdGlvbihlZGdlKSB7XG4gICAgZWRnZS5zZXREYXRhKCdzaG93RGVzYycsIGZhbHNlLCAnY3VycmVudCcpXG5cbiAgICBlZGdlLnNldERhdGFzZXQoJ2N1cnJlbnQnLCB7XG4gICAgICBsaW5lV2lkdGg6IDIsXG4gICAgICBjb2xvcjogU2V0dGluZ3MuY29sb3JzLnN5bmFwc2VzLm5vcm1hbFxuICAgIH0pXG5cbiAgICBpZiAoTW91c2UuZWRnZUhvdmVyaW5nT3ZlciA9PT0gZWRnZSkge1xuICAgICAgZWRnZS5zZXREYXRhc2V0KCdjdXJyZW50Jywge1xuICAgICAgICBzaG93RGVzYzogdHJ1ZSxcbiAgICAgICAgbGluZVdpZHRoOiA0XG4gICAgICB9KVxuICAgIH1cblxuICAgIFZpc3VhbGl6ZS5tR3JhcGgucGxvdCgpXG5cbiAgICAvLyByZW1vdmUgdGhlIGVkZ2VcbiAgICBTZWxlY3RlZC5FZGdlcy5zcGxpY2UoXG4gICAgICBTZWxlY3RlZC5FZGdlcy5pbmRleE9mKGVkZ2UpLCAxKVxuICB9LFxuICBkZWxldGVTZWxlY3RlZEVkZ2VzOiBmdW5jdGlvbigpIHsgLy8gcmVmZXJzIHRvIGRlbGV0aW5nIHRvcGljcyBwZXJtYW5lbnRseVxuICAgIGlmICghQWN0aXZlLk1hcCkgcmV0dXJuXG5cbiAgICB2YXIgYXV0aG9yaXplZCA9IEFjdGl2ZS5NYXAuYXV0aG9yaXplVG9FZGl0KEFjdGl2ZS5NYXBwZXIpXG5cbiAgICBpZiAoIWF1dGhvcml6ZWQpIHtcbiAgICAgIEdsb2JhbFVJLm5vdGlmeVVzZXIoJ0Nhbm5vdCBlZGl0IFB1YmxpYyBtYXAuJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGwgPSBTZWxlY3RlZC5FZGdlcy5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gbCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgICBjb25zdCBlZGdlID0gU2VsZWN0ZWQuRWRnZXNbaV1cbiAgICAgIENvbnRyb2wuZGVsZXRlRWRnZShlZGdlKVxuICAgIH1cbiAgfSxcbiAgZGVsZXRlRWRnZTogZnVuY3Rpb24oZWRnZSkge1xuICAgIGlmICghQWN0aXZlLk1hcCkgcmV0dXJuXG5cbiAgICB2YXIgYXV0aG9yaXplZCA9IEFjdGl2ZS5NYXAuYXV0aG9yaXplVG9FZGl0KEFjdGl2ZS5NYXBwZXIpXG5cbiAgICBpZiAoIWF1dGhvcml6ZWQpIHtcbiAgICAgIEdsb2JhbFVJLm5vdGlmeVVzZXIoJ0Nhbm5vdCBlZGl0IFB1YmxpYyBtYXAuJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciBpbmRleCA9IGVkZ2UuZ2V0RGF0YSgnZGlzcGxheUluZGV4JykgPyBlZGdlLmdldERhdGEoJ2Rpc3BsYXlJbmRleCcpIDogMFxuXG4gICAgdmFyIHN5bmFwc2UgPSBlZGdlLmdldERhdGEoJ3N5bmFwc2VzJylbaW5kZXhdXG4gICAgdmFyIG1hcHBpbmcgPSBlZGdlLmdldERhdGEoJ21hcHBpbmdzJylbaW5kZXhdXG5cbiAgICB2YXIgcGVybVRvRGVsZXRlID0gQWN0aXZlLk1hcHBlci5pZCA9PT0gc3luYXBzZS5nZXQoJ3VzZXJfaWQnKSB8fCBBY3RpdmUuTWFwcGVyLmdldCgnYWRtaW4nKVxuICAgIGlmIChwZXJtVG9EZWxldGUpIHtcbiAgICAgIGlmIChlZGdlLmdldERhdGEoJ3N5bmFwc2VzJykubGVuZ3RoIC0gMSA9PT0gMCkge1xuICAgICAgICBDb250cm9sLmhpZGVFZGdlKGVkZ2UpXG4gICAgICB9XG4gICAgICBzeW5hcHNlLmRlc3Ryb3koKVxuXG4gICAgICAvLyB0aGUgc2VydmVyIHdpbGwgZGVzdHJveSB0aGUgbWFwcGluZywgd2UganVzdCBuZWVkIHRvIHJlbW92ZSBpdCBoZXJlXG4gICAgICBEYXRhTW9kZWwuTWFwcGluZ3MucmVtb3ZlKG1hcHBpbmcpXG4gICAgICBlZGdlLmdldERhdGEoJ21hcHBpbmdzJykuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgZWRnZS5nZXREYXRhKCdzeW5hcHNlcycpLnNwbGljZShpbmRleCwgMSlcbiAgICAgIGlmIChlZGdlLmdldERhdGEoJ2Rpc3BsYXlJbmRleCcpKSB7XG4gICAgICAgIGRlbGV0ZSBlZGdlLmRhdGEuJGRpc3BsYXlJbmRleFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBHbG9iYWxVSS5ub3RpZnlVc2VyKCdPbmx5IHN5bmFwc2VzIHlvdSBjcmVhdGVkIGNhbiBiZSBkZWxldGVkJylcbiAgICB9XG4gIH0sXG4gIHJlbW92ZVNlbGVjdGVkRWRnZXM6IGZ1bmN0aW9uKCkge1xuICAgIC8vIFRvcGljIHZpZXcgaXMgaGFuZGxlZCBieSByZW1vdmVTZWxlY3RlZE5vZGVzXG4gICAgaWYgKCFBY3RpdmUuTWFwKSByZXR1cm5cblxuICAgIGNvbnN0IGwgPSBTZWxlY3RlZC5FZGdlcy5sZW5ndGhcblxuICAgIHZhciBhdXRob3JpemVkID0gQWN0aXZlLk1hcC5hdXRob3JpemVUb0VkaXQoQWN0aXZlLk1hcHBlcilcblxuICAgIGlmICghYXV0aG9yaXplZCkge1xuICAgICAgR2xvYmFsVUkubm90aWZ5VXNlcignQ2Fubm90IGVkaXQgUHVibGljIG1hcC4nKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IGwgLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgY29uc3QgZWRnZSA9IFNlbGVjdGVkLkVkZ2VzW2ldXG4gICAgICBDb250cm9sLnJlbW92ZUVkZ2UoZWRnZSlcbiAgICB9XG4gICAgU2VsZWN0ZWQuRWRnZXMgPSBbIF1cbiAgfSxcbiAgcmVtb3ZlRWRnZTogZnVuY3Rpb24oZWRnZSkge1xuICAgIGlmICghQWN0aXZlLk1hcCkgcmV0dXJuXG5cbiAgICB2YXIgYXV0aG9yaXplZCA9IEFjdGl2ZS5NYXAuYXV0aG9yaXplVG9FZGl0KEFjdGl2ZS5NYXBwZXIpXG5cbiAgICBpZiAoIWF1dGhvcml6ZWQpIHtcbiAgICAgIEdsb2JhbFVJLm5vdGlmeVVzZXIoJ0Nhbm5vdCBlZGl0IFB1YmxpYyBtYXAuJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChlZGdlLmdldERhdGEoJ21hcHBpbmdzJykubGVuZ3RoIC0gMSA9PT0gMCkge1xuICAgICAgQ29udHJvbC5oaWRlRWRnZShlZGdlKVxuICAgIH1cblxuICAgIHZhciBpbmRleCA9IGVkZ2UuZ2V0RGF0YSgnZGlzcGxheUluZGV4JykgPyBlZGdlLmdldERhdGEoJ2Rpc3BsYXlJbmRleCcpIDogMFxuXG4gICAgdmFyIHN5bmFwc2UgPSBlZGdlLmdldERhdGEoJ3N5bmFwc2VzJylbaW5kZXhdXG4gICAgdmFyIG1hcHBpbmcgPSBlZGdlLmdldERhdGEoJ21hcHBpbmdzJylbaW5kZXhdXG4gICAgbWFwcGluZy5kZXN0cm95KClcblxuICAgIERhdGFNb2RlbC5TeW5hcHNlcy5yZW1vdmUoc3luYXBzZSlcblxuICAgIGVkZ2UuZ2V0RGF0YSgnbWFwcGluZ3MnKS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgZWRnZS5nZXREYXRhKCdzeW5hcHNlcycpLnNwbGljZShpbmRleCwgMSlcbiAgICBpZiAoZWRnZS5nZXREYXRhKCdkaXNwbGF5SW5kZXgnKSkge1xuICAgICAgZGVsZXRlIGVkZ2UuZGF0YS4kZGlzcGxheUluZGV4XG4gICAgfVxuICB9LFxuICBoaWRlU2VsZWN0ZWRFZGdlczogZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbCA9IFNlbGVjdGVkLkVkZ2VzLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSBsIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgIGNvbnN0IGVkZ2UgPSBTZWxlY3RlZC5FZGdlc1tpXVxuICAgICAgQ29udHJvbC5oaWRlRWRnZShlZGdlKVxuICAgIH1cbiAgICBTZWxlY3RlZC5FZGdlcyA9IFsgXVxuICB9LFxuICBoaWRlRWRnZTogZnVuY3Rpb24oZWRnZSkge1xuICAgIHZhciBmcm9tID0gZWRnZS5ub2RlRnJvbS5pZFxuICAgIHZhciB0byA9IGVkZ2Uubm9kZVRvLmlkXG4gICAgZWRnZS5zZXREYXRhKCdhbHBoYScsIDAsICdlbmQnKVxuICAgIENvbnRyb2wuZGVzZWxlY3RFZGdlKGVkZ2UpXG4gICAgVmlzdWFsaXplLm1HcmFwaC5meC5hbmltYXRlKHtcbiAgICAgIG1vZGVzOiBbJ2VkZ2UtcHJvcGVydHk6YWxwaGEnXSxcbiAgICAgIGR1cmF0aW9uOiA1MDBcbiAgICB9KVxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBWaXN1YWxpemUubUdyYXBoLmdyYXBoLnJlbW92ZUFkamFjZW5jZShmcm9tLCB0bylcbiAgICB9LCA1MDApXG4gICAgRmlsdGVyLmNoZWNrU3luYXBzZXMoKVxuICAgIEZpbHRlci5jaGVja01hcHBlcnMoKVxuICB9LFxuICB1cGRhdGVTZWxlY3RlZFBlcm1pc3Npb25zOiBmdW5jdGlvbihwZXJtaXNzaW9uKSB7XG4gICAgdmFyIGVkZ2UsIHN5bmFwc2UsIG5vZGUsIHRvcGljXG5cbiAgICBHbG9iYWxVSS5ub3RpZnlVc2VyKCdXb3JraW5nLi4uJylcblxuICAgIC8vIHZhcmlhYmxlcyB0byBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IG5vZGVzIGFuZCBzeW5hcHNlcyB5b3UgaGFkIHRoZSBhYmlsaXR5IHRvIGNoYW5nZSB0aGUgcGVybWlzc2lvbiBvZlxuICAgIHZhciBuQ291bnQgPSAwXG4gICAgdmFyIHNDb3VudCA9IDBcblxuICAgIC8vIGNoYW5nZSB0aGUgcGVybWlzc2lvbiBvZiB0aGUgc2VsZWN0ZWQgc3luYXBzZXMsIGlmIGxvZ2dlZCBpbiB1c2VyIGlzIHRoZSBvcmlnaW5hbCBjcmVhdG9yXG4gICAgY29uc3QgZWRnZXNMZW5ndGggPSBTZWxlY3RlZC5FZGdlcy5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gZWRnZXNMZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgZWRnZSA9IFNlbGVjdGVkLkVkZ2VzW2ldXG4gICAgICBzeW5hcHNlID0gZWRnZS5nZXREYXRhKCdzeW5hcHNlcycpWzBdXG5cbiAgICAgIGlmIChzeW5hcHNlLmF1dGhvcml6ZVBlcm1pc3Npb25DaGFuZ2UoQWN0aXZlLk1hcHBlcikpIHtcbiAgICAgICAgc3luYXBzZS5zYXZlKHtcbiAgICAgICAgICBwZXJtaXNzaW9uOiBwZXJtaXNzaW9uXG4gICAgICAgIH0pXG4gICAgICAgIHNDb3VudCsrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY2hhbmdlIHRoZSBwZXJtaXNzaW9uIG9mIHRoZSBzZWxlY3RlZCB0b3BpY3MsIGlmIGxvZ2dlZCBpbiB1c2VyIGlzIHRoZSBvcmlnaW5hbCBjcmVhdG9yXG4gICAgY29uc3Qgbm9kZXNMZW5ndGggPSBTZWxlY3RlZC5Ob2Rlcy5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gbm9kZXNMZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgbm9kZSA9IFNlbGVjdGVkLk5vZGVzW2ldXG4gICAgICB0b3BpYyA9IG5vZGUuZ2V0RGF0YSgndG9waWMnKVxuXG4gICAgICBpZiAodG9waWMuYXV0aG9yaXplUGVybWlzc2lvbkNoYW5nZShBY3RpdmUuTWFwcGVyKSkge1xuICAgICAgICB0b3BpYy5zYXZlKHtcbiAgICAgICAgICBwZXJtaXNzaW9uOiBwZXJtaXNzaW9uXG4gICAgICAgIH0pXG4gICAgICAgIG5Db3VudCsrXG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG5TdHJpbmcgPSBuQ291bnQgPT09IDEgPyAobkNvdW50LnRvU3RyaW5nKCkgKyAnIHRvcGljIGFuZCAnKSA6IChuQ291bnQudG9TdHJpbmcoKSArICcgdG9waWNzIGFuZCAnKVxuICAgIHZhciBzU3RyaW5nID0gc0NvdW50ID09PSAxID8gKHNDb3VudC50b1N0cmluZygpICsgJyBzeW5hcHNlJykgOiAoc0NvdW50LnRvU3RyaW5nKCkgKyAnIHN5bmFwc2VzJylcblxuICAgIHZhciBtZXNzYWdlID0gblN0cmluZyArIHNTdHJpbmcgKyAnIHlvdSBjcmVhdGVkIHVwZGF0ZWQgdG8gJyArIHBlcm1pc3Npb25cbiAgICBHbG9iYWxVSS5ub3RpZnlVc2VyKG1lc3NhZ2UpXG4gIH0sXG4gIHVwZGF0ZVNlbGVjdGVkTWV0YWNvZGVzOiBmdW5jdGlvbihtZXRhY29kZUlkKSB7XG4gICAgdmFyIG5vZGUsIHRvcGljXG5cbiAgICBHbG9iYWxVSS5ub3RpZnlVc2VyKCdXb3JraW5nLi4uJylcblxuICAgIHZhciBtZXRhY29kZSA9IERhdGFNb2RlbC5NZXRhY29kZXMuZ2V0KG1ldGFjb2RlSWQpXG5cbiAgICAvLyB2YXJpYWJsZXMgdG8ga2VlcCB0cmFjayBvZiBob3cgbWFueSBub2RlcyBhbmQgc3luYXBzZXMgeW91IGhhZCB0aGUgYWJpbGl0eSB0byBjaGFuZ2UgdGhlIHBlcm1pc3Npb24gb2ZcbiAgICB2YXIgbkNvdW50ID0gMFxuXG4gICAgLy8gY2hhbmdlIHRoZSBwZXJtaXNzaW9uIG9mIHRoZSBzZWxlY3RlZCB0b3BpY3MsIGlmIGxvZ2dlZCBpbiB1c2VyIGlzIHRoZSBvcmlnaW5hbCBjcmVhdG9yXG4gICAgdmFyIGwgPSBTZWxlY3RlZC5Ob2Rlcy5sZW5ndGhcbiAgICBmb3IgKHZhciBpID0gbCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgICBub2RlID0gU2VsZWN0ZWQuTm9kZXNbaV1cbiAgICAgIHRvcGljID0gbm9kZS5nZXREYXRhKCd0b3BpYycpXG5cbiAgICAgIGlmICh0b3BpYy5hdXRob3JpemVUb0VkaXQoQWN0aXZlLk1hcHBlcikpIHtcbiAgICAgICAgdG9waWMuc2F2ZSh7XG4gICAgICAgICAgJ21ldGFjb2RlX2lkJzogbWV0YWNvZGVJZFxuICAgICAgICB9KVxuICAgICAgICBuQ291bnQrK1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBuU3RyaW5nID0gbkNvdW50ID09PSAxID8gKG5Db3VudC50b1N0cmluZygpICsgJyB0b3BpYycpIDogKG5Db3VudC50b1N0cmluZygpICsgJyB0b3BpY3MnKVxuXG4gICAgdmFyIG1lc3NhZ2UgPSBuU3RyaW5nICsgJyB5b3UgY2FuIGVkaXQgdXBkYXRlZCB0byAnICsgbWV0YWNvZGUuZ2V0KCduYW1lJylcbiAgICBHbG9iYWxVSS5ub3RpZnlVc2VyKG1lc3NhZ2UpXG4gICAgVmlzdWFsaXplLm1HcmFwaC5wbG90KClcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb250cm9sXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL01ldGFtYXBzL0NvbnRyb2wuanMiXSwibWFwcGluZ3MiOiI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 28 */
/***/ function(module, exports, __webpack_require__) {

    eval("var createFind = __webpack_require__(29),\n    findIndex = __webpack_require__(136);\n\n/**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n *   { 'user': 'barney',  'age': 36, 'active': true },\n *   { 'user': 'fred',    'age': 40, 'active': false },\n *   { 'user': 'pebbles', 'age': 1,  'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\nvar find = createFind(findIndex);\n\nmodule.exports = find;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjguanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9maW5kLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBjcmVhdGVGaW5kID0gcmVxdWlyZSgnLi9fY3JlYXRlRmluZCcpLFxuICAgIGZpbmRJbmRleCA9IHJlcXVpcmUoJy4vZmluZEluZGV4Jyk7XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyB0aGUgZmlyc3QgZWxlbWVudFxuICogYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aHJlZVxuICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEsICAnYWN0aXZlJzogdHJ1ZSB9XG4gKiBdO1xuICpcbiAqIF8uZmluZCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gKiAvLyA9PiBvYmplY3QgZm9yICdiYXJuZXknXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZCh1c2VycywgeyAnYWdlJzogMSwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gKiAvLyA9PiBvYmplY3QgZm9yICdwZWJibGVzJ1xuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICogLy8gPT4gb2JqZWN0IGZvciAnZnJlZCdcbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZCh1c2VycywgJ2FjdGl2ZScpO1xuICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICovXG52YXIgZmluZCA9IGNyZWF0ZUZpbmQoZmluZEluZGV4KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmaW5kO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9maW5kLmpzXG4vLyBtb2R1bGUgaWQgPSAyOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 29 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseIteratee = __webpack_require__(30),\n    isArrayLike = __webpack_require__(108),\n    keys = __webpack_require__(90);\n\n/**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\nfunction createFind(findIndexFunc) {\n  return function(collection, predicate, fromIndex) {\n    var iterable = Object(collection);\n    if (!isArrayLike(collection)) {\n      var iteratee = baseIteratee(predicate, 3);\n      collection = keys(collection);\n      predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n    }\n    var index = findIndexFunc(collection, predicate, fromIndex);\n    return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n  };\n}\n\nmodule.exports = createFind;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjkuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlRmluZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUl0ZXJhdGVlID0gcmVxdWlyZSgnLi9fYmFzZUl0ZXJhdGVlJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgXy5maW5kYCBvciBgXy5maW5kTGFzdGAgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbmRJbmRleEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGNvbGxlY3Rpb24gaW5kZXguXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmaW5kIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVGaW5kKGZpbmRJbmRleEZ1bmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7XG4gICAgdmFyIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuICAgIGlmICghaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGJhc2VJdGVyYXRlZShwcmVkaWNhdGUsIDMpO1xuICAgICAgY29sbGVjdGlvbiA9IGtleXMoY29sbGVjdGlvbik7XG4gICAgICBwcmVkaWNhdGUgPSBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpOyB9O1xuICAgIH1cbiAgICB2YXIgaW5kZXggPSBmaW5kSW5kZXhGdW5jKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZnJvbUluZGV4KTtcbiAgICByZXR1cm4gaW5kZXggPiAtMSA/IGl0ZXJhYmxlW2l0ZXJhdGVlID8gY29sbGVjdGlvbltpbmRleF0gOiBpbmRleF0gOiB1bmRlZmluZWQ7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlRmluZDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2NyZWF0ZUZpbmQuanNcbi8vIG1vZHVsZSBpZCA9IDI5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 30 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseMatches = __webpack_require__(31),\n    baseMatchesProperty = __webpack_require__(117),\n    identity = __webpack_require__(132),\n    isArray = __webpack_require__(86),\n    property = __webpack_require__(133);\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n  // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n  // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n  if (typeof value == 'function') {\n    return value;\n  }\n  if (value == null) {\n    return identity;\n  }\n  if (typeof value == 'object') {\n    return isArray(value)\n      ? baseMatchesProperty(value[0], value[1])\n      : baseMatches(value);\n  }\n  return property(value);\n}\n\nmodule.exports = baseIteratee;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzAuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUl0ZXJhdGVlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlTWF0Y2hlcyA9IHJlcXVpcmUoJy4vX2Jhc2VNYXRjaGVzJyksXG4gICAgYmFzZU1hdGNoZXNQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2Jhc2VNYXRjaGVzUHJvcGVydHknKSxcbiAgICBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgcHJvcGVydHkgPSByZXF1aXJlKCcuL3Byb3BlcnR5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXRlcmF0ZWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IFt2YWx1ZT1fLmlkZW50aXR5XSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhbiBpdGVyYXRlZS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgaXRlcmF0ZWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJdGVyYXRlZSh2YWx1ZSkge1xuICAvLyBEb24ndCBzdG9yZSB0aGUgYHR5cGVvZmAgcmVzdWx0IGluIGEgdmFyaWFibGUgdG8gYXZvaWQgYSBKSVQgYnVnIGluIFNhZmFyaSA5LlxuICAvLyBTZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjAzNCBmb3IgbW9yZSBkZXRhaWxzLlxuICBpZiAodHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBpc0FycmF5KHZhbHVlKVxuICAgICAgPyBiYXNlTWF0Y2hlc1Byb3BlcnR5KHZhbHVlWzBdLCB2YWx1ZVsxXSlcbiAgICAgIDogYmFzZU1hdGNoZXModmFsdWUpO1xuICB9XG4gIHJldHVybiBwcm9wZXJ0eSh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUl0ZXJhdGVlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZUl0ZXJhdGVlLmpzXG4vLyBtb2R1bGUgaWQgPSAzMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 31 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseIsMatch = __webpack_require__(32),\n    getMatchData = __webpack_require__(114),\n    matchesStrictComparable = __webpack_require__(116);\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n  var matchData = getMatchData(source);\n  if (matchData.length == 1 && matchData[0][2]) {\n    return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n  }\n  return function(object) {\n    return object === source || baseIsMatch(object, source, matchData);\n  };\n}\n\nmodule.exports = baseMatches;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzEuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU1hdGNoZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VJc01hdGNoID0gcmVxdWlyZSgnLi9fYmFzZUlzTWF0Y2gnKSxcbiAgICBnZXRNYXRjaERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXRjaERhdGEnKSxcbiAgICBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSA9IHJlcXVpcmUoJy4vX21hdGNoZXNTdHJpY3RDb21wYXJhYmxlJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWF0Y2hlc2Agd2hpY2ggZG9lc24ndCBjbG9uZSBgc291cmNlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VNYXRjaGVzKHNvdXJjZSkge1xuICB2YXIgbWF0Y2hEYXRhID0gZ2V0TWF0Y2hEYXRhKHNvdXJjZSk7XG4gIGlmIChtYXRjaERhdGEubGVuZ3RoID09IDEgJiYgbWF0Y2hEYXRhWzBdWzJdKSB7XG4gICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKG1hdGNoRGF0YVswXVswXSwgbWF0Y2hEYXRhWzBdWzFdKTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdCA9PT0gc291cmNlIHx8IGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VNYXRjaGVzO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZU1hdGNoZXMuanNcbi8vIG1vZHVsZSBpZCA9IDMxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 32 */
/***/ function(module, exports, __webpack_require__) {

    eval("var Stack = __webpack_require__(33),\n    baseIsEqual = __webpack_require__(70);\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n  var index = matchData.length,\n      length = index,\n      noCustomizer = !customizer;\n\n  if (object == null) {\n    return !length;\n  }\n  object = Object(object);\n  while (index--) {\n    var data = matchData[index];\n    if ((noCustomizer && data[2])\n          ? data[1] !== object[data[0]]\n          : !(data[0] in object)\n        ) {\n      return false;\n    }\n  }\n  while (++index < length) {\n    data = matchData[index];\n    var key = data[0],\n        objValue = object[key],\n        srcValue = data[1];\n\n    if (noCustomizer && data[2]) {\n      if (objValue === undefined && !(key in object)) {\n        return false;\n      }\n    } else {\n      var stack = new Stack;\n      if (customizer) {\n        var result = customizer(objValue, srcValue, key, object, source, stack);\n      }\n      if (!(result === undefined\n            ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n            : result\n          )) {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\nmodule.exports = baseIsMatch;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzIuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTWF0Y2guanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIFN0YWNrID0gcmVxdWlyZSgnLi9fU3RhY2snKSxcbiAgICBiYXNlSXNFcXVhbCA9IHJlcXVpcmUoJy4vX2Jhc2VJc0VxdWFsJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hdGNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7QXJyYXl9IG1hdGNoRGF0YSBUaGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3MgdG8gbWF0Y2guXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEsIGN1c3RvbWl6ZXIpIHtcbiAgdmFyIGluZGV4ID0gbWF0Y2hEYXRhLmxlbmd0aCxcbiAgICAgIGxlbmd0aCA9IGluZGV4LFxuICAgICAgbm9DdXN0b21pemVyID0gIWN1c3RvbWl6ZXI7XG5cbiAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgcmV0dXJuICFsZW5ndGg7XG4gIH1cbiAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gIHdoaWxlIChpbmRleC0tKSB7XG4gICAgdmFyIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgIGlmICgobm9DdXN0b21pemVyICYmIGRhdGFbMl0pXG4gICAgICAgICAgPyBkYXRhWzFdICE9PSBvYmplY3RbZGF0YVswXV1cbiAgICAgICAgICA6ICEoZGF0YVswXSBpbiBvYmplY3QpXG4gICAgICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgIHZhciBrZXkgPSBkYXRhWzBdLFxuICAgICAgICBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICBzcmNWYWx1ZSA9IGRhdGFbMV07XG5cbiAgICBpZiAobm9DdXN0b21pemVyICYmIGRhdGFbMl0pIHtcbiAgICAgIGlmIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc3RhY2sgPSBuZXcgU3RhY2s7XG4gICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKTtcbiAgICAgIH1cbiAgICAgIGlmICghKHJlc3VsdCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgICAgIDogcmVzdWx0XG4gICAgICAgICAgKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc01hdGNoO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZUlzTWF0Y2guanNcbi8vIG1vZHVsZSBpZCA9IDMyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 33 */
/***/ function(module, exports, __webpack_require__) {

    eval("var ListCache = __webpack_require__(34),\n    stackClear = __webpack_require__(42),\n    stackDelete = __webpack_require__(43),\n    stackGet = __webpack_require__(44),\n    stackHas = __webpack_require__(45),\n    stackSet = __webpack_require__(46);\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n  var data = this.__data__ = new ListCache(entries);\n  this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzMuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fU3RhY2suanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIHN0YWNrQ2xlYXIgPSByZXF1aXJlKCcuL19zdGFja0NsZWFyJyksXG4gICAgc3RhY2tEZWxldGUgPSByZXF1aXJlKCcuL19zdGFja0RlbGV0ZScpLFxuICAgIHN0YWNrR2V0ID0gcmVxdWlyZSgnLi9fc3RhY2tHZXQnKSxcbiAgICBzdGFja0hhcyA9IHJlcXVpcmUoJy4vX3N0YWNrSGFzJyksXG4gICAgc3RhY2tTZXQgPSByZXF1aXJlKCcuL19zdGFja1NldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzdGFjayBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTdGFjayhlbnRyaWVzKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFN0YWNrYC5cblN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7XG5TdGFjay5wcm90b3R5cGVbJ2RlbGV0ZSddID0gc3RhY2tEZWxldGU7XG5TdGFjay5wcm90b3R5cGUuZ2V0ID0gc3RhY2tHZXQ7XG5TdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7XG5TdGFjay5wcm90b3R5cGUuc2V0ID0gc3RhY2tTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gU3RhY2s7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19TdGFjay5qc1xuLy8gbW9kdWxlIGlkID0gMzNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 34 */
/***/ function(module, exports, __webpack_require__) {

    eval("var listCacheClear = __webpack_require__(35),\n    listCacheDelete = __webpack_require__(36),\n    listCacheGet = __webpack_require__(39),\n    listCacheHas = __webpack_require__(40),\n    listCacheSet = __webpack_require__(41);\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fTGlzdENhY2hlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBsaXN0Q2FjaGVDbGVhciA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUNsZWFyJyksXG4gICAgbGlzdENhY2hlRGVsZXRlID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlRGVsZXRlJyksXG4gICAgbGlzdENhY2hlR2V0ID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlR2V0JyksXG4gICAgbGlzdENhY2hlSGFzID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlSGFzJyksXG4gICAgbGlzdENhY2hlU2V0ID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBsaXN0IGNhY2hlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYExpc3RDYWNoZWAuXG5MaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG5MaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IGxpc3RDYWNoZURlbGV0ZTtcbkxpc3RDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbGlzdENhY2hlR2V0O1xuTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBsaXN0Q2FjaGVIYXM7XG5MaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IGxpc3RDYWNoZVNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBMaXN0Q2FjaGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19MaXN0Q2FjaGUuanNcbi8vIG1vZHVsZSBpZCA9IDM0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 35 */
/***/ function(module, exports) {

    eval("/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n  this.__data__ = [];\n  this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzUuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlQ2xlYXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IFtdO1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZUNsZWFyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fbGlzdENhY2hlQ2xlYXIuanNcbi8vIG1vZHVsZSBpZCA9IDM1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 36 */
/***/ function(module, exports, __webpack_require__) {

    eval("var assocIndexOf = __webpack_require__(37);\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    return false;\n  }\n  var lastIndex = data.length - 1;\n  if (index == lastIndex) {\n    data.pop();\n  } else {\n    splice.call(data, index, 1);\n  }\n  --this.size;\n  return true;\n}\n\nmodule.exports = listCacheDelete;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzYuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlRGVsZXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGFzdEluZGV4ID0gZGF0YS5sZW5ndGggLSAxO1xuICBpZiAoaW5kZXggPT0gbGFzdEluZGV4KSB7XG4gICAgZGF0YS5wb3AoKTtcbiAgfSBlbHNlIHtcbiAgICBzcGxpY2UuY2FsbChkYXRhLCBpbmRleCwgMSk7XG4gIH1cbiAgLS10aGlzLnNpemU7XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZURlbGV0ZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2xpc3RDYWNoZURlbGV0ZS5qc1xuLy8gbW9kdWxlIGlkID0gMzZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 37 */
/***/ function(module, exports, __webpack_require__) {

    eval("var eq = __webpack_require__(38);\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n  var length = array.length;\n  while (length--) {\n    if (eq(array[length][0], key)) {\n      return length;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = assocIndexOf;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzcuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNzb2NJbmRleE9mLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBlcSA9IHJlcXVpcmUoJy4vZXEnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYGtleWAgaXMgZm91bmQgaW4gYGFycmF5YCBvZiBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSBrZXkgVGhlIGtleSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LCBrZXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgaWYgKGVxKGFycmF5W2xlbmd0aF1bMF0sIGtleSkpIHtcbiAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NvY0luZGV4T2Y7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19hc3NvY0luZGV4T2YuanNcbi8vIG1vZHVsZSBpZCA9IDM3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 38 */
/***/ function(module, exports) {

    eval("/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n  return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzguanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9lcS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBlcmZvcm1zIGFcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gKlxuICogXy5lcShvYmplY3QsIG9iamVjdCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lcShvYmplY3QsIG90aGVyKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lcSgnYScsICdhJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lcSgnYScsIE9iamVjdCgnYScpKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lcShOYU4sIE5hTik7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPT09IG90aGVyIHx8ICh2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlcTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvZXEuanNcbi8vIG1vZHVsZSBpZCA9IDM4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 39 */
/***/ function(module, exports, __webpack_require__) {

    eval("var assocIndexOf = __webpack_require__(37);\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlR2V0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVHZXQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19saXN0Q2FjaGVHZXQuanNcbi8vIG1vZHVsZSBpZCA9IDM5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 40 */
/***/ function(module, exports, __webpack_require__) {

    eval("var assocIndexOf = __webpack_require__(37);\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n  return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlSGFzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUhhcyhrZXkpIHtcbiAgcmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkpID4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlSGFzO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fbGlzdENhY2hlSGFzLmpzXG4vLyBtb2R1bGUgaWQgPSA0MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 41 */
/***/ function(module, exports, __webpack_require__) {

    eval("var assocIndexOf = __webpack_require__(37);\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    ++this.size;\n    data.push([key, value]);\n  } else {\n    data[index][1] = value;\n  }\n  return this;\n}\n\nmodule.exports = listCacheSet;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDEuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlU2V0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBsaXN0IGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICArK3RoaXMuc2l6ZTtcbiAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhW2luZGV4XVsxXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZVNldDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2xpc3RDYWNoZVNldC5qc1xuLy8gbW9kdWxlIGlkID0gNDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 42 */
/***/ function(module, exports, __webpack_require__) {

    eval("var ListCache = __webpack_require__(34);\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n  this.__data__ = new ListCache;\n  this.size = 0;\n}\n\nmodule.exports = stackClear;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tDbGVhci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgc3RhY2suXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqL1xuZnVuY3Rpb24gc3RhY2tDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGU7XG4gIHRoaXMuc2l6ZSA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tDbGVhcjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX3N0YWNrQ2xlYXIuanNcbi8vIG1vZHVsZSBpZCA9IDQyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 43 */
/***/ function(module, exports) {

    eval("/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n  var data = this.__data__,\n      result = data['delete'](key);\n\n  this.size = data.size;\n  return result;\n}\n\nmodule.exports = stackDelete;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tEZWxldGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgc3RhY2suXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc3RhY2tEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIHJlc3VsdCA9IGRhdGFbJ2RlbGV0ZSddKGtleSk7XG5cbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrRGVsZXRlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fc3RhY2tEZWxldGUuanNcbi8vIG1vZHVsZSBpZCA9IDQzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 44 */
/***/ function(module, exports) {

    eval("/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n  return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tHZXQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZXRzIHRoZSBzdGFjayB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc3RhY2tHZXQoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmdldChrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrR2V0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fc3RhY2tHZXQuanNcbi8vIG1vZHVsZSBpZCA9IDQ0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 45 */
/***/ function(module, exports) {

    eval("/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n  return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDUuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tIYXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGVja3MgaWYgYSBzdGFjayB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrSGFzKGtleSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0hhcztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX3N0YWNrSGFzLmpzXG4vLyBtb2R1bGUgaWQgPSA0NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 46 */
/***/ function(module, exports, __webpack_require__) {

    eval("var ListCache = __webpack_require__(34),\n    Map = __webpack_require__(47),\n    MapCache = __webpack_require__(55);\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n  var data = this.__data__;\n  if (data instanceof ListCache) {\n    var pairs = data.__data__;\n    if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n      pairs.push([key, value]);\n      this.size = ++data.size;\n      return this;\n    }\n    data = this.__data__ = new MapCache(pairs);\n  }\n  data.set(key, value);\n  this.size = data.size;\n  return this;\n}\n\nmodule.exports = stackSet;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tTZXQuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIE1hcCA9IHJlcXVpcmUoJy4vX01hcCcpLFxuICAgIE1hcENhY2hlID0gcmVxdWlyZSgnLi9fTWFwQ2FjaGUnKTtcblxuLyoqIFVzZWQgYXMgdGhlIHNpemUgdG8gZW5hYmxlIGxhcmdlIGFycmF5IG9wdGltaXphdGlvbnMuICovXG52YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuLyoqXG4gKiBTZXRzIHRoZSBzdGFjayBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBzdGFjayBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gc3RhY2tTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgTGlzdENhY2hlKSB7XG4gICAgdmFyIHBhaXJzID0gZGF0YS5fX2RhdGFfXztcbiAgICBpZiAoIU1hcCB8fCAocGFpcnMubGVuZ3RoIDwgTEFSR0VfQVJSQVlfU0laRSAtIDEpKSB7XG4gICAgICBwYWlycy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICB0aGlzLnNpemUgPSArK2RhdGEuc2l6ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZShwYWlycyk7XG4gIH1cbiAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tTZXQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19zdGFja1NldC5qc1xuLy8gbW9kdWxlIGlkID0gNDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 47 */
/***/ function(module, exports, __webpack_require__) {

    eval("var getNative = __webpack_require__(48),\n    root = __webpack_require__(22);\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDcuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fTWFwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgTWFwID0gZ2V0TmF0aXZlKHJvb3QsICdNYXAnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNYXA7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19NYXAuanNcbi8vIG1vZHVsZSBpZCA9IDQ3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 48 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseIsNative = __webpack_require__(49),\n    getValue = __webpack_require__(54);\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDguanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TmF0aXZlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlSXNOYXRpdmUgPSByZXF1aXJlKCcuL19iYXNlSXNOYXRpdmUnKSxcbiAgICBnZXRWYWx1ZSA9IHJlcXVpcmUoJy4vX2dldFZhbHVlJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbmF0aXZlIGZ1bmN0aW9uIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShvYmplY3QsIGtleSk7XG4gIHJldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TmF0aXZlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fZ2V0TmF0aXZlLmpzXG4vLyBtb2R1bGUgaWQgPSA0OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 49 */
/***/ function(module, exports, __webpack_require__) {

    eval("var isFunction = __webpack_require__(50),\n    isMasked = __webpack_require__(51),\n    isObject = __webpack_require__(18),\n    toSource = __webpack_require__(53);\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDkuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTmF0aXZlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNNYXNrZWQgPSByZXF1aXJlKCcuL19pc01hc2tlZCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIHRvU291cmNlID0gcmVxdWlyZSgnLi9fdG9Tb3VyY2UnKTtcblxuLyoqXG4gKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAqL1xudmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xudmFyIHJlSXNIb3N0Q3RvciA9IC9eXFxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXFxdJC87XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xudmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4pO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG4gIHJldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNOYXRpdmU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19iYXNlSXNOYXRpdmUuanNcbi8vIG1vZHVsZSBpZCA9IDQ5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 50 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseGetTag = __webpack_require__(20),\n    isObject = __webpack_require__(18);\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  if (!isObject(value)) {\n    return false;\n  }\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 9 which returns 'object' for typed arrays and other constructors.\n  var tag = baseGetTag(value);\n  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTAuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0Z1bmN0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXN5bmNUYWcgPSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICBwcm94eVRhZyA9ICdbb2JqZWN0IFByb3h5XSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheXMgYW5kIG90aGVyIGNvbnN0cnVjdG9ycy5cbiAgdmFyIHRhZyA9IGJhc2VHZXRUYWcodmFsdWUpO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRnVuY3Rpb247XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL2lzRnVuY3Rpb24uanNcbi8vIG1vZHVsZSBpZCA9IDUwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 51 */
/***/ function(module, exports, __webpack_require__) {

    eval("var coreJsData = __webpack_require__(52);\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTEuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNNYXNrZWQuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGNvcmVKc0RhdGEgPSByZXF1aXJlKCcuL19jb3JlSnNEYXRhJyk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBtZXRob2RzIG1hc3F1ZXJhZGluZyBhcyBuYXRpdmUuICovXG52YXIgbWFza1NyY0tleSA9IChmdW5jdGlvbigpIHtcbiAgdmFyIHVpZCA9IC9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSAmJiBjb3JlSnNEYXRhLmtleXMgJiYgY29yZUpzRGF0YS5rZXlzLklFX1BST1RPIHx8ICcnKTtcbiAgcmV0dXJuIHVpZCA/ICgnU3ltYm9sKHNyYylfMS4nICsgdWlkKSA6ICcnO1xufSgpKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2tlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gIHJldHVybiAhIW1hc2tTcmNLZXkgJiYgKG1hc2tTcmNLZXkgaW4gZnVuYyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNNYXNrZWQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19pc01hc2tlZC5qc1xuLy8gbW9kdWxlIGlkID0gNTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 52 */
/***/ function(module, exports, __webpack_require__) {

    eval("var root = __webpack_require__(22);\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTIuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29yZUpzRGF0YS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xudmFyIGNvcmVKc0RhdGEgPSByb290WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb3JlSnNEYXRhO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fY29yZUpzRGF0YS5qc1xuLy8gbW9kdWxlIGlkID0gNTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 53 */
/***/ function(module, exports) {

    eval("/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\nmodule.exports = toSource;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTMuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fdG9Tb3VyY2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgZnVuY2AgdG8gaXRzIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuXG4gKi9cbmZ1bmN0aW9uIHRvU291cmNlKGZ1bmMpIHtcbiAgaWYgKGZ1bmMgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZnVuY1RvU3RyaW5nLmNhbGwoZnVuYyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChmdW5jICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvU291cmNlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fdG9Tb3VyY2UuanNcbi8vIG1vZHVsZSBpZCA9IDUzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 54 */
/***/ function(module, exports) {

    eval("/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0VmFsdWUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0VmFsdWU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19nZXRWYWx1ZS5qc1xuLy8gbW9kdWxlIGlkID0gNTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 55 */
/***/ function(module, exports, __webpack_require__) {

    eval("var mapCacheClear = __webpack_require__(56),\n    mapCacheDelete = __webpack_require__(64),\n    mapCacheGet = __webpack_require__(67),\n    mapCacheHas = __webpack_require__(68),\n    mapCacheSet = __webpack_require__(69);\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTUuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fTWFwQ2FjaGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIG1hcENhY2hlQ2xlYXIgPSByZXF1aXJlKCcuL19tYXBDYWNoZUNsZWFyJyksXG4gICAgbWFwQ2FjaGVEZWxldGUgPSByZXF1aXJlKCcuL19tYXBDYWNoZURlbGV0ZScpLFxuICAgIG1hcENhY2hlR2V0ID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVHZXQnKSxcbiAgICBtYXBDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX21hcENhY2hlSGFzJyksXG4gICAgbWFwQ2FjaGVTZXQgPSByZXF1aXJlKCcuL19tYXBDYWNoZVNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXAgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgTWFwQ2FjaGVgLlxuTWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gbWFwQ2FjaGVDbGVhcjtcbk1hcENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBtYXBDYWNoZURlbGV0ZTtcbk1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcbk1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBtYXBDYWNoZUhhcztcbk1hcENhY2hlLnByb3RvdHlwZS5zZXQgPSBtYXBDYWNoZVNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBNYXBDYWNoZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX01hcENhY2hlLmpzXG4vLyBtb2R1bGUgaWQgPSA1NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 56 */
/***/ function(module, exports, __webpack_require__) {

    eval("var Hash = __webpack_require__(57),\n    ListCache = __webpack_require__(34),\n    Map = __webpack_require__(47);\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n  this.size = 0;\n  this.__data__ = {\n    'hash': new Hash,\n    'map': new (Map || ListCache),\n    'string': new Hash\n  };\n}\n\nmodule.exports = mapCacheClear;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVDbGVhci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgSGFzaCA9IHJlcXVpcmUoJy4vX0hhc2gnKSxcbiAgICBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKSxcbiAgICBNYXAgPSByZXF1aXJlKCcuL19NYXAnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpIHtcbiAgdGhpcy5zaXplID0gMDtcbiAgdGhpcy5fX2RhdGFfXyA9IHtcbiAgICAnaGFzaCc6IG5ldyBIYXNoLFxuICAgICdtYXAnOiBuZXcgKE1hcCB8fCBMaXN0Q2FjaGUpLFxuICAgICdzdHJpbmcnOiBuZXcgSGFzaFxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlQ2xlYXI7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19tYXBDYWNoZUNsZWFyLmpzXG4vLyBtb2R1bGUgaWQgPSA1NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 57 */
/***/ function(module, exports, __webpack_require__) {

    eval("var hashClear = __webpack_require__(58),\n    hashDelete = __webpack_require__(60),\n    hashGet = __webpack_require__(61),\n    hashHas = __webpack_require__(62),\n    hashSet = __webpack_require__(63);\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTcuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fSGFzaC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaGFzaENsZWFyID0gcmVxdWlyZSgnLi9faGFzaENsZWFyJyksXG4gICAgaGFzaERlbGV0ZSA9IHJlcXVpcmUoJy4vX2hhc2hEZWxldGUnKSxcbiAgICBoYXNoR2V0ID0gcmVxdWlyZSgnLi9faGFzaEdldCcpLFxuICAgIGhhc2hIYXMgPSByZXF1aXJlKCcuL19oYXNoSGFzJyksXG4gICAgaGFzaFNldCA9IHJlcXVpcmUoJy4vX2hhc2hTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgaGFzaCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIEhhc2goZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgSGFzaGAuXG5IYXNoLnByb3RvdHlwZS5jbGVhciA9IGhhc2hDbGVhcjtcbkhhc2gucHJvdG90eXBlWydkZWxldGUnXSA9IGhhc2hEZWxldGU7XG5IYXNoLnByb3RvdHlwZS5nZXQgPSBoYXNoR2V0O1xuSGFzaC5wcm90b3R5cGUuaGFzID0gaGFzaEhhcztcbkhhc2gucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gSGFzaDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX0hhc2guanNcbi8vIG1vZHVsZSBpZCA9IDU3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 58 */
/***/ function(module, exports, __webpack_require__) {

    eval("var nativeCreate = __webpack_require__(59);\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n  this.__data__ = nativeCreate ? nativeCreate(null) : {};\n  this.size = 0;\n}\n\nmodule.exports = hashClear;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTguanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaENsZWFyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBoYXNoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIEhhc2hcbiAqL1xuZnVuY3Rpb24gaGFzaENsZWFyKCkge1xuICB0aGlzLl9fZGF0YV9fID0gbmF0aXZlQ3JlYXRlID8gbmF0aXZlQ3JlYXRlKG51bGwpIDoge307XG4gIHRoaXMuc2l6ZSA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaENsZWFyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9faGFzaENsZWFyLmpzXG4vLyBtb2R1bGUgaWQgPSA1OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 59 */
/***/ function(module, exports, __webpack_require__) {

    eval("var getNative = __webpack_require__(48);\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTkuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fbmF0aXZlQ3JlYXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVDcmVhdGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19uYXRpdmVDcmVhdGUuanNcbi8vIG1vZHVsZSBpZCA9IDU5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 60 */
/***/ function(module, exports) {

    eval("/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n  var result = this.has(key) && delete this.__data__[key];\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = hashDelete;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjAuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaERlbGV0ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBoYXNoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge09iamVjdH0gaGFzaCBUaGUgaGFzaCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcbiAgdmFyIHJlc3VsdCA9IHRoaXMuaGFzKGtleSkgJiYgZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTtcbiAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hEZWxldGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19oYXNoRGVsZXRlLmpzXG4vLyBtb2R1bGUgaWQgPSA2MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 61 */
/***/ function(module, exports, __webpack_require__) {

    eval("var nativeCreate = __webpack_require__(59);\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n  var data = this.__data__;\n  if (nativeCreate) {\n    var result = data[key];\n    return result === HASH_UNDEFINED ? undefined : result;\n  }\n  return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjEuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaEdldC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBHZXRzIHRoZSBoYXNoIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGhhc2hHZXQoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgIHZhciByZXN1bHQgPSBkYXRhW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSA/IGRhdGFba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoR2V0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9faGFzaEdldC5qc1xuLy8gbW9kdWxlIGlkID0gNjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 62 */
/***/ function(module, exports, __webpack_require__) {

    eval("var nativeCreate = __webpack_require__(59);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n  var data = this.__data__;\n  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjIuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaEhhcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgaGFzaCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzaEhhcyhrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICByZXR1cm4gbmF0aXZlQ3JlYXRlID8gKGRhdGFba2V5XSAhPT0gdW5kZWZpbmVkKSA6IGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoSGFzO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9faGFzaEhhcy5qc1xuLy8gbW9kdWxlIGlkID0gNjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 63 */
/***/ function(module, exports, __webpack_require__) {

    eval("var nativeCreate = __webpack_require__(59);\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n  var data = this.__data__;\n  this.size += this.has(key) ? 0 : 1;\n  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n  return this;\n}\n\nmodule.exports = hashSet;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjMuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaFNldC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqXG4gKiBTZXRzIHRoZSBoYXNoIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaGFzaCBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gaGFzaFNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgdGhpcy5zaXplICs9IHRoaXMuaGFzKGtleSkgPyAwIDogMTtcbiAgZGF0YVtrZXldID0gKG5hdGl2ZUNyZWF0ZSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSA/IEhBU0hfVU5ERUZJTkVEIDogdmFsdWU7XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hTZXQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19oYXNoU2V0LmpzXG4vLyBtb2R1bGUgaWQgPSA2M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 64 */
/***/ function(module, exports, __webpack_require__) {

    eval("var getMapData = __webpack_require__(65);\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n  var result = getMapData(this, key)['delete'](key);\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = mapCacheDelete;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVEZWxldGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIG1hcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZURlbGV0ZShrZXkpIHtcbiAgdmFyIHJlc3VsdCA9IGdldE1hcERhdGEodGhpcywga2V5KVsnZGVsZXRlJ10oa2V5KTtcbiAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlRGVsZXRlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fbWFwQ2FjaGVEZWxldGUuanNcbi8vIG1vZHVsZSBpZCA9IDY0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 65 */
/***/ function(module, exports, __webpack_require__) {

    eval("var isKeyable = __webpack_require__(66);\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n  var data = map.__data__;\n  return isKeyable(key)\n    ? data[typeof key == 'string' ? 'string' : 'hash']\n    : data.map;\n}\n\nmodule.exports = getMapData;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjUuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TWFwRGF0YS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaXNLZXlhYmxlID0gcmVxdWlyZSgnLi9faXNLZXlhYmxlJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHJlZmVyZW5jZSBrZXkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGdldE1hcERhdGEobWFwLCBrZXkpIHtcbiAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gIHJldHVybiBpc0tleWFibGUoa2V5KVxuICAgID8gZGF0YVt0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8gJ3N0cmluZycgOiAnaGFzaCddXG4gICAgOiBkYXRhLm1hcDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRNYXBEYXRhO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fZ2V0TWFwRGF0YS5qc1xuLy8gbW9kdWxlIGlkID0gNjVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 66 */
/***/ function(module, exports) {

    eval("/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n  var type = typeof value;\n  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n    ? (value !== '__proto__')\n    : (value === null);\n}\n\nmodule.exports = isKeyable;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjYuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNLZXlhYmxlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyB1bmlxdWUgb2JqZWN0IGtleS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleWFibGUodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAodHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicpXG4gICAgPyAodmFsdWUgIT09ICdfX3Byb3RvX18nKVxuICAgIDogKHZhbHVlID09PSBudWxsKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0tleWFibGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19pc0tleWFibGUuanNcbi8vIG1vZHVsZSBpZCA9IDY2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 67 */
/***/ function(module, exports, __webpack_require__) {

    eval("var getMapData = __webpack_require__(65);\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n  return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjcuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVHZXQuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbWFwIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpIHtcbiAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5nZXQoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZUdldDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX21hcENhY2hlR2V0LmpzXG4vLyBtb2R1bGUgaWQgPSA2N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 68 */
/***/ function(module, exports, __webpack_require__) {

    eval("var getMapData = __webpack_require__(65);\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n  return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjguanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVIYXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbWFwIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVIYXM7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19tYXBDYWNoZUhhcy5qc1xuLy8gbW9kdWxlIGlkID0gNjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 69 */
/***/ function(module, exports, __webpack_require__) {

    eval("var getMapData = __webpack_require__(65);\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n  var data = getMapData(this, key),\n      size = data.size;\n\n  data.set(key, value);\n  this.size += data.size == size ? 0 : 1;\n  return this;\n}\n\nmodule.exports = mapCacheSet;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjkuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVTZXQuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogU2V0cyB0aGUgbWFwIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG1hcCBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IGdldE1hcERhdGEodGhpcywga2V5KSxcbiAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gIHRoaXMuc2l6ZSArPSBkYXRhLnNpemUgPT0gc2l6ZSA/IDAgOiAxO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZVNldDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX21hcENhY2hlU2V0LmpzXG4vLyBtb2R1bGUgaWQgPSA2OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 70 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseIsEqualDeep = __webpack_require__(71),\n    isObjectLike = __webpack_require__(26);\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n *  1 - Unordered comparison\n *  2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzAuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzRXF1YWwuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VJc0VxdWFsRGVlcCA9IHJlcXVpcmUoJy4vX2Jhc2VJc0VxdWFsRGVlcCcpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNFcXVhbGAgd2hpY2ggc3VwcG9ydHMgcGFydGlhbCBjb21wYXJpc29uc1xuICogYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gKiAgMSAtIFVub3JkZXJlZCBjb21wYXJpc29uXG4gKiAgMiAtIFBhcnRpYWwgY29tcGFyaXNvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGB2YWx1ZWAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spIHtcbiAgaWYgKHZhbHVlID09PSBvdGhlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh2YWx1ZSA9PSBudWxsIHx8IG90aGVyID09IG51bGwgfHwgKCFpc09iamVjdExpa2UodmFsdWUpICYmICFpc09iamVjdExpa2Uob3RoZXIpKSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyO1xuICB9XG4gIHJldHVybiBiYXNlSXNFcXVhbERlZXAodmFsdWUsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBiYXNlSXNFcXVhbCwgc3RhY2spO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0VxdWFsO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZUlzRXF1YWwuanNcbi8vIG1vZHVsZSBpZCA9IDcwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 71 */
/***/ function(module, exports, __webpack_require__) {

    eval("var Stack = __webpack_require__(33),\n    equalArrays = __webpack_require__(72),\n    equalByTag = __webpack_require__(78),\n    equalObjects = __webpack_require__(82),\n    getTag = __webpack_require__(109),\n    isArray = __webpack_require__(86),\n    isBuffer = __webpack_require__(95),\n    isTypedArray = __webpack_require__(99);\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = objIsArr ? arrayTag : getTag(object),\n      othTag = othIsArr ? arrayTag : getTag(other);\n\n  objTag = objTag == argsTag ? objectTag : objTag;\n  othTag = othTag == argsTag ? objectTag : othTag;\n\n  var objIsObj = objTag == objectTag,\n      othIsObj = othTag == objectTag,\n      isSameTag = objTag == othTag;\n\n  if (isSameTag && isBuffer(object)) {\n    if (!isBuffer(other)) {\n      return false;\n    }\n    objIsArr = true;\n    objIsObj = false;\n  }\n  if (isSameTag && !objIsObj) {\n    stack || (stack = new Stack);\n    return (objIsArr || isTypedArray(object))\n      ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n      : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n  }\n  if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      var objUnwrapped = objIsWrapped ? object.value() : object,\n          othUnwrapped = othIsWrapped ? other.value() : other;\n\n      stack || (stack = new Stack);\n      return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  stack || (stack = new Stack);\n  return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzEuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzRXF1YWxEZWVwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBTdGFjayA9IHJlcXVpcmUoJy4vX1N0YWNrJyksXG4gICAgZXF1YWxBcnJheXMgPSByZXF1aXJlKCcuL19lcXVhbEFycmF5cycpLFxuICAgIGVxdWFsQnlUYWcgPSByZXF1aXJlKCcuL19lcXVhbEJ5VGFnJyksXG4gICAgZXF1YWxPYmplY3RzID0gcmVxdWlyZSgnLi9fZXF1YWxPYmplY3RzJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICogZGVlcCBjb21wYXJpc29ucyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICogcmVmZXJlbmNlcyB0byBiZSBjb21wYXJlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIG9iaklzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgb3RoSXNBcnIgPSBpc0FycmF5KG90aGVyKSxcbiAgICAgIG9ialRhZyA9IG9iaklzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob2JqZWN0KSxcbiAgICAgIG90aFRhZyA9IG90aElzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob3RoZXIpO1xuXG4gIG9ialRhZyA9IG9ialRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb2JqVGFnO1xuICBvdGhUYWcgPSBvdGhUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG90aFRhZztcblxuICB2YXIgb2JqSXNPYmogPSBvYmpUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgb3RoSXNPYmogPSBvdGhUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgaXNTYW1lVGFnID0gb2JqVGFnID09IG90aFRhZztcblxuICBpZiAoaXNTYW1lVGFnICYmIGlzQnVmZmVyKG9iamVjdCkpIHtcbiAgICBpZiAoIWlzQnVmZmVyKG90aGVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBvYmpJc0FyciA9IHRydWU7XG4gICAgb2JqSXNPYmogPSBmYWxzZTtcbiAgfVxuICBpZiAoaXNTYW1lVGFnICYmICFvYmpJc09iaikge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgcmV0dXJuIChvYmpJc0FyciB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KSlcbiAgICAgID8gZXF1YWxBcnJheXMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaylcbiAgICAgIDogZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCBvYmpUYWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICB9XG4gIGlmICghKGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRykpIHtcbiAgICB2YXIgb2JqSXNXcmFwcGVkID0gb2JqSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsICdfX3dyYXBwZWRfXycpLFxuICAgICAgICBvdGhJc1dyYXBwZWQgPSBvdGhJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCAnX193cmFwcGVkX18nKTtcblxuICAgIGlmIChvYmpJc1dyYXBwZWQgfHwgb3RoSXNXcmFwcGVkKSB7XG4gICAgICB2YXIgb2JqVW53cmFwcGVkID0gb2JqSXNXcmFwcGVkID8gb2JqZWN0LnZhbHVlKCkgOiBvYmplY3QsXG4gICAgICAgICAgb3RoVW53cmFwcGVkID0gb3RoSXNXcmFwcGVkID8gb3RoZXIudmFsdWUoKSA6IG90aGVyO1xuXG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsIG90aFVud3JhcHBlZCwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spO1xuICAgIH1cbiAgfVxuICBpZiAoIWlzU2FtZVRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICByZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0VxdWFsRGVlcDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2Jhc2VJc0VxdWFsRGVlcC5qc1xuLy8gbW9kdWxlIGlkID0gNzFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 72 */
/***/ function(module, exports, __webpack_require__) {

    eval("var SetCache = __webpack_require__(73),\n    arraySome = __webpack_require__(76),\n    cacheHas = __webpack_require__(77);\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n    return false;\n  }\n  // Assume cyclic values are equal.\n  var stacked = stack.get(array);\n  if (stacked && stack.get(other)) {\n    return stacked == other;\n  }\n  var index = -1,\n      result = true,\n      seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n  stack.set(array, other);\n  stack.set(other, array);\n\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, arrValue, index, other, array, stack)\n        : customizer(arrValue, othValue, index, array, other, stack);\n    }\n    if (compared !== undefined) {\n      if (compared) {\n        continue;\n      }\n      result = false;\n      break;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (seen) {\n      if (!arraySome(other, function(othValue, othIndex) {\n            if (!cacheHas(seen, othIndex) &&\n                (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n              return seen.push(othIndex);\n            }\n          })) {\n        result = false;\n        break;\n      }\n    } else if (!(\n          arrValue === othValue ||\n            equalFunc(arrValue, othValue, bitmask, customizer, stack)\n        )) {\n      result = false;\n      break;\n    }\n  }\n  stack['delete'](array);\n  stack['delete'](other);\n  return result;\n}\n\nmodule.exports = equalArrays;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzIuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fZXF1YWxBcnJheXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIFNldENhY2hlID0gcmVxdWlyZSgnLi9fU2V0Q2FjaGUnKSxcbiAgICBhcnJheVNvbWUgPSByZXF1aXJlKCcuL19hcnJheVNvbWUnKSxcbiAgICBjYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2NhY2hlSGFzJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGFycmF5cyB3aXRoIHN1cHBvcnQgZm9yXG4gKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBhcnJheWAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJyYXlzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsQXJyYXlzKGFycmF5LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLFxuICAgICAgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgb3RoTGVuZ3RoID0gb3RoZXIubGVuZ3RoO1xuXG4gIGlmIChhcnJMZW5ndGggIT0gb3RoTGVuZ3RoICYmICEoaXNQYXJ0aWFsICYmIG90aExlbmd0aCA+IGFyckxlbmd0aCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldChhcnJheSk7XG4gIGlmIChzdGFja2VkICYmIHN0YWNrLmdldChvdGhlcikpIHtcbiAgICByZXR1cm4gc3RhY2tlZCA9PSBvdGhlcjtcbiAgfVxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IHRydWUsXG4gICAgICBzZWVuID0gKGJpdG1hc2sgJiBDT01QQVJFX1VOT1JERVJFRF9GTEFHKSA/IG5ldyBTZXRDYWNoZSA6IHVuZGVmaW5lZDtcblxuICBzdGFjay5zZXQoYXJyYXksIG90aGVyKTtcbiAgc3RhY2suc2V0KG90aGVyLCBhcnJheSk7XG5cbiAgLy8gSWdub3JlIG5vbi1pbmRleCBwcm9wZXJ0aWVzLlxuICB3aGlsZSAoKytpbmRleCA8IGFyckxlbmd0aCkge1xuICAgIHZhciBhcnJWYWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltpbmRleF07XG5cbiAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4LCBvdGhlciwgYXJyYXksIHN0YWNrKVxuICAgICAgICA6IGN1c3RvbWl6ZXIoYXJyVmFsdWUsIG90aFZhbHVlLCBpbmRleCwgYXJyYXksIG90aGVyLCBzdGFjayk7XG4gICAgfVxuICAgIGlmIChjb21wYXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY29tcGFyZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGlmIChzZWVuKSB7XG4gICAgICBpZiAoIWFycmF5U29tZShvdGhlciwgZnVuY3Rpb24ob3RoVmFsdWUsIG90aEluZGV4KSB7XG4gICAgICAgICAgICBpZiAoIWNhY2hlSGFzKHNlZW4sIG90aEluZGV4KSAmJlxuICAgICAgICAgICAgICAgIChhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKSkge1xuICAgICAgICAgICAgICByZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSkge1xuICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghKFxuICAgICAgICAgIGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fFxuICAgICAgICAgICAgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spXG4gICAgICAgICkpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHN0YWNrWydkZWxldGUnXShhcnJheSk7XG4gIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXF1YWxBcnJheXM7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19lcXVhbEFycmF5cy5qc1xuLy8gbW9kdWxlIGlkID0gNzJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 73 */
/***/ function(module, exports, __webpack_require__) {

    eval("var MapCache = __webpack_require__(55),\n    setCacheAdd = __webpack_require__(74),\n    setCacheHas = __webpack_require__(75);\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n  var index = -1,\n      length = values == null ? 0 : values.length;\n\n  this.__data__ = new MapCache;\n  while (++index < length) {\n    this.add(values[index]);\n  }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzMuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fU2V0Q2FjaGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIE1hcENhY2hlID0gcmVxdWlyZSgnLi9fTWFwQ2FjaGUnKSxcbiAgICBzZXRDYWNoZUFkZCA9IHJlcXVpcmUoJy4vX3NldENhY2hlQWRkJyksXG4gICAgc2V0Q2FjaGVIYXMgPSByZXF1aXJlKCcuL19zZXRDYWNoZUhhcycpO1xuXG4vKipcbiAqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGNhY2hlIG9iamVjdCB0byBzdG9yZSB1bmlxdWUgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIFNldENhY2hlKHZhbHVlcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHZhbHVlcyA9PSBudWxsID8gMCA6IHZhbHVlcy5sZW5ndGg7XG5cbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgU2V0Q2FjaGVgLlxuU2V0Q2FjaGUucHJvdG90eXBlLmFkZCA9IFNldENhY2hlLnByb3RvdHlwZS5wdXNoID0gc2V0Q2FjaGVBZGQ7XG5TZXRDYWNoZS5wcm90b3R5cGUuaGFzID0gc2V0Q2FjaGVIYXM7XG5cbm1vZHVsZS5leHBvcnRzID0gU2V0Q2FjaGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19TZXRDYWNoZS5qc1xuLy8gbW9kdWxlIGlkID0gNzNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 74 */
/***/ function(module, exports) {

    eval("/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n  this.__data__.set(value, HASH_UNDEFINED);\n  return this;\n}\n\nmodule.exports = setCacheAdd;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0Q2FjaGVBZGQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGFkZFxuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAYWxpYXMgcHVzaFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgdGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsIEhBU0hfVU5ERUZJTkVEKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0Q2FjaGVBZGQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19zZXRDYWNoZUFkZC5qc1xuLy8gbW9kdWxlIGlkID0gNzRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 75 */
/***/ function(module, exports) {

    eval("/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n  return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzUuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0Q2FjaGVIYXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzZXRDYWNoZUhhcyh2YWx1ZSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldENhY2hlSGFzO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fc2V0Q2FjaGVIYXMuanNcbi8vIG1vZHVsZSBpZCA9IDc1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 76 */
/***/ function(module, exports) {

    eval("/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n *  else `false`.\n */\nfunction arraySome(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arraySome;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzYuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlTb21lLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNvbWVgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICogc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheVNvbWUoYXJyYXksIHByZWRpY2F0ZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlTb21lO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYXJyYXlTb21lLmpzXG4vLyBtb2R1bGUgaWQgPSA3NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 77 */
/***/ function(module, exports) {

    eval("/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n  return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzcuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2FjaGVIYXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGVja3MgaWYgYSBgY2FjaGVgIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBUaGUgY2FjaGUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gY2FjaGVIYXMoY2FjaGUsIGtleSkge1xuICByZXR1cm4gY2FjaGUuaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2FjaGVIYXM7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19jYWNoZUhhcy5qc1xuLy8gbW9kdWxlIGlkID0gNzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 78 */
/***/ function(module, exports, __webpack_require__) {

    eval("var Symbol = __webpack_require__(21),\n    Uint8Array = __webpack_require__(79),\n    eq = __webpack_require__(38),\n    equalArrays = __webpack_require__(72),\n    mapToArray = __webpack_require__(80),\n    setToArray = __webpack_require__(81);\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n  switch (tag) {\n    case dataViewTag:\n      if ((object.byteLength != other.byteLength) ||\n          (object.byteOffset != other.byteOffset)) {\n        return false;\n      }\n      object = object.buffer;\n      other = other.buffer;\n\n    case arrayBufferTag:\n      if ((object.byteLength != other.byteLength) ||\n          !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n        return false;\n      }\n      return true;\n\n    case boolTag:\n    case dateTag:\n    case numberTag:\n      // Coerce booleans to `1` or `0` and dates to milliseconds.\n      // Invalid dates are coerced to `NaN`.\n      return eq(+object, +other);\n\n    case errorTag:\n      return object.name == other.name && object.message == other.message;\n\n    case regexpTag:\n    case stringTag:\n      // Coerce regexes to strings and treat strings, primitives and objects,\n      // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n      // for more details.\n      return object == (other + '');\n\n    case mapTag:\n      var convert = mapToArray;\n\n    case setTag:\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n      convert || (convert = setToArray);\n\n      if (object.size != other.size && !isPartial) {\n        return false;\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(object);\n      if (stacked) {\n        return stacked == other;\n      }\n      bitmask |= COMPARE_UNORDERED_FLAG;\n\n      // Recursively compare objects (susceptible to call stack limits).\n      stack.set(object, other);\n      var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n      stack['delete'](object);\n      return result;\n\n    case symbolTag:\n      if (symbolValueOf) {\n        return symbolValueOf.call(object) == symbolValueOf.call(other);\n      }\n  }\n  return false;\n}\n\nmodule.exports = equalByTag;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzguanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fZXF1YWxCeVRhZy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgVWludDhBcnJheSA9IHJlcXVpcmUoJy4vX1VpbnQ4QXJyYXknKSxcbiAgICBlcSA9IHJlcXVpcmUoJy4vZXEnKSxcbiAgICBlcXVhbEFycmF5cyA9IHJlcXVpcmUoJy4vX2VxdWFsQXJyYXlzJyksXG4gICAgbWFwVG9BcnJheSA9IHJlcXVpcmUoJy4vX21hcFRvQXJyYXknKSxcbiAgICBzZXRUb0FycmF5ID0gcmVxdWlyZSgnLi9fc2V0VG9BcnJheScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJztcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBjb21wYXJpbmcgb2JqZWN0cyBvZlxuICogdGhlIHNhbWUgYHRvU3RyaW5nVGFnYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNvbXBhcmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE51bWJlcmAsIGBSZWdFeHBgLCBvciBgU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0cyB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgdGFnLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSBkYXRhVmlld1RhZzpcbiAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAob2JqZWN0LmJ5dGVPZmZzZXQgIT0gb3RoZXIuYnl0ZU9mZnNldCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgb2JqZWN0ID0gb2JqZWN0LmJ1ZmZlcjtcbiAgICAgIG90aGVyID0gb3RoZXIuYnVmZmVyO1xuXG4gICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAhZXF1YWxGdW5jKG5ldyBVaW50OEFycmF5KG9iamVjdCksIG5ldyBVaW50OEFycmF5KG90aGVyKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBjYXNlIGJvb2xUYWc6XG4gICAgY2FzZSBkYXRlVGFnOlxuICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgICAgLy8gQ29lcmNlIGJvb2xlYW5zIHRvIGAxYCBvciBgMGAgYW5kIGRhdGVzIHRvIG1pbGxpc2Vjb25kcy5cbiAgICAgIC8vIEludmFsaWQgZGF0ZXMgYXJlIGNvZXJjZWQgdG8gYE5hTmAuXG4gICAgICByZXR1cm4gZXEoK29iamVjdCwgK290aGVyKTtcblxuICAgIGNhc2UgZXJyb3JUYWc6XG4gICAgICByZXR1cm4gb2JqZWN0Lm5hbWUgPT0gb3RoZXIubmFtZSAmJiBvYmplY3QubWVzc2FnZSA9PSBvdGhlci5tZXNzYWdlO1xuXG4gICAgY2FzZSByZWdleHBUYWc6XG4gICAgY2FzZSBzdHJpbmdUYWc6XG4gICAgICAvLyBDb2VyY2UgcmVnZXhlcyB0byBzdHJpbmdzIGFuZCB0cmVhdCBzdHJpbmdzLCBwcmltaXRpdmVzIGFuZCBvYmplY3RzLFxuICAgICAgLy8gYXMgZXF1YWwuIFNlZSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcmVnZXhwLnByb3RvdHlwZS50b3N0cmluZ1xuICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIHJldHVybiBvYmplY3QgPT0gKG90aGVyICsgJycpO1xuXG4gICAgY2FzZSBtYXBUYWc6XG4gICAgICB2YXIgY29udmVydCA9IG1hcFRvQXJyYXk7XG5cbiAgICBjYXNlIHNldFRhZzpcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUc7XG4gICAgICBjb252ZXJ0IHx8IChjb252ZXJ0ID0gc2V0VG9BcnJheSk7XG5cbiAgICAgIGlmIChvYmplY3Quc2l6ZSAhPSBvdGhlci5zaXplICYmICFpc1BhcnRpYWwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgICAgIGlmIChzdGFja2VkKSB7XG4gICAgICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xuICAgICAgfVxuICAgICAgYml0bWFzayB8PSBDT01QQVJFX1VOT1JERVJFRF9GTEFHO1xuXG4gICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgICAgIHZhciByZXN1bHQgPSBlcXVhbEFycmF5cyhjb252ZXJ0KG9iamVjdCksIGNvbnZlcnQob3RoZXIpLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvYmplY3QpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgIGNhc2Ugc3ltYm9sVGFnOlxuICAgICAgaWYgKHN5bWJvbFZhbHVlT2YpIHtcbiAgICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YuY2FsbChvYmplY3QpID09IHN5bWJvbFZhbHVlT2YuY2FsbChvdGhlcik7XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxdWFsQnlUYWc7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19lcXVhbEJ5VGFnLmpzXG4vLyBtb2R1bGUgaWQgPSA3OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 79 */
/***/ function(module, exports, __webpack_require__) {

    eval("var root = __webpack_require__(22);\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzkuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fVWludDhBcnJheS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgVWludDhBcnJheSA9IHJvb3QuVWludDhBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBVaW50OEFycmF5O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fVWludDhBcnJheS5qc1xuLy8gbW9kdWxlIGlkID0gNzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 80 */
/***/ function(module, exports) {

    eval("/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n  var index = -1,\n      result = Array(map.size);\n\n  map.forEach(function(value, key) {\n    result[++index] = [key, value];\n  });\n  return result;\n}\n\nmodule.exports = mapToArray;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODAuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwVG9BcnJheS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnZlcnRzIGBtYXBgIHRvIGl0cyBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gKi9cbmZ1bmN0aW9uIG1hcFRvQXJyYXkobWFwKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobWFwLnNpemUpO1xuXG4gIG1hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSBba2V5LCB2YWx1ZV07XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcFRvQXJyYXk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19tYXBUb0FycmF5LmpzXG4vLyBtb2R1bGUgaWQgPSA4MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 81 */
/***/ function(module, exports) {

    eval("/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = value;\n  });\n  return result;\n}\n\nmodule.exports = setToArray;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODEuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0VG9BcnJheS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnZlcnRzIGBzZXRgIHRvIGFuIGFycmF5IG9mIGl0cyB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIHNldFRvQXJyYXkoc2V0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkoc2V0LnNpemUpO1xuXG4gIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gdmFsdWU7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldFRvQXJyYXk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19zZXRUb0FycmF5LmpzXG4vLyBtb2R1bGUgaWQgPSA4MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 82 */
/***/ function(module, exports, __webpack_require__) {

    eval("var getAllKeys = __webpack_require__(83);\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      objProps = getAllKeys(object),\n      objLength = objProps.length,\n      othProps = getAllKeys(other),\n      othLength = othProps.length;\n\n  if (objLength != othLength && !isPartial) {\n    return false;\n  }\n  var index = objLength;\n  while (index--) {\n    var key = objProps[index];\n    if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  // Assume cyclic values are equal.\n  var stacked = stack.get(object);\n  if (stacked && stack.get(other)) {\n    return stacked == other;\n  }\n  var result = true;\n  stack.set(object, other);\n  stack.set(other, object);\n\n  var skipCtor = isPartial;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, objValue, key, other, object, stack)\n        : customizer(objValue, othValue, key, object, other, stack);\n    }\n    // Recursively compare objects (susceptible to call stack limits).\n    if (!(compared === undefined\n          ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n          : compared\n        )) {\n      result = false;\n      break;\n    }\n    skipCtor || (skipCtor = key == 'constructor');\n  }\n  if (result && !skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    // Non `Object` object instances with different constructors are not equal.\n    if (objCtor != othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n          typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n      result = false;\n    }\n  }\n  stack['delete'](object);\n  stack['delete'](other);\n  return result;\n}\n\nmodule.exports = equalObjects;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODIuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fZXF1YWxPYmplY3RzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnZXRBbGxLZXlzID0gcmVxdWlyZSgnLi9fZ2V0QWxsS2V5cycpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDE7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBvYmplY3RzIHdpdGggc3VwcG9ydCBmb3JcbiAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICBvYmpQcm9wcyA9IGdldEFsbEtleXMob2JqZWN0KSxcbiAgICAgIG9iakxlbmd0aCA9IG9ialByb3BzLmxlbmd0aCxcbiAgICAgIG90aFByb3BzID0gZ2V0QWxsS2V5cyhvdGhlciksXG4gICAgICBvdGhMZW5ndGggPSBvdGhQcm9wcy5sZW5ndGg7XG5cbiAgaWYgKG9iakxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIWlzUGFydGlhbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgaW5kZXggPSBvYmpMZW5ndGg7XG4gIHdoaWxlIChpbmRleC0tKSB7XG4gICAgdmFyIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICBpZiAoIShpc1BhcnRpYWwgPyBrZXkgaW4gb3RoZXIgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCBrZXkpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gIGlmIChzdGFja2VkICYmIHN0YWNrLmdldChvdGhlcikpIHtcbiAgICByZXR1cm4gc3RhY2tlZCA9PSBvdGhlcjtcbiAgfVxuICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICBzdGFjay5zZXQob3RoZXIsIG9iamVjdCk7XG5cbiAgdmFyIHNraXBDdG9yID0gaXNQYXJ0aWFsO1xuICB3aGlsZSAoKytpbmRleCA8IG9iakxlbmd0aCkge1xuICAgIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcbiAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltrZXldO1xuXG4gICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIG9ialZhbHVlLCBrZXksIG90aGVyLCBvYmplY3QsIHN0YWNrKVxuICAgICAgICA6IGN1c3RvbWl6ZXIob2JqVmFsdWUsIG90aFZhbHVlLCBrZXksIG9iamVjdCwgb3RoZXIsIHN0YWNrKTtcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgaWYgKCEoY29tcGFyZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gKG9ialZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMob2JqVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpXG4gICAgICAgICAgOiBjb21wYXJlZFxuICAgICAgICApKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBza2lwQ3RvciB8fCAoc2tpcEN0b3IgPSBrZXkgPT0gJ2NvbnN0cnVjdG9yJyk7XG4gIH1cbiAgaWYgKHJlc3VsdCAmJiAhc2tpcEN0b3IpIHtcbiAgICB2YXIgb2JqQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgb3RoQ3RvciA9IG90aGVyLmNvbnN0cnVjdG9yO1xuXG4gICAgLy8gTm9uIGBPYmplY3RgIG9iamVjdCBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgY29uc3RydWN0b3JzIGFyZSBub3QgZXF1YWwuXG4gICAgaWYgKG9iakN0b3IgIT0gb3RoQ3RvciAmJlxuICAgICAgICAoJ2NvbnN0cnVjdG9yJyBpbiBvYmplY3QgJiYgJ2NvbnN0cnVjdG9yJyBpbiBvdGhlcikgJiZcbiAgICAgICAgISh0eXBlb2Ygb2JqQ3RvciA9PSAnZnVuY3Rpb24nICYmIG9iakN0b3IgaW5zdGFuY2VvZiBvYmpDdG9yICYmXG4gICAgICAgICAgdHlwZW9mIG90aEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvdGhDdG9yIGluc3RhbmNlb2Ygb3RoQ3RvcikpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcbiAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlcXVhbE9iamVjdHM7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19lcXVhbE9iamVjdHMuanNcbi8vIG1vZHVsZSBpZCA9IDgyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 83 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseGetAllKeys = __webpack_require__(84),\n    getSymbols = __webpack_require__(87),\n    keys = __webpack_require__(90);\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n  return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODMuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0QWxsS2V5cy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUdldEFsbEtleXMgPSByZXF1aXJlKCcuL19iYXNlR2V0QWxsS2V5cycpLFxuICAgIGdldFN5bWJvbHMgPSByZXF1aXJlKCcuL19nZXRTeW1ib2xzJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KSB7XG4gIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXMsIGdldFN5bWJvbHMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEFsbEtleXM7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19nZXRBbGxLZXlzLmpzXG4vLyBtb2R1bGUgaWQgPSA4M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 84 */
/***/ function(module, exports, __webpack_require__) {

    eval("var arrayPush = __webpack_require__(85),\n    isArray = __webpack_require__(86);\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n  var result = keysFunc(object);\n  return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldEFsbEtleXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGFycmF5UHVzaCA9IHJlcXVpcmUoJy4vX2FycmF5UHVzaCcpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0QWxsS2V5c2AgYW5kIGBnZXRBbGxLZXlzSW5gIHdoaWNoIHVzZXNcbiAqIGBrZXlzRnVuY2AgYW5kIGBzeW1ib2xzRnVuY2AgdG8gZ2V0IHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN5bWJvbHNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNGdW5jLCBzeW1ib2xzRnVuYykge1xuICB2YXIgcmVzdWx0ID0ga2V5c0Z1bmMob2JqZWN0KTtcbiAgcmV0dXJuIGlzQXJyYXkob2JqZWN0KSA/IHJlc3VsdCA6IGFycmF5UHVzaChyZXN1bHQsIHN5bWJvbHNGdW5jKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXRBbGxLZXlzO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZUdldEFsbEtleXMuanNcbi8vIG1vZHVsZSBpZCA9IDg0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 85 */
/***/ function(module, exports) {

    eval("/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\nmodule.exports = arrayPush;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODUuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlQdXNoLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwZW5kcyB0aGUgZWxlbWVudHMgb2YgYHZhbHVlc2AgdG8gYGFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFwcGVuZC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBhcnJheVB1c2goYXJyYXksIHZhbHVlcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICBvZmZzZXQgPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhcnJheVtvZmZzZXQgKyBpbmRleF0gPSB2YWx1ZXNbaW5kZXhdO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheVB1c2g7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19hcnJheVB1c2guanNcbi8vIG1vZHVsZSBpZCA9IDg1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 86 */
/***/ function(module, exports) {

    eval("/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODYuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheSgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL2lzQXJyYXkuanNcbi8vIG1vZHVsZSBpZCA9IDg2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 87 */
/***/ function(module, exports, __webpack_require__) {

    eval("var arrayFilter = __webpack_require__(88),\n    stubArray = __webpack_require__(89);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n  if (object == null) {\n    return [];\n  }\n  object = Object(object);\n  return arrayFilter(nativeGetSymbols(object), function(symbol) {\n    return propertyIsEnumerable.call(object, symbol);\n  });\n};\n\nmodule.exports = getSymbols;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODcuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0U3ltYm9scy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXJyYXlGaWx0ZXIgPSByZXF1aXJlKCcuL19hcnJheUZpbHRlcicpLFxuICAgIHN0dWJBcnJheSA9IHJlcXVpcmUoJy4vc3R1YkFycmF5Jyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVHZXRTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gKi9cbnZhciBnZXRTeW1ib2xzID0gIW5hdGl2ZUdldFN5bWJvbHMgPyBzdHViQXJyYXkgOiBmdW5jdGlvbihvYmplY3QpIHtcbiAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICByZXR1cm4gYXJyYXlGaWx0ZXIobmF0aXZlR2V0U3ltYm9scyhvYmplY3QpLCBmdW5jdGlvbihzeW1ib2wpIHtcbiAgICByZXR1cm4gcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmplY3QsIHN5bWJvbCk7XG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRTeW1ib2xzO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fZ2V0U3ltYm9scy5qc1xuLy8gbW9kdWxlIGlkID0gODdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 88 */
/***/ function(module, exports) {

    eval("/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      resIndex = 0,\n      result = [];\n\n  while (++index < length) {\n    var value = array[index];\n    if (predicate(value, index, array)) {\n      result[resIndex++] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayFilter;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODguanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlGaWx0ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZmlsdGVyYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5RmlsdGVyKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5RmlsdGVyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYXJyYXlGaWx0ZXIuanNcbi8vIG1vZHVsZSBpZCA9IDg4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 89 */
/***/ function(module, exports) {

    eval("/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n  return [];\n}\n\nmodule.exports = stubArray;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODkuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9zdHViQXJyYXkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGVtcHR5IGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhcnJheXMgPSBfLnRpbWVzKDIsIF8uc3R1YkFycmF5KTtcbiAqXG4gKiBjb25zb2xlLmxvZyhhcnJheXMpO1xuICogLy8gPT4gW1tdLCBbXV1cbiAqXG4gKiBjb25zb2xlLmxvZyhhcnJheXNbMF0gPT09IGFycmF5c1sxXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBzdHViQXJyYXkoKSB7XG4gIHJldHVybiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViQXJyYXk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL3N0dWJBcnJheS5qc1xuLy8gbW9kdWxlIGlkID0gODlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 90 */
/***/ function(module, exports, __webpack_require__) {

    eval("var arrayLikeKeys = __webpack_require__(91),\n    baseKeys = __webpack_require__(104),\n    isArrayLike = __webpack_require__(108);\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTAuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9rZXlzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheUxpa2VLZXlzID0gcmVxdWlyZSgnLi9fYXJyYXlMaWtlS2V5cycpLFxuICAgIGJhc2VLZXlzID0gcmVxdWlyZSgnLi9fYmFzZUtleXMnKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy4gU2VlIHRoZVxuICogW0VTIHNwZWNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICogZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXMobmV3IEZvbyk7XG4gKiAvLyA9PiBbJ2EnLCAnYiddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogXy5rZXlzKCdoaScpO1xuICogLy8gPT4gWycwJywgJzEnXVxuICovXG5mdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0KSA6IGJhc2VLZXlzKG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ga2V5cztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gva2V5cy5qc1xuLy8gbW9kdWxlIGlkID0gOTBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 91 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseTimes = __webpack_require__(92),\n    isArguments = __webpack_require__(93),\n    isArray = __webpack_require__(86),\n    isBuffer = __webpack_require__(95),\n    isIndex = __webpack_require__(98),\n    isTypedArray = __webpack_require__(99);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n  var isArr = isArray(value),\n      isArg = !isArr && isArguments(value),\n      isBuff = !isArr && !isArg && isBuffer(value),\n      isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n      skipIndexes = isArr || isArg || isBuff || isType,\n      result = skipIndexes ? baseTimes(value.length, String) : [],\n      length = result.length;\n\n  for (var key in value) {\n    if ((inherited || hasOwnProperty.call(value, key)) &&\n        !(skipIndexes && (\n           // Safari 9 has enumerable `arguments.length` in strict mode.\n           key == 'length' ||\n           // Node.js 0.10 has enumerable non-index properties on buffers.\n           (isBuff && (key == 'offset' || key == 'parent')) ||\n           // PhantomJS 2 has enumerable non-index properties on typed arrays.\n           (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n           // Skip index properties.\n           isIndex(key, length)\n        ))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayLikeKeys;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTEuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlMaWtlS2V5cy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZVRpbWVzID0gcmVxdWlyZSgnLi9fYmFzZVRpbWVzJyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSBpbmhlcml0ZWQgU3BlY2lmeSByZXR1cm5pbmcgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSwgaW5oZXJpdGVkKSB7XG4gIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpLFxuICAgICAgaXNBcmcgPSAhaXNBcnIgJiYgaXNBcmd1bWVudHModmFsdWUpLFxuICAgICAgaXNCdWZmID0gIWlzQXJyICYmICFpc0FyZyAmJiBpc0J1ZmZlcih2YWx1ZSksXG4gICAgICBpc1R5cGUgPSAhaXNBcnIgJiYgIWlzQXJnICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHZhbHVlKSxcbiAgICAgIHNraXBJbmRleGVzID0gaXNBcnIgfHwgaXNBcmcgfHwgaXNCdWZmIHx8IGlzVHlwZSxcbiAgICAgIHJlc3VsdCA9IHNraXBJbmRleGVzID8gYmFzZVRpbWVzKHZhbHVlLmxlbmd0aCwgU3RyaW5nKSA6IFtdLFxuICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSAmJlxuICAgICAgICAhKHNraXBJbmRleGVzICYmIChcbiAgICAgICAgICAgLy8gU2FmYXJpIDkgaGFzIGVudW1lcmFibGUgYGFyZ3VtZW50cy5sZW5ndGhgIGluIHN0cmljdCBtb2RlLlxuICAgICAgICAgICBrZXkgPT0gJ2xlbmd0aCcgfHxcbiAgICAgICAgICAgLy8gTm9kZS5qcyAwLjEwIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIGJ1ZmZlcnMuXG4gICAgICAgICAgIChpc0J1ZmYgJiYgKGtleSA9PSAnb2Zmc2V0JyB8fCBrZXkgPT0gJ3BhcmVudCcpKSB8fFxuICAgICAgICAgICAvLyBQaGFudG9tSlMgMiBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiB0eXBlZCBhcnJheXMuXG4gICAgICAgICAgIChpc1R5cGUgJiYgKGtleSA9PSAnYnVmZmVyJyB8fCBrZXkgPT0gJ2J5dGVMZW5ndGgnIHx8IGtleSA9PSAnYnl0ZU9mZnNldCcpKSB8fFxuICAgICAgICAgICAvLyBTa2lwIGluZGV4IHByb3BlcnRpZXMuXG4gICAgICAgICAgIGlzSW5kZXgoa2V5LCBsZW5ndGgpXG4gICAgICAgICkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5TGlrZUtleXM7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19hcnJheUxpa2VLZXlzLmpzXG4vLyBtb2R1bGUgaWQgPSA5MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 92 */
/***/ function(module, exports) {

    eval("/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n  var index = -1,\n      result = Array(n);\n\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\n\nmodule.exports = baseTimes;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTIuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRpbWVzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udGltZXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kc1xuICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBiYXNlVGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRpbWVzO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZVRpbWVzLmpzXG4vLyBtb2R1bGUgaWQgPSA5MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 93 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseIsArguments = __webpack_require__(94),\n    isObjectLike = __webpack_require__(26);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n    !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTMuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FyZ3VtZW50cy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9fYmFzZUlzQXJndW1lbnRzJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID8gYmFzZUlzQXJndW1lbnRzIDogZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICdjYWxsZWUnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcmd1bWVudHM7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL2lzQXJndW1lbnRzLmpzXG4vLyBtb2R1bGUgaWQgPSA5M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 94 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseGetTag = __webpack_require__(20),\n    isObjectLike = __webpack_require__(26);\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n  return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTQuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzQXJndW1lbnRzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcmd1bWVudHNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqL1xuZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGFyZ3NUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzQXJndW1lbnRzO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZUlzQXJndW1lbnRzLmpzXG4vLyBtb2R1bGUgaWQgPSA5NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 95 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(module) {var root = __webpack_require__(22),\n    stubFalse = __webpack_require__(97);\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(96)(module)))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTUuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0J1ZmZlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKSxcbiAgICBzdHViRmFsc2UgPSByZXF1aXJlKCcuL3N0dWJGYWxzZScpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIEJ1ZmZlciA9IG1vZHVsZUV4cG9ydHMgPyByb290LkJ1ZmZlciA6IHVuZGVmaW5lZDtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUlzQnVmZmVyID0gQnVmZmVyID8gQnVmZmVyLmlzQnVmZmVyIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4zLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNCdWZmZXIobmV3IEJ1ZmZlcigyKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0J1ZmZlcihuZXcgVWludDhBcnJheSgyKSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNCdWZmZXIgPSBuYXRpdmVJc0J1ZmZlciB8fCBzdHViRmFsc2U7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNCdWZmZXI7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL2lzQnVmZmVyLmpzXG4vLyBtb2R1bGUgaWQgPSA5NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 96 */
/***/ function(module, exports) {

    eval("module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tmodule.children = [];\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n}\r\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTYuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL3dlYnBhY2svYnVpbGRpbi9tb2R1bGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcclxuXHRpZighbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xyXG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XHJcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcclxuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxyXG5cdFx0bW9kdWxlLmNoaWxkcmVuID0gW107XHJcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcclxuXHR9XHJcblx0cmV0dXJuIG1vZHVsZTtcclxufVxyXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAod2VicGFjaykvYnVpbGRpbi9tb2R1bGUuanNcbi8vIG1vZHVsZSBpZCA9IDk2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 97 */
/***/ function(module, exports) {

    eval("/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n  return false;\n}\n\nmodule.exports = stubFalse;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTcuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9zdHViRmFsc2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEzLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRpbWVzKDIsIF8uc3R1YkZhbHNlKTtcbiAqIC8vID0+IFtmYWxzZSwgZmFsc2VdXG4gKi9cbmZ1bmN0aW9uIHN0dWJGYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0dWJGYWxzZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvc3R1YkZhbHNlLmpzXG4vLyBtb2R1bGUgaWQgPSA5N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 98 */
/***/ function(module, exports) {

    eval("/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  length = length == null ? MAX_SAFE_INTEGER : length;\n  return !!length &&\n    (typeof value == 'number' || reIsUint.test(value)) &&\n    (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTguanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNJbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xudmFyIHJlSXNVaW50ID0gL14oPzowfFsxLTldXFxkKikkLztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9TUFYX1NBRkVfSU5URUdFUl0gVGhlIHVwcGVyIGJvdW5kcyBvZiBhIHZhbGlkIGluZGV4LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHtcbiAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoO1xuICByZXR1cm4gISFsZW5ndGggJiZcbiAgICAodHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8IHJlSXNVaW50LnRlc3QodmFsdWUpKSAmJlxuICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0luZGV4O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9faXNJbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gOThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 99 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseIsTypedArray = __webpack_require__(100),\n    baseUnary = __webpack_require__(102),\n    nodeUtil = __webpack_require__(103);\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTkuanMiLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1R5cGVkQXJyYXkuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VJc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL19iYXNlSXNUeXBlZEFycmF5JyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgbm9kZVV0aWwgPSByZXF1aXJlKCcuL19ub2RlVXRpbCcpO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc1R5cGVkQXJyYXkgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1R5cGVkQXJyYXk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIHR5cGVkIGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNUeXBlZEFycmF5KFtdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc1R5cGVkQXJyYXkgPSBub2RlSXNUeXBlZEFycmF5ID8gYmFzZVVuYXJ5KG5vZGVJc1R5cGVkQXJyYXkpIDogYmFzZUlzVHlwZWRBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc1R5cGVkQXJyYXk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL2lzVHlwZWRBcnJheS5qc1xuLy8gbW9kdWxlIGlkID0gOTlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 100 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseGetTag = __webpack_require__(20),\n    isLength = __webpack_require__(101),\n    isObjectLike = __webpack_require__(26);\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n  return isObjectLike(value) &&\n    isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc1R5cGVkQXJyYXkuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNMZW5ndGggPSByZXF1aXJlKCcuL2lzTGVuZ3RoJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgb2YgdHlwZWQgYXJyYXlzLiAqL1xudmFyIHR5cGVkQXJyYXlUYWdzID0ge307XG50eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddID1cbnR5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID1cbnR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQ4VGFnXSA9XG50eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDE2VGFnXSA9XG50eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbnR5cGVkQXJyYXlUYWdzW2FyZ3NUYWddID0gdHlwZWRBcnJheVRhZ3NbYXJyYXlUYWddID1cbnR5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Jvb2xUYWddID1cbnR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2RhdGVUYWddID1cbnR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Z1bmNUYWddID1cbnR5cGVkQXJyYXlUYWdzW21hcFRhZ10gPSB0eXBlZEFycmF5VGFnc1tudW1iZXJUYWddID1cbnR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPSB0eXBlZEFycmF5VGFnc1tyZWdleHBUYWddID1cbnR5cGVkQXJyYXlUYWdzW3NldFRhZ10gPSB0eXBlZEFycmF5VGFnc1tzdHJpbmdUYWddID1cbnR5cGVkQXJyYXlUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNUeXBlZEFycmF5YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiZcbiAgICBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3NbYmFzZUdldFRhZyh2YWx1ZSldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc1R5cGVkQXJyYXk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19iYXNlSXNUeXBlZEFycmF5LmpzXG4vLyBtb2R1bGUgaWQgPSAxMDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 101 */
/***/ function(module, exports) {

    eval("/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNMZW5ndGguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTGVuZ3RoKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmXG4gICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTGVuZ3RoO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9pc0xlbmd0aC5qc1xuLy8gbW9kdWxlIGlkID0gMTAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 102 */
/***/ function(module, exports) {

    eval("/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n  return function(value) {\n    return func(value);\n  };\n}\n\nmodule.exports = baseUnary;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VVbmFyeS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVVuYXJ5O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZVVuYXJ5LmpzXG4vLyBtb2R1bGUgaWQgPSAxMDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 103 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(module) {var freeGlobal = __webpack_require__(23);\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n  try {\n    return freeProcess && freeProcess.binding && freeProcess.binding('util');\n  } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(96)(module)))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX25vZGVVdGlsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBmcmVlR2xvYmFsID0gcmVxdWlyZSgnLi9fZnJlZUdsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgcHJvY2Vzc2AgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVQcm9jZXNzID0gbW9kdWxlRXhwb3J0cyAmJiBmcmVlR2xvYmFsLnByb2Nlc3M7XG5cbi8qKiBVc2VkIHRvIGFjY2VzcyBmYXN0ZXIgTm9kZS5qcyBoZWxwZXJzLiAqL1xudmFyIG5vZGVVdGlsID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIHJldHVybiBmcmVlUHJvY2VzcyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKTtcbiAgfSBjYXRjaCAoZSkge31cbn0oKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbm9kZVV0aWw7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19ub2RlVXRpbC5qc1xuLy8gbW9kdWxlIGlkID0gMTAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 104 */
/***/ function(module, exports, __webpack_require__) {

    eval("var isPrototype = __webpack_require__(105),\n    nativeKeys = __webpack_require__(106);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n  if (!isPrototype(object)) {\n    return nativeKeys(object);\n  }\n  var result = [];\n  for (var key in Object(object)) {\n    if (hasOwnProperty.call(object, key) && key != 'constructor') {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseKeys;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VLZXlzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyksXG4gICAgbmF0aXZlS2V5cyA9IHJlcXVpcmUoJy4vX25hdGl2ZUtleXMnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkge1xuICBpZiAoIWlzUHJvdG90eXBlKG9iamVjdCkpIHtcbiAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xuICB9XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGtleSAhPSAnY29uc3RydWN0b3InKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VLZXlzO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZUtleXMuanNcbi8vIG1vZHVsZSBpZCA9IDEwNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 105 */
/***/ function(module, exports) {

    eval("/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n  var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n  return value === proto;\n}\n\nmodule.exports = isPrototype;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzUHJvdG90eXBlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3RvdHlwZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLFxuICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1Byb3RvdHlwZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2lzUHJvdG90eXBlLmpzXG4vLyBtb2R1bGUgaWQgPSAxMDVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 106 */
/***/ function(module, exports, __webpack_require__) {

    eval("var overArg = __webpack_require__(107);\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUtleXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIG92ZXJBcmcgPSByZXF1aXJlKCcuL19vdmVyQXJnJyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVLZXlzO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fbmF0aXZlS2V5cy5qc1xuLy8gbW9kdWxlIGlkID0gMTA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 107 */
/***/ function(module, exports) {

    eval("/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\nmodule.exports = overArg;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX292ZXJBcmcuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3ZlckFyZztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX292ZXJBcmcuanNcbi8vIG1vZHVsZSBpZCA9IDEwN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 108 */
/***/ function(module, exports, __webpack_require__) {

    eval("var isFunction = __webpack_require__(50),\n    isLength = __webpack_require__(101);\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheUxpa2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgYXJyYXktbGlrZSBpZiBpdCdzXG4gKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZSgnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheUxpa2U7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL2lzQXJyYXlMaWtlLmpzXG4vLyBtb2R1bGUgaWQgPSAxMDhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 109 */
/***/ function(module, exports, __webpack_require__) {

    eval("var DataView = __webpack_require__(110),\n    Map = __webpack_require__(47),\n    Promise = __webpack_require__(111),\n    Set = __webpack_require__(112),\n    WeakMap = __webpack_require__(113),\n    baseGetTag = __webpack_require__(20),\n    toSource = __webpack_require__(53);\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    objectTag = '[object Object]',\n    promiseTag = '[object Promise]',\n    setTag = '[object Set]',\n    weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n    mapCtorString = toSource(Map),\n    promiseCtorString = toSource(Promise),\n    setCtorString = toSource(Set),\n    weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n    (Map && getTag(new Map) != mapTag) ||\n    (Promise && getTag(Promise.resolve()) != promiseTag) ||\n    (Set && getTag(new Set) != setTag) ||\n    (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n  getTag = function(value) {\n    var result = baseGetTag(value),\n        Ctor = result == objectTag ? value.constructor : undefined,\n        ctorString = Ctor ? toSource(Ctor) : '';\n\n    if (ctorString) {\n      switch (ctorString) {\n        case dataViewCtorString: return dataViewTag;\n        case mapCtorString: return mapTag;\n        case promiseCtorString: return promiseTag;\n        case setCtorString: return setTag;\n        case weakMapCtorString: return weakMapTag;\n      }\n    }\n    return result;\n  };\n}\n\nmodule.exports = getTag;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFRhZy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgRGF0YVZpZXcgPSByZXF1aXJlKCcuL19EYXRhVmlldycpLFxuICAgIE1hcCA9IHJlcXVpcmUoJy4vX01hcCcpLFxuICAgIFByb21pc2UgPSByZXF1aXJlKCcuL19Qcm9taXNlJyksXG4gICAgU2V0ID0gcmVxdWlyZSgnLi9fU2V0JyksXG4gICAgV2Vha01hcCA9IHJlcXVpcmUoJy4vX1dlYWtNYXAnKSxcbiAgICBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIHRvU291cmNlID0gcmVxdWlyZSgnLi9fdG9Tb3VyY2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHByb21pc2VUYWcgPSAnW29iamVjdCBQcm9taXNlXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1hcHMsIHNldHMsIGFuZCB3ZWFrbWFwcy4gKi9cbnZhciBkYXRhVmlld0N0b3JTdHJpbmcgPSB0b1NvdXJjZShEYXRhVmlldyksXG4gICAgbWFwQ3RvclN0cmluZyA9IHRvU291cmNlKE1hcCksXG4gICAgcHJvbWlzZUN0b3JTdHJpbmcgPSB0b1NvdXJjZShQcm9taXNlKSxcbiAgICBzZXRDdG9yU3RyaW5nID0gdG9Tb3VyY2UoU2V0KSxcbiAgICB3ZWFrTWFwQ3RvclN0cmluZyA9IHRvU291cmNlKFdlYWtNYXApO1xuXG4vKipcbiAqIEdldHMgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG52YXIgZ2V0VGFnID0gYmFzZUdldFRhZztcblxuLy8gRmFsbGJhY2sgZm9yIGRhdGEgdmlld3MsIG1hcHMsIHNldHMsIGFuZCB3ZWFrIG1hcHMgaW4gSUUgMTEgYW5kIHByb21pc2VzIGluIE5vZGUuanMgPCA2LlxuaWYgKChEYXRhVmlldyAmJiBnZXRUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpICE9IGRhdGFWaWV3VGFnKSB8fFxuICAgIChNYXAgJiYgZ2V0VGFnKG5ldyBNYXApICE9IG1hcFRhZykgfHxcbiAgICAoUHJvbWlzZSAmJiBnZXRUYWcoUHJvbWlzZS5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcpIHx8XG4gICAgKFNldCAmJiBnZXRUYWcobmV3IFNldCkgIT0gc2V0VGFnKSB8fFxuICAgIChXZWFrTWFwICYmIGdldFRhZyhuZXcgV2Vha01hcCkgIT0gd2Vha01hcFRhZykpIHtcbiAgZ2V0VGFnID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgcmVzdWx0ID0gYmFzZUdldFRhZyh2YWx1ZSksXG4gICAgICAgIEN0b3IgPSByZXN1bHQgPT0gb2JqZWN0VGFnID8gdmFsdWUuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgIGN0b3JTdHJpbmcgPSBDdG9yID8gdG9Tb3VyY2UoQ3RvcikgOiAnJztcblxuICAgIGlmIChjdG9yU3RyaW5nKSB7XG4gICAgICBzd2l0Y2ggKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgY2FzZSBkYXRhVmlld0N0b3JTdHJpbmc6IHJldHVybiBkYXRhVmlld1RhZztcbiAgICAgICAgY2FzZSBtYXBDdG9yU3RyaW5nOiByZXR1cm4gbWFwVGFnO1xuICAgICAgICBjYXNlIHByb21pc2VDdG9yU3RyaW5nOiByZXR1cm4gcHJvbWlzZVRhZztcbiAgICAgICAgY2FzZSBzZXRDdG9yU3RyaW5nOiByZXR1cm4gc2V0VGFnO1xuICAgICAgICBjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOiByZXR1cm4gd2Vha01hcFRhZztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRUYWc7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19nZXRUYWcuanNcbi8vIG1vZHVsZSBpZCA9IDEwOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 110 */
/***/ function(module, exports, __webpack_require__) {

    eval("var getNative = __webpack_require__(48),\n    root = __webpack_require__(22);\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX0RhdGFWaWV3LmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgRGF0YVZpZXcgPSBnZXROYXRpdmUocm9vdCwgJ0RhdGFWaWV3Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRGF0YVZpZXc7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19EYXRhVmlldy5qc1xuLy8gbW9kdWxlIGlkID0gMTEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 111 */
/***/ function(module, exports, __webpack_require__) {

    eval("var getNative = __webpack_require__(48),\n    root = __webpack_require__(22);\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTExLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1Byb21pc2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBQcm9taXNlID0gZ2V0TmF0aXZlKHJvb3QsICdQcm9taXNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gUHJvbWlzZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX1Byb21pc2UuanNcbi8vIG1vZHVsZSBpZCA9IDExMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 112 */
/***/ function(module, exports, __webpack_require__) {

    eval("var getNative = __webpack_require__(48),\n    root = __webpack_require__(22);\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1NldC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFNldCA9IGdldE5hdGl2ZShyb290LCAnU2V0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gU2V0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fU2V0LmpzXG4vLyBtb2R1bGUgaWQgPSAxMTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 113 */
/***/ function(module, exports, __webpack_require__) {

    eval("var getNative = __webpack_require__(48),\n    root = __webpack_require__(22);\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1dlYWtNYXAuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBXZWFrTWFwID0gZ2V0TmF0aXZlKHJvb3QsICdXZWFrTWFwJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gV2Vha01hcDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX1dlYWtNYXAuanNcbi8vIG1vZHVsZSBpZCA9IDExM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 114 */
/***/ function(module, exports, __webpack_require__) {

    eval("var isStrictComparable = __webpack_require__(115),\n    keys = __webpack_require__(90);\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n  var result = keys(object),\n      length = result.length;\n\n  while (length--) {\n    var key = result[length],\n        value = object[key];\n\n    result[length] = [key, value, isStrictComparable(value)];\n  }\n  return result;\n}\n\nmodule.exports = getMatchData;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE1hdGNoRGF0YS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaXNTdHJpY3RDb21wYXJhYmxlID0gcmVxdWlyZSgnLi9faXNTdHJpY3RDb21wYXJhYmxlJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIEdldHMgdGhlIHByb3BlcnR5IG5hbWVzLCB2YWx1ZXMsIGFuZCBjb21wYXJlIGZsYWdzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG1hdGNoIGRhdGEgb2YgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGdldE1hdGNoRGF0YShvYmplY3QpIHtcbiAgdmFyIHJlc3VsdCA9IGtleXMob2JqZWN0KSxcbiAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgdmFyIGtleSA9IHJlc3VsdFtsZW5ndGhdLFxuICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgcmVzdWx0W2xlbmd0aF0gPSBba2V5LCB2YWx1ZSwgaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKV07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRNYXRjaERhdGE7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19nZXRNYXRjaERhdGEuanNcbi8vIG1vZHVsZSBpZCA9IDExNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 115 */
/***/ function(module, exports, __webpack_require__) {

    eval("var isObject = __webpack_require__(18);\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n *  equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n  return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzU3RyaWN0Q29tcGFyYWJsZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpZiBzdWl0YWJsZSBmb3Igc3RyaWN0XG4gKiAgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgJiYgIWlzT2JqZWN0KHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1N0cmljdENvbXBhcmFibGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19pc1N0cmljdENvbXBhcmFibGUuanNcbi8vIG1vZHVsZSBpZCA9IDExNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 116 */
/***/ function(module, exports) {

    eval("/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n  return function(object) {\n    if (object == null) {\n      return false;\n    }\n    return object[key] === srcValue &&\n      (srcValue !== undefined || (key in Object(object)));\n  };\n}\n\nmodule.exports = matchesStrictComparable;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hdGNoZXNTdHJpY3RDb21wYXJhYmxlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBtYXRjaGVzUHJvcGVydHlgIGZvciBzb3VyY2UgdmFsdWVzIHN1aXRhYmxlXG4gKiBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LCBzcmNWYWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Rba2V5XSA9PT0gc3JjVmFsdWUgJiZcbiAgICAgIChzcmNWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8IChrZXkgaW4gT2JqZWN0KG9iamVjdCkpKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX21hdGNoZXNTdHJpY3RDb21wYXJhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSAxMTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 117 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseIsEqual = __webpack_require__(70),\n    get = __webpack_require__(118),\n    hasIn = __webpack_require__(129),\n    isKey = __webpack_require__(121),\n    isStrictComparable = __webpack_require__(115),\n    matchesStrictComparable = __webpack_require__(116),\n    toKey = __webpack_require__(128);\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n  if (isKey(path) && isStrictComparable(srcValue)) {\n    return matchesStrictComparable(toKey(path), srcValue);\n  }\n  return function(object) {\n    var objValue = get(object, path);\n    return (objValue === undefined && objValue === srcValue)\n      ? hasIn(object, path)\n      : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n  };\n}\n\nmodule.exports = baseMatchesProperty;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNYXRjaGVzUHJvcGVydHkuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VJc0VxdWFsID0gcmVxdWlyZSgnLi9fYmFzZUlzRXF1YWwnKSxcbiAgICBnZXQgPSByZXF1aXJlKCcuL2dldCcpLFxuICAgIGhhc0luID0gcmVxdWlyZSgnLi9oYXNJbicpLFxuICAgIGlzS2V5ID0gcmVxdWlyZSgnLi9faXNLZXknKSxcbiAgICBpc1N0cmljdENvbXBhcmFibGUgPSByZXF1aXJlKCcuL19pc1N0cmljdENvbXBhcmFibGUnKSxcbiAgICBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSA9IHJlcXVpcmUoJy4vX21hdGNoZXNTdHJpY3RDb21wYXJhYmxlJyksXG4gICAgdG9LZXkgPSByZXF1aXJlKCcuL190b0tleScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWF0Y2hlc1Byb3BlcnR5YCB3aGljaCBkb2Vzbid0IGNsb25lIGBzcmNWYWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCwgc3JjVmFsdWUpIHtcbiAgaWYgKGlzS2V5KHBhdGgpICYmIGlzU3RyaWN0Q29tcGFyYWJsZShzcmNWYWx1ZSkpIHtcbiAgICByZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUodG9LZXkocGF0aCksIHNyY1ZhbHVlKTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIG9ialZhbHVlID0gZ2V0KG9iamVjdCwgcGF0aCk7XG4gICAgcmV0dXJuIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIG9ialZhbHVlID09PSBzcmNWYWx1ZSlcbiAgICAgID8gaGFzSW4ob2JqZWN0LCBwYXRoKVxuICAgICAgOiBiYXNlSXNFcXVhbChzcmNWYWx1ZSwgb2JqVmFsdWUsIENPTVBBUkVfUEFSVElBTF9GTEFHIHwgQ09NUEFSRV9VTk9SREVSRURfRkxBRyk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZU1hdGNoZXNQcm9wZXJ0eTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2Jhc2VNYXRjaGVzUHJvcGVydHkuanNcbi8vIG1vZHVsZSBpZCA9IDExN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 118 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseGet = __webpack_require__(119);\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n  var result = object == null ? undefined : baseGet(object, path);\n  return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvZ2V0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpO1xuXG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzXG4gKiBgdW5kZWZpbmVkYCwgdGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGluIGl0cyBwbGFjZS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuNy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGB1bmRlZmluZWRgIHJlc29sdmVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAqXG4gKiBfLmdldChvYmplY3QsICdhWzBdLmIuYycpO1xuICogLy8gPT4gM1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICogLy8gPT4gM1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgJ2EuYi5jJywgJ2RlZmF1bHQnKTtcbiAqIC8vID0+ICdkZWZhdWx0J1xuICovXG5mdW5jdGlvbiBnZXQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9nZXQuanNcbi8vIG1vZHVsZSBpZCA9IDExOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 119 */
/***/ function(module, exports, __webpack_require__) {

    eval("var castPath = __webpack_require__(120),\n    toKey = __webpack_require__(128);\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n  path = castPath(path, object);\n\n  var index = 0,\n      length = path.length;\n\n  while (object != null && index < length) {\n    object = object[toKey(path[index++])];\n  }\n  return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXQuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZ2V0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZmF1bHQgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0KG9iamVjdCwgcGF0aCkge1xuICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAwLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cbiAgd2hpbGUgKG9iamVjdCAhPSBudWxsICYmIGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgb2JqZWN0ID0gb2JqZWN0W3RvS2V5KHBhdGhbaW5kZXgrK10pXTtcbiAgfVxuICByZXR1cm4gKGluZGV4ICYmIGluZGV4ID09IGxlbmd0aCkgPyBvYmplY3QgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2Jhc2VHZXQuanNcbi8vIG1vZHVsZSBpZCA9IDExOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 120 */
/***/ function(module, exports, __webpack_require__) {

    eval("var isArray = __webpack_require__(86),\n    isKey = __webpack_require__(121),\n    stringToPath = __webpack_require__(122),\n    toString = __webpack_require__(125);\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n  if (isArray(value)) {\n    return value;\n  }\n  return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nhc3RQYXRoLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL19pc0tleScpLFxuICAgIHN0cmluZ1RvUGF0aCA9IHJlcXVpcmUoJy4vX3N0cmluZ1RvUGF0aCcpLFxuICAgIHRvU3RyaW5nID0gcmVxdWlyZSgnLi90b1N0cmluZycpO1xuXG4vKipcbiAqIENhc3RzIGB2YWx1ZWAgdG8gYSBwYXRoIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkge1xuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGlzS2V5KHZhbHVlLCBvYmplY3QpID8gW3ZhbHVlXSA6IHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhc3RQYXRoO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fY2FzdFBhdGguanNcbi8vIG1vZHVsZSBpZCA9IDEyMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 121 */
/***/ function(module, exports, __webpack_require__) {

    eval("var isArray = __webpack_require__(86),\n    isSymbol = __webpack_require__(19);\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n    reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n  if (isArray(value)) {\n    return false;\n  }\n  var type = typeof value;\n  if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n      value == null || isSymbol(value)) {\n    return true;\n  }\n  return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n    (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzS2V5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZUlzRGVlcFByb3AgPSAvXFwufFxcWyg/OlteW1xcXV0qfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqP1xcMSlcXF0vLFxuICAgIHJlSXNQbGFpblByb3AgPSAvXlxcdyokLztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleSh2YWx1ZSwgb2JqZWN0KSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuICAgICAgdmFsdWUgPT0gbnVsbCB8fCBpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gcmVJc1BsYWluUHJvcC50ZXN0KHZhbHVlKSB8fCAhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpIHx8XG4gICAgKG9iamVjdCAhPSBudWxsICYmIHZhbHVlIGluIE9iamVjdChvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0tleTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2lzS2V5LmpzXG4vLyBtb2R1bGUgaWQgPSAxMjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 122 */
/***/ function(module, exports, __webpack_require__) {

    eval("var memoizeCapped = __webpack_require__(123);\n\n/** Used to match property names within property paths. */\nvar reLeadingDot = /^\\./,\n    rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n  var result = [];\n  if (reLeadingDot.test(string)) {\n    result.push('');\n  }\n  string.replace(rePropName, function(match, number, quote, string) {\n    result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n  });\n  return result;\n});\n\nmodule.exports = stringToPath;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0cmluZ1RvUGF0aC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgbWVtb2l6ZUNhcHBlZCA9IHJlcXVpcmUoJy4vX21lbW9pemVDYXBwZWQnKTtcblxuLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlTGVhZGluZ0RvdCA9IC9eXFwuLyxcbiAgICByZVByb3BOYW1lID0gL1teLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCQpKS9nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBiYWNrc2xhc2hlcyBpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZUVzY2FwZUNoYXIgPSAvXFxcXChcXFxcKT8vZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICovXG52YXIgc3RyaW5nVG9QYXRoID0gbWVtb2l6ZUNhcHBlZChmdW5jdGlvbihzdHJpbmcpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBpZiAocmVMZWFkaW5nRG90LnRlc3Qoc3RyaW5nKSkge1xuICAgIHJlc3VsdC5wdXNoKCcnKTtcbiAgfVxuICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3RyaW5nKSB7XG4gICAgcmVzdWx0LnB1c2gocXVvdGUgPyBzdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCkpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZ1RvUGF0aDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX3N0cmluZ1RvUGF0aC5qc1xuLy8gbW9kdWxlIGlkID0gMTIyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 123 */
/***/ function(module, exports, __webpack_require__) {

    eval("var memoize = __webpack_require__(124);\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n  var result = memoize(func, function(key) {\n    if (cache.size === MAX_MEMOIZE_SIZE) {\n      cache.clear();\n    }\n    return key;\n  });\n\n  var cache = result.cache;\n  return result;\n}\n\nmodule.exports = memoizeCapped;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21lbW9pemVDYXBwZWQuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIG1lbW9pemUgPSByZXF1aXJlKCcuL21lbW9pemUnKTtcblxuLyoqIFVzZWQgYXMgdGhlIG1heGltdW0gbWVtb2l6ZSBjYWNoZSBzaXplLiAqL1xudmFyIE1BWF9NRU1PSVpFX1NJWkUgPSA1MDA7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1lbW9pemVgIHdoaWNoIGNsZWFycyB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24nc1xuICogY2FjaGUgd2hlbiBpdCBleGNlZWRzIGBNQVhfTUVNT0laRV9TSVpFYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG1lbW9pemVDYXBwZWQoZnVuYykge1xuICB2YXIgcmVzdWx0ID0gbWVtb2l6ZShmdW5jLCBmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoY2FjaGUuc2l6ZSA9PT0gTUFYX01FTU9JWkVfU0laRSkge1xuICAgICAgY2FjaGUuY2xlYXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfSk7XG5cbiAgdmFyIGNhY2hlID0gcmVzdWx0LmNhY2hlO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1lbW9pemVDYXBwZWQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19tZW1vaXplQ2FwcGVkLmpzXG4vLyBtb2R1bGUgaWQgPSAxMjNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 124 */
/***/ function(module, exports, __webpack_require__) {

    eval("var MapCache = __webpack_require__(55);\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n  if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  var memoized = function() {\n    var args = arguments,\n        key = resolver ? resolver.apply(this, args) : args[0],\n        cache = memoized.cache;\n\n    if (cache.has(key)) {\n      return cache.get(key);\n    }\n    var result = func.apply(this, args);\n    memoized.cache = cache.set(key, result) || cache;\n    return result;\n  };\n  memoized.cache = new (memoize.Cache || MapCache);\n  return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvbWVtb2l6ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgTWFwQ2FjaGUgPSByZXF1aXJlKCcuL19NYXBDYWNoZScpO1xuXG4vKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG1lbW9pemVzIHRoZSByZXN1bHQgb2YgYGZ1bmNgLiBJZiBgcmVzb2x2ZXJgIGlzXG4gKiBwcm92aWRlZCwgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlXG4gKiBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgYXJndW1lbnRcbiAqIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbiBpcyB1c2VkIGFzIHRoZSBtYXAgY2FjaGUga2V5LiBUaGUgYGZ1bmNgXG4gKiBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogVGhlIGNhY2hlIGlzIGV4cG9zZWQgYXMgdGhlIGBjYWNoZWAgcHJvcGVydHkgb24gdGhlIG1lbW9pemVkXG4gKiBmdW5jdGlvbi4gSXRzIGNyZWF0aW9uIG1heSBiZSBjdXN0b21pemVkIGJ5IHJlcGxhY2luZyB0aGUgYF8ubWVtb2l6ZS5DYWNoZWBcbiAqIGNvbnN0cnVjdG9yIHdpdGggb25lIHdob3NlIGluc3RhbmNlcyBpbXBsZW1lbnQgdGhlXG4gKiBbYE1hcGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLW1hcC1wcm90b3R5cGUtb2JqZWN0KVxuICogbWV0aG9kIGludGVyZmFjZSBvZiBgY2xlYXJgLCBgZGVsZXRlYCwgYGdldGAsIGBoYXNgLCBhbmQgYHNldGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVzb2x2ZXJdIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIHRoZSBjYWNoZSBrZXkuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAqIHZhciBvdGhlciA9IHsgJ2MnOiAzLCAnZCc6IDQgfTtcbiAqXG4gKiB2YXIgdmFsdWVzID0gXy5tZW1vaXplKF8udmFsdWVzKTtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWzEsIDJdXG4gKlxuICogdmFsdWVzKG90aGVyKTtcbiAqIC8vID0+IFszLCA0XVxuICpcbiAqIG9iamVjdC5hID0gMjtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWzEsIDJdXG4gKlxuICogLy8gTW9kaWZ5IHRoZSByZXN1bHQgY2FjaGUuXG4gKiB2YWx1ZXMuY2FjaGUuc2V0KG9iamVjdCwgWydhJywgJ2InXSk7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsnYScsICdiJ11cbiAqXG4gKiAvLyBSZXBsYWNlIGBfLm1lbW9pemUuQ2FjaGVgLlxuICogXy5tZW1vaXplLkNhY2hlID0gV2Vha01hcDtcbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikge1xuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJyB8fCAocmVzb2x2ZXIgIT0gbnVsbCAmJiB0eXBlb2YgcmVzb2x2ZXIgIT0gJ2Z1bmN0aW9uJykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdLFxuICAgICAgICBjYWNoZSA9IG1lbW9pemVkLmNhY2hlO1xuXG4gICAgaWYgKGNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KSB8fCBjYWNoZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBtZW1vaXplZC5jYWNoZSA9IG5ldyAobWVtb2l6ZS5DYWNoZSB8fCBNYXBDYWNoZSk7XG4gIHJldHVybiBtZW1vaXplZDtcbn1cblxuLy8gRXhwb3NlIGBNYXBDYWNoZWAuXG5tZW1vaXplLkNhY2hlID0gTWFwQ2FjaGU7XG5cbm1vZHVsZS5leHBvcnRzID0gbWVtb2l6ZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvbWVtb2l6ZS5qc1xuLy8gbW9kdWxlIGlkID0gMTI0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 125 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseToString = __webpack_require__(126);\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n  return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9TdHJpbmcuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VUb1N0cmluZyA9IHJlcXVpcmUoJy4vX2Jhc2VUb1N0cmluZycpO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9TdHJpbmcobnVsbCk7XG4gKiAvLyA9PiAnJ1xuICpcbiAqIF8udG9TdHJpbmcoLTApO1xuICogLy8gPT4gJy0wJ1xuICpcbiAqIF8udG9TdHJpbmcoWzEsIDIsIDNdKTtcbiAqIC8vID0+ICcxLDIsMydcbiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9TdHJpbmc7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL3RvU3RyaW5nLmpzXG4vLyBtb2R1bGUgaWQgPSAxMjVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 126 */
/***/ function(module, exports, __webpack_require__) {

    eval("var Symbol = __webpack_require__(21),\n    arrayMap = __webpack_require__(127),\n    isArray = __webpack_require__(86),\n    isSymbol = __webpack_require__(19);\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n  // Exit early for strings to avoid a performance hit in some environments.\n  if (typeof value == 'string') {\n    return value;\n  }\n  if (isArray(value)) {\n    // Recursively convert values (susceptible to call stack limits).\n    return arrayMap(value, baseToString) + '';\n  }\n  if (isSymbol(value)) {\n    return symbolToString ? symbolToString.call(value) : '';\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VUb1N0cmluZy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgYXJyYXlNYXAgPSByZXF1aXJlKCcuL19hcnJheU1hcCcpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by50b1N0cmluZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1N0cmluZ2Agd2hpY2ggZG9lc24ndCBjb252ZXJ0IG51bGxpc2hcbiAqIHZhbHVlcyB0byBlbXB0eSBzdHJpbmdzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpIHtcbiAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAvLyBSZWN1cnNpdmVseSBjb252ZXJ0IHZhbHVlcyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgYmFzZVRvU3RyaW5nKSArICcnO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVG9TdHJpbmc7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19iYXNlVG9TdHJpbmcuanNcbi8vIG1vZHVsZSBpZCA9IDEyNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 127 */
/***/ function(module, exports) {

    eval("/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = iteratee(array[index], index, array);\n  }\n  return result;\n}\n\nmodule.exports = arrayMap;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5TWFwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlNYXA7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19hcnJheU1hcC5qc1xuLy8gbW9kdWxlIGlkID0gMTI3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 128 */
/***/ function(module, exports, __webpack_require__) {

    eval("var isSymbol = __webpack_require__(19);\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n  if (typeof value == 'string' || isSymbol(value)) {\n    return value;\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3RvS2V5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIGtleSBpZiBpdCdzIG5vdCBhIHN0cmluZyBvciBzeW1ib2wuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7c3RyaW5nfHN5bWJvbH0gUmV0dXJucyB0aGUga2V5LlxuICovXG5mdW5jdGlvbiB0b0tleSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9LZXk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL190b0tleS5qc1xuLy8gbW9kdWxlIGlkID0gMTI4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 129 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseHasIn = __webpack_require__(130),\n    hasPath = __webpack_require__(131);\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n  return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvaGFzSW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VIYXNJbiA9IHJlcXVpcmUoJy4vX2Jhc2VIYXNJbicpLFxuICAgIGhhc1BhdGggPSByZXF1aXJlKCcuL19oYXNQYXRoJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYS5iJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXNJbihvYmplY3QsIFsnYScsICdiJ10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYicpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaGFzSW4ob2JqZWN0LCBwYXRoKSB7XG4gIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhc0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNJbjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvaGFzSW4uanNcbi8vIG1vZHVsZSBpZCA9IDEyOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 130 */
/***/ function(module, exports) {

    eval("/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n  return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VIYXNJbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc0luYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSGFzSW4ob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGtleSBpbiBPYmplY3Qob2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSGFzSW47XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19iYXNlSGFzSW4uanNcbi8vIG1vZHVsZSBpZCA9IDEzMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 131 */
/***/ function(module, exports, __webpack_require__) {

    eval("var castPath = __webpack_require__(120),\n    isArguments = __webpack_require__(93),\n    isArray = __webpack_require__(86),\n    isIndex = __webpack_require__(98),\n    isLength = __webpack_require__(101),\n    toKey = __webpack_require__(128);\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n  path = castPath(path, object);\n\n  var index = -1,\n      length = path.length,\n      result = false;\n\n  while (++index < length) {\n    var key = toKey(path[index]);\n    if (!(result = object != null && hasFunc(object, key))) {\n      break;\n    }\n    object = object[key];\n  }\n  if (result || ++index != length) {\n    return result;\n  }\n  length = object == null ? 0 : object.length;\n  return !!length && isLength(length) && isIndex(key, length) &&\n    (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc1BhdGguanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBleGlzdHMgb24gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2sgcHJvcGVydGllcy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBoYXNGdW5jKSB7XG4gIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBmYWxzZTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSk7XG4gICAgaWYgKCEocmVzdWx0ID0gb2JqZWN0ICE9IG51bGwgJiYgaGFzRnVuYyhvYmplY3QsIGtleSkpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgb2JqZWN0ID0gb2JqZWN0W2tleV07XG4gIH1cbiAgaWYgKHJlc3VsdCB8fCArK2luZGV4ICE9IGxlbmd0aCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgbGVuZ3RoID0gb2JqZWN0ID09IG51bGwgPyAwIDogb2JqZWN0Lmxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmIGlzTGVuZ3RoKGxlbmd0aCkgJiYgaXNJbmRleChrZXksIGxlbmd0aCkgJiZcbiAgICAoaXNBcnJheShvYmplY3QpIHx8IGlzQXJndW1lbnRzKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc1BhdGg7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19oYXNQYXRoLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 132 */
/***/ function(module, exports) {

    eval("/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nmodule.exports = identity;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvaWRlbnRpdHkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudCBpdCByZWNlaXZlcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHsqfSB2YWx1ZSBBbnkgdmFsdWUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyBgdmFsdWVgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAqXG4gKiBjb25zb2xlLmxvZyhfLmlkZW50aXR5KG9iamVjdCkgPT09IG9iamVjdCk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpZGVudGl0eTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvaWRlbnRpdHkuanNcbi8vIG1vZHVsZSBpZCA9IDEzMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 133 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseProperty = __webpack_require__(134),\n    basePropertyDeep = __webpack_require__(135),\n    isKey = __webpack_require__(121),\n    toKey = __webpack_require__(128);\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n *   { 'a': { 'b': 2 } },\n *   { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n  return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvcHJvcGVydHkuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2Jhc2VQcm9wZXJ0eScpLFxuICAgIGJhc2VQcm9wZXJ0eURlZXAgPSByZXF1aXJlKCcuL19iYXNlUHJvcGVydHlEZWVwJyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL19pc0tleScpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbXG4gKiAgIHsgJ2EnOiB7ICdiJzogMiB9IH0sXG4gKiAgIHsgJ2EnOiB7ICdiJzogMSB9IH1cbiAqIF07XG4gKlxuICogXy5tYXAob2JqZWN0cywgXy5wcm9wZXJ0eSgnYS5iJykpO1xuICogLy8gPT4gWzIsIDFdXG4gKlxuICogXy5tYXAoXy5zb3J0Qnkob2JqZWN0cywgXy5wcm9wZXJ0eShbJ2EnLCAnYiddKSksICdhLmInKTtcbiAqIC8vID0+IFsxLCAyXVxuICovXG5mdW5jdGlvbiBwcm9wZXJ0eShwYXRoKSB7XG4gIHJldHVybiBpc0tleShwYXRoKSA/IGJhc2VQcm9wZXJ0eSh0b0tleShwYXRoKSkgOiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHByb3BlcnR5O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9wcm9wZXJ0eS5qc1xuLy8gbW9kdWxlIGlkID0gMTMzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 134 */
/***/ function(module, exports) {

    eval("/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n  return function(object) {\n    return object == null ? undefined : object[key];\n  };\n}\n\nmodule.exports = baseProperty;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQcm9wZXJ0eS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnByb3BlcnR5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VQcm9wZXJ0eShrZXkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VQcm9wZXJ0eTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2Jhc2VQcm9wZXJ0eS5qc1xuLy8gbW9kdWxlIGlkID0gMTM0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 135 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseGet = __webpack_require__(119);\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n  return function(object) {\n    return baseGet(object, path);\n  };\n}\n\nmodule.exports = basePropertyDeep;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQcm9wZXJ0eURlZXAuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VHZXQgPSByZXF1aXJlKCcuL19iYXNlR2V0Jyk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUHJvcGVydHlgIHdoaWNoIHN1cHBvcnRzIGRlZXAgcGF0aHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVByb3BlcnR5RGVlcChwYXRoKSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICByZXR1cm4gYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VQcm9wZXJ0eURlZXA7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19iYXNlUHJvcGVydHlEZWVwLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 136 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseFindIndex = __webpack_require__(12),\n    baseIteratee = __webpack_require__(30),\n    toInteger = __webpack_require__(15);\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n *   { 'user': 'barney',  'active': false },\n *   { 'user': 'fred',    'active': false },\n *   { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\nfunction findIndex(array, predicate, fromIndex) {\n  var length = array == null ? 0 : array.length;\n  if (!length) {\n    return -1;\n  }\n  var index = fromIndex == null ? 0 : toInteger(fromIndex);\n  if (index < 0) {\n    index = nativeMax(length + index, 0);\n  }\n  return baseFindIndex(array, baseIteratee(predicate, 3), index);\n}\n\nmodule.exports = findIndex;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvZmluZEluZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlRmluZEluZGV4ID0gcmVxdWlyZSgnLi9fYmFzZUZpbmRJbmRleCcpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vdG9JbnRlZ2VyJyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdFxuICogZWxlbWVudCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBpdHNlbGYuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAxLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGAtMWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogdHJ1ZSB9XG4gKiBdO1xuICpcbiAqIF8uZmluZEluZGV4KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXIgPT0gJ2Jhcm5leSc7IH0pO1xuICogLy8gPT4gMFxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmRJbmRleCh1c2VycywgeyAndXNlcic6ICdmcmVkJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICogLy8gPT4gMVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZEluZGV4KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gKiAvLyA9PiAwXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmRJbmRleCh1c2VycywgJ2FjdGl2ZScpO1xuICogLy8gPT4gMlxuICovXG5mdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgdmFyIGluZGV4ID0gZnJvbUluZGV4ID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gIGlmIChpbmRleCA8IDApIHtcbiAgICBpbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCk7XG4gIH1cbiAgcmV0dXJuIGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBpbmRleCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmluZEluZGV4O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9maW5kSW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDEzNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 137 */
/***/ function(module, exports, __webpack_require__) {

    eval("module.exports = __webpack_require__(138);\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvZWFjaC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZm9yRWFjaCcpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9lYWNoLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 138 */
/***/ function(module, exports, __webpack_require__) {

    eval("var arrayEach = __webpack_require__(139),\n    baseEach = __webpack_require__(140),\n    castFunction = __webpack_require__(145),\n    isArray = __webpack_require__(86);\n\n/**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n *   console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n *   console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\nfunction forEach(collection, iteratee) {\n  var func = isArray(collection) ? arrayEach : baseEach;\n  return func(collection, castFunction(iteratee));\n}\n\nmodule.exports = forEach;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvZm9yRWFjaC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXJyYXlFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXlFYWNoJyksXG4gICAgYmFzZUVhY2ggPSByZXF1aXJlKCcuL19iYXNlRWFjaCcpLFxuICAgIGNhc3RGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2Nhc3RGdW5jdGlvbicpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIGVsZW1lbnQuXG4gKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqICoqTm90ZToqKiBBcyB3aXRoIG90aGVyIFwiQ29sbGVjdGlvbnNcIiBtZXRob2RzLCBvYmplY3RzIHdpdGggYSBcImxlbmd0aFwiXG4gKiBwcm9wZXJ0eSBhcmUgaXRlcmF0ZWQgbGlrZSBhcnJheXMuIFRvIGF2b2lkIHRoaXMgYmVoYXZpb3IgdXNlIGBfLmZvckluYFxuICogb3IgYF8uZm9yT3duYCBmb3Igb2JqZWN0IGl0ZXJhdGlvbi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAYWxpYXMgZWFjaFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gKiBAc2VlIF8uZm9yRWFjaFJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZm9yRWFjaChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gKiAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAqIH0pO1xuICogLy8gPT4gTG9ncyBgMWAgdGhlbiBgMmAuXG4gKlxuICogXy5mb3JFYWNoKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICogICBjb25zb2xlLmxvZyhrZXkpO1xuICogfSk7XG4gKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2ggOiBiYXNlRWFjaDtcbiAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgY2FzdEZ1bmN0aW9uKGl0ZXJhdGVlKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZm9yRWFjaDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvZm9yRWFjaC5qc1xuLy8gbW9kdWxlIGlkID0gMTM4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 139 */
/***/ function(module, exports) {

    eval("/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (iteratee(array[index], index, array) === false) {\n      break;\n    }\n  }\n  return array;\n}\n\nmodule.exports = arrayEach;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5RWFjaC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlFYWNoO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYXJyYXlFYWNoLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 140 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseForOwn = __webpack_require__(141),\n    createBaseEach = __webpack_require__(144);\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VFYWNoLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlRm9yT3duID0gcmVxdWlyZSgnLi9fYmFzZUZvck93bicpLFxuICAgIGNyZWF0ZUJhc2VFYWNoID0gcmVxdWlyZSgnLi9fY3JlYXRlQmFzZUVhY2gnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JFYWNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAqL1xudmFyIGJhc2VFYWNoID0gY3JlYXRlQmFzZUVhY2goYmFzZUZvck93bik7XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUVhY2g7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19iYXNlRWFjaC5qc1xuLy8gbW9kdWxlIGlkID0gMTQwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 141 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseFor = __webpack_require__(142),\n    keys = __webpack_require__(90);\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n  return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGb3JPd24uanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VGb3IgPSByZXF1aXJlKCcuL19iYXNlRm9yJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93bmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3Iob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZvck93bjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2Jhc2VGb3JPd24uanNcbi8vIG1vZHVsZSBpZCA9IDE0MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 142 */
/***/ function(module, exports, __webpack_require__) {

    eval("var createBaseFor = __webpack_require__(143);\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGb3IuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGNyZWF0ZUJhc2VGb3IgPSByZXF1aXJlKCcuL19jcmVhdGVCYXNlRm9yJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYG9iamVjdGBcbiAqIHByb3BlcnRpZXMgcmV0dXJuZWQgYnkgYGtleXNGdW5jYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG52YXIgYmFzZUZvciA9IGNyZWF0ZUJhc2VGb3IoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRm9yO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZUZvci5qc1xuLy8gbW9kdWxlIGlkID0gMTQyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 143 */
/***/ function(module, exports) {

    eval("/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n  return function(object, iteratee, keysFunc) {\n    var index = -1,\n        iterable = Object(object),\n        props = keysFunc(object),\n        length = props.length;\n\n    while (length--) {\n      var key = props[fromRight ? length : ++index];\n      if (iteratee(iterable[key], key, iterable) === false) {\n        break;\n      }\n    }\n    return object;\n  };\n}\n\nmodule.exports = createBaseFor;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUJhc2VGb3IuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDcmVhdGVzIGEgYmFzZSBmdW5jdGlvbiBmb3IgbWV0aG9kcyBsaWtlIGBfLmZvckluYCBhbmQgYF8uZm9yT3duYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVCYXNlRm9yKGZyb21SaWdodCkge1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0LCBpdGVyYXRlZSwga2V5c0Z1bmMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgaXRlcmFibGUgPSBPYmplY3Qob2JqZWN0KSxcbiAgICAgICAgcHJvcHMgPSBrZXlzRnVuYyhvYmplY3QpLFxuICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIHZhciBrZXkgPSBwcm9wc1tmcm9tUmlnaHQgPyBsZW5ndGggOiArK2luZGV4XTtcbiAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Q7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQmFzZUZvcjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2NyZWF0ZUJhc2VGb3IuanNcbi8vIG1vZHVsZSBpZCA9IDE0M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 144 */
/***/ function(module, exports, __webpack_require__) {

    eval("var isArrayLike = __webpack_require__(108);\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n  return function(collection, iteratee) {\n    if (collection == null) {\n      return collection;\n    }\n    if (!isArrayLike(collection)) {\n      return eachFunc(collection, iteratee);\n    }\n    var length = collection.length,\n        index = fromRight ? length : -1,\n        iterable = Object(collection);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (iteratee(iterable[index], index, iterable) === false) {\n        break;\n      }\n    }\n    return collection;\n  };\n}\n\nmodule.exports = createBaseEach;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUJhc2VFYWNoLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYGJhc2VFYWNoYCBvciBgYmFzZUVhY2hSaWdodGAgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYSBjb2xsZWN0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVCYXNlRWFjaChlYWNoRnVuYywgZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgIH1cbiAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICByZXR1cm4gZWFjaEZ1bmMoY29sbGVjdGlvbiwgaXRlcmF0ZWUpO1xuICAgIH1cbiAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTEsXG4gICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuXG4gICAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtpbmRleF0sIGluZGV4LCBpdGVyYWJsZSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVCYXNlRWFjaDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2NyZWF0ZUJhc2VFYWNoLmpzXG4vLyBtb2R1bGUgaWQgPSAxNDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 145 */
/***/ function(module, exports, __webpack_require__) {

    eval("var identity = __webpack_require__(132);\n\n/**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\nfunction castFunction(value) {\n  return typeof value == 'function' ? value : identity;\n}\n\nmodule.exports = castFunction;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nhc3RGdW5jdGlvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5Jyk7XG5cbi8qKlxuICogQ2FzdHMgYHZhbHVlYCB0byBgaWRlbnRpdHlgIGlmIGl0J3Mgbm90IGEgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgY2FzdCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY2FzdEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlIDogaWRlbnRpdHk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2FzdEZ1bmN0aW9uO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fY2FzdEZ1bmN0aW9uLmpzXG4vLyBtb2R1bGUgaWQgPSAxNDVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 146 */
/***/ function(module, exports, __webpack_require__) {

    eval("var arrayMap = __webpack_require__(127),\n    baseIteratee = __webpack_require__(30),\n    baseMap = __webpack_require__(147),\n    isArray = __webpack_require__(86);\n\n/**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n *   return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n *   { 'user': 'barney' },\n *   { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee) {\n  var func = isArray(collection) ? arrayMap : baseMap;\n  return func(collection, baseIteratee(iteratee, 3));\n}\n\nmodule.exports = map;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvbWFwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheU1hcCA9IHJlcXVpcmUoJy4vX2FycmF5TWFwJyksXG4gICAgYmFzZUl0ZXJhdGVlID0gcmVxdWlyZSgnLi9fYmFzZUl0ZXJhdGVlJyksXG4gICAgYmFzZU1hcCA9IHJlcXVpcmUoJy4vX2Jhc2VNYXAnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB2YWx1ZXMgYnkgcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gIHRocnVcbiAqIGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICpcbiAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICogYF8uZXZlcnlgLCBgXy5maWx0ZXJgLCBgXy5tYXBgLCBgXy5tYXBWYWx1ZXNgLCBgXy5yZWplY3RgLCBhbmQgYF8uc29tZWAuXG4gKlxuICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6XG4gKiBgYXJ5YCwgYGNodW5rYCwgYGN1cnJ5YCwgYGN1cnJ5UmlnaHRgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLCBgZXZlcnlgLFxuICogYGZpbGxgLCBgaW52ZXJ0YCwgYHBhcnNlSW50YCwgYHJhbmRvbWAsIGByYW5nZWAsIGByYW5nZVJpZ2h0YCwgYHJlcGVhdGAsXG4gKiBgc2FtcGxlU2l6ZWAsIGBzbGljZWAsIGBzb21lYCwgYHNvcnRCeWAsIGBzcGxpdGAsIGB0YWtlYCwgYHRha2VSaWdodGAsXG4gKiBgdGVtcGxhdGVgLCBgdHJpbWAsIGB0cmltRW5kYCwgYHRyaW1TdGFydGAsIGFuZCBgd29yZHNgXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICogICByZXR1cm4gbiAqIG47XG4gKiB9XG4gKlxuICogXy5tYXAoWzQsIDhdLCBzcXVhcmUpO1xuICogLy8gPT4gWzE2LCA2NF1cbiAqXG4gKiBfLm1hcCh7ICdhJzogNCwgJ2InOiA4IH0sIHNxdWFyZSk7XG4gKiAvLyA9PiBbMTYsIDY0XSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdiYXJuZXknIH0sXG4gKiAgIHsgJ3VzZXInOiAnZnJlZCcgfVxuICogXTtcbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8ubWFwKHVzZXJzLCAndXNlcicpO1xuICogLy8gPT4gWydiYXJuZXknLCAnZnJlZCddXG4gKi9cbmZ1bmN0aW9uIG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheU1hcCA6IGJhc2VNYXA7XG4gIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvbWFwLmpzXG4vLyBtb2R1bGUgaWQgPSAxNDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 147 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseEach = __webpack_require__(140),\n    isArrayLike = __webpack_require__(108);\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n  var index = -1,\n      result = isArrayLike(collection) ? Array(collection.length) : [];\n\n  baseEach(collection, function(value, key, collection) {\n    result[++index] = iteratee(value, key, collection);\n  });\n  return result;\n}\n\nmodule.exports = baseMap;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNYXAuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VFYWNoID0gcmVxdWlyZSgnLi9fYmFzZUVhY2gnKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXBgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZU1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IGl0ZXJhdGVlKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWFwO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZU1hcC5qc1xuLy8gbW9kdWxlIGlkID0gMTQ3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 148 */
/***/ function(module, exports) {

    eval("'use strict';\n\n// In the absence of a WeakSet or WeakMap implementation, don't break, but don't cache either.\nfunction noop() {}\nfunction createWeakMap() {\n    if (typeof WeakMap !== 'undefined') {\n        return new WeakMap();\n    } else {\n        return fakeSetOrMap();\n    }\n}\nfunction fakeSetOrMap() {\n    return {\n        add: noop,\n        delete: noop,\n        set: noop,\n        has: function has() {\n            return false;\n        }\n    };\n}\n\n// Safe hasOwnProperty\nvar hop = Object.prototype.hasOwnProperty;\nvar has = function has(obj, prop) {\n    return hop.call(obj, prop);\n};\n\n// Copy all own enumerable properties from source to target\nfunction extend(target, source) {\n    for (var prop in source) {\n        if (has(source, prop)) {\n            target[prop] = source[prop];\n        }\n    }\n    return target;\n}\n\nvar reLeadingNewline = /^[ \\t]*(?:\\r\\n|\\r|\\n)/;\nvar reTrailingNewline = /(?:\\r\\n|\\r|\\n)[ \\t]*$/;\nvar reStartsWithNewlineOrIsEmpty = /^(?:[\\r\\n]|$)/;\nvar reDetectIndentation = /(\\r\\n|\\r|\\n)([ \\t]*)(?:[^ \\t\\r\\n]|$)/;\nvar reOnlyWhitespaceWithAtLeastOneNewline = /^[ \\t]*[\\r\\n][ \\t\\r\\n]*$/;\n\nfunction _outdent(strings, values, outdentInstance, options) {\n    // If first interpolated value is a reference to outdent,\n    // determine indentation level from the indentation of the interpolated value.\n    var indentationLevel = 0;\n\n    var match = strings[0].match(reDetectIndentation);\n    if (match) {\n        indentationLevel = match[2].length;\n    }\n\n    var reSource = '(\\\\r\\\\n|\\\\r|\\\\n).{0,' + indentationLevel + '}';\n    var reMatchIndent = new RegExp(reSource, 'g');\n\n    // Is first interpolated value a reference to outdent, alone on its own line, without any preceding non-whitespace?\n    if ((values[0] === outdentInstance || values[0] === outdent) && reOnlyWhitespaceWithAtLeastOneNewline.test(strings[0]) && reStartsWithNewlineOrIsEmpty.test(strings[1])) {\n        values = values.slice(1);\n        strings = strings.slice(1);\n    }\n\n    var l = strings.length;\n    var outdentedStrings = strings.map(function (v, i) {\n        // Remove leading indentation from all lines\n        v = v.replace(reMatchIndent, '$1');\n        // Trim a leading newline from the first string\n        if (i === 0 && options.trimLeadingNewline) {\n            v = v.replace(reLeadingNewline, '');\n        }\n        // Trim a trailing newline from the last string\n        if (i === l - 1 && options.trimTrailingNewline) {\n            v = v.replace(reTrailingNewline, '');\n        }\n        return v;\n    });\n\n    return concatStringsAndValues(outdentedStrings, values);\n}\n\nfunction concatStringsAndValues(strings, values) {\n    var ret = '';\n    for (var i = 0, l = strings.length; i < l; i++) {\n        ret += strings[i];\n        if (i < l - 1) {\n            ret += values[i];\n        }\n    }\n    return ret;\n}\n\n/**\n * It is assumed that opts will not change.  If this is a problem, clone your options object and pass the clone to\n * makeInstance\n * @param options\n * @return {outdent}\n */\nfunction createInstance(options) {\n    var cache = createWeakMap();\n\n    var ret = function outdent(stringsOrOptions) {\n        if (has(stringsOrOptions, 'raw') && has(stringsOrOptions, 'length')) {\n            // TODO Enable semi-caching, both when the first interpolated value is `outdent`, and when it's not\n            var strings = stringsOrOptions;\n            // Serve from cache only if there are no interpolated values\n\n            for (var _len = arguments.length, values = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n                values[_key - 1] = arguments[_key];\n            }\n\n            if (values.length === 0 && cache.has(strings)) return cache.get(strings);\n\n            // Perform outdentation\n            var rendered = _outdent(strings, values, ret, options);\n\n            // Store into the cache only if there are no interpolated values\n            values.length === 0 && cache.set(strings, rendered);\n            return rendered;\n        } else {\n            // Create and return a new instance of outdent with the given options\n            return createInstance(extend(extend({}, options), stringsOrOptions || {}));\n        }\n    };\n\n    return ret;\n}\n\nvar outdent = createInstance({\n    trimLeadingNewline: true,\n    trimTrailingNewline: true\n});\n\n// ES6\noutdent.default = outdent;\noutdent.outdent = outdent;\noutdent.__esModule = true;\nexports.default = outdent;\nexports.outdent = outdent;\nexports.__esModule = true;\nmodule.exports = outdent;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5lcyJdLCJuYW1lcyI6WyJub29wIiwiY3JlYXRlV2Vha01hcCIsIldlYWtNYXAiLCJmYWtlU2V0T3JNYXAiLCJhZGQiLCJkZWxldGUiLCJzZXQiLCJoYXMiLCJob3AiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsIm9iaiIsInByb3AiLCJjYWxsIiwiZXh0ZW5kIiwidGFyZ2V0Iiwic291cmNlIiwicmVMZWFkaW5nTmV3bGluZSIsInJlVHJhaWxpbmdOZXdsaW5lIiwicmVTdGFydHNXaXRoTmV3bGluZU9ySXNFbXB0eSIsInJlRGV0ZWN0SW5kZW50YXRpb24iLCJyZU9ubHlXaGl0ZXNwYWNlV2l0aEF0TGVhc3RPbmVOZXdsaW5lIiwiX291dGRlbnQiLCJzdHJpbmdzIiwidmFsdWVzIiwib3V0ZGVudEluc3RhbmNlIiwib3B0aW9ucyIsImluZGVudGF0aW9uTGV2ZWwiLCJtYXRjaCIsImxlbmd0aCIsInJlU291cmNlIiwicmVNYXRjaEluZGVudCIsIlJlZ0V4cCIsIm91dGRlbnQiLCJ0ZXN0Iiwic2xpY2UiLCJsIiwib3V0ZGVudGVkU3RyaW5ncyIsIm1hcCIsInYiLCJpIiwicmVwbGFjZSIsInRyaW1MZWFkaW5nTmV3bGluZSIsInRyaW1UcmFpbGluZ05ld2xpbmUiLCJjb25jYXRTdHJpbmdzQW5kVmFsdWVzIiwicmV0IiwiY3JlYXRlSW5zdGFuY2UiLCJjYWNoZSIsInN0cmluZ3NPck9wdGlvbnMiLCJnZXQiLCJyZW5kZXJlZCIsImRlZmF1bHQiLCJfX2VzTW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBLFNBQVNBLElBQVQsR0FBZ0IsQ0FBRTtBQUNsQixTQUFTQyxhQUFULEdBQXlCO0FBQ3JCLFFBQUcsT0FBT0MsT0FBUCxLQUFtQixXQUF0QixFQUFtQztBQUMvQixlQUFPLElBQUlBLE9BQUosRUFBUDtBQUNILEtBRkQsTUFFTztBQUNILGVBQU9DLGNBQVA7QUFDSDtBQUNKO0FBQ0QsU0FBU0EsWUFBVCxHQUF3QjtBQUNwQixXQUFPO0FBQ0hDLGFBQUtKLElBREY7QUFFSEssZ0JBQVFMLElBRkw7QUFHSE0sYUFBS04sSUFIRjtBQUlITyxhQUFLLGVBQVc7QUFBQyxtQkFBTyxLQUFQO0FBQWM7QUFKNUIsS0FBUDtBQU1IOztBQUVEO0FBQ0EsSUFBTUMsTUFBTUMsT0FBT0MsU0FBUCxDQUFpQkMsY0FBN0I7QUFDQSxJQUFNSixNQUFNLFNBQU5BLEdBQU0sQ0FBU0ssR0FBVCxFQUFjQyxJQUFkLEVBQW9CO0FBQzVCLFdBQU9MLElBQUlNLElBQUosQ0FBU0YsR0FBVCxFQUFjQyxJQUFkLENBQVA7QUFDSCxDQUZEOztBQUlBO0FBQ0EsU0FBU0UsTUFBVCxDQUFnQkMsTUFBaEIsRUFBd0JDLE1BQXhCLEVBQWdDO0FBQzVCLFNBQUksSUFBSUosSUFBUixJQUFnQkksTUFBaEIsRUFBd0I7QUFDcEIsWUFBR1YsSUFBSVUsTUFBSixFQUFZSixJQUFaLENBQUgsRUFBc0I7QUFDbEJHLG1CQUFPSCxJQUFQLElBQWVJLE9BQU9KLElBQVAsQ0FBZjtBQUNIO0FBQ0o7QUFDRCxXQUFPRyxNQUFQO0FBQ0g7O0FBRUQsSUFBTUUsbUJBQW1CLHVCQUF6QjtBQUNBLElBQU1DLG9CQUFvQix1QkFBMUI7QUFDQSxJQUFNQywrQkFBK0IsZUFBckM7QUFDQSxJQUFNQyxzQkFBc0Isc0NBQTVCO0FBQ0EsSUFBTUMsd0NBQXdDLDBCQUE5Qzs7QUFFQSxTQUFTQyxRQUFULENBQWtCQyxPQUFsQixFQUEyQkMsTUFBM0IsRUFBbUNDLGVBQW5DLEVBQW9EQyxPQUFwRCxFQUE2RDtBQUN6RDtBQUNBO0FBQ0EsUUFBSUMsbUJBQW1CLENBQXZCOztBQUVBLFFBQU1DLFFBQVFMLFFBQVEsQ0FBUixFQUFXSyxLQUFYLENBQWlCUixtQkFBakIsQ0FBZDtBQUNBLFFBQUdRLEtBQUgsRUFBVTtBQUNORCwyQkFBbUJDLE1BQU0sQ0FBTixFQUFTQyxNQUE1QjtBQUNIOztBQUVELFFBQUlDLG9DQUFrQ0gsZ0JBQWxDLE1BQUo7QUFDQSxRQUFNSSxnQkFBZ0IsSUFBSUMsTUFBSixDQUFXRixRQUFYLEVBQXFCLEdBQXJCLENBQXRCOztBQUVBO0FBQ0EsUUFDSSxDQUFDTixPQUFPLENBQVAsTUFBY0MsZUFBZCxJQUFpQ0QsT0FBTyxDQUFQLE1BQWNTLE9BQWhELEtBQ0FaLHNDQUFzQ2EsSUFBdEMsQ0FBMkNYLFFBQVEsQ0FBUixDQUEzQyxDQURBLElBRUFKLDZCQUE2QmUsSUFBN0IsQ0FBa0NYLFFBQVEsQ0FBUixDQUFsQyxDQUhKLEVBSUU7QUFDRUMsaUJBQVNBLE9BQU9XLEtBQVAsQ0FBYSxDQUFiLENBQVQ7QUFDQVosa0JBQVVBLFFBQVFZLEtBQVIsQ0FBYyxDQUFkLENBQVY7QUFDSDs7QUFFRCxRQUFNQyxJQUFJYixRQUFRTSxNQUFsQjtBQUNBLFFBQU1RLG1CQUFtQmQsUUFBUWUsR0FBUixDQUFZLFVBQUNDLENBQUQsRUFBSUMsQ0FBSixFQUFVO0FBQzNDO0FBQ0FELFlBQUlBLEVBQUVFLE9BQUYsQ0FBVVYsYUFBVixFQUF5QixJQUF6QixDQUFKO0FBQ0E7QUFDQSxZQUFHUyxNQUFNLENBQU4sSUFBV2QsUUFBUWdCLGtCQUF0QixFQUEwQztBQUN0Q0gsZ0JBQUlBLEVBQUVFLE9BQUYsQ0FBVXhCLGdCQUFWLEVBQTRCLEVBQTVCLENBQUo7QUFDSDtBQUNEO0FBQ0EsWUFBR3VCLE1BQU1KLElBQUksQ0FBVixJQUFlVixRQUFRaUIsbUJBQTFCLEVBQStDO0FBQzNDSixnQkFBSUEsRUFBRUUsT0FBRixDQUFVdkIsaUJBQVYsRUFBNkIsRUFBN0IsQ0FBSjtBQUNIO0FBQ0QsZUFBT3FCLENBQVA7QUFDSCxLQVp3QixDQUF6Qjs7QUFjQSxXQUFPSyx1QkFBdUJQLGdCQUF2QixFQUF5Q2IsTUFBekMsQ0FBUDtBQUNIOztBQUVELFNBQVNvQixzQkFBVCxDQUFnQ3JCLE9BQWhDLEVBQXlDQyxNQUF6QyxFQUFpRDtBQUM3QyxRQUFJcUIsTUFBTSxFQUFWO0FBQ0EsU0FBSSxJQUFJTCxJQUFJLENBQVIsRUFBV0osSUFBSWIsUUFBUU0sTUFBM0IsRUFBbUNXLElBQUlKLENBQXZDLEVBQTBDSSxHQUExQyxFQUErQztBQUMzQ0ssZUFBT3RCLFFBQVFpQixDQUFSLENBQVA7QUFDQSxZQUFHQSxJQUFJSixJQUFJLENBQVgsRUFBYztBQUNWUyxtQkFBT3JCLE9BQU9nQixDQUFQLENBQVA7QUFDSDtBQUNKO0FBQ0QsV0FBT0ssR0FBUDtBQUNIOztBQUVEOzs7Ozs7QUFNQSxTQUFTQyxjQUFULENBQXdCcEIsT0FBeEIsRUFBaUM7QUFDN0IsUUFBTXFCLFFBQVEvQyxlQUFkOztBQUVBLFFBQU02QyxNQUFNLFNBQVNaLE9BQVQsQ0FBaUJlLGdCQUFqQixFQUE4QztBQUN0RCxZQUFHMUMsSUFBSTBDLGdCQUFKLEVBQXNCLEtBQXRCLEtBQWdDMUMsSUFBSTBDLGdCQUFKLEVBQXNCLFFBQXRCLENBQW5DLEVBQW9FO0FBQ2hFO0FBQ0EsZ0JBQU16QixVQUFVeUIsZ0JBQWhCO0FBQ0E7O0FBSGdFLDhDQUR0QnhCLE1BQ3NCO0FBRHRCQSxzQkFDc0I7QUFBQTs7QUFJaEUsZ0JBQUdBLE9BQU9LLE1BQVAsS0FBa0IsQ0FBbEIsSUFBdUJrQixNQUFNekMsR0FBTixDQUFVaUIsT0FBVixDQUExQixFQUE4QyxPQUFPd0IsTUFBTUUsR0FBTixDQUFVMUIsT0FBVixDQUFQOztBQUU5QztBQUNBLGdCQUFNMkIsV0FBVzVCLFNBQVNDLE9BQVQsRUFBa0JDLE1BQWxCLEVBQTBCcUIsR0FBMUIsRUFBK0JuQixPQUEvQixDQUFqQjs7QUFFQTtBQUNBRixtQkFBT0ssTUFBUCxLQUFrQixDQUFsQixJQUF1QmtCLE1BQU0xQyxHQUFOLENBQVVrQixPQUFWLEVBQW1CMkIsUUFBbkIsQ0FBdkI7QUFDQSxtQkFBT0EsUUFBUDtBQUNILFNBWkQsTUFZTztBQUNIO0FBQ0EsbUJBQU9KLGVBQWVoQyxPQUFPQSxPQUFPLEVBQVAsRUFBV1ksT0FBWCxDQUFQLEVBQTRCc0Isb0JBQW9CLEVBQWhELENBQWYsQ0FBUDtBQUNIO0FBQ0osS0FqQkQ7O0FBbUJBLFdBQU9ILEdBQVA7QUFDSDs7QUFFRCxJQUFNWixVQUFVYSxlQUFlO0FBQzNCSix3QkFBb0IsSUFETztBQUUzQkMseUJBQXFCO0FBRk0sQ0FBZixDQUFoQjs7QUFLQTtBQUNBVixRQUFRa0IsT0FBUixHQUFrQmxCLE9BQWxCO0FBQ0FBLFFBQVFBLE9BQVIsR0FBa0JBLE9BQWxCO0FBQ0FBLFFBQVFtQixVQUFSLEdBQXFCLElBQXJCO0FBQ0FDLFFBQVFGLE9BQVIsR0FBa0JsQixPQUFsQjtBQUNBb0IsUUFBUXBCLE9BQVIsR0FBa0JBLE9BQWxCO0FBQ0FvQixRQUFRRCxVQUFSLEdBQXFCLElBQXJCO0FBQ0FFLE9BQU9ELE9BQVAsR0FBaUJwQixPQUFqQiIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEluIHRoZSBhYnNlbmNlIG9mIGEgV2Vha1NldCBvciBXZWFrTWFwIGltcGxlbWVudGF0aW9uLCBkb24ndCBicmVhaywgYnV0IGRvbid0IGNhY2hlIGVpdGhlci5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuZnVuY3Rpb24gY3JlYXRlV2Vha01hcCgpIHtcbiAgICBpZih0eXBlb2YgV2Vha01hcCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXZWFrTWFwKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZha2VTZXRPck1hcCgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZha2VTZXRPck1hcCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBhZGQ6IG5vb3AsXG4gICAgICAgIGRlbGV0ZTogbm9vcCxcbiAgICAgICAgc2V0OiBub29wLFxuICAgICAgICBoYXM6IGZ1bmN0aW9uKCkge3JldHVybiBmYWxzZTt9XG4gICAgfTtcbn1cblxuLy8gU2FmZSBoYXNPd25Qcm9wZXJ0eVxuY29uc3QgaG9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbmNvbnN0IGhhcyA9IGZ1bmN0aW9uKG9iaiwgcHJvcCkge1xuICAgIHJldHVybiBob3AuY2FsbChvYmosIHByb3ApO1xufTtcblxuLy8gQ29weSBhbGwgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBmcm9tIHNvdXJjZSB0byB0YXJnZXRcbmZ1bmN0aW9uIGV4dGVuZCh0YXJnZXQsIHNvdXJjZSkge1xuICAgIGZvcihsZXQgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYoaGFzKHNvdXJjZSwgcHJvcCkpIHtcbiAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuXG5jb25zdCByZUxlYWRpbmdOZXdsaW5lID0gL15bIFxcdF0qKD86XFxyXFxufFxccnxcXG4pLztcbmNvbnN0IHJlVHJhaWxpbmdOZXdsaW5lID0gLyg/OlxcclxcbnxcXHJ8XFxuKVsgXFx0XSokLztcbmNvbnN0IHJlU3RhcnRzV2l0aE5ld2xpbmVPcklzRW1wdHkgPSAvXig/OltcXHJcXG5dfCQpLztcbmNvbnN0IHJlRGV0ZWN0SW5kZW50YXRpb24gPSAvKFxcclxcbnxcXHJ8XFxuKShbIFxcdF0qKSg/OlteIFxcdFxcclxcbl18JCkvO1xuY29uc3QgcmVPbmx5V2hpdGVzcGFjZVdpdGhBdExlYXN0T25lTmV3bGluZSA9IC9eWyBcXHRdKltcXHJcXG5dWyBcXHRcXHJcXG5dKiQvO1xuXG5mdW5jdGlvbiBfb3V0ZGVudChzdHJpbmdzLCB2YWx1ZXMsIG91dGRlbnRJbnN0YW5jZSwgb3B0aW9ucykge1xuICAgIC8vIElmIGZpcnN0IGludGVycG9sYXRlZCB2YWx1ZSBpcyBhIHJlZmVyZW5jZSB0byBvdXRkZW50LFxuICAgIC8vIGRldGVybWluZSBpbmRlbnRhdGlvbiBsZXZlbCBmcm9tIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgaW50ZXJwb2xhdGVkIHZhbHVlLlxuICAgIGxldCBpbmRlbnRhdGlvbkxldmVsID0gMDtcblxuICAgIGNvbnN0IG1hdGNoID0gc3RyaW5nc1swXS5tYXRjaChyZURldGVjdEluZGVudGF0aW9uKTtcbiAgICBpZihtYXRjaCkge1xuICAgICAgICBpbmRlbnRhdGlvbkxldmVsID0gbWF0Y2hbMl0ubGVuZ3RoO1xuICAgIH1cblxuICAgIGxldCByZVNvdXJjZSA9IGAoXFxcXHJcXFxcbnxcXFxccnxcXFxcbikuezAsJHtpbmRlbnRhdGlvbkxldmVsfX1gO1xuICAgIGNvbnN0IHJlTWF0Y2hJbmRlbnQgPSBuZXcgUmVnRXhwKHJlU291cmNlLCAnZycpO1xuXG4gICAgLy8gSXMgZmlyc3QgaW50ZXJwb2xhdGVkIHZhbHVlIGEgcmVmZXJlbmNlIHRvIG91dGRlbnQsIGFsb25lIG9uIGl0cyBvd24gbGluZSwgd2l0aG91dCBhbnkgcHJlY2VkaW5nIG5vbi13aGl0ZXNwYWNlP1xuICAgIGlmKFxuICAgICAgICAodmFsdWVzWzBdID09PSBvdXRkZW50SW5zdGFuY2UgfHwgdmFsdWVzWzBdID09PSBvdXRkZW50KSAmJlxuICAgICAgICByZU9ubHlXaGl0ZXNwYWNlV2l0aEF0TGVhc3RPbmVOZXdsaW5lLnRlc3Qoc3RyaW5nc1swXSkgJiZcbiAgICAgICAgcmVTdGFydHNXaXRoTmV3bGluZU9ySXNFbXB0eS50ZXN0KHN0cmluZ3NbMV0pXG4gICAgKSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5zbGljZSgxKTtcbiAgICAgICAgc3RyaW5ncyA9IHN0cmluZ3Muc2xpY2UoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgbCA9IHN0cmluZ3MubGVuZ3RoO1xuICAgIGNvbnN0IG91dGRlbnRlZFN0cmluZ3MgPSBzdHJpbmdzLm1hcCgodiwgaSkgPT4ge1xuICAgICAgICAvLyBSZW1vdmUgbGVhZGluZyBpbmRlbnRhdGlvbiBmcm9tIGFsbCBsaW5lc1xuICAgICAgICB2ID0gdi5yZXBsYWNlKHJlTWF0Y2hJbmRlbnQsICckMScpO1xuICAgICAgICAvLyBUcmltIGEgbGVhZGluZyBuZXdsaW5lIGZyb20gdGhlIGZpcnN0IHN0cmluZ1xuICAgICAgICBpZihpID09PSAwICYmIG9wdGlvbnMudHJpbUxlYWRpbmdOZXdsaW5lKSB7XG4gICAgICAgICAgICB2ID0gdi5yZXBsYWNlKHJlTGVhZGluZ05ld2xpbmUsICcnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUcmltIGEgdHJhaWxpbmcgbmV3bGluZSBmcm9tIHRoZSBsYXN0IHN0cmluZ1xuICAgICAgICBpZihpID09PSBsIC0gMSAmJiBvcHRpb25zLnRyaW1UcmFpbGluZ05ld2xpbmUpIHtcbiAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UocmVUcmFpbGluZ05ld2xpbmUsICcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdjtcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gY29uY2F0U3RyaW5nc0FuZFZhbHVlcyhvdXRkZW50ZWRTdHJpbmdzLCB2YWx1ZXMpO1xufVxuXG5mdW5jdGlvbiBjb25jYXRTdHJpbmdzQW5kVmFsdWVzKHN0cmluZ3MsIHZhbHVlcykge1xuICAgIGxldCByZXQgPSAnJztcbiAgICBmb3IobGV0IGkgPSAwLCBsID0gc3RyaW5ncy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgcmV0ICs9IHN0cmluZ3NbaV07XG4gICAgICAgIGlmKGkgPCBsIC0gMSkge1xuICAgICAgICAgICAgcmV0ICs9IHZhbHVlc1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIEl0IGlzIGFzc3VtZWQgdGhhdCBvcHRzIHdpbGwgbm90IGNoYW5nZS4gIElmIHRoaXMgaXMgYSBwcm9ibGVtLCBjbG9uZSB5b3VyIG9wdGlvbnMgb2JqZWN0IGFuZCBwYXNzIHRoZSBjbG9uZSB0b1xuICogbWFrZUluc3RhbmNlXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHJldHVybiB7b3V0ZGVudH1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2Uob3B0aW9ucykge1xuICAgIGNvbnN0IGNhY2hlID0gY3JlYXRlV2Vha01hcCgpO1xuXG4gICAgY29uc3QgcmV0ID0gZnVuY3Rpb24gb3V0ZGVudChzdHJpbmdzT3JPcHRpb25zLCAuLi52YWx1ZXMpIHtcbiAgICAgICAgaWYoaGFzKHN0cmluZ3NPck9wdGlvbnMsICdyYXcnKSAmJiBoYXMoc3RyaW5nc09yT3B0aW9ucywgJ2xlbmd0aCcpKSB7XG4gICAgICAgICAgICAvLyBUT0RPIEVuYWJsZSBzZW1pLWNhY2hpbmcsIGJvdGggd2hlbiB0aGUgZmlyc3QgaW50ZXJwb2xhdGVkIHZhbHVlIGlzIGBvdXRkZW50YCwgYW5kIHdoZW4gaXQncyBub3RcbiAgICAgICAgICAgIGNvbnN0IHN0cmluZ3MgPSBzdHJpbmdzT3JPcHRpb25zO1xuICAgICAgICAgICAgLy8gU2VydmUgZnJvbSBjYWNoZSBvbmx5IGlmIHRoZXJlIGFyZSBubyBpbnRlcnBvbGF0ZWQgdmFsdWVzXG4gICAgICAgICAgICBpZih2YWx1ZXMubGVuZ3RoID09PSAwICYmIGNhY2hlLmhhcyhzdHJpbmdzKSkgcmV0dXJuIGNhY2hlLmdldChzdHJpbmdzKTtcblxuICAgICAgICAgICAgLy8gUGVyZm9ybSBvdXRkZW50YXRpb25cbiAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVkID0gX291dGRlbnQoc3RyaW5ncywgdmFsdWVzLCByZXQsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAvLyBTdG9yZSBpbnRvIHRoZSBjYWNoZSBvbmx5IGlmIHRoZXJlIGFyZSBubyBpbnRlcnBvbGF0ZWQgdmFsdWVzXG4gICAgICAgICAgICB2YWx1ZXMubGVuZ3RoID09PSAwICYmIGNhY2hlLnNldChzdHJpbmdzLCByZW5kZXJlZCk7XG4gICAgICAgICAgICByZXR1cm4gcmVuZGVyZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBvdXRkZW50IHdpdGggdGhlIGdpdmVuIG9wdGlvbnNcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnN0YW5jZShleHRlbmQoZXh0ZW5kKHt9LCBvcHRpb25zKSwgc3RyaW5nc09yT3B0aW9ucyB8fCB7fSkpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiByZXQ7XG59XG5cbmNvbnN0IG91dGRlbnQgPSBjcmVhdGVJbnN0YW5jZSh7XG4gICAgdHJpbUxlYWRpbmdOZXdsaW5lOiB0cnVlLFxuICAgIHRyaW1UcmFpbGluZ05ld2xpbmU6IHRydWVcbn0pO1xuXG4vLyBFUzZcbm91dGRlbnQuZGVmYXVsdCA9IG91dGRlbnQ7XG5vdXRkZW50Lm91dGRlbnQgPSBvdXRkZW50O1xub3V0ZGVudC5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuZGVmYXVsdCA9IG91dGRlbnQ7XG5leHBvcnRzLm91dGRlbnQgPSBvdXRkZW50O1xuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbm1vZHVsZS5leHBvcnRzID0gb3V0ZGVudDtcbiJdfQ==//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9vdXRkZW50L2xpYi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8vIEluIHRoZSBhYnNlbmNlIG9mIGEgV2Vha1NldCBvciBXZWFrTWFwIGltcGxlbWVudGF0aW9uLCBkb24ndCBicmVhaywgYnV0IGRvbid0IGNhY2hlIGVpdGhlci5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuZnVuY3Rpb24gY3JlYXRlV2Vha01hcCgpIHtcbiAgICBpZiAodHlwZW9mIFdlYWtNYXAgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgV2Vha01hcCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWtlU2V0T3JNYXAoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBmYWtlU2V0T3JNYXAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWRkOiBub29wLFxuICAgICAgICBkZWxldGU6IG5vb3AsXG4gICAgICAgIHNldDogbm9vcCxcbiAgICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG4vLyBTYWZlIGhhc093blByb3BlcnR5XG52YXIgaG9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBoYXMgPSBmdW5jdGlvbiBoYXMob2JqLCBwcm9wKSB7XG4gICAgcmV0dXJuIGhvcC5jYWxsKG9iaiwgcHJvcCk7XG59O1xuXG4vLyBDb3B5IGFsbCBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGZyb20gc291cmNlIHRvIHRhcmdldFxuZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCwgc291cmNlKSB7XG4gICAgZm9yICh2YXIgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKGhhcyhzb3VyY2UsIHByb3ApKSB7XG4gICAgICAgICAgICB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cblxudmFyIHJlTGVhZGluZ05ld2xpbmUgPSAvXlsgXFx0XSooPzpcXHJcXG58XFxyfFxcbikvO1xudmFyIHJlVHJhaWxpbmdOZXdsaW5lID0gLyg/OlxcclxcbnxcXHJ8XFxuKVsgXFx0XSokLztcbnZhciByZVN0YXJ0c1dpdGhOZXdsaW5lT3JJc0VtcHR5ID0gL14oPzpbXFxyXFxuXXwkKS87XG52YXIgcmVEZXRlY3RJbmRlbnRhdGlvbiA9IC8oXFxyXFxufFxccnxcXG4pKFsgXFx0XSopKD86W14gXFx0XFxyXFxuXXwkKS87XG52YXIgcmVPbmx5V2hpdGVzcGFjZVdpdGhBdExlYXN0T25lTmV3bGluZSA9IC9eWyBcXHRdKltcXHJcXG5dWyBcXHRcXHJcXG5dKiQvO1xuXG5mdW5jdGlvbiBfb3V0ZGVudChzdHJpbmdzLCB2YWx1ZXMsIG91dGRlbnRJbnN0YW5jZSwgb3B0aW9ucykge1xuICAgIC8vIElmIGZpcnN0IGludGVycG9sYXRlZCB2YWx1ZSBpcyBhIHJlZmVyZW5jZSB0byBvdXRkZW50LFxuICAgIC8vIGRldGVybWluZSBpbmRlbnRhdGlvbiBsZXZlbCBmcm9tIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgaW50ZXJwb2xhdGVkIHZhbHVlLlxuICAgIHZhciBpbmRlbnRhdGlvbkxldmVsID0gMDtcblxuICAgIHZhciBtYXRjaCA9IHN0cmluZ3NbMF0ubWF0Y2gocmVEZXRlY3RJbmRlbnRhdGlvbik7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGluZGVudGF0aW9uTGV2ZWwgPSBtYXRjaFsyXS5sZW5ndGg7XG4gICAgfVxuXG4gICAgdmFyIHJlU291cmNlID0gJyhcXFxcclxcXFxufFxcXFxyfFxcXFxuKS57MCwnICsgaW5kZW50YXRpb25MZXZlbCArICd9JztcbiAgICB2YXIgcmVNYXRjaEluZGVudCA9IG5ldyBSZWdFeHAocmVTb3VyY2UsICdnJyk7XG5cbiAgICAvLyBJcyBmaXJzdCBpbnRlcnBvbGF0ZWQgdmFsdWUgYSByZWZlcmVuY2UgdG8gb3V0ZGVudCwgYWxvbmUgb24gaXRzIG93biBsaW5lLCB3aXRob3V0IGFueSBwcmVjZWRpbmcgbm9uLXdoaXRlc3BhY2U/XG4gICAgaWYgKCh2YWx1ZXNbMF0gPT09IG91dGRlbnRJbnN0YW5jZSB8fCB2YWx1ZXNbMF0gPT09IG91dGRlbnQpICYmIHJlT25seVdoaXRlc3BhY2VXaXRoQXRMZWFzdE9uZU5ld2xpbmUudGVzdChzdHJpbmdzWzBdKSAmJiByZVN0YXJ0c1dpdGhOZXdsaW5lT3JJc0VtcHR5LnRlc3Qoc3RyaW5nc1sxXSkpIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLnNsaWNlKDEpO1xuICAgICAgICBzdHJpbmdzID0gc3RyaW5ncy5zbGljZSgxKTtcbiAgICB9XG5cbiAgICB2YXIgbCA9IHN0cmluZ3MubGVuZ3RoO1xuICAgIHZhciBvdXRkZW50ZWRTdHJpbmdzID0gc3RyaW5ncy5tYXAoZnVuY3Rpb24gKHYsIGkpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGxlYWRpbmcgaW5kZW50YXRpb24gZnJvbSBhbGwgbGluZXNcbiAgICAgICAgdiA9IHYucmVwbGFjZShyZU1hdGNoSW5kZW50LCAnJDEnKTtcbiAgICAgICAgLy8gVHJpbSBhIGxlYWRpbmcgbmV3bGluZSBmcm9tIHRoZSBmaXJzdCBzdHJpbmdcbiAgICAgICAgaWYgKGkgPT09IDAgJiYgb3B0aW9ucy50cmltTGVhZGluZ05ld2xpbmUpIHtcbiAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UocmVMZWFkaW5nTmV3bGluZSwgJycpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyaW0gYSB0cmFpbGluZyBuZXdsaW5lIGZyb20gdGhlIGxhc3Qgc3RyaW5nXG4gICAgICAgIGlmIChpID09PSBsIC0gMSAmJiBvcHRpb25zLnRyaW1UcmFpbGluZ05ld2xpbmUpIHtcbiAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UocmVUcmFpbGluZ05ld2xpbmUsICcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdjtcbiAgICB9KTtcblxuICAgIHJldHVybiBjb25jYXRTdHJpbmdzQW5kVmFsdWVzKG91dGRlbnRlZFN0cmluZ3MsIHZhbHVlcyk7XG59XG5cbmZ1bmN0aW9uIGNvbmNhdFN0cmluZ3NBbmRWYWx1ZXMoc3RyaW5ncywgdmFsdWVzKSB7XG4gICAgdmFyIHJldCA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gc3RyaW5ncy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgcmV0ICs9IHN0cmluZ3NbaV07XG4gICAgICAgIGlmIChpIDwgbCAtIDEpIHtcbiAgICAgICAgICAgIHJldCArPSB2YWx1ZXNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBJdCBpcyBhc3N1bWVkIHRoYXQgb3B0cyB3aWxsIG5vdCBjaGFuZ2UuICBJZiB0aGlzIGlzIGEgcHJvYmxlbSwgY2xvbmUgeW91ciBvcHRpb25zIG9iamVjdCBhbmQgcGFzcyB0aGUgY2xvbmUgdG9cbiAqIG1ha2VJbnN0YW5jZVxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEByZXR1cm4ge291dGRlbnR9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKG9wdGlvbnMpIHtcbiAgICB2YXIgY2FjaGUgPSBjcmVhdGVXZWFrTWFwKCk7XG5cbiAgICB2YXIgcmV0ID0gZnVuY3Rpb24gb3V0ZGVudChzdHJpbmdzT3JPcHRpb25zKSB7XG4gICAgICAgIGlmIChoYXMoc3RyaW5nc09yT3B0aW9ucywgJ3JhdycpICYmIGhhcyhzdHJpbmdzT3JPcHRpb25zLCAnbGVuZ3RoJykpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gRW5hYmxlIHNlbWktY2FjaGluZywgYm90aCB3aGVuIHRoZSBmaXJzdCBpbnRlcnBvbGF0ZWQgdmFsdWUgaXMgYG91dGRlbnRgLCBhbmQgd2hlbiBpdCdzIG5vdFxuICAgICAgICAgICAgdmFyIHN0cmluZ3MgPSBzdHJpbmdzT3JPcHRpb25zO1xuICAgICAgICAgICAgLy8gU2VydmUgZnJvbSBjYWNoZSBvbmx5IGlmIHRoZXJlIGFyZSBubyBpbnRlcnBvbGF0ZWQgdmFsdWVzXG5cbiAgICAgICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCB2YWx1ZXMgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDAgJiYgY2FjaGUuaGFzKHN0cmluZ3MpKSByZXR1cm4gY2FjaGUuZ2V0KHN0cmluZ3MpO1xuXG4gICAgICAgICAgICAvLyBQZXJmb3JtIG91dGRlbnRhdGlvblxuICAgICAgICAgICAgdmFyIHJlbmRlcmVkID0gX291dGRlbnQoc3RyaW5ncywgdmFsdWVzLCByZXQsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAvLyBTdG9yZSBpbnRvIHRoZSBjYWNoZSBvbmx5IGlmIHRoZXJlIGFyZSBubyBpbnRlcnBvbGF0ZWQgdmFsdWVzXG4gICAgICAgICAgICB2YWx1ZXMubGVuZ3RoID09PSAwICYmIGNhY2hlLnNldChzdHJpbmdzLCByZW5kZXJlZCk7XG4gICAgICAgICAgICByZXR1cm4gcmVuZGVyZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBvdXRkZW50IHdpdGggdGhlIGdpdmVuIG9wdGlvbnNcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnN0YW5jZShleHRlbmQoZXh0ZW5kKHt9LCBvcHRpb25zKSwgc3RyaW5nc09yT3B0aW9ucyB8fCB7fSkpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiByZXQ7XG59XG5cbnZhciBvdXRkZW50ID0gY3JlYXRlSW5zdGFuY2Uoe1xuICAgIHRyaW1MZWFkaW5nTmV3bGluZTogdHJ1ZSxcbiAgICB0cmltVHJhaWxpbmdOZXdsaW5lOiB0cnVlXG59KTtcblxuLy8gRVM2XG5vdXRkZW50LmRlZmF1bHQgPSBvdXRkZW50O1xub3V0ZGVudC5vdXRkZW50ID0gb3V0ZGVudDtcbm91dGRlbnQuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmRlZmF1bHQgPSBvdXRkZW50O1xuZXhwb3J0cy5vdXRkZW50ID0gb3V0ZGVudDtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5tb2R1bGUuZXhwb3J0cyA9IG91dGRlbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUwzTnlZeTlwYm1SbGVDNWxjeUpkTENKdVlXMWxjeUk2V3lKdWIyOXdJaXdpWTNKbFlYUmxWMlZoYTAxaGNDSXNJbGRsWVd0TllYQWlMQ0ptWVd0bFUyVjBUM0pOWVhBaUxDSmhaR1FpTENKa1pXeGxkR1VpTENKelpYUWlMQ0pvWVhNaUxDSm9iM0FpTENKUFltcGxZM1FpTENKd2NtOTBiM1I1Y0dVaUxDSm9ZWE5QZDI1UWNtOXdaWEowZVNJc0ltOWlhaUlzSW5CeWIzQWlMQ0pqWVd4c0lpd2laWGgwWlc1a0lpd2lkR0Z5WjJWMElpd2ljMjkxY21ObElpd2ljbVZNWldGa2FXNW5UbVYzYkdsdVpTSXNJbkpsVkhKaGFXeHBibWRPWlhkc2FXNWxJaXdpY21WVGRHRnlkSE5YYVhSb1RtVjNiR2x1WlU5eVNYTkZiWEIwZVNJc0luSmxSR1YwWldOMFNXNWtaVzUwWVhScGIyNGlMQ0p5WlU5dWJIbFhhR2wwWlhOd1lXTmxWMmwwYUVGMFRHVmhjM1JQYm1WT1pYZHNhVzVsSWl3aVgyOTFkR1JsYm5RaUxDSnpkSEpwYm1keklpd2lkbUZzZFdWeklpd2liM1YwWkdWdWRFbHVjM1JoYm1ObElpd2liM0IwYVc5dWN5SXNJbWx1WkdWdWRHRjBhVzl1VEdWMlpXd2lMQ0p0WVhSamFDSXNJbXhsYm1kMGFDSXNJbkpsVTI5MWNtTmxJaXdpY21WTllYUmphRWx1WkdWdWRDSXNJbEpsWjBWNGNDSXNJbTkxZEdSbGJuUWlMQ0owWlhOMElpd2ljMnhwWTJVaUxDSnNJaXdpYjNWMFpHVnVkR1ZrVTNSeWFXNW5jeUlzSW0xaGNDSXNJbllpTENKcElpd2ljbVZ3YkdGalpTSXNJblJ5YVcxTVpXRmthVzVuVG1WM2JHbHVaU0lzSW5SeWFXMVVjbUZwYkdsdVowNWxkMnhwYm1VaUxDSmpiMjVqWVhSVGRISnBibWR6UVc1a1ZtRnNkV1Z6SWl3aWNtVjBJaXdpWTNKbFlYUmxTVzV6ZEdGdVkyVWlMQ0pqWVdOb1pTSXNJbk4wY21sdVozTlBjazl3ZEdsdmJuTWlMQ0puWlhRaUxDSnlaVzVrWlhKbFpDSXNJbVJsWm1GMWJIUWlMQ0pmWDJWelRXOWtkV3hsSWl3aVpYaHdiM0owY3lJc0ltMXZaSFZzWlNKZExDSnRZWEJ3YVc1bmN5STZJanM3UVVGQlFUdEJRVU5CTEZOQlFWTkJMRWxCUVZRc1IwRkJaMElzUTBGQlJUdEJRVU5zUWl4VFFVRlRReXhoUVVGVUxFZEJRWGxDTzBGQlEzSkNMRkZCUVVjc1QwRkJUME1zVDBGQlVDeExRVUZ0UWl4WFFVRjBRaXhGUVVGdFF6dEJRVU12UWl4bFFVRlBMRWxCUVVsQkxFOUJRVW9zUlVGQlVEdEJRVU5JTEV0QlJrUXNUVUZGVHp0QlFVTklMR1ZCUVU5RExHTkJRVkE3UVVGRFNEdEJRVU5LTzBGQlEwUXNVMEZCVTBFc1dVRkJWQ3hIUVVGM1FqdEJRVU53UWl4WFFVRlBPMEZCUTBoRExHRkJRVXRLTEVsQlJFWTdRVUZGU0Vzc1owSkJRVkZNTEVsQlJrdzdRVUZIU0Uwc1lVRkJTMDRzU1VGSVJqdEJRVWxJVHl4aFFVRkxMR1ZCUVZjN1FVRkJReXh0UWtGQlR5eExRVUZRTzBGQlFXTTdRVUZLTlVJc1MwRkJVRHRCUVUxSU96dEJRVVZFTzBGQlEwRXNTVUZCVFVNc1RVRkJUVU1zVDBGQlQwTXNVMEZCVUN4RFFVRnBRa01zWTBGQk4wSTdRVUZEUVN4SlFVRk5TaXhOUVVGTkxGTkJRVTVCTEVkQlFVMHNRMEZCVTBzc1IwRkJWQ3hGUVVGalF5eEpRVUZrTEVWQlFXOUNPMEZCUXpWQ0xGZEJRVTlNTEVsQlFVbE5MRWxCUVVvc1EwRkJVMFlzUjBGQlZDeEZRVUZqUXl4SlFVRmtMRU5CUVZBN1FVRkRTQ3hEUVVaRU96dEJRVWxCTzBGQlEwRXNVMEZCVTBVc1RVRkJWQ3hEUVVGblFrTXNUVUZCYUVJc1JVRkJkMEpETEUxQlFYaENMRVZCUVdkRE8wRkJRelZDTEZOQlFVa3NTVUZCU1Vvc1NVRkJVaXhKUVVGblFra3NUVUZCYUVJc1JVRkJkMEk3UVVGRGNFSXNXVUZCUjFZc1NVRkJTVlVzVFVGQlNpeEZRVUZaU2l4SlFVRmFMRU5CUVVnc1JVRkJjMEk3UVVGRGJFSkhMRzFDUVVGUFNDeEpRVUZRTEVsQlFXVkpMRTlCUVU5S0xFbEJRVkFzUTBGQlpqdEJRVU5JTzBGQlEwbzdRVUZEUkN4WFFVRlBSeXhOUVVGUU8wRkJRMGc3TzBGQlJVUXNTVUZCVFVVc2JVSkJRVzFDTEhWQ1FVRjZRanRCUVVOQkxFbEJRVTFETEc5Q1FVRnZRaXgxUWtGQk1VSTdRVUZEUVN4SlFVRk5ReXdyUWtGQkswSXNaVUZCY2tNN1FVRkRRU3hKUVVGTlF5eHpRa0ZCYzBJc2MwTkJRVFZDTzBGQlEwRXNTVUZCVFVNc2QwTkJRWGRETERCQ1FVRTVRenM3UVVGRlFTeFRRVUZUUXl4UlFVRlVMRU5CUVd0Q1F5eFBRVUZzUWl4RlFVRXlRa01zVFVGQk0wSXNSVUZCYlVORExHVkJRVzVETEVWQlFXOUVReXhQUVVGd1JDeEZRVUUyUkR0QlFVTjZSRHRCUVVOQk8wRkJRMEVzVVVGQlNVTXNiVUpCUVcxQ0xFTkJRWFpDT3p0QlFVVkJMRkZCUVUxRExGRkJRVkZNTEZGQlFWRXNRMEZCVWl4RlFVRlhTeXhMUVVGWUxFTkJRV2xDVWl4dFFrRkJha0lzUTBGQlpEdEJRVU5CTEZGQlFVZFJMRXRCUVVnc1JVRkJWVHRCUVVOT1JDd3lRa0ZCYlVKRExFMUJRVTBzUTBGQlRpeEZRVUZUUXl4TlFVRTFRanRCUVVOSU96dEJRVVZFTEZGQlFVbERMRzlEUVVGclEwZ3NaMEpCUVd4RExFMUJRVW83UVVGRFFTeFJRVUZOU1N4blFrRkJaMElzU1VGQlNVTXNUVUZCU2l4RFFVRlhSaXhSUVVGWUxFVkJRWEZDTEVkQlFYSkNMRU5CUVhSQ096dEJRVVZCTzBGQlEwRXNVVUZEU1N4RFFVRkRUaXhQUVVGUExFTkJRVkFzVFVGQlkwTXNaVUZCWkN4SlFVRnBRMFFzVDBGQlR5eERRVUZRTEUxQlFXTlRMRTlCUVdoRUxFdEJRMEZhTEhORFFVRnpRMkVzU1VGQmRFTXNRMEZCTWtOWUxGRkJRVkVzUTBGQlVpeERRVUV6UXl4RFFVUkJMRWxCUlVGS0xEWkNRVUUyUW1Vc1NVRkJOMElzUTBGQmEwTllMRkZCUVZFc1EwRkJVaXhEUVVGc1F5eERRVWhLTEVWQlNVVTdRVUZEUlVNc2FVSkJRVk5CTEU5QlFVOVhMRXRCUVZBc1EwRkJZU3hEUVVGaUxFTkJRVlE3UVVGRFFWb3NhMEpCUVZWQkxGRkJRVkZaTEV0QlFWSXNRMEZCWXl4RFFVRmtMRU5CUVZZN1FVRkRTRHM3UVVGRlJDeFJRVUZOUXl4SlFVRkpZaXhSUVVGUlRTeE5RVUZzUWp0QlFVTkJMRkZCUVUxUkxHMUNRVUZ0UW1Rc1VVRkJVV1VzUjBGQlVpeERRVUZaTEZWQlFVTkRMRU5CUVVRc1JVRkJTVU1zUTBGQlNpeEZRVUZWTzBGQlF6TkRPMEZCUTBGRUxGbEJRVWxCTEVWQlFVVkZMRTlCUVVZc1EwRkJWVllzWVVGQlZpeEZRVUY1UWl4SlFVRjZRaXhEUVVGS08wRkJRMEU3UVVGRFFTeFpRVUZIVXl4TlFVRk5MRU5CUVU0c1NVRkJWMlFzVVVGQlVXZENMR3RDUVVGMFFpeEZRVUV3UXp0QlFVTjBRMGdzWjBKQlFVbEJMRVZCUVVWRkxFOUJRVVlzUTBGQlZYaENMR2RDUVVGV0xFVkJRVFJDTEVWQlFUVkNMRU5CUVVvN1FVRkRTRHRCUVVORU8wRkJRMEVzV1VGQlIzVkNMRTFCUVUxS0xFbEJRVWtzUTBGQlZpeEpRVUZsVml4UlFVRlJhVUlzYlVKQlFURkNMRVZCUVN0RE8wRkJRek5EU2l4blFrRkJTVUVzUlVGQlJVVXNUMEZCUml4RFFVRlZka0lzYVVKQlFWWXNSVUZCTmtJc1JVRkJOMElzUTBGQlNqdEJRVU5JTzBGQlEwUXNaVUZCVDNGQ0xFTkJRVkE3UVVGRFNDeExRVnAzUWl4RFFVRjZRanM3UVVGalFTeFhRVUZQU3l4MVFrRkJkVUpRTEdkQ1FVRjJRaXhGUVVGNVEySXNUVUZCZWtNc1EwRkJVRHRCUVVOSU96dEJRVVZFTEZOQlFWTnZRaXh6UWtGQlZDeERRVUZuUTNKQ0xFOUJRV2hETEVWQlFYbERReXhOUVVGNlF5eEZRVUZwUkR0QlFVTTNReXhSUVVGSmNVSXNUVUZCVFN4RlFVRldPMEZCUTBFc1UwRkJTU3hKUVVGSlRDeEpRVUZKTEVOQlFWSXNSVUZCVjBvc1NVRkJTV0lzVVVGQlVVMHNUVUZCTTBJc1JVRkJiVU5YTEVsQlFVbEtMRU5CUVhaRExFVkJRVEJEU1N4SFFVRXhReXhGUVVFclF6dEJRVU16UTBzc1pVRkJUM1JDTEZGQlFWRnBRaXhEUVVGU0xFTkJRVkE3UVVGRFFTeFpRVUZIUVN4SlFVRkpTaXhKUVVGSkxFTkJRVmdzUlVGQll6dEJRVU5XVXl4dFFrRkJUM0pDTEU5QlFVOW5RaXhEUVVGUUxFTkJRVkE3UVVGRFNEdEJRVU5LTzBGQlEwUXNWMEZCVDBzc1IwRkJVRHRCUVVOSU96dEJRVVZFT3pzN096czdRVUZOUVN4VFFVRlRReXhqUVVGVUxFTkJRWGRDY0VJc1QwRkJlRUlzUlVGQmFVTTdRVUZETjBJc1VVRkJUWEZDTEZGQlFWRXZReXhsUVVGa096dEJRVVZCTEZGQlFVMDJReXhOUVVGTkxGTkJRVk5hTEU5QlFWUXNRMEZCYVVKbExHZENRVUZxUWl4RlFVRTRRenRCUVVOMFJDeFpRVUZITVVNc1NVRkJTVEJETEdkQ1FVRktMRVZCUVhOQ0xFdEJRWFJDTEV0QlFXZERNVU1zU1VGQlNUQkRMR2RDUVVGS0xFVkJRWE5DTEZGQlFYUkNMRU5CUVc1RExFVkJRVzlGTzBGQlEyaEZPMEZCUTBFc1owSkJRVTE2UWl4VlFVRlZlVUlzWjBKQlFXaENPMEZCUTBFN08wRkJTR2RGTERoRFFVUjBRbmhDTEUxQlEzTkNPMEZCUkhSQ1FTeHpRa0ZEYzBJN1FVRkJRVHM3UVVGSmFFVXNaMEpCUVVkQkxFOUJRVTlMTEUxQlFWQXNTMEZCYTBJc1EwRkJiRUlzU1VGQmRVSnJRaXhOUVVGTmVrTXNSMEZCVGl4RFFVRlZhVUlzVDBGQlZpeERRVUV4UWl4RlFVRTRReXhQUVVGUGQwSXNUVUZCVFVVc1IwRkJUaXhEUVVGVk1VSXNUMEZCVml4RFFVRlFPenRCUVVVNVF6dEJRVU5CTEdkQ1FVRk5Na0lzVjBGQlZ6VkNMRk5CUVZORExFOUJRVlFzUlVGQmEwSkRMRTFCUVd4Q0xFVkJRVEJDY1VJc1IwRkJNVUlzUlVGQkswSnVRaXhQUVVFdlFpeERRVUZxUWpzN1FVRkZRVHRCUVVOQlJpeHRRa0ZCVDBzc1RVRkJVQ3hMUVVGclFpeERRVUZzUWl4SlFVRjFRbXRDTEUxQlFVMHhReXhIUVVGT0xFTkJRVlZyUWl4UFFVRldMRVZCUVcxQ01rSXNVVUZCYmtJc1EwRkJka0k3UVVGRFFTeHRRa0ZCVDBFc1VVRkJVRHRCUVVOSUxGTkJXa1FzVFVGWlR6dEJRVU5JTzBGQlEwRXNiVUpCUVU5S0xHVkJRV1ZvUXl4UFFVRlBRU3hQUVVGUExFVkJRVkFzUlVGQlYxa3NUMEZCV0N4RFFVRlFMRVZCUVRSQ2MwSXNiMEpCUVc5Q0xFVkJRV2hFTEVOQlFXWXNRMEZCVUR0QlFVTklPMEZCUTBvc1MwRnFRa1E3TzBGQmJVSkJMRmRCUVU5SUxFZEJRVkE3UVVGRFNEczdRVUZGUkN4SlFVRk5XaXhWUVVGVllTeGxRVUZsTzBGQlF6TkNTaXgzUWtGQmIwSXNTVUZFVHp0QlFVVXpRa01zZVVKQlFYRkNPMEZCUmswc1EwRkJaaXhEUVVGb1FqczdRVUZMUVR0QlFVTkJWaXhSUVVGUmEwSXNUMEZCVWl4SFFVRnJRbXhDTEU5QlFXeENPMEZCUTBGQkxGRkJRVkZCTEU5QlFWSXNSMEZCYTBKQkxFOUJRV3hDTzBGQlEwRkJMRkZCUVZGdFFpeFZRVUZTTEVkQlFYRkNMRWxCUVhKQ08wRkJRMEZETEZGQlFWRkdMRTlCUVZJc1IwRkJhMEpzUWl4UFFVRnNRanRCUVVOQmIwSXNVVUZCVVhCQ0xFOUJRVklzUjBGQmEwSkJMRTlCUVd4Q08wRkJRMEZ2UWl4UlFVRlJSQ3hWUVVGU0xFZEJRWEZDTEVsQlFYSkNPMEZCUTBGRkxFOUJRVTlFTEU5QlFWQXNSMEZCYVVKd1FpeFBRVUZxUWlJc0ltWnBiR1VpT2lKcGJtUmxlQzVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYklpOHZJRWx1SUhSb1pTQmhZbk5sYm1ObElHOW1JR0VnVjJWaGExTmxkQ0J2Y2lCWFpXRnJUV0Z3SUdsdGNHeGxiV1Z1ZEdGMGFXOXVMQ0JrYjI0bmRDQmljbVZoYXl3Z1luVjBJR1J2YmlkMElHTmhZMmhsSUdWcGRHaGxjaTVjYm1aMWJtTjBhVzl1SUc1dmIzQW9LU0I3ZlZ4dVpuVnVZM1JwYjI0Z1kzSmxZWFJsVjJWaGEwMWhjQ2dwSUh0Y2JpQWdJQ0JwWmloMGVYQmxiMllnVjJWaGEwMWhjQ0FoUFQwZ0ozVnVaR1ZtYVc1bFpDY3BJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJRzVsZHlCWFpXRnJUV0Z3S0NrN1hHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR1poYTJWVFpYUlBjazFoY0NncE8xeHVJQ0FnSUgxY2JuMWNibVoxYm1OMGFXOXVJR1poYTJWVFpYUlBjazFoY0NncElIdGNiaUFnSUNCeVpYUjFjbTRnZTF4dUlDQWdJQ0FnSUNCaFpHUTZJRzV2YjNBc1hHNGdJQ0FnSUNBZ0lHUmxiR1YwWlRvZ2JtOXZjQ3hjYmlBZ0lDQWdJQ0FnYzJWME9pQnViMjl3TEZ4dUlDQWdJQ0FnSUNCb1lYTTZJR1oxYm1OMGFXOXVLQ2tnZTNKbGRIVnliaUJtWVd4elpUdDlYRzRnSUNBZ2ZUdGNibjFjYmx4dUx5OGdVMkZtWlNCb1lYTlBkMjVRY205d1pYSjBlVnh1WTI5dWMzUWdhRzl3SUQwZ1QySnFaV04wTG5CeWIzUnZkSGx3WlM1b1lYTlBkMjVRY205d1pYSjBlVHRjYm1OdmJuTjBJR2hoY3lBOUlHWjFibU4wYVc5dUtHOWlhaXdnY0hKdmNDa2dlMXh1SUNBZ0lISmxkSFZ5YmlCb2IzQXVZMkZzYkNodlltb3NJSEJ5YjNBcE8xeHVmVHRjYmx4dUx5OGdRMjl3ZVNCaGJHd2diM2R1SUdWdWRXMWxjbUZpYkdVZ2NISnZjR1Z5ZEdsbGN5Qm1jbTl0SUhOdmRYSmpaU0IwYnlCMFlYSm5aWFJjYm1aMWJtTjBhVzl1SUdWNGRHVnVaQ2gwWVhKblpYUXNJSE52ZFhKalpTa2dlMXh1SUNBZ0lHWnZjaWhzWlhRZ2NISnZjQ0JwYmlCemIzVnlZMlVwSUh0Y2JpQWdJQ0FnSUNBZ2FXWW9hR0Z6S0hOdmRYSmpaU3dnY0hKdmNDa3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIUmhjbWRsZEZ0d2NtOXdYU0E5SUhOdmRYSmpaVnR3Y205d1hUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnZEdGeVoyVjBPMXh1ZlZ4dVhHNWpiMjV6ZENCeVpVeGxZV1JwYm1kT1pYZHNhVzVsSUQwZ0wxNWJJRnhjZEYwcUtEODZYRnh5WEZ4dWZGeGNjbnhjWEc0cEx6dGNibU52Ym5OMElISmxWSEpoYVd4cGJtZE9aWGRzYVc1bElEMGdMeWcvT2x4Y2NseGNibnhjWEhKOFhGeHVLVnNnWEZ4MFhTb2tMenRjYm1OdmJuTjBJSEpsVTNSaGNuUnpWMmwwYUU1bGQyeHBibVZQY2tselJXMXdkSGtnUFNBdlhpZy9PbHRjWEhKY1hHNWRmQ1FwTHp0Y2JtTnZibk4wSUhKbFJHVjBaV04wU1c1a1pXNTBZWFJwYjI0Z1BTQXZLRnhjY2x4Y2JueGNYSEo4WEZ4dUtTaGJJRnhjZEYwcUtTZy9PbHRlSUZ4Y2RGeGNjbHhjYmwxOEpDa3ZPMXh1WTI5dWMzUWdjbVZQYm14NVYyaHBkR1Z6Y0dGalpWZHBkR2hCZEV4bFlYTjBUMjVsVG1WM2JHbHVaU0E5SUM5ZVd5QmNYSFJkS2x0Y1hISmNYRzVkV3lCY1hIUmNYSEpjWEc1ZEtpUXZPMXh1WEc1bWRXNWpkR2x2YmlCZmIzVjBaR1Z1ZENoemRISnBibWR6TENCMllXeDFaWE1zSUc5MWRHUmxiblJKYm5OMFlXNWpaU3dnYjNCMGFXOXVjeWtnZTF4dUlDQWdJQzh2SUVsbUlHWnBjbk4wSUdsdWRHVnljRzlzWVhSbFpDQjJZV3gxWlNCcGN5QmhJSEpsWm1WeVpXNWpaU0IwYnlCdmRYUmtaVzUwTEZ4dUlDQWdJQzh2SUdSbGRHVnliV2x1WlNCcGJtUmxiblJoZEdsdmJpQnNaWFpsYkNCbWNtOXRJSFJvWlNCcGJtUmxiblJoZEdsdmJpQnZaaUIwYUdVZ2FXNTBaWEp3YjJ4aGRHVmtJSFpoYkhWbExseHVJQ0FnSUd4bGRDQnBibVJsYm5SaGRHbHZia3hsZG1Wc0lEMGdNRHRjYmx4dUlDQWdJR052Ym5OMElHMWhkR05vSUQwZ2MzUnlhVzVuYzFzd1hTNXRZWFJqYUNoeVpVUmxkR1ZqZEVsdVpHVnVkR0YwYVc5dUtUdGNiaUFnSUNCcFppaHRZWFJqYUNrZ2UxeHVJQ0FnSUNBZ0lDQnBibVJsYm5SaGRHbHZia3hsZG1Wc0lEMGdiV0YwWTJoYk1sMHViR1Z1WjNSb08xeHVJQ0FnSUgxY2JseHVJQ0FnSUd4bGRDQnlaVk52ZFhKalpTQTlJR0FvWEZ4Y1hISmNYRnhjYm54Y1hGeGNjbnhjWEZ4Y2Jpa3VlekFzSkh0cGJtUmxiblJoZEdsdmJreGxkbVZzZlgxZ08xeHVJQ0FnSUdOdmJuTjBJSEpsVFdGMFkyaEpibVJsYm5RZ1BTQnVaWGNnVW1WblJYaHdLSEpsVTI5MWNtTmxMQ0FuWnljcE8xeHVYRzRnSUNBZ0x5OGdTWE1nWm1seWMzUWdhVzUwWlhKd2IyeGhkR1ZrSUhaaGJIVmxJR0VnY21WbVpYSmxibU5sSUhSdklHOTFkR1JsYm5Rc0lHRnNiMjVsSUc5dUlHbDBjeUJ2ZDI0Z2JHbHVaU3dnZDJsMGFHOTFkQ0JoYm5rZ2NISmxZMlZrYVc1bklHNXZiaTEzYUdsMFpYTndZV05sUDF4dUlDQWdJR2xtS0Z4dUlDQWdJQ0FnSUNBb2RtRnNkV1Z6V3pCZElEMDlQU0J2ZFhSa1pXNTBTVzV6ZEdGdVkyVWdmSHdnZG1Gc2RXVnpXekJkSUQwOVBTQnZkWFJrWlc1MEtTQW1KbHh1SUNBZ0lDQWdJQ0J5WlU5dWJIbFhhR2wwWlhOd1lXTmxWMmwwYUVGMFRHVmhjM1JQYm1WT1pYZHNhVzVsTG5SbGMzUW9jM1J5YVc1bmMxc3dYU2tnSmlaY2JpQWdJQ0FnSUNBZ2NtVlRkR0Z5ZEhOWGFYUm9UbVYzYkdsdVpVOXlTWE5GYlhCMGVTNTBaWE4wS0hOMGNtbHVaM05iTVYwcFhHNGdJQ0FnS1NCN1hHNGdJQ0FnSUNBZ0lIWmhiSFZsY3lBOUlIWmhiSFZsY3k1emJHbGpaU2d4S1R0Y2JpQWdJQ0FnSUNBZ2MzUnlhVzVuY3lBOUlITjBjbWx1WjNNdWMyeHBZMlVvTVNrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnWTI5dWMzUWdiQ0E5SUhOMGNtbHVaM011YkdWdVozUm9PMXh1SUNBZ0lHTnZibk4wSUc5MWRHUmxiblJsWkZOMGNtbHVaM01nUFNCemRISnBibWR6TG0xaGNDZ29kaXdnYVNrZ1BUNGdlMXh1SUNBZ0lDQWdJQ0F2THlCU1pXMXZkbVVnYkdWaFpHbHVaeUJwYm1SbGJuUmhkR2x2YmlCbWNtOXRJR0ZzYkNCc2FXNWxjMXh1SUNBZ0lDQWdJQ0IySUQwZ2RpNXlaWEJzWVdObEtISmxUV0YwWTJoSmJtUmxiblFzSUNja01TY3BPMXh1SUNBZ0lDQWdJQ0F2THlCVWNtbHRJR0VnYkdWaFpHbHVaeUJ1Wlhkc2FXNWxJR1p5YjIwZ2RHaGxJR1pwY25OMElITjBjbWx1WjF4dUlDQWdJQ0FnSUNCcFppaHBJRDA5UFNBd0lDWW1JRzl3ZEdsdmJuTXVkSEpwYlV4bFlXUnBibWRPWlhkc2FXNWxLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJJRDBnZGk1eVpYQnNZV05sS0hKbFRHVmhaR2x1WjA1bGQyeHBibVVzSUNjbktUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0F2THlCVWNtbHRJR0VnZEhKaGFXeHBibWNnYm1WM2JHbHVaU0JtY205dElIUm9aU0JzWVhOMElITjBjbWx1WjF4dUlDQWdJQ0FnSUNCcFppaHBJRDA5UFNCc0lDMGdNU0FtSmlCdmNIUnBiMjV6TG5SeWFXMVVjbUZwYkdsdVowNWxkMnhwYm1VcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhZZ1BTQjJMbkpsY0d4aFkyVW9jbVZVY21GcGJHbHVaMDVsZDJ4cGJtVXNJQ2NuS1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2RqdGNiaUFnSUNCOUtUdGNiaUFnSUNCY2JpQWdJQ0J5WlhSMWNtNGdZMjl1WTJGMFUzUnlhVzVuYzBGdVpGWmhiSFZsY3lodmRYUmtaVzUwWldSVGRISnBibWR6TENCMllXeDFaWE1wTzF4dWZWeHVYRzVtZFc1amRHbHZiaUJqYjI1allYUlRkSEpwYm1kelFXNWtWbUZzZFdWektITjBjbWx1WjNNc0lIWmhiSFZsY3lrZ2UxeHVJQ0FnSUd4bGRDQnlaWFFnUFNBbkp6dGNiaUFnSUNCbWIzSW9iR1YwSUdrZ1BTQXdMQ0JzSUQwZ2MzUnlhVzVuY3k1c1pXNW5kR2c3SUdrZ1BDQnNPeUJwS3lzcElIdGNiaUFnSUNBZ0lDQWdjbVYwSUNzOUlITjBjbWx1WjNOYmFWMDdYRzRnSUNBZ0lDQWdJR2xtS0drZ1BDQnNJQzBnTVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMElDczlJSFpoYkhWbGMxdHBYVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z2NtVjBPMXh1ZlZ4dVhHNHZLaXBjYmlBcUlFbDBJR2x6SUdGemMzVnRaV1FnZEdoaGRDQnZjSFJ6SUhkcGJHd2dibTkwSUdOb1lXNW5aUzRnSUVsbUlIUm9hWE1nYVhNZ1lTQndjbTlpYkdWdExDQmpiRzl1WlNCNWIzVnlJRzl3ZEdsdmJuTWdiMkpxWldOMElHRnVaQ0J3WVhOeklIUm9aU0JqYkc5dVpTQjBiMXh1SUNvZ2JXRnJaVWx1YzNSaGJtTmxYRzRnS2lCQWNHRnlZVzBnYjNCMGFXOXVjMXh1SUNvZ1FISmxkSFZ5YmlCN2IzVjBaR1Z1ZEgxY2JpQXFMMXh1Wm5WdVkzUnBiMjRnWTNKbFlYUmxTVzV6ZEdGdVkyVW9iM0IwYVc5dWN5a2dlMXh1SUNBZ0lHTnZibk4wSUdOaFkyaGxJRDBnWTNKbFlYUmxWMlZoYTAxaGNDZ3BPMXh1WEc0Z0lDQWdZMjl1YzNRZ2NtVjBJRDBnWm5WdVkzUnBiMjRnYjNWMFpHVnVkQ2h6ZEhKcGJtZHpUM0pQY0hScGIyNXpMQ0F1TGk1MllXeDFaWE1wSUh0Y2JpQWdJQ0FnSUNBZ2FXWW9hR0Z6S0hOMGNtbHVaM05QY2s5d2RHbHZibk1zSUNkeVlYY25LU0FtSmlCb1lYTW9jM1J5YVc1bmMwOXlUM0IwYVc5dWN5d2dKMnhsYm1kMGFDY3BLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJVVDBSUElFVnVZV0pzWlNCelpXMXBMV05oWTJocGJtY3NJR0p2ZEdnZ2QyaGxiaUIwYUdVZ1ptbHljM1FnYVc1MFpYSndiMnhoZEdWa0lIWmhiSFZsSUdseklHQnZkWFJrWlc1MFlDd2dZVzVrSUhkb1pXNGdhWFFuY3lCdWIzUmNiaUFnSUNBZ0lDQWdJQ0FnSUdOdmJuTjBJSE4wY21sdVozTWdQU0J6ZEhKcGJtZHpUM0pQY0hScGIyNXpPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdVMlZ5ZG1VZ1puSnZiU0JqWVdOb1pTQnZibXg1SUdsbUlIUm9aWEpsSUdGeVpTQnVieUJwYm5SbGNuQnZiR0YwWldRZ2RtRnNkV1Z6WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaWgyWVd4MVpYTXViR1Z1WjNSb0lEMDlQU0F3SUNZbUlHTmhZMmhsTG1oaGN5aHpkSEpwYm1kektTa2djbVYwZFhKdUlHTmhZMmhsTG1kbGRDaHpkSEpwYm1kektUdGNibHh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdVR1Z5Wm05eWJTQnZkWFJrWlc1MFlYUnBiMjVjYmlBZ0lDQWdJQ0FnSUNBZ0lHTnZibk4wSUhKbGJtUmxjbVZrSUQwZ1gyOTFkR1JsYm5Rb2MzUnlhVzVuY3l3Z2RtRnNkV1Z6TENCeVpYUXNJRzl3ZEdsdmJuTXBPMXh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJUZEc5eVpTQnBiblJ2SUhSb1pTQmpZV05vWlNCdmJteDVJR2xtSUhSb1pYSmxJR0Z5WlNCdWJ5QnBiblJsY25CdmJHRjBaV1FnZG1Gc2RXVnpYRzRnSUNBZ0lDQWdJQ0FnSUNCMllXeDFaWE11YkdWdVozUm9JRDA5UFNBd0lDWW1JR05oWTJobExuTmxkQ2h6ZEhKcGJtZHpMQ0J5Wlc1a1pYSmxaQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2NtVnVaR1Z5WldRN1hHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCRGNtVmhkR1VnWVc1a0lISmxkSFZ5YmlCaElHNWxkeUJwYm5OMFlXNWpaU0J2WmlCdmRYUmtaVzUwSUhkcGRHZ2dkR2hsSUdkcGRtVnVJRzl3ZEdsdmJuTmNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJqY21WaGRHVkpibk4wWVc1alpTaGxlSFJsYm1Rb1pYaDBaVzVrS0h0OUxDQnZjSFJwYjI1ektTd2djM1J5YVc1bmMwOXlUM0IwYVc5dWN5QjhmQ0I3ZlNrcE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ2ZUdGNibHh1SUNBZ0lISmxkSFZ5YmlCeVpYUTdYRzU5WEc1Y2JtTnZibk4wSUc5MWRHUmxiblFnUFNCamNtVmhkR1ZKYm5OMFlXNWpaU2g3WEc0Z0lDQWdkSEpwYlV4bFlXUnBibWRPWlhkc2FXNWxPaUIwY25WbExGeHVJQ0FnSUhSeWFXMVVjbUZwYkdsdVowNWxkMnhwYm1VNklIUnlkV1ZjYm4wcE8xeHVYRzR2THlCRlV6WmNibTkxZEdSbGJuUXVaR1ZtWVhWc2RDQTlJRzkxZEdSbGJuUTdYRzV2ZFhSa1pXNTBMbTkxZEdSbGJuUWdQU0J2ZFhSa1pXNTBPMXh1YjNWMFpHVnVkQzVmWDJWelRXOWtkV3hsSUQwZ2RISjFaVHRjYm1WNGNHOXlkSE11WkdWbVlYVnNkQ0E5SUc5MWRHUmxiblE3WEc1bGVIQnZjblJ6TG05MWRHUmxiblFnUFNCdmRYUmtaVzUwTzF4dVpYaHdiM0owY3k1ZlgyVnpUVzlrZFd4bElEMGdkSEoxWlR0Y2JtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ2IzVjBaR1Z1ZER0Y2JpSmRmUT09XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L291dGRlbnQvbGliL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAxNDhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 149 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });exports.TopicCollection = exports.Topic = exports.SynapseCollection = exports.Synapse = exports.MetacodeCollection = exports.Metacode = exports.MessageCollection = exports.Message = exports.MappingCollection = exports.Mapping = exports.MapperCollection = exports.Mapper = exports.MapCollection = exports.Map = undefined;var _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _Engine = __webpack_require__(150);var _Engine2 = _interopRequireDefault(_Engine);\nvar _Filter = __webpack_require__(356);var _Filter2 = _interopRequireDefault(_Filter);\nvar _Map = __webpack_require__(369);\n\nvar _Map2 = __webpack_require__(370);var _Map3 = _interopRequireDefault(_Map2);\nvar _MapCollection = __webpack_require__(609);var _MapCollection2 = _interopRequireDefault(_MapCollection);\nvar _Message = __webpack_require__(610);var _Message2 = _interopRequireDefault(_Message);\nvar _MessageCollection = __webpack_require__(611);var _MessageCollection2 = _interopRequireDefault(_MessageCollection);\nvar _Mapper = __webpack_require__(612);var _Mapper2 = _interopRequireDefault(_Mapper);\nvar _MapperCollection = __webpack_require__(613);var _MapperCollection2 = _interopRequireDefault(_MapperCollection);\nvar _Metacode = __webpack_require__(614);var _Metacode2 = _interopRequireDefault(_Metacode);\nvar _MetacodeCollection = __webpack_require__(615);var _MetacodeCollection2 = _interopRequireDefault(_MetacodeCollection);\nvar _Topic = __webpack_require__(616);var _Topic2 = _interopRequireDefault(_Topic);\nvar _TopicCollection = __webpack_require__(617);var _TopicCollection2 = _interopRequireDefault(_TopicCollection);\nvar _Synapse = __webpack_require__(618);var _Synapse2 = _interopRequireDefault(_Synapse);\nvar _SynapseCollection = __webpack_require__(619);var _SynapseCollection2 = _interopRequireDefault(_SynapseCollection);\nvar _Mapping = __webpack_require__(620);var _Mapping2 = _interopRequireDefault(_Mapping);\nvar _MappingCollection = __webpack_require__(621);var _MappingCollection2 = _interopRequireDefault(_MappingCollection);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}\n\nvar DataModel = {\n  Map: _Map3.default,\n  MapCollection: _MapCollection2.default,\n  Message: _Message2.default,\n  MessageCollection: _MessageCollection2.default,\n  Mapper: _Mapper2.default,\n  MapperCollection: _MapperCollection2.default,\n  Metacode: _Metacode2.default,\n  MetacodeCollection: _MetacodeCollection2.default,\n  Topic: _Topic2.default,\n  TopicCollection: _TopicCollection2.default,\n  Synapse: _Synapse2.default,\n  SynapseCollection: _SynapseCollection2.default,\n  Mapping: _Mapping2.default,\n  MappingCollection: _MappingCollection2.default,\n\n  Collaborators: new _MapperCollection2.default(),\n  Creators: new _MapperCollection2.default(),\n  Mappers: new _MapperCollection2.default(),\n  Mappings: new _MappingCollection2.default(),\n  Maps: {\n    Mine: [],\n    Shared: [],\n    Starred: [],\n    Mapper: {\n      models: [],\n      mapperId: null },\n\n    Featured: [],\n    Active: [] },\n\n  Messages: [],\n  Metacodes: new _MetacodeCollection2.default(),\n  Stars: [],\n  Synapses: new _SynapseCollection2.default(),\n  Topics: new _TopicCollection2.default(),\n\n  init: function init(serverData) {\n    var self = DataModel;\n\n    // workaround circular import problem\n    if (!self.MapCollection.model) self.MapCollection.model = _Map3.default;\n\n    self.synapseIconUrl = serverData['synapse16.png'];\n\n    if (serverData.ActiveMap) _Active2.default.Map = new _Map3.default(serverData.ActiveMap);\n    if (serverData.ActiveMapper) _Active2.default.Mapper = new _Mapper2.default(serverData.ActiveMapper);\n    if (serverData.ActiveTopic) _Active2.default.Topic = new _Topic2.default(serverData.ActiveTopic);\n\n    if (serverData.Collaborators) self.Collaborators = new _MapperCollection2.default(serverData.Collaborators);\n    if (serverData.Creators) self.Creators = new _MapperCollection2.default(serverData.Creators);\n    if (serverData.Mappers) self.Mappers = new _MapperCollection2.default(serverData.Mappers);\n    if (serverData.Mappings) self.Mappings = new _MappingCollection2.default(serverData.Mappings);\n    if (serverData.Messages) self.Messages = serverData.Messages;\n    if (serverData.Metacodes) self.Metacodes = new _MetacodeCollection2.default(serverData.Metacodes);\n    if (serverData.Stars) self.Stars = serverData.Stars;\n    if (serverData.Synapses) self.Synapses = new _SynapseCollection2.default(serverData.Synapses);\n    if (serverData.Topics) self.Topics = new _TopicCollection2.default(serverData.Topics);\n\n    // initialize global backbone models and collections\n    var myCollection = serverData.Mine ? serverData.Mine : [];\n    var sharedCollection = serverData.Shared ? serverData.Shared : [];\n    var starredCollection = serverData.Starred ? serverData.Starred : [];\n    var mapperCollection = serverData.Mapper ? serverData.Mapper : [];\n    var mapperOptionsObj = { id: 'mapper', sortBy: 'updated_at' };\n    if (serverData.Mapper && serverData.Mapper.mapperId) {\n      mapperCollection = serverData.Mapper.models;\n      mapperOptionsObj.mapperId = serverData.Mapper.mapperId;\n    }\n    var featuredCollection = serverData.Featured ? serverData.Featured : [];\n    var activeCollection = serverData.Active ? serverData.Active : [];\n\n    self.Maps.Mine = new _MapCollection2.default(myCollection, { id: 'mine', sortBy: 'updated_at' });\n    self.Maps.Shared = new _MapCollection2.default(sharedCollection, { id: 'shared', sortBy: 'updated_at' });\n    self.Maps.Starred = new _MapCollection2.default(starredCollection, { id: 'starred', sortBy: 'updated_at' });\n    // 'Mapper' refers to another mapper\n    self.Maps.Mapper = new _MapCollection2.default(mapperCollection, mapperOptionsObj);\n    self.Maps.Featured = new _MapCollection2.default(featuredCollection, { id: 'featured', sortBy: 'updated_at' });\n    self.Maps.Active = new _MapCollection2.default(activeCollection, { id: 'active', sortBy: 'updated_at' });\n\n    self.attachCollectionEvents();\n  },\n  attachCollectionEvents: function attachCollectionEvents() {\n    DataModel.Topics.on('add remove', function (topic) {\n      _Map.InfoBox.updateNumbers();\n      _Filter2.default.checkMetacodes();\n      _Filter2.default.checkMappers();\n    });\n    DataModel.Synapses.on('add remove', function (synapse) {\n      _Map.InfoBox.updateNumbers();\n      _Filter2.default.checkSynapses();\n      _Filter2.default.checkMappers();\n    });\n    DataModel.Mappings.on('add remove', function (mapping) {\n      _Map.InfoBox.updateNumbers();\n      _Filter2.default.checkSynapses();\n      _Filter2.default.checkMetacodes();\n      _Filter2.default.checkMappers();\n    });\n  } };\n\n\n// Note: Topics, Metacodes, Synapses, Mappers, Mappings, Collaborators, Creators are not exported\n// You can access them by importing DataModel\nexports.\nMap = _Map3.default;exports.MapCollection = _MapCollection2.default;exports.Mapper = _Mapper2.default;exports.MapperCollection = _MapperCollection2.default;exports.Mapping = _Mapping2.default;exports.MappingCollection = _MappingCollection2.default;exports.Message = _Message2.default;exports.MessageCollection = _MessageCollection2.default;exports.Metacode = _Metacode2.default;exports.MetacodeCollection = _MetacodeCollection2.default;exports.Synapse = _Synapse2.default;exports.SynapseCollection = _SynapseCollection2.default;exports.Topic = _Topic2.default;exports.TopicCollection = _TopicCollection2.default;exports.default =\n\nDataModel;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ5LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvRGF0YU1vZGVsL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBBY3RpdmUgZnJvbSAnLi4vQWN0aXZlJ1xuaW1wb3J0IEVuZ2luZSBmcm9tICcuLi9FbmdpbmUnXG5pbXBvcnQgRmlsdGVyIGZyb20gJy4uL0ZpbHRlcidcbmltcG9ydCB7IEluZm9Cb3ggfSBmcm9tICcuLi9NYXAnXG5cbmltcG9ydCBNYXAgZnJvbSAnLi9NYXAnXG5pbXBvcnQgTWFwQ29sbGVjdGlvbiBmcm9tICcuL01hcENvbGxlY3Rpb24nXG5pbXBvcnQgTWVzc2FnZSBmcm9tICcuL01lc3NhZ2UnXG5pbXBvcnQgTWVzc2FnZUNvbGxlY3Rpb24gZnJvbSAnLi9NZXNzYWdlQ29sbGVjdGlvbidcbmltcG9ydCBNYXBwZXIgZnJvbSAnLi9NYXBwZXInXG5pbXBvcnQgTWFwcGVyQ29sbGVjdGlvbiBmcm9tICcuL01hcHBlckNvbGxlY3Rpb24nXG5pbXBvcnQgTWV0YWNvZGUgZnJvbSAnLi9NZXRhY29kZSdcbmltcG9ydCBNZXRhY29kZUNvbGxlY3Rpb24gZnJvbSAnLi9NZXRhY29kZUNvbGxlY3Rpb24nXG5pbXBvcnQgVG9waWMgZnJvbSAnLi9Ub3BpYydcbmltcG9ydCBUb3BpY0NvbGxlY3Rpb24gZnJvbSAnLi9Ub3BpY0NvbGxlY3Rpb24nXG5pbXBvcnQgU3luYXBzZSBmcm9tICcuL1N5bmFwc2UnXG5pbXBvcnQgU3luYXBzZUNvbGxlY3Rpb24gZnJvbSAnLi9TeW5hcHNlQ29sbGVjdGlvbidcbmltcG9ydCBNYXBwaW5nIGZyb20gJy4vTWFwcGluZydcbmltcG9ydCBNYXBwaW5nQ29sbGVjdGlvbiBmcm9tICcuL01hcHBpbmdDb2xsZWN0aW9uJ1xuXG5jb25zdCBEYXRhTW9kZWwgPSB7XG4gIE1hcDogTWFwLFxuICBNYXBDb2xsZWN0aW9uOiBNYXBDb2xsZWN0aW9uLFxuICBNZXNzYWdlOiBNZXNzYWdlLFxuICBNZXNzYWdlQ29sbGVjdGlvbjogTWVzc2FnZUNvbGxlY3Rpb24sXG4gIE1hcHBlcjogTWFwcGVyLFxuICBNYXBwZXJDb2xsZWN0aW9uOiBNYXBwZXJDb2xsZWN0aW9uLFxuICBNZXRhY29kZTogTWV0YWNvZGUsXG4gIE1ldGFjb2RlQ29sbGVjdGlvbjogTWV0YWNvZGVDb2xsZWN0aW9uLFxuICBUb3BpYzogVG9waWMsXG4gIFRvcGljQ29sbGVjdGlvbjogVG9waWNDb2xsZWN0aW9uLFxuICBTeW5hcHNlOiBTeW5hcHNlLFxuICBTeW5hcHNlQ29sbGVjdGlvbjogU3luYXBzZUNvbGxlY3Rpb24sXG4gIE1hcHBpbmc6IE1hcHBpbmcsXG4gIE1hcHBpbmdDb2xsZWN0aW9uOiBNYXBwaW5nQ29sbGVjdGlvbixcblxuICBDb2xsYWJvcmF0b3JzOiBuZXcgTWFwcGVyQ29sbGVjdGlvbigpLFxuICBDcmVhdG9yczogbmV3IE1hcHBlckNvbGxlY3Rpb24oKSxcbiAgTWFwcGVyczogbmV3IE1hcHBlckNvbGxlY3Rpb24oKSxcbiAgTWFwcGluZ3M6IG5ldyBNYXBwaW5nQ29sbGVjdGlvbigpLFxuICBNYXBzOiB7XG4gICAgTWluZTogW10sXG4gICAgU2hhcmVkOiBbXSxcbiAgICBTdGFycmVkOiBbXSxcbiAgICBNYXBwZXI6IHtcbiAgICAgIG1vZGVsczogW10sXG4gICAgICBtYXBwZXJJZDogbnVsbFxuICAgIH0sXG4gICAgRmVhdHVyZWQ6IFtdLFxuICAgIEFjdGl2ZTogW11cbiAgfSxcbiAgTWVzc2FnZXM6IFtdLFxuICBNZXRhY29kZXM6IG5ldyBNZXRhY29kZUNvbGxlY3Rpb24oKSxcbiAgU3RhcnM6IFtdLFxuICBTeW5hcHNlczogbmV3IFN5bmFwc2VDb2xsZWN0aW9uKCksXG4gIFRvcGljczogbmV3IFRvcGljQ29sbGVjdGlvbigpLFxuXG4gIGluaXQ6IGZ1bmN0aW9uKHNlcnZlckRhdGEpIHtcbiAgICB2YXIgc2VsZiA9IERhdGFNb2RlbFxuXG4gICAgLy8gd29ya2Fyb3VuZCBjaXJjdWxhciBpbXBvcnQgcHJvYmxlbVxuICAgIGlmICghc2VsZi5NYXBDb2xsZWN0aW9uLm1vZGVsKSBzZWxmLk1hcENvbGxlY3Rpb24ubW9kZWwgPSBNYXBcblxuICAgIHNlbGYuc3luYXBzZUljb25VcmwgPSBzZXJ2ZXJEYXRhWydzeW5hcHNlMTYucG5nJ11cblxuICAgIGlmIChzZXJ2ZXJEYXRhLkFjdGl2ZU1hcCkgQWN0aXZlLk1hcCA9IG5ldyBNYXAoc2VydmVyRGF0YS5BY3RpdmVNYXApXG4gICAgaWYgKHNlcnZlckRhdGEuQWN0aXZlTWFwcGVyKSBBY3RpdmUuTWFwcGVyID0gbmV3IE1hcHBlcihzZXJ2ZXJEYXRhLkFjdGl2ZU1hcHBlcilcbiAgICBpZiAoc2VydmVyRGF0YS5BY3RpdmVUb3BpYykgQWN0aXZlLlRvcGljID0gbmV3IFRvcGljKHNlcnZlckRhdGEuQWN0aXZlVG9waWMpXG5cbiAgICBpZiAoc2VydmVyRGF0YS5Db2xsYWJvcmF0b3JzKSBzZWxmLkNvbGxhYm9yYXRvcnMgPSBuZXcgTWFwcGVyQ29sbGVjdGlvbihzZXJ2ZXJEYXRhLkNvbGxhYm9yYXRvcnMpXG4gICAgaWYgKHNlcnZlckRhdGEuQ3JlYXRvcnMpIHNlbGYuQ3JlYXRvcnMgPSBuZXcgTWFwcGVyQ29sbGVjdGlvbihzZXJ2ZXJEYXRhLkNyZWF0b3JzKVxuICAgIGlmIChzZXJ2ZXJEYXRhLk1hcHBlcnMpIHNlbGYuTWFwcGVycyA9IG5ldyBNYXBwZXJDb2xsZWN0aW9uKHNlcnZlckRhdGEuTWFwcGVycylcbiAgICBpZiAoc2VydmVyRGF0YS5NYXBwaW5ncykgc2VsZi5NYXBwaW5ncyA9IG5ldyBNYXBwaW5nQ29sbGVjdGlvbihzZXJ2ZXJEYXRhLk1hcHBpbmdzKVxuICAgIGlmIChzZXJ2ZXJEYXRhLk1lc3NhZ2VzKSBzZWxmLk1lc3NhZ2VzID0gc2VydmVyRGF0YS5NZXNzYWdlc1xuICAgIGlmIChzZXJ2ZXJEYXRhLk1ldGFjb2Rlcykgc2VsZi5NZXRhY29kZXMgPSBuZXcgTWV0YWNvZGVDb2xsZWN0aW9uKHNlcnZlckRhdGEuTWV0YWNvZGVzKVxuICAgIGlmIChzZXJ2ZXJEYXRhLlN0YXJzKSBzZWxmLlN0YXJzID0gc2VydmVyRGF0YS5TdGFyc1xuICAgIGlmIChzZXJ2ZXJEYXRhLlN5bmFwc2VzKSBzZWxmLlN5bmFwc2VzID0gbmV3IFN5bmFwc2VDb2xsZWN0aW9uKHNlcnZlckRhdGEuU3luYXBzZXMpXG4gICAgaWYgKHNlcnZlckRhdGEuVG9waWNzKSBzZWxmLlRvcGljcyA9IG5ldyBUb3BpY0NvbGxlY3Rpb24oc2VydmVyRGF0YS5Ub3BpY3MpXG5cbiAgICAvLyBpbml0aWFsaXplIGdsb2JhbCBiYWNrYm9uZSBtb2RlbHMgYW5kIGNvbGxlY3Rpb25zXG4gICAgdmFyIG15Q29sbGVjdGlvbiA9IHNlcnZlckRhdGEuTWluZSA/IHNlcnZlckRhdGEuTWluZSA6IFtdXG4gICAgdmFyIHNoYXJlZENvbGxlY3Rpb24gPSBzZXJ2ZXJEYXRhLlNoYXJlZCA/IHNlcnZlckRhdGEuU2hhcmVkIDogW11cbiAgICB2YXIgc3RhcnJlZENvbGxlY3Rpb24gPSBzZXJ2ZXJEYXRhLlN0YXJyZWQgPyBzZXJ2ZXJEYXRhLlN0YXJyZWQgOiBbXVxuICAgIHZhciBtYXBwZXJDb2xsZWN0aW9uID0gc2VydmVyRGF0YS5NYXBwZXIgPyBzZXJ2ZXJEYXRhLk1hcHBlciA6IFtdXG4gICAgdmFyIG1hcHBlck9wdGlvbnNPYmogPSB7IGlkOiAnbWFwcGVyJywgc29ydEJ5OiAndXBkYXRlZF9hdCcgfVxuICAgIGlmIChzZXJ2ZXJEYXRhLk1hcHBlciAmJiBzZXJ2ZXJEYXRhLk1hcHBlci5tYXBwZXJJZCkge1xuICAgICAgbWFwcGVyQ29sbGVjdGlvbiA9IHNlcnZlckRhdGEuTWFwcGVyLm1vZGVsc1xuICAgICAgbWFwcGVyT3B0aW9uc09iai5tYXBwZXJJZCA9IHNlcnZlckRhdGEuTWFwcGVyLm1hcHBlcklkXG4gICAgfVxuICAgIHZhciBmZWF0dXJlZENvbGxlY3Rpb24gPSBzZXJ2ZXJEYXRhLkZlYXR1cmVkID8gc2VydmVyRGF0YS5GZWF0dXJlZCA6IFtdXG4gICAgdmFyIGFjdGl2ZUNvbGxlY3Rpb24gPSBzZXJ2ZXJEYXRhLkFjdGl2ZSA/IHNlcnZlckRhdGEuQWN0aXZlIDogW11cblxuICAgIHNlbGYuTWFwcy5NaW5lID0gbmV3IE1hcENvbGxlY3Rpb24obXlDb2xsZWN0aW9uLCB7IGlkOiAnbWluZScsIHNvcnRCeTogJ3VwZGF0ZWRfYXQnIH0pXG4gICAgc2VsZi5NYXBzLlNoYXJlZCA9IG5ldyBNYXBDb2xsZWN0aW9uKHNoYXJlZENvbGxlY3Rpb24sIHsgaWQ6ICdzaGFyZWQnLCBzb3J0Qnk6ICd1cGRhdGVkX2F0JyB9KVxuICAgIHNlbGYuTWFwcy5TdGFycmVkID0gbmV3IE1hcENvbGxlY3Rpb24oc3RhcnJlZENvbGxlY3Rpb24sIHsgaWQ6ICdzdGFycmVkJywgc29ydEJ5OiAndXBkYXRlZF9hdCcgfSlcbiAgICAvLyAnTWFwcGVyJyByZWZlcnMgdG8gYW5vdGhlciBtYXBwZXJcbiAgICBzZWxmLk1hcHMuTWFwcGVyID0gbmV3IE1hcENvbGxlY3Rpb24obWFwcGVyQ29sbGVjdGlvbiwgbWFwcGVyT3B0aW9uc09iailcbiAgICBzZWxmLk1hcHMuRmVhdHVyZWQgPSBuZXcgTWFwQ29sbGVjdGlvbihmZWF0dXJlZENvbGxlY3Rpb24sIHsgaWQ6ICdmZWF0dXJlZCcsIHNvcnRCeTogJ3VwZGF0ZWRfYXQnIH0pXG4gICAgc2VsZi5NYXBzLkFjdGl2ZSA9IG5ldyBNYXBDb2xsZWN0aW9uKGFjdGl2ZUNvbGxlY3Rpb24sIHsgaWQ6ICdhY3RpdmUnLCBzb3J0Qnk6ICd1cGRhdGVkX2F0JyB9KVxuXG4gICAgc2VsZi5hdHRhY2hDb2xsZWN0aW9uRXZlbnRzKClcbiAgfSxcbiAgYXR0YWNoQ29sbGVjdGlvbkV2ZW50czogZnVuY3Rpb24oKSB7XG4gICAgRGF0YU1vZGVsLlRvcGljcy5vbignYWRkIHJlbW92ZScsIGZ1bmN0aW9uKHRvcGljKSB7XG4gICAgICBJbmZvQm94LnVwZGF0ZU51bWJlcnMoKVxuICAgICAgRmlsdGVyLmNoZWNrTWV0YWNvZGVzKClcbiAgICAgIEZpbHRlci5jaGVja01hcHBlcnMoKVxuICAgIH0pXG4gICAgRGF0YU1vZGVsLlN5bmFwc2VzLm9uKCdhZGQgcmVtb3ZlJywgZnVuY3Rpb24oc3luYXBzZSkge1xuICAgICAgSW5mb0JveC51cGRhdGVOdW1iZXJzKClcbiAgICAgIEZpbHRlci5jaGVja1N5bmFwc2VzKClcbiAgICAgIEZpbHRlci5jaGVja01hcHBlcnMoKVxuICAgIH0pXG4gICAgRGF0YU1vZGVsLk1hcHBpbmdzLm9uKCdhZGQgcmVtb3ZlJywgZnVuY3Rpb24obWFwcGluZykge1xuICAgICAgSW5mb0JveC51cGRhdGVOdW1iZXJzKClcbiAgICAgIEZpbHRlci5jaGVja1N5bmFwc2VzKClcbiAgICAgIEZpbHRlci5jaGVja01ldGFjb2RlcygpXG4gICAgICBGaWx0ZXIuY2hlY2tNYXBwZXJzKClcbiAgICB9KVxuICB9XG59XG5cbi8vIE5vdGU6IFRvcGljcywgTWV0YWNvZGVzLCBTeW5hcHNlcywgTWFwcGVycywgTWFwcGluZ3MsIENvbGxhYm9yYXRvcnMsIENyZWF0b3JzIGFyZSBub3QgZXhwb3J0ZWRcbi8vIFlvdSBjYW4gYWNjZXNzIHRoZW0gYnkgaW1wb3J0aW5nIERhdGFNb2RlbFxuXG5leHBvcnQgeyBNYXAsIE1hcENvbGxlY3Rpb24sIE1hcHBlciwgTWFwcGVyQ29sbGVjdGlvbiwgTWFwcGluZywgTWFwcGluZ0NvbGxlY3Rpb24sIE1lc3NhZ2UsIE1lc3NhZ2VDb2xsZWN0aW9uLCBNZXRhY29kZSwgTWV0YWNvZGVDb2xsZWN0aW9uLCBTeW5hcHNlLCBTeW5hcHNlQ29sbGVjdGlvbiwgVG9waWMsIFRvcGljQ29sbGVjdGlvbiB9XG5cbmV4cG9ydCBkZWZhdWx0IERhdGFNb2RlbFxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9EYXRhTW9kZWwvaW5kZXguanMiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 150 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _values2 = __webpack_require__(151);var _values3 = _interopRequireDefault(_values2);var _sortBy2 = __webpack_require__(153);var _sortBy3 = _interopRequireDefault(_sortBy2);var _last2 = __webpack_require__(169);var _last3 = _interopRequireDefault(_last2);\n\n\nvar _JIT = __webpack_require__(170);var _JIT2 = _interopRequireDefault(_JIT);\nvar _ConvoAlgo = __webpack_require__(171);\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _Create = __webpack_require__(173);var _Create2 = _interopRequireDefault(_Create);\nvar _DataModel = __webpack_require__(149);var _DataModel2 = _interopRequireDefault(_DataModel);\nvar _Mouse = __webpack_require__(352);var _Mouse2 = _interopRequireDefault(_Mouse);\nvar _JIT3 = __webpack_require__(355);var _JIT4 = _interopRequireDefault(_JIT3);\nvar _Visualize = __webpack_require__(561);var _Visualize2 = _interopRequireDefault(_Visualize);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} //import Matter, { Vector, Sleeping, World, Constraint, Composite, Runner, Common, Body, Bodies, Events } from 'matter-js'\n\nvar Engine = {\n  init: function init(serverData) {\n\n  },\n  run: function run(init) {\n    if (init) {\n      if (_Active2.default.Mapper && Object.keys(_Visualize2.default.mGraph.graph.nodes).length) {\n        Engine.setFocusNode(Engine.findFocusNode(_Visualize2.default.mGraph.graph.nodes), true);\n      }\n    }\n  },\n  endActiveMap: function endActiveMap() {\n\n  },\n  runLayout: function runLayout(init) {\n    _Visualize2.default.mGraph.busy = true;\n    var synapses = _DataModel2.default.Synapses.map(function (s) {return s.attributes;});\n    var topics = _DataModel2.default.Topics.map(function (t) {return t.attributes;});\n    var focalNodeId = _Create2.default.newSynapse.focusNode.getData('topic').id;\n    var focalCoords = init ? { x: 0, y: 0 } : _Create2.default.newSynapse.focusNode.pos;\n    var layout = (0, _ConvoAlgo.getLayoutForData)(topics, synapses, focalNodeId, focalCoords);\n    _Visualize2.default.mGraph.graph.eachNode(function (n) {\n      var calculatedCoords = layout[n.getData('topic').id];\n      var endPos = new _JIT2.default.Complex(calculatedCoords.x, calculatedCoords.y);\n      n.setPos(endPos, 'end');\n    });\n    _Visualize2.default.mGraph.animate({\n      modes: ['linear'],\n      transition: _JIT2.default.Trans.Quart.easeOut,\n      duration: 500,\n      onComplete: function onComplete() {\n        _Visualize2.default.mGraph.busy = false;\n        _Create2.default.newSynapse.updateForm();\n        _Create2.default.newTopic.position();\n      } });\n\n  },\n  findFocusNode: function findFocusNode(nodes) {\n    return (0, _last3.default)((0, _sortBy3.default)((0, _values3.default)(nodes), function (n) {return new Date(n.getData('topic').get('created_at'));}));\n  },\n  setFocusNode: function setFocusNode(node, init, dontRun) {\n    if (!_Active2.default.Mapper) return;\n    _Create2.default.newSynapse.focusNode = node;\n    _Mouse2.default.focusNodeCoords = node.pos;\n    _Mouse2.default.newNodeCoords = {\n      x: node.pos.x + _ConvoAlgo.X_GRID_SPACE,\n      y: node.pos.y };\n\n    _Create2.default.newSynapse.updateForm();\n    _Create2.default.newTopic.position();\n    if (!dontRun) Engine.runLayout(init);\n  } };exports.default =\n\n\nEngine;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUwLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvRW5naW5lLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vaW1wb3J0IE1hdHRlciwgeyBWZWN0b3IsIFNsZWVwaW5nLCBXb3JsZCwgQ29uc3RyYWludCwgQ29tcG9zaXRlLCBSdW5uZXIsIENvbW1vbiwgQm9keSwgQm9kaWVzLCBFdmVudHMgfSBmcm9tICdtYXR0ZXItanMnXG5pbXBvcnQgeyBsYXN0LCBzb3J0QnksIHZhbHVlcyB9IGZyb20gJ2xvZGFzaCdcblxuaW1wb3J0ICRqaXQgZnJvbSAnLi4vcGF0Y2hlZC9KSVQnXG5pbXBvcnQgeyBnZXRMYXlvdXRGb3JEYXRhLCBYX0dSSURfU1BBQ0UgfSBmcm9tICcuLi9Db252b0FsZ28nXG5cbmltcG9ydCBBY3RpdmUgZnJvbSAnLi9BY3RpdmUnXG5pbXBvcnQgQ3JlYXRlIGZyb20gJy4vQ3JlYXRlJ1xuaW1wb3J0IERhdGFNb2RlbCBmcm9tICcuL0RhdGFNb2RlbCdcbmltcG9ydCBNb3VzZSBmcm9tICcuL01vdXNlJ1xuaW1wb3J0IEpJVCBmcm9tICcuL0pJVCdcbmltcG9ydCBWaXN1YWxpemUgZnJvbSAnLi9WaXN1YWxpemUnXG5cbmNvbnN0IEVuZ2luZSA9IHtcbiAgaW5pdDogKHNlcnZlckRhdGEpID0+IHtcbiAgICBcbiAgfSxcbiAgcnVuOiBpbml0ID0+IHtcbiAgICBpZiAoaW5pdCkge1xuICAgICAgaWYgKEFjdGl2ZS5NYXBwZXIgJiYgT2JqZWN0LmtleXMoVmlzdWFsaXplLm1HcmFwaC5ncmFwaC5ub2RlcykubGVuZ3RoKSB7XG4gICAgICAgIEVuZ2luZS5zZXRGb2N1c05vZGUoRW5naW5lLmZpbmRGb2N1c05vZGUoVmlzdWFsaXplLm1HcmFwaC5ncmFwaC5ub2RlcyksIHRydWUpXG4gICAgICB9XG4gICAgfVxuICB9LFxuICBlbmRBY3RpdmVNYXA6ICgpID0+IHtcbiAgICBcbiAgfSxcbiAgcnVuTGF5b3V0OiBpbml0ID0+IHtcbiAgICBWaXN1YWxpemUubUdyYXBoLmJ1c3kgPSB0cnVlXG4gICAgY29uc3Qgc3luYXBzZXMgPSBEYXRhTW9kZWwuU3luYXBzZXMubWFwKHMgPT4gcy5hdHRyaWJ1dGVzKVxuICAgIGNvbnN0IHRvcGljcyA9IERhdGFNb2RlbC5Ub3BpY3MubWFwKHQgPT4gdC5hdHRyaWJ1dGVzKVxuICAgIGNvbnN0IGZvY2FsTm9kZUlkID0gQ3JlYXRlLm5ld1N5bmFwc2UuZm9jdXNOb2RlLmdldERhdGEoJ3RvcGljJykuaWRcbiAgICBjb25zdCBmb2NhbENvb3JkcyA9IGluaXQgPyB7IHg6IDAsIHk6IDAgfSA6IENyZWF0ZS5uZXdTeW5hcHNlLmZvY3VzTm9kZS5wb3NcbiAgICBjb25zdCBsYXlvdXQgPSBnZXRMYXlvdXRGb3JEYXRhKHRvcGljcywgc3luYXBzZXMsIGZvY2FsTm9kZUlkLCBmb2NhbENvb3JkcylcbiAgICBWaXN1YWxpemUubUdyYXBoLmdyYXBoLmVhY2hOb2RlKG4gPT4ge1xuICAgICAgbGV0IGNhbGN1bGF0ZWRDb29yZHMgPSBsYXlvdXRbbi5nZXREYXRhKCd0b3BpYycpLmlkXVxuICAgICAgY29uc3QgZW5kUG9zID0gbmV3ICRqaXQuQ29tcGxleChjYWxjdWxhdGVkQ29vcmRzLngsIGNhbGN1bGF0ZWRDb29yZHMueSlcbiAgICAgIG4uc2V0UG9zKGVuZFBvcywgJ2VuZCcpXG4gICAgfSlcbiAgICBWaXN1YWxpemUubUdyYXBoLmFuaW1hdGUoe1xuICAgICAgbW9kZXM6IFsnbGluZWFyJ10sXG4gICAgICB0cmFuc2l0aW9uOiAkaml0LlRyYW5zLlF1YXJ0LmVhc2VPdXQsXG4gICAgICBkdXJhdGlvbjogNTAwLFxuICAgICAgb25Db21wbGV0ZTogKCkgPT4ge1xuICAgICAgICBWaXN1YWxpemUubUdyYXBoLmJ1c3kgPSBmYWxzZVxuICAgICAgICBDcmVhdGUubmV3U3luYXBzZS51cGRhdGVGb3JtKClcbiAgICAgICAgQ3JlYXRlLm5ld1RvcGljLnBvc2l0aW9uKClcbiAgICAgIH1cbiAgICB9KVxuICB9LFxuICBmaW5kRm9jdXNOb2RlOiBub2RlcyA9PiB7XG4gICAgcmV0dXJuIGxhc3Qoc29ydEJ5KHZhbHVlcyhub2RlcyksIG4gPT4gbmV3IERhdGUobi5nZXREYXRhKCd0b3BpYycpLmdldCgnY3JlYXRlZF9hdCcpKSkpXG4gIH0sXG4gIHNldEZvY3VzTm9kZTogKG5vZGUsIGluaXQsIGRvbnRSdW4pID0+IHtcbiAgICBpZiAoIUFjdGl2ZS5NYXBwZXIpIHJldHVyblxuICAgIENyZWF0ZS5uZXdTeW5hcHNlLmZvY3VzTm9kZSA9IG5vZGVcbiAgICBNb3VzZS5mb2N1c05vZGVDb29yZHMgPSBub2RlLnBvc1xuICAgIE1vdXNlLm5ld05vZGVDb29yZHMgPSB7XG4gICAgICB4OiBub2RlLnBvcy54ICsgWF9HUklEX1NQQUNFLFxuICAgICAgeTogbm9kZS5wb3MueVxuICAgIH1cbiAgICBDcmVhdGUubmV3U3luYXBzZS51cGRhdGVGb3JtKClcbiAgICBDcmVhdGUubmV3VG9waWMucG9zaXRpb24oKVxuICAgIGlmICghZG9udFJ1bikgRW5naW5lLnJ1bkxheW91dChpbml0KVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVuZ2luZVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9FbmdpbmUuanMiXSwibWFwcGluZ3MiOiI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 151 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseValues = __webpack_require__(152),\n    keys = __webpack_require__(90);\n\n/**\n * Creates an array of the own enumerable string keyed property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\nfunction values(object) {\n  return object == null ? [] : baseValues(object, keys(object));\n}\n\nmodule.exports = values;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvdmFsdWVzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlVmFsdWVzID0gcmVxdWlyZSgnLi9fYmFzZVZhbHVlcycpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLnZhbHVlcyhuZXcgRm9vKTtcbiAqIC8vID0+IFsxLCAyXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8udmFsdWVzKCdoaScpO1xuICogLy8gPT4gWydoJywgJ2knXVxuICovXG5mdW5jdGlvbiB2YWx1ZXMob2JqZWN0KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmFsdWVzO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC92YWx1ZXMuanNcbi8vIG1vZHVsZSBpZCA9IDE1MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 152 */
/***/ function(module, exports, __webpack_require__) {

    eval("var arrayMap = __webpack_require__(127);\n\n/**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\nfunction baseValues(object, props) {\n  return arrayMap(props, function(key) {\n    return object[key];\n  });\n}\n\nmodule.exports = baseValues;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VWYWx1ZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy52YWx1ZXNgIGFuZCBgXy52YWx1ZXNJbmAgd2hpY2ggY3JlYXRlcyBhblxuICogYXJyYXkgb2YgYG9iamVjdGAgcHJvcGVydHkgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3BlcnR5IG5hbWVzXG4gKiBvZiBgcHJvcHNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VWYWx1ZXMob2JqZWN0LCBwcm9wcykge1xuICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBvYmplY3Rba2V5XTtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVZhbHVlcztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2Jhc2VWYWx1ZXMuanNcbi8vIG1vZHVsZSBpZCA9IDE1MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 153 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseFlatten = __webpack_require__(154),\n    baseOrderBy = __webpack_require__(156),\n    baseRest = __webpack_require__(160),\n    isIterateeCall = __webpack_require__(168);\n\n/**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n *  The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n *   { 'user': 'fred',   'age': 48 },\n *   { 'user': 'barney', 'age': 36 },\n *   { 'user': 'fred',   'age': 40 },\n *   { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\n */\nvar sortBy = baseRest(function(collection, iteratees) {\n  if (collection == null) {\n    return [];\n  }\n  var length = iteratees.length;\n  if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n    iteratees = [];\n  } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n    iteratees = [iteratees[0]];\n  }\n  return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n});\n\nmodule.exports = sortBy;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvc29ydEJ5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlRmxhdHRlbiA9IHJlcXVpcmUoJy4vX2Jhc2VGbGF0dGVuJyksXG4gICAgYmFzZU9yZGVyQnkgPSByZXF1aXJlKCcuL19iYXNlT3JkZXJCeScpLFxuICAgIGJhc2VSZXN0ID0gcmVxdWlyZSgnLi9fYmFzZVJlc3QnKSxcbiAgICBpc0l0ZXJhdGVlQ2FsbCA9IHJlcXVpcmUoJy4vX2lzSXRlcmF0ZWVDYWxsJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBlbGVtZW50cywgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciBieSB0aGUgcmVzdWx0cyBvZlxuICogcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uIHRocnUgZWFjaCBpdGVyYXRlZS4gVGhpcyBtZXRob2RcbiAqIHBlcmZvcm1zIGEgc3RhYmxlIHNvcnQsIHRoYXQgaXMsIGl0IHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgc29ydCBvcmRlciBvZlxuICogZXF1YWwgZWxlbWVudHMuIFRoZSBpdGVyYXRlZXMgYXJlIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAqICBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAgfSxcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzQgfVxuICogXTtcbiAqXG4gKiBfLnNvcnRCeSh1c2VycywgW2Z1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlcjsgfV0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCA0MF1dXG4gKlxuICogXy5zb3J0QnkodXNlcnMsIFsndXNlcicsICdhZ2UnXSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNF0sIFsnYmFybmV5JywgMzZdLCBbJ2ZyZWQnLCA0MF0sIFsnZnJlZCcsIDQ4XV1cbiAqL1xudmFyIHNvcnRCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlcykge1xuICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciBsZW5ndGggPSBpdGVyYXRlZXMubGVuZ3RoO1xuICBpZiAobGVuZ3RoID4gMSAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBpdGVyYXRlZXNbMF0sIGl0ZXJhdGVlc1sxXSkpIHtcbiAgICBpdGVyYXRlZXMgPSBbXTtcbiAgfSBlbHNlIGlmIChsZW5ndGggPiAyICYmIGlzSXRlcmF0ZWVDYWxsKGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdLCBpdGVyYXRlZXNbMl0pKSB7XG4gICAgaXRlcmF0ZWVzID0gW2l0ZXJhdGVlc1swXV07XG4gIH1cbiAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGJhc2VGbGF0dGVuKGl0ZXJhdGVlcywgMSksIFtdKTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNvcnRCeTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvc29ydEJ5LmpzXG4vLyBtb2R1bGUgaWQgPSAxNTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 154 */
/***/ function(module, exports, __webpack_require__) {

    eval("var arrayPush = __webpack_require__(85),\n    isFlattenable = __webpack_require__(155);\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n  var index = -1,\n      length = array.length;\n\n  predicate || (predicate = isFlattenable);\n  result || (result = []);\n\n  while (++index < length) {\n    var value = array[index];\n    if (depth > 0 && predicate(value)) {\n      if (depth > 1) {\n        // Recursively flatten arrays (susceptible to call stack limits).\n        baseFlatten(value, depth - 1, predicate, isStrict, result);\n      } else {\n        arrayPush(result, value);\n      }\n    } else if (!isStrict) {\n      result[result.length] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseFlatten;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGbGF0dGVuLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheVB1c2ggPSByZXF1aXJlKCcuL19hcnJheVB1c2gnKSxcbiAgICBpc0ZsYXR0ZW5hYmxlID0gcmVxdWlyZSgnLi9faXNGbGF0dGVuYWJsZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZsYXR0ZW5gIHdpdGggc3VwcG9ydCBmb3IgcmVzdHJpY3RpbmcgZmxhdHRlbmluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiBAcGFyYW0ge251bWJlcn0gZGVwdGggVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICogQHBhcmFtIHtib29sZWFufSBbcHJlZGljYXRlPWlzRmxhdHRlbmFibGVdIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N0cmljdF0gUmVzdHJpY3QgdG8gdmFsdWVzIHRoYXQgcGFzcyBgcHJlZGljYXRlYCBjaGVja3MuXG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0PVtdXSBUaGUgaW5pdGlhbCByZXN1bHQgdmFsdWUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHByZWRpY2F0ZSB8fCAocHJlZGljYXRlID0gaXNGbGF0dGVuYWJsZSk7XG4gIHJlc3VsdCB8fCAocmVzdWx0ID0gW10pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgIGlmIChkZXB0aCA+IDAgJiYgcHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgaWYgKGRlcHRoID4gMSkge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBmbGF0dGVuIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBiYXNlRmxhdHRlbih2YWx1ZSwgZGVwdGggLSAxLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJyYXlQdXNoKHJlc3VsdCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzU3RyaWN0KSB7XG4gICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRmxhdHRlbjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2Jhc2VGbGF0dGVuLmpzXG4vLyBtb2R1bGUgaWQgPSAxNTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 155 */
/***/ function(module, exports, __webpack_require__) {

    eval("var Symbol = __webpack_require__(21),\n    isArguments = __webpack_require__(93),\n    isArray = __webpack_require__(86);\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n  return isArray(value) || isArguments(value) ||\n    !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzRmxhdHRlbmFibGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ByZWFkYWJsZVN5bWJvbCA9IFN5bWJvbCA/IFN5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGUgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmbGF0dGVuYWJsZSBgYXJndW1lbnRzYCBvYmplY3Qgb3IgYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZmxhdHRlbmFibGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNGbGF0dGVuYWJsZSh2YWx1ZSkge1xuICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpIHx8XG4gICAgISEoc3ByZWFkYWJsZVN5bWJvbCAmJiB2YWx1ZSAmJiB2YWx1ZVtzcHJlYWRhYmxlU3ltYm9sXSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGbGF0dGVuYWJsZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2lzRmxhdHRlbmFibGUuanNcbi8vIG1vZHVsZSBpZCA9IDE1NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 156 */
/***/ function(module, exports, __webpack_require__) {

    eval("var arrayMap = __webpack_require__(127),\n    baseIteratee = __webpack_require__(30),\n    baseMap = __webpack_require__(147),\n    baseSortBy = __webpack_require__(157),\n    baseUnary = __webpack_require__(102),\n    compareMultiple = __webpack_require__(158),\n    identity = __webpack_require__(132);\n\n/**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\nfunction baseOrderBy(collection, iteratees, orders) {\n  var index = -1;\n  iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(baseIteratee));\n\n  var result = baseMap(collection, function(value, key, collection) {\n    var criteria = arrayMap(iteratees, function(iteratee) {\n      return iteratee(value);\n    });\n    return { 'criteria': criteria, 'index': ++index, 'value': value };\n  });\n\n  return baseSortBy(result, function(object, other) {\n    return compareMultiple(object, other, orders);\n  });\n}\n\nmodule.exports = baseOrderBy;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VPcmRlckJ5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheU1hcCA9IHJlcXVpcmUoJy4vX2FycmF5TWFwJyksXG4gICAgYmFzZUl0ZXJhdGVlID0gcmVxdWlyZSgnLi9fYmFzZUl0ZXJhdGVlJyksXG4gICAgYmFzZU1hcCA9IHJlcXVpcmUoJy4vX2Jhc2VNYXAnKSxcbiAgICBiYXNlU29ydEJ5ID0gcmVxdWlyZSgnLi9fYmFzZVNvcnRCeScpLFxuICAgIGJhc2VVbmFyeSA9IHJlcXVpcmUoJy4vX2Jhc2VVbmFyeScpLFxuICAgIGNvbXBhcmVNdWx0aXBsZSA9IHJlcXVpcmUoJy4vX2NvbXBhcmVNdWx0aXBsZScpLFxuICAgIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm9yZGVyQnlgIHdpdGhvdXQgcGFyYW0gZ3VhcmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9uW118T2JqZWN0W118c3RyaW5nW119IGl0ZXJhdGVlcyBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBvcmRlcnMgVGhlIHNvcnQgb3JkZXJzIG9mIGBpdGVyYXRlZXNgLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycykge1xuICB2YXIgaW5kZXggPSAtMTtcbiAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLmxlbmd0aCA/IGl0ZXJhdGVlcyA6IFtpZGVudGl0eV0sIGJhc2VVbmFyeShiYXNlSXRlcmF0ZWUpKTtcblxuICB2YXIgcmVzdWx0ID0gYmFzZU1hcChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgdmFyIGNyaXRlcmlhID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGl0ZXJhdGVlKHZhbHVlKTtcbiAgICB9KTtcbiAgICByZXR1cm4geyAnY3JpdGVyaWEnOiBjcml0ZXJpYSwgJ2luZGV4JzogKytpbmRleCwgJ3ZhbHVlJzogdmFsdWUgfTtcbiAgfSk7XG5cbiAgcmV0dXJuIGJhc2VTb3J0QnkocmVzdWx0LCBmdW5jdGlvbihvYmplY3QsIG90aGVyKSB7XG4gICAgcmV0dXJuIGNvbXBhcmVNdWx0aXBsZShvYmplY3QsIG90aGVyLCBvcmRlcnMpO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlT3JkZXJCeTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2Jhc2VPcmRlckJ5LmpzXG4vLyBtb2R1bGUgaWQgPSAxNTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 157 */
/***/ function(module, exports) {

    eval("/**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\nfunction baseSortBy(array, comparer) {\n  var length = array.length;\n\n  array.sort(comparer);\n  while (length--) {\n    array[length] = array[length].value;\n  }\n  return array;\n}\n\nmodule.exports = baseSortBy;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VTb3J0QnkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0QnlgIHdoaWNoIHVzZXMgYGNvbXBhcmVyYCB0byBkZWZpbmUgdGhlXG4gKiBzb3J0IG9yZGVyIG9mIGBhcnJheWAgYW5kIHJlcGxhY2VzIGNyaXRlcmlhIG9iamVjdHMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nXG4gKiB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzb3J0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyZXIgVGhlIGZ1bmN0aW9uIHRvIGRlZmluZSBzb3J0IG9yZGVyLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VTb3J0QnkoYXJyYXksIGNvbXBhcmVyKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgYXJyYXkuc29ydChjb21wYXJlcik7XG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIGFycmF5W2xlbmd0aF0gPSBhcnJheVtsZW5ndGhdLnZhbHVlO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlU29ydEJ5O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZVNvcnRCeS5qc1xuLy8gbW9kdWxlIGlkID0gMTU3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 158 */
/***/ function(module, exports, __webpack_require__) {

    eval("var compareAscending = __webpack_require__(159);\n\n/**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\nfunction compareMultiple(object, other, orders) {\n  var index = -1,\n      objCriteria = object.criteria,\n      othCriteria = other.criteria,\n      length = objCriteria.length,\n      ordersLength = orders.length;\n\n  while (++index < length) {\n    var result = compareAscending(objCriteria[index], othCriteria[index]);\n    if (result) {\n      if (index >= ordersLength) {\n        return result;\n      }\n      var order = orders[index];\n      return result * (order == 'desc' ? -1 : 1);\n    }\n  }\n  // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n  // that causes it, under certain circumstances, to provide the same value for\n  // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n  // for more details.\n  //\n  // This also ensures a stable sort in V8 and other engines.\n  // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n  return object.index - other.index;\n}\n\nmodule.exports = compareMultiple;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvbXBhcmVNdWx0aXBsZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY29tcGFyZUFzY2VuZGluZyA9IHJlcXVpcmUoJy4vX2NvbXBhcmVBc2NlbmRpbmcnKTtcblxuLyoqXG4gKiBVc2VkIGJ5IGBfLm9yZGVyQnlgIHRvIGNvbXBhcmUgbXVsdGlwbGUgcHJvcGVydGllcyBvZiBhIHZhbHVlIHRvIGFub3RoZXJcbiAqIGFuZCBzdGFibGUgc29ydCB0aGVtLlxuICpcbiAqIElmIGBvcmRlcnNgIGlzIHVuc3BlY2lmaWVkLCBhbGwgdmFsdWVzIGFyZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLiBPdGhlcndpc2UsXG4gKiBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvciBkZXNjZW5kaW5nIG9yIFwiYXNjXCIgZm9yIGFzY2VuZGluZyBzb3J0IG9yZGVyXG4gKiBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtib29sZWFuW118c3RyaW5nW119IG9yZGVycyBUaGUgb3JkZXIgdG8gc29ydCBieSBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIG9iakNyaXRlcmlhID0gb2JqZWN0LmNyaXRlcmlhLFxuICAgICAgb3RoQ3JpdGVyaWEgPSBvdGhlci5jcml0ZXJpYSxcbiAgICAgIGxlbmd0aCA9IG9iakNyaXRlcmlhLmxlbmd0aCxcbiAgICAgIG9yZGVyc0xlbmd0aCA9IG9yZGVycy5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgcmVzdWx0ID0gY29tcGFyZUFzY2VuZGluZyhvYmpDcml0ZXJpYVtpbmRleF0sIG90aENyaXRlcmlhW2luZGV4XSk7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgaWYgKGluZGV4ID49IG9yZGVyc0xlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgdmFyIG9yZGVyID0gb3JkZXJzW2luZGV4XTtcbiAgICAgIHJldHVybiByZXN1bHQgKiAob3JkZXIgPT0gJ2Rlc2MnID8gLTEgOiAxKTtcbiAgICB9XG4gIH1cbiAgLy8gRml4ZXMgYW4gYEFycmF5I3NvcnRgIGJ1ZyBpbiB0aGUgSlMgZW5naW5lIGVtYmVkZGVkIGluIEFkb2JlIGFwcGxpY2F0aW9uc1xuICAvLyB0aGF0IGNhdXNlcyBpdCwgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzLCB0byBwcm92aWRlIHRoZSBzYW1lIHZhbHVlIGZvclxuICAvLyBgb2JqZWN0YCBhbmQgYG90aGVyYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNoa2VuYXMvdW5kZXJzY29yZS9wdWxsLzEyNDdcbiAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgLy9cbiAgLy8gVGhpcyBhbHNvIGVuc3VyZXMgYSBzdGFibGUgc29ydCBpbiBWOCBhbmQgb3RoZXIgZW5naW5lcy5cbiAgLy8gU2VlIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTkwIGZvciBtb3JlIGRldGFpbHMuXG4gIHJldHVybiBvYmplY3QuaW5kZXggLSBvdGhlci5pbmRleDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb21wYXJlTXVsdGlwbGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19jb21wYXJlTXVsdGlwbGUuanNcbi8vIG1vZHVsZSBpZCA9IDE1OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 159 */
/***/ function(module, exports, __webpack_require__) {

    eval("var isSymbol = __webpack_require__(19);\n\n/**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\nfunction compareAscending(value, other) {\n  if (value !== other) {\n    var valIsDefined = value !== undefined,\n        valIsNull = value === null,\n        valIsReflexive = value === value,\n        valIsSymbol = isSymbol(value);\n\n    var othIsDefined = other !== undefined,\n        othIsNull = other === null,\n        othIsReflexive = other === other,\n        othIsSymbol = isSymbol(other);\n\n    if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n        (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n        (valIsNull && othIsDefined && othIsReflexive) ||\n        (!valIsDefined && othIsReflexive) ||\n        !valIsReflexive) {\n      return 1;\n    }\n    if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n        (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n        (othIsNull && valIsDefined && valIsReflexive) ||\n        (!othIsDefined && valIsReflexive) ||\n        !othIsReflexive) {\n      return -1;\n    }\n  }\n  return 0;\n}\n\nmodule.exports = compareAscending;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvbXBhcmVBc2NlbmRpbmcuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKipcbiAqIENvbXBhcmVzIHZhbHVlcyB0byBzb3J0IHRoZW0gaW4gYXNjZW5kaW5nIG9yZGVyLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgdmFsdWVgLlxuICovXG5mdW5jdGlvbiBjb21wYXJlQXNjZW5kaW5nKHZhbHVlLCBvdGhlcikge1xuICBpZiAodmFsdWUgIT09IG90aGVyKSB7XG4gICAgdmFyIHZhbElzRGVmaW5lZCA9IHZhbHVlICE9PSB1bmRlZmluZWQsXG4gICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICB2YWxJc1JlZmxleGl2ZSA9IHZhbHVlID09PSB2YWx1ZSxcbiAgICAgICAgdmFsSXNTeW1ib2wgPSBpc1N5bWJvbCh2YWx1ZSk7XG5cbiAgICB2YXIgb3RoSXNEZWZpbmVkID0gb3RoZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgb3RoSXNOdWxsID0gb3RoZXIgPT09IG51bGwsXG4gICAgICAgIG90aElzUmVmbGV4aXZlID0gb3RoZXIgPT09IG90aGVyLFxuICAgICAgICBvdGhJc1N5bWJvbCA9IGlzU3ltYm9sKG90aGVyKTtcblxuICAgIGlmICgoIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wgJiYgIXZhbElzU3ltYm9sICYmIHZhbHVlID4gb3RoZXIpIHx8XG4gICAgICAgICh2YWxJc1N5bWJvbCAmJiBvdGhJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUgJiYgIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wpIHx8XG4gICAgICAgICh2YWxJc051bGwgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAoIXZhbElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgIXZhbElzUmVmbGV4aXZlKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgaWYgKCghdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCAmJiAhb3RoSXNTeW1ib2wgJiYgdmFsdWUgPCBvdGhlcikgfHxcbiAgICAgICAgKG90aElzU3ltYm9sICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSAmJiAhdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCkgfHxcbiAgICAgICAgKG90aElzTnVsbCAmJiB2YWxJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICghb3RoSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAhb3RoSXNSZWZsZXhpdmUpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZUFzY2VuZGluZztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2NvbXBhcmVBc2NlbmRpbmcuanNcbi8vIG1vZHVsZSBpZCA9IDE1OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 160 */
/***/ function(module, exports, __webpack_require__) {

    eval("var identity = __webpack_require__(132),\n    overRest = __webpack_require__(161),\n    setToString = __webpack_require__(163);\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n  return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VSZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKSxcbiAgICBvdmVyUmVzdCA9IHJlcXVpcmUoJy4vX292ZXJSZXN0JyksXG4gICAgc2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19zZXRUb1N0cmluZycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlc3RgIHdoaWNoIGRvZXNuJ3QgdmFsaWRhdGUgb3IgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUmVzdChmdW5jLCBzdGFydCkge1xuICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgc3RhcnQsIGlkZW50aXR5KSwgZnVuYyArICcnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUmVzdDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2Jhc2VSZXN0LmpzXG4vLyBtb2R1bGUgaWQgPSAxNjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 161 */
/***/ function(module, exports, __webpack_require__) {

    eval("var apply = __webpack_require__(162);\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n  start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n  return function() {\n    var args = arguments,\n        index = -1,\n        length = nativeMax(args.length - start, 0),\n        array = Array(length);\n\n    while (++index < length) {\n      array[index] = args[start + index];\n    }\n    index = -1;\n    var otherArgs = Array(start + 1);\n    while (++index < start) {\n      otherArgs[index] = args[index];\n    }\n    otherArgs[start] = transform(array);\n    return apply(func, this, otherArgs);\n  };\n}\n\nmodule.exports = overRest;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX292ZXJSZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhcHBseSA9IHJlcXVpcmUoJy4vX2FwcGx5Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCB0cmFuc2Zvcm1zIHRoZSByZXN0IGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSByZXN0IGFycmF5IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyUmVzdChmdW5jLCBzdGFydCwgdHJhbnNmb3JtKSB7XG4gIHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0ID09PSB1bmRlZmluZWQgPyAoZnVuYy5sZW5ndGggLSAxKSA6IHN0YXJ0LCAwKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoYXJncy5sZW5ndGggLSBzdGFydCwgMCksXG4gICAgICAgIGFycmF5ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBhcnJheVtpbmRleF0gPSBhcmdzW3N0YXJ0ICsgaW5kZXhdO1xuICAgIH1cbiAgICBpbmRleCA9IC0xO1xuICAgIHZhciBvdGhlckFyZ3MgPSBBcnJheShzdGFydCArIDEpO1xuICAgIHdoaWxlICgrK2luZGV4IDwgc3RhcnQpIHtcbiAgICAgIG90aGVyQXJnc1tpbmRleF0gPSBhcmdzW2luZGV4XTtcbiAgICB9XG4gICAgb3RoZXJBcmdzW3N0YXJ0XSA9IHRyYW5zZm9ybShhcnJheSk7XG4gICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3ZlclJlc3Q7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19vdmVyUmVzdC5qc1xuLy8gbW9kdWxlIGlkID0gMTYxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 162 */
/***/ function(module, exports) {

    eval("/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n  switch (args.length) {\n    case 0: return func.call(thisArg);\n    case 1: return func.call(thisArg, args[0]);\n    case 2: return func.call(thisArg, args[0], args[1]);\n    case 3: return func.call(thisArg, args[0], args[1], args[2]);\n  }\n  return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FwcGx5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBmYXN0ZXIgYWx0ZXJuYXRpdmUgdG8gYEZ1bmN0aW9uI2FwcGx5YCwgdGhpcyBmdW5jdGlvbiBpbnZva2VzIGBmdW5jYFxuICogd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgIGFuZCB0aGUgYXJndW1lbnRzIG9mIGBhcmdzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5KGZ1bmMsIHRoaXNBcmcsIGFyZ3MpIHtcbiAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnKTtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgfVxuICByZXR1cm4gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcHBseTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2FwcGx5LmpzXG4vLyBtb2R1bGUgaWQgPSAxNjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 163 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseSetToString = __webpack_require__(164),\n    shortOut = __webpack_require__(167);\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldFRvU3RyaW5nLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlU2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19iYXNlU2V0VG9TdHJpbmcnKSxcbiAgICBzaG9ydE91dCA9IHJlcXVpcmUoJy4vX3Nob3J0T3V0Jyk7XG5cbi8qKlxuICogU2V0cyB0aGUgYHRvU3RyaW5nYCBtZXRob2Qgb2YgYGZ1bmNgIHRvIHJldHVybiBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gKi9cbnZhciBzZXRUb1N0cmluZyA9IHNob3J0T3V0KGJhc2VTZXRUb1N0cmluZyk7XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0VG9TdHJpbmc7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19zZXRUb1N0cmluZy5qc1xuLy8gbW9kdWxlIGlkID0gMTYzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 164 */
/***/ function(module, exports, __webpack_require__) {

    eval("var constant = __webpack_require__(165),\n    defineProperty = __webpack_require__(166),\n    identity = __webpack_require__(132);\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n  return defineProperty(func, 'toString', {\n    'configurable': true,\n    'enumerable': false,\n    'value': constant(string),\n    'writable': true\n  });\n};\n\nmodule.exports = baseSetToString;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VTZXRUb1N0cmluZy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY29uc3RhbnQgPSByZXF1aXJlKCcuL2NvbnN0YW50JyksXG4gICAgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19kZWZpbmVQcm9wZXJ0eScpLFxuICAgIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXRUb1N0cmluZ2Agd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gKi9cbnZhciBiYXNlU2V0VG9TdHJpbmcgPSAhZGVmaW5lUHJvcGVydHkgPyBpZGVudGl0eSA6IGZ1bmN0aW9uKGZ1bmMsIHN0cmluZykge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHkoZnVuYywgJ3RvU3RyaW5nJywge1xuICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICdlbnVtZXJhYmxlJzogZmFsc2UsXG4gICAgJ3ZhbHVlJzogY29uc3RhbnQoc3RyaW5nKSxcbiAgICAnd3JpdGFibGUnOiB0cnVlXG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlU2V0VG9TdHJpbmc7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19iYXNlU2V0VG9TdHJpbmcuanNcbi8vIG1vZHVsZSBpZCA9IDE2NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 165 */
/***/ function(module, exports) {

    eval("/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n  return function() {\n    return value;\n  };\n}\n\nmodule.exports = constant;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvY29uc3RhbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29uc3RhbnQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL2NvbnN0YW50LmpzXG4vLyBtb2R1bGUgaWQgPSAxNjVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 166 */
/***/ function(module, exports, __webpack_require__) {

    eval("var getNative = __webpack_require__(48);\n\nvar defineProperty = (function() {\n  try {\n    var func = getNative(Object, 'defineProperty');\n    func({}, '', {});\n    return func;\n  } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2RlZmluZVByb3BlcnR5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIHZhciBmdW5jID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2RlZmluZVByb3BlcnR5Jyk7XG4gICAgZnVuYyh7fSwgJycsIHt9KTtcbiAgICByZXR1cm4gZnVuYztcbiAgfSBjYXRjaCAoZSkge31cbn0oKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lUHJvcGVydHk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19kZWZpbmVQcm9wZXJ0eS5qc1xuLy8gbW9kdWxlIGlkID0gMTY2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 167 */
/***/ function(module, exports) {

    eval("/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n    HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n  var count = 0,\n      lastCalled = 0;\n\n  return function() {\n    var stamp = nativeNow(),\n        remaining = HOT_SPAN - (stamp - lastCalled);\n\n    lastCalled = stamp;\n    if (remaining > 0) {\n      if (++count >= HOT_COUNT) {\n        return arguments[0];\n      }\n    } else {\n      count = 0;\n    }\n    return func.apply(undefined, arguments);\n  };\n}\n\nmodule.exports = shortOut;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3Nob3J0T3V0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBVc2VkIHRvIGRldGVjdCBob3QgZnVuY3Rpb25zIGJ5IG51bWJlciBvZiBjYWxscyB3aXRoaW4gYSBzcGFuIG9mIG1pbGxpc2Vjb25kcy4gKi9cbnZhciBIT1RfQ09VTlQgPSA4MDAsXG4gICAgSE9UX1NQQU4gPSAxNjtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU5vdyA9IERhdGUubm93O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0J2xsIHNob3J0IG91dCBhbmQgaW52b2tlIGBpZGVudGl0eWAgaW5zdGVhZFxuICogb2YgYGZ1bmNgIHdoZW4gaXQncyBjYWxsZWQgYEhPVF9DT1VOVGAgb3IgbW9yZSB0aW1lcyBpbiBgSE9UX1NQQU5gXG4gKiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc2hvcnRhYmxlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBzaG9ydE91dChmdW5jKSB7XG4gIHZhciBjb3VudCA9IDAsXG4gICAgICBsYXN0Q2FsbGVkID0gMDtcblxuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0YW1wID0gbmF0aXZlTm93KCksXG4gICAgICAgIHJlbWFpbmluZyA9IEhPVF9TUEFOIC0gKHN0YW1wIC0gbGFzdENhbGxlZCk7XG5cbiAgICBsYXN0Q2FsbGVkID0gc3RhbXA7XG4gICAgaWYgKHJlbWFpbmluZyA+IDApIHtcbiAgICAgIGlmICgrK2NvdW50ID49IEhPVF9DT1VOVCkge1xuICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb3VudCA9IDA7XG4gICAgfVxuICAgIHJldHVybiBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG9ydE91dDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX3Nob3J0T3V0LmpzXG4vLyBtb2R1bGUgaWQgPSAxNjdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 168 */
/***/ function(module, exports, __webpack_require__) {

    eval("var eq = __webpack_require__(38),\n    isArrayLike = __webpack_require__(108),\n    isIndex = __webpack_require__(98),\n    isObject = __webpack_require__(18);\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n *  else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n  if (!isObject(object)) {\n    return false;\n  }\n  var type = typeof index;\n  if (type == 'number'\n        ? (isArrayLike(object) && isIndex(index, object.length))\n        : (type == 'string' && index in object)\n      ) {\n    return eq(object[index], value);\n  }\n  return false;\n}\n\nmodule.exports = isIterateeCall;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzSXRlcmF0ZWVDYWxsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBlcSA9IHJlcXVpcmUoJy4vZXEnKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKSxcbiAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi9faXNJbmRleCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSB2YWx1ZSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7Kn0gaW5kZXggVGhlIHBvdGVudGlhbCBpdGVyYXRlZSBpbmRleCBvciBrZXkgYXJndW1lbnQuXG4gKiBAcGFyYW0geyp9IG9iamVjdCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIG9iamVjdCBhcmd1bWVudC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0l0ZXJhdGVlQ2FsbCh2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHR5cGUgPSB0eXBlb2YgaW5kZXg7XG4gIGlmICh0eXBlID09ICdudW1iZXInXG4gICAgICAgID8gKGlzQXJyYXlMaWtlKG9iamVjdCkgJiYgaXNJbmRleChpbmRleCwgb2JqZWN0Lmxlbmd0aCkpXG4gICAgICAgIDogKHR5cGUgPT0gJ3N0cmluZycgJiYgaW5kZXggaW4gb2JqZWN0KVxuICAgICAgKSB7XG4gICAgcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sIHZhbHVlKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNJdGVyYXRlZUNhbGw7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19pc0l0ZXJhdGVlQ2FsbC5qc1xuLy8gbW9kdWxlIGlkID0gMTY4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 169 */
/***/ function(module, exports) {

    eval("/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n  var length = array == null ? 0 : array.length;\n  return length ? array[length - 1] : undefined;\n}\n\nmodule.exports = last;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvbGFzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdldHMgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmxhc3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IDNcbiAqL1xuZnVuY3Rpb24gbGFzdChhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIHJldHVybiBsZW5ndGggPyBhcnJheVtsZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsYXN0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9sYXN0LmpzXG4vLyBtb2R1bGUgaWQgPSAxNjlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 170 */
/***/ function(module, exports) {

    eval("'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?\"symbol\":typeof obj;};/*\nCopyright (c) 2011 Sencha Inc. - Author: Nicolas Garcia Belmonte (http://philogb.github.com/)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n */\n\n/*\n  File: Core.js\n\n */\n\n/*\n Object: $jit\n \n Defines the namespace for all library Classes and Objects. \n This variable is the *only* global variable defined in the Toolkit. \n There are also other interesting properties attached to this variable described below.\n */\n// START METAMAPS CODE\nvar $jit=function $jit(w){\n// ORIGINAL:\n// window.$jit = function(w) {\n// END METAMAPS CODE\nw=w||window;\nfor(var k in $jit){\nif($jit[k].$extend){\nw[k]=$jit[k];\n}\n}\n};\n\n$jit.version='2.0.1';\n/*\n  Object: $jit.id\n  \n  Works just like *document.getElementById*\n  \n  Example:\n  (start code js)\n  var element = $jit.id('elementId');\n  (end code)\n\n*/\n\n/*\n Object: $jit.util\n \n Contains utility functions.\n \n Some of the utility functions and the Class system were based in the MooTools Framework \n <http://mootools.net>. Copyright (c) 2006-2010 Valerio Proietti, <http://mad4milk.net/>. \n MIT license <http://mootools.net/license.txt>.\n \n These methods are generally also implemented in DOM manipulation frameworks like JQuery, MooTools and Prototype.\n I'd suggest you to use the functions from those libraries instead of using these, since their functions \n are widely used and tested in many different platforms/browsers. Use these functions only if you have to.\n \n */\nvar $=function $(d){\nreturn document.getElementById(d);\n};\n\n$.empty=function(){\n};\n\n/*\n  Method: extend\n  \n  Augment an object by appending another object's properties.\n  \n  Parameters:\n  \n  original - (object) The object to be extended.\n  extended - (object) An object which properties are going to be appended to the original object.\n  \n  Example:\n  (start code js)\n  $jit.util.extend({ 'a': 1, 'b': 2 }, { 'b': 3, 'c': 4 }); //{ 'a':1, 'b': 3, 'c': 4 }\n  (end code)\n*/\n$.extend=function(original,extended){\nfor(var key in extended||{}){\noriginal[key]=extended[key];}\nreturn original;\n};\n\n$.lambda=function(value){\nreturn typeof value=='function'?value:function(){\nreturn value;\n};\n};\n\n$.time=Date.now||function(){\nreturn+new Date();\n};\n\n/*\n  Method: splat\n  \n  Returns an array wrapping *obj* if *obj* is not an array. Returns *obj* otherwise.\n  \n  Parameters:\n  \n  obj - (mixed) The object to be wrapped in an array.\n  \n  Example:\n  (start code js)\n  $jit.util.splat(3);   //[3]\n  $jit.util.splat([3]); //[3]\n  (end code)\n*/\n$.splat=function(obj){\nvar type=$.type(obj);\nreturn type?type!='array'?[obj]:obj:[];\n};\n\n$.type=function(elem){\nvar type=$.type.s.call(elem).match(/^\\[object\\s(.*)\\]$/)[1].toLowerCase();\nif(type!='object')return type;\nif(elem&&elem.$$family)return elem.$$family;\nreturn elem&&elem.nodeName&&elem.nodeType==1?'element':type;\n};\n$.type.s=Object.prototype.toString;\n\n/*\n  Method: each\n  \n  Iterates through an iterable applying *f*.\n  \n  Parameters:\n  \n  iterable - (array) The original array.\n  fn - (function) The function to apply to the array elements.\n  \n  Example:\n  (start code js)\n  $jit.util.each([3, 4, 5], function(n) { alert('number ' + n); });\n  (end code)\n*/\n$.each=function(iterable,fn){\nvar type=$.type(iterable);\nif(type=='object'){\nfor(var key in iterable){\nfn(iterable[key],key);}\n}else{\nfor(var i=0,l=iterable.length;i<l;i++){\nfn(iterable[i],i);}\n}\n};\n\n$.indexOf=function(array,item){\nif(Array.indexOf)return array.indexOf(item);\nfor(var i=0,l=array.length;i<l;i++){\nif(array[i]===item)return i;\n}\nreturn-1;\n};\n\n/*\n  Method: map\n  \n  Maps or collects an array by applying *f*.\n  \n  Parameters:\n  \n  array - (array) The original array.\n  f - (function) The function to apply to the array elements.\n  \n  Example:\n  (start code js)\n  $jit.util.map([3, 4, 5], function(n) { return n*n; }); //[9, 16, 25]\n  (end code)\n*/\n$.map=function(array,f){\nvar ans=[];\n$.each(array,function(elem,i){\nans.push(f(elem,i));\n});\nreturn ans;\n};\n\n/*\n  Method: reduce\n  \n  Iteratively applies the binary function *f* storing the result in an accumulator.\n  \n  Parameters:\n  \n  array - (array) The original array.\n  f - (function) The function to apply to the array elements.\n  opt - (optional|mixed) The starting value for the acumulator.\n  \n  Example:\n  (start code js)\n  $jit.util.reduce([3, 4, 5], function(x, y) { return x + y; }, 0); //12\n  (end code)\n*/\n$.reduce=function(array,f,opt){\nvar l=array.length;\nif(l==0)return opt;\nvar acum=arguments.length==3?opt:array[--l];\nwhile(l--){\nacum=f(acum,array[l]);\n}\nreturn acum;\n};\n\n/*\n  Method: merge\n  \n  Merges n-objects and their sub-objects creating a new, fresh object.\n  \n  Parameters:\n  \n  An arbitrary number of objects.\n  \n  Example:\n  (start code js)\n  $jit.util.merge({ 'a': 1, 'b': 2 }, { 'b': 3, 'c': 4 }); //{ 'a':1, 'b': 3, 'c': 4 }\n  (end code)\n*/\n$.merge=function(){\nvar mix={};\nfor(var i=0,l=arguments.length;i<l;i++){\nvar object=arguments[i];\nif($.type(object)!='object')\ncontinue;\nfor(var key in object){\nvar op=object[key],mp=mix[key];\nmix[key]=mp&&$.type(op)=='object'&&$.type(mp)=='object'?$.\nmerge(mp,op):$.unlink(op);\n}\n}\nreturn mix;\n};\n\n$.unlink=function(object){\nvar unlinked;\nswitch($.type(object)){\ncase'object':\nunlinked={};\nfor(var p in object){\nunlinked[p]=$.unlink(object[p]);}\nbreak;\ncase'array':\nunlinked=[];\nfor(var i=0,l=object.length;i<l;i++){\nunlinked[i]=$.unlink(object[i]);}\nbreak;\ndefault:\nreturn object;}\n\nreturn unlinked;\n};\n\n$.zip=function(){\nif(arguments.length===0)return[];\nfor(var j=0,ans=[],l=arguments.length,ml=arguments[0].length;j<ml;j++){\nfor(var i=0,row=[];i<l;i++){\nrow.push(arguments[i][j]);\n}\nans.push(row);\n}\nreturn ans;\n};\n\n/*\n  Method: rgbToHex\n  \n  Converts an RGB array into a Hex string.\n  \n  Parameters:\n  \n  srcArray - (array) An array with R, G and B values\n  \n  Example:\n  (start code js)\n  $jit.util.rgbToHex([255, 255, 255]); //'#ffffff'\n  (end code)\n*/\n$.rgbToHex=function(srcArray,array){\nif(srcArray.length<3)\nreturn null;\nif(srcArray.length==4&&srcArray[3]==0&&!array)\nreturn'transparent';\nvar hex=[];\nfor(var i=0;i<3;i++){\nvar bit=(srcArray[i]-0).toString(16);\nhex.push(bit.length==1?'0'+bit:bit);\n}\nreturn array?hex:'#'+hex.join('');\n};\n\n/*\n  Method: hexToRgb\n  \n  Converts an Hex color string into an RGB array.\n  \n  Parameters:\n  \n  hex - (string) A color hex string.\n  \n  Example:\n  (start code js)\n  $jit.util.hexToRgb('#fff'); //[255, 255, 255]\n  (end code)\n*/\n$.hexToRgb=function(hex){\nif(hex.length!=7){\nhex=hex.match(/^#?(\\w{1,2})(\\w{1,2})(\\w{1,2})$/);\nhex.shift();\nif(hex.length!=3)\nreturn null;\nvar rgb=[];\nfor(var i=0;i<3;i++){\nvar value=hex[i];\nif(value.length==1)\nvalue+=value;\nrgb.push(parseInt(value,16));\n}\nreturn rgb;\n}else{\nhex=parseInt(hex.slice(1),16);\nreturn[hex>>16,hex>>8&0xff,hex&0xff];\n}\n};\n\n$.destroy=function(elem){\n$.clean(elem);\nif(elem.parentNode)\nelem.parentNode.removeChild(elem);\nif(elem.clearAttributes)\nelem.clearAttributes();\n};\n\n$.clean=function(elem){\nfor(var ch=elem.childNodes,i=0,l=ch.length;i<l;i++){\n$.destroy(ch[i]);\n}\n};\n\n/*\n  Method: addEvent\n  \n  Cross-browser add event listener.\n  \n  Parameters:\n  \n  obj - (obj) The Element to attach the listener to.\n  type - (string) The listener type. For example 'click', or 'mousemove'.\n  fn - (function) The callback function to be used when the event is fired.\n  \n  Example:\n  (start code js)\n  $jit.util.addEvent(elem, 'click', function(){ alert('hello'); });\n  (end code)\n*/\n$.addEvent=function(obj,type,fn){\nif(obj.addEventListener)\nobj.addEventListener(type,fn,false);else\n\nobj.attachEvent('on'+type,fn);\n};\n\n$.addEvents=function(obj,typeObj){\nfor(var type in typeObj){\n$.addEvent(obj,type,typeObj[type]);\n}\n};\n\n$.hasClass=function(obj,klass){\nreturn(' '+obj.className+' ').indexOf(' '+klass+' ')>-1;\n};\n\n$.addClass=function(obj,klass){\nif(!$.hasClass(obj,klass))\nobj.className=obj.className+\" \"+klass;\n};\n\n$.removeClass=function(obj,klass){\nobj.className=obj.className.replace(new RegExp(\n'(^|\\\\s)'+klass+'(?:\\\\s|$)'),'$1');\n};\n\n$.getPos=function(elem){\nvar offset=getOffsets(elem);\nvar scroll=getScrolls(elem);\nreturn{\nx:offset.x-scroll.x,\ny:offset.y-scroll.y};\n\n\nfunction getOffsets(elem){\nvar position={\nx:0,\ny:0};\n\nwhile(elem&&!isBody(elem)){\nposition.x+=elem.offsetLeft;\nposition.y+=elem.offsetTop;\nelem=elem.offsetParent;\n}\nreturn position;\n}\n\nfunction getScrolls(elem){\nvar position={\nx:0,\ny:0};\n\nwhile(elem&&!isBody(elem)){\nposition.x+=elem.scrollLeft;\nposition.y+=elem.scrollTop;\nelem=elem.parentNode;\n}\nreturn position;\n}\n\nfunction isBody(element){\nreturn /^(?:body|html)$/i.test(element.tagName);\n}\n};\n\n$.event={\nget:function get(e,win){\nwin=win||window;\nreturn e||win.event;\n},\ngetWheel:function getWheel(e){\nreturn e.wheelDelta?e.wheelDelta/120:-(e.detail||0)/3;\n},\nisRightClick:function isRightClick(e){\nreturn e.which==3||e.button==2;\n},\ngetPos:function getPos(e,win){\n// get mouse position\nwin=win||window;\ne=e||win.event;\nvar doc=win.document;\ndoc=doc.documentElement||doc.body;\n//TODO(nico): make touch event handling better\nif(e.touches&&e.touches.length){\ne=e.touches[0];\n}\nvar page={\nx:e.pageX||e.clientX+doc.scrollLeft,\ny:e.pageY||e.clientY+doc.scrollTop};\n\nreturn page;\n},\nstop:function stop(e){\nif(e.stopPropagation)e.stopPropagation();\ne.cancelBubble=true;\nif(e.preventDefault)e.preventDefault();else\ne.returnValue=false;\n}};\n\n\n$jit.util=$jit.id=$;\n\nvar Class=function Class(properties){\nproperties=properties||{};\nvar klass=function klass(){\nfor(var key in this){\nif(typeof this[key]!='function')\nthis[key]=$.unlink(this[key]);\n}\nthis.constructor=klass;\nif(Class.prototyping)\nreturn this;\nvar instance=this.initialize?this.initialize.apply(this,arguments):\nthis;\n//typize\nthis.$$family='class';\nreturn instance;\n};\n\nfor(var mutator in Class.Mutators){\nif(!properties[mutator])\ncontinue;\nproperties=Class.Mutators[mutator](properties,properties[mutator]);\ndelete properties[mutator];\n}\n\n$.extend(klass,this);\nklass.constructor=Class;\nklass.prototype=properties;\nreturn klass;\n};\n\nClass.Mutators={\n\nImplements:function Implements(self,klasses){\n$.each($.splat(klasses),function(klass){\nClass.prototyping=klass;\nvar instance=typeof klass=='function'?new klass():klass;\nfor(var prop in instance){\nif(!(prop in self)){\nself[prop]=instance[prop];\n}\n}\ndelete Class.prototyping;\n});\nreturn self;\n}};\n\n\n\n$.extend(Class,{\n\ninherit:function inherit(object,properties){\nfor(var key in properties){\nvar override=properties[key];\nvar previous=object[key];\nvar type=$.type(override);\nif(previous&&type=='function'){\nif(override!=previous){\nClass.override(object,key,override);\n}\n}else if(type=='object'){\nobject[key]=$.merge(previous,override);\n}else{\nobject[key]=override;\n}\n}\nreturn object;\n},\n\noverride:function override(object,name,method){\nvar parent=Class.prototyping;\nif(parent&&object[name]!=parent[name])\nparent=null;\nvar override=function override(){\nvar previous=this.parent;\nthis.parent=parent?parent[name]:object[name];\nvar value=method.apply(this,arguments);\nthis.parent=previous;\nreturn value;\n};\nobject[name]=override;\n}});\n\n\n\nClass.prototype.implement=function(){\nvar proto=this.prototype;\n$.each(Array.prototype.slice.call(arguments||[]),function(properties){\nClass.inherit(proto,properties);\n});\nreturn this;\n};\n\n$jit.Class=Class;\n\n/*\n  Object: $jit.json\n  \n  Provides JSON utility functions.\n  \n  Most of these functions are JSON-tree traversal and manipulation functions.\n*/\n$jit.json={\n/*\n     Method: prune\n  \n     Clears all tree nodes having depth greater than maxLevel.\n  \n     Parameters:\n  \n        tree - (object) A JSON tree object. For more information please see <Loader.loadJSON>.\n        maxLevel - (number) An integer specifying the maximum level allowed for this tree. All nodes having depth greater than max level will be deleted.\n\n  */\nprune:function prune(tree,maxLevel){\nthis.each(tree,function(elem,i){\nif(i==maxLevel&&elem.children){\ndelete elem.children;\nelem.children=[];\n}\n});\n},\n/*\n     Method: getParent\n  \n     Returns the parent node of the node having _id_ as id.\n  \n     Parameters:\n  \n        tree - (object) A JSON tree object. See also <Loader.loadJSON>.\n        id - (string) The _id_ of the child node whose parent will be returned.\n\n    Returns:\n\n        A tree JSON node if any, or false otherwise.\n  \n  */\ngetParent:function getParent(tree,id){\nif(tree.id==id)\nreturn false;\nvar ch=tree.children;\nif(ch&&ch.length>0){\nfor(var i=0;i<ch.length;i++){\nif(ch[i].id==id)\nreturn tree;else\n{\nvar ans=this.getParent(ch[i],id);\nif(ans)\nreturn ans;\n}\n}\n}\nreturn false;\n},\n/*\n     Method: getSubtree\n  \n     Returns the subtree that matches the given id.\n  \n     Parameters:\n  \n        tree - (object) A JSON tree object. See also <Loader.loadJSON>.\n        id - (string) A node *unique* identifier.\n  \n     Returns:\n  \n        A subtree having a root node matching the given id. Returns null if no subtree matching the id is found.\n\n  */\ngetSubtree:function getSubtree(tree,id){\nif(tree.id==id)\nreturn tree;\nfor(var i=0,ch=tree.children;ch&&i<ch.length;i++){\nvar t=this.getSubtree(ch[i],id);\nif(t!=null)\nreturn t;\n}\nreturn null;\n},\n/*\n     Method: eachLevel\n  \n      Iterates on tree nodes with relative depth less or equal than a specified level.\n  \n     Parameters:\n  \n        tree - (object) A JSON tree or subtree. See also <Loader.loadJSON>.\n        initLevel - (number) An integer specifying the initial relative level. Usually zero.\n        toLevel - (number) An integer specifying a top level. This method will iterate only through nodes with depth less than or equal this number.\n        action - (function) A function that receives a node and an integer specifying the actual level of the node.\n          \n    Example:\n   (start code js)\n     $jit.json.eachLevel(tree, 0, 3, function(node, depth) {\n        alert(node.name + ' ' + depth);\n     });\n   (end code)\n  */\neachLevel:function eachLevel(tree,initLevel,toLevel,action){\nif(initLevel<=toLevel){\naction(tree,initLevel);\nif(!tree.children)return;\nfor(var i=0,ch=tree.children;i<ch.length;i++){\nthis.eachLevel(ch[i],initLevel+1,toLevel,action);\n}\n}\n},\n/*\n     Method: each\n  \n      A JSON tree iterator.\n  \n     Parameters:\n  \n        tree - (object) A JSON tree or subtree. See also <Loader.loadJSON>.\n        action - (function) A function that receives a node.\n\n    Example:\n    (start code js)\n      $jit.json.each(tree, function(node) {\n        alert(node.name);\n      });\n    (end code)\n          \n  */\neach:function each(tree,action){\nthis.eachLevel(tree,0,Number.MAX_VALUE,action);\n}};\n\n\n\n/*\n     An object containing multiple type of transformations. \n*/\n\n$jit.Trans={\n$extend:true,\n\nlinear:function linear(p){\nreturn p;\n}};\n\n\nvar Trans=$jit.Trans;\n\n(function(){\n\nvar makeTrans=function makeTrans(transition,params){\nparams=$.splat(params);\nreturn $.extend(transition,{\neaseIn:function easeIn(pos){\nreturn transition(pos,params);\n},\neaseOut:function easeOut(pos){\nreturn 1-transition(1-pos,params);\n},\neaseInOut:function easeInOut(pos){\nreturn pos<=0.5?transition(2*pos,params)/2:(2-transition(\n2*(1-pos),params))/2;\n}});\n\n};\n\nvar transitions={\n\nPow:function Pow(p,x){\nreturn Math.pow(p,x[0]||6);\n},\n\nExpo:function Expo(p){\nreturn Math.pow(2,8*(p-1));\n},\n\nCirc:function Circ(p){\nreturn 1-Math.sin(Math.acos(p));\n},\n\nSine:function Sine(p){\nreturn 1-Math.sin((1-p)*Math.PI/2);\n},\n\nBack:function Back(p,x){\nx=x[0]||1.618;\nreturn Math.pow(p,2)*((x+1)*p-x);\n},\n\nBounce:function Bounce(p){\nvar value;\nfor(var a=0,b=1;1;a+=b,b/=2){\nif(p>=(7-4*a)/11){\nvalue=b*b-Math.pow((11-6*a-11*p)/4,2);\nbreak;\n}\n}\nreturn value;\n},\n\nElastic:function Elastic(p,x){\nreturn Math.pow(2,10*--p)*\nMath.cos(20*p*Math.PI*(x[0]||1)/3);\n}};\n\n\n\n$.each(transitions,function(val,key){\nTrans[key]=makeTrans(val);\n});\n\n$.each([\n'Quad','Cubic','Quart','Quint'],\nfunction(elem,i){\nTrans[elem]=makeTrans(function(p){\nreturn Math.pow(p,[\ni+2]);\n\n});\n});\n\n})();\n\n/*\n   A Class that can perform animations for generic objects.\n\n   If you are looking for animation transitions please take a look at the <Trans> object.\n\n   Used by:\n\n   <Graph.Plot>\n   \n   Based on:\n   \n   The Animation class is based in the MooTools Framework <http://mootools.net>. Copyright (c) 2006-2009 Valerio Proietti, <http://mad4milk.net/>. MIT license <http://mootools.net/license.txt>.\n\n*/\n\nvar Animation=new Class({\n\ninitialize:function initialize(options){\nthis.setOptions(options);\n},\n\nsetOptions:function setOptions(options){\nvar opt={\nduration:2500,\nfps:40,\ntransition:Trans.Quart.easeInOut,\ncompute:$.empty,\ncomplete:$.empty,\nlink:'ignore'};\n\nthis.opt=$.merge(opt,options||{});\nreturn this;\n},\n\nstep:function step(){\nvar time=$.time(),opt=this.opt;\nif(time<this.time+opt.duration){\nvar delta=opt.transition((time-this.time)/opt.duration);\nopt.compute(delta);\n}else{\nthis.timer=clearInterval(this.timer);\nopt.compute(1);\nopt.complete();\n}\n},\n\nstart:function start(){\nif(!this.check())\nreturn this;\nthis.time=0;\nthis.startTimer();\nreturn this;\n},\n\nstartTimer:function startTimer(){\nvar that=this,fps=this.opt.fps;\nif(this.timer)\nreturn false;\nthis.time=$.time()-this.time;\nthis.timer=setInterval(function(){\nthat.step();\n},Math.round(1000/fps));\nreturn true;\n},\n\npause:function pause(){\nthis.stopTimer();\nreturn this;\n},\n\nresume:function resume(){\nthis.startTimer();\nreturn this;\n},\n\nstopTimer:function stopTimer(){\nif(!this.timer)\nreturn false;\nthis.time=$.time()-this.time;\nthis.timer=clearInterval(this.timer);\nreturn true;\n},\n\ncheck:function check(){\nif(!this.timer)\nreturn true;\nif(this.opt.link=='cancel'){\nthis.stopTimer();\nreturn true;\n}\nreturn false;\n}});\n\n\n\nvar Options=function Options(){\nvar args=arguments;\nfor(var i=0,l=args.length,ans={};i<l;i++){\nvar opt=Options[args[i]];\nif(opt.$extend){\n$.extend(ans,opt);\n}else{\nans[args[i]]=opt;\n}\n}\nreturn ans;\n};\n\n/*\n * File: Options.Canvas.js\n *\n*/\n\n/*\n  Object: Options.Canvas\n  \n  These are Canvas general options, like where to append it in the DOM, its dimensions, background, \n  and other more advanced options.\n  \n  Syntax:\n  \n  (start code js)\n\n  Options.Canvas = {\n    injectInto: 'id',\n    type: '2D', //'3D'\n    width: false,\n    height: false,\n    useCanvas: false,\n    withLabels: true,\n    background: false\n  };  \n  (end code)\n  \n  Example:\n  \n  (start code js)\n  var viz = new $jit.Viz({\n    injectInto: 'someContainerId',\n    width: 500,\n    height: 700\n  });\n  (end code)\n  \n  Parameters:\n  \n  injectInto - *required* (string|element) The id of the DOM container for the visualization. It can also be an Element provided that it has an id.\n  type - (string) Context type. Default's 2D but can be 3D for webGL enabled browsers.\n  width - (number) Default's to the *container's offsetWidth*. The width of the canvas.\n  height - (number) Default's to the *container's offsetHeight*. The height of the canvas.\n  useCanvas - (boolean|object) Default's *false*. You can pass another <Canvas> instance to be used by the visualization.\n  withLabels - (boolean) Default's *true*. Whether to use a label container for the visualization.\n  background - (boolean|object) Default's *false*. An object containing information about the rendering of a background canvas.\n*/\n\nOptions.Canvas={\n$extend:true,\n\ninjectInto:'id',\ntype:'2D',\nwidth:false,\nheight:false,\nuseCanvas:false,\nwithLabels:true,\nbackground:false,\n\nScene:{\nLighting:{\nenable:false,\nambient:[1,1,1],\ndirectional:{\ndirection:{x:-100,y:-100,z:-100},\ncolor:[0.5,0.3,0.1]}}}};\n\n\n\n\n\n/*\n * File: Options.Node.js\n *\n*/\n\n/*\n  Object: Options.Node\n\n  Provides Node rendering options for Tree and Graph based visualizations.\n\n  Syntax:\n    \n  (start code js)\n  Options.Node = {\n    overridable: false,\n    type: 'circle',\n    color: '#ccb',\n    alpha: 1,\n    dim: 3,\n    height: 20,\n    width: 90,\n    autoHeight: false,\n    autoWidth: false,\n    lineWidth: 1,\n    transform: true,\n    align: \"center\",\n    angularWidth:1,\n    span:1,\n    CanvasStyles: {}\n  };\n  (end code)\n  \n  Example:\n  \n  (start code js)\n  var viz = new $jit.Viz({\n    Node: {\n      overridable: true,\n      width: 30,\n      autoHeight: true,\n      type: 'rectangle'\n    }\n  });\n  (end code)\n  \n  Parameters:\n\n  overridable - (boolean) Default's *false*. Determine whether or not general node properties can be overridden by a particular <Graph.Node>.\n  type - (string) Default's *circle*. Node's shape. Node built-in types include 'circle', 'rectangle', 'square', 'ellipse', 'triangle', 'star'. The default Node type might vary in each visualization. You can also implement (non built-in) custom Node types into your visualizations.\n  color - (string) Default's *#ccb*. Node color.\n  alpha - (number) Default's *1*. The Node's alpha value. *1* is for full opacity.\n  dim - (number) Default's *3*. An extra parameter used by 'circle', 'square', 'triangle' and 'star' node types. Depending on each shape, this parameter can set the radius of a circle, half the length of the side of a square, half the base and half the height of a triangle or the length of a side of a star (concave decagon).\n  height - (number) Default's *20*. Used by 'rectangle' and 'ellipse' node types. The height of the node shape.\n  width - (number) Default's *90*. Used by 'rectangle' and 'ellipse' node types. The width of the node shape.\n  autoHeight - (boolean) Default's *false*. Whether to set an auto height for the node depending on the content of the Node's label.\n  autoWidth - (boolean) Default's *false*. Whether to set an auto width for the node depending on the content of the Node's label.\n  lineWidth - (number) Default's *1*. Used only by some Node shapes. The line width of the strokes of a node.\n  transform - (boolean) Default's *true*. Only used by the <Hypertree> visualization. Whether to scale the nodes according to the moebius transformation.\n  align - (string) Default's *center*. Possible values are 'center', 'left' or 'right'. Used only by the <ST> visualization, these parameters are used for aligning nodes when some of they dimensions vary.\n  angularWidth - (number) Default's *1*. Used in radial layouts (like <RGraph> or <Sunburst> visualizations). The amount of relative 'space' set for a node.\n  span - (number) Default's *1*. Used in radial layouts (like <RGraph> or <Sunburst> visualizations). The angle span amount set for a node.\n  CanvasStyles - (object) Default's an empty object (i.e. {}). Attach any other canvas specific property that you'd set to the canvas context before plotting a Node.\n\n*/\nOptions.Node={\n$extend:false,\n\noverridable:false,\ntype:'circle',\ncolor:'#ccb',\nalpha:1,\ndim:3,\nheight:20,\nwidth:90,\nautoHeight:false,\nautoWidth:false,\nlineWidth:1,\ntransform:true,\nalign:\"center\",\nangularWidth:1,\nspan:1,\n//Raw canvas styles to be\n//applied to the context instance\n//before plotting a node\nCanvasStyles:{}};\n\n\n\n/*\n * File: Options.Edge.js\n *\n*/\n\n/*\n  Object: Options.Edge\n\n  Provides Edge rendering options for Tree and Graph based visualizations.\n\n  Syntax:\n    \n  (start code js)\n  Options.Edge = {\n    overridable: false,\n    type: 'line',\n    color: '#ccb',\n    lineWidth: 1,\n    dim:15,\n    alpha: 1,\n    CanvasStyles: {}\n  };\n  (end code)\n  \n  Example:\n  \n  (start code js)\n  var viz = new $jit.Viz({\n    Edge: {\n      overridable: true,\n      type: 'line',\n      color: '#fff',\n      CanvasStyles: {\n        shadowColor: '#ccc',\n        shadowBlur: 10\n      }\n    }\n  });\n  (end code)\n  \n  Parameters:\n    \n   overridable - (boolean) Default's *false*. Determine whether or not general edges properties can be overridden by a particular <Graph.Adjacence>.\n   type - (string) Default's 'line'. Edge styles include 'line', 'hyperline', 'arrow'. The default Edge type might vary in each visualization. You can also implement custom Edge types.\n   color - (string) Default's '#ccb'. Edge color.\n   lineWidth - (number) Default's *1*. Line/Edge width.\n   alpha - (number) Default's *1*. The Edge's alpha value. *1* is for full opacity.\n   dim - (number) Default's *15*. An extra parameter used by other complex shapes such as quadratic, bezier or arrow, to determine the shape's diameter.\n   epsilon - (number) Default's *7*. Only used when using *enableForEdges* in <Options.Events>. This dimension is used to create an area for the line where the contains method for the edge returns *true*.\n   CanvasStyles - (object) Default's an empty object (i.e. {}). Attach any other canvas specific property that you'd set to the canvas context before plotting an Edge.\n\n  See also:\n   \n   If you want to know more about how to customize Node/Edge data per element, in the JSON or programmatically, take a look at this article.\n*/\nOptions.Edge={\n$extend:false,\n\noverridable:false,\ntype:'line',\ncolor:'#ccb',\nlineWidth:1,\ndim:15,\nalpha:1,\nepsilon:7,\n\n//Raw canvas styles to be\n//applied to the context instance\n//before plotting an edge\nCanvasStyles:{}};\n\n\n\n/*\n * File: Options.Fx.js\n *\n*/\n\n/*\n  Object: Options.Fx\n\n  Provides animation options like duration of the animations, frames per second and animation transitions.  \n\n  Syntax:\n  \n  (start code js)\n    Options.Fx = {\n      fps:40,\n      duration: 2500,\n      transition: $jit.Trans.Quart.easeInOut,\n      clearCanvas: true\n    };\n  (end code)\n  \n  Example:\n  \n  (start code js)\n  var viz = new $jit.Viz({\n    duration: 1000,\n    fps: 35,\n    transition: $jit.Trans.linear\n  });\n  (end code)\n  \n  Parameters:\n  \n  clearCanvas - (boolean) Default's *true*. Whether to clear the frame/canvas when the viz is plotted or animated.\n  duration - (number) Default's *2500*. Duration of the animation in milliseconds.\n  fps - (number) Default's *40*. Frames per second.\n  transition - (object) Default's *$jit.Trans.Quart.easeInOut*. The transition used for the animations. See below for a more detailed explanation.\n  \n  Object: $jit.Trans\n  \n  This object is used for specifying different animation transitions in all visualizations.\n\n  There are many different type of animation transitions.\n\n  linear:\n\n  Displays a linear transition\n\n  >Trans.linear\n  \n  (see Linear.png)\n\n  Quad:\n\n  Displays a Quadratic transition.\n\n  >Trans.Quad.easeIn\n  >Trans.Quad.easeOut\n  >Trans.Quad.easeInOut\n  \n (see Quad.png)\n\n Cubic:\n\n Displays a Cubic transition.\n\n >Trans.Cubic.easeIn\n >Trans.Cubic.easeOut\n >Trans.Cubic.easeInOut\n\n (see Cubic.png)\n\n Quart:\n\n Displays a Quartetic transition.\n\n >Trans.Quart.easeIn\n >Trans.Quart.easeOut\n >Trans.Quart.easeInOut\n\n (see Quart.png)\n\n Quint:\n\n Displays a Quintic transition.\n\n >Trans.Quint.easeIn\n >Trans.Quint.easeOut\n >Trans.Quint.easeInOut\n\n (see Quint.png)\n\n Expo:\n\n Displays an Exponential transition.\n\n >Trans.Expo.easeIn\n >Trans.Expo.easeOut\n >Trans.Expo.easeInOut\n\n (see Expo.png)\n\n Circ:\n\n Displays a Circular transition.\n\n >Trans.Circ.easeIn\n >Trans.Circ.easeOut\n >Trans.Circ.easeInOut\n\n (see Circ.png)\n\n Sine:\n\n Displays a Sineousidal transition.\n\n >Trans.Sine.easeIn\n >Trans.Sine.easeOut\n >Trans.Sine.easeInOut\n\n (see Sine.png)\n\n Back:\n\n >Trans.Back.easeIn\n >Trans.Back.easeOut\n >Trans.Back.easeInOut\n\n (see Back.png)\n\n Bounce:\n\n Bouncy transition.\n\n >Trans.Bounce.easeIn\n >Trans.Bounce.easeOut\n >Trans.Bounce.easeInOut\n\n (see Bounce.png)\n\n Elastic:\n\n Elastic curve.\n\n >Trans.Elastic.easeIn\n >Trans.Elastic.easeOut\n >Trans.Elastic.easeInOut\n\n (see Elastic.png)\n \n Based on:\n     \n Easing and Transition animation methods are based in the MooTools Framework <http://mootools.net>. Copyright (c) 2006-2010 Valerio Proietti, <http://mad4milk.net/>. MIT license <http://mootools.net/license.txt>.\n\n\n*/\nOptions.Fx={\n$extend:true,\n\nfps:40,\nduration:2500,\ntransition:$jit.Trans.Quart.easeInOut,\nclearCanvas:true};\n\n\n/*\n * File: Options.Label.js\n *\n*/\n/*\n  Object: Options.Label\n\n  Provides styling for Labels such as font size, family, etc. Also sets Node labels as HTML, SVG or Native canvas elements.  \n\n  Syntax:\n  \n  (start code js)\n    Options.Label = {\n      overridable: false,\n      type: 'HTML', //'SVG', 'Native'\n      style: ' ',\n      size: 10,\n      family: 'sans-serif',\n      textAlign: 'center',\n      textBaseline: 'alphabetic',\n      color: '#fff'\n    };\n  (end code)\n  \n  Example:\n  \n  (start code js)\n  var viz = new $jit.Viz({\n    Label: {\n      type: 'Native',\n      size: 11,\n      color: '#ccc'\n    }\n  });\n  (end code)\n  \n  Parameters:\n    \n  overridable - (boolean) Default's *false*. Determine whether or not general label properties can be overridden by a particular <Graph.Node>.\n  type - (string) Default's *HTML*. The type for the labels. Can be 'HTML', 'SVG' or 'Native' canvas labels.\n  style - (string) Default's *empty string*. Can be 'italic' or 'bold'. This parameter is only taken into account when using 'Native' canvas labels. For DOM based labels the className *node* is added to the DOM element for styling via CSS. You can also use <Options.Controller> methods to style individual labels.\n  size - (number) Default's *10*. The font's size. This parameter is only taken into account when using 'Native' canvas labels. For DOM based labels the className *node* is added to the DOM element for styling via CSS. You can also use <Options.Controller> methods to style individual labels.\n  family - (string) Default's *sans-serif*. The font's family. This parameter is only taken into account when using 'Native' canvas labels. For DOM based labels the className *node* is added to the DOM element for styling via CSS. You can also use <Options.Controller> methods to style individual labels.\n  color - (string) Default's *#fff*. The font's color. This parameter is only taken into account when using 'Native' canvas labels. For DOM based labels the className *node* is added to the DOM element for styling via CSS. You can also use <Options.Controller> methods to style individual labels.\n*/\nOptions.Label={\n$extend:false,\n\noverridable:false,\ntype:'HTML',//'SVG', 'Native'\nstyle:' ',\nsize:10,\nfamily:'sans-serif',\ntextAlign:'center',\ntextBaseline:'alphabetic',\ncolor:'#fff'};\n\n\n\n/*\n * File: Options.Tips.js\n *\n */\n\n/*\n  Object: Options.Tips\n  \n  Tips options\n  \n  Syntax:\n    \n  (start code js)\n  Options.Tips = {\n    enable: false,\n    type: 'auto',\n    offsetX: 20,\n    offsetY: 20,\n    onShow: $.empty,\n    onHide: $.empty\n  };\n  (end code)\n  \n  Example:\n  \n  (start code js)\n  var viz = new $jit.Viz({\n    Tips: {\n      enable: true,\n      type: 'Native',\n      offsetX: 10,\n      offsetY: 10,\n      onShow: function(tip, node) {\n        tip.innerHTML = node.name;\n      }\n    }\n  });\n  (end code)\n\n  Parameters:\n\n  enable - (boolean) Default's *false*. If *true*, a tooltip will be shown when a node is hovered. The tooltip is a div DOM element having \"tip\" as CSS class. \n  type - (string) Default's *auto*. Defines where to attach the MouseEnter/Leave tooltip events. Possible values are 'Native' to attach them to the canvas or 'HTML' to attach them to DOM label elements (if defined). 'auto' sets this property to the value of <Options.Label>'s *type* property.\n  offsetX - (number) Default's *20*. An offset added to the current tooltip x-position (which is the same as the current mouse position). Default's 20.\n  offsetY - (number) Default's *20*. An offset added to the current tooltip y-position (which is the same as the current mouse position). Default's 20.\n  onShow(tip, node) - This callack is used right before displaying a tooltip. The first formal parameter is the tip itself (which is a DivElement). The second parameter may be a <Graph.Node> for graph based visualizations or an object with label, value properties for charts.\n  onHide() - This callack is used when hiding a tooltip.\n\n*/\nOptions.Tips={\n$extend:false,\n\nenable:false,\ntype:'auto',\noffsetX:20,\noffsetY:20,\nforce:false,\nonShow:$.empty,\nonHide:$.empty};\n\n\n\n/*\n * File: Options.NodeStyles.js\n *\n */\n\n/*\n  Object: Options.NodeStyles\n  \n  Apply different styles when a node is hovered or selected.\n  \n  Syntax:\n    \n  (start code js)\n  Options.NodeStyles = {\n    enable: false,\n    type: 'auto',\n    stylesHover: false,\n    stylesClick: false\n  };\n  (end code)\n  \n  Example:\n  \n  (start code js)\n  var viz = new $jit.Viz({\n    NodeStyles: {\n      enable: true,\n      type: 'Native',\n      stylesHover: {\n        dim: 30,\n        color: '#fcc'\n      },\n      duration: 600\n    }\n  });\n  (end code)\n\n  Parameters:\n  \n  enable - (boolean) Default's *false*. Whether to enable this option.\n  type - (string) Default's *auto*. Use this to attach the hover/click events in the nodes or the nodes labels (if they have been defined as DOM elements: 'HTML' or 'SVG', see <Options.Label> for more details). The default 'auto' value will set NodeStyles to the same type defined for <Options.Label>.\n  stylesHover - (boolean|object) Default's *false*. An object with node styles just like the ones defined for <Options.Node> or *false* otherwise.\n  stylesClick - (boolean|object) Default's *false*. An object with node styles just like the ones defined for <Options.Node> or *false* otherwise.\n*/\n\nOptions.NodeStyles={\n$extend:false,\n\nenable:false,\ntype:'auto',\nstylesHover:false,\nstylesClick:false};\n\n\n\n/*\n * File: Options.Events.js\n *\n*/\n\n/*\n  Object: Options.Events\n  \n  Configuration for adding mouse/touch event handlers to Nodes.\n  \n  Syntax:\n  \n  (start code js)\n  Options.Events = {\n    enable: false,\n    enableForEdges: false,\n    type: 'auto',\n    onClick: $.empty,\n    onRightClick: $.empty,\n    onMouseMove: $.empty,\n    onMouseEnter: $.empty,\n    onMouseLeave: $.empty,\n    onDragStart: $.empty,\n    onDragMove: $.empty,\n    onDragCancel: $.empty,\n    onDragEnd: $.empty,\n    onTouchStart: $.empty,\n    onTouchMove: $.empty,\n    onTouchEnd: $.empty,\n    onTouchCancel: $.empty,\n    onMouseWheel: $.empty\n  };\n  (end code)\n  \n  Example:\n  \n  (start code js)\n  var viz = new $jit.Viz({\n    Events: {\n      enable: true,\n      onClick: function(node, eventInfo, e) {\n        viz.doSomething();\n      },\n      onMouseEnter: function(node, eventInfo, e) {\n        viz.canvas.getElement().style.cursor = 'pointer';\n      },\n      onMouseLeave: function(node, eventInfo, e) {\n        viz.canvas.getElement().style.cursor = '';\n      }\n    }\n  });\n  (end code)\n  \n  Parameters:\n  \n  enable - (boolean) Default's *false*. Whether to enable the Event system.\n  enableForEdges - (boolean) Default's *false*. Whether to track events also in arcs. If *true* the same callbacks -described below- are used for nodes *and* edges. A simple duck type check for edges is to check for *node.nodeFrom*.\n  type - (string) Default's 'auto'. Whether to attach the events onto the HTML labels (via event delegation) or to use the custom 'Native' canvas Event System of the library. 'auto' is set when you let the <Options.Label> *type* parameter decide this.\n  onClick(node, eventInfo, e) - Triggered when a user performs a click in the canvas. *node* is the <Graph.Node> clicked or false if no node has been clicked. *e* is the grabbed event (should return the native event in a cross-browser manner). *eventInfo* is an object containing useful methods like *getPos* to get the mouse position relative to the canvas. \n  onRightClick(node, eventInfo, e) - Triggered when a user performs a right click in the canvas. *node* is the <Graph.Node> right clicked or false if no node has been clicked. *e* is the grabbed event (should return the native event in a cross-browser manner). *eventInfo* is an object containing useful methods like *getPos* to get the mouse position relative to the canvas. \n  onMouseMove(node, eventInfo, e) - Triggered when the user moves the mouse. *node* is the <Graph.Node> under the cursor as it's moving over the canvas or false if no node has been clicked. *e* is the grabbed event (should return the native event in a cross-browser manner).  *eventInfo* is an object containing useful methods like *getPos* to get the mouse position relative to the canvas.\n  onMouseEnter(node, eventInfo, e) - Triggered when a user moves the mouse over a node. *node* is the <Graph.Node> that the mouse just entered. *e* is the grabbed event (should return the native event in a cross-browser manner). *eventInfo* is an object containing useful methods like *getPos* to get the mouse position relative to the canvas. \n  onMouseLeave(node, eventInfo, e) - Triggered when the user mouse-outs a node. *node* is the <Graph.Node> 'mouse-outed'. *e* is the grabbed event (should return the native event in a cross-browser manner). *eventInfo* is an object containing useful methods like *getPos* to get the mouse position relative to the canvas. \n  onDragStart(node, eventInfo, e) - Triggered when the user mouse-downs over a node. *node* is the <Graph.Node> being pressed. *e* is the grabbed event (should return the native event in a cross-browser manner). *eventInfo* is an object containing useful methods like *getPos* to get the mouse position relative to the canvas. \n  onDragMove(node, eventInfo, e) - Triggered when a user, after pressing the mouse button over a node, moves the mouse around. *node* is the <Graph.Node> being dragged. *e* is the grabbed event (should return the native event in a cross-browser manner). *eventInfo* is an object containing useful methods like *getPos* to get the mouse position relative to the canvas. \n  onDragEnd(node, eventInfo, e) - Triggered when a user finished dragging a node. *node* is the <Graph.Node> being dragged. *e* is the grabbed event (should return the native event in a cross-browser manner). *eventInfo* is an object containing useful methods like *getPos* to get the mouse position relative to the canvas. \n  onDragCancel(node, eventInfo, e) - Triggered when the user releases the mouse button over a <Graph.Node> that wasn't dragged (i.e. the user didn't perform any mouse movement after pressing the mouse button). *node* is the <Graph.Node> being dragged. *e* is the grabbed event (should return the native event in a cross-browser manner). *eventInfo* is an object containing useful methods like *getPos* to get the mouse position relative to the canvas. \n  onTouchStart(node, eventInfo, e) - Behaves just like onDragStart. \n  onTouchMove(node, eventInfo, e) - Behaves just like onDragMove. \n  onTouchEnd(node, eventInfo, e) - Behaves just like onDragEnd. \n  onTouchCancel(node, eventInfo, e) - Behaves just like onDragCancel.\n  onMouseWheel(delta, e) - Triggered when the user uses the mouse scroll over the canvas. *delta* is 1 or -1 depending on the sense of the mouse scroll.\n*/\n\nOptions.Events={\n$extend:false,\n\nenable:false,\nenableForEdges:false,\ntype:'auto',\nonClick:$.empty,\nonRightClick:$.empty,\nonMouseMove:$.empty,\nonMouseEnter:$.empty,\nonMouseLeave:$.empty,\nonDragStart:$.empty,\nonDragMove:$.empty,\nonDragCancel:$.empty,\nonDragEnd:$.empty,\nonTouchStart:$.empty,\nonTouchMove:$.empty,\nonTouchEnd:$.empty,\nonMouseWheel:$.empty};\n\n\n/*\n * File: Options.Navigation.js\n *\n*/\n\n/*\n  Object: Options.Navigation\n  \n  Panning and zooming options for Graph/Tree based visualizations. These options are implemented \n  by all visualizations except charts (<AreaChart>, <BarChart> and <PieChart>).\n  \n  Syntax:\n  \n  (start code js)\n\n  Options.Navigation = {\n    enable: false,\n    type: 'auto',\n    panning: false, //true, 'avoid nodes'\n    zooming: false\n  };\n  \n  (end code)\n  \n  Example:\n    \n  (start code js)\n  var viz = new $jit.Viz({\n    Navigation: {\n      enable: true,\n      panning: 'avoid nodes',\n      zooming: 20\n    }\n  });\n  (end code)\n  \n  Parameters:\n  \n  enable - (boolean) Default's *false*. Whether to enable Navigation capabilities.\n  type - (string) Default's 'auto'. Whether to attach the navigation events onto the HTML labels (via event delegation) or to use the custom 'Native' canvas Event System of the library. When 'auto' set when you let the <Options.Label> *type* parameter decide this.\n  panning - (boolean|string) Default's *false*. Set this property to *true* if you want to add Drag and Drop panning support to the visualization. You can also set this parameter to 'avoid nodes' to enable DnD panning but disable it if the DnD is taking place over a node. This is useful when some other events like Drag & Drop for nodes are added to <Graph.Nodes>.\n  zooming - (boolean|number) Default's *false*. Set this property to a numeric value to turn mouse-scroll zooming on. The number will be proportional to the mouse-scroll sensitivity.\n  \n*/\n\nOptions.Navigation={\n$extend:false,\n\nenable:false,\ntype:'auto',\npanning:false,//true | 'avoid nodes'\nzooming:false};\n\n\n/*\n * File: Options.Controller.js\n *\n*/\n\n/*\n  Object: Options.Controller\n  \n  Provides controller methods. Controller methods are callback functions that get called at different stages \n  of the animation, computing or plotting of the visualization.\n  \n  Implemented by:\n    \n  All visualizations except charts (<AreaChart>, <BarChart> and <PieChart>).\n  \n  Syntax:\n  \n  (start code js)\n\n  Options.Controller = {\n    onBeforeCompute: $.empty,\n    onAfterCompute:  $.empty,\n    onCreateLabel:   $.empty,\n    onPlaceLabel:    $.empty,\n    onComplete:      $.empty,\n    onBeforePlotLine:$.empty,\n    onAfterPlotLine: $.empty,\n    onBeforePlotNode:$.empty,\n    onAfterPlotNode: $.empty,\n    request:         false\n  };\n  \n  (end code)\n  \n  Example:\n    \n  (start code js)\n  var viz = new $jit.Viz({\n    onBeforePlotNode: function(node) {\n      if(node.selected) {\n        node.setData('color', '#ffc');\n      } else {\n        node.removeData('color');\n      }\n    },\n    onBeforePlotLine: function(adj) {\n      if(adj.nodeFrom.selected && adj.nodeTo.selected) {\n        adj.setData('color', '#ffc');\n      } else {\n        adj.removeData('color');\n      }\n    },\n    onAfterCompute: function() {\n      alert(\"computed!\");\n    }\n  });\n  (end code)\n  \n  Parameters:\n\n   onBeforeCompute(node) - This method is called right before performing all computations and animations. The selected <Graph.Node> is passed as parameter.\n   onAfterCompute() - This method is triggered after all animations or computations ended.\n   onCreateLabel(domElement, node) - This method receives a new label DIV element as first parameter, and the corresponding <Graph.Node> as second parameter. This method will only be called once for each label. This method is useful when adding events or styles to the labels used by the JIT.\n   onPlaceLabel(domElement, node) - This method receives a label DIV element as first parameter and the corresponding <Graph.Node> as second parameter. This method is called each time a label has been placed in the visualization, for example at each step of an animation, and thus it allows you to update the labels properties, such as size or position. Note that onPlaceLabel will be triggered after updating the labels positions. That means that, for example, the left and top css properties are already updated to match the nodes positions. Width and height properties are not set however.\n   onBeforePlotNode(node) - This method is triggered right before plotting each <Graph.Node>. This method is useful for changing a node style right before plotting it.\n   onAfterPlotNode(node) - This method is triggered right after plotting each <Graph.Node>.\n   onBeforePlotLine(adj) - This method is triggered right before plotting a <Graph.Adjacence>. This method is useful for adding some styles to a particular edge before being plotted.\n   onAfterPlotLine(adj) - This method is triggered right after plotting a <Graph.Adjacence>.\n\n    *Used in <ST>, <TM.Base> and <Icicle> visualizations*\n    \n    request(nodeId, level, onComplete) - This method is used for buffering information into the visualization. When clicking on an empty node, the visualization will make a request for this node's subtrees, specifying a given level for this subtree (defined by _levelsToShow_). Once the request is completed, the onComplete callback should be called with the given result. This is useful to provide on-demand information into the visualizations withought having to load the entire information from start. The parameters used by this method are _nodeId_, which is the id of the root of the subtree to request, _level_ which is the depth of the subtree to be requested (0 would mean just the root node). _onComplete_ is an object having the callback method _onComplete.onComplete(json)_ that should be called once the json has been retrieved.  \n \n */\nOptions.Controller={\n$extend:true,\n\nonBeforeCompute:$.empty,\nonAfterCompute:$.empty,\nonCreateLabel:$.empty,\nonPlaceLabel:$.empty,\nonComplete:$.empty,\nonBeforePlotLine:$.empty,\nonAfterPlotLine:$.empty,\nonBeforePlotNode:$.empty,\nonAfterPlotNode:$.empty,\nrequest:false};\n\n\n\n/*\n * File: Extras.js\n * \n * Provides Extras such as Tips and Style Effects.\n * \n * Description:\n * \n * Provides the <Tips> and <NodeStyles> classes and functions.\n *\n */\n\n/*\n * Manager for mouse events (clicking and mouse moving).\n * \n * This class is used for registering objects implementing onClick\n * and onMousemove methods. These methods are called when clicking or\n * moving the mouse around  the Canvas.\n * For now, <Tips> and <NodeStyles> are classes implementing these methods.\n * \n */\nvar ExtrasInitializer={\ninitialize:function initialize(className,viz){\nthis.viz=viz;\nthis.canvas=viz.canvas;\nthis.config=viz.config[className];\nthis.nodeTypes=viz.fx.nodeTypes;\nvar type=this.config.type;\nthis.dom=type=='auto'?viz.config.Label.type!='Native':type!='Native';\nthis.labelContainer=this.dom&&viz.labels.getLabelContainer();\nthis.isEnabled()&&this.initializePost();\n},\ninitializePost:$.empty,\nsetAsProperty:$.lambda(false),\nisEnabled:function isEnabled(){\nreturn this.config.enable;\n},\nisLabel:function isLabel(e,win,group){\ne=$.event.get(e,win);\nvar labelContainer=this.labelContainer,\ntarget=e.target||e.srcElement,\nrelated=e.relatedTarget;\nif(group){\nreturn related&&related==this.viz.canvas.getCtx().canvas&&\n!!target&&this.isDescendantOf(target,labelContainer);\n}else{\nreturn this.isDescendantOf(target,labelContainer);\n}\n},\nisDescendantOf:function isDescendantOf(elem,par){\nwhile(elem&&elem.parentNode){\nif(elem.parentNode==par)\nreturn elem;\nelem=elem.parentNode;\n}\nreturn false;\n}};\n\n\nvar EventsInterface={\nonMouseUp:$.empty,\nonMouseDown:$.empty,\nonMouseMove:$.empty,\nonMouseOver:$.empty,\nonMouseOut:$.empty,\nonMouseWheel:$.empty,\nonTouchStart:$.empty,\nonTouchMove:$.empty,\nonTouchEnd:$.empty,\nonTouchCancel:$.empty};\n\n\nvar MouseEventsManager=new Class({\ninitialize:function initialize(viz){\nthis.viz=viz;\nthis.canvas=viz.canvas;\nthis.node=false;\nthis.edge=false;\nthis.registeredObjects=[];\nthis.attachEvents();\n},\n\nattachEvents:function attachEvents(){\nvar htmlCanvas=this.canvas.getElement(),\nthat=this;\nhtmlCanvas.oncontextmenu=$.lambda(false);\n$.addEvents(htmlCanvas,{\n'mouseup':function mouseup(e,win){\nvar event=$.event.get(e,win);\nthat.handleEvent('MouseUp',e,win,\nthat.makeEventObject(e,win),\n$.event.isRightClick(event));\n},\n'mousedown':function mousedown(e,win){\nvar event=$.event.get(e,win);\nthat.handleEvent('MouseDown',e,win,that.makeEventObject(e,win),\n$.event.isRightClick(event));\n},\n'mousemove':function mousemove(e,win){\nthat.handleEvent('MouseMove',e,win,that.makeEventObject(e,win));\n},\n'mouseover':function mouseover(e,win){\nthat.handleEvent('MouseOver',e,win,that.makeEventObject(e,win));\n},\n'mouseout':function mouseout(e,win){\nthat.handleEvent('MouseOut',e,win,that.makeEventObject(e,win));\n},\n'touchstart':function touchstart(e,win){\nthat.handleEvent('TouchStart',e,win,that.makeEventObject(e,win));\n},\n'touchmove':function touchmove(e,win){\nthat.handleEvent('TouchMove',e,win,that.makeEventObject(e,win));\n},\n'touchend':function touchend(e,win){\nthat.handleEvent('TouchEnd',e,win,that.makeEventObject(e,win));\n}});\n\n//attach mousewheel event\nvar handleMouseWheel=function handleMouseWheel(e,win){\nvar event=$.event.get(e,win);\nvar wheel=$.event.getWheel(event);\nthat.handleEvent('MouseWheel',e,win,wheel);\n};\n//TODO(nico): this is a horrible check for non-gecko browsers!\nif(!document.getBoxObjectFor&&window.mozInnerScreenX==null){\n$.addEvent(htmlCanvas,'mousewheel',handleMouseWheel);\n}else{\nhtmlCanvas.addEventListener('DOMMouseScroll',handleMouseWheel,false);\n}\n},\n\nregister:function register(obj){\nthis.registeredObjects.push(obj);\n},\n\nhandleEvent:function handleEvent(){\nvar args=Array.prototype.slice.call(arguments),\ntype=args.shift();\nfor(var i=0,regs=this.registeredObjects,l=regs.length;i<l;i++){\nregs[i]['on'+type].apply(regs[i],args);\n}\n},\n\nmakeEventObject:function makeEventObject(e,win){\nvar that=this,\ngraph=this.viz.graph,\nfx=this.viz.fx,\nntypes=fx.nodeTypes,\netypes=fx.edgeTypes;\nreturn{\npos:false,\nnode:false,\nedge:false,\ncontains:false,\ngetNodeCalled:false,\ngetEdgeCalled:false,\ngetPos:function getPos(){\n//TODO(nico): check why this can't be cache anymore when using edge detection\n//if(this.pos) return this.pos;\nvar canvas=that.viz.canvas,\ns=canvas.getSize(),\np=canvas.getPos(),\nox=canvas.translateOffsetX,\noy=canvas.translateOffsetY,\nsx=canvas.scaleOffsetX,\nsy=canvas.scaleOffsetY,\npos=$.event.getPos(e,win);\nthis.pos={\nx:(pos.x-p.x-s.width/2-ox)*1/sx,\ny:(pos.y-p.y-s.height/2-oy)*1/sy};\n\nreturn this.pos;\n},\ngetNode:function getNode(){\nif(this.getNodeCalled)return this.node;\nthis.getNodeCalled=true;\nfor(var id in graph.nodes){\nvar n=graph.nodes[id],\ngeom=n&&ntypes[n.getData('type')],\n\n// START METAMAPS CODE\ncontains=n.getData('alpha')!==0&&geom&&geom.contains&&geom.contains.call(fx,n,this.getPos());\n// END METAMAPS CODE\n// ORIGINAL CODE contains = geom && geom.contains && geom.contains.call(fx, n, this.getPos());\n\nif(contains){\nthis.contains=contains;\nreturn that.node=this.node=n;\n}\n}\nreturn that.node=this.node=false;\n},\ngetEdge:function getEdge(){\nif(this.getEdgeCalled)return this.edge;\nthis.getEdgeCalled=true;\nvar hashset={};\nfor(var id in graph.edges){\nvar edgeFrom=graph.edges[id];\nhashset[id]=true;\nfor(var edgeId in edgeFrom){\nif(edgeId in hashset)continue;\nvar e=edgeFrom[edgeId],\ngeom=e&&etypes[e.getData('type')],\n\n// START METAMAPS CODE\ncontains=e.getData('alpha')!==0&&geom&&geom.contains&&geom.contains.call(fx,e,this.getPos());\n// END METAMAPS CODE\n// ORIGINAL CODE contains = geom && geom.contains && geom.contains.call(fx, n, this.getPos());\nif(contains){\nthis.contains=contains;\nreturn that.edge=this.edge=e;\n}\n}\n}\nreturn that.edge=this.edge=false;\n},\ngetContains:function getContains(){\nif(this.getNodeCalled)return this.contains;\nthis.getNode();\nreturn this.contains;\n}};\n\n}});\n\n\n/* \n * Provides the initialization function for <NodeStyles> and <Tips> implemented \n * by all main visualizations.\n *\n */\nvar Extras={\ninitializeExtras:function initializeExtras(){\nvar mem=new MouseEventsManager(this),that=this;\n$.each(['NodeStyles','Tips','Navigation','Events'],function(k){\nvar obj=new Extras.Classes[k](k,that);\nif(obj.isEnabled()){\nmem.register(obj);\n}\nif(obj.setAsProperty()){\nthat[k.toLowerCase()]=obj;\n}\n});\n}};\n\n\nExtras.Classes={};\n/*\n  Class: Events\n   \n  This class defines an Event API to be accessed by the user.\n  The methods implemented are the ones defined in the <Options.Events> object.\n*/\n\nExtras.Classes.Events=new Class({\nImplements:[ExtrasInitializer,EventsInterface],\n\ninitializePost:function initializePost(){\nthis.fx=this.viz.fx;\nthis.ntypes=this.viz.fx.nodeTypes;\nthis.etypes=this.viz.fx.edgeTypes;\n\nthis.hovered=false;\nthis.pressed=false;\nthis.touched=false;\n\nthis.touchMoved=false;\nthis.moved=false;\n\n},\n\nsetAsProperty:$.lambda(true),\n\nonMouseUp:function onMouseUp(e,win,event,isRightClick){\nvar evt=$.event.get(e,win);\nif(!this.moved){\nif(isRightClick){\nthis.config.onRightClick(this.hovered,event,evt);\n}else{\nthis.config.onClick(this.pressed,event,evt);\n}\n}\nif(this.pressed){\nif(this.moved){\nthis.config.onDragEnd(this.pressed,event,evt);\n}else{\nthis.config.onDragCancel(this.pressed,event,evt);\n}\nthis.pressed=this.moved=false;\n}\n},\n\nonMouseOut:function onMouseOut(e,win,event){\n//mouseout a label\nvar evt=$.event.get(e,win),label;\nif(this.dom&&(label=this.isLabel(e,win,true))){\nthis.config.onMouseLeave(this.viz.graph.getNode(label.id),\nevent,evt);\nthis.hovered=false;\nreturn;\n}\n//mouseout canvas\nvar rt=evt.relatedTarget,\ncanvasWidget=this.canvas.getElement();\nwhile(rt&&rt.parentNode){\nif(canvasWidget==rt.parentNode)return;\nrt=rt.parentNode;\n}\nif(this.hovered){\nthis.config.onMouseLeave(this.hovered,\nevent,evt);\nthis.hovered=false;\n}\n},\n\nonMouseOver:function onMouseOver(e,win,event){\n//mouseover a label\nvar evt=$.event.get(e,win),label;\nif(this.dom&&(label=this.isLabel(e,win,true))){\nthis.hovered=this.viz.graph.getNode(label.id);\nthis.config.onMouseEnter(this.hovered,\nevent,evt);\n}\n},\n\nonMouseMove:function onMouseMove(e,win,event){\nvar label,evt=$.event.get(e,win);\nif(this.pressed){\nthis.moved=true;\nthis.config.onDragMove(this.pressed,event,evt);\nreturn;\n}\nif(this.dom){\nthis.config.onMouseMove(this.hovered,\nevent,evt);\n}else{\nif(this.hovered){\nvar hn=this.hovered;\nvar geom=hn.nodeFrom?this.etypes[hn.getData('type')]:this.ntypes[hn.getData('type')];\nvar contains=geom&&geom.contains&&\ngeom.contains.call(this.fx,hn,event.getPos());\nif(contains){\nthis.config.onMouseMove(hn,event,evt);\nreturn;\n}else{\nthis.config.onMouseLeave(hn,event,evt);\nthis.hovered=false;\n}\n}\nif(this.hovered=event.getNode()||this.config.enableForEdges&&event.getEdge()){\nthis.config.onMouseEnter(this.hovered,event,evt);\n}else{\nthis.config.onMouseMove(false,event,evt);\n}\n}\n},\n\nonMouseWheel:function onMouseWheel(e,win,delta){\nthis.config.onMouseWheel(delta,$.event.get(e,win));\n},\n\nonMouseDown:function onMouseDown(e,win,event){\n\n// START METAMAPS CODE\nvar evt=$.event.get(e,win);\nthis.pressed=event.getNode()||this.config.enableForEdges&&event.getEdge();\n// END METAMAPS CODE    \n// ORIGINAL CODE\n/*var evt = $.event.get(e, win), label;\n    if(this.dom) {\n      if(label = this.isLabel(e, win)) {\n        this.pressed = this.viz.graph.getNode(label.id);\n      }\n    } else {\n      this.pressed = event.getNode() || (this.config.enableForEdges && event.getEdge());\n    } */\nthis.pressed&&this.config.onDragStart(this.pressed,event,evt);\n},\n\nonTouchStart:function onTouchStart(e,win,event){\nvar evt=$.event.get(e,win),label;\nif(this.dom&&(label=this.isLabel(e,win))){\nthis.touched=this.viz.graph.getNode(label.id);\n}else{\nthis.touched=event.getNode()||this.config.enableForEdges&&event.getEdge();\n}\nthis.touched&&this.config.onTouchStart(this.touched,event,evt);\n},\n\nonTouchMove:function onTouchMove(e,win,event){\nvar evt=$.event.get(e,win);\nif(this.touched){\nthis.touchMoved=true;\nthis.config.onTouchMove(this.touched,event,evt);\n}\n},\n\nonTouchEnd:function onTouchEnd(e,win,event){\nvar evt=$.event.get(e,win);\nif(this.touched){\nif(this.touchMoved){\nthis.config.onTouchEnd(this.touched,event,evt);\n}else{\nthis.config.onTouchCancel(this.touched,event,evt);\n}\nthis.touched=this.touchMoved=false;\n}\n}});\n\n\n/*\n   Class: Tips\n    \n   A class containing tip related functions. This class is used internally.\n   \n   Used by:\n   \n   <ST>, <Sunburst>, <Hypertree>, <RGraph>, <TM>, <ForceDirected>, <Icicle>\n   \n   See also:\n   \n   <Options.Tips>\n*/\n\nExtras.Classes.Tips=new Class({\nImplements:[ExtrasInitializer,EventsInterface],\n\ninitializePost:function initializePost(){\n//add DOM tooltip\nif(document.body){\nvar tip=$('_tooltip')||document.createElement('div');\ntip.id='_tooltip';\ntip.className='tip';\n$.extend(tip.style,{\nposition:'absolute',\ndisplay:'none',\nzIndex:13000});\n\ndocument.body.appendChild(tip);\nthis.tip=tip;\nthis.node=false;\n}\n},\n\nsetAsProperty:$.lambda(true),\n\nonMouseOut:function onMouseOut(e,win){\n//mouseout a label\nvar evt=$.event.get(e,win);\nif(this.dom&&this.isLabel(e,win,true)){\nthis.hide(true);\nreturn;\n}\n//mouseout canvas\nvar rt=e.relatedTarget,\ncanvasWidget=this.canvas.getElement();\nwhile(rt&&rt.parentNode){\nif(canvasWidget==rt.parentNode)return;\nrt=rt.parentNode;\n}\nthis.hide(false);\n},\n\nonMouseOver:function onMouseOver(e,win){\n//mouseover a label\nvar label;\nif(this.dom&&(label=this.isLabel(e,win,false))){\nthis.node=this.viz.graph.getNode(label.id);\nthis.config.onShow(this.tip,this.node,label);\n}\n},\n\nonMouseMove:function onMouseMove(e,win,opt){\nif(this.dom&&this.isLabel(e,win)){\nthis.setTooltipPosition($.event.getPos(e,win));\n}\nif(!this.dom){\nvar node=opt.getNode();\nif(!node){\nthis.hide(true);\nreturn;\n}\nif(this.config.force||!this.node||this.node.id!=node.id){\nthis.node=node;\nthis.config.onShow(this.tip,node,opt.getContains());\n}\nthis.setTooltipPosition($.event.getPos(e,win));\n}\n},\n\nsetTooltipPosition:function setTooltipPosition(pos){\nvar tip=this.tip,\nstyle=tip.style,\ncont=this.config;\nstyle.display='';\n//get window dimensions\nvar win={\n'height':document.body.clientHeight,\n'width':document.body.clientWidth};\n\n//get tooltip dimensions\nvar obj={\n'width':tip.offsetWidth,\n'height':tip.offsetHeight};\n\n//set tooltip position\nvar x=cont.offsetX,y=cont.offsetY;\nstyle.top=(pos.y+y+obj.height>win.height?\npos.y-obj.height-y:pos.y+y)+'px';\nstyle.left=(pos.x+obj.width+x>win.width?\npos.x-obj.width-x:pos.x+x)+'px';\n},\n\nhide:function hide(triggerCallback){\nthis.tip.style.display='none';\ntriggerCallback&&this.config.onHide();\n}});\n\n\n/*\n  Class: NodeStyles\n   \n  Change node styles when clicking or hovering a node. This class is used internally.\n  \n  Used by:\n  \n  <ST>, <Sunburst>, <Hypertree>, <RGraph>, <TM>, <ForceDirected>, <Icicle>\n  \n  See also:\n  \n  <Options.NodeStyles>\n*/\nExtras.Classes.NodeStyles=new Class({\nImplements:[ExtrasInitializer,EventsInterface],\n\ninitializePost:function initializePost(){\nthis.fx=this.viz.fx;\nthis.types=this.viz.fx.nodeTypes;\nthis.nStyles=this.config;\nthis.nodeStylesOnHover=this.nStyles.stylesHover;\nthis.nodeStylesOnClick=this.nStyles.stylesClick;\nthis.hoveredNode=false;\nthis.fx.nodeFxAnimation=new Animation();\n\nthis.down=false;\nthis.move=false;\n},\n\nonMouseOut:function onMouseOut(e,win){\nthis.down=this.move=false;\nif(!this.hoveredNode)return;\n//mouseout a label\nif(this.dom&&this.isLabel(e,win,true)){\nthis.toggleStylesOnHover(this.hoveredNode,false);\n}\n//mouseout canvas\nvar rt=e.relatedTarget,\ncanvasWidget=this.canvas.getElement();\nwhile(rt&&rt.parentNode){\nif(canvasWidget==rt.parentNode)return;\nrt=rt.parentNode;\n}\nthis.toggleStylesOnHover(this.hoveredNode,false);\nthis.hoveredNode=false;\n},\n\nonMouseOver:function onMouseOver(e,win){\n//mouseover a label\nvar label;\nif(this.dom&&(label=this.isLabel(e,win,true))){\nvar node=this.viz.graph.getNode(label.id);\nif(node.selected)return;\nthis.hoveredNode=node;\nthis.toggleStylesOnHover(this.hoveredNode,true);\n}\n},\n\nonMouseDown:function onMouseDown(e,win,event,isRightClick){\nif(isRightClick)return;\nvar label;\nif(this.dom&&(label=this.isLabel(e,win))){\nthis.down=this.viz.graph.getNode(label.id);\n}else if(!this.dom){\nthis.down=event.getNode();\n}\nthis.move=false;\n},\n\nonMouseUp:function onMouseUp(e,win,event,isRightClick){\nif(isRightClick)return;\nif(!this.move){\nthis.onClick(event.getNode());\n}\nthis.down=this.move=false;\n},\n\ngetRestoredStyles:function getRestoredStyles(node,type){\nvar restoredStyles={},\nnStyles=this['nodeStylesOn'+type];\nfor(var prop in nStyles){\nrestoredStyles[prop]=node.styles['$'+prop];\n}\nreturn restoredStyles;\n},\n\ntoggleStylesOnHover:function toggleStylesOnHover(node,set){\nif(this.nodeStylesOnHover){\nthis.toggleStylesOn('Hover',node,set);\n}\n},\n\ntoggleStylesOnClick:function toggleStylesOnClick(node,set){\nif(this.nodeStylesOnClick){\nthis.toggleStylesOn('Click',node,set);\n}\n},\n\ntoggleStylesOn:function toggleStylesOn(type,node,set){\nvar viz=this.viz;\nvar nStyles=this.nStyles;\nif(set){\nvar that=this;\nif(!node.styles){\nnode.styles=$.merge(node.data,{});\n}\nfor(var s in this['nodeStylesOn'+type]){\nvar $s='$'+s;\nif(!($s in node.styles)){\nnode.styles[$s]=node.getData(s);\n}\n}\nviz.fx.nodeFx($.extend({\n'elements':{\n'id':node.id,\n'properties':that['nodeStylesOn'+type]},\n\ntransition:Trans.Quart.easeOut,\nduration:300,\nfps:40},\nthis.config));\n}else{\nvar restoredStyles=this.getRestoredStyles(node,type);\nviz.fx.nodeFx($.extend({\n'elements':{\n'id':node.id,\n'properties':restoredStyles},\n\ntransition:Trans.Quart.easeOut,\nduration:300,\nfps:40},\nthis.config));\n}\n},\n\nonClick:function onClick(node){\nif(!node)return;\nvar nStyles=this.nodeStylesOnClick;\nif(!nStyles)return;\n//if the node is selected then unselect it\nif(node.selected){\nthis.toggleStylesOnClick(node,false);\ndelete node.selected;\n}else{\n//unselect all selected nodes...\nthis.viz.graph.eachNode(function(n){\nif(n.selected){\nfor(var s in nStyles){\nn.setData(s,n.styles['$'+s],'end');\n}\ndelete n.selected;\n}\n});\n//select clicked node\nthis.toggleStylesOnClick(node,true);\nnode.selected=true;\ndelete node.hovered;\nthis.hoveredNode=false;\n}\n},\n\nonMouseMove:function onMouseMove(e,win,event){\n//if mouse button is down and moving set move=true\nif(this.down)this.move=true;\n//already handled by mouseover/out\nif(this.dom&&this.isLabel(e,win))return;\nvar nStyles=this.nodeStylesOnHover;\nif(!nStyles)return;\n\nif(!this.dom){\nif(this.hoveredNode){\nvar geom=this.types[this.hoveredNode.getData('type')];\nvar contains=geom&&geom.contains&&geom.contains.call(this.fx,\nthis.hoveredNode,event.getPos());\nif(contains)return;\n}\nvar node=event.getNode();\n//if no node is being hovered then just exit\nif(!this.hoveredNode&&!node)return;\n//if the node is hovered then exit\nif(node.hovered)return;\n//select hovered node\nif(node&&!node.selected){\n//check if an animation is running and exit it\nthis.fx.nodeFxAnimation.stopTimer();\n//unselect all hovered nodes...\nthis.viz.graph.eachNode(function(n){\nif(n.hovered&&!n.selected){\nfor(var s in nStyles){\nn.setData(s,n.styles['$'+s],'end');\n}\ndelete n.hovered;\n}\n});\n//select hovered node\nnode.hovered=true;\nthis.hoveredNode=node;\nthis.toggleStylesOnHover(node,true);\n}else if(this.hoveredNode&&!this.hoveredNode.selected){\n//check if an animation is running and exit it\nthis.fx.nodeFxAnimation.stopTimer();\n//unselect hovered node\nthis.toggleStylesOnHover(this.hoveredNode,false);\ndelete this.hoveredNode.hovered;\nthis.hoveredNode=false;\n}\n}\n}});\n\n\nExtras.Classes.Navigation=new Class({\nImplements:[ExtrasInitializer,EventsInterface],\n\ninitializePost:function initializePost(){\nthis.pos=false;\nthis.pressed=false;\n// START METAMAPS CODE\nthis.initDist=false;\n// END METAMAPS CODE\n},\n\nonMouseWheel:function onMouseWheel(e,win,scroll){\nif(!this.config.zooming)return;\n\n// START METAMAPS CODE\ne.preventDefault();\nif(e.target.id!='infovis-canvas')return;\nif(Metamaps.Create.newTopic.beingCreated&&!Metamaps.Create.newTopic.pinned)return;\n// END METAMAPS CODE\n\n//$.event.stop($.event.get(e, win));\n// END METAMAPS CODE\n// ORIGINAL CODE $.event.stop($.event.get(e, win));\n\nvar val=this.config.zooming/1000,\nans=1+scroll*val;\n\n// START METAMAPS CODE\nif(ans>1&&5>=this.canvas.scaleOffsetX||ans<1&&this.canvas.scaleOffsetX>=0.2){\nvar s=this.canvas.getSize(),\np=this.canvas.getPos(),\nox=this.canvas.translateOffsetX,\noy=this.canvas.translateOffsetY,\nsx=this.canvas.scaleOffsetX,\nsy=this.canvas.scaleOffsetY;\n\n//Basically this is just a duplication of the Util function pixelsToCoords, it finds the canvas coordinate of the mouse pointer\nvar pointerCoordX=(e.pageX-p.x-s.width/2-ox)*(1/sx),\npointerCoordY=(e.pageY-p.y-s.height/2-oy)*(1/sy);\n\n//This translates the canvas to be centred over the mouse pointer, then the canvas is zoomed as intended.\nthis.canvas.translate(-pointerCoordX,-pointerCoordY);\nthis.canvas.scale(ans,ans);\n\n//Get the canvas attributes again now that is has changed\ns=this.canvas.getSize(),\np=this.canvas.getPos(),\nox=this.canvas.translateOffsetX,\noy=this.canvas.translateOffsetY,\nsx=this.canvas.scaleOffsetX,\nsy=this.canvas.scaleOffsetY;\nvar newX=(e.pageX-p.x-s.width/2-ox)*(1/sx),\nnewY=(e.pageY-p.y-s.height/2-oy)*(1/sy);\n\n//Translate the canvas to put the pointer back over top the same coordinate it was over before\nthis.canvas.translate(newX-pointerCoordX,newY-pointerCoordY);\n}\n\n// END METAMAPS CODE\n// ORIGINAL CODE this.canvas.scale(ans, ans);\n\n// START METAMAPS CODE\njQuery(document).trigger(Metamaps.JIT.events.zoom,[e]);\n// END METAMAPS CODE\n},\n\nonMouseDown:function onMouseDown(e,win,eventInfo){\n///console.log('mouse down!!!!');\nif(!this.config.panning)return;\n\n//START METAMAPS CODE\nMetamaps.Mouse.changeInX=0;\nMetamaps.Mouse.changeInY=0;\nif(this.config.panning=='avoid nodes'&&eventInfo.getNode()||eventInfo.getEdge())return;\n// END METAMAPS CODE\n// ORIGINAl CODE if(this.config.panning == 'avoid nodes' && (this.dom? this.isLabel(e, win) : eventInfo.getNode())) return;\n\nthis.pressed=true;\n\n//START METAMAPS CODE\nvar rightClick=e.button==2||navigator.platform.indexOf(\"Mac\")!=-1&&e.ctrlKey;\n// TODO make sure this works across browsers  \nif(!Metamaps.Mouse.boxStartCoordinates&&(e.button==0&&e.shiftKey||e.button==0&&e.ctrlKey||rightClick)){\nMetamaps.Mouse.boxStartCoordinates=eventInfo.getPos();\n//console.log('mouse down');\n}\n\nMetamaps.Mouse.didPan=false;\n\n\n\n// END METAMAPS CODE\n\nthis.pos=eventInfo.getPos();\nvar canvas=this.canvas,\nox=canvas.translateOffsetX,\noy=canvas.translateOffsetY,\nsx=canvas.scaleOffsetX,\nsy=canvas.scaleOffsetY;\nthis.pos.x*=sx;\nthis.pos.x+=ox;\nthis.pos.y*=sy;\nthis.pos.y+=oy;\n},\n\nonMouseMove:function onMouseMove(e,win,eventInfo){\nif(!this.config.panning)return;\nif(!this.pressed)return;\nif(this.config.panning=='avoid nodes'&&(this.dom?this.isLabel(e,win):eventInfo.getNode()))return;\n\n// START METAMAPS CODE\nvar rightClick=e.button==2||navigator.platform.indexOf(\"Mac\")!=-1&&e.ctrlKey;\nif(!Metamaps.Mouse.boxStartCoordinates&&(e.button==0&&e.shiftKey||e.button==0&&e.ctrlKey||rightClick)){\nMetamaps.Visualize.mGraph.busy=true;\nMetamaps.boxStartCoordinates=eventInfo.getPos();\n//console.log('mouse move');\nreturn;\n}\nif(Metamaps.Mouse.boxStartCoordinates&&(e.button==0&&e.shiftKey||e.button==0&&e.ctrlKey||rightClick)){\nMetamaps.Visualize.mGraph.busy=true;\nMetamaps.Mouse.boxEndCoordinates={\nx:eventInfo.getPos().x,\ny:eventInfo.getPos().y};\n\nMetamaps.Visualize.mGraph.plot();\n//console.log('mouse move');\nreturn;\n}\nif(rightClick){\nreturn;\n}\nif(e.target.id!='infovis-canvas'){\nthis.pressed=false;\nreturn;\n}\nMetamaps.Mouse.didPan=true;\n// END METAMAPS CODE\n\nvar thispos=this.pos,\ncurrentPos=eventInfo.getPos(),\ncanvas=this.canvas,\nox=canvas.translateOffsetX,\noy=canvas.translateOffsetY,\nsx=canvas.scaleOffsetX,\nsy=canvas.scaleOffsetY;\ncurrentPos.x*=sx;\ncurrentPos.y*=sy;\ncurrentPos.x+=ox;\ncurrentPos.y+=oy;\nvar x=currentPos.x-thispos.x,\ny=currentPos.y-thispos.y;\n\n// START METAMAPS CODE\nMetamaps.Mouse.changeInX=x;\nMetamaps.Mouse.changeInY=y;\n// END METAMAPS CODE\n\nthis.pos=currentPos;\nthis.canvas.translate(x*1/sx,y*1/sy);\n\n// START METAMAPS CODE\njQuery(document).trigger(Metamaps.JIT.events.pan);\n// END METAMAPS CODE\n},\n\nonMouseUp:function onMouseUp(e,win,eventInfo,isRightClick){\nif(!this.config.panning)return;\nthis.pressed=false;\n\n// START METAMAPS CODE\nif(Metamaps.Mouse.didPan)Metamaps.JIT.SmoothPanning();\n// END METAMAPS CODE\n\n},\n\n// START METAMAPS CODE\nonTouchStart:function onTouchStart(e,win,eventInfo){\nif(!this.config.panning)return;\nMetamaps.Mouse.changeInX=0;\nMetamaps.Mouse.changeInY=0;\nif(this.config.panning=='avoid nodes'&&eventInfo.getNode()||eventInfo.getEdge())return;\nthis.pressed=true;\nvar rightClick=e.button==2||navigator.platform.indexOf(\"Mac\")!=-1&&e.ctrlKey;\nif(!Metamaps.Mouse.boxStartCoordinates&&(e.button==0&&e.shiftKey||e.button==0&&e.ctrlKey||rightClick)){\nMetamaps.Mouse.boxStartCoordinates=eventInfo.getPos();\n}\nMetamaps.Mouse.didPan=false;\nthis.pos=eventInfo.getPos();\nvar canvas=this.canvas,\nox=canvas.translateOffsetX,\noy=canvas.translateOffsetY,\nsx=canvas.scaleOffsetX,\nsy=canvas.scaleOffsetY;\nthis.pos.x*=sx;\nthis.pos.x+=ox;\nthis.pos.y*=sy;\nthis.pos.y+=oy;\n},\n\nonTouchMove:function onTouchMove(e,win,eventInfo){\nif(!this.config.panning)return;\nif(!this.pressed)return;\nif(this.config.panning=='avoid nodes'&&(this.dom?this.isLabel(e,win):eventInfo.getNode()))return;\n\nif(e.touches.length==1){\nvar rightClick=e.button==2||navigator.platform.indexOf(\"Mac\")!=-1&&e.ctrlKey;\nif(!Metamaps.Mouse.boxStartCoordinates&&(e.button==0&&e.shiftKey||e.button==0&&e.ctrlKey||rightClick)){\nMetamaps.Visualize.mGraph.busy=true;\nMetamaps.boxStartCoordinates=eventInfo.getPos();\nreturn;\n}\nif(Metamaps.Mouse.boxStartCoordinates&&(e.button==0&&e.shiftKey||e.button==0&&e.ctrlKey||rightClick)){\nMetamaps.Visualize.mGraph.busy=true;\nMetamaps.Mouse.boxEndCoordinates={\nx:eventInfo.getPos().x,\ny:eventInfo.getPos().y};\n\nreturn;\n}\nif(rightClick){\nreturn;\n}\nif(e.target.id!='infovis-canvas'){\nthis.pressed=false;\nreturn;\n}\nMetamaps.Mouse.didPan=true;\nvar thispos=this.pos,\ncurrentPos=eventInfo.getPos(),\ncanvas=this.canvas,\nox=canvas.translateOffsetX,\noy=canvas.translateOffsetY,\nsx=canvas.scaleOffsetX,\nsy=canvas.scaleOffsetY;\ncurrentPos.x*=sx;\ncurrentPos.y*=sy;\ncurrentPos.x+=ox;\ncurrentPos.y+=oy;\nvar x=currentPos.x-thispos.x,\ny=currentPos.y-thispos.y;\nMetamaps.Mouse.changeInX=x;\nMetamaps.Mouse.changeInY=y;\nthis.pos=currentPos;\nthis.canvas.translate(x*1/sx,y*1/sy);\njQuery(document).trigger(Metamaps.JIT.events.pan);\n}\n/*\n    else if (e.touches.length == 2) {\n      var touch1 = e.touches[0]\n      var touch2 = e.touches[1]\n      var canvas = this.canvas\n      \n      callCount++;\n\n      var dist = Metamaps.Util.getDistance({\n        x: touch1.clientX,\n        y: touch1.clientY\n      }, {\n        x: touch2.clientX,\n        y: touch2.clientY\n      })\n\n      if (!this.initDist) {\n        this.initDist = dist\n        this.initScale = canvas.scaleOffsetX\n      }\n      var scale = (dist / this.initDist)\n      \n      document.getElementById(\"header_content\").innerHTML = scale + ' ' + canvas.scaleOffsetX\n      if (30 >= this.initScale * scale && this.initScale * scale >= 0.2) {\n        canvas.scale(this.initScale * scale, this.initScale * scale)\n      }\n      if (canvas.scaleOffsetX < 0.5) {\n        canvas.viz.labels.hideLabels(true)\n      } else if (canvas.scaleOffsetX > 0.5) {\n        canvas.viz.labels.hideLabels(false)\n      }\n      \n      jQuery(document).trigger(Metamaps.JIT.events.zoom);\n    }\n    */\n},\n\nonTouchEnd:function onTouchEnd(e,win,eventInfo,isRightClick){\nif(!this.config.panning)return;\nthis.pressed=false;\nif(Metamaps.Mouse.didPan)Metamaps.JIT.SmoothPanning();\nthis.initDist=false;\n}\n// END METAMAPS CODE\n});\n\n\n/*\n * File: Canvas.js\n *\n */\n\n/*\n Class: Canvas\n \n \tA canvas widget used by all visualizations. The canvas object can be accessed by doing *viz.canvas*. If you want to \n \tknow more about <Canvas> options take a look at <Options.Canvas>.\n \n A canvas widget is a set of DOM elements that wrap the native canvas DOM Element providing a consistent API and behavior \n across all browsers. It can also include Elements to add DOM (SVG or HTML) label support to all visualizations.\n \n Example:\n \n Suppose we have this HTML\n \n (start code xml)\n \t<div id=\"infovis\"></div>\n (end code)\n \n Now we create a new Visualization\n \n (start code js)\n \tvar viz = new $jit.Viz({\n \t\t//Where to inject the canvas. Any div container will do.\n \t\t'injectInto':'infovis',\n\t\t //width and height for canvas. \n\t\t //Default's to the container offsetWidth and Height.\n\t\t 'width': 900,\n\t\t 'height':500\n\t });\n (end code)\n\n The generated HTML will look like this\n \n (start code xml)\n <div id=\"infovis\">\n \t<div id=\"infovis-canvaswidget\" style=\"position:relative;\">\n \t<canvas id=\"infovis-canvas\" width=900 height=500\n \tstyle=\"position:absolute; top:0; left:0; width:900px; height:500px;\" />\n \t<div id=\"infovis-label\"\n \tstyle=\"overflow:visible; position:absolute; top:0; left:0; width:900px; height:0px\">\n \t</div>\n \t</div>\n </div>\n (end code)\n \n As you can see, the generated HTML consists of a canvas DOM Element of id *infovis-canvas* and a div label container\n of id *infovis-label*, wrapped in a main div container of id *infovis-canvaswidget*.\n */\n\nvar Canvas;\n(function(){\n//check for native canvas support\nvar canvasType=typeof HTMLCanvasElement==='undefined'?'undefined':_typeof(HTMLCanvasElement),\nsupportsCanvas=canvasType=='object'||canvasType=='function';\n//create element function\nfunction $E(tag,props){\nvar elem=document.createElement(tag);\nfor(var p in props){\nif(_typeof(props[p])==\"object\"){\n$.extend(elem[p],props[p]);\n}else{\nelem[p]=props[p];\n}\n}\nif(tag==\"canvas\"&&!supportsCanvas&&G_vmlCanvasManager){\nelem=G_vmlCanvasManager.initElement(document.body.appendChild(elem));\n}\nreturn elem;\n}\n//canvas widget which we will call just Canvas\n$jit.Canvas=Canvas=new Class({\ncanvases:[],\npos:false,\nelement:false,\nlabelContainer:false,\ntranslateOffsetX:0,\ntranslateOffsetY:0,\nscaleOffsetX:1,\nscaleOffsetY:1,\n\ninitialize:function initialize(viz,opt){\nthis.viz=viz;\nthis.opt=this.config=opt;\nvar id=$.type(opt.injectInto)=='string'?\nopt.injectInto:opt.injectInto.id,\ntype=opt.type,\nidLabel=id+\"-label\",\nwrapper=$(id),\nwidth=opt.width,// || wrapper.offsetWidth,\nheight=opt.height;// || wrapper.offsetHeight;\nthis.id=id;\n//canvas options\nvar canvasOptions={\ninjectInto:id,\nwidth:width,\nheight:height};\n\n//create main wrapper\nthis.element=$E('div',{\n'id':id+'-canvaswidget',\n'style':{\n'position':'relative',\n'width':width+'px',\n'height':height+'px'}});\n\n\n//create label container\nthis.labelContainer=this.createLabelContainer(opt.Label.type,\nidLabel,canvasOptions);\n//create primary canvas\nthis.canvases.push(new Canvas.Base[type]({\nconfig:$.extend({idSuffix:'-canvas'},canvasOptions),\nplot:function plot(base){\nviz.fx.plot();\n},\nresize:function resize(){\nviz.refresh();\n}}));\n\n//create secondary canvas\nvar back=opt.background;\nif(back){\nvar backCanvas=new Canvas.Background[back.type](viz,$.extend(back,canvasOptions));\nthis.canvases.push(new Canvas.Base[type](backCanvas));\n}\n//insert canvases\nvar len=this.canvases.length;\nwhile(len--){\nthis.element.appendChild(this.canvases[len].canvas);\nif(len>0){\nthis.canvases[len].plot();\n}\n}\nthis.element.appendChild(this.labelContainer);\nwrapper.appendChild(this.element);\n\n//Update canvas position when the page is scrolled.\nvar timer=null,that=this;\n$.addEvent(window,'scroll',function(){\nclearTimeout(timer);\ntimer=setTimeout(function(){\nthat.getPos(true);//update canvas position\n},500);\n});\n},\n/*\n      Method: getCtx\n      \n      Returns the main canvas context object\n      \n      Example:\n      \n      (start code js)\n       var ctx = canvas.getCtx();\n       //Now I can use the native canvas context\n       //and for example change some canvas styles\n       ctx.globalAlpha = 1;\n      (end code)\n    */\ngetCtx:function getCtx(i){\nreturn this.canvases[i||0].getCtx();\n},\n/*\n      Method: getConfig\n      \n      Returns the current Configuration for this Canvas Widget.\n      \n      Example:\n      \n      (start code js)\n       var config = canvas.getConfig();\n      (end code)\n    */\ngetConfig:function getConfig(){\nreturn this.opt;\n},\n/*\n      Method: getElement\n\n      Returns the main Canvas DOM wrapper\n      \n      Example:\n      \n      (start code js)\n       var wrapper = canvas.getElement();\n       //Returns <div id=\"infovis-canvaswidget\" ... >...</div> as element\n      (end code)\n    */\ngetElement:function getElement(){\nreturn this.element;\n},\n/*\n      Method: getSize\n      \n      Returns canvas dimensions.\n      \n      Returns:\n      \n      An object with *width* and *height* properties.\n      \n      Example:\n      (start code js)\n      canvas.getSize(); //returns { width: 900, height: 500 }\n      (end code)\n    */\ngetSize:function getSize(i){\nreturn this.canvases[i||0].getSize();\n},\n/*\n      Method: resize\n      \n      Resizes the canvas.\n      \n      Parameters:\n      \n      width - New canvas width.\n      height - New canvas height.\n      \n      Example:\n      \n      (start code js)\n       canvas.resize(width, height);\n      (end code)\n    \n    */\nresize:function resize(width,height){\nthis.getPos(true);\nthis.translateOffsetX=this.translateOffsetY=0;\nthis.scaleOffsetX=this.scaleOffsetY=1;\n\nfor(var i=0,l=this.canvases.length;i<l;i++){\nthis.canvases[i].resize(width,height);\n}\nvar style=this.element.style;\nstyle.width=width+'px';\nstyle.height=height+'px';\nif(this.labelContainer)\nthis.labelContainer.style.width=width+'px';\n},\n/*\n      Method: translate\n      \n      Applies a translation to the canvas.\n      \n      Parameters:\n      \n      x - (number) x offset.\n      y - (number) y offset.\n      disablePlot - (boolean) Default's *false*. Set this to *true* if you don't want to refresh the visualization.\n      \n      Example:\n      \n      (start code js)\n       canvas.translate(30, 30);\n      (end code)\n    \n    */\ntranslate:function translate(x,y,disablePlot){\nthis.translateOffsetX+=x*this.scaleOffsetX;\nthis.translateOffsetY+=y*this.scaleOffsetY;\nfor(var i=0,l=this.canvases.length;i<l;i++){\nthis.canvases[i].translate(x,y,disablePlot);\n}\n},\n/*\n      Method: scale\n      \n      Scales the canvas.\n      \n      Parameters:\n      \n      x - (number) scale value.\n      y - (number) scale value.\n      disablePlot - (boolean) Default's *false*. Set this to *true* if you don't want to refresh the visualization.\n      \n      Example:\n      \n      (start code js)\n       canvas.scale(0.5, 0.5);\n      (end code)\n    \n    */\nscale:function scale(x,y,disablePlot){\nvar px=this.scaleOffsetX*x,\npy=this.scaleOffsetY*y;\nvar dx=this.translateOffsetX*(x-1)/px,\ndy=this.translateOffsetY*(y-1)/py;\nthis.scaleOffsetX=px;\nthis.scaleOffsetY=py;\nfor(var i=0,l=this.canvases.length;i<l;i++){\nthis.canvases[i].scale(x,y,true);\n}\nthis.translate(dx,dy,false);\n},\n/*\n      Method: getPos\n      \n      Returns the canvas position as an *x, y* object.\n      \n      Parameters:\n      \n      force - (boolean) Default's *false*. Set this to *true* if you want to recalculate the position without using any cache information.\n      \n      Returns:\n      \n      An object with *x* and *y* properties.\n      \n      Example:\n      (start code js)\n      canvas.getPos(true); //returns { x: 900, y: 500 }\n      (end code)\n    */\ngetPos:function getPos(force){\nif(force||!this.pos){\nreturn this.pos=$.getPos(this.getElement());\n}\nreturn this.pos;\n},\n/*\n       Method: clear\n       \n       Clears the canvas.\n    */\nclear:function clear(i){\nthis.canvases[i||0].clear();\n},\n\npath:function path(type,action){\nvar ctx=this.canvases[0].getCtx();\nctx.beginPath();\naction(ctx);\nctx[type]();\nctx.closePath();\n},\n\ncreateLabelContainer:function createLabelContainer(type,idLabel,dim){\nvar NS='http://www.w3.org/2000/svg';\nif(type=='HTML'||type=='Native'){\nreturn $E('div',{\n'id':idLabel,\n'style':{\n'overflow':'visible',\n'position':'absolute',\n'top':0,\n'left':0,\n'width':dim.width+'px',\n'height':0}});\n\n\n}else if(type=='SVG'){\nvar svgContainer=document.createElementNS(NS,'svg:svg');\nsvgContainer.setAttribute(\"width\",dim.width);\nsvgContainer.setAttribute('height',dim.height);\nvar style=svgContainer.style;\nstyle.position='absolute';\nstyle.left=style.top='0px';\nvar labelContainer=document.createElementNS(NS,'svg:g');\nlabelContainer.setAttribute('width',dim.width);\nlabelContainer.setAttribute('height',dim.height);\nlabelContainer.setAttribute('x',0);\nlabelContainer.setAttribute('y',0);\nlabelContainer.setAttribute('id',idLabel);\nsvgContainer.appendChild(labelContainer);\nreturn svgContainer;\n}\n}});\n\n//base canvas wrapper\nCanvas.Base={};\nCanvas.Base['2D']=new Class({\ntranslateOffsetX:0,\ntranslateOffsetY:0,\nscaleOffsetX:1,\nscaleOffsetY:1,\n\ninitialize:function initialize(viz){\nthis.viz=viz;\nthis.opt=viz.config;\nthis.size=false;\nthis.createCanvas();\nthis.translateToCenter();\n},\ncreateCanvas:function createCanvas(){\nvar opt=this.opt,\nwidth=opt.width,\nheight=opt.height;\nthis.canvas=$E('canvas',{\n'id':opt.injectInto+opt.idSuffix,\n'width':width,\n'height':height,\n'style':{\n'position':'absolute',\n'top':0,\n'left':0,\n'width':width+'px',\n'height':height+'px'}});\n\n\n},\ngetCtx:function getCtx(){\nif(!this.ctx)\nreturn this.ctx=this.canvas.getContext('2d');\nreturn this.ctx;\n},\ngetSize:function getSize(){\nif(this.size)return this.size;\nvar canvas=this.canvas;\nreturn this.size={\nwidth:canvas.width,\nheight:canvas.height};\n\n},\ntranslateToCenter:function translateToCenter(ps){\n// START METAMAPS CODE\nvar size=this.getSize();\nvar width=ps?size.width-ps.width-this.translateOffsetX*2:size.width;\nvar height=ps?size.height-ps.height-this.translateOffsetY*2:size.height;\n// ORIGINAL CODE\n// var size = this.getSize(),\n//     width = ps? (size.width - ps.width - this.translateOffsetX*2) : size.width;\n//     height = ps? (size.height - ps.height - this.translateOffsetY*2) : size.height;\n// END METAMAPS CODE\nvar ctx=this.getCtx();\nps&&ctx.scale(1/this.scaleOffsetX,1/this.scaleOffsetY);\nctx.translate(width/2,height/2);\n},\nresize:function resize(width,height){\nvar size=this.getSize(),\ncanvas=this.canvas,\nstyles=canvas.style;\nthis.size=false;\ncanvas.width=width;\ncanvas.height=height;\nstyles.width=width+\"px\";\nstyles.height=height+\"px\";\n\n//small ExCanvas fix\nif(!supportsCanvas){\nthis.translateToCenter(size);\n}else{\nthis.translateToCenter();\n}\nthis.translateOffsetX=\nthis.translateOffsetY=0;\nthis.scaleOffsetX=\nthis.scaleOffsetY=1;\n\nthis.clear();\nthis.viz.resize(width,height,this);\n},\ntranslate:function translate(x,y,disablePlot){\nvar sx=this.scaleOffsetX,\nsy=this.scaleOffsetY;\nthis.translateOffsetX+=x*sx;\nthis.translateOffsetY+=y*sy;\nthis.getCtx().translate(x,y);\n!disablePlot&&this.plot();\n},\nscale:function scale(x,y,disablePlot){\nthis.scaleOffsetX*=x;\nthis.scaleOffsetY*=y;\nthis.getCtx().scale(x,y);\n!disablePlot&&this.plot();\n},\nclear:function clear(){\nvar size=this.getSize(),\nox=this.translateOffsetX,\noy=this.translateOffsetY,\nsx=this.scaleOffsetX,\nsy=this.scaleOffsetY;\nthis.getCtx().clearRect((-size.width/2-ox)*1/sx,\n(-size.height/2-oy)*1/sy,\nsize.width*1/sx,size.height*1/sy);\n},\nplot:function plot(){\nthis.clear();\nthis.viz.plot(this);\n}});\n\n//background canvases\n//TODO(nico): document this!\nCanvas.Background={};\nCanvas.Background.Circles=new Class({\ninitialize:function initialize(viz,options){\nthis.viz=viz;\nthis.config=$.merge({\nidSuffix:'-bkcanvas',\nlevelDistance:100,\nnumberOfCircles:6,\nCanvasStyles:{},\noffset:0},\noptions);\n},\nresize:function resize(width,height,base){\nthis.plot(base);\n},\nplot:function plot(base){\nvar canvas=base.canvas,\nctx=base.getCtx(),\nconf=this.config,\nstyles=conf.CanvasStyles;\n//set canvas styles\nfor(var s in styles){ctx[s]=styles[s];}\nvar n=conf.numberOfCircles,\nrho=conf.levelDistance;\nfor(var i=1;i<=n;i++){\nctx.beginPath();\nctx.arc(0,0,rho*i,0,2*Math.PI,false);\nctx.stroke();\nctx.closePath();\n}\n//TODO(nico): print labels too!\n}});\n\n\n// START METAMAPS CODE\nCanvas.Background.Metamaps=new Class({\ninitialize:function initialize(viz,options){\nthis.viz=viz;\nthis.config=options;\n},\nresize:function resize(width,height,base){\nthis.plot(base);\n},\nplot:function plot(base){\nvar canvas=base.canvas,\nctx=base.getCtx(),\nscale=base.scaleOffsetX;\n//var pattern = new Image();\n//pattern.src = Metamaps.ServerData['cubes.png']\n//var ptrn = ctx.createPattern(pattern, 'repeat');\n//ctx.fillStyle = ptrn;\nctx.fillStyle=Metamaps.Settings.colors.background;\nvar xPoint=-(canvas.width/scale)/2-base.translateOffsetX/scale,\nyPoint=-(canvas.height/scale)/2-base.translateOffsetY/scale;\n//ctx.fillRect(xPoint,yPoint,canvas.width/scale,canvas.height/scale);\n}});\n\n// END METAMAPS CODE\n})();\n\n\n/*\n * File: Polar.js\n * \n * Defines the <Polar> class.\n *\n * Description:\n *\n * The <Polar> class, just like the <Complex> class, is used by the <Hypertree>, <ST> and <RGraph> as a 2D point representation.\n *\n * See also:\n *\n * <http://en.wikipedia.org/wiki/Polar_coordinates>\n *\n*/\n\n/*\n   Class: Polar\n\n   A multi purpose polar representation.\n\n   Description:\n \n   The <Polar> class, just like the <Complex> class, is used by the <Hypertree>, <ST> and <RGraph> as a 2D point representation.\n \n   See also:\n \n   <http://en.wikipedia.org/wiki/Polar_coordinates>\n \n   Parameters:\n\n      theta - An angle.\n      rho - The norm.\n*/\n\nvar Polar=function Polar(theta,rho){\nthis.theta=theta||0;\nthis.rho=rho||0;\n};\n\n$jit.Polar=Polar;\n\nPolar.prototype={\n/*\n       Method: getc\n    \n       Returns a complex number.\n    \n       Parameters:\n\n       simple - _optional_ If *true*, this method will return only an object holding x and y properties and not a <Complex> instance. Default's *false*.\n\n      Returns:\n    \n          A complex number.\n    */\ngetc:function getc(simple){\nreturn this.toComplex(simple);\n},\n\n/*\n       Method: getp\n    \n       Returns a <Polar> representation.\n    \n       Returns:\n    \n          A variable in polar coordinates.\n    */\ngetp:function getp(){\nreturn this;\n},\n\n\n/*\n       Method: set\n    \n       Sets a number.\n\n       Parameters:\n\n       v - A <Complex> or <Polar> instance.\n    \n    */\nset:function set(v){\nv=v.getp();\nthis.theta=v.theta;this.rho=v.rho;\n},\n\n/*\n       Method: setc\n    \n       Sets a <Complex> number.\n\n       Parameters:\n\n       x - A <Complex> number real part.\n       y - A <Complex> number imaginary part.\n    \n    */\nsetc:function setc(x,y){\nthis.rho=Math.sqrt(x*x+y*y);\nthis.theta=Math.atan2(y,x);\nif(this.theta<0)this.theta+=Math.PI*2;\n},\n\n/*\n       Method: setp\n    \n       Sets a polar number.\n\n       Parameters:\n\n       theta - A <Polar> number angle property.\n       rho - A <Polar> number rho property.\n    \n    */\nsetp:function setp(theta,rho){\nthis.theta=theta;\nthis.rho=rho;\n},\n\n/*\n       Method: clone\n    \n       Returns a copy of the current object.\n    \n       Returns:\n    \n          A copy of the real object.\n    */\nclone:function clone(){\nreturn new Polar(this.theta,this.rho);\n},\n\n/*\n       Method: toComplex\n    \n        Translates from polar to cartesian coordinates and returns a new <Complex> instance.\n    \n        Parameters:\n\n        simple - _optional_ If *true* this method will only return an object with x and y properties (and not the whole <Complex> instance). Default's *false*.\n \n        Returns:\n    \n          A new <Complex> instance.\n    */\ntoComplex:function toComplex(simple){\nvar x=Math.cos(this.theta)*this.rho;\nvar y=Math.sin(this.theta)*this.rho;\nif(simple)return{'x':x,'y':y};\nreturn new Complex(x,y);\n},\n\n/*\n       Method: add\n    \n        Adds two <Polar> instances.\n    \n       Parameters:\n\n       polar - A <Polar> number.\n\n       Returns:\n    \n          A new Polar instance.\n    */\nadd:function add(polar){\nreturn new Polar(this.theta+polar.theta,this.rho+polar.rho);\n},\n\n/*\n       Method: scale\n    \n        Scales a polar norm.\n    \n        Parameters:\n\n        number - A scale factor.\n        \n        Returns:\n    \n          A new Polar instance.\n    */\nscale:function scale(number){\nreturn new Polar(this.theta,this.rho*number);\n},\n\n/*\n       Method: equals\n    \n       Comparison method.\n\n       Returns *true* if the theta and rho properties are equal.\n\n       Parameters:\n\n       c - A <Polar> number.\n\n       Returns:\n\n       *true* if the theta and rho parameters for these objects are equal. *false* otherwise.\n    */\nequals:function equals(c){\nreturn this.theta==c.theta&&this.rho==c.rho;\n},\n\n/*\n       Method: $add\n    \n        Adds two <Polar> instances affecting the current object.\n    \n       Paramters:\n\n       polar - A <Polar> instance.\n\n       Returns:\n    \n          The changed object.\n    */\n$add:function $add(polar){\nthis.theta=this.theta+polar.theta;this.rho+=polar.rho;\nreturn this;\n},\n\n/*\n       Method: $madd\n    \n        Adds two <Polar> instances affecting the current object. The resulting theta angle is modulo 2pi.\n    \n       Parameters:\n\n       polar - A <Polar> instance.\n\n       Returns:\n    \n          The changed object.\n    */\n$madd:function $madd(polar){\nthis.theta=(this.theta+polar.theta)%(Math.PI*2);this.rho+=polar.rho;\nreturn this;\n},\n\n\n/*\n       Method: $scale\n    \n        Scales a polar instance affecting the object.\n    \n      Parameters:\n\n      number - A scaling factor.\n\n      Returns:\n    \n          The changed object.\n    */\n$scale:function $scale(number){\nthis.rho*=number;\nreturn this;\n},\n\n/*\n      Method: isZero\n   \n      Returns *true* if the number is zero.\n   \n   */\nisZero:function isZero(){\nvar almostZero=0.0001,abs=Math.abs;\nreturn abs(this.theta)<almostZero&&abs(this.rho)<almostZero;\n},\n\n/*\n       Method: interpolate\n    \n        Calculates a polar interpolation between two points at a given delta moment.\n\n        Parameters:\n      \n        elem - A <Polar> instance.\n        delta - A delta factor ranging [0, 1].\n    \n       Returns:\n    \n          A new <Polar> instance representing an interpolation between _this_ and _elem_\n    */\ninterpolate:function interpolate(elem,delta){\nvar pi=Math.PI,pi2=pi*2;\nvar ch=function ch(t){\nvar a=t<0?t%pi2+pi2:t%pi2;\nreturn a;\n};\nvar tt=this.theta,et=elem.theta;\nvar sum,diff=Math.abs(tt-et);\nif(diff==pi){\nif(tt>et){\nsum=ch(et+(tt-pi2-et)*delta);\n}else{\nsum=ch(et-pi2+(tt-et)*delta);\n}\n}else if(diff>=pi){\nif(tt>et){\nsum=ch(et+(tt-pi2-et)*delta);\n}else{\nsum=ch(et-pi2+(tt-(et-pi2))*delta);\n}\n}else{\nsum=ch(et+(tt-et)*delta);\n}\nvar r=(this.rho-elem.rho)*delta+elem.rho;\nreturn{\n'theta':sum,\n'rho':r};\n\n}};\n\n\n\nvar $P=function $P(a,b){return new Polar(a,b);};\n\nPolar.KER=$P(0,0);\n\n\n\n/*\n * File: Complex.js\n * \n * Defines the <Complex> class.\n *\n * Description:\n *\n * The <Complex> class, just like the <Polar> class, is used by the <Hypertree>, <ST> and <RGraph> as a 2D point representation.\n *\n * See also:\n *\n * <http://en.wikipedia.org/wiki/Complex_number>\n *\n*/\n\n/*\n   Class: Complex\n    \n   A multi-purpose Complex Class with common methods.\n \n   Description:\n \n   The <Complex> class, just like the <Polar> class, is used by the <Hypertree>, <ST> and <RGraph> as a 2D point representation.\n \n   See also:\n \n   <http://en.wikipedia.org/wiki/Complex_number>\n\n   Parameters:\n\n   x - _optional_ A Complex number real part.\n   y - _optional_ A Complex number imaginary part.\n \n*/\n\nvar Complex=function Complex(x,y){\nthis.x=x||0;\nthis.y=y||0;\n};\n\n$jit.Complex=Complex;\n\nComplex.prototype={\n/*\n       Method: getc\n    \n       Returns a complex number.\n    \n       Returns:\n    \n          A complex number.\n    */\ngetc:function getc(){\nreturn this;\n},\n\n/*\n       Method: getp\n    \n       Returns a <Polar> representation of this number.\n    \n       Parameters:\n\n       simple - _optional_ If *true*, this method will return only an object holding theta and rho properties and not a <Polar> instance. Default's *false*.\n\n       Returns:\n    \n          A variable in <Polar> coordinates.\n    */\ngetp:function getp(simple){\nreturn this.toPolar(simple);\n},\n\n\n/*\n       Method: set\n    \n       Sets a number.\n\n       Parameters:\n\n       c - A <Complex> or <Polar> instance.\n    \n    */\nset:function set(c){\nc=c.getc(true);\nthis.x=c.x;\nthis.y=c.y;\n},\n\n/*\n       Method: setc\n    \n       Sets a complex number.\n\n       Parameters:\n\n       x - A <Complex> number Real part.\n       y - A <Complex> number Imaginary part.\n    \n    */\nsetc:function setc(x,y){\nthis.x=x;\nthis.y=y;\n},\n\n/*\n       Method: setp\n    \n       Sets a polar number.\n\n       Parameters:\n\n       theta - A <Polar> number theta property.\n       rho - A <Polar> number rho property.\n    \n    */\nsetp:function setp(theta,rho){\nthis.x=Math.cos(theta)*rho;\nthis.y=Math.sin(theta)*rho;\n},\n\n/*\n       Method: clone\n    \n       Returns a copy of the current object.\n    \n       Returns:\n    \n          A copy of the real object.\n    */\nclone:function clone(){\nreturn new Complex(this.x,this.y);\n},\n\n/*\n       Method: toPolar\n    \n       Transforms cartesian to polar coordinates.\n    \n       Parameters:\n\n       simple - _optional_ If *true* this method will only return an object with theta and rho properties (and not the whole <Polar> instance). Default's *false*.\n       \n       Returns:\n    \n          A new <Polar> instance.\n    */\n\ntoPolar:function toPolar(simple){\nvar rho=this.norm();\nvar atan=Math.atan2(this.y,this.x);\nif(atan<0)atan+=Math.PI*2;\nif(simple)return{'theta':atan,'rho':rho};\nreturn new Polar(atan,rho);\n},\n/*\n       Method: norm\n    \n       Calculates a <Complex> number norm.\n    \n       Returns:\n    \n          A real number representing the complex norm.\n    */\nnorm:function norm(){\nreturn Math.sqrt(this.squaredNorm());\n},\n\n/*\n       Method: squaredNorm\n    \n       Calculates a <Complex> number squared norm.\n    \n       Returns:\n    \n          A real number representing the complex squared norm.\n    */\nsquaredNorm:function squaredNorm(){\nreturn this.x*this.x+this.y*this.y;\n},\n\n/*\n       Method: add\n    \n       Returns the result of adding two complex numbers.\n       \n       Does not alter the original object.\n\n       Parameters:\n    \n          pos - A <Complex> instance.\n    \n       Returns:\n    \n         The result of adding two complex numbers.\n    */\nadd:function add(pos){\nreturn new Complex(this.x+pos.x,this.y+pos.y);\n},\n\n/*\n       Method: prod\n    \n       Returns the result of multiplying two <Complex> numbers.\n       \n       Does not alter the original object.\n\n       Parameters:\n    \n          pos - A <Complex> instance.\n    \n       Returns:\n    \n         The result of multiplying two complex numbers.\n    */\nprod:function prod(pos){\nreturn new Complex(this.x*pos.x-this.y*pos.y,this.y*pos.x+this.x*pos.y);\n},\n\n/*\n       Method: conjugate\n    \n       Returns the conjugate of this <Complex> number.\n\n       Does not alter the original object.\n\n       Returns:\n    \n         The conjugate of this <Complex> number.\n    */\nconjugate:function conjugate(){\nreturn new Complex(this.x,-this.y);\n},\n\n\n/*\n       Method: scale\n    \n       Returns the result of scaling a <Complex> instance.\n       \n       Does not alter the original object.\n\n       Parameters:\n    \n          factor - A scale factor.\n    \n       Returns:\n    \n         The result of scaling this complex to a factor.\n    */\nscale:function scale(factor){\nreturn new Complex(this.x*factor,this.y*factor);\n},\n\n/*\n       Method: equals\n    \n       Comparison method.\n\n       Returns *true* if both real and imaginary parts are equal.\n\n       Parameters:\n\n       c - A <Complex> instance.\n\n       Returns:\n\n       A boolean instance indicating if both <Complex> numbers are equal.\n    */\nequals:function equals(c){\nreturn this.x==c.x&&this.y==c.y;\n},\n\n/*\n       Method: $add\n    \n       Returns the result of adding two <Complex> numbers.\n       \n       Alters the original object.\n\n       Parameters:\n    \n          pos - A <Complex> instance.\n    \n       Returns:\n    \n         The result of adding two complex numbers.\n    */\n$add:function $add(pos){\nthis.x+=pos.x;this.y+=pos.y;\nreturn this;\n},\n\n/*\n       Method: $prod\n    \n       Returns the result of multiplying two <Complex> numbers.\n       \n       Alters the original object.\n\n       Parameters:\n    \n          pos - A <Complex> instance.\n    \n       Returns:\n    \n         The result of multiplying two complex numbers.\n    */\n$prod:function $prod(pos){\nvar x=this.x,y=this.y;\nthis.x=x*pos.x-y*pos.y;\nthis.y=y*pos.x+x*pos.y;\nreturn this;\n},\n\n/*\n       Method: $conjugate\n    \n       Returns the conjugate for this <Complex>.\n       \n       Alters the original object.\n\n       Returns:\n    \n         The conjugate for this complex.\n    */\n$conjugate:function $conjugate(){\nthis.y=-this.y;\nreturn this;\n},\n\n/*\n       Method: $scale\n    \n       Returns the result of scaling a <Complex> instance.\n       \n       Alters the original object.\n\n       Parameters:\n    \n          factor - A scale factor.\n    \n       Returns:\n    \n         The result of scaling this complex to a factor.\n    */\n$scale:function $scale(factor){\nthis.x*=factor;this.y*=factor;\nreturn this;\n},\n\n/*\n       Method: $div\n    \n       Returns the division of two <Complex> numbers.\n       \n       Alters the original object.\n\n       Parameters:\n    \n          pos - A <Complex> number.\n    \n       Returns:\n    \n         The result of scaling this complex to a factor.\n    */\n$div:function $div(pos){\nvar x=this.x,y=this.y;\nvar sq=pos.squaredNorm();\nthis.x=x*pos.x+y*pos.y;this.y=y*pos.x-x*pos.y;\nreturn this.$scale(1/sq);\n},\n\n/*\n      Method: isZero\n   \n      Returns *true* if the number is zero.\n   \n   */\nisZero:function isZero(){\nvar almostZero=0.0001,abs=Math.abs;\nreturn abs(this.x)<almostZero&&abs(this.y)<almostZero;\n}};\n\n\nvar $C=function $C(a,b){return new Complex(a,b);};\n\nComplex.KER=$C(0,0);\n\n\n\n/*\n * File: Graph.js\n *\n*/\n\n/*\n Class: Graph\n\n A Graph Class that provides useful manipulation functions. You can find more manipulation methods in the <Graph.Util> object.\n\n An instance of this class can be accessed by using the *graph* parameter of any tree or graph visualization.\n \n Example:\n\n (start code js)\n   //create new visualization\n   var viz = new $jit.Viz(options);\n   //load JSON data\n   viz.loadJSON(json);\n   //access model\n   viz.graph; //<Graph> instance\n (end code)\n \n Implements:\n \n The following <Graph.Util> methods are implemented in <Graph>\n \n  - <Graph.Util.getNode>\n  - <Graph.Util.eachNode>\n  - <Graph.Util.computeLevels>\n  - <Graph.Util.eachBFS>\n  - <Graph.Util.clean>\n  - <Graph.Util.getClosestNodeToPos>\n  - <Graph.Util.getClosestNodeToOrigin>\n \n*/\n\n$jit.Graph=new Class({\n\ninitialize:function initialize(opt,Node,Edge,Label){\nvar innerOptions={\n'klass':Complex,\n'Node':{}};\n\nthis.Node=Node;\nthis.Edge=Edge;\nthis.Label=Label;\nthis.opt=$.merge(innerOptions,opt||{});\nthis.nodes={};\nthis.edges={};\n\n//add nodeList methods\nvar that=this;\nthis.nodeList={};\nfor(var p in Accessors){\nthat.nodeList[p]=function(p){\nreturn function(){\nvar args=Array.prototype.slice.call(arguments);\nthat.eachNode(function(n){\nn[p].apply(n,args);\n});\n};\n}(p);\n}\n\n},\n\n/*\n     Method: getNode\n    \n     Returns a <Graph.Node> by *id*.\n\n     Parameters:\n\n     id - (string) A <Graph.Node> id.\n\n     Example:\n\n     (start code js)\n       var node = graph.getNode('nodeId');\n     (end code)\n*/\ngetNode:function getNode(id){\nif(this.hasNode(id))return this.nodes[id];\nreturn false;\n},\n\n/*\n     Method: get\n    \n     An alias for <Graph.Util.getNode>. Returns a node by *id*.\n    \n     Parameters:\n    \n     id - (string) A <Graph.Node> id.\n    \n     Example:\n    \n     (start code js)\n       var node = graph.get('nodeId');\n     (end code)\n*/\nget:function get(id){\nreturn this.getNode(id);\n},\n\n/*\n   Method: getByName\n  \n   Returns a <Graph.Node> by *name*.\n  \n   Parameters:\n  \n   name - (string) A <Graph.Node> name.\n  \n   Example:\n  \n   (start code js)\n     var node = graph.getByName('someName');\n   (end code)\n  */\ngetByName:function getByName(name){\nfor(var id in this.nodes){\nvar n=this.nodes[id];\nif(n.name==name)return n;\n}\nreturn false;\n},\n\n/*\n   Method: getAdjacence\n  \n   Returns a <Graph.Adjacence> object connecting nodes with ids *id* and *id2*.\n\n   Parameters:\n\n   id - (string) A <Graph.Node> id.\n   id2 - (string) A <Graph.Node> id.\n*/\ngetAdjacence:function getAdjacence(id,id2){\nif(id in this.edges){\nreturn this.edges[id][id2];\n}\nreturn false;\n},\n\n/*\n     Method: addNode\n    \n     Adds a node.\n     \n     Parameters:\n    \n      obj - An object with the properties described below\n\n      id - (string) A node id\n      name - (string) A node's name\n      data - (object) A node's data hash\n\n    See also:\n    <Graph.Node>\n\n  */\naddNode:function addNode(obj){\nif(!this.nodes[obj.id]){\nvar edges=this.edges[obj.id]={};\nthis.nodes[obj.id]=new Graph.Node($.extend({\n'id':obj.id,\n'name':obj.name,\n'data':$.merge(obj.data||{},{}),\n'adjacencies':edges},\nthis.opt.Node),\nthis.opt.klass,\nthis.Node,\nthis.Edge,\nthis.Label);\n}\nreturn this.nodes[obj.id];\n},\n\n/*\n     Method: addAdjacence\n    \n     Connects nodes specified by *obj* and *obj2*. If not found, nodes are created.\n     \n     Parameters:\n    \n      obj - (object) A <Graph.Node> object.\n      obj2 - (object) Another <Graph.Node> object.\n      data - (object) A data object. Used to store some extra information in the <Graph.Adjacence> object created.\n\n    See also:\n\n    <Graph.Node>, <Graph.Adjacence>\n    */\naddAdjacence:function addAdjacence(obj,obj2,data){\nif(!this.hasNode(obj.id)){this.addNode(obj);}\nif(!this.hasNode(obj2.id)){this.addNode(obj2);}\nobj=this.nodes[obj.id];obj2=this.nodes[obj2.id];\nif(!obj.adjacentTo(obj2)){\nvar adjsObj=this.edges[obj.id]=this.edges[obj.id]||{};\nvar adjsObj2=this.edges[obj2.id]=this.edges[obj2.id]||{};\nadjsObj[obj2.id]=adjsObj2[obj.id]=new Graph.Adjacence(obj,obj2,data,this.Edge,this.Label);\nreturn adjsObj[obj2.id];\n}\nreturn this.edges[obj.id][obj2.id];\n},\n\n/*\n     Method: removeNode\n    \n     Removes a <Graph.Node> matching the specified *id*.\n\n     Parameters:\n\n     id - (string) A node's id.\n\n    */\nremoveNode:function removeNode(id){\nif(this.hasNode(id)){\ndelete this.nodes[id];\nvar adjs=this.edges[id];\nfor(var to in adjs){\ndelete this.edges[to][id];\n}\ndelete this.edges[id];\n}\n},\n\n/*\n     Method: removeAdjacence\n    \n     Removes a <Graph.Adjacence> matching *id1* and *id2*.\n\n     Parameters:\n\n     id1 - (string) A <Graph.Node> id.\n     id2 - (string) A <Graph.Node> id.\n*/\nremoveAdjacence:function removeAdjacence(id1,id2){\ndelete this.edges[id1][id2];\ndelete this.edges[id2][id1];\n},\n\n/*\n     Method: hasNode\n    \n     Returns a boolean indicating if the node belongs to the <Graph> or not.\n     \n     Parameters:\n    \n        id - (string) Node id.\n   */\nhasNode:function hasNode(id){\nreturn id in this.nodes;\n},\n\n/*\n    Method: empty\n\n    Empties the Graph\n\n  */\nempty:function empty(){this.nodes={};this.edges={};}});\n\n\n\nvar Graph=$jit.Graph;\n\n/*\n Object: Accessors\n \n Defines a set of methods for data, canvas and label styles manipulation implemented by <Graph.Node> and <Graph.Adjacence> instances.\n \n */\nvar Accessors;\n\n(function(){\nvar getDataInternal=function getDataInternal(prefix,prop,type,force,prefixConfig){\nvar data;\ntype=type||'current';\nprefix=\"$\"+(prefix?prefix+\"-\":\"\");\n\nif(type=='current'){\ndata=this.data;\n}else if(type=='start'){\ndata=this.startData;\n}else if(type=='end'){\ndata=this.endData;\n}\n\nvar dollar=prefix+prop;\n\nif(force){\nreturn data[dollar];\n}\n\nif(!this.Config.overridable)\nreturn prefixConfig[prop]||0;\n\nreturn dollar in data?\ndata[dollar]:dollar in this.data?this.data[dollar]:prefixConfig[prop]||0;\n};\n\nvar setDataInternal=function setDataInternal(prefix,prop,value,type){\ntype=type||'current';\nprefix='$'+(prefix?prefix+'-':'');\n\nvar data;\n\nif(type=='current'){\ndata=this.data;\n}else if(type=='start'){\ndata=this.startData;\n}else if(type=='end'){\ndata=this.endData;\n}\n\ndata[prefix+prop]=value;\n};\n\nvar removeDataInternal=function removeDataInternal(prefix,properties){\nprefix='$'+(prefix?prefix+'-':'');\nvar that=this;\n$.each(properties,function(prop){\nvar pref=prefix+prop;\ndelete that.data[pref];\ndelete that.endData[pref];\ndelete that.startData[pref];\n});\n};\n\nAccessors={\n/*\n    Method: getData\n\n    Returns the specified data value property.\n    This is useful for querying special/reserved <Graph.Node> data properties\n    (i.e dollar prefixed properties).\n\n    Parameters:\n\n      prop  - (string) The name of the property. The dollar sign is not needed. For\n              example *getData(width)* will return *data.$width*.\n      type  - (string) The type of the data property queried. Default's \"current\". You can access *start* and *end* \n              data properties also. These properties are used when making animations.\n      force - (boolean) Whether to obtain the true value of the property (equivalent to\n              *data.$prop*) or to check for *node.overridable = true* first.\n\n    Returns:\n\n      The value of the dollar prefixed property or the global Node/Edge property\n      value if *overridable=false*\n\n    Example:\n    (start code js)\n     node.getData('width'); //will return node.data.$width if Node.overridable=true;\n    (end code)\n    */\ngetData:function getData(prop,type,force){\nreturn getDataInternal.call(this,\"\",prop,type,force,this.Config);\n},\n\n\n/*\n    Method: setData\n\n    Sets the current data property with some specific value.\n    This method is only useful for reserved (dollar prefixed) properties.\n\n    Parameters:\n\n      prop  - (string) The name of the property. The dollar sign is not necessary. For\n              example *setData(width)* will set *data.$width*.\n      value - (mixed) The value to store.\n      type  - (string) The type of the data property to store. Default's \"current\" but\n              can also be \"start\" or \"end\".\n\n    Example:\n    \n    (start code js)\n     node.setData('width', 30);\n    (end code)\n    \n    If we were to make an animation of a node/edge width then we could do\n    \n    (start code js)\n      var node = viz.getNode('nodeId');\n      //set start and end values\n      node.setData('width', 10, 'start');\n      node.setData('width', 30, 'end');\n      //will animate nodes width property\n      viz.fx.animate({\n        modes: ['node-property:width'],\n        duration: 1000\n      });\n    (end code)\n    */\nsetData:function setData(prop,value,type){\nsetDataInternal.call(this,\"\",prop,value,type);\n},\n\n/*\n    Method: setDataset\n\n    Convenience method to set multiple data values at once.\n    \n    Parameters:\n    \n    types - (array|string) A set of 'current', 'end' or 'start' values.\n    obj - (object) A hash containing the names and values of the properties to be altered.\n\n    Example:\n    (start code js)\n      node.setDataset(['current', 'end'], {\n        'width': [100, 5],\n        'color': ['#fff', '#ccc']\n      });\n      //...or also\n      node.setDataset('end', {\n        'width': 5,\n        'color': '#ccc'\n      });\n    (end code)\n    \n    See also: \n    \n    <Accessors.setData>\n    \n    */\nsetDataset:function setDataset(types,obj){\ntypes=$.splat(types);\nfor(var attr in obj){\nfor(var i=0,val=$.splat(obj[attr]),l=types.length;i<l;i++){\nthis.setData(attr,val[i],types[i]);\n}\n}\n},\n\n/*\n    Method: removeData\n\n    Remove data properties.\n\n    Parameters:\n\n    One or more property names as arguments. The dollar sign is not needed.\n\n    Example:\n    (start code js)\n    node.removeData('width'); //now the default width value is returned\n    (end code)\n    */\nremoveData:function removeData(){\nremoveDataInternal.call(this,\"\",Array.prototype.slice.call(arguments));\n},\n\n/*\n    Method: getCanvasStyle\n\n    Returns the specified canvas style data value property. This is useful for\n    querying special/reserved <Graph.Node> canvas style data properties (i.e.\n    dollar prefixed properties that match with $canvas-<name of canvas style>).\n\n    Parameters:\n\n      prop  - (string) The name of the property. The dollar sign is not needed. For\n              example *getCanvasStyle(shadowBlur)* will return *data[$canvas-shadowBlur]*.\n      type  - (string) The type of the data property queried. Default's *current*. You can access *start* and *end* \n              data properties also.\n              \n    Example:\n    (start code js)\n      node.getCanvasStyle('shadowBlur');\n    (end code)\n    \n    See also:\n    \n    <Accessors.getData>\n    */\ngetCanvasStyle:function getCanvasStyle(prop,type,force){\nreturn getDataInternal.call(\nthis,'canvas',prop,type,force,this.Config.CanvasStyles);\n},\n\n/*\n    Method: setCanvasStyle\n\n    Sets the canvas style data property with some specific value.\n    This method is only useful for reserved (dollar prefixed) properties.\n    \n    Parameters:\n    \n    prop - (string) Name of the property. Can be any canvas property like 'shadowBlur', 'shadowColor', 'strokeStyle', etc.\n    value - (mixed) The value to set to the property.\n    type - (string) Default's *current*. Whether to set *start*, *current* or *end* type properties.\n    \n    Example:\n    \n    (start code js)\n     node.setCanvasStyle('shadowBlur', 30);\n    (end code)\n    \n    If we were to make an animation of a node/edge shadowBlur canvas style then we could do\n    \n    (start code js)\n      var node = viz.getNode('nodeId');\n      //set start and end values\n      node.setCanvasStyle('shadowBlur', 10, 'start');\n      node.setCanvasStyle('shadowBlur', 30, 'end');\n      //will animate nodes canvas style property for nodes\n      viz.fx.animate({\n        modes: ['node-style:shadowBlur'],\n        duration: 1000\n      });\n    (end code)\n    \n    See also:\n    \n    <Accessors.setData>.\n    */\nsetCanvasStyle:function setCanvasStyle(prop,value,type){\nsetDataInternal.call(this,'canvas',prop,value,type);\n},\n\n/*\n    Method: setCanvasStyles\n\n    Convenience method to set multiple styles at once.\n\n    Parameters:\n    \n    types - (array|string) A set of 'current', 'end' or 'start' values.\n    obj - (object) A hash containing the names and values of the properties to be altered.\n\n    See also:\n    \n    <Accessors.setDataset>.\n    */\nsetCanvasStyles:function setCanvasStyles(types,obj){\ntypes=$.splat(types);\nfor(var attr in obj){\nfor(var i=0,val=$.splat(obj[attr]),l=types.length;i<l;i++){\nthis.setCanvasStyle(attr,val[i],types[i]);\n}\n}\n},\n\n/*\n    Method: removeCanvasStyle\n\n    Remove canvas style properties from data.\n\n    Parameters:\n    \n    A variable number of canvas style strings.\n\n    See also:\n    \n    <Accessors.removeData>.\n    */\nremoveCanvasStyle:function removeCanvasStyle(){\nremoveDataInternal.call(this,'canvas',Array.prototype.slice.call(arguments));\n},\n\n/*\n    Method: getLabelData\n\n    Returns the specified label data value property. This is useful for\n    querying special/reserved <Graph.Node> label options (i.e.\n    dollar prefixed properties that match with $label-<name of label style>).\n\n    Parameters:\n\n      prop  - (string) The name of the property. The dollar sign prefix is not needed. For\n              example *getLabelData(size)* will return *data[$label-size]*.\n      type  - (string) The type of the data property queried. Default's *current*. You can access *start* and *end* \n              data properties also.\n              \n    See also:\n    \n    <Accessors.getData>.\n    */\ngetLabelData:function getLabelData(prop,type,force){\nreturn getDataInternal.call(\nthis,'label',prop,type,force,this.Label);\n},\n\n/*\n    Method: setLabelData\n\n    Sets the current label data with some specific value.\n    This method is only useful for reserved (dollar prefixed) properties.\n\n    Parameters:\n    \n    prop - (string) Name of the property. Can be any canvas property like 'shadowBlur', 'shadowColor', 'strokeStyle', etc.\n    value - (mixed) The value to set to the property.\n    type - (string) Default's *current*. Whether to set *start*, *current* or *end* type properties.\n    \n    Example:\n    \n    (start code js)\n     node.setLabelData('size', 30);\n    (end code)\n    \n    If we were to make an animation of a node label size then we could do\n    \n    (start code js)\n      var node = viz.getNode('nodeId');\n      //set start and end values\n      node.setLabelData('size', 10, 'start');\n      node.setLabelData('size', 30, 'end');\n      //will animate nodes label size\n      viz.fx.animate({\n        modes: ['label-property:size'],\n        duration: 1000\n      });\n    (end code)\n    \n    See also:\n    \n    <Accessors.setData>.\n    */\nsetLabelData:function setLabelData(prop,value,type){\nsetDataInternal.call(this,'label',prop,value,type);\n},\n\n/*\n    Method: setLabelDataset\n\n    Convenience function to set multiple label data at once.\n\n    Parameters:\n    \n    types - (array|string) A set of 'current', 'end' or 'start' values.\n    obj - (object) A hash containing the names and values of the properties to be altered.\n\n    See also:\n    \n    <Accessors.setDataset>.\n    */\nsetLabelDataset:function setLabelDataset(types,obj){\ntypes=$.splat(types);\nfor(var attr in obj){\nfor(var i=0,val=$.splat(obj[attr]),l=types.length;i<l;i++){\nthis.setLabelData(attr,val[i],types[i]);\n}\n}\n},\n\n/*\n    Method: removeLabelData\n\n    Remove label properties from data.\n    \n    Parameters:\n    \n    A variable number of label property strings.\n\n    See also:\n    \n    <Accessors.removeData>.\n    */\nremoveLabelData:function removeLabelData(){\nremoveDataInternal.call(this,'label',Array.prototype.slice.call(arguments));\n}};\n\n})();\n\n/*\n     Class: Graph.Node\n\n     A <Graph> node.\n     \n     Implements:\n     \n     <Accessors> methods.\n     \n     The following <Graph.Util> methods are implemented by <Graph.Node>\n     \n    - <Graph.Util.eachAdjacency>\n    - <Graph.Util.eachLevel>\n    - <Graph.Util.eachSubgraph>\n    - <Graph.Util.eachSubnode>\n    - <Graph.Util.anySubnode>\n    - <Graph.Util.getSubnodes>\n    - <Graph.Util.getParents>\n    - <Graph.Util.isDescendantOf>     \n*/\nGraph.Node=new Class({\n\ninitialize:function initialize(opt,klass,Node,Edge,Label){\nvar innerOptions={\n'id':'',\n'name':'',\n'data':{},\n'startData':{},\n'endData':{},\n'adjacencies':{},\n\n'selected':false,\n'drawn':false,\n'exist':false,\n\n'angleSpan':{\n'begin':0,\n'end':0},\n\n\n'pos':new klass(),\n'startPos':new klass(),\n'endPos':new klass()};\n\n\n$.extend(this,$.extend(innerOptions,opt));\nthis.Config=this.Node=Node;\nthis.Edge=Edge;\nthis.Label=Label;\n},\n\n/*\n       Method: adjacentTo\n    \n       Indicates if the node is adjacent to the node specified by id\n\n       Parameters:\n    \n          id - (string) A node id.\n    \n       Example:\n       (start code js)\n        node.adjacentTo('nodeId') == true;\n       (end code)\n    */\nadjacentTo:function adjacentTo(node){\nreturn node.id in this.adjacencies;\n},\n\n/*\n       Method: getAdjacency\n    \n       Returns a <Graph.Adjacence> object connecting the current <Graph.Node> and the node having *id* as id.\n\n       Parameters:\n    \n          id - (string) A node id.\n    */\ngetAdjacency:function getAdjacency(id){\nreturn this.adjacencies[id];\n},\n\n/*\n      Method: getPos\n   \n      Returns the position of the node.\n  \n      Parameters:\n   \n         type - (string) Default's *current*. Possible values are \"start\", \"end\" or \"current\".\n   \n      Returns:\n   \n        A <Complex> or <Polar> instance.\n  \n      Example:\n      (start code js)\n       var pos = node.getPos('end');\n      (end code)\n   */\ngetPos:function getPos(type){\ntype=type||\"current\";\nif(type==\"current\"){\nreturn this.pos;\n}else if(type==\"end\"){\nreturn this.endPos;\n}else if(type==\"start\"){\nreturn this.startPos;\n}\n},\n/*\n     Method: setPos\n  \n     Sets the node's position.\n  \n     Parameters:\n  \n        value - (object) A <Complex> or <Polar> instance.\n        type - (string) Default's *current*. Possible values are \"start\", \"end\" or \"current\".\n  \n     Example:\n     (start code js)\n      node.setPos(new $jit.Complex(0, 0), 'end');\n     (end code)\n  */\nsetPos:function setPos(value,type){\ntype=type||\"current\";\nvar pos;\nif(type==\"current\"){\npos=this.pos;\n}else if(type==\"end\"){\npos=this.endPos;\n}else if(type==\"start\"){\npos=this.startPos;\n}\npos.set(value);\n}});\n\n\nGraph.Node.implement(Accessors);\n\n/*\n     Class: Graph.Adjacence\n\n     A <Graph> adjacence (or edge) connecting two <Graph.Nodes>.\n     \n     Implements:\n     \n     <Accessors> methods.\n\n     See also:\n\n     <Graph>, <Graph.Node>\n\n     Properties:\n     \n      nodeFrom - A <Graph.Node> connected by this edge.\n      nodeTo - Another  <Graph.Node> connected by this edge.\n      data - Node data property containing a hash (i.e {}) with custom options.\n*/\nGraph.Adjacence=new Class({\n\ninitialize:function initialize(nodeFrom,nodeTo,data,Edge,Label){\nthis.nodeFrom=nodeFrom;\nthis.nodeTo=nodeTo;\nthis.data=data||{};\nthis.startData={};\nthis.endData={};\nthis.Config=this.Edge=Edge;\nthis.Label=Label;\n}});\n\n\nGraph.Adjacence.implement(Accessors);\n\n/*\n   Object: Graph.Util\n\n   <Graph> traversal and processing utility object.\n   \n   Note:\n   \n   For your convenience some of these methods have also been appended to <Graph> and <Graph.Node> classes.\n*/\nGraph.Util={\n/*\n       filter\n    \n       For internal use only. Provides a filtering function based on flags.\n    */\nfilter:function filter(param){\nif(!param||!($.type(param)=='string'))return function(){return true;};\nvar props=param.split(\" \");\nreturn function(elem){\nfor(var i=0;i<props.length;i++){\nif(elem[props[i]]){\nreturn false;\n}\n}\nreturn true;\n};\n},\n/*\n       Method: getNode\n    \n       Returns a <Graph.Node> by *id*.\n       \n       Also implemented by:\n       \n       <Graph>\n\n       Parameters:\n\n       graph - (object) A <Graph> instance.\n       id - (string) A <Graph.Node> id.\n\n       Example:\n\n       (start code js)\n         $jit.Graph.Util.getNode(graph, 'nodeid');\n         //or...\n         graph.getNode('nodeid');\n       (end code)\n    */\ngetNode:function getNode(graph,id){\nreturn graph.nodes[id];\n},\n\n/*\n       Method: eachNode\n    \n       Iterates over <Graph> nodes performing an *action*.\n       \n       Also implemented by:\n       \n       <Graph>.\n\n       Parameters:\n\n       graph - (object) A <Graph> instance.\n       action - (function) A callback function having a <Graph.Node> as first formal parameter.\n\n       Example:\n       (start code js)\n         $jit.Graph.Util.eachNode(graph, function(node) {\n          alert(node.name);\n         });\n         //or...\n         graph.eachNode(function(node) {\n           alert(node.name);\n         });\n       (end code)\n    */\neachNode:function eachNode(graph,action,flags){\nvar filter=this.filter(flags);\nfor(var i in graph.nodes){\nif(filter(graph.nodes[i]))action(graph.nodes[i]);\n}\n},\n\n/*\n      Method: each\n   \n      Iterates over <Graph> nodes performing an *action*. It's an alias for <Graph.Util.eachNode>.\n      \n      Also implemented by:\n      \n      <Graph>.\n  \n      Parameters:\n  \n      graph - (object) A <Graph> instance.\n      action - (function) A callback function having a <Graph.Node> as first formal parameter.\n  \n      Example:\n      (start code js)\n        $jit.Graph.Util.each(graph, function(node) {\n         alert(node.name);\n        });\n        //or...\n        graph.each(function(node) {\n          alert(node.name);\n        });\n      (end code)\n   */\neach:function each(graph,action,flags){\nthis.eachNode(graph,action,flags);\n},\n\n/*\n       Method: eachAdjacency\n    \n       Iterates over <Graph.Node> adjacencies applying the *action* function.\n       \n       Also implemented by:\n       \n       <Graph.Node>.\n\n       Parameters:\n\n       node - (object) A <Graph.Node>.\n       action - (function) A callback function having <Graph.Adjacence> as first formal parameter.\n\n       Example:\n       (start code js)\n         $jit.Graph.Util.eachAdjacency(node, function(adj) {\n          alert(adj.nodeTo.name);\n         });\n         //or...\n         node.eachAdjacency(function(adj) {\n           alert(adj.nodeTo.name);\n         });\n       (end code)\n    */\neachAdjacency:function eachAdjacency(node,action,flags){\nvar adj=node.adjacencies,filter=this.filter(flags);\nfor(var id in adj){\nvar a=adj[id];\nif(filter(a)){\nif(a.nodeFrom!=node){\nvar tmp=a.nodeFrom;\na.nodeFrom=a.nodeTo;\na.nodeTo=tmp;\n}\naction(a,id);\n}\n}\n},\n\n/*\n       Method: computeLevels\n    \n       Performs a BFS traversal setting the correct depth for each node.\n        \n       Also implemented by:\n       \n       <Graph>.\n       \n       Note:\n       \n       The depth of each node can then be accessed by \n       >node._depth\n\n       Parameters:\n\n       graph - (object) A <Graph>.\n       id - (string) A starting node id for the BFS traversal.\n       startDepth - (optional|number) A minimum depth value. Default's 0.\n\n    */\ncomputeLevels:function computeLevels(graph,id,startDepth,flags){\nstartDepth=startDepth||0;\nvar filter=this.filter(flags);\nthis.eachNode(graph,function(elem){\nelem._flag=false;\nelem._depth=-1;\n},flags);\nvar root=graph.getNode(id);\nroot._depth=startDepth;\nvar queue=[root];\nwhile(queue.length!=0){\nvar node=queue.pop();\nnode._flag=true;\nthis.eachAdjacency(node,function(adj){\nvar n=adj.nodeTo;\nif(n._flag==false&&filter(n)){\nif(n._depth<0)n._depth=node._depth+1+startDepth;\nqueue.unshift(n);\n}\n},flags);\n}\n},\n\n/*\n       Method: eachBFS\n    \n       Performs a BFS traversal applying *action* to each <Graph.Node>.\n       \n       Also implemented by:\n       \n       <Graph>.\n\n       Parameters:\n\n       graph - (object) A <Graph>.\n       id - (string) A starting node id for the BFS traversal.\n       action - (function) A callback function having a <Graph.Node> as first formal parameter.\n\n       Example:\n       (start code js)\n         $jit.Graph.Util.eachBFS(graph, 'mynodeid', function(node) {\n          alert(node.name);\n         });\n         //or...\n         graph.eachBFS('mynodeid', function(node) {\n           alert(node.name);\n         });\n       (end code)\n    */\neachBFS:function eachBFS(graph,id,action,flags){\nvar filter=this.filter(flags);\nthis.clean(graph);\nvar queue=[graph.getNode(id)];\nwhile(queue.length!=0){\nvar node=queue.pop();\nnode._flag=true;\naction(node,node._depth);\nthis.eachAdjacency(node,function(adj){\nvar n=adj.nodeTo;\nif(n._flag==false&&filter(n)){\nn._flag=true;\nqueue.unshift(n);\n}\n},flags);\n}\n},\n\n/*\n       Method: eachLevel\n    \n       Iterates over a node's subgraph applying *action* to the nodes of relative depth between *levelBegin* and *levelEnd*.\n       \n       Also implemented by:\n       \n       <Graph.Node>.\n\n       Parameters:\n       \n       node - (object) A <Graph.Node>.\n       levelBegin - (number) A relative level value.\n       levelEnd - (number) A relative level value.\n       action - (function) A callback function having a <Graph.Node> as first formal parameter.\n\n    */\neachLevel:function eachLevel(node,levelBegin,levelEnd,action,flags){\nvar d=node._depth,filter=this.filter(flags),that=this;\nlevelEnd=levelEnd===false?Number.MAX_VALUE-d:levelEnd;\n(function loopLevel(node,levelBegin,levelEnd){\nvar d=node._depth;\nif(d>=levelBegin&&d<=levelEnd&&filter(node))action(node,d);\nif(d<levelEnd){\nthat.eachAdjacency(node,function(adj){\nvar n=adj.nodeTo;\nif(n._depth>d)loopLevel(n,levelBegin,levelEnd);\n});\n}\n})(node,levelBegin+d,levelEnd+d);\n},\n\n/*\n       Method: eachSubgraph\n    \n       Iterates over a node's children recursively.\n       \n       Also implemented by:\n       \n       <Graph.Node>.\n\n       Parameters:\n       node - (object) A <Graph.Node>.\n       action - (function) A callback function having a <Graph.Node> as first formal parameter.\n\n       Example:\n       (start code js)\n         $jit.Graph.Util.eachSubgraph(node, function(node) {\n           alert(node.name);\n         });\n         //or...\n         node.eachSubgraph(function(node) {\n           alert(node.name);\n         });\n       (end code)\n    */\neachSubgraph:function eachSubgraph(node,action,flags){\nthis.eachLevel(node,0,false,action,flags);\n},\n\n/*\n       Method: eachSubnode\n    \n       Iterates over a node's children (without deeper recursion).\n       \n       Also implemented by:\n       \n       <Graph.Node>.\n       \n       Parameters:\n       node - (object) A <Graph.Node>.\n       action - (function) A callback function having a <Graph.Node> as first formal parameter.\n\n       Example:\n       (start code js)\n         $jit.Graph.Util.eachSubnode(node, function(node) {\n          alert(node.name);\n         });\n         //or...\n         node.eachSubnode(function(node) {\n           alert(node.name);\n         });\n       (end code)\n    */\neachSubnode:function eachSubnode(node,action,flags){\nthis.eachLevel(node,1,1,action,flags);\n},\n\n/*\n       Method: anySubnode\n    \n       Returns *true* if any subnode matches the given condition.\n       \n       Also implemented by:\n       \n       <Graph.Node>.\n\n       Parameters:\n       node - (object) A <Graph.Node>.\n       cond - (function) A callback function returning a Boolean instance. This function has as first formal parameter a <Graph.Node>.\n\n       Example:\n       (start code js)\n         $jit.Graph.Util.anySubnode(node, function(node) { return node.name == \"mynodename\"; });\n         //or...\n         node.anySubnode(function(node) { return node.name == 'mynodename'; });\n       (end code)\n    */\nanySubnode:function anySubnode(node,cond,flags){\nvar flag=false;\ncond=cond||$.lambda(true);\nvar c=$.type(cond)=='string'?function(n){return n[cond];}:cond;\nthis.eachSubnode(node,function(elem){\nif(c(elem))flag=true;\n},flags);\nreturn flag;\n},\n\n/*\n       Method: getSubnodes\n    \n       Collects all subnodes for a specified node. \n       The *level* parameter filters nodes having relative depth of *level* from the root node. \n       \n       Also implemented by:\n       \n       <Graph.Node>.\n\n       Parameters:\n       node - (object) A <Graph.Node>.\n       level - (optional|number) Default's *0*. A starting relative depth for collecting nodes.\n\n       Returns:\n       An array of nodes.\n\n    */\ngetSubnodes:function getSubnodes(node,level,flags){\nvar ans=[],that=this;\nlevel=level||0;\nvar levelStart,levelEnd;\nif($.type(level)=='array'){\nlevelStart=level[0];\nlevelEnd=level[1];\n}else{\nlevelStart=level;\nlevelEnd=Number.MAX_VALUE-node._depth;\n}\nthis.eachLevel(node,levelStart,levelEnd,function(n){\nans.push(n);\n},flags);\nreturn ans;\n},\n\n\n/*\n       Method: getParents\n    \n       Returns an Array of <Graph.Nodes> which are parents of the given node.\n       \n       Also implemented by:\n       \n       <Graph.Node>.\n\n       Parameters:\n       node - (object) A <Graph.Node>.\n\n       Returns:\n       An Array of <Graph.Nodes>.\n\n       Example:\n       (start code js)\n         var pars = $jit.Graph.Util.getParents(node);\n         //or...\n         var pars = node.getParents();\n         \n         if(pars.length > 0) {\n           //do stuff with parents\n         }\n       (end code)\n    */\ngetParents:function getParents(node){\nvar ans=[];\nthis.eachAdjacency(node,function(adj){\nvar n=adj.nodeTo;\nif(n._depth<node._depth)ans.push(n);\n});\nreturn ans;\n},\n\n/*\n    Method: isDescendantOf\n \n    Returns a boolean indicating if some node is descendant of the node with the given id. \n\n    Also implemented by:\n    \n    <Graph.Node>.\n    \n    \n    Parameters:\n    node - (object) A <Graph.Node>.\n    id - (string) A <Graph.Node> id.\n\n    Example:\n    (start code js)\n      $jit.Graph.Util.isDescendantOf(node, \"nodeid\"); //true|false\n      //or...\n      node.isDescendantOf('nodeid');//true|false\n    (end code)\n */\nisDescendantOf:function isDescendantOf(node,id){\nif(node.id==id)return true;\nvar pars=this.getParents(node),ans=false;\nfor(var i=0;!ans&&i<pars.length;i++){\nans=ans||this.isDescendantOf(pars[i],id);\n}\nreturn ans;\n},\n\n/*\n     Method: clean\n  \n     Cleans flags from nodes.\n\n     Also implemented by:\n     \n     <Graph>.\n     \n     Parameters:\n     graph - A <Graph> instance.\n  */\nclean:function clean(graph){this.eachNode(graph,function(elem){elem._flag=false;});},\n\n/* \n    Method: getClosestNodeToOrigin \n  \n    Returns the closest node to the center of canvas.\n  \n    Also implemented by:\n    \n    <Graph>.\n    \n    Parameters:\n   \n     graph - (object) A <Graph> instance.\n     prop - (optional|string) Default's 'current'. A <Graph.Node> position property. Possible properties are 'start', 'current' or 'end'.\n  \n  */\ngetClosestNodeToOrigin:function getClosestNodeToOrigin(graph,prop,flags){\nreturn this.getClosestNodeToPos(graph,Polar.KER,prop,flags);\n},\n\n/* \n    Method: getClosestNodeToPos\n  \n    Returns the closest node to the given position.\n  \n    Also implemented by:\n    \n    <Graph>.\n    \n    Parameters:\n   \n     graph - (object) A <Graph> instance.\n     pos - (object) A <Complex> or <Polar> instance.\n     prop - (optional|string) Default's *current*. A <Graph.Node> position property. Possible properties are 'start', 'current' or 'end'.\n  \n  */\ngetClosestNodeToPos:function getClosestNodeToPos(graph,pos,prop,flags){\nvar node=null;\nprop=prop||'current';\npos=pos&&pos.getc(true)||Complex.KER;\nvar distance=function distance(a,b){\nvar d1=a.x-b.x,d2=a.y-b.y;\nreturn d1*d1+d2*d2;\n};\nthis.eachNode(graph,function(elem){\nnode=node==null||distance(elem.getPos(prop).getc(true),pos)<distance(\nnode.getPos(prop).getc(true),pos)?elem:node;\n},flags);\nreturn node;\n}};\n\n\n//Append graph methods to <Graph>\n$.each(['get','getNode','each','eachNode','computeLevels','eachBFS','clean','getClosestNodeToPos','getClosestNodeToOrigin'],function(m){\nGraph.prototype[m]=function(){\nreturn Graph.Util[m].apply(Graph.Util,[this].concat(Array.prototype.slice.call(arguments)));\n};\n});\n\n//Append node methods to <Graph.Node>\n$.each(['eachAdjacency','eachLevel','eachSubgraph','eachSubnode','anySubnode','getSubnodes','getParents','isDescendantOf'],function(m){\nGraph.Node.prototype[m]=function(){\nreturn Graph.Util[m].apply(Graph.Util,[this].concat(Array.prototype.slice.call(arguments)));\n};\n});\n\n/*\n * File: Graph.Op.js\n *\n*/\n\n/*\n   Object: Graph.Op\n\n   Perform <Graph> operations like adding/removing <Graph.Nodes> or <Graph.Adjacences>, \n   morphing a <Graph> into another <Graph>, contracting or expanding subtrees, etc.\n\n*/\nGraph.Op={\n\noptions:{\ntype:'nothing',\nduration:2000,\nhideLabels:true,\nfps:30},\n\n\ninitialize:function initialize(viz){\nthis.viz=viz;\n},\n\n/*\n       Method: removeNode\n    \n       Removes one or more <Graph.Nodes> from the visualization. \n       It can also perform several animations like fading sequentially, fading concurrently, iterating or replotting.\n\n       Parameters:\n    \n        node - (string|array) The node's id. Can also be an array having many ids.\n        opt - (object) Animation options. It's an object with optional properties described below\n        type - (string) Default's *nothing*. Type of the animation. Can be \"nothing\", \"replot\", \"fade:seq\",  \"fade:con\" or \"iter\".\n        duration - Described in <Options.Fx>.\n        fps - Described in <Options.Fx>.\n        transition - Described in <Options.Fx>.\n        hideLabels - (boolean) Default's *true*. Hide labels during the animation.\n   \n      Example:\n      (start code js)\n        var viz = new $jit.Viz(options);\n        viz.op.removeNode('nodeId', {\n          type: 'fade:seq',\n          duration: 1000,\n          hideLabels: false,\n          transition: $jit.Trans.Quart.easeOut\n        });\n        //or also\n        viz.op.removeNode(['someId', 'otherId'], {\n          type: 'fade:con',\n          duration: 1500\n        });\n      (end code)\n    */\n\nremoveNode:function removeNode(node,opt){\nvar viz=this.viz;\nvar options=$.merge(this.options,viz.controller,opt);\nvar n=$.splat(node);\nvar i,that,nodeObj;\nswitch(options.type){\ncase'nothing':\nfor(i=0;i<n.length;i++){viz.graph.removeNode(n[i]);}\nbreak;\n\ncase'replot':\nthis.removeNode(n,{type:'nothing'});\nviz.labels.clearLabels();\nviz.refresh(true);\nbreak;\n\ncase'fade:seq':case'fade':\nthat=this;\n//set alpha to 0 for nodes to remove.\nfor(i=0;i<n.length;i++){\nnodeObj=viz.graph.getNode(n[i]);\nnodeObj.setData('alpha',0,'end');\n}\nviz.fx.animate($.merge(options,{\nmodes:['node-property:alpha'],\nonComplete:function onComplete(){\nthat.removeNode(n,{type:'nothing'});\nviz.labels.clearLabels();\nviz.reposition();\nviz.fx.animate($.merge(options,{\nmodes:['linear']}));\n\n}}));\n\nbreak;\n\ncase'fade:con':\nthat=this;\n//set alpha to 0 for nodes to remove. Tag them for being ignored on computing positions.\nfor(i=0;i<n.length;i++){\nnodeObj=viz.graph.getNode(n[i]);\nnodeObj.setData('alpha',0,'end');\nnodeObj.ignore=true;\n}\nviz.reposition();\nviz.fx.animate($.merge(options,{\nmodes:['node-property:alpha','linear'],\nonComplete:function onComplete(){\nthat.removeNode(n,{type:'nothing'});\noptions.onComplete&&options.onComplete();\n}}));\n\nbreak;\n\ncase'iter':\nthat=this;\nviz.fx.sequence({\ncondition:function condition(){return n.length!=0;},\nstep:function step(){that.removeNode(n.shift(),{type:'nothing'});viz.labels.clearLabels();},\nonComplete:function onComplete(){options.onComplete&&options.onComplete();},\nduration:Math.ceil(options.duration/n.length)});\n\nbreak;\n\ndefault:this.doError();}\n\n},\n\n/*\n       Method: removeEdge\n    \n       Removes one or more <Graph.Adjacences> from the visualization. \n       It can also perform several animations like fading sequentially, fading concurrently, iterating or replotting.\n\n       Parameters:\n    \n       vertex - (array) An array having two strings which are the ids of the nodes connected by this edge (i.e ['id1', 'id2']). Can also be a two dimensional array holding many edges (i.e [['id1', 'id2'], ['id3', 'id4'], ...]).\n       opt - (object) Animation options. It's an object with optional properties described below\n       type - (string) Default's *nothing*. Type of the animation. Can be \"nothing\", \"replot\", \"fade:seq\",  \"fade:con\" or \"iter\".\n       duration - Described in <Options.Fx>.\n       fps - Described in <Options.Fx>.\n       transition - Described in <Options.Fx>.\n       hideLabels - (boolean) Default's *true*. Hide labels during the animation.\n   \n      Example:\n      (start code js)\n        var viz = new $jit.Viz(options);\n        viz.op.removeEdge(['nodeId', 'otherId'], {\n          type: 'fade:seq',\n          duration: 1000,\n          hideLabels: false,\n          transition: $jit.Trans.Quart.easeOut\n        });\n        //or also\n        viz.op.removeEdge([['someId', 'otherId'], ['id3', 'id4']], {\n          type: 'fade:con',\n          duration: 1500\n        });\n      (end code)\n    \n    */\nremoveEdge:function removeEdge(vertex,opt){\nvar viz=this.viz;\nvar options=$.merge(this.options,viz.controller,opt);\nvar v=$.type(vertex[0])=='string'?[vertex]:vertex;\nvar i,that,adj;\nswitch(options.type){\ncase'nothing':\nfor(i=0;i<v.length;i++){viz.graph.removeAdjacence(v[i][0],v[i][1]);}\nbreak;\n\ncase'replot':\nthis.removeEdge(v,{type:'nothing'});\nviz.refresh(true);\nbreak;\n\ncase'fade:seq':case'fade':\nthat=this;\n//set alpha to 0 for edges to remove.\nfor(i=0;i<v.length;i++){\nadj=viz.graph.getAdjacence(v[i][0],v[i][1]);\nif(adj){\nadj.setData('alpha',0,'end');\n}\n}\nviz.fx.animate($.merge(options,{\nmodes:['edge-property:alpha'],\nonComplete:function onComplete(){\nthat.removeEdge(v,{type:'nothing'});\nviz.reposition();\nviz.fx.animate($.merge(options,{\nmodes:['linear']}));\n\n}}));\n\nbreak;\n\ncase'fade:con':\nthat=this;\n//set alpha to 0 for nodes to remove. Tag them for being ignored when computing positions.\nfor(i=0;i<v.length;i++){\nadj=viz.graph.getAdjacence(v[i][0],v[i][1]);\nif(adj){\nadj.setData('alpha',0,'end');\nadj.ignore=true;\n}\n}\nviz.reposition();\nviz.fx.animate($.merge(options,{\nmodes:['edge-property:alpha','linear'],\nonComplete:function onComplete(){\nthat.removeEdge(v,{type:'nothing'});\noptions.onComplete&&options.onComplete();\n}}));\n\nbreak;\n\ncase'iter':\nthat=this;\nviz.fx.sequence({\ncondition:function condition(){return v.length!=0;},\nstep:function step(){that.removeEdge(v.shift(),{type:'nothing'});viz.labels.clearLabels();},\nonComplete:function onComplete(){options.onComplete();},\nduration:Math.ceil(options.duration/v.length)});\n\nbreak;\n\ndefault:this.doError();}\n\n},\n\n/*\n       Method: sum\n    \n       Adds a new graph to the visualization. \n       The JSON graph (or tree) must at least have a common node with the current graph plotted by the visualization. \n       The resulting graph can be defined as follows <http://mathworld.wolfram.com/GraphSum.html>\n\n       Parameters:\n    \n       json - (object) A json tree or graph structure. See also <Loader.loadJSON>.\n       opt - (object) Animation options. It's an object with optional properties described below\n       type - (string) Default's *nothing*. Type of the animation. Can be \"nothing\", \"replot\", \"fade:seq\",  \"fade:con\".\n       duration - Described in <Options.Fx>.\n       fps - Described in <Options.Fx>.\n       transition - Described in <Options.Fx>.\n       hideLabels - (boolean) Default's *true*. Hide labels during the animation.\n   \n      Example:\n      (start code js)\n        //...json contains a tree or graph structure...\n\n        var viz = new $jit.Viz(options);\n        viz.op.sum(json, {\n          type: 'fade:seq',\n          duration: 1000,\n          hideLabels: false,\n          transition: $jit.Trans.Quart.easeOut\n        });\n        //or also\n        viz.op.sum(json, {\n          type: 'fade:con',\n          duration: 1500\n        });\n      (end code)\n    \n    */\nsum:function sum(json,opt){\nvar viz=this.viz;\nvar options=$.merge(this.options,viz.controller,opt),root=viz.root;\nvar graph;\nviz.root=opt.id||viz.root;\nswitch(options.type){\ncase'nothing':\ngraph=viz.construct(json);\ngraph.eachNode(function(elem){\nelem.eachAdjacency(function(adj){\nviz.graph.addAdjacence(adj.nodeFrom,adj.nodeTo,adj.data);\n});\n});\nbreak;\n\ncase'replot':\nviz.refresh(true);\nthis.sum(json,{type:'nothing'});\nviz.refresh(true);\nbreak;\n\ncase'fade:seq':case'fade':case'fade:con':\n// START METAMAPS CODE\nvar that=this;\n// ORIGINAL CODE:\n// that = this;\n// END METAMAPS CODE\ngraph=viz.construct(json);\n\n//set alpha to 0 for nodes to add.\nvar fadeEdges=this.preprocessSum(graph);\nvar modes=!fadeEdges?['node-property:alpha']:['node-property:alpha','edge-property:alpha'];\nviz.reposition();\nif(options.type!='fade:con'){\nviz.fx.animate($.merge(options,{\nmodes:['linear'],\nonComplete:function onComplete(){\nviz.fx.animate($.merge(options,{\nmodes:modes,\nonComplete:function onComplete(){\noptions.onComplete();\n}}));\n\n}}));\n\n}else{\nviz.graph.eachNode(function(elem){\nif(elem.id!=root&&elem.pos.isZero()){\nelem.pos.set(elem.endPos);\nelem.startPos.set(elem.endPos);\n}\n});\nviz.fx.animate($.merge(options,{\nmodes:['linear'].concat(modes)}));\n\n}\nbreak;\n\ndefault:this.doError();}\n\n},\n\n/*\n       Method: morph\n    \n       This method will transform the current visualized graph into the new JSON representation passed in the method. \n       The JSON object must at least have the root node in common with the current visualized graph.\n\n       Parameters:\n    \n       json - (object) A json tree or graph structure. See also <Loader.loadJSON>.\n       opt - (object) Animation options. It's an object with optional properties described below\n       type - (string) Default's *nothing*. Type of the animation. Can be \"nothing\", \"replot\", \"fade:con\".\n       duration - Described in <Options.Fx>.\n       fps - Described in <Options.Fx>.\n       transition - Described in <Options.Fx>.\n       hideLabels - (boolean) Default's *true*. Hide labels during the animation.\n       id - (string) The shared <Graph.Node> id between both graphs.\n       \n       extraModes - (optional|object) When morphing with an animation, dollar prefixed data parameters are added to \n                    *endData* and not *data* itself. This way you can animate dollar prefixed parameters during your morphing operation. \n                    For animating these extra-parameters you have to specify an object that has animation groups as keys and animation \n                    properties as values, just like specified in <Graph.Plot.animate>.\n   \n      Example:\n      (start code js)\n        //...json contains a tree or graph structure...\n\n        var viz = new $jit.Viz(options);\n        viz.op.morph(json, {\n          type: 'fade',\n          duration: 1000,\n          hideLabels: false,\n          transition: $jit.Trans.Quart.easeOut\n        });\n        //or also\n        viz.op.morph(json, {\n          type: 'fade',\n          duration: 1500\n        });\n        //if the json data contains dollar prefixed params\n        //like $width or $height these too can be animated\n        viz.op.morph(json, {\n          type: 'fade',\n          duration: 1500\n        }, {\n          'node-property': ['width', 'height']\n        });\n      (end code)\n    \n    */\nmorph:function morph(json,opt,extraModes){\nextraModes=extraModes||{};\nvar viz=this.viz;\nvar options=$.merge(this.options,viz.controller,opt),root=viz.root;\nvar graph;\n//TODO(nico) this hack makes morphing work with the Hypertree. \n//Need to check if it has been solved and this can be removed.\nviz.root=opt.id||viz.root;\nswitch(options.type){\ncase'nothing':\ngraph=viz.construct(json);\ngraph.eachNode(function(elem){\nvar nodeExists=viz.graph.hasNode(elem.id);\nelem.eachAdjacency(function(adj){\nvar adjExists=!!viz.graph.getAdjacence(adj.nodeFrom.id,adj.nodeTo.id);\nviz.graph.addAdjacence(adj.nodeFrom,adj.nodeTo,adj.data);\n//Update data properties if the node existed\nif(adjExists){\nvar addedAdj=viz.graph.getAdjacence(adj.nodeFrom.id,adj.nodeTo.id);\nfor(var prop in adj.data||{}){\naddedAdj.data[prop]=adj.data[prop];\n}\n}\n});\n//Update data properties if the node existed\nif(nodeExists){\nvar addedNode=viz.graph.getNode(elem.id);\nfor(var prop in elem.data||{}){\naddedNode.data[prop]=elem.data[prop];\n}\n}\n});\nviz.graph.eachNode(function(elem){\nelem.eachAdjacency(function(adj){\nif(!graph.getAdjacence(adj.nodeFrom.id,adj.nodeTo.id)){\nviz.graph.removeAdjacence(adj.nodeFrom.id,adj.nodeTo.id);\n}\n});\nif(!graph.hasNode(elem.id))viz.graph.removeNode(elem.id);\n});\n\nbreak;\n\ncase'replot':\nviz.labels.clearLabels(true);\nthis.morph(json,{type:'nothing'});\nviz.refresh(true);\nviz.refresh(true);\nbreak;\n\ncase'fade:seq':case'fade':case'fade:con':\n// START METAMAPS CODE\nvar that=this;\n// ORIGINAL CODE:\n// that = this;\n// END METAMAPS CODE\ngraph=viz.construct(json);\n//preprocessing for nodes to delete.\n//get node property modes to interpolate\nvar nodeModes='node-property'in extraModes&&\n$.map($.splat(extraModes['node-property']),\nfunction(n){return'$'+n;});\nviz.graph.eachNode(function(elem){\nvar graphNode=graph.getNode(elem.id);\nif(!graphNode){\nelem.setData('alpha',1);\nelem.setData('alpha',1,'start');\nelem.setData('alpha',0,'end');\nelem.ignore=true;\n}else{\n//Update node data information\nvar graphNodeData=graphNode.data;\nfor(var prop in graphNodeData){\nif(nodeModes&&$.indexOf(nodeModes,prop)>-1){\nelem.endData[prop]=graphNodeData[prop];\n}else{\nelem.data[prop]=graphNodeData[prop];\n}\n}\n}\n});\nviz.graph.eachNode(function(elem){\nif(elem.ignore)return;\nelem.eachAdjacency(function(adj){\nif(adj.nodeFrom.ignore||adj.nodeTo.ignore)return;\nvar nodeFrom=graph.getNode(adj.nodeFrom.id);\nvar nodeTo=graph.getNode(adj.nodeTo.id);\nif(!nodeFrom.adjacentTo(nodeTo)){\nvar adj=viz.graph.getAdjacence(nodeFrom.id,nodeTo.id);\nfadeEdges=true;\nadj.setData('alpha',1);\nadj.setData('alpha',1,'start');\nadj.setData('alpha',0,'end');\n}\n});\n});\n//preprocessing for adding nodes.\nvar fadeEdges=this.preprocessSum(graph);\n\nvar modes=!fadeEdges?['node-property:alpha']:\n['node-property:alpha',\n'edge-property:alpha'];\n//Append extra node-property animations (if any)\nmodes[0]=modes[0]+('node-property'in extraModes?\n':'+$.splat(extraModes['node-property']).join(':'):'');\n//Append extra edge-property animations (if any)\nmodes[1]=(modes[1]||'edge-property:alpha')+('edge-property'in extraModes?\n':'+$.splat(extraModes['edge-property']).join(':'):'');\n//Add label-property animations (if any)\nif('label-property'in extraModes){\nmodes.push('label-property:'+$.splat(extraModes['label-property']).join(':'));\n}\n//only use reposition if its implemented.\nif(viz.reposition){\nviz.reposition();\n}else{\nviz.compute('end');\n}\nviz.graph.eachNode(function(elem){\nif(elem.id!=root&&elem.pos.getp().equals(Polar.KER)){\nelem.pos.set(elem.endPos);elem.startPos.set(elem.endPos);\n}\n});\nviz.fx.animate($.merge(options,{\nmodes:[extraModes.position||'polar'].concat(modes),\nonComplete:function onComplete(){\nviz.graph.eachNode(function(elem){\nif(elem.ignore)viz.graph.removeNode(elem.id);\n});\nviz.graph.eachNode(function(elem){\nelem.eachAdjacency(function(adj){\nif(adj.ignore)viz.graph.removeAdjacence(adj.nodeFrom.id,adj.nodeTo.id);\n});\n});\noptions.onComplete();\n}}));\n\nbreak;\n\ndefault:;}\n\n},\n\n\n/*\n    Method: contract\n \n    Collapses the subtree of the given node. The node will have a _collapsed=true_ property.\n    \n    Parameters:\n \n    node - (object) A <Graph.Node>.\n    opt - (object) An object containing options described below\n    type - (string) Whether to 'replot' or 'animate' the contraction.\n   \n    There are also a number of Animation options. For more information see <Options.Fx>.\n\n    Example:\n    (start code js)\n     var viz = new $jit.Viz(options);\n     viz.op.contract(node, {\n       type: 'animate',\n       duration: 1000,\n       hideLabels: true,\n       transition: $jit.Trans.Quart.easeOut\n     });\n   (end code)\n \n   */\ncontract:function contract(node,opt){\nvar viz=this.viz;\nif(node.collapsed||!node.anySubnode($.lambda(true)))return;\nopt=$.merge(this.options,viz.config,opt||{},{\n'modes':['node-property:alpha:span','linear']});\n\nnode.collapsed=true;\n(function subn(n){\nn.eachSubnode(function(ch){\nch.ignore=true;\nch.setData('alpha',0,opt.type=='animate'?'end':'current');\nsubn(ch);\n});\n})(node);\nif(opt.type=='animate'){\nviz.compute('end');\nif(viz.rotated){\nviz.rotate(viz.rotated,'none',{\n'property':'end'});\n\n}\n(function subn(n){\nn.eachSubnode(function(ch){\nch.setPos(node.getPos('end'),'end');\nsubn(ch);\n});\n})(node);\nviz.fx.animate(opt);\n}else if(opt.type=='replot'){\nviz.refresh();\n}\n},\n\n/*\n    Method: expand\n \n    Expands the previously contracted subtree. The given node must have the _collapsed=true_ property.\n    \n    Parameters:\n \n    node - (object) A <Graph.Node>.\n    opt - (object) An object containing options described below\n    type - (string) Whether to 'replot' or 'animate'.\n     \n    There are also a number of Animation options. For more information see <Options.Fx>.\n\n    Example:\n    (start code js)\n      var viz = new $jit.Viz(options);\n      viz.op.expand(node, {\n        type: 'animate',\n        duration: 1000,\n        hideLabels: true,\n        transition: $jit.Trans.Quart.easeOut\n      });\n    (end code)\n \n   */\nexpand:function expand(node,opt){\nif(!('collapsed'in node))return;\nvar viz=this.viz;\nopt=$.merge(this.options,viz.config,opt||{},{\n'modes':['node-property:alpha:span','linear']});\n\ndelete node.collapsed;\n(function subn(n){\nn.eachSubnode(function(ch){\ndelete ch.ignore;\nch.setData('alpha',1,opt.type=='animate'?'end':'current');\nsubn(ch);\n});\n})(node);\nif(opt.type=='animate'){\nviz.compute('end');\nif(viz.rotated){\nviz.rotate(viz.rotated,'none',{\n'property':'end'});\n\n}\nviz.fx.animate(opt);\n}else if(opt.type=='replot'){\nviz.refresh();\n}\n},\n\npreprocessSum:function preprocessSum(graph){\nvar viz=this.viz;\ngraph.eachNode(function(elem){\nif(!viz.graph.hasNode(elem.id)){\nviz.graph.addNode(elem);\nvar n=viz.graph.getNode(elem.id);\nn.setData('alpha',0);\nn.setData('alpha',0,'start');\nn.setData('alpha',1,'end');\n}\n});\nvar fadeEdges=false;\ngraph.eachNode(function(elem){\nelem.eachAdjacency(function(adj){\nvar nodeFrom=viz.graph.getNode(adj.nodeFrom.id);\nvar nodeTo=viz.graph.getNode(adj.nodeTo.id);\nif(!nodeFrom.adjacentTo(nodeTo)){\nvar adj=viz.graph.addAdjacence(nodeFrom,nodeTo,adj.data);\nif(nodeFrom.startAlpha==nodeFrom.endAlpha&&\nnodeTo.startAlpha==nodeTo.endAlpha){\nfadeEdges=true;\nadj.setData('alpha',0);\nadj.setData('alpha',0,'start');\nadj.setData('alpha',1,'end');\n}\n}\n});\n});\nreturn fadeEdges;\n}};\n\n\n\n\n/*\n   File: Helpers.js\n \n   Helpers are objects that contain rendering primitives (like rectangles, ellipses, etc), for plotting nodes and edges.\n   Helpers also contain implementations of the *contains* method, a method returning a boolean indicating whether the mouse\n   position is over the rendered shape.\n   \n   Helpers are very useful when implementing new NodeTypes, since you can access them through *this.nodeHelper* and \n   *this.edgeHelper* <Graph.Plot> properties, providing you with simple primitives and mouse-position check functions.\n   \n   Example:\n   (start code js)\n   //implement a new node type\n   $jit.Viz.Plot.NodeTypes.implement({\n     'customNodeType': {\n       'render': function(node, canvas) {\n         this.nodeHelper.circle.render ...\n       },\n       'contains': function(node, pos) {\n         this.nodeHelper.circle.contains ...\n       }\n     }\n   });\n   //implement an edge type\n   $jit.Viz.Plot.EdgeTypes.implement({\n     'customNodeType': {\n       'render': function(node, canvas) {\n         this.edgeHelper.circle.render ...\n       },\n       //optional\n       'contains': function(node, pos) {\n         this.edgeHelper.circle.contains ...\n       }\n     }\n   });\n   (end code)\n\n*/\n\n/*\n   Object: NodeHelper\n   \n   Contains rendering and other type of primitives for simple shapes.\n */\nvar NodeHelper={\n'none':{\n'render':$.empty,\n'contains':$.lambda(false)},\n\n/*\n   Object: NodeHelper.circle\n   */\n'circle':{\n/*\n     Method: render\n     \n     Renders a circle into the canvas.\n     \n     Parameters:\n     \n     type - (string) Possible options are 'fill' or 'stroke'.\n     pos - (object) An *x*, *y* object with the position of the center of the circle.\n     radius - (number) The radius of the circle to be rendered.\n     canvas - (object) A <Canvas> instance.\n     \n     Example:\n     (start code js)\n     NodeHelper.circle.render('fill', { x: 10, y: 30 }, 30, viz.canvas);\n     (end code)\n     */\n'render':function render(type,pos,radius,canvas){\nvar ctx=canvas.getCtx();\nctx.beginPath();\nctx.arc(pos.x,pos.y,radius,0,Math.PI*2,true);\nctx.closePath();\nctx[type]();\n},\n/*\n    Method: contains\n    \n    Returns *true* if *pos* is contained in the area of the shape. Returns *false* otherwise.\n    \n    Parameters:\n    \n    npos - (object) An *x*, *y* object with the <Graph.Node> position.\n    pos - (object) An *x*, *y* object with the position to check.\n    radius - (number) The radius of the rendered circle.\n    \n    Example:\n    (start code js)\n    NodeHelper.circle.contains({ x: 10, y: 30 }, { x: 15, y: 35 }, 30); //true\n    (end code)\n    */\n'contains':function contains(npos,pos,radius){\nvar diffx=npos.x-pos.x,\ndiffy=npos.y-pos.y,\ndiff=diffx*diffx+diffy*diffy;\nreturn diff<=radius*radius;\n}},\n\n/*\n  Object: NodeHelper.ellipse\n  */\n'ellipse':{\n/*\n    Method: render\n    \n    Renders an ellipse into the canvas.\n    \n    Parameters:\n    \n    type - (string) Possible options are 'fill' or 'stroke'.\n    pos - (object) An *x*, *y* object with the position of the center of the ellipse.\n    width - (number) The width of the ellipse.\n    height - (number) The height of the ellipse.\n    canvas - (object) A <Canvas> instance.\n    \n    Example:\n    (start code js)\n    NodeHelper.ellipse.render('fill', { x: 10, y: 30 }, 30, 40, viz.canvas);\n    (end code)\n    */\n'render':function render(type,pos,width,height,canvas){\nvar ctx=canvas.getCtx(),\nscalex=1,\nscaley=1,\nscaleposx=1,\nscaleposy=1,\nradius=0;\n\nif(width>height){\nradius=width/2;\nscaley=height/width;\nscaleposy=width/height;\n}else{\nradius=height/2;\nscalex=width/height;\nscaleposx=height/width;\n}\n\nctx.save();\nctx.scale(scalex,scaley);\nctx.beginPath();\nctx.arc(pos.x*scaleposx,pos.y*scaleposy,radius,0,Math.PI*2,true);\nctx.closePath();\nctx[type]();\nctx.restore();\n},\n/*\n    Method: contains\n    \n    Returns *true* if *pos* is contained in the area of the shape. Returns *false* otherwise.\n    \n    Parameters:\n    \n    npos - (object) An *x*, *y* object with the <Graph.Node> position.\n    pos - (object) An *x*, *y* object with the position to check.\n    width - (number) The width of the rendered ellipse.\n    height - (number) The height of the rendered ellipse.\n    \n    Example:\n    (start code js)\n    NodeHelper.ellipse.contains({ x: 10, y: 30 }, { x: 15, y: 35 }, 30, 40);\n    (end code)\n    */\n'contains':function contains(npos,pos,width,height){\nvar radius=0,\nscalex=1,\nscaley=1,\ndiffx=0,\ndiffy=0,\ndiff=0;\n\nif(width>height){\nradius=width/2;\nscaley=height/width;\n}else{\nradius=height/2;\nscalex=width/height;\n}\n\ndiffx=(npos.x-pos.x)*(1/scalex);\ndiffy=(npos.y-pos.y)*(1/scaley);\ndiff=diffx*diffx+diffy*diffy;\nreturn diff<=radius*radius;\n}},\n\n/*\n  Object: NodeHelper.square\n  */\n'square':{\n/*\n    Method: render\n    \n    Renders a square into the canvas.\n    \n    Parameters:\n    \n    type - (string) Possible options are 'fill' or 'stroke'.\n    pos - (object) An *x*, *y* object with the position of the center of the square.\n    dim - (number) The radius (or half-diameter) of the square.\n    canvas - (object) A <Canvas> instance.\n    \n    Example:\n    (start code js)\n    NodeHelper.square.render('stroke', { x: 10, y: 30 }, 40, viz.canvas);\n    (end code)\n    */\n'render':function render(type,pos,dim,canvas){\ncanvas.getCtx()[type+\"Rect\"](pos.x-dim,pos.y-dim,2*dim,2*dim);\n},\n/*\n    Method: contains\n    \n    Returns *true* if *pos* is contained in the area of the shape. Returns *false* otherwise.\n    \n    Parameters:\n    \n    npos - (object) An *x*, *y* object with the <Graph.Node> position.\n    pos - (object) An *x*, *y* object with the position to check.\n    dim - (number) The radius (or half-diameter) of the square.\n    \n    Example:\n    (start code js)\n    NodeHelper.square.contains({ x: 10, y: 30 }, { x: 15, y: 35 }, 30);\n    (end code)\n    */\n'contains':function contains(npos,pos,dim){\nreturn Math.abs(pos.x-npos.x)<=dim&&Math.abs(pos.y-npos.y)<=dim;\n}},\n\n/*\n  Object: NodeHelper.rectangle\n  */\n'rectangle':{\n/*\n    Method: render\n    \n    Renders a rectangle into the canvas.\n    \n    Parameters:\n    \n    type - (string) Possible options are 'fill' or 'stroke'.\n    pos - (object) An *x*, *y* object with the position of the center of the rectangle.\n    width - (number) The width of the rectangle.\n    height - (number) The height of the rectangle.\n    canvas - (object) A <Canvas> instance.\n    \n    Example:\n    (start code js)\n    NodeHelper.rectangle.render('fill', { x: 10, y: 30 }, 30, 40, viz.canvas);\n    (end code)\n    */\n'render':function render(type,pos,width,height,canvas){\ncanvas.getCtx()[type+\"Rect\"](pos.x-width/2,pos.y-height/2,\nwidth,height);\n},\n/*\n    Method: contains\n    \n    Returns *true* if *pos* is contained in the area of the shape. Returns *false* otherwise.\n    \n    Parameters:\n    \n    npos - (object) An *x*, *y* object with the <Graph.Node> position.\n    pos - (object) An *x*, *y* object with the position to check.\n    width - (number) The width of the rendered rectangle.\n    height - (number) The height of the rendered rectangle.\n    \n    Example:\n    (start code js)\n    NodeHelper.rectangle.contains({ x: 10, y: 30 }, { x: 15, y: 35 }, 30, 40);\n    (end code)\n    */\n'contains':function contains(npos,pos,width,height){\nreturn Math.abs(pos.x-npos.x)<=width/2&&\nMath.abs(pos.y-npos.y)<=height/2;\n}},\n\n/*\n  Object: NodeHelper.triangle\n  */\n'triangle':{\n/*\n    Method: render\n    \n    Renders a triangle into the canvas.\n    \n    Parameters:\n    \n    type - (string) Possible options are 'fill' or 'stroke'.\n    pos - (object) An *x*, *y* object with the position of the center of the triangle.\n    dim - (number) Half the base and half the height of the triangle.\n    canvas - (object) A <Canvas> instance.\n    \n    Example:\n    (start code js)\n    NodeHelper.triangle.render('stroke', { x: 10, y: 30 }, 40, viz.canvas);\n    (end code)\n    */\n'render':function render(type,pos,dim,canvas){\nvar ctx=canvas.getCtx(),\nc1x=pos.x,\nc1y=pos.y-dim,\nc2x=c1x-dim,\nc2y=pos.y+dim,\nc3x=c1x+dim,\nc3y=c2y;\nctx.beginPath();\nctx.moveTo(c1x,c1y);\nctx.lineTo(c2x,c2y);\nctx.lineTo(c3x,c3y);\nctx.closePath();\nctx[type]();\n},\n/*\n    Method: contains\n    \n    Returns *true* if *pos* is contained in the area of the shape. Returns *false* otherwise.\n    \n    Parameters:\n    \n    npos - (object) An *x*, *y* object with the <Graph.Node> position.\n    pos - (object) An *x*, *y* object with the position to check.\n    dim - (number) Half the base and half the height of the triangle.\n    \n    Example:\n    (start code js)\n    NodeHelper.triangle.contains({ x: 10, y: 30 }, { x: 15, y: 35 }, 30);\n    (end code)\n    */\n'contains':function contains(npos,pos,dim){\nreturn NodeHelper.circle.contains(npos,pos,dim);\n}},\n\n/*\n  Object: NodeHelper.star\n  */\n'star':{\n/*\n    Method: render\n    \n    Renders a star (concave decagon) into the canvas.\n    \n    Parameters:\n    \n    type - (string) Possible options are 'fill' or 'stroke'.\n    pos - (object) An *x*, *y* object with the position of the center of the star.\n    dim - (number) The length of a side of a concave decagon.\n    canvas - (object) A <Canvas> instance.\n    \n    Example:\n    (start code js)\n    NodeHelper.star.render('stroke', { x: 10, y: 30 }, 40, viz.canvas);\n    (end code)\n    */\n'render':function render(type,pos,dim,canvas){\nvar ctx=canvas.getCtx(),\npi5=Math.PI/5;\nctx.save();\nctx.translate(pos.x,pos.y);\nctx.beginPath();\nctx.moveTo(dim,0);\nfor(var i=0;i<9;i++){\nctx.rotate(pi5);\nif(i%2==0){\nctx.lineTo(dim/0.525731*0.200811,0);\n}else{\nctx.lineTo(dim,0);\n}\n}\nctx.closePath();\nctx[type]();\nctx.restore();\n},\n/*\n    Method: contains\n    \n    Returns *true* if *pos* is contained in the area of the shape. Returns *false* otherwise.\n    \n    Parameters:\n    \n    npos - (object) An *x*, *y* object with the <Graph.Node> position.\n    pos - (object) An *x*, *y* object with the position to check.\n    dim - (number) The length of a side of a concave decagon.\n    \n    Example:\n    (start code js)\n    NodeHelper.star.contains({ x: 10, y: 30 }, { x: 15, y: 35 }, 30);\n    (end code)\n    */\n'contains':function contains(npos,pos,dim){\nreturn NodeHelper.circle.contains(npos,pos,dim);\n}}};\n\n\n\n/*\n  Object: EdgeHelper\n  \n  Contains rendering primitives for simple edge shapes.\n*/\nvar EdgeHelper={\n/*\n    Object: EdgeHelper.line\n  */\n'line':{\n/*\n      Method: render\n      \n      Renders a line into the canvas.\n      \n      Parameters:\n      \n      from - (object) An *x*, *y* object with the starting position of the line.\n      to - (object) An *x*, *y* object with the ending position of the line.\n      canvas - (object) A <Canvas> instance.\n      \n      Example:\n      (start code js)\n      EdgeHelper.line.render({ x: 10, y: 30 }, { x: 10, y: 50 }, viz.canvas);\n      (end code)\n      */\n'render':function render(from,to,canvas){\nvar ctx=canvas.getCtx();\nctx.beginPath();\nctx.moveTo(from.x,from.y);\nctx.lineTo(to.x,to.y);\nctx.stroke();\n},\n/*\n      Method: contains\n      \n      Returns *true* if *pos* is contained in the area of the shape. Returns *false* otherwise.\n      \n      Parameters:\n      \n      posFrom - (object) An *x*, *y* object with a <Graph.Node> position.\n      posTo - (object) An *x*, *y* object with a <Graph.Node> position.\n      pos - (object) An *x*, *y* object with the position to check.\n      epsilon - (number) The dimension of the shape.\n      \n      Example:\n      (start code js)\n      EdgeHelper.line.contains({ x: 10, y: 30 }, { x: 15, y: 35 }, { x: 15, y: 35 }, 30);\n      (end code)\n      */\n'contains':function contains(posFrom,posTo,pos,epsilon){\nvar min=Math.min,\nmax=Math.max,\nminPosX=min(posFrom.x,posTo.x),\nmaxPosX=max(posFrom.x,posTo.x),\nminPosY=min(posFrom.y,posTo.y),\nmaxPosY=max(posFrom.y,posTo.y);\n\nif(pos.x>=minPosX&&pos.x<=maxPosX&&\npos.y>=minPosY&&pos.y<=maxPosY){\nif(Math.abs(posTo.x-posFrom.x)<=epsilon){\n\nreturn true;\n}\nvar dist=(posTo.y-posFrom.y)/(posTo.x-posFrom.x)*(pos.x-posFrom.x)+posFrom.y;\n\nreturn Math.abs(dist-pos.y)<=epsilon;\n}\nreturn false;\n}},\n\n/*\n    Object: EdgeHelper.arrow\n  */\n'arrow':{\n/*\n      Method: render\n      \n      Renders an arrow into the canvas.\n      \n      Parameters:\n      \n      from - (object) An *x*, *y* object with the starting position of the arrow.\n      to - (object) An *x*, *y* object with the ending position of the arrow.\n      dim - (number) The dimension of the arrow.\n      swap - (boolean) Whether to set the arrow pointing to the starting position or the ending position.\n      canvas - (object) A <Canvas> instance.\n      \n      Example:\n      (start code js)\n      EdgeHelper.arrow.render({ x: 10, y: 30 }, { x: 10, y: 50 }, 13, false, viz.canvas);\n      (end code)\n      */\n'render':function render(from,to,dim,swap,canvas){\nvar ctx=canvas.getCtx();\n// invert edge direction\nif(swap){\nvar tmp=from;\nfrom=to;\nto=tmp;\n}\nvar vect=new Complex(to.x-from.x,to.y-from.y);\nvect.$scale(dim/vect.norm());\nvar intermediatePoint=new Complex(to.x-vect.x,to.y-vect.y),\nnormal=new Complex(-vect.y/2,vect.x/2),\nv1=intermediatePoint.add(normal),\nv2=intermediatePoint.$add(normal.$scale(-1));\n\nctx.beginPath();\nctx.moveTo(from.x,from.y);\nctx.lineTo(to.x,to.y);\nctx.stroke();\nctx.beginPath();\nctx.moveTo(v1.x,v1.y);\nctx.lineTo(v2.x,v2.y);\nctx.lineTo(to.x,to.y);\nctx.closePath();\nctx.fill();\n},\n/*\n    Method: contains\n    \n    Returns *true* if *pos* is contained in the area of the shape. Returns *false* otherwise.\n    \n    Parameters:\n    \n    posFrom - (object) An *x*, *y* object with a <Graph.Node> position.\n    posTo - (object) An *x*, *y* object with a <Graph.Node> position.\n    pos - (object) An *x*, *y* object with the position to check.\n    epsilon - (number) The dimension of the shape.\n    \n    Example:\n    (start code js)\n    EdgeHelper.arrow.contains({ x: 10, y: 30 }, { x: 15, y: 35 }, { x: 15, y: 35 }, 30);\n    (end code)\n    */\n'contains':function contains(posFrom,posTo,pos,epsilon){\nreturn EdgeHelper.line.contains(posFrom,posTo,pos,epsilon);\n}},\n\n/*\n    Object: EdgeHelper.hyperline\n  */\n'hyperline':{\n/*\n    Method: render\n    \n    Renders a hyperline into the canvas. A hyperline are the lines drawn for the <Hypertree> visualization.\n    \n    Parameters:\n    \n    from - (object) An *x*, *y* object with the starting position of the hyperline. *x* and *y* must belong to [0, 1).\n    to - (object) An *x*, *y* object with the ending position of the hyperline. *x* and *y* must belong to [0, 1).\n    r - (number) The scaling factor.\n    canvas - (object) A <Canvas> instance.\n    \n    Example:\n    (start code js)\n    EdgeHelper.hyperline.render({ x: 10, y: 30 }, { x: 10, y: 50 }, 100, viz.canvas);\n    (end code)\n    */\n'render':function render(from,to,r,canvas){\nvar ctx=canvas.getCtx();\nvar centerOfCircle=computeArcThroughTwoPoints(from,to);\nif(centerOfCircle.a>1000||centerOfCircle.b>1000||\ncenterOfCircle.ratio<0){\nctx.beginPath();\nctx.moveTo(from.x*r,from.y*r);\nctx.lineTo(to.x*r,to.y*r);\nctx.stroke();\n}else{\nvar angleBegin=Math.atan2(to.y-centerOfCircle.y,to.x-\ncenterOfCircle.x);\nvar angleEnd=Math.atan2(from.y-centerOfCircle.y,from.x-\ncenterOfCircle.x);\nvar sense=sense(angleBegin,angleEnd);\nctx.beginPath();\nctx.arc(centerOfCircle.x*r,centerOfCircle.y*r,centerOfCircle.ratio*\nr,angleBegin,angleEnd,sense);\nctx.stroke();\n}\n/*      \n        Calculates the arc parameters through two points.\n        \n        More information in <http://en.wikipedia.org/wiki/Poincar%C3%A9_disc_model#Analytic_geometry_constructions_in_the_hyperbolic_plane> \n      \n        Parameters:\n      \n        p1 - A <Complex> instance.\n        p2 - A <Complex> instance.\n        scale - The Disk's diameter.\n      \n        Returns:\n      \n        An object containing some arc properties.\n      */\nfunction computeArcThroughTwoPoints(p1,p2){\nvar aDen=p1.x*p2.y-p1.y*p2.x,bDen=aDen;\nvar sq1=p1.squaredNorm(),sq2=p2.squaredNorm();\n// Fall back to a straight line\nif(aDen==0)\nreturn{\nx:0,\ny:0,\nratio:-1};\n\n\nvar a=(p1.y*sq2-p2.y*sq1+p1.y-p2.y)/aDen;\nvar b=(p2.x*sq1-p1.x*sq2+p2.x-p1.x)/bDen;\nvar x=-a/2;\nvar y=-b/2;\nvar squaredRatio=(a*a+b*b)/4-1;\n// Fall back to a straight line\nif(squaredRatio<0)\nreturn{\nx:0,\ny:0,\nratio:-1};\n\nvar ratio=Math.sqrt(squaredRatio);\nvar out={\nx:x,\ny:y,\nratio:ratio>1000?-1:ratio,\na:a,\nb:b};\n\n\nreturn out;\n}\n/*      \n        Sets angle direction to clockwise (true) or counterclockwise (false). \n         \n        Parameters: \n      \n           angleBegin - Starting angle for drawing the arc. \n           angleEnd - The HyperLine will be drawn from angleBegin to angleEnd. \n      \n        Returns: \n      \n           A Boolean instance describing the sense for drawing the HyperLine. \n      */\nfunction sense(angleBegin,angleEnd){\nreturn angleBegin<angleEnd?angleBegin+Math.PI>angleEnd?false:\ntrue:angleEnd+Math.PI>angleBegin?true:false;\n}\n},\n/*\n    Method: contains\n    \n    Not Implemented\n    \n    Returns *true* if *pos* is contained in the area of the shape. Returns *false* otherwise.\n    \n    Parameters:\n    \n    posFrom - (object) An *x*, *y* object with a <Graph.Node> position.\n    posTo - (object) An *x*, *y* object with a <Graph.Node> position.\n    pos - (object) An *x*, *y* object with the position to check.\n    epsilon - (number) The dimension of the shape.\n    \n    Example:\n    (start code js)\n    EdgeHelper.hyperline.contains({ x: 10, y: 30 }, { x: 15, y: 35 }, { x: 15, y: 35 }, 30);\n    (end code)\n    */\n'contains':$.lambda(false)}};\n\n\n\n\n/*\n * File: Graph.Plot.js\n */\n\n/*\n   Object: Graph.Plot\n\n   <Graph> rendering and animation methods.\n   \n   Properties:\n   \n   nodeHelper - <NodeHelper> object.\n   edgeHelper - <EdgeHelper> object.\n*/\nGraph.Plot={\n//Default initializer\ninitialize:function initialize(viz,klass){\nthis.viz=viz;\nthis.config=viz.config;\nthis.node=viz.config.Node;\nthis.edge=viz.config.Edge;\nthis.animation=new Animation();\nthis.nodeTypes=new klass.Plot.NodeTypes();\nthis.edgeTypes=new klass.Plot.EdgeTypes();\nthis.labels=viz.labels;\n},\n\n//Add helpers\nnodeHelper:NodeHelper,\nedgeHelper:EdgeHelper,\n\nInterpolator:{\n//node/edge property parsers\n'map':{\n'border':'color',\n'color':'color',\n'width':'number',\n'height':'number',\n'dim':'number',\n'alpha':'number',\n'lineWidth':'number',\n'angularWidth':'number',\n'span':'number',\n'valueArray':'array-number',\n'dimArray':'array-number'\n//'colorArray':'array-color'\n},\n\n//canvas specific parsers\n'canvas':{\n'globalAlpha':'number',\n'fillStyle':'color',\n'strokeStyle':'color',\n'lineWidth':'number',\n'shadowBlur':'number',\n'shadowColor':'color',\n'shadowOffsetX':'number',\n'shadowOffsetY':'number',\n'miterLimit':'number'},\n\n\n//label parsers\n'label':{\n'size':'number',\n'color':'color'},\n\n\n//Number interpolator\n'compute':function compute(from,to,delta){\nreturn from+(to-from)*delta;\n},\n\n//Position interpolators\n'moebius':function moebius(elem,props,delta,vector){\nvar v=vector.scale(-delta);\nif(v.norm()<1){\nvar x=v.x,y=v.y;\nvar ans=elem.startPos.\ngetc().moebiusTransformation(v);\nelem.pos.setc(ans.x,ans.y);\nv.x=x;v.y=y;\n}\n},\n\n'linear':function linear(elem,props,delta){\nvar from=elem.startPos.getc(true);\nvar to=elem.endPos.getc(true);\nelem.pos.setc(this.compute(from.x,to.x,delta),\nthis.compute(from.y,to.y,delta));\n},\n\n'polar':function polar(elem,props,delta){\nvar from=elem.startPos.getp(true);\nvar to=elem.endPos.getp();\nvar ans=to.interpolate(from,delta);\nelem.pos.setp(ans.theta,ans.rho);\n},\n\n//Graph's Node/Edge interpolators\n'number':function number(elem,prop,delta,getter,setter){\nvar from=elem[getter](prop,'start');\nvar to=elem[getter](prop,'end');\nelem[setter](prop,this.compute(from,to,delta));\n},\n\n'color':function color(elem,prop,delta,getter,setter){\nvar from=$.hexToRgb(elem[getter](prop,'start'));\nvar to=$.hexToRgb(elem[getter](prop,'end'));\nvar comp=this.compute;\nvar val=$.rgbToHex([parseInt(comp(from[0],to[0],delta)),\nparseInt(comp(from[1],to[1],delta)),\nparseInt(comp(from[2],to[2],delta))]);\n\nelem[setter](prop,val);\n},\n\n'array-number':function arrayNumber(elem,prop,delta,getter,setter){\nvar from=elem[getter](prop,'start'),\nto=elem[getter](prop,'end'),\ncur=[];\nfor(var i=0,l=from.length;i<l;i++){\nvar fromi=from[i],toi=to[i];\nif(fromi.length){\nfor(var j=0,len=fromi.length,curi=[];j<len;j++){\ncuri.push(this.compute(fromi[j],toi[j],delta));\n}\ncur.push(curi);\n}else{\ncur.push(this.compute(fromi,toi,delta));\n}\n}\nelem[setter](prop,cur);\n},\n\n'node':function node(elem,props,delta,map,getter,setter){\nmap=this[map];\nif(props){\nvar len=props.length;\nfor(var i=0;i<len;i++){\nvar pi=props[i];\nthis[map[pi]](elem,pi,delta,getter,setter);\n}\n}else{\nfor(var pi in map){\nthis[map[pi]](elem,pi,delta,getter,setter);\n}\n}\n},\n\n'edge':function edge(elem,props,delta,mapKey,getter,setter){\nvar adjs=elem.adjacencies;\nfor(var id in adjs){this['node'](adjs[id],props,delta,mapKey,getter,setter);}\n},\n\n'node-property':function nodeProperty(elem,props,delta){\nthis['node'](elem,props,delta,'map','getData','setData');\n},\n\n'edge-property':function edgeProperty(elem,props,delta){\nthis['edge'](elem,props,delta,'map','getData','setData');\n},\n\n'label-property':function labelProperty(elem,props,delta){\nthis['node'](elem,props,delta,'label','getLabelData','setLabelData');\n},\n\n'node-style':function nodeStyle(elem,props,delta){\nthis['node'](elem,props,delta,'canvas','getCanvasStyle','setCanvasStyle');\n},\n\n'edge-style':function edgeStyle(elem,props,delta){\nthis['edge'](elem,props,delta,'canvas','getCanvasStyle','setCanvasStyle');\n}},\n\n\n\n/*\n       sequence\n    \n       Iteratively performs an action while refreshing the state of the visualization.\n\n       Parameters:\n\n       options - (object) An object containing some sequence options described below\n       condition - (function) A function returning a boolean instance in order to stop iterations.\n       step - (function) A function to execute on each step of the iteration.\n       onComplete - (function) A function to execute when the sequence finishes.\n       duration - (number) Duration (in milliseconds) of each step.\n\n      Example:\n       (start code js)\n        var rg = new $jit.RGraph(options);\n        var i = 0;\n        rg.fx.sequence({\n          condition: function() {\n           return i == 10;\n          },\n          step: function() {\n            alert(i++);\n          },\n          onComplete: function() {\n           alert('done!');\n          }\n        });\n       (end code)\n\n    */\nsequence:function sequence(options){\nvar that=this;\noptions=$.merge({\ncondition:$.lambda(false),\nstep:$.empty,\nonComplete:$.empty,\nduration:200},\noptions||{});\n\nvar interval=setInterval(function(){\nif(options.condition()){\noptions.step();\n}else{\nclearInterval(interval);\noptions.onComplete();\n}\nthat.viz.refresh(true);\n},options.duration);\n},\n\n/*\n      prepare\n \n      Prepare graph position and other attribute values before performing an Animation. \n      This method is used internally by the Toolkit.\n      \n      See also:\n       \n       <Animation>, <Graph.Plot.animate>\n\n    */\nprepare:function prepare(modes){\nvar graph=this.viz.graph,\naccessors={\n'node-property':{\n'getter':'getData',\n'setter':'setData'},\n\n'edge-property':{\n'getter':'getData',\n'setter':'setData'},\n\n'node-style':{\n'getter':'getCanvasStyle',\n'setter':'setCanvasStyle'},\n\n'edge-style':{\n'getter':'getCanvasStyle',\n'setter':'setCanvasStyle'}};\n\n\n\n//parse modes\nvar m={};\nif($.type(modes)=='array'){\nfor(var i=0,len=modes.length;i<len;i++){\nvar elems=modes[i].split(':');\nm[elems.shift()]=elems;\n}\n}else{\nfor(var p in modes){\nif(p=='position'){\nm[modes.position]=[];\n}else{\nm[p]=$.splat(modes[p]);\n}\n}\n}\n\ngraph.eachNode(function(node){\nnode.startPos.set(node.pos);\n$.each(['node-property','node-style'],function(p){\nif(p in m){\nvar prop=m[p];\nfor(var i=0,l=prop.length;i<l;i++){\nnode[accessors[p].setter](prop[i],node[accessors[p].getter](prop[i]),'start');\n}\n}\n});\n$.each(['edge-property','edge-style'],function(p){\nif(p in m){\nvar prop=m[p];\nnode.eachAdjacency(function(adj){\nfor(var i=0,l=prop.length;i<l;i++){\nadj[accessors[p].setter](prop[i],adj[accessors[p].getter](prop[i]),'start');\n}\n});\n}\n});\n});\nreturn m;\n},\n\n/*\n       Method: animate\n    \n       Animates a <Graph> by interpolating some <Graph.Node>, <Graph.Adjacence> or <Graph.Label> properties.\n\n       Parameters:\n\n       opt - (object) Animation options. The object properties are described below\n       duration - (optional) Described in <Options.Fx>.\n       fps - (optional) Described in <Options.Fx>.\n       hideLabels - (optional|boolean) Whether to hide labels during the animation.\n       modes - (required|object) An object with animation modes (described below).\n\n       Animation modes:\n       \n       Animation modes are strings representing different node/edge and graph properties that you'd like to animate. \n       They are represented by an object that has as keys main categories of properties to animate and as values a list \n       of these specific properties. The properties are described below\n       \n       position - Describes the way nodes' positions must be interpolated. Possible values are 'linear', 'polar' or 'moebius'.\n       node-property - Describes which Node properties will be interpolated. These properties can be any of the ones defined in <Options.Node>.\n       edge-property - Describes which Edge properties will be interpolated. These properties can be any the ones defined in <Options.Edge>.\n       label-property - Describes which Label properties will be interpolated. These properties can be any of the ones defined in <Options.Label> like color or size.\n       node-style - Describes which Node Canvas Styles will be interpolated. These are specific canvas properties like fillStyle, strokeStyle, lineWidth, shadowBlur, shadowColor, shadowOffsetX, shadowOffsetY, etc.\n       edge-style - Describes which Edge Canvas Styles will be interpolated. These are specific canvas properties like fillStyle, strokeStyle, lineWidth, shadowBlur, shadowColor, shadowOffsetX, shadowOffsetY, etc.\n\n       Example:\n       (start code js)\n       var viz = new $jit.Viz(options);\n       //...tweak some Data, CanvasStyles or LabelData properties...\n       viz.fx.animate({\n         modes: {\n           'position': 'linear',\n           'node-property': ['width', 'height'],\n           'node-style': 'shadowColor',\n           'label-property': 'size'\n         },\n         hideLabels: false\n       });\n       //...can also be written like this...\n       viz.fx.animate({\n         modes: ['linear',\n                 'node-property:width:height',\n                 'node-style:shadowColor',\n                 'label-property:size'],\n         hideLabels: false\n       });\n       (end code)\n    */\nanimate:function animate(opt,versor){\nopt=$.merge(this.viz.config,opt||{});\nvar that=this,\nviz=this.viz,\ngraph=viz.graph,\ninterp=this.Interpolator,\nanimation=opt.type==='nodefx'?this.nodeFxAnimation:this.animation;\n//prepare graph values\nvar m=this.prepare(opt.modes);\n\n//animate\nif(opt.hideLabels)this.labels.hideLabels(true);\nanimation.setOptions($.extend(opt,{\n$animating:false,\ncompute:function compute(delta){\ngraph.eachNode(function(node){\nfor(var p in m){\ninterp[p](node,m[p],delta,versor);\n}\n});\nthat.plot(opt,this.$animating,delta);\nthis.$animating=true;\n},\ncomplete:function complete(){\nif(opt.hideLabels)that.labels.hideLabels(false);\nthat.plot(opt);\nopt.onComplete();\n//TODO(nico): This shouldn't be here!\n//opt.onAfterCompute();\n}})).\nstart();\n},\n\n/*\n      nodeFx\n   \n      Apply animation to node properties like color, width, height, dim, etc.\n  \n      Parameters:\n  \n      options - Animation options. This object properties is described below\n      elements - The Elements to be transformed. This is an object that has a properties\n      \n      (start code js)\n      'elements': {\n        //can also be an array of ids\n        'id': 'id-of-node-to-transform',\n        //properties to be modified. All properties are optional.\n        'properties': {\n          'color': '#ccc', //some color\n          'width': 10, //some width\n          'height': 10, //some height\n          'dim': 20, //some dim\n          'lineWidth': 10 //some line width\n        } \n      }\n      (end code)\n      \n      - _reposition_ Whether to recalculate positions and add a motion animation. \n      This might be used when changing _width_ or _height_ properties in a <Layouts.Tree> like layout. Default's *false*.\n      \n      - _onComplete_ A method that is called when the animation completes.\n      \n      ...and all other <Graph.Plot.animate> options like _duration_, _fps_, _transition_, etc.\n  \n      Example:\n      (start code js)\n       var rg = new RGraph(canvas, config); //can be also Hypertree or ST\n       rg.fx.nodeFx({\n         'elements': {\n           'id':'mynodeid',\n           'properties': {\n             'color':'#ccf'\n           },\n           'transition': Trans.Quart.easeOut\n         }\n       });\n      (end code)    \n   */\nnodeFx:function nodeFx(opt){\nvar viz=this.viz,\ngraph=viz.graph,\nanimation=this.nodeFxAnimation,\noptions=$.merge(this.viz.config,{\n'elements':{\n'id':false,\n'properties':{}},\n\n'reposition':false});\n\nopt=$.merge(options,opt||{},{\nonBeforeCompute:$.empty,\nonAfterCompute:$.empty});\n\n//check if an animation is running\nanimation.stopTimer();\nvar props=opt.elements.properties;\n//set end values for nodes\nif(!opt.elements.id){\ngraph.eachNode(function(n){\nfor(var prop in props){\nn.setData(prop,props[prop],'end');\n}\n});\n}else{\nvar ids=$.splat(opt.elements.id);\n$.each(ids,function(id){\nvar n=graph.getNode(id);\nif(n){\nfor(var prop in props){\nn.setData(prop,props[prop],'end');\n}\n}\n});\n}\n//get keys\nvar propnames=[];\nfor(var prop in props){propnames.push(prop);}\n//add node properties modes\nvar modes=['node-property:'+propnames.join(':')];\n//set new node positions\nif(opt.reposition){\nmodes.push('linear');\nviz.compute('end');\n}\n//animate\nthis.animate($.merge(opt,{\nmodes:modes,\ntype:'nodefx'}));\n\n},\n\n\n/*\n       Method: plot\n    \n       Plots a <Graph>.\n\n       Parameters:\n\n       opt - (optional) Plotting options. Most of them are described in <Options.Fx>.\n\n       Example:\n\n       (start code js)\n       var viz = new $jit.Viz(options);\n       viz.fx.plot(); \n       (end code)\n\n    */\nplot:function plot(opt,animating){\nvar viz=this.viz,\naGraph=viz.graph,\ncanvas=viz.canvas,\nid=viz.root,\nthat=this,\nctx=canvas.getCtx(),\nmin=Math.min,\nopt=opt||this.viz.controller;\n\nopt.clearCanvas&&canvas.clear();\n\nvar root=aGraph.getNode(id);\nif(!root)return;\n\nvar T=!!root.visited;\n\n//START METAMAPS CODE\nif(Metamaps.Mouse.synapseStartCoordinates.length>0&&Metamaps.Mouse.synapseEndCoordinates){\nctx.save();\nvar start;\nvar end=Metamaps.Mouse.synapseEndCoordinates;\n\nvar l=Metamaps.Mouse.synapseStartCoordinates.length;\nfor(var i=l-1;i>=0;i-=1){\nstart=Metamaps.Mouse.synapseStartCoordinates[i];\nMetamaps.JIT.renderMidArrow(start,end,13,false,canvas,0.3,true);\nMetamaps.JIT.renderMidArrow(start,end,13,false,canvas,0.7,true);\n}\nctx.restore();\n}\n\nif(Metamaps.Mouse.focusNodeCoords){\nctx.save();\nMetamaps.JIT.renderMidArrow(Metamaps.Mouse.focusNodeCoords,Metamaps.Mouse.newNodeCoords,13,false,canvas,0.3,true);\nMetamaps.JIT.renderMidArrow(Metamaps.Mouse.focusNodeCoords,Metamaps.Mouse.newNodeCoords,13,false,canvas,0.7,true);\nctx.restore();\n}\n\nif(Metamaps.Mouse.boxStartCoordinates&&Metamaps.Mouse.boxEndCoordinates){\nctx.save();\nctx.beginPath();\nctx.moveTo(Metamaps.Mouse.boxStartCoordinates.x,Metamaps.Mouse.boxStartCoordinates.y);\nctx.lineTo(Metamaps.Mouse.boxStartCoordinates.x,Metamaps.Mouse.boxEndCoordinates.y);\nctx.lineTo(Metamaps.Mouse.boxEndCoordinates.x,Metamaps.Mouse.boxEndCoordinates.y);\nctx.lineTo(Metamaps.Mouse.boxEndCoordinates.x,Metamaps.Mouse.boxStartCoordinates.y);\nctx.lineTo(Metamaps.Mouse.boxStartCoordinates.x,Metamaps.Mouse.boxStartCoordinates.y);\nctx.strokeStyle='black';\nctx.stroke();\nctx.restore();\n}\n//END METAMAPS CODE  \n\naGraph.eachNode(function(node){\nvar nodeAlpha=node.getData('alpha');\nnode.eachAdjacency(function(adj){\nvar nodeTo=adj.nodeTo;\nif(!!nodeTo.visited===T&&node.drawn&&nodeTo.drawn){\n!animating&&opt.onBeforePlotLine(adj);\nthat.plotLine(adj,canvas,animating);\n!animating&&opt.onAfterPlotLine(adj);\n}\n});\nif(node.drawn){\n!animating&&opt.onBeforePlotNode(node);\nthat.plotNode(node,canvas,animating);\n!animating&&opt.onAfterPlotNode(node);\n}\nif(!that.labelsHidden&&opt.withLabels){\nif(node.drawn&&nodeAlpha>=0.95){\nthat.labels.plotLabel(canvas,node,opt);\n}else{\nthat.labels.hideLabel(node,false);\n}\n}\nnode.visited=!T;\n});\n},\n\n/*\n      Plots a Subtree.\n   */\nplotTree:function plotTree(node,opt,animating){\nvar that=this,\nviz=this.viz,\ncanvas=viz.canvas,\nconfig=this.config,\nctx=canvas.getCtx();\nvar nodeAlpha=node.getData('alpha');\nnode.eachSubnode(function(elem){\nif(opt.plotSubtree(node,elem)&&elem.exist&&elem.drawn){\nvar adj=node.getAdjacency(elem.id);\n!animating&&opt.onBeforePlotLine(adj);\nthat.plotLine(adj,canvas,animating);\n!animating&&opt.onAfterPlotLine(adj);\nthat.plotTree(elem,opt,animating);\n}\n});\nif(node.drawn){\n!animating&&opt.onBeforePlotNode(node);\nthis.plotNode(node,canvas,animating);\n!animating&&opt.onAfterPlotNode(node);\nif(!opt.hideLabels&&opt.withLabels&&nodeAlpha>=0.95)\nthis.labels.plotLabel(canvas,node,opt);else\n\nthis.labels.hideLabel(node,false);\n}else{\nthis.labels.hideLabel(node,true);\n}\n},\n\n/*\n       Method: plotNode\n    \n       Plots a <Graph.Node>.\n\n       Parameters:\n       \n       node - (object) A <Graph.Node>.\n       canvas - (object) A <Canvas> element.\n\n    */\nplotNode:function plotNode(node,canvas,animating){\nvar f=node.getData('type'),\nctxObj=this.node.CanvasStyles;\nif(f!='none'){\nvar width=node.getData('lineWidth'),\ncolor=node.getData('color'),\nalpha=node.getData('alpha'),\nctx=canvas.getCtx();\nctx.save();\nctx.lineWidth=width;\nctx.fillStyle=ctx.strokeStyle=color;\nctx.globalAlpha=alpha;\n\nfor(var s in ctxObj){\nctx[s]=node.getCanvasStyle(s);\n}\n\nthis.nodeTypes[f].render.call(this,node,canvas,animating);\nctx.restore();\n}\n},\n\n/*\n       Method: plotLine\n    \n       Plots a <Graph.Adjacence>.\n\n       Parameters:\n\n       adj - (object) A <Graph.Adjacence>.\n       canvas - (object) A <Canvas> instance.\n\n    */\nplotLine:function plotLine(adj,canvas,animating){\nvar f=adj.getData('type'),\nctxObj=this.edge.CanvasStyles;\nif(f!='none'){\nvar width=adj.getData('lineWidth'),\ncolor=adj.getData('color'),\nctx=canvas.getCtx(),\nnodeFrom=adj.nodeFrom,\nnodeTo=adj.nodeTo;\n\nctx.save();\nctx.lineWidth=width;\nctx.fillStyle=ctx.strokeStyle=color;\nctx.globalAlpha=Math.min(nodeFrom.getData('alpha'),\nnodeTo.getData('alpha'),\nadj.getData('alpha'));\n\nfor(var s in ctxObj){\nctx[s]=adj.getCanvasStyle(s);\n}\n\nthis.edgeTypes[f].render.call(this,adj,canvas,animating);\nctx.restore();\n}\n}};\n\n\n\n/*\n  Object: Graph.Plot3D\n  \n  <Graph> 3D rendering and animation methods.\n  \n  Properties:\n  \n  nodeHelper - <NodeHelper> object.\n  edgeHelper - <EdgeHelper> object.\n\n*/\nGraph.Plot3D=$.merge(Graph.Plot,{\nInterpolator:{\n'linear':function linear(elem,props,delta){\nvar from=elem.startPos.getc(true);\nvar to=elem.endPos.getc(true);\nelem.pos.setc(this.compute(from.x,to.x,delta),\nthis.compute(from.y,to.y,delta),\nthis.compute(from.z,to.z,delta));\n}},\n\n\nplotNode:function plotNode(node,canvas){\nif(node.getData('type')=='none')return;\nthis.plotElement(node,canvas,{\ngetAlpha:function getAlpha(){\nreturn node.getData('alpha');\n}});\n\n},\n\nplotLine:function plotLine(adj,canvas){\nif(adj.getData('type')=='none')return;\nthis.plotElement(adj,canvas,{\ngetAlpha:function getAlpha(){\nreturn Math.min(adj.nodeFrom.getData('alpha'),\nadj.nodeTo.getData('alpha'),\nadj.getData('alpha'));\n}});\n\n},\n\nplotElement:function plotElement(elem,canvas,opt){\nvar gl=canvas.getCtx(),\nviewMatrix=new Matrix4(),\nlighting=canvas.config.Scene.Lighting,\nwcanvas=canvas.canvases[0],\nprogram=wcanvas.program,\ncamera=wcanvas.camera;\n\nif(!elem.geometry){\nelem.geometry=new O3D[elem.getData('type')]();\n}\nelem.geometry.update(elem);\nif(!elem.webGLVertexBuffer){\nvar vertices=[],\nfaces=[],\nnormals=[],\nvertexIndex=0,\ngeom=elem.geometry;\n\nfor(var i=0,vs=geom.vertices,fs=geom.faces,fsl=fs.length;i<fsl;i++){\nvar face=fs[i],\nv1=vs[face.a],\nv2=vs[face.b],\nv3=vs[face.c],\nv4=face.d?vs[face.d]:false,\nn=face.normal;\n\nvertices.push(v1.x,v1.y,v1.z);\nvertices.push(v2.x,v2.y,v2.z);\nvertices.push(v3.x,v3.y,v3.z);\nif(v4)vertices.push(v4.x,v4.y,v4.z);\n\nnormals.push(n.x,n.y,n.z);\nnormals.push(n.x,n.y,n.z);\nnormals.push(n.x,n.y,n.z);\nif(v4)normals.push(n.x,n.y,n.z);\n\nfaces.push(vertexIndex,vertexIndex+1,vertexIndex+2);\nif(v4){\nfaces.push(vertexIndex,vertexIndex+2,vertexIndex+3);\nvertexIndex+=4;\n}else{\nvertexIndex+=3;\n}\n}\n//create and store vertex data\nelem.webGLVertexBuffer=gl.createBuffer();\ngl.bindBuffer(gl.ARRAY_BUFFER,elem.webGLVertexBuffer);\ngl.bufferData(gl.ARRAY_BUFFER,new Float32Array(vertices),gl.STATIC_DRAW);\n//create and store faces index data\nelem.webGLFaceBuffer=gl.createBuffer();\ngl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,elem.webGLFaceBuffer);\ngl.bufferData(gl.ELEMENT_ARRAY_BUFFER,new Uint16Array(faces),gl.STATIC_DRAW);\nelem.webGLFaceCount=faces.length;\n//calculate vertex normals and store them\nelem.webGLNormalBuffer=gl.createBuffer();\ngl.bindBuffer(gl.ARRAY_BUFFER,elem.webGLNormalBuffer);\ngl.bufferData(gl.ARRAY_BUFFER,new Float32Array(normals),gl.STATIC_DRAW);\n}\nviewMatrix.multiply(camera.matrix,elem.geometry.matrix);\n//send matrix data\ngl.uniformMatrix4fv(program.viewMatrix,false,viewMatrix.flatten());\ngl.uniformMatrix4fv(program.projectionMatrix,false,camera.projectionMatrix.flatten());\n//send normal matrix for lighting\nvar normalMatrix=Matrix4.makeInvert(viewMatrix);\nnormalMatrix.$transpose();\ngl.uniformMatrix4fv(program.normalMatrix,false,normalMatrix.flatten());\n//send color data\nvar color=$.hexToRgb(elem.getData('color'));\ncolor.push(opt.getAlpha());\ngl.uniform4f(program.color,color[0]/255,color[1]/255,color[2]/255,color[3]);\n//send lighting data\ngl.uniform1i(program.enableLighting,lighting.enable);\nif(lighting.enable){\n//set ambient light color\nif(lighting.ambient){\nvar acolor=lighting.ambient;\ngl.uniform3f(program.ambientColor,acolor[0],acolor[1],acolor[2]);\n}\n//set directional light\nif(lighting.directional){\nvar dir=lighting.directional,\ncolor=dir.color,\npos=dir.direction,\nvd=new Vector3(pos.x,pos.y,pos.z).normalize().$scale(-1);\ngl.uniform3f(program.lightingDirection,vd.x,vd.y,vd.z);\ngl.uniform3f(program.directionalColor,color[0],color[1],color[2]);\n}\n}\n//send vertices data\ngl.bindBuffer(gl.ARRAY_BUFFER,elem.webGLVertexBuffer);\ngl.vertexAttribPointer(program.position,3,gl.FLOAT,false,0,0);\n//send normals data\ngl.bindBuffer(gl.ARRAY_BUFFER,elem.webGLNormalBuffer);\ngl.vertexAttribPointer(program.normal,3,gl.FLOAT,false,0,0);\n//draw!\ngl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,elem.webGLFaceBuffer);\ngl.drawElements(gl.TRIANGLES,elem.webGLFaceCount,gl.UNSIGNED_SHORT,0);\n}});\n\n\n\n/*\n * File: Graph.Label.js\n *\n*/\n\n/*\n   Object: Graph.Label\n\n   An interface for plotting/hiding/showing labels.\n\n   Description:\n\n   This is a generic interface for plotting/hiding/showing labels.\n   The <Graph.Label> interface is implemented in multiple ways to provide\n   different label types.\n\n   For example, the Graph.Label interface is implemented as <Graph.Label.HTML> to provide\n   HTML label elements. Also we provide the <Graph.Label.SVG> interface for SVG type labels. \n   The <Graph.Label.Native> interface implements these methods with the native Canvas text rendering functions.\n   \n   All subclasses (<Graph.Label.HTML>, <Graph.Label.SVG> and <Graph.Label.Native>) implement the method plotLabel.\n*/\n\nGraph.Label={};\n\n/*\n   Class: Graph.Label.Native\n\n   Implements labels natively, using the Canvas text API.\n*/\nGraph.Label.Native=new Class({\ninitialize:function initialize(viz){\nthis.viz=viz;\n},\n\n/*\n       Method: plotLabel\n\n       Plots a label for a given node.\n\n       Parameters:\n\n       canvas - (object) A <Canvas> instance.\n       node - (object) A <Graph.Node>.\n       controller - (object) A configuration object.\n       \n       Example:\n       \n       (start code js)\n       var viz = new $jit.Viz(options);\n       var node = viz.graph.getNode('nodeId');\n       viz.labels.plotLabel(viz.canvas, node, viz.config);\n       (end code)\n    */\nplotLabel:function plotLabel(canvas,node,controller){\n\nvar ctx=canvas.getCtx();\nvar pos=node.pos.getc(true);\n\nctx.font=node.getLabelData('style')+' '+node.getLabelData('size')+'px '+node.getLabelData('family');\nctx.textAlign=node.getLabelData('textAlign');\n// ORIGINAL CODE ctx.fillStyle = ctx.strokeStyle = node.getLabelData('color');\nctx.textBaseline=node.getLabelData('textBaseline');\n\n//START METAMAPS CODE\n\nvar arrayOfLabelLines=Metamaps.Util.splitLine(node.name,25).split('\\n');\n//render background\nctx.fillStyle=ctx.strokeStyle=Metamaps.Settings.colors.labels.background;\nctx.lineWidth=2;\nvar height=25*arrayOfLabelLines.length;//font size + margin\n\nvar index,lineWidths=[];\nfor(index=0;index<arrayOfLabelLines.length;++index){\nlineWidths.push(ctx.measureText(arrayOfLabelLines[index]).width);\n}\nvar width=Math.max.apply(null,lineWidths)+8;\nvar x=pos.x-width/2;\nvar y=pos.y+node.getData(\"height\")+5;\nvar radius=5;\n\nctx.beginPath();\nctx.moveTo(x+radius,y);\nctx.lineTo(x+width-radius,y);\nctx.quadraticCurveTo(x+width,y,x+width,y+radius);\nctx.lineTo(x+width,y+height-radius);\nctx.quadraticCurveTo(x+width,y+height,x+width-radius,y+height);\nctx.lineTo(x+radius,y+height);\nctx.quadraticCurveTo(x,y+height,x,y+height-radius);\nctx.lineTo(x,y+radius);\nctx.quadraticCurveTo(x,y,x+radius,y);\nctx.closePath();\nctx.fill();\n//ctx.stroke();\n\nctx.fillStyle=ctx.strokeStyle=node.getLabelData('color');\n\nthis.renderLabel(arrayOfLabelLines,canvas,node,controller);\n// END METAMAPS CODE\n// ORIGINAL CODE  this.renderLabel(canvas, node, controller);\n},\n\n/*\n       renderLabel\n\n       Does the actual rendering of the label in the canvas. The default\n       implementation renders the label close to the position of the node, this\n       method should be overriden to position the labels differently.\n\n       Parameters:\n\n       canvas - A <Canvas> instance.\n       node - A <Graph.Node>.\n       controller - A configuration object. See also <Hypertree>, <RGraph>, <ST>.\n    */\nrenderLabel:function renderLabel(customLabel,canvas,node,controller){\nvar ctx=canvas.getCtx();\nvar pos=node.pos.getc(true);\n//ctx.fillText(node.name, pos.x, pos.y + node.getData(\"height\") / 2);\n// START METAMAPS CODE\nvar index;\nfor(index=0;index<customLabel.length;++index){\nctx.fillText(customLabel[index],pos.x,pos.y+node.getData(\"height\")+23+25*index);\n}\n// END METAMAPS CODE\n},\n\nhideLabel:$.empty,\nhideLabels:$.empty});\n\n\n/*\n   Class: Graph.Label.DOM\n\n   Abstract Class implementing some DOM label methods.\n\n   Implemented by:\n\n   <Graph.Label.HTML> and <Graph.Label.SVG>.\n\n*/\nGraph.Label.DOM=new Class({\n//A flag value indicating if node labels are being displayed or not.\nlabelsHidden:false,\n//Label container\nlabelContainer:false,\n//Label elements hash.\nlabels:{},\n\n/*\n       Method: getLabelContainer\n\n       Lazy fetcher for the label container.\n\n       Returns:\n\n       The label container DOM element.\n\n       Example:\n\n      (start code js)\n        var viz = new $jit.Viz(options);\n        var labelContainer = viz.labels.getLabelContainer();\n        alert(labelContainer.innerHTML);\n      (end code)\n    */\ngetLabelContainer:function getLabelContainer(){\nreturn this.labelContainer?\nthis.labelContainer:\nthis.labelContainer=document.getElementById(this.viz.config.labelContainer);\n},\n\n/*\n       Method: getLabel\n\n       Lazy fetcher for the label element.\n\n       Parameters:\n\n       id - (string) The label id (which is also a <Graph.Node> id).\n\n       Returns:\n\n       The label element.\n\n       Example:\n\n      (start code js)\n        var viz = new $jit.Viz(options);\n        var label = viz.labels.getLabel('someid');\n        alert(label.innerHTML);\n      (end code)\n\n    */\ngetLabel:function getLabel(id){\nreturn id in this.labels&&this.labels[id]!=null?\nthis.labels[id]:\nthis.labels[id]=document.getElementById(id);\n},\n\n/*\n       Method: hideLabels\n\n       Hides all labels (by hiding the label container).\n\n       Parameters:\n\n       hide - (boolean) A boolean value indicating if the label container must be hidden or not.\n\n       Example:\n       (start code js)\n        var viz = new $jit.Viz(options);\n        rg.labels.hideLabels(true);\n       (end code)\n\n    */\nhideLabels:function hideLabels(hide){\nvar container=this.getLabelContainer();\nif(hide)\ncontainer.style.display='none';else\n\ncontainer.style.display='';\nthis.labelsHidden=hide;\n},\n\n/*\n       Method: clearLabels\n\n       Clears the label container.\n\n       Useful when using a new visualization with the same canvas element/widget.\n\n       Parameters:\n\n       force - (boolean) Forces deletion of all labels.\n\n       Example:\n       (start code js)\n        var viz = new $jit.Viz(options);\n        viz.labels.clearLabels();\n        (end code)\n    */\nclearLabels:function clearLabels(force){\nfor(var id in this.labels){\nif(force||!this.viz.graph.hasNode(id)){\nthis.disposeLabel(id);\ndelete this.labels[id];\n}\n}\n},\n\n/*\n       Method: disposeLabel\n\n       Removes a label.\n\n       Parameters:\n\n       id - (string) A label id (which generally is also a <Graph.Node> id).\n\n       Example:\n       (start code js)\n        var viz = new $jit.Viz(options);\n        viz.labels.disposeLabel('labelid');\n       (end code)\n    */\ndisposeLabel:function disposeLabel(id){\nvar elem=this.getLabel(id);\nif(elem&&elem.parentNode){\nelem.parentNode.removeChild(elem);\n}\n},\n\n/*\n       Method: hideLabel\n\n       Hides the corresponding <Graph.Node> label.\n\n       Parameters:\n\n       node - (object) A <Graph.Node>. Can also be an array of <Graph.Nodes>.\n       show - (boolean) If *true*, nodes will be shown. Otherwise nodes will be hidden.\n\n       Example:\n       (start code js)\n        var rg = new $jit.Viz(options);\n        viz.labels.hideLabel(viz.graph.getNode('someid'), false);\n       (end code)\n    */\nhideLabel:function hideLabel(node,show){\nnode=$.splat(node);\nvar st=show?\"\":\"none\",lab,that=this;\n$.each(node,function(n){\nvar lab=that.getLabel(n.id);\nif(lab){\nlab.style.display=st;\n}\n});\n},\n\n/*\n       fitsInCanvas\n\n       Returns _true_ or _false_ if the label for the node is contained in the canvas dom element or not.\n\n       Parameters:\n\n       pos - A <Complex> instance (I'm doing duck typing here so any object with _x_ and _y_ parameters will do).\n       canvas - A <Canvas> instance.\n\n       Returns:\n\n       A boolean value specifying if the label is contained in the <Canvas> DOM element or not.\n\n    */\nfitsInCanvas:function fitsInCanvas(pos,canvas){\nvar size=canvas.getSize();\nif(pos.x>=size.width||pos.x<0||\npos.y>=size.height||pos.y<0)return false;\nreturn true;\n}});\n\n\n/*\n   Class: Graph.Label.HTML\n\n   Implements HTML labels.\n\n   Extends:\n\n   All <Graph.Label.DOM> methods.\n\n*/\nGraph.Label.HTML=new Class({\nImplements:Graph.Label.DOM,\n\n/*\n       Method: plotLabel\n\n       Plots a label for a given node.\n\n       Parameters:\n\n       canvas - (object) A <Canvas> instance.\n       node - (object) A <Graph.Node>.\n       controller - (object) A configuration object.\n       \n      Example:\n       \n       (start code js)\n       var viz = new $jit.Viz(options);\n       var node = viz.graph.getNode('nodeId');\n       viz.labels.plotLabel(viz.canvas, node, viz.config);\n       (end code)\n\n\n    */\nplotLabel:function plotLabel(canvas,node,controller){\nvar id=node.id,tag=this.getLabel(id);\n\nif(!tag&&!(tag=document.getElementById(id))){\ntag=document.createElement('div');\nvar container=this.getLabelContainer();\ntag.id=id;\ntag.className='node';\ntag.style.position='absolute';\ncontroller.onCreateLabel(tag,node);\ncontainer.appendChild(tag);\nthis.labels[node.id]=tag;\n}\n\nthis.placeLabel(tag,node,controller);\n}});\n\n\n/*\n   Class: Graph.Label.SVG\n\n   Implements SVG labels.\n\n   Extends:\n\n   All <Graph.Label.DOM> methods.\n*/\nGraph.Label.SVG=new Class({\nImplements:Graph.Label.DOM,\n\n/*\n       Method: plotLabel\n\n       Plots a label for a given node.\n\n       Parameters:\n\n       canvas - (object) A <Canvas> instance.\n       node - (object) A <Graph.Node>.\n       controller - (object) A configuration object.\n       \n       Example:\n       \n       (start code js)\n       var viz = new $jit.Viz(options);\n       var node = viz.graph.getNode('nodeId');\n       viz.labels.plotLabel(viz.canvas, node, viz.config);\n       (end code)\n\n\n    */\nplotLabel:function plotLabel(canvas,node,controller){\nvar id=node.id,tag=this.getLabel(id);\nif(!tag&&!(tag=document.getElementById(id))){\nvar ns='http://www.w3.org/2000/svg';\ntag=document.createElementNS(ns,'svg:text');\nvar tspan=document.createElementNS(ns,'svg:tspan');\ntag.appendChild(tspan);\nvar container=this.getLabelContainer();\ntag.setAttribute('id',id);\ntag.setAttribute('class','node');\ncontainer.appendChild(tag);\ncontroller.onCreateLabel(tag,node);\nthis.labels[node.id]=tag;\n}\nthis.placeLabel(tag,node,controller);\n}});\n\n\n\n\n/*\n * File: Loader.js\n * \n */\n\n/*\n   Object: Loader\n\n   Provides methods for loading and serving JSON data.\n*/\nvar Loader={\nconstruct:function construct(json){\nvar isGraph=$.type(json)=='array';\nvar ans=new Graph(this.graphOptions,this.config.Node,this.config.Edge,this.config.Label);\nif(!isGraph)\n//make tree\n(function(ans,json){\nans.addNode(json);\nif(json.children){\nfor(var i=0,ch=json.children;i<ch.length;i++){\nans.addAdjacence(json,ch[i]);\narguments.callee(ans,ch[i]);\n}\n}\n})(ans,json);else\n\n//make graph\n(function(ans,json){\nvar getNode=function getNode(id){\nfor(var i=0,l=json.length;i<l;i++){\nif(json[i].id==id){\nreturn json[i];\n}\n}\n// The node was not defined in the JSON\n// Let's create it\nvar newNode={\n\"id\":id,\n\"name\":id};\n\nreturn ans.addNode(newNode);\n};\n\nfor(var i=0,l=json.length;i<l;i++){\nans.addNode(json[i]);\nvar adj=json[i].adjacencies;\nif(adj){\nfor(var j=0,lj=adj.length;j<lj;j++){\nvar node=adj[j],data={};\nif(typeof adj[j]!='string'){\ndata=$.merge(node.data,{});\nnode=node.nodeTo;\n}\nans.addAdjacence(json[i],getNode(node),data);\n}\n}\n}\n})(ans,json);\n\nreturn ans;\n},\n\n/*\n     Method: loadJSON\n    \n     Loads a JSON structure to the visualization. The JSON structure can be a JSON *tree* or *graph* structure.\n     \n      A JSON tree or graph structure consists of nodes, each having as properties\n       \n       id - (string) A unique identifier for the node\n       name - (string) A node's name\n       data - (object) The data optional property contains a hash (i.e {}) \n       where you can store all the information you want about this node.\n        \n      For JSON *Tree* structures, there's an extra optional property *children* of type Array which contains the node's children.\n      \n      Example:\n\n      (start code js)\n        var json = {  \n          \"id\": \"aUniqueIdentifier\",  \n          \"name\": \"usually a nodes name\",  \n          \"data\": {\n            \"some key\": \"some value\",\n            \"some other key\": \"some other value\"\n           },  \n          \"children\": [ *other nodes or empty* ]  \n        };  \n      (end code)\n        \n        JSON *Graph* structures consist of an array of nodes, each specifying the nodes to which the current node is connected. \n        For JSON *Graph* structures, the *children* property is replaced by the *adjacencies* property.\n        \n        There are two types of *Graph* structures, *simple* and *extended* graph structures.\n        \n        For *simple* Graph structures, the adjacencies property contains an array of strings, each specifying the \n        id of the node connected to the main node.\n        \n        Example:\n        \n        (start code js)\n        var json = [  \n          {  \n            \"id\": \"aUniqueIdentifier\",  \n            \"name\": \"usually a nodes name\",  \n            \"data\": {\n              \"some key\": \"some value\",\n              \"some other key\": \"some other value\"\n             },  \n            \"adjacencies\": [\"anotherUniqueIdentifier\", \"yetAnotherUniqueIdentifier\", 'etc']  \n          },\n\n          'other nodes go here...' \n        ];          \n        (end code)\n        \n        For *extended Graph structures*, the adjacencies property contains an array of Adjacency objects that have as properties\n        \n        nodeTo - (string) The other node connected by this adjacency.\n        data - (object) A data property, where we can store custom key/value information.\n        \n        Example:\n        \n        (start code js)\n        var json = [  \n          {  \n            \"id\": \"aUniqueIdentifier\",  \n            \"name\": \"usually a nodes name\",  \n            \"data\": {\n              \"some key\": \"some value\",\n              \"some other key\": \"some other value\"\n             },  \n            \"adjacencies\": [  \n            {  \n              nodeTo:\"aNodeId\",  \n              data: {} //put whatever you want here  \n            },\n            'other adjacencies go here...'  \n          },\n\n          'other nodes go here...' \n        ];          \n        (end code)\n       \n       About the data property:\n       \n       As described before, you can store custom data in the *data* property of JSON *nodes* and *adjacencies*. \n       You can use almost any string as key for the data object. Some keys though are reserved by the toolkit, and \n       have special meanings. This is the case for keys starting with a dollar sign, for example, *$width*.\n       \n       For JSON *node* objects, adding dollar prefixed properties that match the names of the options defined in \n       <Options.Node> will override the general value for that option with that particular value. For this to work \n       however, you do have to set *overridable = true* in <Options.Node>.\n       \n       The same thing is true for JSON adjacencies. Dollar prefixed data properties will alter values set in <Options.Edge> \n       if <Options.Edge> has *overridable = true*.\n       \n       When loading JSON data into TreeMaps, the *data* property must contain a value for the *$area* key, \n       since this is the value which will be taken into account when creating the layout. \n       The same thing goes for the *$color* parameter.\n       \n       In JSON Nodes you can use also *$label-* prefixed properties to refer to <Options.Label> properties. For example, \n       *$label-size* will refer to <Options.Label> size property. Also, in JSON nodes and adjacencies you can set \n       canvas specific properties individually by using the *$canvas-* prefix. For example, *$canvas-shadowBlur* will refer \n       to the *shadowBlur* property.\n       \n       These properties can also be accessed after loading the JSON data from <Graph.Nodes> and <Graph.Adjacences> \n       by using <Accessors>. For more information take a look at the <Graph> and <Accessors> documentation.\n       \n       Finally, these properties can also be used to create advanced animations like with <Options.NodeStyles>. For more \n       information about creating animations please take a look at the <Graph.Plot> and <Graph.Plot.animate> documentation.\n       \n       loadJSON Parameters:\n    \n        json - A JSON Tree or Graph structure.\n        i - For Graph structures only. Sets the indexed node as root for the visualization.\n\n    */\nloadJSON:function loadJSON(json,i){\nthis.json=json;\n//if they're canvas labels erase them.\nif(this.labels&&this.labels.clearLabels){\nthis.labels.clearLabels(true);\n}\nthis.graph=this.construct(json);\nif($.type(json)!='array'){\nthis.root=json.id;\n}else{\nthis.root=json[i?i:0].id;\n}\n},\n\n/*\n      Method: toJSON\n   \n      Returns a JSON tree/graph structure from the visualization's <Graph>. \n      See <Loader.loadJSON> for the graph formats available.\n      \n      See also:\n      \n      <Loader.loadJSON>\n      \n      Parameters:\n      \n      type - (string) Default's \"tree\". The type of the JSON structure to be returned. \n      Possible options are \"tree\" or \"graph\".\n    */\ntoJSON:function toJSON(type){\ntype=type||\"tree\";\nif(type=='tree'){\nvar ans={};\nvar rootNode=this.graph.getNode(this.root);\nvar ans=function recTree(node){\nvar ans={};\nans.id=node.id;\nans.name=node.name;\nans.data=node.data;\nvar ch=[];\nnode.eachSubnode(function(n){\nch.push(recTree(n));\n});\nans.children=ch;\nreturn ans;\n}(rootNode);\nreturn ans;\n}else{\nvar ans=[];\nvar T=!!this.graph.getNode(this.root).visited;\nthis.graph.eachNode(function(node){\nvar ansNode={};\nansNode.id=node.id;\nansNode.name=node.name;\nansNode.data=node.data;\nvar adjs=[];\nnode.eachAdjacency(function(adj){\nvar nodeTo=adj.nodeTo;\nif(!!nodeTo.visited===T){\nvar ansAdj={};\nansAdj.nodeTo=nodeTo.id;\nansAdj.data=adj.data;\nadjs.push(ansAdj);\n}\n});\nansNode.adjacencies=adjs;\nans.push(ansNode);\nnode.visited=!T;\n});\nreturn ans;\n}\n}};\n\n\n\n\n/*\n * File: Layouts.js\n * \n * Implements base Tree and Graph layouts.\n *\n * Description:\n *\n * Implements base Tree and Graph layouts like Radial, Tree, etc.\n * \n */\n\n/*\n * Object: Layouts\n * \n * Parent object for common layouts.\n *\n */\nvar Layouts=$jit.Layouts={};\n\n\n//Some util shared layout functions are defined here.\nvar NodeDim={\nlabel:null,\n\ncompute:function compute(graph,prop,opt){\nthis.initializeLabel(opt);\nvar label=this.label,style=label.style;\ngraph.eachNode(function(n){\nvar autoWidth=n.getData('autoWidth'),\nautoHeight=n.getData('autoHeight');\nif(autoWidth||autoHeight){\n//delete dimensions since these are\n//going to be overridden now.\ndelete n.data.$width;\ndelete n.data.$height;\ndelete n.data.$dim;\n\nvar width=n.getData('width'),\nheight=n.getData('height');\n//reset label dimensions\nstyle.width=autoWidth?'auto':width+'px';\nstyle.height=autoHeight?'auto':height+'px';\n\n//TODO(nico) should let the user choose what to insert here.\nlabel.innerHTML=n.name;\n\nvar offsetWidth=label.offsetWidth,\noffsetHeight=label.offsetHeight;\nvar type=n.getData('type');\nif($.indexOf(['circle','square','triangle','star'],type)===-1){\nn.setData('width',offsetWidth);\nn.setData('height',offsetHeight);\n}else{\nvar dim=offsetWidth>offsetHeight?offsetWidth:offsetHeight;\nn.setData('width',dim);\nn.setData('height',dim);\nn.setData('dim',dim);\n}\n}\n});\n},\n\ninitializeLabel:function initializeLabel(opt){\nif(!this.label){\nthis.label=document.createElement('div');\ndocument.body.appendChild(this.label);\n}\nthis.setLabelStyles(opt);\n},\n\nsetLabelStyles:function setLabelStyles(opt){\n$.extend(this.label.style,{\n'visibility':'hidden',\n'position':'absolute',\n'width':'auto',\n'height':'auto'});\n\nthis.label.className='jit-autoadjust-label';\n}};\n\n\n\n/*\n * Class: Layouts.Radial\n * \n * Implements a Radial Layout.\n * \n * Implemented By:\n * \n * <RGraph>, <Hypertree>\n * \n */\nLayouts.Radial=new Class({\n\n/*\n   * Method: compute\n   * \n   * Computes nodes' positions.\n   * \n   * Parameters:\n   * \n   * property - _optional_ A <Graph.Node> position property to store the new\n   * positions. Possible values are 'pos', 'end' or 'start'.\n   * \n   */\ncompute:function compute(property){\nvar prop=$.splat(property||['current','start','end']);\nNodeDim.compute(this.graph,prop,this.config);\nthis.graph.computeLevels(this.root,0,\"ignore\");\nvar lengthFunc=this.createLevelDistanceFunc();\nthis.computeAngularWidths(prop);\nthis.computePositions(prop,lengthFunc);\n},\n\n/*\n   * computePositions\n   * \n   * Performs the main algorithm for computing node positions.\n   */\ncomputePositions:function computePositions(property,getLength){\nvar propArray=property;\nvar graph=this.graph;\nvar root=graph.getNode(this.root);\nvar parent=this.parent;\nvar config=this.config;\n\nfor(var i=0,l=propArray.length;i<l;i++){\nvar pi=propArray[i];\nroot.setPos($P(0,0),pi);\nroot.setData('span',Math.PI*2,pi);\n}\n\nroot.angleSpan={\nbegin:0,\nend:2*Math.PI};\n\n\ngraph.eachBFS(this.root,function(elem){\nvar angleSpan=elem.angleSpan.end-elem.angleSpan.begin;\nvar angleInit=elem.angleSpan.begin;\nvar len=getLength(elem);\n//Calculate the sum of all angular widths\nvar totalAngularWidths=0,subnodes=[],maxDim={};\nelem.eachSubnode(function(sib){\ntotalAngularWidths+=sib._treeAngularWidth;\n//get max dim\nfor(var i=0,l=propArray.length;i<l;i++){\nvar pi=propArray[i],dim=sib.getData('dim',pi);\nmaxDim[pi]=pi in maxDim?dim>maxDim[pi]?dim:maxDim[pi]:dim;\n}\nsubnodes.push(sib);\n},\"ignore\");\n//Maintain children order\n//Second constraint for <http://bailando.sims.berkeley.edu/papers/infovis01.htm>\nif(parent&&parent.id==elem.id&&subnodes.length>0&&\nsubnodes[0].dist){\nsubnodes.sort(function(a,b){\nreturn(a.dist>=b.dist)-(a.dist<=b.dist);\n});\n}\n//Calculate nodes positions.\nfor(var k=0,ls=subnodes.length;k<ls;k++){\nvar child=subnodes[k];\nif(!child._flag){\nvar angleProportion=child._treeAngularWidth/totalAngularWidths*angleSpan;\nvar theta=angleInit+angleProportion/2;\n\nfor(var i=0,l=propArray.length;i<l;i++){\nvar pi=propArray[i];\nchild.setPos($P(theta,len),pi);\nchild.setData('span',angleProportion,pi);\nchild.setData('dim-quotient',child.getData('dim',pi)/maxDim[pi],pi);\n}\n\nchild.angleSpan={\nbegin:angleInit,\nend:angleInit+angleProportion};\n\nangleInit+=angleProportion;\n}\n}\n},\"ignore\");\n},\n\n/*\n   * Method: setAngularWidthForNodes\n   * \n   * Sets nodes angular widths.\n   */\nsetAngularWidthForNodes:function setAngularWidthForNodes(prop){\nthis.graph.eachBFS(this.root,function(elem,i){\nvar diamValue=elem.getData('angularWidth',prop[0])||5;\nelem._angularWidth=diamValue/i;\n},\"ignore\");\n},\n\n/*\n   * Method: setSubtreesAngularWidth\n   * \n   * Sets subtrees angular widths.\n   */\nsetSubtreesAngularWidth:function setSubtreesAngularWidth(){\nvar that=this;\nthis.graph.eachNode(function(elem){\nthat.setSubtreeAngularWidth(elem);\n},\"ignore\");\n},\n\n/*\n   * Method: setSubtreeAngularWidth\n   * \n   * Sets the angular width for a subtree.\n   */\nsetSubtreeAngularWidth:function setSubtreeAngularWidth(elem){\nvar that=this,nodeAW=elem._angularWidth,sumAW=0;\nelem.eachSubnode(function(child){\nthat.setSubtreeAngularWidth(child);\nsumAW+=child._treeAngularWidth;\n},\"ignore\");\nelem._treeAngularWidth=Math.max(nodeAW,sumAW);\n},\n\n/*\n   * Method: computeAngularWidths\n   * \n   * Computes nodes and subtrees angular widths.\n   */\ncomputeAngularWidths:function computeAngularWidths(prop){\nthis.setAngularWidthForNodes(prop);\nthis.setSubtreesAngularWidth();\n}});\n\n\n\n\n/*\n * File: RGraph.js\n *\n */\n\n/*\n   Class: RGraph\n   \n   A radial graph visualization with advanced animations.\n   \n   Inspired by:\n \n   Animated Exploration of Dynamic Graphs with Radial Layout (Ka-Ping Yee, Danyel Fisher, Rachna Dhamija, Marti Hearst) <http://bailando.sims.berkeley.edu/papers/infovis01.htm>\n   \n   Note:\n   \n   This visualization was built and engineered from scratch, taking only the paper as inspiration, and only shares some features with the visualization described in the paper.\n   \n  Implements:\n  \n  All <Loader> methods\n  \n   Constructor Options:\n   \n   Inherits options from\n   \n   - <Options.Canvas>\n   - <Options.Controller>\n   - <Options.Node>\n   - <Options.Edge>\n   - <Options.Label>\n   - <Options.Events>\n   - <Options.Tips>\n   - <Options.NodeStyles>\n   - <Options.Navigation>\n   \n   Additionally, there are other parameters and some default values changed\n   \n   interpolation - (string) Default's *linear*. Describes the way nodes are interpolated. Possible values are 'linear' and 'polar'.\n   levelDistance - (number) Default's *100*. The distance between levels of the tree. \n     \n   Instance Properties:\n\n   canvas - Access a <Canvas> instance.\n   graph - Access a <Graph> instance.\n   op - Access a <RGraph.Op> instance.\n   fx - Access a <RGraph.Plot> instance.\n   labels - Access a <RGraph.Label> interface implementation.   \n*/\n\n$jit.RGraph=new Class({\n\nImplements:[\nLoader,Extras,Layouts.Radial],\n\n\ninitialize:function initialize(controller){\nvar $RGraph=$jit.RGraph;\n\nvar config={\ninterpolation:'linear',\nlevelDistance:100};\n\n\nthis.controller=this.config=$.merge(Options(\"Canvas\",\"Node\",\"Edge\",\n\"Fx\",\"Controller\",\"Tips\",\"NodeStyles\",\"Events\",\"Navigation\",\"Label\"),config,controller);\n\nvar canvasConfig=this.config;\nif(canvasConfig.useCanvas){\nthis.canvas=canvasConfig.useCanvas;\nthis.config.labelContainer=this.canvas.id+'-label';\n}else{\nif(canvasConfig.background){\ncanvasConfig.background=$.merge({\ntype:'Circles'},\ncanvasConfig.background);\n}\nthis.canvas=new Canvas(this,canvasConfig);\nthis.config.labelContainer=(typeof canvasConfig.injectInto=='string'?canvasConfig.injectInto:canvasConfig.injectInto.id)+'-label';\n}\n\nthis.graphOptions={\n'klass':Polar,\n'Node':{\n'selected':false,\n'exist':true,\n'drawn':true}};\n\n\nthis.graph=new Graph(this.graphOptions,this.config.Node,\nthis.config.Edge);\nthis.labels=new $RGraph.Label[canvasConfig.Label.type](this);\nthis.fx=new $RGraph.Plot(this,$RGraph);\nthis.op=new $RGraph.Op(this);\nthis.json=null;\nthis.root=null;\nthis.busy=false;\nthis.parent=false;\n// initialize extras\nthis.initializeExtras();\n},\n\n/* \n  \n    createLevelDistanceFunc \n  \n    Returns the levelDistance function used for calculating a node distance \n    to its origin. This function returns a function that is computed \n    per level and not per node, such that all nodes with the same depth will have the \n    same distance to the origin. The resulting function gets the \n    parent node as parameter and returns a float.\n\n   */\ncreateLevelDistanceFunc:function createLevelDistanceFunc(){\nvar ld=this.config.levelDistance;\nreturn function(elem){\nreturn(elem._depth+1)*ld;\n};\n},\n\n/* \n     Method: refresh \n     \n     Computes positions and plots the tree.\n\n   */\nrefresh:function refresh(){\n\n// START METAMAPS CODE\n// this.compute();\n// END METAMAPS CODE\n// ORIGINAL CODE: this.compute();\nthis.plot();\n},\n\nreposition:function reposition(){\nthis.compute('end');\n},\n\n/*\n   Method: plot\n  \n   Plots the RGraph. This is a shortcut to *fx.plot*.\n  */\nplot:function plot(){\nthis.fx.plot();\n},\n/*\n   getNodeAndParentAngle\n  \n   Returns the _parent_ of the given node, also calculating its angle span.\n  */\ngetNodeAndParentAngle:function getNodeAndParentAngle(id){\nvar theta=false;\nvar n=this.graph.getNode(id);\nvar ps=n.getParents();\nvar p=ps.length>0?ps[0]:false;\nif(p){\nvar posParent=p.pos.getc(),posChild=n.pos.getc();\nvar newPos=posParent.add(posChild.scale(-1));\ntheta=Math.atan2(newPos.y,newPos.x);\nif(theta<0)\ntheta+=2*Math.PI;\n}\nreturn{\nparent:p,\ntheta:theta};\n\n},\n/*\n   tagChildren\n  \n   Enumerates the children in order to maintain child ordering (second constraint of the paper).\n  */\ntagChildren:function tagChildren(par,id){\nif(par.angleSpan){\nvar adjs=[];\npar.eachAdjacency(function(elem){\nadjs.push(elem.nodeTo);\n},\"ignore\");\nvar len=adjs.length;\nfor(var i=0;i<len&&id!=adjs[i].id;i++){}\n\nfor(var j=(i+1)%len,k=0;id!=adjs[j].id;j=(j+1)%len){\nadjs[j].dist=k++;\n}\n}\n},\n/* \n  Method: onClick \n  \n  Animates the <RGraph> to center the node specified by *id*.\n\n   Parameters:\n\n   id - A <Graph.Node> id.\n   opt - (optional|object) An object containing some extra properties described below\n   hideLabels - (boolean) Default's *true*. Hide labels when performing the animation.\n\n   Example:\n\n   (start code js)\n     rgraph.onClick('someid');\n     //or also...\n     rgraph.onClick('someid', {\n      hideLabels: false\n     });\n    (end code)\n    \n  */\nonClick:function onClick(id,opt){\nif(this.root!=id&&!this.busy){\nthis.busy=true;\nthis.root=id;\nvar that=this;\nthis.controller.onBeforeCompute(this.graph.getNode(id));\nvar obj=this.getNodeAndParentAngle(id);\n\n// second constraint\nthis.tagChildren(obj.parent,id);\nthis.parent=obj.parent;\nthis.compute('end');\n\n// first constraint\nvar thetaDiff=obj.theta-obj.parent.endPos.theta;\nthis.graph.eachNode(function(elem){\nelem.endPos.set(elem.endPos.getp().add($P(thetaDiff,0)));\n});\n\nvar mode=this.config.interpolation;\nopt=$.merge({\nonComplete:$.empty},\nopt||{});\n\nthis.fx.animate($.merge({\nhideLabels:true,\nmodes:[\nmode]},\n\nopt,{\nonComplete:function onComplete(){\nthat.busy=false;\nopt.onComplete();\n}}));\n\n}\n}});\n\n\n$jit.RGraph.$extend=true;\n\n(function(RGraph){\n\n/*\n     Class: RGraph.Op\n     \n     Custom extension of <Graph.Op>.\n\n     Extends:\n\n     All <Graph.Op> methods\n     \n     See also:\n     \n     <Graph.Op>\n\n  */\nRGraph.Op=new Class({\n\nImplements:Graph.Op});\n\n\n\n/*\n     Class: RGraph.Plot\n    \n    Custom extension of <Graph.Plot>.\n  \n    Extends:\n  \n    All <Graph.Plot> methods\n    \n    See also:\n    \n    <Graph.Plot>\n  \n  */\nRGraph.Plot=new Class({\n\nImplements:Graph.Plot});\n\n\n\n/*\n    Object: RGraph.Label\n\n    Custom extension of <Graph.Label>. \n    Contains custom <Graph.Label.SVG>, <Graph.Label.HTML> and <Graph.Label.Native> extensions.\n  \n    Extends:\n  \n    All <Graph.Label> methods and subclasses.\n  \n    See also:\n  \n    <Graph.Label>, <Graph.Label.Native>, <Graph.Label.HTML>, <Graph.Label.SVG>.\n  \n   */\nRGraph.Label={};\n\n/*\n     RGraph.Label.Native\n\n     Custom extension of <Graph.Label.Native>.\n\n     Extends:\n\n     All <Graph.Label.Native> methods\n\n     See also:\n\n     <Graph.Label.Native>\n\n  */\nRGraph.Label.Native=new Class({\nImplements:Graph.Label.Native});\n\n\n/*\n     RGraph.Label.SVG\n    \n    Custom extension of <Graph.Label.SVG>.\n  \n    Extends:\n  \n    All <Graph.Label.SVG> methods\n  \n    See also:\n  \n    <Graph.Label.SVG>\n  \n  */\nRGraph.Label.SVG=new Class({\nImplements:Graph.Label.SVG,\n\ninitialize:function initialize(viz){\nthis.viz=viz;\n},\n\n/* \n       placeLabel\n\n       Overrides abstract method placeLabel in <Graph.Plot>.\n\n       Parameters:\n\n       tag - A DOM label element.\n       node - A <Graph.Node>.\n       controller - A configuration/controller object passed to the visualization.\n      \n     */\nplaceLabel:function placeLabel(tag,node,controller){\nvar pos=node.pos.getc(true),\ncanvas=this.viz.canvas,\nox=canvas.translateOffsetX,\noy=canvas.translateOffsetY,\nsx=canvas.scaleOffsetX,\nsy=canvas.scaleOffsetY,\nradius=canvas.getSize();\nvar labelPos={\nx:Math.round(pos.x*sx+ox+radius.width/2),\ny:Math.round(pos.y*sy+oy+radius.height/2)};\n\ntag.setAttribute('x',labelPos.x);\ntag.setAttribute('y',labelPos.y);\n\ncontroller.onPlaceLabel(tag,node);\n}});\n\n\n/*\n     RGraph.Label.HTML\n\n     Custom extension of <Graph.Label.HTML>.\n\n     Extends:\n\n     All <Graph.Label.HTML> methods.\n\n     See also:\n\n     <Graph.Label.HTML>\n\n  */\nRGraph.Label.HTML=new Class({\nImplements:Graph.Label.HTML,\n\ninitialize:function initialize(viz){\nthis.viz=viz;\n},\n/* \n       placeLabel\n\n       Overrides abstract method placeLabel in <Graph.Plot>.\n\n       Parameters:\n\n       tag - A DOM label element.\n       node - A <Graph.Node>.\n       controller - A configuration/controller object passed to the visualization.\n      \n     */\nplaceLabel:function placeLabel(tag,node,controller){\nvar pos=node.pos.getc(true),\ncanvas=this.viz.canvas,\nox=canvas.translateOffsetX,\noy=canvas.translateOffsetY,\nsx=canvas.scaleOffsetX,\nsy=canvas.scaleOffsetY,\nradius=canvas.getSize();\nvar labelPos={\nx:Math.round(pos.x*sx+ox+radius.width/2),\ny:Math.round(pos.y*sy+oy+radius.height/2)};\n\n\nvar style=tag.style;\nstyle.left=labelPos.x+'px';\nstyle.top=labelPos.y+'px';\nstyle.display=this.fitsInCanvas(labelPos,canvas)?'':'none';\n\ncontroller.onPlaceLabel(tag,node);\n}});\n\n\n/*\n    Class: RGraph.Plot.NodeTypes\n\n    This class contains a list of <Graph.Node> built-in types. \n    Node types implemented are 'none', 'circle', 'triangle', 'rectangle', 'star', 'ellipse' and 'square'.\n\n    You can add your custom node types, customizing your visualization to the extreme.\n\n    Example:\n\n    (start code js)\n      RGraph.Plot.NodeTypes.implement({\n        'mySpecialType': {\n          'render': function(node, canvas) {\n            //print your custom node to canvas\n          },\n          //optional\n          'contains': function(node, pos) {\n            //return true if pos is inside the node or false otherwise\n          }\n        }\n      });\n    (end code)\n\n  */\nRGraph.Plot.NodeTypes=new Class({\n'none':{\n'render':$.empty,\n'contains':$.lambda(false)},\n\n'circle':{\n'render':function render(node,canvas){\nvar pos=node.pos.getc(true),\ndim=node.getData('dim');\nthis.nodeHelper.circle.render('fill',pos,dim,canvas);\n},\n'contains':function contains(node,pos){\nvar npos=node.pos.getc(true),\ndim=node.getData('dim');\nreturn this.nodeHelper.circle.contains(npos,pos,dim);\n}},\n\n'ellipse':{\n'render':function render(node,canvas){\nvar pos=node.pos.getc(true),\nwidth=node.getData('width'),\nheight=node.getData('height');\nthis.nodeHelper.ellipse.render('fill',pos,width,height,canvas);\n},\n'contains':function contains(node,pos){\nvar npos=node.pos.getc(true),\nwidth=node.getData('width'),\nheight=node.getData('height');\nreturn this.nodeHelper.ellipse.contains(npos,pos,width,height);\n}},\n\n'square':{\n'render':function render(node,canvas){\nvar pos=node.pos.getc(true),\ndim=node.getData('dim');\nthis.nodeHelper.square.render('fill',pos,dim,canvas);\n},\n'contains':function contains(node,pos){\nvar npos=node.pos.getc(true),\ndim=node.getData('dim');\nreturn this.nodeHelper.square.contains(npos,pos,dim);\n}},\n\n'rectangle':{\n'render':function render(node,canvas){\nvar pos=node.pos.getc(true),\nwidth=node.getData('width'),\nheight=node.getData('height');\nthis.nodeHelper.rectangle.render('fill',pos,width,height,canvas);\n},\n'contains':function contains(node,pos){\nvar npos=node.pos.getc(true),\nwidth=node.getData('width'),\nheight=node.getData('height');\nreturn this.nodeHelper.rectangle.contains(npos,pos,width,height);\n}},\n\n'triangle':{\n'render':function render(node,canvas){\nvar pos=node.pos.getc(true),\ndim=node.getData('dim');\nthis.nodeHelper.triangle.render('fill',pos,dim,canvas);\n},\n'contains':function contains(node,pos){\nvar npos=node.pos.getc(true),\ndim=node.getData('dim');\nreturn this.nodeHelper.triangle.contains(npos,pos,dim);\n}},\n\n'star':{\n'render':function render(node,canvas){\nvar pos=node.pos.getc(true),\ndim=node.getData('dim');\nthis.nodeHelper.star.render('fill',pos,dim,canvas);\n},\n'contains':function contains(node,pos){\nvar npos=node.pos.getc(true),\ndim=node.getData('dim');\nreturn this.nodeHelper.star.contains(npos,pos,dim);\n}}});\n\n\n\n/*\n    Class: RGraph.Plot.EdgeTypes\n\n    This class contains a list of <Graph.Adjacence> built-in types. \n    Edge types implemented are 'none', 'line' and 'arrow'.\n  \n    You can add your custom edge types, customizing your visualization to the extreme.\n  \n    Example:\n  \n    (start code js)\n      RGraph.Plot.EdgeTypes.implement({\n        'mySpecialType': {\n          'render': function(adj, canvas) {\n            //print your custom edge to canvas\n          },\n          //optional\n          'contains': function(adj, pos) {\n            //return true if pos is inside the arc or false otherwise\n          }\n        }\n      });\n    (end code)\n  \n  */\nRGraph.Plot.EdgeTypes=new Class({\n'none':$.empty,\n'line':{\n'render':function render(adj,canvas){\nvar from=adj.nodeFrom.pos.getc(true),\nto=adj.nodeTo.pos.getc(true);\nthis.edgeHelper.line.render(from,to,canvas);\n},\n'contains':function contains(adj,pos){\nvar from=adj.nodeFrom.pos.getc(true),\nto=adj.nodeTo.pos.getc(true);\nreturn this.edgeHelper.line.contains(from,to,pos,this.edge.epsilon);\n}},\n\n'arrow':{\n'render':function render(adj,canvas){\nvar from=adj.nodeFrom.pos.getc(true),\nto=adj.nodeTo.pos.getc(true),\ndim=adj.getData('dim'),\ndirection=adj.data.$direction,\ninv=direction&&direction.length>1&&direction[0]!=adj.nodeFrom.id;\nthis.edgeHelper.arrow.render(from,to,dim,inv,canvas);\n},\n'contains':function contains(adj,pos){\nvar from=adj.nodeFrom.pos.getc(true),\nto=adj.nodeTo.pos.getc(true);\nreturn this.edgeHelper.arrow.contains(from,to,pos,this.edge.epsilon);\n}}});\n\n\n\n})($jit.RGraph);\n\n\n/*\n * File: Layouts.ForceDirected.js\n *\n*/\n\n/*\n * Class: Layouts.ForceDirected\n * \n * Implements a Force Directed Layout.\n * \n * Implemented By:\n * \n * <ForceDirected>\n * \n * Credits:\n * \n * Marcus Cobden <http://marcuscobden.co.uk>\n * \n */\nLayouts.ForceDirected=new Class({\n\ngetOptions:function getOptions(random){\nvar s=this.canvas.getSize();\nvar w=s.width,h=s.height;\n//count nodes\nvar count=0;\nthis.graph.eachNode(function(n){\ncount++;\n});\nvar k2=w*h/count,k=Math.sqrt(k2);\nvar l=this.config.levelDistance;\n\nreturn{\nwidth:w,\nheight:h,\ntstart:w*0.1,\nnodef:function nodef(x){return k2/(x||1);},\nedgef:function edgef(x){return(/* x * x / k; */k*(x-l));}};\n\n},\n\ncompute:function compute(property,incremental){\nvar prop=$.splat(property||['current','start','end']);\nvar opt=this.getOptions();\nNodeDim.compute(this.graph,prop,this.config);\nthis.graph.computeLevels(this.root,0,\"ignore\");\nthis.graph.eachNode(function(n){\n$.each(prop,function(p){\nvar pos=n.getPos(p);\nif(pos.equals(Complex.KER)){\npos.x=opt.width/5*(Math.random()-0.5);\npos.y=opt.height/5*(Math.random()-0.5);\n}\n//initialize disp vector\nn.disp={};\n$.each(prop,function(p){\nn.disp[p]=$C(0,0);\n});\n});\n});\nthis.computePositions(prop,opt,incremental);\n},\n\ncomputePositions:function computePositions(property,opt,incremental){\nvar times=this.config.iterations,i=0,that=this;\nif(incremental){\n(function iter(){\nfor(var total=incremental.iter,j=0;j<total;j++){\nopt.t=opt.tstart;\nif(times)opt.t*=1-i++/(times-1);\nthat.computePositionStep(property,opt);\nif(times&&i>=times){\nincremental.onComplete();\nreturn;\n}\n}\nincremental.onStep(Math.round(i/(times-1)*100));\nsetTimeout(iter,1);\n})();\n}else{\nfor(;i<times;i++){\nopt.t=opt.tstart*(1-i/(times-1));\nthis.computePositionStep(property,opt);\n}\n}\n},\n\ncomputePositionStep:function computePositionStep(property,opt){\nvar graph=this.graph;\nvar min=Math.min,max=Math.max;\nvar dpos=$C(0,0);\n//calculate repulsive forces\ngraph.eachNode(function(v){\n//initialize disp\n$.each(property,function(p){\nv.disp[p].x=0;v.disp[p].y=0;\n});\ngraph.eachNode(function(u){\nif(u.id!=v.id){\n$.each(property,function(p){\nvar vp=v.getPos(p),up=u.getPos(p);\ndpos.x=vp.x-up.x;\ndpos.y=vp.y-up.y;\nvar norm=dpos.norm()||1;\nv.disp[p].$add(dpos.\n$scale(opt.nodef(norm)/norm));\n});\n}\n});\n});\n//calculate attractive forces\nvar T=!!graph.getNode(this.root).visited;\ngraph.eachNode(function(node){\nnode.eachAdjacency(function(adj){\nvar nodeTo=adj.nodeTo;\nif(!!nodeTo.visited===T){\n$.each(property,function(p){\nvar vp=node.getPos(p),up=nodeTo.getPos(p);\ndpos.x=vp.x-up.x;\ndpos.y=vp.y-up.y;\nvar norm=dpos.norm()||1;\nnode.disp[p].$add(dpos.$scale(-opt.edgef(norm)/norm));\nnodeTo.disp[p].$add(dpos.$scale(-1));\n});\n}\n});\nnode.visited=!T;\n});\n//arrange positions to fit the canvas\nvar t=opt.t,w2=opt.width/2,h2=opt.height/2;\ngraph.eachNode(function(u){\n$.each(property,function(p){\nvar disp=u.disp[p];\nvar norm=disp.norm()||1;\nvar p=u.getPos(p);\np.$add($C(disp.x*min(Math.abs(disp.x),t)/norm,\ndisp.y*min(Math.abs(disp.y),t)/norm));\np.x=min(w2,max(-w2,p.x));\np.y=min(h2,max(-h2,p.y));\n});\n});\n}});\n\n\n/*\n * File: ForceDirected.js\n */\n\n/*\n   Class: ForceDirected\n      \n   A visualization that lays graphs using a Force-Directed layout algorithm.\n   \n   Inspired by:\n  \n   Force-Directed Drawing Algorithms (Stephen G. Kobourov) <http://www.cs.brown.edu/~rt/gdhandbook/chapters/force-directed.pdf>\n   \n  Implements:\n  \n  All <Loader> methods\n  \n   Constructor Options:\n   \n   Inherits options from\n   \n   - <Options.Canvas>\n   - <Options.Controller>\n   - <Options.Node>\n   - <Options.Edge>\n   - <Options.Label>\n   - <Options.Events>\n   - <Options.Tips>\n   - <Options.NodeStyles>\n   - <Options.Navigation>\n   \n   Additionally, there are two parameters\n   \n   levelDistance - (number) Default's *50*. The natural length desired for the edges.\n   iterations - (number) Default's *50*. The number of iterations for the spring layout simulation. Depending on the browser's speed you could set this to a more 'interesting' number, like *200*. \n     \n   Instance Properties:\n\n   canvas - Access a <Canvas> instance.\n   graph - Access a <Graph> instance.\n   op - Access a <ForceDirected.Op> instance.\n   fx - Access a <ForceDirected.Plot> instance.\n   labels - Access a <ForceDirected.Label> interface implementation.\n\n*/\n\n$jit.ForceDirected=new Class({\n\nImplements:[Loader,Extras,Layouts.ForceDirected],\n\ninitialize:function initialize(controller){\nvar $ForceDirected=$jit.ForceDirected;\n\nvar config={\niterations:50,\nlevelDistance:50};\n\n\nthis.controller=this.config=$.merge(Options(\"Canvas\",\"Node\",\"Edge\",\n\"Fx\",\"Tips\",\"NodeStyles\",\"Events\",\"Navigation\",\"Controller\",\"Label\"),config,controller);\n\nvar canvasConfig=this.config;\nif(canvasConfig.useCanvas){\nthis.canvas=canvasConfig.useCanvas;\nthis.config.labelContainer=this.canvas.id+'-label';\n}else{\nif(canvasConfig.background){\ncanvasConfig.background=$.merge({\ntype:'Circles'},\ncanvasConfig.background);\n}\nthis.canvas=new Canvas(this,canvasConfig);\nthis.config.labelContainer=(typeof canvasConfig.injectInto=='string'?canvasConfig.injectInto:canvasConfig.injectInto.id)+'-label';\n}\n\nthis.graphOptions={\n'klass':Complex,\n'Node':{\n'selected':false,\n'exist':true,\n'drawn':true}};\n\n\nthis.graph=new Graph(this.graphOptions,this.config.Node,\nthis.config.Edge);\nthis.labels=new $ForceDirected.Label[canvasConfig.Label.type](this);\nthis.fx=new $ForceDirected.Plot(this,$ForceDirected);\nthis.op=new $ForceDirected.Op(this);\nthis.json=null;\nthis.busy=false;\n// initialize extras\nthis.initializeExtras();\n},\n\n/* \n    Method: refresh \n    \n    Computes positions and plots the tree.\n  */\nrefresh:function refresh(){\n// START METAMAPS CODE\n// this.compute();\n// END METAMAPS CODE\n// ORIGINAL CODE: this.compute();\nthis.plot();\n},\n\nreposition:function reposition(){\nthis.compute('end');\n},\n\n/*\n  Method: computeIncremental\n  \n  Performs the Force Directed algorithm incrementally.\n  \n  Description:\n  \n  ForceDirected algorithms can perform many computations and lead to JavaScript taking too much time to complete. \n  This method splits the algorithm into smaller parts allowing the user to track the evolution of the algorithm and \n  avoiding browser messages such as \"This script is taking too long to complete\".\n  \n  Parameters:\n  \n  opt - (object) The object properties are described below\n  \n  iter - (number) Default's *20*. Split the algorithm into pieces of _iter_ iterations. For example, if the _iterations_ configuration property \n  of your <ForceDirected> class is 100, then you could set _iter_ to 20 to split the main algorithm into 5 smaller pieces.\n  \n  property - (string) Default's *end*. Whether to update starting, current or ending node positions. Possible values are 'end', 'start', 'current'. \n  You can also set an array of these properties. If you'd like to keep the current node positions but to perform these \n  computations for final animation positions then you can just choose 'end'.\n  \n  onStep - (function) A callback function called when each \"small part\" of the algorithm completed. This function gets as first formal \n  parameter a percentage value.\n  \n  onComplete - A callback function called when the algorithm completed.\n  \n  Example:\n  \n  In this example I calculate the end positions and then animate the graph to those positions\n  \n  (start code js)\n  var fd = new $jit.ForceDirected(...);\n  fd.computeIncremental({\n    iter: 20,\n    property: 'end',\n    onStep: function(perc) {\n      Log.write(\"loading \" + perc + \"%\");\n    },\n    onComplete: function() {\n      Log.write(\"done\");\n      fd.animate();\n    }\n  });\n  (end code)\n  \n  In this example I calculate all positions and (re)plot the graph\n  \n  (start code js)\n  var fd = new ForceDirected(...);\n  fd.computeIncremental({\n    iter: 20,\n    property: ['end', 'start', 'current'],\n    onStep: function(perc) {\n      Log.write(\"loading \" + perc + \"%\");\n    },\n    onComplete: function() {\n      Log.write(\"done\");\n      fd.plot();\n    }\n  });\n  (end code)\n  \n  */\ncomputeIncremental:function computeIncremental(opt){\nopt=$.merge({\niter:20,\nproperty:'end',\nonStep:$.empty,\nonComplete:$.empty},\nopt||{});\n\nthis.config.onBeforeCompute(this.graph.getNode(this.root));\nthis.compute(opt.property,opt);\n},\n\n/*\n    Method: plot\n   \n    Plots the ForceDirected graph. This is a shortcut to *fx.plot*.\n   */\nplot:function plot(){\nthis.fx.plot();\n},\n\n/*\n     Method: animate\n    \n     Animates the graph from the current positions to the 'end' node positions.\n  */\nanimate:function animate(opt){\nthis.fx.animate($.merge({\nmodes:['linear']},\nopt||{}));\n}});\n\n\n$jit.ForceDirected.$extend=true;\n\n(function(ForceDirected){\n\n/*\n     Class: ForceDirected.Op\n     \n     Custom extension of <Graph.Op>.\n\n     Extends:\n\n     All <Graph.Op> methods\n     \n     See also:\n     \n     <Graph.Op>\n\n  */\nForceDirected.Op=new Class({\n\nImplements:Graph.Op});\n\n\n\n/*\n    Class: ForceDirected.Plot\n    \n    Custom extension of <Graph.Plot>.\n  \n    Extends:\n  \n    All <Graph.Plot> methods\n    \n    See also:\n    \n    <Graph.Plot>\n  \n  */\nForceDirected.Plot=new Class({\n\nImplements:Graph.Plot});\n\n\n\n/*\n    Class: ForceDirected.Label\n    \n    Custom extension of <Graph.Label>. \n    Contains custom <Graph.Label.SVG>, <Graph.Label.HTML> and <Graph.Label.Native> extensions.\n  \n    Extends:\n  \n    All <Graph.Label> methods and subclasses.\n  \n    See also:\n  \n    <Graph.Label>, <Graph.Label.Native>, <Graph.Label.HTML>, <Graph.Label.SVG>.\n  \n  */\nForceDirected.Label={};\n\n/*\n     ForceDirected.Label.Native\n     \n     Custom extension of <Graph.Label.Native>.\n\n     Extends:\n\n     All <Graph.Label.Native> methods\n\n     See also:\n\n     <Graph.Label.Native>\n\n  */\nForceDirected.Label.Native=new Class({\nImplements:Graph.Label.Native});\n\n\n/*\n    ForceDirected.Label.SVG\n    \n    Custom extension of <Graph.Label.SVG>.\n  \n    Extends:\n  \n    All <Graph.Label.SVG> methods\n  \n    See also:\n  \n    <Graph.Label.SVG>\n  \n  */\nForceDirected.Label.SVG=new Class({\nImplements:Graph.Label.SVG,\n\ninitialize:function initialize(viz){\nthis.viz=viz;\n},\n\n/* \n       placeLabel\n\n       Overrides abstract method placeLabel in <Graph.Label>.\n\n       Parameters:\n\n       tag - A DOM label element.\n       node - A <Graph.Node>.\n       controller - A configuration/controller object passed to the visualization.\n      \n     */\nplaceLabel:function placeLabel(tag,node,controller){\nvar pos=node.pos.getc(true),\ncanvas=this.viz.canvas,\nox=canvas.translateOffsetX,\noy=canvas.translateOffsetY,\nsx=canvas.scaleOffsetX,\nsy=canvas.scaleOffsetY,\nradius=canvas.getSize();\nvar labelPos={\nx:Math.round(pos.x*sx+ox+radius.width/2),\ny:Math.round(pos.y*sy+oy+radius.height/2)};\n\ntag.setAttribute('x',labelPos.x);\ntag.setAttribute('y',labelPos.y);\n\ncontroller.onPlaceLabel(tag,node);\n}});\n\n\n/*\n     ForceDirected.Label.HTML\n     \n     Custom extension of <Graph.Label.HTML>.\n\n     Extends:\n\n     All <Graph.Label.HTML> methods.\n\n     See also:\n\n     <Graph.Label.HTML>\n\n  */\nForceDirected.Label.HTML=new Class({\nImplements:Graph.Label.HTML,\n\ninitialize:function initialize(viz){\nthis.viz=viz;\n},\n/* \n       placeLabel\n\n       Overrides abstract method placeLabel in <Graph.Plot>.\n\n       Parameters:\n\n       tag - A DOM label element.\n       node - A <Graph.Node>.\n       controller - A configuration/controller object passed to the visualization.\n      \n     */\nplaceLabel:function placeLabel(tag,node,controller){\nvar pos=node.pos.getc(true),\ncanvas=this.viz.canvas,\nox=canvas.translateOffsetX,\noy=canvas.translateOffsetY,\nsx=canvas.scaleOffsetX,\nsy=canvas.scaleOffsetY,\nradius=canvas.getSize();\nvar labelPos={\nx:Math.round(pos.x*sx+ox+radius.width/2),\ny:Math.round(pos.y*sy+oy+radius.height/2)};\n\nvar style=tag.style;\nstyle.left=labelPos.x+'px';\nstyle.top=labelPos.y+'px';\nstyle.display=this.fitsInCanvas(labelPos,canvas)?'':'none';\n\ncontroller.onPlaceLabel(tag,node);\n}});\n\n\n/*\n    Class: ForceDirected.Plot.NodeTypes\n\n    This class contains a list of <Graph.Node> built-in types. \n    Node types implemented are 'none', 'circle', 'triangle', 'rectangle', 'star', 'ellipse' and 'square'.\n\n    You can add your custom node types, customizing your visualization to the extreme.\n\n    Example:\n\n    (start code js)\n      ForceDirected.Plot.NodeTypes.implement({\n        'mySpecialType': {\n          'render': function(node, canvas) {\n            //print your custom node to canvas\n          },\n          //optional\n          'contains': function(node, pos) {\n            //return true if pos is inside the node or false otherwise\n          }\n        }\n      });\n    (end code)\n\n  */\nForceDirected.Plot.NodeTypes=new Class({\n'none':{\n'render':$.empty,\n'contains':$.lambda(false)},\n\n'circle':{\n'render':function render(node,canvas){\nvar pos=node.pos.getc(true),\ndim=node.getData('dim');\nthis.nodeHelper.circle.render('fill',pos,dim,canvas);\n},\n'contains':function contains(node,pos){\nvar npos=node.pos.getc(true),\ndim=node.getData('dim');\nreturn this.nodeHelper.circle.contains(npos,pos,dim);\n}},\n\n'ellipse':{\n'render':function render(node,canvas){\nvar pos=node.pos.getc(true),\nwidth=node.getData('width'),\nheight=node.getData('height');\nthis.nodeHelper.ellipse.render('fill',pos,width,height,canvas);\n},\n'contains':function contains(node,pos){\nvar npos=node.pos.getc(true),\nwidth=node.getData('width'),\nheight=node.getData('height');\nreturn this.nodeHelper.ellipse.contains(npos,pos,width,height);\n}},\n\n'square':{\n'render':function render(node,canvas){\nvar pos=node.pos.getc(true),\ndim=node.getData('dim');\nthis.nodeHelper.square.render('fill',pos,dim,canvas);\n},\n'contains':function contains(node,pos){\nvar npos=node.pos.getc(true),\ndim=node.getData('dim');\nreturn this.nodeHelper.square.contains(npos,pos,dim);\n}},\n\n'rectangle':{\n'render':function render(node,canvas){\nvar pos=node.pos.getc(true),\nwidth=node.getData('width'),\nheight=node.getData('height');\nthis.nodeHelper.rectangle.render('fill',pos,width,height,canvas);\n},\n'contains':function contains(node,pos){\nvar npos=node.pos.getc(true),\nwidth=node.getData('width'),\nheight=node.getData('height');\nreturn this.nodeHelper.rectangle.contains(npos,pos,width,height);\n}},\n\n'triangle':{\n'render':function render(node,canvas){\nvar pos=node.pos.getc(true),\ndim=node.getData('dim');\nthis.nodeHelper.triangle.render('fill',pos,dim,canvas);\n},\n'contains':function contains(node,pos){\nvar npos=node.pos.getc(true),\ndim=node.getData('dim');\nreturn this.nodeHelper.triangle.contains(npos,pos,dim);\n}},\n\n'star':{\n'render':function render(node,canvas){\nvar pos=node.pos.getc(true),\ndim=node.getData('dim');\nthis.nodeHelper.star.render('fill',pos,dim,canvas);\n},\n'contains':function contains(node,pos){\nvar npos=node.pos.getc(true),\ndim=node.getData('dim');\nreturn this.nodeHelper.star.contains(npos,pos,dim);\n}}});\n\n\n\n/*\n    Class: ForceDirected.Plot.EdgeTypes\n  \n    This class contains a list of <Graph.Adjacence> built-in types. \n    Edge types implemented are 'none', 'line' and 'arrow'.\n  \n    You can add your custom edge types, customizing your visualization to the extreme.\n  \n    Example:\n  \n    (start code js)\n      ForceDirected.Plot.EdgeTypes.implement({\n        'mySpecialType': {\n          'render': function(adj, canvas) {\n            //print your custom edge to canvas\n          },\n          //optional\n          'contains': function(adj, pos) {\n            //return true if pos is inside the arc or false otherwise\n          }\n        }\n      });\n    (end code)\n  \n  */\nForceDirected.Plot.EdgeTypes=new Class({\n'none':$.empty,\n'line':{\n'render':function render(adj,canvas){\nvar from=adj.nodeFrom.pos.getc(true),\nto=adj.nodeTo.pos.getc(true);\nthis.edgeHelper.line.render(from,to,canvas);\n},\n'contains':function contains(adj,pos){\nvar from=adj.nodeFrom.pos.getc(true),\nto=adj.nodeTo.pos.getc(true);\nreturn this.edgeHelper.line.contains(from,to,pos,this.edge.epsilon);\n}},\n\n'arrow':{\n'render':function render(adj,canvas){\nvar from=adj.nodeFrom.pos.getc(true),\nto=adj.nodeTo.pos.getc(true),\ndim=adj.getData('dim'),\ndirection=adj.data.$direction,\ninv=direction&&direction.length>1&&direction[0]!=adj.nodeFrom.id;\nthis.edgeHelper.arrow.render(from,to,dim,inv,canvas);\n},\n'contains':function contains(adj,pos){\nvar from=adj.nodeFrom.pos.getc(true),\nto=adj.nodeTo.pos.getc(true);\nreturn this.edgeHelper.arrow.contains(from,to,pos,this.edge.epsilon);\n}}});\n\n\n\n})($jit.ForceDirected);\n\n\n/*\n * Vector3 class based on three.js http://github.com/mrdoob/three.js, Copyright (c) Mr.doob http://mrdoob.com/, MIT License http://github.com/mrdoob/three.js/blob/master/LICENSE \n */\n\nvar Vector3=function Vector3(x,y,z){\nthis.x=x||0;\nthis.y=y||0;\nthis.z=z||0;\n};\n\n$jit.Vector3=Vector3;\n\nVector3.prototype={\nset:function set(v){\nthis.x=v.x;\nthis.y=v.y;\nthis.z=v.z;\n},\n\nsetc:function setc(x,y,z){\nthis.x=x;\nthis.y=y;\nthis.z=z;\n},\n\ngetc:function getc(){\nreturn this;\n},\n\n//TODO(nico): getp\n\nadd:function add(v1,v2){\nthis.x=v1.x+v2.x;\nthis.y=v1.y+v2.y;\nthis.z=v1.z+v2.z;\nreturn this;\n},\n\n$add:function $add(v){\nthis.x+=v.x;\nthis.y+=v.y;\nthis.z+=v.z;\nreturn this;\n},\n\naddScalar:function addScalar(s){\nthis.x+=s;\nthis.y+=s;\nthis.z+=s;\nreturn this;\n},\n\nsub:function sub(v1,v2){\nthis.x=v1.x-v2.x;\nthis.y=v1.y-v2.y;\nthis.z=v1.z-v2.z;\nreturn this;\n},\n\n$sub:function $sub(v){\nthis.x-=v.x;\nthis.y-=v.y;\nthis.z-=v.z;\nreturn this;\n},\n\ncross:function cross(v1,v2){\nthis.x=v1.y*v2.z-v1.z*v2.y;\nthis.y=v1.z*v2.x-v1.x*v2.z;\nthis.z=v1.x*v2.y-v1.y*v2.x;\nreturn this;\n},\n\n$cross:function $cross(v){\nvar tx=this.x,ty=this.y,tz=this.z;\n\nthis.x=ty*v.z-tz*v.y;\nthis.y=tz*v.x-tx*v.z;\nthis.z=tx*v.y-ty*v.x;\nreturn this;\n},\n\n$multiply:function $multiply(v){\nthis.x*=v.x;\nthis.y*=v.y;\nthis.z*=v.z;\nreturn this;\n},\n\n$scale:function $scale(s){\nthis.x*=s;\nthis.y*=s;\nthis.z*=s;\nreturn this;\n},\n\ndot:function dot(v){\nreturn this.x*v.x+this.y*v.y+this.z*v.z;\n},\n\ndistanceTo:function distanceTo(v){\nreturn Math.sqrt(this.distanceToSquared(v));\n},\n\ndistanceToSquared:function distanceToSquared(v){\nvar dx=this.x-v.x,dy=this.y-v.y,dz=this.z-v.z;\nreturn dx*dx+dy*dy+dz*dz;\n},\n\nnorm:function norm(){\nreturn Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z);\n},\n\nnormSquared:function normSquared(){\nreturn this.x*this.x+this.y*this.y+this.z*this.z;\n},\n\nnegate:function negate(){\nthis.x=-this.x;\nthis.y=-this.y;\nthis.z=-this.z;\nreturn this;\n},\n\nnormalize:function normalize(){\nvar len=this.norm();\nif(len>0){\nthis.$scale(1/len);\n}\nreturn this;\n},\n\nisZero:function isZero(){\nvar almostZero=0.0001,\nabs=Math.abs;\n\nreturn abs(this.x)<almostZero&&abs(this.y)<almostZero&&abs(this.z)<almostZero;\n},\n\nclone:function clone(){\nreturn new Vector3(this.x,this.y,this.z);\n}};\n\n\nvar $V3=function $V3(a,b,c){return new Vector3(a,b,c);};\n\n/*\n * Matrix4 class based on three.js http://github.com/mrdoob/three.js, Copyright (c) Mr.doob http://mrdoob.com/, MIT License http://github.com/mrdoob/three.js/blob/master/LICENSE \n */\n\nvar Matrix4=function Matrix4(){\nthis._x=new Vector3();\nthis._y=new Vector3();\nthis._z=new Vector3();\n};\n\n$jit.Matrix4=Matrix4;\n\nMatrix4.prototype={\n\nn11:1,n12:0,n13:0,n14:0,\nn21:0,n22:1,n23:0,n24:0,\nn31:0,n32:0,n33:1,n34:0,\nn41:0,n42:0,n43:0,n44:1,\n\nidentity:function identity(){\nthis.n11=1;this.n12=0;this.n13=0;this.n14=0;\nthis.n21=0;this.n22=1;this.n23=0;this.n24=0;\nthis.n31=0;this.n32=0;this.n33=1;this.n34=0;\nthis.n41=0;this.n42=0;this.n43=0;this.n44=1;\n},\n\nlookAt:function lookAt(eye,center,up){\nvar x=this._x,y=this._y,z=this._z;\n\nz.sub(eye,center);\nz.normalize();\n\nx.cross(up,z);\nx.normalize();\n\ny.cross(z,x);\ny.normalize();\n\nthis.n11=x.x;this.n12=x.y;this.n13=x.z;this.n14=-x.dot(eye);\nthis.n21=y.x;this.n22=y.y;this.n23=y.z;this.n24=-y.dot(eye);\nthis.n31=z.x;this.n32=z.y;this.n33=z.z;this.n34=-z.dot(eye);\n},\n\ntransform:function transform(v){\nvar vx=v.x,vy=v.y,vz=v.z,vw=v.w?v.w:1.0;\n\nv.x=this.n11*vx+this.n12*vy+this.n13*vz+this.n14*vw;\nv.y=this.n21*vx+this.n22*vy+this.n23*vz+this.n24*vw;\nv.z=this.n31*vx+this.n32*vy+this.n33*vz+this.n34*vw;\n\nvw=this.n41*vx+this.n42*vy+this.n43*vz+this.n44*vw;\n\nif(v.w){\nv.w=vw;\n}else{\nv.x=v.x/vw;\nv.y=v.y/vw;\nv.z=v.z/vw;\n}\n},\n\nmultiply:function multiply(a,b){\nthis.n11=a.n11*b.n11+a.n12*b.n21+a.n13*b.n31+a.n14*b.n41;\nthis.n12=a.n11*b.n12+a.n12*b.n22+a.n13*b.n32+a.n14*b.n42;\nthis.n13=a.n11*b.n13+a.n12*b.n23+a.n13*b.n33+a.n14*b.n43;\nthis.n14=a.n11*b.n14+a.n12*b.n24+a.n13*b.n34+a.n14*b.n44;\n\nthis.n21=a.n21*b.n11+a.n22*b.n21+a.n23*b.n31+a.n24*b.n41;\nthis.n22=a.n21*b.n12+a.n22*b.n22+a.n23*b.n32+a.n24*b.n42;\nthis.n23=a.n21*b.n13+a.n22*b.n23+a.n23*b.n33+a.n24*b.n43;\nthis.n24=a.n21*b.n14+a.n22*b.n24+a.n23*b.n34+a.n24*b.n44;\n\nthis.n31=a.n31*b.n11+a.n32*b.n21+a.n33*b.n31+a.n34*b.n41;\nthis.n32=a.n31*b.n12+a.n32*b.n22+a.n33*b.n32+a.n34*b.n42;\nthis.n33=a.n31*b.n13+a.n32*b.n23+a.n33*b.n33+a.n34*b.n43;\nthis.n34=a.n31*b.n14+a.n32*b.n24+a.n33*b.n34+a.n34*b.n44;\n\nthis.n41=a.n41*b.n11+a.n42*b.n21+a.n43*b.n31+a.n44*b.n41;\nthis.n42=a.n41*b.n12+a.n42*b.n22+a.n43*b.n32+a.n44*b.n42;\nthis.n43=a.n41*b.n13+a.n42*b.n23+a.n43*b.n33+a.n44*b.n43;\nthis.n44=a.n41*b.n14+a.n42*b.n24+a.n43*b.n34+a.n44*b.n44;\n},\n\n$multiply:function $multiply(m){\nvar n11=this.n11,n12=this.n12,n13=this.n13,n14=this.n14,\nn21=this.n21,n22=this.n22,n23=this.n23,n24=this.n24,\nn31=this.n31,n32=this.n32,n33=this.n33,n34=this.n34,\nn41=this.n41,n42=this.n42,n43=this.n43,n44=this.n44;\n\nthis.n11=n11*m.n11+n12*m.n21+n13*m.n31+n14*m.n41;\nthis.n12=n11*m.n12+n12*m.n22+n13*m.n32+n14*m.n42;\nthis.n13=n11*m.n13+n12*m.n23+n13*m.n33+n14*m.n43;\nthis.n14=n11*m.n14+n12*m.n24+n13*m.n34+n14*m.n44;\n\nthis.n21=n21*m.n11+n22*m.n21+n23*m.n31+n24*m.n41;\nthis.n22=n21*m.n12+n22*m.n22+n23*m.n32+n24*m.n42;\nthis.n23=n21*m.n13+n22*m.n23+n23*m.n33+n24*m.n43;\nthis.n24=n21*m.n14+n22*m.n24+n23*m.n34+n24*m.n44;\n\nthis.n31=n31*m.n11+n32*m.n21+n33*m.n31+n34*m.n41;\nthis.n32=n31*m.n12+n32*m.n22+n33*m.n32+n34*m.n42;\nthis.n33=n31*m.n13+n32*m.n23+n33*m.n33+n34*m.n43;\nthis.n34=n31*m.n14+n32*m.n24+n33*m.n34+n34*m.n44;\n\nthis.n41=n41*m.n11+n42*m.n21+n43*m.n31+n44*m.n41;\nthis.n42=n41*m.n12+n42*m.n22+n43*m.n32+n44*m.n42;\nthis.n43=n41*m.n13+n42*m.n23+n43*m.n33+n44*m.n43;\nthis.n44=n41*m.n14+n42*m.n24+n43*m.n34+n44*m.n44;\n},\n\n$scale:function $scale(s){\nthis.n11*=s;this.n12*=s;this.n13*=s;this.n14*=s;\nthis.n21*=s;this.n22*=s;this.n23*=s;this.n24*=s;\nthis.n31*=s;this.n32*=s;this.n33*=s;this.n34*=s;\nthis.n41*=s;this.n42*=s;this.n43*=s;this.n44*=s;\nreturn this;\n},\n\n$add:function $add(m){\nthis.n11+=m.n11;\nthis.n12+=m.n12;\nthis.n13+=m.n13;\nthis.n14+=m.n14;\nthis.n21+=m.n21;\nthis.n22+=m.n22;\nthis.n23+=m.n23;\nthis.n24+=m.n24;\nthis.n31+=m.n31;\nthis.n32+=m.n32;\nthis.n33+=m.n33;\nthis.n34+=m.n34;\nthis.n41+=m.n41;\nthis.n42+=m.n42;\nthis.n43+=m.n43;\nthis.n44+=m.n44;\nreturn this;\n},\n\ndeterminant:function determinant(){\nreturn(\nthis.n14*this.n23*this.n32*this.n41-\nthis.n13*this.n24*this.n32*this.n41-\nthis.n14*this.n22*this.n33*this.n41+\nthis.n12*this.n24*this.n33*this.n41+\n\nthis.n13*this.n22*this.n34*this.n41-\nthis.n12*this.n23*this.n34*this.n41-\nthis.n14*this.n23*this.n31*this.n42+\nthis.n13*this.n24*this.n31*this.n42+\n\nthis.n14*this.n21*this.n33*this.n42-\nthis.n11*this.n24*this.n33*this.n42-\nthis.n13*this.n21*this.n34*this.n42+\nthis.n11*this.n23*this.n34*this.n42+\n\nthis.n14*this.n22*this.n31*this.n43-\nthis.n12*this.n24*this.n31*this.n43-\nthis.n14*this.n21*this.n32*this.n43+\nthis.n11*this.n24*this.n32*this.n43+\n\nthis.n12*this.n21*this.n34*this.n43-\nthis.n11*this.n22*this.n34*this.n43-\nthis.n13*this.n22*this.n31*this.n44+\nthis.n12*this.n23*this.n31*this.n44+\n\nthis.n13*this.n21*this.n32*this.n44-\nthis.n11*this.n23*this.n32*this.n44-\nthis.n12*this.n21*this.n33*this.n44+\nthis.n11*this.n22*this.n33*this.n44);\n},\n\n$transpose:function $transpose(){\nfunction swap(obj,p1,p2){\nvar aux=obj[p1];\nobj[p1]=obj[p2];\nobj[p2]=aux;\n}\n\nswap(this,'n21','n12');\nswap(this,'n31','n13');\nswap(this,'n32','n23');\nswap(this,'n41','n14');\nswap(this,'n42','n24');\nswap(this,'n43','n34');\nreturn this;\n},\n\nclone:function clone(){\nvar m=new Matrix4();\nm.n11=this.n11;m.n12=this.n12;m.n13=this.n13;m.n14=this.n14;\nm.n21=this.n21;m.n22=this.n22;m.n23=this.n23;m.n24=this.n24;\nm.n31=this.n31;m.n32=this.n32;m.n33=this.n33;m.n34=this.n34;\nm.n41=this.n41;m.n42=this.n42;m.n43=this.n43;m.n44=this.n44;\nreturn m;\n},\n\nflatten:function flatten(){\nreturn[this.n11,this.n21,this.n31,this.n41,\nthis.n12,this.n22,this.n32,this.n42,\nthis.n13,this.n23,this.n33,this.n43,\nthis.n14,this.n24,this.n34,this.n44];\n}};\n\n\nMatrix4.translationMatrix=function(x,y,z){\nvar m=new Matrix4();\n\nm.n14=x;\nm.n24=y;\nm.n34=z;\n\nreturn m;\n};\n\nMatrix4.scaleMatrix=function(x,y,z){\nvar m=new Matrix4();\n\nm.n11=x;\nm.n22=y;\nm.n33=z;\n\nreturn m;\n};\n\nMatrix4.rotationXMatrix=function(theta){\nvar rot=new Matrix4();\n\nrot.n22=rot.n33=Math.cos(theta);\nrot.n32=Math.sin(theta);\nrot.n23=-rot.n32;\n\nreturn rot;\n};\n\nMatrix4.rotationYMatrix=function(theta){\nvar rot=new Matrix4();\n\nrot.n11=rot.n33=Math.cos(theta);\nrot.n13=Math.sin(theta);\nrot.n31=-rot.n13;\n\nreturn rot;\n};\n\nMatrix4.rotationZMatrix=function(theta){\nvar rot=new Matrix4();\n\nrot.n11=rot.n22=Math.cos(theta);\nrot.n21=Math.sin(theta);\nrot.n12=-rot.n21;\n\nreturn rot;\n};\n\nMatrix4.makeInvert=function(m1){\nvar m2=new Matrix4();\n\nm2.n11=m1.n23*m1.n34*m1.n42-m1.n24*m1.n33*m1.n42+m1.n24*m1.n32*m1.n43-m1.n22*m1.n34*m1.n43-m1.n23*m1.n32*m1.n44+m1.n22*m1.n33*m1.n44;\nm2.n12=m1.n14*m1.n33*m1.n42-m1.n13*m1.n34*m1.n42-m1.n14*m1.n32*m1.n43+m1.n12*m1.n34*m1.n43+m1.n13*m1.n32*m1.n44-m1.n12*m1.n33*m1.n44;\nm2.n13=m1.n13*m1.n24*m1.n42-m1.n14*m1.n23*m1.n42+m1.n14*m1.n22*m1.n43-m1.n12*m1.n24*m1.n43-m1.n13*m1.n22*m1.n44+m1.n12*m1.n23*m1.n44;\nm2.n14=m1.n14*m1.n23*m1.n32-m1.n13*m1.n24*m1.n32-m1.n14*m1.n22*m1.n33+m1.n12*m1.n24*m1.n33+m1.n13*m1.n22*m1.n34-m1.n12*m1.n23*m1.n34;\nm2.n21=m1.n24*m1.n33*m1.n41-m1.n23*m1.n34*m1.n41-m1.n24*m1.n31*m1.n43+m1.n21*m1.n34*m1.n43+m1.n23*m1.n31*m1.n44-m1.n21*m1.n33*m1.n44;\nm2.n22=m1.n13*m1.n34*m1.n41-m1.n14*m1.n33*m1.n41+m1.n14*m1.n31*m1.n43-m1.n11*m1.n34*m1.n43-m1.n13*m1.n31*m1.n44+m1.n11*m1.n33*m1.n44;\nm2.n23=m1.n14*m1.n23*m1.n41-m1.n13*m1.n24*m1.n41-m1.n14*m1.n21*m1.n43+m1.n11*m1.n24*m1.n43+m1.n13*m1.n21*m1.n44-m1.n11*m1.n23*m1.n44;\nm2.n24=m1.n13*m1.n24*m1.n31-m1.n14*m1.n23*m1.n31+m1.n14*m1.n21*m1.n33-m1.n11*m1.n24*m1.n33-m1.n13*m1.n21*m1.n34+m1.n11*m1.n23*m1.n34;\nm2.n31=m1.n22*m1.n34*m1.n41-m1.n24*m1.n32*m1.n41+m1.n24*m1.n31*m1.n42-m1.n21*m1.n34*m1.n42-m1.n22*m1.n31*m1.n44+m1.n21*m1.n32*m1.n44;\nm2.n32=m1.n14*m1.n32*m1.n41-m1.n12*m1.n34*m1.n41-m1.n14*m1.n31*m1.n42+m1.n11*m1.n34*m1.n42+m1.n12*m1.n31*m1.n44-m1.n11*m1.n32*m1.n44;\nm2.n33=m1.n13*m1.n24*m1.n41-m1.n14*m1.n22*m1.n41+m1.n14*m1.n21*m1.n42-m1.n11*m1.n24*m1.n42-m1.n12*m1.n21*m1.n44+m1.n11*m1.n22*m1.n44;\nm2.n34=m1.n14*m1.n22*m1.n31-m1.n12*m1.n24*m1.n31-m1.n14*m1.n21*m1.n32+m1.n11*m1.n24*m1.n32+m1.n12*m1.n21*m1.n34-m1.n11*m1.n22*m1.n34;\nm2.n41=m1.n23*m1.n32*m1.n41-m1.n22*m1.n33*m1.n41-m1.n23*m1.n31*m1.n42+m1.n21*m1.n33*m1.n42+m1.n22*m1.n31*m1.n43-m1.n21*m1.n32*m1.n43;\nm2.n42=m1.n12*m1.n33*m1.n41-m1.n13*m1.n32*m1.n41+m1.n13*m1.n31*m1.n42-m1.n11*m1.n33*m1.n42-m1.n12*m1.n31*m1.n43+m1.n11*m1.n32*m1.n43;\nm2.n43=m1.n13*m1.n22*m1.n41-m1.n12*m1.n23*m1.n41-m1.n13*m1.n21*m1.n42+m1.n11*m1.n23*m1.n42+m1.n12*m1.n21*m1.n43-m1.n11*m1.n22*m1.n43;\nm2.n44=m1.n12*m1.n23*m1.n31-m1.n13*m1.n22*m1.n31+m1.n13*m1.n21*m1.n32-m1.n11*m1.n23*m1.n32-m1.n12*m1.n21*m1.n33+m1.n11*m1.n22*m1.n33;\nm2.$scale(1/m1.determinant());\n\nreturn m2;\n};\n\nMatrix4.makeFrustum=function(left,right,bottom,top,near,far){\nvar m,x,y,a,b,c,d;\n\nm=new Matrix4();\nx=2*near/(right-left);\ny=2*near/(top-bottom);\na=(right+left)/(right-left);\nb=(top+bottom)/(top-bottom);\nc=-(far+near)/(far-near);\nd=-2*far*near/(far-near);\n\nm.n11=x;m.n12=0;m.n13=a;m.n14=0;\nm.n21=0;m.n22=y;m.n23=b;m.n24=0;\nm.n31=0;m.n32=0;m.n33=c;m.n34=d;\nm.n41=0;m.n42=0;m.n43=-1;m.n44=0;\n\nreturn m;\n};\n\nMatrix4.makePerspective=function(fov,aspect,near,far){\nvar ymax,ymin,xmin,xmax;\n\nymax=near*Math.tan(fov*Math.PI/360);\nymin=-ymax;\nxmin=ymin*aspect;\nxmax=ymax*aspect;\n\nreturn Matrix4.makeFrustum(xmin,xmax,ymin,ymax,near,far);\n};\n\nMatrix4.makeOrtho=function(left,right,top,bottom,near,far){\nvar m,x,y,z,w,h,p;\n\nm=new Matrix4();\nw=right-left;\nh=bottom-top;\np=far-near;\nx=(right+left)/w;\ny=(bottom+top)/h;\nz=(far+near)/p;\n\nm.n11=2/w;m.n12=0;m.n13=0;m.n14=-x;\nm.n21=0;m.n22=2/h;m.n23=0;m.n24=-y;\nm.n31=0;m.n32=0;m.n33=-2/p;m.n34=-z;\nm.n41=0;m.n42=0;m.n43=0;m.n44=1;\n\nreturn m;\n};\n\n\n/*\n * Camera class based on three.js http://github.com/mrdoob/three.js, Copyright (c) Mr.doob http://mrdoob.com/, MIT License http://github.com/mrdoob/three.js/blob/master/LICENSE \n */\n\nvar Camera=function Camera(fov,aspect,near,far){\nthis.projectionMatrix=Matrix4.makePerspective(fov,aspect,near,far);\n};\n\nCamera.prototype={\nposition:new Vector3(),\ntarget:{\nposition:new Vector3()},\n\nup:new Vector3(0,1,0),\nmatrix:new Matrix4(),\n\nupdateMatrix:function updateMatrix(){\nthis.matrix.lookAt(this.position,this.target.position,this.up);\n}};\n\n\n\nCanvas.Base['3D']=new Class({\nImplements:Canvas.Base['2D'],\n\nprogram:null,\ncamera:null,\n\ninitialize:function initialize(viz){\nthis.viz=viz;\nthis.opt=viz.config;\nthis.size=false;\nthis.createCanvas();\nthis.initWebGL();\nthis.initCamera();\n},\n\ninitWebGL:function initWebGL(){\n//initialize context\nvar gl=this.getCtx();\n//get viewport size\nvar size=this.getSize();\n//compile and get shaders\nvar fragmentShader=this.getShader(Canvas.Base['3D'].FragmentShader,gl.FRAGMENT_SHADER);\nvar vertexShader=this.getShader(Canvas.Base['3D'].VertexShader,gl.VERTEX_SHADER);\n//create program and link shaders\nvar program=gl.createProgram();\ngl.attachShader(program,vertexShader);\ngl.attachShader(program,fragmentShader);\ngl.linkProgram(program);\nif(!gl.getProgramParameter(program,gl.LINK_STATUS)){\nthrow\"Could not link shaders\";\n}\ngl.useProgram(program);\n//bind name to variable location in shaders\n$.extend(program,{\n'viewMatrix':gl.getUniformLocation(program,'viewMatrix'),\n'projectionMatrix':gl.getUniformLocation(program,'projectionMatrix'),\n'normalMatrix':gl.getUniformLocation(program,'normalMatrix'),\n'color':gl.getUniformLocation(program,'color'),\n\n'enableLighting':gl.getUniformLocation(program,'enableLighting'),\n'ambientColor':gl.getUniformLocation(program,'ambientColor'),\n'directionalColor':gl.getUniformLocation(program,'directionalColor'),\n'lightingDirection':gl.getUniformLocation(program,'lightingDirection'),\n\n'position':gl.getAttribLocation(program,'position'),\n'normal':gl.getAttribLocation(program,'normal')});\n\ngl.enableVertexAttribArray(program.position);\ngl.enableVertexAttribArray(program.normal);\nthis.program=program;\n//set general rendering options\ngl.clearColor(0,0,0,0);\ngl.clearDepth(1);\n\ngl.enable(gl.DEPTH_TEST);\ngl.depthFunc(gl.LEQUAL);\n\ngl.enable(gl.BLEND);\ngl.blendFunc(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA);\n\ngl.viewport(0,0,size.width,size.height);\n},\n\ninitCamera:function initCamera(){\nvar size=this.getSize();\nvar camera=new Camera(75,size.width/size.height,1,1000);\ncamera.position.z=500;\nthis.camera=camera;\n},\n\ngetShader:function getShader(src,type){\nvar gl=this.ctx;\nvar shader=gl.createShader(type);\ngl.shaderSource(shader,src);\ngl.compileShader(shader);\nif(!gl.getShaderParameter(shader,gl.COMPILE_STATUS)){\nvar info=gl.getShaderInfoLog(shader);\nthrow\"Could not compile shader src: \"+info;\n}\nreturn shader;\n},\n\ngetCtx:function getCtx(){\nif(!this.ctx)\nreturn this.ctx=this.canvas.getContext('experimental-webgl');\nreturn this.ctx;\n},\n\nresize:function resize(width,height){\nvar size=this.getSize(),\ncanvas=this.canvas,\nstyles=canvas.style,\ngl=this.getCtx();\nthis.size=false;\ncanvas.width=width;\ncanvas.height=height;\nstyles.width=width+\"px\";\nstyles.height=height+\"px\";\ngl.viewport(0,0,width,height);\n\nthis.translateOffsetX=\nthis.translateOffsetY=0;\nthis.scaleOffsetX=\nthis.scaleOffsetY=1;\nthis.clear();\nthis.viz.resize(width,height,this);\n},\n\ntranslateToCenter:$.empty,\nscale:$.empty,\n\ntranslate:function translate(x,y,z,disablePlot){\nvar sx=this.scaleOffsetX,\nsy=this.scaleOffsetY;\nthis.translateOffsetX+=x*sx;\nthis.translateOffsetY+=y*sy;\nvar pos=this.camera.position;\npos.x+=x;\npos.y+=y;\npos.z+=z;\n!disablePlot&&this.plot();\n},\n\nclear:function clear(){\nvar gl=this.getCtx();\ngl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT);\n//TODO(nico) is this OK? I mean, to put this line here.\nthis.camera.updateMatrix();\n},\n\nplot:function plot(){\nthis.clear();\nthis.viz.plot(this);\n}});\n\n\n//Shaders code\nCanvas.Base['3D'].FragmentShader=[\n\"#ifdef GL_ES\",\n\"precision highp float;\",\n\"#endif\",\n\n\"varying vec4 vcolor;\",\n\"varying vec3 lightWeighting;\",\n\n\"void main(){\",\n\n\"gl_FragColor = vec4(vcolor.rgb * lightWeighting, vcolor.a);\",\n\n\"}\"].\njoin(\"\\n\");\n\nCanvas.Base['3D'].VertexShader=[\n\"attribute vec3 position;\",\n\"attribute vec3 normal;\",\n\"uniform vec4 color;\",\n\n\"uniform mat4 viewMatrix;\",\n\"uniform mat4 projectionMatrix;\",\n\"uniform mat4 normalMatrix;\",\n\n\"uniform bool enableLighting;\",\n\"uniform vec3 ambientColor;\",\n\"uniform vec3 directionalColor;\",\n\"uniform vec3 lightingDirection;\",\n\n\"varying vec4 vcolor;\",\n\"varying vec3 lightWeighting;\",\n\n\"void main(void) {\",\n\n\"if(!enableLighting) {\",\n\"lightWeighting = vec3(1.0, 1.0, 1.0);\",\n\"} else {\",\n\"vec4 transformedNormal = normalMatrix * vec4(normal, 1.0);\",\n\"float directionalLightWeighting = max(dot(transformedNormal.xyz, lightingDirection), 0.0);\",\n\"lightWeighting = ambientColor + directionalColor * directionalLightWeighting;\",\n\"}\",\n\n\"vcolor = color;\",\n\"gl_Position = projectionMatrix * viewMatrix * vec4( position, 1.0 );\",\n\n\"}\"].\njoin(\"\\n\");\n\n/*\n * Some of the geometries where inspired by three.js http://github.com/mrdoob/three.js, Copyright (c) Mr.doob http://mrdoob.com/, MIT License http://github.com/mrdoob/three.js/blob/master/LICENSE \n */\n\nvar O3D={};\n\n$jit.O3D=O3D;\n\nO3D.base=new Class({\n//array of { x, y, z } of float\nvertices:[],\n//array of { a, b, c, d? } of int\nfaces:[],\n//updated on plotNode/plotEdge\nposition:new Vector3(),\nrotation:new Vector3(),\nscale:new Vector3(1,1,1),\n//intrinsic coordinates\nmatrix:new Matrix4(),\n\nupdate:function update(elem){\nif(elem.nodeFrom&&elem.nodeTo){\nthis.updateEdge(elem);\n}else{\nthis.updateNode(elem);\n}\n},\n\nupdateNode:$.empty,\n\nupdateEdge:function updateEdge(elem){\nthis.updateNode(elem);\n},\n\nupdateMatrix:function updateMatrix(){\nvar pos=this.position,\nrot=this.rotation,\nscale=this.scale,\nmatrix=this.matrix;\n\nmatrix.identity();\n\nmatrix.$multiply(Matrix4.translationMatrix(pos.x,pos.y,pos.z));\nmatrix.$multiply(Matrix4.rotationXMatrix(rot.x));\nmatrix.$multiply(Matrix4.rotationYMatrix(rot.y));\nmatrix.$multiply(Matrix4.rotationZMatrix(rot.z));\nmatrix.$multiply(Matrix4.scaleMatrix(scale.x,scale.y,scale.z));\n},\n//compute faces normals\ncomputeNormals:function computeNormals(){\nfor(var f=0,vs=this.vertices,fs=this.faces,len=fs.length;f<len;f++){\nvar va=vs[fs[f].a],\nvb=vs[fs[f].b],\nvc=vs[fs[f].c],\ncb=new Vector3(),\nab=new Vector3();\n\ncb.sub(vc,vb);\nab.sub(va,vb);\ncb.$cross(ab);\n\nif(!cb.isZero())cb.normalize();\n\nfs[f].normal=cb;\n}\n}});\n\n\n//IsoCube\nfunction IsoCube(){\nvar vs=this.vertices,\nf4=this.faces,\nvsp=function vsp(x,y,z){vs.push({x:x,y:y,z:z});},\nf4p=function f4p(a,b,c,d){f4.push({a:a,b:b,c:c,d:d});};\n\nvsp(1,1,-1);\nvsp(1,-1,-1);\nvsp(-1,-1,-1);\nvsp(-1,1,-1);\nvsp(1,1,1);\nvsp(1,-1,1);\nvsp(-1,-1,1);\nvsp(-1,1,1);\n\nf4p(0,1,2,3);\nf4p(4,7,6,5);\nf4p(0,4,5,1);\nf4p(1,5,6,2);\nf4p(2,6,7,3);\nf4p(4,0,3,7);\n}\n\n//Cube\nO3D.cube=new Class({\nImplements:O3D.base,\n\ninitialize:function initialize(){\nIsoCube.call(this);\nthis.computeNormals();\n},\n\nupdateNode:function updateNode(obj){\nvar dim=obj.getData('dim'),\npos=obj.pos;\n\nthis.position.setc(pos.x,pos.y,pos.z);\nthis.scale.setc(dim,dim,dim);\nthis.updateMatrix();\n}});\n\n\nO3D.sphere=new Class({\nImplements:O3D.base,\n\nradius:1,\nsegments_width:10,\nsegments_height:10,\n\ninitialize:function initialize(){\nvar radius=this.radius,\nsegments_width=this.segments_width,\nsegments_height=this.segments_height,\ngridX=segments_width||8,\ngridY=segments_height||6,\ncos=Math.cos,\nsin=Math.sin,\nmax=Math.max,\npi=Math.PI;\n\nvar iHor=max(3,gridX),\niVer=max(2,gridY),\naVtc=[];\n\nfor(var j=0;j<iVer+1;j++){\nvar fRad1=j/iVer,\nfZ=radius*cos(fRad1*pi),\nfRds=radius*sin(fRad1*pi),\naRow=[],\noVtx=0;\n\nfor(var i=0;i<iHor;i++){\nvar fRad2=2*i/iHor,\nfX=fRds*Math.sin(fRad2*pi),\nfY=fRds*Math.cos(fRad2*pi);\nif(!((j==0||j==iVer)&&i>0)){\noVtx=this.vertices.push({x:fY,y:fZ,z:fX})-1;\n}\naRow.push(oVtx);\n}\naVtc.push(aRow);\n}\n\nvar iVerNum=aVtc.length;\nfor(var j=0;j<iVerNum;j++){\nvar iHorNum=aVtc[j].length;\nif(j>0){\nfor(var i=0;i<iHorNum;i++){\nvar bEnd=i==iHorNum-1;\nvar aP1=aVtc[j][bEnd?0:i+1];\nvar aP2=aVtc[j][bEnd?iHorNum-1:i];\nvar aP3=aVtc[j-1][bEnd?iHorNum-1:i];\nvar aP4=aVtc[j-1][bEnd?0:i+1];\n\nif(j<aVtc.length-1){\nthis.faces.push({a:aP1,b:aP2,c:aP3});\n}\nif(j>1){\nthis.faces.push({a:aP1,b:aP3,c:aP4});\n}\n}\n}\n}\nthis.computeNormals();\n},\n\nupdateNode:function updateNode(obj){\nvar dim=obj.getData('dim'),\npos=obj.pos;\n\nthis.position.setc(pos.x,pos.y,pos.z);\nthis.scale.setc(dim,dim,dim);\nthis.updateMatrix();\n}});\n\n\n\n\nO3D.tube=new Class({\nImplements:O3D.base,\n\nnumSegs:10,\ndim:1,\ninitialize:function initialize(){\nvar vs=this.vertices,\nf4=this.faces,\nvsp=function vsp(x,y,z){vs.push({x:x,y:y,z:z});},\nf4p=function f4p(a,b,c,d){f4.push({a:a,b:b,c:c,d:d});};\n\nvar scope=this,\nsin=Math.sin,\ncos=Math.cos,\npi=Math.PI,\npi2=pi*2,\nnumSegs=this.numSegs,\ntopRad=this.dim,\nbotRad=this.dim;\n\n// Top circle vertices\nfor(var i=0;i<numSegs;i++){\nvsp(sin(pi2*i/numSegs)*topRad,cos(pi2*i/numSegs)*topRad,-0.5);\n}\n// Bottom circle vertices\nfor(var i=0;i<numSegs;i++){\nvsp(sin(pi2*i/numSegs)*botRad,cos(pi2*i/numSegs)*botRad,0.5);\n}\n// Body \nfor(var i=0;i<numSegs;i++){\nf4p(i,(i+1)%numSegs,numSegs+(i+1)%numSegs,i+numSegs);\n}\nthis.computeNormals();\n},\n\nupdateEdge:function updateEdge(obj){\nvar lineWidth=obj.getData('lineWidth'),\nnodeFrom=obj.nodeFrom,\nnodeTo=obj.nodeTo,\nnodeFromPos=nodeFrom.pos,\nnodeToPos=nodeTo.pos,\ndist=nodeFromPos.distanceTo(nodeToPos),\nmiddle=new Vector3(),\ncurrentDir=new Vector3(0,0,1),\ndvec=new Vector3();\n\nmiddle.add(nodeFromPos,nodeToPos).$scale(0.5);\ndvec.sub(nodeToPos,nodeFromPos).normalize();\n\nvar c=dvec.dot(currentDir),\nxc=dvec.dot(new Vector3(1,0,0)),\nyc=dvec.dot(new Vector3(0,1,0)),\nt=1-c,\nrotAngle=Math.acos(c),\ns=Math.sin(rotAngle),\nrotAxis=currentDir.$cross(dvec).normalize(),\nx=rotAxis.x,\ny=rotAxis.y,\nz=rotAxis.z;\n\nvar rot=new Matrix4();\nrot.n11=t*x*x+c;\nrot.n12=t*x*y-s*z;\nrot.n13=t*x*z+s*y;\nrot.n21=t*x*y+s*z;\nrot.n22=t*y*y+c;\nrot.n23=t*y*z-s*x;\nrot.n31=t*x*z-s*y;\nrot.n32=t*y*z+s*x;\nrot.n33=t*z*z+c;\nthis.rotationMatrix=rot;\nthis.scale.setc(lineWidth,lineWidth,dist);\nthis.position.setc(middle.x,middle.y,middle.z);\nthis.updateMatrix();\n},\n\nupdateMatrix:function updateMatrix(){\nvar pos=this.position,\nscale=this.scale,\nmatrix=this.matrix;\n\nmatrix.identity();\n\nmatrix.$multiply(Matrix4.translationMatrix(pos.x,pos.y,pos.z));\nmatrix.$multiply(this.rotationMatrix);\nmatrix.$multiply(Matrix4.scaleMatrix(scale.x,scale.y,scale.z));\n}});\n\n\n\n\n/*\n * File: Layouts.ForceDirected3D.js\n *\n*/\n\n/*\n * Class: Layouts.ForceDirected3D\n * \n * Implements a Force Directed Layout.\n * \n * Implemented By:\n * \n * <ForceDirected3D>\n * \n */\nLayouts.ForceDirected3D=new Class({\n\ngetOptions:function getOptions(){\nvar s=this.canvas.getSize();\nvar w=s.width,h=s.height;\n//count nodes\nvar count=0;\nthis.graph.eachNode(function(n){\ncount++;\n});\nvar k2=w*h/count,k=Math.sqrt(k2);\nvar l=this.config.levelDistance;\n\nreturn{\nwidth:w,\nheight:h,\ntstart:w*0.1,\nnodef:function nodef(x){return k2/(x||1);},\nedgef:function edgef(x){return(/* x * x / k; */k*(x-l));}};\n\n},\n\ncompute:function compute(property,incremental){\nvar prop=$.splat(property||['current','start','end']);\nvar opt=this.getOptions();\nNodeDim.compute(this.graph,prop,this.config);\nthis.graph.computeLevels(this.root,0,\"ignore\");\nthis.graph.eachNode(function(n){\n$.each(prop,function(p){\nvar pos=n.getPos(p);\nif(pos.isZero()){\npos.x=opt.width/5*(Math.random()-0.5);\npos.y=opt.height/5*(Math.random()-0.5);\npos.z=200*(Math.random()-0.5);\n}\n//initialize disp vector\nn.disp={};\n$.each(prop,function(p){\nn.disp[p]=$V3(0,0,0);\n});\n});\n});\nthis.computePositions(prop,opt,incremental);\n},\n\ncomputePositions:function computePositions(property,opt,incremental){\nvar times=this.config.iterations,i=0,that=this;\nif(incremental){\n(function iter(){\nfor(var total=incremental.iter,j=0;j<total;j++){\nopt.t=opt.tstart*(1-i++/(times-1));\nthat.computePositionStep(property,opt);\nif(i>=times){\nincremental.onComplete();\nreturn;\n}\n}\nincremental.onStep(Math.round(i/(times-1)*100));\nsetTimeout(iter,1);\n})();\n}else{\nfor(;i<times;i++){\nopt.t=opt.tstart*(1-i/(times-1));\nthis.computePositionStep(property,opt);\n}\n}\n},\n\ncomputePositionStep:function computePositionStep(property,opt){\nvar graph=this.graph;\nvar min=Math.min,max=Math.max;\nvar dpos=$V3(0,0,0);\n//calculate repulsive forces\ngraph.eachNode(function(v){\n//initialize disp\n$.each(property,function(p){\nv.disp[p].x=0;\nv.disp[p].y=0;\nv.disp[p].z=0;\n});\ngraph.eachNode(function(u){\nif(u.id!=v.id){\n$.each(property,function(p){\nvar vp=v.getPos(p),up=u.getPos(p);\ndpos.x=vp.x-up.x;\ndpos.y=vp.y-up.y;\ndpos.z=vp.z-up.z;\nvar norm=dpos.norm()||1;\nv.disp[p].$add(dpos.\n$scale(opt.nodef(norm)/norm));\n});\n}\n});\n});\n//calculate attractive forces\nvar T=!!graph.getNode(this.root).visited;\ngraph.eachNode(function(node){\nnode.eachAdjacency(function(adj){\nvar nodeTo=adj.nodeTo;\nif(!!nodeTo.visited===T){\n$.each(property,function(p){\nvar vp=node.getPos(p),up=nodeTo.getPos(p);\ndpos.x=vp.x-up.x;\ndpos.y=vp.y-up.y;\ndpos.z=vp.z-up.z;\nvar norm=dpos.norm()||1;\nnode.disp[p].$add(dpos.$scale(-opt.edgef(norm)/norm));\nnodeTo.disp[p].$add(dpos.$scale(-1));\n});\n}\n});\nnode.visited=!T;\n});\n//arrange positions to fit the canvas\nvar t=opt.t,w2=opt.width/2,h2=opt.height/2;\ngraph.eachNode(function(u){\n$.each(property,function(p){\nvar disp=u.disp[p];\nvar norm=disp.norm()||1;\nvar p=u.getPos(p);\np.$add($V3(disp.x*min(Math.abs(disp.x),t)/norm,\ndisp.y*min(Math.abs(disp.y),t)/norm,\ndisp.z*min(Math.abs(disp.z),t)/norm));\np.x=min(w2,max(-w2,p.x));\np.y=min(h2,max(-h2,p.y));\np.z=min(h2,max(-h2,p.z));\n});\n});\n}});\n\n\n$jit.ForceDirected3D=new Class({\n\nImplements:[Loader,Extras,Layouts.ForceDirected3D],\n\ninitialize:function initialize(controller){\nvar $ForceDirected3D=$jit.ForceDirected3D;\n\nvar config={\niterations:50,\nlevelDistance:50};\n\n\nthis.controller=this.config=$.merge(Options(\"Canvas\",\"Node\",\"Edge\",\n\"Fx\",\"Tips\",\"NodeStyles\",\"Events\",\"Navigation\",\"Controller\",\"Label\"),config,controller);\n\nvar canvasConfig=this.config;\nif(canvasConfig.useCanvas){\nthis.canvas=canvasConfig.useCanvas;\nthis.config.labelContainer=this.canvas.id+'-label';\n}else{\nif(canvasConfig.background){\ncanvasConfig.background=$.merge({\ntype:'Circles'},\ncanvasConfig.background);\n}\nthis.canvas=new Canvas(this,canvasConfig);\nthis.config.labelContainer=(typeof canvasConfig.injectInto=='string'?canvasConfig.injectInto:canvasConfig.injectInto.id)+'-label';\n}\n\nthis.graphOptions={\n'klass':Vector3,\n'Node':{\n'selected':false,\n'exist':true,\n'drawn':true}};\n\n\nthis.graph=new Graph(this.graphOptions,this.config.Node,\nthis.config.Edge);\nthis.labels=new $ForceDirected3D.Label[canvasConfig.Label.type](this);\nthis.fx=new $ForceDirected3D.Plot(this,$ForceDirected3D);\nthis.op=new $ForceDirected3D.Op(this);\nthis.json=null;\nthis.busy=false;\n// initialize extras\nthis.initializeExtras();\n},\n\n/* \n    refresh \n    \n    Computes positions and plots the tree.\n  */\nrefresh:function refresh(){\nthis.compute();\nthis.plot();\n},\n\nreposition:function reposition(){\nthis.compute('end');\n},\n\n/*\n  computeIncremental\n  \n  Performs the Force Directed algorithm incrementally.\n  \n  Description:\n  \n  ForceDirected3D algorithms can perform many computations and lead to JavaScript taking too much time to complete. \n  This method splits the algorithm into smaller parts allowing the user to track the evolution of the algorithm and \n  avoiding browser messages such as \"This script is taking too long to complete\".\n  \n  Parameters:\n  \n  opt - (object) The object properties are described below\n  \n  iter - (number) Default's *20*. Split the algorithm into pieces of _iter_ iterations. For example, if the _iterations_ configuration property \n  of your <ForceDirected3D> class is 100, then you could set _iter_ to 20 to split the main algorithm into 5 smaller pieces.\n  \n  property - (string) Default's *end*. Whether to update starting, current or ending node positions. Possible values are 'end', 'start', 'current'. \n  You can also set an array of these properties. If you'd like to keep the current node positions but to perform these \n  computations for final animation positions then you can just choose 'end'.\n  \n  onStep - (function) A callback function called when each \"small part\" of the algorithm completed. This function gets as first formal \n  parameter a percentage value.\n  \n  onComplete - A callback function called when the algorithm completed.\n  \n  Example:\n  \n  In this example I calculate the end positions and then animate the graph to those positions\n  \n  (start code js)\n  var fd = new $jit.ForceDirected3D(...);\n  fd.computeIncremental({\n    iter: 20,\n    property: 'end',\n    onStep: function(perc) {\n      Log.write(\"loading \" + perc + \"%\");\n    },\n    onComplete: function() {\n      Log.write(\"done\");\n      fd.animate();\n    }\n  });\n  (end code)\n  \n  In this example I calculate all positions and (re)plot the graph\n  \n  (start code js)\n  var fd = new ForceDirected3D(...);\n  fd.computeIncremental({\n    iter: 20,\n    property: ['end', 'start', 'current'],\n    onStep: function(perc) {\n      Log.write(\"loading \" + perc + \"%\");\n    },\n    onComplete: function() {\n      Log.write(\"done\");\n      fd.plot();\n    }\n  });\n  (end code)\n  \n  */\ncomputeIncremental:function computeIncremental(opt){\nopt=$.merge({\niter:20,\nproperty:'end',\nonStep:$.empty,\nonComplete:$.empty},\nopt||{});\n\nthis.config.onBeforeCompute(this.graph.getNode(this.root));\nthis.compute(opt.property,opt);\n},\n\n/*\n    plot\n   \n    Plots the ForceDirected3D graph. This is a shortcut to *fx.plot*.\n   */\nplot:function plot(){\nthis.fx.plot();\n},\n\n/*\n     animate\n    \n     Animates the graph from the current positions to the 'end' node positions.\n  */\nanimate:function animate(opt){\nthis.fx.animate($.merge({\nmodes:['linear']},\nopt||{}));\n}});\n\n\n$jit.ForceDirected3D.$extend=true;\n\n(function(ForceDirected3D){\n\n/*\n     ForceDirected3D.Op\n     \n     Custom extension of <Graph.Op>.\n\n     Extends:\n\n     All <Graph.Op> methods\n     \n     See also:\n     \n     <Graph.Op>\n\n  */\nForceDirected3D.Op=new Class({\n\nImplements:Graph.Op});\n\n\n\n/*\n    ForceDirected3D.Plot\n    \n    Custom extension of <Graph.Plot>.\n  \n    Extends:\n  \n    All <Graph.Plot> methods\n    \n    See also:\n    \n    <Graph.Plot>\n  \n  */\nForceDirected3D.Plot=new Class({\n\nImplements:Graph.Plot3D});\n\n\n\n/*\n    ForceDirected3D.Label\n    \n    Custom extension of <Graph.Label>. \n    Contains custom <Graph.Label.SVG>, <Graph.Label.HTML> and <Graph.Label.Native> extensions.\n  \n    Extends:\n  \n    All <Graph.Label> methods and subclasses.\n  \n    See also:\n  \n    <Graph.Label>, <Graph.Label.Native>, <Graph.Label.HTML>, <Graph.Label.SVG>.\n  \n  */\nForceDirected3D.Label={};\n\n/*\n     ForceDirected3D.Label.Native\n     \n     Custom extension of <Graph.Label.Native>.\n\n     Extends:\n\n     All <Graph.Label.Native> methods\n\n     See also:\n\n     <Graph.Label.Native>\n\n  */\nForceDirected3D.Label.Native=new Class({\nImplements:Graph.Label.Native});\n\n\n/*\n    ForceDirected3D.Label.SVG\n    \n    Custom extension of <Graph.Label.SVG>.\n  \n    Extends:\n  \n    All <Graph.Label.SVG> methods\n  \n    See also:\n  \n    <Graph.Label.SVG>\n  \n  */\nForceDirected3D.Label.SVG=new Class({\nImplements:Graph.Label.SVG,\n\ninitialize:function initialize(viz){\nthis.viz=viz;\n},\n\n/* \n       placeLabel\n\n       Overrides abstract method placeLabel in <Graph.Label>.\n\n       Parameters:\n\n       tag - A DOM label element.\n       node - A <Graph.Node>.\n       controller - A configuration/controller object passed to the visualization.\n      \n     */\nplaceLabel:function placeLabel(tag,node,controller){\nvar pos=node.pos.getc(true),\ncanvas=this.viz.canvas,\nox=canvas.translateOffsetX,\noy=canvas.translateOffsetY,\nsx=canvas.scaleOffsetX,\nsy=canvas.scaleOffsetY,\nradius=canvas.getSize();\nvar labelPos={\nx:Math.round(pos.x*sx+ox+radius.width/2),\ny:Math.round(pos.y*sy+oy+radius.height/2)};\n\ntag.setAttribute('x',labelPos.x);\ntag.setAttribute('y',labelPos.y);\n\ncontroller.onPlaceLabel(tag,node);\n}});\n\n\n/*\n     ForceDirected3D.Label.HTML\n     \n     Custom extension of <Graph.Label.HTML>.\n\n     Extends:\n\n     All <Graph.Label.HTML> methods.\n\n     See also:\n\n     <Graph.Label.HTML>\n\n  */\nForceDirected3D.Label.HTML=new Class({\nImplements:Graph.Label.HTML,\n\ninitialize:function initialize(viz){\nthis.viz=viz;\n},\n/* \n       placeLabel\n\n       Overrides abstract method placeLabel in <Graph.Plot>.\n\n       Parameters:\n\n       tag - A DOM label element.\n       node - A <Graph.Node>.\n       controller - A configuration/controller object passed to the visualization.\n      \n     */\nplaceLabel:function placeLabel(tag,node,controller){\nvar pos=node.pos.getc(true),\ncanvas=this.viz.canvas,\nox=canvas.translateOffsetX,\noy=canvas.translateOffsetY,\nsx=canvas.scaleOffsetX,\nsy=canvas.scaleOffsetY,\nradius=canvas.getSize();\nvar labelPos={\nx:Math.round(pos.x*sx+ox+radius.width/2),\ny:Math.round(pos.y*sy+oy+radius.height/2)};\n\nvar style=tag.style;\nstyle.left=labelPos.x+'px';\nstyle.top=labelPos.y+'px';\nstyle.display=this.fitsInCanvas(labelPos,canvas)?'':'none';\n\ncontroller.onPlaceLabel(tag,node);\n}});\n\n\n/*\n    ForceDirected3D.Plot.NodeTypes\n\n    This class contains a list of <Graph.Node> built-in types. \n    Node types implemented are 'none', 'circle', 'triangle', 'rectangle', 'star', 'ellipse' and 'square'.\n\n    You can add your custom node types, customizing your visualization to the extreme.\n\n    Example:\n\n    (start code js)\n      ForceDirected3D.Plot.NodeTypes.implement({\n        'mySpecialType': {\n          'render': function(node, canvas) {\n            //print your custom node to canvas\n          },\n          //optional\n          'contains': function(node, pos) {\n            //return true if pos is inside the node or false otherwise\n          }\n        }\n      });\n    (end code)\n\n  */\nForceDirected3D.Plot.NodeTypes=new Class({\n'none':{\n'render':$.empty,\n'contains':$.lambda(false)},\n\n'circle':{\n'render':function render(node,canvas){\nvar pos=node.pos.getc(true),\ndim=node.getData('dim');\nthis.nodeHelper.circle.render('fill',pos,dim,canvas);\n},\n'contains':function contains(node,pos){\nvar npos=node.pos.getc(true),\ndim=node.getData('dim');\nreturn this.nodeHelper.circle.contains(npos,pos,dim);\n}},\n\n'ellipse':{\n'render':function render(node,canvas){\nvar pos=node.pos.getc(true),\nwidth=node.getData('width'),\nheight=node.getData('height');\nthis.nodeHelper.ellipse.render('fill',pos,width,height,canvas);\n},\n'contains':function contains(node,pos){\nvar npos=node.pos.getc(true),\nwidth=node.getData('width'),\nheight=node.getData('height');\nreturn this.nodeHelper.ellipse.contains(npos,pos,width,height);\n}},\n\n'square':{\n'render':function render(node,canvas){\nvar pos=node.pos.getc(true),\ndim=node.getData('dim');\nthis.nodeHelper.square.render('fill',pos,dim,canvas);\n},\n'contains':function contains(node,pos){\nvar npos=node.pos.getc(true),\ndim=node.getData('dim');\nreturn this.nodeHelper.square.contains(npos,pos,dim);\n}},\n\n'rectangle':{\n'render':function render(node,canvas){\nvar pos=node.pos.getc(true),\nwidth=node.getData('width'),\nheight=node.getData('height');\nthis.nodeHelper.rectangle.render('fill',pos,width,height,canvas);\n},\n'contains':function contains(node,pos){\nvar npos=node.pos.getc(true),\nwidth=node.getData('width'),\nheight=node.getData('height');\nreturn this.nodeHelper.rectangle.contains(npos,pos,width,height);\n}},\n\n'triangle':{\n'render':function render(node,canvas){\nvar pos=node.pos.getc(true),\ndim=node.getData('dim');\nthis.nodeHelper.triangle.render('fill',pos,dim,canvas);\n},\n'contains':function contains(node,pos){\nvar npos=node.pos.getc(true),\ndim=node.getData('dim');\nreturn this.nodeHelper.triangle.contains(npos,pos,dim);\n}},\n\n'star':{\n'render':function render(node,canvas){\nvar pos=node.pos.getc(true),\ndim=node.getData('dim');\nthis.nodeHelper.star.render('fill',pos,dim,canvas);\n},\n'contains':function contains(node,pos){\nvar npos=node.pos.getc(true),\ndim=node.getData('dim');\nreturn this.nodeHelper.star.contains(npos,pos,dim);\n}}});\n\n\n\n/*\n    ForceDirected3D.Plot.EdgeTypes\n  \n    This class contains a list of <Graph.Adjacence> built-in types. \n    Edge types implemented are 'none', 'line' and 'arrow'.\n  \n    You can add your custom edge types, customizing your visualization to the extreme.\n  \n    Example:\n  \n    (start code js)\n      ForceDirected3D.Plot.EdgeTypes.implement({\n        'mySpecialType': {\n          'render': function(adj, canvas) {\n            //print your custom edge to canvas\n          },\n          //optional\n          'contains': function(adj, pos) {\n            //return true if pos is inside the arc or false otherwise\n          }\n        }\n      });\n    (end code)\n  \n  */\nForceDirected3D.Plot.EdgeTypes=new Class({\n'none':$.empty,\n'line':{\n'render':function render(adj,canvas){\nvar from=adj.nodeFrom.pos.getc(true),\nto=adj.nodeTo.pos.getc(true);\nthis.edgeHelper.line.render(from,to,canvas);\n},\n'contains':function contains(adj,pos){\nvar from=adj.nodeFrom.pos.getc(true),\nto=adj.nodeTo.pos.getc(true);\nreturn this.edgeHelper.line.contains(from,to,pos,this.edge.epsilon);\n}},\n\n'arrow':{\n'render':function render(adj,canvas){\nvar from=adj.nodeFrom.pos.getc(true),\nto=adj.nodeTo.pos.getc(true),\ndim=adj.getData('dim'),\ndirection=adj.data.$direction,\ninv=direction&&direction.length>1&&direction[0]!=adj.nodeFrom.id;\nthis.edgeHelper.arrow.render(from,to,dim,inv,canvas);\n},\n'contains':function contains(adj,pos){\nvar from=adj.nodeFrom.pos.getc(true),\nto=adj.nodeTo.pos.getc(true);\nreturn this.edgeHelper.arrow.contains(from,to,pos,this.edge.epsilon);\n}}});\n\n\n\n})($jit.ForceDirected3D);\n\n// START METAMAPS CODE\nexports.default=$jit;\n// END METAMAPS CODE//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcwLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvcGF0Y2hlZC9KSVQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAoYykgMjAxMSBTZW5jaGEgSW5jLiAtIEF1dGhvcjogTmljb2xhcyBHYXJjaWEgQmVsbW9udGUgKGh0dHA6Ly9waGlsb2diLmdpdGh1Yi5jb20vKVxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG5hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG5USEUgU09GVFdBUkUuXG5cbiAqL1xuXG4vKlxuICBGaWxlOiBDb3JlLmpzXG5cbiAqL1xuXG4vKlxuIE9iamVjdDogJGppdFxuIFxuIERlZmluZXMgdGhlIG5hbWVzcGFjZSBmb3IgYWxsIGxpYnJhcnkgQ2xhc3NlcyBhbmQgT2JqZWN0cy4gXG4gVGhpcyB2YXJpYWJsZSBpcyB0aGUgKm9ubHkqIGdsb2JhbCB2YXJpYWJsZSBkZWZpbmVkIGluIHRoZSBUb29sa2l0LiBcbiBUaGVyZSBhcmUgYWxzbyBvdGhlciBpbnRlcmVzdGluZyBwcm9wZXJ0aWVzIGF0dGFjaGVkIHRvIHRoaXMgdmFyaWFibGUgZGVzY3JpYmVkIGJlbG93LlxuICovXG4vLyBTVEFSVCBNRVRBTUFQUyBDT0RFXG5jb25zdCAkaml0ID0gZnVuY3Rpb24odykge1xuLy8gT1JJR0lOQUw6XG4vLyB3aW5kb3cuJGppdCA9IGZ1bmN0aW9uKHcpIHtcbi8vIEVORCBNRVRBTUFQUyBDT0RFXG4gIHcgPSB3IHx8IHdpbmRvdztcbiAgZm9yKHZhciBrIGluICRqaXQpIHtcbiAgICBpZigkaml0W2tdLiRleHRlbmQpIHtcbiAgICAgIHdba10gPSAkaml0W2tdO1xuICAgIH1cbiAgfVxufTtcblxuJGppdC52ZXJzaW9uID0gJzIuMC4xJztcbi8qXG4gIE9iamVjdDogJGppdC5pZFxuICBcbiAgV29ya3MganVzdCBsaWtlICpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCpcbiAgXG4gIEV4YW1wbGU6XG4gIChzdGFydCBjb2RlIGpzKVxuICB2YXIgZWxlbWVudCA9ICRqaXQuaWQoJ2VsZW1lbnRJZCcpO1xuICAoZW5kIGNvZGUpXG5cbiovXG5cbi8qXG4gT2JqZWN0OiAkaml0LnV0aWxcbiBcbiBDb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucy5cbiBcbiBTb21lIG9mIHRoZSB1dGlsaXR5IGZ1bmN0aW9ucyBhbmQgdGhlIENsYXNzIHN5c3RlbSB3ZXJlIGJhc2VkIGluIHRoZSBNb29Ub29scyBGcmFtZXdvcmsgXG4gPGh0dHA6Ly9tb290b29scy5uZXQ+LiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxMCBWYWxlcmlvIFByb2lldHRpLCA8aHR0cDovL21hZDRtaWxrLm5ldC8+LiBcbiBNSVQgbGljZW5zZSA8aHR0cDovL21vb3Rvb2xzLm5ldC9saWNlbnNlLnR4dD4uXG4gXG4gVGhlc2UgbWV0aG9kcyBhcmUgZ2VuZXJhbGx5IGFsc28gaW1wbGVtZW50ZWQgaW4gRE9NIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmtzIGxpa2UgSlF1ZXJ5LCBNb29Ub29scyBhbmQgUHJvdG90eXBlLlxuIEknZCBzdWdnZXN0IHlvdSB0byB1c2UgdGhlIGZ1bmN0aW9ucyBmcm9tIHRob3NlIGxpYnJhcmllcyBpbnN0ZWFkIG9mIHVzaW5nIHRoZXNlLCBzaW5jZSB0aGVpciBmdW5jdGlvbnMgXG4gYXJlIHdpZGVseSB1c2VkIGFuZCB0ZXN0ZWQgaW4gbWFueSBkaWZmZXJlbnQgcGxhdGZvcm1zL2Jyb3dzZXJzLiBVc2UgdGhlc2UgZnVuY3Rpb25zIG9ubHkgaWYgeW91IGhhdmUgdG8uXG4gXG4gKi9cbnZhciAkID0gZnVuY3Rpb24oZCkge1xuICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk7XG59O1xuXG4kLmVtcHR5ID0gZnVuY3Rpb24oKSB7XG59O1xuXG4vKlxuICBNZXRob2Q6IGV4dGVuZFxuICBcbiAgQXVnbWVudCBhbiBvYmplY3QgYnkgYXBwZW5kaW5nIGFub3RoZXIgb2JqZWN0J3MgcHJvcGVydGllcy5cbiAgXG4gIFBhcmFtZXRlcnM6XG4gIFxuICBvcmlnaW5hbCAtIChvYmplY3QpIFRoZSBvYmplY3QgdG8gYmUgZXh0ZW5kZWQuXG4gIGV4dGVuZGVkIC0gKG9iamVjdCkgQW4gb2JqZWN0IHdoaWNoIHByb3BlcnRpZXMgYXJlIGdvaW5nIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBvcmlnaW5hbCBvYmplY3QuXG4gIFxuICBFeGFtcGxlOlxuICAoc3RhcnQgY29kZSBqcylcbiAgJGppdC51dGlsLmV4dGVuZCh7ICdhJzogMSwgJ2InOiAyIH0sIHsgJ2InOiAzLCAnYyc6IDQgfSk7IC8veyAnYSc6MSwgJ2InOiAzLCAnYyc6IDQgfVxuICAoZW5kIGNvZGUpXG4qL1xuJC5leHRlbmQgPSBmdW5jdGlvbihvcmlnaW5hbCwgZXh0ZW5kZWQpIHtcbiAgZm9yICggdmFyIGtleSBpbiAoZXh0ZW5kZWQgfHwge30pKVxuICAgIG9yaWdpbmFsW2tleV0gPSBleHRlbmRlZFtrZXldO1xuICByZXR1cm4gb3JpZ2luYWw7XG59O1xuXG4kLmxhbWJkYSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiAodHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicpID8gdmFsdWUgOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59O1xuXG4kLnRpbWUgPSBEYXRlLm5vdyB8fCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICtuZXcgRGF0ZTtcbn07XG5cbi8qXG4gIE1ldGhvZDogc3BsYXRcbiAgXG4gIFJldHVybnMgYW4gYXJyYXkgd3JhcHBpbmcgKm9iaiogaWYgKm9iaiogaXMgbm90IGFuIGFycmF5LiBSZXR1cm5zICpvYmoqIG90aGVyd2lzZS5cbiAgXG4gIFBhcmFtZXRlcnM6XG4gIFxuICBvYmogLSAobWl4ZWQpIFRoZSBvYmplY3QgdG8gYmUgd3JhcHBlZCBpbiBhbiBhcnJheS5cbiAgXG4gIEV4YW1wbGU6XG4gIChzdGFydCBjb2RlIGpzKVxuICAkaml0LnV0aWwuc3BsYXQoMyk7ICAgLy9bM11cbiAgJGppdC51dGlsLnNwbGF0KFszXSk7IC8vWzNdXG4gIChlbmQgY29kZSlcbiovXG4kLnNwbGF0ID0gZnVuY3Rpb24ob2JqKSB7XG4gIHZhciB0eXBlID0gJC50eXBlKG9iaik7XG4gIHJldHVybiB0eXBlID8gKCh0eXBlICE9ICdhcnJheScpID8gWyBvYmogXSA6IG9iaikgOiBbXTtcbn07XG5cbiQudHlwZSA9IGZ1bmN0aW9uKGVsZW0pIHtcbiAgdmFyIHR5cGUgPSAkLnR5cGUucy5jYWxsKGVsZW0pLm1hdGNoKC9eXFxbb2JqZWN0XFxzKC4qKVxcXSQvKVsxXS50b0xvd2VyQ2FzZSgpO1xuICBpZih0eXBlICE9ICdvYmplY3QnKSByZXR1cm4gdHlwZTtcbiAgaWYoZWxlbSAmJiBlbGVtLiQkZmFtaWx5KSByZXR1cm4gZWxlbS4kJGZhbWlseTtcbiAgcmV0dXJuIChlbGVtICYmIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlVHlwZSA9PSAxKT8gJ2VsZW1lbnQnIDogdHlwZTtcbn07XG4kLnR5cGUucyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qXG4gIE1ldGhvZDogZWFjaFxuICBcbiAgSXRlcmF0ZXMgdGhyb3VnaCBhbiBpdGVyYWJsZSBhcHBseWluZyAqZiouXG4gIFxuICBQYXJhbWV0ZXJzOlxuICBcbiAgaXRlcmFibGUgLSAoYXJyYXkpIFRoZSBvcmlnaW5hbCBhcnJheS5cbiAgZm4gLSAoZnVuY3Rpb24pIFRoZSBmdW5jdGlvbiB0byBhcHBseSB0byB0aGUgYXJyYXkgZWxlbWVudHMuXG4gIFxuICBFeGFtcGxlOlxuICAoc3RhcnQgY29kZSBqcylcbiAgJGppdC51dGlsLmVhY2goWzMsIDQsIDVdLCBmdW5jdGlvbihuKSB7IGFsZXJ0KCdudW1iZXIgJyArIG4pOyB9KTtcbiAgKGVuZCBjb2RlKVxuKi9cbiQuZWFjaCA9IGZ1bmN0aW9uKGl0ZXJhYmxlLCBmbikge1xuICB2YXIgdHlwZSA9ICQudHlwZShpdGVyYWJsZSk7XG4gIGlmICh0eXBlID09ICdvYmplY3QnKSB7XG4gICAgZm9yICggdmFyIGtleSBpbiBpdGVyYWJsZSlcbiAgICAgIGZuKGl0ZXJhYmxlW2tleV0sIGtleSk7XG4gIH0gZWxzZSB7XG4gICAgZm9yICggdmFyIGkgPSAwLCBsID0gaXRlcmFibGUubGVuZ3RoOyBpIDwgbDsgaSsrKVxuICAgICAgZm4oaXRlcmFibGVbaV0sIGkpO1xuICB9XG59O1xuXG4kLmluZGV4T2YgPSBmdW5jdGlvbihhcnJheSwgaXRlbSkge1xuICBpZihBcnJheS5pbmRleE9mKSByZXR1cm4gYXJyYXkuaW5kZXhPZihpdGVtKTtcbiAgZm9yKHZhciBpPTAsbD1hcnJheS5sZW5ndGg7IGk8bDsgaSsrKSB7XG4gICAgaWYoYXJyYXlbaV0gPT09IGl0ZW0pIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn07XG5cbi8qXG4gIE1ldGhvZDogbWFwXG4gIFxuICBNYXBzIG9yIGNvbGxlY3RzIGFuIGFycmF5IGJ5IGFwcGx5aW5nICpmKi5cbiAgXG4gIFBhcmFtZXRlcnM6XG4gIFxuICBhcnJheSAtIChhcnJheSkgVGhlIG9yaWdpbmFsIGFycmF5LlxuICBmIC0gKGZ1bmN0aW9uKSBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgdG8gdGhlIGFycmF5IGVsZW1lbnRzLlxuICBcbiAgRXhhbXBsZTpcbiAgKHN0YXJ0IGNvZGUganMpXG4gICRqaXQudXRpbC5tYXAoWzMsIDQsIDVdLCBmdW5jdGlvbihuKSB7IHJldHVybiBuKm47IH0pOyAvL1s5LCAxNiwgMjVdXG4gIChlbmQgY29kZSlcbiovXG4kLm1hcCA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7XG4gIHZhciBhbnMgPSBbXTtcbiAgJC5lYWNoKGFycmF5LCBmdW5jdGlvbihlbGVtLCBpKSB7XG4gICAgYW5zLnB1c2goZihlbGVtLCBpKSk7XG4gIH0pO1xuICByZXR1cm4gYW5zO1xufTtcblxuLypcbiAgTWV0aG9kOiByZWR1Y2VcbiAgXG4gIEl0ZXJhdGl2ZWx5IGFwcGxpZXMgdGhlIGJpbmFyeSBmdW5jdGlvbiAqZiogc3RvcmluZyB0aGUgcmVzdWx0IGluIGFuIGFjY3VtdWxhdG9yLlxuICBcbiAgUGFyYW1ldGVyczpcbiAgXG4gIGFycmF5IC0gKGFycmF5KSBUaGUgb3JpZ2luYWwgYXJyYXkuXG4gIGYgLSAoZnVuY3Rpb24pIFRoZSBmdW5jdGlvbiB0byBhcHBseSB0byB0aGUgYXJyYXkgZWxlbWVudHMuXG4gIG9wdCAtIChvcHRpb25hbHxtaXhlZCkgVGhlIHN0YXJ0aW5nIHZhbHVlIGZvciB0aGUgYWN1bXVsYXRvci5cbiAgXG4gIEV4YW1wbGU6XG4gIChzdGFydCBjb2RlIGpzKVxuICAkaml0LnV0aWwucmVkdWNlKFszLCA0LCA1XSwgZnVuY3Rpb24oeCwgeSkgeyByZXR1cm4geCArIHk7IH0sIDApOyAvLzEyXG4gIChlbmQgY29kZSlcbiovXG4kLnJlZHVjZSA9IGZ1bmN0aW9uKGFycmF5LCBmLCBvcHQpIHtcbiAgdmFyIGwgPSBhcnJheS5sZW5ndGg7XG4gIGlmKGw9PTApIHJldHVybiBvcHQ7XG4gIHZhciBhY3VtID0gYXJndW1lbnRzLmxlbmd0aCA9PSAzPyBvcHQgOiBhcnJheVstLWxdO1xuICB3aGlsZShsLS0pIHtcbiAgICBhY3VtID0gZihhY3VtLCBhcnJheVtsXSk7XG4gIH1cbiAgcmV0dXJuIGFjdW07XG59O1xuXG4vKlxuICBNZXRob2Q6IG1lcmdlXG4gIFxuICBNZXJnZXMgbi1vYmplY3RzIGFuZCB0aGVpciBzdWItb2JqZWN0cyBjcmVhdGluZyBhIG5ldywgZnJlc2ggb2JqZWN0LlxuICBcbiAgUGFyYW1ldGVyczpcbiAgXG4gIEFuIGFyYml0cmFyeSBudW1iZXIgb2Ygb2JqZWN0cy5cbiAgXG4gIEV4YW1wbGU6XG4gIChzdGFydCBjb2RlIGpzKVxuICAkaml0LnV0aWwubWVyZ2UoeyAnYSc6IDEsICdiJzogMiB9LCB7ICdiJzogMywgJ2MnOiA0IH0pOyAvL3sgJ2EnOjEsICdiJzogMywgJ2MnOiA0IH1cbiAgKGVuZCBjb2RlKVxuKi9cbiQubWVyZ2UgPSBmdW5jdGlvbigpIHtcbiAgdmFyIG1peCA9IHt9O1xuICBmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIG9iamVjdCA9IGFyZ3VtZW50c1tpXTtcbiAgICBpZiAoJC50eXBlKG9iamVjdCkgIT0gJ29iamVjdCcpXG4gICAgICBjb250aW51ZTtcbiAgICBmb3IgKCB2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAgdmFyIG9wID0gb2JqZWN0W2tleV0sIG1wID0gbWl4W2tleV07XG4gICAgICBtaXhba2V5XSA9IChtcCAmJiAkLnR5cGUob3ApID09ICdvYmplY3QnICYmICQudHlwZShtcCkgPT0gJ29iamVjdCcpID8gJFxuICAgICAgICAgIC5tZXJnZShtcCwgb3ApIDogJC51bmxpbmsob3ApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWl4O1xufTtcblxuJC51bmxpbmsgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgdmFyIHVubGlua2VkO1xuICBzd2l0Y2ggKCQudHlwZShvYmplY3QpKSB7XG4gIGNhc2UgJ29iamVjdCc6XG4gICAgdW5saW5rZWQgPSB7fTtcbiAgICBmb3IgKCB2YXIgcCBpbiBvYmplY3QpXG4gICAgICB1bmxpbmtlZFtwXSA9ICQudW5saW5rKG9iamVjdFtwXSk7XG4gICAgYnJlYWs7XG4gIGNhc2UgJ2FycmF5JzpcbiAgICB1bmxpbmtlZCA9IFtdO1xuICAgIGZvciAoIHZhciBpID0gMCwgbCA9IG9iamVjdC5sZW5ndGg7IGkgPCBsOyBpKyspXG4gICAgICB1bmxpbmtlZFtpXSA9ICQudW5saW5rKG9iamVjdFtpXSk7XG4gICAgYnJlYWs7XG4gIGRlZmF1bHQ6XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuICByZXR1cm4gdW5saW5rZWQ7XG59O1xuXG4kLnppcCA9IGZ1bmN0aW9uKCkge1xuICBpZihhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gIGZvcih2YXIgaj0wLCBhbnM9W10sIGw9YXJndW1lbnRzLmxlbmd0aCwgbWw9YXJndW1lbnRzWzBdLmxlbmd0aDsgajxtbDsgaisrKSB7XG4gICAgZm9yKHZhciBpPTAsIHJvdz1bXTsgaTxsOyBpKyspIHtcbiAgICAgIHJvdy5wdXNoKGFyZ3VtZW50c1tpXVtqXSk7XG4gICAgfVxuICAgIGFucy5wdXNoKHJvdyk7XG4gIH1cbiAgcmV0dXJuIGFucztcbn07XG5cbi8qXG4gIE1ldGhvZDogcmdiVG9IZXhcbiAgXG4gIENvbnZlcnRzIGFuIFJHQiBhcnJheSBpbnRvIGEgSGV4IHN0cmluZy5cbiAgXG4gIFBhcmFtZXRlcnM6XG4gIFxuICBzcmNBcnJheSAtIChhcnJheSkgQW4gYXJyYXkgd2l0aCBSLCBHIGFuZCBCIHZhbHVlc1xuICBcbiAgRXhhbXBsZTpcbiAgKHN0YXJ0IGNvZGUganMpXG4gICRqaXQudXRpbC5yZ2JUb0hleChbMjU1LCAyNTUsIDI1NV0pOyAvLycjZmZmZmZmJ1xuICAoZW5kIGNvZGUpXG4qL1xuJC5yZ2JUb0hleCA9IGZ1bmN0aW9uKHNyY0FycmF5LCBhcnJheSkge1xuICBpZiAoc3JjQXJyYXkubGVuZ3RoIDwgMylcbiAgICByZXR1cm4gbnVsbDtcbiAgaWYgKHNyY0FycmF5Lmxlbmd0aCA9PSA0ICYmIHNyY0FycmF5WzNdID09IDAgJiYgIWFycmF5KVxuICAgIHJldHVybiAndHJhbnNwYXJlbnQnO1xuICB2YXIgaGV4ID0gW107XG4gIGZvciAoIHZhciBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgIHZhciBiaXQgPSAoc3JjQXJyYXlbaV0gLSAwKS50b1N0cmluZygxNik7XG4gICAgaGV4LnB1c2goYml0Lmxlbmd0aCA9PSAxID8gJzAnICsgYml0IDogYml0KTtcbiAgfVxuICByZXR1cm4gYXJyYXkgPyBoZXggOiAnIycgKyBoZXguam9pbignJyk7XG59O1xuXG4vKlxuICBNZXRob2Q6IGhleFRvUmdiXG4gIFxuICBDb252ZXJ0cyBhbiBIZXggY29sb3Igc3RyaW5nIGludG8gYW4gUkdCIGFycmF5LlxuICBcbiAgUGFyYW1ldGVyczpcbiAgXG4gIGhleCAtIChzdHJpbmcpIEEgY29sb3IgaGV4IHN0cmluZy5cbiAgXG4gIEV4YW1wbGU6XG4gIChzdGFydCBjb2RlIGpzKVxuICAkaml0LnV0aWwuaGV4VG9SZ2IoJyNmZmYnKTsgLy9bMjU1LCAyNTUsIDI1NV1cbiAgKGVuZCBjb2RlKVxuKi9cbiQuaGV4VG9SZ2IgPSBmdW5jdGlvbihoZXgpIHtcbiAgaWYgKGhleC5sZW5ndGggIT0gNykge1xuICAgIGhleCA9IGhleC5tYXRjaCgvXiM/KFxcd3sxLDJ9KShcXHd7MSwyfSkoXFx3ezEsMn0pJC8pO1xuICAgIGhleC5zaGlmdCgpO1xuICAgIGlmIChoZXgubGVuZ3RoICE9IDMpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB2YXIgcmdiID0gW107XG4gICAgZm9yICggdmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgICB2YXIgdmFsdWUgPSBoZXhbaV07XG4gICAgICBpZiAodmFsdWUubGVuZ3RoID09IDEpXG4gICAgICAgIHZhbHVlICs9IHZhbHVlO1xuICAgICAgcmdiLnB1c2gocGFyc2VJbnQodmFsdWUsIDE2KSk7XG4gICAgfVxuICAgIHJldHVybiByZ2I7XG4gIH0gZWxzZSB7XG4gICAgaGV4ID0gcGFyc2VJbnQoaGV4LnNsaWNlKDEpLCAxNik7XG4gICAgcmV0dXJuIFsgaGV4ID4+IDE2LCBoZXggPj4gOCAmIDB4ZmYsIGhleCAmIDB4ZmYgXTtcbiAgfVxufTtcblxuJC5kZXN0cm95ID0gZnVuY3Rpb24oZWxlbSkge1xuICAkLmNsZWFuKGVsZW0pO1xuICBpZiAoZWxlbS5wYXJlbnROb2RlKVxuICAgIGVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtKTtcbiAgaWYgKGVsZW0uY2xlYXJBdHRyaWJ1dGVzKVxuICAgIGVsZW0uY2xlYXJBdHRyaWJ1dGVzKCk7XG59O1xuXG4kLmNsZWFuID0gZnVuY3Rpb24oZWxlbSkge1xuICBmb3IgKHZhciBjaCA9IGVsZW0uY2hpbGROb2RlcywgaSA9IDAsIGwgPSBjaC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAkLmRlc3Ryb3koY2hbaV0pO1xuICB9XG59O1xuXG4vKlxuICBNZXRob2Q6IGFkZEV2ZW50XG4gIFxuICBDcm9zcy1icm93c2VyIGFkZCBldmVudCBsaXN0ZW5lci5cbiAgXG4gIFBhcmFtZXRlcnM6XG4gIFxuICBvYmogLSAob2JqKSBUaGUgRWxlbWVudCB0byBhdHRhY2ggdGhlIGxpc3RlbmVyIHRvLlxuICB0eXBlIC0gKHN0cmluZykgVGhlIGxpc3RlbmVyIHR5cGUuIEZvciBleGFtcGxlICdjbGljaycsIG9yICdtb3VzZW1vdmUnLlxuICBmbiAtIChmdW5jdGlvbikgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIHVzZWQgd2hlbiB0aGUgZXZlbnQgaXMgZmlyZWQuXG4gIFxuICBFeGFtcGxlOlxuICAoc3RhcnQgY29kZSBqcylcbiAgJGppdC51dGlsLmFkZEV2ZW50KGVsZW0sICdjbGljaycsIGZ1bmN0aW9uKCl7IGFsZXJ0KCdoZWxsbycpOyB9KTtcbiAgKGVuZCBjb2RlKVxuKi9cbiQuYWRkRXZlbnQgPSBmdW5jdGlvbihvYmosIHR5cGUsIGZuKSB7XG4gIGlmIChvYmouYWRkRXZlbnRMaXN0ZW5lcilcbiAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBmbiwgZmFsc2UpO1xuICBlbHNlXG4gICAgb2JqLmF0dGFjaEV2ZW50KCdvbicgKyB0eXBlLCBmbik7XG59O1xuXG4kLmFkZEV2ZW50cyA9IGZ1bmN0aW9uKG9iaiwgdHlwZU9iaikge1xuICBmb3IodmFyIHR5cGUgaW4gdHlwZU9iaikge1xuICAgICQuYWRkRXZlbnQob2JqLCB0eXBlLCB0eXBlT2JqW3R5cGVdKTtcbiAgfVxufTtcblxuJC5oYXNDbGFzcyA9IGZ1bmN0aW9uKG9iaiwga2xhc3MpIHtcbiAgcmV0dXJuICgnICcgKyBvYmouY2xhc3NOYW1lICsgJyAnKS5pbmRleE9mKCcgJyArIGtsYXNzICsgJyAnKSA+IC0xO1xufTtcblxuJC5hZGRDbGFzcyA9IGZ1bmN0aW9uKG9iaiwga2xhc3MpIHtcbiAgaWYgKCEkLmhhc0NsYXNzKG9iaiwga2xhc3MpKVxuICAgIG9iai5jbGFzc05hbWUgPSAob2JqLmNsYXNzTmFtZSArIFwiIFwiICsga2xhc3MpO1xufTtcblxuJC5yZW1vdmVDbGFzcyA9IGZ1bmN0aW9uKG9iaiwga2xhc3MpIHtcbiAgb2JqLmNsYXNzTmFtZSA9IG9iai5jbGFzc05hbWUucmVwbGFjZShuZXcgUmVnRXhwKFxuICAgICAgJyhefFxcXFxzKScgKyBrbGFzcyArICcoPzpcXFxcc3wkKScpLCAnJDEnKTtcbn07XG5cbiQuZ2V0UG9zID0gZnVuY3Rpb24oZWxlbSkge1xuICB2YXIgb2Zmc2V0ID0gZ2V0T2Zmc2V0cyhlbGVtKTtcbiAgdmFyIHNjcm9sbCA9IGdldFNjcm9sbHMoZWxlbSk7XG4gIHJldHVybiB7XG4gICAgeDogb2Zmc2V0LnggLSBzY3JvbGwueCxcbiAgICB5OiBvZmZzZXQueSAtIHNjcm9sbC55XG4gIH07XG5cbiAgZnVuY3Rpb24gZ2V0T2Zmc2V0cyhlbGVtKSB7XG4gICAgdmFyIHBvc2l0aW9uID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9O1xuICAgIHdoaWxlIChlbGVtICYmICFpc0JvZHkoZWxlbSkpIHtcbiAgICAgIHBvc2l0aW9uLnggKz0gZWxlbS5vZmZzZXRMZWZ0O1xuICAgICAgcG9zaXRpb24ueSArPSBlbGVtLm9mZnNldFRvcDtcbiAgICAgIGVsZW0gPSBlbGVtLm9mZnNldFBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U2Nyb2xscyhlbGVtKSB7XG4gICAgdmFyIHBvc2l0aW9uID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9O1xuICAgIHdoaWxlIChlbGVtICYmICFpc0JvZHkoZWxlbSkpIHtcbiAgICAgIHBvc2l0aW9uLnggKz0gZWxlbS5zY3JvbGxMZWZ0O1xuICAgICAgcG9zaXRpb24ueSArPSBlbGVtLnNjcm9sbFRvcDtcbiAgICAgIGVsZW0gPSBlbGVtLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzQm9keShlbGVtZW50KSB7XG4gICAgcmV0dXJuICgvXig/OmJvZHl8aHRtbCkkL2kpLnRlc3QoZWxlbWVudC50YWdOYW1lKTtcbiAgfVxufTtcblxuJC5ldmVudCA9IHtcbiAgZ2V0OiBmdW5jdGlvbihlLCB3aW4pIHtcbiAgICB3aW4gPSB3aW4gfHwgd2luZG93O1xuICAgIHJldHVybiBlIHx8IHdpbi5ldmVudDtcbiAgfSxcbiAgZ2V0V2hlZWw6IGZ1bmN0aW9uKGUpIHtcbiAgICByZXR1cm4gZS53aGVlbERlbHRhPyBlLndoZWVsRGVsdGEgLyAxMjAgOiAtKGUuZGV0YWlsIHx8IDApIC8gMztcbiAgfSxcbiAgaXNSaWdodENsaWNrOiBmdW5jdGlvbihlKSB7XG4gICAgcmV0dXJuIChlLndoaWNoID09IDMgfHwgZS5idXR0b24gPT0gMik7XG4gIH0sXG4gIGdldFBvczogZnVuY3Rpb24oZSwgd2luKSB7XG4gICAgLy8gZ2V0IG1vdXNlIHBvc2l0aW9uXG4gICAgd2luID0gd2luIHx8IHdpbmRvdztcbiAgICBlID0gZSB8fCB3aW4uZXZlbnQ7XG4gICAgdmFyIGRvYyA9IHdpbi5kb2N1bWVudDtcbiAgICBkb2MgPSBkb2MuZG9jdW1lbnRFbGVtZW50IHx8IGRvYy5ib2R5O1xuICAgIC8vVE9ETyhuaWNvKTogbWFrZSB0b3VjaCBldmVudCBoYW5kbGluZyBiZXR0ZXJcbiAgICBpZihlLnRvdWNoZXMgJiYgZS50b3VjaGVzLmxlbmd0aCkge1xuICAgICAgZSA9IGUudG91Y2hlc1swXTtcbiAgICB9XG4gICAgdmFyIHBhZ2UgPSB7XG4gICAgICB4OiBlLnBhZ2VYIHx8IChlLmNsaWVudFggKyBkb2Muc2Nyb2xsTGVmdCksXG4gICAgICB5OiBlLnBhZ2VZIHx8IChlLmNsaWVudFkgKyBkb2Muc2Nyb2xsVG9wKVxuICAgIH07XG4gICAgcmV0dXJuIHBhZ2U7XG4gIH0sXG4gIHN0b3A6IGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAoZS5zdG9wUHJvcGFnYXRpb24pIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZS5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZWxzZSBlLnJldHVyblZhbHVlID0gZmFsc2U7XG4gIH1cbn07XG5cbiRqaXQudXRpbCA9ICRqaXQuaWQgPSAkO1xuXG52YXIgQ2xhc3MgPSBmdW5jdGlvbihwcm9wZXJ0aWVzKSB7XG4gIHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzIHx8IHt9O1xuICB2YXIga2xhc3MgPSBmdW5jdGlvbigpIHtcbiAgICBmb3IgKCB2YXIga2V5IGluIHRoaXMpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpc1trZXldICE9ICdmdW5jdGlvbicpXG4gICAgICAgIHRoaXNba2V5XSA9ICQudW5saW5rKHRoaXNba2V5XSk7XG4gICAgfVxuICAgIHRoaXMuY29uc3RydWN0b3IgPSBrbGFzcztcbiAgICBpZiAoQ2xhc3MucHJvdG90eXBpbmcpXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLmluaXRpYWxpemUgPyB0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICA6IHRoaXM7XG4gICAgLy90eXBpemVcbiAgICB0aGlzLiQkZmFtaWx5ID0gJ2NsYXNzJztcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH07XG5cbiAgZm9yICggdmFyIG11dGF0b3IgaW4gQ2xhc3MuTXV0YXRvcnMpIHtcbiAgICBpZiAoIXByb3BlcnRpZXNbbXV0YXRvcl0pXG4gICAgICBjb250aW51ZTtcbiAgICBwcm9wZXJ0aWVzID0gQ2xhc3MuTXV0YXRvcnNbbXV0YXRvcl0ocHJvcGVydGllcywgcHJvcGVydGllc1ttdXRhdG9yXSk7XG4gICAgZGVsZXRlIHByb3BlcnRpZXNbbXV0YXRvcl07XG4gIH1cblxuICAkLmV4dGVuZChrbGFzcywgdGhpcyk7XG4gIGtsYXNzLmNvbnN0cnVjdG9yID0gQ2xhc3M7XG4gIGtsYXNzLnByb3RvdHlwZSA9IHByb3BlcnRpZXM7XG4gIHJldHVybiBrbGFzcztcbn07XG5cbkNsYXNzLk11dGF0b3JzID0ge1xuXG4gIEltcGxlbWVudHM6IGZ1bmN0aW9uKHNlbGYsIGtsYXNzZXMpIHtcbiAgICAkLmVhY2goJC5zcGxhdChrbGFzc2VzKSwgZnVuY3Rpb24oa2xhc3MpIHtcbiAgICAgIENsYXNzLnByb3RvdHlwaW5nID0ga2xhc3M7XG4gICAgICB2YXIgaW5zdGFuY2UgPSAodHlwZW9mIGtsYXNzID09ICdmdW5jdGlvbicpID8gbmV3IGtsYXNzIDoga2xhc3M7XG4gICAgICBmb3IgKCB2YXIgcHJvcCBpbiBpbnN0YW5jZSkge1xuICAgICAgICBpZiAoIShwcm9wIGluIHNlbGYpKSB7XG4gICAgICAgICAgc2VsZltwcm9wXSA9IGluc3RhbmNlW3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkZWxldGUgQ2xhc3MucHJvdG90eXBpbmc7XG4gICAgfSk7XG4gICAgcmV0dXJuIHNlbGY7XG4gIH1cblxufTtcblxuJC5leHRlbmQoQ2xhc3MsIHtcblxuICBpbmhlcml0OiBmdW5jdGlvbihvYmplY3QsIHByb3BlcnRpZXMpIHtcbiAgICBmb3IgKCB2YXIga2V5IGluIHByb3BlcnRpZXMpIHtcbiAgICAgIHZhciBvdmVycmlkZSA9IHByb3BlcnRpZXNba2V5XTtcbiAgICAgIHZhciBwcmV2aW91cyA9IG9iamVjdFtrZXldO1xuICAgICAgdmFyIHR5cGUgPSAkLnR5cGUob3ZlcnJpZGUpO1xuICAgICAgaWYgKHByZXZpb3VzICYmIHR5cGUgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAob3ZlcnJpZGUgIT0gcHJldmlvdXMpIHtcbiAgICAgICAgICBDbGFzcy5vdmVycmlkZShvYmplY3QsIGtleSwgb3ZlcnJpZGUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgb2JqZWN0W2tleV0gPSAkLm1lcmdlKHByZXZpb3VzLCBvdmVycmlkZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmplY3Rba2V5XSA9IG92ZXJyaWRlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0O1xuICB9LFxuXG4gIG92ZXJyaWRlOiBmdW5jdGlvbihvYmplY3QsIG5hbWUsIG1ldGhvZCkge1xuICAgIHZhciBwYXJlbnQgPSBDbGFzcy5wcm90b3R5cGluZztcbiAgICBpZiAocGFyZW50ICYmIG9iamVjdFtuYW1lXSAhPSBwYXJlbnRbbmFtZV0pXG4gICAgICBwYXJlbnQgPSBudWxsO1xuICAgIHZhciBvdmVycmlkZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHByZXZpb3VzID0gdGhpcy5wYXJlbnQ7XG4gICAgICB0aGlzLnBhcmVudCA9IHBhcmVudCA/IHBhcmVudFtuYW1lXSA6IG9iamVjdFtuYW1lXTtcbiAgICAgIHZhciB2YWx1ZSA9IG1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgdGhpcy5wYXJlbnQgPSBwcmV2aW91cztcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIG9iamVjdFtuYW1lXSA9IG92ZXJyaWRlO1xuICB9XG5cbn0pO1xuXG5DbGFzcy5wcm90b3R5cGUuaW1wbGVtZW50ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBwcm90byA9IHRoaXMucHJvdG90eXBlO1xuICAkLmVhY2goQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzIHx8IFtdKSwgZnVuY3Rpb24ocHJvcGVydGllcykge1xuICAgIENsYXNzLmluaGVyaXQocHJvdG8sIHByb3BlcnRpZXMpO1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4kaml0LkNsYXNzID0gQ2xhc3M7XG5cbi8qXG4gIE9iamVjdDogJGppdC5qc29uXG4gIFxuICBQcm92aWRlcyBKU09OIHV0aWxpdHkgZnVuY3Rpb25zLlxuICBcbiAgTW9zdCBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIEpTT04tdHJlZSB0cmF2ZXJzYWwgYW5kIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMuXG4qL1xuJGppdC5qc29uID0ge1xuICAvKlxuICAgICBNZXRob2Q6IHBydW5lXG4gIFxuICAgICBDbGVhcnMgYWxsIHRyZWUgbm9kZXMgaGF2aW5nIGRlcHRoIGdyZWF0ZXIgdGhhbiBtYXhMZXZlbC5cbiAgXG4gICAgIFBhcmFtZXRlcnM6XG4gIFxuICAgICAgICB0cmVlIC0gKG9iamVjdCkgQSBKU09OIHRyZWUgb2JqZWN0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIDxMb2FkZXIubG9hZEpTT04+LlxuICAgICAgICBtYXhMZXZlbCAtIChudW1iZXIpIEFuIGludGVnZXIgc3BlY2lmeWluZyB0aGUgbWF4aW11bSBsZXZlbCBhbGxvd2VkIGZvciB0aGlzIHRyZWUuIEFsbCBub2RlcyBoYXZpbmcgZGVwdGggZ3JlYXRlciB0aGFuIG1heCBsZXZlbCB3aWxsIGJlIGRlbGV0ZWQuXG5cbiAgKi9cbiAgcHJ1bmU6IGZ1bmN0aW9uKHRyZWUsIG1heExldmVsKSB7XG4gICAgdGhpcy5lYWNoKHRyZWUsIGZ1bmN0aW9uKGVsZW0sIGkpIHtcbiAgICAgIGlmIChpID09IG1heExldmVsICYmIGVsZW0uY2hpbGRyZW4pIHtcbiAgICAgICAgZGVsZXRlIGVsZW0uY2hpbGRyZW47XG4gICAgICAgIGVsZW0uY2hpbGRyZW4gPSBbXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgLypcbiAgICAgTWV0aG9kOiBnZXRQYXJlbnRcbiAgXG4gICAgIFJldHVybnMgdGhlIHBhcmVudCBub2RlIG9mIHRoZSBub2RlIGhhdmluZyBfaWRfIGFzIGlkLlxuICBcbiAgICAgUGFyYW1ldGVyczpcbiAgXG4gICAgICAgIHRyZWUgLSAob2JqZWN0KSBBIEpTT04gdHJlZSBvYmplY3QuIFNlZSBhbHNvIDxMb2FkZXIubG9hZEpTT04+LlxuICAgICAgICBpZCAtIChzdHJpbmcpIFRoZSBfaWRfIG9mIHRoZSBjaGlsZCBub2RlIHdob3NlIHBhcmVudCB3aWxsIGJlIHJldHVybmVkLlxuXG4gICAgUmV0dXJuczpcblxuICAgICAgICBBIHRyZWUgSlNPTiBub2RlIGlmIGFueSwgb3IgZmFsc2Ugb3RoZXJ3aXNlLlxuICBcbiAgKi9cbiAgZ2V0UGFyZW50OiBmdW5jdGlvbih0cmVlLCBpZCkge1xuICAgIGlmICh0cmVlLmlkID09IGlkKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBjaCA9IHRyZWUuY2hpbGRyZW47XG4gICAgaWYgKGNoICYmIGNoLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IGNoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChjaFtpXS5pZCA9PSBpZClcbiAgICAgICAgICByZXR1cm4gdHJlZTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFyIGFucyA9IHRoaXMuZ2V0UGFyZW50KGNoW2ldLCBpZCk7XG4gICAgICAgICAgaWYgKGFucylcbiAgICAgICAgICAgIHJldHVybiBhbnM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICAvKlxuICAgICBNZXRob2Q6IGdldFN1YnRyZWVcbiAgXG4gICAgIFJldHVybnMgdGhlIHN1YnRyZWUgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBpZC5cbiAgXG4gICAgIFBhcmFtZXRlcnM6XG4gIFxuICAgICAgICB0cmVlIC0gKG9iamVjdCkgQSBKU09OIHRyZWUgb2JqZWN0LiBTZWUgYWxzbyA8TG9hZGVyLmxvYWRKU09OPi5cbiAgICAgICAgaWQgLSAoc3RyaW5nKSBBIG5vZGUgKnVuaXF1ZSogaWRlbnRpZmllci5cbiAgXG4gICAgIFJldHVybnM6XG4gIFxuICAgICAgICBBIHN1YnRyZWUgaGF2aW5nIGEgcm9vdCBub2RlIG1hdGNoaW5nIHRoZSBnaXZlbiBpZC4gUmV0dXJucyBudWxsIGlmIG5vIHN1YnRyZWUgbWF0Y2hpbmcgdGhlIGlkIGlzIGZvdW5kLlxuXG4gICovXG4gIGdldFN1YnRyZWU6IGZ1bmN0aW9uKHRyZWUsIGlkKSB7XG4gICAgaWYgKHRyZWUuaWQgPT0gaWQpXG4gICAgICByZXR1cm4gdHJlZTtcbiAgICBmb3IgKCB2YXIgaSA9IDAsIGNoID0gdHJlZS5jaGlsZHJlbjsgY2ggJiYgaSA8IGNoLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdCA9IHRoaXMuZ2V0U3VidHJlZShjaFtpXSwgaWQpO1xuICAgICAgaWYgKHQgIT0gbnVsbClcbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LFxuICAvKlxuICAgICBNZXRob2Q6IGVhY2hMZXZlbFxuICBcbiAgICAgIEl0ZXJhdGVzIG9uIHRyZWUgbm9kZXMgd2l0aCByZWxhdGl2ZSBkZXB0aCBsZXNzIG9yIGVxdWFsIHRoYW4gYSBzcGVjaWZpZWQgbGV2ZWwuXG4gIFxuICAgICBQYXJhbWV0ZXJzOlxuICBcbiAgICAgICAgdHJlZSAtIChvYmplY3QpIEEgSlNPTiB0cmVlIG9yIHN1YnRyZWUuIFNlZSBhbHNvIDxMb2FkZXIubG9hZEpTT04+LlxuICAgICAgICBpbml0TGV2ZWwgLSAobnVtYmVyKSBBbiBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIGluaXRpYWwgcmVsYXRpdmUgbGV2ZWwuIFVzdWFsbHkgemVyby5cbiAgICAgICAgdG9MZXZlbCAtIChudW1iZXIpIEFuIGludGVnZXIgc3BlY2lmeWluZyBhIHRvcCBsZXZlbC4gVGhpcyBtZXRob2Qgd2lsbCBpdGVyYXRlIG9ubHkgdGhyb3VnaCBub2RlcyB3aXRoIGRlcHRoIGxlc3MgdGhhbiBvciBlcXVhbCB0aGlzIG51bWJlci5cbiAgICAgICAgYWN0aW9uIC0gKGZ1bmN0aW9uKSBBIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgYSBub2RlIGFuZCBhbiBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIGFjdHVhbCBsZXZlbCBvZiB0aGUgbm9kZS5cbiAgICAgICAgICBcbiAgICBFeGFtcGxlOlxuICAgKHN0YXJ0IGNvZGUganMpXG4gICAgICRqaXQuanNvbi5lYWNoTGV2ZWwodHJlZSwgMCwgMywgZnVuY3Rpb24obm9kZSwgZGVwdGgpIHtcbiAgICAgICAgYWxlcnQobm9kZS5uYW1lICsgJyAnICsgZGVwdGgpO1xuICAgICB9KTtcbiAgIChlbmQgY29kZSlcbiAgKi9cbiAgZWFjaExldmVsOiBmdW5jdGlvbih0cmVlLCBpbml0TGV2ZWwsIHRvTGV2ZWwsIGFjdGlvbikge1xuICAgIGlmIChpbml0TGV2ZWwgPD0gdG9MZXZlbCkge1xuICAgICAgYWN0aW9uKHRyZWUsIGluaXRMZXZlbCk7XG4gICAgICBpZighdHJlZS5jaGlsZHJlbikgcmV0dXJuO1xuICAgICAgZm9yICggdmFyIGkgPSAwLCBjaCA9IHRyZWUuY2hpbGRyZW47IGkgPCBjaC5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmVhY2hMZXZlbChjaFtpXSwgaW5pdExldmVsICsgMSwgdG9MZXZlbCwgYWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIC8qXG4gICAgIE1ldGhvZDogZWFjaFxuICBcbiAgICAgIEEgSlNPTiB0cmVlIGl0ZXJhdG9yLlxuICBcbiAgICAgUGFyYW1ldGVyczpcbiAgXG4gICAgICAgIHRyZWUgLSAob2JqZWN0KSBBIEpTT04gdHJlZSBvciBzdWJ0cmVlLiBTZWUgYWxzbyA8TG9hZGVyLmxvYWRKU09OPi5cbiAgICAgICAgYWN0aW9uIC0gKGZ1bmN0aW9uKSBBIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgYSBub2RlLlxuXG4gICAgRXhhbXBsZTpcbiAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgICRqaXQuanNvbi5lYWNoKHRyZWUsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgYWxlcnQobm9kZS5uYW1lKTtcbiAgICAgIH0pO1xuICAgIChlbmQgY29kZSlcbiAgICAgICAgICBcbiAgKi9cbiAgZWFjaDogZnVuY3Rpb24odHJlZSwgYWN0aW9uKSB7XG4gICAgdGhpcy5lYWNoTGV2ZWwodHJlZSwgMCwgTnVtYmVyLk1BWF9WQUxVRSwgYWN0aW9uKTtcbiAgfVxufTtcblxuXG4vKlxuICAgICBBbiBvYmplY3QgY29udGFpbmluZyBtdWx0aXBsZSB0eXBlIG9mIHRyYW5zZm9ybWF0aW9ucy4gXG4qL1xuXG4kaml0LlRyYW5zID0ge1xuICAkZXh0ZW5kOiB0cnVlLFxuICBcbiAgbGluZWFyOiBmdW5jdGlvbihwKXtcbiAgICByZXR1cm4gcDtcbiAgfVxufTtcblxudmFyIFRyYW5zID0gJGppdC5UcmFucztcblxuKGZ1bmN0aW9uKCl7XG5cbiAgdmFyIG1ha2VUcmFucyA9IGZ1bmN0aW9uKHRyYW5zaXRpb24sIHBhcmFtcyl7XG4gICAgcGFyYW1zID0gJC5zcGxhdChwYXJhbXMpO1xuICAgIHJldHVybiAkLmV4dGVuZCh0cmFuc2l0aW9uLCB7XG4gICAgICBlYXNlSW46IGZ1bmN0aW9uKHBvcyl7XG4gICAgICAgIHJldHVybiB0cmFuc2l0aW9uKHBvcywgcGFyYW1zKTtcbiAgICAgIH0sXG4gICAgICBlYXNlT3V0OiBmdW5jdGlvbihwb3Mpe1xuICAgICAgICByZXR1cm4gMSAtIHRyYW5zaXRpb24oMSAtIHBvcywgcGFyYW1zKTtcbiAgICAgIH0sXG4gICAgICBlYXNlSW5PdXQ6IGZ1bmN0aW9uKHBvcyl7XG4gICAgICAgIHJldHVybiAocG9zIDw9IDAuNSk/IHRyYW5zaXRpb24oMiAqIHBvcywgcGFyYW1zKSAvIDIgOiAoMiAtIHRyYW5zaXRpb24oXG4gICAgICAgICAgICAyICogKDEgLSBwb3MpLCBwYXJhbXMpKSAvIDI7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHRyYW5zaXRpb25zID0ge1xuXG4gICAgUG93OiBmdW5jdGlvbihwLCB4KXtcbiAgICAgIHJldHVybiBNYXRoLnBvdyhwLCB4WzBdIHx8IDYpO1xuICAgIH0sXG5cbiAgICBFeHBvOiBmdW5jdGlvbihwKXtcbiAgICAgIHJldHVybiBNYXRoLnBvdygyLCA4ICogKHAgLSAxKSk7XG4gICAgfSxcblxuICAgIENpcmM6IGZ1bmN0aW9uKHApe1xuICAgICAgcmV0dXJuIDEgLSBNYXRoLnNpbihNYXRoLmFjb3MocCkpO1xuICAgIH0sXG5cbiAgICBTaW5lOiBmdW5jdGlvbihwKXtcbiAgICAgIHJldHVybiAxIC0gTWF0aC5zaW4oKDEgLSBwKSAqIE1hdGguUEkgLyAyKTtcbiAgICB9LFxuXG4gICAgQmFjazogZnVuY3Rpb24ocCwgeCl7XG4gICAgICB4ID0geFswXSB8fCAxLjYxODtcbiAgICAgIHJldHVybiBNYXRoLnBvdyhwLCAyKSAqICgoeCArIDEpICogcCAtIHgpO1xuICAgIH0sXG5cbiAgICBCb3VuY2U6IGZ1bmN0aW9uKHApe1xuICAgICAgdmFyIHZhbHVlO1xuICAgICAgZm9yICggdmFyIGEgPSAwLCBiID0gMTsgMTsgYSArPSBiLCBiIC89IDIpIHtcbiAgICAgICAgaWYgKHAgPj0gKDcgLSA0ICogYSkgLyAxMSkge1xuICAgICAgICAgIHZhbHVlID0gYiAqIGIgLSBNYXRoLnBvdygoMTEgLSA2ICogYSAtIDExICogcCkgLyA0LCAyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG5cbiAgICBFbGFzdGljOiBmdW5jdGlvbihwLCB4KXtcbiAgICAgIHJldHVybiBNYXRoLnBvdygyLCAxMCAqIC0tcClcbiAgICAgICAgICAqIE1hdGguY29zKDIwICogcCAqIE1hdGguUEkgKiAoeFswXSB8fCAxKSAvIDMpO1xuICAgIH1cblxuICB9O1xuXG4gICQuZWFjaCh0cmFuc2l0aW9ucywgZnVuY3Rpb24odmFsLCBrZXkpe1xuICAgIFRyYW5zW2tleV0gPSBtYWtlVHJhbnModmFsKTtcbiAgfSk7XG5cbiAgJC5lYWNoKCBbXG4gICAgICAnUXVhZCcsICdDdWJpYycsICdRdWFydCcsICdRdWludCdcbiAgXSwgZnVuY3Rpb24oZWxlbSwgaSl7XG4gICAgVHJhbnNbZWxlbV0gPSBtYWtlVHJhbnMoZnVuY3Rpb24ocCl7XG4gICAgICByZXR1cm4gTWF0aC5wb3cocCwgW1xuICAgICAgICBpICsgMlxuICAgICAgXSk7XG4gICAgfSk7XG4gIH0pO1xuXG59KSgpO1xuXG4vKlxuICAgQSBDbGFzcyB0aGF0IGNhbiBwZXJmb3JtIGFuaW1hdGlvbnMgZm9yIGdlbmVyaWMgb2JqZWN0cy5cblxuICAgSWYgeW91IGFyZSBsb29raW5nIGZvciBhbmltYXRpb24gdHJhbnNpdGlvbnMgcGxlYXNlIHRha2UgYSBsb29rIGF0IHRoZSA8VHJhbnM+IG9iamVjdC5cblxuICAgVXNlZCBieTpcblxuICAgPEdyYXBoLlBsb3Q+XG4gICBcbiAgIEJhc2VkIG9uOlxuICAgXG4gICBUaGUgQW5pbWF0aW9uIGNsYXNzIGlzIGJhc2VkIGluIHRoZSBNb29Ub29scyBGcmFtZXdvcmsgPGh0dHA6Ly9tb290b29scy5uZXQ+LiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOSBWYWxlcmlvIFByb2lldHRpLCA8aHR0cDovL21hZDRtaWxrLm5ldC8+LiBNSVQgbGljZW5zZSA8aHR0cDovL21vb3Rvb2xzLm5ldC9saWNlbnNlLnR4dD4uXG5cbiovXG5cbnZhciBBbmltYXRpb24gPSBuZXcgQ2xhc3MoIHtcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKXtcbiAgICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gIH0sXG5cbiAgc2V0T3B0aW9uczogZnVuY3Rpb24ob3B0aW9ucyl7XG4gICAgdmFyIG9wdCA9IHtcbiAgICAgIGR1cmF0aW9uOiAyNTAwLFxuICAgICAgZnBzOiA0MCxcbiAgICAgIHRyYW5zaXRpb246IFRyYW5zLlF1YXJ0LmVhc2VJbk91dCxcbiAgICAgIGNvbXB1dGU6ICQuZW1wdHksXG4gICAgICBjb21wbGV0ZTogJC5lbXB0eSxcbiAgICAgIGxpbms6ICdpZ25vcmUnXG4gICAgfTtcbiAgICB0aGlzLm9wdCA9ICQubWVyZ2Uob3B0LCBvcHRpb25zIHx8IHt9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBzdGVwOiBmdW5jdGlvbigpe1xuICAgIHZhciB0aW1lID0gJC50aW1lKCksIG9wdCA9IHRoaXMub3B0O1xuICAgIGlmICh0aW1lIDwgdGhpcy50aW1lICsgb3B0LmR1cmF0aW9uKSB7XG4gICAgICB2YXIgZGVsdGEgPSBvcHQudHJhbnNpdGlvbigodGltZSAtIHRoaXMudGltZSkgLyBvcHQuZHVyYXRpb24pO1xuICAgICAgb3B0LmNvbXB1dGUoZGVsdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRpbWVyID0gY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKTtcbiAgICAgIG9wdC5jb21wdXRlKDEpO1xuICAgICAgb3B0LmNvbXBsZXRlKCk7XG4gICAgfVxuICB9LFxuXG4gIHN0YXJ0OiBmdW5jdGlvbigpe1xuICAgIGlmICghdGhpcy5jaGVjaygpKVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgdGhpcy50aW1lID0gMDtcbiAgICB0aGlzLnN0YXJ0VGltZXIoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBzdGFydFRpbWVyOiBmdW5jdGlvbigpe1xuICAgIHZhciB0aGF0ID0gdGhpcywgZnBzID0gdGhpcy5vcHQuZnBzO1xuICAgIGlmICh0aGlzLnRpbWVyKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMudGltZSA9ICQudGltZSgpIC0gdGhpcy50aW1lO1xuICAgIHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtcbiAgICAgIHRoYXQuc3RlcCgpO1xuICAgIH0pLCBNYXRoLnJvdW5kKDEwMDAgLyBmcHMpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcblxuICBwYXVzZTogZnVuY3Rpb24oKXtcbiAgICB0aGlzLnN0b3BUaW1lcigpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHJlc3VtZTogZnVuY3Rpb24oKXtcbiAgICB0aGlzLnN0YXJ0VGltZXIoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBzdG9wVGltZXI6IGZ1bmN0aW9uKCl7XG4gICAgaWYgKCF0aGlzLnRpbWVyKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMudGltZSA9ICQudGltZSgpIC0gdGhpcy50aW1lO1xuICAgIHRoaXMudGltZXIgPSBjbGVhckludGVydmFsKHRoaXMudGltZXIpO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuXG4gIGNoZWNrOiBmdW5jdGlvbigpe1xuICAgIGlmICghdGhpcy50aW1lcilcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLm9wdC5saW5rID09ICdjYW5jZWwnKSB7XG4gICAgICB0aGlzLnN0b3BUaW1lcigpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSk7XG5cblxudmFyIE9wdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIGZvcih2YXIgaT0wLCBsPWFyZ3MubGVuZ3RoLCBhbnM9e307IGk8bDsgaSsrKSB7XG4gICAgdmFyIG9wdCA9IE9wdGlvbnNbYXJnc1tpXV07XG4gICAgaWYob3B0LiRleHRlbmQpIHtcbiAgICAgICQuZXh0ZW5kKGFucywgb3B0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYW5zW2FyZ3NbaV1dID0gb3B0OyAgXG4gICAgfVxuICB9XG4gIHJldHVybiBhbnM7XG59O1xuXG4vKlxuICogRmlsZTogT3B0aW9ucy5DYW52YXMuanNcbiAqXG4qL1xuXG4vKlxuICBPYmplY3Q6IE9wdGlvbnMuQ2FudmFzXG4gIFxuICBUaGVzZSBhcmUgQ2FudmFzIGdlbmVyYWwgb3B0aW9ucywgbGlrZSB3aGVyZSB0byBhcHBlbmQgaXQgaW4gdGhlIERPTSwgaXRzIGRpbWVuc2lvbnMsIGJhY2tncm91bmQsIFxuICBhbmQgb3RoZXIgbW9yZSBhZHZhbmNlZCBvcHRpb25zLlxuICBcbiAgU3ludGF4OlxuICBcbiAgKHN0YXJ0IGNvZGUganMpXG5cbiAgT3B0aW9ucy5DYW52YXMgPSB7XG4gICAgaW5qZWN0SW50bzogJ2lkJyxcbiAgICB0eXBlOiAnMkQnLCAvLyczRCdcbiAgICB3aWR0aDogZmFsc2UsXG4gICAgaGVpZ2h0OiBmYWxzZSxcbiAgICB1c2VDYW52YXM6IGZhbHNlLFxuICAgIHdpdGhMYWJlbHM6IHRydWUsXG4gICAgYmFja2dyb3VuZDogZmFsc2VcbiAgfTsgIFxuICAoZW5kIGNvZGUpXG4gIFxuICBFeGFtcGxlOlxuICBcbiAgKHN0YXJ0IGNvZGUganMpXG4gIHZhciB2aXogPSBuZXcgJGppdC5WaXooe1xuICAgIGluamVjdEludG86ICdzb21lQ29udGFpbmVySWQnLFxuICAgIHdpZHRoOiA1MDAsXG4gICAgaGVpZ2h0OiA3MDBcbiAgfSk7XG4gIChlbmQgY29kZSlcbiAgXG4gIFBhcmFtZXRlcnM6XG4gIFxuICBpbmplY3RJbnRvIC0gKnJlcXVpcmVkKiAoc3RyaW5nfGVsZW1lbnQpIFRoZSBpZCBvZiB0aGUgRE9NIGNvbnRhaW5lciBmb3IgdGhlIHZpc3VhbGl6YXRpb24uIEl0IGNhbiBhbHNvIGJlIGFuIEVsZW1lbnQgcHJvdmlkZWQgdGhhdCBpdCBoYXMgYW4gaWQuXG4gIHR5cGUgLSAoc3RyaW5nKSBDb250ZXh0IHR5cGUuIERlZmF1bHQncyAyRCBidXQgY2FuIGJlIDNEIGZvciB3ZWJHTCBlbmFibGVkIGJyb3dzZXJzLlxuICB3aWR0aCAtIChudW1iZXIpIERlZmF1bHQncyB0byB0aGUgKmNvbnRhaW5lcidzIG9mZnNldFdpZHRoKi4gVGhlIHdpZHRoIG9mIHRoZSBjYW52YXMuXG4gIGhlaWdodCAtIChudW1iZXIpIERlZmF1bHQncyB0byB0aGUgKmNvbnRhaW5lcidzIG9mZnNldEhlaWdodCouIFRoZSBoZWlnaHQgb2YgdGhlIGNhbnZhcy5cbiAgdXNlQ2FudmFzIC0gKGJvb2xlYW58b2JqZWN0KSBEZWZhdWx0J3MgKmZhbHNlKi4gWW91IGNhbiBwYXNzIGFub3RoZXIgPENhbnZhcz4gaW5zdGFuY2UgdG8gYmUgdXNlZCBieSB0aGUgdmlzdWFsaXphdGlvbi5cbiAgd2l0aExhYmVscyAtIChib29sZWFuKSBEZWZhdWx0J3MgKnRydWUqLiBXaGV0aGVyIHRvIHVzZSBhIGxhYmVsIGNvbnRhaW5lciBmb3IgdGhlIHZpc3VhbGl6YXRpb24uXG4gIGJhY2tncm91bmQgLSAoYm9vbGVhbnxvYmplY3QpIERlZmF1bHQncyAqZmFsc2UqLiBBbiBvYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVuZGVyaW5nIG9mIGEgYmFja2dyb3VuZCBjYW52YXMuXG4qL1xuXG5PcHRpb25zLkNhbnZhcyA9IHtcbiAgICAkZXh0ZW5kOiB0cnVlLFxuICAgIFxuICAgIGluamVjdEludG86ICdpZCcsXG4gICAgdHlwZTogJzJEJyxcbiAgICB3aWR0aDogZmFsc2UsXG4gICAgaGVpZ2h0OiBmYWxzZSxcbiAgICB1c2VDYW52YXM6IGZhbHNlLFxuICAgIHdpdGhMYWJlbHM6IHRydWUsXG4gICAgYmFja2dyb3VuZDogZmFsc2UsXG4gICAgXG4gICAgU2NlbmU6IHtcbiAgICAgIExpZ2h0aW5nOiB7XG4gICAgICAgIGVuYWJsZTogZmFsc2UsXG4gICAgICAgIGFtYmllbnQ6IFsxLCAxLCAxXSxcbiAgICAgICAgZGlyZWN0aW9uYWw6IHtcbiAgICAgICAgICBkaXJlY3Rpb246IHsgeDogLTEwMCwgeTogLTEwMCwgejogLTEwMCB9LFxuICAgICAgICAgIGNvbG9yOiBbMC41LCAwLjMsIDAuMV1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbn07XG5cbi8qXG4gKiBGaWxlOiBPcHRpb25zLk5vZGUuanNcbiAqXG4qL1xuXG4vKlxuICBPYmplY3Q6IE9wdGlvbnMuTm9kZVxuXG4gIFByb3ZpZGVzIE5vZGUgcmVuZGVyaW5nIG9wdGlvbnMgZm9yIFRyZWUgYW5kIEdyYXBoIGJhc2VkIHZpc3VhbGl6YXRpb25zLlxuXG4gIFN5bnRheDpcbiAgICBcbiAgKHN0YXJ0IGNvZGUganMpXG4gIE9wdGlvbnMuTm9kZSA9IHtcbiAgICBvdmVycmlkYWJsZTogZmFsc2UsXG4gICAgdHlwZTogJ2NpcmNsZScsXG4gICAgY29sb3I6ICcjY2NiJyxcbiAgICBhbHBoYTogMSxcbiAgICBkaW06IDMsXG4gICAgaGVpZ2h0OiAyMCxcbiAgICB3aWR0aDogOTAsXG4gICAgYXV0b0hlaWdodDogZmFsc2UsXG4gICAgYXV0b1dpZHRoOiBmYWxzZSxcbiAgICBsaW5lV2lkdGg6IDEsXG4gICAgdHJhbnNmb3JtOiB0cnVlLFxuICAgIGFsaWduOiBcImNlbnRlclwiLFxuICAgIGFuZ3VsYXJXaWR0aDoxLFxuICAgIHNwYW46MSxcbiAgICBDYW52YXNTdHlsZXM6IHt9XG4gIH07XG4gIChlbmQgY29kZSlcbiAgXG4gIEV4YW1wbGU6XG4gIFxuICAoc3RhcnQgY29kZSBqcylcbiAgdmFyIHZpeiA9IG5ldyAkaml0LlZpeih7XG4gICAgTm9kZToge1xuICAgICAgb3ZlcnJpZGFibGU6IHRydWUsXG4gICAgICB3aWR0aDogMzAsXG4gICAgICBhdXRvSGVpZ2h0OiB0cnVlLFxuICAgICAgdHlwZTogJ3JlY3RhbmdsZSdcbiAgICB9XG4gIH0pO1xuICAoZW5kIGNvZGUpXG4gIFxuICBQYXJhbWV0ZXJzOlxuXG4gIG92ZXJyaWRhYmxlIC0gKGJvb2xlYW4pIERlZmF1bHQncyAqZmFsc2UqLiBEZXRlcm1pbmUgd2hldGhlciBvciBub3QgZ2VuZXJhbCBub2RlIHByb3BlcnRpZXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBwYXJ0aWN1bGFyIDxHcmFwaC5Ob2RlPi5cbiAgdHlwZSAtIChzdHJpbmcpIERlZmF1bHQncyAqY2lyY2xlKi4gTm9kZSdzIHNoYXBlLiBOb2RlIGJ1aWx0LWluIHR5cGVzIGluY2x1ZGUgJ2NpcmNsZScsICdyZWN0YW5nbGUnLCAnc3F1YXJlJywgJ2VsbGlwc2UnLCAndHJpYW5nbGUnLCAnc3RhcicuIFRoZSBkZWZhdWx0IE5vZGUgdHlwZSBtaWdodCB2YXJ5IGluIGVhY2ggdmlzdWFsaXphdGlvbi4gWW91IGNhbiBhbHNvIGltcGxlbWVudCAobm9uIGJ1aWx0LWluKSBjdXN0b20gTm9kZSB0eXBlcyBpbnRvIHlvdXIgdmlzdWFsaXphdGlvbnMuXG4gIGNvbG9yIC0gKHN0cmluZykgRGVmYXVsdCdzICojY2NiKi4gTm9kZSBjb2xvci5cbiAgYWxwaGEgLSAobnVtYmVyKSBEZWZhdWx0J3MgKjEqLiBUaGUgTm9kZSdzIGFscGhhIHZhbHVlLiAqMSogaXMgZm9yIGZ1bGwgb3BhY2l0eS5cbiAgZGltIC0gKG51bWJlcikgRGVmYXVsdCdzICozKi4gQW4gZXh0cmEgcGFyYW1ldGVyIHVzZWQgYnkgJ2NpcmNsZScsICdzcXVhcmUnLCAndHJpYW5nbGUnIGFuZCAnc3Rhcicgbm9kZSB0eXBlcy4gRGVwZW5kaW5nIG9uIGVhY2ggc2hhcGUsIHRoaXMgcGFyYW1ldGVyIGNhbiBzZXQgdGhlIHJhZGl1cyBvZiBhIGNpcmNsZSwgaGFsZiB0aGUgbGVuZ3RoIG9mIHRoZSBzaWRlIG9mIGEgc3F1YXJlLCBoYWxmIHRoZSBiYXNlIGFuZCBoYWxmIHRoZSBoZWlnaHQgb2YgYSB0cmlhbmdsZSBvciB0aGUgbGVuZ3RoIG9mIGEgc2lkZSBvZiBhIHN0YXIgKGNvbmNhdmUgZGVjYWdvbikuXG4gIGhlaWdodCAtIChudW1iZXIpIERlZmF1bHQncyAqMjAqLiBVc2VkIGJ5ICdyZWN0YW5nbGUnIGFuZCAnZWxsaXBzZScgbm9kZSB0eXBlcy4gVGhlIGhlaWdodCBvZiB0aGUgbm9kZSBzaGFwZS5cbiAgd2lkdGggLSAobnVtYmVyKSBEZWZhdWx0J3MgKjkwKi4gVXNlZCBieSAncmVjdGFuZ2xlJyBhbmQgJ2VsbGlwc2UnIG5vZGUgdHlwZXMuIFRoZSB3aWR0aCBvZiB0aGUgbm9kZSBzaGFwZS5cbiAgYXV0b0hlaWdodCAtIChib29sZWFuKSBEZWZhdWx0J3MgKmZhbHNlKi4gV2hldGhlciB0byBzZXQgYW4gYXV0byBoZWlnaHQgZm9yIHRoZSBub2RlIGRlcGVuZGluZyBvbiB0aGUgY29udGVudCBvZiB0aGUgTm9kZSdzIGxhYmVsLlxuICBhdXRvV2lkdGggLSAoYm9vbGVhbikgRGVmYXVsdCdzICpmYWxzZSouIFdoZXRoZXIgdG8gc2V0IGFuIGF1dG8gd2lkdGggZm9yIHRoZSBub2RlIGRlcGVuZGluZyBvbiB0aGUgY29udGVudCBvZiB0aGUgTm9kZSdzIGxhYmVsLlxuICBsaW5lV2lkdGggLSAobnVtYmVyKSBEZWZhdWx0J3MgKjEqLiBVc2VkIG9ubHkgYnkgc29tZSBOb2RlIHNoYXBlcy4gVGhlIGxpbmUgd2lkdGggb2YgdGhlIHN0cm9rZXMgb2YgYSBub2RlLlxuICB0cmFuc2Zvcm0gLSAoYm9vbGVhbikgRGVmYXVsdCdzICp0cnVlKi4gT25seSB1c2VkIGJ5IHRoZSA8SHlwZXJ0cmVlPiB2aXN1YWxpemF0aW9uLiBXaGV0aGVyIHRvIHNjYWxlIHRoZSBub2RlcyBhY2NvcmRpbmcgdG8gdGhlIG1vZWJpdXMgdHJhbnNmb3JtYXRpb24uXG4gIGFsaWduIC0gKHN0cmluZykgRGVmYXVsdCdzICpjZW50ZXIqLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICdjZW50ZXInLCAnbGVmdCcgb3IgJ3JpZ2h0Jy4gVXNlZCBvbmx5IGJ5IHRoZSA8U1Q+IHZpc3VhbGl6YXRpb24sIHRoZXNlIHBhcmFtZXRlcnMgYXJlIHVzZWQgZm9yIGFsaWduaW5nIG5vZGVzIHdoZW4gc29tZSBvZiB0aGV5IGRpbWVuc2lvbnMgdmFyeS5cbiAgYW5ndWxhcldpZHRoIC0gKG51bWJlcikgRGVmYXVsdCdzICoxKi4gVXNlZCBpbiByYWRpYWwgbGF5b3V0cyAobGlrZSA8UkdyYXBoPiBvciA8U3VuYnVyc3Q+IHZpc3VhbGl6YXRpb25zKS4gVGhlIGFtb3VudCBvZiByZWxhdGl2ZSAnc3BhY2UnIHNldCBmb3IgYSBub2RlLlxuICBzcGFuIC0gKG51bWJlcikgRGVmYXVsdCdzICoxKi4gVXNlZCBpbiByYWRpYWwgbGF5b3V0cyAobGlrZSA8UkdyYXBoPiBvciA8U3VuYnVyc3Q+IHZpc3VhbGl6YXRpb25zKS4gVGhlIGFuZ2xlIHNwYW4gYW1vdW50IHNldCBmb3IgYSBub2RlLlxuICBDYW52YXNTdHlsZXMgLSAob2JqZWN0KSBEZWZhdWx0J3MgYW4gZW1wdHkgb2JqZWN0IChpLmUuIHt9KS4gQXR0YWNoIGFueSBvdGhlciBjYW52YXMgc3BlY2lmaWMgcHJvcGVydHkgdGhhdCB5b3UnZCBzZXQgdG8gdGhlIGNhbnZhcyBjb250ZXh0IGJlZm9yZSBwbG90dGluZyBhIE5vZGUuXG5cbiovXG5PcHRpb25zLk5vZGUgPSB7XG4gICRleHRlbmQ6IGZhbHNlLFxuICBcbiAgb3ZlcnJpZGFibGU6IGZhbHNlLFxuICB0eXBlOiAnY2lyY2xlJyxcbiAgY29sb3I6ICcjY2NiJyxcbiAgYWxwaGE6IDEsXG4gIGRpbTogMyxcbiAgaGVpZ2h0OiAyMCxcbiAgd2lkdGg6IDkwLFxuICBhdXRvSGVpZ2h0OiBmYWxzZSxcbiAgYXV0b1dpZHRoOiBmYWxzZSxcbiAgbGluZVdpZHRoOiAxLFxuICB0cmFuc2Zvcm06IHRydWUsXG4gIGFsaWduOiBcImNlbnRlclwiLFxuICBhbmd1bGFyV2lkdGg6MSxcbiAgc3BhbjoxLFxuICAvL1JhdyBjYW52YXMgc3R5bGVzIHRvIGJlXG4gIC8vYXBwbGllZCB0byB0aGUgY29udGV4dCBpbnN0YW5jZVxuICAvL2JlZm9yZSBwbG90dGluZyBhIG5vZGVcbiAgQ2FudmFzU3R5bGVzOiB7fVxufTtcblxuXG4vKlxuICogRmlsZTogT3B0aW9ucy5FZGdlLmpzXG4gKlxuKi9cblxuLypcbiAgT2JqZWN0OiBPcHRpb25zLkVkZ2VcblxuICBQcm92aWRlcyBFZGdlIHJlbmRlcmluZyBvcHRpb25zIGZvciBUcmVlIGFuZCBHcmFwaCBiYXNlZCB2aXN1YWxpemF0aW9ucy5cblxuICBTeW50YXg6XG4gICAgXG4gIChzdGFydCBjb2RlIGpzKVxuICBPcHRpb25zLkVkZ2UgPSB7XG4gICAgb3ZlcnJpZGFibGU6IGZhbHNlLFxuICAgIHR5cGU6ICdsaW5lJyxcbiAgICBjb2xvcjogJyNjY2InLFxuICAgIGxpbmVXaWR0aDogMSxcbiAgICBkaW06MTUsXG4gICAgYWxwaGE6IDEsXG4gICAgQ2FudmFzU3R5bGVzOiB7fVxuICB9O1xuICAoZW5kIGNvZGUpXG4gIFxuICBFeGFtcGxlOlxuICBcbiAgKHN0YXJ0IGNvZGUganMpXG4gIHZhciB2aXogPSBuZXcgJGppdC5WaXooe1xuICAgIEVkZ2U6IHtcbiAgICAgIG92ZXJyaWRhYmxlOiB0cnVlLFxuICAgICAgdHlwZTogJ2xpbmUnLFxuICAgICAgY29sb3I6ICcjZmZmJyxcbiAgICAgIENhbnZhc1N0eWxlczoge1xuICAgICAgICBzaGFkb3dDb2xvcjogJyNjY2MnLFxuICAgICAgICBzaGFkb3dCbHVyOiAxMFxuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIChlbmQgY29kZSlcbiAgXG4gIFBhcmFtZXRlcnM6XG4gICAgXG4gICBvdmVycmlkYWJsZSAtIChib29sZWFuKSBEZWZhdWx0J3MgKmZhbHNlKi4gRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGdlbmVyYWwgZWRnZXMgcHJvcGVydGllcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHBhcnRpY3VsYXIgPEdyYXBoLkFkamFjZW5jZT4uXG4gICB0eXBlIC0gKHN0cmluZykgRGVmYXVsdCdzICdsaW5lJy4gRWRnZSBzdHlsZXMgaW5jbHVkZSAnbGluZScsICdoeXBlcmxpbmUnLCAnYXJyb3cnLiBUaGUgZGVmYXVsdCBFZGdlIHR5cGUgbWlnaHQgdmFyeSBpbiBlYWNoIHZpc3VhbGl6YXRpb24uIFlvdSBjYW4gYWxzbyBpbXBsZW1lbnQgY3VzdG9tIEVkZ2UgdHlwZXMuXG4gICBjb2xvciAtIChzdHJpbmcpIERlZmF1bHQncyAnI2NjYicuIEVkZ2UgY29sb3IuXG4gICBsaW5lV2lkdGggLSAobnVtYmVyKSBEZWZhdWx0J3MgKjEqLiBMaW5lL0VkZ2Ugd2lkdGguXG4gICBhbHBoYSAtIChudW1iZXIpIERlZmF1bHQncyAqMSouIFRoZSBFZGdlJ3MgYWxwaGEgdmFsdWUuICoxKiBpcyBmb3IgZnVsbCBvcGFjaXR5LlxuICAgZGltIC0gKG51bWJlcikgRGVmYXVsdCdzICoxNSouIEFuIGV4dHJhIHBhcmFtZXRlciB1c2VkIGJ5IG90aGVyIGNvbXBsZXggc2hhcGVzIHN1Y2ggYXMgcXVhZHJhdGljLCBiZXppZXIgb3IgYXJyb3csIHRvIGRldGVybWluZSB0aGUgc2hhcGUncyBkaWFtZXRlci5cbiAgIGVwc2lsb24gLSAobnVtYmVyKSBEZWZhdWx0J3MgKjcqLiBPbmx5IHVzZWQgd2hlbiB1c2luZyAqZW5hYmxlRm9yRWRnZXMqIGluIDxPcHRpb25zLkV2ZW50cz4uIFRoaXMgZGltZW5zaW9uIGlzIHVzZWQgdG8gY3JlYXRlIGFuIGFyZWEgZm9yIHRoZSBsaW5lIHdoZXJlIHRoZSBjb250YWlucyBtZXRob2QgZm9yIHRoZSBlZGdlIHJldHVybnMgKnRydWUqLlxuICAgQ2FudmFzU3R5bGVzIC0gKG9iamVjdCkgRGVmYXVsdCdzIGFuIGVtcHR5IG9iamVjdCAoaS5lLiB7fSkuIEF0dGFjaCBhbnkgb3RoZXIgY2FudmFzIHNwZWNpZmljIHByb3BlcnR5IHRoYXQgeW91J2Qgc2V0IHRvIHRoZSBjYW52YXMgY29udGV4dCBiZWZvcmUgcGxvdHRpbmcgYW4gRWRnZS5cblxuICBTZWUgYWxzbzpcbiAgIFxuICAgSWYgeW91IHdhbnQgdG8ga25vdyBtb3JlIGFib3V0IGhvdyB0byBjdXN0b21pemUgTm9kZS9FZGdlIGRhdGEgcGVyIGVsZW1lbnQsIGluIHRoZSBKU09OIG9yIHByb2dyYW1tYXRpY2FsbHksIHRha2UgYSBsb29rIGF0IHRoaXMgYXJ0aWNsZS5cbiovXG5PcHRpb25zLkVkZ2UgPSB7XG4gICRleHRlbmQ6IGZhbHNlLFxuICBcbiAgb3ZlcnJpZGFibGU6IGZhbHNlLFxuICB0eXBlOiAnbGluZScsXG4gIGNvbG9yOiAnI2NjYicsXG4gIGxpbmVXaWR0aDogMSxcbiAgZGltOjE1LFxuICBhbHBoYTogMSxcbiAgZXBzaWxvbjogNyxcblxuICAvL1JhdyBjYW52YXMgc3R5bGVzIHRvIGJlXG4gIC8vYXBwbGllZCB0byB0aGUgY29udGV4dCBpbnN0YW5jZVxuICAvL2JlZm9yZSBwbG90dGluZyBhbiBlZGdlXG4gIENhbnZhc1N0eWxlczoge31cbn07XG5cblxuLypcbiAqIEZpbGU6IE9wdGlvbnMuRnguanNcbiAqXG4qL1xuXG4vKlxuICBPYmplY3Q6IE9wdGlvbnMuRnhcblxuICBQcm92aWRlcyBhbmltYXRpb24gb3B0aW9ucyBsaWtlIGR1cmF0aW9uIG9mIHRoZSBhbmltYXRpb25zLCBmcmFtZXMgcGVyIHNlY29uZCBhbmQgYW5pbWF0aW9uIHRyYW5zaXRpb25zLiAgXG5cbiAgU3ludGF4OlxuICBcbiAgKHN0YXJ0IGNvZGUganMpXG4gICAgT3B0aW9ucy5GeCA9IHtcbiAgICAgIGZwczo0MCxcbiAgICAgIGR1cmF0aW9uOiAyNTAwLFxuICAgICAgdHJhbnNpdGlvbjogJGppdC5UcmFucy5RdWFydC5lYXNlSW5PdXQsXG4gICAgICBjbGVhckNhbnZhczogdHJ1ZVxuICAgIH07XG4gIChlbmQgY29kZSlcbiAgXG4gIEV4YW1wbGU6XG4gIFxuICAoc3RhcnQgY29kZSBqcylcbiAgdmFyIHZpeiA9IG5ldyAkaml0LlZpeih7XG4gICAgZHVyYXRpb246IDEwMDAsXG4gICAgZnBzOiAzNSxcbiAgICB0cmFuc2l0aW9uOiAkaml0LlRyYW5zLmxpbmVhclxuICB9KTtcbiAgKGVuZCBjb2RlKVxuICBcbiAgUGFyYW1ldGVyczpcbiAgXG4gIGNsZWFyQ2FudmFzIC0gKGJvb2xlYW4pIERlZmF1bHQncyAqdHJ1ZSouIFdoZXRoZXIgdG8gY2xlYXIgdGhlIGZyYW1lL2NhbnZhcyB3aGVuIHRoZSB2aXogaXMgcGxvdHRlZCBvciBhbmltYXRlZC5cbiAgZHVyYXRpb24gLSAobnVtYmVyKSBEZWZhdWx0J3MgKjI1MDAqLiBEdXJhdGlvbiBvZiB0aGUgYW5pbWF0aW9uIGluIG1pbGxpc2Vjb25kcy5cbiAgZnBzIC0gKG51bWJlcikgRGVmYXVsdCdzICo0MCouIEZyYW1lcyBwZXIgc2Vjb25kLlxuICB0cmFuc2l0aW9uIC0gKG9iamVjdCkgRGVmYXVsdCdzICokaml0LlRyYW5zLlF1YXJ0LmVhc2VJbk91dCouIFRoZSB0cmFuc2l0aW9uIHVzZWQgZm9yIHRoZSBhbmltYXRpb25zLiBTZWUgYmVsb3cgZm9yIGEgbW9yZSBkZXRhaWxlZCBleHBsYW5hdGlvbi5cbiAgXG4gIE9iamVjdDogJGppdC5UcmFuc1xuICBcbiAgVGhpcyBvYmplY3QgaXMgdXNlZCBmb3Igc3BlY2lmeWluZyBkaWZmZXJlbnQgYW5pbWF0aW9uIHRyYW5zaXRpb25zIGluIGFsbCB2aXN1YWxpemF0aW9ucy5cblxuICBUaGVyZSBhcmUgbWFueSBkaWZmZXJlbnQgdHlwZSBvZiBhbmltYXRpb24gdHJhbnNpdGlvbnMuXG5cbiAgbGluZWFyOlxuXG4gIERpc3BsYXlzIGEgbGluZWFyIHRyYW5zaXRpb25cblxuICA+VHJhbnMubGluZWFyXG4gIFxuICAoc2VlIExpbmVhci5wbmcpXG5cbiAgUXVhZDpcblxuICBEaXNwbGF5cyBhIFF1YWRyYXRpYyB0cmFuc2l0aW9uLlxuXG4gID5UcmFucy5RdWFkLmVhc2VJblxuICA+VHJhbnMuUXVhZC5lYXNlT3V0XG4gID5UcmFucy5RdWFkLmVhc2VJbk91dFxuICBcbiAoc2VlIFF1YWQucG5nKVxuXG4gQ3ViaWM6XG5cbiBEaXNwbGF5cyBhIEN1YmljIHRyYW5zaXRpb24uXG5cbiA+VHJhbnMuQ3ViaWMuZWFzZUluXG4gPlRyYW5zLkN1YmljLmVhc2VPdXRcbiA+VHJhbnMuQ3ViaWMuZWFzZUluT3V0XG5cbiAoc2VlIEN1YmljLnBuZylcblxuIFF1YXJ0OlxuXG4gRGlzcGxheXMgYSBRdWFydGV0aWMgdHJhbnNpdGlvbi5cblxuID5UcmFucy5RdWFydC5lYXNlSW5cbiA+VHJhbnMuUXVhcnQuZWFzZU91dFxuID5UcmFucy5RdWFydC5lYXNlSW5PdXRcblxuIChzZWUgUXVhcnQucG5nKVxuXG4gUXVpbnQ6XG5cbiBEaXNwbGF5cyBhIFF1aW50aWMgdHJhbnNpdGlvbi5cblxuID5UcmFucy5RdWludC5lYXNlSW5cbiA+VHJhbnMuUXVpbnQuZWFzZU91dFxuID5UcmFucy5RdWludC5lYXNlSW5PdXRcblxuIChzZWUgUXVpbnQucG5nKVxuXG4gRXhwbzpcblxuIERpc3BsYXlzIGFuIEV4cG9uZW50aWFsIHRyYW5zaXRpb24uXG5cbiA+VHJhbnMuRXhwby5lYXNlSW5cbiA+VHJhbnMuRXhwby5lYXNlT3V0XG4gPlRyYW5zLkV4cG8uZWFzZUluT3V0XG5cbiAoc2VlIEV4cG8ucG5nKVxuXG4gQ2lyYzpcblxuIERpc3BsYXlzIGEgQ2lyY3VsYXIgdHJhbnNpdGlvbi5cblxuID5UcmFucy5DaXJjLmVhc2VJblxuID5UcmFucy5DaXJjLmVhc2VPdXRcbiA+VHJhbnMuQ2lyYy5lYXNlSW5PdXRcblxuIChzZWUgQ2lyYy5wbmcpXG5cbiBTaW5lOlxuXG4gRGlzcGxheXMgYSBTaW5lb3VzaWRhbCB0cmFuc2l0aW9uLlxuXG4gPlRyYW5zLlNpbmUuZWFzZUluXG4gPlRyYW5zLlNpbmUuZWFzZU91dFxuID5UcmFucy5TaW5lLmVhc2VJbk91dFxuXG4gKHNlZSBTaW5lLnBuZylcblxuIEJhY2s6XG5cbiA+VHJhbnMuQmFjay5lYXNlSW5cbiA+VHJhbnMuQmFjay5lYXNlT3V0XG4gPlRyYW5zLkJhY2suZWFzZUluT3V0XG5cbiAoc2VlIEJhY2sucG5nKVxuXG4gQm91bmNlOlxuXG4gQm91bmN5IHRyYW5zaXRpb24uXG5cbiA+VHJhbnMuQm91bmNlLmVhc2VJblxuID5UcmFucy5Cb3VuY2UuZWFzZU91dFxuID5UcmFucy5Cb3VuY2UuZWFzZUluT3V0XG5cbiAoc2VlIEJvdW5jZS5wbmcpXG5cbiBFbGFzdGljOlxuXG4gRWxhc3RpYyBjdXJ2ZS5cblxuID5UcmFucy5FbGFzdGljLmVhc2VJblxuID5UcmFucy5FbGFzdGljLmVhc2VPdXRcbiA+VHJhbnMuRWxhc3RpYy5lYXNlSW5PdXRcblxuIChzZWUgRWxhc3RpYy5wbmcpXG4gXG4gQmFzZWQgb246XG4gICAgIFxuIEVhc2luZyBhbmQgVHJhbnNpdGlvbiBhbmltYXRpb24gbWV0aG9kcyBhcmUgYmFzZWQgaW4gdGhlIE1vb1Rvb2xzIEZyYW1ld29yayA8aHR0cDovL21vb3Rvb2xzLm5ldD4uIENvcHlyaWdodCAoYykgMjAwNi0yMDEwIFZhbGVyaW8gUHJvaWV0dGksIDxodHRwOi8vbWFkNG1pbGsubmV0Lz4uIE1JVCBsaWNlbnNlIDxodHRwOi8vbW9vdG9vbHMubmV0L2xpY2Vuc2UudHh0Pi5cblxuXG4qL1xuT3B0aW9ucy5GeCA9IHtcbiAgJGV4dGVuZDogdHJ1ZSxcbiAgXG4gIGZwczo0MCxcbiAgZHVyYXRpb246IDI1MDAsXG4gIHRyYW5zaXRpb246ICRqaXQuVHJhbnMuUXVhcnQuZWFzZUluT3V0LFxuICBjbGVhckNhbnZhczogdHJ1ZVxufTtcblxuLypcbiAqIEZpbGU6IE9wdGlvbnMuTGFiZWwuanNcbiAqXG4qL1xuLypcbiAgT2JqZWN0OiBPcHRpb25zLkxhYmVsXG5cbiAgUHJvdmlkZXMgc3R5bGluZyBmb3IgTGFiZWxzIHN1Y2ggYXMgZm9udCBzaXplLCBmYW1pbHksIGV0Yy4gQWxzbyBzZXRzIE5vZGUgbGFiZWxzIGFzIEhUTUwsIFNWRyBvciBOYXRpdmUgY2FudmFzIGVsZW1lbnRzLiAgXG5cbiAgU3ludGF4OlxuICBcbiAgKHN0YXJ0IGNvZGUganMpXG4gICAgT3B0aW9ucy5MYWJlbCA9IHtcbiAgICAgIG92ZXJyaWRhYmxlOiBmYWxzZSxcbiAgICAgIHR5cGU6ICdIVE1MJywgLy8nU1ZHJywgJ05hdGl2ZSdcbiAgICAgIHN0eWxlOiAnICcsXG4gICAgICBzaXplOiAxMCxcbiAgICAgIGZhbWlseTogJ3NhbnMtc2VyaWYnLFxuICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgIHRleHRCYXNlbGluZTogJ2FscGhhYmV0aWMnLFxuICAgICAgY29sb3I6ICcjZmZmJ1xuICAgIH07XG4gIChlbmQgY29kZSlcbiAgXG4gIEV4YW1wbGU6XG4gIFxuICAoc3RhcnQgY29kZSBqcylcbiAgdmFyIHZpeiA9IG5ldyAkaml0LlZpeih7XG4gICAgTGFiZWw6IHtcbiAgICAgIHR5cGU6ICdOYXRpdmUnLFxuICAgICAgc2l6ZTogMTEsXG4gICAgICBjb2xvcjogJyNjY2MnXG4gICAgfVxuICB9KTtcbiAgKGVuZCBjb2RlKVxuICBcbiAgUGFyYW1ldGVyczpcbiAgICBcbiAgb3ZlcnJpZGFibGUgLSAoYm9vbGVhbikgRGVmYXVsdCdzICpmYWxzZSouIERldGVybWluZSB3aGV0aGVyIG9yIG5vdCBnZW5lcmFsIGxhYmVsIHByb3BlcnRpZXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBwYXJ0aWN1bGFyIDxHcmFwaC5Ob2RlPi5cbiAgdHlwZSAtIChzdHJpbmcpIERlZmF1bHQncyAqSFRNTCouIFRoZSB0eXBlIGZvciB0aGUgbGFiZWxzLiBDYW4gYmUgJ0hUTUwnLCAnU1ZHJyBvciAnTmF0aXZlJyBjYW52YXMgbGFiZWxzLlxuICBzdHlsZSAtIChzdHJpbmcpIERlZmF1bHQncyAqZW1wdHkgc3RyaW5nKi4gQ2FuIGJlICdpdGFsaWMnIG9yICdib2xkJy4gVGhpcyBwYXJhbWV0ZXIgaXMgb25seSB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiB1c2luZyAnTmF0aXZlJyBjYW52YXMgbGFiZWxzLiBGb3IgRE9NIGJhc2VkIGxhYmVscyB0aGUgY2xhc3NOYW1lICpub2RlKiBpcyBhZGRlZCB0byB0aGUgRE9NIGVsZW1lbnQgZm9yIHN0eWxpbmcgdmlhIENTUy4gWW91IGNhbiBhbHNvIHVzZSA8T3B0aW9ucy5Db250cm9sbGVyPiBtZXRob2RzIHRvIHN0eWxlIGluZGl2aWR1YWwgbGFiZWxzLlxuICBzaXplIC0gKG51bWJlcikgRGVmYXVsdCdzICoxMCouIFRoZSBmb250J3Mgc2l6ZS4gVGhpcyBwYXJhbWV0ZXIgaXMgb25seSB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiB1c2luZyAnTmF0aXZlJyBjYW52YXMgbGFiZWxzLiBGb3IgRE9NIGJhc2VkIGxhYmVscyB0aGUgY2xhc3NOYW1lICpub2RlKiBpcyBhZGRlZCB0byB0aGUgRE9NIGVsZW1lbnQgZm9yIHN0eWxpbmcgdmlhIENTUy4gWW91IGNhbiBhbHNvIHVzZSA8T3B0aW9ucy5Db250cm9sbGVyPiBtZXRob2RzIHRvIHN0eWxlIGluZGl2aWR1YWwgbGFiZWxzLlxuICBmYW1pbHkgLSAoc3RyaW5nKSBEZWZhdWx0J3MgKnNhbnMtc2VyaWYqLiBUaGUgZm9udCdzIGZhbWlseS4gVGhpcyBwYXJhbWV0ZXIgaXMgb25seSB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiB1c2luZyAnTmF0aXZlJyBjYW52YXMgbGFiZWxzLiBGb3IgRE9NIGJhc2VkIGxhYmVscyB0aGUgY2xhc3NOYW1lICpub2RlKiBpcyBhZGRlZCB0byB0aGUgRE9NIGVsZW1lbnQgZm9yIHN0eWxpbmcgdmlhIENTUy4gWW91IGNhbiBhbHNvIHVzZSA8T3B0aW9ucy5Db250cm9sbGVyPiBtZXRob2RzIHRvIHN0eWxlIGluZGl2aWR1YWwgbGFiZWxzLlxuICBjb2xvciAtIChzdHJpbmcpIERlZmF1bHQncyAqI2ZmZiouIFRoZSBmb250J3MgY29sb3IuIFRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gdXNpbmcgJ05hdGl2ZScgY2FudmFzIGxhYmVscy4gRm9yIERPTSBiYXNlZCBsYWJlbHMgdGhlIGNsYXNzTmFtZSAqbm9kZSogaXMgYWRkZWQgdG8gdGhlIERPTSBlbGVtZW50IGZvciBzdHlsaW5nIHZpYSBDU1MuIFlvdSBjYW4gYWxzbyB1c2UgPE9wdGlvbnMuQ29udHJvbGxlcj4gbWV0aG9kcyB0byBzdHlsZSBpbmRpdmlkdWFsIGxhYmVscy5cbiovXG5PcHRpb25zLkxhYmVsID0ge1xuICAkZXh0ZW5kOiBmYWxzZSxcbiAgXG4gIG92ZXJyaWRhYmxlOiBmYWxzZSxcbiAgdHlwZTogJ0hUTUwnLCAvLydTVkcnLCAnTmF0aXZlJ1xuICBzdHlsZTogJyAnLFxuICBzaXplOiAxMCxcbiAgZmFtaWx5OiAnc2Fucy1zZXJpZicsXG4gIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gIHRleHRCYXNlbGluZTogJ2FscGhhYmV0aWMnLFxuICBjb2xvcjogJyNmZmYnXG59O1xuXG5cbi8qXG4gKiBGaWxlOiBPcHRpb25zLlRpcHMuanNcbiAqXG4gKi9cblxuLypcbiAgT2JqZWN0OiBPcHRpb25zLlRpcHNcbiAgXG4gIFRpcHMgb3B0aW9uc1xuICBcbiAgU3ludGF4OlxuICAgIFxuICAoc3RhcnQgY29kZSBqcylcbiAgT3B0aW9ucy5UaXBzID0ge1xuICAgIGVuYWJsZTogZmFsc2UsXG4gICAgdHlwZTogJ2F1dG8nLFxuICAgIG9mZnNldFg6IDIwLFxuICAgIG9mZnNldFk6IDIwLFxuICAgIG9uU2hvdzogJC5lbXB0eSxcbiAgICBvbkhpZGU6ICQuZW1wdHlcbiAgfTtcbiAgKGVuZCBjb2RlKVxuICBcbiAgRXhhbXBsZTpcbiAgXG4gIChzdGFydCBjb2RlIGpzKVxuICB2YXIgdml6ID0gbmV3ICRqaXQuVml6KHtcbiAgICBUaXBzOiB7XG4gICAgICBlbmFibGU6IHRydWUsXG4gICAgICB0eXBlOiAnTmF0aXZlJyxcbiAgICAgIG9mZnNldFg6IDEwLFxuICAgICAgb2Zmc2V0WTogMTAsXG4gICAgICBvblNob3c6IGZ1bmN0aW9uKHRpcCwgbm9kZSkge1xuICAgICAgICB0aXAuaW5uZXJIVE1MID0gbm9kZS5uYW1lO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIChlbmQgY29kZSlcblxuICBQYXJhbWV0ZXJzOlxuXG4gIGVuYWJsZSAtIChib29sZWFuKSBEZWZhdWx0J3MgKmZhbHNlKi4gSWYgKnRydWUqLCBhIHRvb2x0aXAgd2lsbCBiZSBzaG93biB3aGVuIGEgbm9kZSBpcyBob3ZlcmVkLiBUaGUgdG9vbHRpcCBpcyBhIGRpdiBET00gZWxlbWVudCBoYXZpbmcgXCJ0aXBcIiBhcyBDU1MgY2xhc3MuIFxuICB0eXBlIC0gKHN0cmluZykgRGVmYXVsdCdzICphdXRvKi4gRGVmaW5lcyB3aGVyZSB0byBhdHRhY2ggdGhlIE1vdXNlRW50ZXIvTGVhdmUgdG9vbHRpcCBldmVudHMuIFBvc3NpYmxlIHZhbHVlcyBhcmUgJ05hdGl2ZScgdG8gYXR0YWNoIHRoZW0gdG8gdGhlIGNhbnZhcyBvciAnSFRNTCcgdG8gYXR0YWNoIHRoZW0gdG8gRE9NIGxhYmVsIGVsZW1lbnRzIChpZiBkZWZpbmVkKS4gJ2F1dG8nIHNldHMgdGhpcyBwcm9wZXJ0eSB0byB0aGUgdmFsdWUgb2YgPE9wdGlvbnMuTGFiZWw+J3MgKnR5cGUqIHByb3BlcnR5LlxuICBvZmZzZXRYIC0gKG51bWJlcikgRGVmYXVsdCdzICoyMCouIEFuIG9mZnNldCBhZGRlZCB0byB0aGUgY3VycmVudCB0b29sdGlwIHgtcG9zaXRpb24gKHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IG1vdXNlIHBvc2l0aW9uKS4gRGVmYXVsdCdzIDIwLlxuICBvZmZzZXRZIC0gKG51bWJlcikgRGVmYXVsdCdzICoyMCouIEFuIG9mZnNldCBhZGRlZCB0byB0aGUgY3VycmVudCB0b29sdGlwIHktcG9zaXRpb24gKHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IG1vdXNlIHBvc2l0aW9uKS4gRGVmYXVsdCdzIDIwLlxuICBvblNob3codGlwLCBub2RlKSAtIFRoaXMgY2FsbGFjayBpcyB1c2VkIHJpZ2h0IGJlZm9yZSBkaXNwbGF5aW5nIGEgdG9vbHRpcC4gVGhlIGZpcnN0IGZvcm1hbCBwYXJhbWV0ZXIgaXMgdGhlIHRpcCBpdHNlbGYgKHdoaWNoIGlzIGEgRGl2RWxlbWVudCkuIFRoZSBzZWNvbmQgcGFyYW1ldGVyIG1heSBiZSBhIDxHcmFwaC5Ob2RlPiBmb3IgZ3JhcGggYmFzZWQgdmlzdWFsaXphdGlvbnMgb3IgYW4gb2JqZWN0IHdpdGggbGFiZWwsIHZhbHVlIHByb3BlcnRpZXMgZm9yIGNoYXJ0cy5cbiAgb25IaWRlKCkgLSBUaGlzIGNhbGxhY2sgaXMgdXNlZCB3aGVuIGhpZGluZyBhIHRvb2x0aXAuXG5cbiovXG5PcHRpb25zLlRpcHMgPSB7XG4gICRleHRlbmQ6IGZhbHNlLFxuICBcbiAgZW5hYmxlOiBmYWxzZSxcbiAgdHlwZTogJ2F1dG8nLFxuICBvZmZzZXRYOiAyMCxcbiAgb2Zmc2V0WTogMjAsXG4gIGZvcmNlOiBmYWxzZSxcbiAgb25TaG93OiAkLmVtcHR5LFxuICBvbkhpZGU6ICQuZW1wdHlcbn07XG5cblxuLypcbiAqIEZpbGU6IE9wdGlvbnMuTm9kZVN0eWxlcy5qc1xuICpcbiAqL1xuXG4vKlxuICBPYmplY3Q6IE9wdGlvbnMuTm9kZVN0eWxlc1xuICBcbiAgQXBwbHkgZGlmZmVyZW50IHN0eWxlcyB3aGVuIGEgbm9kZSBpcyBob3ZlcmVkIG9yIHNlbGVjdGVkLlxuICBcbiAgU3ludGF4OlxuICAgIFxuICAoc3RhcnQgY29kZSBqcylcbiAgT3B0aW9ucy5Ob2RlU3R5bGVzID0ge1xuICAgIGVuYWJsZTogZmFsc2UsXG4gICAgdHlwZTogJ2F1dG8nLFxuICAgIHN0eWxlc0hvdmVyOiBmYWxzZSxcbiAgICBzdHlsZXNDbGljazogZmFsc2VcbiAgfTtcbiAgKGVuZCBjb2RlKVxuICBcbiAgRXhhbXBsZTpcbiAgXG4gIChzdGFydCBjb2RlIGpzKVxuICB2YXIgdml6ID0gbmV3ICRqaXQuVml6KHtcbiAgICBOb2RlU3R5bGVzOiB7XG4gICAgICBlbmFibGU6IHRydWUsXG4gICAgICB0eXBlOiAnTmF0aXZlJyxcbiAgICAgIHN0eWxlc0hvdmVyOiB7XG4gICAgICAgIGRpbTogMzAsXG4gICAgICAgIGNvbG9yOiAnI2ZjYydcbiAgICAgIH0sXG4gICAgICBkdXJhdGlvbjogNjAwXG4gICAgfVxuICB9KTtcbiAgKGVuZCBjb2RlKVxuXG4gIFBhcmFtZXRlcnM6XG4gIFxuICBlbmFibGUgLSAoYm9vbGVhbikgRGVmYXVsdCdzICpmYWxzZSouIFdoZXRoZXIgdG8gZW5hYmxlIHRoaXMgb3B0aW9uLlxuICB0eXBlIC0gKHN0cmluZykgRGVmYXVsdCdzICphdXRvKi4gVXNlIHRoaXMgdG8gYXR0YWNoIHRoZSBob3Zlci9jbGljayBldmVudHMgaW4gdGhlIG5vZGVzIG9yIHRoZSBub2RlcyBsYWJlbHMgKGlmIHRoZXkgaGF2ZSBiZWVuIGRlZmluZWQgYXMgRE9NIGVsZW1lbnRzOiAnSFRNTCcgb3IgJ1NWRycsIHNlZSA8T3B0aW9ucy5MYWJlbD4gZm9yIG1vcmUgZGV0YWlscykuIFRoZSBkZWZhdWx0ICdhdXRvJyB2YWx1ZSB3aWxsIHNldCBOb2RlU3R5bGVzIHRvIHRoZSBzYW1lIHR5cGUgZGVmaW5lZCBmb3IgPE9wdGlvbnMuTGFiZWw+LlxuICBzdHlsZXNIb3ZlciAtIChib29sZWFufG9iamVjdCkgRGVmYXVsdCdzICpmYWxzZSouIEFuIG9iamVjdCB3aXRoIG5vZGUgc3R5bGVzIGp1c3QgbGlrZSB0aGUgb25lcyBkZWZpbmVkIGZvciA8T3B0aW9ucy5Ob2RlPiBvciAqZmFsc2UqIG90aGVyd2lzZS5cbiAgc3R5bGVzQ2xpY2sgLSAoYm9vbGVhbnxvYmplY3QpIERlZmF1bHQncyAqZmFsc2UqLiBBbiBvYmplY3Qgd2l0aCBub2RlIHN0eWxlcyBqdXN0IGxpa2UgdGhlIG9uZXMgZGVmaW5lZCBmb3IgPE9wdGlvbnMuTm9kZT4gb3IgKmZhbHNlKiBvdGhlcndpc2UuXG4qL1xuXG5PcHRpb25zLk5vZGVTdHlsZXMgPSB7XG4gICRleHRlbmQ6IGZhbHNlLFxuICBcbiAgZW5hYmxlOiBmYWxzZSxcbiAgdHlwZTogJ2F1dG8nLFxuICBzdHlsZXNIb3ZlcjogZmFsc2UsXG4gIHN0eWxlc0NsaWNrOiBmYWxzZVxufTtcblxuXG4vKlxuICogRmlsZTogT3B0aW9ucy5FdmVudHMuanNcbiAqXG4qL1xuXG4vKlxuICBPYmplY3Q6IE9wdGlvbnMuRXZlbnRzXG4gIFxuICBDb25maWd1cmF0aW9uIGZvciBhZGRpbmcgbW91c2UvdG91Y2ggZXZlbnQgaGFuZGxlcnMgdG8gTm9kZXMuXG4gIFxuICBTeW50YXg6XG4gIFxuICAoc3RhcnQgY29kZSBqcylcbiAgT3B0aW9ucy5FdmVudHMgPSB7XG4gICAgZW5hYmxlOiBmYWxzZSxcbiAgICBlbmFibGVGb3JFZGdlczogZmFsc2UsXG4gICAgdHlwZTogJ2F1dG8nLFxuICAgIG9uQ2xpY2s6ICQuZW1wdHksXG4gICAgb25SaWdodENsaWNrOiAkLmVtcHR5LFxuICAgIG9uTW91c2VNb3ZlOiAkLmVtcHR5LFxuICAgIG9uTW91c2VFbnRlcjogJC5lbXB0eSxcbiAgICBvbk1vdXNlTGVhdmU6ICQuZW1wdHksXG4gICAgb25EcmFnU3RhcnQ6ICQuZW1wdHksXG4gICAgb25EcmFnTW92ZTogJC5lbXB0eSxcbiAgICBvbkRyYWdDYW5jZWw6ICQuZW1wdHksXG4gICAgb25EcmFnRW5kOiAkLmVtcHR5LFxuICAgIG9uVG91Y2hTdGFydDogJC5lbXB0eSxcbiAgICBvblRvdWNoTW92ZTogJC5lbXB0eSxcbiAgICBvblRvdWNoRW5kOiAkLmVtcHR5LFxuICAgIG9uVG91Y2hDYW5jZWw6ICQuZW1wdHksXG4gICAgb25Nb3VzZVdoZWVsOiAkLmVtcHR5XG4gIH07XG4gIChlbmQgY29kZSlcbiAgXG4gIEV4YW1wbGU6XG4gIFxuICAoc3RhcnQgY29kZSBqcylcbiAgdmFyIHZpeiA9IG5ldyAkaml0LlZpeih7XG4gICAgRXZlbnRzOiB7XG4gICAgICBlbmFibGU6IHRydWUsXG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbihub2RlLCBldmVudEluZm8sIGUpIHtcbiAgICAgICAgdml6LmRvU29tZXRoaW5nKCk7XG4gICAgICB9LFxuICAgICAgb25Nb3VzZUVudGVyOiBmdW5jdGlvbihub2RlLCBldmVudEluZm8sIGUpIHtcbiAgICAgICAgdml6LmNhbnZhcy5nZXRFbGVtZW50KCkuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuICAgICAgfSxcbiAgICAgIG9uTW91c2VMZWF2ZTogZnVuY3Rpb24obm9kZSwgZXZlbnRJbmZvLCBlKSB7XG4gICAgICAgIHZpei5jYW52YXMuZ2V0RWxlbWVudCgpLnN0eWxlLmN1cnNvciA9ICcnO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIChlbmQgY29kZSlcbiAgXG4gIFBhcmFtZXRlcnM6XG4gIFxuICBlbmFibGUgLSAoYm9vbGVhbikgRGVmYXVsdCdzICpmYWxzZSouIFdoZXRoZXIgdG8gZW5hYmxlIHRoZSBFdmVudCBzeXN0ZW0uXG4gIGVuYWJsZUZvckVkZ2VzIC0gKGJvb2xlYW4pIERlZmF1bHQncyAqZmFsc2UqLiBXaGV0aGVyIHRvIHRyYWNrIGV2ZW50cyBhbHNvIGluIGFyY3MuIElmICp0cnVlKiB0aGUgc2FtZSBjYWxsYmFja3MgLWRlc2NyaWJlZCBiZWxvdy0gYXJlIHVzZWQgZm9yIG5vZGVzICphbmQqIGVkZ2VzLiBBIHNpbXBsZSBkdWNrIHR5cGUgY2hlY2sgZm9yIGVkZ2VzIGlzIHRvIGNoZWNrIGZvciAqbm9kZS5ub2RlRnJvbSouXG4gIHR5cGUgLSAoc3RyaW5nKSBEZWZhdWx0J3MgJ2F1dG8nLiBXaGV0aGVyIHRvIGF0dGFjaCB0aGUgZXZlbnRzIG9udG8gdGhlIEhUTUwgbGFiZWxzICh2aWEgZXZlbnQgZGVsZWdhdGlvbikgb3IgdG8gdXNlIHRoZSBjdXN0b20gJ05hdGl2ZScgY2FudmFzIEV2ZW50IFN5c3RlbSBvZiB0aGUgbGlicmFyeS4gJ2F1dG8nIGlzIHNldCB3aGVuIHlvdSBsZXQgdGhlIDxPcHRpb25zLkxhYmVsPiAqdHlwZSogcGFyYW1ldGVyIGRlY2lkZSB0aGlzLlxuICBvbkNsaWNrKG5vZGUsIGV2ZW50SW5mbywgZSkgLSBUcmlnZ2VyZWQgd2hlbiBhIHVzZXIgcGVyZm9ybXMgYSBjbGljayBpbiB0aGUgY2FudmFzLiAqbm9kZSogaXMgdGhlIDxHcmFwaC5Ob2RlPiBjbGlja2VkIG9yIGZhbHNlIGlmIG5vIG5vZGUgaGFzIGJlZW4gY2xpY2tlZC4gKmUqIGlzIHRoZSBncmFiYmVkIGV2ZW50IChzaG91bGQgcmV0dXJuIHRoZSBuYXRpdmUgZXZlbnQgaW4gYSBjcm9zcy1icm93c2VyIG1hbm5lcikuICpldmVudEluZm8qIGlzIGFuIG9iamVjdCBjb250YWluaW5nIHVzZWZ1bCBtZXRob2RzIGxpa2UgKmdldFBvcyogdG8gZ2V0IHRoZSBtb3VzZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgY2FudmFzLiBcbiAgb25SaWdodENsaWNrKG5vZGUsIGV2ZW50SW5mbywgZSkgLSBUcmlnZ2VyZWQgd2hlbiBhIHVzZXIgcGVyZm9ybXMgYSByaWdodCBjbGljayBpbiB0aGUgY2FudmFzLiAqbm9kZSogaXMgdGhlIDxHcmFwaC5Ob2RlPiByaWdodCBjbGlja2VkIG9yIGZhbHNlIGlmIG5vIG5vZGUgaGFzIGJlZW4gY2xpY2tlZC4gKmUqIGlzIHRoZSBncmFiYmVkIGV2ZW50IChzaG91bGQgcmV0dXJuIHRoZSBuYXRpdmUgZXZlbnQgaW4gYSBjcm9zcy1icm93c2VyIG1hbm5lcikuICpldmVudEluZm8qIGlzIGFuIG9iamVjdCBjb250YWluaW5nIHVzZWZ1bCBtZXRob2RzIGxpa2UgKmdldFBvcyogdG8gZ2V0IHRoZSBtb3VzZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgY2FudmFzLiBcbiAgb25Nb3VzZU1vdmUobm9kZSwgZXZlbnRJbmZvLCBlKSAtIFRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIG1vdmVzIHRoZSBtb3VzZS4gKm5vZGUqIGlzIHRoZSA8R3JhcGguTm9kZT4gdW5kZXIgdGhlIGN1cnNvciBhcyBpdCdzIG1vdmluZyBvdmVyIHRoZSBjYW52YXMgb3IgZmFsc2UgaWYgbm8gbm9kZSBoYXMgYmVlbiBjbGlja2VkLiAqZSogaXMgdGhlIGdyYWJiZWQgZXZlbnQgKHNob3VsZCByZXR1cm4gdGhlIG5hdGl2ZSBldmVudCBpbiBhIGNyb3NzLWJyb3dzZXIgbWFubmVyKS4gICpldmVudEluZm8qIGlzIGFuIG9iamVjdCBjb250YWluaW5nIHVzZWZ1bCBtZXRob2RzIGxpa2UgKmdldFBvcyogdG8gZ2V0IHRoZSBtb3VzZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgY2FudmFzLlxuICBvbk1vdXNlRW50ZXIobm9kZSwgZXZlbnRJbmZvLCBlKSAtIFRyaWdnZXJlZCB3aGVuIGEgdXNlciBtb3ZlcyB0aGUgbW91c2Ugb3ZlciBhIG5vZGUuICpub2RlKiBpcyB0aGUgPEdyYXBoLk5vZGU+IHRoYXQgdGhlIG1vdXNlIGp1c3QgZW50ZXJlZC4gKmUqIGlzIHRoZSBncmFiYmVkIGV2ZW50IChzaG91bGQgcmV0dXJuIHRoZSBuYXRpdmUgZXZlbnQgaW4gYSBjcm9zcy1icm93c2VyIG1hbm5lcikuICpldmVudEluZm8qIGlzIGFuIG9iamVjdCBjb250YWluaW5nIHVzZWZ1bCBtZXRob2RzIGxpa2UgKmdldFBvcyogdG8gZ2V0IHRoZSBtb3VzZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgY2FudmFzLiBcbiAgb25Nb3VzZUxlYXZlKG5vZGUsIGV2ZW50SW5mbywgZSkgLSBUcmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBtb3VzZS1vdXRzIGEgbm9kZS4gKm5vZGUqIGlzIHRoZSA8R3JhcGguTm9kZT4gJ21vdXNlLW91dGVkJy4gKmUqIGlzIHRoZSBncmFiYmVkIGV2ZW50IChzaG91bGQgcmV0dXJuIHRoZSBuYXRpdmUgZXZlbnQgaW4gYSBjcm9zcy1icm93c2VyIG1hbm5lcikuICpldmVudEluZm8qIGlzIGFuIG9iamVjdCBjb250YWluaW5nIHVzZWZ1bCBtZXRob2RzIGxpa2UgKmdldFBvcyogdG8gZ2V0IHRoZSBtb3VzZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgY2FudmFzLiBcbiAgb25EcmFnU3RhcnQobm9kZSwgZXZlbnRJbmZvLCBlKSAtIFRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIG1vdXNlLWRvd25zIG92ZXIgYSBub2RlLiAqbm9kZSogaXMgdGhlIDxHcmFwaC5Ob2RlPiBiZWluZyBwcmVzc2VkLiAqZSogaXMgdGhlIGdyYWJiZWQgZXZlbnQgKHNob3VsZCByZXR1cm4gdGhlIG5hdGl2ZSBldmVudCBpbiBhIGNyb3NzLWJyb3dzZXIgbWFubmVyKS4gKmV2ZW50SW5mbyogaXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdXNlZnVsIG1ldGhvZHMgbGlrZSAqZ2V0UG9zKiB0byBnZXQgdGhlIG1vdXNlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBjYW52YXMuIFxuICBvbkRyYWdNb3ZlKG5vZGUsIGV2ZW50SW5mbywgZSkgLSBUcmlnZ2VyZWQgd2hlbiBhIHVzZXIsIGFmdGVyIHByZXNzaW5nIHRoZSBtb3VzZSBidXR0b24gb3ZlciBhIG5vZGUsIG1vdmVzIHRoZSBtb3VzZSBhcm91bmQuICpub2RlKiBpcyB0aGUgPEdyYXBoLk5vZGU+IGJlaW5nIGRyYWdnZWQuICplKiBpcyB0aGUgZ3JhYmJlZCBldmVudCAoc2hvdWxkIHJldHVybiB0aGUgbmF0aXZlIGV2ZW50IGluIGEgY3Jvc3MtYnJvd3NlciBtYW5uZXIpLiAqZXZlbnRJbmZvKiBpcyBhbiBvYmplY3QgY29udGFpbmluZyB1c2VmdWwgbWV0aG9kcyBsaWtlICpnZXRQb3MqIHRvIGdldCB0aGUgbW91c2UgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGNhbnZhcy4gXG4gIG9uRHJhZ0VuZChub2RlLCBldmVudEluZm8sIGUpIC0gVHJpZ2dlcmVkIHdoZW4gYSB1c2VyIGZpbmlzaGVkIGRyYWdnaW5nIGEgbm9kZS4gKm5vZGUqIGlzIHRoZSA8R3JhcGguTm9kZT4gYmVpbmcgZHJhZ2dlZC4gKmUqIGlzIHRoZSBncmFiYmVkIGV2ZW50IChzaG91bGQgcmV0dXJuIHRoZSBuYXRpdmUgZXZlbnQgaW4gYSBjcm9zcy1icm93c2VyIG1hbm5lcikuICpldmVudEluZm8qIGlzIGFuIG9iamVjdCBjb250YWluaW5nIHVzZWZ1bCBtZXRob2RzIGxpa2UgKmdldFBvcyogdG8gZ2V0IHRoZSBtb3VzZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgY2FudmFzLiBcbiAgb25EcmFnQ2FuY2VsKG5vZGUsIGV2ZW50SW5mbywgZSkgLSBUcmlnZ2VyZWQgd2hlbiB0aGUgdXNlciByZWxlYXNlcyB0aGUgbW91c2UgYnV0dG9uIG92ZXIgYSA8R3JhcGguTm9kZT4gdGhhdCB3YXNuJ3QgZHJhZ2dlZCAoaS5lLiB0aGUgdXNlciBkaWRuJ3QgcGVyZm9ybSBhbnkgbW91c2UgbW92ZW1lbnQgYWZ0ZXIgcHJlc3NpbmcgdGhlIG1vdXNlIGJ1dHRvbikuICpub2RlKiBpcyB0aGUgPEdyYXBoLk5vZGU+IGJlaW5nIGRyYWdnZWQuICplKiBpcyB0aGUgZ3JhYmJlZCBldmVudCAoc2hvdWxkIHJldHVybiB0aGUgbmF0aXZlIGV2ZW50IGluIGEgY3Jvc3MtYnJvd3NlciBtYW5uZXIpLiAqZXZlbnRJbmZvKiBpcyBhbiBvYmplY3QgY29udGFpbmluZyB1c2VmdWwgbWV0aG9kcyBsaWtlICpnZXRQb3MqIHRvIGdldCB0aGUgbW91c2UgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGNhbnZhcy4gXG4gIG9uVG91Y2hTdGFydChub2RlLCBldmVudEluZm8sIGUpIC0gQmVoYXZlcyBqdXN0IGxpa2Ugb25EcmFnU3RhcnQuIFxuICBvblRvdWNoTW92ZShub2RlLCBldmVudEluZm8sIGUpIC0gQmVoYXZlcyBqdXN0IGxpa2Ugb25EcmFnTW92ZS4gXG4gIG9uVG91Y2hFbmQobm9kZSwgZXZlbnRJbmZvLCBlKSAtIEJlaGF2ZXMganVzdCBsaWtlIG9uRHJhZ0VuZC4gXG4gIG9uVG91Y2hDYW5jZWwobm9kZSwgZXZlbnRJbmZvLCBlKSAtIEJlaGF2ZXMganVzdCBsaWtlIG9uRHJhZ0NhbmNlbC5cbiAgb25Nb3VzZVdoZWVsKGRlbHRhLCBlKSAtIFRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIHVzZXMgdGhlIG1vdXNlIHNjcm9sbCBvdmVyIHRoZSBjYW52YXMuICpkZWx0YSogaXMgMSBvciAtMSBkZXBlbmRpbmcgb24gdGhlIHNlbnNlIG9mIHRoZSBtb3VzZSBzY3JvbGwuXG4qL1xuXG5PcHRpb25zLkV2ZW50cyA9IHtcbiAgJGV4dGVuZDogZmFsc2UsXG4gIFxuICBlbmFibGU6IGZhbHNlLFxuICBlbmFibGVGb3JFZGdlczogZmFsc2UsXG4gIHR5cGU6ICdhdXRvJyxcbiAgb25DbGljazogJC5lbXB0eSxcbiAgb25SaWdodENsaWNrOiAkLmVtcHR5LFxuICBvbk1vdXNlTW92ZTogJC5lbXB0eSxcbiAgb25Nb3VzZUVudGVyOiAkLmVtcHR5LFxuICBvbk1vdXNlTGVhdmU6ICQuZW1wdHksXG4gIG9uRHJhZ1N0YXJ0OiAkLmVtcHR5LFxuICBvbkRyYWdNb3ZlOiAkLmVtcHR5LFxuICBvbkRyYWdDYW5jZWw6ICQuZW1wdHksXG4gIG9uRHJhZ0VuZDogJC5lbXB0eSxcbiAgb25Ub3VjaFN0YXJ0OiAkLmVtcHR5LFxuICBvblRvdWNoTW92ZTogJC5lbXB0eSxcbiAgb25Ub3VjaEVuZDogJC5lbXB0eSxcbiAgb25Nb3VzZVdoZWVsOiAkLmVtcHR5XG59O1xuXG4vKlxuICogRmlsZTogT3B0aW9ucy5OYXZpZ2F0aW9uLmpzXG4gKlxuKi9cblxuLypcbiAgT2JqZWN0OiBPcHRpb25zLk5hdmlnYXRpb25cbiAgXG4gIFBhbm5pbmcgYW5kIHpvb21pbmcgb3B0aW9ucyBmb3IgR3JhcGgvVHJlZSBiYXNlZCB2aXN1YWxpemF0aW9ucy4gVGhlc2Ugb3B0aW9ucyBhcmUgaW1wbGVtZW50ZWQgXG4gIGJ5IGFsbCB2aXN1YWxpemF0aW9ucyBleGNlcHQgY2hhcnRzICg8QXJlYUNoYXJ0PiwgPEJhckNoYXJ0PiBhbmQgPFBpZUNoYXJ0PikuXG4gIFxuICBTeW50YXg6XG4gIFxuICAoc3RhcnQgY29kZSBqcylcblxuICBPcHRpb25zLk5hdmlnYXRpb24gPSB7XG4gICAgZW5hYmxlOiBmYWxzZSxcbiAgICB0eXBlOiAnYXV0bycsXG4gICAgcGFubmluZzogZmFsc2UsIC8vdHJ1ZSwgJ2F2b2lkIG5vZGVzJ1xuICAgIHpvb21pbmc6IGZhbHNlXG4gIH07XG4gIFxuICAoZW5kIGNvZGUpXG4gIFxuICBFeGFtcGxlOlxuICAgIFxuICAoc3RhcnQgY29kZSBqcylcbiAgdmFyIHZpeiA9IG5ldyAkaml0LlZpeih7XG4gICAgTmF2aWdhdGlvbjoge1xuICAgICAgZW5hYmxlOiB0cnVlLFxuICAgICAgcGFubmluZzogJ2F2b2lkIG5vZGVzJyxcbiAgICAgIHpvb21pbmc6IDIwXG4gICAgfVxuICB9KTtcbiAgKGVuZCBjb2RlKVxuICBcbiAgUGFyYW1ldGVyczpcbiAgXG4gIGVuYWJsZSAtIChib29sZWFuKSBEZWZhdWx0J3MgKmZhbHNlKi4gV2hldGhlciB0byBlbmFibGUgTmF2aWdhdGlvbiBjYXBhYmlsaXRpZXMuXG4gIHR5cGUgLSAoc3RyaW5nKSBEZWZhdWx0J3MgJ2F1dG8nLiBXaGV0aGVyIHRvIGF0dGFjaCB0aGUgbmF2aWdhdGlvbiBldmVudHMgb250byB0aGUgSFRNTCBsYWJlbHMgKHZpYSBldmVudCBkZWxlZ2F0aW9uKSBvciB0byB1c2UgdGhlIGN1c3RvbSAnTmF0aXZlJyBjYW52YXMgRXZlbnQgU3lzdGVtIG9mIHRoZSBsaWJyYXJ5LiBXaGVuICdhdXRvJyBzZXQgd2hlbiB5b3UgbGV0IHRoZSA8T3B0aW9ucy5MYWJlbD4gKnR5cGUqIHBhcmFtZXRlciBkZWNpZGUgdGhpcy5cbiAgcGFubmluZyAtIChib29sZWFufHN0cmluZykgRGVmYXVsdCdzICpmYWxzZSouIFNldCB0aGlzIHByb3BlcnR5IHRvICp0cnVlKiBpZiB5b3Ugd2FudCB0byBhZGQgRHJhZyBhbmQgRHJvcCBwYW5uaW5nIHN1cHBvcnQgdG8gdGhlIHZpc3VhbGl6YXRpb24uIFlvdSBjYW4gYWxzbyBzZXQgdGhpcyBwYXJhbWV0ZXIgdG8gJ2F2b2lkIG5vZGVzJyB0byBlbmFibGUgRG5EIHBhbm5pbmcgYnV0IGRpc2FibGUgaXQgaWYgdGhlIERuRCBpcyB0YWtpbmcgcGxhY2Ugb3ZlciBhIG5vZGUuIFRoaXMgaXMgdXNlZnVsIHdoZW4gc29tZSBvdGhlciBldmVudHMgbGlrZSBEcmFnICYgRHJvcCBmb3Igbm9kZXMgYXJlIGFkZGVkIHRvIDxHcmFwaC5Ob2Rlcz4uXG4gIHpvb21pbmcgLSAoYm9vbGVhbnxudW1iZXIpIERlZmF1bHQncyAqZmFsc2UqLiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBhIG51bWVyaWMgdmFsdWUgdG8gdHVybiBtb3VzZS1zY3JvbGwgem9vbWluZyBvbi4gVGhlIG51bWJlciB3aWxsIGJlIHByb3BvcnRpb25hbCB0byB0aGUgbW91c2Utc2Nyb2xsIHNlbnNpdGl2aXR5LlxuICBcbiovXG5cbk9wdGlvbnMuTmF2aWdhdGlvbiA9IHtcbiAgJGV4dGVuZDogZmFsc2UsXG4gIFxuICBlbmFibGU6IGZhbHNlLFxuICB0eXBlOiAnYXV0bycsXG4gIHBhbm5pbmc6IGZhbHNlLCAvL3RydWUgfCAnYXZvaWQgbm9kZXMnXG4gIHpvb21pbmc6IGZhbHNlXG59O1xuXG4vKlxuICogRmlsZTogT3B0aW9ucy5Db250cm9sbGVyLmpzXG4gKlxuKi9cblxuLypcbiAgT2JqZWN0OiBPcHRpb25zLkNvbnRyb2xsZXJcbiAgXG4gIFByb3ZpZGVzIGNvbnRyb2xsZXIgbWV0aG9kcy4gQ29udHJvbGxlciBtZXRob2RzIGFyZSBjYWxsYmFjayBmdW5jdGlvbnMgdGhhdCBnZXQgY2FsbGVkIGF0IGRpZmZlcmVudCBzdGFnZXMgXG4gIG9mIHRoZSBhbmltYXRpb24sIGNvbXB1dGluZyBvciBwbG90dGluZyBvZiB0aGUgdmlzdWFsaXphdGlvbi5cbiAgXG4gIEltcGxlbWVudGVkIGJ5OlxuICAgIFxuICBBbGwgdmlzdWFsaXphdGlvbnMgZXhjZXB0IGNoYXJ0cyAoPEFyZWFDaGFydD4sIDxCYXJDaGFydD4gYW5kIDxQaWVDaGFydD4pLlxuICBcbiAgU3ludGF4OlxuICBcbiAgKHN0YXJ0IGNvZGUganMpXG5cbiAgT3B0aW9ucy5Db250cm9sbGVyID0ge1xuICAgIG9uQmVmb3JlQ29tcHV0ZTogJC5lbXB0eSxcbiAgICBvbkFmdGVyQ29tcHV0ZTogICQuZW1wdHksXG4gICAgb25DcmVhdGVMYWJlbDogICAkLmVtcHR5LFxuICAgIG9uUGxhY2VMYWJlbDogICAgJC5lbXB0eSxcbiAgICBvbkNvbXBsZXRlOiAgICAgICQuZW1wdHksXG4gICAgb25CZWZvcmVQbG90TGluZTokLmVtcHR5LFxuICAgIG9uQWZ0ZXJQbG90TGluZTogJC5lbXB0eSxcbiAgICBvbkJlZm9yZVBsb3ROb2RlOiQuZW1wdHksXG4gICAgb25BZnRlclBsb3ROb2RlOiAkLmVtcHR5LFxuICAgIHJlcXVlc3Q6ICAgICAgICAgZmFsc2VcbiAgfTtcbiAgXG4gIChlbmQgY29kZSlcbiAgXG4gIEV4YW1wbGU6XG4gICAgXG4gIChzdGFydCBjb2RlIGpzKVxuICB2YXIgdml6ID0gbmV3ICRqaXQuVml6KHtcbiAgICBvbkJlZm9yZVBsb3ROb2RlOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICBpZihub2RlLnNlbGVjdGVkKSB7XG4gICAgICAgIG5vZGUuc2V0RGF0YSgnY29sb3InLCAnI2ZmYycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS5yZW1vdmVEYXRhKCdjb2xvcicpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25CZWZvcmVQbG90TGluZTogZnVuY3Rpb24oYWRqKSB7XG4gICAgICBpZihhZGoubm9kZUZyb20uc2VsZWN0ZWQgJiYgYWRqLm5vZGVUby5zZWxlY3RlZCkge1xuICAgICAgICBhZGouc2V0RGF0YSgnY29sb3InLCAnI2ZmYycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRqLnJlbW92ZURhdGEoJ2NvbG9yJyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkFmdGVyQ29tcHV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICBhbGVydChcImNvbXB1dGVkIVwiKTtcbiAgICB9XG4gIH0pO1xuICAoZW5kIGNvZGUpXG4gIFxuICBQYXJhbWV0ZXJzOlxuXG4gICBvbkJlZm9yZUNvbXB1dGUobm9kZSkgLSBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgcmlnaHQgYmVmb3JlIHBlcmZvcm1pbmcgYWxsIGNvbXB1dGF0aW9ucyBhbmQgYW5pbWF0aW9ucy4gVGhlIHNlbGVjdGVkIDxHcmFwaC5Ob2RlPiBpcyBwYXNzZWQgYXMgcGFyYW1ldGVyLlxuICAgb25BZnRlckNvbXB1dGUoKSAtIFRoaXMgbWV0aG9kIGlzIHRyaWdnZXJlZCBhZnRlciBhbGwgYW5pbWF0aW9ucyBvciBjb21wdXRhdGlvbnMgZW5kZWQuXG4gICBvbkNyZWF0ZUxhYmVsKGRvbUVsZW1lbnQsIG5vZGUpIC0gVGhpcyBtZXRob2QgcmVjZWl2ZXMgYSBuZXcgbGFiZWwgRElWIGVsZW1lbnQgYXMgZmlyc3QgcGFyYW1ldGVyLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgPEdyYXBoLk5vZGU+IGFzIHNlY29uZCBwYXJhbWV0ZXIuIFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBsYWJlbC4gVGhpcyBtZXRob2QgaXMgdXNlZnVsIHdoZW4gYWRkaW5nIGV2ZW50cyBvciBzdHlsZXMgdG8gdGhlIGxhYmVscyB1c2VkIGJ5IHRoZSBKSVQuXG4gICBvblBsYWNlTGFiZWwoZG9tRWxlbWVudCwgbm9kZSkgLSBUaGlzIG1ldGhvZCByZWNlaXZlcyBhIGxhYmVsIERJViBlbGVtZW50IGFzIGZpcnN0IHBhcmFtZXRlciBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgPEdyYXBoLk5vZGU+IGFzIHNlY29uZCBwYXJhbWV0ZXIuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBlYWNoIHRpbWUgYSBsYWJlbCBoYXMgYmVlbiBwbGFjZWQgaW4gdGhlIHZpc3VhbGl6YXRpb24sIGZvciBleGFtcGxlIGF0IGVhY2ggc3RlcCBvZiBhbiBhbmltYXRpb24sIGFuZCB0aHVzIGl0IGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZSBsYWJlbHMgcHJvcGVydGllcywgc3VjaCBhcyBzaXplIG9yIHBvc2l0aW9uLiBOb3RlIHRoYXQgb25QbGFjZUxhYmVsIHdpbGwgYmUgdHJpZ2dlcmVkIGFmdGVyIHVwZGF0aW5nIHRoZSBsYWJlbHMgcG9zaXRpb25zLiBUaGF0IG1lYW5zIHRoYXQsIGZvciBleGFtcGxlLCB0aGUgbGVmdCBhbmQgdG9wIGNzcyBwcm9wZXJ0aWVzIGFyZSBhbHJlYWR5IHVwZGF0ZWQgdG8gbWF0Y2ggdGhlIG5vZGVzIHBvc2l0aW9ucy4gV2lkdGggYW5kIGhlaWdodCBwcm9wZXJ0aWVzIGFyZSBub3Qgc2V0IGhvd2V2ZXIuXG4gICBvbkJlZm9yZVBsb3ROb2RlKG5vZGUpIC0gVGhpcyBtZXRob2QgaXMgdHJpZ2dlcmVkIHJpZ2h0IGJlZm9yZSBwbG90dGluZyBlYWNoIDxHcmFwaC5Ob2RlPi4gVGhpcyBtZXRob2QgaXMgdXNlZnVsIGZvciBjaGFuZ2luZyBhIG5vZGUgc3R5bGUgcmlnaHQgYmVmb3JlIHBsb3R0aW5nIGl0LlxuICAgb25BZnRlclBsb3ROb2RlKG5vZGUpIC0gVGhpcyBtZXRob2QgaXMgdHJpZ2dlcmVkIHJpZ2h0IGFmdGVyIHBsb3R0aW5nIGVhY2ggPEdyYXBoLk5vZGU+LlxuICAgb25CZWZvcmVQbG90TGluZShhZGopIC0gVGhpcyBtZXRob2QgaXMgdHJpZ2dlcmVkIHJpZ2h0IGJlZm9yZSBwbG90dGluZyBhIDxHcmFwaC5BZGphY2VuY2U+LiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIGFkZGluZyBzb21lIHN0eWxlcyB0byBhIHBhcnRpY3VsYXIgZWRnZSBiZWZvcmUgYmVpbmcgcGxvdHRlZC5cbiAgIG9uQWZ0ZXJQbG90TGluZShhZGopIC0gVGhpcyBtZXRob2QgaXMgdHJpZ2dlcmVkIHJpZ2h0IGFmdGVyIHBsb3R0aW5nIGEgPEdyYXBoLkFkamFjZW5jZT4uXG5cbiAgICAqVXNlZCBpbiA8U1Q+LCA8VE0uQmFzZT4gYW5kIDxJY2ljbGU+IHZpc3VhbGl6YXRpb25zKlxuICAgIFxuICAgIHJlcXVlc3Qobm9kZUlkLCBsZXZlbCwgb25Db21wbGV0ZSkgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBidWZmZXJpbmcgaW5mb3JtYXRpb24gaW50byB0aGUgdmlzdWFsaXphdGlvbi4gV2hlbiBjbGlja2luZyBvbiBhbiBlbXB0eSBub2RlLCB0aGUgdmlzdWFsaXphdGlvbiB3aWxsIG1ha2UgYSByZXF1ZXN0IGZvciB0aGlzIG5vZGUncyBzdWJ0cmVlcywgc3BlY2lmeWluZyBhIGdpdmVuIGxldmVsIGZvciB0aGlzIHN1YnRyZWUgKGRlZmluZWQgYnkgX2xldmVsc1RvU2hvd18pLiBPbmNlIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlZCwgdGhlIG9uQ29tcGxldGUgY2FsbGJhY2sgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSBnaXZlbiByZXN1bHQuIFRoaXMgaXMgdXNlZnVsIHRvIHByb3ZpZGUgb24tZGVtYW5kIGluZm9ybWF0aW9uIGludG8gdGhlIHZpc3VhbGl6YXRpb25zIHdpdGhvdWdodCBoYXZpbmcgdG8gbG9hZCB0aGUgZW50aXJlIGluZm9ybWF0aW9uIGZyb20gc3RhcnQuIFRoZSBwYXJhbWV0ZXJzIHVzZWQgYnkgdGhpcyBtZXRob2QgYXJlIF9ub2RlSWRfLCB3aGljaCBpcyB0aGUgaWQgb2YgdGhlIHJvb3Qgb2YgdGhlIHN1YnRyZWUgdG8gcmVxdWVzdCwgX2xldmVsXyB3aGljaCBpcyB0aGUgZGVwdGggb2YgdGhlIHN1YnRyZWUgdG8gYmUgcmVxdWVzdGVkICgwIHdvdWxkIG1lYW4ganVzdCB0aGUgcm9vdCBub2RlKS4gX29uQ29tcGxldGVfIGlzIGFuIG9iamVjdCBoYXZpbmcgdGhlIGNhbGxiYWNrIG1ldGhvZCBfb25Db21wbGV0ZS5vbkNvbXBsZXRlKGpzb24pXyB0aGF0IHNob3VsZCBiZSBjYWxsZWQgb25jZSB0aGUganNvbiBoYXMgYmVlbiByZXRyaWV2ZWQuICBcbiBcbiAqL1xuT3B0aW9ucy5Db250cm9sbGVyID0ge1xuICAkZXh0ZW5kOiB0cnVlLFxuICBcbiAgb25CZWZvcmVDb21wdXRlOiAkLmVtcHR5LFxuICBvbkFmdGVyQ29tcHV0ZTogICQuZW1wdHksXG4gIG9uQ3JlYXRlTGFiZWw6ICAgJC5lbXB0eSxcbiAgb25QbGFjZUxhYmVsOiAgICAkLmVtcHR5LFxuICBvbkNvbXBsZXRlOiAgICAgICQuZW1wdHksXG4gIG9uQmVmb3JlUGxvdExpbmU6JC5lbXB0eSxcbiAgb25BZnRlclBsb3RMaW5lOiAkLmVtcHR5LFxuICBvbkJlZm9yZVBsb3ROb2RlOiQuZW1wdHksXG4gIG9uQWZ0ZXJQbG90Tm9kZTogJC5lbXB0eSxcbiAgcmVxdWVzdDogICAgICAgICBmYWxzZVxufTtcblxuXG4vKlxuICogRmlsZTogRXh0cmFzLmpzXG4gKiBcbiAqIFByb3ZpZGVzIEV4dHJhcyBzdWNoIGFzIFRpcHMgYW5kIFN0eWxlIEVmZmVjdHMuXG4gKiBcbiAqIERlc2NyaXB0aW9uOlxuICogXG4gKiBQcm92aWRlcyB0aGUgPFRpcHM+IGFuZCA8Tm9kZVN0eWxlcz4gY2xhc3NlcyBhbmQgZnVuY3Rpb25zLlxuICpcbiAqL1xuXG4vKlxuICogTWFuYWdlciBmb3IgbW91c2UgZXZlbnRzIChjbGlja2luZyBhbmQgbW91c2UgbW92aW5nKS5cbiAqIFxuICogVGhpcyBjbGFzcyBpcyB1c2VkIGZvciByZWdpc3RlcmluZyBvYmplY3RzIGltcGxlbWVudGluZyBvbkNsaWNrXG4gKiBhbmQgb25Nb3VzZW1vdmUgbWV0aG9kcy4gVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHdoZW4gY2xpY2tpbmcgb3JcbiAqIG1vdmluZyB0aGUgbW91c2UgYXJvdW5kICB0aGUgQ2FudmFzLlxuICogRm9yIG5vdywgPFRpcHM+IGFuZCA8Tm9kZVN0eWxlcz4gYXJlIGNsYXNzZXMgaW1wbGVtZW50aW5nIHRoZXNlIG1ldGhvZHMuXG4gKiBcbiAqL1xudmFyIEV4dHJhc0luaXRpYWxpemVyID0ge1xuICBpbml0aWFsaXplOiBmdW5jdGlvbihjbGFzc05hbWUsIHZpeikge1xuICAgIHRoaXMudml6ID0gdml6O1xuICAgIHRoaXMuY2FudmFzID0gdml6LmNhbnZhcztcbiAgICB0aGlzLmNvbmZpZyA9IHZpei5jb25maWdbY2xhc3NOYW1lXTtcbiAgICB0aGlzLm5vZGVUeXBlcyA9IHZpei5meC5ub2RlVHlwZXM7XG4gICAgdmFyIHR5cGUgPSB0aGlzLmNvbmZpZy50eXBlO1xuICAgIHRoaXMuZG9tID0gdHlwZSA9PSAnYXV0byc/ICh2aXouY29uZmlnLkxhYmVsLnR5cGUgIT0gJ05hdGl2ZScpIDogKHR5cGUgIT0gJ05hdGl2ZScpO1xuICAgIHRoaXMubGFiZWxDb250YWluZXIgPSB0aGlzLmRvbSAmJiB2aXoubGFiZWxzLmdldExhYmVsQ29udGFpbmVyKCk7XG4gICAgdGhpcy5pc0VuYWJsZWQoKSAmJiB0aGlzLmluaXRpYWxpemVQb3N0KCk7XG4gIH0sXG4gIGluaXRpYWxpemVQb3N0OiAkLmVtcHR5LFxuICBzZXRBc1Byb3BlcnR5OiAkLmxhbWJkYShmYWxzZSksXG4gIGlzRW5hYmxlZDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmVuYWJsZTtcbiAgfSxcbiAgaXNMYWJlbDogZnVuY3Rpb24oZSwgd2luLCBncm91cCkge1xuICAgIGUgPSAkLmV2ZW50LmdldChlLCB3aW4pO1xuICAgIHZhciBsYWJlbENvbnRhaW5lciA9IHRoaXMubGFiZWxDb250YWluZXIsXG4gICAgICAgIHRhcmdldCA9IGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudCxcbiAgICAgICAgcmVsYXRlZCA9IGUucmVsYXRlZFRhcmdldDtcbiAgICBpZihncm91cCkge1xuICAgICAgcmV0dXJuIHJlbGF0ZWQgJiYgcmVsYXRlZCA9PSB0aGlzLnZpei5jYW52YXMuZ2V0Q3R4KCkuY2FudmFzIFxuICAgICAgICAgICYmICEhdGFyZ2V0ICYmIHRoaXMuaXNEZXNjZW5kYW50T2YodGFyZ2V0LCBsYWJlbENvbnRhaW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmlzRGVzY2VuZGFudE9mKHRhcmdldCwgbGFiZWxDb250YWluZXIpO1xuICAgIH1cbiAgfSxcbiAgaXNEZXNjZW5kYW50T2Y6IGZ1bmN0aW9uKGVsZW0sIHBhcikge1xuICAgIHdoaWxlKGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlKSB7XG4gICAgICBpZihlbGVtLnBhcmVudE5vZGUgPT0gcGFyKVxuICAgICAgICByZXR1cm4gZWxlbTtcbiAgICAgIGVsZW0gPSBlbGVtLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxudmFyIEV2ZW50c0ludGVyZmFjZSA9IHtcbiAgb25Nb3VzZVVwOiAkLmVtcHR5LFxuICBvbk1vdXNlRG93bjogJC5lbXB0eSxcbiAgb25Nb3VzZU1vdmU6ICQuZW1wdHksXG4gIG9uTW91c2VPdmVyOiAkLmVtcHR5LFxuICBvbk1vdXNlT3V0OiAkLmVtcHR5LFxuICBvbk1vdXNlV2hlZWw6ICQuZW1wdHksXG4gIG9uVG91Y2hTdGFydDogJC5lbXB0eSxcbiAgb25Ub3VjaE1vdmU6ICQuZW1wdHksXG4gIG9uVG91Y2hFbmQ6ICQuZW1wdHksXG4gIG9uVG91Y2hDYW5jZWw6ICQuZW1wdHlcbn07XG5cbnZhciBNb3VzZUV2ZW50c01hbmFnZXIgPSBuZXcgQ2xhc3Moe1xuICBpbml0aWFsaXplOiBmdW5jdGlvbih2aXopIHtcbiAgICB0aGlzLnZpeiA9IHZpejtcbiAgICB0aGlzLmNhbnZhcyA9IHZpei5jYW52YXM7XG4gICAgdGhpcy5ub2RlID0gZmFsc2U7XG4gICAgdGhpcy5lZGdlID0gZmFsc2U7XG4gICAgdGhpcy5yZWdpc3RlcmVkT2JqZWN0cyA9IFtdO1xuICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XG4gIH0sXG4gIFxuICBhdHRhY2hFdmVudHM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBodG1sQ2FudmFzID0gdGhpcy5jYW52YXMuZ2V0RWxlbWVudCgpLCBcbiAgICAgICAgdGhhdCA9IHRoaXM7XG4gICAgaHRtbENhbnZhcy5vbmNvbnRleHRtZW51ID0gJC5sYW1iZGEoZmFsc2UpO1xuICAgICQuYWRkRXZlbnRzKGh0bWxDYW52YXMsIHtcbiAgICAgICdtb3VzZXVwJzogZnVuY3Rpb24oZSwgd2luKSB7XG4gICAgICAgIHZhciBldmVudCA9ICQuZXZlbnQuZ2V0KGUsIHdpbik7XG4gICAgICAgIHRoYXQuaGFuZGxlRXZlbnQoJ01vdXNlVXAnLCBlLCB3aW4sIFxuICAgICAgICAgICAgdGhhdC5tYWtlRXZlbnRPYmplY3QoZSwgd2luKSwgXG4gICAgICAgICAgICAkLmV2ZW50LmlzUmlnaHRDbGljayhldmVudCkpO1xuICAgICAgfSxcbiAgICAgICdtb3VzZWRvd24nOiBmdW5jdGlvbihlLCB3aW4pIHtcbiAgICAgICAgdmFyIGV2ZW50ID0gJC5ldmVudC5nZXQoZSwgd2luKTtcbiAgICAgICAgdGhhdC5oYW5kbGVFdmVudCgnTW91c2VEb3duJywgZSwgd2luLCB0aGF0Lm1ha2VFdmVudE9iamVjdChlLCB3aW4pLCBcbiAgICAgICAgICAgICQuZXZlbnQuaXNSaWdodENsaWNrKGV2ZW50KSk7XG4gICAgICB9LFxuICAgICAgJ21vdXNlbW92ZSc6IGZ1bmN0aW9uKGUsIHdpbikge1xuICAgICAgICB0aGF0LmhhbmRsZUV2ZW50KCdNb3VzZU1vdmUnLCBlLCB3aW4sIHRoYXQubWFrZUV2ZW50T2JqZWN0KGUsIHdpbikpO1xuICAgICAgfSxcbiAgICAgICdtb3VzZW92ZXInOiBmdW5jdGlvbihlLCB3aW4pIHtcbiAgICAgICAgdGhhdC5oYW5kbGVFdmVudCgnTW91c2VPdmVyJywgZSwgd2luLCB0aGF0Lm1ha2VFdmVudE9iamVjdChlLCB3aW4pKTtcbiAgICAgIH0sXG4gICAgICAnbW91c2VvdXQnOiBmdW5jdGlvbihlLCB3aW4pIHtcbiAgICAgICAgdGhhdC5oYW5kbGVFdmVudCgnTW91c2VPdXQnLCBlLCB3aW4sIHRoYXQubWFrZUV2ZW50T2JqZWN0KGUsIHdpbikpO1xuICAgICAgfSxcbiAgICAgICd0b3VjaHN0YXJ0JzogZnVuY3Rpb24oZSwgd2luKSB7XG4gICAgICAgIHRoYXQuaGFuZGxlRXZlbnQoJ1RvdWNoU3RhcnQnLCBlLCB3aW4sIHRoYXQubWFrZUV2ZW50T2JqZWN0KGUsIHdpbikpO1xuICAgICAgfSxcbiAgICAgICd0b3VjaG1vdmUnOiBmdW5jdGlvbihlLCB3aW4pIHtcbiAgICAgICAgdGhhdC5oYW5kbGVFdmVudCgnVG91Y2hNb3ZlJywgZSwgd2luLCB0aGF0Lm1ha2VFdmVudE9iamVjdChlLCB3aW4pKTtcbiAgICAgIH0sXG4gICAgICAndG91Y2hlbmQnOiBmdW5jdGlvbihlLCB3aW4pIHtcbiAgICAgICAgdGhhdC5oYW5kbGVFdmVudCgnVG91Y2hFbmQnLCBlLCB3aW4sIHRoYXQubWFrZUV2ZW50T2JqZWN0KGUsIHdpbikpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vYXR0YWNoIG1vdXNld2hlZWwgZXZlbnRcbiAgICB2YXIgaGFuZGxlTW91c2VXaGVlbCA9IGZ1bmN0aW9uKGUsIHdpbikge1xuICAgICAgdmFyIGV2ZW50ID0gJC5ldmVudC5nZXQoZSwgd2luKTtcbiAgICAgIHZhciB3aGVlbCA9ICQuZXZlbnQuZ2V0V2hlZWwoZXZlbnQpO1xuICAgICAgdGhhdC5oYW5kbGVFdmVudCgnTW91c2VXaGVlbCcsIGUsIHdpbiwgd2hlZWwpO1xuICAgIH07XG4gICAgLy9UT0RPKG5pY28pOiB0aGlzIGlzIGEgaG9ycmlibGUgY2hlY2sgZm9yIG5vbi1nZWNrbyBicm93c2VycyFcbiAgICBpZighZG9jdW1lbnQuZ2V0Qm94T2JqZWN0Rm9yICYmIHdpbmRvdy5tb3pJbm5lclNjcmVlblggPT0gbnVsbCkge1xuICAgICAgJC5hZGRFdmVudChodG1sQ2FudmFzLCAnbW91c2V3aGVlbCcsIGhhbmRsZU1vdXNlV2hlZWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBodG1sQ2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU1vdXNlU2Nyb2xsJywgaGFuZGxlTW91c2VXaGVlbCwgZmFsc2UpO1xuICAgIH1cbiAgfSxcbiAgXG4gIHJlZ2lzdGVyOiBmdW5jdGlvbihvYmopIHtcbiAgICB0aGlzLnJlZ2lzdGVyZWRPYmplY3RzLnB1c2gob2JqKTtcbiAgfSxcbiAgXG4gIGhhbmRsZUV2ZW50OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksXG4gICAgICAgIHR5cGUgPSBhcmdzLnNoaWZ0KCk7XG4gICAgZm9yKHZhciBpPTAsIHJlZ3M9dGhpcy5yZWdpc3RlcmVkT2JqZWN0cywgbD1yZWdzLmxlbmd0aDsgaTxsOyBpKyspIHtcbiAgICAgIHJlZ3NbaV1bJ29uJyArIHR5cGVdLmFwcGx5KHJlZ3NbaV0sIGFyZ3MpO1xuICAgIH1cbiAgfSxcbiAgXG4gIG1ha2VFdmVudE9iamVjdDogZnVuY3Rpb24oZSwgd2luKSB7XG4gICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICBncmFwaCA9IHRoaXMudml6LmdyYXBoLFxuICAgICAgICBmeCA9IHRoaXMudml6LmZ4LFxuICAgICAgICBudHlwZXMgPSBmeC5ub2RlVHlwZXMsXG4gICAgICAgIGV0eXBlcyA9IGZ4LmVkZ2VUeXBlcztcbiAgICByZXR1cm4ge1xuICAgICAgcG9zOiBmYWxzZSxcbiAgICAgIG5vZGU6IGZhbHNlLFxuICAgICAgZWRnZTogZmFsc2UsXG4gICAgICBjb250YWluczogZmFsc2UsXG4gICAgICBnZXROb2RlQ2FsbGVkOiBmYWxzZSxcbiAgICAgIGdldEVkZ2VDYWxsZWQ6IGZhbHNlLFxuICAgICAgZ2V0UG9zOiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy9UT0RPKG5pY28pOiBjaGVjayB3aHkgdGhpcyBjYW4ndCBiZSBjYWNoZSBhbnltb3JlIHdoZW4gdXNpbmcgZWRnZSBkZXRlY3Rpb25cbiAgICAgICAgLy9pZih0aGlzLnBvcykgcmV0dXJuIHRoaXMucG9zO1xuICAgICAgICB2YXIgY2FudmFzID0gdGhhdC52aXouY2FudmFzLFxuICAgICAgICAgICAgcyA9IGNhbnZhcy5nZXRTaXplKCksXG4gICAgICAgICAgICBwID0gY2FudmFzLmdldFBvcygpLFxuICAgICAgICAgICAgb3ggPSBjYW52YXMudHJhbnNsYXRlT2Zmc2V0WCxcbiAgICAgICAgICAgIG95ID0gY2FudmFzLnRyYW5zbGF0ZU9mZnNldFksXG4gICAgICAgICAgICBzeCA9IGNhbnZhcy5zY2FsZU9mZnNldFgsXG4gICAgICAgICAgICBzeSA9IGNhbnZhcy5zY2FsZU9mZnNldFksXG4gICAgICAgICAgICBwb3MgPSAkLmV2ZW50LmdldFBvcyhlLCB3aW4pO1xuICAgICAgICB0aGlzLnBvcyA9IHtcbiAgICAgICAgICB4OiAocG9zLnggLSBwLnggLSBzLndpZHRoLzIgLSBveCkgKiAxL3N4LFxuICAgICAgICAgIHk6IChwb3MueSAtIHAueSAtIHMuaGVpZ2h0LzIgLSBveSkgKiAxL3N5XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLnBvcztcbiAgICAgIH0sXG4gICAgICBnZXROb2RlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYodGhpcy5nZXROb2RlQ2FsbGVkKSByZXR1cm4gdGhpcy5ub2RlO1xuICAgICAgICB0aGlzLmdldE5vZGVDYWxsZWQgPSB0cnVlO1xuICAgICAgICBmb3IodmFyIGlkIGluIGdyYXBoLm5vZGVzKSB7XG4gICAgICAgICAgdmFyIG4gPSBncmFwaC5ub2Rlc1tpZF0sXG4gICAgICAgICAgICAgIGdlb20gPSBuICYmIG50eXBlc1tuLmdldERhdGEoJ3R5cGUnKV0sXG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBTVEFSVCBNRVRBTUFQUyBDT0RFXG4gICAgICAgICAgICAgIGNvbnRhaW5zID0gbi5nZXREYXRhKCdhbHBoYScpICE9PSAwICYmIGdlb20gJiYgZ2VvbS5jb250YWlucyAmJiBnZW9tLmNvbnRhaW5zLmNhbGwoZngsIG4sIHRoaXMuZ2V0UG9zKCkpO1xuICAgICAgICAgICAgICAvLyBFTkQgTUVUQU1BUFMgQ09ERVxuICAgICAgICAgICAgICAvLyBPUklHSU5BTCBDT0RFIGNvbnRhaW5zID0gZ2VvbSAmJiBnZW9tLmNvbnRhaW5zICYmIGdlb20uY29udGFpbnMuY2FsbChmeCwgbiwgdGhpcy5nZXRQb3MoKSk7XG5cbiAgICAgICAgICBpZihjb250YWlucykge1xuICAgICAgICAgICAgdGhpcy5jb250YWlucyA9IGNvbnRhaW5zO1xuICAgICAgICAgICAgcmV0dXJuIHRoYXQubm9kZSA9IHRoaXMubm9kZSA9IG47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGF0Lm5vZGUgPSB0aGlzLm5vZGUgPSBmYWxzZTtcbiAgICAgIH0sXG4gICAgICBnZXRFZGdlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYodGhpcy5nZXRFZGdlQ2FsbGVkKSByZXR1cm4gdGhpcy5lZGdlO1xuICAgICAgICB0aGlzLmdldEVkZ2VDYWxsZWQgPSB0cnVlO1xuICAgICAgICB2YXIgaGFzaHNldCA9IHt9O1xuICAgICAgICBmb3IodmFyIGlkIGluIGdyYXBoLmVkZ2VzKSB7XG4gICAgICAgICAgdmFyIGVkZ2VGcm9tID0gZ3JhcGguZWRnZXNbaWRdO1xuICAgICAgICAgIGhhc2hzZXRbaWRdID0gdHJ1ZTtcbiAgICAgICAgICBmb3IodmFyIGVkZ2VJZCBpbiBlZGdlRnJvbSkge1xuICAgICAgICAgICAgaWYoZWRnZUlkIGluIGhhc2hzZXQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdmFyIGUgPSBlZGdlRnJvbVtlZGdlSWRdLFxuICAgICAgICAgICAgICAgIGdlb20gPSBlICYmIGV0eXBlc1tlLmdldERhdGEoJ3R5cGUnKV0sXG5cbiAgICAgICAgICAgICAgICAvLyBTVEFSVCBNRVRBTUFQUyBDT0RFXG4gICAgICAgICAgICAgICAgY29udGFpbnMgPSBlLmdldERhdGEoJ2FscGhhJykgIT09IDAgJiYgZ2VvbSAmJiBnZW9tLmNvbnRhaW5zICYmIGdlb20uY29udGFpbnMuY2FsbChmeCwgZSwgdGhpcy5nZXRQb3MoKSk7XG4gICAgICAgICAgICAgICAgLy8gRU5EIE1FVEFNQVBTIENPREVcbiAgICAgICAgICAgICAgICAvLyBPUklHSU5BTCBDT0RFIGNvbnRhaW5zID0gZ2VvbSAmJiBnZW9tLmNvbnRhaW5zICYmIGdlb20uY29udGFpbnMuY2FsbChmeCwgbiwgdGhpcy5nZXRQb3MoKSk7XG4gICAgICAgICAgICBpZihjb250YWlucykge1xuICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5zID0gY29udGFpbnM7XG4gICAgICAgICAgICAgIHJldHVybiB0aGF0LmVkZ2UgPSB0aGlzLmVkZ2UgPSBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhhdC5lZGdlID0gdGhpcy5lZGdlID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgZ2V0Q29udGFpbnM6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZih0aGlzLmdldE5vZGVDYWxsZWQpIHJldHVybiB0aGlzLmNvbnRhaW5zO1xuICAgICAgICB0aGlzLmdldE5vZGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbnM7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufSk7XG5cbi8qIFxuICogUHJvdmlkZXMgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGZvciA8Tm9kZVN0eWxlcz4gYW5kIDxUaXBzPiBpbXBsZW1lbnRlZCBcbiAqIGJ5IGFsbCBtYWluIHZpc3VhbGl6YXRpb25zLlxuICpcbiAqL1xudmFyIEV4dHJhcyA9IHtcbiAgaW5pdGlhbGl6ZUV4dHJhczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIG1lbSA9IG5ldyBNb3VzZUV2ZW50c01hbmFnZXIodGhpcyksIHRoYXQgPSB0aGlzO1xuICAgICQuZWFjaChbJ05vZGVTdHlsZXMnLCAnVGlwcycsICdOYXZpZ2F0aW9uJywgJ0V2ZW50cyddLCBmdW5jdGlvbihrKSB7XG4gICAgICB2YXIgb2JqID0gbmV3IEV4dHJhcy5DbGFzc2VzW2tdKGssIHRoYXQpO1xuICAgICAgaWYob2JqLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgIG1lbS5yZWdpc3RlcihvYmopO1xuICAgICAgfVxuICAgICAgaWYob2JqLnNldEFzUHJvcGVydHkoKSkge1xuICAgICAgICB0aGF0W2sudG9Mb3dlckNhc2UoKV0gPSBvYmo7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gICBcbn07XG5cbkV4dHJhcy5DbGFzc2VzID0ge307XG4vKlxuICBDbGFzczogRXZlbnRzXG4gICBcbiAgVGhpcyBjbGFzcyBkZWZpbmVzIGFuIEV2ZW50IEFQSSB0byBiZSBhY2Nlc3NlZCBieSB0aGUgdXNlci5cbiAgVGhlIG1ldGhvZHMgaW1wbGVtZW50ZWQgYXJlIHRoZSBvbmVzIGRlZmluZWQgaW4gdGhlIDxPcHRpb25zLkV2ZW50cz4gb2JqZWN0LlxuKi9cblxuRXh0cmFzLkNsYXNzZXMuRXZlbnRzID0gbmV3IENsYXNzKHtcbiAgSW1wbGVtZW50czogW0V4dHJhc0luaXRpYWxpemVyLCBFdmVudHNJbnRlcmZhY2VdLFxuICBcbiAgaW5pdGlhbGl6ZVBvc3Q6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZnggPSB0aGlzLnZpei5meDtcbiAgICB0aGlzLm50eXBlcyA9IHRoaXMudml6LmZ4Lm5vZGVUeXBlcztcbiAgICB0aGlzLmV0eXBlcyA9IHRoaXMudml6LmZ4LmVkZ2VUeXBlcztcbiAgICBcbiAgICB0aGlzLmhvdmVyZWQgPSBmYWxzZTtcbiAgICB0aGlzLnByZXNzZWQgPSBmYWxzZTtcbiAgICB0aGlzLnRvdWNoZWQgPSBmYWxzZTtcblxuICAgIHRoaXMudG91Y2hNb3ZlZCA9IGZhbHNlO1xuICAgIHRoaXMubW92ZWQgPSBmYWxzZTtcbiAgICBcbiAgfSxcbiAgXG4gIHNldEFzUHJvcGVydHk6ICQubGFtYmRhKHRydWUpLFxuICBcbiAgb25Nb3VzZVVwOiBmdW5jdGlvbihlLCB3aW4sIGV2ZW50LCBpc1JpZ2h0Q2xpY2spIHtcbiAgICB2YXIgZXZ0ID0gJC5ldmVudC5nZXQoZSwgd2luKTtcbiAgICBpZighdGhpcy5tb3ZlZCkge1xuICAgICAgaWYoaXNSaWdodENsaWNrKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLm9uUmlnaHRDbGljayh0aGlzLmhvdmVyZWQsIGV2ZW50LCBldnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb25maWcub25DbGljayh0aGlzLnByZXNzZWQsIGV2ZW50LCBldnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZih0aGlzLnByZXNzZWQpIHtcbiAgICAgIGlmKHRoaXMubW92ZWQpIHtcbiAgICAgICAgdGhpcy5jb25maWcub25EcmFnRW5kKHRoaXMucHJlc3NlZCwgZXZlbnQsIGV2dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbmZpZy5vbkRyYWdDYW5jZWwodGhpcy5wcmVzc2VkLCBldmVudCwgZXZ0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMucHJlc3NlZCA9IHRoaXMubW92ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0sXG5cbiAgb25Nb3VzZU91dDogZnVuY3Rpb24oZSwgd2luLCBldmVudCkge1xuICAgLy9tb3VzZW91dCBhIGxhYmVsXG4gICB2YXIgZXZ0ID0gJC5ldmVudC5nZXQoZSwgd2luKSwgbGFiZWw7XG4gICBpZih0aGlzLmRvbSAmJiAobGFiZWwgPSB0aGlzLmlzTGFiZWwoZSwgd2luLCB0cnVlKSkpIHtcbiAgICAgdGhpcy5jb25maWcub25Nb3VzZUxlYXZlKHRoaXMudml6LmdyYXBoLmdldE5vZGUobGFiZWwuaWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsIGV2dCk7XG4gICAgIHRoaXMuaG92ZXJlZCA9IGZhbHNlO1xuICAgICByZXR1cm47XG4gICB9XG4gICAvL21vdXNlb3V0IGNhbnZhc1xuICAgdmFyIHJ0ID0gZXZ0LnJlbGF0ZWRUYXJnZXQsXG4gICAgICAgY2FudmFzV2lkZ2V0ID0gdGhpcy5jYW52YXMuZ2V0RWxlbWVudCgpO1xuICAgd2hpbGUocnQgJiYgcnQucGFyZW50Tm9kZSkge1xuICAgICBpZihjYW52YXNXaWRnZXQgPT0gcnQucGFyZW50Tm9kZSkgcmV0dXJuO1xuICAgICBydCA9IHJ0LnBhcmVudE5vZGU7XG4gICB9XG4gICBpZih0aGlzLmhvdmVyZWQpIHtcbiAgICAgdGhpcy5jb25maWcub25Nb3VzZUxlYXZlKHRoaXMuaG92ZXJlZCxcbiAgICAgICAgIGV2ZW50LCBldnQpO1xuICAgICB0aGlzLmhvdmVyZWQgPSBmYWxzZTtcbiAgIH1cbiAgfSxcbiAgXG4gIG9uTW91c2VPdmVyOiBmdW5jdGlvbihlLCB3aW4sIGV2ZW50KSB7XG4gICAgLy9tb3VzZW92ZXIgYSBsYWJlbFxuICAgIHZhciBldnQgPSAkLmV2ZW50LmdldChlLCB3aW4pLCBsYWJlbDtcbiAgICBpZih0aGlzLmRvbSAmJiAobGFiZWwgPSB0aGlzLmlzTGFiZWwoZSwgd2luLCB0cnVlKSkpIHtcbiAgICAgIHRoaXMuaG92ZXJlZCA9IHRoaXMudml6LmdyYXBoLmdldE5vZGUobGFiZWwuaWQpO1xuICAgICAgdGhpcy5jb25maWcub25Nb3VzZUVudGVyKHRoaXMuaG92ZXJlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwgZXZ0KTtcbiAgICB9XG4gIH0sXG4gIFxuICBvbk1vdXNlTW92ZTogZnVuY3Rpb24oZSwgd2luLCBldmVudCkge1xuICAgdmFyIGxhYmVsLCBldnQgPSAkLmV2ZW50LmdldChlLCB3aW4pO1xuICAgaWYodGhpcy5wcmVzc2VkKSB7XG4gICAgIHRoaXMubW92ZWQgPSB0cnVlO1xuICAgICB0aGlzLmNvbmZpZy5vbkRyYWdNb3ZlKHRoaXMucHJlc3NlZCwgZXZlbnQsIGV2dCk7XG4gICAgIHJldHVybjtcbiAgIH1cbiAgIGlmKHRoaXMuZG9tKSB7XG4gICAgIHRoaXMuY29uZmlnLm9uTW91c2VNb3ZlKHRoaXMuaG92ZXJlZCxcbiAgICAgICAgIGV2ZW50LCBldnQpO1xuICAgfSBlbHNlIHtcbiAgICAgaWYodGhpcy5ob3ZlcmVkKSB7XG4gICAgICAgdmFyIGhuID0gdGhpcy5ob3ZlcmVkO1xuICAgICAgIHZhciBnZW9tID0gaG4ubm9kZUZyb20/IHRoaXMuZXR5cGVzW2huLmdldERhdGEoJ3R5cGUnKV0gOiB0aGlzLm50eXBlc1tobi5nZXREYXRhKCd0eXBlJyldO1xuICAgICAgIHZhciBjb250YWlucyA9IGdlb20gJiYgZ2VvbS5jb250YWlucyBcbiAgICAgICAgICYmIGdlb20uY29udGFpbnMuY2FsbCh0aGlzLmZ4LCBobiwgZXZlbnQuZ2V0UG9zKCkpO1xuICAgICAgIGlmKGNvbnRhaW5zKSB7XG4gICAgICAgICB0aGlzLmNvbmZpZy5vbk1vdXNlTW92ZShobiwgZXZlbnQsIGV2dCk7XG4gICAgICAgICByZXR1cm47XG4gICAgICAgfSBlbHNlIHtcbiAgICAgICAgIHRoaXMuY29uZmlnLm9uTW91c2VMZWF2ZShobiwgZXZlbnQsIGV2dCk7XG4gICAgICAgICB0aGlzLmhvdmVyZWQgPSBmYWxzZTtcbiAgICAgICB9XG4gICAgIH1cbiAgICAgaWYodGhpcy5ob3ZlcmVkID0gKGV2ZW50LmdldE5vZGUoKSB8fCAodGhpcy5jb25maWcuZW5hYmxlRm9yRWRnZXMgJiYgZXZlbnQuZ2V0RWRnZSgpKSkpIHtcbiAgICAgICB0aGlzLmNvbmZpZy5vbk1vdXNlRW50ZXIodGhpcy5ob3ZlcmVkLCBldmVudCwgZXZ0KTtcbiAgICAgfSBlbHNlIHtcbiAgICAgICB0aGlzLmNvbmZpZy5vbk1vdXNlTW92ZShmYWxzZSwgZXZlbnQsIGV2dCk7XG4gICAgIH1cbiAgIH1cbiAgfSxcbiAgXG4gIG9uTW91c2VXaGVlbDogZnVuY3Rpb24oZSwgd2luLCBkZWx0YSkge1xuICAgIHRoaXMuY29uZmlnLm9uTW91c2VXaGVlbChkZWx0YSwgJC5ldmVudC5nZXQoZSwgd2luKSk7XG4gIH0sXG4gIFxuICBvbk1vdXNlRG93bjogZnVuY3Rpb24oZSwgd2luLCBldmVudCkge1xuICAgIFxuICAgIC8vIFNUQVJUIE1FVEFNQVBTIENPREVcbiAgICB2YXIgZXZ0ID0gJC5ldmVudC5nZXQoZSwgd2luKTtcbiAgICB0aGlzLnByZXNzZWQgPSBldmVudC5nZXROb2RlKCkgfHwgKHRoaXMuY29uZmlnLmVuYWJsZUZvckVkZ2VzICYmIGV2ZW50LmdldEVkZ2UoKSk7XG4gICAgLy8gRU5EIE1FVEFNQVBTIENPREUgICAgXG4gICAgLy8gT1JJR0lOQUwgQ09ERVxuICAgIC8qdmFyIGV2dCA9ICQuZXZlbnQuZ2V0KGUsIHdpbiksIGxhYmVsO1xuICAgIGlmKHRoaXMuZG9tKSB7XG4gICAgICBpZihsYWJlbCA9IHRoaXMuaXNMYWJlbChlLCB3aW4pKSB7XG4gICAgICAgIHRoaXMucHJlc3NlZCA9IHRoaXMudml6LmdyYXBoLmdldE5vZGUobGFiZWwuaWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByZXNzZWQgPSBldmVudC5nZXROb2RlKCkgfHwgKHRoaXMuY29uZmlnLmVuYWJsZUZvckVkZ2VzICYmIGV2ZW50LmdldEVkZ2UoKSk7XG4gICAgfSAqL1xuICAgIHRoaXMucHJlc3NlZCAmJiB0aGlzLmNvbmZpZy5vbkRyYWdTdGFydCh0aGlzLnByZXNzZWQsIGV2ZW50LCBldnQpO1xuICB9LFxuICBcbiAgb25Ub3VjaFN0YXJ0OiBmdW5jdGlvbihlLCB3aW4sIGV2ZW50KSB7XG4gICAgdmFyIGV2dCA9ICQuZXZlbnQuZ2V0KGUsIHdpbiksIGxhYmVsO1xuICAgIGlmKHRoaXMuZG9tICYmIChsYWJlbCA9IHRoaXMuaXNMYWJlbChlLCB3aW4pKSkge1xuICAgICAgdGhpcy50b3VjaGVkID0gdGhpcy52aXouZ3JhcGguZ2V0Tm9kZShsYWJlbC5pZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudG91Y2hlZCA9IGV2ZW50LmdldE5vZGUoKSB8fCAodGhpcy5jb25maWcuZW5hYmxlRm9yRWRnZXMgJiYgZXZlbnQuZ2V0RWRnZSgpKTtcbiAgICB9XG4gICAgdGhpcy50b3VjaGVkICYmIHRoaXMuY29uZmlnLm9uVG91Y2hTdGFydCh0aGlzLnRvdWNoZWQsIGV2ZW50LCBldnQpO1xuICB9LFxuICBcbiAgb25Ub3VjaE1vdmU6IGZ1bmN0aW9uKGUsIHdpbiwgZXZlbnQpIHtcbiAgICB2YXIgZXZ0ID0gJC5ldmVudC5nZXQoZSwgd2luKTtcbiAgICBpZih0aGlzLnRvdWNoZWQpIHtcbiAgICAgIHRoaXMudG91Y2hNb3ZlZCA9IHRydWU7XG4gICAgICB0aGlzLmNvbmZpZy5vblRvdWNoTW92ZSh0aGlzLnRvdWNoZWQsIGV2ZW50LCBldnQpO1xuICAgIH1cbiAgfSxcbiAgXG4gIG9uVG91Y2hFbmQ6IGZ1bmN0aW9uKGUsIHdpbiwgZXZlbnQpIHtcbiAgICB2YXIgZXZ0ID0gJC5ldmVudC5nZXQoZSwgd2luKTtcbiAgICBpZih0aGlzLnRvdWNoZWQpIHtcbiAgICAgIGlmKHRoaXMudG91Y2hNb3ZlZCkge1xuICAgICAgICB0aGlzLmNvbmZpZy5vblRvdWNoRW5kKHRoaXMudG91Y2hlZCwgZXZlbnQsIGV2dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbmZpZy5vblRvdWNoQ2FuY2VsKHRoaXMudG91Y2hlZCwgZXZlbnQsIGV2dCk7XG4gICAgICB9XG4gICAgICB0aGlzLnRvdWNoZWQgPSB0aGlzLnRvdWNoTW92ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn0pO1xuXG4vKlxuICAgQ2xhc3M6IFRpcHNcbiAgICBcbiAgIEEgY2xhc3MgY29udGFpbmluZyB0aXAgcmVsYXRlZCBmdW5jdGlvbnMuIFRoaXMgY2xhc3MgaXMgdXNlZCBpbnRlcm5hbGx5LlxuICAgXG4gICBVc2VkIGJ5OlxuICAgXG4gICA8U1Q+LCA8U3VuYnVyc3Q+LCA8SHlwZXJ0cmVlPiwgPFJHcmFwaD4sIDxUTT4sIDxGb3JjZURpcmVjdGVkPiwgPEljaWNsZT5cbiAgIFxuICAgU2VlIGFsc286XG4gICBcbiAgIDxPcHRpb25zLlRpcHM+XG4qL1xuXG5FeHRyYXMuQ2xhc3Nlcy5UaXBzID0gbmV3IENsYXNzKHtcbiAgSW1wbGVtZW50czogW0V4dHJhc0luaXRpYWxpemVyLCBFdmVudHNJbnRlcmZhY2VdLFxuICBcbiAgaW5pdGlhbGl6ZVBvc3Q6IGZ1bmN0aW9uKCkge1xuICAgIC8vYWRkIERPTSB0b29sdGlwXG4gICAgaWYoZG9jdW1lbnQuYm9keSkge1xuICAgICAgdmFyIHRpcCA9ICQoJ190b29sdGlwJykgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aXAuaWQgPSAnX3Rvb2x0aXAnO1xuICAgICAgdGlwLmNsYXNzTmFtZSA9ICd0aXAnO1xuICAgICAgJC5leHRlbmQodGlwLnN0eWxlLCB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICBkaXNwbGF5OiAnbm9uZScsXG4gICAgICAgIHpJbmRleDogMTMwMDBcbiAgICAgIH0pO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aXApO1xuICAgICAgdGhpcy50aXAgPSB0aXA7XG4gICAgICB0aGlzLm5vZGUgPSBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIFxuICBzZXRBc1Byb3BlcnR5OiAkLmxhbWJkYSh0cnVlKSxcbiAgXG4gIG9uTW91c2VPdXQ6IGZ1bmN0aW9uKGUsIHdpbikge1xuICAgIC8vbW91c2VvdXQgYSBsYWJlbFxuICAgIHZhciBldnQgPSAkLmV2ZW50LmdldChlLCB3aW4pO1xuICAgIGlmKHRoaXMuZG9tICYmIHRoaXMuaXNMYWJlbChlLCB3aW4sIHRydWUpKSB7XG4gICAgICB0aGlzLmhpZGUodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vbW91c2VvdXQgY2FudmFzXG4gICAgdmFyIHJ0ID0gZS5yZWxhdGVkVGFyZ2V0LFxuICAgICAgICBjYW52YXNXaWRnZXQgPSB0aGlzLmNhbnZhcy5nZXRFbGVtZW50KCk7XG4gICAgd2hpbGUocnQgJiYgcnQucGFyZW50Tm9kZSkge1xuICAgICAgaWYoY2FudmFzV2lkZ2V0ID09IHJ0LnBhcmVudE5vZGUpIHJldHVybjtcbiAgICAgIHJ0ID0gcnQucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgdGhpcy5oaWRlKGZhbHNlKTtcbiAgfSxcbiAgXG4gIG9uTW91c2VPdmVyOiBmdW5jdGlvbihlLCB3aW4pIHtcbiAgICAvL21vdXNlb3ZlciBhIGxhYmVsXG4gICAgdmFyIGxhYmVsO1xuICAgIGlmKHRoaXMuZG9tICYmIChsYWJlbCA9IHRoaXMuaXNMYWJlbChlLCB3aW4sIGZhbHNlKSkpIHtcbiAgICAgIHRoaXMubm9kZSA9IHRoaXMudml6LmdyYXBoLmdldE5vZGUobGFiZWwuaWQpO1xuICAgICAgdGhpcy5jb25maWcub25TaG93KHRoaXMudGlwLCB0aGlzLm5vZGUsIGxhYmVsKTtcbiAgICB9XG4gIH0sXG4gIFxuICBvbk1vdXNlTW92ZTogZnVuY3Rpb24oZSwgd2luLCBvcHQpIHtcbiAgICBpZih0aGlzLmRvbSAmJiB0aGlzLmlzTGFiZWwoZSwgd2luKSkge1xuICAgICAgdGhpcy5zZXRUb29sdGlwUG9zaXRpb24oJC5ldmVudC5nZXRQb3MoZSwgd2luKSk7XG4gICAgfVxuICAgIGlmKCF0aGlzLmRvbSkge1xuICAgICAgdmFyIG5vZGUgPSBvcHQuZ2V0Tm9kZSgpO1xuICAgICAgaWYoIW5vZGUpIHtcbiAgICAgICAgdGhpcy5oaWRlKHRydWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZih0aGlzLmNvbmZpZy5mb3JjZSB8fCAhdGhpcy5ub2RlIHx8IHRoaXMubm9kZS5pZCAhPSBub2RlLmlkKSB7XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMuY29uZmlnLm9uU2hvdyh0aGlzLnRpcCwgbm9kZSwgb3B0LmdldENvbnRhaW5zKCkpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRUb29sdGlwUG9zaXRpb24oJC5ldmVudC5nZXRQb3MoZSwgd2luKSk7XG4gICAgfVxuICB9LFxuICBcbiAgc2V0VG9vbHRpcFBvc2l0aW9uOiBmdW5jdGlvbihwb3MpIHtcbiAgICB2YXIgdGlwID0gdGhpcy50aXAsIFxuICAgICAgICBzdHlsZSA9IHRpcC5zdHlsZSwgXG4gICAgICAgIGNvbnQgPSB0aGlzLmNvbmZpZztcbiAgICBzdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgLy9nZXQgd2luZG93IGRpbWVuc2lvbnNcbiAgICB2YXIgd2luID0ge1xuICAgICAgJ2hlaWdodCc6IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LFxuICAgICAgJ3dpZHRoJzogZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aFxuICAgIH07XG4gICAgLy9nZXQgdG9vbHRpcCBkaW1lbnNpb25zXG4gICAgdmFyIG9iaiA9IHtcbiAgICAgICd3aWR0aCc6IHRpcC5vZmZzZXRXaWR0aCxcbiAgICAgICdoZWlnaHQnOiB0aXAub2Zmc2V0SGVpZ2h0ICBcbiAgICB9O1xuICAgIC8vc2V0IHRvb2x0aXAgcG9zaXRpb25cbiAgICB2YXIgeCA9IGNvbnQub2Zmc2V0WCwgeSA9IGNvbnQub2Zmc2V0WTtcbiAgICBzdHlsZS50b3AgPSAoKHBvcy55ICsgeSArIG9iai5oZWlnaHQgPiB3aW4uaGVpZ2h0KT8gIFxuICAgICAgICAocG9zLnkgLSBvYmouaGVpZ2h0IC0geSkgOiBwb3MueSArIHkpICsgJ3B4JztcbiAgICBzdHlsZS5sZWZ0ID0gKChwb3MueCArIG9iai53aWR0aCArIHggPiB3aW4ud2lkdGgpPyBcbiAgICAgICAgKHBvcy54IC0gb2JqLndpZHRoIC0geCkgOiBwb3MueCArIHgpICsgJ3B4JztcbiAgfSxcbiAgXG4gIGhpZGU6IGZ1bmN0aW9uKHRyaWdnZXJDYWxsYmFjaykge1xuICAgIHRoaXMudGlwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdHJpZ2dlckNhbGxiYWNrICYmIHRoaXMuY29uZmlnLm9uSGlkZSgpO1xuICB9XG59KTtcblxuLypcbiAgQ2xhc3M6IE5vZGVTdHlsZXNcbiAgIFxuICBDaGFuZ2Ugbm9kZSBzdHlsZXMgd2hlbiBjbGlja2luZyBvciBob3ZlcmluZyBhIG5vZGUuIFRoaXMgY2xhc3MgaXMgdXNlZCBpbnRlcm5hbGx5LlxuICBcbiAgVXNlZCBieTpcbiAgXG4gIDxTVD4sIDxTdW5idXJzdD4sIDxIeXBlcnRyZWU+LCA8UkdyYXBoPiwgPFRNPiwgPEZvcmNlRGlyZWN0ZWQ+LCA8SWNpY2xlPlxuICBcbiAgU2VlIGFsc286XG4gIFxuICA8T3B0aW9ucy5Ob2RlU3R5bGVzPlxuKi9cbkV4dHJhcy5DbGFzc2VzLk5vZGVTdHlsZXMgPSBuZXcgQ2xhc3Moe1xuICBJbXBsZW1lbnRzOiBbRXh0cmFzSW5pdGlhbGl6ZXIsIEV2ZW50c0ludGVyZmFjZV0sXG4gIFxuICBpbml0aWFsaXplUG9zdDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5meCA9IHRoaXMudml6LmZ4O1xuICAgIHRoaXMudHlwZXMgPSB0aGlzLnZpei5meC5ub2RlVHlwZXM7XG4gICAgdGhpcy5uU3R5bGVzID0gdGhpcy5jb25maWc7XG4gICAgdGhpcy5ub2RlU3R5bGVzT25Ib3ZlciA9IHRoaXMublN0eWxlcy5zdHlsZXNIb3ZlcjtcbiAgICB0aGlzLm5vZGVTdHlsZXNPbkNsaWNrID0gdGhpcy5uU3R5bGVzLnN0eWxlc0NsaWNrO1xuICAgIHRoaXMuaG92ZXJlZE5vZGUgPSBmYWxzZTtcbiAgICB0aGlzLmZ4Lm5vZGVGeEFuaW1hdGlvbiA9IG5ldyBBbmltYXRpb24oKTtcbiAgICBcbiAgICB0aGlzLmRvd24gPSBmYWxzZTtcbiAgICB0aGlzLm1vdmUgPSBmYWxzZTtcbiAgfSxcbiAgXG4gIG9uTW91c2VPdXQ6IGZ1bmN0aW9uKGUsIHdpbikge1xuICAgIHRoaXMuZG93biA9IHRoaXMubW92ZSA9IGZhbHNlO1xuICAgIGlmKCF0aGlzLmhvdmVyZWROb2RlKSByZXR1cm47XG4gICAgLy9tb3VzZW91dCBhIGxhYmVsXG4gICAgaWYodGhpcy5kb20gJiYgdGhpcy5pc0xhYmVsKGUsIHdpbiwgdHJ1ZSkpIHtcbiAgICAgIHRoaXMudG9nZ2xlU3R5bGVzT25Ib3Zlcih0aGlzLmhvdmVyZWROb2RlLCBmYWxzZSk7XG4gICAgfVxuICAgIC8vbW91c2VvdXQgY2FudmFzXG4gICAgdmFyIHJ0ID0gZS5yZWxhdGVkVGFyZ2V0LFxuICAgICAgICBjYW52YXNXaWRnZXQgPSB0aGlzLmNhbnZhcy5nZXRFbGVtZW50KCk7XG4gICAgd2hpbGUocnQgJiYgcnQucGFyZW50Tm9kZSkge1xuICAgICAgaWYoY2FudmFzV2lkZ2V0ID09IHJ0LnBhcmVudE5vZGUpIHJldHVybjtcbiAgICAgIHJ0ID0gcnQucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgdGhpcy50b2dnbGVTdHlsZXNPbkhvdmVyKHRoaXMuaG92ZXJlZE5vZGUsIGZhbHNlKTtcbiAgICB0aGlzLmhvdmVyZWROb2RlID0gZmFsc2U7XG4gIH0sXG4gIFxuICBvbk1vdXNlT3ZlcjogZnVuY3Rpb24oZSwgd2luKSB7XG4gICAgLy9tb3VzZW92ZXIgYSBsYWJlbFxuICAgIHZhciBsYWJlbDtcbiAgICBpZih0aGlzLmRvbSAmJiAobGFiZWwgPSB0aGlzLmlzTGFiZWwoZSwgd2luLCB0cnVlKSkpIHtcbiAgICAgIHZhciBub2RlID0gdGhpcy52aXouZ3JhcGguZ2V0Tm9kZShsYWJlbC5pZCk7XG4gICAgICBpZihub2RlLnNlbGVjdGVkKSByZXR1cm47XG4gICAgICB0aGlzLmhvdmVyZWROb2RlID0gbm9kZTtcbiAgICAgIHRoaXMudG9nZ2xlU3R5bGVzT25Ib3Zlcih0aGlzLmhvdmVyZWROb2RlLCB0cnVlKTtcbiAgICB9XG4gIH0sXG4gIFxuICBvbk1vdXNlRG93bjogZnVuY3Rpb24oZSwgd2luLCBldmVudCwgaXNSaWdodENsaWNrKSB7XG4gICAgaWYoaXNSaWdodENsaWNrKSByZXR1cm47XG4gICAgdmFyIGxhYmVsO1xuICAgIGlmKHRoaXMuZG9tICYmIChsYWJlbCA9IHRoaXMuaXNMYWJlbChlLCB3aW4pKSkge1xuICAgICAgdGhpcy5kb3duID0gdGhpcy52aXouZ3JhcGguZ2V0Tm9kZShsYWJlbC5pZCk7XG4gICAgfSBlbHNlIGlmKCF0aGlzLmRvbSkge1xuICAgICAgdGhpcy5kb3duID0gZXZlbnQuZ2V0Tm9kZSgpO1xuICAgIH1cbiAgICB0aGlzLm1vdmUgPSBmYWxzZTtcbiAgfSxcbiAgXG4gIG9uTW91c2VVcDogZnVuY3Rpb24oZSwgd2luLCBldmVudCwgaXNSaWdodENsaWNrKSB7XG4gICAgaWYoaXNSaWdodENsaWNrKSByZXR1cm47XG4gICAgaWYoIXRoaXMubW92ZSkge1xuICAgICAgdGhpcy5vbkNsaWNrKGV2ZW50LmdldE5vZGUoKSk7XG4gICAgfVxuICAgIHRoaXMuZG93biA9IHRoaXMubW92ZSA9IGZhbHNlO1xuICB9LFxuICBcbiAgZ2V0UmVzdG9yZWRTdHlsZXM6IGZ1bmN0aW9uKG5vZGUsIHR5cGUpIHtcbiAgICB2YXIgcmVzdG9yZWRTdHlsZXMgPSB7fSwgXG4gICAgICAgIG5TdHlsZXMgPSB0aGlzWydub2RlU3R5bGVzT24nICsgdHlwZV07XG4gICAgZm9yKHZhciBwcm9wIGluIG5TdHlsZXMpIHtcbiAgICAgIHJlc3RvcmVkU3R5bGVzW3Byb3BdID0gbm9kZS5zdHlsZXNbJyQnICsgcHJvcF07XG4gICAgfVxuICAgIHJldHVybiByZXN0b3JlZFN0eWxlcztcbiAgfSxcbiAgXG4gIHRvZ2dsZVN0eWxlc09uSG92ZXI6IGZ1bmN0aW9uKG5vZGUsIHNldCkge1xuICAgIGlmKHRoaXMubm9kZVN0eWxlc09uSG92ZXIpIHtcbiAgICAgIHRoaXMudG9nZ2xlU3R5bGVzT24oJ0hvdmVyJywgbm9kZSwgc2V0KTtcbiAgICB9XG4gIH0sXG5cbiAgdG9nZ2xlU3R5bGVzT25DbGljazogZnVuY3Rpb24obm9kZSwgc2V0KSB7XG4gICAgaWYodGhpcy5ub2RlU3R5bGVzT25DbGljaykge1xuICAgICAgdGhpcy50b2dnbGVTdHlsZXNPbignQ2xpY2snLCBub2RlLCBzZXQpO1xuICAgIH1cbiAgfSxcbiAgXG4gIHRvZ2dsZVN0eWxlc09uOiBmdW5jdGlvbih0eXBlLCBub2RlLCBzZXQpIHtcbiAgICB2YXIgdml6ID0gdGhpcy52aXo7XG4gICAgdmFyIG5TdHlsZXMgPSB0aGlzLm5TdHlsZXM7XG4gICAgaWYoc2V0KSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICBpZighbm9kZS5zdHlsZXMpIHtcbiAgICAgICAgbm9kZS5zdHlsZXMgPSAkLm1lcmdlKG5vZGUuZGF0YSwge30pO1xuICAgICAgfVxuICAgICAgZm9yKHZhciBzIGluIHRoaXNbJ25vZGVTdHlsZXNPbicgKyB0eXBlXSkge1xuICAgICAgICB2YXIgJHMgPSAnJCcgKyBzO1xuICAgICAgICBpZighKCRzIGluIG5vZGUuc3R5bGVzKSkge1xuICAgICAgICAgICAgbm9kZS5zdHlsZXNbJHNdID0gbm9kZS5nZXREYXRhKHMpOyBcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdml6LmZ4Lm5vZGVGeCgkLmV4dGVuZCh7XG4gICAgICAgICdlbGVtZW50cyc6IHtcbiAgICAgICAgICAnaWQnOiBub2RlLmlkLFxuICAgICAgICAgICdwcm9wZXJ0aWVzJzogdGhhdFsnbm9kZVN0eWxlc09uJyArIHR5cGVdXG4gICAgICAgICB9LFxuICAgICAgICAgdHJhbnNpdGlvbjogVHJhbnMuUXVhcnQuZWFzZU91dCxcbiAgICAgICAgIGR1cmF0aW9uOjMwMCxcbiAgICAgICAgIGZwczo0MFxuICAgICAgfSwgdGhpcy5jb25maWcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJlc3RvcmVkU3R5bGVzID0gdGhpcy5nZXRSZXN0b3JlZFN0eWxlcyhub2RlLCB0eXBlKTtcbiAgICAgIHZpei5meC5ub2RlRngoJC5leHRlbmQoe1xuICAgICAgICAnZWxlbWVudHMnOiB7XG4gICAgICAgICAgJ2lkJzogbm9kZS5pZCxcbiAgICAgICAgICAncHJvcGVydGllcyc6IHJlc3RvcmVkU3R5bGVzXG4gICAgICAgICB9LFxuICAgICAgICAgdHJhbnNpdGlvbjogVHJhbnMuUXVhcnQuZWFzZU91dCxcbiAgICAgICAgIGR1cmF0aW9uOjMwMCxcbiAgICAgICAgIGZwczo0MFxuICAgICAgfSwgdGhpcy5jb25maWcpKTtcbiAgICB9XG4gIH0sXG5cbiAgb25DbGljazogZnVuY3Rpb24obm9kZSkge1xuICAgIGlmKCFub2RlKSByZXR1cm47XG4gICAgdmFyIG5TdHlsZXMgPSB0aGlzLm5vZGVTdHlsZXNPbkNsaWNrO1xuICAgIGlmKCFuU3R5bGVzKSByZXR1cm47XG4gICAgLy9pZiB0aGUgbm9kZSBpcyBzZWxlY3RlZCB0aGVuIHVuc2VsZWN0IGl0XG4gICAgaWYobm9kZS5zZWxlY3RlZCkge1xuICAgICAgdGhpcy50b2dnbGVTdHlsZXNPbkNsaWNrKG5vZGUsIGZhbHNlKTtcbiAgICAgIGRlbGV0ZSBub2RlLnNlbGVjdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL3Vuc2VsZWN0IGFsbCBzZWxlY3RlZCBub2Rlcy4uLlxuICAgICAgdGhpcy52aXouZ3JhcGguZWFjaE5vZGUoZnVuY3Rpb24obikge1xuICAgICAgICBpZihuLnNlbGVjdGVkKSB7XG4gICAgICAgICAgZm9yKHZhciBzIGluIG5TdHlsZXMpIHtcbiAgICAgICAgICAgIG4uc2V0RGF0YShzLCBuLnN0eWxlc1snJCcgKyBzXSwgJ2VuZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgbi5zZWxlY3RlZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvL3NlbGVjdCBjbGlja2VkIG5vZGVcbiAgICAgIHRoaXMudG9nZ2xlU3R5bGVzT25DbGljayhub2RlLCB0cnVlKTtcbiAgICAgIG5vZGUuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgZGVsZXRlIG5vZGUuaG92ZXJlZDtcbiAgICAgIHRoaXMuaG92ZXJlZE5vZGUgPSBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIFxuICBvbk1vdXNlTW92ZTogZnVuY3Rpb24oZSwgd2luLCBldmVudCkge1xuICAgIC8vaWYgbW91c2UgYnV0dG9uIGlzIGRvd24gYW5kIG1vdmluZyBzZXQgbW92ZT10cnVlXG4gICAgaWYodGhpcy5kb3duKSB0aGlzLm1vdmUgPSB0cnVlO1xuICAgIC8vYWxyZWFkeSBoYW5kbGVkIGJ5IG1vdXNlb3Zlci9vdXRcbiAgICBpZih0aGlzLmRvbSAmJiB0aGlzLmlzTGFiZWwoZSwgd2luKSkgcmV0dXJuO1xuICAgIHZhciBuU3R5bGVzID0gdGhpcy5ub2RlU3R5bGVzT25Ib3ZlcjtcbiAgICBpZighblN0eWxlcykgcmV0dXJuO1xuICAgIFxuICAgIGlmKCF0aGlzLmRvbSkge1xuICAgICAgaWYodGhpcy5ob3ZlcmVkTm9kZSkge1xuICAgICAgICB2YXIgZ2VvbSA9IHRoaXMudHlwZXNbdGhpcy5ob3ZlcmVkTm9kZS5nZXREYXRhKCd0eXBlJyldO1xuICAgICAgICB2YXIgY29udGFpbnMgPSBnZW9tICYmIGdlb20uY29udGFpbnMgJiYgZ2VvbS5jb250YWlucy5jYWxsKHRoaXMuZngsIFxuICAgICAgICAgICAgdGhpcy5ob3ZlcmVkTm9kZSwgZXZlbnQuZ2V0UG9zKCkpO1xuICAgICAgICBpZihjb250YWlucykgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIG5vZGUgPSBldmVudC5nZXROb2RlKCk7XG4gICAgICAvL2lmIG5vIG5vZGUgaXMgYmVpbmcgaG92ZXJlZCB0aGVuIGp1c3QgZXhpdFxuICAgICAgaWYoIXRoaXMuaG92ZXJlZE5vZGUgJiYgIW5vZGUpIHJldHVybjtcbiAgICAgIC8vaWYgdGhlIG5vZGUgaXMgaG92ZXJlZCB0aGVuIGV4aXRcbiAgICAgIGlmKG5vZGUuaG92ZXJlZCkgcmV0dXJuO1xuICAgICAgLy9zZWxlY3QgaG92ZXJlZCBub2RlXG4gICAgICBpZihub2RlICYmICFub2RlLnNlbGVjdGVkKSB7XG4gICAgICAgIC8vY2hlY2sgaWYgYW4gYW5pbWF0aW9uIGlzIHJ1bm5pbmcgYW5kIGV4aXQgaXRcbiAgICAgICAgdGhpcy5meC5ub2RlRnhBbmltYXRpb24uc3RvcFRpbWVyKCk7XG4gICAgICAgIC8vdW5zZWxlY3QgYWxsIGhvdmVyZWQgbm9kZXMuLi5cbiAgICAgICAgdGhpcy52aXouZ3JhcGguZWFjaE5vZGUoZnVuY3Rpb24obikge1xuICAgICAgICAgIGlmKG4uaG92ZXJlZCAmJiAhbi5zZWxlY3RlZCkge1xuICAgICAgICAgICAgZm9yKHZhciBzIGluIG5TdHlsZXMpIHtcbiAgICAgICAgICAgICAgbi5zZXREYXRhKHMsIG4uc3R5bGVzWyckJyArIHNdLCAnZW5kJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgbi5ob3ZlcmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vc2VsZWN0IGhvdmVyZWQgbm9kZVxuICAgICAgICBub2RlLmhvdmVyZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmhvdmVyZWROb2RlID0gbm9kZTtcbiAgICAgICAgdGhpcy50b2dnbGVTdHlsZXNPbkhvdmVyKG5vZGUsIHRydWUpO1xuICAgICAgfSBlbHNlIGlmKHRoaXMuaG92ZXJlZE5vZGUgJiYgIXRoaXMuaG92ZXJlZE5vZGUuc2VsZWN0ZWQpIHtcbiAgICAgICAgLy9jaGVjayBpZiBhbiBhbmltYXRpb24gaXMgcnVubmluZyBhbmQgZXhpdCBpdFxuICAgICAgICB0aGlzLmZ4Lm5vZGVGeEFuaW1hdGlvbi5zdG9wVGltZXIoKTtcbiAgICAgICAgLy91bnNlbGVjdCBob3ZlcmVkIG5vZGVcbiAgICAgICAgdGhpcy50b2dnbGVTdHlsZXNPbkhvdmVyKHRoaXMuaG92ZXJlZE5vZGUsIGZhbHNlKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuaG92ZXJlZE5vZGUuaG92ZXJlZDtcbiAgICAgICAgdGhpcy5ob3ZlcmVkTm9kZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSk7XG5cbkV4dHJhcy5DbGFzc2VzLk5hdmlnYXRpb24gPSBuZXcgQ2xhc3Moe1xuICBJbXBsZW1lbnRzOiBbRXh0cmFzSW5pdGlhbGl6ZXIsIEV2ZW50c0ludGVyZmFjZV0sXG4gIFxuICBpbml0aWFsaXplUG9zdDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5wb3MgPSBmYWxzZTtcbiAgICB0aGlzLnByZXNzZWQgPSBmYWxzZTtcbiAgICAvLyBTVEFSVCBNRVRBTUFQUyBDT0RFXG4gICAgdGhpcy5pbml0RGlzdCA9IGZhbHNlO1xuICAgIC8vIEVORCBNRVRBTUFQUyBDT0RFXG4gIH0sXG4gIFxuICBvbk1vdXNlV2hlZWw6IGZ1bmN0aW9uKGUsIHdpbiwgc2Nyb2xsKSB7ICAgICAgXG4gICAgaWYoIXRoaXMuY29uZmlnLnpvb21pbmcpIHJldHVybjtcbiAgICBcbiAgICAvLyBTVEFSVCBNRVRBTUFQUyBDT0RFXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgIGlmIChlLnRhcmdldC5pZCAhPSAnaW5mb3Zpcy1jYW52YXMnKSByZXR1cm47XG4gICAgaWYgKE1ldGFtYXBzLkNyZWF0ZS5uZXdUb3BpYy5iZWluZ0NyZWF0ZWQgJiYgIU1ldGFtYXBzLkNyZWF0ZS5uZXdUb3BpYy5waW5uZWQpIHJldHVybjtcblx0ICAvLyBFTkQgTUVUQU1BUFMgQ09ERVxuICBcbiAgICAvLyQuZXZlbnQuc3RvcCgkLmV2ZW50LmdldChlLCB3aW4pKTtcbiAgICAvLyBFTkQgTUVUQU1BUFMgQ09ERVxuICAgIC8vIE9SSUdJTkFMIENPREUgJC5ldmVudC5zdG9wKCQuZXZlbnQuZ2V0KGUsIHdpbikpO1xuXG4gICAgdmFyIHZhbCA9IHRoaXMuY29uZmlnLnpvb21pbmcgLyAxMDAwLFxuICAgICAgICBhbnMgPSAxICsgc2Nyb2xsICogdmFsO1xuICAgICAgICBcbiAgICAvLyBTVEFSVCBNRVRBTUFQUyBDT0RFXG5cdCAgaWYgKCgoYW5zID4gMSkgJiYgKDUgPj0gdGhpcy5jYW52YXMuc2NhbGVPZmZzZXRYKSkgfHwgKChhbnMgPCAxKSAmJiAodGhpcy5jYW52YXMuc2NhbGVPZmZzZXRYID49IDAuMikpKSB7XG5cdCAgICB2YXIgcyA9IHRoaXMuY2FudmFzLmdldFNpemUoKSxcbiAgICAgICAgICBwID0gdGhpcy5jYW52YXMuZ2V0UG9zKCksXG4gICAgICAgICAgb3ggPSB0aGlzLmNhbnZhcy50cmFuc2xhdGVPZmZzZXRYLFxuICAgICAgICAgIG95ID0gdGhpcy5jYW52YXMudHJhbnNsYXRlT2Zmc2V0WSxcbiAgICAgICAgICBzeCA9IHRoaXMuY2FudmFzLnNjYWxlT2Zmc2V0WCxcbiAgICAgICAgICBzeSA9IHRoaXMuY2FudmFzLnNjYWxlT2Zmc2V0WTtcblx0ICAgIFxuXHQgICAgLy9CYXNpY2FsbHkgdGhpcyBpcyBqdXN0IGEgZHVwbGljYXRpb24gb2YgdGhlIFV0aWwgZnVuY3Rpb24gcGl4ZWxzVG9Db29yZHMsIGl0IGZpbmRzIHRoZSBjYW52YXMgY29vcmRpbmF0ZSBvZiB0aGUgbW91c2UgcG9pbnRlclxuICAgICAgdmFyIHBvaW50ZXJDb29yZFggPSAoZS5wYWdlWCAtIHAueCAtIHMud2lkdGggLyAyIC0gb3gpICogKDEgLyBzeCksXG4gICAgICAgICAgcG9pbnRlckNvb3JkWSA9IChlLnBhZ2VZIC0gcC55IC0gcy5oZWlnaHQgLyAyIC0gb3kpICogKDEgLyBzeSk7XG5cbiAgICAgIC8vVGhpcyB0cmFuc2xhdGVzIHRoZSBjYW52YXMgdG8gYmUgY2VudHJlZCBvdmVyIHRoZSBtb3VzZSBwb2ludGVyLCB0aGVuIHRoZSBjYW52YXMgaXMgem9vbWVkIGFzIGludGVuZGVkLlxuICAgICAgdGhpcy5jYW52YXMudHJhbnNsYXRlKC1wb2ludGVyQ29vcmRYLC1wb2ludGVyQ29vcmRZKTtcbiAgICAgIHRoaXMuY2FudmFzLnNjYWxlKGFucywgYW5zKTtcbiAgICAgIFxuICAgICAgLy9HZXQgdGhlIGNhbnZhcyBhdHRyaWJ1dGVzIGFnYWluIG5vdyB0aGF0IGlzIGhhcyBjaGFuZ2VkXG4gICAgICBzID0gdGhpcy5jYW52YXMuZ2V0U2l6ZSgpLFxuICAgICAgcCA9IHRoaXMuY2FudmFzLmdldFBvcygpLFxuICAgICAgb3ggPSB0aGlzLmNhbnZhcy50cmFuc2xhdGVPZmZzZXRYLFxuICAgICAgb3kgPSB0aGlzLmNhbnZhcy50cmFuc2xhdGVPZmZzZXRZLFxuICAgICAgc3ggPSB0aGlzLmNhbnZhcy5zY2FsZU9mZnNldFgsXG4gICAgICBzeSA9IHRoaXMuY2FudmFzLnNjYWxlT2Zmc2V0WTtcbiAgICAgIHZhciBuZXdYID0gKGUucGFnZVggLSBwLnggLSBzLndpZHRoIC8gMiAtIG94KSAqICgxIC8gc3gpLFxuICAgICAgICAgIG5ld1kgPSAoZS5wYWdlWSAtIHAueSAtIHMuaGVpZ2h0IC8gMiAtIG95KSAqICgxIC8gc3kpO1xuICAgICAgICAgIFxuICAgICAgLy9UcmFuc2xhdGUgdGhlIGNhbnZhcyB0byBwdXQgdGhlIHBvaW50ZXIgYmFjayBvdmVyIHRvcCB0aGUgc2FtZSBjb29yZGluYXRlIGl0IHdhcyBvdmVyIGJlZm9yZVxuICAgICAgdGhpcy5jYW52YXMudHJhbnNsYXRlKG5ld1gtcG9pbnRlckNvb3JkWCxuZXdZLXBvaW50ZXJDb29yZFkpO1xuXHQgIH1cblx0ICBcbiAgICAvLyBFTkQgTUVUQU1BUFMgQ09ERVxuICAgIC8vIE9SSUdJTkFMIENPREUgdGhpcy5jYW52YXMuc2NhbGUoYW5zLCBhbnMpO1xuXG4gICAgLy8gU1RBUlQgTUVUQU1BUFMgQ09ERVxuICAgICAgalF1ZXJ5KGRvY3VtZW50KS50cmlnZ2VyKE1ldGFtYXBzLkpJVC5ldmVudHMuem9vbSwgW2VdKTtcbiAgICAvLyBFTkQgTUVUQU1BUFMgQ09ERVxuICB9LFxuICBcbiAgb25Nb3VzZURvd246IGZ1bmN0aW9uKGUsIHdpbiwgZXZlbnRJbmZvKSB7XG4gICAgLy8vY29uc29sZS5sb2coJ21vdXNlIGRvd24hISEhJyk7XG4gICAgaWYoIXRoaXMuY29uZmlnLnBhbm5pbmcpIHJldHVybjtcbiAgICBcbiAgICAvL1NUQVJUIE1FVEFNQVBTIENPREVcbiAgICBNZXRhbWFwcy5Nb3VzZS5jaGFuZ2VJblggPSAwO1xuICAgIE1ldGFtYXBzLk1vdXNlLmNoYW5nZUluWSA9IDA7XG4gICAgaWYoKHRoaXMuY29uZmlnLnBhbm5pbmcgPT0gJ2F2b2lkIG5vZGVzJyAmJiBldmVudEluZm8uZ2V0Tm9kZSgpKSB8fCBldmVudEluZm8uZ2V0RWRnZSgpKSByZXR1cm47XG4gICAgLy8gRU5EIE1FVEFNQVBTIENPREVcbiAgICAvLyBPUklHSU5BbCBDT0RFIGlmKHRoaXMuY29uZmlnLnBhbm5pbmcgPT0gJ2F2b2lkIG5vZGVzJyAmJiAodGhpcy5kb20/IHRoaXMuaXNMYWJlbChlLCB3aW4pIDogZXZlbnRJbmZvLmdldE5vZGUoKSkpIHJldHVybjtcbiAgICBcbiAgICB0aGlzLnByZXNzZWQgPSB0cnVlO1xuICAgIFxuICAgIC8vU1RBUlQgTUVUQU1BUFMgQ09ERVxuICAgIHZhciByaWdodENsaWNrID0gZS5idXR0b24gPT0gMiB8fCAobmF2aWdhdG9yLnBsYXRmb3JtLmluZGV4T2YoXCJNYWNcIikgIT0gLTEgJiYgZS5jdHJsS2V5KTsgXG4gICAgLy8gVE9ETyBtYWtlIHN1cmUgdGhpcyB3b3JrcyBhY3Jvc3MgYnJvd3NlcnMgIFxuICAgIGlmICghTWV0YW1hcHMuTW91c2UuYm94U3RhcnRDb29yZGluYXRlcyAmJiAoKGUuYnV0dG9uID09IDAgJiYgZS5zaGlmdEtleSkgfHwgKGUuYnV0dG9uID09IDAgJiYgZS5jdHJsS2V5KSAgfHwgcmlnaHRDbGljaykpIHtcbiAgICAgIE1ldGFtYXBzLk1vdXNlLmJveFN0YXJ0Q29vcmRpbmF0ZXMgPSBldmVudEluZm8uZ2V0UG9zKCk7XG4gICAgICAvL2NvbnNvbGUubG9nKCdtb3VzZSBkb3duJyk7XG4gICAgfVxuXG4gICAgTWV0YW1hcHMuTW91c2UuZGlkUGFuID0gZmFsc2U7XG4gICAgXG5cbiAgICBcbiAgICAvLyBFTkQgTUVUQU1BUFMgQ09ERVxuICAgIFxuICAgIHRoaXMucG9zID0gZXZlbnRJbmZvLmdldFBvcygpO1xuICAgIHZhciBjYW52YXMgPSB0aGlzLmNhbnZhcyxcbiAgICAgICAgb3ggPSBjYW52YXMudHJhbnNsYXRlT2Zmc2V0WCxcbiAgICAgICAgb3kgPSBjYW52YXMudHJhbnNsYXRlT2Zmc2V0WSxcbiAgICAgICAgc3ggPSBjYW52YXMuc2NhbGVPZmZzZXRYLFxuICAgICAgICBzeSA9IGNhbnZhcy5zY2FsZU9mZnNldFk7XG4gICAgdGhpcy5wb3MueCAqPSBzeDtcbiAgICB0aGlzLnBvcy54ICs9IG94O1xuICAgIHRoaXMucG9zLnkgKj0gc3k7XG4gICAgdGhpcy5wb3MueSArPSBveTtcbiAgfSxcbiAgXG4gIG9uTW91c2VNb3ZlOiBmdW5jdGlvbihlLCB3aW4sIGV2ZW50SW5mbykge1xuICAgIGlmKCF0aGlzLmNvbmZpZy5wYW5uaW5nKSByZXR1cm47XG4gICAgaWYoIXRoaXMucHJlc3NlZCkgcmV0dXJuO1xuICAgIGlmKHRoaXMuY29uZmlnLnBhbm5pbmcgPT0gJ2F2b2lkIG5vZGVzJyAmJiAodGhpcy5kb20/IHRoaXMuaXNMYWJlbChlLCB3aW4pIDogZXZlbnRJbmZvLmdldE5vZGUoKSkpIHJldHVybjtcbiAgICBcbiAgICAvLyBTVEFSVCBNRVRBTUFQUyBDT0RFXG4gICAgdmFyIHJpZ2h0Q2xpY2sgPSBlLmJ1dHRvbiA9PSAyIHx8IChuYXZpZ2F0b3IucGxhdGZvcm0uaW5kZXhPZihcIk1hY1wiKSAhPSAtMSAmJiBlLmN0cmxLZXkpO1xuICAgIGlmICghTWV0YW1hcHMuTW91c2UuYm94U3RhcnRDb29yZGluYXRlcyAmJiAoKGUuYnV0dG9uID09IDAgJiYgZS5zaGlmdEtleSkgfHwgKGUuYnV0dG9uID09IDAgJiYgZS5jdHJsS2V5KSAgfHwgcmlnaHRDbGljaykpIHtcbiAgICAgIE1ldGFtYXBzLlZpc3VhbGl6ZS5tR3JhcGguYnVzeSA9IHRydWU7XG4gICAgICBNZXRhbWFwcy5ib3hTdGFydENvb3JkaW5hdGVzID0gZXZlbnRJbmZvLmdldFBvcygpO1xuICAgICAgLy9jb25zb2xlLmxvZygnbW91c2UgbW92ZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoTWV0YW1hcHMuTW91c2UuYm94U3RhcnRDb29yZGluYXRlcyAmJiAoKGUuYnV0dG9uID09IDAgJiYgZS5zaGlmdEtleSkgfHwgKGUuYnV0dG9uID09IDAgJiYgZS5jdHJsS2V5KSAgfHwgcmlnaHRDbGljaykpIHtcbiAgICAgIE1ldGFtYXBzLlZpc3VhbGl6ZS5tR3JhcGguYnVzeSA9IHRydWU7XG4gICAgICBNZXRhbWFwcy5Nb3VzZS5ib3hFbmRDb29yZGluYXRlcyA9IHtcbiAgICAgICAgeDogZXZlbnRJbmZvLmdldFBvcygpLngsXG4gICAgICAgIHk6IGV2ZW50SW5mby5nZXRQb3MoKS55XG4gICAgICB9XG4gICAgICBNZXRhbWFwcy5WaXN1YWxpemUubUdyYXBoLnBsb3QoKVxuICAgICAgLy9jb25zb2xlLmxvZygnbW91c2UgbW92ZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocmlnaHRDbGljayl7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlLnRhcmdldC5pZCAhPSAnaW5mb3Zpcy1jYW52YXMnKSB7IFxuICAgICAgdGhpcy5wcmVzc2VkID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIE1ldGFtYXBzLk1vdXNlLmRpZFBhbiA9IHRydWU7XG4gICAgLy8gRU5EIE1FVEFNQVBTIENPREVcbiAgICBcbiAgICB2YXIgdGhpc3BvcyA9IHRoaXMucG9zLCBcbiAgICAgICAgY3VycmVudFBvcyA9IGV2ZW50SW5mby5nZXRQb3MoKSxcbiAgICAgICAgY2FudmFzID0gdGhpcy5jYW52YXMsXG4gICAgICAgIG94ID0gY2FudmFzLnRyYW5zbGF0ZU9mZnNldFgsXG4gICAgICAgIG95ID0gY2FudmFzLnRyYW5zbGF0ZU9mZnNldFksXG4gICAgICAgIHN4ID0gY2FudmFzLnNjYWxlT2Zmc2V0WCxcbiAgICAgICAgc3kgPSBjYW52YXMuc2NhbGVPZmZzZXRZO1xuICAgIGN1cnJlbnRQb3MueCAqPSBzeDtcbiAgICBjdXJyZW50UG9zLnkgKj0gc3k7XG4gICAgY3VycmVudFBvcy54ICs9IG94O1xuICAgIGN1cnJlbnRQb3MueSArPSBveTtcbiAgICB2YXIgeCA9IGN1cnJlbnRQb3MueCAtIHRoaXNwb3MueCxcbiAgICAgICAgeSA9IGN1cnJlbnRQb3MueSAtIHRoaXNwb3MueTtcbiAgICBcbiAgICAvLyBTVEFSVCBNRVRBTUFQUyBDT0RFXG4gICAgTWV0YW1hcHMuTW91c2UuY2hhbmdlSW5YID0geDtcbiAgICBNZXRhbWFwcy5Nb3VzZS5jaGFuZ2VJblkgPSB5O1xuICAgIC8vIEVORCBNRVRBTUFQUyBDT0RFXG4gICAgXG4gICAgdGhpcy5wb3MgPSBjdXJyZW50UG9zO1xuICAgIHRoaXMuY2FudmFzLnRyYW5zbGF0ZSh4ICogMS9zeCwgeSAqIDEvc3kpO1xuXG4gICAgLy8gU1RBUlQgTUVUQU1BUFMgQ09ERVxuICAgICAgalF1ZXJ5KGRvY3VtZW50KS50cmlnZ2VyKE1ldGFtYXBzLkpJVC5ldmVudHMucGFuKTtcbiAgICAvLyBFTkQgTUVUQU1BUFMgQ09ERVxuICB9LFxuICBcbiAgb25Nb3VzZVVwOiBmdW5jdGlvbihlLCB3aW4sIGV2ZW50SW5mbywgaXNSaWdodENsaWNrKSB7XG4gICAgaWYoIXRoaXMuY29uZmlnLnBhbm5pbmcpIHJldHVybjtcbiAgICB0aGlzLnByZXNzZWQgPSBmYWxzZTtcbiAgICBcbiAgICAvLyBTVEFSVCBNRVRBTUFQUyBDT0RFXG4gICAgaWYgKE1ldGFtYXBzLk1vdXNlLmRpZFBhbikgTWV0YW1hcHMuSklULlNtb290aFBhbm5pbmcoKTsgXG4gICAgLy8gRU5EIE1FVEFNQVBTIENPREVcbiAgICBcbiAgfSxcbiAgXG4gIC8vIFNUQVJUIE1FVEFNQVBTIENPREVcbiAgb25Ub3VjaFN0YXJ0OiBmdW5jdGlvbihlLCB3aW4sIGV2ZW50SW5mbykge1xuICAgIGlmKCF0aGlzLmNvbmZpZy5wYW5uaW5nKSByZXR1cm47XG4gICAgTWV0YW1hcHMuTW91c2UuY2hhbmdlSW5YID0gMDtcbiAgICBNZXRhbWFwcy5Nb3VzZS5jaGFuZ2VJblkgPSAwO1xuICAgIGlmKCh0aGlzLmNvbmZpZy5wYW5uaW5nID09ICdhdm9pZCBub2RlcycgJiYgZXZlbnRJbmZvLmdldE5vZGUoKSkgfHwgZXZlbnRJbmZvLmdldEVkZ2UoKSkgcmV0dXJuO1xuICAgIHRoaXMucHJlc3NlZCA9IHRydWU7XG4gICAgdmFyIHJpZ2h0Q2xpY2sgPSBlLmJ1dHRvbiA9PSAyIHx8IChuYXZpZ2F0b3IucGxhdGZvcm0uaW5kZXhPZihcIk1hY1wiKSAhPSAtMSAmJiBlLmN0cmxLZXkpOyBcbiAgICBpZiAoIU1ldGFtYXBzLk1vdXNlLmJveFN0YXJ0Q29vcmRpbmF0ZXMgJiYgKChlLmJ1dHRvbiA9PSAwICYmIGUuc2hpZnRLZXkpIHx8IChlLmJ1dHRvbiA9PSAwICYmIGUuY3RybEtleSkgIHx8IHJpZ2h0Q2xpY2spKSB7XG4gICAgICBNZXRhbWFwcy5Nb3VzZS5ib3hTdGFydENvb3JkaW5hdGVzID0gZXZlbnRJbmZvLmdldFBvcygpO1xuICAgIH1cbiAgICBNZXRhbWFwcy5Nb3VzZS5kaWRQYW4gPSBmYWxzZTtcbiAgICB0aGlzLnBvcyA9IGV2ZW50SW5mby5nZXRQb3MoKTtcbiAgICB2YXIgY2FudmFzID0gdGhpcy5jYW52YXMsXG4gICAgICAgIG94ID0gY2FudmFzLnRyYW5zbGF0ZU9mZnNldFgsXG4gICAgICAgIG95ID0gY2FudmFzLnRyYW5zbGF0ZU9mZnNldFksXG4gICAgICAgIHN4ID0gY2FudmFzLnNjYWxlT2Zmc2V0WCxcbiAgICAgICAgc3kgPSBjYW52YXMuc2NhbGVPZmZzZXRZO1xuICAgIHRoaXMucG9zLnggKj0gc3g7XG4gICAgdGhpcy5wb3MueCArPSBveDtcbiAgICB0aGlzLnBvcy55ICo9IHN5O1xuICAgIHRoaXMucG9zLnkgKz0gb3k7XG4gIH0sXG4gIFxuICBvblRvdWNoTW92ZTogZnVuY3Rpb24oZSwgd2luLCBldmVudEluZm8pIHtcbiAgICBpZighdGhpcy5jb25maWcucGFubmluZykgcmV0dXJuO1xuICAgIGlmKCF0aGlzLnByZXNzZWQpIHJldHVybjtcbiAgICBpZih0aGlzLmNvbmZpZy5wYW5uaW5nID09ICdhdm9pZCBub2RlcycgJiYgKHRoaXMuZG9tPyB0aGlzLmlzTGFiZWwoZSwgd2luKSA6IGV2ZW50SW5mby5nZXROb2RlKCkpKSByZXR1cm47XG4gICAgXG4gICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPT0gMSkge1xuICAgICAgdmFyIHJpZ2h0Q2xpY2sgPSBlLmJ1dHRvbiA9PSAyIHx8IChuYXZpZ2F0b3IucGxhdGZvcm0uaW5kZXhPZihcIk1hY1wiKSAhPSAtMSAmJiBlLmN0cmxLZXkpO1xuICAgICAgaWYgKCFNZXRhbWFwcy5Nb3VzZS5ib3hTdGFydENvb3JkaW5hdGVzICYmICgoZS5idXR0b24gPT0gMCAmJiBlLnNoaWZ0S2V5KSB8fCAoZS5idXR0b24gPT0gMCAmJiBlLmN0cmxLZXkpICB8fCByaWdodENsaWNrKSkge1xuICAgICAgICBNZXRhbWFwcy5WaXN1YWxpemUubUdyYXBoLmJ1c3kgPSB0cnVlO1xuICAgICAgICBNZXRhbWFwcy5ib3hTdGFydENvb3JkaW5hdGVzID0gZXZlbnRJbmZvLmdldFBvcygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoTWV0YW1hcHMuTW91c2UuYm94U3RhcnRDb29yZGluYXRlcyAmJiAoKGUuYnV0dG9uID09IDAgJiYgZS5zaGlmdEtleSkgfHwgKGUuYnV0dG9uID09IDAgJiYgZS5jdHJsS2V5KSAgfHwgcmlnaHRDbGljaykpIHtcbiAgICAgICAgTWV0YW1hcHMuVmlzdWFsaXplLm1HcmFwaC5idXN5ID0gdHJ1ZTtcbiAgICAgICAgTWV0YW1hcHMuTW91c2UuYm94RW5kQ29vcmRpbmF0ZXMgPSB7XG4gICAgICAgICAgeDogZXZlbnRJbmZvLmdldFBvcygpLngsXG4gICAgICAgICAgeTogZXZlbnRJbmZvLmdldFBvcygpLnlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocmlnaHRDbGljayl7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChlLnRhcmdldC5pZCAhPSAnaW5mb3Zpcy1jYW52YXMnKSB7IFxuICAgICAgICB0aGlzLnByZXNzZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgTWV0YW1hcHMuTW91c2UuZGlkUGFuID0gdHJ1ZTtcbiAgICAgIHZhciB0aGlzcG9zID0gdGhpcy5wb3MsIFxuICAgICAgICAgIGN1cnJlbnRQb3MgPSBldmVudEluZm8uZ2V0UG9zKCksXG4gICAgICAgICAgY2FudmFzID0gdGhpcy5jYW52YXMsXG4gICAgICAgICAgb3ggPSBjYW52YXMudHJhbnNsYXRlT2Zmc2V0WCxcbiAgICAgICAgICBveSA9IGNhbnZhcy50cmFuc2xhdGVPZmZzZXRZLFxuICAgICAgICAgIHN4ID0gY2FudmFzLnNjYWxlT2Zmc2V0WCxcbiAgICAgICAgICBzeSA9IGNhbnZhcy5zY2FsZU9mZnNldFk7XG4gICAgICBjdXJyZW50UG9zLnggKj0gc3g7XG4gICAgICBjdXJyZW50UG9zLnkgKj0gc3k7XG4gICAgICBjdXJyZW50UG9zLnggKz0gb3g7XG4gICAgICBjdXJyZW50UG9zLnkgKz0gb3k7XG4gICAgICB2YXIgeCA9IGN1cnJlbnRQb3MueCAtIHRoaXNwb3MueCxcbiAgICAgICAgICB5ID0gY3VycmVudFBvcy55IC0gdGhpc3Bvcy55O1xuICAgICAgTWV0YW1hcHMuTW91c2UuY2hhbmdlSW5YID0geDtcbiAgICAgIE1ldGFtYXBzLk1vdXNlLmNoYW5nZUluWSA9IHk7XG4gICAgICB0aGlzLnBvcyA9IGN1cnJlbnRQb3M7XG4gICAgICB0aGlzLmNhbnZhcy50cmFuc2xhdGUoeCAqIDEvc3gsIHkgKiAxL3N5KTtcbiAgICAgIGpRdWVyeShkb2N1bWVudCkudHJpZ2dlcihNZXRhbWFwcy5KSVQuZXZlbnRzLnBhbik7XG4gICAgfSBcbiAgICAvKlxuICAgIGVsc2UgaWYgKGUudG91Y2hlcy5sZW5ndGggPT0gMikge1xuICAgICAgdmFyIHRvdWNoMSA9IGUudG91Y2hlc1swXVxuICAgICAgdmFyIHRvdWNoMiA9IGUudG91Y2hlc1sxXVxuICAgICAgdmFyIGNhbnZhcyA9IHRoaXMuY2FudmFzXG4gICAgICBcbiAgICAgIGNhbGxDb3VudCsrO1xuXG4gICAgICB2YXIgZGlzdCA9IE1ldGFtYXBzLlV0aWwuZ2V0RGlzdGFuY2Uoe1xuICAgICAgICB4OiB0b3VjaDEuY2xpZW50WCxcbiAgICAgICAgeTogdG91Y2gxLmNsaWVudFlcbiAgICAgIH0sIHtcbiAgICAgICAgeDogdG91Y2gyLmNsaWVudFgsXG4gICAgICAgIHk6IHRvdWNoMi5jbGllbnRZXG4gICAgICB9KVxuXG4gICAgICBpZiAoIXRoaXMuaW5pdERpc3QpIHtcbiAgICAgICAgdGhpcy5pbml0RGlzdCA9IGRpc3RcbiAgICAgICAgdGhpcy5pbml0U2NhbGUgPSBjYW52YXMuc2NhbGVPZmZzZXRYXG4gICAgICB9XG4gICAgICB2YXIgc2NhbGUgPSAoZGlzdCAvIHRoaXMuaW5pdERpc3QpXG4gICAgICBcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaGVhZGVyX2NvbnRlbnRcIikuaW5uZXJIVE1MID0gc2NhbGUgKyAnICcgKyBjYW52YXMuc2NhbGVPZmZzZXRYXG4gICAgICBpZiAoMzAgPj0gdGhpcy5pbml0U2NhbGUgKiBzY2FsZSAmJiB0aGlzLmluaXRTY2FsZSAqIHNjYWxlID49IDAuMikge1xuICAgICAgICBjYW52YXMuc2NhbGUodGhpcy5pbml0U2NhbGUgKiBzY2FsZSwgdGhpcy5pbml0U2NhbGUgKiBzY2FsZSlcbiAgICAgIH1cbiAgICAgIGlmIChjYW52YXMuc2NhbGVPZmZzZXRYIDwgMC41KSB7XG4gICAgICAgIGNhbnZhcy52aXoubGFiZWxzLmhpZGVMYWJlbHModHJ1ZSlcbiAgICAgIH0gZWxzZSBpZiAoY2FudmFzLnNjYWxlT2Zmc2V0WCA+IDAuNSkge1xuICAgICAgICBjYW52YXMudml6LmxhYmVscy5oaWRlTGFiZWxzKGZhbHNlKVxuICAgICAgfVxuICAgICAgXG4gICAgICBqUXVlcnkoZG9jdW1lbnQpLnRyaWdnZXIoTWV0YW1hcHMuSklULmV2ZW50cy56b29tKTtcbiAgICB9XG4gICAgKi9cbiAgfSxcbiAgXG4gIG9uVG91Y2hFbmQ6IGZ1bmN0aW9uKGUsIHdpbiwgZXZlbnRJbmZvLCBpc1JpZ2h0Q2xpY2spIHtcbiAgICBpZighdGhpcy5jb25maWcucGFubmluZykgcmV0dXJuO1xuICAgIHRoaXMucHJlc3NlZCA9IGZhbHNlO1xuICAgIGlmIChNZXRhbWFwcy5Nb3VzZS5kaWRQYW4pIE1ldGFtYXBzLkpJVC5TbW9vdGhQYW5uaW5nKCk7XG4gICAgdGhpcy5pbml0RGlzdCA9IGZhbHNlXG4gIH1cbiAgLy8gRU5EIE1FVEFNQVBTIENPREVcbn0pO1xuXG5cbi8qXG4gKiBGaWxlOiBDYW52YXMuanNcbiAqXG4gKi9cblxuLypcbiBDbGFzczogQ2FudmFzXG4gXG4gXHRBIGNhbnZhcyB3aWRnZXQgdXNlZCBieSBhbGwgdmlzdWFsaXphdGlvbnMuIFRoZSBjYW52YXMgb2JqZWN0IGNhbiBiZSBhY2Nlc3NlZCBieSBkb2luZyAqdml6LmNhbnZhcyouIElmIHlvdSB3YW50IHRvIFxuIFx0a25vdyBtb3JlIGFib3V0IDxDYW52YXM+IG9wdGlvbnMgdGFrZSBhIGxvb2sgYXQgPE9wdGlvbnMuQ2FudmFzPi5cbiBcbiBBIGNhbnZhcyB3aWRnZXQgaXMgYSBzZXQgb2YgRE9NIGVsZW1lbnRzIHRoYXQgd3JhcCB0aGUgbmF0aXZlIGNhbnZhcyBET00gRWxlbWVudCBwcm92aWRpbmcgYSBjb25zaXN0ZW50IEFQSSBhbmQgYmVoYXZpb3IgXG4gYWNyb3NzIGFsbCBicm93c2Vycy4gSXQgY2FuIGFsc28gaW5jbHVkZSBFbGVtZW50cyB0byBhZGQgRE9NIChTVkcgb3IgSFRNTCkgbGFiZWwgc3VwcG9ydCB0byBhbGwgdmlzdWFsaXphdGlvbnMuXG4gXG4gRXhhbXBsZTpcbiBcbiBTdXBwb3NlIHdlIGhhdmUgdGhpcyBIVE1MXG4gXG4gKHN0YXJ0IGNvZGUgeG1sKVxuIFx0PGRpdiBpZD1cImluZm92aXNcIj48L2Rpdj5cbiAoZW5kIGNvZGUpXG4gXG4gTm93IHdlIGNyZWF0ZSBhIG5ldyBWaXN1YWxpemF0aW9uXG4gXG4gKHN0YXJ0IGNvZGUganMpXG4gXHR2YXIgdml6ID0gbmV3ICRqaXQuVml6KHtcbiBcdFx0Ly9XaGVyZSB0byBpbmplY3QgdGhlIGNhbnZhcy4gQW55IGRpdiBjb250YWluZXIgd2lsbCBkby5cbiBcdFx0J2luamVjdEludG8nOidpbmZvdmlzJyxcblx0XHQgLy93aWR0aCBhbmQgaGVpZ2h0IGZvciBjYW52YXMuIFxuXHRcdCAvL0RlZmF1bHQncyB0byB0aGUgY29udGFpbmVyIG9mZnNldFdpZHRoIGFuZCBIZWlnaHQuXG5cdFx0ICd3aWR0aCc6IDkwMCxcblx0XHQgJ2hlaWdodCc6NTAwXG5cdCB9KTtcbiAoZW5kIGNvZGUpXG5cbiBUaGUgZ2VuZXJhdGVkIEhUTUwgd2lsbCBsb29rIGxpa2UgdGhpc1xuIFxuIChzdGFydCBjb2RlIHhtbClcbiA8ZGl2IGlkPVwiaW5mb3Zpc1wiPlxuIFx0PGRpdiBpZD1cImluZm92aXMtY2FudmFzd2lkZ2V0XCIgc3R5bGU9XCJwb3NpdGlvbjpyZWxhdGl2ZTtcIj5cbiBcdDxjYW52YXMgaWQ9XCJpbmZvdmlzLWNhbnZhc1wiIHdpZHRoPTkwMCBoZWlnaHQ9NTAwXG4gXHRzdHlsZT1cInBvc2l0aW9uOmFic29sdXRlOyB0b3A6MDsgbGVmdDowOyB3aWR0aDo5MDBweDsgaGVpZ2h0OjUwMHB4O1wiIC8+XG4gXHQ8ZGl2IGlkPVwiaW5mb3Zpcy1sYWJlbFwiXG4gXHRzdHlsZT1cIm92ZXJmbG93OnZpc2libGU7IHBvc2l0aW9uOmFic29sdXRlOyB0b3A6MDsgbGVmdDowOyB3aWR0aDo5MDBweDsgaGVpZ2h0OjBweFwiPlxuIFx0PC9kaXY+XG4gXHQ8L2Rpdj5cbiA8L2Rpdj5cbiAoZW5kIGNvZGUpXG4gXG4gQXMgeW91IGNhbiBzZWUsIHRoZSBnZW5lcmF0ZWQgSFRNTCBjb25zaXN0cyBvZiBhIGNhbnZhcyBET00gRWxlbWVudCBvZiBpZCAqaW5mb3Zpcy1jYW52YXMqIGFuZCBhIGRpdiBsYWJlbCBjb250YWluZXJcbiBvZiBpZCAqaW5mb3Zpcy1sYWJlbCosIHdyYXBwZWQgaW4gYSBtYWluIGRpdiBjb250YWluZXIgb2YgaWQgKmluZm92aXMtY2FudmFzd2lkZ2V0Ki5cbiAqL1xuXG52YXIgQ2FudmFzO1xuKGZ1bmN0aW9uKCkge1xuICAvL2NoZWNrIGZvciBuYXRpdmUgY2FudmFzIHN1cHBvcnRcbiAgdmFyIGNhbnZhc1R5cGUgPSB0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQsXG4gICAgICBzdXBwb3J0c0NhbnZhcyA9IChjYW52YXNUeXBlID09ICdvYmplY3QnIHx8IGNhbnZhc1R5cGUgPT0gJ2Z1bmN0aW9uJyk7XG4gIC8vY3JlYXRlIGVsZW1lbnQgZnVuY3Rpb25cbiAgZnVuY3Rpb24gJEUodGFnLCBwcm9wcykge1xuICAgIHZhciBlbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xuICAgIGZvcih2YXIgcCBpbiBwcm9wcykge1xuICAgICAgaWYodHlwZW9mIHByb3BzW3BdID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgJC5leHRlbmQoZWxlbVtwXSwgcHJvcHNbcF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbVtwXSA9IHByb3BzW3BdO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGFnID09IFwiY2FudmFzXCIgJiYgIXN1cHBvcnRzQ2FudmFzICYmIEdfdm1sQ2FudmFzTWFuYWdlcikge1xuICAgICAgZWxlbSA9IEdfdm1sQ2FudmFzTWFuYWdlci5pbml0RWxlbWVudChkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsZW0pKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW07XG4gIH1cbiAgLy9jYW52YXMgd2lkZ2V0IHdoaWNoIHdlIHdpbGwgY2FsbCBqdXN0IENhbnZhc1xuICAkaml0LkNhbnZhcyA9IENhbnZhcyA9IG5ldyBDbGFzcyh7XG4gICAgY2FudmFzZXM6IFtdLFxuICAgIHBvczogZmFsc2UsXG4gICAgZWxlbWVudDogZmFsc2UsXG4gICAgbGFiZWxDb250YWluZXI6IGZhbHNlLFxuICAgIHRyYW5zbGF0ZU9mZnNldFg6IDAsXG4gICAgdHJhbnNsYXRlT2Zmc2V0WTogMCxcbiAgICBzY2FsZU9mZnNldFg6IDEsXG4gICAgc2NhbGVPZmZzZXRZOiAxLFxuICAgIFxuICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKHZpeiwgb3B0KSB7XG4gICAgICB0aGlzLnZpeiA9IHZpejtcbiAgICAgIHRoaXMub3B0ID0gdGhpcy5jb25maWcgPSBvcHQ7XG4gICAgICB2YXIgaWQgPSAkLnR5cGUob3B0LmluamVjdEludG8pID09ICdzdHJpbmcnPyBcbiAgICAgICAgICBvcHQuaW5qZWN0SW50bzpvcHQuaW5qZWN0SW50by5pZCxcbiAgICAgICAgICB0eXBlID0gb3B0LnR5cGUsXG4gICAgICAgICAgaWRMYWJlbCA9IGlkICsgXCItbGFiZWxcIiwgXG4gICAgICAgICAgd3JhcHBlciA9ICQoaWQpLFxuICAgICAgICAgIHdpZHRoID0gb3B0LndpZHRoLCAvLyB8fCB3cmFwcGVyLm9mZnNldFdpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IG9wdC5oZWlnaHQ7IC8vIHx8IHdyYXBwZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgLy9jYW52YXMgb3B0aW9uc1xuICAgICAgdmFyIGNhbnZhc09wdGlvbnMgPSB7XG4gICAgICAgIGluamVjdEludG86IGlkLFxuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgICB9O1xuICAgICAgLy9jcmVhdGUgbWFpbiB3cmFwcGVyXG4gICAgICB0aGlzLmVsZW1lbnQgPSAkRSgnZGl2Jywge1xuICAgICAgICAnaWQnOiBpZCArICctY2FudmFzd2lkZ2V0JyxcbiAgICAgICAgJ3N0eWxlJzoge1xuICAgICAgICAgICdwb3NpdGlvbic6ICdyZWxhdGl2ZScsXG4gICAgICAgICAgJ3dpZHRoJzogd2lkdGggKyAncHgnLFxuICAgICAgICAgICdoZWlnaHQnOiBoZWlnaHQgKyAncHgnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy9jcmVhdGUgbGFiZWwgY29udGFpbmVyXG4gICAgICB0aGlzLmxhYmVsQ29udGFpbmVyID0gdGhpcy5jcmVhdGVMYWJlbENvbnRhaW5lcihvcHQuTGFiZWwudHlwZSwgXG4gICAgICAgICAgaWRMYWJlbCwgY2FudmFzT3B0aW9ucyk7XG4gICAgICAvL2NyZWF0ZSBwcmltYXJ5IGNhbnZhc1xuICAgICAgdGhpcy5jYW52YXNlcy5wdXNoKG5ldyBDYW52YXMuQmFzZVt0eXBlXSh7XG4gICAgICAgIGNvbmZpZzogJC5leHRlbmQoe2lkU3VmZml4OiAnLWNhbnZhcyd9LCBjYW52YXNPcHRpb25zKSxcbiAgICAgICAgcGxvdDogZnVuY3Rpb24oYmFzZSkge1xuICAgICAgICAgIHZpei5meC5wbG90KCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc2l6ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdml6LnJlZnJlc2goKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgICAgLy9jcmVhdGUgc2Vjb25kYXJ5IGNhbnZhc1xuICAgICAgdmFyIGJhY2sgPSBvcHQuYmFja2dyb3VuZDtcbiAgICAgIGlmKGJhY2spIHtcbiAgICAgICAgdmFyIGJhY2tDYW52YXMgPSBuZXcgQ2FudmFzLkJhY2tncm91bmRbYmFjay50eXBlXSh2aXosICQuZXh0ZW5kKGJhY2ssIGNhbnZhc09wdGlvbnMpKTtcbiAgICAgICAgdGhpcy5jYW52YXNlcy5wdXNoKG5ldyBDYW52YXMuQmFzZVt0eXBlXShiYWNrQ2FudmFzKSk7XG4gICAgICB9XG4gICAgICAvL2luc2VydCBjYW52YXNlc1xuICAgICAgdmFyIGxlbiA9IHRoaXMuY2FudmFzZXMubGVuZ3RoO1xuICAgICAgd2hpbGUobGVuLS0pIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuY2FudmFzZXNbbGVuXS5jYW52YXMpO1xuICAgICAgICBpZihsZW4gPiAwKSB7XG4gICAgICAgICAgdGhpcy5jYW52YXNlc1tsZW5dLnBsb3QoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMubGFiZWxDb250YWluZXIpO1xuICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpO1xuXG4gICAgICAvL1VwZGF0ZSBjYW52YXMgcG9zaXRpb24gd2hlbiB0aGUgcGFnZSBpcyBzY3JvbGxlZC5cbiAgICAgIHZhciB0aW1lciA9IG51bGwsIHRoYXQgPSB0aGlzO1xuICAgICAgJC5hZGRFdmVudCh3aW5kb3csICdzY3JvbGwnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHRoYXQuZ2V0UG9zKHRydWUpOyAvL3VwZGF0ZSBjYW52YXMgcG9zaXRpb25cbiAgICAgICAgfSwgNTAwKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgLypcbiAgICAgIE1ldGhvZDogZ2V0Q3R4XG4gICAgICBcbiAgICAgIFJldHVybnMgdGhlIG1haW4gY2FudmFzIGNvbnRleHQgb2JqZWN0XG4gICAgICBcbiAgICAgIEV4YW1wbGU6XG4gICAgICBcbiAgICAgIChzdGFydCBjb2RlIGpzKVxuICAgICAgIHZhciBjdHggPSBjYW52YXMuZ2V0Q3R4KCk7XG4gICAgICAgLy9Ob3cgSSBjYW4gdXNlIHRoZSBuYXRpdmUgY2FudmFzIGNvbnRleHRcbiAgICAgICAvL2FuZCBmb3IgZXhhbXBsZSBjaGFuZ2Ugc29tZSBjYW52YXMgc3R5bGVzXG4gICAgICAgY3R4Lmdsb2JhbEFscGhhID0gMTtcbiAgICAgIChlbmQgY29kZSlcbiAgICAqL1xuICAgIGdldEN0eDogZnVuY3Rpb24oaSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FudmFzZXNbaSB8fCAwXS5nZXRDdHgoKTtcbiAgICB9LFxuICAgIC8qXG4gICAgICBNZXRob2Q6IGdldENvbmZpZ1xuICAgICAgXG4gICAgICBSZXR1cm5zIHRoZSBjdXJyZW50IENvbmZpZ3VyYXRpb24gZm9yIHRoaXMgQ2FudmFzIFdpZGdldC5cbiAgICAgIFxuICAgICAgRXhhbXBsZTpcbiAgICAgIFxuICAgICAgKHN0YXJ0IGNvZGUganMpXG4gICAgICAgdmFyIGNvbmZpZyA9IGNhbnZhcy5nZXRDb25maWcoKTtcbiAgICAgIChlbmQgY29kZSlcbiAgICAqL1xuICAgIGdldENvbmZpZzogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHQ7XG4gICAgfSxcbiAgICAvKlxuICAgICAgTWV0aG9kOiBnZXRFbGVtZW50XG5cbiAgICAgIFJldHVybnMgdGhlIG1haW4gQ2FudmFzIERPTSB3cmFwcGVyXG4gICAgICBcbiAgICAgIEV4YW1wbGU6XG4gICAgICBcbiAgICAgIChzdGFydCBjb2RlIGpzKVxuICAgICAgIHZhciB3cmFwcGVyID0gY2FudmFzLmdldEVsZW1lbnQoKTtcbiAgICAgICAvL1JldHVybnMgPGRpdiBpZD1cImluZm92aXMtY2FudmFzd2lkZ2V0XCIgLi4uID4uLi48L2Rpdj4gYXMgZWxlbWVudFxuICAgICAgKGVuZCBjb2RlKVxuICAgICovXG4gICAgZ2V0RWxlbWVudDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50O1xuICAgIH0sXG4gICAgLypcbiAgICAgIE1ldGhvZDogZ2V0U2l6ZVxuICAgICAgXG4gICAgICBSZXR1cm5zIGNhbnZhcyBkaW1lbnNpb25zLlxuICAgICAgXG4gICAgICBSZXR1cm5zOlxuICAgICAgXG4gICAgICBBbiBvYmplY3Qgd2l0aCAqd2lkdGgqIGFuZCAqaGVpZ2h0KiBwcm9wZXJ0aWVzLlxuICAgICAgXG4gICAgICBFeGFtcGxlOlxuICAgICAgKHN0YXJ0IGNvZGUganMpXG4gICAgICBjYW52YXMuZ2V0U2l6ZSgpOyAvL3JldHVybnMgeyB3aWR0aDogOTAwLCBoZWlnaHQ6IDUwMCB9XG4gICAgICAoZW5kIGNvZGUpXG4gICAgKi9cbiAgICBnZXRTaXplOiBmdW5jdGlvbihpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYW52YXNlc1tpIHx8IDBdLmdldFNpemUoKTtcbiAgICB9LFxuICAgIC8qXG4gICAgICBNZXRob2Q6IHJlc2l6ZVxuICAgICAgXG4gICAgICBSZXNpemVzIHRoZSBjYW52YXMuXG4gICAgICBcbiAgICAgIFBhcmFtZXRlcnM6XG4gICAgICBcbiAgICAgIHdpZHRoIC0gTmV3IGNhbnZhcyB3aWR0aC5cbiAgICAgIGhlaWdodCAtIE5ldyBjYW52YXMgaGVpZ2h0LlxuICAgICAgXG4gICAgICBFeGFtcGxlOlxuICAgICAgXG4gICAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgICBjYW52YXMucmVzaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgKGVuZCBjb2RlKVxuICAgIFxuICAgICovXG4gICAgcmVzaXplOiBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB0aGlzLmdldFBvcyh0cnVlKTtcbiAgICAgIHRoaXMudHJhbnNsYXRlT2Zmc2V0WCA9IHRoaXMudHJhbnNsYXRlT2Zmc2V0WSA9IDA7XG4gICAgICB0aGlzLnNjYWxlT2Zmc2V0WCA9IHRoaXMuc2NhbGVPZmZzZXRZID0gMTtcblxuICAgICAgZm9yKHZhciBpPTAsIGw9dGhpcy5jYW52YXNlcy5sZW5ndGg7IGk8bDsgaSsrKSB7XG4gICAgICAgIHRoaXMuY2FudmFzZXNbaV0ucmVzaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgfVxuICAgICAgdmFyIHN0eWxlID0gdGhpcy5lbGVtZW50LnN0eWxlO1xuICAgICAgc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gICAgICBzdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuICAgICAgaWYodGhpcy5sYWJlbENvbnRhaW5lcilcbiAgICAgICAgdGhpcy5sYWJlbENvbnRhaW5lci5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICB9LFxuICAgIC8qXG4gICAgICBNZXRob2Q6IHRyYW5zbGF0ZVxuICAgICAgXG4gICAgICBBcHBsaWVzIGEgdHJhbnNsYXRpb24gdG8gdGhlIGNhbnZhcy5cbiAgICAgIFxuICAgICAgUGFyYW1ldGVyczpcbiAgICAgIFxuICAgICAgeCAtIChudW1iZXIpIHggb2Zmc2V0LlxuICAgICAgeSAtIChudW1iZXIpIHkgb2Zmc2V0LlxuICAgICAgZGlzYWJsZVBsb3QgLSAoYm9vbGVhbikgRGVmYXVsdCdzICpmYWxzZSouIFNldCB0aGlzIHRvICp0cnVlKiBpZiB5b3UgZG9uJ3Qgd2FudCB0byByZWZyZXNoIHRoZSB2aXN1YWxpemF0aW9uLlxuICAgICAgXG4gICAgICBFeGFtcGxlOlxuICAgICAgXG4gICAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgICBjYW52YXMudHJhbnNsYXRlKDMwLCAzMCk7XG4gICAgICAoZW5kIGNvZGUpXG4gICAgXG4gICAgKi9cbiAgICB0cmFuc2xhdGU6IGZ1bmN0aW9uKHgsIHksIGRpc2FibGVQbG90KSB7XG4gICAgICB0aGlzLnRyYW5zbGF0ZU9mZnNldFggKz0geCp0aGlzLnNjYWxlT2Zmc2V0WDtcbiAgICAgIHRoaXMudHJhbnNsYXRlT2Zmc2V0WSArPSB5KnRoaXMuc2NhbGVPZmZzZXRZO1xuICAgICAgZm9yKHZhciBpPTAsIGw9dGhpcy5jYW52YXNlcy5sZW5ndGg7IGk8bDsgaSsrKSB7XG4gICAgICAgIHRoaXMuY2FudmFzZXNbaV0udHJhbnNsYXRlKHgsIHksIGRpc2FibGVQbG90KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qXG4gICAgICBNZXRob2Q6IHNjYWxlXG4gICAgICBcbiAgICAgIFNjYWxlcyB0aGUgY2FudmFzLlxuICAgICAgXG4gICAgICBQYXJhbWV0ZXJzOlxuICAgICAgXG4gICAgICB4IC0gKG51bWJlcikgc2NhbGUgdmFsdWUuXG4gICAgICB5IC0gKG51bWJlcikgc2NhbGUgdmFsdWUuXG4gICAgICBkaXNhYmxlUGxvdCAtIChib29sZWFuKSBEZWZhdWx0J3MgKmZhbHNlKi4gU2V0IHRoaXMgdG8gKnRydWUqIGlmIHlvdSBkb24ndCB3YW50IHRvIHJlZnJlc2ggdGhlIHZpc3VhbGl6YXRpb24uXG4gICAgICBcbiAgICAgIEV4YW1wbGU6XG4gICAgICBcbiAgICAgIChzdGFydCBjb2RlIGpzKVxuICAgICAgIGNhbnZhcy5zY2FsZSgwLjUsIDAuNSk7XG4gICAgICAoZW5kIGNvZGUpXG4gICAgXG4gICAgKi9cbiAgICBzY2FsZTogZnVuY3Rpb24oeCwgeSwgZGlzYWJsZVBsb3QpIHtcbiAgICAgIHZhciBweCA9IHRoaXMuc2NhbGVPZmZzZXRYICogeCxcbiAgICAgICAgICBweSA9IHRoaXMuc2NhbGVPZmZzZXRZICogeTtcbiAgICAgIHZhciBkeCA9IHRoaXMudHJhbnNsYXRlT2Zmc2V0WCAqICh4IC0xKSAvIHB4LFxuICAgICAgICAgIGR5ID0gdGhpcy50cmFuc2xhdGVPZmZzZXRZICogKHkgLTEpIC8gcHk7XG4gICAgICB0aGlzLnNjYWxlT2Zmc2V0WCA9IHB4O1xuICAgICAgdGhpcy5zY2FsZU9mZnNldFkgPSBweTtcbiAgICAgIGZvcih2YXIgaT0wLCBsPXRoaXMuY2FudmFzZXMubGVuZ3RoOyBpPGw7IGkrKykge1xuICAgICAgICB0aGlzLmNhbnZhc2VzW2ldLnNjYWxlKHgsIHksIHRydWUpO1xuICAgICAgfVxuICAgICAgdGhpcy50cmFuc2xhdGUoZHgsIGR5LCBmYWxzZSk7XG4gICAgfSxcbiAgICAvKlxuICAgICAgTWV0aG9kOiBnZXRQb3NcbiAgICAgIFxuICAgICAgUmV0dXJucyB0aGUgY2FudmFzIHBvc2l0aW9uIGFzIGFuICp4LCB5KiBvYmplY3QuXG4gICAgICBcbiAgICAgIFBhcmFtZXRlcnM6XG4gICAgICBcbiAgICAgIGZvcmNlIC0gKGJvb2xlYW4pIERlZmF1bHQncyAqZmFsc2UqLiBTZXQgdGhpcyB0byAqdHJ1ZSogaWYgeW91IHdhbnQgdG8gcmVjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIHdpdGhvdXQgdXNpbmcgYW55IGNhY2hlIGluZm9ybWF0aW9uLlxuICAgICAgXG4gICAgICBSZXR1cm5zOlxuICAgICAgXG4gICAgICBBbiBvYmplY3Qgd2l0aCAqeCogYW5kICp5KiBwcm9wZXJ0aWVzLlxuICAgICAgXG4gICAgICBFeGFtcGxlOlxuICAgICAgKHN0YXJ0IGNvZGUganMpXG4gICAgICBjYW52YXMuZ2V0UG9zKHRydWUpOyAvL3JldHVybnMgeyB4OiA5MDAsIHk6IDUwMCB9XG4gICAgICAoZW5kIGNvZGUpXG4gICAgKi9cbiAgICBnZXRQb3M6IGZ1bmN0aW9uKGZvcmNlKXtcbiAgICAgIGlmKGZvcmNlIHx8ICF0aGlzLnBvcykge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3MgPSAkLmdldFBvcyh0aGlzLmdldEVsZW1lbnQoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5wb3M7XG4gICAgfSxcbiAgICAvKlxuICAgICAgIE1ldGhvZDogY2xlYXJcbiAgICAgICBcbiAgICAgICBDbGVhcnMgdGhlIGNhbnZhcy5cbiAgICAqL1xuICAgIGNsZWFyOiBmdW5jdGlvbihpKXtcbiAgICAgIHRoaXMuY2FudmFzZXNbaXx8MF0uY2xlYXIoKTtcbiAgICB9LFxuICAgIFxuICAgIHBhdGg6IGZ1bmN0aW9uKHR5cGUsIGFjdGlvbil7XG4gICAgICB2YXIgY3R4ID0gdGhpcy5jYW52YXNlc1swXS5nZXRDdHgoKTtcbiAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgIGFjdGlvbihjdHgpO1xuICAgICAgY3R4W3R5cGVdKCk7XG4gICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgfSxcbiAgICBcbiAgICBjcmVhdGVMYWJlbENvbnRhaW5lcjogZnVuY3Rpb24odHlwZSwgaWRMYWJlbCwgZGltKSB7XG4gICAgICB2YXIgTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xuICAgICAgaWYodHlwZSA9PSAnSFRNTCcgfHwgdHlwZSA9PSAnTmF0aXZlJykge1xuICAgICAgICByZXR1cm4gJEUoJ2RpdicsIHtcbiAgICAgICAgICAnaWQnOiBpZExhYmVsLFxuICAgICAgICAgICdzdHlsZSc6IHtcbiAgICAgICAgICAgICdvdmVyZmxvdyc6ICd2aXNpYmxlJyxcbiAgICAgICAgICAgICdwb3NpdGlvbic6ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAndG9wJzogMCxcbiAgICAgICAgICAgICdsZWZ0JzogMCxcbiAgICAgICAgICAgICd3aWR0aCc6IGRpbS53aWR0aCArICdweCcsXG4gICAgICAgICAgICAnaGVpZ2h0JzogMFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYodHlwZSA9PSAnU1ZHJykge1xuICAgICAgICB2YXIgc3ZnQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKE5TLCAnc3ZnOnN2ZycpO1xuICAgICAgICBzdmdDb250YWluZXIuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgZGltLndpZHRoKTtcbiAgICAgICAgc3ZnQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgZGltLmhlaWdodCk7XG4gICAgICAgIHZhciBzdHlsZSA9IHN2Z0NvbnRhaW5lci5zdHlsZTtcbiAgICAgICAgc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICBzdHlsZS5sZWZ0ID0gc3R5bGUudG9wID0gJzBweCc7XG4gICAgICAgIHZhciBsYWJlbENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhOUywgJ3N2ZzpnJyk7XG4gICAgICAgIGxhYmVsQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBkaW0ud2lkdGgpO1xuICAgICAgICBsYWJlbENvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGRpbS5oZWlnaHQpO1xuICAgICAgICBsYWJlbENvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ3gnLCAwKTtcbiAgICAgICAgbGFiZWxDb250YWluZXIuc2V0QXR0cmlidXRlKCd5JywgMCk7XG4gICAgICAgIGxhYmVsQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnaWQnLCBpZExhYmVsKTtcbiAgICAgICAgc3ZnQ29udGFpbmVyLmFwcGVuZENoaWxkKGxhYmVsQ29udGFpbmVyKTtcbiAgICAgICAgcmV0dXJuIHN2Z0NvbnRhaW5lcjtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICAvL2Jhc2UgY2FudmFzIHdyYXBwZXJcbiAgQ2FudmFzLkJhc2UgPSB7fTtcbiAgQ2FudmFzLkJhc2VbJzJEJ10gPSBuZXcgQ2xhc3Moe1xuICAgIHRyYW5zbGF0ZU9mZnNldFg6IDAsXG4gICAgdHJhbnNsYXRlT2Zmc2V0WTogMCxcbiAgICBzY2FsZU9mZnNldFg6IDEsXG4gICAgc2NhbGVPZmZzZXRZOiAxLFxuXG4gICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24odml6KSB7XG4gICAgICB0aGlzLnZpeiA9IHZpejtcbiAgICAgIHRoaXMub3B0ID0gdml6LmNvbmZpZztcbiAgICAgIHRoaXMuc2l6ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5jcmVhdGVDYW52YXMoKTtcbiAgICAgIHRoaXMudHJhbnNsYXRlVG9DZW50ZXIoKTtcbiAgICB9LFxuICAgIGNyZWF0ZUNhbnZhczogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgb3B0ID0gdGhpcy5vcHQsXG4gICAgICAgICAgd2lkdGggPSBvcHQud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gb3B0LmhlaWdodDtcbiAgICAgIHRoaXMuY2FudmFzID0gJEUoJ2NhbnZhcycsIHtcbiAgICAgICAgJ2lkJzogb3B0LmluamVjdEludG8gKyBvcHQuaWRTdWZmaXgsXG4gICAgICAgICd3aWR0aCc6IHdpZHRoLFxuICAgICAgICAnaGVpZ2h0JzogaGVpZ2h0LFxuICAgICAgICAnc3R5bGUnOiB7XG4gICAgICAgICAgJ3Bvc2l0aW9uJzogJ2Fic29sdXRlJyxcbiAgICAgICAgICAndG9wJzogMCxcbiAgICAgICAgICAnbGVmdCc6IDAsXG4gICAgICAgICAgJ3dpZHRoJzogd2lkdGggKyAncHgnLFxuICAgICAgICAgICdoZWlnaHQnOiBoZWlnaHQgKyAncHgnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgZ2V0Q3R4OiBmdW5jdGlvbigpIHtcbiAgICAgIGlmKCF0aGlzLmN0eCkgXG4gICAgICAgIHJldHVybiB0aGlzLmN0eCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICByZXR1cm4gdGhpcy5jdHg7XG4gICAgfSxcbiAgICBnZXRTaXplOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmKHRoaXMuc2l6ZSkgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgICAgIHZhciBjYW52YXMgPSB0aGlzLmNhbnZhcztcbiAgICAgIHJldHVybiB0aGlzLnNpemUgPSB7XG4gICAgICAgIHdpZHRoOiBjYW52YXMud2lkdGgsXG4gICAgICAgIGhlaWdodDogY2FudmFzLmhlaWdodFxuICAgICAgfTtcbiAgICB9LFxuICAgIHRyYW5zbGF0ZVRvQ2VudGVyOiBmdW5jdGlvbihwcykge1xuICAgICAgLy8gU1RBUlQgTUVUQU1BUFMgQ09ERVxuICAgICAgdmFyIHNpemUgPSB0aGlzLmdldFNpemUoKTtcbiAgICAgIHZhciB3aWR0aCA9IHBzID8gKHNpemUud2lkdGggLSBwcy53aWR0aCAtIHRoaXMudHJhbnNsYXRlT2Zmc2V0WCoyKSA6IHNpemUud2lkdGg7XG4gICAgICB2YXIgaGVpZ2h0ID0gcHMgPyAoc2l6ZS5oZWlnaHQgLSBwcy5oZWlnaHQgLSB0aGlzLnRyYW5zbGF0ZU9mZnNldFkqMikgOiBzaXplLmhlaWdodDtcbiAgICAgIC8vIE9SSUdJTkFMIENPREVcbiAgICAgIC8vIHZhciBzaXplID0gdGhpcy5nZXRTaXplKCksXG4gICAgICAvLyAgICAgd2lkdGggPSBwcz8gKHNpemUud2lkdGggLSBwcy53aWR0aCAtIHRoaXMudHJhbnNsYXRlT2Zmc2V0WCoyKSA6IHNpemUud2lkdGg7XG4gICAgICAvLyAgICAgaGVpZ2h0ID0gcHM/IChzaXplLmhlaWdodCAtIHBzLmhlaWdodCAtIHRoaXMudHJhbnNsYXRlT2Zmc2V0WSoyKSA6IHNpemUuaGVpZ2h0O1xuICAgICAgLy8gRU5EIE1FVEFNQVBTIENPREVcbiAgICAgIHZhciBjdHggPSB0aGlzLmdldEN0eCgpO1xuICAgICAgcHMgJiYgY3R4LnNjYWxlKDEvdGhpcy5zY2FsZU9mZnNldFgsIDEvdGhpcy5zY2FsZU9mZnNldFkpO1xuICAgICAgY3R4LnRyYW5zbGF0ZSh3aWR0aC8yLCBoZWlnaHQvMik7XG4gICAgfSxcbiAgICByZXNpemU6IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHZhciBzaXplID0gdGhpcy5nZXRTaXplKCksXG4gICAgICAgICAgY2FudmFzID0gdGhpcy5jYW52YXMsXG4gICAgICAgICAgc3R5bGVzID0gY2FudmFzLnN0eWxlO1xuICAgICAgdGhpcy5zaXplID0gZmFsc2U7XG4gICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICBzdHlsZXMud2lkdGggPSB3aWR0aCArIFwicHhcIjtcbiAgICAgIHN0eWxlcy5oZWlnaHQgPSBoZWlnaHQgKyBcInB4XCI7XG5cbiAgICAgIC8vc21hbGwgRXhDYW52YXMgZml4XG4gICAgICBpZighc3VwcG9ydHNDYW52YXMpIHtcbiAgICAgICAgdGhpcy50cmFuc2xhdGVUb0NlbnRlcihzaXplKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlVG9DZW50ZXIoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudHJhbnNsYXRlT2Zmc2V0WCA9XG4gICAgICAgIHRoaXMudHJhbnNsYXRlT2Zmc2V0WSA9IDA7XG4gICAgICB0aGlzLnNjYWxlT2Zmc2V0WCA9IFxuICAgICAgICB0aGlzLnNjYWxlT2Zmc2V0WSA9IDE7XG5cbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHRoaXMudml6LnJlc2l6ZSh3aWR0aCwgaGVpZ2h0LCB0aGlzKTtcbiAgICB9LFxuICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24oeCwgeSwgZGlzYWJsZVBsb3QpIHtcbiAgICAgIHZhciBzeCA9IHRoaXMuc2NhbGVPZmZzZXRYLFxuICAgICAgICAgIHN5ID0gdGhpcy5zY2FsZU9mZnNldFk7XG4gICAgICB0aGlzLnRyYW5zbGF0ZU9mZnNldFggKz0geCpzeDtcbiAgICAgIHRoaXMudHJhbnNsYXRlT2Zmc2V0WSArPSB5KnN5O1xuICAgICAgdGhpcy5nZXRDdHgoKS50cmFuc2xhdGUoeCwgeSk7XG4gICAgICAhZGlzYWJsZVBsb3QgJiYgdGhpcy5wbG90KCk7XG4gICAgfSxcbiAgICBzY2FsZTogZnVuY3Rpb24oeCwgeSwgZGlzYWJsZVBsb3QpIHtcbiAgICAgIHRoaXMuc2NhbGVPZmZzZXRYICo9IHg7XG4gICAgICB0aGlzLnNjYWxlT2Zmc2V0WSAqPSB5O1xuICAgICAgdGhpcy5nZXRDdHgoKS5zY2FsZSh4LCB5KTtcbiAgICAgICFkaXNhYmxlUGxvdCAmJiB0aGlzLnBsb3QoKTtcbiAgICB9LFxuICAgIGNsZWFyOiBmdW5jdGlvbigpe1xuICAgICAgdmFyIHNpemUgPSB0aGlzLmdldFNpemUoKSxcbiAgICAgICAgICBveCA9IHRoaXMudHJhbnNsYXRlT2Zmc2V0WCxcbiAgICAgICAgICBveSA9IHRoaXMudHJhbnNsYXRlT2Zmc2V0WSxcbiAgICAgICAgICBzeCA9IHRoaXMuc2NhbGVPZmZzZXRYLFxuICAgICAgICAgIHN5ID0gdGhpcy5zY2FsZU9mZnNldFk7XG4gICAgICB0aGlzLmdldEN0eCgpLmNsZWFyUmVjdCgoLXNpemUud2lkdGggLyAyIC0gb3gpICogMS9zeCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLXNpemUuaGVpZ2h0IC8gMiAtIG95KSAqIDEvc3ksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS53aWR0aCAqIDEvc3gsIHNpemUuaGVpZ2h0ICogMS9zeSk7XG4gICAgfSxcbiAgICBwbG90OiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHRoaXMudml6LnBsb3QodGhpcyk7XG4gICAgfVxuICB9KTtcbiAgLy9iYWNrZ3JvdW5kIGNhbnZhc2VzXG4gIC8vVE9ETyhuaWNvKTogZG9jdW1lbnQgdGhpcyFcbiAgQ2FudmFzLkJhY2tncm91bmQgPSB7fTtcbiAgQ2FudmFzLkJhY2tncm91bmQuQ2lyY2xlcyA9IG5ldyBDbGFzcyh7XG4gICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24odml6LCBvcHRpb25zKSB7XG4gICAgICB0aGlzLnZpeiA9IHZpejtcbiAgICAgIHRoaXMuY29uZmlnID0gJC5tZXJnZSh7XG4gICAgICAgIGlkU3VmZml4OiAnLWJrY2FudmFzJyxcbiAgICAgICAgbGV2ZWxEaXN0YW5jZTogMTAwLFxuICAgICAgICBudW1iZXJPZkNpcmNsZXM6IDYsXG4gICAgICAgIENhbnZhc1N0eWxlczoge30sXG4gICAgICAgIG9mZnNldDogMFxuICAgICAgfSwgb3B0aW9ucyk7XG4gICAgfSxcbiAgICByZXNpemU6IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQsIGJhc2UpIHtcbiAgICAgIHRoaXMucGxvdChiYXNlKTtcbiAgICB9LFxuICAgIHBsb3Q6IGZ1bmN0aW9uKGJhc2UpIHtcbiAgICAgIHZhciBjYW52YXMgPSBiYXNlLmNhbnZhcyxcbiAgICAgICAgICBjdHggPSBiYXNlLmdldEN0eCgpLFxuICAgICAgICAgIGNvbmYgPSB0aGlzLmNvbmZpZyxcbiAgICAgICAgICBzdHlsZXMgPSBjb25mLkNhbnZhc1N0eWxlcztcbiAgICAgIC8vc2V0IGNhbnZhcyBzdHlsZXNcbiAgICAgIGZvcih2YXIgcyBpbiBzdHlsZXMpIGN0eFtzXSA9IHN0eWxlc1tzXTtcbiAgICAgIHZhciBuID0gY29uZi5udW1iZXJPZkNpcmNsZXMsXG4gICAgICAgICAgcmhvID0gY29uZi5sZXZlbERpc3RhbmNlO1xuICAgICAgZm9yKHZhciBpPTE7IGk8PW47IGkrKykge1xuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGN0eC5hcmMoMCwgMCwgcmhvICogaSwgMCwgMiAqIE1hdGguUEksIGZhbHNlKTtcbiAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgICB9XG4gICAgICAvL1RPRE8obmljbyk6IHByaW50IGxhYmVscyB0b28hXG4gICAgfVxuICB9KTtcbiAgXG4gIC8vIFNUQVJUIE1FVEFNQVBTIENPREVcbiAgQ2FudmFzLkJhY2tncm91bmQuTWV0YW1hcHMgPSBuZXcgQ2xhc3Moe1xuICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKHZpeiwgb3B0aW9ucykge1xuICAgICAgdGhpcy52aXogPSB2aXo7XG4gICAgICB0aGlzLmNvbmZpZyA9IG9wdGlvbnM7XG4gICAgfSxcbiAgICByZXNpemU6IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQsIGJhc2UpIHtcbiAgICAgIHRoaXMucGxvdChiYXNlKTtcbiAgICB9LFxuICAgIHBsb3Q6IGZ1bmN0aW9uKGJhc2UpIHtcbiAgICAgIHZhciBjYW52YXMgPSBiYXNlLmNhbnZhcyxcbiAgICAgICAgICBjdHggPSBiYXNlLmdldEN0eCgpLFxuICAgICAgICAgIHNjYWxlID0gYmFzZS5zY2FsZU9mZnNldFg7XG4gICAgICAvL3ZhciBwYXR0ZXJuID0gbmV3IEltYWdlKCk7XG4gICAgICAvL3BhdHRlcm4uc3JjID0gTWV0YW1hcHMuU2VydmVyRGF0YVsnY3ViZXMucG5nJ11cbiAgICAgIC8vdmFyIHB0cm4gPSBjdHguY3JlYXRlUGF0dGVybihwYXR0ZXJuLCAncmVwZWF0Jyk7XG4gICAgICAvL2N0eC5maWxsU3R5bGUgPSBwdHJuO1xuICAgICAgY3R4LmZpbGxTdHlsZSA9IE1ldGFtYXBzLlNldHRpbmdzLmNvbG9ycy5iYWNrZ3JvdW5kO1xuICAgICAgdmFyIHhQb2ludCA9ICgtKGNhbnZhcy53aWR0aC9zY2FsZSkvMikgLSAoYmFzZS50cmFuc2xhdGVPZmZzZXRYL3NjYWxlKSxcbiAgICAgICAgeVBvaW50ID0gKC0oY2FudmFzLmhlaWdodC9zY2FsZSkvMikgLSAoYmFzZS50cmFuc2xhdGVPZmZzZXRZL3NjYWxlKTtcbiAgICAgIC8vY3R4LmZpbGxSZWN0KHhQb2ludCx5UG9pbnQsY2FudmFzLndpZHRoL3NjYWxlLGNhbnZhcy5oZWlnaHQvc2NhbGUpO1xuICAgIH1cbiAgfSk7XG4gIC8vIEVORCBNRVRBTUFQUyBDT0RFXG59KSgpO1xuXG5cbi8qXG4gKiBGaWxlOiBQb2xhci5qc1xuICogXG4gKiBEZWZpbmVzIHRoZSA8UG9sYXI+IGNsYXNzLlxuICpcbiAqIERlc2NyaXB0aW9uOlxuICpcbiAqIFRoZSA8UG9sYXI+IGNsYXNzLCBqdXN0IGxpa2UgdGhlIDxDb21wbGV4PiBjbGFzcywgaXMgdXNlZCBieSB0aGUgPEh5cGVydHJlZT4sIDxTVD4gYW5kIDxSR3JhcGg+IGFzIGEgMkQgcG9pbnQgcmVwcmVzZW50YXRpb24uXG4gKlxuICogU2VlIGFsc286XG4gKlxuICogPGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUG9sYXJfY29vcmRpbmF0ZXM+XG4gKlxuKi9cblxuLypcbiAgIENsYXNzOiBQb2xhclxuXG4gICBBIG11bHRpIHB1cnBvc2UgcG9sYXIgcmVwcmVzZW50YXRpb24uXG5cbiAgIERlc2NyaXB0aW9uOlxuIFxuICAgVGhlIDxQb2xhcj4gY2xhc3MsIGp1c3QgbGlrZSB0aGUgPENvbXBsZXg+IGNsYXNzLCBpcyB1c2VkIGJ5IHRoZSA8SHlwZXJ0cmVlPiwgPFNUPiBhbmQgPFJHcmFwaD4gYXMgYSAyRCBwb2ludCByZXByZXNlbnRhdGlvbi5cbiBcbiAgIFNlZSBhbHNvOlxuIFxuICAgPGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUG9sYXJfY29vcmRpbmF0ZXM+XG4gXG4gICBQYXJhbWV0ZXJzOlxuXG4gICAgICB0aGV0YSAtIEFuIGFuZ2xlLlxuICAgICAgcmhvIC0gVGhlIG5vcm0uXG4qL1xuXG52YXIgUG9sYXIgPSBmdW5jdGlvbih0aGV0YSwgcmhvKSB7XG4gIHRoaXMudGhldGEgPSB0aGV0YSB8fCAwO1xuICB0aGlzLnJobyA9IHJobyB8fCAwO1xufTtcblxuJGppdC5Qb2xhciA9IFBvbGFyO1xuXG5Qb2xhci5wcm90b3R5cGUgPSB7XG4gICAgLypcbiAgICAgICBNZXRob2Q6IGdldGNcbiAgICBcbiAgICAgICBSZXR1cm5zIGEgY29tcGxleCBudW1iZXIuXG4gICAgXG4gICAgICAgUGFyYW1ldGVyczpcblxuICAgICAgIHNpbXBsZSAtIF9vcHRpb25hbF8gSWYgKnRydWUqLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBvbmx5IGFuIG9iamVjdCBob2xkaW5nIHggYW5kIHkgcHJvcGVydGllcyBhbmQgbm90IGEgPENvbXBsZXg+IGluc3RhbmNlLiBEZWZhdWx0J3MgKmZhbHNlKi5cblxuICAgICAgUmV0dXJuczpcbiAgICBcbiAgICAgICAgICBBIGNvbXBsZXggbnVtYmVyLlxuICAgICovXG4gICAgZ2V0YzogZnVuY3Rpb24oc2ltcGxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvQ29tcGxleChzaW1wbGUpO1xuICAgIH0sXG5cbiAgICAvKlxuICAgICAgIE1ldGhvZDogZ2V0cFxuICAgIFxuICAgICAgIFJldHVybnMgYSA8UG9sYXI+IHJlcHJlc2VudGF0aW9uLlxuICAgIFxuICAgICAgIFJldHVybnM6XG4gICAgXG4gICAgICAgICAgQSB2YXJpYWJsZSBpbiBwb2xhciBjb29yZGluYXRlcy5cbiAgICAqL1xuICAgIGdldHA6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG5cbiAgICAvKlxuICAgICAgIE1ldGhvZDogc2V0XG4gICAgXG4gICAgICAgU2V0cyBhIG51bWJlci5cblxuICAgICAgIFBhcmFtZXRlcnM6XG5cbiAgICAgICB2IC0gQSA8Q29tcGxleD4gb3IgPFBvbGFyPiBpbnN0YW5jZS5cbiAgICBcbiAgICAqL1xuICAgIHNldDogZnVuY3Rpb24odikge1xuICAgICAgICB2ID0gdi5nZXRwKCk7XG4gICAgICAgIHRoaXMudGhldGEgPSB2LnRoZXRhOyB0aGlzLnJobyA9IHYucmhvO1xuICAgIH0sXG5cbiAgICAvKlxuICAgICAgIE1ldGhvZDogc2V0Y1xuICAgIFxuICAgICAgIFNldHMgYSA8Q29tcGxleD4gbnVtYmVyLlxuXG4gICAgICAgUGFyYW1ldGVyczpcblxuICAgICAgIHggLSBBIDxDb21wbGV4PiBudW1iZXIgcmVhbCBwYXJ0LlxuICAgICAgIHkgLSBBIDxDb21wbGV4PiBudW1iZXIgaW1hZ2luYXJ5IHBhcnQuXG4gICAgXG4gICAgKi9cbiAgICBzZXRjOiBmdW5jdGlvbih4LCB5KSB7XG4gICAgICAgIHRoaXMucmhvID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xuICAgICAgICB0aGlzLnRoZXRhID0gTWF0aC5hdGFuMih5LCB4KTtcbiAgICAgICAgaWYodGhpcy50aGV0YSA8IDApIHRoaXMudGhldGEgKz0gTWF0aC5QSSAqIDI7XG4gICAgfSxcblxuICAgIC8qXG4gICAgICAgTWV0aG9kOiBzZXRwXG4gICAgXG4gICAgICAgU2V0cyBhIHBvbGFyIG51bWJlci5cblxuICAgICAgIFBhcmFtZXRlcnM6XG5cbiAgICAgICB0aGV0YSAtIEEgPFBvbGFyPiBudW1iZXIgYW5nbGUgcHJvcGVydHkuXG4gICAgICAgcmhvIC0gQSA8UG9sYXI+IG51bWJlciByaG8gcHJvcGVydHkuXG4gICAgXG4gICAgKi9cbiAgICBzZXRwOiBmdW5jdGlvbih0aGV0YSwgcmhvKSB7XG4gICAgICAgIHRoaXMudGhldGEgPSB0aGV0YTsgXG4gICAgICAgIHRoaXMucmhvID0gcmhvO1xuICAgIH0sXG5cbiAgICAvKlxuICAgICAgIE1ldGhvZDogY2xvbmVcbiAgICBcbiAgICAgICBSZXR1cm5zIGEgY29weSBvZiB0aGUgY3VycmVudCBvYmplY3QuXG4gICAgXG4gICAgICAgUmV0dXJuczpcbiAgICBcbiAgICAgICAgICBBIGNvcHkgb2YgdGhlIHJlYWwgb2JqZWN0LlxuICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IFBvbGFyKHRoaXMudGhldGEsIHRoaXMucmhvKTtcbiAgICB9LFxuXG4gICAgLypcbiAgICAgICBNZXRob2Q6IHRvQ29tcGxleFxuICAgIFxuICAgICAgICBUcmFuc2xhdGVzIGZyb20gcG9sYXIgdG8gY2FydGVzaWFuIGNvb3JkaW5hdGVzIGFuZCByZXR1cm5zIGEgbmV3IDxDb21wbGV4PiBpbnN0YW5jZS5cbiAgICBcbiAgICAgICAgUGFyYW1ldGVyczpcblxuICAgICAgICBzaW1wbGUgLSBfb3B0aW9uYWxfIElmICp0cnVlKiB0aGlzIG1ldGhvZCB3aWxsIG9ubHkgcmV0dXJuIGFuIG9iamVjdCB3aXRoIHggYW5kIHkgcHJvcGVydGllcyAoYW5kIG5vdCB0aGUgd2hvbGUgPENvbXBsZXg+IGluc3RhbmNlKS4gRGVmYXVsdCdzICpmYWxzZSouXG4gXG4gICAgICAgIFJldHVybnM6XG4gICAgXG4gICAgICAgICAgQSBuZXcgPENvbXBsZXg+IGluc3RhbmNlLlxuICAgICovXG4gICAgdG9Db21wbGV4OiBmdW5jdGlvbihzaW1wbGUpIHtcbiAgICAgICAgdmFyIHggPSBNYXRoLmNvcyh0aGlzLnRoZXRhKSAqIHRoaXMucmhvO1xuICAgICAgICB2YXIgeSA9IE1hdGguc2luKHRoaXMudGhldGEpICogdGhpcy5yaG87XG4gICAgICAgIGlmKHNpbXBsZSkgcmV0dXJuIHsgJ3gnOiB4LCAneSc6IHl9O1xuICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgoeCwgeSk7XG4gICAgfSxcblxuICAgIC8qXG4gICAgICAgTWV0aG9kOiBhZGRcbiAgICBcbiAgICAgICAgQWRkcyB0d28gPFBvbGFyPiBpbnN0YW5jZXMuXG4gICAgXG4gICAgICAgUGFyYW1ldGVyczpcblxuICAgICAgIHBvbGFyIC0gQSA8UG9sYXI+IG51bWJlci5cblxuICAgICAgIFJldHVybnM6XG4gICAgXG4gICAgICAgICAgQSBuZXcgUG9sYXIgaW5zdGFuY2UuXG4gICAgKi9cbiAgICBhZGQ6IGZ1bmN0aW9uKHBvbGFyKSB7XG4gICAgICAgIHJldHVybiBuZXcgUG9sYXIodGhpcy50aGV0YSArIHBvbGFyLnRoZXRhLCB0aGlzLnJobyArIHBvbGFyLnJobyk7XG4gICAgfSxcbiAgICBcbiAgICAvKlxuICAgICAgIE1ldGhvZDogc2NhbGVcbiAgICBcbiAgICAgICAgU2NhbGVzIGEgcG9sYXIgbm9ybS5cbiAgICBcbiAgICAgICAgUGFyYW1ldGVyczpcblxuICAgICAgICBudW1iZXIgLSBBIHNjYWxlIGZhY3Rvci5cbiAgICAgICAgXG4gICAgICAgIFJldHVybnM6XG4gICAgXG4gICAgICAgICAgQSBuZXcgUG9sYXIgaW5zdGFuY2UuXG4gICAgKi9cbiAgICBzY2FsZTogZnVuY3Rpb24obnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgUG9sYXIodGhpcy50aGV0YSwgdGhpcy5yaG8gKiBudW1iZXIpO1xuICAgIH0sXG4gICAgXG4gICAgLypcbiAgICAgICBNZXRob2Q6IGVxdWFsc1xuICAgIFxuICAgICAgIENvbXBhcmlzb24gbWV0aG9kLlxuXG4gICAgICAgUmV0dXJucyAqdHJ1ZSogaWYgdGhlIHRoZXRhIGFuZCByaG8gcHJvcGVydGllcyBhcmUgZXF1YWwuXG5cbiAgICAgICBQYXJhbWV0ZXJzOlxuXG4gICAgICAgYyAtIEEgPFBvbGFyPiBudW1iZXIuXG5cbiAgICAgICBSZXR1cm5zOlxuXG4gICAgICAgKnRydWUqIGlmIHRoZSB0aGV0YSBhbmQgcmhvIHBhcmFtZXRlcnMgZm9yIHRoZXNlIG9iamVjdHMgYXJlIGVxdWFsLiAqZmFsc2UqIG90aGVyd2lzZS5cbiAgICAqL1xuICAgIGVxdWFsczogZnVuY3Rpb24oYykge1xuICAgICAgICByZXR1cm4gdGhpcy50aGV0YSA9PSBjLnRoZXRhICYmIHRoaXMucmhvID09IGMucmhvO1xuICAgIH0sXG4gICAgXG4gICAgLypcbiAgICAgICBNZXRob2Q6ICRhZGRcbiAgICBcbiAgICAgICAgQWRkcyB0d28gPFBvbGFyPiBpbnN0YW5jZXMgYWZmZWN0aW5nIHRoZSBjdXJyZW50IG9iamVjdC5cbiAgICBcbiAgICAgICBQYXJhbXRlcnM6XG5cbiAgICAgICBwb2xhciAtIEEgPFBvbGFyPiBpbnN0YW5jZS5cblxuICAgICAgIFJldHVybnM6XG4gICAgXG4gICAgICAgICAgVGhlIGNoYW5nZWQgb2JqZWN0LlxuICAgICovXG4gICAgJGFkZDogZnVuY3Rpb24ocG9sYXIpIHtcbiAgICAgICAgdGhpcy50aGV0YSA9IHRoaXMudGhldGEgKyBwb2xhci50aGV0YTsgdGhpcy5yaG8gKz0gcG9sYXIucmhvO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLypcbiAgICAgICBNZXRob2Q6ICRtYWRkXG4gICAgXG4gICAgICAgIEFkZHMgdHdvIDxQb2xhcj4gaW5zdGFuY2VzIGFmZmVjdGluZyB0aGUgY3VycmVudCBvYmplY3QuIFRoZSByZXN1bHRpbmcgdGhldGEgYW5nbGUgaXMgbW9kdWxvIDJwaS5cbiAgICBcbiAgICAgICBQYXJhbWV0ZXJzOlxuXG4gICAgICAgcG9sYXIgLSBBIDxQb2xhcj4gaW5zdGFuY2UuXG5cbiAgICAgICBSZXR1cm5zOlxuICAgIFxuICAgICAgICAgIFRoZSBjaGFuZ2VkIG9iamVjdC5cbiAgICAqL1xuICAgICRtYWRkOiBmdW5jdGlvbihwb2xhcikge1xuICAgICAgICB0aGlzLnRoZXRhID0gKHRoaXMudGhldGEgKyBwb2xhci50aGV0YSkgJSAoTWF0aC5QSSAqIDIpOyB0aGlzLnJobyArPSBwb2xhci5yaG87XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBcbiAgICAvKlxuICAgICAgIE1ldGhvZDogJHNjYWxlXG4gICAgXG4gICAgICAgIFNjYWxlcyBhIHBvbGFyIGluc3RhbmNlIGFmZmVjdGluZyB0aGUgb2JqZWN0LlxuICAgIFxuICAgICAgUGFyYW1ldGVyczpcblxuICAgICAgbnVtYmVyIC0gQSBzY2FsaW5nIGZhY3Rvci5cblxuICAgICAgUmV0dXJuczpcbiAgICBcbiAgICAgICAgICBUaGUgY2hhbmdlZCBvYmplY3QuXG4gICAgKi9cbiAgICAkc2NhbGU6IGZ1bmN0aW9uKG51bWJlcikge1xuICAgICAgICB0aGlzLnJobyAqPSBudW1iZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgXG4gICAgLypcbiAgICAgIE1ldGhvZDogaXNaZXJvXG4gICBcbiAgICAgIFJldHVybnMgKnRydWUqIGlmIHRoZSBudW1iZXIgaXMgemVyby5cbiAgIFxuICAgKi9cbiAgICBpc1plcm86IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBhbG1vc3RaZXJvID0gMC4wMDAxLCBhYnMgPSBNYXRoLmFicztcbiAgICAgIHJldHVybiBhYnModGhpcy50aGV0YSkgPCBhbG1vc3RaZXJvICYmIGFicyh0aGlzLnJobykgPCBhbG1vc3RaZXJvO1xuICAgIH0sXG5cbiAgICAvKlxuICAgICAgIE1ldGhvZDogaW50ZXJwb2xhdGVcbiAgICBcbiAgICAgICAgQ2FsY3VsYXRlcyBhIHBvbGFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcG9pbnRzIGF0IGEgZ2l2ZW4gZGVsdGEgbW9tZW50LlxuXG4gICAgICAgIFBhcmFtZXRlcnM6XG4gICAgICBcbiAgICAgICAgZWxlbSAtIEEgPFBvbGFyPiBpbnN0YW5jZS5cbiAgICAgICAgZGVsdGEgLSBBIGRlbHRhIGZhY3RvciByYW5naW5nIFswLCAxXS5cbiAgICBcbiAgICAgICBSZXR1cm5zOlxuICAgIFxuICAgICAgICAgIEEgbmV3IDxQb2xhcj4gaW5zdGFuY2UgcmVwcmVzZW50aW5nIGFuIGludGVycG9sYXRpb24gYmV0d2VlbiBfdGhpc18gYW5kIF9lbGVtX1xuICAgICovXG4gICAgaW50ZXJwb2xhdGU6IGZ1bmN0aW9uKGVsZW0sIGRlbHRhKSB7XG4gICAgICAgIHZhciBwaSA9IE1hdGguUEksIHBpMiA9IHBpICogMjtcbiAgICAgICAgdmFyIGNoID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgdmFyIGEgPSAgKHQgPCAwKT8gKHQgJSBwaTIpICsgcGkyIDogdCAlIHBpMjtcbiAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgdHQgPSB0aGlzLnRoZXRhLCBldCA9IGVsZW0udGhldGE7XG4gICAgICAgIHZhciBzdW0sIGRpZmYgPSBNYXRoLmFicyh0dCAtIGV0KTtcbiAgICAgICAgaWYoZGlmZiA9PSBwaSkge1xuICAgICAgICAgIGlmKHR0ID4gZXQpIHtcbiAgICAgICAgICAgIHN1bSA9IGNoKChldCArICgodHQgLSBwaTIpIC0gZXQpICogZGVsdGEpKSA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1bSA9IGNoKChldCAtIHBpMiArICh0dCAtIChldCkpICogZGVsdGEpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZihkaWZmID49IHBpKSB7XG4gICAgICAgICAgaWYodHQgPiBldCkge1xuICAgICAgICAgICAgc3VtID0gY2goKGV0ICsgKCh0dCAtIHBpMikgLSBldCkgKiBkZWx0YSkpIDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3VtID0gY2goKGV0IC0gcGkyICsgKHR0IC0gKGV0IC0gcGkyKSkgKiBkZWx0YSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHsgIFxuICAgICAgICAgIHN1bSA9IGNoKChldCArICh0dCAtIGV0KSAqIGRlbHRhKSkgO1xuICAgICAgICB9XG4gICAgICAgIHZhciByID0gKHRoaXMucmhvIC0gZWxlbS5yaG8pICogZGVsdGEgKyBlbGVtLnJobztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAndGhldGEnOiBzdW0sXG4gICAgICAgICAgJ3Jobyc6IHJcbiAgICAgICAgfTtcbiAgICB9XG59O1xuXG5cbnZhciAkUCA9IGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIG5ldyBQb2xhcihhLCBiKTsgfTtcblxuUG9sYXIuS0VSID0gJFAoMCwgMCk7XG5cblxuXG4vKlxuICogRmlsZTogQ29tcGxleC5qc1xuICogXG4gKiBEZWZpbmVzIHRoZSA8Q29tcGxleD4gY2xhc3MuXG4gKlxuICogRGVzY3JpcHRpb246XG4gKlxuICogVGhlIDxDb21wbGV4PiBjbGFzcywganVzdCBsaWtlIHRoZSA8UG9sYXI+IGNsYXNzLCBpcyB1c2VkIGJ5IHRoZSA8SHlwZXJ0cmVlPiwgPFNUPiBhbmQgPFJHcmFwaD4gYXMgYSAyRCBwb2ludCByZXByZXNlbnRhdGlvbi5cbiAqXG4gKiBTZWUgYWxzbzpcbiAqXG4gKiA8aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21wbGV4X251bWJlcj5cbiAqXG4qL1xuXG4vKlxuICAgQ2xhc3M6IENvbXBsZXhcbiAgICBcbiAgIEEgbXVsdGktcHVycG9zZSBDb21wbGV4IENsYXNzIHdpdGggY29tbW9uIG1ldGhvZHMuXG4gXG4gICBEZXNjcmlwdGlvbjpcbiBcbiAgIFRoZSA8Q29tcGxleD4gY2xhc3MsIGp1c3QgbGlrZSB0aGUgPFBvbGFyPiBjbGFzcywgaXMgdXNlZCBieSB0aGUgPEh5cGVydHJlZT4sIDxTVD4gYW5kIDxSR3JhcGg+IGFzIGEgMkQgcG9pbnQgcmVwcmVzZW50YXRpb24uXG4gXG4gICBTZWUgYWxzbzpcbiBcbiAgIDxodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbXBsZXhfbnVtYmVyPlxuXG4gICBQYXJhbWV0ZXJzOlxuXG4gICB4IC0gX29wdGlvbmFsXyBBIENvbXBsZXggbnVtYmVyIHJlYWwgcGFydC5cbiAgIHkgLSBfb3B0aW9uYWxfIEEgQ29tcGxleCBudW1iZXIgaW1hZ2luYXJ5IHBhcnQuXG4gXG4qL1xuXG52YXIgQ29tcGxleCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgdGhpcy54ID0geCB8fCAwO1xuICB0aGlzLnkgPSB5IHx8IDA7XG59O1xuXG4kaml0LkNvbXBsZXggPSBDb21wbGV4O1xuXG5Db21wbGV4LnByb3RvdHlwZSA9IHtcbiAgICAvKlxuICAgICAgIE1ldGhvZDogZ2V0Y1xuICAgIFxuICAgICAgIFJldHVybnMgYSBjb21wbGV4IG51bWJlci5cbiAgICBcbiAgICAgICBSZXR1cm5zOlxuICAgIFxuICAgICAgICAgIEEgY29tcGxleCBudW1iZXIuXG4gICAgKi9cbiAgICBnZXRjOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qXG4gICAgICAgTWV0aG9kOiBnZXRwXG4gICAgXG4gICAgICAgUmV0dXJucyBhIDxQb2xhcj4gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBudW1iZXIuXG4gICAgXG4gICAgICAgUGFyYW1ldGVyczpcblxuICAgICAgIHNpbXBsZSAtIF9vcHRpb25hbF8gSWYgKnRydWUqLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBvbmx5IGFuIG9iamVjdCBob2xkaW5nIHRoZXRhIGFuZCByaG8gcHJvcGVydGllcyBhbmQgbm90IGEgPFBvbGFyPiBpbnN0YW5jZS4gRGVmYXVsdCdzICpmYWxzZSouXG5cbiAgICAgICBSZXR1cm5zOlxuICAgIFxuICAgICAgICAgIEEgdmFyaWFibGUgaW4gPFBvbGFyPiBjb29yZGluYXRlcy5cbiAgICAqL1xuICAgIGdldHA6IGZ1bmN0aW9uKHNpbXBsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy50b1BvbGFyKHNpbXBsZSk7XG4gICAgfSxcblxuXG4gICAgLypcbiAgICAgICBNZXRob2Q6IHNldFxuICAgIFxuICAgICAgIFNldHMgYSBudW1iZXIuXG5cbiAgICAgICBQYXJhbWV0ZXJzOlxuXG4gICAgICAgYyAtIEEgPENvbXBsZXg+IG9yIDxQb2xhcj4gaW5zdGFuY2UuXG4gICAgXG4gICAgKi9cbiAgICBzZXQ6IGZ1bmN0aW9uKGMpIHtcbiAgICAgIGMgPSBjLmdldGModHJ1ZSk7XG4gICAgICB0aGlzLnggPSBjLng7IFxuICAgICAgdGhpcy55ID0gYy55O1xuICAgIH0sXG5cbiAgICAvKlxuICAgICAgIE1ldGhvZDogc2V0Y1xuICAgIFxuICAgICAgIFNldHMgYSBjb21wbGV4IG51bWJlci5cblxuICAgICAgIFBhcmFtZXRlcnM6XG5cbiAgICAgICB4IC0gQSA8Q29tcGxleD4gbnVtYmVyIFJlYWwgcGFydC5cbiAgICAgICB5IC0gQSA8Q29tcGxleD4gbnVtYmVyIEltYWdpbmFyeSBwYXJ0LlxuICAgIFxuICAgICovXG4gICAgc2V0YzogZnVuY3Rpb24oeCwgeSkge1xuICAgICAgICB0aGlzLnggPSB4OyBcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICB9LFxuXG4gICAgLypcbiAgICAgICBNZXRob2Q6IHNldHBcbiAgICBcbiAgICAgICBTZXRzIGEgcG9sYXIgbnVtYmVyLlxuXG4gICAgICAgUGFyYW1ldGVyczpcblxuICAgICAgIHRoZXRhIC0gQSA8UG9sYXI+IG51bWJlciB0aGV0YSBwcm9wZXJ0eS5cbiAgICAgICByaG8gLSBBIDxQb2xhcj4gbnVtYmVyIHJobyBwcm9wZXJ0eS5cbiAgICBcbiAgICAqL1xuICAgIHNldHA6IGZ1bmN0aW9uKHRoZXRhLCByaG8pIHtcbiAgICAgICAgdGhpcy54ID0gTWF0aC5jb3ModGhldGEpICogcmhvO1xuICAgICAgICB0aGlzLnkgPSBNYXRoLnNpbih0aGV0YSkgKiByaG87XG4gICAgfSxcblxuICAgIC8qXG4gICAgICAgTWV0aG9kOiBjbG9uZVxuICAgIFxuICAgICAgIFJldHVybnMgYSBjb3B5IG9mIHRoZSBjdXJyZW50IG9iamVjdC5cbiAgICBcbiAgICAgICBSZXR1cm5zOlxuICAgIFxuICAgICAgICAgIEEgY29weSBvZiB0aGUgcmVhbCBvYmplY3QuXG4gICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcGxleCh0aGlzLngsIHRoaXMueSk7XG4gICAgfSxcblxuICAgIC8qXG4gICAgICAgTWV0aG9kOiB0b1BvbGFyXG4gICAgXG4gICAgICAgVHJhbnNmb3JtcyBjYXJ0ZXNpYW4gdG8gcG9sYXIgY29vcmRpbmF0ZXMuXG4gICAgXG4gICAgICAgUGFyYW1ldGVyczpcblxuICAgICAgIHNpbXBsZSAtIF9vcHRpb25hbF8gSWYgKnRydWUqIHRoaXMgbWV0aG9kIHdpbGwgb25seSByZXR1cm4gYW4gb2JqZWN0IHdpdGggdGhldGEgYW5kIHJobyBwcm9wZXJ0aWVzIChhbmQgbm90IHRoZSB3aG9sZSA8UG9sYXI+IGluc3RhbmNlKS4gRGVmYXVsdCdzICpmYWxzZSouXG4gICAgICAgXG4gICAgICAgUmV0dXJuczpcbiAgICBcbiAgICAgICAgICBBIG5ldyA8UG9sYXI+IGluc3RhbmNlLlxuICAgICovXG4gICAgXG4gICAgdG9Qb2xhcjogZnVuY3Rpb24oc2ltcGxlKSB7XG4gICAgICAgIHZhciByaG8gPSB0aGlzLm5vcm0oKTtcbiAgICAgICAgdmFyIGF0YW4gPSBNYXRoLmF0YW4yKHRoaXMueSwgdGhpcy54KTtcbiAgICAgICAgaWYoYXRhbiA8IDApIGF0YW4gKz0gTWF0aC5QSSAqIDI7XG4gICAgICAgIGlmKHNpbXBsZSkgcmV0dXJuIHsgJ3RoZXRhJzogYXRhbiwgJ3Jobyc6IHJobyB9O1xuICAgICAgICByZXR1cm4gbmV3IFBvbGFyKGF0YW4sIHJobyk7XG4gICAgfSxcbiAgICAvKlxuICAgICAgIE1ldGhvZDogbm9ybVxuICAgIFxuICAgICAgIENhbGN1bGF0ZXMgYSA8Q29tcGxleD4gbnVtYmVyIG5vcm0uXG4gICAgXG4gICAgICAgUmV0dXJuczpcbiAgICBcbiAgICAgICAgICBBIHJlYWwgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgY29tcGxleCBub3JtLlxuICAgICovXG4gICAgbm9ybTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuc3F1YXJlZE5vcm0oKSk7XG4gICAgfSxcbiAgICBcbiAgICAvKlxuICAgICAgIE1ldGhvZDogc3F1YXJlZE5vcm1cbiAgICBcbiAgICAgICBDYWxjdWxhdGVzIGEgPENvbXBsZXg+IG51bWJlciBzcXVhcmVkIG5vcm0uXG4gICAgXG4gICAgICAgUmV0dXJuczpcbiAgICBcbiAgICAgICAgICBBIHJlYWwgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgY29tcGxleCBzcXVhcmVkIG5vcm0uXG4gICAgKi9cbiAgICBzcXVhcmVkTm9ybTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy54KnRoaXMueCArIHRoaXMueSp0aGlzLnk7XG4gICAgfSxcblxuICAgIC8qXG4gICAgICAgTWV0aG9kOiBhZGRcbiAgICBcbiAgICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYWRkaW5nIHR3byBjb21wbGV4IG51bWJlcnMuXG4gICAgICAgXG4gICAgICAgRG9lcyBub3QgYWx0ZXIgdGhlIG9yaWdpbmFsIG9iamVjdC5cblxuICAgICAgIFBhcmFtZXRlcnM6XG4gICAgXG4gICAgICAgICAgcG9zIC0gQSA8Q29tcGxleD4gaW5zdGFuY2UuXG4gICAgXG4gICAgICAgUmV0dXJuczpcbiAgICBcbiAgICAgICAgIFRoZSByZXN1bHQgb2YgYWRkaW5nIHR3byBjb21wbGV4IG51bWJlcnMuXG4gICAgKi9cbiAgICBhZGQ6IGZ1bmN0aW9uKHBvcykge1xuICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgodGhpcy54ICsgcG9zLngsIHRoaXMueSArIHBvcy55KTtcbiAgICB9LFxuXG4gICAgLypcbiAgICAgICBNZXRob2Q6IHByb2RcbiAgICBcbiAgICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgdHdvIDxDb21wbGV4PiBudW1iZXJzLlxuICAgICAgIFxuICAgICAgIERvZXMgbm90IGFsdGVyIHRoZSBvcmlnaW5hbCBvYmplY3QuXG5cbiAgICAgICBQYXJhbWV0ZXJzOlxuICAgIFxuICAgICAgICAgIHBvcyAtIEEgPENvbXBsZXg+IGluc3RhbmNlLlxuICAgIFxuICAgICAgIFJldHVybnM6XG4gICAgXG4gICAgICAgICBUaGUgcmVzdWx0IG9mIG11bHRpcGx5aW5nIHR3byBjb21wbGV4IG51bWJlcnMuXG4gICAgKi9cbiAgICBwcm9kOiBmdW5jdGlvbihwb3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4KHRoaXMueCpwb3MueCAtIHRoaXMueSpwb3MueSwgdGhpcy55KnBvcy54ICsgdGhpcy54KnBvcy55KTtcbiAgICB9LFxuXG4gICAgLypcbiAgICAgICBNZXRob2Q6IGNvbmp1Z2F0ZVxuICAgIFxuICAgICAgIFJldHVybnMgdGhlIGNvbmp1Z2F0ZSBvZiB0aGlzIDxDb21wbGV4PiBudW1iZXIuXG5cbiAgICAgICBEb2VzIG5vdCBhbHRlciB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuXG4gICAgICAgUmV0dXJuczpcbiAgICBcbiAgICAgICAgIFRoZSBjb25qdWdhdGUgb2YgdGhpcyA8Q29tcGxleD4gbnVtYmVyLlxuICAgICovXG4gICAgY29uanVnYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4KHRoaXMueCwgLXRoaXMueSk7XG4gICAgfSxcblxuXG4gICAgLypcbiAgICAgICBNZXRob2Q6IHNjYWxlXG4gICAgXG4gICAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNjYWxpbmcgYSA8Q29tcGxleD4gaW5zdGFuY2UuXG4gICAgICAgXG4gICAgICAgRG9lcyBub3QgYWx0ZXIgdGhlIG9yaWdpbmFsIG9iamVjdC5cblxuICAgICAgIFBhcmFtZXRlcnM6XG4gICAgXG4gICAgICAgICAgZmFjdG9yIC0gQSBzY2FsZSBmYWN0b3IuXG4gICAgXG4gICAgICAgUmV0dXJuczpcbiAgICBcbiAgICAgICAgIFRoZSByZXN1bHQgb2Ygc2NhbGluZyB0aGlzIGNvbXBsZXggdG8gYSBmYWN0b3IuXG4gICAgKi9cbiAgICBzY2FsZTogZnVuY3Rpb24oZmFjdG9yKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcGxleCh0aGlzLnggKiBmYWN0b3IsIHRoaXMueSAqIGZhY3Rvcik7XG4gICAgfSxcblxuICAgIC8qXG4gICAgICAgTWV0aG9kOiBlcXVhbHNcbiAgICBcbiAgICAgICBDb21wYXJpc29uIG1ldGhvZC5cblxuICAgICAgIFJldHVybnMgKnRydWUqIGlmIGJvdGggcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzIGFyZSBlcXVhbC5cblxuICAgICAgIFBhcmFtZXRlcnM6XG5cbiAgICAgICBjIC0gQSA8Q29tcGxleD4gaW5zdGFuY2UuXG5cbiAgICAgICBSZXR1cm5zOlxuXG4gICAgICAgQSBib29sZWFuIGluc3RhbmNlIGluZGljYXRpbmcgaWYgYm90aCA8Q29tcGxleD4gbnVtYmVycyBhcmUgZXF1YWwuXG4gICAgKi9cbiAgICBlcXVhbHM6IGZ1bmN0aW9uKGMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueCA9PSBjLnggJiYgdGhpcy55ID09IGMueTtcbiAgICB9LFxuXG4gICAgLypcbiAgICAgICBNZXRob2Q6ICRhZGRcbiAgICBcbiAgICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYWRkaW5nIHR3byA8Q29tcGxleD4gbnVtYmVycy5cbiAgICAgICBcbiAgICAgICBBbHRlcnMgdGhlIG9yaWdpbmFsIG9iamVjdC5cblxuICAgICAgIFBhcmFtZXRlcnM6XG4gICAgXG4gICAgICAgICAgcG9zIC0gQSA8Q29tcGxleD4gaW5zdGFuY2UuXG4gICAgXG4gICAgICAgUmV0dXJuczpcbiAgICBcbiAgICAgICAgIFRoZSByZXN1bHQgb2YgYWRkaW5nIHR3byBjb21wbGV4IG51bWJlcnMuXG4gICAgKi9cbiAgICAkYWRkOiBmdW5jdGlvbihwb3MpIHtcbiAgICAgICAgdGhpcy54ICs9IHBvcy54OyB0aGlzLnkgKz0gcG9zLnk7XG4gICAgICAgIHJldHVybiB0aGlzOyAgICBcbiAgICB9LFxuICAgIFxuICAgIC8qXG4gICAgICAgTWV0aG9kOiAkcHJvZFxuICAgIFxuICAgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBtdWx0aXBseWluZyB0d28gPENvbXBsZXg+IG51bWJlcnMuXG4gICAgICAgXG4gICAgICAgQWx0ZXJzIHRoZSBvcmlnaW5hbCBvYmplY3QuXG5cbiAgICAgICBQYXJhbWV0ZXJzOlxuICAgIFxuICAgICAgICAgIHBvcyAtIEEgPENvbXBsZXg+IGluc3RhbmNlLlxuICAgIFxuICAgICAgIFJldHVybnM6XG4gICAgXG4gICAgICAgICBUaGUgcmVzdWx0IG9mIG11bHRpcGx5aW5nIHR3byBjb21wbGV4IG51bWJlcnMuXG4gICAgKi9cbiAgICAkcHJvZDpmdW5jdGlvbihwb3MpIHtcbiAgICAgICAgdmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnk7XG4gICAgICAgIHRoaXMueCA9IHgqcG9zLnggLSB5KnBvcy55O1xuICAgICAgICB0aGlzLnkgPSB5KnBvcy54ICsgeCpwb3MueTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBcbiAgICAvKlxuICAgICAgIE1ldGhvZDogJGNvbmp1Z2F0ZVxuICAgIFxuICAgICAgIFJldHVybnMgdGhlIGNvbmp1Z2F0ZSBmb3IgdGhpcyA8Q29tcGxleD4uXG4gICAgICAgXG4gICAgICAgQWx0ZXJzIHRoZSBvcmlnaW5hbCBvYmplY3QuXG5cbiAgICAgICBSZXR1cm5zOlxuICAgIFxuICAgICAgICAgVGhlIGNvbmp1Z2F0ZSBmb3IgdGhpcyBjb21wbGV4LlxuICAgICovXG4gICAgJGNvbmp1Z2F0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMueSA9IC10aGlzLnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgXG4gICAgLypcbiAgICAgICBNZXRob2Q6ICRzY2FsZVxuICAgIFxuICAgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzY2FsaW5nIGEgPENvbXBsZXg+IGluc3RhbmNlLlxuICAgICAgIFxuICAgICAgIEFsdGVycyB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuXG4gICAgICAgUGFyYW1ldGVyczpcbiAgICBcbiAgICAgICAgICBmYWN0b3IgLSBBIHNjYWxlIGZhY3Rvci5cbiAgICBcbiAgICAgICBSZXR1cm5zOlxuICAgIFxuICAgICAgICAgVGhlIHJlc3VsdCBvZiBzY2FsaW5nIHRoaXMgY29tcGxleCB0byBhIGZhY3Rvci5cbiAgICAqL1xuICAgICRzY2FsZTogZnVuY3Rpb24oZmFjdG9yKSB7XG4gICAgICAgIHRoaXMueCAqPSBmYWN0b3I7IHRoaXMueSAqPSBmYWN0b3I7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgXG4gICAgLypcbiAgICAgICBNZXRob2Q6ICRkaXZcbiAgICBcbiAgICAgICBSZXR1cm5zIHRoZSBkaXZpc2lvbiBvZiB0d28gPENvbXBsZXg+IG51bWJlcnMuXG4gICAgICAgXG4gICAgICAgQWx0ZXJzIHRoZSBvcmlnaW5hbCBvYmplY3QuXG5cbiAgICAgICBQYXJhbWV0ZXJzOlxuICAgIFxuICAgICAgICAgIHBvcyAtIEEgPENvbXBsZXg+IG51bWJlci5cbiAgICBcbiAgICAgICBSZXR1cm5zOlxuICAgIFxuICAgICAgICAgVGhlIHJlc3VsdCBvZiBzY2FsaW5nIHRoaXMgY29tcGxleCB0byBhIGZhY3Rvci5cbiAgICAqL1xuICAgICRkaXY6IGZ1bmN0aW9uKHBvcykge1xuICAgICAgICB2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueTtcbiAgICAgICAgdmFyIHNxID0gcG9zLnNxdWFyZWROb3JtKCk7XG4gICAgICAgIHRoaXMueCA9IHggKiBwb3MueCArIHkgKiBwb3MueTsgdGhpcy55ID0geSAqIHBvcy54IC0geCAqIHBvcy55O1xuICAgICAgICByZXR1cm4gdGhpcy4kc2NhbGUoMSAvIHNxKTtcbiAgICB9LFxuXG4gICAgLypcbiAgICAgIE1ldGhvZDogaXNaZXJvXG4gICBcbiAgICAgIFJldHVybnMgKnRydWUqIGlmIHRoZSBudW1iZXIgaXMgemVyby5cbiAgIFxuICAgKi9cbiAgICBpc1plcm86IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBhbG1vc3RaZXJvID0gMC4wMDAxLCBhYnMgPSBNYXRoLmFicztcbiAgICAgIHJldHVybiBhYnModGhpcy54KSA8IGFsbW9zdFplcm8gJiYgYWJzKHRoaXMueSkgPCBhbG1vc3RaZXJvO1xuICAgIH1cbn07XG5cbnZhciAkQyA9IGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIG5ldyBDb21wbGV4KGEsIGIpOyB9O1xuXG5Db21wbGV4LktFUiA9ICRDKDAsIDApO1xuXG5cblxuLypcbiAqIEZpbGU6IEdyYXBoLmpzXG4gKlxuKi9cblxuLypcbiBDbGFzczogR3JhcGhcblxuIEEgR3JhcGggQ2xhc3MgdGhhdCBwcm92aWRlcyB1c2VmdWwgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucy4gWW91IGNhbiBmaW5kIG1vcmUgbWFuaXB1bGF0aW9uIG1ldGhvZHMgaW4gdGhlIDxHcmFwaC5VdGlsPiBvYmplY3QuXG5cbiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGNhbiBiZSBhY2Nlc3NlZCBieSB1c2luZyB0aGUgKmdyYXBoKiBwYXJhbWV0ZXIgb2YgYW55IHRyZWUgb3IgZ3JhcGggdmlzdWFsaXphdGlvbi5cbiBcbiBFeGFtcGxlOlxuXG4gKHN0YXJ0IGNvZGUganMpXG4gICAvL2NyZWF0ZSBuZXcgdmlzdWFsaXphdGlvblxuICAgdmFyIHZpeiA9IG5ldyAkaml0LlZpeihvcHRpb25zKTtcbiAgIC8vbG9hZCBKU09OIGRhdGFcbiAgIHZpei5sb2FkSlNPTihqc29uKTtcbiAgIC8vYWNjZXNzIG1vZGVsXG4gICB2aXouZ3JhcGg7IC8vPEdyYXBoPiBpbnN0YW5jZVxuIChlbmQgY29kZSlcbiBcbiBJbXBsZW1lbnRzOlxuIFxuIFRoZSBmb2xsb3dpbmcgPEdyYXBoLlV0aWw+IG1ldGhvZHMgYXJlIGltcGxlbWVudGVkIGluIDxHcmFwaD5cbiBcbiAgLSA8R3JhcGguVXRpbC5nZXROb2RlPlxuICAtIDxHcmFwaC5VdGlsLmVhY2hOb2RlPlxuICAtIDxHcmFwaC5VdGlsLmNvbXB1dGVMZXZlbHM+XG4gIC0gPEdyYXBoLlV0aWwuZWFjaEJGUz5cbiAgLSA8R3JhcGguVXRpbC5jbGVhbj5cbiAgLSA8R3JhcGguVXRpbC5nZXRDbG9zZXN0Tm9kZVRvUG9zPlxuICAtIDxHcmFwaC5VdGlsLmdldENsb3Nlc3ROb2RlVG9PcmlnaW4+XG4gXG4qLyAgXG5cbiRqaXQuR3JhcGggPSBuZXcgQ2xhc3Moe1xuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdCwgTm9kZSwgRWRnZSwgTGFiZWwpIHtcbiAgICB2YXIgaW5uZXJPcHRpb25zID0ge1xuICAgICdrbGFzcyc6IENvbXBsZXgsXG4gICAgJ05vZGUnOiB7fVxuICAgIH07XG4gICAgdGhpcy5Ob2RlID0gTm9kZTtcbiAgICB0aGlzLkVkZ2UgPSBFZGdlO1xuICAgIHRoaXMuTGFiZWwgPSBMYWJlbDtcbiAgICB0aGlzLm9wdCA9ICQubWVyZ2UoaW5uZXJPcHRpb25zLCBvcHQgfHwge30pO1xuICAgIHRoaXMubm9kZXMgPSB7fTtcbiAgICB0aGlzLmVkZ2VzID0ge307XG4gICAgXG4gICAgLy9hZGQgbm9kZUxpc3QgbWV0aG9kc1xuICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICB0aGlzLm5vZGVMaXN0ID0ge307XG4gICAgZm9yKHZhciBwIGluIEFjY2Vzc29ycykge1xuICAgICAgdGhhdC5ub2RlTGlzdFtwXSA9IChmdW5jdGlvbihwKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICAgICAgdGhhdC5lYWNoTm9kZShmdW5jdGlvbihuKSB7XG4gICAgICAgICAgICBuW3BdLmFwcGx5KG4sIGFyZ3MpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgfSkocCk7XG4gICAgfVxuXG4gfSxcblxuLypcbiAgICAgTWV0aG9kOiBnZXROb2RlXG4gICAgXG4gICAgIFJldHVybnMgYSA8R3JhcGguTm9kZT4gYnkgKmlkKi5cblxuICAgICBQYXJhbWV0ZXJzOlxuXG4gICAgIGlkIC0gKHN0cmluZykgQSA8R3JhcGguTm9kZT4gaWQuXG5cbiAgICAgRXhhbXBsZTpcblxuICAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgICB2YXIgbm9kZSA9IGdyYXBoLmdldE5vZGUoJ25vZGVJZCcpO1xuICAgICAoZW5kIGNvZGUpXG4qLyAgXG4gZ2V0Tm9kZTogZnVuY3Rpb24oaWQpIHtcbiAgICBpZih0aGlzLmhhc05vZGUoaWQpKSByZXR1cm4gdGhpcy5ub2Rlc1tpZF07XG4gICAgcmV0dXJuIGZhbHNlO1xuIH0sXG5cbiAvKlxuICAgICBNZXRob2Q6IGdldFxuICAgIFxuICAgICBBbiBhbGlhcyBmb3IgPEdyYXBoLlV0aWwuZ2V0Tm9kZT4uIFJldHVybnMgYSBub2RlIGJ5ICppZCouXG4gICAgXG4gICAgIFBhcmFtZXRlcnM6XG4gICAgXG4gICAgIGlkIC0gKHN0cmluZykgQSA8R3JhcGguTm9kZT4gaWQuXG4gICAgXG4gICAgIEV4YW1wbGU6XG4gICAgXG4gICAgIChzdGFydCBjb2RlIGpzKVxuICAgICAgIHZhciBub2RlID0gZ3JhcGguZ2V0KCdub2RlSWQnKTtcbiAgICAgKGVuZCBjb2RlKVxuKi8gIFxuICBnZXQ6IGZ1bmN0aW9uKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Tm9kZShpZCk7XG4gIH0sXG5cbiAvKlxuICAgTWV0aG9kOiBnZXRCeU5hbWVcbiAgXG4gICBSZXR1cm5zIGEgPEdyYXBoLk5vZGU+IGJ5ICpuYW1lKi5cbiAgXG4gICBQYXJhbWV0ZXJzOlxuICBcbiAgIG5hbWUgLSAoc3RyaW5nKSBBIDxHcmFwaC5Ob2RlPiBuYW1lLlxuICBcbiAgIEV4YW1wbGU6XG4gIFxuICAgKHN0YXJ0IGNvZGUganMpXG4gICAgIHZhciBub2RlID0gZ3JhcGguZ2V0QnlOYW1lKCdzb21lTmFtZScpO1xuICAgKGVuZCBjb2RlKVxuICAqLyAgXG4gIGdldEJ5TmFtZTogZnVuY3Rpb24obmFtZSkge1xuICAgIGZvcih2YXIgaWQgaW4gdGhpcy5ub2Rlcykge1xuICAgICAgdmFyIG4gPSB0aGlzLm5vZGVzW2lkXTtcbiAgICAgIGlmKG4ubmFtZSA9PSBuYW1lKSByZXR1cm4gbjtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4vKlxuICAgTWV0aG9kOiBnZXRBZGphY2VuY2VcbiAgXG4gICBSZXR1cm5zIGEgPEdyYXBoLkFkamFjZW5jZT4gb2JqZWN0IGNvbm5lY3Rpbmcgbm9kZXMgd2l0aCBpZHMgKmlkKiBhbmQgKmlkMiouXG5cbiAgIFBhcmFtZXRlcnM6XG5cbiAgIGlkIC0gKHN0cmluZykgQSA8R3JhcGguTm9kZT4gaWQuXG4gICBpZDIgLSAoc3RyaW5nKSBBIDxHcmFwaC5Ob2RlPiBpZC5cbiovICBcbiAgZ2V0QWRqYWNlbmNlOiBmdW5jdGlvbiAoaWQsIGlkMikge1xuICAgIGlmKGlkIGluIHRoaXMuZWRnZXMpIHtcbiAgICAgIHJldHVybiB0aGlzLmVkZ2VzW2lkXVtpZDJdO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gfSxcblxuICAgIC8qXG4gICAgIE1ldGhvZDogYWRkTm9kZVxuICAgIFxuICAgICBBZGRzIGEgbm9kZS5cbiAgICAgXG4gICAgIFBhcmFtZXRlcnM6XG4gICAgXG4gICAgICBvYmogLSBBbiBvYmplY3Qgd2l0aCB0aGUgcHJvcGVydGllcyBkZXNjcmliZWQgYmVsb3dcblxuICAgICAgaWQgLSAoc3RyaW5nKSBBIG5vZGUgaWRcbiAgICAgIG5hbWUgLSAoc3RyaW5nKSBBIG5vZGUncyBuYW1lXG4gICAgICBkYXRhIC0gKG9iamVjdCkgQSBub2RlJ3MgZGF0YSBoYXNoXG5cbiAgICBTZWUgYWxzbzpcbiAgICA8R3JhcGguTm9kZT5cblxuICAqLyAgXG4gIGFkZE5vZGU6IGZ1bmN0aW9uKG9iaikgeyBcbiAgIGlmKCF0aGlzLm5vZGVzW29iai5pZF0pIHsgIFxuICAgICB2YXIgZWRnZXMgPSB0aGlzLmVkZ2VzW29iai5pZF0gPSB7fTtcbiAgICAgdGhpcy5ub2Rlc1tvYmouaWRdID0gbmV3IEdyYXBoLk5vZGUoJC5leHRlbmQoe1xuICAgICAgICAnaWQnOiBvYmouaWQsXG4gICAgICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgICAgICdkYXRhJzogJC5tZXJnZShvYmouZGF0YSB8fCB7fSwge30pLFxuICAgICAgICAnYWRqYWNlbmNpZXMnOiBlZGdlcyBcbiAgICAgIH0sIHRoaXMub3B0Lk5vZGUpLCBcbiAgICAgIHRoaXMub3B0LmtsYXNzLCBcbiAgICAgIHRoaXMuTm9kZSwgXG4gICAgICB0aGlzLkVkZ2UsXG4gICAgICB0aGlzLkxhYmVsKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubm9kZXNbb2JqLmlkXTtcbiAgfSxcbiAgXG4gICAgLypcbiAgICAgTWV0aG9kOiBhZGRBZGphY2VuY2VcbiAgICBcbiAgICAgQ29ubmVjdHMgbm9kZXMgc3BlY2lmaWVkIGJ5ICpvYmoqIGFuZCAqb2JqMiouIElmIG5vdCBmb3VuZCwgbm9kZXMgYXJlIGNyZWF0ZWQuXG4gICAgIFxuICAgICBQYXJhbWV0ZXJzOlxuICAgIFxuICAgICAgb2JqIC0gKG9iamVjdCkgQSA8R3JhcGguTm9kZT4gb2JqZWN0LlxuICAgICAgb2JqMiAtIChvYmplY3QpIEFub3RoZXIgPEdyYXBoLk5vZGU+IG9iamVjdC5cbiAgICAgIGRhdGEgLSAob2JqZWN0KSBBIGRhdGEgb2JqZWN0LiBVc2VkIHRvIHN0b3JlIHNvbWUgZXh0cmEgaW5mb3JtYXRpb24gaW4gdGhlIDxHcmFwaC5BZGphY2VuY2U+IG9iamVjdCBjcmVhdGVkLlxuXG4gICAgU2VlIGFsc286XG5cbiAgICA8R3JhcGguTm9kZT4sIDxHcmFwaC5BZGphY2VuY2U+XG4gICAgKi8gIFxuICBhZGRBZGphY2VuY2U6IGZ1bmN0aW9uIChvYmosIG9iajIsIGRhdGEpIHtcbiAgICBpZighdGhpcy5oYXNOb2RlKG9iai5pZCkpIHsgdGhpcy5hZGROb2RlKG9iaik7IH1cbiAgICBpZighdGhpcy5oYXNOb2RlKG9iajIuaWQpKSB7IHRoaXMuYWRkTm9kZShvYmoyKTsgfVxuICAgIG9iaiA9IHRoaXMubm9kZXNbb2JqLmlkXTsgb2JqMiA9IHRoaXMubm9kZXNbb2JqMi5pZF07XG4gICAgaWYoIW9iai5hZGphY2VudFRvKG9iajIpKSB7XG4gICAgICB2YXIgYWRqc09iaiA9IHRoaXMuZWRnZXNbb2JqLmlkXSA9IHRoaXMuZWRnZXNbb2JqLmlkXSB8fCB7fTtcbiAgICAgIHZhciBhZGpzT2JqMiA9IHRoaXMuZWRnZXNbb2JqMi5pZF0gPSB0aGlzLmVkZ2VzW29iajIuaWRdIHx8IHt9O1xuICAgICAgYWRqc09ialtvYmoyLmlkXSA9IGFkanNPYmoyW29iai5pZF0gPSBuZXcgR3JhcGguQWRqYWNlbmNlKG9iaiwgb2JqMiwgZGF0YSwgdGhpcy5FZGdlLCB0aGlzLkxhYmVsKTtcbiAgICAgIHJldHVybiBhZGpzT2JqW29iajIuaWRdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lZGdlc1tvYmouaWRdW29iajIuaWRdO1xuIH0sXG5cbiAgICAvKlxuICAgICBNZXRob2Q6IHJlbW92ZU5vZGVcbiAgICBcbiAgICAgUmVtb3ZlcyBhIDxHcmFwaC5Ob2RlPiBtYXRjaGluZyB0aGUgc3BlY2lmaWVkICppZCouXG5cbiAgICAgUGFyYW1ldGVyczpcblxuICAgICBpZCAtIChzdHJpbmcpIEEgbm9kZSdzIGlkLlxuXG4gICAgKi8gIFxuICByZW1vdmVOb2RlOiBmdW5jdGlvbihpZCkge1xuICAgIGlmKHRoaXMuaGFzTm9kZShpZCkpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm5vZGVzW2lkXTtcbiAgICAgIHZhciBhZGpzID0gdGhpcy5lZGdlc1tpZF07XG4gICAgICBmb3IodmFyIHRvIGluIGFkanMpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZWRnZXNbdG9dW2lkXTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzLmVkZ2VzW2lkXTtcbiAgICB9XG4gIH0sXG4gIFxuLypcbiAgICAgTWV0aG9kOiByZW1vdmVBZGphY2VuY2VcbiAgICBcbiAgICAgUmVtb3ZlcyBhIDxHcmFwaC5BZGphY2VuY2U+IG1hdGNoaW5nICppZDEqIGFuZCAqaWQyKi5cblxuICAgICBQYXJhbWV0ZXJzOlxuXG4gICAgIGlkMSAtIChzdHJpbmcpIEEgPEdyYXBoLk5vZGU+IGlkLlxuICAgICBpZDIgLSAoc3RyaW5nKSBBIDxHcmFwaC5Ob2RlPiBpZC5cbiovICBcbiAgcmVtb3ZlQWRqYWNlbmNlOiBmdW5jdGlvbihpZDEsIGlkMikge1xuICAgIGRlbGV0ZSB0aGlzLmVkZ2VzW2lkMV1baWQyXTtcbiAgICBkZWxldGUgdGhpcy5lZGdlc1tpZDJdW2lkMV07XG4gIH0sXG5cbiAgIC8qXG4gICAgIE1ldGhvZDogaGFzTm9kZVxuICAgIFxuICAgICBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBub2RlIGJlbG9uZ3MgdG8gdGhlIDxHcmFwaD4gb3Igbm90LlxuICAgICBcbiAgICAgUGFyYW1ldGVyczpcbiAgICBcbiAgICAgICAgaWQgLSAoc3RyaW5nKSBOb2RlIGlkLlxuICAgKi8gIFxuICBoYXNOb2RlOiBmdW5jdGlvbihpZCkge1xuICAgIHJldHVybiBpZCBpbiB0aGlzLm5vZGVzO1xuICB9LFxuICBcbiAgLypcbiAgICBNZXRob2Q6IGVtcHR5XG5cbiAgICBFbXB0aWVzIHRoZSBHcmFwaFxuXG4gICovXG4gIGVtcHR5OiBmdW5jdGlvbigpIHsgdGhpcy5ub2RlcyA9IHt9OyB0aGlzLmVkZ2VzID0ge307fVxuXG59KTtcblxudmFyIEdyYXBoID0gJGppdC5HcmFwaDtcblxuLypcbiBPYmplY3Q6IEFjY2Vzc29yc1xuIFxuIERlZmluZXMgYSBzZXQgb2YgbWV0aG9kcyBmb3IgZGF0YSwgY2FudmFzIGFuZCBsYWJlbCBzdHlsZXMgbWFuaXB1bGF0aW9uIGltcGxlbWVudGVkIGJ5IDxHcmFwaC5Ob2RlPiBhbmQgPEdyYXBoLkFkamFjZW5jZT4gaW5zdGFuY2VzLlxuIFxuICovXG52YXIgQWNjZXNzb3JzO1xuXG4oZnVuY3Rpb24gKCkge1xuICB2YXIgZ2V0RGF0YUludGVybmFsID0gZnVuY3Rpb24ocHJlZml4LCBwcm9wLCB0eXBlLCBmb3JjZSwgcHJlZml4Q29uZmlnKSB7XG4gICAgdmFyIGRhdGE7XG4gICAgdHlwZSA9IHR5cGUgfHwgJ2N1cnJlbnQnO1xuICAgIHByZWZpeCA9IFwiJFwiICsgKHByZWZpeCA/IHByZWZpeCArIFwiLVwiIDogXCJcIik7XG5cbiAgICBpZih0eXBlID09ICdjdXJyZW50Jykge1xuICAgICAgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICB9IGVsc2UgaWYodHlwZSA9PSAnc3RhcnQnKSB7XG4gICAgICBkYXRhID0gdGhpcy5zdGFydERhdGE7XG4gICAgfSBlbHNlIGlmKHR5cGUgPT0gJ2VuZCcpIHtcbiAgICAgIGRhdGEgPSB0aGlzLmVuZERhdGE7XG4gICAgfVxuXG4gICAgdmFyIGRvbGxhciA9IHByZWZpeCArIHByb3A7XG5cbiAgICBpZihmb3JjZSkge1xuICAgICAgcmV0dXJuIGRhdGFbZG9sbGFyXTtcbiAgICB9XG5cbiAgICBpZighdGhpcy5Db25maWcub3ZlcnJpZGFibGUpXG4gICAgICByZXR1cm4gcHJlZml4Q29uZmlnW3Byb3BdIHx8IDA7XG5cbiAgICByZXR1cm4gKGRvbGxhciBpbiBkYXRhKSA/XG4gICAgICBkYXRhW2RvbGxhcl0gOiAoKGRvbGxhciBpbiB0aGlzLmRhdGEpID8gdGhpcy5kYXRhW2RvbGxhcl0gOiAocHJlZml4Q29uZmlnW3Byb3BdIHx8IDApKTtcbiAgfVxuXG4gIHZhciBzZXREYXRhSW50ZXJuYWwgPSBmdW5jdGlvbihwcmVmaXgsIHByb3AsIHZhbHVlLCB0eXBlKSB7XG4gICAgdHlwZSA9IHR5cGUgfHwgJ2N1cnJlbnQnO1xuICAgIHByZWZpeCA9ICckJyArIChwcmVmaXggPyBwcmVmaXggKyAnLScgOiAnJyk7XG5cbiAgICB2YXIgZGF0YTtcblxuICAgIGlmKHR5cGUgPT0gJ2N1cnJlbnQnKSB7XG4gICAgICBkYXRhID0gdGhpcy5kYXRhO1xuICAgIH0gZWxzZSBpZih0eXBlID09ICdzdGFydCcpIHtcbiAgICAgIGRhdGEgPSB0aGlzLnN0YXJ0RGF0YTtcbiAgICB9IGVsc2UgaWYodHlwZSA9PSAnZW5kJykge1xuICAgICAgZGF0YSA9IHRoaXMuZW5kRGF0YTtcbiAgICB9XG5cbiAgICBkYXRhW3ByZWZpeCArIHByb3BdID0gdmFsdWU7XG4gIH1cblxuICB2YXIgcmVtb3ZlRGF0YUludGVybmFsID0gZnVuY3Rpb24ocHJlZml4LCBwcm9wZXJ0aWVzKSB7XG4gICAgcHJlZml4ID0gJyQnICsgKHByZWZpeCA/IHByZWZpeCArICctJyA6ICcnKTtcbiAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgJC5lYWNoKHByb3BlcnRpZXMsIGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgIHZhciBwcmVmID0gcHJlZml4ICsgcHJvcDtcbiAgICAgIGRlbGV0ZSB0aGF0LmRhdGFbcHJlZl07XG4gICAgICBkZWxldGUgdGhhdC5lbmREYXRhW3ByZWZdO1xuICAgICAgZGVsZXRlIHRoYXQuc3RhcnREYXRhW3ByZWZdO1xuICAgIH0pO1xuICB9XG5cbiAgQWNjZXNzb3JzID0ge1xuICAgIC8qXG4gICAgTWV0aG9kOiBnZXREYXRhXG5cbiAgICBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgZGF0YSB2YWx1ZSBwcm9wZXJ0eS5cbiAgICBUaGlzIGlzIHVzZWZ1bCBmb3IgcXVlcnlpbmcgc3BlY2lhbC9yZXNlcnZlZCA8R3JhcGguTm9kZT4gZGF0YSBwcm9wZXJ0aWVzXG4gICAgKGkuZSBkb2xsYXIgcHJlZml4ZWQgcHJvcGVydGllcykuXG5cbiAgICBQYXJhbWV0ZXJzOlxuXG4gICAgICBwcm9wICAtIChzdHJpbmcpIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4gVGhlIGRvbGxhciBzaWduIGlzIG5vdCBuZWVkZWQuIEZvclxuICAgICAgICAgICAgICBleGFtcGxlICpnZXREYXRhKHdpZHRoKSogd2lsbCByZXR1cm4gKmRhdGEuJHdpZHRoKi5cbiAgICAgIHR5cGUgIC0gKHN0cmluZykgVGhlIHR5cGUgb2YgdGhlIGRhdGEgcHJvcGVydHkgcXVlcmllZC4gRGVmYXVsdCdzIFwiY3VycmVudFwiLiBZb3UgY2FuIGFjY2VzcyAqc3RhcnQqIGFuZCAqZW5kKiBcbiAgICAgICAgICAgICAgZGF0YSBwcm9wZXJ0aWVzIGFsc28uIFRoZXNlIHByb3BlcnRpZXMgYXJlIHVzZWQgd2hlbiBtYWtpbmcgYW5pbWF0aW9ucy5cbiAgICAgIGZvcmNlIC0gKGJvb2xlYW4pIFdoZXRoZXIgdG8gb2J0YWluIHRoZSB0cnVlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSAoZXF1aXZhbGVudCB0b1xuICAgICAgICAgICAgICAqZGF0YS4kcHJvcCopIG9yIHRvIGNoZWNrIGZvciAqbm9kZS5vdmVycmlkYWJsZSA9IHRydWUqIGZpcnN0LlxuXG4gICAgUmV0dXJuczpcblxuICAgICAgVGhlIHZhbHVlIG9mIHRoZSBkb2xsYXIgcHJlZml4ZWQgcHJvcGVydHkgb3IgdGhlIGdsb2JhbCBOb2RlL0VkZ2UgcHJvcGVydHlcbiAgICAgIHZhbHVlIGlmICpvdmVycmlkYWJsZT1mYWxzZSpcblxuICAgIEV4YW1wbGU6XG4gICAgKHN0YXJ0IGNvZGUganMpXG4gICAgIG5vZGUuZ2V0RGF0YSgnd2lkdGgnKTsgLy93aWxsIHJldHVybiBub2RlLmRhdGEuJHdpZHRoIGlmIE5vZGUub3ZlcnJpZGFibGU9dHJ1ZTtcbiAgICAoZW5kIGNvZGUpXG4gICAgKi9cbiAgICBnZXREYXRhOiBmdW5jdGlvbihwcm9wLCB0eXBlLCBmb3JjZSkge1xuICAgICAgcmV0dXJuIGdldERhdGFJbnRlcm5hbC5jYWxsKHRoaXMsIFwiXCIsIHByb3AsIHR5cGUsIGZvcmNlLCB0aGlzLkNvbmZpZyk7XG4gICAgfSxcblxuXG4gICAgLypcbiAgICBNZXRob2Q6IHNldERhdGFcblxuICAgIFNldHMgdGhlIGN1cnJlbnQgZGF0YSBwcm9wZXJ0eSB3aXRoIHNvbWUgc3BlY2lmaWMgdmFsdWUuXG4gICAgVGhpcyBtZXRob2QgaXMgb25seSB1c2VmdWwgZm9yIHJlc2VydmVkIChkb2xsYXIgcHJlZml4ZWQpIHByb3BlcnRpZXMuXG5cbiAgICBQYXJhbWV0ZXJzOlxuXG4gICAgICBwcm9wICAtIChzdHJpbmcpIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4gVGhlIGRvbGxhciBzaWduIGlzIG5vdCBuZWNlc3NhcnkuIEZvclxuICAgICAgICAgICAgICBleGFtcGxlICpzZXREYXRhKHdpZHRoKSogd2lsbCBzZXQgKmRhdGEuJHdpZHRoKi5cbiAgICAgIHZhbHVlIC0gKG1peGVkKSBUaGUgdmFsdWUgdG8gc3RvcmUuXG4gICAgICB0eXBlICAtIChzdHJpbmcpIFRoZSB0eXBlIG9mIHRoZSBkYXRhIHByb3BlcnR5IHRvIHN0b3JlLiBEZWZhdWx0J3MgXCJjdXJyZW50XCIgYnV0XG4gICAgICAgICAgICAgIGNhbiBhbHNvIGJlIFwic3RhcnRcIiBvciBcImVuZFwiLlxuXG4gICAgRXhhbXBsZTpcbiAgICBcbiAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgbm9kZS5zZXREYXRhKCd3aWR0aCcsIDMwKTtcbiAgICAoZW5kIGNvZGUpXG4gICAgXG4gICAgSWYgd2Ugd2VyZSB0byBtYWtlIGFuIGFuaW1hdGlvbiBvZiBhIG5vZGUvZWRnZSB3aWR0aCB0aGVuIHdlIGNvdWxkIGRvXG4gICAgXG4gICAgKHN0YXJ0IGNvZGUganMpXG4gICAgICB2YXIgbm9kZSA9IHZpei5nZXROb2RlKCdub2RlSWQnKTtcbiAgICAgIC8vc2V0IHN0YXJ0IGFuZCBlbmQgdmFsdWVzXG4gICAgICBub2RlLnNldERhdGEoJ3dpZHRoJywgMTAsICdzdGFydCcpO1xuICAgICAgbm9kZS5zZXREYXRhKCd3aWR0aCcsIDMwLCAnZW5kJyk7XG4gICAgICAvL3dpbGwgYW5pbWF0ZSBub2RlcyB3aWR0aCBwcm9wZXJ0eVxuICAgICAgdml6LmZ4LmFuaW1hdGUoe1xuICAgICAgICBtb2RlczogWydub2RlLXByb3BlcnR5OndpZHRoJ10sXG4gICAgICAgIGR1cmF0aW9uOiAxMDAwXG4gICAgICB9KTtcbiAgICAoZW5kIGNvZGUpXG4gICAgKi9cbiAgICBzZXREYXRhOiBmdW5jdGlvbihwcm9wLCB2YWx1ZSwgdHlwZSkge1xuICAgICAgc2V0RGF0YUludGVybmFsLmNhbGwodGhpcywgXCJcIiwgcHJvcCwgdmFsdWUsIHR5cGUpO1xuICAgIH0sXG5cbiAgICAvKlxuICAgIE1ldGhvZDogc2V0RGF0YXNldFxuXG4gICAgQ29udmVuaWVuY2UgbWV0aG9kIHRvIHNldCBtdWx0aXBsZSBkYXRhIHZhbHVlcyBhdCBvbmNlLlxuICAgIFxuICAgIFBhcmFtZXRlcnM6XG4gICAgXG4gICAgdHlwZXMgLSAoYXJyYXl8c3RyaW5nKSBBIHNldCBvZiAnY3VycmVudCcsICdlbmQnIG9yICdzdGFydCcgdmFsdWVzLlxuICAgIG9iaiAtIChvYmplY3QpIEEgaGFzaCBjb250YWluaW5nIHRoZSBuYW1lcyBhbmQgdmFsdWVzIG9mIHRoZSBwcm9wZXJ0aWVzIHRvIGJlIGFsdGVyZWQuXG5cbiAgICBFeGFtcGxlOlxuICAgIChzdGFydCBjb2RlIGpzKVxuICAgICAgbm9kZS5zZXREYXRhc2V0KFsnY3VycmVudCcsICdlbmQnXSwge1xuICAgICAgICAnd2lkdGgnOiBbMTAwLCA1XSxcbiAgICAgICAgJ2NvbG9yJzogWycjZmZmJywgJyNjY2MnXVxuICAgICAgfSk7XG4gICAgICAvLy4uLm9yIGFsc29cbiAgICAgIG5vZGUuc2V0RGF0YXNldCgnZW5kJywge1xuICAgICAgICAnd2lkdGgnOiA1LFxuICAgICAgICAnY29sb3InOiAnI2NjYydcbiAgICAgIH0pO1xuICAgIChlbmQgY29kZSlcbiAgICBcbiAgICBTZWUgYWxzbzogXG4gICAgXG4gICAgPEFjY2Vzc29ycy5zZXREYXRhPlxuICAgIFxuICAgICovXG4gICAgc2V0RGF0YXNldDogZnVuY3Rpb24odHlwZXMsIG9iaikge1xuICAgICAgdHlwZXMgPSAkLnNwbGF0KHR5cGVzKTtcbiAgICAgIGZvcih2YXIgYXR0ciBpbiBvYmopIHtcbiAgICAgICAgZm9yKHZhciBpPTAsIHZhbCA9ICQuc3BsYXQob2JqW2F0dHJdKSwgbD10eXBlcy5sZW5ndGg7IGk8bDsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5zZXREYXRhKGF0dHIsIHZhbFtpXSwgdHlwZXNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBcbiAgICAvKlxuICAgIE1ldGhvZDogcmVtb3ZlRGF0YVxuXG4gICAgUmVtb3ZlIGRhdGEgcHJvcGVydGllcy5cblxuICAgIFBhcmFtZXRlcnM6XG5cbiAgICBPbmUgb3IgbW9yZSBwcm9wZXJ0eSBuYW1lcyBhcyBhcmd1bWVudHMuIFRoZSBkb2xsYXIgc2lnbiBpcyBub3QgbmVlZGVkLlxuXG4gICAgRXhhbXBsZTpcbiAgICAoc3RhcnQgY29kZSBqcylcbiAgICBub2RlLnJlbW92ZURhdGEoJ3dpZHRoJyk7IC8vbm93IHRoZSBkZWZhdWx0IHdpZHRoIHZhbHVlIGlzIHJldHVybmVkXG4gICAgKGVuZCBjb2RlKVxuICAgICovXG4gICAgcmVtb3ZlRGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVEYXRhSW50ZXJuYWwuY2FsbCh0aGlzLCBcIlwiLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICB9LFxuXG4gICAgLypcbiAgICBNZXRob2Q6IGdldENhbnZhc1N0eWxlXG5cbiAgICBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgY2FudmFzIHN0eWxlIGRhdGEgdmFsdWUgcHJvcGVydHkuIFRoaXMgaXMgdXNlZnVsIGZvclxuICAgIHF1ZXJ5aW5nIHNwZWNpYWwvcmVzZXJ2ZWQgPEdyYXBoLk5vZGU+IGNhbnZhcyBzdHlsZSBkYXRhIHByb3BlcnRpZXMgKGkuZS5cbiAgICBkb2xsYXIgcHJlZml4ZWQgcHJvcGVydGllcyB0aGF0IG1hdGNoIHdpdGggJGNhbnZhcy08bmFtZSBvZiBjYW52YXMgc3R5bGU+KS5cblxuICAgIFBhcmFtZXRlcnM6XG5cbiAgICAgIHByb3AgIC0gKHN0cmluZykgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LiBUaGUgZG9sbGFyIHNpZ24gaXMgbm90IG5lZWRlZC4gRm9yXG4gICAgICAgICAgICAgIGV4YW1wbGUgKmdldENhbnZhc1N0eWxlKHNoYWRvd0JsdXIpKiB3aWxsIHJldHVybiAqZGF0YVskY2FudmFzLXNoYWRvd0JsdXJdKi5cbiAgICAgIHR5cGUgIC0gKHN0cmluZykgVGhlIHR5cGUgb2YgdGhlIGRhdGEgcHJvcGVydHkgcXVlcmllZC4gRGVmYXVsdCdzICpjdXJyZW50Ki4gWW91IGNhbiBhY2Nlc3MgKnN0YXJ0KiBhbmQgKmVuZCogXG4gICAgICAgICAgICAgIGRhdGEgcHJvcGVydGllcyBhbHNvLlxuICAgICAgICAgICAgICBcbiAgICBFeGFtcGxlOlxuICAgIChzdGFydCBjb2RlIGpzKVxuICAgICAgbm9kZS5nZXRDYW52YXNTdHlsZSgnc2hhZG93Qmx1cicpO1xuICAgIChlbmQgY29kZSlcbiAgICBcbiAgICBTZWUgYWxzbzpcbiAgICBcbiAgICA8QWNjZXNzb3JzLmdldERhdGE+XG4gICAgKi9cbiAgICBnZXRDYW52YXNTdHlsZTogZnVuY3Rpb24ocHJvcCwgdHlwZSwgZm9yY2UpIHtcbiAgICAgIHJldHVybiBnZXREYXRhSW50ZXJuYWwuY2FsbChcbiAgICAgICAgICB0aGlzLCAnY2FudmFzJywgcHJvcCwgdHlwZSwgZm9yY2UsIHRoaXMuQ29uZmlnLkNhbnZhc1N0eWxlcyk7XG4gICAgfSxcblxuICAgIC8qXG4gICAgTWV0aG9kOiBzZXRDYW52YXNTdHlsZVxuXG4gICAgU2V0cyB0aGUgY2FudmFzIHN0eWxlIGRhdGEgcHJvcGVydHkgd2l0aCBzb21lIHNwZWNpZmljIHZhbHVlLlxuICAgIFRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZnVsIGZvciByZXNlcnZlZCAoZG9sbGFyIHByZWZpeGVkKSBwcm9wZXJ0aWVzLlxuICAgIFxuICAgIFBhcmFtZXRlcnM6XG4gICAgXG4gICAgcHJvcCAtIChzdHJpbmcpIE5hbWUgb2YgdGhlIHByb3BlcnR5LiBDYW4gYmUgYW55IGNhbnZhcyBwcm9wZXJ0eSBsaWtlICdzaGFkb3dCbHVyJywgJ3NoYWRvd0NvbG9yJywgJ3N0cm9rZVN0eWxlJywgZXRjLlxuICAgIHZhbHVlIC0gKG1peGVkKSBUaGUgdmFsdWUgdG8gc2V0IHRvIHRoZSBwcm9wZXJ0eS5cbiAgICB0eXBlIC0gKHN0cmluZykgRGVmYXVsdCdzICpjdXJyZW50Ki4gV2hldGhlciB0byBzZXQgKnN0YXJ0KiwgKmN1cnJlbnQqIG9yICplbmQqIHR5cGUgcHJvcGVydGllcy5cbiAgICBcbiAgICBFeGFtcGxlOlxuICAgIFxuICAgIChzdGFydCBjb2RlIGpzKVxuICAgICBub2RlLnNldENhbnZhc1N0eWxlKCdzaGFkb3dCbHVyJywgMzApO1xuICAgIChlbmQgY29kZSlcbiAgICBcbiAgICBJZiB3ZSB3ZXJlIHRvIG1ha2UgYW4gYW5pbWF0aW9uIG9mIGEgbm9kZS9lZGdlIHNoYWRvd0JsdXIgY2FudmFzIHN0eWxlIHRoZW4gd2UgY291bGQgZG9cbiAgICBcbiAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgIHZhciBub2RlID0gdml6LmdldE5vZGUoJ25vZGVJZCcpO1xuICAgICAgLy9zZXQgc3RhcnQgYW5kIGVuZCB2YWx1ZXNcbiAgICAgIG5vZGUuc2V0Q2FudmFzU3R5bGUoJ3NoYWRvd0JsdXInLCAxMCwgJ3N0YXJ0Jyk7XG4gICAgICBub2RlLnNldENhbnZhc1N0eWxlKCdzaGFkb3dCbHVyJywgMzAsICdlbmQnKTtcbiAgICAgIC8vd2lsbCBhbmltYXRlIG5vZGVzIGNhbnZhcyBzdHlsZSBwcm9wZXJ0eSBmb3Igbm9kZXNcbiAgICAgIHZpei5meC5hbmltYXRlKHtcbiAgICAgICAgbW9kZXM6IFsnbm9kZS1zdHlsZTpzaGFkb3dCbHVyJ10sXG4gICAgICAgIGR1cmF0aW9uOiAxMDAwXG4gICAgICB9KTtcbiAgICAoZW5kIGNvZGUpXG4gICAgXG4gICAgU2VlIGFsc286XG4gICAgXG4gICAgPEFjY2Vzc29ycy5zZXREYXRhPi5cbiAgICAqL1xuICAgIHNldENhbnZhc1N0eWxlOiBmdW5jdGlvbihwcm9wLCB2YWx1ZSwgdHlwZSkge1xuICAgICAgc2V0RGF0YUludGVybmFsLmNhbGwodGhpcywgJ2NhbnZhcycsIHByb3AsIHZhbHVlLCB0eXBlKTtcbiAgICB9LFxuXG4gICAgLypcbiAgICBNZXRob2Q6IHNldENhbnZhc1N0eWxlc1xuXG4gICAgQ29udmVuaWVuY2UgbWV0aG9kIHRvIHNldCBtdWx0aXBsZSBzdHlsZXMgYXQgb25jZS5cblxuICAgIFBhcmFtZXRlcnM6XG4gICAgXG4gICAgdHlwZXMgLSAoYXJyYXl8c3RyaW5nKSBBIHNldCBvZiAnY3VycmVudCcsICdlbmQnIG9yICdzdGFydCcgdmFsdWVzLlxuICAgIG9iaiAtIChvYmplY3QpIEEgaGFzaCBjb250YWluaW5nIHRoZSBuYW1lcyBhbmQgdmFsdWVzIG9mIHRoZSBwcm9wZXJ0aWVzIHRvIGJlIGFsdGVyZWQuXG5cbiAgICBTZWUgYWxzbzpcbiAgICBcbiAgICA8QWNjZXNzb3JzLnNldERhdGFzZXQ+LlxuICAgICovXG4gICAgc2V0Q2FudmFzU3R5bGVzOiBmdW5jdGlvbih0eXBlcywgb2JqKSB7XG4gICAgICB0eXBlcyA9ICQuc3BsYXQodHlwZXMpO1xuICAgICAgZm9yKHZhciBhdHRyIGluIG9iaikge1xuICAgICAgICBmb3IodmFyIGk9MCwgdmFsID0gJC5zcGxhdChvYmpbYXR0cl0pLCBsPXR5cGVzLmxlbmd0aDsgaTxsOyBpKyspIHtcbiAgICAgICAgICB0aGlzLnNldENhbnZhc1N0eWxlKGF0dHIsIHZhbFtpXSwgdHlwZXNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qXG4gICAgTWV0aG9kOiByZW1vdmVDYW52YXNTdHlsZVxuXG4gICAgUmVtb3ZlIGNhbnZhcyBzdHlsZSBwcm9wZXJ0aWVzIGZyb20gZGF0YS5cblxuICAgIFBhcmFtZXRlcnM6XG4gICAgXG4gICAgQSB2YXJpYWJsZSBudW1iZXIgb2YgY2FudmFzIHN0eWxlIHN0cmluZ3MuXG5cbiAgICBTZWUgYWxzbzpcbiAgICBcbiAgICA8QWNjZXNzb3JzLnJlbW92ZURhdGE+LlxuICAgICovXG4gICAgcmVtb3ZlQ2FudmFzU3R5bGU6IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlRGF0YUludGVybmFsLmNhbGwodGhpcywgJ2NhbnZhcycsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgIH0sXG5cbiAgICAvKlxuICAgIE1ldGhvZDogZ2V0TGFiZWxEYXRhXG5cbiAgICBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgbGFiZWwgZGF0YSB2YWx1ZSBwcm9wZXJ0eS4gVGhpcyBpcyB1c2VmdWwgZm9yXG4gICAgcXVlcnlpbmcgc3BlY2lhbC9yZXNlcnZlZCA8R3JhcGguTm9kZT4gbGFiZWwgb3B0aW9ucyAoaS5lLlxuICAgIGRvbGxhciBwcmVmaXhlZCBwcm9wZXJ0aWVzIHRoYXQgbWF0Y2ggd2l0aCAkbGFiZWwtPG5hbWUgb2YgbGFiZWwgc3R5bGU+KS5cblxuICAgIFBhcmFtZXRlcnM6XG5cbiAgICAgIHByb3AgIC0gKHN0cmluZykgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LiBUaGUgZG9sbGFyIHNpZ24gcHJlZml4IGlzIG5vdCBuZWVkZWQuIEZvclxuICAgICAgICAgICAgICBleGFtcGxlICpnZXRMYWJlbERhdGEoc2l6ZSkqIHdpbGwgcmV0dXJuICpkYXRhWyRsYWJlbC1zaXplXSouXG4gICAgICB0eXBlICAtIChzdHJpbmcpIFRoZSB0eXBlIG9mIHRoZSBkYXRhIHByb3BlcnR5IHF1ZXJpZWQuIERlZmF1bHQncyAqY3VycmVudCouIFlvdSBjYW4gYWNjZXNzICpzdGFydCogYW5kICplbmQqIFxuICAgICAgICAgICAgICBkYXRhIHByb3BlcnRpZXMgYWxzby5cbiAgICAgICAgICAgICAgXG4gICAgU2VlIGFsc286XG4gICAgXG4gICAgPEFjY2Vzc29ycy5nZXREYXRhPi5cbiAgICAqL1xuICAgIGdldExhYmVsRGF0YTogZnVuY3Rpb24ocHJvcCwgdHlwZSwgZm9yY2UpIHtcbiAgICAgIHJldHVybiBnZXREYXRhSW50ZXJuYWwuY2FsbChcbiAgICAgICAgICB0aGlzLCAnbGFiZWwnLCBwcm9wLCB0eXBlLCBmb3JjZSwgdGhpcy5MYWJlbCk7XG4gICAgfSxcblxuICAgIC8qXG4gICAgTWV0aG9kOiBzZXRMYWJlbERhdGFcblxuICAgIFNldHMgdGhlIGN1cnJlbnQgbGFiZWwgZGF0YSB3aXRoIHNvbWUgc3BlY2lmaWMgdmFsdWUuXG4gICAgVGhpcyBtZXRob2QgaXMgb25seSB1c2VmdWwgZm9yIHJlc2VydmVkIChkb2xsYXIgcHJlZml4ZWQpIHByb3BlcnRpZXMuXG5cbiAgICBQYXJhbWV0ZXJzOlxuICAgIFxuICAgIHByb3AgLSAoc3RyaW5nKSBOYW1lIG9mIHRoZSBwcm9wZXJ0eS4gQ2FuIGJlIGFueSBjYW52YXMgcHJvcGVydHkgbGlrZSAnc2hhZG93Qmx1cicsICdzaGFkb3dDb2xvcicsICdzdHJva2VTdHlsZScsIGV0Yy5cbiAgICB2YWx1ZSAtIChtaXhlZCkgVGhlIHZhbHVlIHRvIHNldCB0byB0aGUgcHJvcGVydHkuXG4gICAgdHlwZSAtIChzdHJpbmcpIERlZmF1bHQncyAqY3VycmVudCouIFdoZXRoZXIgdG8gc2V0ICpzdGFydCosICpjdXJyZW50KiBvciAqZW5kKiB0eXBlIHByb3BlcnRpZXMuXG4gICAgXG4gICAgRXhhbXBsZTpcbiAgICBcbiAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgbm9kZS5zZXRMYWJlbERhdGEoJ3NpemUnLCAzMCk7XG4gICAgKGVuZCBjb2RlKVxuICAgIFxuICAgIElmIHdlIHdlcmUgdG8gbWFrZSBhbiBhbmltYXRpb24gb2YgYSBub2RlIGxhYmVsIHNpemUgdGhlbiB3ZSBjb3VsZCBkb1xuICAgIFxuICAgIChzdGFydCBjb2RlIGpzKVxuICAgICAgdmFyIG5vZGUgPSB2aXouZ2V0Tm9kZSgnbm9kZUlkJyk7XG4gICAgICAvL3NldCBzdGFydCBhbmQgZW5kIHZhbHVlc1xuICAgICAgbm9kZS5zZXRMYWJlbERhdGEoJ3NpemUnLCAxMCwgJ3N0YXJ0Jyk7XG4gICAgICBub2RlLnNldExhYmVsRGF0YSgnc2l6ZScsIDMwLCAnZW5kJyk7XG4gICAgICAvL3dpbGwgYW5pbWF0ZSBub2RlcyBsYWJlbCBzaXplXG4gICAgICB2aXouZnguYW5pbWF0ZSh7XG4gICAgICAgIG1vZGVzOiBbJ2xhYmVsLXByb3BlcnR5OnNpemUnXSxcbiAgICAgICAgZHVyYXRpb246IDEwMDBcbiAgICAgIH0pO1xuICAgIChlbmQgY29kZSlcbiAgICBcbiAgICBTZWUgYWxzbzpcbiAgICBcbiAgICA8QWNjZXNzb3JzLnNldERhdGE+LlxuICAgICovXG4gICAgc2V0TGFiZWxEYXRhOiBmdW5jdGlvbihwcm9wLCB2YWx1ZSwgdHlwZSkge1xuICAgICAgc2V0RGF0YUludGVybmFsLmNhbGwodGhpcywgJ2xhYmVsJywgcHJvcCwgdmFsdWUsIHR5cGUpO1xuICAgIH0sXG5cbiAgICAvKlxuICAgIE1ldGhvZDogc2V0TGFiZWxEYXRhc2V0XG5cbiAgICBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBzZXQgbXVsdGlwbGUgbGFiZWwgZGF0YSBhdCBvbmNlLlxuXG4gICAgUGFyYW1ldGVyczpcbiAgICBcbiAgICB0eXBlcyAtIChhcnJheXxzdHJpbmcpIEEgc2V0IG9mICdjdXJyZW50JywgJ2VuZCcgb3IgJ3N0YXJ0JyB2YWx1ZXMuXG4gICAgb2JqIC0gKG9iamVjdCkgQSBoYXNoIGNvbnRhaW5pbmcgdGhlIG5hbWVzIGFuZCB2YWx1ZXMgb2YgdGhlIHByb3BlcnRpZXMgdG8gYmUgYWx0ZXJlZC5cblxuICAgIFNlZSBhbHNvOlxuICAgIFxuICAgIDxBY2Nlc3NvcnMuc2V0RGF0YXNldD4uXG4gICAgKi9cbiAgICBzZXRMYWJlbERhdGFzZXQ6IGZ1bmN0aW9uKHR5cGVzLCBvYmopIHtcbiAgICAgIHR5cGVzID0gJC5zcGxhdCh0eXBlcyk7XG4gICAgICBmb3IodmFyIGF0dHIgaW4gb2JqKSB7XG4gICAgICAgIGZvcih2YXIgaT0wLCB2YWwgPSAkLnNwbGF0KG9ialthdHRyXSksIGw9dHlwZXMubGVuZ3RoOyBpPGw7IGkrKykge1xuICAgICAgICAgIHRoaXMuc2V0TGFiZWxEYXRhKGF0dHIsIHZhbFtpXSwgdHlwZXNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qXG4gICAgTWV0aG9kOiByZW1vdmVMYWJlbERhdGFcblxuICAgIFJlbW92ZSBsYWJlbCBwcm9wZXJ0aWVzIGZyb20gZGF0YS5cbiAgICBcbiAgICBQYXJhbWV0ZXJzOlxuICAgIFxuICAgIEEgdmFyaWFibGUgbnVtYmVyIG9mIGxhYmVsIHByb3BlcnR5IHN0cmluZ3MuXG5cbiAgICBTZWUgYWxzbzpcbiAgICBcbiAgICA8QWNjZXNzb3JzLnJlbW92ZURhdGE+LlxuICAgICovXG4gICAgcmVtb3ZlTGFiZWxEYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZURhdGFJbnRlcm5hbC5jYWxsKHRoaXMsICdsYWJlbCcsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgIH1cbiAgfTtcbn0pKCk7XG5cbi8qXG4gICAgIENsYXNzOiBHcmFwaC5Ob2RlXG5cbiAgICAgQSA8R3JhcGg+IG5vZGUuXG4gICAgIFxuICAgICBJbXBsZW1lbnRzOlxuICAgICBcbiAgICAgPEFjY2Vzc29ycz4gbWV0aG9kcy5cbiAgICAgXG4gICAgIFRoZSBmb2xsb3dpbmcgPEdyYXBoLlV0aWw+IG1ldGhvZHMgYXJlIGltcGxlbWVudGVkIGJ5IDxHcmFwaC5Ob2RlPlxuICAgICBcbiAgICAtIDxHcmFwaC5VdGlsLmVhY2hBZGphY2VuY3k+XG4gICAgLSA8R3JhcGguVXRpbC5lYWNoTGV2ZWw+XG4gICAgLSA8R3JhcGguVXRpbC5lYWNoU3ViZ3JhcGg+XG4gICAgLSA8R3JhcGguVXRpbC5lYWNoU3Vibm9kZT5cbiAgICAtIDxHcmFwaC5VdGlsLmFueVN1Ym5vZGU+XG4gICAgLSA8R3JhcGguVXRpbC5nZXRTdWJub2Rlcz5cbiAgICAtIDxHcmFwaC5VdGlsLmdldFBhcmVudHM+XG4gICAgLSA8R3JhcGguVXRpbC5pc0Rlc2NlbmRhbnRPZj4gICAgIFxuKi9cbkdyYXBoLk5vZGUgPSBuZXcgQ2xhc3Moe1xuICAgIFxuICBpbml0aWFsaXplOiBmdW5jdGlvbihvcHQsIGtsYXNzLCBOb2RlLCBFZGdlLCBMYWJlbCkge1xuICAgIHZhciBpbm5lck9wdGlvbnMgPSB7XG4gICAgICAnaWQnOiAnJyxcbiAgICAgICduYW1lJzogJycsXG4gICAgICAnZGF0YSc6IHt9LFxuICAgICAgJ3N0YXJ0RGF0YSc6IHt9LFxuICAgICAgJ2VuZERhdGEnOiB7fSxcbiAgICAgICdhZGphY2VuY2llcyc6IHt9LFxuXG4gICAgICAnc2VsZWN0ZWQnOiBmYWxzZSxcbiAgICAgICdkcmF3bic6IGZhbHNlLFxuICAgICAgJ2V4aXN0JzogZmFsc2UsXG5cbiAgICAgICdhbmdsZVNwYW4nOiB7XG4gICAgICAgICdiZWdpbic6IDAsXG4gICAgICAgICdlbmQnIDogMFxuICAgICAgfSxcblxuICAgICAgJ3Bvcyc6IG5ldyBrbGFzcyxcbiAgICAgICdzdGFydFBvcyc6IG5ldyBrbGFzcyxcbiAgICAgICdlbmRQb3MnOiBuZXcga2xhc3NcbiAgICB9O1xuICAgIFxuICAgICQuZXh0ZW5kKHRoaXMsICQuZXh0ZW5kKGlubmVyT3B0aW9ucywgb3B0KSk7XG4gICAgdGhpcy5Db25maWcgPSB0aGlzLk5vZGUgPSBOb2RlO1xuICAgIHRoaXMuRWRnZSA9IEVkZ2U7XG4gICAgdGhpcy5MYWJlbCA9IExhYmVsO1xuICB9LFxuXG4gICAgLypcbiAgICAgICBNZXRob2Q6IGFkamFjZW50VG9cbiAgICBcbiAgICAgICBJbmRpY2F0ZXMgaWYgdGhlIG5vZGUgaXMgYWRqYWNlbnQgdG8gdGhlIG5vZGUgc3BlY2lmaWVkIGJ5IGlkXG5cbiAgICAgICBQYXJhbWV0ZXJzOlxuICAgIFxuICAgICAgICAgIGlkIC0gKHN0cmluZykgQSBub2RlIGlkLlxuICAgIFxuICAgICAgIEV4YW1wbGU6XG4gICAgICAgKHN0YXJ0IGNvZGUganMpXG4gICAgICAgIG5vZGUuYWRqYWNlbnRUbygnbm9kZUlkJykgPT0gdHJ1ZTtcbiAgICAgICAoZW5kIGNvZGUpXG4gICAgKi9cbiAgICBhZGphY2VudFRvOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmlkIGluIHRoaXMuYWRqYWNlbmNpZXM7XG4gICAgfSxcblxuICAgIC8qXG4gICAgICAgTWV0aG9kOiBnZXRBZGphY2VuY3lcbiAgICBcbiAgICAgICBSZXR1cm5zIGEgPEdyYXBoLkFkamFjZW5jZT4gb2JqZWN0IGNvbm5lY3RpbmcgdGhlIGN1cnJlbnQgPEdyYXBoLk5vZGU+IGFuZCB0aGUgbm9kZSBoYXZpbmcgKmlkKiBhcyBpZC5cblxuICAgICAgIFBhcmFtZXRlcnM6XG4gICAgXG4gICAgICAgICAgaWQgLSAoc3RyaW5nKSBBIG5vZGUgaWQuXG4gICAgKi8gIFxuICAgIGdldEFkamFjZW5jeTogZnVuY3Rpb24oaWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRqYWNlbmNpZXNbaWRdO1xuICAgIH0sXG5cbiAgICAvKlxuICAgICAgTWV0aG9kOiBnZXRQb3NcbiAgIFxuICAgICAgUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIG5vZGUuXG4gIFxuICAgICAgUGFyYW1ldGVyczpcbiAgIFxuICAgICAgICAgdHlwZSAtIChzdHJpbmcpIERlZmF1bHQncyAqY3VycmVudCouIFBvc3NpYmxlIHZhbHVlcyBhcmUgXCJzdGFydFwiLCBcImVuZFwiIG9yIFwiY3VycmVudFwiLlxuICAgXG4gICAgICBSZXR1cm5zOlxuICAgXG4gICAgICAgIEEgPENvbXBsZXg+IG9yIDxQb2xhcj4gaW5zdGFuY2UuXG4gIFxuICAgICAgRXhhbXBsZTpcbiAgICAgIChzdGFydCBjb2RlIGpzKVxuICAgICAgIHZhciBwb3MgPSBub2RlLmdldFBvcygnZW5kJyk7XG4gICAgICAoZW5kIGNvZGUpXG4gICAqL1xuICAgZ2V0UG9zOiBmdW5jdGlvbih0eXBlKSB7XG4gICAgICAgdHlwZSA9IHR5cGUgfHwgXCJjdXJyZW50XCI7XG4gICAgICAgaWYodHlwZSA9PSBcImN1cnJlbnRcIikge1xuICAgICAgICAgcmV0dXJuIHRoaXMucG9zO1xuICAgICAgIH0gZWxzZSBpZih0eXBlID09IFwiZW5kXCIpIHtcbiAgICAgICAgIHJldHVybiB0aGlzLmVuZFBvcztcbiAgICAgICB9IGVsc2UgaWYodHlwZSA9PSBcInN0YXJ0XCIpIHtcbiAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0UG9zO1xuICAgICAgIH1cbiAgIH0sXG4gICAvKlxuICAgICBNZXRob2Q6IHNldFBvc1xuICBcbiAgICAgU2V0cyB0aGUgbm9kZSdzIHBvc2l0aW9uLlxuICBcbiAgICAgUGFyYW1ldGVyczpcbiAgXG4gICAgICAgIHZhbHVlIC0gKG9iamVjdCkgQSA8Q29tcGxleD4gb3IgPFBvbGFyPiBpbnN0YW5jZS5cbiAgICAgICAgdHlwZSAtIChzdHJpbmcpIERlZmF1bHQncyAqY3VycmVudCouIFBvc3NpYmxlIHZhbHVlcyBhcmUgXCJzdGFydFwiLCBcImVuZFwiIG9yIFwiY3VycmVudFwiLlxuICBcbiAgICAgRXhhbXBsZTpcbiAgICAgKHN0YXJ0IGNvZGUganMpXG4gICAgICBub2RlLnNldFBvcyhuZXcgJGppdC5Db21wbGV4KDAsIDApLCAnZW5kJyk7XG4gICAgIChlbmQgY29kZSlcbiAgKi9cbiAgc2V0UG9zOiBmdW5jdGlvbih2YWx1ZSwgdHlwZSkge1xuICAgICAgdHlwZSA9IHR5cGUgfHwgXCJjdXJyZW50XCI7XG4gICAgICB2YXIgcG9zO1xuICAgICAgaWYodHlwZSA9PSBcImN1cnJlbnRcIikge1xuICAgICAgICBwb3MgPSB0aGlzLnBvcztcbiAgICAgIH0gZWxzZSBpZih0eXBlID09IFwiZW5kXCIpIHtcbiAgICAgICAgcG9zID0gdGhpcy5lbmRQb3M7XG4gICAgICB9IGVsc2UgaWYodHlwZSA9PSBcInN0YXJ0XCIpIHtcbiAgICAgICAgcG9zID0gdGhpcy5zdGFydFBvcztcbiAgICAgIH1cbiAgICAgIHBvcy5zZXQodmFsdWUpO1xuICB9XG59KTtcblxuR3JhcGguTm9kZS5pbXBsZW1lbnQoQWNjZXNzb3JzKTtcblxuLypcbiAgICAgQ2xhc3M6IEdyYXBoLkFkamFjZW5jZVxuXG4gICAgIEEgPEdyYXBoPiBhZGphY2VuY2UgKG9yIGVkZ2UpIGNvbm5lY3RpbmcgdHdvIDxHcmFwaC5Ob2Rlcz4uXG4gICAgIFxuICAgICBJbXBsZW1lbnRzOlxuICAgICBcbiAgICAgPEFjY2Vzc29ycz4gbWV0aG9kcy5cblxuICAgICBTZWUgYWxzbzpcblxuICAgICA8R3JhcGg+LCA8R3JhcGguTm9kZT5cblxuICAgICBQcm9wZXJ0aWVzOlxuICAgICBcbiAgICAgIG5vZGVGcm9tIC0gQSA8R3JhcGguTm9kZT4gY29ubmVjdGVkIGJ5IHRoaXMgZWRnZS5cbiAgICAgIG5vZGVUbyAtIEFub3RoZXIgIDxHcmFwaC5Ob2RlPiBjb25uZWN0ZWQgYnkgdGhpcyBlZGdlLlxuICAgICAgZGF0YSAtIE5vZGUgZGF0YSBwcm9wZXJ0eSBjb250YWluaW5nIGEgaGFzaCAoaS5lIHt9KSB3aXRoIGN1c3RvbSBvcHRpb25zLlxuKi9cbkdyYXBoLkFkamFjZW5jZSA9IG5ldyBDbGFzcyh7XG4gIFxuICBpbml0aWFsaXplOiBmdW5jdGlvbihub2RlRnJvbSwgbm9kZVRvLCBkYXRhLCBFZGdlLCBMYWJlbCkge1xuICAgIHRoaXMubm9kZUZyb20gPSBub2RlRnJvbTtcbiAgICB0aGlzLm5vZGVUbyA9IG5vZGVUbztcbiAgICB0aGlzLmRhdGEgPSBkYXRhIHx8IHt9O1xuICAgIHRoaXMuc3RhcnREYXRhID0ge307XG4gICAgdGhpcy5lbmREYXRhID0ge307XG4gICAgdGhpcy5Db25maWcgPSB0aGlzLkVkZ2UgPSBFZGdlO1xuICAgIHRoaXMuTGFiZWwgPSBMYWJlbDtcbiAgfVxufSk7XG5cbkdyYXBoLkFkamFjZW5jZS5pbXBsZW1lbnQoQWNjZXNzb3JzKTtcblxuLypcbiAgIE9iamVjdDogR3JhcGguVXRpbFxuXG4gICA8R3JhcGg+IHRyYXZlcnNhbCBhbmQgcHJvY2Vzc2luZyB1dGlsaXR5IG9iamVjdC5cbiAgIFxuICAgTm90ZTpcbiAgIFxuICAgRm9yIHlvdXIgY29udmVuaWVuY2Ugc29tZSBvZiB0aGVzZSBtZXRob2RzIGhhdmUgYWxzbyBiZWVuIGFwcGVuZGVkIHRvIDxHcmFwaD4gYW5kIDxHcmFwaC5Ob2RlPiBjbGFzc2VzLlxuKi9cbkdyYXBoLlV0aWwgPSB7XG4gICAgLypcbiAgICAgICBmaWx0ZXJcbiAgICBcbiAgICAgICBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuIFByb3ZpZGVzIGEgZmlsdGVyaW5nIGZ1bmN0aW9uIGJhc2VkIG9uIGZsYWdzLlxuICAgICovXG4gICAgZmlsdGVyOiBmdW5jdGlvbihwYXJhbSkge1xuICAgICAgICBpZighcGFyYW0gfHwgISgkLnR5cGUocGFyYW0pID09ICdzdHJpbmcnKSkgcmV0dXJuIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZTsgfTtcbiAgICAgICAgdmFyIHByb3BzID0gcGFyYW0uc3BsaXQoXCIgXCIpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oZWxlbSkge1xuICAgICAgICAgICAgZm9yKHZhciBpPTA7IGk8cHJvcHMubGVuZ3RoOyBpKyspIHsgXG4gICAgICAgICAgICAgIGlmKGVsZW1bcHJvcHNbaV1dKSB7IFxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuICAgIH0sXG4gICAgLypcbiAgICAgICBNZXRob2Q6IGdldE5vZGVcbiAgICBcbiAgICAgICBSZXR1cm5zIGEgPEdyYXBoLk5vZGU+IGJ5ICppZCouXG4gICAgICAgXG4gICAgICAgQWxzbyBpbXBsZW1lbnRlZCBieTpcbiAgICAgICBcbiAgICAgICA8R3JhcGg+XG5cbiAgICAgICBQYXJhbWV0ZXJzOlxuXG4gICAgICAgZ3JhcGggLSAob2JqZWN0KSBBIDxHcmFwaD4gaW5zdGFuY2UuXG4gICAgICAgaWQgLSAoc3RyaW5nKSBBIDxHcmFwaC5Ob2RlPiBpZC5cblxuICAgICAgIEV4YW1wbGU6XG5cbiAgICAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgICAgICRqaXQuR3JhcGguVXRpbC5nZXROb2RlKGdyYXBoLCAnbm9kZWlkJyk7XG4gICAgICAgICAvL29yLi4uXG4gICAgICAgICBncmFwaC5nZXROb2RlKCdub2RlaWQnKTtcbiAgICAgICAoZW5kIGNvZGUpXG4gICAgKi9cbiAgICBnZXROb2RlOiBmdW5jdGlvbihncmFwaCwgaWQpIHtcbiAgICAgICAgcmV0dXJuIGdyYXBoLm5vZGVzW2lkXTtcbiAgICB9LFxuICAgIFxuICAgIC8qXG4gICAgICAgTWV0aG9kOiBlYWNoTm9kZVxuICAgIFxuICAgICAgIEl0ZXJhdGVzIG92ZXIgPEdyYXBoPiBub2RlcyBwZXJmb3JtaW5nIGFuICphY3Rpb24qLlxuICAgICAgIFxuICAgICAgIEFsc28gaW1wbGVtZW50ZWQgYnk6XG4gICAgICAgXG4gICAgICAgPEdyYXBoPi5cblxuICAgICAgIFBhcmFtZXRlcnM6XG5cbiAgICAgICBncmFwaCAtIChvYmplY3QpIEEgPEdyYXBoPiBpbnN0YW5jZS5cbiAgICAgICBhY3Rpb24gLSAoZnVuY3Rpb24pIEEgY2FsbGJhY2sgZnVuY3Rpb24gaGF2aW5nIGEgPEdyYXBoLk5vZGU+IGFzIGZpcnN0IGZvcm1hbCBwYXJhbWV0ZXIuXG5cbiAgICAgICBFeGFtcGxlOlxuICAgICAgIChzdGFydCBjb2RlIGpzKVxuICAgICAgICAgJGppdC5HcmFwaC5VdGlsLmVhY2hOb2RlKGdyYXBoLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgYWxlcnQobm9kZS5uYW1lKTtcbiAgICAgICAgIH0pO1xuICAgICAgICAgLy9vci4uLlxuICAgICAgICAgZ3JhcGguZWFjaE5vZGUoZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICBhbGVydChub2RlLm5hbWUpO1xuICAgICAgICAgfSk7XG4gICAgICAgKGVuZCBjb2RlKVxuICAgICovXG4gICAgZWFjaE5vZGU6IGZ1bmN0aW9uKGdyYXBoLCBhY3Rpb24sIGZsYWdzKSB7XG4gICAgICAgIHZhciBmaWx0ZXIgPSB0aGlzLmZpbHRlcihmbGFncyk7XG4gICAgICAgIGZvcih2YXIgaSBpbiBncmFwaC5ub2Rlcykge1xuICAgICAgICAgIGlmKGZpbHRlcihncmFwaC5ub2Rlc1tpXSkpIGFjdGlvbihncmFwaC5ub2Rlc1tpXSk7XG4gICAgICAgIH0gXG4gICAgfSxcbiAgICBcbiAgICAvKlxuICAgICAgTWV0aG9kOiBlYWNoXG4gICBcbiAgICAgIEl0ZXJhdGVzIG92ZXIgPEdyYXBoPiBub2RlcyBwZXJmb3JtaW5nIGFuICphY3Rpb24qLiBJdCdzIGFuIGFsaWFzIGZvciA8R3JhcGguVXRpbC5lYWNoTm9kZT4uXG4gICAgICBcbiAgICAgIEFsc28gaW1wbGVtZW50ZWQgYnk6XG4gICAgICBcbiAgICAgIDxHcmFwaD4uXG4gIFxuICAgICAgUGFyYW1ldGVyczpcbiAgXG4gICAgICBncmFwaCAtIChvYmplY3QpIEEgPEdyYXBoPiBpbnN0YW5jZS5cbiAgICAgIGFjdGlvbiAtIChmdW5jdGlvbikgQSBjYWxsYmFjayBmdW5jdGlvbiBoYXZpbmcgYSA8R3JhcGguTm9kZT4gYXMgZmlyc3QgZm9ybWFsIHBhcmFtZXRlci5cbiAgXG4gICAgICBFeGFtcGxlOlxuICAgICAgKHN0YXJ0IGNvZGUganMpXG4gICAgICAgICRqaXQuR3JhcGguVXRpbC5lYWNoKGdyYXBoLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICBhbGVydChub2RlLm5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy9vci4uLlxuICAgICAgICBncmFwaC5lYWNoKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICBhbGVydChub2RlLm5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgIChlbmQgY29kZSlcbiAgICovXG4gICBlYWNoOiBmdW5jdGlvbihncmFwaCwgYWN0aW9uLCBmbGFncykge1xuICAgICAgdGhpcy5lYWNoTm9kZShncmFwaCwgYWN0aW9uLCBmbGFncyk7IFxuICAgfSxcblxuIC8qXG4gICAgICAgTWV0aG9kOiBlYWNoQWRqYWNlbmN5XG4gICAgXG4gICAgICAgSXRlcmF0ZXMgb3ZlciA8R3JhcGguTm9kZT4gYWRqYWNlbmNpZXMgYXBwbHlpbmcgdGhlICphY3Rpb24qIGZ1bmN0aW9uLlxuICAgICAgIFxuICAgICAgIEFsc28gaW1wbGVtZW50ZWQgYnk6XG4gICAgICAgXG4gICAgICAgPEdyYXBoLk5vZGU+LlxuXG4gICAgICAgUGFyYW1ldGVyczpcblxuICAgICAgIG5vZGUgLSAob2JqZWN0KSBBIDxHcmFwaC5Ob2RlPi5cbiAgICAgICBhY3Rpb24gLSAoZnVuY3Rpb24pIEEgY2FsbGJhY2sgZnVuY3Rpb24gaGF2aW5nIDxHcmFwaC5BZGphY2VuY2U+IGFzIGZpcnN0IGZvcm1hbCBwYXJhbWV0ZXIuXG5cbiAgICAgICBFeGFtcGxlOlxuICAgICAgIChzdGFydCBjb2RlIGpzKVxuICAgICAgICAgJGppdC5HcmFwaC5VdGlsLmVhY2hBZGphY2VuY3kobm9kZSwgZnVuY3Rpb24oYWRqKSB7XG4gICAgICAgICAgYWxlcnQoYWRqLm5vZGVUby5uYW1lKTtcbiAgICAgICAgIH0pO1xuICAgICAgICAgLy9vci4uLlxuICAgICAgICAgbm9kZS5lYWNoQWRqYWNlbmN5KGZ1bmN0aW9uKGFkaikge1xuICAgICAgICAgICBhbGVydChhZGoubm9kZVRvLm5hbWUpO1xuICAgICAgICAgfSk7XG4gICAgICAgKGVuZCBjb2RlKVxuICAgICovXG4gICAgZWFjaEFkamFjZW5jeTogZnVuY3Rpb24obm9kZSwgYWN0aW9uLCBmbGFncykge1xuICAgICAgICB2YXIgYWRqID0gbm9kZS5hZGphY2VuY2llcywgZmlsdGVyID0gdGhpcy5maWx0ZXIoZmxhZ3MpO1xuICAgICAgICBmb3IodmFyIGlkIGluIGFkaikge1xuICAgICAgICAgIHZhciBhID0gYWRqW2lkXTtcbiAgICAgICAgICBpZihmaWx0ZXIoYSkpIHtcbiAgICAgICAgICAgIGlmKGEubm9kZUZyb20gIT0gbm9kZSkge1xuICAgICAgICAgICAgICB2YXIgdG1wID0gYS5ub2RlRnJvbTtcbiAgICAgICAgICAgICAgYS5ub2RlRnJvbSA9IGEubm9kZVRvO1xuICAgICAgICAgICAgICBhLm5vZGVUbyA9IHRtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjdGlvbihhLCBpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgICAvKlxuICAgICAgIE1ldGhvZDogY29tcHV0ZUxldmVsc1xuICAgIFxuICAgICAgIFBlcmZvcm1zIGEgQkZTIHRyYXZlcnNhbCBzZXR0aW5nIHRoZSBjb3JyZWN0IGRlcHRoIGZvciBlYWNoIG5vZGUuXG4gICAgICAgIFxuICAgICAgIEFsc28gaW1wbGVtZW50ZWQgYnk6XG4gICAgICAgXG4gICAgICAgPEdyYXBoPi5cbiAgICAgICBcbiAgICAgICBOb3RlOlxuICAgICAgIFxuICAgICAgIFRoZSBkZXB0aCBvZiBlYWNoIG5vZGUgY2FuIHRoZW4gYmUgYWNjZXNzZWQgYnkgXG4gICAgICAgPm5vZGUuX2RlcHRoXG5cbiAgICAgICBQYXJhbWV0ZXJzOlxuXG4gICAgICAgZ3JhcGggLSAob2JqZWN0KSBBIDxHcmFwaD4uXG4gICAgICAgaWQgLSAoc3RyaW5nKSBBIHN0YXJ0aW5nIG5vZGUgaWQgZm9yIHRoZSBCRlMgdHJhdmVyc2FsLlxuICAgICAgIHN0YXJ0RGVwdGggLSAob3B0aW9uYWx8bnVtYmVyKSBBIG1pbmltdW0gZGVwdGggdmFsdWUuIERlZmF1bHQncyAwLlxuXG4gICAgKi9cbiAgICBjb21wdXRlTGV2ZWxzOiBmdW5jdGlvbihncmFwaCwgaWQsIHN0YXJ0RGVwdGgsIGZsYWdzKSB7XG4gICAgICAgIHN0YXJ0RGVwdGggPSBzdGFydERlcHRoIHx8IDA7XG4gICAgICAgIHZhciBmaWx0ZXIgPSB0aGlzLmZpbHRlcihmbGFncyk7XG4gICAgICAgIHRoaXMuZWFjaE5vZGUoZ3JhcGgsIGZ1bmN0aW9uKGVsZW0pIHtcbiAgICAgICAgICAgIGVsZW0uX2ZsYWcgPSBmYWxzZTtcbiAgICAgICAgICAgIGVsZW0uX2RlcHRoID0gLTE7XG4gICAgICAgIH0sIGZsYWdzKTtcbiAgICAgICAgdmFyIHJvb3QgPSBncmFwaC5nZXROb2RlKGlkKTtcbiAgICAgICAgcm9vdC5fZGVwdGggPSBzdGFydERlcHRoO1xuICAgICAgICB2YXIgcXVldWUgPSBbcm9vdF07XG4gICAgICAgIHdoaWxlKHF1ZXVlLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IHF1ZXVlLnBvcCgpO1xuICAgICAgICAgICAgbm9kZS5fZmxhZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmVhY2hBZGphY2VuY3kobm9kZSwgZnVuY3Rpb24oYWRqKSB7XG4gICAgICAgICAgICAgICAgdmFyIG4gPSBhZGoubm9kZVRvO1xuICAgICAgICAgICAgICAgIGlmKG4uX2ZsYWcgPT0gZmFsc2UgJiYgZmlsdGVyKG4pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKG4uX2RlcHRoIDwgMCkgbi5fZGVwdGggPSBub2RlLl9kZXB0aCArIDEgKyBzdGFydERlcHRoO1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZS51bnNoaWZ0KG4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGZsYWdzKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKlxuICAgICAgIE1ldGhvZDogZWFjaEJGU1xuICAgIFxuICAgICAgIFBlcmZvcm1zIGEgQkZTIHRyYXZlcnNhbCBhcHBseWluZyAqYWN0aW9uKiB0byBlYWNoIDxHcmFwaC5Ob2RlPi5cbiAgICAgICBcbiAgICAgICBBbHNvIGltcGxlbWVudGVkIGJ5OlxuICAgICAgIFxuICAgICAgIDxHcmFwaD4uXG5cbiAgICAgICBQYXJhbWV0ZXJzOlxuXG4gICAgICAgZ3JhcGggLSAob2JqZWN0KSBBIDxHcmFwaD4uXG4gICAgICAgaWQgLSAoc3RyaW5nKSBBIHN0YXJ0aW5nIG5vZGUgaWQgZm9yIHRoZSBCRlMgdHJhdmVyc2FsLlxuICAgICAgIGFjdGlvbiAtIChmdW5jdGlvbikgQSBjYWxsYmFjayBmdW5jdGlvbiBoYXZpbmcgYSA8R3JhcGguTm9kZT4gYXMgZmlyc3QgZm9ybWFsIHBhcmFtZXRlci5cblxuICAgICAgIEV4YW1wbGU6XG4gICAgICAgKHN0YXJ0IGNvZGUganMpXG4gICAgICAgICAkaml0LkdyYXBoLlV0aWwuZWFjaEJGUyhncmFwaCwgJ215bm9kZWlkJywgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgIGFsZXJ0KG5vZGUubmFtZSk7XG4gICAgICAgICB9KTtcbiAgICAgICAgIC8vb3IuLi5cbiAgICAgICAgIGdyYXBoLmVhY2hCRlMoJ215bm9kZWlkJywgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICBhbGVydChub2RlLm5hbWUpO1xuICAgICAgICAgfSk7XG4gICAgICAgKGVuZCBjb2RlKVxuICAgICovXG4gICAgZWFjaEJGUzogZnVuY3Rpb24oZ3JhcGgsIGlkLCBhY3Rpb24sIGZsYWdzKSB7XG4gICAgICAgIHZhciBmaWx0ZXIgPSB0aGlzLmZpbHRlcihmbGFncyk7XG4gICAgICAgIHRoaXMuY2xlYW4oZ3JhcGgpO1xuICAgICAgICB2YXIgcXVldWUgPSBbZ3JhcGguZ2V0Tm9kZShpZCldO1xuICAgICAgICB3aGlsZShxdWV1ZS5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSBxdWV1ZS5wb3AoKTtcbiAgICAgICAgICAgIG5vZGUuX2ZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgYWN0aW9uKG5vZGUsIG5vZGUuX2RlcHRoKTtcbiAgICAgICAgICAgIHRoaXMuZWFjaEFkamFjZW5jeShub2RlLCBmdW5jdGlvbihhZGopIHtcbiAgICAgICAgICAgICAgICB2YXIgbiA9IGFkai5ub2RlVG87XG4gICAgICAgICAgICAgICAgaWYobi5fZmxhZyA9PSBmYWxzZSAmJiBmaWx0ZXIobikpIHtcbiAgICAgICAgICAgICAgICAgICAgbi5fZmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLnVuc2hpZnQobik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZmxhZ3MpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBcbiAgICAvKlxuICAgICAgIE1ldGhvZDogZWFjaExldmVsXG4gICAgXG4gICAgICAgSXRlcmF0ZXMgb3ZlciBhIG5vZGUncyBzdWJncmFwaCBhcHBseWluZyAqYWN0aW9uKiB0byB0aGUgbm9kZXMgb2YgcmVsYXRpdmUgZGVwdGggYmV0d2VlbiAqbGV2ZWxCZWdpbiogYW5kICpsZXZlbEVuZCouXG4gICAgICAgXG4gICAgICAgQWxzbyBpbXBsZW1lbnRlZCBieTpcbiAgICAgICBcbiAgICAgICA8R3JhcGguTm9kZT4uXG5cbiAgICAgICBQYXJhbWV0ZXJzOlxuICAgICAgIFxuICAgICAgIG5vZGUgLSAob2JqZWN0KSBBIDxHcmFwaC5Ob2RlPi5cbiAgICAgICBsZXZlbEJlZ2luIC0gKG51bWJlcikgQSByZWxhdGl2ZSBsZXZlbCB2YWx1ZS5cbiAgICAgICBsZXZlbEVuZCAtIChudW1iZXIpIEEgcmVsYXRpdmUgbGV2ZWwgdmFsdWUuXG4gICAgICAgYWN0aW9uIC0gKGZ1bmN0aW9uKSBBIGNhbGxiYWNrIGZ1bmN0aW9uIGhhdmluZyBhIDxHcmFwaC5Ob2RlPiBhcyBmaXJzdCBmb3JtYWwgcGFyYW1ldGVyLlxuXG4gICAgKi9cbiAgICBlYWNoTGV2ZWw6IGZ1bmN0aW9uKG5vZGUsIGxldmVsQmVnaW4sIGxldmVsRW5kLCBhY3Rpb24sIGZsYWdzKSB7XG4gICAgICAgIHZhciBkID0gbm9kZS5fZGVwdGgsIGZpbHRlciA9IHRoaXMuZmlsdGVyKGZsYWdzKSwgdGhhdCA9IHRoaXM7XG4gICAgICAgIGxldmVsRW5kID0gbGV2ZWxFbmQgPT09IGZhbHNlPyBOdW1iZXIuTUFYX1ZBTFVFIC1kIDogbGV2ZWxFbmQ7XG4gICAgICAgIChmdW5jdGlvbiBsb29wTGV2ZWwobm9kZSwgbGV2ZWxCZWdpbiwgbGV2ZWxFbmQpIHtcbiAgICAgICAgICAgIHZhciBkID0gbm9kZS5fZGVwdGg7XG4gICAgICAgICAgICBpZihkID49IGxldmVsQmVnaW4gJiYgZCA8PSBsZXZlbEVuZCAmJiBmaWx0ZXIobm9kZSkpIGFjdGlvbihub2RlLCBkKTtcbiAgICAgICAgICAgIGlmKGQgPCBsZXZlbEVuZCkge1xuICAgICAgICAgICAgICAgIHRoYXQuZWFjaEFkamFjZW5jeShub2RlLCBmdW5jdGlvbihhZGopIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhZGoubm9kZVRvO1xuICAgICAgICAgICAgICAgICAgICBpZihuLl9kZXB0aCA+IGQpIGxvb3BMZXZlbChuLCBsZXZlbEJlZ2luLCBsZXZlbEVuZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKG5vZGUsIGxldmVsQmVnaW4gKyBkLCBsZXZlbEVuZCArIGQpOyAgICAgIFxuICAgIH0sXG5cbiAgICAvKlxuICAgICAgIE1ldGhvZDogZWFjaFN1YmdyYXBoXG4gICAgXG4gICAgICAgSXRlcmF0ZXMgb3ZlciBhIG5vZGUncyBjaGlsZHJlbiByZWN1cnNpdmVseS5cbiAgICAgICBcbiAgICAgICBBbHNvIGltcGxlbWVudGVkIGJ5OlxuICAgICAgIFxuICAgICAgIDxHcmFwaC5Ob2RlPi5cblxuICAgICAgIFBhcmFtZXRlcnM6XG4gICAgICAgbm9kZSAtIChvYmplY3QpIEEgPEdyYXBoLk5vZGU+LlxuICAgICAgIGFjdGlvbiAtIChmdW5jdGlvbikgQSBjYWxsYmFjayBmdW5jdGlvbiBoYXZpbmcgYSA8R3JhcGguTm9kZT4gYXMgZmlyc3QgZm9ybWFsIHBhcmFtZXRlci5cblxuICAgICAgIEV4YW1wbGU6XG4gICAgICAgKHN0YXJ0IGNvZGUganMpXG4gICAgICAgICAkaml0LkdyYXBoLlV0aWwuZWFjaFN1YmdyYXBoKG5vZGUsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgYWxlcnQobm9kZS5uYW1lKTtcbiAgICAgICAgIH0pO1xuICAgICAgICAgLy9vci4uLlxuICAgICAgICAgbm9kZS5lYWNoU3ViZ3JhcGgoZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICBhbGVydChub2RlLm5hbWUpO1xuICAgICAgICAgfSk7XG4gICAgICAgKGVuZCBjb2RlKVxuICAgICovXG4gICAgZWFjaFN1YmdyYXBoOiBmdW5jdGlvbihub2RlLCBhY3Rpb24sIGZsYWdzKSB7XG4gICAgICB0aGlzLmVhY2hMZXZlbChub2RlLCAwLCBmYWxzZSwgYWN0aW9uLCBmbGFncyk7XG4gICAgfSxcblxuICAgIC8qXG4gICAgICAgTWV0aG9kOiBlYWNoU3Vibm9kZVxuICAgIFxuICAgICAgIEl0ZXJhdGVzIG92ZXIgYSBub2RlJ3MgY2hpbGRyZW4gKHdpdGhvdXQgZGVlcGVyIHJlY3Vyc2lvbikuXG4gICAgICAgXG4gICAgICAgQWxzbyBpbXBsZW1lbnRlZCBieTpcbiAgICAgICBcbiAgICAgICA8R3JhcGguTm9kZT4uXG4gICAgICAgXG4gICAgICAgUGFyYW1ldGVyczpcbiAgICAgICBub2RlIC0gKG9iamVjdCkgQSA8R3JhcGguTm9kZT4uXG4gICAgICAgYWN0aW9uIC0gKGZ1bmN0aW9uKSBBIGNhbGxiYWNrIGZ1bmN0aW9uIGhhdmluZyBhIDxHcmFwaC5Ob2RlPiBhcyBmaXJzdCBmb3JtYWwgcGFyYW1ldGVyLlxuXG4gICAgICAgRXhhbXBsZTpcbiAgICAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgICAgICRqaXQuR3JhcGguVXRpbC5lYWNoU3Vibm9kZShub2RlLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgYWxlcnQobm9kZS5uYW1lKTtcbiAgICAgICAgIH0pO1xuICAgICAgICAgLy9vci4uLlxuICAgICAgICAgbm9kZS5lYWNoU3Vibm9kZShmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgIGFsZXJ0KG5vZGUubmFtZSk7XG4gICAgICAgICB9KTtcbiAgICAgICAoZW5kIGNvZGUpXG4gICAgKi9cbiAgICBlYWNoU3Vibm9kZTogZnVuY3Rpb24obm9kZSwgYWN0aW9uLCBmbGFncykge1xuICAgICAgICB0aGlzLmVhY2hMZXZlbChub2RlLCAxLCAxLCBhY3Rpb24sIGZsYWdzKTtcbiAgICB9LFxuXG4gICAgLypcbiAgICAgICBNZXRob2Q6IGFueVN1Ym5vZGVcbiAgICBcbiAgICAgICBSZXR1cm5zICp0cnVlKiBpZiBhbnkgc3Vibm9kZSBtYXRjaGVzIHRoZSBnaXZlbiBjb25kaXRpb24uXG4gICAgICAgXG4gICAgICAgQWxzbyBpbXBsZW1lbnRlZCBieTpcbiAgICAgICBcbiAgICAgICA8R3JhcGguTm9kZT4uXG5cbiAgICAgICBQYXJhbWV0ZXJzOlxuICAgICAgIG5vZGUgLSAob2JqZWN0KSBBIDxHcmFwaC5Ob2RlPi5cbiAgICAgICBjb25kIC0gKGZ1bmN0aW9uKSBBIGNhbGxiYWNrIGZ1bmN0aW9uIHJldHVybmluZyBhIEJvb2xlYW4gaW5zdGFuY2UuIFRoaXMgZnVuY3Rpb24gaGFzIGFzIGZpcnN0IGZvcm1hbCBwYXJhbWV0ZXIgYSA8R3JhcGguTm9kZT4uXG5cbiAgICAgICBFeGFtcGxlOlxuICAgICAgIChzdGFydCBjb2RlIGpzKVxuICAgICAgICAgJGppdC5HcmFwaC5VdGlsLmFueVN1Ym5vZGUobm9kZSwgZnVuY3Rpb24obm9kZSkgeyByZXR1cm4gbm9kZS5uYW1lID09IFwibXlub2RlbmFtZVwiOyB9KTtcbiAgICAgICAgIC8vb3IuLi5cbiAgICAgICAgIG5vZGUuYW55U3Vibm9kZShmdW5jdGlvbihub2RlKSB7IHJldHVybiBub2RlLm5hbWUgPT0gJ215bm9kZW5hbWUnOyB9KTtcbiAgICAgICAoZW5kIGNvZGUpXG4gICAgKi9cbiAgICBhbnlTdWJub2RlOiBmdW5jdGlvbihub2RlLCBjb25kLCBmbGFncykge1xuICAgICAgdmFyIGZsYWcgPSBmYWxzZTtcbiAgICAgIGNvbmQgPSBjb25kIHx8ICQubGFtYmRhKHRydWUpO1xuICAgICAgdmFyIGMgPSAkLnR5cGUoY29uZCkgPT0gJ3N0cmluZyc/IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG5bY29uZF07IH0gOiBjb25kO1xuICAgICAgdGhpcy5lYWNoU3Vibm9kZShub2RlLCBmdW5jdGlvbihlbGVtKSB7XG4gICAgICAgIGlmKGMoZWxlbSkpIGZsYWcgPSB0cnVlO1xuICAgICAgfSwgZmxhZ3MpO1xuICAgICAgcmV0dXJuIGZsYWc7XG4gICAgfSxcbiAgXG4gICAgLypcbiAgICAgICBNZXRob2Q6IGdldFN1Ym5vZGVzXG4gICAgXG4gICAgICAgQ29sbGVjdHMgYWxsIHN1Ym5vZGVzIGZvciBhIHNwZWNpZmllZCBub2RlLiBcbiAgICAgICBUaGUgKmxldmVsKiBwYXJhbWV0ZXIgZmlsdGVycyBub2RlcyBoYXZpbmcgcmVsYXRpdmUgZGVwdGggb2YgKmxldmVsKiBmcm9tIHRoZSByb290IG5vZGUuIFxuICAgICAgIFxuICAgICAgIEFsc28gaW1wbGVtZW50ZWQgYnk6XG4gICAgICAgXG4gICAgICAgPEdyYXBoLk5vZGU+LlxuXG4gICAgICAgUGFyYW1ldGVyczpcbiAgICAgICBub2RlIC0gKG9iamVjdCkgQSA8R3JhcGguTm9kZT4uXG4gICAgICAgbGV2ZWwgLSAob3B0aW9uYWx8bnVtYmVyKSBEZWZhdWx0J3MgKjAqLiBBIHN0YXJ0aW5nIHJlbGF0aXZlIGRlcHRoIGZvciBjb2xsZWN0aW5nIG5vZGVzLlxuXG4gICAgICAgUmV0dXJuczpcbiAgICAgICBBbiBhcnJheSBvZiBub2Rlcy5cblxuICAgICovXG4gICAgZ2V0U3Vibm9kZXM6IGZ1bmN0aW9uKG5vZGUsIGxldmVsLCBmbGFncykge1xuICAgICAgICB2YXIgYW5zID0gW10sIHRoYXQgPSB0aGlzO1xuICAgICAgICBsZXZlbCA9IGxldmVsIHx8IDA7XG4gICAgICAgIHZhciBsZXZlbFN0YXJ0LCBsZXZlbEVuZDtcbiAgICAgICAgaWYoJC50eXBlKGxldmVsKSA9PSAnYXJyYXknKSB7XG4gICAgICAgICAgICBsZXZlbFN0YXJ0ID0gbGV2ZWxbMF07XG4gICAgICAgICAgICBsZXZlbEVuZCA9IGxldmVsWzFdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV2ZWxTdGFydCA9IGxldmVsO1xuICAgICAgICAgICAgbGV2ZWxFbmQgPSBOdW1iZXIuTUFYX1ZBTFVFIC0gbm9kZS5fZGVwdGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lYWNoTGV2ZWwobm9kZSwgbGV2ZWxTdGFydCwgbGV2ZWxFbmQsIGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgICAgIGFucy5wdXNoKG4pO1xuICAgICAgICB9LCBmbGFncyk7XG4gICAgICAgIHJldHVybiBhbnM7XG4gICAgfSxcbiAgXG4gIFxuICAgIC8qXG4gICAgICAgTWV0aG9kOiBnZXRQYXJlbnRzXG4gICAgXG4gICAgICAgUmV0dXJucyBhbiBBcnJheSBvZiA8R3JhcGguTm9kZXM+IHdoaWNoIGFyZSBwYXJlbnRzIG9mIHRoZSBnaXZlbiBub2RlLlxuICAgICAgIFxuICAgICAgIEFsc28gaW1wbGVtZW50ZWQgYnk6XG4gICAgICAgXG4gICAgICAgPEdyYXBoLk5vZGU+LlxuXG4gICAgICAgUGFyYW1ldGVyczpcbiAgICAgICBub2RlIC0gKG9iamVjdCkgQSA8R3JhcGguTm9kZT4uXG5cbiAgICAgICBSZXR1cm5zOlxuICAgICAgIEFuIEFycmF5IG9mIDxHcmFwaC5Ob2Rlcz4uXG5cbiAgICAgICBFeGFtcGxlOlxuICAgICAgIChzdGFydCBjb2RlIGpzKVxuICAgICAgICAgdmFyIHBhcnMgPSAkaml0LkdyYXBoLlV0aWwuZ2V0UGFyZW50cyhub2RlKTtcbiAgICAgICAgIC8vb3IuLi5cbiAgICAgICAgIHZhciBwYXJzID0gbm9kZS5nZXRQYXJlbnRzKCk7XG4gICAgICAgICBcbiAgICAgICAgIGlmKHBhcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAvL2RvIHN0dWZmIHdpdGggcGFyZW50c1xuICAgICAgICAgfVxuICAgICAgIChlbmQgY29kZSlcbiAgICAqL1xuICAgIGdldFBhcmVudHM6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdmFyIGFucyA9IFtdO1xuICAgICAgICB0aGlzLmVhY2hBZGphY2VuY3kobm9kZSwgZnVuY3Rpb24oYWRqKSB7XG4gICAgICAgICAgICB2YXIgbiA9IGFkai5ub2RlVG87XG4gICAgICAgICAgICBpZihuLl9kZXB0aCA8IG5vZGUuX2RlcHRoKSBhbnMucHVzaChuKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhbnM7XG4gICAgfSxcbiAgICBcbiAgICAvKlxuICAgIE1ldGhvZDogaXNEZXNjZW5kYW50T2ZcbiBcbiAgICBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHNvbWUgbm9kZSBpcyBkZXNjZW5kYW50IG9mIHRoZSBub2RlIHdpdGggdGhlIGdpdmVuIGlkLiBcblxuICAgIEFsc28gaW1wbGVtZW50ZWQgYnk6XG4gICAgXG4gICAgPEdyYXBoLk5vZGU+LlxuICAgIFxuICAgIFxuICAgIFBhcmFtZXRlcnM6XG4gICAgbm9kZSAtIChvYmplY3QpIEEgPEdyYXBoLk5vZGU+LlxuICAgIGlkIC0gKHN0cmluZykgQSA8R3JhcGguTm9kZT4gaWQuXG5cbiAgICBFeGFtcGxlOlxuICAgIChzdGFydCBjb2RlIGpzKVxuICAgICAgJGppdC5HcmFwaC5VdGlsLmlzRGVzY2VuZGFudE9mKG5vZGUsIFwibm9kZWlkXCIpOyAvL3RydWV8ZmFsc2VcbiAgICAgIC8vb3IuLi5cbiAgICAgIG5vZGUuaXNEZXNjZW5kYW50T2YoJ25vZGVpZCcpOy8vdHJ1ZXxmYWxzZVxuICAgIChlbmQgY29kZSlcbiAqL1xuIGlzRGVzY2VuZGFudE9mOiBmdW5jdGlvbihub2RlLCBpZCkge1xuICAgIGlmKG5vZGUuaWQgPT0gaWQpIHJldHVybiB0cnVlO1xuICAgIHZhciBwYXJzID0gdGhpcy5nZXRQYXJlbnRzKG5vZGUpLCBhbnMgPSBmYWxzZTtcbiAgICBmb3IgKCB2YXIgaSA9IDA7ICFhbnMgJiYgaSA8IHBhcnMubGVuZ3RoOyBpKyspIHtcbiAgICBhbnMgPSBhbnMgfHwgdGhpcy5pc0Rlc2NlbmRhbnRPZihwYXJzW2ldLCBpZCk7XG4gIH1cbiAgICByZXR1cm4gYW5zO1xuIH0sXG5cbiAvKlxuICAgICBNZXRob2Q6IGNsZWFuXG4gIFxuICAgICBDbGVhbnMgZmxhZ3MgZnJvbSBub2Rlcy5cblxuICAgICBBbHNvIGltcGxlbWVudGVkIGJ5OlxuICAgICBcbiAgICAgPEdyYXBoPi5cbiAgICAgXG4gICAgIFBhcmFtZXRlcnM6XG4gICAgIGdyYXBoIC0gQSA8R3JhcGg+IGluc3RhbmNlLlxuICAqL1xuICBjbGVhbjogZnVuY3Rpb24oZ3JhcGgpIHsgdGhpcy5lYWNoTm9kZShncmFwaCwgZnVuY3Rpb24oZWxlbSkgeyBlbGVtLl9mbGFnID0gZmFsc2U7IH0pOyB9LFxuICBcbiAgLyogXG4gICAgTWV0aG9kOiBnZXRDbG9zZXN0Tm9kZVRvT3JpZ2luIFxuICBcbiAgICBSZXR1cm5zIHRoZSBjbG9zZXN0IG5vZGUgdG8gdGhlIGNlbnRlciBvZiBjYW52YXMuXG4gIFxuICAgIEFsc28gaW1wbGVtZW50ZWQgYnk6XG4gICAgXG4gICAgPEdyYXBoPi5cbiAgICBcbiAgICBQYXJhbWV0ZXJzOlxuICAgXG4gICAgIGdyYXBoIC0gKG9iamVjdCkgQSA8R3JhcGg+IGluc3RhbmNlLlxuICAgICBwcm9wIC0gKG9wdGlvbmFsfHN0cmluZykgRGVmYXVsdCdzICdjdXJyZW50Jy4gQSA8R3JhcGguTm9kZT4gcG9zaXRpb24gcHJvcGVydHkuIFBvc3NpYmxlIHByb3BlcnRpZXMgYXJlICdzdGFydCcsICdjdXJyZW50JyBvciAnZW5kJy5cbiAgXG4gICovXG4gIGdldENsb3Nlc3ROb2RlVG9PcmlnaW46IGZ1bmN0aW9uKGdyYXBoLCBwcm9wLCBmbGFncykge1xuICAgcmV0dXJuIHRoaXMuZ2V0Q2xvc2VzdE5vZGVUb1BvcyhncmFwaCwgUG9sYXIuS0VSLCBwcm9wLCBmbGFncyk7XG4gIH0sXG4gIFxuICAvKiBcbiAgICBNZXRob2Q6IGdldENsb3Nlc3ROb2RlVG9Qb3NcbiAgXG4gICAgUmV0dXJucyB0aGUgY2xvc2VzdCBub2RlIHRvIHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgXG4gICAgQWxzbyBpbXBsZW1lbnRlZCBieTpcbiAgICBcbiAgICA8R3JhcGg+LlxuICAgIFxuICAgIFBhcmFtZXRlcnM6XG4gICBcbiAgICAgZ3JhcGggLSAob2JqZWN0KSBBIDxHcmFwaD4gaW5zdGFuY2UuXG4gICAgIHBvcyAtIChvYmplY3QpIEEgPENvbXBsZXg+IG9yIDxQb2xhcj4gaW5zdGFuY2UuXG4gICAgIHByb3AgLSAob3B0aW9uYWx8c3RyaW5nKSBEZWZhdWx0J3MgKmN1cnJlbnQqLiBBIDxHcmFwaC5Ob2RlPiBwb3NpdGlvbiBwcm9wZXJ0eS4gUG9zc2libGUgcHJvcGVydGllcyBhcmUgJ3N0YXJ0JywgJ2N1cnJlbnQnIG9yICdlbmQnLlxuICBcbiAgKi9cbiAgZ2V0Q2xvc2VzdE5vZGVUb1BvczogZnVuY3Rpb24oZ3JhcGgsIHBvcywgcHJvcCwgZmxhZ3MpIHtcbiAgIHZhciBub2RlID0gbnVsbDtcbiAgIHByb3AgPSBwcm9wIHx8ICdjdXJyZW50JztcbiAgIHBvcyA9IHBvcyAmJiBwb3MuZ2V0Yyh0cnVlKSB8fCBDb21wbGV4LktFUjtcbiAgIHZhciBkaXN0YW5jZSA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgdmFyIGQxID0gYS54IC0gYi54LCBkMiA9IGEueSAtIGIueTtcbiAgICAgcmV0dXJuIGQxICogZDEgKyBkMiAqIGQyO1xuICAgfTtcbiAgIHRoaXMuZWFjaE5vZGUoZ3JhcGgsIGZ1bmN0aW9uKGVsZW0pIHtcbiAgICAgbm9kZSA9IChub2RlID09IG51bGwgfHwgZGlzdGFuY2UoZWxlbS5nZXRQb3MocHJvcCkuZ2V0Yyh0cnVlKSwgcG9zKSA8IGRpc3RhbmNlKFxuICAgICAgICAgbm9kZS5nZXRQb3MocHJvcCkuZ2V0Yyh0cnVlKSwgcG9zKSkgPyBlbGVtIDogbm9kZTtcbiAgIH0sIGZsYWdzKTtcbiAgIHJldHVybiBub2RlO1xuICB9IFxufTtcblxuLy9BcHBlbmQgZ3JhcGggbWV0aG9kcyB0byA8R3JhcGg+XG4kLmVhY2goWydnZXQnLCAnZ2V0Tm9kZScsICdlYWNoJywgJ2VhY2hOb2RlJywgJ2NvbXB1dGVMZXZlbHMnLCAnZWFjaEJGUycsICdjbGVhbicsICdnZXRDbG9zZXN0Tm9kZVRvUG9zJywgJ2dldENsb3Nlc3ROb2RlVG9PcmlnaW4nXSwgZnVuY3Rpb24obSkge1xuICBHcmFwaC5wcm90b3R5cGVbbV0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gR3JhcGguVXRpbFttXS5hcHBseShHcmFwaC5VdGlsLCBbdGhpc10uY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpKTtcbiAgfTtcbn0pO1xuXG4vL0FwcGVuZCBub2RlIG1ldGhvZHMgdG8gPEdyYXBoLk5vZGU+XG4kLmVhY2goWydlYWNoQWRqYWNlbmN5JywgJ2VhY2hMZXZlbCcsICdlYWNoU3ViZ3JhcGgnLCAnZWFjaFN1Ym5vZGUnLCAnYW55U3Vibm9kZScsICdnZXRTdWJub2RlcycsICdnZXRQYXJlbnRzJywgJ2lzRGVzY2VuZGFudE9mJ10sIGZ1bmN0aW9uKG0pIHtcbiAgR3JhcGguTm9kZS5wcm90b3R5cGVbbV0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gR3JhcGguVXRpbFttXS5hcHBseShHcmFwaC5VdGlsLCBbdGhpc10uY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpKTtcbiAgfTtcbn0pO1xuXG4vKlxuICogRmlsZTogR3JhcGguT3AuanNcbiAqXG4qL1xuXG4vKlxuICAgT2JqZWN0OiBHcmFwaC5PcFxuXG4gICBQZXJmb3JtIDxHcmFwaD4gb3BlcmF0aW9ucyBsaWtlIGFkZGluZy9yZW1vdmluZyA8R3JhcGguTm9kZXM+IG9yIDxHcmFwaC5BZGphY2VuY2VzPiwgXG4gICBtb3JwaGluZyBhIDxHcmFwaD4gaW50byBhbm90aGVyIDxHcmFwaD4sIGNvbnRyYWN0aW5nIG9yIGV4cGFuZGluZyBzdWJ0cmVlcywgZXRjLlxuXG4qL1xuR3JhcGguT3AgPSB7XG5cbiAgICBvcHRpb25zOiB7XG4gICAgICB0eXBlOiAnbm90aGluZycsXG4gICAgICBkdXJhdGlvbjogMjAwMCxcbiAgICAgIGhpZGVMYWJlbHM6IHRydWUsXG4gICAgICBmcHM6MzBcbiAgICB9LFxuICAgIFxuICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKHZpeikge1xuICAgICAgdGhpcy52aXogPSB2aXo7XG4gICAgfSxcblxuICAgIC8qXG4gICAgICAgTWV0aG9kOiByZW1vdmVOb2RlXG4gICAgXG4gICAgICAgUmVtb3ZlcyBvbmUgb3IgbW9yZSA8R3JhcGguTm9kZXM+IGZyb20gdGhlIHZpc3VhbGl6YXRpb24uIFxuICAgICAgIEl0IGNhbiBhbHNvIHBlcmZvcm0gc2V2ZXJhbCBhbmltYXRpb25zIGxpa2UgZmFkaW5nIHNlcXVlbnRpYWxseSwgZmFkaW5nIGNvbmN1cnJlbnRseSwgaXRlcmF0aW5nIG9yIHJlcGxvdHRpbmcuXG5cbiAgICAgICBQYXJhbWV0ZXJzOlxuICAgIFxuICAgICAgICBub2RlIC0gKHN0cmluZ3xhcnJheSkgVGhlIG5vZGUncyBpZC4gQ2FuIGFsc28gYmUgYW4gYXJyYXkgaGF2aW5nIG1hbnkgaWRzLlxuICAgICAgICBvcHQgLSAob2JqZWN0KSBBbmltYXRpb24gb3B0aW9ucy4gSXQncyBhbiBvYmplY3Qgd2l0aCBvcHRpb25hbCBwcm9wZXJ0aWVzIGRlc2NyaWJlZCBiZWxvd1xuICAgICAgICB0eXBlIC0gKHN0cmluZykgRGVmYXVsdCdzICpub3RoaW5nKi4gVHlwZSBvZiB0aGUgYW5pbWF0aW9uLiBDYW4gYmUgXCJub3RoaW5nXCIsIFwicmVwbG90XCIsIFwiZmFkZTpzZXFcIiwgIFwiZmFkZTpjb25cIiBvciBcIml0ZXJcIi5cbiAgICAgICAgZHVyYXRpb24gLSBEZXNjcmliZWQgaW4gPE9wdGlvbnMuRng+LlxuICAgICAgICBmcHMgLSBEZXNjcmliZWQgaW4gPE9wdGlvbnMuRng+LlxuICAgICAgICB0cmFuc2l0aW9uIC0gRGVzY3JpYmVkIGluIDxPcHRpb25zLkZ4Pi5cbiAgICAgICAgaGlkZUxhYmVscyAtIChib29sZWFuKSBEZWZhdWx0J3MgKnRydWUqLiBIaWRlIGxhYmVscyBkdXJpbmcgdGhlIGFuaW1hdGlvbi5cbiAgIFxuICAgICAgRXhhbXBsZTpcbiAgICAgIChzdGFydCBjb2RlIGpzKVxuICAgICAgICB2YXIgdml6ID0gbmV3ICRqaXQuVml6KG9wdGlvbnMpO1xuICAgICAgICB2aXoub3AucmVtb3ZlTm9kZSgnbm9kZUlkJywge1xuICAgICAgICAgIHR5cGU6ICdmYWRlOnNlcScsXG4gICAgICAgICAgZHVyYXRpb246IDEwMDAsXG4gICAgICAgICAgaGlkZUxhYmVsczogZmFsc2UsXG4gICAgICAgICAgdHJhbnNpdGlvbjogJGppdC5UcmFucy5RdWFydC5lYXNlT3V0XG4gICAgICAgIH0pO1xuICAgICAgICAvL29yIGFsc29cbiAgICAgICAgdml6Lm9wLnJlbW92ZU5vZGUoWydzb21lSWQnLCAnb3RoZXJJZCddLCB7XG4gICAgICAgICAgdHlwZTogJ2ZhZGU6Y29uJyxcbiAgICAgICAgICBkdXJhdGlvbjogMTUwMFxuICAgICAgICB9KTtcbiAgICAgIChlbmQgY29kZSlcbiAgICAqL1xuICBcbiAgICByZW1vdmVOb2RlOiBmdW5jdGlvbihub2RlLCBvcHQpIHtcbiAgICAgICAgdmFyIHZpeiA9IHRoaXMudml6O1xuICAgICAgICB2YXIgb3B0aW9ucyA9ICQubWVyZ2UodGhpcy5vcHRpb25zLCB2aXouY29udHJvbGxlciwgb3B0KTtcbiAgICAgICAgdmFyIG4gPSAkLnNwbGF0KG5vZGUpO1xuICAgICAgICB2YXIgaSwgdGhhdCwgbm9kZU9iajtcbiAgICAgICAgc3dpdGNoKG9wdGlvbnMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnbm90aGluZyc6XG4gICAgICAgICAgICAgICAgZm9yKGk9MDsgaTxuLmxlbmd0aDsgaSsrKSB2aXouZ3JhcGgucmVtb3ZlTm9kZShuW2ldKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FzZSAncmVwbG90JzpcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZU5vZGUobiwgeyB0eXBlOiAnbm90aGluZycgfSk7XG4gICAgICAgICAgICAgICAgdml6LmxhYmVscy5jbGVhckxhYmVscygpO1xuICAgICAgICAgICAgICAgIHZpei5yZWZyZXNoKHRydWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjYXNlICdmYWRlOnNlcSc6IGNhc2UgJ2ZhZGUnOlxuICAgICAgICAgICAgICAgIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgICAgIC8vc2V0IGFscGhhIHRvIDAgZm9yIG5vZGVzIHRvIHJlbW92ZS5cbiAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPG4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZU9iaiA9IHZpei5ncmFwaC5nZXROb2RlKG5baV0pO1xuICAgICAgICAgICAgICAgICAgICBub2RlT2JqLnNldERhdGEoJ2FscGhhJywgMCwgJ2VuZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2aXouZnguYW5pbWF0ZSgkLm1lcmdlKG9wdGlvbnMsIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZXM6IFsnbm9kZS1wcm9wZXJ0eTphbHBoYSddLFxuICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQucmVtb3ZlTm9kZShuLCB7IHR5cGU6ICdub3RoaW5nJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpei5sYWJlbHMuY2xlYXJMYWJlbHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpei5yZXBvc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aXouZnguYW5pbWF0ZSgkLm1lcmdlKG9wdGlvbnMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlczogWydsaW5lYXInXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjYXNlICdmYWRlOmNvbic6XG4gICAgICAgICAgICAgICAgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICAgICAgLy9zZXQgYWxwaGEgdG8gMCBmb3Igbm9kZXMgdG8gcmVtb3ZlLiBUYWcgdGhlbSBmb3IgYmVpbmcgaWdub3JlZCBvbiBjb21wdXRpbmcgcG9zaXRpb25zLlxuICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8bi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBub2RlT2JqID0gdml6LmdyYXBoLmdldE5vZGUobltpXSk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVPYmouc2V0RGF0YSgnYWxwaGEnLCAwLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVPYmouaWdub3JlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdml6LnJlcG9zaXRpb24oKTtcbiAgICAgICAgICAgICAgICB2aXouZnguYW5pbWF0ZSgkLm1lcmdlKG9wdGlvbnMsIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZXM6IFsnbm9kZS1wcm9wZXJ0eTphbHBoYScsICdsaW5lYXInXSxcbiAgICAgICAgICAgICAgICAgICAgb25Db21wbGV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0LnJlbW92ZU5vZGUobiwgeyB0eXBlOiAnbm90aGluZycgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uQ29tcGxldGUgJiYgb3B0aW9ucy5vbkNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNhc2UgJ2l0ZXInOlxuICAgICAgICAgICAgICAgIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHZpei5meC5zZXF1ZW5jZSh7XG4gICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogZnVuY3Rpb24oKSB7IHJldHVybiBuLmxlbmd0aCAhPSAwOyB9LFxuICAgICAgICAgICAgICAgICAgICBzdGVwOiBmdW5jdGlvbigpIHsgdGhhdC5yZW1vdmVOb2RlKG4uc2hpZnQoKSwgeyB0eXBlOiAnbm90aGluZycgfSk7ICB2aXoubGFiZWxzLmNsZWFyTGFiZWxzKCk7IH0sXG4gICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGU6IGZ1bmN0aW9uKCkgeyBvcHRpb25zLm9uQ29tcGxldGUgJiYgb3B0aW9ucy5vbkNvbXBsZXRlKCk7IH0sXG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBNYXRoLmNlaWwob3B0aW9ucy5kdXJhdGlvbiAvIG4ubGVuZ3RoKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgZGVmYXVsdDogdGhpcy5kb0Vycm9yKCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFxuICAgIC8qXG4gICAgICAgTWV0aG9kOiByZW1vdmVFZGdlXG4gICAgXG4gICAgICAgUmVtb3ZlcyBvbmUgb3IgbW9yZSA8R3JhcGguQWRqYWNlbmNlcz4gZnJvbSB0aGUgdmlzdWFsaXphdGlvbi4gXG4gICAgICAgSXQgY2FuIGFsc28gcGVyZm9ybSBzZXZlcmFsIGFuaW1hdGlvbnMgbGlrZSBmYWRpbmcgc2VxdWVudGlhbGx5LCBmYWRpbmcgY29uY3VycmVudGx5LCBpdGVyYXRpbmcgb3IgcmVwbG90dGluZy5cblxuICAgICAgIFBhcmFtZXRlcnM6XG4gICAgXG4gICAgICAgdmVydGV4IC0gKGFycmF5KSBBbiBhcnJheSBoYXZpbmcgdHdvIHN0cmluZ3Mgd2hpY2ggYXJlIHRoZSBpZHMgb2YgdGhlIG5vZGVzIGNvbm5lY3RlZCBieSB0aGlzIGVkZ2UgKGkuZSBbJ2lkMScsICdpZDInXSkuIENhbiBhbHNvIGJlIGEgdHdvIGRpbWVuc2lvbmFsIGFycmF5IGhvbGRpbmcgbWFueSBlZGdlcyAoaS5lIFtbJ2lkMScsICdpZDInXSwgWydpZDMnLCAnaWQ0J10sIC4uLl0pLlxuICAgICAgIG9wdCAtIChvYmplY3QpIEFuaW1hdGlvbiBvcHRpb25zLiBJdCdzIGFuIG9iamVjdCB3aXRoIG9wdGlvbmFsIHByb3BlcnRpZXMgZGVzY3JpYmVkIGJlbG93XG4gICAgICAgdHlwZSAtIChzdHJpbmcpIERlZmF1bHQncyAqbm90aGluZyouIFR5cGUgb2YgdGhlIGFuaW1hdGlvbi4gQ2FuIGJlIFwibm90aGluZ1wiLCBcInJlcGxvdFwiLCBcImZhZGU6c2VxXCIsICBcImZhZGU6Y29uXCIgb3IgXCJpdGVyXCIuXG4gICAgICAgZHVyYXRpb24gLSBEZXNjcmliZWQgaW4gPE9wdGlvbnMuRng+LlxuICAgICAgIGZwcyAtIERlc2NyaWJlZCBpbiA8T3B0aW9ucy5GeD4uXG4gICAgICAgdHJhbnNpdGlvbiAtIERlc2NyaWJlZCBpbiA8T3B0aW9ucy5GeD4uXG4gICAgICAgaGlkZUxhYmVscyAtIChib29sZWFuKSBEZWZhdWx0J3MgKnRydWUqLiBIaWRlIGxhYmVscyBkdXJpbmcgdGhlIGFuaW1hdGlvbi5cbiAgIFxuICAgICAgRXhhbXBsZTpcbiAgICAgIChzdGFydCBjb2RlIGpzKVxuICAgICAgICB2YXIgdml6ID0gbmV3ICRqaXQuVml6KG9wdGlvbnMpO1xuICAgICAgICB2aXoub3AucmVtb3ZlRWRnZShbJ25vZGVJZCcsICdvdGhlcklkJ10sIHtcbiAgICAgICAgICB0eXBlOiAnZmFkZTpzZXEnLFxuICAgICAgICAgIGR1cmF0aW9uOiAxMDAwLFxuICAgICAgICAgIGhpZGVMYWJlbHM6IGZhbHNlLFxuICAgICAgICAgIHRyYW5zaXRpb246ICRqaXQuVHJhbnMuUXVhcnQuZWFzZU91dFxuICAgICAgICB9KTtcbiAgICAgICAgLy9vciBhbHNvXG4gICAgICAgIHZpei5vcC5yZW1vdmVFZGdlKFtbJ3NvbWVJZCcsICdvdGhlcklkJ10sIFsnaWQzJywgJ2lkNCddXSwge1xuICAgICAgICAgIHR5cGU6ICdmYWRlOmNvbicsXG4gICAgICAgICAgZHVyYXRpb246IDE1MDBcbiAgICAgICAgfSk7XG4gICAgICAoZW5kIGNvZGUpXG4gICAgXG4gICAgKi9cbiAgICByZW1vdmVFZGdlOiBmdW5jdGlvbih2ZXJ0ZXgsIG9wdCkge1xuICAgICAgICB2YXIgdml6ID0gdGhpcy52aXo7XG4gICAgICAgIHZhciBvcHRpb25zID0gJC5tZXJnZSh0aGlzLm9wdGlvbnMsIHZpei5jb250cm9sbGVyLCBvcHQpO1xuICAgICAgICB2YXIgdiA9ICgkLnR5cGUodmVydGV4WzBdKSA9PSAnc3RyaW5nJyk/IFt2ZXJ0ZXhdIDogdmVydGV4O1xuICAgICAgICB2YXIgaSwgdGhhdCwgYWRqO1xuICAgICAgICBzd2l0Y2gob3B0aW9ucy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdub3RoaW5nJzpcbiAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHYubGVuZ3RoOyBpKyspICAgdml6LmdyYXBoLnJlbW92ZUFkamFjZW5jZSh2W2ldWzBdLCB2W2ldWzFdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FzZSAncmVwbG90JzpcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUVkZ2UodiwgeyB0eXBlOiAnbm90aGluZycgfSk7XG4gICAgICAgICAgICAgICAgdml6LnJlZnJlc2godHJ1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNhc2UgJ2ZhZGU6c2VxJzogY2FzZSAnZmFkZSc6XG4gICAgICAgICAgICAgICAgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICAgICAgLy9zZXQgYWxwaGEgdG8gMCBmb3IgZWRnZXMgdG8gcmVtb3ZlLlxuICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8di5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBhZGogPSB2aXouZ3JhcGguZ2V0QWRqYWNlbmNlKHZbaV1bMF0sIHZbaV1bMV0pO1xuICAgICAgICAgICAgICAgICAgICBpZihhZGopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkai5zZXREYXRhKCdhbHBoYScsIDAsJ2VuZCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZpei5meC5hbmltYXRlKCQubWVyZ2Uob3B0aW9ucywge1xuICAgICAgICAgICAgICAgICAgICBtb2RlczogWydlZGdlLXByb3BlcnR5OmFscGhhJ10sXG4gICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5yZW1vdmVFZGdlKHYsIHsgdHlwZTogJ25vdGhpbmcnIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdml6LnJlcG9zaXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpei5meC5hbmltYXRlKCQubWVyZ2Uob3B0aW9ucywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVzOiBbJ2xpbmVhciddXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNhc2UgJ2ZhZGU6Y29uJzpcbiAgICAgICAgICAgICAgICB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgICAgICAvL3NldCBhbHBoYSB0byAwIGZvciBub2RlcyB0byByZW1vdmUuIFRhZyB0aGVtIGZvciBiZWluZyBpZ25vcmVkIHdoZW4gY29tcHV0aW5nIHBvc2l0aW9ucy5cbiAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHYubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYWRqID0gdml6LmdyYXBoLmdldEFkamFjZW5jZSh2W2ldWzBdLCB2W2ldWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgaWYoYWRqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGouc2V0RGF0YSgnYWxwaGEnLDAgLCdlbmQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkai5pZ25vcmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZpei5yZXBvc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgdml6LmZ4LmFuaW1hdGUoJC5tZXJnZShvcHRpb25zLCB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGVzOiBbJ2VkZ2UtcHJvcGVydHk6YWxwaGEnLCAnbGluZWFyJ10sXG4gICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5yZW1vdmVFZGdlKHYsIHsgdHlwZTogJ25vdGhpbmcnIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbkNvbXBsZXRlICYmIG9wdGlvbnMub25Db21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjYXNlICdpdGVyJzpcbiAgICAgICAgICAgICAgICB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgICAgICB2aXouZnguc2VxdWVuY2Uoe1xuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IGZ1bmN0aW9uKCkgeyByZXR1cm4gdi5sZW5ndGggIT0gMDsgfSxcbiAgICAgICAgICAgICAgICAgICAgc3RlcDogZnVuY3Rpb24oKSB7IHRoYXQucmVtb3ZlRWRnZSh2LnNoaWZ0KCksIHsgdHlwZTogJ25vdGhpbmcnIH0pOyB2aXoubGFiZWxzLmNsZWFyTGFiZWxzKCk7IH0sXG4gICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGU6IGZ1bmN0aW9uKCkgeyBvcHRpb25zLm9uQ29tcGxldGUoKTsgfSxcbiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IE1hdGguY2VpbChvcHRpb25zLmR1cmF0aW9uIC8gdi5sZW5ndGgpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBkZWZhdWx0OiB0aGlzLmRvRXJyb3IoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXG4gICAgLypcbiAgICAgICBNZXRob2Q6IHN1bVxuICAgIFxuICAgICAgIEFkZHMgYSBuZXcgZ3JhcGggdG8gdGhlIHZpc3VhbGl6YXRpb24uIFxuICAgICAgIFRoZSBKU09OIGdyYXBoIChvciB0cmVlKSBtdXN0IGF0IGxlYXN0IGhhdmUgYSBjb21tb24gbm9kZSB3aXRoIHRoZSBjdXJyZW50IGdyYXBoIHBsb3R0ZWQgYnkgdGhlIHZpc3VhbGl6YXRpb24uIFxuICAgICAgIFRoZSByZXN1bHRpbmcgZ3JhcGggY2FuIGJlIGRlZmluZWQgYXMgZm9sbG93cyA8aHR0cDovL21hdGh3b3JsZC53b2xmcmFtLmNvbS9HcmFwaFN1bS5odG1sPlxuXG4gICAgICAgUGFyYW1ldGVyczpcbiAgICBcbiAgICAgICBqc29uIC0gKG9iamVjdCkgQSBqc29uIHRyZWUgb3IgZ3JhcGggc3RydWN0dXJlLiBTZWUgYWxzbyA8TG9hZGVyLmxvYWRKU09OPi5cbiAgICAgICBvcHQgLSAob2JqZWN0KSBBbmltYXRpb24gb3B0aW9ucy4gSXQncyBhbiBvYmplY3Qgd2l0aCBvcHRpb25hbCBwcm9wZXJ0aWVzIGRlc2NyaWJlZCBiZWxvd1xuICAgICAgIHR5cGUgLSAoc3RyaW5nKSBEZWZhdWx0J3MgKm5vdGhpbmcqLiBUeXBlIG9mIHRoZSBhbmltYXRpb24uIENhbiBiZSBcIm5vdGhpbmdcIiwgXCJyZXBsb3RcIiwgXCJmYWRlOnNlcVwiLCAgXCJmYWRlOmNvblwiLlxuICAgICAgIGR1cmF0aW9uIC0gRGVzY3JpYmVkIGluIDxPcHRpb25zLkZ4Pi5cbiAgICAgICBmcHMgLSBEZXNjcmliZWQgaW4gPE9wdGlvbnMuRng+LlxuICAgICAgIHRyYW5zaXRpb24gLSBEZXNjcmliZWQgaW4gPE9wdGlvbnMuRng+LlxuICAgICAgIGhpZGVMYWJlbHMgLSAoYm9vbGVhbikgRGVmYXVsdCdzICp0cnVlKi4gSGlkZSBsYWJlbHMgZHVyaW5nIHRoZSBhbmltYXRpb24uXG4gICBcbiAgICAgIEV4YW1wbGU6XG4gICAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgICAgLy8uLi5qc29uIGNvbnRhaW5zIGEgdHJlZSBvciBncmFwaCBzdHJ1Y3R1cmUuLi5cblxuICAgICAgICB2YXIgdml6ID0gbmV3ICRqaXQuVml6KG9wdGlvbnMpO1xuICAgICAgICB2aXoub3Auc3VtKGpzb24sIHtcbiAgICAgICAgICB0eXBlOiAnZmFkZTpzZXEnLFxuICAgICAgICAgIGR1cmF0aW9uOiAxMDAwLFxuICAgICAgICAgIGhpZGVMYWJlbHM6IGZhbHNlLFxuICAgICAgICAgIHRyYW5zaXRpb246ICRqaXQuVHJhbnMuUXVhcnQuZWFzZU91dFxuICAgICAgICB9KTtcbiAgICAgICAgLy9vciBhbHNvXG4gICAgICAgIHZpei5vcC5zdW0oanNvbiwge1xuICAgICAgICAgIHR5cGU6ICdmYWRlOmNvbicsXG4gICAgICAgICAgZHVyYXRpb246IDE1MDBcbiAgICAgICAgfSk7XG4gICAgICAoZW5kIGNvZGUpXG4gICAgXG4gICAgKi9cbiAgICBzdW06IGZ1bmN0aW9uKGpzb24sIG9wdCkge1xuICAgICAgICB2YXIgdml6ID0gdGhpcy52aXo7XG4gICAgICAgIHZhciBvcHRpb25zID0gJC5tZXJnZSh0aGlzLm9wdGlvbnMsIHZpei5jb250cm9sbGVyLCBvcHQpLCByb290ID0gdml6LnJvb3Q7XG4gICAgICAgIHZhciBncmFwaDtcbiAgICAgICAgdml6LnJvb3QgPSBvcHQuaWQgfHwgdml6LnJvb3Q7XG4gICAgICAgIHN3aXRjaChvcHRpb25zLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ25vdGhpbmcnOlxuICAgICAgICAgICAgICAgIGdyYXBoID0gdml6LmNvbnN0cnVjdChqc29uKTtcbiAgICAgICAgICAgICAgICBncmFwaC5lYWNoTm9kZShmdW5jdGlvbihlbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW0uZWFjaEFkamFjZW5jeShmdW5jdGlvbihhZGopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpei5ncmFwaC5hZGRBZGphY2VuY2UoYWRqLm5vZGVGcm9tLCBhZGoubm9kZVRvLCBhZGouZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjYXNlICdyZXBsb3QnOlxuICAgICAgICAgICAgICAgIHZpei5yZWZyZXNoKHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VtKGpzb24sIHsgdHlwZTogJ25vdGhpbmcnIH0pO1xuICAgICAgICAgICAgICAgIHZpei5yZWZyZXNoKHRydWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjYXNlICdmYWRlOnNlcSc6IGNhc2UgJ2ZhZGUnOiBjYXNlICdmYWRlOmNvbic6XG4gICAgICAgICAgICAgICAgLy8gU1RBUlQgTUVUQU1BUFMgQ09ERVxuICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgICAgICAvLyBPUklHSU5BTCBDT0RFOlxuICAgICAgICAgICAgICAgIC8vIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgICAgIC8vIEVORCBNRVRBTUFQUyBDT0RFXG4gICAgICAgICAgICAgICAgZ3JhcGggPSB2aXouY29uc3RydWN0KGpzb24pO1xuXG4gICAgICAgICAgICAgICAgLy9zZXQgYWxwaGEgdG8gMCBmb3Igbm9kZXMgdG8gYWRkLlxuICAgICAgICAgICAgICAgIHZhciBmYWRlRWRnZXMgPSB0aGlzLnByZXByb2Nlc3NTdW0oZ3JhcGgpO1xuICAgICAgICAgICAgICAgIHZhciBtb2RlcyA9ICFmYWRlRWRnZXM/IFsnbm9kZS1wcm9wZXJ0eTphbHBoYSddIDogWydub2RlLXByb3BlcnR5OmFscGhhJywgJ2VkZ2UtcHJvcGVydHk6YWxwaGEnXTtcbiAgICAgICAgICAgICAgICB2aXoucmVwb3NpdGlvbigpO1xuICAgICAgICAgICAgICAgIGlmKG9wdGlvbnMudHlwZSAhPSAnZmFkZTpjb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpei5meC5hbmltYXRlKCQubWVyZ2Uob3B0aW9ucywge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZXM6IFsnbGluZWFyJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXouZnguYW5pbWF0ZSgkLm1lcmdlKG9wdGlvbnMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZXM6IG1vZGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25Db21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdml6LmdyYXBoLmVhY2hOb2RlKGZ1bmN0aW9uKGVsZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmlkICE9IHJvb3QgJiYgZWxlbS5wb3MuaXNaZXJvKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5wb3Muc2V0KGVsZW0uZW5kUG9zKTsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uc3RhcnRQb3Muc2V0KGVsZW0uZW5kUG9zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHZpei5meC5hbmltYXRlKCQubWVyZ2Uob3B0aW9ucywge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZXM6IFsnbGluZWFyJ10uY29uY2F0KG1vZGVzKVxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OiB0aGlzLmRvRXJyb3IoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXG4gICAgLypcbiAgICAgICBNZXRob2Q6IG1vcnBoXG4gICAgXG4gICAgICAgVGhpcyBtZXRob2Qgd2lsbCB0cmFuc2Zvcm0gdGhlIGN1cnJlbnQgdmlzdWFsaXplZCBncmFwaCBpbnRvIHRoZSBuZXcgSlNPTiByZXByZXNlbnRhdGlvbiBwYXNzZWQgaW4gdGhlIG1ldGhvZC4gXG4gICAgICAgVGhlIEpTT04gb2JqZWN0IG11c3QgYXQgbGVhc3QgaGF2ZSB0aGUgcm9vdCBub2RlIGluIGNvbW1vbiB3aXRoIHRoZSBjdXJyZW50IHZpc3VhbGl6ZWQgZ3JhcGguXG5cbiAgICAgICBQYXJhbWV0ZXJzOlxuICAgIFxuICAgICAgIGpzb24gLSAob2JqZWN0KSBBIGpzb24gdHJlZSBvciBncmFwaCBzdHJ1Y3R1cmUuIFNlZSBhbHNvIDxMb2FkZXIubG9hZEpTT04+LlxuICAgICAgIG9wdCAtIChvYmplY3QpIEFuaW1hdGlvbiBvcHRpb25zLiBJdCdzIGFuIG9iamVjdCB3aXRoIG9wdGlvbmFsIHByb3BlcnRpZXMgZGVzY3JpYmVkIGJlbG93XG4gICAgICAgdHlwZSAtIChzdHJpbmcpIERlZmF1bHQncyAqbm90aGluZyouIFR5cGUgb2YgdGhlIGFuaW1hdGlvbi4gQ2FuIGJlIFwibm90aGluZ1wiLCBcInJlcGxvdFwiLCBcImZhZGU6Y29uXCIuXG4gICAgICAgZHVyYXRpb24gLSBEZXNjcmliZWQgaW4gPE9wdGlvbnMuRng+LlxuICAgICAgIGZwcyAtIERlc2NyaWJlZCBpbiA8T3B0aW9ucy5GeD4uXG4gICAgICAgdHJhbnNpdGlvbiAtIERlc2NyaWJlZCBpbiA8T3B0aW9ucy5GeD4uXG4gICAgICAgaGlkZUxhYmVscyAtIChib29sZWFuKSBEZWZhdWx0J3MgKnRydWUqLiBIaWRlIGxhYmVscyBkdXJpbmcgdGhlIGFuaW1hdGlvbi5cbiAgICAgICBpZCAtIChzdHJpbmcpIFRoZSBzaGFyZWQgPEdyYXBoLk5vZGU+IGlkIGJldHdlZW4gYm90aCBncmFwaHMuXG4gICAgICAgXG4gICAgICAgZXh0cmFNb2RlcyAtIChvcHRpb25hbHxvYmplY3QpIFdoZW4gbW9ycGhpbmcgd2l0aCBhbiBhbmltYXRpb24sIGRvbGxhciBwcmVmaXhlZCBkYXRhIHBhcmFtZXRlcnMgYXJlIGFkZGVkIHRvIFxuICAgICAgICAgICAgICAgICAgICAqZW5kRGF0YSogYW5kIG5vdCAqZGF0YSogaXRzZWxmLiBUaGlzIHdheSB5b3UgY2FuIGFuaW1hdGUgZG9sbGFyIHByZWZpeGVkIHBhcmFtZXRlcnMgZHVyaW5nIHlvdXIgbW9ycGhpbmcgb3BlcmF0aW9uLiBcbiAgICAgICAgICAgICAgICAgICAgRm9yIGFuaW1hdGluZyB0aGVzZSBleHRyYS1wYXJhbWV0ZXJzIHlvdSBoYXZlIHRvIHNwZWNpZnkgYW4gb2JqZWN0IHRoYXQgaGFzIGFuaW1hdGlvbiBncm91cHMgYXMga2V5cyBhbmQgYW5pbWF0aW9uIFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIGFzIHZhbHVlcywganVzdCBsaWtlIHNwZWNpZmllZCBpbiA8R3JhcGguUGxvdC5hbmltYXRlPi5cbiAgIFxuICAgICAgRXhhbXBsZTpcbiAgICAgIChzdGFydCBjb2RlIGpzKVxuICAgICAgICAvLy4uLmpzb24gY29udGFpbnMgYSB0cmVlIG9yIGdyYXBoIHN0cnVjdHVyZS4uLlxuXG4gICAgICAgIHZhciB2aXogPSBuZXcgJGppdC5WaXoob3B0aW9ucyk7XG4gICAgICAgIHZpei5vcC5tb3JwaChqc29uLCB7XG4gICAgICAgICAgdHlwZTogJ2ZhZGUnLFxuICAgICAgICAgIGR1cmF0aW9uOiAxMDAwLFxuICAgICAgICAgIGhpZGVMYWJlbHM6IGZhbHNlLFxuICAgICAgICAgIHRyYW5zaXRpb246ICRqaXQuVHJhbnMuUXVhcnQuZWFzZU91dFxuICAgICAgICB9KTtcbiAgICAgICAgLy9vciBhbHNvXG4gICAgICAgIHZpei5vcC5tb3JwaChqc29uLCB7XG4gICAgICAgICAgdHlwZTogJ2ZhZGUnLFxuICAgICAgICAgIGR1cmF0aW9uOiAxNTAwXG4gICAgICAgIH0pO1xuICAgICAgICAvL2lmIHRoZSBqc29uIGRhdGEgY29udGFpbnMgZG9sbGFyIHByZWZpeGVkIHBhcmFtc1xuICAgICAgICAvL2xpa2UgJHdpZHRoIG9yICRoZWlnaHQgdGhlc2UgdG9vIGNhbiBiZSBhbmltYXRlZFxuICAgICAgICB2aXoub3AubW9ycGgoanNvbiwge1xuICAgICAgICAgIHR5cGU6ICdmYWRlJyxcbiAgICAgICAgICBkdXJhdGlvbjogMTUwMFxuICAgICAgICB9LCB7XG4gICAgICAgICAgJ25vZGUtcHJvcGVydHknOiBbJ3dpZHRoJywgJ2hlaWdodCddXG4gICAgICAgIH0pO1xuICAgICAgKGVuZCBjb2RlKVxuICAgIFxuICAgICovXG4gICAgbW9ycGg6IGZ1bmN0aW9uKGpzb24sIG9wdCwgZXh0cmFNb2Rlcykge1xuICAgICAgICBleHRyYU1vZGVzID0gZXh0cmFNb2RlcyB8fCB7fTtcbiAgICAgICAgdmFyIHZpeiA9IHRoaXMudml6O1xuICAgICAgICB2YXIgb3B0aW9ucyA9ICQubWVyZ2UodGhpcy5vcHRpb25zLCB2aXouY29udHJvbGxlciwgb3B0KSwgcm9vdCA9IHZpei5yb290O1xuICAgICAgICB2YXIgZ3JhcGg7XG4gICAgICAgIC8vVE9ETyhuaWNvKSB0aGlzIGhhY2sgbWFrZXMgbW9ycGhpbmcgd29yayB3aXRoIHRoZSBIeXBlcnRyZWUuIFxuICAgICAgICAvL05lZWQgdG8gY2hlY2sgaWYgaXQgaGFzIGJlZW4gc29sdmVkIGFuZCB0aGlzIGNhbiBiZSByZW1vdmVkLlxuICAgICAgICB2aXoucm9vdCA9IG9wdC5pZCB8fCB2aXoucm9vdDtcbiAgICAgICAgc3dpdGNoKG9wdGlvbnMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnbm90aGluZyc6XG4gICAgICAgICAgICAgICAgZ3JhcGggPSB2aXouY29uc3RydWN0KGpzb24pO1xuICAgICAgICAgICAgICAgIGdyYXBoLmVhY2hOb2RlKGZ1bmN0aW9uKGVsZW0pIHtcbiAgICAgICAgICAgICAgICAgIHZhciBub2RlRXhpc3RzID0gdml6LmdyYXBoLmhhc05vZGUoZWxlbS5pZCk7ICBcbiAgICAgICAgICAgICAgICAgIGVsZW0uZWFjaEFkamFjZW5jeShmdW5jdGlvbihhZGopIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFkakV4aXN0cyA9ICEhdml6LmdyYXBoLmdldEFkamFjZW5jZShhZGoubm9kZUZyb20uaWQsIGFkai5ub2RlVG8uaWQpO1xuICAgICAgICAgICAgICAgICAgICB2aXouZ3JhcGguYWRkQWRqYWNlbmNlKGFkai5ub2RlRnJvbSwgYWRqLm5vZGVUbywgYWRqLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAvL1VwZGF0ZSBkYXRhIHByb3BlcnRpZXMgaWYgdGhlIG5vZGUgZXhpc3RlZFxuICAgICAgICAgICAgICAgICAgICBpZihhZGpFeGlzdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRkZWRBZGogPSB2aXouZ3JhcGguZ2V0QWRqYWNlbmNlKGFkai5ub2RlRnJvbS5pZCwgYWRqLm5vZGVUby5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgZm9yKHZhciBwcm9wIGluIChhZGouZGF0YSB8fCB7fSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkQWRqLmRhdGFbcHJvcF0gPSBhZGouZGF0YVtwcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgLy9VcGRhdGUgZGF0YSBwcm9wZXJ0aWVzIGlmIHRoZSBub2RlIGV4aXN0ZWRcbiAgICAgICAgICAgICAgICAgIGlmKG5vZGVFeGlzdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFkZGVkTm9kZSA9IHZpei5ncmFwaC5nZXROb2RlKGVsZW0uaWQpO1xuICAgICAgICAgICAgICAgICAgICBmb3IodmFyIHByb3AgaW4gKGVsZW0uZGF0YSB8fCB7fSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBhZGRlZE5vZGUuZGF0YVtwcm9wXSA9IGVsZW0uZGF0YVtwcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHZpei5ncmFwaC5lYWNoTm9kZShmdW5jdGlvbihlbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW0uZWFjaEFkamFjZW5jeShmdW5jdGlvbihhZGopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFncmFwaC5nZXRBZGphY2VuY2UoYWRqLm5vZGVGcm9tLmlkLCBhZGoubm9kZVRvLmlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpei5ncmFwaC5yZW1vdmVBZGphY2VuY2UoYWRqLm5vZGVGcm9tLmlkLCBhZGoubm9kZVRvLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFncmFwaC5oYXNOb2RlKGVsZW0uaWQpKSB2aXouZ3JhcGgucmVtb3ZlTm9kZShlbGVtLmlkKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FzZSAncmVwbG90JzpcbiAgICAgICAgICAgICAgICB2aXoubGFiZWxzLmNsZWFyTGFiZWxzKHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMubW9ycGgoanNvbiwgeyB0eXBlOiAnbm90aGluZycgfSk7XG4gICAgICAgICAgICAgICAgdml6LnJlZnJlc2godHJ1ZSk7XG4gICAgICAgICAgICAgICAgdml6LnJlZnJlc2godHJ1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBjYXNlICdmYWRlOnNlcSc6IGNhc2UgJ2ZhZGUnOiBjYXNlICdmYWRlOmNvbic6XG4gICAgICAgICAgICAgICAgLy8gU1RBUlQgTUVUQU1BUFMgQ09ERVxuICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgICAgICAvLyBPUklHSU5BTCBDT0RFOlxuICAgICAgICAgICAgICAgIC8vIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgICAgIC8vIEVORCBNRVRBTUFQUyBDT0RFXG4gICAgICAgICAgICAgICAgZ3JhcGggPSB2aXouY29uc3RydWN0KGpzb24pO1xuICAgICAgICAgICAgICAgIC8vcHJlcHJvY2Vzc2luZyBmb3Igbm9kZXMgdG8gZGVsZXRlLlxuICAgICAgICAgICAgICAgIC8vZ2V0IG5vZGUgcHJvcGVydHkgbW9kZXMgdG8gaW50ZXJwb2xhdGVcbiAgICAgICAgICAgICAgICB2YXIgbm9kZU1vZGVzID0gKCdub2RlLXByb3BlcnR5JyBpbiBleHRyYU1vZGVzKSBcbiAgICAgICAgICAgICAgICAgICYmICQubWFwKCQuc3BsYXQoZXh0cmFNb2Rlc1snbm9kZS1wcm9wZXJ0eSddKSwgXG4gICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24obikgeyByZXR1cm4gJyQnICsgbjsgfSk7XG4gICAgICAgICAgICAgICAgdml6LmdyYXBoLmVhY2hOb2RlKGZ1bmN0aW9uKGVsZW0pIHtcbiAgICAgICAgICAgICAgICAgIHZhciBncmFwaE5vZGUgPSBncmFwaC5nZXROb2RlKGVsZW0uaWQpOyAgIFxuICAgICAgICAgICAgICAgICAgaWYoIWdyYXBoTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGVsZW0uc2V0RGF0YSgnYWxwaGEnLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICBlbGVtLnNldERhdGEoJ2FscGhhJywgMSwgJ3N0YXJ0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgZWxlbS5zZXREYXRhKCdhbHBoYScsIDAsICdlbmQnKTtcbiAgICAgICAgICAgICAgICAgICAgICBlbGVtLmlnbm9yZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy9VcGRhdGUgbm9kZSBkYXRhIGluZm9ybWF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgdmFyIGdyYXBoTm9kZURhdGEgPSBncmFwaE5vZGUuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICBmb3IodmFyIHByb3AgaW4gZ3JhcGhOb2RlRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYobm9kZU1vZGVzICYmICgkLmluZGV4T2Yobm9kZU1vZGVzLCBwcm9wKSA+IC0xKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmVuZERhdGFbcHJvcF0gPSBncmFwaE5vZGVEYXRhW3Byb3BdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5kYXRhW3Byb3BdID0gZ3JhcGhOb2RlRGF0YVtwcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTsgXG4gICAgICAgICAgICAgICAgdml6LmdyYXBoLmVhY2hOb2RlKGZ1bmN0aW9uKGVsZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoZWxlbS5pZ25vcmUpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgZWxlbS5lYWNoQWRqYWNlbmN5KGZ1bmN0aW9uKGFkaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWRqLm5vZGVGcm9tLmlnbm9yZSB8fCBhZGoubm9kZVRvLmlnbm9yZSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGVGcm9tID0gZ3JhcGguZ2V0Tm9kZShhZGoubm9kZUZyb20uaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGVUbyA9IGdyYXBoLmdldE5vZGUoYWRqLm5vZGVUby5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZighbm9kZUZyb20uYWRqYWNlbnRUbyhub2RlVG8pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFkaiA9IHZpei5ncmFwaC5nZXRBZGphY2VuY2Uobm9kZUZyb20uaWQsIG5vZGVUby5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFkZUVkZ2VzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGouc2V0RGF0YSgnYWxwaGEnLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGouc2V0RGF0YSgnYWxwaGEnLCAxLCAnc3RhcnQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGouc2V0RGF0YSgnYWxwaGEnLCAwLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pOyBcbiAgICAgICAgICAgICAgICAvL3ByZXByb2Nlc3NpbmcgZm9yIGFkZGluZyBub2Rlcy5cbiAgICAgICAgICAgICAgICB2YXIgZmFkZUVkZ2VzID0gdGhpcy5wcmVwcm9jZXNzU3VtKGdyYXBoKTtcblxuICAgICAgICAgICAgICAgIHZhciBtb2RlcyA9ICFmYWRlRWRnZXM/IFsnbm9kZS1wcm9wZXJ0eTphbHBoYSddIDogXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydub2RlLXByb3BlcnR5OmFscGhhJywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlZGdlLXByb3BlcnR5OmFscGhhJ107XG4gICAgICAgICAgICAgICAgLy9BcHBlbmQgZXh0cmEgbm9kZS1wcm9wZXJ0eSBhbmltYXRpb25zIChpZiBhbnkpXG4gICAgICAgICAgICAgICAgbW9kZXNbMF0gPSBtb2Rlc1swXSArICgoJ25vZGUtcHJvcGVydHknIGluIGV4dHJhTW9kZXMpPyBcbiAgICAgICAgICAgICAgICAgICAgKCc6JyArICQuc3BsYXQoZXh0cmFNb2Rlc1snbm9kZS1wcm9wZXJ0eSddKS5qb2luKCc6JykpIDogJycpO1xuICAgICAgICAgICAgICAgIC8vQXBwZW5kIGV4dHJhIGVkZ2UtcHJvcGVydHkgYW5pbWF0aW9ucyAoaWYgYW55KVxuICAgICAgICAgICAgICAgIG1vZGVzWzFdID0gKG1vZGVzWzFdIHx8ICdlZGdlLXByb3BlcnR5OmFscGhhJykgKyAoKCdlZGdlLXByb3BlcnR5JyBpbiBleHRyYU1vZGVzKT8gXG4gICAgICAgICAgICAgICAgICAgICgnOicgKyAkLnNwbGF0KGV4dHJhTW9kZXNbJ2VkZ2UtcHJvcGVydHknXSkuam9pbignOicpKSA6ICcnKTtcbiAgICAgICAgICAgICAgICAvL0FkZCBsYWJlbC1wcm9wZXJ0eSBhbmltYXRpb25zIChpZiBhbnkpXG4gICAgICAgICAgICAgICAgaWYoJ2xhYmVsLXByb3BlcnR5JyBpbiBleHRyYU1vZGVzKSB7XG4gICAgICAgICAgICAgICAgICBtb2Rlcy5wdXNoKCdsYWJlbC1wcm9wZXJ0eTonICsgJC5zcGxhdChleHRyYU1vZGVzWydsYWJlbC1wcm9wZXJ0eSddKS5qb2luKCc6JykpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vb25seSB1c2UgcmVwb3NpdGlvbiBpZiBpdHMgaW1wbGVtZW50ZWQuXG4gICAgICAgICAgICAgICAgaWYgKHZpei5yZXBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICB2aXoucmVwb3NpdGlvbigpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2aXouY29tcHV0ZSgnZW5kJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZpei5ncmFwaC5lYWNoTm9kZShmdW5jdGlvbihlbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmlkICE9IHJvb3QgJiYgZWxlbS5wb3MuZ2V0cCgpLmVxdWFscyhQb2xhci5LRVIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZWxlbS5wb3Muc2V0KGVsZW0uZW5kUG9zKTsgZWxlbS5zdGFydFBvcy5zZXQoZWxlbS5lbmRQb3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdml6LmZ4LmFuaW1hdGUoJC5tZXJnZShvcHRpb25zLCB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGVzOiBbZXh0cmFNb2Rlcy5wb3NpdGlvbiB8fCAncG9sYXInXS5jb25jYXQobW9kZXMpLFxuICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpei5ncmFwaC5lYWNoTm9kZShmdW5jdGlvbihlbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZWxlbS5pZ25vcmUpIHZpei5ncmFwaC5yZW1vdmVOb2RlKGVsZW0uaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aXouZ3JhcGguZWFjaE5vZGUoZnVuY3Rpb24oZWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uZWFjaEFkamFjZW5jeShmdW5jdGlvbihhZGopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWRqLmlnbm9yZSkgdml6LmdyYXBoLnJlbW92ZUFkamFjZW5jZShhZGoubm9kZUZyb20uaWQsIGFkai5ub2RlVG8uaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uQ29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDo7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgXG4gIC8qXG4gICAgTWV0aG9kOiBjb250cmFjdFxuIFxuICAgIENvbGxhcHNlcyB0aGUgc3VidHJlZSBvZiB0aGUgZ2l2ZW4gbm9kZS4gVGhlIG5vZGUgd2lsbCBoYXZlIGEgX2NvbGxhcHNlZD10cnVlXyBwcm9wZXJ0eS5cbiAgICBcbiAgICBQYXJhbWV0ZXJzOlxuIFxuICAgIG5vZGUgLSAob2JqZWN0KSBBIDxHcmFwaC5Ob2RlPi5cbiAgICBvcHQgLSAob2JqZWN0KSBBbiBvYmplY3QgY29udGFpbmluZyBvcHRpb25zIGRlc2NyaWJlZCBiZWxvd1xuICAgIHR5cGUgLSAoc3RyaW5nKSBXaGV0aGVyIHRvICdyZXBsb3QnIG9yICdhbmltYXRlJyB0aGUgY29udHJhY3Rpb24uXG4gICBcbiAgICBUaGVyZSBhcmUgYWxzbyBhIG51bWJlciBvZiBBbmltYXRpb24gb3B0aW9ucy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxPcHRpb25zLkZ4Pi5cblxuICAgIEV4YW1wbGU6XG4gICAgKHN0YXJ0IGNvZGUganMpXG4gICAgIHZhciB2aXogPSBuZXcgJGppdC5WaXoob3B0aW9ucyk7XG4gICAgIHZpei5vcC5jb250cmFjdChub2RlLCB7XG4gICAgICAgdHlwZTogJ2FuaW1hdGUnLFxuICAgICAgIGR1cmF0aW9uOiAxMDAwLFxuICAgICAgIGhpZGVMYWJlbHM6IHRydWUsXG4gICAgICAgdHJhbnNpdGlvbjogJGppdC5UcmFucy5RdWFydC5lYXNlT3V0XG4gICAgIH0pO1xuICAgKGVuZCBjb2RlKVxuIFxuICAgKi9cbiAgICBjb250cmFjdDogZnVuY3Rpb24obm9kZSwgb3B0KSB7XG4gICAgICB2YXIgdml6ID0gdGhpcy52aXo7XG4gICAgICBpZihub2RlLmNvbGxhcHNlZCB8fCAhbm9kZS5hbnlTdWJub2RlKCQubGFtYmRhKHRydWUpKSkgcmV0dXJuO1xuICAgICAgb3B0ID0gJC5tZXJnZSh0aGlzLm9wdGlvbnMsIHZpei5jb25maWcsIG9wdCB8fCB7fSwge1xuICAgICAgICAnbW9kZXMnOiBbJ25vZGUtcHJvcGVydHk6YWxwaGE6c3BhbicsICdsaW5lYXInXVxuICAgICAgfSk7XG4gICAgICBub2RlLmNvbGxhcHNlZCA9IHRydWU7XG4gICAgICAoZnVuY3Rpb24gc3VibihuKSB7XG4gICAgICAgIG4uZWFjaFN1Ym5vZGUoZnVuY3Rpb24oY2gpIHtcbiAgICAgICAgICBjaC5pZ25vcmUgPSB0cnVlO1xuICAgICAgICAgIGNoLnNldERhdGEoJ2FscGhhJywgMCwgb3B0LnR5cGUgPT0gJ2FuaW1hdGUnPyAnZW5kJyA6ICdjdXJyZW50Jyk7XG4gICAgICAgICAgc3VibihjaCk7XG4gICAgICAgIH0pO1xuICAgICAgfSkobm9kZSk7XG4gICAgICBpZihvcHQudHlwZSA9PSAnYW5pbWF0ZScpIHtcbiAgICAgICAgdml6LmNvbXB1dGUoJ2VuZCcpO1xuICAgICAgICBpZih2aXoucm90YXRlZCkge1xuICAgICAgICAgIHZpei5yb3RhdGUodml6LnJvdGF0ZWQsICdub25lJywge1xuICAgICAgICAgICAgJ3Byb3BlcnR5JzonZW5kJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIChmdW5jdGlvbiBzdWJuKG4pIHtcbiAgICAgICAgICBuLmVhY2hTdWJub2RlKGZ1bmN0aW9uKGNoKSB7XG4gICAgICAgICAgICBjaC5zZXRQb3Mobm9kZS5nZXRQb3MoJ2VuZCcpLCAnZW5kJyk7XG4gICAgICAgICAgICBzdWJuKGNoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkobm9kZSk7XG4gICAgICAgIHZpei5meC5hbmltYXRlKG9wdCk7XG4gICAgICB9IGVsc2UgaWYob3B0LnR5cGUgPT0gJ3JlcGxvdCcpe1xuICAgICAgICB2aXoucmVmcmVzaCgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgXG4gICAgLypcbiAgICBNZXRob2Q6IGV4cGFuZFxuIFxuICAgIEV4cGFuZHMgdGhlIHByZXZpb3VzbHkgY29udHJhY3RlZCBzdWJ0cmVlLiBUaGUgZ2l2ZW4gbm9kZSBtdXN0IGhhdmUgdGhlIF9jb2xsYXBzZWQ9dHJ1ZV8gcHJvcGVydHkuXG4gICAgXG4gICAgUGFyYW1ldGVyczpcbiBcbiAgICBub2RlIC0gKG9iamVjdCkgQSA8R3JhcGguTm9kZT4uXG4gICAgb3B0IC0gKG9iamVjdCkgQW4gb2JqZWN0IGNvbnRhaW5pbmcgb3B0aW9ucyBkZXNjcmliZWQgYmVsb3dcbiAgICB0eXBlIC0gKHN0cmluZykgV2hldGhlciB0byAncmVwbG90JyBvciAnYW5pbWF0ZScuXG4gICAgIFxuICAgIFRoZXJlIGFyZSBhbHNvIGEgbnVtYmVyIG9mIEFuaW1hdGlvbiBvcHRpb25zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPE9wdGlvbnMuRng+LlxuXG4gICAgRXhhbXBsZTpcbiAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgIHZhciB2aXogPSBuZXcgJGppdC5WaXoob3B0aW9ucyk7XG4gICAgICB2aXoub3AuZXhwYW5kKG5vZGUsIHtcbiAgICAgICAgdHlwZTogJ2FuaW1hdGUnLFxuICAgICAgICBkdXJhdGlvbjogMTAwMCxcbiAgICAgICAgaGlkZUxhYmVsczogdHJ1ZSxcbiAgICAgICAgdHJhbnNpdGlvbjogJGppdC5UcmFucy5RdWFydC5lYXNlT3V0XG4gICAgICB9KTtcbiAgICAoZW5kIGNvZGUpXG4gXG4gICAqL1xuICAgIGV4cGFuZDogZnVuY3Rpb24obm9kZSwgb3B0KSB7XG4gICAgICBpZighKCdjb2xsYXBzZWQnIGluIG5vZGUpKSByZXR1cm47XG4gICAgICB2YXIgdml6ID0gdGhpcy52aXo7XG4gICAgICBvcHQgPSAkLm1lcmdlKHRoaXMub3B0aW9ucywgdml6LmNvbmZpZywgb3B0IHx8IHt9LCB7XG4gICAgICAgICdtb2Rlcyc6IFsnbm9kZS1wcm9wZXJ0eTphbHBoYTpzcGFuJywgJ2xpbmVhciddXG4gICAgICB9KTtcbiAgICAgIGRlbGV0ZSBub2RlLmNvbGxhcHNlZDtcbiAgICAgIChmdW5jdGlvbiBzdWJuKG4pIHtcbiAgICAgICAgbi5lYWNoU3Vibm9kZShmdW5jdGlvbihjaCkge1xuICAgICAgICAgIGRlbGV0ZSBjaC5pZ25vcmU7XG4gICAgICAgICAgY2guc2V0RGF0YSgnYWxwaGEnLCAxLCBvcHQudHlwZSA9PSAnYW5pbWF0ZSc/ICdlbmQnIDogJ2N1cnJlbnQnKTtcbiAgICAgICAgICBzdWJuKGNoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KShub2RlKTtcbiAgICAgIGlmKG9wdC50eXBlID09ICdhbmltYXRlJykge1xuICAgICAgICB2aXouY29tcHV0ZSgnZW5kJyk7XG4gICAgICAgIGlmKHZpei5yb3RhdGVkKSB7XG4gICAgICAgICAgdml6LnJvdGF0ZSh2aXoucm90YXRlZCwgJ25vbmUnLCB7XG4gICAgICAgICAgICAncHJvcGVydHknOidlbmQnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdml6LmZ4LmFuaW1hdGUob3B0KTtcbiAgICAgIH0gZWxzZSBpZihvcHQudHlwZSA9PSAncmVwbG90Jyl7XG4gICAgICAgIHZpei5yZWZyZXNoKCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHByZXByb2Nlc3NTdW06IGZ1bmN0aW9uKGdyYXBoKSB7XG4gICAgICAgIHZhciB2aXogPSB0aGlzLnZpejtcbiAgICAgICAgZ3JhcGguZWFjaE5vZGUoZnVuY3Rpb24oZWxlbSkge1xuICAgICAgICAgICAgaWYoIXZpei5ncmFwaC5oYXNOb2RlKGVsZW0uaWQpKSB7XG4gICAgICAgICAgICAgICAgdml6LmdyYXBoLmFkZE5vZGUoZWxlbSk7XG4gICAgICAgICAgICAgICAgdmFyIG4gPSB2aXouZ3JhcGguZ2V0Tm9kZShlbGVtLmlkKTtcbiAgICAgICAgICAgICAgICBuLnNldERhdGEoJ2FscGhhJywgMCk7XG4gICAgICAgICAgICAgICAgbi5zZXREYXRhKCdhbHBoYScsIDAsICdzdGFydCcpO1xuICAgICAgICAgICAgICAgIG4uc2V0RGF0YSgnYWxwaGEnLCAxLCAnZW5kJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pOyBcbiAgICAgICAgdmFyIGZhZGVFZGdlcyA9IGZhbHNlO1xuICAgICAgICBncmFwaC5lYWNoTm9kZShmdW5jdGlvbihlbGVtKSB7XG4gICAgICAgICAgICBlbGVtLmVhY2hBZGphY2VuY3koZnVuY3Rpb24oYWRqKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5vZGVGcm9tID0gdml6LmdyYXBoLmdldE5vZGUoYWRqLm5vZGVGcm9tLmlkKTtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZVRvID0gdml6LmdyYXBoLmdldE5vZGUoYWRqLm5vZGVUby5pZCk7XG4gICAgICAgICAgICAgICAgaWYoIW5vZGVGcm9tLmFkamFjZW50VG8obm9kZVRvKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYWRqID0gdml6LmdyYXBoLmFkZEFkamFjZW5jZShub2RlRnJvbSwgbm9kZVRvLCBhZGouZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGlmKG5vZGVGcm9tLnN0YXJ0QWxwaGEgPT0gbm9kZUZyb20uZW5kQWxwaGEgXG4gICAgICAgICAgICAgICAgICAgICYmIG5vZGVUby5zdGFydEFscGhhID09IG5vZGVUby5lbmRBbHBoYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFkZUVkZ2VzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkai5zZXREYXRhKCdhbHBoYScsIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRqLnNldERhdGEoJ2FscGhhJywgMCwgJ3N0YXJ0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGouc2V0RGF0YSgnYWxwaGEnLCAxLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pOyBcbiAgICAgICAgcmV0dXJuIGZhZGVFZGdlcztcbiAgICB9XG59O1xuXG5cblxuLypcbiAgIEZpbGU6IEhlbHBlcnMuanNcbiBcbiAgIEhlbHBlcnMgYXJlIG9iamVjdHMgdGhhdCBjb250YWluIHJlbmRlcmluZyBwcmltaXRpdmVzIChsaWtlIHJlY3RhbmdsZXMsIGVsbGlwc2VzLCBldGMpLCBmb3IgcGxvdHRpbmcgbm9kZXMgYW5kIGVkZ2VzLlxuICAgSGVscGVycyBhbHNvIGNvbnRhaW4gaW1wbGVtZW50YXRpb25zIG9mIHRoZSAqY29udGFpbnMqIG1ldGhvZCwgYSBtZXRob2QgcmV0dXJuaW5nIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1vdXNlXG4gICBwb3NpdGlvbiBpcyBvdmVyIHRoZSByZW5kZXJlZCBzaGFwZS5cbiAgIFxuICAgSGVscGVycyBhcmUgdmVyeSB1c2VmdWwgd2hlbiBpbXBsZW1lbnRpbmcgbmV3IE5vZGVUeXBlcywgc2luY2UgeW91IGNhbiBhY2Nlc3MgdGhlbSB0aHJvdWdoICp0aGlzLm5vZGVIZWxwZXIqIGFuZCBcbiAgICp0aGlzLmVkZ2VIZWxwZXIqIDxHcmFwaC5QbG90PiBwcm9wZXJ0aWVzLCBwcm92aWRpbmcgeW91IHdpdGggc2ltcGxlIHByaW1pdGl2ZXMgYW5kIG1vdXNlLXBvc2l0aW9uIGNoZWNrIGZ1bmN0aW9ucy5cbiAgIFxuICAgRXhhbXBsZTpcbiAgIChzdGFydCBjb2RlIGpzKVxuICAgLy9pbXBsZW1lbnQgYSBuZXcgbm9kZSB0eXBlXG4gICAkaml0LlZpei5QbG90Lk5vZGVUeXBlcy5pbXBsZW1lbnQoe1xuICAgICAnY3VzdG9tTm9kZVR5cGUnOiB7XG4gICAgICAgJ3JlbmRlcic6IGZ1bmN0aW9uKG5vZGUsIGNhbnZhcykge1xuICAgICAgICAgdGhpcy5ub2RlSGVscGVyLmNpcmNsZS5yZW5kZXIgLi4uXG4gICAgICAgfSxcbiAgICAgICAnY29udGFpbnMnOiBmdW5jdGlvbihub2RlLCBwb3MpIHtcbiAgICAgICAgIHRoaXMubm9kZUhlbHBlci5jaXJjbGUuY29udGFpbnMgLi4uXG4gICAgICAgfVxuICAgICB9XG4gICB9KTtcbiAgIC8vaW1wbGVtZW50IGFuIGVkZ2UgdHlwZVxuICAgJGppdC5WaXouUGxvdC5FZGdlVHlwZXMuaW1wbGVtZW50KHtcbiAgICAgJ2N1c3RvbU5vZGVUeXBlJzoge1xuICAgICAgICdyZW5kZXInOiBmdW5jdGlvbihub2RlLCBjYW52YXMpIHtcbiAgICAgICAgIHRoaXMuZWRnZUhlbHBlci5jaXJjbGUucmVuZGVyIC4uLlxuICAgICAgIH0sXG4gICAgICAgLy9vcHRpb25hbFxuICAgICAgICdjb250YWlucyc6IGZ1bmN0aW9uKG5vZGUsIHBvcykge1xuICAgICAgICAgdGhpcy5lZGdlSGVscGVyLmNpcmNsZS5jb250YWlucyAuLi5cbiAgICAgICB9XG4gICAgIH1cbiAgIH0pO1xuICAgKGVuZCBjb2RlKVxuXG4qL1xuXG4vKlxuICAgT2JqZWN0OiBOb2RlSGVscGVyXG4gICBcbiAgIENvbnRhaW5zIHJlbmRlcmluZyBhbmQgb3RoZXIgdHlwZSBvZiBwcmltaXRpdmVzIGZvciBzaW1wbGUgc2hhcGVzLlxuICovXG52YXIgTm9kZUhlbHBlciA9IHtcbiAgJ25vbmUnOiB7XG4gICAgJ3JlbmRlcic6ICQuZW1wdHksXG4gICAgJ2NvbnRhaW5zJzogJC5sYW1iZGEoZmFsc2UpXG4gIH0sXG4gIC8qXG4gICBPYmplY3Q6IE5vZGVIZWxwZXIuY2lyY2xlXG4gICAqL1xuICAnY2lyY2xlJzoge1xuICAgIC8qXG4gICAgIE1ldGhvZDogcmVuZGVyXG4gICAgIFxuICAgICBSZW5kZXJzIGEgY2lyY2xlIGludG8gdGhlIGNhbnZhcy5cbiAgICAgXG4gICAgIFBhcmFtZXRlcnM6XG4gICAgIFxuICAgICB0eXBlIC0gKHN0cmluZykgUG9zc2libGUgb3B0aW9ucyBhcmUgJ2ZpbGwnIG9yICdzdHJva2UnLlxuICAgICBwb3MgLSAob2JqZWN0KSBBbiAqeCosICp5KiBvYmplY3Qgd2l0aCB0aGUgcG9zaXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgY2lyY2xlLlxuICAgICByYWRpdXMgLSAobnVtYmVyKSBUaGUgcmFkaXVzIG9mIHRoZSBjaXJjbGUgdG8gYmUgcmVuZGVyZWQuXG4gICAgIGNhbnZhcyAtIChvYmplY3QpIEEgPENhbnZhcz4gaW5zdGFuY2UuXG4gICAgIFxuICAgICBFeGFtcGxlOlxuICAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgTm9kZUhlbHBlci5jaXJjbGUucmVuZGVyKCdmaWxsJywgeyB4OiAxMCwgeTogMzAgfSwgMzAsIHZpei5jYW52YXMpO1xuICAgICAoZW5kIGNvZGUpXG4gICAgICovXG4gICAgJ3JlbmRlcic6IGZ1bmN0aW9uKHR5cGUsIHBvcywgcmFkaXVzLCBjYW52YXMpe1xuICAgICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDdHgoKTtcbiAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgIGN0eC5hcmMocG9zLngsIHBvcy55LCByYWRpdXMsIDAsIE1hdGguUEkgKiAyLCB0cnVlKTtcbiAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgIGN0eFt0eXBlXSgpO1xuICAgIH0sXG4gICAgLypcbiAgICBNZXRob2Q6IGNvbnRhaW5zXG4gICAgXG4gICAgUmV0dXJucyAqdHJ1ZSogaWYgKnBvcyogaXMgY29udGFpbmVkIGluIHRoZSBhcmVhIG9mIHRoZSBzaGFwZS4gUmV0dXJucyAqZmFsc2UqIG90aGVyd2lzZS5cbiAgICBcbiAgICBQYXJhbWV0ZXJzOlxuICAgIFxuICAgIG5wb3MgLSAob2JqZWN0KSBBbiAqeCosICp5KiBvYmplY3Qgd2l0aCB0aGUgPEdyYXBoLk5vZGU+IHBvc2l0aW9uLlxuICAgIHBvcyAtIChvYmplY3QpIEFuICp4KiwgKnkqIG9iamVjdCB3aXRoIHRoZSBwb3NpdGlvbiB0byBjaGVjay5cbiAgICByYWRpdXMgLSAobnVtYmVyKSBUaGUgcmFkaXVzIG9mIHRoZSByZW5kZXJlZCBjaXJjbGUuXG4gICAgXG4gICAgRXhhbXBsZTpcbiAgICAoc3RhcnQgY29kZSBqcylcbiAgICBOb2RlSGVscGVyLmNpcmNsZS5jb250YWlucyh7IHg6IDEwLCB5OiAzMCB9LCB7IHg6IDE1LCB5OiAzNSB9LCAzMCk7IC8vdHJ1ZVxuICAgIChlbmQgY29kZSlcbiAgICAqL1xuICAgICdjb250YWlucyc6IGZ1bmN0aW9uKG5wb3MsIHBvcywgcmFkaXVzKXtcbiAgICAgIHZhciBkaWZmeCA9IG5wb3MueCAtIHBvcy54LCBcbiAgICAgICAgICBkaWZmeSA9IG5wb3MueSAtIHBvcy55LCBcbiAgICAgICAgICBkaWZmID0gZGlmZnggKiBkaWZmeCArIGRpZmZ5ICogZGlmZnk7XG4gICAgICByZXR1cm4gZGlmZiA8PSByYWRpdXMgKiByYWRpdXM7XG4gICAgfVxuICB9LFxuICAvKlxuICBPYmplY3Q6IE5vZGVIZWxwZXIuZWxsaXBzZVxuICAqL1xuICAnZWxsaXBzZSc6IHtcbiAgICAvKlxuICAgIE1ldGhvZDogcmVuZGVyXG4gICAgXG4gICAgUmVuZGVycyBhbiBlbGxpcHNlIGludG8gdGhlIGNhbnZhcy5cbiAgICBcbiAgICBQYXJhbWV0ZXJzOlxuICAgIFxuICAgIHR5cGUgLSAoc3RyaW5nKSBQb3NzaWJsZSBvcHRpb25zIGFyZSAnZmlsbCcgb3IgJ3N0cm9rZScuXG4gICAgcG9zIC0gKG9iamVjdCkgQW4gKngqLCAqeSogb2JqZWN0IHdpdGggdGhlIHBvc2l0aW9uIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuXG4gICAgd2lkdGggLSAobnVtYmVyKSBUaGUgd2lkdGggb2YgdGhlIGVsbGlwc2UuXG4gICAgaGVpZ2h0IC0gKG51bWJlcikgVGhlIGhlaWdodCBvZiB0aGUgZWxsaXBzZS5cbiAgICBjYW52YXMgLSAob2JqZWN0KSBBIDxDYW52YXM+IGluc3RhbmNlLlxuICAgIFxuICAgIEV4YW1wbGU6XG4gICAgKHN0YXJ0IGNvZGUganMpXG4gICAgTm9kZUhlbHBlci5lbGxpcHNlLnJlbmRlcignZmlsbCcsIHsgeDogMTAsIHk6IDMwIH0sIDMwLCA0MCwgdml6LmNhbnZhcyk7XG4gICAgKGVuZCBjb2RlKVxuICAgICovXG4gICAgJ3JlbmRlcic6IGZ1bmN0aW9uKHR5cGUsIHBvcywgd2lkdGgsIGhlaWdodCwgY2FudmFzKXtcbiAgICAgIHZhciBjdHggPSBjYW52YXMuZ2V0Q3R4KCksXG4gICAgICAgICAgc2NhbGV4ID0gMSxcbiAgICAgICAgICBzY2FsZXkgPSAxLFxuICAgICAgICAgIHNjYWxlcG9zeCA9IDEsXG4gICAgICAgICAgc2NhbGVwb3N5ID0gMSxcbiAgICAgICAgICByYWRpdXMgPSAwO1xuXG4gICAgICBpZiAod2lkdGggPiBoZWlnaHQpIHtcbiAgICAgICAgICByYWRpdXMgPSB3aWR0aCAvIDI7XG4gICAgICAgICAgc2NhbGV5ID0gaGVpZ2h0IC8gd2lkdGg7XG4gICAgICAgICAgc2NhbGVwb3N5ID0gd2lkdGggLyBoZWlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJhZGl1cyA9IGhlaWdodCAvIDI7XG4gICAgICAgICAgc2NhbGV4ID0gd2lkdGggLyBoZWlnaHQ7XG4gICAgICAgICAgc2NhbGVwb3N4ID0gaGVpZ2h0IC8gd2lkdGg7XG4gICAgICB9XG5cbiAgICAgIGN0eC5zYXZlKCk7XG4gICAgICBjdHguc2NhbGUoc2NhbGV4LCBzY2FsZXkpO1xuICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgY3R4LmFyYyhwb3MueCAqIHNjYWxlcG9zeCwgcG9zLnkgKiBzY2FsZXBvc3ksIHJhZGl1cywgMCwgTWF0aC5QSSAqIDIsIHRydWUpO1xuICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgY3R4W3R5cGVdKCk7XG4gICAgICBjdHgucmVzdG9yZSgpO1xuICAgIH0sXG4gICAgLypcbiAgICBNZXRob2Q6IGNvbnRhaW5zXG4gICAgXG4gICAgUmV0dXJucyAqdHJ1ZSogaWYgKnBvcyogaXMgY29udGFpbmVkIGluIHRoZSBhcmVhIG9mIHRoZSBzaGFwZS4gUmV0dXJucyAqZmFsc2UqIG90aGVyd2lzZS5cbiAgICBcbiAgICBQYXJhbWV0ZXJzOlxuICAgIFxuICAgIG5wb3MgLSAob2JqZWN0KSBBbiAqeCosICp5KiBvYmplY3Qgd2l0aCB0aGUgPEdyYXBoLk5vZGU+IHBvc2l0aW9uLlxuICAgIHBvcyAtIChvYmplY3QpIEFuICp4KiwgKnkqIG9iamVjdCB3aXRoIHRoZSBwb3NpdGlvbiB0byBjaGVjay5cbiAgICB3aWR0aCAtIChudW1iZXIpIFRoZSB3aWR0aCBvZiB0aGUgcmVuZGVyZWQgZWxsaXBzZS5cbiAgICBoZWlnaHQgLSAobnVtYmVyKSBUaGUgaGVpZ2h0IG9mIHRoZSByZW5kZXJlZCBlbGxpcHNlLlxuICAgIFxuICAgIEV4YW1wbGU6XG4gICAgKHN0YXJ0IGNvZGUganMpXG4gICAgTm9kZUhlbHBlci5lbGxpcHNlLmNvbnRhaW5zKHsgeDogMTAsIHk6IDMwIH0sIHsgeDogMTUsIHk6IDM1IH0sIDMwLCA0MCk7XG4gICAgKGVuZCBjb2RlKVxuICAgICovXG4gICAgJ2NvbnRhaW5zJzogZnVuY3Rpb24obnBvcywgcG9zLCB3aWR0aCwgaGVpZ2h0KXtcbiAgICAgIHZhciByYWRpdXMgPSAwLFxuICAgICAgICAgIHNjYWxleCA9IDEsXG4gICAgICAgICAgc2NhbGV5ID0gMSxcbiAgICAgICAgICBkaWZmeCA9IDAsXG4gICAgICAgICAgZGlmZnkgPSAwLFxuICAgICAgICAgIGRpZmYgPSAwO1xuXG4gICAgICBpZiAod2lkdGggPiBoZWlnaHQpIHtcblx0ICAgICAgcmFkaXVzID0gd2lkdGggLyAyO1xuXHQgICAgICBzY2FsZXkgPSBoZWlnaHQgLyB3aWR0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmFkaXVzID0gaGVpZ2h0IC8gMjtcbiAgICAgICAgICBzY2FsZXggPSB3aWR0aCAvIGhlaWdodDtcbiAgICAgIH1cblxuICAgICAgZGlmZnggPSAobnBvcy54IC0gcG9zLngpICogKDEgLyBzY2FsZXgpO1xuICAgICAgZGlmZnkgPSAobnBvcy55IC0gcG9zLnkpICogKDEgLyBzY2FsZXkpO1xuICAgICAgZGlmZiA9IGRpZmZ4ICogZGlmZnggKyBkaWZmeSAqIGRpZmZ5O1xuICAgICAgcmV0dXJuIGRpZmYgPD0gcmFkaXVzICogcmFkaXVzO1xuICAgIH1cbiAgfSxcbiAgLypcbiAgT2JqZWN0OiBOb2RlSGVscGVyLnNxdWFyZVxuICAqL1xuICAnc3F1YXJlJzoge1xuICAgIC8qXG4gICAgTWV0aG9kOiByZW5kZXJcbiAgICBcbiAgICBSZW5kZXJzIGEgc3F1YXJlIGludG8gdGhlIGNhbnZhcy5cbiAgICBcbiAgICBQYXJhbWV0ZXJzOlxuICAgIFxuICAgIHR5cGUgLSAoc3RyaW5nKSBQb3NzaWJsZSBvcHRpb25zIGFyZSAnZmlsbCcgb3IgJ3N0cm9rZScuXG4gICAgcG9zIC0gKG9iamVjdCkgQW4gKngqLCAqeSogb2JqZWN0IHdpdGggdGhlIHBvc2l0aW9uIG9mIHRoZSBjZW50ZXIgb2YgdGhlIHNxdWFyZS5cbiAgICBkaW0gLSAobnVtYmVyKSBUaGUgcmFkaXVzIChvciBoYWxmLWRpYW1ldGVyKSBvZiB0aGUgc3F1YXJlLlxuICAgIGNhbnZhcyAtIChvYmplY3QpIEEgPENhbnZhcz4gaW5zdGFuY2UuXG4gICAgXG4gICAgRXhhbXBsZTpcbiAgICAoc3RhcnQgY29kZSBqcylcbiAgICBOb2RlSGVscGVyLnNxdWFyZS5yZW5kZXIoJ3N0cm9rZScsIHsgeDogMTAsIHk6IDMwIH0sIDQwLCB2aXouY2FudmFzKTtcbiAgICAoZW5kIGNvZGUpXG4gICAgKi9cbiAgICAncmVuZGVyJzogZnVuY3Rpb24odHlwZSwgcG9zLCBkaW0sIGNhbnZhcyl7XG4gICAgICBjYW52YXMuZ2V0Q3R4KClbdHlwZSArIFwiUmVjdFwiXShwb3MueCAtIGRpbSwgcG9zLnkgLSBkaW0sIDIqZGltLCAyKmRpbSk7XG4gICAgfSxcbiAgICAvKlxuICAgIE1ldGhvZDogY29udGFpbnNcbiAgICBcbiAgICBSZXR1cm5zICp0cnVlKiBpZiAqcG9zKiBpcyBjb250YWluZWQgaW4gdGhlIGFyZWEgb2YgdGhlIHNoYXBlLiBSZXR1cm5zICpmYWxzZSogb3RoZXJ3aXNlLlxuICAgIFxuICAgIFBhcmFtZXRlcnM6XG4gICAgXG4gICAgbnBvcyAtIChvYmplY3QpIEFuICp4KiwgKnkqIG9iamVjdCB3aXRoIHRoZSA8R3JhcGguTm9kZT4gcG9zaXRpb24uXG4gICAgcG9zIC0gKG9iamVjdCkgQW4gKngqLCAqeSogb2JqZWN0IHdpdGggdGhlIHBvc2l0aW9uIHRvIGNoZWNrLlxuICAgIGRpbSAtIChudW1iZXIpIFRoZSByYWRpdXMgKG9yIGhhbGYtZGlhbWV0ZXIpIG9mIHRoZSBzcXVhcmUuXG4gICAgXG4gICAgRXhhbXBsZTpcbiAgICAoc3RhcnQgY29kZSBqcylcbiAgICBOb2RlSGVscGVyLnNxdWFyZS5jb250YWlucyh7IHg6IDEwLCB5OiAzMCB9LCB7IHg6IDE1LCB5OiAzNSB9LCAzMCk7XG4gICAgKGVuZCBjb2RlKVxuICAgICovXG4gICAgJ2NvbnRhaW5zJzogZnVuY3Rpb24obnBvcywgcG9zLCBkaW0pe1xuICAgICAgcmV0dXJuIE1hdGguYWJzKHBvcy54IC0gbnBvcy54KSA8PSBkaW0gJiYgTWF0aC5hYnMocG9zLnkgLSBucG9zLnkpIDw9IGRpbTtcbiAgICB9XG4gIH0sXG4gIC8qXG4gIE9iamVjdDogTm9kZUhlbHBlci5yZWN0YW5nbGVcbiAgKi9cbiAgJ3JlY3RhbmdsZSc6IHtcbiAgICAvKlxuICAgIE1ldGhvZDogcmVuZGVyXG4gICAgXG4gICAgUmVuZGVycyBhIHJlY3RhbmdsZSBpbnRvIHRoZSBjYW52YXMuXG4gICAgXG4gICAgUGFyYW1ldGVyczpcbiAgICBcbiAgICB0eXBlIC0gKHN0cmluZykgUG9zc2libGUgb3B0aW9ucyBhcmUgJ2ZpbGwnIG9yICdzdHJva2UnLlxuICAgIHBvcyAtIChvYmplY3QpIEFuICp4KiwgKnkqIG9iamVjdCB3aXRoIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSByZWN0YW5nbGUuXG4gICAgd2lkdGggLSAobnVtYmVyKSBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS5cbiAgICBoZWlnaHQgLSAobnVtYmVyKSBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuXG4gICAgY2FudmFzIC0gKG9iamVjdCkgQSA8Q2FudmFzPiBpbnN0YW5jZS5cbiAgICBcbiAgICBFeGFtcGxlOlxuICAgIChzdGFydCBjb2RlIGpzKVxuICAgIE5vZGVIZWxwZXIucmVjdGFuZ2xlLnJlbmRlcignZmlsbCcsIHsgeDogMTAsIHk6IDMwIH0sIDMwLCA0MCwgdml6LmNhbnZhcyk7XG4gICAgKGVuZCBjb2RlKVxuICAgICovXG4gICAgJ3JlbmRlcic6IGZ1bmN0aW9uKHR5cGUsIHBvcywgd2lkdGgsIGhlaWdodCwgY2FudmFzKXtcbiAgICAgIGNhbnZhcy5nZXRDdHgoKVt0eXBlICsgXCJSZWN0XCJdKHBvcy54IC0gd2lkdGggLyAyLCBwb3MueSAtIGhlaWdodCAvIDIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9LFxuICAgIC8qXG4gICAgTWV0aG9kOiBjb250YWluc1xuICAgIFxuICAgIFJldHVybnMgKnRydWUqIGlmICpwb3MqIGlzIGNvbnRhaW5lZCBpbiB0aGUgYXJlYSBvZiB0aGUgc2hhcGUuIFJldHVybnMgKmZhbHNlKiBvdGhlcndpc2UuXG4gICAgXG4gICAgUGFyYW1ldGVyczpcbiAgICBcbiAgICBucG9zIC0gKG9iamVjdCkgQW4gKngqLCAqeSogb2JqZWN0IHdpdGggdGhlIDxHcmFwaC5Ob2RlPiBwb3NpdGlvbi5cbiAgICBwb3MgLSAob2JqZWN0KSBBbiAqeCosICp5KiBvYmplY3Qgd2l0aCB0aGUgcG9zaXRpb24gdG8gY2hlY2suXG4gICAgd2lkdGggLSAobnVtYmVyKSBUaGUgd2lkdGggb2YgdGhlIHJlbmRlcmVkIHJlY3RhbmdsZS5cbiAgICBoZWlnaHQgLSAobnVtYmVyKSBUaGUgaGVpZ2h0IG9mIHRoZSByZW5kZXJlZCByZWN0YW5nbGUuXG4gICAgXG4gICAgRXhhbXBsZTpcbiAgICAoc3RhcnQgY29kZSBqcylcbiAgICBOb2RlSGVscGVyLnJlY3RhbmdsZS5jb250YWlucyh7IHg6IDEwLCB5OiAzMCB9LCB7IHg6IDE1LCB5OiAzNSB9LCAzMCwgNDApO1xuICAgIChlbmQgY29kZSlcbiAgICAqL1xuICAgICdjb250YWlucyc6IGZ1bmN0aW9uKG5wb3MsIHBvcywgd2lkdGgsIGhlaWdodCl7XG4gICAgICByZXR1cm4gTWF0aC5hYnMocG9zLnggLSBucG9zLngpIDw9IHdpZHRoIC8gMlxuICAgICAgICAgICYmIE1hdGguYWJzKHBvcy55IC0gbnBvcy55KSA8PSBoZWlnaHQgLyAyO1xuICAgIH1cbiAgfSxcbiAgLypcbiAgT2JqZWN0OiBOb2RlSGVscGVyLnRyaWFuZ2xlXG4gICovXG4gICd0cmlhbmdsZSc6IHtcbiAgICAvKlxuICAgIE1ldGhvZDogcmVuZGVyXG4gICAgXG4gICAgUmVuZGVycyBhIHRyaWFuZ2xlIGludG8gdGhlIGNhbnZhcy5cbiAgICBcbiAgICBQYXJhbWV0ZXJzOlxuICAgIFxuICAgIHR5cGUgLSAoc3RyaW5nKSBQb3NzaWJsZSBvcHRpb25zIGFyZSAnZmlsbCcgb3IgJ3N0cm9rZScuXG4gICAgcG9zIC0gKG9iamVjdCkgQW4gKngqLCAqeSogb2JqZWN0IHdpdGggdGhlIHBvc2l0aW9uIG9mIHRoZSBjZW50ZXIgb2YgdGhlIHRyaWFuZ2xlLlxuICAgIGRpbSAtIChudW1iZXIpIEhhbGYgdGhlIGJhc2UgYW5kIGhhbGYgdGhlIGhlaWdodCBvZiB0aGUgdHJpYW5nbGUuXG4gICAgY2FudmFzIC0gKG9iamVjdCkgQSA8Q2FudmFzPiBpbnN0YW5jZS5cbiAgICBcbiAgICBFeGFtcGxlOlxuICAgIChzdGFydCBjb2RlIGpzKVxuICAgIE5vZGVIZWxwZXIudHJpYW5nbGUucmVuZGVyKCdzdHJva2UnLCB7IHg6IDEwLCB5OiAzMCB9LCA0MCwgdml6LmNhbnZhcyk7XG4gICAgKGVuZCBjb2RlKVxuICAgICovXG4gICAgJ3JlbmRlcic6IGZ1bmN0aW9uKHR5cGUsIHBvcywgZGltLCBjYW52YXMpe1xuICAgICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDdHgoKSwgXG4gICAgICAgICAgYzF4ID0gcG9zLngsIFxuICAgICAgICAgIGMxeSA9IHBvcy55IC0gZGltLCBcbiAgICAgICAgICBjMnggPSBjMXggLSBkaW0sIFxuICAgICAgICAgIGMyeSA9IHBvcy55ICsgZGltLCBcbiAgICAgICAgICBjM3ggPSBjMXggKyBkaW0sIFxuICAgICAgICAgIGMzeSA9IGMyeTtcbiAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgIGN0eC5tb3ZlVG8oYzF4LCBjMXkpO1xuICAgICAgY3R4LmxpbmVUbyhjMngsIGMyeSk7XG4gICAgICBjdHgubGluZVRvKGMzeCwgYzN5KTtcbiAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgIGN0eFt0eXBlXSgpO1xuICAgIH0sXG4gICAgLypcbiAgICBNZXRob2Q6IGNvbnRhaW5zXG4gICAgXG4gICAgUmV0dXJucyAqdHJ1ZSogaWYgKnBvcyogaXMgY29udGFpbmVkIGluIHRoZSBhcmVhIG9mIHRoZSBzaGFwZS4gUmV0dXJucyAqZmFsc2UqIG90aGVyd2lzZS5cbiAgICBcbiAgICBQYXJhbWV0ZXJzOlxuICAgIFxuICAgIG5wb3MgLSAob2JqZWN0KSBBbiAqeCosICp5KiBvYmplY3Qgd2l0aCB0aGUgPEdyYXBoLk5vZGU+IHBvc2l0aW9uLlxuICAgIHBvcyAtIChvYmplY3QpIEFuICp4KiwgKnkqIG9iamVjdCB3aXRoIHRoZSBwb3NpdGlvbiB0byBjaGVjay5cbiAgICBkaW0gLSAobnVtYmVyKSBIYWxmIHRoZSBiYXNlIGFuZCBoYWxmIHRoZSBoZWlnaHQgb2YgdGhlIHRyaWFuZ2xlLlxuICAgIFxuICAgIEV4YW1wbGU6XG4gICAgKHN0YXJ0IGNvZGUganMpXG4gICAgTm9kZUhlbHBlci50cmlhbmdsZS5jb250YWlucyh7IHg6IDEwLCB5OiAzMCB9LCB7IHg6IDE1LCB5OiAzNSB9LCAzMCk7XG4gICAgKGVuZCBjb2RlKVxuICAgICovXG4gICAgJ2NvbnRhaW5zJzogZnVuY3Rpb24obnBvcywgcG9zLCBkaW0pIHtcbiAgICAgIHJldHVybiBOb2RlSGVscGVyLmNpcmNsZS5jb250YWlucyhucG9zLCBwb3MsIGRpbSk7XG4gICAgfVxuICB9LFxuICAvKlxuICBPYmplY3Q6IE5vZGVIZWxwZXIuc3RhclxuICAqL1xuICAnc3Rhcic6IHtcbiAgICAvKlxuICAgIE1ldGhvZDogcmVuZGVyXG4gICAgXG4gICAgUmVuZGVycyBhIHN0YXIgKGNvbmNhdmUgZGVjYWdvbikgaW50byB0aGUgY2FudmFzLlxuICAgIFxuICAgIFBhcmFtZXRlcnM6XG4gICAgXG4gICAgdHlwZSAtIChzdHJpbmcpIFBvc3NpYmxlIG9wdGlvbnMgYXJlICdmaWxsJyBvciAnc3Ryb2tlJy5cbiAgICBwb3MgLSAob2JqZWN0KSBBbiAqeCosICp5KiBvYmplY3Qgd2l0aCB0aGUgcG9zaXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgc3Rhci5cbiAgICBkaW0gLSAobnVtYmVyKSBUaGUgbGVuZ3RoIG9mIGEgc2lkZSBvZiBhIGNvbmNhdmUgZGVjYWdvbi5cbiAgICBjYW52YXMgLSAob2JqZWN0KSBBIDxDYW52YXM+IGluc3RhbmNlLlxuICAgIFxuICAgIEV4YW1wbGU6XG4gICAgKHN0YXJ0IGNvZGUganMpXG4gICAgTm9kZUhlbHBlci5zdGFyLnJlbmRlcignc3Ryb2tlJywgeyB4OiAxMCwgeTogMzAgfSwgNDAsIHZpei5jYW52YXMpO1xuICAgIChlbmQgY29kZSlcbiAgICAqL1xuICAgICdyZW5kZXInOiBmdW5jdGlvbih0eXBlLCBwb3MsIGRpbSwgY2FudmFzKXtcbiAgICAgIHZhciBjdHggPSBjYW52YXMuZ2V0Q3R4KCksIFxuICAgICAgICAgIHBpNSA9IE1hdGguUEkgLyA1O1xuICAgICAgY3R4LnNhdmUoKTtcbiAgICAgIGN0eC50cmFuc2xhdGUocG9zLngsIHBvcy55KTtcbiAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgIGN0eC5tb3ZlVG8oZGltLCAwKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgOTsgaSsrKSB7XG4gICAgICAgIGN0eC5yb3RhdGUocGk1KTtcbiAgICAgICAgaWYgKGkgJSAyID09IDApIHtcbiAgICAgICAgICBjdHgubGluZVRvKChkaW0gLyAwLjUyNTczMSkgKiAwLjIwMDgxMSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3R4LmxpbmVUbyhkaW0sIDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgICBjdHhbdHlwZV0oKTtcbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfSxcbiAgICAvKlxuICAgIE1ldGhvZDogY29udGFpbnNcbiAgICBcbiAgICBSZXR1cm5zICp0cnVlKiBpZiAqcG9zKiBpcyBjb250YWluZWQgaW4gdGhlIGFyZWEgb2YgdGhlIHNoYXBlLiBSZXR1cm5zICpmYWxzZSogb3RoZXJ3aXNlLlxuICAgIFxuICAgIFBhcmFtZXRlcnM6XG4gICAgXG4gICAgbnBvcyAtIChvYmplY3QpIEFuICp4KiwgKnkqIG9iamVjdCB3aXRoIHRoZSA8R3JhcGguTm9kZT4gcG9zaXRpb24uXG4gICAgcG9zIC0gKG9iamVjdCkgQW4gKngqLCAqeSogb2JqZWN0IHdpdGggdGhlIHBvc2l0aW9uIHRvIGNoZWNrLlxuICAgIGRpbSAtIChudW1iZXIpIFRoZSBsZW5ndGggb2YgYSBzaWRlIG9mIGEgY29uY2F2ZSBkZWNhZ29uLlxuICAgIFxuICAgIEV4YW1wbGU6XG4gICAgKHN0YXJ0IGNvZGUganMpXG4gICAgTm9kZUhlbHBlci5zdGFyLmNvbnRhaW5zKHsgeDogMTAsIHk6IDMwIH0sIHsgeDogMTUsIHk6IDM1IH0sIDMwKTtcbiAgICAoZW5kIGNvZGUpXG4gICAgKi9cbiAgICAnY29udGFpbnMnOiBmdW5jdGlvbihucG9zLCBwb3MsIGRpbSkge1xuICAgICAgcmV0dXJuIE5vZGVIZWxwZXIuY2lyY2xlLmNvbnRhaW5zKG5wb3MsIHBvcywgZGltKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qXG4gIE9iamVjdDogRWRnZUhlbHBlclxuICBcbiAgQ29udGFpbnMgcmVuZGVyaW5nIHByaW1pdGl2ZXMgZm9yIHNpbXBsZSBlZGdlIHNoYXBlcy5cbiovXG52YXIgRWRnZUhlbHBlciA9IHtcbiAgLypcbiAgICBPYmplY3Q6IEVkZ2VIZWxwZXIubGluZVxuICAqL1xuICAnbGluZSc6IHtcbiAgICAgIC8qXG4gICAgICBNZXRob2Q6IHJlbmRlclxuICAgICAgXG4gICAgICBSZW5kZXJzIGEgbGluZSBpbnRvIHRoZSBjYW52YXMuXG4gICAgICBcbiAgICAgIFBhcmFtZXRlcnM6XG4gICAgICBcbiAgICAgIGZyb20gLSAob2JqZWN0KSBBbiAqeCosICp5KiBvYmplY3Qgd2l0aCB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIGxpbmUuXG4gICAgICB0byAtIChvYmplY3QpIEFuICp4KiwgKnkqIG9iamVjdCB3aXRoIHRoZSBlbmRpbmcgcG9zaXRpb24gb2YgdGhlIGxpbmUuXG4gICAgICBjYW52YXMgLSAob2JqZWN0KSBBIDxDYW52YXM+IGluc3RhbmNlLlxuICAgICAgXG4gICAgICBFeGFtcGxlOlxuICAgICAgKHN0YXJ0IGNvZGUganMpXG4gICAgICBFZGdlSGVscGVyLmxpbmUucmVuZGVyKHsgeDogMTAsIHk6IDMwIH0sIHsgeDogMTAsIHk6IDUwIH0sIHZpei5jYW52YXMpO1xuICAgICAgKGVuZCBjb2RlKVxuICAgICAgKi9cbiAgICAgICdyZW5kZXInOiBmdW5jdGlvbihmcm9tLCB0bywgY2FudmFzKXtcbiAgICAgICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDdHgoKTtcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBjdHgubW92ZVRvKGZyb20ueCwgZnJvbS55KTtcbiAgICAgICAgY3R4LmxpbmVUbyh0by54LCB0by55KTtcbiAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgfSxcbiAgICAgIC8qXG4gICAgICBNZXRob2Q6IGNvbnRhaW5zXG4gICAgICBcbiAgICAgIFJldHVybnMgKnRydWUqIGlmICpwb3MqIGlzIGNvbnRhaW5lZCBpbiB0aGUgYXJlYSBvZiB0aGUgc2hhcGUuIFJldHVybnMgKmZhbHNlKiBvdGhlcndpc2UuXG4gICAgICBcbiAgICAgIFBhcmFtZXRlcnM6XG4gICAgICBcbiAgICAgIHBvc0Zyb20gLSAob2JqZWN0KSBBbiAqeCosICp5KiBvYmplY3Qgd2l0aCBhIDxHcmFwaC5Ob2RlPiBwb3NpdGlvbi5cbiAgICAgIHBvc1RvIC0gKG9iamVjdCkgQW4gKngqLCAqeSogb2JqZWN0IHdpdGggYSA8R3JhcGguTm9kZT4gcG9zaXRpb24uXG4gICAgICBwb3MgLSAob2JqZWN0KSBBbiAqeCosICp5KiBvYmplY3Qgd2l0aCB0aGUgcG9zaXRpb24gdG8gY2hlY2suXG4gICAgICBlcHNpbG9uIC0gKG51bWJlcikgVGhlIGRpbWVuc2lvbiBvZiB0aGUgc2hhcGUuXG4gICAgICBcbiAgICAgIEV4YW1wbGU6XG4gICAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgIEVkZ2VIZWxwZXIubGluZS5jb250YWlucyh7IHg6IDEwLCB5OiAzMCB9LCB7IHg6IDE1LCB5OiAzNSB9LCB7IHg6IDE1LCB5OiAzNSB9LCAzMCk7XG4gICAgICAoZW5kIGNvZGUpXG4gICAgICAqL1xuICAgICAgJ2NvbnRhaW5zJzogZnVuY3Rpb24ocG9zRnJvbSwgcG9zVG8sIHBvcywgZXBzaWxvbikge1xuICAgICAgICB2YXIgbWluID0gTWF0aC5taW4sIFxuICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgsXG4gICAgICAgICAgICBtaW5Qb3NYID0gbWluKHBvc0Zyb20ueCwgcG9zVG8ueCksXG4gICAgICAgICAgICBtYXhQb3NYID0gbWF4KHBvc0Zyb20ueCwgcG9zVG8ueCksXG4gICAgICAgICAgICBtaW5Qb3NZID0gbWluKHBvc0Zyb20ueSwgcG9zVG8ueSksXG4gICAgICAgICAgICBtYXhQb3NZID0gbWF4KHBvc0Zyb20ueSwgcG9zVG8ueSk7XG4gICAgICAgICAgXG4gICAgICAgIGlmKHBvcy54ID49IG1pblBvc1ggJiYgcG9zLnggPD0gbWF4UG9zWCBcbiAgICAgICAgICAgICYmIHBvcy55ID49IG1pblBvc1kgJiYgcG9zLnkgPD0gbWF4UG9zWSkge1xuICAgICAgICAgIGlmKE1hdGguYWJzKHBvc1RvLnggLSBwb3NGcm9tLngpIDw9IGVwc2lsb24pIHtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBkaXN0ID0gKHBvc1RvLnkgLSBwb3NGcm9tLnkpIC8gKHBvc1RvLnggLSBwb3NGcm9tLngpICogKHBvcy54IC0gcG9zRnJvbS54KSArIHBvc0Zyb20ueTtcbiAgICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiBNYXRoLmFicyhkaXN0IC0gcG9zLnkpIDw9IGVwc2lsb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0sXG4gIC8qXG4gICAgT2JqZWN0OiBFZGdlSGVscGVyLmFycm93XG4gICovXG4gICdhcnJvdyc6IHtcbiAgICAgIC8qXG4gICAgICBNZXRob2Q6IHJlbmRlclxuICAgICAgXG4gICAgICBSZW5kZXJzIGFuIGFycm93IGludG8gdGhlIGNhbnZhcy5cbiAgICAgIFxuICAgICAgUGFyYW1ldGVyczpcbiAgICAgIFxuICAgICAgZnJvbSAtIChvYmplY3QpIEFuICp4KiwgKnkqIG9iamVjdCB3aXRoIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgYXJyb3cuXG4gICAgICB0byAtIChvYmplY3QpIEFuICp4KiwgKnkqIG9iamVjdCB3aXRoIHRoZSBlbmRpbmcgcG9zaXRpb24gb2YgdGhlIGFycm93LlxuICAgICAgZGltIC0gKG51bWJlcikgVGhlIGRpbWVuc2lvbiBvZiB0aGUgYXJyb3cuXG4gICAgICBzd2FwIC0gKGJvb2xlYW4pIFdoZXRoZXIgdG8gc2V0IHRoZSBhcnJvdyBwb2ludGluZyB0byB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb3IgdGhlIGVuZGluZyBwb3NpdGlvbi5cbiAgICAgIGNhbnZhcyAtIChvYmplY3QpIEEgPENhbnZhcz4gaW5zdGFuY2UuXG4gICAgICBcbiAgICAgIEV4YW1wbGU6XG4gICAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgIEVkZ2VIZWxwZXIuYXJyb3cucmVuZGVyKHsgeDogMTAsIHk6IDMwIH0sIHsgeDogMTAsIHk6IDUwIH0sIDEzLCBmYWxzZSwgdml6LmNhbnZhcyk7XG4gICAgICAoZW5kIGNvZGUpXG4gICAgICAqL1xuICAgICdyZW5kZXInOiBmdW5jdGlvbihmcm9tLCB0bywgZGltLCBzd2FwLCBjYW52YXMpe1xuICAgICAgICB2YXIgY3R4ID0gY2FudmFzLmdldEN0eCgpO1xuICAgICAgICAvLyBpbnZlcnQgZWRnZSBkaXJlY3Rpb25cbiAgICAgICAgaWYgKHN3YXApIHtcbiAgICAgICAgICB2YXIgdG1wID0gZnJvbTtcbiAgICAgICAgICBmcm9tID0gdG87XG4gICAgICAgICAgdG8gPSB0bXA7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZlY3QgPSBuZXcgQ29tcGxleCh0by54IC0gZnJvbS54LCB0by55IC0gZnJvbS55KTtcbiAgICAgICAgdmVjdC4kc2NhbGUoZGltIC8gdmVjdC5ub3JtKCkpO1xuICAgICAgICB2YXIgaW50ZXJtZWRpYXRlUG9pbnQgPSBuZXcgQ29tcGxleCh0by54IC0gdmVjdC54LCB0by55IC0gdmVjdC55KSxcbiAgICAgICAgICAgIG5vcm1hbCA9IG5ldyBDb21wbGV4KC12ZWN0LnkgLyAyLCB2ZWN0LnggLyAyKSxcbiAgICAgICAgICAgIHYxID0gaW50ZXJtZWRpYXRlUG9pbnQuYWRkKG5vcm1hbCksIFxuICAgICAgICAgICAgdjIgPSBpbnRlcm1lZGlhdGVQb2ludC4kYWRkKG5vcm1hbC4kc2NhbGUoLTEpKTtcbiAgICAgICAgXG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgY3R4Lm1vdmVUbyhmcm9tLngsIGZyb20ueSk7XG4gICAgICAgIGN0eC5saW5lVG8odG8ueCwgdG8ueSk7XG4gICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBjdHgubW92ZVRvKHYxLngsIHYxLnkpO1xuICAgICAgICBjdHgubGluZVRvKHYyLngsIHYyLnkpO1xuICAgICAgICBjdHgubGluZVRvKHRvLngsIHRvLnkpO1xuICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgICAgIGN0eC5maWxsKCk7XG4gICAgfSxcbiAgICAvKlxuICAgIE1ldGhvZDogY29udGFpbnNcbiAgICBcbiAgICBSZXR1cm5zICp0cnVlKiBpZiAqcG9zKiBpcyBjb250YWluZWQgaW4gdGhlIGFyZWEgb2YgdGhlIHNoYXBlLiBSZXR1cm5zICpmYWxzZSogb3RoZXJ3aXNlLlxuICAgIFxuICAgIFBhcmFtZXRlcnM6XG4gICAgXG4gICAgcG9zRnJvbSAtIChvYmplY3QpIEFuICp4KiwgKnkqIG9iamVjdCB3aXRoIGEgPEdyYXBoLk5vZGU+IHBvc2l0aW9uLlxuICAgIHBvc1RvIC0gKG9iamVjdCkgQW4gKngqLCAqeSogb2JqZWN0IHdpdGggYSA8R3JhcGguTm9kZT4gcG9zaXRpb24uXG4gICAgcG9zIC0gKG9iamVjdCkgQW4gKngqLCAqeSogb2JqZWN0IHdpdGggdGhlIHBvc2l0aW9uIHRvIGNoZWNrLlxuICAgIGVwc2lsb24gLSAobnVtYmVyKSBUaGUgZGltZW5zaW9uIG9mIHRoZSBzaGFwZS5cbiAgICBcbiAgICBFeGFtcGxlOlxuICAgIChzdGFydCBjb2RlIGpzKVxuICAgIEVkZ2VIZWxwZXIuYXJyb3cuY29udGFpbnMoeyB4OiAxMCwgeTogMzAgfSwgeyB4OiAxNSwgeTogMzUgfSwgeyB4OiAxNSwgeTogMzUgfSwgMzApO1xuICAgIChlbmQgY29kZSlcbiAgICAqL1xuICAgICdjb250YWlucyc6IGZ1bmN0aW9uKHBvc0Zyb20sIHBvc1RvLCBwb3MsIGVwc2lsb24pIHtcbiAgICAgIHJldHVybiBFZGdlSGVscGVyLmxpbmUuY29udGFpbnMocG9zRnJvbSwgcG9zVG8sIHBvcywgZXBzaWxvbik7XG4gICAgfVxuICB9LFxuICAvKlxuICAgIE9iamVjdDogRWRnZUhlbHBlci5oeXBlcmxpbmVcbiAgKi9cbiAgJ2h5cGVybGluZSc6IHtcbiAgICAvKlxuICAgIE1ldGhvZDogcmVuZGVyXG4gICAgXG4gICAgUmVuZGVycyBhIGh5cGVybGluZSBpbnRvIHRoZSBjYW52YXMuIEEgaHlwZXJsaW5lIGFyZSB0aGUgbGluZXMgZHJhd24gZm9yIHRoZSA8SHlwZXJ0cmVlPiB2aXN1YWxpemF0aW9uLlxuICAgIFxuICAgIFBhcmFtZXRlcnM6XG4gICAgXG4gICAgZnJvbSAtIChvYmplY3QpIEFuICp4KiwgKnkqIG9iamVjdCB3aXRoIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgaHlwZXJsaW5lLiAqeCogYW5kICp5KiBtdXN0IGJlbG9uZyB0byBbMCwgMSkuXG4gICAgdG8gLSAob2JqZWN0KSBBbiAqeCosICp5KiBvYmplY3Qgd2l0aCB0aGUgZW5kaW5nIHBvc2l0aW9uIG9mIHRoZSBoeXBlcmxpbmUuICp4KiBhbmQgKnkqIG11c3QgYmVsb25nIHRvIFswLCAxKS5cbiAgICByIC0gKG51bWJlcikgVGhlIHNjYWxpbmcgZmFjdG9yLlxuICAgIGNhbnZhcyAtIChvYmplY3QpIEEgPENhbnZhcz4gaW5zdGFuY2UuXG4gICAgXG4gICAgRXhhbXBsZTpcbiAgICAoc3RhcnQgY29kZSBqcylcbiAgICBFZGdlSGVscGVyLmh5cGVybGluZS5yZW5kZXIoeyB4OiAxMCwgeTogMzAgfSwgeyB4OiAxMCwgeTogNTAgfSwgMTAwLCB2aXouY2FudmFzKTtcbiAgICAoZW5kIGNvZGUpXG4gICAgKi9cbiAgICAncmVuZGVyJzogZnVuY3Rpb24oZnJvbSwgdG8sIHIsIGNhbnZhcyl7XG4gICAgICB2YXIgY3R4ID0gY2FudmFzLmdldEN0eCgpOyAgXG4gICAgICB2YXIgY2VudGVyT2ZDaXJjbGUgPSBjb21wdXRlQXJjVGhyb3VnaFR3b1BvaW50cyhmcm9tLCB0byk7XG4gICAgICBpZiAoY2VudGVyT2ZDaXJjbGUuYSA+IDEwMDAgfHwgY2VudGVyT2ZDaXJjbGUuYiA+IDEwMDBcbiAgICAgICAgICB8fCBjZW50ZXJPZkNpcmNsZS5yYXRpbyA8IDApIHtcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBjdHgubW92ZVRvKGZyb20ueCAqIHIsIGZyb20ueSAqIHIpO1xuICAgICAgICBjdHgubGluZVRvKHRvLnggKiByLCB0by55ICogcik7XG4gICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBhbmdsZUJlZ2luID0gTWF0aC5hdGFuMih0by55IC0gY2VudGVyT2ZDaXJjbGUueSwgdG8ueFxuICAgICAgICAgICAgLSBjZW50ZXJPZkNpcmNsZS54KTtcbiAgICAgICAgdmFyIGFuZ2xlRW5kID0gTWF0aC5hdGFuMihmcm9tLnkgLSBjZW50ZXJPZkNpcmNsZS55LCBmcm9tLnhcbiAgICAgICAgICAgIC0gY2VudGVyT2ZDaXJjbGUueCk7XG4gICAgICAgIHZhciBzZW5zZSA9IHNlbnNlKGFuZ2xlQmVnaW4sIGFuZ2xlRW5kKTtcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBjdHguYXJjKGNlbnRlck9mQ2lyY2xlLnggKiByLCBjZW50ZXJPZkNpcmNsZS55ICogciwgY2VudGVyT2ZDaXJjbGUucmF0aW9cbiAgICAgICAgICAgICogciwgYW5nbGVCZWdpbiwgYW5nbGVFbmQsIHNlbnNlKTtcbiAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgfVxuICAgICAgLyogICAgICBcbiAgICAgICAgQ2FsY3VsYXRlcyB0aGUgYXJjIHBhcmFtZXRlcnMgdGhyb3VnaCB0d28gcG9pbnRzLlxuICAgICAgICBcbiAgICAgICAgTW9yZSBpbmZvcm1hdGlvbiBpbiA8aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Qb2luY2FyJUMzJUE5X2Rpc2NfbW9kZWwjQW5hbHl0aWNfZ2VvbWV0cnlfY29uc3RydWN0aW9uc19pbl90aGVfaHlwZXJib2xpY19wbGFuZT4gXG4gICAgICBcbiAgICAgICAgUGFyYW1ldGVyczpcbiAgICAgIFxuICAgICAgICBwMSAtIEEgPENvbXBsZXg+IGluc3RhbmNlLlxuICAgICAgICBwMiAtIEEgPENvbXBsZXg+IGluc3RhbmNlLlxuICAgICAgICBzY2FsZSAtIFRoZSBEaXNrJ3MgZGlhbWV0ZXIuXG4gICAgICBcbiAgICAgICAgUmV0dXJuczpcbiAgICAgIFxuICAgICAgICBBbiBvYmplY3QgY29udGFpbmluZyBzb21lIGFyYyBwcm9wZXJ0aWVzLlxuICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIGNvbXB1dGVBcmNUaHJvdWdoVHdvUG9pbnRzKHAxLCBwMil7XG4gICAgICAgIHZhciBhRGVuID0gKHAxLnggKiBwMi55IC0gcDEueSAqIHAyLngpLCBiRGVuID0gYURlbjtcbiAgICAgICAgdmFyIHNxMSA9IHAxLnNxdWFyZWROb3JtKCksIHNxMiA9IHAyLnNxdWFyZWROb3JtKCk7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBhIHN0cmFpZ2h0IGxpbmVcbiAgICAgICAgaWYgKGFEZW4gPT0gMClcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICByYXRpbzogLTFcbiAgICAgICAgICB9O1xuICAgIFxuICAgICAgICB2YXIgYSA9IChwMS55ICogc3EyIC0gcDIueSAqIHNxMSArIHAxLnkgLSBwMi55KSAvIGFEZW47XG4gICAgICAgIHZhciBiID0gKHAyLnggKiBzcTEgLSBwMS54ICogc3EyICsgcDIueCAtIHAxLngpIC8gYkRlbjtcbiAgICAgICAgdmFyIHggPSAtYSAvIDI7XG4gICAgICAgIHZhciB5ID0gLWIgLyAyO1xuICAgICAgICB2YXIgc3F1YXJlZFJhdGlvID0gKGEgKiBhICsgYiAqIGIpIC8gNCAtIDE7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBhIHN0cmFpZ2h0IGxpbmVcbiAgICAgICAgaWYgKHNxdWFyZWRSYXRpbyA8IDApXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgcmF0aW86IC0xXG4gICAgICAgICAgfTtcbiAgICAgICAgdmFyIHJhdGlvID0gTWF0aC5zcXJ0KHNxdWFyZWRSYXRpbyk7XG4gICAgICAgIHZhciBvdXQgPSB7XG4gICAgICAgICAgeDogeCxcbiAgICAgICAgICB5OiB5LFxuICAgICAgICAgIHJhdGlvOiByYXRpbyA+IDEwMDA/IC0xIDogcmF0aW8sXG4gICAgICAgICAgYTogYSxcbiAgICAgICAgICBiOiBiXG4gICAgICAgIH07XG4gICAgXG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgICB9XG4gICAgICAvKiAgICAgIFxuICAgICAgICBTZXRzIGFuZ2xlIGRpcmVjdGlvbiB0byBjbG9ja3dpc2UgKHRydWUpIG9yIGNvdW50ZXJjbG9ja3dpc2UgKGZhbHNlKS4gXG4gICAgICAgICBcbiAgICAgICAgUGFyYW1ldGVyczogXG4gICAgICBcbiAgICAgICAgICAgYW5nbGVCZWdpbiAtIFN0YXJ0aW5nIGFuZ2xlIGZvciBkcmF3aW5nIHRoZSBhcmMuIFxuICAgICAgICAgICBhbmdsZUVuZCAtIFRoZSBIeXBlckxpbmUgd2lsbCBiZSBkcmF3biBmcm9tIGFuZ2xlQmVnaW4gdG8gYW5nbGVFbmQuIFxuICAgICAgXG4gICAgICAgIFJldHVybnM6IFxuICAgICAgXG4gICAgICAgICAgIEEgQm9vbGVhbiBpbnN0YW5jZSBkZXNjcmliaW5nIHRoZSBzZW5zZSBmb3IgZHJhd2luZyB0aGUgSHlwZXJMaW5lLiBcbiAgICAgICovXG4gICAgICBmdW5jdGlvbiBzZW5zZShhbmdsZUJlZ2luLCBhbmdsZUVuZCl7XG4gICAgICAgIHJldHVybiAoYW5nbGVCZWdpbiA8IGFuZ2xlRW5kKT8gKChhbmdsZUJlZ2luICsgTWF0aC5QSSA+IGFuZ2xlRW5kKT8gZmFsc2VcbiAgICAgICAgICAgIDogdHJ1ZSkgOiAoKGFuZ2xlRW5kICsgTWF0aC5QSSA+IGFuZ2xlQmVnaW4pPyB0cnVlIDogZmFsc2UpO1xuICAgICAgfVxuICAgIH0sXG4gICAgLypcbiAgICBNZXRob2Q6IGNvbnRhaW5zXG4gICAgXG4gICAgTm90IEltcGxlbWVudGVkXG4gICAgXG4gICAgUmV0dXJucyAqdHJ1ZSogaWYgKnBvcyogaXMgY29udGFpbmVkIGluIHRoZSBhcmVhIG9mIHRoZSBzaGFwZS4gUmV0dXJucyAqZmFsc2UqIG90aGVyd2lzZS5cbiAgICBcbiAgICBQYXJhbWV0ZXJzOlxuICAgIFxuICAgIHBvc0Zyb20gLSAob2JqZWN0KSBBbiAqeCosICp5KiBvYmplY3Qgd2l0aCBhIDxHcmFwaC5Ob2RlPiBwb3NpdGlvbi5cbiAgICBwb3NUbyAtIChvYmplY3QpIEFuICp4KiwgKnkqIG9iamVjdCB3aXRoIGEgPEdyYXBoLk5vZGU+IHBvc2l0aW9uLlxuICAgIHBvcyAtIChvYmplY3QpIEFuICp4KiwgKnkqIG9iamVjdCB3aXRoIHRoZSBwb3NpdGlvbiB0byBjaGVjay5cbiAgICBlcHNpbG9uIC0gKG51bWJlcikgVGhlIGRpbWVuc2lvbiBvZiB0aGUgc2hhcGUuXG4gICAgXG4gICAgRXhhbXBsZTpcbiAgICAoc3RhcnQgY29kZSBqcylcbiAgICBFZGdlSGVscGVyLmh5cGVybGluZS5jb250YWlucyh7IHg6IDEwLCB5OiAzMCB9LCB7IHg6IDE1LCB5OiAzNSB9LCB7IHg6IDE1LCB5OiAzNSB9LCAzMCk7XG4gICAgKGVuZCBjb2RlKVxuICAgICovXG4gICAgJ2NvbnRhaW5zJzogJC5sYW1iZGEoZmFsc2UpXG4gIH1cbn07XG5cblxuLypcbiAqIEZpbGU6IEdyYXBoLlBsb3QuanNcbiAqL1xuXG4vKlxuICAgT2JqZWN0OiBHcmFwaC5QbG90XG5cbiAgIDxHcmFwaD4gcmVuZGVyaW5nIGFuZCBhbmltYXRpb24gbWV0aG9kcy5cbiAgIFxuICAgUHJvcGVydGllczpcbiAgIFxuICAgbm9kZUhlbHBlciAtIDxOb2RlSGVscGVyPiBvYmplY3QuXG4gICBlZGdlSGVscGVyIC0gPEVkZ2VIZWxwZXI+IG9iamVjdC5cbiovXG5HcmFwaC5QbG90ID0ge1xuICAgIC8vRGVmYXVsdCBpbml0aWFsaXplclxuICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKHZpeiwga2xhc3Mpe1xuICAgICAgdGhpcy52aXogPSB2aXo7XG4gICAgICB0aGlzLmNvbmZpZyA9IHZpei5jb25maWc7XG4gICAgICB0aGlzLm5vZGUgPSB2aXouY29uZmlnLk5vZGU7XG4gICAgICB0aGlzLmVkZ2UgPSB2aXouY29uZmlnLkVkZ2U7XG4gICAgICB0aGlzLmFuaW1hdGlvbiA9IG5ldyBBbmltYXRpb247XG4gICAgICB0aGlzLm5vZGVUeXBlcyA9IG5ldyBrbGFzcy5QbG90Lk5vZGVUeXBlcztcbiAgICAgIHRoaXMuZWRnZVR5cGVzID0gbmV3IGtsYXNzLlBsb3QuRWRnZVR5cGVzO1xuICAgICAgdGhpcy5sYWJlbHMgPSB2aXoubGFiZWxzO1xuICAgfSxcblxuICAgIC8vQWRkIGhlbHBlcnNcbiAgICBub2RlSGVscGVyOiBOb2RlSGVscGVyLFxuICAgIGVkZ2VIZWxwZXI6IEVkZ2VIZWxwZXIsXG4gICAgXG4gICAgSW50ZXJwb2xhdG9yOiB7XG4gICAgICAgIC8vbm9kZS9lZGdlIHByb3BlcnR5IHBhcnNlcnNcbiAgICAgICAgJ21hcCc6IHtcbiAgICAgICAgICAnYm9yZGVyJzogJ2NvbG9yJyxcbiAgICAgICAgICAnY29sb3InOiAnY29sb3InLFxuICAgICAgICAgICd3aWR0aCc6ICdudW1iZXInLFxuICAgICAgICAgICdoZWlnaHQnOiAnbnVtYmVyJyxcbiAgICAgICAgICAnZGltJzogJ251bWJlcicsXG4gICAgICAgICAgJ2FscGhhJzogJ251bWJlcicsXG4gICAgICAgICAgJ2xpbmVXaWR0aCc6ICdudW1iZXInLFxuICAgICAgICAgICdhbmd1bGFyV2lkdGgnOidudW1iZXInLFxuICAgICAgICAgICdzcGFuJzonbnVtYmVyJyxcbiAgICAgICAgICAndmFsdWVBcnJheSc6J2FycmF5LW51bWJlcicsXG4gICAgICAgICAgJ2RpbUFycmF5JzonYXJyYXktbnVtYmVyJ1xuICAgICAgICAgIC8vJ2NvbG9yQXJyYXknOidhcnJheS1jb2xvcidcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8vY2FudmFzIHNwZWNpZmljIHBhcnNlcnNcbiAgICAgICAgJ2NhbnZhcyc6IHtcbiAgICAgICAgICAnZ2xvYmFsQWxwaGEnOiAnbnVtYmVyJyxcbiAgICAgICAgICAnZmlsbFN0eWxlJzogJ2NvbG9yJyxcbiAgICAgICAgICAnc3Ryb2tlU3R5bGUnOiAnY29sb3InLFxuICAgICAgICAgICdsaW5lV2lkdGgnOiAnbnVtYmVyJyxcbiAgICAgICAgICAnc2hhZG93Qmx1cic6ICdudW1iZXInLFxuICAgICAgICAgICdzaGFkb3dDb2xvcic6ICdjb2xvcicsXG4gICAgICAgICAgJ3NoYWRvd09mZnNldFgnOiAnbnVtYmVyJyxcbiAgICAgICAgICAnc2hhZG93T2Zmc2V0WSc6ICdudW1iZXInLFxuICAgICAgICAgICdtaXRlckxpbWl0JzogJ251bWJlcidcbiAgICAgICAgfSxcbiAgXG4gICAgICAgIC8vbGFiZWwgcGFyc2Vyc1xuICAgICAgICAnbGFiZWwnOiB7XG4gICAgICAgICAgJ3NpemUnOiAnbnVtYmVyJyxcbiAgICAgICAgICAnY29sb3InOiAnY29sb3InXG4gICAgICAgIH0sXG4gIFxuICAgICAgICAvL051bWJlciBpbnRlcnBvbGF0b3JcbiAgICAgICAgJ2NvbXB1dGUnOiBmdW5jdGlvbihmcm9tLCB0bywgZGVsdGEpIHtcbiAgICAgICAgICByZXR1cm4gZnJvbSArICh0byAtIGZyb20pICogZGVsdGE7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvL1Bvc2l0aW9uIGludGVycG9sYXRvcnNcbiAgICAgICAgJ21vZWJpdXMnOiBmdW5jdGlvbihlbGVtLCBwcm9wcywgZGVsdGEsIHZlY3Rvcikge1xuICAgICAgICAgIHZhciB2ID0gdmVjdG9yLnNjYWxlKC1kZWx0YSk7ICBcbiAgICAgICAgICBpZih2Lm5vcm0oKSA8IDEpIHtcbiAgICAgICAgICAgICAgdmFyIHggPSB2LngsIHkgPSB2Lnk7XG4gICAgICAgICAgICAgIHZhciBhbnMgPSBlbGVtLnN0YXJ0UG9zXG4gICAgICAgICAgICAgICAgLmdldGMoKS5tb2ViaXVzVHJhbnNmb3JtYXRpb24odik7XG4gICAgICAgICAgICAgIGVsZW0ucG9zLnNldGMoYW5zLngsIGFucy55KTtcbiAgICAgICAgICAgICAgdi54ID0geDsgdi55ID0geTtcbiAgICAgICAgICAgIH0gICAgICAgICAgIFxuICAgICAgICB9LFxuXG4gICAgICAgICdsaW5lYXInOiBmdW5jdGlvbihlbGVtLCBwcm9wcywgZGVsdGEpIHtcbiAgICAgICAgICAgIHZhciBmcm9tID0gZWxlbS5zdGFydFBvcy5nZXRjKHRydWUpO1xuICAgICAgICAgICAgdmFyIHRvID0gZWxlbS5lbmRQb3MuZ2V0Yyh0cnVlKTtcbiAgICAgICAgICAgIGVsZW0ucG9zLnNldGModGhpcy5jb21wdXRlKGZyb20ueCwgdG8ueCwgZGVsdGEpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlKGZyb20ueSwgdG8ueSwgZGVsdGEpKTtcbiAgICAgICAgfSxcblxuICAgICAgICAncG9sYXInOiBmdW5jdGlvbihlbGVtLCBwcm9wcywgZGVsdGEpIHtcbiAgICAgICAgICB2YXIgZnJvbSA9IGVsZW0uc3RhcnRQb3MuZ2V0cCh0cnVlKTtcbiAgICAgICAgICB2YXIgdG8gPSBlbGVtLmVuZFBvcy5nZXRwKCk7XG4gICAgICAgICAgdmFyIGFucyA9IHRvLmludGVycG9sYXRlKGZyb20sIGRlbHRhKTtcbiAgICAgICAgICBlbGVtLnBvcy5zZXRwKGFucy50aGV0YSwgYW5zLnJobyk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAvL0dyYXBoJ3MgTm9kZS9FZGdlIGludGVycG9sYXRvcnNcbiAgICAgICAgJ251bWJlcic6IGZ1bmN0aW9uKGVsZW0sIHByb3AsIGRlbHRhLCBnZXR0ZXIsIHNldHRlcikge1xuICAgICAgICAgIHZhciBmcm9tID0gZWxlbVtnZXR0ZXJdKHByb3AsICdzdGFydCcpO1xuICAgICAgICAgIHZhciB0byA9IGVsZW1bZ2V0dGVyXShwcm9wLCAnZW5kJyk7XG4gICAgICAgICAgZWxlbVtzZXR0ZXJdKHByb3AsIHRoaXMuY29tcHV0ZShmcm9tLCB0bywgZGVsdGEpKTtcbiAgICAgICAgfSxcblxuICAgICAgICAnY29sb3InOiBmdW5jdGlvbihlbGVtLCBwcm9wLCBkZWx0YSwgZ2V0dGVyLCBzZXR0ZXIpIHtcbiAgICAgICAgICB2YXIgZnJvbSA9ICQuaGV4VG9SZ2IoZWxlbVtnZXR0ZXJdKHByb3AsICdzdGFydCcpKTtcbiAgICAgICAgICB2YXIgdG8gPSAkLmhleFRvUmdiKGVsZW1bZ2V0dGVyXShwcm9wLCAnZW5kJykpO1xuICAgICAgICAgIHZhciBjb21wID0gdGhpcy5jb21wdXRlO1xuICAgICAgICAgIHZhciB2YWwgPSAkLnJnYlRvSGV4KFtwYXJzZUludChjb21wKGZyb21bMF0sIHRvWzBdLCBkZWx0YSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChjb21wKGZyb21bMV0sIHRvWzFdLCBkZWx0YSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChjb21wKGZyb21bMl0sIHRvWzJdLCBkZWx0YSkpXSk7XG4gICAgICAgICAgXG4gICAgICAgICAgZWxlbVtzZXR0ZXJdKHByb3AsIHZhbCk7XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAnYXJyYXktbnVtYmVyJzogZnVuY3Rpb24oZWxlbSwgcHJvcCwgZGVsdGEsIGdldHRlciwgc2V0dGVyKSB7XG4gICAgICAgICAgdmFyIGZyb20gPSBlbGVtW2dldHRlcl0ocHJvcCwgJ3N0YXJ0JyksXG4gICAgICAgICAgICAgIHRvID0gZWxlbVtnZXR0ZXJdKHByb3AsICdlbmQnKSxcbiAgICAgICAgICAgICAgY3VyID0gW107XG4gICAgICAgICAgZm9yKHZhciBpPTAsIGw9ZnJvbS5sZW5ndGg7IGk8bDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZnJvbWkgPSBmcm9tW2ldLCB0b2kgPSB0b1tpXTtcbiAgICAgICAgICAgIGlmKGZyb21pLmxlbmd0aCkge1xuICAgICAgICAgICAgICBmb3IodmFyIGo9MCwgbGVuPWZyb21pLmxlbmd0aCwgY3VyaT1bXTsgajxsZW47IGorKykge1xuICAgICAgICAgICAgICAgIGN1cmkucHVzaCh0aGlzLmNvbXB1dGUoZnJvbWlbal0sIHRvaVtqXSwgZGVsdGEpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjdXIucHVzaChjdXJpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGN1ci5wdXNoKHRoaXMuY29tcHV0ZShmcm9taSwgdG9pLCBkZWx0YSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbGVtW3NldHRlcl0ocHJvcCwgY3VyKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgICdub2RlJzogZnVuY3Rpb24oZWxlbSwgcHJvcHMsIGRlbHRhLCBtYXAsIGdldHRlciwgc2V0dGVyKSB7XG4gICAgICAgICAgbWFwID0gdGhpc1ttYXBdO1xuICAgICAgICAgIGlmKHByb3BzKSB7XG4gICAgICAgICAgICB2YXIgbGVuID0gcHJvcHMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yKHZhciBpPTA7IGk8bGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFyIHBpID0gcHJvcHNbaV07XG4gICAgICAgICAgICAgIHRoaXNbbWFwW3BpXV0oZWxlbSwgcGksIGRlbHRhLCBnZXR0ZXIsIHNldHRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvcih2YXIgcGkgaW4gbWFwKSB7XG4gICAgICAgICAgICAgIHRoaXNbbWFwW3BpXV0oZWxlbSwgcGksIGRlbHRhLCBnZXR0ZXIsIHNldHRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgJ2VkZ2UnOiBmdW5jdGlvbihlbGVtLCBwcm9wcywgZGVsdGEsIG1hcEtleSwgZ2V0dGVyLCBzZXR0ZXIpIHtcbiAgICAgICAgICAgIHZhciBhZGpzID0gZWxlbS5hZGphY2VuY2llcztcbiAgICAgICAgICAgIGZvcih2YXIgaWQgaW4gYWRqcykgdGhpc1snbm9kZSddKGFkanNbaWRdLCBwcm9wcywgZGVsdGEsIG1hcEtleSwgZ2V0dGVyLCBzZXR0ZXIpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgJ25vZGUtcHJvcGVydHknOiBmdW5jdGlvbihlbGVtLCBwcm9wcywgZGVsdGEpIHtcbiAgICAgICAgICB0aGlzWydub2RlJ10oZWxlbSwgcHJvcHMsIGRlbHRhLCAnbWFwJywgJ2dldERhdGEnLCAnc2V0RGF0YScpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgJ2VkZ2UtcHJvcGVydHknOiBmdW5jdGlvbihlbGVtLCBwcm9wcywgZGVsdGEpIHtcbiAgICAgICAgICB0aGlzWydlZGdlJ10oZWxlbSwgcHJvcHMsIGRlbHRhLCAnbWFwJywgJ2dldERhdGEnLCAnc2V0RGF0YScpOyAgXG4gICAgICAgIH0sXG5cbiAgICAgICAgJ2xhYmVsLXByb3BlcnR5JzogZnVuY3Rpb24oZWxlbSwgcHJvcHMsIGRlbHRhKSB7XG4gICAgICAgICAgdGhpc1snbm9kZSddKGVsZW0sIHByb3BzLCBkZWx0YSwgJ2xhYmVsJywgJ2dldExhYmVsRGF0YScsICdzZXRMYWJlbERhdGEnKTtcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgICdub2RlLXN0eWxlJzogZnVuY3Rpb24oZWxlbSwgcHJvcHMsIGRlbHRhKSB7XG4gICAgICAgICAgdGhpc1snbm9kZSddKGVsZW0sIHByb3BzLCBkZWx0YSwgJ2NhbnZhcycsICdnZXRDYW52YXNTdHlsZScsICdzZXRDYW52YXNTdHlsZScpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgJ2VkZ2Utc3R5bGUnOiBmdW5jdGlvbihlbGVtLCBwcm9wcywgZGVsdGEpIHtcbiAgICAgICAgICB0aGlzWydlZGdlJ10oZWxlbSwgcHJvcHMsIGRlbHRhLCAnY2FudmFzJywgJ2dldENhbnZhc1N0eWxlJywgJ3NldENhbnZhc1N0eWxlJyk7ICBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXG4gIFxuICAgIC8qXG4gICAgICAgc2VxdWVuY2VcbiAgICBcbiAgICAgICBJdGVyYXRpdmVseSBwZXJmb3JtcyBhbiBhY3Rpb24gd2hpbGUgcmVmcmVzaGluZyB0aGUgc3RhdGUgb2YgdGhlIHZpc3VhbGl6YXRpb24uXG5cbiAgICAgICBQYXJhbWV0ZXJzOlxuXG4gICAgICAgb3B0aW9ucyAtIChvYmplY3QpIEFuIG9iamVjdCBjb250YWluaW5nIHNvbWUgc2VxdWVuY2Ugb3B0aW9ucyBkZXNjcmliZWQgYmVsb3dcbiAgICAgICBjb25kaXRpb24gLSAoZnVuY3Rpb24pIEEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgYm9vbGVhbiBpbnN0YW5jZSBpbiBvcmRlciB0byBzdG9wIGl0ZXJhdGlvbnMuXG4gICAgICAgc3RlcCAtIChmdW5jdGlvbikgQSBmdW5jdGlvbiB0byBleGVjdXRlIG9uIGVhY2ggc3RlcCBvZiB0aGUgaXRlcmF0aW9uLlxuICAgICAgIG9uQ29tcGxldGUgLSAoZnVuY3Rpb24pIEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBzZXF1ZW5jZSBmaW5pc2hlcy5cbiAgICAgICBkdXJhdGlvbiAtIChudW1iZXIpIER1cmF0aW9uIChpbiBtaWxsaXNlY29uZHMpIG9mIGVhY2ggc3RlcC5cblxuICAgICAgRXhhbXBsZTpcbiAgICAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgICAgdmFyIHJnID0gbmV3ICRqaXQuUkdyYXBoKG9wdGlvbnMpO1xuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIHJnLmZ4LnNlcXVlbmNlKHtcbiAgICAgICAgICBjb25kaXRpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICByZXR1cm4gaSA9PSAxMDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0ZXA6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgYWxlcnQoaSsrKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uQ29tcGxldGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICBhbGVydCgnZG9uZSEnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgIChlbmQgY29kZSlcblxuICAgICovXG4gICAgc2VxdWVuY2U6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICBvcHRpb25zID0gJC5tZXJnZSh7XG4gICAgICAgICAgY29uZGl0aW9uOiAkLmxhbWJkYShmYWxzZSksXG4gICAgICAgICAgc3RlcDogJC5lbXB0eSxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAkLmVtcHR5LFxuICAgICAgICAgIGR1cmF0aW9uOiAyMDBcbiAgICAgICAgfSwgb3B0aW9ucyB8fCB7fSk7XG5cbiAgICAgICAgdmFyIGludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYob3B0aW9ucy5jb25kaXRpb24oKSkge1xuICAgICAgICAgICAgb3B0aW9ucy5zdGVwKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgb3B0aW9ucy5vbkNvbXBsZXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoYXQudml6LnJlZnJlc2godHJ1ZSk7XG4gICAgICAgIH0sIG9wdGlvbnMuZHVyYXRpb24pO1xuICAgIH0sXG4gICAgXG4gICAgLypcbiAgICAgIHByZXBhcmVcbiBcbiAgICAgIFByZXBhcmUgZ3JhcGggcG9zaXRpb24gYW5kIG90aGVyIGF0dHJpYnV0ZSB2YWx1ZXMgYmVmb3JlIHBlcmZvcm1pbmcgYW4gQW5pbWF0aW9uLiBcbiAgICAgIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgVG9vbGtpdC5cbiAgICAgIFxuICAgICAgU2VlIGFsc286XG4gICAgICAgXG4gICAgICAgPEFuaW1hdGlvbj4sIDxHcmFwaC5QbG90LmFuaW1hdGU+XG5cbiAgICAqL1xuICAgIHByZXBhcmU6IGZ1bmN0aW9uKG1vZGVzKSB7XG4gICAgICB2YXIgZ3JhcGggPSB0aGlzLnZpei5ncmFwaCxcbiAgICAgICAgICBhY2Nlc3NvcnMgPSB7XG4gICAgICAgICAgICAnbm9kZS1wcm9wZXJ0eSc6IHtcbiAgICAgICAgICAgICAgJ2dldHRlcic6ICdnZXREYXRhJyxcbiAgICAgICAgICAgICAgJ3NldHRlcic6ICdzZXREYXRhJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdlZGdlLXByb3BlcnR5Jzoge1xuICAgICAgICAgICAgICAnZ2V0dGVyJzogJ2dldERhdGEnLFxuICAgICAgICAgICAgICAnc2V0dGVyJzogJ3NldERhdGEnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ25vZGUtc3R5bGUnOiB7XG4gICAgICAgICAgICAgICdnZXR0ZXInOiAnZ2V0Q2FudmFzU3R5bGUnLFxuICAgICAgICAgICAgICAnc2V0dGVyJzogJ3NldENhbnZhc1N0eWxlJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdlZGdlLXN0eWxlJzoge1xuICAgICAgICAgICAgICAnZ2V0dGVyJzogJ2dldENhbnZhc1N0eWxlJyxcbiAgICAgICAgICAgICAgJ3NldHRlcic6ICdzZXRDYW52YXNTdHlsZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuXG4gICAgICAvL3BhcnNlIG1vZGVzXG4gICAgICB2YXIgbSA9IHt9O1xuICAgICAgaWYoJC50eXBlKG1vZGVzKSA9PSAnYXJyYXknKSB7XG4gICAgICAgIGZvcih2YXIgaT0wLCBsZW49bW9kZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICB2YXIgZWxlbXMgPSBtb2Rlc1tpXS5zcGxpdCgnOicpO1xuICAgICAgICAgIG1bZWxlbXMuc2hpZnQoKV0gPSBlbGVtcztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yKHZhciBwIGluIG1vZGVzKSB7XG4gICAgICAgICAgaWYocCA9PSAncG9zaXRpb24nKSB7XG4gICAgICAgICAgICBtW21vZGVzLnBvc2l0aW9uXSA9IFtdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtW3BdID0gJC5zcGxhdChtb2Rlc1twXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIGdyYXBoLmVhY2hOb2RlKGZ1bmN0aW9uKG5vZGUpIHsgXG4gICAgICAgIG5vZGUuc3RhcnRQb3Muc2V0KG5vZGUucG9zKTtcbiAgICAgICAgJC5lYWNoKFsnbm9kZS1wcm9wZXJ0eScsICdub2RlLXN0eWxlJ10sIGZ1bmN0aW9uKHApIHtcbiAgICAgICAgICBpZihwIGluIG0pIHtcbiAgICAgICAgICAgIHZhciBwcm9wID0gbVtwXTtcbiAgICAgICAgICAgIGZvcih2YXIgaT0wLCBsPXByb3AubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgIG5vZGVbYWNjZXNzb3JzW3BdLnNldHRlcl0ocHJvcFtpXSwgbm9kZVthY2Nlc3NvcnNbcF0uZ2V0dGVyXShwcm9wW2ldKSwgJ3N0YXJ0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgJC5lYWNoKFsnZWRnZS1wcm9wZXJ0eScsICdlZGdlLXN0eWxlJ10sIGZ1bmN0aW9uKHApIHtcbiAgICAgICAgICBpZihwIGluIG0pIHtcbiAgICAgICAgICAgIHZhciBwcm9wID0gbVtwXTtcbiAgICAgICAgICAgIG5vZGUuZWFjaEFkamFjZW5jeShmdW5jdGlvbihhZGopIHtcbiAgICAgICAgICAgICAgZm9yKHZhciBpPTAsIGw9cHJvcC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICBhZGpbYWNjZXNzb3JzW3BdLnNldHRlcl0ocHJvcFtpXSwgYWRqW2FjY2Vzc29yc1twXS5nZXR0ZXJdKHByb3BbaV0pLCAnc3RhcnQnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG07XG4gICAgfSxcbiAgICBcbiAgICAvKlxuICAgICAgIE1ldGhvZDogYW5pbWF0ZVxuICAgIFxuICAgICAgIEFuaW1hdGVzIGEgPEdyYXBoPiBieSBpbnRlcnBvbGF0aW5nIHNvbWUgPEdyYXBoLk5vZGU+LCA8R3JhcGguQWRqYWNlbmNlPiBvciA8R3JhcGguTGFiZWw+IHByb3BlcnRpZXMuXG5cbiAgICAgICBQYXJhbWV0ZXJzOlxuXG4gICAgICAgb3B0IC0gKG9iamVjdCkgQW5pbWF0aW9uIG9wdGlvbnMuIFRoZSBvYmplY3QgcHJvcGVydGllcyBhcmUgZGVzY3JpYmVkIGJlbG93XG4gICAgICAgZHVyYXRpb24gLSAob3B0aW9uYWwpIERlc2NyaWJlZCBpbiA8T3B0aW9ucy5GeD4uXG4gICAgICAgZnBzIC0gKG9wdGlvbmFsKSBEZXNjcmliZWQgaW4gPE9wdGlvbnMuRng+LlxuICAgICAgIGhpZGVMYWJlbHMgLSAob3B0aW9uYWx8Ym9vbGVhbikgV2hldGhlciB0byBoaWRlIGxhYmVscyBkdXJpbmcgdGhlIGFuaW1hdGlvbi5cbiAgICAgICBtb2RlcyAtIChyZXF1aXJlZHxvYmplY3QpIEFuIG9iamVjdCB3aXRoIGFuaW1hdGlvbiBtb2RlcyAoZGVzY3JpYmVkIGJlbG93KS5cblxuICAgICAgIEFuaW1hdGlvbiBtb2RlczpcbiAgICAgICBcbiAgICAgICBBbmltYXRpb24gbW9kZXMgYXJlIHN0cmluZ3MgcmVwcmVzZW50aW5nIGRpZmZlcmVudCBub2RlL2VkZ2UgYW5kIGdyYXBoIHByb3BlcnRpZXMgdGhhdCB5b3UnZCBsaWtlIHRvIGFuaW1hdGUuIFxuICAgICAgIFRoZXkgYXJlIHJlcHJlc2VudGVkIGJ5IGFuIG9iamVjdCB0aGF0IGhhcyBhcyBrZXlzIG1haW4gY2F0ZWdvcmllcyBvZiBwcm9wZXJ0aWVzIHRvIGFuaW1hdGUgYW5kIGFzIHZhbHVlcyBhIGxpc3QgXG4gICAgICAgb2YgdGhlc2Ugc3BlY2lmaWMgcHJvcGVydGllcy4gVGhlIHByb3BlcnRpZXMgYXJlIGRlc2NyaWJlZCBiZWxvd1xuICAgICAgIFxuICAgICAgIHBvc2l0aW9uIC0gRGVzY3JpYmVzIHRoZSB3YXkgbm9kZXMnIHBvc2l0aW9ucyBtdXN0IGJlIGludGVycG9sYXRlZC4gUG9zc2libGUgdmFsdWVzIGFyZSAnbGluZWFyJywgJ3BvbGFyJyBvciAnbW9lYml1cycuXG4gICAgICAgbm9kZS1wcm9wZXJ0eSAtIERlc2NyaWJlcyB3aGljaCBOb2RlIHByb3BlcnRpZXMgd2lsbCBiZSBpbnRlcnBvbGF0ZWQuIFRoZXNlIHByb3BlcnRpZXMgY2FuIGJlIGFueSBvZiB0aGUgb25lcyBkZWZpbmVkIGluIDxPcHRpb25zLk5vZGU+LlxuICAgICAgIGVkZ2UtcHJvcGVydHkgLSBEZXNjcmliZXMgd2hpY2ggRWRnZSBwcm9wZXJ0aWVzIHdpbGwgYmUgaW50ZXJwb2xhdGVkLiBUaGVzZSBwcm9wZXJ0aWVzIGNhbiBiZSBhbnkgdGhlIG9uZXMgZGVmaW5lZCBpbiA8T3B0aW9ucy5FZGdlPi5cbiAgICAgICBsYWJlbC1wcm9wZXJ0eSAtIERlc2NyaWJlcyB3aGljaCBMYWJlbCBwcm9wZXJ0aWVzIHdpbGwgYmUgaW50ZXJwb2xhdGVkLiBUaGVzZSBwcm9wZXJ0aWVzIGNhbiBiZSBhbnkgb2YgdGhlIG9uZXMgZGVmaW5lZCBpbiA8T3B0aW9ucy5MYWJlbD4gbGlrZSBjb2xvciBvciBzaXplLlxuICAgICAgIG5vZGUtc3R5bGUgLSBEZXNjcmliZXMgd2hpY2ggTm9kZSBDYW52YXMgU3R5bGVzIHdpbGwgYmUgaW50ZXJwb2xhdGVkLiBUaGVzZSBhcmUgc3BlY2lmaWMgY2FudmFzIHByb3BlcnRpZXMgbGlrZSBmaWxsU3R5bGUsIHN0cm9rZVN0eWxlLCBsaW5lV2lkdGgsIHNoYWRvd0JsdXIsIHNoYWRvd0NvbG9yLCBzaGFkb3dPZmZzZXRYLCBzaGFkb3dPZmZzZXRZLCBldGMuXG4gICAgICAgZWRnZS1zdHlsZSAtIERlc2NyaWJlcyB3aGljaCBFZGdlIENhbnZhcyBTdHlsZXMgd2lsbCBiZSBpbnRlcnBvbGF0ZWQuIFRoZXNlIGFyZSBzcGVjaWZpYyBjYW52YXMgcHJvcGVydGllcyBsaWtlIGZpbGxTdHlsZSwgc3Ryb2tlU3R5bGUsIGxpbmVXaWR0aCwgc2hhZG93Qmx1ciwgc2hhZG93Q29sb3IsIHNoYWRvd09mZnNldFgsIHNoYWRvd09mZnNldFksIGV0Yy5cblxuICAgICAgIEV4YW1wbGU6XG4gICAgICAgKHN0YXJ0IGNvZGUganMpXG4gICAgICAgdmFyIHZpeiA9IG5ldyAkaml0LlZpeihvcHRpb25zKTtcbiAgICAgICAvLy4uLnR3ZWFrIHNvbWUgRGF0YSwgQ2FudmFzU3R5bGVzIG9yIExhYmVsRGF0YSBwcm9wZXJ0aWVzLi4uXG4gICAgICAgdml6LmZ4LmFuaW1hdGUoe1xuICAgICAgICAgbW9kZXM6IHtcbiAgICAgICAgICAgJ3Bvc2l0aW9uJzogJ2xpbmVhcicsXG4gICAgICAgICAgICdub2RlLXByb3BlcnR5JzogWyd3aWR0aCcsICdoZWlnaHQnXSxcbiAgICAgICAgICAgJ25vZGUtc3R5bGUnOiAnc2hhZG93Q29sb3InLFxuICAgICAgICAgICAnbGFiZWwtcHJvcGVydHknOiAnc2l6ZSdcbiAgICAgICAgIH0sXG4gICAgICAgICBoaWRlTGFiZWxzOiBmYWxzZVxuICAgICAgIH0pO1xuICAgICAgIC8vLi4uY2FuIGFsc28gYmUgd3JpdHRlbiBsaWtlIHRoaXMuLi5cbiAgICAgICB2aXouZnguYW5pbWF0ZSh7XG4gICAgICAgICBtb2RlczogWydsaW5lYXInLFxuICAgICAgICAgICAgICAgICAnbm9kZS1wcm9wZXJ0eTp3aWR0aDpoZWlnaHQnLFxuICAgICAgICAgICAgICAgICAnbm9kZS1zdHlsZTpzaGFkb3dDb2xvcicsXG4gICAgICAgICAgICAgICAgICdsYWJlbC1wcm9wZXJ0eTpzaXplJ10sXG4gICAgICAgICBoaWRlTGFiZWxzOiBmYWxzZVxuICAgICAgIH0pO1xuICAgICAgIChlbmQgY29kZSlcbiAgICAqL1xuICAgIGFuaW1hdGU6IGZ1bmN0aW9uKG9wdCwgdmVyc29yKSB7XG4gICAgICBvcHQgPSAkLm1lcmdlKHRoaXMudml6LmNvbmZpZywgb3B0IHx8IHt9KTtcbiAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgICB2aXogPSB0aGlzLnZpeixcbiAgICAgICAgICBncmFwaCAgPSB2aXouZ3JhcGgsXG4gICAgICAgICAgaW50ZXJwID0gdGhpcy5JbnRlcnBvbGF0b3IsXG4gICAgICAgICAgYW5pbWF0aW9uID0gIG9wdC50eXBlID09PSAnbm9kZWZ4Jz8gdGhpcy5ub2RlRnhBbmltYXRpb24gOiB0aGlzLmFuaW1hdGlvbjtcbiAgICAgIC8vcHJlcGFyZSBncmFwaCB2YWx1ZXNcbiAgICAgIHZhciBtID0gdGhpcy5wcmVwYXJlKG9wdC5tb2Rlcyk7XG4gICAgICBcbiAgICAgIC8vYW5pbWF0ZVxuICAgICAgaWYob3B0LmhpZGVMYWJlbHMpIHRoaXMubGFiZWxzLmhpZGVMYWJlbHModHJ1ZSk7XG4gICAgICBhbmltYXRpb24uc2V0T3B0aW9ucygkLmV4dGVuZChvcHQsIHtcbiAgICAgICAgJGFuaW1hdGluZzogZmFsc2UsXG4gICAgICAgIGNvbXB1dGU6IGZ1bmN0aW9uKGRlbHRhKSB7XG4gICAgICAgICAgZ3JhcGguZWFjaE5vZGUoZnVuY3Rpb24obm9kZSkgeyBcbiAgICAgICAgICAgIGZvcih2YXIgcCBpbiBtKSB7XG4gICAgICAgICAgICAgIGludGVycFtwXShub2RlLCBtW3BdLCBkZWx0YSwgdmVyc29yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGF0LnBsb3Qob3B0LCB0aGlzLiRhbmltYXRpbmcsIGRlbHRhKTtcbiAgICAgICAgICB0aGlzLiRhbmltYXRpbmcgPSB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYob3B0LmhpZGVMYWJlbHMpIHRoYXQubGFiZWxzLmhpZGVMYWJlbHMoZmFsc2UpO1xuICAgICAgICAgIHRoYXQucGxvdChvcHQpO1xuICAgICAgICAgIG9wdC5vbkNvbXBsZXRlKCk7XG4gICAgICAgICAgLy9UT0RPKG5pY28pOiBUaGlzIHNob3VsZG4ndCBiZSBoZXJlIVxuICAgICAgICAgIC8vb3B0Lm9uQWZ0ZXJDb21wdXRlKCk7XG4gICAgICAgIH0gICAgICAgXG4gICAgICB9KSkuc3RhcnQoKTtcbiAgICB9LFxuICAgIFxuICAgIC8qXG4gICAgICBub2RlRnhcbiAgIFxuICAgICAgQXBwbHkgYW5pbWF0aW9uIHRvIG5vZGUgcHJvcGVydGllcyBsaWtlIGNvbG9yLCB3aWR0aCwgaGVpZ2h0LCBkaW0sIGV0Yy5cbiAgXG4gICAgICBQYXJhbWV0ZXJzOlxuICBcbiAgICAgIG9wdGlvbnMgLSBBbmltYXRpb24gb3B0aW9ucy4gVGhpcyBvYmplY3QgcHJvcGVydGllcyBpcyBkZXNjcmliZWQgYmVsb3dcbiAgICAgIGVsZW1lbnRzIC0gVGhlIEVsZW1lbnRzIHRvIGJlIHRyYW5zZm9ybWVkLiBUaGlzIGlzIGFuIG9iamVjdCB0aGF0IGhhcyBhIHByb3BlcnRpZXNcbiAgICAgIFxuICAgICAgKHN0YXJ0IGNvZGUganMpXG4gICAgICAnZWxlbWVudHMnOiB7XG4gICAgICAgIC8vY2FuIGFsc28gYmUgYW4gYXJyYXkgb2YgaWRzXG4gICAgICAgICdpZCc6ICdpZC1vZi1ub2RlLXRvLXRyYW5zZm9ybScsXG4gICAgICAgIC8vcHJvcGVydGllcyB0byBiZSBtb2RpZmllZC4gQWxsIHByb3BlcnRpZXMgYXJlIG9wdGlvbmFsLlxuICAgICAgICAncHJvcGVydGllcyc6IHtcbiAgICAgICAgICAnY29sb3InOiAnI2NjYycsIC8vc29tZSBjb2xvclxuICAgICAgICAgICd3aWR0aCc6IDEwLCAvL3NvbWUgd2lkdGhcbiAgICAgICAgICAnaGVpZ2h0JzogMTAsIC8vc29tZSBoZWlnaHRcbiAgICAgICAgICAnZGltJzogMjAsIC8vc29tZSBkaW1cbiAgICAgICAgICAnbGluZVdpZHRoJzogMTAgLy9zb21lIGxpbmUgd2lkdGhcbiAgICAgICAgfSBcbiAgICAgIH1cbiAgICAgIChlbmQgY29kZSlcbiAgICAgIFxuICAgICAgLSBfcmVwb3NpdGlvbl8gV2hldGhlciB0byByZWNhbGN1bGF0ZSBwb3NpdGlvbnMgYW5kIGFkZCBhIG1vdGlvbiBhbmltYXRpb24uIFxuICAgICAgVGhpcyBtaWdodCBiZSB1c2VkIHdoZW4gY2hhbmdpbmcgX3dpZHRoXyBvciBfaGVpZ2h0XyBwcm9wZXJ0aWVzIGluIGEgPExheW91dHMuVHJlZT4gbGlrZSBsYXlvdXQuIERlZmF1bHQncyAqZmFsc2UqLlxuICAgICAgXG4gICAgICAtIF9vbkNvbXBsZXRlXyBBIG1ldGhvZCB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSBhbmltYXRpb24gY29tcGxldGVzLlxuICAgICAgXG4gICAgICAuLi5hbmQgYWxsIG90aGVyIDxHcmFwaC5QbG90LmFuaW1hdGU+IG9wdGlvbnMgbGlrZSBfZHVyYXRpb25fLCBfZnBzXywgX3RyYW5zaXRpb25fLCBldGMuXG4gIFxuICAgICAgRXhhbXBsZTpcbiAgICAgIChzdGFydCBjb2RlIGpzKVxuICAgICAgIHZhciByZyA9IG5ldyBSR3JhcGgoY2FudmFzLCBjb25maWcpOyAvL2NhbiBiZSBhbHNvIEh5cGVydHJlZSBvciBTVFxuICAgICAgIHJnLmZ4Lm5vZGVGeCh7XG4gICAgICAgICAnZWxlbWVudHMnOiB7XG4gICAgICAgICAgICdpZCc6J215bm9kZWlkJyxcbiAgICAgICAgICAgJ3Byb3BlcnRpZXMnOiB7XG4gICAgICAgICAgICAgJ2NvbG9yJzonI2NjZidcbiAgICAgICAgICAgfSxcbiAgICAgICAgICAgJ3RyYW5zaXRpb24nOiBUcmFucy5RdWFydC5lYXNlT3V0XG4gICAgICAgICB9XG4gICAgICAgfSk7XG4gICAgICAoZW5kIGNvZGUpICAgIFxuICAgKi9cbiAgIG5vZGVGeDogZnVuY3Rpb24ob3B0KSB7XG4gICAgIHZhciB2aXogPSB0aGlzLnZpeixcbiAgICAgICAgIGdyYXBoICA9IHZpei5ncmFwaCxcbiAgICAgICAgIGFuaW1hdGlvbiA9IHRoaXMubm9kZUZ4QW5pbWF0aW9uLFxuICAgICAgICAgb3B0aW9ucyA9ICQubWVyZ2UodGhpcy52aXouY29uZmlnLCB7XG4gICAgICAgICAgICdlbGVtZW50cyc6IHtcbiAgICAgICAgICAgICAnaWQnOiBmYWxzZSxcbiAgICAgICAgICAgICAncHJvcGVydGllcyc6IHt9XG4gICAgICAgICAgIH0sXG4gICAgICAgICAgICdyZXBvc2l0aW9uJzogZmFsc2VcbiAgICAgICAgIH0pO1xuICAgICBvcHQgPSAkLm1lcmdlKG9wdGlvbnMsIG9wdCB8fCB7fSwge1xuICAgICAgIG9uQmVmb3JlQ29tcHV0ZTogJC5lbXB0eSxcbiAgICAgICBvbkFmdGVyQ29tcHV0ZTogJC5lbXB0eVxuICAgICB9KTtcbiAgICAgLy9jaGVjayBpZiBhbiBhbmltYXRpb24gaXMgcnVubmluZ1xuICAgICBhbmltYXRpb24uc3RvcFRpbWVyKCk7XG4gICAgIHZhciBwcm9wcyA9IG9wdC5lbGVtZW50cy5wcm9wZXJ0aWVzO1xuICAgICAvL3NldCBlbmQgdmFsdWVzIGZvciBub2Rlc1xuICAgICBpZighb3B0LmVsZW1lbnRzLmlkKSB7XG4gICAgICAgZ3JhcGguZWFjaE5vZGUoZnVuY3Rpb24obikge1xuICAgICAgICAgZm9yKHZhciBwcm9wIGluIHByb3BzKSB7XG4gICAgICAgICAgIG4uc2V0RGF0YShwcm9wLCBwcm9wc1twcm9wXSwgJ2VuZCcpO1xuICAgICAgICAgfVxuICAgICAgIH0pO1xuICAgICB9IGVsc2Uge1xuICAgICAgIHZhciBpZHMgPSAkLnNwbGF0KG9wdC5lbGVtZW50cy5pZCk7XG4gICAgICAgJC5lYWNoKGlkcywgZnVuY3Rpb24oaWQpIHtcbiAgICAgICAgIHZhciBuID0gZ3JhcGguZ2V0Tm9kZShpZCk7XG4gICAgICAgICBpZihuKSB7XG4gICAgICAgICAgIGZvcih2YXIgcHJvcCBpbiBwcm9wcykge1xuICAgICAgICAgICAgIG4uc2V0RGF0YShwcm9wLCBwcm9wc1twcm9wXSwgJ2VuZCcpO1xuICAgICAgICAgICB9XG4gICAgICAgICB9XG4gICAgICAgfSk7XG4gICAgIH1cbiAgICAgLy9nZXQga2V5c1xuICAgICB2YXIgcHJvcG5hbWVzID0gW107XG4gICAgIGZvcih2YXIgcHJvcCBpbiBwcm9wcykgcHJvcG5hbWVzLnB1c2gocHJvcCk7XG4gICAgIC8vYWRkIG5vZGUgcHJvcGVydGllcyBtb2Rlc1xuICAgICB2YXIgbW9kZXMgPSBbJ25vZGUtcHJvcGVydHk6JyArIHByb3BuYW1lcy5qb2luKCc6JyldO1xuICAgICAvL3NldCBuZXcgbm9kZSBwb3NpdGlvbnNcbiAgICAgaWYob3B0LnJlcG9zaXRpb24pIHtcbiAgICAgICBtb2Rlcy5wdXNoKCdsaW5lYXInKTtcbiAgICAgICB2aXouY29tcHV0ZSgnZW5kJyk7XG4gICAgIH1cbiAgICAgLy9hbmltYXRlXG4gICAgIHRoaXMuYW5pbWF0ZSgkLm1lcmdlKG9wdCwge1xuICAgICAgIG1vZGVzOiBtb2RlcyxcbiAgICAgICB0eXBlOiAnbm9kZWZ4J1xuICAgICB9KSk7XG4gICB9LFxuXG4gICAgXG4gICAgLypcbiAgICAgICBNZXRob2Q6IHBsb3RcbiAgICBcbiAgICAgICBQbG90cyBhIDxHcmFwaD4uXG5cbiAgICAgICBQYXJhbWV0ZXJzOlxuXG4gICAgICAgb3B0IC0gKG9wdGlvbmFsKSBQbG90dGluZyBvcHRpb25zLiBNb3N0IG9mIHRoZW0gYXJlIGRlc2NyaWJlZCBpbiA8T3B0aW9ucy5GeD4uXG5cbiAgICAgICBFeGFtcGxlOlxuXG4gICAgICAgKHN0YXJ0IGNvZGUganMpXG4gICAgICAgdmFyIHZpeiA9IG5ldyAkaml0LlZpeihvcHRpb25zKTtcbiAgICAgICB2aXouZngucGxvdCgpOyBcbiAgICAgICAoZW5kIGNvZGUpXG5cbiAgICAqL1xuICAgcGxvdDogZnVuY3Rpb24ob3B0LCBhbmltYXRpbmcpIHtcbiAgICAgdmFyIHZpeiA9IHRoaXMudml6LCBcbiAgICAgICAgIGFHcmFwaCA9IHZpei5ncmFwaCwgXG4gICAgICAgICBjYW52YXMgPSB2aXouY2FudmFzLCBcbiAgICAgICAgIGlkID0gdml6LnJvb3QsIFxuICAgICAgICAgdGhhdCA9IHRoaXMsIFxuICAgICAgICAgY3R4ID0gY2FudmFzLmdldEN0eCgpLCBcbiAgICAgICAgIG1pbiA9IE1hdGgubWluLFxuICAgICAgICAgb3B0ID0gb3B0IHx8IHRoaXMudml6LmNvbnRyb2xsZXI7XG4gICAgIFxuICAgICBvcHQuY2xlYXJDYW52YXMgJiYgY2FudmFzLmNsZWFyKCk7XG4gICAgICAgXG4gICAgIHZhciByb290ID0gYUdyYXBoLmdldE5vZGUoaWQpO1xuICAgICBpZighcm9vdCkgcmV0dXJuO1xuICAgICBcbiAgICAgdmFyIFQgPSAhIXJvb3QudmlzaXRlZDtcbiAgICBcbiAgICAvL1NUQVJUIE1FVEFNQVBTIENPREVcbiAgICBpZiAoTWV0YW1hcHMuTW91c2Uuc3luYXBzZVN0YXJ0Q29vcmRpbmF0ZXMubGVuZ3RoID4gMCAmJiBNZXRhbWFwcy5Nb3VzZS5zeW5hcHNlRW5kQ29vcmRpbmF0ZXMpIHtcbiAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgdmFyIHN0YXJ0O1xuICAgICAgICB2YXIgZW5kID0gTWV0YW1hcHMuTW91c2Uuc3luYXBzZUVuZENvb3JkaW5hdGVzO1xuICAgICAgICBcbiAgICAgICAgdmFyIGwgPSBNZXRhbWFwcy5Nb3VzZS5zeW5hcHNlU3RhcnRDb29yZGluYXRlcy5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSBsIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gTWV0YW1hcHMuTW91c2Uuc3luYXBzZVN0YXJ0Q29vcmRpbmF0ZXNbaV07XG4gICAgICAgICAgICBNZXRhbWFwcy5KSVQucmVuZGVyTWlkQXJyb3coc3RhcnQsIGVuZCwgMTMsIGZhbHNlLCBjYW52YXMsIDAuMywgdHJ1ZSk7XG4gICAgICAgICAgICBNZXRhbWFwcy5KSVQucmVuZGVyTWlkQXJyb3coc3RhcnQsIGVuZCwgMTMsIGZhbHNlLCBjYW52YXMsIDAuNywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICB9XG5cbiAgICBpZiAoTWV0YW1hcHMuTW91c2UuZm9jdXNOb2RlQ29vcmRzKSB7XG4gICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgIE1ldGFtYXBzLkpJVC5yZW5kZXJNaWRBcnJvdyhNZXRhbWFwcy5Nb3VzZS5mb2N1c05vZGVDb29yZHMsIE1ldGFtYXBzLk1vdXNlLm5ld05vZGVDb29yZHMsIDEzLCBmYWxzZSwgY2FudmFzLCAwLjMsIHRydWUpO1xuICAgICAgICBNZXRhbWFwcy5KSVQucmVuZGVyTWlkQXJyb3coTWV0YW1hcHMuTW91c2UuZm9jdXNOb2RlQ29vcmRzLCBNZXRhbWFwcy5Nb3VzZS5uZXdOb2RlQ29vcmRzLCAxMywgZmFsc2UsIGNhbnZhcywgMC43LCB0cnVlKTtcbiAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICB9XG5cbiAgICBpZiAoTWV0YW1hcHMuTW91c2UuYm94U3RhcnRDb29yZGluYXRlcyAmJiBNZXRhbWFwcy5Nb3VzZS5ib3hFbmRDb29yZGluYXRlcykge1xuICAgICAgY3R4LnNhdmUoKTtcbiAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgY3R4Lm1vdmVUbyhNZXRhbWFwcy5Nb3VzZS5ib3hTdGFydENvb3JkaW5hdGVzLngsIE1ldGFtYXBzLk1vdXNlLmJveFN0YXJ0Q29vcmRpbmF0ZXMueSlcbiAgICAgIGN0eC5saW5lVG8oTWV0YW1hcHMuTW91c2UuYm94U3RhcnRDb29yZGluYXRlcy54LCBNZXRhbWFwcy5Nb3VzZS5ib3hFbmRDb29yZGluYXRlcy55KVxuICAgICAgY3R4LmxpbmVUbyhNZXRhbWFwcy5Nb3VzZS5ib3hFbmRDb29yZGluYXRlcy54LCBNZXRhbWFwcy5Nb3VzZS5ib3hFbmRDb29yZGluYXRlcy55KVxuICAgICAgY3R4LmxpbmVUbyhNZXRhbWFwcy5Nb3VzZS5ib3hFbmRDb29yZGluYXRlcy54LCBNZXRhbWFwcy5Nb3VzZS5ib3hTdGFydENvb3JkaW5hdGVzLnkpXG4gICAgICBjdHgubGluZVRvKE1ldGFtYXBzLk1vdXNlLmJveFN0YXJ0Q29vcmRpbmF0ZXMueCwgTWV0YW1hcHMuTW91c2UuYm94U3RhcnRDb29yZGluYXRlcy55KVxuICAgICAgY3R4LnN0cm9rZVN0eWxlID0gJ2JsYWNrJ1xuICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICBjdHgucmVzdG9yZSgpXG4gICAgfVxuICAgIC8vRU5EIE1FVEFNQVBTIENPREUgIFxuXG4gICAgIGFHcmFwaC5lYWNoTm9kZShmdW5jdGlvbihub2RlKSB7XG4gICAgICAgdmFyIG5vZGVBbHBoYSA9IG5vZGUuZ2V0RGF0YSgnYWxwaGEnKTtcbiAgICAgICBub2RlLmVhY2hBZGphY2VuY3koZnVuY3Rpb24oYWRqKSB7XG4gICAgICAgICB2YXIgbm9kZVRvID0gYWRqLm5vZGVUbztcbiAgICAgICAgIGlmKCEhbm9kZVRvLnZpc2l0ZWQgPT09IFQgJiYgbm9kZS5kcmF3biAmJiBub2RlVG8uZHJhd24pIHtcbiAgICAgICAgICAgIWFuaW1hdGluZyAmJiBvcHQub25CZWZvcmVQbG90TGluZShhZGopO1xuICAgICAgICAgICB0aGF0LnBsb3RMaW5lKGFkaiwgY2FudmFzLCBhbmltYXRpbmcpO1xuICAgICAgICAgICAhYW5pbWF0aW5nICYmIG9wdC5vbkFmdGVyUGxvdExpbmUoYWRqKTtcbiAgICAgICAgIH1cbiAgICAgICB9KTtcbiAgICAgICBpZihub2RlLmRyYXduKSB7XG4gICAgICAgICAhYW5pbWF0aW5nICYmIG9wdC5vbkJlZm9yZVBsb3ROb2RlKG5vZGUpO1xuICAgICAgICAgdGhhdC5wbG90Tm9kZShub2RlLCBjYW52YXMsIGFuaW1hdGluZyk7XG4gICAgICAgICAhYW5pbWF0aW5nICYmIG9wdC5vbkFmdGVyUGxvdE5vZGUobm9kZSk7XG4gICAgICAgfVxuICAgICAgIGlmKCF0aGF0LmxhYmVsc0hpZGRlbiAmJiBvcHQud2l0aExhYmVscykge1xuICAgICAgICAgaWYobm9kZS5kcmF3biAmJiBub2RlQWxwaGEgPj0gMC45NSkge1xuICAgICAgICAgICB0aGF0LmxhYmVscy5wbG90TGFiZWwoY2FudmFzLCBub2RlLCBvcHQpO1xuICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgdGhhdC5sYWJlbHMuaGlkZUxhYmVsKG5vZGUsIGZhbHNlKTtcbiAgICAgICAgIH1cbiAgICAgICB9XG4gICAgICAgbm9kZS52aXNpdGVkID0gIVQ7XG4gICAgIH0pO1xuICAgIH0sXG5cbiAgLypcbiAgICAgIFBsb3RzIGEgU3VidHJlZS5cbiAgICovXG4gICBwbG90VHJlZTogZnVuY3Rpb24obm9kZSwgb3B0LCBhbmltYXRpbmcpIHtcbiAgICAgICB2YXIgdGhhdCA9IHRoaXMsIFxuICAgICAgIHZpeiA9IHRoaXMudml6LCBcbiAgICAgICBjYW52YXMgPSB2aXouY2FudmFzLFxuICAgICAgIGNvbmZpZyA9IHRoaXMuY29uZmlnLFxuICAgICAgIGN0eCA9IGNhbnZhcy5nZXRDdHgoKTtcbiAgICAgICB2YXIgbm9kZUFscGhhID0gbm9kZS5nZXREYXRhKCdhbHBoYScpO1xuICAgICAgIG5vZGUuZWFjaFN1Ym5vZGUoZnVuY3Rpb24oZWxlbSkge1xuICAgICAgICAgaWYob3B0LnBsb3RTdWJ0cmVlKG5vZGUsIGVsZW0pICYmIGVsZW0uZXhpc3QgJiYgZWxlbS5kcmF3bikge1xuICAgICAgICAgICAgIHZhciBhZGogPSBub2RlLmdldEFkamFjZW5jeShlbGVtLmlkKTtcbiAgICAgICAgICAgICAhYW5pbWF0aW5nICYmIG9wdC5vbkJlZm9yZVBsb3RMaW5lKGFkaik7XG4gICAgICAgICAgICAgdGhhdC5wbG90TGluZShhZGosIGNhbnZhcywgYW5pbWF0aW5nKTtcbiAgICAgICAgICAgICAhYW5pbWF0aW5nICYmIG9wdC5vbkFmdGVyUGxvdExpbmUoYWRqKTtcbiAgICAgICAgICAgICB0aGF0LnBsb3RUcmVlKGVsZW0sIG9wdCwgYW5pbWF0aW5nKTtcbiAgICAgICAgIH1cbiAgICAgICB9KTtcbiAgICAgICBpZihub2RlLmRyYXduKSB7XG4gICAgICAgICAgICFhbmltYXRpbmcgJiYgb3B0Lm9uQmVmb3JlUGxvdE5vZGUobm9kZSk7XG4gICAgICAgICAgIHRoaXMucGxvdE5vZGUobm9kZSwgY2FudmFzLCBhbmltYXRpbmcpO1xuICAgICAgICAgICAhYW5pbWF0aW5nICYmIG9wdC5vbkFmdGVyUGxvdE5vZGUobm9kZSk7XG4gICAgICAgICAgIGlmKCFvcHQuaGlkZUxhYmVscyAmJiBvcHQud2l0aExhYmVscyAmJiBub2RlQWxwaGEgPj0gMC45NSkgXG4gICAgICAgICAgICAgICB0aGlzLmxhYmVscy5wbG90TGFiZWwoY2FudmFzLCBub2RlLCBvcHQpO1xuICAgICAgICAgICBlbHNlIFxuICAgICAgICAgICAgICAgdGhpcy5sYWJlbHMuaGlkZUxhYmVsKG5vZGUsIGZhbHNlKTtcbiAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICB0aGlzLmxhYmVscy5oaWRlTGFiZWwobm9kZSwgdHJ1ZSk7XG4gICAgICAgfVxuICAgfSxcblxuICAvKlxuICAgICAgIE1ldGhvZDogcGxvdE5vZGVcbiAgICBcbiAgICAgICBQbG90cyBhIDxHcmFwaC5Ob2RlPi5cblxuICAgICAgIFBhcmFtZXRlcnM6XG4gICAgICAgXG4gICAgICAgbm9kZSAtIChvYmplY3QpIEEgPEdyYXBoLk5vZGU+LlxuICAgICAgIGNhbnZhcyAtIChvYmplY3QpIEEgPENhbnZhcz4gZWxlbWVudC5cblxuICAgICovXG4gICAgcGxvdE5vZGU6IGZ1bmN0aW9uKG5vZGUsIGNhbnZhcywgYW5pbWF0aW5nKSB7XG4gICAgICAgIHZhciBmID0gbm9kZS5nZXREYXRhKCd0eXBlJyksIFxuICAgICAgICAgICAgY3R4T2JqID0gdGhpcy5ub2RlLkNhbnZhc1N0eWxlcztcbiAgICAgICAgaWYoZiAhPSAnbm9uZScpIHtcbiAgICAgICAgICB2YXIgd2lkdGggPSBub2RlLmdldERhdGEoJ2xpbmVXaWR0aCcpLFxuICAgICAgICAgICAgICBjb2xvciA9IG5vZGUuZ2V0RGF0YSgnY29sb3InKSxcbiAgICAgICAgICAgICAgYWxwaGEgPSBub2RlLmdldERhdGEoJ2FscGhhJyksXG4gICAgICAgICAgICAgIGN0eCA9IGNhbnZhcy5nZXRDdHgoKTtcbiAgICAgICAgICBjdHguc2F2ZSgpO1xuICAgICAgICAgIGN0eC5saW5lV2lkdGggPSB3aWR0aDtcbiAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY3R4LnN0cm9rZVN0eWxlID0gY29sb3I7XG4gICAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gYWxwaGE7XG4gICAgICAgICAgXG4gICAgICAgICAgZm9yKHZhciBzIGluIGN0eE9iaikge1xuICAgICAgICAgICAgY3R4W3NdID0gbm9kZS5nZXRDYW52YXNTdHlsZShzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLm5vZGVUeXBlc1tmXS5yZW5kZXIuY2FsbCh0aGlzLCBub2RlLCBjYW52YXMsIGFuaW1hdGluZyk7XG4gICAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXG4gICAgLypcbiAgICAgICBNZXRob2Q6IHBsb3RMaW5lXG4gICAgXG4gICAgICAgUGxvdHMgYSA8R3JhcGguQWRqYWNlbmNlPi5cblxuICAgICAgIFBhcmFtZXRlcnM6XG5cbiAgICAgICBhZGogLSAob2JqZWN0KSBBIDxHcmFwaC5BZGphY2VuY2U+LlxuICAgICAgIGNhbnZhcyAtIChvYmplY3QpIEEgPENhbnZhcz4gaW5zdGFuY2UuXG5cbiAgICAqL1xuICAgIHBsb3RMaW5lOiBmdW5jdGlvbihhZGosIGNhbnZhcywgYW5pbWF0aW5nKSB7XG4gICAgICB2YXIgZiA9IGFkai5nZXREYXRhKCd0eXBlJyksXG4gICAgICAgICAgY3R4T2JqID0gdGhpcy5lZGdlLkNhbnZhc1N0eWxlcztcbiAgICAgIGlmKGYgIT0gJ25vbmUnKSB7XG4gICAgICAgIHZhciB3aWR0aCA9IGFkai5nZXREYXRhKCdsaW5lV2lkdGgnKSxcbiAgICAgICAgICAgIGNvbG9yID0gYWRqLmdldERhdGEoJ2NvbG9yJyksXG4gICAgICAgICAgICBjdHggPSBjYW52YXMuZ2V0Q3R4KCksXG4gICAgICAgICAgICBub2RlRnJvbSA9IGFkai5ub2RlRnJvbSxcbiAgICAgICAgICAgIG5vZGVUbyA9IGFkai5ub2RlVG87XG4gICAgICAgIFxuICAgICAgICBjdHguc2F2ZSgpO1xuICAgICAgICBjdHgubGluZVdpZHRoID0gd2lkdGg7XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBjdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjtcbiAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gTWF0aC5taW4obm9kZUZyb20uZ2V0RGF0YSgnYWxwaGEnKSwgXG4gICAgICAgICAgICBub2RlVG8uZ2V0RGF0YSgnYWxwaGEnKSwgXG4gICAgICAgICAgICBhZGouZ2V0RGF0YSgnYWxwaGEnKSk7XG4gICAgICAgIFxuICAgICAgICBmb3IodmFyIHMgaW4gY3R4T2JqKSB7XG4gICAgICAgICAgY3R4W3NdID0gYWRqLmdldENhbnZhc1N0eWxlKHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lZGdlVHlwZXNbZl0ucmVuZGVyLmNhbGwodGhpcywgYWRqLCBjYW52YXMsIGFuaW1hdGluZyk7XG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICB9XG4gICAgfSAgICBcbiAgXG59O1xuXG4vKlxuICBPYmplY3Q6IEdyYXBoLlBsb3QzRFxuICBcbiAgPEdyYXBoPiAzRCByZW5kZXJpbmcgYW5kIGFuaW1hdGlvbiBtZXRob2RzLlxuICBcbiAgUHJvcGVydGllczpcbiAgXG4gIG5vZGVIZWxwZXIgLSA8Tm9kZUhlbHBlcj4gb2JqZWN0LlxuICBlZGdlSGVscGVyIC0gPEVkZ2VIZWxwZXI+IG9iamVjdC5cblxuKi9cbkdyYXBoLlBsb3QzRCA9ICQubWVyZ2UoR3JhcGguUGxvdCwge1xuICBJbnRlcnBvbGF0b3I6IHtcbiAgICAnbGluZWFyJzogZnVuY3Rpb24oZWxlbSwgcHJvcHMsIGRlbHRhKSB7XG4gICAgICB2YXIgZnJvbSA9IGVsZW0uc3RhcnRQb3MuZ2V0Yyh0cnVlKTtcbiAgICAgIHZhciB0byA9IGVsZW0uZW5kUG9zLmdldGModHJ1ZSk7XG4gICAgICBlbGVtLnBvcy5zZXRjKHRoaXMuY29tcHV0ZShmcm9tLngsIHRvLngsIGRlbHRhKSwgXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcHV0ZShmcm9tLnksIHRvLnksIGRlbHRhKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlKGZyb20ueiwgdG8ueiwgZGVsdGEpKTtcbiAgICB9XG4gIH0sXG4gIFxuICBwbG90Tm9kZTogZnVuY3Rpb24obm9kZSwgY2FudmFzKSB7XG4gICAgaWYobm9kZS5nZXREYXRhKCd0eXBlJykgPT0gJ25vbmUnKSByZXR1cm47XG4gICAgdGhpcy5wbG90RWxlbWVudChub2RlLCBjYW52YXMsIHtcbiAgICAgIGdldEFscGhhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUuZ2V0RGF0YSgnYWxwaGEnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgXG4gIHBsb3RMaW5lOiBmdW5jdGlvbihhZGosIGNhbnZhcykge1xuICAgIGlmKGFkai5nZXREYXRhKCd0eXBlJykgPT0gJ25vbmUnKSByZXR1cm47XG4gICAgdGhpcy5wbG90RWxlbWVudChhZGosIGNhbnZhcywge1xuICAgICAgZ2V0QWxwaGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5taW4oYWRqLm5vZGVGcm9tLmdldERhdGEoJ2FscGhhJyksXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGoubm9kZVRvLmdldERhdGEoJ2FscGhhJyksXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGouZ2V0RGF0YSgnYWxwaGEnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG4gIFxuICBwbG90RWxlbWVudDogZnVuY3Rpb24oZWxlbSwgY2FudmFzLCBvcHQpIHtcbiAgICB2YXIgZ2wgPSBjYW52YXMuZ2V0Q3R4KCksXG4gICAgICAgIHZpZXdNYXRyaXggPSBuZXcgTWF0cml4NCxcbiAgICAgICAgbGlnaHRpbmcgPSBjYW52YXMuY29uZmlnLlNjZW5lLkxpZ2h0aW5nLFxuICAgICAgICB3Y2FudmFzID0gY2FudmFzLmNhbnZhc2VzWzBdLFxuICAgICAgICBwcm9ncmFtID0gd2NhbnZhcy5wcm9ncmFtLFxuICAgICAgICBjYW1lcmEgPSB3Y2FudmFzLmNhbWVyYTtcbiAgICBcbiAgICBpZighZWxlbS5nZW9tZXRyeSkge1xuICAgICAgZWxlbS5nZW9tZXRyeSA9IG5ldyBPM0RbZWxlbS5nZXREYXRhKCd0eXBlJyldO1xuICAgIH1cbiAgICBlbGVtLmdlb21ldHJ5LnVwZGF0ZShlbGVtKTtcbiAgICBpZighZWxlbS53ZWJHTFZlcnRleEJ1ZmZlcikge1xuICAgICAgdmFyIHZlcnRpY2VzID0gW10sXG4gICAgICAgICAgZmFjZXMgPSBbXSxcbiAgICAgICAgICBub3JtYWxzID0gW10sXG4gICAgICAgICAgdmVydGV4SW5kZXggPSAwLFxuICAgICAgICAgIGdlb20gPSBlbGVtLmdlb21ldHJ5O1xuICAgICAgXG4gICAgICBmb3IodmFyIGk9MCwgdnM9Z2VvbS52ZXJ0aWNlcywgZnM9Z2VvbS5mYWNlcywgZnNsPWZzLmxlbmd0aDsgaTxmc2w7IGkrKykge1xuICAgICAgICB2YXIgZmFjZSA9IGZzW2ldLFxuICAgICAgICAgICAgdjEgPSB2c1tmYWNlLmFdLFxuICAgICAgICAgICAgdjIgPSB2c1tmYWNlLmJdLFxuICAgICAgICAgICAgdjMgPSB2c1tmYWNlLmNdLFxuICAgICAgICAgICAgdjQgPSBmYWNlLmQ/IHZzW2ZhY2UuZF0gOiBmYWxzZSxcbiAgICAgICAgICAgIG4gPSBmYWNlLm5vcm1hbDtcbiAgICAgICAgXG4gICAgICAgIHZlcnRpY2VzLnB1c2godjEueCwgdjEueSwgdjEueik7XG4gICAgICAgIHZlcnRpY2VzLnB1c2godjIueCwgdjIueSwgdjIueik7XG4gICAgICAgIHZlcnRpY2VzLnB1c2godjMueCwgdjMueSwgdjMueik7XG4gICAgICAgIGlmKHY0KSB2ZXJ0aWNlcy5wdXNoKHY0LngsIHY0LnksIHY0LnopO1xuICAgICAgICAgICAgXG4gICAgICAgIG5vcm1hbHMucHVzaChuLngsIG4ueSwgbi56KTtcbiAgICAgICAgbm9ybWFscy5wdXNoKG4ueCwgbi55LCBuLnopO1xuICAgICAgICBub3JtYWxzLnB1c2gobi54LCBuLnksIG4ueik7XG4gICAgICAgIGlmKHY0KSBub3JtYWxzLnB1c2gobi54LCBuLnksIG4ueik7XG4gICAgICAgICAgICBcbiAgICAgICAgZmFjZXMucHVzaCh2ZXJ0ZXhJbmRleCwgdmVydGV4SW5kZXggKzEsIHZlcnRleEluZGV4ICsyKTtcbiAgICAgICAgaWYodjQpIHtcbiAgICAgICAgICBmYWNlcy5wdXNoKHZlcnRleEluZGV4LCB2ZXJ0ZXhJbmRleCArMiwgdmVydGV4SW5kZXggKzMpO1xuICAgICAgICAgIHZlcnRleEluZGV4ICs9IDQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmVydGV4SW5kZXggKz0gMztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy9jcmVhdGUgYW5kIHN0b3JlIHZlcnRleCBkYXRhXG4gICAgICBlbGVtLndlYkdMVmVydGV4QnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZWxlbS53ZWJHTFZlcnRleEJ1ZmZlcik7XG4gICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlcyksIGdsLlNUQVRJQ19EUkFXKTtcbiAgICAgIC8vY3JlYXRlIGFuZCBzdG9yZSBmYWNlcyBpbmRleCBkYXRhXG4gICAgICBlbGVtLndlYkdMRmFjZUJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZWxlbS53ZWJHTEZhY2VCdWZmZXIpO1xuICAgICAgZ2wuYnVmZmVyRGF0YShnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbmV3IFVpbnQxNkFycmF5KGZhY2VzKSwgZ2wuU1RBVElDX0RSQVcpO1xuICAgICAgZWxlbS53ZWJHTEZhY2VDb3VudCA9IGZhY2VzLmxlbmd0aDtcbiAgICAgIC8vY2FsY3VsYXRlIHZlcnRleCBub3JtYWxzIGFuZCBzdG9yZSB0aGVtXG4gICAgICBlbGVtLndlYkdMTm9ybWFsQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZWxlbS53ZWJHTE5vcm1hbEJ1ZmZlcik7XG4gICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheShub3JtYWxzKSwgZ2wuU1RBVElDX0RSQVcpO1xuICAgIH1cbiAgICB2aWV3TWF0cml4Lm11bHRpcGx5KGNhbWVyYS5tYXRyaXgsIGVsZW0uZ2VvbWV0cnkubWF0cml4KTtcbiAgICAvL3NlbmQgbWF0cml4IGRhdGFcbiAgICBnbC51bmlmb3JtTWF0cml4NGZ2KHByb2dyYW0udmlld01hdHJpeCwgZmFsc2UsIHZpZXdNYXRyaXguZmxhdHRlbigpKTtcbiAgICBnbC51bmlmb3JtTWF0cml4NGZ2KHByb2dyYW0ucHJvamVjdGlvbk1hdHJpeCwgZmFsc2UsIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmZsYXR0ZW4oKSk7XG4gICAgLy9zZW5kIG5vcm1hbCBtYXRyaXggZm9yIGxpZ2h0aW5nXG4gICAgdmFyIG5vcm1hbE1hdHJpeCA9IE1hdHJpeDQubWFrZUludmVydCh2aWV3TWF0cml4KTtcbiAgICBub3JtYWxNYXRyaXguJHRyYW5zcG9zZSgpO1xuICAgIGdsLnVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS5ub3JtYWxNYXRyaXgsIGZhbHNlLCBub3JtYWxNYXRyaXguZmxhdHRlbigpKTtcbiAgICAvL3NlbmQgY29sb3IgZGF0YVxuICAgIHZhciBjb2xvciA9ICQuaGV4VG9SZ2IoZWxlbS5nZXREYXRhKCdjb2xvcicpKTtcbiAgICBjb2xvci5wdXNoKG9wdC5nZXRBbHBoYSgpKTtcbiAgICBnbC51bmlmb3JtNGYocHJvZ3JhbS5jb2xvciwgY29sb3JbMF0gLyAyNTUsIGNvbG9yWzFdIC8gMjU1LCBjb2xvclsyXSAvIDI1NSwgY29sb3JbM10pO1xuICAgIC8vc2VuZCBsaWdodGluZyBkYXRhXG4gICAgZ2wudW5pZm9ybTFpKHByb2dyYW0uZW5hYmxlTGlnaHRpbmcsIGxpZ2h0aW5nLmVuYWJsZSk7XG4gICAgaWYobGlnaHRpbmcuZW5hYmxlKSB7XG4gICAgICAvL3NldCBhbWJpZW50IGxpZ2h0IGNvbG9yXG4gICAgICBpZihsaWdodGluZy5hbWJpZW50KSB7XG4gICAgICAgIHZhciBhY29sb3IgPSBsaWdodGluZy5hbWJpZW50O1xuICAgICAgICBnbC51bmlmb3JtM2YocHJvZ3JhbS5hbWJpZW50Q29sb3IsIGFjb2xvclswXSwgYWNvbG9yWzFdLCBhY29sb3JbMl0pO1xuICAgICAgfVxuICAgICAgLy9zZXQgZGlyZWN0aW9uYWwgbGlnaHRcbiAgICAgIGlmKGxpZ2h0aW5nLmRpcmVjdGlvbmFsKSB7XG4gICAgICAgIHZhciBkaXIgPSBsaWdodGluZy5kaXJlY3Rpb25hbCxcbiAgICAgICAgICAgIGNvbG9yID0gZGlyLmNvbG9yLFxuICAgICAgICAgICAgcG9zID0gZGlyLmRpcmVjdGlvbixcbiAgICAgICAgICAgIHZkID0gbmV3IFZlY3RvcjMocG9zLngsIHBvcy55LCBwb3Mueikubm9ybWFsaXplKCkuJHNjYWxlKC0xKTtcbiAgICAgICAgZ2wudW5pZm9ybTNmKHByb2dyYW0ubGlnaHRpbmdEaXJlY3Rpb24sIHZkLngsIHZkLnksIHZkLnopO1xuICAgICAgICBnbC51bmlmb3JtM2YocHJvZ3JhbS5kaXJlY3Rpb25hbENvbG9yLCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy9zZW5kIHZlcnRpY2VzIGRhdGFcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZWxlbS53ZWJHTFZlcnRleEJ1ZmZlcik7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihwcm9ncmFtLnBvc2l0aW9uLCAzLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApO1xuICAgIC8vc2VuZCBub3JtYWxzIGRhdGFcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZWxlbS53ZWJHTE5vcm1hbEJ1ZmZlcik7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihwcm9ncmFtLm5vcm1hbCwgMywgZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKTtcbiAgICAvL2RyYXchXG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZWxlbS53ZWJHTEZhY2VCdWZmZXIgKTtcbiAgICBnbC5kcmF3RWxlbWVudHMoZ2wuVFJJQU5HTEVTLCBlbGVtLndlYkdMRmFjZUNvdW50LCBnbC5VTlNJR05FRF9TSE9SVCwgMCk7XG4gIH1cbn0pO1xuXG5cbi8qXG4gKiBGaWxlOiBHcmFwaC5MYWJlbC5qc1xuICpcbiovXG5cbi8qXG4gICBPYmplY3Q6IEdyYXBoLkxhYmVsXG5cbiAgIEFuIGludGVyZmFjZSBmb3IgcGxvdHRpbmcvaGlkaW5nL3Nob3dpbmcgbGFiZWxzLlxuXG4gICBEZXNjcmlwdGlvbjpcblxuICAgVGhpcyBpcyBhIGdlbmVyaWMgaW50ZXJmYWNlIGZvciBwbG90dGluZy9oaWRpbmcvc2hvd2luZyBsYWJlbHMuXG4gICBUaGUgPEdyYXBoLkxhYmVsPiBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgaW4gbXVsdGlwbGUgd2F5cyB0byBwcm92aWRlXG4gICBkaWZmZXJlbnQgbGFiZWwgdHlwZXMuXG5cbiAgIEZvciBleGFtcGxlLCB0aGUgR3JhcGguTGFiZWwgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGFzIDxHcmFwaC5MYWJlbC5IVE1MPiB0byBwcm92aWRlXG4gICBIVE1MIGxhYmVsIGVsZW1lbnRzLiBBbHNvIHdlIHByb3ZpZGUgdGhlIDxHcmFwaC5MYWJlbC5TVkc+IGludGVyZmFjZSBmb3IgU1ZHIHR5cGUgbGFiZWxzLiBcbiAgIFRoZSA8R3JhcGguTGFiZWwuTmF0aXZlPiBpbnRlcmZhY2UgaW1wbGVtZW50cyB0aGVzZSBtZXRob2RzIHdpdGggdGhlIG5hdGl2ZSBDYW52YXMgdGV4dCByZW5kZXJpbmcgZnVuY3Rpb25zLlxuICAgXG4gICBBbGwgc3ViY2xhc3NlcyAoPEdyYXBoLkxhYmVsLkhUTUw+LCA8R3JhcGguTGFiZWwuU1ZHPiBhbmQgPEdyYXBoLkxhYmVsLk5hdGl2ZT4pIGltcGxlbWVudCB0aGUgbWV0aG9kIHBsb3RMYWJlbC5cbiovXG5cbkdyYXBoLkxhYmVsID0ge307XG5cbi8qXG4gICBDbGFzczogR3JhcGguTGFiZWwuTmF0aXZlXG5cbiAgIEltcGxlbWVudHMgbGFiZWxzIG5hdGl2ZWx5LCB1c2luZyB0aGUgQ2FudmFzIHRleHQgQVBJLlxuKi9cbkdyYXBoLkxhYmVsLk5hdGl2ZSA9IG5ldyBDbGFzcyh7XG4gICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24odml6KSB7XG4gICAgICB0aGlzLnZpeiA9IHZpejtcbiAgICB9LFxuXG4gICAgLypcbiAgICAgICBNZXRob2Q6IHBsb3RMYWJlbFxuXG4gICAgICAgUGxvdHMgYSBsYWJlbCBmb3IgYSBnaXZlbiBub2RlLlxuXG4gICAgICAgUGFyYW1ldGVyczpcblxuICAgICAgIGNhbnZhcyAtIChvYmplY3QpIEEgPENhbnZhcz4gaW5zdGFuY2UuXG4gICAgICAgbm9kZSAtIChvYmplY3QpIEEgPEdyYXBoLk5vZGU+LlxuICAgICAgIGNvbnRyb2xsZXIgLSAob2JqZWN0KSBBIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICAgICAgIFxuICAgICAgIEV4YW1wbGU6XG4gICAgICAgXG4gICAgICAgKHN0YXJ0IGNvZGUganMpXG4gICAgICAgdmFyIHZpeiA9IG5ldyAkaml0LlZpeihvcHRpb25zKTtcbiAgICAgICB2YXIgbm9kZSA9IHZpei5ncmFwaC5nZXROb2RlKCdub2RlSWQnKTtcbiAgICAgICB2aXoubGFiZWxzLnBsb3RMYWJlbCh2aXouY2FudmFzLCBub2RlLCB2aXouY29uZmlnKTtcbiAgICAgICAoZW5kIGNvZGUpXG4gICAgKi9cbiAgICBwbG90TGFiZWw6IGZ1bmN0aW9uKGNhbnZhcywgbm9kZSwgY29udHJvbGxlcikge1xuICAgICAgXG4gICAgICB2YXIgY3R4ID0gY2FudmFzLmdldEN0eCgpO1xuICAgICAgdmFyIHBvcyA9IG5vZGUucG9zLmdldGModHJ1ZSk7XG5cbiAgICAgIGN0eC5mb250ID0gbm9kZS5nZXRMYWJlbERhdGEoJ3N0eWxlJykgKyAnICcgKyBub2RlLmdldExhYmVsRGF0YSgnc2l6ZScpICsgJ3B4ICcgKyBub2RlLmdldExhYmVsRGF0YSgnZmFtaWx5Jyk7XG4gICAgICBjdHgudGV4dEFsaWduID0gbm9kZS5nZXRMYWJlbERhdGEoJ3RleHRBbGlnbicpO1xuICAgICAgLy8gT1JJR0lOQUwgQ09ERSBjdHguZmlsbFN0eWxlID0gY3R4LnN0cm9rZVN0eWxlID0gbm9kZS5nZXRMYWJlbERhdGEoJ2NvbG9yJyk7XG4gICAgICBjdHgudGV4dEJhc2VsaW5lID0gbm9kZS5nZXRMYWJlbERhdGEoJ3RleHRCYXNlbGluZScpO1xuICAgICAgXG4gICAgICAvL1NUQVJUIE1FVEFNQVBTIENPREVcbiAgICAgIFxuICAgICAgdmFyIGFycmF5T2ZMYWJlbExpbmVzID0gTWV0YW1hcHMuVXRpbC5zcGxpdExpbmUobm9kZS5uYW1lLCAyNSkuc3BsaXQoJ1xcbicpO1xuICAgICAgLy9yZW5kZXIgYmFja2dyb3VuZFxuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGN0eC5zdHJva2VTdHlsZSA9IE1ldGFtYXBzLlNldHRpbmdzLmNvbG9ycy5sYWJlbHMuYmFja2dyb3VuZDtcbiAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSAyO1xuICAgICAgICAgICAgdmFyIGhlaWdodCA9IDI1ICogYXJyYXlPZkxhYmVsTGluZXMubGVuZ3RoOyAvL2ZvbnQgc2l6ZSArIG1hcmdpblxuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgaW5kZXgsIGxpbmVXaWR0aHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGFycmF5T2ZMYWJlbExpbmVzLmxlbmd0aDsgKytpbmRleCkge1xuICAgICAgICAgICAgICBsaW5lV2lkdGhzLnB1c2goIGN0eC5tZWFzdXJlVGV4dCggYXJyYXlPZkxhYmVsTGluZXNbaW5kZXhdICkud2lkdGggKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHdpZHRoID0gTWF0aC5tYXguYXBwbHkobnVsbCwgbGluZVdpZHRocykgKyA4O1xuICAgICAgICAgICAgdmFyIHggPSBwb3MueCAtIHdpZHRoLzI7XG4gICAgICAgICAgICB2YXIgeSA9IHBvcy55ICsgbm9kZS5nZXREYXRhKFwiaGVpZ2h0XCIpICsgNTtcbiAgICAgICAgICAgIHZhciByYWRpdXMgPSA1O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgICAgY3R4Lm1vdmVUbyh4ICsgcmFkaXVzLCB5KTtcbiAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4ICsgd2lkdGggLSByYWRpdXMsIHkpO1xuICAgICAgICAgICAgICBjdHgucXVhZHJhdGljQ3VydmVUbyh4ICsgd2lkdGgsIHksIHggKyB3aWR0aCwgeSArIHJhZGl1cyk7XG4gICAgICAgICAgICAgIGN0eC5saW5lVG8oeCArIHdpZHRoLCB5ICsgaGVpZ2h0IC0gcmFkaXVzKTtcbiAgICAgICAgICAgICAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB4ICsgd2lkdGggLSByYWRpdXMsIHkgKyBoZWlnaHQpO1xuICAgICAgICAgICAgICBjdHgubGluZVRvKHggKyByYWRpdXMsIHkgKyBoZWlnaHQpO1xuICAgICAgICAgICAgICBjdHgucXVhZHJhdGljQ3VydmVUbyh4LCB5ICsgaGVpZ2h0LCB4LCB5ICsgaGVpZ2h0IC0gcmFkaXVzKTtcbiAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4LCB5ICsgcmFkaXVzKTtcbiAgICAgICAgICAgICAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCwgeSwgeCArIHJhZGl1cywgeSk7XG4gICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgICAgICAgICAgLy9jdHguc3Ryb2tlKCk7XG4gICAgICAgXG4gICAgICAgY3R4LmZpbGxTdHlsZSA9IGN0eC5zdHJva2VTdHlsZSA9IG5vZGUuZ2V0TGFiZWxEYXRhKCdjb2xvcicpO1xuXG4gICAgICB0aGlzLnJlbmRlckxhYmVsKGFycmF5T2ZMYWJlbExpbmVzLCBjYW52YXMsIG5vZGUsIGNvbnRyb2xsZXIpO1xuICAgICAgLy8gRU5EIE1FVEFNQVBTIENPREVcbiAgICAgIC8vIE9SSUdJTkFMIENPREUgIHRoaXMucmVuZGVyTGFiZWwoY2FudmFzLCBub2RlLCBjb250cm9sbGVyKTtcbiAgICB9LFxuXG4gICAgLypcbiAgICAgICByZW5kZXJMYWJlbFxuXG4gICAgICAgRG9lcyB0aGUgYWN0dWFsIHJlbmRlcmluZyBvZiB0aGUgbGFiZWwgaW4gdGhlIGNhbnZhcy4gVGhlIGRlZmF1bHRcbiAgICAgICBpbXBsZW1lbnRhdGlvbiByZW5kZXJzIHRoZSBsYWJlbCBjbG9zZSB0byB0aGUgcG9zaXRpb24gb2YgdGhlIG5vZGUsIHRoaXNcbiAgICAgICBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRlbiB0byBwb3NpdGlvbiB0aGUgbGFiZWxzIGRpZmZlcmVudGx5LlxuXG4gICAgICAgUGFyYW1ldGVyczpcblxuICAgICAgIGNhbnZhcyAtIEEgPENhbnZhcz4gaW5zdGFuY2UuXG4gICAgICAgbm9kZSAtIEEgPEdyYXBoLk5vZGU+LlxuICAgICAgIGNvbnRyb2xsZXIgLSBBIGNvbmZpZ3VyYXRpb24gb2JqZWN0LiBTZWUgYWxzbyA8SHlwZXJ0cmVlPiwgPFJHcmFwaD4sIDxTVD4uXG4gICAgKi9cbiAgICByZW5kZXJMYWJlbDogZnVuY3Rpb24oY3VzdG9tTGFiZWwsIGNhbnZhcywgbm9kZSwgY29udHJvbGxlcikge1xuICAgICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDdHgoKTtcbiAgICAgIHZhciBwb3MgPSBub2RlLnBvcy5nZXRjKHRydWUpO1xuICAgICAgLy9jdHguZmlsbFRleHQobm9kZS5uYW1lLCBwb3MueCwgcG9zLnkgKyBub2RlLmdldERhdGEoXCJoZWlnaHRcIikgLyAyKTtcbiAgICAgIC8vIFNUQVJUIE1FVEFNQVBTIENPREVcbiAgICAgIHZhciBpbmRleDtcbiAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGN1c3RvbUxhYmVsLmxlbmd0aDsgKytpbmRleCkge1xuICAgICAgICBjdHguZmlsbFRleHQoY3VzdG9tTGFiZWxbaW5kZXhdLCBwb3MueCwgcG9zLnkgKyBub2RlLmdldERhdGEoXCJoZWlnaHRcIikgKyAyMyArICgyNSppbmRleCkpO1xuICAgICAgfVxuICAgICAgLy8gRU5EIE1FVEFNQVBTIENPREVcbiAgICB9LFxuXG4gICAgaGlkZUxhYmVsOiAkLmVtcHR5LFxuICAgIGhpZGVMYWJlbHM6ICQuZW1wdHlcbn0pO1xuXG4vKlxuICAgQ2xhc3M6IEdyYXBoLkxhYmVsLkRPTVxuXG4gICBBYnN0cmFjdCBDbGFzcyBpbXBsZW1lbnRpbmcgc29tZSBET00gbGFiZWwgbWV0aG9kcy5cblxuICAgSW1wbGVtZW50ZWQgYnk6XG5cbiAgIDxHcmFwaC5MYWJlbC5IVE1MPiBhbmQgPEdyYXBoLkxhYmVsLlNWRz4uXG5cbiovXG5HcmFwaC5MYWJlbC5ET00gPSBuZXcgQ2xhc3Moe1xuICAgIC8vQSBmbGFnIHZhbHVlIGluZGljYXRpbmcgaWYgbm9kZSBsYWJlbHMgYXJlIGJlaW5nIGRpc3BsYXllZCBvciBub3QuXG4gICAgbGFiZWxzSGlkZGVuOiBmYWxzZSxcbiAgICAvL0xhYmVsIGNvbnRhaW5lclxuICAgIGxhYmVsQ29udGFpbmVyOiBmYWxzZSxcbiAgICAvL0xhYmVsIGVsZW1lbnRzIGhhc2guXG4gICAgbGFiZWxzOiB7fSxcblxuICAgIC8qXG4gICAgICAgTWV0aG9kOiBnZXRMYWJlbENvbnRhaW5lclxuXG4gICAgICAgTGF6eSBmZXRjaGVyIGZvciB0aGUgbGFiZWwgY29udGFpbmVyLlxuXG4gICAgICAgUmV0dXJuczpcblxuICAgICAgIFRoZSBsYWJlbCBjb250YWluZXIgRE9NIGVsZW1lbnQuXG5cbiAgICAgICBFeGFtcGxlOlxuXG4gICAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgICAgdmFyIHZpeiA9IG5ldyAkaml0LlZpeihvcHRpb25zKTtcbiAgICAgICAgdmFyIGxhYmVsQ29udGFpbmVyID0gdml6LmxhYmVscy5nZXRMYWJlbENvbnRhaW5lcigpO1xuICAgICAgICBhbGVydChsYWJlbENvbnRhaW5lci5pbm5lckhUTUwpO1xuICAgICAgKGVuZCBjb2RlKVxuICAgICovXG4gICAgZ2V0TGFiZWxDb250YWluZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMubGFiZWxDb250YWluZXIgP1xuICAgICAgICB0aGlzLmxhYmVsQ29udGFpbmVyIDpcbiAgICAgICAgdGhpcy5sYWJlbENvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMudml6LmNvbmZpZy5sYWJlbENvbnRhaW5lcik7XG4gICAgfSxcblxuICAgIC8qXG4gICAgICAgTWV0aG9kOiBnZXRMYWJlbFxuXG4gICAgICAgTGF6eSBmZXRjaGVyIGZvciB0aGUgbGFiZWwgZWxlbWVudC5cblxuICAgICAgIFBhcmFtZXRlcnM6XG5cbiAgICAgICBpZCAtIChzdHJpbmcpIFRoZSBsYWJlbCBpZCAod2hpY2ggaXMgYWxzbyBhIDxHcmFwaC5Ob2RlPiBpZCkuXG5cbiAgICAgICBSZXR1cm5zOlxuXG4gICAgICAgVGhlIGxhYmVsIGVsZW1lbnQuXG5cbiAgICAgICBFeGFtcGxlOlxuXG4gICAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgICAgdmFyIHZpeiA9IG5ldyAkaml0LlZpeihvcHRpb25zKTtcbiAgICAgICAgdmFyIGxhYmVsID0gdml6LmxhYmVscy5nZXRMYWJlbCgnc29tZWlkJyk7XG4gICAgICAgIGFsZXJ0KGxhYmVsLmlubmVySFRNTCk7XG4gICAgICAoZW5kIGNvZGUpXG5cbiAgICAqL1xuICAgIGdldExhYmVsOiBmdW5jdGlvbihpZCkge1xuICAgICAgcmV0dXJuIChpZCBpbiB0aGlzLmxhYmVscyAmJiB0aGlzLmxhYmVsc1tpZF0gIT0gbnVsbCkgP1xuICAgICAgICB0aGlzLmxhYmVsc1tpZF0gOlxuICAgICAgICB0aGlzLmxhYmVsc1tpZF0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgfSxcblxuICAgIC8qXG4gICAgICAgTWV0aG9kOiBoaWRlTGFiZWxzXG5cbiAgICAgICBIaWRlcyBhbGwgbGFiZWxzIChieSBoaWRpbmcgdGhlIGxhYmVsIGNvbnRhaW5lcikuXG5cbiAgICAgICBQYXJhbWV0ZXJzOlxuXG4gICAgICAgaGlkZSAtIChib29sZWFuKSBBIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBpZiB0aGUgbGFiZWwgY29udGFpbmVyIG11c3QgYmUgaGlkZGVuIG9yIG5vdC5cblxuICAgICAgIEV4YW1wbGU6XG4gICAgICAgKHN0YXJ0IGNvZGUganMpXG4gICAgICAgIHZhciB2aXogPSBuZXcgJGppdC5WaXoob3B0aW9ucyk7XG4gICAgICAgIHJnLmxhYmVscy5oaWRlTGFiZWxzKHRydWUpO1xuICAgICAgIChlbmQgY29kZSlcblxuICAgICovXG4gICAgaGlkZUxhYmVsczogZnVuY3Rpb24gKGhpZGUpIHtcbiAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLmdldExhYmVsQ29udGFpbmVyKCk7XG4gICAgICBpZihoaWRlKVxuICAgICAgICBjb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGVsc2VcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIHRoaXMubGFiZWxzSGlkZGVuID0gaGlkZTtcbiAgICB9LFxuXG4gICAgLypcbiAgICAgICBNZXRob2Q6IGNsZWFyTGFiZWxzXG5cbiAgICAgICBDbGVhcnMgdGhlIGxhYmVsIGNvbnRhaW5lci5cblxuICAgICAgIFVzZWZ1bCB3aGVuIHVzaW5nIGEgbmV3IHZpc3VhbGl6YXRpb24gd2l0aCB0aGUgc2FtZSBjYW52YXMgZWxlbWVudC93aWRnZXQuXG5cbiAgICAgICBQYXJhbWV0ZXJzOlxuXG4gICAgICAgZm9yY2UgLSAoYm9vbGVhbikgRm9yY2VzIGRlbGV0aW9uIG9mIGFsbCBsYWJlbHMuXG5cbiAgICAgICBFeGFtcGxlOlxuICAgICAgIChzdGFydCBjb2RlIGpzKVxuICAgICAgICB2YXIgdml6ID0gbmV3ICRqaXQuVml6KG9wdGlvbnMpO1xuICAgICAgICB2aXoubGFiZWxzLmNsZWFyTGFiZWxzKCk7XG4gICAgICAgIChlbmQgY29kZSlcbiAgICAqL1xuICAgIGNsZWFyTGFiZWxzOiBmdW5jdGlvbihmb3JjZSkge1xuICAgICAgZm9yKHZhciBpZCBpbiB0aGlzLmxhYmVscykge1xuICAgICAgICBpZiAoZm9yY2UgfHwgIXRoaXMudml6LmdyYXBoLmhhc05vZGUoaWQpKSB7XG4gICAgICAgICAgdGhpcy5kaXNwb3NlTGFiZWwoaWQpO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmxhYmVsc1tpZF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLypcbiAgICAgICBNZXRob2Q6IGRpc3Bvc2VMYWJlbFxuXG4gICAgICAgUmVtb3ZlcyBhIGxhYmVsLlxuXG4gICAgICAgUGFyYW1ldGVyczpcblxuICAgICAgIGlkIC0gKHN0cmluZykgQSBsYWJlbCBpZCAod2hpY2ggZ2VuZXJhbGx5IGlzIGFsc28gYSA8R3JhcGguTm9kZT4gaWQpLlxuXG4gICAgICAgRXhhbXBsZTpcbiAgICAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgICAgdmFyIHZpeiA9IG5ldyAkaml0LlZpeihvcHRpb25zKTtcbiAgICAgICAgdml6LmxhYmVscy5kaXNwb3NlTGFiZWwoJ2xhYmVsaWQnKTtcbiAgICAgICAoZW5kIGNvZGUpXG4gICAgKi9cbiAgICBkaXNwb3NlTGFiZWw6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgZWxlbSA9IHRoaXMuZ2V0TGFiZWwoaWQpO1xuICAgICAgaWYoZWxlbSAmJiBlbGVtLnBhcmVudE5vZGUpIHtcbiAgICAgICAgZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKlxuICAgICAgIE1ldGhvZDogaGlkZUxhYmVsXG5cbiAgICAgICBIaWRlcyB0aGUgY29ycmVzcG9uZGluZyA8R3JhcGguTm9kZT4gbGFiZWwuXG5cbiAgICAgICBQYXJhbWV0ZXJzOlxuXG4gICAgICAgbm9kZSAtIChvYmplY3QpIEEgPEdyYXBoLk5vZGU+LiBDYW4gYWxzbyBiZSBhbiBhcnJheSBvZiA8R3JhcGguTm9kZXM+LlxuICAgICAgIHNob3cgLSAoYm9vbGVhbikgSWYgKnRydWUqLCBub2RlcyB3aWxsIGJlIHNob3duLiBPdGhlcndpc2Ugbm9kZXMgd2lsbCBiZSBoaWRkZW4uXG5cbiAgICAgICBFeGFtcGxlOlxuICAgICAgIChzdGFydCBjb2RlIGpzKVxuICAgICAgICB2YXIgcmcgPSBuZXcgJGppdC5WaXoob3B0aW9ucyk7XG4gICAgICAgIHZpei5sYWJlbHMuaGlkZUxhYmVsKHZpei5ncmFwaC5nZXROb2RlKCdzb21laWQnKSwgZmFsc2UpO1xuICAgICAgIChlbmQgY29kZSlcbiAgICAqL1xuICAgIGhpZGVMYWJlbDogZnVuY3Rpb24obm9kZSwgc2hvdykge1xuICAgICAgbm9kZSA9ICQuc3BsYXQobm9kZSk7XG4gICAgICB2YXIgc3QgPSBzaG93ID8gXCJcIiA6IFwibm9uZVwiLCBsYWIsIHRoYXQgPSB0aGlzO1xuICAgICAgJC5lYWNoKG5vZGUsIGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgdmFyIGxhYiA9IHRoYXQuZ2V0TGFiZWwobi5pZCk7XG4gICAgICAgIGlmIChsYWIpIHtcbiAgICAgICAgICBsYWIuc3R5bGUuZGlzcGxheSA9IHN0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgLypcbiAgICAgICBmaXRzSW5DYW52YXNcblxuICAgICAgIFJldHVybnMgX3RydWVfIG9yIF9mYWxzZV8gaWYgdGhlIGxhYmVsIGZvciB0aGUgbm9kZSBpcyBjb250YWluZWQgaW4gdGhlIGNhbnZhcyBkb20gZWxlbWVudCBvciBub3QuXG5cbiAgICAgICBQYXJhbWV0ZXJzOlxuXG4gICAgICAgcG9zIC0gQSA8Q29tcGxleD4gaW5zdGFuY2UgKEknbSBkb2luZyBkdWNrIHR5cGluZyBoZXJlIHNvIGFueSBvYmplY3Qgd2l0aCBfeF8gYW5kIF95XyBwYXJhbWV0ZXJzIHdpbGwgZG8pLlxuICAgICAgIGNhbnZhcyAtIEEgPENhbnZhcz4gaW5zdGFuY2UuXG5cbiAgICAgICBSZXR1cm5zOlxuXG4gICAgICAgQSBib29sZWFuIHZhbHVlIHNwZWNpZnlpbmcgaWYgdGhlIGxhYmVsIGlzIGNvbnRhaW5lZCBpbiB0aGUgPENhbnZhcz4gRE9NIGVsZW1lbnQgb3Igbm90LlxuXG4gICAgKi9cbiAgICBmaXRzSW5DYW52YXM6IGZ1bmN0aW9uKHBvcywgY2FudmFzKSB7XG4gICAgICB2YXIgc2l6ZSA9IGNhbnZhcy5nZXRTaXplKCk7XG4gICAgICBpZihwb3MueCA+PSBzaXplLndpZHRoIHx8IHBvcy54IDwgMFxuICAgICAgICAgfHwgcG9zLnkgPj0gc2l6ZS5oZWlnaHQgfHwgcG9zLnkgPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufSk7XG5cbi8qXG4gICBDbGFzczogR3JhcGguTGFiZWwuSFRNTFxuXG4gICBJbXBsZW1lbnRzIEhUTUwgbGFiZWxzLlxuXG4gICBFeHRlbmRzOlxuXG4gICBBbGwgPEdyYXBoLkxhYmVsLkRPTT4gbWV0aG9kcy5cblxuKi9cbkdyYXBoLkxhYmVsLkhUTUwgPSBuZXcgQ2xhc3Moe1xuICAgIEltcGxlbWVudHM6IEdyYXBoLkxhYmVsLkRPTSxcblxuICAgIC8qXG4gICAgICAgTWV0aG9kOiBwbG90TGFiZWxcblxuICAgICAgIFBsb3RzIGEgbGFiZWwgZm9yIGEgZ2l2ZW4gbm9kZS5cblxuICAgICAgIFBhcmFtZXRlcnM6XG5cbiAgICAgICBjYW52YXMgLSAob2JqZWN0KSBBIDxDYW52YXM+IGluc3RhbmNlLlxuICAgICAgIG5vZGUgLSAob2JqZWN0KSBBIDxHcmFwaC5Ob2RlPi5cbiAgICAgICBjb250cm9sbGVyIC0gKG9iamVjdCkgQSBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAgICAgICBcbiAgICAgIEV4YW1wbGU6XG4gICAgICAgXG4gICAgICAgKHN0YXJ0IGNvZGUganMpXG4gICAgICAgdmFyIHZpeiA9IG5ldyAkaml0LlZpeihvcHRpb25zKTtcbiAgICAgICB2YXIgbm9kZSA9IHZpei5ncmFwaC5nZXROb2RlKCdub2RlSWQnKTtcbiAgICAgICB2aXoubGFiZWxzLnBsb3RMYWJlbCh2aXouY2FudmFzLCBub2RlLCB2aXouY29uZmlnKTtcbiAgICAgICAoZW5kIGNvZGUpXG5cblxuICAgICovXG4gICAgcGxvdExhYmVsOiBmdW5jdGlvbihjYW52YXMsIG5vZGUsIGNvbnRyb2xsZXIpIHtcbiAgICAgIHZhciBpZCA9IG5vZGUuaWQsIHRhZyA9IHRoaXMuZ2V0TGFiZWwoaWQpO1xuXG4gICAgICBpZighdGFnICYmICEodGFnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpKSkge1xuICAgICAgICB0YWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuZ2V0TGFiZWxDb250YWluZXIoKTtcbiAgICAgICAgdGFnLmlkID0gaWQ7XG4gICAgICAgIHRhZy5jbGFzc05hbWUgPSAnbm9kZSc7XG4gICAgICAgIHRhZy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIGNvbnRyb2xsZXIub25DcmVhdGVMYWJlbCh0YWcsIG5vZGUpO1xuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGFnKTtcbiAgICAgICAgdGhpcy5sYWJlbHNbbm9kZS5pZF0gPSB0YWc7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGxhY2VMYWJlbCh0YWcsIG5vZGUsIGNvbnRyb2xsZXIpO1xuICAgIH1cbn0pO1xuXG4vKlxuICAgQ2xhc3M6IEdyYXBoLkxhYmVsLlNWR1xuXG4gICBJbXBsZW1lbnRzIFNWRyBsYWJlbHMuXG5cbiAgIEV4dGVuZHM6XG5cbiAgIEFsbCA8R3JhcGguTGFiZWwuRE9NPiBtZXRob2RzLlxuKi9cbkdyYXBoLkxhYmVsLlNWRyA9IG5ldyBDbGFzcyh7XG4gICAgSW1wbGVtZW50czogR3JhcGguTGFiZWwuRE9NLFxuXG4gICAgLypcbiAgICAgICBNZXRob2Q6IHBsb3RMYWJlbFxuXG4gICAgICAgUGxvdHMgYSBsYWJlbCBmb3IgYSBnaXZlbiBub2RlLlxuXG4gICAgICAgUGFyYW1ldGVyczpcblxuICAgICAgIGNhbnZhcyAtIChvYmplY3QpIEEgPENhbnZhcz4gaW5zdGFuY2UuXG4gICAgICAgbm9kZSAtIChvYmplY3QpIEEgPEdyYXBoLk5vZGU+LlxuICAgICAgIGNvbnRyb2xsZXIgLSAob2JqZWN0KSBBIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICAgICAgIFxuICAgICAgIEV4YW1wbGU6XG4gICAgICAgXG4gICAgICAgKHN0YXJ0IGNvZGUganMpXG4gICAgICAgdmFyIHZpeiA9IG5ldyAkaml0LlZpeihvcHRpb25zKTtcbiAgICAgICB2YXIgbm9kZSA9IHZpei5ncmFwaC5nZXROb2RlKCdub2RlSWQnKTtcbiAgICAgICB2aXoubGFiZWxzLnBsb3RMYWJlbCh2aXouY2FudmFzLCBub2RlLCB2aXouY29uZmlnKTtcbiAgICAgICAoZW5kIGNvZGUpXG5cblxuICAgICovXG4gICAgcGxvdExhYmVsOiBmdW5jdGlvbihjYW52YXMsIG5vZGUsIGNvbnRyb2xsZXIpIHtcbiAgICAgIHZhciBpZCA9IG5vZGUuaWQsIHRhZyA9IHRoaXMuZ2V0TGFiZWwoaWQpO1xuICAgICAgaWYoIXRhZyAmJiAhKHRhZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSkpIHtcbiAgICAgICAgdmFyIG5zID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJztcbiAgICAgICAgICB0YWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobnMsICdzdmc6dGV4dCcpO1xuICAgICAgICB2YXIgdHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobnMsICdzdmc6dHNwYW4nKTtcbiAgICAgICAgdGFnLmFwcGVuZENoaWxkKHRzcGFuKTtcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuZ2V0TGFiZWxDb250YWluZXIoKTtcbiAgICAgICAgdGFnLnNldEF0dHJpYnV0ZSgnaWQnLCBpZCk7XG4gICAgICAgIHRhZy5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ25vZGUnKTtcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRhZyk7XG4gICAgICAgIGNvbnRyb2xsZXIub25DcmVhdGVMYWJlbCh0YWcsIG5vZGUpO1xuICAgICAgICB0aGlzLmxhYmVsc1tub2RlLmlkXSA9IHRhZztcbiAgICAgIH1cbiAgICAgIHRoaXMucGxhY2VMYWJlbCh0YWcsIG5vZGUsIGNvbnRyb2xsZXIpO1xuICAgIH1cbn0pO1xuXG5cblxuLypcbiAqIEZpbGU6IExvYWRlci5qc1xuICogXG4gKi9cblxuLypcbiAgIE9iamVjdDogTG9hZGVyXG5cbiAgIFByb3ZpZGVzIG1ldGhvZHMgZm9yIGxvYWRpbmcgYW5kIHNlcnZpbmcgSlNPTiBkYXRhLlxuKi9cbnZhciBMb2FkZXIgPSB7XG4gICAgIGNvbnN0cnVjdDogZnVuY3Rpb24oanNvbikge1xuICAgICAgICB2YXIgaXNHcmFwaCA9ICgkLnR5cGUoanNvbikgPT0gJ2FycmF5Jyk7XG4gICAgICAgIHZhciBhbnMgPSBuZXcgR3JhcGgodGhpcy5ncmFwaE9wdGlvbnMsIHRoaXMuY29uZmlnLk5vZGUsIHRoaXMuY29uZmlnLkVkZ2UsIHRoaXMuY29uZmlnLkxhYmVsKTtcbiAgICAgICAgaWYoIWlzR3JhcGgpIFxuICAgICAgICAgICAgLy9tYWtlIHRyZWVcbiAgICAgICAgICAgIChmdW5jdGlvbiAoYW5zLCBqc29uKSB7XG4gICAgICAgICAgICAgICAgYW5zLmFkZE5vZGUoanNvbik7XG4gICAgICAgICAgICAgICAgaWYoanNvbi5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgZm9yKHZhciBpPTAsIGNoID0ganNvbi5jaGlsZHJlbjsgaTxjaC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBhbnMuYWRkQWRqYWNlbmNlKGpzb24sIGNoW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzLmNhbGxlZShhbnMsIGNoW2ldKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KShhbnMsIGpzb24pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICAvL21ha2UgZ3JhcGhcbiAgICAgICAgICAgIChmdW5jdGlvbiAoYW5zLCBqc29uKSB7XG4gICAgICAgICAgICAgICAgdmFyIGdldE5vZGUgPSBmdW5jdGlvbihpZCkge1xuICAgICAgICAgICAgICAgICAgZm9yKHZhciBpPTAsIGw9anNvbi5sZW5ndGg7IGk8bDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKGpzb25baV0uaWQgPT0gaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ganNvbltpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGUgd2FzIG5vdCBkZWZpbmVkIGluIHRoZSBKU09OXG4gICAgICAgICAgICAgICAgICAvLyBMZXQncyBjcmVhdGUgaXRcbiAgICAgICAgICAgICAgICAgIHZhciBuZXdOb2RlID0ge1xuICAgICAgICAgICAgICAgIFx0XHRcImlkXCIgOiBpZCxcbiAgICAgICAgICAgICAgICBcdFx0XCJuYW1lXCIgOiBpZFxuICAgICAgICAgICAgICAgIFx0fTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBhbnMuYWRkTm9kZShuZXdOb2RlKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgZm9yKHZhciBpPTAsIGw9anNvbi5sZW5ndGg7IGk8bDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICBhbnMuYWRkTm9kZShqc29uW2ldKTtcbiAgICAgICAgICAgICAgICAgIHZhciBhZGogPSBqc29uW2ldLmFkamFjZW5jaWVzO1xuICAgICAgICAgICAgICAgICAgaWYgKGFkaikge1xuICAgICAgICAgICAgICAgICAgICBmb3IodmFyIGo9MCwgbGo9YWRqLmxlbmd0aDsgajxsajsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBhZGpbal0sIGRhdGEgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgYWRqW2pdICE9ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gJC5tZXJnZShub2RlLmRhdGEsIHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLm5vZGVUbztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgYW5zLmFkZEFkamFjZW5jZShqc29uW2ldLCBnZXROb2RlKG5vZGUpLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKGFucywganNvbik7XG5cbiAgICAgICAgcmV0dXJuIGFucztcbiAgICB9LFxuXG4gICAgLypcbiAgICAgTWV0aG9kOiBsb2FkSlNPTlxuICAgIFxuICAgICBMb2FkcyBhIEpTT04gc3RydWN0dXJlIHRvIHRoZSB2aXN1YWxpemF0aW9uLiBUaGUgSlNPTiBzdHJ1Y3R1cmUgY2FuIGJlIGEgSlNPTiAqdHJlZSogb3IgKmdyYXBoKiBzdHJ1Y3R1cmUuXG4gICAgIFxuICAgICAgQSBKU09OIHRyZWUgb3IgZ3JhcGggc3RydWN0dXJlIGNvbnNpc3RzIG9mIG5vZGVzLCBlYWNoIGhhdmluZyBhcyBwcm9wZXJ0aWVzXG4gICAgICAgXG4gICAgICAgaWQgLSAoc3RyaW5nKSBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbm9kZVxuICAgICAgIG5hbWUgLSAoc3RyaW5nKSBBIG5vZGUncyBuYW1lXG4gICAgICAgZGF0YSAtIChvYmplY3QpIFRoZSBkYXRhIG9wdGlvbmFsIHByb3BlcnR5IGNvbnRhaW5zIGEgaGFzaCAoaS5lIHt9KSBcbiAgICAgICB3aGVyZSB5b3UgY2FuIHN0b3JlIGFsbCB0aGUgaW5mb3JtYXRpb24geW91IHdhbnQgYWJvdXQgdGhpcyBub2RlLlxuICAgICAgICBcbiAgICAgIEZvciBKU09OICpUcmVlKiBzdHJ1Y3R1cmVzLCB0aGVyZSdzIGFuIGV4dHJhIG9wdGlvbmFsIHByb3BlcnR5ICpjaGlsZHJlbiogb2YgdHlwZSBBcnJheSB3aGljaCBjb250YWlucyB0aGUgbm9kZSdzIGNoaWxkcmVuLlxuICAgICAgXG4gICAgICBFeGFtcGxlOlxuXG4gICAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgICAgdmFyIGpzb24gPSB7ICBcbiAgICAgICAgICBcImlkXCI6IFwiYVVuaXF1ZUlkZW50aWZpZXJcIiwgIFxuICAgICAgICAgIFwibmFtZVwiOiBcInVzdWFsbHkgYSBub2RlcyBuYW1lXCIsICBcbiAgICAgICAgICBcImRhdGFcIjoge1xuICAgICAgICAgICAgXCJzb21lIGtleVwiOiBcInNvbWUgdmFsdWVcIixcbiAgICAgICAgICAgIFwic29tZSBvdGhlciBrZXlcIjogXCJzb21lIG90aGVyIHZhbHVlXCJcbiAgICAgICAgICAgfSwgIFxuICAgICAgICAgIFwiY2hpbGRyZW5cIjogWyAqb3RoZXIgbm9kZXMgb3IgZW1wdHkqIF0gIFxuICAgICAgICB9OyAgXG4gICAgICAoZW5kIGNvZGUpXG4gICAgICAgIFxuICAgICAgICBKU09OICpHcmFwaCogc3RydWN0dXJlcyBjb25zaXN0IG9mIGFuIGFycmF5IG9mIG5vZGVzLCBlYWNoIHNwZWNpZnlpbmcgdGhlIG5vZGVzIHRvIHdoaWNoIHRoZSBjdXJyZW50IG5vZGUgaXMgY29ubmVjdGVkLiBcbiAgICAgICAgRm9yIEpTT04gKkdyYXBoKiBzdHJ1Y3R1cmVzLCB0aGUgKmNoaWxkcmVuKiBwcm9wZXJ0eSBpcyByZXBsYWNlZCBieSB0aGUgKmFkamFjZW5jaWVzKiBwcm9wZXJ0eS5cbiAgICAgICAgXG4gICAgICAgIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgKkdyYXBoKiBzdHJ1Y3R1cmVzLCAqc2ltcGxlKiBhbmQgKmV4dGVuZGVkKiBncmFwaCBzdHJ1Y3R1cmVzLlxuICAgICAgICBcbiAgICAgICAgRm9yICpzaW1wbGUqIEdyYXBoIHN0cnVjdHVyZXMsIHRoZSBhZGphY2VuY2llcyBwcm9wZXJ0eSBjb250YWlucyBhbiBhcnJheSBvZiBzdHJpbmdzLCBlYWNoIHNwZWNpZnlpbmcgdGhlIFxuICAgICAgICBpZCBvZiB0aGUgbm9kZSBjb25uZWN0ZWQgdG8gdGhlIG1haW4gbm9kZS5cbiAgICAgICAgXG4gICAgICAgIEV4YW1wbGU6XG4gICAgICAgIFxuICAgICAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgICAgdmFyIGpzb24gPSBbICBcbiAgICAgICAgICB7ICBcbiAgICAgICAgICAgIFwiaWRcIjogXCJhVW5pcXVlSWRlbnRpZmllclwiLCAgXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ1c3VhbGx5IGEgbm9kZXMgbmFtZVwiLCAgXG4gICAgICAgICAgICBcImRhdGFcIjoge1xuICAgICAgICAgICAgICBcInNvbWUga2V5XCI6IFwic29tZSB2YWx1ZVwiLFxuICAgICAgICAgICAgICBcInNvbWUgb3RoZXIga2V5XCI6IFwic29tZSBvdGhlciB2YWx1ZVwiXG4gICAgICAgICAgICAgfSwgIFxuICAgICAgICAgICAgXCJhZGphY2VuY2llc1wiOiBbXCJhbm90aGVyVW5pcXVlSWRlbnRpZmllclwiLCBcInlldEFub3RoZXJVbmlxdWVJZGVudGlmaWVyXCIsICdldGMnXSAgXG4gICAgICAgICAgfSxcblxuICAgICAgICAgICdvdGhlciBub2RlcyBnbyBoZXJlLi4uJyBcbiAgICAgICAgXTsgICAgICAgICAgXG4gICAgICAgIChlbmQgY29kZSlcbiAgICAgICAgXG4gICAgICAgIEZvciAqZXh0ZW5kZWQgR3JhcGggc3RydWN0dXJlcyosIHRoZSBhZGphY2VuY2llcyBwcm9wZXJ0eSBjb250YWlucyBhbiBhcnJheSBvZiBBZGphY2VuY3kgb2JqZWN0cyB0aGF0IGhhdmUgYXMgcHJvcGVydGllc1xuICAgICAgICBcbiAgICAgICAgbm9kZVRvIC0gKHN0cmluZykgVGhlIG90aGVyIG5vZGUgY29ubmVjdGVkIGJ5IHRoaXMgYWRqYWNlbmN5LlxuICAgICAgICBkYXRhIC0gKG9iamVjdCkgQSBkYXRhIHByb3BlcnR5LCB3aGVyZSB3ZSBjYW4gc3RvcmUgY3VzdG9tIGtleS92YWx1ZSBpbmZvcm1hdGlvbi5cbiAgICAgICAgXG4gICAgICAgIEV4YW1wbGU6XG4gICAgICAgIFxuICAgICAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgICAgdmFyIGpzb24gPSBbICBcbiAgICAgICAgICB7ICBcbiAgICAgICAgICAgIFwiaWRcIjogXCJhVW5pcXVlSWRlbnRpZmllclwiLCAgXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJ1c3VhbGx5IGEgbm9kZXMgbmFtZVwiLCAgXG4gICAgICAgICAgICBcImRhdGFcIjoge1xuICAgICAgICAgICAgICBcInNvbWUga2V5XCI6IFwic29tZSB2YWx1ZVwiLFxuICAgICAgICAgICAgICBcInNvbWUgb3RoZXIga2V5XCI6IFwic29tZSBvdGhlciB2YWx1ZVwiXG4gICAgICAgICAgICAgfSwgIFxuICAgICAgICAgICAgXCJhZGphY2VuY2llc1wiOiBbICBcbiAgICAgICAgICAgIHsgIFxuICAgICAgICAgICAgICBub2RlVG86XCJhTm9kZUlkXCIsICBcbiAgICAgICAgICAgICAgZGF0YToge30gLy9wdXQgd2hhdGV2ZXIgeW91IHdhbnQgaGVyZSAgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ290aGVyIGFkamFjZW5jaWVzIGdvIGhlcmUuLi4nICBcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgJ290aGVyIG5vZGVzIGdvIGhlcmUuLi4nIFxuICAgICAgICBdOyAgICAgICAgICBcbiAgICAgICAgKGVuZCBjb2RlKVxuICAgICAgIFxuICAgICAgIEFib3V0IHRoZSBkYXRhIHByb3BlcnR5OlxuICAgICAgIFxuICAgICAgIEFzIGRlc2NyaWJlZCBiZWZvcmUsIHlvdSBjYW4gc3RvcmUgY3VzdG9tIGRhdGEgaW4gdGhlICpkYXRhKiBwcm9wZXJ0eSBvZiBKU09OICpub2RlcyogYW5kICphZGphY2VuY2llcyouIFxuICAgICAgIFlvdSBjYW4gdXNlIGFsbW9zdCBhbnkgc3RyaW5nIGFzIGtleSBmb3IgdGhlIGRhdGEgb2JqZWN0LiBTb21lIGtleXMgdGhvdWdoIGFyZSByZXNlcnZlZCBieSB0aGUgdG9vbGtpdCwgYW5kIFxuICAgICAgIGhhdmUgc3BlY2lhbCBtZWFuaW5ncy4gVGhpcyBpcyB0aGUgY2FzZSBmb3Iga2V5cyBzdGFydGluZyB3aXRoIGEgZG9sbGFyIHNpZ24sIGZvciBleGFtcGxlLCAqJHdpZHRoKi5cbiAgICAgICBcbiAgICAgICBGb3IgSlNPTiAqbm9kZSogb2JqZWN0cywgYWRkaW5nIGRvbGxhciBwcmVmaXhlZCBwcm9wZXJ0aWVzIHRoYXQgbWF0Y2ggdGhlIG5hbWVzIG9mIHRoZSBvcHRpb25zIGRlZmluZWQgaW4gXG4gICAgICAgPE9wdGlvbnMuTm9kZT4gd2lsbCBvdmVycmlkZSB0aGUgZ2VuZXJhbCB2YWx1ZSBmb3IgdGhhdCBvcHRpb24gd2l0aCB0aGF0IHBhcnRpY3VsYXIgdmFsdWUuIEZvciB0aGlzIHRvIHdvcmsgXG4gICAgICAgaG93ZXZlciwgeW91IGRvIGhhdmUgdG8gc2V0ICpvdmVycmlkYWJsZSA9IHRydWUqIGluIDxPcHRpb25zLk5vZGU+LlxuICAgICAgIFxuICAgICAgIFRoZSBzYW1lIHRoaW5nIGlzIHRydWUgZm9yIEpTT04gYWRqYWNlbmNpZXMuIERvbGxhciBwcmVmaXhlZCBkYXRhIHByb3BlcnRpZXMgd2lsbCBhbHRlciB2YWx1ZXMgc2V0IGluIDxPcHRpb25zLkVkZ2U+IFxuICAgICAgIGlmIDxPcHRpb25zLkVkZ2U+IGhhcyAqb3ZlcnJpZGFibGUgPSB0cnVlKi5cbiAgICAgICBcbiAgICAgICBXaGVuIGxvYWRpbmcgSlNPTiBkYXRhIGludG8gVHJlZU1hcHMsIHRoZSAqZGF0YSogcHJvcGVydHkgbXVzdCBjb250YWluIGEgdmFsdWUgZm9yIHRoZSAqJGFyZWEqIGtleSwgXG4gICAgICAgc2luY2UgdGhpcyBpcyB0aGUgdmFsdWUgd2hpY2ggd2lsbCBiZSB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBjcmVhdGluZyB0aGUgbGF5b3V0LiBcbiAgICAgICBUaGUgc2FtZSB0aGluZyBnb2VzIGZvciB0aGUgKiRjb2xvciogcGFyYW1ldGVyLlxuICAgICAgIFxuICAgICAgIEluIEpTT04gTm9kZXMgeW91IGNhbiB1c2UgYWxzbyAqJGxhYmVsLSogcHJlZml4ZWQgcHJvcGVydGllcyB0byByZWZlciB0byA8T3B0aW9ucy5MYWJlbD4gcHJvcGVydGllcy4gRm9yIGV4YW1wbGUsIFxuICAgICAgICokbGFiZWwtc2l6ZSogd2lsbCByZWZlciB0byA8T3B0aW9ucy5MYWJlbD4gc2l6ZSBwcm9wZXJ0eS4gQWxzbywgaW4gSlNPTiBub2RlcyBhbmQgYWRqYWNlbmNpZXMgeW91IGNhbiBzZXQgXG4gICAgICAgY2FudmFzIHNwZWNpZmljIHByb3BlcnRpZXMgaW5kaXZpZHVhbGx5IGJ5IHVzaW5nIHRoZSAqJGNhbnZhcy0qIHByZWZpeC4gRm9yIGV4YW1wbGUsICokY2FudmFzLXNoYWRvd0JsdXIqIHdpbGwgcmVmZXIgXG4gICAgICAgdG8gdGhlICpzaGFkb3dCbHVyKiBwcm9wZXJ0eS5cbiAgICAgICBcbiAgICAgICBUaGVzZSBwcm9wZXJ0aWVzIGNhbiBhbHNvIGJlIGFjY2Vzc2VkIGFmdGVyIGxvYWRpbmcgdGhlIEpTT04gZGF0YSBmcm9tIDxHcmFwaC5Ob2Rlcz4gYW5kIDxHcmFwaC5BZGphY2VuY2VzPiBcbiAgICAgICBieSB1c2luZyA8QWNjZXNzb3JzPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gdGFrZSBhIGxvb2sgYXQgdGhlIDxHcmFwaD4gYW5kIDxBY2Nlc3NvcnM+IGRvY3VtZW50YXRpb24uXG4gICAgICAgXG4gICAgICAgRmluYWxseSwgdGhlc2UgcHJvcGVydGllcyBjYW4gYWxzbyBiZSB1c2VkIHRvIGNyZWF0ZSBhZHZhbmNlZCBhbmltYXRpb25zIGxpa2Ugd2l0aCA8T3B0aW9ucy5Ob2RlU3R5bGVzPi4gRm9yIG1vcmUgXG4gICAgICAgaW5mb3JtYXRpb24gYWJvdXQgY3JlYXRpbmcgYW5pbWF0aW9ucyBwbGVhc2UgdGFrZSBhIGxvb2sgYXQgdGhlIDxHcmFwaC5QbG90PiBhbmQgPEdyYXBoLlBsb3QuYW5pbWF0ZT4gZG9jdW1lbnRhdGlvbi5cbiAgICAgICBcbiAgICAgICBsb2FkSlNPTiBQYXJhbWV0ZXJzOlxuICAgIFxuICAgICAgICBqc29uIC0gQSBKU09OIFRyZWUgb3IgR3JhcGggc3RydWN0dXJlLlxuICAgICAgICBpIC0gRm9yIEdyYXBoIHN0cnVjdHVyZXMgb25seS4gU2V0cyB0aGUgaW5kZXhlZCBub2RlIGFzIHJvb3QgZm9yIHRoZSB2aXN1YWxpemF0aW9uLlxuXG4gICAgKi9cbiAgICBsb2FkSlNPTjogZnVuY3Rpb24oanNvbiwgaSkge1xuICAgICAgdGhpcy5qc29uID0ganNvbjtcbiAgICAgIC8vaWYgdGhleSdyZSBjYW52YXMgbGFiZWxzIGVyYXNlIHRoZW0uXG4gICAgICBpZih0aGlzLmxhYmVscyAmJiB0aGlzLmxhYmVscy5jbGVhckxhYmVscykge1xuICAgICAgICB0aGlzLmxhYmVscy5jbGVhckxhYmVscyh0cnVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ3JhcGggPSB0aGlzLmNvbnN0cnVjdChqc29uKTtcbiAgICAgIGlmKCQudHlwZShqc29uKSAhPSAnYXJyYXknKXtcbiAgICAgICAgdGhpcy5yb290ID0ganNvbi5pZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucm9vdCA9IGpzb25baT8gaSA6IDBdLmlkO1xuICAgICAgfVxuICAgIH0sXG4gICAgXG4gICAgLypcbiAgICAgIE1ldGhvZDogdG9KU09OXG4gICBcbiAgICAgIFJldHVybnMgYSBKU09OIHRyZWUvZ3JhcGggc3RydWN0dXJlIGZyb20gdGhlIHZpc3VhbGl6YXRpb24ncyA8R3JhcGg+LiBcbiAgICAgIFNlZSA8TG9hZGVyLmxvYWRKU09OPiBmb3IgdGhlIGdyYXBoIGZvcm1hdHMgYXZhaWxhYmxlLlxuICAgICAgXG4gICAgICBTZWUgYWxzbzpcbiAgICAgIFxuICAgICAgPExvYWRlci5sb2FkSlNPTj5cbiAgICAgIFxuICAgICAgUGFyYW1ldGVyczpcbiAgICAgIFxuICAgICAgdHlwZSAtIChzdHJpbmcpIERlZmF1bHQncyBcInRyZWVcIi4gVGhlIHR5cGUgb2YgdGhlIEpTT04gc3RydWN0dXJlIHRvIGJlIHJldHVybmVkLiBcbiAgICAgIFBvc3NpYmxlIG9wdGlvbnMgYXJlIFwidHJlZVwiIG9yIFwiZ3JhcGhcIi5cbiAgICAqLyAgICBcbiAgICB0b0pTT046IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgIHR5cGUgPSB0eXBlIHx8IFwidHJlZVwiO1xuICAgICAgaWYodHlwZSA9PSAndHJlZScpIHtcbiAgICAgICAgdmFyIGFucyA9IHt9O1xuICAgICAgICB2YXIgcm9vdE5vZGUgPSB0aGlzLmdyYXBoLmdldE5vZGUodGhpcy5yb290KTtcbiAgICAgICAgdmFyIGFucyA9IChmdW5jdGlvbiByZWNUcmVlKG5vZGUpIHtcbiAgICAgICAgICB2YXIgYW5zID0ge307XG4gICAgICAgICAgYW5zLmlkID0gbm9kZS5pZDtcbiAgICAgICAgICBhbnMubmFtZSA9IG5vZGUubmFtZTtcbiAgICAgICAgICBhbnMuZGF0YSA9IG5vZGUuZGF0YTtcbiAgICAgICAgICB2YXIgY2ggPVtdO1xuICAgICAgICAgIG5vZGUuZWFjaFN1Ym5vZGUoZnVuY3Rpb24obikge1xuICAgICAgICAgICAgY2gucHVzaChyZWNUcmVlKG4pKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBhbnMuY2hpbGRyZW4gPSBjaDtcbiAgICAgICAgICByZXR1cm4gYW5zO1xuICAgICAgICB9KShyb290Tm9kZSk7XG4gICAgICAgIHJldHVybiBhbnM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgYW5zID0gW107XG4gICAgICAgIHZhciBUID0gISF0aGlzLmdyYXBoLmdldE5vZGUodGhpcy5yb290KS52aXNpdGVkO1xuICAgICAgICB0aGlzLmdyYXBoLmVhY2hOb2RlKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICB2YXIgYW5zTm9kZSA9IHt9O1xuICAgICAgICAgIGFuc05vZGUuaWQgPSBub2RlLmlkO1xuICAgICAgICAgIGFuc05vZGUubmFtZSA9IG5vZGUubmFtZTtcbiAgICAgICAgICBhbnNOb2RlLmRhdGEgPSBub2RlLmRhdGE7XG4gICAgICAgICAgdmFyIGFkanMgPSBbXTtcbiAgICAgICAgICBub2RlLmVhY2hBZGphY2VuY3koZnVuY3Rpb24oYWRqKSB7XG4gICAgICAgICAgICB2YXIgbm9kZVRvID0gYWRqLm5vZGVUbztcbiAgICAgICAgICAgIGlmKCEhbm9kZVRvLnZpc2l0ZWQgPT09IFQpIHtcbiAgICAgICAgICAgICAgdmFyIGFuc0FkaiA9IHt9O1xuICAgICAgICAgICAgICBhbnNBZGoubm9kZVRvID0gbm9kZVRvLmlkO1xuICAgICAgICAgICAgICBhbnNBZGouZGF0YSA9IGFkai5kYXRhO1xuICAgICAgICAgICAgICBhZGpzLnB1c2goYW5zQWRqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBhbnNOb2RlLmFkamFjZW5jaWVzID0gYWRqcztcbiAgICAgICAgICBhbnMucHVzaChhbnNOb2RlKTtcbiAgICAgICAgICBub2RlLnZpc2l0ZWQgPSAhVDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhbnM7XG4gICAgICB9XG4gICAgfVxufTtcblxuXG5cbi8qXG4gKiBGaWxlOiBMYXlvdXRzLmpzXG4gKiBcbiAqIEltcGxlbWVudHMgYmFzZSBUcmVlIGFuZCBHcmFwaCBsYXlvdXRzLlxuICpcbiAqIERlc2NyaXB0aW9uOlxuICpcbiAqIEltcGxlbWVudHMgYmFzZSBUcmVlIGFuZCBHcmFwaCBsYXlvdXRzIGxpa2UgUmFkaWFsLCBUcmVlLCBldGMuXG4gKiBcbiAqL1xuXG4vKlxuICogT2JqZWN0OiBMYXlvdXRzXG4gKiBcbiAqIFBhcmVudCBvYmplY3QgZm9yIGNvbW1vbiBsYXlvdXRzLlxuICpcbiAqL1xudmFyIExheW91dHMgPSAkaml0LkxheW91dHMgPSB7fTtcblxuXG4vL1NvbWUgdXRpbCBzaGFyZWQgbGF5b3V0IGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBoZXJlLlxudmFyIE5vZGVEaW0gPSB7XG4gIGxhYmVsOiBudWxsLFxuICBcbiAgY29tcHV0ZTogZnVuY3Rpb24oZ3JhcGgsIHByb3AsIG9wdCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUxhYmVsKG9wdCk7XG4gICAgdmFyIGxhYmVsID0gdGhpcy5sYWJlbCwgc3R5bGUgPSBsYWJlbC5zdHlsZTtcbiAgICBncmFwaC5lYWNoTm9kZShmdW5jdGlvbihuKSB7XG4gICAgICB2YXIgYXV0b1dpZHRoICA9IG4uZ2V0RGF0YSgnYXV0b1dpZHRoJyksXG4gICAgICAgICAgYXV0b0hlaWdodCA9IG4uZ2V0RGF0YSgnYXV0b0hlaWdodCcpO1xuICAgICAgaWYoYXV0b1dpZHRoIHx8IGF1dG9IZWlnaHQpIHtcbiAgICAgICAgLy9kZWxldGUgZGltZW5zaW9ucyBzaW5jZSB0aGVzZSBhcmVcbiAgICAgICAgLy9nb2luZyB0byBiZSBvdmVycmlkZGVuIG5vdy5cbiAgICAgICAgZGVsZXRlIG4uZGF0YS4kd2lkdGg7XG4gICAgICAgIGRlbGV0ZSBuLmRhdGEuJGhlaWdodDtcbiAgICAgICAgZGVsZXRlIG4uZGF0YS4kZGltO1xuICAgICAgICBcbiAgICAgICAgdmFyIHdpZHRoICA9IG4uZ2V0RGF0YSgnd2lkdGgnKSxcbiAgICAgICAgICAgIGhlaWdodCA9IG4uZ2V0RGF0YSgnaGVpZ2h0Jyk7XG4gICAgICAgIC8vcmVzZXQgbGFiZWwgZGltZW5zaW9uc1xuICAgICAgICBzdHlsZS53aWR0aCAgPSBhdXRvV2lkdGg/ICdhdXRvJyA6IHdpZHRoICsgJ3B4JztcbiAgICAgICAgc3R5bGUuaGVpZ2h0ID0gYXV0b0hlaWdodD8gJ2F1dG8nIDogaGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgXG4gICAgICAgIC8vVE9ETyhuaWNvKSBzaG91bGQgbGV0IHRoZSB1c2VyIGNob29zZSB3aGF0IHRvIGluc2VydCBoZXJlLlxuICAgICAgICBsYWJlbC5pbm5lckhUTUwgPSBuLm5hbWU7XG4gICAgICAgIFxuICAgICAgICB2YXIgb2Zmc2V0V2lkdGggID0gbGFiZWwub2Zmc2V0V2lkdGgsXG4gICAgICAgICAgICBvZmZzZXRIZWlnaHQgPSBsYWJlbC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIHZhciB0eXBlID0gbi5nZXREYXRhKCd0eXBlJyk7XG4gICAgICAgIGlmKCQuaW5kZXhPZihbJ2NpcmNsZScsICdzcXVhcmUnLCAndHJpYW5nbGUnLCAnc3RhciddLCB0eXBlKSA9PT0gLTEpIHtcbiAgICAgICAgICBuLnNldERhdGEoJ3dpZHRoJywgb2Zmc2V0V2lkdGgpO1xuICAgICAgICAgIG4uc2V0RGF0YSgnaGVpZ2h0Jywgb2Zmc2V0SGVpZ2h0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgZGltID0gb2Zmc2V0V2lkdGggPiBvZmZzZXRIZWlnaHQ/IG9mZnNldFdpZHRoIDogb2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgIG4uc2V0RGF0YSgnd2lkdGgnLCBkaW0pO1xuICAgICAgICAgIG4uc2V0RGF0YSgnaGVpZ2h0JywgZGltKTtcbiAgICAgICAgICBuLnNldERhdGEoJ2RpbScsIGRpbSk7IFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG4gIFxuICBpbml0aWFsaXplTGFiZWw6IGZ1bmN0aW9uKG9wdCkge1xuICAgIGlmKCF0aGlzLmxhYmVsKSB7XG4gICAgICB0aGlzLmxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMubGFiZWwpO1xuICAgIH1cbiAgICB0aGlzLnNldExhYmVsU3R5bGVzKG9wdCk7XG4gIH0sXG4gIFxuICBzZXRMYWJlbFN0eWxlczogZnVuY3Rpb24ob3B0KSB7XG4gICAgJC5leHRlbmQodGhpcy5sYWJlbC5zdHlsZSwge1xuICAgICAgJ3Zpc2liaWxpdHknOiAnaGlkZGVuJyxcbiAgICAgICdwb3NpdGlvbic6ICdhYnNvbHV0ZScsXG4gICAgICAnd2lkdGgnOiAnYXV0bycsXG4gICAgICAnaGVpZ2h0JzogJ2F1dG8nXG4gICAgfSk7XG4gICAgdGhpcy5sYWJlbC5jbGFzc05hbWUgPSAnaml0LWF1dG9hZGp1c3QtbGFiZWwnO1xuICB9XG59O1xuXG5cbi8qXG4gKiBDbGFzczogTGF5b3V0cy5SYWRpYWxcbiAqIFxuICogSW1wbGVtZW50cyBhIFJhZGlhbCBMYXlvdXQuXG4gKiBcbiAqIEltcGxlbWVudGVkIEJ5OlxuICogXG4gKiA8UkdyYXBoPiwgPEh5cGVydHJlZT5cbiAqIFxuICovXG5MYXlvdXRzLlJhZGlhbCA9IG5ldyBDbGFzcyh7XG5cbiAgLypcbiAgICogTWV0aG9kOiBjb21wdXRlXG4gICAqIFxuICAgKiBDb21wdXRlcyBub2RlcycgcG9zaXRpb25zLlxuICAgKiBcbiAgICogUGFyYW1ldGVyczpcbiAgICogXG4gICAqIHByb3BlcnR5IC0gX29wdGlvbmFsXyBBIDxHcmFwaC5Ob2RlPiBwb3NpdGlvbiBwcm9wZXJ0eSB0byBzdG9yZSB0aGUgbmV3XG4gICAqIHBvc2l0aW9ucy4gUG9zc2libGUgdmFsdWVzIGFyZSAncG9zJywgJ2VuZCcgb3IgJ3N0YXJ0Jy5cbiAgICogXG4gICAqL1xuICBjb21wdXRlIDogZnVuY3Rpb24ocHJvcGVydHkpIHtcbiAgICB2YXIgcHJvcCA9ICQuc3BsYXQocHJvcGVydHkgfHwgWyAnY3VycmVudCcsICdzdGFydCcsICdlbmQnIF0pO1xuICAgIE5vZGVEaW0uY29tcHV0ZSh0aGlzLmdyYXBoLCBwcm9wLCB0aGlzLmNvbmZpZyk7XG4gICAgdGhpcy5ncmFwaC5jb21wdXRlTGV2ZWxzKHRoaXMucm9vdCwgMCwgXCJpZ25vcmVcIik7XG4gICAgdmFyIGxlbmd0aEZ1bmMgPSB0aGlzLmNyZWF0ZUxldmVsRGlzdGFuY2VGdW5jKCk7IFxuICAgIHRoaXMuY29tcHV0ZUFuZ3VsYXJXaWR0aHMocHJvcCk7XG4gICAgdGhpcy5jb21wdXRlUG9zaXRpb25zKHByb3AsIGxlbmd0aEZ1bmMpO1xuICB9LFxuXG4gIC8qXG4gICAqIGNvbXB1dGVQb3NpdGlvbnNcbiAgICogXG4gICAqIFBlcmZvcm1zIHRoZSBtYWluIGFsZ29yaXRobSBmb3IgY29tcHV0aW5nIG5vZGUgcG9zaXRpb25zLlxuICAgKi9cbiAgY29tcHV0ZVBvc2l0aW9ucyA6IGZ1bmN0aW9uKHByb3BlcnR5LCBnZXRMZW5ndGgpIHtcbiAgICB2YXIgcHJvcEFycmF5ID0gcHJvcGVydHk7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcbiAgICB2YXIgcm9vdCA9IGdyYXBoLmdldE5vZGUodGhpcy5yb290KTtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gICAgdmFyIGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuXG4gICAgZm9yICggdmFyIGk9MCwgbD1wcm9wQXJyYXkubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgcGkgPSBwcm9wQXJyYXlbaV07XG4gICAgICByb290LnNldFBvcygkUCgwLCAwKSwgcGkpO1xuICAgICAgcm9vdC5zZXREYXRhKCdzcGFuJywgTWF0aC5QSSAqIDIsIHBpKTtcbiAgICB9XG5cbiAgICByb290LmFuZ2xlU3BhbiA9IHtcbiAgICAgIGJlZ2luIDogMCxcbiAgICAgIGVuZCA6IDIgKiBNYXRoLlBJXG4gICAgfTtcblxuICAgIGdyYXBoLmVhY2hCRlModGhpcy5yb290LCBmdW5jdGlvbihlbGVtKSB7XG4gICAgICB2YXIgYW5nbGVTcGFuID0gZWxlbS5hbmdsZVNwYW4uZW5kIC0gZWxlbS5hbmdsZVNwYW4uYmVnaW47XG4gICAgICB2YXIgYW5nbGVJbml0ID0gZWxlbS5hbmdsZVNwYW4uYmVnaW47XG4gICAgICB2YXIgbGVuID0gZ2V0TGVuZ3RoKGVsZW0pO1xuICAgICAgLy9DYWxjdWxhdGUgdGhlIHN1bSBvZiBhbGwgYW5ndWxhciB3aWR0aHNcbiAgICAgIHZhciB0b3RhbEFuZ3VsYXJXaWR0aHMgPSAwLCBzdWJub2RlcyA9IFtdLCBtYXhEaW0gPSB7fTtcbiAgICAgIGVsZW0uZWFjaFN1Ym5vZGUoZnVuY3Rpb24oc2liKSB7XG4gICAgICAgIHRvdGFsQW5ndWxhcldpZHRocyArPSBzaWIuX3RyZWVBbmd1bGFyV2lkdGg7XG4gICAgICAgIC8vZ2V0IG1heCBkaW1cbiAgICAgICAgZm9yICggdmFyIGk9MCwgbD1wcm9wQXJyYXkubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgdmFyIHBpID0gcHJvcEFycmF5W2ldLCBkaW0gPSBzaWIuZ2V0RGF0YSgnZGltJywgcGkpO1xuICAgICAgICAgIG1heERpbVtwaV0gPSAocGkgaW4gbWF4RGltKT8gKGRpbSA+IG1heERpbVtwaV0/IGRpbSA6IG1heERpbVtwaV0pIDogZGltO1xuICAgICAgICB9XG4gICAgICAgIHN1Ym5vZGVzLnB1c2goc2liKTtcbiAgICAgIH0sIFwiaWdub3JlXCIpO1xuICAgICAgLy9NYWludGFpbiBjaGlsZHJlbiBvcmRlclxuICAgICAgLy9TZWNvbmQgY29uc3RyYWludCBmb3IgPGh0dHA6Ly9iYWlsYW5kby5zaW1zLmJlcmtlbGV5LmVkdS9wYXBlcnMvaW5mb3ZpczAxLmh0bT5cbiAgICAgIGlmIChwYXJlbnQgJiYgcGFyZW50LmlkID09IGVsZW0uaWQgJiYgc3Vibm9kZXMubGVuZ3RoID4gMFxuICAgICAgICAgICYmIHN1Ym5vZGVzWzBdLmRpc3QpIHtcbiAgICAgICAgc3Vibm9kZXMuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgICAgcmV0dXJuIChhLmRpc3QgPj0gYi5kaXN0KSAtIChhLmRpc3QgPD0gYi5kaXN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvL0NhbGN1bGF0ZSBub2RlcyBwb3NpdGlvbnMuXG4gICAgICBmb3IgKHZhciBrID0gMCwgbHM9c3Vibm9kZXMubGVuZ3RoOyBrIDwgbHM7IGsrKykge1xuICAgICAgICB2YXIgY2hpbGQgPSBzdWJub2Rlc1trXTtcbiAgICAgICAgaWYgKCFjaGlsZC5fZmxhZykge1xuICAgICAgICAgIHZhciBhbmdsZVByb3BvcnRpb24gPSBjaGlsZC5fdHJlZUFuZ3VsYXJXaWR0aCAvIHRvdGFsQW5ndWxhcldpZHRocyAqIGFuZ2xlU3BhbjtcbiAgICAgICAgICB2YXIgdGhldGEgPSBhbmdsZUluaXQgKyBhbmdsZVByb3BvcnRpb24gLyAyO1xuXG4gICAgICAgICAgZm9yICggdmFyIGk9MCwgbD1wcm9wQXJyYXkubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcGkgPSBwcm9wQXJyYXlbaV07XG4gICAgICAgICAgICBjaGlsZC5zZXRQb3MoJFAodGhldGEsIGxlbiksIHBpKTtcbiAgICAgICAgICAgIGNoaWxkLnNldERhdGEoJ3NwYW4nLCBhbmdsZVByb3BvcnRpb24sIHBpKTtcbiAgICAgICAgICAgIGNoaWxkLnNldERhdGEoJ2RpbS1xdW90aWVudCcsIGNoaWxkLmdldERhdGEoJ2RpbScsIHBpKSAvIG1heERpbVtwaV0sIHBpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjaGlsZC5hbmdsZVNwYW4gPSB7XG4gICAgICAgICAgICBiZWdpbiA6IGFuZ2xlSW5pdCxcbiAgICAgICAgICAgIGVuZCA6IGFuZ2xlSW5pdCArIGFuZ2xlUHJvcG9ydGlvblxuICAgICAgICAgIH07XG4gICAgICAgICAgYW5nbGVJbml0ICs9IGFuZ2xlUHJvcG9ydGlvbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIFwiaWdub3JlXCIpO1xuICB9LFxuXG4gIC8qXG4gICAqIE1ldGhvZDogc2V0QW5ndWxhcldpZHRoRm9yTm9kZXNcbiAgICogXG4gICAqIFNldHMgbm9kZXMgYW5ndWxhciB3aWR0aHMuXG4gICAqL1xuICBzZXRBbmd1bGFyV2lkdGhGb3JOb2RlcyA6IGZ1bmN0aW9uKHByb3ApIHtcbiAgICB0aGlzLmdyYXBoLmVhY2hCRlModGhpcy5yb290LCBmdW5jdGlvbihlbGVtLCBpKSB7XG4gICAgICB2YXIgZGlhbVZhbHVlID0gZWxlbS5nZXREYXRhKCdhbmd1bGFyV2lkdGgnLCBwcm9wWzBdKSB8fCA1O1xuICAgICAgZWxlbS5fYW5ndWxhcldpZHRoID0gZGlhbVZhbHVlIC8gaTtcbiAgICB9LCBcImlnbm9yZVwiKTtcbiAgfSxcblxuICAvKlxuICAgKiBNZXRob2Q6IHNldFN1YnRyZWVzQW5ndWxhcldpZHRoXG4gICAqIFxuICAgKiBTZXRzIHN1YnRyZWVzIGFuZ3VsYXIgd2lkdGhzLlxuICAgKi9cbiAgc2V0U3VidHJlZXNBbmd1bGFyV2lkdGggOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgdGhpcy5ncmFwaC5lYWNoTm9kZShmdW5jdGlvbihlbGVtKSB7XG4gICAgICB0aGF0LnNldFN1YnRyZWVBbmd1bGFyV2lkdGgoZWxlbSk7XG4gICAgfSwgXCJpZ25vcmVcIik7XG4gIH0sXG5cbiAgLypcbiAgICogTWV0aG9kOiBzZXRTdWJ0cmVlQW5ndWxhcldpZHRoXG4gICAqIFxuICAgKiBTZXRzIHRoZSBhbmd1bGFyIHdpZHRoIGZvciBhIHN1YnRyZWUuXG4gICAqL1xuICBzZXRTdWJ0cmVlQW5ndWxhcldpZHRoIDogZnVuY3Rpb24oZWxlbSkge1xuICAgIHZhciB0aGF0ID0gdGhpcywgbm9kZUFXID0gZWxlbS5fYW5ndWxhcldpZHRoLCBzdW1BVyA9IDA7XG4gICAgZWxlbS5lYWNoU3Vibm9kZShmdW5jdGlvbihjaGlsZCkge1xuICAgICAgdGhhdC5zZXRTdWJ0cmVlQW5ndWxhcldpZHRoKGNoaWxkKTtcbiAgICAgIHN1bUFXICs9IGNoaWxkLl90cmVlQW5ndWxhcldpZHRoO1xuICAgIH0sIFwiaWdub3JlXCIpO1xuICAgIGVsZW0uX3RyZWVBbmd1bGFyV2lkdGggPSBNYXRoLm1heChub2RlQVcsIHN1bUFXKTtcbiAgfSxcblxuICAvKlxuICAgKiBNZXRob2Q6IGNvbXB1dGVBbmd1bGFyV2lkdGhzXG4gICAqIFxuICAgKiBDb21wdXRlcyBub2RlcyBhbmQgc3VidHJlZXMgYW5ndWxhciB3aWR0aHMuXG4gICAqL1xuICBjb21wdXRlQW5ndWxhcldpZHRocyA6IGZ1bmN0aW9uKHByb3ApIHtcbiAgICB0aGlzLnNldEFuZ3VsYXJXaWR0aEZvck5vZGVzKHByb3ApO1xuICAgIHRoaXMuc2V0U3VidHJlZXNBbmd1bGFyV2lkdGgoKTtcbiAgfVxuXG59KTtcblxuXG4vKlxuICogRmlsZTogUkdyYXBoLmpzXG4gKlxuICovXG5cbi8qXG4gICBDbGFzczogUkdyYXBoXG4gICBcbiAgIEEgcmFkaWFsIGdyYXBoIHZpc3VhbGl6YXRpb24gd2l0aCBhZHZhbmNlZCBhbmltYXRpb25zLlxuICAgXG4gICBJbnNwaXJlZCBieTpcbiBcbiAgIEFuaW1hdGVkIEV4cGxvcmF0aW9uIG9mIER5bmFtaWMgR3JhcGhzIHdpdGggUmFkaWFsIExheW91dCAoS2EtUGluZyBZZWUsIERhbnllbCBGaXNoZXIsIFJhY2huYSBEaGFtaWphLCBNYXJ0aSBIZWFyc3QpIDxodHRwOi8vYmFpbGFuZG8uc2ltcy5iZXJrZWxleS5lZHUvcGFwZXJzL2luZm92aXMwMS5odG0+XG4gICBcbiAgIE5vdGU6XG4gICBcbiAgIFRoaXMgdmlzdWFsaXphdGlvbiB3YXMgYnVpbHQgYW5kIGVuZ2luZWVyZWQgZnJvbSBzY3JhdGNoLCB0YWtpbmcgb25seSB0aGUgcGFwZXIgYXMgaW5zcGlyYXRpb24sIGFuZCBvbmx5IHNoYXJlcyBzb21lIGZlYXR1cmVzIHdpdGggdGhlIHZpc3VhbGl6YXRpb24gZGVzY3JpYmVkIGluIHRoZSBwYXBlci5cbiAgIFxuICBJbXBsZW1lbnRzOlxuICBcbiAgQWxsIDxMb2FkZXI+IG1ldGhvZHNcbiAgXG4gICBDb25zdHJ1Y3RvciBPcHRpb25zOlxuICAgXG4gICBJbmhlcml0cyBvcHRpb25zIGZyb21cbiAgIFxuICAgLSA8T3B0aW9ucy5DYW52YXM+XG4gICAtIDxPcHRpb25zLkNvbnRyb2xsZXI+XG4gICAtIDxPcHRpb25zLk5vZGU+XG4gICAtIDxPcHRpb25zLkVkZ2U+XG4gICAtIDxPcHRpb25zLkxhYmVsPlxuICAgLSA8T3B0aW9ucy5FdmVudHM+XG4gICAtIDxPcHRpb25zLlRpcHM+XG4gICAtIDxPcHRpb25zLk5vZGVTdHlsZXM+XG4gICAtIDxPcHRpb25zLk5hdmlnYXRpb24+XG4gICBcbiAgIEFkZGl0aW9uYWxseSwgdGhlcmUgYXJlIG90aGVyIHBhcmFtZXRlcnMgYW5kIHNvbWUgZGVmYXVsdCB2YWx1ZXMgY2hhbmdlZFxuICAgXG4gICBpbnRlcnBvbGF0aW9uIC0gKHN0cmluZykgRGVmYXVsdCdzICpsaW5lYXIqLiBEZXNjcmliZXMgdGhlIHdheSBub2RlcyBhcmUgaW50ZXJwb2xhdGVkLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICdsaW5lYXInIGFuZCAncG9sYXInLlxuICAgbGV2ZWxEaXN0YW5jZSAtIChudW1iZXIpIERlZmF1bHQncyAqMTAwKi4gVGhlIGRpc3RhbmNlIGJldHdlZW4gbGV2ZWxzIG9mIHRoZSB0cmVlLiBcbiAgICAgXG4gICBJbnN0YW5jZSBQcm9wZXJ0aWVzOlxuXG4gICBjYW52YXMgLSBBY2Nlc3MgYSA8Q2FudmFzPiBpbnN0YW5jZS5cbiAgIGdyYXBoIC0gQWNjZXNzIGEgPEdyYXBoPiBpbnN0YW5jZS5cbiAgIG9wIC0gQWNjZXNzIGEgPFJHcmFwaC5PcD4gaW5zdGFuY2UuXG4gICBmeCAtIEFjY2VzcyBhIDxSR3JhcGguUGxvdD4gaW5zdGFuY2UuXG4gICBsYWJlbHMgLSBBY2Nlc3MgYSA8UkdyYXBoLkxhYmVsPiBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24uICAgXG4qL1xuXG4kaml0LlJHcmFwaCA9IG5ldyBDbGFzcygge1xuXG4gIEltcGxlbWVudHM6IFtcbiAgICAgIExvYWRlciwgRXh0cmFzLCBMYXlvdXRzLlJhZGlhbFxuICBdLFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uKGNvbnRyb2xsZXIpe1xuICAgIHZhciAkUkdyYXBoID0gJGppdC5SR3JhcGg7XG5cbiAgICB2YXIgY29uZmlnID0ge1xuICAgICAgaW50ZXJwb2xhdGlvbjogJ2xpbmVhcicsXG4gICAgICBsZXZlbERpc3RhbmNlOiAxMDBcbiAgICB9O1xuXG4gICAgdGhpcy5jb250cm9sbGVyID0gdGhpcy5jb25maWcgPSAkLm1lcmdlKE9wdGlvbnMoXCJDYW52YXNcIiwgXCJOb2RlXCIsIFwiRWRnZVwiLFxuICAgICAgICBcIkZ4XCIsIFwiQ29udHJvbGxlclwiLCBcIlRpcHNcIiwgXCJOb2RlU3R5bGVzXCIsIFwiRXZlbnRzXCIsIFwiTmF2aWdhdGlvblwiLCBcIkxhYmVsXCIpLCBjb25maWcsIGNvbnRyb2xsZXIpO1xuXG4gICAgdmFyIGNhbnZhc0NvbmZpZyA9IHRoaXMuY29uZmlnO1xuICAgIGlmKGNhbnZhc0NvbmZpZy51c2VDYW52YXMpIHtcbiAgICAgIHRoaXMuY2FudmFzID0gY2FudmFzQ29uZmlnLnVzZUNhbnZhcztcbiAgICAgIHRoaXMuY29uZmlnLmxhYmVsQ29udGFpbmVyID0gdGhpcy5jYW52YXMuaWQgKyAnLWxhYmVsJztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYoY2FudmFzQ29uZmlnLmJhY2tncm91bmQpIHtcbiAgICAgICAgY2FudmFzQ29uZmlnLmJhY2tncm91bmQgPSAkLm1lcmdlKHtcbiAgICAgICAgICB0eXBlOiAnQ2lyY2xlcydcbiAgICAgICAgfSwgY2FudmFzQ29uZmlnLmJhY2tncm91bmQpO1xuICAgICAgfVxuICAgICAgdGhpcy5jYW52YXMgPSBuZXcgQ2FudmFzKHRoaXMsIGNhbnZhc0NvbmZpZyk7XG4gICAgICB0aGlzLmNvbmZpZy5sYWJlbENvbnRhaW5lciA9ICh0eXBlb2YgY2FudmFzQ29uZmlnLmluamVjdEludG8gPT0gJ3N0cmluZyc/IGNhbnZhc0NvbmZpZy5pbmplY3RJbnRvIDogY2FudmFzQ29uZmlnLmluamVjdEludG8uaWQpICsgJy1sYWJlbCc7XG4gICAgfVxuXG4gICAgdGhpcy5ncmFwaE9wdGlvbnMgPSB7XG4gICAgICAna2xhc3MnOiBQb2xhcixcbiAgICAgICdOb2RlJzoge1xuICAgICAgICAnc2VsZWN0ZWQnOiBmYWxzZSxcbiAgICAgICAgJ2V4aXN0JzogdHJ1ZSxcbiAgICAgICAgJ2RyYXduJzogdHJ1ZVxuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5ncmFwaCA9IG5ldyBHcmFwaCh0aGlzLmdyYXBoT3B0aW9ucywgdGhpcy5jb25maWcuTm9kZSxcbiAgICAgICAgdGhpcy5jb25maWcuRWRnZSk7XG4gICAgdGhpcy5sYWJlbHMgPSBuZXcgJFJHcmFwaC5MYWJlbFtjYW52YXNDb25maWcuTGFiZWwudHlwZV0odGhpcyk7XG4gICAgdGhpcy5meCA9IG5ldyAkUkdyYXBoLlBsb3QodGhpcywgJFJHcmFwaCk7XG4gICAgdGhpcy5vcCA9IG5ldyAkUkdyYXBoLk9wKHRoaXMpO1xuICAgIHRoaXMuanNvbiA9IG51bGw7XG4gICAgdGhpcy5yb290ID0gbnVsbDtcbiAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgICB0aGlzLnBhcmVudCA9IGZhbHNlO1xuICAgIC8vIGluaXRpYWxpemUgZXh0cmFzXG4gICAgdGhpcy5pbml0aWFsaXplRXh0cmFzKCk7XG4gIH0sXG5cbiAgLyogXG4gIFxuICAgIGNyZWF0ZUxldmVsRGlzdGFuY2VGdW5jIFxuICBcbiAgICBSZXR1cm5zIHRoZSBsZXZlbERpc3RhbmNlIGZ1bmN0aW9uIHVzZWQgZm9yIGNhbGN1bGF0aW5nIGEgbm9kZSBkaXN0YW5jZSBcbiAgICB0byBpdHMgb3JpZ2luLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGlzIGNvbXB1dGVkIFxuICAgIHBlciBsZXZlbCBhbmQgbm90IHBlciBub2RlLCBzdWNoIHRoYXQgYWxsIG5vZGVzIHdpdGggdGhlIHNhbWUgZGVwdGggd2lsbCBoYXZlIHRoZSBcbiAgICBzYW1lIGRpc3RhbmNlIHRvIHRoZSBvcmlnaW4uIFRoZSByZXN1bHRpbmcgZnVuY3Rpb24gZ2V0cyB0aGUgXG4gICAgcGFyZW50IG5vZGUgYXMgcGFyYW1ldGVyIGFuZCByZXR1cm5zIGEgZmxvYXQuXG5cbiAgICovXG4gIGNyZWF0ZUxldmVsRGlzdGFuY2VGdW5jOiBmdW5jdGlvbigpe1xuICAgIHZhciBsZCA9IHRoaXMuY29uZmlnLmxldmVsRGlzdGFuY2U7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGVsZW0pe1xuICAgICAgcmV0dXJuIChlbGVtLl9kZXB0aCArIDEpICogbGQ7XG4gICAgfTtcbiAgfSxcblxuICAvKiBcbiAgICAgTWV0aG9kOiByZWZyZXNoIFxuICAgICBcbiAgICAgQ29tcHV0ZXMgcG9zaXRpb25zIGFuZCBwbG90cyB0aGUgdHJlZS5cblxuICAgKi9cbiAgcmVmcmVzaDogZnVuY3Rpb24oKXtcbiAgICBcbiAgICAvLyBTVEFSVCBNRVRBTUFQUyBDT0RFXG4gICAgLy8gdGhpcy5jb21wdXRlKCk7XG4gICAgLy8gRU5EIE1FVEFNQVBTIENPREVcbiAgICAvLyBPUklHSU5BTCBDT0RFOiB0aGlzLmNvbXB1dGUoKTtcbiAgICB0aGlzLnBsb3QoKTtcbiAgfSxcblxuICByZXBvc2l0aW9uOiBmdW5jdGlvbigpe1xuICAgIHRoaXMuY29tcHV0ZSgnZW5kJyk7XG4gIH0sXG5cbiAgLypcbiAgIE1ldGhvZDogcGxvdFxuICBcbiAgIFBsb3RzIHRoZSBSR3JhcGguIFRoaXMgaXMgYSBzaG9ydGN1dCB0byAqZngucGxvdCouXG4gICovXG4gIHBsb3Q6IGZ1bmN0aW9uKCl7XG4gICAgdGhpcy5meC5wbG90KCk7XG4gIH0sXG4gIC8qXG4gICBnZXROb2RlQW5kUGFyZW50QW5nbGVcbiAgXG4gICBSZXR1cm5zIHRoZSBfcGFyZW50XyBvZiB0aGUgZ2l2ZW4gbm9kZSwgYWxzbyBjYWxjdWxhdGluZyBpdHMgYW5nbGUgc3Bhbi5cbiAgKi9cbiAgZ2V0Tm9kZUFuZFBhcmVudEFuZ2xlOiBmdW5jdGlvbihpZCl7XG4gICAgdmFyIHRoZXRhID0gZmFsc2U7XG4gICAgdmFyIG4gPSB0aGlzLmdyYXBoLmdldE5vZGUoaWQpO1xuICAgIHZhciBwcyA9IG4uZ2V0UGFyZW50cygpO1xuICAgIHZhciBwID0gKHBzLmxlbmd0aCA+IDApPyBwc1swXSA6IGZhbHNlO1xuICAgIGlmIChwKSB7XG4gICAgICB2YXIgcG9zUGFyZW50ID0gcC5wb3MuZ2V0YygpLCBwb3NDaGlsZCA9IG4ucG9zLmdldGMoKTtcbiAgICAgIHZhciBuZXdQb3MgPSBwb3NQYXJlbnQuYWRkKHBvc0NoaWxkLnNjYWxlKC0xKSk7XG4gICAgICB0aGV0YSA9IE1hdGguYXRhbjIobmV3UG9zLnksIG5ld1Bvcy54KTtcbiAgICAgIGlmICh0aGV0YSA8IDApXG4gICAgICAgIHRoZXRhICs9IDIgKiBNYXRoLlBJO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcGFyZW50OiBwLFxuICAgICAgdGhldGE6IHRoZXRhXG4gICAgfTtcbiAgfSxcbiAgLypcbiAgIHRhZ0NoaWxkcmVuXG4gIFxuICAgRW51bWVyYXRlcyB0aGUgY2hpbGRyZW4gaW4gb3JkZXIgdG8gbWFpbnRhaW4gY2hpbGQgb3JkZXJpbmcgKHNlY29uZCBjb25zdHJhaW50IG9mIHRoZSBwYXBlcikuXG4gICovXG4gIHRhZ0NoaWxkcmVuOiBmdW5jdGlvbihwYXIsIGlkKXtcbiAgICBpZiAocGFyLmFuZ2xlU3Bhbikge1xuICAgICAgdmFyIGFkanMgPSBbXTtcbiAgICAgIHBhci5lYWNoQWRqYWNlbmN5KGZ1bmN0aW9uKGVsZW0pe1xuICAgICAgICBhZGpzLnB1c2goZWxlbS5ub2RlVG8pO1xuICAgICAgfSwgXCJpZ25vcmVcIik7XG4gICAgICB2YXIgbGVuID0gYWRqcy5sZW5ndGg7XG4gICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW4gJiYgaWQgIT0gYWRqc1tpXS5pZDsgaSsrKVxuICAgICAgICA7XG4gICAgICBmb3IgKCB2YXIgaiA9IChpICsgMSkgJSBsZW4sIGsgPSAwOyBpZCAhPSBhZGpzW2pdLmlkOyBqID0gKGogKyAxKSAlIGxlbikge1xuICAgICAgICBhZGpzW2pdLmRpc3QgPSBrKys7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICAvKiBcbiAgTWV0aG9kOiBvbkNsaWNrIFxuICBcbiAgQW5pbWF0ZXMgdGhlIDxSR3JhcGg+IHRvIGNlbnRlciB0aGUgbm9kZSBzcGVjaWZpZWQgYnkgKmlkKi5cblxuICAgUGFyYW1ldGVyczpcblxuICAgaWQgLSBBIDxHcmFwaC5Ob2RlPiBpZC5cbiAgIG9wdCAtIChvcHRpb25hbHxvYmplY3QpIEFuIG9iamVjdCBjb250YWluaW5nIHNvbWUgZXh0cmEgcHJvcGVydGllcyBkZXNjcmliZWQgYmVsb3dcbiAgIGhpZGVMYWJlbHMgLSAoYm9vbGVhbikgRGVmYXVsdCdzICp0cnVlKi4gSGlkZSBsYWJlbHMgd2hlbiBwZXJmb3JtaW5nIHRoZSBhbmltYXRpb24uXG5cbiAgIEV4YW1wbGU6XG5cbiAgIChzdGFydCBjb2RlIGpzKVxuICAgICByZ3JhcGgub25DbGljaygnc29tZWlkJyk7XG4gICAgIC8vb3IgYWxzby4uLlxuICAgICByZ3JhcGgub25DbGljaygnc29tZWlkJywge1xuICAgICAgaGlkZUxhYmVsczogZmFsc2VcbiAgICAgfSk7XG4gICAgKGVuZCBjb2RlKVxuICAgIFxuICAqL1xuICBvbkNsaWNrOiBmdW5jdGlvbihpZCwgb3B0KXtcbiAgICBpZiAodGhpcy5yb290ICE9IGlkICYmICF0aGlzLmJ1c3kpIHtcbiAgICAgIHRoaXMuYnVzeSA9IHRydWU7XG4gICAgICB0aGlzLnJvb3QgPSBpZDtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHRoaXMuY29udHJvbGxlci5vbkJlZm9yZUNvbXB1dGUodGhpcy5ncmFwaC5nZXROb2RlKGlkKSk7XG4gICAgICB2YXIgb2JqID0gdGhpcy5nZXROb2RlQW5kUGFyZW50QW5nbGUoaWQpO1xuXG4gICAgICAvLyBzZWNvbmQgY29uc3RyYWludFxuICAgICAgdGhpcy50YWdDaGlsZHJlbihvYmoucGFyZW50LCBpZCk7XG4gICAgICB0aGlzLnBhcmVudCA9IG9iai5wYXJlbnQ7XG4gICAgICB0aGlzLmNvbXB1dGUoJ2VuZCcpO1xuXG4gICAgICAvLyBmaXJzdCBjb25zdHJhaW50XG4gICAgICB2YXIgdGhldGFEaWZmID0gb2JqLnRoZXRhIC0gb2JqLnBhcmVudC5lbmRQb3MudGhldGE7XG4gICAgICB0aGlzLmdyYXBoLmVhY2hOb2RlKGZ1bmN0aW9uKGVsZW0pe1xuICAgICAgICBlbGVtLmVuZFBvcy5zZXQoZWxlbS5lbmRQb3MuZ2V0cCgpLmFkZCgkUCh0aGV0YURpZmYsIDApKSk7XG4gICAgICB9KTtcblxuICAgICAgdmFyIG1vZGUgPSB0aGlzLmNvbmZpZy5pbnRlcnBvbGF0aW9uO1xuICAgICAgb3B0ID0gJC5tZXJnZSgge1xuICAgICAgICBvbkNvbXBsZXRlOiAkLmVtcHR5XG4gICAgICB9LCBvcHQgfHwge30pO1xuXG4gICAgICB0aGlzLmZ4LmFuaW1hdGUoJC5tZXJnZSgge1xuICAgICAgICBoaWRlTGFiZWxzOiB0cnVlLFxuICAgICAgICBtb2RlczogW1xuICAgICAgICAgIG1vZGVcbiAgICAgICAgXVxuICAgICAgfSwgb3B0LCB7XG4gICAgICAgIG9uQ29tcGxldGU6IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgdGhhdC5idXN5ID0gZmFsc2U7XG4gICAgICAgICAgb3B0Lm9uQ29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgIH1cbiAgfVxufSk7XG5cbiRqaXQuUkdyYXBoLiRleHRlbmQgPSB0cnVlO1xuXG4oZnVuY3Rpb24oUkdyYXBoKXtcblxuICAvKlxuICAgICBDbGFzczogUkdyYXBoLk9wXG4gICAgIFxuICAgICBDdXN0b20gZXh0ZW5zaW9uIG9mIDxHcmFwaC5PcD4uXG5cbiAgICAgRXh0ZW5kczpcblxuICAgICBBbGwgPEdyYXBoLk9wPiBtZXRob2RzXG4gICAgIFxuICAgICBTZWUgYWxzbzpcbiAgICAgXG4gICAgIDxHcmFwaC5PcD5cblxuICAqL1xuICBSR3JhcGguT3AgPSBuZXcgQ2xhc3MoIHtcblxuICAgIEltcGxlbWVudHM6IEdyYXBoLk9wXG5cbiAgfSk7XG5cbiAgLypcbiAgICAgQ2xhc3M6IFJHcmFwaC5QbG90XG4gICAgXG4gICAgQ3VzdG9tIGV4dGVuc2lvbiBvZiA8R3JhcGguUGxvdD4uXG4gIFxuICAgIEV4dGVuZHM6XG4gIFxuICAgIEFsbCA8R3JhcGguUGxvdD4gbWV0aG9kc1xuICAgIFxuICAgIFNlZSBhbHNvOlxuICAgIFxuICAgIDxHcmFwaC5QbG90PlxuICBcbiAgKi9cbiAgUkdyYXBoLlBsb3QgPSBuZXcgQ2xhc3MoIHtcblxuICAgIEltcGxlbWVudHM6IEdyYXBoLlBsb3RcblxuICB9KTtcblxuICAvKlxuICAgIE9iamVjdDogUkdyYXBoLkxhYmVsXG5cbiAgICBDdXN0b20gZXh0ZW5zaW9uIG9mIDxHcmFwaC5MYWJlbD4uIFxuICAgIENvbnRhaW5zIGN1c3RvbSA8R3JhcGguTGFiZWwuU1ZHPiwgPEdyYXBoLkxhYmVsLkhUTUw+IGFuZCA8R3JhcGguTGFiZWwuTmF0aXZlPiBleHRlbnNpb25zLlxuICBcbiAgICBFeHRlbmRzOlxuICBcbiAgICBBbGwgPEdyYXBoLkxhYmVsPiBtZXRob2RzIGFuZCBzdWJjbGFzc2VzLlxuICBcbiAgICBTZWUgYWxzbzpcbiAgXG4gICAgPEdyYXBoLkxhYmVsPiwgPEdyYXBoLkxhYmVsLk5hdGl2ZT4sIDxHcmFwaC5MYWJlbC5IVE1MPiwgPEdyYXBoLkxhYmVsLlNWRz4uXG4gIFxuICAgKi9cbiAgUkdyYXBoLkxhYmVsID0ge307XG5cbiAgLypcbiAgICAgUkdyYXBoLkxhYmVsLk5hdGl2ZVxuXG4gICAgIEN1c3RvbSBleHRlbnNpb24gb2YgPEdyYXBoLkxhYmVsLk5hdGl2ZT4uXG5cbiAgICAgRXh0ZW5kczpcblxuICAgICBBbGwgPEdyYXBoLkxhYmVsLk5hdGl2ZT4gbWV0aG9kc1xuXG4gICAgIFNlZSBhbHNvOlxuXG4gICAgIDxHcmFwaC5MYWJlbC5OYXRpdmU+XG5cbiAgKi9cbiAgUkdyYXBoLkxhYmVsLk5hdGl2ZSA9IG5ldyBDbGFzcygge1xuICAgIEltcGxlbWVudHM6IEdyYXBoLkxhYmVsLk5hdGl2ZVxuICB9KTtcblxuICAvKlxuICAgICBSR3JhcGguTGFiZWwuU1ZHXG4gICAgXG4gICAgQ3VzdG9tIGV4dGVuc2lvbiBvZiA8R3JhcGguTGFiZWwuU1ZHPi5cbiAgXG4gICAgRXh0ZW5kczpcbiAgXG4gICAgQWxsIDxHcmFwaC5MYWJlbC5TVkc+IG1ldGhvZHNcbiAgXG4gICAgU2VlIGFsc286XG4gIFxuICAgIDxHcmFwaC5MYWJlbC5TVkc+XG4gIFxuICAqL1xuICBSR3JhcGguTGFiZWwuU1ZHID0gbmV3IENsYXNzKCB7XG4gICAgSW1wbGVtZW50czogR3JhcGguTGFiZWwuU1ZHLFxuXG4gICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24odml6KXtcbiAgICAgIHRoaXMudml6ID0gdml6O1xuICAgIH0sXG5cbiAgICAvKiBcbiAgICAgICBwbGFjZUxhYmVsXG5cbiAgICAgICBPdmVycmlkZXMgYWJzdHJhY3QgbWV0aG9kIHBsYWNlTGFiZWwgaW4gPEdyYXBoLlBsb3Q+LlxuXG4gICAgICAgUGFyYW1ldGVyczpcblxuICAgICAgIHRhZyAtIEEgRE9NIGxhYmVsIGVsZW1lbnQuXG4gICAgICAgbm9kZSAtIEEgPEdyYXBoLk5vZGU+LlxuICAgICAgIGNvbnRyb2xsZXIgLSBBIGNvbmZpZ3VyYXRpb24vY29udHJvbGxlciBvYmplY3QgcGFzc2VkIHRvIHRoZSB2aXN1YWxpemF0aW9uLlxuICAgICAgXG4gICAgICovXG4gICAgcGxhY2VMYWJlbDogZnVuY3Rpb24odGFnLCBub2RlLCBjb250cm9sbGVyKXtcbiAgICAgIHZhciBwb3MgPSBub2RlLnBvcy5nZXRjKHRydWUpLCBcbiAgICAgICAgICBjYW52YXMgPSB0aGlzLnZpei5jYW52YXMsXG4gICAgICAgICAgb3ggPSBjYW52YXMudHJhbnNsYXRlT2Zmc2V0WCxcbiAgICAgICAgICBveSA9IGNhbnZhcy50cmFuc2xhdGVPZmZzZXRZLFxuICAgICAgICAgIHN4ID0gY2FudmFzLnNjYWxlT2Zmc2V0WCxcbiAgICAgICAgICBzeSA9IGNhbnZhcy5zY2FsZU9mZnNldFksXG4gICAgICAgICAgcmFkaXVzID0gY2FudmFzLmdldFNpemUoKTtcbiAgICAgIHZhciBsYWJlbFBvcyA9IHtcbiAgICAgICAgeDogTWF0aC5yb3VuZChwb3MueCAqIHN4ICsgb3ggKyByYWRpdXMud2lkdGggLyAyKSxcbiAgICAgICAgeTogTWF0aC5yb3VuZChwb3MueSAqIHN5ICsgb3kgKyByYWRpdXMuaGVpZ2h0IC8gMilcbiAgICAgIH07XG4gICAgICB0YWcuc2V0QXR0cmlidXRlKCd4JywgbGFiZWxQb3MueCk7XG4gICAgICB0YWcuc2V0QXR0cmlidXRlKCd5JywgbGFiZWxQb3MueSk7XG5cbiAgICAgIGNvbnRyb2xsZXIub25QbGFjZUxhYmVsKHRhZywgbm9kZSk7XG4gICAgfVxuICB9KTtcblxuICAvKlxuICAgICBSR3JhcGguTGFiZWwuSFRNTFxuXG4gICAgIEN1c3RvbSBleHRlbnNpb24gb2YgPEdyYXBoLkxhYmVsLkhUTUw+LlxuXG4gICAgIEV4dGVuZHM6XG5cbiAgICAgQWxsIDxHcmFwaC5MYWJlbC5IVE1MPiBtZXRob2RzLlxuXG4gICAgIFNlZSBhbHNvOlxuXG4gICAgIDxHcmFwaC5MYWJlbC5IVE1MPlxuXG4gICovXG4gIFJHcmFwaC5MYWJlbC5IVE1MID0gbmV3IENsYXNzKCB7XG4gICAgSW1wbGVtZW50czogR3JhcGguTGFiZWwuSFRNTCxcblxuICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKHZpeil7XG4gICAgICB0aGlzLnZpeiA9IHZpejtcbiAgICB9LFxuICAgIC8qIFxuICAgICAgIHBsYWNlTGFiZWxcblxuICAgICAgIE92ZXJyaWRlcyBhYnN0cmFjdCBtZXRob2QgcGxhY2VMYWJlbCBpbiA8R3JhcGguUGxvdD4uXG5cbiAgICAgICBQYXJhbWV0ZXJzOlxuXG4gICAgICAgdGFnIC0gQSBET00gbGFiZWwgZWxlbWVudC5cbiAgICAgICBub2RlIC0gQSA8R3JhcGguTm9kZT4uXG4gICAgICAgY29udHJvbGxlciAtIEEgY29uZmlndXJhdGlvbi9jb250cm9sbGVyIG9iamVjdCBwYXNzZWQgdG8gdGhlIHZpc3VhbGl6YXRpb24uXG4gICAgICBcbiAgICAgKi9cbiAgICBwbGFjZUxhYmVsOiBmdW5jdGlvbih0YWcsIG5vZGUsIGNvbnRyb2xsZXIpe1xuICAgICAgdmFyIHBvcyA9IG5vZGUucG9zLmdldGModHJ1ZSksIFxuICAgICAgICAgIGNhbnZhcyA9IHRoaXMudml6LmNhbnZhcyxcbiAgICAgICAgICBveCA9IGNhbnZhcy50cmFuc2xhdGVPZmZzZXRYLFxuICAgICAgICAgIG95ID0gY2FudmFzLnRyYW5zbGF0ZU9mZnNldFksXG4gICAgICAgICAgc3ggPSBjYW52YXMuc2NhbGVPZmZzZXRYLFxuICAgICAgICAgIHN5ID0gY2FudmFzLnNjYWxlT2Zmc2V0WSxcbiAgICAgICAgICByYWRpdXMgPSBjYW52YXMuZ2V0U2l6ZSgpO1xuICAgICAgdmFyIGxhYmVsUG9zID0ge1xuICAgICAgICB4OiBNYXRoLnJvdW5kKHBvcy54ICogc3ggKyBveCArIHJhZGl1cy53aWR0aCAvIDIpLFxuICAgICAgICB5OiBNYXRoLnJvdW5kKHBvcy55ICogc3kgKyBveSArIHJhZGl1cy5oZWlnaHQgLyAyKVxuICAgICAgfTtcblxuICAgICAgdmFyIHN0eWxlID0gdGFnLnN0eWxlO1xuICAgICAgc3R5bGUubGVmdCA9IGxhYmVsUG9zLnggKyAncHgnO1xuICAgICAgc3R5bGUudG9wID0gbGFiZWxQb3MueSArICdweCc7XG4gICAgICBzdHlsZS5kaXNwbGF5ID0gdGhpcy5maXRzSW5DYW52YXMobGFiZWxQb3MsIGNhbnZhcyk/ICcnIDogJ25vbmUnO1xuXG4gICAgICBjb250cm9sbGVyLm9uUGxhY2VMYWJlbCh0YWcsIG5vZGUpO1xuICAgIH1cbiAgfSk7XG5cbiAgLypcbiAgICBDbGFzczogUkdyYXBoLlBsb3QuTm9kZVR5cGVzXG5cbiAgICBUaGlzIGNsYXNzIGNvbnRhaW5zIGEgbGlzdCBvZiA8R3JhcGguTm9kZT4gYnVpbHQtaW4gdHlwZXMuIFxuICAgIE5vZGUgdHlwZXMgaW1wbGVtZW50ZWQgYXJlICdub25lJywgJ2NpcmNsZScsICd0cmlhbmdsZScsICdyZWN0YW5nbGUnLCAnc3RhcicsICdlbGxpcHNlJyBhbmQgJ3NxdWFyZScuXG5cbiAgICBZb3UgY2FuIGFkZCB5b3VyIGN1c3RvbSBub2RlIHR5cGVzLCBjdXN0b21pemluZyB5b3VyIHZpc3VhbGl6YXRpb24gdG8gdGhlIGV4dHJlbWUuXG5cbiAgICBFeGFtcGxlOlxuXG4gICAgKHN0YXJ0IGNvZGUganMpXG4gICAgICBSR3JhcGguUGxvdC5Ob2RlVHlwZXMuaW1wbGVtZW50KHtcbiAgICAgICAgJ215U3BlY2lhbFR5cGUnOiB7XG4gICAgICAgICAgJ3JlbmRlcic6IGZ1bmN0aW9uKG5vZGUsIGNhbnZhcykge1xuICAgICAgICAgICAgLy9wcmludCB5b3VyIGN1c3RvbSBub2RlIHRvIGNhbnZhc1xuICAgICAgICAgIH0sXG4gICAgICAgICAgLy9vcHRpb25hbFxuICAgICAgICAgICdjb250YWlucyc6IGZ1bmN0aW9uKG5vZGUsIHBvcykge1xuICAgICAgICAgICAgLy9yZXR1cm4gdHJ1ZSBpZiBwb3MgaXMgaW5zaWRlIHRoZSBub2RlIG9yIGZhbHNlIG90aGVyd2lzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgKGVuZCBjb2RlKVxuXG4gICovXG4gIFJHcmFwaC5QbG90Lk5vZGVUeXBlcyA9IG5ldyBDbGFzcyh7XG4gICAgJ25vbmUnOiB7XG4gICAgICAncmVuZGVyJzogJC5lbXB0eSxcbiAgICAgICdjb250YWlucyc6ICQubGFtYmRhKGZhbHNlKVxuICAgIH0sXG4gICAgJ2NpcmNsZSc6IHtcbiAgICAgICdyZW5kZXInOiBmdW5jdGlvbihub2RlLCBjYW52YXMpe1xuICAgICAgICB2YXIgcG9zID0gbm9kZS5wb3MuZ2V0Yyh0cnVlKSwgXG4gICAgICAgICAgICBkaW0gPSBub2RlLmdldERhdGEoJ2RpbScpO1xuICAgICAgICB0aGlzLm5vZGVIZWxwZXIuY2lyY2xlLnJlbmRlcignZmlsbCcsIHBvcywgZGltLCBjYW52YXMpO1xuICAgICAgfSxcbiAgICAgICdjb250YWlucyc6IGZ1bmN0aW9uKG5vZGUsIHBvcyl7XG4gICAgICAgIHZhciBucG9zID0gbm9kZS5wb3MuZ2V0Yyh0cnVlKSwgXG4gICAgICAgICAgICBkaW0gPSBub2RlLmdldERhdGEoJ2RpbScpO1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlSGVscGVyLmNpcmNsZS5jb250YWlucyhucG9zLCBwb3MsIGRpbSk7XG4gICAgICB9XG4gICAgfSxcbiAgICAnZWxsaXBzZSc6IHtcbiAgICAgICdyZW5kZXInOiBmdW5jdGlvbihub2RlLCBjYW52YXMpe1xuICAgICAgICB2YXIgcG9zID0gbm9kZS5wb3MuZ2V0Yyh0cnVlKSwgXG4gICAgICAgICAgICB3aWR0aCA9IG5vZGUuZ2V0RGF0YSgnd2lkdGgnKSwgXG4gICAgICAgICAgICBoZWlnaHQgPSBub2RlLmdldERhdGEoJ2hlaWdodCcpO1xuICAgICAgICB0aGlzLm5vZGVIZWxwZXIuZWxsaXBzZS5yZW5kZXIoJ2ZpbGwnLCBwb3MsIHdpZHRoLCBoZWlnaHQsIGNhbnZhcyk7XG4gICAgICAgIH0sXG4gICAgICAnY29udGFpbnMnOiBmdW5jdGlvbihub2RlLCBwb3Mpe1xuICAgICAgICB2YXIgbnBvcyA9IG5vZGUucG9zLmdldGModHJ1ZSksIFxuICAgICAgICAgICAgd2lkdGggPSBub2RlLmdldERhdGEoJ3dpZHRoJyksIFxuICAgICAgICAgICAgaGVpZ2h0ID0gbm9kZS5nZXREYXRhKCdoZWlnaHQnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZUhlbHBlci5lbGxpcHNlLmNvbnRhaW5zKG5wb3MsIHBvcywgd2lkdGgsIGhlaWdodCk7XG4gICAgICB9XG4gICAgfSxcbiAgICAnc3F1YXJlJzoge1xuICAgICAgJ3JlbmRlcic6IGZ1bmN0aW9uKG5vZGUsIGNhbnZhcyl7XG4gICAgICAgIHZhciBwb3MgPSBub2RlLnBvcy5nZXRjKHRydWUpLCBcbiAgICAgICAgICAgIGRpbSA9IG5vZGUuZ2V0RGF0YSgnZGltJyk7XG4gICAgICAgIHRoaXMubm9kZUhlbHBlci5zcXVhcmUucmVuZGVyKCdmaWxsJywgcG9zLCBkaW0sIGNhbnZhcyk7XG4gICAgICB9LFxuICAgICAgJ2NvbnRhaW5zJzogZnVuY3Rpb24obm9kZSwgcG9zKXtcbiAgICAgICAgdmFyIG5wb3MgPSBub2RlLnBvcy5nZXRjKHRydWUpLCBcbiAgICAgICAgICAgIGRpbSA9IG5vZGUuZ2V0RGF0YSgnZGltJyk7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVIZWxwZXIuc3F1YXJlLmNvbnRhaW5zKG5wb3MsIHBvcywgZGltKTtcbiAgICAgIH1cbiAgICB9LFxuICAgICdyZWN0YW5nbGUnOiB7XG4gICAgICAncmVuZGVyJzogZnVuY3Rpb24obm9kZSwgY2FudmFzKXtcbiAgICAgICAgdmFyIHBvcyA9IG5vZGUucG9zLmdldGModHJ1ZSksIFxuICAgICAgICAgICAgd2lkdGggPSBub2RlLmdldERhdGEoJ3dpZHRoJyksIFxuICAgICAgICAgICAgaGVpZ2h0ID0gbm9kZS5nZXREYXRhKCdoZWlnaHQnKTtcbiAgICAgICAgdGhpcy5ub2RlSGVscGVyLnJlY3RhbmdsZS5yZW5kZXIoJ2ZpbGwnLCBwb3MsIHdpZHRoLCBoZWlnaHQsIGNhbnZhcyk7XG4gICAgICB9LFxuICAgICAgJ2NvbnRhaW5zJzogZnVuY3Rpb24obm9kZSwgcG9zKXtcbiAgICAgICAgdmFyIG5wb3MgPSBub2RlLnBvcy5nZXRjKHRydWUpLCBcbiAgICAgICAgICAgIHdpZHRoID0gbm9kZS5nZXREYXRhKCd3aWR0aCcpLCBcbiAgICAgICAgICAgIGhlaWdodCA9IG5vZGUuZ2V0RGF0YSgnaGVpZ2h0Jyk7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVIZWxwZXIucmVjdGFuZ2xlLmNvbnRhaW5zKG5wb3MsIHBvcywgd2lkdGgsIGhlaWdodCk7XG4gICAgICB9XG4gICAgfSxcbiAgICAndHJpYW5nbGUnOiB7XG4gICAgICAncmVuZGVyJzogZnVuY3Rpb24obm9kZSwgY2FudmFzKXtcbiAgICAgICAgdmFyIHBvcyA9IG5vZGUucG9zLmdldGModHJ1ZSksIFxuICAgICAgICAgICAgZGltID0gbm9kZS5nZXREYXRhKCdkaW0nKTtcbiAgICAgICAgdGhpcy5ub2RlSGVscGVyLnRyaWFuZ2xlLnJlbmRlcignZmlsbCcsIHBvcywgZGltLCBjYW52YXMpO1xuICAgICAgfSxcbiAgICAgICdjb250YWlucyc6IGZ1bmN0aW9uKG5vZGUsIHBvcykge1xuICAgICAgICB2YXIgbnBvcyA9IG5vZGUucG9zLmdldGModHJ1ZSksIFxuICAgICAgICAgICAgZGltID0gbm9kZS5nZXREYXRhKCdkaW0nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZUhlbHBlci50cmlhbmdsZS5jb250YWlucyhucG9zLCBwb3MsIGRpbSk7XG4gICAgICB9XG4gICAgfSxcbiAgICAnc3Rhcic6IHtcbiAgICAgICdyZW5kZXInOiBmdW5jdGlvbihub2RlLCBjYW52YXMpe1xuICAgICAgICB2YXIgcG9zID0gbm9kZS5wb3MuZ2V0Yyh0cnVlKSxcbiAgICAgICAgICAgIGRpbSA9IG5vZGUuZ2V0RGF0YSgnZGltJyk7XG4gICAgICAgIHRoaXMubm9kZUhlbHBlci5zdGFyLnJlbmRlcignZmlsbCcsIHBvcywgZGltLCBjYW52YXMpO1xuICAgICAgfSxcbiAgICAgICdjb250YWlucyc6IGZ1bmN0aW9uKG5vZGUsIHBvcykge1xuICAgICAgICB2YXIgbnBvcyA9IG5vZGUucG9zLmdldGModHJ1ZSksXG4gICAgICAgICAgICBkaW0gPSBub2RlLmdldERhdGEoJ2RpbScpO1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlSGVscGVyLnN0YXIuY29udGFpbnMobnBvcywgcG9zLCBkaW0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLypcbiAgICBDbGFzczogUkdyYXBoLlBsb3QuRWRnZVR5cGVzXG5cbiAgICBUaGlzIGNsYXNzIGNvbnRhaW5zIGEgbGlzdCBvZiA8R3JhcGguQWRqYWNlbmNlPiBidWlsdC1pbiB0eXBlcy4gXG4gICAgRWRnZSB0eXBlcyBpbXBsZW1lbnRlZCBhcmUgJ25vbmUnLCAnbGluZScgYW5kICdhcnJvdycuXG4gIFxuICAgIFlvdSBjYW4gYWRkIHlvdXIgY3VzdG9tIGVkZ2UgdHlwZXMsIGN1c3RvbWl6aW5nIHlvdXIgdmlzdWFsaXphdGlvbiB0byB0aGUgZXh0cmVtZS5cbiAgXG4gICAgRXhhbXBsZTpcbiAgXG4gICAgKHN0YXJ0IGNvZGUganMpXG4gICAgICBSR3JhcGguUGxvdC5FZGdlVHlwZXMuaW1wbGVtZW50KHtcbiAgICAgICAgJ215U3BlY2lhbFR5cGUnOiB7XG4gICAgICAgICAgJ3JlbmRlcic6IGZ1bmN0aW9uKGFkaiwgY2FudmFzKSB7XG4gICAgICAgICAgICAvL3ByaW50IHlvdXIgY3VzdG9tIGVkZ2UgdG8gY2FudmFzXG4gICAgICAgICAgfSxcbiAgICAgICAgICAvL29wdGlvbmFsXG4gICAgICAgICAgJ2NvbnRhaW5zJzogZnVuY3Rpb24oYWRqLCBwb3MpIHtcbiAgICAgICAgICAgIC8vcmV0dXJuIHRydWUgaWYgcG9zIGlzIGluc2lkZSB0aGUgYXJjIG9yIGZhbHNlIG90aGVyd2lzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgKGVuZCBjb2RlKVxuICBcbiAgKi9cbiAgUkdyYXBoLlBsb3QuRWRnZVR5cGVzID0gbmV3IENsYXNzKHtcbiAgICAnbm9uZSc6ICQuZW1wdHksXG4gICAgJ2xpbmUnOiB7XG4gICAgICAncmVuZGVyJzogZnVuY3Rpb24oYWRqLCBjYW52YXMpIHtcbiAgICAgICAgdmFyIGZyb20gPSBhZGoubm9kZUZyb20ucG9zLmdldGModHJ1ZSksXG4gICAgICAgICAgICB0byA9IGFkai5ub2RlVG8ucG9zLmdldGModHJ1ZSk7XG4gICAgICAgIHRoaXMuZWRnZUhlbHBlci5saW5lLnJlbmRlcihmcm9tLCB0bywgY2FudmFzKTtcbiAgICAgIH0sXG4gICAgICAnY29udGFpbnMnOiBmdW5jdGlvbihhZGosIHBvcykge1xuICAgICAgICB2YXIgZnJvbSA9IGFkai5ub2RlRnJvbS5wb3MuZ2V0Yyh0cnVlKSxcbiAgICAgICAgICAgIHRvID0gYWRqLm5vZGVUby5wb3MuZ2V0Yyh0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRnZUhlbHBlci5saW5lLmNvbnRhaW5zKGZyb20sIHRvLCBwb3MsIHRoaXMuZWRnZS5lcHNpbG9uKTtcbiAgICAgIH1cbiAgICB9LFxuICAgICdhcnJvdyc6IHtcbiAgICAgICdyZW5kZXInOiBmdW5jdGlvbihhZGosIGNhbnZhcykge1xuICAgICAgICB2YXIgZnJvbSA9IGFkai5ub2RlRnJvbS5wb3MuZ2V0Yyh0cnVlKSxcbiAgICAgICAgICAgIHRvID0gYWRqLm5vZGVUby5wb3MuZ2V0Yyh0cnVlKSxcbiAgICAgICAgICAgIGRpbSA9IGFkai5nZXREYXRhKCdkaW0nKSxcbiAgICAgICAgICAgIGRpcmVjdGlvbiA9IGFkai5kYXRhLiRkaXJlY3Rpb24sXG4gICAgICAgICAgICBpbnYgPSAoZGlyZWN0aW9uICYmIGRpcmVjdGlvbi5sZW5ndGg+MSAmJiBkaXJlY3Rpb25bMF0gIT0gYWRqLm5vZGVGcm9tLmlkKTtcbiAgICAgICAgdGhpcy5lZGdlSGVscGVyLmFycm93LnJlbmRlcihmcm9tLCB0bywgZGltLCBpbnYsIGNhbnZhcyk7XG4gICAgICB9LFxuICAgICAgJ2NvbnRhaW5zJzogZnVuY3Rpb24oYWRqLCBwb3MpIHtcbiAgICAgICAgdmFyIGZyb20gPSBhZGoubm9kZUZyb20ucG9zLmdldGModHJ1ZSksXG4gICAgICAgICAgICB0byA9IGFkai5ub2RlVG8ucG9zLmdldGModHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVkZ2VIZWxwZXIuYXJyb3cuY29udGFpbnMoZnJvbSwgdG8sIHBvcywgdGhpcy5lZGdlLmVwc2lsb24pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbn0pKCRqaXQuUkdyYXBoKTtcblxuXG4vKlxuICogRmlsZTogTGF5b3V0cy5Gb3JjZURpcmVjdGVkLmpzXG4gKlxuKi9cblxuLypcbiAqIENsYXNzOiBMYXlvdXRzLkZvcmNlRGlyZWN0ZWRcbiAqIFxuICogSW1wbGVtZW50cyBhIEZvcmNlIERpcmVjdGVkIExheW91dC5cbiAqIFxuICogSW1wbGVtZW50ZWQgQnk6XG4gKiBcbiAqIDxGb3JjZURpcmVjdGVkPlxuICogXG4gKiBDcmVkaXRzOlxuICogXG4gKiBNYXJjdXMgQ29iZGVuIDxodHRwOi8vbWFyY3VzY29iZGVuLmNvLnVrPlxuICogXG4gKi9cbkxheW91dHMuRm9yY2VEaXJlY3RlZCA9IG5ldyBDbGFzcyh7XG5cbiAgZ2V0T3B0aW9uczogZnVuY3Rpb24ocmFuZG9tKSB7XG4gICAgdmFyIHMgPSB0aGlzLmNhbnZhcy5nZXRTaXplKCk7XG4gICAgdmFyIHcgPSBzLndpZHRoLCBoID0gcy5oZWlnaHQ7XG4gICAgLy9jb3VudCBub2Rlc1xuICAgIHZhciBjb3VudCA9IDA7XG4gICAgdGhpcy5ncmFwaC5lYWNoTm9kZShmdW5jdGlvbihuKSB7IFxuICAgICAgY291bnQrKztcbiAgICB9KTtcbiAgICB2YXIgazIgPSB3ICogaCAvIGNvdW50LCBrID0gTWF0aC5zcXJ0KGsyKTtcbiAgICB2YXIgbCA9IHRoaXMuY29uZmlnLmxldmVsRGlzdGFuY2U7XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiB3LFxuICAgICAgaGVpZ2h0OiBoLFxuICAgICAgdHN0YXJ0OiB3ICogMC4xLFxuICAgICAgbm9kZWY6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIGsyIC8gKHggfHwgMSk7IH0sXG4gICAgICBlZGdlZjogZnVuY3Rpb24oeCkgeyByZXR1cm4gLyogeCAqIHggLyBrOyAqLyBrICogKHggLSBsKTsgfVxuICAgIH07XG4gIH0sXG4gIFxuICBjb21wdXRlOiBmdW5jdGlvbihwcm9wZXJ0eSwgaW5jcmVtZW50YWwpIHtcbiAgICB2YXIgcHJvcCA9ICQuc3BsYXQocHJvcGVydHkgfHwgWydjdXJyZW50JywgJ3N0YXJ0JywgJ2VuZCddKTtcbiAgICB2YXIgb3B0ID0gdGhpcy5nZXRPcHRpb25zKCk7XG4gICAgTm9kZURpbS5jb21wdXRlKHRoaXMuZ3JhcGgsIHByb3AsIHRoaXMuY29uZmlnKTtcbiAgICB0aGlzLmdyYXBoLmNvbXB1dGVMZXZlbHModGhpcy5yb290LCAwLCBcImlnbm9yZVwiKTtcbiAgICB0aGlzLmdyYXBoLmVhY2hOb2RlKGZ1bmN0aW9uKG4pIHtcbiAgICAgICQuZWFjaChwcm9wLCBmdW5jdGlvbihwKSB7XG4gICAgICAgIHZhciBwb3MgPSBuLmdldFBvcyhwKTtcbiAgICAgICAgaWYocG9zLmVxdWFscyhDb21wbGV4LktFUikpIHtcbiAgICAgICAgICBwb3MueCA9IG9wdC53aWR0aC81ICogKE1hdGgucmFuZG9tKCkgLSAwLjUpO1xuICAgICAgICAgIHBvcy55ID0gb3B0LmhlaWdodC81ICogKE1hdGgucmFuZG9tKCkgLSAwLjUpO1xuICAgICAgICB9XG4gICAgICAgIC8vaW5pdGlhbGl6ZSBkaXNwIHZlY3RvclxuICAgICAgICBuLmRpc3AgPSB7fTtcbiAgICAgICAgJC5lYWNoKHByb3AsIGZ1bmN0aW9uKHApIHtcbiAgICAgICAgICBuLmRpc3BbcF0gPSAkQygwLCAwKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLmNvbXB1dGVQb3NpdGlvbnMocHJvcCwgb3B0LCBpbmNyZW1lbnRhbCk7XG4gIH0sXG4gIFxuICBjb21wdXRlUG9zaXRpb25zOiBmdW5jdGlvbihwcm9wZXJ0eSwgb3B0LCBpbmNyZW1lbnRhbCkge1xuICAgIHZhciB0aW1lcyA9IHRoaXMuY29uZmlnLml0ZXJhdGlvbnMsIGkgPSAwLCB0aGF0ID0gdGhpcztcbiAgICBpZihpbmNyZW1lbnRhbCkge1xuICAgICAgKGZ1bmN0aW9uIGl0ZXIoKSB7XG4gICAgICAgIGZvcih2YXIgdG90YWw9aW5jcmVtZW50YWwuaXRlciwgaj0wOyBqPHRvdGFsOyBqKyspIHtcbiAgICAgICAgICBvcHQudCA9IG9wdC50c3RhcnQ7XG4gICAgICAgICAgaWYodGltZXMpIG9wdC50ICo9ICgxIC0gaSsrLyh0aW1lcyAtMSkpO1xuICAgICAgICAgIHRoYXQuY29tcHV0ZVBvc2l0aW9uU3RlcChwcm9wZXJ0eSwgb3B0KTtcbiAgICAgICAgICBpZih0aW1lcyAmJiBpID49IHRpbWVzKSB7XG4gICAgICAgICAgICBpbmNyZW1lbnRhbC5vbkNvbXBsZXRlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGluY3JlbWVudGFsLm9uU3RlcChNYXRoLnJvdW5kKGkgLyAodGltZXMgLTEpICogMTAwKSk7XG4gICAgICAgIHNldFRpbWVvdXQoaXRlciwgMSk7XG4gICAgICB9KSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IoOyBpIDwgdGltZXM7IGkrKykge1xuICAgICAgICBvcHQudCA9IG9wdC50c3RhcnQgKiAoMSAtIGkvKHRpbWVzIC0xKSk7XG4gICAgICAgIHRoaXMuY29tcHV0ZVBvc2l0aW9uU3RlcChwcm9wZXJ0eSwgb3B0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIFxuICBjb21wdXRlUG9zaXRpb25TdGVwOiBmdW5jdGlvbihwcm9wZXJ0eSwgb3B0KSB7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcbiAgICB2YXIgbWluID0gTWF0aC5taW4sIG1heCA9IE1hdGgubWF4O1xuICAgIHZhciBkcG9zID0gJEMoMCwgMCk7XG4gICAgLy9jYWxjdWxhdGUgcmVwdWxzaXZlIGZvcmNlc1xuICAgIGdyYXBoLmVhY2hOb2RlKGZ1bmN0aW9uKHYpIHtcbiAgICAgIC8vaW5pdGlhbGl6ZSBkaXNwXG4gICAgICAkLmVhY2gocHJvcGVydHksIGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdi5kaXNwW3BdLnggPSAwOyB2LmRpc3BbcF0ueSA9IDA7XG4gICAgICB9KTtcbiAgICAgIGdyYXBoLmVhY2hOb2RlKGZ1bmN0aW9uKHUpIHtcbiAgICAgICAgaWYodS5pZCAhPSB2LmlkKSB7XG4gICAgICAgICAgJC5lYWNoKHByb3BlcnR5LCBmdW5jdGlvbihwKSB7XG4gICAgICAgICAgICB2YXIgdnAgPSB2LmdldFBvcyhwKSwgdXAgPSB1LmdldFBvcyhwKTtcbiAgICAgICAgICAgIGRwb3MueCA9IHZwLnggLSB1cC54O1xuICAgICAgICAgICAgZHBvcy55ID0gdnAueSAtIHVwLnk7XG4gICAgICAgICAgICB2YXIgbm9ybSA9IGRwb3Mubm9ybSgpIHx8IDE7XG4gICAgICAgICAgICB2LmRpc3BbcF0uJGFkZChkcG9zXG4gICAgICAgICAgICAgICAgLiRzY2FsZShvcHQubm9kZWYobm9ybSkgLyBub3JtKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIC8vY2FsY3VsYXRlIGF0dHJhY3RpdmUgZm9yY2VzXG4gICAgdmFyIFQgPSAhIWdyYXBoLmdldE5vZGUodGhpcy5yb290KS52aXNpdGVkO1xuICAgIGdyYXBoLmVhY2hOb2RlKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIG5vZGUuZWFjaEFkamFjZW5jeShmdW5jdGlvbihhZGopIHtcbiAgICAgICAgdmFyIG5vZGVUbyA9IGFkai5ub2RlVG87XG4gICAgICAgIGlmKCEhbm9kZVRvLnZpc2l0ZWQgPT09IFQpIHtcbiAgICAgICAgICAkLmVhY2gocHJvcGVydHksIGZ1bmN0aW9uKHApIHtcbiAgICAgICAgICAgIHZhciB2cCA9IG5vZGUuZ2V0UG9zKHApLCB1cCA9IG5vZGVUby5nZXRQb3MocCk7XG4gICAgICAgICAgICBkcG9zLnggPSB2cC54IC0gdXAueDtcbiAgICAgICAgICAgIGRwb3MueSA9IHZwLnkgLSB1cC55O1xuICAgICAgICAgICAgdmFyIG5vcm0gPSBkcG9zLm5vcm0oKSB8fCAxO1xuICAgICAgICAgICAgbm9kZS5kaXNwW3BdLiRhZGQoZHBvcy4kc2NhbGUoLW9wdC5lZGdlZihub3JtKSAvIG5vcm0pKTtcbiAgICAgICAgICAgIG5vZGVUby5kaXNwW3BdLiRhZGQoZHBvcy4kc2NhbGUoLTEpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBub2RlLnZpc2l0ZWQgPSAhVDtcbiAgICB9KTtcbiAgICAvL2FycmFuZ2UgcG9zaXRpb25zIHRvIGZpdCB0aGUgY2FudmFzXG4gICAgdmFyIHQgPSBvcHQudCwgdzIgPSBvcHQud2lkdGggLyAyLCBoMiA9IG9wdC5oZWlnaHQgLyAyO1xuICAgIGdyYXBoLmVhY2hOb2RlKGZ1bmN0aW9uKHUpIHtcbiAgICAgICQuZWFjaChwcm9wZXJ0eSwgZnVuY3Rpb24ocCkge1xuICAgICAgICB2YXIgZGlzcCA9IHUuZGlzcFtwXTtcbiAgICAgICAgdmFyIG5vcm0gPSBkaXNwLm5vcm0oKSB8fCAxO1xuICAgICAgICB2YXIgcCA9IHUuZ2V0UG9zKHApO1xuICAgICAgICBwLiRhZGQoJEMoZGlzcC54ICogbWluKE1hdGguYWJzKGRpc3AueCksIHQpIC8gbm9ybSwgXG4gICAgICAgICAgICBkaXNwLnkgKiBtaW4oTWF0aC5hYnMoZGlzcC55KSwgdCkgLyBub3JtKSk7XG4gICAgICAgIHAueCA9IG1pbih3MiwgbWF4KC13MiwgcC54KSk7XG4gICAgICAgIHAueSA9IG1pbihoMiwgbWF4KC1oMiwgcC55KSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufSk7XG5cbi8qXG4gKiBGaWxlOiBGb3JjZURpcmVjdGVkLmpzXG4gKi9cblxuLypcbiAgIENsYXNzOiBGb3JjZURpcmVjdGVkXG4gICAgICBcbiAgIEEgdmlzdWFsaXphdGlvbiB0aGF0IGxheXMgZ3JhcGhzIHVzaW5nIGEgRm9yY2UtRGlyZWN0ZWQgbGF5b3V0IGFsZ29yaXRobS5cbiAgIFxuICAgSW5zcGlyZWQgYnk6XG4gIFxuICAgRm9yY2UtRGlyZWN0ZWQgRHJhd2luZyBBbGdvcml0aG1zIChTdGVwaGVuIEcuIEtvYm91cm92KSA8aHR0cDovL3d3dy5jcy5icm93bi5lZHUvfnJ0L2dkaGFuZGJvb2svY2hhcHRlcnMvZm9yY2UtZGlyZWN0ZWQucGRmPlxuICAgXG4gIEltcGxlbWVudHM6XG4gIFxuICBBbGwgPExvYWRlcj4gbWV0aG9kc1xuICBcbiAgIENvbnN0cnVjdG9yIE9wdGlvbnM6XG4gICBcbiAgIEluaGVyaXRzIG9wdGlvbnMgZnJvbVxuICAgXG4gICAtIDxPcHRpb25zLkNhbnZhcz5cbiAgIC0gPE9wdGlvbnMuQ29udHJvbGxlcj5cbiAgIC0gPE9wdGlvbnMuTm9kZT5cbiAgIC0gPE9wdGlvbnMuRWRnZT5cbiAgIC0gPE9wdGlvbnMuTGFiZWw+XG4gICAtIDxPcHRpb25zLkV2ZW50cz5cbiAgIC0gPE9wdGlvbnMuVGlwcz5cbiAgIC0gPE9wdGlvbnMuTm9kZVN0eWxlcz5cbiAgIC0gPE9wdGlvbnMuTmF2aWdhdGlvbj5cbiAgIFxuICAgQWRkaXRpb25hbGx5LCB0aGVyZSBhcmUgdHdvIHBhcmFtZXRlcnNcbiAgIFxuICAgbGV2ZWxEaXN0YW5jZSAtIChudW1iZXIpIERlZmF1bHQncyAqNTAqLiBUaGUgbmF0dXJhbCBsZW5ndGggZGVzaXJlZCBmb3IgdGhlIGVkZ2VzLlxuICAgaXRlcmF0aW9ucyAtIChudW1iZXIpIERlZmF1bHQncyAqNTAqLiBUaGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgZm9yIHRoZSBzcHJpbmcgbGF5b3V0IHNpbXVsYXRpb24uIERlcGVuZGluZyBvbiB0aGUgYnJvd3NlcidzIHNwZWVkIHlvdSBjb3VsZCBzZXQgdGhpcyB0byBhIG1vcmUgJ2ludGVyZXN0aW5nJyBudW1iZXIsIGxpa2UgKjIwMCouIFxuICAgICBcbiAgIEluc3RhbmNlIFByb3BlcnRpZXM6XG5cbiAgIGNhbnZhcyAtIEFjY2VzcyBhIDxDYW52YXM+IGluc3RhbmNlLlxuICAgZ3JhcGggLSBBY2Nlc3MgYSA8R3JhcGg+IGluc3RhbmNlLlxuICAgb3AgLSBBY2Nlc3MgYSA8Rm9yY2VEaXJlY3RlZC5PcD4gaW5zdGFuY2UuXG4gICBmeCAtIEFjY2VzcyBhIDxGb3JjZURpcmVjdGVkLlBsb3Q+IGluc3RhbmNlLlxuICAgbGFiZWxzIC0gQWNjZXNzIGEgPEZvcmNlRGlyZWN0ZWQuTGFiZWw+IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbi5cblxuKi9cblxuJGppdC5Gb3JjZURpcmVjdGVkID0gbmV3IENsYXNzKCB7XG5cbiAgSW1wbGVtZW50czogWyBMb2FkZXIsIEV4dHJhcywgTGF5b3V0cy5Gb3JjZURpcmVjdGVkIF0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udHJvbGxlcikge1xuICAgIHZhciAkRm9yY2VEaXJlY3RlZCA9ICRqaXQuRm9yY2VEaXJlY3RlZDtcblxuICAgIHZhciBjb25maWcgPSB7XG4gICAgICBpdGVyYXRpb25zOiA1MCxcbiAgICAgIGxldmVsRGlzdGFuY2U6IDUwXG4gICAgfTtcblxuICAgIHRoaXMuY29udHJvbGxlciA9IHRoaXMuY29uZmlnID0gJC5tZXJnZShPcHRpb25zKFwiQ2FudmFzXCIsIFwiTm9kZVwiLCBcIkVkZ2VcIixcbiAgICAgICAgXCJGeFwiLCBcIlRpcHNcIiwgXCJOb2RlU3R5bGVzXCIsIFwiRXZlbnRzXCIsIFwiTmF2aWdhdGlvblwiLCBcIkNvbnRyb2xsZXJcIiwgXCJMYWJlbFwiKSwgY29uZmlnLCBjb250cm9sbGVyKTtcblxuICAgIHZhciBjYW52YXNDb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICBpZihjYW52YXNDb25maWcudXNlQ2FudmFzKSB7XG4gICAgICB0aGlzLmNhbnZhcyA9IGNhbnZhc0NvbmZpZy51c2VDYW52YXM7XG4gICAgICB0aGlzLmNvbmZpZy5sYWJlbENvbnRhaW5lciA9IHRoaXMuY2FudmFzLmlkICsgJy1sYWJlbCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKGNhbnZhc0NvbmZpZy5iYWNrZ3JvdW5kKSB7XG4gICAgICAgIGNhbnZhc0NvbmZpZy5iYWNrZ3JvdW5kID0gJC5tZXJnZSh7XG4gICAgICAgICAgdHlwZTogJ0NpcmNsZXMnXG4gICAgICAgIH0sIGNhbnZhc0NvbmZpZy5iYWNrZ3JvdW5kKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FudmFzID0gbmV3IENhbnZhcyh0aGlzLCBjYW52YXNDb25maWcpO1xuICAgICAgdGhpcy5jb25maWcubGFiZWxDb250YWluZXIgPSAodHlwZW9mIGNhbnZhc0NvbmZpZy5pbmplY3RJbnRvID09ICdzdHJpbmcnPyBjYW52YXNDb25maWcuaW5qZWN0SW50byA6IGNhbnZhc0NvbmZpZy5pbmplY3RJbnRvLmlkKSArICctbGFiZWwnO1xuICAgIH1cblxuICAgIHRoaXMuZ3JhcGhPcHRpb25zID0ge1xuICAgICAgJ2tsYXNzJzogQ29tcGxleCxcbiAgICAgICdOb2RlJzoge1xuICAgICAgICAnc2VsZWN0ZWQnOiBmYWxzZSxcbiAgICAgICAgJ2V4aXN0JzogdHJ1ZSxcbiAgICAgICAgJ2RyYXduJzogdHJ1ZVxuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5ncmFwaCA9IG5ldyBHcmFwaCh0aGlzLmdyYXBoT3B0aW9ucywgdGhpcy5jb25maWcuTm9kZSxcbiAgICAgICAgdGhpcy5jb25maWcuRWRnZSk7XG4gICAgdGhpcy5sYWJlbHMgPSBuZXcgJEZvcmNlRGlyZWN0ZWQuTGFiZWxbY2FudmFzQ29uZmlnLkxhYmVsLnR5cGVdKHRoaXMpO1xuICAgIHRoaXMuZnggPSBuZXcgJEZvcmNlRGlyZWN0ZWQuUGxvdCh0aGlzLCAkRm9yY2VEaXJlY3RlZCk7XG4gICAgdGhpcy5vcCA9IG5ldyAkRm9yY2VEaXJlY3RlZC5PcCh0aGlzKTtcbiAgICB0aGlzLmpzb24gPSBudWxsO1xuICAgIHRoaXMuYnVzeSA9IGZhbHNlO1xuICAgIC8vIGluaXRpYWxpemUgZXh0cmFzXG4gICAgdGhpcy5pbml0aWFsaXplRXh0cmFzKCk7XG4gIH0sXG5cbiAgLyogXG4gICAgTWV0aG9kOiByZWZyZXNoIFxuICAgIFxuICAgIENvbXB1dGVzIHBvc2l0aW9ucyBhbmQgcGxvdHMgdGhlIHRyZWUuXG4gICovXG4gIHJlZnJlc2g6IGZ1bmN0aW9uKCkge1xuICAgIC8vIFNUQVJUIE1FVEFNQVBTIENPREVcbiAgICAvLyB0aGlzLmNvbXB1dGUoKTtcbiAgICAvLyBFTkQgTUVUQU1BUFMgQ09ERVxuICAgIC8vIE9SSUdJTkFMIENPREU6IHRoaXMuY29tcHV0ZSgpO1xuICAgIHRoaXMucGxvdCgpO1xuICB9LFxuXG4gIHJlcG9zaXRpb246IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuY29tcHV0ZSgnZW5kJyk7XG4gIH0sXG5cbi8qXG4gIE1ldGhvZDogY29tcHV0ZUluY3JlbWVudGFsXG4gIFxuICBQZXJmb3JtcyB0aGUgRm9yY2UgRGlyZWN0ZWQgYWxnb3JpdGhtIGluY3JlbWVudGFsbHkuXG4gIFxuICBEZXNjcmlwdGlvbjpcbiAgXG4gIEZvcmNlRGlyZWN0ZWQgYWxnb3JpdGhtcyBjYW4gcGVyZm9ybSBtYW55IGNvbXB1dGF0aW9ucyBhbmQgbGVhZCB0byBKYXZhU2NyaXB0IHRha2luZyB0b28gbXVjaCB0aW1lIHRvIGNvbXBsZXRlLiBcbiAgVGhpcyBtZXRob2Qgc3BsaXRzIHRoZSBhbGdvcml0aG0gaW50byBzbWFsbGVyIHBhcnRzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHRyYWNrIHRoZSBldm9sdXRpb24gb2YgdGhlIGFsZ29yaXRobSBhbmQgXG4gIGF2b2lkaW5nIGJyb3dzZXIgbWVzc2FnZXMgc3VjaCBhcyBcIlRoaXMgc2NyaXB0IGlzIHRha2luZyB0b28gbG9uZyB0byBjb21wbGV0ZVwiLlxuICBcbiAgUGFyYW1ldGVyczpcbiAgXG4gIG9wdCAtIChvYmplY3QpIFRoZSBvYmplY3QgcHJvcGVydGllcyBhcmUgZGVzY3JpYmVkIGJlbG93XG4gIFxuICBpdGVyIC0gKG51bWJlcikgRGVmYXVsdCdzICoyMCouIFNwbGl0IHRoZSBhbGdvcml0aG0gaW50byBwaWVjZXMgb2YgX2l0ZXJfIGl0ZXJhdGlvbnMuIEZvciBleGFtcGxlLCBpZiB0aGUgX2l0ZXJhdGlvbnNfIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgXG4gIG9mIHlvdXIgPEZvcmNlRGlyZWN0ZWQ+IGNsYXNzIGlzIDEwMCwgdGhlbiB5b3UgY291bGQgc2V0IF9pdGVyXyB0byAyMCB0byBzcGxpdCB0aGUgbWFpbiBhbGdvcml0aG0gaW50byA1IHNtYWxsZXIgcGllY2VzLlxuICBcbiAgcHJvcGVydHkgLSAoc3RyaW5nKSBEZWZhdWx0J3MgKmVuZCouIFdoZXRoZXIgdG8gdXBkYXRlIHN0YXJ0aW5nLCBjdXJyZW50IG9yIGVuZGluZyBub2RlIHBvc2l0aW9ucy4gUG9zc2libGUgdmFsdWVzIGFyZSAnZW5kJywgJ3N0YXJ0JywgJ2N1cnJlbnQnLiBcbiAgWW91IGNhbiBhbHNvIHNldCBhbiBhcnJheSBvZiB0aGVzZSBwcm9wZXJ0aWVzLiBJZiB5b3UnZCBsaWtlIHRvIGtlZXAgdGhlIGN1cnJlbnQgbm9kZSBwb3NpdGlvbnMgYnV0IHRvIHBlcmZvcm0gdGhlc2UgXG4gIGNvbXB1dGF0aW9ucyBmb3IgZmluYWwgYW5pbWF0aW9uIHBvc2l0aW9ucyB0aGVuIHlvdSBjYW4ganVzdCBjaG9vc2UgJ2VuZCcuXG4gIFxuICBvblN0ZXAgLSAoZnVuY3Rpb24pIEEgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gZWFjaCBcInNtYWxsIHBhcnRcIiBvZiB0aGUgYWxnb3JpdGhtIGNvbXBsZXRlZC4gVGhpcyBmdW5jdGlvbiBnZXRzIGFzIGZpcnN0IGZvcm1hbCBcbiAgcGFyYW1ldGVyIGEgcGVyY2VudGFnZSB2YWx1ZS5cbiAgXG4gIG9uQ29tcGxldGUgLSBBIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBhbGdvcml0aG0gY29tcGxldGVkLlxuICBcbiAgRXhhbXBsZTpcbiAgXG4gIEluIHRoaXMgZXhhbXBsZSBJIGNhbGN1bGF0ZSB0aGUgZW5kIHBvc2l0aW9ucyBhbmQgdGhlbiBhbmltYXRlIHRoZSBncmFwaCB0byB0aG9zZSBwb3NpdGlvbnNcbiAgXG4gIChzdGFydCBjb2RlIGpzKVxuICB2YXIgZmQgPSBuZXcgJGppdC5Gb3JjZURpcmVjdGVkKC4uLik7XG4gIGZkLmNvbXB1dGVJbmNyZW1lbnRhbCh7XG4gICAgaXRlcjogMjAsXG4gICAgcHJvcGVydHk6ICdlbmQnLFxuICAgIG9uU3RlcDogZnVuY3Rpb24ocGVyYykge1xuICAgICAgTG9nLndyaXRlKFwibG9hZGluZyBcIiArIHBlcmMgKyBcIiVcIik7XG4gICAgfSxcbiAgICBvbkNvbXBsZXRlOiBmdW5jdGlvbigpIHtcbiAgICAgIExvZy53cml0ZShcImRvbmVcIik7XG4gICAgICBmZC5hbmltYXRlKCk7XG4gICAgfVxuICB9KTtcbiAgKGVuZCBjb2RlKVxuICBcbiAgSW4gdGhpcyBleGFtcGxlIEkgY2FsY3VsYXRlIGFsbCBwb3NpdGlvbnMgYW5kIChyZSlwbG90IHRoZSBncmFwaFxuICBcbiAgKHN0YXJ0IGNvZGUganMpXG4gIHZhciBmZCA9IG5ldyBGb3JjZURpcmVjdGVkKC4uLik7XG4gIGZkLmNvbXB1dGVJbmNyZW1lbnRhbCh7XG4gICAgaXRlcjogMjAsXG4gICAgcHJvcGVydHk6IFsnZW5kJywgJ3N0YXJ0JywgJ2N1cnJlbnQnXSxcbiAgICBvblN0ZXA6IGZ1bmN0aW9uKHBlcmMpIHtcbiAgICAgIExvZy53cml0ZShcImxvYWRpbmcgXCIgKyBwZXJjICsgXCIlXCIpO1xuICAgIH0sXG4gICAgb25Db21wbGV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICBMb2cud3JpdGUoXCJkb25lXCIpO1xuICAgICAgZmQucGxvdCgpO1xuICAgIH1cbiAgfSk7XG4gIChlbmQgY29kZSlcbiAgXG4gICovXG4gIGNvbXB1dGVJbmNyZW1lbnRhbDogZnVuY3Rpb24ob3B0KSB7XG4gICAgb3B0ID0gJC5tZXJnZSgge1xuICAgICAgaXRlcjogMjAsXG4gICAgICBwcm9wZXJ0eTogJ2VuZCcsXG4gICAgICBvblN0ZXA6ICQuZW1wdHksXG4gICAgICBvbkNvbXBsZXRlOiAkLmVtcHR5XG4gICAgfSwgb3B0IHx8IHt9KTtcblxuICAgIHRoaXMuY29uZmlnLm9uQmVmb3JlQ29tcHV0ZSh0aGlzLmdyYXBoLmdldE5vZGUodGhpcy5yb290KSk7XG4gICAgdGhpcy5jb21wdXRlKG9wdC5wcm9wZXJ0eSwgb3B0KTtcbiAgfSxcblxuICAvKlxuICAgIE1ldGhvZDogcGxvdFxuICAgXG4gICAgUGxvdHMgdGhlIEZvcmNlRGlyZWN0ZWQgZ3JhcGguIFRoaXMgaXMgYSBzaG9ydGN1dCB0byAqZngucGxvdCouXG4gICAqL1xuICBwbG90OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmZ4LnBsb3QoKTtcbiAgfSxcblxuICAvKlxuICAgICBNZXRob2Q6IGFuaW1hdGVcbiAgICBcbiAgICAgQW5pbWF0ZXMgdGhlIGdyYXBoIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb25zIHRvIHRoZSAnZW5kJyBub2RlIHBvc2l0aW9ucy5cbiAgKi9cbiAgYW5pbWF0ZTogZnVuY3Rpb24ob3B0KSB7XG4gICAgdGhpcy5meC5hbmltYXRlKCQubWVyZ2UoIHtcbiAgICAgIG1vZGVzOiBbICdsaW5lYXInIF1cbiAgICB9LCBvcHQgfHwge30pKTtcbiAgfVxufSk7XG5cbiRqaXQuRm9yY2VEaXJlY3RlZC4kZXh0ZW5kID0gdHJ1ZTtcblxuKGZ1bmN0aW9uKEZvcmNlRGlyZWN0ZWQpIHtcblxuICAvKlxuICAgICBDbGFzczogRm9yY2VEaXJlY3RlZC5PcFxuICAgICBcbiAgICAgQ3VzdG9tIGV4dGVuc2lvbiBvZiA8R3JhcGguT3A+LlxuXG4gICAgIEV4dGVuZHM6XG5cbiAgICAgQWxsIDxHcmFwaC5PcD4gbWV0aG9kc1xuICAgICBcbiAgICAgU2VlIGFsc286XG4gICAgIFxuICAgICA8R3JhcGguT3A+XG5cbiAgKi9cbiAgRm9yY2VEaXJlY3RlZC5PcCA9IG5ldyBDbGFzcygge1xuXG4gICAgSW1wbGVtZW50czogR3JhcGguT3BcblxuICB9KTtcblxuICAvKlxuICAgIENsYXNzOiBGb3JjZURpcmVjdGVkLlBsb3RcbiAgICBcbiAgICBDdXN0b20gZXh0ZW5zaW9uIG9mIDxHcmFwaC5QbG90Pi5cbiAgXG4gICAgRXh0ZW5kczpcbiAgXG4gICAgQWxsIDxHcmFwaC5QbG90PiBtZXRob2RzXG4gICAgXG4gICAgU2VlIGFsc286XG4gICAgXG4gICAgPEdyYXBoLlBsb3Q+XG4gIFxuICAqL1xuICBGb3JjZURpcmVjdGVkLlBsb3QgPSBuZXcgQ2xhc3MoIHtcblxuICAgIEltcGxlbWVudHM6IEdyYXBoLlBsb3RcblxuICB9KTtcblxuICAvKlxuICAgIENsYXNzOiBGb3JjZURpcmVjdGVkLkxhYmVsXG4gICAgXG4gICAgQ3VzdG9tIGV4dGVuc2lvbiBvZiA8R3JhcGguTGFiZWw+LiBcbiAgICBDb250YWlucyBjdXN0b20gPEdyYXBoLkxhYmVsLlNWRz4sIDxHcmFwaC5MYWJlbC5IVE1MPiBhbmQgPEdyYXBoLkxhYmVsLk5hdGl2ZT4gZXh0ZW5zaW9ucy5cbiAgXG4gICAgRXh0ZW5kczpcbiAgXG4gICAgQWxsIDxHcmFwaC5MYWJlbD4gbWV0aG9kcyBhbmQgc3ViY2xhc3Nlcy5cbiAgXG4gICAgU2VlIGFsc286XG4gIFxuICAgIDxHcmFwaC5MYWJlbD4sIDxHcmFwaC5MYWJlbC5OYXRpdmU+LCA8R3JhcGguTGFiZWwuSFRNTD4sIDxHcmFwaC5MYWJlbC5TVkc+LlxuICBcbiAgKi9cbiAgRm9yY2VEaXJlY3RlZC5MYWJlbCA9IHt9O1xuXG4gIC8qXG4gICAgIEZvcmNlRGlyZWN0ZWQuTGFiZWwuTmF0aXZlXG4gICAgIFxuICAgICBDdXN0b20gZXh0ZW5zaW9uIG9mIDxHcmFwaC5MYWJlbC5OYXRpdmU+LlxuXG4gICAgIEV4dGVuZHM6XG5cbiAgICAgQWxsIDxHcmFwaC5MYWJlbC5OYXRpdmU+IG1ldGhvZHNcblxuICAgICBTZWUgYWxzbzpcblxuICAgICA8R3JhcGguTGFiZWwuTmF0aXZlPlxuXG4gICovXG4gIEZvcmNlRGlyZWN0ZWQuTGFiZWwuTmF0aXZlID0gbmV3IENsYXNzKCB7XG4gICAgSW1wbGVtZW50czogR3JhcGguTGFiZWwuTmF0aXZlXG4gIH0pO1xuXG4gIC8qXG4gICAgRm9yY2VEaXJlY3RlZC5MYWJlbC5TVkdcbiAgICBcbiAgICBDdXN0b20gZXh0ZW5zaW9uIG9mIDxHcmFwaC5MYWJlbC5TVkc+LlxuICBcbiAgICBFeHRlbmRzOlxuICBcbiAgICBBbGwgPEdyYXBoLkxhYmVsLlNWRz4gbWV0aG9kc1xuICBcbiAgICBTZWUgYWxzbzpcbiAgXG4gICAgPEdyYXBoLkxhYmVsLlNWRz5cbiAgXG4gICovXG4gIEZvcmNlRGlyZWN0ZWQuTGFiZWwuU1ZHID0gbmV3IENsYXNzKCB7XG4gICAgSW1wbGVtZW50czogR3JhcGguTGFiZWwuU1ZHLFxuXG4gICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24odml6KSB7XG4gICAgICB0aGlzLnZpeiA9IHZpejtcbiAgICB9LFxuXG4gICAgLyogXG4gICAgICAgcGxhY2VMYWJlbFxuXG4gICAgICAgT3ZlcnJpZGVzIGFic3RyYWN0IG1ldGhvZCBwbGFjZUxhYmVsIGluIDxHcmFwaC5MYWJlbD4uXG5cbiAgICAgICBQYXJhbWV0ZXJzOlxuXG4gICAgICAgdGFnIC0gQSBET00gbGFiZWwgZWxlbWVudC5cbiAgICAgICBub2RlIC0gQSA8R3JhcGguTm9kZT4uXG4gICAgICAgY29udHJvbGxlciAtIEEgY29uZmlndXJhdGlvbi9jb250cm9sbGVyIG9iamVjdCBwYXNzZWQgdG8gdGhlIHZpc3VhbGl6YXRpb24uXG4gICAgICBcbiAgICAgKi9cbiAgICBwbGFjZUxhYmVsOiBmdW5jdGlvbih0YWcsIG5vZGUsIGNvbnRyb2xsZXIpIHtcbiAgICAgIHZhciBwb3MgPSBub2RlLnBvcy5nZXRjKHRydWUpLCBcbiAgICAgICAgICBjYW52YXMgPSB0aGlzLnZpei5jYW52YXMsXG4gICAgICAgICAgb3ggPSBjYW52YXMudHJhbnNsYXRlT2Zmc2V0WCxcbiAgICAgICAgICBveSA9IGNhbnZhcy50cmFuc2xhdGVPZmZzZXRZLFxuICAgICAgICAgIHN4ID0gY2FudmFzLnNjYWxlT2Zmc2V0WCxcbiAgICAgICAgICBzeSA9IGNhbnZhcy5zY2FsZU9mZnNldFksXG4gICAgICAgICAgcmFkaXVzID0gY2FudmFzLmdldFNpemUoKTtcbiAgICAgIHZhciBsYWJlbFBvcyA9IHtcbiAgICAgICAgeDogTWF0aC5yb3VuZChwb3MueCAqIHN4ICsgb3ggKyByYWRpdXMud2lkdGggLyAyKSxcbiAgICAgICAgeTogTWF0aC5yb3VuZChwb3MueSAqIHN5ICsgb3kgKyByYWRpdXMuaGVpZ2h0IC8gMilcbiAgICAgIH07XG4gICAgICB0YWcuc2V0QXR0cmlidXRlKCd4JywgbGFiZWxQb3MueCk7XG4gICAgICB0YWcuc2V0QXR0cmlidXRlKCd5JywgbGFiZWxQb3MueSk7XG5cbiAgICAgIGNvbnRyb2xsZXIub25QbGFjZUxhYmVsKHRhZywgbm9kZSk7XG4gICAgfVxuICB9KTtcblxuICAvKlxuICAgICBGb3JjZURpcmVjdGVkLkxhYmVsLkhUTUxcbiAgICAgXG4gICAgIEN1c3RvbSBleHRlbnNpb24gb2YgPEdyYXBoLkxhYmVsLkhUTUw+LlxuXG4gICAgIEV4dGVuZHM6XG5cbiAgICAgQWxsIDxHcmFwaC5MYWJlbC5IVE1MPiBtZXRob2RzLlxuXG4gICAgIFNlZSBhbHNvOlxuXG4gICAgIDxHcmFwaC5MYWJlbC5IVE1MPlxuXG4gICovXG4gIEZvcmNlRGlyZWN0ZWQuTGFiZWwuSFRNTCA9IG5ldyBDbGFzcygge1xuICAgIEltcGxlbWVudHM6IEdyYXBoLkxhYmVsLkhUTUwsXG5cbiAgICBpbml0aWFsaXplOiBmdW5jdGlvbih2aXopIHtcbiAgICAgIHRoaXMudml6ID0gdml6O1xuICAgIH0sXG4gICAgLyogXG4gICAgICAgcGxhY2VMYWJlbFxuXG4gICAgICAgT3ZlcnJpZGVzIGFic3RyYWN0IG1ldGhvZCBwbGFjZUxhYmVsIGluIDxHcmFwaC5QbG90Pi5cblxuICAgICAgIFBhcmFtZXRlcnM6XG5cbiAgICAgICB0YWcgLSBBIERPTSBsYWJlbCBlbGVtZW50LlxuICAgICAgIG5vZGUgLSBBIDxHcmFwaC5Ob2RlPi5cbiAgICAgICBjb250cm9sbGVyIC0gQSBjb25maWd1cmF0aW9uL2NvbnRyb2xsZXIgb2JqZWN0IHBhc3NlZCB0byB0aGUgdmlzdWFsaXphdGlvbi5cbiAgICAgIFxuICAgICAqL1xuICAgIHBsYWNlTGFiZWw6IGZ1bmN0aW9uKHRhZywgbm9kZSwgY29udHJvbGxlcikge1xuICAgICAgdmFyIHBvcyA9IG5vZGUucG9zLmdldGModHJ1ZSksIFxuICAgICAgICAgIGNhbnZhcyA9IHRoaXMudml6LmNhbnZhcyxcbiAgICAgICAgICBveCA9IGNhbnZhcy50cmFuc2xhdGVPZmZzZXRYLFxuICAgICAgICAgIG95ID0gY2FudmFzLnRyYW5zbGF0ZU9mZnNldFksXG4gICAgICAgICAgc3ggPSBjYW52YXMuc2NhbGVPZmZzZXRYLFxuICAgICAgICAgIHN5ID0gY2FudmFzLnNjYWxlT2Zmc2V0WSxcbiAgICAgICAgICByYWRpdXMgPSBjYW52YXMuZ2V0U2l6ZSgpO1xuICAgICAgdmFyIGxhYmVsUG9zID0ge1xuICAgICAgICB4OiBNYXRoLnJvdW5kKHBvcy54ICogc3ggKyBveCArIHJhZGl1cy53aWR0aCAvIDIpLFxuICAgICAgICB5OiBNYXRoLnJvdW5kKHBvcy55ICogc3kgKyBveSArIHJhZGl1cy5oZWlnaHQgLyAyKVxuICAgICAgfTtcbiAgICAgIHZhciBzdHlsZSA9IHRhZy5zdHlsZTtcbiAgICAgIHN0eWxlLmxlZnQgPSBsYWJlbFBvcy54ICsgJ3B4JztcbiAgICAgIHN0eWxlLnRvcCA9IGxhYmVsUG9zLnkgKyAncHgnO1xuICAgICAgc3R5bGUuZGlzcGxheSA9IHRoaXMuZml0c0luQ2FudmFzKGxhYmVsUG9zLCBjYW52YXMpID8gJycgOiAnbm9uZSc7XG5cbiAgICAgIGNvbnRyb2xsZXIub25QbGFjZUxhYmVsKHRhZywgbm9kZSk7XG4gICAgfVxuICB9KTtcblxuICAvKlxuICAgIENsYXNzOiBGb3JjZURpcmVjdGVkLlBsb3QuTm9kZVR5cGVzXG5cbiAgICBUaGlzIGNsYXNzIGNvbnRhaW5zIGEgbGlzdCBvZiA8R3JhcGguTm9kZT4gYnVpbHQtaW4gdHlwZXMuIFxuICAgIE5vZGUgdHlwZXMgaW1wbGVtZW50ZWQgYXJlICdub25lJywgJ2NpcmNsZScsICd0cmlhbmdsZScsICdyZWN0YW5nbGUnLCAnc3RhcicsICdlbGxpcHNlJyBhbmQgJ3NxdWFyZScuXG5cbiAgICBZb3UgY2FuIGFkZCB5b3VyIGN1c3RvbSBub2RlIHR5cGVzLCBjdXN0b21pemluZyB5b3VyIHZpc3VhbGl6YXRpb24gdG8gdGhlIGV4dHJlbWUuXG5cbiAgICBFeGFtcGxlOlxuXG4gICAgKHN0YXJ0IGNvZGUganMpXG4gICAgICBGb3JjZURpcmVjdGVkLlBsb3QuTm9kZVR5cGVzLmltcGxlbWVudCh7XG4gICAgICAgICdteVNwZWNpYWxUeXBlJzoge1xuICAgICAgICAgICdyZW5kZXInOiBmdW5jdGlvbihub2RlLCBjYW52YXMpIHtcbiAgICAgICAgICAgIC8vcHJpbnQgeW91ciBjdXN0b20gbm9kZSB0byBjYW52YXNcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vb3B0aW9uYWxcbiAgICAgICAgICAnY29udGFpbnMnOiBmdW5jdGlvbihub2RlLCBwb3MpIHtcbiAgICAgICAgICAgIC8vcmV0dXJuIHRydWUgaWYgcG9zIGlzIGluc2lkZSB0aGUgbm9kZSBvciBmYWxzZSBvdGhlcndpc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIChlbmQgY29kZSlcblxuICAqL1xuICBGb3JjZURpcmVjdGVkLlBsb3QuTm9kZVR5cGVzID0gbmV3IENsYXNzKHtcbiAgICAnbm9uZSc6IHtcbiAgICAgICdyZW5kZXInOiAkLmVtcHR5LFxuICAgICAgJ2NvbnRhaW5zJzogJC5sYW1iZGEoZmFsc2UpXG4gICAgfSxcbiAgICAnY2lyY2xlJzoge1xuICAgICAgJ3JlbmRlcic6IGZ1bmN0aW9uKG5vZGUsIGNhbnZhcyl7XG4gICAgICAgIHZhciBwb3MgPSBub2RlLnBvcy5nZXRjKHRydWUpLCBcbiAgICAgICAgICAgIGRpbSA9IG5vZGUuZ2V0RGF0YSgnZGltJyk7XG4gICAgICAgIHRoaXMubm9kZUhlbHBlci5jaXJjbGUucmVuZGVyKCdmaWxsJywgcG9zLCBkaW0sIGNhbnZhcyk7XG4gICAgICB9LFxuICAgICAgJ2NvbnRhaW5zJzogZnVuY3Rpb24obm9kZSwgcG9zKXtcbiAgICAgICAgdmFyIG5wb3MgPSBub2RlLnBvcy5nZXRjKHRydWUpLCBcbiAgICAgICAgICAgIGRpbSA9IG5vZGUuZ2V0RGF0YSgnZGltJyk7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVIZWxwZXIuY2lyY2xlLmNvbnRhaW5zKG5wb3MsIHBvcywgZGltKTtcbiAgICAgIH1cbiAgICB9LFxuICAgICdlbGxpcHNlJzoge1xuICAgICAgJ3JlbmRlcic6IGZ1bmN0aW9uKG5vZGUsIGNhbnZhcyl7XG4gICAgICAgIHZhciBwb3MgPSBub2RlLnBvcy5nZXRjKHRydWUpLCBcbiAgICAgICAgICAgIHdpZHRoID0gbm9kZS5nZXREYXRhKCd3aWR0aCcpLCBcbiAgICAgICAgICAgIGhlaWdodCA9IG5vZGUuZ2V0RGF0YSgnaGVpZ2h0Jyk7XG4gICAgICAgIHRoaXMubm9kZUhlbHBlci5lbGxpcHNlLnJlbmRlcignZmlsbCcsIHBvcywgd2lkdGgsIGhlaWdodCwgY2FudmFzKTtcbiAgICAgICAgfSxcbiAgICAgICdjb250YWlucyc6IGZ1bmN0aW9uKG5vZGUsIHBvcyl7XG4gICAgICAgIHZhciBucG9zID0gbm9kZS5wb3MuZ2V0Yyh0cnVlKSwgXG4gICAgICAgICAgICB3aWR0aCA9IG5vZGUuZ2V0RGF0YSgnd2lkdGgnKSwgXG4gICAgICAgICAgICBoZWlnaHQgPSBub2RlLmdldERhdGEoJ2hlaWdodCcpO1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlSGVscGVyLmVsbGlwc2UuY29udGFpbnMobnBvcywgcG9zLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIH1cbiAgICB9LFxuICAgICdzcXVhcmUnOiB7XG4gICAgICAncmVuZGVyJzogZnVuY3Rpb24obm9kZSwgY2FudmFzKXtcbiAgICAgICAgdmFyIHBvcyA9IG5vZGUucG9zLmdldGModHJ1ZSksIFxuICAgICAgICAgICAgZGltID0gbm9kZS5nZXREYXRhKCdkaW0nKTtcbiAgICAgICAgdGhpcy5ub2RlSGVscGVyLnNxdWFyZS5yZW5kZXIoJ2ZpbGwnLCBwb3MsIGRpbSwgY2FudmFzKTtcbiAgICAgIH0sXG4gICAgICAnY29udGFpbnMnOiBmdW5jdGlvbihub2RlLCBwb3Mpe1xuICAgICAgICB2YXIgbnBvcyA9IG5vZGUucG9zLmdldGModHJ1ZSksIFxuICAgICAgICAgICAgZGltID0gbm9kZS5nZXREYXRhKCdkaW0nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZUhlbHBlci5zcXVhcmUuY29udGFpbnMobnBvcywgcG9zLCBkaW0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgJ3JlY3RhbmdsZSc6IHtcbiAgICAgICdyZW5kZXInOiBmdW5jdGlvbihub2RlLCBjYW52YXMpe1xuICAgICAgICB2YXIgcG9zID0gbm9kZS5wb3MuZ2V0Yyh0cnVlKSwgXG4gICAgICAgICAgICB3aWR0aCA9IG5vZGUuZ2V0RGF0YSgnd2lkdGgnKSwgXG4gICAgICAgICAgICBoZWlnaHQgPSBub2RlLmdldERhdGEoJ2hlaWdodCcpO1xuICAgICAgICB0aGlzLm5vZGVIZWxwZXIucmVjdGFuZ2xlLnJlbmRlcignZmlsbCcsIHBvcywgd2lkdGgsIGhlaWdodCwgY2FudmFzKTtcbiAgICAgIH0sXG4gICAgICAnY29udGFpbnMnOiBmdW5jdGlvbihub2RlLCBwb3Mpe1xuICAgICAgICB2YXIgbnBvcyA9IG5vZGUucG9zLmdldGModHJ1ZSksIFxuICAgICAgICAgICAgd2lkdGggPSBub2RlLmdldERhdGEoJ3dpZHRoJyksIFxuICAgICAgICAgICAgaGVpZ2h0ID0gbm9kZS5nZXREYXRhKCdoZWlnaHQnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZUhlbHBlci5yZWN0YW5nbGUuY29udGFpbnMobnBvcywgcG9zLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIH1cbiAgICB9LFxuICAgICd0cmlhbmdsZSc6IHtcbiAgICAgICdyZW5kZXInOiBmdW5jdGlvbihub2RlLCBjYW52YXMpe1xuICAgICAgICB2YXIgcG9zID0gbm9kZS5wb3MuZ2V0Yyh0cnVlKSwgXG4gICAgICAgICAgICBkaW0gPSBub2RlLmdldERhdGEoJ2RpbScpO1xuICAgICAgICB0aGlzLm5vZGVIZWxwZXIudHJpYW5nbGUucmVuZGVyKCdmaWxsJywgcG9zLCBkaW0sIGNhbnZhcyk7XG4gICAgICB9LFxuICAgICAgJ2NvbnRhaW5zJzogZnVuY3Rpb24obm9kZSwgcG9zKSB7XG4gICAgICAgIHZhciBucG9zID0gbm9kZS5wb3MuZ2V0Yyh0cnVlKSwgXG4gICAgICAgICAgICBkaW0gPSBub2RlLmdldERhdGEoJ2RpbScpO1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlSGVscGVyLnRyaWFuZ2xlLmNvbnRhaW5zKG5wb3MsIHBvcywgZGltKTtcbiAgICAgIH1cbiAgICB9LFxuICAgICdzdGFyJzoge1xuICAgICAgJ3JlbmRlcic6IGZ1bmN0aW9uKG5vZGUsIGNhbnZhcyl7XG4gICAgICAgIHZhciBwb3MgPSBub2RlLnBvcy5nZXRjKHRydWUpLFxuICAgICAgICAgICAgZGltID0gbm9kZS5nZXREYXRhKCdkaW0nKTtcbiAgICAgICAgdGhpcy5ub2RlSGVscGVyLnN0YXIucmVuZGVyKCdmaWxsJywgcG9zLCBkaW0sIGNhbnZhcyk7XG4gICAgICB9LFxuICAgICAgJ2NvbnRhaW5zJzogZnVuY3Rpb24obm9kZSwgcG9zKSB7XG4gICAgICAgIHZhciBucG9zID0gbm9kZS5wb3MuZ2V0Yyh0cnVlKSxcbiAgICAgICAgICAgIGRpbSA9IG5vZGUuZ2V0RGF0YSgnZGltJyk7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVIZWxwZXIuc3Rhci5jb250YWlucyhucG9zLCBwb3MsIGRpbSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICAvKlxuICAgIENsYXNzOiBGb3JjZURpcmVjdGVkLlBsb3QuRWRnZVR5cGVzXG4gIFxuICAgIFRoaXMgY2xhc3MgY29udGFpbnMgYSBsaXN0IG9mIDxHcmFwaC5BZGphY2VuY2U+IGJ1aWx0LWluIHR5cGVzLiBcbiAgICBFZGdlIHR5cGVzIGltcGxlbWVudGVkIGFyZSAnbm9uZScsICdsaW5lJyBhbmQgJ2Fycm93Jy5cbiAgXG4gICAgWW91IGNhbiBhZGQgeW91ciBjdXN0b20gZWRnZSB0eXBlcywgY3VzdG9taXppbmcgeW91ciB2aXN1YWxpemF0aW9uIHRvIHRoZSBleHRyZW1lLlxuICBcbiAgICBFeGFtcGxlOlxuICBcbiAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgIEZvcmNlRGlyZWN0ZWQuUGxvdC5FZGdlVHlwZXMuaW1wbGVtZW50KHtcbiAgICAgICAgJ215U3BlY2lhbFR5cGUnOiB7XG4gICAgICAgICAgJ3JlbmRlcic6IGZ1bmN0aW9uKGFkaiwgY2FudmFzKSB7XG4gICAgICAgICAgICAvL3ByaW50IHlvdXIgY3VzdG9tIGVkZ2UgdG8gY2FudmFzXG4gICAgICAgICAgfSxcbiAgICAgICAgICAvL29wdGlvbmFsXG4gICAgICAgICAgJ2NvbnRhaW5zJzogZnVuY3Rpb24oYWRqLCBwb3MpIHtcbiAgICAgICAgICAgIC8vcmV0dXJuIHRydWUgaWYgcG9zIGlzIGluc2lkZSB0aGUgYXJjIG9yIGZhbHNlIG90aGVyd2lzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgKGVuZCBjb2RlKVxuICBcbiAgKi9cbiAgRm9yY2VEaXJlY3RlZC5QbG90LkVkZ2VUeXBlcyA9IG5ldyBDbGFzcyh7XG4gICAgJ25vbmUnOiAkLmVtcHR5LFxuICAgICdsaW5lJzoge1xuICAgICAgJ3JlbmRlcic6IGZ1bmN0aW9uKGFkaiwgY2FudmFzKSB7XG4gICAgICAgIHZhciBmcm9tID0gYWRqLm5vZGVGcm9tLnBvcy5nZXRjKHRydWUpLFxuICAgICAgICAgICAgdG8gPSBhZGoubm9kZVRvLnBvcy5nZXRjKHRydWUpO1xuICAgICAgICB0aGlzLmVkZ2VIZWxwZXIubGluZS5yZW5kZXIoZnJvbSwgdG8sIGNhbnZhcyk7XG4gICAgICB9LFxuICAgICAgJ2NvbnRhaW5zJzogZnVuY3Rpb24oYWRqLCBwb3MpIHtcbiAgICAgICAgdmFyIGZyb20gPSBhZGoubm9kZUZyb20ucG9zLmdldGModHJ1ZSksXG4gICAgICAgICAgICB0byA9IGFkai5ub2RlVG8ucG9zLmdldGModHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVkZ2VIZWxwZXIubGluZS5jb250YWlucyhmcm9tLCB0bywgcG9zLCB0aGlzLmVkZ2UuZXBzaWxvbik7XG4gICAgICB9XG4gICAgfSxcbiAgICAnYXJyb3cnOiB7XG4gICAgICAncmVuZGVyJzogZnVuY3Rpb24oYWRqLCBjYW52YXMpIHtcbiAgICAgICAgdmFyIGZyb20gPSBhZGoubm9kZUZyb20ucG9zLmdldGModHJ1ZSksXG4gICAgICAgICAgICB0byA9IGFkai5ub2RlVG8ucG9zLmdldGModHJ1ZSksXG4gICAgICAgICAgICBkaW0gPSBhZGouZ2V0RGF0YSgnZGltJyksXG4gICAgICAgICAgICBkaXJlY3Rpb24gPSBhZGouZGF0YS4kZGlyZWN0aW9uLFxuICAgICAgICAgICAgaW52ID0gKGRpcmVjdGlvbiAmJiBkaXJlY3Rpb24ubGVuZ3RoPjEgJiYgZGlyZWN0aW9uWzBdICE9IGFkai5ub2RlRnJvbS5pZCk7XG4gICAgICAgIHRoaXMuZWRnZUhlbHBlci5hcnJvdy5yZW5kZXIoZnJvbSwgdG8sIGRpbSwgaW52LCBjYW52YXMpO1xuICAgICAgfSxcbiAgICAgICdjb250YWlucyc6IGZ1bmN0aW9uKGFkaiwgcG9zKSB7XG4gICAgICAgIHZhciBmcm9tID0gYWRqLm5vZGVGcm9tLnBvcy5nZXRjKHRydWUpLFxuICAgICAgICAgICAgdG8gPSBhZGoubm9kZVRvLnBvcy5nZXRjKHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5lZGdlSGVscGVyLmFycm93LmNvbnRhaW5zKGZyb20sIHRvLCBwb3MsIHRoaXMuZWRnZS5lcHNpbG9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG59KSgkaml0LkZvcmNlRGlyZWN0ZWQpO1xuXG5cbi8qXG4gKiBWZWN0b3IzIGNsYXNzIGJhc2VkIG9uIHRocmVlLmpzIGh0dHA6Ly9naXRodWIuY29tL21yZG9vYi90aHJlZS5qcywgQ29weXJpZ2h0IChjKSBNci5kb29iIGh0dHA6Ly9tcmRvb2IuY29tLywgTUlUIExpY2Vuc2UgaHR0cDovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzL2Jsb2IvbWFzdGVyL0xJQ0VOU0UgXG4gKi9cblxudmFyIFZlY3RvcjMgPSBmdW5jdGlvbih4LCB5LCB6KSB7XG5cdHRoaXMueCA9IHggfHwgMDtcblx0dGhpcy55ID0geSB8fCAwO1xuXHR0aGlzLnogPSB6IHx8IDA7XG59O1xuXG4kaml0LlZlY3RvcjMgPSBWZWN0b3IzO1xuXG5WZWN0b3IzLnByb3RvdHlwZSA9IHtcbiAgc2V0OiBmdW5jdGlvbih2KSB7XG4gICAgdGhpcy54ID0gdi54O1xuICAgIHRoaXMueSA9IHYueTtcbiAgICB0aGlzLnogPSB2Lno7XG4gIH0sXG5cbiAgc2V0YzogZnVuY3Rpb24oeCwgeSwgeikge1xuXHRcdHRoaXMueCA9IHg7XG5cdFx0dGhpcy55ID0geTtcblx0XHR0aGlzLnogPSB6O1xuXHR9LFxuXHRcblx0Z2V0YzogZnVuY3Rpb24oKSB7XG5cdCAgcmV0dXJuIHRoaXM7XG5cdH0sXG5cdFxuXHQvL1RPRE8obmljbyk6IGdldHBcblxuXHRhZGQ6IGZ1bmN0aW9uKHYxLCB2Mikge1xuXHRcdHRoaXMueCA9IHYxLnggKyB2Mi54O1xuXHRcdHRoaXMueSA9IHYxLnkgKyB2Mi55O1xuXHRcdHRoaXMueiA9IHYxLnogKyB2Mi56O1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdCRhZGQ6IGZ1bmN0aW9uKHYpIHtcblx0XHR0aGlzLnggKz0gdi54O1xuXHRcdHRoaXMueSArPSB2Lnk7XG5cdFx0dGhpcy56ICs9IHYuejtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRhZGRTY2FsYXI6IGZ1bmN0aW9uKHMpIHtcblx0XHR0aGlzLnggKz0gcztcblx0XHR0aGlzLnkgKz0gcztcblx0XHR0aGlzLnogKz0gcztcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRzdWI6IGZ1bmN0aW9uKHYxLCB2Mikge1xuXHRcdHRoaXMueCA9IHYxLnggLSB2Mi54O1xuXHRcdHRoaXMueSA9IHYxLnkgLSB2Mi55O1xuXHRcdHRoaXMueiA9IHYxLnogLSB2Mi56O1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdCRzdWI6IGZ1bmN0aW9uKHYpIHtcblx0XHR0aGlzLnggLT0gdi54O1xuXHRcdHRoaXMueSAtPSB2Lnk7XG5cdFx0dGhpcy56IC09IHYuejtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRjcm9zczogZnVuY3Rpb24odjEsIHYyKSB7XG5cdFx0dGhpcy54ID0gdjEueSAqIHYyLnogLSB2MS56ICogdjIueTtcblx0XHR0aGlzLnkgPSB2MS56ICogdjIueCAtIHYxLnggKiB2Mi56O1xuXHRcdHRoaXMueiA9IHYxLnggKiB2Mi55IC0gdjEueSAqIHYyLng7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0JGNyb3NzOiBmdW5jdGlvbih2KSB7XG5cdFx0dmFyIHR4ID0gdGhpcy54LCB0eSA9IHRoaXMueSwgdHogPSB0aGlzLno7XG5cblx0XHR0aGlzLnggPSB0eSAqIHYueiAtIHR6ICogdi55O1xuXHRcdHRoaXMueSA9IHR6ICogdi54IC0gdHggKiB2Lno7XG5cdFx0dGhpcy56ID0gdHggKiB2LnkgLSB0eSAqIHYueDtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHQkbXVsdGlwbHk6IGZ1bmN0aW9uKHYpIHtcblx0XHR0aGlzLnggKj0gdi54O1xuXHRcdHRoaXMueSAqPSB2Lnk7XG5cdFx0dGhpcy56ICo9IHYuejtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHQkc2NhbGU6IGZ1bmN0aW9uKHMpIHtcblx0XHR0aGlzLnggKj0gcztcblx0XHR0aGlzLnkgKj0gcztcblx0XHR0aGlzLnogKj0gcztcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRkb3Q6IGZ1bmN0aW9uKHYpIHtcblx0XHRyZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55ICsgdGhpcy56ICogdi56O1xuXHR9LFxuXG5cdGRpc3RhbmNlVG86IGZ1bmN0aW9uKHYpIHtcblx0XHRyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodikpO1xuXHR9LFxuXG5cdGRpc3RhbmNlVG9TcXVhcmVkOiBmdW5jdGlvbih2KSB7XG5cdFx0dmFyIGR4ID0gdGhpcy54IC0gdi54LCBkeSA9IHRoaXMueSAtIHYueSwgZHogPSB0aGlzLnogLSB2Lno7XG5cdFx0cmV0dXJuIGR4ICogZHggKyBkeSAqIGR5ICsgZHogKiBkejtcblx0fSxcblxuXHRub3JtOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKTtcblx0fSxcblxuXHRub3JtU3F1YXJlZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMuejtcblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMueCA9IC0gdGhpcy54O1xuXHRcdHRoaXMueSA9IC0gdGhpcy55O1xuXHRcdHRoaXMueiA9IC0gdGhpcy56O1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24oKSB7XG5cdCAgdmFyIGxlbiA9IHRoaXMubm9ybSgpO1xuXHRcdGlmICggbGVuID4gMCApIHtcblx0XHRcdHRoaXMuJHNjYWxlKDEgLyBsZW4pO1xuXHRcdH0gXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0aXNaZXJvOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgYWxtb3N0WmVybyA9IDAuMDAwMSxcblx0XHQgICAgYWJzID0gTWF0aC5hYnM7XG5cdFx0XG5cdFx0cmV0dXJuIGFicyh0aGlzLngpIDwgYWxtb3N0WmVybyAmJiBhYnModGhpcy55KSA8IGFsbW9zdFplcm8gJiYgYWJzKHRoaXMueikgPCBhbG1vc3RaZXJvO1xuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gbmV3IFZlY3RvcjModGhpcy54LCB0aGlzLnksIHRoaXMueik7XG5cdH1cbn07XG5cbnZhciAkVjMgPSBmdW5jdGlvbihhLCBiLCBjKSB7IHJldHVybiBuZXcgVmVjdG9yMyhhLCBiLCBjKTsgfTtcblxuLypcbiAqIE1hdHJpeDQgY2xhc3MgYmFzZWQgb24gdGhyZWUuanMgaHR0cDovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzLCBDb3B5cmlnaHQgKGMpIE1yLmRvb2IgaHR0cDovL21yZG9vYi5jb20vLCBNSVQgTGljZW5zZSBodHRwOi8vZ2l0aHViLmNvbS9tcmRvb2IvdGhyZWUuanMvYmxvYi9tYXN0ZXIvTElDRU5TRSBcbiAqL1xuXG52YXIgTWF0cml4NCA9IGZ1bmN0aW9uKCkge1xuXHR0aGlzLl94ID0gbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5feSA9IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMuX3ogPSBuZXcgVmVjdG9yMygpO1xufTtcblxuJGppdC5NYXRyaXg0ID0gTWF0cml4NDtcblxuTWF0cml4NC5wcm90b3R5cGUgPSB7XG5cblx0bjExOiAxLCBuMTI6IDAsIG4xMzogMCwgbjE0OiAwLFxuXHRuMjE6IDAsIG4yMjogMSwgbjIzOiAwLCBuMjQ6IDAsXG5cdG4zMTogMCwgbjMyOiAwLCBuMzM6IDEsIG4zNDogMCxcblx0bjQxOiAwLCBuNDI6IDAsIG40MzogMCwgbjQ0OiAxLFxuXG5cdGlkZW50aXR5OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm4xMSA9IDE7IHRoaXMubjEyID0gMDsgdGhpcy5uMTMgPSAwOyB0aGlzLm4xNCA9IDA7XG5cdFx0dGhpcy5uMjEgPSAwOyB0aGlzLm4yMiA9IDE7IHRoaXMubjIzID0gMDsgdGhpcy5uMjQgPSAwO1xuXHRcdHRoaXMubjMxID0gMDsgdGhpcy5uMzIgPSAwOyB0aGlzLm4zMyA9IDE7IHRoaXMubjM0ID0gMDtcblx0XHR0aGlzLm40MSA9IDA7IHRoaXMubjQyID0gMDsgdGhpcy5uNDMgPSAwOyB0aGlzLm40NCA9IDE7XG5cdH0sXG5cblx0bG9va0F0OiBmdW5jdGlvbihleWUsIGNlbnRlciwgdXApIHtcblx0XHR2YXIgeCA9IHRoaXMuX3gsIHkgPSB0aGlzLl95LCB6ID0gdGhpcy5fejtcblxuXHRcdHouc3ViKGV5ZSwgY2VudGVyKTtcblx0XHR6Lm5vcm1hbGl6ZSgpO1xuXG5cdFx0eC5jcm9zcyh1cCwgeik7XG5cdFx0eC5ub3JtYWxpemUoKTtcblxuXHRcdHkuY3Jvc3MoeiwgeCk7XG5cdFx0eS5ub3JtYWxpemUoKTtcblxuXHRcdHRoaXMubjExID0geC54OyB0aGlzLm4xMiA9IHgueTsgdGhpcy5uMTMgPSB4Lno7IHRoaXMubjE0ID0gLSB4LmRvdCggZXllICk7XG5cdFx0dGhpcy5uMjEgPSB5Lng7IHRoaXMubjIyID0geS55OyB0aGlzLm4yMyA9IHkuejsgdGhpcy5uMjQgPSAtIHkuZG90KCBleWUgKTtcblx0XHR0aGlzLm4zMSA9IHoueDsgdGhpcy5uMzIgPSB6Lnk7IHRoaXMubjMzID0gei56OyB0aGlzLm4zNCA9IC0gei5kb3QoIGV5ZSApO1xuXHR9LFxuXG5cdHRyYW5zZm9ybTogZnVuY3Rpb24odikge1xuXHRcdHZhciB2eCA9IHYueCwgdnkgPSB2LnksIHZ6ID0gdi56LCB2dyA9IHYudyA/IHYudyA6IDEuMDtcblxuXHRcdHYueCA9IHRoaXMubjExICogdnggKyB0aGlzLm4xMiAqIHZ5ICsgdGhpcy5uMTMgKiB2eiArIHRoaXMubjE0ICogdnc7XG5cdFx0di55ID0gdGhpcy5uMjEgKiB2eCArIHRoaXMubjIyICogdnkgKyB0aGlzLm4yMyAqIHZ6ICsgdGhpcy5uMjQgKiB2dztcblx0XHR2LnogPSB0aGlzLm4zMSAqIHZ4ICsgdGhpcy5uMzIgKiB2eSArIHRoaXMubjMzICogdnogKyB0aGlzLm4zNCAqIHZ3O1xuXG5cdFx0dncgPSB0aGlzLm40MSAqIHZ4ICsgdGhpcy5uNDIgKiB2eSArIHRoaXMubjQzICogdnogKyB0aGlzLm40NCAqIHZ3O1xuXG5cdFx0aWYodi53KSB7XG5cdFx0XHR2LncgPSB2dztcblx0XHR9IGVsc2Uge1xuXHRcdFx0di54ID0gdi54IC8gdnc7XG5cdFx0XHR2LnkgPSB2LnkgLyB2dztcblx0XHRcdHYueiA9IHYueiAvIHZ3O1xuXHRcdH1cblx0fSxcblxuXHRtdWx0aXBseTogZnVuY3Rpb24oYSwgYikge1xuXHRcdHRoaXMubjExID0gYS5uMTEgKiBiLm4xMSArIGEubjEyICogYi5uMjEgKyBhLm4xMyAqIGIubjMxICsgYS5uMTQgKiBiLm40MTtcblx0XHR0aGlzLm4xMiA9IGEubjExICogYi5uMTIgKyBhLm4xMiAqIGIubjIyICsgYS5uMTMgKiBiLm4zMiArIGEubjE0ICogYi5uNDI7XG5cdFx0dGhpcy5uMTMgPSBhLm4xMSAqIGIubjEzICsgYS5uMTIgKiBiLm4yMyArIGEubjEzICogYi5uMzMgKyBhLm4xNCAqIGIubjQzO1xuXHRcdHRoaXMubjE0ID0gYS5uMTEgKiBiLm4xNCArIGEubjEyICogYi5uMjQgKyBhLm4xMyAqIGIubjM0ICsgYS5uMTQgKiBiLm40NDtcblxuXHRcdHRoaXMubjIxID0gYS5uMjEgKiBiLm4xMSArIGEubjIyICogYi5uMjEgKyBhLm4yMyAqIGIubjMxICsgYS5uMjQgKiBiLm40MTtcblx0XHR0aGlzLm4yMiA9IGEubjIxICogYi5uMTIgKyBhLm4yMiAqIGIubjIyICsgYS5uMjMgKiBiLm4zMiArIGEubjI0ICogYi5uNDI7XG5cdFx0dGhpcy5uMjMgPSBhLm4yMSAqIGIubjEzICsgYS5uMjIgKiBiLm4yMyArIGEubjIzICogYi5uMzMgKyBhLm4yNCAqIGIubjQzO1xuXHRcdHRoaXMubjI0ID0gYS5uMjEgKiBiLm4xNCArIGEubjIyICogYi5uMjQgKyBhLm4yMyAqIGIubjM0ICsgYS5uMjQgKiBiLm40NDtcblxuXHRcdHRoaXMubjMxID0gYS5uMzEgKiBiLm4xMSArIGEubjMyICogYi5uMjEgKyBhLm4zMyAqIGIubjMxICsgYS5uMzQgKiBiLm40MTtcblx0XHR0aGlzLm4zMiA9IGEubjMxICogYi5uMTIgKyBhLm4zMiAqIGIubjIyICsgYS5uMzMgKiBiLm4zMiArIGEubjM0ICogYi5uNDI7XG5cdFx0dGhpcy5uMzMgPSBhLm4zMSAqIGIubjEzICsgYS5uMzIgKiBiLm4yMyArIGEubjMzICogYi5uMzMgKyBhLm4zNCAqIGIubjQzO1xuXHRcdHRoaXMubjM0ID0gYS5uMzEgKiBiLm4xNCArIGEubjMyICogYi5uMjQgKyBhLm4zMyAqIGIubjM0ICsgYS5uMzQgKiBiLm40NDtcblxuXHRcdHRoaXMubjQxID0gYS5uNDEgKiBiLm4xMSArIGEubjQyICogYi5uMjEgKyBhLm40MyAqIGIubjMxICsgYS5uNDQgKiBiLm40MTtcblx0XHR0aGlzLm40MiA9IGEubjQxICogYi5uMTIgKyBhLm40MiAqIGIubjIyICsgYS5uNDMgKiBiLm4zMiArIGEubjQ0ICogYi5uNDI7XG5cdFx0dGhpcy5uNDMgPSBhLm40MSAqIGIubjEzICsgYS5uNDIgKiBiLm4yMyArIGEubjQzICogYi5uMzMgKyBhLm40NCAqIGIubjQzO1xuXHRcdHRoaXMubjQ0ID0gYS5uNDEgKiBiLm4xNCArIGEubjQyICogYi5uMjQgKyBhLm40MyAqIGIubjM0ICsgYS5uNDQgKiBiLm40NDtcblx0fSxcblxuXHQkbXVsdGlwbHk6IGZ1bmN0aW9uKG0pIHtcblx0XHR2YXIgbjExID0gdGhpcy5uMTEsIG4xMiA9IHRoaXMubjEyLCBuMTMgPSB0aGlzLm4xMywgbjE0ID0gdGhpcy5uMTQsXG4gICAgXHRcdG4yMSA9IHRoaXMubjIxLCBuMjIgPSB0aGlzLm4yMiwgbjIzID0gdGhpcy5uMjMsIG4yNCA9IHRoaXMubjI0LFxuICAgIFx0XHRuMzEgPSB0aGlzLm4zMSwgbjMyID0gdGhpcy5uMzIsIG4zMyA9IHRoaXMubjMzLCBuMzQgPSB0aGlzLm4zNCxcbiAgICBcdFx0bjQxID0gdGhpcy5uNDEsIG40MiA9IHRoaXMubjQyLCBuNDMgPSB0aGlzLm40MywgbjQ0ID0gdGhpcy5uNDQ7XG5cblx0XHR0aGlzLm4xMSA9IG4xMSAqIG0ubjExICsgbjEyICogbS5uMjEgKyBuMTMgKiBtLm4zMSArIG4xNCAqIG0ubjQxO1xuXHRcdHRoaXMubjEyID0gbjExICogbS5uMTIgKyBuMTIgKiBtLm4yMiArIG4xMyAqIG0ubjMyICsgbjE0ICogbS5uNDI7XG5cdFx0dGhpcy5uMTMgPSBuMTEgKiBtLm4xMyArIG4xMiAqIG0ubjIzICsgbjEzICogbS5uMzMgKyBuMTQgKiBtLm40Mztcblx0XHR0aGlzLm4xNCA9IG4xMSAqIG0ubjE0ICsgbjEyICogbS5uMjQgKyBuMTMgKiBtLm4zNCArIG4xNCAqIG0ubjQ0O1xuXG5cdFx0dGhpcy5uMjEgPSBuMjEgKiBtLm4xMSArIG4yMiAqIG0ubjIxICsgbjIzICogbS5uMzEgKyBuMjQgKiBtLm40MTtcblx0XHR0aGlzLm4yMiA9IG4yMSAqIG0ubjEyICsgbjIyICogbS5uMjIgKyBuMjMgKiBtLm4zMiArIG4yNCAqIG0ubjQyO1xuXHRcdHRoaXMubjIzID0gbjIxICogbS5uMTMgKyBuMjIgKiBtLm4yMyArIG4yMyAqIG0ubjMzICsgbjI0ICogbS5uNDM7XG5cdFx0dGhpcy5uMjQgPSBuMjEgKiBtLm4xNCArIG4yMiAqIG0ubjI0ICsgbjIzICogbS5uMzQgKyBuMjQgKiBtLm40NDtcblxuXHRcdHRoaXMubjMxID0gbjMxICogbS5uMTEgKyBuMzIgKiBtLm4yMSArIG4zMyAqIG0ubjMxICsgbjM0ICogbS5uNDE7XG5cdFx0dGhpcy5uMzIgPSBuMzEgKiBtLm4xMiArIG4zMiAqIG0ubjIyICsgbjMzICogbS5uMzIgKyBuMzQgKiBtLm40Mjtcblx0XHR0aGlzLm4zMyA9IG4zMSAqIG0ubjEzICsgbjMyICogbS5uMjMgKyBuMzMgKiBtLm4zMyArIG4zNCAqIG0ubjQzO1xuXHRcdHRoaXMubjM0ID0gbjMxICogbS5uMTQgKyBuMzIgKiBtLm4yNCArIG4zMyAqIG0ubjM0ICsgbjM0ICogbS5uNDQ7XG5cblx0XHR0aGlzLm40MSA9IG40MSAqIG0ubjExICsgbjQyICogbS5uMjEgKyBuNDMgKiBtLm4zMSArIG40NCAqIG0ubjQxO1xuXHRcdHRoaXMubjQyID0gbjQxICogbS5uMTIgKyBuNDIgKiBtLm4yMiArIG40MyAqIG0ubjMyICsgbjQ0ICogbS5uNDI7XG5cdFx0dGhpcy5uNDMgPSBuNDEgKiBtLm4xMyArIG40MiAqIG0ubjIzICsgbjQzICogbS5uMzMgKyBuNDQgKiBtLm40Mztcblx0XHR0aGlzLm40NCA9IG40MSAqIG0ubjE0ICsgbjQyICogbS5uMjQgKyBuNDMgKiBtLm4zNCArIG40NCAqIG0ubjQ0O1xuXHR9LFxuXG5cdCRzY2FsZTogZnVuY3Rpb24ocykge1xuXHRcdHRoaXMubjExICo9IHM7IHRoaXMubjEyICo9IHM7IHRoaXMubjEzICo9IHM7IHRoaXMubjE0ICo9IHM7XG5cdFx0dGhpcy5uMjEgKj0gczsgdGhpcy5uMjIgKj0gczsgdGhpcy5uMjMgKj0gczsgdGhpcy5uMjQgKj0gcztcblx0XHR0aGlzLm4zMSAqPSBzOyB0aGlzLm4zMiAqPSBzOyB0aGlzLm4zMyAqPSBzOyB0aGlzLm4zNCAqPSBzO1xuXHRcdHRoaXMubjQxICo9IHM7IHRoaXMubjQyICo9IHM7IHRoaXMubjQzICo9IHM7IHRoaXMubjQ0ICo9IHM7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cdFxuXHQkYWRkOiBmdW5jdGlvbihtKSB7XG5cdCAgdGhpcy5uMTEgKz0gbS5uMTE7XG5cdCAgdGhpcy5uMTIgKz0gbS5uMTI7XG5cdCAgdGhpcy5uMTMgKz0gbS5uMTM7XG5cdCAgdGhpcy5uMTQgKz0gbS5uMTQ7XG5cdCAgdGhpcy5uMjEgKz0gbS5uMjE7XG5cdCAgdGhpcy5uMjIgKz0gbS5uMjI7XG5cdCAgdGhpcy5uMjMgKz0gbS5uMjM7XG5cdCAgdGhpcy5uMjQgKz0gbS5uMjQ7XG5cdCAgdGhpcy5uMzEgKz0gbS5uMzE7XG5cdCAgdGhpcy5uMzIgKz0gbS5uMzI7XG5cdCAgdGhpcy5uMzMgKz0gbS5uMzM7XG5cdCAgdGhpcy5uMzQgKz0gbS5uMzQ7XG5cdCAgdGhpcy5uNDEgKz0gbS5uNDE7XG5cdCAgdGhpcy5uNDIgKz0gbS5uNDI7XG5cdCAgdGhpcy5uNDMgKz0gbS5uNDM7XG5cdCAgdGhpcy5uNDQgKz0gbS5uNDQ7XG5cdCAgcmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0ZGV0ZXJtaW5hbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHR0aGlzLm4xNCAqIHRoaXMubjIzICogdGhpcy5uMzIgKiB0aGlzLm40MS1cblx0XHRcdHRoaXMubjEzICogdGhpcy5uMjQgKiB0aGlzLm4zMiAqIHRoaXMubjQxLVxuXHRcdFx0dGhpcy5uMTQgKiB0aGlzLm4yMiAqIHRoaXMubjMzICogdGhpcy5uNDErXG5cdFx0XHR0aGlzLm4xMiAqIHRoaXMubjI0ICogdGhpcy5uMzMgKiB0aGlzLm40MStcblxuXHRcdFx0dGhpcy5uMTMgKiB0aGlzLm4yMiAqIHRoaXMubjM0ICogdGhpcy5uNDEtXG5cdFx0XHR0aGlzLm4xMiAqIHRoaXMubjIzICogdGhpcy5uMzQgKiB0aGlzLm40MS1cblx0XHRcdHRoaXMubjE0ICogdGhpcy5uMjMgKiB0aGlzLm4zMSAqIHRoaXMubjQyK1xuXHRcdFx0dGhpcy5uMTMgKiB0aGlzLm4yNCAqIHRoaXMubjMxICogdGhpcy5uNDIrXG5cblx0XHRcdHRoaXMubjE0ICogdGhpcy5uMjEgKiB0aGlzLm4zMyAqIHRoaXMubjQyLVxuXHRcdFx0dGhpcy5uMTEgKiB0aGlzLm4yNCAqIHRoaXMubjMzICogdGhpcy5uNDItXG5cdFx0XHR0aGlzLm4xMyAqIHRoaXMubjIxICogdGhpcy5uMzQgKiB0aGlzLm40Mitcblx0XHRcdHRoaXMubjExICogdGhpcy5uMjMgKiB0aGlzLm4zNCAqIHRoaXMubjQyK1xuXG5cdFx0XHR0aGlzLm4xNCAqIHRoaXMubjIyICogdGhpcy5uMzEgKiB0aGlzLm40My1cblx0XHRcdHRoaXMubjEyICogdGhpcy5uMjQgKiB0aGlzLm4zMSAqIHRoaXMubjQzLVxuXHRcdFx0dGhpcy5uMTQgKiB0aGlzLm4yMSAqIHRoaXMubjMyICogdGhpcy5uNDMrXG5cdFx0XHR0aGlzLm4xMSAqIHRoaXMubjI0ICogdGhpcy5uMzIgKiB0aGlzLm40MytcblxuXHRcdFx0dGhpcy5uMTIgKiB0aGlzLm4yMSAqIHRoaXMubjM0ICogdGhpcy5uNDMtXG5cdFx0XHR0aGlzLm4xMSAqIHRoaXMubjIyICogdGhpcy5uMzQgKiB0aGlzLm40My1cblx0XHRcdHRoaXMubjEzICogdGhpcy5uMjIgKiB0aGlzLm4zMSAqIHRoaXMubjQ0K1xuXHRcdFx0dGhpcy5uMTIgKiB0aGlzLm4yMyAqIHRoaXMubjMxICogdGhpcy5uNDQrXG5cblx0XHRcdHRoaXMubjEzICogdGhpcy5uMjEgKiB0aGlzLm4zMiAqIHRoaXMubjQ0LVxuXHRcdFx0dGhpcy5uMTEgKiB0aGlzLm4yMyAqIHRoaXMubjMyICogdGhpcy5uNDQtXG5cdFx0XHR0aGlzLm4xMiAqIHRoaXMubjIxICogdGhpcy5uMzMgKiB0aGlzLm40NCtcblx0XHRcdHRoaXMubjExICogdGhpcy5uMjIgKiB0aGlzLm4zMyAqIHRoaXMubjQ0ICk7XG5cdH0sXG5cbiAgJHRyYW5zcG9zZTogZnVuY3Rpb24oKSB7XG5cdCAgZnVuY3Rpb24gc3dhcChvYmosIHAxLCBwMikge1xuXHQgICAgdmFyIGF1eCA9IG9ialtwMV07XG5cdCAgICBvYmpbcDFdID0gb2JqW3AyXTtcblx0ICAgIG9ialtwMl0gPSBhdXg7XG5cdCAgfVxuXHQgIFxuXHQgIHN3YXAodGhpcywgJ24yMScsICduMTInKTtcblx0ICBzd2FwKHRoaXMsICduMzEnLCAnbjEzJyk7XG5cdCAgc3dhcCh0aGlzLCAnbjMyJywgJ24yMycpO1xuXHQgIHN3YXAodGhpcywgJ240MScsICduMTQnKTtcblx0ICBzd2FwKHRoaXMsICduNDInLCAnbjI0Jyk7XG5cdCAgc3dhcCh0aGlzLCAnbjQzJywgJ24zNCcpO1xuXHQgIHJldHVybiB0aGlzO1xuICB9LFxuICBcblx0Y2xvbmU6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtID0gbmV3IE1hdHJpeDQoKTtcblx0XHRtLm4xMSA9IHRoaXMubjExOyBtLm4xMiA9IHRoaXMubjEyOyBtLm4xMyA9IHRoaXMubjEzOyBtLm4xNCA9IHRoaXMubjE0O1xuXHRcdG0ubjIxID0gdGhpcy5uMjE7IG0ubjIyID0gdGhpcy5uMjI7IG0ubjIzID0gdGhpcy5uMjM7IG0ubjI0ID0gdGhpcy5uMjQ7XG5cdFx0bS5uMzEgPSB0aGlzLm4zMTsgbS5uMzIgPSB0aGlzLm4zMjsgbS5uMzMgPSB0aGlzLm4zMzsgbS5uMzQgPSB0aGlzLm4zNDtcblx0XHRtLm40MSA9IHRoaXMubjQxOyBtLm40MiA9IHRoaXMubjQyOyBtLm40MyA9IHRoaXMubjQzOyBtLm40NCA9IHRoaXMubjQ0O1xuXHRcdHJldHVybiBtO1xuXHR9LFxuXHRcblx0ZmxhdHRlbjogZnVuY3Rpb24oKSB7XG5cdCAgcmV0dXJuIFt0aGlzLm4xMSwgdGhpcy5uMjEsIHRoaXMubjMxLCB0aGlzLm40MSxcblx0ICAgICAgdGhpcy5uMTIsIHRoaXMubjIyLCB0aGlzLm4zMiwgdGhpcy5uNDIsXG5cdCAgICAgIHRoaXMubjEzLCB0aGlzLm4yMywgdGhpcy5uMzMsIHRoaXMubjQzLFxuXHQgICAgICB0aGlzLm4xNCwgdGhpcy5uMjQsIHRoaXMubjM0LCB0aGlzLm40NF07XG5cdH1cbn07XG5cbk1hdHJpeDQudHJhbnNsYXRpb25NYXRyaXggPSBmdW5jdGlvbih4LCB5LCB6KSB7XG5cdHZhciBtID0gbmV3IE1hdHJpeDQoKTtcblxuXHRtLm4xNCA9IHg7XG5cdG0ubjI0ID0geTtcblx0bS5uMzQgPSB6O1xuXG5cdHJldHVybiBtO1xufTtcblxuTWF0cml4NC5zY2FsZU1hdHJpeCA9IGZ1bmN0aW9uKHgsIHksIHopIHtcblx0dmFyIG0gPSBuZXcgTWF0cml4NCgpO1xuXG5cdG0ubjExID0geDtcblx0bS5uMjIgPSB5O1xuXHRtLm4zMyA9IHo7XG5cblx0cmV0dXJuIG07XG59O1xuXG5NYXRyaXg0LnJvdGF0aW9uWE1hdHJpeCA9IGZ1bmN0aW9uKHRoZXRhKSB7XG5cdHZhciByb3QgPSBuZXcgTWF0cml4NCgpO1xuXG5cdHJvdC5uMjIgPSByb3QubjMzID0gTWF0aC5jb3MoIHRoZXRhICk7XG5cdHJvdC5uMzIgPSBNYXRoLnNpbiggdGhldGEgKTtcblx0cm90Lm4yMyA9IC0gcm90Lm4zMjtcblxuXHRyZXR1cm4gcm90O1xufTtcblxuTWF0cml4NC5yb3RhdGlvbllNYXRyaXggPSBmdW5jdGlvbih0aGV0YSkge1xuXHR2YXIgcm90ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRyb3QubjExID0gcm90Lm4zMyA9IE1hdGguY29zKCB0aGV0YSApO1xuXHRyb3QubjEzID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cdHJvdC5uMzEgPSAtIHJvdC5uMTM7XG5cblx0cmV0dXJuIHJvdDtcbn07XG5cbk1hdHJpeDQucm90YXRpb25aTWF0cml4ID0gZnVuY3Rpb24odGhldGEpIHtcblx0dmFyIHJvdCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0cm90Lm4xMSA9IHJvdC5uMjIgPSBNYXRoLmNvcyggdGhldGEgKTtcblx0cm90Lm4yMSA9IE1hdGguc2luKCB0aGV0YSApO1xuXHRyb3QubjEyID0gLSByb3QubjIxO1xuXG5cdHJldHVybiByb3Q7XG59O1xuXG5NYXRyaXg0Lm1ha2VJbnZlcnQgPSBmdW5jdGlvbihtMSkge1xuXHR2YXIgbTIgPSBuZXcgTWF0cml4NCgpO1xuXG5cdG0yLm4xMSA9IG0xLm4yMyptMS5uMzQqbTEubjQyIC0gbTEubjI0Km0xLm4zMyptMS5uNDIgKyBtMS5uMjQqbTEubjMyKm0xLm40MyAtIG0xLm4yMiptMS5uMzQqbTEubjQzIC0gbTEubjIzKm0xLm4zMiptMS5uNDQgKyBtMS5uMjIqbTEubjMzKm0xLm40NDtcblx0bTIubjEyID0gbTEubjE0Km0xLm4zMyptMS5uNDIgLSBtMS5uMTMqbTEubjM0Km0xLm40MiAtIG0xLm4xNCptMS5uMzIqbTEubjQzICsgbTEubjEyKm0xLm4zNCptMS5uNDMgKyBtMS5uMTMqbTEubjMyKm0xLm40NCAtIG0xLm4xMiptMS5uMzMqbTEubjQ0O1xuXHRtMi5uMTMgPSBtMS5uMTMqbTEubjI0Km0xLm40MiAtIG0xLm4xNCptMS5uMjMqbTEubjQyICsgbTEubjE0Km0xLm4yMiptMS5uNDMgLSBtMS5uMTIqbTEubjI0Km0xLm40MyAtIG0xLm4xMyptMS5uMjIqbTEubjQ0ICsgbTEubjEyKm0xLm4yMyptMS5uNDQ7XG5cdG0yLm4xNCA9IG0xLm4xNCptMS5uMjMqbTEubjMyIC0gbTEubjEzKm0xLm4yNCptMS5uMzIgLSBtMS5uMTQqbTEubjIyKm0xLm4zMyArIG0xLm4xMiptMS5uMjQqbTEubjMzICsgbTEubjEzKm0xLm4yMiptMS5uMzQgLSBtMS5uMTIqbTEubjIzKm0xLm4zNDtcblx0bTIubjIxID0gbTEubjI0Km0xLm4zMyptMS5uNDEgLSBtMS5uMjMqbTEubjM0Km0xLm40MSAtIG0xLm4yNCptMS5uMzEqbTEubjQzICsgbTEubjIxKm0xLm4zNCptMS5uNDMgKyBtMS5uMjMqbTEubjMxKm0xLm40NCAtIG0xLm4yMSptMS5uMzMqbTEubjQ0O1xuXHRtMi5uMjIgPSBtMS5uMTMqbTEubjM0Km0xLm40MSAtIG0xLm4xNCptMS5uMzMqbTEubjQxICsgbTEubjE0Km0xLm4zMSptMS5uNDMgLSBtMS5uMTEqbTEubjM0Km0xLm40MyAtIG0xLm4xMyptMS5uMzEqbTEubjQ0ICsgbTEubjExKm0xLm4zMyptMS5uNDQ7XG5cdG0yLm4yMyA9IG0xLm4xNCptMS5uMjMqbTEubjQxIC0gbTEubjEzKm0xLm4yNCptMS5uNDEgLSBtMS5uMTQqbTEubjIxKm0xLm40MyArIG0xLm4xMSptMS5uMjQqbTEubjQzICsgbTEubjEzKm0xLm4yMSptMS5uNDQgLSBtMS5uMTEqbTEubjIzKm0xLm40NDtcblx0bTIubjI0ID0gbTEubjEzKm0xLm4yNCptMS5uMzEgLSBtMS5uMTQqbTEubjIzKm0xLm4zMSArIG0xLm4xNCptMS5uMjEqbTEubjMzIC0gbTEubjExKm0xLm4yNCptMS5uMzMgLSBtMS5uMTMqbTEubjIxKm0xLm4zNCArIG0xLm4xMSptMS5uMjMqbTEubjM0O1xuXHRtMi5uMzEgPSBtMS5uMjIqbTEubjM0Km0xLm40MSAtIG0xLm4yNCptMS5uMzIqbTEubjQxICsgbTEubjI0Km0xLm4zMSptMS5uNDIgLSBtMS5uMjEqbTEubjM0Km0xLm40MiAtIG0xLm4yMiptMS5uMzEqbTEubjQ0ICsgbTEubjIxKm0xLm4zMiptMS5uNDQ7XG5cdG0yLm4zMiA9IG0xLm4xNCptMS5uMzIqbTEubjQxIC0gbTEubjEyKm0xLm4zNCptMS5uNDEgLSBtMS5uMTQqbTEubjMxKm0xLm40MiArIG0xLm4xMSptMS5uMzQqbTEubjQyICsgbTEubjEyKm0xLm4zMSptMS5uNDQgLSBtMS5uMTEqbTEubjMyKm0xLm40NDtcblx0bTIubjMzID0gbTEubjEzKm0xLm4yNCptMS5uNDEgLSBtMS5uMTQqbTEubjIyKm0xLm40MSArIG0xLm4xNCptMS5uMjEqbTEubjQyIC0gbTEubjExKm0xLm4yNCptMS5uNDIgLSBtMS5uMTIqbTEubjIxKm0xLm40NCArIG0xLm4xMSptMS5uMjIqbTEubjQ0O1xuXHRtMi5uMzQgPSBtMS5uMTQqbTEubjIyKm0xLm4zMSAtIG0xLm4xMiptMS5uMjQqbTEubjMxIC0gbTEubjE0Km0xLm4yMSptMS5uMzIgKyBtMS5uMTEqbTEubjI0Km0xLm4zMiArIG0xLm4xMiptMS5uMjEqbTEubjM0IC0gbTEubjExKm0xLm4yMiptMS5uMzQ7XG5cdG0yLm40MSA9IG0xLm4yMyptMS5uMzIqbTEubjQxIC0gbTEubjIyKm0xLm4zMyptMS5uNDEgLSBtMS5uMjMqbTEubjMxKm0xLm40MiArIG0xLm4yMSptMS5uMzMqbTEubjQyICsgbTEubjIyKm0xLm4zMSptMS5uNDMgLSBtMS5uMjEqbTEubjMyKm0xLm40Mztcblx0bTIubjQyID0gbTEubjEyKm0xLm4zMyptMS5uNDEgLSBtMS5uMTMqbTEubjMyKm0xLm40MSArIG0xLm4xMyptMS5uMzEqbTEubjQyIC0gbTEubjExKm0xLm4zMyptMS5uNDIgLSBtMS5uMTIqbTEubjMxKm0xLm40MyArIG0xLm4xMSptMS5uMzIqbTEubjQzO1xuXHRtMi5uNDMgPSBtMS5uMTMqbTEubjIyKm0xLm40MSAtIG0xLm4xMiptMS5uMjMqbTEubjQxIC0gbTEubjEzKm0xLm4yMSptMS5uNDIgKyBtMS5uMTEqbTEubjIzKm0xLm40MiArIG0xLm4xMiptMS5uMjEqbTEubjQzIC0gbTEubjExKm0xLm4yMiptMS5uNDM7XG5cdG0yLm40NCA9IG0xLm4xMiptMS5uMjMqbTEubjMxIC0gbTEubjEzKm0xLm4yMiptMS5uMzEgKyBtMS5uMTMqbTEubjIxKm0xLm4zMiAtIG0xLm4xMSptMS5uMjMqbTEubjMyIC0gbTEubjEyKm0xLm4yMSptMS5uMzMgKyBtMS5uMTEqbTEubjIyKm0xLm4zMztcblx0bTIuJHNjYWxlKDEgLyBtMS5kZXRlcm1pbmFudCgpKTtcblxuXHRyZXR1cm4gbTI7XG59O1xuXG5NYXRyaXg0Lm1ha2VGcnVzdHVtID0gZnVuY3Rpb24oIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyICkge1xuXHR2YXIgbSwgeCwgeSwgYSwgYiwgYywgZDtcblxuXHRtID0gbmV3IE1hdHJpeDQoKTtcblx0eCA9IDIgKiBuZWFyIC8gKCByaWdodCAtIGxlZnQgKTtcblx0eSA9IDIgKiBuZWFyIC8gKCB0b3AgLSBib3R0b20gKTtcblx0YSA9ICggcmlnaHQgKyBsZWZ0ICkgLyAoIHJpZ2h0IC0gbGVmdCApO1xuXHRiID0gKCB0b3AgKyBib3R0b20gKSAvICggdG9wIC0gYm90dG9tICk7XG5cdGMgPSAtICggZmFyICsgbmVhciApIC8gKCBmYXIgLSBuZWFyICk7XG5cdGQgPSAtIDIgKiBmYXIgKiBuZWFyIC8gKCBmYXIgLSBuZWFyICk7XG5cblx0bS5uMTEgPSB4OyAgbS5uMTIgPSAwOyAgbS5uMTMgPSBhOyAgIG0ubjE0ID0gMDtcblx0bS5uMjEgPSAwOyAgbS5uMjIgPSB5OyAgbS5uMjMgPSBiOyAgIG0ubjI0ID0gMDtcblx0bS5uMzEgPSAwOyAgbS5uMzIgPSAwOyAgbS5uMzMgPSBjOyAgIG0ubjM0ID0gZDtcblx0bS5uNDEgPSAwOyAgbS5uNDIgPSAwOyAgbS5uNDMgPSAtIDE7IG0ubjQ0ID0gMDtcblxuXHRyZXR1cm4gbTtcbn07XG5cbk1hdHJpeDQubWFrZVBlcnNwZWN0aXZlID0gZnVuY3Rpb24oIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKSB7XG5cdHZhciB5bWF4LCB5bWluLCB4bWluLCB4bWF4O1xuXG5cdHltYXggPSBuZWFyICogTWF0aC50YW4oIGZvdiAqIE1hdGguUEkgLyAzNjAgKTtcblx0eW1pbiA9IC0geW1heDtcblx0eG1pbiA9IHltaW4gKiBhc3BlY3Q7XG5cdHhtYXggPSB5bWF4ICogYXNwZWN0O1xuXG5cdHJldHVybiBNYXRyaXg0Lm1ha2VGcnVzdHVtKCB4bWluLCB4bWF4LCB5bWluLCB5bWF4LCBuZWFyLCBmYXIgKTtcbn07XG5cbk1hdHJpeDQubWFrZU9ydGhvID0gZnVuY3Rpb24oIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkge1xuXHR2YXIgbSwgeCwgeSwgeiwgdywgaCwgcDtcblxuXHRtID0gbmV3IE1hdHJpeDQoKTtcblx0dyA9IHJpZ2h0IC0gbGVmdDtcblx0aCA9IGJvdHRvbSAtIHRvcDtcblx0cCA9IGZhciAtIG5lYXI7XG5cdHggPSAoIHJpZ2h0ICsgbGVmdCApIC8gdztcblx0eSA9ICggYm90dG9tICsgdG9wICkgLyBoO1xuXHR6ID0gKCBmYXIgKyBuZWFyICkgLyBwO1xuXG5cdG0ubjExID0gMiAvIHc7IG0ubjEyID0gMDsgICAgIG0ubjEzID0gMDsgICAgICBtLm4xNCA9IC14O1xuXHRtLm4yMSA9IDA7ICAgICBtLm4yMiA9IDIgLyBoOyBtLm4yMyA9IDA7ICAgICAgbS5uMjQgPSAteTtcblx0bS5uMzEgPSAwOyAgICAgbS5uMzIgPSAwOyAgICAgbS5uMzMgPSAtMiAvIHA7IG0ubjM0ID0gLXo7XG5cdG0ubjQxID0gMDsgICAgIG0ubjQyID0gMDsgICAgIG0ubjQzID0gMDsgICAgICBtLm40NCA9IDE7XG5cblx0cmV0dXJuIG07XG59O1xuXG5cbi8qXG4gKiBDYW1lcmEgY2xhc3MgYmFzZWQgb24gdGhyZWUuanMgaHR0cDovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzLCBDb3B5cmlnaHQgKGMpIE1yLmRvb2IgaHR0cDovL21yZG9vYi5jb20vLCBNSVQgTGljZW5zZSBodHRwOi8vZ2l0aHViLmNvbS9tcmRvb2IvdGhyZWUuanMvYmxvYi9tYXN0ZXIvTElDRU5TRSBcbiAqL1xuXG52YXIgQ2FtZXJhID0gZnVuY3Rpb24gKGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIpIHtcblx0dGhpcy5wcm9qZWN0aW9uTWF0cml4ID0gTWF0cml4NC5tYWtlUGVyc3BlY3RpdmUoZm92LCBhc3BlY3QsIG5lYXIsIGZhcik7XG59O1xuXG5DYW1lcmEucHJvdG90eXBlID0ge1xuICBwb3NpdGlvbjogbmV3IFZlY3RvcjMsXG4gIHRhcmdldDoge1xuICAgIHBvc2l0aW9uOiBuZXcgVmVjdG9yM1xuICB9LFxuICB1cDogbmV3IFZlY3RvcjMoMCwgMSwgMCksXG4gIG1hdHJpeDogbmV3IE1hdHJpeDQsXG4gIFxuICB1cGRhdGVNYXRyaXg6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMubWF0cml4Lmxvb2tBdCh0aGlzLnBvc2l0aW9uLCB0aGlzLnRhcmdldC5wb3NpdGlvbiwgdGhpcy51cCk7XG4gIH1cbn07XG5cblxuQ2FudmFzLkJhc2VbJzNEJ10gPSBuZXcgQ2xhc3Moe1xuICBJbXBsZW1lbnRzOiBDYW52YXMuQmFzZVsnMkQnXSxcbiAgXG4gIHByb2dyYW06IG51bGwsXG4gIGNhbWVyYTogbnVsbCxcbiAgXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uKHZpeikge1xuICAgIHRoaXMudml6ID0gdml6O1xuICAgIHRoaXMub3B0ID0gdml6LmNvbmZpZztcbiAgICB0aGlzLnNpemUgPSBmYWxzZTtcbiAgICB0aGlzLmNyZWF0ZUNhbnZhcygpO1xuICAgIHRoaXMuaW5pdFdlYkdMKCk7XG4gICAgdGhpcy5pbml0Q2FtZXJhKCk7XG4gIH0sXG4gIFxuICBpbml0V2ViR0w6IGZ1bmN0aW9uKCkge1xuICAgIC8vaW5pdGlhbGl6ZSBjb250ZXh0XG4gICAgdmFyIGdsID0gdGhpcy5nZXRDdHgoKTtcbiAgICAvL2dldCB2aWV3cG9ydCBzaXplXG4gICAgdmFyIHNpemUgPSB0aGlzLmdldFNpemUoKTtcbiAgICAvL2NvbXBpbGUgYW5kIGdldCBzaGFkZXJzXG4gICAgdmFyIGZyYWdtZW50U2hhZGVyID0gdGhpcy5nZXRTaGFkZXIoQ2FudmFzLkJhc2VbJzNEJ10uRnJhZ21lbnRTaGFkZXIsIGdsLkZSQUdNRU5UX1NIQURFUik7XG4gICAgdmFyIHZlcnRleFNoYWRlciA9IHRoaXMuZ2V0U2hhZGVyKENhbnZhcy5CYXNlWyczRCddLlZlcnRleFNoYWRlciwgZ2wuVkVSVEVYX1NIQURFUik7XG4gICAgLy9jcmVhdGUgcHJvZ3JhbSBhbmQgbGluayBzaGFkZXJzXG4gICAgdmFyIHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7XG4gICAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIHZlcnRleFNoYWRlcik7XG4gICAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIGZyYWdtZW50U2hhZGVyKTtcbiAgICBnbC5saW5rUHJvZ3JhbShwcm9ncmFtKTtcbiAgICBpZiAoIWdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMpKSB7XG4gICAgICB0aHJvdyBcIkNvdWxkIG5vdCBsaW5rIHNoYWRlcnNcIjtcbiAgICB9XG4gICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTtcbiAgICAvL2JpbmQgbmFtZSB0byB2YXJpYWJsZSBsb2NhdGlvbiBpbiBzaGFkZXJzXG4gICAgJC5leHRlbmQocHJvZ3JhbSwge1xuICAgICAgJ3ZpZXdNYXRyaXgnOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgJ3ZpZXdNYXRyaXgnKSxcbiAgICAgICdwcm9qZWN0aW9uTWF0cml4JzogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdwcm9qZWN0aW9uTWF0cml4JyksXG4gICAgICAnbm9ybWFsTWF0cml4JzogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdub3JtYWxNYXRyaXgnKSxcbiAgICAgICdjb2xvcic6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAnY29sb3InKSxcbiAgICAgIFxuICAgICAgJ2VuYWJsZUxpZ2h0aW5nJzogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdlbmFibGVMaWdodGluZycpLFxuICAgICAgJ2FtYmllbnRDb2xvcic6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAnYW1iaWVudENvbG9yJyksXG4gICAgICAnZGlyZWN0aW9uYWxDb2xvcic6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAnZGlyZWN0aW9uYWxDb2xvcicpLFxuICAgICAgJ2xpZ2h0aW5nRGlyZWN0aW9uJzogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdsaWdodGluZ0RpcmVjdGlvbicpLFxuICAgICAgXG4gICAgICAncG9zaXRpb24nOiBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAncG9zaXRpb24nKSxcbiAgICAgICdub3JtYWwnOiBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnbm9ybWFsJyksXG4gICAgfSk7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkocHJvZ3JhbS5wb3NpdGlvbik7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkocHJvZ3JhbS5ub3JtYWwpO1xuICAgIHRoaXMucHJvZ3JhbSA9IHByb2dyYW07XG4gICAgLy9zZXQgZ2VuZXJhbCByZW5kZXJpbmcgb3B0aW9uc1xuICAgIGdsLmNsZWFyQ29sb3IoMCwgMCwgMCwgMCk7XG4gICAgZ2wuY2xlYXJEZXB0aCgxKTtcblxuICAgIGdsLmVuYWJsZShnbC5ERVBUSF9URVNUKTtcbiAgICBnbC5kZXB0aEZ1bmMoZ2wuTEVRVUFMKTtcblxuICAgIGdsLmVuYWJsZShnbC5CTEVORCk7XG4gICAgZ2wuYmxlbmRGdW5jKGdsLlNSQ19BTFBIQSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XG4gICAgXG4gICAgZ2wudmlld3BvcnQoMCwgMCwgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpO1xuICB9LFxuICBcbiAgaW5pdENhbWVyYTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNpemUgPSB0aGlzLmdldFNpemUoKTtcbiAgICB2YXIgY2FtZXJhID0gbmV3IENhbWVyYSg3NSwgc2l6ZS53aWR0aCAvIHNpemUuaGVpZ2h0LCAxLCAxMDAwKTtcbiAgICBjYW1lcmEucG9zaXRpb24ueiA9IDUwMDtcbiAgICB0aGlzLmNhbWVyYSA9IGNhbWVyYTtcbiAgfSxcbiAgXG4gIGdldFNoYWRlcjogZnVuY3Rpb24oc3JjLCB0eXBlKSB7XG4gICAgdmFyIGdsID0gdGhpcy5jdHg7XG4gICAgdmFyIHNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcih0eXBlKTtcbiAgICBnbC5zaGFkZXJTb3VyY2Uoc2hhZGVyLCBzcmMpO1xuICAgIGdsLmNvbXBpbGVTaGFkZXIoc2hhZGVyKTtcbiAgICBpZiAoIWdsLmdldFNoYWRlclBhcmFtZXRlcihzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSkge1xuICAgICAgdmFyIGluZm8gPSBnbC5nZXRTaGFkZXJJbmZvTG9nKHNoYWRlcik7XG4gICAgICB0aHJvdyBcIkNvdWxkIG5vdCBjb21waWxlIHNoYWRlciBzcmM6IFwiICsgaW5mbztcbiAgICB9XG4gICAgcmV0dXJuIHNoYWRlcjtcbiAgfSxcblxuICBnZXRDdHg6IGZ1bmN0aW9uKCkge1xuICAgIGlmKCF0aGlzLmN0eCkgXG4gICAgICByZXR1cm4gdGhpcy5jdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnKTtcbiAgICByZXR1cm4gdGhpcy5jdHg7XG4gIH0sXG4gIFxuICByZXNpemU6IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuZ2V0U2l6ZSgpLFxuICAgICAgICBjYW52YXMgPSB0aGlzLmNhbnZhcyxcbiAgICAgICAgc3R5bGVzID0gY2FudmFzLnN0eWxlLFxuICAgICAgICBnbCA9IHRoaXMuZ2V0Q3R4KCk7XG4gICAgdGhpcy5zaXplID0gZmFsc2U7XG4gICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICBzdHlsZXMud2lkdGggPSB3aWR0aCArIFwicHhcIjtcbiAgICBzdHlsZXMuaGVpZ2h0ID0gaGVpZ2h0ICsgXCJweFwiO1xuICAgIGdsLnZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgdGhpcy50cmFuc2xhdGVPZmZzZXRYID1cbiAgICAgIHRoaXMudHJhbnNsYXRlT2Zmc2V0WSA9IDA7XG4gICAgdGhpcy5zY2FsZU9mZnNldFggPSBcbiAgICAgIHRoaXMuc2NhbGVPZmZzZXRZID0gMTtcbiAgICB0aGlzLmNsZWFyKCk7XG4gICAgdGhpcy52aXoucmVzaXplKHdpZHRoLCBoZWlnaHQsIHRoaXMpO1xuICB9LFxuXG4gIHRyYW5zbGF0ZVRvQ2VudGVyOiAkLmVtcHR5LFxuICBzY2FsZTogJC5lbXB0eSxcbiAgXG4gIHRyYW5zbGF0ZTogZnVuY3Rpb24oeCwgeSwgeiwgZGlzYWJsZVBsb3QpIHtcbiAgICB2YXIgc3ggPSB0aGlzLnNjYWxlT2Zmc2V0WCxcbiAgICAgICAgc3kgPSB0aGlzLnNjYWxlT2Zmc2V0WTtcbiAgICB0aGlzLnRyYW5zbGF0ZU9mZnNldFggKz0geCpzeDtcbiAgICB0aGlzLnRyYW5zbGF0ZU9mZnNldFkgKz0geSpzeTtcbiAgICB2YXIgcG9zID0gdGhpcy5jYW1lcmEucG9zaXRpb247XG4gICAgcG9zLnggKz0geDtcbiAgICBwb3MueSArPSB5O1xuICAgIHBvcy56ICs9IHo7XG4gICAgIWRpc2FibGVQbG90ICYmIHRoaXMucGxvdCgpO1xuICB9LFxuXG4gIGNsZWFyOiBmdW5jdGlvbigpe1xuICAgIHZhciBnbCA9IHRoaXMuZ2V0Q3R4KCk7XG4gICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVCB8IGdsLkRFUFRIX0JVRkZFUl9CSVQpO1xuICAgIC8vVE9ETyhuaWNvKSBpcyB0aGlzIE9LPyBJIG1lYW4sIHRvIHB1dCB0aGlzIGxpbmUgaGVyZS5cbiAgICB0aGlzLmNhbWVyYS51cGRhdGVNYXRyaXgoKTtcbiAgfSxcbiAgXG4gIHBsb3Q6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgICB0aGlzLnZpei5wbG90KHRoaXMpO1xuICB9XG59KTtcblxuLy9TaGFkZXJzIGNvZGVcbkNhbnZhcy5CYXNlWyczRCddLkZyYWdtZW50U2hhZGVyID0gW1xuICBcIiNpZmRlZiBHTF9FU1wiLFxuICBcInByZWNpc2lvbiBoaWdocCBmbG9hdDtcIixcbiAgXCIjZW5kaWZcIixcbiAgXG4gIFwidmFyeWluZyB2ZWM0IHZjb2xvcjtcIixcbiAgXCJ2YXJ5aW5nIHZlYzMgbGlnaHRXZWlnaHRpbmc7XCIsXG4gIFxuICBcInZvaWQgbWFpbigpe1wiLFxuICBcbiAgICBcImdsX0ZyYWdDb2xvciA9IHZlYzQodmNvbG9yLnJnYiAqIGxpZ2h0V2VpZ2h0aW5nLCB2Y29sb3IuYSk7XCIsXG4gIFxuICBcIn1cIlxuXS5qb2luKFwiXFxuXCIpO1xuXG5DYW52YXMuQmFzZVsnM0QnXS5WZXJ0ZXhTaGFkZXIgPSBbXG4gIFwiYXR0cmlidXRlIHZlYzMgcG9zaXRpb247XCIsXG4gIFwiYXR0cmlidXRlIHZlYzMgbm9ybWFsO1wiLFxuICBcInVuaWZvcm0gdmVjNCBjb2xvcjtcIixcbiAgXG4gIFwidW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7XCIsXG4gIFwidW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7XCIsXG4gIFwidW5pZm9ybSBtYXQ0IG5vcm1hbE1hdHJpeDtcIixcblxuICBcInVuaWZvcm0gYm9vbCBlbmFibGVMaWdodGluZztcIixcbiAgXCJ1bmlmb3JtIHZlYzMgYW1iaWVudENvbG9yO1wiLFxuICBcInVuaWZvcm0gdmVjMyBkaXJlY3Rpb25hbENvbG9yO1wiLFxuICBcInVuaWZvcm0gdmVjMyBsaWdodGluZ0RpcmVjdGlvbjtcIixcbiAgXG4gIFwidmFyeWluZyB2ZWM0IHZjb2xvcjtcIixcbiAgXCJ2YXJ5aW5nIHZlYzMgbGlnaHRXZWlnaHRpbmc7XCIsXG4gIFxuICBcInZvaWQgbWFpbih2b2lkKSB7XCIsXG4gIFxuICAgIFwiaWYoIWVuYWJsZUxpZ2h0aW5nKSB7XCIsXG4gICAgICBcImxpZ2h0V2VpZ2h0aW5nID0gdmVjMygxLjAsIDEuMCwgMS4wKTtcIixcbiAgICBcIn0gZWxzZSB7XCIsXG4gICAgICBcInZlYzQgdHJhbnNmb3JtZWROb3JtYWwgPSBub3JtYWxNYXRyaXggKiB2ZWM0KG5vcm1hbCwgMS4wKTtcIixcbiAgICAgIFwiZmxvYXQgZGlyZWN0aW9uYWxMaWdodFdlaWdodGluZyA9IG1heChkb3QodHJhbnNmb3JtZWROb3JtYWwueHl6LCBsaWdodGluZ0RpcmVjdGlvbiksIDAuMCk7XCIsXG4gICAgICBcImxpZ2h0V2VpZ2h0aW5nID0gYW1iaWVudENvbG9yICsgZGlyZWN0aW9uYWxDb2xvciAqIGRpcmVjdGlvbmFsTGlnaHRXZWlnaHRpbmc7XCIsXG4gICAgXCJ9XCIsXG4gICAgXG4gICAgXCJ2Y29sb3IgPSBjb2xvcjtcIixcbiAgICBcImdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIHZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XCIsXG4gIFxuICBcIn1cIlxuXS5qb2luKFwiXFxuXCIpO1xuXG4vKlxuICogU29tZSBvZiB0aGUgZ2VvbWV0cmllcyB3aGVyZSBpbnNwaXJlZCBieSB0aHJlZS5qcyBodHRwOi8vZ2l0aHViLmNvbS9tcmRvb2IvdGhyZWUuanMsIENvcHlyaWdodCAoYykgTXIuZG9vYiBodHRwOi8vbXJkb29iLmNvbS8sIE1JVCBMaWNlbnNlIGh0dHA6Ly9naXRodWIuY29tL21yZG9vYi90aHJlZS5qcy9ibG9iL21hc3Rlci9MSUNFTlNFIFxuICovXG5cbnZhciBPM0QgPSB7fTtcblxuJGppdC5PM0QgPSBPM0Q7XG5cbk8zRC5iYXNlID0gbmV3IENsYXNzKHtcbiAgLy9hcnJheSBvZiB7IHgsIHksIHogfSBvZiBmbG9hdFxuICB2ZXJ0aWNlczogW10sXG4gIC8vYXJyYXkgb2YgeyBhLCBiLCBjLCBkPyB9IG9mIGludFxuICBmYWNlczogW10sXG4gIC8vdXBkYXRlZCBvbiBwbG90Tm9kZS9wbG90RWRnZVxuICBwb3NpdGlvbjogbmV3IFZlY3RvcjMsXG4gIHJvdGF0aW9uOiBuZXcgVmVjdG9yMyxcbiAgc2NhbGU6IG5ldyBWZWN0b3IzKDEsIDEsIDEpLFxuICAvL2ludHJpbnNpYyBjb29yZGluYXRlc1xuICBtYXRyaXg6IG5ldyBNYXRyaXg0LFxuICBcbiAgdXBkYXRlOiBmdW5jdGlvbihlbGVtKSB7XG4gICAgaWYoZWxlbS5ub2RlRnJvbSAmJiBlbGVtLm5vZGVUbykge1xuICAgICAgdGhpcy51cGRhdGVFZGdlKGVsZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZU5vZGUoZWxlbSk7XG4gICAgfVxuICB9LFxuICBcbiAgdXBkYXRlTm9kZTogJC5lbXB0eSxcbiAgXG4gIHVwZGF0ZUVkZ2U6IGZ1bmN0aW9uKGVsZW0pIHtcbiAgICB0aGlzLnVwZGF0ZU5vZGUoZWxlbSk7XG4gIH0sXG5cbiAgdXBkYXRlTWF0cml4OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcG9zID0gdGhpcy5wb3NpdGlvbixcbiAgICAgICAgcm90ID0gdGhpcy5yb3RhdGlvbixcbiAgICAgICAgc2NhbGUgPSB0aGlzLnNjYWxlLFxuICAgICAgICBtYXRyaXggPSB0aGlzLm1hdHJpeDtcbiAgICBcbiAgICBtYXRyaXguaWRlbnRpdHkoKTtcbiAgXG4gICAgbWF0cml4LiRtdWx0aXBseSggTWF0cml4NC50cmFuc2xhdGlvbk1hdHJpeCggcG9zLngsIHBvcy55LCBwb3MueiApICk7XG4gICAgbWF0cml4LiRtdWx0aXBseSggTWF0cml4NC5yb3RhdGlvblhNYXRyaXgoIHJvdC54ICkgKTtcbiAgICBtYXRyaXguJG11bHRpcGx5KCBNYXRyaXg0LnJvdGF0aW9uWU1hdHJpeCggcm90LnkgKSApO1xuICAgIG1hdHJpeC4kbXVsdGlwbHkoIE1hdHJpeDQucm90YXRpb25aTWF0cml4KCByb3QueiApICk7XG4gICAgbWF0cml4LiRtdWx0aXBseSggTWF0cml4NC5zY2FsZU1hdHJpeCggc2NhbGUueCwgc2NhbGUueSwgc2NhbGUueiApICk7XG4gIH0sXG4gIC8vY29tcHV0ZSBmYWNlcyBub3JtYWxzXG4gIGNvbXB1dGVOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgZj0wLCB2cz10aGlzLnZlcnRpY2VzLCBmcz10aGlzLmZhY2VzLCBsZW49ZnMubGVuZ3RoOyBmIDwgbGVuOyBmKyspIHtcbiAgICAgIHZhciB2YSA9IHZzW2ZzW2ZdLmFdLFxuICAgICAgICAgIHZiID0gdnNbZnNbZl0uYl0sXG4gICAgICAgICAgdmMgPSB2c1tmc1tmXS5jXSxcbiAgICAgICAgICBjYiA9IG5ldyBWZWN0b3IzLFxuICAgICAgICAgIGFiID0gbmV3IFZlY3RvcjM7XG4gICAgICBcbiAgICAgIGNiLnN1Yih2YywgdmIpO1xuICAgICAgYWIuc3ViKHZhLCB2Yik7XG4gICAgICBjYi4kY3Jvc3MoYWIpO1xuXG4gICAgICBpZiAoIWNiLmlzWmVybygpKSBjYi5ub3JtYWxpemUoKTtcbiAgICAgIFxuICAgICAgZnNbZl0ubm9ybWFsID0gY2I7XG4gICAgfVxuICB9XG59KTtcblxuLy9Jc29DdWJlXG5mdW5jdGlvbiBJc29DdWJlKCkge1xuICB2YXIgdnMgPSB0aGlzLnZlcnRpY2VzLFxuICAgICAgZjQgPSB0aGlzLmZhY2VzLFxuICAgICAgdnNwID0gZnVuY3Rpb24oeCwgeSwgeikgeyB2cy5wdXNoKHsgeDogeCwgeTogeSwgejogeiB9KTsgfSxcbiAgICAgIGY0cCA9IGZ1bmN0aW9uKGEsIGIsIGMsIGQpIHsgZjQucHVzaCh7IGE6IGEsIGI6IGIsIGM6IGMsIGQ6IGQgfSk7IH07XG4gIFxuICB2c3AoIDEsICAxLCAtMSk7XG4gIHZzcCggMSwgLTEsIC0xKTtcbiAgdnNwKC0xLCAtMSwgLTEpO1xuICB2c3AoLTEsICAxLCAtMSk7XG4gIHZzcCggMSwgIDEsICAxKTtcbiAgdnNwKCAxLCAtMSwgIDEpO1xuICB2c3AoLTEsIC0xLCAgMSk7XG4gIHZzcCgtMSwgIDEsICAxKTtcbiAgXG4gIGY0cCgwLCAxLCAyLCAzKTtcbiAgZjRwKDQsIDcsIDYsIDUpO1xuICBmNHAoMCwgNCwgNSwgMSk7XG4gIGY0cCgxLCA1LCA2LCAyKTtcbiAgZjRwKDIsIDYsIDcsIDMpO1xuICBmNHAoNCwgMCwgMywgNyk7XG59XG5cbi8vQ3ViZVxuTzNELmN1YmUgPSBuZXcgQ2xhc3Moe1xuICBJbXBsZW1lbnRzOiBPM0QuYmFzZSxcbiAgXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuICAgIElzb0N1YmUuY2FsbCh0aGlzKTtcbiAgICB0aGlzLmNvbXB1dGVOb3JtYWxzKCk7XG4gIH0sXG4gIFxuICB1cGRhdGVOb2RlOiBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgZGltID0gb2JqLmdldERhdGEoJ2RpbScpLFxuICAgICAgICBwb3MgPSBvYmoucG9zO1xuICAgIFxuICAgIHRoaXMucG9zaXRpb24uc2V0Yyhwb3MueCwgcG9zLnksIHBvcy56KTtcbiAgICB0aGlzLnNjYWxlLnNldGMoZGltLCBkaW0sIGRpbSk7XG4gICAgdGhpcy51cGRhdGVNYXRyaXgoKTtcbiAgfVxufSk7XG5cbk8zRC5zcGhlcmUgPSBuZXcgQ2xhc3Moe1xuICBJbXBsZW1lbnRzOiBPM0QuYmFzZSxcbiAgXG4gIHJhZGl1czogMSxcbiAgc2VnbWVudHNfd2lkdGg6IDEwLFxuICBzZWdtZW50c19oZWlnaHQ6IDEwLFxuICBcbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJhZGl1cyA9IHRoaXMucmFkaXVzLFxuICAgICAgICBzZWdtZW50c193aWR0aCA9IHRoaXMuc2VnbWVudHNfd2lkdGgsXG4gICAgICAgIHNlZ21lbnRzX2hlaWdodCA9IHRoaXMuc2VnbWVudHNfaGVpZ2h0LFxuICAgICAgICBncmlkWCA9IHNlZ21lbnRzX3dpZHRoIHx8IDgsXG4gICAgICAgIGdyaWRZID0gc2VnbWVudHNfaGVpZ2h0IHx8IDYsXG4gICAgICAgIGNvcyA9IE1hdGguY29zLFxuICAgICAgICBzaW4gPSBNYXRoLnNpbixcbiAgICAgICAgbWF4ID0gTWF0aC5tYXgsXG4gICAgICAgIHBpID0gTWF0aC5QSTtcbiAgXG4gICAgdmFyIGlIb3IgPSBtYXgoMywgZ3JpZFgpLFxuICAgICAgICBpVmVyID0gbWF4KDIsIGdyaWRZKSxcbiAgICAgICAgYVZ0YyA9IFtdO1xuICBcbiAgICBmb3IodmFyIGo9MDsgaiA8IChpVmVyICsgMSkgOyBqKyspIHtcbiAgICAgIHZhciBmUmFkMSA9IGogLyBpVmVyLFxuICAgICAgICAgIGZaID0gcmFkaXVzICogY29zKGZSYWQxICogcGkpLFxuICAgICAgICAgIGZSZHMgPSByYWRpdXMgKiBzaW4oZlJhZDEgKiBwaSksXG4gICAgICAgICAgYVJvdyA9IFtdLFxuICAgICAgICAgIG9WdHggPSAwO1xuXG4gICAgICBmb3IodmFyIGk9MDsgaTxpSG9yOyBpKyspIHtcbiAgICAgICAgdmFyIGZSYWQyID0gMiAqIGkgLyBpSG9yLFxuICAgICAgICAgICAgZlggPSBmUmRzICogTWF0aC5zaW4oZlJhZDIgKiBwaSksXG4gICAgICAgICAgICBmWSA9IGZSZHMgKiBNYXRoLmNvcyhmUmFkMiAqIHBpKTtcbiAgICAgICAgaWYgKCEoKCBqID09IDAgfHwgaiA9PSBpVmVyKSAmJiBpID4gMCkpIHtcbiAgICAgICAgICBvVnR4ID0gdGhpcy52ZXJ0aWNlcy5wdXNoKHsgeDogZlksIHk6IGZaLCB6OiBmWH0pIC0gMTtcbiAgICAgICAgfVxuICAgICAgICBhUm93LnB1c2gob1Z0eCk7XG4gICAgICB9XG4gICAgICBhVnRjLnB1c2goYVJvdyk7XG4gICAgfVxuICBcbiAgICB2YXIgaVZlck51bSA9IGFWdGMubGVuZ3RoO1xuICAgIGZvciAodmFyIGo9MDsgajxpVmVyTnVtOyBqKyspIHtcbiAgICAgIHZhciBpSG9yTnVtID0gYVZ0Y1tqXS5sZW5ndGg7XG4gICAgICBpZiAoaiA+IDApIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGk8aUhvck51bTsgaSsrICkge1xuICAgICAgICAgIHZhciBiRW5kID0gaSA9PSAoIGlIb3JOdW0gLSAxICk7XG4gICAgICAgICAgdmFyIGFQMSA9IGFWdGNbal1bIGJFbmQgPyAwIDogaSArIDEgXTtcbiAgICAgICAgICB2YXIgYVAyID0gYVZ0Y1tqXVsgKCBiRW5kID8gaUhvck51bSAtIDEgOiBpICkgXTtcbiAgICAgICAgICB2YXIgYVAzID0gYVZ0Y1tqIC0xXVsgKCBiRW5kID8gaUhvck51bSAtIDEgOiBpICkgXTtcbiAgICAgICAgICB2YXIgYVA0ID0gYVZ0Y1tqIC0xXVsgYkVuZCA/IDAgOiBpICsgMSBdO1xuICBcbiAgICAgICAgICBpZihqIDwgKCBhVnRjLmxlbmd0aCAtIDEpKSB7XG4gICAgICAgICAgICB0aGlzLmZhY2VzLnB1c2goeyBhOiBhUDEsIGI6IGFQMiwgYzogYVAzIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZihqID4gMSkge1xuICAgICAgICAgICAgdGhpcy5mYWNlcy5wdXNoKHsgYTogYVAxLCBiOiBhUDMsIGM6IGFQNCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jb21wdXRlTm9ybWFscygpO1xuICB9LFxuICBcbiAgdXBkYXRlTm9kZTogZnVuY3Rpb24ob2JqKSB7XG4gICAgdmFyIGRpbSA9IG9iai5nZXREYXRhKCdkaW0nKSxcbiAgICAgICAgcG9zID0gb2JqLnBvcztcbiAgICBcbiAgICB0aGlzLnBvc2l0aW9uLnNldGMocG9zLngsIHBvcy55LCBwb3Mueik7XG4gICAgdGhpcy5zY2FsZS5zZXRjKGRpbSwgZGltLCBkaW0pO1xuICAgIHRoaXMudXBkYXRlTWF0cml4KCk7XG4gIH1cblxufSk7XG5cblxuTzNELnR1YmUgPSBuZXcgQ2xhc3Moe1xuICBJbXBsZW1lbnRzOiBPM0QuYmFzZSxcbiAgXG4gIG51bVNlZ3M6IDEwLFxuICBkaW06IDEsXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB2cyA9IHRoaXMudmVydGljZXMsXG4gICAgICAgIGY0ID0gdGhpcy5mYWNlcyxcbiAgICAgICAgdnNwID0gZnVuY3Rpb24oeCwgeSwgeikgeyB2cy5wdXNoKHsgeDogeCwgeTogeSwgejogeiB9KTsgfSxcbiAgICAgICAgZjRwID0gZnVuY3Rpb24oYSwgYiwgYywgZCkgeyBmNC5wdXNoKHsgYTogYSwgYjogYiwgYzogYywgZDogZCB9KTsgfTtcblxuICAgIHZhciBzY29wZSA9IHRoaXMsXG4gICAgICAgIHNpbiA9IE1hdGguc2luLFxuICAgICAgICBjb3MgPSBNYXRoLmNvcyxcbiAgICAgICAgcGkgPSBNYXRoLlBJLFxuICAgICAgICBwaTIgPSBwaSAqIDIsXG4gICAgICAgIG51bVNlZ3MgPSB0aGlzLm51bVNlZ3MsXG4gICAgICAgIHRvcFJhZCA9IHRoaXMuZGltLFxuICAgICAgICBib3RSYWQgPSB0aGlzLmRpbTtcbiAgXG4gICAgLy8gVG9wIGNpcmNsZSB2ZXJ0aWNlc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtU2VnczsgaSsrKSB7XG4gICAgICB2c3Aoc2luKHBpMiAqIGkgLyBudW1TZWdzKSAqIHRvcFJhZCwgY29zKHBpMiAqIGkgLyBudW1TZWdzKSAqIHRvcFJhZCwgLTAuNSk7XG4gICAgfVxuICAgIC8vIEJvdHRvbSBjaXJjbGUgdmVydGljZXNcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVNlZ3M7IGkrKykge1xuICAgICAgdnNwKHNpbihwaTIgKiBpIC8gbnVtU2VncykgKiBib3RSYWQsIGNvcyhwaTIgKiBpIC8gbnVtU2VncykgKiBib3RSYWQsIDAuNSk7XG4gICAgfVxuICAgIC8vIEJvZHkgXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1TZWdzOyBpKyspIHtcbiAgICAgIGY0cChpLCAoaSArIDEpICUgbnVtU2VncywgbnVtU2VncyArIChpICsgMSkgJSBudW1TZWdzLCBpICsgbnVtU2Vncyk7XG4gICAgfVxuICAgIHRoaXMuY29tcHV0ZU5vcm1hbHMoKTtcbiAgfSxcbiAgXG4gIHVwZGF0ZUVkZ2U6IGZ1bmN0aW9uKG9iaikge1xuICAgIHZhciBsaW5lV2lkdGggPSBvYmouZ2V0RGF0YSgnbGluZVdpZHRoJyksXG4gICAgICAgIG5vZGVGcm9tID0gb2JqLm5vZGVGcm9tLFxuICAgICAgICBub2RlVG8gPSBvYmoubm9kZVRvLFxuICAgICAgICBub2RlRnJvbVBvcyA9IG5vZGVGcm9tLnBvcyxcbiAgICAgICAgbm9kZVRvUG9zID0gbm9kZVRvLnBvcyxcbiAgICAgICAgZGlzdCA9IG5vZGVGcm9tUG9zLmRpc3RhbmNlVG8obm9kZVRvUG9zKSxcbiAgICAgICAgbWlkZGxlID0gbmV3IFZlY3RvcjMsXG4gICAgICAgIGN1cnJlbnREaXIgPSBuZXcgVmVjdG9yMygwLCAwLCAxKSxcbiAgICAgICAgZHZlYyA9IG5ldyBWZWN0b3IzO1xuICAgIFxuICAgIG1pZGRsZS5hZGQobm9kZUZyb21Qb3MsIG5vZGVUb1BvcykuJHNjYWxlKDAuNSk7XG4gICAgZHZlYy5zdWIobm9kZVRvUG9zLCBub2RlRnJvbVBvcykubm9ybWFsaXplKCk7XG4gICAgXG4gICAgdmFyIGMgPSBkdmVjLmRvdChjdXJyZW50RGlyKSxcbiAgICAgICAgeGMgPSBkdmVjLmRvdChuZXcgVmVjdG9yMygxLCAwLCAwKSksXG4gICAgICAgIHljID0gZHZlYy5kb3QobmV3IFZlY3RvcjMoMCwgMSwgMCkpLFxuICAgICAgICB0ID0gMSAtIGMsXG4gICAgICAgIHJvdEFuZ2xlID0gTWF0aC5hY29zKGMpLFxuICAgICAgICBzID0gTWF0aC5zaW4ocm90QW5nbGUpLFxuICAgICAgICByb3RBeGlzID0gY3VycmVudERpci4kY3Jvc3MoZHZlYykubm9ybWFsaXplKCksXG4gICAgICAgIHggPSByb3RBeGlzLngsXG4gICAgICAgIHkgPSByb3RBeGlzLnksXG4gICAgICAgIHogPSByb3RBeGlzLno7XG4gICAgXG4gICAgdmFyIHJvdCA9IG5ldyBNYXRyaXg0KCk7XG4gICAgcm90Lm4xMSA9IHQgKiB4ICogeCArIGM7XG4gICAgcm90Lm4xMiA9IHQgKiB4ICogeSAtIHMgKiB6O1xuICAgIHJvdC5uMTMgPSB0ICogeCAqIHogKyBzICogeTtcbiAgICByb3QubjIxID0gdCAqIHggKiB5ICsgcyAqIHo7XG4gICAgcm90Lm4yMiA9IHQgKiB5ICogeSArIGM7XG4gICAgcm90Lm4yMyA9IHQgKiB5ICogeiAtIHMgKiB4O1xuICAgIHJvdC5uMzEgPSB0ICogeCAqIHogLSBzICogeTtcbiAgICByb3QubjMyID0gdCAqIHkgKiB6ICsgcyAqIHg7XG4gICAgcm90Lm4zMyA9IHQgKiB6ICogeiArIGM7XG4gICAgdGhpcy5yb3RhdGlvbk1hdHJpeCA9IHJvdDtcbiAgICB0aGlzLnNjYWxlLnNldGMobGluZVdpZHRoLCBsaW5lV2lkdGgsIGRpc3QpO1xuICAgIHRoaXMucG9zaXRpb24uc2V0YyhtaWRkbGUueCwgbWlkZGxlLnksIG1pZGRsZS56KTtcbiAgICB0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuICB9LFxuICBcbiAgdXBkYXRlTWF0cml4OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcG9zID0gdGhpcy5wb3NpdGlvbixcbiAgICAgICAgc2NhbGUgPSB0aGlzLnNjYWxlLFxuICAgICAgICBtYXRyaXggPSB0aGlzLm1hdHJpeDtcbiAgICBcbiAgICBtYXRyaXguaWRlbnRpdHkoKTtcbiAgXG4gICAgbWF0cml4LiRtdWx0aXBseSggTWF0cml4NC50cmFuc2xhdGlvbk1hdHJpeCggcG9zLngsIHBvcy55LCBwb3MueiApICk7XG4gICAgbWF0cml4LiRtdWx0aXBseSggdGhpcy5yb3RhdGlvbk1hdHJpeCApO1xuICAgIG1hdHJpeC4kbXVsdGlwbHkoIE1hdHJpeDQuc2NhbGVNYXRyaXgoIHNjYWxlLngsIHNjYWxlLnksIHNjYWxlLnogKSApO1xuICB9XG5cbn0pOyBcblxuXG4vKlxuICogRmlsZTogTGF5b3V0cy5Gb3JjZURpcmVjdGVkM0QuanNcbiAqXG4qL1xuXG4vKlxuICogQ2xhc3M6IExheW91dHMuRm9yY2VEaXJlY3RlZDNEXG4gKiBcbiAqIEltcGxlbWVudHMgYSBGb3JjZSBEaXJlY3RlZCBMYXlvdXQuXG4gKiBcbiAqIEltcGxlbWVudGVkIEJ5OlxuICogXG4gKiA8Rm9yY2VEaXJlY3RlZDNEPlxuICogXG4gKi9cbkxheW91dHMuRm9yY2VEaXJlY3RlZDNEID0gbmV3IENsYXNzKHtcblxuICBnZXRPcHRpb25zOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcyA9IHRoaXMuY2FudmFzLmdldFNpemUoKTtcbiAgICB2YXIgdyA9IHMud2lkdGgsIGggPSBzLmhlaWdodDtcbiAgICAvL2NvdW50IG5vZGVzXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB0aGlzLmdyYXBoLmVhY2hOb2RlKGZ1bmN0aW9uKG4pIHsgXG4gICAgICBjb3VudCsrO1xuICAgIH0pO1xuICAgIHZhciBrMiA9IHcgKiBoIC8gY291bnQsIGsgPSBNYXRoLnNxcnQoazIpO1xuICAgIHZhciBsID0gdGhpcy5jb25maWcubGV2ZWxEaXN0YW5jZTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IHcsXG4gICAgICBoZWlnaHQ6IGgsXG4gICAgICB0c3RhcnQ6IHcgKiAwLjEsXG4gICAgICBub2RlZjogZnVuY3Rpb24oeCkgeyByZXR1cm4gazIgLyAoeCB8fCAxKTsgfSxcbiAgICAgIGVkZ2VmOiBmdW5jdGlvbih4KSB7IHJldHVybiAvKiB4ICogeCAvIGs7ICovIGsgKiAoeCAtIGwpOyB9XG4gICAgfTtcbiAgfSxcbiAgXG4gIGNvbXB1dGU6IGZ1bmN0aW9uKHByb3BlcnR5LCBpbmNyZW1lbnRhbCkge1xuICAgIHZhciBwcm9wID0gJC5zcGxhdChwcm9wZXJ0eSB8fCBbJ2N1cnJlbnQnLCAnc3RhcnQnLCAnZW5kJ10pO1xuICAgIHZhciBvcHQgPSB0aGlzLmdldE9wdGlvbnMoKTtcbiAgICBOb2RlRGltLmNvbXB1dGUodGhpcy5ncmFwaCwgcHJvcCwgdGhpcy5jb25maWcpO1xuICAgIHRoaXMuZ3JhcGguY29tcHV0ZUxldmVscyh0aGlzLnJvb3QsIDAsIFwiaWdub3JlXCIpO1xuICAgIHRoaXMuZ3JhcGguZWFjaE5vZGUoZnVuY3Rpb24obikge1xuICAgICAgJC5lYWNoKHByb3AsIGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdmFyIHBvcyA9IG4uZ2V0UG9zKHApO1xuICAgICAgICBpZihwb3MuaXNaZXJvKCkpIHtcbiAgICAgICAgICBwb3MueCA9IG9wdC53aWR0aC81ICogKE1hdGgucmFuZG9tKCkgLSAwLjUpO1xuICAgICAgICAgIHBvcy55ID0gb3B0LmhlaWdodC81ICogKE1hdGgucmFuZG9tKCkgLSAwLjUpO1xuICAgICAgICAgIHBvcy56ID0gMjAwICogKE1hdGgucmFuZG9tKCkgLSAwLjUpO1xuICAgICAgICB9XG4gICAgICAgIC8vaW5pdGlhbGl6ZSBkaXNwIHZlY3RvclxuICAgICAgICBuLmRpc3AgPSB7fTtcbiAgICAgICAgJC5lYWNoKHByb3AsIGZ1bmN0aW9uKHApIHtcbiAgICAgICAgICBuLmRpc3BbcF0gPSAkVjMoMCwgMCwgMCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5jb21wdXRlUG9zaXRpb25zKHByb3AsIG9wdCwgaW5jcmVtZW50YWwpO1xuICB9LFxuICBcbiAgY29tcHV0ZVBvc2l0aW9uczogZnVuY3Rpb24ocHJvcGVydHksIG9wdCwgaW5jcmVtZW50YWwpIHtcbiAgICB2YXIgdGltZXMgPSB0aGlzLmNvbmZpZy5pdGVyYXRpb25zLCBpID0gMCwgdGhhdCA9IHRoaXM7XG4gICAgaWYoaW5jcmVtZW50YWwpIHtcbiAgICAgIChmdW5jdGlvbiBpdGVyKCkge1xuICAgICAgICBmb3IodmFyIHRvdGFsPWluY3JlbWVudGFsLml0ZXIsIGo9MDsgajx0b3RhbDsgaisrKSB7XG4gICAgICAgICAgb3B0LnQgPSBvcHQudHN0YXJ0ICogKDEgLSBpKysvKHRpbWVzIC0xKSk7XG4gICAgICAgICAgdGhhdC5jb21wdXRlUG9zaXRpb25TdGVwKHByb3BlcnR5LCBvcHQpO1xuICAgICAgICAgIGlmKGkgPj0gdGltZXMpIHtcbiAgICAgICAgICAgIGluY3JlbWVudGFsLm9uQ29tcGxldGUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaW5jcmVtZW50YWwub25TdGVwKE1hdGgucm91bmQoaSAvICh0aW1lcyAtMSkgKiAxMDApKTtcbiAgICAgICAgc2V0VGltZW91dChpdGVyLCAxKTtcbiAgICAgIH0pKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcig7IGkgPCB0aW1lczsgaSsrKSB7XG4gICAgICAgIG9wdC50ID0gb3B0LnRzdGFydCAqICgxIC0gaS8odGltZXMgLTEpKTtcbiAgICAgICAgdGhpcy5jb21wdXRlUG9zaXRpb25TdGVwKHByb3BlcnR5LCBvcHQpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgXG4gIGNvbXB1dGVQb3NpdGlvblN0ZXA6IGZ1bmN0aW9uKHByb3BlcnR5LCBvcHQpIHtcbiAgICB2YXIgZ3JhcGggPSB0aGlzLmdyYXBoO1xuICAgIHZhciBtaW4gPSBNYXRoLm1pbiwgbWF4ID0gTWF0aC5tYXg7XG4gICAgdmFyIGRwb3MgPSAkVjMoMCwgMCwgMCk7XG4gICAgLy9jYWxjdWxhdGUgcmVwdWxzaXZlIGZvcmNlc1xuICAgIGdyYXBoLmVhY2hOb2RlKGZ1bmN0aW9uKHYpIHtcbiAgICAgIC8vaW5pdGlhbGl6ZSBkaXNwXG4gICAgICAkLmVhY2gocHJvcGVydHksIGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdi5kaXNwW3BdLnggPSAwOyBcbiAgICAgICAgdi5kaXNwW3BdLnkgPSAwO1xuICAgICAgICB2LmRpc3BbcF0ueiA9IDA7XG4gICAgICB9KTtcbiAgICAgIGdyYXBoLmVhY2hOb2RlKGZ1bmN0aW9uKHUpIHtcbiAgICAgICAgaWYodS5pZCAhPSB2LmlkKSB7XG4gICAgICAgICAgJC5lYWNoKHByb3BlcnR5LCBmdW5jdGlvbihwKSB7XG4gICAgICAgICAgICB2YXIgdnAgPSB2LmdldFBvcyhwKSwgdXAgPSB1LmdldFBvcyhwKTtcbiAgICAgICAgICAgIGRwb3MueCA9IHZwLnggLSB1cC54O1xuICAgICAgICAgICAgZHBvcy55ID0gdnAueSAtIHVwLnk7XG4gICAgICAgICAgICBkcG9zLnogPSB2cC56IC0gdXAuejtcbiAgICAgICAgICAgIHZhciBub3JtID0gZHBvcy5ub3JtKCkgfHwgMTtcbiAgICAgICAgICAgIHYuZGlzcFtwXS4kYWRkKGRwb3NcbiAgICAgICAgICAgICAgICAuJHNjYWxlKG9wdC5ub2RlZihub3JtKSAvIG5vcm0pKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgLy9jYWxjdWxhdGUgYXR0cmFjdGl2ZSBmb3JjZXNcbiAgICB2YXIgVCA9ICEhZ3JhcGguZ2V0Tm9kZSh0aGlzLnJvb3QpLnZpc2l0ZWQ7XG4gICAgZ3JhcGguZWFjaE5vZGUoZnVuY3Rpb24obm9kZSkge1xuICAgICAgbm9kZS5lYWNoQWRqYWNlbmN5KGZ1bmN0aW9uKGFkaikge1xuICAgICAgICB2YXIgbm9kZVRvID0gYWRqLm5vZGVUbztcbiAgICAgICAgaWYoISFub2RlVG8udmlzaXRlZCA9PT0gVCkge1xuICAgICAgICAgICQuZWFjaChwcm9wZXJ0eSwgZnVuY3Rpb24ocCkge1xuICAgICAgICAgICAgdmFyIHZwID0gbm9kZS5nZXRQb3MocCksIHVwID0gbm9kZVRvLmdldFBvcyhwKTtcbiAgICAgICAgICAgIGRwb3MueCA9IHZwLnggLSB1cC54O1xuICAgICAgICAgICAgZHBvcy55ID0gdnAueSAtIHVwLnk7XG4gICAgICAgICAgICBkcG9zLnogPSB2cC56IC0gdXAuejtcbiAgICAgICAgICAgIHZhciBub3JtID0gZHBvcy5ub3JtKCkgfHwgMTtcbiAgICAgICAgICAgIG5vZGUuZGlzcFtwXS4kYWRkKGRwb3MuJHNjYWxlKC1vcHQuZWRnZWYobm9ybSkgLyBub3JtKSk7XG4gICAgICAgICAgICBub2RlVG8uZGlzcFtwXS4kYWRkKGRwb3MuJHNjYWxlKC0xKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbm9kZS52aXNpdGVkID0gIVQ7XG4gICAgfSk7XG4gICAgLy9hcnJhbmdlIHBvc2l0aW9ucyB0byBmaXQgdGhlIGNhbnZhc1xuICAgIHZhciB0ID0gb3B0LnQsIHcyID0gb3B0LndpZHRoIC8gMiwgaDIgPSBvcHQuaGVpZ2h0IC8gMjtcbiAgICBncmFwaC5lYWNoTm9kZShmdW5jdGlvbih1KSB7XG4gICAgICAkLmVhY2gocHJvcGVydHksIGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdmFyIGRpc3AgPSB1LmRpc3BbcF07XG4gICAgICAgIHZhciBub3JtID0gZGlzcC5ub3JtKCkgfHwgMTtcbiAgICAgICAgdmFyIHAgPSB1LmdldFBvcyhwKTtcbiAgICAgICAgcC4kYWRkKCRWMyhkaXNwLnggKiBtaW4oTWF0aC5hYnMoZGlzcC54KSwgdCkgLyBub3JtLCBcbiAgICAgICAgICAgICAgICAgICBkaXNwLnkgKiBtaW4oTWF0aC5hYnMoZGlzcC55KSwgdCkgLyBub3JtLFxuICAgICAgICAgICAgICAgICAgIGRpc3AueiAqIG1pbihNYXRoLmFicyhkaXNwLnopLCB0KSAvIG5vcm0pKTtcbiAgICAgICAgcC54ID0gbWluKHcyLCBtYXgoLXcyLCBwLngpKTtcbiAgICAgICAgcC55ID0gbWluKGgyLCBtYXgoLWgyLCBwLnkpKTtcbiAgICAgICAgcC56ID0gbWluKGgyLCBtYXgoLWgyLCBwLnopKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59KTtcblxuJGppdC5Gb3JjZURpcmVjdGVkM0QgPSBuZXcgQ2xhc3MoIHtcblxuICBJbXBsZW1lbnRzOiBbIExvYWRlciwgRXh0cmFzLCBMYXlvdXRzLkZvcmNlRGlyZWN0ZWQzRCBdLFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uKGNvbnRyb2xsZXIpIHtcbiAgICB2YXIgJEZvcmNlRGlyZWN0ZWQzRCA9ICRqaXQuRm9yY2VEaXJlY3RlZDNEO1xuXG4gICAgdmFyIGNvbmZpZyA9IHtcbiAgICAgIGl0ZXJhdGlvbnM6IDUwLFxuICAgICAgbGV2ZWxEaXN0YW5jZTogNTBcbiAgICB9O1xuXG4gICAgdGhpcy5jb250cm9sbGVyID0gdGhpcy5jb25maWcgPSAkLm1lcmdlKE9wdGlvbnMoXCJDYW52YXNcIiwgXCJOb2RlXCIsIFwiRWRnZVwiLFxuICAgICAgICBcIkZ4XCIsIFwiVGlwc1wiLCBcIk5vZGVTdHlsZXNcIiwgXCJFdmVudHNcIiwgXCJOYXZpZ2F0aW9uXCIsIFwiQ29udHJvbGxlclwiLCBcIkxhYmVsXCIpLCBjb25maWcsIGNvbnRyb2xsZXIpO1xuXG4gICAgdmFyIGNhbnZhc0NvbmZpZyA9IHRoaXMuY29uZmlnO1xuICAgIGlmKGNhbnZhc0NvbmZpZy51c2VDYW52YXMpIHtcbiAgICAgIHRoaXMuY2FudmFzID0gY2FudmFzQ29uZmlnLnVzZUNhbnZhcztcbiAgICAgIHRoaXMuY29uZmlnLmxhYmVsQ29udGFpbmVyID0gdGhpcy5jYW52YXMuaWQgKyAnLWxhYmVsJztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYoY2FudmFzQ29uZmlnLmJhY2tncm91bmQpIHtcbiAgICAgICAgY2FudmFzQ29uZmlnLmJhY2tncm91bmQgPSAkLm1lcmdlKHtcbiAgICAgICAgICB0eXBlOiAnQ2lyY2xlcydcbiAgICAgICAgfSwgY2FudmFzQ29uZmlnLmJhY2tncm91bmQpO1xuICAgICAgfVxuICAgICAgdGhpcy5jYW52YXMgPSBuZXcgQ2FudmFzKHRoaXMsIGNhbnZhc0NvbmZpZyk7XG4gICAgICB0aGlzLmNvbmZpZy5sYWJlbENvbnRhaW5lciA9ICh0eXBlb2YgY2FudmFzQ29uZmlnLmluamVjdEludG8gPT0gJ3N0cmluZyc/IGNhbnZhc0NvbmZpZy5pbmplY3RJbnRvIDogY2FudmFzQ29uZmlnLmluamVjdEludG8uaWQpICsgJy1sYWJlbCc7XG4gICAgfVxuXG4gICAgdGhpcy5ncmFwaE9wdGlvbnMgPSB7XG4gICAgICAna2xhc3MnOiBWZWN0b3IzLFxuICAgICAgJ05vZGUnOiB7XG4gICAgICAgICdzZWxlY3RlZCc6IGZhbHNlLFxuICAgICAgICAnZXhpc3QnOiB0cnVlLFxuICAgICAgICAnZHJhd24nOiB0cnVlXG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmdyYXBoID0gbmV3IEdyYXBoKHRoaXMuZ3JhcGhPcHRpb25zLCB0aGlzLmNvbmZpZy5Ob2RlLFxuICAgICAgICB0aGlzLmNvbmZpZy5FZGdlKTtcbiAgICB0aGlzLmxhYmVscyA9IG5ldyAkRm9yY2VEaXJlY3RlZDNELkxhYmVsW2NhbnZhc0NvbmZpZy5MYWJlbC50eXBlXSh0aGlzKTtcbiAgICB0aGlzLmZ4ID0gbmV3ICRGb3JjZURpcmVjdGVkM0QuUGxvdCh0aGlzLCAkRm9yY2VEaXJlY3RlZDNEKTtcbiAgICB0aGlzLm9wID0gbmV3ICRGb3JjZURpcmVjdGVkM0QuT3AodGhpcyk7XG4gICAgdGhpcy5qc29uID0gbnVsbDtcbiAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgICAvLyBpbml0aWFsaXplIGV4dHJhc1xuICAgIHRoaXMuaW5pdGlhbGl6ZUV4dHJhcygpO1xuICB9LFxuXG4gIC8qIFxuICAgIHJlZnJlc2ggXG4gICAgXG4gICAgQ29tcHV0ZXMgcG9zaXRpb25zIGFuZCBwbG90cyB0aGUgdHJlZS5cbiAgKi9cbiAgcmVmcmVzaDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5jb21wdXRlKCk7XG4gICAgdGhpcy5wbG90KCk7XG4gIH0sXG5cbiAgcmVwb3NpdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5jb21wdXRlKCdlbmQnKTtcbiAgfSxcblxuLypcbiAgY29tcHV0ZUluY3JlbWVudGFsXG4gIFxuICBQZXJmb3JtcyB0aGUgRm9yY2UgRGlyZWN0ZWQgYWxnb3JpdGhtIGluY3JlbWVudGFsbHkuXG4gIFxuICBEZXNjcmlwdGlvbjpcbiAgXG4gIEZvcmNlRGlyZWN0ZWQzRCBhbGdvcml0aG1zIGNhbiBwZXJmb3JtIG1hbnkgY29tcHV0YXRpb25zIGFuZCBsZWFkIHRvIEphdmFTY3JpcHQgdGFraW5nIHRvbyBtdWNoIHRpbWUgdG8gY29tcGxldGUuIFxuICBUaGlzIG1ldGhvZCBzcGxpdHMgdGhlIGFsZ29yaXRobSBpbnRvIHNtYWxsZXIgcGFydHMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gdHJhY2sgdGhlIGV2b2x1dGlvbiBvZiB0aGUgYWxnb3JpdGhtIGFuZCBcbiAgYXZvaWRpbmcgYnJvd3NlciBtZXNzYWdlcyBzdWNoIGFzIFwiVGhpcyBzY3JpcHQgaXMgdGFraW5nIHRvbyBsb25nIHRvIGNvbXBsZXRlXCIuXG4gIFxuICBQYXJhbWV0ZXJzOlxuICBcbiAgb3B0IC0gKG9iamVjdCkgVGhlIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBkZXNjcmliZWQgYmVsb3dcbiAgXG4gIGl0ZXIgLSAobnVtYmVyKSBEZWZhdWx0J3MgKjIwKi4gU3BsaXQgdGhlIGFsZ29yaXRobSBpbnRvIHBpZWNlcyBvZiBfaXRlcl8gaXRlcmF0aW9ucy4gRm9yIGV4YW1wbGUsIGlmIHRoZSBfaXRlcmF0aW9uc18gY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBcbiAgb2YgeW91ciA8Rm9yY2VEaXJlY3RlZDNEPiBjbGFzcyBpcyAxMDAsIHRoZW4geW91IGNvdWxkIHNldCBfaXRlcl8gdG8gMjAgdG8gc3BsaXQgdGhlIG1haW4gYWxnb3JpdGhtIGludG8gNSBzbWFsbGVyIHBpZWNlcy5cbiAgXG4gIHByb3BlcnR5IC0gKHN0cmluZykgRGVmYXVsdCdzICplbmQqLiBXaGV0aGVyIHRvIHVwZGF0ZSBzdGFydGluZywgY3VycmVudCBvciBlbmRpbmcgbm9kZSBwb3NpdGlvbnMuIFBvc3NpYmxlIHZhbHVlcyBhcmUgJ2VuZCcsICdzdGFydCcsICdjdXJyZW50Jy4gXG4gIFlvdSBjYW4gYWxzbyBzZXQgYW4gYXJyYXkgb2YgdGhlc2UgcHJvcGVydGllcy4gSWYgeW91J2QgbGlrZSB0byBrZWVwIHRoZSBjdXJyZW50IG5vZGUgcG9zaXRpb25zIGJ1dCB0byBwZXJmb3JtIHRoZXNlIFxuICBjb21wdXRhdGlvbnMgZm9yIGZpbmFsIGFuaW1hdGlvbiBwb3NpdGlvbnMgdGhlbiB5b3UgY2FuIGp1c3QgY2hvb3NlICdlbmQnLlxuICBcbiAgb25TdGVwIC0gKGZ1bmN0aW9uKSBBIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGVhY2ggXCJzbWFsbCBwYXJ0XCIgb2YgdGhlIGFsZ29yaXRobSBjb21wbGV0ZWQuIFRoaXMgZnVuY3Rpb24gZ2V0cyBhcyBmaXJzdCBmb3JtYWwgXG4gIHBhcmFtZXRlciBhIHBlcmNlbnRhZ2UgdmFsdWUuXG4gIFxuICBvbkNvbXBsZXRlIC0gQSBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgYWxnb3JpdGhtIGNvbXBsZXRlZC5cbiAgXG4gIEV4YW1wbGU6XG4gIFxuICBJbiB0aGlzIGV4YW1wbGUgSSBjYWxjdWxhdGUgdGhlIGVuZCBwb3NpdGlvbnMgYW5kIHRoZW4gYW5pbWF0ZSB0aGUgZ3JhcGggdG8gdGhvc2UgcG9zaXRpb25zXG4gIFxuICAoc3RhcnQgY29kZSBqcylcbiAgdmFyIGZkID0gbmV3ICRqaXQuRm9yY2VEaXJlY3RlZDNEKC4uLik7XG4gIGZkLmNvbXB1dGVJbmNyZW1lbnRhbCh7XG4gICAgaXRlcjogMjAsXG4gICAgcHJvcGVydHk6ICdlbmQnLFxuICAgIG9uU3RlcDogZnVuY3Rpb24ocGVyYykge1xuICAgICAgTG9nLndyaXRlKFwibG9hZGluZyBcIiArIHBlcmMgKyBcIiVcIik7XG4gICAgfSxcbiAgICBvbkNvbXBsZXRlOiBmdW5jdGlvbigpIHtcbiAgICAgIExvZy53cml0ZShcImRvbmVcIik7XG4gICAgICBmZC5hbmltYXRlKCk7XG4gICAgfVxuICB9KTtcbiAgKGVuZCBjb2RlKVxuICBcbiAgSW4gdGhpcyBleGFtcGxlIEkgY2FsY3VsYXRlIGFsbCBwb3NpdGlvbnMgYW5kIChyZSlwbG90IHRoZSBncmFwaFxuICBcbiAgKHN0YXJ0IGNvZGUganMpXG4gIHZhciBmZCA9IG5ldyBGb3JjZURpcmVjdGVkM0QoLi4uKTtcbiAgZmQuY29tcHV0ZUluY3JlbWVudGFsKHtcbiAgICBpdGVyOiAyMCxcbiAgICBwcm9wZXJ0eTogWydlbmQnLCAnc3RhcnQnLCAnY3VycmVudCddLFxuICAgIG9uU3RlcDogZnVuY3Rpb24ocGVyYykge1xuICAgICAgTG9nLndyaXRlKFwibG9hZGluZyBcIiArIHBlcmMgKyBcIiVcIik7XG4gICAgfSxcbiAgICBvbkNvbXBsZXRlOiBmdW5jdGlvbigpIHtcbiAgICAgIExvZy53cml0ZShcImRvbmVcIik7XG4gICAgICBmZC5wbG90KCk7XG4gICAgfVxuICB9KTtcbiAgKGVuZCBjb2RlKVxuICBcbiAgKi9cbiAgY29tcHV0ZUluY3JlbWVudGFsOiBmdW5jdGlvbihvcHQpIHtcbiAgICBvcHQgPSAkLm1lcmdlKCB7XG4gICAgICBpdGVyOiAyMCxcbiAgICAgIHByb3BlcnR5OiAnZW5kJyxcbiAgICAgIG9uU3RlcDogJC5lbXB0eSxcbiAgICAgIG9uQ29tcGxldGU6ICQuZW1wdHlcbiAgICB9LCBvcHQgfHwge30pO1xuXG4gICAgdGhpcy5jb25maWcub25CZWZvcmVDb21wdXRlKHRoaXMuZ3JhcGguZ2V0Tm9kZSh0aGlzLnJvb3QpKTtcbiAgICB0aGlzLmNvbXB1dGUob3B0LnByb3BlcnR5LCBvcHQpO1xuICB9LFxuXG4gIC8qXG4gICAgcGxvdFxuICAgXG4gICAgUGxvdHMgdGhlIEZvcmNlRGlyZWN0ZWQzRCBncmFwaC4gVGhpcyBpcyBhIHNob3J0Y3V0IHRvICpmeC5wbG90Ki5cbiAgICovXG4gIHBsb3Q6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZngucGxvdCgpO1xuICB9LFxuXG4gIC8qXG4gICAgIGFuaW1hdGVcbiAgICBcbiAgICAgQW5pbWF0ZXMgdGhlIGdyYXBoIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb25zIHRvIHRoZSAnZW5kJyBub2RlIHBvc2l0aW9ucy5cbiAgKi9cbiAgYW5pbWF0ZTogZnVuY3Rpb24ob3B0KSB7XG4gICAgdGhpcy5meC5hbmltYXRlKCQubWVyZ2UoIHtcbiAgICAgIG1vZGVzOiBbICdsaW5lYXInIF1cbiAgICB9LCBvcHQgfHwge30pKTtcbiAgfVxufSk7XG5cbiRqaXQuRm9yY2VEaXJlY3RlZDNELiRleHRlbmQgPSB0cnVlO1xuXG4oZnVuY3Rpb24oRm9yY2VEaXJlY3RlZDNEKSB7XG5cbiAgLypcbiAgICAgRm9yY2VEaXJlY3RlZDNELk9wXG4gICAgIFxuICAgICBDdXN0b20gZXh0ZW5zaW9uIG9mIDxHcmFwaC5PcD4uXG5cbiAgICAgRXh0ZW5kczpcblxuICAgICBBbGwgPEdyYXBoLk9wPiBtZXRob2RzXG4gICAgIFxuICAgICBTZWUgYWxzbzpcbiAgICAgXG4gICAgIDxHcmFwaC5PcD5cblxuICAqL1xuICBGb3JjZURpcmVjdGVkM0QuT3AgPSBuZXcgQ2xhc3MoIHtcblxuICAgIEltcGxlbWVudHM6IEdyYXBoLk9wXG5cbiAgfSk7XG5cbiAgLypcbiAgICBGb3JjZURpcmVjdGVkM0QuUGxvdFxuICAgIFxuICAgIEN1c3RvbSBleHRlbnNpb24gb2YgPEdyYXBoLlBsb3Q+LlxuICBcbiAgICBFeHRlbmRzOlxuICBcbiAgICBBbGwgPEdyYXBoLlBsb3Q+IG1ldGhvZHNcbiAgICBcbiAgICBTZWUgYWxzbzpcbiAgICBcbiAgICA8R3JhcGguUGxvdD5cbiAgXG4gICovXG4gIEZvcmNlRGlyZWN0ZWQzRC5QbG90ID0gbmV3IENsYXNzKCB7XG5cbiAgICBJbXBsZW1lbnRzOiBHcmFwaC5QbG90M0RcblxuICB9KTtcblxuICAvKlxuICAgIEZvcmNlRGlyZWN0ZWQzRC5MYWJlbFxuICAgIFxuICAgIEN1c3RvbSBleHRlbnNpb24gb2YgPEdyYXBoLkxhYmVsPi4gXG4gICAgQ29udGFpbnMgY3VzdG9tIDxHcmFwaC5MYWJlbC5TVkc+LCA8R3JhcGguTGFiZWwuSFRNTD4gYW5kIDxHcmFwaC5MYWJlbC5OYXRpdmU+IGV4dGVuc2lvbnMuXG4gIFxuICAgIEV4dGVuZHM6XG4gIFxuICAgIEFsbCA8R3JhcGguTGFiZWw+IG1ldGhvZHMgYW5kIHN1YmNsYXNzZXMuXG4gIFxuICAgIFNlZSBhbHNvOlxuICBcbiAgICA8R3JhcGguTGFiZWw+LCA8R3JhcGguTGFiZWwuTmF0aXZlPiwgPEdyYXBoLkxhYmVsLkhUTUw+LCA8R3JhcGguTGFiZWwuU1ZHPi5cbiAgXG4gICovXG4gIEZvcmNlRGlyZWN0ZWQzRC5MYWJlbCA9IHt9O1xuXG4gIC8qXG4gICAgIEZvcmNlRGlyZWN0ZWQzRC5MYWJlbC5OYXRpdmVcbiAgICAgXG4gICAgIEN1c3RvbSBleHRlbnNpb24gb2YgPEdyYXBoLkxhYmVsLk5hdGl2ZT4uXG5cbiAgICAgRXh0ZW5kczpcblxuICAgICBBbGwgPEdyYXBoLkxhYmVsLk5hdGl2ZT4gbWV0aG9kc1xuXG4gICAgIFNlZSBhbHNvOlxuXG4gICAgIDxHcmFwaC5MYWJlbC5OYXRpdmU+XG5cbiAgKi9cbiAgRm9yY2VEaXJlY3RlZDNELkxhYmVsLk5hdGl2ZSA9IG5ldyBDbGFzcygge1xuICAgIEltcGxlbWVudHM6IEdyYXBoLkxhYmVsLk5hdGl2ZVxuICB9KTtcblxuICAvKlxuICAgIEZvcmNlRGlyZWN0ZWQzRC5MYWJlbC5TVkdcbiAgICBcbiAgICBDdXN0b20gZXh0ZW5zaW9uIG9mIDxHcmFwaC5MYWJlbC5TVkc+LlxuICBcbiAgICBFeHRlbmRzOlxuICBcbiAgICBBbGwgPEdyYXBoLkxhYmVsLlNWRz4gbWV0aG9kc1xuICBcbiAgICBTZWUgYWxzbzpcbiAgXG4gICAgPEdyYXBoLkxhYmVsLlNWRz5cbiAgXG4gICovXG4gIEZvcmNlRGlyZWN0ZWQzRC5MYWJlbC5TVkcgPSBuZXcgQ2xhc3MoIHtcbiAgICBJbXBsZW1lbnRzOiBHcmFwaC5MYWJlbC5TVkcsXG5cbiAgICBpbml0aWFsaXplOiBmdW5jdGlvbih2aXopIHtcbiAgICAgIHRoaXMudml6ID0gdml6O1xuICAgIH0sXG5cbiAgICAvKiBcbiAgICAgICBwbGFjZUxhYmVsXG5cbiAgICAgICBPdmVycmlkZXMgYWJzdHJhY3QgbWV0aG9kIHBsYWNlTGFiZWwgaW4gPEdyYXBoLkxhYmVsPi5cblxuICAgICAgIFBhcmFtZXRlcnM6XG5cbiAgICAgICB0YWcgLSBBIERPTSBsYWJlbCBlbGVtZW50LlxuICAgICAgIG5vZGUgLSBBIDxHcmFwaC5Ob2RlPi5cbiAgICAgICBjb250cm9sbGVyIC0gQSBjb25maWd1cmF0aW9uL2NvbnRyb2xsZXIgb2JqZWN0IHBhc3NlZCB0byB0aGUgdmlzdWFsaXphdGlvbi5cbiAgICAgIFxuICAgICAqL1xuICAgIHBsYWNlTGFiZWw6IGZ1bmN0aW9uKHRhZywgbm9kZSwgY29udHJvbGxlcikge1xuICAgICAgdmFyIHBvcyA9IG5vZGUucG9zLmdldGModHJ1ZSksIFxuICAgICAgICAgIGNhbnZhcyA9IHRoaXMudml6LmNhbnZhcyxcbiAgICAgICAgICBveCA9IGNhbnZhcy50cmFuc2xhdGVPZmZzZXRYLFxuICAgICAgICAgIG95ID0gY2FudmFzLnRyYW5zbGF0ZU9mZnNldFksXG4gICAgICAgICAgc3ggPSBjYW52YXMuc2NhbGVPZmZzZXRYLFxuICAgICAgICAgIHN5ID0gY2FudmFzLnNjYWxlT2Zmc2V0WSxcbiAgICAgICAgICByYWRpdXMgPSBjYW52YXMuZ2V0U2l6ZSgpO1xuICAgICAgdmFyIGxhYmVsUG9zID0ge1xuICAgICAgICB4OiBNYXRoLnJvdW5kKHBvcy54ICogc3ggKyBveCArIHJhZGl1cy53aWR0aCAvIDIpLFxuICAgICAgICB5OiBNYXRoLnJvdW5kKHBvcy55ICogc3kgKyBveSArIHJhZGl1cy5oZWlnaHQgLyAyKVxuICAgICAgfTtcbiAgICAgIHRhZy5zZXRBdHRyaWJ1dGUoJ3gnLCBsYWJlbFBvcy54KTtcbiAgICAgIHRhZy5zZXRBdHRyaWJ1dGUoJ3knLCBsYWJlbFBvcy55KTtcblxuICAgICAgY29udHJvbGxlci5vblBsYWNlTGFiZWwodGFnLCBub2RlKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8qXG4gICAgIEZvcmNlRGlyZWN0ZWQzRC5MYWJlbC5IVE1MXG4gICAgIFxuICAgICBDdXN0b20gZXh0ZW5zaW9uIG9mIDxHcmFwaC5MYWJlbC5IVE1MPi5cblxuICAgICBFeHRlbmRzOlxuXG4gICAgIEFsbCA8R3JhcGguTGFiZWwuSFRNTD4gbWV0aG9kcy5cblxuICAgICBTZWUgYWxzbzpcblxuICAgICA8R3JhcGguTGFiZWwuSFRNTD5cblxuICAqL1xuICBGb3JjZURpcmVjdGVkM0QuTGFiZWwuSFRNTCA9IG5ldyBDbGFzcygge1xuICAgIEltcGxlbWVudHM6IEdyYXBoLkxhYmVsLkhUTUwsXG5cbiAgICBpbml0aWFsaXplOiBmdW5jdGlvbih2aXopIHtcbiAgICAgIHRoaXMudml6ID0gdml6O1xuICAgIH0sXG4gICAgLyogXG4gICAgICAgcGxhY2VMYWJlbFxuXG4gICAgICAgT3ZlcnJpZGVzIGFic3RyYWN0IG1ldGhvZCBwbGFjZUxhYmVsIGluIDxHcmFwaC5QbG90Pi5cblxuICAgICAgIFBhcmFtZXRlcnM6XG5cbiAgICAgICB0YWcgLSBBIERPTSBsYWJlbCBlbGVtZW50LlxuICAgICAgIG5vZGUgLSBBIDxHcmFwaC5Ob2RlPi5cbiAgICAgICBjb250cm9sbGVyIC0gQSBjb25maWd1cmF0aW9uL2NvbnRyb2xsZXIgb2JqZWN0IHBhc3NlZCB0byB0aGUgdmlzdWFsaXphdGlvbi5cbiAgICAgIFxuICAgICAqL1xuICAgIHBsYWNlTGFiZWw6IGZ1bmN0aW9uKHRhZywgbm9kZSwgY29udHJvbGxlcikge1xuICAgICAgdmFyIHBvcyA9IG5vZGUucG9zLmdldGModHJ1ZSksIFxuICAgICAgICAgIGNhbnZhcyA9IHRoaXMudml6LmNhbnZhcyxcbiAgICAgICAgICBveCA9IGNhbnZhcy50cmFuc2xhdGVPZmZzZXRYLFxuICAgICAgICAgIG95ID0gY2FudmFzLnRyYW5zbGF0ZU9mZnNldFksXG4gICAgICAgICAgc3ggPSBjYW52YXMuc2NhbGVPZmZzZXRYLFxuICAgICAgICAgIHN5ID0gY2FudmFzLnNjYWxlT2Zmc2V0WSxcbiAgICAgICAgICByYWRpdXMgPSBjYW52YXMuZ2V0U2l6ZSgpO1xuICAgICAgdmFyIGxhYmVsUG9zID0ge1xuICAgICAgICB4OiBNYXRoLnJvdW5kKHBvcy54ICogc3ggKyBveCArIHJhZGl1cy53aWR0aCAvIDIpLFxuICAgICAgICB5OiBNYXRoLnJvdW5kKHBvcy55ICogc3kgKyBveSArIHJhZGl1cy5oZWlnaHQgLyAyKVxuICAgICAgfTtcbiAgICAgIHZhciBzdHlsZSA9IHRhZy5zdHlsZTtcbiAgICAgIHN0eWxlLmxlZnQgPSBsYWJlbFBvcy54ICsgJ3B4JztcbiAgICAgIHN0eWxlLnRvcCA9IGxhYmVsUG9zLnkgKyAncHgnO1xuICAgICAgc3R5bGUuZGlzcGxheSA9IHRoaXMuZml0c0luQ2FudmFzKGxhYmVsUG9zLCBjYW52YXMpID8gJycgOiAnbm9uZSc7XG5cbiAgICAgIGNvbnRyb2xsZXIub25QbGFjZUxhYmVsKHRhZywgbm9kZSk7XG4gICAgfVxuICB9KTtcblxuICAvKlxuICAgIEZvcmNlRGlyZWN0ZWQzRC5QbG90Lk5vZGVUeXBlc1xuXG4gICAgVGhpcyBjbGFzcyBjb250YWlucyBhIGxpc3Qgb2YgPEdyYXBoLk5vZGU+IGJ1aWx0LWluIHR5cGVzLiBcbiAgICBOb2RlIHR5cGVzIGltcGxlbWVudGVkIGFyZSAnbm9uZScsICdjaXJjbGUnLCAndHJpYW5nbGUnLCAncmVjdGFuZ2xlJywgJ3N0YXInLCAnZWxsaXBzZScgYW5kICdzcXVhcmUnLlxuXG4gICAgWW91IGNhbiBhZGQgeW91ciBjdXN0b20gbm9kZSB0eXBlcywgY3VzdG9taXppbmcgeW91ciB2aXN1YWxpemF0aW9uIHRvIHRoZSBleHRyZW1lLlxuXG4gICAgRXhhbXBsZTpcblxuICAgIChzdGFydCBjb2RlIGpzKVxuICAgICAgRm9yY2VEaXJlY3RlZDNELlBsb3QuTm9kZVR5cGVzLmltcGxlbWVudCh7XG4gICAgICAgICdteVNwZWNpYWxUeXBlJzoge1xuICAgICAgICAgICdyZW5kZXInOiBmdW5jdGlvbihub2RlLCBjYW52YXMpIHtcbiAgICAgICAgICAgIC8vcHJpbnQgeW91ciBjdXN0b20gbm9kZSB0byBjYW52YXNcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vb3B0aW9uYWxcbiAgICAgICAgICAnY29udGFpbnMnOiBmdW5jdGlvbihub2RlLCBwb3MpIHtcbiAgICAgICAgICAgIC8vcmV0dXJuIHRydWUgaWYgcG9zIGlzIGluc2lkZSB0aGUgbm9kZSBvciBmYWxzZSBvdGhlcndpc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIChlbmQgY29kZSlcblxuICAqL1xuICBGb3JjZURpcmVjdGVkM0QuUGxvdC5Ob2RlVHlwZXMgPSBuZXcgQ2xhc3Moe1xuICAgICdub25lJzoge1xuICAgICAgJ3JlbmRlcic6ICQuZW1wdHksXG4gICAgICAnY29udGFpbnMnOiAkLmxhbWJkYShmYWxzZSlcbiAgICB9LFxuICAgICdjaXJjbGUnOiB7XG4gICAgICAncmVuZGVyJzogZnVuY3Rpb24obm9kZSwgY2FudmFzKXtcbiAgICAgICAgdmFyIHBvcyA9IG5vZGUucG9zLmdldGModHJ1ZSksIFxuICAgICAgICAgICAgZGltID0gbm9kZS5nZXREYXRhKCdkaW0nKTtcbiAgICAgICAgdGhpcy5ub2RlSGVscGVyLmNpcmNsZS5yZW5kZXIoJ2ZpbGwnLCBwb3MsIGRpbSwgY2FudmFzKTtcbiAgICAgIH0sXG4gICAgICAnY29udGFpbnMnOiBmdW5jdGlvbihub2RlLCBwb3Mpe1xuICAgICAgICB2YXIgbnBvcyA9IG5vZGUucG9zLmdldGModHJ1ZSksIFxuICAgICAgICAgICAgZGltID0gbm9kZS5nZXREYXRhKCdkaW0nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZUhlbHBlci5jaXJjbGUuY29udGFpbnMobnBvcywgcG9zLCBkaW0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgJ2VsbGlwc2UnOiB7XG4gICAgICAncmVuZGVyJzogZnVuY3Rpb24obm9kZSwgY2FudmFzKXtcbiAgICAgICAgdmFyIHBvcyA9IG5vZGUucG9zLmdldGModHJ1ZSksIFxuICAgICAgICAgICAgd2lkdGggPSBub2RlLmdldERhdGEoJ3dpZHRoJyksIFxuICAgICAgICAgICAgaGVpZ2h0ID0gbm9kZS5nZXREYXRhKCdoZWlnaHQnKTtcbiAgICAgICAgdGhpcy5ub2RlSGVscGVyLmVsbGlwc2UucmVuZGVyKCdmaWxsJywgcG9zLCB3aWR0aCwgaGVpZ2h0LCBjYW52YXMpO1xuICAgICAgICB9LFxuICAgICAgJ2NvbnRhaW5zJzogZnVuY3Rpb24obm9kZSwgcG9zKXtcbiAgICAgICAgdmFyIG5wb3MgPSBub2RlLnBvcy5nZXRjKHRydWUpLCBcbiAgICAgICAgICAgIHdpZHRoID0gbm9kZS5nZXREYXRhKCd3aWR0aCcpLCBcbiAgICAgICAgICAgIGhlaWdodCA9IG5vZGUuZ2V0RGF0YSgnaGVpZ2h0Jyk7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVIZWxwZXIuZWxsaXBzZS5jb250YWlucyhucG9zLCBwb3MsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgJ3NxdWFyZSc6IHtcbiAgICAgICdyZW5kZXInOiBmdW5jdGlvbihub2RlLCBjYW52YXMpe1xuICAgICAgICB2YXIgcG9zID0gbm9kZS5wb3MuZ2V0Yyh0cnVlKSwgXG4gICAgICAgICAgICBkaW0gPSBub2RlLmdldERhdGEoJ2RpbScpO1xuICAgICAgICB0aGlzLm5vZGVIZWxwZXIuc3F1YXJlLnJlbmRlcignZmlsbCcsIHBvcywgZGltLCBjYW52YXMpO1xuICAgICAgfSxcbiAgICAgICdjb250YWlucyc6IGZ1bmN0aW9uKG5vZGUsIHBvcyl7XG4gICAgICAgIHZhciBucG9zID0gbm9kZS5wb3MuZ2V0Yyh0cnVlKSwgXG4gICAgICAgICAgICBkaW0gPSBub2RlLmdldERhdGEoJ2RpbScpO1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlSGVscGVyLnNxdWFyZS5jb250YWlucyhucG9zLCBwb3MsIGRpbSk7XG4gICAgICB9XG4gICAgfSxcbiAgICAncmVjdGFuZ2xlJzoge1xuICAgICAgJ3JlbmRlcic6IGZ1bmN0aW9uKG5vZGUsIGNhbnZhcyl7XG4gICAgICAgIHZhciBwb3MgPSBub2RlLnBvcy5nZXRjKHRydWUpLCBcbiAgICAgICAgICAgIHdpZHRoID0gbm9kZS5nZXREYXRhKCd3aWR0aCcpLCBcbiAgICAgICAgICAgIGhlaWdodCA9IG5vZGUuZ2V0RGF0YSgnaGVpZ2h0Jyk7XG4gICAgICAgIHRoaXMubm9kZUhlbHBlci5yZWN0YW5nbGUucmVuZGVyKCdmaWxsJywgcG9zLCB3aWR0aCwgaGVpZ2h0LCBjYW52YXMpO1xuICAgICAgfSxcbiAgICAgICdjb250YWlucyc6IGZ1bmN0aW9uKG5vZGUsIHBvcyl7XG4gICAgICAgIHZhciBucG9zID0gbm9kZS5wb3MuZ2V0Yyh0cnVlKSwgXG4gICAgICAgICAgICB3aWR0aCA9IG5vZGUuZ2V0RGF0YSgnd2lkdGgnKSwgXG4gICAgICAgICAgICBoZWlnaHQgPSBub2RlLmdldERhdGEoJ2hlaWdodCcpO1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlSGVscGVyLnJlY3RhbmdsZS5jb250YWlucyhucG9zLCBwb3MsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgJ3RyaWFuZ2xlJzoge1xuICAgICAgJ3JlbmRlcic6IGZ1bmN0aW9uKG5vZGUsIGNhbnZhcyl7XG4gICAgICAgIHZhciBwb3MgPSBub2RlLnBvcy5nZXRjKHRydWUpLCBcbiAgICAgICAgICAgIGRpbSA9IG5vZGUuZ2V0RGF0YSgnZGltJyk7XG4gICAgICAgIHRoaXMubm9kZUhlbHBlci50cmlhbmdsZS5yZW5kZXIoJ2ZpbGwnLCBwb3MsIGRpbSwgY2FudmFzKTtcbiAgICAgIH0sXG4gICAgICAnY29udGFpbnMnOiBmdW5jdGlvbihub2RlLCBwb3MpIHtcbiAgICAgICAgdmFyIG5wb3MgPSBub2RlLnBvcy5nZXRjKHRydWUpLCBcbiAgICAgICAgICAgIGRpbSA9IG5vZGUuZ2V0RGF0YSgnZGltJyk7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVIZWxwZXIudHJpYW5nbGUuY29udGFpbnMobnBvcywgcG9zLCBkaW0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgJ3N0YXInOiB7XG4gICAgICAncmVuZGVyJzogZnVuY3Rpb24obm9kZSwgY2FudmFzKXtcbiAgICAgICAgdmFyIHBvcyA9IG5vZGUucG9zLmdldGModHJ1ZSksXG4gICAgICAgICAgICBkaW0gPSBub2RlLmdldERhdGEoJ2RpbScpO1xuICAgICAgICB0aGlzLm5vZGVIZWxwZXIuc3Rhci5yZW5kZXIoJ2ZpbGwnLCBwb3MsIGRpbSwgY2FudmFzKTtcbiAgICAgIH0sXG4gICAgICAnY29udGFpbnMnOiBmdW5jdGlvbihub2RlLCBwb3MpIHtcbiAgICAgICAgdmFyIG5wb3MgPSBub2RlLnBvcy5nZXRjKHRydWUpLFxuICAgICAgICAgICAgZGltID0gbm9kZS5nZXREYXRhKCdkaW0nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZUhlbHBlci5zdGFyLmNvbnRhaW5zKG5wb3MsIHBvcywgZGltKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIC8qXG4gICAgRm9yY2VEaXJlY3RlZDNELlBsb3QuRWRnZVR5cGVzXG4gIFxuICAgIFRoaXMgY2xhc3MgY29udGFpbnMgYSBsaXN0IG9mIDxHcmFwaC5BZGphY2VuY2U+IGJ1aWx0LWluIHR5cGVzLiBcbiAgICBFZGdlIHR5cGVzIGltcGxlbWVudGVkIGFyZSAnbm9uZScsICdsaW5lJyBhbmQgJ2Fycm93Jy5cbiAgXG4gICAgWW91IGNhbiBhZGQgeW91ciBjdXN0b20gZWRnZSB0eXBlcywgY3VzdG9taXppbmcgeW91ciB2aXN1YWxpemF0aW9uIHRvIHRoZSBleHRyZW1lLlxuICBcbiAgICBFeGFtcGxlOlxuICBcbiAgICAoc3RhcnQgY29kZSBqcylcbiAgICAgIEZvcmNlRGlyZWN0ZWQzRC5QbG90LkVkZ2VUeXBlcy5pbXBsZW1lbnQoe1xuICAgICAgICAnbXlTcGVjaWFsVHlwZSc6IHtcbiAgICAgICAgICAncmVuZGVyJzogZnVuY3Rpb24oYWRqLCBjYW52YXMpIHtcbiAgICAgICAgICAgIC8vcHJpbnQgeW91ciBjdXN0b20gZWRnZSB0byBjYW52YXNcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vb3B0aW9uYWxcbiAgICAgICAgICAnY29udGFpbnMnOiBmdW5jdGlvbihhZGosIHBvcykge1xuICAgICAgICAgICAgLy9yZXR1cm4gdHJ1ZSBpZiBwb3MgaXMgaW5zaWRlIHRoZSBhcmMgb3IgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAoZW5kIGNvZGUpXG4gIFxuICAqL1xuICBGb3JjZURpcmVjdGVkM0QuUGxvdC5FZGdlVHlwZXMgPSBuZXcgQ2xhc3Moe1xuICAgICdub25lJzogJC5lbXB0eSxcbiAgICAnbGluZSc6IHtcbiAgICAgICdyZW5kZXInOiBmdW5jdGlvbihhZGosIGNhbnZhcykge1xuICAgICAgICB2YXIgZnJvbSA9IGFkai5ub2RlRnJvbS5wb3MuZ2V0Yyh0cnVlKSxcbiAgICAgICAgICAgIHRvID0gYWRqLm5vZGVUby5wb3MuZ2V0Yyh0cnVlKTtcbiAgICAgICAgdGhpcy5lZGdlSGVscGVyLmxpbmUucmVuZGVyKGZyb20sIHRvLCBjYW52YXMpO1xuICAgICAgfSxcbiAgICAgICdjb250YWlucyc6IGZ1bmN0aW9uKGFkaiwgcG9zKSB7XG4gICAgICAgIHZhciBmcm9tID0gYWRqLm5vZGVGcm9tLnBvcy5nZXRjKHRydWUpLFxuICAgICAgICAgICAgdG8gPSBhZGoubm9kZVRvLnBvcy5nZXRjKHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5lZGdlSGVscGVyLmxpbmUuY29udGFpbnMoZnJvbSwgdG8sIHBvcywgdGhpcy5lZGdlLmVwc2lsb24pO1xuICAgICAgfVxuICAgIH0sXG4gICAgJ2Fycm93Jzoge1xuICAgICAgJ3JlbmRlcic6IGZ1bmN0aW9uKGFkaiwgY2FudmFzKSB7XG4gICAgICAgIHZhciBmcm9tID0gYWRqLm5vZGVGcm9tLnBvcy5nZXRjKHRydWUpLFxuICAgICAgICAgICAgdG8gPSBhZGoubm9kZVRvLnBvcy5nZXRjKHRydWUpLFxuICAgICAgICAgICAgZGltID0gYWRqLmdldERhdGEoJ2RpbScpLFxuICAgICAgICAgICAgZGlyZWN0aW9uID0gYWRqLmRhdGEuJGRpcmVjdGlvbixcbiAgICAgICAgICAgIGludiA9IChkaXJlY3Rpb24gJiYgZGlyZWN0aW9uLmxlbmd0aD4xICYmIGRpcmVjdGlvblswXSAhPSBhZGoubm9kZUZyb20uaWQpO1xuICAgICAgICB0aGlzLmVkZ2VIZWxwZXIuYXJyb3cucmVuZGVyKGZyb20sIHRvLCBkaW0sIGludiwgY2FudmFzKTtcbiAgICAgIH0sXG4gICAgICAnY29udGFpbnMnOiBmdW5jdGlvbihhZGosIHBvcykge1xuICAgICAgICB2YXIgZnJvbSA9IGFkai5ub2RlRnJvbS5wb3MuZ2V0Yyh0cnVlKSxcbiAgICAgICAgICAgIHRvID0gYWRqLm5vZGVUby5wb3MuZ2V0Yyh0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRnZUhlbHBlci5hcnJvdy5jb250YWlucyhmcm9tLCB0bywgcG9zLCB0aGlzLmVkZ2UuZXBzaWxvbik7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxufSkoJGppdC5Gb3JjZURpcmVjdGVkM0QpO1xuXG4vLyBTVEFSVCBNRVRBTUFQUyBDT0RFXG5leHBvcnQgZGVmYXVsdCAkaml0XG4vLyBFTkQgTUVUQU1BUFMgQ09ERVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9wYXRjaGVkL0pJVC5qcyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBOzs7OztBQUtBOzs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUFZQTs7Ozs7Ozs7Ozs7Ozs7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUFlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUFlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUFlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUFlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FBT0E7QUFDQTs7Ozs7Ozs7Ozs7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUFXQTs7Ozs7Ozs7O0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFqU0E7QUFDQTtBQUNBO0FBbVNBOzs7OztBQUtBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBY0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FBV0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQVlBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQWNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQWlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBZUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7O0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7O0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUFhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUFlQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7O0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUFlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUFlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUFlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUFlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUFlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7O0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7OztBQVNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQWlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQVlBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBOzs7QUFHQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQWlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQWlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTs7Ozs7Ozs7OztBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFaQTtBQUNBO0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUFhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQWlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUFlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7QUFVQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7QUFTQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9IQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUFXQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FBVUE7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQWVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7Ozs7Ozs7Ozs7Ozs7O0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBZUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FBWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FBWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBOzs7Ozs7Ozs7O0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUFlQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 171 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });exports.getLayoutForData = exports.generateObjectCoordinates = exports.generateLayoutObject = exports.ISLAND_SPACING = exports.Y_GRID_SPACE = exports.X_GRID_SPACE = undefined;var _orderBy2 = __webpack_require__(172);var _orderBy3 = _interopRequireDefault(_orderBy2);var _findIndex2 = __webpack_require__(136);var _findIndex3 = _interopRequireDefault(_findIndex2);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}\n\n/*\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        step 1\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        generate an object/array that represents the intended layout\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        \n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        \n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        step 2\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        generate x,y coordinates for every topic in the layout object\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        \n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        */\n\n// synapses = [{ topic1_id: 4, topic2_id: 5, direction: 'from-to', desc: 'has reply' }]\n\nvar isEven = function isEven(n) {return n % 2 === 0;};\nvar isOdd = function isOdd(n) {return Math.abs(n % 2) === 1;};\n\nvar X_GRID_SPACE = exports.X_GRID_SPACE = 250;\nvar Y_GRID_SPACE = exports.Y_GRID_SPACE = 200;\nvar ISLAND_SPACING = exports.ISLAND_SPACING = 300;\n\nvar generateLayoutObject = exports.generateLayoutObject = function generateLayoutObject(topics, synapses, focalTopicId) {\n  var layout = []; // will be the final output\n  var usedTopics = {}; // will store the topics that have been placed into islands\n  var newRoot = void 0;\n  var currentTopic = void 0;\n\n  var addParentsAndChildren = function addParentsAndChildren(topic, getParents, getChildren, degreeFromFocus) {\n    if (!topic.id) return topic;\n\n    usedTopics[topic.id] = true;\n    topic.degreeFromFocus = degreeFromFocus;\n    var nextDegree = degreeFromFocus + 1;\n\n    if (getChildren) {\n      topic.children = [];\n      synapses.filter(function (synapse) {\n        return synapse.topic1_id === topic.id &&\n        !usedTopics[synapse.topic2_id] &&\n        synapse.category === 'from-to';\n      }).\n      map(function (synapse) {return synapse.topic2_id;}).\n      forEach(function (childId) {return topic.children.push(addParentsAndChildren({ id: childId }, false, true, nextDegree));});\n\n      topic.children = (0, _orderBy3.default)(topic.children, 'maxDescendants', 'desc');\n      topic.maxDescendants = topic.children.length ? topic.children[0].maxDescendants + 1 : 0;\n    }\n\n    if (getParents) {\n      topic.parents = [];\n      synapses.filter(function (synapse) {\n        return synapse.topic2_id === topic.id &&\n        !usedTopics[synapse.topic1_id] &&\n        synapse.category === 'from-to';\n      }).\n      map(function (synapse) {return synapse.topic1_id;}).\n      forEach(function (parentId) {return topic.parents.push(addParentsAndChildren({ id: parentId }, true, false, nextDegree));});\n\n      topic.parents = (0, _orderBy3.default)(topic.parents, 'maxAncestors', 'desc');\n      topic.maxAncestors = topic.parents.length ? topic.parents[0].maxAncestors + 1 : 0;\n    }\n\n    if (getParents && getChildren) {\n      topic.longestThread = topic.maxDescendants + topic.maxAncestors + 1;\n    }\n\n    return topic;\n  };\n\n  // start with the focal node, and build its island\n  currentTopic = topics.find(function (t) {return t.id === focalTopicId;});\n  if (!currentTopic) {\n    console.log('you didnt pass a valid focalTopicId');\n    return layout;\n  }\n  newRoot = {\n    id: currentTopic.id };\n\n  layout.push(addParentsAndChildren(newRoot, true, true, 0));\n\n  // right now there's no reasoning going on about the selection of focal topics\n  // its just whichever ones happen to be found in the array first\n  topics.forEach(function (topic) {\n    if (topic && topic.id && !usedTopics[topic.id]) {\n      newRoot = {\n        id: topic.id };\n\n      layout.push(addParentsAndChildren(newRoot, true, true, 0));\n    }\n  });\n\n  return layout;\n};\n\n\nvar generateObjectCoordinates = exports.generateObjectCoordinates = function generateObjectCoordinates(layoutObject, focalTopicId, focalCoords) {\n  var coords = {};\n\n  var traverseIsland = function traverseIsland(island, func, parent, child) {\n    func(island, parent, child);\n    if (island.parents) {\n      island.parents.forEach(function (p) {return traverseIsland(p, func, null, island);});\n    }\n    if (island.children) {\n      island.children.forEach(function (c) {return traverseIsland(c, func, island, null);});\n    }\n  };\n\n  // const myFunction = n => n*5\n\n  // myFunction(2) === 10\n\n  var positionTopic = function positionTopic(tempPosStore) {return function (topic, parent, child) {\n      var pos = {};\n\n      var getYValueForX = function getYValueForX(x) {var attempt = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n        tempPosStore[x] = tempPosStore[x] || {};\n        var yValue = void 0;\n        var relationSign = void 0;\n        var indexOfTopic = void 0;\n        var relation = parent || child;\n        var arrayOfTopics = parent ? parent.children : child ? child.parents : [];\n\n        // first figure out what you'd like it to be\n        // then figure out if that spot's taken\n        // and if it is then call this function again with another attempt\n\n        // after the focal topic only, ODD indexes will move negatively on the Y axis\n        // and EVEN indexes will move positively on the Y axis\n\n        // for everything beyond the direct parents and children of the focal topic\n        // maintain the positivity or negativity on the Y axis of its parent or child\n\n        if (!relation) yValue = 0;else\n        if (attempt === 0) yValue = coords[relation.id].y;else\n        if (attempt > 0) {\n          // if the relations sign is 0, alternate between putting this topic into the upper and lower quadrants\n          if (coords[relation.id].y === 0) {\n            indexOfTopic = (0, _findIndex3.default)(arrayOfTopics, function (t) {return t.id === topic.id;});\n            relationSign = isOdd(indexOfTopic) ? 1 : -1;\n          } else {\n            // if the quadrant of the related topic is already decided, make sure to keep it\n            relationSign = coords[relation.id].y > 0 ? 1 : -1;\n          }\n          yValue = coords[relation.id].y + Y_GRID_SPACE * attempt * relationSign;\n        }\n\n        if (tempPosStore[x][yValue]) yValue = getYValueForX(x, attempt + 1);\n        tempPosStore[x][yValue] = true;\n        return yValue;\n      };\n\n      pos.x = topic.degreeFromFocus * X_GRID_SPACE * (parent ? 1 : -1),\n      pos.y = getYValueForX(pos.x);\n      coords[topic.id] = pos;\n    };};\n\n  // lay all of them out as if there were no other ones\n  layoutObject.forEach(function (island, index) {\n    var tempPosStore = {};\n    if (index === 0) {\n      tempPosStore[X_GRID_SPACE] = {\n        0: true };\n\n    }\n    traverseIsland(island, positionTopic(tempPosStore));\n  });\n\n  // calculate the bounds of each island\n  var islandBoundArray = [];\n  var adjustBounds = function adjustBounds(islandBounds) {return function (topic, parent, child) {\n      var relation = parent || child;\n      if (!relation) return;\n      islandBounds.minX = Math.min(islandBounds.minX, coords[topic.id].x);\n      islandBounds.maxX = Math.max(islandBounds.maxX, coords[topic.id].x);\n      islandBounds.minY = Math.min(islandBounds.minY, coords[topic.id].y);\n      islandBounds.maxY = Math.max(islandBounds.maxY, coords[topic.id].y);\n    };};\n  layoutObject.forEach(function (island) {\n    var islandBounds = {\n      minX: coords[island.id].x,\n      maxX: coords[island.id].x,\n      minY: coords[island.id].y,\n      maxY: coords[island.id].y };\n\n    islandBoundArray.push(islandBounds);\n    traverseIsland(island, adjustBounds(islandBounds));\n  });\n\n  // reposition the islands according to the bounds\n  var translateIsland = function translateIsland(island, x, y) {\n    var adjustTopicPos = function adjustTopicPos(topic) {\n      coords[topic.id].x = coords[topic.id].x + x;\n      coords[topic.id].y = coords[topic.id].y + y;\n    };\n    traverseIsland(island, adjustTopicPos);\n  };\n  var maxYForIslands = 0; // the highest Y value that has thus been placed\n  var minYForIslands = 0; // the lowest Y value that has thus been placed\n  layoutObject.forEach(function (island, index) {\n    var translateY = void 0;\n    var islandHeight = islandBoundArray[index].maxY - islandBoundArray[index].minY;\n    if (index === 0) {\n      translateIsland(island, focalCoords.x, focalCoords.y); // position the selected island to where the user has it already\n      maxYForIslands = focalCoords.y + islandBoundArray[0].maxY;\n      minYForIslands = focalCoords.y + islandBoundArray[0].minY;\n    } else\n    if (isOdd(index)) {\n      translateIsland(island, focalCoords.x - islandBoundArray[index].maxX, maxYForIslands + ISLAND_SPACING + Math.abs(islandBoundArray[index].minY));\n      maxYForIslands = maxYForIslands + ISLAND_SPACING + islandHeight;\n    } else\n    {\n      translateIsland(island, focalCoords.x - islandBoundArray[index].maxX, minYForIslands - ISLAND_SPACING - islandBoundArray[index].maxY);\n      minYForIslands = minYForIslands - ISLAND_SPACING - islandHeight;\n    }\n  });\n\n  return coords;\n};\n\nvar getLayoutForData = exports.getLayoutForData = function getLayoutForData(topics, synapses, focalTopicId, focalCoords) {\n  return generateObjectCoordinates(generateLayoutObject(topics, synapses, focalTopicId), focalTopicId, focalCoords);\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcxLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvQ29udm9BbGdvL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpbmRJbmRleCwgb3JkZXJCeSB9IGZyb20gJ2xvZGFzaCdcblxuLypcbnN0ZXAgMVxuZ2VuZXJhdGUgYW4gb2JqZWN0L2FycmF5IHRoYXQgcmVwcmVzZW50cyB0aGUgaW50ZW5kZWQgbGF5b3V0XG5cblxuc3RlcCAyXG5nZW5lcmF0ZSB4LHkgY29vcmRpbmF0ZXMgZm9yIGV2ZXJ5IHRvcGljIGluIHRoZSBsYXlvdXQgb2JqZWN0XG5cbiovXG5cbi8vIHN5bmFwc2VzID0gW3sgdG9waWMxX2lkOiA0LCB0b3BpYzJfaWQ6IDUsIGRpcmVjdGlvbjogJ2Zyb20tdG8nLCBkZXNjOiAnaGFzIHJlcGx5JyB9XVxuXG5jb25zdCBpc0V2ZW4gPSBuID0+IG4gJSAyID09PSAwXG5jb25zdCBpc09kZCA9IG4gPT4gTWF0aC5hYnMobiAlIDIpID09PSAxXG5cbmV4cG9ydCBjb25zdCBYX0dSSURfU1BBQ0UgPSAyNTBcbmV4cG9ydCBjb25zdCBZX0dSSURfU1BBQ0UgPSAyMDBcbmV4cG9ydCBjb25zdCBJU0xBTkRfU1BBQ0lORyA9IDMwMFxuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVMYXlvdXRPYmplY3QgPSAodG9waWNzLCBzeW5hcHNlcywgZm9jYWxUb3BpY0lkKSA9PiB7XG4gIGxldCBsYXlvdXQgPSBbXSAvLyB3aWxsIGJlIHRoZSBmaW5hbCBvdXRwdXRcbiAgY29uc3QgdXNlZFRvcGljcyA9IHt9IC8vIHdpbGwgc3RvcmUgdGhlIHRvcGljcyB0aGF0IGhhdmUgYmVlbiBwbGFjZWQgaW50byBpc2xhbmRzXG4gIGxldCBuZXdSb290XG4gIGxldCBjdXJyZW50VG9waWNcblxuICBjb25zdCBhZGRQYXJlbnRzQW5kQ2hpbGRyZW4gPSAodG9waWMsIGdldFBhcmVudHMsIGdldENoaWxkcmVuLCBkZWdyZWVGcm9tRm9jdXMpID0+IHtcbiAgICBpZiAoIXRvcGljLmlkKSByZXR1cm4gdG9waWNcblxuICAgIHVzZWRUb3BpY3NbdG9waWMuaWRdID0gdHJ1ZVxuICAgIHRvcGljLmRlZ3JlZUZyb21Gb2N1cyA9IGRlZ3JlZUZyb21Gb2N1c1xuICAgIGNvbnN0IG5leHREZWdyZWUgPSBkZWdyZWVGcm9tRm9jdXMgKyAxXG5cbiAgICBpZiAoZ2V0Q2hpbGRyZW4pIHtcbiAgICAgIHRvcGljLmNoaWxkcmVuID0gW11cbiAgICAgIHN5bmFwc2VzLmZpbHRlcihzeW5hcHNlID0+IHtcbiAgICAgICAgcmV0dXJuIHN5bmFwc2UudG9waWMxX2lkID09PSB0b3BpYy5pZFxuICAgICAgICAgICAgICAgJiYgIXVzZWRUb3BpY3Nbc3luYXBzZS50b3BpYzJfaWRdXG4gICAgICAgICAgICAgICAmJiBzeW5hcHNlLmNhdGVnb3J5ID09PSAnZnJvbS10bydcbiAgICAgIH0pXG4gICAgICAubWFwKHN5bmFwc2UgPT4gc3luYXBzZS50b3BpYzJfaWQpXG4gICAgICAuZm9yRWFjaChjaGlsZElkID0+IHRvcGljLmNoaWxkcmVuLnB1c2goYWRkUGFyZW50c0FuZENoaWxkcmVuKHtpZDogY2hpbGRJZH0sIGZhbHNlLCB0cnVlLCBuZXh0RGVncmVlKSkpXG5cbiAgICAgIHRvcGljLmNoaWxkcmVuID0gb3JkZXJCeSh0b3BpYy5jaGlsZHJlbiwgJ21heERlc2NlbmRhbnRzJywgJ2Rlc2MnKVxuICAgICAgdG9waWMubWF4RGVzY2VuZGFudHMgPSB0b3BpYy5jaGlsZHJlbi5sZW5ndGggPyB0b3BpYy5jaGlsZHJlblswXS5tYXhEZXNjZW5kYW50cyArIDEgOiAwXG4gICAgfVxuXG4gICAgaWYgKGdldFBhcmVudHMpIHtcbiAgICAgIHRvcGljLnBhcmVudHMgPSBbXVxuICAgICAgc3luYXBzZXMuZmlsdGVyKHN5bmFwc2UgPT4ge1xuICAgICAgICByZXR1cm4gc3luYXBzZS50b3BpYzJfaWQgPT09IHRvcGljLmlkXG4gICAgICAgICAgICAgICAmJiAhdXNlZFRvcGljc1tzeW5hcHNlLnRvcGljMV9pZF1cbiAgICAgICAgICAgICAgICYmIHN5bmFwc2UuY2F0ZWdvcnkgPT09ICdmcm9tLXRvJ1xuICAgICAgfSlcbiAgICAgIC5tYXAoc3luYXBzZSA9PiBzeW5hcHNlLnRvcGljMV9pZClcbiAgICAgIC5mb3JFYWNoKHBhcmVudElkID0+IHRvcGljLnBhcmVudHMucHVzaChhZGRQYXJlbnRzQW5kQ2hpbGRyZW4oe2lkOiBwYXJlbnRJZH0sIHRydWUsIGZhbHNlLCBuZXh0RGVncmVlKSkpXG5cbiAgICAgIHRvcGljLnBhcmVudHMgPSBvcmRlckJ5KHRvcGljLnBhcmVudHMsICdtYXhBbmNlc3RvcnMnLCAnZGVzYycpXG4gICAgICB0b3BpYy5tYXhBbmNlc3RvcnMgPSB0b3BpYy5wYXJlbnRzLmxlbmd0aCA/IHRvcGljLnBhcmVudHNbMF0ubWF4QW5jZXN0b3JzICsgMSA6IDBcbiAgICB9XG5cbiAgICBpZiAoZ2V0UGFyZW50cyAmJiBnZXRDaGlsZHJlbikge1xuICAgICAgdG9waWMubG9uZ2VzdFRocmVhZCA9IHRvcGljLm1heERlc2NlbmRhbnRzICsgdG9waWMubWF4QW5jZXN0b3JzICsgMVxuICAgIH1cblxuICAgIHJldHVybiB0b3BpY1xuICB9XG5cbiAgLy8gc3RhcnQgd2l0aCB0aGUgZm9jYWwgbm9kZSwgYW5kIGJ1aWxkIGl0cyBpc2xhbmRcbiAgY3VycmVudFRvcGljID0gdG9waWNzLmZpbmQodCA9PiB0LmlkID09PSBmb2NhbFRvcGljSWQpXG4gIGlmICghY3VycmVudFRvcGljKSB7XG4gICAgY29uc29sZS5sb2coJ3lvdSBkaWRudCBwYXNzIGEgdmFsaWQgZm9jYWxUb3BpY0lkJylcbiAgICByZXR1cm4gbGF5b3V0XG4gIH1cbiAgbmV3Um9vdCA9IHtcbiAgICBpZDogY3VycmVudFRvcGljLmlkXG4gIH1cbiAgbGF5b3V0LnB1c2goYWRkUGFyZW50c0FuZENoaWxkcmVuKG5ld1Jvb3QsIHRydWUsIHRydWUsIDApKVxuXG4gIC8vIHJpZ2h0IG5vdyB0aGVyZSdzIG5vIHJlYXNvbmluZyBnb2luZyBvbiBhYm91dCB0aGUgc2VsZWN0aW9uIG9mIGZvY2FsIHRvcGljc1xuICAvLyBpdHMganVzdCB3aGljaGV2ZXIgb25lcyBoYXBwZW4gdG8gYmUgZm91bmQgaW4gdGhlIGFycmF5IGZpcnN0XG4gIHRvcGljcy5mb3JFYWNoKHRvcGljID0+IHtcbiAgICBpZiAodG9waWMgJiYgdG9waWMuaWQgJiYgIXVzZWRUb3BpY3NbdG9waWMuaWRdKSB7XG4gICAgICBuZXdSb290ID0ge1xuICAgICAgICBpZDogdG9waWMuaWRcbiAgICAgIH1cbiAgICAgIGxheW91dC5wdXNoKGFkZFBhcmVudHNBbmRDaGlsZHJlbihuZXdSb290LCB0cnVlLCB0cnVlLCAwKSlcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIGxheW91dFxufVxuXG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZU9iamVjdENvb3JkaW5hdGVzID0gKGxheW91dE9iamVjdCwgZm9jYWxUb3BpY0lkLCBmb2NhbENvb3JkcykgPT4ge1xuICBjb25zdCBjb29yZHMgPSB7fVxuXG4gIGNvbnN0IHRyYXZlcnNlSXNsYW5kID0gKGlzbGFuZCwgZnVuYywgcGFyZW50LCBjaGlsZCkgPT4ge1xuICAgIGZ1bmMoaXNsYW5kLCBwYXJlbnQsIGNoaWxkKVxuICAgIGlmIChpc2xhbmQucGFyZW50cykge1xuICAgICAgaXNsYW5kLnBhcmVudHMuZm9yRWFjaChwID0+IHRyYXZlcnNlSXNsYW5kKHAsIGZ1bmMsIG51bGwsIGlzbGFuZCkpXG4gICAgfVxuICAgIGlmIChpc2xhbmQuY2hpbGRyZW4pIHtcbiAgICAgIGlzbGFuZC5jaGlsZHJlbi5mb3JFYWNoKGMgPT4gdHJhdmVyc2VJc2xhbmQoYywgZnVuYywgaXNsYW5kLCBudWxsKSlcbiAgICB9XG4gIH1cblxuICAvLyBjb25zdCBteUZ1bmN0aW9uID0gbiA9PiBuKjVcblxuICAvLyBteUZ1bmN0aW9uKDIpID09PSAxMFxuXG4gIGNvbnN0IHBvc2l0aW9uVG9waWMgPSB0ZW1wUG9zU3RvcmUgPT4gKHRvcGljLCBwYXJlbnQsIGNoaWxkKSA9PiB7XG4gICAgbGV0IHBvcyA9IHt9XG5cbiAgICBjb25zdCBnZXRZVmFsdWVGb3JYID0gKHgsIGF0dGVtcHQgPSAwKSA9PiB7XG4gICAgICB0ZW1wUG9zU3RvcmVbeF0gPSB0ZW1wUG9zU3RvcmVbeF0gfHwge31cbiAgICAgIGxldCB5VmFsdWVcbiAgICAgIGxldCByZWxhdGlvblNpZ25cbiAgICAgIGxldCBpbmRleE9mVG9waWNcbiAgICAgIGxldCByZWxhdGlvbiA9IHBhcmVudCB8fCBjaGlsZFxuICAgICAgbGV0IGFycmF5T2ZUb3BpY3MgPSBwYXJlbnQgPyBwYXJlbnQuY2hpbGRyZW4gOiAoY2hpbGQgPyBjaGlsZC5wYXJlbnRzIDogW10pXG5cbiAgICAgIC8vIGZpcnN0IGZpZ3VyZSBvdXQgd2hhdCB5b3UnZCBsaWtlIGl0IHRvIGJlXG4gICAgICAvLyB0aGVuIGZpZ3VyZSBvdXQgaWYgdGhhdCBzcG90J3MgdGFrZW5cbiAgICAgIC8vIGFuZCBpZiBpdCBpcyB0aGVuIGNhbGwgdGhpcyBmdW5jdGlvbiBhZ2FpbiB3aXRoIGFub3RoZXIgYXR0ZW1wdFxuXG4gICAgICAvLyBhZnRlciB0aGUgZm9jYWwgdG9waWMgb25seSwgT0REIGluZGV4ZXMgd2lsbCBtb3ZlIG5lZ2F0aXZlbHkgb24gdGhlIFkgYXhpc1xuICAgICAgLy8gYW5kIEVWRU4gaW5kZXhlcyB3aWxsIG1vdmUgcG9zaXRpdmVseSBvbiB0aGUgWSBheGlzXG5cbiAgICAgIC8vIGZvciBldmVyeXRoaW5nIGJleW9uZCB0aGUgZGlyZWN0IHBhcmVudHMgYW5kIGNoaWxkcmVuIG9mIHRoZSBmb2NhbCB0b3BpY1xuICAgICAgLy8gbWFpbnRhaW4gdGhlIHBvc2l0aXZpdHkgb3IgbmVnYXRpdml0eSBvbiB0aGUgWSBheGlzIG9mIGl0cyBwYXJlbnQgb3IgY2hpbGRcblxuICAgICAgaWYgKCFyZWxhdGlvbikgeVZhbHVlID0gMFxuICAgICAgZWxzZSBpZiAoYXR0ZW1wdCA9PT0gMCkgeVZhbHVlID0gY29vcmRzW3JlbGF0aW9uLmlkXS55XG4gICAgICBlbHNlIGlmIChhdHRlbXB0ID4gMCkge1xuICAgICAgICAvLyBpZiB0aGUgcmVsYXRpb25zIHNpZ24gaXMgMCwgYWx0ZXJuYXRlIGJldHdlZW4gcHV0dGluZyB0aGlzIHRvcGljIGludG8gdGhlIHVwcGVyIGFuZCBsb3dlciBxdWFkcmFudHNcbiAgICAgICAgaWYgKGNvb3Jkc1tyZWxhdGlvbi5pZF0ueSA9PT0gMCkge1xuICAgICAgICAgIGluZGV4T2ZUb3BpYyA9IGZpbmRJbmRleChhcnJheU9mVG9waWNzLCB0ID0+IHQuaWQgPT09IHRvcGljLmlkKVxuICAgICAgICAgIHJlbGF0aW9uU2lnbiA9IGlzT2RkKGluZGV4T2ZUb3BpYykgPyAxIDogLTFcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpZiB0aGUgcXVhZHJhbnQgb2YgdGhlIHJlbGF0ZWQgdG9waWMgaXMgYWxyZWFkeSBkZWNpZGVkLCBtYWtlIHN1cmUgdG8ga2VlcCBpdFxuICAgICAgICAgIHJlbGF0aW9uU2lnbiA9IGNvb3Jkc1tyZWxhdGlvbi5pZF0ueSA+IDAgPyAxIDogLTFcbiAgICAgICAgfVxuICAgICAgICB5VmFsdWUgPSBjb29yZHNbcmVsYXRpb24uaWRdLnkgKyAoWV9HUklEX1NQQUNFICogYXR0ZW1wdCAqIHJlbGF0aW9uU2lnbilcbiAgICAgIH1cblxuICAgICAgaWYgKHRlbXBQb3NTdG9yZVt4XVt5VmFsdWVdKSB5VmFsdWUgPSBnZXRZVmFsdWVGb3JYKHgsIGF0dGVtcHQgKyAxKVxuICAgICAgdGVtcFBvc1N0b3JlW3hdW3lWYWx1ZV0gPSB0cnVlXG4gICAgICByZXR1cm4geVZhbHVlXG4gICAgfVxuXG4gICAgcG9zLnggPSB0b3BpYy5kZWdyZWVGcm9tRm9jdXMgKiBYX0dSSURfU1BBQ0UgKiAocGFyZW50ID8gMSA6IC0xKSxcbiAgICBwb3MueSA9IGdldFlWYWx1ZUZvclgocG9zLngpXG4gICAgY29vcmRzW3RvcGljLmlkXSA9IHBvc1xuICB9XG5cbiAgLy8gbGF5IGFsbCBvZiB0aGVtIG91dCBhcyBpZiB0aGVyZSB3ZXJlIG5vIG90aGVyIG9uZXNcbiAgbGF5b3V0T2JqZWN0LmZvckVhY2goKGlzbGFuZCwgaW5kZXgpID0+IHtcbiAgICBjb25zdCB0ZW1wUG9zU3RvcmUgPSB7fVxuICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgdGVtcFBvc1N0b3JlW1hfR1JJRF9TUEFDRV0gPSB7XG4gICAgICAgIDA6IHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgdHJhdmVyc2VJc2xhbmQoaXNsYW5kLCBwb3NpdGlvblRvcGljKHRlbXBQb3NTdG9yZSkpXG4gIH0pXG5cbiAgLy8gY2FsY3VsYXRlIHRoZSBib3VuZHMgb2YgZWFjaCBpc2xhbmRcbiAgY29uc3QgaXNsYW5kQm91bmRBcnJheT0gW11cbiAgY29uc3QgYWRqdXN0Qm91bmRzID0gaXNsYW5kQm91bmRzID0+ICh0b3BpYywgcGFyZW50LCBjaGlsZCkgPT4ge1xuICAgIGNvbnN0IHJlbGF0aW9uID0gcGFyZW50IHx8IGNoaWxkXG4gICAgaWYgKCFyZWxhdGlvbikgcmV0dXJuXG4gICAgaXNsYW5kQm91bmRzLm1pblggPSBNYXRoLm1pbihpc2xhbmRCb3VuZHMubWluWCwgY29vcmRzW3RvcGljLmlkXS54KVxuICAgIGlzbGFuZEJvdW5kcy5tYXhYID0gTWF0aC5tYXgoaXNsYW5kQm91bmRzLm1heFgsIGNvb3Jkc1t0b3BpYy5pZF0ueClcbiAgICBpc2xhbmRCb3VuZHMubWluWSA9IE1hdGgubWluKGlzbGFuZEJvdW5kcy5taW5ZLCBjb29yZHNbdG9waWMuaWRdLnkpXG4gICAgaXNsYW5kQm91bmRzLm1heFkgPSBNYXRoLm1heChpc2xhbmRCb3VuZHMubWF4WSwgY29vcmRzW3RvcGljLmlkXS55KVxuICB9XG4gIGxheW91dE9iamVjdC5mb3JFYWNoKGlzbGFuZCA9PiB7XG4gICAgY29uc3QgaXNsYW5kQm91bmRzID0ge1xuICAgICAgbWluWDogY29vcmRzW2lzbGFuZC5pZF0ueCxcbiAgICAgIG1heFg6IGNvb3Jkc1tpc2xhbmQuaWRdLngsXG4gICAgICBtaW5ZOiBjb29yZHNbaXNsYW5kLmlkXS55LFxuICAgICAgbWF4WTogY29vcmRzW2lzbGFuZC5pZF0ueVxuICAgIH1cbiAgICBpc2xhbmRCb3VuZEFycmF5LnB1c2goaXNsYW5kQm91bmRzKVxuICAgIHRyYXZlcnNlSXNsYW5kKGlzbGFuZCwgYWRqdXN0Qm91bmRzKGlzbGFuZEJvdW5kcykpXG4gIH0pXG5cbiAgLy8gcmVwb3NpdGlvbiB0aGUgaXNsYW5kcyBhY2NvcmRpbmcgdG8gdGhlIGJvdW5kc1xuICBjb25zdCB0cmFuc2xhdGVJc2xhbmQgPSAoaXNsYW5kLCB4LCB5KSA9PiB7XG4gICAgY29uc3QgYWRqdXN0VG9waWNQb3MgPSB0b3BpYyA9PiB7XG4gICAgICBjb29yZHNbdG9waWMuaWRdLnggPSBjb29yZHNbdG9waWMuaWRdLnggKyB4XG4gICAgICBjb29yZHNbdG9waWMuaWRdLnkgPSBjb29yZHNbdG9waWMuaWRdLnkgKyB5XG4gICAgfVxuICAgIHRyYXZlcnNlSXNsYW5kKGlzbGFuZCwgYWRqdXN0VG9waWNQb3MpXG4gIH1cbiAgbGV0IG1heFlGb3JJc2xhbmRzID0gMCAvLyB0aGUgaGlnaGVzdCBZIHZhbHVlIHRoYXQgaGFzIHRodXMgYmVlbiBwbGFjZWRcbiAgbGV0IG1pbllGb3JJc2xhbmRzID0gMCAvLyB0aGUgbG93ZXN0IFkgdmFsdWUgdGhhdCBoYXMgdGh1cyBiZWVuIHBsYWNlZFxuICBsYXlvdXRPYmplY3QuZm9yRWFjaCgoaXNsYW5kLCBpbmRleCkgPT4ge1xuICAgIGxldCB0cmFuc2xhdGVZXG4gICAgY29uc3QgaXNsYW5kSGVpZ2h0ID0gaXNsYW5kQm91bmRBcnJheVtpbmRleF0ubWF4WSAtIGlzbGFuZEJvdW5kQXJyYXlbaW5kZXhdLm1pbllcbiAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgIHRyYW5zbGF0ZUlzbGFuZChpc2xhbmQsIGZvY2FsQ29vcmRzLngsIGZvY2FsQ29vcmRzLnkpIC8vIHBvc2l0aW9uIHRoZSBzZWxlY3RlZCBpc2xhbmQgdG8gd2hlcmUgdGhlIHVzZXIgaGFzIGl0IGFscmVhZHlcbiAgICAgIG1heFlGb3JJc2xhbmRzID0gZm9jYWxDb29yZHMueSArIGlzbGFuZEJvdW5kQXJyYXlbMF0ubWF4WVxuICAgICAgbWluWUZvcklzbGFuZHMgPSBmb2NhbENvb3Jkcy55ICsgaXNsYW5kQm91bmRBcnJheVswXS5taW5ZXG4gICAgfVxuICAgIGVsc2UgaWYgKGlzT2RkKGluZGV4KSkge1xuICAgICAgdHJhbnNsYXRlSXNsYW5kKGlzbGFuZCwgZm9jYWxDb29yZHMueCAtIGlzbGFuZEJvdW5kQXJyYXlbaW5kZXhdLm1heFgsIG1heFlGb3JJc2xhbmRzICsgSVNMQU5EX1NQQUNJTkcgKyBNYXRoLmFicyhpc2xhbmRCb3VuZEFycmF5W2luZGV4XS5taW5ZKSlcbiAgICAgIG1heFlGb3JJc2xhbmRzID0gbWF4WUZvcklzbGFuZHMgKyBJU0xBTkRfU1BBQ0lORyArIGlzbGFuZEhlaWdodFxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRyYW5zbGF0ZUlzbGFuZChpc2xhbmQsIGZvY2FsQ29vcmRzLnggLSBpc2xhbmRCb3VuZEFycmF5W2luZGV4XS5tYXhYLCBtaW5ZRm9ySXNsYW5kcyAtIElTTEFORF9TUEFDSU5HIC0gaXNsYW5kQm91bmRBcnJheVtpbmRleF0ubWF4WSlcbiAgICAgIG1pbllGb3JJc2xhbmRzID0gbWluWUZvcklzbGFuZHMgLSBJU0xBTkRfU1BBQ0lORyAtIGlzbGFuZEhlaWdodFxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gY29vcmRzXG59XG5cbmV4cG9ydCBjb25zdCBnZXRMYXlvdXRGb3JEYXRhID0gKHRvcGljcywgc3luYXBzZXMsIGZvY2FsVG9waWNJZCwgZm9jYWxDb29yZHMpID0+IHtcbiAgcmV0dXJuIGdlbmVyYXRlT2JqZWN0Q29vcmRpbmF0ZXMoZ2VuZXJhdGVMYXlvdXRPYmplY3QodG9waWNzLCBzeW5hcHNlcywgZm9jYWxUb3BpY0lkKSwgZm9jYWxUb3BpY0lkLCBmb2NhbENvb3Jkcylcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL0NvbnZvQWxnby9pbmRleC5qcyJdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7Ozs7Ozs7OztBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 172 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseOrderBy = __webpack_require__(156),\n    isArray = __webpack_require__(86);\n\n/**\n * This method is like `_.sortBy` except that it allows specifying the sort\n * orders of the iteratees to sort by. If `orders` is unspecified, all values\n * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n * descending or \"asc\" for ascending sort order of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n *  The iteratees to sort by.\n * @param {string[]} [orders] The sort orders of `iteratees`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n *   { 'user': 'fred',   'age': 48 },\n *   { 'user': 'barney', 'age': 34 },\n *   { 'user': 'fred',   'age': 40 },\n *   { 'user': 'barney', 'age': 36 }\n * ];\n *\n * // Sort by `user` in ascending order and by `age` in descending order.\n * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n */\nfunction orderBy(collection, iteratees, orders, guard) {\n  if (collection == null) {\n    return [];\n  }\n  if (!isArray(iteratees)) {\n    iteratees = iteratees == null ? [] : [iteratees];\n  }\n  orders = guard ? undefined : orders;\n  if (!isArray(orders)) {\n    orders = orders == null ? [] : [orders];\n  }\n  return baseOrderBy(collection, iteratees, orders);\n}\n\nmodule.exports = orderBy;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvb3JkZXJCeS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZU9yZGVyQnkgPSByZXF1aXJlKCcuL19iYXNlT3JkZXJCeScpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRCeWAgZXhjZXB0IHRoYXQgaXQgYWxsb3dzIHNwZWNpZnlpbmcgdGhlIHNvcnRcbiAqIG9yZGVycyBvZiB0aGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuIElmIGBvcmRlcnNgIGlzIHVuc3BlY2lmaWVkLCBhbGwgdmFsdWVzXG4gKiBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4gT3RoZXJ3aXNlLCBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvclxuICogZGVzY2VuZGluZyBvciBcImFzY1wiIGZvciBhc2NlbmRpbmcgc29ydCBvcmRlciBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtBcnJheVtdfEZ1bmN0aW9uW118T2JqZWN0W118c3RyaW5nW119IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICogIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAqIEBwYXJhbSB7c3RyaW5nW119IFtvcmRlcnNdIFRoZSBzb3J0IG9yZGVycyBvZiBgaXRlcmF0ZWVzYC5cbiAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLnJlZHVjZWAuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzQgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAgfSxcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfVxuICogXTtcbiAqXG4gKiAvLyBTb3J0IGJ5IGB1c2VyYCBpbiBhc2NlbmRpbmcgb3JkZXIgYW5kIGJ5IGBhZ2VgIGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gKiBfLm9yZGVyQnkodXNlcnMsIFsndXNlcicsICdhZ2UnXSwgWydhc2MnLCAnZGVzYyddKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgNDBdXVxuICovXG5mdW5jdGlvbiBvcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzLCBndWFyZCkge1xuICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmICghaXNBcnJheShpdGVyYXRlZXMpKSB7XG4gICAgaXRlcmF0ZWVzID0gaXRlcmF0ZWVzID09IG51bGwgPyBbXSA6IFtpdGVyYXRlZXNdO1xuICB9XG4gIG9yZGVycyA9IGd1YXJkID8gdW5kZWZpbmVkIDogb3JkZXJzO1xuICBpZiAoIWlzQXJyYXkob3JkZXJzKSkge1xuICAgIG9yZGVycyA9IG9yZGVycyA9PSBudWxsID8gW10gOiBbb3JkZXJzXTtcbiAgfVxuICByZXR1cm4gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9yZGVyQnk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL29yZGVyQnkuanNcbi8vIG1vZHVsZSBpZCA9IDE3MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 173 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });\n\nvar _react = __webpack_require__(174);var _react2 = _interopRequireDefault(_react);\nvar _reactDom = __webpack_require__(205);var _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _DataModel = __webpack_require__(149);var _DataModel2 = _interopRequireDefault(_DataModel);\nvar _Engine = __webpack_require__(150);var _Engine2 = _interopRequireDefault(_Engine);\nvar _MetacodeSelect = __webpack_require__(351);var _MetacodeSelect2 = _interopRequireDefault(_MetacodeSelect);\nvar _Mouse = __webpack_require__(352);var _Mouse2 = _interopRequireDefault(_Mouse);\nvar _Selected = __webpack_require__(353);var _Selected2 = _interopRequireDefault(_Selected);\nvar _Synapse = __webpack_require__(354);var _Synapse2 = _interopRequireDefault(_Synapse);\nvar _Topic = __webpack_require__(571);var _Topic2 = _interopRequireDefault(_Topic);\nvar _Util = __webpack_require__(410);var _Util2 = _interopRequireDefault(_Util);\nvar _Visualize = __webpack_require__(561);var _Visualize2 = _interopRequireDefault(_Visualize);\nvar _GlobalUI = __webpack_require__(362);var _GlobalUI2 = _interopRequireDefault(_GlobalUI);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} /* global Metamaps, $, Hogan, Bloodhound */\n\nvar Create = {\n  isSwitchingSet: false, // indicates whether the metacode set switch lightbox is open\n  selectedMetacodeSet: null,\n  selectedMetacodeSetIndex: null,\n  selectedMetacodeNames: [],\n  newSelectedMetacodeNames: [],\n  selectedMetacodes: [],\n  newSelectedMetacodes: [],\n  recentMetacodes: [],\n  mostUsedMetacodes: [],\n  init: function init(serverData) {\n    var self = Create;\n    self.newTopic.init(serverData);\n    self.newSynapse.init();\n\n    // // SWITCHING METACODE SETS\n\n    $('#metacodeSwitchTabs').tabs({\n      active: self.selectedMetacodeSetIndex }).\n    addClass('ui-tabs-vertical ui-helper-clearfix');\n    $('#metacodeSwitchTabs .ui-tabs-nav li').removeClass('ui-corner-top').addClass('ui-corner-left');\n    $('.customMetacodeList li').click(self.toggleMetacodeSelected); // within the custom metacode set tab\n  },\n  toggleMetacodeSelected: function toggleMetacodeSelected() {\n    var self = Create;\n\n    if ($(this).attr('class') !== 'toggledOff') {\n      $(this).addClass('toggledOff');\n      var valueToRemove = $(this).attr('id');\n      var nameToRemove = $(this).attr('data-name');\n      self.newSelectedMetacodes.splice(self.newSelectedMetacodes.indexOf(valueToRemove), 1);\n      self.newSelectedMetacodeNames.splice(self.newSelectedMetacodeNames.indexOf(nameToRemove), 1);\n    } else if ($(this).attr('class') === 'toggledOff') {\n      $(this).removeClass('toggledOff');\n      self.newSelectedMetacodes.push($(this).attr('id'));\n      self.newSelectedMetacodeNames.push($(this).attr('data-name'));\n    }\n  },\n  updateMetacodeSet: function updateMetacodeSet(set, index, custom) {\n    if (custom && Create.newSelectedMetacodes.length === 0) {\n      window.alert('Please select at least one metacode to use!');\n      return false;\n    }\n\n    var codesToSwitchToIds;\n    var metacodeModels = new _DataModel2.default.MetacodeCollection();\n    Create.selectedMetacodeSetIndex = index;\n    Create.selectedMetacodeSet = 'metacodeset-' + set;\n\n    if (!custom) {\n      codesToSwitchToIds = $('#metacodeSwitchTabs' + set).attr('data-metacodes').split(',');\n      $('.customMetacodeList li').addClass('toggledOff');\n      console.log(codesToSwitchToIds);\n      Create.selectedMetacodes = codesToSwitchToIds;\n      Create.selectedMetacodeNames = _DataModel2.default.Metacodes.filter(function (m) {return codesToSwitchToIds.indexOf(m.id) > -1;}).map(function (m) {return m.get('name');});\n      Create.newSelectedMetacodes = codesToSwitchToIds;\n      Create.newSelectedMetacodeNames = _DataModel2.default.Metacodes.filter(function (m) {return codesToSwitchToIds.indexOf(m.id) > -1;}).map(function (m) {return m.get('name');});\n    } else if (custom) {\n      // uses .slice to avoid setting the two arrays to the same actual array\n      Create.selectedMetacodes = Create.newSelectedMetacodes.slice(0);\n      Create.selectedMetacodeNames = Create.newSelectedMetacodeNames.slice(0);\n      codesToSwitchToIds = Create.selectedMetacodes.slice(0);\n    }\n\n    // sort by name\n    codesToSwitchToIds.forEach(function (id) {\n      var metacode = _DataModel2.default.Metacodes.get(id);\n      metacodeModels.add(metacode);\n      $('.customMetacodeList #' + id).removeClass('toggledOff');\n    });\n    metacodeModels.sort();\n\n    $('#metacodeImg').removeData('cloudcarousel');\n    var newMetacodes = '';\n    metacodeModels.each(function (metacode) {\n      newMetacodes += '<img class=\"cloudcarousel\" width=\"40\" height=\"40\" src=\"' + metacode.get('icon') + '\" data-id=\"' + metacode.id + '\" title=\"' + metacode.get('name') + '\" alt=\"' + metacode.get('name') + '\"/>';\n    });\n\n    $('#metacodeImg').empty().append(newMetacodes).CloudCarousel({\n      yRadius: 40,\n      xRadius: 190,\n      xPos: 170,\n      yPos: 40,\n      speed: 0.3,\n      bringToFront: true });\n\n\n    Create.newTopic.setMetacode(metacodeModels.models[0].id);\n\n    _GlobalUI2.default.closeLightbox();\n    $('#topic_name').focus();\n\n    var mdata = {\n      'metacodes': {\n        'value': custom ? Create.selectedMetacodes.toString() : Create.selectedMetacodeSet } };\n\n\n    $.ajax({\n      type: 'POST',\n      dataType: 'json',\n      url: '/user/updatemetacodes',\n      data: mdata,\n      success: function success(data) {\n        console.log('selected metacodes saved');\n      },\n      error: function error() {\n        console.log('failed to save selected metacodes');\n      } });\n\n  },\n\n  cancelMetacodeSetSwitch: function cancelMetacodeSetSwitch() {\n    var self = Create;\n    self.isSwitchingSet = false;\n\n    if (self.selectedMetacodeSet === 'metacodeset-custom') {\n      // reset it to the current actual selection\n      $('.customMetacodeList li').addClass('toggledOff');\n      for (var i = 0; i < self.selectedMetacodes.length; i++) {\n        $('#' + self.selectedMetacodes[i]).removeClass('toggledOff');\n      }\n      // uses .slice to avoid setting the two arrays to the same actual array\n      self.newSelectedMetacodeNames = self.selectedMetacodeNames.slice(0);\n      self.newSelectedMetacodes = self.selectedMetacodes.slice(0);\n    }\n    $('#metacodeSwitchTabs').tabs('option', 'active', self.selectedMetacodeSetIndex);\n    $('#topic_name').focus();\n  },\n  newTopic: {\n    init: function init(serverData) {\n      var DOWN_ARROW = 40;\n      var ESC = 27;\n\n      if (!serverData.ActiveMapper) return;\n\n      $('#topic_name').keyup(function (e) {\n\n        Create.newTopic.name = $(this).val();\n        if (e.which == DOWN_ARROW && !Create.newTopic.name.length) {\n          Create.newTopic.openSelector();\n        }\n\n        if (e.keyCode === ESC) {\n          Create.newTopic.hide();\n        } // if\n      });\n\n      $('.selectedMetacode').click(function () {\n        if (Create.newTopic.metacodeSelectorOpen) {\n          Create.newTopic.hideSelector();\n          $('#topic_name').focus();\n        } else Create.newTopic.openSelector();\n      });\n\n      Create.newTopic.initSelector();\n\n      var topicBloodhound = new Bloodhound({\n        datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),\n        queryTokenizer: Bloodhound.tokenizers.whitespace,\n        remote: {\n          url: '/topics/autocomplete_topic?term=%QUERY',\n          wildcard: '%QUERY' } });\n\n\n\n      // initialize the autocomplete results for the metacode spinner\n      $('#topic_name').typeahead(\n      {\n        highlight: true,\n        minLength: 2 },\n\n      [{\n        name: 'topic_autocomplete',\n        limit: 8,\n        display: function display(s) {return s.label;},\n        templates: {\n          suggestion: function suggestion(s) {\n            return Hogan.compile($('#topicAutocompleteTemplate').html()).render(s);\n          } },\n\n        source: topicBloodhound }]);\n\n\n\n      // tell the autocomplete to submit the form with the topic you clicked on if you pick from the autocomplete\n      $('#topic_name').bind('typeahead:select', function (event, datum, dataset) {\n        Create.newTopic.beingCreated = false;\n        if (datum.rtype === 'topic') {\n          _Topic2.default.getTopicFromAutocomplete(datum.id);\n        } else if (datum.rtype === 'map') {\n          _Topic2.default.getMapFromAutocomplete({\n            id: datum.id,\n            name: datum.label });\n\n        }\n      });\n      $('#topic_name').click(function () {Create.newTopic.hideSelector();});\n\n      // initialize metacode spinner and then hide it\n      $('#metacodeImg').CloudCarousel({\n        yRadius: 40,\n        xRadius: 190,\n        xPos: 170,\n        yPos: 40,\n        speed: 0.3,\n        bringToFront: true });\n\n      $('#new_topic').hide().\n      css({ left: '50%', top: '50%' }).\n      attr('oncontextmenu', 'return false'); // prevents the mouse up event from opening the default context menu on this element\n    },\n    name: null,\n    newId: 1,\n    beingCreated: false,\n    metacodeSelectorOpen: false,\n    metacode: null,\n    x: null,\n    y: null,\n    addSynapse: false,\n    pinned: false,\n    initSelector: function initSelector() {\n      _reactDom2.default.render(\n      _react2.default.createElement(_MetacodeSelect2.default, {\n        onClick: function onClick(id) {\n          Create.newTopic.setMetacode(id);\n          Create.newTopic.hideSelector();\n          $('#topic_name').focus();\n        },\n        close: function close() {\n          Create.newTopic.hideSelector();\n          $('#topic_name').focus();\n        },\n        metacodes: _DataModel2.default.Metacodes.filter(function (m) {return Create.selectedMetacodes.indexOf(m.id.toString()) > -1;}) }),\n\n      document.getElementById('metacodeSelector'));\n\n    },\n    openSelector: function openSelector() {\n      Create.newTopic.initSelector();\n      $('#metacodeSelector').show();\n      Create.newTopic.metacodeSelectorOpen = true;\n      $('.metacodeFilterInput').focus();\n      $('.selectedMetacode').addClass('isBeingSelected');\n    },\n    hideSelector: function hideSelector() {\n      _reactDom2.default.unmountComponentAtNode(document.getElementById('metacodeSelector'));\n      $('#metacodeSelector').hide();\n      Create.newTopic.metacodeSelectorOpen = false;\n      $('.selectedMetacode').removeClass('isBeingSelected');\n    },\n    setMetacode: function setMetacode(id) {\n      Create.newTopic.metacode = id;\n      var metacode = _DataModel2.default.Metacodes.get(id);\n      $('.selectedMetacode img').attr('src', metacode.get('icon'));\n      $('.selectedMetacode span').html(metacode.get('name'));\n      $.ajax({\n        type: 'POST',\n        dataType: 'json',\n        url: '/user/update_metacode_focus',\n        data: { value: id },\n        success: function success(data) {},\n        error: function error() {\n          console.log('failed to save metacode focus');\n        } });\n\n    },\n    reset: function reset() {\n      $('#topic_name').typeahead('val', '');\n      Create.newTopic.hideSelector();\n    },\n    position: function position() {\n      var pixels = _Util2.default.coordsToPixels(_Visualize2.default.mGraph, _Mouse2.default.newNodeCoords);\n      $('#new_topic').css({\n        left: pixels.x,\n        top: pixels.y });\n\n    } },\n\n  newSynapse: {\n    init: function init() {\n      var synapseBloodhound = new Bloodhound({\n        datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),\n        queryTokenizer: Bloodhound.tokenizers.whitespace,\n        remote: {\n          url: '/search/synapses?term=%QUERY',\n          wildcard: '%QUERY' } });\n\n\n      var existingSynapseBloodhound = new Bloodhound({\n        datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),\n        queryTokenizer: Bloodhound.tokenizers.whitespace,\n        remote: {\n          url: '/search/synapses?topic1id=%TOPIC1&topic2id=%TOPIC2',\n          prepare: function prepare(query, settings) {\n            var self = Create.newSynapse;\n            if (_Selected2.default.Nodes.length < 2 && self.topic1id && self.topic2id) {\n              settings.url = settings.url.replace('%TOPIC1', self.topic1id).replace('%TOPIC2', self.topic2id);\n              return settings;\n            } else {\n              return null;\n            }\n          } } });\n\n\n\n      // initialize the autocomplete results for synapse creation\n      $('#synapse_desc').typeahead(\n      {\n        highlight: true,\n        minLength: 2 },\n\n      [{\n        name: 'synapse_autocomplete',\n        display: function display(s) {return s.label;},\n        templates: {\n          suggestion: function suggestion(s) {\n            return Hogan.compile(\"<div class='genericSynapseDesc'>{{label}}</div>\").render(s);\n          } },\n\n        source: synapseBloodhound },\n\n      {\n        name: 'existing_synapses',\n        limit: 50,\n        display: function display(s) {return s.label;},\n        templates: {\n          suggestion: function suggestion(s) {\n            return Hogan.compile($('#synapseAutocompleteTemplate').html()).render(s);\n          },\n          header: '<h3>Existing synapses</h3>' },\n\n        source: existingSynapseBloodhound }]);\n\n\n\n      $('#synapse_desc').keyup(function (e) {\n        var ESC = 27;\n\n        if (e.keyCode === ESC) {\n          Create.newSynapse.hide();\n        } // if\n\n        Create.newSynapse.description = $(this).val();\n      });\n\n      $('#synapse_desc').focusout(function () {\n        if (Create.newSynapse.beingCreated) {\n          _Synapse2.default.createSynapseLocally(Create.newSynapse.topic1id, Create.newSynapse.topic2id);\n          _Engine2.default.runLayout();\n          Create.newSynapse.hide();\n        }\n      });\n\n      $('#synapse_desc').keydown(function (e) {\n        var TAB = 9;\n        if (Create.newSynapse.beingCreated && e.keyCode === TAB) {\n          e.preventDefault();\n          _Synapse2.default.createSynapseLocally(Create.newSynapse.topic1id, Create.newSynapse.topic2id);\n          _Engine2.default.runLayout();\n          Create.newSynapse.hide();\n        }\n      });\n\n      $('#synapse_desc').bind('typeahead:select', function (event, datum, dataset) {\n        if (datum.id) {// if they clicked on an existing synapse get it\n          _Synapse2.default.getSynapseFromAutocomplete(datum.id);\n        } else {\n          Create.newSynapse.description = datum.value;\n          _Synapse2.default.createSynapseLocally(Create.newSynapse.topic1id, Create.newSynapse.topic2id);\n          _Engine2.default.runLayout();\n          Create.newSynapse.hide();\n        }\n      });\n    },\n    focusNode: null,\n    beingCreated: false,\n    description: null,\n    topic1id: null,\n    topic2id: null,\n    newSynapseId: null,\n    open: function open() {\n      $('#new_synapse').fadeIn(100, function () {\n        $('#synapse_desc').focus();\n      });\n      Create.newSynapse.beingCreated = true;\n    },\n    hide: function hide() {\n      $('#new_synapse').fadeOut('fast');\n      $('#synapse_desc').typeahead('val', '');\n      Create.newSynapse.beingCreated = false;\n      Create.newTopic.addSynapse = false;\n      Create.newSynapse.topic1id = 0;\n      Create.newSynapse.topic2id = 0;\n      Create.newSynapse.node1 = null;\n      Create.newSynapse.node2 = null;\n      _Mouse2.default.synapseStartCoordinates = [];\n      _Mouse2.default.synapseEndCoordinates = null;\n      if (_Visualize2.default.mGraph) _Visualize2.default.mGraph.plot();\n    },\n    updateForm: function updateForm() {\n      var pixelPos = void 0,midpoint = {};\n      if (Create.newSynapse.beingCreated) {\n        _Mouse2.default.synapseEndCoordinates = {\n          x: Create.newSynapse.node2.pos.getc().x,\n          y: Create.newSynapse.node2.pos.getc().y };\n\n        // position the form\n        midpoint.x = Create.newSynapse.node1.pos.getc().x + (Create.newSynapse.node2.pos.getc().x - Create.newSynapse.node1.pos.getc().x) / 2;\n        midpoint.y = Create.newSynapse.node1.pos.getc().y + (Create.newSynapse.node2.pos.getc().y - Create.newSynapse.node1.pos.getc().y) / 2;\n        pixelPos = _Util2.default.coordsToPixels(_Visualize2.default.mGraph, midpoint);\n        $('#new_synapse').css('left', pixelPos.x + 'px');\n        $('#new_synapse').css('top', pixelPos.y + 'px');\n      }\n    } } };exports.default =\n\n\n\nCreate;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTczLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvQ3JlYXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGdsb2JhbCBNZXRhbWFwcywgJCwgSG9nYW4sIEJsb29kaG91bmQgKi9cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSdcblxuaW1wb3J0IERhdGFNb2RlbCBmcm9tICcuL0RhdGFNb2RlbCdcbmltcG9ydCBFbmdpbmUgZnJvbSAnLi9FbmdpbmUnXG5pbXBvcnQgTWV0YWNvZGVTZWxlY3QgZnJvbSAnLi4vY29tcG9uZW50cy9NZXRhY29kZVNlbGVjdCdcbmltcG9ydCBNb3VzZSBmcm9tICcuL01vdXNlJ1xuaW1wb3J0IFNlbGVjdGVkIGZyb20gJy4vU2VsZWN0ZWQnXG5pbXBvcnQgU3luYXBzZSBmcm9tICcuL1N5bmFwc2UnXG5pbXBvcnQgVG9waWMgZnJvbSAnLi9Ub3BpYydcbmltcG9ydCBVdGlsIGZyb20gJy4vVXRpbCdcbmltcG9ydCBWaXN1YWxpemUgZnJvbSAnLi9WaXN1YWxpemUnXG5pbXBvcnQgR2xvYmFsVUkgZnJvbSAnLi9HbG9iYWxVSSdcblxuY29uc3QgQ3JlYXRlID0ge1xuICBpc1N3aXRjaGluZ1NldDogZmFsc2UsIC8vIGluZGljYXRlcyB3aGV0aGVyIHRoZSBtZXRhY29kZSBzZXQgc3dpdGNoIGxpZ2h0Ym94IGlzIG9wZW5cbiAgc2VsZWN0ZWRNZXRhY29kZVNldDogbnVsbCxcbiAgc2VsZWN0ZWRNZXRhY29kZVNldEluZGV4OiBudWxsLFxuICBzZWxlY3RlZE1ldGFjb2RlTmFtZXM6IFtdLFxuICBuZXdTZWxlY3RlZE1ldGFjb2RlTmFtZXM6IFtdLFxuICBzZWxlY3RlZE1ldGFjb2RlczogW10sXG4gIG5ld1NlbGVjdGVkTWV0YWNvZGVzOiBbXSxcbiAgcmVjZW50TWV0YWNvZGVzOiBbXSxcbiAgbW9zdFVzZWRNZXRhY29kZXM6IFtdLFxuICBpbml0OiBmdW5jdGlvbiAoc2VydmVyRGF0YSkge1xuICAgIHZhciBzZWxmID0gQ3JlYXRlXG4gICAgc2VsZi5uZXdUb3BpYy5pbml0KHNlcnZlckRhdGEpXG4gICAgc2VsZi5uZXdTeW5hcHNlLmluaXQoKVxuXG4gICAgLy8gLy8gU1dJVENISU5HIE1FVEFDT0RFIFNFVFNcblxuICAgICQoJyNtZXRhY29kZVN3aXRjaFRhYnMnKS50YWJzKHtcbiAgICAgIGFjdGl2ZTogc2VsZi5zZWxlY3RlZE1ldGFjb2RlU2V0SW5kZXhcbiAgICB9KS5hZGRDbGFzcygndWktdGFicy12ZXJ0aWNhbCB1aS1oZWxwZXItY2xlYXJmaXgnKVxuICAgICQoJyNtZXRhY29kZVN3aXRjaFRhYnMgLnVpLXRhYnMtbmF2IGxpJykucmVtb3ZlQ2xhc3MoJ3VpLWNvcm5lci10b3AnKS5hZGRDbGFzcygndWktY29ybmVyLWxlZnQnKVxuICAgICQoJy5jdXN0b21NZXRhY29kZUxpc3QgbGknKS5jbGljayhzZWxmLnRvZ2dsZU1ldGFjb2RlU2VsZWN0ZWQpIC8vIHdpdGhpbiB0aGUgY3VzdG9tIG1ldGFjb2RlIHNldCB0YWJcbiAgfSxcbiAgdG9nZ2xlTWV0YWNvZGVTZWxlY3RlZDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSBDcmVhdGVcblxuICAgIGlmICgkKHRoaXMpLmF0dHIoJ2NsYXNzJykgIT09ICd0b2dnbGVkT2ZmJykge1xuICAgICAgJCh0aGlzKS5hZGRDbGFzcygndG9nZ2xlZE9mZicpXG4gICAgICB2YXIgdmFsdWVUb1JlbW92ZSA9ICQodGhpcykuYXR0cignaWQnKVxuICAgICAgdmFyIG5hbWVUb1JlbW92ZSA9ICQodGhpcykuYXR0cignZGF0YS1uYW1lJylcbiAgICAgIHNlbGYubmV3U2VsZWN0ZWRNZXRhY29kZXMuc3BsaWNlKHNlbGYubmV3U2VsZWN0ZWRNZXRhY29kZXMuaW5kZXhPZih2YWx1ZVRvUmVtb3ZlKSwgMSlcbiAgICAgIHNlbGYubmV3U2VsZWN0ZWRNZXRhY29kZU5hbWVzLnNwbGljZShzZWxmLm5ld1NlbGVjdGVkTWV0YWNvZGVOYW1lcy5pbmRleE9mKG5hbWVUb1JlbW92ZSksIDEpXG4gICAgfSBlbHNlIGlmICgkKHRoaXMpLmF0dHIoJ2NsYXNzJykgPT09ICd0b2dnbGVkT2ZmJykge1xuICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygndG9nZ2xlZE9mZicpXG4gICAgICBzZWxmLm5ld1NlbGVjdGVkTWV0YWNvZGVzLnB1c2goJCh0aGlzKS5hdHRyKCdpZCcpKVxuICAgICAgc2VsZi5uZXdTZWxlY3RlZE1ldGFjb2RlTmFtZXMucHVzaCgkKHRoaXMpLmF0dHIoJ2RhdGEtbmFtZScpKVxuICAgIH1cbiAgfSxcbiAgdXBkYXRlTWV0YWNvZGVTZXQ6IGZ1bmN0aW9uKHNldCwgaW5kZXgsIGN1c3RvbSkge1xuICAgIGlmIChjdXN0b20gJiYgQ3JlYXRlLm5ld1NlbGVjdGVkTWV0YWNvZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgd2luZG93LmFsZXJ0KCdQbGVhc2Ugc2VsZWN0IGF0IGxlYXN0IG9uZSBtZXRhY29kZSB0byB1c2UhJylcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHZhciBjb2Rlc1RvU3dpdGNoVG9JZHNcbiAgICB2YXIgbWV0YWNvZGVNb2RlbHMgPSBuZXcgRGF0YU1vZGVsLk1ldGFjb2RlQ29sbGVjdGlvbigpXG4gICAgQ3JlYXRlLnNlbGVjdGVkTWV0YWNvZGVTZXRJbmRleCA9IGluZGV4XG4gICAgQ3JlYXRlLnNlbGVjdGVkTWV0YWNvZGVTZXQgPSAnbWV0YWNvZGVzZXQtJyArIHNldFxuXG4gICAgaWYgKCFjdXN0b20pIHtcbiAgICAgIGNvZGVzVG9Td2l0Y2hUb0lkcyA9ICQoJyNtZXRhY29kZVN3aXRjaFRhYnMnICsgc2V0KS5hdHRyKCdkYXRhLW1ldGFjb2RlcycpLnNwbGl0KCcsJylcbiAgICAgICQoJy5jdXN0b21NZXRhY29kZUxpc3QgbGknKS5hZGRDbGFzcygndG9nZ2xlZE9mZicpXG5jb25zb2xlLmxvZyhjb2Rlc1RvU3dpdGNoVG9JZHMpXG4gICAgICBDcmVhdGUuc2VsZWN0ZWRNZXRhY29kZXMgPSBjb2Rlc1RvU3dpdGNoVG9JZHNcbiAgICAgIENyZWF0ZS5zZWxlY3RlZE1ldGFjb2RlTmFtZXMgPSBEYXRhTW9kZWwuTWV0YWNvZGVzLmZpbHRlcihtID0+IGNvZGVzVG9Td2l0Y2hUb0lkcy5pbmRleE9mKG0uaWQpID4gLTEpLm1hcChtID0+IG0uZ2V0KCduYW1lJykpICBcbiAgICAgIENyZWF0ZS5uZXdTZWxlY3RlZE1ldGFjb2RlcyA9IGNvZGVzVG9Td2l0Y2hUb0lkc1xuICAgICAgQ3JlYXRlLm5ld1NlbGVjdGVkTWV0YWNvZGVOYW1lcyA9IERhdGFNb2RlbC5NZXRhY29kZXMuZmlsdGVyKG0gPT4gY29kZXNUb1N3aXRjaFRvSWRzLmluZGV4T2YobS5pZCkgPiAtMSkubWFwKG0gPT4gbS5nZXQoJ25hbWUnKSkgIFxuICAgIH0gZWxzZSBpZiAoY3VzdG9tKSB7XG4gICAgICAvLyB1c2VzIC5zbGljZSB0byBhdm9pZCBzZXR0aW5nIHRoZSB0d28gYXJyYXlzIHRvIHRoZSBzYW1lIGFjdHVhbCBhcnJheVxuICAgICAgQ3JlYXRlLnNlbGVjdGVkTWV0YWNvZGVzID0gQ3JlYXRlLm5ld1NlbGVjdGVkTWV0YWNvZGVzLnNsaWNlKDApXG4gICAgICBDcmVhdGUuc2VsZWN0ZWRNZXRhY29kZU5hbWVzID0gQ3JlYXRlLm5ld1NlbGVjdGVkTWV0YWNvZGVOYW1lcy5zbGljZSgwKVxuICAgICAgY29kZXNUb1N3aXRjaFRvSWRzID0gQ3JlYXRlLnNlbGVjdGVkTWV0YWNvZGVzLnNsaWNlKDApXG4gICAgfVxuXG4gICAgLy8gc29ydCBieSBuYW1lXG4gICAgY29kZXNUb1N3aXRjaFRvSWRzLmZvckVhY2goaWQgPT4ge1xuICAgICAgY29uc3QgbWV0YWNvZGUgPSBEYXRhTW9kZWwuTWV0YWNvZGVzLmdldChpZClcbiAgICAgIG1ldGFjb2RlTW9kZWxzLmFkZChtZXRhY29kZSlcbiAgICAgICQoJy5jdXN0b21NZXRhY29kZUxpc3QgIycgKyBpZCkucmVtb3ZlQ2xhc3MoJ3RvZ2dsZWRPZmYnKVxuICAgIH0pXG4gICAgbWV0YWNvZGVNb2RlbHMuc29ydCgpXG5cbiAgICAkKCcjbWV0YWNvZGVJbWcnKS5yZW1vdmVEYXRhKCdjbG91ZGNhcm91c2VsJylcbiAgICB2YXIgbmV3TWV0YWNvZGVzID0gJydcbiAgICBtZXRhY29kZU1vZGVscy5lYWNoKGZ1bmN0aW9uKG1ldGFjb2RlKSB7XG4gICAgICBuZXdNZXRhY29kZXMgKz0gJzxpbWcgY2xhc3M9XCJjbG91ZGNhcm91c2VsXCIgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgc3JjPVwiJyArIG1ldGFjb2RlLmdldCgnaWNvbicpICsgJ1wiIGRhdGEtaWQ9XCInICsgbWV0YWNvZGUuaWQgKyAnXCIgdGl0bGU9XCInICsgbWV0YWNvZGUuZ2V0KCduYW1lJykgKyAnXCIgYWx0PVwiJyArIG1ldGFjb2RlLmdldCgnbmFtZScpICsgJ1wiLz4nXG4gICAgfSlcblxuICAgICQoJyNtZXRhY29kZUltZycpLmVtcHR5KCkuYXBwZW5kKG5ld01ldGFjb2RlcykuQ2xvdWRDYXJvdXNlbCh7XG4gICAgICB5UmFkaXVzOiA0MCxcbiAgICAgIHhSYWRpdXM6IDE5MCxcbiAgICAgIHhQb3M6IDE3MCxcbiAgICAgIHlQb3M6IDQwLFxuICAgICAgc3BlZWQ6IDAuMyxcbiAgICAgIGJyaW5nVG9Gcm9udDogdHJ1ZVxuICAgIH0pXG5cbiAgICBDcmVhdGUubmV3VG9waWMuc2V0TWV0YWNvZGUobWV0YWNvZGVNb2RlbHMubW9kZWxzWzBdLmlkKVxuXG4gICAgR2xvYmFsVUkuY2xvc2VMaWdodGJveCgpXG4gICAgJCgnI3RvcGljX25hbWUnKS5mb2N1cygpXG5cbiAgICB2YXIgbWRhdGEgPSB7XG4gICAgICAnbWV0YWNvZGVzJzoge1xuICAgICAgICAndmFsdWUnOiBjdXN0b20gPyBDcmVhdGUuc2VsZWN0ZWRNZXRhY29kZXMudG9TdHJpbmcoKSA6IENyZWF0ZS5zZWxlY3RlZE1ldGFjb2RlU2V0XG4gICAgICB9XG4gICAgfVxuICAgICQuYWpheCh7XG4gICAgICB0eXBlOiAnUE9TVCcsXG4gICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgdXJsOiAnL3VzZXIvdXBkYXRlbWV0YWNvZGVzJyxcbiAgICAgIGRhdGE6IG1kYXRhLFxuICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICBjb25zb2xlLmxvZygnc2VsZWN0ZWQgbWV0YWNvZGVzIHNhdmVkJylcbiAgICAgIH0sXG4gICAgICBlcnJvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdmYWlsZWQgdG8gc2F2ZSBzZWxlY3RlZCBtZXRhY29kZXMnKVxuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgY2FuY2VsTWV0YWNvZGVTZXRTd2l0Y2g6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gQ3JlYXRlXG4gICAgc2VsZi5pc1N3aXRjaGluZ1NldCA9IGZhbHNlXG5cbiAgICBpZiAoc2VsZi5zZWxlY3RlZE1ldGFjb2RlU2V0ID09PSAnbWV0YWNvZGVzZXQtY3VzdG9tJykge1xuICAgICAgLy8gcmVzZXQgaXQgdG8gdGhlIGN1cnJlbnQgYWN0dWFsIHNlbGVjdGlvblxuICAgICAgJCgnLmN1c3RvbU1ldGFjb2RlTGlzdCBsaScpLmFkZENsYXNzKCd0b2dnbGVkT2ZmJylcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5zZWxlY3RlZE1ldGFjb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAkKCcjJyArIHNlbGYuc2VsZWN0ZWRNZXRhY29kZXNbaV0pLnJlbW92ZUNsYXNzKCd0b2dnbGVkT2ZmJylcbiAgICAgIH1cbiAgICAgIC8vIHVzZXMgLnNsaWNlIHRvIGF2b2lkIHNldHRpbmcgdGhlIHR3byBhcnJheXMgdG8gdGhlIHNhbWUgYWN0dWFsIGFycmF5XG4gICAgICBzZWxmLm5ld1NlbGVjdGVkTWV0YWNvZGVOYW1lcyA9IHNlbGYuc2VsZWN0ZWRNZXRhY29kZU5hbWVzLnNsaWNlKDApXG4gICAgICBzZWxmLm5ld1NlbGVjdGVkTWV0YWNvZGVzID0gc2VsZi5zZWxlY3RlZE1ldGFjb2Rlcy5zbGljZSgwKVxuICAgIH1cbiAgICAkKCcjbWV0YWNvZGVTd2l0Y2hUYWJzJykudGFicygnb3B0aW9uJywgJ2FjdGl2ZScsIHNlbGYuc2VsZWN0ZWRNZXRhY29kZVNldEluZGV4KVxuICAgICQoJyN0b3BpY19uYW1lJykuZm9jdXMoKVxuICB9LFxuICBuZXdUb3BpYzoge1xuICAgIGluaXQ6IGZ1bmN0aW9uIChzZXJ2ZXJEYXRhKSB7XG4gICAgICBjb25zdCBET1dOX0FSUk9XID0gNDBcbiAgICAgIGNvbnN0IEVTQyA9IDI3XG5cbiAgICAgIGlmICghc2VydmVyRGF0YS5BY3RpdmVNYXBwZXIpIHJldHVyblxuXG4gICAgICAkKCcjdG9waWNfbmFtZScpLmtleXVwKGZ1bmN0aW9uIChlKSB7XG5cbiAgICAgICAgQ3JlYXRlLm5ld1RvcGljLm5hbWUgPSAkKHRoaXMpLnZhbCgpXG4gICAgICAgIGlmIChlLndoaWNoID09IERPV05fQVJST1cgJiYgIUNyZWF0ZS5uZXdUb3BpYy5uYW1lLmxlbmd0aCkge1xuICAgICAgICAgIENyZWF0ZS5uZXdUb3BpYy5vcGVuU2VsZWN0b3IoKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gRVNDKSB7XG4gICAgICAgICAgQ3JlYXRlLm5ld1RvcGljLmhpZGUoKVxuICAgICAgICB9IC8vIGlmXG4gICAgICB9KVxuICAgICAgXG4gICAgICAkKCcuc2VsZWN0ZWRNZXRhY29kZScpLmNsaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoQ3JlYXRlLm5ld1RvcGljLm1ldGFjb2RlU2VsZWN0b3JPcGVuKSB7XG4gICAgICAgICAgQ3JlYXRlLm5ld1RvcGljLmhpZGVTZWxlY3RvcigpXG4gICAgICAgICAgJCgnI3RvcGljX25hbWUnKS5mb2N1cygpXG4gICAgICAgIH0gZWxzZSBDcmVhdGUubmV3VG9waWMub3BlblNlbGVjdG9yKClcbiAgICAgIH0pXG4gICAgICBcbiAgICAgIENyZWF0ZS5uZXdUb3BpYy5pbml0U2VsZWN0b3IoKVxuICAgICAgXG4gICAgICB2YXIgdG9waWNCbG9vZGhvdW5kID0gbmV3IEJsb29kaG91bmQoe1xuICAgICAgICBkYXR1bVRva2VuaXplcjogQmxvb2Rob3VuZC50b2tlbml6ZXJzLm9iai53aGl0ZXNwYWNlKCd2YWx1ZScpLFxuICAgICAgICBxdWVyeVRva2VuaXplcjogQmxvb2Rob3VuZC50b2tlbml6ZXJzLndoaXRlc3BhY2UsXG4gICAgICAgIHJlbW90ZToge1xuICAgICAgICAgIHVybDogJy90b3BpY3MvYXV0b2NvbXBsZXRlX3RvcGljP3Rlcm09JVFVRVJZJyxcbiAgICAgICAgICB3aWxkY2FyZDogJyVRVUVSWSdcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgYXV0b2NvbXBsZXRlIHJlc3VsdHMgZm9yIHRoZSBtZXRhY29kZSBzcGlubmVyXG4gICAgICAkKCcjdG9waWNfbmFtZScpLnR5cGVhaGVhZChcbiAgICAgICAge1xuICAgICAgICAgIGhpZ2hsaWdodDogdHJ1ZSxcbiAgICAgICAgICBtaW5MZW5ndGg6IDJcbiAgICAgICAgfSxcbiAgICAgICAgW3tcbiAgICAgICAgICBuYW1lOiAndG9waWNfYXV0b2NvbXBsZXRlJyxcbiAgICAgICAgICBsaW1pdDogOCxcbiAgICAgICAgICBkaXNwbGF5OiBmdW5jdGlvbihzKSB7IHJldHVybiBzLmxhYmVsIH0sXG4gICAgICAgICAgdGVtcGxhdGVzOiB7XG4gICAgICAgICAgICBzdWdnZXN0aW9uOiBmdW5jdGlvbihzKSB7XG4gICAgICAgICAgICAgIHJldHVybiBIb2dhbi5jb21waWxlKCQoJyN0b3BpY0F1dG9jb21wbGV0ZVRlbXBsYXRlJykuaHRtbCgpKS5yZW5kZXIocylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHNvdXJjZTogdG9waWNCbG9vZGhvdW5kXG4gICAgICAgIH1dXG4gICAgICApXG5cbiAgICAgIC8vIHRlbGwgdGhlIGF1dG9jb21wbGV0ZSB0byBzdWJtaXQgdGhlIGZvcm0gd2l0aCB0aGUgdG9waWMgeW91IGNsaWNrZWQgb24gaWYgeW91IHBpY2sgZnJvbSB0aGUgYXV0b2NvbXBsZXRlXG4gICAgICAkKCcjdG9waWNfbmFtZScpLmJpbmQoJ3R5cGVhaGVhZDpzZWxlY3QnLCBmdW5jdGlvbihldmVudCwgZGF0dW0sIGRhdGFzZXQpIHtcbiAgICAgICAgQ3JlYXRlLm5ld1RvcGljLmJlaW5nQ3JlYXRlZCA9IGZhbHNlXG4gICAgICAgIGlmIChkYXR1bS5ydHlwZSA9PT0gJ3RvcGljJykge1xuICAgICAgICAgIFRvcGljLmdldFRvcGljRnJvbUF1dG9jb21wbGV0ZShkYXR1bS5pZClcbiAgICAgICAgfSBlbHNlIGlmIChkYXR1bS5ydHlwZSA9PT0gJ21hcCcpIHtcbiAgICAgICAgICBUb3BpYy5nZXRNYXBGcm9tQXV0b2NvbXBsZXRlKHtcbiAgICAgICAgICAgIGlkOiBkYXR1bS5pZCxcbiAgICAgICAgICAgIG5hbWU6IGRhdHVtLmxhYmVsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgICQoJyN0b3BpY19uYW1lJykuY2xpY2soZnVuY3Rpb24oKSB7IENyZWF0ZS5uZXdUb3BpYy5oaWRlU2VsZWN0b3IoKSB9KVxuXG4gICAgICAvLyBpbml0aWFsaXplIG1ldGFjb2RlIHNwaW5uZXIgYW5kIHRoZW4gaGlkZSBpdFxuICAgICAgJCgnI21ldGFjb2RlSW1nJykuQ2xvdWRDYXJvdXNlbCh7XG4gICAgICAgIHlSYWRpdXM6IDQwLFxuICAgICAgICB4UmFkaXVzOiAxOTAsXG4gICAgICAgIHhQb3M6IDE3MCxcbiAgICAgICAgeVBvczogNDAsXG4gICAgICAgIHNwZWVkOiAwLjMsXG4gICAgICAgIGJyaW5nVG9Gcm9udDogdHJ1ZVxuICAgICAgfSlcbiAgICAgICQoJyNuZXdfdG9waWMnKS5oaWRlKClcbiAgICAgICAgLmNzcyh7IGxlZnQ6ICc1MCUnLCB0b3A6ICc1MCUnIH0pXG4gICAgICAgIC5hdHRyKCdvbmNvbnRleHRtZW51JywgJ3JldHVybiBmYWxzZScpIC8vIHByZXZlbnRzIHRoZSBtb3VzZSB1cCBldmVudCBmcm9tIG9wZW5pbmcgdGhlIGRlZmF1bHQgY29udGV4dCBtZW51IG9uIHRoaXMgZWxlbWVudFxuICAgIH0sXG4gICAgbmFtZTogbnVsbCxcbiAgICBuZXdJZDogMSxcbiAgICBiZWluZ0NyZWF0ZWQ6IGZhbHNlLFxuICAgIG1ldGFjb2RlU2VsZWN0b3JPcGVuOiBmYWxzZSxcbiAgICBtZXRhY29kZTogbnVsbCxcbiAgICB4OiBudWxsLFxuICAgIHk6IG51bGwsXG4gICAgYWRkU3luYXBzZTogZmFsc2UsXG4gICAgcGlubmVkOiBmYWxzZSxcbiAgICBpbml0U2VsZWN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgIFJlYWN0RE9NLnJlbmRlcihcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChNZXRhY29kZVNlbGVjdCwge1xuICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAgICAgQ3JlYXRlLm5ld1RvcGljLnNldE1ldGFjb2RlKGlkKVxuICAgICAgICAgICAgQ3JlYXRlLm5ld1RvcGljLmhpZGVTZWxlY3RvcigpXG4gICAgICAgICAgICAkKCcjdG9waWNfbmFtZScpLmZvY3VzKClcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBDcmVhdGUubmV3VG9waWMuaGlkZVNlbGVjdG9yKClcbiAgICAgICAgICAgICQoJyN0b3BpY19uYW1lJykuZm9jdXMoKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWV0YWNvZGVzOiBEYXRhTW9kZWwuTWV0YWNvZGVzLmZpbHRlcihtID0+IENyZWF0ZS5zZWxlY3RlZE1ldGFjb2Rlcy5pbmRleE9mKG0uaWQudG9TdHJpbmcoKSkgPiAtMSlcbiAgICAgICAgfSksXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXRhY29kZVNlbGVjdG9yJylcbiAgICAgIClcbiAgICB9LFxuICAgIG9wZW5TZWxlY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgQ3JlYXRlLm5ld1RvcGljLmluaXRTZWxlY3RvcigpXG4gICAgICAkKCcjbWV0YWNvZGVTZWxlY3RvcicpLnNob3coKVxuICAgICAgQ3JlYXRlLm5ld1RvcGljLm1ldGFjb2RlU2VsZWN0b3JPcGVuID0gdHJ1ZVxuICAgICAgJCgnLm1ldGFjb2RlRmlsdGVySW5wdXQnKS5mb2N1cygpXG4gICAgICAkKCcuc2VsZWN0ZWRNZXRhY29kZScpLmFkZENsYXNzKCdpc0JlaW5nU2VsZWN0ZWQnKVxuICAgIH0sXG4gICAgaGlkZVNlbGVjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICBSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXRhY29kZVNlbGVjdG9yJykpXG4gICAgICAkKCcjbWV0YWNvZGVTZWxlY3RvcicpLmhpZGUoKVxuICAgICAgQ3JlYXRlLm5ld1RvcGljLm1ldGFjb2RlU2VsZWN0b3JPcGVuID0gZmFsc2VcbiAgICAgICQoJy5zZWxlY3RlZE1ldGFjb2RlJykucmVtb3ZlQ2xhc3MoJ2lzQmVpbmdTZWxlY3RlZCcpXG4gICAgfSxcbiAgICBzZXRNZXRhY29kZTogZnVuY3Rpb24gKGlkKSB7XG4gICAgICBDcmVhdGUubmV3VG9waWMubWV0YWNvZGUgPSBpZFxuICAgICAgdmFyIG1ldGFjb2RlID0gRGF0YU1vZGVsLk1ldGFjb2Rlcy5nZXQoaWQpXG4gICAgICAkKCcuc2VsZWN0ZWRNZXRhY29kZSBpbWcnKS5hdHRyKCdzcmMnLCBtZXRhY29kZS5nZXQoJ2ljb24nKSlcbiAgICAgICQoJy5zZWxlY3RlZE1ldGFjb2RlIHNwYW4nKS5odG1sKG1ldGFjb2RlLmdldCgnbmFtZScpKVxuICAgICAgJC5hamF4KHtcbiAgICAgICAgdHlwZTogJ1BPU1QnLFxuICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgICB1cmw6ICcvdXNlci91cGRhdGVfbWV0YWNvZGVfZm9jdXMnLFxuICAgICAgICBkYXRhOiB7IHZhbHVlOiBpZCB9LFxuICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge30sXG4gICAgICAgIGVycm9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ2ZhaWxlZCB0byBzYXZlIG1ldGFjb2RlIGZvY3VzJylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9LFxuICAgIHJlc2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICQoJyN0b3BpY19uYW1lJykudHlwZWFoZWFkKCd2YWwnLCAnJylcbiAgICAgIENyZWF0ZS5uZXdUb3BpYy5oaWRlU2VsZWN0b3IoKVxuICAgIH0sXG4gICAgcG9zaXRpb246IGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgcGl4ZWxzID0gVXRpbC5jb29yZHNUb1BpeGVscyhWaXN1YWxpemUubUdyYXBoLCBNb3VzZS5uZXdOb2RlQ29vcmRzKVxuICAgICAgJCgnI25ld190b3BpYycpLmNzcyh7XG4gICAgICAgIGxlZnQ6IHBpeGVscy54LFxuICAgICAgICB0b3A6IHBpeGVscy55XG4gICAgICB9KVxuICAgIH1cbiAgfSxcbiAgbmV3U3luYXBzZToge1xuICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHN5bmFwc2VCbG9vZGhvdW5kID0gbmV3IEJsb29kaG91bmQoe1xuICAgICAgICBkYXR1bVRva2VuaXplcjogQmxvb2Rob3VuZC50b2tlbml6ZXJzLm9iai53aGl0ZXNwYWNlKCd2YWx1ZScpLFxuICAgICAgICBxdWVyeVRva2VuaXplcjogQmxvb2Rob3VuZC50b2tlbml6ZXJzLndoaXRlc3BhY2UsXG4gICAgICAgIHJlbW90ZToge1xuICAgICAgICAgIHVybDogJy9zZWFyY2gvc3luYXBzZXM/dGVybT0lUVVFUlknLFxuICAgICAgICAgIHdpbGRjYXJkOiAnJVFVRVJZJ1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgdmFyIGV4aXN0aW5nU3luYXBzZUJsb29kaG91bmQgPSBuZXcgQmxvb2Rob3VuZCh7XG4gICAgICAgIGRhdHVtVG9rZW5pemVyOiBCbG9vZGhvdW5kLnRva2VuaXplcnMub2JqLndoaXRlc3BhY2UoJ3ZhbHVlJyksXG4gICAgICAgIHF1ZXJ5VG9rZW5pemVyOiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZSxcbiAgICAgICAgcmVtb3RlOiB7XG4gICAgICAgICAgdXJsOiAnL3NlYXJjaC9zeW5hcHNlcz90b3BpYzFpZD0lVE9QSUMxJnRvcGljMmlkPSVUT1BJQzInLFxuICAgICAgICAgIHByZXBhcmU6IGZ1bmN0aW9uKHF1ZXJ5LCBzZXR0aW5ncykge1xuICAgICAgICAgICAgdmFyIHNlbGYgPSBDcmVhdGUubmV3U3luYXBzZVxuICAgICAgICAgICAgaWYgKFNlbGVjdGVkLk5vZGVzLmxlbmd0aCA8IDIgJiYgc2VsZi50b3BpYzFpZCAmJiBzZWxmLnRvcGljMmlkKSB7XG4gICAgICAgICAgICAgIHNldHRpbmdzLnVybCA9IHNldHRpbmdzLnVybC5yZXBsYWNlKCclVE9QSUMxJywgc2VsZi50b3BpYzFpZCkucmVwbGFjZSgnJVRPUElDMicsIHNlbGYudG9waWMyaWQpXG4gICAgICAgICAgICAgIHJldHVybiBzZXR0aW5nc1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIGluaXRpYWxpemUgdGhlIGF1dG9jb21wbGV0ZSByZXN1bHRzIGZvciBzeW5hcHNlIGNyZWF0aW9uXG4gICAgICAkKCcjc3luYXBzZV9kZXNjJykudHlwZWFoZWFkKFxuICAgICAgICB7XG4gICAgICAgICAgaGlnaGxpZ2h0OiB0cnVlLFxuICAgICAgICAgIG1pbkxlbmd0aDogMlxuICAgICAgICB9LFxuICAgICAgICBbe1xuICAgICAgICAgIG5hbWU6ICdzeW5hcHNlX2F1dG9jb21wbGV0ZScsXG4gICAgICAgICAgZGlzcGxheTogZnVuY3Rpb24ocykgeyByZXR1cm4gcy5sYWJlbCB9LFxuICAgICAgICAgIHRlbXBsYXRlczoge1xuICAgICAgICAgICAgc3VnZ2VzdGlvbjogZnVuY3Rpb24ocykge1xuICAgICAgICAgICAgICByZXR1cm4gSG9nYW4uY29tcGlsZShcIjxkaXYgY2xhc3M9J2dlbmVyaWNTeW5hcHNlRGVzYyc+e3tsYWJlbH19PC9kaXY+XCIpLnJlbmRlcihzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgc291cmNlOiBzeW5hcHNlQmxvb2Rob3VuZFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2V4aXN0aW5nX3N5bmFwc2VzJyxcbiAgICAgICAgICBsaW1pdDogNTAsXG4gICAgICAgICAgZGlzcGxheTogZnVuY3Rpb24ocykgeyByZXR1cm4gcy5sYWJlbCB9LFxuICAgICAgICAgIHRlbXBsYXRlczoge1xuICAgICAgICAgICAgc3VnZ2VzdGlvbjogZnVuY3Rpb24ocykge1xuICAgICAgICAgICAgICByZXR1cm4gSG9nYW4uY29tcGlsZSgkKCcjc3luYXBzZUF1dG9jb21wbGV0ZVRlbXBsYXRlJykuaHRtbCgpKS5yZW5kZXIocylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoZWFkZXI6ICc8aDM+RXhpc3Rpbmcgc3luYXBzZXM8L2gzPidcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNvdXJjZTogZXhpc3RpbmdTeW5hcHNlQmxvb2Rob3VuZFxuICAgICAgICB9XVxuICAgICAgKVxuXG4gICAgICAkKCcjc3luYXBzZV9kZXNjJykua2V5dXAoZnVuY3Rpb24oZSkge1xuICAgICAgICBjb25zdCBFU0MgPSAyN1xuXG4gICAgICAgIGlmIChlLmtleUNvZGUgPT09IEVTQykge1xuICAgICAgICAgIENyZWF0ZS5uZXdTeW5hcHNlLmhpZGUoKVxuICAgICAgICB9IC8vIGlmXG5cbiAgICAgICAgQ3JlYXRlLm5ld1N5bmFwc2UuZGVzY3JpcHRpb24gPSAkKHRoaXMpLnZhbCgpXG4gICAgICB9KVxuXG4gICAgICAkKCcjc3luYXBzZV9kZXNjJykuZm9jdXNvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChDcmVhdGUubmV3U3luYXBzZS5iZWluZ0NyZWF0ZWQpIHtcbiAgICAgICAgICBTeW5hcHNlLmNyZWF0ZVN5bmFwc2VMb2NhbGx5KENyZWF0ZS5uZXdTeW5hcHNlLnRvcGljMWlkLCBDcmVhdGUubmV3U3luYXBzZS50b3BpYzJpZClcbiAgICAgICAgICBFbmdpbmUucnVuTGF5b3V0KClcbiAgICAgICAgICBDcmVhdGUubmV3U3luYXBzZS5oaWRlKClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgJCgnI3N5bmFwc2VfZGVzYycpLmtleWRvd24oZnVuY3Rpb24oZSkge1xuICAgICAgICBjb25zdCBUQUIgPSA5XG4gICAgICAgIGlmIChDcmVhdGUubmV3U3luYXBzZS5iZWluZ0NyZWF0ZWQgJiYgZS5rZXlDb2RlID09PSBUQUIpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICBTeW5hcHNlLmNyZWF0ZVN5bmFwc2VMb2NhbGx5KENyZWF0ZS5uZXdTeW5hcHNlLnRvcGljMWlkLCBDcmVhdGUubmV3U3luYXBzZS50b3BpYzJpZClcbiAgICAgICAgICBFbmdpbmUucnVuTGF5b3V0KClcbiAgICAgICAgICBDcmVhdGUubmV3U3luYXBzZS5oaWRlKClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgJCgnI3N5bmFwc2VfZGVzYycpLmJpbmQoJ3R5cGVhaGVhZDpzZWxlY3QnLCBmdW5jdGlvbihldmVudCwgZGF0dW0sIGRhdGFzZXQpIHtcbiAgICAgICAgaWYgKGRhdHVtLmlkKSB7IC8vIGlmIHRoZXkgY2xpY2tlZCBvbiBhbiBleGlzdGluZyBzeW5hcHNlIGdldCBpdFxuICAgICAgICAgIFN5bmFwc2UuZ2V0U3luYXBzZUZyb21BdXRvY29tcGxldGUoZGF0dW0uaWQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgQ3JlYXRlLm5ld1N5bmFwc2UuZGVzY3JpcHRpb24gPSBkYXR1bS52YWx1ZVxuICAgICAgICAgIFN5bmFwc2UuY3JlYXRlU3luYXBzZUxvY2FsbHkoQ3JlYXRlLm5ld1N5bmFwc2UudG9waWMxaWQsIENyZWF0ZS5uZXdTeW5hcHNlLnRvcGljMmlkKVxuICAgICAgICAgIEVuZ2luZS5ydW5MYXlvdXQoKVxuICAgICAgICAgIENyZWF0ZS5uZXdTeW5hcHNlLmhpZGUoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG4gICAgZm9jdXNOb2RlOiBudWxsLFxuICAgIGJlaW5nQ3JlYXRlZDogZmFsc2UsXG4gICAgZGVzY3JpcHRpb246IG51bGwsXG4gICAgdG9waWMxaWQ6IG51bGwsXG4gICAgdG9waWMyaWQ6IG51bGwsXG4gICAgbmV3U3luYXBzZUlkOiBudWxsLFxuICAgIG9wZW46IGZ1bmN0aW9uKCkge1xuICAgICAgJCgnI25ld19zeW5hcHNlJykuZmFkZUluKDEwMCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICQoJyNzeW5hcHNlX2Rlc2MnKS5mb2N1cygpXG4gICAgICB9KVxuICAgICAgQ3JlYXRlLm5ld1N5bmFwc2UuYmVpbmdDcmVhdGVkID0gdHJ1ZVxuICAgIH0sXG4gICAgaGlkZTogZnVuY3Rpb24oKSB7XG4gICAgICAkKCcjbmV3X3N5bmFwc2UnKS5mYWRlT3V0KCdmYXN0JylcbiAgICAgICQoJyNzeW5hcHNlX2Rlc2MnKS50eXBlYWhlYWQoJ3ZhbCcsICcnKVxuICAgICAgQ3JlYXRlLm5ld1N5bmFwc2UuYmVpbmdDcmVhdGVkID0gZmFsc2VcbiAgICAgIENyZWF0ZS5uZXdUb3BpYy5hZGRTeW5hcHNlID0gZmFsc2VcbiAgICAgIENyZWF0ZS5uZXdTeW5hcHNlLnRvcGljMWlkID0gMFxuICAgICAgQ3JlYXRlLm5ld1N5bmFwc2UudG9waWMyaWQgPSAwXG4gICAgICBDcmVhdGUubmV3U3luYXBzZS5ub2RlMSA9IG51bGxcbiAgICAgIENyZWF0ZS5uZXdTeW5hcHNlLm5vZGUyID0gbnVsbFxuICAgICAgTW91c2Uuc3luYXBzZVN0YXJ0Q29vcmRpbmF0ZXMgPSBbXVxuICAgICAgTW91c2Uuc3luYXBzZUVuZENvb3JkaW5hdGVzID0gbnVsbFxuICAgICAgaWYgKFZpc3VhbGl6ZS5tR3JhcGgpIFZpc3VhbGl6ZS5tR3JhcGgucGxvdCgpXG4gICAgfSxcbiAgICB1cGRhdGVGb3JtOiBmdW5jdGlvbigpIHtcbiAgICAgIGxldCBwaXhlbFBvcywgbWlkcG9pbnQgPSB7fVxuICAgICAgaWYgKENyZWF0ZS5uZXdTeW5hcHNlLmJlaW5nQ3JlYXRlZCkge1xuICAgICAgICBNb3VzZS5zeW5hcHNlRW5kQ29vcmRpbmF0ZXMgPSB7XG4gICAgICAgICAgeDogQ3JlYXRlLm5ld1N5bmFwc2Uubm9kZTIucG9zLmdldGMoKS54LFxuICAgICAgICAgIHk6IENyZWF0ZS5uZXdTeW5hcHNlLm5vZGUyLnBvcy5nZXRjKCkueVxuICAgICAgICB9XG4gICAgICAgIC8vIHBvc2l0aW9uIHRoZSBmb3JtXG4gICAgICAgIG1pZHBvaW50LnggPSBDcmVhdGUubmV3U3luYXBzZS5ub2RlMS5wb3MuZ2V0YygpLnggKyAoQ3JlYXRlLm5ld1N5bmFwc2Uubm9kZTIucG9zLmdldGMoKS54IC0gQ3JlYXRlLm5ld1N5bmFwc2Uubm9kZTEucG9zLmdldGMoKS54KSAvIDJcbiAgICAgICAgbWlkcG9pbnQueSA9IENyZWF0ZS5uZXdTeW5hcHNlLm5vZGUxLnBvcy5nZXRjKCkueSArIChDcmVhdGUubmV3U3luYXBzZS5ub2RlMi5wb3MuZ2V0YygpLnkgLSBDcmVhdGUubmV3U3luYXBzZS5ub2RlMS5wb3MuZ2V0YygpLnkpIC8gMlxuICAgICAgICBwaXhlbFBvcyA9IFV0aWwuY29vcmRzVG9QaXhlbHMoVmlzdWFsaXplLm1HcmFwaCwgbWlkcG9pbnQpXG4gICAgICAgICQoJyNuZXdfc3luYXBzZScpLmNzcygnbGVmdCcsIHBpeGVsUG9zLnggKyAncHgnKVxuICAgICAgICAkKCcjbmV3X3N5bmFwc2UnKS5jc3MoJ3RvcCcsIHBpeGVsUG9zLnkgKyAncHgnKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDcmVhdGVcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBmcm9udGVuZC9zcmMvTWV0YW1hcHMvQ3JlYXRlLmpzIl0sIm1hcHBpbmdzIjoiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 174 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';\n\nmodule.exports = __webpack_require__(175);\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9yZWFjdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvUmVhY3QnKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC9yZWFjdC5qc1xuLy8gbW9kdWxlIGlkID0gMTc0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 175 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _assign = __webpack_require__(176);\n\nvar ReactChildren = __webpack_require__(177);\nvar ReactComponent = __webpack_require__(190);\nvar ReactPureComponent = __webpack_require__(193);\nvar ReactClass = __webpack_require__(194);\nvar ReactDOMFactories = __webpack_require__(196);\nvar ReactElement = __webpack_require__(181);\nvar ReactPropTypes = __webpack_require__(202);\nvar ReactVersion = __webpack_require__(203);\n\nvar onlyChild = __webpack_require__(204);\nvar warning = __webpack_require__(183);\n\nvar createElement = ReactElement.createElement;\nvar createFactory = ReactElement.createFactory;\nvar cloneElement = ReactElement.cloneElement;\n\nif (true) {\n  var ReactElementValidator = __webpack_require__(197);\n  createElement = ReactElementValidator.createElement;\n  createFactory = ReactElementValidator.createFactory;\n  cloneElement = ReactElementValidator.cloneElement;\n}\n\nvar __spread = _assign;\n\nif (true) {\n  var warned = false;\n  __spread = function () {\n     true ? warning(warned, 'React.__spread is deprecated and should not be used. Use ' + 'Object.assign directly or another helper function with similar ' + 'semantics. You may be seeing this warning due to your compiler. ' + 'See https://fb.me/react-spread-deprecation for more details.') : void 0;\n    warned = true;\n    return _assign.apply(null, arguments);\n  };\n}\n\nvar React = {\n\n  // Modern\n\n  Children: {\n    map: ReactChildren.map,\n    forEach: ReactChildren.forEach,\n    count: ReactChildren.count,\n    toArray: ReactChildren.toArray,\n    only: onlyChild\n  },\n\n  Component: ReactComponent,\n  PureComponent: ReactPureComponent,\n\n  createElement: createElement,\n  cloneElement: cloneElement,\n  isValidElement: ReactElement.isValidElement,\n\n  // Classic\n\n  PropTypes: ReactPropTypes,\n  createClass: ReactClass.createClass,\n  createFactory: createFactory,\n  createMixin: function (mixin) {\n    // Currently a noop. Will be used to validate and trace mixins.\n    return mixin;\n  },\n\n  // This looks DOM specific but these are actually isomorphic helpers\n  // since they are just generating DOM strings.\n  DOM: ReactDOMFactories,\n\n  version: ReactVersion,\n\n  // Deprecated hook for JSX spread, don't use this for anything.\n  __spread: __spread\n};\n\nmodule.exports = React;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdENoaWxkcmVuID0gcmVxdWlyZSgnLi9SZWFjdENoaWxkcmVuJyk7XG52YXIgUmVhY3RDb21wb25lbnQgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9uZW50Jyk7XG52YXIgUmVhY3RQdXJlQ29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdFB1cmVDb21wb25lbnQnKTtcbnZhciBSZWFjdENsYXNzID0gcmVxdWlyZSgnLi9SZWFjdENsYXNzJyk7XG52YXIgUmVhY3RET01GYWN0b3JpZXMgPSByZXF1aXJlKCcuL1JlYWN0RE9NRmFjdG9yaWVzJyk7XG52YXIgUmVhY3RFbGVtZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnQnKTtcbnZhciBSZWFjdFByb3BUeXBlcyA9IHJlcXVpcmUoJy4vUmVhY3RQcm9wVHlwZXMnKTtcbnZhciBSZWFjdFZlcnNpb24gPSByZXF1aXJlKCcuL1JlYWN0VmVyc2lvbicpO1xuXG52YXIgb25seUNoaWxkID0gcmVxdWlyZSgnLi9vbmx5Q2hpbGQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgY3JlYXRlRWxlbWVudCA9IFJlYWN0RWxlbWVudC5jcmVhdGVFbGVtZW50O1xudmFyIGNyZWF0ZUZhY3RvcnkgPSBSZWFjdEVsZW1lbnQuY3JlYXRlRmFjdG9yeTtcbnZhciBjbG9uZUVsZW1lbnQgPSBSZWFjdEVsZW1lbnQuY2xvbmVFbGVtZW50O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RFbGVtZW50VmFsaWRhdG9yID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnRWYWxpZGF0b3InKTtcbiAgY3JlYXRlRWxlbWVudCA9IFJlYWN0RWxlbWVudFZhbGlkYXRvci5jcmVhdGVFbGVtZW50O1xuICBjcmVhdGVGYWN0b3J5ID0gUmVhY3RFbGVtZW50VmFsaWRhdG9yLmNyZWF0ZUZhY3Rvcnk7XG4gIGNsb25lRWxlbWVudCA9IFJlYWN0RWxlbWVudFZhbGlkYXRvci5jbG9uZUVsZW1lbnQ7XG59XG5cbnZhciBfX3NwcmVhZCA9IF9hc3NpZ247XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgX19zcHJlYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcod2FybmVkLCAnUmVhY3QuX19zcHJlYWQgaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLiBVc2UgJyArICdPYmplY3QuYXNzaWduIGRpcmVjdGx5IG9yIGFub3RoZXIgaGVscGVyIGZ1bmN0aW9uIHdpdGggc2ltaWxhciAnICsgJ3NlbWFudGljcy4gWW91IG1heSBiZSBzZWVpbmcgdGhpcyB3YXJuaW5nIGR1ZSB0byB5b3VyIGNvbXBpbGVyLiAnICsgJ1NlZSBodHRwczovL2ZiLm1lL3JlYWN0LXNwcmVhZC1kZXByZWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLicpIDogdm9pZCAwO1xuICAgIHdhcm5lZCA9IHRydWU7XG4gICAgcmV0dXJuIF9hc3NpZ24uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxudmFyIFJlYWN0ID0ge1xuXG4gIC8vIE1vZGVyblxuXG4gIENoaWxkcmVuOiB7XG4gICAgbWFwOiBSZWFjdENoaWxkcmVuLm1hcCxcbiAgICBmb3JFYWNoOiBSZWFjdENoaWxkcmVuLmZvckVhY2gsXG4gICAgY291bnQ6IFJlYWN0Q2hpbGRyZW4uY291bnQsXG4gICAgdG9BcnJheTogUmVhY3RDaGlsZHJlbi50b0FycmF5LFxuICAgIG9ubHk6IG9ubHlDaGlsZFxuICB9LFxuXG4gIENvbXBvbmVudDogUmVhY3RDb21wb25lbnQsXG4gIFB1cmVDb21wb25lbnQ6IFJlYWN0UHVyZUNvbXBvbmVudCxcblxuICBjcmVhdGVFbGVtZW50OiBjcmVhdGVFbGVtZW50LFxuICBjbG9uZUVsZW1lbnQ6IGNsb25lRWxlbWVudCxcbiAgaXNWYWxpZEVsZW1lbnQ6IFJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudCxcblxuICAvLyBDbGFzc2ljXG5cbiAgUHJvcFR5cGVzOiBSZWFjdFByb3BUeXBlcyxcbiAgY3JlYXRlQ2xhc3M6IFJlYWN0Q2xhc3MuY3JlYXRlQ2xhc3MsXG4gIGNyZWF0ZUZhY3Rvcnk6IGNyZWF0ZUZhY3RvcnksXG4gIGNyZWF0ZU1peGluOiBmdW5jdGlvbiAobWl4aW4pIHtcbiAgICAvLyBDdXJyZW50bHkgYSBub29wLiBXaWxsIGJlIHVzZWQgdG8gdmFsaWRhdGUgYW5kIHRyYWNlIG1peGlucy5cbiAgICByZXR1cm4gbWl4aW47XG4gIH0sXG5cbiAgLy8gVGhpcyBsb29rcyBET00gc3BlY2lmaWMgYnV0IHRoZXNlIGFyZSBhY3R1YWxseSBpc29tb3JwaGljIGhlbHBlcnNcbiAgLy8gc2luY2UgdGhleSBhcmUganVzdCBnZW5lcmF0aW5nIERPTSBzdHJpbmdzLlxuICBET006IFJlYWN0RE9NRmFjdG9yaWVzLFxuXG4gIHZlcnNpb246IFJlYWN0VmVyc2lvbixcblxuICAvLyBEZXByZWNhdGVkIGhvb2sgZm9yIEpTWCBzcHJlYWQsIGRvbid0IHVzZSB0aGlzIGZvciBhbnl0aGluZy5cbiAgX19zcHJlYWQ6IF9fc3ByZWFkXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC9saWIvUmVhY3QuanNcbi8vIG1vZHVsZSBpZCA9IDE3NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 176 */
/***/ function(module, exports) {

    eval("'use strict';\n/* eslint-disable no-unused-vars */\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc');  // eslint-disable-line\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (e) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (Object.getOwnPropertySymbols) {\n\t\t\tsymbols = Object.getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9vYmplY3QtYXNzaWduL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cdFx0dGVzdDFbNV0gPSAnZGUnO1xuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MSlbMF0gPT09ICc1Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDIgPSB7fTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcblx0XHRcdHRlc3QyWydfJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTtcblx0XHR9XG5cdFx0dmFyIG9yZGVyMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24gKG4pIHtcblx0XHRcdHJldHVybiB0ZXN0MltuXTtcblx0XHR9KTtcblx0XHRpZiAob3JkZXIyLmpvaW4oJycpICE9PSAnMDEyMzQ1Njc4OScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QzID0ge307XG5cdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAobGV0dGVyKSB7XG5cdFx0XHR0ZXN0M1tsZXR0ZXJdID0gbGV0dGVyO1xuXHRcdH0pO1xuXHRcdGlmIChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PVxuXHRcdFx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG5cdFx0XHRzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhmcm9tKTtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocHJvcElzRW51bWVyYWJsZS5jYWxsKGZyb20sIHN5bWJvbHNbaV0pKSB7XG5cdFx0XHRcdFx0dG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRvO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9vYmplY3QtYXNzaWduL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAxNzZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 177 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar PooledClass = __webpack_require__(178);\nvar ReactElement = __webpack_require__(181);\n\nvar emptyFunction = __webpack_require__(184);\nvar traverseAllChildren = __webpack_require__(187);\n\nvar twoArgumentPooler = PooledClass.twoArgumentPooler;\nvar fourArgumentPooler = PooledClass.fourArgumentPooler;\n\nvar userProvidedKeyEscapeRegex = /\\/+/g;\nfunction escapeUserProvidedKey(text) {\n  return ('' + text).replace(userProvidedKeyEscapeRegex, '$&/');\n}\n\n/**\n * PooledClass representing the bookkeeping associated with performing a child\n * traversal. Allows avoiding binding callbacks.\n *\n * @constructor ForEachBookKeeping\n * @param {!function} forEachFunction Function to perform traversal with.\n * @param {?*} forEachContext Context to perform context with.\n */\nfunction ForEachBookKeeping(forEachFunction, forEachContext) {\n  this.func = forEachFunction;\n  this.context = forEachContext;\n  this.count = 0;\n}\nForEachBookKeeping.prototype.destructor = function () {\n  this.func = null;\n  this.context = null;\n  this.count = 0;\n};\nPooledClass.addPoolingTo(ForEachBookKeeping, twoArgumentPooler);\n\nfunction forEachSingleChild(bookKeeping, child, name) {\n  var func = bookKeeping.func,\n      context = bookKeeping.context;\n\n  func.call(context, child, bookKeeping.count++);\n}\n\n/**\n * Iterates through children that are typically specified as `props.children`.\n *\n * See https://facebook.github.io/react/docs/top-level-api.html#react.children.foreach\n *\n * The provided forEachFunc(child, index) will be called for each\n * leaf child.\n *\n * @param {?*} children Children tree container.\n * @param {function(*, int)} forEachFunc\n * @param {*} forEachContext Context for forEachContext.\n */\nfunction forEachChildren(children, forEachFunc, forEachContext) {\n  if (children == null) {\n    return children;\n  }\n  var traverseContext = ForEachBookKeeping.getPooled(forEachFunc, forEachContext);\n  traverseAllChildren(children, forEachSingleChild, traverseContext);\n  ForEachBookKeeping.release(traverseContext);\n}\n\n/**\n * PooledClass representing the bookkeeping associated with performing a child\n * mapping. Allows avoiding binding callbacks.\n *\n * @constructor MapBookKeeping\n * @param {!*} mapResult Object containing the ordered map of results.\n * @param {!function} mapFunction Function to perform mapping with.\n * @param {?*} mapContext Context to perform mapping with.\n */\nfunction MapBookKeeping(mapResult, keyPrefix, mapFunction, mapContext) {\n  this.result = mapResult;\n  this.keyPrefix = keyPrefix;\n  this.func = mapFunction;\n  this.context = mapContext;\n  this.count = 0;\n}\nMapBookKeeping.prototype.destructor = function () {\n  this.result = null;\n  this.keyPrefix = null;\n  this.func = null;\n  this.context = null;\n  this.count = 0;\n};\nPooledClass.addPoolingTo(MapBookKeeping, fourArgumentPooler);\n\nfunction mapSingleChildIntoContext(bookKeeping, child, childKey) {\n  var result = bookKeeping.result,\n      keyPrefix = bookKeeping.keyPrefix,\n      func = bookKeeping.func,\n      context = bookKeeping.context;\n\n\n  var mappedChild = func.call(context, child, bookKeeping.count++);\n  if (Array.isArray(mappedChild)) {\n    mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, emptyFunction.thatReturnsArgument);\n  } else if (mappedChild != null) {\n    if (ReactElement.isValidElement(mappedChild)) {\n      mappedChild = ReactElement.cloneAndReplaceKey(mappedChild,\n      // Keep both the (mapped) and old keys if they differ, just as\n      // traverseAllChildren used to do for objects as children\n      keyPrefix + (mappedChild.key && (!child || child.key !== mappedChild.key) ? escapeUserProvidedKey(mappedChild.key) + '/' : '') + childKey);\n    }\n    result.push(mappedChild);\n  }\n}\n\nfunction mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) {\n  var escapedPrefix = '';\n  if (prefix != null) {\n    escapedPrefix = escapeUserProvidedKey(prefix) + '/';\n  }\n  var traverseContext = MapBookKeeping.getPooled(array, escapedPrefix, func, context);\n  traverseAllChildren(children, mapSingleChildIntoContext, traverseContext);\n  MapBookKeeping.release(traverseContext);\n}\n\n/**\n * Maps children that are typically specified as `props.children`.\n *\n * See https://facebook.github.io/react/docs/top-level-api.html#react.children.map\n *\n * The provided mapFunction(child, key, index) will be called for each\n * leaf child.\n *\n * @param {?*} children Children tree container.\n * @param {function(*, int)} func The map function.\n * @param {*} context Context for mapFunction.\n * @return {object} Object containing the ordered map of results.\n */\nfunction mapChildren(children, func, context) {\n  if (children == null) {\n    return children;\n  }\n  var result = [];\n  mapIntoWithKeyPrefixInternal(children, result, null, func, context);\n  return result;\n}\n\nfunction forEachSingleChildDummy(traverseContext, child, name) {\n  return null;\n}\n\n/**\n * Count the number of children that are typically specified as\n * `props.children`.\n *\n * See https://facebook.github.io/react/docs/top-level-api.html#react.children.count\n *\n * @param {?*} children Children tree container.\n * @return {number} The number of children.\n */\nfunction countChildren(children, context) {\n  return traverseAllChildren(children, forEachSingleChildDummy, null);\n}\n\n/**\n * Flatten a children object (typically specified as `props.children`) and\n * return an array with appropriately re-keyed children.\n *\n * See https://facebook.github.io/react/docs/top-level-api.html#react.children.toarray\n */\nfunction toArray(children) {\n  var result = [];\n  mapIntoWithKeyPrefixInternal(children, result, null, emptyFunction.thatReturnsArgument);\n  return result;\n}\n\nvar ReactChildren = {\n  forEach: forEachChildren,\n  map: mapChildren,\n  mapIntoWithKeyPrefixInternal: mapIntoWithKeyPrefixInternal,\n  count: countChildren,\n  toArray: toArray\n};\n\nmodule.exports = ReactChildren;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RDaGlsZHJlbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUG9vbGVkQ2xhc3MgPSByZXF1aXJlKCcuL1Bvb2xlZENsYXNzJyk7XG52YXIgUmVhY3RFbGVtZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnQnKTtcblxudmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eUZ1bmN0aW9uJyk7XG52YXIgdHJhdmVyc2VBbGxDaGlsZHJlbiA9IHJlcXVpcmUoJy4vdHJhdmVyc2VBbGxDaGlsZHJlbicpO1xuXG52YXIgdHdvQXJndW1lbnRQb29sZXIgPSBQb29sZWRDbGFzcy50d29Bcmd1bWVudFBvb2xlcjtcbnZhciBmb3VyQXJndW1lbnRQb29sZXIgPSBQb29sZWRDbGFzcy5mb3VyQXJndW1lbnRQb29sZXI7XG5cbnZhciB1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCA9IC9cXC8rL2c7XG5mdW5jdGlvbiBlc2NhcGVVc2VyUHJvdmlkZWRLZXkodGV4dCkge1xuICByZXR1cm4gKCcnICsgdGV4dCkucmVwbGFjZSh1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCwgJyQmLycpO1xufVxuXG4vKipcbiAqIFBvb2xlZENsYXNzIHJlcHJlc2VudGluZyB0aGUgYm9va2tlZXBpbmcgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgYSBjaGlsZFxuICogdHJhdmVyc2FsLiBBbGxvd3MgYXZvaWRpbmcgYmluZGluZyBjYWxsYmFja3MuXG4gKlxuICogQGNvbnN0cnVjdG9yIEZvckVhY2hCb29rS2VlcGluZ1xuICogQHBhcmFtIHshZnVuY3Rpb259IGZvckVhY2hGdW5jdGlvbiBGdW5jdGlvbiB0byBwZXJmb3JtIHRyYXZlcnNhbCB3aXRoLlxuICogQHBhcmFtIHs/Kn0gZm9yRWFjaENvbnRleHQgQ29udGV4dCB0byBwZXJmb3JtIGNvbnRleHQgd2l0aC5cbiAqL1xuZnVuY3Rpb24gRm9yRWFjaEJvb2tLZWVwaW5nKGZvckVhY2hGdW5jdGlvbiwgZm9yRWFjaENvbnRleHQpIHtcbiAgdGhpcy5mdW5jID0gZm9yRWFjaEZ1bmN0aW9uO1xuICB0aGlzLmNvbnRleHQgPSBmb3JFYWNoQ29udGV4dDtcbiAgdGhpcy5jb3VudCA9IDA7XG59XG5Gb3JFYWNoQm9va0tlZXBpbmcucHJvdG90eXBlLmRlc3RydWN0b3IgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZnVuYyA9IG51bGw7XG4gIHRoaXMuY29udGV4dCA9IG51bGw7XG4gIHRoaXMuY291bnQgPSAwO1xufTtcblBvb2xlZENsYXNzLmFkZFBvb2xpbmdUbyhGb3JFYWNoQm9va0tlZXBpbmcsIHR3b0FyZ3VtZW50UG9vbGVyKTtcblxuZnVuY3Rpb24gZm9yRWFjaFNpbmdsZUNoaWxkKGJvb2tLZWVwaW5nLCBjaGlsZCwgbmFtZSkge1xuICB2YXIgZnVuYyA9IGJvb2tLZWVwaW5nLmZ1bmMsXG4gICAgICBjb250ZXh0ID0gYm9va0tlZXBpbmcuY29udGV4dDtcblxuICBmdW5jLmNhbGwoY29udGV4dCwgY2hpbGQsIGJvb2tLZWVwaW5nLmNvdW50KyspO1xufVxuXG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jaGlsZHJlbi5mb3JlYWNoXG4gKlxuICogVGhlIHByb3ZpZGVkIGZvckVhY2hGdW5jKGNoaWxkLCBpbmRleCkgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2hcbiAqIGxlYWYgY2hpbGQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZvckVhY2hGdW5jXG4gKiBAcGFyYW0geyp9IGZvckVhY2hDb250ZXh0IENvbnRleHQgZm9yIGZvckVhY2hDb250ZXh0LlxuICovXG5mdW5jdGlvbiBmb3JFYWNoQ2hpbGRyZW4oY2hpbGRyZW4sIGZvckVhY2hGdW5jLCBmb3JFYWNoQ29udGV4dCkge1xuICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkge1xuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfVxuICB2YXIgdHJhdmVyc2VDb250ZXh0ID0gRm9yRWFjaEJvb2tLZWVwaW5nLmdldFBvb2xlZChmb3JFYWNoRnVuYywgZm9yRWFjaENvbnRleHQpO1xuICB0cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLCBmb3JFYWNoU2luZ2xlQ2hpbGQsIHRyYXZlcnNlQ29udGV4dCk7XG4gIEZvckVhY2hCb29rS2VlcGluZy5yZWxlYXNlKHRyYXZlcnNlQ29udGV4dCk7XG59XG5cbi8qKlxuICogUG9vbGVkQ2xhc3MgcmVwcmVzZW50aW5nIHRoZSBib29ra2VlcGluZyBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyBhIGNoaWxkXG4gKiBtYXBwaW5nLiBBbGxvd3MgYXZvaWRpbmcgYmluZGluZyBjYWxsYmFja3MuXG4gKlxuICogQGNvbnN0cnVjdG9yIE1hcEJvb2tLZWVwaW5nXG4gKiBAcGFyYW0geyEqfSBtYXBSZXN1bHQgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yZGVyZWQgbWFwIG9mIHJlc3VsdHMuXG4gKiBAcGFyYW0geyFmdW5jdGlvbn0gbWFwRnVuY3Rpb24gRnVuY3Rpb24gdG8gcGVyZm9ybSBtYXBwaW5nIHdpdGguXG4gKiBAcGFyYW0gez8qfSBtYXBDb250ZXh0IENvbnRleHQgdG8gcGVyZm9ybSBtYXBwaW5nIHdpdGguXG4gKi9cbmZ1bmN0aW9uIE1hcEJvb2tLZWVwaW5nKG1hcFJlc3VsdCwga2V5UHJlZml4LCBtYXBGdW5jdGlvbiwgbWFwQ29udGV4dCkge1xuICB0aGlzLnJlc3VsdCA9IG1hcFJlc3VsdDtcbiAgdGhpcy5rZXlQcmVmaXggPSBrZXlQcmVmaXg7XG4gIHRoaXMuZnVuYyA9IG1hcEZ1bmN0aW9uO1xuICB0aGlzLmNvbnRleHQgPSBtYXBDb250ZXh0O1xuICB0aGlzLmNvdW50ID0gMDtcbn1cbk1hcEJvb2tLZWVwaW5nLnByb3RvdHlwZS5kZXN0cnVjdG9yID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLnJlc3VsdCA9IG51bGw7XG4gIHRoaXMua2V5UHJlZml4ID0gbnVsbDtcbiAgdGhpcy5mdW5jID0gbnVsbDtcbiAgdGhpcy5jb250ZXh0ID0gbnVsbDtcbiAgdGhpcy5jb3VudCA9IDA7XG59O1xuUG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKE1hcEJvb2tLZWVwaW5nLCBmb3VyQXJndW1lbnRQb29sZXIpO1xuXG5mdW5jdGlvbiBtYXBTaW5nbGVDaGlsZEludG9Db250ZXh0KGJvb2tLZWVwaW5nLCBjaGlsZCwgY2hpbGRLZXkpIHtcbiAgdmFyIHJlc3VsdCA9IGJvb2tLZWVwaW5nLnJlc3VsdCxcbiAgICAgIGtleVByZWZpeCA9IGJvb2tLZWVwaW5nLmtleVByZWZpeCxcbiAgICAgIGZ1bmMgPSBib29rS2VlcGluZy5mdW5jLFxuICAgICAgY29udGV4dCA9IGJvb2tLZWVwaW5nLmNvbnRleHQ7XG5cblxuICB2YXIgbWFwcGVkQ2hpbGQgPSBmdW5jLmNhbGwoY29udGV4dCwgY2hpbGQsIGJvb2tLZWVwaW5nLmNvdW50KyspO1xuICBpZiAoQXJyYXkuaXNBcnJheShtYXBwZWRDaGlsZCkpIHtcbiAgICBtYXBJbnRvV2l0aEtleVByZWZpeEludGVybmFsKG1hcHBlZENoaWxkLCByZXN1bHQsIGNoaWxkS2V5LCBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zQXJndW1lbnQpO1xuICB9IGVsc2UgaWYgKG1hcHBlZENoaWxkICE9IG51bGwpIHtcbiAgICBpZiAoUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50KG1hcHBlZENoaWxkKSkge1xuICAgICAgbWFwcGVkQ2hpbGQgPSBSZWFjdEVsZW1lbnQuY2xvbmVBbmRSZXBsYWNlS2V5KG1hcHBlZENoaWxkLFxuICAgICAgLy8gS2VlcCBib3RoIHRoZSAobWFwcGVkKSBhbmQgb2xkIGtleXMgaWYgdGhleSBkaWZmZXIsIGp1c3QgYXNcbiAgICAgIC8vIHRyYXZlcnNlQWxsQ2hpbGRyZW4gdXNlZCB0byBkbyBmb3Igb2JqZWN0cyBhcyBjaGlsZHJlblxuICAgICAga2V5UHJlZml4ICsgKG1hcHBlZENoaWxkLmtleSAmJiAoIWNoaWxkIHx8IGNoaWxkLmtleSAhPT0gbWFwcGVkQ2hpbGQua2V5KSA/IGVzY2FwZVVzZXJQcm92aWRlZEtleShtYXBwZWRDaGlsZC5rZXkpICsgJy8nIDogJycpICsgY2hpbGRLZXkpO1xuICAgIH1cbiAgICByZXN1bHQucHVzaChtYXBwZWRDaGlsZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5hbChjaGlsZHJlbiwgYXJyYXksIHByZWZpeCwgZnVuYywgY29udGV4dCkge1xuICB2YXIgZXNjYXBlZFByZWZpeCA9ICcnO1xuICBpZiAocHJlZml4ICE9IG51bGwpIHtcbiAgICBlc2NhcGVkUHJlZml4ID0gZXNjYXBlVXNlclByb3ZpZGVkS2V5KHByZWZpeCkgKyAnLyc7XG4gIH1cbiAgdmFyIHRyYXZlcnNlQ29udGV4dCA9IE1hcEJvb2tLZWVwaW5nLmdldFBvb2xlZChhcnJheSwgZXNjYXBlZFByZWZpeCwgZnVuYywgY29udGV4dCk7XG4gIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIG1hcFNpbmdsZUNoaWxkSW50b0NvbnRleHQsIHRyYXZlcnNlQ29udGV4dCk7XG4gIE1hcEJvb2tLZWVwaW5nLnJlbGVhc2UodHJhdmVyc2VDb250ZXh0KTtcbn1cblxuLyoqXG4gKiBNYXBzIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3QuY2hpbGRyZW4ubWFwXG4gKlxuICogVGhlIHByb3ZpZGVkIG1hcEZ1bmN0aW9uKGNoaWxkLCBrZXksIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZnVuYyBUaGUgbWFwIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgZm9yIG1hcEZ1bmN0aW9uLlxuICogQHJldHVybiB7b2JqZWN0fSBPYmplY3QgY29udGFpbmluZyB0aGUgb3JkZXJlZCBtYXAgb2YgcmVzdWx0cy5cbiAqL1xuZnVuY3Rpb24gbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmMsIGNvbnRleHQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBtYXBJbnRvV2l0aEtleVByZWZpeEludGVybmFsKGNoaWxkcmVuLCByZXN1bHQsIG51bGwsIGZ1bmMsIGNvbnRleHQpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmb3JFYWNoU2luZ2xlQ2hpbGREdW1teSh0cmF2ZXJzZUNvbnRleHQsIGNoaWxkLCBuYW1lKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIENvdW50IHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhc1xuICogYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3QuY2hpbGRyZW4uY291bnRcbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiBjaGlsZHJlbi5cbiAqL1xuZnVuY3Rpb24gY291bnRDaGlsZHJlbihjaGlsZHJlbiwgY29udGV4dCkge1xuICByZXR1cm4gdHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaFNpbmdsZUNoaWxkRHVtbXksIG51bGwpO1xufVxuXG4vKipcbiAqIEZsYXR0ZW4gYSBjaGlsZHJlbiBvYmplY3QgKHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYCkgYW5kXG4gKiByZXR1cm4gYW4gYXJyYXkgd2l0aCBhcHByb3ByaWF0ZWx5IHJlLWtleWVkIGNoaWxkcmVuLlxuICpcbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jaGlsZHJlbi50b2FycmF5XG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXkoY2hpbGRyZW4pIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBtYXBJbnRvV2l0aEtleVByZWZpeEludGVybmFsKGNoaWxkcmVuLCByZXN1bHQsIG51bGwsIGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNBcmd1bWVudCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbnZhciBSZWFjdENoaWxkcmVuID0ge1xuICBmb3JFYWNoOiBmb3JFYWNoQ2hpbGRyZW4sXG4gIG1hcDogbWFwQ2hpbGRyZW4sXG4gIG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWw6IG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWwsXG4gIGNvdW50OiBjb3VudENoaWxkcmVuLFxuICB0b0FycmF5OiB0b0FycmF5XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q2hpbGRyZW47XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0L2xpYi9SZWFjdENoaWxkcmVuLmpzXG4vLyBtb2R1bGUgaWQgPSAxNzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 178 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(179);\n\nvar invariant = __webpack_require__(180);\n\n/**\n * Static poolers. Several custom versions for each potential number of\n * arguments. A completely generic pooler is easy to implement, but would\n * require accessing the `arguments` object. In each of these, `this` refers to\n * the Class itself, not an instance. If any others are needed, simply add them\n * here, or in their own files.\n */\nvar oneArgumentPooler = function (copyFieldsFrom) {\n  var Klass = this;\n  if (Klass.instancePool.length) {\n    var instance = Klass.instancePool.pop();\n    Klass.call(instance, copyFieldsFrom);\n    return instance;\n  } else {\n    return new Klass(copyFieldsFrom);\n  }\n};\n\nvar twoArgumentPooler = function (a1, a2) {\n  var Klass = this;\n  if (Klass.instancePool.length) {\n    var instance = Klass.instancePool.pop();\n    Klass.call(instance, a1, a2);\n    return instance;\n  } else {\n    return new Klass(a1, a2);\n  }\n};\n\nvar threeArgumentPooler = function (a1, a2, a3) {\n  var Klass = this;\n  if (Klass.instancePool.length) {\n    var instance = Klass.instancePool.pop();\n    Klass.call(instance, a1, a2, a3);\n    return instance;\n  } else {\n    return new Klass(a1, a2, a3);\n  }\n};\n\nvar fourArgumentPooler = function (a1, a2, a3, a4) {\n  var Klass = this;\n  if (Klass.instancePool.length) {\n    var instance = Klass.instancePool.pop();\n    Klass.call(instance, a1, a2, a3, a4);\n    return instance;\n  } else {\n    return new Klass(a1, a2, a3, a4);\n  }\n};\n\nvar standardReleaser = function (instance) {\n  var Klass = this;\n  !(instance instanceof Klass) ?  true ? invariant(false, 'Trying to release an instance into a pool of a different type.') : _prodInvariant('25') : void 0;\n  instance.destructor();\n  if (Klass.instancePool.length < Klass.poolSize) {\n    Klass.instancePool.push(instance);\n  }\n};\n\nvar DEFAULT_POOL_SIZE = 10;\nvar DEFAULT_POOLER = oneArgumentPooler;\n\n/**\n * Augments `CopyConstructor` to be a poolable class, augmenting only the class\n * itself (statically) not adding any prototypical fields. Any CopyConstructor\n * you give this may have a `poolSize` property, and will look for a\n * prototypical `destructor` on instances.\n *\n * @param {Function} CopyConstructor Constructor that can be used to reset.\n * @param {Function} pooler Customizable pooler.\n */\nvar addPoolingTo = function (CopyConstructor, pooler) {\n  // Casting as any so that flow ignores the actual implementation and trusts\n  // it to match the type we declared\n  var NewKlass = CopyConstructor;\n  NewKlass.instancePool = [];\n  NewKlass.getPooled = pooler || DEFAULT_POOLER;\n  if (!NewKlass.poolSize) {\n    NewKlass.poolSize = DEFAULT_POOL_SIZE;\n  }\n  NewKlass.release = standardReleaser;\n  return NewKlass;\n};\n\nvar PooledClass = {\n  addPoolingTo: addPoolingTo,\n  oneArgumentPooler: oneArgumentPooler,\n  twoArgumentPooler: twoArgumentPooler,\n  threeArgumentPooler: threeArgumentPooler,\n  fourArgumentPooler: fourArgumentPooler\n};\n\nmodule.exports = PooledClass;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvUG9vbGVkQ2xhc3MuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogU3RhdGljIHBvb2xlcnMuIFNldmVyYWwgY3VzdG9tIHZlcnNpb25zIGZvciBlYWNoIHBvdGVudGlhbCBudW1iZXIgb2ZcbiAqIGFyZ3VtZW50cy4gQSBjb21wbGV0ZWx5IGdlbmVyaWMgcG9vbGVyIGlzIGVhc3kgdG8gaW1wbGVtZW50LCBidXQgd291bGRcbiAqIHJlcXVpcmUgYWNjZXNzaW5nIHRoZSBgYXJndW1lbnRzYCBvYmplY3QuIEluIGVhY2ggb2YgdGhlc2UsIGB0aGlzYCByZWZlcnMgdG9cbiAqIHRoZSBDbGFzcyBpdHNlbGYsIG5vdCBhbiBpbnN0YW5jZS4gSWYgYW55IG90aGVycyBhcmUgbmVlZGVkLCBzaW1wbHkgYWRkIHRoZW1cbiAqIGhlcmUsIG9yIGluIHRoZWlyIG93biBmaWxlcy5cbiAqL1xudmFyIG9uZUFyZ3VtZW50UG9vbGVyID0gZnVuY3Rpb24gKGNvcHlGaWVsZHNGcm9tKSB7XG4gIHZhciBLbGFzcyA9IHRoaXM7XG4gIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKSB7XG4gICAgdmFyIGluc3RhbmNlID0gS2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpO1xuICAgIEtsYXNzLmNhbGwoaW5zdGFuY2UsIGNvcHlGaWVsZHNGcm9tKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBLbGFzcyhjb3B5RmllbGRzRnJvbSk7XG4gIH1cbn07XG5cbnZhciB0d29Bcmd1bWVudFBvb2xlciA9IGZ1bmN0aW9uIChhMSwgYTIpIHtcbiAgdmFyIEtsYXNzID0gdGhpcztcbiAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGgpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBLbGFzcy5pbnN0YW5jZVBvb2wucG9wKCk7XG4gICAgS2xhc3MuY2FsbChpbnN0YW5jZSwgYTEsIGEyKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBLbGFzcyhhMSwgYTIpO1xuICB9XG59O1xuXG52YXIgdGhyZWVBcmd1bWVudFBvb2xlciA9IGZ1bmN0aW9uIChhMSwgYTIsIGEzKSB7XG4gIHZhciBLbGFzcyA9IHRoaXM7XG4gIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKSB7XG4gICAgdmFyIGluc3RhbmNlID0gS2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpO1xuICAgIEtsYXNzLmNhbGwoaW5zdGFuY2UsIGExLCBhMiwgYTMpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IEtsYXNzKGExLCBhMiwgYTMpO1xuICB9XG59O1xuXG52YXIgZm91ckFyZ3VtZW50UG9vbGVyID0gZnVuY3Rpb24gKGExLCBhMiwgYTMsIGE0KSB7XG4gIHZhciBLbGFzcyA9IHRoaXM7XG4gIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKSB7XG4gICAgdmFyIGluc3RhbmNlID0gS2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpO1xuICAgIEtsYXNzLmNhbGwoaW5zdGFuY2UsIGExLCBhMiwgYTMsIGE0KTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBLbGFzcyhhMSwgYTIsIGEzLCBhNCk7XG4gIH1cbn07XG5cbnZhciBzdGFuZGFyZFJlbGVhc2VyID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gIHZhciBLbGFzcyA9IHRoaXM7XG4gICEoaW5zdGFuY2UgaW5zdGFuY2VvZiBLbGFzcykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnVHJ5aW5nIHRvIHJlbGVhc2UgYW4gaW5zdGFuY2UgaW50byBhIHBvb2wgb2YgYSBkaWZmZXJlbnQgdHlwZS4nKSA6IF9wcm9kSW52YXJpYW50KCcyNScpIDogdm9pZCAwO1xuICBpbnN0YW5jZS5kZXN0cnVjdG9yKCk7XG4gIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoIDwgS2xhc3MucG9vbFNpemUpIHtcbiAgICBLbGFzcy5pbnN0YW5jZVBvb2wucHVzaChpbnN0YW5jZSk7XG4gIH1cbn07XG5cbnZhciBERUZBVUxUX1BPT0xfU0laRSA9IDEwO1xudmFyIERFRkFVTFRfUE9PTEVSID0gb25lQXJndW1lbnRQb29sZXI7XG5cbi8qKlxuICogQXVnbWVudHMgYENvcHlDb25zdHJ1Y3RvcmAgdG8gYmUgYSBwb29sYWJsZSBjbGFzcywgYXVnbWVudGluZyBvbmx5IHRoZSBjbGFzc1xuICogaXRzZWxmIChzdGF0aWNhbGx5KSBub3QgYWRkaW5nIGFueSBwcm90b3R5cGljYWwgZmllbGRzLiBBbnkgQ29weUNvbnN0cnVjdG9yXG4gKiB5b3UgZ2l2ZSB0aGlzIG1heSBoYXZlIGEgYHBvb2xTaXplYCBwcm9wZXJ0eSwgYW5kIHdpbGwgbG9vayBmb3IgYVxuICogcHJvdG90eXBpY2FsIGBkZXN0cnVjdG9yYCBvbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gQ29weUNvbnN0cnVjdG9yIENvbnN0cnVjdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVzZXQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwb29sZXIgQ3VzdG9taXphYmxlIHBvb2xlci5cbiAqL1xudmFyIGFkZFBvb2xpbmdUbyA9IGZ1bmN0aW9uIChDb3B5Q29uc3RydWN0b3IsIHBvb2xlcikge1xuICAvLyBDYXN0aW5nIGFzIGFueSBzbyB0aGF0IGZsb3cgaWdub3JlcyB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIGFuZCB0cnVzdHNcbiAgLy8gaXQgdG8gbWF0Y2ggdGhlIHR5cGUgd2UgZGVjbGFyZWRcbiAgdmFyIE5ld0tsYXNzID0gQ29weUNvbnN0cnVjdG9yO1xuICBOZXdLbGFzcy5pbnN0YW5jZVBvb2wgPSBbXTtcbiAgTmV3S2xhc3MuZ2V0UG9vbGVkID0gcG9vbGVyIHx8IERFRkFVTFRfUE9PTEVSO1xuICBpZiAoIU5ld0tsYXNzLnBvb2xTaXplKSB7XG4gICAgTmV3S2xhc3MucG9vbFNpemUgPSBERUZBVUxUX1BPT0xfU0laRTtcbiAgfVxuICBOZXdLbGFzcy5yZWxlYXNlID0gc3RhbmRhcmRSZWxlYXNlcjtcbiAgcmV0dXJuIE5ld0tsYXNzO1xufTtcblxudmFyIFBvb2xlZENsYXNzID0ge1xuICBhZGRQb29saW5nVG86IGFkZFBvb2xpbmdUbyxcbiAgb25lQXJndW1lbnRQb29sZXI6IG9uZUFyZ3VtZW50UG9vbGVyLFxuICB0d29Bcmd1bWVudFBvb2xlcjogdHdvQXJndW1lbnRQb29sZXIsXG4gIHRocmVlQXJndW1lbnRQb29sZXI6IHRocmVlQXJndW1lbnRQb29sZXIsXG4gIGZvdXJBcmd1bWVudFBvb2xlcjogZm91ckFyZ3VtZW50UG9vbGVyXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvb2xlZENsYXNzO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC9saWIvUG9vbGVkQ2xhc3MuanNcbi8vIG1vZHVsZSBpZCA9IDE3OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 179 */
/***/ function(module, exports) {

    eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n'use strict';\n\n/**\n * WARNING: DO NOT manually require this module.\n * This is a replacement for `invariant(...)` used by the error code system\n * and will _only_ be required by the corresponding babel pass.\n * It always throws.\n */\n\nfunction reactProdInvariant(code) {\n  var argCount = arguments.length - 1;\n\n  var message = 'Minified React error #' + code + '; visit ' + 'http://facebook.github.io/react/docs/error-decoder.html?invariant=' + code;\n\n  for (var argIdx = 0; argIdx < argCount; argIdx++) {\n    message += '&args[]=' + encodeURIComponent(arguments[argIdx + 1]);\n  }\n\n  message += ' for the full message or use the non-minified dev environment' + ' for full errors and additional helpful warnings.';\n\n  var error = new Error(message);\n  error.name = 'Invariant Violation';\n  error.framesToPop = 1; // we don't care about reactProdInvariant's own frame\n\n  throw error;\n}\n\nmodule.exports = reactProdInvariant;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvcmVhY3RQcm9kSW52YXJpYW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFdBUk5JTkc6IERPIE5PVCBtYW51YWxseSByZXF1aXJlIHRoaXMgbW9kdWxlLlxuICogVGhpcyBpcyBhIHJlcGxhY2VtZW50IGZvciBgaW52YXJpYW50KC4uLilgIHVzZWQgYnkgdGhlIGVycm9yIGNvZGUgc3lzdGVtXG4gKiBhbmQgd2lsbCBfb25seV8gYmUgcmVxdWlyZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgYmFiZWwgcGFzcy5cbiAqIEl0IGFsd2F5cyB0aHJvd3MuXG4gKi9cblxuZnVuY3Rpb24gcmVhY3RQcm9kSW52YXJpYW50KGNvZGUpIHtcbiAgdmFyIGFyZ0NvdW50ID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG5cbiAgdmFyIG1lc3NhZ2UgPSAnTWluaWZpZWQgUmVhY3QgZXJyb3IgIycgKyBjb2RlICsgJzsgdmlzaXQgJyArICdodHRwOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvZXJyb3ItZGVjb2Rlci5odG1sP2ludmFyaWFudD0nICsgY29kZTtcblxuICBmb3IgKHZhciBhcmdJZHggPSAwOyBhcmdJZHggPCBhcmdDb3VudDsgYXJnSWR4KyspIHtcbiAgICBtZXNzYWdlICs9ICcmYXJnc1tdPScgKyBlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW2FyZ0lkeCArIDFdKTtcbiAgfVxuXG4gIG1lc3NhZ2UgKz0gJyBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQnICsgJyBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4nO1xuXG4gIHZhciBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgZXJyb3IubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgZXJyb3IuZnJhbWVzVG9Qb3AgPSAxOyAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IHJlYWN0UHJvZEludmFyaWFudCdzIG93biBmcmFtZVxuXG4gIHRocm93IGVycm9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlYWN0UHJvZEludmFyaWFudDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QvbGliL3JlYWN0UHJvZEludmFyaWFudC5qc1xuLy8gbW9kdWxlIGlkID0gMTc5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 180 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar validateFormat = function validateFormat(format) {};\n\nif (true) {\n  validateFormat = function validateFormat(format) {\n    if (format === undefined) {\n      throw new Error('invariant requires an error message argument');\n    }\n  };\n}\n\nfunction invariant(condition, format, a, b, c, d, e, f) {\n  validateFormat(format);\n\n  if (!condition) {\n    var error;\n    if (format === undefined) {\n      error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');\n    } else {\n      var args = [a, b, c, d, e, f];\n      var argIndex = 0;\n      error = new Error(format.replace(/%s/g, function () {\n        return args[argIndex++];\n      }));\n      error.name = 'Invariant Violation';\n    }\n\n    error.framesToPop = 1; // we don't care about invariant's own frame\n    throw error;\n  }\n}\n\nmodule.exports = invariant;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9pbnZhcmlhbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVXNlIGludmFyaWFudCgpIHRvIGFzc2VydCBzdGF0ZSB3aGljaCB5b3VyIHByb2dyYW0gYXNzdW1lcyB0byBiZSB0cnVlLlxuICpcbiAqIFByb3ZpZGUgc3ByaW50Zi1zdHlsZSBmb3JtYXQgKG9ubHkgJXMgaXMgc3VwcG9ydGVkKSBhbmQgYXJndW1lbnRzXG4gKiB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYnJva2UgYW5kIHdoYXQgeW91IHdlcmVcbiAqIGV4cGVjdGluZy5cbiAqXG4gKiBUaGUgaW52YXJpYW50IG1lc3NhZ2Ugd2lsbCBiZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGludmFyaWFudFxuICogd2lsbCByZW1haW4gdG8gZW5zdXJlIGxvZ2ljIGRvZXMgbm90IGRpZmZlciBpbiBwcm9kdWN0aW9uLlxuICovXG5cbnZhciB2YWxpZGF0ZUZvcm1hdCA9IGZ1bmN0aW9uIHZhbGlkYXRlRm9ybWF0KGZvcm1hdCkge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhbGlkYXRlRm9ybWF0ID0gZnVuY3Rpb24gdmFsaWRhdGVGb3JtYXQoZm9ybWF0KSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFyaWFudCByZXF1aXJlcyBhbiBlcnJvciBtZXNzYWdlIGFyZ3VtZW50Jyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBpbnZhcmlhbnQoY29uZGl0aW9uLCBmb3JtYXQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgdmFsaWRhdGVGb3JtYXQoZm9ybWF0KTtcblxuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHZhciBlcnJvcjtcbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKCdNaW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCAnICsgJ2ZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBhcmdzID0gW2EsIGIsIGMsIGQsIGUsIGZdO1xuICAgICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdO1xuICAgICAgfSkpO1xuICAgICAgZXJyb3IubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICB9XG5cbiAgICBlcnJvci5mcmFtZXNUb1BvcCA9IDE7IC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgaW52YXJpYW50J3Mgb3duIGZyYW1lXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbnZhcmlhbnQ7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2ZianMvbGliL2ludmFyaWFudC5qc1xuLy8gbW9kdWxlIGlkID0gMTgwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 181 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _assign = __webpack_require__(176);\n\nvar ReactCurrentOwner = __webpack_require__(182);\n\nvar warning = __webpack_require__(183);\nvar canDefineProperty = __webpack_require__(185);\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar REACT_ELEMENT_TYPE = __webpack_require__(186);\n\nvar RESERVED_PROPS = {\n  key: true,\n  ref: true,\n  __self: true,\n  __source: true\n};\n\nvar specialPropKeyWarningShown, specialPropRefWarningShown;\n\nfunction hasValidRef(config) {\n  if (true) {\n    if (hasOwnProperty.call(config, 'ref')) {\n      var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n      if (getter && getter.isReactWarning) {\n        return false;\n      }\n    }\n  }\n  return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n  if (true) {\n    if (hasOwnProperty.call(config, 'key')) {\n      var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n      if (getter && getter.isReactWarning) {\n        return false;\n      }\n    }\n  }\n  return config.key !== undefined;\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n  var warnAboutAccessingKey = function () {\n    if (!specialPropKeyWarningShown) {\n      specialPropKeyWarningShown = true;\n       true ? warning(false, '%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName) : void 0;\n    }\n  };\n  warnAboutAccessingKey.isReactWarning = true;\n  Object.defineProperty(props, 'key', {\n    get: warnAboutAccessingKey,\n    configurable: true\n  });\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n  var warnAboutAccessingRef = function () {\n    if (!specialPropRefWarningShown) {\n      specialPropRefWarningShown = true;\n       true ? warning(false, '%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName) : void 0;\n    }\n  };\n  warnAboutAccessingRef.isReactWarning = true;\n  Object.defineProperty(props, 'ref', {\n    get: warnAboutAccessingRef,\n    configurable: true\n  });\n}\n\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, no instanceof check\n * will work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} key\n * @param {string|object} ref\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @param {*} owner\n * @param {*} props\n * @internal\n */\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n  var element = {\n    // This tag allow us to uniquely identify this as a React Element\n    $$typeof: REACT_ELEMENT_TYPE,\n\n    // Built-in properties that belong on the element\n    type: type,\n    key: key,\n    ref: ref,\n    props: props,\n\n    // Record the component responsible for creating this element.\n    _owner: owner\n  };\n\n  if (true) {\n    // The validation flag is currently mutative. We put it on\n    // an external backing store so that we can freeze the whole object.\n    // This can be replaced with a WeakMap once they are implemented in\n    // commonly used development environments.\n    element._store = {};\n\n    // To make comparing ReactElements easier for testing purposes, we make\n    // the validation flag non-enumerable (where possible, which should\n    // include every environment we run tests in), so the test framework\n    // ignores it.\n    if (canDefineProperty) {\n      Object.defineProperty(element._store, 'validated', {\n        configurable: false,\n        enumerable: false,\n        writable: true,\n        value: false\n      });\n      // self and source are DEV only properties.\n      Object.defineProperty(element, '_self', {\n        configurable: false,\n        enumerable: false,\n        writable: false,\n        value: self\n      });\n      // Two elements created in two different places should be considered\n      // equal for testing purposes and therefore we hide it from enumeration.\n      Object.defineProperty(element, '_source', {\n        configurable: false,\n        enumerable: false,\n        writable: false,\n        value: source\n      });\n    } else {\n      element._store.validated = false;\n      element._self = self;\n      element._source = source;\n    }\n    if (Object.freeze) {\n      Object.freeze(element.props);\n      Object.freeze(element);\n    }\n  }\n\n  return element;\n};\n\n/**\n * Create and return a new ReactElement of the given type.\n * See https://facebook.github.io/react/docs/top-level-api.html#react.createelement\n */\nReactElement.createElement = function (type, config, children) {\n  var propName;\n\n  // Reserved names are extracted\n  var props = {};\n\n  var key = null;\n  var ref = null;\n  var self = null;\n  var source = null;\n\n  if (config != null) {\n    if (hasValidRef(config)) {\n      ref = config.ref;\n    }\n    if (hasValidKey(config)) {\n      key = '' + config.key;\n    }\n\n    self = config.__self === undefined ? null : config.__self;\n    source = config.__source === undefined ? null : config.__source;\n    // Remaining properties are added to a new props object\n    for (propName in config) {\n      if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n        props[propName] = config[propName];\n      }\n    }\n  }\n\n  // Children can be more than one argument, and those are transferred onto\n  // the newly allocated props object.\n  var childrenLength = arguments.length - 2;\n  if (childrenLength === 1) {\n    props.children = children;\n  } else if (childrenLength > 1) {\n    var childArray = Array(childrenLength);\n    for (var i = 0; i < childrenLength; i++) {\n      childArray[i] = arguments[i + 2];\n    }\n    if (true) {\n      if (Object.freeze) {\n        Object.freeze(childArray);\n      }\n    }\n    props.children = childArray;\n  }\n\n  // Resolve default props\n  if (type && type.defaultProps) {\n    var defaultProps = type.defaultProps;\n    for (propName in defaultProps) {\n      if (props[propName] === undefined) {\n        props[propName] = defaultProps[propName];\n      }\n    }\n  }\n  if (true) {\n    if (key || ref) {\n      if (typeof props.$$typeof === 'undefined' || props.$$typeof !== REACT_ELEMENT_TYPE) {\n        var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n        if (key) {\n          defineKeyPropWarningGetter(props, displayName);\n        }\n        if (ref) {\n          defineRefPropWarningGetter(props, displayName);\n        }\n      }\n    }\n  }\n  return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n};\n\n/**\n * Return a function that produces ReactElements of a given type.\n * See https://facebook.github.io/react/docs/top-level-api.html#react.createfactory\n */\nReactElement.createFactory = function (type) {\n  var factory = ReactElement.createElement.bind(null, type);\n  // Expose the type on the factory and the prototype so that it can be\n  // easily accessed on elements. E.g. `<Foo />.type === Foo`.\n  // This should not be named `constructor` since this may not be the function\n  // that created the element, and it may not even be a constructor.\n  // Legacy hook TODO: Warn if this is accessed\n  factory.type = type;\n  return factory;\n};\n\nReactElement.cloneAndReplaceKey = function (oldElement, newKey) {\n  var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);\n\n  return newElement;\n};\n\n/**\n * Clone and return a new ReactElement using element as the starting point.\n * See https://facebook.github.io/react/docs/top-level-api.html#react.cloneelement\n */\nReactElement.cloneElement = function (element, config, children) {\n  var propName;\n\n  // Original props are copied\n  var props = _assign({}, element.props);\n\n  // Reserved names are extracted\n  var key = element.key;\n  var ref = element.ref;\n  // Self is preserved since the owner is preserved.\n  var self = element._self;\n  // Source is preserved since cloneElement is unlikely to be targeted by a\n  // transpiler, and the original source is probably a better indicator of the\n  // true owner.\n  var source = element._source;\n\n  // Owner will be preserved, unless ref is overridden\n  var owner = element._owner;\n\n  if (config != null) {\n    if (hasValidRef(config)) {\n      // Silently steal the ref from the parent.\n      ref = config.ref;\n      owner = ReactCurrentOwner.current;\n    }\n    if (hasValidKey(config)) {\n      key = '' + config.key;\n    }\n\n    // Remaining properties override existing props\n    var defaultProps;\n    if (element.type && element.type.defaultProps) {\n      defaultProps = element.type.defaultProps;\n    }\n    for (propName in config) {\n      if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n        if (config[propName] === undefined && defaultProps !== undefined) {\n          // Resolve default props\n          props[propName] = defaultProps[propName];\n        } else {\n          props[propName] = config[propName];\n        }\n      }\n    }\n  }\n\n  // Children can be more than one argument, and those are transferred onto\n  // the newly allocated props object.\n  var childrenLength = arguments.length - 2;\n  if (childrenLength === 1) {\n    props.children = children;\n  } else if (childrenLength > 1) {\n    var childArray = Array(childrenLength);\n    for (var i = 0; i < childrenLength; i++) {\n      childArray[i] = arguments[i + 2];\n    }\n    props.children = childArray;\n  }\n\n  return ReactElement(element.type, key, ref, self, source, owner, props);\n};\n\n/**\n * Verifies the object is a ReactElement.\n * See https://facebook.github.io/react/docs/top-level-api.html#react.isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a valid component.\n * @final\n */\nReactElement.isValidElement = function (object) {\n  return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n};\n\nmodule.exports = ReactElement;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RFbGVtZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSByZXF1aXJlKCcuL1JlYWN0Q3VycmVudE93bmVyJyk7XG5cbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xudmFyIGNhbkRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9jYW5EZWZpbmVQcm9wZXJ0eScpO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50U3ltYm9sJyk7XG5cbnZhciBSRVNFUlZFRF9QUk9QUyA9IHtcbiAga2V5OiB0cnVlLFxuICByZWY6IHRydWUsXG4gIF9fc2VsZjogdHJ1ZSxcbiAgX19zb3VyY2U6IHRydWVcbn07XG5cbnZhciBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biwgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd247XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkUmVmKGNvbmZpZykge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ3JlZicpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdyZWYnKS5nZXQ7XG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBjb25maWcucmVmICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkS2V5KGNvbmZpZykge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ2tleScpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdrZXknKS5nZXQ7XG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBjb25maWcua2V5ICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2YXIgd2FybkFib3V0QWNjZXNzaW5nS2V5ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24pIHtcbiAgICAgIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duID0gdHJ1ZTtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnJXM6IGBrZXlgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL2ZiLm1lL3JlYWN0LXNwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpIDogdm9pZCAwO1xuICAgIH1cbiAgfTtcbiAgd2FybkFib3V0QWNjZXNzaW5nS2V5LmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAna2V5Jywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nS2V5LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bikge1xuICAgICAgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24gPSB0cnVlO1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclczogYHJlZmAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vZmIubWUvcmVhY3Qtc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSkgOiB2b2lkIDA7XG4gICAgfVxuICB9O1xuICB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdyZWYnLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBSZWFjdCBlbGVtZW50LiBUaGlzIG5vIGxvbmdlciBhZGhlcmVzIHRvXG4gKiB0aGUgY2xhc3MgcGF0dGVybiwgc28gZG8gbm90IHVzZSBuZXcgdG8gY2FsbCBpdC4gQWxzbywgbm8gaW5zdGFuY2VvZiBjaGVja1xuICogd2lsbCB3b3JrLiBJbnN0ZWFkIHRlc3QgJCR0eXBlb2YgZmllbGQgYWdhaW5zdCBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgdG8gY2hlY2tcbiAqIGlmIHNvbWV0aGluZyBpcyBhIFJlYWN0IEVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHsqfSB0eXBlXG4gKiBAcGFyYW0geyp9IGtleVxuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSByZWZcbiAqIEBwYXJhbSB7Kn0gc2VsZiBBICp0ZW1wb3JhcnkqIGhlbHBlciB0byBkZXRlY3QgcGxhY2VzIHdoZXJlIGB0aGlzYCBpc1xuICogZGlmZmVyZW50IGZyb20gdGhlIGBvd25lcmAgd2hlbiBSZWFjdC5jcmVhdGVFbGVtZW50IGlzIGNhbGxlZCwgc28gdGhhdCB3ZVxuICogY2FuIHdhcm4uIFdlIHdhbnQgdG8gZ2V0IHJpZCBvZiBvd25lciBhbmQgcmVwbGFjZSBzdHJpbmcgYHJlZmBzIHdpdGggYXJyb3dcbiAqIGZ1bmN0aW9ucywgYW5kIGFzIGxvbmcgYXMgYHRoaXNgIGFuZCBvd25lciBhcmUgdGhlIHNhbWUsIHRoZXJlIHdpbGwgYmUgbm9cbiAqIGNoYW5nZSBpbiBiZWhhdmlvci5cbiAqIEBwYXJhbSB7Kn0gc291cmNlIEFuIGFubm90YXRpb24gb2JqZWN0IChhZGRlZCBieSBhIHRyYW5zcGlsZXIgb3Igb3RoZXJ3aXNlKVxuICogaW5kaWNhdGluZyBmaWxlbmFtZSwgbGluZSBudW1iZXIsIGFuZC9vciBvdGhlciBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSB7Kn0gb3duZXJcbiAqIEBwYXJhbSB7Kn0gcHJvcHNcbiAqIEBpbnRlcm5hbFxuICovXG52YXIgUmVhY3RFbGVtZW50ID0gZnVuY3Rpb24gKHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcykge1xuICB2YXIgZWxlbWVudCA9IHtcbiAgICAvLyBUaGlzIHRhZyBhbGxvdyB1cyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGFzIGEgUmVhY3QgRWxlbWVudFxuICAgICQkdHlwZW9mOiBSRUFDVF9FTEVNRU5UX1RZUEUsXG5cbiAgICAvLyBCdWlsdC1pbiBwcm9wZXJ0aWVzIHRoYXQgYmVsb25nIG9uIHRoZSBlbGVtZW50XG4gICAgdHlwZTogdHlwZSxcbiAgICBrZXk6IGtleSxcbiAgICByZWY6IHJlZixcbiAgICBwcm9wczogcHJvcHMsXG5cbiAgICAvLyBSZWNvcmQgdGhlIGNvbXBvbmVudCByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhpcyBlbGVtZW50LlxuICAgIF9vd25lcjogb3duZXJcbiAgfTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIC8vIFRoZSB2YWxpZGF0aW9uIGZsYWcgaXMgY3VycmVudGx5IG11dGF0aXZlLiBXZSBwdXQgaXQgb25cbiAgICAvLyBhbiBleHRlcm5hbCBiYWNraW5nIHN0b3JlIHNvIHRoYXQgd2UgY2FuIGZyZWV6ZSB0aGUgd2hvbGUgb2JqZWN0LlxuICAgIC8vIFRoaXMgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBXZWFrTWFwIG9uY2UgdGhleSBhcmUgaW1wbGVtZW50ZWQgaW5cbiAgICAvLyBjb21tb25seSB1c2VkIGRldmVsb3BtZW50IGVudmlyb25tZW50cy5cbiAgICBlbGVtZW50Ll9zdG9yZSA9IHt9O1xuXG4gICAgLy8gVG8gbWFrZSBjb21wYXJpbmcgUmVhY3RFbGVtZW50cyBlYXNpZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHdlIG1ha2VcbiAgICAvLyB0aGUgdmFsaWRhdGlvbiBmbGFnIG5vbi1lbnVtZXJhYmxlICh3aGVyZSBwb3NzaWJsZSwgd2hpY2ggc2hvdWxkXG4gICAgLy8gaW5jbHVkZSBldmVyeSBlbnZpcm9ubWVudCB3ZSBydW4gdGVzdHMgaW4pLCBzbyB0aGUgdGVzdCBmcmFtZXdvcmtcbiAgICAvLyBpZ25vcmVzIGl0LlxuICAgIGlmIChjYW5EZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQuX3N0b3JlLCAndmFsaWRhdGVkJywge1xuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICAvLyBzZWxmIGFuZCBzb3VyY2UgYXJlIERFViBvbmx5IHByb3BlcnRpZXMuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zZWxmJywge1xuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogc2VsZlxuICAgICAgfSk7XG4gICAgICAvLyBUd28gZWxlbWVudHMgY3JlYXRlZCBpbiB0d28gZGlmZmVyZW50IHBsYWNlcyBzaG91bGQgYmUgY29uc2lkZXJlZFxuICAgICAgLy8gZXF1YWwgZm9yIHRlc3RpbmcgcHVycG9zZXMgYW5kIHRoZXJlZm9yZSB3ZSBoaWRlIGl0IGZyb20gZW51bWVyYXRpb24uXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zb3VyY2UnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiBzb3VyY2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgPSBmYWxzZTtcbiAgICAgIGVsZW1lbnQuX3NlbGYgPSBzZWxmO1xuICAgICAgZWxlbWVudC5fc291cmNlID0gc291cmNlO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50LnByb3BzKTtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IFJlYWN0RWxlbWVudCBvZiB0aGUgZ2l2ZW4gdHlwZS5cbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jcmVhdGVlbGVtZW50XG4gKi9cblJlYWN0RWxlbWVudC5jcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKHR5cGUsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgdmFyIHByb3BOYW1lO1xuXG4gIC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcbiAgdmFyIHByb3BzID0ge307XG5cbiAgdmFyIGtleSA9IG51bGw7XG4gIHZhciByZWYgPSBudWxsO1xuICB2YXIgc2VsZiA9IG51bGw7XG4gIHZhciBzb3VyY2UgPSBudWxsO1xuXG4gIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgIGlmIChoYXNWYWxpZFJlZihjb25maWcpKSB7XG4gICAgICByZWYgPSBjb25maWcucmVmO1xuICAgIH1cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH1cblxuICAgIHNlbGYgPSBjb25maWcuX19zZWxmID09PSB1bmRlZmluZWQgPyBudWxsIDogY29uZmlnLl9fc2VsZjtcbiAgICBzb3VyY2UgPSBjb25maWcuX19zb3VyY2UgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zb3VyY2U7XG4gICAgLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIGEgbmV3IHByb3BzIG9iamVjdFxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250b1xuICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC5cbiAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7XG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICAgIE9iamVjdC5mcmVlemUoY2hpbGRBcnJheSk7XG4gICAgICB9XG4gICAgfVxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfVxuXG4gIC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuICBpZiAodHlwZSAmJiB0eXBlLmRlZmF1bHRQcm9wcykge1xuICAgIHZhciBkZWZhdWx0UHJvcHMgPSB0eXBlLmRlZmF1bHRQcm9wcztcbiAgICBmb3IgKHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKGtleSB8fCByZWYpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMuJCR0eXBlb2YgPT09ICd1bmRlZmluZWQnIHx8IHByb3BzLiQkdHlwZW9mICE9PSBSRUFDVF9FTEVNRU5UX1RZUEUpIHtcbiAgICAgICAgdmFyIGRpc3BsYXlOYW1lID0gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgPyB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCAnVW5rbm93bicgOiB0eXBlO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQsIHByb3BzKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBSZWFjdEVsZW1lbnRzIG9mIGEgZ2l2ZW4gdHlwZS5cbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jcmVhdGVmYWN0b3J5XG4gKi9cblJlYWN0RWxlbWVudC5jcmVhdGVGYWN0b3J5ID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgdmFyIGZhY3RvcnkgPSBSZWFjdEVsZW1lbnQuY3JlYXRlRWxlbWVudC5iaW5kKG51bGwsIHR5cGUpO1xuICAvLyBFeHBvc2UgdGhlIHR5cGUgb24gdGhlIGZhY3RvcnkgYW5kIHRoZSBwcm90b3R5cGUgc28gdGhhdCBpdCBjYW4gYmVcbiAgLy8gZWFzaWx5IGFjY2Vzc2VkIG9uIGVsZW1lbnRzLiBFLmcuIGA8Rm9vIC8+LnR5cGUgPT09IEZvb2AuXG4gIC8vIFRoaXMgc2hvdWxkIG5vdCBiZSBuYW1lZCBgY29uc3RydWN0b3JgIHNpbmNlIHRoaXMgbWF5IG5vdCBiZSB0aGUgZnVuY3Rpb25cbiAgLy8gdGhhdCBjcmVhdGVkIHRoZSBlbGVtZW50LCBhbmQgaXQgbWF5IG5vdCBldmVuIGJlIGEgY29uc3RydWN0b3IuXG4gIC8vIExlZ2FjeSBob29rIFRPRE86IFdhcm4gaWYgdGhpcyBpcyBhY2Nlc3NlZFxuICBmYWN0b3J5LnR5cGUgPSB0eXBlO1xuICByZXR1cm4gZmFjdG9yeTtcbn07XG5cblJlYWN0RWxlbWVudC5jbG9uZUFuZFJlcGxhY2VLZXkgPSBmdW5jdGlvbiAob2xkRWxlbWVudCwgbmV3S2V5KSB7XG4gIHZhciBuZXdFbGVtZW50ID0gUmVhY3RFbGVtZW50KG9sZEVsZW1lbnQudHlwZSwgbmV3S2V5LCBvbGRFbGVtZW50LnJlZiwgb2xkRWxlbWVudC5fc2VsZiwgb2xkRWxlbWVudC5fc291cmNlLCBvbGRFbGVtZW50Ll9vd25lciwgb2xkRWxlbWVudC5wcm9wcyk7XG5cbiAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59O1xuXG4vKipcbiAqIENsb25lIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IHVzaW5nIGVsZW1lbnQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50LlxuICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNsb25lZWxlbWVudFxuICovXG5SZWFjdEVsZW1lbnQuY2xvbmVFbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgdmFyIHByb3BOYW1lO1xuXG4gIC8vIE9yaWdpbmFsIHByb3BzIGFyZSBjb3BpZWRcbiAgdmFyIHByb3BzID0gX2Fzc2lnbih7fSwgZWxlbWVudC5wcm9wcyk7XG5cbiAgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gIHZhciByZWYgPSBlbGVtZW50LnJlZjtcbiAgLy8gU2VsZiBpcyBwcmVzZXJ2ZWQgc2luY2UgdGhlIG93bmVyIGlzIHByZXNlcnZlZC5cbiAgdmFyIHNlbGYgPSBlbGVtZW50Ll9zZWxmO1xuICAvLyBTb3VyY2UgaXMgcHJlc2VydmVkIHNpbmNlIGNsb25lRWxlbWVudCBpcyB1bmxpa2VseSB0byBiZSB0YXJnZXRlZCBieSBhXG4gIC8vIHRyYW5zcGlsZXIsIGFuZCB0aGUgb3JpZ2luYWwgc291cmNlIGlzIHByb2JhYmx5IGEgYmV0dGVyIGluZGljYXRvciBvZiB0aGVcbiAgLy8gdHJ1ZSBvd25lci5cbiAgdmFyIHNvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcblxuICAvLyBPd25lciB3aWxsIGJlIHByZXNlcnZlZCwgdW5sZXNzIHJlZiBpcyBvdmVycmlkZGVuXG4gIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuXG4gIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgIGlmIChoYXNWYWxpZFJlZihjb25maWcpKSB7XG4gICAgICAvLyBTaWxlbnRseSBzdGVhbCB0aGUgcmVmIGZyb20gdGhlIHBhcmVudC5cbiAgICAgIHJlZiA9IGNvbmZpZy5yZWY7XG4gICAgICBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ7XG4gICAgfVxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfVxuXG4gICAgLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgb3ZlcnJpZGUgZXhpc3RpbmcgcHJvcHNcbiAgICB2YXIgZGVmYXVsdFByb3BzO1xuICAgIGlmIChlbGVtZW50LnR5cGUgJiYgZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcykge1xuICAgICAgZGVmYXVsdFByb3BzID0gZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcztcbiAgICB9XG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgaWYgKGNvbmZpZ1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgfVxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfVxuXG4gIHJldHVybiBSZWFjdEVsZW1lbnQoZWxlbWVudC50eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpO1xufTtcblxuLyoqXG4gKiBWZXJpZmllcyB0aGUgb2JqZWN0IGlzIGEgUmVhY3RFbGVtZW50LlxuICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmlzdmFsaWRlbGVtZW50XG4gKiBAcGFyYW0gez9vYmplY3R9IG9iamVjdFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgb2JqZWN0YCBpcyBhIHZhbGlkIGNvbXBvbmVudC5cbiAqIEBmaW5hbFxuICovXG5SZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RWxlbWVudDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QvbGliL1JlYWN0RWxlbWVudC5qc1xuLy8gbW9kdWxlIGlkID0gMTgxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 182 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\n/**\n * Keeps track of the current owner.\n *\n * The current owner is the component who should own any components that are\n * currently being constructed.\n */\nvar ReactCurrentOwner = {\n\n  /**\n   * @internal\n   * @type {ReactComponent}\n   */\n  current: null\n\n};\n\nmodule.exports = ReactCurrentOwner;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RDdXJyZW50T3duZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IG93bmVyLlxuICpcbiAqIFRoZSBjdXJyZW50IG93bmVyIGlzIHRoZSBjb21wb25lbnQgd2hvIHNob3VsZCBvd24gYW55IGNvbXBvbmVudHMgdGhhdCBhcmVcbiAqIGN1cnJlbnRseSBiZWluZyBjb25zdHJ1Y3RlZC5cbiAqL1xudmFyIFJlYWN0Q3VycmVudE93bmVyID0ge1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHR5cGUge1JlYWN0Q29tcG9uZW50fVxuICAgKi9cbiAgY3VycmVudDogbnVsbFxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q3VycmVudE93bmVyO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC9saWIvUmVhY3RDdXJyZW50T3duZXIuanNcbi8vIG1vZHVsZSBpZCA9IDE4MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 183 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar emptyFunction = __webpack_require__(184);\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar warning = emptyFunction;\n\nif (true) {\n  (function () {\n    var printWarning = function printWarning(format) {\n      for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        args[_key - 1] = arguments[_key];\n      }\n\n      var argIndex = 0;\n      var message = 'Warning: ' + format.replace(/%s/g, function () {\n        return args[argIndex++];\n      });\n      if (typeof console !== 'undefined') {\n        console.error(message);\n      }\n      try {\n        // --- Welcome to debugging React ---\n        // This error was thrown as a convenience so that you can use this stack\n        // to find the callsite that caused this warning to fire.\n        throw new Error(message);\n      } catch (x) {}\n    };\n\n    warning = function warning(condition, format) {\n      if (format === undefined) {\n        throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument');\n      }\n\n      if (format.indexOf('Failed Composite propType: ') === 0) {\n        return; // Ignore CompositeComponent proptype check.\n      }\n\n      if (!condition) {\n        for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {\n          args[_key2 - 2] = arguments[_key2];\n        }\n\n        printWarning.apply(undefined, [format].concat(args));\n      }\n    };\n  })();\n}\n\nmodule.exports = warning;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi93YXJuaW5nLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9lbXB0eUZ1bmN0aW9uJyk7XG5cbi8qKlxuICogU2ltaWxhciB0byBpbnZhcmlhbnQgYnV0IG9ubHkgbG9ncyBhIHdhcm5pbmcgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byBsb2cgaXNzdWVzIGluIGRldmVsb3BtZW50IGVudmlyb25tZW50cyBpbiBjcml0aWNhbFxuICogcGF0aHMuIFJlbW92aW5nIHRoZSBsb2dnaW5nIGNvZGUgZm9yIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIHdpbGwga2VlcCB0aGVcbiAqIHNhbWUgbG9naWMgYW5kIGZvbGxvdyB0aGUgc2FtZSBjb2RlIHBhdGhzLlxuICovXG5cbnZhciB3YXJuaW5nID0gZW1wdHlGdW5jdGlvbjtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGZvcm1hdCkge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdO1xuICAgICAgfSk7XG4gICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgfSBjYXRjaCAoeCkge31cbiAgICB9O1xuXG4gICAgd2FybmluZyA9IGZ1bmN0aW9uIHdhcm5pbmcoY29uZGl0aW9uLCBmb3JtYXQpIHtcbiAgICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2B3YXJuaW5nKGNvbmRpdGlvbiwgZm9ybWF0LCAuLi5hcmdzKWAgcmVxdWlyZXMgYSB3YXJuaW5nICcgKyAnbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybWF0LmluZGV4T2YoJ0ZhaWxlZCBDb21wb3NpdGUgcHJvcFR5cGU6ICcpID09PSAwKSB7XG4gICAgICAgIHJldHVybjsgLy8gSWdub3JlIENvbXBvc2l0ZUNvbXBvbmVudCBwcm9wdHlwZSBjaGVjay5cbiAgICAgIH1cblxuICAgICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIgPiAyID8gX2xlbjIgLSAyIDogMCksIF9rZXkyID0gMjsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICAgIGFyZ3NbX2tleTIgLSAyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICAgIH1cblxuICAgICAgICBwcmludFdhcm5pbmcuYXBwbHkodW5kZWZpbmVkLCBbZm9ybWF0XS5jb25jYXQoYXJncykpO1xuICAgICAgfVxuICAgIH07XG4gIH0pKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gd2FybmluZztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZmJqcy9saWIvd2FybmluZy5qc1xuLy8gbW9kdWxlIGlkID0gMTgzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 184 */
/***/ function(module, exports) {

    eval("\"use strict\";\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\nfunction makeEmptyFunction(arg) {\n  return function () {\n    return arg;\n  };\n}\n\n/**\n * This function accepts and discards inputs; it has no side effects. This is\n * primarily useful idiomatically for overridable function endpoints which\n * always need to be callable, since JS lacks a null-call idiom ala Cocoa.\n */\nvar emptyFunction = function emptyFunction() {};\n\nemptyFunction.thatReturns = makeEmptyFunction;\nemptyFunction.thatReturnsFalse = makeEmptyFunction(false);\nemptyFunction.thatReturnsTrue = makeEmptyFunction(true);\nemptyFunction.thatReturnsNull = makeEmptyFunction(null);\nemptyFunction.thatReturnsThis = function () {\n  return this;\n};\nemptyFunction.thatReturnsArgument = function (arg) {\n  return arg;\n};\n\nmodule.exports = emptyFunction;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9lbXB0eUZ1bmN0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuZnVuY3Rpb24gbWFrZUVtcHR5RnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGFyZztcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGFjY2VwdHMgYW5kIGRpc2NhcmRzIGlucHV0czsgaXQgaGFzIG5vIHNpZGUgZWZmZWN0cy4gVGhpcyBpc1xuICogcHJpbWFyaWx5IHVzZWZ1bCBpZGlvbWF0aWNhbGx5IGZvciBvdmVycmlkYWJsZSBmdW5jdGlvbiBlbmRwb2ludHMgd2hpY2hcbiAqIGFsd2F5cyBuZWVkIHRvIGJlIGNhbGxhYmxlLCBzaW5jZSBKUyBsYWNrcyBhIG51bGwtY2FsbCBpZGlvbSBhbGEgQ29jb2EuXG4gKi9cbnZhciBlbXB0eUZ1bmN0aW9uID0gZnVuY3Rpb24gZW1wdHlGdW5jdGlvbigpIHt9O1xuXG5lbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zID0gbWFrZUVtcHR5RnVuY3Rpb247XG5lbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zRmFsc2UgPSBtYWtlRW1wdHlGdW5jdGlvbihmYWxzZSk7XG5lbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zVHJ1ZSA9IG1ha2VFbXB0eUZ1bmN0aW9uKHRydWUpO1xuZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGwgPSBtYWtlRW1wdHlGdW5jdGlvbihudWxsKTtcbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUaGlzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcztcbn07XG5lbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zQXJndW1lbnQgPSBmdW5jdGlvbiAoYXJnKSB7XG4gIHJldHVybiBhcmc7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVtcHR5RnVuY3Rpb247XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2ZianMvbGliL2VtcHR5RnVuY3Rpb24uanNcbi8vIG1vZHVsZSBpZCA9IDE4NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 185 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar canDefineProperty = false;\nif (true) {\n  try {\n    // $FlowFixMe https://github.com/facebook/flow/issues/285\n    Object.defineProperty({}, 'x', { get: function () {} });\n    canDefineProperty = true;\n  } catch (x) {\n    // IE will fail on defineProperty\n  }\n}\n\nmodule.exports = canDefineProperty;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvY2FuRGVmaW5lUHJvcGVydHkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2FuRGVmaW5lUHJvcGVydHkgPSBmYWxzZTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHRyeSB7XG4gICAgLy8gJEZsb3dGaXhNZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMjg1XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAneCcsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7fSB9KTtcbiAgICBjYW5EZWZpbmVQcm9wZXJ0eSA9IHRydWU7XG4gIH0gY2F0Y2ggKHgpIHtcbiAgICAvLyBJRSB3aWxsIGZhaWwgb24gZGVmaW5lUHJvcGVydHlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhbkRlZmluZVByb3BlcnR5O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC9saWIvY2FuRGVmaW5lUHJvcGVydHkuanNcbi8vIG1vZHVsZSBpZCA9IDE4NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 186 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\n// The Symbol used to tag the ReactElement type. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\n\nvar REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol['for'] && Symbol['for']('react.element') || 0xeac7;\n\nmodule.exports = REACT_ELEMENT_TYPE;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RFbGVtZW50U3ltYm9sLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50IHR5cGUuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cblxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sWydmb3InXSAmJiBTeW1ib2xbJ2ZvciddKCdyZWFjdC5lbGVtZW50JykgfHwgMHhlYWM3O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJFQUNUX0VMRU1FTlRfVFlQRTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QvbGliL1JlYWN0RWxlbWVudFN5bWJvbC5qc1xuLy8gbW9kdWxlIGlkID0gMTg2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 187 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(179);\n\nvar ReactCurrentOwner = __webpack_require__(182);\nvar REACT_ELEMENT_TYPE = __webpack_require__(186);\n\nvar getIteratorFn = __webpack_require__(188);\nvar invariant = __webpack_require__(180);\nvar KeyEscapeUtils = __webpack_require__(189);\nvar warning = __webpack_require__(183);\n\nvar SEPARATOR = '.';\nvar SUBSEPARATOR = ':';\n\n/**\n * This is inlined from ReactElement since this file is shared between\n * isomorphic and renderers. We could extract this to a\n *\n */\n\n/**\n * TODO: Test that a single child and an array with one item have the same key\n * pattern.\n */\n\nvar didWarnAboutMaps = false;\n\n/**\n * Generate a key string that identifies a component within a set.\n *\n * @param {*} component A component that could contain a manual key.\n * @param {number} index Index that is used if a manual key is not provided.\n * @return {string}\n */\nfunction getComponentKey(component, index) {\n  // Do some typechecking here since we call this blindly. We want to ensure\n  // that we don't block potential future ES APIs.\n  if (component && typeof component === 'object' && component.key != null) {\n    // Explicit key\n    return KeyEscapeUtils.escape(component.key);\n  }\n  // Implicit key determined by the index in the set\n  return index.toString(36);\n}\n\n/**\n * @param {?*} children Children tree container.\n * @param {!string} nameSoFar Name of the key path so far.\n * @param {!function} callback Callback to invoke with each child found.\n * @param {?*} traverseContext Used to pass information throughout the traversal\n * process.\n * @return {!number} The number of children in this subtree.\n */\nfunction traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) {\n  var type = typeof children;\n\n  if (type === 'undefined' || type === 'boolean') {\n    // All of the above are perceived as null.\n    children = null;\n  }\n\n  if (children === null || type === 'string' || type === 'number' ||\n  // The following is inlined from ReactElement. This means we can optimize\n  // some checks. React Fiber also inlines this logic for similar purposes.\n  type === 'object' && children.$$typeof === REACT_ELEMENT_TYPE) {\n    callback(traverseContext, children,\n    // If it's the only child, treat the name as if it was wrapped in an array\n    // so that it's consistent if the number of children grows.\n    nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar);\n    return 1;\n  }\n\n  var child;\n  var nextName;\n  var subtreeCount = 0; // Count of children found in the current subtree.\n  var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;\n\n  if (Array.isArray(children)) {\n    for (var i = 0; i < children.length; i++) {\n      child = children[i];\n      nextName = nextNamePrefix + getComponentKey(child, i);\n      subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n    }\n  } else {\n    var iteratorFn = getIteratorFn(children);\n    if (iteratorFn) {\n      var iterator = iteratorFn.call(children);\n      var step;\n      if (iteratorFn !== children.entries) {\n        var ii = 0;\n        while (!(step = iterator.next()).done) {\n          child = step.value;\n          nextName = nextNamePrefix + getComponentKey(child, ii++);\n          subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n        }\n      } else {\n        if (true) {\n          var mapsAsChildrenAddendum = '';\n          if (ReactCurrentOwner.current) {\n            var mapsAsChildrenOwnerName = ReactCurrentOwner.current.getName();\n            if (mapsAsChildrenOwnerName) {\n              mapsAsChildrenAddendum = ' Check the render method of `' + mapsAsChildrenOwnerName + '`.';\n            }\n          }\n           true ? warning(didWarnAboutMaps, 'Using Maps as children is not yet fully supported. It is an ' + 'experimental feature that might be removed. Convert it to a ' + 'sequence / iterable of keyed ReactElements instead.%s', mapsAsChildrenAddendum) : void 0;\n          didWarnAboutMaps = true;\n        }\n        // Iterator will provide entry [k,v] tuples rather than values.\n        while (!(step = iterator.next()).done) {\n          var entry = step.value;\n          if (entry) {\n            child = entry[1];\n            nextName = nextNamePrefix + KeyEscapeUtils.escape(entry[0]) + SUBSEPARATOR + getComponentKey(child, 0);\n            subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n          }\n        }\n      }\n    } else if (type === 'object') {\n      var addendum = '';\n      if (true) {\n        addendum = ' If you meant to render a collection of children, use an array ' + 'instead or wrap the object using createFragment(object) from the ' + 'React add-ons.';\n        if (children._isReactElement) {\n          addendum = ' It looks like you\\'re using an element created by a different ' + 'version of React. Make sure to use only one copy of React.';\n        }\n        if (ReactCurrentOwner.current) {\n          var name = ReactCurrentOwner.current.getName();\n          if (name) {\n            addendum += ' Check the render method of `' + name + '`.';\n          }\n        }\n      }\n      var childrenString = String(children);\n       true ?  true ? invariant(false, 'Objects are not valid as a React child (found: %s).%s', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum) : _prodInvariant('31', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum) : void 0;\n    }\n  }\n\n  return subtreeCount;\n}\n\n/**\n * Traverses children that are typically specified as `props.children`, but\n * might also be specified through attributes:\n *\n * - `traverseAllChildren(this.props.children, ...)`\n * - `traverseAllChildren(this.props.leftPanelChildren, ...)`\n *\n * The `traverseContext` is an optional argument that is passed through the\n * entire traversal. It can be used to store accumulations or anything else that\n * the callback might find relevant.\n *\n * @param {?*} children Children tree object.\n * @param {!function} callback To invoke upon traversing each child.\n * @param {?*} traverseContext Context for traversal.\n * @return {!number} The number of children in this subtree.\n */\nfunction traverseAllChildren(children, callback, traverseContext) {\n  if (children == null) {\n    return 0;\n  }\n\n  return traverseAllChildrenImpl(children, '', callback, traverseContext);\n}\n\nmodule.exports = traverseAllChildren;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvdHJhdmVyc2VBbGxDaGlsZHJlbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSByZXF1aXJlKCcuL1JlYWN0Q3VycmVudE93bmVyJyk7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnRTeW1ib2wnKTtcblxudmFyIGdldEl0ZXJhdG9yRm4gPSByZXF1aXJlKCcuL2dldEl0ZXJhdG9yRm4nKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciBLZXlFc2NhcGVVdGlscyA9IHJlcXVpcmUoJy4vS2V5RXNjYXBlVXRpbHMnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgU0VQQVJBVE9SID0gJy4nO1xudmFyIFNVQlNFUEFSQVRPUiA9ICc6JztcblxuLyoqXG4gKiBUaGlzIGlzIGlubGluZWQgZnJvbSBSZWFjdEVsZW1lbnQgc2luY2UgdGhpcyBmaWxlIGlzIHNoYXJlZCBiZXR3ZWVuXG4gKiBpc29tb3JwaGljIGFuZCByZW5kZXJlcnMuIFdlIGNvdWxkIGV4dHJhY3QgdGhpcyB0byBhXG4gKlxuICovXG5cbi8qKlxuICogVE9ETzogVGVzdCB0aGF0IGEgc2luZ2xlIGNoaWxkIGFuZCBhbiBhcnJheSB3aXRoIG9uZSBpdGVtIGhhdmUgdGhlIHNhbWUga2V5XG4gKiBwYXR0ZXJuLlxuICovXG5cbnZhciBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7XG5cbi8qKlxuICogR2VuZXJhdGUgYSBrZXkgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyBhIGNvbXBvbmVudCB3aXRoaW4gYSBzZXQuXG4gKlxuICogQHBhcmFtIHsqfSBjb21wb25lbnQgQSBjb21wb25lbnQgdGhhdCBjb3VsZCBjb250YWluIGEgbWFudWFsIGtleS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCB0aGF0IGlzIHVzZWQgaWYgYSBtYW51YWwga2V5IGlzIG5vdCBwcm92aWRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZ2V0Q29tcG9uZW50S2V5KGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgLy8gRG8gc29tZSB0eXBlY2hlY2tpbmcgaGVyZSBzaW5jZSB3ZSBjYWxsIHRoaXMgYmxpbmRseS4gV2Ugd2FudCB0byBlbnN1cmVcbiAgLy8gdGhhdCB3ZSBkb24ndCBibG9jayBwb3RlbnRpYWwgZnV0dXJlIEVTIEFQSXMuXG4gIGlmIChjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudCA9PT0gJ29iamVjdCcgJiYgY29tcG9uZW50LmtleSAhPSBudWxsKSB7XG4gICAgLy8gRXhwbGljaXQga2V5XG4gICAgcmV0dXJuIEtleUVzY2FwZVV0aWxzLmVzY2FwZShjb21wb25lbnQua2V5KTtcbiAgfVxuICAvLyBJbXBsaWNpdCBrZXkgZGV0ZXJtaW5lZCBieSB0aGUgaW5kZXggaW4gdGhlIHNldFxuICByZXR1cm4gaW5kZXgudG9TdHJpbmcoMzYpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHshc3RyaW5nfSBuYW1lU29GYXIgTmFtZSBvZiB0aGUga2V5IHBhdGggc28gZmFyLlxuICogQHBhcmFtIHshZnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIHRvIGludm9rZSB3aXRoIGVhY2ggY2hpbGQgZm91bmQuXG4gKiBAcGFyYW0gez8qfSB0cmF2ZXJzZUNvbnRleHQgVXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRocm91Z2hvdXQgdGhlIHRyYXZlcnNhbFxuICogcHJvY2Vzcy5cbiAqIEByZXR1cm4geyFudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhpcyBzdWJ0cmVlLlxuICovXG5mdW5jdGlvbiB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZHJlbiwgbmFtZVNvRmFyLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGNoaWxkcmVuO1xuXG4gIGlmICh0eXBlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAvLyBBbGwgb2YgdGhlIGFib3ZlIGFyZSBwZXJjZWl2ZWQgYXMgbnVsbC5cbiAgICBjaGlsZHJlbiA9IG51bGw7XG4gIH1cblxuICBpZiAoY2hpbGRyZW4gPT09IG51bGwgfHwgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ251bWJlcicgfHxcbiAgLy8gVGhlIGZvbGxvd2luZyBpcyBpbmxpbmVkIGZyb20gUmVhY3RFbGVtZW50LiBUaGlzIG1lYW5zIHdlIGNhbiBvcHRpbWl6ZVxuICAvLyBzb21lIGNoZWNrcy4gUmVhY3QgRmliZXIgYWxzbyBpbmxpbmVzIHRoaXMgbG9naWMgZm9yIHNpbWlsYXIgcHVycG9zZXMuXG4gIHR5cGUgPT09ICdvYmplY3QnICYmIGNoaWxkcmVuLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEUpIHtcbiAgICBjYWxsYmFjayh0cmF2ZXJzZUNvbnRleHQsIGNoaWxkcmVuLFxuICAgIC8vIElmIGl0J3MgdGhlIG9ubHkgY2hpbGQsIHRyZWF0IHRoZSBuYW1lIGFzIGlmIGl0IHdhcyB3cmFwcGVkIGluIGFuIGFycmF5XG4gICAgLy8gc28gdGhhdCBpdCdzIGNvbnNpc3RlbnQgaWYgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBncm93cy5cbiAgICBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkcmVuLCAwKSA6IG5hbWVTb0Zhcik7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICB2YXIgY2hpbGQ7XG4gIHZhciBuZXh0TmFtZTtcbiAgdmFyIHN1YnRyZWVDb3VudCA9IDA7IC8vIENvdW50IG9mIGNoaWxkcmVuIGZvdW5kIGluIHRoZSBjdXJyZW50IHN1YnRyZWUuXG4gIHZhciBuZXh0TmFtZVByZWZpeCA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgOiBuYW1lU29GYXIgKyBTVUJTRVBBUkFUT1I7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRDb21wb25lbnRLZXkoY2hpbGQsIGkpO1xuICAgICAgc3VidHJlZUNvdW50ICs9IHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkLCBuZXh0TmFtZSwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7XG4gICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChjaGlsZHJlbik7XG4gICAgICB2YXIgc3RlcDtcbiAgICAgIGlmIChpdGVyYXRvckZuICE9PSBjaGlsZHJlbi5lbnRyaWVzKSB7XG4gICAgICAgIHZhciBpaSA9IDA7XG4gICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICBjaGlsZCA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldENvbXBvbmVudEtleShjaGlsZCwgaWkrKyk7XG4gICAgICAgICAgc3VidHJlZUNvdW50ICs9IHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkLCBuZXh0TmFtZSwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgdmFyIG1hcHNBc0NoaWxkcmVuQWRkZW5kdW0gPSAnJztcbiAgICAgICAgICBpZiAoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgICAgICAgICAgdmFyIG1hcHNBc0NoaWxkcmVuT3duZXJOYW1lID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5nZXROYW1lKCk7XG4gICAgICAgICAgICBpZiAobWFwc0FzQ2hpbGRyZW5Pd25lck5hbWUpIHtcbiAgICAgICAgICAgICAgbWFwc0FzQ2hpbGRyZW5BZGRlbmR1bSA9ICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBtYXBzQXNDaGlsZHJlbk93bmVyTmFtZSArICdgLic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGRpZFdhcm5BYm91dE1hcHMsICdVc2luZyBNYXBzIGFzIGNoaWxkcmVuIGlzIG5vdCB5ZXQgZnVsbHkgc3VwcG9ydGVkLiBJdCBpcyBhbiAnICsgJ2V4cGVyaW1lbnRhbCBmZWF0dXJlIHRoYXQgbWlnaHQgYmUgcmVtb3ZlZC4gQ29udmVydCBpdCB0byBhICcgKyAnc2VxdWVuY2UgLyBpdGVyYWJsZSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuJXMnLCBtYXBzQXNDaGlsZHJlbkFkZGVuZHVtKSA6IHZvaWQgMDtcbiAgICAgICAgICBkaWRXYXJuQWJvdXRNYXBzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJdGVyYXRvciB3aWxsIHByb3ZpZGUgZW50cnkgW2ssdl0gdHVwbGVzIHJhdGhlciB0aGFuIHZhbHVlcy5cbiAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICBjaGlsZCA9IGVudHJ5WzFdO1xuICAgICAgICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIEtleUVzY2FwZVV0aWxzLmVzY2FwZShlbnRyeVswXSkgKyBTVUJTRVBBUkFUT1IgKyBnZXRDb21wb25lbnRLZXkoY2hpbGQsIDApO1xuICAgICAgICAgICAgc3VidHJlZUNvdW50ICs9IHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkLCBuZXh0TmFtZSwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIGFkZGVuZHVtID0gJyc7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBhZGRlbmR1bSA9ICcgSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSAnICsgJ2luc3RlYWQgb3Igd3JhcCB0aGUgb2JqZWN0IHVzaW5nIGNyZWF0ZUZyYWdtZW50KG9iamVjdCkgZnJvbSB0aGUgJyArICdSZWFjdCBhZGQtb25zLic7XG4gICAgICAgIGlmIChjaGlsZHJlbi5faXNSZWFjdEVsZW1lbnQpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSXQgbG9va3MgbGlrZSB5b3VcXCdyZSB1c2luZyBhbiBlbGVtZW50IGNyZWF0ZWQgYnkgYSBkaWZmZXJlbnQgJyArICd2ZXJzaW9uIG9mIFJlYWN0LiBNYWtlIHN1cmUgdG8gdXNlIG9ubHkgb25lIGNvcHkgb2YgUmVhY3QuJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgICAgICAgIHZhciBuYW1lID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5nZXROYW1lKCk7XG4gICAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgIGFkZGVuZHVtICs9ICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBjaGlsZHJlblN0cmluZyA9IFN0cmluZyhjaGlsZHJlbik7XG4gICAgICAhZmFsc2UgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiAlcykuJXMnLCBjaGlsZHJlblN0cmluZyA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKGNoaWxkcmVuKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRyZW5TdHJpbmcsIGFkZGVuZHVtKSA6IF9wcm9kSW52YXJpYW50KCczMScsIGNoaWxkcmVuU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZHJlblN0cmluZywgYWRkZW5kdW0pIDogdm9pZCAwO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdWJ0cmVlQ291bnQ7XG59XG5cbi8qKlxuICogVHJhdmVyc2VzIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYCwgYnV0XG4gKiBtaWdodCBhbHNvIGJlIHNwZWNpZmllZCB0aHJvdWdoIGF0dHJpYnV0ZXM6XG4gKlxuICogLSBgdHJhdmVyc2VBbGxDaGlsZHJlbih0aGlzLnByb3BzLmNoaWxkcmVuLCAuLi4pYFxuICogLSBgdHJhdmVyc2VBbGxDaGlsZHJlbih0aGlzLnByb3BzLmxlZnRQYW5lbENoaWxkcmVuLCAuLi4pYFxuICpcbiAqIFRoZSBgdHJhdmVyc2VDb250ZXh0YCBpcyBhbiBvcHRpb25hbCBhcmd1bWVudCB0aGF0IGlzIHBhc3NlZCB0aHJvdWdoIHRoZVxuICogZW50aXJlIHRyYXZlcnNhbC4gSXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgYWNjdW11bGF0aW9ucyBvciBhbnl0aGluZyBlbHNlIHRoYXRcbiAqIHRoZSBjYWxsYmFjayBtaWdodCBmaW5kIHJlbGV2YW50LlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgb2JqZWN0LlxuICogQHBhcmFtIHshZnVuY3Rpb259IGNhbGxiYWNrIFRvIGludm9rZSB1cG9uIHRyYXZlcnNpbmcgZWFjaCBjaGlsZC5cbiAqIEBwYXJhbSB7Pyp9IHRyYXZlcnNlQ29udGV4dCBDb250ZXh0IGZvciB0cmF2ZXJzYWwuXG4gKiBAcmV0dXJuIHshbnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHRoaXMgc3VidHJlZS5cbiAqL1xuZnVuY3Rpb24gdHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCkge1xuICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcmV0dXJuIHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkcmVuLCAnJywgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdHJhdmVyc2VBbGxDaGlsZHJlbjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QvbGliL3RyYXZlcnNlQWxsQ2hpbGRyZW4uanNcbi8vIG1vZHVsZSBpZCA9IDE4N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 188 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\n/* global Symbol */\n\nvar ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.\n\n/**\n * Returns the iterator method function contained on the iterable object.\n *\n * Be sure to invoke the function with the iterable as context:\n *\n *     var iteratorFn = getIteratorFn(myIterable);\n *     if (iteratorFn) {\n *       var iterator = iteratorFn.call(myIterable);\n *       ...\n *     }\n *\n * @param {?object} maybeIterable\n * @return {?function}\n */\nfunction getIteratorFn(maybeIterable) {\n  var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);\n  if (typeof iteratorFn === 'function') {\n    return iteratorFn;\n  }\n}\n\nmodule.exports = getIteratorFn;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvZ2V0SXRlcmF0b3JGbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBTeW1ib2wgKi9cblxudmFyIElURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InOyAvLyBCZWZvcmUgU3ltYm9sIHNwZWMuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgaXRlcmF0b3IgbWV0aG9kIGZ1bmN0aW9uIGNvbnRhaW5lZCBvbiB0aGUgaXRlcmFibGUgb2JqZWN0LlxuICpcbiAqIEJlIHN1cmUgdG8gaW52b2tlIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBpdGVyYWJsZSBhcyBjb250ZXh0OlxuICpcbiAqICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obXlJdGVyYWJsZSk7XG4gKiAgICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAqICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChteUl0ZXJhYmxlKTtcbiAqICAgICAgIC4uLlxuICogICAgIH1cbiAqXG4gKiBAcGFyYW0gez9vYmplY3R9IG1heWJlSXRlcmFibGVcbiAqIEByZXR1cm4gez9mdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gIHZhciBpdGVyYXRvckZuID0gbWF5YmVJdGVyYWJsZSAmJiAoSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXSk7XG4gIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBpdGVyYXRvckZuO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0SXRlcmF0b3JGbjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QvbGliL2dldEl0ZXJhdG9yRm4uanNcbi8vIG1vZHVsZSBpZCA9IDE4OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 189 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\n/**\n * Escape and wrap key so it is safe to use as a reactid\n *\n * @param {string} key to be escaped.\n * @return {string} the escaped key.\n */\n\nfunction escape(key) {\n  var escapeRegex = /[=:]/g;\n  var escaperLookup = {\n    '=': '=0',\n    ':': '=2'\n  };\n  var escapedString = ('' + key).replace(escapeRegex, function (match) {\n    return escaperLookup[match];\n  });\n\n  return '$' + escapedString;\n}\n\n/**\n * Unescape and unwrap key for human-readable display\n *\n * @param {string} key to unescape.\n * @return {string} the unescaped key.\n */\nfunction unescape(key) {\n  var unescapeRegex = /(=0|=2)/g;\n  var unescaperLookup = {\n    '=0': '=',\n    '=2': ':'\n  };\n  var keySubstring = key[0] === '.' && key[1] === '$' ? key.substring(2) : key.substring(1);\n\n  return ('' + keySubstring).replace(unescapeRegex, function (match) {\n    return unescaperLookup[match];\n  });\n}\n\nvar KeyEscapeUtils = {\n  escape: escape,\n  unescape: unescape\n};\n\nmodule.exports = KeyEscapeUtils;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvS2V5RXNjYXBlVXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEVzY2FwZSBhbmQgd3JhcCBrZXkgc28gaXQgaXMgc2FmZSB0byB1c2UgYXMgYSByZWFjdGlkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSB0byBiZSBlc2NhcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgZXNjYXBlZCBrZXkuXG4gKi9cblxuZnVuY3Rpb24gZXNjYXBlKGtleSkge1xuICB2YXIgZXNjYXBlUmVnZXggPSAvWz06XS9nO1xuICB2YXIgZXNjYXBlckxvb2t1cCA9IHtcbiAgICAnPSc6ICc9MCcsXG4gICAgJzonOiAnPTInXG4gIH07XG4gIHZhciBlc2NhcGVkU3RyaW5nID0gKCcnICsga2V5KS5yZXBsYWNlKGVzY2FwZVJlZ2V4LCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICByZXR1cm4gZXNjYXBlckxvb2t1cFttYXRjaF07XG4gIH0pO1xuXG4gIHJldHVybiAnJCcgKyBlc2NhcGVkU3RyaW5nO1xufVxuXG4vKipcbiAqIFVuZXNjYXBlIGFuZCB1bndyYXAga2V5IGZvciBodW1hbi1yZWFkYWJsZSBkaXNwbGF5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSB0byB1bmVzY2FwZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIHVuZXNjYXBlZCBrZXkuXG4gKi9cbmZ1bmN0aW9uIHVuZXNjYXBlKGtleSkge1xuICB2YXIgdW5lc2NhcGVSZWdleCA9IC8oPTB8PTIpL2c7XG4gIHZhciB1bmVzY2FwZXJMb29rdXAgPSB7XG4gICAgJz0wJzogJz0nLFxuICAgICc9Mic6ICc6J1xuICB9O1xuICB2YXIga2V5U3Vic3RyaW5nID0ga2V5WzBdID09PSAnLicgJiYga2V5WzFdID09PSAnJCcgPyBrZXkuc3Vic3RyaW5nKDIpIDoga2V5LnN1YnN0cmluZygxKTtcblxuICByZXR1cm4gKCcnICsga2V5U3Vic3RyaW5nKS5yZXBsYWNlKHVuZXNjYXBlUmVnZXgsIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgIHJldHVybiB1bmVzY2FwZXJMb29rdXBbbWF0Y2hdO1xuICB9KTtcbn1cblxudmFyIEtleUVzY2FwZVV0aWxzID0ge1xuICBlc2NhcGU6IGVzY2FwZSxcbiAgdW5lc2NhcGU6IHVuZXNjYXBlXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEtleUVzY2FwZVV0aWxzO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC9saWIvS2V5RXNjYXBlVXRpbHMuanNcbi8vIG1vZHVsZSBpZCA9IDE4OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 190 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(179);\n\nvar ReactNoopUpdateQueue = __webpack_require__(191);\n\nvar canDefineProperty = __webpack_require__(185);\nvar emptyObject = __webpack_require__(192);\nvar invariant = __webpack_require__(180);\nvar warning = __webpack_require__(183);\n\n/**\n * Base class helpers for the updating state of a component.\n */\nfunction ReactComponent(props, context, updater) {\n  this.props = props;\n  this.context = context;\n  this.refs = emptyObject;\n  // We initialize the default updater but the real one gets injected by the\n  // renderer.\n  this.updater = updater || ReactNoopUpdateQueue;\n}\n\nReactComponent.prototype.isReactComponent = {};\n\n/**\n * Sets a subset of the state. Always use this to mutate\n * state. You should treat `this.state` as immutable.\n *\n * There is no guarantee that `this.state` will be immediately updated, so\n * accessing `this.state` after calling this method may return the old value.\n *\n * There is no guarantee that calls to `setState` will run synchronously,\n * as they may eventually be batched together.  You can provide an optional\n * callback that will be executed when the call to setState is actually\n * completed.\n *\n * When a function is provided to setState, it will be called at some point in\n * the future (not synchronously). It will be called with the up to date\n * component arguments (state, props, context). These values can be different\n * from this.* because your function may be called after receiveProps but before\n * shouldComponentUpdate, and this new state, props, and context will not yet be\n * assigned to this.\n *\n * @param {object|function} partialState Next partial state or function to\n *        produce next partial state to be merged with current state.\n * @param {?function} callback Called after state is updated.\n * @final\n * @protected\n */\nReactComponent.prototype.setState = function (partialState, callback) {\n  !(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null) ?  true ? invariant(false, 'setState(...): takes an object of state variables to update or a function which returns an object of state variables.') : _prodInvariant('85') : void 0;\n  this.updater.enqueueSetState(this, partialState);\n  if (callback) {\n    this.updater.enqueueCallback(this, callback, 'setState');\n  }\n};\n\n/**\n * Forces an update. This should only be invoked when it is known with\n * certainty that we are **not** in a DOM transaction.\n *\n * You may want to call this when you know that some deeper aspect of the\n * component's state has changed but `setState` was not called.\n *\n * This will not invoke `shouldComponentUpdate`, but it will invoke\n * `componentWillUpdate` and `componentDidUpdate`.\n *\n * @param {?function} callback Called after update is complete.\n * @final\n * @protected\n */\nReactComponent.prototype.forceUpdate = function (callback) {\n  this.updater.enqueueForceUpdate(this);\n  if (callback) {\n    this.updater.enqueueCallback(this, callback, 'forceUpdate');\n  }\n};\n\n/**\n * Deprecated APIs. These APIs used to exist on classic React classes but since\n * we would like to deprecate them, we're not going to move them over to this\n * modern base class. Instead, we define a getter that warns if it's accessed.\n */\nif (true) {\n  var deprecatedAPIs = {\n    isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'],\n    replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).']\n  };\n  var defineDeprecationWarning = function (methodName, info) {\n    if (canDefineProperty) {\n      Object.defineProperty(ReactComponent.prototype, methodName, {\n        get: function () {\n           true ? warning(false, '%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]) : void 0;\n          return undefined;\n        }\n      });\n    }\n  };\n  for (var fnName in deprecatedAPIs) {\n    if (deprecatedAPIs.hasOwnProperty(fnName)) {\n      defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);\n    }\n  }\n}\n\nmodule.exports = ReactComponent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RDb21wb25lbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0gcmVxdWlyZSgnLi9SZWFjdE5vb3BVcGRhdGVRdWV1ZScpO1xuXG52YXIgY2FuRGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL2NhbkRlZmluZVByb3BlcnR5Jyk7XG52YXIgZW1wdHlPYmplY3QgPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eU9iamVjdCcpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBoZWxwZXJzIGZvciB0aGUgdXBkYXRpbmcgc3RhdGUgb2YgYSBjb21wb25lbnQuXG4gKi9cbmZ1bmN0aW9uIFJlYWN0Q29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gIC8vIFdlIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgdXBkYXRlciBidXQgdGhlIHJlYWwgb25lIGdldHMgaW5qZWN0ZWQgYnkgdGhlXG4gIC8vIHJlbmRlcmVyLlxuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG5SZWFjdENvbXBvbmVudC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCA9IHt9O1xuXG4vKipcbiAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgdG8gbXV0YXRlXG4gKiBzdGF0ZS4gWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGNhbGxzIHRvIGBzZXRTdGF0ZWAgd2lsbCBydW4gc3luY2hyb25vdXNseSxcbiAqIGFzIHRoZXkgbWF5IGV2ZW50dWFsbHkgYmUgYmF0Y2hlZCB0b2dldGhlci4gIFlvdSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbFxuICogY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGNhbGwgdG8gc2V0U3RhdGUgaXMgYWN0dWFsbHlcbiAqIGNvbXBsZXRlZC5cbiAqXG4gKiBXaGVuIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgdG8gc2V0U3RhdGUsIGl0IHdpbGwgYmUgY2FsbGVkIGF0IHNvbWUgcG9pbnQgaW5cbiAqIHRoZSBmdXR1cmUgKG5vdCBzeW5jaHJvbm91c2x5KS4gSXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgdXAgdG8gZGF0ZVxuICogY29tcG9uZW50IGFyZ3VtZW50cyAoc3RhdGUsIHByb3BzLCBjb250ZXh0KS4gVGhlc2UgdmFsdWVzIGNhbiBiZSBkaWZmZXJlbnRcbiAqIGZyb20gdGhpcy4qIGJlY2F1c2UgeW91ciBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGFmdGVyIHJlY2VpdmVQcm9wcyBidXQgYmVmb3JlXG4gKiBzaG91bGRDb21wb25lbnRVcGRhdGUsIGFuZCB0aGlzIG5ldyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHdpbGwgbm90IHlldCBiZVxuICogYXNzaWduZWQgdG8gdGhpcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdHxmdW5jdGlvbn0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSBvciBmdW5jdGlvbiB0b1xuICogICAgICAgIHByb2R1Y2UgbmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIGN1cnJlbnQgc3RhdGUuXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHN0YXRlIGlzIHVwZGF0ZWQuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuUmVhY3RDb21wb25lbnQucHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24gKHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2spIHtcbiAgISh0eXBlb2YgcGFydGlhbFN0YXRlID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgcGFydGlhbFN0YXRlID09PSAnZnVuY3Rpb24nIHx8IHBhcnRpYWxTdGF0ZSA9PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdzZXRTdGF0ZSguLi4pOiB0YWtlcyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzIHRvIHVwZGF0ZSBvciBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcy4nKSA6IF9wcm9kSW52YXJpYW50KCc4NScpIDogdm9pZCAwO1xuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsIHBhcnRpYWxTdGF0ZSk7XG4gIGlmIChjYWxsYmFjaykge1xuICAgIHRoaXMudXBkYXRlci5lbnF1ZXVlQ2FsbGJhY2sodGhpcywgY2FsbGJhY2ssICdzZXRTdGF0ZScpO1xuICB9XG59O1xuXG4vKipcbiAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICpcbiAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICpcbiAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gKlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciB1cGRhdGUgaXMgY29tcGxldGUuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuUmVhY3RDb21wb25lbnQucHJvdG90eXBlLmZvcmNlVXBkYXRlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHRoaXMudXBkYXRlci5lbnF1ZXVlRm9yY2VVcGRhdGUodGhpcyk7XG4gIGlmIChjYWxsYmFjaykge1xuICAgIHRoaXMudXBkYXRlci5lbnF1ZXVlQ2FsbGJhY2sodGhpcywgY2FsbGJhY2ssICdmb3JjZVVwZGF0ZScpO1xuICB9XG59O1xuXG4vKipcbiAqIERlcHJlY2F0ZWQgQVBJcy4gVGhlc2UgQVBJcyB1c2VkIHRvIGV4aXN0IG9uIGNsYXNzaWMgUmVhY3QgY2xhc3NlcyBidXQgc2luY2VcbiAqIHdlIHdvdWxkIGxpa2UgdG8gZGVwcmVjYXRlIHRoZW0sIHdlJ3JlIG5vdCBnb2luZyB0byBtb3ZlIHRoZW0gb3ZlciB0byB0aGlzXG4gKiBtb2Rlcm4gYmFzZSBjbGFzcy4gSW5zdGVhZCwgd2UgZGVmaW5lIGEgZ2V0dGVyIHRoYXQgd2FybnMgaWYgaXQncyBhY2Nlc3NlZC5cbiAqL1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIGRlcHJlY2F0ZWRBUElzID0ge1xuICAgIGlzTW91bnRlZDogWydpc01vdW50ZWQnLCAnSW5zdGVhZCwgbWFrZSBzdXJlIHRvIGNsZWFuIHVwIHN1YnNjcmlwdGlvbnMgYW5kIHBlbmRpbmcgcmVxdWVzdHMgaW4gJyArICdjb21wb25lbnRXaWxsVW5tb3VudCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4nXSxcbiAgICByZXBsYWNlU3RhdGU6IFsncmVwbGFjZVN0YXRlJywgJ1JlZmFjdG9yIHlvdXIgY29kZSB0byB1c2Ugc2V0U3RhdGUgaW5zdGVhZCAoc2VlICcgKyAnaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zMjM2KS4nXVxuICB9O1xuICB2YXIgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nID0gZnVuY3Rpb24gKG1ldGhvZE5hbWUsIGluZm8pIHtcbiAgICBpZiAoY2FuRGVmaW5lUHJvcGVydHkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFjdENvbXBvbmVudC5wcm90b3R5cGUsIG1ldGhvZE5hbWUsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyguLi4pIGlzIGRlcHJlY2F0ZWQgaW4gcGxhaW4gSmF2YVNjcmlwdCBSZWFjdCBjbGFzc2VzLiAlcycsIGluZm9bMF0sIGluZm9bMV0pIDogdm9pZCAwO1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgZm9yICh2YXIgZm5OYW1lIGluIGRlcHJlY2F0ZWRBUElzKSB7XG4gICAgaWYgKGRlcHJlY2F0ZWRBUElzLmhhc093blByb3BlcnR5KGZuTmFtZSkpIHtcbiAgICAgIGRlZmluZURlcHJlY2F0aW9uV2FybmluZyhmbk5hbWUsIGRlcHJlY2F0ZWRBUElzW2ZuTmFtZV0pO1xuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q29tcG9uZW50O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC9saWIvUmVhY3RDb21wb25lbnQuanNcbi8vIG1vZHVsZSBpZCA9IDE5MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 191 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2015-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar warning = __webpack_require__(183);\n\nfunction warnNoop(publicInstance, callerName) {\n  if (true) {\n    var constructor = publicInstance.constructor;\n     true ? warning(false, '%s(...): Can only update a mounted or mounting component. ' + 'This usually means you called %s() on an unmounted component. ' + 'This is a no-op. Please check the code for the %s component.', callerName, callerName, constructor && (constructor.displayName || constructor.name) || 'ReactClass') : void 0;\n  }\n}\n\n/**\n * This is the abstract API for an update queue.\n */\nvar ReactNoopUpdateQueue = {\n\n  /**\n   * Checks whether or not this composite component is mounted.\n   * @param {ReactClass} publicInstance The instance we want to test.\n   * @return {boolean} True if mounted, false otherwise.\n   * @protected\n   * @final\n   */\n  isMounted: function (publicInstance) {\n    return false;\n  },\n\n  /**\n   * Enqueue a callback that will be executed after all the pending updates\n   * have processed.\n   *\n   * @param {ReactClass} publicInstance The instance to use as `this` context.\n   * @param {?function} callback Called after state is updated.\n   * @internal\n   */\n  enqueueCallback: function (publicInstance, callback) {},\n\n  /**\n   * Forces an update. This should only be invoked when it is known with\n   * certainty that we are **not** in a DOM transaction.\n   *\n   * You may want to call this when you know that some deeper aspect of the\n   * component's state has changed but `setState` was not called.\n   *\n   * This will not invoke `shouldComponentUpdate`, but it will invoke\n   * `componentWillUpdate` and `componentDidUpdate`.\n   *\n   * @param {ReactClass} publicInstance The instance that should rerender.\n   * @internal\n   */\n  enqueueForceUpdate: function (publicInstance) {\n    warnNoop(publicInstance, 'forceUpdate');\n  },\n\n  /**\n   * Replaces all of the state. Always use this or `setState` to mutate state.\n   * You should treat `this.state` as immutable.\n   *\n   * There is no guarantee that `this.state` will be immediately updated, so\n   * accessing `this.state` after calling this method may return the old value.\n   *\n   * @param {ReactClass} publicInstance The instance that should rerender.\n   * @param {object} completeState Next state.\n   * @internal\n   */\n  enqueueReplaceState: function (publicInstance, completeState) {\n    warnNoop(publicInstance, 'replaceState');\n  },\n\n  /**\n   * Sets a subset of the state. This only exists because _pendingState is\n   * internal. This provides a merging strategy that is not available to deep\n   * properties which is confusing. TODO: Expose pendingState or don't use it\n   * during the merge.\n   *\n   * @param {ReactClass} publicInstance The instance that should rerender.\n   * @param {object} partialState Next partial state to be merged with state.\n   * @internal\n   */\n  enqueueSetState: function (publicInstance, partialState) {\n    warnNoop(publicInstance, 'setState');\n  }\n};\n\nmodule.exports = ReactNoopUpdateQueue;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3ROb29wVXBkYXRlUXVldWUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNS1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbmZ1bmN0aW9uIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCBjYWxsZXJOYW1lKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdmFyIGNvbnN0cnVjdG9yID0gcHVibGljSW5zdGFuY2UuY29uc3RydWN0b3I7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyguLi4pOiBDYW4gb25seSB1cGRhdGUgYSBtb3VudGVkIG9yIG1vdW50aW5nIGNvbXBvbmVudC4gJyArICdUaGlzIHVzdWFsbHkgbWVhbnMgeW91IGNhbGxlZCAlcygpIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuICcgKyAnVGhpcyBpcyBhIG5vLW9wLiBQbGVhc2UgY2hlY2sgdGhlIGNvZGUgZm9yIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFtZSwgY2FsbGVyTmFtZSwgY29uc3RydWN0b3IgJiYgKGNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IGNvbnN0cnVjdG9yLm5hbWUpIHx8ICdSZWFjdENsYXNzJykgOiB2b2lkIDA7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBBUEkgZm9yIGFuIHVwZGF0ZSBxdWV1ZS5cbiAqL1xudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0ge1xuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhpcyBjb21wb3NpdGUgY29tcG9uZW50IGlzIG1vdW50ZWQuXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHdlIHdhbnQgdG8gdGVzdC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb3VudGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGZpbmFsXG4gICAqL1xuICBpc01vdW50ZWQ6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAvKipcbiAgICogRW5xdWV1ZSBhIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBhZnRlciBhbGwgdGhlIHBlbmRpbmcgdXBkYXRlc1xuICAgKiBoYXZlIHByb2Nlc3NlZC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdG8gdXNlIGFzIGB0aGlzYCBjb250ZXh0LlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHN0YXRlIGlzIHVwZGF0ZWQuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZUNhbGxiYWNrOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNhbGxiYWNrKSB7fSxcblxuICAvKipcbiAgICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICAgKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipub3QqKiBpbiBhIERPTSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICAgKiBjb21wb25lbnQncyBzdGF0ZSBoYXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC5cbiAgICpcbiAgICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICAgKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnREaWRVcGRhdGVgLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnZm9yY2VVcGRhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogUmVwbGFjZXMgYWxsIG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIG9yIGBzZXRTdGF0ZWAgdG8gbXV0YXRlIHN0YXRlLlxuICAgKiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gICAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcGxldGVTdGF0ZSBOZXh0IHN0YXRlLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVSZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY29tcGxldGVTdGF0ZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAncmVwbGFjZVN0YXRlJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBUaGlzIG9ubHkgZXhpc3RzIGJlY2F1c2UgX3BlbmRpbmdTdGF0ZSBpc1xuICAgKiBpbnRlcm5hbC4gVGhpcyBwcm92aWRlcyBhIG1lcmdpbmcgc3RyYXRlZ3kgdGhhdCBpcyBub3QgYXZhaWxhYmxlIHRvIGRlZXBcbiAgICogcHJvcGVydGllcyB3aGljaCBpcyBjb25mdXNpbmcuIFRPRE86IEV4cG9zZSBwZW5kaW5nU3RhdGUgb3IgZG9uJ3QgdXNlIGl0XG4gICAqIGR1cmluZyB0aGUgbWVyZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBzdGF0ZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgcGFydGlhbFN0YXRlKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdzZXRTdGF0ZScpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC9saWIvUmVhY3ROb29wVXBkYXRlUXVldWUuanNcbi8vIG1vZHVsZSBpZCA9IDE5MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 192 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar emptyObject = {};\n\nif (true) {\n  Object.freeze(emptyObject);\n}\n\nmodule.exports = emptyObject;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9lbXB0eU9iamVjdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGVtcHR5T2JqZWN0ID0ge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIE9iamVjdC5mcmVlemUoZW1wdHlPYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVtcHR5T2JqZWN0O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9mYmpzL2xpYi9lbXB0eU9iamVjdC5qc1xuLy8gbW9kdWxlIGlkID0gMTkyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 193 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _assign = __webpack_require__(176);\n\nvar ReactComponent = __webpack_require__(190);\nvar ReactNoopUpdateQueue = __webpack_require__(191);\n\nvar emptyObject = __webpack_require__(192);\n\n/**\n * Base class helpers for the updating state of a component.\n */\nfunction ReactPureComponent(props, context, updater) {\n  // Duplicated from ReactComponent.\n  this.props = props;\n  this.context = context;\n  this.refs = emptyObject;\n  // We initialize the default updater but the real one gets injected by the\n  // renderer.\n  this.updater = updater || ReactNoopUpdateQueue;\n}\n\nfunction ComponentDummy() {}\nComponentDummy.prototype = ReactComponent.prototype;\nReactPureComponent.prototype = new ComponentDummy();\nReactPureComponent.prototype.constructor = ReactPureComponent;\n// Avoid an extra prototype jump for these methods.\n_assign(ReactPureComponent.prototype, ReactComponent.prototype);\nReactPureComponent.prototype.isPureReactComponent = true;\n\nmodule.exports = ReactPureComponent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RQdXJlQ29tcG9uZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3RDb21wb25lbnQgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9uZW50Jyk7XG52YXIgUmVhY3ROb29wVXBkYXRlUXVldWUgPSByZXF1aXJlKCcuL1JlYWN0Tm9vcFVwZGF0ZVF1ZXVlJyk7XG5cbnZhciBlbXB0eU9iamVjdCA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5T2JqZWN0Jyk7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBoZWxwZXJzIGZvciB0aGUgdXBkYXRpbmcgc3RhdGUgb2YgYSBjb21wb25lbnQuXG4gKi9cbmZ1bmN0aW9uIFJlYWN0UHVyZUNvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICAvLyBEdXBsaWNhdGVkIGZyb20gUmVhY3RDb21wb25lbnQuXG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gIC8vIFdlIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgdXBkYXRlciBidXQgdGhlIHJlYWwgb25lIGdldHMgaW5qZWN0ZWQgYnkgdGhlXG4gIC8vIHJlbmRlcmVyLlxuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG5mdW5jdGlvbiBDb21wb25lbnREdW1teSgpIHt9XG5Db21wb25lbnREdW1teS5wcm90b3R5cGUgPSBSZWFjdENvbXBvbmVudC5wcm90b3R5cGU7XG5SZWFjdFB1cmVDb21wb25lbnQucHJvdG90eXBlID0gbmV3IENvbXBvbmVudER1bW15KCk7XG5SZWFjdFB1cmVDb21wb25lbnQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmVhY3RQdXJlQ29tcG9uZW50O1xuLy8gQXZvaWQgYW4gZXh0cmEgcHJvdG90eXBlIGp1bXAgZm9yIHRoZXNlIG1ldGhvZHMuXG5fYXNzaWduKFJlYWN0UHVyZUNvbXBvbmVudC5wcm90b3R5cGUsIFJlYWN0Q29tcG9uZW50LnByb3RvdHlwZSk7XG5SZWFjdFB1cmVDb21wb25lbnQucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ID0gdHJ1ZTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFB1cmVDb21wb25lbnQ7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0L2xpYi9SZWFjdFB1cmVDb21wb25lbnQuanNcbi8vIG1vZHVsZSBpZCA9IDE5M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 194 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(179),\n    _assign = __webpack_require__(176);\n\nvar ReactComponent = __webpack_require__(190);\nvar ReactElement = __webpack_require__(181);\nvar ReactPropTypeLocationNames = __webpack_require__(195);\nvar ReactNoopUpdateQueue = __webpack_require__(191);\n\nvar emptyObject = __webpack_require__(192);\nvar invariant = __webpack_require__(180);\nvar warning = __webpack_require__(183);\n\nvar MIXINS_KEY = 'mixins';\n\n// Helper function to allow the creation of anonymous functions which do not\n// have .name set to the name of the variable being assigned to.\nfunction identity(fn) {\n  return fn;\n}\n\n/**\n * Policies that describe methods in `ReactClassInterface`.\n */\n\n\nvar injectedMixins = [];\n\n/**\n * Composite components are higher-level components that compose other composite\n * or host components.\n *\n * To create a new type of `ReactClass`, pass a specification of\n * your new class to `React.createClass`. The only requirement of your class\n * specification is that you implement a `render` method.\n *\n *   var MyComponent = React.createClass({\n *     render: function() {\n *       return <div>Hello World</div>;\n *     }\n *   });\n *\n * The class specification supports a specific protocol of methods that have\n * special meaning (e.g. `render`). See `ReactClassInterface` for\n * more the comprehensive protocol. Any other properties and methods in the\n * class specification will be available on the prototype.\n *\n * @interface ReactClassInterface\n * @internal\n */\nvar ReactClassInterface = {\n\n  /**\n   * An array of Mixin objects to include when defining your component.\n   *\n   * @type {array}\n   * @optional\n   */\n  mixins: 'DEFINE_MANY',\n\n  /**\n   * An object containing properties and methods that should be defined on\n   * the component's constructor instead of its prototype (static methods).\n   *\n   * @type {object}\n   * @optional\n   */\n  statics: 'DEFINE_MANY',\n\n  /**\n   * Definition of prop types for this component.\n   *\n   * @type {object}\n   * @optional\n   */\n  propTypes: 'DEFINE_MANY',\n\n  /**\n   * Definition of context types for this component.\n   *\n   * @type {object}\n   * @optional\n   */\n  contextTypes: 'DEFINE_MANY',\n\n  /**\n   * Definition of context types this component sets for its children.\n   *\n   * @type {object}\n   * @optional\n   */\n  childContextTypes: 'DEFINE_MANY',\n\n  // ==== Definition methods ====\n\n  /**\n   * Invoked when the component is mounted. Values in the mapping will be set on\n   * `this.props` if that prop is not specified (i.e. using an `in` check).\n   *\n   * This method is invoked before `getInitialState` and therefore cannot rely\n   * on `this.state` or use `this.setState`.\n   *\n   * @return {object}\n   * @optional\n   */\n  getDefaultProps: 'DEFINE_MANY_MERGED',\n\n  /**\n   * Invoked once before the component is mounted. The return value will be used\n   * as the initial value of `this.state`.\n   *\n   *   getInitialState: function() {\n   *     return {\n   *       isOn: false,\n   *       fooBaz: new BazFoo()\n   *     }\n   *   }\n   *\n   * @return {object}\n   * @optional\n   */\n  getInitialState: 'DEFINE_MANY_MERGED',\n\n  /**\n   * @return {object}\n   * @optional\n   */\n  getChildContext: 'DEFINE_MANY_MERGED',\n\n  /**\n   * Uses props from `this.props` and state from `this.state` to render the\n   * structure of the component.\n   *\n   * No guarantees are made about when or how often this method is invoked, so\n   * it must not have side effects.\n   *\n   *   render: function() {\n   *     var name = this.props.name;\n   *     return <div>Hello, {name}!</div>;\n   *   }\n   *\n   * @return {ReactComponent}\n   * @nosideeffects\n   * @required\n   */\n  render: 'DEFINE_ONCE',\n\n  // ==== Delegate methods ====\n\n  /**\n   * Invoked when the component is initially created and about to be mounted.\n   * This may have side effects, but any external subscriptions or data created\n   * by this method must be cleaned up in `componentWillUnmount`.\n   *\n   * @optional\n   */\n  componentWillMount: 'DEFINE_MANY',\n\n  /**\n   * Invoked when the component has been mounted and has a DOM representation.\n   * However, there is no guarantee that the DOM node is in the document.\n   *\n   * Use this as an opportunity to operate on the DOM when the component has\n   * been mounted (initialized and rendered) for the first time.\n   *\n   * @param {DOMElement} rootNode DOM element representing the component.\n   * @optional\n   */\n  componentDidMount: 'DEFINE_MANY',\n\n  /**\n   * Invoked before the component receives new props.\n   *\n   * Use this as an opportunity to react to a prop transition by updating the\n   * state using `this.setState`. Current props are accessed via `this.props`.\n   *\n   *   componentWillReceiveProps: function(nextProps, nextContext) {\n   *     this.setState({\n   *       likesIncreasing: nextProps.likeCount > this.props.likeCount\n   *     });\n   *   }\n   *\n   * NOTE: There is no equivalent `componentWillReceiveState`. An incoming prop\n   * transition may cause a state change, but the opposite is not true. If you\n   * need it, you are probably looking for `componentWillUpdate`.\n   *\n   * @param {object} nextProps\n   * @optional\n   */\n  componentWillReceiveProps: 'DEFINE_MANY',\n\n  /**\n   * Invoked while deciding if the component should be updated as a result of\n   * receiving new props, state and/or context.\n   *\n   * Use this as an opportunity to `return false` when you're certain that the\n   * transition to the new props/state/context will not require a component\n   * update.\n   *\n   *   shouldComponentUpdate: function(nextProps, nextState, nextContext) {\n   *     return !equal(nextProps, this.props) ||\n   *       !equal(nextState, this.state) ||\n   *       !equal(nextContext, this.context);\n   *   }\n   *\n   * @param {object} nextProps\n   * @param {?object} nextState\n   * @param {?object} nextContext\n   * @return {boolean} True if the component should update.\n   * @optional\n   */\n  shouldComponentUpdate: 'DEFINE_ONCE',\n\n  /**\n   * Invoked when the component is about to update due to a transition from\n   * `this.props`, `this.state` and `this.context` to `nextProps`, `nextState`\n   * and `nextContext`.\n   *\n   * Use this as an opportunity to perform preparation before an update occurs.\n   *\n   * NOTE: You **cannot** use `this.setState()` in this method.\n   *\n   * @param {object} nextProps\n   * @param {?object} nextState\n   * @param {?object} nextContext\n   * @param {ReactReconcileTransaction} transaction\n   * @optional\n   */\n  componentWillUpdate: 'DEFINE_MANY',\n\n  /**\n   * Invoked when the component's DOM representation has been updated.\n   *\n   * Use this as an opportunity to operate on the DOM when the component has\n   * been updated.\n   *\n   * @param {object} prevProps\n   * @param {?object} prevState\n   * @param {?object} prevContext\n   * @param {DOMElement} rootNode DOM element representing the component.\n   * @optional\n   */\n  componentDidUpdate: 'DEFINE_MANY',\n\n  /**\n   * Invoked when the component is about to be removed from its parent and have\n   * its DOM representation destroyed.\n   *\n   * Use this as an opportunity to deallocate any external resources.\n   *\n   * NOTE: There is no `componentDidUnmount` since your component will have been\n   * destroyed by that point.\n   *\n   * @optional\n   */\n  componentWillUnmount: 'DEFINE_MANY',\n\n  // ==== Advanced methods ====\n\n  /**\n   * Updates the component's currently mounted DOM representation.\n   *\n   * By default, this implements React's rendering and reconciliation algorithm.\n   * Sophisticated clients may wish to override this.\n   *\n   * @param {ReactReconcileTransaction} transaction\n   * @internal\n   * @overridable\n   */\n  updateComponent: 'OVERRIDE_BASE'\n\n};\n\n/**\n * Mapping from class specification keys to special processing functions.\n *\n * Although these are declared like instance properties in the specification\n * when defining classes using `React.createClass`, they are actually static\n * and are accessible on the constructor instead of the prototype. Despite\n * being static, they must be defined outside of the \"statics\" key under\n * which all other static methods are defined.\n */\nvar RESERVED_SPEC_KEYS = {\n  displayName: function (Constructor, displayName) {\n    Constructor.displayName = displayName;\n  },\n  mixins: function (Constructor, mixins) {\n    if (mixins) {\n      for (var i = 0; i < mixins.length; i++) {\n        mixSpecIntoComponent(Constructor, mixins[i]);\n      }\n    }\n  },\n  childContextTypes: function (Constructor, childContextTypes) {\n    if (true) {\n      validateTypeDef(Constructor, childContextTypes, 'childContext');\n    }\n    Constructor.childContextTypes = _assign({}, Constructor.childContextTypes, childContextTypes);\n  },\n  contextTypes: function (Constructor, contextTypes) {\n    if (true) {\n      validateTypeDef(Constructor, contextTypes, 'context');\n    }\n    Constructor.contextTypes = _assign({}, Constructor.contextTypes, contextTypes);\n  },\n  /**\n   * Special case getDefaultProps which should move into statics but requires\n   * automatic merging.\n   */\n  getDefaultProps: function (Constructor, getDefaultProps) {\n    if (Constructor.getDefaultProps) {\n      Constructor.getDefaultProps = createMergedResultFunction(Constructor.getDefaultProps, getDefaultProps);\n    } else {\n      Constructor.getDefaultProps = getDefaultProps;\n    }\n  },\n  propTypes: function (Constructor, propTypes) {\n    if (true) {\n      validateTypeDef(Constructor, propTypes, 'prop');\n    }\n    Constructor.propTypes = _assign({}, Constructor.propTypes, propTypes);\n  },\n  statics: function (Constructor, statics) {\n    mixStaticSpecIntoComponent(Constructor, statics);\n  },\n  autobind: function () {} };\n\nfunction validateTypeDef(Constructor, typeDef, location) {\n  for (var propName in typeDef) {\n    if (typeDef.hasOwnProperty(propName)) {\n      // use a warning instead of an invariant so components\n      // don't show up in prod but only in __DEV__\n       true ? warning(typeof typeDef[propName] === 'function', '%s: %s type `%s` is invalid; it must be a function, usually from ' + 'React.PropTypes.', Constructor.displayName || 'ReactClass', ReactPropTypeLocationNames[location], propName) : void 0;\n    }\n  }\n}\n\nfunction validateMethodOverride(isAlreadyDefined, name) {\n  var specPolicy = ReactClassInterface.hasOwnProperty(name) ? ReactClassInterface[name] : null;\n\n  // Disallow overriding of base class methods unless explicitly allowed.\n  if (ReactClassMixin.hasOwnProperty(name)) {\n    !(specPolicy === 'OVERRIDE_BASE') ?  true ? invariant(false, 'ReactClassInterface: You are attempting to override `%s` from your class specification. Ensure that your method names do not overlap with React methods.', name) : _prodInvariant('73', name) : void 0;\n  }\n\n  // Disallow defining methods more than once unless explicitly allowed.\n  if (isAlreadyDefined) {\n    !(specPolicy === 'DEFINE_MANY' || specPolicy === 'DEFINE_MANY_MERGED') ?  true ? invariant(false, 'ReactClassInterface: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.', name) : _prodInvariant('74', name) : void 0;\n  }\n}\n\n/**\n * Mixin helper which handles policy validation and reserved\n * specification keys when building React classes.\n */\nfunction mixSpecIntoComponent(Constructor, spec) {\n  if (!spec) {\n    if (true) {\n      var typeofSpec = typeof spec;\n      var isMixinValid = typeofSpec === 'object' && spec !== null;\n\n       true ? warning(isMixinValid, '%s: You\\'re attempting to include a mixin that is either null ' + 'or not an object. Check the mixins included by the component, ' + 'as well as any mixins they include themselves. ' + 'Expected object but got %s.', Constructor.displayName || 'ReactClass', spec === null ? null : typeofSpec) : void 0;\n    }\n\n    return;\n  }\n\n  !(typeof spec !== 'function') ?  true ? invariant(false, 'ReactClass: You\\'re attempting to use a component class or function as a mixin. Instead, just use a regular object.') : _prodInvariant('75') : void 0;\n  !!ReactElement.isValidElement(spec) ?  true ? invariant(false, 'ReactClass: You\\'re attempting to use a component as a mixin. Instead, just use a regular object.') : _prodInvariant('76') : void 0;\n\n  var proto = Constructor.prototype;\n  var autoBindPairs = proto.__reactAutoBindPairs;\n\n  // By handling mixins before any other properties, we ensure the same\n  // chaining order is applied to methods with DEFINE_MANY policy, whether\n  // mixins are listed before or after these methods in the spec.\n  if (spec.hasOwnProperty(MIXINS_KEY)) {\n    RESERVED_SPEC_KEYS.mixins(Constructor, spec.mixins);\n  }\n\n  for (var name in spec) {\n    if (!spec.hasOwnProperty(name)) {\n      continue;\n    }\n\n    if (name === MIXINS_KEY) {\n      // We have already handled mixins in a special case above.\n      continue;\n    }\n\n    var property = spec[name];\n    var isAlreadyDefined = proto.hasOwnProperty(name);\n    validateMethodOverride(isAlreadyDefined, name);\n\n    if (RESERVED_SPEC_KEYS.hasOwnProperty(name)) {\n      RESERVED_SPEC_KEYS[name](Constructor, property);\n    } else {\n      // Setup methods on prototype:\n      // The following member methods should not be automatically bound:\n      // 1. Expected ReactClass methods (in the \"interface\").\n      // 2. Overridden methods (that were mixed in).\n      var isReactClassMethod = ReactClassInterface.hasOwnProperty(name);\n      var isFunction = typeof property === 'function';\n      var shouldAutoBind = isFunction && !isReactClassMethod && !isAlreadyDefined && spec.autobind !== false;\n\n      if (shouldAutoBind) {\n        autoBindPairs.push(name, property);\n        proto[name] = property;\n      } else {\n        if (isAlreadyDefined) {\n          var specPolicy = ReactClassInterface[name];\n\n          // These cases should already be caught by validateMethodOverride.\n          !(isReactClassMethod && (specPolicy === 'DEFINE_MANY_MERGED' || specPolicy === 'DEFINE_MANY')) ?  true ? invariant(false, 'ReactClass: Unexpected spec policy %s for key %s when mixing in component specs.', specPolicy, name) : _prodInvariant('77', specPolicy, name) : void 0;\n\n          // For methods which are defined more than once, call the existing\n          // methods before calling the new property, merging if appropriate.\n          if (specPolicy === 'DEFINE_MANY_MERGED') {\n            proto[name] = createMergedResultFunction(proto[name], property);\n          } else if (specPolicy === 'DEFINE_MANY') {\n            proto[name] = createChainedFunction(proto[name], property);\n          }\n        } else {\n          proto[name] = property;\n          if (true) {\n            // Add verbose displayName to the function, which helps when looking\n            // at profiling tools.\n            if (typeof property === 'function' && spec.displayName) {\n              proto[name].displayName = spec.displayName + '_' + name;\n            }\n          }\n        }\n      }\n    }\n  }\n}\n\nfunction mixStaticSpecIntoComponent(Constructor, statics) {\n  if (!statics) {\n    return;\n  }\n  for (var name in statics) {\n    var property = statics[name];\n    if (!statics.hasOwnProperty(name)) {\n      continue;\n    }\n\n    var isReserved = name in RESERVED_SPEC_KEYS;\n    !!isReserved ?  true ? invariant(false, 'ReactClass: You are attempting to define a reserved property, `%s`, that shouldn\\'t be on the \"statics\" key. Define it as an instance property instead; it will still be accessible on the constructor.', name) : _prodInvariant('78', name) : void 0;\n\n    var isInherited = name in Constructor;\n    !!isInherited ?  true ? invariant(false, 'ReactClass: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.', name) : _prodInvariant('79', name) : void 0;\n    Constructor[name] = property;\n  }\n}\n\n/**\n * Merge two objects, but throw if both contain the same key.\n *\n * @param {object} one The first object, which is mutated.\n * @param {object} two The second object\n * @return {object} one after it has been mutated to contain everything in two.\n */\nfunction mergeIntoWithNoDuplicateKeys(one, two) {\n  !(one && two && typeof one === 'object' && typeof two === 'object') ?  true ? invariant(false, 'mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.') : _prodInvariant('80') : void 0;\n\n  for (var key in two) {\n    if (two.hasOwnProperty(key)) {\n      !(one[key] === undefined) ?  true ? invariant(false, 'mergeIntoWithNoDuplicateKeys(): Tried to merge two objects with the same key: `%s`. This conflict may be due to a mixin; in particular, this may be caused by two getInitialState() or getDefaultProps() methods returning objects with clashing keys.', key) : _prodInvariant('81', key) : void 0;\n      one[key] = two[key];\n    }\n  }\n  return one;\n}\n\n/**\n * Creates a function that invokes two functions and merges their return values.\n *\n * @param {function} one Function to invoke first.\n * @param {function} two Function to invoke second.\n * @return {function} Function that invokes the two argument functions.\n * @private\n */\nfunction createMergedResultFunction(one, two) {\n  return function mergedResult() {\n    var a = one.apply(this, arguments);\n    var b = two.apply(this, arguments);\n    if (a == null) {\n      return b;\n    } else if (b == null) {\n      return a;\n    }\n    var c = {};\n    mergeIntoWithNoDuplicateKeys(c, a);\n    mergeIntoWithNoDuplicateKeys(c, b);\n    return c;\n  };\n}\n\n/**\n * Creates a function that invokes two functions and ignores their return vales.\n *\n * @param {function} one Function to invoke first.\n * @param {function} two Function to invoke second.\n * @return {function} Function that invokes the two argument functions.\n * @private\n */\nfunction createChainedFunction(one, two) {\n  return function chainedFunction() {\n    one.apply(this, arguments);\n    two.apply(this, arguments);\n  };\n}\n\n/**\n * Binds a method to the component.\n *\n * @param {object} component Component whose method is going to be bound.\n * @param {function} method Method to be bound.\n * @return {function} The bound method.\n */\nfunction bindAutoBindMethod(component, method) {\n  var boundMethod = method.bind(component);\n  if (true) {\n    boundMethod.__reactBoundContext = component;\n    boundMethod.__reactBoundMethod = method;\n    boundMethod.__reactBoundArguments = null;\n    var componentName = component.constructor.displayName;\n    var _bind = boundMethod.bind;\n    boundMethod.bind = function (newThis) {\n      for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        args[_key - 1] = arguments[_key];\n      }\n\n      // User is trying to bind() an autobound method; we effectively will\n      // ignore the value of \"this\" that the user is trying to use, so\n      // let's warn.\n      if (newThis !== component && newThis !== null) {\n         true ? warning(false, 'bind(): React component methods may only be bound to the ' + 'component instance. See %s', componentName) : void 0;\n      } else if (!args.length) {\n         true ? warning(false, 'bind(): You are binding a component method to the component. ' + 'React does this for you automatically in a high-performance ' + 'way, so you can safely remove this call. See %s', componentName) : void 0;\n        return boundMethod;\n      }\n      var reboundMethod = _bind.apply(boundMethod, arguments);\n      reboundMethod.__reactBoundContext = component;\n      reboundMethod.__reactBoundMethod = method;\n      reboundMethod.__reactBoundArguments = args;\n      return reboundMethod;\n    };\n  }\n  return boundMethod;\n}\n\n/**\n * Binds all auto-bound methods in a component.\n *\n * @param {object} component Component whose method is going to be bound.\n */\nfunction bindAutoBindMethods(component) {\n  var pairs = component.__reactAutoBindPairs;\n  for (var i = 0; i < pairs.length; i += 2) {\n    var autoBindKey = pairs[i];\n    var method = pairs[i + 1];\n    component[autoBindKey] = bindAutoBindMethod(component, method);\n  }\n}\n\n/**\n * Add more to the ReactClass base class. These are all legacy features and\n * therefore not already part of the modern ReactComponent.\n */\nvar ReactClassMixin = {\n\n  /**\n   * TODO: This will be deprecated because state should always keep a consistent\n   * type signature and the only use case for this, is to avoid that.\n   */\n  replaceState: function (newState, callback) {\n    this.updater.enqueueReplaceState(this, newState);\n    if (callback) {\n      this.updater.enqueueCallback(this, callback, 'replaceState');\n    }\n  },\n\n  /**\n   * Checks whether or not this composite component is mounted.\n   * @return {boolean} True if mounted, false otherwise.\n   * @protected\n   * @final\n   */\n  isMounted: function () {\n    return this.updater.isMounted(this);\n  }\n};\n\nvar ReactClassComponent = function () {};\n_assign(ReactClassComponent.prototype, ReactComponent.prototype, ReactClassMixin);\n\n/**\n * Module for creating composite components.\n *\n * @class ReactClass\n */\nvar ReactClass = {\n\n  /**\n   * Creates a composite component class given a class specification.\n   * See https://facebook.github.io/react/docs/top-level-api.html#react.createclass\n   *\n   * @param {object} spec Class specification (which must define `render`).\n   * @return {function} Component constructor function.\n   * @public\n   */\n  createClass: function (spec) {\n    // To keep our warnings more understandable, we'll use a little hack here to\n    // ensure that Constructor.name !== 'Constructor'. This makes sure we don't\n    // unnecessarily identify a class without displayName as 'Constructor'.\n    var Constructor = identity(function (props, context, updater) {\n      // This constructor gets overridden by mocks. The argument is used\n      // by mocks to assert on what gets mounted.\n\n      if (true) {\n         true ? warning(this instanceof Constructor, 'Something is calling a React component directly. Use a factory or ' + 'JSX instead. See: https://fb.me/react-legacyfactory') : void 0;\n      }\n\n      // Wire up auto-binding\n      if (this.__reactAutoBindPairs.length) {\n        bindAutoBindMethods(this);\n      }\n\n      this.props = props;\n      this.context = context;\n      this.refs = emptyObject;\n      this.updater = updater || ReactNoopUpdateQueue;\n\n      this.state = null;\n\n      // ReactClasses doesn't have constructors. Instead, they use the\n      // getInitialState and componentWillMount methods for initialization.\n\n      var initialState = this.getInitialState ? this.getInitialState() : null;\n      if (true) {\n        // We allow auto-mocks to proceed as if they're returning null.\n        if (initialState === undefined && this.getInitialState._isMockFunction) {\n          // This is probably bad practice. Consider warning here and\n          // deprecating this convenience.\n          initialState = null;\n        }\n      }\n      !(typeof initialState === 'object' && !Array.isArray(initialState)) ?  true ? invariant(false, '%s.getInitialState(): must return an object or null', Constructor.displayName || 'ReactCompositeComponent') : _prodInvariant('82', Constructor.displayName || 'ReactCompositeComponent') : void 0;\n\n      this.state = initialState;\n    });\n    Constructor.prototype = new ReactClassComponent();\n    Constructor.prototype.constructor = Constructor;\n    Constructor.prototype.__reactAutoBindPairs = [];\n\n    injectedMixins.forEach(mixSpecIntoComponent.bind(null, Constructor));\n\n    mixSpecIntoComponent(Constructor, spec);\n\n    // Initialize the defaultProps property after all mixins have been merged.\n    if (Constructor.getDefaultProps) {\n      Constructor.defaultProps = Constructor.getDefaultProps();\n    }\n\n    if (true) {\n      // This is a tag to indicate that the use of these method names is ok,\n      // since it's used with createClass. If it's not, then it's likely a\n      // mistake so we'll warn you to use the static property, property\n      // initializer or constructor respectively.\n      if (Constructor.getDefaultProps) {\n        Constructor.getDefaultProps.isReactClassApproved = {};\n      }\n      if (Constructor.prototype.getInitialState) {\n        Constructor.prototype.getInitialState.isReactClassApproved = {};\n      }\n    }\n\n    !Constructor.prototype.render ?  true ? invariant(false, 'createClass(...): Class specification must implement a `render` method.') : _prodInvariant('83') : void 0;\n\n    if (true) {\n       true ? warning(!Constructor.prototype.componentShouldUpdate, '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', spec.displayName || 'A component') : void 0;\n       true ? warning(!Constructor.prototype.componentWillRecieveProps, '%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', spec.displayName || 'A component') : void 0;\n    }\n\n    // Reduce time spent doing lookups by setting these on the prototype.\n    for (var methodName in ReactClassInterface) {\n      if (!Constructor.prototype[methodName]) {\n        Constructor.prototype[methodName] = null;\n      }\n    }\n\n    return Constructor;\n  },\n\n  injection: {\n    injectMixin: function (mixin) {\n      injectedMixins.push(mixin);\n    }\n  }\n\n};\n\nmodule.exports = ReactClass;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RDbGFzcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpLFxuICAgIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdENvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RDb21wb25lbnQnKTtcbnZhciBSZWFjdEVsZW1lbnQgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudCcpO1xudmFyIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzID0gcmVxdWlyZSgnLi9SZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcycpO1xudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0gcmVxdWlyZSgnLi9SZWFjdE5vb3BVcGRhdGVRdWV1ZScpO1xuXG52YXIgZW1wdHlPYmplY3QgPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eU9iamVjdCcpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBNSVhJTlNfS0VZID0gJ21peGlucyc7XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBhbGxvdyB0aGUgY3JlYXRpb24gb2YgYW5vbnltb3VzIGZ1bmN0aW9ucyB3aGljaCBkbyBub3Rcbi8vIGhhdmUgLm5hbWUgc2V0IHRvIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBiZWluZyBhc3NpZ25lZCB0by5cbmZ1bmN0aW9uIGlkZW50aXR5KGZuKSB7XG4gIHJldHVybiBmbjtcbn1cblxuLyoqXG4gKiBQb2xpY2llcyB0aGF0IGRlc2NyaWJlIG1ldGhvZHMgaW4gYFJlYWN0Q2xhc3NJbnRlcmZhY2VgLlxuICovXG5cblxudmFyIGluamVjdGVkTWl4aW5zID0gW107XG5cbi8qKlxuICogQ29tcG9zaXRlIGNvbXBvbmVudHMgYXJlIGhpZ2hlci1sZXZlbCBjb21wb25lbnRzIHRoYXQgY29tcG9zZSBvdGhlciBjb21wb3NpdGVcbiAqIG9yIGhvc3QgY29tcG9uZW50cy5cbiAqXG4gKiBUbyBjcmVhdGUgYSBuZXcgdHlwZSBvZiBgUmVhY3RDbGFzc2AsIHBhc3MgYSBzcGVjaWZpY2F0aW9uIG9mXG4gKiB5b3VyIG5ldyBjbGFzcyB0byBgUmVhY3QuY3JlYXRlQ2xhc3NgLiBUaGUgb25seSByZXF1aXJlbWVudCBvZiB5b3VyIGNsYXNzXG4gKiBzcGVjaWZpY2F0aW9uIGlzIHRoYXQgeW91IGltcGxlbWVudCBhIGByZW5kZXJgIG1ldGhvZC5cbiAqXG4gKiAgIHZhciBNeUNvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAqICAgICByZW5kZXI6IGZ1bmN0aW9uKCkge1xuICogICAgICAgcmV0dXJuIDxkaXY+SGVsbG8gV29ybGQ8L2Rpdj47XG4gKiAgICAgfVxuICogICB9KTtcbiAqXG4gKiBUaGUgY2xhc3Mgc3BlY2lmaWNhdGlvbiBzdXBwb3J0cyBhIHNwZWNpZmljIHByb3RvY29sIG9mIG1ldGhvZHMgdGhhdCBoYXZlXG4gKiBzcGVjaWFsIG1lYW5pbmcgKGUuZy4gYHJlbmRlcmApLiBTZWUgYFJlYWN0Q2xhc3NJbnRlcmZhY2VgIGZvclxuICogbW9yZSB0aGUgY29tcHJlaGVuc2l2ZSBwcm90b2NvbC4gQW55IG90aGVyIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgaW4gdGhlXG4gKiBjbGFzcyBzcGVjaWZpY2F0aW9uIHdpbGwgYmUgYXZhaWxhYmxlIG9uIHRoZSBwcm90b3R5cGUuXG4gKlxuICogQGludGVyZmFjZSBSZWFjdENsYXNzSW50ZXJmYWNlXG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIFJlYWN0Q2xhc3NJbnRlcmZhY2UgPSB7XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIE1peGluIG9iamVjdHMgdG8gaW5jbHVkZSB3aGVuIGRlZmluaW5nIHlvdXIgY29tcG9uZW50LlxuICAgKlxuICAgKiBAdHlwZSB7YXJyYXl9XG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgbWl4aW5zOiAnREVGSU5FX01BTlknLFxuXG4gIC8qKlxuICAgKiBBbiBvYmplY3QgY29udGFpbmluZyBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIGRlZmluZWQgb25cbiAgICogdGhlIGNvbXBvbmVudCdzIGNvbnN0cnVjdG9yIGluc3RlYWQgb2YgaXRzIHByb3RvdHlwZSAoc3RhdGljIG1ldGhvZHMpLlxuICAgKlxuICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgKiBAb3B0aW9uYWxcbiAgICovXG4gIHN0YXRpY3M6ICdERUZJTkVfTUFOWScsXG5cbiAgLyoqXG4gICAqIERlZmluaXRpb24gb2YgcHJvcCB0eXBlcyBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAqXG4gICAqIEB0eXBlIHtvYmplY3R9XG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgcHJvcFR5cGVzOiAnREVGSU5FX01BTlknLFxuXG4gIC8qKlxuICAgKiBEZWZpbml0aW9uIG9mIGNvbnRleHQgdHlwZXMgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKlxuICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgKiBAb3B0aW9uYWxcbiAgICovXG4gIGNvbnRleHRUeXBlczogJ0RFRklORV9NQU5ZJyxcblxuICAvKipcbiAgICogRGVmaW5pdGlvbiBvZiBjb250ZXh0IHR5cGVzIHRoaXMgY29tcG9uZW50IHNldHMgZm9yIGl0cyBjaGlsZHJlbi5cbiAgICpcbiAgICogQHR5cGUge29iamVjdH1cbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBjaGlsZENvbnRleHRUeXBlczogJ0RFRklORV9NQU5ZJyxcblxuICAvLyA9PT09IERlZmluaXRpb24gbWV0aG9kcyA9PT09XG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIG1vdW50ZWQuIFZhbHVlcyBpbiB0aGUgbWFwcGluZyB3aWxsIGJlIHNldCBvblxuICAgKiBgdGhpcy5wcm9wc2AgaWYgdGhhdCBwcm9wIGlzIG5vdCBzcGVjaWZpZWQgKGkuZS4gdXNpbmcgYW4gYGluYCBjaGVjaykuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYmVmb3JlIGBnZXRJbml0aWFsU3RhdGVgIGFuZCB0aGVyZWZvcmUgY2Fubm90IHJlbHlcbiAgICogb24gYHRoaXMuc3RhdGVgIG9yIHVzZSBgdGhpcy5zZXRTdGF0ZWAuXG4gICAqXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBnZXREZWZhdWx0UHJvcHM6ICdERUZJTkVfTUFOWV9NRVJHRUQnLFxuXG4gIC8qKlxuICAgKiBJbnZva2VkIG9uY2UgYmVmb3JlIHRoZSBjb21wb25lbnQgaXMgbW91bnRlZC4gVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHVzZWRcbiAgICogYXMgdGhlIGluaXRpYWwgdmFsdWUgb2YgYHRoaXMuc3RhdGVgLlxuICAgKlxuICAgKiAgIGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24oKSB7XG4gICAqICAgICByZXR1cm4ge1xuICAgKiAgICAgICBpc09uOiBmYWxzZSxcbiAgICogICAgICAgZm9vQmF6OiBuZXcgQmF6Rm9vKClcbiAgICogICAgIH1cbiAgICogICB9XG4gICAqXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBnZXRJbml0aWFsU3RhdGU6ICdERUZJTkVfTUFOWV9NRVJHRUQnLFxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgZ2V0Q2hpbGRDb250ZXh0OiAnREVGSU5FX01BTllfTUVSR0VEJyxcblxuICAvKipcbiAgICogVXNlcyBwcm9wcyBmcm9tIGB0aGlzLnByb3BzYCBhbmQgc3RhdGUgZnJvbSBgdGhpcy5zdGF0ZWAgdG8gcmVuZGVyIHRoZVxuICAgKiBzdHJ1Y3R1cmUgb2YgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogTm8gZ3VhcmFudGVlcyBhcmUgbWFkZSBhYm91dCB3aGVuIG9yIGhvdyBvZnRlbiB0aGlzIG1ldGhvZCBpcyBpbnZva2VkLCBzb1xuICAgKiBpdCBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cy5cbiAgICpcbiAgICogICByZW5kZXI6IGZ1bmN0aW9uKCkge1xuICAgKiAgICAgdmFyIG5hbWUgPSB0aGlzLnByb3BzLm5hbWU7XG4gICAqICAgICByZXR1cm4gPGRpdj5IZWxsbywge25hbWV9ITwvZGl2PjtcbiAgICogICB9XG4gICAqXG4gICAqIEByZXR1cm4ge1JlYWN0Q29tcG9uZW50fVxuICAgKiBAbm9zaWRlZWZmZWN0c1xuICAgKiBAcmVxdWlyZWRcbiAgICovXG4gIHJlbmRlcjogJ0RFRklORV9PTkNFJyxcblxuICAvLyA9PT09IERlbGVnYXRlIG1ldGhvZHMgPT09PVxuXG4gIC8qKlxuICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBpbml0aWFsbHkgY3JlYXRlZCBhbmQgYWJvdXQgdG8gYmUgbW91bnRlZC5cbiAgICogVGhpcyBtYXkgaGF2ZSBzaWRlIGVmZmVjdHMsIGJ1dCBhbnkgZXh0ZXJuYWwgc3Vic2NyaXB0aW9ucyBvciBkYXRhIGNyZWF0ZWRcbiAgICogYnkgdGhpcyBtZXRob2QgbXVzdCBiZSBjbGVhbmVkIHVwIGluIGBjb21wb25lbnRXaWxsVW5tb3VudGAuXG4gICAqXG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgY29tcG9uZW50V2lsbE1vdW50OiAnREVGSU5FX01BTlknLFxuXG4gIC8qKlxuICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBoYXMgYmVlbiBtb3VudGVkIGFuZCBoYXMgYSBET00gcmVwcmVzZW50YXRpb24uXG4gICAqIEhvd2V2ZXIsIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBET00gbm9kZSBpcyBpbiB0aGUgZG9jdW1lbnQuXG4gICAqXG4gICAqIFVzZSB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIG9wZXJhdGUgb24gdGhlIERPTSB3aGVuIHRoZSBjb21wb25lbnQgaGFzXG4gICAqIGJlZW4gbW91bnRlZCAoaW5pdGlhbGl6ZWQgYW5kIHJlbmRlcmVkKSBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gcm9vdE5vZGUgRE9NIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBjb21wb25lbnQuXG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgY29tcG9uZW50RGlkTW91bnQ6ICdERUZJTkVfTUFOWScsXG5cbiAgLyoqXG4gICAqIEludm9rZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgcmVjZWl2ZXMgbmV3IHByb3BzLlxuICAgKlxuICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byByZWFjdCB0byBhIHByb3AgdHJhbnNpdGlvbiBieSB1cGRhdGluZyB0aGVcbiAgICogc3RhdGUgdXNpbmcgYHRoaXMuc2V0U3RhdGVgLiBDdXJyZW50IHByb3BzIGFyZSBhY2Nlc3NlZCB2aWEgYHRoaXMucHJvcHNgLlxuICAgKlxuICAgKiAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6IGZ1bmN0aW9uKG5leHRQcm9wcywgbmV4dENvbnRleHQpIHtcbiAgICogICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgKiAgICAgICBsaWtlc0luY3JlYXNpbmc6IG5leHRQcm9wcy5saWtlQ291bnQgPiB0aGlzLnByb3BzLmxpa2VDb3VudFxuICAgKiAgICAgfSk7XG4gICAqICAgfVxuICAgKlxuICAgKiBOT1RFOiBUaGVyZSBpcyBubyBlcXVpdmFsZW50IGBjb21wb25lbnRXaWxsUmVjZWl2ZVN0YXRlYC4gQW4gaW5jb21pbmcgcHJvcFxuICAgKiB0cmFuc2l0aW9uIG1heSBjYXVzZSBhIHN0YXRlIGNoYW5nZSwgYnV0IHRoZSBvcHBvc2l0ZSBpcyBub3QgdHJ1ZS4gSWYgeW91XG4gICAqIG5lZWQgaXQsIHlvdSBhcmUgcHJvYmFibHkgbG9va2luZyBmb3IgYGNvbXBvbmVudFdpbGxVcGRhdGVgLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gbmV4dFByb3BzXG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczogJ0RFRklORV9NQU5ZJyxcblxuICAvKipcbiAgICogSW52b2tlZCB3aGlsZSBkZWNpZGluZyBpZiB0aGUgY29tcG9uZW50IHNob3VsZCBiZSB1cGRhdGVkIGFzIGEgcmVzdWx0IG9mXG4gICAqIHJlY2VpdmluZyBuZXcgcHJvcHMsIHN0YXRlIGFuZC9vciBjb250ZXh0LlxuICAgKlxuICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBgcmV0dXJuIGZhbHNlYCB3aGVuIHlvdSdyZSBjZXJ0YWluIHRoYXQgdGhlXG4gICAqIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBwcm9wcy9zdGF0ZS9jb250ZXh0IHdpbGwgbm90IHJlcXVpcmUgYSBjb21wb25lbnRcbiAgICogdXBkYXRlLlxuICAgKlxuICAgKiAgIHNob3VsZENvbXBvbmVudFVwZGF0ZTogZnVuY3Rpb24obmV4dFByb3BzLCBuZXh0U3RhdGUsIG5leHRDb250ZXh0KSB7XG4gICAqICAgICByZXR1cm4gIWVxdWFsKG5leHRQcm9wcywgdGhpcy5wcm9wcykgfHxcbiAgICogICAgICAgIWVxdWFsKG5leHRTdGF0ZSwgdGhpcy5zdGF0ZSkgfHxcbiAgICogICAgICAgIWVxdWFsKG5leHRDb250ZXh0LCB0aGlzLmNvbnRleHQpO1xuICAgKiAgIH1cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG5leHRQcm9wc1xuICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHRTdGF0ZVxuICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHRDb250ZXh0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGNvbXBvbmVudCBzaG91bGQgdXBkYXRlLlxuICAgKiBAb3B0aW9uYWxcbiAgICovXG4gIHNob3VsZENvbXBvbmVudFVwZGF0ZTogJ0RFRklORV9PTkNFJyxcblxuICAvKipcbiAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgYWJvdXQgdG8gdXBkYXRlIGR1ZSB0byBhIHRyYW5zaXRpb24gZnJvbVxuICAgKiBgdGhpcy5wcm9wc2AsIGB0aGlzLnN0YXRlYCBhbmQgYHRoaXMuY29udGV4dGAgdG8gYG5leHRQcm9wc2AsIGBuZXh0U3RhdGVgXG4gICAqIGFuZCBgbmV4dENvbnRleHRgLlxuICAgKlxuICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBwZXJmb3JtIHByZXBhcmF0aW9uIGJlZm9yZSBhbiB1cGRhdGUgb2NjdXJzLlxuICAgKlxuICAgKiBOT1RFOiBZb3UgKipjYW5ub3QqKiB1c2UgYHRoaXMuc2V0U3RhdGUoKWAgaW4gdGhpcyBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBuZXh0UHJvcHNcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0U3RhdGVcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0Q29udGV4dFxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgY29tcG9uZW50V2lsbFVwZGF0ZTogJ0RFRklORV9NQU5ZJyxcblxuICAvKipcbiAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQncyBET00gcmVwcmVzZW50YXRpb24gaGFzIGJlZW4gdXBkYXRlZC5cbiAgICpcbiAgICogVXNlIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gb3BlcmF0ZSBvbiB0aGUgRE9NIHdoZW4gdGhlIGNvbXBvbmVudCBoYXNcbiAgICogYmVlbiB1cGRhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gcHJldlByb3BzXG4gICAqIEBwYXJhbSB7P29iamVjdH0gcHJldlN0YXRlXG4gICAqIEBwYXJhbSB7P29iamVjdH0gcHJldkNvbnRleHRcbiAgICogQHBhcmFtIHtET01FbGVtZW50fSByb290Tm9kZSBET00gZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGNvbXBvbmVudC5cbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBjb21wb25lbnREaWRVcGRhdGU6ICdERUZJTkVfTUFOWScsXG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGFib3V0IHRvIGJlIHJlbW92ZWQgZnJvbSBpdHMgcGFyZW50IGFuZCBoYXZlXG4gICAqIGl0cyBET00gcmVwcmVzZW50YXRpb24gZGVzdHJveWVkLlxuICAgKlxuICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBkZWFsbG9jYXRlIGFueSBleHRlcm5hbCByZXNvdXJjZXMuXG4gICAqXG4gICAqIE5PVEU6IFRoZXJlIGlzIG5vIGBjb21wb25lbnREaWRVbm1vdW50YCBzaW5jZSB5b3VyIGNvbXBvbmVudCB3aWxsIGhhdmUgYmVlblxuICAgKiBkZXN0cm95ZWQgYnkgdGhhdCBwb2ludC5cbiAgICpcbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBjb21wb25lbnRXaWxsVW5tb3VudDogJ0RFRklORV9NQU5ZJyxcblxuICAvLyA9PT09IEFkdmFuY2VkIG1ldGhvZHMgPT09PVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBjb21wb25lbnQncyBjdXJyZW50bHkgbW91bnRlZCBET00gcmVwcmVzZW50YXRpb24uXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoaXMgaW1wbGVtZW50cyBSZWFjdCdzIHJlbmRlcmluZyBhbmQgcmVjb25jaWxpYXRpb24gYWxnb3JpdGhtLlxuICAgKiBTb3BoaXN0aWNhdGVkIGNsaWVudHMgbWF5IHdpc2ggdG8gb3ZlcnJpZGUgdGhpcy5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAaW50ZXJuYWxcbiAgICogQG92ZXJyaWRhYmxlXG4gICAqL1xuICB1cGRhdGVDb21wb25lbnQ6ICdPVkVSUklERV9CQVNFJ1xuXG59O1xuXG4vKipcbiAqIE1hcHBpbmcgZnJvbSBjbGFzcyBzcGVjaWZpY2F0aW9uIGtleXMgdG8gc3BlY2lhbCBwcm9jZXNzaW5nIGZ1bmN0aW9ucy5cbiAqXG4gKiBBbHRob3VnaCB0aGVzZSBhcmUgZGVjbGFyZWQgbGlrZSBpbnN0YW5jZSBwcm9wZXJ0aWVzIGluIHRoZSBzcGVjaWZpY2F0aW9uXG4gKiB3aGVuIGRlZmluaW5nIGNsYXNzZXMgdXNpbmcgYFJlYWN0LmNyZWF0ZUNsYXNzYCwgdGhleSBhcmUgYWN0dWFsbHkgc3RhdGljXG4gKiBhbmQgYXJlIGFjY2Vzc2libGUgb24gdGhlIGNvbnN0cnVjdG9yIGluc3RlYWQgb2YgdGhlIHByb3RvdHlwZS4gRGVzcGl0ZVxuICogYmVpbmcgc3RhdGljLCB0aGV5IG11c3QgYmUgZGVmaW5lZCBvdXRzaWRlIG9mIHRoZSBcInN0YXRpY3NcIiBrZXkgdW5kZXJcbiAqIHdoaWNoIGFsbCBvdGhlciBzdGF0aWMgbWV0aG9kcyBhcmUgZGVmaW5lZC5cbiAqL1xudmFyIFJFU0VSVkVEX1NQRUNfS0VZUyA9IHtcbiAgZGlzcGxheU5hbWU6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgZGlzcGxheU5hbWUpIHtcbiAgICBDb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuICB9LFxuICBtaXhpbnM6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgbWl4aW5zKSB7XG4gICAgaWYgKG1peGlucykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtaXhpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbWl4U3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIG1peGluc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBjaGlsZENvbnRleHRUeXBlczogZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBjaGlsZENvbnRleHRUeXBlcykge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YWxpZGF0ZVR5cGVEZWYoQ29uc3RydWN0b3IsIGNoaWxkQ29udGV4dFR5cGVzLCAnY2hpbGRDb250ZXh0Jyk7XG4gICAgfVxuICAgIENvbnN0cnVjdG9yLmNoaWxkQ29udGV4dFR5cGVzID0gX2Fzc2lnbih7fSwgQ29uc3RydWN0b3IuY2hpbGRDb250ZXh0VHlwZXMsIGNoaWxkQ29udGV4dFR5cGVzKTtcbiAgfSxcbiAgY29udGV4dFR5cGVzOiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIGNvbnRleHRUeXBlcykge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YWxpZGF0ZVR5cGVEZWYoQ29uc3RydWN0b3IsIGNvbnRleHRUeXBlcywgJ2NvbnRleHQnKTtcbiAgICB9XG4gICAgQ29uc3RydWN0b3IuY29udGV4dFR5cGVzID0gX2Fzc2lnbih7fSwgQ29uc3RydWN0b3IuY29udGV4dFR5cGVzLCBjb250ZXh0VHlwZXMpO1xuICB9LFxuICAvKipcbiAgICogU3BlY2lhbCBjYXNlIGdldERlZmF1bHRQcm9wcyB3aGljaCBzaG91bGQgbW92ZSBpbnRvIHN0YXRpY3MgYnV0IHJlcXVpcmVzXG4gICAqIGF1dG9tYXRpYyBtZXJnaW5nLlxuICAgKi9cbiAgZ2V0RGVmYXVsdFByb3BzOiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIGdldERlZmF1bHRQcm9wcykge1xuICAgIGlmIChDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMpIHtcbiAgICAgIENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcyA9IGNyZWF0ZU1lcmdlZFJlc3VsdEZ1bmN0aW9uKENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcywgZ2V0RGVmYXVsdFByb3BzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzID0gZ2V0RGVmYXVsdFByb3BzO1xuICAgIH1cbiAgfSxcbiAgcHJvcFR5cGVzOiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3BUeXBlcykge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YWxpZGF0ZVR5cGVEZWYoQ29uc3RydWN0b3IsIHByb3BUeXBlcywgJ3Byb3AnKTtcbiAgICB9XG4gICAgQ29uc3RydWN0b3IucHJvcFR5cGVzID0gX2Fzc2lnbih7fSwgQ29uc3RydWN0b3IucHJvcFR5cGVzLCBwcm9wVHlwZXMpO1xuICB9LFxuICBzdGF0aWNzOiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHN0YXRpY3MpIHtcbiAgICBtaXhTdGF0aWNTcGVjSW50b0NvbXBvbmVudChDb25zdHJ1Y3Rvciwgc3RhdGljcyk7XG4gIH0sXG4gIGF1dG9iaW5kOiBmdW5jdGlvbiAoKSB7fSB9O1xuXG5mdW5jdGlvbiB2YWxpZGF0ZVR5cGVEZWYoQ29uc3RydWN0b3IsIHR5cGVEZWYsIGxvY2F0aW9uKSB7XG4gIGZvciAodmFyIHByb3BOYW1lIGluIHR5cGVEZWYpIHtcbiAgICBpZiAodHlwZURlZi5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgIC8vIHVzZSBhIHdhcm5pbmcgaW5zdGVhZCBvZiBhbiBpbnZhcmlhbnQgc28gY29tcG9uZW50c1xuICAgICAgLy8gZG9uJ3Qgc2hvdyB1cCBpbiBwcm9kIGJ1dCBvbmx5IGluIF9fREVWX19cbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHR5cGVvZiB0eXBlRGVmW3Byb3BOYW1lXSA9PT0gJ2Z1bmN0aW9uJywgJyVzOiAlcyB0eXBlIGAlc2AgaXMgaW52YWxpZDsgaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gJyArICdSZWFjdC5Qcm9wVHlwZXMuJywgQ29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgJ1JlYWN0Q2xhc3MnLCBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl0sIHByb3BOYW1lKSA6IHZvaWQgMDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVNZXRob2RPdmVycmlkZShpc0FscmVhZHlEZWZpbmVkLCBuYW1lKSB7XG4gIHZhciBzcGVjUG9saWN5ID0gUmVhY3RDbGFzc0ludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IFJlYWN0Q2xhc3NJbnRlcmZhY2VbbmFtZV0gOiBudWxsO1xuXG4gIC8vIERpc2FsbG93IG92ZXJyaWRpbmcgb2YgYmFzZSBjbGFzcyBtZXRob2RzIHVubGVzcyBleHBsaWNpdGx5IGFsbG93ZWQuXG4gIGlmIChSZWFjdENsYXNzTWl4aW4uaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAhKHNwZWNQb2xpY3kgPT09ICdPVkVSUklERV9CQVNFJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RDbGFzc0ludGVyZmFjZTogWW91IGFyZSBhdHRlbXB0aW5nIHRvIG92ZXJyaWRlIGAlc2AgZnJvbSB5b3VyIGNsYXNzIHNwZWNpZmljYXRpb24uIEVuc3VyZSB0aGF0IHlvdXIgbWV0aG9kIG5hbWVzIGRvIG5vdCBvdmVybGFwIHdpdGggUmVhY3QgbWV0aG9kcy4nLCBuYW1lKSA6IF9wcm9kSW52YXJpYW50KCc3MycsIG5hbWUpIDogdm9pZCAwO1xuICB9XG5cbiAgLy8gRGlzYWxsb3cgZGVmaW5pbmcgbWV0aG9kcyBtb3JlIHRoYW4gb25jZSB1bmxlc3MgZXhwbGljaXRseSBhbGxvd2VkLlxuICBpZiAoaXNBbHJlYWR5RGVmaW5lZCkge1xuICAgICEoc3BlY1BvbGljeSA9PT0gJ0RFRklORV9NQU5ZJyB8fCBzcGVjUG9saWN5ID09PSAnREVGSU5FX01BTllfTUVSR0VEJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RDbGFzc0ludGVyZmFjZTogWW91IGFyZSBhdHRlbXB0aW5nIHRvIGRlZmluZSBgJXNgIG9uIHlvdXIgY29tcG9uZW50IG1vcmUgdGhhbiBvbmNlLiBUaGlzIGNvbmZsaWN0IG1heSBiZSBkdWUgdG8gYSBtaXhpbi4nLCBuYW1lKSA6IF9wcm9kSW52YXJpYW50KCc3NCcsIG5hbWUpIDogdm9pZCAwO1xuICB9XG59XG5cbi8qKlxuICogTWl4aW4gaGVscGVyIHdoaWNoIGhhbmRsZXMgcG9saWN5IHZhbGlkYXRpb24gYW5kIHJlc2VydmVkXG4gKiBzcGVjaWZpY2F0aW9uIGtleXMgd2hlbiBidWlsZGluZyBSZWFjdCBjbGFzc2VzLlxuICovXG5mdW5jdGlvbiBtaXhTcGVjSW50b0NvbXBvbmVudChDb25zdHJ1Y3Rvciwgc3BlYykge1xuICBpZiAoIXNwZWMpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHR5cGVvZlNwZWMgPSB0eXBlb2Ygc3BlYztcbiAgICAgIHZhciBpc01peGluVmFsaWQgPSB0eXBlb2ZTcGVjID09PSAnb2JqZWN0JyAmJiBzcGVjICE9PSBudWxsO1xuXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhpc01peGluVmFsaWQsICclczogWW91XFwncmUgYXR0ZW1wdGluZyB0byBpbmNsdWRlIGEgbWl4aW4gdGhhdCBpcyBlaXRoZXIgbnVsbCAnICsgJ29yIG5vdCBhbiBvYmplY3QuIENoZWNrIHRoZSBtaXhpbnMgaW5jbHVkZWQgYnkgdGhlIGNvbXBvbmVudCwgJyArICdhcyB3ZWxsIGFzIGFueSBtaXhpbnMgdGhleSBpbmNsdWRlIHRoZW1zZWx2ZXMuICcgKyAnRXhwZWN0ZWQgb2JqZWN0IGJ1dCBnb3QgJXMuJywgQ29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgJ1JlYWN0Q2xhc3MnLCBzcGVjID09PSBudWxsID8gbnVsbCA6IHR5cGVvZlNwZWMpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gICEodHlwZW9mIHNwZWMgIT09ICdmdW5jdGlvbicpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0Q2xhc3M6IFlvdVxcJ3JlIGF0dGVtcHRpbmcgdG8gdXNlIGEgY29tcG9uZW50IGNsYXNzIG9yIGZ1bmN0aW9uIGFzIGEgbWl4aW4uIEluc3RlYWQsIGp1c3QgdXNlIGEgcmVndWxhciBvYmplY3QuJykgOiBfcHJvZEludmFyaWFudCgnNzUnKSA6IHZvaWQgMDtcbiAgISFSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQoc3BlYykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RDbGFzczogWW91XFwncmUgYXR0ZW1wdGluZyB0byB1c2UgYSBjb21wb25lbnQgYXMgYSBtaXhpbi4gSW5zdGVhZCwganVzdCB1c2UgYSByZWd1bGFyIG9iamVjdC4nKSA6IF9wcm9kSW52YXJpYW50KCc3NicpIDogdm9pZCAwO1xuXG4gIHZhciBwcm90byA9IENvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgdmFyIGF1dG9CaW5kUGFpcnMgPSBwcm90by5fX3JlYWN0QXV0b0JpbmRQYWlycztcblxuICAvLyBCeSBoYW5kbGluZyBtaXhpbnMgYmVmb3JlIGFueSBvdGhlciBwcm9wZXJ0aWVzLCB3ZSBlbnN1cmUgdGhlIHNhbWVcbiAgLy8gY2hhaW5pbmcgb3JkZXIgaXMgYXBwbGllZCB0byBtZXRob2RzIHdpdGggREVGSU5FX01BTlkgcG9saWN5LCB3aGV0aGVyXG4gIC8vIG1peGlucyBhcmUgbGlzdGVkIGJlZm9yZSBvciBhZnRlciB0aGVzZSBtZXRob2RzIGluIHRoZSBzcGVjLlxuICBpZiAoc3BlYy5oYXNPd25Qcm9wZXJ0eShNSVhJTlNfS0VZKSkge1xuICAgIFJFU0VSVkVEX1NQRUNfS0VZUy5taXhpbnMoQ29uc3RydWN0b3IsIHNwZWMubWl4aW5zKTtcbiAgfVxuXG4gIGZvciAodmFyIG5hbWUgaW4gc3BlYykge1xuICAgIGlmICghc3BlYy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5hbWUgPT09IE1JWElOU19LRVkpIHtcbiAgICAgIC8vIFdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkIG1peGlucyBpbiBhIHNwZWNpYWwgY2FzZSBhYm92ZS5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBwcm9wZXJ0eSA9IHNwZWNbbmFtZV07XG4gICAgdmFyIGlzQWxyZWFkeURlZmluZWQgPSBwcm90by5oYXNPd25Qcm9wZXJ0eShuYW1lKTtcbiAgICB2YWxpZGF0ZU1ldGhvZE92ZXJyaWRlKGlzQWxyZWFkeURlZmluZWQsIG5hbWUpO1xuXG4gICAgaWYgKFJFU0VSVkVEX1NQRUNfS0VZUy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgUkVTRVJWRURfU1BFQ19LRVlTW25hbWVdKENvbnN0cnVjdG9yLCBwcm9wZXJ0eSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNldHVwIG1ldGhvZHMgb24gcHJvdG90eXBlOlxuICAgICAgLy8gVGhlIGZvbGxvd2luZyBtZW1iZXIgbWV0aG9kcyBzaG91bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgYm91bmQ6XG4gICAgICAvLyAxLiBFeHBlY3RlZCBSZWFjdENsYXNzIG1ldGhvZHMgKGluIHRoZSBcImludGVyZmFjZVwiKS5cbiAgICAgIC8vIDIuIE92ZXJyaWRkZW4gbWV0aG9kcyAodGhhdCB3ZXJlIG1peGVkIGluKS5cbiAgICAgIHZhciBpc1JlYWN0Q2xhc3NNZXRob2QgPSBSZWFjdENsYXNzSW50ZXJmYWNlLmhhc093blByb3BlcnR5KG5hbWUpO1xuICAgICAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2YgcHJvcGVydHkgPT09ICdmdW5jdGlvbic7XG4gICAgICB2YXIgc2hvdWxkQXV0b0JpbmQgPSBpc0Z1bmN0aW9uICYmICFpc1JlYWN0Q2xhc3NNZXRob2QgJiYgIWlzQWxyZWFkeURlZmluZWQgJiYgc3BlYy5hdXRvYmluZCAhPT0gZmFsc2U7XG5cbiAgICAgIGlmIChzaG91bGRBdXRvQmluZCkge1xuICAgICAgICBhdXRvQmluZFBhaXJzLnB1c2gobmFtZSwgcHJvcGVydHkpO1xuICAgICAgICBwcm90b1tuYW1lXSA9IHByb3BlcnR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzQWxyZWFkeURlZmluZWQpIHtcbiAgICAgICAgICB2YXIgc3BlY1BvbGljeSA9IFJlYWN0Q2xhc3NJbnRlcmZhY2VbbmFtZV07XG5cbiAgICAgICAgICAvLyBUaGVzZSBjYXNlcyBzaG91bGQgYWxyZWFkeSBiZSBjYXVnaHQgYnkgdmFsaWRhdGVNZXRob2RPdmVycmlkZS5cbiAgICAgICAgICAhKGlzUmVhY3RDbGFzc01ldGhvZCAmJiAoc3BlY1BvbGljeSA9PT0gJ0RFRklORV9NQU5ZX01FUkdFRCcgfHwgc3BlY1BvbGljeSA9PT0gJ0RFRklORV9NQU5ZJykpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0Q2xhc3M6IFVuZXhwZWN0ZWQgc3BlYyBwb2xpY3kgJXMgZm9yIGtleSAlcyB3aGVuIG1peGluZyBpbiBjb21wb25lbnQgc3BlY3MuJywgc3BlY1BvbGljeSwgbmFtZSkgOiBfcHJvZEludmFyaWFudCgnNzcnLCBzcGVjUG9saWN5LCBuYW1lKSA6IHZvaWQgMDtcblxuICAgICAgICAgIC8vIEZvciBtZXRob2RzIHdoaWNoIGFyZSBkZWZpbmVkIG1vcmUgdGhhbiBvbmNlLCBjYWxsIHRoZSBleGlzdGluZ1xuICAgICAgICAgIC8vIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgdGhlIG5ldyBwcm9wZXJ0eSwgbWVyZ2luZyBpZiBhcHByb3ByaWF0ZS5cbiAgICAgICAgICBpZiAoc3BlY1BvbGljeSA9PT0gJ0RFRklORV9NQU5ZX01FUkdFRCcpIHtcbiAgICAgICAgICAgIHByb3RvW25hbWVdID0gY3JlYXRlTWVyZ2VkUmVzdWx0RnVuY3Rpb24ocHJvdG9bbmFtZV0sIHByb3BlcnR5KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNwZWNQb2xpY3kgPT09ICdERUZJTkVfTUFOWScpIHtcbiAgICAgICAgICAgIHByb3RvW25hbWVdID0gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKHByb3RvW25hbWVdLCBwcm9wZXJ0eSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3RvW25hbWVdID0gcHJvcGVydHk7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIC8vIEFkZCB2ZXJib3NlIGRpc3BsYXlOYW1lIHRvIHRoZSBmdW5jdGlvbiwgd2hpY2ggaGVscHMgd2hlbiBsb29raW5nXG4gICAgICAgICAgICAvLyBhdCBwcm9maWxpbmcgdG9vbHMuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb3BlcnR5ID09PSAnZnVuY3Rpb24nICYmIHNwZWMuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICAgICAgcHJvdG9bbmFtZV0uZGlzcGxheU5hbWUgPSBzcGVjLmRpc3BsYXlOYW1lICsgJ18nICsgbmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbWl4U3RhdGljU3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIHN0YXRpY3MpIHtcbiAgaWYgKCFzdGF0aWNzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAodmFyIG5hbWUgaW4gc3RhdGljcykge1xuICAgIHZhciBwcm9wZXJ0eSA9IHN0YXRpY3NbbmFtZV07XG4gICAgaWYgKCFzdGF0aWNzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgaXNSZXNlcnZlZCA9IG5hbWUgaW4gUkVTRVJWRURfU1BFQ19LRVlTO1xuICAgICEhaXNSZXNlcnZlZCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdENsYXNzOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gZGVmaW5lIGEgcmVzZXJ2ZWQgcHJvcGVydHksIGAlc2AsIHRoYXQgc2hvdWxkblxcJ3QgYmUgb24gdGhlIFwic3RhdGljc1wiIGtleS4gRGVmaW5lIGl0IGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IGluc3RlYWQ7IGl0IHdpbGwgc3RpbGwgYmUgYWNjZXNzaWJsZSBvbiB0aGUgY29uc3RydWN0b3IuJywgbmFtZSkgOiBfcHJvZEludmFyaWFudCgnNzgnLCBuYW1lKSA6IHZvaWQgMDtcblxuICAgIHZhciBpc0luaGVyaXRlZCA9IG5hbWUgaW4gQ29uc3RydWN0b3I7XG4gICAgISFpc0luaGVyaXRlZCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdENsYXNzOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gZGVmaW5lIGAlc2Agb24geW91ciBjb21wb25lbnQgbW9yZSB0aGFuIG9uY2UuIFRoaXMgY29uZmxpY3QgbWF5IGJlIGR1ZSB0byBhIG1peGluLicsIG5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzc5JywgbmFtZSkgOiB2b2lkIDA7XG4gICAgQ29uc3RydWN0b3JbbmFtZV0gPSBwcm9wZXJ0eTtcbiAgfVxufVxuXG4vKipcbiAqIE1lcmdlIHR3byBvYmplY3RzLCBidXQgdGhyb3cgaWYgYm90aCBjb250YWluIHRoZSBzYW1lIGtleS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb25lIFRoZSBmaXJzdCBvYmplY3QsIHdoaWNoIGlzIG11dGF0ZWQuXG4gKiBAcGFyYW0ge29iamVjdH0gdHdvIFRoZSBzZWNvbmQgb2JqZWN0XG4gKiBAcmV0dXJuIHtvYmplY3R9IG9uZSBhZnRlciBpdCBoYXMgYmVlbiBtdXRhdGVkIHRvIGNvbnRhaW4gZXZlcnl0aGluZyBpbiB0d28uXG4gKi9cbmZ1bmN0aW9uIG1lcmdlSW50b1dpdGhOb0R1cGxpY2F0ZUtleXMob25lLCB0d28pIHtcbiAgIShvbmUgJiYgdHdvICYmIHR5cGVvZiBvbmUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB0d28gPT09ICdvYmplY3QnKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdtZXJnZUludG9XaXRoTm9EdXBsaWNhdGVLZXlzKCk6IENhbm5vdCBtZXJnZSBub24tb2JqZWN0cy4nKSA6IF9wcm9kSW52YXJpYW50KCc4MCcpIDogdm9pZCAwO1xuXG4gIGZvciAodmFyIGtleSBpbiB0d28pIHtcbiAgICBpZiAodHdvLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICEob25lW2tleV0gPT09IHVuZGVmaW5lZCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnbWVyZ2VJbnRvV2l0aE5vRHVwbGljYXRlS2V5cygpOiBUcmllZCB0byBtZXJnZSB0d28gb2JqZWN0cyB3aXRoIHRoZSBzYW1lIGtleTogYCVzYC4gVGhpcyBjb25mbGljdCBtYXkgYmUgZHVlIHRvIGEgbWl4aW47IGluIHBhcnRpY3VsYXIsIHRoaXMgbWF5IGJlIGNhdXNlZCBieSB0d28gZ2V0SW5pdGlhbFN0YXRlKCkgb3IgZ2V0RGVmYXVsdFByb3BzKCkgbWV0aG9kcyByZXR1cm5pbmcgb2JqZWN0cyB3aXRoIGNsYXNoaW5nIGtleXMuJywga2V5KSA6IF9wcm9kSW52YXJpYW50KCc4MScsIGtleSkgOiB2b2lkIDA7XG4gICAgICBvbmVba2V5XSA9IHR3b1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb25lO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdHdvIGZ1bmN0aW9ucyBhbmQgbWVyZ2VzIHRoZWlyIHJldHVybiB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gb25lIEZ1bmN0aW9uIHRvIGludm9rZSBmaXJzdC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHR3byBGdW5jdGlvbiB0byBpbnZva2Ugc2Vjb25kLlxuICogQHJldHVybiB7ZnVuY3Rpb259IEZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgdHdvIGFyZ3VtZW50IGZ1bmN0aW9ucy5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU1lcmdlZFJlc3VsdEZ1bmN0aW9uKG9uZSwgdHdvKSB7XG4gIHJldHVybiBmdW5jdGlvbiBtZXJnZWRSZXN1bHQoKSB7XG4gICAgdmFyIGEgPSBvbmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB2YXIgYiA9IHR3by5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChhID09IG51bGwpIHtcbiAgICAgIHJldHVybiBiO1xuICAgIH0gZWxzZSBpZiAoYiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gYTtcbiAgICB9XG4gICAgdmFyIGMgPSB7fTtcbiAgICBtZXJnZUludG9XaXRoTm9EdXBsaWNhdGVLZXlzKGMsIGEpO1xuICAgIG1lcmdlSW50b1dpdGhOb0R1cGxpY2F0ZUtleXMoYywgYik7XG4gICAgcmV0dXJuIGM7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0d28gZnVuY3Rpb25zIGFuZCBpZ25vcmVzIHRoZWlyIHJldHVybiB2YWxlcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBvbmUgRnVuY3Rpb24gdG8gaW52b2tlIGZpcnN0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gdHdvIEZ1bmN0aW9uIHRvIGludm9rZSBzZWNvbmQuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn0gRnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSB0d28gYXJndW1lbnQgZnVuY3Rpb25zLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKG9uZSwgdHdvKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjaGFpbmVkRnVuY3Rpb24oKSB7XG4gICAgb25lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdHdvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbi8qKlxuICogQmluZHMgYSBtZXRob2QgdG8gdGhlIGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY29tcG9uZW50IENvbXBvbmVudCB3aG9zZSBtZXRob2QgaXMgZ29pbmcgdG8gYmUgYm91bmQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBtZXRob2QgTWV0aG9kIHRvIGJlIGJvdW5kLlxuICogQHJldHVybiB7ZnVuY3Rpb259IFRoZSBib3VuZCBtZXRob2QuXG4gKi9cbmZ1bmN0aW9uIGJpbmRBdXRvQmluZE1ldGhvZChjb21wb25lbnQsIG1ldGhvZCkge1xuICB2YXIgYm91bmRNZXRob2QgPSBtZXRob2QuYmluZChjb21wb25lbnQpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZENvbnRleHQgPSBjb21wb25lbnQ7XG4gICAgYm91bmRNZXRob2QuX19yZWFjdEJvdW5kTWV0aG9kID0gbWV0aG9kO1xuICAgIGJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZEFyZ3VtZW50cyA9IG51bGw7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnQuY29uc3RydWN0b3IuZGlzcGxheU5hbWU7XG4gICAgdmFyIF9iaW5kID0gYm91bmRNZXRob2QuYmluZDtcbiAgICBib3VuZE1ldGhvZC5iaW5kID0gZnVuY3Rpb24gKG5ld1RoaXMpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlciBpcyB0cnlpbmcgdG8gYmluZCgpIGFuIGF1dG9ib3VuZCBtZXRob2Q7IHdlIGVmZmVjdGl2ZWx5IHdpbGxcbiAgICAgIC8vIGlnbm9yZSB0aGUgdmFsdWUgb2YgXCJ0aGlzXCIgdGhhdCB0aGUgdXNlciBpcyB0cnlpbmcgdG8gdXNlLCBzb1xuICAgICAgLy8gbGV0J3Mgd2Fybi5cbiAgICAgIGlmIChuZXdUaGlzICE9PSBjb21wb25lbnQgJiYgbmV3VGhpcyAhPT0gbnVsbCkge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2JpbmQoKTogUmVhY3QgY29tcG9uZW50IG1ldGhvZHMgbWF5IG9ubHkgYmUgYm91bmQgdG8gdGhlICcgKyAnY29tcG9uZW50IGluc3RhbmNlLiBTZWUgJXMnLCBjb21wb25lbnROYW1lKSA6IHZvaWQgMDtcbiAgICAgIH0gZWxzZSBpZiAoIWFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYmluZCgpOiBZb3UgYXJlIGJpbmRpbmcgYSBjb21wb25lbnQgbWV0aG9kIHRvIHRoZSBjb21wb25lbnQuICcgKyAnUmVhY3QgZG9lcyB0aGlzIGZvciB5b3UgYXV0b21hdGljYWxseSBpbiBhIGhpZ2gtcGVyZm9ybWFuY2UgJyArICd3YXksIHNvIHlvdSBjYW4gc2FmZWx5IHJlbW92ZSB0aGlzIGNhbGwuIFNlZSAlcycsIGNvbXBvbmVudE5hbWUpIDogdm9pZCAwO1xuICAgICAgICByZXR1cm4gYm91bmRNZXRob2Q7XG4gICAgICB9XG4gICAgICB2YXIgcmVib3VuZE1ldGhvZCA9IF9iaW5kLmFwcGx5KGJvdW5kTWV0aG9kLCBhcmd1bWVudHMpO1xuICAgICAgcmVib3VuZE1ldGhvZC5fX3JlYWN0Qm91bmRDb250ZXh0ID0gY29tcG9uZW50O1xuICAgICAgcmVib3VuZE1ldGhvZC5fX3JlYWN0Qm91bmRNZXRob2QgPSBtZXRob2Q7XG4gICAgICByZWJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZEFyZ3VtZW50cyA9IGFyZ3M7XG4gICAgICByZXR1cm4gcmVib3VuZE1ldGhvZDtcbiAgICB9O1xuICB9XG4gIHJldHVybiBib3VuZE1ldGhvZDtcbn1cblxuLyoqXG4gKiBCaW5kcyBhbGwgYXV0by1ib3VuZCBtZXRob2RzIGluIGEgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb21wb25lbnQgQ29tcG9uZW50IHdob3NlIG1ldGhvZCBpcyBnb2luZyB0byBiZSBib3VuZC5cbiAqL1xuZnVuY3Rpb24gYmluZEF1dG9CaW5kTWV0aG9kcyhjb21wb25lbnQpIHtcbiAgdmFyIHBhaXJzID0gY29tcG9uZW50Ll9fcmVhY3RBdXRvQmluZFBhaXJzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhaXJzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIGF1dG9CaW5kS2V5ID0gcGFpcnNbaV07XG4gICAgdmFyIG1ldGhvZCA9IHBhaXJzW2kgKyAxXTtcbiAgICBjb21wb25lbnRbYXV0b0JpbmRLZXldID0gYmluZEF1dG9CaW5kTWV0aG9kKGNvbXBvbmVudCwgbWV0aG9kKTtcbiAgfVxufVxuXG4vKipcbiAqIEFkZCBtb3JlIHRvIHRoZSBSZWFjdENsYXNzIGJhc2UgY2xhc3MuIFRoZXNlIGFyZSBhbGwgbGVnYWN5IGZlYXR1cmVzIGFuZFxuICogdGhlcmVmb3JlIG5vdCBhbHJlYWR5IHBhcnQgb2YgdGhlIG1vZGVybiBSZWFjdENvbXBvbmVudC5cbiAqL1xudmFyIFJlYWN0Q2xhc3NNaXhpbiA9IHtcblxuICAvKipcbiAgICogVE9ETzogVGhpcyB3aWxsIGJlIGRlcHJlY2F0ZWQgYmVjYXVzZSBzdGF0ZSBzaG91bGQgYWx3YXlzIGtlZXAgYSBjb25zaXN0ZW50XG4gICAqIHR5cGUgc2lnbmF0dXJlIGFuZCB0aGUgb25seSB1c2UgY2FzZSBmb3IgdGhpcywgaXMgdG8gYXZvaWQgdGhhdC5cbiAgICovXG4gIHJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKG5ld1N0YXRlLCBjYWxsYmFjaykge1xuICAgIHRoaXMudXBkYXRlci5lbnF1ZXVlUmVwbGFjZVN0YXRlKHRoaXMsIG5ld1N0YXRlKTtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHRoaXMudXBkYXRlci5lbnF1ZXVlQ2FsbGJhY2sodGhpcywgY2FsbGJhY2ssICdyZXBsYWNlU3RhdGUnKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvc2l0ZSBjb21wb25lbnQgaXMgbW91bnRlZC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb3VudGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGZpbmFsXG4gICAqL1xuICBpc01vdW50ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVyLmlzTW91bnRlZCh0aGlzKTtcbiAgfVxufTtcblxudmFyIFJlYWN0Q2xhc3NDb21wb25lbnQgPSBmdW5jdGlvbiAoKSB7fTtcbl9hc3NpZ24oUmVhY3RDbGFzc0NvbXBvbmVudC5wcm90b3R5cGUsIFJlYWN0Q29tcG9uZW50LnByb3RvdHlwZSwgUmVhY3RDbGFzc01peGluKTtcblxuLyoqXG4gKiBNb2R1bGUgZm9yIGNyZWF0aW5nIGNvbXBvc2l0ZSBjb21wb25lbnRzLlxuICpcbiAqIEBjbGFzcyBSZWFjdENsYXNzXG4gKi9cbnZhciBSZWFjdENsYXNzID0ge1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY29tcG9zaXRlIGNvbXBvbmVudCBjbGFzcyBnaXZlbiBhIGNsYXNzIHNwZWNpZmljYXRpb24uXG4gICAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jcmVhdGVjbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gc3BlYyBDbGFzcyBzcGVjaWZpY2F0aW9uICh3aGljaCBtdXN0IGRlZmluZSBgcmVuZGVyYCkuXG4gICAqIEByZXR1cm4ge2Z1bmN0aW9ufSBDb21wb25lbnQgY29uc3RydWN0b3IgZnVuY3Rpb24uXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGNyZWF0ZUNsYXNzOiBmdW5jdGlvbiAoc3BlYykge1xuICAgIC8vIFRvIGtlZXAgb3VyIHdhcm5pbmdzIG1vcmUgdW5kZXJzdGFuZGFibGUsIHdlJ2xsIHVzZSBhIGxpdHRsZSBoYWNrIGhlcmUgdG9cbiAgICAvLyBlbnN1cmUgdGhhdCBDb25zdHJ1Y3Rvci5uYW1lICE9PSAnQ29uc3RydWN0b3InLiBUaGlzIG1ha2VzIHN1cmUgd2UgZG9uJ3RcbiAgICAvLyB1bm5lY2Vzc2FyaWx5IGlkZW50aWZ5IGEgY2xhc3Mgd2l0aG91dCBkaXNwbGF5TmFtZSBhcyAnQ29uc3RydWN0b3InLlxuICAgIHZhciBDb25zdHJ1Y3RvciA9IGlkZW50aXR5KGZ1bmN0aW9uIChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICAgICAgLy8gVGhpcyBjb25zdHJ1Y3RvciBnZXRzIG92ZXJyaWRkZW4gYnkgbW9ja3MuIFRoZSBhcmd1bWVudCBpcyB1c2VkXG4gICAgICAvLyBieSBtb2NrcyB0byBhc3NlcnQgb24gd2hhdCBnZXRzIG1vdW50ZWQuXG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHRoaXMgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvciwgJ1NvbWV0aGluZyBpcyBjYWxsaW5nIGEgUmVhY3QgY29tcG9uZW50IGRpcmVjdGx5LiBVc2UgYSBmYWN0b3J5IG9yICcgKyAnSlNYIGluc3RlYWQuIFNlZTogaHR0cHM6Ly9mYi5tZS9yZWFjdC1sZWdhY3lmYWN0b3J5JykgOiB2b2lkIDA7XG4gICAgICB9XG5cbiAgICAgIC8vIFdpcmUgdXAgYXV0by1iaW5kaW5nXG4gICAgICBpZiAodGhpcy5fX3JlYWN0QXV0b0JpbmRQYWlycy5sZW5ndGgpIHtcbiAgICAgICAgYmluZEF1dG9CaW5kTWV0aG9kcyh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0O1xuICAgICAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcblxuICAgICAgdGhpcy5zdGF0ZSA9IG51bGw7XG5cbiAgICAgIC8vIFJlYWN0Q2xhc3NlcyBkb2Vzbid0IGhhdmUgY29uc3RydWN0b3JzLiBJbnN0ZWFkLCB0aGV5IHVzZSB0aGVcbiAgICAgIC8vIGdldEluaXRpYWxTdGF0ZSBhbmQgY29tcG9uZW50V2lsbE1vdW50IG1ldGhvZHMgZm9yIGluaXRpYWxpemF0aW9uLlxuXG4gICAgICB2YXIgaW5pdGlhbFN0YXRlID0gdGhpcy5nZXRJbml0aWFsU3RhdGUgPyB0aGlzLmdldEluaXRpYWxTdGF0ZSgpIDogbnVsbDtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIC8vIFdlIGFsbG93IGF1dG8tbW9ja3MgdG8gcHJvY2VlZCBhcyBpZiB0aGV5J3JlIHJldHVybmluZyBudWxsLlxuICAgICAgICBpZiAoaW5pdGlhbFN0YXRlID09PSB1bmRlZmluZWQgJiYgdGhpcy5nZXRJbml0aWFsU3RhdGUuX2lzTW9ja0Z1bmN0aW9uKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBwcm9iYWJseSBiYWQgcHJhY3RpY2UuIENvbnNpZGVyIHdhcm5pbmcgaGVyZSBhbmRcbiAgICAgICAgICAvLyBkZXByZWNhdGluZyB0aGlzIGNvbnZlbmllbmNlLlxuICAgICAgICAgIGluaXRpYWxTdGF0ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgICEodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoaW5pdGlhbFN0YXRlKSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMuZ2V0SW5pdGlhbFN0YXRlKCk6IG11c3QgcmV0dXJuIGFuIG9iamVjdCBvciBudWxsJywgQ29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnODInLCBDb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IHZvaWQgMDtcblxuICAgICAgdGhpcy5zdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgICB9KTtcbiAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBuZXcgUmVhY3RDbGFzc0NvbXBvbmVudCgpO1xuICAgIENvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbnN0cnVjdG9yO1xuICAgIENvbnN0cnVjdG9yLnByb3RvdHlwZS5fX3JlYWN0QXV0b0JpbmRQYWlycyA9IFtdO1xuXG4gICAgaW5qZWN0ZWRNaXhpbnMuZm9yRWFjaChtaXhTcGVjSW50b0NvbXBvbmVudC5iaW5kKG51bGwsIENvbnN0cnVjdG9yKSk7XG5cbiAgICBtaXhTcGVjSW50b0NvbXBvbmVudChDb25zdHJ1Y3Rvciwgc3BlYyk7XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSBkZWZhdWx0UHJvcHMgcHJvcGVydHkgYWZ0ZXIgYWxsIG1peGlucyBoYXZlIGJlZW4gbWVyZ2VkLlxuICAgIGlmIChDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMpIHtcbiAgICAgIENvbnN0cnVjdG9yLmRlZmF1bHRQcm9wcyA9IENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcygpO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgdGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIHVzZSBvZiB0aGVzZSBtZXRob2QgbmFtZXMgaXMgb2ssXG4gICAgICAvLyBzaW5jZSBpdCdzIHVzZWQgd2l0aCBjcmVhdGVDbGFzcy4gSWYgaXQncyBub3QsIHRoZW4gaXQncyBsaWtlbHkgYVxuICAgICAgLy8gbWlzdGFrZSBzbyB3ZSdsbCB3YXJuIHlvdSB0byB1c2UgdGhlIHN0YXRpYyBwcm9wZXJ0eSwgcHJvcGVydHlcbiAgICAgIC8vIGluaXRpYWxpemVyIG9yIGNvbnN0cnVjdG9yIHJlc3BlY3RpdmVseS5cbiAgICAgIGlmIChDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkID0ge307XG4gICAgICB9XG4gICAgICBpZiAoQ29uc3RydWN0b3IucHJvdG90eXBlLmdldEluaXRpYWxTdGF0ZSkge1xuICAgICAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUuZ2V0SW5pdGlhbFN0YXRlLmlzUmVhY3RDbGFzc0FwcHJvdmVkID0ge307XG4gICAgICB9XG4gICAgfVxuXG4gICAgIUNvbnN0cnVjdG9yLnByb3RvdHlwZS5yZW5kZXIgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnY3JlYXRlQ2xhc3MoLi4uKTogQ2xhc3Mgc3BlY2lmaWNhdGlvbiBtdXN0IGltcGxlbWVudCBhIGByZW5kZXJgIG1ldGhvZC4nKSA6IF9wcm9kSW52YXJpYW50KCc4MycpIDogdm9pZCAwO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFDb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29tcG9uZW50U2hvdWxkVXBkYXRlLCAnJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudFNob3VsZFVwZGF0ZSgpLiBEaWQgeW91IG1lYW4gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk/ICcgKyAnVGhlIG5hbWUgaXMgcGhyYXNlZCBhcyBhIHF1ZXN0aW9uIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGlzICcgKyAnZXhwZWN0ZWQgdG8gcmV0dXJuIGEgdmFsdWUuJywgc3BlYy5kaXNwbGF5TmFtZSB8fCAnQSBjb21wb25lbnQnKSA6IHZvaWQgMDtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFDb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcywgJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzKCkuIERpZCB5b3UgbWVhbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/Jywgc3BlYy5kaXNwbGF5TmFtZSB8fCAnQSBjb21wb25lbnQnKSA6IHZvaWQgMDtcbiAgICB9XG5cbiAgICAvLyBSZWR1Y2UgdGltZSBzcGVudCBkb2luZyBsb29rdXBzIGJ5IHNldHRpbmcgdGhlc2Ugb24gdGhlIHByb3RvdHlwZS5cbiAgICBmb3IgKHZhciBtZXRob2ROYW1lIGluIFJlYWN0Q2xhc3NJbnRlcmZhY2UpIHtcbiAgICAgIGlmICghQ29uc3RydWN0b3IucHJvdG90eXBlW21ldGhvZE5hbWVdKSB7XG4gICAgICAgIENvbnN0cnVjdG9yLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9LFxuXG4gIGluamVjdGlvbjoge1xuICAgIGluamVjdE1peGluOiBmdW5jdGlvbiAobWl4aW4pIHtcbiAgICAgIGluamVjdGVkTWl4aW5zLnB1c2gobWl4aW4pO1xuICAgIH1cbiAgfVxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q2xhc3M7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0L2xpYi9SZWFjdENsYXNzLmpzXG4vLyBtb2R1bGUgaWQgPSAxOTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 195 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar ReactPropTypeLocationNames = {};\n\nif (true) {\n  ReactPropTypeLocationNames = {\n    prop: 'prop',\n    context: 'context',\n    childContext: 'child context'\n  };\n}\n\nmodule.exports = ReactPropTypeLocationNames;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSB7XG4gICAgcHJvcDogJ3Byb3AnLFxuICAgIGNvbnRleHQ6ICdjb250ZXh0JyxcbiAgICBjaGlsZENvbnRleHQ6ICdjaGlsZCBjb250ZXh0J1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC9saWIvUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMuanNcbi8vIG1vZHVsZSBpZCA9IDE5NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 196 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar ReactElement = __webpack_require__(181);\n\n/**\n * Create a factory that creates HTML tag elements.\n *\n * @private\n */\nvar createDOMFactory = ReactElement.createFactory;\nif (true) {\n  var ReactElementValidator = __webpack_require__(197);\n  createDOMFactory = ReactElementValidator.createFactory;\n}\n\n/**\n * Creates a mapping from supported HTML tags to `ReactDOMComponent` classes.\n * This is also accessible via `React.DOM`.\n *\n * @public\n */\nvar ReactDOMFactories = {\n  a: createDOMFactory('a'),\n  abbr: createDOMFactory('abbr'),\n  address: createDOMFactory('address'),\n  area: createDOMFactory('area'),\n  article: createDOMFactory('article'),\n  aside: createDOMFactory('aside'),\n  audio: createDOMFactory('audio'),\n  b: createDOMFactory('b'),\n  base: createDOMFactory('base'),\n  bdi: createDOMFactory('bdi'),\n  bdo: createDOMFactory('bdo'),\n  big: createDOMFactory('big'),\n  blockquote: createDOMFactory('blockquote'),\n  body: createDOMFactory('body'),\n  br: createDOMFactory('br'),\n  button: createDOMFactory('button'),\n  canvas: createDOMFactory('canvas'),\n  caption: createDOMFactory('caption'),\n  cite: createDOMFactory('cite'),\n  code: createDOMFactory('code'),\n  col: createDOMFactory('col'),\n  colgroup: createDOMFactory('colgroup'),\n  data: createDOMFactory('data'),\n  datalist: createDOMFactory('datalist'),\n  dd: createDOMFactory('dd'),\n  del: createDOMFactory('del'),\n  details: createDOMFactory('details'),\n  dfn: createDOMFactory('dfn'),\n  dialog: createDOMFactory('dialog'),\n  div: createDOMFactory('div'),\n  dl: createDOMFactory('dl'),\n  dt: createDOMFactory('dt'),\n  em: createDOMFactory('em'),\n  embed: createDOMFactory('embed'),\n  fieldset: createDOMFactory('fieldset'),\n  figcaption: createDOMFactory('figcaption'),\n  figure: createDOMFactory('figure'),\n  footer: createDOMFactory('footer'),\n  form: createDOMFactory('form'),\n  h1: createDOMFactory('h1'),\n  h2: createDOMFactory('h2'),\n  h3: createDOMFactory('h3'),\n  h4: createDOMFactory('h4'),\n  h5: createDOMFactory('h5'),\n  h6: createDOMFactory('h6'),\n  head: createDOMFactory('head'),\n  header: createDOMFactory('header'),\n  hgroup: createDOMFactory('hgroup'),\n  hr: createDOMFactory('hr'),\n  html: createDOMFactory('html'),\n  i: createDOMFactory('i'),\n  iframe: createDOMFactory('iframe'),\n  img: createDOMFactory('img'),\n  input: createDOMFactory('input'),\n  ins: createDOMFactory('ins'),\n  kbd: createDOMFactory('kbd'),\n  keygen: createDOMFactory('keygen'),\n  label: createDOMFactory('label'),\n  legend: createDOMFactory('legend'),\n  li: createDOMFactory('li'),\n  link: createDOMFactory('link'),\n  main: createDOMFactory('main'),\n  map: createDOMFactory('map'),\n  mark: createDOMFactory('mark'),\n  menu: createDOMFactory('menu'),\n  menuitem: createDOMFactory('menuitem'),\n  meta: createDOMFactory('meta'),\n  meter: createDOMFactory('meter'),\n  nav: createDOMFactory('nav'),\n  noscript: createDOMFactory('noscript'),\n  object: createDOMFactory('object'),\n  ol: createDOMFactory('ol'),\n  optgroup: createDOMFactory('optgroup'),\n  option: createDOMFactory('option'),\n  output: createDOMFactory('output'),\n  p: createDOMFactory('p'),\n  param: createDOMFactory('param'),\n  picture: createDOMFactory('picture'),\n  pre: createDOMFactory('pre'),\n  progress: createDOMFactory('progress'),\n  q: createDOMFactory('q'),\n  rp: createDOMFactory('rp'),\n  rt: createDOMFactory('rt'),\n  ruby: createDOMFactory('ruby'),\n  s: createDOMFactory('s'),\n  samp: createDOMFactory('samp'),\n  script: createDOMFactory('script'),\n  section: createDOMFactory('section'),\n  select: createDOMFactory('select'),\n  small: createDOMFactory('small'),\n  source: createDOMFactory('source'),\n  span: createDOMFactory('span'),\n  strong: createDOMFactory('strong'),\n  style: createDOMFactory('style'),\n  sub: createDOMFactory('sub'),\n  summary: createDOMFactory('summary'),\n  sup: createDOMFactory('sup'),\n  table: createDOMFactory('table'),\n  tbody: createDOMFactory('tbody'),\n  td: createDOMFactory('td'),\n  textarea: createDOMFactory('textarea'),\n  tfoot: createDOMFactory('tfoot'),\n  th: createDOMFactory('th'),\n  thead: createDOMFactory('thead'),\n  time: createDOMFactory('time'),\n  title: createDOMFactory('title'),\n  tr: createDOMFactory('tr'),\n  track: createDOMFactory('track'),\n  u: createDOMFactory('u'),\n  ul: createDOMFactory('ul'),\n  'var': createDOMFactory('var'),\n  video: createDOMFactory('video'),\n  wbr: createDOMFactory('wbr'),\n\n  // SVG\n  circle: createDOMFactory('circle'),\n  clipPath: createDOMFactory('clipPath'),\n  defs: createDOMFactory('defs'),\n  ellipse: createDOMFactory('ellipse'),\n  g: createDOMFactory('g'),\n  image: createDOMFactory('image'),\n  line: createDOMFactory('line'),\n  linearGradient: createDOMFactory('linearGradient'),\n  mask: createDOMFactory('mask'),\n  path: createDOMFactory('path'),\n  pattern: createDOMFactory('pattern'),\n  polygon: createDOMFactory('polygon'),\n  polyline: createDOMFactory('polyline'),\n  radialGradient: createDOMFactory('radialGradient'),\n  rect: createDOMFactory('rect'),\n  stop: createDOMFactory('stop'),\n  svg: createDOMFactory('svg'),\n  text: createDOMFactory('text'),\n  tspan: createDOMFactory('tspan')\n};\n\nmodule.exports = ReactDOMFactories;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RET01GYWN0b3JpZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0RWxlbWVudCA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50Jyk7XG5cbi8qKlxuICogQ3JlYXRlIGEgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgSFRNTCB0YWcgZWxlbWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xudmFyIGNyZWF0ZURPTUZhY3RvcnkgPSBSZWFjdEVsZW1lbnQuY3JlYXRlRmFjdG9yeTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSZWFjdEVsZW1lbnRWYWxpZGF0b3IgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudFZhbGlkYXRvcicpO1xuICBjcmVhdGVET01GYWN0b3J5ID0gUmVhY3RFbGVtZW50VmFsaWRhdG9yLmNyZWF0ZUZhY3Rvcnk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hcHBpbmcgZnJvbSBzdXBwb3J0ZWQgSFRNTCB0YWdzIHRvIGBSZWFjdERPTUNvbXBvbmVudGAgY2xhc3Nlcy5cbiAqIFRoaXMgaXMgYWxzbyBhY2Nlc3NpYmxlIHZpYSBgUmVhY3QuRE9NYC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbnZhciBSZWFjdERPTUZhY3RvcmllcyA9IHtcbiAgYTogY3JlYXRlRE9NRmFjdG9yeSgnYScpLFxuICBhYmJyOiBjcmVhdGVET01GYWN0b3J5KCdhYmJyJyksXG4gIGFkZHJlc3M6IGNyZWF0ZURPTUZhY3RvcnkoJ2FkZHJlc3MnKSxcbiAgYXJlYTogY3JlYXRlRE9NRmFjdG9yeSgnYXJlYScpLFxuICBhcnRpY2xlOiBjcmVhdGVET01GYWN0b3J5KCdhcnRpY2xlJyksXG4gIGFzaWRlOiBjcmVhdGVET01GYWN0b3J5KCdhc2lkZScpLFxuICBhdWRpbzogY3JlYXRlRE9NRmFjdG9yeSgnYXVkaW8nKSxcbiAgYjogY3JlYXRlRE9NRmFjdG9yeSgnYicpLFxuICBiYXNlOiBjcmVhdGVET01GYWN0b3J5KCdiYXNlJyksXG4gIGJkaTogY3JlYXRlRE9NRmFjdG9yeSgnYmRpJyksXG4gIGJkbzogY3JlYXRlRE9NRmFjdG9yeSgnYmRvJyksXG4gIGJpZzogY3JlYXRlRE9NRmFjdG9yeSgnYmlnJyksXG4gIGJsb2NrcXVvdGU6IGNyZWF0ZURPTUZhY3RvcnkoJ2Jsb2NrcXVvdGUnKSxcbiAgYm9keTogY3JlYXRlRE9NRmFjdG9yeSgnYm9keScpLFxuICBicjogY3JlYXRlRE9NRmFjdG9yeSgnYnInKSxcbiAgYnV0dG9uOiBjcmVhdGVET01GYWN0b3J5KCdidXR0b24nKSxcbiAgY2FudmFzOiBjcmVhdGVET01GYWN0b3J5KCdjYW52YXMnKSxcbiAgY2FwdGlvbjogY3JlYXRlRE9NRmFjdG9yeSgnY2FwdGlvbicpLFxuICBjaXRlOiBjcmVhdGVET01GYWN0b3J5KCdjaXRlJyksXG4gIGNvZGU6IGNyZWF0ZURPTUZhY3RvcnkoJ2NvZGUnKSxcbiAgY29sOiBjcmVhdGVET01GYWN0b3J5KCdjb2wnKSxcbiAgY29sZ3JvdXA6IGNyZWF0ZURPTUZhY3RvcnkoJ2NvbGdyb3VwJyksXG4gIGRhdGE6IGNyZWF0ZURPTUZhY3RvcnkoJ2RhdGEnKSxcbiAgZGF0YWxpc3Q6IGNyZWF0ZURPTUZhY3RvcnkoJ2RhdGFsaXN0JyksXG4gIGRkOiBjcmVhdGVET01GYWN0b3J5KCdkZCcpLFxuICBkZWw6IGNyZWF0ZURPTUZhY3RvcnkoJ2RlbCcpLFxuICBkZXRhaWxzOiBjcmVhdGVET01GYWN0b3J5KCdkZXRhaWxzJyksXG4gIGRmbjogY3JlYXRlRE9NRmFjdG9yeSgnZGZuJyksXG4gIGRpYWxvZzogY3JlYXRlRE9NRmFjdG9yeSgnZGlhbG9nJyksXG4gIGRpdjogY3JlYXRlRE9NRmFjdG9yeSgnZGl2JyksXG4gIGRsOiBjcmVhdGVET01GYWN0b3J5KCdkbCcpLFxuICBkdDogY3JlYXRlRE9NRmFjdG9yeSgnZHQnKSxcbiAgZW06IGNyZWF0ZURPTUZhY3RvcnkoJ2VtJyksXG4gIGVtYmVkOiBjcmVhdGVET01GYWN0b3J5KCdlbWJlZCcpLFxuICBmaWVsZHNldDogY3JlYXRlRE9NRmFjdG9yeSgnZmllbGRzZXQnKSxcbiAgZmlnY2FwdGlvbjogY3JlYXRlRE9NRmFjdG9yeSgnZmlnY2FwdGlvbicpLFxuICBmaWd1cmU6IGNyZWF0ZURPTUZhY3RvcnkoJ2ZpZ3VyZScpLFxuICBmb290ZXI6IGNyZWF0ZURPTUZhY3RvcnkoJ2Zvb3RlcicpLFxuICBmb3JtOiBjcmVhdGVET01GYWN0b3J5KCdmb3JtJyksXG4gIGgxOiBjcmVhdGVET01GYWN0b3J5KCdoMScpLFxuICBoMjogY3JlYXRlRE9NRmFjdG9yeSgnaDInKSxcbiAgaDM6IGNyZWF0ZURPTUZhY3RvcnkoJ2gzJyksXG4gIGg0OiBjcmVhdGVET01GYWN0b3J5KCdoNCcpLFxuICBoNTogY3JlYXRlRE9NRmFjdG9yeSgnaDUnKSxcbiAgaDY6IGNyZWF0ZURPTUZhY3RvcnkoJ2g2JyksXG4gIGhlYWQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2hlYWQnKSxcbiAgaGVhZGVyOiBjcmVhdGVET01GYWN0b3J5KCdoZWFkZXInKSxcbiAgaGdyb3VwOiBjcmVhdGVET01GYWN0b3J5KCdoZ3JvdXAnKSxcbiAgaHI6IGNyZWF0ZURPTUZhY3RvcnkoJ2hyJyksXG4gIGh0bWw6IGNyZWF0ZURPTUZhY3RvcnkoJ2h0bWwnKSxcbiAgaTogY3JlYXRlRE9NRmFjdG9yeSgnaScpLFxuICBpZnJhbWU6IGNyZWF0ZURPTUZhY3RvcnkoJ2lmcmFtZScpLFxuICBpbWc6IGNyZWF0ZURPTUZhY3RvcnkoJ2ltZycpLFxuICBpbnB1dDogY3JlYXRlRE9NRmFjdG9yeSgnaW5wdXQnKSxcbiAgaW5zOiBjcmVhdGVET01GYWN0b3J5KCdpbnMnKSxcbiAga2JkOiBjcmVhdGVET01GYWN0b3J5KCdrYmQnKSxcbiAga2V5Z2VuOiBjcmVhdGVET01GYWN0b3J5KCdrZXlnZW4nKSxcbiAgbGFiZWw6IGNyZWF0ZURPTUZhY3RvcnkoJ2xhYmVsJyksXG4gIGxlZ2VuZDogY3JlYXRlRE9NRmFjdG9yeSgnbGVnZW5kJyksXG4gIGxpOiBjcmVhdGVET01GYWN0b3J5KCdsaScpLFxuICBsaW5rOiBjcmVhdGVET01GYWN0b3J5KCdsaW5rJyksXG4gIG1haW46IGNyZWF0ZURPTUZhY3RvcnkoJ21haW4nKSxcbiAgbWFwOiBjcmVhdGVET01GYWN0b3J5KCdtYXAnKSxcbiAgbWFyazogY3JlYXRlRE9NRmFjdG9yeSgnbWFyaycpLFxuICBtZW51OiBjcmVhdGVET01GYWN0b3J5KCdtZW51JyksXG4gIG1lbnVpdGVtOiBjcmVhdGVET01GYWN0b3J5KCdtZW51aXRlbScpLFxuICBtZXRhOiBjcmVhdGVET01GYWN0b3J5KCdtZXRhJyksXG4gIG1ldGVyOiBjcmVhdGVET01GYWN0b3J5KCdtZXRlcicpLFxuICBuYXY6IGNyZWF0ZURPTUZhY3RvcnkoJ25hdicpLFxuICBub3NjcmlwdDogY3JlYXRlRE9NRmFjdG9yeSgnbm9zY3JpcHQnKSxcbiAgb2JqZWN0OiBjcmVhdGVET01GYWN0b3J5KCdvYmplY3QnKSxcbiAgb2w6IGNyZWF0ZURPTUZhY3RvcnkoJ29sJyksXG4gIG9wdGdyb3VwOiBjcmVhdGVET01GYWN0b3J5KCdvcHRncm91cCcpLFxuICBvcHRpb246IGNyZWF0ZURPTUZhY3RvcnkoJ29wdGlvbicpLFxuICBvdXRwdXQ6IGNyZWF0ZURPTUZhY3RvcnkoJ291dHB1dCcpLFxuICBwOiBjcmVhdGVET01GYWN0b3J5KCdwJyksXG4gIHBhcmFtOiBjcmVhdGVET01GYWN0b3J5KCdwYXJhbScpLFxuICBwaWN0dXJlOiBjcmVhdGVET01GYWN0b3J5KCdwaWN0dXJlJyksXG4gIHByZTogY3JlYXRlRE9NRmFjdG9yeSgncHJlJyksXG4gIHByb2dyZXNzOiBjcmVhdGVET01GYWN0b3J5KCdwcm9ncmVzcycpLFxuICBxOiBjcmVhdGVET01GYWN0b3J5KCdxJyksXG4gIHJwOiBjcmVhdGVET01GYWN0b3J5KCdycCcpLFxuICBydDogY3JlYXRlRE9NRmFjdG9yeSgncnQnKSxcbiAgcnVieTogY3JlYXRlRE9NRmFjdG9yeSgncnVieScpLFxuICBzOiBjcmVhdGVET01GYWN0b3J5KCdzJyksXG4gIHNhbXA6IGNyZWF0ZURPTUZhY3RvcnkoJ3NhbXAnKSxcbiAgc2NyaXB0OiBjcmVhdGVET01GYWN0b3J5KCdzY3JpcHQnKSxcbiAgc2VjdGlvbjogY3JlYXRlRE9NRmFjdG9yeSgnc2VjdGlvbicpLFxuICBzZWxlY3Q6IGNyZWF0ZURPTUZhY3RvcnkoJ3NlbGVjdCcpLFxuICBzbWFsbDogY3JlYXRlRE9NRmFjdG9yeSgnc21hbGwnKSxcbiAgc291cmNlOiBjcmVhdGVET01GYWN0b3J5KCdzb3VyY2UnKSxcbiAgc3BhbjogY3JlYXRlRE9NRmFjdG9yeSgnc3BhbicpLFxuICBzdHJvbmc6IGNyZWF0ZURPTUZhY3RvcnkoJ3N0cm9uZycpLFxuICBzdHlsZTogY3JlYXRlRE9NRmFjdG9yeSgnc3R5bGUnKSxcbiAgc3ViOiBjcmVhdGVET01GYWN0b3J5KCdzdWInKSxcbiAgc3VtbWFyeTogY3JlYXRlRE9NRmFjdG9yeSgnc3VtbWFyeScpLFxuICBzdXA6IGNyZWF0ZURPTUZhY3RvcnkoJ3N1cCcpLFxuICB0YWJsZTogY3JlYXRlRE9NRmFjdG9yeSgndGFibGUnKSxcbiAgdGJvZHk6IGNyZWF0ZURPTUZhY3RvcnkoJ3Rib2R5JyksXG4gIHRkOiBjcmVhdGVET01GYWN0b3J5KCd0ZCcpLFxuICB0ZXh0YXJlYTogY3JlYXRlRE9NRmFjdG9yeSgndGV4dGFyZWEnKSxcbiAgdGZvb3Q6IGNyZWF0ZURPTUZhY3RvcnkoJ3Rmb290JyksXG4gIHRoOiBjcmVhdGVET01GYWN0b3J5KCd0aCcpLFxuICB0aGVhZDogY3JlYXRlRE9NRmFjdG9yeSgndGhlYWQnKSxcbiAgdGltZTogY3JlYXRlRE9NRmFjdG9yeSgndGltZScpLFxuICB0aXRsZTogY3JlYXRlRE9NRmFjdG9yeSgndGl0bGUnKSxcbiAgdHI6IGNyZWF0ZURPTUZhY3RvcnkoJ3RyJyksXG4gIHRyYWNrOiBjcmVhdGVET01GYWN0b3J5KCd0cmFjaycpLFxuICB1OiBjcmVhdGVET01GYWN0b3J5KCd1JyksXG4gIHVsOiBjcmVhdGVET01GYWN0b3J5KCd1bCcpLFxuICAndmFyJzogY3JlYXRlRE9NRmFjdG9yeSgndmFyJyksXG4gIHZpZGVvOiBjcmVhdGVET01GYWN0b3J5KCd2aWRlbycpLFxuICB3YnI6IGNyZWF0ZURPTUZhY3RvcnkoJ3dicicpLFxuXG4gIC8vIFNWR1xuICBjaXJjbGU6IGNyZWF0ZURPTUZhY3RvcnkoJ2NpcmNsZScpLFxuICBjbGlwUGF0aDogY3JlYXRlRE9NRmFjdG9yeSgnY2xpcFBhdGgnKSxcbiAgZGVmczogY3JlYXRlRE9NRmFjdG9yeSgnZGVmcycpLFxuICBlbGxpcHNlOiBjcmVhdGVET01GYWN0b3J5KCdlbGxpcHNlJyksXG4gIGc6IGNyZWF0ZURPTUZhY3RvcnkoJ2cnKSxcbiAgaW1hZ2U6IGNyZWF0ZURPTUZhY3RvcnkoJ2ltYWdlJyksXG4gIGxpbmU6IGNyZWF0ZURPTUZhY3RvcnkoJ2xpbmUnKSxcbiAgbGluZWFyR3JhZGllbnQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2xpbmVhckdyYWRpZW50JyksXG4gIG1hc2s6IGNyZWF0ZURPTUZhY3RvcnkoJ21hc2snKSxcbiAgcGF0aDogY3JlYXRlRE9NRmFjdG9yeSgncGF0aCcpLFxuICBwYXR0ZXJuOiBjcmVhdGVET01GYWN0b3J5KCdwYXR0ZXJuJyksXG4gIHBvbHlnb246IGNyZWF0ZURPTUZhY3RvcnkoJ3BvbHlnb24nKSxcbiAgcG9seWxpbmU6IGNyZWF0ZURPTUZhY3RvcnkoJ3BvbHlsaW5lJyksXG4gIHJhZGlhbEdyYWRpZW50OiBjcmVhdGVET01GYWN0b3J5KCdyYWRpYWxHcmFkaWVudCcpLFxuICByZWN0OiBjcmVhdGVET01GYWN0b3J5KCdyZWN0JyksXG4gIHN0b3A6IGNyZWF0ZURPTUZhY3RvcnkoJ3N0b3AnKSxcbiAgc3ZnOiBjcmVhdGVET01GYWN0b3J5KCdzdmcnKSxcbiAgdGV4dDogY3JlYXRlRE9NRmFjdG9yeSgndGV4dCcpLFxuICB0c3BhbjogY3JlYXRlRE9NRmFjdG9yeSgndHNwYW4nKVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUZhY3RvcmllcztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QvbGliL1JlYWN0RE9NRmFjdG9yaWVzLmpzXG4vLyBtb2R1bGUgaWQgPSAxOTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 197 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n/**\n * ReactElementValidator provides a wrapper around a element factory\n * which validates the props passed to the element. This is intended to be\n * used only in DEV and could be replaced by a static type checker for languages\n * that support it.\n */\n\n'use strict';\n\nvar ReactCurrentOwner = __webpack_require__(182);\nvar ReactComponentTreeHook = __webpack_require__(198);\nvar ReactElement = __webpack_require__(181);\n\nvar checkReactTypeSpec = __webpack_require__(199);\n\nvar canDefineProperty = __webpack_require__(185);\nvar getIteratorFn = __webpack_require__(188);\nvar warning = __webpack_require__(183);\n\nfunction getDeclarationErrorAddendum() {\n  if (ReactCurrentOwner.current) {\n    var name = ReactCurrentOwner.current.getName();\n    if (name) {\n      return ' Check the render method of `' + name + '`.';\n    }\n  }\n  return '';\n}\n\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n  var info = getDeclarationErrorAddendum();\n\n  if (!info) {\n    var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n    if (parentName) {\n      info = ' Check the top-level render call using <' + parentName + '>.';\n    }\n  }\n  return info;\n}\n\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\nfunction validateExplicitKey(element, parentType) {\n  if (!element._store || element._store.validated || element.key != null) {\n    return;\n  }\n  element._store.validated = true;\n\n  var memoizer = ownerHasKeyUseWarning.uniqueKey || (ownerHasKeyUseWarning.uniqueKey = {});\n\n  var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n  if (memoizer[currentComponentErrorInfo]) {\n    return;\n  }\n  memoizer[currentComponentErrorInfo] = true;\n\n  // Usually the current owner is the offender, but if it accepts children as a\n  // property, it may be the creator of the child that's responsible for\n  // assigning it a key.\n  var childOwner = '';\n  if (element && element._owner && element._owner !== ReactCurrentOwner.current) {\n    // Give the component that originally created this child.\n    childOwner = ' It was passed a child from ' + element._owner.getName() + '.';\n  }\n\n   true ? warning(false, 'Each child in an array or iterator should have a unique \"key\" prop.' + '%s%s See https://fb.me/react-warning-keys for more information.%s', currentComponentErrorInfo, childOwner, ReactComponentTreeHook.getCurrentStackAddendum(element)) : void 0;\n}\n\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\nfunction validateChildKeys(node, parentType) {\n  if (typeof node !== 'object') {\n    return;\n  }\n  if (Array.isArray(node)) {\n    for (var i = 0; i < node.length; i++) {\n      var child = node[i];\n      if (ReactElement.isValidElement(child)) {\n        validateExplicitKey(child, parentType);\n      }\n    }\n  } else if (ReactElement.isValidElement(node)) {\n    // This element was passed in a valid location.\n    if (node._store) {\n      node._store.validated = true;\n    }\n  } else if (node) {\n    var iteratorFn = getIteratorFn(node);\n    // Entry iterators provide implicit keys.\n    if (iteratorFn) {\n      if (iteratorFn !== node.entries) {\n        var iterator = iteratorFn.call(node);\n        var step;\n        while (!(step = iterator.next()).done) {\n          if (ReactElement.isValidElement(step.value)) {\n            validateExplicitKey(step.value, parentType);\n          }\n        }\n      }\n    }\n  }\n}\n\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\nfunction validatePropTypes(element) {\n  var componentClass = element.type;\n  if (typeof componentClass !== 'function') {\n    return;\n  }\n  var name = componentClass.displayName || componentClass.name;\n  if (componentClass.propTypes) {\n    checkReactTypeSpec(componentClass.propTypes, element.props, 'prop', name, element, null);\n  }\n  if (typeof componentClass.getDefaultProps === 'function') {\n     true ? warning(componentClass.getDefaultProps.isReactClassApproved, 'getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.') : void 0;\n  }\n}\n\nvar ReactElementValidator = {\n\n  createElement: function (type, props, children) {\n    var validType = typeof type === 'string' || typeof type === 'function';\n    // We warn in this case but don't throw. We expect the element creation to\n    // succeed and there will likely be errors in render.\n    if (!validType) {\n      if (typeof type !== 'function' && typeof type !== 'string') {\n        var info = '';\n        if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n          info += ' You likely forgot to export your component from the file ' + 'it\\'s defined in.';\n        }\n        info += getDeclarationErrorAddendum();\n         true ? warning(false, 'React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', type == null ? type : typeof type, info) : void 0;\n      }\n    }\n\n    var element = ReactElement.createElement.apply(this, arguments);\n\n    // The result can be nullish if a mock or a custom function is used.\n    // TODO: Drop this when these are no longer allowed as the type argument.\n    if (element == null) {\n      return element;\n    }\n\n    // Skip key warning if the type isn't valid since our key validation logic\n    // doesn't expect a non-string/function type and can throw confusing errors.\n    // We don't want exception behavior to differ between dev and prod.\n    // (Rendering will throw with a helpful message and as soon as the type is\n    // fixed, the key warnings will appear.)\n    if (validType) {\n      for (var i = 2; i < arguments.length; i++) {\n        validateChildKeys(arguments[i], type);\n      }\n    }\n\n    validatePropTypes(element);\n\n    return element;\n  },\n\n  createFactory: function (type) {\n    var validatedFactory = ReactElementValidator.createElement.bind(null, type);\n    // Legacy hook TODO: Warn if this is accessed\n    validatedFactory.type = type;\n\n    if (true) {\n      if (canDefineProperty) {\n        Object.defineProperty(validatedFactory, 'type', {\n          enumerable: false,\n          get: function () {\n             true ? warning(false, 'Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.') : void 0;\n            Object.defineProperty(this, 'type', {\n              value: type\n            });\n            return type;\n          }\n        });\n      }\n    }\n\n    return validatedFactory;\n  },\n\n  cloneElement: function (element, props, children) {\n    var newElement = ReactElement.cloneElement.apply(this, arguments);\n    for (var i = 2; i < arguments.length; i++) {\n      validateChildKeys(arguments[i], newElement.type);\n    }\n    validatePropTypes(newElement);\n    return newElement;\n  }\n\n};\n\nmodule.exports = ReactElementValidator;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RFbGVtZW50VmFsaWRhdG9yLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4vKipcbiAqIFJlYWN0RWxlbWVudFZhbGlkYXRvciBwcm92aWRlcyBhIHdyYXBwZXIgYXJvdW5kIGEgZWxlbWVudCBmYWN0b3J5XG4gKiB3aGljaCB2YWxpZGF0ZXMgdGhlIHByb3BzIHBhc3NlZCB0byB0aGUgZWxlbWVudC4gVGhpcyBpcyBpbnRlbmRlZCB0byBiZVxuICogdXNlZCBvbmx5IGluIERFViBhbmQgY291bGQgYmUgcmVwbGFjZWQgYnkgYSBzdGF0aWMgdHlwZSBjaGVja2VyIGZvciBsYW5ndWFnZXNcbiAqIHRoYXQgc3VwcG9ydCBpdC5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJy4vUmVhY3RDdXJyZW50T3duZXInKTtcbnZhciBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG52YXIgUmVhY3RFbGVtZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnQnKTtcblxudmFyIGNoZWNrUmVhY3RUeXBlU3BlYyA9IHJlcXVpcmUoJy4vY2hlY2tSZWFjdFR5cGVTcGVjJyk7XG5cbnZhciBjYW5EZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vY2FuRGVmaW5lUHJvcGVydHknKTtcbnZhciBnZXRJdGVyYXRvckZuID0gcmVxdWlyZSgnLi9nZXRJdGVyYXRvckZuJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICBpZiAoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIHZhciBuYW1lID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5nZXROYW1lKCk7XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxuLyoqXG4gKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAqIHVwZGF0ZXMuXG4gKi9cbnZhciBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTtcblxuZnVuY3Rpb24gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKSB7XG4gIHZhciBpbmZvID0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG5cbiAgaWYgKCFpbmZvKSB7XG4gICAgdmFyIHBhcmVudE5hbWUgPSB0eXBlb2YgcGFyZW50VHlwZSA9PT0gJ3N0cmluZycgPyBwYXJlbnRUeXBlIDogcGFyZW50VHlwZS5kaXNwbGF5TmFtZSB8fCBwYXJlbnRUeXBlLm5hbWU7XG4gICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgIGluZm8gPSAnIENoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPCcgKyBwYXJlbnROYW1lICsgJz4uJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluZm87XG59XG5cbi8qKlxuICogV2FybiBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW4gZXhwbGljaXQga2V5IGFzc2lnbmVkIHRvIGl0LlxuICogVGhpcyBlbGVtZW50IGlzIGluIGFuIGFycmF5LiBUaGUgYXJyYXkgY291bGQgZ3JvdyBhbmQgc2hyaW5rIG9yIGJlXG4gKiByZW9yZGVyZWQuIEFsbCBjaGlsZHJlbiB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcmUgcmVxdWlyZWQgdG9cbiAqIGhhdmUgYSBcImtleVwiIHByb3BlcnR5IGFzc2lnbmVkIHRvIGl0LiBFcnJvciBzdGF0dXNlcyBhcmUgY2FjaGVkIHNvIGEgd2FybmluZ1xuICogd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IHRoYXQgcmVxdWlyZXMgYSBrZXkuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgZWxlbWVudCdzIHBhcmVudCdzIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRXhwbGljaXRLZXkoZWxlbWVudCwgcGFyZW50VHlwZSkge1xuICBpZiAoIWVsZW1lbnQuX3N0b3JlIHx8IGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCB8fCBlbGVtZW50LmtleSAhPSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG5cbiAgdmFyIG1lbW9pemVyID0gb3duZXJIYXNLZXlVc2VXYXJuaW5nLnVuaXF1ZUtleSB8fCAob3duZXJIYXNLZXlVc2VXYXJuaW5nLnVuaXF1ZUtleSA9IHt9KTtcblxuICB2YXIgY3VycmVudENvbXBvbmVudEVycm9ySW5mbyA9IGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSk7XG4gIGlmIChtZW1vaXplcltjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSkge1xuICAgIHJldHVybjtcbiAgfVxuICBtZW1vaXplcltjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSA9IHRydWU7XG5cbiAgLy8gVXN1YWxseSB0aGUgY3VycmVudCBvd25lciBpcyB0aGUgb2ZmZW5kZXIsIGJ1dCBpZiBpdCBhY2NlcHRzIGNoaWxkcmVuIGFzIGFcbiAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAvLyBhc3NpZ25pbmcgaXQgYSBrZXkuXG4gIHZhciBjaGlsZE93bmVyID0gJyc7XG4gIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX293bmVyICE9PSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgLy8gR2l2ZSB0aGUgY29tcG9uZW50IHRoYXQgb3JpZ2luYWxseSBjcmVhdGVkIHRoaXMgY2hpbGQuXG4gICAgY2hpbGRPd25lciA9ICcgSXQgd2FzIHBhc3NlZCBhIGNoaWxkIGZyb20gJyArIGVsZW1lbnQuX293bmVyLmdldE5hbWUoKSArICcuJztcbiAgfVxuXG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnRWFjaCBjaGlsZCBpbiBhbiBhcnJheSBvciBpdGVyYXRvciBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBcImtleVwiIHByb3AuJyArICclcyVzIFNlZSBodHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmcta2V5cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4lcycsIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8sIGNoaWxkT3duZXIsIFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0Q3VycmVudFN0YWNrQWRkZW5kdW0oZWxlbWVudCkpIDogdm9pZCAwO1xufVxuXG4vKipcbiAqIEVuc3VyZSB0aGF0IGV2ZXJ5IGVsZW1lbnQgZWl0aGVyIGlzIHBhc3NlZCBpbiBhIHN0YXRpYyBsb2NhdGlvbiwgaW4gYW5cbiAqIGFycmF5IHdpdGggYW4gZXhwbGljaXQga2V5cyBwcm9wZXJ0eSBkZWZpbmVkLCBvciBpbiBhbiBvYmplY3QgbGl0ZXJhbFxuICogd2l0aCB2YWxpZCBrZXkgcHJvcGVydHkuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZSBTdGF0aWNhbGx5IHBhc3NlZCBjaGlsZCBvZiBhbnkgdHlwZS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBub2RlJ3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDaGlsZEtleXMobm9kZSwgcGFyZW50VHlwZSkge1xuICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuICAgICAgaWYgKFJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShjaGlsZCwgcGFyZW50VHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKFJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgIC8vIFRoaXMgZWxlbWVudCB3YXMgcGFzc2VkIGluIGEgdmFsaWQgbG9jYXRpb24uXG4gICAgaWYgKG5vZGUuX3N0b3JlKSB7XG4gICAgICBub2RlLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChub2RlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG5vZGUpO1xuICAgIC8vIEVudHJ5IGl0ZXJhdG9ycyBwcm92aWRlIGltcGxpY2l0IGtleXMuXG4gICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICAgIGlmIChpdGVyYXRvckZuICE9PSBub2RlLmVudHJpZXMpIHtcbiAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG5vZGUpO1xuICAgICAgICB2YXIgc3RlcDtcbiAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgIGlmIChSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoc3RlcC52YWx1ZSwgcGFyZW50VHlwZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYW4gZWxlbWVudCwgdmFsaWRhdGUgdGhhdCBpdHMgcHJvcHMgZm9sbG93IHRoZSBwcm9wVHlwZXMgZGVmaW5pdGlvbixcbiAqIHByb3ZpZGVkIGJ5IHRoZSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpIHtcbiAgdmFyIGNvbXBvbmVudENsYXNzID0gZWxlbWVudC50eXBlO1xuICBpZiAodHlwZW9mIGNvbXBvbmVudENsYXNzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuYW1lID0gY29tcG9uZW50Q2xhc3MuZGlzcGxheU5hbWUgfHwgY29tcG9uZW50Q2xhc3MubmFtZTtcbiAgaWYgKGNvbXBvbmVudENsYXNzLnByb3BUeXBlcykge1xuICAgIGNoZWNrUmVhY3RUeXBlU3BlYyhjb21wb25lbnRDbGFzcy5wcm9wVHlwZXMsIGVsZW1lbnQucHJvcHMsICdwcm9wJywgbmFtZSwgZWxlbWVudCwgbnVsbCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBjb21wb25lbnRDbGFzcy5nZXREZWZhdWx0UHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhjb21wb25lbnRDbGFzcy5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQsICdnZXREZWZhdWx0UHJvcHMgaXMgb25seSB1c2VkIG9uIGNsYXNzaWMgUmVhY3QuY3JlYXRlQ2xhc3MgJyArICdkZWZpbml0aW9ucy4gVXNlIGEgc3RhdGljIHByb3BlcnR5IG5hbWVkIGBkZWZhdWx0UHJvcHNgIGluc3RlYWQuJykgOiB2b2lkIDA7XG4gIH1cbn1cblxudmFyIFJlYWN0RWxlbWVudFZhbGlkYXRvciA9IHtcblxuICBjcmVhdGVFbGVtZW50OiBmdW5jdGlvbiAodHlwZSwgcHJvcHMsIGNoaWxkcmVuKSB7XG4gICAgdmFyIHZhbGlkVHlwZSA9IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJztcbiAgICAvLyBXZSB3YXJuIGluIHRoaXMgY2FzZSBidXQgZG9uJ3QgdGhyb3cuIFdlIGV4cGVjdCB0aGUgZWxlbWVudCBjcmVhdGlvbiB0b1xuICAgIC8vIHN1Y2NlZWQgYW5kIHRoZXJlIHdpbGwgbGlrZWx5IGJlIGVycm9ycyBpbiByZW5kZXIuXG4gICAgaWYgKCF2YWxpZFR5cGUpIHtcbiAgICAgIGlmICh0eXBlb2YgdHlwZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIGluZm8gPSAnJztcbiAgICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBpbmZvICs9ICcgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgJyArICdpdFxcJ3MgZGVmaW5lZCBpbi4nO1xuICAgICAgICB9XG4gICAgICAgIGluZm8gKz0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnUmVhY3QuY3JlYXRlRWxlbWVudDogdHlwZSBpcyBpbnZhbGlkIC0tIGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgJyArICdidWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlICcgKyAnY29tcG9uZW50cykgYnV0IGdvdDogJXMuJXMnLCB0eXBlID09IG51bGwgPyB0eXBlIDogdHlwZW9mIHR5cGUsIGluZm8pIDogdm9pZCAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBlbGVtZW50ID0gUmVhY3RFbGVtZW50LmNyZWF0ZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIC8vIFRoZSByZXN1bHQgY2FuIGJlIG51bGxpc2ggaWYgYSBtb2NrIG9yIGEgY3VzdG9tIGZ1bmN0aW9uIGlzIHVzZWQuXG4gICAgLy8gVE9ETzogRHJvcCB0aGlzIHdoZW4gdGhlc2UgYXJlIG5vIGxvbmdlciBhbGxvd2VkIGFzIHRoZSB0eXBlIGFyZ3VtZW50LlxuICAgIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8vIFNraXAga2V5IHdhcm5pbmcgaWYgdGhlIHR5cGUgaXNuJ3QgdmFsaWQgc2luY2Ugb3VyIGtleSB2YWxpZGF0aW9uIGxvZ2ljXG4gICAgLy8gZG9lc24ndCBleHBlY3QgYSBub24tc3RyaW5nL2Z1bmN0aW9uIHR5cGUgYW5kIGNhbiB0aHJvdyBjb25mdXNpbmcgZXJyb3JzLlxuICAgIC8vIFdlIGRvbid0IHdhbnQgZXhjZXB0aW9uIGJlaGF2aW9yIHRvIGRpZmZlciBiZXR3ZWVuIGRldiBhbmQgcHJvZC5cbiAgICAvLyAoUmVuZGVyaW5nIHdpbGwgdGhyb3cgd2l0aCBhIGhlbHBmdWwgbWVzc2FnZSBhbmQgYXMgc29vbiBhcyB0aGUgdHlwZSBpc1xuICAgIC8vIGZpeGVkLCB0aGUga2V5IHdhcm5pbmdzIHdpbGwgYXBwZWFyLilcbiAgICBpZiAodmFsaWRUeXBlKSB7XG4gICAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIHR5cGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH0sXG5cbiAgY3JlYXRlRmFjdG9yeTogZnVuY3Rpb24gKHR5cGUpIHtcbiAgICB2YXIgdmFsaWRhdGVkRmFjdG9yeSA9IFJlYWN0RWxlbWVudFZhbGlkYXRvci5jcmVhdGVFbGVtZW50LmJpbmQobnVsbCwgdHlwZSk7XG4gICAgLy8gTGVnYWN5IGhvb2sgVE9ETzogV2FybiBpZiB0aGlzIGlzIGFjY2Vzc2VkXG4gICAgdmFsaWRhdGVkRmFjdG9yeS50eXBlID0gdHlwZTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoY2FuRGVmaW5lUHJvcGVydHkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZhbGlkYXRlZEZhY3RvcnksICd0eXBlJywge1xuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdGYWN0b3J5LnR5cGUgaXMgZGVwcmVjYXRlZC4gQWNjZXNzIHRoZSBjbGFzcyBkaXJlY3RseSAnICsgJ2JlZm9yZSBwYXNzaW5nIGl0IHRvIGNyZWF0ZUZhY3RvcnkuJykgOiB2b2lkIDA7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3R5cGUnLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiB0eXBlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRlZEZhY3Rvcnk7XG4gIH0sXG5cbiAgY2xvbmVFbGVtZW50OiBmdW5jdGlvbiAoZWxlbWVudCwgcHJvcHMsIGNoaWxkcmVuKSB7XG4gICAgdmFyIG5ld0VsZW1lbnQgPSBSZWFjdEVsZW1lbnQuY2xvbmVFbGVtZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGFyZ3VtZW50c1tpXSwgbmV3RWxlbWVudC50eXBlKTtcbiAgICB9XG4gICAgdmFsaWRhdGVQcm9wVHlwZXMobmV3RWxlbWVudCk7XG4gICAgcmV0dXJuIG5ld0VsZW1lbnQ7XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEVsZW1lbnRWYWxpZGF0b3I7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0L2xpYi9SZWFjdEVsZW1lbnRWYWxpZGF0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDE5N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 198 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2016-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(179);\n\nvar ReactCurrentOwner = __webpack_require__(182);\n\nvar invariant = __webpack_require__(180);\nvar warning = __webpack_require__(183);\n\nfunction isNative(fn) {\n  // Based on isNative() from Lodash\n  var funcToString = Function.prototype.toString;\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n  var reIsNative = RegExp('^' + funcToString\n  // Take an example native function source for comparison\n  .call(hasOwnProperty)\n  // Strip regex characters so we can use it for regex\n  .replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&')\n  // Remove hasOwnProperty from the template to make it generic\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$');\n  try {\n    var source = funcToString.call(fn);\n    return reIsNative.test(source);\n  } catch (err) {\n    return false;\n  }\n}\n\nvar canUseCollections =\n// Array.from\ntypeof Array.from === 'function' &&\n// Map\ntypeof Map === 'function' && isNative(Map) &&\n// Map.prototype.keys\nMap.prototype != null && typeof Map.prototype.keys === 'function' && isNative(Map.prototype.keys) &&\n// Set\ntypeof Set === 'function' && isNative(Set) &&\n// Set.prototype.keys\nSet.prototype != null && typeof Set.prototype.keys === 'function' && isNative(Set.prototype.keys);\n\nvar setItem;\nvar getItem;\nvar removeItem;\nvar getItemIDs;\nvar addRoot;\nvar removeRoot;\nvar getRootIDs;\n\nif (canUseCollections) {\n  var itemMap = new Map();\n  var rootIDSet = new Set();\n\n  setItem = function (id, item) {\n    itemMap.set(id, item);\n  };\n  getItem = function (id) {\n    return itemMap.get(id);\n  };\n  removeItem = function (id) {\n    itemMap['delete'](id);\n  };\n  getItemIDs = function () {\n    return Array.from(itemMap.keys());\n  };\n\n  addRoot = function (id) {\n    rootIDSet.add(id);\n  };\n  removeRoot = function (id) {\n    rootIDSet['delete'](id);\n  };\n  getRootIDs = function () {\n    return Array.from(rootIDSet.keys());\n  };\n} else {\n  var itemByKey = {};\n  var rootByKey = {};\n\n  // Use non-numeric keys to prevent V8 performance issues:\n  // https://github.com/facebook/react/pull/7232\n  var getKeyFromID = function (id) {\n    return '.' + id;\n  };\n  var getIDFromKey = function (key) {\n    return parseInt(key.substr(1), 10);\n  };\n\n  setItem = function (id, item) {\n    var key = getKeyFromID(id);\n    itemByKey[key] = item;\n  };\n  getItem = function (id) {\n    var key = getKeyFromID(id);\n    return itemByKey[key];\n  };\n  removeItem = function (id) {\n    var key = getKeyFromID(id);\n    delete itemByKey[key];\n  };\n  getItemIDs = function () {\n    return Object.keys(itemByKey).map(getIDFromKey);\n  };\n\n  addRoot = function (id) {\n    var key = getKeyFromID(id);\n    rootByKey[key] = true;\n  };\n  removeRoot = function (id) {\n    var key = getKeyFromID(id);\n    delete rootByKey[key];\n  };\n  getRootIDs = function () {\n    return Object.keys(rootByKey).map(getIDFromKey);\n  };\n}\n\nvar unmountedIDs = [];\n\nfunction purgeDeep(id) {\n  var item = getItem(id);\n  if (item) {\n    var childIDs = item.childIDs;\n\n    removeItem(id);\n    childIDs.forEach(purgeDeep);\n  }\n}\n\nfunction describeComponentFrame(name, source, ownerName) {\n  return '\\n    in ' + (name || 'Unknown') + (source ? ' (at ' + source.fileName.replace(/^.*[\\\\\\/]/, '') + ':' + source.lineNumber + ')' : ownerName ? ' (created by ' + ownerName + ')' : '');\n}\n\nfunction getDisplayName(element) {\n  if (element == null) {\n    return '#empty';\n  } else if (typeof element === 'string' || typeof element === 'number') {\n    return '#text';\n  } else if (typeof element.type === 'string') {\n    return element.type;\n  } else {\n    return element.type.displayName || element.type.name || 'Unknown';\n  }\n}\n\nfunction describeID(id) {\n  var name = ReactComponentTreeHook.getDisplayName(id);\n  var element = ReactComponentTreeHook.getElement(id);\n  var ownerID = ReactComponentTreeHook.getOwnerID(id);\n  var ownerName;\n  if (ownerID) {\n    ownerName = ReactComponentTreeHook.getDisplayName(ownerID);\n  }\n   true ? warning(element, 'ReactComponentTreeHook: Missing React element for debugID %s when ' + 'building stack', id) : void 0;\n  return describeComponentFrame(name, element && element._source, ownerName);\n}\n\nvar ReactComponentTreeHook = {\n  onSetChildren: function (id, nextChildIDs) {\n    var item = getItem(id);\n    !item ?  true ? invariant(false, 'Item must have been set') : _prodInvariant('144') : void 0;\n    item.childIDs = nextChildIDs;\n\n    for (var i = 0; i < nextChildIDs.length; i++) {\n      var nextChildID = nextChildIDs[i];\n      var nextChild = getItem(nextChildID);\n      !nextChild ?  true ? invariant(false, 'Expected hook events to fire for the child before its parent includes it in onSetChildren().') : _prodInvariant('140') : void 0;\n      !(nextChild.childIDs != null || typeof nextChild.element !== 'object' || nextChild.element == null) ?  true ? invariant(false, 'Expected onSetChildren() to fire for a container child before its parent includes it in onSetChildren().') : _prodInvariant('141') : void 0;\n      !nextChild.isMounted ?  true ? invariant(false, 'Expected onMountComponent() to fire for the child before its parent includes it in onSetChildren().') : _prodInvariant('71') : void 0;\n      if (nextChild.parentID == null) {\n        nextChild.parentID = id;\n        // TODO: This shouldn't be necessary but mounting a new root during in\n        // componentWillMount currently causes not-yet-mounted components to\n        // be purged from our tree data so their parent id is missing.\n      }\n      !(nextChild.parentID === id) ?  true ? invariant(false, 'Expected onBeforeMountComponent() parent and onSetChildren() to be consistent (%s has parents %s and %s).', nextChildID, nextChild.parentID, id) : _prodInvariant('142', nextChildID, nextChild.parentID, id) : void 0;\n    }\n  },\n  onBeforeMountComponent: function (id, element, parentID) {\n    var item = {\n      element: element,\n      parentID: parentID,\n      text: null,\n      childIDs: [],\n      isMounted: false,\n      updateCount: 0\n    };\n    setItem(id, item);\n  },\n  onBeforeUpdateComponent: function (id, element) {\n    var item = getItem(id);\n    if (!item || !item.isMounted) {\n      // We may end up here as a result of setState() in componentWillUnmount().\n      // In this case, ignore the element.\n      return;\n    }\n    item.element = element;\n  },\n  onMountComponent: function (id) {\n    var item = getItem(id);\n    !item ?  true ? invariant(false, 'Item must have been set') : _prodInvariant('144') : void 0;\n    item.isMounted = true;\n    var isRoot = item.parentID === 0;\n    if (isRoot) {\n      addRoot(id);\n    }\n  },\n  onUpdateComponent: function (id) {\n    var item = getItem(id);\n    if (!item || !item.isMounted) {\n      // We may end up here as a result of setState() in componentWillUnmount().\n      // In this case, ignore the element.\n      return;\n    }\n    item.updateCount++;\n  },\n  onUnmountComponent: function (id) {\n    var item = getItem(id);\n    if (item) {\n      // We need to check if it exists.\n      // `item` might not exist if it is inside an error boundary, and a sibling\n      // error boundary child threw while mounting. Then this instance never\n      // got a chance to mount, but it still gets an unmounting event during\n      // the error boundary cleanup.\n      item.isMounted = false;\n      var isRoot = item.parentID === 0;\n      if (isRoot) {\n        removeRoot(id);\n      }\n    }\n    unmountedIDs.push(id);\n  },\n  purgeUnmountedComponents: function () {\n    if (ReactComponentTreeHook._preventPurging) {\n      // Should only be used for testing.\n      return;\n    }\n\n    for (var i = 0; i < unmountedIDs.length; i++) {\n      var id = unmountedIDs[i];\n      purgeDeep(id);\n    }\n    unmountedIDs.length = 0;\n  },\n  isMounted: function (id) {\n    var item = getItem(id);\n    return item ? item.isMounted : false;\n  },\n  getCurrentStackAddendum: function (topElement) {\n    var info = '';\n    if (topElement) {\n      var name = getDisplayName(topElement);\n      var owner = topElement._owner;\n      info += describeComponentFrame(name, topElement._source, owner && owner.getName());\n    }\n\n    var currentOwner = ReactCurrentOwner.current;\n    var id = currentOwner && currentOwner._debugID;\n\n    info += ReactComponentTreeHook.getStackAddendumByID(id);\n    return info;\n  },\n  getStackAddendumByID: function (id) {\n    var info = '';\n    while (id) {\n      info += describeID(id);\n      id = ReactComponentTreeHook.getParentID(id);\n    }\n    return info;\n  },\n  getChildIDs: function (id) {\n    var item = getItem(id);\n    return item ? item.childIDs : [];\n  },\n  getDisplayName: function (id) {\n    var element = ReactComponentTreeHook.getElement(id);\n    if (!element) {\n      return null;\n    }\n    return getDisplayName(element);\n  },\n  getElement: function (id) {\n    var item = getItem(id);\n    return item ? item.element : null;\n  },\n  getOwnerID: function (id) {\n    var element = ReactComponentTreeHook.getElement(id);\n    if (!element || !element._owner) {\n      return null;\n    }\n    return element._owner._debugID;\n  },\n  getParentID: function (id) {\n    var item = getItem(id);\n    return item ? item.parentID : null;\n  },\n  getSource: function (id) {\n    var item = getItem(id);\n    var element = item ? item.element : null;\n    var source = element != null ? element._source : null;\n    return source;\n  },\n  getText: function (id) {\n    var element = ReactComponentTreeHook.getElement(id);\n    if (typeof element === 'string') {\n      return element;\n    } else if (typeof element === 'number') {\n      return '' + element;\n    } else {\n      return null;\n    }\n  },\n  getUpdateCount: function (id) {\n    var item = getItem(id);\n    return item ? item.updateCount : 0;\n  },\n\n\n  getRootIDs: getRootIDs,\n  getRegisteredIDs: getItemIDs\n};\n\nmodule.exports = ReactComponentTreeHook;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RDb21wb25lbnRUcmVlSG9vay5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDE2LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJy4vUmVhY3RDdXJyZW50T3duZXInKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbmZ1bmN0aW9uIGlzTmF0aXZlKGZuKSB7XG4gIC8vIEJhc2VkIG9uIGlzTmF0aXZlKCkgZnJvbSBMb2Rhc2hcbiAgdmFyIGZ1bmNUb1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbiAgdmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICsgZnVuY1RvU3RyaW5nXG4gIC8vIFRha2UgYW4gZXhhbXBsZSBuYXRpdmUgZnVuY3Rpb24gc291cmNlIGZvciBjb21wYXJpc29uXG4gIC5jYWxsKGhhc093blByb3BlcnR5KVxuICAvLyBTdHJpcCByZWdleCBjaGFyYWN0ZXJzIHNvIHdlIGNhbiB1c2UgaXQgZm9yIHJlZ2V4XG4gIC5yZXBsYWNlKC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZywgJ1xcXFwkJicpXG4gIC8vIFJlbW92ZSBoYXNPd25Qcm9wZXJ0eSBmcm9tIHRoZSB0ZW1wbGF0ZSB0byBtYWtlIGl0IGdlbmVyaWNcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnKTtcbiAgdHJ5IHtcbiAgICB2YXIgc291cmNlID0gZnVuY1RvU3RyaW5nLmNhbGwoZm4pO1xuICAgIHJldHVybiByZUlzTmF0aXZlLnRlc3Qoc291cmNlKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbnZhciBjYW5Vc2VDb2xsZWN0aW9ucyA9XG4vLyBBcnJheS5mcm9tXG50eXBlb2YgQXJyYXkuZnJvbSA9PT0gJ2Z1bmN0aW9uJyAmJlxuLy8gTWFwXG50eXBlb2YgTWFwID09PSAnZnVuY3Rpb24nICYmIGlzTmF0aXZlKE1hcCkgJiZcbi8vIE1hcC5wcm90b3R5cGUua2V5c1xuTWFwLnByb3RvdHlwZSAhPSBudWxsICYmIHR5cGVvZiBNYXAucHJvdG90eXBlLmtleXMgPT09ICdmdW5jdGlvbicgJiYgaXNOYXRpdmUoTWFwLnByb3RvdHlwZS5rZXlzKSAmJlxuLy8gU2V0XG50eXBlb2YgU2V0ID09PSAnZnVuY3Rpb24nICYmIGlzTmF0aXZlKFNldCkgJiZcbi8vIFNldC5wcm90b3R5cGUua2V5c1xuU2V0LnByb3RvdHlwZSAhPSBudWxsICYmIHR5cGVvZiBTZXQucHJvdG90eXBlLmtleXMgPT09ICdmdW5jdGlvbicgJiYgaXNOYXRpdmUoU2V0LnByb3RvdHlwZS5rZXlzKTtcblxudmFyIHNldEl0ZW07XG52YXIgZ2V0SXRlbTtcbnZhciByZW1vdmVJdGVtO1xudmFyIGdldEl0ZW1JRHM7XG52YXIgYWRkUm9vdDtcbnZhciByZW1vdmVSb290O1xudmFyIGdldFJvb3RJRHM7XG5cbmlmIChjYW5Vc2VDb2xsZWN0aW9ucykge1xuICB2YXIgaXRlbU1hcCA9IG5ldyBNYXAoKTtcbiAgdmFyIHJvb3RJRFNldCA9IG5ldyBTZXQoKTtcblxuICBzZXRJdGVtID0gZnVuY3Rpb24gKGlkLCBpdGVtKSB7XG4gICAgaXRlbU1hcC5zZXQoaWQsIGl0ZW0pO1xuICB9O1xuICBnZXRJdGVtID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgcmV0dXJuIGl0ZW1NYXAuZ2V0KGlkKTtcbiAgfTtcbiAgcmVtb3ZlSXRlbSA9IGZ1bmN0aW9uIChpZCkge1xuICAgIGl0ZW1NYXBbJ2RlbGV0ZSddKGlkKTtcbiAgfTtcbiAgZ2V0SXRlbUlEcyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShpdGVtTWFwLmtleXMoKSk7XG4gIH07XG5cbiAgYWRkUm9vdCA9IGZ1bmN0aW9uIChpZCkge1xuICAgIHJvb3RJRFNldC5hZGQoaWQpO1xuICB9O1xuICByZW1vdmVSb290ID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgcm9vdElEU2V0WydkZWxldGUnXShpZCk7XG4gIH07XG4gIGdldFJvb3RJRHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20ocm9vdElEU2V0LmtleXMoKSk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgaXRlbUJ5S2V5ID0ge307XG4gIHZhciByb290QnlLZXkgPSB7fTtcblxuICAvLyBVc2Ugbm9uLW51bWVyaWMga2V5cyB0byBwcmV2ZW50IFY4IHBlcmZvcm1hbmNlIGlzc3VlczpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNzIzMlxuICB2YXIgZ2V0S2V5RnJvbUlEID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgcmV0dXJuICcuJyArIGlkO1xuICB9O1xuICB2YXIgZ2V0SURGcm9tS2V5ID0gZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBwYXJzZUludChrZXkuc3Vic3RyKDEpLCAxMCk7XG4gIH07XG5cbiAgc2V0SXRlbSA9IGZ1bmN0aW9uIChpZCwgaXRlbSkge1xuICAgIHZhciBrZXkgPSBnZXRLZXlGcm9tSUQoaWQpO1xuICAgIGl0ZW1CeUtleVtrZXldID0gaXRlbTtcbiAgfTtcbiAgZ2V0SXRlbSA9IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBrZXkgPSBnZXRLZXlGcm9tSUQoaWQpO1xuICAgIHJldHVybiBpdGVtQnlLZXlba2V5XTtcbiAgfTtcbiAgcmVtb3ZlSXRlbSA9IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBrZXkgPSBnZXRLZXlGcm9tSUQoaWQpO1xuICAgIGRlbGV0ZSBpdGVtQnlLZXlba2V5XTtcbiAgfTtcbiAgZ2V0SXRlbUlEcyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoaXRlbUJ5S2V5KS5tYXAoZ2V0SURGcm9tS2V5KTtcbiAgfTtcblxuICBhZGRSb290ID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGtleSA9IGdldEtleUZyb21JRChpZCk7XG4gICAgcm9vdEJ5S2V5W2tleV0gPSB0cnVlO1xuICB9O1xuICByZW1vdmVSb290ID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGtleSA9IGdldEtleUZyb21JRChpZCk7XG4gICAgZGVsZXRlIHJvb3RCeUtleVtrZXldO1xuICB9O1xuICBnZXRSb290SURzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhyb290QnlLZXkpLm1hcChnZXRJREZyb21LZXkpO1xuICB9O1xufVxuXG52YXIgdW5tb3VudGVkSURzID0gW107XG5cbmZ1bmN0aW9uIHB1cmdlRGVlcChpZCkge1xuICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpO1xuICBpZiAoaXRlbSkge1xuICAgIHZhciBjaGlsZElEcyA9IGl0ZW0uY2hpbGRJRHM7XG5cbiAgICByZW1vdmVJdGVtKGlkKTtcbiAgICBjaGlsZElEcy5mb3JFYWNoKHB1cmdlRGVlcCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVDb21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyTmFtZSkge1xuICByZXR1cm4gJ1xcbiAgICBpbiAnICsgKG5hbWUgfHwgJ1Vua25vd24nKSArIChzb3VyY2UgPyAnIChhdCAnICsgc291cmNlLmZpbGVOYW1lLnJlcGxhY2UoL14uKltcXFxcXFwvXS8sICcnKSArICc6JyArIHNvdXJjZS5saW5lTnVtYmVyICsgJyknIDogb3duZXJOYW1lID8gJyAoY3JlYXRlZCBieSAnICsgb3duZXJOYW1lICsgJyknIDogJycpO1xufVxuXG5mdW5jdGlvbiBnZXREaXNwbGF5TmFtZShlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gJyNlbXB0eSc7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBlbGVtZW50ID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiAnI3RleHQnO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50LnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQudHlwZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZWxlbWVudC50eXBlLmRpc3BsYXlOYW1lIHx8IGVsZW1lbnQudHlwZS5uYW1lIHx8ICdVbmtub3duJztcbiAgfVxufVxuXG5mdW5jdGlvbiBkZXNjcmliZUlEKGlkKSB7XG4gIHZhciBuYW1lID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXREaXNwbGF5TmFtZShpZCk7XG4gIHZhciBlbGVtZW50ID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRFbGVtZW50KGlkKTtcbiAgdmFyIG93bmVySUQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldE93bmVySUQoaWQpO1xuICB2YXIgb3duZXJOYW1lO1xuICBpZiAob3duZXJJRCkge1xuICAgIG93bmVyTmFtZSA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RGlzcGxheU5hbWUob3duZXJJRCk7XG4gIH1cbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZWxlbWVudCwgJ1JlYWN0Q29tcG9uZW50VHJlZUhvb2s6IE1pc3NpbmcgUmVhY3QgZWxlbWVudCBmb3IgZGVidWdJRCAlcyB3aGVuICcgKyAnYnVpbGRpbmcgc3RhY2snLCBpZCkgOiB2b2lkIDA7XG4gIHJldHVybiBkZXNjcmliZUNvbXBvbmVudEZyYW1lKG5hbWUsIGVsZW1lbnQgJiYgZWxlbWVudC5fc291cmNlLCBvd25lck5hbWUpO1xufVxuXG52YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHtcbiAgb25TZXRDaGlsZHJlbjogZnVuY3Rpb24gKGlkLCBuZXh0Q2hpbGRJRHMpIHtcbiAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpO1xuICAgICFpdGVtID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0l0ZW0gbXVzdCBoYXZlIGJlZW4gc2V0JykgOiBfcHJvZEludmFyaWFudCgnMTQ0JykgOiB2b2lkIDA7XG4gICAgaXRlbS5jaGlsZElEcyA9IG5leHRDaGlsZElEcztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV4dENoaWxkSURzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbmV4dENoaWxkSUQgPSBuZXh0Q2hpbGRJRHNbaV07XG4gICAgICB2YXIgbmV4dENoaWxkID0gZ2V0SXRlbShuZXh0Q2hpbGRJRCk7XG4gICAgICAhbmV4dENoaWxkID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V4cGVjdGVkIGhvb2sgZXZlbnRzIHRvIGZpcmUgZm9yIHRoZSBjaGlsZCBiZWZvcmUgaXRzIHBhcmVudCBpbmNsdWRlcyBpdCBpbiBvblNldENoaWxkcmVuKCkuJykgOiBfcHJvZEludmFyaWFudCgnMTQwJykgOiB2b2lkIDA7XG4gICAgICAhKG5leHRDaGlsZC5jaGlsZElEcyAhPSBudWxsIHx8IHR5cGVvZiBuZXh0Q2hpbGQuZWxlbWVudCAhPT0gJ29iamVjdCcgfHwgbmV4dENoaWxkLmVsZW1lbnQgPT0gbnVsbCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgb25TZXRDaGlsZHJlbigpIHRvIGZpcmUgZm9yIGEgY29udGFpbmVyIGNoaWxkIGJlZm9yZSBpdHMgcGFyZW50IGluY2x1ZGVzIGl0IGluIG9uU2V0Q2hpbGRyZW4oKS4nKSA6IF9wcm9kSW52YXJpYW50KCcxNDEnKSA6IHZvaWQgMDtcbiAgICAgICFuZXh0Q2hpbGQuaXNNb3VudGVkID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V4cGVjdGVkIG9uTW91bnRDb21wb25lbnQoKSB0byBmaXJlIGZvciB0aGUgY2hpbGQgYmVmb3JlIGl0cyBwYXJlbnQgaW5jbHVkZXMgaXQgaW4gb25TZXRDaGlsZHJlbigpLicpIDogX3Byb2RJbnZhcmlhbnQoJzcxJykgOiB2b2lkIDA7XG4gICAgICBpZiAobmV4dENoaWxkLnBhcmVudElEID09IG51bGwpIHtcbiAgICAgICAgbmV4dENoaWxkLnBhcmVudElEID0gaWQ7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSBidXQgbW91bnRpbmcgYSBuZXcgcm9vdCBkdXJpbmcgaW5cbiAgICAgICAgLy8gY29tcG9uZW50V2lsbE1vdW50IGN1cnJlbnRseSBjYXVzZXMgbm90LXlldC1tb3VudGVkIGNvbXBvbmVudHMgdG9cbiAgICAgICAgLy8gYmUgcHVyZ2VkIGZyb20gb3VyIHRyZWUgZGF0YSBzbyB0aGVpciBwYXJlbnQgaWQgaXMgbWlzc2luZy5cbiAgICAgIH1cbiAgICAgICEobmV4dENoaWxkLnBhcmVudElEID09PSBpZCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgb25CZWZvcmVNb3VudENvbXBvbmVudCgpIHBhcmVudCBhbmQgb25TZXRDaGlsZHJlbigpIHRvIGJlIGNvbnNpc3RlbnQgKCVzIGhhcyBwYXJlbnRzICVzIGFuZCAlcykuJywgbmV4dENoaWxkSUQsIG5leHRDaGlsZC5wYXJlbnRJRCwgaWQpIDogX3Byb2RJbnZhcmlhbnQoJzE0MicsIG5leHRDaGlsZElELCBuZXh0Q2hpbGQucGFyZW50SUQsIGlkKSA6IHZvaWQgMDtcbiAgICB9XG4gIH0sXG4gIG9uQmVmb3JlTW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChpZCwgZWxlbWVudCwgcGFyZW50SUQpIHtcbiAgICB2YXIgaXRlbSA9IHtcbiAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICBwYXJlbnRJRDogcGFyZW50SUQsXG4gICAgICB0ZXh0OiBudWxsLFxuICAgICAgY2hpbGRJRHM6IFtdLFxuICAgICAgaXNNb3VudGVkOiBmYWxzZSxcbiAgICAgIHVwZGF0ZUNvdW50OiAwXG4gICAgfTtcbiAgICBzZXRJdGVtKGlkLCBpdGVtKTtcbiAgfSxcbiAgb25CZWZvcmVVcGRhdGVDb21wb25lbnQ6IGZ1bmN0aW9uIChpZCwgZWxlbWVudCkge1xuICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7XG4gICAgaWYgKCFpdGVtIHx8ICFpdGVtLmlzTW91bnRlZCkge1xuICAgICAgLy8gV2UgbWF5IGVuZCB1cCBoZXJlIGFzIGEgcmVzdWx0IG9mIHNldFN0YXRlKCkgaW4gY29tcG9uZW50V2lsbFVubW91bnQoKS5cbiAgICAgIC8vIEluIHRoaXMgY2FzZSwgaWdub3JlIHRoZSBlbGVtZW50LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtLmVsZW1lbnQgPSBlbGVtZW50O1xuICB9LFxuICBvbk1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpO1xuICAgICFpdGVtID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0l0ZW0gbXVzdCBoYXZlIGJlZW4gc2V0JykgOiBfcHJvZEludmFyaWFudCgnMTQ0JykgOiB2b2lkIDA7XG4gICAgaXRlbS5pc01vdW50ZWQgPSB0cnVlO1xuICAgIHZhciBpc1Jvb3QgPSBpdGVtLnBhcmVudElEID09PSAwO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIGFkZFJvb3QoaWQpO1xuICAgIH1cbiAgfSxcbiAgb25VcGRhdGVDb21wb25lbnQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7XG4gICAgaWYgKCFpdGVtIHx8ICFpdGVtLmlzTW91bnRlZCkge1xuICAgICAgLy8gV2UgbWF5IGVuZCB1cCBoZXJlIGFzIGEgcmVzdWx0IG9mIHNldFN0YXRlKCkgaW4gY29tcG9uZW50V2lsbFVubW91bnQoKS5cbiAgICAgIC8vIEluIHRoaXMgY2FzZSwgaWdub3JlIHRoZSBlbGVtZW50LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtLnVwZGF0ZUNvdW50Kys7XG4gIH0sXG4gIG9uVW5tb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTtcbiAgICBpZiAoaXRlbSkge1xuICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayBpZiBpdCBleGlzdHMuXG4gICAgICAvLyBgaXRlbWAgbWlnaHQgbm90IGV4aXN0IGlmIGl0IGlzIGluc2lkZSBhbiBlcnJvciBib3VuZGFyeSwgYW5kIGEgc2libGluZ1xuICAgICAgLy8gZXJyb3IgYm91bmRhcnkgY2hpbGQgdGhyZXcgd2hpbGUgbW91bnRpbmcuIFRoZW4gdGhpcyBpbnN0YW5jZSBuZXZlclxuICAgICAgLy8gZ290IGEgY2hhbmNlIHRvIG1vdW50LCBidXQgaXQgc3RpbGwgZ2V0cyBhbiB1bm1vdW50aW5nIGV2ZW50IGR1cmluZ1xuICAgICAgLy8gdGhlIGVycm9yIGJvdW5kYXJ5IGNsZWFudXAuXG4gICAgICBpdGVtLmlzTW91bnRlZCA9IGZhbHNlO1xuICAgICAgdmFyIGlzUm9vdCA9IGl0ZW0ucGFyZW50SUQgPT09IDA7XG4gICAgICBpZiAoaXNSb290KSB7XG4gICAgICAgIHJlbW92ZVJvb3QoaWQpO1xuICAgICAgfVxuICAgIH1cbiAgICB1bm1vdW50ZWRJRHMucHVzaChpZCk7XG4gIH0sXG4gIHB1cmdlVW5tb3VudGVkQ29tcG9uZW50czogZnVuY3Rpb24gKCkge1xuICAgIGlmIChSZWFjdENvbXBvbmVudFRyZWVIb29rLl9wcmV2ZW50UHVyZ2luZykge1xuICAgICAgLy8gU2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgdGVzdGluZy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHVubW91bnRlZElEcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkID0gdW5tb3VudGVkSURzW2ldO1xuICAgICAgcHVyZ2VEZWVwKGlkKTtcbiAgICB9XG4gICAgdW5tb3VudGVkSURzLmxlbmd0aCA9IDA7XG4gIH0sXG4gIGlzTW91bnRlZDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTtcbiAgICByZXR1cm4gaXRlbSA/IGl0ZW0uaXNNb3VudGVkIDogZmFsc2U7XG4gIH0sXG4gIGdldEN1cnJlbnRTdGFja0FkZGVuZHVtOiBmdW5jdGlvbiAodG9wRWxlbWVudCkge1xuICAgIHZhciBpbmZvID0gJyc7XG4gICAgaWYgKHRvcEVsZW1lbnQpIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0RGlzcGxheU5hbWUodG9wRWxlbWVudCk7XG4gICAgICB2YXIgb3duZXIgPSB0b3BFbGVtZW50Ll9vd25lcjtcbiAgICAgIGluZm8gKz0gZGVzY3JpYmVDb21wb25lbnRGcmFtZShuYW1lLCB0b3BFbGVtZW50Ll9zb3VyY2UsIG93bmVyICYmIG93bmVyLmdldE5hbWUoKSk7XG4gICAgfVxuXG4gICAgdmFyIGN1cnJlbnRPd25lciA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ7XG4gICAgdmFyIGlkID0gY3VycmVudE93bmVyICYmIGN1cnJlbnRPd25lci5fZGVidWdJRDtcblxuICAgIGluZm8gKz0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChpZCk7XG4gICAgcmV0dXJuIGluZm87XG4gIH0sXG4gIGdldFN0YWNrQWRkZW5kdW1CeUlEOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaW5mbyA9ICcnO1xuICAgIHdoaWxlIChpZCkge1xuICAgICAgaW5mbyArPSBkZXNjcmliZUlEKGlkKTtcbiAgICAgIGlkID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRQYXJlbnRJRChpZCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9LFxuICBnZXRDaGlsZElEczogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTtcbiAgICByZXR1cm4gaXRlbSA/IGl0ZW0uY2hpbGRJRHMgOiBbXTtcbiAgfSxcbiAgZ2V0RGlzcGxheU5hbWU6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBlbGVtZW50ID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRFbGVtZW50KGlkKTtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0RGlzcGxheU5hbWUoZWxlbWVudCk7XG4gIH0sXG4gIGdldEVsZW1lbnQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7XG4gICAgcmV0dXJuIGl0ZW0gPyBpdGVtLmVsZW1lbnQgOiBudWxsO1xuICB9LFxuICBnZXRPd25lcklEOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgZWxlbWVudCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RWxlbWVudChpZCk7XG4gICAgaWYgKCFlbGVtZW50IHx8ICFlbGVtZW50Ll9vd25lcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50Ll9vd25lci5fZGVidWdJRDtcbiAgfSxcbiAgZ2V0UGFyZW50SUQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7XG4gICAgcmV0dXJuIGl0ZW0gPyBpdGVtLnBhcmVudElEIDogbnVsbDtcbiAgfSxcbiAgZ2V0U291cmNlOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbSA/IGl0ZW0uZWxlbWVudCA6IG51bGw7XG4gICAgdmFyIHNvdXJjZSA9IGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQuX3NvdXJjZSA6IG51bGw7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfSxcbiAgZ2V0VGV4dDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEVsZW1lbnQoaWQpO1xuICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gJycgKyBlbGVtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sXG4gIGdldFVwZGF0ZUNvdW50OiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpO1xuICAgIHJldHVybiBpdGVtID8gaXRlbS51cGRhdGVDb3VudCA6IDA7XG4gIH0sXG5cblxuICBnZXRSb290SURzOiBnZXRSb290SURzLFxuICBnZXRSZWdpc3RlcmVkSURzOiBnZXRJdGVtSURzXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2s7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rLmpzXG4vLyBtb2R1bGUgaWQgPSAxOThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 199 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(process) {/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(179);\n\nvar ReactPropTypeLocationNames = __webpack_require__(195);\nvar ReactPropTypesSecret = __webpack_require__(201);\n\nvar invariant = __webpack_require__(180);\nvar warning = __webpack_require__(183);\n\nvar ReactComponentTreeHook;\n\nif (typeof process !== 'undefined' && process.env && (\"development\") === 'test') {\n  // Temporary hack.\n  // Inline requires don't work well with Jest:\n  // https://github.com/facebook/react/issues/7240\n  // Remove the inline requires when we don't need them anymore:\n  // https://github.com/facebook/react/pull/7178\n  ReactComponentTreeHook = __webpack_require__(198);\n}\n\nvar loggedTypeFailures = {};\n\n/**\n * Assert that the values match with the type specs.\n * Error messages are memorized and will only be shown once.\n *\n * @param {object} typeSpecs Map of name to a ReactPropType\n * @param {object} values Runtime values that need to be type-checked\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @param {string} componentName Name of the component for error messages.\n * @param {?object} element The React element that is being type-checked\n * @param {?number} debugID The React component instance that is being type-checked\n * @private\n */\nfunction checkReactTypeSpec(typeSpecs, values, location, componentName, element, debugID) {\n  for (var typeSpecName in typeSpecs) {\n    if (typeSpecs.hasOwnProperty(typeSpecName)) {\n      var error;\n      // Prop type validation may throw. In case they do, we don't want to\n      // fail the render phase where it didn't fail before. So we log it.\n      // After these have been cleaned up, we'll let them throw.\n      try {\n        // This is intentionally an invariant that gets caught. It's the same\n        // behavior as without this statement except with a better message.\n        !(typeof typeSpecs[typeSpecName] === 'function') ?  true ? invariant(false, '%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.', componentName || 'React class', ReactPropTypeLocationNames[location], typeSpecName) : _prodInvariant('84', componentName || 'React class', ReactPropTypeLocationNames[location], typeSpecName) : void 0;\n        error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);\n      } catch (ex) {\n        error = ex;\n      }\n       true ? warning(!error || error instanceof Error, '%s: type specification of %s `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', ReactPropTypeLocationNames[location], typeSpecName, typeof error) : void 0;\n      if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n        // Only monitor this failure once because there tends to be a lot of the\n        // same error.\n        loggedTypeFailures[error.message] = true;\n\n        var componentStackInfo = '';\n\n        if (true) {\n          if (!ReactComponentTreeHook) {\n            ReactComponentTreeHook = __webpack_require__(198);\n          }\n          if (debugID !== null) {\n            componentStackInfo = ReactComponentTreeHook.getStackAddendumByID(debugID);\n          } else if (element !== null) {\n            componentStackInfo = ReactComponentTreeHook.getCurrentStackAddendum(element);\n          }\n        }\n\n         true ? warning(false, 'Failed %s type: %s%s', location, error.message, componentStackInfo) : void 0;\n      }\n    }\n  }\n}\n\nmodule.exports = checkReactTypeSpec;\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(200)))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvY2hlY2tSZWFjdFR5cGVTcGVjLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcyA9IHJlcXVpcmUoJy4vUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMnKTtcbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBSZWFjdENvbXBvbmVudFRyZWVIb29rO1xuXG5pZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAndGVzdCcpIHtcbiAgLy8gVGVtcG9yYXJ5IGhhY2suXG4gIC8vIElubGluZSByZXF1aXJlcyBkb24ndCB3b3JrIHdlbGwgd2l0aCBKZXN0OlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyNDBcbiAgLy8gUmVtb3ZlIHRoZSBpbmxpbmUgcmVxdWlyZXMgd2hlbiB3ZSBkb24ndCBuZWVkIHRoZW0gYW55bW9yZTpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNzE3OFxuICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG59XG5cbnZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcblxuLyoqXG4gKiBBc3NlcnQgdGhhdCB0aGUgdmFsdWVzIG1hdGNoIHdpdGggdGhlIHR5cGUgc3BlY3MuXG4gKiBFcnJvciBtZXNzYWdlcyBhcmUgbWVtb3JpemVkIGFuZCB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdHlwZVNwZWNzIE1hcCBvZiBuYW1lIHRvIGEgUmVhY3RQcm9wVHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHZhbHVlcyBSdW50aW1lIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgdHlwZS1jaGVja2VkXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24gZS5nLiBcInByb3BcIiwgXCJjb250ZXh0XCIsIFwiY2hpbGQgY29udGV4dFwiXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcG9uZW50TmFtZSBOYW1lIG9mIHRoZSBjb21wb25lbnQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICogQHBhcmFtIHs/b2JqZWN0fSBlbGVtZW50IFRoZSBSZWFjdCBlbGVtZW50IHRoYXQgaXMgYmVpbmcgdHlwZS1jaGVja2VkXG4gKiBAcGFyYW0gez9udW1iZXJ9IGRlYnVnSUQgVGhlIFJlYWN0IGNvbXBvbmVudCBpbnN0YW5jZSB0aGF0IGlzIGJlaW5nIHR5cGUtY2hlY2tlZFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2hlY2tSZWFjdFR5cGVTcGVjKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZWxlbWVudCwgZGVidWdJRCkge1xuICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgaWYgKHR5cGVTcGVjcy5oYXNPd25Qcm9wZXJ0eSh0eXBlU3BlY05hbWUpKSB7XG4gICAgICB2YXIgZXJyb3I7XG4gICAgICAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgISh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gPT09ICdmdW5jdGlvbicpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzOiAlcyB0eXBlIGAlc2AgaXMgaW52YWxpZDsgaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gUmVhY3QuUHJvcFR5cGVzLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dLCB0eXBlU3BlY05hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzg0JywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl0sIHR5cGVTcGVjTmFtZSkgOiB2b2lkIDA7XG4gICAgICAgIGVycm9yID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBlcnJvciA9IGV4O1xuICAgICAgfVxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgRXJyb3IsICclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXSwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IpIDogdm9pZCAwO1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvci5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvci5tZXNzYWdlXSA9IHRydWU7XG5cbiAgICAgICAgdmFyIGNvbXBvbmVudFN0YWNrSW5mbyA9ICcnO1xuXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgaWYgKCFSZWFjdENvbXBvbmVudFRyZWVIb29rKSB7XG4gICAgICAgICAgICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkZWJ1Z0lEICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21wb25lbnRTdGFja0luZm8gPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29tcG9uZW50U3RhY2tJbmZvID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRDdXJyZW50U3RhY2tBZGRlbmR1bShlbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ZhaWxlZCAlcyB0eXBlOiAlcyVzJywgbG9jYXRpb24sIGVycm9yLm1lc3NhZ2UsIGNvbXBvbmVudFN0YWNrSW5mbykgOiB2b2lkIDA7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2hlY2tSZWFjdFR5cGVTcGVjO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC9saWIvY2hlY2tSZWFjdFR5cGVTcGVjLmpzXG4vLyBtb2R1bGUgaWQgPSAxOTlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 200 */
/***/ function(module, exports) {

    eval("// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9wcm9jZXNzL2Jyb3dzZXIuanNcbi8vIG1vZHVsZSBpZCA9IDIwMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 201 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanNcbi8vIG1vZHVsZSBpZCA9IDIwMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 202 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar ReactElement = __webpack_require__(181);\nvar ReactPropTypeLocationNames = __webpack_require__(195);\nvar ReactPropTypesSecret = __webpack_require__(201);\n\nvar emptyFunction = __webpack_require__(184);\nvar getIteratorFn = __webpack_require__(188);\nvar warning = __webpack_require__(183);\n\n/**\n * Collection of methods that allow declaration and validation of props that are\n * supplied to React components. Example usage:\n *\n *   var Props = require('ReactPropTypes');\n *   var MyArticle = React.createClass({\n *     propTypes: {\n *       // An optional string prop named \"description\".\n *       description: Props.string,\n *\n *       // A required enum prop named \"category\".\n *       category: Props.oneOf(['News','Photos']).isRequired,\n *\n *       // A prop named \"dialog\" that requires an instance of Dialog.\n *       dialog: Props.instanceOf(Dialog).isRequired\n *     },\n *     render: function() { ... }\n *   });\n *\n * A more formal specification of how these methods are used:\n *\n *   type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)\n *   decl := ReactPropTypes.{type}(.isRequired)?\n *\n * Each and every declaration produces a function with the same signature. This\n * allows the creation of custom validation functions. For example:\n *\n *  var MyLink = React.createClass({\n *    propTypes: {\n *      // An optional string or URI prop named \"href\".\n *      href: function(props, propName, componentName) {\n *        var propValue = props[propName];\n *        if (propValue != null && typeof propValue !== 'string' &&\n *            !(propValue instanceof URI)) {\n *          return new Error(\n *            'Expected a string or an URI for ' + propName + ' in ' +\n *            componentName\n *          );\n *        }\n *      }\n *    },\n *    render: function() {...}\n *  });\n *\n * @internal\n */\n\nvar ANONYMOUS = '<<anonymous>>';\n\nvar ReactPropTypes = {\n  array: createPrimitiveTypeChecker('array'),\n  bool: createPrimitiveTypeChecker('boolean'),\n  func: createPrimitiveTypeChecker('function'),\n  number: createPrimitiveTypeChecker('number'),\n  object: createPrimitiveTypeChecker('object'),\n  string: createPrimitiveTypeChecker('string'),\n  symbol: createPrimitiveTypeChecker('symbol'),\n\n  any: createAnyTypeChecker(),\n  arrayOf: createArrayOfTypeChecker,\n  element: createElementTypeChecker(),\n  instanceOf: createInstanceTypeChecker,\n  node: createNodeChecker(),\n  objectOf: createObjectOfTypeChecker,\n  oneOf: createEnumTypeChecker,\n  oneOfType: createUnionTypeChecker,\n  shape: createShapeTypeChecker\n};\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\n/*eslint-disable no-self-compare*/\nfunction is(x, y) {\n  // SameValue algorithm\n  if (x === y) {\n    // Steps 1-5, 7-10\n    // Steps 6.b-6.e: +0 != -0\n    return x !== 0 || 1 / x === 1 / y;\n  } else {\n    // Step 6.a: NaN == NaN\n    return x !== x && y !== y;\n  }\n}\n/*eslint-enable no-self-compare*/\n\n/**\n * We use an Error-like object for backward compatibility as people may call\n * PropTypes directly and inspect their output. However we don't use real\n * Errors anymore. We don't inspect their stack anyway, and creating them\n * is prohibitively expensive if they are created too often, such as what\n * happens in oneOfType() for any type before the one that matched.\n */\nfunction PropTypeError(message) {\n  this.message = message;\n  this.stack = '';\n}\n// Make `instanceof Error` still work for returned errors.\nPropTypeError.prototype = Error.prototype;\n\nfunction createChainableTypeChecker(validate) {\n  if (true) {\n    var manualPropTypeCallCache = {};\n  }\n  function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {\n    componentName = componentName || ANONYMOUS;\n    propFullName = propFullName || propName;\n    if (true) {\n      if (secret !== ReactPropTypesSecret && typeof console !== 'undefined') {\n        var cacheKey = componentName + ':' + propName;\n        if (!manualPropTypeCallCache[cacheKey]) {\n           true ? warning(false, 'You are manually calling a React.PropTypes validation ' + 'function for the `%s` prop on `%s`. This is deprecated ' + 'and will not work in production with the next major version. ' + 'You may be seeing this warning due to a third-party PropTypes ' + 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.', propFullName, componentName) : void 0;\n          manualPropTypeCallCache[cacheKey] = true;\n        }\n      }\n    }\n    if (props[propName] == null) {\n      var locationName = ReactPropTypeLocationNames[location];\n      if (isRequired) {\n        if (props[propName] === null) {\n          return new PropTypeError('The ' + locationName + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));\n        }\n        return new PropTypeError('The ' + locationName + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));\n      }\n      return null;\n    } else {\n      return validate(props, propName, componentName, location, propFullName);\n    }\n  }\n\n  var chainedCheckType = checkType.bind(null, false);\n  chainedCheckType.isRequired = checkType.bind(null, true);\n\n  return chainedCheckType;\n}\n\nfunction createPrimitiveTypeChecker(expectedType) {\n  function validate(props, propName, componentName, location, propFullName, secret) {\n    var propValue = props[propName];\n    var propType = getPropType(propValue);\n    if (propType !== expectedType) {\n      var locationName = ReactPropTypeLocationNames[location];\n      // `propValue` being instance of, say, date/regexp, pass the 'object'\n      // check, but we can offer a more precise error message here rather than\n      // 'of type `object`'.\n      var preciseType = getPreciseType(propValue);\n\n      return new PropTypeError('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'));\n    }\n    return null;\n  }\n  return createChainableTypeChecker(validate);\n}\n\nfunction createAnyTypeChecker() {\n  return createChainableTypeChecker(emptyFunction.thatReturns(null));\n}\n\nfunction createArrayOfTypeChecker(typeChecker) {\n  function validate(props, propName, componentName, location, propFullName) {\n    if (typeof typeChecker !== 'function') {\n      return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');\n    }\n    var propValue = props[propName];\n    if (!Array.isArray(propValue)) {\n      var locationName = ReactPropTypeLocationNames[location];\n      var propType = getPropType(propValue);\n      return new PropTypeError('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));\n    }\n    for (var i = 0; i < propValue.length; i++) {\n      var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret);\n      if (error instanceof Error) {\n        return error;\n      }\n    }\n    return null;\n  }\n  return createChainableTypeChecker(validate);\n}\n\nfunction createElementTypeChecker() {\n  function validate(props, propName, componentName, location, propFullName) {\n    var propValue = props[propName];\n    if (!ReactElement.isValidElement(propValue)) {\n      var locationName = ReactPropTypeLocationNames[location];\n      var propType = getPropType(propValue);\n      return new PropTypeError('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));\n    }\n    return null;\n  }\n  return createChainableTypeChecker(validate);\n}\n\nfunction createInstanceTypeChecker(expectedClass) {\n  function validate(props, propName, componentName, location, propFullName) {\n    if (!(props[propName] instanceof expectedClass)) {\n      var locationName = ReactPropTypeLocationNames[location];\n      var expectedClassName = expectedClass.name || ANONYMOUS;\n      var actualClassName = getClassName(props[propName]);\n      return new PropTypeError('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));\n    }\n    return null;\n  }\n  return createChainableTypeChecker(validate);\n}\n\nfunction createEnumTypeChecker(expectedValues) {\n  if (!Array.isArray(expectedValues)) {\n     true ? warning(false, 'Invalid argument supplied to oneOf, expected an instance of array.') : void 0;\n    return emptyFunction.thatReturnsNull;\n  }\n\n  function validate(props, propName, componentName, location, propFullName) {\n    var propValue = props[propName];\n    for (var i = 0; i < expectedValues.length; i++) {\n      if (is(propValue, expectedValues[i])) {\n        return null;\n      }\n    }\n\n    var locationName = ReactPropTypeLocationNames[location];\n    var valuesString = JSON.stringify(expectedValues);\n    return new PropTypeError('Invalid ' + locationName + ' `' + propFullName + '` of value `' + propValue + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));\n  }\n  return createChainableTypeChecker(validate);\n}\n\nfunction createObjectOfTypeChecker(typeChecker) {\n  function validate(props, propName, componentName, location, propFullName) {\n    if (typeof typeChecker !== 'function') {\n      return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');\n    }\n    var propValue = props[propName];\n    var propType = getPropType(propValue);\n    if (propType !== 'object') {\n      var locationName = ReactPropTypeLocationNames[location];\n      return new PropTypeError('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));\n    }\n    for (var key in propValue) {\n      if (propValue.hasOwnProperty(key)) {\n        var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n        if (error instanceof Error) {\n          return error;\n        }\n      }\n    }\n    return null;\n  }\n  return createChainableTypeChecker(validate);\n}\n\nfunction createUnionTypeChecker(arrayOfTypeCheckers) {\n  if (!Array.isArray(arrayOfTypeCheckers)) {\n     true ? warning(false, 'Invalid argument supplied to oneOfType, expected an instance of array.') : void 0;\n    return emptyFunction.thatReturnsNull;\n  }\n\n  function validate(props, propName, componentName, location, propFullName) {\n    for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n      var checker = arrayOfTypeCheckers[i];\n      if (checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret) == null) {\n        return null;\n      }\n    }\n\n    var locationName = ReactPropTypeLocationNames[location];\n    return new PropTypeError('Invalid ' + locationName + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.'));\n  }\n  return createChainableTypeChecker(validate);\n}\n\nfunction createNodeChecker() {\n  function validate(props, propName, componentName, location, propFullName) {\n    if (!isNode(props[propName])) {\n      var locationName = ReactPropTypeLocationNames[location];\n      return new PropTypeError('Invalid ' + locationName + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));\n    }\n    return null;\n  }\n  return createChainableTypeChecker(validate);\n}\n\nfunction createShapeTypeChecker(shapeTypes) {\n  function validate(props, propName, componentName, location, propFullName) {\n    var propValue = props[propName];\n    var propType = getPropType(propValue);\n    if (propType !== 'object') {\n      var locationName = ReactPropTypeLocationNames[location];\n      return new PropTypeError('Invalid ' + locationName + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n    }\n    for (var key in shapeTypes) {\n      var checker = shapeTypes[key];\n      if (!checker) {\n        continue;\n      }\n      var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n      if (error) {\n        return error;\n      }\n    }\n    return null;\n  }\n  return createChainableTypeChecker(validate);\n}\n\nfunction isNode(propValue) {\n  switch (typeof propValue) {\n    case 'number':\n    case 'string':\n    case 'undefined':\n      return true;\n    case 'boolean':\n      return !propValue;\n    case 'object':\n      if (Array.isArray(propValue)) {\n        return propValue.every(isNode);\n      }\n      if (propValue === null || ReactElement.isValidElement(propValue)) {\n        return true;\n      }\n\n      var iteratorFn = getIteratorFn(propValue);\n      if (iteratorFn) {\n        var iterator = iteratorFn.call(propValue);\n        var step;\n        if (iteratorFn !== propValue.entries) {\n          while (!(step = iterator.next()).done) {\n            if (!isNode(step.value)) {\n              return false;\n            }\n          }\n        } else {\n          // Iterator will provide entry [k,v] tuples rather than values.\n          while (!(step = iterator.next()).done) {\n            var entry = step.value;\n            if (entry) {\n              if (!isNode(entry[1])) {\n                return false;\n              }\n            }\n          }\n        }\n      } else {\n        return false;\n      }\n\n      return true;\n    default:\n      return false;\n  }\n}\n\nfunction isSymbol(propType, propValue) {\n  // Native Symbol.\n  if (propType === 'symbol') {\n    return true;\n  }\n\n  // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'\n  if (propValue['@@toStringTag'] === 'Symbol') {\n    return true;\n  }\n\n  // Fallback for non-spec compliant Symbols which are polyfilled.\n  if (typeof Symbol === 'function' && propValue instanceof Symbol) {\n    return true;\n  }\n\n  return false;\n}\n\n// Equivalent of `typeof` but with special handling for array and regexp.\nfunction getPropType(propValue) {\n  var propType = typeof propValue;\n  if (Array.isArray(propValue)) {\n    return 'array';\n  }\n  if (propValue instanceof RegExp) {\n    // Old webkits (at least until Android 4.0) return 'function' rather than\n    // 'object' for typeof a RegExp. We'll normalize this here so that /bla/\n    // passes PropTypes.object.\n    return 'object';\n  }\n  if (isSymbol(propType, propValue)) {\n    return 'symbol';\n  }\n  return propType;\n}\n\n// This handles more types than `getPropType`. Only used for error messages.\n// See `createPrimitiveTypeChecker`.\nfunction getPreciseType(propValue) {\n  var propType = getPropType(propValue);\n  if (propType === 'object') {\n    if (propValue instanceof Date) {\n      return 'date';\n    } else if (propValue instanceof RegExp) {\n      return 'regexp';\n    }\n  }\n  return propType;\n}\n\n// Returns class name of the object, if any.\nfunction getClassName(propValue) {\n  if (!propValue.constructor || !propValue.constructor.name) {\n    return ANONYMOUS;\n  }\n  return propValue.constructor.name;\n}\n\nmodule.exports = ReactPropTypes;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RQcm9wVHlwZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0RWxlbWVudCA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50Jyk7XG52YXIgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSByZXF1aXJlKCcuL1JlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzJyk7XG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG5cbnZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlGdW5jdGlvbicpO1xudmFyIGdldEl0ZXJhdG9yRm4gPSByZXF1aXJlKCcuL2dldEl0ZXJhdG9yRm4nKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG4vKipcbiAqIENvbGxlY3Rpb24gb2YgbWV0aG9kcyB0aGF0IGFsbG93IGRlY2xhcmF0aW9uIGFuZCB2YWxpZGF0aW9uIG9mIHByb3BzIHRoYXQgYXJlXG4gKiBzdXBwbGllZCB0byBSZWFjdCBjb21wb25lbnRzLiBFeGFtcGxlIHVzYWdlOlxuICpcbiAqICAgdmFyIFByb3BzID0gcmVxdWlyZSgnUmVhY3RQcm9wVHlwZXMnKTtcbiAqICAgdmFyIE15QXJ0aWNsZSA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAqICAgICBwcm9wVHlwZXM6IHtcbiAqICAgICAgIC8vIEFuIG9wdGlvbmFsIHN0cmluZyBwcm9wIG5hbWVkIFwiZGVzY3JpcHRpb25cIi5cbiAqICAgICAgIGRlc2NyaXB0aW9uOiBQcm9wcy5zdHJpbmcsXG4gKlxuICogICAgICAgLy8gQSByZXF1aXJlZCBlbnVtIHByb3AgbmFtZWQgXCJjYXRlZ29yeVwiLlxuICogICAgICAgY2F0ZWdvcnk6IFByb3BzLm9uZU9mKFsnTmV3cycsJ1Bob3RvcyddKS5pc1JlcXVpcmVkLFxuICpcbiAqICAgICAgIC8vIEEgcHJvcCBuYW1lZCBcImRpYWxvZ1wiIHRoYXQgcmVxdWlyZXMgYW4gaW5zdGFuY2Ugb2YgRGlhbG9nLlxuICogICAgICAgZGlhbG9nOiBQcm9wcy5pbnN0YW5jZU9mKERpYWxvZykuaXNSZXF1aXJlZFxuICogICAgIH0sXG4gKiAgICAgcmVuZGVyOiBmdW5jdGlvbigpIHsgLi4uIH1cbiAqICAgfSk7XG4gKlxuICogQSBtb3JlIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGhvdyB0aGVzZSBtZXRob2RzIGFyZSB1c2VkOlxuICpcbiAqICAgdHlwZSA6PSBhcnJheXxib29sfGZ1bmN8b2JqZWN0fG51bWJlcnxzdHJpbmd8b25lT2YoWy4uLl0pfGluc3RhbmNlT2YoLi4uKVxuICogICBkZWNsIDo9IFJlYWN0UHJvcFR5cGVzLnt0eXBlfSguaXNSZXF1aXJlZCk/XG4gKlxuICogRWFjaCBhbmQgZXZlcnkgZGVjbGFyYXRpb24gcHJvZHVjZXMgYSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZS4gVGhpc1xuICogYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvbnMuIEZvciBleGFtcGxlOlxuICpcbiAqICB2YXIgTXlMaW5rID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICogICAgcHJvcFR5cGVzOiB7XG4gKiAgICAgIC8vIEFuIG9wdGlvbmFsIHN0cmluZyBvciBVUkkgcHJvcCBuYW1lZCBcImhyZWZcIi5cbiAqICAgICAgaHJlZjogZnVuY3Rpb24ocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7XG4gKiAgICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAqICAgICAgICBpZiAocHJvcFZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHByb3BWYWx1ZSAhPT0gJ3N0cmluZycgJiZcbiAqICAgICAgICAgICAgIShwcm9wVmFsdWUgaW5zdGFuY2VvZiBVUkkpKSB7XG4gKiAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKFxuICogICAgICAgICAgICAnRXhwZWN0ZWQgYSBzdHJpbmcgb3IgYW4gVVJJIGZvciAnICsgcHJvcE5hbWUgKyAnIGluICcgK1xuICogICAgICAgICAgICBjb21wb25lbnROYW1lXG4gKiAgICAgICAgICApO1xuICogICAgICAgIH1cbiAqICAgICAgfVxuICogICAgfSxcbiAqICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7Li4ufVxuICogIH0pO1xuICpcbiAqIEBpbnRlcm5hbFxuICovXG5cbnZhciBBTk9OWU1PVVMgPSAnPDxhbm9ueW1vdXM+Pic7XG5cbnZhciBSZWFjdFByb3BUeXBlcyA9IHtcbiAgYXJyYXk6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdhcnJheScpLFxuICBib29sOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYm9vbGVhbicpLFxuICBmdW5jOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignZnVuY3Rpb24nKSxcbiAgbnVtYmVyOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignbnVtYmVyJyksXG4gIG9iamVjdDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ29iamVjdCcpLFxuICBzdHJpbmc6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzdHJpbmcnKSxcbiAgc3ltYm9sOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignc3ltYm9sJyksXG5cbiAgYW55OiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpLFxuICBhcnJheU9mOiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIsXG4gIGVsZW1lbnQ6IGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpLFxuICBpbnN0YW5jZU9mOiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyLFxuICBub2RlOiBjcmVhdGVOb2RlQ2hlY2tlcigpLFxuICBvYmplY3RPZjogY3JlYXRlT2JqZWN0T2ZUeXBlQ2hlY2tlcixcbiAgb25lT2Y6IGNyZWF0ZUVudW1UeXBlQ2hlY2tlcixcbiAgb25lT2ZUeXBlOiBjcmVhdGVVbmlvblR5cGVDaGVja2VyLFxuICBzaGFwZTogY3JlYXRlU2hhcGVUeXBlQ2hlY2tlclxufTtcblxuLyoqXG4gKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAqL1xuLyplc2xpbnQtZGlzYWJsZSBuby1zZWxmLWNvbXBhcmUqL1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICAvLyBTYW1lVmFsdWUgYWxnb3JpdGhtXG4gIGlmICh4ID09PSB5KSB7XG4gICAgLy8gU3RlcHMgMS01LCA3LTEwXG4gICAgLy8gU3RlcHMgNi5iLTYuZTogKzAgIT0gLTBcbiAgICByZXR1cm4geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHk7XG4gIH0gZWxzZSB7XG4gICAgLy8gU3RlcCA2LmE6IE5hTiA9PSBOYU5cbiAgICByZXR1cm4geCAhPT0geCAmJiB5ICE9PSB5O1xuICB9XG59XG4vKmVzbGludC1lbmFibGUgbm8tc2VsZi1jb21wYXJlKi9cblxuLyoqXG4gKiBXZSB1c2UgYW4gRXJyb3ItbGlrZSBvYmplY3QgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYXMgcGVvcGxlIG1heSBjYWxsXG4gKiBQcm9wVHlwZXMgZGlyZWN0bHkgYW5kIGluc3BlY3QgdGhlaXIgb3V0cHV0LiBIb3dldmVyIHdlIGRvbid0IHVzZSByZWFsXG4gKiBFcnJvcnMgYW55bW9yZS4gV2UgZG9uJ3QgaW5zcGVjdCB0aGVpciBzdGFjayBhbnl3YXksIGFuZCBjcmVhdGluZyB0aGVtXG4gKiBpcyBwcm9oaWJpdGl2ZWx5IGV4cGVuc2l2ZSBpZiB0aGV5IGFyZSBjcmVhdGVkIHRvbyBvZnRlbiwgc3VjaCBhcyB3aGF0XG4gKiBoYXBwZW5zIGluIG9uZU9mVHlwZSgpIGZvciBhbnkgdHlwZSBiZWZvcmUgdGhlIG9uZSB0aGF0IG1hdGNoZWQuXG4gKi9cbmZ1bmN0aW9uIFByb3BUeXBlRXJyb3IobWVzc2FnZSkge1xuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB0aGlzLnN0YWNrID0gJyc7XG59XG4vLyBNYWtlIGBpbnN0YW5jZW9mIEVycm9yYCBzdGlsbCB3b3JrIGZvciByZXR1cm5lZCBlcnJvcnMuXG5Qcm9wVHlwZUVycm9yLnByb3RvdHlwZSA9IEVycm9yLnByb3RvdHlwZTtcblxuZnVuY3Rpb24gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2YXIgbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGUgPSB7fTtcbiAgfVxuICBmdW5jdGlvbiBjaGVja1R5cGUoaXNSZXF1aXJlZCwgcHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICBjb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZSB8fCBBTk9OWU1PVVM7XG4gICAgcHJvcEZ1bGxOYW1lID0gcHJvcEZ1bGxOYW1lIHx8IHByb3BOYW1lO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoc2VjcmV0ICE9PSBSZWFjdFByb3BUeXBlc1NlY3JldCAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmFyIGNhY2hlS2V5ID0gY29tcG9uZW50TmFtZSArICc6JyArIHByb3BOYW1lO1xuICAgICAgICBpZiAoIW1hbnVhbFByb3BUeXBlQ2FsbENhY2hlW2NhY2hlS2V5XSkge1xuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnWW91IGFyZSBtYW51YWxseSBjYWxsaW5nIGEgUmVhY3QuUHJvcFR5cGVzIHZhbGlkYXRpb24gJyArICdmdW5jdGlvbiBmb3IgdGhlIGAlc2AgcHJvcCBvbiBgJXNgLiBUaGlzIGlzIGRlcHJlY2F0ZWQgJyArICdhbmQgd2lsbCBub3Qgd29yayBpbiBwcm9kdWN0aW9uIHdpdGggdGhlIG5leHQgbWFqb3IgdmVyc2lvbi4gJyArICdZb3UgbWF5IGJlIHNlZWluZyB0aGlzIHdhcm5pbmcgZHVlIHRvIGEgdGhpcmQtcGFydHkgUHJvcFR5cGVzICcgKyAnbGlicmFyeS4gU2VlIGh0dHBzOi8vZmIubWUvcmVhY3Qtd2FybmluZy1kb250LWNhbGwtcHJvcHR5cGVzICcgKyAnZm9yIGRldGFpbHMuJywgcHJvcEZ1bGxOYW1lLCBjb21wb25lbnROYW1lKSA6IHZvaWQgMDtcbiAgICAgICAgICBtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT0gbnVsbCkge1xuICAgICAgdmFyIGxvY2F0aW9uTmFtZSA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXTtcbiAgICAgIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1RoZSAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCAnICsgKCdpbiBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgYnV0IGl0cyB2YWx1ZSBpcyBgbnVsbGAuJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignVGhlICcgKyBsb2NhdGlvbk5hbWUgKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgaXMgbWFya2VkIGFzIHJlcXVpcmVkIGluICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLCBidXQgaXRzIHZhbHVlIGlzIGB1bmRlZmluZWRgLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKTtcbiAgICB9XG4gIH1cblxuICB2YXIgY2hhaW5lZENoZWNrVHlwZSA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIGZhbHNlKTtcbiAgY2hhaW5lZENoZWNrVHlwZS5pc1JlcXVpcmVkID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgdHJ1ZSk7XG5cbiAgcmV0dXJuIGNoYWluZWRDaGVja1R5cGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKGV4cGVjdGVkVHlwZSkge1xuICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICBpZiAocHJvcFR5cGUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgdmFyIGxvY2F0aW9uTmFtZSA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXTtcbiAgICAgIC8vIGBwcm9wVmFsdWVgIGJlaW5nIGluc3RhbmNlIG9mLCBzYXksIGRhdGUvcmVnZXhwLCBwYXNzIHRoZSAnb2JqZWN0J1xuICAgICAgLy8gY2hlY2ssIGJ1dCB3ZSBjYW4gb2ZmZXIgYSBtb3JlIHByZWNpc2UgZXJyb3IgbWVzc2FnZSBoZXJlIHJhdGhlciB0aGFuXG4gICAgICAvLyAnb2YgdHlwZSBgb2JqZWN0YCcuXG4gICAgICB2YXIgcHJlY2lzZVR5cGUgPSBnZXRQcmVjaXNlVHlwZShwcm9wVmFsdWUpO1xuXG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uTmFtZSArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJlY2lzZVR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2AnICsgZXhwZWN0ZWRUeXBlICsgJ2AuJykpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpIHtcbiAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnMobnVsbCkpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpIHtcbiAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgaWYgKHR5cGVvZiB0eXBlQ2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdQcm9wZXJ0eSBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIGNvbXBvbmVudCBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgYXJyYXlPZi4nKTtcbiAgICB9XG4gICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgdmFyIGxvY2F0aW9uTmFtZSA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uTmFtZSArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gYXJyYXkuJykpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBpLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJ1snICsgaSArICddJywgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50VHlwZUNoZWNrZXIoKSB7XG4gIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgaWYgKCFSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSkge1xuICAgICAgdmFyIGxvY2F0aW9uTmFtZSA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uTmFtZSArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBzaW5nbGUgUmVhY3RFbGVtZW50LicpKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VUeXBlQ2hlY2tlcihleHBlY3RlZENsYXNzKSB7XG4gIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIGlmICghKHByb3BzW3Byb3BOYW1lXSBpbnN0YW5jZW9mIGV4cGVjdGVkQ2xhc3MpKSB7XG4gICAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuICAgICAgdmFyIGV4cGVjdGVkQ2xhc3NOYW1lID0gZXhwZWN0ZWRDbGFzcy5uYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgIHZhciBhY3R1YWxDbGFzc05hbWUgPSBnZXRDbGFzc05hbWUocHJvcHNbcHJvcE5hbWVdKTtcbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBhY3R1YWxDbGFzc05hbWUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2luc3RhbmNlIG9mIGAnICsgZXhwZWN0ZWRDbGFzc05hbWUgKyAnYC4nKSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVudW1UeXBlQ2hlY2tlcihleHBlY3RlZFZhbHVlcykge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZXhwZWN0ZWRWYWx1ZXMpKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mLCBleHBlY3RlZCBhbiBpbnN0YW5jZSBvZiBhcnJheS4nKSA6IHZvaWQgMDtcbiAgICByZXR1cm4gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGw7XG4gIH1cblxuICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwZWN0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpcyhwcm9wVmFsdWUsIGV4cGVjdGVkVmFsdWVzW2ldKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuICAgIHZhciB2YWx1ZXNTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShleHBlY3RlZFZhbHVlcyk7XG4gICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbk5hbWUgKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdmFsdWUgYCcgKyBwcm9wVmFsdWUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgb25lIG9mICcgKyB2YWx1ZXNTdHJpbmcgKyAnLicpKTtcbiAgfVxuICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7XG4gIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIGlmICh0eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignUHJvcGVydHkgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiBjb21wb25lbnQgYCcgKyBjb21wb25lbnROYW1lICsgJ2AgaGFzIGludmFsaWQgUHJvcFR5cGUgbm90YXRpb24gaW5zaWRlIG9iamVjdE9mLicpO1xuICAgIH1cbiAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIGxvY2F0aW9uTmFtZSA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXTtcbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBvYmplY3QuJykpO1xuICAgIH1cbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcFZhbHVlKSB7XG4gICAgICBpZiAocHJvcFZhbHVlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVW5pb25UeXBlQ2hlY2tlcihhcnJheU9mVHlwZUNoZWNrZXJzKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnJheU9mVHlwZUNoZWNrZXJzKSkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LicpIDogdm9pZCAwO1xuICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zTnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlPZlR5cGVDaGVja2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoZWNrZXIgPSBhcnJheU9mVHlwZUNoZWNrZXJzW2ldO1xuICAgICAgaWYgKGNoZWNrZXIocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBSZWFjdFByb3BUeXBlc1NlY3JldCkgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLicpKTtcbiAgfVxuICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVOb2RlQ2hlY2tlcigpIHtcbiAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgaWYgKCFpc05vZGUocHJvcHNbcHJvcE5hbWVdKSkge1xuICAgICAgdmFyIGxvY2F0aW9uTmFtZSA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXTtcbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIFJlYWN0Tm9kZS4nKSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIoc2hhcGVUeXBlcykge1xuICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIGxvY2F0aW9uTmFtZSA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXTtcbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgYCcgKyBwcm9wVHlwZSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBgb2JqZWN0YC4nKSk7XG4gICAgfVxuICAgIGZvciAodmFyIGtleSBpbiBzaGFwZVR5cGVzKSB7XG4gICAgICB2YXIgY2hlY2tlciA9IHNoYXBlVHlwZXNba2V5XTtcbiAgICAgIGlmICghY2hlY2tlcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGlzTm9kZShwcm9wVmFsdWUpIHtcbiAgc3dpdGNoICh0eXBlb2YgcHJvcFZhbHVlKSB7XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiAhcHJvcFZhbHVlO1xuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBwcm9wVmFsdWUuZXZlcnkoaXNOb2RlKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wVmFsdWUgPT09IG51bGwgfHwgUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihwcm9wVmFsdWUpO1xuICAgICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKHByb3BWYWx1ZSk7XG4gICAgICAgIHZhciBzdGVwO1xuICAgICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gcHJvcFZhbHVlLmVudHJpZXMpIHtcbiAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICBpZiAoIWlzTm9kZShzdGVwLnZhbHVlKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEl0ZXJhdG9yIHdpbGwgcHJvdmlkZSBlbnRyeSBbayx2XSB0dXBsZXMgcmF0aGVyIHRoYW4gdmFsdWVzLlxuICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgaWYgKCFpc05vZGUoZW50cnlbMV0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNTeW1ib2wocHJvcFR5cGUsIHByb3BWYWx1ZSkge1xuICAvLyBOYXRpdmUgU3ltYm9sLlxuICBpZiAocHJvcFR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddID09PSAnU3ltYm9sJ1xuICBpZiAocHJvcFZhbHVlWydAQHRvU3RyaW5nVGFnJ10gPT09ICdTeW1ib2wnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBGYWxsYmFjayBmb3Igbm9uLXNwZWMgY29tcGxpYW50IFN5bWJvbHMgd2hpY2ggYXJlIHBvbHlmaWxsZWQuXG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHByb3BWYWx1ZSBpbnN0YW5jZW9mIFN5bWJvbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBFcXVpdmFsZW50IG9mIGB0eXBlb2ZgIGJ1dCB3aXRoIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGFycmF5IGFuZCByZWdleHAuXG5mdW5jdGlvbiBnZXRQcm9wVHlwZShwcm9wVmFsdWUpIHtcbiAgdmFyIHByb3BUeXBlID0gdHlwZW9mIHByb3BWYWx1ZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgIHJldHVybiAnYXJyYXknO1xuICB9XG4gIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAvLyBPbGQgd2Via2l0cyAoYXQgbGVhc3QgdW50aWwgQW5kcm9pZCA0LjApIHJldHVybiAnZnVuY3Rpb24nIHJhdGhlciB0aGFuXG4gICAgLy8gJ29iamVjdCcgZm9yIHR5cGVvZiBhIFJlZ0V4cC4gV2UnbGwgbm9ybWFsaXplIHRoaXMgaGVyZSBzbyB0aGF0IC9ibGEvXG4gICAgLy8gcGFzc2VzIFByb3BUeXBlcy5vYmplY3QuXG4gICAgcmV0dXJuICdvYmplY3QnO1xuICB9XG4gIGlmIChpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSkge1xuICAgIHJldHVybiAnc3ltYm9sJztcbiAgfVxuICByZXR1cm4gcHJvcFR5cGU7XG59XG5cbi8vIFRoaXMgaGFuZGxlcyBtb3JlIHR5cGVzIHRoYW4gYGdldFByb3BUeXBlYC4gT25seSB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy5cbi8vIFNlZSBgY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXJgLlxuZnVuY3Rpb24gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKSB7XG4gIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gIGlmIChwcm9wVHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuICdkYXRlJztcbiAgICB9IGVsc2UgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgcmV0dXJuICdyZWdleHAnO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcHJvcFR5cGU7XG59XG5cbi8vIFJldHVybnMgY2xhc3MgbmFtZSBvZiB0aGUgb2JqZWN0LCBpZiBhbnkuXG5mdW5jdGlvbiBnZXRDbGFzc05hbWUocHJvcFZhbHVlKSB7XG4gIGlmICghcHJvcFZhbHVlLmNvbnN0cnVjdG9yIHx8ICFwcm9wVmFsdWUuY29uc3RydWN0b3IubmFtZSkge1xuICAgIHJldHVybiBBTk9OWU1PVVM7XG4gIH1cbiAgcmV0dXJuIHByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC9saWIvUmVhY3RQcm9wVHlwZXMuanNcbi8vIG1vZHVsZSBpZCA9IDIwMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 203 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nmodule.exports = '15.4.2';//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RWZXJzaW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gJzE1LjQuMic7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0L2xpYi9SZWFjdFZlcnNpb24uanNcbi8vIG1vZHVsZSBpZCA9IDIwM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 204 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n'use strict';\n\nvar _prodInvariant = __webpack_require__(179);\n\nvar ReactElement = __webpack_require__(181);\n\nvar invariant = __webpack_require__(180);\n\n/**\n * Returns the first child in a collection of children and verifies that there\n * is only one child in the collection.\n *\n * See https://facebook.github.io/react/docs/top-level-api.html#react.children.only\n *\n * The current implementation of this function assumes that a single child gets\n * passed without a wrapper, but the purpose of this helper function is to\n * abstract away the particular structure of children.\n *\n * @param {?object} children Child collection structure.\n * @return {ReactElement} The first and only `ReactElement` contained in the\n * structure.\n */\nfunction onlyChild(children) {\n  !ReactElement.isValidElement(children) ?  true ? invariant(false, 'React.Children.only expected to receive a single React element child.') : _prodInvariant('143') : void 0;\n  return children;\n}\n\nmodule.exports = onlyChild;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvb25seUNoaWxkLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RFbGVtZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGluIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiBhbmQgdmVyaWZpZXMgdGhhdCB0aGVyZVxuICogaXMgb25seSBvbmUgY2hpbGQgaW4gdGhlIGNvbGxlY3Rpb24uXG4gKlxuICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNoaWxkcmVuLm9ubHlcbiAqXG4gKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhIHNpbmdsZSBjaGlsZCBnZXRzXG4gKiBwYXNzZWQgd2l0aG91dCBhIHdyYXBwZXIsIGJ1dCB0aGUgcHVycG9zZSBvZiB0aGlzIGhlbHBlciBmdW5jdGlvbiBpcyB0b1xuICogYWJzdHJhY3QgYXdheSB0aGUgcGFydGljdWxhciBzdHJ1Y3R1cmUgb2YgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBjaGlsZHJlbiBDaGlsZCBjb2xsZWN0aW9uIHN0cnVjdHVyZS5cbiAqIEByZXR1cm4ge1JlYWN0RWxlbWVudH0gVGhlIGZpcnN0IGFuZCBvbmx5IGBSZWFjdEVsZW1lbnRgIGNvbnRhaW5lZCBpbiB0aGVcbiAqIHN0cnVjdHVyZS5cbiAqL1xuZnVuY3Rpb24gb25seUNoaWxkKGNoaWxkcmVuKSB7XG4gICFSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0LkNoaWxkcmVuLm9ubHkgZXhwZWN0ZWQgdG8gcmVjZWl2ZSBhIHNpbmdsZSBSZWFjdCBlbGVtZW50IGNoaWxkLicpIDogX3Byb2RJbnZhcmlhbnQoJzE0MycpIDogdm9pZCAwO1xuICByZXR1cm4gY2hpbGRyZW47XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb25seUNoaWxkO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC9saWIvb25seUNoaWxkLmpzXG4vLyBtb2R1bGUgaWQgPSAyMDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 205 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';\n\nmodule.exports = __webpack_require__(206);\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL1JlYWN0RE9NJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAyMDVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 206 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n/* globals __REACT_DEVTOOLS_GLOBAL_HOOK__*/\n\n'use strict';\n\nvar ReactDOMComponentTree = __webpack_require__(207);\nvar ReactDefaultInjection = __webpack_require__(211);\nvar ReactMount = __webpack_require__(339);\nvar ReactReconciler = __webpack_require__(232);\nvar ReactUpdates = __webpack_require__(229);\nvar ReactVersion = __webpack_require__(344);\n\nvar findDOMNode = __webpack_require__(345);\nvar getHostComponentFromComposite = __webpack_require__(346);\nvar renderSubtreeIntoContainer = __webpack_require__(347);\nvar warning = __webpack_require__(183);\n\nReactDefaultInjection.inject();\n\nvar ReactDOM = {\n  findDOMNode: findDOMNode,\n  render: ReactMount.render,\n  unmountComponentAtNode: ReactMount.unmountComponentAtNode,\n  version: ReactVersion,\n\n  /* eslint-disable camelcase */\n  unstable_batchedUpdates: ReactUpdates.batchedUpdates,\n  unstable_renderSubtreeIntoContainer: renderSubtreeIntoContainer\n};\n\n// Inject the runtime into a devtools global hook regardless of browser.\n// Allows for debugging when the hook is injected on the page.\nif (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject === 'function') {\n  __REACT_DEVTOOLS_GLOBAL_HOOK__.inject({\n    ComponentTree: {\n      getClosestInstanceFromNode: ReactDOMComponentTree.getClosestInstanceFromNode,\n      getNodeFromInstance: function (inst) {\n        // inst is an internal instance (but could be a composite)\n        if (inst._renderedComponent) {\n          inst = getHostComponentFromComposite(inst);\n        }\n        if (inst) {\n          return ReactDOMComponentTree.getNodeFromInstance(inst);\n        } else {\n          return null;\n        }\n      }\n    },\n    Mount: ReactMount,\n    Reconciler: ReactReconciler\n  });\n}\n\nif (true) {\n  var ExecutionEnvironment = __webpack_require__(221);\n  if (ExecutionEnvironment.canUseDOM && window.top === window.self) {\n\n    // First check if devtools is not installed\n    if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') {\n      // If we're in Chrome or Firefox, provide a download link if not installed.\n      if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) {\n        // Firefox does not have the issue with devtools loaded over file://\n        var showFileUrlMessage = window.location.protocol.indexOf('http') === -1 && navigator.userAgent.indexOf('Firefox') === -1;\n        console.debug('Download the React DevTools ' + (showFileUrlMessage ? 'and use an HTTP server (instead of a file: URL) ' : '') + 'for a better development experience: ' + 'https://fb.me/react-devtools');\n      }\n    }\n\n    var testFunc = function testFn() {};\n     true ? warning((testFunc.name || testFunc.toString()).indexOf('testFn') !== -1, 'It looks like you\\'re using a minified copy of the development build ' + 'of React. When deploying React apps to production, make sure to use ' + 'the production build which skips development warnings and is faster. ' + 'See https://fb.me/react-minification for more details.') : void 0;\n\n    // If we're in IE8, check to see if we are in compatibility mode and provide\n    // information on preventing compatibility mode\n    var ieCompatibilityMode = document.documentMode && document.documentMode < 8;\n\n     true ? warning(!ieCompatibilityMode, 'Internet Explorer is running in compatibility mode; please add the ' + 'following tag to your HTML to prevent this from happening: ' + '<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />') : void 0;\n\n    var expectedFeatures = [\n    // shims\n    Array.isArray, Array.prototype.every, Array.prototype.forEach, Array.prototype.indexOf, Array.prototype.map, Date.now, Function.prototype.bind, Object.keys, String.prototype.trim];\n\n    for (var i = 0; i < expectedFeatures.length; i++) {\n      if (!expectedFeatures[i]) {\n         true ? warning(false, 'One or more ES5 shims expected by React are not available: ' + 'https://fb.me/react-warning-polyfills') : void 0;\n        break;\n      }\n    }\n  }\n}\n\nif (true) {\n  var ReactInstrumentation = __webpack_require__(235);\n  var ReactDOMUnknownPropertyHook = __webpack_require__(348);\n  var ReactDOMNullInputValuePropHook = __webpack_require__(349);\n  var ReactDOMInvalidARIAHook = __webpack_require__(350);\n\n  ReactInstrumentation.debugTool.addHook(ReactDOMUnknownPropertyHook);\n  ReactInstrumentation.debugTool.addHook(ReactDOMNullInputValuePropHook);\n  ReactInstrumentation.debugTool.addHook(ReactDOMInvalidARIAHook);\n}\n\nmodule.exports = ReactDOM;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4vKiBnbG9iYWxzIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3REZWZhdWx0SW5qZWN0aW9uID0gcmVxdWlyZSgnLi9SZWFjdERlZmF1bHRJbmplY3Rpb24nKTtcbnZhciBSZWFjdE1vdW50ID0gcmVxdWlyZSgnLi9SZWFjdE1vdW50Jyk7XG52YXIgUmVhY3RSZWNvbmNpbGVyID0gcmVxdWlyZSgnLi9SZWFjdFJlY29uY2lsZXInKTtcbnZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpO1xudmFyIFJlYWN0VmVyc2lvbiA9IHJlcXVpcmUoJy4vUmVhY3RWZXJzaW9uJyk7XG5cbnZhciBmaW5kRE9NTm9kZSA9IHJlcXVpcmUoJy4vZmluZERPTU5vZGUnKTtcbnZhciBnZXRIb3N0Q29tcG9uZW50RnJvbUNvbXBvc2l0ZSA9IHJlcXVpcmUoJy4vZ2V0SG9zdENvbXBvbmVudEZyb21Db21wb3NpdGUnKTtcbnZhciByZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lciA9IHJlcXVpcmUoJy4vcmVuZGVyU3VidHJlZUludG9Db250YWluZXInKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG5SZWFjdERlZmF1bHRJbmplY3Rpb24uaW5qZWN0KCk7XG5cbnZhciBSZWFjdERPTSA9IHtcbiAgZmluZERPTU5vZGU6IGZpbmRET01Ob2RlLFxuICByZW5kZXI6IFJlYWN0TW91bnQucmVuZGVyLFxuICB1bm1vdW50Q29tcG9uZW50QXROb2RlOiBSZWFjdE1vdW50LnVubW91bnRDb21wb25lbnRBdE5vZGUsXG4gIHZlcnNpb246IFJlYWN0VmVyc2lvbixcblxuICAvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbiAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXM6IFJlYWN0VXBkYXRlcy5iYXRjaGVkVXBkYXRlcyxcbiAgdW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXI6IHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyXG59O1xuXG4vLyBJbmplY3QgdGhlIHJ1bnRpbWUgaW50byBhIGRldnRvb2xzIGdsb2JhbCBob29rIHJlZ2FyZGxlc3Mgb2YgYnJvd3Nlci5cbi8vIEFsbG93cyBmb3IgZGVidWdnaW5nIHdoZW4gdGhlIGhvb2sgaXMgaW5qZWN0ZWQgb24gdGhlIHBhZ2UuXG5pZiAodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5pbmplY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmluamVjdCh7XG4gICAgQ29tcG9uZW50VHJlZToge1xuICAgICAgZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGU6IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSxcbiAgICAgIGdldE5vZGVGcm9tSW5zdGFuY2U6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgICAgIC8vIGluc3QgaXMgYW4gaW50ZXJuYWwgaW5zdGFuY2UgKGJ1dCBjb3VsZCBiZSBhIGNvbXBvc2l0ZSlcbiAgICAgICAgaWYgKGluc3QuX3JlbmRlcmVkQ29tcG9uZW50KSB7XG4gICAgICAgICAgaW5zdCA9IGdldEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlKGluc3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnN0KSB7XG4gICAgICAgICAgcmV0dXJuIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBNb3VudDogUmVhY3RNb3VudCxcbiAgICBSZWNvbmNpbGVyOiBSZWFjdFJlY29uY2lsZXJcbiAgfSk7XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG4gIGlmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gJiYgd2luZG93LnRvcCA9PT0gd2luZG93LnNlbGYpIHtcblxuICAgIC8vIEZpcnN0IGNoZWNrIGlmIGRldnRvb2xzIGlzIG5vdCBpbnN0YWxsZWRcbiAgICBpZiAodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIElmIHdlJ3JlIGluIENocm9tZSBvciBGaXJlZm94LCBwcm92aWRlIGEgZG93bmxvYWQgbGluayBpZiBub3QgaW5zdGFsbGVkLlxuICAgICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lJykgPiAtMSAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0VkZ2UnKSA9PT0gLTEgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgPiAtMSkge1xuICAgICAgICAvLyBGaXJlZm94IGRvZXMgbm90IGhhdmUgdGhlIGlzc3VlIHdpdGggZGV2dG9vbHMgbG9hZGVkIG92ZXIgZmlsZTovL1xuICAgICAgICB2YXIgc2hvd0ZpbGVVcmxNZXNzYWdlID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sLmluZGV4T2YoJ2h0dHAnKSA9PT0gLTEgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgPT09IC0xO1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdEb3dubG9hZCB0aGUgUmVhY3QgRGV2VG9vbHMgJyArIChzaG93RmlsZVVybE1lc3NhZ2UgPyAnYW5kIHVzZSBhbiBIVFRQIHNlcnZlciAoaW5zdGVhZCBvZiBhIGZpbGU6IFVSTCkgJyA6ICcnKSArICdmb3IgYSBiZXR0ZXIgZGV2ZWxvcG1lbnQgZXhwZXJpZW5jZTogJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWRldnRvb2xzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHRlc3RGdW5jID0gZnVuY3Rpb24gdGVzdEZuKCkge307XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoKHRlc3RGdW5jLm5hbWUgfHwgdGVzdEZ1bmMudG9TdHJpbmcoKSkuaW5kZXhPZigndGVzdEZuJykgIT09IC0xLCAnSXQgbG9va3MgbGlrZSB5b3VcXCdyZSB1c2luZyBhIG1pbmlmaWVkIGNvcHkgb2YgdGhlIGRldmVsb3BtZW50IGJ1aWxkICcgKyAnb2YgUmVhY3QuIFdoZW4gZGVwbG95aW5nIFJlYWN0IGFwcHMgdG8gcHJvZHVjdGlvbiwgbWFrZSBzdXJlIHRvIHVzZSAnICsgJ3RoZSBwcm9kdWN0aW9uIGJ1aWxkIHdoaWNoIHNraXBzIGRldmVsb3BtZW50IHdhcm5pbmdzIGFuZCBpcyBmYXN0ZXIuICcgKyAnU2VlIGh0dHBzOi8vZmIubWUvcmVhY3QtbWluaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuJykgOiB2b2lkIDA7XG5cbiAgICAvLyBJZiB3ZSdyZSBpbiBJRTgsIGNoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgaW4gY29tcGF0aWJpbGl0eSBtb2RlIGFuZCBwcm92aWRlXG4gICAgLy8gaW5mb3JtYXRpb24gb24gcHJldmVudGluZyBjb21wYXRpYmlsaXR5IG1vZGVcbiAgICB2YXIgaWVDb21wYXRpYmlsaXR5TW9kZSA9IGRvY3VtZW50LmRvY3VtZW50TW9kZSAmJiBkb2N1bWVudC5kb2N1bWVudE1vZGUgPCA4O1xuXG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWllQ29tcGF0aWJpbGl0eU1vZGUsICdJbnRlcm5ldCBFeHBsb3JlciBpcyBydW5uaW5nIGluIGNvbXBhdGliaWxpdHkgbW9kZTsgcGxlYXNlIGFkZCB0aGUgJyArICdmb2xsb3dpbmcgdGFnIHRvIHlvdXIgSFRNTCB0byBwcmV2ZW50IHRoaXMgZnJvbSBoYXBwZW5pbmc6ICcgKyAnPG1ldGEgaHR0cC1lcXVpdj1cIlgtVUEtQ29tcGF0aWJsZVwiIGNvbnRlbnQ9XCJJRT1lZGdlXCIgLz4nKSA6IHZvaWQgMDtcblxuICAgIHZhciBleHBlY3RlZEZlYXR1cmVzID0gW1xuICAgIC8vIHNoaW1zXG4gICAgQXJyYXkuaXNBcnJheSwgQXJyYXkucHJvdG90eXBlLmV2ZXJ5LCBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCwgQXJyYXkucHJvdG90eXBlLmluZGV4T2YsIEFycmF5LnByb3RvdHlwZS5tYXAsIERhdGUubm93LCBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCwgT2JqZWN0LmtleXMsIFN0cmluZy5wcm90b3R5cGUudHJpbV07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cGVjdGVkRmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghZXhwZWN0ZWRGZWF0dXJlc1tpXSkge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ09uZSBvciBtb3JlIEVTNSBzaGltcyBleHBlY3RlZCBieSBSZWFjdCBhcmUgbm90IGF2YWlsYWJsZTogJyArICdodHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmctcG9seWZpbGxzJykgOiB2b2lkIDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSByZXF1aXJlKCcuL1JlYWN0SW5zdHJ1bWVudGF0aW9uJyk7XG4gIHZhciBSZWFjdERPTVVua25vd25Qcm9wZXJ0eUhvb2sgPSByZXF1aXJlKCcuL1JlYWN0RE9NVW5rbm93blByb3BlcnR5SG9vaycpO1xuICB2YXIgUmVhY3RET01OdWxsSW5wdXRWYWx1ZVByb3BIb29rID0gcmVxdWlyZSgnLi9SZWFjdERPTU51bGxJbnB1dFZhbHVlUHJvcEhvb2snKTtcbiAgdmFyIFJlYWN0RE9NSW52YWxpZEFSSUFIb29rID0gcmVxdWlyZSgnLi9SZWFjdERPTUludmFsaWRBUklBSG9vaycpO1xuXG4gIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5hZGRIb29rKFJlYWN0RE9NVW5rbm93blByb3BlcnR5SG9vayk7XG4gIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5hZGRIb29rKFJlYWN0RE9NTnVsbElucHV0VmFsdWVQcm9wSG9vayk7XG4gIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5hZGRIb29rKFJlYWN0RE9NSW52YWxpZEFSSUFIb29rKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdERPTS5qc1xuLy8gbW9kdWxlIGlkID0gMjA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 207 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nvar DOMProperty = __webpack_require__(209);\nvar ReactDOMComponentFlags = __webpack_require__(210);\n\nvar invariant = __webpack_require__(180);\n\nvar ATTR_NAME = DOMProperty.ID_ATTRIBUTE_NAME;\nvar Flags = ReactDOMComponentFlags;\n\nvar internalInstanceKey = '__reactInternalInstance$' + Math.random().toString(36).slice(2);\n\n/**\n * Check if a given node should be cached.\n */\nfunction shouldPrecacheNode(node, nodeID) {\n  return node.nodeType === 1 && node.getAttribute(ATTR_NAME) === String(nodeID) || node.nodeType === 8 && node.nodeValue === ' react-text: ' + nodeID + ' ' || node.nodeType === 8 && node.nodeValue === ' react-empty: ' + nodeID + ' ';\n}\n\n/**\n * Drill down (through composites and empty components) until we get a host or\n * host text component.\n *\n * This is pretty polymorphic but unavoidable with the current structure we have\n * for `_renderedChildren`.\n */\nfunction getRenderedHostOrTextFromComponent(component) {\n  var rendered;\n  while (rendered = component._renderedComponent) {\n    component = rendered;\n  }\n  return component;\n}\n\n/**\n * Populate `_hostNode` on the rendered host/text component with the given\n * DOM node. The passed `inst` can be a composite.\n */\nfunction precacheNode(inst, node) {\n  var hostInst = getRenderedHostOrTextFromComponent(inst);\n  hostInst._hostNode = node;\n  node[internalInstanceKey] = hostInst;\n}\n\nfunction uncacheNode(inst) {\n  var node = inst._hostNode;\n  if (node) {\n    delete node[internalInstanceKey];\n    inst._hostNode = null;\n  }\n}\n\n/**\n * Populate `_hostNode` on each child of `inst`, assuming that the children\n * match up with the DOM (element) children of `node`.\n *\n * We cache entire levels at once to avoid an n^2 problem where we access the\n * children of a node sequentially and have to walk from the start to our target\n * node every time.\n *\n * Since we update `_renderedChildren` and the actual DOM at (slightly)\n * different times, we could race here and see a newer `_renderedChildren` than\n * the DOM nodes we see. To avoid this, ReactMultiChild calls\n * `prepareToManageChildren` before we change `_renderedChildren`, at which\n * time the container's child nodes are always cached (until it unmounts).\n */\nfunction precacheChildNodes(inst, node) {\n  if (inst._flags & Flags.hasCachedChildNodes) {\n    return;\n  }\n  var children = inst._renderedChildren;\n  var childNode = node.firstChild;\n  outer: for (var name in children) {\n    if (!children.hasOwnProperty(name)) {\n      continue;\n    }\n    var childInst = children[name];\n    var childID = getRenderedHostOrTextFromComponent(childInst)._domID;\n    if (childID === 0) {\n      // We're currently unmounting this child in ReactMultiChild; skip it.\n      continue;\n    }\n    // We assume the child nodes are in the same order as the child instances.\n    for (; childNode !== null; childNode = childNode.nextSibling) {\n      if (shouldPrecacheNode(childNode, childID)) {\n        precacheNode(childInst, childNode);\n        continue outer;\n      }\n    }\n    // We reached the end of the DOM children without finding an ID match.\n     true ?  true ? invariant(false, 'Unable to find element with ID %s.', childID) : _prodInvariant('32', childID) : void 0;\n  }\n  inst._flags |= Flags.hasCachedChildNodes;\n}\n\n/**\n * Given a DOM node, return the closest ReactDOMComponent or\n * ReactDOMTextComponent instance ancestor.\n */\nfunction getClosestInstanceFromNode(node) {\n  if (node[internalInstanceKey]) {\n    return node[internalInstanceKey];\n  }\n\n  // Walk up the tree until we find an ancestor whose instance we have cached.\n  var parents = [];\n  while (!node[internalInstanceKey]) {\n    parents.push(node);\n    if (node.parentNode) {\n      node = node.parentNode;\n    } else {\n      // Top of the tree. This node must not be part of a React tree (or is\n      // unmounted, potentially).\n      return null;\n    }\n  }\n\n  var closest;\n  var inst;\n  for (; node && (inst = node[internalInstanceKey]); node = parents.pop()) {\n    closest = inst;\n    if (parents.length) {\n      precacheChildNodes(inst, node);\n    }\n  }\n\n  return closest;\n}\n\n/**\n * Given a DOM node, return the ReactDOMComponent or ReactDOMTextComponent\n * instance, or null if the node was not rendered by this React.\n */\nfunction getInstanceFromNode(node) {\n  var inst = getClosestInstanceFromNode(node);\n  if (inst != null && inst._hostNode === node) {\n    return inst;\n  } else {\n    return null;\n  }\n}\n\n/**\n * Given a ReactDOMComponent or ReactDOMTextComponent, return the corresponding\n * DOM node.\n */\nfunction getNodeFromInstance(inst) {\n  // Without this first invariant, passing a non-DOM-component triggers the next\n  // invariant for a missing parent, which is super confusing.\n  !(inst._hostNode !== undefined) ?  true ? invariant(false, 'getNodeFromInstance: Invalid argument.') : _prodInvariant('33') : void 0;\n\n  if (inst._hostNode) {\n    return inst._hostNode;\n  }\n\n  // Walk up the tree until we find an ancestor whose DOM node we have cached.\n  var parents = [];\n  while (!inst._hostNode) {\n    parents.push(inst);\n    !inst._hostParent ?  true ? invariant(false, 'React DOM tree root should always have a node reference.') : _prodInvariant('34') : void 0;\n    inst = inst._hostParent;\n  }\n\n  // Now parents contains each ancestor that does *not* have a cached native\n  // node, and `inst` is the deepest ancestor that does.\n  for (; parents.length; inst = parents.pop()) {\n    precacheChildNodes(inst, inst._hostNode);\n  }\n\n  return inst._hostNode;\n}\n\nvar ReactDOMComponentTree = {\n  getClosestInstanceFromNode: getClosestInstanceFromNode,\n  getInstanceFromNode: getInstanceFromNode,\n  getNodeFromInstance: getNodeFromInstance,\n  precacheChildNodes: precacheChildNodes,\n  precacheNode: precacheNode,\n  uncacheNode: uncacheNode\n};\n\nmodule.exports = ReactDOMComponentTree;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NQ29tcG9uZW50VHJlZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgRE9NUHJvcGVydHkgPSByZXF1aXJlKCcuL0RPTVByb3BlcnR5Jyk7XG52YXIgUmVhY3RET01Db21wb25lbnRGbGFncyA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRGbGFncycpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbnZhciBBVFRSX05BTUUgPSBET01Qcm9wZXJ0eS5JRF9BVFRSSUJVVEVfTkFNRTtcbnZhciBGbGFncyA9IFJlYWN0RE9NQ29tcG9uZW50RmxhZ3M7XG5cbnZhciBpbnRlcm5hbEluc3RhbmNlS2V5ID0gJ19fcmVhY3RJbnRlcm5hbEluc3RhbmNlJCcgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtcblxuLyoqXG4gKiBDaGVjayBpZiBhIGdpdmVuIG5vZGUgc2hvdWxkIGJlIGNhY2hlZC5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkUHJlY2FjaGVOb2RlKG5vZGUsIG5vZGVJRCkge1xuICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlLmdldEF0dHJpYnV0ZShBVFRSX05BTUUpID09PSBTdHJpbmcobm9kZUlEKSB8fCBub2RlLm5vZGVUeXBlID09PSA4ICYmIG5vZGUubm9kZVZhbHVlID09PSAnIHJlYWN0LXRleHQ6ICcgKyBub2RlSUQgKyAnICcgfHwgbm9kZS5ub2RlVHlwZSA9PT0gOCAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gJyByZWFjdC1lbXB0eTogJyArIG5vZGVJRCArICcgJztcbn1cblxuLyoqXG4gKiBEcmlsbCBkb3duICh0aHJvdWdoIGNvbXBvc2l0ZXMgYW5kIGVtcHR5IGNvbXBvbmVudHMpIHVudGlsIHdlIGdldCBhIGhvc3Qgb3JcbiAqIGhvc3QgdGV4dCBjb21wb25lbnQuXG4gKlxuICogVGhpcyBpcyBwcmV0dHkgcG9seW1vcnBoaWMgYnV0IHVuYXZvaWRhYmxlIHdpdGggdGhlIGN1cnJlbnQgc3RydWN0dXJlIHdlIGhhdmVcbiAqIGZvciBgX3JlbmRlcmVkQ2hpbGRyZW5gLlxuICovXG5mdW5jdGlvbiBnZXRSZW5kZXJlZEhvc3RPclRleHRGcm9tQ29tcG9uZW50KGNvbXBvbmVudCkge1xuICB2YXIgcmVuZGVyZWQ7XG4gIHdoaWxlIChyZW5kZXJlZCA9IGNvbXBvbmVudC5fcmVuZGVyZWRDb21wb25lbnQpIHtcbiAgICBjb21wb25lbnQgPSByZW5kZXJlZDtcbiAgfVxuICByZXR1cm4gY29tcG9uZW50O1xufVxuXG4vKipcbiAqIFBvcHVsYXRlIGBfaG9zdE5vZGVgIG9uIHRoZSByZW5kZXJlZCBob3N0L3RleHQgY29tcG9uZW50IHdpdGggdGhlIGdpdmVuXG4gKiBET00gbm9kZS4gVGhlIHBhc3NlZCBgaW5zdGAgY2FuIGJlIGEgY29tcG9zaXRlLlxuICovXG5mdW5jdGlvbiBwcmVjYWNoZU5vZGUoaW5zdCwgbm9kZSkge1xuICB2YXIgaG9zdEluc3QgPSBnZXRSZW5kZXJlZEhvc3RPclRleHRGcm9tQ29tcG9uZW50KGluc3QpO1xuICBob3N0SW5zdC5faG9zdE5vZGUgPSBub2RlO1xuICBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldID0gaG9zdEluc3Q7XG59XG5cbmZ1bmN0aW9uIHVuY2FjaGVOb2RlKGluc3QpIHtcbiAgdmFyIG5vZGUgPSBpbnN0Ll9ob3N0Tm9kZTtcbiAgaWYgKG5vZGUpIHtcbiAgICBkZWxldGUgbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcbiAgICBpbnN0Ll9ob3N0Tm9kZSA9IG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBQb3B1bGF0ZSBgX2hvc3ROb2RlYCBvbiBlYWNoIGNoaWxkIG9mIGBpbnN0YCwgYXNzdW1pbmcgdGhhdCB0aGUgY2hpbGRyZW5cbiAqIG1hdGNoIHVwIHdpdGggdGhlIERPTSAoZWxlbWVudCkgY2hpbGRyZW4gb2YgYG5vZGVgLlxuICpcbiAqIFdlIGNhY2hlIGVudGlyZSBsZXZlbHMgYXQgb25jZSB0byBhdm9pZCBhbiBuXjIgcHJvYmxlbSB3aGVyZSB3ZSBhY2Nlc3MgdGhlXG4gKiBjaGlsZHJlbiBvZiBhIG5vZGUgc2VxdWVudGlhbGx5IGFuZCBoYXZlIHRvIHdhbGsgZnJvbSB0aGUgc3RhcnQgdG8gb3VyIHRhcmdldFxuICogbm9kZSBldmVyeSB0aW1lLlxuICpcbiAqIFNpbmNlIHdlIHVwZGF0ZSBgX3JlbmRlcmVkQ2hpbGRyZW5gIGFuZCB0aGUgYWN0dWFsIERPTSBhdCAoc2xpZ2h0bHkpXG4gKiBkaWZmZXJlbnQgdGltZXMsIHdlIGNvdWxkIHJhY2UgaGVyZSBhbmQgc2VlIGEgbmV3ZXIgYF9yZW5kZXJlZENoaWxkcmVuYCB0aGFuXG4gKiB0aGUgRE9NIG5vZGVzIHdlIHNlZS4gVG8gYXZvaWQgdGhpcywgUmVhY3RNdWx0aUNoaWxkIGNhbGxzXG4gKiBgcHJlcGFyZVRvTWFuYWdlQ2hpbGRyZW5gIGJlZm9yZSB3ZSBjaGFuZ2UgYF9yZW5kZXJlZENoaWxkcmVuYCwgYXQgd2hpY2hcbiAqIHRpbWUgdGhlIGNvbnRhaW5lcidzIGNoaWxkIG5vZGVzIGFyZSBhbHdheXMgY2FjaGVkICh1bnRpbCBpdCB1bm1vdW50cykuXG4gKi9cbmZ1bmN0aW9uIHByZWNhY2hlQ2hpbGROb2RlcyhpbnN0LCBub2RlKSB7XG4gIGlmIChpbnN0Ll9mbGFncyAmIEZsYWdzLmhhc0NhY2hlZENoaWxkTm9kZXMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGNoaWxkcmVuID0gaW5zdC5fcmVuZGVyZWRDaGlsZHJlbjtcbiAgdmFyIGNoaWxkTm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgb3V0ZXI6IGZvciAodmFyIG5hbWUgaW4gY2hpbGRyZW4pIHtcbiAgICBpZiAoIWNoaWxkcmVuLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGNoaWxkSW5zdCA9IGNoaWxkcmVuW25hbWVdO1xuICAgIHZhciBjaGlsZElEID0gZ2V0UmVuZGVyZWRIb3N0T3JUZXh0RnJvbUNvbXBvbmVudChjaGlsZEluc3QpLl9kb21JRDtcbiAgICBpZiAoY2hpbGRJRCA9PT0gMCkge1xuICAgICAgLy8gV2UncmUgY3VycmVudGx5IHVubW91bnRpbmcgdGhpcyBjaGlsZCBpbiBSZWFjdE11bHRpQ2hpbGQ7IHNraXAgaXQuXG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gV2UgYXNzdW1lIHRoZSBjaGlsZCBub2RlcyBhcmUgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGNoaWxkIGluc3RhbmNlcy5cbiAgICBmb3IgKDsgY2hpbGROb2RlICE9PSBudWxsOyBjaGlsZE5vZGUgPSBjaGlsZE5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgIGlmIChzaG91bGRQcmVjYWNoZU5vZGUoY2hpbGROb2RlLCBjaGlsZElEKSkge1xuICAgICAgICBwcmVjYWNoZU5vZGUoY2hpbGRJbnN0LCBjaGlsZE5vZGUpO1xuICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gV2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBET00gY2hpbGRyZW4gd2l0aG91dCBmaW5kaW5nIGFuIElEIG1hdGNoLlxuICAgICFmYWxzZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdVbmFibGUgdG8gZmluZCBlbGVtZW50IHdpdGggSUQgJXMuJywgY2hpbGRJRCkgOiBfcHJvZEludmFyaWFudCgnMzInLCBjaGlsZElEKSA6IHZvaWQgMDtcbiAgfVxuICBpbnN0Ll9mbGFncyB8PSBGbGFncy5oYXNDYWNoZWRDaGlsZE5vZGVzO1xufVxuXG4vKipcbiAqIEdpdmVuIGEgRE9NIG5vZGUsIHJldHVybiB0aGUgY2xvc2VzdCBSZWFjdERPTUNvbXBvbmVudCBvclxuICogUmVhY3RET01UZXh0Q29tcG9uZW50IGluc3RhbmNlIGFuY2VzdG9yLlxuICovXG5mdW5jdGlvbiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShub2RlKSB7XG4gIGlmIChub2RlW2ludGVybmFsSW5zdGFuY2VLZXldKSB7XG4gICAgcmV0dXJuIG5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG4gIH1cblxuICAvLyBXYWxrIHVwIHRoZSB0cmVlIHVudGlsIHdlIGZpbmQgYW4gYW5jZXN0b3Igd2hvc2UgaW5zdGFuY2Ugd2UgaGF2ZSBjYWNoZWQuXG4gIHZhciBwYXJlbnRzID0gW107XG4gIHdoaWxlICghbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSkge1xuICAgIHBhcmVudHMucHVzaChub2RlKTtcbiAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUb3Agb2YgdGhlIHRyZWUuIFRoaXMgbm9kZSBtdXN0IG5vdCBiZSBwYXJ0IG9mIGEgUmVhY3QgdHJlZSAob3IgaXNcbiAgICAgIC8vIHVubW91bnRlZCwgcG90ZW50aWFsbHkpLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNsb3Nlc3Q7XG4gIHZhciBpbnN0O1xuICBmb3IgKDsgbm9kZSAmJiAoaW5zdCA9IG5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV0pOyBub2RlID0gcGFyZW50cy5wb3AoKSkge1xuICAgIGNsb3Nlc3QgPSBpbnN0O1xuICAgIGlmIChwYXJlbnRzLmxlbmd0aCkge1xuICAgICAgcHJlY2FjaGVDaGlsZE5vZGVzKGluc3QsIG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjbG9zZXN0O1xufVxuXG4vKipcbiAqIEdpdmVuIGEgRE9NIG5vZGUsIHJldHVybiB0aGUgUmVhY3RET01Db21wb25lbnQgb3IgUmVhY3RET01UZXh0Q29tcG9uZW50XG4gKiBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgbm9kZSB3YXMgbm90IHJlbmRlcmVkIGJ5IHRoaXMgUmVhY3QuXG4gKi9cbmZ1bmN0aW9uIGdldEluc3RhbmNlRnJvbU5vZGUobm9kZSkge1xuICB2YXIgaW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5vZGUpO1xuICBpZiAoaW5zdCAhPSBudWxsICYmIGluc3QuX2hvc3ROb2RlID09PSBub2RlKSB7XG4gICAgcmV0dXJuIGluc3Q7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBHaXZlbiBhIFJlYWN0RE9NQ29tcG9uZW50IG9yIFJlYWN0RE9NVGV4dENvbXBvbmVudCwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBET00gbm9kZS5cbiAqL1xuZnVuY3Rpb24gZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KSB7XG4gIC8vIFdpdGhvdXQgdGhpcyBmaXJzdCBpbnZhcmlhbnQsIHBhc3NpbmcgYSBub24tRE9NLWNvbXBvbmVudCB0cmlnZ2VycyB0aGUgbmV4dFxuICAvLyBpbnZhcmlhbnQgZm9yIGEgbWlzc2luZyBwYXJlbnQsIHdoaWNoIGlzIHN1cGVyIGNvbmZ1c2luZy5cbiAgIShpbnN0Ll9ob3N0Tm9kZSAhPT0gdW5kZWZpbmVkKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdnZXROb2RlRnJvbUluc3RhbmNlOiBJbnZhbGlkIGFyZ3VtZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzMzJykgOiB2b2lkIDA7XG5cbiAgaWYgKGluc3QuX2hvc3ROb2RlKSB7XG4gICAgcmV0dXJuIGluc3QuX2hvc3ROb2RlO1xuICB9XG5cbiAgLy8gV2FsayB1cCB0aGUgdHJlZSB1bnRpbCB3ZSBmaW5kIGFuIGFuY2VzdG9yIHdob3NlIERPTSBub2RlIHdlIGhhdmUgY2FjaGVkLlxuICB2YXIgcGFyZW50cyA9IFtdO1xuICB3aGlsZSAoIWluc3QuX2hvc3ROb2RlKSB7XG4gICAgcGFyZW50cy5wdXNoKGluc3QpO1xuICAgICFpbnN0Ll9ob3N0UGFyZW50ID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0IERPTSB0cmVlIHJvb3Qgc2hvdWxkIGFsd2F5cyBoYXZlIGEgbm9kZSByZWZlcmVuY2UuJykgOiBfcHJvZEludmFyaWFudCgnMzQnKSA6IHZvaWQgMDtcbiAgICBpbnN0ID0gaW5zdC5faG9zdFBhcmVudDtcbiAgfVxuXG4gIC8vIE5vdyBwYXJlbnRzIGNvbnRhaW5zIGVhY2ggYW5jZXN0b3IgdGhhdCBkb2VzICpub3QqIGhhdmUgYSBjYWNoZWQgbmF0aXZlXG4gIC8vIG5vZGUsIGFuZCBgaW5zdGAgaXMgdGhlIGRlZXBlc3QgYW5jZXN0b3IgdGhhdCBkb2VzLlxuICBmb3IgKDsgcGFyZW50cy5sZW5ndGg7IGluc3QgPSBwYXJlbnRzLnBvcCgpKSB7XG4gICAgcHJlY2FjaGVDaGlsZE5vZGVzKGluc3QsIGluc3QuX2hvc3ROb2RlKTtcbiAgfVxuXG4gIHJldHVybiBpbnN0Ll9ob3N0Tm9kZTtcbn1cblxudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHtcbiAgZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGU6IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLFxuICBnZXRJbnN0YW5jZUZyb21Ob2RlOiBnZXRJbnN0YW5jZUZyb21Ob2RlLFxuICBnZXROb2RlRnJvbUluc3RhbmNlOiBnZXROb2RlRnJvbUluc3RhbmNlLFxuICBwcmVjYWNoZUNoaWxkTm9kZXM6IHByZWNhY2hlQ2hpbGROb2RlcyxcbiAgcHJlY2FjaGVOb2RlOiBwcmVjYWNoZU5vZGUsXG4gIHVuY2FjaGVOb2RlOiB1bmNhY2hlTm9kZVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUNvbXBvbmVudFRyZWU7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RET01Db21wb25lbnRUcmVlLmpzXG4vLyBtb2R1bGUgaWQgPSAyMDdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 208 */
/***/ function(module, exports) {

    eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n'use strict';\n\n/**\n * WARNING: DO NOT manually require this module.\n * This is a replacement for `invariant(...)` used by the error code system\n * and will _only_ be required by the corresponding babel pass.\n * It always throws.\n */\n\nfunction reactProdInvariant(code) {\n  var argCount = arguments.length - 1;\n\n  var message = 'Minified React error #' + code + '; visit ' + 'http://facebook.github.io/react/docs/error-decoder.html?invariant=' + code;\n\n  for (var argIdx = 0; argIdx < argCount; argIdx++) {\n    message += '&args[]=' + encodeURIComponent(arguments[argIdx + 1]);\n  }\n\n  message += ' for the full message or use the non-minified dev environment' + ' for full errors and additional helpful warnings.';\n\n  var error = new Error(message);\n  error.name = 'Invariant Violation';\n  error.framesToPop = 1; // we don't care about reactProdInvariant's own frame\n\n  throw error;\n}\n\nmodule.exports = reactProdInvariant;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL3JlYWN0UHJvZEludmFyaWFudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBXQVJOSU5HOiBETyBOT1QgbWFudWFsbHkgcmVxdWlyZSB0aGlzIG1vZHVsZS5cbiAqIFRoaXMgaXMgYSByZXBsYWNlbWVudCBmb3IgYGludmFyaWFudCguLi4pYCB1c2VkIGJ5IHRoZSBlcnJvciBjb2RlIHN5c3RlbVxuICogYW5kIHdpbGwgX29ubHlfIGJlIHJlcXVpcmVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGJhYmVsIHBhc3MuXG4gKiBJdCBhbHdheXMgdGhyb3dzLlxuICovXG5cbmZ1bmN0aW9uIHJlYWN0UHJvZEludmFyaWFudChjb2RlKSB7XG4gIHZhciBhcmdDb3VudCA9IGFyZ3VtZW50cy5sZW5ndGggLSAxO1xuXG4gIHZhciBtZXNzYWdlID0gJ01pbmlmaWVkIFJlYWN0IGVycm9yICMnICsgY29kZSArICc7IHZpc2l0ICcgKyAnaHR0cDovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL2Vycm9yLWRlY29kZXIuaHRtbD9pbnZhcmlhbnQ9JyArIGNvZGU7XG5cbiAgZm9yICh2YXIgYXJnSWR4ID0gMDsgYXJnSWR4IDwgYXJnQ291bnQ7IGFyZ0lkeCsrKSB7XG4gICAgbWVzc2FnZSArPSAnJmFyZ3NbXT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1thcmdJZHggKyAxXSk7XG4gIH1cblxuICBtZXNzYWdlICs9ICcgZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50JyArICcgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuJztcblxuICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIGVycm9yLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gIGVycm9yLmZyYW1lc1RvUG9wID0gMTsgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCByZWFjdFByb2RJbnZhcmlhbnQncyBvd24gZnJhbWVcblxuICB0aHJvdyBlcnJvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWFjdFByb2RJbnZhcmlhbnQ7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvcmVhY3RQcm9kSW52YXJpYW50LmpzXG4vLyBtb2R1bGUgaWQgPSAyMDhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 209 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nvar invariant = __webpack_require__(180);\n\nfunction checkMask(value, bitmask) {\n  return (value & bitmask) === bitmask;\n}\n\nvar DOMPropertyInjection = {\n  /**\n   * Mapping from normalized, camelcased property names to a configuration that\n   * specifies how the associated DOM property should be accessed or rendered.\n   */\n  MUST_USE_PROPERTY: 0x1,\n  HAS_BOOLEAN_VALUE: 0x4,\n  HAS_NUMERIC_VALUE: 0x8,\n  HAS_POSITIVE_NUMERIC_VALUE: 0x10 | 0x8,\n  HAS_OVERLOADED_BOOLEAN_VALUE: 0x20,\n\n  /**\n   * Inject some specialized knowledge about the DOM. This takes a config object\n   * with the following properties:\n   *\n   * isCustomAttribute: function that given an attribute name will return true\n   * if it can be inserted into the DOM verbatim. Useful for data-* or aria-*\n   * attributes where it's impossible to enumerate all of the possible\n   * attribute names,\n   *\n   * Properties: object mapping DOM property name to one of the\n   * DOMPropertyInjection constants or null. If your attribute isn't in here,\n   * it won't get written to the DOM.\n   *\n   * DOMAttributeNames: object mapping React attribute name to the DOM\n   * attribute name. Attribute names not specified use the **lowercase**\n   * normalized name.\n   *\n   * DOMAttributeNamespaces: object mapping React attribute name to the DOM\n   * attribute namespace URL. (Attribute names not specified use no namespace.)\n   *\n   * DOMPropertyNames: similar to DOMAttributeNames but for DOM properties.\n   * Property names not specified use the normalized name.\n   *\n   * DOMMutationMethods: Properties that require special mutation methods. If\n   * `value` is undefined, the mutation method should unset the property.\n   *\n   * @param {object} domPropertyConfig the config as described above.\n   */\n  injectDOMPropertyConfig: function (domPropertyConfig) {\n    var Injection = DOMPropertyInjection;\n    var Properties = domPropertyConfig.Properties || {};\n    var DOMAttributeNamespaces = domPropertyConfig.DOMAttributeNamespaces || {};\n    var DOMAttributeNames = domPropertyConfig.DOMAttributeNames || {};\n    var DOMPropertyNames = domPropertyConfig.DOMPropertyNames || {};\n    var DOMMutationMethods = domPropertyConfig.DOMMutationMethods || {};\n\n    if (domPropertyConfig.isCustomAttribute) {\n      DOMProperty._isCustomAttributeFunctions.push(domPropertyConfig.isCustomAttribute);\n    }\n\n    for (var propName in Properties) {\n      !!DOMProperty.properties.hasOwnProperty(propName) ?  true ? invariant(false, 'injectDOMPropertyConfig(...): You\\'re trying to inject DOM property \\'%s\\' which has already been injected. You may be accidentally injecting the same DOM property config twice, or you may be injecting two configs that have conflicting property names.', propName) : _prodInvariant('48', propName) : void 0;\n\n      var lowerCased = propName.toLowerCase();\n      var propConfig = Properties[propName];\n\n      var propertyInfo = {\n        attributeName: lowerCased,\n        attributeNamespace: null,\n        propertyName: propName,\n        mutationMethod: null,\n\n        mustUseProperty: checkMask(propConfig, Injection.MUST_USE_PROPERTY),\n        hasBooleanValue: checkMask(propConfig, Injection.HAS_BOOLEAN_VALUE),\n        hasNumericValue: checkMask(propConfig, Injection.HAS_NUMERIC_VALUE),\n        hasPositiveNumericValue: checkMask(propConfig, Injection.HAS_POSITIVE_NUMERIC_VALUE),\n        hasOverloadedBooleanValue: checkMask(propConfig, Injection.HAS_OVERLOADED_BOOLEAN_VALUE)\n      };\n      !(propertyInfo.hasBooleanValue + propertyInfo.hasNumericValue + propertyInfo.hasOverloadedBooleanValue <= 1) ?  true ? invariant(false, 'DOMProperty: Value can be one of boolean, overloaded boolean, or numeric value, but not a combination: %s', propName) : _prodInvariant('50', propName) : void 0;\n\n      if (true) {\n        DOMProperty.getPossibleStandardName[lowerCased] = propName;\n      }\n\n      if (DOMAttributeNames.hasOwnProperty(propName)) {\n        var attributeName = DOMAttributeNames[propName];\n        propertyInfo.attributeName = attributeName;\n        if (true) {\n          DOMProperty.getPossibleStandardName[attributeName] = propName;\n        }\n      }\n\n      if (DOMAttributeNamespaces.hasOwnProperty(propName)) {\n        propertyInfo.attributeNamespace = DOMAttributeNamespaces[propName];\n      }\n\n      if (DOMPropertyNames.hasOwnProperty(propName)) {\n        propertyInfo.propertyName = DOMPropertyNames[propName];\n      }\n\n      if (DOMMutationMethods.hasOwnProperty(propName)) {\n        propertyInfo.mutationMethod = DOMMutationMethods[propName];\n      }\n\n      DOMProperty.properties[propName] = propertyInfo;\n    }\n  }\n};\n\n/* eslint-disable max-len */\nvar ATTRIBUTE_NAME_START_CHAR = ':A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD';\n/* eslint-enable max-len */\n\n/**\n * DOMProperty exports lookup objects that can be used like functions:\n *\n *   > DOMProperty.isValid['id']\n *   true\n *   > DOMProperty.isValid['foobar']\n *   undefined\n *\n * Although this may be confusing, it performs better in general.\n *\n * @see http://jsperf.com/key-exists\n * @see http://jsperf.com/key-missing\n */\nvar DOMProperty = {\n\n  ID_ATTRIBUTE_NAME: 'data-reactid',\n  ROOT_ATTRIBUTE_NAME: 'data-reactroot',\n\n  ATTRIBUTE_NAME_START_CHAR: ATTRIBUTE_NAME_START_CHAR,\n  ATTRIBUTE_NAME_CHAR: ATTRIBUTE_NAME_START_CHAR + '\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040',\n\n  /**\n   * Map from property \"standard name\" to an object with info about how to set\n   * the property in the DOM. Each object contains:\n   *\n   * attributeName:\n   *   Used when rendering markup or with `*Attribute()`.\n   * attributeNamespace\n   * propertyName:\n   *   Used on DOM node instances. (This includes properties that mutate due to\n   *   external factors.)\n   * mutationMethod:\n   *   If non-null, used instead of the property or `setAttribute()` after\n   *   initial render.\n   * mustUseProperty:\n   *   Whether the property must be accessed and mutated as an object property.\n   * hasBooleanValue:\n   *   Whether the property should be removed when set to a falsey value.\n   * hasNumericValue:\n   *   Whether the property must be numeric or parse as a numeric and should be\n   *   removed when set to a falsey value.\n   * hasPositiveNumericValue:\n   *   Whether the property must be positive numeric or parse as a positive\n   *   numeric and should be removed when set to a falsey value.\n   * hasOverloadedBooleanValue:\n   *   Whether the property can be used as a flag as well as with a value.\n   *   Removed when strictly equal to false; present without a value when\n   *   strictly equal to true; present with a value otherwise.\n   */\n  properties: {},\n\n  /**\n   * Mapping from lowercase property names to the properly cased version, used\n   * to warn in the case of missing properties. Available only in __DEV__.\n   *\n   * autofocus is predefined, because adding it to the property whitelist\n   * causes unintended side effects.\n   *\n   * @type {Object}\n   */\n  getPossibleStandardName:  true ? { autofocus: 'autoFocus' } : null,\n\n  /**\n   * All of the isCustomAttribute() functions that have been injected.\n   */\n  _isCustomAttributeFunctions: [],\n\n  /**\n   * Checks whether a property name is a custom attribute.\n   * @method\n   */\n  isCustomAttribute: function (attributeName) {\n    for (var i = 0; i < DOMProperty._isCustomAttributeFunctions.length; i++) {\n      var isCustomAttributeFn = DOMProperty._isCustomAttributeFunctions[i];\n      if (isCustomAttributeFn(attributeName)) {\n        return true;\n      }\n    }\n    return false;\n  },\n\n  injection: DOMPropertyInjection\n};\n\nmodule.exports = DOMProperty;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0RPTVByb3BlcnR5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuZnVuY3Rpb24gY2hlY2tNYXNrKHZhbHVlLCBiaXRtYXNrKSB7XG4gIHJldHVybiAodmFsdWUgJiBiaXRtYXNrKSA9PT0gYml0bWFzaztcbn1cblxudmFyIERPTVByb3BlcnR5SW5qZWN0aW9uID0ge1xuICAvKipcbiAgICogTWFwcGluZyBmcm9tIG5vcm1hbGl6ZWQsIGNhbWVsY2FzZWQgcHJvcGVydHkgbmFtZXMgdG8gYSBjb25maWd1cmF0aW9uIHRoYXRcbiAgICogc3BlY2lmaWVzIGhvdyB0aGUgYXNzb2NpYXRlZCBET00gcHJvcGVydHkgc2hvdWxkIGJlIGFjY2Vzc2VkIG9yIHJlbmRlcmVkLlxuICAgKi9cbiAgTVVTVF9VU0VfUFJPUEVSVFk6IDB4MSxcbiAgSEFTX0JPT0xFQU5fVkFMVUU6IDB4NCxcbiAgSEFTX05VTUVSSUNfVkFMVUU6IDB4OCxcbiAgSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUU6IDB4MTAgfCAweDgsXG4gIEhBU19PVkVSTE9BREVEX0JPT0xFQU5fVkFMVUU6IDB4MjAsXG5cbiAgLyoqXG4gICAqIEluamVjdCBzb21lIHNwZWNpYWxpemVkIGtub3dsZWRnZSBhYm91dCB0aGUgRE9NLiBUaGlzIHRha2VzIGEgY29uZmlnIG9iamVjdFxuICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICpcbiAgICogaXNDdXN0b21BdHRyaWJ1dGU6IGZ1bmN0aW9uIHRoYXQgZ2l2ZW4gYW4gYXR0cmlidXRlIG5hbWUgd2lsbCByZXR1cm4gdHJ1ZVxuICAgKiBpZiBpdCBjYW4gYmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NIHZlcmJhdGltLiBVc2VmdWwgZm9yIGRhdGEtKiBvciBhcmlhLSpcbiAgICogYXR0cmlidXRlcyB3aGVyZSBpdCdzIGltcG9zc2libGUgdG8gZW51bWVyYXRlIGFsbCBvZiB0aGUgcG9zc2libGVcbiAgICogYXR0cmlidXRlIG5hbWVzLFxuICAgKlxuICAgKiBQcm9wZXJ0aWVzOiBvYmplY3QgbWFwcGluZyBET00gcHJvcGVydHkgbmFtZSB0byBvbmUgb2YgdGhlXG4gICAqIERPTVByb3BlcnR5SW5qZWN0aW9uIGNvbnN0YW50cyBvciBudWxsLiBJZiB5b3VyIGF0dHJpYnV0ZSBpc24ndCBpbiBoZXJlLFxuICAgKiBpdCB3b24ndCBnZXQgd3JpdHRlbiB0byB0aGUgRE9NLlxuICAgKlxuICAgKiBET01BdHRyaWJ1dGVOYW1lczogb2JqZWN0IG1hcHBpbmcgUmVhY3QgYXR0cmlidXRlIG5hbWUgdG8gdGhlIERPTVxuICAgKiBhdHRyaWJ1dGUgbmFtZS4gQXR0cmlidXRlIG5hbWVzIG5vdCBzcGVjaWZpZWQgdXNlIHRoZSAqKmxvd2VyY2FzZSoqXG4gICAqIG5vcm1hbGl6ZWQgbmFtZS5cbiAgICpcbiAgICogRE9NQXR0cmlidXRlTmFtZXNwYWNlczogb2JqZWN0IG1hcHBpbmcgUmVhY3QgYXR0cmlidXRlIG5hbWUgdG8gdGhlIERPTVxuICAgKiBhdHRyaWJ1dGUgbmFtZXNwYWNlIFVSTC4gKEF0dHJpYnV0ZSBuYW1lcyBub3Qgc3BlY2lmaWVkIHVzZSBubyBuYW1lc3BhY2UuKVxuICAgKlxuICAgKiBET01Qcm9wZXJ0eU5hbWVzOiBzaW1pbGFyIHRvIERPTUF0dHJpYnV0ZU5hbWVzIGJ1dCBmb3IgRE9NIHByb3BlcnRpZXMuXG4gICAqIFByb3BlcnR5IG5hbWVzIG5vdCBzcGVjaWZpZWQgdXNlIHRoZSBub3JtYWxpemVkIG5hbWUuXG4gICAqXG4gICAqIERPTU11dGF0aW9uTWV0aG9kczogUHJvcGVydGllcyB0aGF0IHJlcXVpcmUgc3BlY2lhbCBtdXRhdGlvbiBtZXRob2RzLiBJZlxuICAgKiBgdmFsdWVgIGlzIHVuZGVmaW5lZCwgdGhlIG11dGF0aW9uIG1ldGhvZCBzaG91bGQgdW5zZXQgdGhlIHByb3BlcnR5LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gZG9tUHJvcGVydHlDb25maWcgdGhlIGNvbmZpZyBhcyBkZXNjcmliZWQgYWJvdmUuXG4gICAqL1xuICBpbmplY3RET01Qcm9wZXJ0eUNvbmZpZzogZnVuY3Rpb24gKGRvbVByb3BlcnR5Q29uZmlnKSB7XG4gICAgdmFyIEluamVjdGlvbiA9IERPTVByb3BlcnR5SW5qZWN0aW9uO1xuICAgIHZhciBQcm9wZXJ0aWVzID0gZG9tUHJvcGVydHlDb25maWcuUHJvcGVydGllcyB8fCB7fTtcbiAgICB2YXIgRE9NQXR0cmlidXRlTmFtZXNwYWNlcyA9IGRvbVByb3BlcnR5Q29uZmlnLkRPTUF0dHJpYnV0ZU5hbWVzcGFjZXMgfHwge307XG4gICAgdmFyIERPTUF0dHJpYnV0ZU5hbWVzID0gZG9tUHJvcGVydHlDb25maWcuRE9NQXR0cmlidXRlTmFtZXMgfHwge307XG4gICAgdmFyIERPTVByb3BlcnR5TmFtZXMgPSBkb21Qcm9wZXJ0eUNvbmZpZy5ET01Qcm9wZXJ0eU5hbWVzIHx8IHt9O1xuICAgIHZhciBET01NdXRhdGlvbk1ldGhvZHMgPSBkb21Qcm9wZXJ0eUNvbmZpZy5ET01NdXRhdGlvbk1ldGhvZHMgfHwge307XG5cbiAgICBpZiAoZG9tUHJvcGVydHlDb25maWcuaXNDdXN0b21BdHRyaWJ1dGUpIHtcbiAgICAgIERPTVByb3BlcnR5Ll9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9ucy5wdXNoKGRvbVByb3BlcnR5Q29uZmlnLmlzQ3VzdG9tQXR0cmlidXRlKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBQcm9wZXJ0aWVzKSB7XG4gICAgICAhIURPTVByb3BlcnR5LnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2luamVjdERPTVByb3BlcnR5Q29uZmlnKC4uLik6IFlvdVxcJ3JlIHRyeWluZyB0byBpbmplY3QgRE9NIHByb3BlcnR5IFxcJyVzXFwnIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gaW5qZWN0ZWQuIFlvdSBtYXkgYmUgYWNjaWRlbnRhbGx5IGluamVjdGluZyB0aGUgc2FtZSBET00gcHJvcGVydHkgY29uZmlnIHR3aWNlLCBvciB5b3UgbWF5IGJlIGluamVjdGluZyB0d28gY29uZmlncyB0aGF0IGhhdmUgY29uZmxpY3RpbmcgcHJvcGVydHkgbmFtZXMuJywgcHJvcE5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzQ4JywgcHJvcE5hbWUpIDogdm9pZCAwO1xuXG4gICAgICB2YXIgbG93ZXJDYXNlZCA9IHByb3BOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgcHJvcENvbmZpZyA9IFByb3BlcnRpZXNbcHJvcE5hbWVdO1xuXG4gICAgICB2YXIgcHJvcGVydHlJbmZvID0ge1xuICAgICAgICBhdHRyaWJ1dGVOYW1lOiBsb3dlckNhc2VkLFxuICAgICAgICBhdHRyaWJ1dGVOYW1lc3BhY2U6IG51bGwsXG4gICAgICAgIHByb3BlcnR5TmFtZTogcHJvcE5hbWUsXG4gICAgICAgIG11dGF0aW9uTWV0aG9kOiBudWxsLFxuXG4gICAgICAgIG11c3RVc2VQcm9wZXJ0eTogY2hlY2tNYXNrKHByb3BDb25maWcsIEluamVjdGlvbi5NVVNUX1VTRV9QUk9QRVJUWSksXG4gICAgICAgIGhhc0Jvb2xlYW5WYWx1ZTogY2hlY2tNYXNrKHByb3BDb25maWcsIEluamVjdGlvbi5IQVNfQk9PTEVBTl9WQUxVRSksXG4gICAgICAgIGhhc051bWVyaWNWYWx1ZTogY2hlY2tNYXNrKHByb3BDb25maWcsIEluamVjdGlvbi5IQVNfTlVNRVJJQ19WQUxVRSksXG4gICAgICAgIGhhc1Bvc2l0aXZlTnVtZXJpY1ZhbHVlOiBjaGVja01hc2socHJvcENvbmZpZywgSW5qZWN0aW9uLkhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVFKSxcbiAgICAgICAgaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZTogY2hlY2tNYXNrKHByb3BDb25maWcsIEluamVjdGlvbi5IQVNfT1ZFUkxPQURFRF9CT09MRUFOX1ZBTFVFKVxuICAgICAgfTtcbiAgICAgICEocHJvcGVydHlJbmZvLmhhc0Jvb2xlYW5WYWx1ZSArIHByb3BlcnR5SW5mby5oYXNOdW1lcmljVmFsdWUgKyBwcm9wZXJ0eUluZm8uaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZSA8PSAxKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdET01Qcm9wZXJ0eTogVmFsdWUgY2FuIGJlIG9uZSBvZiBib29sZWFuLCBvdmVybG9hZGVkIGJvb2xlYW4sIG9yIG51bWVyaWMgdmFsdWUsIGJ1dCBub3QgYSBjb21iaW5hdGlvbjogJXMnLCBwcm9wTmFtZSkgOiBfcHJvZEludmFyaWFudCgnNTAnLCBwcm9wTmFtZSkgOiB2b2lkIDA7XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIERPTVByb3BlcnR5LmdldFBvc3NpYmxlU3RhbmRhcmROYW1lW2xvd2VyQ2FzZWRdID0gcHJvcE5hbWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChET01BdHRyaWJ1dGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBET01BdHRyaWJ1dGVOYW1lc1twcm9wTmFtZV07XG4gICAgICAgIHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBET01Qcm9wZXJ0eS5nZXRQb3NzaWJsZVN0YW5kYXJkTmFtZVthdHRyaWJ1dGVOYW1lXSA9IHByb3BOYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChET01BdHRyaWJ1dGVOYW1lc3BhY2VzLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZXNwYWNlID0gRE9NQXR0cmlidXRlTmFtZXNwYWNlc1twcm9wTmFtZV07XG4gICAgICB9XG5cbiAgICAgIGlmIChET01Qcm9wZXJ0eU5hbWVzLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBwcm9wZXJ0eUluZm8ucHJvcGVydHlOYW1lID0gRE9NUHJvcGVydHlOYW1lc1twcm9wTmFtZV07XG4gICAgICB9XG5cbiAgICAgIGlmIChET01NdXRhdGlvbk1ldGhvZHMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BlcnR5SW5mby5tdXRhdGlvbk1ldGhvZCA9IERPTU11dGF0aW9uTWV0aG9kc1twcm9wTmFtZV07XG4gICAgICB9XG5cbiAgICAgIERPTVByb3BlcnR5LnByb3BlcnRpZXNbcHJvcE5hbWVdID0gcHJvcGVydHlJbmZvO1xuICAgIH1cbiAgfVxufTtcblxuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xudmFyIEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgPSAnOkEtWl9hLXpcXFxcdTAwQzAtXFxcXHUwMEQ2XFxcXHUwMEQ4LVxcXFx1MDBGNlxcXFx1MDBGOC1cXFxcdTAyRkZcXFxcdTAzNzAtXFxcXHUwMzdEXFxcXHUwMzdGLVxcXFx1MUZGRlxcXFx1MjAwQy1cXFxcdTIwMERcXFxcdTIwNzAtXFxcXHUyMThGXFxcXHUyQzAwLVxcXFx1MkZFRlxcXFx1MzAwMS1cXFxcdUQ3RkZcXFxcdUY5MDAtXFxcXHVGRENGXFxcXHVGREYwLVxcXFx1RkZGRCc7XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi9cblxuLyoqXG4gKiBET01Qcm9wZXJ0eSBleHBvcnRzIGxvb2t1cCBvYmplY3RzIHRoYXQgY2FuIGJlIHVzZWQgbGlrZSBmdW5jdGlvbnM6XG4gKlxuICogICA+IERPTVByb3BlcnR5LmlzVmFsaWRbJ2lkJ11cbiAqICAgdHJ1ZVxuICogICA+IERPTVByb3BlcnR5LmlzVmFsaWRbJ2Zvb2JhciddXG4gKiAgIHVuZGVmaW5lZFxuICpcbiAqIEFsdGhvdWdoIHRoaXMgbWF5IGJlIGNvbmZ1c2luZywgaXQgcGVyZm9ybXMgYmV0dGVyIGluIGdlbmVyYWwuXG4gKlxuICogQHNlZSBodHRwOi8vanNwZXJmLmNvbS9rZXktZXhpc3RzXG4gKiBAc2VlIGh0dHA6Ly9qc3BlcmYuY29tL2tleS1taXNzaW5nXG4gKi9cbnZhciBET01Qcm9wZXJ0eSA9IHtcblxuICBJRF9BVFRSSUJVVEVfTkFNRTogJ2RhdGEtcmVhY3RpZCcsXG4gIFJPT1RfQVRUUklCVVRFX05BTUU6ICdkYXRhLXJlYWN0cm9vdCcsXG5cbiAgQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUjogQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUixcbiAgQVRUUklCVVRFX05BTUVfQ0hBUjogQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiArICdcXFxcLS4wLTlcXFxcdTAwQjdcXFxcdTAzMDAtXFxcXHUwMzZGXFxcXHUyMDNGLVxcXFx1MjA0MCcsXG5cbiAgLyoqXG4gICAqIE1hcCBmcm9tIHByb3BlcnR5IFwic3RhbmRhcmQgbmFtZVwiIHRvIGFuIG9iamVjdCB3aXRoIGluZm8gYWJvdXQgaG93IHRvIHNldFxuICAgKiB0aGUgcHJvcGVydHkgaW4gdGhlIERPTS4gRWFjaCBvYmplY3QgY29udGFpbnM6XG4gICAqXG4gICAqIGF0dHJpYnV0ZU5hbWU6XG4gICAqICAgVXNlZCB3aGVuIHJlbmRlcmluZyBtYXJrdXAgb3Igd2l0aCBgKkF0dHJpYnV0ZSgpYC5cbiAgICogYXR0cmlidXRlTmFtZXNwYWNlXG4gICAqIHByb3BlcnR5TmFtZTpcbiAgICogICBVc2VkIG9uIERPTSBub2RlIGluc3RhbmNlcy4gKFRoaXMgaW5jbHVkZXMgcHJvcGVydGllcyB0aGF0IG11dGF0ZSBkdWUgdG9cbiAgICogICBleHRlcm5hbCBmYWN0b3JzLilcbiAgICogbXV0YXRpb25NZXRob2Q6XG4gICAqICAgSWYgbm9uLW51bGwsIHVzZWQgaW5zdGVhZCBvZiB0aGUgcHJvcGVydHkgb3IgYHNldEF0dHJpYnV0ZSgpYCBhZnRlclxuICAgKiAgIGluaXRpYWwgcmVuZGVyLlxuICAgKiBtdXN0VXNlUHJvcGVydHk6XG4gICAqICAgV2hldGhlciB0aGUgcHJvcGVydHkgbXVzdCBiZSBhY2Nlc3NlZCBhbmQgbXV0YXRlZCBhcyBhbiBvYmplY3QgcHJvcGVydHkuXG4gICAqIGhhc0Jvb2xlYW5WYWx1ZTpcbiAgICogICBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIHNldCB0byBhIGZhbHNleSB2YWx1ZS5cbiAgICogaGFzTnVtZXJpY1ZhbHVlOlxuICAgKiAgIFdoZXRoZXIgdGhlIHByb3BlcnR5IG11c3QgYmUgbnVtZXJpYyBvciBwYXJzZSBhcyBhIG51bWVyaWMgYW5kIHNob3VsZCBiZVxuICAgKiAgIHJlbW92ZWQgd2hlbiBzZXQgdG8gYSBmYWxzZXkgdmFsdWUuXG4gICAqIGhhc1Bvc2l0aXZlTnVtZXJpY1ZhbHVlOlxuICAgKiAgIFdoZXRoZXIgdGhlIHByb3BlcnR5IG11c3QgYmUgcG9zaXRpdmUgbnVtZXJpYyBvciBwYXJzZSBhcyBhIHBvc2l0aXZlXG4gICAqICAgbnVtZXJpYyBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiBzZXQgdG8gYSBmYWxzZXkgdmFsdWUuXG4gICAqIGhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWU6XG4gICAqICAgV2hldGhlciB0aGUgcHJvcGVydHkgY2FuIGJlIHVzZWQgYXMgYSBmbGFnIGFzIHdlbGwgYXMgd2l0aCBhIHZhbHVlLlxuICAgKiAgIFJlbW92ZWQgd2hlbiBzdHJpY3RseSBlcXVhbCB0byBmYWxzZTsgcHJlc2VudCB3aXRob3V0IGEgdmFsdWUgd2hlblxuICAgKiAgIHN0cmljdGx5IGVxdWFsIHRvIHRydWU7IHByZXNlbnQgd2l0aCBhIHZhbHVlIG90aGVyd2lzZS5cbiAgICovXG4gIHByb3BlcnRpZXM6IHt9LFxuXG4gIC8qKlxuICAgKiBNYXBwaW5nIGZyb20gbG93ZXJjYXNlIHByb3BlcnR5IG5hbWVzIHRvIHRoZSBwcm9wZXJseSBjYXNlZCB2ZXJzaW9uLCB1c2VkXG4gICAqIHRvIHdhcm4gaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBwcm9wZXJ0aWVzLiBBdmFpbGFibGUgb25seSBpbiBfX0RFVl9fLlxuICAgKlxuICAgKiBhdXRvZm9jdXMgaXMgcHJlZGVmaW5lZCwgYmVjYXVzZSBhZGRpbmcgaXQgdG8gdGhlIHByb3BlcnR5IHdoaXRlbGlzdFxuICAgKiBjYXVzZXMgdW5pbnRlbmRlZCBzaWRlIGVmZmVjdHMuXG4gICAqXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHsgYXV0b2ZvY3VzOiAnYXV0b0ZvY3VzJyB9IDogbnVsbCxcblxuICAvKipcbiAgICogQWxsIG9mIHRoZSBpc0N1c3RvbUF0dHJpYnV0ZSgpIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYmVlbiBpbmplY3RlZC5cbiAgICovXG4gIF9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9uczogW10sXG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgcHJvcGVydHkgbmFtZSBpcyBhIGN1c3RvbSBhdHRyaWJ1dGUuXG4gICAqIEBtZXRob2RcbiAgICovXG4gIGlzQ3VzdG9tQXR0cmlidXRlOiBmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgRE9NUHJvcGVydHkuX2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXNDdXN0b21BdHRyaWJ1dGVGbiA9IERPTVByb3BlcnR5Ll9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9uc1tpXTtcbiAgICAgIGlmIChpc0N1c3RvbUF0dHJpYnV0ZUZuKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgaW5qZWN0aW9uOiBET01Qcm9wZXJ0eUluamVjdGlvblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBET01Qcm9wZXJ0eTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9ET01Qcm9wZXJ0eS5qc1xuLy8gbW9kdWxlIGlkID0gMjA5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 210 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2015-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar ReactDOMComponentFlags = {\n  hasCachedChildNodes: 1 << 0\n};\n\nmodule.exports = ReactDOMComponentFlags;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NQ29tcG9uZW50RmxhZ3MuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNS1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0RE9NQ29tcG9uZW50RmxhZ3MgPSB7XG4gIGhhc0NhY2hlZENoaWxkTm9kZXM6IDEgPDwgMFxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUNvbXBvbmVudEZsYWdzO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0RE9NQ29tcG9uZW50RmxhZ3MuanNcbi8vIG1vZHVsZSBpZCA9IDIxMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 211 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar ARIADOMPropertyConfig = __webpack_require__(212);\nvar BeforeInputEventPlugin = __webpack_require__(213);\nvar ChangeEventPlugin = __webpack_require__(228);\nvar DefaultEventPluginOrder = __webpack_require__(245);\nvar EnterLeaveEventPlugin = __webpack_require__(246);\nvar HTMLDOMPropertyConfig = __webpack_require__(251);\nvar ReactComponentBrowserEnvironment = __webpack_require__(252);\nvar ReactDOMComponent = __webpack_require__(265);\nvar ReactDOMComponentTree = __webpack_require__(207);\nvar ReactDOMEmptyComponent = __webpack_require__(310);\nvar ReactDOMTreeTraversal = __webpack_require__(311);\nvar ReactDOMTextComponent = __webpack_require__(312);\nvar ReactDefaultBatchingStrategy = __webpack_require__(313);\nvar ReactEventListener = __webpack_require__(314);\nvar ReactInjection = __webpack_require__(317);\nvar ReactReconcileTransaction = __webpack_require__(318);\nvar SVGDOMPropertyConfig = __webpack_require__(326);\nvar SelectEventPlugin = __webpack_require__(327);\nvar SimpleEventPlugin = __webpack_require__(328);\n\nvar alreadyInjected = false;\n\nfunction inject() {\n  if (alreadyInjected) {\n    // TODO: This is currently true because these injections are shared between\n    // the client and the server package. They should be built independently\n    // and not share any injection state. Then this problem will be solved.\n    return;\n  }\n  alreadyInjected = true;\n\n  ReactInjection.EventEmitter.injectReactEventListener(ReactEventListener);\n\n  /**\n   * Inject modules for resolving DOM hierarchy and plugin ordering.\n   */\n  ReactInjection.EventPluginHub.injectEventPluginOrder(DefaultEventPluginOrder);\n  ReactInjection.EventPluginUtils.injectComponentTree(ReactDOMComponentTree);\n  ReactInjection.EventPluginUtils.injectTreeTraversal(ReactDOMTreeTraversal);\n\n  /**\n   * Some important event plugins included by default (without having to require\n   * them).\n   */\n  ReactInjection.EventPluginHub.injectEventPluginsByName({\n    SimpleEventPlugin: SimpleEventPlugin,\n    EnterLeaveEventPlugin: EnterLeaveEventPlugin,\n    ChangeEventPlugin: ChangeEventPlugin,\n    SelectEventPlugin: SelectEventPlugin,\n    BeforeInputEventPlugin: BeforeInputEventPlugin\n  });\n\n  ReactInjection.HostComponent.injectGenericComponentClass(ReactDOMComponent);\n\n  ReactInjection.HostComponent.injectTextComponentClass(ReactDOMTextComponent);\n\n  ReactInjection.DOMProperty.injectDOMPropertyConfig(ARIADOMPropertyConfig);\n  ReactInjection.DOMProperty.injectDOMPropertyConfig(HTMLDOMPropertyConfig);\n  ReactInjection.DOMProperty.injectDOMPropertyConfig(SVGDOMPropertyConfig);\n\n  ReactInjection.EmptyComponent.injectEmptyComponentFactory(function (instantiate) {\n    return new ReactDOMEmptyComponent(instantiate);\n  });\n\n  ReactInjection.Updates.injectReconcileTransaction(ReactReconcileTransaction);\n  ReactInjection.Updates.injectBatchingStrategy(ReactDefaultBatchingStrategy);\n\n  ReactInjection.Component.injectEnvironment(ReactComponentBrowserEnvironment);\n}\n\nmodule.exports = {\n  inject: inject\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjExLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RGVmYXVsdEluamVjdGlvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgQVJJQURPTVByb3BlcnR5Q29uZmlnID0gcmVxdWlyZSgnLi9BUklBRE9NUHJvcGVydHlDb25maWcnKTtcbnZhciBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luID0gcmVxdWlyZSgnLi9CZWZvcmVJbnB1dEV2ZW50UGx1Z2luJyk7XG52YXIgQ2hhbmdlRXZlbnRQbHVnaW4gPSByZXF1aXJlKCcuL0NoYW5nZUV2ZW50UGx1Z2luJyk7XG52YXIgRGVmYXVsdEV2ZW50UGx1Z2luT3JkZXIgPSByZXF1aXJlKCcuL0RlZmF1bHRFdmVudFBsdWdpbk9yZGVyJyk7XG52YXIgRW50ZXJMZWF2ZUV2ZW50UGx1Z2luID0gcmVxdWlyZSgnLi9FbnRlckxlYXZlRXZlbnRQbHVnaW4nKTtcbnZhciBIVE1MRE9NUHJvcGVydHlDb25maWcgPSByZXF1aXJlKCcuL0hUTUxET01Qcm9wZXJ0eUNvbmZpZycpO1xudmFyIFJlYWN0Q29tcG9uZW50QnJvd3NlckVudmlyb25tZW50ID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudCcpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudCcpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RET01FbXB0eUNvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RET01FbXB0eUNvbXBvbmVudCcpO1xudmFyIFJlYWN0RE9NVHJlZVRyYXZlcnNhbCA9IHJlcXVpcmUoJy4vUmVhY3RET01UcmVlVHJhdmVyc2FsJyk7XG52YXIgUmVhY3RET01UZXh0Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdERPTVRleHRDb21wb25lbnQnKTtcbnZhciBSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5ID0gcmVxdWlyZSgnLi9SZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5Jyk7XG52YXIgUmVhY3RFdmVudExpc3RlbmVyID0gcmVxdWlyZSgnLi9SZWFjdEV2ZW50TGlzdGVuZXInKTtcbnZhciBSZWFjdEluamVjdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbmplY3Rpb24nKTtcbnZhciBSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uID0gcmVxdWlyZSgnLi9SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uJyk7XG52YXIgU1ZHRE9NUHJvcGVydHlDb25maWcgPSByZXF1aXJlKCcuL1NWR0RPTVByb3BlcnR5Q29uZmlnJyk7XG52YXIgU2VsZWN0RXZlbnRQbHVnaW4gPSByZXF1aXJlKCcuL1NlbGVjdEV2ZW50UGx1Z2luJyk7XG52YXIgU2ltcGxlRXZlbnRQbHVnaW4gPSByZXF1aXJlKCcuL1NpbXBsZUV2ZW50UGx1Z2luJyk7XG5cbnZhciBhbHJlYWR5SW5qZWN0ZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gaW5qZWN0KCkge1xuICBpZiAoYWxyZWFkeUluamVjdGVkKSB7XG4gICAgLy8gVE9ETzogVGhpcyBpcyBjdXJyZW50bHkgdHJ1ZSBiZWNhdXNlIHRoZXNlIGluamVjdGlvbnMgYXJlIHNoYXJlZCBiZXR3ZWVuXG4gICAgLy8gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlciBwYWNrYWdlLiBUaGV5IHNob3VsZCBiZSBidWlsdCBpbmRlcGVuZGVudGx5XG4gICAgLy8gYW5kIG5vdCBzaGFyZSBhbnkgaW5qZWN0aW9uIHN0YXRlLiBUaGVuIHRoaXMgcHJvYmxlbSB3aWxsIGJlIHNvbHZlZC5cbiAgICByZXR1cm47XG4gIH1cbiAgYWxyZWFkeUluamVjdGVkID0gdHJ1ZTtcblxuICBSZWFjdEluamVjdGlvbi5FdmVudEVtaXR0ZXIuaW5qZWN0UmVhY3RFdmVudExpc3RlbmVyKFJlYWN0RXZlbnRMaXN0ZW5lcik7XG5cbiAgLyoqXG4gICAqIEluamVjdCBtb2R1bGVzIGZvciByZXNvbHZpbmcgRE9NIGhpZXJhcmNoeSBhbmQgcGx1Z2luIG9yZGVyaW5nLlxuICAgKi9cbiAgUmVhY3RJbmplY3Rpb24uRXZlbnRQbHVnaW5IdWIuaW5qZWN0RXZlbnRQbHVnaW5PcmRlcihEZWZhdWx0RXZlbnRQbHVnaW5PcmRlcik7XG4gIFJlYWN0SW5qZWN0aW9uLkV2ZW50UGx1Z2luVXRpbHMuaW5qZWN0Q29tcG9uZW50VHJlZShSZWFjdERPTUNvbXBvbmVudFRyZWUpO1xuICBSZWFjdEluamVjdGlvbi5FdmVudFBsdWdpblV0aWxzLmluamVjdFRyZWVUcmF2ZXJzYWwoUmVhY3RET01UcmVlVHJhdmVyc2FsKTtcblxuICAvKipcbiAgICogU29tZSBpbXBvcnRhbnQgZXZlbnQgcGx1Z2lucyBpbmNsdWRlZCBieSBkZWZhdWx0ICh3aXRob3V0IGhhdmluZyB0byByZXF1aXJlXG4gICAqIHRoZW0pLlxuICAgKi9cbiAgUmVhY3RJbmplY3Rpb24uRXZlbnRQbHVnaW5IdWIuaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lKHtcbiAgICBTaW1wbGVFdmVudFBsdWdpbjogU2ltcGxlRXZlbnRQbHVnaW4sXG4gICAgRW50ZXJMZWF2ZUV2ZW50UGx1Z2luOiBFbnRlckxlYXZlRXZlbnRQbHVnaW4sXG4gICAgQ2hhbmdlRXZlbnRQbHVnaW46IENoYW5nZUV2ZW50UGx1Z2luLFxuICAgIFNlbGVjdEV2ZW50UGx1Z2luOiBTZWxlY3RFdmVudFBsdWdpbixcbiAgICBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luOiBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luXG4gIH0pO1xuXG4gIFJlYWN0SW5qZWN0aW9uLkhvc3RDb21wb25lbnQuaW5qZWN0R2VuZXJpY0NvbXBvbmVudENsYXNzKFJlYWN0RE9NQ29tcG9uZW50KTtcblxuICBSZWFjdEluamVjdGlvbi5Ib3N0Q29tcG9uZW50LmluamVjdFRleHRDb21wb25lbnRDbGFzcyhSZWFjdERPTVRleHRDb21wb25lbnQpO1xuXG4gIFJlYWN0SW5qZWN0aW9uLkRPTVByb3BlcnR5LmluamVjdERPTVByb3BlcnR5Q29uZmlnKEFSSUFET01Qcm9wZXJ0eUNvbmZpZyk7XG4gIFJlYWN0SW5qZWN0aW9uLkRPTVByb3BlcnR5LmluamVjdERPTVByb3BlcnR5Q29uZmlnKEhUTUxET01Qcm9wZXJ0eUNvbmZpZyk7XG4gIFJlYWN0SW5qZWN0aW9uLkRPTVByb3BlcnR5LmluamVjdERPTVByb3BlcnR5Q29uZmlnKFNWR0RPTVByb3BlcnR5Q29uZmlnKTtcblxuICBSZWFjdEluamVjdGlvbi5FbXB0eUNvbXBvbmVudC5pbmplY3RFbXB0eUNvbXBvbmVudEZhY3RvcnkoZnVuY3Rpb24gKGluc3RhbnRpYXRlKSB7XG4gICAgcmV0dXJuIG5ldyBSZWFjdERPTUVtcHR5Q29tcG9uZW50KGluc3RhbnRpYXRlKTtcbiAgfSk7XG5cbiAgUmVhY3RJbmplY3Rpb24uVXBkYXRlcy5pbmplY3RSZWNvbmNpbGVUcmFuc2FjdGlvbihSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uKTtcbiAgUmVhY3RJbmplY3Rpb24uVXBkYXRlcy5pbmplY3RCYXRjaGluZ1N0cmF0ZWd5KFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3kpO1xuXG4gIFJlYWN0SW5qZWN0aW9uLkNvbXBvbmVudC5pbmplY3RFbnZpcm9ubWVudChSZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpbmplY3Q6IGluamVjdFxufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdERlZmF1bHRJbmplY3Rpb24uanNcbi8vIG1vZHVsZSBpZCA9IDIxMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 212 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar ARIADOMPropertyConfig = {\n  Properties: {\n    // Global States and Properties\n    'aria-current': 0, // state\n    'aria-details': 0,\n    'aria-disabled': 0, // state\n    'aria-hidden': 0, // state\n    'aria-invalid': 0, // state\n    'aria-keyshortcuts': 0,\n    'aria-label': 0,\n    'aria-roledescription': 0,\n    // Widget Attributes\n    'aria-autocomplete': 0,\n    'aria-checked': 0,\n    'aria-expanded': 0,\n    'aria-haspopup': 0,\n    'aria-level': 0,\n    'aria-modal': 0,\n    'aria-multiline': 0,\n    'aria-multiselectable': 0,\n    'aria-orientation': 0,\n    'aria-placeholder': 0,\n    'aria-pressed': 0,\n    'aria-readonly': 0,\n    'aria-required': 0,\n    'aria-selected': 0,\n    'aria-sort': 0,\n    'aria-valuemax': 0,\n    'aria-valuemin': 0,\n    'aria-valuenow': 0,\n    'aria-valuetext': 0,\n    // Live Region Attributes\n    'aria-atomic': 0,\n    'aria-busy': 0,\n    'aria-live': 0,\n    'aria-relevant': 0,\n    // Drag-and-Drop Attributes\n    'aria-dropeffect': 0,\n    'aria-grabbed': 0,\n    // Relationship Attributes\n    'aria-activedescendant': 0,\n    'aria-colcount': 0,\n    'aria-colindex': 0,\n    'aria-colspan': 0,\n    'aria-controls': 0,\n    'aria-describedby': 0,\n    'aria-errormessage': 0,\n    'aria-flowto': 0,\n    'aria-labelledby': 0,\n    'aria-owns': 0,\n    'aria-posinset': 0,\n    'aria-rowcount': 0,\n    'aria-rowindex': 0,\n    'aria-rowspan': 0,\n    'aria-setsize': 0\n  },\n  DOMAttributeNames: {},\n  DOMPropertyNames: {}\n};\n\nmodule.exports = ARIADOMPropertyConfig;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0FSSUFET01Qcm9wZXJ0eUNvbmZpZy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgQVJJQURPTVByb3BlcnR5Q29uZmlnID0ge1xuICBQcm9wZXJ0aWVzOiB7XG4gICAgLy8gR2xvYmFsIFN0YXRlcyBhbmQgUHJvcGVydGllc1xuICAgICdhcmlhLWN1cnJlbnQnOiAwLCAvLyBzdGF0ZVxuICAgICdhcmlhLWRldGFpbHMnOiAwLFxuICAgICdhcmlhLWRpc2FibGVkJzogMCwgLy8gc3RhdGVcbiAgICAnYXJpYS1oaWRkZW4nOiAwLCAvLyBzdGF0ZVxuICAgICdhcmlhLWludmFsaWQnOiAwLCAvLyBzdGF0ZVxuICAgICdhcmlhLWtleXNob3J0Y3V0cyc6IDAsXG4gICAgJ2FyaWEtbGFiZWwnOiAwLFxuICAgICdhcmlhLXJvbGVkZXNjcmlwdGlvbic6IDAsXG4gICAgLy8gV2lkZ2V0IEF0dHJpYnV0ZXNcbiAgICAnYXJpYS1hdXRvY29tcGxldGUnOiAwLFxuICAgICdhcmlhLWNoZWNrZWQnOiAwLFxuICAgICdhcmlhLWV4cGFuZGVkJzogMCxcbiAgICAnYXJpYS1oYXNwb3B1cCc6IDAsXG4gICAgJ2FyaWEtbGV2ZWwnOiAwLFxuICAgICdhcmlhLW1vZGFsJzogMCxcbiAgICAnYXJpYS1tdWx0aWxpbmUnOiAwLFxuICAgICdhcmlhLW11bHRpc2VsZWN0YWJsZSc6IDAsXG4gICAgJ2FyaWEtb3JpZW50YXRpb24nOiAwLFxuICAgICdhcmlhLXBsYWNlaG9sZGVyJzogMCxcbiAgICAnYXJpYS1wcmVzc2VkJzogMCxcbiAgICAnYXJpYS1yZWFkb25seSc6IDAsXG4gICAgJ2FyaWEtcmVxdWlyZWQnOiAwLFxuICAgICdhcmlhLXNlbGVjdGVkJzogMCxcbiAgICAnYXJpYS1zb3J0JzogMCxcbiAgICAnYXJpYS12YWx1ZW1heCc6IDAsXG4gICAgJ2FyaWEtdmFsdWVtaW4nOiAwLFxuICAgICdhcmlhLXZhbHVlbm93JzogMCxcbiAgICAnYXJpYS12YWx1ZXRleHQnOiAwLFxuICAgIC8vIExpdmUgUmVnaW9uIEF0dHJpYnV0ZXNcbiAgICAnYXJpYS1hdG9taWMnOiAwLFxuICAgICdhcmlhLWJ1c3knOiAwLFxuICAgICdhcmlhLWxpdmUnOiAwLFxuICAgICdhcmlhLXJlbGV2YW50JzogMCxcbiAgICAvLyBEcmFnLWFuZC1Ecm9wIEF0dHJpYnV0ZXNcbiAgICAnYXJpYS1kcm9wZWZmZWN0JzogMCxcbiAgICAnYXJpYS1ncmFiYmVkJzogMCxcbiAgICAvLyBSZWxhdGlvbnNoaXAgQXR0cmlidXRlc1xuICAgICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnOiAwLFxuICAgICdhcmlhLWNvbGNvdW50JzogMCxcbiAgICAnYXJpYS1jb2xpbmRleCc6IDAsXG4gICAgJ2FyaWEtY29sc3Bhbic6IDAsXG4gICAgJ2FyaWEtY29udHJvbHMnOiAwLFxuICAgICdhcmlhLWRlc2NyaWJlZGJ5JzogMCxcbiAgICAnYXJpYS1lcnJvcm1lc3NhZ2UnOiAwLFxuICAgICdhcmlhLWZsb3d0byc6IDAsXG4gICAgJ2FyaWEtbGFiZWxsZWRieSc6IDAsXG4gICAgJ2FyaWEtb3ducyc6IDAsXG4gICAgJ2FyaWEtcG9zaW5zZXQnOiAwLFxuICAgICdhcmlhLXJvd2NvdW50JzogMCxcbiAgICAnYXJpYS1yb3dpbmRleCc6IDAsXG4gICAgJ2FyaWEtcm93c3Bhbic6IDAsXG4gICAgJ2FyaWEtc2V0c2l6ZSc6IDBcbiAgfSxcbiAgRE9NQXR0cmlidXRlTmFtZXM6IHt9LFxuICBET01Qcm9wZXJ0eU5hbWVzOiB7fVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBBUklBRE9NUHJvcGVydHlDb25maWc7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvQVJJQURPTVByb3BlcnR5Q29uZmlnLmpzXG4vLyBtb2R1bGUgaWQgPSAyMTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 213 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar EventPropagators = __webpack_require__(214);\nvar ExecutionEnvironment = __webpack_require__(221);\nvar FallbackCompositionState = __webpack_require__(222);\nvar SyntheticCompositionEvent = __webpack_require__(225);\nvar SyntheticInputEvent = __webpack_require__(227);\n\nvar END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space\nvar START_KEYCODE = 229;\n\nvar canUseCompositionEvent = ExecutionEnvironment.canUseDOM && 'CompositionEvent' in window;\n\nvar documentMode = null;\nif (ExecutionEnvironment.canUseDOM && 'documentMode' in document) {\n  documentMode = document.documentMode;\n}\n\n// Webkit offers a very useful `textInput` event that can be used to\n// directly represent `beforeInput`. The IE `textinput` event is not as\n// useful, so we don't use it.\nvar canUseTextInputEvent = ExecutionEnvironment.canUseDOM && 'TextEvent' in window && !documentMode && !isPresto();\n\n// In IE9+, we have access to composition events, but the data supplied\n// by the native compositionend event may be incorrect. Japanese ideographic\n// spaces, for instance (\\u3000) are not recorded correctly.\nvar useFallbackCompositionData = ExecutionEnvironment.canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11);\n\n/**\n * Opera <= 12 includes TextEvent in window, but does not fire\n * text input events. Rely on keypress instead.\n */\nfunction isPresto() {\n  var opera = window.opera;\n  return typeof opera === 'object' && typeof opera.version === 'function' && parseInt(opera.version(), 10) <= 12;\n}\n\nvar SPACEBAR_CODE = 32;\nvar SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE);\n\n// Events and their corresponding property names.\nvar eventTypes = {\n  beforeInput: {\n    phasedRegistrationNames: {\n      bubbled: 'onBeforeInput',\n      captured: 'onBeforeInputCapture'\n    },\n    dependencies: ['topCompositionEnd', 'topKeyPress', 'topTextInput', 'topPaste']\n  },\n  compositionEnd: {\n    phasedRegistrationNames: {\n      bubbled: 'onCompositionEnd',\n      captured: 'onCompositionEndCapture'\n    },\n    dependencies: ['topBlur', 'topCompositionEnd', 'topKeyDown', 'topKeyPress', 'topKeyUp', 'topMouseDown']\n  },\n  compositionStart: {\n    phasedRegistrationNames: {\n      bubbled: 'onCompositionStart',\n      captured: 'onCompositionStartCapture'\n    },\n    dependencies: ['topBlur', 'topCompositionStart', 'topKeyDown', 'topKeyPress', 'topKeyUp', 'topMouseDown']\n  },\n  compositionUpdate: {\n    phasedRegistrationNames: {\n      bubbled: 'onCompositionUpdate',\n      captured: 'onCompositionUpdateCapture'\n    },\n    dependencies: ['topBlur', 'topCompositionUpdate', 'topKeyDown', 'topKeyPress', 'topKeyUp', 'topMouseDown']\n  }\n};\n\n// Track whether we've ever handled a keypress on the space key.\nvar hasSpaceKeypress = false;\n\n/**\n * Return whether a native keypress event is assumed to be a command.\n * This is required because Firefox fires `keypress` events for key commands\n * (cut, copy, select-all, etc.) even though no character is inserted.\n */\nfunction isKeypressCommand(nativeEvent) {\n  return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) &&\n  // ctrlKey && altKey is equivalent to AltGr, and is not a command.\n  !(nativeEvent.ctrlKey && nativeEvent.altKey);\n}\n\n/**\n * Translate native top level events into event types.\n *\n * @param {string} topLevelType\n * @return {object}\n */\nfunction getCompositionEventType(topLevelType) {\n  switch (topLevelType) {\n    case 'topCompositionStart':\n      return eventTypes.compositionStart;\n    case 'topCompositionEnd':\n      return eventTypes.compositionEnd;\n    case 'topCompositionUpdate':\n      return eventTypes.compositionUpdate;\n  }\n}\n\n/**\n * Does our fallback best-guess model think this event signifies that\n * composition has begun?\n *\n * @param {string} topLevelType\n * @param {object} nativeEvent\n * @return {boolean}\n */\nfunction isFallbackCompositionStart(topLevelType, nativeEvent) {\n  return topLevelType === 'topKeyDown' && nativeEvent.keyCode === START_KEYCODE;\n}\n\n/**\n * Does our fallback mode think that this event is the end of composition?\n *\n * @param {string} topLevelType\n * @param {object} nativeEvent\n * @return {boolean}\n */\nfunction isFallbackCompositionEnd(topLevelType, nativeEvent) {\n  switch (topLevelType) {\n    case 'topKeyUp':\n      // Command keys insert or clear IME input.\n      return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;\n    case 'topKeyDown':\n      // Expect IME keyCode on each keydown. If we get any other\n      // code we must have exited earlier.\n      return nativeEvent.keyCode !== START_KEYCODE;\n    case 'topKeyPress':\n    case 'topMouseDown':\n    case 'topBlur':\n      // Events are not possible without cancelling IME.\n      return true;\n    default:\n      return false;\n  }\n}\n\n/**\n * Google Input Tools provides composition data via a CustomEvent,\n * with the `data` property populated in the `detail` object. If this\n * is available on the event object, use it. If not, this is a plain\n * composition event and we have nothing special to extract.\n *\n * @param {object} nativeEvent\n * @return {?string}\n */\nfunction getDataFromCustomEvent(nativeEvent) {\n  var detail = nativeEvent.detail;\n  if (typeof detail === 'object' && 'data' in detail) {\n    return detail.data;\n  }\n  return null;\n}\n\n// Track the current IME composition fallback object, if any.\nvar currentComposition = null;\n\n/**\n * @return {?object} A SyntheticCompositionEvent.\n */\nfunction extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n  var eventType;\n  var fallbackData;\n\n  if (canUseCompositionEvent) {\n    eventType = getCompositionEventType(topLevelType);\n  } else if (!currentComposition) {\n    if (isFallbackCompositionStart(topLevelType, nativeEvent)) {\n      eventType = eventTypes.compositionStart;\n    }\n  } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) {\n    eventType = eventTypes.compositionEnd;\n  }\n\n  if (!eventType) {\n    return null;\n  }\n\n  if (useFallbackCompositionData) {\n    // The current composition is stored statically and must not be\n    // overwritten while composition continues.\n    if (!currentComposition && eventType === eventTypes.compositionStart) {\n      currentComposition = FallbackCompositionState.getPooled(nativeEventTarget);\n    } else if (eventType === eventTypes.compositionEnd) {\n      if (currentComposition) {\n        fallbackData = currentComposition.getData();\n      }\n    }\n  }\n\n  var event = SyntheticCompositionEvent.getPooled(eventType, targetInst, nativeEvent, nativeEventTarget);\n\n  if (fallbackData) {\n    // Inject data generated from fallback path into the synthetic event.\n    // This matches the property of native CompositionEventInterface.\n    event.data = fallbackData;\n  } else {\n    var customData = getDataFromCustomEvent(nativeEvent);\n    if (customData !== null) {\n      event.data = customData;\n    }\n  }\n\n  EventPropagators.accumulateTwoPhaseDispatches(event);\n  return event;\n}\n\n/**\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {object} nativeEvent Native browser event.\n * @return {?string} The string corresponding to this `beforeInput` event.\n */\nfunction getNativeBeforeInputChars(topLevelType, nativeEvent) {\n  switch (topLevelType) {\n    case 'topCompositionEnd':\n      return getDataFromCustomEvent(nativeEvent);\n    case 'topKeyPress':\n      /**\n       * If native `textInput` events are available, our goal is to make\n       * use of them. However, there is a special case: the spacebar key.\n       * In Webkit, preventing default on a spacebar `textInput` event\n       * cancels character insertion, but it *also* causes the browser\n       * to fall back to its default spacebar behavior of scrolling the\n       * page.\n       *\n       * Tracking at:\n       * https://code.google.com/p/chromium/issues/detail?id=355103\n       *\n       * To avoid this issue, use the keypress event as if no `textInput`\n       * event is available.\n       */\n      var which = nativeEvent.which;\n      if (which !== SPACEBAR_CODE) {\n        return null;\n      }\n\n      hasSpaceKeypress = true;\n      return SPACEBAR_CHAR;\n\n    case 'topTextInput':\n      // Record the characters to be added to the DOM.\n      var chars = nativeEvent.data;\n\n      // If it's a spacebar character, assume that we have already handled\n      // it at the keypress level and bail immediately. Android Chrome\n      // doesn't give us keycodes, so we need to blacklist it.\n      if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {\n        return null;\n      }\n\n      return chars;\n\n    default:\n      // For other native event types, do nothing.\n      return null;\n  }\n}\n\n/**\n * For browsers that do not provide the `textInput` event, extract the\n * appropriate string to use for SyntheticInputEvent.\n *\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {object} nativeEvent Native browser event.\n * @return {?string} The fallback string for this `beforeInput` event.\n */\nfunction getFallbackBeforeInputChars(topLevelType, nativeEvent) {\n  // If we are currently composing (IME) and using a fallback to do so,\n  // try to extract the composed characters from the fallback object.\n  // If composition event is available, we extract a string only at\n  // compositionevent, otherwise extract it at fallback events.\n  if (currentComposition) {\n    if (topLevelType === 'topCompositionEnd' || !canUseCompositionEvent && isFallbackCompositionEnd(topLevelType, nativeEvent)) {\n      var chars = currentComposition.getData();\n      FallbackCompositionState.release(currentComposition);\n      currentComposition = null;\n      return chars;\n    }\n    return null;\n  }\n\n  switch (topLevelType) {\n    case 'topPaste':\n      // If a paste event occurs after a keypress, throw out the input\n      // chars. Paste events should not lead to BeforeInput events.\n      return null;\n    case 'topKeyPress':\n      /**\n       * As of v27, Firefox may fire keypress events even when no character\n       * will be inserted. A few possibilities:\n       *\n       * - `which` is `0`. Arrow keys, Esc key, etc.\n       *\n       * - `which` is the pressed key code, but no char is available.\n       *   Ex: 'AltGr + d` in Polish. There is no modified character for\n       *   this key combination and no character is inserted into the\n       *   document, but FF fires the keypress for char code `100` anyway.\n       *   No `input` event will occur.\n       *\n       * - `which` is the pressed key code, but a command combination is\n       *   being used. Ex: `Cmd+C`. No character is inserted, and no\n       *   `input` event will occur.\n       */\n      if (nativeEvent.which && !isKeypressCommand(nativeEvent)) {\n        return String.fromCharCode(nativeEvent.which);\n      }\n      return null;\n    case 'topCompositionEnd':\n      return useFallbackCompositionData ? null : nativeEvent.data;\n    default:\n      return null;\n  }\n}\n\n/**\n * Extract a SyntheticInputEvent for `beforeInput`, based on either native\n * `textInput` or fallback behavior.\n *\n * @return {?object} A SyntheticInputEvent.\n */\nfunction extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n  var chars;\n\n  if (canUseTextInputEvent) {\n    chars = getNativeBeforeInputChars(topLevelType, nativeEvent);\n  } else {\n    chars = getFallbackBeforeInputChars(topLevelType, nativeEvent);\n  }\n\n  // If no characters are being inserted, no BeforeInput event should\n  // be fired.\n  if (!chars) {\n    return null;\n  }\n\n  var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, targetInst, nativeEvent, nativeEventTarget);\n\n  event.data = chars;\n  EventPropagators.accumulateTwoPhaseDispatches(event);\n  return event;\n}\n\n/**\n * Create an `onBeforeInput` event to match\n * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.\n *\n * This event plugin is based on the native `textInput` event\n * available in Chrome, Safari, Opera, and IE. This event fires after\n * `onKeyPress` and `onCompositionEnd`, but before `onInput`.\n *\n * `beforeInput` is spec'd but not implemented in any browsers, and\n * the `input` event does not provide any useful information about what has\n * actually been added, contrary to the spec. Thus, `textInput` is the best\n * available event to identify the characters that have actually been inserted\n * into the target node.\n *\n * This plugin is also responsible for emitting `composition` events, thus\n * allowing us to share composition fallback code for both `beforeInput` and\n * `composition` event types.\n */\nvar BeforeInputEventPlugin = {\n\n  eventTypes: eventTypes,\n\n  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n    return [extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget), extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget)];\n  }\n};\n\nmodule.exports = BeforeInputEventPlugin;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0JlZm9yZUlucHV0RXZlbnRQbHVnaW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50IEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXZlbnRQcm9wYWdhdG9ycyA9IHJlcXVpcmUoJy4vRXZlbnRQcm9wYWdhdG9ycycpO1xudmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gcmVxdWlyZSgnZmJqcy9saWIvRXhlY3V0aW9uRW52aXJvbm1lbnQnKTtcbnZhciBGYWxsYmFja0NvbXBvc2l0aW9uU3RhdGUgPSByZXF1aXJlKCcuL0ZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZScpO1xudmFyIFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQnKTtcbnZhciBTeW50aGV0aWNJbnB1dEV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNJbnB1dEV2ZW50Jyk7XG5cbnZhciBFTkRfS0VZQ09ERVMgPSBbOSwgMTMsIDI3LCAzMl07IC8vIFRhYiwgUmV0dXJuLCBFc2MsIFNwYWNlXG52YXIgU1RBUlRfS0VZQ09ERSA9IDIyOTtcblxudmFyIGNhblVzZUNvbXBvc2l0aW9uRXZlbnQgPSBFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gJiYgJ0NvbXBvc2l0aW9uRXZlbnQnIGluIHdpbmRvdztcblxudmFyIGRvY3VtZW50TW9kZSA9IG51bGw7XG5pZiAoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NICYmICdkb2N1bWVudE1vZGUnIGluIGRvY3VtZW50KSB7XG4gIGRvY3VtZW50TW9kZSA9IGRvY3VtZW50LmRvY3VtZW50TW9kZTtcbn1cblxuLy8gV2Via2l0IG9mZmVycyBhIHZlcnkgdXNlZnVsIGB0ZXh0SW5wdXRgIGV2ZW50IHRoYXQgY2FuIGJlIHVzZWQgdG9cbi8vIGRpcmVjdGx5IHJlcHJlc2VudCBgYmVmb3JlSW5wdXRgLiBUaGUgSUUgYHRleHRpbnB1dGAgZXZlbnQgaXMgbm90IGFzXG4vLyB1c2VmdWwsIHNvIHdlIGRvbid0IHVzZSBpdC5cbnZhciBjYW5Vc2VUZXh0SW5wdXRFdmVudCA9IEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSAmJiAnVGV4dEV2ZW50JyBpbiB3aW5kb3cgJiYgIWRvY3VtZW50TW9kZSAmJiAhaXNQcmVzdG8oKTtcblxuLy8gSW4gSUU5Kywgd2UgaGF2ZSBhY2Nlc3MgdG8gY29tcG9zaXRpb24gZXZlbnRzLCBidXQgdGhlIGRhdGEgc3VwcGxpZWRcbi8vIGJ5IHRoZSBuYXRpdmUgY29tcG9zaXRpb25lbmQgZXZlbnQgbWF5IGJlIGluY29ycmVjdC4gSmFwYW5lc2UgaWRlb2dyYXBoaWNcbi8vIHNwYWNlcywgZm9yIGluc3RhbmNlIChcXHUzMDAwKSBhcmUgbm90IHJlY29yZGVkIGNvcnJlY3RseS5cbnZhciB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSA9IEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSAmJiAoIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgfHwgZG9jdW1lbnRNb2RlICYmIGRvY3VtZW50TW9kZSA+IDggJiYgZG9jdW1lbnRNb2RlIDw9IDExKTtcblxuLyoqXG4gKiBPcGVyYSA8PSAxMiBpbmNsdWRlcyBUZXh0RXZlbnQgaW4gd2luZG93LCBidXQgZG9lcyBub3QgZmlyZVxuICogdGV4dCBpbnB1dCBldmVudHMuIFJlbHkgb24ga2V5cHJlc3MgaW5zdGVhZC5cbiAqL1xuZnVuY3Rpb24gaXNQcmVzdG8oKSB7XG4gIHZhciBvcGVyYSA9IHdpbmRvdy5vcGVyYTtcbiAgcmV0dXJuIHR5cGVvZiBvcGVyYSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9wZXJhLnZlcnNpb24gPT09ICdmdW5jdGlvbicgJiYgcGFyc2VJbnQob3BlcmEudmVyc2lvbigpLCAxMCkgPD0gMTI7XG59XG5cbnZhciBTUEFDRUJBUl9DT0RFID0gMzI7XG52YXIgU1BBQ0VCQVJfQ0hBUiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoU1BBQ0VCQVJfQ09ERSk7XG5cbi8vIEV2ZW50cyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBuYW1lcy5cbnZhciBldmVudFR5cGVzID0ge1xuICBiZWZvcmVJbnB1dDoge1xuICAgIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOiB7XG4gICAgICBidWJibGVkOiAnb25CZWZvcmVJbnB1dCcsXG4gICAgICBjYXB0dXJlZDogJ29uQmVmb3JlSW5wdXRDYXB0dXJlJ1xuICAgIH0sXG4gICAgZGVwZW5kZW5jaWVzOiBbJ3RvcENvbXBvc2l0aW9uRW5kJywgJ3RvcEtleVByZXNzJywgJ3RvcFRleHRJbnB1dCcsICd0b3BQYXN0ZSddXG4gIH0sXG4gIGNvbXBvc2l0aW9uRW5kOiB7XG4gICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHtcbiAgICAgIGJ1YmJsZWQ6ICdvbkNvbXBvc2l0aW9uRW5kJyxcbiAgICAgIGNhcHR1cmVkOiAnb25Db21wb3NpdGlvbkVuZENhcHR1cmUnXG4gICAgfSxcbiAgICBkZXBlbmRlbmNpZXM6IFsndG9wQmx1cicsICd0b3BDb21wb3NpdGlvbkVuZCcsICd0b3BLZXlEb3duJywgJ3RvcEtleVByZXNzJywgJ3RvcEtleVVwJywgJ3RvcE1vdXNlRG93biddXG4gIH0sXG4gIGNvbXBvc2l0aW9uU3RhcnQ6IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogJ29uQ29tcG9zaXRpb25TdGFydCcsXG4gICAgICBjYXB0dXJlZDogJ29uQ29tcG9zaXRpb25TdGFydENhcHR1cmUnXG4gICAgfSxcbiAgICBkZXBlbmRlbmNpZXM6IFsndG9wQmx1cicsICd0b3BDb21wb3NpdGlvblN0YXJ0JywgJ3RvcEtleURvd24nLCAndG9wS2V5UHJlc3MnLCAndG9wS2V5VXAnLCAndG9wTW91c2VEb3duJ11cbiAgfSxcbiAgY29tcG9zaXRpb25VcGRhdGU6IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogJ29uQ29tcG9zaXRpb25VcGRhdGUnLFxuICAgICAgY2FwdHVyZWQ6ICdvbkNvbXBvc2l0aW9uVXBkYXRlQ2FwdHVyZSdcbiAgICB9LFxuICAgIGRlcGVuZGVuY2llczogWyd0b3BCbHVyJywgJ3RvcENvbXBvc2l0aW9uVXBkYXRlJywgJ3RvcEtleURvd24nLCAndG9wS2V5UHJlc3MnLCAndG9wS2V5VXAnLCAndG9wTW91c2VEb3duJ11cbiAgfVxufTtcblxuLy8gVHJhY2sgd2hldGhlciB3ZSd2ZSBldmVyIGhhbmRsZWQgYSBrZXlwcmVzcyBvbiB0aGUgc3BhY2Uga2V5LlxudmFyIGhhc1NwYWNlS2V5cHJlc3MgPSBmYWxzZTtcblxuLyoqXG4gKiBSZXR1cm4gd2hldGhlciBhIG5hdGl2ZSBrZXlwcmVzcyBldmVudCBpcyBhc3N1bWVkIHRvIGJlIGEgY29tbWFuZC5cbiAqIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBGaXJlZm94IGZpcmVzIGBrZXlwcmVzc2AgZXZlbnRzIGZvciBrZXkgY29tbWFuZHNcbiAqIChjdXQsIGNvcHksIHNlbGVjdC1hbGwsIGV0Yy4pIGV2ZW4gdGhvdWdoIG5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZC5cbiAqL1xuZnVuY3Rpb24gaXNLZXlwcmVzc0NvbW1hbmQobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIChuYXRpdmVFdmVudC5jdHJsS2V5IHx8IG5hdGl2ZUV2ZW50LmFsdEtleSB8fCBuYXRpdmVFdmVudC5tZXRhS2V5KSAmJlxuICAvLyBjdHJsS2V5ICYmIGFsdEtleSBpcyBlcXVpdmFsZW50IHRvIEFsdEdyLCBhbmQgaXMgbm90IGEgY29tbWFuZC5cbiAgIShuYXRpdmVFdmVudC5jdHJsS2V5ICYmIG5hdGl2ZUV2ZW50LmFsdEtleSk7XG59XG5cbi8qKlxuICogVHJhbnNsYXRlIG5hdGl2ZSB0b3AgbGV2ZWwgZXZlbnRzIGludG8gZXZlbnQgdHlwZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRvcExldmVsVHlwZVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRDb21wb3NpdGlvbkV2ZW50VHlwZSh0b3BMZXZlbFR5cGUpIHtcbiAgc3dpdGNoICh0b3BMZXZlbFR5cGUpIHtcbiAgICBjYXNlICd0b3BDb21wb3NpdGlvblN0YXJ0JzpcbiAgICAgIHJldHVybiBldmVudFR5cGVzLmNvbXBvc2l0aW9uU3RhcnQ7XG4gICAgY2FzZSAndG9wQ29tcG9zaXRpb25FbmQnOlxuICAgICAgcmV0dXJuIGV2ZW50VHlwZXMuY29tcG9zaXRpb25FbmQ7XG4gICAgY2FzZSAndG9wQ29tcG9zaXRpb25VcGRhdGUnOlxuICAgICAgcmV0dXJuIGV2ZW50VHlwZXMuY29tcG9zaXRpb25VcGRhdGU7XG4gIH1cbn1cblxuLyoqXG4gKiBEb2VzIG91ciBmYWxsYmFjayBiZXN0LWd1ZXNzIG1vZGVsIHRoaW5rIHRoaXMgZXZlbnQgc2lnbmlmaWVzIHRoYXRcbiAqIGNvbXBvc2l0aW9uIGhhcyBiZWd1bj9cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdG9wTGV2ZWxUeXBlXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzRmFsbGJhY2tDb21wb3NpdGlvblN0YXJ0KHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIHRvcExldmVsVHlwZSA9PT0gJ3RvcEtleURvd24nICYmIG5hdGl2ZUV2ZW50LmtleUNvZGUgPT09IFNUQVJUX0tFWUNPREU7XG59XG5cbi8qKlxuICogRG9lcyBvdXIgZmFsbGJhY2sgbW9kZSB0aGluayB0aGF0IHRoaXMgZXZlbnQgaXMgdGhlIGVuZCBvZiBjb21wb3NpdGlvbj9cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdG9wTGV2ZWxUeXBlXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZCh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSB7XG4gIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7XG4gICAgY2FzZSAndG9wS2V5VXAnOlxuICAgICAgLy8gQ29tbWFuZCBrZXlzIGluc2VydCBvciBjbGVhciBJTUUgaW5wdXQuXG4gICAgICByZXR1cm4gRU5EX0tFWUNPREVTLmluZGV4T2YobmF0aXZlRXZlbnQua2V5Q29kZSkgIT09IC0xO1xuICAgIGNhc2UgJ3RvcEtleURvd24nOlxuICAgICAgLy8gRXhwZWN0IElNRSBrZXlDb2RlIG9uIGVhY2gga2V5ZG93bi4gSWYgd2UgZ2V0IGFueSBvdGhlclxuICAgICAgLy8gY29kZSB3ZSBtdXN0IGhhdmUgZXhpdGVkIGVhcmxpZXIuXG4gICAgICByZXR1cm4gbmF0aXZlRXZlbnQua2V5Q29kZSAhPT0gU1RBUlRfS0VZQ09ERTtcbiAgICBjYXNlICd0b3BLZXlQcmVzcyc6XG4gICAgY2FzZSAndG9wTW91c2VEb3duJzpcbiAgICBjYXNlICd0b3BCbHVyJzpcbiAgICAgIC8vIEV2ZW50cyBhcmUgbm90IHBvc3NpYmxlIHdpdGhvdXQgY2FuY2VsbGluZyBJTUUuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogR29vZ2xlIElucHV0IFRvb2xzIHByb3ZpZGVzIGNvbXBvc2l0aW9uIGRhdGEgdmlhIGEgQ3VzdG9tRXZlbnQsXG4gKiB3aXRoIHRoZSBgZGF0YWAgcHJvcGVydHkgcG9wdWxhdGVkIGluIHRoZSBgZGV0YWlsYCBvYmplY3QuIElmIHRoaXNcbiAqIGlzIGF2YWlsYWJsZSBvbiB0aGUgZXZlbnQgb2JqZWN0LCB1c2UgaXQuIElmIG5vdCwgdGhpcyBpcyBhIHBsYWluXG4gKiBjb21wb3NpdGlvbiBldmVudCBhbmQgd2UgaGF2ZSBub3RoaW5nIHNwZWNpYWwgdG8gZXh0cmFjdC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4gez9zdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGRldGFpbCA9IG5hdGl2ZUV2ZW50LmRldGFpbDtcbiAgaWYgKHR5cGVvZiBkZXRhaWwgPT09ICdvYmplY3QnICYmICdkYXRhJyBpbiBkZXRhaWwpIHtcbiAgICByZXR1cm4gZGV0YWlsLmRhdGE7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIFRyYWNrIHRoZSBjdXJyZW50IElNRSBjb21wb3NpdGlvbiBmYWxsYmFjayBvYmplY3QsIGlmIGFueS5cbnZhciBjdXJyZW50Q29tcG9zaXRpb24gPSBudWxsO1xuXG4vKipcbiAqIEByZXR1cm4gez9vYmplY3R9IEEgU3ludGhldGljQ29tcG9zaXRpb25FdmVudC5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgdmFyIGV2ZW50VHlwZTtcbiAgdmFyIGZhbGxiYWNrRGF0YTtcblxuICBpZiAoY2FuVXNlQ29tcG9zaXRpb25FdmVudCkge1xuICAgIGV2ZW50VHlwZSA9IGdldENvbXBvc2l0aW9uRXZlbnRUeXBlKHRvcExldmVsVHlwZSk7XG4gIH0gZWxzZSBpZiAoIWN1cnJlbnRDb21wb3NpdGlvbikge1xuICAgIGlmIChpc0ZhbGxiYWNrQ29tcG9zaXRpb25TdGFydCh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSkge1xuICAgICAgZXZlbnRUeXBlID0gZXZlbnRUeXBlcy5jb21wb3NpdGlvblN0YXJ0O1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkpIHtcbiAgICBldmVudFR5cGUgPSBldmVudFR5cGVzLmNvbXBvc2l0aW9uRW5kO1xuICB9XG5cbiAgaWYgKCFldmVudFR5cGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICh1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSkge1xuICAgIC8vIFRoZSBjdXJyZW50IGNvbXBvc2l0aW9uIGlzIHN0b3JlZCBzdGF0aWNhbGx5IGFuZCBtdXN0IG5vdCBiZVxuICAgIC8vIG92ZXJ3cml0dGVuIHdoaWxlIGNvbXBvc2l0aW9uIGNvbnRpbnVlcy5cbiAgICBpZiAoIWN1cnJlbnRDb21wb3NpdGlvbiAmJiBldmVudFR5cGUgPT09IGV2ZW50VHlwZXMuY29tcG9zaXRpb25TdGFydCkge1xuICAgICAgY3VycmVudENvbXBvc2l0aW9uID0gRmFsbGJhY2tDb21wb3NpdGlvblN0YXRlLmdldFBvb2xlZChuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09IGV2ZW50VHlwZXMuY29tcG9zaXRpb25FbmQpIHtcbiAgICAgIGlmIChjdXJyZW50Q29tcG9zaXRpb24pIHtcbiAgICAgICAgZmFsbGJhY2tEYXRhID0gY3VycmVudENvbXBvc2l0aW9uLmdldERhdGEoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgZXZlbnQgPSBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50LmdldFBvb2xlZChldmVudFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgaWYgKGZhbGxiYWNrRGF0YSkge1xuICAgIC8vIEluamVjdCBkYXRhIGdlbmVyYXRlZCBmcm9tIGZhbGxiYWNrIHBhdGggaW50byB0aGUgc3ludGhldGljIGV2ZW50LlxuICAgIC8vIFRoaXMgbWF0Y2hlcyB0aGUgcHJvcGVydHkgb2YgbmF0aXZlIENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UuXG4gICAgZXZlbnQuZGF0YSA9IGZhbGxiYWNrRGF0YTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgY3VzdG9tRGF0YSA9IGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpO1xuICAgIGlmIChjdXN0b21EYXRhICE9PSBudWxsKSB7XG4gICAgICBldmVudC5kYXRhID0gY3VzdG9tRGF0YTtcbiAgICB9XG4gIH1cblxuICBFdmVudFByb3BhZ2F0b3JzLmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoZXZlbnQpO1xuICByZXR1cm4gZXZlbnQ7XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHRvcExldmVsVHlwZSBSZWNvcmQgZnJvbSBgRXZlbnRDb25zdGFudHNgLlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7P3N0cmluZ30gVGhlIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgYGJlZm9yZUlucHV0YCBldmVudC5cbiAqL1xuZnVuY3Rpb24gZ2V0TmF0aXZlQmVmb3JlSW5wdXRDaGFycyh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSB7XG4gIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7XG4gICAgY2FzZSAndG9wQ29tcG9zaXRpb25FbmQnOlxuICAgICAgcmV0dXJuIGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpO1xuICAgIGNhc2UgJ3RvcEtleVByZXNzJzpcbiAgICAgIC8qKlxuICAgICAgICogSWYgbmF0aXZlIGB0ZXh0SW5wdXRgIGV2ZW50cyBhcmUgYXZhaWxhYmxlLCBvdXIgZ29hbCBpcyB0byBtYWtlXG4gICAgICAgKiB1c2Ugb2YgdGhlbS4gSG93ZXZlciwgdGhlcmUgaXMgYSBzcGVjaWFsIGNhc2U6IHRoZSBzcGFjZWJhciBrZXkuXG4gICAgICAgKiBJbiBXZWJraXQsIHByZXZlbnRpbmcgZGVmYXVsdCBvbiBhIHNwYWNlYmFyIGB0ZXh0SW5wdXRgIGV2ZW50XG4gICAgICAgKiBjYW5jZWxzIGNoYXJhY3RlciBpbnNlcnRpb24sIGJ1dCBpdCAqYWxzbyogY2F1c2VzIHRoZSBicm93c2VyXG4gICAgICAgKiB0byBmYWxsIGJhY2sgdG8gaXRzIGRlZmF1bHQgc3BhY2ViYXIgYmVoYXZpb3Igb2Ygc2Nyb2xsaW5nIHRoZVxuICAgICAgICogcGFnZS5cbiAgICAgICAqXG4gICAgICAgKiBUcmFja2luZyBhdDpcbiAgICAgICAqIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNTUxMDNcbiAgICAgICAqXG4gICAgICAgKiBUbyBhdm9pZCB0aGlzIGlzc3VlLCB1c2UgdGhlIGtleXByZXNzIGV2ZW50IGFzIGlmIG5vIGB0ZXh0SW5wdXRgXG4gICAgICAgKiBldmVudCBpcyBhdmFpbGFibGUuXG4gICAgICAgKi9cbiAgICAgIHZhciB3aGljaCA9IG5hdGl2ZUV2ZW50LndoaWNoO1xuICAgICAgaWYgKHdoaWNoICE9PSBTUEFDRUJBUl9DT0RFKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBoYXNTcGFjZUtleXByZXNzID0gdHJ1ZTtcbiAgICAgIHJldHVybiBTUEFDRUJBUl9DSEFSO1xuXG4gICAgY2FzZSAndG9wVGV4dElucHV0JzpcbiAgICAgIC8vIFJlY29yZCB0aGUgY2hhcmFjdGVycyB0byBiZSBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgdmFyIGNoYXJzID0gbmF0aXZlRXZlbnQuZGF0YTtcblxuICAgICAgLy8gSWYgaXQncyBhIHNwYWNlYmFyIGNoYXJhY3RlciwgYXNzdW1lIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWRcbiAgICAgIC8vIGl0IGF0IHRoZSBrZXlwcmVzcyBsZXZlbCBhbmQgYmFpbCBpbW1lZGlhdGVseS4gQW5kcm9pZCBDaHJvbWVcbiAgICAgIC8vIGRvZXNuJ3QgZ2l2ZSB1cyBrZXljb2Rlcywgc28gd2UgbmVlZCB0byBibGFja2xpc3QgaXQuXG4gICAgICBpZiAoY2hhcnMgPT09IFNQQUNFQkFSX0NIQVIgJiYgaGFzU3BhY2VLZXlwcmVzcykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNoYXJzO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIEZvciBvdGhlciBuYXRpdmUgZXZlbnQgdHlwZXMsIGRvIG5vdGhpbmcuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEZvciBicm93c2VycyB0aGF0IGRvIG5vdCBwcm92aWRlIHRoZSBgdGV4dElucHV0YCBldmVudCwgZXh0cmFjdCB0aGVcbiAqIGFwcHJvcHJpYXRlIHN0cmluZyB0byB1c2UgZm9yIFN5bnRoZXRpY0lucHV0RXZlbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRvcExldmVsVHlwZSBSZWNvcmQgZnJvbSBgRXZlbnRDb25zdGFudHNgLlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7P3N0cmluZ30gVGhlIGZhbGxiYWNrIHN0cmluZyBmb3IgdGhpcyBgYmVmb3JlSW5wdXRgIGV2ZW50LlxuICovXG5mdW5jdGlvbiBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnModG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkge1xuICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGNvbXBvc2luZyAoSU1FKSBhbmQgdXNpbmcgYSBmYWxsYmFjayB0byBkbyBzbyxcbiAgLy8gdHJ5IHRvIGV4dHJhY3QgdGhlIGNvbXBvc2VkIGNoYXJhY3RlcnMgZnJvbSB0aGUgZmFsbGJhY2sgb2JqZWN0LlxuICAvLyBJZiBjb21wb3NpdGlvbiBldmVudCBpcyBhdmFpbGFibGUsIHdlIGV4dHJhY3QgYSBzdHJpbmcgb25seSBhdFxuICAvLyBjb21wb3NpdGlvbmV2ZW50LCBvdGhlcndpc2UgZXh0cmFjdCBpdCBhdCBmYWxsYmFjayBldmVudHMuXG4gIGlmIChjdXJyZW50Q29tcG9zaXRpb24pIHtcbiAgICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wQ29tcG9zaXRpb25FbmQnIHx8ICFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ICYmIGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZCh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSkge1xuICAgICAgdmFyIGNoYXJzID0gY3VycmVudENvbXBvc2l0aW9uLmdldERhdGEoKTtcbiAgICAgIEZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZS5yZWxlYXNlKGN1cnJlbnRDb21wb3NpdGlvbik7XG4gICAgICBjdXJyZW50Q29tcG9zaXRpb24gPSBudWxsO1xuICAgICAgcmV0dXJuIGNoYXJzO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7XG4gICAgY2FzZSAndG9wUGFzdGUnOlxuICAgICAgLy8gSWYgYSBwYXN0ZSBldmVudCBvY2N1cnMgYWZ0ZXIgYSBrZXlwcmVzcywgdGhyb3cgb3V0IHRoZSBpbnB1dFxuICAgICAgLy8gY2hhcnMuIFBhc3RlIGV2ZW50cyBzaG91bGQgbm90IGxlYWQgdG8gQmVmb3JlSW5wdXQgZXZlbnRzLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgY2FzZSAndG9wS2V5UHJlc3MnOlxuICAgICAgLyoqXG4gICAgICAgKiBBcyBvZiB2MjcsIEZpcmVmb3ggbWF5IGZpcmUga2V5cHJlc3MgZXZlbnRzIGV2ZW4gd2hlbiBubyBjaGFyYWN0ZXJcbiAgICAgICAqIHdpbGwgYmUgaW5zZXJ0ZWQuIEEgZmV3IHBvc3NpYmlsaXRpZXM6XG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIGAwYC4gQXJyb3cga2V5cywgRXNjIGtleSwgZXRjLlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyB0aGUgcHJlc3NlZCBrZXkgY29kZSwgYnV0IG5vIGNoYXIgaXMgYXZhaWxhYmxlLlxuICAgICAgICogICBFeDogJ0FsdEdyICsgZGAgaW4gUG9saXNoLiBUaGVyZSBpcyBubyBtb2RpZmllZCBjaGFyYWN0ZXIgZm9yXG4gICAgICAgKiAgIHRoaXMga2V5IGNvbWJpbmF0aW9uIGFuZCBubyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQgaW50byB0aGVcbiAgICAgICAqICAgZG9jdW1lbnQsIGJ1dCBGRiBmaXJlcyB0aGUga2V5cHJlc3MgZm9yIGNoYXIgY29kZSBgMTAwYCBhbnl3YXkuXG4gICAgICAgKiAgIE5vIGBpbnB1dGAgZXZlbnQgd2lsbCBvY2N1ci5cbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgdGhlIHByZXNzZWQga2V5IGNvZGUsIGJ1dCBhIGNvbW1hbmQgY29tYmluYXRpb24gaXNcbiAgICAgICAqICAgYmVpbmcgdXNlZC4gRXg6IGBDbWQrQ2AuIE5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZCwgYW5kIG5vXG4gICAgICAgKiAgIGBpbnB1dGAgZXZlbnQgd2lsbCBvY2N1ci5cbiAgICAgICAqL1xuICAgICAgaWYgKG5hdGl2ZUV2ZW50LndoaWNoICYmICFpc0tleXByZXNzQ29tbWFuZChuYXRpdmVFdmVudCkpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUobmF0aXZlRXZlbnQud2hpY2gpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgY2FzZSAndG9wQ29tcG9zaXRpb25FbmQnOlxuICAgICAgcmV0dXJuIHVzZUZhbGxiYWNrQ29tcG9zaXRpb25EYXRhID8gbnVsbCA6IG5hdGl2ZUV2ZW50LmRhdGE7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdCBhIFN5bnRoZXRpY0lucHV0RXZlbnQgZm9yIGBiZWZvcmVJbnB1dGAsIGJhc2VkIG9uIGVpdGhlciBuYXRpdmVcbiAqIGB0ZXh0SW5wdXRgIG9yIGZhbGxiYWNrIGJlaGF2aW9yLlxuICpcbiAqIEByZXR1cm4gez9vYmplY3R9IEEgU3ludGhldGljSW5wdXRFdmVudC5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdEJlZm9yZUlucHV0RXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgdmFyIGNoYXJzO1xuXG4gIGlmIChjYW5Vc2VUZXh0SW5wdXRFdmVudCkge1xuICAgIGNoYXJzID0gZ2V0TmF0aXZlQmVmb3JlSW5wdXRDaGFycyh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KTtcbiAgfSBlbHNlIHtcbiAgICBjaGFycyA9IGdldEZhbGxiYWNrQmVmb3JlSW5wdXRDaGFycyh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KTtcbiAgfVxuXG4gIC8vIElmIG5vIGNoYXJhY3RlcnMgYXJlIGJlaW5nIGluc2VydGVkLCBubyBCZWZvcmVJbnB1dCBldmVudCBzaG91bGRcbiAgLy8gYmUgZmlyZWQuXG4gIGlmICghY2hhcnMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBldmVudCA9IFN5bnRoZXRpY0lucHV0RXZlbnQuZ2V0UG9vbGVkKGV2ZW50VHlwZXMuYmVmb3JlSW5wdXQsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgZXZlbnQuZGF0YSA9IGNoYXJzO1xuICBFdmVudFByb3BhZ2F0b3JzLmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoZXZlbnQpO1xuICByZXR1cm4gZXZlbnQ7XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIGBvbkJlZm9yZUlucHV0YCBldmVudCB0byBtYXRjaFxuICogaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAxMzExMDUvI2V2ZW50cy1pbnB1dGV2ZW50cy5cbiAqXG4gKiBUaGlzIGV2ZW50IHBsdWdpbiBpcyBiYXNlZCBvbiB0aGUgbmF0aXZlIGB0ZXh0SW5wdXRgIGV2ZW50XG4gKiBhdmFpbGFibGUgaW4gQ2hyb21lLCBTYWZhcmksIE9wZXJhLCBhbmQgSUUuIFRoaXMgZXZlbnQgZmlyZXMgYWZ0ZXJcbiAqIGBvbktleVByZXNzYCBhbmQgYG9uQ29tcG9zaXRpb25FbmRgLCBidXQgYmVmb3JlIGBvbklucHV0YC5cbiAqXG4gKiBgYmVmb3JlSW5wdXRgIGlzIHNwZWMnZCBidXQgbm90IGltcGxlbWVudGVkIGluIGFueSBicm93c2VycywgYW5kXG4gKiB0aGUgYGlucHV0YCBldmVudCBkb2VzIG5vdCBwcm92aWRlIGFueSB1c2VmdWwgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBoYXNcbiAqIGFjdHVhbGx5IGJlZW4gYWRkZWQsIGNvbnRyYXJ5IHRvIHRoZSBzcGVjLiBUaHVzLCBgdGV4dElucHV0YCBpcyB0aGUgYmVzdFxuICogYXZhaWxhYmxlIGV2ZW50IHRvIGlkZW50aWZ5IHRoZSBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBhY3R1YWxseSBiZWVuIGluc2VydGVkXG4gKiBpbnRvIHRoZSB0YXJnZXQgbm9kZS5cbiAqXG4gKiBUaGlzIHBsdWdpbiBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBgY29tcG9zaXRpb25gIGV2ZW50cywgdGh1c1xuICogYWxsb3dpbmcgdXMgdG8gc2hhcmUgY29tcG9zaXRpb24gZmFsbGJhY2sgY29kZSBmb3IgYm90aCBgYmVmb3JlSW5wdXRgIGFuZFxuICogYGNvbXBvc2l0aW9uYCBldmVudCB0eXBlcy5cbiAqL1xudmFyIEJlZm9yZUlucHV0RXZlbnRQbHVnaW4gPSB7XG5cbiAgZXZlbnRUeXBlczogZXZlbnRUeXBlcyxcblxuICBleHRyYWN0RXZlbnRzOiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICByZXR1cm4gW2V4dHJhY3RDb21wb3NpdGlvbkV2ZW50KHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSwgZXh0cmFjdEJlZm9yZUlucHV0RXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpXTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL0JlZm9yZUlucHV0RXZlbnRQbHVnaW4uanNcbi8vIG1vZHVsZSBpZCA9IDIxM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 214 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar EventPluginHub = __webpack_require__(215);\nvar EventPluginUtils = __webpack_require__(217);\n\nvar accumulateInto = __webpack_require__(219);\nvar forEachAccumulated = __webpack_require__(220);\nvar warning = __webpack_require__(183);\n\nvar getListener = EventPluginHub.getListener;\n\n/**\n * Some event types have a notion of different registration names for different\n * \"phases\" of propagation. This finds listeners by a given phase.\n */\nfunction listenerAtPhase(inst, event, propagationPhase) {\n  var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase];\n  return getListener(inst, registrationName);\n}\n\n/**\n * Tags a `SyntheticEvent` with dispatched listeners. Creating this function\n * here, allows us to not have to bind or create functions for each event.\n * Mutating the event's members allows us to not have to create a wrapping\n * \"dispatch\" object that pairs the event with the listener.\n */\nfunction accumulateDirectionalDispatches(inst, phase, event) {\n  if (true) {\n     true ? warning(inst, 'Dispatching inst must not be null') : void 0;\n  }\n  var listener = listenerAtPhase(inst, event, phase);\n  if (listener) {\n    event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);\n    event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);\n  }\n}\n\n/**\n * Collect dispatches (must be entirely collected before dispatching - see unit\n * tests). Lazily allocate the array to conserve memory.  We must loop through\n * each event and perform the traversal for each one. We cannot perform a\n * single traversal for the entire collection of events because each event may\n * have a different target.\n */\nfunction accumulateTwoPhaseDispatchesSingle(event) {\n  if (event && event.dispatchConfig.phasedRegistrationNames) {\n    EventPluginUtils.traverseTwoPhase(event._targetInst, accumulateDirectionalDispatches, event);\n  }\n}\n\n/**\n * Same as `accumulateTwoPhaseDispatchesSingle`, but skips over the targetID.\n */\nfunction accumulateTwoPhaseDispatchesSingleSkipTarget(event) {\n  if (event && event.dispatchConfig.phasedRegistrationNames) {\n    var targetInst = event._targetInst;\n    var parentInst = targetInst ? EventPluginUtils.getParentInstance(targetInst) : null;\n    EventPluginUtils.traverseTwoPhase(parentInst, accumulateDirectionalDispatches, event);\n  }\n}\n\n/**\n * Accumulates without regard to direction, does not look for phased\n * registration names. Same as `accumulateDirectDispatchesSingle` but without\n * requiring that the `dispatchMarker` be the same as the dispatched ID.\n */\nfunction accumulateDispatches(inst, ignoredDirection, event) {\n  if (event && event.dispatchConfig.registrationName) {\n    var registrationName = event.dispatchConfig.registrationName;\n    var listener = getListener(inst, registrationName);\n    if (listener) {\n      event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);\n      event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);\n    }\n  }\n}\n\n/**\n * Accumulates dispatches on an `SyntheticEvent`, but only for the\n * `dispatchMarker`.\n * @param {SyntheticEvent} event\n */\nfunction accumulateDirectDispatchesSingle(event) {\n  if (event && event.dispatchConfig.registrationName) {\n    accumulateDispatches(event._targetInst, null, event);\n  }\n}\n\nfunction accumulateTwoPhaseDispatches(events) {\n  forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle);\n}\n\nfunction accumulateTwoPhaseDispatchesSkipTarget(events) {\n  forEachAccumulated(events, accumulateTwoPhaseDispatchesSingleSkipTarget);\n}\n\nfunction accumulateEnterLeaveDispatches(leave, enter, from, to) {\n  EventPluginUtils.traverseEnterLeave(from, to, accumulateDispatches, leave, enter);\n}\n\nfunction accumulateDirectDispatches(events) {\n  forEachAccumulated(events, accumulateDirectDispatchesSingle);\n}\n\n/**\n * A small set of propagation patterns, each of which will accept a small amount\n * of information, and generate a set of \"dispatch ready event objects\" - which\n * are sets of events that have already been annotated with a set of dispatched\n * listener functions/ids. The API is designed this way to discourage these\n * propagation strategies from actually executing the dispatches, since we\n * always want to collect the entire set of dispatches before executing event a\n * single one.\n *\n * @constructor EventPropagators\n */\nvar EventPropagators = {\n  accumulateTwoPhaseDispatches: accumulateTwoPhaseDispatches,\n  accumulateTwoPhaseDispatchesSkipTarget: accumulateTwoPhaseDispatchesSkipTarget,\n  accumulateDirectDispatches: accumulateDirectDispatches,\n  accumulateEnterLeaveDispatches: accumulateEnterLeaveDispatches\n};\n\nmodule.exports = EventPropagators;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0V2ZW50UHJvcGFnYXRvcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEV2ZW50UGx1Z2luSHViID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpbkh1YicpO1xudmFyIEV2ZW50UGx1Z2luVXRpbHMgPSByZXF1aXJlKCcuL0V2ZW50UGx1Z2luVXRpbHMnKTtcblxudmFyIGFjY3VtdWxhdGVJbnRvID0gcmVxdWlyZSgnLi9hY2N1bXVsYXRlSW50bycpO1xudmFyIGZvckVhY2hBY2N1bXVsYXRlZCA9IHJlcXVpcmUoJy4vZm9yRWFjaEFjY3VtdWxhdGVkJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIGdldExpc3RlbmVyID0gRXZlbnRQbHVnaW5IdWIuZ2V0TGlzdGVuZXI7XG5cbi8qKlxuICogU29tZSBldmVudCB0eXBlcyBoYXZlIGEgbm90aW9uIG9mIGRpZmZlcmVudCByZWdpc3RyYXRpb24gbmFtZXMgZm9yIGRpZmZlcmVudFxuICogXCJwaGFzZXNcIiBvZiBwcm9wYWdhdGlvbi4gVGhpcyBmaW5kcyBsaXN0ZW5lcnMgYnkgYSBnaXZlbiBwaGFzZS5cbiAqL1xuZnVuY3Rpb24gbGlzdGVuZXJBdFBoYXNlKGluc3QsIGV2ZW50LCBwcm9wYWdhdGlvblBoYXNlKSB7XG4gIHZhciByZWdpc3RyYXRpb25OYW1lID0gZXZlbnQuZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXNbcHJvcGFnYXRpb25QaGFzZV07XG4gIHJldHVybiBnZXRMaXN0ZW5lcihpbnN0LCByZWdpc3RyYXRpb25OYW1lKTtcbn1cblxuLyoqXG4gKiBUYWdzIGEgYFN5bnRoZXRpY0V2ZW50YCB3aXRoIGRpc3BhdGNoZWQgbGlzdGVuZXJzLiBDcmVhdGluZyB0aGlzIGZ1bmN0aW9uXG4gKiBoZXJlLCBhbGxvd3MgdXMgdG8gbm90IGhhdmUgdG8gYmluZCBvciBjcmVhdGUgZnVuY3Rpb25zIGZvciBlYWNoIGV2ZW50LlxuICogTXV0YXRpbmcgdGhlIGV2ZW50J3MgbWVtYmVycyBhbGxvd3MgdXMgdG8gbm90IGhhdmUgdG8gY3JlYXRlIGEgd3JhcHBpbmdcbiAqIFwiZGlzcGF0Y2hcIiBvYmplY3QgdGhhdCBwYWlycyB0aGUgZXZlbnQgd2l0aCB0aGUgbGlzdGVuZXIuXG4gKi9cbmZ1bmN0aW9uIGFjY3VtdWxhdGVEaXJlY3Rpb25hbERpc3BhdGNoZXMoaW5zdCwgcGhhc2UsIGV2ZW50KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoaW5zdCwgJ0Rpc3BhdGNoaW5nIGluc3QgbXVzdCBub3QgYmUgbnVsbCcpIDogdm9pZCAwO1xuICB9XG4gIHZhciBsaXN0ZW5lciA9IGxpc3RlbmVyQXRQaGFzZShpbnN0LCBldmVudCwgcGhhc2UpO1xuICBpZiAobGlzdGVuZXIpIHtcbiAgICBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMgPSBhY2N1bXVsYXRlSW50byhldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMsIGxpc3RlbmVyKTtcbiAgICBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMgPSBhY2N1bXVsYXRlSW50byhldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMsIGluc3QpO1xuICB9XG59XG5cbi8qKlxuICogQ29sbGVjdCBkaXNwYXRjaGVzIChtdXN0IGJlIGVudGlyZWx5IGNvbGxlY3RlZCBiZWZvcmUgZGlzcGF0Y2hpbmcgLSBzZWUgdW5pdFxuICogdGVzdHMpLiBMYXppbHkgYWxsb2NhdGUgdGhlIGFycmF5IHRvIGNvbnNlcnZlIG1lbW9yeS4gIFdlIG11c3QgbG9vcCB0aHJvdWdoXG4gKiBlYWNoIGV2ZW50IGFuZCBwZXJmb3JtIHRoZSB0cmF2ZXJzYWwgZm9yIGVhY2ggb25lLiBXZSBjYW5ub3QgcGVyZm9ybSBhXG4gKiBzaW5nbGUgdHJhdmVyc2FsIGZvciB0aGUgZW50aXJlIGNvbGxlY3Rpb24gb2YgZXZlbnRzIGJlY2F1c2UgZWFjaCBldmVudCBtYXlcbiAqIGhhdmUgYSBkaWZmZXJlbnQgdGFyZ2V0LlxuICovXG5mdW5jdGlvbiBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2luZ2xlKGV2ZW50KSB7XG4gIGlmIChldmVudCAmJiBldmVudC5kaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lcykge1xuICAgIEV2ZW50UGx1Z2luVXRpbHMudHJhdmVyc2VUd29QaGFzZShldmVudC5fdGFyZ2V0SW5zdCwgYWNjdW11bGF0ZURpcmVjdGlvbmFsRGlzcGF0Y2hlcywgZXZlbnQpO1xuICB9XG59XG5cbi8qKlxuICogU2FtZSBhcyBgYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NpbmdsZWAsIGJ1dCBza2lwcyBvdmVyIHRoZSB0YXJnZXRJRC5cbiAqL1xuZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NpbmdsZVNraXBUYXJnZXQoZXZlbnQpIHtcbiAgaWYgKGV2ZW50ICYmIGV2ZW50LmRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKSB7XG4gICAgdmFyIHRhcmdldEluc3QgPSBldmVudC5fdGFyZ2V0SW5zdDtcbiAgICB2YXIgcGFyZW50SW5zdCA9IHRhcmdldEluc3QgPyBFdmVudFBsdWdpblV0aWxzLmdldFBhcmVudEluc3RhbmNlKHRhcmdldEluc3QpIDogbnVsbDtcbiAgICBFdmVudFBsdWdpblV0aWxzLnRyYXZlcnNlVHdvUGhhc2UocGFyZW50SW5zdCwgYWNjdW11bGF0ZURpcmVjdGlvbmFsRGlzcGF0Y2hlcywgZXZlbnQpO1xuICB9XG59XG5cbi8qKlxuICogQWNjdW11bGF0ZXMgd2l0aG91dCByZWdhcmQgdG8gZGlyZWN0aW9uLCBkb2VzIG5vdCBsb29rIGZvciBwaGFzZWRcbiAqIHJlZ2lzdHJhdGlvbiBuYW1lcy4gU2FtZSBhcyBgYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXNTaW5nbGVgIGJ1dCB3aXRob3V0XG4gKiByZXF1aXJpbmcgdGhhdCB0aGUgYGRpc3BhdGNoTWFya2VyYCBiZSB0aGUgc2FtZSBhcyB0aGUgZGlzcGF0Y2hlZCBJRC5cbiAqL1xuZnVuY3Rpb24gYWNjdW11bGF0ZURpc3BhdGNoZXMoaW5zdCwgaWdub3JlZERpcmVjdGlvbiwgZXZlbnQpIHtcbiAgaWYgKGV2ZW50ICYmIGV2ZW50LmRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUpIHtcbiAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IGV2ZW50LmRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWU7XG4gICAgdmFyIGxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSk7XG4gICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMgPSBhY2N1bXVsYXRlSW50byhldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMsIGxpc3RlbmVyKTtcbiAgICAgIGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcyA9IGFjY3VtdWxhdGVJbnRvKGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcywgaW5zdCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQWNjdW11bGF0ZXMgZGlzcGF0Y2hlcyBvbiBhbiBgU3ludGhldGljRXZlbnRgLCBidXQgb25seSBmb3IgdGhlXG4gKiBgZGlzcGF0Y2hNYXJrZXJgLlxuICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXNTaW5nbGUoZXZlbnQpIHtcbiAgaWYgKGV2ZW50ICYmIGV2ZW50LmRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUpIHtcbiAgICBhY2N1bXVsYXRlRGlzcGF0Y2hlcyhldmVudC5fdGFyZ2V0SW5zdCwgbnVsbCwgZXZlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoZXZlbnRzKSB7XG4gIGZvckVhY2hBY2N1bXVsYXRlZChldmVudHMsIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTaW5nbGUpO1xufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2tpcFRhcmdldChldmVudHMpIHtcbiAgZm9yRWFjaEFjY3VtdWxhdGVkKGV2ZW50cywgYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NpbmdsZVNraXBUYXJnZXQpO1xufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlRW50ZXJMZWF2ZURpc3BhdGNoZXMobGVhdmUsIGVudGVyLCBmcm9tLCB0bykge1xuICBFdmVudFBsdWdpblV0aWxzLnRyYXZlcnNlRW50ZXJMZWF2ZShmcm9tLCB0bywgYWNjdW11bGF0ZURpc3BhdGNoZXMsIGxlYXZlLCBlbnRlcik7XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVzKGV2ZW50cykge1xuICBmb3JFYWNoQWNjdW11bGF0ZWQoZXZlbnRzLCBhY2N1bXVsYXRlRGlyZWN0RGlzcGF0Y2hlc1NpbmdsZSk7XG59XG5cbi8qKlxuICogQSBzbWFsbCBzZXQgb2YgcHJvcGFnYXRpb24gcGF0dGVybnMsIGVhY2ggb2Ygd2hpY2ggd2lsbCBhY2NlcHQgYSBzbWFsbCBhbW91bnRcbiAqIG9mIGluZm9ybWF0aW9uLCBhbmQgZ2VuZXJhdGUgYSBzZXQgb2YgXCJkaXNwYXRjaCByZWFkeSBldmVudCBvYmplY3RzXCIgLSB3aGljaFxuICogYXJlIHNldHMgb2YgZXZlbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYW5ub3RhdGVkIHdpdGggYSBzZXQgb2YgZGlzcGF0Y2hlZFxuICogbGlzdGVuZXIgZnVuY3Rpb25zL2lkcy4gVGhlIEFQSSBpcyBkZXNpZ25lZCB0aGlzIHdheSB0byBkaXNjb3VyYWdlIHRoZXNlXG4gKiBwcm9wYWdhdGlvbiBzdHJhdGVnaWVzIGZyb20gYWN0dWFsbHkgZXhlY3V0aW5nIHRoZSBkaXNwYXRjaGVzLCBzaW5jZSB3ZVxuICogYWx3YXlzIHdhbnQgdG8gY29sbGVjdCB0aGUgZW50aXJlIHNldCBvZiBkaXNwYXRjaGVzIGJlZm9yZSBleGVjdXRpbmcgZXZlbnQgYVxuICogc2luZ2xlIG9uZS5cbiAqXG4gKiBAY29uc3RydWN0b3IgRXZlbnRQcm9wYWdhdG9yc1xuICovXG52YXIgRXZlbnRQcm9wYWdhdG9ycyA9IHtcbiAgYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlczogYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyxcbiAgYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NraXBUYXJnZXQ6IGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTa2lwVGFyZ2V0LFxuICBhY2N1bXVsYXRlRGlyZWN0RGlzcGF0Y2hlczogYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXMsXG4gIGFjY3VtdWxhdGVFbnRlckxlYXZlRGlzcGF0Y2hlczogYWNjdW11bGF0ZUVudGVyTGVhdmVEaXNwYXRjaGVzXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50UHJvcGFnYXRvcnM7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvRXZlbnRQcm9wYWdhdG9ycy5qc1xuLy8gbW9kdWxlIGlkID0gMjE0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 215 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nvar EventPluginRegistry = __webpack_require__(216);\nvar EventPluginUtils = __webpack_require__(217);\nvar ReactErrorUtils = __webpack_require__(218);\n\nvar accumulateInto = __webpack_require__(219);\nvar forEachAccumulated = __webpack_require__(220);\nvar invariant = __webpack_require__(180);\n\n/**\n * Internal store for event listeners\n */\nvar listenerBank = {};\n\n/**\n * Internal queue of events that have accumulated their dispatches and are\n * waiting to have their dispatches executed.\n */\nvar eventQueue = null;\n\n/**\n * Dispatches an event and releases it back into the pool, unless persistent.\n *\n * @param {?object} event Synthetic event to be dispatched.\n * @param {boolean} simulated If the event is simulated (changes exn behavior)\n * @private\n */\nvar executeDispatchesAndRelease = function (event, simulated) {\n  if (event) {\n    EventPluginUtils.executeDispatchesInOrder(event, simulated);\n\n    if (!event.isPersistent()) {\n      event.constructor.release(event);\n    }\n  }\n};\nvar executeDispatchesAndReleaseSimulated = function (e) {\n  return executeDispatchesAndRelease(e, true);\n};\nvar executeDispatchesAndReleaseTopLevel = function (e) {\n  return executeDispatchesAndRelease(e, false);\n};\n\nvar getDictionaryKey = function (inst) {\n  // Prevents V8 performance issue:\n  // https://github.com/facebook/react/pull/7232\n  return '.' + inst._rootNodeID;\n};\n\nfunction isInteractive(tag) {\n  return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea';\n}\n\nfunction shouldPreventMouseEvent(name, type, props) {\n  switch (name) {\n    case 'onClick':\n    case 'onClickCapture':\n    case 'onDoubleClick':\n    case 'onDoubleClickCapture':\n    case 'onMouseDown':\n    case 'onMouseDownCapture':\n    case 'onMouseMove':\n    case 'onMouseMoveCapture':\n    case 'onMouseUp':\n    case 'onMouseUpCapture':\n      return !!(props.disabled && isInteractive(type));\n    default:\n      return false;\n  }\n}\n\n/**\n * This is a unified interface for event plugins to be installed and configured.\n *\n * Event plugins can implement the following properties:\n *\n *   `extractEvents` {function(string, DOMEventTarget, string, object): *}\n *     Required. When a top-level event is fired, this method is expected to\n *     extract synthetic events that will in turn be queued and dispatched.\n *\n *   `eventTypes` {object}\n *     Optional, plugins that fire events must publish a mapping of registration\n *     names that are used to register listeners. Values of this mapping must\n *     be objects that contain `registrationName` or `phasedRegistrationNames`.\n *\n *   `executeDispatch` {function(object, function, string)}\n *     Optional, allows plugins to override how an event gets dispatched. By\n *     default, the listener is simply invoked.\n *\n * Each plugin that is injected into `EventsPluginHub` is immediately operable.\n *\n * @public\n */\nvar EventPluginHub = {\n\n  /**\n   * Methods for injecting dependencies.\n   */\n  injection: {\n\n    /**\n     * @param {array} InjectedEventPluginOrder\n     * @public\n     */\n    injectEventPluginOrder: EventPluginRegistry.injectEventPluginOrder,\n\n    /**\n     * @param {object} injectedNamesToPlugins Map from names to plugin modules.\n     */\n    injectEventPluginsByName: EventPluginRegistry.injectEventPluginsByName\n\n  },\n\n  /**\n   * Stores `listener` at `listenerBank[registrationName][key]`. Is idempotent.\n   *\n   * @param {object} inst The instance, which is the source of events.\n   * @param {string} registrationName Name of listener (e.g. `onClick`).\n   * @param {function} listener The callback to store.\n   */\n  putListener: function (inst, registrationName, listener) {\n    !(typeof listener === 'function') ?  true ? invariant(false, 'Expected %s listener to be a function, instead got type %s', registrationName, typeof listener) : _prodInvariant('94', registrationName, typeof listener) : void 0;\n\n    var key = getDictionaryKey(inst);\n    var bankForRegistrationName = listenerBank[registrationName] || (listenerBank[registrationName] = {});\n    bankForRegistrationName[key] = listener;\n\n    var PluginModule = EventPluginRegistry.registrationNameModules[registrationName];\n    if (PluginModule && PluginModule.didPutListener) {\n      PluginModule.didPutListener(inst, registrationName, listener);\n    }\n  },\n\n  /**\n   * @param {object} inst The instance, which is the source of events.\n   * @param {string} registrationName Name of listener (e.g. `onClick`).\n   * @return {?function} The stored callback.\n   */\n  getListener: function (inst, registrationName) {\n    // TODO: shouldPreventMouseEvent is DOM-specific and definitely should not\n    // live here; needs to be moved to a better place soon\n    var bankForRegistrationName = listenerBank[registrationName];\n    if (shouldPreventMouseEvent(registrationName, inst._currentElement.type, inst._currentElement.props)) {\n      return null;\n    }\n    var key = getDictionaryKey(inst);\n    return bankForRegistrationName && bankForRegistrationName[key];\n  },\n\n  /**\n   * Deletes a listener from the registration bank.\n   *\n   * @param {object} inst The instance, which is the source of events.\n   * @param {string} registrationName Name of listener (e.g. `onClick`).\n   */\n  deleteListener: function (inst, registrationName) {\n    var PluginModule = EventPluginRegistry.registrationNameModules[registrationName];\n    if (PluginModule && PluginModule.willDeleteListener) {\n      PluginModule.willDeleteListener(inst, registrationName);\n    }\n\n    var bankForRegistrationName = listenerBank[registrationName];\n    // TODO: This should never be null -- when is it?\n    if (bankForRegistrationName) {\n      var key = getDictionaryKey(inst);\n      delete bankForRegistrationName[key];\n    }\n  },\n\n  /**\n   * Deletes all listeners for the DOM element with the supplied ID.\n   *\n   * @param {object} inst The instance, which is the source of events.\n   */\n  deleteAllListeners: function (inst) {\n    var key = getDictionaryKey(inst);\n    for (var registrationName in listenerBank) {\n      if (!listenerBank.hasOwnProperty(registrationName)) {\n        continue;\n      }\n\n      if (!listenerBank[registrationName][key]) {\n        continue;\n      }\n\n      var PluginModule = EventPluginRegistry.registrationNameModules[registrationName];\n      if (PluginModule && PluginModule.willDeleteListener) {\n        PluginModule.willDeleteListener(inst, registrationName);\n      }\n\n      delete listenerBank[registrationName][key];\n    }\n  },\n\n  /**\n   * Allows registered plugins an opportunity to extract events from top-level\n   * native browser events.\n   *\n   * @return {*} An accumulation of synthetic events.\n   * @internal\n   */\n  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n    var events;\n    var plugins = EventPluginRegistry.plugins;\n    for (var i = 0; i < plugins.length; i++) {\n      // Not every plugin in the ordering may be loaded at runtime.\n      var possiblePlugin = plugins[i];\n      if (possiblePlugin) {\n        var extractedEvents = possiblePlugin.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget);\n        if (extractedEvents) {\n          events = accumulateInto(events, extractedEvents);\n        }\n      }\n    }\n    return events;\n  },\n\n  /**\n   * Enqueues a synthetic event that should be dispatched when\n   * `processEventQueue` is invoked.\n   *\n   * @param {*} events An accumulation of synthetic events.\n   * @internal\n   */\n  enqueueEvents: function (events) {\n    if (events) {\n      eventQueue = accumulateInto(eventQueue, events);\n    }\n  },\n\n  /**\n   * Dispatches all synthetic events on the event queue.\n   *\n   * @internal\n   */\n  processEventQueue: function (simulated) {\n    // Set `eventQueue` to null before processing it so that we can tell if more\n    // events get enqueued while processing.\n    var processingEventQueue = eventQueue;\n    eventQueue = null;\n    if (simulated) {\n      forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseSimulated);\n    } else {\n      forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel);\n    }\n    !!eventQueue ?  true ? invariant(false, 'processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented.') : _prodInvariant('95') : void 0;\n    // This would be a good time to rethrow if any of the event handlers threw.\n    ReactErrorUtils.rethrowCaughtError();\n  },\n\n  /**\n   * These are needed for tests only. Do not use!\n   */\n  __purge: function () {\n    listenerBank = {};\n  },\n\n  __getListenerBank: function () {\n    return listenerBank;\n  }\n\n};\n\nmodule.exports = EventPluginHub;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0V2ZW50UGx1Z2luSHViLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBFdmVudFBsdWdpblJlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpblJlZ2lzdHJ5Jyk7XG52YXIgRXZlbnRQbHVnaW5VdGlscyA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5VdGlscycpO1xudmFyIFJlYWN0RXJyb3JVdGlscyA9IHJlcXVpcmUoJy4vUmVhY3RFcnJvclV0aWxzJyk7XG5cbnZhciBhY2N1bXVsYXRlSW50byA9IHJlcXVpcmUoJy4vYWNjdW11bGF0ZUludG8nKTtcbnZhciBmb3JFYWNoQWNjdW11bGF0ZWQgPSByZXF1aXJlKCcuL2ZvckVhY2hBY2N1bXVsYXRlZCcpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIEludGVybmFsIHN0b3JlIGZvciBldmVudCBsaXN0ZW5lcnNcbiAqL1xudmFyIGxpc3RlbmVyQmFuayA9IHt9O1xuXG4vKipcbiAqIEludGVybmFsIHF1ZXVlIG9mIGV2ZW50cyB0aGF0IGhhdmUgYWNjdW11bGF0ZWQgdGhlaXIgZGlzcGF0Y2hlcyBhbmQgYXJlXG4gKiB3YWl0aW5nIHRvIGhhdmUgdGhlaXIgZGlzcGF0Y2hlcyBleGVjdXRlZC5cbiAqL1xudmFyIGV2ZW50UXVldWUgPSBudWxsO1xuXG4vKipcbiAqIERpc3BhdGNoZXMgYW4gZXZlbnQgYW5kIHJlbGVhc2VzIGl0IGJhY2sgaW50byB0aGUgcG9vbCwgdW5sZXNzIHBlcnNpc3RlbnQuXG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBldmVudCBTeW50aGV0aWMgZXZlbnQgdG8gYmUgZGlzcGF0Y2hlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2ltdWxhdGVkIElmIHRoZSBldmVudCBpcyBzaW11bGF0ZWQgKGNoYW5nZXMgZXhuIGJlaGF2aW9yKVxuICogQHByaXZhdGVcbiAqL1xudmFyIGV4ZWN1dGVEaXNwYXRjaGVzQW5kUmVsZWFzZSA9IGZ1bmN0aW9uIChldmVudCwgc2ltdWxhdGVkKSB7XG4gIGlmIChldmVudCkge1xuICAgIEV2ZW50UGx1Z2luVXRpbHMuZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyKGV2ZW50LCBzaW11bGF0ZWQpO1xuXG4gICAgaWYgKCFldmVudC5pc1BlcnNpc3RlbnQoKSkge1xuICAgICAgZXZlbnQuY29uc3RydWN0b3IucmVsZWFzZShldmVudCk7XG4gICAgfVxuICB9XG59O1xudmFyIGV4ZWN1dGVEaXNwYXRjaGVzQW5kUmVsZWFzZVNpbXVsYXRlZCA9IGZ1bmN0aW9uIChlKSB7XG4gIHJldHVybiBleGVjdXRlRGlzcGF0Y2hlc0FuZFJlbGVhc2UoZSwgdHJ1ZSk7XG59O1xudmFyIGV4ZWN1dGVEaXNwYXRjaGVzQW5kUmVsZWFzZVRvcExldmVsID0gZnVuY3Rpb24gKGUpIHtcbiAgcmV0dXJuIGV4ZWN1dGVEaXNwYXRjaGVzQW5kUmVsZWFzZShlLCBmYWxzZSk7XG59O1xuXG52YXIgZ2V0RGljdGlvbmFyeUtleSA9IGZ1bmN0aW9uIChpbnN0KSB7XG4gIC8vIFByZXZlbnRzIFY4IHBlcmZvcm1hbmNlIGlzc3VlOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC83MjMyXG4gIHJldHVybiAnLicgKyBpbnN0Ll9yb290Tm9kZUlEO1xufTtcblxuZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZSh0YWcpIHtcbiAgcmV0dXJuIHRhZyA9PT0gJ2J1dHRvbicgfHwgdGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3NlbGVjdCcgfHwgdGFnID09PSAndGV4dGFyZWEnO1xufVxuXG5mdW5jdGlvbiBzaG91bGRQcmV2ZW50TW91c2VFdmVudChuYW1lLCB0eXBlLCBwcm9wcykge1xuICBzd2l0Y2ggKG5hbWUpIHtcbiAgICBjYXNlICdvbkNsaWNrJzpcbiAgICBjYXNlICdvbkNsaWNrQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Eb3VibGVDbGljayc6XG4gICAgY2FzZSAnb25Eb3VibGVDbGlja0NhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VEb3duJzpcbiAgICBjYXNlICdvbk1vdXNlRG93bkNhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VNb3ZlJzpcbiAgICBjYXNlICdvbk1vdXNlTW92ZUNhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VVcCc6XG4gICAgY2FzZSAnb25Nb3VzZVVwQ2FwdHVyZSc6XG4gICAgICByZXR1cm4gISEocHJvcHMuZGlzYWJsZWQgJiYgaXNJbnRlcmFjdGl2ZSh0eXBlKSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgYSB1bmlmaWVkIGludGVyZmFjZSBmb3IgZXZlbnQgcGx1Z2lucyB0byBiZSBpbnN0YWxsZWQgYW5kIGNvbmZpZ3VyZWQuXG4gKlxuICogRXZlbnQgcGx1Z2lucyBjYW4gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIGBleHRyYWN0RXZlbnRzYCB7ZnVuY3Rpb24oc3RyaW5nLCBET01FdmVudFRhcmdldCwgc3RyaW5nLCBvYmplY3QpOiAqfVxuICogICAgIFJlcXVpcmVkLiBXaGVuIGEgdG9wLWxldmVsIGV2ZW50IGlzIGZpcmVkLCB0aGlzIG1ldGhvZCBpcyBleHBlY3RlZCB0b1xuICogICAgIGV4dHJhY3Qgc3ludGhldGljIGV2ZW50cyB0aGF0IHdpbGwgaW4gdHVybiBiZSBxdWV1ZWQgYW5kIGRpc3BhdGNoZWQuXG4gKlxuICogICBgZXZlbnRUeXBlc2Age29iamVjdH1cbiAqICAgICBPcHRpb25hbCwgcGx1Z2lucyB0aGF0IGZpcmUgZXZlbnRzIG11c3QgcHVibGlzaCBhIG1hcHBpbmcgb2YgcmVnaXN0cmF0aW9uXG4gKiAgICAgbmFtZXMgdGhhdCBhcmUgdXNlZCB0byByZWdpc3RlciBsaXN0ZW5lcnMuIFZhbHVlcyBvZiB0aGlzIG1hcHBpbmcgbXVzdFxuICogICAgIGJlIG9iamVjdHMgdGhhdCBjb250YWluIGByZWdpc3RyYXRpb25OYW1lYCBvciBgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXNgLlxuICpcbiAqICAgYGV4ZWN1dGVEaXNwYXRjaGAge2Z1bmN0aW9uKG9iamVjdCwgZnVuY3Rpb24sIHN0cmluZyl9XG4gKiAgICAgT3B0aW9uYWwsIGFsbG93cyBwbHVnaW5zIHRvIG92ZXJyaWRlIGhvdyBhbiBldmVudCBnZXRzIGRpc3BhdGNoZWQuIEJ5XG4gKiAgICAgZGVmYXVsdCwgdGhlIGxpc3RlbmVyIGlzIHNpbXBseSBpbnZva2VkLlxuICpcbiAqIEVhY2ggcGx1Z2luIHRoYXQgaXMgaW5qZWN0ZWQgaW50byBgRXZlbnRzUGx1Z2luSHViYCBpcyBpbW1lZGlhdGVseSBvcGVyYWJsZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbnZhciBFdmVudFBsdWdpbkh1YiA9IHtcblxuICAvKipcbiAgICogTWV0aG9kcyBmb3IgaW5qZWN0aW5nIGRlcGVuZGVuY2llcy5cbiAgICovXG4gIGluamVjdGlvbjoge1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHthcnJheX0gSW5qZWN0ZWRFdmVudFBsdWdpbk9yZGVyXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIGluamVjdEV2ZW50UGx1Z2luT3JkZXI6IEV2ZW50UGx1Z2luUmVnaXN0cnkuaW5qZWN0RXZlbnRQbHVnaW5PcmRlcixcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBpbmplY3RlZE5hbWVzVG9QbHVnaW5zIE1hcCBmcm9tIG5hbWVzIHRvIHBsdWdpbiBtb2R1bGVzLlxuICAgICAqL1xuICAgIGluamVjdEV2ZW50UGx1Z2luc0J5TmFtZTogRXZlbnRQbHVnaW5SZWdpc3RyeS5pbmplY3RFdmVudFBsdWdpbnNCeU5hbWVcblxuICB9LFxuXG4gIC8qKlxuICAgKiBTdG9yZXMgYGxpc3RlbmVyYCBhdCBgbGlzdGVuZXJCYW5rW3JlZ2lzdHJhdGlvbk5hbWVdW2tleV1gLiBJcyBpZGVtcG90ZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gaW5zdCBUaGUgaW5zdGFuY2UsIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgZXZlbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBOYW1lIG9mIGxpc3RlbmVyIChlLmcuIGBvbkNsaWNrYCkuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyIFRoZSBjYWxsYmFjayB0byBzdG9yZS5cbiAgICovXG4gIHB1dExpc3RlbmVyOiBmdW5jdGlvbiAoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSwgbGlzdGVuZXIpIHtcbiAgICAhKHR5cGVvZiBsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgJXMgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgdHlwZSAlcycsIHJlZ2lzdHJhdGlvbk5hbWUsIHR5cGVvZiBsaXN0ZW5lcikgOiBfcHJvZEludmFyaWFudCgnOTQnLCByZWdpc3RyYXRpb25OYW1lLCB0eXBlb2YgbGlzdGVuZXIpIDogdm9pZCAwO1xuXG4gICAgdmFyIGtleSA9IGdldERpY3Rpb25hcnlLZXkoaW5zdCk7XG4gICAgdmFyIGJhbmtGb3JSZWdpc3RyYXRpb25OYW1lID0gbGlzdGVuZXJCYW5rW3JlZ2lzdHJhdGlvbk5hbWVdIHx8IChsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFtZV0gPSB7fSk7XG4gICAgYmFua0ZvclJlZ2lzdHJhdGlvbk5hbWVba2V5XSA9IGxpc3RlbmVyO1xuXG4gICAgdmFyIFBsdWdpbk1vZHVsZSA9IEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV07XG4gICAgaWYgKFBsdWdpbk1vZHVsZSAmJiBQbHVnaW5Nb2R1bGUuZGlkUHV0TGlzdGVuZXIpIHtcbiAgICAgIFBsdWdpbk1vZHVsZS5kaWRQdXRMaXN0ZW5lcihpbnN0LCByZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gaW5zdCBUaGUgaW5zdGFuY2UsIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgZXZlbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBOYW1lIG9mIGxpc3RlbmVyIChlLmcuIGBvbkNsaWNrYCkuXG4gICAqIEByZXR1cm4gez9mdW5jdGlvbn0gVGhlIHN0b3JlZCBjYWxsYmFjay5cbiAgICovXG4gIGdldExpc3RlbmVyOiBmdW5jdGlvbiAoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkge1xuICAgIC8vIFRPRE86IHNob3VsZFByZXZlbnRNb3VzZUV2ZW50IGlzIERPTS1zcGVjaWZpYyBhbmQgZGVmaW5pdGVseSBzaG91bGQgbm90XG4gICAgLy8gbGl2ZSBoZXJlOyBuZWVkcyB0byBiZSBtb3ZlZCB0byBhIGJldHRlciBwbGFjZSBzb29uXG4gICAgdmFyIGJhbmtGb3JSZWdpc3RyYXRpb25OYW1lID0gbGlzdGVuZXJCYW5rW3JlZ2lzdHJhdGlvbk5hbWVdO1xuICAgIGlmIChzaG91bGRQcmV2ZW50TW91c2VFdmVudChyZWdpc3RyYXRpb25OYW1lLCBpbnN0Ll9jdXJyZW50RWxlbWVudC50eXBlLCBpbnN0Ll9jdXJyZW50RWxlbWVudC5wcm9wcykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIga2V5ID0gZ2V0RGljdGlvbmFyeUtleShpbnN0KTtcbiAgICByZXR1cm4gYmFua0ZvclJlZ2lzdHJhdGlvbk5hbWUgJiYgYmFua0ZvclJlZ2lzdHJhdGlvbk5hbWVba2V5XTtcbiAgfSxcblxuICAvKipcbiAgICogRGVsZXRlcyBhIGxpc3RlbmVyIGZyb20gdGhlIHJlZ2lzdHJhdGlvbiBiYW5rLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gaW5zdCBUaGUgaW5zdGFuY2UsIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgZXZlbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBOYW1lIG9mIGxpc3RlbmVyIChlLmcuIGBvbkNsaWNrYCkuXG4gICAqL1xuICBkZWxldGVMaXN0ZW5lcjogZnVuY3Rpb24gKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUpIHtcbiAgICB2YXIgUGx1Z2luTW9kdWxlID0gRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tyZWdpc3RyYXRpb25OYW1lXTtcbiAgICBpZiAoUGx1Z2luTW9kdWxlICYmIFBsdWdpbk1vZHVsZS53aWxsRGVsZXRlTGlzdGVuZXIpIHtcbiAgICAgIFBsdWdpbk1vZHVsZS53aWxsRGVsZXRlTGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIGJhbmtGb3JSZWdpc3RyYXRpb25OYW1lID0gbGlzdGVuZXJCYW5rW3JlZ2lzdHJhdGlvbk5hbWVdO1xuICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIG5ldmVyIGJlIG51bGwgLS0gd2hlbiBpcyBpdD9cbiAgICBpZiAoYmFua0ZvclJlZ2lzdHJhdGlvbk5hbWUpIHtcbiAgICAgIHZhciBrZXkgPSBnZXREaWN0aW9uYXJ5S2V5KGluc3QpO1xuICAgICAgZGVsZXRlIGJhbmtGb3JSZWdpc3RyYXRpb25OYW1lW2tleV07XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGFsbCBsaXN0ZW5lcnMgZm9yIHRoZSBET00gZWxlbWVudCB3aXRoIHRoZSBzdXBwbGllZCBJRC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGluc3QgVGhlIGluc3RhbmNlLCB3aGljaCBpcyB0aGUgc291cmNlIG9mIGV2ZW50cy5cbiAgICovXG4gIGRlbGV0ZUFsbExpc3RlbmVyczogZnVuY3Rpb24gKGluc3QpIHtcbiAgICB2YXIga2V5ID0gZ2V0RGljdGlvbmFyeUtleShpbnN0KTtcbiAgICBmb3IgKHZhciByZWdpc3RyYXRpb25OYW1lIGluIGxpc3RlbmVyQmFuaykge1xuICAgICAgaWYgKCFsaXN0ZW5lckJhbmsuaGFzT3duUHJvcGVydHkocmVnaXN0cmF0aW9uTmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghbGlzdGVuZXJCYW5rW3JlZ2lzdHJhdGlvbk5hbWVdW2tleV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBQbHVnaW5Nb2R1bGUgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3JlZ2lzdHJhdGlvbk5hbWVdO1xuICAgICAgaWYgKFBsdWdpbk1vZHVsZSAmJiBQbHVnaW5Nb2R1bGUud2lsbERlbGV0ZUxpc3RlbmVyKSB7XG4gICAgICAgIFBsdWdpbk1vZHVsZS53aWxsRGVsZXRlTGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGRlbGV0ZSBsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFtZV1ba2V5XTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEFsbG93cyByZWdpc3RlcmVkIHBsdWdpbnMgYW4gb3Bwb3J0dW5pdHkgdG8gZXh0cmFjdCBldmVudHMgZnJvbSB0b3AtbGV2ZWxcbiAgICogbmF0aXZlIGJyb3dzZXIgZXZlbnRzLlxuICAgKlxuICAgKiBAcmV0dXJuIHsqfSBBbiBhY2N1bXVsYXRpb24gb2Ygc3ludGhldGljIGV2ZW50cy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBleHRyYWN0RXZlbnRzOiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICB2YXIgZXZlbnRzO1xuICAgIHZhciBwbHVnaW5zID0gRXZlbnRQbHVnaW5SZWdpc3RyeS5wbHVnaW5zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gTm90IGV2ZXJ5IHBsdWdpbiBpbiB0aGUgb3JkZXJpbmcgbWF5IGJlIGxvYWRlZCBhdCBydW50aW1lLlxuICAgICAgdmFyIHBvc3NpYmxlUGx1Z2luID0gcGx1Z2luc1tpXTtcbiAgICAgIGlmIChwb3NzaWJsZVBsdWdpbikge1xuICAgICAgICB2YXIgZXh0cmFjdGVkRXZlbnRzID0gcG9zc2libGVQbHVnaW4uZXh0cmFjdEV2ZW50cyh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICAgIGlmIChleHRyYWN0ZWRFdmVudHMpIHtcbiAgICAgICAgICBldmVudHMgPSBhY2N1bXVsYXRlSW50byhldmVudHMsIGV4dHJhY3RlZEV2ZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGV2ZW50cztcbiAgfSxcblxuICAvKipcbiAgICogRW5xdWV1ZXMgYSBzeW50aGV0aWMgZXZlbnQgdGhhdCBzaG91bGQgYmUgZGlzcGF0Y2hlZCB3aGVuXG4gICAqIGBwcm9jZXNzRXZlbnRRdWV1ZWAgaXMgaW52b2tlZC5cbiAgICpcbiAgICogQHBhcmFtIHsqfSBldmVudHMgQW4gYWNjdW11bGF0aW9uIG9mIHN5bnRoZXRpYyBldmVudHMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZUV2ZW50czogZnVuY3Rpb24gKGV2ZW50cykge1xuICAgIGlmIChldmVudHMpIHtcbiAgICAgIGV2ZW50UXVldWUgPSBhY2N1bXVsYXRlSW50byhldmVudFF1ZXVlLCBldmVudHMpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogRGlzcGF0Y2hlcyBhbGwgc3ludGhldGljIGV2ZW50cyBvbiB0aGUgZXZlbnQgcXVldWUuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvY2Vzc0V2ZW50UXVldWU6IGZ1bmN0aW9uIChzaW11bGF0ZWQpIHtcbiAgICAvLyBTZXQgYGV2ZW50UXVldWVgIHRvIG51bGwgYmVmb3JlIHByb2Nlc3NpbmcgaXQgc28gdGhhdCB3ZSBjYW4gdGVsbCBpZiBtb3JlXG4gICAgLy8gZXZlbnRzIGdldCBlbnF1ZXVlZCB3aGlsZSBwcm9jZXNzaW5nLlxuICAgIHZhciBwcm9jZXNzaW5nRXZlbnRRdWV1ZSA9IGV2ZW50UXVldWU7XG4gICAgZXZlbnRRdWV1ZSA9IG51bGw7XG4gICAgaWYgKHNpbXVsYXRlZCkge1xuICAgICAgZm9yRWFjaEFjY3VtdWxhdGVkKHByb2Nlc3NpbmdFdmVudFF1ZXVlLCBleGVjdXRlRGlzcGF0Y2hlc0FuZFJlbGVhc2VTaW11bGF0ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JFYWNoQWNjdW11bGF0ZWQocHJvY2Vzc2luZ0V2ZW50UXVldWUsIGV4ZWN1dGVEaXNwYXRjaGVzQW5kUmVsZWFzZVRvcExldmVsKTtcbiAgICB9XG4gICAgISFldmVudFF1ZXVlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3Byb2Nlc3NFdmVudFF1ZXVlKCk6IEFkZGl0aW9uYWwgZXZlbnRzIHdlcmUgZW5xdWV1ZWQgd2hpbGUgcHJvY2Vzc2luZyBhbiBldmVudCBxdWV1ZS4gU3VwcG9ydCBmb3IgdGhpcyBoYXMgbm90IHlldCBiZWVuIGltcGxlbWVudGVkLicpIDogX3Byb2RJbnZhcmlhbnQoJzk1JykgOiB2b2lkIDA7XG4gICAgLy8gVGhpcyB3b3VsZCBiZSBhIGdvb2QgdGltZSB0byByZXRocm93IGlmIGFueSBvZiB0aGUgZXZlbnQgaGFuZGxlcnMgdGhyZXcuXG4gICAgUmVhY3RFcnJvclV0aWxzLnJldGhyb3dDYXVnaHRFcnJvcigpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBUaGVzZSBhcmUgbmVlZGVkIGZvciB0ZXN0cyBvbmx5LiBEbyBub3QgdXNlIVxuICAgKi9cbiAgX19wdXJnZTogZnVuY3Rpb24gKCkge1xuICAgIGxpc3RlbmVyQmFuayA9IHt9O1xuICB9LFxuXG4gIF9fZ2V0TGlzdGVuZXJCYW5rOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyQmFuaztcbiAgfVxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50UGx1Z2luSHViO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL0V2ZW50UGx1Z2luSHViLmpzXG4vLyBtb2R1bGUgaWQgPSAyMTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 216 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nvar invariant = __webpack_require__(180);\n\n/**\n * Injectable ordering of event plugins.\n */\nvar eventPluginOrder = null;\n\n/**\n * Injectable mapping from names to event plugin modules.\n */\nvar namesToPlugins = {};\n\n/**\n * Recomputes the plugin list using the injected plugins and plugin ordering.\n *\n * @private\n */\nfunction recomputePluginOrdering() {\n  if (!eventPluginOrder) {\n    // Wait until an `eventPluginOrder` is injected.\n    return;\n  }\n  for (var pluginName in namesToPlugins) {\n    var pluginModule = namesToPlugins[pluginName];\n    var pluginIndex = eventPluginOrder.indexOf(pluginName);\n    !(pluginIndex > -1) ?  true ? invariant(false, 'EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `%s`.', pluginName) : _prodInvariant('96', pluginName) : void 0;\n    if (EventPluginRegistry.plugins[pluginIndex]) {\n      continue;\n    }\n    !pluginModule.extractEvents ?  true ? invariant(false, 'EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `%s` does not.', pluginName) : _prodInvariant('97', pluginName) : void 0;\n    EventPluginRegistry.plugins[pluginIndex] = pluginModule;\n    var publishedEvents = pluginModule.eventTypes;\n    for (var eventName in publishedEvents) {\n      !publishEventForPlugin(publishedEvents[eventName], pluginModule, eventName) ?  true ? invariant(false, 'EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.', eventName, pluginName) : _prodInvariant('98', eventName, pluginName) : void 0;\n    }\n  }\n}\n\n/**\n * Publishes an event so that it can be dispatched by the supplied plugin.\n *\n * @param {object} dispatchConfig Dispatch configuration for the event.\n * @param {object} PluginModule Plugin publishing the event.\n * @return {boolean} True if the event was successfully published.\n * @private\n */\nfunction publishEventForPlugin(dispatchConfig, pluginModule, eventName) {\n  !!EventPluginRegistry.eventNameDispatchConfigs.hasOwnProperty(eventName) ?  true ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same event name, `%s`.', eventName) : _prodInvariant('99', eventName) : void 0;\n  EventPluginRegistry.eventNameDispatchConfigs[eventName] = dispatchConfig;\n\n  var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;\n  if (phasedRegistrationNames) {\n    for (var phaseName in phasedRegistrationNames) {\n      if (phasedRegistrationNames.hasOwnProperty(phaseName)) {\n        var phasedRegistrationName = phasedRegistrationNames[phaseName];\n        publishRegistrationName(phasedRegistrationName, pluginModule, eventName);\n      }\n    }\n    return true;\n  } else if (dispatchConfig.registrationName) {\n    publishRegistrationName(dispatchConfig.registrationName, pluginModule, eventName);\n    return true;\n  }\n  return false;\n}\n\n/**\n * Publishes a registration name that is used to identify dispatched events and\n * can be used with `EventPluginHub.putListener` to register listeners.\n *\n * @param {string} registrationName Registration name to add.\n * @param {object} PluginModule Plugin publishing the event.\n * @private\n */\nfunction publishRegistrationName(registrationName, pluginModule, eventName) {\n  !!EventPluginRegistry.registrationNameModules[registrationName] ?  true ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same registration name, `%s`.', registrationName) : _prodInvariant('100', registrationName) : void 0;\n  EventPluginRegistry.registrationNameModules[registrationName] = pluginModule;\n  EventPluginRegistry.registrationNameDependencies[registrationName] = pluginModule.eventTypes[eventName].dependencies;\n\n  if (true) {\n    var lowerCasedName = registrationName.toLowerCase();\n    EventPluginRegistry.possibleRegistrationNames[lowerCasedName] = registrationName;\n\n    if (registrationName === 'onDoubleClick') {\n      EventPluginRegistry.possibleRegistrationNames.ondblclick = registrationName;\n    }\n  }\n}\n\n/**\n * Registers plugins so that they can extract and dispatch events.\n *\n * @see {EventPluginHub}\n */\nvar EventPluginRegistry = {\n\n  /**\n   * Ordered list of injected plugins.\n   */\n  plugins: [],\n\n  /**\n   * Mapping from event name to dispatch config\n   */\n  eventNameDispatchConfigs: {},\n\n  /**\n   * Mapping from registration name to plugin module\n   */\n  registrationNameModules: {},\n\n  /**\n   * Mapping from registration name to event name\n   */\n  registrationNameDependencies: {},\n\n  /**\n   * Mapping from lowercase registration names to the properly cased version,\n   * used to warn in the case of missing event handlers. Available\n   * only in __DEV__.\n   * @type {Object}\n   */\n  possibleRegistrationNames:  true ? {} : null,\n  // Trust the developer to only use possibleRegistrationNames in __DEV__\n\n  /**\n   * Injects an ordering of plugins (by plugin name). This allows the ordering\n   * to be decoupled from injection of the actual plugins so that ordering is\n   * always deterministic regardless of packaging, on-the-fly injection, etc.\n   *\n   * @param {array} InjectedEventPluginOrder\n   * @internal\n   * @see {EventPluginHub.injection.injectEventPluginOrder}\n   */\n  injectEventPluginOrder: function (injectedEventPluginOrder) {\n    !!eventPluginOrder ?  true ? invariant(false, 'EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React.') : _prodInvariant('101') : void 0;\n    // Clone the ordering so it cannot be dynamically mutated.\n    eventPluginOrder = Array.prototype.slice.call(injectedEventPluginOrder);\n    recomputePluginOrdering();\n  },\n\n  /**\n   * Injects plugins to be used by `EventPluginHub`. The plugin names must be\n   * in the ordering injected by `injectEventPluginOrder`.\n   *\n   * Plugins can be injected as part of page initialization or on-the-fly.\n   *\n   * @param {object} injectedNamesToPlugins Map from names to plugin modules.\n   * @internal\n   * @see {EventPluginHub.injection.injectEventPluginsByName}\n   */\n  injectEventPluginsByName: function (injectedNamesToPlugins) {\n    var isOrderingDirty = false;\n    for (var pluginName in injectedNamesToPlugins) {\n      if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) {\n        continue;\n      }\n      var pluginModule = injectedNamesToPlugins[pluginName];\n      if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== pluginModule) {\n        !!namesToPlugins[pluginName] ?  true ? invariant(false, 'EventPluginRegistry: Cannot inject two different event plugins using the same name, `%s`.', pluginName) : _prodInvariant('102', pluginName) : void 0;\n        namesToPlugins[pluginName] = pluginModule;\n        isOrderingDirty = true;\n      }\n    }\n    if (isOrderingDirty) {\n      recomputePluginOrdering();\n    }\n  },\n\n  /**\n   * Looks up the plugin for the supplied event.\n   *\n   * @param {object} event A synthetic event.\n   * @return {?object} The plugin that created the supplied event.\n   * @internal\n   */\n  getPluginModuleForEvent: function (event) {\n    var dispatchConfig = event.dispatchConfig;\n    if (dispatchConfig.registrationName) {\n      return EventPluginRegistry.registrationNameModules[dispatchConfig.registrationName] || null;\n    }\n    if (dispatchConfig.phasedRegistrationNames !== undefined) {\n      // pulling phasedRegistrationNames out of dispatchConfig helps Flow see\n      // that it is not undefined.\n      var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;\n\n      for (var phase in phasedRegistrationNames) {\n        if (!phasedRegistrationNames.hasOwnProperty(phase)) {\n          continue;\n        }\n        var pluginModule = EventPluginRegistry.registrationNameModules[phasedRegistrationNames[phase]];\n        if (pluginModule) {\n          return pluginModule;\n        }\n      }\n    }\n    return null;\n  },\n\n  /**\n   * Exposed for unit testing.\n   * @private\n   */\n  _resetEventPlugins: function () {\n    eventPluginOrder = null;\n    for (var pluginName in namesToPlugins) {\n      if (namesToPlugins.hasOwnProperty(pluginName)) {\n        delete namesToPlugins[pluginName];\n      }\n    }\n    EventPluginRegistry.plugins.length = 0;\n\n    var eventNameDispatchConfigs = EventPluginRegistry.eventNameDispatchConfigs;\n    for (var eventName in eventNameDispatchConfigs) {\n      if (eventNameDispatchConfigs.hasOwnProperty(eventName)) {\n        delete eventNameDispatchConfigs[eventName];\n      }\n    }\n\n    var registrationNameModules = EventPluginRegistry.registrationNameModules;\n    for (var registrationName in registrationNameModules) {\n      if (registrationNameModules.hasOwnProperty(registrationName)) {\n        delete registrationNameModules[registrationName];\n      }\n    }\n\n    if (true) {\n      var possibleRegistrationNames = EventPluginRegistry.possibleRegistrationNames;\n      for (var lowerCasedName in possibleRegistrationNames) {\n        if (possibleRegistrationNames.hasOwnProperty(lowerCasedName)) {\n          delete possibleRegistrationNames[lowerCasedName];\n        }\n      }\n    }\n  }\n\n};\n\nmodule.exports = EventPluginRegistry;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0V2ZW50UGx1Z2luUmVnaXN0cnkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogSW5qZWN0YWJsZSBvcmRlcmluZyBvZiBldmVudCBwbHVnaW5zLlxuICovXG52YXIgZXZlbnRQbHVnaW5PcmRlciA9IG51bGw7XG5cbi8qKlxuICogSW5qZWN0YWJsZSBtYXBwaW5nIGZyb20gbmFtZXMgdG8gZXZlbnQgcGx1Z2luIG1vZHVsZXMuXG4gKi9cbnZhciBuYW1lc1RvUGx1Z2lucyA9IHt9O1xuXG4vKipcbiAqIFJlY29tcHV0ZXMgdGhlIHBsdWdpbiBsaXN0IHVzaW5nIHRoZSBpbmplY3RlZCBwbHVnaW5zIGFuZCBwbHVnaW4gb3JkZXJpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVjb21wdXRlUGx1Z2luT3JkZXJpbmcoKSB7XG4gIGlmICghZXZlbnRQbHVnaW5PcmRlcikge1xuICAgIC8vIFdhaXQgdW50aWwgYW4gYGV2ZW50UGx1Z2luT3JkZXJgIGlzIGluamVjdGVkLlxuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKHZhciBwbHVnaW5OYW1lIGluIG5hbWVzVG9QbHVnaW5zKSB7XG4gICAgdmFyIHBsdWdpbk1vZHVsZSA9IG5hbWVzVG9QbHVnaW5zW3BsdWdpbk5hbWVdO1xuICAgIHZhciBwbHVnaW5JbmRleCA9IGV2ZW50UGx1Z2luT3JkZXIuaW5kZXhPZihwbHVnaW5OYW1lKTtcbiAgICAhKHBsdWdpbkluZGV4ID4gLTEpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luUmVnaXN0cnk6IENhbm5vdCBpbmplY3QgZXZlbnQgcGx1Z2lucyB0aGF0IGRvIG5vdCBleGlzdCBpbiB0aGUgcGx1Z2luIG9yZGVyaW5nLCBgJXNgLicsIHBsdWdpbk5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzk2JywgcGx1Z2luTmFtZSkgOiB2b2lkIDA7XG4gICAgaWYgKEV2ZW50UGx1Z2luUmVnaXN0cnkucGx1Z2luc1twbHVnaW5JbmRleF0pIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAhcGx1Z2luTW9kdWxlLmV4dHJhY3RFdmVudHMgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXZlbnRQbHVnaW5SZWdpc3RyeTogRXZlbnQgcGx1Z2lucyBtdXN0IGltcGxlbWVudCBhbiBgZXh0cmFjdEV2ZW50c2AgbWV0aG9kLCBidXQgYCVzYCBkb2VzIG5vdC4nLCBwbHVnaW5OYW1lKSA6IF9wcm9kSW52YXJpYW50KCc5NycsIHBsdWdpbk5hbWUpIDogdm9pZCAwO1xuICAgIEV2ZW50UGx1Z2luUmVnaXN0cnkucGx1Z2luc1twbHVnaW5JbmRleF0gPSBwbHVnaW5Nb2R1bGU7XG4gICAgdmFyIHB1Ymxpc2hlZEV2ZW50cyA9IHBsdWdpbk1vZHVsZS5ldmVudFR5cGVzO1xuICAgIGZvciAodmFyIGV2ZW50TmFtZSBpbiBwdWJsaXNoZWRFdmVudHMpIHtcbiAgICAgICFwdWJsaXNoRXZlbnRGb3JQbHVnaW4ocHVibGlzaGVkRXZlbnRzW2V2ZW50TmFtZV0sIHBsdWdpbk1vZHVsZSwgZXZlbnROYW1lKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFdmVudFBsdWdpblJlZ2lzdHJ5OiBGYWlsZWQgdG8gcHVibGlzaCBldmVudCBgJXNgIGZvciBwbHVnaW4gYCVzYC4nLCBldmVudE5hbWUsIHBsdWdpbk5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzk4JywgZXZlbnROYW1lLCBwbHVnaW5OYW1lKSA6IHZvaWQgMDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQdWJsaXNoZXMgYW4gZXZlbnQgc28gdGhhdCBpdCBjYW4gYmUgZGlzcGF0Y2hlZCBieSB0aGUgc3VwcGxpZWQgcGx1Z2luLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBEaXNwYXRjaCBjb25maWd1cmF0aW9uIGZvciB0aGUgZXZlbnQuXG4gKiBAcGFyYW0ge29iamVjdH0gUGx1Z2luTW9kdWxlIFBsdWdpbiBwdWJsaXNoaW5nIHRoZSBldmVudC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGV2ZW50IHdhcyBzdWNjZXNzZnVsbHkgcHVibGlzaGVkLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcHVibGlzaEV2ZW50Rm9yUGx1Z2luKGRpc3BhdGNoQ29uZmlnLCBwbHVnaW5Nb2R1bGUsIGV2ZW50TmFtZSkge1xuICAhIUV2ZW50UGx1Z2luUmVnaXN0cnkuZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXZlbnRQbHVnaW5IdWI6IE1vcmUgdGhhbiBvbmUgcGx1Z2luIGF0dGVtcHRlZCB0byBwdWJsaXNoIHRoZSBzYW1lIGV2ZW50IG5hbWUsIGAlc2AuJywgZXZlbnROYW1lKSA6IF9wcm9kSW52YXJpYW50KCc5OScsIGV2ZW50TmFtZSkgOiB2b2lkIDA7XG4gIEV2ZW50UGx1Z2luUmVnaXN0cnkuZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzW2V2ZW50TmFtZV0gPSBkaXNwYXRjaENvbmZpZztcblxuICB2YXIgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMgPSBkaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lcztcbiAgaWYgKHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKSB7XG4gICAgZm9yICh2YXIgcGhhc2VOYW1lIGluIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKSB7XG4gICAgICBpZiAocGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkocGhhc2VOYW1lKSkge1xuICAgICAgICB2YXIgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZSA9IHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzW3BoYXNlTmFtZV07XG4gICAgICAgIHB1Ymxpc2hSZWdpc3RyYXRpb25OYW1lKHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWUsIHBsdWdpbk1vZHVsZSwgZXZlbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9uTmFtZSkge1xuICAgIHB1Ymxpc2hSZWdpc3RyYXRpb25OYW1lKGRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUsIHBsdWdpbk1vZHVsZSwgZXZlbnROYW1lKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUHVibGlzaGVzIGEgcmVnaXN0cmF0aW9uIG5hbWUgdGhhdCBpcyB1c2VkIHRvIGlkZW50aWZ5IGRpc3BhdGNoZWQgZXZlbnRzIGFuZFxuICogY2FuIGJlIHVzZWQgd2l0aCBgRXZlbnRQbHVnaW5IdWIucHV0TGlzdGVuZXJgIHRvIHJlZ2lzdGVyIGxpc3RlbmVycy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBSZWdpc3RyYXRpb24gbmFtZSB0byBhZGQuXG4gKiBAcGFyYW0ge29iamVjdH0gUGx1Z2luTW9kdWxlIFBsdWdpbiBwdWJsaXNoaW5nIHRoZSBldmVudC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHB1Ymxpc2hSZWdpc3RyYXRpb25OYW1lKHJlZ2lzdHJhdGlvbk5hbWUsIHBsdWdpbk1vZHVsZSwgZXZlbnROYW1lKSB7XG4gICEhRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tyZWdpc3RyYXRpb25OYW1lXSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFdmVudFBsdWdpbkh1YjogTW9yZSB0aGFuIG9uZSBwbHVnaW4gYXR0ZW1wdGVkIHRvIHB1Ymxpc2ggdGhlIHNhbWUgcmVnaXN0cmF0aW9uIG5hbWUsIGAlc2AuJywgcmVnaXN0cmF0aW9uTmFtZSkgOiBfcHJvZEludmFyaWFudCgnMTAwJywgcmVnaXN0cmF0aW9uTmFtZSkgOiB2b2lkIDA7XG4gIEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV0gPSBwbHVnaW5Nb2R1bGU7XG4gIEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tyZWdpc3RyYXRpb25OYW1lXSA9IHBsdWdpbk1vZHVsZS5ldmVudFR5cGVzW2V2ZW50TmFtZV0uZGVwZW5kZW5jaWVzO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gcmVnaXN0cmF0aW9uTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIEV2ZW50UGx1Z2luUmVnaXN0cnkucG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gPSByZWdpc3RyYXRpb25OYW1lO1xuXG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgPT09ICdvbkRvdWJsZUNsaWNrJykge1xuICAgICAgRXZlbnRQbHVnaW5SZWdpc3RyeS5wb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzLm9uZGJsY2xpY2sgPSByZWdpc3RyYXRpb25OYW1lO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBwbHVnaW5zIHNvIHRoYXQgdGhleSBjYW4gZXh0cmFjdCBhbmQgZGlzcGF0Y2ggZXZlbnRzLlxuICpcbiAqIEBzZWUge0V2ZW50UGx1Z2luSHVifVxuICovXG52YXIgRXZlbnRQbHVnaW5SZWdpc3RyeSA9IHtcblxuICAvKipcbiAgICogT3JkZXJlZCBsaXN0IG9mIGluamVjdGVkIHBsdWdpbnMuXG4gICAqL1xuICBwbHVnaW5zOiBbXSxcblxuICAvKipcbiAgICogTWFwcGluZyBmcm9tIGV2ZW50IG5hbWUgdG8gZGlzcGF0Y2ggY29uZmlnXG4gICAqL1xuICBldmVudE5hbWVEaXNwYXRjaENvbmZpZ3M6IHt9LFxuXG4gIC8qKlxuICAgKiBNYXBwaW5nIGZyb20gcmVnaXN0cmF0aW9uIG5hbWUgdG8gcGx1Z2luIG1vZHVsZVxuICAgKi9cbiAgcmVnaXN0cmF0aW9uTmFtZU1vZHVsZXM6IHt9LFxuXG4gIC8qKlxuICAgKiBNYXBwaW5nIGZyb20gcmVnaXN0cmF0aW9uIG5hbWUgdG8gZXZlbnQgbmFtZVxuICAgKi9cbiAgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llczoge30sXG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgZnJvbSBsb3dlcmNhc2UgcmVnaXN0cmF0aW9uIG5hbWVzIHRvIHRoZSBwcm9wZXJseSBjYXNlZCB2ZXJzaW9uLFxuICAgKiB1c2VkIHRvIHdhcm4gaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBldmVudCBoYW5kbGVycy4gQXZhaWxhYmxlXG4gICAqIG9ubHkgaW4gX19ERVZfXy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM6IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB7fSA6IG51bGwsXG4gIC8vIFRydXN0IHRoZSBkZXZlbG9wZXIgdG8gb25seSB1c2UgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyBpbiBfX0RFVl9fXG5cbiAgLyoqXG4gICAqIEluamVjdHMgYW4gb3JkZXJpbmcgb2YgcGx1Z2lucyAoYnkgcGx1Z2luIG5hbWUpLiBUaGlzIGFsbG93cyB0aGUgb3JkZXJpbmdcbiAgICogdG8gYmUgZGVjb3VwbGVkIGZyb20gaW5qZWN0aW9uIG9mIHRoZSBhY3R1YWwgcGx1Z2lucyBzbyB0aGF0IG9yZGVyaW5nIGlzXG4gICAqIGFsd2F5cyBkZXRlcm1pbmlzdGljIHJlZ2FyZGxlc3Mgb2YgcGFja2FnaW5nLCBvbi10aGUtZmx5IGluamVjdGlvbiwgZXRjLlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5fSBJbmplY3RlZEV2ZW50UGx1Z2luT3JkZXJcbiAgICogQGludGVybmFsXG4gICAqIEBzZWUge0V2ZW50UGx1Z2luSHViLmluamVjdGlvbi5pbmplY3RFdmVudFBsdWdpbk9yZGVyfVxuICAgKi9cbiAgaW5qZWN0RXZlbnRQbHVnaW5PcmRlcjogZnVuY3Rpb24gKGluamVjdGVkRXZlbnRQbHVnaW5PcmRlcikge1xuICAgICEhZXZlbnRQbHVnaW5PcmRlciA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFdmVudFBsdWdpblJlZ2lzdHJ5OiBDYW5ub3QgaW5qZWN0IGV2ZW50IHBsdWdpbiBvcmRlcmluZyBtb3JlIHRoYW4gb25jZS4gWW91IGFyZSBsaWtlbHkgdHJ5aW5nIHRvIGxvYWQgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0LicpIDogX3Byb2RJbnZhcmlhbnQoJzEwMScpIDogdm9pZCAwO1xuICAgIC8vIENsb25lIHRoZSBvcmRlcmluZyBzbyBpdCBjYW5ub3QgYmUgZHluYW1pY2FsbHkgbXV0YXRlZC5cbiAgICBldmVudFBsdWdpbk9yZGVyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoaW5qZWN0ZWRFdmVudFBsdWdpbk9yZGVyKTtcbiAgICByZWNvbXB1dGVQbHVnaW5PcmRlcmluZygpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBJbmplY3RzIHBsdWdpbnMgdG8gYmUgdXNlZCBieSBgRXZlbnRQbHVnaW5IdWJgLiBUaGUgcGx1Z2luIG5hbWVzIG11c3QgYmVcbiAgICogaW4gdGhlIG9yZGVyaW5nIGluamVjdGVkIGJ5IGBpbmplY3RFdmVudFBsdWdpbk9yZGVyYC5cbiAgICpcbiAgICogUGx1Z2lucyBjYW4gYmUgaW5qZWN0ZWQgYXMgcGFydCBvZiBwYWdlIGluaXRpYWxpemF0aW9uIG9yIG9uLXRoZS1mbHkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpbmplY3RlZE5hbWVzVG9QbHVnaW5zIE1hcCBmcm9tIG5hbWVzIHRvIHBsdWdpbiBtb2R1bGVzLlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHNlZSB7RXZlbnRQbHVnaW5IdWIuaW5qZWN0aW9uLmluamVjdEV2ZW50UGx1Z2luc0J5TmFtZX1cbiAgICovXG4gIGluamVjdEV2ZW50UGx1Z2luc0J5TmFtZTogZnVuY3Rpb24gKGluamVjdGVkTmFtZXNUb1BsdWdpbnMpIHtcbiAgICB2YXIgaXNPcmRlcmluZ0RpcnR5ID0gZmFsc2U7XG4gICAgZm9yICh2YXIgcGx1Z2luTmFtZSBpbiBpbmplY3RlZE5hbWVzVG9QbHVnaW5zKSB7XG4gICAgICBpZiAoIWluamVjdGVkTmFtZXNUb1BsdWdpbnMuaGFzT3duUHJvcGVydHkocGx1Z2luTmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgcGx1Z2luTW9kdWxlID0gaW5qZWN0ZWROYW1lc1RvUGx1Z2luc1twbHVnaW5OYW1lXTtcbiAgICAgIGlmICghbmFtZXNUb1BsdWdpbnMuaGFzT3duUHJvcGVydHkocGx1Z2luTmFtZSkgfHwgbmFtZXNUb1BsdWdpbnNbcGx1Z2luTmFtZV0gIT09IHBsdWdpbk1vZHVsZSkge1xuICAgICAgICAhIW5hbWVzVG9QbHVnaW5zW3BsdWdpbk5hbWVdID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luUmVnaXN0cnk6IENhbm5vdCBpbmplY3QgdHdvIGRpZmZlcmVudCBldmVudCBwbHVnaW5zIHVzaW5nIHRoZSBzYW1lIG5hbWUsIGAlc2AuJywgcGx1Z2luTmFtZSkgOiBfcHJvZEludmFyaWFudCgnMTAyJywgcGx1Z2luTmFtZSkgOiB2b2lkIDA7XG4gICAgICAgIG5hbWVzVG9QbHVnaW5zW3BsdWdpbk5hbWVdID0gcGx1Z2luTW9kdWxlO1xuICAgICAgICBpc09yZGVyaW5nRGlydHkgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNPcmRlcmluZ0RpcnR5KSB7XG4gICAgICByZWNvbXB1dGVQbHVnaW5PcmRlcmluZygpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogTG9va3MgdXAgdGhlIHBsdWdpbiBmb3IgdGhlIHN1cHBsaWVkIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgQSBzeW50aGV0aWMgZXZlbnQuXG4gICAqIEByZXR1cm4gez9vYmplY3R9IFRoZSBwbHVnaW4gdGhhdCBjcmVhdGVkIHRoZSBzdXBwbGllZCBldmVudC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXRQbHVnaW5Nb2R1bGVGb3JFdmVudDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIGRpc3BhdGNoQ29uZmlnID0gZXZlbnQuZGlzcGF0Y2hDb25maWc7XG4gICAgaWYgKGRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUpIHtcbiAgICAgIHJldHVybiBFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW2Rpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWVdIHx8IG51bGw7XG4gICAgfVxuICAgIGlmIChkaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBwdWxsaW5nIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzIG91dCBvZiBkaXNwYXRjaENvbmZpZyBoZWxwcyBGbG93IHNlZVxuICAgICAgLy8gdGhhdCBpdCBpcyBub3QgdW5kZWZpbmVkLlxuICAgICAgdmFyIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzID0gZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM7XG5cbiAgICAgIGZvciAodmFyIHBoYXNlIGluIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKSB7XG4gICAgICAgIGlmICghcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkocGhhc2UpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBsdWdpbk1vZHVsZSA9IEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXNbcGhhc2VdXTtcbiAgICAgICAgaWYgKHBsdWdpbk1vZHVsZSkge1xuICAgICAgICAgIHJldHVybiBwbHVnaW5Nb2R1bGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEV4cG9zZWQgZm9yIHVuaXQgdGVzdGluZy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9yZXNldEV2ZW50UGx1Z2luczogZnVuY3Rpb24gKCkge1xuICAgIGV2ZW50UGx1Z2luT3JkZXIgPSBudWxsO1xuICAgIGZvciAodmFyIHBsdWdpbk5hbWUgaW4gbmFtZXNUb1BsdWdpbnMpIHtcbiAgICAgIGlmIChuYW1lc1RvUGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShwbHVnaW5OYW1lKSkge1xuICAgICAgICBkZWxldGUgbmFtZXNUb1BsdWdpbnNbcGx1Z2luTmFtZV07XG4gICAgICB9XG4gICAgfVxuICAgIEV2ZW50UGx1Z2luUmVnaXN0cnkucGx1Z2lucy5sZW5ndGggPSAwO1xuXG4gICAgdmFyIGV2ZW50TmFtZURpc3BhdGNoQ29uZmlncyA9IEV2ZW50UGx1Z2luUmVnaXN0cnkuZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzO1xuICAgIGZvciAodmFyIGV2ZW50TmFtZSBpbiBldmVudE5hbWVEaXNwYXRjaENvbmZpZ3MpIHtcbiAgICAgIGlmIChldmVudE5hbWVEaXNwYXRjaENvbmZpZ3MuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkge1xuICAgICAgICBkZWxldGUgZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzW2V2ZW50TmFtZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzID0gRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlcztcbiAgICBmb3IgKHZhciByZWdpc3RyYXRpb25OYW1lIGluIHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzKSB7XG4gICAgICBpZiAocmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMuaGFzT3duUHJvcGVydHkocmVnaXN0cmF0aW9uTmFtZSkpIHtcbiAgICAgICAgZGVsZXRlIHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3JlZ2lzdHJhdGlvbk5hbWVdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyA9IEV2ZW50UGx1Z2luUmVnaXN0cnkucG9zc2libGVSZWdpc3RyYXRpb25OYW1lcztcbiAgICAgIGZvciAodmFyIGxvd2VyQ2FzZWROYW1lIGluIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMpIHtcbiAgICAgICAgaWYgKHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpKSB7XG4gICAgICAgICAgZGVsZXRlIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNbbG93ZXJDYXNlZE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRQbHVnaW5SZWdpc3RyeTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9FdmVudFBsdWdpblJlZ2lzdHJ5LmpzXG4vLyBtb2R1bGUgaWQgPSAyMTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 217 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nvar ReactErrorUtils = __webpack_require__(218);\n\nvar invariant = __webpack_require__(180);\nvar warning = __webpack_require__(183);\n\n/**\n * Injected dependencies:\n */\n\n/**\n * - `ComponentTree`: [required] Module that can convert between React instances\n *   and actual node references.\n */\nvar ComponentTree;\nvar TreeTraversal;\nvar injection = {\n  injectComponentTree: function (Injected) {\n    ComponentTree = Injected;\n    if (true) {\n       true ? warning(Injected && Injected.getNodeFromInstance && Injected.getInstanceFromNode, 'EventPluginUtils.injection.injectComponentTree(...): Injected ' + 'module is missing getNodeFromInstance or getInstanceFromNode.') : void 0;\n    }\n  },\n  injectTreeTraversal: function (Injected) {\n    TreeTraversal = Injected;\n    if (true) {\n       true ? warning(Injected && Injected.isAncestor && Injected.getLowestCommonAncestor, 'EventPluginUtils.injection.injectTreeTraversal(...): Injected ' + 'module is missing isAncestor or getLowestCommonAncestor.') : void 0;\n    }\n  }\n};\n\nfunction isEndish(topLevelType) {\n  return topLevelType === 'topMouseUp' || topLevelType === 'topTouchEnd' || topLevelType === 'topTouchCancel';\n}\n\nfunction isMoveish(topLevelType) {\n  return topLevelType === 'topMouseMove' || topLevelType === 'topTouchMove';\n}\nfunction isStartish(topLevelType) {\n  return topLevelType === 'topMouseDown' || topLevelType === 'topTouchStart';\n}\n\nvar validateEventDispatches;\nif (true) {\n  validateEventDispatches = function (event) {\n    var dispatchListeners = event._dispatchListeners;\n    var dispatchInstances = event._dispatchInstances;\n\n    var listenersIsArr = Array.isArray(dispatchListeners);\n    var listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0;\n\n    var instancesIsArr = Array.isArray(dispatchInstances);\n    var instancesLen = instancesIsArr ? dispatchInstances.length : dispatchInstances ? 1 : 0;\n\n     true ? warning(instancesIsArr === listenersIsArr && instancesLen === listenersLen, 'EventPluginUtils: Invalid `event`.') : void 0;\n  };\n}\n\n/**\n * Dispatch the event to the listener.\n * @param {SyntheticEvent} event SyntheticEvent to handle\n * @param {boolean} simulated If the event is simulated (changes exn behavior)\n * @param {function} listener Application-level callback\n * @param {*} inst Internal component instance\n */\nfunction executeDispatch(event, simulated, listener, inst) {\n  var type = event.type || 'unknown-event';\n  event.currentTarget = EventPluginUtils.getNodeFromInstance(inst);\n  if (simulated) {\n    ReactErrorUtils.invokeGuardedCallbackWithCatch(type, listener, event);\n  } else {\n    ReactErrorUtils.invokeGuardedCallback(type, listener, event);\n  }\n  event.currentTarget = null;\n}\n\n/**\n * Standard/simple iteration through an event's collected dispatches.\n */\nfunction executeDispatchesInOrder(event, simulated) {\n  var dispatchListeners = event._dispatchListeners;\n  var dispatchInstances = event._dispatchInstances;\n  if (true) {\n    validateEventDispatches(event);\n  }\n  if (Array.isArray(dispatchListeners)) {\n    for (var i = 0; i < dispatchListeners.length; i++) {\n      if (event.isPropagationStopped()) {\n        break;\n      }\n      // Listeners and Instances are two parallel arrays that are always in sync.\n      executeDispatch(event, simulated, dispatchListeners[i], dispatchInstances[i]);\n    }\n  } else if (dispatchListeners) {\n    executeDispatch(event, simulated, dispatchListeners, dispatchInstances);\n  }\n  event._dispatchListeners = null;\n  event._dispatchInstances = null;\n}\n\n/**\n * Standard/simple iteration through an event's collected dispatches, but stops\n * at the first dispatch execution returning true, and returns that id.\n *\n * @return {?string} id of the first dispatch execution who's listener returns\n * true, or null if no listener returned true.\n */\nfunction executeDispatchesInOrderStopAtTrueImpl(event) {\n  var dispatchListeners = event._dispatchListeners;\n  var dispatchInstances = event._dispatchInstances;\n  if (true) {\n    validateEventDispatches(event);\n  }\n  if (Array.isArray(dispatchListeners)) {\n    for (var i = 0; i < dispatchListeners.length; i++) {\n      if (event.isPropagationStopped()) {\n        break;\n      }\n      // Listeners and Instances are two parallel arrays that are always in sync.\n      if (dispatchListeners[i](event, dispatchInstances[i])) {\n        return dispatchInstances[i];\n      }\n    }\n  } else if (dispatchListeners) {\n    if (dispatchListeners(event, dispatchInstances)) {\n      return dispatchInstances;\n    }\n  }\n  return null;\n}\n\n/**\n * @see executeDispatchesInOrderStopAtTrueImpl\n */\nfunction executeDispatchesInOrderStopAtTrue(event) {\n  var ret = executeDispatchesInOrderStopAtTrueImpl(event);\n  event._dispatchInstances = null;\n  event._dispatchListeners = null;\n  return ret;\n}\n\n/**\n * Execution of a \"direct\" dispatch - there must be at most one dispatch\n * accumulated on the event or it is considered an error. It doesn't really make\n * sense for an event with multiple dispatches (bubbled) to keep track of the\n * return values at each dispatch execution, but it does tend to make sense when\n * dealing with \"direct\" dispatches.\n *\n * @return {*} The return value of executing the single dispatch.\n */\nfunction executeDirectDispatch(event) {\n  if (true) {\n    validateEventDispatches(event);\n  }\n  var dispatchListener = event._dispatchListeners;\n  var dispatchInstance = event._dispatchInstances;\n  !!Array.isArray(dispatchListener) ?  true ? invariant(false, 'executeDirectDispatch(...): Invalid `event`.') : _prodInvariant('103') : void 0;\n  event.currentTarget = dispatchListener ? EventPluginUtils.getNodeFromInstance(dispatchInstance) : null;\n  var res = dispatchListener ? dispatchListener(event) : null;\n  event.currentTarget = null;\n  event._dispatchListeners = null;\n  event._dispatchInstances = null;\n  return res;\n}\n\n/**\n * @param {SyntheticEvent} event\n * @return {boolean} True iff number of dispatches accumulated is greater than 0.\n */\nfunction hasDispatches(event) {\n  return !!event._dispatchListeners;\n}\n\n/**\n * General utilities that are useful in creating custom Event Plugins.\n */\nvar EventPluginUtils = {\n  isEndish: isEndish,\n  isMoveish: isMoveish,\n  isStartish: isStartish,\n\n  executeDirectDispatch: executeDirectDispatch,\n  executeDispatchesInOrder: executeDispatchesInOrder,\n  executeDispatchesInOrderStopAtTrue: executeDispatchesInOrderStopAtTrue,\n  hasDispatches: hasDispatches,\n\n  getInstanceFromNode: function (node) {\n    return ComponentTree.getInstanceFromNode(node);\n  },\n  getNodeFromInstance: function (node) {\n    return ComponentTree.getNodeFromInstance(node);\n  },\n  isAncestor: function (a, b) {\n    return TreeTraversal.isAncestor(a, b);\n  },\n  getLowestCommonAncestor: function (a, b) {\n    return TreeTraversal.getLowestCommonAncestor(a, b);\n  },\n  getParentInstance: function (inst) {\n    return TreeTraversal.getParentInstance(inst);\n  },\n  traverseTwoPhase: function (target, fn, arg) {\n    return TreeTraversal.traverseTwoPhase(target, fn, arg);\n  },\n  traverseEnterLeave: function (from, to, fn, argFrom, argTo) {\n    return TreeTraversal.traverseEnterLeave(from, to, fn, argFrom, argTo);\n  },\n\n  injection: injection\n};\n\nmodule.exports = EventPluginUtils;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0V2ZW50UGx1Z2luVXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0RXJyb3JVdGlscyA9IHJlcXVpcmUoJy4vUmVhY3RFcnJvclV0aWxzJyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG4vKipcbiAqIEluamVjdGVkIGRlcGVuZGVuY2llczpcbiAqL1xuXG4vKipcbiAqIC0gYENvbXBvbmVudFRyZWVgOiBbcmVxdWlyZWRdIE1vZHVsZSB0aGF0IGNhbiBjb252ZXJ0IGJldHdlZW4gUmVhY3QgaW5zdGFuY2VzXG4gKiAgIGFuZCBhY3R1YWwgbm9kZSByZWZlcmVuY2VzLlxuICovXG52YXIgQ29tcG9uZW50VHJlZTtcbnZhciBUcmVlVHJhdmVyc2FsO1xudmFyIGluamVjdGlvbiA9IHtcbiAgaW5qZWN0Q29tcG9uZW50VHJlZTogZnVuY3Rpb24gKEluamVjdGVkKSB7XG4gICAgQ29tcG9uZW50VHJlZSA9IEluamVjdGVkO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhJbmplY3RlZCAmJiBJbmplY3RlZC5nZXROb2RlRnJvbUluc3RhbmNlICYmIEluamVjdGVkLmdldEluc3RhbmNlRnJvbU5vZGUsICdFdmVudFBsdWdpblV0aWxzLmluamVjdGlvbi5pbmplY3RDb21wb25lbnRUcmVlKC4uLik6IEluamVjdGVkICcgKyAnbW9kdWxlIGlzIG1pc3NpbmcgZ2V0Tm9kZUZyb21JbnN0YW5jZSBvciBnZXRJbnN0YW5jZUZyb21Ob2RlLicpIDogdm9pZCAwO1xuICAgIH1cbiAgfSxcbiAgaW5qZWN0VHJlZVRyYXZlcnNhbDogZnVuY3Rpb24gKEluamVjdGVkKSB7XG4gICAgVHJlZVRyYXZlcnNhbCA9IEluamVjdGVkO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhJbmplY3RlZCAmJiBJbmplY3RlZC5pc0FuY2VzdG9yICYmIEluamVjdGVkLmdldExvd2VzdENvbW1vbkFuY2VzdG9yLCAnRXZlbnRQbHVnaW5VdGlscy5pbmplY3Rpb24uaW5qZWN0VHJlZVRyYXZlcnNhbCguLi4pOiBJbmplY3RlZCAnICsgJ21vZHVsZSBpcyBtaXNzaW5nIGlzQW5jZXN0b3Igb3IgZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IuJykgOiB2b2lkIDA7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBpc0VuZGlzaCh0b3BMZXZlbFR5cGUpIHtcbiAgcmV0dXJuIHRvcExldmVsVHlwZSA9PT0gJ3RvcE1vdXNlVXAnIHx8IHRvcExldmVsVHlwZSA9PT0gJ3RvcFRvdWNoRW5kJyB8fCB0b3BMZXZlbFR5cGUgPT09ICd0b3BUb3VjaENhbmNlbCc7XG59XG5cbmZ1bmN0aW9uIGlzTW92ZWlzaCh0b3BMZXZlbFR5cGUpIHtcbiAgcmV0dXJuIHRvcExldmVsVHlwZSA9PT0gJ3RvcE1vdXNlTW92ZScgfHwgdG9wTGV2ZWxUeXBlID09PSAndG9wVG91Y2hNb3ZlJztcbn1cbmZ1bmN0aW9uIGlzU3RhcnRpc2godG9wTGV2ZWxUeXBlKSB7XG4gIHJldHVybiB0b3BMZXZlbFR5cGUgPT09ICd0b3BNb3VzZURvd24nIHx8IHRvcExldmVsVHlwZSA9PT0gJ3RvcFRvdWNoU3RhcnQnO1xufVxuXG52YXIgdmFsaWRhdGVFdmVudERpc3BhdGNoZXM7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YWxpZGF0ZUV2ZW50RGlzcGF0Y2hlcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciBkaXNwYXRjaExpc3RlbmVycyA9IGV2ZW50Ll9kaXNwYXRjaExpc3RlbmVycztcbiAgICB2YXIgZGlzcGF0Y2hJbnN0YW5jZXMgPSBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXM7XG5cbiAgICB2YXIgbGlzdGVuZXJzSXNBcnIgPSBBcnJheS5pc0FycmF5KGRpc3BhdGNoTGlzdGVuZXJzKTtcbiAgICB2YXIgbGlzdGVuZXJzTGVuID0gbGlzdGVuZXJzSXNBcnIgPyBkaXNwYXRjaExpc3RlbmVycy5sZW5ndGggOiBkaXNwYXRjaExpc3RlbmVycyA/IDEgOiAwO1xuXG4gICAgdmFyIGluc3RhbmNlc0lzQXJyID0gQXJyYXkuaXNBcnJheShkaXNwYXRjaEluc3RhbmNlcyk7XG4gICAgdmFyIGluc3RhbmNlc0xlbiA9IGluc3RhbmNlc0lzQXJyID8gZGlzcGF0Y2hJbnN0YW5jZXMubGVuZ3RoIDogZGlzcGF0Y2hJbnN0YW5jZXMgPyAxIDogMDtcblxuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGluc3RhbmNlc0lzQXJyID09PSBsaXN0ZW5lcnNJc0FyciAmJiBpbnN0YW5jZXNMZW4gPT09IGxpc3RlbmVyc0xlbiwgJ0V2ZW50UGx1Z2luVXRpbHM6IEludmFsaWQgYGV2ZW50YC4nKSA6IHZvaWQgMDtcbiAgfTtcbn1cblxuLyoqXG4gKiBEaXNwYXRjaCB0aGUgZXZlbnQgdG8gdGhlIGxpc3RlbmVyLlxuICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgU3ludGhldGljRXZlbnQgdG8gaGFuZGxlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNpbXVsYXRlZCBJZiB0aGUgZXZlbnQgaXMgc2ltdWxhdGVkIChjaGFuZ2VzIGV4biBiZWhhdmlvcilcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyIEFwcGxpY2F0aW9uLWxldmVsIGNhbGxiYWNrXG4gKiBAcGFyYW0geyp9IGluc3QgSW50ZXJuYWwgY29tcG9uZW50IGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgc2ltdWxhdGVkLCBsaXN0ZW5lciwgaW5zdCkge1xuICB2YXIgdHlwZSA9IGV2ZW50LnR5cGUgfHwgJ3Vua25vd24tZXZlbnQnO1xuICBldmVudC5jdXJyZW50VGFyZ2V0ID0gRXZlbnRQbHVnaW5VdGlscy5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpO1xuICBpZiAoc2ltdWxhdGVkKSB7XG4gICAgUmVhY3RFcnJvclV0aWxzLmludm9rZUd1YXJkZWRDYWxsYmFja1dpdGhDYXRjaCh0eXBlLCBsaXN0ZW5lciwgZXZlbnQpO1xuICB9IGVsc2Uge1xuICAgIFJlYWN0RXJyb3JVdGlscy5pbnZva2VHdWFyZGVkQ2FsbGJhY2sodHlwZSwgbGlzdGVuZXIsIGV2ZW50KTtcbiAgfVxuICBldmVudC5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcbn1cblxuLyoqXG4gKiBTdGFuZGFyZC9zaW1wbGUgaXRlcmF0aW9uIHRocm91Z2ggYW4gZXZlbnQncyBjb2xsZWN0ZWQgZGlzcGF0Y2hlcy5cbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyKGV2ZW50LCBzaW11bGF0ZWQpIHtcbiAgdmFyIGRpc3BhdGNoTGlzdGVuZXJzID0gZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzO1xuICB2YXIgZGlzcGF0Y2hJbnN0YW5jZXMgPSBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXM7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdmFsaWRhdGVFdmVudERpc3BhdGNoZXMoZXZlbnQpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGRpc3BhdGNoTGlzdGVuZXJzKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlzcGF0Y2hMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy8gTGlzdGVuZXJzIGFuZCBJbnN0YW5jZXMgYXJlIHR3byBwYXJhbGxlbCBhcnJheXMgdGhhdCBhcmUgYWx3YXlzIGluIHN5bmMuXG4gICAgICBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIHNpbXVsYXRlZCwgZGlzcGF0Y2hMaXN0ZW5lcnNbaV0sIGRpc3BhdGNoSW5zdGFuY2VzW2ldKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZGlzcGF0Y2hMaXN0ZW5lcnMpIHtcbiAgICBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIHNpbXVsYXRlZCwgZGlzcGF0Y2hMaXN0ZW5lcnMsIGRpc3BhdGNoSW5zdGFuY2VzKTtcbiAgfVxuICBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMgPSBudWxsO1xuICBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMgPSBudWxsO1xufVxuXG4vKipcbiAqIFN0YW5kYXJkL3NpbXBsZSBpdGVyYXRpb24gdGhyb3VnaCBhbiBldmVudCdzIGNvbGxlY3RlZCBkaXNwYXRjaGVzLCBidXQgc3RvcHNcbiAqIGF0IHRoZSBmaXJzdCBkaXNwYXRjaCBleGVjdXRpb24gcmV0dXJuaW5nIHRydWUsIGFuZCByZXR1cm5zIHRoYXQgaWQuXG4gKlxuICogQHJldHVybiB7P3N0cmluZ30gaWQgb2YgdGhlIGZpcnN0IGRpc3BhdGNoIGV4ZWN1dGlvbiB3aG8ncyBsaXN0ZW5lciByZXR1cm5zXG4gKiB0cnVlLCBvciBudWxsIGlmIG5vIGxpc3RlbmVyIHJldHVybmVkIHRydWUuXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlclN0b3BBdFRydWVJbXBsKGV2ZW50KSB7XG4gIHZhciBkaXNwYXRjaExpc3RlbmVycyA9IGV2ZW50Ll9kaXNwYXRjaExpc3RlbmVycztcbiAgdmFyIGRpc3BhdGNoSW5zdGFuY2VzID0gZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHZhbGlkYXRlRXZlbnREaXNwYXRjaGVzKGV2ZW50KTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShkaXNwYXRjaExpc3RlbmVycykpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vIExpc3RlbmVycyBhbmQgSW5zdGFuY2VzIGFyZSB0d28gcGFyYWxsZWwgYXJyYXlzIHRoYXQgYXJlIGFsd2F5cyBpbiBzeW5jLlxuICAgICAgaWYgKGRpc3BhdGNoTGlzdGVuZXJzW2ldKGV2ZW50LCBkaXNwYXRjaEluc3RhbmNlc1tpXSkpIHtcbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoSW5zdGFuY2VzW2ldO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChkaXNwYXRjaExpc3RlbmVycykge1xuICAgIGlmIChkaXNwYXRjaExpc3RlbmVycyhldmVudCwgZGlzcGF0Y2hJbnN0YW5jZXMpKSB7XG4gICAgICByZXR1cm4gZGlzcGF0Y2hJbnN0YW5jZXM7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEBzZWUgZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyU3RvcEF0VHJ1ZUltcGxcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyU3RvcEF0VHJ1ZShldmVudCkge1xuICB2YXIgcmV0ID0gZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyU3RvcEF0VHJ1ZUltcGwoZXZlbnQpO1xuICBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMgPSBudWxsO1xuICBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMgPSBudWxsO1xuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIEV4ZWN1dGlvbiBvZiBhIFwiZGlyZWN0XCIgZGlzcGF0Y2ggLSB0aGVyZSBtdXN0IGJlIGF0IG1vc3Qgb25lIGRpc3BhdGNoXG4gKiBhY2N1bXVsYXRlZCBvbiB0aGUgZXZlbnQgb3IgaXQgaXMgY29uc2lkZXJlZCBhbiBlcnJvci4gSXQgZG9lc24ndCByZWFsbHkgbWFrZVxuICogc2Vuc2UgZm9yIGFuIGV2ZW50IHdpdGggbXVsdGlwbGUgZGlzcGF0Y2hlcyAoYnViYmxlZCkgdG8ga2VlcCB0cmFjayBvZiB0aGVcbiAqIHJldHVybiB2YWx1ZXMgYXQgZWFjaCBkaXNwYXRjaCBleGVjdXRpb24sIGJ1dCBpdCBkb2VzIHRlbmQgdG8gbWFrZSBzZW5zZSB3aGVuXG4gKiBkZWFsaW5nIHdpdGggXCJkaXJlY3RcIiBkaXNwYXRjaGVzLlxuICpcbiAqIEByZXR1cm4geyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgZXhlY3V0aW5nIHRoZSBzaW5nbGUgZGlzcGF0Y2guXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEaXJlY3REaXNwYXRjaChldmVudCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHZhbGlkYXRlRXZlbnREaXNwYXRjaGVzKGV2ZW50KTtcbiAgfVxuICB2YXIgZGlzcGF0Y2hMaXN0ZW5lciA9IGV2ZW50Ll9kaXNwYXRjaExpc3RlbmVycztcbiAgdmFyIGRpc3BhdGNoSW5zdGFuY2UgPSBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXM7XG4gICEhQXJyYXkuaXNBcnJheShkaXNwYXRjaExpc3RlbmVyKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdleGVjdXRlRGlyZWN0RGlzcGF0Y2goLi4uKTogSW52YWxpZCBgZXZlbnRgLicpIDogX3Byb2RJbnZhcmlhbnQoJzEwMycpIDogdm9pZCAwO1xuICBldmVudC5jdXJyZW50VGFyZ2V0ID0gZGlzcGF0Y2hMaXN0ZW5lciA/IEV2ZW50UGx1Z2luVXRpbHMuZ2V0Tm9kZUZyb21JbnN0YW5jZShkaXNwYXRjaEluc3RhbmNlKSA6IG51bGw7XG4gIHZhciByZXMgPSBkaXNwYXRjaExpc3RlbmVyID8gZGlzcGF0Y2hMaXN0ZW5lcihldmVudCkgOiBudWxsO1xuICBldmVudC5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcbiAgZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzID0gbnVsbDtcbiAgZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzID0gbnVsbDtcbiAgcmV0dXJuIHJlcztcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZmYgbnVtYmVyIG9mIGRpc3BhdGNoZXMgYWNjdW11bGF0ZWQgaXMgZ3JlYXRlciB0aGFuIDAuXG4gKi9cbmZ1bmN0aW9uIGhhc0Rpc3BhdGNoZXMoZXZlbnQpIHtcbiAgcmV0dXJuICEhZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzO1xufVxuXG4vKipcbiAqIEdlbmVyYWwgdXRpbGl0aWVzIHRoYXQgYXJlIHVzZWZ1bCBpbiBjcmVhdGluZyBjdXN0b20gRXZlbnQgUGx1Z2lucy5cbiAqL1xudmFyIEV2ZW50UGx1Z2luVXRpbHMgPSB7XG4gIGlzRW5kaXNoOiBpc0VuZGlzaCxcbiAgaXNNb3ZlaXNoOiBpc01vdmVpc2gsXG4gIGlzU3RhcnRpc2g6IGlzU3RhcnRpc2gsXG5cbiAgZXhlY3V0ZURpcmVjdERpc3BhdGNoOiBleGVjdXRlRGlyZWN0RGlzcGF0Y2gsXG4gIGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlcjogZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyLFxuICBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXJTdG9wQXRUcnVlOiBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXJTdG9wQXRUcnVlLFxuICBoYXNEaXNwYXRjaGVzOiBoYXNEaXNwYXRjaGVzLFxuXG4gIGdldEluc3RhbmNlRnJvbU5vZGU6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIENvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKTtcbiAgfSxcbiAgZ2V0Tm9kZUZyb21JbnN0YW5jZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKG5vZGUpO1xuICB9LFxuICBpc0FuY2VzdG9yOiBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBUcmVlVHJhdmVyc2FsLmlzQW5jZXN0b3IoYSwgYik7XG4gIH0sXG4gIGdldExvd2VzdENvbW1vbkFuY2VzdG9yOiBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBUcmVlVHJhdmVyc2FsLmdldExvd2VzdENvbW1vbkFuY2VzdG9yKGEsIGIpO1xuICB9LFxuICBnZXRQYXJlbnRJbnN0YW5jZTogZnVuY3Rpb24gKGluc3QpIHtcbiAgICByZXR1cm4gVHJlZVRyYXZlcnNhbC5nZXRQYXJlbnRJbnN0YW5jZShpbnN0KTtcbiAgfSxcbiAgdHJhdmVyc2VUd29QaGFzZTogZnVuY3Rpb24gKHRhcmdldCwgZm4sIGFyZykge1xuICAgIHJldHVybiBUcmVlVHJhdmVyc2FsLnRyYXZlcnNlVHdvUGhhc2UodGFyZ2V0LCBmbiwgYXJnKTtcbiAgfSxcbiAgdHJhdmVyc2VFbnRlckxlYXZlOiBmdW5jdGlvbiAoZnJvbSwgdG8sIGZuLCBhcmdGcm9tLCBhcmdUbykge1xuICAgIHJldHVybiBUcmVlVHJhdmVyc2FsLnRyYXZlcnNlRW50ZXJMZWF2ZShmcm9tLCB0bywgZm4sIGFyZ0Zyb20sIGFyZ1RvKTtcbiAgfSxcblxuICBpbmplY3Rpb246IGluamVjdGlvblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFdmVudFBsdWdpblV0aWxzO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL0V2ZW50UGx1Z2luVXRpbHMuanNcbi8vIG1vZHVsZSBpZCA9IDIxN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 218 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar caughtError = null;\n\n/**\n * Call a function while guarding against errors that happens within it.\n *\n * @param {String} name of the guard to use for logging or debugging\n * @param {Function} func The function to invoke\n * @param {*} a First argument\n * @param {*} b Second argument\n */\nfunction invokeGuardedCallback(name, func, a) {\n  try {\n    func(a);\n  } catch (x) {\n    if (caughtError === null) {\n      caughtError = x;\n    }\n  }\n}\n\nvar ReactErrorUtils = {\n  invokeGuardedCallback: invokeGuardedCallback,\n\n  /**\n   * Invoked by ReactTestUtils.Simulate so that any errors thrown by the event\n   * handler are sure to be rethrown by rethrowCaughtError.\n   */\n  invokeGuardedCallbackWithCatch: invokeGuardedCallback,\n\n  /**\n   * During execution of guarded functions we will capture the first error which\n   * we will rethrow to be handled by the top level error handler.\n   */\n  rethrowCaughtError: function () {\n    if (caughtError) {\n      var error = caughtError;\n      caughtError = null;\n      throw error;\n    }\n  }\n};\n\nif (true) {\n  /**\n   * To help development we can get better devtools integration by simulating a\n   * real browser event.\n   */\n  if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') {\n    var fakeNode = document.createElement('react');\n    ReactErrorUtils.invokeGuardedCallback = function (name, func, a) {\n      var boundFunc = func.bind(null, a);\n      var evtType = 'react-' + name;\n      fakeNode.addEventListener(evtType, boundFunc, false);\n      var evt = document.createEvent('Event');\n      // $FlowFixMe https://github.com/facebook/flow/issues/2336\n      evt.initEvent(evtType, false, false);\n      fakeNode.dispatchEvent(evt);\n      fakeNode.removeEventListener(evtType, boundFunc, false);\n    };\n  }\n}\n\nmodule.exports = ReactErrorUtils;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RXJyb3JVdGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBjYXVnaHRFcnJvciA9IG51bGw7XG5cbi8qKlxuICogQ2FsbCBhIGZ1bmN0aW9uIHdoaWxlIGd1YXJkaW5nIGFnYWluc3QgZXJyb3JzIHRoYXQgaGFwcGVucyB3aXRoaW4gaXQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgdGhlIGd1YXJkIHRvIHVzZSBmb3IgbG9nZ2luZyBvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZVxuICogQHBhcmFtIHsqfSBhIEZpcnN0IGFyZ3VtZW50XG4gKiBAcGFyYW0geyp9IGIgU2Vjb25kIGFyZ3VtZW50XG4gKi9cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFjayhuYW1lLCBmdW5jLCBhKSB7XG4gIHRyeSB7XG4gICAgZnVuYyhhKTtcbiAgfSBjYXRjaCAoeCkge1xuICAgIGlmIChjYXVnaHRFcnJvciA9PT0gbnVsbCkge1xuICAgICAgY2F1Z2h0RXJyb3IgPSB4O1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RFcnJvclV0aWxzID0ge1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2s6IGludm9rZUd1YXJkZWRDYWxsYmFjayxcblxuICAvKipcbiAgICogSW52b2tlZCBieSBSZWFjdFRlc3RVdGlscy5TaW11bGF0ZSBzbyB0aGF0IGFueSBlcnJvcnMgdGhyb3duIGJ5IHRoZSBldmVudFxuICAgKiBoYW5kbGVyIGFyZSBzdXJlIHRvIGJlIHJldGhyb3duIGJ5IHJldGhyb3dDYXVnaHRFcnJvci5cbiAgICovXG4gIGludm9rZUd1YXJkZWRDYWxsYmFja1dpdGhDYXRjaDogaW52b2tlR3VhcmRlZENhbGxiYWNrLFxuXG4gIC8qKlxuICAgKiBEdXJpbmcgZXhlY3V0aW9uIG9mIGd1YXJkZWQgZnVuY3Rpb25zIHdlIHdpbGwgY2FwdHVyZSB0aGUgZmlyc3QgZXJyb3Igd2hpY2hcbiAgICogd2Ugd2lsbCByZXRocm93IHRvIGJlIGhhbmRsZWQgYnkgdGhlIHRvcCBsZXZlbCBlcnJvciBoYW5kbGVyLlxuICAgKi9cbiAgcmV0aHJvd0NhdWdodEVycm9yOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNhdWdodEVycm9yKSB7XG4gICAgICB2YXIgZXJyb3IgPSBjYXVnaHRFcnJvcjtcbiAgICAgIGNhdWdodEVycm9yID0gbnVsbDtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxufTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgLyoqXG4gICAqIFRvIGhlbHAgZGV2ZWxvcG1lbnQgd2UgY2FuIGdldCBiZXR0ZXIgZGV2dG9vbHMgaW50ZWdyYXRpb24gYnkgc2ltdWxhdGluZyBhXG4gICAqIHJlYWwgYnJvd3NlciBldmVudC5cbiAgICovXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRpc3BhdGNoRXZlbnQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZmFrZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdyZWFjdCcpO1xuICAgIFJlYWN0RXJyb3JVdGlscy5pbnZva2VHdWFyZGVkQ2FsbGJhY2sgPSBmdW5jdGlvbiAobmFtZSwgZnVuYywgYSkge1xuICAgICAgdmFyIGJvdW5kRnVuYyA9IGZ1bmMuYmluZChudWxsLCBhKTtcbiAgICAgIHZhciBldnRUeXBlID0gJ3JlYWN0LScgKyBuYW1lO1xuICAgICAgZmFrZU5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldnRUeXBlLCBib3VuZEZ1bmMsIGZhbHNlKTtcbiAgICAgIHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICAgIC8vICRGbG93Rml4TWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzIzMzZcbiAgICAgIGV2dC5pbml0RXZlbnQoZXZ0VHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgIGZha2VOb2RlLmRpc3BhdGNoRXZlbnQoZXZ0KTtcbiAgICAgIGZha2VOb2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZ0VHlwZSwgYm91bmRGdW5jLCBmYWxzZSk7XG4gICAgfTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RXJyb3JVdGlscztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdEVycm9yVXRpbHMuanNcbi8vIG1vZHVsZSBpZCA9IDIxOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 219 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nvar invariant = __webpack_require__(180);\n\n/**\n * Accumulates items that must not be null or undefined into the first one. This\n * is used to conserve memory by avoiding array allocations, and thus sacrifices\n * API cleanness. Since `current` can be null before being passed in and not\n * null after this function, make sure to assign it back to `current`:\n *\n * `a = accumulateInto(a, b);`\n *\n * This API should be sparingly used. Try `accumulate` for something cleaner.\n *\n * @return {*|array<*>} An accumulation of items.\n */\n\nfunction accumulateInto(current, next) {\n  !(next != null) ?  true ? invariant(false, 'accumulateInto(...): Accumulated items must not be null or undefined.') : _prodInvariant('30') : void 0;\n\n  if (current == null) {\n    return next;\n  }\n\n  // Both are not empty. Warning: Never call x.concat(y) when you are not\n  // certain that x is an Array (x could be a string with concat method).\n  if (Array.isArray(current)) {\n    if (Array.isArray(next)) {\n      current.push.apply(current, next);\n      return current;\n    }\n    current.push(next);\n    return current;\n  }\n\n  if (Array.isArray(next)) {\n    // A bit too dangerous to mutate `next`.\n    return [current].concat(next);\n  }\n\n  return [current, next];\n}\n\nmodule.exports = accumulateInto;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2FjY3VtdWxhdGVJbnRvLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIEFjY3VtdWxhdGVzIGl0ZW1zIHRoYXQgbXVzdCBub3QgYmUgbnVsbCBvciB1bmRlZmluZWQgaW50byB0aGUgZmlyc3Qgb25lLiBUaGlzXG4gKiBpcyB1c2VkIHRvIGNvbnNlcnZlIG1lbW9yeSBieSBhdm9pZGluZyBhcnJheSBhbGxvY2F0aW9ucywgYW5kIHRodXMgc2FjcmlmaWNlc1xuICogQVBJIGNsZWFubmVzcy4gU2luY2UgYGN1cnJlbnRgIGNhbiBiZSBudWxsIGJlZm9yZSBiZWluZyBwYXNzZWQgaW4gYW5kIG5vdFxuICogbnVsbCBhZnRlciB0aGlzIGZ1bmN0aW9uLCBtYWtlIHN1cmUgdG8gYXNzaWduIGl0IGJhY2sgdG8gYGN1cnJlbnRgOlxuICpcbiAqIGBhID0gYWNjdW11bGF0ZUludG8oYSwgYik7YFxuICpcbiAqIFRoaXMgQVBJIHNob3VsZCBiZSBzcGFyaW5nbHkgdXNlZC4gVHJ5IGBhY2N1bXVsYXRlYCBmb3Igc29tZXRoaW5nIGNsZWFuZXIuXG4gKlxuICogQHJldHVybiB7KnxhcnJheTwqPn0gQW4gYWNjdW11bGF0aW9uIG9mIGl0ZW1zLlxuICovXG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVJbnRvKGN1cnJlbnQsIG5leHQpIHtcbiAgIShuZXh0ICE9IG51bGwpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2FjY3VtdWxhdGVJbnRvKC4uLik6IEFjY3VtdWxhdGVkIGl0ZW1zIG11c3Qgbm90IGJlIG51bGwgb3IgdW5kZWZpbmVkLicpIDogX3Byb2RJbnZhcmlhbnQoJzMwJykgOiB2b2lkIDA7XG5cbiAgaWYgKGN1cnJlbnQgPT0gbnVsbCkge1xuICAgIHJldHVybiBuZXh0O1xuICB9XG5cbiAgLy8gQm90aCBhcmUgbm90IGVtcHR5LiBXYXJuaW5nOiBOZXZlciBjYWxsIHguY29uY2F0KHkpIHdoZW4geW91IGFyZSBub3RcbiAgLy8gY2VydGFpbiB0aGF0IHggaXMgYW4gQXJyYXkgKHggY291bGQgYmUgYSBzdHJpbmcgd2l0aCBjb25jYXQgbWV0aG9kKS5cbiAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXh0KSkge1xuICAgICAgY3VycmVudC5wdXNoLmFwcGx5KGN1cnJlbnQsIG5leHQpO1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIGN1cnJlbnQucHVzaChuZXh0KTtcbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG5leHQpKSB7XG4gICAgLy8gQSBiaXQgdG9vIGRhbmdlcm91cyB0byBtdXRhdGUgYG5leHRgLlxuICAgIHJldHVybiBbY3VycmVudF0uY29uY2F0KG5leHQpO1xuICB9XG5cbiAgcmV0dXJuIFtjdXJyZW50LCBuZXh0XTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhY2N1bXVsYXRlSW50bztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9hY2N1bXVsYXRlSW50by5qc1xuLy8gbW9kdWxlIGlkID0gMjE5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 220 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\n/**\n * @param {array} arr an \"accumulation\" of items which is either an Array or\n * a single item. Useful when paired with the `accumulate` module. This is a\n * simple utility that allows us to reason about a collection of items, but\n * handling the case when there is exactly one item (and we do not need to\n * allocate an array).\n */\n\nfunction forEachAccumulated(arr, cb, scope) {\n  if (Array.isArray(arr)) {\n    arr.forEach(cb, scope);\n  } else if (arr) {\n    cb.call(scope, arr);\n  }\n}\n\nmodule.exports = forEachAccumulated;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2ZvckVhY2hBY2N1bXVsYXRlZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQHBhcmFtIHthcnJheX0gYXJyIGFuIFwiYWNjdW11bGF0aW9uXCIgb2YgaXRlbXMgd2hpY2ggaXMgZWl0aGVyIGFuIEFycmF5IG9yXG4gKiBhIHNpbmdsZSBpdGVtLiBVc2VmdWwgd2hlbiBwYWlyZWQgd2l0aCB0aGUgYGFjY3VtdWxhdGVgIG1vZHVsZS4gVGhpcyBpcyBhXG4gKiBzaW1wbGUgdXRpbGl0eSB0aGF0IGFsbG93cyB1cyB0byByZWFzb24gYWJvdXQgYSBjb2xsZWN0aW9uIG9mIGl0ZW1zLCBidXRcbiAqIGhhbmRsaW5nIHRoZSBjYXNlIHdoZW4gdGhlcmUgaXMgZXhhY3RseSBvbmUgaXRlbSAoYW5kIHdlIGRvIG5vdCBuZWVkIHRvXG4gKiBhbGxvY2F0ZSBhbiBhcnJheSkuXG4gKi9cblxuZnVuY3Rpb24gZm9yRWFjaEFjY3VtdWxhdGVkKGFyciwgY2IsIHNjb3BlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICBhcnIuZm9yRWFjaChjYiwgc2NvcGUpO1xuICB9IGVsc2UgaWYgKGFycikge1xuICAgIGNiLmNhbGwoc2NvcGUsIGFycik7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmb3JFYWNoQWNjdW11bGF0ZWQ7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvZm9yRWFjaEFjY3VtdWxhdGVkLmpzXG4vLyBtb2R1bGUgaWQgPSAyMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 221 */
/***/ function(module, exports) {

    eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n\n/**\n * Simple, lightweight module assisting with the detection and context of\n * Worker. Helps avoid circular dependencies and allows code to reason about\n * whether or not they are in a Worker, even if they never include the main\n * `ReactWorker` dependency.\n */\nvar ExecutionEnvironment = {\n\n  canUseDOM: canUseDOM,\n\n  canUseWorkers: typeof Worker !== 'undefined',\n\n  canUseEventListeners: canUseDOM && !!(window.addEventListener || window.attachEvent),\n\n  canUseViewport: canUseDOM && !!window.screen,\n\n  isInWorker: !canUseDOM // For now, this is true - might change in the future.\n\n};\n\nmodule.exports = ExecutionEnvironment;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5cbi8qKlxuICogU2ltcGxlLCBsaWdodHdlaWdodCBtb2R1bGUgYXNzaXN0aW5nIHdpdGggdGhlIGRldGVjdGlvbiBhbmQgY29udGV4dCBvZlxuICogV29ya2VyLiBIZWxwcyBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmNpZXMgYW5kIGFsbG93cyBjb2RlIHRvIHJlYXNvbiBhYm91dFxuICogd2hldGhlciBvciBub3QgdGhleSBhcmUgaW4gYSBXb3JrZXIsIGV2ZW4gaWYgdGhleSBuZXZlciBpbmNsdWRlIHRoZSBtYWluXG4gKiBgUmVhY3RXb3JrZXJgIGRlcGVuZGVuY3kuXG4gKi9cbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHtcblxuICBjYW5Vc2VET006IGNhblVzZURPTSxcblxuICBjYW5Vc2VXb3JrZXJzOiB0eXBlb2YgV29ya2VyICE9PSAndW5kZWZpbmVkJyxcblxuICBjYW5Vc2VFdmVudExpc3RlbmVyczogY2FuVXNlRE9NICYmICEhKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyIHx8IHdpbmRvdy5hdHRhY2hFdmVudCksXG5cbiAgY2FuVXNlVmlld3BvcnQ6IGNhblVzZURPTSAmJiAhIXdpbmRvdy5zY3JlZW4sXG5cbiAgaXNJbldvcmtlcjogIWNhblVzZURPTSAvLyBGb3Igbm93LCB0aGlzIGlzIHRydWUgLSBtaWdodCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS5cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFeGVjdXRpb25FbnZpcm9ubWVudDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZmJqcy9saWIvRXhlY3V0aW9uRW52aXJvbm1lbnQuanNcbi8vIG1vZHVsZSBpZCA9IDIyMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 222 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _assign = __webpack_require__(176);\n\nvar PooledClass = __webpack_require__(223);\n\nvar getTextContentAccessor = __webpack_require__(224);\n\n/**\n * This helper class stores information about text content of a target node,\n * allowing comparison of content before and after a given event.\n *\n * Identify the node where selection currently begins, then observe\n * both its text content and its current position in the DOM. Since the\n * browser may natively replace the target node during composition, we can\n * use its position to find its replacement.\n *\n * @param {DOMEventTarget} root\n */\nfunction FallbackCompositionState(root) {\n  this._root = root;\n  this._startText = this.getText();\n  this._fallbackText = null;\n}\n\n_assign(FallbackCompositionState.prototype, {\n  destructor: function () {\n    this._root = null;\n    this._startText = null;\n    this._fallbackText = null;\n  },\n\n  /**\n   * Get current text of input.\n   *\n   * @return {string}\n   */\n  getText: function () {\n    if ('value' in this._root) {\n      return this._root.value;\n    }\n    return this._root[getTextContentAccessor()];\n  },\n\n  /**\n   * Determine the differing substring between the initially stored\n   * text content and the current content.\n   *\n   * @return {string}\n   */\n  getData: function () {\n    if (this._fallbackText) {\n      return this._fallbackText;\n    }\n\n    var start;\n    var startValue = this._startText;\n    var startLength = startValue.length;\n    var end;\n    var endValue = this.getText();\n    var endLength = endValue.length;\n\n    for (start = 0; start < startLength; start++) {\n      if (startValue[start] !== endValue[start]) {\n        break;\n      }\n    }\n\n    var minEnd = startLength - start;\n    for (end = 1; end <= minEnd; end++) {\n      if (startValue[startLength - end] !== endValue[endLength - end]) {\n        break;\n      }\n    }\n\n    var sliceTail = end > 1 ? 1 - end : undefined;\n    this._fallbackText = endValue.slice(start, sliceTail);\n    return this._fallbackText;\n  }\n});\n\nPooledClass.addPoolingTo(FallbackCompositionState);\n\nmodule.exports = FallbackCompositionState;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0ZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIFBvb2xlZENsYXNzID0gcmVxdWlyZSgnLi9Qb29sZWRDbGFzcycpO1xuXG52YXIgZ2V0VGV4dENvbnRlbnRBY2Nlc3NvciA9IHJlcXVpcmUoJy4vZ2V0VGV4dENvbnRlbnRBY2Nlc3NvcicpO1xuXG4vKipcbiAqIFRoaXMgaGVscGVyIGNsYXNzIHN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCB0ZXh0IGNvbnRlbnQgb2YgYSB0YXJnZXQgbm9kZSxcbiAqIGFsbG93aW5nIGNvbXBhcmlzb24gb2YgY29udGVudCBiZWZvcmUgYW5kIGFmdGVyIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogSWRlbnRpZnkgdGhlIG5vZGUgd2hlcmUgc2VsZWN0aW9uIGN1cnJlbnRseSBiZWdpbnMsIHRoZW4gb2JzZXJ2ZVxuICogYm90aCBpdHMgdGV4dCBjb250ZW50IGFuZCBpdHMgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgRE9NLiBTaW5jZSB0aGVcbiAqIGJyb3dzZXIgbWF5IG5hdGl2ZWx5IHJlcGxhY2UgdGhlIHRhcmdldCBub2RlIGR1cmluZyBjb21wb3NpdGlvbiwgd2UgY2FuXG4gKiB1c2UgaXRzIHBvc2l0aW9uIHRvIGZpbmQgaXRzIHJlcGxhY2VtZW50LlxuICpcbiAqIEBwYXJhbSB7RE9NRXZlbnRUYXJnZXR9IHJvb3RcbiAqL1xuZnVuY3Rpb24gRmFsbGJhY2tDb21wb3NpdGlvblN0YXRlKHJvb3QpIHtcbiAgdGhpcy5fcm9vdCA9IHJvb3Q7XG4gIHRoaXMuX3N0YXJ0VGV4dCA9IHRoaXMuZ2V0VGV4dCgpO1xuICB0aGlzLl9mYWxsYmFja1RleHQgPSBudWxsO1xufVxuXG5fYXNzaWduKEZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZS5wcm90b3R5cGUsIHtcbiAgZGVzdHJ1Y3RvcjogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3Jvb3QgPSBudWxsO1xuICAgIHRoaXMuX3N0YXJ0VGV4dCA9IG51bGw7XG4gICAgdGhpcy5fZmFsbGJhY2tUZXh0ID0gbnVsbDtcbiAgfSxcblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgdGV4dCBvZiBpbnB1dC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0VGV4dDogZnVuY3Rpb24gKCkge1xuICAgIGlmICgndmFsdWUnIGluIHRoaXMuX3Jvb3QpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yb290LnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcm9vdFtnZXRUZXh0Q29udGVudEFjY2Vzc29yKCldO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgdGhlIGRpZmZlcmluZyBzdWJzdHJpbmcgYmV0d2VlbiB0aGUgaW5pdGlhbGx5IHN0b3JlZFxuICAgKiB0ZXh0IGNvbnRlbnQgYW5kIHRoZSBjdXJyZW50IGNvbnRlbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldERhdGE6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fZmFsbGJhY2tUZXh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5fZmFsbGJhY2tUZXh0O1xuICAgIH1cblxuICAgIHZhciBzdGFydDtcbiAgICB2YXIgc3RhcnRWYWx1ZSA9IHRoaXMuX3N0YXJ0VGV4dDtcbiAgICB2YXIgc3RhcnRMZW5ndGggPSBzdGFydFZhbHVlLmxlbmd0aDtcbiAgICB2YXIgZW5kO1xuICAgIHZhciBlbmRWYWx1ZSA9IHRoaXMuZ2V0VGV4dCgpO1xuICAgIHZhciBlbmRMZW5ndGggPSBlbmRWYWx1ZS5sZW5ndGg7XG5cbiAgICBmb3IgKHN0YXJ0ID0gMDsgc3RhcnQgPCBzdGFydExlbmd0aDsgc3RhcnQrKykge1xuICAgICAgaWYgKHN0YXJ0VmFsdWVbc3RhcnRdICE9PSBlbmRWYWx1ZVtzdGFydF0pIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG1pbkVuZCA9IHN0YXJ0TGVuZ3RoIC0gc3RhcnQ7XG4gICAgZm9yIChlbmQgPSAxOyBlbmQgPD0gbWluRW5kOyBlbmQrKykge1xuICAgICAgaWYgKHN0YXJ0VmFsdWVbc3RhcnRMZW5ndGggLSBlbmRdICE9PSBlbmRWYWx1ZVtlbmRMZW5ndGggLSBlbmRdKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzbGljZVRhaWwgPSBlbmQgPiAxID8gMSAtIGVuZCA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9mYWxsYmFja1RleHQgPSBlbmRWYWx1ZS5zbGljZShzdGFydCwgc2xpY2VUYWlsKTtcbiAgICByZXR1cm4gdGhpcy5fZmFsbGJhY2tUZXh0O1xuICB9XG59KTtcblxuUG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKEZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRmFsbGJhY2tDb21wb3NpdGlvblN0YXRlO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL0ZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZS5qc1xuLy8gbW9kdWxlIGlkID0gMjIyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 223 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nvar invariant = __webpack_require__(180);\n\n/**\n * Static poolers. Several custom versions for each potential number of\n * arguments. A completely generic pooler is easy to implement, but would\n * require accessing the `arguments` object. In each of these, `this` refers to\n * the Class itself, not an instance. If any others are needed, simply add them\n * here, or in their own files.\n */\nvar oneArgumentPooler = function (copyFieldsFrom) {\n  var Klass = this;\n  if (Klass.instancePool.length) {\n    var instance = Klass.instancePool.pop();\n    Klass.call(instance, copyFieldsFrom);\n    return instance;\n  } else {\n    return new Klass(copyFieldsFrom);\n  }\n};\n\nvar twoArgumentPooler = function (a1, a2) {\n  var Klass = this;\n  if (Klass.instancePool.length) {\n    var instance = Klass.instancePool.pop();\n    Klass.call(instance, a1, a2);\n    return instance;\n  } else {\n    return new Klass(a1, a2);\n  }\n};\n\nvar threeArgumentPooler = function (a1, a2, a3) {\n  var Klass = this;\n  if (Klass.instancePool.length) {\n    var instance = Klass.instancePool.pop();\n    Klass.call(instance, a1, a2, a3);\n    return instance;\n  } else {\n    return new Klass(a1, a2, a3);\n  }\n};\n\nvar fourArgumentPooler = function (a1, a2, a3, a4) {\n  var Klass = this;\n  if (Klass.instancePool.length) {\n    var instance = Klass.instancePool.pop();\n    Klass.call(instance, a1, a2, a3, a4);\n    return instance;\n  } else {\n    return new Klass(a1, a2, a3, a4);\n  }\n};\n\nvar standardReleaser = function (instance) {\n  var Klass = this;\n  !(instance instanceof Klass) ?  true ? invariant(false, 'Trying to release an instance into a pool of a different type.') : _prodInvariant('25') : void 0;\n  instance.destructor();\n  if (Klass.instancePool.length < Klass.poolSize) {\n    Klass.instancePool.push(instance);\n  }\n};\n\nvar DEFAULT_POOL_SIZE = 10;\nvar DEFAULT_POOLER = oneArgumentPooler;\n\n/**\n * Augments `CopyConstructor` to be a poolable class, augmenting only the class\n * itself (statically) not adding any prototypical fields. Any CopyConstructor\n * you give this may have a `poolSize` property, and will look for a\n * prototypical `destructor` on instances.\n *\n * @param {Function} CopyConstructor Constructor that can be used to reset.\n * @param {Function} pooler Customizable pooler.\n */\nvar addPoolingTo = function (CopyConstructor, pooler) {\n  // Casting as any so that flow ignores the actual implementation and trusts\n  // it to match the type we declared\n  var NewKlass = CopyConstructor;\n  NewKlass.instancePool = [];\n  NewKlass.getPooled = pooler || DEFAULT_POOLER;\n  if (!NewKlass.poolSize) {\n    NewKlass.poolSize = DEFAULT_POOL_SIZE;\n  }\n  NewKlass.release = standardReleaser;\n  return NewKlass;\n};\n\nvar PooledClass = {\n  addPoolingTo: addPoolingTo,\n  oneArgumentPooler: oneArgumentPooler,\n  twoArgumentPooler: twoArgumentPooler,\n  threeArgumentPooler: threeArgumentPooler,\n  fourArgumentPooler: fourArgumentPooler\n};\n\nmodule.exports = PooledClass;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1Bvb2xlZENsYXNzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIFN0YXRpYyBwb29sZXJzLiBTZXZlcmFsIGN1c3RvbSB2ZXJzaW9ucyBmb3IgZWFjaCBwb3RlbnRpYWwgbnVtYmVyIG9mXG4gKiBhcmd1bWVudHMuIEEgY29tcGxldGVseSBnZW5lcmljIHBvb2xlciBpcyBlYXN5IHRvIGltcGxlbWVudCwgYnV0IHdvdWxkXG4gKiByZXF1aXJlIGFjY2Vzc2luZyB0aGUgYGFyZ3VtZW50c2Agb2JqZWN0LiBJbiBlYWNoIG9mIHRoZXNlLCBgdGhpc2AgcmVmZXJzIHRvXG4gKiB0aGUgQ2xhc3MgaXRzZWxmLCBub3QgYW4gaW5zdGFuY2UuIElmIGFueSBvdGhlcnMgYXJlIG5lZWRlZCwgc2ltcGx5IGFkZCB0aGVtXG4gKiBoZXJlLCBvciBpbiB0aGVpciBvd24gZmlsZXMuXG4gKi9cbnZhciBvbmVBcmd1bWVudFBvb2xlciA9IGZ1bmN0aW9uIChjb3B5RmllbGRzRnJvbSkge1xuICB2YXIgS2xhc3MgPSB0aGlzO1xuICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCkge1xuICAgIHZhciBpbnN0YW5jZSA9IEtsYXNzLmluc3RhbmNlUG9vbC5wb3AoKTtcbiAgICBLbGFzcy5jYWxsKGluc3RhbmNlLCBjb3B5RmllbGRzRnJvbSk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgS2xhc3MoY29weUZpZWxkc0Zyb20pO1xuICB9XG59O1xuXG52YXIgdHdvQXJndW1lbnRQb29sZXIgPSBmdW5jdGlvbiAoYTEsIGEyKSB7XG4gIHZhciBLbGFzcyA9IHRoaXM7XG4gIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKSB7XG4gICAgdmFyIGluc3RhbmNlID0gS2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpO1xuICAgIEtsYXNzLmNhbGwoaW5zdGFuY2UsIGExLCBhMik7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgS2xhc3MoYTEsIGEyKTtcbiAgfVxufTtcblxudmFyIHRocmVlQXJndW1lbnRQb29sZXIgPSBmdW5jdGlvbiAoYTEsIGEyLCBhMykge1xuICB2YXIgS2xhc3MgPSB0aGlzO1xuICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCkge1xuICAgIHZhciBpbnN0YW5jZSA9IEtsYXNzLmluc3RhbmNlUG9vbC5wb3AoKTtcbiAgICBLbGFzcy5jYWxsKGluc3RhbmNlLCBhMSwgYTIsIGEzKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBLbGFzcyhhMSwgYTIsIGEzKTtcbiAgfVxufTtcblxudmFyIGZvdXJBcmd1bWVudFBvb2xlciA9IGZ1bmN0aW9uIChhMSwgYTIsIGEzLCBhNCkge1xuICB2YXIgS2xhc3MgPSB0aGlzO1xuICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCkge1xuICAgIHZhciBpbnN0YW5jZSA9IEtsYXNzLmluc3RhbmNlUG9vbC5wb3AoKTtcbiAgICBLbGFzcy5jYWxsKGluc3RhbmNlLCBhMSwgYTIsIGEzLCBhNCk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgS2xhc3MoYTEsIGEyLCBhMywgYTQpO1xuICB9XG59O1xuXG52YXIgc3RhbmRhcmRSZWxlYXNlciA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICB2YXIgS2xhc3MgPSB0aGlzO1xuICAhKGluc3RhbmNlIGluc3RhbmNlb2YgS2xhc3MpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1RyeWluZyB0byByZWxlYXNlIGFuIGluc3RhbmNlIGludG8gYSBwb29sIG9mIGEgZGlmZmVyZW50IHR5cGUuJykgOiBfcHJvZEludmFyaWFudCgnMjUnKSA6IHZvaWQgMDtcbiAgaW5zdGFuY2UuZGVzdHJ1Y3RvcigpO1xuICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCA8IEtsYXNzLnBvb2xTaXplKSB7XG4gICAgS2xhc3MuaW5zdGFuY2VQb29sLnB1c2goaW5zdGFuY2UpO1xuICB9XG59O1xuXG52YXIgREVGQVVMVF9QT09MX1NJWkUgPSAxMDtcbnZhciBERUZBVUxUX1BPT0xFUiA9IG9uZUFyZ3VtZW50UG9vbGVyO1xuXG4vKipcbiAqIEF1Z21lbnRzIGBDb3B5Q29uc3RydWN0b3JgIHRvIGJlIGEgcG9vbGFibGUgY2xhc3MsIGF1Z21lbnRpbmcgb25seSB0aGUgY2xhc3NcbiAqIGl0c2VsZiAoc3RhdGljYWxseSkgbm90IGFkZGluZyBhbnkgcHJvdG90eXBpY2FsIGZpZWxkcy4gQW55IENvcHlDb25zdHJ1Y3RvclxuICogeW91IGdpdmUgdGhpcyBtYXkgaGF2ZSBhIGBwb29sU2l6ZWAgcHJvcGVydHksIGFuZCB3aWxsIGxvb2sgZm9yIGFcbiAqIHByb3RvdHlwaWNhbCBgZGVzdHJ1Y3RvcmAgb24gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IENvcHlDb25zdHJ1Y3RvciBDb25zdHJ1Y3RvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlc2V0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcG9vbGVyIEN1c3RvbWl6YWJsZSBwb29sZXIuXG4gKi9cbnZhciBhZGRQb29saW5nVG8gPSBmdW5jdGlvbiAoQ29weUNvbnN0cnVjdG9yLCBwb29sZXIpIHtcbiAgLy8gQ2FzdGluZyBhcyBhbnkgc28gdGhhdCBmbG93IGlnbm9yZXMgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBhbmQgdHJ1c3RzXG4gIC8vIGl0IHRvIG1hdGNoIHRoZSB0eXBlIHdlIGRlY2xhcmVkXG4gIHZhciBOZXdLbGFzcyA9IENvcHlDb25zdHJ1Y3RvcjtcbiAgTmV3S2xhc3MuaW5zdGFuY2VQb29sID0gW107XG4gIE5ld0tsYXNzLmdldFBvb2xlZCA9IHBvb2xlciB8fCBERUZBVUxUX1BPT0xFUjtcbiAgaWYgKCFOZXdLbGFzcy5wb29sU2l6ZSkge1xuICAgIE5ld0tsYXNzLnBvb2xTaXplID0gREVGQVVMVF9QT09MX1NJWkU7XG4gIH1cbiAgTmV3S2xhc3MucmVsZWFzZSA9IHN0YW5kYXJkUmVsZWFzZXI7XG4gIHJldHVybiBOZXdLbGFzcztcbn07XG5cbnZhciBQb29sZWRDbGFzcyA9IHtcbiAgYWRkUG9vbGluZ1RvOiBhZGRQb29saW5nVG8sXG4gIG9uZUFyZ3VtZW50UG9vbGVyOiBvbmVBcmd1bWVudFBvb2xlcixcbiAgdHdvQXJndW1lbnRQb29sZXI6IHR3b0FyZ3VtZW50UG9vbGVyLFxuICB0aHJlZUFyZ3VtZW50UG9vbGVyOiB0aHJlZUFyZ3VtZW50UG9vbGVyLFxuICBmb3VyQXJndW1lbnRQb29sZXI6IGZvdXJBcmd1bWVudFBvb2xlclxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBQb29sZWRDbGFzcztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9Qb29sZWRDbGFzcy5qc1xuLy8gbW9kdWxlIGlkID0gMjIzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 224 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar ExecutionEnvironment = __webpack_require__(221);\n\nvar contentKey = null;\n\n/**\n * Gets the key used to access text content on a DOM node.\n *\n * @return {?string} Key used to access text content.\n * @internal\n */\nfunction getTextContentAccessor() {\n  if (!contentKey && ExecutionEnvironment.canUseDOM) {\n    // Prefer textContent to innerText because many browsers support both but\n    // SVG <text> elements don't support innerText even when <div> does.\n    contentKey = 'textContent' in document.documentElement ? 'textContent' : 'innerText';\n  }\n  return contentKey;\n}\n\nmodule.exports = getTextContentAccessor;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2dldFRleHRDb250ZW50QWNjZXNzb3IuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gcmVxdWlyZSgnZmJqcy9saWIvRXhlY3V0aW9uRW52aXJvbm1lbnQnKTtcblxudmFyIGNvbnRlbnRLZXkgPSBudWxsO1xuXG4vKipcbiAqIEdldHMgdGhlIGtleSB1c2VkIHRvIGFjY2VzcyB0ZXh0IGNvbnRlbnQgb24gYSBET00gbm9kZS5cbiAqXG4gKiBAcmV0dXJuIHs/c3RyaW5nfSBLZXkgdXNlZCB0byBhY2Nlc3MgdGV4dCBjb250ZW50LlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGdldFRleHRDb250ZW50QWNjZXNzb3IoKSB7XG4gIGlmICghY29udGVudEtleSAmJiBFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00pIHtcbiAgICAvLyBQcmVmZXIgdGV4dENvbnRlbnQgdG8gaW5uZXJUZXh0IGJlY2F1c2UgbWFueSBicm93c2VycyBzdXBwb3J0IGJvdGggYnV0XG4gICAgLy8gU1ZHIDx0ZXh0PiBlbGVtZW50cyBkb24ndCBzdXBwb3J0IGlubmVyVGV4dCBldmVuIHdoZW4gPGRpdj4gZG9lcy5cbiAgICBjb250ZW50S2V5ID0gJ3RleHRDb250ZW50JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgPyAndGV4dENvbnRlbnQnIDogJ2lubmVyVGV4dCc7XG4gIH1cbiAgcmV0dXJuIGNvbnRlbnRLZXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0VGV4dENvbnRlbnRBY2Nlc3NvcjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9nZXRUZXh0Q29udGVudEFjY2Vzc29yLmpzXG4vLyBtb2R1bGUgaWQgPSAyMjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 225 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar SyntheticEvent = __webpack_require__(226);\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents\n */\nvar CompositionEventInterface = {\n  data: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticCompositionEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n  return SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticEvent.augmentClass(SyntheticCompositionEvent, CompositionEventInterface);\n\nmodule.exports = SyntheticCompositionEvent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY0V2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNFdmVudCcpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtY29tcG9zaXRpb25ldmVudHNcbiAqL1xudmFyIENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSB7XG4gIGRhdGE6IG51bGxcbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9XG4gKi9cbmZ1bmN0aW9uIFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY0V2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljQ29tcG9zaXRpb25FdmVudCwgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljQ29tcG9zaXRpb25FdmVudDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAyMjVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 226 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _assign = __webpack_require__(176);\n\nvar PooledClass = __webpack_require__(223);\n\nvar emptyFunction = __webpack_require__(184);\nvar warning = __webpack_require__(183);\n\nvar didWarnForAddedNewProperty = false;\nvar isProxySupported = typeof Proxy === 'function';\n\nvar shouldBeReleasedProperties = ['dispatchConfig', '_targetInst', 'nativeEvent', 'isDefaultPrevented', 'isPropagationStopped', '_dispatchListeners', '_dispatchInstances'];\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar EventInterface = {\n  type: null,\n  target: null,\n  // currentTarget is set when dispatching; no use in copying it here\n  currentTarget: emptyFunction.thatReturnsNull,\n  eventPhase: null,\n  bubbles: null,\n  cancelable: null,\n  timeStamp: function (event) {\n    return event.timeStamp || Date.now();\n  },\n  defaultPrevented: null,\n  isTrusted: null\n};\n\n/**\n * Synthetic events are dispatched by event plugins, typically in response to a\n * top-level event delegation handler.\n *\n * These systems should generally use pooling to reduce the frequency of garbage\n * collection. The system should check `isPersistent` to determine whether the\n * event should be released into the pool after being dispatched. Users that\n * need a persisted event should invoke `persist`.\n *\n * Synthetic events (and subclasses) implement the DOM Level 3 Events API by\n * normalizing browser quirks. Subclasses do not necessarily have to implement a\n * DOM interface; custom application-specific events can also subclass this.\n *\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {*} targetInst Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @param {DOMEventTarget} nativeEventTarget Target node.\n */\nfunction SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeEventTarget) {\n  if (true) {\n    // these have a getter/setter for warnings\n    delete this.nativeEvent;\n    delete this.preventDefault;\n    delete this.stopPropagation;\n  }\n\n  this.dispatchConfig = dispatchConfig;\n  this._targetInst = targetInst;\n  this.nativeEvent = nativeEvent;\n\n  var Interface = this.constructor.Interface;\n  for (var propName in Interface) {\n    if (!Interface.hasOwnProperty(propName)) {\n      continue;\n    }\n    if (true) {\n      delete this[propName]; // this has a getter/setter for warnings\n    }\n    var normalize = Interface[propName];\n    if (normalize) {\n      this[propName] = normalize(nativeEvent);\n    } else {\n      if (propName === 'target') {\n        this.target = nativeEventTarget;\n      } else {\n        this[propName] = nativeEvent[propName];\n      }\n    }\n  }\n\n  var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false;\n  if (defaultPrevented) {\n    this.isDefaultPrevented = emptyFunction.thatReturnsTrue;\n  } else {\n    this.isDefaultPrevented = emptyFunction.thatReturnsFalse;\n  }\n  this.isPropagationStopped = emptyFunction.thatReturnsFalse;\n  return this;\n}\n\n_assign(SyntheticEvent.prototype, {\n\n  preventDefault: function () {\n    this.defaultPrevented = true;\n    var event = this.nativeEvent;\n    if (!event) {\n      return;\n    }\n\n    if (event.preventDefault) {\n      event.preventDefault();\n    } else if (typeof event.returnValue !== 'unknown') {\n      // eslint-disable-line valid-typeof\n      event.returnValue = false;\n    }\n    this.isDefaultPrevented = emptyFunction.thatReturnsTrue;\n  },\n\n  stopPropagation: function () {\n    var event = this.nativeEvent;\n    if (!event) {\n      return;\n    }\n\n    if (event.stopPropagation) {\n      event.stopPropagation();\n    } else if (typeof event.cancelBubble !== 'unknown') {\n      // eslint-disable-line valid-typeof\n      // The ChangeEventPlugin registers a \"propertychange\" event for\n      // IE. This event does not support bubbling or cancelling, and\n      // any references to cancelBubble throw \"Member not found\".  A\n      // typeof check of \"unknown\" circumvents this issue (and is also\n      // IE specific).\n      event.cancelBubble = true;\n    }\n\n    this.isPropagationStopped = emptyFunction.thatReturnsTrue;\n  },\n\n  /**\n   * We release all dispatched `SyntheticEvent`s after each event loop, adding\n   * them back into the pool. This allows a way to hold onto a reference that\n   * won't be added back into the pool.\n   */\n  persist: function () {\n    this.isPersistent = emptyFunction.thatReturnsTrue;\n  },\n\n  /**\n   * Checks if this event should be released back into the pool.\n   *\n   * @return {boolean} True if this should not be released, false otherwise.\n   */\n  isPersistent: emptyFunction.thatReturnsFalse,\n\n  /**\n   * `PooledClass` looks for `destructor` on each instance it releases.\n   */\n  destructor: function () {\n    var Interface = this.constructor.Interface;\n    for (var propName in Interface) {\n      if (true) {\n        Object.defineProperty(this, propName, getPooledWarningPropertyDefinition(propName, Interface[propName]));\n      } else {\n        this[propName] = null;\n      }\n    }\n    for (var i = 0; i < shouldBeReleasedProperties.length; i++) {\n      this[shouldBeReleasedProperties[i]] = null;\n    }\n    if (true) {\n      Object.defineProperty(this, 'nativeEvent', getPooledWarningPropertyDefinition('nativeEvent', null));\n      Object.defineProperty(this, 'preventDefault', getPooledWarningPropertyDefinition('preventDefault', emptyFunction));\n      Object.defineProperty(this, 'stopPropagation', getPooledWarningPropertyDefinition('stopPropagation', emptyFunction));\n    }\n  }\n\n});\n\nSyntheticEvent.Interface = EventInterface;\n\nif (true) {\n  if (isProxySupported) {\n    /*eslint-disable no-func-assign */\n    SyntheticEvent = new Proxy(SyntheticEvent, {\n      construct: function (target, args) {\n        return this.apply(target, Object.create(target.prototype), args);\n      },\n      apply: function (constructor, that, args) {\n        return new Proxy(constructor.apply(that, args), {\n          set: function (target, prop, value) {\n            if (prop !== 'isPersistent' && !target.constructor.Interface.hasOwnProperty(prop) && shouldBeReleasedProperties.indexOf(prop) === -1) {\n               true ? warning(didWarnForAddedNewProperty || target.isPersistent(), 'This synthetic event is reused for performance reasons. If you\\'re ' + 'seeing this, you\\'re adding a new property in the synthetic event object. ' + 'The property is never released. See ' + 'https://fb.me/react-event-pooling for more information.') : void 0;\n              didWarnForAddedNewProperty = true;\n            }\n            target[prop] = value;\n            return true;\n          }\n        });\n      }\n    });\n    /*eslint-enable no-func-assign */\n  }\n}\n/**\n * Helper to reduce boilerplate when creating subclasses.\n *\n * @param {function} Class\n * @param {?object} Interface\n */\nSyntheticEvent.augmentClass = function (Class, Interface) {\n  var Super = this;\n\n  var E = function () {};\n  E.prototype = Super.prototype;\n  var prototype = new E();\n\n  _assign(prototype, Class.prototype);\n  Class.prototype = prototype;\n  Class.prototype.constructor = Class;\n\n  Class.Interface = _assign({}, Super.Interface, Interface);\n  Class.augmentClass = Super.augmentClass;\n\n  PooledClass.addPoolingTo(Class, PooledClass.fourArgumentPooler);\n};\n\nPooledClass.addPoolingTo(SyntheticEvent, PooledClass.fourArgumentPooler);\n\nmodule.exports = SyntheticEvent;\n\n/**\n  * Helper to nullify syntheticEvent instance properties when destructing\n  *\n  * @param {object} SyntheticEvent\n  * @param {String} propName\n  * @return {object} defineProperty object\n  */\nfunction getPooledWarningPropertyDefinition(propName, getVal) {\n  var isFunction = typeof getVal === 'function';\n  return {\n    configurable: true,\n    set: set,\n    get: get\n  };\n\n  function set(val) {\n    var action = isFunction ? 'setting the method' : 'setting the property';\n    warn(action, 'This is effectively a no-op');\n    return val;\n  }\n\n  function get() {\n    var action = isFunction ? 'accessing the method' : 'accessing the property';\n    var result = isFunction ? 'This is a no-op function' : 'This is set to null';\n    warn(action, result);\n    return getVal;\n  }\n\n  function warn(action, result) {\n    var warningCondition = false;\n     true ? warning(warningCondition, 'This synthetic event is reused for performance reasons. If you\\'re seeing this, ' + 'you\\'re %s `%s` on a released/nullified synthetic event. %s. ' + 'If you must keep the original synthetic event around, use event.persist(). ' + 'See https://fb.me/react-event-pooling for more information.', action, propName, result) : void 0;\n  }\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0V2ZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUG9vbGVkQ2xhc3MgPSByZXF1aXJlKCcuL1Bvb2xlZENsYXNzJyk7XG5cbnZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlGdW5jdGlvbicpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBkaWRXYXJuRm9yQWRkZWROZXdQcm9wZXJ0eSA9IGZhbHNlO1xudmFyIGlzUHJveHlTdXBwb3J0ZWQgPSB0eXBlb2YgUHJveHkgPT09ICdmdW5jdGlvbic7XG5cbnZhciBzaG91bGRCZVJlbGVhc2VkUHJvcGVydGllcyA9IFsnZGlzcGF0Y2hDb25maWcnLCAnX3RhcmdldEluc3QnLCAnbmF0aXZlRXZlbnQnLCAnaXNEZWZhdWx0UHJldmVudGVkJywgJ2lzUHJvcGFnYXRpb25TdG9wcGVkJywgJ19kaXNwYXRjaExpc3RlbmVycycsICdfZGlzcGF0Y2hJbnN0YW5jZXMnXTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xudmFyIEV2ZW50SW50ZXJmYWNlID0ge1xuICB0eXBlOiBudWxsLFxuICB0YXJnZXQ6IG51bGwsXG4gIC8vIGN1cnJlbnRUYXJnZXQgaXMgc2V0IHdoZW4gZGlzcGF0Y2hpbmc7IG5vIHVzZSBpbiBjb3B5aW5nIGl0IGhlcmVcbiAgY3VycmVudFRhcmdldDogZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGwsXG4gIGV2ZW50UGhhc2U6IG51bGwsXG4gIGJ1YmJsZXM6IG51bGwsXG4gIGNhbmNlbGFibGU6IG51bGwsXG4gIHRpbWVTdGFtcDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIGV2ZW50LnRpbWVTdGFtcCB8fCBEYXRlLm5vdygpO1xuICB9LFxuICBkZWZhdWx0UHJldmVudGVkOiBudWxsLFxuICBpc1RydXN0ZWQ6IG51bGxcbn07XG5cbi8qKlxuICogU3ludGhldGljIGV2ZW50cyBhcmUgZGlzcGF0Y2hlZCBieSBldmVudCBwbHVnaW5zLCB0eXBpY2FsbHkgaW4gcmVzcG9uc2UgdG8gYVxuICogdG9wLWxldmVsIGV2ZW50IGRlbGVnYXRpb24gaGFuZGxlci5cbiAqXG4gKiBUaGVzZSBzeXN0ZW1zIHNob3VsZCBnZW5lcmFsbHkgdXNlIHBvb2xpbmcgdG8gcmVkdWNlIHRoZSBmcmVxdWVuY3kgb2YgZ2FyYmFnZVxuICogY29sbGVjdGlvbi4gVGhlIHN5c3RlbSBzaG91bGQgY2hlY2sgYGlzUGVyc2lzdGVudGAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlXG4gKiBldmVudCBzaG91bGQgYmUgcmVsZWFzZWQgaW50byB0aGUgcG9vbCBhZnRlciBiZWluZyBkaXNwYXRjaGVkLiBVc2VycyB0aGF0XG4gKiBuZWVkIGEgcGVyc2lzdGVkIGV2ZW50IHNob3VsZCBpbnZva2UgYHBlcnNpc3RgLlxuICpcbiAqIFN5bnRoZXRpYyBldmVudHMgKGFuZCBzdWJjbGFzc2VzKSBpbXBsZW1lbnQgdGhlIERPTSBMZXZlbCAzIEV2ZW50cyBBUEkgYnlcbiAqIG5vcm1hbGl6aW5nIGJyb3dzZXIgcXVpcmtzLiBTdWJjbGFzc2VzIGRvIG5vdCBuZWNlc3NhcmlseSBoYXZlIHRvIGltcGxlbWVudCBhXG4gKiBET00gaW50ZXJmYWNlOyBjdXN0b20gYXBwbGljYXRpb24tc3BlY2lmaWMgZXZlbnRzIGNhbiBhbHNvIHN1YmNsYXNzIHRoaXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHsqfSB0YXJnZXRJbnN0IE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHBhcmFtIHtET01FdmVudFRhcmdldH0gbmF0aXZlRXZlbnRUYXJnZXQgVGFyZ2V0IG5vZGUuXG4gKi9cbmZ1bmN0aW9uIFN5bnRoZXRpY0V2ZW50KGRpc3BhdGNoQ29uZmlnLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAvLyB0aGVzZSBoYXZlIGEgZ2V0dGVyL3NldHRlciBmb3Igd2FybmluZ3NcbiAgICBkZWxldGUgdGhpcy5uYXRpdmVFdmVudDtcbiAgICBkZWxldGUgdGhpcy5wcmV2ZW50RGVmYXVsdDtcbiAgICBkZWxldGUgdGhpcy5zdG9wUHJvcGFnYXRpb247XG4gIH1cblxuICB0aGlzLmRpc3BhdGNoQ29uZmlnID0gZGlzcGF0Y2hDb25maWc7XG4gIHRoaXMuX3RhcmdldEluc3QgPSB0YXJnZXRJbnN0O1xuICB0aGlzLm5hdGl2ZUV2ZW50ID0gbmF0aXZlRXZlbnQ7XG5cbiAgdmFyIEludGVyZmFjZSA9IHRoaXMuY29uc3RydWN0b3IuSW50ZXJmYWNlO1xuICBmb3IgKHZhciBwcm9wTmFtZSBpbiBJbnRlcmZhY2UpIHtcbiAgICBpZiAoIUludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgZGVsZXRlIHRoaXNbcHJvcE5hbWVdOyAvLyB0aGlzIGhhcyBhIGdldHRlci9zZXR0ZXIgZm9yIHdhcm5pbmdzXG4gICAgfVxuICAgIHZhciBub3JtYWxpemUgPSBJbnRlcmZhY2VbcHJvcE5hbWVdO1xuICAgIGlmIChub3JtYWxpemUpIHtcbiAgICAgIHRoaXNbcHJvcE5hbWVdID0gbm9ybWFsaXplKG5hdGl2ZUV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByb3BOYW1lID09PSAndGFyZ2V0Jykge1xuICAgICAgICB0aGlzLnRhcmdldCA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1twcm9wTmFtZV0gPSBuYXRpdmVFdmVudFtwcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGRlZmF1bHRQcmV2ZW50ZWQgPSBuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkICE9IG51bGwgPyBuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkIDogbmF0aXZlRXZlbnQucmV0dXJuVmFsdWUgPT09IGZhbHNlO1xuICBpZiAoZGVmYXVsdFByZXZlbnRlZCkge1xuICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc1RydWU7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zRmFsc2U7XG4gIH1cbiAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNGYWxzZTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbl9hc3NpZ24oU3ludGhldGljRXZlbnQucHJvdG90eXBlLCB7XG5cbiAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgIHZhciBldmVudCA9IHRoaXMubmF0aXZlRXZlbnQ7XG4gICAgaWYgKCFldmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBldmVudC5yZXR1cm5WYWx1ZSAhPT0gJ3Vua25vd24nKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHZhbGlkLXR5cGVvZlxuICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zVHJ1ZTtcbiAgfSxcblxuICBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuICAgIGlmICghZXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBldmVudC5jYW5jZWxCdWJibGUgIT09ICd1bmtub3duJykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSB2YWxpZC10eXBlb2ZcbiAgICAgIC8vIFRoZSBDaGFuZ2VFdmVudFBsdWdpbiByZWdpc3RlcnMgYSBcInByb3BlcnR5Y2hhbmdlXCIgZXZlbnQgZm9yXG4gICAgICAvLyBJRS4gVGhpcyBldmVudCBkb2VzIG5vdCBzdXBwb3J0IGJ1YmJsaW5nIG9yIGNhbmNlbGxpbmcsIGFuZFxuICAgICAgLy8gYW55IHJlZmVyZW5jZXMgdG8gY2FuY2VsQnViYmxlIHRocm93IFwiTWVtYmVyIG5vdCBmb3VuZFwiLiAgQVxuICAgICAgLy8gdHlwZW9mIGNoZWNrIG9mIFwidW5rbm93blwiIGNpcmN1bXZlbnRzIHRoaXMgaXNzdWUgKGFuZCBpcyBhbHNvXG4gICAgICAvLyBJRSBzcGVjaWZpYykuXG4gICAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zVHJ1ZTtcbiAgfSxcblxuICAvKipcbiAgICogV2UgcmVsZWFzZSBhbGwgZGlzcGF0Y2hlZCBgU3ludGhldGljRXZlbnRgcyBhZnRlciBlYWNoIGV2ZW50IGxvb3AsIGFkZGluZ1xuICAgKiB0aGVtIGJhY2sgaW50byB0aGUgcG9vbC4gVGhpcyBhbGxvd3MgYSB3YXkgdG8gaG9sZCBvbnRvIGEgcmVmZXJlbmNlIHRoYXRcbiAgICogd29uJ3QgYmUgYWRkZWQgYmFjayBpbnRvIHRoZSBwb29sLlxuICAgKi9cbiAgcGVyc2lzdDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuaXNQZXJzaXN0ZW50ID0gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc1RydWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGlzIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBiYWNrIGludG8gdGhlIHBvb2wuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhpcyBzaG91bGQgbm90IGJlIHJlbGVhc2VkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBpc1BlcnNpc3RlbnQ6IGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNGYWxzZSxcblxuICAvKipcbiAgICogYFBvb2xlZENsYXNzYCBsb29rcyBmb3IgYGRlc3RydWN0b3JgIG9uIGVhY2ggaW5zdGFuY2UgaXQgcmVsZWFzZXMuXG4gICAqL1xuICBkZXN0cnVjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIEludGVyZmFjZSA9IHRoaXMuY29uc3RydWN0b3IuSW50ZXJmYWNlO1xuICAgIGZvciAodmFyIHByb3BOYW1lIGluIEludGVyZmFjZSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BOYW1lLCBnZXRQb29sZWRXYXJuaW5nUHJvcGVydHlEZWZpbml0aW9uKHByb3BOYW1lLCBJbnRlcmZhY2VbcHJvcE5hbWVdKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzW3Byb3BOYW1lXSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2hvdWxkQmVSZWxlYXNlZFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXNbc2hvdWxkQmVSZWxlYXNlZFByb3BlcnRpZXNbaV1dID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbmF0aXZlRXZlbnQnLCBnZXRQb29sZWRXYXJuaW5nUHJvcGVydHlEZWZpbml0aW9uKCduYXRpdmVFdmVudCcsIG51bGwpKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncHJldmVudERlZmF1bHQnLCBnZXRQb29sZWRXYXJuaW5nUHJvcGVydHlEZWZpbml0aW9uKCdwcmV2ZW50RGVmYXVsdCcsIGVtcHR5RnVuY3Rpb24pKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc3RvcFByb3BhZ2F0aW9uJywgZ2V0UG9vbGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbignc3RvcFByb3BhZ2F0aW9uJywgZW1wdHlGdW5jdGlvbikpO1xuICAgIH1cbiAgfVxuXG59KTtcblxuU3ludGhldGljRXZlbnQuSW50ZXJmYWNlID0gRXZlbnRJbnRlcmZhY2U7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIGlmIChpc1Byb3h5U3VwcG9ydGVkKSB7XG4gICAgLyplc2xpbnQtZGlzYWJsZSBuby1mdW5jLWFzc2lnbiAqL1xuICAgIFN5bnRoZXRpY0V2ZW50ID0gbmV3IFByb3h5KFN5bnRoZXRpY0V2ZW50LCB7XG4gICAgICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uICh0YXJnZXQsIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHkodGFyZ2V0LCBPYmplY3QuY3JlYXRlKHRhcmdldC5wcm90b3R5cGUpLCBhcmdzKTtcbiAgICAgIH0sXG4gICAgICBhcHBseTogZnVuY3Rpb24gKGNvbnN0cnVjdG9yLCB0aGF0LCBhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkoY29uc3RydWN0b3IuYXBwbHkodGhhdCwgYXJncyksIHtcbiAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh0YXJnZXQsIHByb3AsIHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAocHJvcCAhPT0gJ2lzUGVyc2lzdGVudCcgJiYgIXRhcmdldC5jb25zdHJ1Y3Rvci5JbnRlcmZhY2UuaGFzT3duUHJvcGVydHkocHJvcCkgJiYgc2hvdWxkQmVSZWxlYXNlZFByb3BlcnRpZXMuaW5kZXhPZihwcm9wKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZGlkV2FybkZvckFkZGVkTmV3UHJvcGVydHkgfHwgdGFyZ2V0LmlzUGVyc2lzdGVudCgpLCAnVGhpcyBzeW50aGV0aWMgZXZlbnQgaXMgcmV1c2VkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiBJZiB5b3VcXCdyZSAnICsgJ3NlZWluZyB0aGlzLCB5b3VcXCdyZSBhZGRpbmcgYSBuZXcgcHJvcGVydHkgaW4gdGhlIHN5bnRoZXRpYyBldmVudCBvYmplY3QuICcgKyAnVGhlIHByb3BlcnR5IGlzIG5ldmVyIHJlbGVhc2VkLiBTZWUgJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWV2ZW50LXBvb2xpbmcgZm9yIG1vcmUgaW5mb3JtYXRpb24uJykgOiB2b2lkIDA7XG4gICAgICAgICAgICAgIGRpZFdhcm5Gb3JBZGRlZE5ld1Byb3BlcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvKmVzbGludC1lbmFibGUgbm8tZnVuYy1hc3NpZ24gKi9cbiAgfVxufVxuLyoqXG4gKiBIZWxwZXIgdG8gcmVkdWNlIGJvaWxlcnBsYXRlIHdoZW4gY3JlYXRpbmcgc3ViY2xhc3Nlcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzc1xuICogQHBhcmFtIHs/b2JqZWN0fSBJbnRlcmZhY2VcbiAqL1xuU3ludGhldGljRXZlbnQuYXVnbWVudENsYXNzID0gZnVuY3Rpb24gKENsYXNzLCBJbnRlcmZhY2UpIHtcbiAgdmFyIFN1cGVyID0gdGhpcztcblxuICB2YXIgRSA9IGZ1bmN0aW9uICgpIHt9O1xuICBFLnByb3RvdHlwZSA9IFN1cGVyLnByb3RvdHlwZTtcbiAgdmFyIHByb3RvdHlwZSA9IG5ldyBFKCk7XG5cbiAgX2Fzc2lnbihwcm90b3R5cGUsIENsYXNzLnByb3RvdHlwZSk7XG4gIENsYXNzLnByb3RvdHlwZSA9IHByb3RvdHlwZTtcbiAgQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2xhc3M7XG5cbiAgQ2xhc3MuSW50ZXJmYWNlID0gX2Fzc2lnbih7fSwgU3VwZXIuSW50ZXJmYWNlLCBJbnRlcmZhY2UpO1xuICBDbGFzcy5hdWdtZW50Q2xhc3MgPSBTdXBlci5hdWdtZW50Q2xhc3M7XG5cbiAgUG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKENsYXNzLCBQb29sZWRDbGFzcy5mb3VyQXJndW1lbnRQb29sZXIpO1xufTtcblxuUG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKFN5bnRoZXRpY0V2ZW50LCBQb29sZWRDbGFzcy5mb3VyQXJndW1lbnRQb29sZXIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY0V2ZW50O1xuXG4vKipcbiAgKiBIZWxwZXIgdG8gbnVsbGlmeSBzeW50aGV0aWNFdmVudCBpbnN0YW5jZSBwcm9wZXJ0aWVzIHdoZW4gZGVzdHJ1Y3RpbmdcbiAgKlxuICAqIEBwYXJhbSB7b2JqZWN0fSBTeW50aGV0aWNFdmVudFxuICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wTmFtZVxuICAqIEByZXR1cm4ge29iamVjdH0gZGVmaW5lUHJvcGVydHkgb2JqZWN0XG4gICovXG5mdW5jdGlvbiBnZXRQb29sZWRXYXJuaW5nUHJvcGVydHlEZWZpbml0aW9uKHByb3BOYW1lLCBnZXRWYWwpIHtcbiAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2YgZ2V0VmFsID09PSAnZnVuY3Rpb24nO1xuICByZXR1cm4ge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBzZXQ6IHNldCxcbiAgICBnZXQ6IGdldFxuICB9O1xuXG4gIGZ1bmN0aW9uIHNldCh2YWwpIHtcbiAgICB2YXIgYWN0aW9uID0gaXNGdW5jdGlvbiA/ICdzZXR0aW5nIHRoZSBtZXRob2QnIDogJ3NldHRpbmcgdGhlIHByb3BlcnR5JztcbiAgICB3YXJuKGFjdGlvbiwgJ1RoaXMgaXMgZWZmZWN0aXZlbHkgYSBuby1vcCcpO1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICBmdW5jdGlvbiBnZXQoKSB7XG4gICAgdmFyIGFjdGlvbiA9IGlzRnVuY3Rpb24gPyAnYWNjZXNzaW5nIHRoZSBtZXRob2QnIDogJ2FjY2Vzc2luZyB0aGUgcHJvcGVydHknO1xuICAgIHZhciByZXN1bHQgPSBpc0Z1bmN0aW9uID8gJ1RoaXMgaXMgYSBuby1vcCBmdW5jdGlvbicgOiAnVGhpcyBpcyBzZXQgdG8gbnVsbCc7XG4gICAgd2FybihhY3Rpb24sIHJlc3VsdCk7XG4gICAgcmV0dXJuIGdldFZhbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdhcm4oYWN0aW9uLCByZXN1bHQpIHtcbiAgICB2YXIgd2FybmluZ0NvbmRpdGlvbiA9IGZhbHNlO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHdhcm5pbmdDb25kaXRpb24sICdUaGlzIHN5bnRoZXRpYyBldmVudCBpcyByZXVzZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIElmIHlvdVxcJ3JlIHNlZWluZyB0aGlzLCAnICsgJ3lvdVxcJ3JlICVzIGAlc2Agb24gYSByZWxlYXNlZC9udWxsaWZpZWQgc3ludGhldGljIGV2ZW50LiAlcy4gJyArICdJZiB5b3UgbXVzdCBrZWVwIHRoZSBvcmlnaW5hbCBzeW50aGV0aWMgZXZlbnQgYXJvdW5kLCB1c2UgZXZlbnQucGVyc2lzdCgpLiAnICsgJ1NlZSBodHRwczovL2ZiLm1lL3JlYWN0LWV2ZW50LXBvb2xpbmcgZm9yIG1vcmUgaW5mb3JtYXRpb24uJywgYWN0aW9uLCBwcm9wTmFtZSwgcmVzdWx0KSA6IHZvaWQgMDtcbiAgfVxufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0V2ZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAyMjZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 227 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar SyntheticEvent = __webpack_require__(226);\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105\n *      /#events-inputevents\n */\nvar InputEventInterface = {\n  data: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticInputEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n  return SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticEvent.augmentClass(SyntheticInputEvent, InputEventInterface);\n\nmodule.exports = SyntheticInputEvent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0lucHV0RXZlbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY0V2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNFdmVudCcpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAxMzExMDVcbiAqICAgICAgLyNldmVudHMtaW5wdXRldmVudHNcbiAqL1xudmFyIElucHV0RXZlbnRJbnRlcmZhY2UgPSB7XG4gIGRhdGE6IG51bGxcbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9XG4gKi9cbmZ1bmN0aW9uIFN5bnRoZXRpY0lucHV0RXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY0V2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljSW5wdXRFdmVudCwgSW5wdXRFdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljSW5wdXRFdmVudDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNJbnB1dEV2ZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAyMjdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 228 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar EventPluginHub = __webpack_require__(215);\nvar EventPropagators = __webpack_require__(214);\nvar ExecutionEnvironment = __webpack_require__(221);\nvar ReactDOMComponentTree = __webpack_require__(207);\nvar ReactUpdates = __webpack_require__(229);\nvar SyntheticEvent = __webpack_require__(226);\n\nvar getEventTarget = __webpack_require__(242);\nvar isEventSupported = __webpack_require__(243);\nvar isTextInputElement = __webpack_require__(244);\n\nvar eventTypes = {\n  change: {\n    phasedRegistrationNames: {\n      bubbled: 'onChange',\n      captured: 'onChangeCapture'\n    },\n    dependencies: ['topBlur', 'topChange', 'topClick', 'topFocus', 'topInput', 'topKeyDown', 'topKeyUp', 'topSelectionChange']\n  }\n};\n\n/**\n * For IE shims\n */\nvar activeElement = null;\nvar activeElementInst = null;\nvar activeElementValue = null;\nvar activeElementValueProp = null;\n\n/**\n * SECTION: handle `change` event\n */\nfunction shouldUseChangeEvent(elem) {\n  var nodeName = elem.nodeName && elem.nodeName.toLowerCase();\n  return nodeName === 'select' || nodeName === 'input' && elem.type === 'file';\n}\n\nvar doesChangeEventBubble = false;\nif (ExecutionEnvironment.canUseDOM) {\n  // See `handleChange` comment below\n  doesChangeEventBubble = isEventSupported('change') && (!document.documentMode || document.documentMode > 8);\n}\n\nfunction manualDispatchChangeEvent(nativeEvent) {\n  var event = SyntheticEvent.getPooled(eventTypes.change, activeElementInst, nativeEvent, getEventTarget(nativeEvent));\n  EventPropagators.accumulateTwoPhaseDispatches(event);\n\n  // If change and propertychange bubbled, we'd just bind to it like all the\n  // other events and have it go through ReactBrowserEventEmitter. Since it\n  // doesn't, we manually listen for the events and so we have to enqueue and\n  // process the abstract event manually.\n  //\n  // Batching is necessary here in order to ensure that all event handlers run\n  // before the next rerender (including event handlers attached to ancestor\n  // elements instead of directly on the input). Without this, controlled\n  // components don't work properly in conjunction with event bubbling because\n  // the component is rerendered and the value reverted before all the event\n  // handlers can run. See https://github.com/facebook/react/issues/708.\n  ReactUpdates.batchedUpdates(runEventInBatch, event);\n}\n\nfunction runEventInBatch(event) {\n  EventPluginHub.enqueueEvents(event);\n  EventPluginHub.processEventQueue(false);\n}\n\nfunction startWatchingForChangeEventIE8(target, targetInst) {\n  activeElement = target;\n  activeElementInst = targetInst;\n  activeElement.attachEvent('onchange', manualDispatchChangeEvent);\n}\n\nfunction stopWatchingForChangeEventIE8() {\n  if (!activeElement) {\n    return;\n  }\n  activeElement.detachEvent('onchange', manualDispatchChangeEvent);\n  activeElement = null;\n  activeElementInst = null;\n}\n\nfunction getTargetInstForChangeEvent(topLevelType, targetInst) {\n  if (topLevelType === 'topChange') {\n    return targetInst;\n  }\n}\nfunction handleEventsForChangeEventIE8(topLevelType, target, targetInst) {\n  if (topLevelType === 'topFocus') {\n    // stopWatching() should be a noop here but we call it just in case we\n    // missed a blur event somehow.\n    stopWatchingForChangeEventIE8();\n    startWatchingForChangeEventIE8(target, targetInst);\n  } else if (topLevelType === 'topBlur') {\n    stopWatchingForChangeEventIE8();\n  }\n}\n\n/**\n * SECTION: handle `input` event\n */\nvar isInputEventSupported = false;\nif (ExecutionEnvironment.canUseDOM) {\n  // IE9 claims to support the input event but fails to trigger it when\n  // deleting text, so we ignore its input events.\n  // IE10+ fire input events to often, such when a placeholder\n  // changes or when an input with a placeholder is focused.\n  isInputEventSupported = isEventSupported('input') && (!document.documentMode || document.documentMode > 11);\n}\n\n/**\n * (For IE <=11) Replacement getter/setter for the `value` property that gets\n * set on the active element.\n */\nvar newValueProp = {\n  get: function () {\n    return activeElementValueProp.get.call(this);\n  },\n  set: function (val) {\n    // Cast to a string so we can do equality checks.\n    activeElementValue = '' + val;\n    activeElementValueProp.set.call(this, val);\n  }\n};\n\n/**\n * (For IE <=11) Starts tracking propertychange events on the passed-in element\n * and override the value property so that we can distinguish user events from\n * value changes in JS.\n */\nfunction startWatchingForValueChange(target, targetInst) {\n  activeElement = target;\n  activeElementInst = targetInst;\n  activeElementValue = target.value;\n  activeElementValueProp = Object.getOwnPropertyDescriptor(target.constructor.prototype, 'value');\n\n  // Not guarded in a canDefineProperty check: IE8 supports defineProperty only\n  // on DOM elements\n  Object.defineProperty(activeElement, 'value', newValueProp);\n  if (activeElement.attachEvent) {\n    activeElement.attachEvent('onpropertychange', handlePropertyChange);\n  } else {\n    activeElement.addEventListener('propertychange', handlePropertyChange, false);\n  }\n}\n\n/**\n * (For IE <=11) Removes the event listeners from the currently-tracked element,\n * if any exists.\n */\nfunction stopWatchingForValueChange() {\n  if (!activeElement) {\n    return;\n  }\n\n  // delete restores the original property definition\n  delete activeElement.value;\n\n  if (activeElement.detachEvent) {\n    activeElement.detachEvent('onpropertychange', handlePropertyChange);\n  } else {\n    activeElement.removeEventListener('propertychange', handlePropertyChange, false);\n  }\n\n  activeElement = null;\n  activeElementInst = null;\n  activeElementValue = null;\n  activeElementValueProp = null;\n}\n\n/**\n * (For IE <=11) Handles a propertychange event, sending a `change` event if\n * the value of the active element has changed.\n */\nfunction handlePropertyChange(nativeEvent) {\n  if (nativeEvent.propertyName !== 'value') {\n    return;\n  }\n  var value = nativeEvent.srcElement.value;\n  if (value === activeElementValue) {\n    return;\n  }\n  activeElementValue = value;\n\n  manualDispatchChangeEvent(nativeEvent);\n}\n\n/**\n * If a `change` event should be fired, returns the target's ID.\n */\nfunction getTargetInstForInputEvent(topLevelType, targetInst) {\n  if (topLevelType === 'topInput') {\n    // In modern browsers (i.e., not IE8 or IE9), the input event is exactly\n    // what we want so fall through here and trigger an abstract event\n    return targetInst;\n  }\n}\n\nfunction handleEventsForInputEventIE(topLevelType, target, targetInst) {\n  if (topLevelType === 'topFocus') {\n    // In IE8, we can capture almost all .value changes by adding a\n    // propertychange handler and looking for events with propertyName\n    // equal to 'value'\n    // In IE9-11, propertychange fires for most input events but is buggy and\n    // doesn't fire when text is deleted, but conveniently, selectionchange\n    // appears to fire in all of the remaining cases so we catch those and\n    // forward the event if the value has changed\n    // In either case, we don't want to call the event handler if the value\n    // is changed from JS so we redefine a setter for `.value` that updates\n    // our activeElementValue variable, allowing us to ignore those changes\n    //\n    // stopWatching() should be a noop here but we call it just in case we\n    // missed a blur event somehow.\n    stopWatchingForValueChange();\n    startWatchingForValueChange(target, targetInst);\n  } else if (topLevelType === 'topBlur') {\n    stopWatchingForValueChange();\n  }\n}\n\n// For IE8 and IE9.\nfunction getTargetInstForInputEventIE(topLevelType, targetInst) {\n  if (topLevelType === 'topSelectionChange' || topLevelType === 'topKeyUp' || topLevelType === 'topKeyDown') {\n    // On the selectionchange event, the target is just document which isn't\n    // helpful for us so just check activeElement instead.\n    //\n    // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire\n    // propertychange on the first input event after setting `value` from a\n    // script and fires only keydown, keypress, keyup. Catching keyup usually\n    // gets it and catching keydown lets us fire an event for the first\n    // keystroke if user does a key repeat (it'll be a little delayed: right\n    // before the second keystroke). Other input methods (e.g., paste) seem to\n    // fire selectionchange normally.\n    if (activeElement && activeElement.value !== activeElementValue) {\n      activeElementValue = activeElement.value;\n      return activeElementInst;\n    }\n  }\n}\n\n/**\n * SECTION: handle `click` event\n */\nfunction shouldUseClickEvent(elem) {\n  // Use the `click` event to detect changes to checkbox and radio inputs.\n  // This approach works across all browsers, whereas `change` does not fire\n  // until `blur` in IE8.\n  return elem.nodeName && elem.nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio');\n}\n\nfunction getTargetInstForClickEvent(topLevelType, targetInst) {\n  if (topLevelType === 'topClick') {\n    return targetInst;\n  }\n}\n\n/**\n * This plugin creates an `onChange` event that normalizes change events\n * across form elements. This event fires at a time when it's possible to\n * change the element's value without seeing a flicker.\n *\n * Supported elements are:\n * - input (see `isTextInputElement`)\n * - textarea\n * - select\n */\nvar ChangeEventPlugin = {\n\n  eventTypes: eventTypes,\n\n  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n    var targetNode = targetInst ? ReactDOMComponentTree.getNodeFromInstance(targetInst) : window;\n\n    var getTargetInstFunc, handleEventFunc;\n    if (shouldUseChangeEvent(targetNode)) {\n      if (doesChangeEventBubble) {\n        getTargetInstFunc = getTargetInstForChangeEvent;\n      } else {\n        handleEventFunc = handleEventsForChangeEventIE8;\n      }\n    } else if (isTextInputElement(targetNode)) {\n      if (isInputEventSupported) {\n        getTargetInstFunc = getTargetInstForInputEvent;\n      } else {\n        getTargetInstFunc = getTargetInstForInputEventIE;\n        handleEventFunc = handleEventsForInputEventIE;\n      }\n    } else if (shouldUseClickEvent(targetNode)) {\n      getTargetInstFunc = getTargetInstForClickEvent;\n    }\n\n    if (getTargetInstFunc) {\n      var inst = getTargetInstFunc(topLevelType, targetInst);\n      if (inst) {\n        var event = SyntheticEvent.getPooled(eventTypes.change, inst, nativeEvent, nativeEventTarget);\n        event.type = 'change';\n        EventPropagators.accumulateTwoPhaseDispatches(event);\n        return event;\n      }\n    }\n\n    if (handleEventFunc) {\n      handleEventFunc(topLevelType, targetNode, targetInst);\n    }\n  }\n\n};\n\nmodule.exports = ChangeEventPlugin;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0NoYW5nZUV2ZW50UGx1Z2luLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFdmVudFBsdWdpbkh1YiA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5IdWInKTtcbnZhciBFdmVudFByb3BhZ2F0b3JzID0gcmVxdWlyZSgnLi9FdmVudFByb3BhZ2F0b3JzJyk7XG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RVcGRhdGVzID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZXMnKTtcbnZhciBTeW50aGV0aWNFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljRXZlbnQnKTtcblxudmFyIGdldEV2ZW50VGFyZ2V0ID0gcmVxdWlyZSgnLi9nZXRFdmVudFRhcmdldCcpO1xudmFyIGlzRXZlbnRTdXBwb3J0ZWQgPSByZXF1aXJlKCcuL2lzRXZlbnRTdXBwb3J0ZWQnKTtcbnZhciBpc1RleHRJbnB1dEVsZW1lbnQgPSByZXF1aXJlKCcuL2lzVGV4dElucHV0RWxlbWVudCcpO1xuXG52YXIgZXZlbnRUeXBlcyA9IHtcbiAgY2hhbmdlOiB7XG4gICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHtcbiAgICAgIGJ1YmJsZWQ6ICdvbkNoYW5nZScsXG4gICAgICBjYXB0dXJlZDogJ29uQ2hhbmdlQ2FwdHVyZSdcbiAgICB9LFxuICAgIGRlcGVuZGVuY2llczogWyd0b3BCbHVyJywgJ3RvcENoYW5nZScsICd0b3BDbGljaycsICd0b3BGb2N1cycsICd0b3BJbnB1dCcsICd0b3BLZXlEb3duJywgJ3RvcEtleVVwJywgJ3RvcFNlbGVjdGlvbkNoYW5nZSddXG4gIH1cbn07XG5cbi8qKlxuICogRm9yIElFIHNoaW1zXG4gKi9cbnZhciBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG52YXIgYWN0aXZlRWxlbWVudFZhbHVlID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50VmFsdWVQcm9wID0gbnVsbDtcblxuLyoqXG4gKiBTRUNUSU9OOiBoYW5kbGUgYGNoYW5nZWAgZXZlbnRcbiAqL1xuZnVuY3Rpb24gc2hvdWxkVXNlQ2hhbmdlRXZlbnQoZWxlbSkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG5vZGVOYW1lID09PSAnc2VsZWN0JyB8fCBub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiBlbGVtLnR5cGUgPT09ICdmaWxlJztcbn1cblxudmFyIGRvZXNDaGFuZ2VFdmVudEJ1YmJsZSA9IGZhbHNlO1xuaWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkge1xuICAvLyBTZWUgYGhhbmRsZUNoYW5nZWAgY29tbWVudCBiZWxvd1xuICBkb2VzQ2hhbmdlRXZlbnRCdWJibGUgPSBpc0V2ZW50U3VwcG9ydGVkKCdjaGFuZ2UnKSAmJiAoIWRvY3VtZW50LmRvY3VtZW50TW9kZSB8fCBkb2N1bWVudC5kb2N1bWVudE1vZGUgPiA4KTtcbn1cblxuZnVuY3Rpb24gbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudChuYXRpdmVFdmVudCkge1xuICB2YXIgZXZlbnQgPSBTeW50aGV0aWNFdmVudC5nZXRQb29sZWQoZXZlbnRUeXBlcy5jaGFuZ2UsIGFjdGl2ZUVsZW1lbnRJbnN0LCBuYXRpdmVFdmVudCwgZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpKTtcbiAgRXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50KTtcblxuICAvLyBJZiBjaGFuZ2UgYW5kIHByb3BlcnR5Y2hhbmdlIGJ1YmJsZWQsIHdlJ2QganVzdCBiaW5kIHRvIGl0IGxpa2UgYWxsIHRoZVxuICAvLyBvdGhlciBldmVudHMgYW5kIGhhdmUgaXQgZ28gdGhyb3VnaCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuIFNpbmNlIGl0XG4gIC8vIGRvZXNuJ3QsIHdlIG1hbnVhbGx5IGxpc3RlbiBmb3IgdGhlIGV2ZW50cyBhbmQgc28gd2UgaGF2ZSB0byBlbnF1ZXVlIGFuZFxuICAvLyBwcm9jZXNzIHRoZSBhYnN0cmFjdCBldmVudCBtYW51YWxseS5cbiAgLy9cbiAgLy8gQmF0Y2hpbmcgaXMgbmVjZXNzYXJ5IGhlcmUgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgYWxsIGV2ZW50IGhhbmRsZXJzIHJ1blxuICAvLyBiZWZvcmUgdGhlIG5leHQgcmVyZW5kZXIgKGluY2x1ZGluZyBldmVudCBoYW5kbGVycyBhdHRhY2hlZCB0byBhbmNlc3RvclxuICAvLyBlbGVtZW50cyBpbnN0ZWFkIG9mIGRpcmVjdGx5IG9uIHRoZSBpbnB1dCkuIFdpdGhvdXQgdGhpcywgY29udHJvbGxlZFxuICAvLyBjb21wb25lbnRzIGRvbid0IHdvcmsgcHJvcGVybHkgaW4gY29uanVuY3Rpb24gd2l0aCBldmVudCBidWJibGluZyBiZWNhdXNlXG4gIC8vIHRoZSBjb21wb25lbnQgaXMgcmVyZW5kZXJlZCBhbmQgdGhlIHZhbHVlIHJldmVydGVkIGJlZm9yZSBhbGwgdGhlIGV2ZW50XG4gIC8vIGhhbmRsZXJzIGNhbiBydW4uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcwOC5cbiAgUmVhY3RVcGRhdGVzLmJhdGNoZWRVcGRhdGVzKHJ1bkV2ZW50SW5CYXRjaCwgZXZlbnQpO1xufVxuXG5mdW5jdGlvbiBydW5FdmVudEluQmF0Y2goZXZlbnQpIHtcbiAgRXZlbnRQbHVnaW5IdWIuZW5xdWV1ZUV2ZW50cyhldmVudCk7XG4gIEV2ZW50UGx1Z2luSHViLnByb2Nlc3NFdmVudFF1ZXVlKGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRXYXRjaGluZ0ZvckNoYW5nZUV2ZW50SUU4KHRhcmdldCwgdGFyZ2V0SW5zdCkge1xuICBhY3RpdmVFbGVtZW50ID0gdGFyZ2V0O1xuICBhY3RpdmVFbGVtZW50SW5zdCA9IHRhcmdldEluc3Q7XG4gIGFjdGl2ZUVsZW1lbnQuYXR0YWNoRXZlbnQoJ29uY2hhbmdlJywgbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudCk7XG59XG5cbmZ1bmN0aW9uIHN0b3BXYXRjaGluZ0ZvckNoYW5nZUV2ZW50SUU4KCkge1xuICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYWN0aXZlRWxlbWVudC5kZXRhY2hFdmVudCgnb25jaGFuZ2UnLCBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KTtcbiAgYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNoYW5nZUV2ZW50KHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wQ2hhbmdlJykge1xuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG5mdW5jdGlvbiBoYW5kbGVFdmVudHNGb3JDaGFuZ2VFdmVudElFOCh0b3BMZXZlbFR5cGUsIHRhcmdldCwgdGFyZ2V0SW5zdCkge1xuICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wRm9jdXMnKSB7XG4gICAgLy8gc3RvcFdhdGNoaW5nKCkgc2hvdWxkIGJlIGEgbm9vcCBoZXJlIGJ1dCB3ZSBjYWxsIGl0IGp1c3QgaW4gY2FzZSB3ZVxuICAgIC8vIG1pc3NlZCBhIGJsdXIgZXZlbnQgc29tZWhvdy5cbiAgICBzdG9wV2F0Y2hpbmdGb3JDaGFuZ2VFdmVudElFOCgpO1xuICAgIHN0YXJ0V2F0Y2hpbmdGb3JDaGFuZ2VFdmVudElFOCh0YXJnZXQsIHRhcmdldEluc3QpO1xuICB9IGVsc2UgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcEJsdXInKSB7XG4gICAgc3RvcFdhdGNoaW5nRm9yQ2hhbmdlRXZlbnRJRTgoKTtcbiAgfVxufVxuXG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgaW5wdXRgIGV2ZW50XG4gKi9cbnZhciBpc0lucHV0RXZlbnRTdXBwb3J0ZWQgPSBmYWxzZTtcbmlmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00pIHtcbiAgLy8gSUU5IGNsYWltcyB0byBzdXBwb3J0IHRoZSBpbnB1dCBldmVudCBidXQgZmFpbHMgdG8gdHJpZ2dlciBpdCB3aGVuXG4gIC8vIGRlbGV0aW5nIHRleHQsIHNvIHdlIGlnbm9yZSBpdHMgaW5wdXQgZXZlbnRzLlxuICAvLyBJRTEwKyBmaXJlIGlucHV0IGV2ZW50cyB0byBvZnRlbiwgc3VjaCB3aGVuIGEgcGxhY2Vob2xkZXJcbiAgLy8gY2hhbmdlcyBvciB3aGVuIGFuIGlucHV0IHdpdGggYSBwbGFjZWhvbGRlciBpcyBmb2N1c2VkLlxuICBpc0lucHV0RXZlbnRTdXBwb3J0ZWQgPSBpc0V2ZW50U3VwcG9ydGVkKCdpbnB1dCcpICYmICghZG9jdW1lbnQuZG9jdW1lbnRNb2RlIHx8IGRvY3VtZW50LmRvY3VtZW50TW9kZSA+IDExKTtcbn1cblxuLyoqXG4gKiAoRm9yIElFIDw9MTEpIFJlcGxhY2VtZW50IGdldHRlci9zZXR0ZXIgZm9yIHRoZSBgdmFsdWVgIHByb3BlcnR5IHRoYXQgZ2V0c1xuICogc2V0IG9uIHRoZSBhY3RpdmUgZWxlbWVudC5cbiAqL1xudmFyIG5ld1ZhbHVlUHJvcCA9IHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnRWYWx1ZVByb3AuZ2V0LmNhbGwodGhpcyk7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgIC8vIENhc3QgdG8gYSBzdHJpbmcgc28gd2UgY2FuIGRvIGVxdWFsaXR5IGNoZWNrcy5cbiAgICBhY3RpdmVFbGVtZW50VmFsdWUgPSAnJyArIHZhbDtcbiAgICBhY3RpdmVFbGVtZW50VmFsdWVQcm9wLnNldC5jYWxsKHRoaXMsIHZhbCk7XG4gIH1cbn07XG5cbi8qKlxuICogKEZvciBJRSA8PTExKSBTdGFydHMgdHJhY2tpbmcgcHJvcGVydHljaGFuZ2UgZXZlbnRzIG9uIHRoZSBwYXNzZWQtaW4gZWxlbWVudFxuICogYW5kIG92ZXJyaWRlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBzbyB0aGF0IHdlIGNhbiBkaXN0aW5ndWlzaCB1c2VyIGV2ZW50cyBmcm9tXG4gKiB2YWx1ZSBjaGFuZ2VzIGluIEpTLlxuICovXG5mdW5jdGlvbiBzdGFydFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KSB7XG4gIGFjdGl2ZUVsZW1lbnQgPSB0YXJnZXQ7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgYWN0aXZlRWxlbWVudFZhbHVlID0gdGFyZ2V0LnZhbHVlO1xuICBhY3RpdmVFbGVtZW50VmFsdWVQcm9wID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQuY29uc3RydWN0b3IucHJvdG90eXBlLCAndmFsdWUnKTtcblxuICAvLyBOb3QgZ3VhcmRlZCBpbiBhIGNhbkRlZmluZVByb3BlcnR5IGNoZWNrOiBJRTggc3VwcG9ydHMgZGVmaW5lUHJvcGVydHkgb25seVxuICAvLyBvbiBET00gZWxlbWVudHNcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFjdGl2ZUVsZW1lbnQsICd2YWx1ZScsIG5ld1ZhbHVlUHJvcCk7XG4gIGlmIChhY3RpdmVFbGVtZW50LmF0dGFjaEV2ZW50KSB7XG4gICAgYWN0aXZlRWxlbWVudC5hdHRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTtcbiAgfSBlbHNlIHtcbiAgICBhY3RpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Byb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UsIGZhbHNlKTtcbiAgfVxufVxuXG4vKipcbiAqIChGb3IgSUUgPD0xMSkgUmVtb3ZlcyB0aGUgZXZlbnQgbGlzdGVuZXJzIGZyb20gdGhlIGN1cnJlbnRseS10cmFja2VkIGVsZW1lbnQsXG4gKiBpZiBhbnkgZXhpc3RzLlxuICovXG5mdW5jdGlvbiBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpIHtcbiAgaWYgKCFhY3RpdmVFbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gZGVsZXRlIHJlc3RvcmVzIHRoZSBvcmlnaW5hbCBwcm9wZXJ0eSBkZWZpbml0aW9uXG4gIGRlbGV0ZSBhY3RpdmVFbGVtZW50LnZhbHVlO1xuXG4gIGlmIChhY3RpdmVFbGVtZW50LmRldGFjaEV2ZW50KSB7XG4gICAgYWN0aXZlRWxlbWVudC5kZXRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTtcbiAgfSBlbHNlIHtcbiAgICBhY3RpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Byb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UsIGZhbHNlKTtcbiAgfVxuXG4gIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xuICBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG4gIGFjdGl2ZUVsZW1lbnRWYWx1ZSA9IG51bGw7XG4gIGFjdGl2ZUVsZW1lbnRWYWx1ZVByb3AgPSBudWxsO1xufVxuXG4vKipcbiAqIChGb3IgSUUgPD0xMSkgSGFuZGxlcyBhIHByb3BlcnR5Y2hhbmdlIGV2ZW50LCBzZW5kaW5nIGEgYGNoYW5nZWAgZXZlbnQgaWZcbiAqIHRoZSB2YWx1ZSBvZiB0aGUgYWN0aXZlIGVsZW1lbnQgaGFzIGNoYW5nZWQuXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZVByb3BlcnR5Q2hhbmdlKG5hdGl2ZUV2ZW50KSB7XG4gIGlmIChuYXRpdmVFdmVudC5wcm9wZXJ0eU5hbWUgIT09ICd2YWx1ZScpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHZhbHVlID0gbmF0aXZlRXZlbnQuc3JjRWxlbWVudC52YWx1ZTtcbiAgaWYgKHZhbHVlID09PSBhY3RpdmVFbGVtZW50VmFsdWUpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYWN0aXZlRWxlbWVudFZhbHVlID0gdmFsdWU7XG5cbiAgbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudChuYXRpdmVFdmVudCk7XG59XG5cbi8qKlxuICogSWYgYSBgY2hhbmdlYCBldmVudCBzaG91bGQgYmUgZmlyZWQsIHJldHVybnMgdGhlIHRhcmdldCdzIElELlxuICovXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudCh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QpIHtcbiAgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcElucHV0Jykge1xuICAgIC8vIEluIG1vZGVybiBicm93c2VycyAoaS5lLiwgbm90IElFOCBvciBJRTkpLCB0aGUgaW5wdXQgZXZlbnQgaXMgZXhhY3RseVxuICAgIC8vIHdoYXQgd2Ugd2FudCBzbyBmYWxsIHRocm91Z2ggaGVyZSBhbmQgdHJpZ2dlciBhbiBhYnN0cmFjdCBldmVudFxuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRJRSh0b3BMZXZlbFR5cGUsIHRhcmdldCwgdGFyZ2V0SW5zdCkge1xuICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wRm9jdXMnKSB7XG4gICAgLy8gSW4gSUU4LCB3ZSBjYW4gY2FwdHVyZSBhbG1vc3QgYWxsIC52YWx1ZSBjaGFuZ2VzIGJ5IGFkZGluZyBhXG4gICAgLy8gcHJvcGVydHljaGFuZ2UgaGFuZGxlciBhbmQgbG9va2luZyBmb3IgZXZlbnRzIHdpdGggcHJvcGVydHlOYW1lXG4gICAgLy8gZXF1YWwgdG8gJ3ZhbHVlJ1xuICAgIC8vIEluIElFOS0xMSwgcHJvcGVydHljaGFuZ2UgZmlyZXMgZm9yIG1vc3QgaW5wdXQgZXZlbnRzIGJ1dCBpcyBidWdneSBhbmRcbiAgICAvLyBkb2Vzbid0IGZpcmUgd2hlbiB0ZXh0IGlzIGRlbGV0ZWQsIGJ1dCBjb252ZW5pZW50bHksIHNlbGVjdGlvbmNoYW5nZVxuICAgIC8vIGFwcGVhcnMgdG8gZmlyZSBpbiBhbGwgb2YgdGhlIHJlbWFpbmluZyBjYXNlcyBzbyB3ZSBjYXRjaCB0aG9zZSBhbmRcbiAgICAvLyBmb3J3YXJkIHRoZSBldmVudCBpZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWRcbiAgICAvLyBJbiBlaXRoZXIgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byBjYWxsIHRoZSBldmVudCBoYW5kbGVyIGlmIHRoZSB2YWx1ZVxuICAgIC8vIGlzIGNoYW5nZWQgZnJvbSBKUyBzbyB3ZSByZWRlZmluZSBhIHNldHRlciBmb3IgYC52YWx1ZWAgdGhhdCB1cGRhdGVzXG4gICAgLy8gb3VyIGFjdGl2ZUVsZW1lbnRWYWx1ZSB2YXJpYWJsZSwgYWxsb3dpbmcgdXMgdG8gaWdub3JlIHRob3NlIGNoYW5nZXNcbiAgICAvL1xuICAgIC8vIHN0b3BXYXRjaGluZygpIHNob3VsZCBiZSBhIG5vb3AgaGVyZSBidXQgd2UgY2FsbCBpdCBqdXN0IGluIGNhc2Ugd2VcbiAgICAvLyBtaXNzZWQgYSBibHVyIGV2ZW50IHNvbWVob3cuXG4gICAgc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKTtcbiAgICBzdGFydFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KTtcbiAgfSBlbHNlIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BCbHVyJykge1xuICAgIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCk7XG4gIH1cbn1cblxuLy8gRm9yIElFOCBhbmQgSUU5LlxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnRJRSh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QpIHtcbiAgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcFNlbGVjdGlvbkNoYW5nZScgfHwgdG9wTGV2ZWxUeXBlID09PSAndG9wS2V5VXAnIHx8IHRvcExldmVsVHlwZSA9PT0gJ3RvcEtleURvd24nKSB7XG4gICAgLy8gT24gdGhlIHNlbGVjdGlvbmNoYW5nZSBldmVudCwgdGhlIHRhcmdldCBpcyBqdXN0IGRvY3VtZW50IHdoaWNoIGlzbid0XG4gICAgLy8gaGVscGZ1bCBmb3IgdXMgc28ganVzdCBjaGVjayBhY3RpdmVFbGVtZW50IGluc3RlYWQuXG4gICAgLy9cbiAgICAvLyA5OSUgb2YgdGhlIHRpbWUsIGtleWRvd24gYW5kIGtleXVwIGFyZW4ndCBuZWNlc3NhcnkuIElFOCBmYWlscyB0byBmaXJlXG4gICAgLy8gcHJvcGVydHljaGFuZ2Ugb24gdGhlIGZpcnN0IGlucHV0IGV2ZW50IGFmdGVyIHNldHRpbmcgYHZhbHVlYCBmcm9tIGFcbiAgICAvLyBzY3JpcHQgYW5kIGZpcmVzIG9ubHkga2V5ZG93biwga2V5cHJlc3MsIGtleXVwLiBDYXRjaGluZyBrZXl1cCB1c3VhbGx5XG4gICAgLy8gZ2V0cyBpdCBhbmQgY2F0Y2hpbmcga2V5ZG93biBsZXRzIHVzIGZpcmUgYW4gZXZlbnQgZm9yIHRoZSBmaXJzdFxuICAgIC8vIGtleXN0cm9rZSBpZiB1c2VyIGRvZXMgYSBrZXkgcmVwZWF0IChpdCdsbCBiZSBhIGxpdHRsZSBkZWxheWVkOiByaWdodFxuICAgIC8vIGJlZm9yZSB0aGUgc2Vjb25kIGtleXN0cm9rZSkuIE90aGVyIGlucHV0IG1ldGhvZHMgKGUuZy4sIHBhc3RlKSBzZWVtIHRvXG4gICAgLy8gZmlyZSBzZWxlY3Rpb25jaGFuZ2Ugbm9ybWFsbHkuXG4gICAgaWYgKGFjdGl2ZUVsZW1lbnQgJiYgYWN0aXZlRWxlbWVudC52YWx1ZSAhPT0gYWN0aXZlRWxlbWVudFZhbHVlKSB7XG4gICAgICBhY3RpdmVFbGVtZW50VmFsdWUgPSBhY3RpdmVFbGVtZW50LnZhbHVlO1xuICAgICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnRJbnN0O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgY2xpY2tgIGV2ZW50XG4gKi9cbmZ1bmN0aW9uIHNob3VsZFVzZUNsaWNrRXZlbnQoZWxlbSkge1xuICAvLyBVc2UgdGhlIGBjbGlja2AgZXZlbnQgdG8gZGV0ZWN0IGNoYW5nZXMgdG8gY2hlY2tib3ggYW5kIHJhZGlvIGlucHV0cy5cbiAgLy8gVGhpcyBhcHByb2FjaCB3b3JrcyBhY3Jvc3MgYWxsIGJyb3dzZXJzLCB3aGVyZWFzIGBjaGFuZ2VgIGRvZXMgbm90IGZpcmVcbiAgLy8gdW50aWwgYGJsdXJgIGluIElFOC5cbiAgcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmIChlbGVtLnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbS50eXBlID09PSAncmFkaW8nKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0KSB7XG4gIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BDbGljaycpIHtcbiAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgcGx1Z2luIGNyZWF0ZXMgYW4gYG9uQ2hhbmdlYCBldmVudCB0aGF0IG5vcm1hbGl6ZXMgY2hhbmdlIGV2ZW50c1xuICogYWNyb3NzIGZvcm0gZWxlbWVudHMuIFRoaXMgZXZlbnQgZmlyZXMgYXQgYSB0aW1lIHdoZW4gaXQncyBwb3NzaWJsZSB0b1xuICogY2hhbmdlIHRoZSBlbGVtZW50J3MgdmFsdWUgd2l0aG91dCBzZWVpbmcgYSBmbGlja2VyLlxuICpcbiAqIFN1cHBvcnRlZCBlbGVtZW50cyBhcmU6XG4gKiAtIGlucHV0IChzZWUgYGlzVGV4dElucHV0RWxlbWVudGApXG4gKiAtIHRleHRhcmVhXG4gKiAtIHNlbGVjdFxuICovXG52YXIgQ2hhbmdlRXZlbnRQbHVnaW4gPSB7XG5cbiAgZXZlbnRUeXBlczogZXZlbnRUeXBlcyxcblxuICBleHRyYWN0RXZlbnRzOiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICB2YXIgdGFyZ2V0Tm9kZSA9IHRhcmdldEluc3QgPyBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KSA6IHdpbmRvdztcblxuICAgIHZhciBnZXRUYXJnZXRJbnN0RnVuYywgaGFuZGxlRXZlbnRGdW5jO1xuICAgIGlmIChzaG91bGRVc2VDaGFuZ2VFdmVudCh0YXJnZXROb2RlKSkge1xuICAgICAgaWYgKGRvZXNDaGFuZ2VFdmVudEJ1YmJsZSkge1xuICAgICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhhbmRsZUV2ZW50RnVuYyA9IGhhbmRsZUV2ZW50c0ZvckNoYW5nZUV2ZW50SUU4O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNUZXh0SW5wdXRFbGVtZW50KHRhcmdldE5vZGUpKSB7XG4gICAgICBpZiAoaXNJbnB1dEV2ZW50U3VwcG9ydGVkKSB7XG4gICAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50SUU7XG4gICAgICAgIGhhbmRsZUV2ZW50RnVuYyA9IGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRJRTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNob3VsZFVzZUNsaWNrRXZlbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQ7XG4gICAgfVxuXG4gICAgaWYgKGdldFRhcmdldEluc3RGdW5jKSB7XG4gICAgICB2YXIgaW5zdCA9IGdldFRhcmdldEluc3RGdW5jKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCk7XG4gICAgICBpZiAoaW5zdCkge1xuICAgICAgICB2YXIgZXZlbnQgPSBTeW50aGV0aWNFdmVudC5nZXRQb29sZWQoZXZlbnRUeXBlcy5jaGFuZ2UsIGluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICAgIGV2ZW50LnR5cGUgPSAnY2hhbmdlJztcbiAgICAgICAgRXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChoYW5kbGVFdmVudEZ1bmMpIHtcbiAgICAgIGhhbmRsZUV2ZW50RnVuYyh0b3BMZXZlbFR5cGUsIHRhcmdldE5vZGUsIHRhcmdldEluc3QpO1xuICAgIH1cbiAgfVxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENoYW5nZUV2ZW50UGx1Z2luO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL0NoYW5nZUV2ZW50UGx1Z2luLmpzXG4vLyBtb2R1bGUgaWQgPSAyMjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 229 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208),\n    _assign = __webpack_require__(176);\n\nvar CallbackQueue = __webpack_require__(230);\nvar PooledClass = __webpack_require__(223);\nvar ReactFeatureFlags = __webpack_require__(231);\nvar ReactReconciler = __webpack_require__(232);\nvar Transaction = __webpack_require__(241);\n\nvar invariant = __webpack_require__(180);\n\nvar dirtyComponents = [];\nvar updateBatchNumber = 0;\nvar asapCallbackQueue = CallbackQueue.getPooled();\nvar asapEnqueued = false;\n\nvar batchingStrategy = null;\n\nfunction ensureInjected() {\n  !(ReactUpdates.ReactReconcileTransaction && batchingStrategy) ?  true ? invariant(false, 'ReactUpdates: must inject a reconcile transaction class and batching strategy') : _prodInvariant('123') : void 0;\n}\n\nvar NESTED_UPDATES = {\n  initialize: function () {\n    this.dirtyComponentsLength = dirtyComponents.length;\n  },\n  close: function () {\n    if (this.dirtyComponentsLength !== dirtyComponents.length) {\n      // Additional updates were enqueued by componentDidUpdate handlers or\n      // similar; before our own UPDATE_QUEUEING wrapper closes, we want to run\n      // these new updates so that if A's componentDidUpdate calls setState on\n      // B, B will update before the callback A's updater provided when calling\n      // setState.\n      dirtyComponents.splice(0, this.dirtyComponentsLength);\n      flushBatchedUpdates();\n    } else {\n      dirtyComponents.length = 0;\n    }\n  }\n};\n\nvar UPDATE_QUEUEING = {\n  initialize: function () {\n    this.callbackQueue.reset();\n  },\n  close: function () {\n    this.callbackQueue.notifyAll();\n  }\n};\n\nvar TRANSACTION_WRAPPERS = [NESTED_UPDATES, UPDATE_QUEUEING];\n\nfunction ReactUpdatesFlushTransaction() {\n  this.reinitializeTransaction();\n  this.dirtyComponentsLength = null;\n  this.callbackQueue = CallbackQueue.getPooled();\n  this.reconcileTransaction = ReactUpdates.ReactReconcileTransaction.getPooled(\n  /* useCreateElement */true);\n}\n\n_assign(ReactUpdatesFlushTransaction.prototype, Transaction, {\n  getTransactionWrappers: function () {\n    return TRANSACTION_WRAPPERS;\n  },\n\n  destructor: function () {\n    this.dirtyComponentsLength = null;\n    CallbackQueue.release(this.callbackQueue);\n    this.callbackQueue = null;\n    ReactUpdates.ReactReconcileTransaction.release(this.reconcileTransaction);\n    this.reconcileTransaction = null;\n  },\n\n  perform: function (method, scope, a) {\n    // Essentially calls `this.reconcileTransaction.perform(method, scope, a)`\n    // with this transaction's wrappers around it.\n    return Transaction.perform.call(this, this.reconcileTransaction.perform, this.reconcileTransaction, method, scope, a);\n  }\n});\n\nPooledClass.addPoolingTo(ReactUpdatesFlushTransaction);\n\nfunction batchedUpdates(callback, a, b, c, d, e) {\n  ensureInjected();\n  return batchingStrategy.batchedUpdates(callback, a, b, c, d, e);\n}\n\n/**\n * Array comparator for ReactComponents by mount ordering.\n *\n * @param {ReactComponent} c1 first component you're comparing\n * @param {ReactComponent} c2 second component you're comparing\n * @return {number} Return value usable by Array.prototype.sort().\n */\nfunction mountOrderComparator(c1, c2) {\n  return c1._mountOrder - c2._mountOrder;\n}\n\nfunction runBatchedUpdates(transaction) {\n  var len = transaction.dirtyComponentsLength;\n  !(len === dirtyComponents.length) ?  true ? invariant(false, 'Expected flush transaction\\'s stored dirty-components length (%s) to match dirty-components array length (%s).', len, dirtyComponents.length) : _prodInvariant('124', len, dirtyComponents.length) : void 0;\n\n  // Since reconciling a component higher in the owner hierarchy usually (not\n  // always -- see shouldComponentUpdate()) will reconcile children, reconcile\n  // them before their children by sorting the array.\n  dirtyComponents.sort(mountOrderComparator);\n\n  // Any updates enqueued while reconciling must be performed after this entire\n  // batch. Otherwise, if dirtyComponents is [A, B] where A has children B and\n  // C, B could update twice in a single batch if C's render enqueues an update\n  // to B (since B would have already updated, we should skip it, and the only\n  // way we can know to do so is by checking the batch counter).\n  updateBatchNumber++;\n\n  for (var i = 0; i < len; i++) {\n    // If a component is unmounted before pending changes apply, it will still\n    // be here, but we assume that it has cleared its _pendingCallbacks and\n    // that performUpdateIfNecessary is a noop.\n    var component = dirtyComponents[i];\n\n    // If performUpdateIfNecessary happens to enqueue any new updates, we\n    // shouldn't execute the callbacks until the next render happens, so\n    // stash the callbacks first\n    var callbacks = component._pendingCallbacks;\n    component._pendingCallbacks = null;\n\n    var markerName;\n    if (ReactFeatureFlags.logTopLevelRenders) {\n      var namedComponent = component;\n      // Duck type TopLevelWrapper. This is probably always true.\n      if (component._currentElement.type.isReactTopLevelWrapper) {\n        namedComponent = component._renderedComponent;\n      }\n      markerName = 'React update: ' + namedComponent.getName();\n      console.time(markerName);\n    }\n\n    ReactReconciler.performUpdateIfNecessary(component, transaction.reconcileTransaction, updateBatchNumber);\n\n    if (markerName) {\n      console.timeEnd(markerName);\n    }\n\n    if (callbacks) {\n      for (var j = 0; j < callbacks.length; j++) {\n        transaction.callbackQueue.enqueue(callbacks[j], component.getPublicInstance());\n      }\n    }\n  }\n}\n\nvar flushBatchedUpdates = function () {\n  // ReactUpdatesFlushTransaction's wrappers will clear the dirtyComponents\n  // array and perform any updates enqueued by mount-ready handlers (i.e.,\n  // componentDidUpdate) but we need to check here too in order to catch\n  // updates enqueued by setState callbacks and asap calls.\n  while (dirtyComponents.length || asapEnqueued) {\n    if (dirtyComponents.length) {\n      var transaction = ReactUpdatesFlushTransaction.getPooled();\n      transaction.perform(runBatchedUpdates, null, transaction);\n      ReactUpdatesFlushTransaction.release(transaction);\n    }\n\n    if (asapEnqueued) {\n      asapEnqueued = false;\n      var queue = asapCallbackQueue;\n      asapCallbackQueue = CallbackQueue.getPooled();\n      queue.notifyAll();\n      CallbackQueue.release(queue);\n    }\n  }\n};\n\n/**\n * Mark a component as needing a rerender, adding an optional callback to a\n * list of functions which will be executed once the rerender occurs.\n */\nfunction enqueueUpdate(component) {\n  ensureInjected();\n\n  // Various parts of our code (such as ReactCompositeComponent's\n  // _renderValidatedComponent) assume that calls to render aren't nested;\n  // verify that that's the case. (This is called by each top-level update\n  // function, like setState, forceUpdate, etc.; creation and\n  // destruction of top-level components is guarded in ReactMount.)\n\n  if (!batchingStrategy.isBatchingUpdates) {\n    batchingStrategy.batchedUpdates(enqueueUpdate, component);\n    return;\n  }\n\n  dirtyComponents.push(component);\n  if (component._updateBatchNumber == null) {\n    component._updateBatchNumber = updateBatchNumber + 1;\n  }\n}\n\n/**\n * Enqueue a callback to be run at the end of the current batching cycle. Throws\n * if no updates are currently being performed.\n */\nfunction asap(callback, context) {\n  !batchingStrategy.isBatchingUpdates ?  true ? invariant(false, 'ReactUpdates.asap: Can\\'t enqueue an asap callback in a context whereupdates are not being batched.') : _prodInvariant('125') : void 0;\n  asapCallbackQueue.enqueue(callback, context);\n  asapEnqueued = true;\n}\n\nvar ReactUpdatesInjection = {\n  injectReconcileTransaction: function (ReconcileTransaction) {\n    !ReconcileTransaction ?  true ? invariant(false, 'ReactUpdates: must provide a reconcile transaction class') : _prodInvariant('126') : void 0;\n    ReactUpdates.ReactReconcileTransaction = ReconcileTransaction;\n  },\n\n  injectBatchingStrategy: function (_batchingStrategy) {\n    !_batchingStrategy ?  true ? invariant(false, 'ReactUpdates: must provide a batching strategy') : _prodInvariant('127') : void 0;\n    !(typeof _batchingStrategy.batchedUpdates === 'function') ?  true ? invariant(false, 'ReactUpdates: must provide a batchedUpdates() function') : _prodInvariant('128') : void 0;\n    !(typeof _batchingStrategy.isBatchingUpdates === 'boolean') ?  true ? invariant(false, 'ReactUpdates: must provide an isBatchingUpdates boolean attribute') : _prodInvariant('129') : void 0;\n    batchingStrategy = _batchingStrategy;\n  }\n};\n\nvar ReactUpdates = {\n  /**\n   * React references `ReactReconcileTransaction` using this property in order\n   * to allow dependency injection.\n   *\n   * @internal\n   */\n  ReactReconcileTransaction: null,\n\n  batchedUpdates: batchedUpdates,\n  enqueueUpdate: enqueueUpdate,\n  flushBatchedUpdates: flushBatchedUpdates,\n  injection: ReactUpdatesInjection,\n  asap: asap\n};\n\nmodule.exports = ReactUpdates;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0VXBkYXRlcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpLFxuICAgIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBDYWxsYmFja1F1ZXVlID0gcmVxdWlyZSgnLi9DYWxsYmFja1F1ZXVlJyk7XG52YXIgUG9vbGVkQ2xhc3MgPSByZXF1aXJlKCcuL1Bvb2xlZENsYXNzJyk7XG52YXIgUmVhY3RGZWF0dXJlRmxhZ3MgPSByZXF1aXJlKCcuL1JlYWN0RmVhdHVyZUZsYWdzJyk7XG52YXIgUmVhY3RSZWNvbmNpbGVyID0gcmVxdWlyZSgnLi9SZWFjdFJlY29uY2lsZXInKTtcbnZhciBUcmFuc2FjdGlvbiA9IHJlcXVpcmUoJy4vVHJhbnNhY3Rpb24nKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG52YXIgZGlydHlDb21wb25lbnRzID0gW107XG52YXIgdXBkYXRlQmF0Y2hOdW1iZXIgPSAwO1xudmFyIGFzYXBDYWxsYmFja1F1ZXVlID0gQ2FsbGJhY2tRdWV1ZS5nZXRQb29sZWQoKTtcbnZhciBhc2FwRW5xdWV1ZWQgPSBmYWxzZTtcblxudmFyIGJhdGNoaW5nU3RyYXRlZ3kgPSBudWxsO1xuXG5mdW5jdGlvbiBlbnN1cmVJbmplY3RlZCgpIHtcbiAgIShSZWFjdFVwZGF0ZXMuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbiAmJiBiYXRjaGluZ1N0cmF0ZWd5KSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdFVwZGF0ZXM6IG11c3QgaW5qZWN0IGEgcmVjb25jaWxlIHRyYW5zYWN0aW9uIGNsYXNzIGFuZCBiYXRjaGluZyBzdHJhdGVneScpIDogX3Byb2RJbnZhcmlhbnQoJzEyMycpIDogdm9pZCAwO1xufVxuXG52YXIgTkVTVEVEX1VQREFURVMgPSB7XG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmRpcnR5Q29tcG9uZW50c0xlbmd0aCA9IGRpcnR5Q29tcG9uZW50cy5sZW5ndGg7XG4gIH0sXG4gIGNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoICE9PSBkaXJ0eUNvbXBvbmVudHMubGVuZ3RoKSB7XG4gICAgICAvLyBBZGRpdGlvbmFsIHVwZGF0ZXMgd2VyZSBlbnF1ZXVlZCBieSBjb21wb25lbnREaWRVcGRhdGUgaGFuZGxlcnMgb3JcbiAgICAgIC8vIHNpbWlsYXI7IGJlZm9yZSBvdXIgb3duIFVQREFURV9RVUVVRUlORyB3cmFwcGVyIGNsb3Nlcywgd2Ugd2FudCB0byBydW5cbiAgICAgIC8vIHRoZXNlIG5ldyB1cGRhdGVzIHNvIHRoYXQgaWYgQSdzIGNvbXBvbmVudERpZFVwZGF0ZSBjYWxscyBzZXRTdGF0ZSBvblxuICAgICAgLy8gQiwgQiB3aWxsIHVwZGF0ZSBiZWZvcmUgdGhlIGNhbGxiYWNrIEEncyB1cGRhdGVyIHByb3ZpZGVkIHdoZW4gY2FsbGluZ1xuICAgICAgLy8gc2V0U3RhdGUuXG4gICAgICBkaXJ0eUNvbXBvbmVudHMuc3BsaWNlKDAsIHRoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoKTtcbiAgICAgIGZsdXNoQmF0Y2hlZFVwZGF0ZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlydHlDb21wb25lbnRzLmxlbmd0aCA9IDA7XG4gICAgfVxuICB9XG59O1xuXG52YXIgVVBEQVRFX1FVRVVFSU5HID0ge1xuICBpbml0aWFsaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5jYWxsYmFja1F1ZXVlLnJlc2V0KCk7XG4gIH0sXG4gIGNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5jYWxsYmFja1F1ZXVlLm5vdGlmeUFsbCgpO1xuICB9XG59O1xuXG52YXIgVFJBTlNBQ1RJT05fV1JBUFBFUlMgPSBbTkVTVEVEX1VQREFURVMsIFVQREFURV9RVUVVRUlOR107XG5cbmZ1bmN0aW9uIFJlYWN0VXBkYXRlc0ZsdXNoVHJhbnNhY3Rpb24oKSB7XG4gIHRoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKTtcbiAgdGhpcy5kaXJ0eUNvbXBvbmVudHNMZW5ndGggPSBudWxsO1xuICB0aGlzLmNhbGxiYWNrUXVldWUgPSBDYWxsYmFja1F1ZXVlLmdldFBvb2xlZCgpO1xuICB0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9uID0gUmVhY3RVcGRhdGVzLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uZ2V0UG9vbGVkKFxuICAvKiB1c2VDcmVhdGVFbGVtZW50ICovdHJ1ZSk7XG59XG5cbl9hc3NpZ24oUmVhY3RVcGRhdGVzRmx1c2hUcmFuc2FjdGlvbi5wcm90b3R5cGUsIFRyYW5zYWN0aW9uLCB7XG4gIGdldFRyYW5zYWN0aW9uV3JhcHBlcnM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gVFJBTlNBQ1RJT05fV1JBUFBFUlM7XG4gIH0sXG5cbiAgZGVzdHJ1Y3RvcjogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoID0gbnVsbDtcbiAgICBDYWxsYmFja1F1ZXVlLnJlbGVhc2UodGhpcy5jYWxsYmFja1F1ZXVlKTtcbiAgICB0aGlzLmNhbGxiYWNrUXVldWUgPSBudWxsO1xuICAgIFJlYWN0VXBkYXRlcy5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uLnJlbGVhc2UodGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbik7XG4gICAgdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbiA9IG51bGw7XG4gIH0sXG5cbiAgcGVyZm9ybTogZnVuY3Rpb24gKG1ldGhvZCwgc2NvcGUsIGEpIHtcbiAgICAvLyBFc3NlbnRpYWxseSBjYWxscyBgdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbi5wZXJmb3JtKG1ldGhvZCwgc2NvcGUsIGEpYFxuICAgIC8vIHdpdGggdGhpcyB0cmFuc2FjdGlvbidzIHdyYXBwZXJzIGFyb3VuZCBpdC5cbiAgICByZXR1cm4gVHJhbnNhY3Rpb24ucGVyZm9ybS5jYWxsKHRoaXMsIHRoaXMucmVjb25jaWxlVHJhbnNhY3Rpb24ucGVyZm9ybSwgdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbiwgbWV0aG9kLCBzY29wZSwgYSk7XG4gIH1cbn0pO1xuXG5Qb29sZWRDbGFzcy5hZGRQb29saW5nVG8oUmVhY3RVcGRhdGVzRmx1c2hUcmFuc2FjdGlvbik7XG5cbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzKGNhbGxiYWNrLCBhLCBiLCBjLCBkLCBlKSB7XG4gIGVuc3VyZUluamVjdGVkKCk7XG4gIHJldHVybiBiYXRjaGluZ1N0cmF0ZWd5LmJhdGNoZWRVcGRhdGVzKGNhbGxiYWNrLCBhLCBiLCBjLCBkLCBlKTtcbn1cblxuLyoqXG4gKiBBcnJheSBjb21wYXJhdG9yIGZvciBSZWFjdENvbXBvbmVudHMgYnkgbW91bnQgb3JkZXJpbmcuXG4gKlxuICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gYzEgZmlyc3QgY29tcG9uZW50IHlvdSdyZSBjb21wYXJpbmdcbiAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGMyIHNlY29uZCBjb21wb25lbnQgeW91J3JlIGNvbXBhcmluZ1xuICogQHJldHVybiB7bnVtYmVyfSBSZXR1cm4gdmFsdWUgdXNhYmxlIGJ5IEFycmF5LnByb3RvdHlwZS5zb3J0KCkuXG4gKi9cbmZ1bmN0aW9uIG1vdW50T3JkZXJDb21wYXJhdG9yKGMxLCBjMikge1xuICByZXR1cm4gYzEuX21vdW50T3JkZXIgLSBjMi5fbW91bnRPcmRlcjtcbn1cblxuZnVuY3Rpb24gcnVuQmF0Y2hlZFVwZGF0ZXModHJhbnNhY3Rpb24pIHtcbiAgdmFyIGxlbiA9IHRyYW5zYWN0aW9uLmRpcnR5Q29tcG9uZW50c0xlbmd0aDtcbiAgIShsZW4gPT09IGRpcnR5Q29tcG9uZW50cy5sZW5ndGgpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V4cGVjdGVkIGZsdXNoIHRyYW5zYWN0aW9uXFwncyBzdG9yZWQgZGlydHktY29tcG9uZW50cyBsZW5ndGggKCVzKSB0byBtYXRjaCBkaXJ0eS1jb21wb25lbnRzIGFycmF5IGxlbmd0aCAoJXMpLicsIGxlbiwgZGlydHlDb21wb25lbnRzLmxlbmd0aCkgOiBfcHJvZEludmFyaWFudCgnMTI0JywgbGVuLCBkaXJ0eUNvbXBvbmVudHMubGVuZ3RoKSA6IHZvaWQgMDtcblxuICAvLyBTaW5jZSByZWNvbmNpbGluZyBhIGNvbXBvbmVudCBoaWdoZXIgaW4gdGhlIG93bmVyIGhpZXJhcmNoeSB1c3VhbGx5IChub3RcbiAgLy8gYWx3YXlzIC0tIHNlZSBzaG91bGRDb21wb25lbnRVcGRhdGUoKSkgd2lsbCByZWNvbmNpbGUgY2hpbGRyZW4sIHJlY29uY2lsZVxuICAvLyB0aGVtIGJlZm9yZSB0aGVpciBjaGlsZHJlbiBieSBzb3J0aW5nIHRoZSBhcnJheS5cbiAgZGlydHlDb21wb25lbnRzLnNvcnQobW91bnRPcmRlckNvbXBhcmF0b3IpO1xuXG4gIC8vIEFueSB1cGRhdGVzIGVucXVldWVkIHdoaWxlIHJlY29uY2lsaW5nIG11c3QgYmUgcGVyZm9ybWVkIGFmdGVyIHRoaXMgZW50aXJlXG4gIC8vIGJhdGNoLiBPdGhlcndpc2UsIGlmIGRpcnR5Q29tcG9uZW50cyBpcyBbQSwgQl0gd2hlcmUgQSBoYXMgY2hpbGRyZW4gQiBhbmRcbiAgLy8gQywgQiBjb3VsZCB1cGRhdGUgdHdpY2UgaW4gYSBzaW5nbGUgYmF0Y2ggaWYgQydzIHJlbmRlciBlbnF1ZXVlcyBhbiB1cGRhdGVcbiAgLy8gdG8gQiAoc2luY2UgQiB3b3VsZCBoYXZlIGFscmVhZHkgdXBkYXRlZCwgd2Ugc2hvdWxkIHNraXAgaXQsIGFuZCB0aGUgb25seVxuICAvLyB3YXkgd2UgY2FuIGtub3cgdG8gZG8gc28gaXMgYnkgY2hlY2tpbmcgdGhlIGJhdGNoIGNvdW50ZXIpLlxuICB1cGRhdGVCYXRjaE51bWJlcisrO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAvLyBJZiBhIGNvbXBvbmVudCBpcyB1bm1vdW50ZWQgYmVmb3JlIHBlbmRpbmcgY2hhbmdlcyBhcHBseSwgaXQgd2lsbCBzdGlsbFxuICAgIC8vIGJlIGhlcmUsIGJ1dCB3ZSBhc3N1bWUgdGhhdCBpdCBoYXMgY2xlYXJlZCBpdHMgX3BlbmRpbmdDYWxsYmFja3MgYW5kXG4gICAgLy8gdGhhdCBwZXJmb3JtVXBkYXRlSWZOZWNlc3NhcnkgaXMgYSBub29wLlxuICAgIHZhciBjb21wb25lbnQgPSBkaXJ0eUNvbXBvbmVudHNbaV07XG5cbiAgICAvLyBJZiBwZXJmb3JtVXBkYXRlSWZOZWNlc3NhcnkgaGFwcGVucyB0byBlbnF1ZXVlIGFueSBuZXcgdXBkYXRlcywgd2VcbiAgICAvLyBzaG91bGRuJ3QgZXhlY3V0ZSB0aGUgY2FsbGJhY2tzIHVudGlsIHRoZSBuZXh0IHJlbmRlciBoYXBwZW5zLCBzb1xuICAgIC8vIHN0YXNoIHRoZSBjYWxsYmFja3MgZmlyc3RcbiAgICB2YXIgY2FsbGJhY2tzID0gY29tcG9uZW50Ll9wZW5kaW5nQ2FsbGJhY2tzO1xuICAgIGNvbXBvbmVudC5fcGVuZGluZ0NhbGxiYWNrcyA9IG51bGw7XG5cbiAgICB2YXIgbWFya2VyTmFtZTtcbiAgICBpZiAoUmVhY3RGZWF0dXJlRmxhZ3MubG9nVG9wTGV2ZWxSZW5kZXJzKSB7XG4gICAgICB2YXIgbmFtZWRDb21wb25lbnQgPSBjb21wb25lbnQ7XG4gICAgICAvLyBEdWNrIHR5cGUgVG9wTGV2ZWxXcmFwcGVyLiBUaGlzIGlzIHByb2JhYmx5IGFsd2F5cyB0cnVlLlxuICAgICAgaWYgKGNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQudHlwZS5pc1JlYWN0VG9wTGV2ZWxXcmFwcGVyKSB7XG4gICAgICAgIG5hbWVkQ29tcG9uZW50ID0gY29tcG9uZW50Ll9yZW5kZXJlZENvbXBvbmVudDtcbiAgICAgIH1cbiAgICAgIG1hcmtlck5hbWUgPSAnUmVhY3QgdXBkYXRlOiAnICsgbmFtZWRDb21wb25lbnQuZ2V0TmFtZSgpO1xuICAgICAgY29uc29sZS50aW1lKG1hcmtlck5hbWUpO1xuICAgIH1cblxuICAgIFJlYWN0UmVjb25jaWxlci5wZXJmb3JtVXBkYXRlSWZOZWNlc3NhcnkoY29tcG9uZW50LCB0cmFuc2FjdGlvbi5yZWNvbmNpbGVUcmFuc2FjdGlvbiwgdXBkYXRlQmF0Y2hOdW1iZXIpO1xuXG4gICAgaWYgKG1hcmtlck5hbWUpIHtcbiAgICAgIGNvbnNvbGUudGltZUVuZChtYXJrZXJOYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNhbGxiYWNrcy5sZW5ndGg7IGorKykge1xuICAgICAgICB0cmFuc2FjdGlvbi5jYWxsYmFja1F1ZXVlLmVucXVldWUoY2FsbGJhY2tzW2pdLCBjb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBmbHVzaEJhdGNoZWRVcGRhdGVzID0gZnVuY3Rpb24gKCkge1xuICAvLyBSZWFjdFVwZGF0ZXNGbHVzaFRyYW5zYWN0aW9uJ3Mgd3JhcHBlcnMgd2lsbCBjbGVhciB0aGUgZGlydHlDb21wb25lbnRzXG4gIC8vIGFycmF5IGFuZCBwZXJmb3JtIGFueSB1cGRhdGVzIGVucXVldWVkIGJ5IG1vdW50LXJlYWR5IGhhbmRsZXJzIChpLmUuLFxuICAvLyBjb21wb25lbnREaWRVcGRhdGUpIGJ1dCB3ZSBuZWVkIHRvIGNoZWNrIGhlcmUgdG9vIGluIG9yZGVyIHRvIGNhdGNoXG4gIC8vIHVwZGF0ZXMgZW5xdWV1ZWQgYnkgc2V0U3RhdGUgY2FsbGJhY2tzIGFuZCBhc2FwIGNhbGxzLlxuICB3aGlsZSAoZGlydHlDb21wb25lbnRzLmxlbmd0aCB8fCBhc2FwRW5xdWV1ZWQpIHtcbiAgICBpZiAoZGlydHlDb21wb25lbnRzLmxlbmd0aCkge1xuICAgICAgdmFyIHRyYW5zYWN0aW9uID0gUmVhY3RVcGRhdGVzRmx1c2hUcmFuc2FjdGlvbi5nZXRQb29sZWQoKTtcbiAgICAgIHRyYW5zYWN0aW9uLnBlcmZvcm0ocnVuQmF0Y2hlZFVwZGF0ZXMsIG51bGwsIHRyYW5zYWN0aW9uKTtcbiAgICAgIFJlYWN0VXBkYXRlc0ZsdXNoVHJhbnNhY3Rpb24ucmVsZWFzZSh0cmFuc2FjdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKGFzYXBFbnF1ZXVlZCkge1xuICAgICAgYXNhcEVucXVldWVkID0gZmFsc2U7XG4gICAgICB2YXIgcXVldWUgPSBhc2FwQ2FsbGJhY2tRdWV1ZTtcbiAgICAgIGFzYXBDYWxsYmFja1F1ZXVlID0gQ2FsbGJhY2tRdWV1ZS5nZXRQb29sZWQoKTtcbiAgICAgIHF1ZXVlLm5vdGlmeUFsbCgpO1xuICAgICAgQ2FsbGJhY2tRdWV1ZS5yZWxlYXNlKHF1ZXVlKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogTWFyayBhIGNvbXBvbmVudCBhcyBuZWVkaW5nIGEgcmVyZW5kZXIsIGFkZGluZyBhbiBvcHRpb25hbCBjYWxsYmFjayB0byBhXG4gKiBsaXN0IG9mIGZ1bmN0aW9ucyB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIG9uY2UgdGhlIHJlcmVuZGVyIG9jY3Vycy5cbiAqL1xuZnVuY3Rpb24gZW5xdWV1ZVVwZGF0ZShjb21wb25lbnQpIHtcbiAgZW5zdXJlSW5qZWN0ZWQoKTtcblxuICAvLyBWYXJpb3VzIHBhcnRzIG9mIG91ciBjb2RlIChzdWNoIGFzIFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50J3NcbiAgLy8gX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudCkgYXNzdW1lIHRoYXQgY2FsbHMgdG8gcmVuZGVyIGFyZW4ndCBuZXN0ZWQ7XG4gIC8vIHZlcmlmeSB0aGF0IHRoYXQncyB0aGUgY2FzZS4gKFRoaXMgaXMgY2FsbGVkIGJ5IGVhY2ggdG9wLWxldmVsIHVwZGF0ZVxuICAvLyBmdW5jdGlvbiwgbGlrZSBzZXRTdGF0ZSwgZm9yY2VVcGRhdGUsIGV0Yy47IGNyZWF0aW9uIGFuZFxuICAvLyBkZXN0cnVjdGlvbiBvZiB0b3AtbGV2ZWwgY29tcG9uZW50cyBpcyBndWFyZGVkIGluIFJlYWN0TW91bnQuKVxuXG4gIGlmICghYmF0Y2hpbmdTdHJhdGVneS5pc0JhdGNoaW5nVXBkYXRlcykge1xuICAgIGJhdGNoaW5nU3RyYXRlZ3kuYmF0Y2hlZFVwZGF0ZXMoZW5xdWV1ZVVwZGF0ZSwgY29tcG9uZW50KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBkaXJ0eUNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICBpZiAoY29tcG9uZW50Ll91cGRhdGVCYXRjaE51bWJlciA9PSBudWxsKSB7XG4gICAgY29tcG9uZW50Ll91cGRhdGVCYXRjaE51bWJlciA9IHVwZGF0ZUJhdGNoTnVtYmVyICsgMTtcbiAgfVxufVxuXG4vKipcbiAqIEVucXVldWUgYSBjYWxsYmFjayB0byBiZSBydW4gYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBiYXRjaGluZyBjeWNsZS4gVGhyb3dzXG4gKiBpZiBubyB1cGRhdGVzIGFyZSBjdXJyZW50bHkgYmVpbmcgcGVyZm9ybWVkLlxuICovXG5mdW5jdGlvbiBhc2FwKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICFiYXRjaGluZ1N0cmF0ZWd5LmlzQmF0Y2hpbmdVcGRhdGVzID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0VXBkYXRlcy5hc2FwOiBDYW5cXCd0IGVucXVldWUgYW4gYXNhcCBjYWxsYmFjayBpbiBhIGNvbnRleHQgd2hlcmV1cGRhdGVzIGFyZSBub3QgYmVpbmcgYmF0Y2hlZC4nKSA6IF9wcm9kSW52YXJpYW50KCcxMjUnKSA6IHZvaWQgMDtcbiAgYXNhcENhbGxiYWNrUXVldWUuZW5xdWV1ZShjYWxsYmFjaywgY29udGV4dCk7XG4gIGFzYXBFbnF1ZXVlZCA9IHRydWU7XG59XG5cbnZhciBSZWFjdFVwZGF0ZXNJbmplY3Rpb24gPSB7XG4gIGluamVjdFJlY29uY2lsZVRyYW5zYWN0aW9uOiBmdW5jdGlvbiAoUmVjb25jaWxlVHJhbnNhY3Rpb24pIHtcbiAgICAhUmVjb25jaWxlVHJhbnNhY3Rpb24gPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RVcGRhdGVzOiBtdXN0IHByb3ZpZGUgYSByZWNvbmNpbGUgdHJhbnNhY3Rpb24gY2xhc3MnKSA6IF9wcm9kSW52YXJpYW50KCcxMjYnKSA6IHZvaWQgMDtcbiAgICBSZWFjdFVwZGF0ZXMuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbiA9IFJlY29uY2lsZVRyYW5zYWN0aW9uO1xuICB9LFxuXG4gIGluamVjdEJhdGNoaW5nU3RyYXRlZ3k6IGZ1bmN0aW9uIChfYmF0Y2hpbmdTdHJhdGVneSkge1xuICAgICFfYmF0Y2hpbmdTdHJhdGVneSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdFVwZGF0ZXM6IG11c3QgcHJvdmlkZSBhIGJhdGNoaW5nIHN0cmF0ZWd5JykgOiBfcHJvZEludmFyaWFudCgnMTI3JykgOiB2b2lkIDA7XG4gICAgISh0eXBlb2YgX2JhdGNoaW5nU3RyYXRlZ3kuYmF0Y2hlZFVwZGF0ZXMgPT09ICdmdW5jdGlvbicpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0VXBkYXRlczogbXVzdCBwcm92aWRlIGEgYmF0Y2hlZFVwZGF0ZXMoKSBmdW5jdGlvbicpIDogX3Byb2RJbnZhcmlhbnQoJzEyOCcpIDogdm9pZCAwO1xuICAgICEodHlwZW9mIF9iYXRjaGluZ1N0cmF0ZWd5LmlzQmF0Y2hpbmdVcGRhdGVzID09PSAnYm9vbGVhbicpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0VXBkYXRlczogbXVzdCBwcm92aWRlIGFuIGlzQmF0Y2hpbmdVcGRhdGVzIGJvb2xlYW4gYXR0cmlidXRlJykgOiBfcHJvZEludmFyaWFudCgnMTI5JykgOiB2b2lkIDA7XG4gICAgYmF0Y2hpbmdTdHJhdGVneSA9IF9iYXRjaGluZ1N0cmF0ZWd5O1xuICB9XG59O1xuXG52YXIgUmVhY3RVcGRhdGVzID0ge1xuICAvKipcbiAgICogUmVhY3QgcmVmZXJlbmNlcyBgUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbmAgdXNpbmcgdGhpcyBwcm9wZXJ0eSBpbiBvcmRlclxuICAgKiB0byBhbGxvdyBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uOiBudWxsLFxuXG4gIGJhdGNoZWRVcGRhdGVzOiBiYXRjaGVkVXBkYXRlcyxcbiAgZW5xdWV1ZVVwZGF0ZTogZW5xdWV1ZVVwZGF0ZSxcbiAgZmx1c2hCYXRjaGVkVXBkYXRlczogZmx1c2hCYXRjaGVkVXBkYXRlcyxcbiAgaW5qZWN0aW9uOiBSZWFjdFVwZGF0ZXNJbmplY3Rpb24sXG4gIGFzYXA6IGFzYXBcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RVcGRhdGVzO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0VXBkYXRlcy5qc1xuLy8gbW9kdWxlIGlkID0gMjI5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 230 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar PooledClass = __webpack_require__(223);\n\nvar invariant = __webpack_require__(180);\n\n/**\n * A specialized pseudo-event module to help keep track of components waiting to\n * be notified when their DOM representations are available for use.\n *\n * This implements `PooledClass`, so you should never need to instantiate this.\n * Instead, use `CallbackQueue.getPooled()`.\n *\n * @class ReactMountReady\n * @implements PooledClass\n * @internal\n */\n\nvar CallbackQueue = function () {\n  function CallbackQueue(arg) {\n    _classCallCheck(this, CallbackQueue);\n\n    this._callbacks = null;\n    this._contexts = null;\n    this._arg = arg;\n  }\n\n  /**\n   * Enqueues a callback to be invoked when `notifyAll` is invoked.\n   *\n   * @param {function} callback Invoked when `notifyAll` is invoked.\n   * @param {?object} context Context to call `callback` with.\n   * @internal\n   */\n\n\n  CallbackQueue.prototype.enqueue = function enqueue(callback, context) {\n    this._callbacks = this._callbacks || [];\n    this._callbacks.push(callback);\n    this._contexts = this._contexts || [];\n    this._contexts.push(context);\n  };\n\n  /**\n   * Invokes all enqueued callbacks and clears the queue. This is invoked after\n   * the DOM representation of a component has been created or updated.\n   *\n   * @internal\n   */\n\n\n  CallbackQueue.prototype.notifyAll = function notifyAll() {\n    var callbacks = this._callbacks;\n    var contexts = this._contexts;\n    var arg = this._arg;\n    if (callbacks && contexts) {\n      !(callbacks.length === contexts.length) ?  true ? invariant(false, 'Mismatched list of contexts in callback queue') : _prodInvariant('24') : void 0;\n      this._callbacks = null;\n      this._contexts = null;\n      for (var i = 0; i < callbacks.length; i++) {\n        callbacks[i].call(contexts[i], arg);\n      }\n      callbacks.length = 0;\n      contexts.length = 0;\n    }\n  };\n\n  CallbackQueue.prototype.checkpoint = function checkpoint() {\n    return this._callbacks ? this._callbacks.length : 0;\n  };\n\n  CallbackQueue.prototype.rollback = function rollback(len) {\n    if (this._callbacks && this._contexts) {\n      this._callbacks.length = len;\n      this._contexts.length = len;\n    }\n  };\n\n  /**\n   * Resets the internal queue.\n   *\n   * @internal\n   */\n\n\n  CallbackQueue.prototype.reset = function reset() {\n    this._callbacks = null;\n    this._contexts = null;\n  };\n\n  /**\n   * `PooledClass` looks for this.\n   */\n\n\n  CallbackQueue.prototype.destructor = function destructor() {\n    this.reset();\n  };\n\n  return CallbackQueue;\n}();\n\nmodule.exports = PooledClass.addPoolingTo(CallbackQueue);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0NhbGxiYWNrUXVldWUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgUG9vbGVkQ2xhc3MgPSByZXF1aXJlKCcuL1Bvb2xlZENsYXNzJyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHBzZXVkby1ldmVudCBtb2R1bGUgdG8gaGVscCBrZWVwIHRyYWNrIG9mIGNvbXBvbmVudHMgd2FpdGluZyB0b1xuICogYmUgbm90aWZpZWQgd2hlbiB0aGVpciBET00gcmVwcmVzZW50YXRpb25zIGFyZSBhdmFpbGFibGUgZm9yIHVzZS5cbiAqXG4gKiBUaGlzIGltcGxlbWVudHMgYFBvb2xlZENsYXNzYCwgc28geW91IHNob3VsZCBuZXZlciBuZWVkIHRvIGluc3RhbnRpYXRlIHRoaXMuXG4gKiBJbnN0ZWFkLCB1c2UgYENhbGxiYWNrUXVldWUuZ2V0UG9vbGVkKClgLlxuICpcbiAqIEBjbGFzcyBSZWFjdE1vdW50UmVhZHlcbiAqIEBpbXBsZW1lbnRzIFBvb2xlZENsYXNzXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG52YXIgQ2FsbGJhY2tRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ2FsbGJhY2tRdWV1ZShhcmcpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2FsbGJhY2tRdWV1ZSk7XG5cbiAgICB0aGlzLl9jYWxsYmFja3MgPSBudWxsO1xuICAgIHRoaXMuX2NvbnRleHRzID0gbnVsbDtcbiAgICB0aGlzLl9hcmcgPSBhcmc7XG4gIH1cblxuICAvKipcbiAgICogRW5xdWV1ZXMgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gYG5vdGlmeUFsbGAgaXMgaW52b2tlZC5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgSW52b2tlZCB3aGVuIGBub3RpZnlBbGxgIGlzIGludm9rZWQuXG4gICAqIEBwYXJhbSB7P29iamVjdH0gY29udGV4dCBDb250ZXh0IHRvIGNhbGwgYGNhbGxiYWNrYCB3aXRoLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG5cblxuICBDYWxsYmFja1F1ZXVlLnByb3RvdHlwZS5lbnF1ZXVlID0gZnVuY3Rpb24gZW5xdWV1ZShjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCBbXTtcbiAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgdGhpcy5fY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cyB8fCBbXTtcbiAgICB0aGlzLl9jb250ZXh0cy5wdXNoKGNvbnRleHQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJbnZva2VzIGFsbCBlbnF1ZXVlZCBjYWxsYmFja3MgYW5kIGNsZWFycyB0aGUgcXVldWUuIFRoaXMgaXMgaW52b2tlZCBhZnRlclxuICAgKiB0aGUgRE9NIHJlcHJlc2VudGF0aW9uIG9mIGEgY29tcG9uZW50IGhhcyBiZWVuIGNyZWF0ZWQgb3IgdXBkYXRlZC5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuXG5cbiAgQ2FsbGJhY2tRdWV1ZS5wcm90b3R5cGUubm90aWZ5QWxsID0gZnVuY3Rpb24gbm90aWZ5QWxsKCkge1xuICAgIHZhciBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3M7XG4gICAgdmFyIGNvbnRleHRzID0gdGhpcy5fY29udGV4dHM7XG4gICAgdmFyIGFyZyA9IHRoaXMuX2FyZztcbiAgICBpZiAoY2FsbGJhY2tzICYmIGNvbnRleHRzKSB7XG4gICAgICAhKGNhbGxiYWNrcy5sZW5ndGggPT09IGNvbnRleHRzLmxlbmd0aCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnTWlzbWF0Y2hlZCBsaXN0IG9mIGNvbnRleHRzIGluIGNhbGxiYWNrIHF1ZXVlJykgOiBfcHJvZEludmFyaWFudCgnMjQnKSA6IHZvaWQgMDtcbiAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IG51bGw7XG4gICAgICB0aGlzLl9jb250ZXh0cyA9IG51bGw7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjYWxsYmFja3NbaV0uY2FsbChjb250ZXh0c1tpXSwgYXJnKTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrcy5sZW5ndGggPSAwO1xuICAgICAgY29udGV4dHMubGVuZ3RoID0gMDtcbiAgICB9XG4gIH07XG5cbiAgQ2FsbGJhY2tRdWV1ZS5wcm90b3R5cGUuY2hlY2twb2ludCA9IGZ1bmN0aW9uIGNoZWNrcG9pbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxiYWNrcyA/IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggOiAwO1xuICB9O1xuXG4gIENhbGxiYWNrUXVldWUucHJvdG90eXBlLnJvbGxiYWNrID0gZnVuY3Rpb24gcm9sbGJhY2sobGVuKSB7XG4gICAgaWYgKHRoaXMuX2NhbGxiYWNrcyAmJiB0aGlzLl9jb250ZXh0cykge1xuICAgICAgdGhpcy5fY2FsbGJhY2tzLmxlbmd0aCA9IGxlbjtcbiAgICAgIHRoaXMuX2NvbnRleHRzLmxlbmd0aCA9IGxlbjtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgaW50ZXJuYWwgcXVldWUuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cblxuXG4gIENhbGxiYWNrUXVldWUucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgdGhpcy5fY2FsbGJhY2tzID0gbnVsbDtcbiAgICB0aGlzLl9jb250ZXh0cyA9IG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIGBQb29sZWRDbGFzc2AgbG9va3MgZm9yIHRoaXMuXG4gICAqL1xuXG5cbiAgQ2FsbGJhY2tRdWV1ZS5wcm90b3R5cGUuZGVzdHJ1Y3RvciA9IGZ1bmN0aW9uIGRlc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9O1xuXG4gIHJldHVybiBDYWxsYmFja1F1ZXVlO1xufSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvb2xlZENsYXNzLmFkZFBvb2xpbmdUbyhDYWxsYmFja1F1ZXVlKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9DYWxsYmFja1F1ZXVlLmpzXG4vLyBtb2R1bGUgaWQgPSAyMzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 231 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar ReactFeatureFlags = {\n  // When true, call console.time() before and .timeEnd() after each top-level\n  // render (both initial renders and updates). Useful when looking at prod-mode\n  // timeline profiles in Chrome, for example.\n  logTopLevelRenders: false\n};\n\nmodule.exports = ReactFeatureFlags;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RmVhdHVyZUZsYWdzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0RmVhdHVyZUZsYWdzID0ge1xuICAvLyBXaGVuIHRydWUsIGNhbGwgY29uc29sZS50aW1lKCkgYmVmb3JlIGFuZCAudGltZUVuZCgpIGFmdGVyIGVhY2ggdG9wLWxldmVsXG4gIC8vIHJlbmRlciAoYm90aCBpbml0aWFsIHJlbmRlcnMgYW5kIHVwZGF0ZXMpLiBVc2VmdWwgd2hlbiBsb29raW5nIGF0IHByb2QtbW9kZVxuICAvLyB0aW1lbGluZSBwcm9maWxlcyBpbiBDaHJvbWUsIGZvciBleGFtcGxlLlxuICBsb2dUb3BMZXZlbFJlbmRlcnM6IGZhbHNlXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RmVhdHVyZUZsYWdzO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0RmVhdHVyZUZsYWdzLmpzXG4vLyBtb2R1bGUgaWQgPSAyMzFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 232 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar ReactRef = __webpack_require__(233);\nvar ReactInstrumentation = __webpack_require__(235);\n\nvar warning = __webpack_require__(183);\n\n/**\n * Helper to call ReactRef.attachRefs with this composite component, split out\n * to avoid allocations in the transaction mount-ready queue.\n */\nfunction attachRefs() {\n  ReactRef.attachRefs(this, this._currentElement);\n}\n\nvar ReactReconciler = {\n\n  /**\n   * Initializes the component, renders markup, and registers event listeners.\n   *\n   * @param {ReactComponent} internalInstance\n   * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n   * @param {?object} the containing host component instance\n   * @param {?object} info about the host container\n   * @return {?string} Rendered markup to be inserted into the DOM.\n   * @final\n   * @internal\n   */\n  mountComponent: function (internalInstance, transaction, hostParent, hostContainerInfo, context, parentDebugID // 0 in production and for roots\n  ) {\n    if (true) {\n      if (internalInstance._debugID !== 0) {\n        ReactInstrumentation.debugTool.onBeforeMountComponent(internalInstance._debugID, internalInstance._currentElement, parentDebugID);\n      }\n    }\n    var markup = internalInstance.mountComponent(transaction, hostParent, hostContainerInfo, context, parentDebugID);\n    if (internalInstance._currentElement && internalInstance._currentElement.ref != null) {\n      transaction.getReactMountReady().enqueue(attachRefs, internalInstance);\n    }\n    if (true) {\n      if (internalInstance._debugID !== 0) {\n        ReactInstrumentation.debugTool.onMountComponent(internalInstance._debugID);\n      }\n    }\n    return markup;\n  },\n\n  /**\n   * Returns a value that can be passed to\n   * ReactComponentEnvironment.replaceNodeWithMarkup.\n   */\n  getHostNode: function (internalInstance) {\n    return internalInstance.getHostNode();\n  },\n\n  /**\n   * Releases any resources allocated by `mountComponent`.\n   *\n   * @final\n   * @internal\n   */\n  unmountComponent: function (internalInstance, safely) {\n    if (true) {\n      if (internalInstance._debugID !== 0) {\n        ReactInstrumentation.debugTool.onBeforeUnmountComponent(internalInstance._debugID);\n      }\n    }\n    ReactRef.detachRefs(internalInstance, internalInstance._currentElement);\n    internalInstance.unmountComponent(safely);\n    if (true) {\n      if (internalInstance._debugID !== 0) {\n        ReactInstrumentation.debugTool.onUnmountComponent(internalInstance._debugID);\n      }\n    }\n  },\n\n  /**\n   * Update a component using a new element.\n   *\n   * @param {ReactComponent} internalInstance\n   * @param {ReactElement} nextElement\n   * @param {ReactReconcileTransaction} transaction\n   * @param {object} context\n   * @internal\n   */\n  receiveComponent: function (internalInstance, nextElement, transaction, context) {\n    var prevElement = internalInstance._currentElement;\n\n    if (nextElement === prevElement && context === internalInstance._context) {\n      // Since elements are immutable after the owner is rendered,\n      // we can do a cheap identity compare here to determine if this is a\n      // superfluous reconcile. It's possible for state to be mutable but such\n      // change should trigger an update of the owner which would recreate\n      // the element. We explicitly check for the existence of an owner since\n      // it's possible for an element created outside a composite to be\n      // deeply mutated and reused.\n\n      // TODO: Bailing out early is just a perf optimization right?\n      // TODO: Removing the return statement should affect correctness?\n      return;\n    }\n\n    if (true) {\n      if (internalInstance._debugID !== 0) {\n        ReactInstrumentation.debugTool.onBeforeUpdateComponent(internalInstance._debugID, nextElement);\n      }\n    }\n\n    var refsChanged = ReactRef.shouldUpdateRefs(prevElement, nextElement);\n\n    if (refsChanged) {\n      ReactRef.detachRefs(internalInstance, prevElement);\n    }\n\n    internalInstance.receiveComponent(nextElement, transaction, context);\n\n    if (refsChanged && internalInstance._currentElement && internalInstance._currentElement.ref != null) {\n      transaction.getReactMountReady().enqueue(attachRefs, internalInstance);\n    }\n\n    if (true) {\n      if (internalInstance._debugID !== 0) {\n        ReactInstrumentation.debugTool.onUpdateComponent(internalInstance._debugID);\n      }\n    }\n  },\n\n  /**\n   * Flush any dirty changes in a component.\n   *\n   * @param {ReactComponent} internalInstance\n   * @param {ReactReconcileTransaction} transaction\n   * @internal\n   */\n  performUpdateIfNecessary: function (internalInstance, transaction, updateBatchNumber) {\n    if (internalInstance._updateBatchNumber !== updateBatchNumber) {\n      // The component's enqueued batch number should always be the current\n      // batch or the following one.\n       true ? warning(internalInstance._updateBatchNumber == null || internalInstance._updateBatchNumber === updateBatchNumber + 1, 'performUpdateIfNecessary: Unexpected batch number (current %s, ' + 'pending %s)', updateBatchNumber, internalInstance._updateBatchNumber) : void 0;\n      return;\n    }\n    if (true) {\n      if (internalInstance._debugID !== 0) {\n        ReactInstrumentation.debugTool.onBeforeUpdateComponent(internalInstance._debugID, internalInstance._currentElement);\n      }\n    }\n    internalInstance.performUpdateIfNecessary(transaction);\n    if (true) {\n      if (internalInstance._debugID !== 0) {\n        ReactInstrumentation.debugTool.onUpdateComponent(internalInstance._debugID);\n      }\n    }\n  }\n\n};\n\nmodule.exports = ReactReconciler;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0UmVjb25jaWxlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RSZWYgPSByZXF1aXJlKCcuL1JlYWN0UmVmJyk7XG52YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSByZXF1aXJlKCcuL1JlYWN0SW5zdHJ1bWVudGF0aW9uJyk7XG5cbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG4vKipcbiAqIEhlbHBlciB0byBjYWxsIFJlYWN0UmVmLmF0dGFjaFJlZnMgd2l0aCB0aGlzIGNvbXBvc2l0ZSBjb21wb25lbnQsIHNwbGl0IG91dFxuICogdG8gYXZvaWQgYWxsb2NhdGlvbnMgaW4gdGhlIHRyYW5zYWN0aW9uIG1vdW50LXJlYWR5IHF1ZXVlLlxuICovXG5mdW5jdGlvbiBhdHRhY2hSZWZzKCkge1xuICBSZWFjdFJlZi5hdHRhY2hSZWZzKHRoaXMsIHRoaXMuX2N1cnJlbnRFbGVtZW50KTtcbn1cblxudmFyIFJlYWN0UmVjb25jaWxlciA9IHtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGNvbXBvbmVudCwgcmVuZGVycyBtYXJrdXAsIGFuZCByZWdpc3RlcnMgZXZlbnQgbGlzdGVuZXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBpbnRlcm5hbEluc3RhbmNlXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbnxSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gez9vYmplY3R9IHRoZSBjb250YWluaW5nIGhvc3QgY29tcG9uZW50IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7P29iamVjdH0gaW5mbyBhYm91dCB0aGUgaG9zdCBjb250YWluZXJcbiAgICogQHJldHVybiB7P3N0cmluZ30gUmVuZGVyZWQgbWFya3VwIHRvIGJlIGluc2VydGVkIGludG8gdGhlIERPTS5cbiAgICogQGZpbmFsXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgbW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChpbnRlcm5hbEluc3RhbmNlLCB0cmFuc2FjdGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQsIHBhcmVudERlYnVnSUQgLy8gMCBpbiBwcm9kdWN0aW9uIGFuZCBmb3Igcm9vdHNcbiAgKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZm9yZU1vdW50Q29tcG9uZW50KGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQsIGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50LCBwYXJlbnREZWJ1Z0lEKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIG1hcmt1cCA9IGludGVybmFsSW5zdGFuY2UubW91bnRDb21wb25lbnQodHJhbnNhY3Rpb24sIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCBjb250ZXh0LCBwYXJlbnREZWJ1Z0lEKTtcbiAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQgJiYgaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQucmVmICE9IG51bGwpIHtcbiAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoYXR0YWNoUmVmcywgaW50ZXJuYWxJbnN0YW5jZSk7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCAhPT0gMCkge1xuICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Nb3VudENvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcmt1cDtcbiAgfSxcblxuICAvKipcbiAgICogUmV0dXJucyBhIHZhbHVlIHRoYXQgY2FuIGJlIHBhc3NlZCB0b1xuICAgKiBSZWFjdENvbXBvbmVudEVudmlyb25tZW50LnJlcGxhY2VOb2RlV2l0aE1hcmt1cC5cbiAgICovXG4gIGdldEhvc3ROb2RlOiBmdW5jdGlvbiAoaW50ZXJuYWxJbnN0YW5jZSkge1xuICAgIHJldHVybiBpbnRlcm5hbEluc3RhbmNlLmdldEhvc3ROb2RlKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIGFueSByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IGBtb3VudENvbXBvbmVudGAuXG4gICAqXG4gICAqIEBmaW5hbFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHVubW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChpbnRlcm5hbEluc3RhbmNlLCBzYWZlbHkpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVmb3JlVW5tb3VudENvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKTtcbiAgICAgIH1cbiAgICB9XG4gICAgUmVhY3RSZWYuZGV0YWNoUmVmcyhpbnRlcm5hbEluc3RhbmNlLCBpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxlbWVudCk7XG4gICAgaW50ZXJuYWxJbnN0YW5jZS51bm1vdW50Q29tcG9uZW50KHNhZmVseSk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblVubW91bnRDb21wb25lbnQoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYSBjb21wb25lbnQgdXNpbmcgYSBuZXcgZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gaW50ZXJuYWxJbnN0YW5jZVxuICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4dEVsZW1lbnRcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlY2VpdmVDb21wb25lbnQ6IGZ1bmN0aW9uIChpbnRlcm5hbEluc3RhbmNlLCBuZXh0RWxlbWVudCwgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHtcbiAgICB2YXIgcHJldkVsZW1lbnQgPSBpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxlbWVudDtcblxuICAgIGlmIChuZXh0RWxlbWVudCA9PT0gcHJldkVsZW1lbnQgJiYgY29udGV4dCA9PT0gaW50ZXJuYWxJbnN0YW5jZS5fY29udGV4dCkge1xuICAgICAgLy8gU2luY2UgZWxlbWVudHMgYXJlIGltbXV0YWJsZSBhZnRlciB0aGUgb3duZXIgaXMgcmVuZGVyZWQsXG4gICAgICAvLyB3ZSBjYW4gZG8gYSBjaGVhcCBpZGVudGl0eSBjb21wYXJlIGhlcmUgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYVxuICAgICAgLy8gc3VwZXJmbHVvdXMgcmVjb25jaWxlLiBJdCdzIHBvc3NpYmxlIGZvciBzdGF0ZSB0byBiZSBtdXRhYmxlIGJ1dCBzdWNoXG4gICAgICAvLyBjaGFuZ2Ugc2hvdWxkIHRyaWdnZXIgYW4gdXBkYXRlIG9mIHRoZSBvd25lciB3aGljaCB3b3VsZCByZWNyZWF0ZVxuICAgICAgLy8gdGhlIGVsZW1lbnQuIFdlIGV4cGxpY2l0bHkgY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW4gb3duZXIgc2luY2VcbiAgICAgIC8vIGl0J3MgcG9zc2libGUgZm9yIGFuIGVsZW1lbnQgY3JlYXRlZCBvdXRzaWRlIGEgY29tcG9zaXRlIHRvIGJlXG4gICAgICAvLyBkZWVwbHkgbXV0YXRlZCBhbmQgcmV1c2VkLlxuXG4gICAgICAvLyBUT0RPOiBCYWlsaW5nIG91dCBlYXJseSBpcyBqdXN0IGEgcGVyZiBvcHRpbWl6YXRpb24gcmlnaHQ/XG4gICAgICAvLyBUT0RPOiBSZW1vdmluZyB0aGUgcmV0dXJuIHN0YXRlbWVudCBzaG91bGQgYWZmZWN0IGNvcnJlY3RuZXNzP1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCAhPT0gMCkge1xuICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWZvcmVVcGRhdGVDb21wb25lbnQoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCwgbmV4dEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByZWZzQ2hhbmdlZCA9IFJlYWN0UmVmLnNob3VsZFVwZGF0ZVJlZnMocHJldkVsZW1lbnQsIG5leHRFbGVtZW50KTtcblxuICAgIGlmIChyZWZzQ2hhbmdlZCkge1xuICAgICAgUmVhY3RSZWYuZGV0YWNoUmVmcyhpbnRlcm5hbEluc3RhbmNlLCBwcmV2RWxlbWVudCk7XG4gICAgfVxuXG4gICAgaW50ZXJuYWxJbnN0YW5jZS5yZWNlaXZlQ29tcG9uZW50KG5leHRFbGVtZW50LCB0cmFuc2FjdGlvbiwgY29udGV4dCk7XG5cbiAgICBpZiAocmVmc0NoYW5nZWQgJiYgaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQgJiYgaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQucmVmICE9IG51bGwpIHtcbiAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoYXR0YWNoUmVmcywgaW50ZXJuYWxJbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblVwZGF0ZUNvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZsdXNoIGFueSBkaXJ0eSBjaGFuZ2VzIGluIGEgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBpbnRlcm5hbEluc3RhbmNlXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwZXJmb3JtVXBkYXRlSWZOZWNlc3Nhcnk6IGZ1bmN0aW9uIChpbnRlcm5hbEluc3RhbmNlLCB0cmFuc2FjdGlvbiwgdXBkYXRlQmF0Y2hOdW1iZXIpIHtcbiAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fdXBkYXRlQmF0Y2hOdW1iZXIgIT09IHVwZGF0ZUJhdGNoTnVtYmVyKSB7XG4gICAgICAvLyBUaGUgY29tcG9uZW50J3MgZW5xdWV1ZWQgYmF0Y2ggbnVtYmVyIHNob3VsZCBhbHdheXMgYmUgdGhlIGN1cnJlbnRcbiAgICAgIC8vIGJhdGNoIG9yIHRoZSBmb2xsb3dpbmcgb25lLlxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoaW50ZXJuYWxJbnN0YW5jZS5fdXBkYXRlQmF0Y2hOdW1iZXIgPT0gbnVsbCB8fCBpbnRlcm5hbEluc3RhbmNlLl91cGRhdGVCYXRjaE51bWJlciA9PT0gdXBkYXRlQmF0Y2hOdW1iZXIgKyAxLCAncGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5OiBVbmV4cGVjdGVkIGJhdGNoIG51bWJlciAoY3VycmVudCAlcywgJyArICdwZW5kaW5nICVzKScsIHVwZGF0ZUJhdGNoTnVtYmVyLCBpbnRlcm5hbEluc3RhbmNlLl91cGRhdGVCYXRjaE51bWJlcikgOiB2b2lkIDA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCAhPT0gMCkge1xuICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWZvcmVVcGRhdGVDb21wb25lbnQoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCwgaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpbnRlcm5hbEluc3RhbmNlLnBlcmZvcm1VcGRhdGVJZk5lY2Vzc2FyeSh0cmFuc2FjdGlvbik7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblVwZGF0ZUNvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFJlY29uY2lsZXI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RSZWNvbmNpbGVyLmpzXG4vLyBtb2R1bGUgaWQgPSAyMzJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 233 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar ReactOwner = __webpack_require__(234);\n\nvar ReactRef = {};\n\nfunction attachRef(ref, component, owner) {\n  if (typeof ref === 'function') {\n    ref(component.getPublicInstance());\n  } else {\n    // Legacy ref\n    ReactOwner.addComponentAsRefTo(component, ref, owner);\n  }\n}\n\nfunction detachRef(ref, component, owner) {\n  if (typeof ref === 'function') {\n    ref(null);\n  } else {\n    // Legacy ref\n    ReactOwner.removeComponentAsRefFrom(component, ref, owner);\n  }\n}\n\nReactRef.attachRefs = function (instance, element) {\n  if (element === null || typeof element !== 'object') {\n    return;\n  }\n  var ref = element.ref;\n  if (ref != null) {\n    attachRef(ref, instance, element._owner);\n  }\n};\n\nReactRef.shouldUpdateRefs = function (prevElement, nextElement) {\n  // If either the owner or a `ref` has changed, make sure the newest owner\n  // has stored a reference to `this`, and the previous owner (if different)\n  // has forgotten the reference to `this`. We use the element instead\n  // of the public this.props because the post processing cannot determine\n  // a ref. The ref conceptually lives on the element.\n\n  // TODO: Should this even be possible? The owner cannot change because\n  // it's forbidden by shouldUpdateReactComponent. The ref can change\n  // if you swap the keys of but not the refs. Reconsider where this check\n  // is made. It probably belongs where the key checking and\n  // instantiateReactComponent is done.\n\n  var prevRef = null;\n  var prevOwner = null;\n  if (prevElement !== null && typeof prevElement === 'object') {\n    prevRef = prevElement.ref;\n    prevOwner = prevElement._owner;\n  }\n\n  var nextRef = null;\n  var nextOwner = null;\n  if (nextElement !== null && typeof nextElement === 'object') {\n    nextRef = nextElement.ref;\n    nextOwner = nextElement._owner;\n  }\n\n  return prevRef !== nextRef ||\n  // If owner changes but we have an unchanged function ref, don't update refs\n  typeof nextRef === 'string' && nextOwner !== prevOwner;\n};\n\nReactRef.detachRefs = function (instance, element) {\n  if (element === null || typeof element !== 'object') {\n    return;\n  }\n  var ref = element.ref;\n  if (ref != null) {\n    detachRef(ref, instance, element._owner);\n  }\n};\n\nmodule.exports = ReactRef;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0UmVmLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0T3duZXIgPSByZXF1aXJlKCcuL1JlYWN0T3duZXInKTtcblxudmFyIFJlYWN0UmVmID0ge307XG5cbmZ1bmN0aW9uIGF0dGFjaFJlZihyZWYsIGNvbXBvbmVudCwgb3duZXIpIHtcbiAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZWYoY29tcG9uZW50LmdldFB1YmxpY0luc3RhbmNlKCkpO1xuICB9IGVsc2Uge1xuICAgIC8vIExlZ2FjeSByZWZcbiAgICBSZWFjdE93bmVyLmFkZENvbXBvbmVudEFzUmVmVG8oY29tcG9uZW50LCByZWYsIG93bmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZXRhY2hSZWYocmVmLCBjb21wb25lbnQsIG93bmVyKSB7XG4gIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmVmKG51bGwpO1xuICB9IGVsc2Uge1xuICAgIC8vIExlZ2FjeSByZWZcbiAgICBSZWFjdE93bmVyLnJlbW92ZUNvbXBvbmVudEFzUmVmRnJvbShjb21wb25lbnQsIHJlZiwgb3duZXIpO1xuICB9XG59XG5cblJlYWN0UmVmLmF0dGFjaFJlZnMgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIGVsZW1lbnQpIHtcbiAgaWYgKGVsZW1lbnQgPT09IG51bGwgfHwgdHlwZW9mIGVsZW1lbnQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciByZWYgPSBlbGVtZW50LnJlZjtcbiAgaWYgKHJlZiAhPSBudWxsKSB7XG4gICAgYXR0YWNoUmVmKHJlZiwgaW5zdGFuY2UsIGVsZW1lbnQuX293bmVyKTtcbiAgfVxufTtcblxuUmVhY3RSZWYuc2hvdWxkVXBkYXRlUmVmcyA9IGZ1bmN0aW9uIChwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQpIHtcbiAgLy8gSWYgZWl0aGVyIHRoZSBvd25lciBvciBhIGByZWZgIGhhcyBjaGFuZ2VkLCBtYWtlIHN1cmUgdGhlIG5ld2VzdCBvd25lclxuICAvLyBoYXMgc3RvcmVkIGEgcmVmZXJlbmNlIHRvIGB0aGlzYCwgYW5kIHRoZSBwcmV2aW91cyBvd25lciAoaWYgZGlmZmVyZW50KVxuICAvLyBoYXMgZm9yZ290dGVuIHRoZSByZWZlcmVuY2UgdG8gYHRoaXNgLiBXZSB1c2UgdGhlIGVsZW1lbnQgaW5zdGVhZFxuICAvLyBvZiB0aGUgcHVibGljIHRoaXMucHJvcHMgYmVjYXVzZSB0aGUgcG9zdCBwcm9jZXNzaW5nIGNhbm5vdCBkZXRlcm1pbmVcbiAgLy8gYSByZWYuIFRoZSByZWYgY29uY2VwdHVhbGx5IGxpdmVzIG9uIHRoZSBlbGVtZW50LlxuXG4gIC8vIFRPRE86IFNob3VsZCB0aGlzIGV2ZW4gYmUgcG9zc2libGU/IFRoZSBvd25lciBjYW5ub3QgY2hhbmdlIGJlY2F1c2VcbiAgLy8gaXQncyBmb3JiaWRkZW4gYnkgc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQuIFRoZSByZWYgY2FuIGNoYW5nZVxuICAvLyBpZiB5b3Ugc3dhcCB0aGUga2V5cyBvZiBidXQgbm90IHRoZSByZWZzLiBSZWNvbnNpZGVyIHdoZXJlIHRoaXMgY2hlY2tcbiAgLy8gaXMgbWFkZS4gSXQgcHJvYmFibHkgYmVsb25ncyB3aGVyZSB0aGUga2V5IGNoZWNraW5nIGFuZFxuICAvLyBpbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50IGlzIGRvbmUuXG5cbiAgdmFyIHByZXZSZWYgPSBudWxsO1xuICB2YXIgcHJldk93bmVyID0gbnVsbDtcbiAgaWYgKHByZXZFbGVtZW50ICE9PSBudWxsICYmIHR5cGVvZiBwcmV2RWxlbWVudCA9PT0gJ29iamVjdCcpIHtcbiAgICBwcmV2UmVmID0gcHJldkVsZW1lbnQucmVmO1xuICAgIHByZXZPd25lciA9IHByZXZFbGVtZW50Ll9vd25lcjtcbiAgfVxuXG4gIHZhciBuZXh0UmVmID0gbnVsbDtcbiAgdmFyIG5leHRPd25lciA9IG51bGw7XG4gIGlmIChuZXh0RWxlbWVudCAhPT0gbnVsbCAmJiB0eXBlb2YgbmV4dEVsZW1lbnQgPT09ICdvYmplY3QnKSB7XG4gICAgbmV4dFJlZiA9IG5leHRFbGVtZW50LnJlZjtcbiAgICBuZXh0T3duZXIgPSBuZXh0RWxlbWVudC5fb3duZXI7XG4gIH1cblxuICByZXR1cm4gcHJldlJlZiAhPT0gbmV4dFJlZiB8fFxuICAvLyBJZiBvd25lciBjaGFuZ2VzIGJ1dCB3ZSBoYXZlIGFuIHVuY2hhbmdlZCBmdW5jdGlvbiByZWYsIGRvbid0IHVwZGF0ZSByZWZzXG4gIHR5cGVvZiBuZXh0UmVmID09PSAnc3RyaW5nJyAmJiBuZXh0T3duZXIgIT09IHByZXZPd25lcjtcbn07XG5cblJlYWN0UmVmLmRldGFjaFJlZnMgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIGVsZW1lbnQpIHtcbiAgaWYgKGVsZW1lbnQgPT09IG51bGwgfHwgdHlwZW9mIGVsZW1lbnQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciByZWYgPSBlbGVtZW50LnJlZjtcbiAgaWYgKHJlZiAhPSBudWxsKSB7XG4gICAgZGV0YWNoUmVmKHJlZiwgaW5zdGFuY2UsIGVsZW1lbnQuX293bmVyKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFJlZjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdFJlZi5qc1xuLy8gbW9kdWxlIGlkID0gMjMzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 234 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nvar invariant = __webpack_require__(180);\n\n/**\n * @param {?object} object\n * @return {boolean} True if `object` is a valid owner.\n * @final\n */\nfunction isValidOwner(object) {\n  return !!(object && typeof object.attachRef === 'function' && typeof object.detachRef === 'function');\n}\n\n/**\n * ReactOwners are capable of storing references to owned components.\n *\n * All components are capable of //being// referenced by owner components, but\n * only ReactOwner components are capable of //referencing// owned components.\n * The named reference is known as a \"ref\".\n *\n * Refs are available when mounted and updated during reconciliation.\n *\n *   var MyComponent = React.createClass({\n *     render: function() {\n *       return (\n *         <div onClick={this.handleClick}>\n *           <CustomComponent ref=\"custom\" />\n *         </div>\n *       );\n *     },\n *     handleClick: function() {\n *       this.refs.custom.handleClick();\n *     },\n *     componentDidMount: function() {\n *       this.refs.custom.initialize();\n *     }\n *   });\n *\n * Refs should rarely be used. When refs are used, they should only be done to\n * control data that is not handled by React's data flow.\n *\n * @class ReactOwner\n */\nvar ReactOwner = {\n  /**\n   * Adds a component by ref to an owner component.\n   *\n   * @param {ReactComponent} component Component to reference.\n   * @param {string} ref Name by which to refer to the component.\n   * @param {ReactOwner} owner Component on which to record the ref.\n   * @final\n   * @internal\n   */\n  addComponentAsRefTo: function (component, ref, owner) {\n    !isValidOwner(owner) ?  true ? invariant(false, 'addComponentAsRefTo(...): Only a ReactOwner can have refs. You might be adding a ref to a component that was not created inside a component\\'s `render` method, or you have multiple copies of React loaded (details: https://fb.me/react-refs-must-have-owner).') : _prodInvariant('119') : void 0;\n    owner.attachRef(ref, component);\n  },\n\n  /**\n   * Removes a component by ref from an owner component.\n   *\n   * @param {ReactComponent} component Component to dereference.\n   * @param {string} ref Name of the ref to remove.\n   * @param {ReactOwner} owner Component on which the ref is recorded.\n   * @final\n   * @internal\n   */\n  removeComponentAsRefFrom: function (component, ref, owner) {\n    !isValidOwner(owner) ?  true ? invariant(false, 'removeComponentAsRefFrom(...): Only a ReactOwner can have refs. You might be removing a ref to a component that was not created inside a component\\'s `render` method, or you have multiple copies of React loaded (details: https://fb.me/react-refs-must-have-owner).') : _prodInvariant('120') : void 0;\n    var ownerPublicInstance = owner.getPublicInstance();\n    // Check that `component`'s owner is still alive and that `component` is still the current ref\n    // because we do not want to detach the ref if another component stole it.\n    if (ownerPublicInstance && ownerPublicInstance.refs[ref] === component.getPublicInstance()) {\n      owner.detachRef(ref);\n    }\n  }\n\n};\n\nmodule.exports = ReactOwner;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0T3duZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogQHBhcmFtIHs/b2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYG9iamVjdGAgaXMgYSB2YWxpZCBvd25lci5cbiAqIEBmaW5hbFxuICovXG5mdW5jdGlvbiBpc1ZhbGlkT3duZXIob2JqZWN0KSB7XG4gIHJldHVybiAhIShvYmplY3QgJiYgdHlwZW9mIG9iamVjdC5hdHRhY2hSZWYgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG9iamVjdC5kZXRhY2hSZWYgPT09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIFJlYWN0T3duZXJzIGFyZSBjYXBhYmxlIG9mIHN0b3JpbmcgcmVmZXJlbmNlcyB0byBvd25lZCBjb21wb25lbnRzLlxuICpcbiAqIEFsbCBjb21wb25lbnRzIGFyZSBjYXBhYmxlIG9mIC8vYmVpbmcvLyByZWZlcmVuY2VkIGJ5IG93bmVyIGNvbXBvbmVudHMsIGJ1dFxuICogb25seSBSZWFjdE93bmVyIGNvbXBvbmVudHMgYXJlIGNhcGFibGUgb2YgLy9yZWZlcmVuY2luZy8vIG93bmVkIGNvbXBvbmVudHMuXG4gKiBUaGUgbmFtZWQgcmVmZXJlbmNlIGlzIGtub3duIGFzIGEgXCJyZWZcIi5cbiAqXG4gKiBSZWZzIGFyZSBhdmFpbGFibGUgd2hlbiBtb3VudGVkIGFuZCB1cGRhdGVkIGR1cmluZyByZWNvbmNpbGlhdGlvbi5cbiAqXG4gKiAgIHZhciBNeUNvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAqICAgICByZW5kZXI6IGZ1bmN0aW9uKCkge1xuICogICAgICAgcmV0dXJuIChcbiAqICAgICAgICAgPGRpdiBvbkNsaWNrPXt0aGlzLmhhbmRsZUNsaWNrfT5cbiAqICAgICAgICAgICA8Q3VzdG9tQ29tcG9uZW50IHJlZj1cImN1c3RvbVwiIC8+XG4gKiAgICAgICAgIDwvZGl2PlxuICogICAgICAgKTtcbiAqICAgICB9LFxuICogICAgIGhhbmRsZUNsaWNrOiBmdW5jdGlvbigpIHtcbiAqICAgICAgIHRoaXMucmVmcy5jdXN0b20uaGFuZGxlQ2xpY2soKTtcbiAqICAgICB9LFxuICogICAgIGNvbXBvbmVudERpZE1vdW50OiBmdW5jdGlvbigpIHtcbiAqICAgICAgIHRoaXMucmVmcy5jdXN0b20uaW5pdGlhbGl6ZSgpO1xuICogICAgIH1cbiAqICAgfSk7XG4gKlxuICogUmVmcyBzaG91bGQgcmFyZWx5IGJlIHVzZWQuIFdoZW4gcmVmcyBhcmUgdXNlZCwgdGhleSBzaG91bGQgb25seSBiZSBkb25lIHRvXG4gKiBjb250cm9sIGRhdGEgdGhhdCBpcyBub3QgaGFuZGxlZCBieSBSZWFjdCdzIGRhdGEgZmxvdy5cbiAqXG4gKiBAY2xhc3MgUmVhY3RPd25lclxuICovXG52YXIgUmVhY3RPd25lciA9IHtcbiAgLyoqXG4gICAqIEFkZHMgYSBjb21wb25lbnQgYnkgcmVmIHRvIGFuIG93bmVyIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY29tcG9uZW50IENvbXBvbmVudCB0byByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWYgTmFtZSBieSB3aGljaCB0byByZWZlciB0byB0aGUgY29tcG9uZW50LlxuICAgKiBAcGFyYW0ge1JlYWN0T3duZXJ9IG93bmVyIENvbXBvbmVudCBvbiB3aGljaCB0byByZWNvcmQgdGhlIHJlZi5cbiAgICogQGZpbmFsXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgYWRkQ29tcG9uZW50QXNSZWZUbzogZnVuY3Rpb24gKGNvbXBvbmVudCwgcmVmLCBvd25lcikge1xuICAgICFpc1ZhbGlkT3duZXIob3duZXIpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2FkZENvbXBvbmVudEFzUmVmVG8oLi4uKTogT25seSBhIFJlYWN0T3duZXIgY2FuIGhhdmUgcmVmcy4gWW91IG1pZ2h0IGJlIGFkZGluZyBhIHJlZiB0byBhIGNvbXBvbmVudCB0aGF0IHdhcyBub3QgY3JlYXRlZCBpbnNpZGUgYSBjb21wb25lbnRcXCdzIGByZW5kZXJgIG1ldGhvZCwgb3IgeW91IGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IGxvYWRlZCAoZGV0YWlsczogaHR0cHM6Ly9mYi5tZS9yZWFjdC1yZWZzLW11c3QtaGF2ZS1vd25lcikuJykgOiBfcHJvZEludmFyaWFudCgnMTE5JykgOiB2b2lkIDA7XG4gICAgb3duZXIuYXR0YWNoUmVmKHJlZiwgY29tcG9uZW50KTtcbiAgfSxcblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGNvbXBvbmVudCBieSByZWYgZnJvbSBhbiBvd25lciBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGNvbXBvbmVudCBDb21wb25lbnQgdG8gZGVyZWZlcmVuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWYgTmFtZSBvZiB0aGUgcmVmIHRvIHJlbW92ZS5cbiAgICogQHBhcmFtIHtSZWFjdE93bmVyfSBvd25lciBDb21wb25lbnQgb24gd2hpY2ggdGhlIHJlZiBpcyByZWNvcmRlZC5cbiAgICogQGZpbmFsXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcmVtb3ZlQ29tcG9uZW50QXNSZWZGcm9tOiBmdW5jdGlvbiAoY29tcG9uZW50LCByZWYsIG93bmVyKSB7XG4gICAgIWlzVmFsaWRPd25lcihvd25lcikgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAncmVtb3ZlQ29tcG9uZW50QXNSZWZGcm9tKC4uLik6IE9ubHkgYSBSZWFjdE93bmVyIGNhbiBoYXZlIHJlZnMuIFlvdSBtaWdodCBiZSByZW1vdmluZyBhIHJlZiB0byBhIGNvbXBvbmVudCB0aGF0IHdhcyBub3QgY3JlYXRlZCBpbnNpZGUgYSBjb21wb25lbnRcXCdzIGByZW5kZXJgIG1ldGhvZCwgb3IgeW91IGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IGxvYWRlZCAoZGV0YWlsczogaHR0cHM6Ly9mYi5tZS9yZWFjdC1yZWZzLW11c3QtaGF2ZS1vd25lcikuJykgOiBfcHJvZEludmFyaWFudCgnMTIwJykgOiB2b2lkIDA7XG4gICAgdmFyIG93bmVyUHVibGljSW5zdGFuY2UgPSBvd25lci5nZXRQdWJsaWNJbnN0YW5jZSgpO1xuICAgIC8vIENoZWNrIHRoYXQgYGNvbXBvbmVudGAncyBvd25lciBpcyBzdGlsbCBhbGl2ZSBhbmQgdGhhdCBgY29tcG9uZW50YCBpcyBzdGlsbCB0aGUgY3VycmVudCByZWZcbiAgICAvLyBiZWNhdXNlIHdlIGRvIG5vdCB3YW50IHRvIGRldGFjaCB0aGUgcmVmIGlmIGFub3RoZXIgY29tcG9uZW50IHN0b2xlIGl0LlxuICAgIGlmIChvd25lclB1YmxpY0luc3RhbmNlICYmIG93bmVyUHVibGljSW5zdGFuY2UucmVmc1tyZWZdID09PSBjb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKSkge1xuICAgICAgb3duZXIuZGV0YWNoUmVmKHJlZik7XG4gICAgfVxuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RPd25lcjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdE93bmVyLmpzXG4vLyBtb2R1bGUgaWQgPSAyMzRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 235 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2016-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\n// Trust the developer to only use ReactInstrumentation with a __DEV__ check\n\nvar debugTool = null;\n\nif (true) {\n  var ReactDebugTool = __webpack_require__(236);\n  debugTool = ReactDebugTool;\n}\n\nmodule.exports = { debugTool: debugTool };//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0SW5zdHJ1bWVudGF0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTYtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gVHJ1c3QgdGhlIGRldmVsb3BlciB0byBvbmx5IHVzZSBSZWFjdEluc3RydW1lbnRhdGlvbiB3aXRoIGEgX19ERVZfXyBjaGVja1xuXG52YXIgZGVidWdUb29sID0gbnVsbDtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0RGVidWdUb29sID0gcmVxdWlyZSgnLi9SZWFjdERlYnVnVG9vbCcpO1xuICBkZWJ1Z1Rvb2wgPSBSZWFjdERlYnVnVG9vbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7IGRlYnVnVG9vbDogZGVidWdUb29sIH07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RJbnN0cnVtZW50YXRpb24uanNcbi8vIG1vZHVsZSBpZCA9IDIzNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 236 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2016-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar ReactInvalidSetStateWarningHook = __webpack_require__(237);\nvar ReactHostOperationHistoryHook = __webpack_require__(238);\nvar ReactComponentTreeHook = __webpack_require__(198);\nvar ExecutionEnvironment = __webpack_require__(221);\n\nvar performanceNow = __webpack_require__(239);\nvar warning = __webpack_require__(183);\n\nvar hooks = [];\nvar didHookThrowForEvent = {};\n\nfunction callHook(event, fn, context, arg1, arg2, arg3, arg4, arg5) {\n  try {\n    fn.call(context, arg1, arg2, arg3, arg4, arg5);\n  } catch (e) {\n     true ? warning(didHookThrowForEvent[event], 'Exception thrown by hook while handling %s: %s', event, e + '\\n' + e.stack) : void 0;\n    didHookThrowForEvent[event] = true;\n  }\n}\n\nfunction emitEvent(event, arg1, arg2, arg3, arg4, arg5) {\n  for (var i = 0; i < hooks.length; i++) {\n    var hook = hooks[i];\n    var fn = hook[event];\n    if (fn) {\n      callHook(event, fn, hook, arg1, arg2, arg3, arg4, arg5);\n    }\n  }\n}\n\nvar isProfiling = false;\nvar flushHistory = [];\nvar lifeCycleTimerStack = [];\nvar currentFlushNesting = 0;\nvar currentFlushMeasurements = [];\nvar currentFlushStartTime = 0;\nvar currentTimerDebugID = null;\nvar currentTimerStartTime = 0;\nvar currentTimerNestedFlushDuration = 0;\nvar currentTimerType = null;\n\nvar lifeCycleTimerHasWarned = false;\n\nfunction clearHistory() {\n  ReactComponentTreeHook.purgeUnmountedComponents();\n  ReactHostOperationHistoryHook.clearHistory();\n}\n\nfunction getTreeSnapshot(registeredIDs) {\n  return registeredIDs.reduce(function (tree, id) {\n    var ownerID = ReactComponentTreeHook.getOwnerID(id);\n    var parentID = ReactComponentTreeHook.getParentID(id);\n    tree[id] = {\n      displayName: ReactComponentTreeHook.getDisplayName(id),\n      text: ReactComponentTreeHook.getText(id),\n      updateCount: ReactComponentTreeHook.getUpdateCount(id),\n      childIDs: ReactComponentTreeHook.getChildIDs(id),\n      // Text nodes don't have owners but this is close enough.\n      ownerID: ownerID || parentID && ReactComponentTreeHook.getOwnerID(parentID) || 0,\n      parentID: parentID\n    };\n    return tree;\n  }, {});\n}\n\nfunction resetMeasurements() {\n  var previousStartTime = currentFlushStartTime;\n  var previousMeasurements = currentFlushMeasurements;\n  var previousOperations = ReactHostOperationHistoryHook.getHistory();\n\n  if (currentFlushNesting === 0) {\n    currentFlushStartTime = 0;\n    currentFlushMeasurements = [];\n    clearHistory();\n    return;\n  }\n\n  if (previousMeasurements.length || previousOperations.length) {\n    var registeredIDs = ReactComponentTreeHook.getRegisteredIDs();\n    flushHistory.push({\n      duration: performanceNow() - previousStartTime,\n      measurements: previousMeasurements || [],\n      operations: previousOperations || [],\n      treeSnapshot: getTreeSnapshot(registeredIDs)\n    });\n  }\n\n  clearHistory();\n  currentFlushStartTime = performanceNow();\n  currentFlushMeasurements = [];\n}\n\nfunction checkDebugID(debugID) {\n  var allowRoot = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n  if (allowRoot && debugID === 0) {\n    return;\n  }\n  if (!debugID) {\n     true ? warning(false, 'ReactDebugTool: debugID may not be empty.') : void 0;\n  }\n}\n\nfunction beginLifeCycleTimer(debugID, timerType) {\n  if (currentFlushNesting === 0) {\n    return;\n  }\n  if (currentTimerType && !lifeCycleTimerHasWarned) {\n     true ? warning(false, 'There is an internal error in the React performance measurement code. ' + 'Did not expect %s timer to start while %s timer is still in ' + 'progress for %s instance.', timerType, currentTimerType || 'no', debugID === currentTimerDebugID ? 'the same' : 'another') : void 0;\n    lifeCycleTimerHasWarned = true;\n  }\n  currentTimerStartTime = performanceNow();\n  currentTimerNestedFlushDuration = 0;\n  currentTimerDebugID = debugID;\n  currentTimerType = timerType;\n}\n\nfunction endLifeCycleTimer(debugID, timerType) {\n  if (currentFlushNesting === 0) {\n    return;\n  }\n  if (currentTimerType !== timerType && !lifeCycleTimerHasWarned) {\n     true ? warning(false, 'There is an internal error in the React performance measurement code. ' + 'We did not expect %s timer to stop while %s timer is still in ' + 'progress for %s instance. Please report this as a bug in React.', timerType, currentTimerType || 'no', debugID === currentTimerDebugID ? 'the same' : 'another') : void 0;\n    lifeCycleTimerHasWarned = true;\n  }\n  if (isProfiling) {\n    currentFlushMeasurements.push({\n      timerType: timerType,\n      instanceID: debugID,\n      duration: performanceNow() - currentTimerStartTime - currentTimerNestedFlushDuration\n    });\n  }\n  currentTimerStartTime = 0;\n  currentTimerNestedFlushDuration = 0;\n  currentTimerDebugID = null;\n  currentTimerType = null;\n}\n\nfunction pauseCurrentLifeCycleTimer() {\n  var currentTimer = {\n    startTime: currentTimerStartTime,\n    nestedFlushStartTime: performanceNow(),\n    debugID: currentTimerDebugID,\n    timerType: currentTimerType\n  };\n  lifeCycleTimerStack.push(currentTimer);\n  currentTimerStartTime = 0;\n  currentTimerNestedFlushDuration = 0;\n  currentTimerDebugID = null;\n  currentTimerType = null;\n}\n\nfunction resumeCurrentLifeCycleTimer() {\n  var _lifeCycleTimerStack$ = lifeCycleTimerStack.pop(),\n      startTime = _lifeCycleTimerStack$.startTime,\n      nestedFlushStartTime = _lifeCycleTimerStack$.nestedFlushStartTime,\n      debugID = _lifeCycleTimerStack$.debugID,\n      timerType = _lifeCycleTimerStack$.timerType;\n\n  var nestedFlushDuration = performanceNow() - nestedFlushStartTime;\n  currentTimerStartTime = startTime;\n  currentTimerNestedFlushDuration += nestedFlushDuration;\n  currentTimerDebugID = debugID;\n  currentTimerType = timerType;\n}\n\nvar lastMarkTimeStamp = 0;\nvar canUsePerformanceMeasure =\n// $FlowFixMe https://github.com/facebook/flow/issues/2345\ntypeof performance !== 'undefined' && typeof performance.mark === 'function' && typeof performance.clearMarks === 'function' && typeof performance.measure === 'function' && typeof performance.clearMeasures === 'function';\n\nfunction shouldMark(debugID) {\n  if (!isProfiling || !canUsePerformanceMeasure) {\n    return false;\n  }\n  var element = ReactComponentTreeHook.getElement(debugID);\n  if (element == null || typeof element !== 'object') {\n    return false;\n  }\n  var isHostElement = typeof element.type === 'string';\n  if (isHostElement) {\n    return false;\n  }\n  return true;\n}\n\nfunction markBegin(debugID, markType) {\n  if (!shouldMark(debugID)) {\n    return;\n  }\n\n  var markName = debugID + '::' + markType;\n  lastMarkTimeStamp = performanceNow();\n  performance.mark(markName);\n}\n\nfunction markEnd(debugID, markType) {\n  if (!shouldMark(debugID)) {\n    return;\n  }\n\n  var markName = debugID + '::' + markType;\n  var displayName = ReactComponentTreeHook.getDisplayName(debugID) || 'Unknown';\n\n  // Chrome has an issue of dropping markers recorded too fast:\n  // https://bugs.chromium.org/p/chromium/issues/detail?id=640652\n  // To work around this, we will not report very small measurements.\n  // I determined the magic number by tweaking it back and forth.\n  // 0.05ms was enough to prevent the issue, but I set it to 0.1ms to be safe.\n  // When the bug is fixed, we can `measure()` unconditionally if we want to.\n  var timeStamp = performanceNow();\n  if (timeStamp - lastMarkTimeStamp > 0.1) {\n    var measurementName = displayName + ' [' + markType + ']';\n    performance.measure(measurementName, markName);\n  }\n\n  performance.clearMarks(markName);\n  performance.clearMeasures(measurementName);\n}\n\nvar ReactDebugTool = {\n  addHook: function (hook) {\n    hooks.push(hook);\n  },\n  removeHook: function (hook) {\n    for (var i = 0; i < hooks.length; i++) {\n      if (hooks[i] === hook) {\n        hooks.splice(i, 1);\n        i--;\n      }\n    }\n  },\n  isProfiling: function () {\n    return isProfiling;\n  },\n  beginProfiling: function () {\n    if (isProfiling) {\n      return;\n    }\n\n    isProfiling = true;\n    flushHistory.length = 0;\n    resetMeasurements();\n    ReactDebugTool.addHook(ReactHostOperationHistoryHook);\n  },\n  endProfiling: function () {\n    if (!isProfiling) {\n      return;\n    }\n\n    isProfiling = false;\n    resetMeasurements();\n    ReactDebugTool.removeHook(ReactHostOperationHistoryHook);\n  },\n  getFlushHistory: function () {\n    return flushHistory;\n  },\n  onBeginFlush: function () {\n    currentFlushNesting++;\n    resetMeasurements();\n    pauseCurrentLifeCycleTimer();\n    emitEvent('onBeginFlush');\n  },\n  onEndFlush: function () {\n    resetMeasurements();\n    currentFlushNesting--;\n    resumeCurrentLifeCycleTimer();\n    emitEvent('onEndFlush');\n  },\n  onBeginLifeCycleTimer: function (debugID, timerType) {\n    checkDebugID(debugID);\n    emitEvent('onBeginLifeCycleTimer', debugID, timerType);\n    markBegin(debugID, timerType);\n    beginLifeCycleTimer(debugID, timerType);\n  },\n  onEndLifeCycleTimer: function (debugID, timerType) {\n    checkDebugID(debugID);\n    endLifeCycleTimer(debugID, timerType);\n    markEnd(debugID, timerType);\n    emitEvent('onEndLifeCycleTimer', debugID, timerType);\n  },\n  onBeginProcessingChildContext: function () {\n    emitEvent('onBeginProcessingChildContext');\n  },\n  onEndProcessingChildContext: function () {\n    emitEvent('onEndProcessingChildContext');\n  },\n  onHostOperation: function (operation) {\n    checkDebugID(operation.instanceID);\n    emitEvent('onHostOperation', operation);\n  },\n  onSetState: function () {\n    emitEvent('onSetState');\n  },\n  onSetChildren: function (debugID, childDebugIDs) {\n    checkDebugID(debugID);\n    childDebugIDs.forEach(checkDebugID);\n    emitEvent('onSetChildren', debugID, childDebugIDs);\n  },\n  onBeforeMountComponent: function (debugID, element, parentDebugID) {\n    checkDebugID(debugID);\n    checkDebugID(parentDebugID, true);\n    emitEvent('onBeforeMountComponent', debugID, element, parentDebugID);\n    markBegin(debugID, 'mount');\n  },\n  onMountComponent: function (debugID) {\n    checkDebugID(debugID);\n    markEnd(debugID, 'mount');\n    emitEvent('onMountComponent', debugID);\n  },\n  onBeforeUpdateComponent: function (debugID, element) {\n    checkDebugID(debugID);\n    emitEvent('onBeforeUpdateComponent', debugID, element);\n    markBegin(debugID, 'update');\n  },\n  onUpdateComponent: function (debugID) {\n    checkDebugID(debugID);\n    markEnd(debugID, 'update');\n    emitEvent('onUpdateComponent', debugID);\n  },\n  onBeforeUnmountComponent: function (debugID) {\n    checkDebugID(debugID);\n    emitEvent('onBeforeUnmountComponent', debugID);\n    markBegin(debugID, 'unmount');\n  },\n  onUnmountComponent: function (debugID) {\n    checkDebugID(debugID);\n    markEnd(debugID, 'unmount');\n    emitEvent('onUnmountComponent', debugID);\n  },\n  onTestEvent: function () {\n    emitEvent('onTestEvent');\n  }\n};\n\n// TODO remove these when RN/www gets updated\nReactDebugTool.addDevtool = ReactDebugTool.addHook;\nReactDebugTool.removeDevtool = ReactDebugTool.removeHook;\n\nReactDebugTool.addHook(ReactInvalidSetStateWarningHook);\nReactDebugTool.addHook(ReactComponentTreeHook);\nvar url = ExecutionEnvironment.canUseDOM && window.location.href || '';\nif (/[?&]react_perf\\b/.test(url)) {\n  ReactDebugTool.beginProfiling();\n}\n\nmodule.exports = ReactDebugTool;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RGVidWdUb29sLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTYtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0SW52YWxpZFNldFN0YXRlV2FybmluZ0hvb2sgPSByZXF1aXJlKCcuL1JlYWN0SW52YWxpZFNldFN0YXRlV2FybmluZ0hvb2snKTtcbnZhciBSZWFjdEhvc3RPcGVyYXRpb25IaXN0b3J5SG9vayA9IHJlcXVpcmUoJy4vUmVhY3RIb3N0T3BlcmF0aW9uSGlzdG9yeUhvb2snKTtcbnZhciBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG5cbnZhciBwZXJmb3JtYW5jZU5vdyA9IHJlcXVpcmUoJ2ZianMvbGliL3BlcmZvcm1hbmNlTm93Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIGhvb2tzID0gW107XG52YXIgZGlkSG9va1Rocm93Rm9yRXZlbnQgPSB7fTtcblxuZnVuY3Rpb24gY2FsbEhvb2soZXZlbnQsIGZuLCBjb250ZXh0LCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KSB7XG4gIHRyeSB7XG4gICAgZm4uY2FsbChjb250ZXh0LCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGRpZEhvb2tUaHJvd0ZvckV2ZW50W2V2ZW50XSwgJ0V4Y2VwdGlvbiB0aHJvd24gYnkgaG9vayB3aGlsZSBoYW5kbGluZyAlczogJXMnLCBldmVudCwgZSArICdcXG4nICsgZS5zdGFjaykgOiB2b2lkIDA7XG4gICAgZGlkSG9va1Rocm93Rm9yRXZlbnRbZXZlbnRdID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0RXZlbnQoZXZlbnQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBob29rID0gaG9va3NbaV07XG4gICAgdmFyIGZuID0gaG9va1tldmVudF07XG4gICAgaWYgKGZuKSB7XG4gICAgICBjYWxsSG9vayhldmVudCwgZm4sIGhvb2ssIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgaXNQcm9maWxpbmcgPSBmYWxzZTtcbnZhciBmbHVzaEhpc3RvcnkgPSBbXTtcbnZhciBsaWZlQ3ljbGVUaW1lclN0YWNrID0gW107XG52YXIgY3VycmVudEZsdXNoTmVzdGluZyA9IDA7XG52YXIgY3VycmVudEZsdXNoTWVhc3VyZW1lbnRzID0gW107XG52YXIgY3VycmVudEZsdXNoU3RhcnRUaW1lID0gMDtcbnZhciBjdXJyZW50VGltZXJEZWJ1Z0lEID0gbnVsbDtcbnZhciBjdXJyZW50VGltZXJTdGFydFRpbWUgPSAwO1xudmFyIGN1cnJlbnRUaW1lck5lc3RlZEZsdXNoRHVyYXRpb24gPSAwO1xudmFyIGN1cnJlbnRUaW1lclR5cGUgPSBudWxsO1xuXG52YXIgbGlmZUN5Y2xlVGltZXJIYXNXYXJuZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gY2xlYXJIaXN0b3J5KCkge1xuICBSZWFjdENvbXBvbmVudFRyZWVIb29rLnB1cmdlVW5tb3VudGVkQ29tcG9uZW50cygpO1xuICBSZWFjdEhvc3RPcGVyYXRpb25IaXN0b3J5SG9vay5jbGVhckhpc3RvcnkoKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJlZVNuYXBzaG90KHJlZ2lzdGVyZWRJRHMpIHtcbiAgcmV0dXJuIHJlZ2lzdGVyZWRJRHMucmVkdWNlKGZ1bmN0aW9uICh0cmVlLCBpZCkge1xuICAgIHZhciBvd25lcklEID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRPd25lcklEKGlkKTtcbiAgICB2YXIgcGFyZW50SUQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFBhcmVudElEKGlkKTtcbiAgICB0cmVlW2lkXSA9IHtcbiAgICAgIGRpc3BsYXlOYW1lOiBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldERpc3BsYXlOYW1lKGlkKSxcbiAgICAgIHRleHQ6IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0VGV4dChpZCksXG4gICAgICB1cGRhdGVDb3VudDogUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRVcGRhdGVDb3VudChpZCksXG4gICAgICBjaGlsZElEczogUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRDaGlsZElEcyhpZCksXG4gICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUgb3duZXJzIGJ1dCB0aGlzIGlzIGNsb3NlIGVub3VnaC5cbiAgICAgIG93bmVySUQ6IG93bmVySUQgfHwgcGFyZW50SUQgJiYgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRPd25lcklEKHBhcmVudElEKSB8fCAwLFxuICAgICAgcGFyZW50SUQ6IHBhcmVudElEXG4gICAgfTtcbiAgICByZXR1cm4gdHJlZTtcbiAgfSwge30pO1xufVxuXG5mdW5jdGlvbiByZXNldE1lYXN1cmVtZW50cygpIHtcbiAgdmFyIHByZXZpb3VzU3RhcnRUaW1lID0gY3VycmVudEZsdXNoU3RhcnRUaW1lO1xuICB2YXIgcHJldmlvdXNNZWFzdXJlbWVudHMgPSBjdXJyZW50Rmx1c2hNZWFzdXJlbWVudHM7XG4gIHZhciBwcmV2aW91c09wZXJhdGlvbnMgPSBSZWFjdEhvc3RPcGVyYXRpb25IaXN0b3J5SG9vay5nZXRIaXN0b3J5KCk7XG5cbiAgaWYgKGN1cnJlbnRGbHVzaE5lc3RpbmcgPT09IDApIHtcbiAgICBjdXJyZW50Rmx1c2hTdGFydFRpbWUgPSAwO1xuICAgIGN1cnJlbnRGbHVzaE1lYXN1cmVtZW50cyA9IFtdO1xuICAgIGNsZWFySGlzdG9yeSgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChwcmV2aW91c01lYXN1cmVtZW50cy5sZW5ndGggfHwgcHJldmlvdXNPcGVyYXRpb25zLmxlbmd0aCkge1xuICAgIHZhciByZWdpc3RlcmVkSURzID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRSZWdpc3RlcmVkSURzKCk7XG4gICAgZmx1c2hIaXN0b3J5LnB1c2goe1xuICAgICAgZHVyYXRpb246IHBlcmZvcm1hbmNlTm93KCkgLSBwcmV2aW91c1N0YXJ0VGltZSxcbiAgICAgIG1lYXN1cmVtZW50czogcHJldmlvdXNNZWFzdXJlbWVudHMgfHwgW10sXG4gICAgICBvcGVyYXRpb25zOiBwcmV2aW91c09wZXJhdGlvbnMgfHwgW10sXG4gICAgICB0cmVlU25hcHNob3Q6IGdldFRyZWVTbmFwc2hvdChyZWdpc3RlcmVkSURzKVxuICAgIH0pO1xuICB9XG5cbiAgY2xlYXJIaXN0b3J5KCk7XG4gIGN1cnJlbnRGbHVzaFN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG4gIGN1cnJlbnRGbHVzaE1lYXN1cmVtZW50cyA9IFtdO1xufVxuXG5mdW5jdGlvbiBjaGVja0RlYnVnSUQoZGVidWdJRCkge1xuICB2YXIgYWxsb3dSb290ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcblxuICBpZiAoYWxsb3dSb290ICYmIGRlYnVnSUQgPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFkZWJ1Z0lEKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdSZWFjdERlYnVnVG9vbDogZGVidWdJRCBtYXkgbm90IGJlIGVtcHR5LicpIDogdm9pZCAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJlZ2luTGlmZUN5Y2xlVGltZXIoZGVidWdJRCwgdGltZXJUeXBlKSB7XG4gIGlmIChjdXJyZW50Rmx1c2hOZXN0aW5nID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChjdXJyZW50VGltZXJUeXBlICYmICFsaWZlQ3ljbGVUaW1lckhhc1dhcm5lZCkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVGhlcmUgaXMgYW4gaW50ZXJuYWwgZXJyb3IgaW4gdGhlIFJlYWN0IHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IGNvZGUuICcgKyAnRGlkIG5vdCBleHBlY3QgJXMgdGltZXIgdG8gc3RhcnQgd2hpbGUgJXMgdGltZXIgaXMgc3RpbGwgaW4gJyArICdwcm9ncmVzcyBmb3IgJXMgaW5zdGFuY2UuJywgdGltZXJUeXBlLCBjdXJyZW50VGltZXJUeXBlIHx8ICdubycsIGRlYnVnSUQgPT09IGN1cnJlbnRUaW1lckRlYnVnSUQgPyAndGhlIHNhbWUnIDogJ2Fub3RoZXInKSA6IHZvaWQgMDtcbiAgICBsaWZlQ3ljbGVUaW1lckhhc1dhcm5lZCA9IHRydWU7XG4gIH1cbiAgY3VycmVudFRpbWVyU3RhcnRUaW1lID0gcGVyZm9ybWFuY2VOb3coKTtcbiAgY3VycmVudFRpbWVyTmVzdGVkRmx1c2hEdXJhdGlvbiA9IDA7XG4gIGN1cnJlbnRUaW1lckRlYnVnSUQgPSBkZWJ1Z0lEO1xuICBjdXJyZW50VGltZXJUeXBlID0gdGltZXJUeXBlO1xufVxuXG5mdW5jdGlvbiBlbmRMaWZlQ3ljbGVUaW1lcihkZWJ1Z0lELCB0aW1lclR5cGUpIHtcbiAgaWYgKGN1cnJlbnRGbHVzaE5lc3RpbmcgPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGN1cnJlbnRUaW1lclR5cGUgIT09IHRpbWVyVHlwZSAmJiAhbGlmZUN5Y2xlVGltZXJIYXNXYXJuZWQpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1RoZXJlIGlzIGFuIGludGVybmFsIGVycm9yIGluIHRoZSBSZWFjdCBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudCBjb2RlLiAnICsgJ1dlIGRpZCBub3QgZXhwZWN0ICVzIHRpbWVyIHRvIHN0b3Agd2hpbGUgJXMgdGltZXIgaXMgc3RpbGwgaW4gJyArICdwcm9ncmVzcyBmb3IgJXMgaW5zdGFuY2UuIFBsZWFzZSByZXBvcnQgdGhpcyBhcyBhIGJ1ZyBpbiBSZWFjdC4nLCB0aW1lclR5cGUsIGN1cnJlbnRUaW1lclR5cGUgfHwgJ25vJywgZGVidWdJRCA9PT0gY3VycmVudFRpbWVyRGVidWdJRCA/ICd0aGUgc2FtZScgOiAnYW5vdGhlcicpIDogdm9pZCAwO1xuICAgIGxpZmVDeWNsZVRpbWVySGFzV2FybmVkID0gdHJ1ZTtcbiAgfVxuICBpZiAoaXNQcm9maWxpbmcpIHtcbiAgICBjdXJyZW50Rmx1c2hNZWFzdXJlbWVudHMucHVzaCh7XG4gICAgICB0aW1lclR5cGU6IHRpbWVyVHlwZSxcbiAgICAgIGluc3RhbmNlSUQ6IGRlYnVnSUQsXG4gICAgICBkdXJhdGlvbjogcGVyZm9ybWFuY2VOb3coKSAtIGN1cnJlbnRUaW1lclN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lck5lc3RlZEZsdXNoRHVyYXRpb25cbiAgICB9KTtcbiAgfVxuICBjdXJyZW50VGltZXJTdGFydFRpbWUgPSAwO1xuICBjdXJyZW50VGltZXJOZXN0ZWRGbHVzaER1cmF0aW9uID0gMDtcbiAgY3VycmVudFRpbWVyRGVidWdJRCA9IG51bGw7XG4gIGN1cnJlbnRUaW1lclR5cGUgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBwYXVzZUN1cnJlbnRMaWZlQ3ljbGVUaW1lcigpIHtcbiAgdmFyIGN1cnJlbnRUaW1lciA9IHtcbiAgICBzdGFydFRpbWU6IGN1cnJlbnRUaW1lclN0YXJ0VGltZSxcbiAgICBuZXN0ZWRGbHVzaFN0YXJ0VGltZTogcGVyZm9ybWFuY2VOb3coKSxcbiAgICBkZWJ1Z0lEOiBjdXJyZW50VGltZXJEZWJ1Z0lELFxuICAgIHRpbWVyVHlwZTogY3VycmVudFRpbWVyVHlwZVxuICB9O1xuICBsaWZlQ3ljbGVUaW1lclN0YWNrLnB1c2goY3VycmVudFRpbWVyKTtcbiAgY3VycmVudFRpbWVyU3RhcnRUaW1lID0gMDtcbiAgY3VycmVudFRpbWVyTmVzdGVkRmx1c2hEdXJhdGlvbiA9IDA7XG4gIGN1cnJlbnRUaW1lckRlYnVnSUQgPSBudWxsO1xuICBjdXJyZW50VGltZXJUeXBlID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVzdW1lQ3VycmVudExpZmVDeWNsZVRpbWVyKCkge1xuICB2YXIgX2xpZmVDeWNsZVRpbWVyU3RhY2skID0gbGlmZUN5Y2xlVGltZXJTdGFjay5wb3AoKSxcbiAgICAgIHN0YXJ0VGltZSA9IF9saWZlQ3ljbGVUaW1lclN0YWNrJC5zdGFydFRpbWUsXG4gICAgICBuZXN0ZWRGbHVzaFN0YXJ0VGltZSA9IF9saWZlQ3ljbGVUaW1lclN0YWNrJC5uZXN0ZWRGbHVzaFN0YXJ0VGltZSxcbiAgICAgIGRlYnVnSUQgPSBfbGlmZUN5Y2xlVGltZXJTdGFjayQuZGVidWdJRCxcbiAgICAgIHRpbWVyVHlwZSA9IF9saWZlQ3ljbGVUaW1lclN0YWNrJC50aW1lclR5cGU7XG5cbiAgdmFyIG5lc3RlZEZsdXNoRHVyYXRpb24gPSBwZXJmb3JtYW5jZU5vdygpIC0gbmVzdGVkRmx1c2hTdGFydFRpbWU7XG4gIGN1cnJlbnRUaW1lclN0YXJ0VGltZSA9IHN0YXJ0VGltZTtcbiAgY3VycmVudFRpbWVyTmVzdGVkRmx1c2hEdXJhdGlvbiArPSBuZXN0ZWRGbHVzaER1cmF0aW9uO1xuICBjdXJyZW50VGltZXJEZWJ1Z0lEID0gZGVidWdJRDtcbiAgY3VycmVudFRpbWVyVHlwZSA9IHRpbWVyVHlwZTtcbn1cblxudmFyIGxhc3RNYXJrVGltZVN0YW1wID0gMDtcbnZhciBjYW5Vc2VQZXJmb3JtYW5jZU1lYXN1cmUgPVxuLy8gJEZsb3dGaXhNZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMjM0NVxudHlwZW9mIHBlcmZvcm1hbmNlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2UubWFyayA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2UuY2xlYXJNYXJrcyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2UubWVhc3VyZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2UuY2xlYXJNZWFzdXJlcyA9PT0gJ2Z1bmN0aW9uJztcblxuZnVuY3Rpb24gc2hvdWxkTWFyayhkZWJ1Z0lEKSB7XG4gIGlmICghaXNQcm9maWxpbmcgfHwgIWNhblVzZVBlcmZvcm1hbmNlTWVhc3VyZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgZWxlbWVudCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RWxlbWVudChkZWJ1Z0lEKTtcbiAgaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCB0eXBlb2YgZWxlbWVudCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGlzSG9zdEVsZW1lbnQgPSB0eXBlb2YgZWxlbWVudC50eXBlID09PSAnc3RyaW5nJztcbiAgaWYgKGlzSG9zdEVsZW1lbnQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIG1hcmtCZWdpbihkZWJ1Z0lELCBtYXJrVHlwZSkge1xuICBpZiAoIXNob3VsZE1hcmsoZGVidWdJRCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbWFya05hbWUgPSBkZWJ1Z0lEICsgJzo6JyArIG1hcmtUeXBlO1xuICBsYXN0TWFya1RpbWVTdGFtcCA9IHBlcmZvcm1hbmNlTm93KCk7XG4gIHBlcmZvcm1hbmNlLm1hcmsobWFya05hbWUpO1xufVxuXG5mdW5jdGlvbiBtYXJrRW5kKGRlYnVnSUQsIG1hcmtUeXBlKSB7XG4gIGlmICghc2hvdWxkTWFyayhkZWJ1Z0lEKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBtYXJrTmFtZSA9IGRlYnVnSUQgKyAnOjonICsgbWFya1R5cGU7XG4gIHZhciBkaXNwbGF5TmFtZSA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RGlzcGxheU5hbWUoZGVidWdJRCkgfHwgJ1Vua25vd24nO1xuXG4gIC8vIENocm9tZSBoYXMgYW4gaXNzdWUgb2YgZHJvcHBpbmcgbWFya2VycyByZWNvcmRlZCB0b28gZmFzdDpcbiAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NjQwNjUyXG4gIC8vIFRvIHdvcmsgYXJvdW5kIHRoaXMsIHdlIHdpbGwgbm90IHJlcG9ydCB2ZXJ5IHNtYWxsIG1lYXN1cmVtZW50cy5cbiAgLy8gSSBkZXRlcm1pbmVkIHRoZSBtYWdpYyBudW1iZXIgYnkgdHdlYWtpbmcgaXQgYmFjayBhbmQgZm9ydGguXG4gIC8vIDAuMDVtcyB3YXMgZW5vdWdoIHRvIHByZXZlbnQgdGhlIGlzc3VlLCBidXQgSSBzZXQgaXQgdG8gMC4xbXMgdG8gYmUgc2FmZS5cbiAgLy8gV2hlbiB0aGUgYnVnIGlzIGZpeGVkLCB3ZSBjYW4gYG1lYXN1cmUoKWAgdW5jb25kaXRpb25hbGx5IGlmIHdlIHdhbnQgdG8uXG4gIHZhciB0aW1lU3RhbXAgPSBwZXJmb3JtYW5jZU5vdygpO1xuICBpZiAodGltZVN0YW1wIC0gbGFzdE1hcmtUaW1lU3RhbXAgPiAwLjEpIHtcbiAgICB2YXIgbWVhc3VyZW1lbnROYW1lID0gZGlzcGxheU5hbWUgKyAnIFsnICsgbWFya1R5cGUgKyAnXSc7XG4gICAgcGVyZm9ybWFuY2UubWVhc3VyZShtZWFzdXJlbWVudE5hbWUsIG1hcmtOYW1lKTtcbiAgfVxuXG4gIHBlcmZvcm1hbmNlLmNsZWFyTWFya3MobWFya05hbWUpO1xuICBwZXJmb3JtYW5jZS5jbGVhck1lYXN1cmVzKG1lYXN1cmVtZW50TmFtZSk7XG59XG5cbnZhciBSZWFjdERlYnVnVG9vbCA9IHtcbiAgYWRkSG9vazogZnVuY3Rpb24gKGhvb2spIHtcbiAgICBob29rcy5wdXNoKGhvb2spO1xuICB9LFxuICByZW1vdmVIb29rOiBmdW5jdGlvbiAoaG9vaykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaG9va3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChob29rc1tpXSA9PT0gaG9vaykge1xuICAgICAgICBob29rcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGktLTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGlzUHJvZmlsaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGlzUHJvZmlsaW5nO1xuICB9LFxuICBiZWdpblByb2ZpbGluZzogZnVuY3Rpb24gKCkge1xuICAgIGlmIChpc1Byb2ZpbGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlzUHJvZmlsaW5nID0gdHJ1ZTtcbiAgICBmbHVzaEhpc3RvcnkubGVuZ3RoID0gMDtcbiAgICByZXNldE1lYXN1cmVtZW50cygpO1xuICAgIFJlYWN0RGVidWdUb29sLmFkZEhvb2soUmVhY3RIb3N0T3BlcmF0aW9uSGlzdG9yeUhvb2spO1xuICB9LFxuICBlbmRQcm9maWxpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWlzUHJvZmlsaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaXNQcm9maWxpbmcgPSBmYWxzZTtcbiAgICByZXNldE1lYXN1cmVtZW50cygpO1xuICAgIFJlYWN0RGVidWdUb29sLnJlbW92ZUhvb2soUmVhY3RIb3N0T3BlcmF0aW9uSGlzdG9yeUhvb2spO1xuICB9LFxuICBnZXRGbHVzaEhpc3Rvcnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmx1c2hIaXN0b3J5O1xuICB9LFxuICBvbkJlZ2luRmx1c2g6IGZ1bmN0aW9uICgpIHtcbiAgICBjdXJyZW50Rmx1c2hOZXN0aW5nKys7XG4gICAgcmVzZXRNZWFzdXJlbWVudHMoKTtcbiAgICBwYXVzZUN1cnJlbnRMaWZlQ3ljbGVUaW1lcigpO1xuICAgIGVtaXRFdmVudCgnb25CZWdpbkZsdXNoJyk7XG4gIH0sXG4gIG9uRW5kRmx1c2g6IGZ1bmN0aW9uICgpIHtcbiAgICByZXNldE1lYXN1cmVtZW50cygpO1xuICAgIGN1cnJlbnRGbHVzaE5lc3RpbmctLTtcbiAgICByZXN1bWVDdXJyZW50TGlmZUN5Y2xlVGltZXIoKTtcbiAgICBlbWl0RXZlbnQoJ29uRW5kRmx1c2gnKTtcbiAgfSxcbiAgb25CZWdpbkxpZmVDeWNsZVRpbWVyOiBmdW5jdGlvbiAoZGVidWdJRCwgdGltZXJUeXBlKSB7XG4gICAgY2hlY2tEZWJ1Z0lEKGRlYnVnSUQpO1xuICAgIGVtaXRFdmVudCgnb25CZWdpbkxpZmVDeWNsZVRpbWVyJywgZGVidWdJRCwgdGltZXJUeXBlKTtcbiAgICBtYXJrQmVnaW4oZGVidWdJRCwgdGltZXJUeXBlKTtcbiAgICBiZWdpbkxpZmVDeWNsZVRpbWVyKGRlYnVnSUQsIHRpbWVyVHlwZSk7XG4gIH0sXG4gIG9uRW5kTGlmZUN5Y2xlVGltZXI6IGZ1bmN0aW9uIChkZWJ1Z0lELCB0aW1lclR5cGUpIHtcbiAgICBjaGVja0RlYnVnSUQoZGVidWdJRCk7XG4gICAgZW5kTGlmZUN5Y2xlVGltZXIoZGVidWdJRCwgdGltZXJUeXBlKTtcbiAgICBtYXJrRW5kKGRlYnVnSUQsIHRpbWVyVHlwZSk7XG4gICAgZW1pdEV2ZW50KCdvbkVuZExpZmVDeWNsZVRpbWVyJywgZGVidWdJRCwgdGltZXJUeXBlKTtcbiAgfSxcbiAgb25CZWdpblByb2Nlc3NpbmdDaGlsZENvbnRleHQ6IGZ1bmN0aW9uICgpIHtcbiAgICBlbWl0RXZlbnQoJ29uQmVnaW5Qcm9jZXNzaW5nQ2hpbGRDb250ZXh0Jyk7XG4gIH0sXG4gIG9uRW5kUHJvY2Vzc2luZ0NoaWxkQ29udGV4dDogZnVuY3Rpb24gKCkge1xuICAgIGVtaXRFdmVudCgnb25FbmRQcm9jZXNzaW5nQ2hpbGRDb250ZXh0Jyk7XG4gIH0sXG4gIG9uSG9zdE9wZXJhdGlvbjogZnVuY3Rpb24gKG9wZXJhdGlvbikge1xuICAgIGNoZWNrRGVidWdJRChvcGVyYXRpb24uaW5zdGFuY2VJRCk7XG4gICAgZW1pdEV2ZW50KCdvbkhvc3RPcGVyYXRpb24nLCBvcGVyYXRpb24pO1xuICB9LFxuICBvblNldFN0YXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgZW1pdEV2ZW50KCdvblNldFN0YXRlJyk7XG4gIH0sXG4gIG9uU2V0Q2hpbGRyZW46IGZ1bmN0aW9uIChkZWJ1Z0lELCBjaGlsZERlYnVnSURzKSB7XG4gICAgY2hlY2tEZWJ1Z0lEKGRlYnVnSUQpO1xuICAgIGNoaWxkRGVidWdJRHMuZm9yRWFjaChjaGVja0RlYnVnSUQpO1xuICAgIGVtaXRFdmVudCgnb25TZXRDaGlsZHJlbicsIGRlYnVnSUQsIGNoaWxkRGVidWdJRHMpO1xuICB9LFxuICBvbkJlZm9yZU1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCwgZWxlbWVudCwgcGFyZW50RGVidWdJRCkge1xuICAgIGNoZWNrRGVidWdJRChkZWJ1Z0lEKTtcbiAgICBjaGVja0RlYnVnSUQocGFyZW50RGVidWdJRCwgdHJ1ZSk7XG4gICAgZW1pdEV2ZW50KCdvbkJlZm9yZU1vdW50Q29tcG9uZW50JywgZGVidWdJRCwgZWxlbWVudCwgcGFyZW50RGVidWdJRCk7XG4gICAgbWFya0JlZ2luKGRlYnVnSUQsICdtb3VudCcpO1xuICB9LFxuICBvbk1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCkge1xuICAgIGNoZWNrRGVidWdJRChkZWJ1Z0lEKTtcbiAgICBtYXJrRW5kKGRlYnVnSUQsICdtb3VudCcpO1xuICAgIGVtaXRFdmVudCgnb25Nb3VudENvbXBvbmVudCcsIGRlYnVnSUQpO1xuICB9LFxuICBvbkJlZm9yZVVwZGF0ZUNvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQsIGVsZW1lbnQpIHtcbiAgICBjaGVja0RlYnVnSUQoZGVidWdJRCk7XG4gICAgZW1pdEV2ZW50KCdvbkJlZm9yZVVwZGF0ZUNvbXBvbmVudCcsIGRlYnVnSUQsIGVsZW1lbnQpO1xuICAgIG1hcmtCZWdpbihkZWJ1Z0lELCAndXBkYXRlJyk7XG4gIH0sXG4gIG9uVXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCkge1xuICAgIGNoZWNrRGVidWdJRChkZWJ1Z0lEKTtcbiAgICBtYXJrRW5kKGRlYnVnSUQsICd1cGRhdGUnKTtcbiAgICBlbWl0RXZlbnQoJ29uVXBkYXRlQ29tcG9uZW50JywgZGVidWdJRCk7XG4gIH0sXG4gIG9uQmVmb3JlVW5tb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQpIHtcbiAgICBjaGVja0RlYnVnSUQoZGVidWdJRCk7XG4gICAgZW1pdEV2ZW50KCdvbkJlZm9yZVVubW91bnRDb21wb25lbnQnLCBkZWJ1Z0lEKTtcbiAgICBtYXJrQmVnaW4oZGVidWdJRCwgJ3VubW91bnQnKTtcbiAgfSxcbiAgb25Vbm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCkge1xuICAgIGNoZWNrRGVidWdJRChkZWJ1Z0lEKTtcbiAgICBtYXJrRW5kKGRlYnVnSUQsICd1bm1vdW50Jyk7XG4gICAgZW1pdEV2ZW50KCdvblVubW91bnRDb21wb25lbnQnLCBkZWJ1Z0lEKTtcbiAgfSxcbiAgb25UZXN0RXZlbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICBlbWl0RXZlbnQoJ29uVGVzdEV2ZW50Jyk7XG4gIH1cbn07XG5cbi8vIFRPRE8gcmVtb3ZlIHRoZXNlIHdoZW4gUk4vd3d3IGdldHMgdXBkYXRlZFxuUmVhY3REZWJ1Z1Rvb2wuYWRkRGV2dG9vbCA9IFJlYWN0RGVidWdUb29sLmFkZEhvb2s7XG5SZWFjdERlYnVnVG9vbC5yZW1vdmVEZXZ0b29sID0gUmVhY3REZWJ1Z1Rvb2wucmVtb3ZlSG9vaztcblxuUmVhY3REZWJ1Z1Rvb2wuYWRkSG9vayhSZWFjdEludmFsaWRTZXRTdGF0ZVdhcm5pbmdIb29rKTtcblJlYWN0RGVidWdUb29sLmFkZEhvb2soUmVhY3RDb21wb25lbnRUcmVlSG9vayk7XG52YXIgdXJsID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NICYmIHdpbmRvdy5sb2NhdGlvbi5ocmVmIHx8ICcnO1xuaWYgKC9bPyZdcmVhY3RfcGVyZlxcYi8udGVzdCh1cmwpKSB7XG4gIFJlYWN0RGVidWdUb29sLmJlZ2luUHJvZmlsaW5nKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3REZWJ1Z1Rvb2w7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3REZWJ1Z1Rvb2wuanNcbi8vIG1vZHVsZSBpZCA9IDIzNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 237 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2016-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar warning = __webpack_require__(183);\n\nif (true) {\n  var processingChildContext = false;\n\n  var warnInvalidSetState = function () {\n     true ? warning(!processingChildContext, 'setState(...): Cannot call setState() inside getChildContext()') : void 0;\n  };\n}\n\nvar ReactInvalidSetStateWarningHook = {\n  onBeginProcessingChildContext: function () {\n    processingChildContext = true;\n  },\n  onEndProcessingChildContext: function () {\n    processingChildContext = false;\n  },\n  onSetState: function () {\n    warnInvalidSetState();\n  }\n};\n\nmodule.exports = ReactInvalidSetStateWarningHook;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0SW52YWxpZFNldFN0YXRlV2FybmluZ0hvb2suanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNi1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIHByb2Nlc3NpbmdDaGlsZENvbnRleHQgPSBmYWxzZTtcblxuICB2YXIgd2FybkludmFsaWRTZXRTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghcHJvY2Vzc2luZ0NoaWxkQ29udGV4dCwgJ3NldFN0YXRlKC4uLik6IENhbm5vdCBjYWxsIHNldFN0YXRlKCkgaW5zaWRlIGdldENoaWxkQ29udGV4dCgpJykgOiB2b2lkIDA7XG4gIH07XG59XG5cbnZhciBSZWFjdEludmFsaWRTZXRTdGF0ZVdhcm5pbmdIb29rID0ge1xuICBvbkJlZ2luUHJvY2Vzc2luZ0NoaWxkQ29udGV4dDogZnVuY3Rpb24gKCkge1xuICAgIHByb2Nlc3NpbmdDaGlsZENvbnRleHQgPSB0cnVlO1xuICB9LFxuICBvbkVuZFByb2Nlc3NpbmdDaGlsZENvbnRleHQ6IGZ1bmN0aW9uICgpIHtcbiAgICBwcm9jZXNzaW5nQ2hpbGRDb250ZXh0ID0gZmFsc2U7XG4gIH0sXG4gIG9uU2V0U3RhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICB3YXJuSW52YWxpZFNldFN0YXRlKCk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RJbnZhbGlkU2V0U3RhdGVXYXJuaW5nSG9vaztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdEludmFsaWRTZXRTdGF0ZVdhcm5pbmdIb29rLmpzXG4vLyBtb2R1bGUgaWQgPSAyMzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 238 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2016-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar history = [];\n\nvar ReactHostOperationHistoryHook = {\n  onHostOperation: function (operation) {\n    history.push(operation);\n  },\n  clearHistory: function () {\n    if (ReactHostOperationHistoryHook._preventClearing) {\n      // Should only be used for tests.\n      return;\n    }\n\n    history = [];\n  },\n  getHistory: function () {\n    return history;\n  }\n};\n\nmodule.exports = ReactHostOperationHistoryHook;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTYtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGhpc3RvcnkgPSBbXTtcblxudmFyIFJlYWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rID0ge1xuICBvbkhvc3RPcGVyYXRpb246IGZ1bmN0aW9uIChvcGVyYXRpb24pIHtcbiAgICBoaXN0b3J5LnB1c2gob3BlcmF0aW9uKTtcbiAgfSxcbiAgY2xlYXJIaXN0b3J5OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKFJlYWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rLl9wcmV2ZW50Q2xlYXJpbmcpIHtcbiAgICAgIC8vIFNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHRlc3RzLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGhpc3RvcnkgPSBbXTtcbiAgfSxcbiAgZ2V0SGlzdG9yeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBoaXN0b3J5O1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rLmpzXG4vLyBtb2R1bGUgaWQgPSAyMzhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 239 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @typechecks\n */\n\nvar performance = __webpack_require__(240);\n\nvar performanceNow;\n\n/**\n * Detect if we can use `window.performance.now()` and gracefully fallback to\n * `Date.now()` if it doesn't exist. We need to support Firefox < 15 for now\n * because of Facebook's testing infrastructure.\n */\nif (performance.now) {\n  performanceNow = function performanceNow() {\n    return performance.now();\n  };\n} else {\n  performanceNow = function performanceNow() {\n    return Date.now();\n  };\n}\n\nmodule.exports = performanceNow;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9wZXJmb3JtYW5jZU5vdy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbnZhciBwZXJmb3JtYW5jZSA9IHJlcXVpcmUoJy4vcGVyZm9ybWFuY2UnKTtcblxudmFyIHBlcmZvcm1hbmNlTm93O1xuXG4vKipcbiAqIERldGVjdCBpZiB3ZSBjYW4gdXNlIGB3aW5kb3cucGVyZm9ybWFuY2Uubm93KClgIGFuZCBncmFjZWZ1bGx5IGZhbGxiYWNrIHRvXG4gKiBgRGF0ZS5ub3coKWAgaWYgaXQgZG9lc24ndCBleGlzdC4gV2UgbmVlZCB0byBzdXBwb3J0IEZpcmVmb3ggPCAxNSBmb3Igbm93XG4gKiBiZWNhdXNlIG9mIEZhY2Vib29rJ3MgdGVzdGluZyBpbmZyYXN0cnVjdHVyZS5cbiAqL1xuaWYgKHBlcmZvcm1hbmNlLm5vdykge1xuICBwZXJmb3JtYW5jZU5vdyA9IGZ1bmN0aW9uIHBlcmZvcm1hbmNlTm93KCkge1xuICAgIHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTtcbiAgfTtcbn0gZWxzZSB7XG4gIHBlcmZvcm1hbmNlTm93ID0gZnVuY3Rpb24gcGVyZm9ybWFuY2VOb3coKSB7XG4gICAgcmV0dXJuIERhdGUubm93KCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGVyZm9ybWFuY2VOb3c7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2ZianMvbGliL3BlcmZvcm1hbmNlTm93LmpzXG4vLyBtb2R1bGUgaWQgPSAyMzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 240 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @typechecks\n */\n\n'use strict';\n\nvar ExecutionEnvironment = __webpack_require__(221);\n\nvar performance;\n\nif (ExecutionEnvironment.canUseDOM) {\n  performance = window.performance || window.msPerformance || window.webkitPerformance;\n}\n\nmodule.exports = performance || {};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9wZXJmb3JtYW5jZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHR5cGVjaGVja3NcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJy4vRXhlY3V0aW9uRW52aXJvbm1lbnQnKTtcblxudmFyIHBlcmZvcm1hbmNlO1xuXG5pZiAoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKSB7XG4gIHBlcmZvcm1hbmNlID0gd2luZG93LnBlcmZvcm1hbmNlIHx8IHdpbmRvdy5tc1BlcmZvcm1hbmNlIHx8IHdpbmRvdy53ZWJraXRQZXJmb3JtYW5jZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwZXJmb3JtYW5jZSB8fCB7fTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZmJqcy9saWIvcGVyZm9ybWFuY2UuanNcbi8vIG1vZHVsZSBpZCA9IDI0MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 241 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nvar invariant = __webpack_require__(180);\n\nvar OBSERVED_ERROR = {};\n\n/**\n * `Transaction` creates a black box that is able to wrap any method such that\n * certain invariants are maintained before and after the method is invoked\n * (Even if an exception is thrown while invoking the wrapped method). Whoever\n * instantiates a transaction can provide enforcers of the invariants at\n * creation time. The `Transaction` class itself will supply one additional\n * automatic invariant for you - the invariant that any transaction instance\n * should not be run while it is already being run. You would typically create a\n * single instance of a `Transaction` for reuse multiple times, that potentially\n * is used to wrap several different methods. Wrappers are extremely simple -\n * they only require implementing two methods.\n *\n * <pre>\n *                       wrappers (injected at creation time)\n *                                      +        +\n *                                      |        |\n *                    +-----------------|--------|--------------+\n *                    |                 v        |              |\n *                    |      +---------------+   |              |\n *                    |   +--|    wrapper1   |---|----+         |\n *                    |   |  +---------------+   v    |         |\n *                    |   |          +-------------+  |         |\n *                    |   |     +----|   wrapper2  |--------+   |\n *                    |   |     |    +-------------+  |     |   |\n *                    |   |     |                     |     |   |\n *                    |   v     v                     v     v   | wrapper\n *                    | +---+ +---+   +---------+   +---+ +---+ | invariants\n * perform(anyMethod) | |   | |   |   |         |   |   | |   | | maintained\n * +----------------->|-|---|-|---|-->|anyMethod|---|---|-|---|-|-------->\n *                    | |   | |   |   |         |   |   | |   | |\n *                    | |   | |   |   |         |   |   | |   | |\n *                    | |   | |   |   |         |   |   | |   | |\n *                    | +---+ +---+   +---------+   +---+ +---+ |\n *                    |  initialize                    close    |\n *                    +-----------------------------------------+\n * </pre>\n *\n * Use cases:\n * - Preserving the input selection ranges before/after reconciliation.\n *   Restoring selection even in the event of an unexpected error.\n * - Deactivating events while rearranging the DOM, preventing blurs/focuses,\n *   while guaranteeing that afterwards, the event system is reactivated.\n * - Flushing a queue of collected DOM mutations to the main UI thread after a\n *   reconciliation takes place in a worker thread.\n * - Invoking any collected `componentDidUpdate` callbacks after rendering new\n *   content.\n * - (Future use case): Wrapping particular flushes of the `ReactWorker` queue\n *   to preserve the `scrollTop` (an automatic scroll aware DOM).\n * - (Future use case): Layout calculations before and after DOM updates.\n *\n * Transactional plugin API:\n * - A module that has an `initialize` method that returns any precomputation.\n * - and a `close` method that accepts the precomputation. `close` is invoked\n *   when the wrapped process is completed, or has failed.\n *\n * @param {Array<TransactionalWrapper>} transactionWrapper Wrapper modules\n * that implement `initialize` and `close`.\n * @return {Transaction} Single transaction for reuse in thread.\n *\n * @class Transaction\n */\nvar TransactionImpl = {\n  /**\n   * Sets up this instance so that it is prepared for collecting metrics. Does\n   * so such that this setup method may be used on an instance that is already\n   * initialized, in a way that does not consume additional memory upon reuse.\n   * That can be useful if you decide to make your subclass of this mixin a\n   * \"PooledClass\".\n   */\n  reinitializeTransaction: function () {\n    this.transactionWrappers = this.getTransactionWrappers();\n    if (this.wrapperInitData) {\n      this.wrapperInitData.length = 0;\n    } else {\n      this.wrapperInitData = [];\n    }\n    this._isInTransaction = false;\n  },\n\n  _isInTransaction: false,\n\n  /**\n   * @abstract\n   * @return {Array<TransactionWrapper>} Array of transaction wrappers.\n   */\n  getTransactionWrappers: null,\n\n  isInTransaction: function () {\n    return !!this._isInTransaction;\n  },\n\n  /**\n   * Executes the function within a safety window. Use this for the top level\n   * methods that result in large amounts of computation/mutations that would\n   * need to be safety checked. The optional arguments helps prevent the need\n   * to bind in many cases.\n   *\n   * @param {function} method Member of scope to call.\n   * @param {Object} scope Scope to invoke from.\n   * @param {Object?=} a Argument to pass to the method.\n   * @param {Object?=} b Argument to pass to the method.\n   * @param {Object?=} c Argument to pass to the method.\n   * @param {Object?=} d Argument to pass to the method.\n   * @param {Object?=} e Argument to pass to the method.\n   * @param {Object?=} f Argument to pass to the method.\n   *\n   * @return {*} Return value from `method`.\n   */\n  perform: function (method, scope, a, b, c, d, e, f) {\n    !!this.isInTransaction() ?  true ? invariant(false, 'Transaction.perform(...): Cannot initialize a transaction when there is already an outstanding transaction.') : _prodInvariant('27') : void 0;\n    var errorThrown;\n    var ret;\n    try {\n      this._isInTransaction = true;\n      // Catching errors makes debugging more difficult, so we start with\n      // errorThrown set to true before setting it to false after calling\n      // close -- if it's still set to true in the finally block, it means\n      // one of these calls threw.\n      errorThrown = true;\n      this.initializeAll(0);\n      ret = method.call(scope, a, b, c, d, e, f);\n      errorThrown = false;\n    } finally {\n      try {\n        if (errorThrown) {\n          // If `method` throws, prefer to show that stack trace over any thrown\n          // by invoking `closeAll`.\n          try {\n            this.closeAll(0);\n          } catch (err) {}\n        } else {\n          // Since `method` didn't throw, we don't want to silence the exception\n          // here.\n          this.closeAll(0);\n        }\n      } finally {\n        this._isInTransaction = false;\n      }\n    }\n    return ret;\n  },\n\n  initializeAll: function (startIndex) {\n    var transactionWrappers = this.transactionWrappers;\n    for (var i = startIndex; i < transactionWrappers.length; i++) {\n      var wrapper = transactionWrappers[i];\n      try {\n        // Catching errors makes debugging more difficult, so we start with the\n        // OBSERVED_ERROR state before overwriting it with the real return value\n        // of initialize -- if it's still set to OBSERVED_ERROR in the finally\n        // block, it means wrapper.initialize threw.\n        this.wrapperInitData[i] = OBSERVED_ERROR;\n        this.wrapperInitData[i] = wrapper.initialize ? wrapper.initialize.call(this) : null;\n      } finally {\n        if (this.wrapperInitData[i] === OBSERVED_ERROR) {\n          // The initializer for wrapper i threw an error; initialize the\n          // remaining wrappers but silence any exceptions from them to ensure\n          // that the first error is the one to bubble up.\n          try {\n            this.initializeAll(i + 1);\n          } catch (err) {}\n        }\n      }\n    }\n  },\n\n  /**\n   * Invokes each of `this.transactionWrappers.close[i]` functions, passing into\n   * them the respective return values of `this.transactionWrappers.init[i]`\n   * (`close`rs that correspond to initializers that failed will not be\n   * invoked).\n   */\n  closeAll: function (startIndex) {\n    !this.isInTransaction() ?  true ? invariant(false, 'Transaction.closeAll(): Cannot close transaction when none are open.') : _prodInvariant('28') : void 0;\n    var transactionWrappers = this.transactionWrappers;\n    for (var i = startIndex; i < transactionWrappers.length; i++) {\n      var wrapper = transactionWrappers[i];\n      var initData = this.wrapperInitData[i];\n      var errorThrown;\n      try {\n        // Catching errors makes debugging more difficult, so we start with\n        // errorThrown set to true before setting it to false after calling\n        // close -- if it's still set to true in the finally block, it means\n        // wrapper.close threw.\n        errorThrown = true;\n        if (initData !== OBSERVED_ERROR && wrapper.close) {\n          wrapper.close.call(this, initData);\n        }\n        errorThrown = false;\n      } finally {\n        if (errorThrown) {\n          // The closer for wrapper i threw an error; close the remaining\n          // wrappers but silence any exceptions from them to ensure that the\n          // first error is the one to bubble up.\n          try {\n            this.closeAll(i + 1);\n          } catch (e) {}\n        }\n      }\n    }\n    this.wrapperInitData.length = 0;\n  }\n};\n\nmodule.exports = TransactionImpl;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1RyYW5zYWN0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG52YXIgT0JTRVJWRURfRVJST1IgPSB7fTtcblxuLyoqXG4gKiBgVHJhbnNhY3Rpb25gIGNyZWF0ZXMgYSBibGFjayBib3ggdGhhdCBpcyBhYmxlIHRvIHdyYXAgYW55IG1ldGhvZCBzdWNoIHRoYXRcbiAqIGNlcnRhaW4gaW52YXJpYW50cyBhcmUgbWFpbnRhaW5lZCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBtZXRob2QgaXMgaW52b2tlZFxuICogKEV2ZW4gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biB3aGlsZSBpbnZva2luZyB0aGUgd3JhcHBlZCBtZXRob2QpLiBXaG9ldmVyXG4gKiBpbnN0YW50aWF0ZXMgYSB0cmFuc2FjdGlvbiBjYW4gcHJvdmlkZSBlbmZvcmNlcnMgb2YgdGhlIGludmFyaWFudHMgYXRcbiAqIGNyZWF0aW9uIHRpbWUuIFRoZSBgVHJhbnNhY3Rpb25gIGNsYXNzIGl0c2VsZiB3aWxsIHN1cHBseSBvbmUgYWRkaXRpb25hbFxuICogYXV0b21hdGljIGludmFyaWFudCBmb3IgeW91IC0gdGhlIGludmFyaWFudCB0aGF0IGFueSB0cmFuc2FjdGlvbiBpbnN0YW5jZVxuICogc2hvdWxkIG5vdCBiZSBydW4gd2hpbGUgaXQgaXMgYWxyZWFkeSBiZWluZyBydW4uIFlvdSB3b3VsZCB0eXBpY2FsbHkgY3JlYXRlIGFcbiAqIHNpbmdsZSBpbnN0YW5jZSBvZiBhIGBUcmFuc2FjdGlvbmAgZm9yIHJldXNlIG11bHRpcGxlIHRpbWVzLCB0aGF0IHBvdGVudGlhbGx5XG4gKiBpcyB1c2VkIHRvIHdyYXAgc2V2ZXJhbCBkaWZmZXJlbnQgbWV0aG9kcy4gV3JhcHBlcnMgYXJlIGV4dHJlbWVseSBzaW1wbGUgLVxuICogdGhleSBvbmx5IHJlcXVpcmUgaW1wbGVtZW50aW5nIHR3byBtZXRob2RzLlxuICpcbiAqIDxwcmU+XG4gKiAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlcnMgKGluamVjdGVkIGF0IGNyZWF0aW9uIHRpbWUpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgICAgICAgK1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS0tLS0tLS0rXG4gKiAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgdiAgICAgICAgfCAgICAgICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgIHwgICAgICArLS0tLS0tLS0tLS0tLS0tKyAgIHwgICAgICAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICB8ICAgKy0tfCAgICB3cmFwcGVyMSAgIHwtLS18LS0tLSsgICAgICAgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgfCAgIHwgICstLS0tLS0tLS0tLS0tLS0rICAgdiAgICB8ICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgIHwgICB8ICAgICAgICAgICstLS0tLS0tLS0tLS0tKyAgfCAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICB8ICAgfCAgICAgKy0tLS18ICAgd3JhcHBlcjIgIHwtLS0tLS0tLSsgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgfCAgIHwgICAgIHwgICAgKy0tLS0tLS0tLS0tLS0rICB8ICAgICB8ICAgfFxuICogICAgICAgICAgICAgICAgICAgIHwgICB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCAgIHxcbiAqICAgICAgICAgICAgICAgICAgICB8ICAgdiAgICAgdiAgICAgICAgICAgICAgICAgICAgIHYgICAgIHYgICB8IHdyYXBwZXJcbiAqICAgICAgICAgICAgICAgICAgICB8ICstLS0rICstLS0rICAgKy0tLS0tLS0tLSsgICArLS0tKyArLS0tKyB8IGludmFyaWFudHNcbiAqIHBlcmZvcm0oYW55TWV0aG9kKSB8IHwgICB8IHwgICB8ICAgfCAgICAgICAgIHwgICB8ICAgfCB8ICAgfCB8IG1haW50YWluZWRcbiAqICstLS0tLS0tLS0tLS0tLS0tLT58LXwtLS18LXwtLS18LS0+fGFueU1ldGhvZHwtLS18LS0tfC18LS0tfC18LS0tLS0tLS0+XG4gKiAgICAgICAgICAgICAgICAgICAgfCB8ICAgfCB8ICAgfCAgIHwgICAgICAgICB8ICAgfCAgIHwgfCAgIHwgfFxuICogICAgICAgICAgICAgICAgICAgIHwgfCAgIHwgfCAgIHwgICB8ICAgICAgICAgfCAgIHwgICB8IHwgICB8IHxcbiAqICAgICAgICAgICAgICAgICAgICB8IHwgICB8IHwgICB8ICAgfCAgICAgICAgIHwgICB8ICAgfCB8ICAgfCB8XG4gKiAgICAgICAgICAgICAgICAgICAgfCArLS0tKyArLS0tKyAgICstLS0tLS0tLS0rICAgKy0tLSsgKy0tLSsgfFxuICogICAgICAgICAgICAgICAgICAgIHwgIGluaXRpYWxpemUgICAgICAgICAgICAgICAgICAgIGNsb3NlICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gKiA8L3ByZT5cbiAqXG4gKiBVc2UgY2FzZXM6XG4gKiAtIFByZXNlcnZpbmcgdGhlIGlucHV0IHNlbGVjdGlvbiByYW5nZXMgYmVmb3JlL2FmdGVyIHJlY29uY2lsaWF0aW9uLlxuICogICBSZXN0b3Jpbmcgc2VsZWN0aW9uIGV2ZW4gaW4gdGhlIGV2ZW50IG9mIGFuIHVuZXhwZWN0ZWQgZXJyb3IuXG4gKiAtIERlYWN0aXZhdGluZyBldmVudHMgd2hpbGUgcmVhcnJhbmdpbmcgdGhlIERPTSwgcHJldmVudGluZyBibHVycy9mb2N1c2VzLFxuICogICB3aGlsZSBndWFyYW50ZWVpbmcgdGhhdCBhZnRlcndhcmRzLCB0aGUgZXZlbnQgc3lzdGVtIGlzIHJlYWN0aXZhdGVkLlxuICogLSBGbHVzaGluZyBhIHF1ZXVlIG9mIGNvbGxlY3RlZCBET00gbXV0YXRpb25zIHRvIHRoZSBtYWluIFVJIHRocmVhZCBhZnRlciBhXG4gKiAgIHJlY29uY2lsaWF0aW9uIHRha2VzIHBsYWNlIGluIGEgd29ya2VyIHRocmVhZC5cbiAqIC0gSW52b2tpbmcgYW55IGNvbGxlY3RlZCBgY29tcG9uZW50RGlkVXBkYXRlYCBjYWxsYmFja3MgYWZ0ZXIgcmVuZGVyaW5nIG5ld1xuICogICBjb250ZW50LlxuICogLSAoRnV0dXJlIHVzZSBjYXNlKTogV3JhcHBpbmcgcGFydGljdWxhciBmbHVzaGVzIG9mIHRoZSBgUmVhY3RXb3JrZXJgIHF1ZXVlXG4gKiAgIHRvIHByZXNlcnZlIHRoZSBgc2Nyb2xsVG9wYCAoYW4gYXV0b21hdGljIHNjcm9sbCBhd2FyZSBET00pLlxuICogLSAoRnV0dXJlIHVzZSBjYXNlKTogTGF5b3V0IGNhbGN1bGF0aW9ucyBiZWZvcmUgYW5kIGFmdGVyIERPTSB1cGRhdGVzLlxuICpcbiAqIFRyYW5zYWN0aW9uYWwgcGx1Z2luIEFQSTpcbiAqIC0gQSBtb2R1bGUgdGhhdCBoYXMgYW4gYGluaXRpYWxpemVgIG1ldGhvZCB0aGF0IHJldHVybnMgYW55IHByZWNvbXB1dGF0aW9uLlxuICogLSBhbmQgYSBgY2xvc2VgIG1ldGhvZCB0aGF0IGFjY2VwdHMgdGhlIHByZWNvbXB1dGF0aW9uLiBgY2xvc2VgIGlzIGludm9rZWRcbiAqICAgd2hlbiB0aGUgd3JhcHBlZCBwcm9jZXNzIGlzIGNvbXBsZXRlZCwgb3IgaGFzIGZhaWxlZC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PFRyYW5zYWN0aW9uYWxXcmFwcGVyPn0gdHJhbnNhY3Rpb25XcmFwcGVyIFdyYXBwZXIgbW9kdWxlc1xuICogdGhhdCBpbXBsZW1lbnQgYGluaXRpYWxpemVgIGFuZCBgY2xvc2VgLlxuICogQHJldHVybiB7VHJhbnNhY3Rpb259IFNpbmdsZSB0cmFuc2FjdGlvbiBmb3IgcmV1c2UgaW4gdGhyZWFkLlxuICpcbiAqIEBjbGFzcyBUcmFuc2FjdGlvblxuICovXG52YXIgVHJhbnNhY3Rpb25JbXBsID0ge1xuICAvKipcbiAgICogU2V0cyB1cCB0aGlzIGluc3RhbmNlIHNvIHRoYXQgaXQgaXMgcHJlcGFyZWQgZm9yIGNvbGxlY3RpbmcgbWV0cmljcy4gRG9lc1xuICAgKiBzbyBzdWNoIHRoYXQgdGhpcyBzZXR1cCBtZXRob2QgbWF5IGJlIHVzZWQgb24gYW4gaW5zdGFuY2UgdGhhdCBpcyBhbHJlYWR5XG4gICAqIGluaXRpYWxpemVkLCBpbiBhIHdheSB0aGF0IGRvZXMgbm90IGNvbnN1bWUgYWRkaXRpb25hbCBtZW1vcnkgdXBvbiByZXVzZS5cbiAgICogVGhhdCBjYW4gYmUgdXNlZnVsIGlmIHlvdSBkZWNpZGUgdG8gbWFrZSB5b3VyIHN1YmNsYXNzIG9mIHRoaXMgbWl4aW4gYVxuICAgKiBcIlBvb2xlZENsYXNzXCIuXG4gICAqL1xuICByZWluaXRpYWxpemVUcmFuc2FjdGlvbjogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMudHJhbnNhY3Rpb25XcmFwcGVycyA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25XcmFwcGVycygpO1xuICAgIGlmICh0aGlzLndyYXBwZXJJbml0RGF0YSkge1xuICAgICAgdGhpcy53cmFwcGVySW5pdERhdGEubGVuZ3RoID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53cmFwcGVySW5pdERhdGEgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5faXNJblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gIH0sXG5cbiAgX2lzSW5UcmFuc2FjdGlvbjogZmFsc2UsXG5cbiAgLyoqXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcmV0dXJuIHtBcnJheTxUcmFuc2FjdGlvbldyYXBwZXI+fSBBcnJheSBvZiB0cmFuc2FjdGlvbiB3cmFwcGVycy5cbiAgICovXG4gIGdldFRyYW5zYWN0aW9uV3JhcHBlcnM6IG51bGwsXG5cbiAgaXNJblRyYW5zYWN0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5faXNJblRyYW5zYWN0aW9uO1xuICB9LFxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyB0aGUgZnVuY3Rpb24gd2l0aGluIGEgc2FmZXR5IHdpbmRvdy4gVXNlIHRoaXMgZm9yIHRoZSB0b3AgbGV2ZWxcbiAgICogbWV0aG9kcyB0aGF0IHJlc3VsdCBpbiBsYXJnZSBhbW91bnRzIG9mIGNvbXB1dGF0aW9uL211dGF0aW9ucyB0aGF0IHdvdWxkXG4gICAqIG5lZWQgdG8gYmUgc2FmZXR5IGNoZWNrZWQuIFRoZSBvcHRpb25hbCBhcmd1bWVudHMgaGVscHMgcHJldmVudCB0aGUgbmVlZFxuICAgKiB0byBiaW5kIGluIG1hbnkgY2FzZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG1ldGhvZCBNZW1iZXIgb2Ygc2NvcGUgdG8gY2FsbC5cbiAgICogQHBhcmFtIHtPYmplY3R9IHNjb3BlIFNjb3BlIHRvIGludm9rZSBmcm9tLlxuICAgKiBAcGFyYW0ge09iamVjdD89fSBhIEFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAgICogQHBhcmFtIHtPYmplY3Q/PX0gYiBBcmd1bWVudCB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gICAqIEBwYXJhbSB7T2JqZWN0Pz19IGMgQXJndW1lbnQgdG8gcGFzcyB0byB0aGUgbWV0aG9kLlxuICAgKiBAcGFyYW0ge09iamVjdD89fSBkIEFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAgICogQHBhcmFtIHtPYmplY3Q/PX0gZSBBcmd1bWVudCB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gICAqIEBwYXJhbSB7T2JqZWN0Pz19IGYgQXJndW1lbnQgdG8gcGFzcyB0byB0aGUgbWV0aG9kLlxuICAgKlxuICAgKiBAcmV0dXJuIHsqfSBSZXR1cm4gdmFsdWUgZnJvbSBgbWV0aG9kYC5cbiAgICovXG4gIHBlcmZvcm06IGZ1bmN0aW9uIChtZXRob2QsIHNjb3BlLCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgISF0aGlzLmlzSW5UcmFuc2FjdGlvbigpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1RyYW5zYWN0aW9uLnBlcmZvcm0oLi4uKTogQ2Fubm90IGluaXRpYWxpemUgYSB0cmFuc2FjdGlvbiB3aGVuIHRoZXJlIGlzIGFscmVhZHkgYW4gb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb24uJykgOiBfcHJvZEludmFyaWFudCgnMjcnKSA6IHZvaWQgMDtcbiAgICB2YXIgZXJyb3JUaHJvd247XG4gICAgdmFyIHJldDtcbiAgICB0cnkge1xuICAgICAgdGhpcy5faXNJblRyYW5zYWN0aW9uID0gdHJ1ZTtcbiAgICAgIC8vIENhdGNoaW5nIGVycm9ycyBtYWtlcyBkZWJ1Z2dpbmcgbW9yZSBkaWZmaWN1bHQsIHNvIHdlIHN0YXJ0IHdpdGhcbiAgICAgIC8vIGVycm9yVGhyb3duIHNldCB0byB0cnVlIGJlZm9yZSBzZXR0aW5nIGl0IHRvIGZhbHNlIGFmdGVyIGNhbGxpbmdcbiAgICAgIC8vIGNsb3NlIC0tIGlmIGl0J3Mgc3RpbGwgc2V0IHRvIHRydWUgaW4gdGhlIGZpbmFsbHkgYmxvY2ssIGl0IG1lYW5zXG4gICAgICAvLyBvbmUgb2YgdGhlc2UgY2FsbHMgdGhyZXcuXG4gICAgICBlcnJvclRocm93biA9IHRydWU7XG4gICAgICB0aGlzLmluaXRpYWxpemVBbGwoMCk7XG4gICAgICByZXQgPSBtZXRob2QuY2FsbChzY29wZSwgYSwgYiwgYywgZCwgZSwgZik7XG4gICAgICBlcnJvclRocm93biA9IGZhbHNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZXJyb3JUaHJvd24pIHtcbiAgICAgICAgICAvLyBJZiBgbWV0aG9kYCB0aHJvd3MsIHByZWZlciB0byBzaG93IHRoYXQgc3RhY2sgdHJhY2Ugb3ZlciBhbnkgdGhyb3duXG4gICAgICAgICAgLy8gYnkgaW52b2tpbmcgYGNsb3NlQWxsYC5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUFsbCgwKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2luY2UgYG1ldGhvZGAgZGlkbid0IHRocm93LCB3ZSBkb24ndCB3YW50IHRvIHNpbGVuY2UgdGhlIGV4Y2VwdGlvblxuICAgICAgICAgIC8vIGhlcmUuXG4gICAgICAgICAgdGhpcy5jbG9zZUFsbCgwKTtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5faXNJblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH0sXG5cbiAgaW5pdGlhbGl6ZUFsbDogZnVuY3Rpb24gKHN0YXJ0SW5kZXgpIHtcbiAgICB2YXIgdHJhbnNhY3Rpb25XcmFwcGVycyA9IHRoaXMudHJhbnNhY3Rpb25XcmFwcGVycztcbiAgICBmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgaSA8IHRyYW5zYWN0aW9uV3JhcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3cmFwcGVyID0gdHJhbnNhY3Rpb25XcmFwcGVyc1tpXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIENhdGNoaW5nIGVycm9ycyBtYWtlcyBkZWJ1Z2dpbmcgbW9yZSBkaWZmaWN1bHQsIHNvIHdlIHN0YXJ0IHdpdGggdGhlXG4gICAgICAgIC8vIE9CU0VSVkVEX0VSUk9SIHN0YXRlIGJlZm9yZSBvdmVyd3JpdGluZyBpdCB3aXRoIHRoZSByZWFsIHJldHVybiB2YWx1ZVxuICAgICAgICAvLyBvZiBpbml0aWFsaXplIC0tIGlmIGl0J3Mgc3RpbGwgc2V0IHRvIE9CU0VSVkVEX0VSUk9SIGluIHRoZSBmaW5hbGx5XG4gICAgICAgIC8vIGJsb2NrLCBpdCBtZWFucyB3cmFwcGVyLmluaXRpYWxpemUgdGhyZXcuXG4gICAgICAgIHRoaXMud3JhcHBlckluaXREYXRhW2ldID0gT0JTRVJWRURfRVJST1I7XG4gICAgICAgIHRoaXMud3JhcHBlckluaXREYXRhW2ldID0gd3JhcHBlci5pbml0aWFsaXplID8gd3JhcHBlci5pbml0aWFsaXplLmNhbGwodGhpcykgOiBudWxsO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHRoaXMud3JhcHBlckluaXREYXRhW2ldID09PSBPQlNFUlZFRF9FUlJPUikge1xuICAgICAgICAgIC8vIFRoZSBpbml0aWFsaXplciBmb3Igd3JhcHBlciBpIHRocmV3IGFuIGVycm9yOyBpbml0aWFsaXplIHRoZVxuICAgICAgICAgIC8vIHJlbWFpbmluZyB3cmFwcGVycyBidXQgc2lsZW5jZSBhbnkgZXhjZXB0aW9ucyBmcm9tIHRoZW0gdG8gZW5zdXJlXG4gICAgICAgICAgLy8gdGhhdCB0aGUgZmlyc3QgZXJyb3IgaXMgdGhlIG9uZSB0byBidWJibGUgdXAuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUFsbChpICsgMSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7fVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBJbnZva2VzIGVhY2ggb2YgYHRoaXMudHJhbnNhY3Rpb25XcmFwcGVycy5jbG9zZVtpXWAgZnVuY3Rpb25zLCBwYXNzaW5nIGludG9cbiAgICogdGhlbSB0aGUgcmVzcGVjdGl2ZSByZXR1cm4gdmFsdWVzIG9mIGB0aGlzLnRyYW5zYWN0aW9uV3JhcHBlcnMuaW5pdFtpXWBcbiAgICogKGBjbG9zZWBycyB0aGF0IGNvcnJlc3BvbmQgdG8gaW5pdGlhbGl6ZXJzIHRoYXQgZmFpbGVkIHdpbGwgbm90IGJlXG4gICAqIGludm9rZWQpLlxuICAgKi9cbiAgY2xvc2VBbGw6IGZ1bmN0aW9uIChzdGFydEluZGV4KSB7XG4gICAgIXRoaXMuaXNJblRyYW5zYWN0aW9uKCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnVHJhbnNhY3Rpb24uY2xvc2VBbGwoKTogQ2Fubm90IGNsb3NlIHRyYW5zYWN0aW9uIHdoZW4gbm9uZSBhcmUgb3Blbi4nKSA6IF9wcm9kSW52YXJpYW50KCcyOCcpIDogdm9pZCAwO1xuICAgIHZhciB0cmFuc2FjdGlvbldyYXBwZXJzID0gdGhpcy50cmFuc2FjdGlvbldyYXBwZXJzO1xuICAgIGZvciAodmFyIGkgPSBzdGFydEluZGV4OyBpIDwgdHJhbnNhY3Rpb25XcmFwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHdyYXBwZXIgPSB0cmFuc2FjdGlvbldyYXBwZXJzW2ldO1xuICAgICAgdmFyIGluaXREYXRhID0gdGhpcy53cmFwcGVySW5pdERhdGFbaV07XG4gICAgICB2YXIgZXJyb3JUaHJvd247XG4gICAgICB0cnkge1xuICAgICAgICAvLyBDYXRjaGluZyBlcnJvcnMgbWFrZXMgZGVidWdnaW5nIG1vcmUgZGlmZmljdWx0LCBzbyB3ZSBzdGFydCB3aXRoXG4gICAgICAgIC8vIGVycm9yVGhyb3duIHNldCB0byB0cnVlIGJlZm9yZSBzZXR0aW5nIGl0IHRvIGZhbHNlIGFmdGVyIGNhbGxpbmdcbiAgICAgICAgLy8gY2xvc2UgLS0gaWYgaXQncyBzdGlsbCBzZXQgdG8gdHJ1ZSBpbiB0aGUgZmluYWxseSBibG9jaywgaXQgbWVhbnNcbiAgICAgICAgLy8gd3JhcHBlci5jbG9zZSB0aHJldy5cbiAgICAgICAgZXJyb3JUaHJvd24gPSB0cnVlO1xuICAgICAgICBpZiAoaW5pdERhdGEgIT09IE9CU0VSVkVEX0VSUk9SICYmIHdyYXBwZXIuY2xvc2UpIHtcbiAgICAgICAgICB3cmFwcGVyLmNsb3NlLmNhbGwodGhpcywgaW5pdERhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVycm9yVGhyb3duID0gZmFsc2U7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoZXJyb3JUaHJvd24pIHtcbiAgICAgICAgICAvLyBUaGUgY2xvc2VyIGZvciB3cmFwcGVyIGkgdGhyZXcgYW4gZXJyb3I7IGNsb3NlIHRoZSByZW1haW5pbmdcbiAgICAgICAgICAvLyB3cmFwcGVycyBidXQgc2lsZW5jZSBhbnkgZXhjZXB0aW9ucyBmcm9tIHRoZW0gdG8gZW5zdXJlIHRoYXQgdGhlXG4gICAgICAgICAgLy8gZmlyc3QgZXJyb3IgaXMgdGhlIG9uZSB0byBidWJibGUgdXAuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VBbGwoaSArIDEpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy53cmFwcGVySW5pdERhdGEubGVuZ3RoID0gMDtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2FjdGlvbkltcGw7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvVHJhbnNhY3Rpb24uanNcbi8vIG1vZHVsZSBpZCA9IDI0MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 242 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\n/**\n * Gets the target node from a native browser event by accounting for\n * inconsistencies in browser DOM APIs.\n *\n * @param {object} nativeEvent Native browser event.\n * @return {DOMEventTarget} Target node.\n */\n\nfunction getEventTarget(nativeEvent) {\n  var target = nativeEvent.target || nativeEvent.srcElement || window;\n\n  // Normalize SVG <use> element events #4963\n  if (target.correspondingUseElement) {\n    target = target.correspondingUseElement;\n  }\n\n  // Safari may fire events on text nodes (Node.TEXT_NODE is 3).\n  // @see http://www.quirksmode.org/js/events_properties.html\n  return target.nodeType === 3 ? target.parentNode : target;\n}\n\nmodule.exports = getEventTarget;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2dldEV2ZW50VGFyZ2V0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogR2V0cyB0aGUgdGFyZ2V0IG5vZGUgZnJvbSBhIG5hdGl2ZSBicm93c2VyIGV2ZW50IGJ5IGFjY291bnRpbmcgZm9yXG4gKiBpbmNvbnNpc3RlbmNpZXMgaW4gYnJvd3NlciBET00gQVBJcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtET01FdmVudFRhcmdldH0gVGFyZ2V0IG5vZGUuXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpIHtcbiAgdmFyIHRhcmdldCA9IG5hdGl2ZUV2ZW50LnRhcmdldCB8fCBuYXRpdmVFdmVudC5zcmNFbGVtZW50IHx8IHdpbmRvdztcblxuICAvLyBOb3JtYWxpemUgU1ZHIDx1c2U+IGVsZW1lbnQgZXZlbnRzICM0OTYzXG4gIGlmICh0YXJnZXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpIHtcbiAgICB0YXJnZXQgPSB0YXJnZXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQ7XG4gIH1cblxuICAvLyBTYWZhcmkgbWF5IGZpcmUgZXZlbnRzIG9uIHRleHQgbm9kZXMgKE5vZGUuVEVYVF9OT0RFIGlzIDMpLlxuICAvLyBAc2VlIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX3Byb3BlcnRpZXMuaHRtbFxuICByZXR1cm4gdGFyZ2V0Lm5vZGVUeXBlID09PSAzID8gdGFyZ2V0LnBhcmVudE5vZGUgOiB0YXJnZXQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0RXZlbnRUYXJnZXQ7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvZ2V0RXZlbnRUYXJnZXQuanNcbi8vIG1vZHVsZSBpZCA9IDI0MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 243 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar ExecutionEnvironment = __webpack_require__(221);\n\nvar useHasFeature;\nif (ExecutionEnvironment.canUseDOM) {\n  useHasFeature = document.implementation && document.implementation.hasFeature &&\n  // always returns true in newer browsers as per the standard.\n  // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature\n  document.implementation.hasFeature('', '') !== true;\n}\n\n/**\n * Checks if an event is supported in the current execution environment.\n *\n * NOTE: This will not work correctly for non-generic events such as `change`,\n * `reset`, `load`, `error`, and `select`.\n *\n * Borrows from Modernizr.\n *\n * @param {string} eventNameSuffix Event name, e.g. \"click\".\n * @param {?boolean} capture Check if the capture phase is supported.\n * @return {boolean} True if the event is supported.\n * @internal\n * @license Modernizr 3.0.0pre (Custom Build) | MIT\n */\nfunction isEventSupported(eventNameSuffix, capture) {\n  if (!ExecutionEnvironment.canUseDOM || capture && !('addEventListener' in document)) {\n    return false;\n  }\n\n  var eventName = 'on' + eventNameSuffix;\n  var isSupported = eventName in document;\n\n  if (!isSupported) {\n    var element = document.createElement('div');\n    element.setAttribute(eventName, 'return;');\n    isSupported = typeof element[eventName] === 'function';\n  }\n\n  if (!isSupported && useHasFeature && eventNameSuffix === 'wheel') {\n    // This is the only way to test support for the `wheel` event in IE9+.\n    isSupported = document.implementation.hasFeature('Events.wheel', '3.0');\n  }\n\n  return isSupported;\n}\n\nmodule.exports = isEventSupported;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2lzRXZlbnRTdXBwb3J0ZWQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gcmVxdWlyZSgnZmJqcy9saWIvRXhlY3V0aW9uRW52aXJvbm1lbnQnKTtcblxudmFyIHVzZUhhc0ZlYXR1cmU7XG5pZiAoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKSB7XG4gIHVzZUhhc0ZlYXR1cmUgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbiAmJiBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlICYmXG4gIC8vIGFsd2F5cyByZXR1cm5zIHRydWUgaW4gbmV3ZXIgYnJvd3NlcnMgYXMgcGVyIHRoZSBzdGFuZGFyZC5cbiAgLy8gQHNlZSBodHRwOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWRvbWltcGxlbWVudGF0aW9uLWhhc2ZlYXR1cmVcbiAgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSgnJywgJycpICE9PSB0cnVlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBldmVudCBpcyBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuICpcbiAqIE5PVEU6IFRoaXMgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkgZm9yIG5vbi1nZW5lcmljIGV2ZW50cyBzdWNoIGFzIGBjaGFuZ2VgLFxuICogYHJlc2V0YCwgYGxvYWRgLCBgZXJyb3JgLCBhbmQgYHNlbGVjdGAuXG4gKlxuICogQm9ycm93cyBmcm9tIE1vZGVybml6ci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lU3VmZml4IEV2ZW50IG5hbWUsIGUuZy4gXCJjbGlja1wiLlxuICogQHBhcmFtIHs/Ym9vbGVhbn0gY2FwdHVyZSBDaGVjayBpZiB0aGUgY2FwdHVyZSBwaGFzZSBpcyBzdXBwb3J0ZWQuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBldmVudCBpcyBzdXBwb3J0ZWQuXG4gKiBAaW50ZXJuYWxcbiAqIEBsaWNlbnNlIE1vZGVybml6ciAzLjAuMHByZSAoQ3VzdG9tIEJ1aWxkKSB8IE1JVFxuICovXG5mdW5jdGlvbiBpc0V2ZW50U3VwcG9ydGVkKGV2ZW50TmFtZVN1ZmZpeCwgY2FwdHVyZSkge1xuICBpZiAoIUV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSB8fCBjYXB0dXJlICYmICEoJ2FkZEV2ZW50TGlzdGVuZXInIGluIGRvY3VtZW50KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBldmVudE5hbWUgPSAnb24nICsgZXZlbnROYW1lU3VmZml4O1xuICB2YXIgaXNTdXBwb3J0ZWQgPSBldmVudE5hbWUgaW4gZG9jdW1lbnQ7XG5cbiAgaWYgKCFpc1N1cHBvcnRlZCkge1xuICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoZXZlbnROYW1lLCAncmV0dXJuOycpO1xuICAgIGlzU3VwcG9ydGVkID0gdHlwZW9mIGVsZW1lbnRbZXZlbnROYW1lXSA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIGlmICghaXNTdXBwb3J0ZWQgJiYgdXNlSGFzRmVhdHVyZSAmJiBldmVudE5hbWVTdWZmaXggPT09ICd3aGVlbCcpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBvbmx5IHdheSB0byB0ZXN0IHN1cHBvcnQgZm9yIHRoZSBgd2hlZWxgIGV2ZW50IGluIElFOSsuXG4gICAgaXNTdXBwb3J0ZWQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCdFdmVudHMud2hlZWwnLCAnMy4wJyk7XG4gIH1cblxuICByZXR1cm4gaXNTdXBwb3J0ZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNFdmVudFN1cHBvcnRlZDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9pc0V2ZW50U3VwcG9ydGVkLmpzXG4vLyBtb2R1bGUgaWQgPSAyNDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 244 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\n/**\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary\n */\n\nvar supportedInputTypes = {\n  'color': true,\n  'date': true,\n  'datetime': true,\n  'datetime-local': true,\n  'email': true,\n  'month': true,\n  'number': true,\n  'password': true,\n  'range': true,\n  'search': true,\n  'tel': true,\n  'text': true,\n  'time': true,\n  'url': true,\n  'week': true\n};\n\nfunction isTextInputElement(elem) {\n  var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n\n  if (nodeName === 'input') {\n    return !!supportedInputTypes[elem.type];\n  }\n\n  if (nodeName === 'textarea') {\n    return true;\n  }\n\n  return false;\n}\n\nmodule.exports = isTextInputElement;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2lzVGV4dElucHV0RWxlbWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQHNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS90aGUtaW5wdXQtZWxlbWVudC5odG1sI2lucHV0LXR5cGUtYXR0ci1zdW1tYXJ5XG4gKi9cblxudmFyIHN1cHBvcnRlZElucHV0VHlwZXMgPSB7XG4gICdjb2xvcic6IHRydWUsXG4gICdkYXRlJzogdHJ1ZSxcbiAgJ2RhdGV0aW1lJzogdHJ1ZSxcbiAgJ2RhdGV0aW1lLWxvY2FsJzogdHJ1ZSxcbiAgJ2VtYWlsJzogdHJ1ZSxcbiAgJ21vbnRoJzogdHJ1ZSxcbiAgJ251bWJlcic6IHRydWUsXG4gICdwYXNzd29yZCc6IHRydWUsXG4gICdyYW5nZSc6IHRydWUsXG4gICdzZWFyY2gnOiB0cnVlLFxuICAndGVsJzogdHJ1ZSxcbiAgJ3RleHQnOiB0cnVlLFxuICAndGltZSc6IHRydWUsXG4gICd1cmwnOiB0cnVlLFxuICAnd2Vlayc6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGlzVGV4dElucHV0RWxlbWVudChlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKG5vZGVOYW1lID09PSAnaW5wdXQnKSB7XG4gICAgcmV0dXJuICEhc3VwcG9ydGVkSW5wdXRUeXBlc1tlbGVtLnR5cGVdO1xuICB9XG5cbiAgaWYgKG5vZGVOYW1lID09PSAndGV4dGFyZWEnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNUZXh0SW5wdXRFbGVtZW50O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL2lzVGV4dElucHV0RWxlbWVudC5qc1xuLy8gbW9kdWxlIGlkID0gMjQ0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 245 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\n/**\n * Module that is injectable into `EventPluginHub`, that specifies a\n * deterministic ordering of `EventPlugin`s. A convenient way to reason about\n * plugins, without having to package every one of them. This is better than\n * having plugins be ordered in the same order that they are injected because\n * that ordering would be influenced by the packaging order.\n * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that\n * preventing default on events is convenient in `SimpleEventPlugin` handlers.\n */\n\nvar DefaultEventPluginOrder = ['ResponderEventPlugin', 'SimpleEventPlugin', 'TapEventPlugin', 'EnterLeaveEventPlugin', 'ChangeEventPlugin', 'SelectEventPlugin', 'BeforeInputEventPlugin'];\n\nmodule.exports = DefaultEventPluginOrder;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0RlZmF1bHRFdmVudFBsdWdpbk9yZGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIHRoYXQgaXMgaW5qZWN0YWJsZSBpbnRvIGBFdmVudFBsdWdpbkh1YmAsIHRoYXQgc3BlY2lmaWVzIGFcbiAqIGRldGVybWluaXN0aWMgb3JkZXJpbmcgb2YgYEV2ZW50UGx1Z2luYHMuIEEgY29udmVuaWVudCB3YXkgdG8gcmVhc29uIGFib3V0XG4gKiBwbHVnaW5zLCB3aXRob3V0IGhhdmluZyB0byBwYWNrYWdlIGV2ZXJ5IG9uZSBvZiB0aGVtLiBUaGlzIGlzIGJldHRlciB0aGFuXG4gKiBoYXZpbmcgcGx1Z2lucyBiZSBvcmRlcmVkIGluIHRoZSBzYW1lIG9yZGVyIHRoYXQgdGhleSBhcmUgaW5qZWN0ZWQgYmVjYXVzZVxuICogdGhhdCBvcmRlcmluZyB3b3VsZCBiZSBpbmZsdWVuY2VkIGJ5IHRoZSBwYWNrYWdpbmcgb3JkZXIuXG4gKiBgUmVzcG9uZGVyRXZlbnRQbHVnaW5gIG11c3Qgb2NjdXIgYmVmb3JlIGBTaW1wbGVFdmVudFBsdWdpbmAgc28gdGhhdFxuICogcHJldmVudGluZyBkZWZhdWx0IG9uIGV2ZW50cyBpcyBjb252ZW5pZW50IGluIGBTaW1wbGVFdmVudFBsdWdpbmAgaGFuZGxlcnMuXG4gKi9cblxudmFyIERlZmF1bHRFdmVudFBsdWdpbk9yZGVyID0gWydSZXNwb25kZXJFdmVudFBsdWdpbicsICdTaW1wbGVFdmVudFBsdWdpbicsICdUYXBFdmVudFBsdWdpbicsICdFbnRlckxlYXZlRXZlbnRQbHVnaW4nLCAnQ2hhbmdlRXZlbnRQbHVnaW4nLCAnU2VsZWN0RXZlbnRQbHVnaW4nLCAnQmVmb3JlSW5wdXRFdmVudFBsdWdpbiddO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERlZmF1bHRFdmVudFBsdWdpbk9yZGVyO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL0RlZmF1bHRFdmVudFBsdWdpbk9yZGVyLmpzXG4vLyBtb2R1bGUgaWQgPSAyNDVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 246 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar EventPropagators = __webpack_require__(214);\nvar ReactDOMComponentTree = __webpack_require__(207);\nvar SyntheticMouseEvent = __webpack_require__(247);\n\nvar eventTypes = {\n  mouseEnter: {\n    registrationName: 'onMouseEnter',\n    dependencies: ['topMouseOut', 'topMouseOver']\n  },\n  mouseLeave: {\n    registrationName: 'onMouseLeave',\n    dependencies: ['topMouseOut', 'topMouseOver']\n  }\n};\n\nvar EnterLeaveEventPlugin = {\n\n  eventTypes: eventTypes,\n\n  /**\n   * For almost every interaction we care about, there will be both a top-level\n   * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that\n   * we do not extract duplicate events. However, moving the mouse into the\n   * browser from outside will not fire a `mouseout` event. In this case, we use\n   * the `mouseover` top-level event.\n   */\n  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n    if (topLevelType === 'topMouseOver' && (nativeEvent.relatedTarget || nativeEvent.fromElement)) {\n      return null;\n    }\n    if (topLevelType !== 'topMouseOut' && topLevelType !== 'topMouseOver') {\n      // Must not be a mouse in or mouse out - ignoring.\n      return null;\n    }\n\n    var win;\n    if (nativeEventTarget.window === nativeEventTarget) {\n      // `nativeEventTarget` is probably a window object.\n      win = nativeEventTarget;\n    } else {\n      // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.\n      var doc = nativeEventTarget.ownerDocument;\n      if (doc) {\n        win = doc.defaultView || doc.parentWindow;\n      } else {\n        win = window;\n      }\n    }\n\n    var from;\n    var to;\n    if (topLevelType === 'topMouseOut') {\n      from = targetInst;\n      var related = nativeEvent.relatedTarget || nativeEvent.toElement;\n      to = related ? ReactDOMComponentTree.getClosestInstanceFromNode(related) : null;\n    } else {\n      // Moving to a node from outside the window.\n      from = null;\n      to = targetInst;\n    }\n\n    if (from === to) {\n      // Nothing pertains to our managed components.\n      return null;\n    }\n\n    var fromNode = from == null ? win : ReactDOMComponentTree.getNodeFromInstance(from);\n    var toNode = to == null ? win : ReactDOMComponentTree.getNodeFromInstance(to);\n\n    var leave = SyntheticMouseEvent.getPooled(eventTypes.mouseLeave, from, nativeEvent, nativeEventTarget);\n    leave.type = 'mouseleave';\n    leave.target = fromNode;\n    leave.relatedTarget = toNode;\n\n    var enter = SyntheticMouseEvent.getPooled(eventTypes.mouseEnter, to, nativeEvent, nativeEventTarget);\n    enter.type = 'mouseenter';\n    enter.target = toNode;\n    enter.relatedTarget = fromNode;\n\n    EventPropagators.accumulateEnterLeaveDispatches(leave, enter, from, to);\n\n    return [leave, enter];\n  }\n\n};\n\nmodule.exports = EnterLeaveEventPlugin;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0VudGVyTGVhdmVFdmVudFBsdWdpbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXZlbnRQcm9wYWdhdG9ycyA9IHJlcXVpcmUoJy4vRXZlbnRQcm9wYWdhdG9ycycpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgU3ludGhldGljTW91c2VFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljTW91c2VFdmVudCcpO1xuXG52YXIgZXZlbnRUeXBlcyA9IHtcbiAgbW91c2VFbnRlcjoge1xuICAgIHJlZ2lzdHJhdGlvbk5hbWU6ICdvbk1vdXNlRW50ZXInLFxuICAgIGRlcGVuZGVuY2llczogWyd0b3BNb3VzZU91dCcsICd0b3BNb3VzZU92ZXInXVxuICB9LFxuICBtb3VzZUxlYXZlOiB7XG4gICAgcmVnaXN0cmF0aW9uTmFtZTogJ29uTW91c2VMZWF2ZScsXG4gICAgZGVwZW5kZW5jaWVzOiBbJ3RvcE1vdXNlT3V0JywgJ3RvcE1vdXNlT3ZlciddXG4gIH1cbn07XG5cbnZhciBFbnRlckxlYXZlRXZlbnRQbHVnaW4gPSB7XG5cbiAgZXZlbnRUeXBlczogZXZlbnRUeXBlcyxcblxuICAvKipcbiAgICogRm9yIGFsbW9zdCBldmVyeSBpbnRlcmFjdGlvbiB3ZSBjYXJlIGFib3V0LCB0aGVyZSB3aWxsIGJlIGJvdGggYSB0b3AtbGV2ZWxcbiAgICogYG1vdXNlb3ZlcmAgYW5kIGBtb3VzZW91dGAgZXZlbnQgdGhhdCBvY2N1cnMuIE9ubHkgdXNlIGBtb3VzZW91dGAgc28gdGhhdFxuICAgKiB3ZSBkbyBub3QgZXh0cmFjdCBkdXBsaWNhdGUgZXZlbnRzLiBIb3dldmVyLCBtb3ZpbmcgdGhlIG1vdXNlIGludG8gdGhlXG4gICAqIGJyb3dzZXIgZnJvbSBvdXRzaWRlIHdpbGwgbm90IGZpcmUgYSBgbW91c2VvdXRgIGV2ZW50LiBJbiB0aGlzIGNhc2UsIHdlIHVzZVxuICAgKiB0aGUgYG1vdXNlb3ZlcmAgdG9wLWxldmVsIGV2ZW50LlxuICAgKi9cbiAgZXh0cmFjdEV2ZW50czogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcE1vdXNlT3ZlcicgJiYgKG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQuZnJvbUVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRvcExldmVsVHlwZSAhPT0gJ3RvcE1vdXNlT3V0JyAmJiB0b3BMZXZlbFR5cGUgIT09ICd0b3BNb3VzZU92ZXInKSB7XG4gICAgICAvLyBNdXN0IG5vdCBiZSBhIG1vdXNlIGluIG9yIG1vdXNlIG91dCAtIGlnbm9yaW5nLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIHdpbjtcbiAgICBpZiAobmF0aXZlRXZlbnRUYXJnZXQud2luZG93ID09PSBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgICAgLy8gYG5hdGl2ZUV2ZW50VGFyZ2V0YCBpcyBwcm9iYWJseSBhIHdpbmRvdyBvYmplY3QuXG4gICAgICB3aW4gPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETzogRmlndXJlIG91dCB3aHkgYG93bmVyRG9jdW1lbnRgIGlzIHNvbWV0aW1lcyB1bmRlZmluZWQgaW4gSUU4LlxuICAgICAgdmFyIGRvYyA9IG5hdGl2ZUV2ZW50VGFyZ2V0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICBpZiAoZG9jKSB7XG4gICAgICAgIHdpbiA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luID0gd2luZG93O1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBmcm9tO1xuICAgIHZhciB0bztcbiAgICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wTW91c2VPdXQnKSB7XG4gICAgICBmcm9tID0gdGFyZ2V0SW5zdDtcbiAgICAgIHZhciByZWxhdGVkID0gbmF0aXZlRXZlbnQucmVsYXRlZFRhcmdldCB8fCBuYXRpdmVFdmVudC50b0VsZW1lbnQ7XG4gICAgICB0byA9IHJlbGF0ZWQgPyBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocmVsYXRlZCkgOiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBNb3ZpbmcgdG8gYSBub2RlIGZyb20gb3V0c2lkZSB0aGUgd2luZG93LlxuICAgICAgZnJvbSA9IG51bGw7XG4gICAgICB0byA9IHRhcmdldEluc3Q7XG4gICAgfVxuXG4gICAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgICAvLyBOb3RoaW5nIHBlcnRhaW5zIHRvIG91ciBtYW5hZ2VkIGNvbXBvbmVudHMuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgZnJvbU5vZGUgPSBmcm9tID09IG51bGwgPyB3aW4gOiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShmcm9tKTtcbiAgICB2YXIgdG9Ob2RlID0gdG8gPT0gbnVsbCA/IHdpbiA6IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHRvKTtcblxuICAgIHZhciBsZWF2ZSA9IFN5bnRoZXRpY01vdXNlRXZlbnQuZ2V0UG9vbGVkKGV2ZW50VHlwZXMubW91c2VMZWF2ZSwgZnJvbSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBsZWF2ZS50eXBlID0gJ21vdXNlbGVhdmUnO1xuICAgIGxlYXZlLnRhcmdldCA9IGZyb21Ob2RlO1xuICAgIGxlYXZlLnJlbGF0ZWRUYXJnZXQgPSB0b05vZGU7XG5cbiAgICB2YXIgZW50ZXIgPSBTeW50aGV0aWNNb3VzZUV2ZW50LmdldFBvb2xlZChldmVudFR5cGVzLm1vdXNlRW50ZXIsIHRvLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGVudGVyLnR5cGUgPSAnbW91c2VlbnRlcic7XG4gICAgZW50ZXIudGFyZ2V0ID0gdG9Ob2RlO1xuICAgIGVudGVyLnJlbGF0ZWRUYXJnZXQgPSBmcm9tTm9kZTtcblxuICAgIEV2ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0ZUVudGVyTGVhdmVEaXNwYXRjaGVzKGxlYXZlLCBlbnRlciwgZnJvbSwgdG8pO1xuXG4gICAgcmV0dXJuIFtsZWF2ZSwgZW50ZXJdO1xuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRW50ZXJMZWF2ZUV2ZW50UGx1Z2luO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL0VudGVyTGVhdmVFdmVudFBsdWdpbi5qc1xuLy8gbW9kdWxlIGlkID0gMjQ2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 247 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar SyntheticUIEvent = __webpack_require__(248);\nvar ViewportMetrics = __webpack_require__(249);\n\nvar getEventModifierState = __webpack_require__(250);\n\n/**\n * @interface MouseEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar MouseEventInterface = {\n  screenX: null,\n  screenY: null,\n  clientX: null,\n  clientY: null,\n  ctrlKey: null,\n  shiftKey: null,\n  altKey: null,\n  metaKey: null,\n  getModifierState: getEventModifierState,\n  button: function (event) {\n    // Webkit, Firefox, IE9+\n    // which:  1 2 3\n    // button: 0 1 2 (standard)\n    var button = event.button;\n    if ('which' in event) {\n      return button;\n    }\n    // IE<9\n    // which:  undefined\n    // button: 0 0 0\n    // button: 1 4 2 (onmouseup)\n    return button === 2 ? 2 : button === 4 ? 1 : 0;\n  },\n  buttons: null,\n  relatedTarget: function (event) {\n    return event.relatedTarget || (event.fromElement === event.srcElement ? event.toElement : event.fromElement);\n  },\n  // \"Proprietary\" Interface.\n  pageX: function (event) {\n    return 'pageX' in event ? event.pageX : event.clientX + ViewportMetrics.currentScrollLeft;\n  },\n  pageY: function (event) {\n    return 'pageY' in event ? event.pageY : event.clientY + ViewportMetrics.currentScrollTop;\n  }\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticMouseEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n  return SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticUIEvent.augmentClass(SyntheticMouseEvent, MouseEventInterface);\n\nmodule.exports = SyntheticMouseEvent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY01vdXNlRXZlbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY1VJRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY1VJRXZlbnQnKTtcbnZhciBWaWV3cG9ydE1ldHJpY3MgPSByZXF1aXJlKCcuL1ZpZXdwb3J0TWV0cmljcycpO1xuXG52YXIgZ2V0RXZlbnRNb2RpZmllclN0YXRlID0gcmVxdWlyZSgnLi9nZXRFdmVudE1vZGlmaWVyU3RhdGUnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIE1vdXNlRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG52YXIgTW91c2VFdmVudEludGVyZmFjZSA9IHtcbiAgc2NyZWVuWDogbnVsbCxcbiAgc2NyZWVuWTogbnVsbCxcbiAgY2xpZW50WDogbnVsbCxcbiAgY2xpZW50WTogbnVsbCxcbiAgY3RybEtleTogbnVsbCxcbiAgc2hpZnRLZXk6IG51bGwsXG4gIGFsdEtleTogbnVsbCxcbiAgbWV0YUtleTogbnVsbCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlLFxuICBidXR0b246IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIFdlYmtpdCwgRmlyZWZveCwgSUU5K1xuICAgIC8vIHdoaWNoOiAgMSAyIDNcbiAgICAvLyBidXR0b246IDAgMSAyIChzdGFuZGFyZClcbiAgICB2YXIgYnV0dG9uID0gZXZlbnQuYnV0dG9uO1xuICAgIGlmICgnd2hpY2gnIGluIGV2ZW50KSB7XG4gICAgICByZXR1cm4gYnV0dG9uO1xuICAgIH1cbiAgICAvLyBJRTw5XG4gICAgLy8gd2hpY2g6ICB1bmRlZmluZWRcbiAgICAvLyBidXR0b246IDAgMCAwXG4gICAgLy8gYnV0dG9uOiAxIDQgMiAob25tb3VzZXVwKVxuICAgIHJldHVybiBidXR0b24gPT09IDIgPyAyIDogYnV0dG9uID09PSA0ID8gMSA6IDA7XG4gIH0sXG4gIGJ1dHRvbnM6IG51bGwsXG4gIHJlbGF0ZWRUYXJnZXQ6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiBldmVudC5yZWxhdGVkVGFyZ2V0IHx8IChldmVudC5mcm9tRWxlbWVudCA9PT0gZXZlbnQuc3JjRWxlbWVudCA/IGV2ZW50LnRvRWxlbWVudCA6IGV2ZW50LmZyb21FbGVtZW50KTtcbiAgfSxcbiAgLy8gXCJQcm9wcmlldGFyeVwiIEludGVyZmFjZS5cbiAgcGFnZVg6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAncGFnZVgnIGluIGV2ZW50ID8gZXZlbnQucGFnZVggOiBldmVudC5jbGllbnRYICsgVmlld3BvcnRNZXRyaWNzLmN1cnJlbnRTY3JvbGxMZWZ0O1xuICB9LFxuICBwYWdlWTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdwYWdlWScgaW4gZXZlbnQgPyBldmVudC5wYWdlWSA6IGV2ZW50LmNsaWVudFkgKyBWaWV3cG9ydE1ldHJpY3MuY3VycmVudFNjcm9sbFRvcDtcbiAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAZXh0ZW5kcyB7U3ludGhldGljVUlFdmVudH1cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljTW91c2VFdmVudChkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICByZXR1cm4gU3ludGhldGljVUlFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuU3ludGhldGljVUlFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljTW91c2VFdmVudCwgTW91c2VFdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljTW91c2VFdmVudDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNNb3VzZUV2ZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAyNDdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 248 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar SyntheticEvent = __webpack_require__(226);\n\nvar getEventTarget = __webpack_require__(242);\n\n/**\n * @interface UIEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar UIEventInterface = {\n  view: function (event) {\n    if (event.view) {\n      return event.view;\n    }\n\n    var target = getEventTarget(event);\n    if (target.window === target) {\n      // target is a window object\n      return target;\n    }\n\n    var doc = target.ownerDocument;\n    // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.\n    if (doc) {\n      return doc.defaultView || doc.parentWindow;\n    } else {\n      return window;\n    }\n  },\n  detail: function (event) {\n    return event.detail || 0;\n  }\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticEvent}\n */\nfunction SyntheticUIEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n  return SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticEvent.augmentClass(SyntheticUIEvent, UIEventInterface);\n\nmodule.exports = SyntheticUIEvent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY1VJRXZlbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY0V2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNFdmVudCcpO1xuXG52YXIgZ2V0RXZlbnRUYXJnZXQgPSByZXF1aXJlKCcuL2dldEV2ZW50VGFyZ2V0Jyk7XG5cbi8qKlxuICogQGludGVyZmFjZSBVSUV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xudmFyIFVJRXZlbnRJbnRlcmZhY2UgPSB7XG4gIHZpZXc6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudC52aWV3KSB7XG4gICAgICByZXR1cm4gZXZlbnQudmlldztcbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0ID0gZ2V0RXZlbnRUYXJnZXQoZXZlbnQpO1xuICAgIGlmICh0YXJnZXQud2luZG93ID09PSB0YXJnZXQpIHtcbiAgICAgIC8vIHRhcmdldCBpcyBhIHdpbmRvdyBvYmplY3RcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgdmFyIGRvYyA9IHRhcmdldC5vd25lckRvY3VtZW50O1xuICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2h5IGBvd25lckRvY3VtZW50YCBpcyBzb21ldGltZXMgdW5kZWZpbmVkIGluIElFOC5cbiAgICBpZiAoZG9jKSB7XG4gICAgICByZXR1cm4gZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3c7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgfVxuICB9LFxuICBkZXRhaWw6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiBldmVudC5kZXRhaWwgfHwgMDtcbiAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAZXh0ZW5kcyB7U3ludGhldGljRXZlbnR9XG4gKi9cbmZ1bmN0aW9uIFN5bnRoZXRpY1VJRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY0V2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljVUlFdmVudCwgVUlFdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljVUlFdmVudDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNVSUV2ZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAyNDhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 249 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar ViewportMetrics = {\n\n  currentScrollLeft: 0,\n\n  currentScrollTop: 0,\n\n  refreshScrollValues: function (scrollPosition) {\n    ViewportMetrics.currentScrollLeft = scrollPosition.x;\n    ViewportMetrics.currentScrollTop = scrollPosition.y;\n  }\n\n};\n\nmodule.exports = ViewportMetrics;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1ZpZXdwb3J0TWV0cmljcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmlld3BvcnRNZXRyaWNzID0ge1xuXG4gIGN1cnJlbnRTY3JvbGxMZWZ0OiAwLFxuXG4gIGN1cnJlbnRTY3JvbGxUb3A6IDAsXG5cbiAgcmVmcmVzaFNjcm9sbFZhbHVlczogZnVuY3Rpb24gKHNjcm9sbFBvc2l0aW9uKSB7XG4gICAgVmlld3BvcnRNZXRyaWNzLmN1cnJlbnRTY3JvbGxMZWZ0ID0gc2Nyb2xsUG9zaXRpb24ueDtcbiAgICBWaWV3cG9ydE1ldHJpY3MuY3VycmVudFNjcm9sbFRvcCA9IHNjcm9sbFBvc2l0aW9uLnk7XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBWaWV3cG9ydE1ldHJpY3M7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvVmlld3BvcnRNZXRyaWNzLmpzXG4vLyBtb2R1bGUgaWQgPSAyNDlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 250 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\n/**\n * Translation from modifier key to the associated property in the event.\n * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers\n */\n\nvar modifierKeyToProp = {\n  'Alt': 'altKey',\n  'Control': 'ctrlKey',\n  'Meta': 'metaKey',\n  'Shift': 'shiftKey'\n};\n\n// IE8 does not implement getModifierState so we simply map it to the only\n// modifier keys exposed by the event itself, does not support Lock-keys.\n// Currently, all major browsers except Chrome seems to support Lock-keys.\nfunction modifierStateGetter(keyArg) {\n  var syntheticEvent = this;\n  var nativeEvent = syntheticEvent.nativeEvent;\n  if (nativeEvent.getModifierState) {\n    return nativeEvent.getModifierState(keyArg);\n  }\n  var keyProp = modifierKeyToProp[keyArg];\n  return keyProp ? !!nativeEvent[keyProp] : false;\n}\n\nfunction getEventModifierState(nativeEvent) {\n  return modifierStateGetter;\n}\n\nmodule.exports = getEventModifierState;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2dldEV2ZW50TW9kaWZpZXJTdGF0ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFRyYW5zbGF0aW9uIGZyb20gbW9kaWZpZXIga2V5IHRvIHRoZSBhc3NvY2lhdGVkIHByb3BlcnR5IGluIHRoZSBldmVudC5cbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNrZXlzLU1vZGlmaWVyc1xuICovXG5cbnZhciBtb2RpZmllcktleVRvUHJvcCA9IHtcbiAgJ0FsdCc6ICdhbHRLZXknLFxuICAnQ29udHJvbCc6ICdjdHJsS2V5JyxcbiAgJ01ldGEnOiAnbWV0YUtleScsXG4gICdTaGlmdCc6ICdzaGlmdEtleSdcbn07XG5cbi8vIElFOCBkb2VzIG5vdCBpbXBsZW1lbnQgZ2V0TW9kaWZpZXJTdGF0ZSBzbyB3ZSBzaW1wbHkgbWFwIGl0IHRvIHRoZSBvbmx5XG4vLyBtb2RpZmllciBrZXlzIGV4cG9zZWQgYnkgdGhlIGV2ZW50IGl0c2VsZiwgZG9lcyBub3Qgc3VwcG9ydCBMb2NrLWtleXMuXG4vLyBDdXJyZW50bHksIGFsbCBtYWpvciBicm93c2VycyBleGNlcHQgQ2hyb21lIHNlZW1zIHRvIHN1cHBvcnQgTG9jay1rZXlzLlxuZnVuY3Rpb24gbW9kaWZpZXJTdGF0ZUdldHRlcihrZXlBcmcpIHtcbiAgdmFyIHN5bnRoZXRpY0V2ZW50ID0gdGhpcztcbiAgdmFyIG5hdGl2ZUV2ZW50ID0gc3ludGhldGljRXZlbnQubmF0aXZlRXZlbnQ7XG4gIGlmIChuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0YXRlKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUoa2V5QXJnKTtcbiAgfVxuICB2YXIga2V5UHJvcCA9IG1vZGlmaWVyS2V5VG9Qcm9wW2tleUFyZ107XG4gIHJldHVybiBrZXlQcm9wID8gISFuYXRpdmVFdmVudFtrZXlQcm9wXSA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudE1vZGlmaWVyU3RhdGUobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIG1vZGlmaWVyU3RhdGVHZXR0ZXI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0RXZlbnRNb2RpZmllclN0YXRlO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL2dldEV2ZW50TW9kaWZpZXJTdGF0ZS5qc1xuLy8gbW9kdWxlIGlkID0gMjUwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 251 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar DOMProperty = __webpack_require__(209);\n\nvar MUST_USE_PROPERTY = DOMProperty.injection.MUST_USE_PROPERTY;\nvar HAS_BOOLEAN_VALUE = DOMProperty.injection.HAS_BOOLEAN_VALUE;\nvar HAS_NUMERIC_VALUE = DOMProperty.injection.HAS_NUMERIC_VALUE;\nvar HAS_POSITIVE_NUMERIC_VALUE = DOMProperty.injection.HAS_POSITIVE_NUMERIC_VALUE;\nvar HAS_OVERLOADED_BOOLEAN_VALUE = DOMProperty.injection.HAS_OVERLOADED_BOOLEAN_VALUE;\n\nvar HTMLDOMPropertyConfig = {\n  isCustomAttribute: RegExp.prototype.test.bind(new RegExp('^(data|aria)-[' + DOMProperty.ATTRIBUTE_NAME_CHAR + ']*$')),\n  Properties: {\n    /**\n     * Standard Properties\n     */\n    accept: 0,\n    acceptCharset: 0,\n    accessKey: 0,\n    action: 0,\n    allowFullScreen: HAS_BOOLEAN_VALUE,\n    allowTransparency: 0,\n    alt: 0,\n    // specifies target context for links with `preload` type\n    as: 0,\n    async: HAS_BOOLEAN_VALUE,\n    autoComplete: 0,\n    // autoFocus is polyfilled/normalized by AutoFocusUtils\n    // autoFocus: HAS_BOOLEAN_VALUE,\n    autoPlay: HAS_BOOLEAN_VALUE,\n    capture: HAS_BOOLEAN_VALUE,\n    cellPadding: 0,\n    cellSpacing: 0,\n    charSet: 0,\n    challenge: 0,\n    checked: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n    cite: 0,\n    classID: 0,\n    className: 0,\n    cols: HAS_POSITIVE_NUMERIC_VALUE,\n    colSpan: 0,\n    content: 0,\n    contentEditable: 0,\n    contextMenu: 0,\n    controls: HAS_BOOLEAN_VALUE,\n    coords: 0,\n    crossOrigin: 0,\n    data: 0, // For `<object />` acts as `src`.\n    dateTime: 0,\n    'default': HAS_BOOLEAN_VALUE,\n    defer: HAS_BOOLEAN_VALUE,\n    dir: 0,\n    disabled: HAS_BOOLEAN_VALUE,\n    download: HAS_OVERLOADED_BOOLEAN_VALUE,\n    draggable: 0,\n    encType: 0,\n    form: 0,\n    formAction: 0,\n    formEncType: 0,\n    formMethod: 0,\n    formNoValidate: HAS_BOOLEAN_VALUE,\n    formTarget: 0,\n    frameBorder: 0,\n    headers: 0,\n    height: 0,\n    hidden: HAS_BOOLEAN_VALUE,\n    high: 0,\n    href: 0,\n    hrefLang: 0,\n    htmlFor: 0,\n    httpEquiv: 0,\n    icon: 0,\n    id: 0,\n    inputMode: 0,\n    integrity: 0,\n    is: 0,\n    keyParams: 0,\n    keyType: 0,\n    kind: 0,\n    label: 0,\n    lang: 0,\n    list: 0,\n    loop: HAS_BOOLEAN_VALUE,\n    low: 0,\n    manifest: 0,\n    marginHeight: 0,\n    marginWidth: 0,\n    max: 0,\n    maxLength: 0,\n    media: 0,\n    mediaGroup: 0,\n    method: 0,\n    min: 0,\n    minLength: 0,\n    // Caution; `option.selected` is not updated if `select.multiple` is\n    // disabled with `removeAttribute`.\n    multiple: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n    muted: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n    name: 0,\n    nonce: 0,\n    noValidate: HAS_BOOLEAN_VALUE,\n    open: HAS_BOOLEAN_VALUE,\n    optimum: 0,\n    pattern: 0,\n    placeholder: 0,\n    playsInline: HAS_BOOLEAN_VALUE,\n    poster: 0,\n    preload: 0,\n    profile: 0,\n    radioGroup: 0,\n    readOnly: HAS_BOOLEAN_VALUE,\n    referrerPolicy: 0,\n    rel: 0,\n    required: HAS_BOOLEAN_VALUE,\n    reversed: HAS_BOOLEAN_VALUE,\n    role: 0,\n    rows: HAS_POSITIVE_NUMERIC_VALUE,\n    rowSpan: HAS_NUMERIC_VALUE,\n    sandbox: 0,\n    scope: 0,\n    scoped: HAS_BOOLEAN_VALUE,\n    scrolling: 0,\n    seamless: HAS_BOOLEAN_VALUE,\n    selected: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n    shape: 0,\n    size: HAS_POSITIVE_NUMERIC_VALUE,\n    sizes: 0,\n    span: HAS_POSITIVE_NUMERIC_VALUE,\n    spellCheck: 0,\n    src: 0,\n    srcDoc: 0,\n    srcLang: 0,\n    srcSet: 0,\n    start: HAS_NUMERIC_VALUE,\n    step: 0,\n    style: 0,\n    summary: 0,\n    tabIndex: 0,\n    target: 0,\n    title: 0,\n    // Setting .type throws on non-<input> tags\n    type: 0,\n    useMap: 0,\n    value: 0,\n    width: 0,\n    wmode: 0,\n    wrap: 0,\n\n    /**\n     * RDFa Properties\n     */\n    about: 0,\n    datatype: 0,\n    inlist: 0,\n    prefix: 0,\n    // property is also supported for OpenGraph in meta tags.\n    property: 0,\n    resource: 0,\n    'typeof': 0,\n    vocab: 0,\n\n    /**\n     * Non-standard Properties\n     */\n    // autoCapitalize and autoCorrect are supported in Mobile Safari for\n    // keyboard hints.\n    autoCapitalize: 0,\n    autoCorrect: 0,\n    // autoSave allows WebKit/Blink to persist values of input fields on page reloads\n    autoSave: 0,\n    // color is for Safari mask-icon link\n    color: 0,\n    // itemProp, itemScope, itemType are for\n    // Microdata support. See http://schema.org/docs/gs.html\n    itemProp: 0,\n    itemScope: HAS_BOOLEAN_VALUE,\n    itemType: 0,\n    // itemID and itemRef are for Microdata support as well but\n    // only specified in the WHATWG spec document. See\n    // https://html.spec.whatwg.org/multipage/microdata.html#microdata-dom-api\n    itemID: 0,\n    itemRef: 0,\n    // results show looking glass icon and recent searches on input\n    // search fields in WebKit/Blink\n    results: 0,\n    // IE-only attribute that specifies security restrictions on an iframe\n    // as an alternative to the sandbox attribute on IE<10\n    security: 0,\n    // IE-only attribute that controls focus behavior\n    unselectable: 0\n  },\n  DOMAttributeNames: {\n    acceptCharset: 'accept-charset',\n    className: 'class',\n    htmlFor: 'for',\n    httpEquiv: 'http-equiv'\n  },\n  DOMPropertyNames: {}\n};\n\nmodule.exports = HTMLDOMPropertyConfig;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0hUTUxET01Qcm9wZXJ0eUNvbmZpZy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NUHJvcGVydHkgPSByZXF1aXJlKCcuL0RPTVByb3BlcnR5Jyk7XG5cbnZhciBNVVNUX1VTRV9QUk9QRVJUWSA9IERPTVByb3BlcnR5LmluamVjdGlvbi5NVVNUX1VTRV9QUk9QRVJUWTtcbnZhciBIQVNfQk9PTEVBTl9WQUxVRSA9IERPTVByb3BlcnR5LmluamVjdGlvbi5IQVNfQk9PTEVBTl9WQUxVRTtcbnZhciBIQVNfTlVNRVJJQ19WQUxVRSA9IERPTVByb3BlcnR5LmluamVjdGlvbi5IQVNfTlVNRVJJQ19WQUxVRTtcbnZhciBIQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRSA9IERPTVByb3BlcnR5LmluamVjdGlvbi5IQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRTtcbnZhciBIQVNfT1ZFUkxPQURFRF9CT09MRUFOX1ZBTFVFID0gRE9NUHJvcGVydHkuaW5qZWN0aW9uLkhBU19PVkVSTE9BREVEX0JPT0xFQU5fVkFMVUU7XG5cbnZhciBIVE1MRE9NUHJvcGVydHlDb25maWcgPSB7XG4gIGlzQ3VzdG9tQXR0cmlidXRlOiBSZWdFeHAucHJvdG90eXBlLnRlc3QuYmluZChuZXcgUmVnRXhwKCdeKGRhdGF8YXJpYSktWycgKyBET01Qcm9wZXJ0eS5BVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpKSxcbiAgUHJvcGVydGllczoge1xuICAgIC8qKlxuICAgICAqIFN0YW5kYXJkIFByb3BlcnRpZXNcbiAgICAgKi9cbiAgICBhY2NlcHQ6IDAsXG4gICAgYWNjZXB0Q2hhcnNldDogMCxcbiAgICBhY2Nlc3NLZXk6IDAsXG4gICAgYWN0aW9uOiAwLFxuICAgIGFsbG93RnVsbFNjcmVlbjogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgYWxsb3dUcmFuc3BhcmVuY3k6IDAsXG4gICAgYWx0OiAwLFxuICAgIC8vIHNwZWNpZmllcyB0YXJnZXQgY29udGV4dCBmb3IgbGlua3Mgd2l0aCBgcHJlbG9hZGAgdHlwZVxuICAgIGFzOiAwLFxuICAgIGFzeW5jOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBhdXRvQ29tcGxldGU6IDAsXG4gICAgLy8gYXV0b0ZvY3VzIGlzIHBvbHlmaWxsZWQvbm9ybWFsaXplZCBieSBBdXRvRm9jdXNVdGlsc1xuICAgIC8vIGF1dG9Gb2N1czogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgYXV0b1BsYXk6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGNhcHR1cmU6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGNlbGxQYWRkaW5nOiAwLFxuICAgIGNlbGxTcGFjaW5nOiAwLFxuICAgIGNoYXJTZXQ6IDAsXG4gICAgY2hhbGxlbmdlOiAwLFxuICAgIGNoZWNrZWQ6IE1VU1RfVVNFX1BST1BFUlRZIHwgSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgY2l0ZTogMCxcbiAgICBjbGFzc0lEOiAwLFxuICAgIGNsYXNzTmFtZTogMCxcbiAgICBjb2xzOiBIQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRSxcbiAgICBjb2xTcGFuOiAwLFxuICAgIGNvbnRlbnQ6IDAsXG4gICAgY29udGVudEVkaXRhYmxlOiAwLFxuICAgIGNvbnRleHRNZW51OiAwLFxuICAgIGNvbnRyb2xzOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBjb29yZHM6IDAsXG4gICAgY3Jvc3NPcmlnaW46IDAsXG4gICAgZGF0YTogMCwgLy8gRm9yIGA8b2JqZWN0IC8+YCBhY3RzIGFzIGBzcmNgLlxuICAgIGRhdGVUaW1lOiAwLFxuICAgICdkZWZhdWx0JzogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgZGVmZXI6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGRpcjogMCxcbiAgICBkaXNhYmxlZDogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgZG93bmxvYWQ6IEhBU19PVkVSTE9BREVEX0JPT0xFQU5fVkFMVUUsXG4gICAgZHJhZ2dhYmxlOiAwLFxuICAgIGVuY1R5cGU6IDAsXG4gICAgZm9ybTogMCxcbiAgICBmb3JtQWN0aW9uOiAwLFxuICAgIGZvcm1FbmNUeXBlOiAwLFxuICAgIGZvcm1NZXRob2Q6IDAsXG4gICAgZm9ybU5vVmFsaWRhdGU6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGZvcm1UYXJnZXQ6IDAsXG4gICAgZnJhbWVCb3JkZXI6IDAsXG4gICAgaGVhZGVyczogMCxcbiAgICBoZWlnaHQ6IDAsXG4gICAgaGlkZGVuOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBoaWdoOiAwLFxuICAgIGhyZWY6IDAsXG4gICAgaHJlZkxhbmc6IDAsXG4gICAgaHRtbEZvcjogMCxcbiAgICBodHRwRXF1aXY6IDAsXG4gICAgaWNvbjogMCxcbiAgICBpZDogMCxcbiAgICBpbnB1dE1vZGU6IDAsXG4gICAgaW50ZWdyaXR5OiAwLFxuICAgIGlzOiAwLFxuICAgIGtleVBhcmFtczogMCxcbiAgICBrZXlUeXBlOiAwLFxuICAgIGtpbmQ6IDAsXG4gICAgbGFiZWw6IDAsXG4gICAgbGFuZzogMCxcbiAgICBsaXN0OiAwLFxuICAgIGxvb3A6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGxvdzogMCxcbiAgICBtYW5pZmVzdDogMCxcbiAgICBtYXJnaW5IZWlnaHQ6IDAsXG4gICAgbWFyZ2luV2lkdGg6IDAsXG4gICAgbWF4OiAwLFxuICAgIG1heExlbmd0aDogMCxcbiAgICBtZWRpYTogMCxcbiAgICBtZWRpYUdyb3VwOiAwLFxuICAgIG1ldGhvZDogMCxcbiAgICBtaW46IDAsXG4gICAgbWluTGVuZ3RoOiAwLFxuICAgIC8vIENhdXRpb247IGBvcHRpb24uc2VsZWN0ZWRgIGlzIG5vdCB1cGRhdGVkIGlmIGBzZWxlY3QubXVsdGlwbGVgIGlzXG4gICAgLy8gZGlzYWJsZWQgd2l0aCBgcmVtb3ZlQXR0cmlidXRlYC5cbiAgICBtdWx0aXBsZTogTVVTVF9VU0VfUFJPUEVSVFkgfCBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBtdXRlZDogTVVTVF9VU0VfUFJPUEVSVFkgfCBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBuYW1lOiAwLFxuICAgIG5vbmNlOiAwLFxuICAgIG5vVmFsaWRhdGU6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIG9wZW46IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIG9wdGltdW06IDAsXG4gICAgcGF0dGVybjogMCxcbiAgICBwbGFjZWhvbGRlcjogMCxcbiAgICBwbGF5c0lubGluZTogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgcG9zdGVyOiAwLFxuICAgIHByZWxvYWQ6IDAsXG4gICAgcHJvZmlsZTogMCxcbiAgICByYWRpb0dyb3VwOiAwLFxuICAgIHJlYWRPbmx5OiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICByZWZlcnJlclBvbGljeTogMCxcbiAgICByZWw6IDAsXG4gICAgcmVxdWlyZWQ6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIHJldmVyc2VkOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICByb2xlOiAwLFxuICAgIHJvd3M6IEhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVFLFxuICAgIHJvd1NwYW46IEhBU19OVU1FUklDX1ZBTFVFLFxuICAgIHNhbmRib3g6IDAsXG4gICAgc2NvcGU6IDAsXG4gICAgc2NvcGVkOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBzY3JvbGxpbmc6IDAsXG4gICAgc2VhbWxlc3M6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIHNlbGVjdGVkOiBNVVNUX1VTRV9QUk9QRVJUWSB8IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIHNoYXBlOiAwLFxuICAgIHNpemU6IEhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVFLFxuICAgIHNpemVzOiAwLFxuICAgIHNwYW46IEhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVFLFxuICAgIHNwZWxsQ2hlY2s6IDAsXG4gICAgc3JjOiAwLFxuICAgIHNyY0RvYzogMCxcbiAgICBzcmNMYW5nOiAwLFxuICAgIHNyY1NldDogMCxcbiAgICBzdGFydDogSEFTX05VTUVSSUNfVkFMVUUsXG4gICAgc3RlcDogMCxcbiAgICBzdHlsZTogMCxcbiAgICBzdW1tYXJ5OiAwLFxuICAgIHRhYkluZGV4OiAwLFxuICAgIHRhcmdldDogMCxcbiAgICB0aXRsZTogMCxcbiAgICAvLyBTZXR0aW5nIC50eXBlIHRocm93cyBvbiBub24tPGlucHV0PiB0YWdzXG4gICAgdHlwZTogMCxcbiAgICB1c2VNYXA6IDAsXG4gICAgdmFsdWU6IDAsXG4gICAgd2lkdGg6IDAsXG4gICAgd21vZGU6IDAsXG4gICAgd3JhcDogMCxcblxuICAgIC8qKlxuICAgICAqIFJERmEgUHJvcGVydGllc1xuICAgICAqL1xuICAgIGFib3V0OiAwLFxuICAgIGRhdGF0eXBlOiAwLFxuICAgIGlubGlzdDogMCxcbiAgICBwcmVmaXg6IDAsXG4gICAgLy8gcHJvcGVydHkgaXMgYWxzbyBzdXBwb3J0ZWQgZm9yIE9wZW5HcmFwaCBpbiBtZXRhIHRhZ3MuXG4gICAgcHJvcGVydHk6IDAsXG4gICAgcmVzb3VyY2U6IDAsXG4gICAgJ3R5cGVvZic6IDAsXG4gICAgdm9jYWI6IDAsXG5cbiAgICAvKipcbiAgICAgKiBOb24tc3RhbmRhcmQgUHJvcGVydGllc1xuICAgICAqL1xuICAgIC8vIGF1dG9DYXBpdGFsaXplIGFuZCBhdXRvQ29ycmVjdCBhcmUgc3VwcG9ydGVkIGluIE1vYmlsZSBTYWZhcmkgZm9yXG4gICAgLy8ga2V5Ym9hcmQgaGludHMuXG4gICAgYXV0b0NhcGl0YWxpemU6IDAsXG4gICAgYXV0b0NvcnJlY3Q6IDAsXG4gICAgLy8gYXV0b1NhdmUgYWxsb3dzIFdlYktpdC9CbGluayB0byBwZXJzaXN0IHZhbHVlcyBvZiBpbnB1dCBmaWVsZHMgb24gcGFnZSByZWxvYWRzXG4gICAgYXV0b1NhdmU6IDAsXG4gICAgLy8gY29sb3IgaXMgZm9yIFNhZmFyaSBtYXNrLWljb24gbGlua1xuICAgIGNvbG9yOiAwLFxuICAgIC8vIGl0ZW1Qcm9wLCBpdGVtU2NvcGUsIGl0ZW1UeXBlIGFyZSBmb3JcbiAgICAvLyBNaWNyb2RhdGEgc3VwcG9ydC4gU2VlIGh0dHA6Ly9zY2hlbWEub3JnL2RvY3MvZ3MuaHRtbFxuICAgIGl0ZW1Qcm9wOiAwLFxuICAgIGl0ZW1TY29wZTogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgaXRlbVR5cGU6IDAsXG4gICAgLy8gaXRlbUlEIGFuZCBpdGVtUmVmIGFyZSBmb3IgTWljcm9kYXRhIHN1cHBvcnQgYXMgd2VsbCBidXRcbiAgICAvLyBvbmx5IHNwZWNpZmllZCBpbiB0aGUgV0hBVFdHIHNwZWMgZG9jdW1lbnQuIFNlZVxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL21pY3JvZGF0YS5odG1sI21pY3JvZGF0YS1kb20tYXBpXG4gICAgaXRlbUlEOiAwLFxuICAgIGl0ZW1SZWY6IDAsXG4gICAgLy8gcmVzdWx0cyBzaG93IGxvb2tpbmcgZ2xhc3MgaWNvbiBhbmQgcmVjZW50IHNlYXJjaGVzIG9uIGlucHV0XG4gICAgLy8gc2VhcmNoIGZpZWxkcyBpbiBXZWJLaXQvQmxpbmtcbiAgICByZXN1bHRzOiAwLFxuICAgIC8vIElFLW9ubHkgYXR0cmlidXRlIHRoYXQgc3BlY2lmaWVzIHNlY3VyaXR5IHJlc3RyaWN0aW9ucyBvbiBhbiBpZnJhbWVcbiAgICAvLyBhcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgc2FuZGJveCBhdHRyaWJ1dGUgb24gSUU8MTBcbiAgICBzZWN1cml0eTogMCxcbiAgICAvLyBJRS1vbmx5IGF0dHJpYnV0ZSB0aGF0IGNvbnRyb2xzIGZvY3VzIGJlaGF2aW9yXG4gICAgdW5zZWxlY3RhYmxlOiAwXG4gIH0sXG4gIERPTUF0dHJpYnV0ZU5hbWVzOiB7XG4gICAgYWNjZXB0Q2hhcnNldDogJ2FjY2VwdC1jaGFyc2V0JyxcbiAgICBjbGFzc05hbWU6ICdjbGFzcycsXG4gICAgaHRtbEZvcjogJ2ZvcicsXG4gICAgaHR0cEVxdWl2OiAnaHR0cC1lcXVpdidcbiAgfSxcbiAgRE9NUHJvcGVydHlOYW1lczoge31cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gSFRNTERPTVByb3BlcnR5Q29uZmlnO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL0hUTUxET01Qcm9wZXJ0eUNvbmZpZy5qc1xuLy8gbW9kdWxlIGlkID0gMjUxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 252 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar DOMChildrenOperations = __webpack_require__(253);\nvar ReactDOMIDOperations = __webpack_require__(264);\n\n/**\n * Abstracts away all functionality of the reconciler that requires knowledge of\n * the browser context. TODO: These callers should be refactored to avoid the\n * need for this injection.\n */\nvar ReactComponentBrowserEnvironment = {\n\n  processChildrenUpdates: ReactDOMIDOperations.dangerouslyProcessChildrenUpdates,\n\n  replaceNodeWithMarkup: DOMChildrenOperations.dangerouslyReplaceNodeWithMarkup\n\n};\n\nmodule.exports = ReactComponentBrowserEnvironment;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0Q29tcG9uZW50QnJvd3NlckVudmlyb25tZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBET01DaGlsZHJlbk9wZXJhdGlvbnMgPSByZXF1aXJlKCcuL0RPTUNoaWxkcmVuT3BlcmF0aW9ucycpO1xudmFyIFJlYWN0RE9NSURPcGVyYXRpb25zID0gcmVxdWlyZSgnLi9SZWFjdERPTUlET3BlcmF0aW9ucycpO1xuXG4vKipcbiAqIEFic3RyYWN0cyBhd2F5IGFsbCBmdW5jdGlvbmFsaXR5IG9mIHRoZSByZWNvbmNpbGVyIHRoYXQgcmVxdWlyZXMga25vd2xlZGdlIG9mXG4gKiB0aGUgYnJvd3NlciBjb250ZXh0LiBUT0RPOiBUaGVzZSBjYWxsZXJzIHNob3VsZCBiZSByZWZhY3RvcmVkIHRvIGF2b2lkIHRoZVxuICogbmVlZCBmb3IgdGhpcyBpbmplY3Rpb24uXG4gKi9cbnZhciBSZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudCA9IHtcblxuICBwcm9jZXNzQ2hpbGRyZW5VcGRhdGVzOiBSZWFjdERPTUlET3BlcmF0aW9ucy5kYW5nZXJvdXNseVByb2Nlc3NDaGlsZHJlblVwZGF0ZXMsXG5cbiAgcmVwbGFjZU5vZGVXaXRoTWFya3VwOiBET01DaGlsZHJlbk9wZXJhdGlvbnMuZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXBcblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudC5qc1xuLy8gbW9kdWxlIGlkID0gMjUyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 253 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar DOMLazyTree = __webpack_require__(254);\nvar Danger = __webpack_require__(260);\nvar ReactDOMComponentTree = __webpack_require__(207);\nvar ReactInstrumentation = __webpack_require__(235);\n\nvar createMicrosoftUnsafeLocalFunction = __webpack_require__(257);\nvar setInnerHTML = __webpack_require__(256);\nvar setTextContent = __webpack_require__(258);\n\nfunction getNodeAfter(parentNode, node) {\n  // Special case for text components, which return [open, close] comments\n  // from getHostNode.\n  if (Array.isArray(node)) {\n    node = node[1];\n  }\n  return node ? node.nextSibling : parentNode.firstChild;\n}\n\n/**\n * Inserts `childNode` as a child of `parentNode` at the `index`.\n *\n * @param {DOMElement} parentNode Parent node in which to insert.\n * @param {DOMElement} childNode Child node to insert.\n * @param {number} index Index at which to insert the child.\n * @internal\n */\nvar insertChildAt = createMicrosoftUnsafeLocalFunction(function (parentNode, childNode, referenceNode) {\n  // We rely exclusively on `insertBefore(node, null)` instead of also using\n  // `appendChild(node)`. (Using `undefined` is not allowed by all browsers so\n  // we are careful to use `null`.)\n  parentNode.insertBefore(childNode, referenceNode);\n});\n\nfunction insertLazyTreeChildAt(parentNode, childTree, referenceNode) {\n  DOMLazyTree.insertTreeBefore(parentNode, childTree, referenceNode);\n}\n\nfunction moveChild(parentNode, childNode, referenceNode) {\n  if (Array.isArray(childNode)) {\n    moveDelimitedText(parentNode, childNode[0], childNode[1], referenceNode);\n  } else {\n    insertChildAt(parentNode, childNode, referenceNode);\n  }\n}\n\nfunction removeChild(parentNode, childNode) {\n  if (Array.isArray(childNode)) {\n    var closingComment = childNode[1];\n    childNode = childNode[0];\n    removeDelimitedText(parentNode, childNode, closingComment);\n    parentNode.removeChild(closingComment);\n  }\n  parentNode.removeChild(childNode);\n}\n\nfunction moveDelimitedText(parentNode, openingComment, closingComment, referenceNode) {\n  var node = openingComment;\n  while (true) {\n    var nextNode = node.nextSibling;\n    insertChildAt(parentNode, node, referenceNode);\n    if (node === closingComment) {\n      break;\n    }\n    node = nextNode;\n  }\n}\n\nfunction removeDelimitedText(parentNode, startNode, closingComment) {\n  while (true) {\n    var node = startNode.nextSibling;\n    if (node === closingComment) {\n      // The closing comment is removed by ReactMultiChild.\n      break;\n    } else {\n      parentNode.removeChild(node);\n    }\n  }\n}\n\nfunction replaceDelimitedText(openingComment, closingComment, stringText) {\n  var parentNode = openingComment.parentNode;\n  var nodeAfterComment = openingComment.nextSibling;\n  if (nodeAfterComment === closingComment) {\n    // There are no text nodes between the opening and closing comments; insert\n    // a new one if stringText isn't empty.\n    if (stringText) {\n      insertChildAt(parentNode, document.createTextNode(stringText), nodeAfterComment);\n    }\n  } else {\n    if (stringText) {\n      // Set the text content of the first node after the opening comment, and\n      // remove all following nodes up until the closing comment.\n      setTextContent(nodeAfterComment, stringText);\n      removeDelimitedText(parentNode, nodeAfterComment, closingComment);\n    } else {\n      removeDelimitedText(parentNode, openingComment, closingComment);\n    }\n  }\n\n  if (true) {\n    ReactInstrumentation.debugTool.onHostOperation({\n      instanceID: ReactDOMComponentTree.getInstanceFromNode(openingComment)._debugID,\n      type: 'replace text',\n      payload: stringText\n    });\n  }\n}\n\nvar dangerouslyReplaceNodeWithMarkup = Danger.dangerouslyReplaceNodeWithMarkup;\nif (true) {\n  dangerouslyReplaceNodeWithMarkup = function (oldChild, markup, prevInstance) {\n    Danger.dangerouslyReplaceNodeWithMarkup(oldChild, markup);\n    if (prevInstance._debugID !== 0) {\n      ReactInstrumentation.debugTool.onHostOperation({\n        instanceID: prevInstance._debugID,\n        type: 'replace with',\n        payload: markup.toString()\n      });\n    } else {\n      var nextInstance = ReactDOMComponentTree.getInstanceFromNode(markup.node);\n      if (nextInstance._debugID !== 0) {\n        ReactInstrumentation.debugTool.onHostOperation({\n          instanceID: nextInstance._debugID,\n          type: 'mount',\n          payload: markup.toString()\n        });\n      }\n    }\n  };\n}\n\n/**\n * Operations for updating with DOM children.\n */\nvar DOMChildrenOperations = {\n\n  dangerouslyReplaceNodeWithMarkup: dangerouslyReplaceNodeWithMarkup,\n\n  replaceDelimitedText: replaceDelimitedText,\n\n  /**\n   * Updates a component's children by processing a series of updates. The\n   * update configurations are each expected to have a `parentNode` property.\n   *\n   * @param {array<object>} updates List of update configurations.\n   * @internal\n   */\n  processUpdates: function (parentNode, updates) {\n    if (true) {\n      var parentNodeDebugID = ReactDOMComponentTree.getInstanceFromNode(parentNode)._debugID;\n    }\n\n    for (var k = 0; k < updates.length; k++) {\n      var update = updates[k];\n      switch (update.type) {\n        case 'INSERT_MARKUP':\n          insertLazyTreeChildAt(parentNode, update.content, getNodeAfter(parentNode, update.afterNode));\n          if (true) {\n            ReactInstrumentation.debugTool.onHostOperation({\n              instanceID: parentNodeDebugID,\n              type: 'insert child',\n              payload: { toIndex: update.toIndex, content: update.content.toString() }\n            });\n          }\n          break;\n        case 'MOVE_EXISTING':\n          moveChild(parentNode, update.fromNode, getNodeAfter(parentNode, update.afterNode));\n          if (true) {\n            ReactInstrumentation.debugTool.onHostOperation({\n              instanceID: parentNodeDebugID,\n              type: 'move child',\n              payload: { fromIndex: update.fromIndex, toIndex: update.toIndex }\n            });\n          }\n          break;\n        case 'SET_MARKUP':\n          setInnerHTML(parentNode, update.content);\n          if (true) {\n            ReactInstrumentation.debugTool.onHostOperation({\n              instanceID: parentNodeDebugID,\n              type: 'replace children',\n              payload: update.content.toString()\n            });\n          }\n          break;\n        case 'TEXT_CONTENT':\n          setTextContent(parentNode, update.content);\n          if (true) {\n            ReactInstrumentation.debugTool.onHostOperation({\n              instanceID: parentNodeDebugID,\n              type: 'replace text',\n              payload: update.content.toString()\n            });\n          }\n          break;\n        case 'REMOVE_NODE':\n          removeChild(parentNode, update.fromNode);\n          if (true) {\n            ReactInstrumentation.debugTool.onHostOperation({\n              instanceID: parentNodeDebugID,\n              type: 'remove child',\n              payload: { fromIndex: update.fromIndex }\n            });\n          }\n          break;\n      }\n    }\n  }\n\n};\n\nmodule.exports = DOMChildrenOperations;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0RPTUNoaWxkcmVuT3BlcmF0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NTGF6eVRyZWUgPSByZXF1aXJlKCcuL0RPTUxhenlUcmVlJyk7XG52YXIgRGFuZ2VyID0gcmVxdWlyZSgnLi9EYW5nZXInKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xudmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xuXG52YXIgY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbiA9IHJlcXVpcmUoJy4vY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbicpO1xudmFyIHNldElubmVySFRNTCA9IHJlcXVpcmUoJy4vc2V0SW5uZXJIVE1MJyk7XG52YXIgc2V0VGV4dENvbnRlbnQgPSByZXF1aXJlKCcuL3NldFRleHRDb250ZW50Jyk7XG5cbmZ1bmN0aW9uIGdldE5vZGVBZnRlcihwYXJlbnROb2RlLCBub2RlKSB7XG4gIC8vIFNwZWNpYWwgY2FzZSBmb3IgdGV4dCBjb21wb25lbnRzLCB3aGljaCByZXR1cm4gW29wZW4sIGNsb3NlXSBjb21tZW50c1xuICAvLyBmcm9tIGdldEhvc3ROb2RlLlxuICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkge1xuICAgIG5vZGUgPSBub2RlWzFdO1xuICB9XG4gIHJldHVybiBub2RlID8gbm9kZS5uZXh0U2libGluZyA6IHBhcmVudE5vZGUuZmlyc3RDaGlsZDtcbn1cblxuLyoqXG4gKiBJbnNlcnRzIGBjaGlsZE5vZGVgIGFzIGEgY2hpbGQgb2YgYHBhcmVudE5vZGVgIGF0IHRoZSBgaW5kZXhgLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gcGFyZW50Tm9kZSBQYXJlbnQgbm9kZSBpbiB3aGljaCB0byBpbnNlcnQuXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNoaWxkTm9kZSBDaGlsZCBub2RlIHRvIGluc2VydC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCBhdCB3aGljaCB0byBpbnNlcnQgdGhlIGNoaWxkLlxuICogQGludGVybmFsXG4gKi9cbnZhciBpbnNlcnRDaGlsZEF0ID0gY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbiAocGFyZW50Tm9kZSwgY2hpbGROb2RlLCByZWZlcmVuY2VOb2RlKSB7XG4gIC8vIFdlIHJlbHkgZXhjbHVzaXZlbHkgb24gYGluc2VydEJlZm9yZShub2RlLCBudWxsKWAgaW5zdGVhZCBvZiBhbHNvIHVzaW5nXG4gIC8vIGBhcHBlbmRDaGlsZChub2RlKWAuIChVc2luZyBgdW5kZWZpbmVkYCBpcyBub3QgYWxsb3dlZCBieSBhbGwgYnJvd3NlcnMgc29cbiAgLy8gd2UgYXJlIGNhcmVmdWwgdG8gdXNlIGBudWxsYC4pXG4gIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkTm9kZSwgcmVmZXJlbmNlTm9kZSk7XG59KTtcblxuZnVuY3Rpb24gaW5zZXJ0TGF6eVRyZWVDaGlsZEF0KHBhcmVudE5vZGUsIGNoaWxkVHJlZSwgcmVmZXJlbmNlTm9kZSkge1xuICBET01MYXp5VHJlZS5pbnNlcnRUcmVlQmVmb3JlKHBhcmVudE5vZGUsIGNoaWxkVHJlZSwgcmVmZXJlbmNlTm9kZSk7XG59XG5cbmZ1bmN0aW9uIG1vdmVDaGlsZChwYXJlbnROb2RlLCBjaGlsZE5vZGUsIHJlZmVyZW5jZU5vZGUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGROb2RlKSkge1xuICAgIG1vdmVEZWxpbWl0ZWRUZXh0KHBhcmVudE5vZGUsIGNoaWxkTm9kZVswXSwgY2hpbGROb2RlWzFdLCByZWZlcmVuY2VOb2RlKTtcbiAgfSBlbHNlIHtcbiAgICBpbnNlcnRDaGlsZEF0KHBhcmVudE5vZGUsIGNoaWxkTm9kZSwgcmVmZXJlbmNlTm9kZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGQocGFyZW50Tm9kZSwgY2hpbGROb2RlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkTm9kZSkpIHtcbiAgICB2YXIgY2xvc2luZ0NvbW1lbnQgPSBjaGlsZE5vZGVbMV07XG4gICAgY2hpbGROb2RlID0gY2hpbGROb2RlWzBdO1xuICAgIHJlbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSwgY2hpbGROb2RlLCBjbG9zaW5nQ29tbWVudCk7XG4gICAgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjbG9zaW5nQ29tbWVudCk7XG4gIH1cbiAgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjaGlsZE5vZGUpO1xufVxuXG5mdW5jdGlvbiBtb3ZlRGVsaW1pdGVkVGV4dChwYXJlbnROb2RlLCBvcGVuaW5nQ29tbWVudCwgY2xvc2luZ0NvbW1lbnQsIHJlZmVyZW5jZU5vZGUpIHtcbiAgdmFyIG5vZGUgPSBvcGVuaW5nQ29tbWVudDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgbmV4dE5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgIGluc2VydENoaWxkQXQocGFyZW50Tm9kZSwgbm9kZSwgcmVmZXJlbmNlTm9kZSk7XG4gICAgaWYgKG5vZGUgPT09IGNsb3NpbmdDb21tZW50KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgbm9kZSA9IG5leHROb2RlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSwgc3RhcnROb2RlLCBjbG9zaW5nQ29tbWVudCkge1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBub2RlID0gc3RhcnROb2RlLm5leHRTaWJsaW5nO1xuICAgIGlmIChub2RlID09PSBjbG9zaW5nQ29tbWVudCkge1xuICAgICAgLy8gVGhlIGNsb3NpbmcgY29tbWVudCBpcyByZW1vdmVkIGJ5IFJlYWN0TXVsdGlDaGlsZC5cbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlRGVsaW1pdGVkVGV4dChvcGVuaW5nQ29tbWVudCwgY2xvc2luZ0NvbW1lbnQsIHN0cmluZ1RleHQpIHtcbiAgdmFyIHBhcmVudE5vZGUgPSBvcGVuaW5nQ29tbWVudC5wYXJlbnROb2RlO1xuICB2YXIgbm9kZUFmdGVyQ29tbWVudCA9IG9wZW5pbmdDb21tZW50Lm5leHRTaWJsaW5nO1xuICBpZiAobm9kZUFmdGVyQ29tbWVudCA9PT0gY2xvc2luZ0NvbW1lbnQpIHtcbiAgICAvLyBUaGVyZSBhcmUgbm8gdGV4dCBub2RlcyBiZXR3ZWVuIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIGNvbW1lbnRzOyBpbnNlcnRcbiAgICAvLyBhIG5ldyBvbmUgaWYgc3RyaW5nVGV4dCBpc24ndCBlbXB0eS5cbiAgICBpZiAoc3RyaW5nVGV4dCkge1xuICAgICAgaW5zZXJ0Q2hpbGRBdChwYXJlbnROb2RlLCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzdHJpbmdUZXh0KSwgbm9kZUFmdGVyQ29tbWVudCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChzdHJpbmdUZXh0KSB7XG4gICAgICAvLyBTZXQgdGhlIHRleHQgY29udGVudCBvZiB0aGUgZmlyc3Qgbm9kZSBhZnRlciB0aGUgb3BlbmluZyBjb21tZW50LCBhbmRcbiAgICAgIC8vIHJlbW92ZSBhbGwgZm9sbG93aW5nIG5vZGVzIHVwIHVudGlsIHRoZSBjbG9zaW5nIGNvbW1lbnQuXG4gICAgICBzZXRUZXh0Q29udGVudChub2RlQWZ0ZXJDb21tZW50LCBzdHJpbmdUZXh0KTtcbiAgICAgIHJlbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSwgbm9kZUFmdGVyQ29tbWVudCwgY2xvc2luZ0NvbW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZW1vdmVEZWxpbWl0ZWRUZXh0KHBhcmVudE5vZGUsIG9wZW5pbmdDb21tZW50LCBjbG9zaW5nQ29tbWVudCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgIGluc3RhbmNlSUQ6IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG9wZW5pbmdDb21tZW50KS5fZGVidWdJRCxcbiAgICAgIHR5cGU6ICdyZXBsYWNlIHRleHQnLFxuICAgICAgcGF5bG9hZDogc3RyaW5nVGV4dFxuICAgIH0pO1xuICB9XG59XG5cbnZhciBkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cCA9IERhbmdlci5kYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cDtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIGRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwID0gZnVuY3Rpb24gKG9sZENoaWxkLCBtYXJrdXAsIHByZXZJbnN0YW5jZSkge1xuICAgIERhbmdlci5kYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cChvbGRDaGlsZCwgbWFya3VwKTtcbiAgICBpZiAocHJldkluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgICAgaW5zdGFuY2VJRDogcHJldkluc3RhbmNlLl9kZWJ1Z0lELFxuICAgICAgICB0eXBlOiAncmVwbGFjZSB3aXRoJyxcbiAgICAgICAgcGF5bG9hZDogbWFya3VwLnRvU3RyaW5nKClcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbmV4dEluc3RhbmNlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUobWFya3VwLm5vZGUpO1xuICAgICAgaWYgKG5leHRJbnN0YW5jZS5fZGVidWdJRCAhPT0gMCkge1xuICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgICAgICBpbnN0YW5jZUlEOiBuZXh0SW5zdGFuY2UuX2RlYnVnSUQsXG4gICAgICAgICAgdHlwZTogJ21vdW50JyxcbiAgICAgICAgICBwYXlsb2FkOiBtYXJrdXAudG9TdHJpbmcoKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogT3BlcmF0aW9ucyBmb3IgdXBkYXRpbmcgd2l0aCBET00gY2hpbGRyZW4uXG4gKi9cbnZhciBET01DaGlsZHJlbk9wZXJhdGlvbnMgPSB7XG5cbiAgZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXA6IGRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwLFxuXG4gIHJlcGxhY2VEZWxpbWl0ZWRUZXh0OiByZXBsYWNlRGVsaW1pdGVkVGV4dCxcblxuICAvKipcbiAgICogVXBkYXRlcyBhIGNvbXBvbmVudCdzIGNoaWxkcmVuIGJ5IHByb2Nlc3NpbmcgYSBzZXJpZXMgb2YgdXBkYXRlcy4gVGhlXG4gICAqIHVwZGF0ZSBjb25maWd1cmF0aW9ucyBhcmUgZWFjaCBleHBlY3RlZCB0byBoYXZlIGEgYHBhcmVudE5vZGVgIHByb3BlcnR5LlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5PG9iamVjdD59IHVwZGF0ZXMgTGlzdCBvZiB1cGRhdGUgY29uZmlndXJhdGlvbnMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvY2Vzc1VwZGF0ZXM6IGZ1bmN0aW9uIChwYXJlbnROb2RlLCB1cGRhdGVzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBwYXJlbnROb2RlRGVidWdJRCA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKHBhcmVudE5vZGUpLl9kZWJ1Z0lEO1xuICAgIH1cblxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdXBkYXRlcy5sZW5ndGg7IGsrKykge1xuICAgICAgdmFyIHVwZGF0ZSA9IHVwZGF0ZXNba107XG4gICAgICBzd2l0Y2ggKHVwZGF0ZS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0lOU0VSVF9NQVJLVVAnOlxuICAgICAgICAgIGluc2VydExhenlUcmVlQ2hpbGRBdChwYXJlbnROb2RlLCB1cGRhdGUuY29udGVudCwgZ2V0Tm9kZUFmdGVyKHBhcmVudE5vZGUsIHVwZGF0ZS5hZnRlck5vZGUpKTtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgICAgICAgIGluc3RhbmNlSUQ6IHBhcmVudE5vZGVEZWJ1Z0lELFxuICAgICAgICAgICAgICB0eXBlOiAnaW5zZXJ0IGNoaWxkJyxcbiAgICAgICAgICAgICAgcGF5bG9hZDogeyB0b0luZGV4OiB1cGRhdGUudG9JbmRleCwgY29udGVudDogdXBkYXRlLmNvbnRlbnQudG9TdHJpbmcoKSB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ01PVkVfRVhJU1RJTkcnOlxuICAgICAgICAgIG1vdmVDaGlsZChwYXJlbnROb2RlLCB1cGRhdGUuZnJvbU5vZGUsIGdldE5vZGVBZnRlcihwYXJlbnROb2RlLCB1cGRhdGUuYWZ0ZXJOb2RlKSk7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe1xuICAgICAgICAgICAgICBpbnN0YW5jZUlEOiBwYXJlbnROb2RlRGVidWdJRCxcbiAgICAgICAgICAgICAgdHlwZTogJ21vdmUgY2hpbGQnLFxuICAgICAgICAgICAgICBwYXlsb2FkOiB7IGZyb21JbmRleDogdXBkYXRlLmZyb21JbmRleCwgdG9JbmRleDogdXBkYXRlLnRvSW5kZXggfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdTRVRfTUFSS1VQJzpcbiAgICAgICAgICBzZXRJbm5lckhUTUwocGFyZW50Tm9kZSwgdXBkYXRlLmNvbnRlbnQpO1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VJRDogcGFyZW50Tm9kZURlYnVnSUQsXG4gICAgICAgICAgICAgIHR5cGU6ICdyZXBsYWNlIGNoaWxkcmVuJyxcbiAgICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLmNvbnRlbnQudG9TdHJpbmcoKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdURVhUX0NPTlRFTlQnOlxuICAgICAgICAgIHNldFRleHRDb250ZW50KHBhcmVudE5vZGUsIHVwZGF0ZS5jb250ZW50KTtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgICAgICAgIGluc3RhbmNlSUQ6IHBhcmVudE5vZGVEZWJ1Z0lELFxuICAgICAgICAgICAgICB0eXBlOiAncmVwbGFjZSB0ZXh0JyxcbiAgICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLmNvbnRlbnQudG9TdHJpbmcoKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdSRU1PVkVfTk9ERSc6XG4gICAgICAgICAgcmVtb3ZlQ2hpbGQocGFyZW50Tm9kZSwgdXBkYXRlLmZyb21Ob2RlKTtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgICAgICAgIGluc3RhbmNlSUQ6IHBhcmVudE5vZGVEZWJ1Z0lELFxuICAgICAgICAgICAgICB0eXBlOiAncmVtb3ZlIGNoaWxkJyxcbiAgICAgICAgICAgICAgcGF5bG9hZDogeyBmcm9tSW5kZXg6IHVwZGF0ZS5mcm9tSW5kZXggfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IERPTUNoaWxkcmVuT3BlcmF0aW9ucztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9ET01DaGlsZHJlbk9wZXJhdGlvbnMuanNcbi8vIG1vZHVsZSBpZCA9IDI1M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 254 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2015-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar DOMNamespaces = __webpack_require__(255);\nvar setInnerHTML = __webpack_require__(256);\n\nvar createMicrosoftUnsafeLocalFunction = __webpack_require__(257);\nvar setTextContent = __webpack_require__(258);\n\nvar ELEMENT_NODE_TYPE = 1;\nvar DOCUMENT_FRAGMENT_NODE_TYPE = 11;\n\n/**\n * In IE (8-11) and Edge, appending nodes with no children is dramatically\n * faster than appending a full subtree, so we essentially queue up the\n * .appendChild calls here and apply them so each node is added to its parent\n * before any children are added.\n *\n * In other browsers, doing so is slower or neutral compared to the other order\n * (in Firefox, twice as slow) so we only do this inversion in IE.\n *\n * See https://github.com/spicyj/innerhtml-vs-createelement-vs-clonenode.\n */\nvar enableLazy = typeof document !== 'undefined' && typeof document.documentMode === 'number' || typeof navigator !== 'undefined' && typeof navigator.userAgent === 'string' && /\\bEdge\\/\\d/.test(navigator.userAgent);\n\nfunction insertTreeChildren(tree) {\n  if (!enableLazy) {\n    return;\n  }\n  var node = tree.node;\n  var children = tree.children;\n  if (children.length) {\n    for (var i = 0; i < children.length; i++) {\n      insertTreeBefore(node, children[i], null);\n    }\n  } else if (tree.html != null) {\n    setInnerHTML(node, tree.html);\n  } else if (tree.text != null) {\n    setTextContent(node, tree.text);\n  }\n}\n\nvar insertTreeBefore = createMicrosoftUnsafeLocalFunction(function (parentNode, tree, referenceNode) {\n  // DocumentFragments aren't actually part of the DOM after insertion so\n  // appending children won't update the DOM. We need to ensure the fragment\n  // is properly populated first, breaking out of our lazy approach for just\n  // this level. Also, some <object> plugins (like Flash Player) will read\n  // <param> nodes immediately upon insertion into the DOM, so <object>\n  // must also be populated prior to insertion into the DOM.\n  if (tree.node.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE || tree.node.nodeType === ELEMENT_NODE_TYPE && tree.node.nodeName.toLowerCase() === 'object' && (tree.node.namespaceURI == null || tree.node.namespaceURI === DOMNamespaces.html)) {\n    insertTreeChildren(tree);\n    parentNode.insertBefore(tree.node, referenceNode);\n  } else {\n    parentNode.insertBefore(tree.node, referenceNode);\n    insertTreeChildren(tree);\n  }\n});\n\nfunction replaceChildWithTree(oldNode, newTree) {\n  oldNode.parentNode.replaceChild(newTree.node, oldNode);\n  insertTreeChildren(newTree);\n}\n\nfunction queueChild(parentTree, childTree) {\n  if (enableLazy) {\n    parentTree.children.push(childTree);\n  } else {\n    parentTree.node.appendChild(childTree.node);\n  }\n}\n\nfunction queueHTML(tree, html) {\n  if (enableLazy) {\n    tree.html = html;\n  } else {\n    setInnerHTML(tree.node, html);\n  }\n}\n\nfunction queueText(tree, text) {\n  if (enableLazy) {\n    tree.text = text;\n  } else {\n    setTextContent(tree.node, text);\n  }\n}\n\nfunction toString() {\n  return this.node.nodeName;\n}\n\nfunction DOMLazyTree(node) {\n  return {\n    node: node,\n    children: [],\n    html: null,\n    text: null,\n    toString: toString\n  };\n}\n\nDOMLazyTree.insertTreeBefore = insertTreeBefore;\nDOMLazyTree.replaceChildWithTree = replaceChildWithTree;\nDOMLazyTree.queueChild = queueChild;\nDOMLazyTree.queueHTML = queueHTML;\nDOMLazyTree.queueText = queueText;\n\nmodule.exports = DOMLazyTree;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0RPTUxhenlUcmVlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTUtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBET01OYW1lc3BhY2VzID0gcmVxdWlyZSgnLi9ET01OYW1lc3BhY2VzJyk7XG52YXIgc2V0SW5uZXJIVE1MID0gcmVxdWlyZSgnLi9zZXRJbm5lckhUTUwnKTtcblxudmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSByZXF1aXJlKCcuL2NyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24nKTtcbnZhciBzZXRUZXh0Q29udGVudCA9IHJlcXVpcmUoJy4vc2V0VGV4dENvbnRlbnQnKTtcblxudmFyIEVMRU1FTlRfTk9ERV9UWVBFID0gMTtcbnZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFX1RZUEUgPSAxMTtcblxuLyoqXG4gKiBJbiBJRSAoOC0xMSkgYW5kIEVkZ2UsIGFwcGVuZGluZyBub2RlcyB3aXRoIG5vIGNoaWxkcmVuIGlzIGRyYW1hdGljYWxseVxuICogZmFzdGVyIHRoYW4gYXBwZW5kaW5nIGEgZnVsbCBzdWJ0cmVlLCBzbyB3ZSBlc3NlbnRpYWxseSBxdWV1ZSB1cCB0aGVcbiAqIC5hcHBlbmRDaGlsZCBjYWxscyBoZXJlIGFuZCBhcHBseSB0aGVtIHNvIGVhY2ggbm9kZSBpcyBhZGRlZCB0byBpdHMgcGFyZW50XG4gKiBiZWZvcmUgYW55IGNoaWxkcmVuIGFyZSBhZGRlZC5cbiAqXG4gKiBJbiBvdGhlciBicm93c2VycywgZG9pbmcgc28gaXMgc2xvd2VyIG9yIG5ldXRyYWwgY29tcGFyZWQgdG8gdGhlIG90aGVyIG9yZGVyXG4gKiAoaW4gRmlyZWZveCwgdHdpY2UgYXMgc2xvdykgc28gd2Ugb25seSBkbyB0aGlzIGludmVyc2lvbiBpbiBJRS5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3NwaWN5ai9pbm5lcmh0bWwtdnMtY3JlYXRlZWxlbWVudC12cy1jbG9uZW5vZGUuXG4gKi9cbnZhciBlbmFibGVMYXp5ID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQuZG9jdW1lbnRNb2RlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbmF2aWdhdG9yLnVzZXJBZ2VudCA9PT0gJ3N0cmluZycgJiYgL1xcYkVkZ2VcXC9cXGQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cbmZ1bmN0aW9uIGluc2VydFRyZWVDaGlsZHJlbih0cmVlKSB7XG4gIGlmICghZW5hYmxlTGF6eSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbm9kZSA9IHRyZWUubm9kZTtcbiAgdmFyIGNoaWxkcmVuID0gdHJlZS5jaGlsZHJlbjtcbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGluc2VydFRyZWVCZWZvcmUobm9kZSwgY2hpbGRyZW5baV0sIG51bGwpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0cmVlLmh0bWwgIT0gbnVsbCkge1xuICAgIHNldElubmVySFRNTChub2RlLCB0cmVlLmh0bWwpO1xuICB9IGVsc2UgaWYgKHRyZWUudGV4dCAhPSBudWxsKSB7XG4gICAgc2V0VGV4dENvbnRlbnQobm9kZSwgdHJlZS50ZXh0KTtcbiAgfVxufVxuXG52YXIgaW5zZXJ0VHJlZUJlZm9yZSA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKHBhcmVudE5vZGUsIHRyZWUsIHJlZmVyZW5jZU5vZGUpIHtcbiAgLy8gRG9jdW1lbnRGcmFnbWVudHMgYXJlbid0IGFjdHVhbGx5IHBhcnQgb2YgdGhlIERPTSBhZnRlciBpbnNlcnRpb24gc29cbiAgLy8gYXBwZW5kaW5nIGNoaWxkcmVuIHdvbid0IHVwZGF0ZSB0aGUgRE9NLiBXZSBuZWVkIHRvIGVuc3VyZSB0aGUgZnJhZ21lbnRcbiAgLy8gaXMgcHJvcGVybHkgcG9wdWxhdGVkIGZpcnN0LCBicmVha2luZyBvdXQgb2Ygb3VyIGxhenkgYXBwcm9hY2ggZm9yIGp1c3RcbiAgLy8gdGhpcyBsZXZlbC4gQWxzbywgc29tZSA8b2JqZWN0PiBwbHVnaW5zIChsaWtlIEZsYXNoIFBsYXllcikgd2lsbCByZWFkXG4gIC8vIDxwYXJhbT4gbm9kZXMgaW1tZWRpYXRlbHkgdXBvbiBpbnNlcnRpb24gaW50byB0aGUgRE9NLCBzbyA8b2JqZWN0PlxuICAvLyBtdXN0IGFsc28gYmUgcG9wdWxhdGVkIHByaW9yIHRvIGluc2VydGlvbiBpbnRvIHRoZSBET00uXG4gIGlmICh0cmVlLm5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREVfVFlQRSB8fCB0cmVlLm5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERV9UWVBFICYmIHRyZWUubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnb2JqZWN0JyAmJiAodHJlZS5ub2RlLm5hbWVzcGFjZVVSSSA9PSBudWxsIHx8IHRyZWUubm9kZS5uYW1lc3BhY2VVUkkgPT09IERPTU5hbWVzcGFjZXMuaHRtbCkpIHtcbiAgICBpbnNlcnRUcmVlQ2hpbGRyZW4odHJlZSk7XG4gICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodHJlZS5ub2RlLCByZWZlcmVuY2VOb2RlKTtcbiAgfSBlbHNlIHtcbiAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZSh0cmVlLm5vZGUsIHJlZmVyZW5jZU5vZGUpO1xuICAgIGluc2VydFRyZWVDaGlsZHJlbih0cmVlKTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIHJlcGxhY2VDaGlsZFdpdGhUcmVlKG9sZE5vZGUsIG5ld1RyZWUpIHtcbiAgb2xkTm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdUcmVlLm5vZGUsIG9sZE5vZGUpO1xuICBpbnNlcnRUcmVlQ2hpbGRyZW4obmV3VHJlZSk7XG59XG5cbmZ1bmN0aW9uIHF1ZXVlQ2hpbGQocGFyZW50VHJlZSwgY2hpbGRUcmVlKSB7XG4gIGlmIChlbmFibGVMYXp5KSB7XG4gICAgcGFyZW50VHJlZS5jaGlsZHJlbi5wdXNoKGNoaWxkVHJlZSk7XG4gIH0gZWxzZSB7XG4gICAgcGFyZW50VHJlZS5ub2RlLmFwcGVuZENoaWxkKGNoaWxkVHJlZS5ub2RlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBxdWV1ZUhUTUwodHJlZSwgaHRtbCkge1xuICBpZiAoZW5hYmxlTGF6eSkge1xuICAgIHRyZWUuaHRtbCA9IGh0bWw7XG4gIH0gZWxzZSB7XG4gICAgc2V0SW5uZXJIVE1MKHRyZWUubm9kZSwgaHRtbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcXVldWVUZXh0KHRyZWUsIHRleHQpIHtcbiAgaWYgKGVuYWJsZUxhenkpIHtcbiAgICB0cmVlLnRleHQgPSB0ZXh0O1xuICB9IGVsc2Uge1xuICAgIHNldFRleHRDb250ZW50KHRyZWUubm9kZSwgdGV4dCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiB0aGlzLm5vZGUubm9kZU5hbWU7XG59XG5cbmZ1bmN0aW9uIERPTUxhenlUcmVlKG5vZGUpIHtcbiAgcmV0dXJuIHtcbiAgICBub2RlOiBub2RlLFxuICAgIGNoaWxkcmVuOiBbXSxcbiAgICBodG1sOiBudWxsLFxuICAgIHRleHQ6IG51bGwsXG4gICAgdG9TdHJpbmc6IHRvU3RyaW5nXG4gIH07XG59XG5cbkRPTUxhenlUcmVlLmluc2VydFRyZWVCZWZvcmUgPSBpbnNlcnRUcmVlQmVmb3JlO1xuRE9NTGF6eVRyZWUucmVwbGFjZUNoaWxkV2l0aFRyZWUgPSByZXBsYWNlQ2hpbGRXaXRoVHJlZTtcbkRPTUxhenlUcmVlLnF1ZXVlQ2hpbGQgPSBxdWV1ZUNoaWxkO1xuRE9NTGF6eVRyZWUucXVldWVIVE1MID0gcXVldWVIVE1MO1xuRE9NTGF6eVRyZWUucXVldWVUZXh0ID0gcXVldWVUZXh0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IERPTUxhenlUcmVlO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL0RPTUxhenlUcmVlLmpzXG4vLyBtb2R1bGUgaWQgPSAyNTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 255 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar DOMNamespaces = {\n  html: 'http://www.w3.org/1999/xhtml',\n  mathml: 'http://www.w3.org/1998/Math/MathML',\n  svg: 'http://www.w3.org/2000/svg'\n};\n\nmodule.exports = DOMNamespaces;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0RPTU5hbWVzcGFjZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIERPTU5hbWVzcGFjZXMgPSB7XG4gIGh0bWw6ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJyxcbiAgbWF0aG1sOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCcsXG4gIHN2ZzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJ1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBET01OYW1lc3BhY2VzO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL0RPTU5hbWVzcGFjZXMuanNcbi8vIG1vZHVsZSBpZCA9IDI1NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 256 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar ExecutionEnvironment = __webpack_require__(221);\nvar DOMNamespaces = __webpack_require__(255);\n\nvar WHITESPACE_TEST = /^[ \\r\\n\\t\\f]/;\nvar NONVISIBLE_TEST = /<(!--|link|noscript|meta|script|style)[ \\r\\n\\t\\f\\/>]/;\n\nvar createMicrosoftUnsafeLocalFunction = __webpack_require__(257);\n\n// SVG temp container for IE lacking innerHTML\nvar reusableSVGContainer;\n\n/**\n * Set the innerHTML property of a node, ensuring that whitespace is preserved\n * even in IE8.\n *\n * @param {DOMElement} node\n * @param {string} html\n * @internal\n */\nvar setInnerHTML = createMicrosoftUnsafeLocalFunction(function (node, html) {\n  // IE does not have innerHTML for SVG nodes, so instead we inject the\n  // new markup in a temp node and then move the child nodes across into\n  // the target node\n  if (node.namespaceURI === DOMNamespaces.svg && !('innerHTML' in node)) {\n    reusableSVGContainer = reusableSVGContainer || document.createElement('div');\n    reusableSVGContainer.innerHTML = '<svg>' + html + '</svg>';\n    var svgNode = reusableSVGContainer.firstChild;\n    while (svgNode.firstChild) {\n      node.appendChild(svgNode.firstChild);\n    }\n  } else {\n    node.innerHTML = html;\n  }\n});\n\nif (ExecutionEnvironment.canUseDOM) {\n  // IE8: When updating a just created node with innerHTML only leading\n  // whitespace is removed. When updating an existing node with innerHTML\n  // whitespace in root TextNodes is also collapsed.\n  // @see quirksmode.org/bugreports/archives/2004/11/innerhtml_and_t.html\n\n  // Feature detection; only IE8 is known to behave improperly like this.\n  var testElement = document.createElement('div');\n  testElement.innerHTML = ' ';\n  if (testElement.innerHTML === '') {\n    setInnerHTML = function (node, html) {\n      // Magic theory: IE8 supposedly differentiates between added and updated\n      // nodes when processing innerHTML, innerHTML on updated nodes suffers\n      // from worse whitespace behavior. Re-adding a node like this triggers\n      // the initial and more favorable whitespace behavior.\n      // TODO: What to do on a detached node?\n      if (node.parentNode) {\n        node.parentNode.replaceChild(node, node);\n      }\n\n      // We also implement a workaround for non-visible tags disappearing into\n      // thin air on IE8, this only happens if there is no visible text\n      // in-front of the non-visible tags. Piggyback on the whitespace fix\n      // and simply check if any non-visible tags appear in the source.\n      if (WHITESPACE_TEST.test(html) || html[0] === '<' && NONVISIBLE_TEST.test(html)) {\n        // Recover leading whitespace by temporarily prepending any character.\n        // \\uFEFF has the potential advantage of being zero-width/invisible.\n        // UglifyJS drops U+FEFF chars when parsing, so use String.fromCharCode\n        // in hopes that this is preserved even if \"\\uFEFF\" is transformed to\n        // the actual Unicode character (by Babel, for example).\n        // https://github.com/mishoo/UglifyJS2/blob/v2.4.20/lib/parse.js#L216\n        node.innerHTML = String.fromCharCode(0xFEFF) + html;\n\n        // deleteData leaves an empty `TextNode` which offsets the index of all\n        // children. Definitely want to avoid this.\n        var textNode = node.firstChild;\n        if (textNode.data.length === 1) {\n          node.removeChild(textNode);\n        } else {\n          textNode.deleteData(0, 1);\n        }\n      } else {\n        node.innerHTML = html;\n      }\n    };\n  }\n  testElement = null;\n}\n\nmodule.exports = setInnerHTML;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL3NldElubmVySFRNTC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xudmFyIERPTU5hbWVzcGFjZXMgPSByZXF1aXJlKCcuL0RPTU5hbWVzcGFjZXMnKTtcblxudmFyIFdISVRFU1BBQ0VfVEVTVCA9IC9eWyBcXHJcXG5cXHRcXGZdLztcbnZhciBOT05WSVNJQkxFX1RFU1QgPSAvPCghLS18bGlua3xub3NjcmlwdHxtZXRhfHNjcmlwdHxzdHlsZSlbIFxcclxcblxcdFxcZlxcLz5dLztcblxudmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSByZXF1aXJlKCcuL2NyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24nKTtcblxuLy8gU1ZHIHRlbXAgY29udGFpbmVyIGZvciBJRSBsYWNraW5nIGlubmVySFRNTFxudmFyIHJldXNhYmxlU1ZHQ29udGFpbmVyO1xuXG4vKipcbiAqIFNldCB0aGUgaW5uZXJIVE1MIHByb3BlcnR5IG9mIGEgbm9kZSwgZW5zdXJpbmcgdGhhdCB3aGl0ZXNwYWNlIGlzIHByZXNlcnZlZFxuICogZXZlbiBpbiBJRTguXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuICogQGludGVybmFsXG4gKi9cbnZhciBzZXRJbm5lckhUTUwgPSBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uIChub2RlLCBodG1sKSB7XG4gIC8vIElFIGRvZXMgbm90IGhhdmUgaW5uZXJIVE1MIGZvciBTVkcgbm9kZXMsIHNvIGluc3RlYWQgd2UgaW5qZWN0IHRoZVxuICAvLyBuZXcgbWFya3VwIGluIGEgdGVtcCBub2RlIGFuZCB0aGVuIG1vdmUgdGhlIGNoaWxkIG5vZGVzIGFjcm9zcyBpbnRvXG4gIC8vIHRoZSB0YXJnZXQgbm9kZVxuICBpZiAobm9kZS5uYW1lc3BhY2VVUkkgPT09IERPTU5hbWVzcGFjZXMuc3ZnICYmICEoJ2lubmVySFRNTCcgaW4gbm9kZSkpIHtcbiAgICByZXVzYWJsZVNWR0NvbnRhaW5lciA9IHJldXNhYmxlU1ZHQ29udGFpbmVyIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHJldXNhYmxlU1ZHQ29udGFpbmVyLmlubmVySFRNTCA9ICc8c3ZnPicgKyBodG1sICsgJzwvc3ZnPic7XG4gICAgdmFyIHN2Z05vZGUgPSByZXVzYWJsZVNWR0NvbnRhaW5lci5maXJzdENoaWxkO1xuICAgIHdoaWxlIChzdmdOb2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoc3ZnTm9kZS5maXJzdENoaWxkKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbm9kZS5pbm5lckhUTUwgPSBodG1sO1xuICB9XG59KTtcblxuaWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkge1xuICAvLyBJRTg6IFdoZW4gdXBkYXRpbmcgYSBqdXN0IGNyZWF0ZWQgbm9kZSB3aXRoIGlubmVySFRNTCBvbmx5IGxlYWRpbmdcbiAgLy8gd2hpdGVzcGFjZSBpcyByZW1vdmVkLiBXaGVuIHVwZGF0aW5nIGFuIGV4aXN0aW5nIG5vZGUgd2l0aCBpbm5lckhUTUxcbiAgLy8gd2hpdGVzcGFjZSBpbiByb290IFRleHROb2RlcyBpcyBhbHNvIGNvbGxhcHNlZC5cbiAgLy8gQHNlZSBxdWlya3Ntb2RlLm9yZy9idWdyZXBvcnRzL2FyY2hpdmVzLzIwMDQvMTEvaW5uZXJodG1sX2FuZF90Lmh0bWxcblxuICAvLyBGZWF0dXJlIGRldGVjdGlvbjsgb25seSBJRTggaXMga25vd24gdG8gYmVoYXZlIGltcHJvcGVybHkgbGlrZSB0aGlzLlxuICB2YXIgdGVzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdGVzdEVsZW1lbnQuaW5uZXJIVE1MID0gJyAnO1xuICBpZiAodGVzdEVsZW1lbnQuaW5uZXJIVE1MID09PSAnJykge1xuICAgIHNldElubmVySFRNTCA9IGZ1bmN0aW9uIChub2RlLCBodG1sKSB7XG4gICAgICAvLyBNYWdpYyB0aGVvcnk6IElFOCBzdXBwb3NlZGx5IGRpZmZlcmVudGlhdGVzIGJldHdlZW4gYWRkZWQgYW5kIHVwZGF0ZWRcbiAgICAgIC8vIG5vZGVzIHdoZW4gcHJvY2Vzc2luZyBpbm5lckhUTUwsIGlubmVySFRNTCBvbiB1cGRhdGVkIG5vZGVzIHN1ZmZlcnNcbiAgICAgIC8vIGZyb20gd29yc2Ugd2hpdGVzcGFjZSBiZWhhdmlvci4gUmUtYWRkaW5nIGEgbm9kZSBsaWtlIHRoaXMgdHJpZ2dlcnNcbiAgICAgIC8vIHRoZSBpbml0aWFsIGFuZCBtb3JlIGZhdm9yYWJsZSB3aGl0ZXNwYWNlIGJlaGF2aW9yLlxuICAgICAgLy8gVE9ETzogV2hhdCB0byBkbyBvbiBhIGRldGFjaGVkIG5vZGU/XG4gICAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobm9kZSwgbm9kZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdlIGFsc28gaW1wbGVtZW50IGEgd29ya2Fyb3VuZCBmb3Igbm9uLXZpc2libGUgdGFncyBkaXNhcHBlYXJpbmcgaW50b1xuICAgICAgLy8gdGhpbiBhaXIgb24gSUU4LCB0aGlzIG9ubHkgaGFwcGVucyBpZiB0aGVyZSBpcyBubyB2aXNpYmxlIHRleHRcbiAgICAgIC8vIGluLWZyb250IG9mIHRoZSBub24tdmlzaWJsZSB0YWdzLiBQaWdneWJhY2sgb24gdGhlIHdoaXRlc3BhY2UgZml4XG4gICAgICAvLyBhbmQgc2ltcGx5IGNoZWNrIGlmIGFueSBub24tdmlzaWJsZSB0YWdzIGFwcGVhciBpbiB0aGUgc291cmNlLlxuICAgICAgaWYgKFdISVRFU1BBQ0VfVEVTVC50ZXN0KGh0bWwpIHx8IGh0bWxbMF0gPT09ICc8JyAmJiBOT05WSVNJQkxFX1RFU1QudGVzdChodG1sKSkge1xuICAgICAgICAvLyBSZWNvdmVyIGxlYWRpbmcgd2hpdGVzcGFjZSBieSB0ZW1wb3JhcmlseSBwcmVwZW5kaW5nIGFueSBjaGFyYWN0ZXIuXG4gICAgICAgIC8vIFxcdUZFRkYgaGFzIHRoZSBwb3RlbnRpYWwgYWR2YW50YWdlIG9mIGJlaW5nIHplcm8td2lkdGgvaW52aXNpYmxlLlxuICAgICAgICAvLyBVZ2xpZnlKUyBkcm9wcyBVK0ZFRkYgY2hhcnMgd2hlbiBwYXJzaW5nLCBzbyB1c2UgU3RyaW5nLmZyb21DaGFyQ29kZVxuICAgICAgICAvLyBpbiBob3BlcyB0aGF0IHRoaXMgaXMgcHJlc2VydmVkIGV2ZW4gaWYgXCJcXHVGRUZGXCIgaXMgdHJhbnNmb3JtZWQgdG9cbiAgICAgICAgLy8gdGhlIGFjdHVhbCBVbmljb2RlIGNoYXJhY3RlciAoYnkgQmFiZWwsIGZvciBleGFtcGxlKS5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21pc2hvby9VZ2xpZnlKUzIvYmxvYi92Mi40LjIwL2xpYi9wYXJzZS5qcyNMMjE2XG4gICAgICAgIG5vZGUuaW5uZXJIVE1MID0gU3RyaW5nLmZyb21DaGFyQ29kZSgweEZFRkYpICsgaHRtbDtcblxuICAgICAgICAvLyBkZWxldGVEYXRhIGxlYXZlcyBhbiBlbXB0eSBgVGV4dE5vZGVgIHdoaWNoIG9mZnNldHMgdGhlIGluZGV4IG9mIGFsbFxuICAgICAgICAvLyBjaGlsZHJlbi4gRGVmaW5pdGVseSB3YW50IHRvIGF2b2lkIHRoaXMuXG4gICAgICAgIHZhciB0ZXh0Tm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKHRleHROb2RlLmRhdGEubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgbm9kZS5yZW1vdmVDaGlsZCh0ZXh0Tm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGV4dE5vZGUuZGVsZXRlRGF0YSgwLCAxKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgdGVzdEVsZW1lbnQgPSBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldElubmVySFRNTDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9zZXRJbm5lckhUTUwuanNcbi8vIG1vZHVsZSBpZCA9IDI1NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 257 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n/* globals MSApp */\n\n'use strict';\n\n/**\n * Create a function which has 'unsafe' privileges (required by windows8 apps)\n */\n\nvar createMicrosoftUnsafeLocalFunction = function (func) {\n  if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) {\n    return function (arg0, arg1, arg2, arg3) {\n      MSApp.execUnsafeLocalFunction(function () {\n        return func(arg0, arg1, arg2, arg3);\n      });\n    };\n  } else {\n    return func;\n  }\n};\n\nmodule.exports = createMicrosoftUnsafeLocalFunction;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2NyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbi8qIGdsb2JhbHMgTVNBcHAgKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENyZWF0ZSBhIGZ1bmN0aW9uIHdoaWNoIGhhcyAndW5zYWZlJyBwcml2aWxlZ2VzIChyZXF1aXJlZCBieSB3aW5kb3dzOCBhcHBzKVxuICovXG5cbnZhciBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgaWYgKHR5cGVvZiBNU0FwcCAhPT0gJ3VuZGVmaW5lZCcgJiYgTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICAgIE1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmdW5jO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb247XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbi5qc1xuLy8gbW9kdWxlIGlkID0gMjU3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 258 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar ExecutionEnvironment = __webpack_require__(221);\nvar escapeTextContentForBrowser = __webpack_require__(259);\nvar setInnerHTML = __webpack_require__(256);\n\n/**\n * Set the textContent property of a node, ensuring that whitespace is preserved\n * even in IE8. innerText is a poor substitute for textContent and, among many\n * issues, inserts <br> instead of the literal newline chars. innerHTML behaves\n * as it should.\n *\n * @param {DOMElement} node\n * @param {string} text\n * @internal\n */\nvar setTextContent = function (node, text) {\n  if (text) {\n    var firstChild = node.firstChild;\n\n    if (firstChild && firstChild === node.lastChild && firstChild.nodeType === 3) {\n      firstChild.nodeValue = text;\n      return;\n    }\n  }\n  node.textContent = text;\n};\n\nif (ExecutionEnvironment.canUseDOM) {\n  if (!('textContent' in document.documentElement)) {\n    setTextContent = function (node, text) {\n      if (node.nodeType === 3) {\n        node.nodeValue = text;\n        return;\n      }\n      setInnerHTML(node, escapeTextContentForBrowser(text));\n    };\n  }\n}\n\nmodule.exports = setTextContent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL3NldFRleHRDb250ZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG52YXIgZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyID0gcmVxdWlyZSgnLi9lc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXInKTtcbnZhciBzZXRJbm5lckhUTUwgPSByZXF1aXJlKCcuL3NldElubmVySFRNTCcpO1xuXG4vKipcbiAqIFNldCB0aGUgdGV4dENvbnRlbnQgcHJvcGVydHkgb2YgYSBub2RlLCBlbnN1cmluZyB0aGF0IHdoaXRlc3BhY2UgaXMgcHJlc2VydmVkXG4gKiBldmVuIGluIElFOC4gaW5uZXJUZXh0IGlzIGEgcG9vciBzdWJzdGl0dXRlIGZvciB0ZXh0Q29udGVudCBhbmQsIGFtb25nIG1hbnlcbiAqIGlzc3VlcywgaW5zZXJ0cyA8YnI+IGluc3RlYWQgb2YgdGhlIGxpdGVyYWwgbmV3bGluZSBjaGFycy4gaW5uZXJIVE1MIGJlaGF2ZXNcbiAqIGFzIGl0IHNob3VsZC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIHNldFRleHRDb250ZW50ID0gZnVuY3Rpb24gKG5vZGUsIHRleHQpIHtcbiAgaWYgKHRleHQpIHtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcblxuICAgIGlmIChmaXJzdENoaWxkICYmIGZpcnN0Q2hpbGQgPT09IG5vZGUubGFzdENoaWxkICYmIGZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgIGZpcnN0Q2hpbGQubm9kZVZhbHVlID0gdGV4dDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgbm9kZS50ZXh0Q29udGVudCA9IHRleHQ7XG59O1xuXG5pZiAoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKSB7XG4gIGlmICghKCd0ZXh0Q29udGVudCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSkge1xuICAgIHNldFRleHRDb250ZW50ID0gZnVuY3Rpb24gKG5vZGUsIHRleHQpIHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgIG5vZGUubm9kZVZhbHVlID0gdGV4dDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2V0SW5uZXJIVE1MKG5vZGUsIGVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3Nlcih0ZXh0KSk7XG4gICAgfTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldFRleHRDb250ZW50O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL3NldFRleHRDb250ZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAyNThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 259 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2016-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * Based on the escape-html library, which is used under the MIT License below:\n *\n * Copyright (c) 2012-2013 TJ Holowaychuk\n * Copyright (c) 2015 Andreas Lubbe\n * Copyright (c) 2015 Tiancheng \"Timothy\" Gu\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * 'Software'), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n */\n\n'use strict';\n\n// code copied and modified from escape-html\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param  {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n  var str = '' + string;\n  var match = matchHtmlRegExp.exec(str);\n\n  if (!match) {\n    return str;\n  }\n\n  var escape;\n  var html = '';\n  var index = 0;\n  var lastIndex = 0;\n\n  for (index = match.index; index < str.length; index++) {\n    switch (str.charCodeAt(index)) {\n      case 34:\n        // \"\n        escape = '&quot;';\n        break;\n      case 38:\n        // &\n        escape = '&amp;';\n        break;\n      case 39:\n        // '\n        escape = '&#x27;'; // modified from escape-html; used to be '&#39'\n        break;\n      case 60:\n        // <\n        escape = '&lt;';\n        break;\n      case 62:\n        // >\n        escape = '&gt;';\n        break;\n      default:\n        continue;\n    }\n\n    if (lastIndex !== index) {\n      html += str.substring(lastIndex, index);\n    }\n\n    lastIndex = index + 1;\n    html += escape;\n  }\n\n  return lastIndex !== index ? html + str.substring(lastIndex, index) : html;\n}\n// end code copied and modified from escape-html\n\n\n/**\n * Escapes text to prevent scripting attacks.\n *\n * @param {*} text Text value to escape.\n * @return {string} An escaped string.\n */\nfunction escapeTextContentForBrowser(text) {\n  if (typeof text === 'boolean' || typeof text === 'number') {\n    // this shortcircuit helps perf for types that we know will never have\n    // special characters, especially given that this function is used often\n    // for numeric dom ids.\n    return '' + text;\n  }\n  return escapeHtml(text);\n}\n\nmodule.exports = escapeTextContentForBrowser;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2VzY2FwZVRleHRDb250ZW50Rm9yQnJvd3Nlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDE2LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBCYXNlZCBvbiB0aGUgZXNjYXBlLWh0bWwgbGlicmFyeSwgd2hpY2ggaXMgdXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgYmVsb3c6XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodCAoYykgMjAxNSBBbmRyZWFzIEx1YmJlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGlhbmNoZW5nIFwiVGltb3RoeVwiIEd1XG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nXG4gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbiAqICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbiAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbiAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0b1xuICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvXG4gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmVcbiAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG4gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWVxuICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCxcbiAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFXG4gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vLyBjb2RlIGNvcGllZCBhbmQgbW9kaWZpZWQgZnJvbSBlc2NhcGUtaHRtbFxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgbWF0Y2hIdG1sUmVnRXhwID0gL1tcIicmPD5dLztcblxuLyoqXG4gKiBFc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbiBzdHJpbmcgb2YgaHRtbC5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGVzY2FwZSBmb3IgaW5zZXJ0aW5nIGludG8gSFRNTFxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGVzY2FwZUh0bWwoc3RyaW5nKSB7XG4gIHZhciBzdHIgPSAnJyArIHN0cmluZztcbiAgdmFyIG1hdGNoID0gbWF0Y2hIdG1sUmVnRXhwLmV4ZWMoc3RyKTtcblxuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIHZhciBlc2NhcGU7XG4gIHZhciBodG1sID0gJyc7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsYXN0SW5kZXggPSAwO1xuXG4gIGZvciAoaW5kZXggPSBtYXRjaC5pbmRleDsgaW5kZXggPCBzdHIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgc3dpdGNoIChzdHIuY2hhckNvZGVBdChpbmRleCkpIHtcbiAgICAgIGNhc2UgMzQ6XG4gICAgICAgIC8vIFwiXG4gICAgICAgIGVzY2FwZSA9ICcmcXVvdDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzg6XG4gICAgICAgIC8vICZcbiAgICAgICAgZXNjYXBlID0gJyZhbXA7JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM5OlxuICAgICAgICAvLyAnXG4gICAgICAgIGVzY2FwZSA9ICcmI3gyNzsnOyAvLyBtb2RpZmllZCBmcm9tIGVzY2FwZS1odG1sOyB1c2VkIHRvIGJlICcmIzM5J1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjA6XG4gICAgICAgIC8vIDxcbiAgICAgICAgZXNjYXBlID0gJyZsdDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjI6XG4gICAgICAgIC8vID5cbiAgICAgICAgZXNjYXBlID0gJyZndDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChsYXN0SW5kZXggIT09IGluZGV4KSB7XG4gICAgICBodG1sICs9IHN0ci5zdWJzdHJpbmcobGFzdEluZGV4LCBpbmRleCk7XG4gICAgfVxuXG4gICAgbGFzdEluZGV4ID0gaW5kZXggKyAxO1xuICAgIGh0bWwgKz0gZXNjYXBlO1xuICB9XG5cbiAgcmV0dXJuIGxhc3RJbmRleCAhPT0gaW5kZXggPyBodG1sICsgc3RyLnN1YnN0cmluZyhsYXN0SW5kZXgsIGluZGV4KSA6IGh0bWw7XG59XG4vLyBlbmQgY29kZSBjb3BpZWQgYW5kIG1vZGlmaWVkIGZyb20gZXNjYXBlLWh0bWxcblxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCB0byBwcmV2ZW50IHNjcmlwdGluZyBhdHRhY2tzLlxuICpcbiAqIEBwYXJhbSB7Kn0gdGV4dCBUZXh0IHZhbHVlIHRvIGVzY2FwZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gQW4gZXNjYXBlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3Nlcih0ZXh0KSB7XG4gIGlmICh0eXBlb2YgdGV4dCA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiB0ZXh0ID09PSAnbnVtYmVyJykge1xuICAgIC8vIHRoaXMgc2hvcnRjaXJjdWl0IGhlbHBzIHBlcmYgZm9yIHR5cGVzIHRoYXQgd2Uga25vdyB3aWxsIG5ldmVyIGhhdmVcbiAgICAvLyBzcGVjaWFsIGNoYXJhY3RlcnMsIGVzcGVjaWFsbHkgZ2l2ZW4gdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgb2Z0ZW5cbiAgICAvLyBmb3IgbnVtZXJpYyBkb20gaWRzLlxuICAgIHJldHVybiAnJyArIHRleHQ7XG4gIH1cbiAgcmV0dXJuIGVzY2FwZUh0bWwodGV4dCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL2VzY2FwZVRleHRDb250ZW50Rm9yQnJvd3Nlci5qc1xuLy8gbW9kdWxlIGlkID0gMjU5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 260 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nvar DOMLazyTree = __webpack_require__(254);\nvar ExecutionEnvironment = __webpack_require__(221);\n\nvar createNodesFromMarkup = __webpack_require__(261);\nvar emptyFunction = __webpack_require__(184);\nvar invariant = __webpack_require__(180);\n\nvar Danger = {\n\n  /**\n   * Replaces a node with a string of markup at its current position within its\n   * parent. The markup must render into a single root node.\n   *\n   * @param {DOMElement} oldChild Child node to replace.\n   * @param {string} markup Markup to render in place of the child node.\n   * @internal\n   */\n  dangerouslyReplaceNodeWithMarkup: function (oldChild, markup) {\n    !ExecutionEnvironment.canUseDOM ?  true ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Cannot render markup in a worker thread. Make sure `window` and `document` are available globally before requiring React when unit testing or use ReactDOMServer.renderToString() for server rendering.') : _prodInvariant('56') : void 0;\n    !markup ?  true ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Missing markup.') : _prodInvariant('57') : void 0;\n    !(oldChild.nodeName !== 'HTML') ?  true ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Cannot replace markup of the <html> node. This is because browser quirks make this unreliable and/or slow. If you want to render to the root you must use server rendering. See ReactDOMServer.renderToString().') : _prodInvariant('58') : void 0;\n\n    if (typeof markup === 'string') {\n      var newChild = createNodesFromMarkup(markup, emptyFunction)[0];\n      oldChild.parentNode.replaceChild(newChild, oldChild);\n    } else {\n      DOMLazyTree.replaceChildWithTree(oldChild, markup);\n    }\n  }\n\n};\n\nmodule.exports = Danger;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0Rhbmdlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgRE9NTGF6eVRyZWUgPSByZXF1aXJlKCcuL0RPTUxhenlUcmVlJyk7XG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xuXG52YXIgY3JlYXRlTm9kZXNGcm9tTWFya3VwID0gcmVxdWlyZSgnZmJqcy9saWIvY3JlYXRlTm9kZXNGcm9tTWFya3VwJyk7XG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxudmFyIERhbmdlciA9IHtcblxuICAvKipcbiAgICogUmVwbGFjZXMgYSBub2RlIHdpdGggYSBzdHJpbmcgb2YgbWFya3VwIGF0IGl0cyBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiBpdHNcbiAgICogcGFyZW50LiBUaGUgbWFya3VwIG11c3QgcmVuZGVyIGludG8gYSBzaW5nbGUgcm9vdCBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG9sZENoaWxkIENoaWxkIG5vZGUgdG8gcmVwbGFjZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hcmt1cCBNYXJrdXAgdG8gcmVuZGVyIGluIHBsYWNlIG9mIHRoZSBjaGlsZCBub2RlLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwOiBmdW5jdGlvbiAob2xkQ2hpbGQsIG1hcmt1cCkge1xuICAgICFFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAoLi4uKTogQ2Fubm90IHJlbmRlciBtYXJrdXAgaW4gYSB3b3JrZXIgdGhyZWFkLiBNYWtlIHN1cmUgYHdpbmRvd2AgYW5kIGBkb2N1bWVudGAgYXJlIGF2YWlsYWJsZSBnbG9iYWxseSBiZWZvcmUgcmVxdWlyaW5nIFJlYWN0IHdoZW4gdW5pdCB0ZXN0aW5nIG9yIHVzZSBSZWFjdERPTVNlcnZlci5yZW5kZXJUb1N0cmluZygpIGZvciBzZXJ2ZXIgcmVuZGVyaW5nLicpIDogX3Byb2RJbnZhcmlhbnQoJzU2JykgOiB2b2lkIDA7XG4gICAgIW1hcmt1cCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cCguLi4pOiBNaXNzaW5nIG1hcmt1cC4nKSA6IF9wcm9kSW52YXJpYW50KCc1NycpIDogdm9pZCAwO1xuICAgICEob2xkQ2hpbGQubm9kZU5hbWUgIT09ICdIVE1MJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAoLi4uKTogQ2Fubm90IHJlcGxhY2UgbWFya3VwIG9mIHRoZSA8aHRtbD4gbm9kZS4gVGhpcyBpcyBiZWNhdXNlIGJyb3dzZXIgcXVpcmtzIG1ha2UgdGhpcyB1bnJlbGlhYmxlIGFuZC9vciBzbG93LiBJZiB5b3Ugd2FudCB0byByZW5kZXIgdG8gdGhlIHJvb3QgeW91IG11c3QgdXNlIHNlcnZlciByZW5kZXJpbmcuIFNlZSBSZWFjdERPTVNlcnZlci5yZW5kZXJUb1N0cmluZygpLicpIDogX3Byb2RJbnZhcmlhbnQoJzU4JykgOiB2b2lkIDA7XG5cbiAgICBpZiAodHlwZW9mIG1hcmt1cCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhciBuZXdDaGlsZCA9IGNyZWF0ZU5vZGVzRnJvbU1hcmt1cChtYXJrdXAsIGVtcHR5RnVuY3Rpb24pWzBdO1xuICAgICAgb2xkQ2hpbGQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3Q2hpbGQsIG9sZENoaWxkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgRE9NTGF6eVRyZWUucmVwbGFjZUNoaWxkV2l0aFRyZWUob2xkQ2hpbGQsIG1hcmt1cCk7XG4gICAgfVxuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRGFuZ2VyO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL0Rhbmdlci5qc1xuLy8gbW9kdWxlIGlkID0gMjYwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 261 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @typechecks\n */\n\n/*eslint-disable fb-www/unsafe-html*/\n\nvar ExecutionEnvironment = __webpack_require__(221);\n\nvar createArrayFromMixed = __webpack_require__(262);\nvar getMarkupWrap = __webpack_require__(263);\nvar invariant = __webpack_require__(180);\n\n/**\n * Dummy container used to render all markup.\n */\nvar dummyNode = ExecutionEnvironment.canUseDOM ? document.createElement('div') : null;\n\n/**\n * Pattern used by `getNodeName`.\n */\nvar nodeNamePattern = /^\\s*<(\\w+)/;\n\n/**\n * Extracts the `nodeName` of the first element in a string of markup.\n *\n * @param {string} markup String of markup.\n * @return {?string} Node name of the supplied markup.\n */\nfunction getNodeName(markup) {\n  var nodeNameMatch = markup.match(nodeNamePattern);\n  return nodeNameMatch && nodeNameMatch[1].toLowerCase();\n}\n\n/**\n * Creates an array containing the nodes rendered from the supplied markup. The\n * optionally supplied `handleScript` function will be invoked once for each\n * <script> element that is rendered. If no `handleScript` function is supplied,\n * an exception is thrown if any <script> elements are rendered.\n *\n * @param {string} markup A string of valid HTML markup.\n * @param {?function} handleScript Invoked once for each rendered <script>.\n * @return {array<DOMElement|DOMTextNode>} An array of rendered nodes.\n */\nfunction createNodesFromMarkup(markup, handleScript) {\n  var node = dummyNode;\n  !!!dummyNode ?  true ? invariant(false, 'createNodesFromMarkup dummy not initialized') : invariant(false) : void 0;\n  var nodeName = getNodeName(markup);\n\n  var wrap = nodeName && getMarkupWrap(nodeName);\n  if (wrap) {\n    node.innerHTML = wrap[1] + markup + wrap[2];\n\n    var wrapDepth = wrap[0];\n    while (wrapDepth--) {\n      node = node.lastChild;\n    }\n  } else {\n    node.innerHTML = markup;\n  }\n\n  var scripts = node.getElementsByTagName('script');\n  if (scripts.length) {\n    !handleScript ?  true ? invariant(false, 'createNodesFromMarkup(...): Unexpected <script> element rendered.') : invariant(false) : void 0;\n    createArrayFromMixed(scripts).forEach(handleScript);\n  }\n\n  var nodes = Array.from(node.childNodes);\n  while (node.lastChild) {\n    node.removeChild(node.lastChild);\n  }\n  return nodes;\n}\n\nmodule.exports = createNodesFromMarkup;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9jcmVhdGVOb2Rlc0Zyb21NYXJrdXAuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHR5cGVjaGVja3NcbiAqL1xuXG4vKmVzbGludC1kaXNhYmxlIGZiLXd3dy91bnNhZmUtaHRtbCovXG5cbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJy4vRXhlY3V0aW9uRW52aXJvbm1lbnQnKTtcblxudmFyIGNyZWF0ZUFycmF5RnJvbU1peGVkID0gcmVxdWlyZSgnLi9jcmVhdGVBcnJheUZyb21NaXhlZCcpO1xudmFyIGdldE1hcmt1cFdyYXAgPSByZXF1aXJlKCcuL2dldE1hcmt1cFdyYXAnKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCcuL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIER1bW15IGNvbnRhaW5lciB1c2VkIHRvIHJlbmRlciBhbGwgbWFya3VwLlxuICovXG52YXIgZHVtbXlOb2RlID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykgOiBudWxsO1xuXG4vKipcbiAqIFBhdHRlcm4gdXNlZCBieSBgZ2V0Tm9kZU5hbWVgLlxuICovXG52YXIgbm9kZU5hbWVQYXR0ZXJuID0gL15cXHMqPChcXHcrKS87XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGBub2RlTmFtZWAgb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gYSBzdHJpbmcgb2YgbWFya3VwLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrdXAgU3RyaW5nIG9mIG1hcmt1cC5cbiAqIEByZXR1cm4gez9zdHJpbmd9IE5vZGUgbmFtZSBvZiB0aGUgc3VwcGxpZWQgbWFya3VwLlxuICovXG5mdW5jdGlvbiBnZXROb2RlTmFtZShtYXJrdXApIHtcbiAgdmFyIG5vZGVOYW1lTWF0Y2ggPSBtYXJrdXAubWF0Y2gobm9kZU5hbWVQYXR0ZXJuKTtcbiAgcmV0dXJuIG5vZGVOYW1lTWF0Y2ggJiYgbm9kZU5hbWVNYXRjaFsxXS50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbm9kZXMgcmVuZGVyZWQgZnJvbSB0aGUgc3VwcGxpZWQgbWFya3VwLiBUaGVcbiAqIG9wdGlvbmFsbHkgc3VwcGxpZWQgYGhhbmRsZVNjcmlwdGAgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIG9uY2UgZm9yIGVhY2hcbiAqIDxzY3JpcHQ+IGVsZW1lbnQgdGhhdCBpcyByZW5kZXJlZC4gSWYgbm8gYGhhbmRsZVNjcmlwdGAgZnVuY3Rpb24gaXMgc3VwcGxpZWQsXG4gKiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIGFueSA8c2NyaXB0PiBlbGVtZW50cyBhcmUgcmVuZGVyZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1hcmt1cCBBIHN0cmluZyBvZiB2YWxpZCBIVE1MIG1hcmt1cC5cbiAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBoYW5kbGVTY3JpcHQgSW52b2tlZCBvbmNlIGZvciBlYWNoIHJlbmRlcmVkIDxzY3JpcHQ+LlxuICogQHJldHVybiB7YXJyYXk8RE9NRWxlbWVudHxET01UZXh0Tm9kZT59IEFuIGFycmF5IG9mIHJlbmRlcmVkIG5vZGVzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVOb2Rlc0Zyb21NYXJrdXAobWFya3VwLCBoYW5kbGVTY3JpcHQpIHtcbiAgdmFyIG5vZGUgPSBkdW1teU5vZGU7XG4gICEhIWR1bW15Tm9kZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdjcmVhdGVOb2Rlc0Zyb21NYXJrdXAgZHVtbXkgbm90IGluaXRpYWxpemVkJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICB2YXIgbm9kZU5hbWUgPSBnZXROb2RlTmFtZShtYXJrdXApO1xuXG4gIHZhciB3cmFwID0gbm9kZU5hbWUgJiYgZ2V0TWFya3VwV3JhcChub2RlTmFtZSk7XG4gIGlmICh3cmFwKSB7XG4gICAgbm9kZS5pbm5lckhUTUwgPSB3cmFwWzFdICsgbWFya3VwICsgd3JhcFsyXTtcblxuICAgIHZhciB3cmFwRGVwdGggPSB3cmFwWzBdO1xuICAgIHdoaWxlICh3cmFwRGVwdGgtLSkge1xuICAgICAgbm9kZSA9IG5vZGUubGFzdENoaWxkO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBub2RlLmlubmVySFRNTCA9IG1hcmt1cDtcbiAgfVxuXG4gIHZhciBzY3JpcHRzID0gbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0Jyk7XG4gIGlmIChzY3JpcHRzLmxlbmd0aCkge1xuICAgICFoYW5kbGVTY3JpcHQgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnY3JlYXRlTm9kZXNGcm9tTWFya3VwKC4uLik6IFVuZXhwZWN0ZWQgPHNjcmlwdD4gZWxlbWVudCByZW5kZXJlZC4nKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgY3JlYXRlQXJyYXlGcm9tTWl4ZWQoc2NyaXB0cykuZm9yRWFjaChoYW5kbGVTY3JpcHQpO1xuICB9XG5cbiAgdmFyIG5vZGVzID0gQXJyYXkuZnJvbShub2RlLmNoaWxkTm9kZXMpO1xuICB3aGlsZSAobm9kZS5sYXN0Q2hpbGQpIHtcbiAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUubGFzdENoaWxkKTtcbiAgfVxuICByZXR1cm4gbm9kZXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlTm9kZXNGcm9tTWFya3VwO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9mYmpzL2xpYi9jcmVhdGVOb2Rlc0Zyb21NYXJrdXAuanNcbi8vIG1vZHVsZSBpZCA9IDI2MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 262 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @typechecks\n */\n\nvar invariant = __webpack_require__(180);\n\n/**\n * Convert array-like objects to arrays.\n *\n * This API assumes the caller knows the contents of the data type. For less\n * well defined inputs use createArrayFromMixed.\n *\n * @param {object|function|filelist} obj\n * @return {array}\n */\nfunction toArray(obj) {\n  var length = obj.length;\n\n  // Some browsers builtin objects can report typeof 'function' (e.g. NodeList\n  // in old versions of Safari).\n  !(!Array.isArray(obj) && (typeof obj === 'object' || typeof obj === 'function')) ?  true ? invariant(false, 'toArray: Array-like object expected') : invariant(false) : void 0;\n\n  !(typeof length === 'number') ?  true ? invariant(false, 'toArray: Object needs a length property') : invariant(false) : void 0;\n\n  !(length === 0 || length - 1 in obj) ?  true ? invariant(false, 'toArray: Object should have keys for indices') : invariant(false) : void 0;\n\n  !(typeof obj.callee !== 'function') ?  true ? invariant(false, 'toArray: Object can\\'t be `arguments`. Use rest params ' + '(function(...args) {}) or Array.from() instead.') : invariant(false) : void 0;\n\n  // Old IE doesn't give collections access to hasOwnProperty. Assume inputs\n  // without method will throw during the slice call and skip straight to the\n  // fallback.\n  if (obj.hasOwnProperty) {\n    try {\n      return Array.prototype.slice.call(obj);\n    } catch (e) {\n      // IE < 9 does not support Array#slice on collections objects\n    }\n  }\n\n  // Fall back to copying key by key. This assumes all keys have a value,\n  // so will not preserve sparsely populated inputs.\n  var ret = Array(length);\n  for (var ii = 0; ii < length; ii++) {\n    ret[ii] = obj[ii];\n  }\n  return ret;\n}\n\n/**\n * Perform a heuristic test to determine if an object is \"array-like\".\n *\n *   A monk asked Joshu, a Zen master, \"Has a dog Buddha nature?\"\n *   Joshu replied: \"Mu.\"\n *\n * This function determines if its argument has \"array nature\": it returns\n * true if the argument is an actual array, an `arguments' object, or an\n * HTMLCollection (e.g. node.childNodes or node.getElementsByTagName()).\n *\n * It will return false for other array-like objects like Filelist.\n *\n * @param {*} obj\n * @return {boolean}\n */\nfunction hasArrayNature(obj) {\n  return (\n    // not null/false\n    !!obj && (\n    // arrays are objects, NodeLists are functions in Safari\n    typeof obj == 'object' || typeof obj == 'function') &&\n    // quacks like an array\n    'length' in obj &&\n    // not window\n    !('setInterval' in obj) &&\n    // no DOM node should be considered an array-like\n    // a 'select' element has 'length' and 'item' properties on IE8\n    typeof obj.nodeType != 'number' && (\n    // a real array\n    Array.isArray(obj) ||\n    // arguments\n    'callee' in obj ||\n    // HTMLCollection/NodeList\n    'item' in obj)\n  );\n}\n\n/**\n * Ensure that the argument is an array by wrapping it in an array if it is not.\n * Creates a copy of the argument if it is already an array.\n *\n * This is mostly useful idiomatically:\n *\n *   var createArrayFromMixed = require('createArrayFromMixed');\n *\n *   function takesOneOrMoreThings(things) {\n *     things = createArrayFromMixed(things);\n *     ...\n *   }\n *\n * This allows you to treat `things' as an array, but accept scalars in the API.\n *\n * If you need to convert an array-like object, like `arguments`, into an array\n * use toArray instead.\n *\n * @param {*} obj\n * @return {array}\n */\nfunction createArrayFromMixed(obj) {\n  if (!hasArrayNature(obj)) {\n    return [obj];\n  } else if (Array.isArray(obj)) {\n    return obj.slice();\n  } else {\n    return toArray(obj);\n  }\n}\n\nmodule.exports = createArrayFromMixed;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9jcmVhdGVBcnJheUZyb21NaXhlZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCcuL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIENvbnZlcnQgYXJyYXktbGlrZSBvYmplY3RzIHRvIGFycmF5cy5cbiAqXG4gKiBUaGlzIEFQSSBhc3N1bWVzIHRoZSBjYWxsZXIga25vd3MgdGhlIGNvbnRlbnRzIG9mIHRoZSBkYXRhIHR5cGUuIEZvciBsZXNzXG4gKiB3ZWxsIGRlZmluZWQgaW5wdXRzIHVzZSBjcmVhdGVBcnJheUZyb21NaXhlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdHxmdW5jdGlvbnxmaWxlbGlzdH0gb2JqXG4gKiBAcmV0dXJuIHthcnJheX1cbiAqL1xuZnVuY3Rpb24gdG9BcnJheShvYmopIHtcbiAgdmFyIGxlbmd0aCA9IG9iai5sZW5ndGg7XG5cbiAgLy8gU29tZSBicm93c2VycyBidWlsdGluIG9iamVjdHMgY2FuIHJlcG9ydCB0eXBlb2YgJ2Z1bmN0aW9uJyAoZS5nLiBOb2RlTGlzdFxuICAvLyBpbiBvbGQgdmVyc2lvbnMgb2YgU2FmYXJpKS5cbiAgISghQXJyYXkuaXNBcnJheShvYmopICYmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyB8fCB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndG9BcnJheTogQXJyYXktbGlrZSBvYmplY3QgZXhwZWN0ZWQnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG5cbiAgISh0eXBlb2YgbGVuZ3RoID09PSAnbnVtYmVyJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndG9BcnJheTogT2JqZWN0IG5lZWRzIGEgbGVuZ3RoIHByb3BlcnR5JykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuXG4gICEobGVuZ3RoID09PSAwIHx8IGxlbmd0aCAtIDEgaW4gb2JqKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd0b0FycmF5OiBPYmplY3Qgc2hvdWxkIGhhdmUga2V5cyBmb3IgaW5kaWNlcycpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcblxuICAhKHR5cGVvZiBvYmouY2FsbGVlICE9PSAnZnVuY3Rpb24nKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd0b0FycmF5OiBPYmplY3QgY2FuXFwndCBiZSBgYXJndW1lbnRzYC4gVXNlIHJlc3QgcGFyYW1zICcgKyAnKGZ1bmN0aW9uKC4uLmFyZ3MpIHt9KSBvciBBcnJheS5mcm9tKCkgaW5zdGVhZC4nKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG5cbiAgLy8gT2xkIElFIGRvZXNuJ3QgZ2l2ZSBjb2xsZWN0aW9ucyBhY2Nlc3MgdG8gaGFzT3duUHJvcGVydHkuIEFzc3VtZSBpbnB1dHNcbiAgLy8gd2l0aG91dCBtZXRob2Qgd2lsbCB0aHJvdyBkdXJpbmcgdGhlIHNsaWNlIGNhbGwgYW5kIHNraXAgc3RyYWlnaHQgdG8gdGhlXG4gIC8vIGZhbGxiYWNrLlxuICBpZiAob2JqLmhhc093blByb3BlcnR5KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChvYmopO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElFIDwgOSBkb2VzIG5vdCBzdXBwb3J0IEFycmF5I3NsaWNlIG9uIGNvbGxlY3Rpb25zIG9iamVjdHNcbiAgICB9XG4gIH1cblxuICAvLyBGYWxsIGJhY2sgdG8gY29weWluZyBrZXkgYnkga2V5LiBUaGlzIGFzc3VtZXMgYWxsIGtleXMgaGF2ZSBhIHZhbHVlLFxuICAvLyBzbyB3aWxsIG5vdCBwcmVzZXJ2ZSBzcGFyc2VseSBwb3B1bGF0ZWQgaW5wdXRzLlxuICB2YXIgcmV0ID0gQXJyYXkobGVuZ3RoKTtcbiAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGxlbmd0aDsgaWkrKykge1xuICAgIHJldFtpaV0gPSBvYmpbaWldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogUGVyZm9ybSBhIGhldXJpc3RpYyB0ZXN0IHRvIGRldGVybWluZSBpZiBhbiBvYmplY3QgaXMgXCJhcnJheS1saWtlXCIuXG4gKlxuICogICBBIG1vbmsgYXNrZWQgSm9zaHUsIGEgWmVuIG1hc3RlciwgXCJIYXMgYSBkb2cgQnVkZGhhIG5hdHVyZT9cIlxuICogICBKb3NodSByZXBsaWVkOiBcIk11LlwiXG4gKlxuICogVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIGl0cyBhcmd1bWVudCBoYXMgXCJhcnJheSBuYXR1cmVcIjogaXQgcmV0dXJuc1xuICogdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgYW4gYWN0dWFsIGFycmF5LCBhbiBgYXJndW1lbnRzJyBvYmplY3QsIG9yIGFuXG4gKiBIVE1MQ29sbGVjdGlvbiAoZS5nLiBub2RlLmNoaWxkTm9kZXMgb3Igbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgpKS5cbiAqXG4gKiBJdCB3aWxsIHJldHVybiBmYWxzZSBmb3Igb3RoZXIgYXJyYXktbGlrZSBvYmplY3RzIGxpa2UgRmlsZWxpc3QuXG4gKlxuICogQHBhcmFtIHsqfSBvYmpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGhhc0FycmF5TmF0dXJlKG9iaikge1xuICByZXR1cm4gKFxuICAgIC8vIG5vdCBudWxsL2ZhbHNlXG4gICAgISFvYmogJiYgKFxuICAgIC8vIGFycmF5cyBhcmUgb2JqZWN0cywgTm9kZUxpc3RzIGFyZSBmdW5jdGlvbnMgaW4gU2FmYXJpXG4gICAgdHlwZW9mIG9iaiA9PSAnb2JqZWN0JyB8fCB0eXBlb2Ygb2JqID09ICdmdW5jdGlvbicpICYmXG4gICAgLy8gcXVhY2tzIGxpa2UgYW4gYXJyYXlcbiAgICAnbGVuZ3RoJyBpbiBvYmogJiZcbiAgICAvLyBub3Qgd2luZG93XG4gICAgISgnc2V0SW50ZXJ2YWwnIGluIG9iaikgJiZcbiAgICAvLyBubyBET00gbm9kZSBzaG91bGQgYmUgY29uc2lkZXJlZCBhbiBhcnJheS1saWtlXG4gICAgLy8gYSAnc2VsZWN0JyBlbGVtZW50IGhhcyAnbGVuZ3RoJyBhbmQgJ2l0ZW0nIHByb3BlcnRpZXMgb24gSUU4XG4gICAgdHlwZW9mIG9iai5ub2RlVHlwZSAhPSAnbnVtYmVyJyAmJiAoXG4gICAgLy8gYSByZWFsIGFycmF5XG4gICAgQXJyYXkuaXNBcnJheShvYmopIHx8XG4gICAgLy8gYXJndW1lbnRzXG4gICAgJ2NhbGxlZScgaW4gb2JqIHx8XG4gICAgLy8gSFRNTENvbGxlY3Rpb24vTm9kZUxpc3RcbiAgICAnaXRlbScgaW4gb2JqKVxuICApO1xufVxuXG4vKipcbiAqIEVuc3VyZSB0aGF0IHRoZSBhcmd1bWVudCBpcyBhbiBhcnJheSBieSB3cmFwcGluZyBpdCBpbiBhbiBhcnJheSBpZiBpdCBpcyBub3QuXG4gKiBDcmVhdGVzIGEgY29weSBvZiB0aGUgYXJndW1lbnQgaWYgaXQgaXMgYWxyZWFkeSBhbiBhcnJheS5cbiAqXG4gKiBUaGlzIGlzIG1vc3RseSB1c2VmdWwgaWRpb21hdGljYWxseTpcbiAqXG4gKiAgIHZhciBjcmVhdGVBcnJheUZyb21NaXhlZCA9IHJlcXVpcmUoJ2NyZWF0ZUFycmF5RnJvbU1peGVkJyk7XG4gKlxuICogICBmdW5jdGlvbiB0YWtlc09uZU9yTW9yZVRoaW5ncyh0aGluZ3MpIHtcbiAqICAgICB0aGluZ3MgPSBjcmVhdGVBcnJheUZyb21NaXhlZCh0aGluZ3MpO1xuICogICAgIC4uLlxuICogICB9XG4gKlxuICogVGhpcyBhbGxvd3MgeW91IHRvIHRyZWF0IGB0aGluZ3MnIGFzIGFuIGFycmF5LCBidXQgYWNjZXB0IHNjYWxhcnMgaW4gdGhlIEFQSS5cbiAqXG4gKiBJZiB5b3UgbmVlZCB0byBjb252ZXJ0IGFuIGFycmF5LWxpa2Ugb2JqZWN0LCBsaWtlIGBhcmd1bWVudHNgLCBpbnRvIGFuIGFycmF5XG4gKiB1c2UgdG9BcnJheSBpbnN0ZWFkLlxuICpcbiAqIEBwYXJhbSB7Kn0gb2JqXG4gKiBAcmV0dXJuIHthcnJheX1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQXJyYXlGcm9tTWl4ZWQob2JqKSB7XG4gIGlmICghaGFzQXJyYXlOYXR1cmUob2JqKSkge1xuICAgIHJldHVybiBbb2JqXTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICByZXR1cm4gb2JqLnNsaWNlKCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRvQXJyYXkob2JqKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUFycmF5RnJvbU1peGVkO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9mYmpzL2xpYi9jcmVhdGVBcnJheUZyb21NaXhlZC5qc1xuLy8gbW9kdWxlIGlkID0gMjYyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 263 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n/*eslint-disable fb-www/unsafe-html */\n\nvar ExecutionEnvironment = __webpack_require__(221);\n\nvar invariant = __webpack_require__(180);\n\n/**\n * Dummy container used to detect which wraps are necessary.\n */\nvar dummyNode = ExecutionEnvironment.canUseDOM ? document.createElement('div') : null;\n\n/**\n * Some browsers cannot use `innerHTML` to render certain elements standalone,\n * so we wrap them, render the wrapped nodes, then extract the desired node.\n *\n * In IE8, certain elements cannot render alone, so wrap all elements ('*').\n */\n\nvar shouldWrap = {};\n\nvar selectWrap = [1, '<select multiple=\"true\">', '</select>'];\nvar tableWrap = [1, '<table>', '</table>'];\nvar trWrap = [3, '<table><tbody><tr>', '</tr></tbody></table>'];\n\nvar svgWrap = [1, '<svg xmlns=\"http://www.w3.org/2000/svg\">', '</svg>'];\n\nvar markupWrap = {\n  '*': [1, '?<div>', '</div>'],\n\n  'area': [1, '<map>', '</map>'],\n  'col': [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'],\n  'legend': [1, '<fieldset>', '</fieldset>'],\n  'param': [1, '<object>', '</object>'],\n  'tr': [2, '<table><tbody>', '</tbody></table>'],\n\n  'optgroup': selectWrap,\n  'option': selectWrap,\n\n  'caption': tableWrap,\n  'colgroup': tableWrap,\n  'tbody': tableWrap,\n  'tfoot': tableWrap,\n  'thead': tableWrap,\n\n  'td': trWrap,\n  'th': trWrap\n};\n\n// Initialize the SVG elements since we know they'll always need to be wrapped\n// consistently. If they are created inside a <div> they will be initialized in\n// the wrong namespace (and will not display).\nvar svgElements = ['circle', 'clipPath', 'defs', 'ellipse', 'g', 'image', 'line', 'linearGradient', 'mask', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'stop', 'text', 'tspan'];\nsvgElements.forEach(function (nodeName) {\n  markupWrap[nodeName] = svgWrap;\n  shouldWrap[nodeName] = true;\n});\n\n/**\n * Gets the markup wrap configuration for the supplied `nodeName`.\n *\n * NOTE: This lazily detects which wraps are necessary for the current browser.\n *\n * @param {string} nodeName Lowercase `nodeName`.\n * @return {?array} Markup wrap configuration, if applicable.\n */\nfunction getMarkupWrap(nodeName) {\n  !!!dummyNode ?  true ? invariant(false, 'Markup wrapping node not initialized') : invariant(false) : void 0;\n  if (!markupWrap.hasOwnProperty(nodeName)) {\n    nodeName = '*';\n  }\n  if (!shouldWrap.hasOwnProperty(nodeName)) {\n    if (nodeName === '*') {\n      dummyNode.innerHTML = '<link />';\n    } else {\n      dummyNode.innerHTML = '<' + nodeName + '></' + nodeName + '>';\n    }\n    shouldWrap[nodeName] = !dummyNode.firstChild;\n  }\n  return shouldWrap[nodeName] ? markupWrap[nodeName] : null;\n}\n\nmodule.exports = getMarkupWrap;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9nZXRNYXJrdXBXcmFwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4vKmVzbGludC1kaXNhYmxlIGZiLXd3dy91bnNhZmUtaHRtbCAqL1xuXG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCcuL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCcuL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIER1bW15IGNvbnRhaW5lciB1c2VkIHRvIGRldGVjdCB3aGljaCB3cmFwcyBhcmUgbmVjZXNzYXJ5LlxuICovXG52YXIgZHVtbXlOb2RlID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykgOiBudWxsO1xuXG4vKipcbiAqIFNvbWUgYnJvd3NlcnMgY2Fubm90IHVzZSBgaW5uZXJIVE1MYCB0byByZW5kZXIgY2VydGFpbiBlbGVtZW50cyBzdGFuZGFsb25lLFxuICogc28gd2Ugd3JhcCB0aGVtLCByZW5kZXIgdGhlIHdyYXBwZWQgbm9kZXMsIHRoZW4gZXh0cmFjdCB0aGUgZGVzaXJlZCBub2RlLlxuICpcbiAqIEluIElFOCwgY2VydGFpbiBlbGVtZW50cyBjYW5ub3QgcmVuZGVyIGFsb25lLCBzbyB3cmFwIGFsbCBlbGVtZW50cyAoJyonKS5cbiAqL1xuXG52YXIgc2hvdWxkV3JhcCA9IHt9O1xuXG52YXIgc2VsZWN0V3JhcCA9IFsxLCAnPHNlbGVjdCBtdWx0aXBsZT1cInRydWVcIj4nLCAnPC9zZWxlY3Q+J107XG52YXIgdGFibGVXcmFwID0gWzEsICc8dGFibGU+JywgJzwvdGFibGU+J107XG52YXIgdHJXcmFwID0gWzMsICc8dGFibGU+PHRib2R5Pjx0cj4nLCAnPC90cj48L3Rib2R5PjwvdGFibGU+J107XG5cbnZhciBzdmdXcmFwID0gWzEsICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4nLCAnPC9zdmc+J107XG5cbnZhciBtYXJrdXBXcmFwID0ge1xuICAnKic6IFsxLCAnPzxkaXY+JywgJzwvZGl2PiddLFxuXG4gICdhcmVhJzogWzEsICc8bWFwPicsICc8L21hcD4nXSxcbiAgJ2NvbCc6IFsyLCAnPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4nLCAnPC9jb2xncm91cD48L3RhYmxlPiddLFxuICAnbGVnZW5kJzogWzEsICc8ZmllbGRzZXQ+JywgJzwvZmllbGRzZXQ+J10sXG4gICdwYXJhbSc6IFsxLCAnPG9iamVjdD4nLCAnPC9vYmplY3Q+J10sXG4gICd0cic6IFsyLCAnPHRhYmxlPjx0Ym9keT4nLCAnPC90Ym9keT48L3RhYmxlPiddLFxuXG4gICdvcHRncm91cCc6IHNlbGVjdFdyYXAsXG4gICdvcHRpb24nOiBzZWxlY3RXcmFwLFxuXG4gICdjYXB0aW9uJzogdGFibGVXcmFwLFxuICAnY29sZ3JvdXAnOiB0YWJsZVdyYXAsXG4gICd0Ym9keSc6IHRhYmxlV3JhcCxcbiAgJ3Rmb290JzogdGFibGVXcmFwLFxuICAndGhlYWQnOiB0YWJsZVdyYXAsXG5cbiAgJ3RkJzogdHJXcmFwLFxuICAndGgnOiB0cldyYXBcbn07XG5cbi8vIEluaXRpYWxpemUgdGhlIFNWRyBlbGVtZW50cyBzaW5jZSB3ZSBrbm93IHRoZXknbGwgYWx3YXlzIG5lZWQgdG8gYmUgd3JhcHBlZFxuLy8gY29uc2lzdGVudGx5LiBJZiB0aGV5IGFyZSBjcmVhdGVkIGluc2lkZSBhIDxkaXY+IHRoZXkgd2lsbCBiZSBpbml0aWFsaXplZCBpblxuLy8gdGhlIHdyb25nIG5hbWVzcGFjZSAoYW5kIHdpbGwgbm90IGRpc3BsYXkpLlxudmFyIHN2Z0VsZW1lbnRzID0gWydjaXJjbGUnLCAnY2xpcFBhdGgnLCAnZGVmcycsICdlbGxpcHNlJywgJ2cnLCAnaW1hZ2UnLCAnbGluZScsICdsaW5lYXJHcmFkaWVudCcsICdtYXNrJywgJ3BhdGgnLCAncGF0dGVybicsICdwb2x5Z29uJywgJ3BvbHlsaW5lJywgJ3JhZGlhbEdyYWRpZW50JywgJ3JlY3QnLCAnc3RvcCcsICd0ZXh0JywgJ3RzcGFuJ107XG5zdmdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlTmFtZSkge1xuICBtYXJrdXBXcmFwW25vZGVOYW1lXSA9IHN2Z1dyYXA7XG4gIHNob3VsZFdyYXBbbm9kZU5hbWVdID0gdHJ1ZTtcbn0pO1xuXG4vKipcbiAqIEdldHMgdGhlIG1hcmt1cCB3cmFwIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzdXBwbGllZCBgbm9kZU5hbWVgLlxuICpcbiAqIE5PVEU6IFRoaXMgbGF6aWx5IGRldGVjdHMgd2hpY2ggd3JhcHMgYXJlIG5lY2Vzc2FyeSBmb3IgdGhlIGN1cnJlbnQgYnJvd3Nlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbm9kZU5hbWUgTG93ZXJjYXNlIGBub2RlTmFtZWAuXG4gKiBAcmV0dXJuIHs/YXJyYXl9IE1hcmt1cCB3cmFwIGNvbmZpZ3VyYXRpb24sIGlmIGFwcGxpY2FibGUuXG4gKi9cbmZ1bmN0aW9uIGdldE1hcmt1cFdyYXAobm9kZU5hbWUpIHtcbiAgISEhZHVtbXlOb2RlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ01hcmt1cCB3cmFwcGluZyBub2RlIG5vdCBpbml0aWFsaXplZCcpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgaWYgKCFtYXJrdXBXcmFwLmhhc093blByb3BlcnR5KG5vZGVOYW1lKSkge1xuICAgIG5vZGVOYW1lID0gJyonO1xuICB9XG4gIGlmICghc2hvdWxkV3JhcC5oYXNPd25Qcm9wZXJ0eShub2RlTmFtZSkpIHtcbiAgICBpZiAobm9kZU5hbWUgPT09ICcqJykge1xuICAgICAgZHVtbXlOb2RlLmlubmVySFRNTCA9ICc8bGluayAvPic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGR1bW15Tm9kZS5pbm5lckhUTUwgPSAnPCcgKyBub2RlTmFtZSArICc+PC8nICsgbm9kZU5hbWUgKyAnPic7XG4gICAgfVxuICAgIHNob3VsZFdyYXBbbm9kZU5hbWVdID0gIWR1bW15Tm9kZS5maXJzdENoaWxkO1xuICB9XG4gIHJldHVybiBzaG91bGRXcmFwW25vZGVOYW1lXSA/IG1hcmt1cFdyYXBbbm9kZU5hbWVdIDogbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRNYXJrdXBXcmFwO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9mYmpzL2xpYi9nZXRNYXJrdXBXcmFwLmpzXG4vLyBtb2R1bGUgaWQgPSAyNjNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 264 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar DOMChildrenOperations = __webpack_require__(253);\nvar ReactDOMComponentTree = __webpack_require__(207);\n\n/**\n * Operations used to process updates to DOM nodes.\n */\nvar ReactDOMIDOperations = {\n\n  /**\n   * Updates a component's children by processing a series of updates.\n   *\n   * @param {array<object>} updates List of update configurations.\n   * @internal\n   */\n  dangerouslyProcessChildrenUpdates: function (parentInst, updates) {\n    var node = ReactDOMComponentTree.getNodeFromInstance(parentInst);\n    DOMChildrenOperations.processUpdates(node, updates);\n  }\n};\n\nmodule.exports = ReactDOMIDOperations;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NSURPcGVyYXRpb25zLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBET01DaGlsZHJlbk9wZXJhdGlvbnMgPSByZXF1aXJlKCcuL0RPTUNoaWxkcmVuT3BlcmF0aW9ucycpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG5cbi8qKlxuICogT3BlcmF0aW9ucyB1c2VkIHRvIHByb2Nlc3MgdXBkYXRlcyB0byBET00gbm9kZXMuXG4gKi9cbnZhciBSZWFjdERPTUlET3BlcmF0aW9ucyA9IHtcblxuICAvKipcbiAgICogVXBkYXRlcyBhIGNvbXBvbmVudCdzIGNoaWxkcmVuIGJ5IHByb2Nlc3NpbmcgYSBzZXJpZXMgb2YgdXBkYXRlcy5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheTxvYmplY3Q+fSB1cGRhdGVzIExpc3Qgb2YgdXBkYXRlIGNvbmZpZ3VyYXRpb25zLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGRhbmdlcm91c2x5UHJvY2Vzc0NoaWxkcmVuVXBkYXRlczogZnVuY3Rpb24gKHBhcmVudEluc3QsIHVwZGF0ZXMpIHtcbiAgICB2YXIgbm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHBhcmVudEluc3QpO1xuICAgIERPTUNoaWxkcmVuT3BlcmF0aW9ucy5wcm9jZXNzVXBkYXRlcyhub2RlLCB1cGRhdGVzKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUlET3BlcmF0aW9ucztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdERPTUlET3BlcmF0aW9ucy5qc1xuLy8gbW9kdWxlIGlkID0gMjY0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 265 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n/* global hasOwnProperty:true */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208),\n    _assign = __webpack_require__(176);\n\nvar AutoFocusUtils = __webpack_require__(266);\nvar CSSPropertyOperations = __webpack_require__(268);\nvar DOMLazyTree = __webpack_require__(254);\nvar DOMNamespaces = __webpack_require__(255);\nvar DOMProperty = __webpack_require__(209);\nvar DOMPropertyOperations = __webpack_require__(276);\nvar EventPluginHub = __webpack_require__(215);\nvar EventPluginRegistry = __webpack_require__(216);\nvar ReactBrowserEventEmitter = __webpack_require__(278);\nvar ReactDOMComponentFlags = __webpack_require__(210);\nvar ReactDOMComponentTree = __webpack_require__(207);\nvar ReactDOMInput = __webpack_require__(281);\nvar ReactDOMOption = __webpack_require__(284);\nvar ReactDOMSelect = __webpack_require__(285);\nvar ReactDOMTextarea = __webpack_require__(286);\nvar ReactInstrumentation = __webpack_require__(235);\nvar ReactMultiChild = __webpack_require__(287);\nvar ReactServerRenderingTransaction = __webpack_require__(306);\n\nvar emptyFunction = __webpack_require__(184);\nvar escapeTextContentForBrowser = __webpack_require__(259);\nvar invariant = __webpack_require__(180);\nvar isEventSupported = __webpack_require__(243);\nvar shallowEqual = __webpack_require__(296);\nvar validateDOMNesting = __webpack_require__(309);\nvar warning = __webpack_require__(183);\n\nvar Flags = ReactDOMComponentFlags;\nvar deleteListener = EventPluginHub.deleteListener;\nvar getNode = ReactDOMComponentTree.getNodeFromInstance;\nvar listenTo = ReactBrowserEventEmitter.listenTo;\nvar registrationNameModules = EventPluginRegistry.registrationNameModules;\n\n// For quickly matching children type, to test if can be treated as content.\nvar CONTENT_TYPES = { 'string': true, 'number': true };\n\nvar STYLE = 'style';\nvar HTML = '__html';\nvar RESERVED_PROPS = {\n  children: null,\n  dangerouslySetInnerHTML: null,\n  suppressContentEditableWarning: null\n};\n\n// Node type for document fragments (Node.DOCUMENT_FRAGMENT_NODE).\nvar DOC_FRAGMENT_TYPE = 11;\n\nfunction getDeclarationErrorAddendum(internalInstance) {\n  if (internalInstance) {\n    var owner = internalInstance._currentElement._owner || null;\n    if (owner) {\n      var name = owner.getName();\n      if (name) {\n        return ' This DOM node was rendered by `' + name + '`.';\n      }\n    }\n  }\n  return '';\n}\n\nfunction friendlyStringify(obj) {\n  if (typeof obj === 'object') {\n    if (Array.isArray(obj)) {\n      return '[' + obj.map(friendlyStringify).join(', ') + ']';\n    } else {\n      var pairs = [];\n      for (var key in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, key)) {\n          var keyEscaped = /^[a-z$_][\\w$_]*$/i.test(key) ? key : JSON.stringify(key);\n          pairs.push(keyEscaped + ': ' + friendlyStringify(obj[key]));\n        }\n      }\n      return '{' + pairs.join(', ') + '}';\n    }\n  } else if (typeof obj === 'string') {\n    return JSON.stringify(obj);\n  } else if (typeof obj === 'function') {\n    return '[function object]';\n  }\n  // Differs from JSON.stringify in that undefined because undefined and that\n  // inf and nan don't become null\n  return String(obj);\n}\n\nvar styleMutationWarning = {};\n\nfunction checkAndWarnForMutatedStyle(style1, style2, component) {\n  if (style1 == null || style2 == null) {\n    return;\n  }\n  if (shallowEqual(style1, style2)) {\n    return;\n  }\n\n  var componentName = component._tag;\n  var owner = component._currentElement._owner;\n  var ownerName;\n  if (owner) {\n    ownerName = owner.getName();\n  }\n\n  var hash = ownerName + '|' + componentName;\n\n  if (styleMutationWarning.hasOwnProperty(hash)) {\n    return;\n  }\n\n  styleMutationWarning[hash] = true;\n\n   true ? warning(false, '`%s` was passed a style object that has previously been mutated. ' + 'Mutating `style` is deprecated. Consider cloning it beforehand. Check ' + 'the `render` %s. Previous style: %s. Mutated style: %s.', componentName, owner ? 'of `' + ownerName + '`' : 'using <' + componentName + '>', friendlyStringify(style1), friendlyStringify(style2)) : void 0;\n}\n\n/**\n * @param {object} component\n * @param {?object} props\n */\nfunction assertValidProps(component, props) {\n  if (!props) {\n    return;\n  }\n  // Note the use of `==` which checks for null or undefined.\n  if (voidElementTags[component._tag]) {\n    !(props.children == null && props.dangerouslySetInnerHTML == null) ?  true ? invariant(false, '%s is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.%s', component._tag, component._currentElement._owner ? ' Check the render method of ' + component._currentElement._owner.getName() + '.' : '') : _prodInvariant('137', component._tag, component._currentElement._owner ? ' Check the render method of ' + component._currentElement._owner.getName() + '.' : '') : void 0;\n  }\n  if (props.dangerouslySetInnerHTML != null) {\n    !(props.children == null) ?  true ? invariant(false, 'Can only set one of `children` or `props.dangerouslySetInnerHTML`.') : _prodInvariant('60') : void 0;\n    !(typeof props.dangerouslySetInnerHTML === 'object' && HTML in props.dangerouslySetInnerHTML) ?  true ? invariant(false, '`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information.') : _prodInvariant('61') : void 0;\n  }\n  if (true) {\n     true ? warning(props.innerHTML == null, 'Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.') : void 0;\n     true ? warning(props.suppressContentEditableWarning || !props.contentEditable || props.children == null, 'A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.') : void 0;\n     true ? warning(props.onFocusIn == null && props.onFocusOut == null, 'React uses onFocus and onBlur instead of onFocusIn and onFocusOut. ' + 'All React events are normalized to bubble, so onFocusIn and onFocusOut ' + 'are not needed/supported by React.') : void 0;\n  }\n  !(props.style == null || typeof props.style === 'object') ?  true ? invariant(false, 'The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + \\'em\\'}} when using JSX.%s', getDeclarationErrorAddendum(component)) : _prodInvariant('62', getDeclarationErrorAddendum(component)) : void 0;\n}\n\nfunction enqueuePutListener(inst, registrationName, listener, transaction) {\n  if (transaction instanceof ReactServerRenderingTransaction) {\n    return;\n  }\n  if (true) {\n    // IE8 has no API for event capturing and the `onScroll` event doesn't\n    // bubble.\n     true ? warning(registrationName !== 'onScroll' || isEventSupported('scroll', true), 'This browser doesn\\'t support the `onScroll` event') : void 0;\n  }\n  var containerInfo = inst._hostContainerInfo;\n  var isDocumentFragment = containerInfo._node && containerInfo._node.nodeType === DOC_FRAGMENT_TYPE;\n  var doc = isDocumentFragment ? containerInfo._node : containerInfo._ownerDocument;\n  listenTo(registrationName, doc);\n  transaction.getReactMountReady().enqueue(putListener, {\n    inst: inst,\n    registrationName: registrationName,\n    listener: listener\n  });\n}\n\nfunction putListener() {\n  var listenerToPut = this;\n  EventPluginHub.putListener(listenerToPut.inst, listenerToPut.registrationName, listenerToPut.listener);\n}\n\nfunction inputPostMount() {\n  var inst = this;\n  ReactDOMInput.postMountWrapper(inst);\n}\n\nfunction textareaPostMount() {\n  var inst = this;\n  ReactDOMTextarea.postMountWrapper(inst);\n}\n\nfunction optionPostMount() {\n  var inst = this;\n  ReactDOMOption.postMountWrapper(inst);\n}\n\nvar setAndValidateContentChildDev = emptyFunction;\nif (true) {\n  setAndValidateContentChildDev = function (content) {\n    var hasExistingContent = this._contentDebugID != null;\n    var debugID = this._debugID;\n    // This ID represents the inlined child that has no backing instance:\n    var contentDebugID = -debugID;\n\n    if (content == null) {\n      if (hasExistingContent) {\n        ReactInstrumentation.debugTool.onUnmountComponent(this._contentDebugID);\n      }\n      this._contentDebugID = null;\n      return;\n    }\n\n    validateDOMNesting(null, String(content), this, this._ancestorInfo);\n    this._contentDebugID = contentDebugID;\n    if (hasExistingContent) {\n      ReactInstrumentation.debugTool.onBeforeUpdateComponent(contentDebugID, content);\n      ReactInstrumentation.debugTool.onUpdateComponent(contentDebugID);\n    } else {\n      ReactInstrumentation.debugTool.onBeforeMountComponent(contentDebugID, content, debugID);\n      ReactInstrumentation.debugTool.onMountComponent(contentDebugID);\n      ReactInstrumentation.debugTool.onSetChildren(debugID, [contentDebugID]);\n    }\n  };\n}\n\n// There are so many media events, it makes sense to just\n// maintain a list rather than create a `trapBubbledEvent` for each\nvar mediaEvents = {\n  topAbort: 'abort',\n  topCanPlay: 'canplay',\n  topCanPlayThrough: 'canplaythrough',\n  topDurationChange: 'durationchange',\n  topEmptied: 'emptied',\n  topEncrypted: 'encrypted',\n  topEnded: 'ended',\n  topError: 'error',\n  topLoadedData: 'loadeddata',\n  topLoadedMetadata: 'loadedmetadata',\n  topLoadStart: 'loadstart',\n  topPause: 'pause',\n  topPlay: 'play',\n  topPlaying: 'playing',\n  topProgress: 'progress',\n  topRateChange: 'ratechange',\n  topSeeked: 'seeked',\n  topSeeking: 'seeking',\n  topStalled: 'stalled',\n  topSuspend: 'suspend',\n  topTimeUpdate: 'timeupdate',\n  topVolumeChange: 'volumechange',\n  topWaiting: 'waiting'\n};\n\nfunction trapBubbledEventsLocal() {\n  var inst = this;\n  // If a component renders to null or if another component fatals and causes\n  // the state of the tree to be corrupted, `node` here can be null.\n  !inst._rootNodeID ?  true ? invariant(false, 'Must be mounted to trap events') : _prodInvariant('63') : void 0;\n  var node = getNode(inst);\n  !node ?  true ? invariant(false, 'trapBubbledEvent(...): Requires node to be rendered.') : _prodInvariant('64') : void 0;\n\n  switch (inst._tag) {\n    case 'iframe':\n    case 'object':\n      inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent('topLoad', 'load', node)];\n      break;\n    case 'video':\n    case 'audio':\n\n      inst._wrapperState.listeners = [];\n      // Create listener for each media event\n      for (var event in mediaEvents) {\n        if (mediaEvents.hasOwnProperty(event)) {\n          inst._wrapperState.listeners.push(ReactBrowserEventEmitter.trapBubbledEvent(event, mediaEvents[event], node));\n        }\n      }\n      break;\n    case 'source':\n      inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent('topError', 'error', node)];\n      break;\n    case 'img':\n      inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent('topError', 'error', node), ReactBrowserEventEmitter.trapBubbledEvent('topLoad', 'load', node)];\n      break;\n    case 'form':\n      inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent('topReset', 'reset', node), ReactBrowserEventEmitter.trapBubbledEvent('topSubmit', 'submit', node)];\n      break;\n    case 'input':\n    case 'select':\n    case 'textarea':\n      inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent('topInvalid', 'invalid', node)];\n      break;\n  }\n}\n\nfunction postUpdateSelectWrapper() {\n  ReactDOMSelect.postUpdateWrapper(this);\n}\n\n// For HTML, certain tags should omit their close tag. We keep a whitelist for\n// those special-case tags.\n\nvar omittedCloseTags = {\n  'area': true,\n  'base': true,\n  'br': true,\n  'col': true,\n  'embed': true,\n  'hr': true,\n  'img': true,\n  'input': true,\n  'keygen': true,\n  'link': true,\n  'meta': true,\n  'param': true,\n  'source': true,\n  'track': true,\n  'wbr': true\n};\n\nvar newlineEatingTags = {\n  'listing': true,\n  'pre': true,\n  'textarea': true\n};\n\n// For HTML, certain tags cannot have children. This has the same purpose as\n// `omittedCloseTags` except that `menuitem` should still have its closing tag.\n\nvar voidElementTags = _assign({\n  'menuitem': true\n}, omittedCloseTags);\n\n// We accept any tag to be rendered but since this gets injected into arbitrary\n// HTML, we want to make sure that it's a safe tag.\n// http://www.w3.org/TR/REC-xml/#NT-Name\n\nvar VALID_TAG_REGEX = /^[a-zA-Z][a-zA-Z:_\\.\\-\\d]*$/; // Simplified subset\nvar validatedTagCache = {};\nvar hasOwnProperty = {}.hasOwnProperty;\n\nfunction validateDangerousTag(tag) {\n  if (!hasOwnProperty.call(validatedTagCache, tag)) {\n    !VALID_TAG_REGEX.test(tag) ?  true ? invariant(false, 'Invalid tag: %s', tag) : _prodInvariant('65', tag) : void 0;\n    validatedTagCache[tag] = true;\n  }\n}\n\nfunction isCustomComponent(tagName, props) {\n  return tagName.indexOf('-') >= 0 || props.is != null;\n}\n\nvar globalIdCounter = 1;\n\n/**\n * Creates a new React class that is idempotent and capable of containing other\n * React components. It accepts event listeners and DOM properties that are\n * valid according to `DOMProperty`.\n *\n *  - Event listeners: `onClick`, `onMouseDown`, etc.\n *  - DOM properties: `className`, `name`, `title`, etc.\n *\n * The `style` property functions differently from the DOM API. It accepts an\n * object mapping of style properties to values.\n *\n * @constructor ReactDOMComponent\n * @extends ReactMultiChild\n */\nfunction ReactDOMComponent(element) {\n  var tag = element.type;\n  validateDangerousTag(tag);\n  this._currentElement = element;\n  this._tag = tag.toLowerCase();\n  this._namespaceURI = null;\n  this._renderedChildren = null;\n  this._previousStyle = null;\n  this._previousStyleCopy = null;\n  this._hostNode = null;\n  this._hostParent = null;\n  this._rootNodeID = 0;\n  this._domID = 0;\n  this._hostContainerInfo = null;\n  this._wrapperState = null;\n  this._topLevelWrapper = null;\n  this._flags = 0;\n  if (true) {\n    this._ancestorInfo = null;\n    setAndValidateContentChildDev.call(this, null);\n  }\n}\n\nReactDOMComponent.displayName = 'ReactDOMComponent';\n\nReactDOMComponent.Mixin = {\n\n  /**\n   * Generates root tag markup then recurses. This method has side effects and\n   * is not idempotent.\n   *\n   * @internal\n   * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n   * @param {?ReactDOMComponent} the parent component instance\n   * @param {?object} info about the host container\n   * @param {object} context\n   * @return {string} The computed markup.\n   */\n  mountComponent: function (transaction, hostParent, hostContainerInfo, context) {\n    this._rootNodeID = globalIdCounter++;\n    this._domID = hostContainerInfo._idCounter++;\n    this._hostParent = hostParent;\n    this._hostContainerInfo = hostContainerInfo;\n\n    var props = this._currentElement.props;\n\n    switch (this._tag) {\n      case 'audio':\n      case 'form':\n      case 'iframe':\n      case 'img':\n      case 'link':\n      case 'object':\n      case 'source':\n      case 'video':\n        this._wrapperState = {\n          listeners: null\n        };\n        transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this);\n        break;\n      case 'input':\n        ReactDOMInput.mountWrapper(this, props, hostParent);\n        props = ReactDOMInput.getHostProps(this, props);\n        transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this);\n        break;\n      case 'option':\n        ReactDOMOption.mountWrapper(this, props, hostParent);\n        props = ReactDOMOption.getHostProps(this, props);\n        break;\n      case 'select':\n        ReactDOMSelect.mountWrapper(this, props, hostParent);\n        props = ReactDOMSelect.getHostProps(this, props);\n        transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this);\n        break;\n      case 'textarea':\n        ReactDOMTextarea.mountWrapper(this, props, hostParent);\n        props = ReactDOMTextarea.getHostProps(this, props);\n        transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this);\n        break;\n    }\n\n    assertValidProps(this, props);\n\n    // We create tags in the namespace of their parent container, except HTML\n    // tags get no namespace.\n    var namespaceURI;\n    var parentTag;\n    if (hostParent != null) {\n      namespaceURI = hostParent._namespaceURI;\n      parentTag = hostParent._tag;\n    } else if (hostContainerInfo._tag) {\n      namespaceURI = hostContainerInfo._namespaceURI;\n      parentTag = hostContainerInfo._tag;\n    }\n    if (namespaceURI == null || namespaceURI === DOMNamespaces.svg && parentTag === 'foreignobject') {\n      namespaceURI = DOMNamespaces.html;\n    }\n    if (namespaceURI === DOMNamespaces.html) {\n      if (this._tag === 'svg') {\n        namespaceURI = DOMNamespaces.svg;\n      } else if (this._tag === 'math') {\n        namespaceURI = DOMNamespaces.mathml;\n      }\n    }\n    this._namespaceURI = namespaceURI;\n\n    if (true) {\n      var parentInfo;\n      if (hostParent != null) {\n        parentInfo = hostParent._ancestorInfo;\n      } else if (hostContainerInfo._tag) {\n        parentInfo = hostContainerInfo._ancestorInfo;\n      }\n      if (parentInfo) {\n        // parentInfo should always be present except for the top-level\n        // component when server rendering\n        validateDOMNesting(this._tag, null, this, parentInfo);\n      }\n      this._ancestorInfo = validateDOMNesting.updatedAncestorInfo(parentInfo, this._tag, this);\n    }\n\n    var mountImage;\n    if (transaction.useCreateElement) {\n      var ownerDocument = hostContainerInfo._ownerDocument;\n      var el;\n      if (namespaceURI === DOMNamespaces.html) {\n        if (this._tag === 'script') {\n          // Create the script via .innerHTML so its \"parser-inserted\" flag is\n          // set to true and it does not execute\n          var div = ownerDocument.createElement('div');\n          var type = this._currentElement.type;\n          div.innerHTML = '<' + type + '></' + type + '>';\n          el = div.removeChild(div.firstChild);\n        } else if (props.is) {\n          el = ownerDocument.createElement(this._currentElement.type, props.is);\n        } else {\n          // Separate else branch instead of using `props.is || undefined` above becuase of a Firefox bug.\n          // See discussion in https://github.com/facebook/react/pull/6896\n          // and discussion in https://bugzilla.mozilla.org/show_bug.cgi?id=1276240\n          el = ownerDocument.createElement(this._currentElement.type);\n        }\n      } else {\n        el = ownerDocument.createElementNS(namespaceURI, this._currentElement.type);\n      }\n      ReactDOMComponentTree.precacheNode(this, el);\n      this._flags |= Flags.hasCachedChildNodes;\n      if (!this._hostParent) {\n        DOMPropertyOperations.setAttributeForRoot(el);\n      }\n      this._updateDOMProperties(null, props, transaction);\n      var lazyTree = DOMLazyTree(el);\n      this._createInitialChildren(transaction, props, context, lazyTree);\n      mountImage = lazyTree;\n    } else {\n      var tagOpen = this._createOpenTagMarkupAndPutListeners(transaction, props);\n      var tagContent = this._createContentMarkup(transaction, props, context);\n      if (!tagContent && omittedCloseTags[this._tag]) {\n        mountImage = tagOpen + '/>';\n      } else {\n        mountImage = tagOpen + '>' + tagContent + '</' + this._currentElement.type + '>';\n      }\n    }\n\n    switch (this._tag) {\n      case 'input':\n        transaction.getReactMountReady().enqueue(inputPostMount, this);\n        if (props.autoFocus) {\n          transaction.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent, this);\n        }\n        break;\n      case 'textarea':\n        transaction.getReactMountReady().enqueue(textareaPostMount, this);\n        if (props.autoFocus) {\n          transaction.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent, this);\n        }\n        break;\n      case 'select':\n        if (props.autoFocus) {\n          transaction.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent, this);\n        }\n        break;\n      case 'button':\n        if (props.autoFocus) {\n          transaction.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent, this);\n        }\n        break;\n      case 'option':\n        transaction.getReactMountReady().enqueue(optionPostMount, this);\n        break;\n    }\n\n    return mountImage;\n  },\n\n  /**\n   * Creates markup for the open tag and all attributes.\n   *\n   * This method has side effects because events get registered.\n   *\n   * Iterating over object properties is faster than iterating over arrays.\n   * @see http://jsperf.com/obj-vs-arr-iteration\n   *\n   * @private\n   * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n   * @param {object} props\n   * @return {string} Markup of opening tag.\n   */\n  _createOpenTagMarkupAndPutListeners: function (transaction, props) {\n    var ret = '<' + this._currentElement.type;\n\n    for (var propKey in props) {\n      if (!props.hasOwnProperty(propKey)) {\n        continue;\n      }\n      var propValue = props[propKey];\n      if (propValue == null) {\n        continue;\n      }\n      if (registrationNameModules.hasOwnProperty(propKey)) {\n        if (propValue) {\n          enqueuePutListener(this, propKey, propValue, transaction);\n        }\n      } else {\n        if (propKey === STYLE) {\n          if (propValue) {\n            if (true) {\n              // See `_updateDOMProperties`. style block\n              this._previousStyle = propValue;\n            }\n            propValue = this._previousStyleCopy = _assign({}, props.style);\n          }\n          propValue = CSSPropertyOperations.createMarkupForStyles(propValue, this);\n        }\n        var markup = null;\n        if (this._tag != null && isCustomComponent(this._tag, props)) {\n          if (!RESERVED_PROPS.hasOwnProperty(propKey)) {\n            markup = DOMPropertyOperations.createMarkupForCustomAttribute(propKey, propValue);\n          }\n        } else {\n          markup = DOMPropertyOperations.createMarkupForProperty(propKey, propValue);\n        }\n        if (markup) {\n          ret += ' ' + markup;\n        }\n      }\n    }\n\n    // For static pages, no need to put React ID and checksum. Saves lots of\n    // bytes.\n    if (transaction.renderToStaticMarkup) {\n      return ret;\n    }\n\n    if (!this._hostParent) {\n      ret += ' ' + DOMPropertyOperations.createMarkupForRoot();\n    }\n    ret += ' ' + DOMPropertyOperations.createMarkupForID(this._domID);\n    return ret;\n  },\n\n  /**\n   * Creates markup for the content between the tags.\n   *\n   * @private\n   * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n   * @param {object} props\n   * @param {object} context\n   * @return {string} Content markup.\n   */\n  _createContentMarkup: function (transaction, props, context) {\n    var ret = '';\n\n    // Intentional use of != to avoid catching zero/false.\n    var innerHTML = props.dangerouslySetInnerHTML;\n    if (innerHTML != null) {\n      if (innerHTML.__html != null) {\n        ret = innerHTML.__html;\n      }\n    } else {\n      var contentToUse = CONTENT_TYPES[typeof props.children] ? props.children : null;\n      var childrenToUse = contentToUse != null ? null : props.children;\n      if (contentToUse != null) {\n        // TODO: Validate that text is allowed as a child of this node\n        ret = escapeTextContentForBrowser(contentToUse);\n        if (true) {\n          setAndValidateContentChildDev.call(this, contentToUse);\n        }\n      } else if (childrenToUse != null) {\n        var mountImages = this.mountChildren(childrenToUse, transaction, context);\n        ret = mountImages.join('');\n      }\n    }\n    if (newlineEatingTags[this._tag] && ret.charAt(0) === '\\n') {\n      // text/html ignores the first character in these tags if it's a newline\n      // Prefer to break application/xml over text/html (for now) by adding\n      // a newline specifically to get eaten by the parser. (Alternately for\n      // textareas, replacing \"^\\n\" with \"\\r\\n\" doesn't get eaten, and the first\n      // \\r is normalized out by HTMLTextAreaElement#value.)\n      // See: <http://www.w3.org/TR/html-polyglot/#newlines-in-textarea-and-pre>\n      // See: <http://www.w3.org/TR/html5/syntax.html#element-restrictions>\n      // See: <http://www.w3.org/TR/html5/syntax.html#newlines>\n      // See: Parsing of \"textarea\" \"listing\" and \"pre\" elements\n      //  from <http://www.w3.org/TR/html5/syntax.html#parsing-main-inbody>\n      return '\\n' + ret;\n    } else {\n      return ret;\n    }\n  },\n\n  _createInitialChildren: function (transaction, props, context, lazyTree) {\n    // Intentional use of != to avoid catching zero/false.\n    var innerHTML = props.dangerouslySetInnerHTML;\n    if (innerHTML != null) {\n      if (innerHTML.__html != null) {\n        DOMLazyTree.queueHTML(lazyTree, innerHTML.__html);\n      }\n    } else {\n      var contentToUse = CONTENT_TYPES[typeof props.children] ? props.children : null;\n      var childrenToUse = contentToUse != null ? null : props.children;\n      // TODO: Validate that text is allowed as a child of this node\n      if (contentToUse != null) {\n        // Avoid setting textContent when the text is empty. In IE11 setting\n        // textContent on a text area will cause the placeholder to not\n        // show within the textarea until it has been focused and blurred again.\n        // https://github.com/facebook/react/issues/6731#issuecomment-254874553\n        if (contentToUse !== '') {\n          if (true) {\n            setAndValidateContentChildDev.call(this, contentToUse);\n          }\n          DOMLazyTree.queueText(lazyTree, contentToUse);\n        }\n      } else if (childrenToUse != null) {\n        var mountImages = this.mountChildren(childrenToUse, transaction, context);\n        for (var i = 0; i < mountImages.length; i++) {\n          DOMLazyTree.queueChild(lazyTree, mountImages[i]);\n        }\n      }\n    }\n  },\n\n  /**\n   * Receives a next element and updates the component.\n   *\n   * @internal\n   * @param {ReactElement} nextElement\n   * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n   * @param {object} context\n   */\n  receiveComponent: function (nextElement, transaction, context) {\n    var prevElement = this._currentElement;\n    this._currentElement = nextElement;\n    this.updateComponent(transaction, prevElement, nextElement, context);\n  },\n\n  /**\n   * Updates a DOM component after it has already been allocated and\n   * attached to the DOM. Reconciles the root DOM node, then recurses.\n   *\n   * @param {ReactReconcileTransaction} transaction\n   * @param {ReactElement} prevElement\n   * @param {ReactElement} nextElement\n   * @internal\n   * @overridable\n   */\n  updateComponent: function (transaction, prevElement, nextElement, context) {\n    var lastProps = prevElement.props;\n    var nextProps = this._currentElement.props;\n\n    switch (this._tag) {\n      case 'input':\n        lastProps = ReactDOMInput.getHostProps(this, lastProps);\n        nextProps = ReactDOMInput.getHostProps(this, nextProps);\n        break;\n      case 'option':\n        lastProps = ReactDOMOption.getHostProps(this, lastProps);\n        nextProps = ReactDOMOption.getHostProps(this, nextProps);\n        break;\n      case 'select':\n        lastProps = ReactDOMSelect.getHostProps(this, lastProps);\n        nextProps = ReactDOMSelect.getHostProps(this, nextProps);\n        break;\n      case 'textarea':\n        lastProps = ReactDOMTextarea.getHostProps(this, lastProps);\n        nextProps = ReactDOMTextarea.getHostProps(this, nextProps);\n        break;\n    }\n\n    assertValidProps(this, nextProps);\n    this._updateDOMProperties(lastProps, nextProps, transaction);\n    this._updateDOMChildren(lastProps, nextProps, transaction, context);\n\n    switch (this._tag) {\n      case 'input':\n        // Update the wrapper around inputs *after* updating props. This has to\n        // happen after `_updateDOMProperties`. Otherwise HTML5 input validations\n        // raise warnings and prevent the new value from being assigned.\n        ReactDOMInput.updateWrapper(this);\n        break;\n      case 'textarea':\n        ReactDOMTextarea.updateWrapper(this);\n        break;\n      case 'select':\n        // <select> value update needs to occur after <option> children\n        // reconciliation\n        transaction.getReactMountReady().enqueue(postUpdateSelectWrapper, this);\n        break;\n    }\n  },\n\n  /**\n   * Reconciles the properties by detecting differences in property values and\n   * updating the DOM as necessary. This function is probably the single most\n   * critical path for performance optimization.\n   *\n   * TODO: Benchmark whether checking for changed values in memory actually\n   *       improves performance (especially statically positioned elements).\n   * TODO: Benchmark the effects of putting this at the top since 99% of props\n   *       do not change for a given reconciliation.\n   * TODO: Benchmark areas that can be improved with caching.\n   *\n   * @private\n   * @param {object} lastProps\n   * @param {object} nextProps\n   * @param {?DOMElement} node\n   */\n  _updateDOMProperties: function (lastProps, nextProps, transaction) {\n    var propKey;\n    var styleName;\n    var styleUpdates;\n    for (propKey in lastProps) {\n      if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) {\n        continue;\n      }\n      if (propKey === STYLE) {\n        var lastStyle = this._previousStyleCopy;\n        for (styleName in lastStyle) {\n          if (lastStyle.hasOwnProperty(styleName)) {\n            styleUpdates = styleUpdates || {};\n            styleUpdates[styleName] = '';\n          }\n        }\n        this._previousStyleCopy = null;\n      } else if (registrationNameModules.hasOwnProperty(propKey)) {\n        if (lastProps[propKey]) {\n          // Only call deleteListener if there was a listener previously or\n          // else willDeleteListener gets called when there wasn't actually a\n          // listener (e.g., onClick={null})\n          deleteListener(this, propKey);\n        }\n      } else if (isCustomComponent(this._tag, lastProps)) {\n        if (!RESERVED_PROPS.hasOwnProperty(propKey)) {\n          DOMPropertyOperations.deleteValueForAttribute(getNode(this), propKey);\n        }\n      } else if (DOMProperty.properties[propKey] || DOMProperty.isCustomAttribute(propKey)) {\n        DOMPropertyOperations.deleteValueForProperty(getNode(this), propKey);\n      }\n    }\n    for (propKey in nextProps) {\n      var nextProp = nextProps[propKey];\n      var lastProp = propKey === STYLE ? this._previousStyleCopy : lastProps != null ? lastProps[propKey] : undefined;\n      if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) {\n        continue;\n      }\n      if (propKey === STYLE) {\n        if (nextProp) {\n          if (true) {\n            checkAndWarnForMutatedStyle(this._previousStyleCopy, this._previousStyle, this);\n            this._previousStyle = nextProp;\n          }\n          nextProp = this._previousStyleCopy = _assign({}, nextProp);\n        } else {\n          this._previousStyleCopy = null;\n        }\n        if (lastProp) {\n          // Unset styles on `lastProp` but not on `nextProp`.\n          for (styleName in lastProp) {\n            if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) {\n              styleUpdates = styleUpdates || {};\n              styleUpdates[styleName] = '';\n            }\n          }\n          // Update styles that changed since `lastProp`.\n          for (styleName in nextProp) {\n            if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) {\n              styleUpdates = styleUpdates || {};\n              styleUpdates[styleName] = nextProp[styleName];\n            }\n          }\n        } else {\n          // Relies on `updateStylesByID` not mutating `styleUpdates`.\n          styleUpdates = nextProp;\n        }\n      } else if (registrationNameModules.hasOwnProperty(propKey)) {\n        if (nextProp) {\n          enqueuePutListener(this, propKey, nextProp, transaction);\n        } else if (lastProp) {\n          deleteListener(this, propKey);\n        }\n      } else if (isCustomComponent(this._tag, nextProps)) {\n        if (!RESERVED_PROPS.hasOwnProperty(propKey)) {\n          DOMPropertyOperations.setValueForAttribute(getNode(this), propKey, nextProp);\n        }\n      } else if (DOMProperty.properties[propKey] || DOMProperty.isCustomAttribute(propKey)) {\n        var node = getNode(this);\n        // If we're updating to null or undefined, we should remove the property\n        // from the DOM node instead of inadvertently setting to a string. This\n        // brings us in line with the same behavior we have on initial render.\n        if (nextProp != null) {\n          DOMPropertyOperations.setValueForProperty(node, propKey, nextProp);\n        } else {\n          DOMPropertyOperations.deleteValueForProperty(node, propKey);\n        }\n      }\n    }\n    if (styleUpdates) {\n      CSSPropertyOperations.setValueForStyles(getNode(this), styleUpdates, this);\n    }\n  },\n\n  /**\n   * Reconciles the children with the various properties that affect the\n   * children content.\n   *\n   * @param {object} lastProps\n   * @param {object} nextProps\n   * @param {ReactReconcileTransaction} transaction\n   * @param {object} context\n   */\n  _updateDOMChildren: function (lastProps, nextProps, transaction, context) {\n    var lastContent = CONTENT_TYPES[typeof lastProps.children] ? lastProps.children : null;\n    var nextContent = CONTENT_TYPES[typeof nextProps.children] ? nextProps.children : null;\n\n    var lastHtml = lastProps.dangerouslySetInnerHTML && lastProps.dangerouslySetInnerHTML.__html;\n    var nextHtml = nextProps.dangerouslySetInnerHTML && nextProps.dangerouslySetInnerHTML.__html;\n\n    // Note the use of `!=` which checks for null or undefined.\n    var lastChildren = lastContent != null ? null : lastProps.children;\n    var nextChildren = nextContent != null ? null : nextProps.children;\n\n    // If we're switching from children to content/html or vice versa, remove\n    // the old content\n    var lastHasContentOrHtml = lastContent != null || lastHtml != null;\n    var nextHasContentOrHtml = nextContent != null || nextHtml != null;\n    if (lastChildren != null && nextChildren == null) {\n      this.updateChildren(null, transaction, context);\n    } else if (lastHasContentOrHtml && !nextHasContentOrHtml) {\n      this.updateTextContent('');\n      if (true) {\n        ReactInstrumentation.debugTool.onSetChildren(this._debugID, []);\n      }\n    }\n\n    if (nextContent != null) {\n      if (lastContent !== nextContent) {\n        this.updateTextContent('' + nextContent);\n        if (true) {\n          setAndValidateContentChildDev.call(this, nextContent);\n        }\n      }\n    } else if (nextHtml != null) {\n      if (lastHtml !== nextHtml) {\n        this.updateMarkup('' + nextHtml);\n      }\n      if (true) {\n        ReactInstrumentation.debugTool.onSetChildren(this._debugID, []);\n      }\n    } else if (nextChildren != null) {\n      if (true) {\n        setAndValidateContentChildDev.call(this, null);\n      }\n\n      this.updateChildren(nextChildren, transaction, context);\n    }\n  },\n\n  getHostNode: function () {\n    return getNode(this);\n  },\n\n  /**\n   * Destroys all event registrations for this instance. Does not remove from\n   * the DOM. That must be done by the parent.\n   *\n   * @internal\n   */\n  unmountComponent: function (safely) {\n    switch (this._tag) {\n      case 'audio':\n      case 'form':\n      case 'iframe':\n      case 'img':\n      case 'link':\n      case 'object':\n      case 'source':\n      case 'video':\n        var listeners = this._wrapperState.listeners;\n        if (listeners) {\n          for (var i = 0; i < listeners.length; i++) {\n            listeners[i].remove();\n          }\n        }\n        break;\n      case 'html':\n      case 'head':\n      case 'body':\n        /**\n         * Components like <html> <head> and <body> can't be removed or added\n         * easily in a cross-browser way, however it's valuable to be able to\n         * take advantage of React's reconciliation for styling and <title>\n         * management. So we just document it and throw in dangerous cases.\n         */\n         true ?  true ? invariant(false, '<%s> tried to unmount. Because of cross-browser quirks it is impossible to unmount some top-level components (eg <html>, <head>, and <body>) reliably and efficiently. To fix this, have a single top-level component that never unmounts render these elements.', this._tag) : _prodInvariant('66', this._tag) : void 0;\n        break;\n    }\n\n    this.unmountChildren(safely);\n    ReactDOMComponentTree.uncacheNode(this);\n    EventPluginHub.deleteAllListeners(this);\n    this._rootNodeID = 0;\n    this._domID = 0;\n    this._wrapperState = null;\n\n    if (true) {\n      setAndValidateContentChildDev.call(this, null);\n    }\n  },\n\n  getPublicInstance: function () {\n    return getNode(this);\n  }\n\n};\n\n_assign(ReactDOMComponent.prototype, ReactDOMComponent.Mixin, ReactMultiChild.Mixin);\n\nmodule.exports = ReactDOMComponent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NQ29tcG9uZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4vKiBnbG9iYWwgaGFzT3duUHJvcGVydHk6dHJ1ZSAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50JyksXG4gICAgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIEF1dG9Gb2N1c1V0aWxzID0gcmVxdWlyZSgnLi9BdXRvRm9jdXNVdGlscycpO1xudmFyIENTU1Byb3BlcnR5T3BlcmF0aW9ucyA9IHJlcXVpcmUoJy4vQ1NTUHJvcGVydHlPcGVyYXRpb25zJyk7XG52YXIgRE9NTGF6eVRyZWUgPSByZXF1aXJlKCcuL0RPTUxhenlUcmVlJyk7XG52YXIgRE9NTmFtZXNwYWNlcyA9IHJlcXVpcmUoJy4vRE9NTmFtZXNwYWNlcycpO1xudmFyIERPTVByb3BlcnR5ID0gcmVxdWlyZSgnLi9ET01Qcm9wZXJ0eScpO1xudmFyIERPTVByb3BlcnR5T3BlcmF0aW9ucyA9IHJlcXVpcmUoJy4vRE9NUHJvcGVydHlPcGVyYXRpb25zJyk7XG52YXIgRXZlbnRQbHVnaW5IdWIgPSByZXF1aXJlKCcuL0V2ZW50UGx1Z2luSHViJyk7XG52YXIgRXZlbnRQbHVnaW5SZWdpc3RyeSA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5SZWdpc3RyeScpO1xudmFyIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJy4vUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRGbGFncyA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRGbGFncycpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RET01JbnB1dCA9IHJlcXVpcmUoJy4vUmVhY3RET01JbnB1dCcpO1xudmFyIFJlYWN0RE9NT3B0aW9uID0gcmVxdWlyZSgnLi9SZWFjdERPTU9wdGlvbicpO1xudmFyIFJlYWN0RE9NU2VsZWN0ID0gcmVxdWlyZSgnLi9SZWFjdERPTVNlbGVjdCcpO1xudmFyIFJlYWN0RE9NVGV4dGFyZWEgPSByZXF1aXJlKCcuL1JlYWN0RE9NVGV4dGFyZWEnKTtcbnZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0cnVtZW50YXRpb24nKTtcbnZhciBSZWFjdE11bHRpQ2hpbGQgPSByZXF1aXJlKCcuL1JlYWN0TXVsdGlDaGlsZCcpO1xudmFyIFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24gPSByZXF1aXJlKCcuL1JlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24nKTtcblxudmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eUZ1bmN0aW9uJyk7XG52YXIgZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyID0gcmVxdWlyZSgnLi9lc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXInKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciBpc0V2ZW50U3VwcG9ydGVkID0gcmVxdWlyZSgnLi9pc0V2ZW50U3VwcG9ydGVkJyk7XG52YXIgc2hhbGxvd0VxdWFsID0gcmVxdWlyZSgnZmJqcy9saWIvc2hhbGxvd0VxdWFsJyk7XG52YXIgdmFsaWRhdGVET01OZXN0aW5nID0gcmVxdWlyZSgnLi92YWxpZGF0ZURPTU5lc3RpbmcnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgRmxhZ3MgPSBSZWFjdERPTUNvbXBvbmVudEZsYWdzO1xudmFyIGRlbGV0ZUxpc3RlbmVyID0gRXZlbnRQbHVnaW5IdWIuZGVsZXRlTGlzdGVuZXI7XG52YXIgZ2V0Tm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlO1xudmFyIGxpc3RlblRvID0gUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLmxpc3RlblRvO1xudmFyIHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzID0gRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlcztcblxuLy8gRm9yIHF1aWNrbHkgbWF0Y2hpbmcgY2hpbGRyZW4gdHlwZSwgdG8gdGVzdCBpZiBjYW4gYmUgdHJlYXRlZCBhcyBjb250ZW50LlxudmFyIENPTlRFTlRfVFlQRVMgPSB7ICdzdHJpbmcnOiB0cnVlLCAnbnVtYmVyJzogdHJ1ZSB9O1xuXG52YXIgU1RZTEUgPSAnc3R5bGUnO1xudmFyIEhUTUwgPSAnX19odG1sJztcbnZhciBSRVNFUlZFRF9QUk9QUyA9IHtcbiAgY2hpbGRyZW46IG51bGwsXG4gIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiBudWxsLFxuICBzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmc6IG51bGxcbn07XG5cbi8vIE5vZGUgdHlwZSBmb3IgZG9jdW1lbnQgZnJhZ21lbnRzIChOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpLlxudmFyIERPQ19GUkFHTUVOVF9UWVBFID0gMTE7XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShpbnRlcm5hbEluc3RhbmNlKSB7XG4gIGlmIChpbnRlcm5hbEluc3RhbmNlKSB7XG4gICAgdmFyIG93bmVyID0gaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQuX293bmVyIHx8IG51bGw7XG4gICAgaWYgKG93bmVyKSB7XG4gICAgICB2YXIgbmFtZSA9IG93bmVyLmdldE5hbWUoKTtcbiAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgIHJldHVybiAnIFRoaXMgRE9NIG5vZGUgd2FzIHJlbmRlcmVkIGJ5IGAnICsgbmFtZSArICdgLic7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZnJpZW5kbHlTdHJpbmdpZnkob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIHJldHVybiAnWycgKyBvYmoubWFwKGZyaWVuZGx5U3RyaW5naWZ5KS5qb2luKCcsICcpICsgJ10nO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcGFpcnMgPSBbXTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICB2YXIga2V5RXNjYXBlZCA9IC9eW2EteiRfXVtcXHckX10qJC9pLnRlc3Qoa2V5KSA/IGtleSA6IEpTT04uc3RyaW5naWZ5KGtleSk7XG4gICAgICAgICAgcGFpcnMucHVzaChrZXlFc2NhcGVkICsgJzogJyArIGZyaWVuZGx5U3RyaW5naWZ5KG9ialtrZXldKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAneycgKyBwYWlycy5qb2luKCcsICcpICsgJ30nO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmopO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gJ1tmdW5jdGlvbiBvYmplY3RdJztcbiAgfVxuICAvLyBEaWZmZXJzIGZyb20gSlNPTi5zdHJpbmdpZnkgaW4gdGhhdCB1bmRlZmluZWQgYmVjYXVzZSB1bmRlZmluZWQgYW5kIHRoYXRcbiAgLy8gaW5mIGFuZCBuYW4gZG9uJ3QgYmVjb21lIG51bGxcbiAgcmV0dXJuIFN0cmluZyhvYmopO1xufVxuXG52YXIgc3R5bGVNdXRhdGlvbldhcm5pbmcgPSB7fTtcblxuZnVuY3Rpb24gY2hlY2tBbmRXYXJuRm9yTXV0YXRlZFN0eWxlKHN0eWxlMSwgc3R5bGUyLCBjb21wb25lbnQpIHtcbiAgaWYgKHN0eWxlMSA9PSBudWxsIHx8IHN0eWxlMiA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChzaGFsbG93RXF1YWwoc3R5bGUxLCBzdHlsZTIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnQuX3RhZztcbiAgdmFyIG93bmVyID0gY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5fb3duZXI7XG4gIHZhciBvd25lck5hbWU7XG4gIGlmIChvd25lcikge1xuICAgIG93bmVyTmFtZSA9IG93bmVyLmdldE5hbWUoKTtcbiAgfVxuXG4gIHZhciBoYXNoID0gb3duZXJOYW1lICsgJ3wnICsgY29tcG9uZW50TmFtZTtcblxuICBpZiAoc3R5bGVNdXRhdGlvbldhcm5pbmcuaGFzT3duUHJvcGVydHkoaGFzaCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdHlsZU11dGF0aW9uV2FybmluZ1toYXNoXSA9IHRydWU7XG5cbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdgJXNgIHdhcyBwYXNzZWQgYSBzdHlsZSBvYmplY3QgdGhhdCBoYXMgcHJldmlvdXNseSBiZWVuIG11dGF0ZWQuICcgKyAnTXV0YXRpbmcgYHN0eWxlYCBpcyBkZXByZWNhdGVkLiBDb25zaWRlciBjbG9uaW5nIGl0IGJlZm9yZWhhbmQuIENoZWNrICcgKyAndGhlIGByZW5kZXJgICVzLiBQcmV2aW91cyBzdHlsZTogJXMuIE11dGF0ZWQgc3R5bGU6ICVzLicsIGNvbXBvbmVudE5hbWUsIG93bmVyID8gJ29mIGAnICsgb3duZXJOYW1lICsgJ2AnIDogJ3VzaW5nIDwnICsgY29tcG9uZW50TmFtZSArICc+JywgZnJpZW5kbHlTdHJpbmdpZnkoc3R5bGUxKSwgZnJpZW5kbHlTdHJpbmdpZnkoc3R5bGUyKSkgOiB2b2lkIDA7XG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGNvbXBvbmVudFxuICogQHBhcmFtIHs/b2JqZWN0fSBwcm9wc1xuICovXG5mdW5jdGlvbiBhc3NlcnRWYWxpZFByb3BzKGNvbXBvbmVudCwgcHJvcHMpIHtcbiAgaWYgKCFwcm9wcykge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBOb3RlIHRoZSB1c2Ugb2YgYD09YCB3aGljaCBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkLlxuICBpZiAodm9pZEVsZW1lbnRUYWdzW2NvbXBvbmVudC5fdGFnXSkge1xuICAgICEocHJvcHMuY2hpbGRyZW4gPT0gbnVsbCAmJiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICclcyBpcyBhIHZvaWQgZWxlbWVudCB0YWcgYW5kIG11c3QgbmVpdGhlciBoYXZlIGBjaGlsZHJlbmAgbm9yIHVzZSBgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLiVzJywgY29tcG9uZW50Ll90YWcsIGNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQuX293bmVyID8gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiAnICsgY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5fb3duZXIuZ2V0TmFtZSgpICsgJy4nIDogJycpIDogX3Byb2RJbnZhcmlhbnQoJzEzNycsIGNvbXBvbmVudC5fdGFnLCBjb21wb25lbnQuX2N1cnJlbnRFbGVtZW50Ll9vd25lciA/ICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgJyArIGNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQuX293bmVyLmdldE5hbWUoKSArICcuJyA6ICcnKSA6IHZvaWQgMDtcbiAgfVxuICBpZiAocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgICEocHJvcHMuY2hpbGRyZW4gPT0gbnVsbCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnQ2FuIG9ubHkgc2V0IG9uZSBvZiBgY2hpbGRyZW5gIG9yIGBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAuJykgOiBfcHJvZEludmFyaWFudCgnNjAnKSA6IHZvaWQgMDtcbiAgICAhKHR5cGVvZiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PT0gJ29iamVjdCcgJiYgSFRNTCBpbiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnYHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYCBtdXN0IGJlIGluIHRoZSBmb3JtIGB7X19odG1sOiAuLi59YC4gUGxlYXNlIHZpc2l0IGh0dHBzOi8vZmIubWUvcmVhY3QtaW52YXJpYW50LWRhbmdlcm91c2x5LXNldC1pbm5lci1odG1sIGZvciBtb3JlIGluZm9ybWF0aW9uLicpIDogX3Byb2RJbnZhcmlhbnQoJzYxJykgOiB2b2lkIDA7XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhwcm9wcy5pbm5lckhUTUwgPT0gbnVsbCwgJ0RpcmVjdGx5IHNldHRpbmcgcHJvcGVydHkgYGlubmVySFRNTGAgaXMgbm90IHBlcm1pdHRlZC4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgbG9va3VwIGRvY3VtZW50YXRpb24gb24gYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKSA6IHZvaWQgMDtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhwcm9wcy5zdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgfHwgIXByb3BzLmNvbnRlbnRFZGl0YWJsZSB8fCBwcm9wcy5jaGlsZHJlbiA9PSBudWxsLCAnQSBjb21wb25lbnQgaXMgYGNvbnRlbnRFZGl0YWJsZWAgYW5kIGNvbnRhaW5zIGBjaGlsZHJlbmAgbWFuYWdlZCBieSAnICsgJ1JlYWN0LiBJdCBpcyBub3cgeW91ciByZXNwb25zaWJpbGl0eSB0byBndWFyYW50ZWUgdGhhdCBub25lIG9mICcgKyAndGhvc2Ugbm9kZXMgYXJlIHVuZXhwZWN0ZWRseSBtb2RpZmllZCBvciBkdXBsaWNhdGVkLiBUaGlzIGlzICcgKyAncHJvYmFibHkgbm90IGludGVudGlvbmFsLicpIDogdm9pZCAwO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHByb3BzLm9uRm9jdXNJbiA9PSBudWxsICYmIHByb3BzLm9uRm9jdXNPdXQgPT0gbnVsbCwgJ1JlYWN0IHVzZXMgb25Gb2N1cyBhbmQgb25CbHVyIGluc3RlYWQgb2Ygb25Gb2N1c0luIGFuZCBvbkZvY3VzT3V0LiAnICsgJ0FsbCBSZWFjdCBldmVudHMgYXJlIG5vcm1hbGl6ZWQgdG8gYnViYmxlLCBzbyBvbkZvY3VzSW4gYW5kIG9uRm9jdXNPdXQgJyArICdhcmUgbm90IG5lZWRlZC9zdXBwb3J0ZWQgYnkgUmVhY3QuJykgOiB2b2lkIDA7XG4gIH1cbiAgIShwcm9wcy5zdHlsZSA9PSBudWxsIHx8IHR5cGVvZiBwcm9wcy5zdHlsZSA9PT0gJ29iamVjdCcpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1RoZSBgc3R5bGVgIHByb3AgZXhwZWN0cyBhIG1hcHBpbmcgZnJvbSBzdHlsZSBwcm9wZXJ0aWVzIHRvIHZhbHVlcywgbm90IGEgc3RyaW5nLiBGb3IgZXhhbXBsZSwgc3R5bGU9e3ttYXJnaW5SaWdodDogc3BhY2luZyArIFxcJ2VtXFwnfX0gd2hlbiB1c2luZyBKU1guJXMnLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oY29tcG9uZW50KSkgOiBfcHJvZEludmFyaWFudCgnNjInLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oY29tcG9uZW50KSkgOiB2b2lkIDA7XG59XG5cbmZ1bmN0aW9uIGVucXVldWVQdXRMaXN0ZW5lcihpbnN0LCByZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lciwgdHJhbnNhY3Rpb24pIHtcbiAgaWYgKHRyYW5zYWN0aW9uIGluc3RhbmNlb2YgUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIC8vIElFOCBoYXMgbm8gQVBJIGZvciBldmVudCBjYXB0dXJpbmcgYW5kIHRoZSBgb25TY3JvbGxgIGV2ZW50IGRvZXNuJ3RcbiAgICAvLyBidWJibGUuXG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcocmVnaXN0cmF0aW9uTmFtZSAhPT0gJ29uU2Nyb2xsJyB8fCBpc0V2ZW50U3VwcG9ydGVkKCdzY3JvbGwnLCB0cnVlKSwgJ1RoaXMgYnJvd3NlciBkb2VzblxcJ3Qgc3VwcG9ydCB0aGUgYG9uU2Nyb2xsYCBldmVudCcpIDogdm9pZCAwO1xuICB9XG4gIHZhciBjb250YWluZXJJbmZvID0gaW5zdC5faG9zdENvbnRhaW5lckluZm87XG4gIHZhciBpc0RvY3VtZW50RnJhZ21lbnQgPSBjb250YWluZXJJbmZvLl9ub2RlICYmIGNvbnRhaW5lckluZm8uX25vZGUubm9kZVR5cGUgPT09IERPQ19GUkFHTUVOVF9UWVBFO1xuICB2YXIgZG9jID0gaXNEb2N1bWVudEZyYWdtZW50ID8gY29udGFpbmVySW5mby5fbm9kZSA6IGNvbnRhaW5lckluZm8uX293bmVyRG9jdW1lbnQ7XG4gIGxpc3RlblRvKHJlZ2lzdHJhdGlvbk5hbWUsIGRvYyk7XG4gIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUocHV0TGlzdGVuZXIsIHtcbiAgICBpbnN0OiBpbnN0LFxuICAgIHJlZ2lzdHJhdGlvbk5hbWU6IHJlZ2lzdHJhdGlvbk5hbWUsXG4gICAgbGlzdGVuZXI6IGxpc3RlbmVyXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwdXRMaXN0ZW5lcigpIHtcbiAgdmFyIGxpc3RlbmVyVG9QdXQgPSB0aGlzO1xuICBFdmVudFBsdWdpbkh1Yi5wdXRMaXN0ZW5lcihsaXN0ZW5lclRvUHV0Lmluc3QsIGxpc3RlbmVyVG9QdXQucmVnaXN0cmF0aW9uTmFtZSwgbGlzdGVuZXJUb1B1dC5saXN0ZW5lcik7XG59XG5cbmZ1bmN0aW9uIGlucHV0UG9zdE1vdW50KCkge1xuICB2YXIgaW5zdCA9IHRoaXM7XG4gIFJlYWN0RE9NSW5wdXQucG9zdE1vdW50V3JhcHBlcihpbnN0KTtcbn1cblxuZnVuY3Rpb24gdGV4dGFyZWFQb3N0TW91bnQoKSB7XG4gIHZhciBpbnN0ID0gdGhpcztcbiAgUmVhY3RET01UZXh0YXJlYS5wb3N0TW91bnRXcmFwcGVyKGluc3QpO1xufVxuXG5mdW5jdGlvbiBvcHRpb25Qb3N0TW91bnQoKSB7XG4gIHZhciBpbnN0ID0gdGhpcztcbiAgUmVhY3RET01PcHRpb24ucG9zdE1vdW50V3JhcHBlcihpbnN0KTtcbn1cblxudmFyIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2ID0gZW1wdHlGdW5jdGlvbjtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2ID0gZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgICB2YXIgaGFzRXhpc3RpbmdDb250ZW50ID0gdGhpcy5fY29udGVudERlYnVnSUQgIT0gbnVsbDtcbiAgICB2YXIgZGVidWdJRCA9IHRoaXMuX2RlYnVnSUQ7XG4gICAgLy8gVGhpcyBJRCByZXByZXNlbnRzIHRoZSBpbmxpbmVkIGNoaWxkIHRoYXQgaGFzIG5vIGJhY2tpbmcgaW5zdGFuY2U6XG4gICAgdmFyIGNvbnRlbnREZWJ1Z0lEID0gLWRlYnVnSUQ7XG5cbiAgICBpZiAoY29udGVudCA9PSBudWxsKSB7XG4gICAgICBpZiAoaGFzRXhpc3RpbmdDb250ZW50KSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblVubW91bnRDb21wb25lbnQodGhpcy5fY29udGVudERlYnVnSUQpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY29udGVudERlYnVnSUQgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBTdHJpbmcoY29udGVudCksIHRoaXMsIHRoaXMuX2FuY2VzdG9ySW5mbyk7XG4gICAgdGhpcy5fY29udGVudERlYnVnSUQgPSBjb250ZW50RGVidWdJRDtcbiAgICBpZiAoaGFzRXhpc3RpbmdDb250ZW50KSB7XG4gICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWZvcmVVcGRhdGVDb21wb25lbnQoY29udGVudERlYnVnSUQsIGNvbnRlbnQpO1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uVXBkYXRlQ29tcG9uZW50KGNvbnRlbnREZWJ1Z0lEKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVmb3JlTW91bnRDb21wb25lbnQoY29udGVudERlYnVnSUQsIGNvbnRlbnQsIGRlYnVnSUQpO1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uTW91bnRDb21wb25lbnQoY29udGVudERlYnVnSUQpO1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uU2V0Q2hpbGRyZW4oZGVidWdJRCwgW2NvbnRlbnREZWJ1Z0lEXSk7XG4gICAgfVxuICB9O1xufVxuXG4vLyBUaGVyZSBhcmUgc28gbWFueSBtZWRpYSBldmVudHMsIGl0IG1ha2VzIHNlbnNlIHRvIGp1c3Rcbi8vIG1haW50YWluIGEgbGlzdCByYXRoZXIgdGhhbiBjcmVhdGUgYSBgdHJhcEJ1YmJsZWRFdmVudGAgZm9yIGVhY2hcbnZhciBtZWRpYUV2ZW50cyA9IHtcbiAgdG9wQWJvcnQ6ICdhYm9ydCcsXG4gIHRvcENhblBsYXk6ICdjYW5wbGF5JyxcbiAgdG9wQ2FuUGxheVRocm91Z2g6ICdjYW5wbGF5dGhyb3VnaCcsXG4gIHRvcER1cmF0aW9uQ2hhbmdlOiAnZHVyYXRpb25jaGFuZ2UnLFxuICB0b3BFbXB0aWVkOiAnZW1wdGllZCcsXG4gIHRvcEVuY3J5cHRlZDogJ2VuY3J5cHRlZCcsXG4gIHRvcEVuZGVkOiAnZW5kZWQnLFxuICB0b3BFcnJvcjogJ2Vycm9yJyxcbiAgdG9wTG9hZGVkRGF0YTogJ2xvYWRlZGRhdGEnLFxuICB0b3BMb2FkZWRNZXRhZGF0YTogJ2xvYWRlZG1ldGFkYXRhJyxcbiAgdG9wTG9hZFN0YXJ0OiAnbG9hZHN0YXJ0JyxcbiAgdG9wUGF1c2U6ICdwYXVzZScsXG4gIHRvcFBsYXk6ICdwbGF5JyxcbiAgdG9wUGxheWluZzogJ3BsYXlpbmcnLFxuICB0b3BQcm9ncmVzczogJ3Byb2dyZXNzJyxcbiAgdG9wUmF0ZUNoYW5nZTogJ3JhdGVjaGFuZ2UnLFxuICB0b3BTZWVrZWQ6ICdzZWVrZWQnLFxuICB0b3BTZWVraW5nOiAnc2Vla2luZycsXG4gIHRvcFN0YWxsZWQ6ICdzdGFsbGVkJyxcbiAgdG9wU3VzcGVuZDogJ3N1c3BlbmQnLFxuICB0b3BUaW1lVXBkYXRlOiAndGltZXVwZGF0ZScsXG4gIHRvcFZvbHVtZUNoYW5nZTogJ3ZvbHVtZWNoYW5nZScsXG4gIHRvcFdhaXRpbmc6ICd3YWl0aW5nJ1xufTtcblxuZnVuY3Rpb24gdHJhcEJ1YmJsZWRFdmVudHNMb2NhbCgpIHtcbiAgdmFyIGluc3QgPSB0aGlzO1xuICAvLyBJZiBhIGNvbXBvbmVudCByZW5kZXJzIHRvIG51bGwgb3IgaWYgYW5vdGhlciBjb21wb25lbnQgZmF0YWxzIGFuZCBjYXVzZXNcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSB0cmVlIHRvIGJlIGNvcnJ1cHRlZCwgYG5vZGVgIGhlcmUgY2FuIGJlIG51bGwuXG4gICFpbnN0Ll9yb290Tm9kZUlEID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ011c3QgYmUgbW91bnRlZCB0byB0cmFwIGV2ZW50cycpIDogX3Byb2RJbnZhcmlhbnQoJzYzJykgOiB2b2lkIDA7XG4gIHZhciBub2RlID0gZ2V0Tm9kZShpbnN0KTtcbiAgIW5vZGUgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndHJhcEJ1YmJsZWRFdmVudCguLi4pOiBSZXF1aXJlcyBub2RlIHRvIGJlIHJlbmRlcmVkLicpIDogX3Byb2RJbnZhcmlhbnQoJzY0JykgOiB2b2lkIDA7XG5cbiAgc3dpdGNoIChpbnN0Ll90YWcpIHtcbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICBpbnN0Ll93cmFwcGVyU3RhdGUubGlzdGVuZXJzID0gW1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci50cmFwQnViYmxlZEV2ZW50KCd0b3BMb2FkJywgJ2xvYWQnLCBub2RlKV07XG4gICAgICBicmVhaztcbiAgICBjYXNlICd2aWRlbyc6XG4gICAgY2FzZSAnYXVkaW8nOlxuXG4gICAgICBpbnN0Ll93cmFwcGVyU3RhdGUubGlzdGVuZXJzID0gW107XG4gICAgICAvLyBDcmVhdGUgbGlzdGVuZXIgZm9yIGVhY2ggbWVkaWEgZXZlbnRcbiAgICAgIGZvciAodmFyIGV2ZW50IGluIG1lZGlhRXZlbnRzKSB7XG4gICAgICAgIGlmIChtZWRpYUV2ZW50cy5oYXNPd25Qcm9wZXJ0eShldmVudCkpIHtcbiAgICAgICAgICBpbnN0Ll93cmFwcGVyU3RhdGUubGlzdGVuZXJzLnB1c2goUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnRyYXBCdWJibGVkRXZlbnQoZXZlbnQsIG1lZGlhRXZlbnRzW2V2ZW50XSwgbm9kZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzb3VyY2UnOlxuICAgICAgaW5zdC5fd3JhcHBlclN0YXRlLmxpc3RlbmVycyA9IFtSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wRXJyb3InLCAnZXJyb3InLCBub2RlKV07XG4gICAgICBicmVhaztcbiAgICBjYXNlICdpbWcnOlxuICAgICAgaW5zdC5fd3JhcHBlclN0YXRlLmxpc3RlbmVycyA9IFtSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wRXJyb3InLCAnZXJyb3InLCBub2RlKSwgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcExvYWQnLCAnbG9hZCcsIG5vZGUpXTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Zvcm0nOlxuICAgICAgaW5zdC5fd3JhcHBlclN0YXRlLmxpc3RlbmVycyA9IFtSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wUmVzZXQnLCAncmVzZXQnLCBub2RlKSwgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcFN1Ym1pdCcsICdzdWJtaXQnLCBub2RlKV07XG4gICAgICBicmVhaztcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBpbnN0Ll93cmFwcGVyU3RhdGUubGlzdGVuZXJzID0gW1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci50cmFwQnViYmxlZEV2ZW50KCd0b3BJbnZhbGlkJywgJ2ludmFsaWQnLCBub2RlKV07XG4gICAgICBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBwb3N0VXBkYXRlU2VsZWN0V3JhcHBlcigpIHtcbiAgUmVhY3RET01TZWxlY3QucG9zdFVwZGF0ZVdyYXBwZXIodGhpcyk7XG59XG5cbi8vIEZvciBIVE1MLCBjZXJ0YWluIHRhZ3Mgc2hvdWxkIG9taXQgdGhlaXIgY2xvc2UgdGFnLiBXZSBrZWVwIGEgd2hpdGVsaXN0IGZvclxuLy8gdGhvc2Ugc3BlY2lhbC1jYXNlIHRhZ3MuXG5cbnZhciBvbWl0dGVkQ2xvc2VUYWdzID0ge1xuICAnYXJlYSc6IHRydWUsXG4gICdiYXNlJzogdHJ1ZSxcbiAgJ2JyJzogdHJ1ZSxcbiAgJ2NvbCc6IHRydWUsXG4gICdlbWJlZCc6IHRydWUsXG4gICdocic6IHRydWUsXG4gICdpbWcnOiB0cnVlLFxuICAnaW5wdXQnOiB0cnVlLFxuICAna2V5Z2VuJzogdHJ1ZSxcbiAgJ2xpbmsnOiB0cnVlLFxuICAnbWV0YSc6IHRydWUsXG4gICdwYXJhbSc6IHRydWUsXG4gICdzb3VyY2UnOiB0cnVlLFxuICAndHJhY2snOiB0cnVlLFxuICAnd2JyJzogdHJ1ZVxufTtcblxudmFyIG5ld2xpbmVFYXRpbmdUYWdzID0ge1xuICAnbGlzdGluZyc6IHRydWUsXG4gICdwcmUnOiB0cnVlLFxuICAndGV4dGFyZWEnOiB0cnVlXG59O1xuXG4vLyBGb3IgSFRNTCwgY2VydGFpbiB0YWdzIGNhbm5vdCBoYXZlIGNoaWxkcmVuLiBUaGlzIGhhcyB0aGUgc2FtZSBwdXJwb3NlIGFzXG4vLyBgb21pdHRlZENsb3NlVGFnc2AgZXhjZXB0IHRoYXQgYG1lbnVpdGVtYCBzaG91bGQgc3RpbGwgaGF2ZSBpdHMgY2xvc2luZyB0YWcuXG5cbnZhciB2b2lkRWxlbWVudFRhZ3MgPSBfYXNzaWduKHtcbiAgJ21lbnVpdGVtJzogdHJ1ZVxufSwgb21pdHRlZENsb3NlVGFncyk7XG5cbi8vIFdlIGFjY2VwdCBhbnkgdGFnIHRvIGJlIHJlbmRlcmVkIGJ1dCBzaW5jZSB0aGlzIGdldHMgaW5qZWN0ZWQgaW50byBhcmJpdHJhcnlcbi8vIEhUTUwsIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgaXQncyBhIHNhZmUgdGFnLlxuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC8jTlQtTmFtZVxuXG52YXIgVkFMSURfVEFHX1JFR0VYID0gL15bYS16QS1aXVthLXpBLVo6X1xcLlxcLVxcZF0qJC87IC8vIFNpbXBsaWZpZWQgc3Vic2V0XG52YXIgdmFsaWRhdGVkVGFnQ2FjaGUgPSB7fTtcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiB2YWxpZGF0ZURhbmdlcm91c1RhZyh0YWcpIHtcbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbGlkYXRlZFRhZ0NhY2hlLCB0YWcpKSB7XG4gICAgIVZBTElEX1RBR19SRUdFWC50ZXN0KHRhZykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnSW52YWxpZCB0YWc6ICVzJywgdGFnKSA6IF9wcm9kSW52YXJpYW50KCc2NScsIHRhZykgOiB2b2lkIDA7XG4gICAgdmFsaWRhdGVkVGFnQ2FjaGVbdGFnXSA9IHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDdXN0b21Db21wb25lbnQodGFnTmFtZSwgcHJvcHMpIHtcbiAgcmV0dXJuIHRhZ05hbWUuaW5kZXhPZignLScpID49IDAgfHwgcHJvcHMuaXMgIT0gbnVsbDtcbn1cblxudmFyIGdsb2JhbElkQ291bnRlciA9IDE7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBSZWFjdCBjbGFzcyB0aGF0IGlzIGlkZW1wb3RlbnQgYW5kIGNhcGFibGUgb2YgY29udGFpbmluZyBvdGhlclxuICogUmVhY3QgY29tcG9uZW50cy4gSXQgYWNjZXB0cyBldmVudCBsaXN0ZW5lcnMgYW5kIERPTSBwcm9wZXJ0aWVzIHRoYXQgYXJlXG4gKiB2YWxpZCBhY2NvcmRpbmcgdG8gYERPTVByb3BlcnR5YC5cbiAqXG4gKiAgLSBFdmVudCBsaXN0ZW5lcnM6IGBvbkNsaWNrYCwgYG9uTW91c2VEb3duYCwgZXRjLlxuICogIC0gRE9NIHByb3BlcnRpZXM6IGBjbGFzc05hbWVgLCBgbmFtZWAsIGB0aXRsZWAsIGV0Yy5cbiAqXG4gKiBUaGUgYHN0eWxlYCBwcm9wZXJ0eSBmdW5jdGlvbnMgZGlmZmVyZW50bHkgZnJvbSB0aGUgRE9NIEFQSS4gSXQgYWNjZXB0cyBhblxuICogb2JqZWN0IG1hcHBpbmcgb2Ygc3R5bGUgcHJvcGVydGllcyB0byB2YWx1ZXMuXG4gKlxuICogQGNvbnN0cnVjdG9yIFJlYWN0RE9NQ29tcG9uZW50XG4gKiBAZXh0ZW5kcyBSZWFjdE11bHRpQ2hpbGRcbiAqL1xuZnVuY3Rpb24gUmVhY3RET01Db21wb25lbnQoZWxlbWVudCkge1xuICB2YXIgdGFnID0gZWxlbWVudC50eXBlO1xuICB2YWxpZGF0ZURhbmdlcm91c1RhZyh0YWcpO1xuICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IGVsZW1lbnQ7XG4gIHRoaXMuX3RhZyA9IHRhZy50b0xvd2VyQ2FzZSgpO1xuICB0aGlzLl9uYW1lc3BhY2VVUkkgPSBudWxsO1xuICB0aGlzLl9yZW5kZXJlZENoaWxkcmVuID0gbnVsbDtcbiAgdGhpcy5fcHJldmlvdXNTdHlsZSA9IG51bGw7XG4gIHRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5ID0gbnVsbDtcbiAgdGhpcy5faG9zdE5vZGUgPSBudWxsO1xuICB0aGlzLl9ob3N0UGFyZW50ID0gbnVsbDtcbiAgdGhpcy5fcm9vdE5vZGVJRCA9IDA7XG4gIHRoaXMuX2RvbUlEID0gMDtcbiAgdGhpcy5faG9zdENvbnRhaW5lckluZm8gPSBudWxsO1xuICB0aGlzLl93cmFwcGVyU3RhdGUgPSBudWxsO1xuICB0aGlzLl90b3BMZXZlbFdyYXBwZXIgPSBudWxsO1xuICB0aGlzLl9mbGFncyA9IDA7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdGhpcy5fYW5jZXN0b3JJbmZvID0gbnVsbDtcbiAgICBzZXRBbmRWYWxpZGF0ZUNvbnRlbnRDaGlsZERldi5jYWxsKHRoaXMsIG51bGwpO1xuICB9XG59XG5cblJlYWN0RE9NQ29tcG9uZW50LmRpc3BsYXlOYW1lID0gJ1JlYWN0RE9NQ29tcG9uZW50JztcblxuUmVhY3RET01Db21wb25lbnQuTWl4aW4gPSB7XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyByb290IHRhZyBtYXJrdXAgdGhlbiByZWN1cnNlcy4gVGhpcyBtZXRob2QgaGFzIHNpZGUgZWZmZWN0cyBhbmRcbiAgICogaXMgbm90IGlkZW1wb3RlbnQuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb258UmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHs/UmVhY3RET01Db21wb25lbnR9IHRoZSBwYXJlbnQgY29tcG9uZW50IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7P29iamVjdH0gaW5mbyBhYm91dCB0aGUgaG9zdCBjb250YWluZXJcbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHRcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgY29tcHV0ZWQgbWFya3VwLlxuICAgKi9cbiAgbW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQpIHtcbiAgICB0aGlzLl9yb290Tm9kZUlEID0gZ2xvYmFsSWRDb3VudGVyKys7XG4gICAgdGhpcy5fZG9tSUQgPSBob3N0Q29udGFpbmVySW5mby5faWRDb3VudGVyKys7XG4gICAgdGhpcy5faG9zdFBhcmVudCA9IGhvc3RQYXJlbnQ7XG4gICAgdGhpcy5faG9zdENvbnRhaW5lckluZm8gPSBob3N0Q29udGFpbmVySW5mbztcblxuICAgIHZhciBwcm9wcyA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzO1xuXG4gICAgc3dpdGNoICh0aGlzLl90YWcpIHtcbiAgICAgIGNhc2UgJ2F1ZGlvJzpcbiAgICAgIGNhc2UgJ2Zvcm0nOlxuICAgICAgY2FzZSAnaWZyYW1lJzpcbiAgICAgIGNhc2UgJ2ltZyc6XG4gICAgICBjYXNlICdsaW5rJzpcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICBjYXNlICdzb3VyY2UnOlxuICAgICAgY2FzZSAndmlkZW8nOlxuICAgICAgICB0aGlzLl93cmFwcGVyU3RhdGUgPSB7XG4gICAgICAgICAgbGlzdGVuZXJzOiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUodHJhcEJ1YmJsZWRFdmVudHNMb2NhbCwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaW5wdXQnOlxuICAgICAgICBSZWFjdERPTUlucHV0Lm1vdW50V3JhcHBlcih0aGlzLCBwcm9wcywgaG9zdFBhcmVudCk7XG4gICAgICAgIHByb3BzID0gUmVhY3RET01JbnB1dC5nZXRIb3N0UHJvcHModGhpcywgcHJvcHMpO1xuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHRyYXBCdWJibGVkRXZlbnRzTG9jYWwsIHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAgIFJlYWN0RE9NT3B0aW9uLm1vdW50V3JhcHBlcih0aGlzLCBwcm9wcywgaG9zdFBhcmVudCk7XG4gICAgICAgIHByb3BzID0gUmVhY3RET01PcHRpb24uZ2V0SG9zdFByb3BzKHRoaXMsIHByb3BzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICBSZWFjdERPTVNlbGVjdC5tb3VudFdyYXBwZXIodGhpcywgcHJvcHMsIGhvc3RQYXJlbnQpO1xuICAgICAgICBwcm9wcyA9IFJlYWN0RE9NU2VsZWN0LmdldEhvc3RQcm9wcyh0aGlzLCBwcm9wcyk7XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUodHJhcEJ1YmJsZWRFdmVudHNMb2NhbCwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgICBSZWFjdERPTVRleHRhcmVhLm1vdW50V3JhcHBlcih0aGlzLCBwcm9wcywgaG9zdFBhcmVudCk7XG4gICAgICAgIHByb3BzID0gUmVhY3RET01UZXh0YXJlYS5nZXRIb3N0UHJvcHModGhpcywgcHJvcHMpO1xuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHRyYXBCdWJibGVkRXZlbnRzTG9jYWwsIHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBhc3NlcnRWYWxpZFByb3BzKHRoaXMsIHByb3BzKTtcblxuICAgIC8vIFdlIGNyZWF0ZSB0YWdzIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhlaXIgcGFyZW50IGNvbnRhaW5lciwgZXhjZXB0IEhUTUxcbiAgICAvLyB0YWdzIGdldCBubyBuYW1lc3BhY2UuXG4gICAgdmFyIG5hbWVzcGFjZVVSSTtcbiAgICB2YXIgcGFyZW50VGFnO1xuICAgIGlmIChob3N0UGFyZW50ICE9IG51bGwpIHtcbiAgICAgIG5hbWVzcGFjZVVSSSA9IGhvc3RQYXJlbnQuX25hbWVzcGFjZVVSSTtcbiAgICAgIHBhcmVudFRhZyA9IGhvc3RQYXJlbnQuX3RhZztcbiAgICB9IGVsc2UgaWYgKGhvc3RDb250YWluZXJJbmZvLl90YWcpIHtcbiAgICAgIG5hbWVzcGFjZVVSSSA9IGhvc3RDb250YWluZXJJbmZvLl9uYW1lc3BhY2VVUkk7XG4gICAgICBwYXJlbnRUYWcgPSBob3N0Q29udGFpbmVySW5mby5fdGFnO1xuICAgIH1cbiAgICBpZiAobmFtZXNwYWNlVVJJID09IG51bGwgfHwgbmFtZXNwYWNlVVJJID09PSBET01OYW1lc3BhY2VzLnN2ZyAmJiBwYXJlbnRUYWcgPT09ICdmb3JlaWdub2JqZWN0Jykge1xuICAgICAgbmFtZXNwYWNlVVJJID0gRE9NTmFtZXNwYWNlcy5odG1sO1xuICAgIH1cbiAgICBpZiAobmFtZXNwYWNlVVJJID09PSBET01OYW1lc3BhY2VzLmh0bWwpIHtcbiAgICAgIGlmICh0aGlzLl90YWcgPT09ICdzdmcnKSB7XG4gICAgICAgIG5hbWVzcGFjZVVSSSA9IERPTU5hbWVzcGFjZXMuc3ZnO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl90YWcgPT09ICdtYXRoJykge1xuICAgICAgICBuYW1lc3BhY2VVUkkgPSBET01OYW1lc3BhY2VzLm1hdGhtbDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fbmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBwYXJlbnRJbmZvO1xuICAgICAgaWYgKGhvc3RQYXJlbnQgIT0gbnVsbCkge1xuICAgICAgICBwYXJlbnRJbmZvID0gaG9zdFBhcmVudC5fYW5jZXN0b3JJbmZvO1xuICAgICAgfSBlbHNlIGlmIChob3N0Q29udGFpbmVySW5mby5fdGFnKSB7XG4gICAgICAgIHBhcmVudEluZm8gPSBob3N0Q29udGFpbmVySW5mby5fYW5jZXN0b3JJbmZvO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmVudEluZm8pIHtcbiAgICAgICAgLy8gcGFyZW50SW5mbyBzaG91bGQgYWx3YXlzIGJlIHByZXNlbnQgZXhjZXB0IGZvciB0aGUgdG9wLWxldmVsXG4gICAgICAgIC8vIGNvbXBvbmVudCB3aGVuIHNlcnZlciByZW5kZXJpbmdcbiAgICAgICAgdmFsaWRhdGVET01OZXN0aW5nKHRoaXMuX3RhZywgbnVsbCwgdGhpcywgcGFyZW50SW5mbyk7XG4gICAgICB9XG4gICAgICB0aGlzLl9hbmNlc3RvckluZm8gPSB2YWxpZGF0ZURPTU5lc3RpbmcudXBkYXRlZEFuY2VzdG9ySW5mbyhwYXJlbnRJbmZvLCB0aGlzLl90YWcsIHRoaXMpO1xuICAgIH1cblxuICAgIHZhciBtb3VudEltYWdlO1xuICAgIGlmICh0cmFuc2FjdGlvbi51c2VDcmVhdGVFbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXJEb2N1bWVudCA9IGhvc3RDb250YWluZXJJbmZvLl9vd25lckRvY3VtZW50O1xuICAgICAgdmFyIGVsO1xuICAgICAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gRE9NTmFtZXNwYWNlcy5odG1sKSB7XG4gICAgICAgIGlmICh0aGlzLl90YWcgPT09ICdzY3JpcHQnKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIHRoZSBzY3JpcHQgdmlhIC5pbm5lckhUTUwgc28gaXRzIFwicGFyc2VyLWluc2VydGVkXCIgZmxhZyBpc1xuICAgICAgICAgIC8vIHNldCB0byB0cnVlIGFuZCBpdCBkb2VzIG5vdCBleGVjdXRlXG4gICAgICAgICAgdmFyIGRpdiA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgdmFyIHR5cGUgPSB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO1xuICAgICAgICAgIGRpdi5pbm5lckhUTUwgPSAnPCcgKyB0eXBlICsgJz48LycgKyB0eXBlICsgJz4nO1xuICAgICAgICAgIGVsID0gZGl2LnJlbW92ZUNoaWxkKGRpdi5maXJzdENoaWxkKTtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9wcy5pcykge1xuICAgICAgICAgIGVsID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUsIHByb3BzLmlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTZXBhcmF0ZSBlbHNlIGJyYW5jaCBpbnN0ZWFkIG9mIHVzaW5nIGBwcm9wcy5pcyB8fCB1bmRlZmluZWRgIGFib3ZlIGJlY3Vhc2Ugb2YgYSBGaXJlZm94IGJ1Zy5cbiAgICAgICAgICAvLyBTZWUgZGlzY3Vzc2lvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC82ODk2XG4gICAgICAgICAgLy8gYW5kIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTI3NjI0MFxuICAgICAgICAgIGVsID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwgdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSk7XG4gICAgICB9XG4gICAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUucHJlY2FjaGVOb2RlKHRoaXMsIGVsKTtcbiAgICAgIHRoaXMuX2ZsYWdzIHw9IEZsYWdzLmhhc0NhY2hlZENoaWxkTm9kZXM7XG4gICAgICBpZiAoIXRoaXMuX2hvc3RQYXJlbnQpIHtcbiAgICAgICAgRE9NUHJvcGVydHlPcGVyYXRpb25zLnNldEF0dHJpYnV0ZUZvclJvb3QoZWwpO1xuICAgICAgfVxuICAgICAgdGhpcy5fdXBkYXRlRE9NUHJvcGVydGllcyhudWxsLCBwcm9wcywgdHJhbnNhY3Rpb24pO1xuICAgICAgdmFyIGxhenlUcmVlID0gRE9NTGF6eVRyZWUoZWwpO1xuICAgICAgdGhpcy5fY3JlYXRlSW5pdGlhbENoaWxkcmVuKHRyYW5zYWN0aW9uLCBwcm9wcywgY29udGV4dCwgbGF6eVRyZWUpO1xuICAgICAgbW91bnRJbWFnZSA9IGxhenlUcmVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdGFnT3BlbiA9IHRoaXMuX2NyZWF0ZU9wZW5UYWdNYXJrdXBBbmRQdXRMaXN0ZW5lcnModHJhbnNhY3Rpb24sIHByb3BzKTtcbiAgICAgIHZhciB0YWdDb250ZW50ID0gdGhpcy5fY3JlYXRlQ29udGVudE1hcmt1cCh0cmFuc2FjdGlvbiwgcHJvcHMsIGNvbnRleHQpO1xuICAgICAgaWYgKCF0YWdDb250ZW50ICYmIG9taXR0ZWRDbG9zZVRhZ3NbdGhpcy5fdGFnXSkge1xuICAgICAgICBtb3VudEltYWdlID0gdGFnT3BlbiArICcvPic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtb3VudEltYWdlID0gdGFnT3BlbiArICc+JyArIHRhZ0NvbnRlbnQgKyAnPC8nICsgdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSArICc+JztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMuX3RhZykge1xuICAgICAgY2FzZSAnaW5wdXQnOlxuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGlucHV0UG9zdE1vdW50LCB0aGlzKTtcbiAgICAgICAgaWYgKHByb3BzLmF1dG9Gb2N1cykge1xuICAgICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoQXV0b0ZvY3VzVXRpbHMuZm9jdXNET01Db21wb25lbnQsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHRleHRhcmVhUG9zdE1vdW50LCB0aGlzKTtcbiAgICAgICAgaWYgKHByb3BzLmF1dG9Gb2N1cykge1xuICAgICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoQXV0b0ZvY3VzVXRpbHMuZm9jdXNET01Db21wb25lbnQsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgaWYgKHByb3BzLmF1dG9Gb2N1cykge1xuICAgICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoQXV0b0ZvY3VzVXRpbHMuZm9jdXNET01Db21wb25lbnQsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYnV0dG9uJzpcbiAgICAgICAgaWYgKHByb3BzLmF1dG9Gb2N1cykge1xuICAgICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoQXV0b0ZvY3VzVXRpbHMuZm9jdXNET01Db21wb25lbnQsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShvcHRpb25Qb3N0TW91bnQsIHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gbW91bnRJbWFnZTtcbiAgfSxcblxuICAvKipcbiAgICogQ3JlYXRlcyBtYXJrdXAgZm9yIHRoZSBvcGVuIHRhZyBhbmQgYWxsIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGhhcyBzaWRlIGVmZmVjdHMgYmVjYXVzZSBldmVudHMgZ2V0IHJlZ2lzdGVyZWQuXG4gICAqXG4gICAqIEl0ZXJhdGluZyBvdmVyIG9iamVjdCBwcm9wZXJ0aWVzIGlzIGZhc3RlciB0aGFuIGl0ZXJhdGluZyBvdmVyIGFycmF5cy5cbiAgICogQHNlZSBodHRwOi8vanNwZXJmLmNvbS9vYmotdnMtYXJyLWl0ZXJhdGlvblxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb258UmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtvYmplY3R9IHByb3BzXG4gICAqIEByZXR1cm4ge3N0cmluZ30gTWFya3VwIG9mIG9wZW5pbmcgdGFnLlxuICAgKi9cbiAgX2NyZWF0ZU9wZW5UYWdNYXJrdXBBbmRQdXRMaXN0ZW5lcnM6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgcHJvcHMpIHtcbiAgICB2YXIgcmV0ID0gJzwnICsgdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTtcblxuICAgIGZvciAodmFyIHByb3BLZXkgaW4gcHJvcHMpIHtcbiAgICAgIGlmICghcHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcEtleV07XG4gICAgICBpZiAocHJvcFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAocmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgICAgaWYgKHByb3BWYWx1ZSkge1xuICAgICAgICAgIGVucXVldWVQdXRMaXN0ZW5lcih0aGlzLCBwcm9wS2V5LCBwcm9wVmFsdWUsIHRyYW5zYWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICAgICAgaWYgKHByb3BWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgLy8gU2VlIGBfdXBkYXRlRE9NUHJvcGVydGllc2AuIHN0eWxlIGJsb2NrXG4gICAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzU3R5bGUgPSBwcm9wVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9wVmFsdWUgPSB0aGlzLl9wcmV2aW91c1N0eWxlQ29weSA9IF9hc3NpZ24oe30sIHByb3BzLnN0eWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJvcFZhbHVlID0gQ1NTUHJvcGVydHlPcGVyYXRpb25zLmNyZWF0ZU1hcmt1cEZvclN0eWxlcyhwcm9wVmFsdWUsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtYXJrdXAgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5fdGFnICE9IG51bGwgJiYgaXNDdXN0b21Db21wb25lbnQodGhpcy5fdGFnLCBwcm9wcykpIHtcbiAgICAgICAgICBpZiAoIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICAgICAgICBtYXJrdXAgPSBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuY3JlYXRlTWFya3VwRm9yQ3VzdG9tQXR0cmlidXRlKHByb3BLZXksIHByb3BWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hcmt1cCA9IERPTVByb3BlcnR5T3BlcmF0aW9ucy5jcmVhdGVNYXJrdXBGb3JQcm9wZXJ0eShwcm9wS2V5LCBwcm9wVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXJrdXApIHtcbiAgICAgICAgICByZXQgKz0gJyAnICsgbWFya3VwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9yIHN0YXRpYyBwYWdlcywgbm8gbmVlZCB0byBwdXQgUmVhY3QgSUQgYW5kIGNoZWNrc3VtLiBTYXZlcyBsb3RzIG9mXG4gICAgLy8gYnl0ZXMuXG4gICAgaWYgKHRyYW5zYWN0aW9uLnJlbmRlclRvU3RhdGljTWFya3VwKSB7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5faG9zdFBhcmVudCkge1xuICAgICAgcmV0ICs9ICcgJyArIERPTVByb3BlcnR5T3BlcmF0aW9ucy5jcmVhdGVNYXJrdXBGb3JSb290KCk7XG4gICAgfVxuICAgIHJldCArPSAnICcgKyBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuY3JlYXRlTWFya3VwRm9ySUQodGhpcy5fZG9tSUQpO1xuICAgIHJldHVybiByZXQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbWFya3VwIGZvciB0aGUgY29udGVudCBiZXR3ZWVuIHRoZSB0YWdzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb258UmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtvYmplY3R9IHByb3BzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0XG4gICAqIEByZXR1cm4ge3N0cmluZ30gQ29udGVudCBtYXJrdXAuXG4gICAqL1xuICBfY3JlYXRlQ29udGVudE1hcmt1cDogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBwcm9wcywgY29udGV4dCkge1xuICAgIHZhciByZXQgPSAnJztcblxuICAgIC8vIEludGVudGlvbmFsIHVzZSBvZiAhPSB0byBhdm9pZCBjYXRjaGluZyB6ZXJvL2ZhbHNlLlxuICAgIHZhciBpbm5lckhUTUwgPSBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTDtcbiAgICBpZiAoaW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICAgIGlmIChpbm5lckhUTUwuX19odG1sICE9IG51bGwpIHtcbiAgICAgICAgcmV0ID0gaW5uZXJIVE1MLl9faHRtbDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGNvbnRlbnRUb1VzZSA9IENPTlRFTlRfVFlQRVNbdHlwZW9mIHByb3BzLmNoaWxkcmVuXSA/IHByb3BzLmNoaWxkcmVuIDogbnVsbDtcbiAgICAgIHZhciBjaGlsZHJlblRvVXNlID0gY29udGVudFRvVXNlICE9IG51bGwgPyBudWxsIDogcHJvcHMuY2hpbGRyZW47XG4gICAgICBpZiAoY29udGVudFRvVXNlICE9IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgdGhhdCB0ZXh0IGlzIGFsbG93ZWQgYXMgYSBjaGlsZCBvZiB0aGlzIG5vZGVcbiAgICAgICAgcmV0ID0gZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyKGNvbnRlbnRUb1VzZSk7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgc2V0QW5kVmFsaWRhdGVDb250ZW50Q2hpbGREZXYuY2FsbCh0aGlzLCBjb250ZW50VG9Vc2UpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNoaWxkcmVuVG9Vc2UgIT0gbnVsbCkge1xuICAgICAgICB2YXIgbW91bnRJbWFnZXMgPSB0aGlzLm1vdW50Q2hpbGRyZW4oY2hpbGRyZW5Ub1VzZSwgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgICAgICByZXQgPSBtb3VudEltYWdlcy5qb2luKCcnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5ld2xpbmVFYXRpbmdUYWdzW3RoaXMuX3RhZ10gJiYgcmV0LmNoYXJBdCgwKSA9PT0gJ1xcbicpIHtcbiAgICAgIC8vIHRleHQvaHRtbCBpZ25vcmVzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlc2UgdGFncyBpZiBpdCdzIGEgbmV3bGluZVxuICAgICAgLy8gUHJlZmVyIHRvIGJyZWFrIGFwcGxpY2F0aW9uL3htbCBvdmVyIHRleHQvaHRtbCAoZm9yIG5vdykgYnkgYWRkaW5nXG4gICAgICAvLyBhIG5ld2xpbmUgc3BlY2lmaWNhbGx5IHRvIGdldCBlYXRlbiBieSB0aGUgcGFyc2VyLiAoQWx0ZXJuYXRlbHkgZm9yXG4gICAgICAvLyB0ZXh0YXJlYXMsIHJlcGxhY2luZyBcIl5cXG5cIiB3aXRoIFwiXFxyXFxuXCIgZG9lc24ndCBnZXQgZWF0ZW4sIGFuZCB0aGUgZmlyc3RcbiAgICAgIC8vIFxcciBpcyBub3JtYWxpemVkIG91dCBieSBIVE1MVGV4dEFyZWFFbGVtZW50I3ZhbHVlLilcbiAgICAgIC8vIFNlZTogPGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWwtcG9seWdsb3QvI25ld2xpbmVzLWluLXRleHRhcmVhLWFuZC1wcmU+XG4gICAgICAvLyBTZWU6IDxodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zeW50YXguaHRtbCNlbGVtZW50LXJlc3RyaWN0aW9ucz5cbiAgICAgIC8vIFNlZTogPGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L3N5bnRheC5odG1sI25ld2xpbmVzPlxuICAgICAgLy8gU2VlOiBQYXJzaW5nIG9mIFwidGV4dGFyZWFcIiBcImxpc3RpbmdcIiBhbmQgXCJwcmVcIiBlbGVtZW50c1xuICAgICAgLy8gIGZyb20gPGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHk+XG4gICAgICByZXR1cm4gJ1xcbicgKyByZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICB9LFxuXG4gIF9jcmVhdGVJbml0aWFsQ2hpbGRyZW46IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgcHJvcHMsIGNvbnRleHQsIGxhenlUcmVlKSB7XG4gICAgLy8gSW50ZW50aW9uYWwgdXNlIG9mICE9IHRvIGF2b2lkIGNhdGNoaW5nIHplcm8vZmFsc2UuXG4gICAgdmFyIGlubmVySFRNTCA9IHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MO1xuICAgIGlmIChpbm5lckhUTUwgIT0gbnVsbCkge1xuICAgICAgaWYgKGlubmVySFRNTC5fX2h0bWwgIT0gbnVsbCkge1xuICAgICAgICBET01MYXp5VHJlZS5xdWV1ZUhUTUwobGF6eVRyZWUsIGlubmVySFRNTC5fX2h0bWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgY29udGVudFRvVXNlID0gQ09OVEVOVF9UWVBFU1t0eXBlb2YgcHJvcHMuY2hpbGRyZW5dID8gcHJvcHMuY2hpbGRyZW4gOiBudWxsO1xuICAgICAgdmFyIGNoaWxkcmVuVG9Vc2UgPSBjb250ZW50VG9Vc2UgIT0gbnVsbCA/IG51bGwgOiBwcm9wcy5jaGlsZHJlbjtcbiAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHRoYXQgdGV4dCBpcyBhbGxvd2VkIGFzIGEgY2hpbGQgb2YgdGhpcyBub2RlXG4gICAgICBpZiAoY29udGVudFRvVXNlICE9IG51bGwpIHtcbiAgICAgICAgLy8gQXZvaWQgc2V0dGluZyB0ZXh0Q29udGVudCB3aGVuIHRoZSB0ZXh0IGlzIGVtcHR5LiBJbiBJRTExIHNldHRpbmdcbiAgICAgICAgLy8gdGV4dENvbnRlbnQgb24gYSB0ZXh0IGFyZWEgd2lsbCBjYXVzZSB0aGUgcGxhY2Vob2xkZXIgdG8gbm90XG4gICAgICAgIC8vIHNob3cgd2l0aGluIHRoZSB0ZXh0YXJlYSB1bnRpbCBpdCBoYXMgYmVlbiBmb2N1c2VkIGFuZCBibHVycmVkIGFnYWluLlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzY3MzEjaXNzdWVjb21tZW50LTI1NDg3NDU1M1xuICAgICAgICBpZiAoY29udGVudFRvVXNlICE9PSAnJykge1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBzZXRBbmRWYWxpZGF0ZUNvbnRlbnRDaGlsZERldi5jYWxsKHRoaXMsIGNvbnRlbnRUb1VzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIERPTUxhenlUcmVlLnF1ZXVlVGV4dChsYXp5VHJlZSwgY29udGVudFRvVXNlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjaGlsZHJlblRvVXNlICE9IG51bGwpIHtcbiAgICAgICAgdmFyIG1vdW50SW1hZ2VzID0gdGhpcy5tb3VudENoaWxkcmVuKGNoaWxkcmVuVG9Vc2UsIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb3VudEltYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIERPTUxhenlUcmVlLnF1ZXVlQ2hpbGQobGF6eVRyZWUsIG1vdW50SW1hZ2VzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogUmVjZWl2ZXMgYSBuZXh0IGVsZW1lbnQgYW5kIHVwZGF0ZXMgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0RWxlbWVudFxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb258UmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHRcbiAgICovXG4gIHJlY2VpdmVDb21wb25lbnQ6IGZ1bmN0aW9uIChuZXh0RWxlbWVudCwgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHtcbiAgICB2YXIgcHJldkVsZW1lbnQgPSB0aGlzLl9jdXJyZW50RWxlbWVudDtcbiAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IG5leHRFbGVtZW50O1xuICAgIHRoaXMudXBkYXRlQ29tcG9uZW50KHRyYW5zYWN0aW9uLCBwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQsIGNvbnRleHQpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGEgRE9NIGNvbXBvbmVudCBhZnRlciBpdCBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBhbmRcbiAgICogYXR0YWNoZWQgdG8gdGhlIERPTS4gUmVjb25jaWxlcyB0aGUgcm9vdCBET00gbm9kZSwgdGhlbiByZWN1cnNlcy5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gcHJldkVsZW1lbnRcbiAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IG5leHRFbGVtZW50XG4gICAqIEBpbnRlcm5hbFxuICAgKiBAb3ZlcnJpZGFibGVcbiAgICovXG4gIHVwZGF0ZUNvbXBvbmVudDogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQsIGNvbnRleHQpIHtcbiAgICB2YXIgbGFzdFByb3BzID0gcHJldkVsZW1lbnQucHJvcHM7XG4gICAgdmFyIG5leHRQcm9wcyA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzO1xuXG4gICAgc3dpdGNoICh0aGlzLl90YWcpIHtcbiAgICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgICAgbGFzdFByb3BzID0gUmVhY3RET01JbnB1dC5nZXRIb3N0UHJvcHModGhpcywgbGFzdFByb3BzKTtcbiAgICAgICAgbmV4dFByb3BzID0gUmVhY3RET01JbnB1dC5nZXRIb3N0UHJvcHModGhpcywgbmV4dFByb3BzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdvcHRpb24nOlxuICAgICAgICBsYXN0UHJvcHMgPSBSZWFjdERPTU9wdGlvbi5nZXRIb3N0UHJvcHModGhpcywgbGFzdFByb3BzKTtcbiAgICAgICAgbmV4dFByb3BzID0gUmVhY3RET01PcHRpb24uZ2V0SG9zdFByb3BzKHRoaXMsIG5leHRQcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgbGFzdFByb3BzID0gUmVhY3RET01TZWxlY3QuZ2V0SG9zdFByb3BzKHRoaXMsIGxhc3RQcm9wcyk7XG4gICAgICAgIG5leHRQcm9wcyA9IFJlYWN0RE9NU2VsZWN0LmdldEhvc3RQcm9wcyh0aGlzLCBuZXh0UHJvcHMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgICAgbGFzdFByb3BzID0gUmVhY3RET01UZXh0YXJlYS5nZXRIb3N0UHJvcHModGhpcywgbGFzdFByb3BzKTtcbiAgICAgICAgbmV4dFByb3BzID0gUmVhY3RET01UZXh0YXJlYS5nZXRIb3N0UHJvcHModGhpcywgbmV4dFByb3BzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgYXNzZXJ0VmFsaWRQcm9wcyh0aGlzLCBuZXh0UHJvcHMpO1xuICAgIHRoaXMuX3VwZGF0ZURPTVByb3BlcnRpZXMobGFzdFByb3BzLCBuZXh0UHJvcHMsIHRyYW5zYWN0aW9uKTtcbiAgICB0aGlzLl91cGRhdGVET01DaGlsZHJlbihsYXN0UHJvcHMsIG5leHRQcm9wcywgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuXG4gICAgc3dpdGNoICh0aGlzLl90YWcpIHtcbiAgICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgICAgLy8gVXBkYXRlIHRoZSB3cmFwcGVyIGFyb3VuZCBpbnB1dHMgKmFmdGVyKiB1cGRhdGluZyBwcm9wcy4gVGhpcyBoYXMgdG9cbiAgICAgICAgLy8gaGFwcGVuIGFmdGVyIGBfdXBkYXRlRE9NUHJvcGVydGllc2AuIE90aGVyd2lzZSBIVE1MNSBpbnB1dCB2YWxpZGF0aW9uc1xuICAgICAgICAvLyByYWlzZSB3YXJuaW5ncyBhbmQgcHJldmVudCB0aGUgbmV3IHZhbHVlIGZyb20gYmVpbmcgYXNzaWduZWQuXG4gICAgICAgIFJlYWN0RE9NSW5wdXQudXBkYXRlV3JhcHBlcih0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAgIFJlYWN0RE9NVGV4dGFyZWEudXBkYXRlV3JhcHBlcih0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICAvLyA8c2VsZWN0PiB2YWx1ZSB1cGRhdGUgbmVlZHMgdG8gb2NjdXIgYWZ0ZXIgPG9wdGlvbj4gY2hpbGRyZW5cbiAgICAgICAgLy8gcmVjb25jaWxpYXRpb25cbiAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShwb3N0VXBkYXRlU2VsZWN0V3JhcHBlciwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogUmVjb25jaWxlcyB0aGUgcHJvcGVydGllcyBieSBkZXRlY3RpbmcgZGlmZmVyZW5jZXMgaW4gcHJvcGVydHkgdmFsdWVzIGFuZFxuICAgKiB1cGRhdGluZyB0aGUgRE9NIGFzIG5lY2Vzc2FyeS4gVGhpcyBmdW5jdGlvbiBpcyBwcm9iYWJseSB0aGUgc2luZ2xlIG1vc3RcbiAgICogY3JpdGljYWwgcGF0aCBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLlxuICAgKlxuICAgKiBUT0RPOiBCZW5jaG1hcmsgd2hldGhlciBjaGVja2luZyBmb3IgY2hhbmdlZCB2YWx1ZXMgaW4gbWVtb3J5IGFjdHVhbGx5XG4gICAqICAgICAgIGltcHJvdmVzIHBlcmZvcm1hbmNlIChlc3BlY2lhbGx5IHN0YXRpY2FsbHkgcG9zaXRpb25lZCBlbGVtZW50cykuXG4gICAqIFRPRE86IEJlbmNobWFyayB0aGUgZWZmZWN0cyBvZiBwdXR0aW5nIHRoaXMgYXQgdGhlIHRvcCBzaW5jZSA5OSUgb2YgcHJvcHNcbiAgICogICAgICAgZG8gbm90IGNoYW5nZSBmb3IgYSBnaXZlbiByZWNvbmNpbGlhdGlvbi5cbiAgICogVE9ETzogQmVuY2htYXJrIGFyZWFzIHRoYXQgY2FuIGJlIGltcHJvdmVkIHdpdGggY2FjaGluZy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtvYmplY3R9IGxhc3RQcm9wc1xuICAgKiBAcGFyYW0ge29iamVjdH0gbmV4dFByb3BzXG4gICAqIEBwYXJhbSB7P0RPTUVsZW1lbnR9IG5vZGVcbiAgICovXG4gIF91cGRhdGVET01Qcm9wZXJ0aWVzOiBmdW5jdGlvbiAobGFzdFByb3BzLCBuZXh0UHJvcHMsIHRyYW5zYWN0aW9uKSB7XG4gICAgdmFyIHByb3BLZXk7XG4gICAgdmFyIHN0eWxlTmFtZTtcbiAgICB2YXIgc3R5bGVVcGRhdGVzO1xuICAgIGZvciAocHJvcEtleSBpbiBsYXN0UHJvcHMpIHtcbiAgICAgIGlmIChuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgIWxhc3RQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCBsYXN0UHJvcHNbcHJvcEtleV0gPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgICB2YXIgbGFzdFN0eWxlID0gdGhpcy5fcHJldmlvdXNTdHlsZUNvcHk7XG4gICAgICAgIGZvciAoc3R5bGVOYW1lIGluIGxhc3RTdHlsZSkge1xuICAgICAgICAgIGlmIChsYXN0U3R5bGUuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0gc3R5bGVVcGRhdGVzIHx8IHt9O1xuICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcHJldmlvdXNTdHlsZUNvcHkgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lTW9kdWxlcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgICBpZiAobGFzdFByb3BzW3Byb3BLZXldKSB7XG4gICAgICAgICAgLy8gT25seSBjYWxsIGRlbGV0ZUxpc3RlbmVyIGlmIHRoZXJlIHdhcyBhIGxpc3RlbmVyIHByZXZpb3VzbHkgb3JcbiAgICAgICAgICAvLyBlbHNlIHdpbGxEZWxldGVMaXN0ZW5lciBnZXRzIGNhbGxlZCB3aGVuIHRoZXJlIHdhc24ndCBhY3R1YWxseSBhXG4gICAgICAgICAgLy8gbGlzdGVuZXIgKGUuZy4sIG9uQ2xpY2s9e251bGx9KVxuICAgICAgICAgIGRlbGV0ZUxpc3RlbmVyKHRoaXMsIHByb3BLZXkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzQ3VzdG9tQ29tcG9uZW50KHRoaXMuX3RhZywgbGFzdFByb3BzKSkge1xuICAgICAgICBpZiAoIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICAgICAgRE9NUHJvcGVydHlPcGVyYXRpb25zLmRlbGV0ZVZhbHVlRm9yQXR0cmlidXRlKGdldE5vZGUodGhpcyksIHByb3BLZXkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKERPTVByb3BlcnR5LnByb3BlcnRpZXNbcHJvcEtleV0gfHwgRE9NUHJvcGVydHkuaXNDdXN0b21BdHRyaWJ1dGUocHJvcEtleSkpIHtcbiAgICAgICAgRE9NUHJvcGVydHlPcGVyYXRpb25zLmRlbGV0ZVZhbHVlRm9yUHJvcGVydHkoZ2V0Tm9kZSh0aGlzKSwgcHJvcEtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAocHJvcEtleSBpbiBuZXh0UHJvcHMpIHtcbiAgICAgIHZhciBuZXh0UHJvcCA9IG5leHRQcm9wc1twcm9wS2V5XTtcbiAgICAgIHZhciBsYXN0UHJvcCA9IHByb3BLZXkgPT09IFNUWUxFID8gdGhpcy5fcHJldmlvdXNTdHlsZUNvcHkgOiBsYXN0UHJvcHMgIT0gbnVsbCA/IGxhc3RQcm9wc1twcm9wS2V5XSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmICghbmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8IG5leHRQcm9wID09PSBsYXN0UHJvcCB8fCBuZXh0UHJvcCA9PSBudWxsICYmIGxhc3RQcm9wID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgICAgaWYgKG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIGNoZWNrQW5kV2FybkZvck11dGF0ZWRTdHlsZSh0aGlzLl9wcmV2aW91c1N0eWxlQ29weSwgdGhpcy5fcHJldmlvdXNTdHlsZSwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9wcmV2aW91c1N0eWxlID0gbmV4dFByb3A7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5leHRQcm9wID0gdGhpcy5fcHJldmlvdXNTdHlsZUNvcHkgPSBfYXNzaWduKHt9LCBuZXh0UHJvcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fcHJldmlvdXNTdHlsZUNvcHkgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXN0UHJvcCkge1xuICAgICAgICAgIC8vIFVuc2V0IHN0eWxlcyBvbiBgbGFzdFByb3BgIGJ1dCBub3Qgb24gYG5leHRQcm9wYC5cbiAgICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0UHJvcCkge1xuICAgICAgICAgICAgaWYgKGxhc3RQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkgJiYgKCFuZXh0UHJvcCB8fCAhbmV4dFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkpIHtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0gc3R5bGVVcGRhdGVzIHx8IHt9O1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVcGRhdGUgc3R5bGVzIHRoYXQgY2hhbmdlZCBzaW5jZSBgbGFzdFByb3BgLlxuICAgICAgICAgIGZvciAoc3R5bGVOYW1lIGluIG5leHRQcm9wKSB7XG4gICAgICAgICAgICBpZiAobmV4dFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSAmJiBsYXN0UHJvcFtzdHlsZU5hbWVdICE9PSBuZXh0UHJvcFtzdHlsZU5hbWVdKSB7XG4gICAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHN0eWxlVXBkYXRlcyB8fCB7fTtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSBuZXh0UHJvcFtzdHlsZU5hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBSZWxpZXMgb24gYHVwZGF0ZVN0eWxlc0J5SURgIG5vdCBtdXRhdGluZyBgc3R5bGVVcGRhdGVzYC5cbiAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSBuZXh0UHJvcDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lTW9kdWxlcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgICBpZiAobmV4dFByb3ApIHtcbiAgICAgICAgICBlbnF1ZXVlUHV0TGlzdGVuZXIodGhpcywgcHJvcEtleSwgbmV4dFByb3AsIHRyYW5zYWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIGlmIChsYXN0UHJvcCkge1xuICAgICAgICAgIGRlbGV0ZUxpc3RlbmVyKHRoaXMsIHByb3BLZXkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzQ3VzdG9tQ29tcG9uZW50KHRoaXMuX3RhZywgbmV4dFByb3BzKSkge1xuICAgICAgICBpZiAoIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICAgICAgRE9NUHJvcGVydHlPcGVyYXRpb25zLnNldFZhbHVlRm9yQXR0cmlidXRlKGdldE5vZGUodGhpcyksIHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzW3Byb3BLZXldIHx8IERPTVByb3BlcnR5LmlzQ3VzdG9tQXR0cmlidXRlKHByb3BLZXkpKSB7XG4gICAgICAgIHZhciBub2RlID0gZ2V0Tm9kZSh0aGlzKTtcbiAgICAgICAgLy8gSWYgd2UncmUgdXBkYXRpbmcgdG8gbnVsbCBvciB1bmRlZmluZWQsIHdlIHNob3VsZCByZW1vdmUgdGhlIHByb3BlcnR5XG4gICAgICAgIC8vIGZyb20gdGhlIERPTSBub2RlIGluc3RlYWQgb2YgaW5hZHZlcnRlbnRseSBzZXR0aW5nIHRvIGEgc3RyaW5nLiBUaGlzXG4gICAgICAgIC8vIGJyaW5ncyB1cyBpbiBsaW5lIHdpdGggdGhlIHNhbWUgYmVoYXZpb3Igd2UgaGF2ZSBvbiBpbml0aWFsIHJlbmRlci5cbiAgICAgICAgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuc2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCBwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgRE9NUHJvcGVydHlPcGVyYXRpb25zLmRlbGV0ZVZhbHVlRm9yUHJvcGVydHkobm9kZSwgcHJvcEtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0eWxlVXBkYXRlcykge1xuICAgICAgQ1NTUHJvcGVydHlPcGVyYXRpb25zLnNldFZhbHVlRm9yU3R5bGVzKGdldE5vZGUodGhpcyksIHN0eWxlVXBkYXRlcywgdGhpcyk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBSZWNvbmNpbGVzIHRoZSBjaGlsZHJlbiB3aXRoIHRoZSB2YXJpb3VzIHByb3BlcnRpZXMgdGhhdCBhZmZlY3QgdGhlXG4gICAqIGNoaWxkcmVuIGNvbnRlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBsYXN0UHJvcHNcbiAgICogQHBhcmFtIHtvYmplY3R9IG5leHRQcm9wc1xuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0XG4gICAqL1xuICBfdXBkYXRlRE9NQ2hpbGRyZW46IGZ1bmN0aW9uIChsYXN0UHJvcHMsIG5leHRQcm9wcywgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHtcbiAgICB2YXIgbGFzdENvbnRlbnQgPSBDT05URU5UX1RZUEVTW3R5cGVvZiBsYXN0UHJvcHMuY2hpbGRyZW5dID8gbGFzdFByb3BzLmNoaWxkcmVuIDogbnVsbDtcbiAgICB2YXIgbmV4dENvbnRlbnQgPSBDT05URU5UX1RZUEVTW3R5cGVvZiBuZXh0UHJvcHMuY2hpbGRyZW5dID8gbmV4dFByb3BzLmNoaWxkcmVuIDogbnVsbDtcblxuICAgIHZhciBsYXN0SHRtbCA9IGxhc3RQcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAmJiBsYXN0UHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sO1xuICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAmJiBuZXh0UHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sO1xuXG4gICAgLy8gTm90ZSB0aGUgdXNlIG9mIGAhPWAgd2hpY2ggY2hlY2tzIGZvciBudWxsIG9yIHVuZGVmaW5lZC5cbiAgICB2YXIgbGFzdENoaWxkcmVuID0gbGFzdENvbnRlbnQgIT0gbnVsbCA/IG51bGwgOiBsYXN0UHJvcHMuY2hpbGRyZW47XG4gICAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRDb250ZW50ICE9IG51bGwgPyBudWxsIDogbmV4dFByb3BzLmNoaWxkcmVuO1xuXG4gICAgLy8gSWYgd2UncmUgc3dpdGNoaW5nIGZyb20gY2hpbGRyZW4gdG8gY29udGVudC9odG1sIG9yIHZpY2UgdmVyc2EsIHJlbW92ZVxuICAgIC8vIHRoZSBvbGQgY29udGVudFxuICAgIHZhciBsYXN0SGFzQ29udGVudE9ySHRtbCA9IGxhc3RDb250ZW50ICE9IG51bGwgfHwgbGFzdEh0bWwgIT0gbnVsbDtcbiAgICB2YXIgbmV4dEhhc0NvbnRlbnRPckh0bWwgPSBuZXh0Q29udGVudCAhPSBudWxsIHx8IG5leHRIdG1sICE9IG51bGw7XG4gICAgaWYgKGxhc3RDaGlsZHJlbiAhPSBudWxsICYmIG5leHRDaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuKG51bGwsIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcbiAgICB9IGVsc2UgaWYgKGxhc3RIYXNDb250ZW50T3JIdG1sICYmICFuZXh0SGFzQ29udGVudE9ySHRtbCkge1xuICAgICAgdGhpcy51cGRhdGVUZXh0Q29udGVudCgnJyk7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25TZXRDaGlsZHJlbih0aGlzLl9kZWJ1Z0lELCBbXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5leHRDb250ZW50ICE9IG51bGwpIHtcbiAgICAgIGlmIChsYXN0Q29udGVudCAhPT0gbmV4dENvbnRlbnQpIHtcbiAgICAgICAgdGhpcy51cGRhdGVUZXh0Q29udGVudCgnJyArIG5leHRDb250ZW50KTtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBzZXRBbmRWYWxpZGF0ZUNvbnRlbnRDaGlsZERldi5jYWxsKHRoaXMsIG5leHRDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgaWYgKGxhc3RIdG1sICE9PSBuZXh0SHRtbCkge1xuICAgICAgICB0aGlzLnVwZGF0ZU1hcmt1cCgnJyArIG5leHRIdG1sKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblNldENoaWxkcmVuKHRoaXMuX2RlYnVnSUQsIFtdKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5leHRDaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBzZXRBbmRWYWxpZGF0ZUNvbnRlbnRDaGlsZERldi5jYWxsKHRoaXMsIG51bGwpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuKG5leHRDaGlsZHJlbiwgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgIH1cbiAgfSxcblxuICBnZXRIb3N0Tm9kZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXROb2RlKHRoaXMpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyBhbGwgZXZlbnQgcmVnaXN0cmF0aW9ucyBmb3IgdGhpcyBpbnN0YW5jZS4gRG9lcyBub3QgcmVtb3ZlIGZyb21cbiAgICogdGhlIERPTS4gVGhhdCBtdXN0IGJlIGRvbmUgYnkgdGhlIHBhcmVudC5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICB1bm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoc2FmZWx5KSB7XG4gICAgc3dpdGNoICh0aGlzLl90YWcpIHtcbiAgICAgIGNhc2UgJ2F1ZGlvJzpcbiAgICAgIGNhc2UgJ2Zvcm0nOlxuICAgICAgY2FzZSAnaWZyYW1lJzpcbiAgICAgIGNhc2UgJ2ltZyc6XG4gICAgICBjYXNlICdsaW5rJzpcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICBjYXNlICdzb3VyY2UnOlxuICAgICAgY2FzZSAndmlkZW8nOlxuICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fd3JhcHBlclN0YXRlLmxpc3RlbmVycztcbiAgICAgICAgaWYgKGxpc3RlbmVycykge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnNbaV0ucmVtb3ZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICBjYXNlICdoZWFkJzpcbiAgICAgIGNhc2UgJ2JvZHknOlxuICAgICAgICAvKipcbiAgICAgICAgICogQ29tcG9uZW50cyBsaWtlIDxodG1sPiA8aGVhZD4gYW5kIDxib2R5PiBjYW4ndCBiZSByZW1vdmVkIG9yIGFkZGVkXG4gICAgICAgICAqIGVhc2lseSBpbiBhIGNyb3NzLWJyb3dzZXIgd2F5LCBob3dldmVyIGl0J3MgdmFsdWFibGUgdG8gYmUgYWJsZSB0b1xuICAgICAgICAgKiB0YWtlIGFkdmFudGFnZSBvZiBSZWFjdCdzIHJlY29uY2lsaWF0aW9uIGZvciBzdHlsaW5nIGFuZCA8dGl0bGU+XG4gICAgICAgICAqIG1hbmFnZW1lbnQuIFNvIHdlIGp1c3QgZG9jdW1lbnQgaXQgYW5kIHRocm93IGluIGRhbmdlcm91cyBjYXNlcy5cbiAgICAgICAgICovXG4gICAgICAgICFmYWxzZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICc8JXM+IHRyaWVkIHRvIHVubW91bnQuIEJlY2F1c2Ugb2YgY3Jvc3MtYnJvd3NlciBxdWlya3MgaXQgaXMgaW1wb3NzaWJsZSB0byB1bm1vdW50IHNvbWUgdG9wLWxldmVsIGNvbXBvbmVudHMgKGVnIDxodG1sPiwgPGhlYWQ+LCBhbmQgPGJvZHk+KSByZWxpYWJseSBhbmQgZWZmaWNpZW50bHkuIFRvIGZpeCB0aGlzLCBoYXZlIGEgc2luZ2xlIHRvcC1sZXZlbCBjb21wb25lbnQgdGhhdCBuZXZlciB1bm1vdW50cyByZW5kZXIgdGhlc2UgZWxlbWVudHMuJywgdGhpcy5fdGFnKSA6IF9wcm9kSW52YXJpYW50KCc2NicsIHRoaXMuX3RhZykgOiB2b2lkIDA7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMudW5tb3VudENoaWxkcmVuKHNhZmVseSk7XG4gICAgUmVhY3RET01Db21wb25lbnRUcmVlLnVuY2FjaGVOb2RlKHRoaXMpO1xuICAgIEV2ZW50UGx1Z2luSHViLmRlbGV0ZUFsbExpc3RlbmVycyh0aGlzKTtcbiAgICB0aGlzLl9yb290Tm9kZUlEID0gMDtcbiAgICB0aGlzLl9kb21JRCA9IDA7XG4gICAgdGhpcy5fd3JhcHBlclN0YXRlID0gbnVsbDtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBzZXRBbmRWYWxpZGF0ZUNvbnRlbnRDaGlsZERldi5jYWxsKHRoaXMsIG51bGwpO1xuICAgIH1cbiAgfSxcblxuICBnZXRQdWJsaWNJbnN0YW5jZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXROb2RlKHRoaXMpO1xuICB9XG5cbn07XG5cbl9hc3NpZ24oUmVhY3RET01Db21wb25lbnQucHJvdG90eXBlLCBSZWFjdERPTUNvbXBvbmVudC5NaXhpbiwgUmVhY3RNdWx0aUNoaWxkLk1peGluKTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUNvbXBvbmVudDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdERPTUNvbXBvbmVudC5qc1xuLy8gbW9kdWxlIGlkID0gMjY1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 266 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar ReactDOMComponentTree = __webpack_require__(207);\n\nvar focusNode = __webpack_require__(267);\n\nvar AutoFocusUtils = {\n  focusDOMComponent: function () {\n    focusNode(ReactDOMComponentTree.getNodeFromInstance(this));\n  }\n};\n\nmodule.exports = AutoFocusUtils;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0F1dG9Gb2N1c1V0aWxzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xuXG52YXIgZm9jdXNOb2RlID0gcmVxdWlyZSgnZmJqcy9saWIvZm9jdXNOb2RlJyk7XG5cbnZhciBBdXRvRm9jdXNVdGlscyA9IHtcbiAgZm9jdXNET01Db21wb25lbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICBmb2N1c05vZGUoUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UodGhpcykpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEF1dG9Gb2N1c1V0aWxzO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL0F1dG9Gb2N1c1V0aWxzLmpzXG4vLyBtb2R1bGUgaWQgPSAyNjZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 267 */
/***/ function(module, exports) {

    eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\n/**\n * @param {DOMElement} node input/textarea to focus\n */\n\nfunction focusNode(node) {\n  // IE8 can throw \"Can't move focus to the control because it is invisible,\n  // not enabled, or of a type that does not accept the focus.\" for all kinds of\n  // reasons that are too expensive and fragile to test.\n  try {\n    node.focus();\n  } catch (e) {}\n}\n\nmodule.exports = focusNode;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9mb2N1c05vZGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlIGlucHV0L3RleHRhcmVhIHRvIGZvY3VzXG4gKi9cblxuZnVuY3Rpb24gZm9jdXNOb2RlKG5vZGUpIHtcbiAgLy8gSUU4IGNhbiB0aHJvdyBcIkNhbid0IG1vdmUgZm9jdXMgdG8gdGhlIGNvbnRyb2wgYmVjYXVzZSBpdCBpcyBpbnZpc2libGUsXG4gIC8vIG5vdCBlbmFibGVkLCBvciBvZiBhIHR5cGUgdGhhdCBkb2VzIG5vdCBhY2NlcHQgdGhlIGZvY3VzLlwiIGZvciBhbGwga2luZHMgb2ZcbiAgLy8gcmVhc29ucyB0aGF0IGFyZSB0b28gZXhwZW5zaXZlIGFuZCBmcmFnaWxlIHRvIHRlc3QuXG4gIHRyeSB7XG4gICAgbm9kZS5mb2N1cygpO1xuICB9IGNhdGNoIChlKSB7fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZvY3VzTm9kZTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZmJqcy9saWIvZm9jdXNOb2RlLmpzXG4vLyBtb2R1bGUgaWQgPSAyNjdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 268 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar CSSProperty = __webpack_require__(269);\nvar ExecutionEnvironment = __webpack_require__(221);\nvar ReactInstrumentation = __webpack_require__(235);\n\nvar camelizeStyleName = __webpack_require__(270);\nvar dangerousStyleValue = __webpack_require__(272);\nvar hyphenateStyleName = __webpack_require__(273);\nvar memoizeStringOnly = __webpack_require__(275);\nvar warning = __webpack_require__(183);\n\nvar processStyleName = memoizeStringOnly(function (styleName) {\n  return hyphenateStyleName(styleName);\n});\n\nvar hasShorthandPropertyBug = false;\nvar styleFloatAccessor = 'cssFloat';\nif (ExecutionEnvironment.canUseDOM) {\n  var tempStyle = document.createElement('div').style;\n  try {\n    // IE8 throws \"Invalid argument.\" if resetting shorthand style properties.\n    tempStyle.font = '';\n  } catch (e) {\n    hasShorthandPropertyBug = true;\n  }\n  // IE8 only supports accessing cssFloat (standard) as styleFloat\n  if (document.documentElement.style.cssFloat === undefined) {\n    styleFloatAccessor = 'styleFloat';\n  }\n}\n\nif (true) {\n  // 'msTransform' is correct, but the other prefixes should be capitalized\n  var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;\n\n  // style values shouldn't contain a semicolon\n  var badStyleValueWithSemicolonPattern = /;\\s*$/;\n\n  var warnedStyleNames = {};\n  var warnedStyleValues = {};\n  var warnedForNaNValue = false;\n\n  var warnHyphenatedStyleName = function (name, owner) {\n    if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {\n      return;\n    }\n\n    warnedStyleNames[name] = true;\n     true ? warning(false, 'Unsupported style property %s. Did you mean %s?%s', name, camelizeStyleName(name), checkRenderMessage(owner)) : void 0;\n  };\n\n  var warnBadVendoredStyleName = function (name, owner) {\n    if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {\n      return;\n    }\n\n    warnedStyleNames[name] = true;\n     true ? warning(false, 'Unsupported vendor-prefixed style property %s. Did you mean %s?%s', name, name.charAt(0).toUpperCase() + name.slice(1), checkRenderMessage(owner)) : void 0;\n  };\n\n  var warnStyleValueWithSemicolon = function (name, value, owner) {\n    if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {\n      return;\n    }\n\n    warnedStyleValues[value] = true;\n     true ? warning(false, 'Style property values shouldn\\'t contain a semicolon.%s ' + 'Try \"%s: %s\" instead.', checkRenderMessage(owner), name, value.replace(badStyleValueWithSemicolonPattern, '')) : void 0;\n  };\n\n  var warnStyleValueIsNaN = function (name, value, owner) {\n    if (warnedForNaNValue) {\n      return;\n    }\n\n    warnedForNaNValue = true;\n     true ? warning(false, '`NaN` is an invalid value for the `%s` css style property.%s', name, checkRenderMessage(owner)) : void 0;\n  };\n\n  var checkRenderMessage = function (owner) {\n    if (owner) {\n      var name = owner.getName();\n      if (name) {\n        return ' Check the render method of `' + name + '`.';\n      }\n    }\n    return '';\n  };\n\n  /**\n   * @param {string} name\n   * @param {*} value\n   * @param {ReactDOMComponent} component\n   */\n  var warnValidStyle = function (name, value, component) {\n    var owner;\n    if (component) {\n      owner = component._currentElement._owner;\n    }\n    if (name.indexOf('-') > -1) {\n      warnHyphenatedStyleName(name, owner);\n    } else if (badVendoredStyleNamePattern.test(name)) {\n      warnBadVendoredStyleName(name, owner);\n    } else if (badStyleValueWithSemicolonPattern.test(value)) {\n      warnStyleValueWithSemicolon(name, value, owner);\n    }\n\n    if (typeof value === 'number' && isNaN(value)) {\n      warnStyleValueIsNaN(name, value, owner);\n    }\n  };\n}\n\n/**\n * Operations for dealing with CSS properties.\n */\nvar CSSPropertyOperations = {\n\n  /**\n   * Serializes a mapping of style properties for use as inline styles:\n   *\n   *   > createMarkupForStyles({width: '200px', height: 0})\n   *   \"width:200px;height:0;\"\n   *\n   * Undefined values are ignored so that declarative programming is easier.\n   * The result should be HTML-escaped before insertion into the DOM.\n   *\n   * @param {object} styles\n   * @param {ReactDOMComponent} component\n   * @return {?string}\n   */\n  createMarkupForStyles: function (styles, component) {\n    var serialized = '';\n    for (var styleName in styles) {\n      if (!styles.hasOwnProperty(styleName)) {\n        continue;\n      }\n      var styleValue = styles[styleName];\n      if (true) {\n        warnValidStyle(styleName, styleValue, component);\n      }\n      if (styleValue != null) {\n        serialized += processStyleName(styleName) + ':';\n        serialized += dangerousStyleValue(styleName, styleValue, component) + ';';\n      }\n    }\n    return serialized || null;\n  },\n\n  /**\n   * Sets the value for multiple styles on a node.  If a value is specified as\n   * '' (empty string), the corresponding style property will be unset.\n   *\n   * @param {DOMElement} node\n   * @param {object} styles\n   * @param {ReactDOMComponent} component\n   */\n  setValueForStyles: function (node, styles, component) {\n    if (true) {\n      ReactInstrumentation.debugTool.onHostOperation({\n        instanceID: component._debugID,\n        type: 'update styles',\n        payload: styles\n      });\n    }\n\n    var style = node.style;\n    for (var styleName in styles) {\n      if (!styles.hasOwnProperty(styleName)) {\n        continue;\n      }\n      if (true) {\n        warnValidStyle(styleName, styles[styleName], component);\n      }\n      var styleValue = dangerousStyleValue(styleName, styles[styleName], component);\n      if (styleName === 'float' || styleName === 'cssFloat') {\n        styleName = styleFloatAccessor;\n      }\n      if (styleValue) {\n        style[styleName] = styleValue;\n      } else {\n        var expansion = hasShorthandPropertyBug && CSSProperty.shorthandPropertyExpansions[styleName];\n        if (expansion) {\n          // Shorthand property that IE8 won't like unsetting, so unset each\n          // component to placate it\n          for (var individualStyleName in expansion) {\n            style[individualStyleName] = '';\n          }\n        } else {\n          style[styleName] = '';\n        }\n      }\n    }\n  }\n\n};\n\nmodule.exports = CSSPropertyOperations;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0NTU1Byb3BlcnR5T3BlcmF0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ1NTUHJvcGVydHkgPSByZXF1aXJlKCcuL0NTU1Byb3BlcnR5Jyk7XG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xudmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xuXG52YXIgY2FtZWxpemVTdHlsZU5hbWUgPSByZXF1aXJlKCdmYmpzL2xpYi9jYW1lbGl6ZVN0eWxlTmFtZScpO1xudmFyIGRhbmdlcm91c1N0eWxlVmFsdWUgPSByZXF1aXJlKCcuL2Rhbmdlcm91c1N0eWxlVmFsdWUnKTtcbnZhciBoeXBoZW5hdGVTdHlsZU5hbWUgPSByZXF1aXJlKCdmYmpzL2xpYi9oeXBoZW5hdGVTdHlsZU5hbWUnKTtcbnZhciBtZW1vaXplU3RyaW5nT25seSA9IHJlcXVpcmUoJ2ZianMvbGliL21lbW9pemVTdHJpbmdPbmx5Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIHByb2Nlc3NTdHlsZU5hbWUgPSBtZW1vaXplU3RyaW5nT25seShmdW5jdGlvbiAoc3R5bGVOYW1lKSB7XG4gIHJldHVybiBoeXBoZW5hdGVTdHlsZU5hbWUoc3R5bGVOYW1lKTtcbn0pO1xuXG52YXIgaGFzU2hvcnRoYW5kUHJvcGVydHlCdWcgPSBmYWxzZTtcbnZhciBzdHlsZUZsb2F0QWNjZXNzb3IgPSAnY3NzRmxvYXQnO1xuaWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkge1xuICB2YXIgdGVtcFN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGU7XG4gIHRyeSB7XG4gICAgLy8gSUU4IHRocm93cyBcIkludmFsaWQgYXJndW1lbnQuXCIgaWYgcmVzZXR0aW5nIHNob3J0aGFuZCBzdHlsZSBwcm9wZXJ0aWVzLlxuICAgIHRlbXBTdHlsZS5mb250ID0gJyc7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBoYXNTaG9ydGhhbmRQcm9wZXJ0eUJ1ZyA9IHRydWU7XG4gIH1cbiAgLy8gSUU4IG9ubHkgc3VwcG9ydHMgYWNjZXNzaW5nIGNzc0Zsb2F0IChzdGFuZGFyZCkgYXMgc3R5bGVGbG9hdFxuICBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmNzc0Zsb2F0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdHlsZUZsb2F0QWNjZXNzb3IgPSAnc3R5bGVGbG9hdCc7XG4gIH1cbn1cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgLy8gJ21zVHJhbnNmb3JtJyBpcyBjb3JyZWN0LCBidXQgdGhlIG90aGVyIHByZWZpeGVzIHNob3VsZCBiZSBjYXBpdGFsaXplZFxuICB2YXIgYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuID0gL14oPzp3ZWJraXR8bW96fG8pW0EtWl0vO1xuXG4gIC8vIHN0eWxlIHZhbHVlcyBzaG91bGRuJ3QgY29udGFpbiBhIHNlbWljb2xvblxuICB2YXIgYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuID0gLztcXHMqJC87XG5cbiAgdmFyIHdhcm5lZFN0eWxlTmFtZXMgPSB7fTtcbiAgdmFyIHdhcm5lZFN0eWxlVmFsdWVzID0ge307XG4gIHZhciB3YXJuZWRGb3JOYU5WYWx1ZSA9IGZhbHNlO1xuXG4gIHZhciB3YXJuSHlwaGVuYXRlZFN0eWxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lLCBvd25lcikge1xuICAgIGlmICh3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZU5hbWVzW25hbWVdID0gdHJ1ZTtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1Vuc3VwcG9ydGVkIHN0eWxlIHByb3BlcnR5ICVzLiBEaWQgeW91IG1lYW4gJXM/JXMnLCBuYW1lLCBjYW1lbGl6ZVN0eWxlTmFtZShuYW1lKSwgY2hlY2tSZW5kZXJNZXNzYWdlKG93bmVyKSkgOiB2b2lkIDA7XG4gIH07XG5cbiAgdmFyIHdhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lLCBvd25lcikge1xuICAgIGlmICh3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZU5hbWVzW25hbWVdID0gdHJ1ZTtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1Vuc3VwcG9ydGVkIHZlbmRvci1wcmVmaXhlZCBzdHlsZSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzPyVzJywgbmFtZSwgbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSksIGNoZWNrUmVuZGVyTWVzc2FnZShvd25lcikpIDogdm9pZCAwO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZVdpdGhTZW1pY29sb24gPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIG93bmVyKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlVmFsdWVzLmhhc093blByb3BlcnR5KHZhbHVlKSAmJiB3YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV0gPSB0cnVlO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnU3R5bGUgcHJvcGVydHkgdmFsdWVzIHNob3VsZG5cXCd0IGNvbnRhaW4gYSBzZW1pY29sb24uJXMgJyArICdUcnkgXCIlczogJXNcIiBpbnN0ZWFkLicsIGNoZWNrUmVuZGVyTWVzc2FnZShvd25lciksIG5hbWUsIHZhbHVlLnJlcGxhY2UoYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuLCAnJykpIDogdm9pZCAwO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZUlzTmFOID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBvd25lcikge1xuICAgIGlmICh3YXJuZWRGb3JOYU5WYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZEZvck5hTlZhbHVlID0gdHJ1ZTtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2BOYU5gIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBgJXNgIGNzcyBzdHlsZSBwcm9wZXJ0eS4lcycsIG5hbWUsIGNoZWNrUmVuZGVyTWVzc2FnZShvd25lcikpIDogdm9pZCAwO1xuICB9O1xuXG4gIHZhciBjaGVja1JlbmRlck1lc3NhZ2UgPSBmdW5jdGlvbiAob3duZXIpIHtcbiAgICBpZiAob3duZXIpIHtcbiAgICAgIHZhciBuYW1lID0gb3duZXIuZ2V0TmFtZSgpO1xuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7UmVhY3RET01Db21wb25lbnR9IGNvbXBvbmVudFxuICAgKi9cbiAgdmFyIHdhcm5WYWxpZFN0eWxlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBjb21wb25lbnQpIHtcbiAgICB2YXIgb3duZXI7XG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgb3duZXIgPSBjb21wb25lbnQuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjtcbiAgICB9XG4gICAgaWYgKG5hbWUuaW5kZXhPZignLScpID4gLTEpIHtcbiAgICAgIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lKG5hbWUsIG93bmVyKTtcbiAgICB9IGVsc2UgaWYgKGJhZFZlbmRvcmVkU3R5bGVOYW1lUGF0dGVybi50ZXN0KG5hbWUpKSB7XG4gICAgICB3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUobmFtZSwgb3duZXIpO1xuICAgIH0gZWxzZSBpZiAoYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICB3YXJuU3R5bGVWYWx1ZVdpdGhTZW1pY29sb24obmFtZSwgdmFsdWUsIG93bmVyKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWx1ZSkpIHtcbiAgICAgIHdhcm5TdHlsZVZhbHVlSXNOYU4obmFtZSwgdmFsdWUsIG93bmVyKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogT3BlcmF0aW9ucyBmb3IgZGVhbGluZyB3aXRoIENTUyBwcm9wZXJ0aWVzLlxuICovXG52YXIgQ1NTUHJvcGVydHlPcGVyYXRpb25zID0ge1xuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWFwcGluZyBvZiBzdHlsZSBwcm9wZXJ0aWVzIGZvciB1c2UgYXMgaW5saW5lIHN0eWxlczpcbiAgICpcbiAgICogICA+IGNyZWF0ZU1hcmt1cEZvclN0eWxlcyh7d2lkdGg6ICcyMDBweCcsIGhlaWdodDogMH0pXG4gICAqICAgXCJ3aWR0aDoyMDBweDtoZWlnaHQ6MDtcIlxuICAgKlxuICAgKiBVbmRlZmluZWQgdmFsdWVzIGFyZSBpZ25vcmVkIHNvIHRoYXQgZGVjbGFyYXRpdmUgcHJvZ3JhbW1pbmcgaXMgZWFzaWVyLlxuICAgKiBUaGUgcmVzdWx0IHNob3VsZCBiZSBIVE1MLWVzY2FwZWQgYmVmb3JlIGluc2VydGlvbiBpbnRvIHRoZSBET00uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzdHlsZXNcbiAgICogQHBhcmFtIHtSZWFjdERPTUNvbXBvbmVudH0gY29tcG9uZW50XG4gICAqIEByZXR1cm4gez9zdHJpbmd9XG4gICAqL1xuICBjcmVhdGVNYXJrdXBGb3JTdHlsZXM6IGZ1bmN0aW9uIChzdHlsZXMsIGNvbXBvbmVudCkge1xuICAgIHZhciBzZXJpYWxpemVkID0gJyc7XG4gICAgZm9yICh2YXIgc3R5bGVOYW1lIGluIHN0eWxlcykge1xuICAgICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBzdHlsZVZhbHVlID0gc3R5bGVzW3N0eWxlTmFtZV07XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB3YXJuVmFsaWRTdHlsZShzdHlsZU5hbWUsIHN0eWxlVmFsdWUsIGNvbXBvbmVudCk7XG4gICAgICB9XG4gICAgICBpZiAoc3R5bGVWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gcHJvY2Vzc1N0eWxlTmFtZShzdHlsZU5hbWUpICsgJzonO1xuICAgICAgICBzZXJpYWxpemVkICs9IGRhbmdlcm91c1N0eWxlVmFsdWUoc3R5bGVOYW1lLCBzdHlsZVZhbHVlLCBjb21wb25lbnQpICsgJzsnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2VyaWFsaXplZCB8fCBudWxsO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgbXVsdGlwbGUgc3R5bGVzIG9uIGEgbm9kZS4gIElmIGEgdmFsdWUgaXMgc3BlY2lmaWVkIGFzXG4gICAqICcnIChlbXB0eSBzdHJpbmcpLCB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBwcm9wZXJ0eSB3aWxsIGJlIHVuc2V0LlxuICAgKlxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAgICogQHBhcmFtIHtvYmplY3R9IHN0eWxlc1xuICAgKiBAcGFyYW0ge1JlYWN0RE9NQ29tcG9uZW50fSBjb21wb25lbnRcbiAgICovXG4gIHNldFZhbHVlRm9yU3R5bGVzOiBmdW5jdGlvbiAobm9kZSwgc3R5bGVzLCBjb21wb25lbnQpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgIGluc3RhbmNlSUQ6IGNvbXBvbmVudC5fZGVidWdJRCxcbiAgICAgICAgdHlwZTogJ3VwZGF0ZSBzdHlsZXMnLFxuICAgICAgICBwYXlsb2FkOiBzdHlsZXNcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBzdHlsZSA9IG5vZGUuc3R5bGU7XG4gICAgZm9yICh2YXIgc3R5bGVOYW1lIGluIHN0eWxlcykge1xuICAgICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHdhcm5WYWxpZFN0eWxlKHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0sIGNvbXBvbmVudCk7XG4gICAgICB9XG4gICAgICB2YXIgc3R5bGVWYWx1ZSA9IGRhbmdlcm91c1N0eWxlVmFsdWUoc3R5bGVOYW1lLCBzdHlsZXNbc3R5bGVOYW1lXSwgY29tcG9uZW50KTtcbiAgICAgIGlmIChzdHlsZU5hbWUgPT09ICdmbG9hdCcgfHwgc3R5bGVOYW1lID09PSAnY3NzRmxvYXQnKSB7XG4gICAgICAgIHN0eWxlTmFtZSA9IHN0eWxlRmxvYXRBY2Nlc3NvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzdHlsZVZhbHVlKSB7XG4gICAgICAgIHN0eWxlW3N0eWxlTmFtZV0gPSBzdHlsZVZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGV4cGFuc2lvbiA9IGhhc1Nob3J0aGFuZFByb3BlcnR5QnVnICYmIENTU1Byb3BlcnR5LnNob3J0aGFuZFByb3BlcnR5RXhwYW5zaW9uc1tzdHlsZU5hbWVdO1xuICAgICAgICBpZiAoZXhwYW5zaW9uKSB7XG4gICAgICAgICAgLy8gU2hvcnRoYW5kIHByb3BlcnR5IHRoYXQgSUU4IHdvbid0IGxpa2UgdW5zZXR0aW5nLCBzbyB1bnNldCBlYWNoXG4gICAgICAgICAgLy8gY29tcG9uZW50IHRvIHBsYWNhdGUgaXRcbiAgICAgICAgICBmb3IgKHZhciBpbmRpdmlkdWFsU3R5bGVOYW1lIGluIGV4cGFuc2lvbikge1xuICAgICAgICAgICAgc3R5bGVbaW5kaXZpZHVhbFN0eWxlTmFtZV0gPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3R5bGVbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ1NTUHJvcGVydHlPcGVyYXRpb25zO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL0NTU1Byb3BlcnR5T3BlcmF0aW9ucy5qc1xuLy8gbW9kdWxlIGlkID0gMjY4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 269 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\n/**\n * CSS properties which accept numbers but are not in units of \"px\".\n */\n\nvar isUnitlessNumber = {\n  animationIterationCount: true,\n  borderImageOutset: true,\n  borderImageSlice: true,\n  borderImageWidth: true,\n  boxFlex: true,\n  boxFlexGroup: true,\n  boxOrdinalGroup: true,\n  columnCount: true,\n  flex: true,\n  flexGrow: true,\n  flexPositive: true,\n  flexShrink: true,\n  flexNegative: true,\n  flexOrder: true,\n  gridRow: true,\n  gridColumn: true,\n  fontWeight: true,\n  lineClamp: true,\n  lineHeight: true,\n  opacity: true,\n  order: true,\n  orphans: true,\n  tabSize: true,\n  widows: true,\n  zIndex: true,\n  zoom: true,\n\n  // SVG-related properties\n  fillOpacity: true,\n  floodOpacity: true,\n  stopOpacity: true,\n  strokeDasharray: true,\n  strokeDashoffset: true,\n  strokeMiterlimit: true,\n  strokeOpacity: true,\n  strokeWidth: true\n};\n\n/**\n * @param {string} prefix vendor-specific prefix, eg: Webkit\n * @param {string} key style name, eg: transitionDuration\n * @return {string} style name prefixed with `prefix`, properly camelCased, eg:\n * WebkitTransitionDuration\n */\nfunction prefixKey(prefix, key) {\n  return prefix + key.charAt(0).toUpperCase() + key.substring(1);\n}\n\n/**\n * Support style names that may come passed in prefixed by adding permutations\n * of vendor prefixes.\n */\nvar prefixes = ['Webkit', 'ms', 'Moz', 'O'];\n\n// Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an\n// infinite loop, because it iterates over the newly added props too.\nObject.keys(isUnitlessNumber).forEach(function (prop) {\n  prefixes.forEach(function (prefix) {\n    isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];\n  });\n});\n\n/**\n * Most style properties can be unset by doing .style[prop] = '' but IE8\n * doesn't like doing that with shorthand properties so for the properties that\n * IE8 breaks on, which are listed here, we instead unset each of the\n * individual properties. See http://bugs.jquery.com/ticket/12385.\n * The 4-value 'clock' properties like margin, padding, border-width seem to\n * behave without any problems. Curiously, list-style works too without any\n * special prodding.\n */\nvar shorthandPropertyExpansions = {\n  background: {\n    backgroundAttachment: true,\n    backgroundColor: true,\n    backgroundImage: true,\n    backgroundPositionX: true,\n    backgroundPositionY: true,\n    backgroundRepeat: true\n  },\n  backgroundPosition: {\n    backgroundPositionX: true,\n    backgroundPositionY: true\n  },\n  border: {\n    borderWidth: true,\n    borderStyle: true,\n    borderColor: true\n  },\n  borderBottom: {\n    borderBottomWidth: true,\n    borderBottomStyle: true,\n    borderBottomColor: true\n  },\n  borderLeft: {\n    borderLeftWidth: true,\n    borderLeftStyle: true,\n    borderLeftColor: true\n  },\n  borderRight: {\n    borderRightWidth: true,\n    borderRightStyle: true,\n    borderRightColor: true\n  },\n  borderTop: {\n    borderTopWidth: true,\n    borderTopStyle: true,\n    borderTopColor: true\n  },\n  font: {\n    fontStyle: true,\n    fontVariant: true,\n    fontWeight: true,\n    fontSize: true,\n    lineHeight: true,\n    fontFamily: true\n  },\n  outline: {\n    outlineWidth: true,\n    outlineStyle: true,\n    outlineColor: true\n  }\n};\n\nvar CSSProperty = {\n  isUnitlessNumber: isUnitlessNumber,\n  shorthandPropertyExpansions: shorthandPropertyExpansions\n};\n\nmodule.exports = CSSProperty;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0NTU1Byb3BlcnR5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ1NTIHByb3BlcnRpZXMgd2hpY2ggYWNjZXB0IG51bWJlcnMgYnV0IGFyZSBub3QgaW4gdW5pdHMgb2YgXCJweFwiLlxuICovXG5cbnZhciBpc1VuaXRsZXNzTnVtYmVyID0ge1xuICBhbmltYXRpb25JdGVyYXRpb25Db3VudDogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VPdXRzZXQ6IHRydWUsXG4gIGJvcmRlckltYWdlU2xpY2U6IHRydWUsXG4gIGJvcmRlckltYWdlV2lkdGg6IHRydWUsXG4gIGJveEZsZXg6IHRydWUsXG4gIGJveEZsZXhHcm91cDogdHJ1ZSxcbiAgYm94T3JkaW5hbEdyb3VwOiB0cnVlLFxuICBjb2x1bW5Db3VudDogdHJ1ZSxcbiAgZmxleDogdHJ1ZSxcbiAgZmxleEdyb3c6IHRydWUsXG4gIGZsZXhQb3NpdGl2ZTogdHJ1ZSxcbiAgZmxleFNocmluazogdHJ1ZSxcbiAgZmxleE5lZ2F0aXZlOiB0cnVlLFxuICBmbGV4T3JkZXI6IHRydWUsXG4gIGdyaWRSb3c6IHRydWUsXG4gIGdyaWRDb2x1bW46IHRydWUsXG4gIGZvbnRXZWlnaHQ6IHRydWUsXG4gIGxpbmVDbGFtcDogdHJ1ZSxcbiAgbGluZUhlaWdodDogdHJ1ZSxcbiAgb3BhY2l0eTogdHJ1ZSxcbiAgb3JkZXI6IHRydWUsXG4gIG9ycGhhbnM6IHRydWUsXG4gIHRhYlNpemU6IHRydWUsXG4gIHdpZG93czogdHJ1ZSxcbiAgekluZGV4OiB0cnVlLFxuICB6b29tOiB0cnVlLFxuXG4gIC8vIFNWRy1yZWxhdGVkIHByb3BlcnRpZXNcbiAgZmlsbE9wYWNpdHk6IHRydWUsXG4gIGZsb29kT3BhY2l0eTogdHJ1ZSxcbiAgc3RvcE9wYWNpdHk6IHRydWUsXG4gIHN0cm9rZURhc2hhcnJheTogdHJ1ZSxcbiAgc3Ryb2tlRGFzaG9mZnNldDogdHJ1ZSxcbiAgc3Ryb2tlTWl0ZXJsaW1pdDogdHJ1ZSxcbiAgc3Ryb2tlT3BhY2l0eTogdHJ1ZSxcbiAgc3Ryb2tlV2lkdGg6IHRydWVcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeCB2ZW5kb3Itc3BlY2lmaWMgcHJlZml4LCBlZzogV2Via2l0XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHN0eWxlIG5hbWUsIGVnOiB0cmFuc2l0aW9uRHVyYXRpb25cbiAqIEByZXR1cm4ge3N0cmluZ30gc3R5bGUgbmFtZSBwcmVmaXhlZCB3aXRoIGBwcmVmaXhgLCBwcm9wZXJseSBjYW1lbENhc2VkLCBlZzpcbiAqIFdlYmtpdFRyYW5zaXRpb25EdXJhdGlvblxuICovXG5mdW5jdGlvbiBwcmVmaXhLZXkocHJlZml4LCBrZXkpIHtcbiAgcmV0dXJuIHByZWZpeCArIGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zdWJzdHJpbmcoMSk7XG59XG5cbi8qKlxuICogU3VwcG9ydCBzdHlsZSBuYW1lcyB0aGF0IG1heSBjb21lIHBhc3NlZCBpbiBwcmVmaXhlZCBieSBhZGRpbmcgcGVybXV0YXRpb25zXG4gKiBvZiB2ZW5kb3IgcHJlZml4ZXMuXG4gKi9cbnZhciBwcmVmaXhlcyA9IFsnV2Via2l0JywgJ21zJywgJ01veicsICdPJ107XG5cbi8vIFVzaW5nIE9iamVjdC5rZXlzIGhlcmUsIG9yIGVsc2UgdGhlIHZhbmlsbGEgZm9yLWluIGxvb3AgbWFrZXMgSUU4IGdvIGludG8gYW5cbi8vIGluZmluaXRlIGxvb3AsIGJlY2F1c2UgaXQgaXRlcmF0ZXMgb3ZlciB0aGUgbmV3bHkgYWRkZWQgcHJvcHMgdG9vLlxuT2JqZWN0LmtleXMoaXNVbml0bGVzc051bWJlcikuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICBwcmVmaXhlcy5mb3JFYWNoKGZ1bmN0aW9uIChwcmVmaXgpIHtcbiAgICBpc1VuaXRsZXNzTnVtYmVyW3ByZWZpeEtleShwcmVmaXgsIHByb3ApXSA9IGlzVW5pdGxlc3NOdW1iZXJbcHJvcF07XG4gIH0pO1xufSk7XG5cbi8qKlxuICogTW9zdCBzdHlsZSBwcm9wZXJ0aWVzIGNhbiBiZSB1bnNldCBieSBkb2luZyAuc3R5bGVbcHJvcF0gPSAnJyBidXQgSUU4XG4gKiBkb2Vzbid0IGxpa2UgZG9pbmcgdGhhdCB3aXRoIHNob3J0aGFuZCBwcm9wZXJ0aWVzIHNvIGZvciB0aGUgcHJvcGVydGllcyB0aGF0XG4gKiBJRTggYnJlYWtzIG9uLCB3aGljaCBhcmUgbGlzdGVkIGhlcmUsIHdlIGluc3RlYWQgdW5zZXQgZWFjaCBvZiB0aGVcbiAqIGluZGl2aWR1YWwgcHJvcGVydGllcy4gU2VlIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEyMzg1LlxuICogVGhlIDQtdmFsdWUgJ2Nsb2NrJyBwcm9wZXJ0aWVzIGxpa2UgbWFyZ2luLCBwYWRkaW5nLCBib3JkZXItd2lkdGggc2VlbSB0b1xuICogYmVoYXZlIHdpdGhvdXQgYW55IHByb2JsZW1zLiBDdXJpb3VzbHksIGxpc3Qtc3R5bGUgd29ya3MgdG9vIHdpdGhvdXQgYW55XG4gKiBzcGVjaWFsIHByb2RkaW5nLlxuICovXG52YXIgc2hvcnRoYW5kUHJvcGVydHlFeHBhbnNpb25zID0ge1xuICBiYWNrZ3JvdW5kOiB7XG4gICAgYmFja2dyb3VuZEF0dGFjaG1lbnQ6IHRydWUsXG4gICAgYmFja2dyb3VuZENvbG9yOiB0cnVlLFxuICAgIGJhY2tncm91bmRJbWFnZTogdHJ1ZSxcbiAgICBiYWNrZ3JvdW5kUG9zaXRpb25YOiB0cnVlLFxuICAgIGJhY2tncm91bmRQb3NpdGlvblk6IHRydWUsXG4gICAgYmFja2dyb3VuZFJlcGVhdDogdHJ1ZVxuICB9LFxuICBiYWNrZ3JvdW5kUG9zaXRpb246IHtcbiAgICBiYWNrZ3JvdW5kUG9zaXRpb25YOiB0cnVlLFxuICAgIGJhY2tncm91bmRQb3NpdGlvblk6IHRydWVcbiAgfSxcbiAgYm9yZGVyOiB7XG4gICAgYm9yZGVyV2lkdGg6IHRydWUsXG4gICAgYm9yZGVyU3R5bGU6IHRydWUsXG4gICAgYm9yZGVyQ29sb3I6IHRydWVcbiAgfSxcbiAgYm9yZGVyQm90dG9tOiB7XG4gICAgYm9yZGVyQm90dG9tV2lkdGg6IHRydWUsXG4gICAgYm9yZGVyQm90dG9tU3R5bGU6IHRydWUsXG4gICAgYm9yZGVyQm90dG9tQ29sb3I6IHRydWVcbiAgfSxcbiAgYm9yZGVyTGVmdDoge1xuICAgIGJvcmRlckxlZnRXaWR0aDogdHJ1ZSxcbiAgICBib3JkZXJMZWZ0U3R5bGU6IHRydWUsXG4gICAgYm9yZGVyTGVmdENvbG9yOiB0cnVlXG4gIH0sXG4gIGJvcmRlclJpZ2h0OiB7XG4gICAgYm9yZGVyUmlnaHRXaWR0aDogdHJ1ZSxcbiAgICBib3JkZXJSaWdodFN0eWxlOiB0cnVlLFxuICAgIGJvcmRlclJpZ2h0Q29sb3I6IHRydWVcbiAgfSxcbiAgYm9yZGVyVG9wOiB7XG4gICAgYm9yZGVyVG9wV2lkdGg6IHRydWUsXG4gICAgYm9yZGVyVG9wU3R5bGU6IHRydWUsXG4gICAgYm9yZGVyVG9wQ29sb3I6IHRydWVcbiAgfSxcbiAgZm9udDoge1xuICAgIGZvbnRTdHlsZTogdHJ1ZSxcbiAgICBmb250VmFyaWFudDogdHJ1ZSxcbiAgICBmb250V2VpZ2h0OiB0cnVlLFxuICAgIGZvbnRTaXplOiB0cnVlLFxuICAgIGxpbmVIZWlnaHQ6IHRydWUsXG4gICAgZm9udEZhbWlseTogdHJ1ZVxuICB9LFxuICBvdXRsaW5lOiB7XG4gICAgb3V0bGluZVdpZHRoOiB0cnVlLFxuICAgIG91dGxpbmVTdHlsZTogdHJ1ZSxcbiAgICBvdXRsaW5lQ29sb3I6IHRydWVcbiAgfVxufTtcblxudmFyIENTU1Byb3BlcnR5ID0ge1xuICBpc1VuaXRsZXNzTnVtYmVyOiBpc1VuaXRsZXNzTnVtYmVyLFxuICBzaG9ydGhhbmRQcm9wZXJ0eUV4cGFuc2lvbnM6IHNob3J0aGFuZFByb3BlcnR5RXhwYW5zaW9uc1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDU1NQcm9wZXJ0eTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9DU1NQcm9wZXJ0eS5qc1xuLy8gbW9kdWxlIGlkID0gMjY5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 270 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @typechecks\n */\n\n'use strict';\n\nvar camelize = __webpack_require__(271);\n\nvar msPattern = /^-ms-/;\n\n/**\n * Camelcases a hyphenated CSS property name, for example:\n *\n *   > camelizeStyleName('background-color')\n *   < \"backgroundColor\"\n *   > camelizeStyleName('-moz-transition')\n *   < \"MozTransition\"\n *   > camelizeStyleName('-ms-transition')\n *   < \"msTransition\"\n *\n * As Andi Smith suggests\n * (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix\n * is converted to lowercase `ms`.\n *\n * @param {string} string\n * @return {string}\n */\nfunction camelizeStyleName(string) {\n  return camelize(string.replace(msPattern, 'ms-'));\n}\n\nmodule.exports = camelizeStyleName;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9jYW1lbGl6ZVN0eWxlTmFtZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHR5cGVjaGVja3NcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBjYW1lbGl6ZSA9IHJlcXVpcmUoJy4vY2FtZWxpemUnKTtcblxudmFyIG1zUGF0dGVybiA9IC9eLW1zLS87XG5cbi8qKlxuICogQ2FtZWxjYXNlcyBhIGh5cGhlbmF0ZWQgQ1NTIHByb3BlcnR5IG5hbWUsIGZvciBleGFtcGxlOlxuICpcbiAqICAgPiBjYW1lbGl6ZVN0eWxlTmFtZSgnYmFja2dyb3VuZC1jb2xvcicpXG4gKiAgIDwgXCJiYWNrZ3JvdW5kQ29sb3JcIlxuICogICA+IGNhbWVsaXplU3R5bGVOYW1lKCctbW96LXRyYW5zaXRpb24nKVxuICogICA8IFwiTW96VHJhbnNpdGlvblwiXG4gKiAgID4gY2FtZWxpemVTdHlsZU5hbWUoJy1tcy10cmFuc2l0aW9uJylcbiAqICAgPCBcIm1zVHJhbnNpdGlvblwiXG4gKlxuICogQXMgQW5kaSBTbWl0aCBzdWdnZXN0c1xuICogKGh0dHA6Ly93d3cuYW5kaXNtaXRoLmNvbS9ibG9nLzIwMTIvMDIvbW9kZXJuaXpyLXByZWZpeGVkLyksIGFuIGAtbXNgIHByZWZpeFxuICogaXMgY29udmVydGVkIHRvIGxvd2VyY2FzZSBgbXNgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gY2FtZWxpemVTdHlsZU5hbWUoc3RyaW5nKSB7XG4gIHJldHVybiBjYW1lbGl6ZShzdHJpbmcucmVwbGFjZShtc1BhdHRlcm4sICdtcy0nKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2FtZWxpemVTdHlsZU5hbWU7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2ZianMvbGliL2NhbWVsaXplU3R5bGVOYW1lLmpzXG4vLyBtb2R1bGUgaWQgPSAyNzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 271 */
/***/ function(module, exports) {

    eval("\"use strict\";\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @typechecks\n */\n\nvar _hyphenPattern = /-(.)/g;\n\n/**\n * Camelcases a hyphenated string, for example:\n *\n *   > camelize('background-color')\n *   < \"backgroundColor\"\n *\n * @param {string} string\n * @return {string}\n */\nfunction camelize(string) {\n  return string.replace(_hyphenPattern, function (_, character) {\n    return character.toUpperCase();\n  });\n}\n\nmodule.exports = camelize;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9jYW1lbGl6ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxudmFyIF9oeXBoZW5QYXR0ZXJuID0gLy0oLikvZztcblxuLyoqXG4gKiBDYW1lbGNhc2VzIGEgaHlwaGVuYXRlZCBzdHJpbmcsIGZvciBleGFtcGxlOlxuICpcbiAqICAgPiBjYW1lbGl6ZSgnYmFja2dyb3VuZC1jb2xvcicpXG4gKiAgIDwgXCJiYWNrZ3JvdW5kQ29sb3JcIlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gY2FtZWxpemUoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZShfaHlwaGVuUGF0dGVybiwgZnVuY3Rpb24gKF8sIGNoYXJhY3Rlcikge1xuICAgIHJldHVybiBjaGFyYWN0ZXIudG9VcHBlckNhc2UoKTtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2FtZWxpemU7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2ZianMvbGliL2NhbWVsaXplLmpzXG4vLyBtb2R1bGUgaWQgPSAyNzFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 272 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar CSSProperty = __webpack_require__(269);\nvar warning = __webpack_require__(183);\n\nvar isUnitlessNumber = CSSProperty.isUnitlessNumber;\nvar styleWarnings = {};\n\n/**\n * Convert a value into the proper css writable value. The style name `name`\n * should be logical (no hyphens), as specified\n * in `CSSProperty.isUnitlessNumber`.\n *\n * @param {string} name CSS property name such as `topMargin`.\n * @param {*} value CSS property value such as `10px`.\n * @param {ReactDOMComponent} component\n * @return {string} Normalized style value with dimensions applied.\n */\nfunction dangerousStyleValue(name, value, component) {\n  // Note that we've removed escapeTextForBrowser() calls here since the\n  // whole string will be escaped when the attribute is injected into\n  // the markup. If you provide unsafe user data here they can inject\n  // arbitrary CSS which may be problematic (I couldn't repro this):\n  // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet\n  // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/\n  // This is not an XSS hole but instead a potential CSS injection issue\n  // which has lead to a greater discussion about how we're going to\n  // trust URLs moving forward. See #2115901\n\n  var isEmpty = value == null || typeof value === 'boolean' || value === '';\n  if (isEmpty) {\n    return '';\n  }\n\n  var isNonNumeric = isNaN(value);\n  if (isNonNumeric || value === 0 || isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name]) {\n    return '' + value; // cast to string\n  }\n\n  if (typeof value === 'string') {\n    if (true) {\n      // Allow '0' to pass through without warning. 0 is already special and\n      // doesn't require units, so we don't need to warn about it.\n      if (component && value !== '0') {\n        var owner = component._currentElement._owner;\n        var ownerName = owner ? owner.getName() : null;\n        if (ownerName && !styleWarnings[ownerName]) {\n          styleWarnings[ownerName] = {};\n        }\n        var warned = false;\n        if (ownerName) {\n          var warnings = styleWarnings[ownerName];\n          warned = warnings[name];\n          if (!warned) {\n            warnings[name] = true;\n          }\n        }\n        if (!warned) {\n           true ? warning(false, 'a `%s` tag (owner: `%s`) was passed a numeric string value ' + 'for CSS property `%s` (value: `%s`) which will be treated ' + 'as a unitless number in a future version of React.', component._currentElement.type, ownerName || 'unknown', name, value) : void 0;\n        }\n      }\n    }\n    value = value.trim();\n  }\n  return value + 'px';\n}\n\nmodule.exports = dangerousStyleValue;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2Rhbmdlcm91c1N0eWxlVmFsdWUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIENTU1Byb3BlcnR5ID0gcmVxdWlyZSgnLi9DU1NQcm9wZXJ0eScpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBpc1VuaXRsZXNzTnVtYmVyID0gQ1NTUHJvcGVydHkuaXNVbml0bGVzc051bWJlcjtcbnZhciBzdHlsZVdhcm5pbmdzID0ge307XG5cbi8qKlxuICogQ29udmVydCBhIHZhbHVlIGludG8gdGhlIHByb3BlciBjc3Mgd3JpdGFibGUgdmFsdWUuIFRoZSBzdHlsZSBuYW1lIGBuYW1lYFxuICogc2hvdWxkIGJlIGxvZ2ljYWwgKG5vIGh5cGhlbnMpLCBhcyBzcGVjaWZpZWRcbiAqIGluIGBDU1NQcm9wZXJ0eS5pc1VuaXRsZXNzTnVtYmVyYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBDU1MgcHJvcGVydHkgbmFtZSBzdWNoIGFzIGB0b3BNYXJnaW5gLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBDU1MgcHJvcGVydHkgdmFsdWUgc3VjaCBhcyBgMTBweGAuXG4gKiBAcGFyYW0ge1JlYWN0RE9NQ29tcG9uZW50fSBjb21wb25lbnRcbiAqIEByZXR1cm4ge3N0cmluZ30gTm9ybWFsaXplZCBzdHlsZSB2YWx1ZSB3aXRoIGRpbWVuc2lvbnMgYXBwbGllZC5cbiAqL1xuZnVuY3Rpb24gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShuYW1lLCB2YWx1ZSwgY29tcG9uZW50KSB7XG4gIC8vIE5vdGUgdGhhdCB3ZSd2ZSByZW1vdmVkIGVzY2FwZVRleHRGb3JCcm93c2VyKCkgY2FsbHMgaGVyZSBzaW5jZSB0aGVcbiAgLy8gd2hvbGUgc3RyaW5nIHdpbGwgYmUgZXNjYXBlZCB3aGVuIHRoZSBhdHRyaWJ1dGUgaXMgaW5qZWN0ZWQgaW50b1xuICAvLyB0aGUgbWFya3VwLiBJZiB5b3UgcHJvdmlkZSB1bnNhZmUgdXNlciBkYXRhIGhlcmUgdGhleSBjYW4gaW5qZWN0XG4gIC8vIGFyYml0cmFyeSBDU1Mgd2hpY2ggbWF5IGJlIHByb2JsZW1hdGljIChJIGNvdWxkbid0IHJlcHJvIHRoaXMpOlxuICAvLyBodHRwczovL3d3dy5vd2FzcC5vcmcvaW5kZXgucGhwL1hTU19GaWx0ZXJfRXZhc2lvbl9DaGVhdF9TaGVldFxuICAvLyBodHRwOi8vd3d3LnRoZXNwYW5uZXIuY28udWsvMjAwNy8xMS8yNi91bHRpbWF0ZS14c3MtY3NzLWluamVjdGlvbi9cbiAgLy8gVGhpcyBpcyBub3QgYW4gWFNTIGhvbGUgYnV0IGluc3RlYWQgYSBwb3RlbnRpYWwgQ1NTIGluamVjdGlvbiBpc3N1ZVxuICAvLyB3aGljaCBoYXMgbGVhZCB0byBhIGdyZWF0ZXIgZGlzY3Vzc2lvbiBhYm91dCBob3cgd2UncmUgZ29pbmcgdG9cbiAgLy8gdHJ1c3QgVVJMcyBtb3ZpbmcgZm9yd2FyZC4gU2VlICMyMTE1OTAxXG5cbiAgdmFyIGlzRW1wdHkgPSB2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHZhbHVlID09PSAnJztcbiAgaWYgKGlzRW1wdHkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB2YXIgaXNOb25OdW1lcmljID0gaXNOYU4odmFsdWUpO1xuICBpZiAoaXNOb25OdW1lcmljIHx8IHZhbHVlID09PSAwIHx8IGlzVW5pdGxlc3NOdW1iZXIuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgaXNVbml0bGVzc051bWJlcltuYW1lXSkge1xuICAgIHJldHVybiAnJyArIHZhbHVlOyAvLyBjYXN0IHRvIHN0cmluZ1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgLy8gQWxsb3cgJzAnIHRvIHBhc3MgdGhyb3VnaCB3aXRob3V0IHdhcm5pbmcuIDAgaXMgYWxyZWFkeSBzcGVjaWFsIGFuZFxuICAgICAgLy8gZG9lc24ndCByZXF1aXJlIHVuaXRzLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHdhcm4gYWJvdXQgaXQuXG4gICAgICBpZiAoY29tcG9uZW50ICYmIHZhbHVlICE9PSAnMCcpIHtcbiAgICAgICAgdmFyIG93bmVyID0gY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5fb3duZXI7XG4gICAgICAgIHZhciBvd25lck5hbWUgPSBvd25lciA/IG93bmVyLmdldE5hbWUoKSA6IG51bGw7XG4gICAgICAgIGlmIChvd25lck5hbWUgJiYgIXN0eWxlV2FybmluZ3Nbb3duZXJOYW1lXSkge1xuICAgICAgICAgIHN0eWxlV2FybmluZ3Nbb3duZXJOYW1lXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgICAgIHZhciB3YXJuaW5ncyA9IHN0eWxlV2FybmluZ3Nbb3duZXJOYW1lXTtcbiAgICAgICAgICB3YXJuZWQgPSB3YXJuaW5nc1tuYW1lXTtcbiAgICAgICAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgICAgICAgd2FybmluZ3NbbmFtZV0gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYSBgJXNgIHRhZyAob3duZXI6IGAlc2ApIHdhcyBwYXNzZWQgYSBudW1lcmljIHN0cmluZyB2YWx1ZSAnICsgJ2ZvciBDU1MgcHJvcGVydHkgYCVzYCAodmFsdWU6IGAlc2ApIHdoaWNoIHdpbGwgYmUgdHJlYXRlZCAnICsgJ2FzIGEgdW5pdGxlc3MgbnVtYmVyIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgUmVhY3QuJywgY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC50eXBlLCBvd25lck5hbWUgfHwgJ3Vua25vd24nLCBuYW1lLCB2YWx1ZSkgOiB2b2lkIDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlICsgJ3B4Jztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkYW5nZXJvdXNTdHlsZVZhbHVlO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL2Rhbmdlcm91c1N0eWxlVmFsdWUuanNcbi8vIG1vZHVsZSBpZCA9IDI3MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 273 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @typechecks\n */\n\n'use strict';\n\nvar hyphenate = __webpack_require__(274);\n\nvar msPattern = /^ms-/;\n\n/**\n * Hyphenates a camelcased CSS property name, for example:\n *\n *   > hyphenateStyleName('backgroundColor')\n *   < \"background-color\"\n *   > hyphenateStyleName('MozTransition')\n *   < \"-moz-transition\"\n *   > hyphenateStyleName('msTransition')\n *   < \"-ms-transition\"\n *\n * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix\n * is converted to `-ms-`.\n *\n * @param {string} string\n * @return {string}\n */\nfunction hyphenateStyleName(string) {\n  return hyphenate(string).replace(msPattern, '-ms-');\n}\n\nmodule.exports = hyphenateStyleName;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjczLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9oeXBoZW5hdGVTdHlsZU5hbWUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaHlwaGVuYXRlID0gcmVxdWlyZSgnLi9oeXBoZW5hdGUnKTtcblxudmFyIG1zUGF0dGVybiA9IC9ebXMtLztcblxuLyoqXG4gKiBIeXBoZW5hdGVzIGEgY2FtZWxjYXNlZCBDU1MgcHJvcGVydHkgbmFtZSwgZm9yIGV4YW1wbGU6XG4gKlxuICogICA+IGh5cGhlbmF0ZVN0eWxlTmFtZSgnYmFja2dyb3VuZENvbG9yJylcbiAqICAgPCBcImJhY2tncm91bmQtY29sb3JcIlxuICogICA+IGh5cGhlbmF0ZVN0eWxlTmFtZSgnTW96VHJhbnNpdGlvbicpXG4gKiAgIDwgXCItbW96LXRyYW5zaXRpb25cIlxuICogICA+IGh5cGhlbmF0ZVN0eWxlTmFtZSgnbXNUcmFuc2l0aW9uJylcbiAqICAgPCBcIi1tcy10cmFuc2l0aW9uXCJcbiAqXG4gKiBBcyBNb2Rlcm5penIgc3VnZ2VzdHMgKGh0dHA6Ly9tb2Rlcm5penIuY29tL2RvY3MvI3ByZWZpeGVkKSwgYW4gYG1zYCBwcmVmaXhcbiAqIGlzIGNvbnZlcnRlZCB0byBgLW1zLWAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBoeXBoZW5hdGVTdHlsZU5hbWUoc3RyaW5nKSB7XG4gIHJldHVybiBoeXBoZW5hdGUoc3RyaW5nKS5yZXBsYWNlKG1zUGF0dGVybiwgJy1tcy0nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoeXBoZW5hdGVTdHlsZU5hbWU7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2ZianMvbGliL2h5cGhlbmF0ZVN0eWxlTmFtZS5qc1xuLy8gbW9kdWxlIGlkID0gMjczXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 274 */
/***/ function(module, exports) {

    eval("'use strict';\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @typechecks\n */\n\nvar _uppercasePattern = /([A-Z])/g;\n\n/**\n * Hyphenates a camelcased string, for example:\n *\n *   > hyphenate('backgroundColor')\n *   < \"background-color\"\n *\n * For CSS style names, use `hyphenateStyleName` instead which works properly\n * with all vendor prefixes, including `ms`.\n *\n * @param {string} string\n * @return {string}\n */\nfunction hyphenate(string) {\n  return string.replace(_uppercasePattern, '-$1').toLowerCase();\n}\n\nmodule.exports = hyphenate;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9oeXBoZW5hdGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHR5cGVjaGVja3NcbiAqL1xuXG52YXIgX3VwcGVyY2FzZVBhdHRlcm4gPSAvKFtBLVpdKS9nO1xuXG4vKipcbiAqIEh5cGhlbmF0ZXMgYSBjYW1lbGNhc2VkIHN0cmluZywgZm9yIGV4YW1wbGU6XG4gKlxuICogICA+IGh5cGhlbmF0ZSgnYmFja2dyb3VuZENvbG9yJylcbiAqICAgPCBcImJhY2tncm91bmQtY29sb3JcIlxuICpcbiAqIEZvciBDU1Mgc3R5bGUgbmFtZXMsIHVzZSBgaHlwaGVuYXRlU3R5bGVOYW1lYCBpbnN0ZWFkIHdoaWNoIHdvcmtzIHByb3Blcmx5XG4gKiB3aXRoIGFsbCB2ZW5kb3IgcHJlZml4ZXMsIGluY2x1ZGluZyBgbXNgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gaHlwaGVuYXRlKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoX3VwcGVyY2FzZVBhdHRlcm4sICctJDEnKS50b0xvd2VyQ2FzZSgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGh5cGhlbmF0ZTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZmJqcy9saWIvaHlwaGVuYXRlLmpzXG4vLyBtb2R1bGUgaWQgPSAyNzRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 275 */
/***/ function(module, exports) {

    eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n * @typechecks static-only\n */\n\n'use strict';\n\n/**\n * Memoizes the return value of a function that accepts one string argument.\n */\n\nfunction memoizeStringOnly(callback) {\n  var cache = {};\n  return function (string) {\n    if (!cache.hasOwnProperty(string)) {\n      cache[string] = callback.call(this, string);\n    }\n    return cache[string];\n  };\n}\n\nmodule.exports = memoizeStringOnly;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9tZW1vaXplU3RyaW5nT25seS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKiBAdHlwZWNoZWNrcyBzdGF0aWMtb25seVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNZW1vaXplcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIG9uZSBzdHJpbmcgYXJndW1lbnQuXG4gKi9cblxuZnVuY3Rpb24gbWVtb2l6ZVN0cmluZ09ubHkoY2FsbGJhY2spIHtcbiAgdmFyIGNhY2hlID0ge307XG4gIHJldHVybiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgaWYgKCFjYWNoZS5oYXNPd25Qcm9wZXJ0eShzdHJpbmcpKSB7XG4gICAgICBjYWNoZVtzdHJpbmddID0gY2FsbGJhY2suY2FsbCh0aGlzLCBzdHJpbmcpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVbc3RyaW5nXTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtZW1vaXplU3RyaW5nT25seTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZmJqcy9saWIvbWVtb2l6ZVN0cmluZ09ubHkuanNcbi8vIG1vZHVsZSBpZCA9IDI3NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 276 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar DOMProperty = __webpack_require__(209);\nvar ReactDOMComponentTree = __webpack_require__(207);\nvar ReactInstrumentation = __webpack_require__(235);\n\nvar quoteAttributeValueForBrowser = __webpack_require__(277);\nvar warning = __webpack_require__(183);\n\nvar VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + DOMProperty.ATTRIBUTE_NAME_START_CHAR + '][' + DOMProperty.ATTRIBUTE_NAME_CHAR + ']*$');\nvar illegalAttributeNameCache = {};\nvar validatedAttributeNameCache = {};\n\nfunction isAttributeNameSafe(attributeName) {\n  if (validatedAttributeNameCache.hasOwnProperty(attributeName)) {\n    return true;\n  }\n  if (illegalAttributeNameCache.hasOwnProperty(attributeName)) {\n    return false;\n  }\n  if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {\n    validatedAttributeNameCache[attributeName] = true;\n    return true;\n  }\n  illegalAttributeNameCache[attributeName] = true;\n   true ? warning(false, 'Invalid attribute name: `%s`', attributeName) : void 0;\n  return false;\n}\n\nfunction shouldIgnoreValue(propertyInfo, value) {\n  return value == null || propertyInfo.hasBooleanValue && !value || propertyInfo.hasNumericValue && isNaN(value) || propertyInfo.hasPositiveNumericValue && value < 1 || propertyInfo.hasOverloadedBooleanValue && value === false;\n}\n\n/**\n * Operations for dealing with DOM properties.\n */\nvar DOMPropertyOperations = {\n\n  /**\n   * Creates markup for the ID property.\n   *\n   * @param {string} id Unescaped ID.\n   * @return {string} Markup string.\n   */\n  createMarkupForID: function (id) {\n    return DOMProperty.ID_ATTRIBUTE_NAME + '=' + quoteAttributeValueForBrowser(id);\n  },\n\n  setAttributeForID: function (node, id) {\n    node.setAttribute(DOMProperty.ID_ATTRIBUTE_NAME, id);\n  },\n\n  createMarkupForRoot: function () {\n    return DOMProperty.ROOT_ATTRIBUTE_NAME + '=\"\"';\n  },\n\n  setAttributeForRoot: function (node) {\n    node.setAttribute(DOMProperty.ROOT_ATTRIBUTE_NAME, '');\n  },\n\n  /**\n   * Creates markup for a property.\n   *\n   * @param {string} name\n   * @param {*} value\n   * @return {?string} Markup string, or null if the property was invalid.\n   */\n  createMarkupForProperty: function (name, value) {\n    var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null;\n    if (propertyInfo) {\n      if (shouldIgnoreValue(propertyInfo, value)) {\n        return '';\n      }\n      var attributeName = propertyInfo.attributeName;\n      if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) {\n        return attributeName + '=\"\"';\n      }\n      return attributeName + '=' + quoteAttributeValueForBrowser(value);\n    } else if (DOMProperty.isCustomAttribute(name)) {\n      if (value == null) {\n        return '';\n      }\n      return name + '=' + quoteAttributeValueForBrowser(value);\n    }\n    return null;\n  },\n\n  /**\n   * Creates markup for a custom property.\n   *\n   * @param {string} name\n   * @param {*} value\n   * @return {string} Markup string, or empty string if the property was invalid.\n   */\n  createMarkupForCustomAttribute: function (name, value) {\n    if (!isAttributeNameSafe(name) || value == null) {\n      return '';\n    }\n    return name + '=' + quoteAttributeValueForBrowser(value);\n  },\n\n  /**\n   * Sets the value for a property on a node.\n   *\n   * @param {DOMElement} node\n   * @param {string} name\n   * @param {*} value\n   */\n  setValueForProperty: function (node, name, value) {\n    var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null;\n    if (propertyInfo) {\n      var mutationMethod = propertyInfo.mutationMethod;\n      if (mutationMethod) {\n        mutationMethod(node, value);\n      } else if (shouldIgnoreValue(propertyInfo, value)) {\n        this.deleteValueForProperty(node, name);\n        return;\n      } else if (propertyInfo.mustUseProperty) {\n        // Contrary to `setAttribute`, object properties are properly\n        // `toString`ed by IE8/9.\n        node[propertyInfo.propertyName] = value;\n      } else {\n        var attributeName = propertyInfo.attributeName;\n        var namespace = propertyInfo.attributeNamespace;\n        // `setAttribute` with objects becomes only `[object]` in IE8/9,\n        // ('' + value) makes it output the correct toString()-value.\n        if (namespace) {\n          node.setAttributeNS(namespace, attributeName, '' + value);\n        } else if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) {\n          node.setAttribute(attributeName, '');\n        } else {\n          node.setAttribute(attributeName, '' + value);\n        }\n      }\n    } else if (DOMProperty.isCustomAttribute(name)) {\n      DOMPropertyOperations.setValueForAttribute(node, name, value);\n      return;\n    }\n\n    if (true) {\n      var payload = {};\n      payload[name] = value;\n      ReactInstrumentation.debugTool.onHostOperation({\n        instanceID: ReactDOMComponentTree.getInstanceFromNode(node)._debugID,\n        type: 'update attribute',\n        payload: payload\n      });\n    }\n  },\n\n  setValueForAttribute: function (node, name, value) {\n    if (!isAttributeNameSafe(name)) {\n      return;\n    }\n    if (value == null) {\n      node.removeAttribute(name);\n    } else {\n      node.setAttribute(name, '' + value);\n    }\n\n    if (true) {\n      var payload = {};\n      payload[name] = value;\n      ReactInstrumentation.debugTool.onHostOperation({\n        instanceID: ReactDOMComponentTree.getInstanceFromNode(node)._debugID,\n        type: 'update attribute',\n        payload: payload\n      });\n    }\n  },\n\n  /**\n   * Deletes an attributes from a node.\n   *\n   * @param {DOMElement} node\n   * @param {string} name\n   */\n  deleteValueForAttribute: function (node, name) {\n    node.removeAttribute(name);\n    if (true) {\n      ReactInstrumentation.debugTool.onHostOperation({\n        instanceID: ReactDOMComponentTree.getInstanceFromNode(node)._debugID,\n        type: 'remove attribute',\n        payload: name\n      });\n    }\n  },\n\n  /**\n   * Deletes the value for a property on a node.\n   *\n   * @param {DOMElement} node\n   * @param {string} name\n   */\n  deleteValueForProperty: function (node, name) {\n    var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null;\n    if (propertyInfo) {\n      var mutationMethod = propertyInfo.mutationMethod;\n      if (mutationMethod) {\n        mutationMethod(node, undefined);\n      } else if (propertyInfo.mustUseProperty) {\n        var propName = propertyInfo.propertyName;\n        if (propertyInfo.hasBooleanValue) {\n          node[propName] = false;\n        } else {\n          node[propName] = '';\n        }\n      } else {\n        node.removeAttribute(propertyInfo.attributeName);\n      }\n    } else if (DOMProperty.isCustomAttribute(name)) {\n      node.removeAttribute(name);\n    }\n\n    if (true) {\n      ReactInstrumentation.debugTool.onHostOperation({\n        instanceID: ReactDOMComponentTree.getInstanceFromNode(node)._debugID,\n        type: 'remove attribute',\n        payload: name\n      });\n    }\n  }\n\n};\n\nmodule.exports = DOMPropertyOperations;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0RPTVByb3BlcnR5T3BlcmF0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NUHJvcGVydHkgPSByZXF1aXJlKCcuL0RPTVByb3BlcnR5Jyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0cnVtZW50YXRpb24nKTtcblxudmFyIHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyID0gcmVxdWlyZSgnLi9xdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3NlcicpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBWQUxJRF9BVFRSSUJVVEVfTkFNRV9SRUdFWCA9IG5ldyBSZWdFeHAoJ15bJyArIERPTVByb3BlcnR5LkFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgKyAnXVsnICsgRE9NUHJvcGVydHkuQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcbnZhciBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlID0ge307XG52YXIgdmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlID0ge307XG5cbmZ1bmN0aW9uIGlzQXR0cmlidXRlTmFtZVNhZmUoYXR0cmlidXRlTmFtZSkge1xuICBpZiAodmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlLmhhc093blByb3BlcnR5KGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUuaGFzT3duUHJvcGVydHkoYXR0cmlidXRlTmFtZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYLnRlc3QoYXR0cmlidXRlTmFtZSkpIHtcbiAgICB2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGVbYXR0cmlidXRlTmFtZV0gPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGVbYXR0cmlidXRlTmFtZV0gPSB0cnVlO1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ludmFsaWQgYXR0cmlidXRlIG5hbWU6IGAlc2AnLCBhdHRyaWJ1dGVOYW1lKSA6IHZvaWQgMDtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBzaG91bGRJZ25vcmVWYWx1ZShwcm9wZXJ0eUluZm8sIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHByb3BlcnR5SW5mby5oYXNCb29sZWFuVmFsdWUgJiYgIXZhbHVlIHx8IHByb3BlcnR5SW5mby5oYXNOdW1lcmljVmFsdWUgJiYgaXNOYU4odmFsdWUpIHx8IHByb3BlcnR5SW5mby5oYXNQb3NpdGl2ZU51bWVyaWNWYWx1ZSAmJiB2YWx1ZSA8IDEgfHwgcHJvcGVydHlJbmZvLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUgJiYgdmFsdWUgPT09IGZhbHNlO1xufVxuXG4vKipcbiAqIE9wZXJhdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCBET00gcHJvcGVydGllcy5cbiAqL1xudmFyIERPTVByb3BlcnR5T3BlcmF0aW9ucyA9IHtcblxuICAvKipcbiAgICogQ3JlYXRlcyBtYXJrdXAgZm9yIHRoZSBJRCBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFVuZXNjYXBlZCBJRC5cbiAgICogQHJldHVybiB7c3RyaW5nfSBNYXJrdXAgc3RyaW5nLlxuICAgKi9cbiAgY3JlYXRlTWFya3VwRm9ySUQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHJldHVybiBET01Qcm9wZXJ0eS5JRF9BVFRSSUJVVEVfTkFNRSArICc9JyArIHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyKGlkKTtcbiAgfSxcblxuICBzZXRBdHRyaWJ1dGVGb3JJRDogZnVuY3Rpb24gKG5vZGUsIGlkKSB7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoRE9NUHJvcGVydHkuSURfQVRUUklCVVRFX05BTUUsIGlkKTtcbiAgfSxcblxuICBjcmVhdGVNYXJrdXBGb3JSb290OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIERPTVByb3BlcnR5LlJPT1RfQVRUUklCVVRFX05BTUUgKyAnPVwiXCInO1xuICB9LFxuXG4gIHNldEF0dHJpYnV0ZUZvclJvb3Q6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoRE9NUHJvcGVydHkuUk9PVF9BVFRSSUJVVEVfTkFNRSwgJycpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG1hcmt1cCBmb3IgYSBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcmV0dXJuIHs/c3RyaW5nfSBNYXJrdXAgc3RyaW5nLCBvciBudWxsIGlmIHRoZSBwcm9wZXJ0eSB3YXMgaW52YWxpZC5cbiAgICovXG4gIGNyZWF0ZU1hcmt1cEZvclByb3BlcnR5OiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgcHJvcGVydHlJbmZvID0gRE9NUHJvcGVydHkucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IERPTVByb3BlcnR5LnByb3BlcnRpZXNbbmFtZV0gOiBudWxsO1xuICAgIGlmIChwcm9wZXJ0eUluZm8pIHtcbiAgICAgIGlmIChzaG91bGRJZ25vcmVWYWx1ZShwcm9wZXJ0eUluZm8sIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgICB2YXIgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lO1xuICAgICAgaWYgKHByb3BlcnR5SW5mby5oYXNCb29sZWFuVmFsdWUgfHwgcHJvcGVydHlJbmZvLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUgJiYgdmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZU5hbWUgKyAnPVwiXCInO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGF0dHJpYnV0ZU5hbWUgKyAnPScgKyBxdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3Nlcih2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChET01Qcm9wZXJ0eS5pc0N1c3RvbUF0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5hbWUgKyAnPScgKyBxdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3Nlcih2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG1hcmt1cCBmb3IgYSBjdXN0b20gcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfSBNYXJrdXAgc3RyaW5nLCBvciBlbXB0eSBzdHJpbmcgaWYgdGhlIHByb3BlcnR5IHdhcyBpbnZhbGlkLlxuICAgKi9cbiAgY3JlYXRlTWFya3VwRm9yQ3VzdG9tQXR0cmlidXRlOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAoIWlzQXR0cmlidXRlTmFtZVNhZmUobmFtZSkgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZSArICc9JyArIHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyKHZhbHVlKTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgZm9yIGEgcHJvcGVydHkgb24gYSBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKi9cbiAgc2V0VmFsdWVGb3JQcm9wZXJ0eTogZnVuY3Rpb24gKG5vZGUsIG5hbWUsIHZhbHVlKSB7XG4gICAgdmFyIHByb3BlcnR5SW5mbyA9IERPTVByb3BlcnR5LnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzW25hbWVdIDogbnVsbDtcbiAgICBpZiAocHJvcGVydHlJbmZvKSB7XG4gICAgICB2YXIgbXV0YXRpb25NZXRob2QgPSBwcm9wZXJ0eUluZm8ubXV0YXRpb25NZXRob2Q7XG4gICAgICBpZiAobXV0YXRpb25NZXRob2QpIHtcbiAgICAgICAgbXV0YXRpb25NZXRob2Qobm9kZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChzaG91bGRJZ25vcmVWYWx1ZShwcm9wZXJ0eUluZm8sIHZhbHVlKSkge1xuICAgICAgICB0aGlzLmRlbGV0ZVZhbHVlRm9yUHJvcGVydHkobm9kZSwgbmFtZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eSkge1xuICAgICAgICAvLyBDb250cmFyeSB0byBgc2V0QXR0cmlidXRlYCwgb2JqZWN0IHByb3BlcnRpZXMgYXJlIHByb3Blcmx5XG4gICAgICAgIC8vIGB0b1N0cmluZ2BlZCBieSBJRTgvOS5cbiAgICAgICAgbm9kZVtwcm9wZXJ0eUluZm8ucHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZTtcbiAgICAgICAgdmFyIG5hbWVzcGFjZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lc3BhY2U7XG4gICAgICAgIC8vIGBzZXRBdHRyaWJ1dGVgIHdpdGggb2JqZWN0cyBiZWNvbWVzIG9ubHkgYFtvYmplY3RdYCBpbiBJRTgvOSxcbiAgICAgICAgLy8gKCcnICsgdmFsdWUpIG1ha2VzIGl0IG91dHB1dCB0aGUgY29ycmVjdCB0b1N0cmluZygpLXZhbHVlLlxuICAgICAgICBpZiAobmFtZXNwYWNlKSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGVOUyhuYW1lc3BhY2UsIGF0dHJpYnV0ZU5hbWUsICcnICsgdmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5SW5mby5oYXNCb29sZWFuVmFsdWUgfHwgcHJvcGVydHlJbmZvLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUgJiYgdmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCAnJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgJycgKyB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKERPTVByb3BlcnR5LmlzQ3VzdG9tQXR0cmlidXRlKG5hbWUpKSB7XG4gICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuc2V0VmFsdWVGb3JBdHRyaWJ1dGUobm9kZSwgbmFtZSwgdmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgcGF5bG9hZCA9IHt9O1xuICAgICAgcGF5bG9hZFtuYW1lXSA9IHZhbHVlO1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgIGluc3RhbmNlSUQ6IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpLl9kZWJ1Z0lELFxuICAgICAgICB0eXBlOiAndXBkYXRlIGF0dHJpYnV0ZScsXG4gICAgICAgIHBheWxvYWQ6IHBheWxvYWRcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBzZXRWYWx1ZUZvckF0dHJpYnV0ZTogZnVuY3Rpb24gKG5vZGUsIG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKCFpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgJycgKyB2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBwYXlsb2FkID0ge307XG4gICAgICBwYXlsb2FkW25hbWVdID0gdmFsdWU7XG4gICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgICAgaW5zdGFuY2VJRDogUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUobm9kZSkuX2RlYnVnSUQsXG4gICAgICAgIHR5cGU6ICd1cGRhdGUgYXR0cmlidXRlJyxcbiAgICAgICAgcGF5bG9hZDogcGF5bG9hZFxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGFuIGF0dHJpYnV0ZXMgZnJvbSBhIG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZGVsZXRlVmFsdWVGb3JBdHRyaWJ1dGU6IGZ1bmN0aW9uIChub2RlLCBuYW1lKSB7XG4gICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe1xuICAgICAgICBpbnN0YW5jZUlEOiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKS5fZGVidWdJRCxcbiAgICAgICAgdHlwZTogJ3JlbW92ZSBhdHRyaWJ1dGUnLFxuICAgICAgICBwYXlsb2FkOiBuYW1lXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBkZWxldGVWYWx1ZUZvclByb3BlcnR5OiBmdW5jdGlvbiAobm9kZSwgbmFtZSkge1xuICAgIHZhciBwcm9wZXJ0eUluZm8gPSBET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG5hbWUpID8gRE9NUHJvcGVydHkucHJvcGVydGllc1tuYW1lXSA6IG51bGw7XG4gICAgaWYgKHByb3BlcnR5SW5mbykge1xuICAgICAgdmFyIG11dGF0aW9uTWV0aG9kID0gcHJvcGVydHlJbmZvLm11dGF0aW9uTWV0aG9kO1xuICAgICAgaWYgKG11dGF0aW9uTWV0aG9kKSB7XG4gICAgICAgIG11dGF0aW9uTWV0aG9kKG5vZGUsIHVuZGVmaW5lZCk7XG4gICAgICB9IGVsc2UgaWYgKHByb3BlcnR5SW5mby5tdXN0VXNlUHJvcGVydHkpIHtcbiAgICAgICAgdmFyIHByb3BOYW1lID0gcHJvcGVydHlJbmZvLnByb3BlcnR5TmFtZTtcbiAgICAgICAgaWYgKHByb3BlcnR5SW5mby5oYXNCb29sZWFuVmFsdWUpIHtcbiAgICAgICAgICBub2RlW3Byb3BOYW1lXSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vZGVbcHJvcE5hbWVdID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKERPTVByb3BlcnR5LmlzQ3VzdG9tQXR0cmlidXRlKG5hbWUpKSB7XG4gICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgIGluc3RhbmNlSUQ6IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpLl9kZWJ1Z0lELFxuICAgICAgICB0eXBlOiAncmVtb3ZlIGF0dHJpYnV0ZScsXG4gICAgICAgIHBheWxvYWQ6IG5hbWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IERPTVByb3BlcnR5T3BlcmF0aW9ucztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9ET01Qcm9wZXJ0eU9wZXJhdGlvbnMuanNcbi8vIG1vZHVsZSBpZCA9IDI3NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 277 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar escapeTextContentForBrowser = __webpack_require__(259);\n\n/**\n * Escapes attribute value to prevent scripting attacks.\n *\n * @param {*} value Value to escape.\n * @return {string} An escaped string.\n */\nfunction quoteAttributeValueForBrowser(value) {\n  return '\"' + escapeTextContentForBrowser(value) + '\"';\n}\n\nmodule.exports = quoteAttributeValueForBrowser;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL3F1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIgPSByZXF1aXJlKCcuL2VzY2FwZVRleHRDb250ZW50Rm9yQnJvd3NlcicpO1xuXG4vKipcbiAqIEVzY2FwZXMgYXR0cmlidXRlIHZhbHVlIHRvIHByZXZlbnQgc2NyaXB0aW5nIGF0dGFja3MuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBlc2NhcGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEFuIGVzY2FwZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBxdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3Nlcih2YWx1ZSkge1xuICByZXR1cm4gJ1wiJyArIGVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3Nlcih2YWx1ZSkgKyAnXCInO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL3F1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyLmpzXG4vLyBtb2R1bGUgaWQgPSAyNzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 278 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _assign = __webpack_require__(176);\n\nvar EventPluginRegistry = __webpack_require__(216);\nvar ReactEventEmitterMixin = __webpack_require__(279);\nvar ViewportMetrics = __webpack_require__(249);\n\nvar getVendorPrefixedEventName = __webpack_require__(280);\nvar isEventSupported = __webpack_require__(243);\n\n/**\n * Summary of `ReactBrowserEventEmitter` event handling:\n *\n *  - Top-level delegation is used to trap most native browser events. This\n *    may only occur in the main thread and is the responsibility of\n *    ReactEventListener, which is injected and can therefore support pluggable\n *    event sources. This is the only work that occurs in the main thread.\n *\n *  - We normalize and de-duplicate events to account for browser quirks. This\n *    may be done in the worker thread.\n *\n *  - Forward these native events (with the associated top-level type used to\n *    trap it) to `EventPluginHub`, which in turn will ask plugins if they want\n *    to extract any synthetic events.\n *\n *  - The `EventPluginHub` will then process each event by annotating them with\n *    \"dispatches\", a sequence of listeners and IDs that care about that event.\n *\n *  - The `EventPluginHub` then dispatches the events.\n *\n * Overview of React and the event system:\n *\n * +------------+    .\n * |    DOM     |    .\n * +------------+    .\n *       |           .\n *       v           .\n * +------------+    .\n * | ReactEvent |    .\n * |  Listener  |    .\n * +------------+    .                         +-----------+\n *       |           .               +--------+|SimpleEvent|\n *       |           .               |         |Plugin     |\n * +-----|------+    .               v         +-----------+\n * |     |      |    .    +--------------+                    +------------+\n * |     +-----------.--->|EventPluginHub|                    |    Event   |\n * |            |    .    |              |     +-----------+  | Propagators|\n * | ReactEvent |    .    |              |     |TapEvent   |  |------------|\n * |  Emitter   |    .    |              |<---+|Plugin     |  |other plugin|\n * |            |    .    |              |     +-----------+  |  utilities |\n * |     +-----------.--->|              |                    +------------+\n * |     |      |    .    +--------------+\n * +-----|------+    .                ^        +-----------+\n *       |           .                |        |Enter/Leave|\n *       +           .                +-------+|Plugin     |\n * +-------------+   .                         +-----------+\n * | application |   .\n * |-------------|   .\n * |             |   .\n * |             |   .\n * +-------------+   .\n *                   .\n *    React Core     .  General Purpose Event Plugin System\n */\n\nvar hasEventPageXY;\nvar alreadyListeningTo = {};\nvar isMonitoringScrollValue = false;\nvar reactTopListenersCounter = 0;\n\n// For events like 'submit' which don't consistently bubble (which we trap at a\n// lower node than `document`), binding at `document` would cause duplicate\n// events so we don't include them here\nvar topEventMapping = {\n  topAbort: 'abort',\n  topAnimationEnd: getVendorPrefixedEventName('animationend') || 'animationend',\n  topAnimationIteration: getVendorPrefixedEventName('animationiteration') || 'animationiteration',\n  topAnimationStart: getVendorPrefixedEventName('animationstart') || 'animationstart',\n  topBlur: 'blur',\n  topCanPlay: 'canplay',\n  topCanPlayThrough: 'canplaythrough',\n  topChange: 'change',\n  topClick: 'click',\n  topCompositionEnd: 'compositionend',\n  topCompositionStart: 'compositionstart',\n  topCompositionUpdate: 'compositionupdate',\n  topContextMenu: 'contextmenu',\n  topCopy: 'copy',\n  topCut: 'cut',\n  topDoubleClick: 'dblclick',\n  topDrag: 'drag',\n  topDragEnd: 'dragend',\n  topDragEnter: 'dragenter',\n  topDragExit: 'dragexit',\n  topDragLeave: 'dragleave',\n  topDragOver: 'dragover',\n  topDragStart: 'dragstart',\n  topDrop: 'drop',\n  topDurationChange: 'durationchange',\n  topEmptied: 'emptied',\n  topEncrypted: 'encrypted',\n  topEnded: 'ended',\n  topError: 'error',\n  topFocus: 'focus',\n  topInput: 'input',\n  topKeyDown: 'keydown',\n  topKeyPress: 'keypress',\n  topKeyUp: 'keyup',\n  topLoadedData: 'loadeddata',\n  topLoadedMetadata: 'loadedmetadata',\n  topLoadStart: 'loadstart',\n  topMouseDown: 'mousedown',\n  topMouseMove: 'mousemove',\n  topMouseOut: 'mouseout',\n  topMouseOver: 'mouseover',\n  topMouseUp: 'mouseup',\n  topPaste: 'paste',\n  topPause: 'pause',\n  topPlay: 'play',\n  topPlaying: 'playing',\n  topProgress: 'progress',\n  topRateChange: 'ratechange',\n  topScroll: 'scroll',\n  topSeeked: 'seeked',\n  topSeeking: 'seeking',\n  topSelectionChange: 'selectionchange',\n  topStalled: 'stalled',\n  topSuspend: 'suspend',\n  topTextInput: 'textInput',\n  topTimeUpdate: 'timeupdate',\n  topTouchCancel: 'touchcancel',\n  topTouchEnd: 'touchend',\n  topTouchMove: 'touchmove',\n  topTouchStart: 'touchstart',\n  topTransitionEnd: getVendorPrefixedEventName('transitionend') || 'transitionend',\n  topVolumeChange: 'volumechange',\n  topWaiting: 'waiting',\n  topWheel: 'wheel'\n};\n\n/**\n * To ensure no conflicts with other potential React instances on the page\n */\nvar topListenersIDKey = '_reactListenersID' + String(Math.random()).slice(2);\n\nfunction getListeningForDocument(mountAt) {\n  // In IE8, `mountAt` is a host object and doesn't have `hasOwnProperty`\n  // directly.\n  if (!Object.prototype.hasOwnProperty.call(mountAt, topListenersIDKey)) {\n    mountAt[topListenersIDKey] = reactTopListenersCounter++;\n    alreadyListeningTo[mountAt[topListenersIDKey]] = {};\n  }\n  return alreadyListeningTo[mountAt[topListenersIDKey]];\n}\n\n/**\n * `ReactBrowserEventEmitter` is used to attach top-level event listeners. For\n * example:\n *\n *   EventPluginHub.putListener('myID', 'onClick', myFunction);\n *\n * This would allocate a \"registration\" of `('onClick', myFunction)` on 'myID'.\n *\n * @internal\n */\nvar ReactBrowserEventEmitter = _assign({}, ReactEventEmitterMixin, {\n\n  /**\n   * Injectable event backend\n   */\n  ReactEventListener: null,\n\n  injection: {\n    /**\n     * @param {object} ReactEventListener\n     */\n    injectReactEventListener: function (ReactEventListener) {\n      ReactEventListener.setHandleTopLevel(ReactBrowserEventEmitter.handleTopLevel);\n      ReactBrowserEventEmitter.ReactEventListener = ReactEventListener;\n    }\n  },\n\n  /**\n   * Sets whether or not any created callbacks should be enabled.\n   *\n   * @param {boolean} enabled True if callbacks should be enabled.\n   */\n  setEnabled: function (enabled) {\n    if (ReactBrowserEventEmitter.ReactEventListener) {\n      ReactBrowserEventEmitter.ReactEventListener.setEnabled(enabled);\n    }\n  },\n\n  /**\n   * @return {boolean} True if callbacks are enabled.\n   */\n  isEnabled: function () {\n    return !!(ReactBrowserEventEmitter.ReactEventListener && ReactBrowserEventEmitter.ReactEventListener.isEnabled());\n  },\n\n  /**\n   * We listen for bubbled touch events on the document object.\n   *\n   * Firefox v8.01 (and possibly others) exhibited strange behavior when\n   * mounting `onmousemove` events at some node that was not the document\n   * element. The symptoms were that if your mouse is not moving over something\n   * contained within that mount point (for example on the background) the\n   * top-level listeners for `onmousemove` won't be called. However, if you\n   * register the `mousemove` on the document object, then it will of course\n   * catch all `mousemove`s. This along with iOS quirks, justifies restricting\n   * top-level listeners to the document object only, at least for these\n   * movement types of events and possibly all events.\n   *\n   * @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html\n   *\n   * Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but\n   * they bubble to document.\n   *\n   * @param {string} registrationName Name of listener (e.g. `onClick`).\n   * @param {object} contentDocumentHandle Document which owns the container\n   */\n  listenTo: function (registrationName, contentDocumentHandle) {\n    var mountAt = contentDocumentHandle;\n    var isListening = getListeningForDocument(mountAt);\n    var dependencies = EventPluginRegistry.registrationNameDependencies[registrationName];\n\n    for (var i = 0; i < dependencies.length; i++) {\n      var dependency = dependencies[i];\n      if (!(isListening.hasOwnProperty(dependency) && isListening[dependency])) {\n        if (dependency === 'topWheel') {\n          if (isEventSupported('wheel')) {\n            ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topWheel', 'wheel', mountAt);\n          } else if (isEventSupported('mousewheel')) {\n            ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topWheel', 'mousewheel', mountAt);\n          } else {\n            // Firefox needs to capture a different mouse scroll event.\n            // @see http://www.quirksmode.org/dom/events/tests/scroll.html\n            ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topWheel', 'DOMMouseScroll', mountAt);\n          }\n        } else if (dependency === 'topScroll') {\n\n          if (isEventSupported('scroll', true)) {\n            ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent('topScroll', 'scroll', mountAt);\n          } else {\n            ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topScroll', 'scroll', ReactBrowserEventEmitter.ReactEventListener.WINDOW_HANDLE);\n          }\n        } else if (dependency === 'topFocus' || dependency === 'topBlur') {\n\n          if (isEventSupported('focus', true)) {\n            ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent('topFocus', 'focus', mountAt);\n            ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent('topBlur', 'blur', mountAt);\n          } else if (isEventSupported('focusin')) {\n            // IE has `focusin` and `focusout` events which bubble.\n            // @see http://www.quirksmode.org/blog/archives/2008/04/delegating_the.html\n            ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topFocus', 'focusin', mountAt);\n            ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topBlur', 'focusout', mountAt);\n          }\n\n          // to make sure blur and focus event listeners are only attached once\n          isListening.topBlur = true;\n          isListening.topFocus = true;\n        } else if (topEventMapping.hasOwnProperty(dependency)) {\n          ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(dependency, topEventMapping[dependency], mountAt);\n        }\n\n        isListening[dependency] = true;\n      }\n    }\n  },\n\n  trapBubbledEvent: function (topLevelType, handlerBaseName, handle) {\n    return ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelType, handlerBaseName, handle);\n  },\n\n  trapCapturedEvent: function (topLevelType, handlerBaseName, handle) {\n    return ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelType, handlerBaseName, handle);\n  },\n\n  /**\n   * Protect against document.createEvent() returning null\n   * Some popup blocker extensions appear to do this:\n   * https://github.com/facebook/react/issues/6887\n   */\n  supportsEventPageXY: function () {\n    if (!document.createEvent) {\n      return false;\n    }\n    var ev = document.createEvent('MouseEvent');\n    return ev != null && 'pageX' in ev;\n  },\n\n  /**\n   * Listens to window scroll and resize events. We cache scroll values so that\n   * application code can access them without triggering reflows.\n   *\n   * ViewportMetrics is only used by SyntheticMouse/TouchEvent and only when\n   * pageX/pageY isn't supported (legacy browsers).\n   *\n   * NOTE: Scroll events do not bubble.\n   *\n   * @see http://www.quirksmode.org/dom/events/scroll.html\n   */\n  ensureScrollValueMonitoring: function () {\n    if (hasEventPageXY === undefined) {\n      hasEventPageXY = ReactBrowserEventEmitter.supportsEventPageXY();\n    }\n    if (!hasEventPageXY && !isMonitoringScrollValue) {\n      var refresh = ViewportMetrics.refreshScrollValues;\n      ReactBrowserEventEmitter.ReactEventListener.monitorScrollValue(refresh);\n      isMonitoringScrollValue = true;\n    }\n  }\n\n});\n\nmodule.exports = ReactBrowserEventEmitter;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIEV2ZW50UGx1Z2luUmVnaXN0cnkgPSByZXF1aXJlKCcuL0V2ZW50UGx1Z2luUmVnaXN0cnknKTtcbnZhciBSZWFjdEV2ZW50RW1pdHRlck1peGluID0gcmVxdWlyZSgnLi9SZWFjdEV2ZW50RW1pdHRlck1peGluJyk7XG52YXIgVmlld3BvcnRNZXRyaWNzID0gcmVxdWlyZSgnLi9WaWV3cG9ydE1ldHJpY3MnKTtcblxudmFyIGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lID0gcmVxdWlyZSgnLi9nZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZScpO1xudmFyIGlzRXZlbnRTdXBwb3J0ZWQgPSByZXF1aXJlKCcuL2lzRXZlbnRTdXBwb3J0ZWQnKTtcblxuLyoqXG4gKiBTdW1tYXJ5IG9mIGBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXJgIGV2ZW50IGhhbmRsaW5nOlxuICpcbiAqICAtIFRvcC1sZXZlbCBkZWxlZ2F0aW9uIGlzIHVzZWQgdG8gdHJhcCBtb3N0IG5hdGl2ZSBicm93c2VyIGV2ZW50cy4gVGhpc1xuICogICAgbWF5IG9ubHkgb2NjdXIgaW4gdGhlIG1haW4gdGhyZWFkIGFuZCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2ZcbiAqICAgIFJlYWN0RXZlbnRMaXN0ZW5lciwgd2hpY2ggaXMgaW5qZWN0ZWQgYW5kIGNhbiB0aGVyZWZvcmUgc3VwcG9ydCBwbHVnZ2FibGVcbiAqICAgIGV2ZW50IHNvdXJjZXMuIFRoaXMgaXMgdGhlIG9ubHkgd29yayB0aGF0IG9jY3VycyBpbiB0aGUgbWFpbiB0aHJlYWQuXG4gKlxuICogIC0gV2Ugbm9ybWFsaXplIGFuZCBkZS1kdXBsaWNhdGUgZXZlbnRzIHRvIGFjY291bnQgZm9yIGJyb3dzZXIgcXVpcmtzLiBUaGlzXG4gKiAgICBtYXkgYmUgZG9uZSBpbiB0aGUgd29ya2VyIHRocmVhZC5cbiAqXG4gKiAgLSBGb3J3YXJkIHRoZXNlIG5hdGl2ZSBldmVudHMgKHdpdGggdGhlIGFzc29jaWF0ZWQgdG9wLWxldmVsIHR5cGUgdXNlZCB0b1xuICogICAgdHJhcCBpdCkgdG8gYEV2ZW50UGx1Z2luSHViYCwgd2hpY2ggaW4gdHVybiB3aWxsIGFzayBwbHVnaW5zIGlmIHRoZXkgd2FudFxuICogICAgdG8gZXh0cmFjdCBhbnkgc3ludGhldGljIGV2ZW50cy5cbiAqXG4gKiAgLSBUaGUgYEV2ZW50UGx1Z2luSHViYCB3aWxsIHRoZW4gcHJvY2VzcyBlYWNoIGV2ZW50IGJ5IGFubm90YXRpbmcgdGhlbSB3aXRoXG4gKiAgICBcImRpc3BhdGNoZXNcIiwgYSBzZXF1ZW5jZSBvZiBsaXN0ZW5lcnMgYW5kIElEcyB0aGF0IGNhcmUgYWJvdXQgdGhhdCBldmVudC5cbiAqXG4gKiAgLSBUaGUgYEV2ZW50UGx1Z2luSHViYCB0aGVuIGRpc3BhdGNoZXMgdGhlIGV2ZW50cy5cbiAqXG4gKiBPdmVydmlldyBvZiBSZWFjdCBhbmQgdGhlIGV2ZW50IHN5c3RlbTpcbiAqXG4gKiArLS0tLS0tLS0tLS0tKyAgICAuXG4gKiB8ICAgIERPTSAgICAgfCAgICAuXG4gKiArLS0tLS0tLS0tLS0tKyAgICAuXG4gKiAgICAgICB8ICAgICAgICAgICAuXG4gKiAgICAgICB2ICAgICAgICAgICAuXG4gKiArLS0tLS0tLS0tLS0tKyAgICAuXG4gKiB8IFJlYWN0RXZlbnQgfCAgICAuXG4gKiB8ICBMaXN0ZW5lciAgfCAgICAuXG4gKiArLS0tLS0tLS0tLS0tKyAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLStcbiAqICAgICAgIHwgICAgICAgICAgIC4gICAgICAgICAgICAgICArLS0tLS0tLS0rfFNpbXBsZUV2ZW50fFxuICogICAgICAgfCAgICAgICAgICAgLiAgICAgICAgICAgICAgIHwgICAgICAgICB8UGx1Z2luICAgICB8XG4gKiArLS0tLS18LS0tLS0tKyAgICAuICAgICAgICAgICAgICAgdiAgICAgICAgICstLS0tLS0tLS0tLStcbiAqIHwgICAgIHwgICAgICB8ICAgIC4gICAgKy0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLStcbiAqIHwgICAgICstLS0tLS0tLS0tLS4tLS0+fEV2ZW50UGx1Z2luSHVifCAgICAgICAgICAgICAgICAgICAgfCAgICBFdmVudCAgIHxcbiAqIHwgICAgICAgICAgICB8ICAgIC4gICAgfCAgICAgICAgICAgICAgfCAgICAgKy0tLS0tLS0tLS0tKyAgfCBQcm9wYWdhdG9yc3xcbiAqIHwgUmVhY3RFdmVudCB8ICAgIC4gICAgfCAgICAgICAgICAgICAgfCAgICAgfFRhcEV2ZW50ICAgfCAgfC0tLS0tLS0tLS0tLXxcbiAqIHwgIEVtaXR0ZXIgICB8ICAgIC4gICAgfCAgICAgICAgICAgICAgfDwtLS0rfFBsdWdpbiAgICAgfCAgfG90aGVyIHBsdWdpbnxcbiAqIHwgICAgICAgICAgICB8ICAgIC4gICAgfCAgICAgICAgICAgICAgfCAgICAgKy0tLS0tLS0tLS0tKyAgfCAgdXRpbGl0aWVzIHxcbiAqIHwgICAgICstLS0tLS0tLS0tLS4tLS0+fCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLStcbiAqIHwgICAgIHwgICAgICB8ICAgIC4gICAgKy0tLS0tLS0tLS0tLS0tK1xuICogKy0tLS0tfC0tLS0tLSsgICAgLiAgICAgICAgICAgICAgICBeICAgICAgICArLS0tLS0tLS0tLS0rXG4gKiAgICAgICB8ICAgICAgICAgICAuICAgICAgICAgICAgICAgIHwgICAgICAgIHxFbnRlci9MZWF2ZXxcbiAqICAgICAgICsgICAgICAgICAgIC4gICAgICAgICAgICAgICAgKy0tLS0tLS0rfFBsdWdpbiAgICAgfFxuICogKy0tLS0tLS0tLS0tLS0rICAgLiAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rXG4gKiB8IGFwcGxpY2F0aW9uIHwgICAuXG4gKiB8LS0tLS0tLS0tLS0tLXwgICAuXG4gKiB8ICAgICAgICAgICAgIHwgICAuXG4gKiB8ICAgICAgICAgICAgIHwgICAuXG4gKiArLS0tLS0tLS0tLS0tLSsgICAuXG4gKiAgICAgICAgICAgICAgICAgICAuXG4gKiAgICBSZWFjdCBDb3JlICAgICAuICBHZW5lcmFsIFB1cnBvc2UgRXZlbnQgUGx1Z2luIFN5c3RlbVxuICovXG5cbnZhciBoYXNFdmVudFBhZ2VYWTtcbnZhciBhbHJlYWR5TGlzdGVuaW5nVG8gPSB7fTtcbnZhciBpc01vbml0b3JpbmdTY3JvbGxWYWx1ZSA9IGZhbHNlO1xudmFyIHJlYWN0VG9wTGlzdGVuZXJzQ291bnRlciA9IDA7XG5cbi8vIEZvciBldmVudHMgbGlrZSAnc3VibWl0JyB3aGljaCBkb24ndCBjb25zaXN0ZW50bHkgYnViYmxlICh3aGljaCB3ZSB0cmFwIGF0IGFcbi8vIGxvd2VyIG5vZGUgdGhhbiBgZG9jdW1lbnRgKSwgYmluZGluZyBhdCBgZG9jdW1lbnRgIHdvdWxkIGNhdXNlIGR1cGxpY2F0ZVxuLy8gZXZlbnRzIHNvIHdlIGRvbid0IGluY2x1ZGUgdGhlbSBoZXJlXG52YXIgdG9wRXZlbnRNYXBwaW5nID0ge1xuICB0b3BBYm9ydDogJ2Fib3J0JyxcbiAgdG9wQW5pbWF0aW9uRW5kOiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uZW5kJykgfHwgJ2FuaW1hdGlvbmVuZCcsXG4gIHRvcEFuaW1hdGlvbkl0ZXJhdGlvbjogZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ2FuaW1hdGlvbml0ZXJhdGlvbicpIHx8ICdhbmltYXRpb25pdGVyYXRpb24nLFxuICB0b3BBbmltYXRpb25TdGFydDogZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ2FuaW1hdGlvbnN0YXJ0JykgfHwgJ2FuaW1hdGlvbnN0YXJ0JyxcbiAgdG9wQmx1cjogJ2JsdXInLFxuICB0b3BDYW5QbGF5OiAnY2FucGxheScsXG4gIHRvcENhblBsYXlUaHJvdWdoOiAnY2FucGxheXRocm91Z2gnLFxuICB0b3BDaGFuZ2U6ICdjaGFuZ2UnLFxuICB0b3BDbGljazogJ2NsaWNrJyxcbiAgdG9wQ29tcG9zaXRpb25FbmQ6ICdjb21wb3NpdGlvbmVuZCcsXG4gIHRvcENvbXBvc2l0aW9uU3RhcnQ6ICdjb21wb3NpdGlvbnN0YXJ0JyxcbiAgdG9wQ29tcG9zaXRpb25VcGRhdGU6ICdjb21wb3NpdGlvbnVwZGF0ZScsXG4gIHRvcENvbnRleHRNZW51OiAnY29udGV4dG1lbnUnLFxuICB0b3BDb3B5OiAnY29weScsXG4gIHRvcEN1dDogJ2N1dCcsXG4gIHRvcERvdWJsZUNsaWNrOiAnZGJsY2xpY2snLFxuICB0b3BEcmFnOiAnZHJhZycsXG4gIHRvcERyYWdFbmQ6ICdkcmFnZW5kJyxcbiAgdG9wRHJhZ0VudGVyOiAnZHJhZ2VudGVyJyxcbiAgdG9wRHJhZ0V4aXQ6ICdkcmFnZXhpdCcsXG4gIHRvcERyYWdMZWF2ZTogJ2RyYWdsZWF2ZScsXG4gIHRvcERyYWdPdmVyOiAnZHJhZ292ZXInLFxuICB0b3BEcmFnU3RhcnQ6ICdkcmFnc3RhcnQnLFxuICB0b3BEcm9wOiAnZHJvcCcsXG4gIHRvcER1cmF0aW9uQ2hhbmdlOiAnZHVyYXRpb25jaGFuZ2UnLFxuICB0b3BFbXB0aWVkOiAnZW1wdGllZCcsXG4gIHRvcEVuY3J5cHRlZDogJ2VuY3J5cHRlZCcsXG4gIHRvcEVuZGVkOiAnZW5kZWQnLFxuICB0b3BFcnJvcjogJ2Vycm9yJyxcbiAgdG9wRm9jdXM6ICdmb2N1cycsXG4gIHRvcElucHV0OiAnaW5wdXQnLFxuICB0b3BLZXlEb3duOiAna2V5ZG93bicsXG4gIHRvcEtleVByZXNzOiAna2V5cHJlc3MnLFxuICB0b3BLZXlVcDogJ2tleXVwJyxcbiAgdG9wTG9hZGVkRGF0YTogJ2xvYWRlZGRhdGEnLFxuICB0b3BMb2FkZWRNZXRhZGF0YTogJ2xvYWRlZG1ldGFkYXRhJyxcbiAgdG9wTG9hZFN0YXJ0OiAnbG9hZHN0YXJ0JyxcbiAgdG9wTW91c2VEb3duOiAnbW91c2Vkb3duJyxcbiAgdG9wTW91c2VNb3ZlOiAnbW91c2Vtb3ZlJyxcbiAgdG9wTW91c2VPdXQ6ICdtb3VzZW91dCcsXG4gIHRvcE1vdXNlT3ZlcjogJ21vdXNlb3ZlcicsXG4gIHRvcE1vdXNlVXA6ICdtb3VzZXVwJyxcbiAgdG9wUGFzdGU6ICdwYXN0ZScsXG4gIHRvcFBhdXNlOiAncGF1c2UnLFxuICB0b3BQbGF5OiAncGxheScsXG4gIHRvcFBsYXlpbmc6ICdwbGF5aW5nJyxcbiAgdG9wUHJvZ3Jlc3M6ICdwcm9ncmVzcycsXG4gIHRvcFJhdGVDaGFuZ2U6ICdyYXRlY2hhbmdlJyxcbiAgdG9wU2Nyb2xsOiAnc2Nyb2xsJyxcbiAgdG9wU2Vla2VkOiAnc2Vla2VkJyxcbiAgdG9wU2Vla2luZzogJ3NlZWtpbmcnLFxuICB0b3BTZWxlY3Rpb25DaGFuZ2U6ICdzZWxlY3Rpb25jaGFuZ2UnLFxuICB0b3BTdGFsbGVkOiAnc3RhbGxlZCcsXG4gIHRvcFN1c3BlbmQ6ICdzdXNwZW5kJyxcbiAgdG9wVGV4dElucHV0OiAndGV4dElucHV0JyxcbiAgdG9wVGltZVVwZGF0ZTogJ3RpbWV1cGRhdGUnLFxuICB0b3BUb3VjaENhbmNlbDogJ3RvdWNoY2FuY2VsJyxcbiAgdG9wVG91Y2hFbmQ6ICd0b3VjaGVuZCcsXG4gIHRvcFRvdWNoTW92ZTogJ3RvdWNobW92ZScsXG4gIHRvcFRvdWNoU3RhcnQ6ICd0b3VjaHN0YXJ0JyxcbiAgdG9wVHJhbnNpdGlvbkVuZDogZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ3RyYW5zaXRpb25lbmQnKSB8fCAndHJhbnNpdGlvbmVuZCcsXG4gIHRvcFZvbHVtZUNoYW5nZTogJ3ZvbHVtZWNoYW5nZScsXG4gIHRvcFdhaXRpbmc6ICd3YWl0aW5nJyxcbiAgdG9wV2hlZWw6ICd3aGVlbCdcbn07XG5cbi8qKlxuICogVG8gZW5zdXJlIG5vIGNvbmZsaWN0cyB3aXRoIG90aGVyIHBvdGVudGlhbCBSZWFjdCBpbnN0YW5jZXMgb24gdGhlIHBhZ2VcbiAqL1xudmFyIHRvcExpc3RlbmVyc0lES2V5ID0gJ19yZWFjdExpc3RlbmVyc0lEJyArIFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZSgyKTtcblxuZnVuY3Rpb24gZ2V0TGlzdGVuaW5nRm9yRG9jdW1lbnQobW91bnRBdCkge1xuICAvLyBJbiBJRTgsIGBtb3VudEF0YCBpcyBhIGhvc3Qgb2JqZWN0IGFuZCBkb2Vzbid0IGhhdmUgYGhhc093blByb3BlcnR5YFxuICAvLyBkaXJlY3RseS5cbiAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW91bnRBdCwgdG9wTGlzdGVuZXJzSURLZXkpKSB7XG4gICAgbW91bnRBdFt0b3BMaXN0ZW5lcnNJREtleV0gPSByZWFjdFRvcExpc3RlbmVyc0NvdW50ZXIrKztcbiAgICBhbHJlYWR5TGlzdGVuaW5nVG9bbW91bnRBdFt0b3BMaXN0ZW5lcnNJREtleV1dID0ge307XG4gIH1cbiAgcmV0dXJuIGFscmVhZHlMaXN0ZW5pbmdUb1ttb3VudEF0W3RvcExpc3RlbmVyc0lES2V5XV07XG59XG5cbi8qKlxuICogYFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlcmAgaXMgdXNlZCB0byBhdHRhY2ggdG9wLWxldmVsIGV2ZW50IGxpc3RlbmVycy4gRm9yXG4gKiBleGFtcGxlOlxuICpcbiAqICAgRXZlbnRQbHVnaW5IdWIucHV0TGlzdGVuZXIoJ215SUQnLCAnb25DbGljaycsIG15RnVuY3Rpb24pO1xuICpcbiAqIFRoaXMgd291bGQgYWxsb2NhdGUgYSBcInJlZ2lzdHJhdGlvblwiIG9mIGAoJ29uQ2xpY2snLCBteUZ1bmN0aW9uKWAgb24gJ215SUQnLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG52YXIgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyID0gX2Fzc2lnbih7fSwgUmVhY3RFdmVudEVtaXR0ZXJNaXhpbiwge1xuXG4gIC8qKlxuICAgKiBJbmplY3RhYmxlIGV2ZW50IGJhY2tlbmRcbiAgICovXG4gIFJlYWN0RXZlbnRMaXN0ZW5lcjogbnVsbCxcblxuICBpbmplY3Rpb246IHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gUmVhY3RFdmVudExpc3RlbmVyXG4gICAgICovXG4gICAgaW5qZWN0UmVhY3RFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoUmVhY3RFdmVudExpc3RlbmVyKSB7XG4gICAgICBSZWFjdEV2ZW50TGlzdGVuZXIuc2V0SGFuZGxlVG9wTGV2ZWwoUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLmhhbmRsZVRvcExldmVsKTtcbiAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIgPSBSZWFjdEV2ZW50TGlzdGVuZXI7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgb3Igbm90IGFueSBjcmVhdGVkIGNhbGxiYWNrcyBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkIFRydWUgaWYgY2FsbGJhY2tzIHNob3VsZCBiZSBlbmFibGVkLlxuICAgKi9cbiAgc2V0RW5hYmxlZDogZnVuY3Rpb24gKGVuYWJsZWQpIHtcbiAgICBpZiAoUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lcikge1xuICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci5zZXRFbmFibGVkKGVuYWJsZWQpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBjYWxsYmFja3MgYXJlIGVuYWJsZWQuXG4gICAqL1xuICBpc0VuYWJsZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gISEoUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lciAmJiBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLmlzRW5hYmxlZCgpKTtcbiAgfSxcblxuICAvKipcbiAgICogV2UgbGlzdGVuIGZvciBidWJibGVkIHRvdWNoIGV2ZW50cyBvbiB0aGUgZG9jdW1lbnQgb2JqZWN0LlxuICAgKlxuICAgKiBGaXJlZm94IHY4LjAxIChhbmQgcG9zc2libHkgb3RoZXJzKSBleGhpYml0ZWQgc3RyYW5nZSBiZWhhdmlvciB3aGVuXG4gICAqIG1vdW50aW5nIGBvbm1vdXNlbW92ZWAgZXZlbnRzIGF0IHNvbWUgbm9kZSB0aGF0IHdhcyBub3QgdGhlIGRvY3VtZW50XG4gICAqIGVsZW1lbnQuIFRoZSBzeW1wdG9tcyB3ZXJlIHRoYXQgaWYgeW91ciBtb3VzZSBpcyBub3QgbW92aW5nIG92ZXIgc29tZXRoaW5nXG4gICAqIGNvbnRhaW5lZCB3aXRoaW4gdGhhdCBtb3VudCBwb2ludCAoZm9yIGV4YW1wbGUgb24gdGhlIGJhY2tncm91bmQpIHRoZVxuICAgKiB0b3AtbGV2ZWwgbGlzdGVuZXJzIGZvciBgb25tb3VzZW1vdmVgIHdvbid0IGJlIGNhbGxlZC4gSG93ZXZlciwgaWYgeW91XG4gICAqIHJlZ2lzdGVyIHRoZSBgbW91c2Vtb3ZlYCBvbiB0aGUgZG9jdW1lbnQgb2JqZWN0LCB0aGVuIGl0IHdpbGwgb2YgY291cnNlXG4gICAqIGNhdGNoIGFsbCBgbW91c2Vtb3ZlYHMuIFRoaXMgYWxvbmcgd2l0aCBpT1MgcXVpcmtzLCBqdXN0aWZpZXMgcmVzdHJpY3RpbmdcbiAgICogdG9wLWxldmVsIGxpc3RlbmVycyB0byB0aGUgZG9jdW1lbnQgb2JqZWN0IG9ubHksIGF0IGxlYXN0IGZvciB0aGVzZVxuICAgKiBtb3ZlbWVudCB0eXBlcyBvZiBldmVudHMgYW5kIHBvc3NpYmx5IGFsbCBldmVudHMuXG4gICAqXG4gICAqIEBzZWUgaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTAvMDkvY2xpY2tfZXZlbnRfZGVsLmh0bWxcbiAgICpcbiAgICogQWxzbywgYGtleXVwYC9ga2V5cHJlc3NgL2BrZXlkb3duYCBkbyBub3QgYnViYmxlIHRvIHRoZSB3aW5kb3cgb24gSUUsIGJ1dFxuICAgKiB0aGV5IGJ1YmJsZSB0byBkb2N1bWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5hbWUgTmFtZSBvZiBsaXN0ZW5lciAoZS5nLiBgb25DbGlja2ApLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29udGVudERvY3VtZW50SGFuZGxlIERvY3VtZW50IHdoaWNoIG93bnMgdGhlIGNvbnRhaW5lclxuICAgKi9cbiAgbGlzdGVuVG86IGZ1bmN0aW9uIChyZWdpc3RyYXRpb25OYW1lLCBjb250ZW50RG9jdW1lbnRIYW5kbGUpIHtcbiAgICB2YXIgbW91bnRBdCA9IGNvbnRlbnREb2N1bWVudEhhbmRsZTtcbiAgICB2YXIgaXNMaXN0ZW5pbmcgPSBnZXRMaXN0ZW5pbmdGb3JEb2N1bWVudChtb3VudEF0KTtcbiAgICB2YXIgZGVwZW5kZW5jaWVzID0gRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXBlbmRlbmNpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBkZXBlbmRlbmN5ID0gZGVwZW5kZW5jaWVzW2ldO1xuICAgICAgaWYgKCEoaXNMaXN0ZW5pbmcuaGFzT3duUHJvcGVydHkoZGVwZW5kZW5jeSkgJiYgaXNMaXN0ZW5pbmdbZGVwZW5kZW5jeV0pKSB7XG4gICAgICAgIGlmIChkZXBlbmRlbmN5ID09PSAndG9wV2hlZWwnKSB7XG4gICAgICAgICAgaWYgKGlzRXZlbnRTdXBwb3J0ZWQoJ3doZWVsJykpIHtcbiAgICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wV2hlZWwnLCAnd2hlZWwnLCBtb3VudEF0KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzRXZlbnRTdXBwb3J0ZWQoJ21vdXNld2hlZWwnKSkge1xuICAgICAgICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCd0b3BXaGVlbCcsICdtb3VzZXdoZWVsJywgbW91bnRBdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZpcmVmb3ggbmVlZHMgdG8gY2FwdHVyZSBhIGRpZmZlcmVudCBtb3VzZSBzY3JvbGwgZXZlbnQuXG4gICAgICAgICAgICAvLyBAc2VlIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvZG9tL2V2ZW50cy90ZXN0cy9zY3JvbGwuaHRtbFxuICAgICAgICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCd0b3BXaGVlbCcsICdET01Nb3VzZVNjcm9sbCcsIG1vdW50QXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkZXBlbmRlbmN5ID09PSAndG9wU2Nyb2xsJykge1xuXG4gICAgICAgICAgaWYgKGlzRXZlbnRTdXBwb3J0ZWQoJ3Njcm9sbCcsIHRydWUpKSB7XG4gICAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KCd0b3BTY3JvbGwnLCAnc2Nyb2xsJywgbW91bnRBdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wU2Nyb2xsJywgJ3Njcm9sbCcsIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIuV0lORE9XX0hBTkRMRSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRlcGVuZGVuY3kgPT09ICd0b3BGb2N1cycgfHwgZGVwZW5kZW5jeSA9PT0gJ3RvcEJsdXInKSB7XG5cbiAgICAgICAgICBpZiAoaXNFdmVudFN1cHBvcnRlZCgnZm9jdXMnLCB0cnVlKSkge1xuICAgICAgICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQ2FwdHVyZWRFdmVudCgndG9wRm9jdXMnLCAnZm9jdXMnLCBtb3VudEF0KTtcbiAgICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcENhcHR1cmVkRXZlbnQoJ3RvcEJsdXInLCAnYmx1cicsIG1vdW50QXQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNFdmVudFN1cHBvcnRlZCgnZm9jdXNpbicpKSB7XG4gICAgICAgICAgICAvLyBJRSBoYXMgYGZvY3VzaW5gIGFuZCBgZm9jdXNvdXRgIGV2ZW50cyB3aGljaCBidWJibGUuXG4gICAgICAgICAgICAvLyBAc2VlIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDA4LzA0L2RlbGVnYXRpbmdfdGhlLmh0bWxcbiAgICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wRm9jdXMnLCAnZm9jdXNpbicsIG1vdW50QXQpO1xuICAgICAgICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCd0b3BCbHVyJywgJ2ZvY3Vzb3V0JywgbW91bnRBdCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gdG8gbWFrZSBzdXJlIGJsdXIgYW5kIGZvY3VzIGV2ZW50IGxpc3RlbmVycyBhcmUgb25seSBhdHRhY2hlZCBvbmNlXG4gICAgICAgICAgaXNMaXN0ZW5pbmcudG9wQmx1ciA9IHRydWU7XG4gICAgICAgICAgaXNMaXN0ZW5pbmcudG9wRm9jdXMgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRvcEV2ZW50TWFwcGluZy5oYXNPd25Qcm9wZXJ0eShkZXBlbmRlbmN5KSkge1xuICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudChkZXBlbmRlbmN5LCB0b3BFdmVudE1hcHBpbmdbZGVwZW5kZW5jeV0sIG1vdW50QXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaXNMaXN0ZW5pbmdbZGVwZW5kZW5jeV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB0cmFwQnViYmxlZEV2ZW50OiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCBoYW5kbGVyQmFzZU5hbWUsIGhhbmRsZSkge1xuICAgIHJldHVybiBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQodG9wTGV2ZWxUeXBlLCBoYW5kbGVyQmFzZU5hbWUsIGhhbmRsZSk7XG4gIH0sXG5cbiAgdHJhcENhcHR1cmVkRXZlbnQ6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIGhhbmRsZXJCYXNlTmFtZSwgaGFuZGxlKSB7XG4gICAgcmV0dXJuIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcENhcHR1cmVkRXZlbnQodG9wTGV2ZWxUeXBlLCBoYW5kbGVyQmFzZU5hbWUsIGhhbmRsZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFByb3RlY3QgYWdhaW5zdCBkb2N1bWVudC5jcmVhdGVFdmVudCgpIHJldHVybmluZyBudWxsXG4gICAqIFNvbWUgcG9wdXAgYmxvY2tlciBleHRlbnNpb25zIGFwcGVhciB0byBkbyB0aGlzOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzY4ODdcbiAgICovXG4gIHN1cHBvcnRzRXZlbnRQYWdlWFk6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWRvY3VtZW50LmNyZWF0ZUV2ZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBldiA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50Jyk7XG4gICAgcmV0dXJuIGV2ICE9IG51bGwgJiYgJ3BhZ2VYJyBpbiBldjtcbiAgfSxcblxuICAvKipcbiAgICogTGlzdGVucyB0byB3aW5kb3cgc2Nyb2xsIGFuZCByZXNpemUgZXZlbnRzLiBXZSBjYWNoZSBzY3JvbGwgdmFsdWVzIHNvIHRoYXRcbiAgICogYXBwbGljYXRpb24gY29kZSBjYW4gYWNjZXNzIHRoZW0gd2l0aG91dCB0cmlnZ2VyaW5nIHJlZmxvd3MuXG4gICAqXG4gICAqIFZpZXdwb3J0TWV0cmljcyBpcyBvbmx5IHVzZWQgYnkgU3ludGhldGljTW91c2UvVG91Y2hFdmVudCBhbmQgb25seSB3aGVuXG4gICAqIHBhZ2VYL3BhZ2VZIGlzbid0IHN1cHBvcnRlZCAobGVnYWN5IGJyb3dzZXJzKS5cbiAgICpcbiAgICogTk9URTogU2Nyb2xsIGV2ZW50cyBkbyBub3QgYnViYmxlLlxuICAgKlxuICAgKiBAc2VlIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvZG9tL2V2ZW50cy9zY3JvbGwuaHRtbFxuICAgKi9cbiAgZW5zdXJlU2Nyb2xsVmFsdWVNb25pdG9yaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGhhc0V2ZW50UGFnZVhZID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0V2ZW50UGFnZVhZID0gUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnN1cHBvcnRzRXZlbnRQYWdlWFkoKTtcbiAgICB9XG4gICAgaWYgKCFoYXNFdmVudFBhZ2VYWSAmJiAhaXNNb25pdG9yaW5nU2Nyb2xsVmFsdWUpIHtcbiAgICAgIHZhciByZWZyZXNoID0gVmlld3BvcnRNZXRyaWNzLnJlZnJlc2hTY3JvbGxWYWx1ZXM7XG4gICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLm1vbml0b3JTY3JvbGxWYWx1ZShyZWZyZXNoKTtcbiAgICAgIGlzTW9uaXRvcmluZ1Njcm9sbFZhbHVlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5qc1xuLy8gbW9kdWxlIGlkID0gMjc4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 279 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar EventPluginHub = __webpack_require__(215);\n\nfunction runEventQueueInBatch(events) {\n  EventPluginHub.enqueueEvents(events);\n  EventPluginHub.processEventQueue(false);\n}\n\nvar ReactEventEmitterMixin = {\n\n  /**\n   * Streams a fired top-level event to `EventPluginHub` where plugins have the\n   * opportunity to create `ReactEvent`s to be dispatched.\n   */\n  handleTopLevel: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n    var events = EventPluginHub.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget);\n    runEventQueueInBatch(events);\n  }\n};\n\nmodule.exports = ReactEventEmitterMixin;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RXZlbnRFbWl0dGVyTWl4aW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEV2ZW50UGx1Z2luSHViID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpbkh1YicpO1xuXG5mdW5jdGlvbiBydW5FdmVudFF1ZXVlSW5CYXRjaChldmVudHMpIHtcbiAgRXZlbnRQbHVnaW5IdWIuZW5xdWV1ZUV2ZW50cyhldmVudHMpO1xuICBFdmVudFBsdWdpbkh1Yi5wcm9jZXNzRXZlbnRRdWV1ZShmYWxzZSk7XG59XG5cbnZhciBSZWFjdEV2ZW50RW1pdHRlck1peGluID0ge1xuXG4gIC8qKlxuICAgKiBTdHJlYW1zIGEgZmlyZWQgdG9wLWxldmVsIGV2ZW50IHRvIGBFdmVudFBsdWdpbkh1YmAgd2hlcmUgcGx1Z2lucyBoYXZlIHRoZVxuICAgKiBvcHBvcnR1bml0eSB0byBjcmVhdGUgYFJlYWN0RXZlbnRgcyB0byBiZSBkaXNwYXRjaGVkLlxuICAgKi9cbiAgaGFuZGxlVG9wTGV2ZWw6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIHZhciBldmVudHMgPSBFdmVudFBsdWdpbkh1Yi5leHRyYWN0RXZlbnRzKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBydW5FdmVudFF1ZXVlSW5CYXRjaChldmVudHMpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RXZlbnRFbWl0dGVyTWl4aW47XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RFdmVudEVtaXR0ZXJNaXhpbi5qc1xuLy8gbW9kdWxlIGlkID0gMjc5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 280 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar ExecutionEnvironment = __webpack_require__(221);\n\n/**\n * Generate a mapping of standard vendor prefixes using the defined style property and event name.\n *\n * @param {string} styleProp\n * @param {string} eventName\n * @returns {object}\n */\nfunction makePrefixMap(styleProp, eventName) {\n  var prefixes = {};\n\n  prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();\n  prefixes['Webkit' + styleProp] = 'webkit' + eventName;\n  prefixes['Moz' + styleProp] = 'moz' + eventName;\n  prefixes['ms' + styleProp] = 'MS' + eventName;\n  prefixes['O' + styleProp] = 'o' + eventName.toLowerCase();\n\n  return prefixes;\n}\n\n/**\n * A list of event names to a configurable list of vendor prefixes.\n */\nvar vendorPrefixes = {\n  animationend: makePrefixMap('Animation', 'AnimationEnd'),\n  animationiteration: makePrefixMap('Animation', 'AnimationIteration'),\n  animationstart: makePrefixMap('Animation', 'AnimationStart'),\n  transitionend: makePrefixMap('Transition', 'TransitionEnd')\n};\n\n/**\n * Event names that have already been detected and prefixed (if applicable).\n */\nvar prefixedEventNames = {};\n\n/**\n * Element to check for prefixes on.\n */\nvar style = {};\n\n/**\n * Bootstrap if a DOM exists.\n */\nif (ExecutionEnvironment.canUseDOM) {\n  style = document.createElement('div').style;\n\n  // On some platforms, in particular some releases of Android 4.x,\n  // the un-prefixed \"animation\" and \"transition\" properties are defined on the\n  // style object but the events that fire will still be prefixed, so we need\n  // to check if the un-prefixed events are usable, and if not remove them from the map.\n  if (!('AnimationEvent' in window)) {\n    delete vendorPrefixes.animationend.animation;\n    delete vendorPrefixes.animationiteration.animation;\n    delete vendorPrefixes.animationstart.animation;\n  }\n\n  // Same as above\n  if (!('TransitionEvent' in window)) {\n    delete vendorPrefixes.transitionend.transition;\n  }\n}\n\n/**\n * Attempts to determine the correct vendor prefixed event name.\n *\n * @param {string} eventName\n * @returns {string}\n */\nfunction getVendorPrefixedEventName(eventName) {\n  if (prefixedEventNames[eventName]) {\n    return prefixedEventNames[eventName];\n  } else if (!vendorPrefixes[eventName]) {\n    return eventName;\n  }\n\n  var prefixMap = vendorPrefixes[eventName];\n\n  for (var styleProp in prefixMap) {\n    if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) {\n      return prefixedEventNames[eventName] = prefixMap[styleProp];\n    }\n  }\n\n  return '';\n}\n\nmodule.exports = getVendorPrefixedEventName;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2dldFZlbmRvclByZWZpeGVkRXZlbnROYW1lLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG5cbi8qKlxuICogR2VuZXJhdGUgYSBtYXBwaW5nIG9mIHN0YW5kYXJkIHZlbmRvciBwcmVmaXhlcyB1c2luZyB0aGUgZGVmaW5lZCBzdHlsZSBwcm9wZXJ0eSBhbmQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3R5bGVQcm9wXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5mdW5jdGlvbiBtYWtlUHJlZml4TWFwKHN0eWxlUHJvcCwgZXZlbnROYW1lKSB7XG4gIHZhciBwcmVmaXhlcyA9IHt9O1xuXG4gIHByZWZpeGVzW3N0eWxlUHJvcC50b0xvd2VyQ2FzZSgpXSA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICBwcmVmaXhlc1snV2Via2l0JyArIHN0eWxlUHJvcF0gPSAnd2Via2l0JyArIGV2ZW50TmFtZTtcbiAgcHJlZml4ZXNbJ01veicgKyBzdHlsZVByb3BdID0gJ21veicgKyBldmVudE5hbWU7XG4gIHByZWZpeGVzWydtcycgKyBzdHlsZVByb3BdID0gJ01TJyArIGV2ZW50TmFtZTtcbiAgcHJlZml4ZXNbJ08nICsgc3R5bGVQcm9wXSA9ICdvJyArIGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIHJldHVybiBwcmVmaXhlcztcbn1cblxuLyoqXG4gKiBBIGxpc3Qgb2YgZXZlbnQgbmFtZXMgdG8gYSBjb25maWd1cmFibGUgbGlzdCBvZiB2ZW5kb3IgcHJlZml4ZXMuXG4gKi9cbnZhciB2ZW5kb3JQcmVmaXhlcyA9IHtcbiAgYW5pbWF0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uRW5kJyksXG4gIGFuaW1hdGlvbml0ZXJhdGlvbjogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkl0ZXJhdGlvbicpLFxuICBhbmltYXRpb25zdGFydDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvblN0YXJ0JyksXG4gIHRyYW5zaXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ1RyYW5zaXRpb24nLCAnVHJhbnNpdGlvbkVuZCcpXG59O1xuXG4vKipcbiAqIEV2ZW50IG5hbWVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gZGV0ZWN0ZWQgYW5kIHByZWZpeGVkIChpZiBhcHBsaWNhYmxlKS5cbiAqL1xudmFyIHByZWZpeGVkRXZlbnROYW1lcyA9IHt9O1xuXG4vKipcbiAqIEVsZW1lbnQgdG8gY2hlY2sgZm9yIHByZWZpeGVzIG9uLlxuICovXG52YXIgc3R5bGUgPSB7fTtcblxuLyoqXG4gKiBCb290c3RyYXAgaWYgYSBET00gZXhpc3RzLlxuICovXG5pZiAoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKSB7XG4gIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGU7XG5cbiAgLy8gT24gc29tZSBwbGF0Zm9ybXMsIGluIHBhcnRpY3VsYXIgc29tZSByZWxlYXNlcyBvZiBBbmRyb2lkIDQueCxcbiAgLy8gdGhlIHVuLXByZWZpeGVkIFwiYW5pbWF0aW9uXCIgYW5kIFwidHJhbnNpdGlvblwiIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgb24gdGhlXG4gIC8vIHN0eWxlIG9iamVjdCBidXQgdGhlIGV2ZW50cyB0aGF0IGZpcmUgd2lsbCBzdGlsbCBiZSBwcmVmaXhlZCwgc28gd2UgbmVlZFxuICAvLyB0byBjaGVjayBpZiB0aGUgdW4tcHJlZml4ZWQgZXZlbnRzIGFyZSB1c2FibGUsIGFuZCBpZiBub3QgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgbWFwLlxuICBpZiAoISgnQW5pbWF0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uO1xuICB9XG5cbiAgLy8gU2FtZSBhcyBhYm92ZVxuICBpZiAoISgnVHJhbnNpdGlvbkV2ZW50JyBpbiB3aW5kb3cpKSB7XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEF0dGVtcHRzIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCB2ZW5kb3IgcHJlZml4ZWQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShldmVudE5hbWUpIHtcbiAgaWYgKHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdO1xuICB9IGVsc2UgaWYgKCF2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZTtcbiAgfVxuXG4gIHZhciBwcmVmaXhNYXAgPSB2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdO1xuXG4gIGZvciAodmFyIHN0eWxlUHJvcCBpbiBwcmVmaXhNYXApIHtcbiAgICBpZiAocHJlZml4TWFwLmhhc093blByb3BlcnR5KHN0eWxlUHJvcCkgJiYgc3R5bGVQcm9wIGluIHN0eWxlKSB7XG4gICAgICByZXR1cm4gcHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV0gPSBwcmVmaXhNYXBbc3R5bGVQcm9wXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWU7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUuanNcbi8vIG1vZHVsZSBpZCA9IDI4MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 281 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208),\n    _assign = __webpack_require__(176);\n\nvar DOMPropertyOperations = __webpack_require__(276);\nvar LinkedValueUtils = __webpack_require__(282);\nvar ReactDOMComponentTree = __webpack_require__(207);\nvar ReactUpdates = __webpack_require__(229);\n\nvar invariant = __webpack_require__(180);\nvar warning = __webpack_require__(183);\n\nvar didWarnValueLink = false;\nvar didWarnCheckedLink = false;\nvar didWarnValueDefaultValue = false;\nvar didWarnCheckedDefaultChecked = false;\nvar didWarnControlledToUncontrolled = false;\nvar didWarnUncontrolledToControlled = false;\n\nfunction forceUpdateIfMounted() {\n  if (this._rootNodeID) {\n    // DOM component is still mounted; update\n    ReactDOMInput.updateWrapper(this);\n  }\n}\n\nfunction isControlled(props) {\n  var usesChecked = props.type === 'checkbox' || props.type === 'radio';\n  return usesChecked ? props.checked != null : props.value != null;\n}\n\n/**\n * Implements an <input> host component that allows setting these optional\n * props: `checked`, `value`, `defaultChecked`, and `defaultValue`.\n *\n * If `checked` or `value` are not supplied (or null/undefined), user actions\n * that affect the checked state or value will trigger updates to the element.\n *\n * If they are supplied (and not null/undefined), the rendered element will not\n * trigger updates to the element. Instead, the props must change in order for\n * the rendered element to be updated.\n *\n * The rendered element will be initialized as unchecked (or `defaultChecked`)\n * with an empty value (or `defaultValue`).\n *\n * @see http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html\n */\nvar ReactDOMInput = {\n  getHostProps: function (inst, props) {\n    var value = LinkedValueUtils.getValue(props);\n    var checked = LinkedValueUtils.getChecked(props);\n\n    var hostProps = _assign({\n      // Make sure we set .type before any other properties (setting .value\n      // before .type means .value is lost in IE11 and below)\n      type: undefined,\n      // Make sure we set .step before .value (setting .value before .step\n      // means .value is rounded on mount, based upon step precision)\n      step: undefined,\n      // Make sure we set .min & .max before .value (to ensure proper order\n      // in corner cases such as min or max deriving from value, e.g. Issue #7170)\n      min: undefined,\n      max: undefined\n    }, props, {\n      defaultChecked: undefined,\n      defaultValue: undefined,\n      value: value != null ? value : inst._wrapperState.initialValue,\n      checked: checked != null ? checked : inst._wrapperState.initialChecked,\n      onChange: inst._wrapperState.onChange\n    });\n\n    return hostProps;\n  },\n\n  mountWrapper: function (inst, props) {\n    if (true) {\n      LinkedValueUtils.checkPropTypes('input', props, inst._currentElement._owner);\n\n      var owner = inst._currentElement._owner;\n\n      if (props.valueLink !== undefined && !didWarnValueLink) {\n         true ? warning(false, '`valueLink` prop on `input` is deprecated; set `value` and `onChange` instead.') : void 0;\n        didWarnValueLink = true;\n      }\n      if (props.checkedLink !== undefined && !didWarnCheckedLink) {\n         true ? warning(false, '`checkedLink` prop on `input` is deprecated; set `value` and `onChange` instead.') : void 0;\n        didWarnCheckedLink = true;\n      }\n      if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnCheckedDefaultChecked) {\n         true ? warning(false, '%s contains an input of type %s with both checked and defaultChecked props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the checked prop, or the defaultChecked prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', owner && owner.getName() || 'A component', props.type) : void 0;\n        didWarnCheckedDefaultChecked = true;\n      }\n      if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue) {\n         true ? warning(false, '%s contains an input of type %s with both value and defaultValue props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', owner && owner.getName() || 'A component', props.type) : void 0;\n        didWarnValueDefaultValue = true;\n      }\n    }\n\n    var defaultValue = props.defaultValue;\n    inst._wrapperState = {\n      initialChecked: props.checked != null ? props.checked : props.defaultChecked,\n      initialValue: props.value != null ? props.value : defaultValue,\n      listeners: null,\n      onChange: _handleChange.bind(inst)\n    };\n\n    if (true) {\n      inst._wrapperState.controlled = isControlled(props);\n    }\n  },\n\n  updateWrapper: function (inst) {\n    var props = inst._currentElement.props;\n\n    if (true) {\n      var controlled = isControlled(props);\n      var owner = inst._currentElement._owner;\n\n      if (!inst._wrapperState.controlled && controlled && !didWarnUncontrolledToControlled) {\n         true ? warning(false, '%s is changing an uncontrolled input of type %s to be controlled. ' + 'Input elements should not switch from uncontrolled to controlled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components', owner && owner.getName() || 'A component', props.type) : void 0;\n        didWarnUncontrolledToControlled = true;\n      }\n      if (inst._wrapperState.controlled && !controlled && !didWarnControlledToUncontrolled) {\n         true ? warning(false, '%s is changing a controlled input of type %s to be uncontrolled. ' + 'Input elements should not switch from controlled to uncontrolled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components', owner && owner.getName() || 'A component', props.type) : void 0;\n        didWarnControlledToUncontrolled = true;\n      }\n    }\n\n    // TODO: Shouldn't this be getChecked(props)?\n    var checked = props.checked;\n    if (checked != null) {\n      DOMPropertyOperations.setValueForProperty(ReactDOMComponentTree.getNodeFromInstance(inst), 'checked', checked || false);\n    }\n\n    var node = ReactDOMComponentTree.getNodeFromInstance(inst);\n    var value = LinkedValueUtils.getValue(props);\n    if (value != null) {\n\n      // Cast `value` to a string to ensure the value is set correctly. While\n      // browsers typically do this as necessary, jsdom doesn't.\n      var newValue = '' + value;\n\n      // To avoid side effects (such as losing text selection), only set value if changed\n      if (newValue !== node.value) {\n        node.value = newValue;\n      }\n    } else {\n      if (props.value == null && props.defaultValue != null) {\n        // In Chrome, assigning defaultValue to certain input types triggers input validation.\n        // For number inputs, the display value loses trailing decimal points. For email inputs,\n        // Chrome raises \"The specified value <x> is not a valid email address\".\n        //\n        // Here we check to see if the defaultValue has actually changed, avoiding these problems\n        // when the user is inputting text\n        //\n        // https://github.com/facebook/react/issues/7253\n        if (node.defaultValue !== '' + props.defaultValue) {\n          node.defaultValue = '' + props.defaultValue;\n        }\n      }\n      if (props.checked == null && props.defaultChecked != null) {\n        node.defaultChecked = !!props.defaultChecked;\n      }\n    }\n  },\n\n  postMountWrapper: function (inst) {\n    var props = inst._currentElement.props;\n\n    // This is in postMount because we need access to the DOM node, which is not\n    // available until after the component has mounted.\n    var node = ReactDOMComponentTree.getNodeFromInstance(inst);\n\n    // Detach value from defaultValue. We won't do anything if we're working on\n    // submit or reset inputs as those values & defaultValues are linked. They\n    // are not resetable nodes so this operation doesn't matter and actually\n    // removes browser-default values (eg \"Submit Query\") when no value is\n    // provided.\n\n    switch (props.type) {\n      case 'submit':\n      case 'reset':\n        break;\n      case 'color':\n      case 'date':\n      case 'datetime':\n      case 'datetime-local':\n      case 'month':\n      case 'time':\n      case 'week':\n        // This fixes the no-show issue on iOS Safari and Android Chrome:\n        // https://github.com/facebook/react/issues/7233\n        node.value = '';\n        node.value = node.defaultValue;\n        break;\n      default:\n        node.value = node.value;\n        break;\n    }\n\n    // Normally, we'd just do `node.checked = node.checked` upon initial mount, less this bug\n    // this is needed to work around a chrome bug where setting defaultChecked\n    // will sometimes influence the value of checked (even after detachment).\n    // Reference: https://bugs.chromium.org/p/chromium/issues/detail?id=608416\n    // We need to temporarily unset name to avoid disrupting radio button groups.\n    var name = node.name;\n    if (name !== '') {\n      node.name = '';\n    }\n    node.defaultChecked = !node.defaultChecked;\n    node.defaultChecked = !node.defaultChecked;\n    if (name !== '') {\n      node.name = name;\n    }\n  }\n};\n\nfunction _handleChange(event) {\n  var props = this._currentElement.props;\n\n  var returnValue = LinkedValueUtils.executeOnChange(props, event);\n\n  // Here we use asap to wait until all updates have propagated, which\n  // is important when using controlled components within layers:\n  // https://github.com/facebook/react/issues/1698\n  ReactUpdates.asap(forceUpdateIfMounted, this);\n\n  var name = props.name;\n  if (props.type === 'radio' && name != null) {\n    var rootNode = ReactDOMComponentTree.getNodeFromInstance(this);\n    var queryRoot = rootNode;\n\n    while (queryRoot.parentNode) {\n      queryRoot = queryRoot.parentNode;\n    }\n\n    // If `rootNode.form` was non-null, then we could try `form.elements`,\n    // but that sometimes behaves strangely in IE8. We could also try using\n    // `form.getElementsByName`, but that will only return direct children\n    // and won't include inputs that use the HTML5 `form=` attribute. Since\n    // the input might not even be in a form, let's just use the global\n    // `querySelectorAll` to ensure we don't miss anything.\n    var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type=\"radio\"]');\n\n    for (var i = 0; i < group.length; i++) {\n      var otherNode = group[i];\n      if (otherNode === rootNode || otherNode.form !== rootNode.form) {\n        continue;\n      }\n      // This will throw if radio buttons rendered by different copies of React\n      // and the same name are rendered into the same form (same as #1939).\n      // That's probably okay; we don't support it just as we don't support\n      // mixing React radio buttons with non-React ones.\n      var otherInstance = ReactDOMComponentTree.getInstanceFromNode(otherNode);\n      !otherInstance ?  true ? invariant(false, 'ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported.') : _prodInvariant('90') : void 0;\n      // If this is a controlled radio button group, forcing the input that\n      // was previously checked to update will cause it to be come re-checked\n      // as appropriate.\n      ReactUpdates.asap(forceUpdateIfMounted, otherInstance);\n    }\n  }\n\n  return returnValue;\n}\n\nmodule.exports = ReactDOMInput;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NSW5wdXQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKSxcbiAgICBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgRE9NUHJvcGVydHlPcGVyYXRpb25zID0gcmVxdWlyZSgnLi9ET01Qcm9wZXJ0eU9wZXJhdGlvbnMnKTtcbnZhciBMaW5rZWRWYWx1ZVV0aWxzID0gcmVxdWlyZSgnLi9MaW5rZWRWYWx1ZVV0aWxzJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIGRpZFdhcm5WYWx1ZUxpbmsgPSBmYWxzZTtcbnZhciBkaWRXYXJuQ2hlY2tlZExpbmsgPSBmYWxzZTtcbnZhciBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSBmYWxzZTtcbnZhciBkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkID0gZmFsc2U7XG52YXIgZGlkV2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gZm9yY2VVcGRhdGVJZk1vdW50ZWQoKSB7XG4gIGlmICh0aGlzLl9yb290Tm9kZUlEKSB7XG4gICAgLy8gRE9NIGNvbXBvbmVudCBpcyBzdGlsbCBtb3VudGVkOyB1cGRhdGVcbiAgICBSZWFjdERPTUlucHV0LnVwZGF0ZVdyYXBwZXIodGhpcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDb250cm9sbGVkKHByb3BzKSB7XG4gIHZhciB1c2VzQ2hlY2tlZCA9IHByb3BzLnR5cGUgPT09ICdjaGVja2JveCcgfHwgcHJvcHMudHlwZSA9PT0gJ3JhZGlvJztcbiAgcmV0dXJuIHVzZXNDaGVja2VkID8gcHJvcHMuY2hlY2tlZCAhPSBudWxsIDogcHJvcHMudmFsdWUgIT0gbnVsbDtcbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIGFuIDxpbnB1dD4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgc2V0dGluZyB0aGVzZSBvcHRpb25hbFxuICogcHJvcHM6IGBjaGVja2VkYCwgYHZhbHVlYCwgYGRlZmF1bHRDaGVja2VkYCwgYW5kIGBkZWZhdWx0VmFsdWVgLlxuICpcbiAqIElmIGBjaGVja2VkYCBvciBgdmFsdWVgIGFyZSBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zXG4gKiB0aGF0IGFmZmVjdCB0aGUgY2hlY2tlZCBzdGF0ZSBvciB2YWx1ZSB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC5cbiAqXG4gKiBJZiB0aGV5IGFyZSBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgbm90XG4gKiB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuIEluc3RlYWQsIHRoZSBwcm9wcyBtdXN0IGNoYW5nZSBpbiBvcmRlciBmb3JcbiAqIHRoZSByZW5kZXJlZCBlbGVtZW50IHRvIGJlIHVwZGF0ZWQuXG4gKlxuICogVGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBiZSBpbml0aWFsaXplZCBhcyB1bmNoZWNrZWQgKG9yIGBkZWZhdWx0Q2hlY2tlZGApXG4gKiB3aXRoIGFuIGVtcHR5IHZhbHVlIChvciBgZGVmYXVsdFZhbHVlYCkuXG4gKlxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEyL1dELWh0bWw1LTIwMTIxMDI1L3RoZS1pbnB1dC1lbGVtZW50Lmh0bWxcbiAqL1xudmFyIFJlYWN0RE9NSW5wdXQgPSB7XG4gIGdldEhvc3RQcm9wczogZnVuY3Rpb24gKGluc3QsIHByb3BzKSB7XG4gICAgdmFyIHZhbHVlID0gTGlua2VkVmFsdWVVdGlscy5nZXRWYWx1ZShwcm9wcyk7XG4gICAgdmFyIGNoZWNrZWQgPSBMaW5rZWRWYWx1ZVV0aWxzLmdldENoZWNrZWQocHJvcHMpO1xuXG4gICAgdmFyIGhvc3RQcm9wcyA9IF9hc3NpZ24oe1xuICAgICAgLy8gTWFrZSBzdXJlIHdlIHNldCAudHlwZSBiZWZvcmUgYW55IG90aGVyIHByb3BlcnRpZXMgKHNldHRpbmcgLnZhbHVlXG4gICAgICAvLyBiZWZvcmUgLnR5cGUgbWVhbnMgLnZhbHVlIGlzIGxvc3QgaW4gSUUxMSBhbmQgYmVsb3cpXG4gICAgICB0eXBlOiB1bmRlZmluZWQsXG4gICAgICAvLyBNYWtlIHN1cmUgd2Ugc2V0IC5zdGVwIGJlZm9yZSAudmFsdWUgKHNldHRpbmcgLnZhbHVlIGJlZm9yZSAuc3RlcFxuICAgICAgLy8gbWVhbnMgLnZhbHVlIGlzIHJvdW5kZWQgb24gbW91bnQsIGJhc2VkIHVwb24gc3RlcCBwcmVjaXNpb24pXG4gICAgICBzdGVwOiB1bmRlZmluZWQsXG4gICAgICAvLyBNYWtlIHN1cmUgd2Ugc2V0IC5taW4gJiAubWF4IGJlZm9yZSAudmFsdWUgKHRvIGVuc3VyZSBwcm9wZXIgb3JkZXJcbiAgICAgIC8vIGluIGNvcm5lciBjYXNlcyBzdWNoIGFzIG1pbiBvciBtYXggZGVyaXZpbmcgZnJvbSB2YWx1ZSwgZS5nLiBJc3N1ZSAjNzE3MClcbiAgICAgIG1pbjogdW5kZWZpbmVkLFxuICAgICAgbWF4OiB1bmRlZmluZWRcbiAgICB9LCBwcm9wcywge1xuICAgICAgZGVmYXVsdENoZWNrZWQ6IHVuZGVmaW5lZCxcbiAgICAgIGRlZmF1bHRWYWx1ZTogdW5kZWZpbmVkLFxuICAgICAgdmFsdWU6IHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6IGluc3QuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUsXG4gICAgICBjaGVja2VkOiBjaGVja2VkICE9IG51bGwgPyBjaGVja2VkIDogaW5zdC5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkLFxuICAgICAgb25DaGFuZ2U6IGluc3QuX3dyYXBwZXJTdGF0ZS5vbkNoYW5nZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhvc3RQcm9wcztcbiAgfSxcblxuICBtb3VudFdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0LCBwcm9wcykge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBMaW5rZWRWYWx1ZVV0aWxzLmNoZWNrUHJvcFR5cGVzKCdpbnB1dCcsIHByb3BzLCBpbnN0Ll9jdXJyZW50RWxlbWVudC5fb3duZXIpO1xuXG4gICAgICB2YXIgb3duZXIgPSBpbnN0Ll9jdXJyZW50RWxlbWVudC5fb3duZXI7XG5cbiAgICAgIGlmIChwcm9wcy52YWx1ZUxpbmsgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlTGluaykge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2B2YWx1ZUxpbmtgIHByb3Agb24gYGlucHV0YCBpcyBkZXByZWNhdGVkOyBzZXQgYHZhbHVlYCBhbmQgYG9uQ2hhbmdlYCBpbnN0ZWFkLicpIDogdm9pZCAwO1xuICAgICAgICBkaWRXYXJuVmFsdWVMaW5rID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5jaGVja2VkTGluayAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuQ2hlY2tlZExpbmspIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdgY2hlY2tlZExpbmtgIHByb3Agb24gYGlucHV0YCBpcyBkZXByZWNhdGVkOyBzZXQgYHZhbHVlYCBhbmQgYG9uQ2hhbmdlYCBpbnN0ZWFkLicpIDogdm9pZCAwO1xuICAgICAgICBkaWRXYXJuQ2hlY2tlZExpbmsgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLmNoZWNrZWQgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkKSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggY2hlY2tlZCBhbmQgZGVmYXVsdENoZWNrZWQgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIGNoZWNrZWQgcHJvcCwgb3IgdGhlIGRlZmF1bHRDaGVja2VkIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cycsIG93bmVyICYmIG93bmVyLmdldE5hbWUoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKSA6IHZvaWQgMDtcbiAgICAgICAgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1ZSBwcm9wcy4gJyArICdJbnB1dCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9mYi5tZS9yZWFjdC1jb250cm9sbGVkLWNvbXBvbmVudHMnLCBvd25lciAmJiBvd25lci5nZXROYW1lKCkgfHwgJ0EgY29tcG9uZW50JywgcHJvcHMudHlwZSkgOiB2b2lkIDA7XG4gICAgICAgIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZTtcbiAgICBpbnN0Ll93cmFwcGVyU3RhdGUgPSB7XG4gICAgICBpbml0aWFsQ2hlY2tlZDogcHJvcHMuY2hlY2tlZCAhPSBudWxsID8gcHJvcHMuY2hlY2tlZCA6IHByb3BzLmRlZmF1bHRDaGVja2VkLFxuICAgICAgaW5pdGlhbFZhbHVlOiBwcm9wcy52YWx1ZSAhPSBudWxsID8gcHJvcHMudmFsdWUgOiBkZWZhdWx0VmFsdWUsXG4gICAgICBsaXN0ZW5lcnM6IG51bGwsXG4gICAgICBvbkNoYW5nZTogX2hhbmRsZUNoYW5nZS5iaW5kKGluc3QpXG4gICAgfTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpbnN0Ll93cmFwcGVyU3RhdGUuY29udHJvbGxlZCA9IGlzQ29udHJvbGxlZChwcm9wcyk7XG4gICAgfVxuICB9LFxuXG4gIHVwZGF0ZVdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgdmFyIHByb3BzID0gaW5zdC5fY3VycmVudEVsZW1lbnQucHJvcHM7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIGNvbnRyb2xsZWQgPSBpc0NvbnRyb2xsZWQocHJvcHMpO1xuICAgICAgdmFyIG93bmVyID0gaW5zdC5fY3VycmVudEVsZW1lbnQuX293bmVyO1xuXG4gICAgICBpZiAoIWluc3QuX3dyYXBwZXJTdGF0ZS5jb250cm9sbGVkICYmIGNvbnRyb2xsZWQgJiYgIWRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyBpcyBjaGFuZ2luZyBhbiB1bmNvbnRyb2xsZWQgaW5wdXQgb2YgdHlwZSAlcyB0byBiZSBjb250cm9sbGVkLiAnICsgJ0lucHV0IGVsZW1lbnRzIHNob3VsZCBub3Qgc3dpdGNoIGZyb20gdW5jb250cm9sbGVkIHRvIGNvbnRyb2xsZWQgKG9yIHZpY2UgdmVyc2EpLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cycsIG93bmVyICYmIG93bmVyLmdldE5hbWUoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKSA6IHZvaWQgMDtcbiAgICAgICAgZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaW5zdC5fd3JhcHBlclN0YXRlLmNvbnRyb2xsZWQgJiYgIWNvbnRyb2xsZWQgJiYgIWRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyBpcyBjaGFuZ2luZyBhIGNvbnRyb2xsZWQgaW5wdXQgb2YgdHlwZSAlcyB0byBiZSB1bmNvbnRyb2xsZWQuICcgKyAnSW5wdXQgZWxlbWVudHMgc2hvdWxkIG5vdCBzd2l0Y2ggZnJvbSBjb250cm9sbGVkIHRvIHVuY29udHJvbGxlZCAob3IgdmljZSB2ZXJzYSkuICcgKyAnRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29tcG9uZW50LiBNb3JlIGluZm86IGh0dHBzOi8vZmIubWUvcmVhY3QtY29udHJvbGxlZC1jb21wb25lbnRzJywgb3duZXIgJiYgb3duZXIuZ2V0TmFtZSgpIHx8ICdBIGNvbXBvbmVudCcsIHByb3BzLnR5cGUpIDogdm9pZCAwO1xuICAgICAgICBkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPOiBTaG91bGRuJ3QgdGhpcyBiZSBnZXRDaGVja2VkKHByb3BzKT9cbiAgICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG4gICAgaWYgKGNoZWNrZWQgIT0gbnVsbCkge1xuICAgICAgRE9NUHJvcGVydHlPcGVyYXRpb25zLnNldFZhbHVlRm9yUHJvcGVydHkoUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCksICdjaGVja2VkJywgY2hlY2tlZCB8fCBmYWxzZSk7XG4gICAgfVxuXG4gICAgdmFyIG5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTtcbiAgICB2YXIgdmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTtcbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuXG4gICAgICAvLyBDYXN0IGB2YWx1ZWAgdG8gYSBzdHJpbmcgdG8gZW5zdXJlIHRoZSB2YWx1ZSBpcyBzZXQgY29ycmVjdGx5LiBXaGlsZVxuICAgICAgLy8gYnJvd3NlcnMgdHlwaWNhbGx5IGRvIHRoaXMgYXMgbmVjZXNzYXJ5LCBqc2RvbSBkb2Vzbid0LlxuICAgICAgdmFyIG5ld1ZhbHVlID0gJycgKyB2YWx1ZTtcblxuICAgICAgLy8gVG8gYXZvaWQgc2lkZSBlZmZlY3RzIChzdWNoIGFzIGxvc2luZyB0ZXh0IHNlbGVjdGlvbiksIG9ubHkgc2V0IHZhbHVlIGlmIGNoYW5nZWRcbiAgICAgIGlmIChuZXdWYWx1ZSAhPT0gbm9kZS52YWx1ZSkge1xuICAgICAgICBub2RlLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwcm9wcy52YWx1ZSA9PSBudWxsICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIC8vIEluIENocm9tZSwgYXNzaWduaW5nIGRlZmF1bHRWYWx1ZSB0byBjZXJ0YWluIGlucHV0IHR5cGVzIHRyaWdnZXJzIGlucHV0IHZhbGlkYXRpb24uXG4gICAgICAgIC8vIEZvciBudW1iZXIgaW5wdXRzLCB0aGUgZGlzcGxheSB2YWx1ZSBsb3NlcyB0cmFpbGluZyBkZWNpbWFsIHBvaW50cy4gRm9yIGVtYWlsIGlucHV0cyxcbiAgICAgICAgLy8gQ2hyb21lIHJhaXNlcyBcIlRoZSBzcGVjaWZpZWQgdmFsdWUgPHg+IGlzIG5vdCBhIHZhbGlkIGVtYWlsIGFkZHJlc3NcIi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSGVyZSB3ZSBjaGVjayB0byBzZWUgaWYgdGhlIGRlZmF1bHRWYWx1ZSBoYXMgYWN0dWFsbHkgY2hhbmdlZCwgYXZvaWRpbmcgdGhlc2UgcHJvYmxlbXNcbiAgICAgICAgLy8gd2hlbiB0aGUgdXNlciBpcyBpbnB1dHRpbmcgdGV4dFxuICAgICAgICAvL1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyNTNcbiAgICAgICAgaWYgKG5vZGUuZGVmYXVsdFZhbHVlICE9PSAnJyArIHByb3BzLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gJycgKyBwcm9wcy5kZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5jaGVja2VkID09IG51bGwgJiYgcHJvcHMuZGVmYXVsdENoZWNrZWQgIT0gbnVsbCkge1xuICAgICAgICBub2RlLmRlZmF1bHRDaGVja2VkID0gISFwcm9wcy5kZWZhdWx0Q2hlY2tlZDtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgcG9zdE1vdW50V3JhcHBlcjogZnVuY3Rpb24gKGluc3QpIHtcbiAgICB2YXIgcHJvcHMgPSBpbnN0Ll9jdXJyZW50RWxlbWVudC5wcm9wcztcblxuICAgIC8vIFRoaXMgaXMgaW4gcG9zdE1vdW50IGJlY2F1c2Ugd2UgbmVlZCBhY2Nlc3MgdG8gdGhlIERPTSBub2RlLCB3aGljaCBpcyBub3RcbiAgICAvLyBhdmFpbGFibGUgdW50aWwgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgbW91bnRlZC5cbiAgICB2YXIgbm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpO1xuXG4gICAgLy8gRGV0YWNoIHZhbHVlIGZyb20gZGVmYXVsdFZhbHVlLiBXZSB3b24ndCBkbyBhbnl0aGluZyBpZiB3ZSdyZSB3b3JraW5nIG9uXG4gICAgLy8gc3VibWl0IG9yIHJlc2V0IGlucHV0cyBhcyB0aG9zZSB2YWx1ZXMgJiBkZWZhdWx0VmFsdWVzIGFyZSBsaW5rZWQuIFRoZXlcbiAgICAvLyBhcmUgbm90IHJlc2V0YWJsZSBub2RlcyBzbyB0aGlzIG9wZXJhdGlvbiBkb2Vzbid0IG1hdHRlciBhbmQgYWN0dWFsbHlcbiAgICAvLyByZW1vdmVzIGJyb3dzZXItZGVmYXVsdCB2YWx1ZXMgKGVnIFwiU3VibWl0IFF1ZXJ5XCIpIHdoZW4gbm8gdmFsdWUgaXNcbiAgICAvLyBwcm92aWRlZC5cblxuICAgIHN3aXRjaCAocHJvcHMudHlwZSkge1xuICAgICAgY2FzZSAnc3VibWl0JzpcbiAgICAgIGNhc2UgJ3Jlc2V0JzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjb2xvcic6XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgIGNhc2UgJ2RhdGV0aW1lJzpcbiAgICAgIGNhc2UgJ2RhdGV0aW1lLWxvY2FsJzpcbiAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgIC8vIFRoaXMgZml4ZXMgdGhlIG5vLXNob3cgaXNzdWUgb24gaU9TIFNhZmFyaSBhbmQgQW5kcm9pZCBDaHJvbWU6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzIzM1xuICAgICAgICBub2RlLnZhbHVlID0gJyc7XG4gICAgICAgIG5vZGUudmFsdWUgPSBub2RlLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBub2RlLnZhbHVlID0gbm9kZS52YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gTm9ybWFsbHksIHdlJ2QganVzdCBkbyBgbm9kZS5jaGVja2VkID0gbm9kZS5jaGVja2VkYCB1cG9uIGluaXRpYWwgbW91bnQsIGxlc3MgdGhpcyBidWdcbiAgICAvLyB0aGlzIGlzIG5lZWRlZCB0byB3b3JrIGFyb3VuZCBhIGNocm9tZSBidWcgd2hlcmUgc2V0dGluZyBkZWZhdWx0Q2hlY2tlZFxuICAgIC8vIHdpbGwgc29tZXRpbWVzIGluZmx1ZW5jZSB0aGUgdmFsdWUgb2YgY2hlY2tlZCAoZXZlbiBhZnRlciBkZXRhY2htZW50KS5cbiAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTYwODQxNlxuICAgIC8vIFdlIG5lZWQgdG8gdGVtcG9yYXJpbHkgdW5zZXQgbmFtZSB0byBhdm9pZCBkaXNydXB0aW5nIHJhZGlvIGJ1dHRvbiBncm91cHMuXG4gICAgdmFyIG5hbWUgPSBub2RlLm5hbWU7XG4gICAgaWYgKG5hbWUgIT09ICcnKSB7XG4gICAgICBub2RlLm5hbWUgPSAnJztcbiAgICB9XG4gICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICFub2RlLmRlZmF1bHRDaGVja2VkO1xuICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhbm9kZS5kZWZhdWx0Q2hlY2tlZDtcbiAgICBpZiAobmFtZSAhPT0gJycpIHtcbiAgICAgIG5vZGUubmFtZSA9IG5hbWU7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBfaGFuZGxlQ2hhbmdlKGV2ZW50KSB7XG4gIHZhciBwcm9wcyA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzO1xuXG4gIHZhciByZXR1cm5WYWx1ZSA9IExpbmtlZFZhbHVlVXRpbHMuZXhlY3V0ZU9uQ2hhbmdlKHByb3BzLCBldmVudCk7XG5cbiAgLy8gSGVyZSB3ZSB1c2UgYXNhcCB0byB3YWl0IHVudGlsIGFsbCB1cGRhdGVzIGhhdmUgcHJvcGFnYXRlZCwgd2hpY2hcbiAgLy8gaXMgaW1wb3J0YW50IHdoZW4gdXNpbmcgY29udHJvbGxlZCBjb21wb25lbnRzIHdpdGhpbiBsYXllcnM6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY5OFxuICBSZWFjdFVwZGF0ZXMuYXNhcChmb3JjZVVwZGF0ZUlmTW91bnRlZCwgdGhpcyk7XG5cbiAgdmFyIG5hbWUgPSBwcm9wcy5uYW1lO1xuICBpZiAocHJvcHMudHlwZSA9PT0gJ3JhZGlvJyAmJiBuYW1lICE9IG51bGwpIHtcbiAgICB2YXIgcm9vdE5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0aGlzKTtcbiAgICB2YXIgcXVlcnlSb290ID0gcm9vdE5vZGU7XG5cbiAgICB3aGlsZSAocXVlcnlSb290LnBhcmVudE5vZGUpIHtcbiAgICAgIHF1ZXJ5Um9vdCA9IHF1ZXJ5Um9vdC5wYXJlbnROb2RlO1xuICAgIH1cblxuICAgIC8vIElmIGByb290Tm9kZS5mb3JtYCB3YXMgbm9uLW51bGwsIHRoZW4gd2UgY291bGQgdHJ5IGBmb3JtLmVsZW1lbnRzYCxcbiAgICAvLyBidXQgdGhhdCBzb21ldGltZXMgYmVoYXZlcyBzdHJhbmdlbHkgaW4gSUU4LiBXZSBjb3VsZCBhbHNvIHRyeSB1c2luZ1xuICAgIC8vIGBmb3JtLmdldEVsZW1lbnRzQnlOYW1lYCwgYnV0IHRoYXQgd2lsbCBvbmx5IHJldHVybiBkaXJlY3QgY2hpbGRyZW5cbiAgICAvLyBhbmQgd29uJ3QgaW5jbHVkZSBpbnB1dHMgdGhhdCB1c2UgdGhlIEhUTUw1IGBmb3JtPWAgYXR0cmlidXRlLiBTaW5jZVxuICAgIC8vIHRoZSBpbnB1dCBtaWdodCBub3QgZXZlbiBiZSBpbiBhIGZvcm0sIGxldCdzIGp1c3QgdXNlIHRoZSBnbG9iYWxcbiAgICAvLyBgcXVlcnlTZWxlY3RvckFsbGAgdG8gZW5zdXJlIHdlIGRvbid0IG1pc3MgYW55dGhpbmcuXG4gICAgdmFyIGdyb3VwID0gcXVlcnlSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9JyArIEpTT04uc3RyaW5naWZ5KCcnICsgbmFtZSkgKyAnXVt0eXBlPVwicmFkaW9cIl0nKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXAubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBvdGhlck5vZGUgPSBncm91cFtpXTtcbiAgICAgIGlmIChvdGhlck5vZGUgPT09IHJvb3ROb2RlIHx8IG90aGVyTm9kZS5mb3JtICE9PSByb290Tm9kZS5mb3JtKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGlmIHJhZGlvIGJ1dHRvbnMgcmVuZGVyZWQgYnkgZGlmZmVyZW50IGNvcGllcyBvZiBSZWFjdFxuICAgICAgLy8gYW5kIHRoZSBzYW1lIG5hbWUgYXJlIHJlbmRlcmVkIGludG8gdGhlIHNhbWUgZm9ybSAoc2FtZSBhcyAjMTkzOSkuXG4gICAgICAvLyBUaGF0J3MgcHJvYmFibHkgb2theTsgd2UgZG9uJ3Qgc3VwcG9ydCBpdCBqdXN0IGFzIHdlIGRvbid0IHN1cHBvcnRcbiAgICAgIC8vIG1peGluZyBSZWFjdCByYWRpbyBidXR0b25zIHdpdGggbm9uLVJlYWN0IG9uZXMuXG4gICAgICB2YXIgb3RoZXJJbnN0YW5jZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG90aGVyTm9kZSk7XG4gICAgICAhb3RoZXJJbnN0YW5jZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdERPTUlucHV0OiBNaXhpbmcgUmVhY3QgYW5kIG5vbi1SZWFjdCByYWRpbyBpbnB1dHMgd2l0aCB0aGUgc2FtZSBgbmFtZWAgaXMgbm90IHN1cHBvcnRlZC4nKSA6IF9wcm9kSW52YXJpYW50KCc5MCcpIDogdm9pZCAwO1xuICAgICAgLy8gSWYgdGhpcyBpcyBhIGNvbnRyb2xsZWQgcmFkaW8gYnV0dG9uIGdyb3VwLCBmb3JjaW5nIHRoZSBpbnB1dCB0aGF0XG4gICAgICAvLyB3YXMgcHJldmlvdXNseSBjaGVja2VkIHRvIHVwZGF0ZSB3aWxsIGNhdXNlIGl0IHRvIGJlIGNvbWUgcmUtY2hlY2tlZFxuICAgICAgLy8gYXMgYXBwcm9wcmlhdGUuXG4gICAgICBSZWFjdFVwZGF0ZXMuYXNhcChmb3JjZVVwZGF0ZUlmTW91bnRlZCwgb3RoZXJJbnN0YW5jZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldHVyblZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NSW5wdXQ7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RET01JbnB1dC5qc1xuLy8gbW9kdWxlIGlkID0gMjgxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 282 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nvar React = __webpack_require__(175);\nvar ReactPropTypesSecret = __webpack_require__(283);\n\nvar invariant = __webpack_require__(180);\nvar warning = __webpack_require__(183);\n\nvar hasReadOnlyValue = {\n  'button': true,\n  'checkbox': true,\n  'image': true,\n  'hidden': true,\n  'radio': true,\n  'reset': true,\n  'submit': true\n};\n\nfunction _assertSingleLink(inputProps) {\n  !(inputProps.checkedLink == null || inputProps.valueLink == null) ?  true ? invariant(false, 'Cannot provide a checkedLink and a valueLink. If you want to use checkedLink, you probably don\\'t want to use valueLink and vice versa.') : _prodInvariant('87') : void 0;\n}\nfunction _assertValueLink(inputProps) {\n  _assertSingleLink(inputProps);\n  !(inputProps.value == null && inputProps.onChange == null) ?  true ? invariant(false, 'Cannot provide a valueLink and a value or onChange event. If you want to use value or onChange, you probably don\\'t want to use valueLink.') : _prodInvariant('88') : void 0;\n}\n\nfunction _assertCheckedLink(inputProps) {\n  _assertSingleLink(inputProps);\n  !(inputProps.checked == null && inputProps.onChange == null) ?  true ? invariant(false, 'Cannot provide a checkedLink and a checked property or onChange event. If you want to use checked or onChange, you probably don\\'t want to use checkedLink') : _prodInvariant('89') : void 0;\n}\n\nvar propTypes = {\n  value: function (props, propName, componentName) {\n    if (!props[propName] || hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled) {\n      return null;\n    }\n    return new Error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.');\n  },\n  checked: function (props, propName, componentName) {\n    if (!props[propName] || props.onChange || props.readOnly || props.disabled) {\n      return null;\n    }\n    return new Error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.');\n  },\n  onChange: React.PropTypes.func\n};\n\nvar loggedTypeFailures = {};\nfunction getDeclarationErrorAddendum(owner) {\n  if (owner) {\n    var name = owner.getName();\n    if (name) {\n      return ' Check the render method of `' + name + '`.';\n    }\n  }\n  return '';\n}\n\n/**\n * Provide a linked `value` attribute for controlled forms. You should not use\n * this outside of the ReactDOM controlled form components.\n */\nvar LinkedValueUtils = {\n  checkPropTypes: function (tagName, props, owner) {\n    for (var propName in propTypes) {\n      if (propTypes.hasOwnProperty(propName)) {\n        var error = propTypes[propName](props, propName, tagName, 'prop', null, ReactPropTypesSecret);\n      }\n      if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n        // Only monitor this failure once because there tends to be a lot of the\n        // same error.\n        loggedTypeFailures[error.message] = true;\n\n        var addendum = getDeclarationErrorAddendum(owner);\n         true ? warning(false, 'Failed form propType: %s%s', error.message, addendum) : void 0;\n      }\n    }\n  },\n\n  /**\n   * @param {object} inputProps Props for form component\n   * @return {*} current value of the input either from value prop or link.\n   */\n  getValue: function (inputProps) {\n    if (inputProps.valueLink) {\n      _assertValueLink(inputProps);\n      return inputProps.valueLink.value;\n    }\n    return inputProps.value;\n  },\n\n  /**\n   * @param {object} inputProps Props for form component\n   * @return {*} current checked status of the input either from checked prop\n   *             or link.\n   */\n  getChecked: function (inputProps) {\n    if (inputProps.checkedLink) {\n      _assertCheckedLink(inputProps);\n      return inputProps.checkedLink.value;\n    }\n    return inputProps.checked;\n  },\n\n  /**\n   * @param {object} inputProps Props for form component\n   * @param {SyntheticEvent} event change event to handle\n   */\n  executeOnChange: function (inputProps, event) {\n    if (inputProps.valueLink) {\n      _assertValueLink(inputProps);\n      return inputProps.valueLink.requestChange(event.target.value);\n    } else if (inputProps.checkedLink) {\n      _assertCheckedLink(inputProps);\n      return inputProps.checkedLink.requestChange(event.target.checked);\n    } else if (inputProps.onChange) {\n      return inputProps.onChange.call(undefined, event);\n    }\n  }\n};\n\nmodule.exports = LinkedValueUtils;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0xpbmtlZFZhbHVlVXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Jyk7XG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgaGFzUmVhZE9ubHlWYWx1ZSA9IHtcbiAgJ2J1dHRvbic6IHRydWUsXG4gICdjaGVja2JveCc6IHRydWUsXG4gICdpbWFnZSc6IHRydWUsXG4gICdoaWRkZW4nOiB0cnVlLFxuICAncmFkaW8nOiB0cnVlLFxuICAncmVzZXQnOiB0cnVlLFxuICAnc3VibWl0JzogdHJ1ZVxufTtcblxuZnVuY3Rpb24gX2Fzc2VydFNpbmdsZUxpbmsoaW5wdXRQcm9wcykge1xuICAhKGlucHV0UHJvcHMuY2hlY2tlZExpbmsgPT0gbnVsbCB8fCBpbnB1dFByb3BzLnZhbHVlTGluayA9PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW5ub3QgcHJvdmlkZSBhIGNoZWNrZWRMaW5rIGFuZCBhIHZhbHVlTGluay4gSWYgeW91IHdhbnQgdG8gdXNlIGNoZWNrZWRMaW5rLCB5b3UgcHJvYmFibHkgZG9uXFwndCB3YW50IHRvIHVzZSB2YWx1ZUxpbmsgYW5kIHZpY2UgdmVyc2EuJykgOiBfcHJvZEludmFyaWFudCgnODcnKSA6IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIF9hc3NlcnRWYWx1ZUxpbmsoaW5wdXRQcm9wcykge1xuICBfYXNzZXJ0U2luZ2xlTGluayhpbnB1dFByb3BzKTtcbiAgIShpbnB1dFByb3BzLnZhbHVlID09IG51bGwgJiYgaW5wdXRQcm9wcy5vbkNoYW5nZSA9PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW5ub3QgcHJvdmlkZSBhIHZhbHVlTGluayBhbmQgYSB2YWx1ZSBvciBvbkNoYW5nZSBldmVudC4gSWYgeW91IHdhbnQgdG8gdXNlIHZhbHVlIG9yIG9uQ2hhbmdlLCB5b3UgcHJvYmFibHkgZG9uXFwndCB3YW50IHRvIHVzZSB2YWx1ZUxpbmsuJykgOiBfcHJvZEludmFyaWFudCgnODgnKSA6IHZvaWQgMDtcbn1cblxuZnVuY3Rpb24gX2Fzc2VydENoZWNrZWRMaW5rKGlucHV0UHJvcHMpIHtcbiAgX2Fzc2VydFNpbmdsZUxpbmsoaW5wdXRQcm9wcyk7XG4gICEoaW5wdXRQcm9wcy5jaGVja2VkID09IG51bGwgJiYgaW5wdXRQcm9wcy5vbkNoYW5nZSA9PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW5ub3QgcHJvdmlkZSBhIGNoZWNrZWRMaW5rIGFuZCBhIGNoZWNrZWQgcHJvcGVydHkgb3Igb25DaGFuZ2UgZXZlbnQuIElmIHlvdSB3YW50IHRvIHVzZSBjaGVja2VkIG9yIG9uQ2hhbmdlLCB5b3UgcHJvYmFibHkgZG9uXFwndCB3YW50IHRvIHVzZSBjaGVja2VkTGluaycpIDogX3Byb2RJbnZhcmlhbnQoJzg5JykgOiB2b2lkIDA7XG59XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIHZhbHVlOiBmdW5jdGlvbiAocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7XG4gICAgaWYgKCFwcm9wc1twcm9wTmFtZV0gfHwgaGFzUmVhZE9ubHlWYWx1ZVtwcm9wcy50eXBlXSB8fCBwcm9wcy5vbkNoYW5nZSB8fCBwcm9wcy5yZWFkT25seSB8fCBwcm9wcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRXJyb3IoJ1lvdSBwcm92aWRlZCBhIGB2YWx1ZWAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiAnICsgJ2BvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgJyArICd0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0VmFsdWVgLiBPdGhlcndpc2UsICcgKyAnc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuJyk7XG4gIH0sXG4gIGNoZWNrZWQ6IGZ1bmN0aW9uIChwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHtcbiAgICBpZiAoIXByb3BzW3Byb3BOYW1lXSB8fCBwcm9wcy5vbkNoYW5nZSB8fCBwcm9wcy5yZWFkT25seSB8fCBwcm9wcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRXJyb3IoJ1lvdSBwcm92aWRlZCBhIGBjaGVja2VkYCBwcm9wIHRvIGEgZm9ybSBmaWVsZCB3aXRob3V0IGFuICcgKyAnYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiAnICsgJ3RoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRDaGVja2VkYC4gT3RoZXJ3aXNlLCAnICsgJ3NldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLicpO1xuICB9LFxuICBvbkNoYW5nZTogUmVhY3QuUHJvcFR5cGVzLmZ1bmNcbn07XG5cbnZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShvd25lcikge1xuICBpZiAob3duZXIpIHtcbiAgICB2YXIgbmFtZSA9IG93bmVyLmdldE5hbWUoKTtcbiAgICBpZiAobmFtZSkge1xuICAgICAgcmV0dXJuICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIFByb3ZpZGUgYSBsaW5rZWQgYHZhbHVlYCBhdHRyaWJ1dGUgZm9yIGNvbnRyb2xsZWQgZm9ybXMuIFlvdSBzaG91bGQgbm90IHVzZVxuICogdGhpcyBvdXRzaWRlIG9mIHRoZSBSZWFjdERPTSBjb250cm9sbGVkIGZvcm0gY29tcG9uZW50cy5cbiAqL1xudmFyIExpbmtlZFZhbHVlVXRpbHMgPSB7XG4gIGNoZWNrUHJvcFR5cGVzOiBmdW5jdGlvbiAodGFnTmFtZSwgcHJvcHMsIG93bmVyKSB7XG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gcHJvcFR5cGVzKSB7XG4gICAgICBpZiAocHJvcFR5cGVzLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3IgPSBwcm9wVHlwZXNbcHJvcE5hbWVdKHByb3BzLCBwcm9wTmFtZSwgdGFnTmFtZSwgJ3Byb3AnLCBudWxsLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yLm1lc3NhZ2VdID0gdHJ1ZTtcblxuICAgICAgICB2YXIgYWRkZW5kdW0gPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0ob3duZXIpO1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ZhaWxlZCBmb3JtIHByb3BUeXBlOiAlcyVzJywgZXJyb3IubWVzc2FnZSwgYWRkZW5kdW0pIDogdm9pZCAwO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGlucHV0UHJvcHMgUHJvcHMgZm9yIGZvcm0gY29tcG9uZW50XG4gICAqIEByZXR1cm4geyp9IGN1cnJlbnQgdmFsdWUgb2YgdGhlIGlucHV0IGVpdGhlciBmcm9tIHZhbHVlIHByb3Agb3IgbGluay5cbiAgICovXG4gIGdldFZhbHVlOiBmdW5jdGlvbiAoaW5wdXRQcm9wcykge1xuICAgIGlmIChpbnB1dFByb3BzLnZhbHVlTGluaykge1xuICAgICAgX2Fzc2VydFZhbHVlTGluayhpbnB1dFByb3BzKTtcbiAgICAgIHJldHVybiBpbnB1dFByb3BzLnZhbHVlTGluay52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0UHJvcHMudmFsdWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dFByb3BzIFByb3BzIGZvciBmb3JtIGNvbXBvbmVudFxuICAgKiBAcmV0dXJuIHsqfSBjdXJyZW50IGNoZWNrZWQgc3RhdHVzIG9mIHRoZSBpbnB1dCBlaXRoZXIgZnJvbSBjaGVja2VkIHByb3BcbiAgICogICAgICAgICAgICAgb3IgbGluay5cbiAgICovXG4gIGdldENoZWNrZWQ6IGZ1bmN0aW9uIChpbnB1dFByb3BzKSB7XG4gICAgaWYgKGlucHV0UHJvcHMuY2hlY2tlZExpbmspIHtcbiAgICAgIF9hc3NlcnRDaGVja2VkTGluayhpbnB1dFByb3BzKTtcbiAgICAgIHJldHVybiBpbnB1dFByb3BzLmNoZWNrZWRMaW5rLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRQcm9wcy5jaGVja2VkO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gaW5wdXRQcm9wcyBQcm9wcyBmb3IgZm9ybSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgY2hhbmdlIGV2ZW50IHRvIGhhbmRsZVxuICAgKi9cbiAgZXhlY3V0ZU9uQ2hhbmdlOiBmdW5jdGlvbiAoaW5wdXRQcm9wcywgZXZlbnQpIHtcbiAgICBpZiAoaW5wdXRQcm9wcy52YWx1ZUxpbmspIHtcbiAgICAgIF9hc3NlcnRWYWx1ZUxpbmsoaW5wdXRQcm9wcyk7XG4gICAgICByZXR1cm4gaW5wdXRQcm9wcy52YWx1ZUxpbmsucmVxdWVzdENoYW5nZShldmVudC50YXJnZXQudmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoaW5wdXRQcm9wcy5jaGVja2VkTGluaykge1xuICAgICAgX2Fzc2VydENoZWNrZWRMaW5rKGlucHV0UHJvcHMpO1xuICAgICAgcmV0dXJuIGlucHV0UHJvcHMuY2hlY2tlZExpbmsucmVxdWVzdENoYW5nZShldmVudC50YXJnZXQuY2hlY2tlZCk7XG4gICAgfSBlbHNlIGlmIChpbnB1dFByb3BzLm9uQ2hhbmdlKSB7XG4gICAgICByZXR1cm4gaW5wdXRQcm9wcy5vbkNoYW5nZS5jYWxsKHVuZGVmaW5lZCwgZXZlbnQpO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBMaW5rZWRWYWx1ZVV0aWxzO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL0xpbmtlZFZhbHVlVXRpbHMuanNcbi8vIG1vZHVsZSBpZCA9IDI4MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 283 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJztcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlc1NlY3JldDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldC5qc1xuLy8gbW9kdWxlIGlkID0gMjgzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 284 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _assign = __webpack_require__(176);\n\nvar React = __webpack_require__(175);\nvar ReactDOMComponentTree = __webpack_require__(207);\nvar ReactDOMSelect = __webpack_require__(285);\n\nvar warning = __webpack_require__(183);\nvar didWarnInvalidOptionChildren = false;\n\nfunction flattenChildren(children) {\n  var content = '';\n\n  // Flatten children and warn if they aren't strings or numbers;\n  // invalid types are ignored.\n  React.Children.forEach(children, function (child) {\n    if (child == null) {\n      return;\n    }\n    if (typeof child === 'string' || typeof child === 'number') {\n      content += child;\n    } else if (!didWarnInvalidOptionChildren) {\n      didWarnInvalidOptionChildren = true;\n       true ? warning(false, 'Only strings and numbers are supported as <option> children.') : void 0;\n    }\n  });\n\n  return content;\n}\n\n/**\n * Implements an <option> host component that warns when `selected` is set.\n */\nvar ReactDOMOption = {\n  mountWrapper: function (inst, props, hostParent) {\n    // TODO (yungsters): Remove support for `selected` in <option>.\n    if (true) {\n       true ? warning(props.selected == null, 'Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.') : void 0;\n    }\n\n    // Look up whether this option is 'selected'\n    var selectValue = null;\n    if (hostParent != null) {\n      var selectParent = hostParent;\n\n      if (selectParent._tag === 'optgroup') {\n        selectParent = selectParent._hostParent;\n      }\n\n      if (selectParent != null && selectParent._tag === 'select') {\n        selectValue = ReactDOMSelect.getSelectValueContext(selectParent);\n      }\n    }\n\n    // If the value is null (e.g., no specified value or after initial mount)\n    // or missing (e.g., for <datalist>), we don't change props.selected\n    var selected = null;\n    if (selectValue != null) {\n      var value;\n      if (props.value != null) {\n        value = props.value + '';\n      } else {\n        value = flattenChildren(props.children);\n      }\n      selected = false;\n      if (Array.isArray(selectValue)) {\n        // multiple\n        for (var i = 0; i < selectValue.length; i++) {\n          if ('' + selectValue[i] === value) {\n            selected = true;\n            break;\n          }\n        }\n      } else {\n        selected = '' + selectValue === value;\n      }\n    }\n\n    inst._wrapperState = { selected: selected };\n  },\n\n  postMountWrapper: function (inst) {\n    // value=\"\" should make a value attribute (#6219)\n    var props = inst._currentElement.props;\n    if (props.value != null) {\n      var node = ReactDOMComponentTree.getNodeFromInstance(inst);\n      node.setAttribute('value', props.value);\n    }\n  },\n\n  getHostProps: function (inst, props) {\n    var hostProps = _assign({ selected: undefined, children: undefined }, props);\n\n    // Read state only from initial mount because <select> updates value\n    // manually; we need the initial state only for server rendering\n    if (inst._wrapperState.selected != null) {\n      hostProps.selected = inst._wrapperState.selected;\n    }\n\n    var content = flattenChildren(props.children);\n\n    if (content) {\n      hostProps.children = content;\n    }\n\n    return hostProps;\n  }\n\n};\n\nmodule.exports = ReactDOMOption;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjg0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NT3B0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3QnKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xudmFyIFJlYWN0RE9NU2VsZWN0ID0gcmVxdWlyZSgnLi9SZWFjdERPTVNlbGVjdCcpO1xuXG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcbnZhciBkaWRXYXJuSW52YWxpZE9wdGlvbkNoaWxkcmVuID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGZsYXR0ZW5DaGlsZHJlbihjaGlsZHJlbikge1xuICB2YXIgY29udGVudCA9ICcnO1xuXG4gIC8vIEZsYXR0ZW4gY2hpbGRyZW4gYW5kIHdhcm4gaWYgdGhleSBhcmVuJ3Qgc3RyaW5ncyBvciBudW1iZXJzO1xuICAvLyBpbnZhbGlkIHR5cGVzIGFyZSBpZ25vcmVkLlxuICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICBpZiAoY2hpbGQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgY2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICBjb250ZW50ICs9IGNoaWxkO1xuICAgIH0gZWxzZSBpZiAoIWRpZFdhcm5JbnZhbGlkT3B0aW9uQ2hpbGRyZW4pIHtcbiAgICAgIGRpZFdhcm5JbnZhbGlkT3B0aW9uQ2hpbGRyZW4gPSB0cnVlO1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdPbmx5IHN0cmluZ3MgYW5kIG51bWJlcnMgYXJlIHN1cHBvcnRlZCBhcyA8b3B0aW9uPiBjaGlsZHJlbi4nKSA6IHZvaWQgMDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBjb250ZW50O1xufVxuXG4vKipcbiAqIEltcGxlbWVudHMgYW4gPG9wdGlvbj4gaG9zdCBjb21wb25lbnQgdGhhdCB3YXJucyB3aGVuIGBzZWxlY3RlZGAgaXMgc2V0LlxuICovXG52YXIgUmVhY3RET01PcHRpb24gPSB7XG4gIG1vdW50V3JhcHBlcjogZnVuY3Rpb24gKGluc3QsIHByb3BzLCBob3N0UGFyZW50KSB7XG4gICAgLy8gVE9ETyAoeXVuZ3N0ZXJzKTogUmVtb3ZlIHN1cHBvcnQgZm9yIGBzZWxlY3RlZGAgaW4gPG9wdGlvbj4uXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHByb3BzLnNlbGVjdGVkID09IG51bGwsICdVc2UgdGhlIGBkZWZhdWx0VmFsdWVgIG9yIGB2YWx1ZWAgcHJvcHMgb24gPHNlbGVjdD4gaW5zdGVhZCBvZiAnICsgJ3NldHRpbmcgYHNlbGVjdGVkYCBvbiA8b3B0aW9uPi4nKSA6IHZvaWQgMDtcbiAgICB9XG5cbiAgICAvLyBMb29rIHVwIHdoZXRoZXIgdGhpcyBvcHRpb24gaXMgJ3NlbGVjdGVkJ1xuICAgIHZhciBzZWxlY3RWYWx1ZSA9IG51bGw7XG4gICAgaWYgKGhvc3RQYXJlbnQgIT0gbnVsbCkge1xuICAgICAgdmFyIHNlbGVjdFBhcmVudCA9IGhvc3RQYXJlbnQ7XG5cbiAgICAgIGlmIChzZWxlY3RQYXJlbnQuX3RhZyA9PT0gJ29wdGdyb3VwJykge1xuICAgICAgICBzZWxlY3RQYXJlbnQgPSBzZWxlY3RQYXJlbnQuX2hvc3RQYXJlbnQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxlY3RQYXJlbnQgIT0gbnVsbCAmJiBzZWxlY3RQYXJlbnQuX3RhZyA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgc2VsZWN0VmFsdWUgPSBSZWFjdERPTVNlbGVjdC5nZXRTZWxlY3RWYWx1ZUNvbnRleHQoc2VsZWN0UGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgdmFsdWUgaXMgbnVsbCAoZS5nLiwgbm8gc3BlY2lmaWVkIHZhbHVlIG9yIGFmdGVyIGluaXRpYWwgbW91bnQpXG4gICAgLy8gb3IgbWlzc2luZyAoZS5nLiwgZm9yIDxkYXRhbGlzdD4pLCB3ZSBkb24ndCBjaGFuZ2UgcHJvcHMuc2VsZWN0ZWRcbiAgICB2YXIgc2VsZWN0ZWQgPSBudWxsO1xuICAgIGlmIChzZWxlY3RWYWx1ZSAhPSBudWxsKSB7XG4gICAgICB2YXIgdmFsdWU7XG4gICAgICBpZiAocHJvcHMudmFsdWUgIT0gbnVsbCkge1xuICAgICAgICB2YWx1ZSA9IHByb3BzLnZhbHVlICsgJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IGZsYXR0ZW5DaGlsZHJlbihwcm9wcy5jaGlsZHJlbik7XG4gICAgICB9XG4gICAgICBzZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0VmFsdWUpKSB7XG4gICAgICAgIC8vIG11bHRpcGxlXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0VmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoJycgKyBzZWxlY3RWYWx1ZVtpXSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0ZWQgPSAnJyArIHNlbGVjdFZhbHVlID09PSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbnN0Ll93cmFwcGVyU3RhdGUgPSB7IHNlbGVjdGVkOiBzZWxlY3RlZCB9O1xuICB9LFxuXG4gIHBvc3RNb3VudFdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgLy8gdmFsdWU9XCJcIiBzaG91bGQgbWFrZSBhIHZhbHVlIGF0dHJpYnV0ZSAoIzYyMTkpXG4gICAgdmFyIHByb3BzID0gaW5zdC5fY3VycmVudEVsZW1lbnQucHJvcHM7XG4gICAgaWYgKHByb3BzLnZhbHVlICE9IG51bGwpIHtcbiAgICAgIHZhciBub2RlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCk7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBwcm9wcy52YWx1ZSk7XG4gICAgfVxuICB9LFxuXG4gIGdldEhvc3RQcm9wczogZnVuY3Rpb24gKGluc3QsIHByb3BzKSB7XG4gICAgdmFyIGhvc3RQcm9wcyA9IF9hc3NpZ24oeyBzZWxlY3RlZDogdW5kZWZpbmVkLCBjaGlsZHJlbjogdW5kZWZpbmVkIH0sIHByb3BzKTtcblxuICAgIC8vIFJlYWQgc3RhdGUgb25seSBmcm9tIGluaXRpYWwgbW91bnQgYmVjYXVzZSA8c2VsZWN0PiB1cGRhdGVzIHZhbHVlXG4gICAgLy8gbWFudWFsbHk7IHdlIG5lZWQgdGhlIGluaXRpYWwgc3RhdGUgb25seSBmb3Igc2VydmVyIHJlbmRlcmluZ1xuICAgIGlmIChpbnN0Ll93cmFwcGVyU3RhdGUuc2VsZWN0ZWQgIT0gbnVsbCkge1xuICAgICAgaG9zdFByb3BzLnNlbGVjdGVkID0gaW5zdC5fd3JhcHBlclN0YXRlLnNlbGVjdGVkO1xuICAgIH1cblxuICAgIHZhciBjb250ZW50ID0gZmxhdHRlbkNoaWxkcmVuKHByb3BzLmNoaWxkcmVuKTtcblxuICAgIGlmIChjb250ZW50KSB7XG4gICAgICBob3N0UHJvcHMuY2hpbGRyZW4gPSBjb250ZW50O1xuICAgIH1cblxuICAgIHJldHVybiBob3N0UHJvcHM7XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTU9wdGlvbjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdERPTU9wdGlvbi5qc1xuLy8gbW9kdWxlIGlkID0gMjg0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 285 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _assign = __webpack_require__(176);\n\nvar LinkedValueUtils = __webpack_require__(282);\nvar ReactDOMComponentTree = __webpack_require__(207);\nvar ReactUpdates = __webpack_require__(229);\n\nvar warning = __webpack_require__(183);\n\nvar didWarnValueLink = false;\nvar didWarnValueDefaultValue = false;\n\nfunction updateOptionsIfPendingUpdateAndMounted() {\n  if (this._rootNodeID && this._wrapperState.pendingUpdate) {\n    this._wrapperState.pendingUpdate = false;\n\n    var props = this._currentElement.props;\n    var value = LinkedValueUtils.getValue(props);\n\n    if (value != null) {\n      updateOptions(this, Boolean(props.multiple), value);\n    }\n  }\n}\n\nfunction getDeclarationErrorAddendum(owner) {\n  if (owner) {\n    var name = owner.getName();\n    if (name) {\n      return ' Check the render method of `' + name + '`.';\n    }\n  }\n  return '';\n}\n\nvar valuePropNames = ['value', 'defaultValue'];\n\n/**\n * Validation function for `value` and `defaultValue`.\n * @private\n */\nfunction checkSelectPropTypes(inst, props) {\n  var owner = inst._currentElement._owner;\n  LinkedValueUtils.checkPropTypes('select', props, owner);\n\n  if (props.valueLink !== undefined && !didWarnValueLink) {\n     true ? warning(false, '`valueLink` prop on `select` is deprecated; set `value` and `onChange` instead.') : void 0;\n    didWarnValueLink = true;\n  }\n\n  for (var i = 0; i < valuePropNames.length; i++) {\n    var propName = valuePropNames[i];\n    if (props[propName] == null) {\n      continue;\n    }\n    var isArray = Array.isArray(props[propName]);\n    if (props.multiple && !isArray) {\n       true ? warning(false, 'The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum(owner)) : void 0;\n    } else if (!props.multiple && isArray) {\n       true ? warning(false, 'The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum(owner)) : void 0;\n    }\n  }\n}\n\n/**\n * @param {ReactDOMComponent} inst\n * @param {boolean} multiple\n * @param {*} propValue A stringable (with `multiple`, a list of stringables).\n * @private\n */\nfunction updateOptions(inst, multiple, propValue) {\n  var selectedValue, i;\n  var options = ReactDOMComponentTree.getNodeFromInstance(inst).options;\n\n  if (multiple) {\n    selectedValue = {};\n    for (i = 0; i < propValue.length; i++) {\n      selectedValue['' + propValue[i]] = true;\n    }\n    for (i = 0; i < options.length; i++) {\n      var selected = selectedValue.hasOwnProperty(options[i].value);\n      if (options[i].selected !== selected) {\n        options[i].selected = selected;\n      }\n    }\n  } else {\n    // Do not set `select.value` as exact behavior isn't consistent across all\n    // browsers for all cases.\n    selectedValue = '' + propValue;\n    for (i = 0; i < options.length; i++) {\n      if (options[i].value === selectedValue) {\n        options[i].selected = true;\n        return;\n      }\n    }\n    if (options.length) {\n      options[0].selected = true;\n    }\n  }\n}\n\n/**\n * Implements a <select> host component that allows optionally setting the\n * props `value` and `defaultValue`. If `multiple` is false, the prop must be a\n * stringable. If `multiple` is true, the prop must be an array of stringables.\n *\n * If `value` is not supplied (or null/undefined), user actions that change the\n * selected option will trigger updates to the rendered options.\n *\n * If it is supplied (and not null/undefined), the rendered options will not\n * update in response to user actions. Instead, the `value` prop must change in\n * order for the rendered options to update.\n *\n * If `defaultValue` is provided, any options with the supplied values will be\n * selected.\n */\nvar ReactDOMSelect = {\n  getHostProps: function (inst, props) {\n    return _assign({}, props, {\n      onChange: inst._wrapperState.onChange,\n      value: undefined\n    });\n  },\n\n  mountWrapper: function (inst, props) {\n    if (true) {\n      checkSelectPropTypes(inst, props);\n    }\n\n    var value = LinkedValueUtils.getValue(props);\n    inst._wrapperState = {\n      pendingUpdate: false,\n      initialValue: value != null ? value : props.defaultValue,\n      listeners: null,\n      onChange: _handleChange.bind(inst),\n      wasMultiple: Boolean(props.multiple)\n    };\n\n    if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue) {\n       true ? warning(false, 'Select elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled select ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components') : void 0;\n      didWarnValueDefaultValue = true;\n    }\n  },\n\n  getSelectValueContext: function (inst) {\n    // ReactDOMOption looks at this initial value so the initial generated\n    // markup has correct `selected` attributes\n    return inst._wrapperState.initialValue;\n  },\n\n  postUpdateWrapper: function (inst) {\n    var props = inst._currentElement.props;\n\n    // After the initial mount, we control selected-ness manually so don't pass\n    // this value down\n    inst._wrapperState.initialValue = undefined;\n\n    var wasMultiple = inst._wrapperState.wasMultiple;\n    inst._wrapperState.wasMultiple = Boolean(props.multiple);\n\n    var value = LinkedValueUtils.getValue(props);\n    if (value != null) {\n      inst._wrapperState.pendingUpdate = false;\n      updateOptions(inst, Boolean(props.multiple), value);\n    } else if (wasMultiple !== Boolean(props.multiple)) {\n      // For simplicity, reapply `defaultValue` if `multiple` is toggled.\n      if (props.defaultValue != null) {\n        updateOptions(inst, Boolean(props.multiple), props.defaultValue);\n      } else {\n        // Revert the select back to its default unselected state.\n        updateOptions(inst, Boolean(props.multiple), props.multiple ? [] : '');\n      }\n    }\n  }\n};\n\nfunction _handleChange(event) {\n  var props = this._currentElement.props;\n  var returnValue = LinkedValueUtils.executeOnChange(props, event);\n\n  if (this._rootNodeID) {\n    this._wrapperState.pendingUpdate = true;\n  }\n  ReactUpdates.asap(updateOptionsIfPendingUpdateAndMounted, this);\n  return returnValue;\n}\n\nmodule.exports = ReactDOMSelect;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjg1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NU2VsZWN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgTGlua2VkVmFsdWVVdGlscyA9IHJlcXVpcmUoJy4vTGlua2VkVmFsdWVVdGlscycpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RVcGRhdGVzID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZXMnKTtcblxudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBkaWRXYXJuVmFsdWVMaW5rID0gZmFsc2U7XG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHVwZGF0ZU9wdGlvbnNJZlBlbmRpbmdVcGRhdGVBbmRNb3VudGVkKCkge1xuICBpZiAodGhpcy5fcm9vdE5vZGVJRCAmJiB0aGlzLl93cmFwcGVyU3RhdGUucGVuZGluZ1VwZGF0ZSkge1xuICAgIHRoaXMuX3dyYXBwZXJTdGF0ZS5wZW5kaW5nVXBkYXRlID0gZmFsc2U7XG5cbiAgICB2YXIgcHJvcHMgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcztcbiAgICB2YXIgdmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTtcblxuICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICB1cGRhdGVPcHRpb25zKHRoaXMsIEJvb2xlYW4ocHJvcHMubXVsdGlwbGUpLCB2YWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShvd25lcikge1xuICBpZiAob3duZXIpIHtcbiAgICB2YXIgbmFtZSA9IG93bmVyLmdldE5hbWUoKTtcbiAgICBpZiAobmFtZSkge1xuICAgICAgcmV0dXJuICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG52YXIgdmFsdWVQcm9wTmFtZXMgPSBbJ3ZhbHVlJywgJ2RlZmF1bHRWYWx1ZSddO1xuXG4vKipcbiAqIFZhbGlkYXRpb24gZnVuY3Rpb24gZm9yIGB2YWx1ZWAgYW5kIGBkZWZhdWx0VmFsdWVgLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2hlY2tTZWxlY3RQcm9wVHlwZXMoaW5zdCwgcHJvcHMpIHtcbiAgdmFyIG93bmVyID0gaW5zdC5fY3VycmVudEVsZW1lbnQuX293bmVyO1xuICBMaW5rZWRWYWx1ZVV0aWxzLmNoZWNrUHJvcFR5cGVzKCdzZWxlY3QnLCBwcm9wcywgb3duZXIpO1xuXG4gIGlmIChwcm9wcy52YWx1ZUxpbmsgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlTGluaykge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYHZhbHVlTGlua2AgcHJvcCBvbiBgc2VsZWN0YCBpcyBkZXByZWNhdGVkOyBzZXQgYHZhbHVlYCBhbmQgYG9uQ2hhbmdlYCBpbnN0ZWFkLicpIDogdm9pZCAwO1xuICAgIGRpZFdhcm5WYWx1ZUxpbmsgPSB0cnVlO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZVByb3BOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwcm9wTmFtZSA9IHZhbHVlUHJvcE5hbWVzW2ldO1xuICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShwcm9wc1twcm9wTmFtZV0pO1xuICAgIGlmIChwcm9wcy5tdWx0aXBsZSAmJiAhaXNBcnJheSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdUaGUgYCVzYCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11c3QgYmUgYW4gYXJyYXkgaWYgJyArICdgbXVsdGlwbGVgIGlzIHRydWUuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKG93bmVyKSkgOiB2b2lkIDA7XG4gICAgfSBlbHNlIGlmICghcHJvcHMubXVsdGlwbGUgJiYgaXNBcnJheSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdUaGUgYCVzYCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11c3QgYmUgYSBzY2FsYXIgJyArICd2YWx1ZSBpZiBgbXVsdGlwbGVgIGlzIGZhbHNlLiVzJywgcHJvcE5hbWUsIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShvd25lcikpIDogdm9pZCAwO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVhY3RET01Db21wb25lbnR9IGluc3RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbXVsdGlwbGVcbiAqIEBwYXJhbSB7Kn0gcHJvcFZhbHVlIEEgc3RyaW5nYWJsZSAod2l0aCBgbXVsdGlwbGVgLCBhIGxpc3Qgb2Ygc3RyaW5nYWJsZXMpLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gdXBkYXRlT3B0aW9ucyhpbnN0LCBtdWx0aXBsZSwgcHJvcFZhbHVlKSB7XG4gIHZhciBzZWxlY3RlZFZhbHVlLCBpO1xuICB2YXIgb3B0aW9ucyA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpLm9wdGlvbnM7XG5cbiAgaWYgKG11bHRpcGxlKSB7XG4gICAgc2VsZWN0ZWRWYWx1ZSA9IHt9O1xuICAgIGZvciAoaSA9IDA7IGkgPCBwcm9wVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHNlbGVjdGVkVmFsdWVbJycgKyBwcm9wVmFsdWVbaV1dID0gdHJ1ZTtcbiAgICB9XG4gICAgZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWxlY3RlZCA9IHNlbGVjdGVkVmFsdWUuaGFzT3duUHJvcGVydHkob3B0aW9uc1tpXS52YWx1ZSk7XG4gICAgICBpZiAob3B0aW9uc1tpXS5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHtcbiAgICAgICAgb3B0aW9uc1tpXS5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBEbyBub3Qgc2V0IGBzZWxlY3QudmFsdWVgIGFzIGV4YWN0IGJlaGF2aW9yIGlzbid0IGNvbnNpc3RlbnQgYWNyb3NzIGFsbFxuICAgIC8vIGJyb3dzZXJzIGZvciBhbGwgY2FzZXMuXG4gICAgc2VsZWN0ZWRWYWx1ZSA9ICcnICsgcHJvcFZhbHVlO1xuICAgIGZvciAoaSA9IDA7IGkgPCBvcHRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAob3B0aW9uc1tpXS52YWx1ZSA9PT0gc2VsZWN0ZWRWYWx1ZSkge1xuICAgICAgICBvcHRpb25zW2ldLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIG9wdGlvbnNbMF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEltcGxlbWVudHMgYSA8c2VsZWN0PiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBvcHRpb25hbGx5IHNldHRpbmcgdGhlXG4gKiBwcm9wcyBgdmFsdWVgIGFuZCBgZGVmYXVsdFZhbHVlYC4gSWYgYG11bHRpcGxlYCBpcyBmYWxzZSwgdGhlIHByb3AgbXVzdCBiZSBhXG4gKiBzdHJpbmdhYmxlLiBJZiBgbXVsdGlwbGVgIGlzIHRydWUsIHRoZSBwcm9wIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5nYWJsZXMuXG4gKlxuICogSWYgYHZhbHVlYCBpcyBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zIHRoYXQgY2hhbmdlIHRoZVxuICogc2VsZWN0ZWQgb3B0aW9uIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSByZW5kZXJlZCBvcHRpb25zLlxuICpcbiAqIElmIGl0IGlzIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIG9wdGlvbnMgd2lsbCBub3RcbiAqIHVwZGF0ZSBpbiByZXNwb25zZSB0byB1c2VyIGFjdGlvbnMuIEluc3RlYWQsIHRoZSBgdmFsdWVgIHByb3AgbXVzdCBjaGFuZ2UgaW5cbiAqIG9yZGVyIGZvciB0aGUgcmVuZGVyZWQgb3B0aW9ucyB0byB1cGRhdGUuXG4gKlxuICogSWYgYGRlZmF1bHRWYWx1ZWAgaXMgcHJvdmlkZWQsIGFueSBvcHRpb25zIHdpdGggdGhlIHN1cHBsaWVkIHZhbHVlcyB3aWxsIGJlXG4gKiBzZWxlY3RlZC5cbiAqL1xudmFyIFJlYWN0RE9NU2VsZWN0ID0ge1xuICBnZXRIb3N0UHJvcHM6IGZ1bmN0aW9uIChpbnN0LCBwcm9wcykge1xuICAgIHJldHVybiBfYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgb25DaGFuZ2U6IGluc3QuX3dyYXBwZXJTdGF0ZS5vbkNoYW5nZSxcbiAgICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgfSxcblxuICBtb3VudFdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0LCBwcm9wcykge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBjaGVja1NlbGVjdFByb3BUeXBlcyhpbnN0LCBwcm9wcyk7XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlID0gTGlua2VkVmFsdWVVdGlscy5nZXRWYWx1ZShwcm9wcyk7XG4gICAgaW5zdC5fd3JhcHBlclN0YXRlID0ge1xuICAgICAgcGVuZGluZ1VwZGF0ZTogZmFsc2UsXG4gICAgICBpbml0aWFsVmFsdWU6IHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6IHByb3BzLmRlZmF1bHRWYWx1ZSxcbiAgICAgIGxpc3RlbmVyczogbnVsbCxcbiAgICAgIG9uQ2hhbmdlOiBfaGFuZGxlQ2hhbmdlLmJpbmQoaW5zdCksXG4gICAgICB3YXNNdWx0aXBsZTogQm9vbGVhbihwcm9wcy5tdWx0aXBsZSlcbiAgICB9O1xuXG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdTZWxlY3QgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIHNlbGVjdCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cycpIDogdm9pZCAwO1xuICAgICAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgZ2V0U2VsZWN0VmFsdWVDb250ZXh0OiBmdW5jdGlvbiAoaW5zdCkge1xuICAgIC8vIFJlYWN0RE9NT3B0aW9uIGxvb2tzIGF0IHRoaXMgaW5pdGlhbCB2YWx1ZSBzbyB0aGUgaW5pdGlhbCBnZW5lcmF0ZWRcbiAgICAvLyBtYXJrdXAgaGFzIGNvcnJlY3QgYHNlbGVjdGVkYCBhdHRyaWJ1dGVzXG4gICAgcmV0dXJuIGluc3QuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWU7XG4gIH0sXG5cbiAgcG9zdFVwZGF0ZVdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgdmFyIHByb3BzID0gaW5zdC5fY3VycmVudEVsZW1lbnQucHJvcHM7XG5cbiAgICAvLyBBZnRlciB0aGUgaW5pdGlhbCBtb3VudCwgd2UgY29udHJvbCBzZWxlY3RlZC1uZXNzIG1hbnVhbGx5IHNvIGRvbid0IHBhc3NcbiAgICAvLyB0aGlzIHZhbHVlIGRvd25cbiAgICBpbnN0Ll93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlID0gdW5kZWZpbmVkO1xuXG4gICAgdmFyIHdhc011bHRpcGxlID0gaW5zdC5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlO1xuICAgIGluc3QuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZSA9IEJvb2xlYW4ocHJvcHMubXVsdGlwbGUpO1xuXG4gICAgdmFyIHZhbHVlID0gTGlua2VkVmFsdWVVdGlscy5nZXRWYWx1ZShwcm9wcyk7XG4gICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5wZW5kaW5nVXBkYXRlID0gZmFsc2U7XG4gICAgICB1cGRhdGVPcHRpb25zKGluc3QsIEJvb2xlYW4ocHJvcHMubXVsdGlwbGUpLCB2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh3YXNNdWx0aXBsZSAhPT0gQm9vbGVhbihwcm9wcy5tdWx0aXBsZSkpIHtcbiAgICAgIC8vIEZvciBzaW1wbGljaXR5LCByZWFwcGx5IGBkZWZhdWx0VmFsdWVgIGlmIGBtdWx0aXBsZWAgaXMgdG9nZ2xlZC5cbiAgICAgIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICB1cGRhdGVPcHRpb25zKGluc3QsIEJvb2xlYW4ocHJvcHMubXVsdGlwbGUpLCBwcm9wcy5kZWZhdWx0VmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmV2ZXJ0IHRoZSBzZWxlY3QgYmFjayB0byBpdHMgZGVmYXVsdCB1bnNlbGVjdGVkIHN0YXRlLlxuICAgICAgICB1cGRhdGVPcHRpb25zKGluc3QsIEJvb2xlYW4ocHJvcHMubXVsdGlwbGUpLCBwcm9wcy5tdWx0aXBsZSA/IFtdIDogJycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gX2hhbmRsZUNoYW5nZShldmVudCkge1xuICB2YXIgcHJvcHMgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcztcbiAgdmFyIHJldHVyblZhbHVlID0gTGlua2VkVmFsdWVVdGlscy5leGVjdXRlT25DaGFuZ2UocHJvcHMsIGV2ZW50KTtcblxuICBpZiAodGhpcy5fcm9vdE5vZGVJRCkge1xuICAgIHRoaXMuX3dyYXBwZXJTdGF0ZS5wZW5kaW5nVXBkYXRlID0gdHJ1ZTtcbiAgfVxuICBSZWFjdFVwZGF0ZXMuYXNhcCh1cGRhdGVPcHRpb25zSWZQZW5kaW5nVXBkYXRlQW5kTW91bnRlZCwgdGhpcyk7XG4gIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTVNlbGVjdDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdERPTVNlbGVjdC5qc1xuLy8gbW9kdWxlIGlkID0gMjg1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 286 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208),\n    _assign = __webpack_require__(176);\n\nvar LinkedValueUtils = __webpack_require__(282);\nvar ReactDOMComponentTree = __webpack_require__(207);\nvar ReactUpdates = __webpack_require__(229);\n\nvar invariant = __webpack_require__(180);\nvar warning = __webpack_require__(183);\n\nvar didWarnValueLink = false;\nvar didWarnValDefaultVal = false;\n\nfunction forceUpdateIfMounted() {\n  if (this._rootNodeID) {\n    // DOM component is still mounted; update\n    ReactDOMTextarea.updateWrapper(this);\n  }\n}\n\n/**\n * Implements a <textarea> host component that allows setting `value`, and\n * `defaultValue`. This differs from the traditional DOM API because value is\n * usually set as PCDATA children.\n *\n * If `value` is not supplied (or null/undefined), user actions that affect the\n * value will trigger updates to the element.\n *\n * If `value` is supplied (and not null/undefined), the rendered element will\n * not trigger updates to the element. Instead, the `value` prop must change in\n * order for the rendered element to be updated.\n *\n * The rendered element will be initialized with an empty value, the prop\n * `defaultValue` if specified, or the children content (deprecated).\n */\nvar ReactDOMTextarea = {\n  getHostProps: function (inst, props) {\n    !(props.dangerouslySetInnerHTML == null) ?  true ? invariant(false, '`dangerouslySetInnerHTML` does not make sense on <textarea>.') : _prodInvariant('91') : void 0;\n\n    // Always set children to the same thing. In IE9, the selection range will\n    // get reset if `textContent` is mutated.  We could add a check in setTextContent\n    // to only set the value if/when the value differs from the node value (which would\n    // completely solve this IE9 bug), but Sebastian+Ben seemed to like this solution.\n    // The value can be a boolean or object so that's why it's forced to be a string.\n    var hostProps = _assign({}, props, {\n      value: undefined,\n      defaultValue: undefined,\n      children: '' + inst._wrapperState.initialValue,\n      onChange: inst._wrapperState.onChange\n    });\n\n    return hostProps;\n  },\n\n  mountWrapper: function (inst, props) {\n    if (true) {\n      LinkedValueUtils.checkPropTypes('textarea', props, inst._currentElement._owner);\n      if (props.valueLink !== undefined && !didWarnValueLink) {\n         true ? warning(false, '`valueLink` prop on `textarea` is deprecated; set `value` and `onChange` instead.') : void 0;\n        didWarnValueLink = true;\n      }\n      if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValDefaultVal) {\n         true ? warning(false, 'Textarea elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled textarea ' + 'and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components') : void 0;\n        didWarnValDefaultVal = true;\n      }\n    }\n\n    var value = LinkedValueUtils.getValue(props);\n    var initialValue = value;\n\n    // Only bother fetching default value if we're going to use it\n    if (value == null) {\n      var defaultValue = props.defaultValue;\n      // TODO (yungsters): Remove support for children content in <textarea>.\n      var children = props.children;\n      if (children != null) {\n        if (true) {\n           true ? warning(false, 'Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.') : void 0;\n        }\n        !(defaultValue == null) ?  true ? invariant(false, 'If you supply `defaultValue` on a <textarea>, do not pass children.') : _prodInvariant('92') : void 0;\n        if (Array.isArray(children)) {\n          !(children.length <= 1) ?  true ? invariant(false, '<textarea> can only have at most one child.') : _prodInvariant('93') : void 0;\n          children = children[0];\n        }\n\n        defaultValue = '' + children;\n      }\n      if (defaultValue == null) {\n        defaultValue = '';\n      }\n      initialValue = defaultValue;\n    }\n\n    inst._wrapperState = {\n      initialValue: '' + initialValue,\n      listeners: null,\n      onChange: _handleChange.bind(inst)\n    };\n  },\n\n  updateWrapper: function (inst) {\n    var props = inst._currentElement.props;\n\n    var node = ReactDOMComponentTree.getNodeFromInstance(inst);\n    var value = LinkedValueUtils.getValue(props);\n    if (value != null) {\n      // Cast `value` to a string to ensure the value is set correctly. While\n      // browsers typically do this as necessary, jsdom doesn't.\n      var newValue = '' + value;\n\n      // To avoid side effects (such as losing text selection), only set value if changed\n      if (newValue !== node.value) {\n        node.value = newValue;\n      }\n      if (props.defaultValue == null) {\n        node.defaultValue = newValue;\n      }\n    }\n    if (props.defaultValue != null) {\n      node.defaultValue = props.defaultValue;\n    }\n  },\n\n  postMountWrapper: function (inst) {\n    // This is in postMount because we need access to the DOM node, which is not\n    // available until after the component has mounted.\n    var node = ReactDOMComponentTree.getNodeFromInstance(inst);\n    var textContent = node.textContent;\n\n    // Only set node.value if textContent is equal to the expected\n    // initial value. In IE10/IE11 there is a bug where the placeholder attribute\n    // will populate textContent as well.\n    // https://developer.microsoft.com/microsoft-edge/platform/issues/101525/\n    if (textContent === inst._wrapperState.initialValue) {\n      node.value = textContent;\n    }\n  }\n};\n\nfunction _handleChange(event) {\n  var props = this._currentElement.props;\n  var returnValue = LinkedValueUtils.executeOnChange(props, event);\n  ReactUpdates.asap(forceUpdateIfMounted, this);\n  return returnValue;\n}\n\nmodule.exports = ReactDOMTextarea;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjg2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NVGV4dGFyZWEuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKSxcbiAgICBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgTGlua2VkVmFsdWVVdGlscyA9IHJlcXVpcmUoJy4vTGlua2VkVmFsdWVVdGlscycpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RVcGRhdGVzID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZXMnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBkaWRXYXJuVmFsdWVMaW5rID0gZmFsc2U7XG52YXIgZGlkV2FyblZhbERlZmF1bHRWYWwgPSBmYWxzZTtcblxuZnVuY3Rpb24gZm9yY2VVcGRhdGVJZk1vdW50ZWQoKSB7XG4gIGlmICh0aGlzLl9yb290Tm9kZUlEKSB7XG4gICAgLy8gRE9NIGNvbXBvbmVudCBpcyBzdGlsbCBtb3VudGVkOyB1cGRhdGVcbiAgICBSZWFjdERPTVRleHRhcmVhLnVwZGF0ZVdyYXBwZXIodGhpcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgPHRleHRhcmVhPiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBzZXR0aW5nIGB2YWx1ZWAsIGFuZFxuICogYGRlZmF1bHRWYWx1ZWAuIFRoaXMgZGlmZmVycyBmcm9tIHRoZSB0cmFkaXRpb25hbCBET00gQVBJIGJlY2F1c2UgdmFsdWUgaXNcbiAqIHVzdWFsbHkgc2V0IGFzIFBDREFUQSBjaGlsZHJlbi5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnMgdGhhdCBhZmZlY3QgdGhlXG4gKiB2YWx1ZSB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbFxuICogbm90IHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC4gSW5zdGVhZCwgdGhlIGB2YWx1ZWAgcHJvcCBtdXN0IGNoYW5nZSBpblxuICogb3JkZXIgZm9yIHRoZSByZW5kZXJlZCBlbGVtZW50IHRvIGJlIHVwZGF0ZWQuXG4gKlxuICogVGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBiZSBpbml0aWFsaXplZCB3aXRoIGFuIGVtcHR5IHZhbHVlLCB0aGUgcHJvcFxuICogYGRlZmF1bHRWYWx1ZWAgaWYgc3BlY2lmaWVkLCBvciB0aGUgY2hpbGRyZW4gY29udGVudCAoZGVwcmVjYXRlZCkuXG4gKi9cbnZhciBSZWFjdERPTVRleHRhcmVhID0ge1xuICBnZXRIb3N0UHJvcHM6IGZ1bmN0aW9uIChpbnN0LCBwcm9wcykge1xuICAgICEocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPT0gbnVsbCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYCBkb2VzIG5vdCBtYWtlIHNlbnNlIG9uIDx0ZXh0YXJlYT4uJykgOiBfcHJvZEludmFyaWFudCgnOTEnKSA6IHZvaWQgMDtcblxuICAgIC8vIEFsd2F5cyBzZXQgY2hpbGRyZW4gdG8gdGhlIHNhbWUgdGhpbmcuIEluIElFOSwgdGhlIHNlbGVjdGlvbiByYW5nZSB3aWxsXG4gICAgLy8gZ2V0IHJlc2V0IGlmIGB0ZXh0Q29udGVudGAgaXMgbXV0YXRlZC4gIFdlIGNvdWxkIGFkZCBhIGNoZWNrIGluIHNldFRleHRDb250ZW50XG4gICAgLy8gdG8gb25seSBzZXQgdGhlIHZhbHVlIGlmL3doZW4gdGhlIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgbm9kZSB2YWx1ZSAod2hpY2ggd291bGRcbiAgICAvLyBjb21wbGV0ZWx5IHNvbHZlIHRoaXMgSUU5IGJ1ZyksIGJ1dCBTZWJhc3RpYW4rQmVuIHNlZW1lZCB0byBsaWtlIHRoaXMgc29sdXRpb24uXG4gICAgLy8gVGhlIHZhbHVlIGNhbiBiZSBhIGJvb2xlYW4gb3Igb2JqZWN0IHNvIHRoYXQncyB3aHkgaXQncyBmb3JjZWQgdG8gYmUgYSBzdHJpbmcuXG4gICAgdmFyIGhvc3RQcm9wcyA9IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgZGVmYXVsdFZhbHVlOiB1bmRlZmluZWQsXG4gICAgICBjaGlsZHJlbjogJycgKyBpbnN0Ll93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlLFxuICAgICAgb25DaGFuZ2U6IGluc3QuX3dyYXBwZXJTdGF0ZS5vbkNoYW5nZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhvc3RQcm9wcztcbiAgfSxcblxuICBtb3VudFdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0LCBwcm9wcykge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBMaW5rZWRWYWx1ZVV0aWxzLmNoZWNrUHJvcFR5cGVzKCd0ZXh0YXJlYScsIHByb3BzLCBpbnN0Ll9jdXJyZW50RWxlbWVudC5fb3duZXIpO1xuICAgICAgaWYgKHByb3BzLnZhbHVlTGluayAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVMaW5rKSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYHZhbHVlTGlua2AgcHJvcCBvbiBgdGV4dGFyZWFgIGlzIGRlcHJlY2F0ZWQ7IHNldCBgdmFsdWVgIGFuZCBgb25DaGFuZ2VgIGluc3RlYWQuJykgOiB2b2lkIDA7XG4gICAgICAgIGRpZFdhcm5WYWx1ZUxpbmsgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWxEZWZhdWx0VmFsKSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVGV4dGFyZWEgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIHRleHRhcmVhICcgKyAnYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cycpIDogdm9pZCAwO1xuICAgICAgICBkaWRXYXJuVmFsRGVmYXVsdFZhbCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlID0gTGlua2VkVmFsdWVVdGlscy5nZXRWYWx1ZShwcm9wcyk7XG4gICAgdmFyIGluaXRpYWxWYWx1ZSA9IHZhbHVlO1xuXG4gICAgLy8gT25seSBib3RoZXIgZmV0Y2hpbmcgZGVmYXVsdCB2YWx1ZSBpZiB3ZSdyZSBnb2luZyB0byB1c2UgaXRcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZTtcbiAgICAgIC8vIFRPRE8gKHl1bmdzdGVycyk6IFJlbW92ZSBzdXBwb3J0IGZvciBjaGlsZHJlbiBjb250ZW50IGluIDx0ZXh0YXJlYT4uXG4gICAgICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcbiAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdVc2UgdGhlIGBkZWZhdWx0VmFsdWVgIG9yIGB2YWx1ZWAgcHJvcHMgaW5zdGVhZCBvZiBzZXR0aW5nICcgKyAnY2hpbGRyZW4gb24gPHRleHRhcmVhPi4nKSA6IHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgICAhKGRlZmF1bHRWYWx1ZSA9PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdJZiB5b3Ugc3VwcGx5IGBkZWZhdWx0VmFsdWVgIG9uIGEgPHRleHRhcmVhPiwgZG8gbm90IHBhc3MgY2hpbGRyZW4uJykgOiBfcHJvZEludmFyaWFudCgnOTInKSA6IHZvaWQgMDtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgICAgIShjaGlsZHJlbi5sZW5ndGggPD0gMSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnPHRleHRhcmVhPiBjYW4gb25seSBoYXZlIGF0IG1vc3Qgb25lIGNoaWxkLicpIDogX3Byb2RJbnZhcmlhbnQoJzkzJykgOiB2b2lkIDA7XG4gICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlblswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9ICcnICsgY2hpbGRyZW47XG4gICAgICB9XG4gICAgICBpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gJyc7XG4gICAgICB9XG4gICAgICBpbml0aWFsVmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgaW5zdC5fd3JhcHBlclN0YXRlID0ge1xuICAgICAgaW5pdGlhbFZhbHVlOiAnJyArIGluaXRpYWxWYWx1ZSxcbiAgICAgIGxpc3RlbmVyczogbnVsbCxcbiAgICAgIG9uQ2hhbmdlOiBfaGFuZGxlQ2hhbmdlLmJpbmQoaW5zdClcbiAgICB9O1xuICB9LFxuXG4gIHVwZGF0ZVdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgdmFyIHByb3BzID0gaW5zdC5fY3VycmVudEVsZW1lbnQucHJvcHM7XG5cbiAgICB2YXIgbm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpO1xuICAgIHZhciB2YWx1ZSA9IExpbmtlZFZhbHVlVXRpbHMuZ2V0VmFsdWUocHJvcHMpO1xuICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAvLyBDYXN0IGB2YWx1ZWAgdG8gYSBzdHJpbmcgdG8gZW5zdXJlIHRoZSB2YWx1ZSBpcyBzZXQgY29ycmVjdGx5LiBXaGlsZVxuICAgICAgLy8gYnJvd3NlcnMgdHlwaWNhbGx5IGRvIHRoaXMgYXMgbmVjZXNzYXJ5LCBqc2RvbSBkb2Vzbid0LlxuICAgICAgdmFyIG5ld1ZhbHVlID0gJycgKyB2YWx1ZTtcblxuICAgICAgLy8gVG8gYXZvaWQgc2lkZSBlZmZlY3RzIChzdWNoIGFzIGxvc2luZyB0ZXh0IHNlbGVjdGlvbiksIG9ubHkgc2V0IHZhbHVlIGlmIGNoYW5nZWRcbiAgICAgIGlmIChuZXdWYWx1ZSAhPT0gbm9kZS52YWx1ZSkge1xuICAgICAgICBub2RlLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gIH0sXG5cbiAgcG9zdE1vdW50V3JhcHBlcjogZnVuY3Rpb24gKGluc3QpIHtcbiAgICAvLyBUaGlzIGlzIGluIHBvc3RNb3VudCBiZWNhdXNlIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBET00gbm9kZSwgd2hpY2ggaXMgbm90XG4gICAgLy8gYXZhaWxhYmxlIHVudGlsIGFmdGVyIHRoZSBjb21wb25lbnQgaGFzIG1vdW50ZWQuXG4gICAgdmFyIG5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTtcbiAgICB2YXIgdGV4dENvbnRlbnQgPSBub2RlLnRleHRDb250ZW50O1xuXG4gICAgLy8gT25seSBzZXQgbm9kZS52YWx1ZSBpZiB0ZXh0Q29udGVudCBpcyBlcXVhbCB0byB0aGUgZXhwZWN0ZWRcbiAgICAvLyBpbml0aWFsIHZhbHVlLiBJbiBJRTEwL0lFMTEgdGhlcmUgaXMgYSBidWcgd2hlcmUgdGhlIHBsYWNlaG9sZGVyIGF0dHJpYnV0ZVxuICAgIC8vIHdpbGwgcG9wdWxhdGUgdGV4dENvbnRlbnQgYXMgd2VsbC5cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL2lzc3Vlcy8xMDE1MjUvXG4gICAgaWYgKHRleHRDb250ZW50ID09PSBpbnN0Ll93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKSB7XG4gICAgICBub2RlLnZhbHVlID0gdGV4dENvbnRlbnQ7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBfaGFuZGxlQ2hhbmdlKGV2ZW50KSB7XG4gIHZhciBwcm9wcyA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzO1xuICB2YXIgcmV0dXJuVmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmV4ZWN1dGVPbkNoYW5nZShwcm9wcywgZXZlbnQpO1xuICBSZWFjdFVwZGF0ZXMuYXNhcChmb3JjZVVwZGF0ZUlmTW91bnRlZCwgdGhpcyk7XG4gIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTVRleHRhcmVhO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0RE9NVGV4dGFyZWEuanNcbi8vIG1vZHVsZSBpZCA9IDI4NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 287 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nvar ReactComponentEnvironment = __webpack_require__(288);\nvar ReactInstanceMap = __webpack_require__(289);\nvar ReactInstrumentation = __webpack_require__(235);\n\nvar ReactCurrentOwner = __webpack_require__(182);\nvar ReactReconciler = __webpack_require__(232);\nvar ReactChildReconciler = __webpack_require__(290);\n\nvar emptyFunction = __webpack_require__(184);\nvar flattenChildren = __webpack_require__(305);\nvar invariant = __webpack_require__(180);\n\n/**\n * Make an update for markup to be rendered and inserted at a supplied index.\n *\n * @param {string} markup Markup that renders into an element.\n * @param {number} toIndex Destination index.\n * @private\n */\nfunction makeInsertMarkup(markup, afterNode, toIndex) {\n  // NOTE: Null values reduce hidden classes.\n  return {\n    type: 'INSERT_MARKUP',\n    content: markup,\n    fromIndex: null,\n    fromNode: null,\n    toIndex: toIndex,\n    afterNode: afterNode\n  };\n}\n\n/**\n * Make an update for moving an existing element to another index.\n *\n * @param {number} fromIndex Source index of the existing element.\n * @param {number} toIndex Destination index of the element.\n * @private\n */\nfunction makeMove(child, afterNode, toIndex) {\n  // NOTE: Null values reduce hidden classes.\n  return {\n    type: 'MOVE_EXISTING',\n    content: null,\n    fromIndex: child._mountIndex,\n    fromNode: ReactReconciler.getHostNode(child),\n    toIndex: toIndex,\n    afterNode: afterNode\n  };\n}\n\n/**\n * Make an update for removing an element at an index.\n *\n * @param {number} fromIndex Index of the element to remove.\n * @private\n */\nfunction makeRemove(child, node) {\n  // NOTE: Null values reduce hidden classes.\n  return {\n    type: 'REMOVE_NODE',\n    content: null,\n    fromIndex: child._mountIndex,\n    fromNode: node,\n    toIndex: null,\n    afterNode: null\n  };\n}\n\n/**\n * Make an update for setting the markup of a node.\n *\n * @param {string} markup Markup that renders into an element.\n * @private\n */\nfunction makeSetMarkup(markup) {\n  // NOTE: Null values reduce hidden classes.\n  return {\n    type: 'SET_MARKUP',\n    content: markup,\n    fromIndex: null,\n    fromNode: null,\n    toIndex: null,\n    afterNode: null\n  };\n}\n\n/**\n * Make an update for setting the text content.\n *\n * @param {string} textContent Text content to set.\n * @private\n */\nfunction makeTextContent(textContent) {\n  // NOTE: Null values reduce hidden classes.\n  return {\n    type: 'TEXT_CONTENT',\n    content: textContent,\n    fromIndex: null,\n    fromNode: null,\n    toIndex: null,\n    afterNode: null\n  };\n}\n\n/**\n * Push an update, if any, onto the queue. Creates a new queue if none is\n * passed and always returns the queue. Mutative.\n */\nfunction enqueue(queue, update) {\n  if (update) {\n    queue = queue || [];\n    queue.push(update);\n  }\n  return queue;\n}\n\n/**\n * Processes any enqueued updates.\n *\n * @private\n */\nfunction processQueue(inst, updateQueue) {\n  ReactComponentEnvironment.processChildrenUpdates(inst, updateQueue);\n}\n\nvar setChildrenForInstrumentation = emptyFunction;\nif (true) {\n  var getDebugID = function (inst) {\n    if (!inst._debugID) {\n      // Check for ART-like instances. TODO: This is silly/gross.\n      var internal;\n      if (internal = ReactInstanceMap.get(inst)) {\n        inst = internal;\n      }\n    }\n    return inst._debugID;\n  };\n  setChildrenForInstrumentation = function (children) {\n    var debugID = getDebugID(this);\n    // TODO: React Native empty components are also multichild.\n    // This means they still get into this method but don't have _debugID.\n    if (debugID !== 0) {\n      ReactInstrumentation.debugTool.onSetChildren(debugID, children ? Object.keys(children).map(function (key) {\n        return children[key]._debugID;\n      }) : []);\n    }\n  };\n}\n\n/**\n * ReactMultiChild are capable of reconciling multiple children.\n *\n * @class ReactMultiChild\n * @internal\n */\nvar ReactMultiChild = {\n\n  /**\n   * Provides common functionality for components that must reconcile multiple\n   * children. This is used by `ReactDOMComponent` to mount, update, and\n   * unmount child components.\n   *\n   * @lends {ReactMultiChild.prototype}\n   */\n  Mixin: {\n\n    _reconcilerInstantiateChildren: function (nestedChildren, transaction, context) {\n      if (true) {\n        var selfDebugID = getDebugID(this);\n        if (this._currentElement) {\n          try {\n            ReactCurrentOwner.current = this._currentElement._owner;\n            return ReactChildReconciler.instantiateChildren(nestedChildren, transaction, context, selfDebugID);\n          } finally {\n            ReactCurrentOwner.current = null;\n          }\n        }\n      }\n      return ReactChildReconciler.instantiateChildren(nestedChildren, transaction, context);\n    },\n\n    _reconcilerUpdateChildren: function (prevChildren, nextNestedChildrenElements, mountImages, removedNodes, transaction, context) {\n      var nextChildren;\n      var selfDebugID = 0;\n      if (true) {\n        selfDebugID = getDebugID(this);\n        if (this._currentElement) {\n          try {\n            ReactCurrentOwner.current = this._currentElement._owner;\n            nextChildren = flattenChildren(nextNestedChildrenElements, selfDebugID);\n          } finally {\n            ReactCurrentOwner.current = null;\n          }\n          ReactChildReconciler.updateChildren(prevChildren, nextChildren, mountImages, removedNodes, transaction, this, this._hostContainerInfo, context, selfDebugID);\n          return nextChildren;\n        }\n      }\n      nextChildren = flattenChildren(nextNestedChildrenElements, selfDebugID);\n      ReactChildReconciler.updateChildren(prevChildren, nextChildren, mountImages, removedNodes, transaction, this, this._hostContainerInfo, context, selfDebugID);\n      return nextChildren;\n    },\n\n    /**\n     * Generates a \"mount image\" for each of the supplied children. In the case\n     * of `ReactDOMComponent`, a mount image is a string of markup.\n     *\n     * @param {?object} nestedChildren Nested child maps.\n     * @return {array} An array of mounted representations.\n     * @internal\n     */\n    mountChildren: function (nestedChildren, transaction, context) {\n      var children = this._reconcilerInstantiateChildren(nestedChildren, transaction, context);\n      this._renderedChildren = children;\n\n      var mountImages = [];\n      var index = 0;\n      for (var name in children) {\n        if (children.hasOwnProperty(name)) {\n          var child = children[name];\n          var selfDebugID = 0;\n          if (true) {\n            selfDebugID = getDebugID(this);\n          }\n          var mountImage = ReactReconciler.mountComponent(child, transaction, this, this._hostContainerInfo, context, selfDebugID);\n          child._mountIndex = index++;\n          mountImages.push(mountImage);\n        }\n      }\n\n      if (true) {\n        setChildrenForInstrumentation.call(this, children);\n      }\n\n      return mountImages;\n    },\n\n    /**\n     * Replaces any rendered children with a text content string.\n     *\n     * @param {string} nextContent String of content.\n     * @internal\n     */\n    updateTextContent: function (nextContent) {\n      var prevChildren = this._renderedChildren;\n      // Remove any rendered children.\n      ReactChildReconciler.unmountChildren(prevChildren, false);\n      for (var name in prevChildren) {\n        if (prevChildren.hasOwnProperty(name)) {\n           true ?  true ? invariant(false, 'updateTextContent called on non-empty component.') : _prodInvariant('118') : void 0;\n        }\n      }\n      // Set new text content.\n      var updates = [makeTextContent(nextContent)];\n      processQueue(this, updates);\n    },\n\n    /**\n     * Replaces any rendered children with a markup string.\n     *\n     * @param {string} nextMarkup String of markup.\n     * @internal\n     */\n    updateMarkup: function (nextMarkup) {\n      var prevChildren = this._renderedChildren;\n      // Remove any rendered children.\n      ReactChildReconciler.unmountChildren(prevChildren, false);\n      for (var name in prevChildren) {\n        if (prevChildren.hasOwnProperty(name)) {\n           true ?  true ? invariant(false, 'updateTextContent called on non-empty component.') : _prodInvariant('118') : void 0;\n        }\n      }\n      var updates = [makeSetMarkup(nextMarkup)];\n      processQueue(this, updates);\n    },\n\n    /**\n     * Updates the rendered children with new children.\n     *\n     * @param {?object} nextNestedChildrenElements Nested child element maps.\n     * @param {ReactReconcileTransaction} transaction\n     * @internal\n     */\n    updateChildren: function (nextNestedChildrenElements, transaction, context) {\n      // Hook used by React ART\n      this._updateChildren(nextNestedChildrenElements, transaction, context);\n    },\n\n    /**\n     * @param {?object} nextNestedChildrenElements Nested child element maps.\n     * @param {ReactReconcileTransaction} transaction\n     * @final\n     * @protected\n     */\n    _updateChildren: function (nextNestedChildrenElements, transaction, context) {\n      var prevChildren = this._renderedChildren;\n      var removedNodes = {};\n      var mountImages = [];\n      var nextChildren = this._reconcilerUpdateChildren(prevChildren, nextNestedChildrenElements, mountImages, removedNodes, transaction, context);\n      if (!nextChildren && !prevChildren) {\n        return;\n      }\n      var updates = null;\n      var name;\n      // `nextIndex` will increment for each child in `nextChildren`, but\n      // `lastIndex` will be the last index visited in `prevChildren`.\n      var nextIndex = 0;\n      var lastIndex = 0;\n      // `nextMountIndex` will increment for each newly mounted child.\n      var nextMountIndex = 0;\n      var lastPlacedNode = null;\n      for (name in nextChildren) {\n        if (!nextChildren.hasOwnProperty(name)) {\n          continue;\n        }\n        var prevChild = prevChildren && prevChildren[name];\n        var nextChild = nextChildren[name];\n        if (prevChild === nextChild) {\n          updates = enqueue(updates, this.moveChild(prevChild, lastPlacedNode, nextIndex, lastIndex));\n          lastIndex = Math.max(prevChild._mountIndex, lastIndex);\n          prevChild._mountIndex = nextIndex;\n        } else {\n          if (prevChild) {\n            // Update `lastIndex` before `_mountIndex` gets unset by unmounting.\n            lastIndex = Math.max(prevChild._mountIndex, lastIndex);\n            // The `removedNodes` loop below will actually remove the child.\n          }\n          // The child must be instantiated before it's mounted.\n          updates = enqueue(updates, this._mountChildAtIndex(nextChild, mountImages[nextMountIndex], lastPlacedNode, nextIndex, transaction, context));\n          nextMountIndex++;\n        }\n        nextIndex++;\n        lastPlacedNode = ReactReconciler.getHostNode(nextChild);\n      }\n      // Remove children that are no longer present.\n      for (name in removedNodes) {\n        if (removedNodes.hasOwnProperty(name)) {\n          updates = enqueue(updates, this._unmountChild(prevChildren[name], removedNodes[name]));\n        }\n      }\n      if (updates) {\n        processQueue(this, updates);\n      }\n      this._renderedChildren = nextChildren;\n\n      if (true) {\n        setChildrenForInstrumentation.call(this, nextChildren);\n      }\n    },\n\n    /**\n     * Unmounts all rendered children. This should be used to clean up children\n     * when this component is unmounted. It does not actually perform any\n     * backend operations.\n     *\n     * @internal\n     */\n    unmountChildren: function (safely) {\n      var renderedChildren = this._renderedChildren;\n      ReactChildReconciler.unmountChildren(renderedChildren, safely);\n      this._renderedChildren = null;\n    },\n\n    /**\n     * Moves a child component to the supplied index.\n     *\n     * @param {ReactComponent} child Component to move.\n     * @param {number} toIndex Destination index of the element.\n     * @param {number} lastIndex Last index visited of the siblings of `child`.\n     * @protected\n     */\n    moveChild: function (child, afterNode, toIndex, lastIndex) {\n      // If the index of `child` is less than `lastIndex`, then it needs to\n      // be moved. Otherwise, we do not need to move it because a child will be\n      // inserted or moved before `child`.\n      if (child._mountIndex < lastIndex) {\n        return makeMove(child, afterNode, toIndex);\n      }\n    },\n\n    /**\n     * Creates a child component.\n     *\n     * @param {ReactComponent} child Component to create.\n     * @param {string} mountImage Markup to insert.\n     * @protected\n     */\n    createChild: function (child, afterNode, mountImage) {\n      return makeInsertMarkup(mountImage, afterNode, child._mountIndex);\n    },\n\n    /**\n     * Removes a child component.\n     *\n     * @param {ReactComponent} child Child to remove.\n     * @protected\n     */\n    removeChild: function (child, node) {\n      return makeRemove(child, node);\n    },\n\n    /**\n     * Mounts a child with the supplied name.\n     *\n     * NOTE: This is part of `updateChildren` and is here for readability.\n     *\n     * @param {ReactComponent} child Component to mount.\n     * @param {string} name Name of the child.\n     * @param {number} index Index at which to insert the child.\n     * @param {ReactReconcileTransaction} transaction\n     * @private\n     */\n    _mountChildAtIndex: function (child, mountImage, afterNode, index, transaction, context) {\n      child._mountIndex = index;\n      return this.createChild(child, afterNode, mountImage);\n    },\n\n    /**\n     * Unmounts a rendered child.\n     *\n     * NOTE: This is part of `updateChildren` and is here for readability.\n     *\n     * @param {ReactComponent} child Component to unmount.\n     * @private\n     */\n    _unmountChild: function (child, node) {\n      var update = this.removeChild(child, node);\n      child._mountIndex = null;\n      return update;\n    }\n\n  }\n\n};\n\nmodule.exports = ReactMultiChild;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjg3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0TXVsdGlDaGlsZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCA9IHJlcXVpcmUoJy4vUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCcpO1xudmFyIFJlYWN0SW5zdGFuY2VNYXAgPSByZXF1aXJlKCcuL1JlYWN0SW5zdGFuY2VNYXAnKTtcbnZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0cnVtZW50YXRpb24nKTtcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q3VycmVudE93bmVyJyk7XG52YXIgUmVhY3RSZWNvbmNpbGVyID0gcmVxdWlyZSgnLi9SZWFjdFJlY29uY2lsZXInKTtcbnZhciBSZWFjdENoaWxkUmVjb25jaWxlciA9IHJlcXVpcmUoJy4vUmVhY3RDaGlsZFJlY29uY2lsZXInKTtcblxudmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eUZ1bmN0aW9uJyk7XG52YXIgZmxhdHRlbkNoaWxkcmVuID0gcmVxdWlyZSgnLi9mbGF0dGVuQ2hpbGRyZW4nKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBNYWtlIGFuIHVwZGF0ZSBmb3IgbWFya3VwIHRvIGJlIHJlbmRlcmVkIGFuZCBpbnNlcnRlZCBhdCBhIHN1cHBsaWVkIGluZGV4LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrdXAgTWFya3VwIHRoYXQgcmVuZGVycyBpbnRvIGFuIGVsZW1lbnQuXG4gKiBAcGFyYW0ge251bWJlcn0gdG9JbmRleCBEZXN0aW5hdGlvbiBpbmRleC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIG1ha2VJbnNlcnRNYXJrdXAobWFya3VwLCBhZnRlck5vZGUsIHRvSW5kZXgpIHtcbiAgLy8gTk9URTogTnVsbCB2YWx1ZXMgcmVkdWNlIGhpZGRlbiBjbGFzc2VzLlxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdJTlNFUlRfTUFSS1VQJyxcbiAgICBjb250ZW50OiBtYXJrdXAsXG4gICAgZnJvbUluZGV4OiBudWxsLFxuICAgIGZyb21Ob2RlOiBudWxsLFxuICAgIHRvSW5kZXg6IHRvSW5kZXgsXG4gICAgYWZ0ZXJOb2RlOiBhZnRlck5vZGVcbiAgfTtcbn1cblxuLyoqXG4gKiBNYWtlIGFuIHVwZGF0ZSBmb3IgbW92aW5nIGFuIGV4aXN0aW5nIGVsZW1lbnQgdG8gYW5vdGhlciBpbmRleC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFNvdXJjZSBpbmRleCBvZiB0aGUgZXhpc3RpbmcgZWxlbWVudC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB0b0luZGV4IERlc3RpbmF0aW9uIGluZGV4IG9mIHRoZSBlbGVtZW50LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gbWFrZU1vdmUoY2hpbGQsIGFmdGVyTm9kZSwgdG9JbmRleCkge1xuICAvLyBOT1RFOiBOdWxsIHZhbHVlcyByZWR1Y2UgaGlkZGVuIGNsYXNzZXMuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ01PVkVfRVhJU1RJTkcnLFxuICAgIGNvbnRlbnQ6IG51bGwsXG4gICAgZnJvbUluZGV4OiBjaGlsZC5fbW91bnRJbmRleCxcbiAgICBmcm9tTm9kZTogUmVhY3RSZWNvbmNpbGVyLmdldEhvc3ROb2RlKGNoaWxkKSxcbiAgICB0b0luZGV4OiB0b0luZGV4LFxuICAgIGFmdGVyTm9kZTogYWZ0ZXJOb2RlXG4gIH07XG59XG5cbi8qKlxuICogTWFrZSBhbiB1cGRhdGUgZm9yIHJlbW92aW5nIGFuIGVsZW1lbnQgYXQgYW4gaW5kZXguXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBJbmRleCBvZiB0aGUgZWxlbWVudCB0byByZW1vdmUuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBtYWtlUmVtb3ZlKGNoaWxkLCBub2RlKSB7XG4gIC8vIE5PVEU6IE51bGwgdmFsdWVzIHJlZHVjZSBoaWRkZW4gY2xhc3Nlcy5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnUkVNT1ZFX05PREUnLFxuICAgIGNvbnRlbnQ6IG51bGwsXG4gICAgZnJvbUluZGV4OiBjaGlsZC5fbW91bnRJbmRleCxcbiAgICBmcm9tTm9kZTogbm9kZSxcbiAgICB0b0luZGV4OiBudWxsLFxuICAgIGFmdGVyTm9kZTogbnVsbFxuICB9O1xufVxuXG4vKipcbiAqIE1ha2UgYW4gdXBkYXRlIGZvciBzZXR0aW5nIHRoZSBtYXJrdXAgb2YgYSBub2RlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrdXAgTWFya3VwIHRoYXQgcmVuZGVycyBpbnRvIGFuIGVsZW1lbnQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBtYWtlU2V0TWFya3VwKG1hcmt1cCkge1xuICAvLyBOT1RFOiBOdWxsIHZhbHVlcyByZWR1Y2UgaGlkZGVuIGNsYXNzZXMuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1NFVF9NQVJLVVAnLFxuICAgIGNvbnRlbnQ6IG1hcmt1cCxcbiAgICBmcm9tSW5kZXg6IG51bGwsXG4gICAgZnJvbU5vZGU6IG51bGwsXG4gICAgdG9JbmRleDogbnVsbCxcbiAgICBhZnRlck5vZGU6IG51bGxcbiAgfTtcbn1cblxuLyoqXG4gKiBNYWtlIGFuIHVwZGF0ZSBmb3Igc2V0dGluZyB0aGUgdGV4dCBjb250ZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0Q29udGVudCBUZXh0IGNvbnRlbnQgdG8gc2V0LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gbWFrZVRleHRDb250ZW50KHRleHRDb250ZW50KSB7XG4gIC8vIE5PVEU6IE51bGwgdmFsdWVzIHJlZHVjZSBoaWRkZW4gY2xhc3Nlcy5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnVEVYVF9DT05URU5UJyxcbiAgICBjb250ZW50OiB0ZXh0Q29udGVudCxcbiAgICBmcm9tSW5kZXg6IG51bGwsXG4gICAgZnJvbU5vZGU6IG51bGwsXG4gICAgdG9JbmRleDogbnVsbCxcbiAgICBhZnRlck5vZGU6IG51bGxcbiAgfTtcbn1cblxuLyoqXG4gKiBQdXNoIGFuIHVwZGF0ZSwgaWYgYW55LCBvbnRvIHRoZSBxdWV1ZS4gQ3JlYXRlcyBhIG5ldyBxdWV1ZSBpZiBub25lIGlzXG4gKiBwYXNzZWQgYW5kIGFsd2F5cyByZXR1cm5zIHRoZSBxdWV1ZS4gTXV0YXRpdmUuXG4gKi9cbmZ1bmN0aW9uIGVucXVldWUocXVldWUsIHVwZGF0ZSkge1xuICBpZiAodXBkYXRlKSB7XG4gICAgcXVldWUgPSBxdWV1ZSB8fCBbXTtcbiAgICBxdWV1ZS5wdXNoKHVwZGF0ZSk7XG4gIH1cbiAgcmV0dXJuIHF1ZXVlO1xufVxuXG4vKipcbiAqIFByb2Nlc3NlcyBhbnkgZW5xdWV1ZWQgdXBkYXRlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBwcm9jZXNzUXVldWUoaW5zdCwgdXBkYXRlUXVldWUpIHtcbiAgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudC5wcm9jZXNzQ2hpbGRyZW5VcGRhdGVzKGluc3QsIHVwZGF0ZVF1ZXVlKTtcbn1cblxudmFyIHNldENoaWxkcmVuRm9ySW5zdHJ1bWVudGF0aW9uID0gZW1wdHlGdW5jdGlvbjtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBnZXREZWJ1Z0lEID0gZnVuY3Rpb24gKGluc3QpIHtcbiAgICBpZiAoIWluc3QuX2RlYnVnSUQpIHtcbiAgICAgIC8vIENoZWNrIGZvciBBUlQtbGlrZSBpbnN0YW5jZXMuIFRPRE86IFRoaXMgaXMgc2lsbHkvZ3Jvc3MuXG4gICAgICB2YXIgaW50ZXJuYWw7XG4gICAgICBpZiAoaW50ZXJuYWwgPSBSZWFjdEluc3RhbmNlTWFwLmdldChpbnN0KSkge1xuICAgICAgICBpbnN0ID0gaW50ZXJuYWw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbnN0Ll9kZWJ1Z0lEO1xuICB9O1xuICBzZXRDaGlsZHJlbkZvckluc3RydW1lbnRhdGlvbiA9IGZ1bmN0aW9uIChjaGlsZHJlbikge1xuICAgIHZhciBkZWJ1Z0lEID0gZ2V0RGVidWdJRCh0aGlzKTtcbiAgICAvLyBUT0RPOiBSZWFjdCBOYXRpdmUgZW1wdHkgY29tcG9uZW50cyBhcmUgYWxzbyBtdWx0aWNoaWxkLlxuICAgIC8vIFRoaXMgbWVhbnMgdGhleSBzdGlsbCBnZXQgaW50byB0aGlzIG1ldGhvZCBidXQgZG9uJ3QgaGF2ZSBfZGVidWdJRC5cbiAgICBpZiAoZGVidWdJRCAhPT0gMCkge1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uU2V0Q2hpbGRyZW4oZGVidWdJRCwgY2hpbGRyZW4gPyBPYmplY3Qua2V5cyhjaGlsZHJlbikubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuW2tleV0uX2RlYnVnSUQ7XG4gICAgICB9KSA6IFtdKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUmVhY3RNdWx0aUNoaWxkIGFyZSBjYXBhYmxlIG9mIHJlY29uY2lsaW5nIG11bHRpcGxlIGNoaWxkcmVuLlxuICpcbiAqIEBjbGFzcyBSZWFjdE11bHRpQ2hpbGRcbiAqIEBpbnRlcm5hbFxuICovXG52YXIgUmVhY3RNdWx0aUNoaWxkID0ge1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBjb21tb24gZnVuY3Rpb25hbGl0eSBmb3IgY29tcG9uZW50cyB0aGF0IG11c3QgcmVjb25jaWxlIG11bHRpcGxlXG4gICAqIGNoaWxkcmVuLiBUaGlzIGlzIHVzZWQgYnkgYFJlYWN0RE9NQ29tcG9uZW50YCB0byBtb3VudCwgdXBkYXRlLCBhbmRcbiAgICogdW5tb3VudCBjaGlsZCBjb21wb25lbnRzLlxuICAgKlxuICAgKiBAbGVuZHMge1JlYWN0TXVsdGlDaGlsZC5wcm90b3R5cGV9XG4gICAqL1xuICBNaXhpbjoge1xuXG4gICAgX3JlY29uY2lsZXJJbnN0YW50aWF0ZUNoaWxkcmVuOiBmdW5jdGlvbiAobmVzdGVkQ2hpbGRyZW4sIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB2YXIgc2VsZkRlYnVnSUQgPSBnZXREZWJ1Z0lEKHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudEVsZW1lbnQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjtcbiAgICAgICAgICAgIHJldHVybiBSZWFjdENoaWxkUmVjb25jaWxlci5pbnN0YW50aWF0ZUNoaWxkcmVuKG5lc3RlZENoaWxkcmVuLCB0cmFuc2FjdGlvbiwgY29udGV4dCwgc2VsZkRlYnVnSUQpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBSZWFjdENoaWxkUmVjb25jaWxlci5pbnN0YW50aWF0ZUNoaWxkcmVuKG5lc3RlZENoaWxkcmVuLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7XG4gICAgfSxcblxuICAgIF9yZWNvbmNpbGVyVXBkYXRlQ2hpbGRyZW46IGZ1bmN0aW9uIChwcmV2Q2hpbGRyZW4sIG5leHROZXN0ZWRDaGlsZHJlbkVsZW1lbnRzLCBtb3VudEltYWdlcywgcmVtb3ZlZE5vZGVzLCB0cmFuc2FjdGlvbiwgY29udGV4dCkge1xuICAgICAgdmFyIG5leHRDaGlsZHJlbjtcbiAgICAgIHZhciBzZWxmRGVidWdJRCA9IDA7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBzZWxmRGVidWdJRCA9IGdldERlYnVnSUQodGhpcyk7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50RWxlbWVudCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQuX293bmVyO1xuICAgICAgICAgICAgbmV4dENoaWxkcmVuID0gZmxhdHRlbkNoaWxkcmVuKG5leHROZXN0ZWRDaGlsZHJlbkVsZW1lbnRzLCBzZWxmRGVidWdJRCk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBSZWFjdENoaWxkUmVjb25jaWxlci51cGRhdGVDaGlsZHJlbihwcmV2Q2hpbGRyZW4sIG5leHRDaGlsZHJlbiwgbW91bnRJbWFnZXMsIHJlbW92ZWROb2RlcywgdHJhbnNhY3Rpb24sIHRoaXMsIHRoaXMuX2hvc3RDb250YWluZXJJbmZvLCBjb250ZXh0LCBzZWxmRGVidWdJRCk7XG4gICAgICAgICAgcmV0dXJuIG5leHRDaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbmV4dENoaWxkcmVuID0gZmxhdHRlbkNoaWxkcmVuKG5leHROZXN0ZWRDaGlsZHJlbkVsZW1lbnRzLCBzZWxmRGVidWdJRCk7XG4gICAgICBSZWFjdENoaWxkUmVjb25jaWxlci51cGRhdGVDaGlsZHJlbihwcmV2Q2hpbGRyZW4sIG5leHRDaGlsZHJlbiwgbW91bnRJbWFnZXMsIHJlbW92ZWROb2RlcywgdHJhbnNhY3Rpb24sIHRoaXMsIHRoaXMuX2hvc3RDb250YWluZXJJbmZvLCBjb250ZXh0LCBzZWxmRGVidWdJRCk7XG4gICAgICByZXR1cm4gbmV4dENoaWxkcmVuO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSBcIm1vdW50IGltYWdlXCIgZm9yIGVhY2ggb2YgdGhlIHN1cHBsaWVkIGNoaWxkcmVuLiBJbiB0aGUgY2FzZVxuICAgICAqIG9mIGBSZWFjdERPTUNvbXBvbmVudGAsIGEgbW91bnQgaW1hZ2UgaXMgYSBzdHJpbmcgb2YgbWFya3VwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXN0ZWRDaGlsZHJlbiBOZXN0ZWQgY2hpbGQgbWFwcy5cbiAgICAgKiBAcmV0dXJuIHthcnJheX0gQW4gYXJyYXkgb2YgbW91bnRlZCByZXByZXNlbnRhdGlvbnMuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgbW91bnRDaGlsZHJlbjogZnVuY3Rpb24gKG5lc3RlZENoaWxkcmVuLCB0cmFuc2FjdGlvbiwgY29udGV4dCkge1xuICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5fcmVjb25jaWxlckluc3RhbnRpYXRlQ2hpbGRyZW4obmVzdGVkQ2hpbGRyZW4sIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcbiAgICAgIHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW4gPSBjaGlsZHJlbjtcblxuICAgICAgdmFyIG1vdW50SW1hZ2VzID0gW107XG4gICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgZm9yICh2YXIgbmFtZSBpbiBjaGlsZHJlbikge1xuICAgICAgICBpZiAoY2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltuYW1lXTtcbiAgICAgICAgICB2YXIgc2VsZkRlYnVnSUQgPSAwO1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBzZWxmRGVidWdJRCA9IGdldERlYnVnSUQodGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBtb3VudEltYWdlID0gUmVhY3RSZWNvbmNpbGVyLm1vdW50Q29tcG9uZW50KGNoaWxkLCB0cmFuc2FjdGlvbiwgdGhpcywgdGhpcy5faG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQsIHNlbGZEZWJ1Z0lEKTtcbiAgICAgICAgICBjaGlsZC5fbW91bnRJbmRleCA9IGluZGV4Kys7XG4gICAgICAgICAgbW91bnRJbWFnZXMucHVzaChtb3VudEltYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBzZXRDaGlsZHJlbkZvckluc3RydW1lbnRhdGlvbi5jYWxsKHRoaXMsIGNoaWxkcmVuKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1vdW50SW1hZ2VzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlcyBhbnkgcmVuZGVyZWQgY2hpbGRyZW4gd2l0aCBhIHRleHQgY29udGVudCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV4dENvbnRlbnQgU3RyaW5nIG9mIGNvbnRlbnQuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdXBkYXRlVGV4dENvbnRlbnQ6IGZ1bmN0aW9uIChuZXh0Q29udGVudCkge1xuICAgICAgdmFyIHByZXZDaGlsZHJlbiA9IHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW47XG4gICAgICAvLyBSZW1vdmUgYW55IHJlbmRlcmVkIGNoaWxkcmVuLlxuICAgICAgUmVhY3RDaGlsZFJlY29uY2lsZXIudW5tb3VudENoaWxkcmVuKHByZXZDaGlsZHJlbiwgZmFsc2UpO1xuICAgICAgZm9yICh2YXIgbmFtZSBpbiBwcmV2Q2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKHByZXZDaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICFmYWxzZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd1cGRhdGVUZXh0Q29udGVudCBjYWxsZWQgb24gbm9uLWVtcHR5IGNvbXBvbmVudC4nKSA6IF9wcm9kSW52YXJpYW50KCcxMTgnKSA6IHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gU2V0IG5ldyB0ZXh0IGNvbnRlbnQuXG4gICAgICB2YXIgdXBkYXRlcyA9IFttYWtlVGV4dENvbnRlbnQobmV4dENvbnRlbnQpXTtcbiAgICAgIHByb2Nlc3NRdWV1ZSh0aGlzLCB1cGRhdGVzKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZXMgYW55IHJlbmRlcmVkIGNoaWxkcmVuIHdpdGggYSBtYXJrdXAgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5leHRNYXJrdXAgU3RyaW5nIG9mIG1hcmt1cC5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB1cGRhdGVNYXJrdXA6IGZ1bmN0aW9uIChuZXh0TWFya3VwKSB7XG4gICAgICB2YXIgcHJldkNoaWxkcmVuID0gdGhpcy5fcmVuZGVyZWRDaGlsZHJlbjtcbiAgICAgIC8vIFJlbW92ZSBhbnkgcmVuZGVyZWQgY2hpbGRyZW4uXG4gICAgICBSZWFjdENoaWxkUmVjb25jaWxlci51bm1vdW50Q2hpbGRyZW4ocHJldkNoaWxkcmVuLCBmYWxzZSk7XG4gICAgICBmb3IgKHZhciBuYW1lIGluIHByZXZDaGlsZHJlbikge1xuICAgICAgICBpZiAocHJldkNoaWxkcmVuLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgIWZhbHNlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3VwZGF0ZVRleHRDb250ZW50IGNhbGxlZCBvbiBub24tZW1wdHkgY29tcG9uZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzExOCcpIDogdm9pZCAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgdXBkYXRlcyA9IFttYWtlU2V0TWFya3VwKG5leHRNYXJrdXApXTtcbiAgICAgIHByb2Nlc3NRdWV1ZSh0aGlzLCB1cGRhdGVzKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgcmVuZGVyZWQgY2hpbGRyZW4gd2l0aCBuZXcgY2hpbGRyZW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHROZXN0ZWRDaGlsZHJlbkVsZW1lbnRzIE5lc3RlZCBjaGlsZCBlbGVtZW50IG1hcHMuXG4gICAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHVwZGF0ZUNoaWxkcmVuOiBmdW5jdGlvbiAobmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMsIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgICAvLyBIb29rIHVzZWQgYnkgUmVhY3QgQVJUXG4gICAgICB0aGlzLl91cGRhdGVDaGlsZHJlbihuZXh0TmVzdGVkQ2hpbGRyZW5FbGVtZW50cywgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHROZXN0ZWRDaGlsZHJlbkVsZW1lbnRzIE5lc3RlZCBjaGlsZCBlbGVtZW50IG1hcHMuXG4gICAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgICAqIEBmaW5hbFxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBfdXBkYXRlQ2hpbGRyZW46IGZ1bmN0aW9uIChuZXh0TmVzdGVkQ2hpbGRyZW5FbGVtZW50cywgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHtcbiAgICAgIHZhciBwcmV2Q2hpbGRyZW4gPSB0aGlzLl9yZW5kZXJlZENoaWxkcmVuO1xuICAgICAgdmFyIHJlbW92ZWROb2RlcyA9IHt9O1xuICAgICAgdmFyIG1vdW50SW1hZ2VzID0gW107XG4gICAgICB2YXIgbmV4dENoaWxkcmVuID0gdGhpcy5fcmVjb25jaWxlclVwZGF0ZUNoaWxkcmVuKHByZXZDaGlsZHJlbiwgbmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMsIG1vdW50SW1hZ2VzLCByZW1vdmVkTm9kZXMsIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcbiAgICAgIGlmICghbmV4dENoaWxkcmVuICYmICFwcmV2Q2hpbGRyZW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIHVwZGF0ZXMgPSBudWxsO1xuICAgICAgdmFyIG5hbWU7XG4gICAgICAvLyBgbmV4dEluZGV4YCB3aWxsIGluY3JlbWVudCBmb3IgZWFjaCBjaGlsZCBpbiBgbmV4dENoaWxkcmVuYCwgYnV0XG4gICAgICAvLyBgbGFzdEluZGV4YCB3aWxsIGJlIHRoZSBsYXN0IGluZGV4IHZpc2l0ZWQgaW4gYHByZXZDaGlsZHJlbmAuXG4gICAgICB2YXIgbmV4dEluZGV4ID0gMDtcbiAgICAgIHZhciBsYXN0SW5kZXggPSAwO1xuICAgICAgLy8gYG5leHRNb3VudEluZGV4YCB3aWxsIGluY3JlbWVudCBmb3IgZWFjaCBuZXdseSBtb3VudGVkIGNoaWxkLlxuICAgICAgdmFyIG5leHRNb3VudEluZGV4ID0gMDtcbiAgICAgIHZhciBsYXN0UGxhY2VkTm9kZSA9IG51bGw7XG4gICAgICBmb3IgKG5hbWUgaW4gbmV4dENoaWxkcmVuKSB7XG4gICAgICAgIGlmICghbmV4dENoaWxkcmVuLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByZXZDaGlsZCA9IHByZXZDaGlsZHJlbiAmJiBwcmV2Q2hpbGRyZW5bbmFtZV07XG4gICAgICAgIHZhciBuZXh0Q2hpbGQgPSBuZXh0Q2hpbGRyZW5bbmFtZV07XG4gICAgICAgIGlmIChwcmV2Q2hpbGQgPT09IG5leHRDaGlsZCkge1xuICAgICAgICAgIHVwZGF0ZXMgPSBlbnF1ZXVlKHVwZGF0ZXMsIHRoaXMubW92ZUNoaWxkKHByZXZDaGlsZCwgbGFzdFBsYWNlZE5vZGUsIG5leHRJbmRleCwgbGFzdEluZGV4KSk7XG4gICAgICAgICAgbGFzdEluZGV4ID0gTWF0aC5tYXgocHJldkNoaWxkLl9tb3VudEluZGV4LCBsYXN0SW5kZXgpO1xuICAgICAgICAgIHByZXZDaGlsZC5fbW91bnRJbmRleCA9IG5leHRJbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAocHJldkNoaWxkKSB7XG4gICAgICAgICAgICAvLyBVcGRhdGUgYGxhc3RJbmRleGAgYmVmb3JlIGBfbW91bnRJbmRleGAgZ2V0cyB1bnNldCBieSB1bm1vdW50aW5nLlxuICAgICAgICAgICAgbGFzdEluZGV4ID0gTWF0aC5tYXgocHJldkNoaWxkLl9tb3VudEluZGV4LCBsYXN0SW5kZXgpO1xuICAgICAgICAgICAgLy8gVGhlIGByZW1vdmVkTm9kZXNgIGxvb3AgYmVsb3cgd2lsbCBhY3R1YWxseSByZW1vdmUgdGhlIGNoaWxkLlxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBUaGUgY2hpbGQgbXVzdCBiZSBpbnN0YW50aWF0ZWQgYmVmb3JlIGl0J3MgbW91bnRlZC5cbiAgICAgICAgICB1cGRhdGVzID0gZW5xdWV1ZSh1cGRhdGVzLCB0aGlzLl9tb3VudENoaWxkQXRJbmRleChuZXh0Q2hpbGQsIG1vdW50SW1hZ2VzW25leHRNb3VudEluZGV4XSwgbGFzdFBsYWNlZE5vZGUsIG5leHRJbmRleCwgdHJhbnNhY3Rpb24sIGNvbnRleHQpKTtcbiAgICAgICAgICBuZXh0TW91bnRJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIG5leHRJbmRleCsrO1xuICAgICAgICBsYXN0UGxhY2VkTm9kZSA9IFJlYWN0UmVjb25jaWxlci5nZXRIb3N0Tm9kZShuZXh0Q2hpbGQpO1xuICAgICAgfVxuICAgICAgLy8gUmVtb3ZlIGNoaWxkcmVuIHRoYXQgYXJlIG5vIGxvbmdlciBwcmVzZW50LlxuICAgICAgZm9yIChuYW1lIGluIHJlbW92ZWROb2Rlcykge1xuICAgICAgICBpZiAocmVtb3ZlZE5vZGVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgdXBkYXRlcyA9IGVucXVldWUodXBkYXRlcywgdGhpcy5fdW5tb3VudENoaWxkKHByZXZDaGlsZHJlbltuYW1lXSwgcmVtb3ZlZE5vZGVzW25hbWVdKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVzKSB7XG4gICAgICAgIHByb2Nlc3NRdWV1ZSh0aGlzLCB1cGRhdGVzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW4gPSBuZXh0Q2hpbGRyZW47XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHNldENoaWxkcmVuRm9ySW5zdHJ1bWVudGF0aW9uLmNhbGwodGhpcywgbmV4dENoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVW5tb3VudHMgYWxsIHJlbmRlcmVkIGNoaWxkcmVuLiBUaGlzIHNob3VsZCBiZSB1c2VkIHRvIGNsZWFuIHVwIGNoaWxkcmVuXG4gICAgICogd2hlbiB0aGlzIGNvbXBvbmVudCBpcyB1bm1vdW50ZWQuIEl0IGRvZXMgbm90IGFjdHVhbGx5IHBlcmZvcm0gYW55XG4gICAgICogYmFja2VuZCBvcGVyYXRpb25zLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdW5tb3VudENoaWxkcmVuOiBmdW5jdGlvbiAoc2FmZWx5KSB7XG4gICAgICB2YXIgcmVuZGVyZWRDaGlsZHJlbiA9IHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW47XG4gICAgICBSZWFjdENoaWxkUmVjb25jaWxlci51bm1vdW50Q2hpbGRyZW4ocmVuZGVyZWRDaGlsZHJlbiwgc2FmZWx5KTtcbiAgICAgIHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW4gPSBudWxsO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyBhIGNoaWxkIGNvbXBvbmVudCB0byB0aGUgc3VwcGxpZWQgaW5kZXguXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjaGlsZCBDb21wb25lbnQgdG8gbW92ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdG9JbmRleCBEZXN0aW5hdGlvbiBpbmRleCBvZiB0aGUgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGFzdEluZGV4IExhc3QgaW5kZXggdmlzaXRlZCBvZiB0aGUgc2libGluZ3Mgb2YgYGNoaWxkYC5cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgbW92ZUNoaWxkOiBmdW5jdGlvbiAoY2hpbGQsIGFmdGVyTm9kZSwgdG9JbmRleCwgbGFzdEluZGV4KSB7XG4gICAgICAvLyBJZiB0aGUgaW5kZXggb2YgYGNoaWxkYCBpcyBsZXNzIHRoYW4gYGxhc3RJbmRleGAsIHRoZW4gaXQgbmVlZHMgdG9cbiAgICAgIC8vIGJlIG1vdmVkLiBPdGhlcndpc2UsIHdlIGRvIG5vdCBuZWVkIHRvIG1vdmUgaXQgYmVjYXVzZSBhIGNoaWxkIHdpbGwgYmVcbiAgICAgIC8vIGluc2VydGVkIG9yIG1vdmVkIGJlZm9yZSBgY2hpbGRgLlxuICAgICAgaWYgKGNoaWxkLl9tb3VudEluZGV4IDwgbGFzdEluZGV4KSB7XG4gICAgICAgIHJldHVybiBtYWtlTW92ZShjaGlsZCwgYWZ0ZXJOb2RlLCB0b0luZGV4KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNoaWxkIGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGNoaWxkIENvbXBvbmVudCB0byBjcmVhdGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1vdW50SW1hZ2UgTWFya3VwIHRvIGluc2VydC5cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgY3JlYXRlQ2hpbGQ6IGZ1bmN0aW9uIChjaGlsZCwgYWZ0ZXJOb2RlLCBtb3VudEltYWdlKSB7XG4gICAgICByZXR1cm4gbWFrZUluc2VydE1hcmt1cChtb3VudEltYWdlLCBhZnRlck5vZGUsIGNoaWxkLl9tb3VudEluZGV4KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIGNoaWxkIGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGNoaWxkIENoaWxkIHRvIHJlbW92ZS5cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgcmVtb3ZlQ2hpbGQ6IGZ1bmN0aW9uIChjaGlsZCwgbm9kZSkge1xuICAgICAgcmV0dXJuIG1ha2VSZW1vdmUoY2hpbGQsIG5vZGUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNb3VudHMgYSBjaGlsZCB3aXRoIHRoZSBzdXBwbGllZCBuYW1lLlxuICAgICAqXG4gICAgICogTk9URTogVGhpcyBpcyBwYXJ0IG9mIGB1cGRhdGVDaGlsZHJlbmAgYW5kIGlzIGhlcmUgZm9yIHJlYWRhYmlsaXR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY2hpbGQgQ29tcG9uZW50IHRvIG1vdW50LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGNoaWxkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCBhdCB3aGljaCB0byBpbnNlcnQgdGhlIGNoaWxkLlxuICAgICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9tb3VudENoaWxkQXRJbmRleDogZnVuY3Rpb24gKGNoaWxkLCBtb3VudEltYWdlLCBhZnRlck5vZGUsIGluZGV4LCB0cmFuc2FjdGlvbiwgY29udGV4dCkge1xuICAgICAgY2hpbGQuX21vdW50SW5kZXggPSBpbmRleDtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUNoaWxkKGNoaWxkLCBhZnRlck5vZGUsIG1vdW50SW1hZ2UpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVbm1vdW50cyBhIHJlbmRlcmVkIGNoaWxkLlxuICAgICAqXG4gICAgICogTk9URTogVGhpcyBpcyBwYXJ0IG9mIGB1cGRhdGVDaGlsZHJlbmAgYW5kIGlzIGhlcmUgZm9yIHJlYWRhYmlsaXR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY2hpbGQgQ29tcG9uZW50IHRvIHVubW91bnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfdW5tb3VudENoaWxkOiBmdW5jdGlvbiAoY2hpbGQsIG5vZGUpIHtcbiAgICAgIHZhciB1cGRhdGUgPSB0aGlzLnJlbW92ZUNoaWxkKGNoaWxkLCBub2RlKTtcbiAgICAgIGNoaWxkLl9tb3VudEluZGV4ID0gbnVsbDtcbiAgICAgIHJldHVybiB1cGRhdGU7XG4gICAgfVxuXG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdE11bHRpQ2hpbGQ7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RNdWx0aUNoaWxkLmpzXG4vLyBtb2R1bGUgaWQgPSAyODdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 288 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nvar invariant = __webpack_require__(180);\n\nvar injected = false;\n\nvar ReactComponentEnvironment = {\n\n  /**\n   * Optionally injectable hook for swapping out mount images in the middle of\n   * the tree.\n   */\n  replaceNodeWithMarkup: null,\n\n  /**\n   * Optionally injectable hook for processing a queue of child updates. Will\n   * later move into MultiChildComponents.\n   */\n  processChildrenUpdates: null,\n\n  injection: {\n    injectEnvironment: function (environment) {\n      !!injected ?  true ? invariant(false, 'ReactCompositeComponent: injectEnvironment() can only be called once.') : _prodInvariant('104') : void 0;\n      ReactComponentEnvironment.replaceNodeWithMarkup = environment.replaceNodeWithMarkup;\n      ReactComponentEnvironment.processChildrenUpdates = environment.processChildrenUpdates;\n      injected = true;\n    }\n  }\n\n};\n\nmodule.exports = ReactComponentEnvironment;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjg4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbnZhciBpbmplY3RlZCA9IGZhbHNlO1xuXG52YXIgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCA9IHtcblxuICAvKipcbiAgICogT3B0aW9uYWxseSBpbmplY3RhYmxlIGhvb2sgZm9yIHN3YXBwaW5nIG91dCBtb3VudCBpbWFnZXMgaW4gdGhlIG1pZGRsZSBvZlxuICAgKiB0aGUgdHJlZS5cbiAgICovXG4gIHJlcGxhY2VOb2RlV2l0aE1hcmt1cDogbnVsbCxcblxuICAvKipcbiAgICogT3B0aW9uYWxseSBpbmplY3RhYmxlIGhvb2sgZm9yIHByb2Nlc3NpbmcgYSBxdWV1ZSBvZiBjaGlsZCB1cGRhdGVzLiBXaWxsXG4gICAqIGxhdGVyIG1vdmUgaW50byBNdWx0aUNoaWxkQ29tcG9uZW50cy5cbiAgICovXG4gIHByb2Nlc3NDaGlsZHJlblVwZGF0ZXM6IG51bGwsXG5cbiAgaW5qZWN0aW9uOiB7XG4gICAgaW5qZWN0RW52aXJvbm1lbnQ6IGZ1bmN0aW9uIChlbnZpcm9ubWVudCkge1xuICAgICAgISFpbmplY3RlZCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudDogaW5qZWN0RW52aXJvbm1lbnQoKSBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4nKSA6IF9wcm9kSW52YXJpYW50KCcxMDQnKSA6IHZvaWQgMDtcbiAgICAgIFJlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQucmVwbGFjZU5vZGVXaXRoTWFya3VwID0gZW52aXJvbm1lbnQucmVwbGFjZU5vZGVXaXRoTWFya3VwO1xuICAgICAgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudC5wcm9jZXNzQ2hpbGRyZW5VcGRhdGVzID0gZW52aXJvbm1lbnQucHJvY2Vzc0NoaWxkcmVuVXBkYXRlcztcbiAgICAgIGluamVjdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdENvbXBvbmVudEVudmlyb25tZW50O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQuanNcbi8vIG1vZHVsZSBpZCA9IDI4OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 289 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\n/**\n * `ReactInstanceMap` maintains a mapping from a public facing stateful\n * instance (key) and the internal representation (value). This allows public\n * methods to accept the user facing instance as an argument and map them back\n * to internal methods.\n */\n\n// TODO: Replace this with ES6: var ReactInstanceMap = new Map();\n\nvar ReactInstanceMap = {\n\n  /**\n   * This API should be called `delete` but we'd have to make sure to always\n   * transform these to strings for IE support. When this transform is fully\n   * supported we can rename it.\n   */\n  remove: function (key) {\n    key._reactInternalInstance = undefined;\n  },\n\n  get: function (key) {\n    return key._reactInternalInstance;\n  },\n\n  has: function (key) {\n    return key._reactInternalInstance !== undefined;\n  },\n\n  set: function (key, value) {\n    key._reactInternalInstance = value;\n  }\n\n};\n\nmodule.exports = ReactInstanceMap;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjg5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0SW5zdGFuY2VNYXAuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBgUmVhY3RJbnN0YW5jZU1hcGAgbWFpbnRhaW5zIGEgbWFwcGluZyBmcm9tIGEgcHVibGljIGZhY2luZyBzdGF0ZWZ1bFxuICogaW5zdGFuY2UgKGtleSkgYW5kIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAodmFsdWUpLiBUaGlzIGFsbG93cyBwdWJsaWNcbiAqIG1ldGhvZHMgdG8gYWNjZXB0IHRoZSB1c2VyIGZhY2luZyBpbnN0YW5jZSBhcyBhbiBhcmd1bWVudCBhbmQgbWFwIHRoZW0gYmFja1xuICogdG8gaW50ZXJuYWwgbWV0aG9kcy5cbiAqL1xuXG4vLyBUT0RPOiBSZXBsYWNlIHRoaXMgd2l0aCBFUzY6IHZhciBSZWFjdEluc3RhbmNlTWFwID0gbmV3IE1hcCgpO1xuXG52YXIgUmVhY3RJbnN0YW5jZU1hcCA9IHtcblxuICAvKipcbiAgICogVGhpcyBBUEkgc2hvdWxkIGJlIGNhbGxlZCBgZGVsZXRlYCBidXQgd2UnZCBoYXZlIHRvIG1ha2Ugc3VyZSB0byBhbHdheXNcbiAgICogdHJhbnNmb3JtIHRoZXNlIHRvIHN0cmluZ3MgZm9yIElFIHN1cHBvcnQuIFdoZW4gdGhpcyB0cmFuc2Zvcm0gaXMgZnVsbHlcbiAgICogc3VwcG9ydGVkIHdlIGNhbiByZW5hbWUgaXQuXG4gICAqL1xuICByZW1vdmU6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICBrZXkuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSA9IHVuZGVmaW5lZDtcbiAgfSxcblxuICBnZXQ6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4ga2V5Ll9yZWFjdEludGVybmFsSW5zdGFuY2U7XG4gIH0sXG5cbiAgaGFzOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIGtleS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlICE9PSB1bmRlZmluZWQ7XG4gIH0sXG5cbiAgc2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIGtleS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlID0gdmFsdWU7XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEluc3RhbmNlTWFwO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0SW5zdGFuY2VNYXAuanNcbi8vIG1vZHVsZSBpZCA9IDI4OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 290 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(process) {/**\n * Copyright 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar ReactReconciler = __webpack_require__(232);\n\nvar instantiateReactComponent = __webpack_require__(291);\nvar KeyEscapeUtils = __webpack_require__(301);\nvar shouldUpdateReactComponent = __webpack_require__(297);\nvar traverseAllChildren = __webpack_require__(302);\nvar warning = __webpack_require__(183);\n\nvar ReactComponentTreeHook;\n\nif (typeof process !== 'undefined' && process.env && (\"development\") === 'test') {\n  // Temporary hack.\n  // Inline requires don't work well with Jest:\n  // https://github.com/facebook/react/issues/7240\n  // Remove the inline requires when we don't need them anymore:\n  // https://github.com/facebook/react/pull/7178\n  ReactComponentTreeHook = __webpack_require__(198);\n}\n\nfunction instantiateChild(childInstances, child, name, selfDebugID) {\n  // We found a component instance.\n  var keyUnique = childInstances[name] === undefined;\n  if (true) {\n    if (!ReactComponentTreeHook) {\n      ReactComponentTreeHook = __webpack_require__(198);\n    }\n    if (!keyUnique) {\n       true ? warning(false, 'flattenChildren(...): Encountered two children with the same key, ' + '`%s`. Child keys must be unique; when two children share a key, only ' + 'the first child will be used.%s', KeyEscapeUtils.unescape(name), ReactComponentTreeHook.getStackAddendumByID(selfDebugID)) : void 0;\n    }\n  }\n  if (child != null && keyUnique) {\n    childInstances[name] = instantiateReactComponent(child, true);\n  }\n}\n\n/**\n * ReactChildReconciler provides helpers for initializing or updating a set of\n * children. Its output is suitable for passing it onto ReactMultiChild which\n * does diffed reordering and insertion.\n */\nvar ReactChildReconciler = {\n  /**\n   * Generates a \"mount image\" for each of the supplied children. In the case\n   * of `ReactDOMComponent`, a mount image is a string of markup.\n   *\n   * @param {?object} nestedChildNodes Nested child maps.\n   * @return {?object} A set of child instances.\n   * @internal\n   */\n  instantiateChildren: function (nestedChildNodes, transaction, context, selfDebugID // 0 in production and for roots\n  ) {\n    if (nestedChildNodes == null) {\n      return null;\n    }\n    var childInstances = {};\n\n    if (true) {\n      traverseAllChildren(nestedChildNodes, function (childInsts, child, name) {\n        return instantiateChild(childInsts, child, name, selfDebugID);\n      }, childInstances);\n    } else {\n      traverseAllChildren(nestedChildNodes, instantiateChild, childInstances);\n    }\n    return childInstances;\n  },\n\n  /**\n   * Updates the rendered children and returns a new set of children.\n   *\n   * @param {?object} prevChildren Previously initialized set of children.\n   * @param {?object} nextChildren Flat child element maps.\n   * @param {ReactReconcileTransaction} transaction\n   * @param {object} context\n   * @return {?object} A new set of child instances.\n   * @internal\n   */\n  updateChildren: function (prevChildren, nextChildren, mountImages, removedNodes, transaction, hostParent, hostContainerInfo, context, selfDebugID // 0 in production and for roots\n  ) {\n    // We currently don't have a way to track moves here but if we use iterators\n    // instead of for..in we can zip the iterators and check if an item has\n    // moved.\n    // TODO: If nothing has changed, return the prevChildren object so that we\n    // can quickly bailout if nothing has changed.\n    if (!nextChildren && !prevChildren) {\n      return;\n    }\n    var name;\n    var prevChild;\n    for (name in nextChildren) {\n      if (!nextChildren.hasOwnProperty(name)) {\n        continue;\n      }\n      prevChild = prevChildren && prevChildren[name];\n      var prevElement = prevChild && prevChild._currentElement;\n      var nextElement = nextChildren[name];\n      if (prevChild != null && shouldUpdateReactComponent(prevElement, nextElement)) {\n        ReactReconciler.receiveComponent(prevChild, nextElement, transaction, context);\n        nextChildren[name] = prevChild;\n      } else {\n        if (prevChild) {\n          removedNodes[name] = ReactReconciler.getHostNode(prevChild);\n          ReactReconciler.unmountComponent(prevChild, false);\n        }\n        // The child must be instantiated before it's mounted.\n        var nextChildInstance = instantiateReactComponent(nextElement, true);\n        nextChildren[name] = nextChildInstance;\n        // Creating mount image now ensures refs are resolved in right order\n        // (see https://github.com/facebook/react/pull/7101 for explanation).\n        var nextChildMountImage = ReactReconciler.mountComponent(nextChildInstance, transaction, hostParent, hostContainerInfo, context, selfDebugID);\n        mountImages.push(nextChildMountImage);\n      }\n    }\n    // Unmount children that are no longer present.\n    for (name in prevChildren) {\n      if (prevChildren.hasOwnProperty(name) && !(nextChildren && nextChildren.hasOwnProperty(name))) {\n        prevChild = prevChildren[name];\n        removedNodes[name] = ReactReconciler.getHostNode(prevChild);\n        ReactReconciler.unmountComponent(prevChild, false);\n      }\n    }\n  },\n\n  /**\n   * Unmounts all rendered children. This should be used to clean up children\n   * when this component is unmounted.\n   *\n   * @param {?object} renderedChildren Previously initialized set of children.\n   * @internal\n   */\n  unmountChildren: function (renderedChildren, safely) {\n    for (var name in renderedChildren) {\n      if (renderedChildren.hasOwnProperty(name)) {\n        var renderedChild = renderedChildren[name];\n        ReactReconciler.unmountComponent(renderedChild, safely);\n      }\n    }\n  }\n\n};\n\nmodule.exports = ReactChildReconciler;\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(200)))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjkwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0Q2hpbGRSZWNvbmNpbGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFJlY29uY2lsZXIgPSByZXF1aXJlKCcuL1JlYWN0UmVjb25jaWxlcicpO1xuXG52YXIgaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudCA9IHJlcXVpcmUoJy4vaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudCcpO1xudmFyIEtleUVzY2FwZVV0aWxzID0gcmVxdWlyZSgnLi9LZXlFc2NhcGVVdGlscycpO1xudmFyIHNob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9zaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudCcpO1xudmFyIHRyYXZlcnNlQWxsQ2hpbGRyZW4gPSByZXF1aXJlKCcuL3RyYXZlcnNlQWxsQ2hpbGRyZW4nKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vaztcblxuaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnKSB7XG4gIC8vIFRlbXBvcmFyeSBoYWNrLlxuICAvLyBJbmxpbmUgcmVxdWlyZXMgZG9uJ3Qgd29yayB3ZWxsIHdpdGggSmVzdDpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy83MjQwXG4gIC8vIFJlbW92ZSB0aGUgaW5saW5lIHJlcXVpcmVzIHdoZW4gd2UgZG9uJ3QgbmVlZCB0aGVtIGFueW1vcmU6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzcxNzhcbiAgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG59XG5cbmZ1bmN0aW9uIGluc3RhbnRpYXRlQ2hpbGQoY2hpbGRJbnN0YW5jZXMsIGNoaWxkLCBuYW1lLCBzZWxmRGVidWdJRCkge1xuICAvLyBXZSBmb3VuZCBhIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgdmFyIGtleVVuaXF1ZSA9IGNoaWxkSW5zdGFuY2VzW25hbWVdID09PSB1bmRlZmluZWQ7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKCFSZWFjdENvbXBvbmVudFRyZWVIb29rKSB7XG4gICAgICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcbiAgICB9XG4gICAgaWYgKCFrZXlVbmlxdWUpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnZmxhdHRlbkNoaWxkcmVuKC4uLik6IEVuY291bnRlcmVkIHR3byBjaGlsZHJlbiB3aXRoIHRoZSBzYW1lIGtleSwgJyArICdgJXNgLiBDaGlsZCBrZXlzIG11c3QgYmUgdW5pcXVlOyB3aGVuIHR3byBjaGlsZHJlbiBzaGFyZSBhIGtleSwgb25seSAnICsgJ3RoZSBmaXJzdCBjaGlsZCB3aWxsIGJlIHVzZWQuJXMnLCBLZXlFc2NhcGVVdGlscy51bmVzY2FwZShuYW1lKSwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChzZWxmRGVidWdJRCkpIDogdm9pZCAwO1xuICAgIH1cbiAgfVxuICBpZiAoY2hpbGQgIT0gbnVsbCAmJiBrZXlVbmlxdWUpIHtcbiAgICBjaGlsZEluc3RhbmNlc1tuYW1lXSA9IGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQoY2hpbGQsIHRydWUpO1xuICB9XG59XG5cbi8qKlxuICogUmVhY3RDaGlsZFJlY29uY2lsZXIgcHJvdmlkZXMgaGVscGVycyBmb3IgaW5pdGlhbGl6aW5nIG9yIHVwZGF0aW5nIGEgc2V0IG9mXG4gKiBjaGlsZHJlbi4gSXRzIG91dHB1dCBpcyBzdWl0YWJsZSBmb3IgcGFzc2luZyBpdCBvbnRvIFJlYWN0TXVsdGlDaGlsZCB3aGljaFxuICogZG9lcyBkaWZmZWQgcmVvcmRlcmluZyBhbmQgaW5zZXJ0aW9uLlxuICovXG52YXIgUmVhY3RDaGlsZFJlY29uY2lsZXIgPSB7XG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBcIm1vdW50IGltYWdlXCIgZm9yIGVhY2ggb2YgdGhlIHN1cHBsaWVkIGNoaWxkcmVuLiBJbiB0aGUgY2FzZVxuICAgKiBvZiBgUmVhY3RET01Db21wb25lbnRgLCBhIG1vdW50IGltYWdlIGlzIGEgc3RyaW5nIG9mIG1hcmt1cC5cbiAgICpcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXN0ZWRDaGlsZE5vZGVzIE5lc3RlZCBjaGlsZCBtYXBzLlxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBBIHNldCBvZiBjaGlsZCBpbnN0YW5jZXMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgaW5zdGFudGlhdGVDaGlsZHJlbjogZnVuY3Rpb24gKG5lc3RlZENoaWxkTm9kZXMsIHRyYW5zYWN0aW9uLCBjb250ZXh0LCBzZWxmRGVidWdJRCAvLyAwIGluIHByb2R1Y3Rpb24gYW5kIGZvciByb290c1xuICApIHtcbiAgICBpZiAobmVzdGVkQ2hpbGROb2RlcyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIGNoaWxkSW5zdGFuY2VzID0ge307XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdHJhdmVyc2VBbGxDaGlsZHJlbihuZXN0ZWRDaGlsZE5vZGVzLCBmdW5jdGlvbiAoY2hpbGRJbnN0cywgY2hpbGQsIG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQ2hpbGQoY2hpbGRJbnN0cywgY2hpbGQsIG5hbWUsIHNlbGZEZWJ1Z0lEKTtcbiAgICAgIH0sIGNoaWxkSW5zdGFuY2VzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJhdmVyc2VBbGxDaGlsZHJlbihuZXN0ZWRDaGlsZE5vZGVzLCBpbnN0YW50aWF0ZUNoaWxkLCBjaGlsZEluc3RhbmNlcyk7XG4gICAgfVxuICAgIHJldHVybiBjaGlsZEluc3RhbmNlcztcbiAgfSxcblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgcmVuZGVyZWQgY2hpbGRyZW4gYW5kIHJldHVybnMgYSBuZXcgc2V0IG9mIGNoaWxkcmVuLlxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IHByZXZDaGlsZHJlbiBQcmV2aW91c2x5IGluaXRpYWxpemVkIHNldCBvZiBjaGlsZHJlbi5cbiAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0Q2hpbGRyZW4gRmxhdCBjaGlsZCBlbGVtZW50IG1hcHMuXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHRcbiAgICogQHJldHVybiB7P29iamVjdH0gQSBuZXcgc2V0IG9mIGNoaWxkIGluc3RhbmNlcy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICB1cGRhdGVDaGlsZHJlbjogZnVuY3Rpb24gKHByZXZDaGlsZHJlbiwgbmV4dENoaWxkcmVuLCBtb3VudEltYWdlcywgcmVtb3ZlZE5vZGVzLCB0cmFuc2FjdGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQsIHNlbGZEZWJ1Z0lEIC8vIDAgaW4gcHJvZHVjdGlvbiBhbmQgZm9yIHJvb3RzXG4gICkge1xuICAgIC8vIFdlIGN1cnJlbnRseSBkb24ndCBoYXZlIGEgd2F5IHRvIHRyYWNrIG1vdmVzIGhlcmUgYnV0IGlmIHdlIHVzZSBpdGVyYXRvcnNcbiAgICAvLyBpbnN0ZWFkIG9mIGZvci4uaW4gd2UgY2FuIHppcCB0aGUgaXRlcmF0b3JzIGFuZCBjaGVjayBpZiBhbiBpdGVtIGhhc1xuICAgIC8vIG1vdmVkLlxuICAgIC8vIFRPRE86IElmIG5vdGhpbmcgaGFzIGNoYW5nZWQsIHJldHVybiB0aGUgcHJldkNoaWxkcmVuIG9iamVjdCBzbyB0aGF0IHdlXG4gICAgLy8gY2FuIHF1aWNrbHkgYmFpbG91dCBpZiBub3RoaW5nIGhhcyBjaGFuZ2VkLlxuICAgIGlmICghbmV4dENoaWxkcmVuICYmICFwcmV2Q2hpbGRyZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG5hbWU7XG4gICAgdmFyIHByZXZDaGlsZDtcbiAgICBmb3IgKG5hbWUgaW4gbmV4dENoaWxkcmVuKSB7XG4gICAgICBpZiAoIW5leHRDaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHByZXZDaGlsZCA9IHByZXZDaGlsZHJlbiAmJiBwcmV2Q2hpbGRyZW5bbmFtZV07XG4gICAgICB2YXIgcHJldkVsZW1lbnQgPSBwcmV2Q2hpbGQgJiYgcHJldkNoaWxkLl9jdXJyZW50RWxlbWVudDtcbiAgICAgIHZhciBuZXh0RWxlbWVudCA9IG5leHRDaGlsZHJlbltuYW1lXTtcbiAgICAgIGlmIChwcmV2Q2hpbGQgIT0gbnVsbCAmJiBzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudChwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQpKSB7XG4gICAgICAgIFJlYWN0UmVjb25jaWxlci5yZWNlaXZlQ29tcG9uZW50KHByZXZDaGlsZCwgbmV4dEVsZW1lbnQsIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcbiAgICAgICAgbmV4dENoaWxkcmVuW25hbWVdID0gcHJldkNoaWxkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHByZXZDaGlsZCkge1xuICAgICAgICAgIHJlbW92ZWROb2Rlc1tuYW1lXSA9IFJlYWN0UmVjb25jaWxlci5nZXRIb3N0Tm9kZShwcmV2Q2hpbGQpO1xuICAgICAgICAgIFJlYWN0UmVjb25jaWxlci51bm1vdW50Q29tcG9uZW50KHByZXZDaGlsZCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBjaGlsZCBtdXN0IGJlIGluc3RhbnRpYXRlZCBiZWZvcmUgaXQncyBtb3VudGVkLlxuICAgICAgICB2YXIgbmV4dENoaWxkSW5zdGFuY2UgPSBpbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KG5leHRFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgbmV4dENoaWxkcmVuW25hbWVdID0gbmV4dENoaWxkSW5zdGFuY2U7XG4gICAgICAgIC8vIENyZWF0aW5nIG1vdW50IGltYWdlIG5vdyBlbnN1cmVzIHJlZnMgYXJlIHJlc29sdmVkIGluIHJpZ2h0IG9yZGVyXG4gICAgICAgIC8vIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNzEwMSBmb3IgZXhwbGFuYXRpb24pLlxuICAgICAgICB2YXIgbmV4dENoaWxkTW91bnRJbWFnZSA9IFJlYWN0UmVjb25jaWxlci5tb3VudENvbXBvbmVudChuZXh0Q2hpbGRJbnN0YW5jZSwgdHJhbnNhY3Rpb24sIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCBjb250ZXh0LCBzZWxmRGVidWdJRCk7XG4gICAgICAgIG1vdW50SW1hZ2VzLnB1c2gobmV4dENoaWxkTW91bnRJbWFnZSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFVubW91bnQgY2hpbGRyZW4gdGhhdCBhcmUgbm8gbG9uZ2VyIHByZXNlbnQuXG4gICAgZm9yIChuYW1lIGluIHByZXZDaGlsZHJlbikge1xuICAgICAgaWYgKHByZXZDaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiAhKG5leHRDaGlsZHJlbiAmJiBuZXh0Q2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkpKSB7XG4gICAgICAgIHByZXZDaGlsZCA9IHByZXZDaGlsZHJlbltuYW1lXTtcbiAgICAgICAgcmVtb3ZlZE5vZGVzW25hbWVdID0gUmVhY3RSZWNvbmNpbGVyLmdldEhvc3ROb2RlKHByZXZDaGlsZCk7XG4gICAgICAgIFJlYWN0UmVjb25jaWxlci51bm1vdW50Q29tcG9uZW50KHByZXZDaGlsZCwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogVW5tb3VudHMgYWxsIHJlbmRlcmVkIGNoaWxkcmVuLiBUaGlzIHNob3VsZCBiZSB1c2VkIHRvIGNsZWFuIHVwIGNoaWxkcmVuXG4gICAqIHdoZW4gdGhpcyBjb21wb25lbnQgaXMgdW5tb3VudGVkLlxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IHJlbmRlcmVkQ2hpbGRyZW4gUHJldmlvdXNseSBpbml0aWFsaXplZCBzZXQgb2YgY2hpbGRyZW4uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdW5tb3VudENoaWxkcmVuOiBmdW5jdGlvbiAocmVuZGVyZWRDaGlsZHJlbiwgc2FmZWx5KSB7XG4gICAgZm9yICh2YXIgbmFtZSBpbiByZW5kZXJlZENoaWxkcmVuKSB7XG4gICAgICBpZiAocmVuZGVyZWRDaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICB2YXIgcmVuZGVyZWRDaGlsZCA9IHJlbmRlcmVkQ2hpbGRyZW5bbmFtZV07XG4gICAgICAgIFJlYWN0UmVjb25jaWxlci51bm1vdW50Q29tcG9uZW50KHJlbmRlcmVkQ2hpbGQsIHNhZmVseSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RDaGlsZFJlY29uY2lsZXI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RDaGlsZFJlY29uY2lsZXIuanNcbi8vIG1vZHVsZSBpZCA9IDI5MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 291 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208),\n    _assign = __webpack_require__(176);\n\nvar ReactCompositeComponent = __webpack_require__(292);\nvar ReactEmptyComponent = __webpack_require__(298);\nvar ReactHostComponent = __webpack_require__(299);\n\nvar getNextDebugID = __webpack_require__(300);\nvar invariant = __webpack_require__(180);\nvar warning = __webpack_require__(183);\n\n// To avoid a cyclic dependency, we create the final class in this module\nvar ReactCompositeComponentWrapper = function (element) {\n  this.construct(element);\n};\n_assign(ReactCompositeComponentWrapper.prototype, ReactCompositeComponent, {\n  _instantiateReactComponent: instantiateReactComponent\n});\n\nfunction getDeclarationErrorAddendum(owner) {\n  if (owner) {\n    var name = owner.getName();\n    if (name) {\n      return ' Check the render method of `' + name + '`.';\n    }\n  }\n  return '';\n}\n\n/**\n * Check if the type reference is a known internal type. I.e. not a user\n * provided composite type.\n *\n * @param {function} type\n * @return {boolean} Returns true if this is a valid internal type.\n */\nfunction isInternalComponentType(type) {\n  return typeof type === 'function' && typeof type.prototype !== 'undefined' && typeof type.prototype.mountComponent === 'function' && typeof type.prototype.receiveComponent === 'function';\n}\n\n/**\n * Given a ReactNode, create an instance that will actually be mounted.\n *\n * @param {ReactNode} node\n * @param {boolean} shouldHaveDebugID\n * @return {object} A new instance of the element's constructor.\n * @protected\n */\nfunction instantiateReactComponent(node, shouldHaveDebugID) {\n  var instance;\n\n  if (node === null || node === false) {\n    instance = ReactEmptyComponent.create(instantiateReactComponent);\n  } else if (typeof node === 'object') {\n    var element = node;\n    var type = element.type;\n    if (typeof type !== 'function' && typeof type !== 'string') {\n      var info = '';\n      if (true) {\n        if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n          info += ' You likely forgot to export your component from the file ' + 'it\\'s defined in.';\n        }\n      }\n      info += getDeclarationErrorAddendum(element._owner);\n       true ?  true ? invariant(false, 'Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s', type == null ? type : typeof type, info) : _prodInvariant('130', type == null ? type : typeof type, info) : void 0;\n    }\n\n    // Special case string values\n    if (typeof element.type === 'string') {\n      instance = ReactHostComponent.createInternalComponent(element);\n    } else if (isInternalComponentType(element.type)) {\n      // This is temporarily available for custom components that are not string\n      // representations. I.e. ART. Once those are updated to use the string\n      // representation, we can drop this code path.\n      instance = new element.type(element);\n\n      // We renamed this. Allow the old name for compat. :(\n      if (!instance.getHostNode) {\n        instance.getHostNode = instance.getNativeNode;\n      }\n    } else {\n      instance = new ReactCompositeComponentWrapper(element);\n    }\n  } else if (typeof node === 'string' || typeof node === 'number') {\n    instance = ReactHostComponent.createInstanceForText(node);\n  } else {\n     true ?  true ? invariant(false, 'Encountered invalid React node of type %s', typeof node) : _prodInvariant('131', typeof node) : void 0;\n  }\n\n  if (true) {\n     true ? warning(typeof instance.mountComponent === 'function' && typeof instance.receiveComponent === 'function' && typeof instance.getHostNode === 'function' && typeof instance.unmountComponent === 'function', 'Only React Components can be mounted.') : void 0;\n  }\n\n  // These two fields are used by the DOM and ART diffing algorithms\n  // respectively. Instead of using expandos on components, we should be\n  // storing the state needed by the diffing algorithms elsewhere.\n  instance._mountIndex = 0;\n  instance._mountImage = null;\n\n  if (true) {\n    instance._debugID = shouldHaveDebugID ? getNextDebugID() : 0;\n  }\n\n  // Internal instances should fully constructed at this point, so they should\n  // not get any new fields added to them at this point.\n  if (true) {\n    if (Object.preventExtensions) {\n      Object.preventExtensions(instance);\n    }\n  }\n\n  return instance;\n}\n\nmodule.exports = instantiateReactComponent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjkxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2luc3RhbnRpYXRlUmVhY3RDb21wb25lbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKSxcbiAgICBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3RDb21wb3NpdGVDb21wb25lbnQgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50Jyk7XG52YXIgUmVhY3RFbXB0eUNvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RFbXB0eUNvbXBvbmVudCcpO1xudmFyIFJlYWN0SG9zdENvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RIb3N0Q29tcG9uZW50Jyk7XG5cbnZhciBnZXROZXh0RGVidWdJRCA9IHJlcXVpcmUoJy4vZ2V0TmV4dERlYnVnSUQnKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG4vLyBUbyBhdm9pZCBhIGN5Y2xpYyBkZXBlbmRlbmN5LCB3ZSBjcmVhdGUgdGhlIGZpbmFsIGNsYXNzIGluIHRoaXMgbW9kdWxlXG52YXIgUmVhY3RDb21wb3NpdGVDb21wb25lbnRXcmFwcGVyID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgdGhpcy5jb25zdHJ1Y3QoZWxlbWVudCk7XG59O1xuX2Fzc2lnbihSZWFjdENvbXBvc2l0ZUNvbXBvbmVudFdyYXBwZXIucHJvdG90eXBlLCBSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCwge1xuICBfaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudDogaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudFxufSk7XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShvd25lcikge1xuICBpZiAob3duZXIpIHtcbiAgICB2YXIgbmFtZSA9IG93bmVyLmdldE5hbWUoKTtcbiAgICBpZiAobmFtZSkge1xuICAgICAgcmV0dXJuICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSB0eXBlIHJlZmVyZW5jZSBpcyBhIGtub3duIGludGVybmFsIHR5cGUuIEkuZS4gbm90IGEgdXNlclxuICogcHJvdmlkZWQgY29tcG9zaXRlIHR5cGUuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gdHlwZVxuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSB2YWxpZCBpbnRlcm5hbCB0eXBlLlxuICovXG5mdW5jdGlvbiBpc0ludGVybmFsQ29tcG9uZW50VHlwZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdHlwZS5wcm90b3R5cGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB0eXBlLnByb3RvdHlwZS5tb3VudENvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdHlwZS5wcm90b3R5cGUucmVjZWl2ZUNvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBHaXZlbiBhIFJlYWN0Tm9kZSwgY3JlYXRlIGFuIGluc3RhbmNlIHRoYXQgd2lsbCBhY3R1YWxseSBiZSBtb3VudGVkLlxuICpcbiAqIEBwYXJhbSB7UmVhY3ROb2RlfSBub2RlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZEhhdmVEZWJ1Z0lEXG4gKiBAcmV0dXJuIHtvYmplY3R9IEEgbmV3IGluc3RhbmNlIG9mIHRoZSBlbGVtZW50J3MgY29uc3RydWN0b3IuXG4gKiBAcHJvdGVjdGVkXG4gKi9cbmZ1bmN0aW9uIGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQobm9kZSwgc2hvdWxkSGF2ZURlYnVnSUQpIHtcbiAgdmFyIGluc3RhbmNlO1xuXG4gIGlmIChub2RlID09PSBudWxsIHx8IG5vZGUgPT09IGZhbHNlKSB7XG4gICAgaW5zdGFuY2UgPSBSZWFjdEVtcHR5Q29tcG9uZW50LmNyZWF0ZShpbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KTtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcpIHtcbiAgICB2YXIgZWxlbWVudCA9IG5vZGU7XG4gICAgdmFyIHR5cGUgPSBlbGVtZW50LnR5cGU7XG4gICAgaWYgKHR5cGVvZiB0eXBlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgdmFyIGluZm8gPSAnJztcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgT2JqZWN0LmtleXModHlwZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyAnaXRcXCdzIGRlZmluZWQgaW4uJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaW5mbyArPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oZWxlbWVudC5fb3duZXIpO1xuICAgICAgIWZhbHNlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0VsZW1lbnQgdHlwZSBpcyBpbnZhbGlkOiBleHBlY3RlZCBhIHN0cmluZyAoZm9yIGJ1aWx0LWluIGNvbXBvbmVudHMpIG9yIGEgY2xhc3MvZnVuY3Rpb24gKGZvciBjb21wb3NpdGUgY29tcG9uZW50cykgYnV0IGdvdDogJXMuJXMnLCB0eXBlID09IG51bGwgPyB0eXBlIDogdHlwZW9mIHR5cGUsIGluZm8pIDogX3Byb2RJbnZhcmlhbnQoJzEzMCcsIHR5cGUgPT0gbnVsbCA/IHR5cGUgOiB0eXBlb2YgdHlwZSwgaW5mbykgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBjYXNlIHN0cmluZyB2YWx1ZXNcbiAgICBpZiAodHlwZW9mIGVsZW1lbnQudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGluc3RhbmNlID0gUmVhY3RIb3N0Q29tcG9uZW50LmNyZWF0ZUludGVybmFsQ29tcG9uZW50KGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAoaXNJbnRlcm5hbENvbXBvbmVudFR5cGUoZWxlbWVudC50eXBlKSkge1xuICAgICAgLy8gVGhpcyBpcyB0ZW1wb3JhcmlseSBhdmFpbGFibGUgZm9yIGN1c3RvbSBjb21wb25lbnRzIHRoYXQgYXJlIG5vdCBzdHJpbmdcbiAgICAgIC8vIHJlcHJlc2VudGF0aW9ucy4gSS5lLiBBUlQuIE9uY2UgdGhvc2UgYXJlIHVwZGF0ZWQgdG8gdXNlIHRoZSBzdHJpbmdcbiAgICAgIC8vIHJlcHJlc2VudGF0aW9uLCB3ZSBjYW4gZHJvcCB0aGlzIGNvZGUgcGF0aC5cbiAgICAgIGluc3RhbmNlID0gbmV3IGVsZW1lbnQudHlwZShlbGVtZW50KTtcblxuICAgICAgLy8gV2UgcmVuYW1lZCB0aGlzLiBBbGxvdyB0aGUgb2xkIG5hbWUgZm9yIGNvbXBhdC4gOihcbiAgICAgIGlmICghaW5zdGFuY2UuZ2V0SG9zdE5vZGUpIHtcbiAgICAgICAgaW5zdGFuY2UuZ2V0SG9zdE5vZGUgPSBpbnN0YW5jZS5nZXROYXRpdmVOb2RlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZSA9IG5ldyBSZWFjdENvbXBvc2l0ZUNvbXBvbmVudFdyYXBwZXIoZWxlbWVudCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBub2RlID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygbm9kZSA9PT0gJ251bWJlcicpIHtcbiAgICBpbnN0YW5jZSA9IFJlYWN0SG9zdENvbXBvbmVudC5jcmVhdGVJbnN0YW5jZUZvclRleHQobm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgIWZhbHNlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0VuY291bnRlcmVkIGludmFsaWQgUmVhY3Qgbm9kZSBvZiB0eXBlICVzJywgdHlwZW9mIG5vZGUpIDogX3Byb2RJbnZhcmlhbnQoJzEzMScsIHR5cGVvZiBub2RlKSA6IHZvaWQgMDtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcodHlwZW9mIGluc3RhbmNlLm1vdW50Q29tcG9uZW50ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpbnN0YW5jZS5yZWNlaXZlQ29tcG9uZW50ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpbnN0YW5jZS5nZXRIb3N0Tm9kZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UudW5tb3VudENvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJywgJ09ubHkgUmVhY3QgQ29tcG9uZW50cyBjYW4gYmUgbW91bnRlZC4nKSA6IHZvaWQgMDtcbiAgfVxuXG4gIC8vIFRoZXNlIHR3byBmaWVsZHMgYXJlIHVzZWQgYnkgdGhlIERPTSBhbmQgQVJUIGRpZmZpbmcgYWxnb3JpdGhtc1xuICAvLyByZXNwZWN0aXZlbHkuIEluc3RlYWQgb2YgdXNpbmcgZXhwYW5kb3Mgb24gY29tcG9uZW50cywgd2Ugc2hvdWxkIGJlXG4gIC8vIHN0b3JpbmcgdGhlIHN0YXRlIG5lZWRlZCBieSB0aGUgZGlmZmluZyBhbGdvcml0aG1zIGVsc2V3aGVyZS5cbiAgaW5zdGFuY2UuX21vdW50SW5kZXggPSAwO1xuICBpbnN0YW5jZS5fbW91bnRJbWFnZSA9IG51bGw7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpbnN0YW5jZS5fZGVidWdJRCA9IHNob3VsZEhhdmVEZWJ1Z0lEID8gZ2V0TmV4dERlYnVnSUQoKSA6IDA7XG4gIH1cblxuICAvLyBJbnRlcm5hbCBpbnN0YW5jZXMgc2hvdWxkIGZ1bGx5IGNvbnN0cnVjdGVkIGF0IHRoaXMgcG9pbnQsIHNvIHRoZXkgc2hvdWxkXG4gIC8vIG5vdCBnZXQgYW55IG5ldyBmaWVsZHMgYWRkZWQgdG8gdGhlbSBhdCB0aGlzIHBvaW50LlxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChPYmplY3QucHJldmVudEV4dGVuc2lvbnMpIHtcbiAgICAgIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyhpbnN0YW5jZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQ7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudC5qc1xuLy8gbW9kdWxlIGlkID0gMjkxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 292 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208),\n    _assign = __webpack_require__(176);\n\nvar React = __webpack_require__(175);\nvar ReactComponentEnvironment = __webpack_require__(288);\nvar ReactCurrentOwner = __webpack_require__(182);\nvar ReactErrorUtils = __webpack_require__(218);\nvar ReactInstanceMap = __webpack_require__(289);\nvar ReactInstrumentation = __webpack_require__(235);\nvar ReactNodeTypes = __webpack_require__(293);\nvar ReactReconciler = __webpack_require__(232);\n\nif (true) {\n  var checkReactTypeSpec = __webpack_require__(294);\n}\n\nvar emptyObject = __webpack_require__(192);\nvar invariant = __webpack_require__(180);\nvar shallowEqual = __webpack_require__(296);\nvar shouldUpdateReactComponent = __webpack_require__(297);\nvar warning = __webpack_require__(183);\n\nvar CompositeTypes = {\n  ImpureClass: 0,\n  PureClass: 1,\n  StatelessFunctional: 2\n};\n\nfunction StatelessComponent(Component) {}\nStatelessComponent.prototype.render = function () {\n  var Component = ReactInstanceMap.get(this)._currentElement.type;\n  var element = Component(this.props, this.context, this.updater);\n  warnIfInvalidElement(Component, element);\n  return element;\n};\n\nfunction warnIfInvalidElement(Component, element) {\n  if (true) {\n     true ? warning(element === null || element === false || React.isValidElement(element), '%s(...): A valid React element (or null) must be returned. You may have ' + 'returned undefined, an array or some other invalid object.', Component.displayName || Component.name || 'Component') : void 0;\n     true ? warning(!Component.childContextTypes, '%s(...): childContextTypes cannot be defined on a functional component.', Component.displayName || Component.name || 'Component') : void 0;\n  }\n}\n\nfunction shouldConstruct(Component) {\n  return !!(Component.prototype && Component.prototype.isReactComponent);\n}\n\nfunction isPureComponent(Component) {\n  return !!(Component.prototype && Component.prototype.isPureReactComponent);\n}\n\n// Separated into a function to contain deoptimizations caused by try/finally.\nfunction measureLifeCyclePerf(fn, debugID, timerType) {\n  if (debugID === 0) {\n    // Top-level wrappers (see ReactMount) and empty components (see\n    // ReactDOMEmptyComponent) are invisible to hooks and devtools.\n    // Both are implementation details that should go away in the future.\n    return fn();\n  }\n\n  ReactInstrumentation.debugTool.onBeginLifeCycleTimer(debugID, timerType);\n  try {\n    return fn();\n  } finally {\n    ReactInstrumentation.debugTool.onEndLifeCycleTimer(debugID, timerType);\n  }\n}\n\n/**\n * ------------------ The Life-Cycle of a Composite Component ------------------\n *\n * - constructor: Initialization of state. The instance is now retained.\n *   - componentWillMount\n *   - render\n *   - [children's constructors]\n *     - [children's componentWillMount and render]\n *     - [children's componentDidMount]\n *     - componentDidMount\n *\n *       Update Phases:\n *       - componentWillReceiveProps (only called if parent updated)\n *       - shouldComponentUpdate\n *         - componentWillUpdate\n *           - render\n *           - [children's constructors or receive props phases]\n *         - componentDidUpdate\n *\n *     - componentWillUnmount\n *     - [children's componentWillUnmount]\n *   - [children destroyed]\n * - (destroyed): The instance is now blank, released by React and ready for GC.\n *\n * -----------------------------------------------------------------------------\n */\n\n/**\n * An incrementing ID assigned to each component when it is mounted. This is\n * used to enforce the order in which `ReactUpdates` updates dirty components.\n *\n * @private\n */\nvar nextMountID = 1;\n\n/**\n * @lends {ReactCompositeComponent.prototype}\n */\nvar ReactCompositeComponent = {\n\n  /**\n   * Base constructor for all composite component.\n   *\n   * @param {ReactElement} element\n   * @final\n   * @internal\n   */\n  construct: function (element) {\n    this._currentElement = element;\n    this._rootNodeID = 0;\n    this._compositeType = null;\n    this._instance = null;\n    this._hostParent = null;\n    this._hostContainerInfo = null;\n\n    // See ReactUpdateQueue\n    this._updateBatchNumber = null;\n    this._pendingElement = null;\n    this._pendingStateQueue = null;\n    this._pendingReplaceState = false;\n    this._pendingForceUpdate = false;\n\n    this._renderedNodeType = null;\n    this._renderedComponent = null;\n    this._context = null;\n    this._mountOrder = 0;\n    this._topLevelWrapper = null;\n\n    // See ReactUpdates and ReactUpdateQueue.\n    this._pendingCallbacks = null;\n\n    // ComponentWillUnmount shall only be called once\n    this._calledComponentWillUnmount = false;\n\n    if (true) {\n      this._warnedAboutRefsInRender = false;\n    }\n  },\n\n  /**\n   * Initializes the component, renders markup, and registers event listeners.\n   *\n   * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n   * @param {?object} hostParent\n   * @param {?object} hostContainerInfo\n   * @param {?object} context\n   * @return {?string} Rendered markup to be inserted into the DOM.\n   * @final\n   * @internal\n   */\n  mountComponent: function (transaction, hostParent, hostContainerInfo, context) {\n    var _this = this;\n\n    this._context = context;\n    this._mountOrder = nextMountID++;\n    this._hostParent = hostParent;\n    this._hostContainerInfo = hostContainerInfo;\n\n    var publicProps = this._currentElement.props;\n    var publicContext = this._processContext(context);\n\n    var Component = this._currentElement.type;\n\n    var updateQueue = transaction.getUpdateQueue();\n\n    // Initialize the public class\n    var doConstruct = shouldConstruct(Component);\n    var inst = this._constructComponent(doConstruct, publicProps, publicContext, updateQueue);\n    var renderedElement;\n\n    // Support functional components\n    if (!doConstruct && (inst == null || inst.render == null)) {\n      renderedElement = inst;\n      warnIfInvalidElement(Component, renderedElement);\n      !(inst === null || inst === false || React.isValidElement(inst)) ?  true ? invariant(false, '%s(...): A valid React element (or null) must be returned. You may have returned undefined, an array or some other invalid object.', Component.displayName || Component.name || 'Component') : _prodInvariant('105', Component.displayName || Component.name || 'Component') : void 0;\n      inst = new StatelessComponent(Component);\n      this._compositeType = CompositeTypes.StatelessFunctional;\n    } else {\n      if (isPureComponent(Component)) {\n        this._compositeType = CompositeTypes.PureClass;\n      } else {\n        this._compositeType = CompositeTypes.ImpureClass;\n      }\n    }\n\n    if (true) {\n      // This will throw later in _renderValidatedComponent, but add an early\n      // warning now to help debugging\n      if (inst.render == null) {\n         true ? warning(false, '%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', Component.displayName || Component.name || 'Component') : void 0;\n      }\n\n      var propsMutated = inst.props !== publicProps;\n      var componentName = Component.displayName || Component.name || 'Component';\n\n       true ? warning(inst.props === undefined || !propsMutated, '%s(...): When calling super() in `%s`, make sure to pass ' + 'up the same props that your component\\'s constructor was passed.', componentName, componentName) : void 0;\n    }\n\n    // These should be set up in the constructor, but as a convenience for\n    // simpler class abstractions, we set them up after the fact.\n    inst.props = publicProps;\n    inst.context = publicContext;\n    inst.refs = emptyObject;\n    inst.updater = updateQueue;\n\n    this._instance = inst;\n\n    // Store a reference from the instance back to the internal representation\n    ReactInstanceMap.set(inst, this);\n\n    if (true) {\n      // Since plain JS classes are defined without any special initialization\n      // logic, we can not catch common errors early. Therefore, we have to\n      // catch them here, at initialization time, instead.\n       true ? warning(!inst.getInitialState || inst.getInitialState.isReactClassApproved || inst.state, 'getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', this.getName() || 'a component') : void 0;\n       true ? warning(!inst.getDefaultProps || inst.getDefaultProps.isReactClassApproved, 'getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', this.getName() || 'a component') : void 0;\n       true ? warning(!inst.propTypes, 'propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', this.getName() || 'a component') : void 0;\n       true ? warning(!inst.contextTypes, 'contextTypes was defined as an instance property on %s. Use a ' + 'static property to define contextTypes instead.', this.getName() || 'a component') : void 0;\n       true ? warning(typeof inst.componentShouldUpdate !== 'function', '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', this.getName() || 'A component') : void 0;\n       true ? warning(typeof inst.componentDidUnmount !== 'function', '%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', this.getName() || 'A component') : void 0;\n       true ? warning(typeof inst.componentWillRecieveProps !== 'function', '%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', this.getName() || 'A component') : void 0;\n    }\n\n    var initialState = inst.state;\n    if (initialState === undefined) {\n      inst.state = initialState = null;\n    }\n    !(typeof initialState === 'object' && !Array.isArray(initialState)) ?  true ? invariant(false, '%s.state: must be set to an object or null', this.getName() || 'ReactCompositeComponent') : _prodInvariant('106', this.getName() || 'ReactCompositeComponent') : void 0;\n\n    this._pendingStateQueue = null;\n    this._pendingReplaceState = false;\n    this._pendingForceUpdate = false;\n\n    var markup;\n    if (inst.unstable_handleError) {\n      markup = this.performInitialMountWithErrorHandling(renderedElement, hostParent, hostContainerInfo, transaction, context);\n    } else {\n      markup = this.performInitialMount(renderedElement, hostParent, hostContainerInfo, transaction, context);\n    }\n\n    if (inst.componentDidMount) {\n      if (true) {\n        transaction.getReactMountReady().enqueue(function () {\n          measureLifeCyclePerf(function () {\n            return inst.componentDidMount();\n          }, _this._debugID, 'componentDidMount');\n        });\n      } else {\n        transaction.getReactMountReady().enqueue(inst.componentDidMount, inst);\n      }\n    }\n\n    return markup;\n  },\n\n  _constructComponent: function (doConstruct, publicProps, publicContext, updateQueue) {\n    if (true) {\n      ReactCurrentOwner.current = this;\n      try {\n        return this._constructComponentWithoutOwner(doConstruct, publicProps, publicContext, updateQueue);\n      } finally {\n        ReactCurrentOwner.current = null;\n      }\n    } else {\n      return this._constructComponentWithoutOwner(doConstruct, publicProps, publicContext, updateQueue);\n    }\n  },\n\n  _constructComponentWithoutOwner: function (doConstruct, publicProps, publicContext, updateQueue) {\n    var Component = this._currentElement.type;\n\n    if (doConstruct) {\n      if (true) {\n        return measureLifeCyclePerf(function () {\n          return new Component(publicProps, publicContext, updateQueue);\n        }, this._debugID, 'ctor');\n      } else {\n        return new Component(publicProps, publicContext, updateQueue);\n      }\n    }\n\n    // This can still be an instance in case of factory components\n    // but we'll count this as time spent rendering as the more common case.\n    if (true) {\n      return measureLifeCyclePerf(function () {\n        return Component(publicProps, publicContext, updateQueue);\n      }, this._debugID, 'render');\n    } else {\n      return Component(publicProps, publicContext, updateQueue);\n    }\n  },\n\n  performInitialMountWithErrorHandling: function (renderedElement, hostParent, hostContainerInfo, transaction, context) {\n    var markup;\n    var checkpoint = transaction.checkpoint();\n    try {\n      markup = this.performInitialMount(renderedElement, hostParent, hostContainerInfo, transaction, context);\n    } catch (e) {\n      // Roll back to checkpoint, handle error (which may add items to the transaction), and take a new checkpoint\n      transaction.rollback(checkpoint);\n      this._instance.unstable_handleError(e);\n      if (this._pendingStateQueue) {\n        this._instance.state = this._processPendingState(this._instance.props, this._instance.context);\n      }\n      checkpoint = transaction.checkpoint();\n\n      this._renderedComponent.unmountComponent(true);\n      transaction.rollback(checkpoint);\n\n      // Try again - we've informed the component about the error, so they can render an error message this time.\n      // If this throws again, the error will bubble up (and can be caught by a higher error boundary).\n      markup = this.performInitialMount(renderedElement, hostParent, hostContainerInfo, transaction, context);\n    }\n    return markup;\n  },\n\n  performInitialMount: function (renderedElement, hostParent, hostContainerInfo, transaction, context) {\n    var inst = this._instance;\n\n    var debugID = 0;\n    if (true) {\n      debugID = this._debugID;\n    }\n\n    if (inst.componentWillMount) {\n      if (true) {\n        measureLifeCyclePerf(function () {\n          return inst.componentWillMount();\n        }, debugID, 'componentWillMount');\n      } else {\n        inst.componentWillMount();\n      }\n      // When mounting, calls to `setState` by `componentWillMount` will set\n      // `this._pendingStateQueue` without triggering a re-render.\n      if (this._pendingStateQueue) {\n        inst.state = this._processPendingState(inst.props, inst.context);\n      }\n    }\n\n    // If not a stateless component, we now render\n    if (renderedElement === undefined) {\n      renderedElement = this._renderValidatedComponent();\n    }\n\n    var nodeType = ReactNodeTypes.getType(renderedElement);\n    this._renderedNodeType = nodeType;\n    var child = this._instantiateReactComponent(renderedElement, nodeType !== ReactNodeTypes.EMPTY /* shouldHaveDebugID */\n    );\n    this._renderedComponent = child;\n\n    var markup = ReactReconciler.mountComponent(child, transaction, hostParent, hostContainerInfo, this._processChildContext(context), debugID);\n\n    if (true) {\n      if (debugID !== 0) {\n        var childDebugIDs = child._debugID !== 0 ? [child._debugID] : [];\n        ReactInstrumentation.debugTool.onSetChildren(debugID, childDebugIDs);\n      }\n    }\n\n    return markup;\n  },\n\n  getHostNode: function () {\n    return ReactReconciler.getHostNode(this._renderedComponent);\n  },\n\n  /**\n   * Releases any resources allocated by `mountComponent`.\n   *\n   * @final\n   * @internal\n   */\n  unmountComponent: function (safely) {\n    if (!this._renderedComponent) {\n      return;\n    }\n\n    var inst = this._instance;\n\n    if (inst.componentWillUnmount && !inst._calledComponentWillUnmount) {\n      inst._calledComponentWillUnmount = true;\n\n      if (safely) {\n        var name = this.getName() + '.componentWillUnmount()';\n        ReactErrorUtils.invokeGuardedCallback(name, inst.componentWillUnmount.bind(inst));\n      } else {\n        if (true) {\n          measureLifeCyclePerf(function () {\n            return inst.componentWillUnmount();\n          }, this._debugID, 'componentWillUnmount');\n        } else {\n          inst.componentWillUnmount();\n        }\n      }\n    }\n\n    if (this._renderedComponent) {\n      ReactReconciler.unmountComponent(this._renderedComponent, safely);\n      this._renderedNodeType = null;\n      this._renderedComponent = null;\n      this._instance = null;\n    }\n\n    // Reset pending fields\n    // Even if this component is scheduled for another update in ReactUpdates,\n    // it would still be ignored because these fields are reset.\n    this._pendingStateQueue = null;\n    this._pendingReplaceState = false;\n    this._pendingForceUpdate = false;\n    this._pendingCallbacks = null;\n    this._pendingElement = null;\n\n    // These fields do not really need to be reset since this object is no\n    // longer accessible.\n    this._context = null;\n    this._rootNodeID = 0;\n    this._topLevelWrapper = null;\n\n    // Delete the reference from the instance to this internal representation\n    // which allow the internals to be properly cleaned up even if the user\n    // leaks a reference to the public instance.\n    ReactInstanceMap.remove(inst);\n\n    // Some existing components rely on inst.props even after they've been\n    // destroyed (in event handlers).\n    // TODO: inst.props = null;\n    // TODO: inst.state = null;\n    // TODO: inst.context = null;\n  },\n\n  /**\n   * Filters the context object to only contain keys specified in\n   * `contextTypes`\n   *\n   * @param {object} context\n   * @return {?object}\n   * @private\n   */\n  _maskContext: function (context) {\n    var Component = this._currentElement.type;\n    var contextTypes = Component.contextTypes;\n    if (!contextTypes) {\n      return emptyObject;\n    }\n    var maskedContext = {};\n    for (var contextName in contextTypes) {\n      maskedContext[contextName] = context[contextName];\n    }\n    return maskedContext;\n  },\n\n  /**\n   * Filters the context object to only contain keys specified in\n   * `contextTypes`, and asserts that they are valid.\n   *\n   * @param {object} context\n   * @return {?object}\n   * @private\n   */\n  _processContext: function (context) {\n    var maskedContext = this._maskContext(context);\n    if (true) {\n      var Component = this._currentElement.type;\n      if (Component.contextTypes) {\n        this._checkContextTypes(Component.contextTypes, maskedContext, 'context');\n      }\n    }\n    return maskedContext;\n  },\n\n  /**\n   * @param {object} currentContext\n   * @return {object}\n   * @private\n   */\n  _processChildContext: function (currentContext) {\n    var Component = this._currentElement.type;\n    var inst = this._instance;\n    var childContext;\n\n    if (inst.getChildContext) {\n      if (true) {\n        ReactInstrumentation.debugTool.onBeginProcessingChildContext();\n        try {\n          childContext = inst.getChildContext();\n        } finally {\n          ReactInstrumentation.debugTool.onEndProcessingChildContext();\n        }\n      } else {\n        childContext = inst.getChildContext();\n      }\n    }\n\n    if (childContext) {\n      !(typeof Component.childContextTypes === 'object') ?  true ? invariant(false, '%s.getChildContext(): childContextTypes must be defined in order to use getChildContext().', this.getName() || 'ReactCompositeComponent') : _prodInvariant('107', this.getName() || 'ReactCompositeComponent') : void 0;\n      if (true) {\n        this._checkContextTypes(Component.childContextTypes, childContext, 'childContext');\n      }\n      for (var name in childContext) {\n        !(name in Component.childContextTypes) ?  true ? invariant(false, '%s.getChildContext(): key \"%s\" is not defined in childContextTypes.', this.getName() || 'ReactCompositeComponent', name) : _prodInvariant('108', this.getName() || 'ReactCompositeComponent', name) : void 0;\n      }\n      return _assign({}, currentContext, childContext);\n    }\n    return currentContext;\n  },\n\n  /**\n   * Assert that the context types are valid\n   *\n   * @param {object} typeSpecs Map of context field to a ReactPropType\n   * @param {object} values Runtime values that need to be type-checked\n   * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n   * @private\n   */\n  _checkContextTypes: function (typeSpecs, values, location) {\n    if (true) {\n      checkReactTypeSpec(typeSpecs, values, location, this.getName(), null, this._debugID);\n    }\n  },\n\n  receiveComponent: function (nextElement, transaction, nextContext) {\n    var prevElement = this._currentElement;\n    var prevContext = this._context;\n\n    this._pendingElement = null;\n\n    this.updateComponent(transaction, prevElement, nextElement, prevContext, nextContext);\n  },\n\n  /**\n   * If any of `_pendingElement`, `_pendingStateQueue`, or `_pendingForceUpdate`\n   * is set, update the component.\n   *\n   * @param {ReactReconcileTransaction} transaction\n   * @internal\n   */\n  performUpdateIfNecessary: function (transaction) {\n    if (this._pendingElement != null) {\n      ReactReconciler.receiveComponent(this, this._pendingElement, transaction, this._context);\n    } else if (this._pendingStateQueue !== null || this._pendingForceUpdate) {\n      this.updateComponent(transaction, this._currentElement, this._currentElement, this._context, this._context);\n    } else {\n      this._updateBatchNumber = null;\n    }\n  },\n\n  /**\n   * Perform an update to a mounted component. The componentWillReceiveProps and\n   * shouldComponentUpdate methods are called, then (assuming the update isn't\n   * skipped) the remaining update lifecycle methods are called and the DOM\n   * representation is updated.\n   *\n   * By default, this implements React's rendering and reconciliation algorithm.\n   * Sophisticated clients may wish to override this.\n   *\n   * @param {ReactReconcileTransaction} transaction\n   * @param {ReactElement} prevParentElement\n   * @param {ReactElement} nextParentElement\n   * @internal\n   * @overridable\n   */\n  updateComponent: function (transaction, prevParentElement, nextParentElement, prevUnmaskedContext, nextUnmaskedContext) {\n    var inst = this._instance;\n    !(inst != null) ?  true ? invariant(false, 'Attempted to update component `%s` that has already been unmounted (or failed to mount).', this.getName() || 'ReactCompositeComponent') : _prodInvariant('136', this.getName() || 'ReactCompositeComponent') : void 0;\n\n    var willReceive = false;\n    var nextContext;\n\n    // Determine if the context has changed or not\n    if (this._context === nextUnmaskedContext) {\n      nextContext = inst.context;\n    } else {\n      nextContext = this._processContext(nextUnmaskedContext);\n      willReceive = true;\n    }\n\n    var prevProps = prevParentElement.props;\n    var nextProps = nextParentElement.props;\n\n    // Not a simple state update but a props update\n    if (prevParentElement !== nextParentElement) {\n      willReceive = true;\n    }\n\n    // An update here will schedule an update but immediately set\n    // _pendingStateQueue which will ensure that any state updates gets\n    // immediately reconciled instead of waiting for the next batch.\n    if (willReceive && inst.componentWillReceiveProps) {\n      if (true) {\n        measureLifeCyclePerf(function () {\n          return inst.componentWillReceiveProps(nextProps, nextContext);\n        }, this._debugID, 'componentWillReceiveProps');\n      } else {\n        inst.componentWillReceiveProps(nextProps, nextContext);\n      }\n    }\n\n    var nextState = this._processPendingState(nextProps, nextContext);\n    var shouldUpdate = true;\n\n    if (!this._pendingForceUpdate) {\n      if (inst.shouldComponentUpdate) {\n        if (true) {\n          shouldUpdate = measureLifeCyclePerf(function () {\n            return inst.shouldComponentUpdate(nextProps, nextState, nextContext);\n          }, this._debugID, 'shouldComponentUpdate');\n        } else {\n          shouldUpdate = inst.shouldComponentUpdate(nextProps, nextState, nextContext);\n        }\n      } else {\n        if (this._compositeType === CompositeTypes.PureClass) {\n          shouldUpdate = !shallowEqual(prevProps, nextProps) || !shallowEqual(inst.state, nextState);\n        }\n      }\n    }\n\n    if (true) {\n       true ? warning(shouldUpdate !== undefined, '%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', this.getName() || 'ReactCompositeComponent') : void 0;\n    }\n\n    this._updateBatchNumber = null;\n    if (shouldUpdate) {\n      this._pendingForceUpdate = false;\n      // Will set `this.props`, `this.state` and `this.context`.\n      this._performComponentUpdate(nextParentElement, nextProps, nextState, nextContext, transaction, nextUnmaskedContext);\n    } else {\n      // If it's determined that a component should not update, we still want\n      // to set props and state but we shortcut the rest of the update.\n      this._currentElement = nextParentElement;\n      this._context = nextUnmaskedContext;\n      inst.props = nextProps;\n      inst.state = nextState;\n      inst.context = nextContext;\n    }\n  },\n\n  _processPendingState: function (props, context) {\n    var inst = this._instance;\n    var queue = this._pendingStateQueue;\n    var replace = this._pendingReplaceState;\n    this._pendingReplaceState = false;\n    this._pendingStateQueue = null;\n\n    if (!queue) {\n      return inst.state;\n    }\n\n    if (replace && queue.length === 1) {\n      return queue[0];\n    }\n\n    var nextState = _assign({}, replace ? queue[0] : inst.state);\n    for (var i = replace ? 1 : 0; i < queue.length; i++) {\n      var partial = queue[i];\n      _assign(nextState, typeof partial === 'function' ? partial.call(inst, nextState, props, context) : partial);\n    }\n\n    return nextState;\n  },\n\n  /**\n   * Merges new props and state, notifies delegate methods of update and\n   * performs update.\n   *\n   * @param {ReactElement} nextElement Next element\n   * @param {object} nextProps Next public object to set as properties.\n   * @param {?object} nextState Next object to set as state.\n   * @param {?object} nextContext Next public object to set as context.\n   * @param {ReactReconcileTransaction} transaction\n   * @param {?object} unmaskedContext\n   * @private\n   */\n  _performComponentUpdate: function (nextElement, nextProps, nextState, nextContext, transaction, unmaskedContext) {\n    var _this2 = this;\n\n    var inst = this._instance;\n\n    var hasComponentDidUpdate = Boolean(inst.componentDidUpdate);\n    var prevProps;\n    var prevState;\n    var prevContext;\n    if (hasComponentDidUpdate) {\n      prevProps = inst.props;\n      prevState = inst.state;\n      prevContext = inst.context;\n    }\n\n    if (inst.componentWillUpdate) {\n      if (true) {\n        measureLifeCyclePerf(function () {\n          return inst.componentWillUpdate(nextProps, nextState, nextContext);\n        }, this._debugID, 'componentWillUpdate');\n      } else {\n        inst.componentWillUpdate(nextProps, nextState, nextContext);\n      }\n    }\n\n    this._currentElement = nextElement;\n    this._context = unmaskedContext;\n    inst.props = nextProps;\n    inst.state = nextState;\n    inst.context = nextContext;\n\n    this._updateRenderedComponent(transaction, unmaskedContext);\n\n    if (hasComponentDidUpdate) {\n      if (true) {\n        transaction.getReactMountReady().enqueue(function () {\n          measureLifeCyclePerf(inst.componentDidUpdate.bind(inst, prevProps, prevState, prevContext), _this2._debugID, 'componentDidUpdate');\n        });\n      } else {\n        transaction.getReactMountReady().enqueue(inst.componentDidUpdate.bind(inst, prevProps, prevState, prevContext), inst);\n      }\n    }\n  },\n\n  /**\n   * Call the component's `render` method and update the DOM accordingly.\n   *\n   * @param {ReactReconcileTransaction} transaction\n   * @internal\n   */\n  _updateRenderedComponent: function (transaction, context) {\n    var prevComponentInstance = this._renderedComponent;\n    var prevRenderedElement = prevComponentInstance._currentElement;\n    var nextRenderedElement = this._renderValidatedComponent();\n\n    var debugID = 0;\n    if (true) {\n      debugID = this._debugID;\n    }\n\n    if (shouldUpdateReactComponent(prevRenderedElement, nextRenderedElement)) {\n      ReactReconciler.receiveComponent(prevComponentInstance, nextRenderedElement, transaction, this._processChildContext(context));\n    } else {\n      var oldHostNode = ReactReconciler.getHostNode(prevComponentInstance);\n      ReactReconciler.unmountComponent(prevComponentInstance, false);\n\n      var nodeType = ReactNodeTypes.getType(nextRenderedElement);\n      this._renderedNodeType = nodeType;\n      var child = this._instantiateReactComponent(nextRenderedElement, nodeType !== ReactNodeTypes.EMPTY /* shouldHaveDebugID */\n      );\n      this._renderedComponent = child;\n\n      var nextMarkup = ReactReconciler.mountComponent(child, transaction, this._hostParent, this._hostContainerInfo, this._processChildContext(context), debugID);\n\n      if (true) {\n        if (debugID !== 0) {\n          var childDebugIDs = child._debugID !== 0 ? [child._debugID] : [];\n          ReactInstrumentation.debugTool.onSetChildren(debugID, childDebugIDs);\n        }\n      }\n\n      this._replaceNodeWithMarkup(oldHostNode, nextMarkup, prevComponentInstance);\n    }\n  },\n\n  /**\n   * Overridden in shallow rendering.\n   *\n   * @protected\n   */\n  _replaceNodeWithMarkup: function (oldHostNode, nextMarkup, prevInstance) {\n    ReactComponentEnvironment.replaceNodeWithMarkup(oldHostNode, nextMarkup, prevInstance);\n  },\n\n  /**\n   * @protected\n   */\n  _renderValidatedComponentWithoutOwnerOrContext: function () {\n    var inst = this._instance;\n    var renderedElement;\n\n    if (true) {\n      renderedElement = measureLifeCyclePerf(function () {\n        return inst.render();\n      }, this._debugID, 'render');\n    } else {\n      renderedElement = inst.render();\n    }\n\n    if (true) {\n      // We allow auto-mocks to proceed as if they're returning null.\n      if (renderedElement === undefined && inst.render._isMockFunction) {\n        // This is probably bad practice. Consider warning here and\n        // deprecating this convenience.\n        renderedElement = null;\n      }\n    }\n\n    return renderedElement;\n  },\n\n  /**\n   * @private\n   */\n  _renderValidatedComponent: function () {\n    var renderedElement;\n    if (true) {\n      ReactCurrentOwner.current = this;\n      try {\n        renderedElement = this._renderValidatedComponentWithoutOwnerOrContext();\n      } finally {\n        ReactCurrentOwner.current = null;\n      }\n    } else {\n      renderedElement = this._renderValidatedComponentWithoutOwnerOrContext();\n    }\n    !(\n    // TODO: An `isValidNode` function would probably be more appropriate\n    renderedElement === null || renderedElement === false || React.isValidElement(renderedElement)) ?  true ? invariant(false, '%s.render(): A valid React element (or null) must be returned. You may have returned undefined, an array or some other invalid object.', this.getName() || 'ReactCompositeComponent') : _prodInvariant('109', this.getName() || 'ReactCompositeComponent') : void 0;\n\n    return renderedElement;\n  },\n\n  /**\n   * Lazily allocates the refs object and stores `component` as `ref`.\n   *\n   * @param {string} ref Reference name.\n   * @param {component} component Component to store as `ref`.\n   * @final\n   * @private\n   */\n  attachRef: function (ref, component) {\n    var inst = this.getPublicInstance();\n    !(inst != null) ?  true ? invariant(false, 'Stateless function components cannot have refs.') : _prodInvariant('110') : void 0;\n    var publicComponentInstance = component.getPublicInstance();\n    if (true) {\n      var componentName = component && component.getName ? component.getName() : 'a component';\n       true ? warning(publicComponentInstance != null || component._compositeType !== CompositeTypes.StatelessFunctional, 'Stateless function components cannot be given refs ' + '(See ref \"%s\" in %s created by %s). ' + 'Attempts to access this ref will fail.', ref, componentName, this.getName()) : void 0;\n    }\n    var refs = inst.refs === emptyObject ? inst.refs = {} : inst.refs;\n    refs[ref] = publicComponentInstance;\n  },\n\n  /**\n   * Detaches a reference name.\n   *\n   * @param {string} ref Name to dereference.\n   * @final\n   * @private\n   */\n  detachRef: function (ref) {\n    var refs = this.getPublicInstance().refs;\n    delete refs[ref];\n  },\n\n  /**\n   * Get a text description of the component that can be used to identify it\n   * in error messages.\n   * @return {string} The name or null.\n   * @internal\n   */\n  getName: function () {\n    var type = this._currentElement.type;\n    var constructor = this._instance && this._instance.constructor;\n    return type.displayName || constructor && constructor.displayName || type.name || constructor && constructor.name || null;\n  },\n\n  /**\n   * Get the publicly accessible representation of this component - i.e. what\n   * is exposed by refs and returned by render. Can be null for stateless\n   * components.\n   *\n   * @return {ReactComponent} the public component instance.\n   * @internal\n   */\n  getPublicInstance: function () {\n    var inst = this._instance;\n    if (this._compositeType === CompositeTypes.StatelessFunctional) {\n      return null;\n    }\n    return inst;\n  },\n\n  // Stub\n  _instantiateReactComponent: null\n\n};\n\nmodule.exports = ReactCompositeComponent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjkyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50JyksXG4gICAgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Jyk7XG52YXIgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCA9IHJlcXVpcmUoJy4vUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCcpO1xudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q3VycmVudE93bmVyJyk7XG52YXIgUmVhY3RFcnJvclV0aWxzID0gcmVxdWlyZSgnLi9SZWFjdEVycm9yVXRpbHMnKTtcbnZhciBSZWFjdEluc3RhbmNlTWFwID0gcmVxdWlyZSgnLi9SZWFjdEluc3RhbmNlTWFwJyk7XG52YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSByZXF1aXJlKCcuL1JlYWN0SW5zdHJ1bWVudGF0aW9uJyk7XG52YXIgUmVhY3ROb2RlVHlwZXMgPSByZXF1aXJlKCcuL1JlYWN0Tm9kZVR5cGVzJyk7XG52YXIgUmVhY3RSZWNvbmNpbGVyID0gcmVxdWlyZSgnLi9SZWFjdFJlY29uY2lsZXInKTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIGNoZWNrUmVhY3RUeXBlU3BlYyA9IHJlcXVpcmUoJy4vY2hlY2tSZWFjdFR5cGVTcGVjJyk7XG59XG5cbnZhciBlbXB0eU9iamVjdCA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5T2JqZWN0Jyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgc2hhbGxvd0VxdWFsID0gcmVxdWlyZSgnZmJqcy9saWIvc2hhbGxvd0VxdWFsJyk7XG52YXIgc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQgPSByZXF1aXJlKCcuL3Nob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIENvbXBvc2l0ZVR5cGVzID0ge1xuICBJbXB1cmVDbGFzczogMCxcbiAgUHVyZUNsYXNzOiAxLFxuICBTdGF0ZWxlc3NGdW5jdGlvbmFsOiAyXG59O1xuXG5mdW5jdGlvbiBTdGF0ZWxlc3NDb21wb25lbnQoQ29tcG9uZW50KSB7fVxuU3RhdGVsZXNzQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBDb21wb25lbnQgPSBSZWFjdEluc3RhbmNlTWFwLmdldCh0aGlzKS5fY3VycmVudEVsZW1lbnQudHlwZTtcbiAgdmFyIGVsZW1lbnQgPSBDb21wb25lbnQodGhpcy5wcm9wcywgdGhpcy5jb250ZXh0LCB0aGlzLnVwZGF0ZXIpO1xuICB3YXJuSWZJbnZhbGlkRWxlbWVudChDb21wb25lbnQsIGVsZW1lbnQpO1xuICByZXR1cm4gZWxlbWVudDtcbn07XG5cbmZ1bmN0aW9uIHdhcm5JZkludmFsaWRFbGVtZW50KENvbXBvbmVudCwgZWxlbWVudCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGVsZW1lbnQgPT09IG51bGwgfHwgZWxlbWVudCA9PT0gZmFsc2UgfHwgUmVhY3QuaXNWYWxpZEVsZW1lbnQoZWxlbWVudCksICclcyguLi4pOiBBIHZhbGlkIFJlYWN0IGVsZW1lbnQgKG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQuIFlvdSBtYXkgaGF2ZSAnICsgJ3JldHVybmVkIHVuZGVmaW5lZCwgYW4gYXJyYXkgb3Igc29tZSBvdGhlciBpbnZhbGlkIG9iamVjdC4nLCBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFDb21wb25lbnQuY2hpbGRDb250ZXh0VHlwZXMsICclcyguLi4pOiBjaGlsZENvbnRleHRUeXBlcyBjYW5ub3QgYmUgZGVmaW5lZCBvbiBhIGZ1bmN0aW9uYWwgY29tcG9uZW50LicsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JykgOiB2b2lkIDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkge1xuICByZXR1cm4gISEoQ29tcG9uZW50LnByb3RvdHlwZSAmJiBDb21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBpc1B1cmVDb21wb25lbnQoQ29tcG9uZW50KSB7XG4gIHJldHVybiAhIShDb21wb25lbnQucHJvdG90eXBlICYmIENvbXBvbmVudC5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQpO1xufVxuXG4vLyBTZXBhcmF0ZWQgaW50byBhIGZ1bmN0aW9uIHRvIGNvbnRhaW4gZGVvcHRpbWl6YXRpb25zIGNhdXNlZCBieSB0cnkvZmluYWxseS5cbmZ1bmN0aW9uIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZuLCBkZWJ1Z0lELCB0aW1lclR5cGUpIHtcbiAgaWYgKGRlYnVnSUQgPT09IDApIHtcbiAgICAvLyBUb3AtbGV2ZWwgd3JhcHBlcnMgKHNlZSBSZWFjdE1vdW50KSBhbmQgZW1wdHkgY29tcG9uZW50cyAoc2VlXG4gICAgLy8gUmVhY3RET01FbXB0eUNvbXBvbmVudCkgYXJlIGludmlzaWJsZSB0byBob29rcyBhbmQgZGV2dG9vbHMuXG4gICAgLy8gQm90aCBhcmUgaW1wbGVtZW50YXRpb24gZGV0YWlscyB0aGF0IHNob3VsZCBnbyBhd2F5IGluIHRoZSBmdXR1cmUuXG4gICAgcmV0dXJuIGZuKCk7XG4gIH1cblxuICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWdpbkxpZmVDeWNsZVRpbWVyKGRlYnVnSUQsIHRpbWVyVHlwZSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uRW5kTGlmZUN5Y2xlVGltZXIoZGVidWdJRCwgdGltZXJUeXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLSBUaGUgTGlmZS1DeWNsZSBvZiBhIENvbXBvc2l0ZSBDb21wb25lbnQgLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogLSBjb25zdHJ1Y3RvcjogSW5pdGlhbGl6YXRpb24gb2Ygc3RhdGUuIFRoZSBpbnN0YW5jZSBpcyBub3cgcmV0YWluZWQuXG4gKiAgIC0gY29tcG9uZW50V2lsbE1vdW50XG4gKiAgIC0gcmVuZGVyXG4gKiAgIC0gW2NoaWxkcmVuJ3MgY29uc3RydWN0b3JzXVxuICogICAgIC0gW2NoaWxkcmVuJ3MgY29tcG9uZW50V2lsbE1vdW50IGFuZCByZW5kZXJdXG4gKiAgICAgLSBbY2hpbGRyZW4ncyBjb21wb25lbnREaWRNb3VudF1cbiAqICAgICAtIGNvbXBvbmVudERpZE1vdW50XG4gKlxuICogICAgICAgVXBkYXRlIFBoYXNlczpcbiAqICAgICAgIC0gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAob25seSBjYWxsZWQgaWYgcGFyZW50IHVwZGF0ZWQpXG4gKiAgICAgICAtIHNob3VsZENvbXBvbmVudFVwZGF0ZVxuICogICAgICAgICAtIGNvbXBvbmVudFdpbGxVcGRhdGVcbiAqICAgICAgICAgICAtIHJlbmRlclxuICogICAgICAgICAgIC0gW2NoaWxkcmVuJ3MgY29uc3RydWN0b3JzIG9yIHJlY2VpdmUgcHJvcHMgcGhhc2VzXVxuICogICAgICAgICAtIGNvbXBvbmVudERpZFVwZGF0ZVxuICpcbiAqICAgICAtIGNvbXBvbmVudFdpbGxVbm1vdW50XG4gKiAgICAgLSBbY2hpbGRyZW4ncyBjb21wb25lbnRXaWxsVW5tb3VudF1cbiAqICAgLSBbY2hpbGRyZW4gZGVzdHJveWVkXVxuICogLSAoZGVzdHJveWVkKTogVGhlIGluc3RhbmNlIGlzIG5vdyBibGFuaywgcmVsZWFzZWQgYnkgUmVhY3QgYW5kIHJlYWR5IGZvciBHQy5cbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbi8qKlxuICogQW4gaW5jcmVtZW50aW5nIElEIGFzc2lnbmVkIHRvIGVhY2ggY29tcG9uZW50IHdoZW4gaXQgaXMgbW91bnRlZC4gVGhpcyBpc1xuICogdXNlZCB0byBlbmZvcmNlIHRoZSBvcmRlciBpbiB3aGljaCBgUmVhY3RVcGRhdGVzYCB1cGRhdGVzIGRpcnR5IGNvbXBvbmVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xudmFyIG5leHRNb3VudElEID0gMTtcblxuLyoqXG4gKiBAbGVuZHMge1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50LnByb3RvdHlwZX1cbiAqL1xudmFyIFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50ID0ge1xuXG4gIC8qKlxuICAgKiBCYXNlIGNvbnN0cnVjdG9yIGZvciBhbGwgY29tcG9zaXRlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQGZpbmFsXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgY29uc3RydWN0OiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLl9yb290Tm9kZUlEID0gMDtcbiAgICB0aGlzLl9jb21wb3NpdGVUeXBlID0gbnVsbDtcbiAgICB0aGlzLl9pbnN0YW5jZSA9IG51bGw7XG4gICAgdGhpcy5faG9zdFBhcmVudCA9IG51bGw7XG4gICAgdGhpcy5faG9zdENvbnRhaW5lckluZm8gPSBudWxsO1xuXG4gICAgLy8gU2VlIFJlYWN0VXBkYXRlUXVldWVcbiAgICB0aGlzLl91cGRhdGVCYXRjaE51bWJlciA9IG51bGw7XG4gICAgdGhpcy5fcGVuZGluZ0VsZW1lbnQgPSBudWxsO1xuICAgIHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlID0gbnVsbDtcbiAgICB0aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlID0gZmFsc2U7XG4gICAgdGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRlID0gZmFsc2U7XG5cbiAgICB0aGlzLl9yZW5kZXJlZE5vZGVUeXBlID0gbnVsbDtcbiAgICB0aGlzLl9yZW5kZXJlZENvbXBvbmVudCA9IG51bGw7XG4gICAgdGhpcy5fY29udGV4dCA9IG51bGw7XG4gICAgdGhpcy5fbW91bnRPcmRlciA9IDA7XG4gICAgdGhpcy5fdG9wTGV2ZWxXcmFwcGVyID0gbnVsbDtcblxuICAgIC8vIFNlZSBSZWFjdFVwZGF0ZXMgYW5kIFJlYWN0VXBkYXRlUXVldWUuXG4gICAgdGhpcy5fcGVuZGluZ0NhbGxiYWNrcyA9IG51bGw7XG5cbiAgICAvLyBDb21wb25lbnRXaWxsVW5tb3VudCBzaGFsbCBvbmx5IGJlIGNhbGxlZCBvbmNlXG4gICAgdGhpcy5fY2FsbGVkQ29tcG9uZW50V2lsbFVubW91bnQgPSBmYWxzZTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB0aGlzLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IGZhbHNlO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGNvbXBvbmVudCwgcmVuZGVycyBtYXJrdXAsIGFuZCByZWdpc3RlcnMgZXZlbnQgbGlzdGVuZXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb258UmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHs/b2JqZWN0fSBob3N0UGFyZW50XG4gICAqIEBwYXJhbSB7P29iamVjdH0gaG9zdENvbnRhaW5lckluZm9cbiAgICogQHBhcmFtIHs/b2JqZWN0fSBjb250ZXh0XG4gICAqIEByZXR1cm4gez9zdHJpbmd9IFJlbmRlcmVkIG1hcmt1cCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBET00uXG4gICAqIEBmaW5hbFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAodHJhbnNhY3Rpb24sIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCBjb250ZXh0KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICAgIHRoaXMuX21vdW50T3JkZXIgPSBuZXh0TW91bnRJRCsrO1xuICAgIHRoaXMuX2hvc3RQYXJlbnQgPSBob3N0UGFyZW50O1xuICAgIHRoaXMuX2hvc3RDb250YWluZXJJbmZvID0gaG9zdENvbnRhaW5lckluZm87XG5cbiAgICB2YXIgcHVibGljUHJvcHMgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcztcbiAgICB2YXIgcHVibGljQ29udGV4dCA9IHRoaXMuX3Byb2Nlc3NDb250ZXh0KGNvbnRleHQpO1xuXG4gICAgdmFyIENvbXBvbmVudCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7XG5cbiAgICB2YXIgdXBkYXRlUXVldWUgPSB0cmFuc2FjdGlvbi5nZXRVcGRhdGVRdWV1ZSgpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgcHVibGljIGNsYXNzXG4gICAgdmFyIGRvQ29uc3RydWN0ID0gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCk7XG4gICAgdmFyIGluc3QgPSB0aGlzLl9jb25zdHJ1Y3RDb21wb25lbnQoZG9Db25zdHJ1Y3QsIHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1ZSk7XG4gICAgdmFyIHJlbmRlcmVkRWxlbWVudDtcblxuICAgIC8vIFN1cHBvcnQgZnVuY3Rpb25hbCBjb21wb25lbnRzXG4gICAgaWYgKCFkb0NvbnN0cnVjdCAmJiAoaW5zdCA9PSBudWxsIHx8IGluc3QucmVuZGVyID09IG51bGwpKSB7XG4gICAgICByZW5kZXJlZEVsZW1lbnQgPSBpbnN0O1xuICAgICAgd2FybklmSW52YWxpZEVsZW1lbnQoQ29tcG9uZW50LCByZW5kZXJlZEVsZW1lbnQpO1xuICAgICAgIShpbnN0ID09PSBudWxsIHx8IGluc3QgPT09IGZhbHNlIHx8IFJlYWN0LmlzVmFsaWRFbGVtZW50KGluc3QpKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICclcyguLi4pOiBBIHZhbGlkIFJlYWN0IGVsZW1lbnQgKG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQuIFlvdSBtYXkgaGF2ZSByZXR1cm5lZCB1bmRlZmluZWQsIGFuIGFycmF5IG9yIHNvbWUgb3RoZXIgaW52YWxpZCBvYmplY3QuJywgQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnKSA6IF9wcm9kSW52YXJpYW50KCcxMDUnLCBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgaW5zdCA9IG5ldyBTdGF0ZWxlc3NDb21wb25lbnQoQ29tcG9uZW50KTtcbiAgICAgIHRoaXMuX2NvbXBvc2l0ZVR5cGUgPSBDb21wb3NpdGVUeXBlcy5TdGF0ZWxlc3NGdW5jdGlvbmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNQdXJlQ29tcG9uZW50KENvbXBvbmVudCkpIHtcbiAgICAgICAgdGhpcy5fY29tcG9zaXRlVHlwZSA9IENvbXBvc2l0ZVR5cGVzLlB1cmVDbGFzcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NvbXBvc2l0ZVR5cGUgPSBDb21wb3NpdGVUeXBlcy5JbXB1cmVDbGFzcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGxhdGVyIGluIF9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQsIGJ1dCBhZGQgYW4gZWFybHlcbiAgICAgIC8vIHdhcm5pbmcgbm93IHRvIGhlbHAgZGVidWdnaW5nXG4gICAgICBpZiAoaW5zdC5yZW5kZXIgPT0gbnVsbCkge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzKC4uLik6IE5vIGByZW5kZXJgIG1ldGhvZCBmb3VuZCBvbiB0aGUgcmV0dXJuZWQgY29tcG9uZW50ICcgKyAnaW5zdGFuY2U6IHlvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gZGVmaW5lIGByZW5kZXJgLicsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICB9XG5cbiAgICAgIHZhciBwcm9wc011dGF0ZWQgPSBpbnN0LnByb3BzICE9PSBwdWJsaWNQcm9wcztcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhpbnN0LnByb3BzID09PSB1bmRlZmluZWQgfHwgIXByb3BzTXV0YXRlZCwgJyVzKC4uLik6IFdoZW4gY2FsbGluZyBzdXBlcigpIGluIGAlc2AsIG1ha2Ugc3VyZSB0byBwYXNzICcgKyAndXAgdGhlIHNhbWUgcHJvcHMgdGhhdCB5b3VyIGNvbXBvbmVudFxcJ3MgY29uc3RydWN0b3Igd2FzIHBhc3NlZC4nLCBjb21wb25lbnROYW1lLCBjb21wb25lbnROYW1lKSA6IHZvaWQgMDtcbiAgICB9XG5cbiAgICAvLyBUaGVzZSBzaG91bGQgYmUgc2V0IHVwIGluIHRoZSBjb25zdHJ1Y3RvciwgYnV0IGFzIGEgY29udmVuaWVuY2UgZm9yXG4gICAgLy8gc2ltcGxlciBjbGFzcyBhYnN0cmFjdGlvbnMsIHdlIHNldCB0aGVtIHVwIGFmdGVyIHRoZSBmYWN0LlxuICAgIGluc3QucHJvcHMgPSBwdWJsaWNQcm9wcztcbiAgICBpbnN0LmNvbnRleHQgPSBwdWJsaWNDb250ZXh0O1xuICAgIGluc3QucmVmcyA9IGVtcHR5T2JqZWN0O1xuICAgIGluc3QudXBkYXRlciA9IHVwZGF0ZVF1ZXVlO1xuXG4gICAgdGhpcy5faW5zdGFuY2UgPSBpbnN0O1xuXG4gICAgLy8gU3RvcmUgYSByZWZlcmVuY2UgZnJvbSB0aGUgaW5zdGFuY2UgYmFjayB0byB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb25cbiAgICBSZWFjdEluc3RhbmNlTWFwLnNldChpbnN0LCB0aGlzKTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAvLyBTaW5jZSBwbGFpbiBKUyBjbGFzc2VzIGFyZSBkZWZpbmVkIHdpdGhvdXQgYW55IHNwZWNpYWwgaW5pdGlhbGl6YXRpb25cbiAgICAgIC8vIGxvZ2ljLCB3ZSBjYW4gbm90IGNhdGNoIGNvbW1vbiBlcnJvcnMgZWFybHkuIFRoZXJlZm9yZSwgd2UgaGF2ZSB0b1xuICAgICAgLy8gY2F0Y2ggdGhlbSBoZXJlLCBhdCBpbml0aWFsaXphdGlvbiB0aW1lLCBpbnN0ZWFkLlxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWluc3QuZ2V0SW5pdGlhbFN0YXRlIHx8IGluc3QuZ2V0SW5pdGlhbFN0YXRlLmlzUmVhY3RDbGFzc0FwcHJvdmVkIHx8IGluc3Quc3RhdGUsICdnZXRJbml0aWFsU3RhdGUgd2FzIGRlZmluZWQgb24gJXMsIGEgcGxhaW4gSmF2YVNjcmlwdCBjbGFzcy4gJyArICdUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBjbGFzc2VzIGNyZWF0ZWQgdXNpbmcgUmVhY3QuY3JlYXRlQ2xhc3MuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGRlZmluZSBhIHN0YXRlIHByb3BlcnR5IGluc3RlYWQ/JywgdGhpcy5nZXROYW1lKCkgfHwgJ2EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghaW5zdC5nZXREZWZhdWx0UHJvcHMgfHwgaW5zdC5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQsICdnZXREZWZhdWx0UHJvcHMgd2FzIGRlZmluZWQgb24gJXMsIGEgcGxhaW4gSmF2YVNjcmlwdCBjbGFzcy4gJyArICdUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBjbGFzc2VzIGNyZWF0ZWQgdXNpbmcgUmVhY3QuY3JlYXRlQ2xhc3MuICcgKyAnVXNlIGEgc3RhdGljIHByb3BlcnR5IHRvIGRlZmluZSBkZWZhdWx0UHJvcHMgaW5zdGVhZC4nLCB0aGlzLmdldE5hbWUoKSB8fCAnYSBjb21wb25lbnQnKSA6IHZvaWQgMDtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFpbnN0LnByb3BUeXBlcywgJ3Byb3BUeXBlcyB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIHByb3BUeXBlcyBpbnN0ZWFkLicsIHRoaXMuZ2V0TmFtZSgpIHx8ICdhIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWluc3QuY29udGV4dFR5cGVzLCAnY29udGV4dFR5cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSAnICsgJ3N0YXRpYyBwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5cGVzIGluc3RlYWQuJywgdGhpcy5nZXROYW1lKCkgfHwgJ2EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyh0eXBlb2YgaW5zdC5jb21wb25lbnRTaG91bGRVcGRhdGUgIT09ICdmdW5jdGlvbicsICclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50U2hvdWxkVXBkYXRlKCkuIERpZCB5b3UgbWVhbiBzaG91bGRDb21wb25lbnRVcGRhdGUoKT8gJyArICdUaGUgbmFtZSBpcyBwaHJhc2VkIGFzIGEgcXVlc3Rpb24gYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgJyArICdleHBlY3RlZCB0byByZXR1cm4gYSB2YWx1ZS4nLCB0aGlzLmdldE5hbWUoKSB8fCAnQSBjb21wb25lbnQnKSA6IHZvaWQgMDtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHR5cGVvZiBpbnN0LmNvbXBvbmVudERpZFVubW91bnQgIT09ICdmdW5jdGlvbicsICclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50RGlkVW5tb3VudCgpLiBCdXQgdGhlcmUgaXMgbm8gc3VjaCBsaWZlY3ljbGUgbWV0aG9kLiAnICsgJ0RpZCB5b3UgbWVhbiBjb21wb25lbnRXaWxsVW5tb3VudCgpPycsIHRoaXMuZ2V0TmFtZSgpIHx8ICdBIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcodHlwZW9mIGluc3QuY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyAhPT0gJ2Z1bmN0aW9uJywgJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzKCkuIERpZCB5b3UgbWVhbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/JywgdGhpcy5nZXROYW1lKCkgfHwgJ0EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgdmFyIGluaXRpYWxTdGF0ZSA9IGluc3Quc3RhdGU7XG4gICAgaWYgKGluaXRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpbnN0LnN0YXRlID0gaW5pdGlhbFN0YXRlID0gbnVsbDtcbiAgICB9XG4gICAgISh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShpbml0aWFsU3RhdGUpKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICclcy5zdGF0ZTogbXVzdCBiZSBzZXQgdG8gYW4gb2JqZWN0IG9yIG51bGwnLCB0aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IF9wcm9kSW52YXJpYW50KCcxMDYnLCB0aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IHZvaWQgMDtcblxuICAgIHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlID0gbnVsbDtcbiAgICB0aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlID0gZmFsc2U7XG4gICAgdGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRlID0gZmFsc2U7XG5cbiAgICB2YXIgbWFya3VwO1xuICAgIGlmIChpbnN0LnVuc3RhYmxlX2hhbmRsZUVycm9yKSB7XG4gICAgICBtYXJrdXAgPSB0aGlzLnBlcmZvcm1Jbml0aWFsTW91bnRXaXRoRXJyb3JIYW5kbGluZyhyZW5kZXJlZEVsZW1lbnQsIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hcmt1cCA9IHRoaXMucGVyZm9ybUluaXRpYWxNb3VudChyZW5kZXJlZEVsZW1lbnQsIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgaWYgKGluc3QuY29tcG9uZW50RGlkTW91bnQpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnN0LmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgICAgICAgfSwgX3RoaXMuX2RlYnVnSUQsICdjb21wb25lbnREaWRNb3VudCcpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoaW5zdC5jb21wb25lbnREaWRNb3VudCwgaW5zdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcmt1cDtcbiAgfSxcblxuICBfY29uc3RydWN0Q29tcG9uZW50OiBmdW5jdGlvbiAoZG9Db25zdHJ1Y3QsIHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1ZSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID0gdGhpcztcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25zdHJ1Y3RDb21wb25lbnRXaXRob3V0T3duZXIoZG9Db25zdHJ1Y3QsIHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbnN0cnVjdENvbXBvbmVudFdpdGhvdXRPd25lcihkb0NvbnN0cnVjdCwgcHVibGljUHJvcHMsIHB1YmxpY0NvbnRleHQsIHVwZGF0ZVF1ZXVlKTtcbiAgICB9XG4gIH0sXG5cbiAgX2NvbnN0cnVjdENvbXBvbmVudFdpdGhvdXRPd25lcjogZnVuY3Rpb24gKGRvQ29uc3RydWN0LCBwdWJsaWNQcm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRlUXVldWUpIHtcbiAgICB2YXIgQ29tcG9uZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTtcblxuICAgIGlmIChkb0NvbnN0cnVjdCkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudChwdWJsaWNQcm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRlUXVldWUpO1xuICAgICAgICB9LCB0aGlzLl9kZWJ1Z0lELCAnY3RvcicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnQocHVibGljUHJvcHMsIHB1YmxpY0NvbnRleHQsIHVwZGF0ZVF1ZXVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGlzIGNhbiBzdGlsbCBiZSBhbiBpbnN0YW5jZSBpbiBjYXNlIG9mIGZhY3RvcnkgY29tcG9uZW50c1xuICAgIC8vIGJ1dCB3ZSdsbCBjb3VudCB0aGlzIGFzIHRpbWUgc3BlbnQgcmVuZGVyaW5nIGFzIHRoZSBtb3JlIGNvbW1vbiBjYXNlLlxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICByZXR1cm4gbWVhc3VyZUxpZmVDeWNsZVBlcmYoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gQ29tcG9uZW50KHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1ZSk7XG4gICAgICB9LCB0aGlzLl9kZWJ1Z0lELCAncmVuZGVyJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBDb21wb25lbnQocHVibGljUHJvcHMsIHB1YmxpY0NvbnRleHQsIHVwZGF0ZVF1ZXVlKTtcbiAgICB9XG4gIH0sXG5cbiAgcGVyZm9ybUluaXRpYWxNb3VudFdpdGhFcnJvckhhbmRsaW5nOiBmdW5jdGlvbiAocmVuZGVyZWRFbGVtZW50LCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHtcbiAgICB2YXIgbWFya3VwO1xuICAgIHZhciBjaGVja3BvaW50ID0gdHJhbnNhY3Rpb24uY2hlY2twb2ludCgpO1xuICAgIHRyeSB7XG4gICAgICBtYXJrdXAgPSB0aGlzLnBlcmZvcm1Jbml0aWFsTW91bnQocmVuZGVyZWRFbGVtZW50LCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFJvbGwgYmFjayB0byBjaGVja3BvaW50LCBoYW5kbGUgZXJyb3IgKHdoaWNoIG1heSBhZGQgaXRlbXMgdG8gdGhlIHRyYW5zYWN0aW9uKSwgYW5kIHRha2UgYSBuZXcgY2hlY2twb2ludFxuICAgICAgdHJhbnNhY3Rpb24ucm9sbGJhY2soY2hlY2twb2ludCk7XG4gICAgICB0aGlzLl9pbnN0YW5jZS51bnN0YWJsZV9oYW5kbGVFcnJvcihlKTtcbiAgICAgIGlmICh0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSkge1xuICAgICAgICB0aGlzLl9pbnN0YW5jZS5zdGF0ZSA9IHRoaXMuX3Byb2Nlc3NQZW5kaW5nU3RhdGUodGhpcy5faW5zdGFuY2UucHJvcHMsIHRoaXMuX2luc3RhbmNlLmNvbnRleHQpO1xuICAgICAgfVxuICAgICAgY2hlY2twb2ludCA9IHRyYW5zYWN0aW9uLmNoZWNrcG9pbnQoKTtcblxuICAgICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQudW5tb3VudENvbXBvbmVudCh0cnVlKTtcbiAgICAgIHRyYW5zYWN0aW9uLnJvbGxiYWNrKGNoZWNrcG9pbnQpO1xuXG4gICAgICAvLyBUcnkgYWdhaW4gLSB3ZSd2ZSBpbmZvcm1lZCB0aGUgY29tcG9uZW50IGFib3V0IHRoZSBlcnJvciwgc28gdGhleSBjYW4gcmVuZGVyIGFuIGVycm9yIG1lc3NhZ2UgdGhpcyB0aW1lLlxuICAgICAgLy8gSWYgdGhpcyB0aHJvd3MgYWdhaW4sIHRoZSBlcnJvciB3aWxsIGJ1YmJsZSB1cCAoYW5kIGNhbiBiZSBjYXVnaHQgYnkgYSBoaWdoZXIgZXJyb3IgYm91bmRhcnkpLlxuICAgICAgbWFya3VwID0gdGhpcy5wZXJmb3JtSW5pdGlhbE1vdW50KHJlbmRlcmVkRWxlbWVudCwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcmt1cDtcbiAgfSxcblxuICBwZXJmb3JtSW5pdGlhbE1vdW50OiBmdW5jdGlvbiAocmVuZGVyZWRFbGVtZW50LCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHtcbiAgICB2YXIgaW5zdCA9IHRoaXMuX2luc3RhbmNlO1xuXG4gICAgdmFyIGRlYnVnSUQgPSAwO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBkZWJ1Z0lEID0gdGhpcy5fZGVidWdJRDtcbiAgICB9XG5cbiAgICBpZiAoaW5zdC5jb21wb25lbnRXaWxsTW91bnQpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gaW5zdC5jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgICAgICAgfSwgZGVidWdJRCwgJ2NvbXBvbmVudFdpbGxNb3VudCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5zdC5jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgICAgIH1cbiAgICAgIC8vIFdoZW4gbW91bnRpbmcsIGNhbGxzIHRvIGBzZXRTdGF0ZWAgYnkgYGNvbXBvbmVudFdpbGxNb3VudGAgd2lsbCBzZXRcbiAgICAgIC8vIGB0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZWAgd2l0aG91dCB0cmlnZ2VyaW5nIGEgcmUtcmVuZGVyLlxuICAgICAgaWYgKHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlKSB7XG4gICAgICAgIGluc3Quc3RhdGUgPSB0aGlzLl9wcm9jZXNzUGVuZGluZ1N0YXRlKGluc3QucHJvcHMsIGluc3QuY29udGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgbm90IGEgc3RhdGVsZXNzIGNvbXBvbmVudCwgd2Ugbm93IHJlbmRlclxuICAgIGlmIChyZW5kZXJlZEVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVuZGVyZWRFbGVtZW50ID0gdGhpcy5fcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50KCk7XG4gICAgfVxuXG4gICAgdmFyIG5vZGVUeXBlID0gUmVhY3ROb2RlVHlwZXMuZ2V0VHlwZShyZW5kZXJlZEVsZW1lbnQpO1xuICAgIHRoaXMuX3JlbmRlcmVkTm9kZVR5cGUgPSBub2RlVHlwZTtcbiAgICB2YXIgY2hpbGQgPSB0aGlzLl9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KHJlbmRlcmVkRWxlbWVudCwgbm9kZVR5cGUgIT09IFJlYWN0Tm9kZVR5cGVzLkVNUFRZIC8qIHNob3VsZEhhdmVEZWJ1Z0lEICovXG4gICAgKTtcbiAgICB0aGlzLl9yZW5kZXJlZENvbXBvbmVudCA9IGNoaWxkO1xuXG4gICAgdmFyIG1hcmt1cCA9IFJlYWN0UmVjb25jaWxlci5tb3VudENvbXBvbmVudChjaGlsZCwgdHJhbnNhY3Rpb24sIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCB0aGlzLl9wcm9jZXNzQ2hpbGRDb250ZXh0KGNvbnRleHQpLCBkZWJ1Z0lEKTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoZGVidWdJRCAhPT0gMCkge1xuICAgICAgICB2YXIgY2hpbGREZWJ1Z0lEcyA9IGNoaWxkLl9kZWJ1Z0lEICE9PSAwID8gW2NoaWxkLl9kZWJ1Z0lEXSA6IFtdO1xuICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25TZXRDaGlsZHJlbihkZWJ1Z0lELCBjaGlsZERlYnVnSURzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWFya3VwO1xuICB9LFxuXG4gIGdldEhvc3ROb2RlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFJlYWN0UmVjb25jaWxlci5nZXRIb3N0Tm9kZSh0aGlzLl9yZW5kZXJlZENvbXBvbmVudCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIGFueSByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IGBtb3VudENvbXBvbmVudGAuXG4gICAqXG4gICAqIEBmaW5hbFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHVubW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChzYWZlbHkpIHtcbiAgICBpZiAoIXRoaXMuX3JlbmRlcmVkQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGluc3QgPSB0aGlzLl9pbnN0YW5jZTtcblxuICAgIGlmIChpbnN0LmNvbXBvbmVudFdpbGxVbm1vdW50ICYmICFpbnN0Ll9jYWxsZWRDb21wb25lbnRXaWxsVW5tb3VudCkge1xuICAgICAgaW5zdC5fY2FsbGVkQ29tcG9uZW50V2lsbFVubW91bnQgPSB0cnVlO1xuXG4gICAgICBpZiAoc2FmZWx5KSB7XG4gICAgICAgIHZhciBuYW1lID0gdGhpcy5nZXROYW1lKCkgKyAnLmNvbXBvbmVudFdpbGxVbm1vdW50KCknO1xuICAgICAgICBSZWFjdEVycm9yVXRpbHMuaW52b2tlR3VhcmRlZENhbGxiYWNrKG5hbWUsIGluc3QuY29tcG9uZW50V2lsbFVubW91bnQuYmluZChpbnN0KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnN0LmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gICAgICAgICAgfSwgdGhpcy5fZGVidWdJRCwgJ2NvbXBvbmVudFdpbGxVbm1vdW50Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5zdC5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50KSB7XG4gICAgICBSZWFjdFJlY29uY2lsZXIudW5tb3VudENvbXBvbmVudCh0aGlzLl9yZW5kZXJlZENvbXBvbmVudCwgc2FmZWx5KTtcbiAgICAgIHRoaXMuX3JlbmRlcmVkTm9kZVR5cGUgPSBudWxsO1xuICAgICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQgPSBudWxsO1xuICAgICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IHBlbmRpbmcgZmllbGRzXG4gICAgLy8gRXZlbiBpZiB0aGlzIGNvbXBvbmVudCBpcyBzY2hlZHVsZWQgZm9yIGFub3RoZXIgdXBkYXRlIGluIFJlYWN0VXBkYXRlcyxcbiAgICAvLyBpdCB3b3VsZCBzdGlsbCBiZSBpZ25vcmVkIGJlY2F1c2UgdGhlc2UgZmllbGRzIGFyZSByZXNldC5cbiAgICB0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSA9IG51bGw7XG4gICAgdGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuX3BlbmRpbmdDYWxsYmFja3MgPSBudWxsO1xuICAgIHRoaXMuX3BlbmRpbmdFbGVtZW50ID0gbnVsbDtcblxuICAgIC8vIFRoZXNlIGZpZWxkcyBkbyBub3QgcmVhbGx5IG5lZWQgdG8gYmUgcmVzZXQgc2luY2UgdGhpcyBvYmplY3QgaXMgbm9cbiAgICAvLyBsb25nZXIgYWNjZXNzaWJsZS5cbiAgICB0aGlzLl9jb250ZXh0ID0gbnVsbDtcbiAgICB0aGlzLl9yb290Tm9kZUlEID0gMDtcbiAgICB0aGlzLl90b3BMZXZlbFdyYXBwZXIgPSBudWxsO1xuXG4gICAgLy8gRGVsZXRlIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgaW5zdGFuY2UgdG8gdGhpcyBpbnRlcm5hbCByZXByZXNlbnRhdGlvblxuICAgIC8vIHdoaWNoIGFsbG93IHRoZSBpbnRlcm5hbHMgdG8gYmUgcHJvcGVybHkgY2xlYW5lZCB1cCBldmVuIGlmIHRoZSB1c2VyXG4gICAgLy8gbGVha3MgYSByZWZlcmVuY2UgdG8gdGhlIHB1YmxpYyBpbnN0YW5jZS5cbiAgICBSZWFjdEluc3RhbmNlTWFwLnJlbW92ZShpbnN0KTtcblxuICAgIC8vIFNvbWUgZXhpc3RpbmcgY29tcG9uZW50cyByZWx5IG9uIGluc3QucHJvcHMgZXZlbiBhZnRlciB0aGV5J3ZlIGJlZW5cbiAgICAvLyBkZXN0cm95ZWQgKGluIGV2ZW50IGhhbmRsZXJzKS5cbiAgICAvLyBUT0RPOiBpbnN0LnByb3BzID0gbnVsbDtcbiAgICAvLyBUT0RPOiBpbnN0LnN0YXRlID0gbnVsbDtcbiAgICAvLyBUT0RPOiBpbnN0LmNvbnRleHQgPSBudWxsO1xuICB9LFxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIHRoZSBjb250ZXh0IG9iamVjdCB0byBvbmx5IGNvbnRhaW4ga2V5cyBzcGVjaWZpZWQgaW5cbiAgICogYGNvbnRleHRUeXBlc2BcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHRcbiAgICogQHJldHVybiB7P29iamVjdH1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9tYXNrQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICB2YXIgQ29tcG9uZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTtcbiAgICB2YXIgY29udGV4dFR5cGVzID0gQ29tcG9uZW50LmNvbnRleHRUeXBlcztcbiAgICBpZiAoIWNvbnRleHRUeXBlcykge1xuICAgICAgcmV0dXJuIGVtcHR5T2JqZWN0O1xuICAgIH1cbiAgICB2YXIgbWFza2VkQ29udGV4dCA9IHt9O1xuICAgIGZvciAodmFyIGNvbnRleHROYW1lIGluIGNvbnRleHRUeXBlcykge1xuICAgICAgbWFza2VkQ29udGV4dFtjb250ZXh0TmFtZV0gPSBjb250ZXh0W2NvbnRleHROYW1lXTtcbiAgICB9XG4gICAgcmV0dXJuIG1hc2tlZENvbnRleHQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgdGhlIGNvbnRleHQgb2JqZWN0IHRvIG9ubHkgY29udGFpbiBrZXlzIHNwZWNpZmllZCBpblxuICAgKiBgY29udGV4dFR5cGVzYCwgYW5kIGFzc2VydHMgdGhhdCB0aGV5IGFyZSB2YWxpZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHRcbiAgICogQHJldHVybiB7P29iamVjdH1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wcm9jZXNzQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICB2YXIgbWFza2VkQ29udGV4dCA9IHRoaXMuX21hc2tDb250ZXh0KGNvbnRleHQpO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgQ29tcG9uZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTtcbiAgICAgIGlmIChDb21wb25lbnQuY29udGV4dFR5cGVzKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrQ29udGV4dFR5cGVzKENvbXBvbmVudC5jb250ZXh0VHlwZXMsIG1hc2tlZENvbnRleHQsICdjb250ZXh0Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXNrZWRDb250ZXh0O1xuICB9LFxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gY3VycmVudENvbnRleHRcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3Byb2Nlc3NDaGlsZENvbnRleHQ6IGZ1bmN0aW9uIChjdXJyZW50Q29udGV4dCkge1xuICAgIHZhciBDb21wb25lbnQgPSB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO1xuICAgIHZhciBpbnN0ID0gdGhpcy5faW5zdGFuY2U7XG4gICAgdmFyIGNoaWxkQ29udGV4dDtcblxuICAgIGlmIChpbnN0LmdldENoaWxkQ29udGV4dCkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVnaW5Qcm9jZXNzaW5nQ2hpbGRDb250ZXh0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2hpbGRDb250ZXh0ID0gaW5zdC5nZXRDaGlsZENvbnRleHQoKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25FbmRQcm9jZXNzaW5nQ2hpbGRDb250ZXh0KCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoaWxkQ29udGV4dCA9IGluc3QuZ2V0Q2hpbGRDb250ZXh0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoaWxkQ29udGV4dCkge1xuICAgICAgISh0eXBlb2YgQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzID09PSAnb2JqZWN0JykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMuZ2V0Q2hpbGRDb250ZXh0KCk6IGNoaWxkQ29udGV4dFR5cGVzIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byB1c2UgZ2V0Q2hpbGRDb250ZXh0KCkuJywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnMTA3JywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB0aGlzLl9jaGVja0NvbnRleHRUeXBlcyhDb21wb25lbnQuY2hpbGRDb250ZXh0VHlwZXMsIGNoaWxkQ29udGV4dCwgJ2NoaWxkQ29udGV4dCcpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgbmFtZSBpbiBjaGlsZENvbnRleHQpIHtcbiAgICAgICAgIShuYW1lIGluIENvbXBvbmVudC5jaGlsZENvbnRleHRUeXBlcykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMuZ2V0Q2hpbGRDb250ZXh0KCk6IGtleSBcIiVzXCIgaXMgbm90IGRlZmluZWQgaW4gY2hpbGRDb250ZXh0VHlwZXMuJywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JywgbmFtZSkgOiBfcHJvZEludmFyaWFudCgnMTA4JywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JywgbmFtZSkgOiB2b2lkIDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gX2Fzc2lnbih7fSwgY3VycmVudENvbnRleHQsIGNoaWxkQ29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50Q29udGV4dDtcbiAgfSxcblxuICAvKipcbiAgICogQXNzZXJ0IHRoYXQgdGhlIGNvbnRleHQgdHlwZXMgYXJlIHZhbGlkXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSB0eXBlU3BlY3MgTWFwIG9mIGNvbnRleHQgZmllbGQgdG8gYSBSZWFjdFByb3BUeXBlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgUnVudGltZSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHR5cGUtY2hlY2tlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24gZS5nLiBcInByb3BcIiwgXCJjb250ZXh0XCIsIFwiY2hpbGQgY29udGV4dFwiXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2hlY2tDb250ZXh0VHlwZXM6IGZ1bmN0aW9uICh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24pIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgY2hlY2tSZWFjdFR5cGVTcGVjKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgdGhpcy5nZXROYW1lKCksIG51bGwsIHRoaXMuX2RlYnVnSUQpO1xuICAgIH1cbiAgfSxcblxuICByZWNlaXZlQ29tcG9uZW50OiBmdW5jdGlvbiAobmV4dEVsZW1lbnQsIHRyYW5zYWN0aW9uLCBuZXh0Q29udGV4dCkge1xuICAgIHZhciBwcmV2RWxlbWVudCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50O1xuICAgIHZhciBwcmV2Q29udGV4dCA9IHRoaXMuX2NvbnRleHQ7XG5cbiAgICB0aGlzLl9wZW5kaW5nRWxlbWVudCA9IG51bGw7XG5cbiAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudCh0cmFuc2FjdGlvbiwgcHJldkVsZW1lbnQsIG5leHRFbGVtZW50LCBwcmV2Q29udGV4dCwgbmV4dENvbnRleHQpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBJZiBhbnkgb2YgYF9wZW5kaW5nRWxlbWVudGAsIGBfcGVuZGluZ1N0YXRlUXVldWVgLCBvciBgX3BlbmRpbmdGb3JjZVVwZGF0ZWBcbiAgICogaXMgc2V0LCB1cGRhdGUgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHBlcmZvcm1VcGRhdGVJZk5lY2Vzc2FyeTogZnVuY3Rpb24gKHRyYW5zYWN0aW9uKSB7XG4gICAgaWYgKHRoaXMuX3BlbmRpbmdFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgIFJlYWN0UmVjb25jaWxlci5yZWNlaXZlQ29tcG9uZW50KHRoaXMsIHRoaXMuX3BlbmRpbmdFbGVtZW50LCB0cmFuc2FjdGlvbiwgdGhpcy5fY29udGV4dCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSAhPT0gbnVsbCB8fCB0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGUpIHtcbiAgICAgIHRoaXMudXBkYXRlQ29tcG9uZW50KHRyYW5zYWN0aW9uLCB0aGlzLl9jdXJyZW50RWxlbWVudCwgdGhpcy5fY3VycmVudEVsZW1lbnQsIHRoaXMuX2NvbnRleHQsIHRoaXMuX2NvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl91cGRhdGVCYXRjaE51bWJlciA9IG51bGw7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGFuIHVwZGF0ZSB0byBhIG1vdW50ZWQgY29tcG9uZW50LiBUaGUgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBhbmRcbiAgICogc2hvdWxkQ29tcG9uZW50VXBkYXRlIG1ldGhvZHMgYXJlIGNhbGxlZCwgdGhlbiAoYXNzdW1pbmcgdGhlIHVwZGF0ZSBpc24ndFxuICAgKiBza2lwcGVkKSB0aGUgcmVtYWluaW5nIHVwZGF0ZSBsaWZlY3ljbGUgbWV0aG9kcyBhcmUgY2FsbGVkIGFuZCB0aGUgRE9NXG4gICAqIHJlcHJlc2VudGF0aW9uIGlzIHVwZGF0ZWQuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoaXMgaW1wbGVtZW50cyBSZWFjdCdzIHJlbmRlcmluZyBhbmQgcmVjb25jaWxpYXRpb24gYWxnb3JpdGhtLlxuICAgKiBTb3BoaXN0aWNhdGVkIGNsaWVudHMgbWF5IHdpc2ggdG8gb3ZlcnJpZGUgdGhpcy5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gcHJldlBhcmVudEVsZW1lbnRcbiAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IG5leHRQYXJlbnRFbGVtZW50XG4gICAqIEBpbnRlcm5hbFxuICAgKiBAb3ZlcnJpZGFibGVcbiAgICovXG4gIHVwZGF0ZUNvbXBvbmVudDogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBwcmV2UGFyZW50RWxlbWVudCwgbmV4dFBhcmVudEVsZW1lbnQsIHByZXZVbm1hc2tlZENvbnRleHQsIG5leHRVbm1hc2tlZENvbnRleHQpIHtcbiAgICB2YXIgaW5zdCA9IHRoaXMuX2luc3RhbmNlO1xuICAgICEoaW5zdCAhPSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdBdHRlbXB0ZWQgdG8gdXBkYXRlIGNvbXBvbmVudCBgJXNgIHRoYXQgaGFzIGFscmVhZHkgYmVlbiB1bm1vdW50ZWQgKG9yIGZhaWxlZCB0byBtb3VudCkuJywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnMTM2JywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2b2lkIDA7XG5cbiAgICB2YXIgd2lsbFJlY2VpdmUgPSBmYWxzZTtcbiAgICB2YXIgbmV4dENvbnRleHQ7XG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIGNvbnRleHQgaGFzIGNoYW5nZWQgb3Igbm90XG4gICAgaWYgKHRoaXMuX2NvbnRleHQgPT09IG5leHRVbm1hc2tlZENvbnRleHQpIHtcbiAgICAgIG5leHRDb250ZXh0ID0gaW5zdC5jb250ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0Q29udGV4dCA9IHRoaXMuX3Byb2Nlc3NDb250ZXh0KG5leHRVbm1hc2tlZENvbnRleHQpO1xuICAgICAgd2lsbFJlY2VpdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBwcmV2UHJvcHMgPSBwcmV2UGFyZW50RWxlbWVudC5wcm9wcztcbiAgICB2YXIgbmV4dFByb3BzID0gbmV4dFBhcmVudEVsZW1lbnQucHJvcHM7XG5cbiAgICAvLyBOb3QgYSBzaW1wbGUgc3RhdGUgdXBkYXRlIGJ1dCBhIHByb3BzIHVwZGF0ZVxuICAgIGlmIChwcmV2UGFyZW50RWxlbWVudCAhPT0gbmV4dFBhcmVudEVsZW1lbnQpIHtcbiAgICAgIHdpbGxSZWNlaXZlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBBbiB1cGRhdGUgaGVyZSB3aWxsIHNjaGVkdWxlIGFuIHVwZGF0ZSBidXQgaW1tZWRpYXRlbHkgc2V0XG4gICAgLy8gX3BlbmRpbmdTdGF0ZVF1ZXVlIHdoaWNoIHdpbGwgZW5zdXJlIHRoYXQgYW55IHN0YXRlIHVwZGF0ZXMgZ2V0c1xuICAgIC8vIGltbWVkaWF0ZWx5IHJlY29uY2lsZWQgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciB0aGUgbmV4dCBiYXRjaC5cbiAgICBpZiAod2lsbFJlY2VpdmUgJiYgaW5zdC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlUGVyZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGluc3QuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICAgICAgfSwgdGhpcy5fZGVidWdJRCwgJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluc3QuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbmV4dFN0YXRlID0gdGhpcy5fcHJvY2Vzc1BlbmRpbmdTdGF0ZShuZXh0UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICB2YXIgc2hvdWxkVXBkYXRlID0gdHJ1ZTtcblxuICAgIGlmICghdGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRlKSB7XG4gICAgICBpZiAoaW5zdC5zaG91bGRDb21wb25lbnRVcGRhdGUpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBzaG91bGRVcGRhdGUgPSBtZWFzdXJlTGlmZUN5Y2xlUGVyZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zdC5zaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzLCBuZXh0U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgICAgICB9LCB0aGlzLl9kZWJ1Z0lELCAnc2hvdWxkQ29tcG9uZW50VXBkYXRlJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvdWxkVXBkYXRlID0gaW5zdC5zaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzLCBuZXh0U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvc2l0ZVR5cGUgPT09IENvbXBvc2l0ZVR5cGVzLlB1cmVDbGFzcykge1xuICAgICAgICAgIHNob3VsZFVwZGF0ZSA9ICFzaGFsbG93RXF1YWwocHJldlByb3BzLCBuZXh0UHJvcHMpIHx8ICFzaGFsbG93RXF1YWwoaW5zdC5zdGF0ZSwgbmV4dFN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhzaG91bGRVcGRhdGUgIT09IHVuZGVmaW5lZCwgJyVzLnNob3VsZENvbXBvbmVudFVwZGF0ZSgpOiBSZXR1cm5lZCB1bmRlZmluZWQgaW5zdGVhZCBvZiBhICcgKyAnYm9vbGVhbiB2YWx1ZS4gTWFrZSBzdXJlIHRvIHJldHVybiB0cnVlIG9yIGZhbHNlLicsIHRoaXMuZ2V0TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZUJhdGNoTnVtYmVyID0gbnVsbDtcbiAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICB0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGUgPSBmYWxzZTtcbiAgICAgIC8vIFdpbGwgc2V0IGB0aGlzLnByb3BzYCwgYHRoaXMuc3RhdGVgIGFuZCBgdGhpcy5jb250ZXh0YC5cbiAgICAgIHRoaXMuX3BlcmZvcm1Db21wb25lbnRVcGRhdGUobmV4dFBhcmVudEVsZW1lbnQsIG5leHRQcm9wcywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCwgdHJhbnNhY3Rpb24sIG5leHRVbm1hc2tlZENvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBpdCdzIGRldGVybWluZWQgdGhhdCBhIGNvbXBvbmVudCBzaG91bGQgbm90IHVwZGF0ZSwgd2Ugc3RpbGwgd2FudFxuICAgICAgLy8gdG8gc2V0IHByb3BzIGFuZCBzdGF0ZSBidXQgd2Ugc2hvcnRjdXQgdGhlIHJlc3Qgb2YgdGhlIHVwZGF0ZS5cbiAgICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbmV4dFBhcmVudEVsZW1lbnQ7XG4gICAgICB0aGlzLl9jb250ZXh0ID0gbmV4dFVubWFza2VkQ29udGV4dDtcbiAgICAgIGluc3QucHJvcHMgPSBuZXh0UHJvcHM7XG4gICAgICBpbnN0LnN0YXRlID0gbmV4dFN0YXRlO1xuICAgICAgaW5zdC5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gICAgfVxuICB9LFxuXG4gIF9wcm9jZXNzUGVuZGluZ1N0YXRlOiBmdW5jdGlvbiAocHJvcHMsIGNvbnRleHQpIHtcbiAgICB2YXIgaW5zdCA9IHRoaXMuX2luc3RhbmNlO1xuICAgIHZhciBxdWV1ZSA9IHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlO1xuICAgIHZhciByZXBsYWNlID0gdGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZTtcbiAgICB0aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlID0gZmFsc2U7XG4gICAgdGhpcy5fcGVuZGluZ1N0YXRlUXVldWUgPSBudWxsO1xuXG4gICAgaWYgKCFxdWV1ZSkge1xuICAgICAgcmV0dXJuIGluc3Quc3RhdGU7XG4gICAgfVxuXG4gICAgaWYgKHJlcGxhY2UgJiYgcXVldWUubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gcXVldWVbMF07XG4gICAgfVxuXG4gICAgdmFyIG5leHRTdGF0ZSA9IF9hc3NpZ24oe30sIHJlcGxhY2UgPyBxdWV1ZVswXSA6IGluc3Quc3RhdGUpO1xuICAgIGZvciAodmFyIGkgPSByZXBsYWNlID8gMSA6IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhcnRpYWwgPSBxdWV1ZVtpXTtcbiAgICAgIF9hc3NpZ24obmV4dFN0YXRlLCB0eXBlb2YgcGFydGlhbCA9PT0gJ2Z1bmN0aW9uJyA/IHBhcnRpYWwuY2FsbChpbnN0LCBuZXh0U3RhdGUsIHByb3BzLCBjb250ZXh0KSA6IHBhcnRpYWwpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXh0U3RhdGU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIE1lcmdlcyBuZXcgcHJvcHMgYW5kIHN0YXRlLCBub3RpZmllcyBkZWxlZ2F0ZSBtZXRob2RzIG9mIHVwZGF0ZSBhbmRcbiAgICogcGVyZm9ybXMgdXBkYXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4dEVsZW1lbnQgTmV4dCBlbGVtZW50XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBuZXh0UHJvcHMgTmV4dCBwdWJsaWMgb2JqZWN0IHRvIHNldCBhcyBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHRTdGF0ZSBOZXh0IG9iamVjdCB0byBzZXQgYXMgc3RhdGUuXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dENvbnRleHQgTmV4dCBwdWJsaWMgb2JqZWN0IHRvIHNldCBhcyBjb250ZXh0LlxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7P29iamVjdH0gdW5tYXNrZWRDb250ZXh0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcGVyZm9ybUNvbXBvbmVudFVwZGF0ZTogZnVuY3Rpb24gKG5leHRFbGVtZW50LCBuZXh0UHJvcHMsIG5leHRTdGF0ZSwgbmV4dENvbnRleHQsIHRyYW5zYWN0aW9uLCB1bm1hc2tlZENvbnRleHQpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHZhciBpbnN0ID0gdGhpcy5faW5zdGFuY2U7XG5cbiAgICB2YXIgaGFzQ29tcG9uZW50RGlkVXBkYXRlID0gQm9vbGVhbihpbnN0LmNvbXBvbmVudERpZFVwZGF0ZSk7XG4gICAgdmFyIHByZXZQcm9wcztcbiAgICB2YXIgcHJldlN0YXRlO1xuICAgIHZhciBwcmV2Q29udGV4dDtcbiAgICBpZiAoaGFzQ29tcG9uZW50RGlkVXBkYXRlKSB7XG4gICAgICBwcmV2UHJvcHMgPSBpbnN0LnByb3BzO1xuICAgICAgcHJldlN0YXRlID0gaW5zdC5zdGF0ZTtcbiAgICAgIHByZXZDb250ZXh0ID0gaW5zdC5jb250ZXh0O1xuICAgIH1cblxuICAgIGlmIChpbnN0LmNvbXBvbmVudFdpbGxVcGRhdGUpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gaW5zdC5jb21wb25lbnRXaWxsVXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICAgIH0sIHRoaXMuX2RlYnVnSUQsICdjb21wb25lbnRXaWxsVXBkYXRlJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnN0LmNvbXBvbmVudFdpbGxVcGRhdGUobmV4dFByb3BzLCBuZXh0U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IG5leHRFbGVtZW50O1xuICAgIHRoaXMuX2NvbnRleHQgPSB1bm1hc2tlZENvbnRleHQ7XG4gICAgaW5zdC5wcm9wcyA9IG5leHRQcm9wcztcbiAgICBpbnN0LnN0YXRlID0gbmV4dFN0YXRlO1xuICAgIGluc3QuY29udGV4dCA9IG5leHRDb250ZXh0O1xuXG4gICAgdGhpcy5fdXBkYXRlUmVuZGVyZWRDb21wb25lbnQodHJhbnNhY3Rpb24sIHVubWFza2VkQ29udGV4dCk7XG5cbiAgICBpZiAoaGFzQ29tcG9uZW50RGlkVXBkYXRlKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlUGVyZihpbnN0LmNvbXBvbmVudERpZFVwZGF0ZS5iaW5kKGluc3QsIHByZXZQcm9wcywgcHJldlN0YXRlLCBwcmV2Q29udGV4dCksIF90aGlzMi5fZGVidWdJRCwgJ2NvbXBvbmVudERpZFVwZGF0ZScpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoaW5zdC5jb21wb25lbnREaWRVcGRhdGUuYmluZChpbnN0LCBwcmV2UHJvcHMsIHByZXZTdGF0ZSwgcHJldkNvbnRleHQpLCBpbnN0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIENhbGwgdGhlIGNvbXBvbmVudCdzIGByZW5kZXJgIG1ldGhvZCBhbmQgdXBkYXRlIHRoZSBET00gYWNjb3JkaW5nbHkuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQGludGVybmFsXG4gICAqL1xuICBfdXBkYXRlUmVuZGVyZWRDb21wb25lbnQ6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgY29udGV4dCkge1xuICAgIHZhciBwcmV2Q29tcG9uZW50SW5zdGFuY2UgPSB0aGlzLl9yZW5kZXJlZENvbXBvbmVudDtcbiAgICB2YXIgcHJldlJlbmRlcmVkRWxlbWVudCA9IHByZXZDb21wb25lbnRJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQ7XG4gICAgdmFyIG5leHRSZW5kZXJlZEVsZW1lbnQgPSB0aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQoKTtcblxuICAgIHZhciBkZWJ1Z0lEID0gMDtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgZGVidWdJRCA9IHRoaXMuX2RlYnVnSUQ7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50KHByZXZSZW5kZXJlZEVsZW1lbnQsIG5leHRSZW5kZXJlZEVsZW1lbnQpKSB7XG4gICAgICBSZWFjdFJlY29uY2lsZXIucmVjZWl2ZUNvbXBvbmVudChwcmV2Q29tcG9uZW50SW5zdGFuY2UsIG5leHRSZW5kZXJlZEVsZW1lbnQsIHRyYW5zYWN0aW9uLCB0aGlzLl9wcm9jZXNzQ2hpbGRDb250ZXh0KGNvbnRleHQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG9sZEhvc3ROb2RlID0gUmVhY3RSZWNvbmNpbGVyLmdldEhvc3ROb2RlKHByZXZDb21wb25lbnRJbnN0YW5jZSk7XG4gICAgICBSZWFjdFJlY29uY2lsZXIudW5tb3VudENvbXBvbmVudChwcmV2Q29tcG9uZW50SW5zdGFuY2UsIGZhbHNlKTtcblxuICAgICAgdmFyIG5vZGVUeXBlID0gUmVhY3ROb2RlVHlwZXMuZ2V0VHlwZShuZXh0UmVuZGVyZWRFbGVtZW50KTtcbiAgICAgIHRoaXMuX3JlbmRlcmVkTm9kZVR5cGUgPSBub2RlVHlwZTtcbiAgICAgIHZhciBjaGlsZCA9IHRoaXMuX2luc3RhbnRpYXRlUmVhY3RDb21wb25lbnQobmV4dFJlbmRlcmVkRWxlbWVudCwgbm9kZVR5cGUgIT09IFJlYWN0Tm9kZVR5cGVzLkVNUFRZIC8qIHNob3VsZEhhdmVEZWJ1Z0lEICovXG4gICAgICApO1xuICAgICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQgPSBjaGlsZDtcblxuICAgICAgdmFyIG5leHRNYXJrdXAgPSBSZWFjdFJlY29uY2lsZXIubW91bnRDb21wb25lbnQoY2hpbGQsIHRyYW5zYWN0aW9uLCB0aGlzLl9ob3N0UGFyZW50LCB0aGlzLl9ob3N0Q29udGFpbmVySW5mbywgdGhpcy5fcHJvY2Vzc0NoaWxkQ29udGV4dChjb250ZXh0KSwgZGVidWdJRCk7XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGlmIChkZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgICAgdmFyIGNoaWxkRGVidWdJRHMgPSBjaGlsZC5fZGVidWdJRCAhPT0gMCA/IFtjaGlsZC5fZGVidWdJRF0gOiBbXTtcbiAgICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25TZXRDaGlsZHJlbihkZWJ1Z0lELCBjaGlsZERlYnVnSURzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9yZXBsYWNlTm9kZVdpdGhNYXJrdXAob2xkSG9zdE5vZGUsIG5leHRNYXJrdXAsIHByZXZDb21wb25lbnRJbnN0YW5jZSk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZGVuIGluIHNoYWxsb3cgcmVuZGVyaW5nLlxuICAgKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBfcmVwbGFjZU5vZGVXaXRoTWFya3VwOiBmdW5jdGlvbiAob2xkSG9zdE5vZGUsIG5leHRNYXJrdXAsIHByZXZJbnN0YW5jZSkge1xuICAgIFJlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQucmVwbGFjZU5vZGVXaXRoTWFya3VwKG9sZEhvc3ROb2RlLCBuZXh0TWFya3VwLCBwcmV2SW5zdGFuY2UpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBfcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50V2l0aG91dE93bmVyT3JDb250ZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGluc3QgPSB0aGlzLl9pbnN0YW5jZTtcbiAgICB2YXIgcmVuZGVyZWRFbGVtZW50O1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHJlbmRlcmVkRWxlbWVudCA9IG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGluc3QucmVuZGVyKCk7XG4gICAgICB9LCB0aGlzLl9kZWJ1Z0lELCAncmVuZGVyJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlbmRlcmVkRWxlbWVudCA9IGluc3QucmVuZGVyKCk7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIC8vIFdlIGFsbG93IGF1dG8tbW9ja3MgdG8gcHJvY2VlZCBhcyBpZiB0aGV5J3JlIHJldHVybmluZyBudWxsLlxuICAgICAgaWYgKHJlbmRlcmVkRWxlbWVudCA9PT0gdW5kZWZpbmVkICYmIGluc3QucmVuZGVyLl9pc01vY2tGdW5jdGlvbikge1xuICAgICAgICAvLyBUaGlzIGlzIHByb2JhYmx5IGJhZCBwcmFjdGljZS4gQ29uc2lkZXIgd2FybmluZyBoZXJlIGFuZFxuICAgICAgICAvLyBkZXByZWNhdGluZyB0aGlzIGNvbnZlbmllbmNlLlxuICAgICAgICByZW5kZXJlZEVsZW1lbnQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZW5kZXJlZEVsZW1lbnQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlbmRlcmVkRWxlbWVudDtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyB8fCB0aGlzLl9jb21wb3NpdGVUeXBlICE9PSBDb21wb3NpdGVUeXBlcy5TdGF0ZWxlc3NGdW5jdGlvbmFsKSB7XG4gICAgICBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID0gdGhpcztcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlbmRlcmVkRWxlbWVudCA9IHRoaXMuX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudFdpdGhvdXRPd25lck9yQ29udGV4dCgpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlbmRlcmVkRWxlbWVudCA9IHRoaXMuX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudFdpdGhvdXRPd25lck9yQ29udGV4dCgpO1xuICAgIH1cbiAgICAhKFxuICAgIC8vIFRPRE86IEFuIGBpc1ZhbGlkTm9kZWAgZnVuY3Rpb24gd291bGQgcHJvYmFibHkgYmUgbW9yZSBhcHByb3ByaWF0ZVxuICAgIHJlbmRlcmVkRWxlbWVudCA9PT0gbnVsbCB8fCByZW5kZXJlZEVsZW1lbnQgPT09IGZhbHNlIHx8IFJlYWN0LmlzVmFsaWRFbGVtZW50KHJlbmRlcmVkRWxlbWVudCkpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzLnJlbmRlcigpOiBBIHZhbGlkIFJlYWN0IGVsZW1lbnQgKG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQuIFlvdSBtYXkgaGF2ZSByZXR1cm5lZCB1bmRlZmluZWQsIGFuIGFycmF5IG9yIHNvbWUgb3RoZXIgaW52YWxpZCBvYmplY3QuJywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnMTA5JywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2b2lkIDA7XG5cbiAgICByZXR1cm4gcmVuZGVyZWRFbGVtZW50O1xuICB9LFxuXG4gIC8qKlxuICAgKiBMYXppbHkgYWxsb2NhdGVzIHRoZSByZWZzIG9iamVjdCBhbmQgc3RvcmVzIGBjb21wb25lbnRgIGFzIGByZWZgLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmIFJlZmVyZW5jZSBuYW1lLlxuICAgKiBAcGFyYW0ge2NvbXBvbmVudH0gY29tcG9uZW50IENvbXBvbmVudCB0byBzdG9yZSBhcyBgcmVmYC5cbiAgICogQGZpbmFsXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBhdHRhY2hSZWY6IGZ1bmN0aW9uIChyZWYsIGNvbXBvbmVudCkge1xuICAgIHZhciBpbnN0ID0gdGhpcy5nZXRQdWJsaWNJbnN0YW5jZSgpO1xuICAgICEoaW5zdCAhPSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdTdGF0ZWxlc3MgZnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgaGF2ZSByZWZzLicpIDogX3Byb2RJbnZhcmlhbnQoJzExMCcpIDogdm9pZCAwO1xuICAgIHZhciBwdWJsaWNDb21wb25lbnRJbnN0YW5jZSA9IGNvbXBvbmVudC5nZXRQdWJsaWNJbnN0YW5jZSgpO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudCAmJiBjb21wb25lbnQuZ2V0TmFtZSA/IGNvbXBvbmVudC5nZXROYW1lKCkgOiAnYSBjb21wb25lbnQnO1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcocHVibGljQ29tcG9uZW50SW5zdGFuY2UgIT0gbnVsbCB8fCBjb21wb25lbnQuX2NvbXBvc2l0ZVR5cGUgIT09IENvbXBvc2l0ZVR5cGVzLlN0YXRlbGVzc0Z1bmN0aW9uYWwsICdTdGF0ZWxlc3MgZnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgYmUgZ2l2ZW4gcmVmcyAnICsgJyhTZWUgcmVmIFwiJXNcIiBpbiAlcyBjcmVhdGVkIGJ5ICVzKS4gJyArICdBdHRlbXB0cyB0byBhY2Nlc3MgdGhpcyByZWYgd2lsbCBmYWlsLicsIHJlZiwgY29tcG9uZW50TmFtZSwgdGhpcy5nZXROYW1lKCkpIDogdm9pZCAwO1xuICAgIH1cbiAgICB2YXIgcmVmcyA9IGluc3QucmVmcyA9PT0gZW1wdHlPYmplY3QgPyBpbnN0LnJlZnMgPSB7fSA6IGluc3QucmVmcztcbiAgICByZWZzW3JlZl0gPSBwdWJsaWNDb21wb25lbnRJbnN0YW5jZTtcbiAgfSxcblxuICAvKipcbiAgICogRGV0YWNoZXMgYSByZWZlcmVuY2UgbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZiBOYW1lIHRvIGRlcmVmZXJlbmNlLlxuICAgKiBAZmluYWxcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRldGFjaFJlZjogZnVuY3Rpb24gKHJlZikge1xuICAgIHZhciByZWZzID0gdGhpcy5nZXRQdWJsaWNJbnN0YW5jZSgpLnJlZnM7XG4gICAgZGVsZXRlIHJlZnNbcmVmXTtcbiAgfSxcblxuICAvKipcbiAgICogR2V0IGEgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUgY29tcG9uZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgaXRcbiAgICogaW4gZXJyb3IgbWVzc2FnZXMuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5hbWUgb3IgbnVsbC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXROYW1lOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHR5cGUgPSB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO1xuICAgIHZhciBjb25zdHJ1Y3RvciA9IHRoaXMuX2luc3RhbmNlICYmIHRoaXMuX2luc3RhbmNlLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IGNvbnN0cnVjdG9yICYmIGNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBjb25zdHJ1Y3RvciAmJiBjb25zdHJ1Y3Rvci5uYW1lIHx8IG51bGw7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcHVibGljbHkgYWNjZXNzaWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbXBvbmVudCAtIGkuZS4gd2hhdFxuICAgKiBpcyBleHBvc2VkIGJ5IHJlZnMgYW5kIHJldHVybmVkIGJ5IHJlbmRlci4gQ2FuIGJlIG51bGwgZm9yIHN0YXRlbGVzc1xuICAgKiBjb21wb25lbnRzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtSZWFjdENvbXBvbmVudH0gdGhlIHB1YmxpYyBjb21wb25lbnQgaW5zdGFuY2UuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0UHVibGljSW5zdGFuY2U6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaW5zdCA9IHRoaXMuX2luc3RhbmNlO1xuICAgIGlmICh0aGlzLl9jb21wb3NpdGVUeXBlID09PSBDb21wb3NpdGVUeXBlcy5TdGF0ZWxlc3NGdW5jdGlvbmFsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGluc3Q7XG4gIH0sXG5cbiAgLy8gU3R1YlxuICBfaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudDogbnVsbFxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAyOTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 293 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nvar React = __webpack_require__(175);\n\nvar invariant = __webpack_require__(180);\n\nvar ReactNodeTypes = {\n  HOST: 0,\n  COMPOSITE: 1,\n  EMPTY: 2,\n\n  getType: function (node) {\n    if (node === null || node === false) {\n      return ReactNodeTypes.EMPTY;\n    } else if (React.isValidElement(node)) {\n      if (typeof node.type === 'function') {\n        return ReactNodeTypes.COMPOSITE;\n      } else {\n        return ReactNodeTypes.HOST;\n      }\n    }\n     true ?  true ? invariant(false, 'Unexpected node: %s', node) : _prodInvariant('26', node) : void 0;\n  }\n};\n\nmodule.exports = ReactNodeTypes;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjkzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0Tm9kZVR5cGVzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0Tm9kZVR5cGVzID0ge1xuICBIT1NUOiAwLFxuICBDT01QT1NJVEU6IDEsXG4gIEVNUFRZOiAyLFxuXG4gIGdldFR5cGU6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBSZWFjdE5vZGVUeXBlcy5FTVBUWTtcbiAgICB9IGVsc2UgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XG4gICAgICBpZiAodHlwZW9mIG5vZGUudHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gUmVhY3ROb2RlVHlwZXMuQ09NUE9TSVRFO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFJlYWN0Tm9kZVR5cGVzLkhPU1Q7XG4gICAgICB9XG4gICAgfVxuICAgICFmYWxzZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdVbmV4cGVjdGVkIG5vZGU6ICVzJywgbm9kZSkgOiBfcHJvZEludmFyaWFudCgnMjYnLCBub2RlKSA6IHZvaWQgMDtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdE5vZGVUeXBlcztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdE5vZGVUeXBlcy5qc1xuLy8gbW9kdWxlIGlkID0gMjkzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 294 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(process) {/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nvar ReactPropTypeLocationNames = __webpack_require__(295);\nvar ReactPropTypesSecret = __webpack_require__(283);\n\nvar invariant = __webpack_require__(180);\nvar warning = __webpack_require__(183);\n\nvar ReactComponentTreeHook;\n\nif (typeof process !== 'undefined' && process.env && (\"development\") === 'test') {\n  // Temporary hack.\n  // Inline requires don't work well with Jest:\n  // https://github.com/facebook/react/issues/7240\n  // Remove the inline requires when we don't need them anymore:\n  // https://github.com/facebook/react/pull/7178\n  ReactComponentTreeHook = __webpack_require__(198);\n}\n\nvar loggedTypeFailures = {};\n\n/**\n * Assert that the values match with the type specs.\n * Error messages are memorized and will only be shown once.\n *\n * @param {object} typeSpecs Map of name to a ReactPropType\n * @param {object} values Runtime values that need to be type-checked\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @param {string} componentName Name of the component for error messages.\n * @param {?object} element The React element that is being type-checked\n * @param {?number} debugID The React component instance that is being type-checked\n * @private\n */\nfunction checkReactTypeSpec(typeSpecs, values, location, componentName, element, debugID) {\n  for (var typeSpecName in typeSpecs) {\n    if (typeSpecs.hasOwnProperty(typeSpecName)) {\n      var error;\n      // Prop type validation may throw. In case they do, we don't want to\n      // fail the render phase where it didn't fail before. So we log it.\n      // After these have been cleaned up, we'll let them throw.\n      try {\n        // This is intentionally an invariant that gets caught. It's the same\n        // behavior as without this statement except with a better message.\n        !(typeof typeSpecs[typeSpecName] === 'function') ?  true ? invariant(false, '%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.', componentName || 'React class', ReactPropTypeLocationNames[location], typeSpecName) : _prodInvariant('84', componentName || 'React class', ReactPropTypeLocationNames[location], typeSpecName) : void 0;\n        error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);\n      } catch (ex) {\n        error = ex;\n      }\n       true ? warning(!error || error instanceof Error, '%s: type specification of %s `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', ReactPropTypeLocationNames[location], typeSpecName, typeof error) : void 0;\n      if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n        // Only monitor this failure once because there tends to be a lot of the\n        // same error.\n        loggedTypeFailures[error.message] = true;\n\n        var componentStackInfo = '';\n\n        if (true) {\n          if (!ReactComponentTreeHook) {\n            ReactComponentTreeHook = __webpack_require__(198);\n          }\n          if (debugID !== null) {\n            componentStackInfo = ReactComponentTreeHook.getStackAddendumByID(debugID);\n          } else if (element !== null) {\n            componentStackInfo = ReactComponentTreeHook.getCurrentStackAddendum(element);\n          }\n        }\n\n         true ? warning(false, 'Failed %s type: %s%s', location, error.message, componentStackInfo) : void 0;\n      }\n    }\n  }\n}\n\nmodule.exports = checkReactTypeSpec;\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(200)))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjk0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2NoZWNrUmVhY3RUeXBlU3BlYy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSByZXF1aXJlKCcuL1JlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzJyk7XG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vaztcblxuaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnKSB7XG4gIC8vIFRlbXBvcmFyeSBoYWNrLlxuICAvLyBJbmxpbmUgcmVxdWlyZXMgZG9uJ3Qgd29yayB3ZWxsIHdpdGggSmVzdDpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy83MjQwXG4gIC8vIFJlbW92ZSB0aGUgaW5saW5lIHJlcXVpcmVzIHdoZW4gd2UgZG9uJ3QgbmVlZCB0aGVtIGFueW1vcmU6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzcxNzhcbiAgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG59XG5cbnZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcblxuLyoqXG4gKiBBc3NlcnQgdGhhdCB0aGUgdmFsdWVzIG1hdGNoIHdpdGggdGhlIHR5cGUgc3BlY3MuXG4gKiBFcnJvciBtZXNzYWdlcyBhcmUgbWVtb3JpemVkIGFuZCB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdHlwZVNwZWNzIE1hcCBvZiBuYW1lIHRvIGEgUmVhY3RQcm9wVHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHZhbHVlcyBSdW50aW1lIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgdHlwZS1jaGVja2VkXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24gZS5nLiBcInByb3BcIiwgXCJjb250ZXh0XCIsIFwiY2hpbGQgY29udGV4dFwiXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcG9uZW50TmFtZSBOYW1lIG9mIHRoZSBjb21wb25lbnQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICogQHBhcmFtIHs/b2JqZWN0fSBlbGVtZW50IFRoZSBSZWFjdCBlbGVtZW50IHRoYXQgaXMgYmVpbmcgdHlwZS1jaGVja2VkXG4gKiBAcGFyYW0gez9udW1iZXJ9IGRlYnVnSUQgVGhlIFJlYWN0IGNvbXBvbmVudCBpbnN0YW5jZSB0aGF0IGlzIGJlaW5nIHR5cGUtY2hlY2tlZFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2hlY2tSZWFjdFR5cGVTcGVjKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZWxlbWVudCwgZGVidWdJRCkge1xuICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgaWYgKHR5cGVTcGVjcy5oYXNPd25Qcm9wZXJ0eSh0eXBlU3BlY05hbWUpKSB7XG4gICAgICB2YXIgZXJyb3I7XG4gICAgICAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgISh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gPT09ICdmdW5jdGlvbicpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzOiAlcyB0eXBlIGAlc2AgaXMgaW52YWxpZDsgaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gUmVhY3QuUHJvcFR5cGVzLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dLCB0eXBlU3BlY05hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzg0JywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl0sIHR5cGVTcGVjTmFtZSkgOiB2b2lkIDA7XG4gICAgICAgIGVycm9yID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBlcnJvciA9IGV4O1xuICAgICAgfVxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgRXJyb3IsICclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXSwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IpIDogdm9pZCAwO1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvci5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvci5tZXNzYWdlXSA9IHRydWU7XG5cbiAgICAgICAgdmFyIGNvbXBvbmVudFN0YWNrSW5mbyA9ICcnO1xuXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgaWYgKCFSZWFjdENvbXBvbmVudFRyZWVIb29rKSB7XG4gICAgICAgICAgICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRlYnVnSUQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YWNrSW5mbyA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQoZGVidWdJRCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21wb25lbnRTdGFja0luZm8gPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEN1cnJlbnRTdGFja0FkZGVuZHVtKGVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnRmFpbGVkICVzIHR5cGU6ICVzJXMnLCBsb2NhdGlvbiwgZXJyb3IubWVzc2FnZSwgY29tcG9uZW50U3RhY2tJbmZvKSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjaGVja1JlYWN0VHlwZVNwZWM7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvY2hlY2tSZWFjdFR5cGVTcGVjLmpzXG4vLyBtb2R1bGUgaWQgPSAyOTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 295 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar ReactPropTypeLocationNames = {};\n\nif (true) {\n  ReactPropTypeLocationNames = {\n    prop: 'prop',\n    context: 'context',\n    childContext: 'child context'\n  };\n}\n\nmodule.exports = ReactPropTypeLocationNames;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjk1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzID0ge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzID0ge1xuICAgIHByb3A6ICdwcm9wJyxcbiAgICBjb250ZXh0OiAnY29udGV4dCcsXG4gICAgY2hpbGRDb250ZXh0OiAnY2hpbGQgY29udGV4dCdcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcy5qc1xuLy8gbW9kdWxlIGlkID0gMjk1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 296 */
/***/ function(module, exports) {

    eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @typechecks\n * \n */\n\n/*eslint-disable no-self-compare */\n\n'use strict';\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nfunction is(x, y) {\n  // SameValue algorithm\n  if (x === y) {\n    // Steps 1-5, 7-10\n    // Steps 6.b-6.e: +0 != -0\n    // Added the nonzero y check to make Flow happy, but it is redundant\n    return x !== 0 || y !== 0 || 1 / x === 1 / y;\n  } else {\n    // Step 6.a: NaN == NaN\n    return x !== x && y !== y;\n  }\n}\n\n/**\n * Performs equality by iterating through keys on an object and returning false\n * when any key has values which are not strictly equal between the arguments.\n * Returns true when the values of all keys are strictly equal.\n */\nfunction shallowEqual(objA, objB) {\n  if (is(objA, objB)) {\n    return true;\n  }\n\n  if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {\n    return false;\n  }\n\n  var keysA = Object.keys(objA);\n  var keysB = Object.keys(objB);\n\n  if (keysA.length !== keysB.length) {\n    return false;\n  }\n\n  // Test for A's keys different from B.\n  for (var i = 0; i < keysA.length; i++) {\n    if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nmodule.exports = shallowEqual;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjk2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9zaGFsbG93RXF1YWwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKiBcbiAqL1xuXG4vKmVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gKi9cbmZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgLy8gU2FtZVZhbHVlIGFsZ29yaXRobVxuICBpZiAoeCA9PT0geSkge1xuICAgIC8vIFN0ZXBzIDEtNSwgNy0xMFxuICAgIC8vIFN0ZXBzIDYuYi02LmU6ICswICE9IC0wXG4gICAgLy8gQWRkZWQgdGhlIG5vbnplcm8geSBjaGVjayB0byBtYWtlIEZsb3cgaGFwcHksIGJ1dCBpdCBpcyByZWR1bmRhbnRcbiAgICByZXR1cm4geCAhPT0gMCB8fCB5ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geTtcbiAgfSBlbHNlIHtcbiAgICAvLyBTdGVwIDYuYTogTmFOID09IE5hTlxuICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG4gIH1cbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBlcXVhbGl0eSBieSBpdGVyYXRpbmcgdGhyb3VnaCBrZXlzIG9uIGFuIG9iamVjdCBhbmQgcmV0dXJuaW5nIGZhbHNlXG4gKiB3aGVuIGFueSBrZXkgaGFzIHZhbHVlcyB3aGljaCBhcmUgbm90IHN0cmljdGx5IGVxdWFsIGJldHdlZW4gdGhlIGFyZ3VtZW50cy5cbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSB2YWx1ZXMgb2YgYWxsIGtleXMgYXJlIHN0cmljdGx5IGVxdWFsLlxuICovXG5mdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQikge1xuICBpZiAoaXMob2JqQSwgb2JqQikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqQSAhPT0gJ29iamVjdCcgfHwgb2JqQSA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqQiAhPT0gJ29iamVjdCcgfHwgb2JqQiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICB2YXIga2V5c0IgPSBPYmplY3Qua2V5cyhvYmpCKTtcblxuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLlxuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXNBLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iakIsIGtleXNBW2ldKSB8fCAhaXMob2JqQVtrZXlzQVtpXV0sIG9iakJba2V5c0FbaV1dKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNoYWxsb3dFcXVhbDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZmJqcy9saWIvc2hhbGxvd0VxdWFsLmpzXG4vLyBtb2R1bGUgaWQgPSAyOTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 297 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\n/**\n * Given a `prevElement` and `nextElement`, determines if the existing\n * instance should be updated as opposed to being destroyed or replaced by a new\n * instance. Both arguments are elements. This ensures that this logic can\n * operate on stateless trees without any backing instance.\n *\n * @param {?object} prevElement\n * @param {?object} nextElement\n * @return {boolean} True if the existing instance should be updated.\n * @protected\n */\n\nfunction shouldUpdateReactComponent(prevElement, nextElement) {\n  var prevEmpty = prevElement === null || prevElement === false;\n  var nextEmpty = nextElement === null || nextElement === false;\n  if (prevEmpty || nextEmpty) {\n    return prevEmpty === nextEmpty;\n  }\n\n  var prevType = typeof prevElement;\n  var nextType = typeof nextElement;\n  if (prevType === 'string' || prevType === 'number') {\n    return nextType === 'string' || nextType === 'number';\n  } else {\n    return nextType === 'object' && prevElement.type === nextElement.type && prevElement.key === nextElement.key;\n  }\n}\n\nmodule.exports = shouldUpdateReactComponent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjk3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL3Nob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogR2l2ZW4gYSBgcHJldkVsZW1lbnRgIGFuZCBgbmV4dEVsZW1lbnRgLCBkZXRlcm1pbmVzIGlmIHRoZSBleGlzdGluZ1xuICogaW5zdGFuY2Ugc2hvdWxkIGJlIHVwZGF0ZWQgYXMgb3Bwb3NlZCB0byBiZWluZyBkZXN0cm95ZWQgb3IgcmVwbGFjZWQgYnkgYSBuZXdcbiAqIGluc3RhbmNlLiBCb3RoIGFyZ3VtZW50cyBhcmUgZWxlbWVudHMuIFRoaXMgZW5zdXJlcyB0aGF0IHRoaXMgbG9naWMgY2FuXG4gKiBvcGVyYXRlIG9uIHN0YXRlbGVzcyB0cmVlcyB3aXRob3V0IGFueSBiYWNraW5nIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSB7P29iamVjdH0gcHJldkVsZW1lbnRcbiAqIEBwYXJhbSB7P29iamVjdH0gbmV4dEVsZW1lbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGV4aXN0aW5nIGluc3RhbmNlIHNob3VsZCBiZSB1cGRhdGVkLlxuICogQHByb3RlY3RlZFxuICovXG5cbmZ1bmN0aW9uIHNob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50KHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCkge1xuICB2YXIgcHJldkVtcHR5ID0gcHJldkVsZW1lbnQgPT09IG51bGwgfHwgcHJldkVsZW1lbnQgPT09IGZhbHNlO1xuICB2YXIgbmV4dEVtcHR5ID0gbmV4dEVsZW1lbnQgPT09IG51bGwgfHwgbmV4dEVsZW1lbnQgPT09IGZhbHNlO1xuICBpZiAocHJldkVtcHR5IHx8IG5leHRFbXB0eSkge1xuICAgIHJldHVybiBwcmV2RW1wdHkgPT09IG5leHRFbXB0eTtcbiAgfVxuXG4gIHZhciBwcmV2VHlwZSA9IHR5cGVvZiBwcmV2RWxlbWVudDtcbiAgdmFyIG5leHRUeXBlID0gdHlwZW9mIG5leHRFbGVtZW50O1xuICBpZiAocHJldlR5cGUgPT09ICdzdHJpbmcnIHx8IHByZXZUeXBlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBuZXh0VHlwZSA9PT0gJ3N0cmluZycgfHwgbmV4dFR5cGUgPT09ICdudW1iZXInO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgcHJldkVsZW1lbnQudHlwZSA9PT0gbmV4dEVsZW1lbnQudHlwZSAmJiBwcmV2RWxlbWVudC5rZXkgPT09IG5leHRFbGVtZW50LmtleTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL3Nob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAyOTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 298 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar emptyComponentFactory;\n\nvar ReactEmptyComponentInjection = {\n  injectEmptyComponentFactory: function (factory) {\n    emptyComponentFactory = factory;\n  }\n};\n\nvar ReactEmptyComponent = {\n  create: function (instantiate) {\n    return emptyComponentFactory(instantiate);\n  }\n};\n\nReactEmptyComponent.injection = ReactEmptyComponentInjection;\n\nmodule.exports = ReactEmptyComponent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjk4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RW1wdHlDb21wb25lbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGVtcHR5Q29tcG9uZW50RmFjdG9yeTtcblxudmFyIFJlYWN0RW1wdHlDb21wb25lbnRJbmplY3Rpb24gPSB7XG4gIGluamVjdEVtcHR5Q29tcG9uZW50RmFjdG9yeTogZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBlbXB0eUNvbXBvbmVudEZhY3RvcnkgPSBmYWN0b3J5O1xuICB9XG59O1xuXG52YXIgUmVhY3RFbXB0eUNvbXBvbmVudCA9IHtcbiAgY3JlYXRlOiBmdW5jdGlvbiAoaW5zdGFudGlhdGUpIHtcbiAgICByZXR1cm4gZW1wdHlDb21wb25lbnRGYWN0b3J5KGluc3RhbnRpYXRlKTtcbiAgfVxufTtcblxuUmVhY3RFbXB0eUNvbXBvbmVudC5pbmplY3Rpb24gPSBSZWFjdEVtcHR5Q29tcG9uZW50SW5qZWN0aW9uO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RW1wdHlDb21wb25lbnQ7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RFbXB0eUNvbXBvbmVudC5qc1xuLy8gbW9kdWxlIGlkID0gMjk4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 299 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nvar invariant = __webpack_require__(180);\n\nvar genericComponentClass = null;\nvar textComponentClass = null;\n\nvar ReactHostComponentInjection = {\n  // This accepts a class that receives the tag string. This is a catch all\n  // that can render any kind of tag.\n  injectGenericComponentClass: function (componentClass) {\n    genericComponentClass = componentClass;\n  },\n  // This accepts a text component class that takes the text string to be\n  // rendered as props.\n  injectTextComponentClass: function (componentClass) {\n    textComponentClass = componentClass;\n  }\n};\n\n/**\n * Get a host internal component class for a specific tag.\n *\n * @param {ReactElement} element The element to create.\n * @return {function} The internal class constructor function.\n */\nfunction createInternalComponent(element) {\n  !genericComponentClass ?  true ? invariant(false, 'There is no registered component for the tag %s', element.type) : _prodInvariant('111', element.type) : void 0;\n  return new genericComponentClass(element);\n}\n\n/**\n * @param {ReactText} text\n * @return {ReactComponent}\n */\nfunction createInstanceForText(text) {\n  return new textComponentClass(text);\n}\n\n/**\n * @param {ReactComponent} component\n * @return {boolean}\n */\nfunction isTextComponent(component) {\n  return component instanceof textComponentClass;\n}\n\nvar ReactHostComponent = {\n  createInternalComponent: createInternalComponent,\n  createInstanceForText: createInstanceForText,\n  isTextComponent: isTextComponent,\n  injection: ReactHostComponentInjection\n};\n\nmodule.exports = ReactHostComponent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjk5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0SG9zdENvbXBvbmVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbnZhciBnZW5lcmljQ29tcG9uZW50Q2xhc3MgPSBudWxsO1xudmFyIHRleHRDb21wb25lbnRDbGFzcyA9IG51bGw7XG5cbnZhciBSZWFjdEhvc3RDb21wb25lbnRJbmplY3Rpb24gPSB7XG4gIC8vIFRoaXMgYWNjZXB0cyBhIGNsYXNzIHRoYXQgcmVjZWl2ZXMgdGhlIHRhZyBzdHJpbmcuIFRoaXMgaXMgYSBjYXRjaCBhbGxcbiAgLy8gdGhhdCBjYW4gcmVuZGVyIGFueSBraW5kIG9mIHRhZy5cbiAgaW5qZWN0R2VuZXJpY0NvbXBvbmVudENsYXNzOiBmdW5jdGlvbiAoY29tcG9uZW50Q2xhc3MpIHtcbiAgICBnZW5lcmljQ29tcG9uZW50Q2xhc3MgPSBjb21wb25lbnRDbGFzcztcbiAgfSxcbiAgLy8gVGhpcyBhY2NlcHRzIGEgdGV4dCBjb21wb25lbnQgY2xhc3MgdGhhdCB0YWtlcyB0aGUgdGV4dCBzdHJpbmcgdG8gYmVcbiAgLy8gcmVuZGVyZWQgYXMgcHJvcHMuXG4gIGluamVjdFRleHRDb21wb25lbnRDbGFzczogZnVuY3Rpb24gKGNvbXBvbmVudENsYXNzKSB7XG4gICAgdGV4dENvbXBvbmVudENsYXNzID0gY29tcG9uZW50Q2xhc3M7XG4gIH1cbn07XG5cbi8qKlxuICogR2V0IGEgaG9zdCBpbnRlcm5hbCBjb21wb25lbnQgY2xhc3MgZm9yIGEgc3BlY2lmaWMgdGFnLlxuICpcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIGNyZWF0ZS5cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSBUaGUgaW50ZXJuYWwgY2xhc3MgY29uc3RydWN0b3IgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUludGVybmFsQ29tcG9uZW50KGVsZW1lbnQpIHtcbiAgIWdlbmVyaWNDb21wb25lbnRDbGFzcyA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdUaGVyZSBpcyBubyByZWdpc3RlcmVkIGNvbXBvbmVudCBmb3IgdGhlIHRhZyAlcycsIGVsZW1lbnQudHlwZSkgOiBfcHJvZEludmFyaWFudCgnMTExJywgZWxlbWVudC50eXBlKSA6IHZvaWQgMDtcbiAgcmV0dXJuIG5ldyBnZW5lcmljQ29tcG9uZW50Q2xhc3MoZWxlbWVudCk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWFjdFRleHR9IHRleHRcbiAqIEByZXR1cm4ge1JlYWN0Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZUZvclRleHQodGV4dCkge1xuICByZXR1cm4gbmV3IHRleHRDb21wb25lbnRDbGFzcyh0ZXh0KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjb21wb25lbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzVGV4dENvbXBvbmVudChjb21wb25lbnQpIHtcbiAgcmV0dXJuIGNvbXBvbmVudCBpbnN0YW5jZW9mIHRleHRDb21wb25lbnRDbGFzcztcbn1cblxudmFyIFJlYWN0SG9zdENvbXBvbmVudCA9IHtcbiAgY3JlYXRlSW50ZXJuYWxDb21wb25lbnQ6IGNyZWF0ZUludGVybmFsQ29tcG9uZW50LFxuICBjcmVhdGVJbnN0YW5jZUZvclRleHQ6IGNyZWF0ZUluc3RhbmNlRm9yVGV4dCxcbiAgaXNUZXh0Q29tcG9uZW50OiBpc1RleHRDb21wb25lbnQsXG4gIGluamVjdGlvbjogUmVhY3RIb3N0Q29tcG9uZW50SW5qZWN0aW9uXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0SG9zdENvbXBvbmVudDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdEhvc3RDb21wb25lbnQuanNcbi8vIG1vZHVsZSBpZCA9IDI5OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 300 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar nextDebugID = 1;\n\nfunction getNextDebugID() {\n  return nextDebugID++;\n}\n\nmodule.exports = getNextDebugID;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzAwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2dldE5leHREZWJ1Z0lELmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIG5leHREZWJ1Z0lEID0gMTtcblxuZnVuY3Rpb24gZ2V0TmV4dERlYnVnSUQoKSB7XG4gIHJldHVybiBuZXh0RGVidWdJRCsrO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE5leHREZWJ1Z0lEO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL2dldE5leHREZWJ1Z0lELmpzXG4vLyBtb2R1bGUgaWQgPSAzMDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 301 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\n/**\n * Escape and wrap key so it is safe to use as a reactid\n *\n * @param {string} key to be escaped.\n * @return {string} the escaped key.\n */\n\nfunction escape(key) {\n  var escapeRegex = /[=:]/g;\n  var escaperLookup = {\n    '=': '=0',\n    ':': '=2'\n  };\n  var escapedString = ('' + key).replace(escapeRegex, function (match) {\n    return escaperLookup[match];\n  });\n\n  return '$' + escapedString;\n}\n\n/**\n * Unescape and unwrap key for human-readable display\n *\n * @param {string} key to unescape.\n * @return {string} the unescaped key.\n */\nfunction unescape(key) {\n  var unescapeRegex = /(=0|=2)/g;\n  var unescaperLookup = {\n    '=0': '=',\n    '=2': ':'\n  };\n  var keySubstring = key[0] === '.' && key[1] === '$' ? key.substring(2) : key.substring(1);\n\n  return ('' + keySubstring).replace(unescapeRegex, function (match) {\n    return unescaperLookup[match];\n  });\n}\n\nvar KeyEscapeUtils = {\n  escape: escape,\n  unescape: unescape\n};\n\nmodule.exports = KeyEscapeUtils;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzAxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0tleUVzY2FwZVV0aWxzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBFc2NhcGUgYW5kIHdyYXAga2V5IHNvIGl0IGlzIHNhZmUgdG8gdXNlIGFzIGEgcmVhY3RpZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdG8gYmUgZXNjYXBlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGVzY2FwZWQga2V5LlxuICovXG5cbmZ1bmN0aW9uIGVzY2FwZShrZXkpIHtcbiAgdmFyIGVzY2FwZVJlZ2V4ID0gL1s9Ol0vZztcbiAgdmFyIGVzY2FwZXJMb29rdXAgPSB7XG4gICAgJz0nOiAnPTAnLFxuICAgICc6JzogJz0yJ1xuICB9O1xuICB2YXIgZXNjYXBlZFN0cmluZyA9ICgnJyArIGtleSkucmVwbGFjZShlc2NhcGVSZWdleCwgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgcmV0dXJuIGVzY2FwZXJMb29rdXBbbWF0Y2hdO1xuICB9KTtcblxuICByZXR1cm4gJyQnICsgZXNjYXBlZFN0cmluZztcbn1cblxuLyoqXG4gKiBVbmVzY2FwZSBhbmQgdW53cmFwIGtleSBmb3IgaHVtYW4tcmVhZGFibGUgZGlzcGxheVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdG8gdW5lc2NhcGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSB1bmVzY2FwZWQga2V5LlxuICovXG5mdW5jdGlvbiB1bmVzY2FwZShrZXkpIHtcbiAgdmFyIHVuZXNjYXBlUmVnZXggPSAvKD0wfD0yKS9nO1xuICB2YXIgdW5lc2NhcGVyTG9va3VwID0ge1xuICAgICc9MCc6ICc9JyxcbiAgICAnPTInOiAnOidcbiAgfTtcbiAgdmFyIGtleVN1YnN0cmluZyA9IGtleVswXSA9PT0gJy4nICYmIGtleVsxXSA9PT0gJyQnID8ga2V5LnN1YnN0cmluZygyKSA6IGtleS5zdWJzdHJpbmcoMSk7XG5cbiAgcmV0dXJuICgnJyArIGtleVN1YnN0cmluZykucmVwbGFjZSh1bmVzY2FwZVJlZ2V4LCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICByZXR1cm4gdW5lc2NhcGVyTG9va3VwW21hdGNoXTtcbiAgfSk7XG59XG5cbnZhciBLZXlFc2NhcGVVdGlscyA9IHtcbiAgZXNjYXBlOiBlc2NhcGUsXG4gIHVuZXNjYXBlOiB1bmVzY2FwZVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBLZXlFc2NhcGVVdGlscztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9LZXlFc2NhcGVVdGlscy5qc1xuLy8gbW9kdWxlIGlkID0gMzAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 302 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nvar ReactCurrentOwner = __webpack_require__(182);\nvar REACT_ELEMENT_TYPE = __webpack_require__(303);\n\nvar getIteratorFn = __webpack_require__(304);\nvar invariant = __webpack_require__(180);\nvar KeyEscapeUtils = __webpack_require__(301);\nvar warning = __webpack_require__(183);\n\nvar SEPARATOR = '.';\nvar SUBSEPARATOR = ':';\n\n/**\n * This is inlined from ReactElement since this file is shared between\n * isomorphic and renderers. We could extract this to a\n *\n */\n\n/**\n * TODO: Test that a single child and an array with one item have the same key\n * pattern.\n */\n\nvar didWarnAboutMaps = false;\n\n/**\n * Generate a key string that identifies a component within a set.\n *\n * @param {*} component A component that could contain a manual key.\n * @param {number} index Index that is used if a manual key is not provided.\n * @return {string}\n */\nfunction getComponentKey(component, index) {\n  // Do some typechecking here since we call this blindly. We want to ensure\n  // that we don't block potential future ES APIs.\n  if (component && typeof component === 'object' && component.key != null) {\n    // Explicit key\n    return KeyEscapeUtils.escape(component.key);\n  }\n  // Implicit key determined by the index in the set\n  return index.toString(36);\n}\n\n/**\n * @param {?*} children Children tree container.\n * @param {!string} nameSoFar Name of the key path so far.\n * @param {!function} callback Callback to invoke with each child found.\n * @param {?*} traverseContext Used to pass information throughout the traversal\n * process.\n * @return {!number} The number of children in this subtree.\n */\nfunction traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) {\n  var type = typeof children;\n\n  if (type === 'undefined' || type === 'boolean') {\n    // All of the above are perceived as null.\n    children = null;\n  }\n\n  if (children === null || type === 'string' || type === 'number' ||\n  // The following is inlined from ReactElement. This means we can optimize\n  // some checks. React Fiber also inlines this logic for similar purposes.\n  type === 'object' && children.$$typeof === REACT_ELEMENT_TYPE) {\n    callback(traverseContext, children,\n    // If it's the only child, treat the name as if it was wrapped in an array\n    // so that it's consistent if the number of children grows.\n    nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar);\n    return 1;\n  }\n\n  var child;\n  var nextName;\n  var subtreeCount = 0; // Count of children found in the current subtree.\n  var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;\n\n  if (Array.isArray(children)) {\n    for (var i = 0; i < children.length; i++) {\n      child = children[i];\n      nextName = nextNamePrefix + getComponentKey(child, i);\n      subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n    }\n  } else {\n    var iteratorFn = getIteratorFn(children);\n    if (iteratorFn) {\n      var iterator = iteratorFn.call(children);\n      var step;\n      if (iteratorFn !== children.entries) {\n        var ii = 0;\n        while (!(step = iterator.next()).done) {\n          child = step.value;\n          nextName = nextNamePrefix + getComponentKey(child, ii++);\n          subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n        }\n      } else {\n        if (true) {\n          var mapsAsChildrenAddendum = '';\n          if (ReactCurrentOwner.current) {\n            var mapsAsChildrenOwnerName = ReactCurrentOwner.current.getName();\n            if (mapsAsChildrenOwnerName) {\n              mapsAsChildrenAddendum = ' Check the render method of `' + mapsAsChildrenOwnerName + '`.';\n            }\n          }\n           true ? warning(didWarnAboutMaps, 'Using Maps as children is not yet fully supported. It is an ' + 'experimental feature that might be removed. Convert it to a ' + 'sequence / iterable of keyed ReactElements instead.%s', mapsAsChildrenAddendum) : void 0;\n          didWarnAboutMaps = true;\n        }\n        // Iterator will provide entry [k,v] tuples rather than values.\n        while (!(step = iterator.next()).done) {\n          var entry = step.value;\n          if (entry) {\n            child = entry[1];\n            nextName = nextNamePrefix + KeyEscapeUtils.escape(entry[0]) + SUBSEPARATOR + getComponentKey(child, 0);\n            subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n          }\n        }\n      }\n    } else if (type === 'object') {\n      var addendum = '';\n      if (true) {\n        addendum = ' If you meant to render a collection of children, use an array ' + 'instead or wrap the object using createFragment(object) from the ' + 'React add-ons.';\n        if (children._isReactElement) {\n          addendum = ' It looks like you\\'re using an element created by a different ' + 'version of React. Make sure to use only one copy of React.';\n        }\n        if (ReactCurrentOwner.current) {\n          var name = ReactCurrentOwner.current.getName();\n          if (name) {\n            addendum += ' Check the render method of `' + name + '`.';\n          }\n        }\n      }\n      var childrenString = String(children);\n       true ?  true ? invariant(false, 'Objects are not valid as a React child (found: %s).%s', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum) : _prodInvariant('31', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum) : void 0;\n    }\n  }\n\n  return subtreeCount;\n}\n\n/**\n * Traverses children that are typically specified as `props.children`, but\n * might also be specified through attributes:\n *\n * - `traverseAllChildren(this.props.children, ...)`\n * - `traverseAllChildren(this.props.leftPanelChildren, ...)`\n *\n * The `traverseContext` is an optional argument that is passed through the\n * entire traversal. It can be used to store accumulations or anything else that\n * the callback might find relevant.\n *\n * @param {?*} children Children tree object.\n * @param {!function} callback To invoke upon traversing each child.\n * @param {?*} traverseContext Context for traversal.\n * @return {!number} The number of children in this subtree.\n */\nfunction traverseAllChildren(children, callback, traverseContext) {\n  if (children == null) {\n    return 0;\n  }\n\n  return traverseAllChildrenImpl(children, '', callback, traverseContext);\n}\n\nmodule.exports = traverseAllChildren;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzAyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL3RyYXZlcnNlQWxsQ2hpbGRyZW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q3VycmVudE93bmVyJyk7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnRTeW1ib2wnKTtcblxudmFyIGdldEl0ZXJhdG9yRm4gPSByZXF1aXJlKCcuL2dldEl0ZXJhdG9yRm4nKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciBLZXlFc2NhcGVVdGlscyA9IHJlcXVpcmUoJy4vS2V5RXNjYXBlVXRpbHMnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgU0VQQVJBVE9SID0gJy4nO1xudmFyIFNVQlNFUEFSQVRPUiA9ICc6JztcblxuLyoqXG4gKiBUaGlzIGlzIGlubGluZWQgZnJvbSBSZWFjdEVsZW1lbnQgc2luY2UgdGhpcyBmaWxlIGlzIHNoYXJlZCBiZXR3ZWVuXG4gKiBpc29tb3JwaGljIGFuZCByZW5kZXJlcnMuIFdlIGNvdWxkIGV4dHJhY3QgdGhpcyB0byBhXG4gKlxuICovXG5cbi8qKlxuICogVE9ETzogVGVzdCB0aGF0IGEgc2luZ2xlIGNoaWxkIGFuZCBhbiBhcnJheSB3aXRoIG9uZSBpdGVtIGhhdmUgdGhlIHNhbWUga2V5XG4gKiBwYXR0ZXJuLlxuICovXG5cbnZhciBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7XG5cbi8qKlxuICogR2VuZXJhdGUgYSBrZXkgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyBhIGNvbXBvbmVudCB3aXRoaW4gYSBzZXQuXG4gKlxuICogQHBhcmFtIHsqfSBjb21wb25lbnQgQSBjb21wb25lbnQgdGhhdCBjb3VsZCBjb250YWluIGEgbWFudWFsIGtleS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCB0aGF0IGlzIHVzZWQgaWYgYSBtYW51YWwga2V5IGlzIG5vdCBwcm92aWRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZ2V0Q29tcG9uZW50S2V5KGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgLy8gRG8gc29tZSB0eXBlY2hlY2tpbmcgaGVyZSBzaW5jZSB3ZSBjYWxsIHRoaXMgYmxpbmRseS4gV2Ugd2FudCB0byBlbnN1cmVcbiAgLy8gdGhhdCB3ZSBkb24ndCBibG9jayBwb3RlbnRpYWwgZnV0dXJlIEVTIEFQSXMuXG4gIGlmIChjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudCA9PT0gJ29iamVjdCcgJiYgY29tcG9uZW50LmtleSAhPSBudWxsKSB7XG4gICAgLy8gRXhwbGljaXQga2V5XG4gICAgcmV0dXJuIEtleUVzY2FwZVV0aWxzLmVzY2FwZShjb21wb25lbnQua2V5KTtcbiAgfVxuICAvLyBJbXBsaWNpdCBrZXkgZGV0ZXJtaW5lZCBieSB0aGUgaW5kZXggaW4gdGhlIHNldFxuICByZXR1cm4gaW5kZXgudG9TdHJpbmcoMzYpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHshc3RyaW5nfSBuYW1lU29GYXIgTmFtZSBvZiB0aGUga2V5IHBhdGggc28gZmFyLlxuICogQHBhcmFtIHshZnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIHRvIGludm9rZSB3aXRoIGVhY2ggY2hpbGQgZm91bmQuXG4gKiBAcGFyYW0gez8qfSB0cmF2ZXJzZUNvbnRleHQgVXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRocm91Z2hvdXQgdGhlIHRyYXZlcnNhbFxuICogcHJvY2Vzcy5cbiAqIEByZXR1cm4geyFudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhpcyBzdWJ0cmVlLlxuICovXG5mdW5jdGlvbiB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZHJlbiwgbmFtZVNvRmFyLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGNoaWxkcmVuO1xuXG4gIGlmICh0eXBlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAvLyBBbGwgb2YgdGhlIGFib3ZlIGFyZSBwZXJjZWl2ZWQgYXMgbnVsbC5cbiAgICBjaGlsZHJlbiA9IG51bGw7XG4gIH1cblxuICBpZiAoY2hpbGRyZW4gPT09IG51bGwgfHwgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ251bWJlcicgfHxcbiAgLy8gVGhlIGZvbGxvd2luZyBpcyBpbmxpbmVkIGZyb20gUmVhY3RFbGVtZW50LiBUaGlzIG1lYW5zIHdlIGNhbiBvcHRpbWl6ZVxuICAvLyBzb21lIGNoZWNrcy4gUmVhY3QgRmliZXIgYWxzbyBpbmxpbmVzIHRoaXMgbG9naWMgZm9yIHNpbWlsYXIgcHVycG9zZXMuXG4gIHR5cGUgPT09ICdvYmplY3QnICYmIGNoaWxkcmVuLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEUpIHtcbiAgICBjYWxsYmFjayh0cmF2ZXJzZUNvbnRleHQsIGNoaWxkcmVuLFxuICAgIC8vIElmIGl0J3MgdGhlIG9ubHkgY2hpbGQsIHRyZWF0IHRoZSBuYW1lIGFzIGlmIGl0IHdhcyB3cmFwcGVkIGluIGFuIGFycmF5XG4gICAgLy8gc28gdGhhdCBpdCdzIGNvbnNpc3RlbnQgaWYgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBncm93cy5cbiAgICBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkcmVuLCAwKSA6IG5hbWVTb0Zhcik7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICB2YXIgY2hpbGQ7XG4gIHZhciBuZXh0TmFtZTtcbiAgdmFyIHN1YnRyZWVDb3VudCA9IDA7IC8vIENvdW50IG9mIGNoaWxkcmVuIGZvdW5kIGluIHRoZSBjdXJyZW50IHN1YnRyZWUuXG4gIHZhciBuZXh0TmFtZVByZWZpeCA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgOiBuYW1lU29GYXIgKyBTVUJTRVBBUkFUT1I7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRDb21wb25lbnRLZXkoY2hpbGQsIGkpO1xuICAgICAgc3VidHJlZUNvdW50ICs9IHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkLCBuZXh0TmFtZSwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7XG4gICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChjaGlsZHJlbik7XG4gICAgICB2YXIgc3RlcDtcbiAgICAgIGlmIChpdGVyYXRvckZuICE9PSBjaGlsZHJlbi5lbnRyaWVzKSB7XG4gICAgICAgIHZhciBpaSA9IDA7XG4gICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICBjaGlsZCA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldENvbXBvbmVudEtleShjaGlsZCwgaWkrKyk7XG4gICAgICAgICAgc3VidHJlZUNvdW50ICs9IHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkLCBuZXh0TmFtZSwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgdmFyIG1hcHNBc0NoaWxkcmVuQWRkZW5kdW0gPSAnJztcbiAgICAgICAgICBpZiAoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgICAgICAgICAgdmFyIG1hcHNBc0NoaWxkcmVuT3duZXJOYW1lID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5nZXROYW1lKCk7XG4gICAgICAgICAgICBpZiAobWFwc0FzQ2hpbGRyZW5Pd25lck5hbWUpIHtcbiAgICAgICAgICAgICAgbWFwc0FzQ2hpbGRyZW5BZGRlbmR1bSA9ICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBtYXBzQXNDaGlsZHJlbk93bmVyTmFtZSArICdgLic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGRpZFdhcm5BYm91dE1hcHMsICdVc2luZyBNYXBzIGFzIGNoaWxkcmVuIGlzIG5vdCB5ZXQgZnVsbHkgc3VwcG9ydGVkLiBJdCBpcyBhbiAnICsgJ2V4cGVyaW1lbnRhbCBmZWF0dXJlIHRoYXQgbWlnaHQgYmUgcmVtb3ZlZC4gQ29udmVydCBpdCB0byBhICcgKyAnc2VxdWVuY2UgLyBpdGVyYWJsZSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuJXMnLCBtYXBzQXNDaGlsZHJlbkFkZGVuZHVtKSA6IHZvaWQgMDtcbiAgICAgICAgICBkaWRXYXJuQWJvdXRNYXBzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJdGVyYXRvciB3aWxsIHByb3ZpZGUgZW50cnkgW2ssdl0gdHVwbGVzIHJhdGhlciB0aGFuIHZhbHVlcy5cbiAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICBjaGlsZCA9IGVudHJ5WzFdO1xuICAgICAgICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIEtleUVzY2FwZVV0aWxzLmVzY2FwZShlbnRyeVswXSkgKyBTVUJTRVBBUkFUT1IgKyBnZXRDb21wb25lbnRLZXkoY2hpbGQsIDApO1xuICAgICAgICAgICAgc3VidHJlZUNvdW50ICs9IHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkLCBuZXh0TmFtZSwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIGFkZGVuZHVtID0gJyc7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBhZGRlbmR1bSA9ICcgSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSAnICsgJ2luc3RlYWQgb3Igd3JhcCB0aGUgb2JqZWN0IHVzaW5nIGNyZWF0ZUZyYWdtZW50KG9iamVjdCkgZnJvbSB0aGUgJyArICdSZWFjdCBhZGQtb25zLic7XG4gICAgICAgIGlmIChjaGlsZHJlbi5faXNSZWFjdEVsZW1lbnQpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSXQgbG9va3MgbGlrZSB5b3VcXCdyZSB1c2luZyBhbiBlbGVtZW50IGNyZWF0ZWQgYnkgYSBkaWZmZXJlbnQgJyArICd2ZXJzaW9uIG9mIFJlYWN0LiBNYWtlIHN1cmUgdG8gdXNlIG9ubHkgb25lIGNvcHkgb2YgUmVhY3QuJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgICAgICAgIHZhciBuYW1lID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5nZXROYW1lKCk7XG4gICAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgIGFkZGVuZHVtICs9ICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBjaGlsZHJlblN0cmluZyA9IFN0cmluZyhjaGlsZHJlbik7XG4gICAgICAhZmFsc2UgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiAlcykuJXMnLCBjaGlsZHJlblN0cmluZyA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKGNoaWxkcmVuKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRyZW5TdHJpbmcsIGFkZGVuZHVtKSA6IF9wcm9kSW52YXJpYW50KCczMScsIGNoaWxkcmVuU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZHJlblN0cmluZywgYWRkZW5kdW0pIDogdm9pZCAwO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdWJ0cmVlQ291bnQ7XG59XG5cbi8qKlxuICogVHJhdmVyc2VzIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYCwgYnV0XG4gKiBtaWdodCBhbHNvIGJlIHNwZWNpZmllZCB0aHJvdWdoIGF0dHJpYnV0ZXM6XG4gKlxuICogLSBgdHJhdmVyc2VBbGxDaGlsZHJlbih0aGlzLnByb3BzLmNoaWxkcmVuLCAuLi4pYFxuICogLSBgdHJhdmVyc2VBbGxDaGlsZHJlbih0aGlzLnByb3BzLmxlZnRQYW5lbENoaWxkcmVuLCAuLi4pYFxuICpcbiAqIFRoZSBgdHJhdmVyc2VDb250ZXh0YCBpcyBhbiBvcHRpb25hbCBhcmd1bWVudCB0aGF0IGlzIHBhc3NlZCB0aHJvdWdoIHRoZVxuICogZW50aXJlIHRyYXZlcnNhbC4gSXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgYWNjdW11bGF0aW9ucyBvciBhbnl0aGluZyBlbHNlIHRoYXRcbiAqIHRoZSBjYWxsYmFjayBtaWdodCBmaW5kIHJlbGV2YW50LlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgb2JqZWN0LlxuICogQHBhcmFtIHshZnVuY3Rpb259IGNhbGxiYWNrIFRvIGludm9rZSB1cG9uIHRyYXZlcnNpbmcgZWFjaCBjaGlsZC5cbiAqIEBwYXJhbSB7Pyp9IHRyYXZlcnNlQ29udGV4dCBDb250ZXh0IGZvciB0cmF2ZXJzYWwuXG4gKiBAcmV0dXJuIHshbnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHRoaXMgc3VidHJlZS5cbiAqL1xuZnVuY3Rpb24gdHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCkge1xuICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcmV0dXJuIHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkcmVuLCAnJywgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdHJhdmVyc2VBbGxDaGlsZHJlbjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi90cmF2ZXJzZUFsbENoaWxkcmVuLmpzXG4vLyBtb2R1bGUgaWQgPSAzMDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 303 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\n// The Symbol used to tag the ReactElement type. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\n\nvar REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol['for'] && Symbol['for']('react.element') || 0xeac7;\n\nmodule.exports = REACT_ELEMENT_TYPE;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzAzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RWxlbWVudFN5bWJvbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudCB0eXBlLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbFsnZm9yJ10gJiYgU3ltYm9sWydmb3InXSgncmVhY3QuZWxlbWVudCcpIHx8IDB4ZWFjNztcblxubW9kdWxlLmV4cG9ydHMgPSBSRUFDVF9FTEVNRU5UX1RZUEU7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RFbGVtZW50U3ltYm9sLmpzXG4vLyBtb2R1bGUgaWQgPSAzMDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 304 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\n/* global Symbol */\n\nvar ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.\n\n/**\n * Returns the iterator method function contained on the iterable object.\n *\n * Be sure to invoke the function with the iterable as context:\n *\n *     var iteratorFn = getIteratorFn(myIterable);\n *     if (iteratorFn) {\n *       var iterator = iteratorFn.call(myIterable);\n *       ...\n *     }\n *\n * @param {?object} maybeIterable\n * @return {?function}\n */\nfunction getIteratorFn(maybeIterable) {\n  var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);\n  if (typeof iteratorFn === 'function') {\n    return iteratorFn;\n  }\n}\n\nmodule.exports = getIteratorFn;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzA0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2dldEl0ZXJhdG9yRm4uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgU3ltYm9sICovXG5cbnZhciBJVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJzsgLy8gQmVmb3JlIFN5bWJvbCBzcGVjLlxuXG4vKipcbiAqIFJldHVybnMgdGhlIGl0ZXJhdG9yIG1ldGhvZCBmdW5jdGlvbiBjb250YWluZWQgb24gdGhlIGl0ZXJhYmxlIG9iamVjdC5cbiAqXG4gKiBCZSBzdXJlIHRvIGludm9rZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgaXRlcmFibGUgYXMgY29udGV4dDpcbiAqXG4gKiAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG15SXRlcmFibGUpO1xuICogICAgIGlmIChpdGVyYXRvckZuKSB7XG4gKiAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobXlJdGVyYWJsZSk7XG4gKiAgICAgICAuLi5cbiAqICAgICB9XG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBtYXliZUl0ZXJhYmxlXG4gKiBAcmV0dXJuIHs/ZnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICB2YXIgaXRlcmF0b3JGbiA9IG1heWJlSXRlcmFibGUgJiYgKElURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF0pO1xuICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gaXRlcmF0b3JGbjtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEl0ZXJhdG9yRm47XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvZ2V0SXRlcmF0b3JGbi5qc1xuLy8gbW9kdWxlIGlkID0gMzA0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 305 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(process) {/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar KeyEscapeUtils = __webpack_require__(301);\nvar traverseAllChildren = __webpack_require__(302);\nvar warning = __webpack_require__(183);\n\nvar ReactComponentTreeHook;\n\nif (typeof process !== 'undefined' && process.env && (\"development\") === 'test') {\n  // Temporary hack.\n  // Inline requires don't work well with Jest:\n  // https://github.com/facebook/react/issues/7240\n  // Remove the inline requires when we don't need them anymore:\n  // https://github.com/facebook/react/pull/7178\n  ReactComponentTreeHook = __webpack_require__(198);\n}\n\n/**\n * @param {function} traverseContext Context passed through traversal.\n * @param {?ReactComponent} child React child component.\n * @param {!string} name String name of key path to child.\n * @param {number=} selfDebugID Optional debugID of the current internal instance.\n */\nfunction flattenSingleChildIntoContext(traverseContext, child, name, selfDebugID) {\n  // We found a component instance.\n  if (traverseContext && typeof traverseContext === 'object') {\n    var result = traverseContext;\n    var keyUnique = result[name] === undefined;\n    if (true) {\n      if (!ReactComponentTreeHook) {\n        ReactComponentTreeHook = __webpack_require__(198);\n      }\n      if (!keyUnique) {\n         true ? warning(false, 'flattenChildren(...): Encountered two children with the same key, ' + '`%s`. Child keys must be unique; when two children share a key, only ' + 'the first child will be used.%s', KeyEscapeUtils.unescape(name), ReactComponentTreeHook.getStackAddendumByID(selfDebugID)) : void 0;\n      }\n    }\n    if (keyUnique && child != null) {\n      result[name] = child;\n    }\n  }\n}\n\n/**\n * Flattens children that are typically specified as `props.children`. Any null\n * children will not be included in the resulting object.\n * @return {!object} flattened children keyed by name.\n */\nfunction flattenChildren(children, selfDebugID) {\n  if (children == null) {\n    return children;\n  }\n  var result = {};\n\n  if (true) {\n    traverseAllChildren(children, function (traverseContext, child, name) {\n      return flattenSingleChildIntoContext(traverseContext, child, name, selfDebugID);\n    }, result);\n  } else {\n    traverseAllChildren(children, flattenSingleChildIntoContext, result);\n  }\n  return result;\n}\n\nmodule.exports = flattenChildren;\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(200)))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzA1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2ZsYXR0ZW5DaGlsZHJlbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBLZXlFc2NhcGVVdGlscyA9IHJlcXVpcmUoJy4vS2V5RXNjYXBlVXRpbHMnKTtcbnZhciB0cmF2ZXJzZUFsbENoaWxkcmVuID0gcmVxdWlyZSgnLi90cmF2ZXJzZUFsbENoaWxkcmVuJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2s7XG5cbmlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5lbnYgJiYgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0Jykge1xuICAvLyBUZW1wb3JhcnkgaGFjay5cbiAgLy8gSW5saW5lIHJlcXVpcmVzIGRvbid0IHdvcmsgd2VsbCB3aXRoIEplc3Q6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzI0MFxuICAvLyBSZW1vdmUgdGhlIGlubGluZSByZXF1aXJlcyB3aGVuIHdlIGRvbid0IG5lZWQgdGhlbSBhbnltb3JlOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC83MTc4XG4gIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3RDb21wb25lbnRUcmVlSG9vaycpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHRyYXZlcnNlQ29udGV4dCBDb250ZXh0IHBhc3NlZCB0aHJvdWdoIHRyYXZlcnNhbC5cbiAqIEBwYXJhbSB7P1JlYWN0Q29tcG9uZW50fSBjaGlsZCBSZWFjdCBjaGlsZCBjb21wb25lbnQuXG4gKiBAcGFyYW0geyFzdHJpbmd9IG5hbWUgU3RyaW5nIG5hbWUgb2Yga2V5IHBhdGggdG8gY2hpbGQuXG4gKiBAcGFyYW0ge251bWJlcj19IHNlbGZEZWJ1Z0lEIE9wdGlvbmFsIGRlYnVnSUQgb2YgdGhlIGN1cnJlbnQgaW50ZXJuYWwgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5TaW5nbGVDaGlsZEludG9Db250ZXh0KHRyYXZlcnNlQ29udGV4dCwgY2hpbGQsIG5hbWUsIHNlbGZEZWJ1Z0lEKSB7XG4gIC8vIFdlIGZvdW5kIGEgY29tcG9uZW50IGluc3RhbmNlLlxuICBpZiAodHJhdmVyc2VDb250ZXh0ICYmIHR5cGVvZiB0cmF2ZXJzZUNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgdmFyIHJlc3VsdCA9IHRyYXZlcnNlQ29udGV4dDtcbiAgICB2YXIga2V5VW5pcXVlID0gcmVzdWx0W25hbWVdID09PSB1bmRlZmluZWQ7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmICghUmVhY3RDb21wb25lbnRUcmVlSG9vaykge1xuICAgICAgICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcbiAgICAgIH1cbiAgICAgIGlmICgha2V5VW5pcXVlKSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnZmxhdHRlbkNoaWxkcmVuKC4uLik6IEVuY291bnRlcmVkIHR3byBjaGlsZHJlbiB3aXRoIHRoZSBzYW1lIGtleSwgJyArICdgJXNgLiBDaGlsZCBrZXlzIG11c3QgYmUgdW5pcXVlOyB3aGVuIHR3byBjaGlsZHJlbiBzaGFyZSBhIGtleSwgb25seSAnICsgJ3RoZSBmaXJzdCBjaGlsZCB3aWxsIGJlIHVzZWQuJXMnLCBLZXlFc2NhcGVVdGlscy51bmVzY2FwZShuYW1lKSwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChzZWxmRGVidWdJRCkpIDogdm9pZCAwO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5VW5pcXVlICYmIGNoaWxkICE9IG51bGwpIHtcbiAgICAgIHJlc3VsdFtuYW1lXSA9IGNoaWxkO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEZsYXR0ZW5zIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYC4gQW55IG51bGxcbiAqIGNoaWxkcmVuIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgb2JqZWN0LlxuICogQHJldHVybiB7IW9iamVjdH0gZmxhdHRlbmVkIGNoaWxkcmVuIGtleWVkIGJ5IG5hbWUuXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5DaGlsZHJlbihjaGlsZHJlbiwgc2VsZkRlYnVnSUQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgZnVuY3Rpb24gKHRyYXZlcnNlQ29udGV4dCwgY2hpbGQsIG5hbWUpIHtcbiAgICAgIHJldHVybiBmbGF0dGVuU2luZ2xlQ2hpbGRJbnRvQ29udGV4dCh0cmF2ZXJzZUNvbnRleHQsIGNoaWxkLCBuYW1lLCBzZWxmRGVidWdJRCk7XG4gICAgfSwgcmVzdWx0KTtcbiAgfSBlbHNlIHtcbiAgICB0cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLCBmbGF0dGVuU2luZ2xlQ2hpbGRJbnRvQ29udGV4dCwgcmVzdWx0KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZsYXR0ZW5DaGlsZHJlbjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9mbGF0dGVuQ2hpbGRyZW4uanNcbi8vIG1vZHVsZSBpZCA9IDMwNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 306 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _assign = __webpack_require__(176);\n\nvar PooledClass = __webpack_require__(223);\nvar Transaction = __webpack_require__(241);\nvar ReactInstrumentation = __webpack_require__(235);\nvar ReactServerUpdateQueue = __webpack_require__(307);\n\n/**\n * Executed within the scope of the `Transaction` instance. Consider these as\n * being member methods, but with an implied ordering while being isolated from\n * each other.\n */\nvar TRANSACTION_WRAPPERS = [];\n\nif (true) {\n  TRANSACTION_WRAPPERS.push({\n    initialize: ReactInstrumentation.debugTool.onBeginFlush,\n    close: ReactInstrumentation.debugTool.onEndFlush\n  });\n}\n\nvar noopCallbackQueue = {\n  enqueue: function () {}\n};\n\n/**\n * @class ReactServerRenderingTransaction\n * @param {boolean} renderToStaticMarkup\n */\nfunction ReactServerRenderingTransaction(renderToStaticMarkup) {\n  this.reinitializeTransaction();\n  this.renderToStaticMarkup = renderToStaticMarkup;\n  this.useCreateElement = false;\n  this.updateQueue = new ReactServerUpdateQueue(this);\n}\n\nvar Mixin = {\n  /**\n   * @see Transaction\n   * @abstract\n   * @final\n   * @return {array} Empty list of operation wrap procedures.\n   */\n  getTransactionWrappers: function () {\n    return TRANSACTION_WRAPPERS;\n  },\n\n  /**\n   * @return {object} The queue to collect `onDOMReady` callbacks with.\n   */\n  getReactMountReady: function () {\n    return noopCallbackQueue;\n  },\n\n  /**\n   * @return {object} The queue to collect React async events.\n   */\n  getUpdateQueue: function () {\n    return this.updateQueue;\n  },\n\n  /**\n   * `PooledClass` looks for this, and will invoke this before allowing this\n   * instance to be reused.\n   */\n  destructor: function () {},\n\n  checkpoint: function () {},\n\n  rollback: function () {}\n};\n\n_assign(ReactServerRenderingTransaction.prototype, Transaction, Mixin);\n\nPooledClass.addPoolingTo(ReactServerRenderingTransaction);\n\nmodule.exports = ReactServerRenderingTransaction;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzA2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBQb29sZWRDbGFzcyA9IHJlcXVpcmUoJy4vUG9vbGVkQ2xhc3MnKTtcbnZhciBUcmFuc2FjdGlvbiA9IHJlcXVpcmUoJy4vVHJhbnNhY3Rpb24nKTtcbnZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0cnVtZW50YXRpb24nKTtcbnZhciBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlID0gcmVxdWlyZSgnLi9SZWFjdFNlcnZlclVwZGF0ZVF1ZXVlJyk7XG5cbi8qKlxuICogRXhlY3V0ZWQgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgYFRyYW5zYWN0aW9uYCBpbnN0YW5jZS4gQ29uc2lkZXIgdGhlc2UgYXNcbiAqIGJlaW5nIG1lbWJlciBtZXRob2RzLCBidXQgd2l0aCBhbiBpbXBsaWVkIG9yZGVyaW5nIHdoaWxlIGJlaW5nIGlzb2xhdGVkIGZyb21cbiAqIGVhY2ggb3RoZXIuXG4gKi9cbnZhciBUUkFOU0FDVElPTl9XUkFQUEVSUyA9IFtdO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBUUkFOU0FDVElPTl9XUkFQUEVSUy5wdXNoKHtcbiAgICBpbml0aWFsaXplOiBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWdpbkZsdXNoLFxuICAgIGNsb3NlOiBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25FbmRGbHVzaFxuICB9KTtcbn1cblxudmFyIG5vb3BDYWxsYmFja1F1ZXVlID0ge1xuICBlbnF1ZXVlOiBmdW5jdGlvbiAoKSB7fVxufTtcblxuLyoqXG4gKiBAY2xhc3MgUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvblxuICogQHBhcmFtIHtib29sZWFufSByZW5kZXJUb1N0YXRpY01hcmt1cFxuICovXG5mdW5jdGlvbiBSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9uKHJlbmRlclRvU3RhdGljTWFya3VwKSB7XG4gIHRoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKTtcbiAgdGhpcy5yZW5kZXJUb1N0YXRpY01hcmt1cCA9IHJlbmRlclRvU3RhdGljTWFya3VwO1xuICB0aGlzLnVzZUNyZWF0ZUVsZW1lbnQgPSBmYWxzZTtcbiAgdGhpcy51cGRhdGVRdWV1ZSA9IG5ldyBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlKHRoaXMpO1xufVxuXG52YXIgTWl4aW4gPSB7XG4gIC8qKlxuICAgKiBAc2VlIFRyYW5zYWN0aW9uXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAZmluYWxcbiAgICogQHJldHVybiB7YXJyYXl9IEVtcHR5IGxpc3Qgb2Ygb3BlcmF0aW9uIHdyYXAgcHJvY2VkdXJlcy5cbiAgICovXG4gIGdldFRyYW5zYWN0aW9uV3JhcHBlcnM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gVFJBTlNBQ1RJT05fV1JBUFBFUlM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge29iamVjdH0gVGhlIHF1ZXVlIHRvIGNvbGxlY3QgYG9uRE9NUmVhZHlgIGNhbGxiYWNrcyB3aXRoLlxuICAgKi9cbiAgZ2V0UmVhY3RNb3VudFJlYWR5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5vb3BDYWxsYmFja1F1ZXVlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBxdWV1ZSB0byBjb2xsZWN0IFJlYWN0IGFzeW5jIGV2ZW50cy5cbiAgICovXG4gIGdldFVwZGF0ZVF1ZXVlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlUXVldWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGBQb29sZWRDbGFzc2AgbG9va3MgZm9yIHRoaXMsIGFuZCB3aWxsIGludm9rZSB0aGlzIGJlZm9yZSBhbGxvd2luZyB0aGlzXG4gICAqIGluc3RhbmNlIHRvIGJlIHJldXNlZC5cbiAgICovXG4gIGRlc3RydWN0b3I6IGZ1bmN0aW9uICgpIHt9LFxuXG4gIGNoZWNrcG9pbnQ6IGZ1bmN0aW9uICgpIHt9LFxuXG4gIHJvbGxiYWNrOiBmdW5jdGlvbiAoKSB7fVxufTtcblxuX2Fzc2lnbihSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9uLnByb3RvdHlwZSwgVHJhbnNhY3Rpb24sIE1peGluKTtcblxuUG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb247XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbi5qc1xuLy8gbW9kdWxlIGlkID0gMzA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 307 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2015-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ReactUpdateQueue = __webpack_require__(308);\n\nvar warning = __webpack_require__(183);\n\nfunction warnNoop(publicInstance, callerName) {\n  if (true) {\n    var constructor = publicInstance.constructor;\n     true ? warning(false, '%s(...): Can only update a mounting component. ' + 'This usually means you called %s() outside componentWillMount() on the server. ' + 'This is a no-op. Please check the code for the %s component.', callerName, callerName, constructor && (constructor.displayName || constructor.name) || 'ReactClass') : void 0;\n  }\n}\n\n/**\n * This is the update queue used for server rendering.\n * It delegates to ReactUpdateQueue while server rendering is in progress and\n * switches to ReactNoopUpdateQueue after the transaction has completed.\n * @class ReactServerUpdateQueue\n * @param {Transaction} transaction\n */\n\nvar ReactServerUpdateQueue = function () {\n  function ReactServerUpdateQueue(transaction) {\n    _classCallCheck(this, ReactServerUpdateQueue);\n\n    this.transaction = transaction;\n  }\n\n  /**\n   * Checks whether or not this composite component is mounted.\n   * @param {ReactClass} publicInstance The instance we want to test.\n   * @return {boolean} True if mounted, false otherwise.\n   * @protected\n   * @final\n   */\n\n\n  ReactServerUpdateQueue.prototype.isMounted = function isMounted(publicInstance) {\n    return false;\n  };\n\n  /**\n   * Enqueue a callback that will be executed after all the pending updates\n   * have processed.\n   *\n   * @param {ReactClass} publicInstance The instance to use as `this` context.\n   * @param {?function} callback Called after state is updated.\n   * @internal\n   */\n\n\n  ReactServerUpdateQueue.prototype.enqueueCallback = function enqueueCallback(publicInstance, callback, callerName) {\n    if (this.transaction.isInTransaction()) {\n      ReactUpdateQueue.enqueueCallback(publicInstance, callback, callerName);\n    }\n  };\n\n  /**\n   * Forces an update. This should only be invoked when it is known with\n   * certainty that we are **not** in a DOM transaction.\n   *\n   * You may want to call this when you know that some deeper aspect of the\n   * component's state has changed but `setState` was not called.\n   *\n   * This will not invoke `shouldComponentUpdate`, but it will invoke\n   * `componentWillUpdate` and `componentDidUpdate`.\n   *\n   * @param {ReactClass} publicInstance The instance that should rerender.\n   * @internal\n   */\n\n\n  ReactServerUpdateQueue.prototype.enqueueForceUpdate = function enqueueForceUpdate(publicInstance) {\n    if (this.transaction.isInTransaction()) {\n      ReactUpdateQueue.enqueueForceUpdate(publicInstance);\n    } else {\n      warnNoop(publicInstance, 'forceUpdate');\n    }\n  };\n\n  /**\n   * Replaces all of the state. Always use this or `setState` to mutate state.\n   * You should treat `this.state` as immutable.\n   *\n   * There is no guarantee that `this.state` will be immediately updated, so\n   * accessing `this.state` after calling this method may return the old value.\n   *\n   * @param {ReactClass} publicInstance The instance that should rerender.\n   * @param {object|function} completeState Next state.\n   * @internal\n   */\n\n\n  ReactServerUpdateQueue.prototype.enqueueReplaceState = function enqueueReplaceState(publicInstance, completeState) {\n    if (this.transaction.isInTransaction()) {\n      ReactUpdateQueue.enqueueReplaceState(publicInstance, completeState);\n    } else {\n      warnNoop(publicInstance, 'replaceState');\n    }\n  };\n\n  /**\n   * Sets a subset of the state. This only exists because _pendingState is\n   * internal. This provides a merging strategy that is not available to deep\n   * properties which is confusing. TODO: Expose pendingState or don't use it\n   * during the merge.\n   *\n   * @param {ReactClass} publicInstance The instance that should rerender.\n   * @param {object|function} partialState Next partial state to be merged with state.\n   * @internal\n   */\n\n\n  ReactServerUpdateQueue.prototype.enqueueSetState = function enqueueSetState(publicInstance, partialState) {\n    if (this.transaction.isInTransaction()) {\n      ReactUpdateQueue.enqueueSetState(publicInstance, partialState);\n    } else {\n      warnNoop(publicInstance, 'setState');\n    }\n  };\n\n  return ReactServerUpdateQueue;\n}();\n\nmodule.exports = ReactServerUpdateQueue;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzA3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0U2VydmVyVXBkYXRlUXVldWUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNS1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgUmVhY3RVcGRhdGVRdWV1ZSA9IHJlcXVpcmUoJy4vUmVhY3RVcGRhdGVRdWV1ZScpO1xuXG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxuZnVuY3Rpb24gd2Fybk5vb3AocHVibGljSW5zdGFuY2UsIGNhbGxlck5hbWUpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2YXIgY29uc3RydWN0b3IgPSBwdWJsaWNJbnN0YW5jZS5jb25zdHJ1Y3RvcjtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzKC4uLik6IENhbiBvbmx5IHVwZGF0ZSBhIG1vdW50aW5nIGNvbXBvbmVudC4gJyArICdUaGlzIHVzdWFsbHkgbWVhbnMgeW91IGNhbGxlZCAlcygpIG91dHNpZGUgY29tcG9uZW50V2lsbE1vdW50KCkgb24gdGhlIHNlcnZlci4gJyArICdUaGlzIGlzIGEgbm8tb3AuIFBsZWFzZSBjaGVjayB0aGUgY29kZSBmb3IgdGhlICVzIGNvbXBvbmVudC4nLCBjYWxsZXJOYW1lLCBjYWxsZXJOYW1lLCBjb25zdHJ1Y3RvciAmJiAoY29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgY29uc3RydWN0b3IubmFtZSkgfHwgJ1JlYWN0Q2xhc3MnKSA6IHZvaWQgMDtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHVwZGF0ZSBxdWV1ZSB1c2VkIGZvciBzZXJ2ZXIgcmVuZGVyaW5nLlxuICogSXQgZGVsZWdhdGVzIHRvIFJlYWN0VXBkYXRlUXVldWUgd2hpbGUgc2VydmVyIHJlbmRlcmluZyBpcyBpbiBwcm9ncmVzcyBhbmRcbiAqIHN3aXRjaGVzIHRvIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlIGFmdGVyIHRoZSB0cmFuc2FjdGlvbiBoYXMgY29tcGxldGVkLlxuICogQGNsYXNzIFJlYWN0U2VydmVyVXBkYXRlUXVldWVcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gKi9cblxudmFyIFJlYWN0U2VydmVyVXBkYXRlUXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFJlYWN0U2VydmVyVXBkYXRlUXVldWUodHJhbnNhY3Rpb24pIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZSk7XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB3ZSB3YW50IHRvIHRlc3QuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBmaW5hbFxuICAgKi9cblxuXG4gIFJlYWN0U2VydmVyVXBkYXRlUXVldWUucHJvdG90eXBlLmlzTW91bnRlZCA9IGZ1bmN0aW9uIGlzTW91bnRlZChwdWJsaWNJbnN0YW5jZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogRW5xdWV1ZSBhIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBhZnRlciBhbGwgdGhlIHBlbmRpbmcgdXBkYXRlc1xuICAgKiBoYXZlIHByb2Nlc3NlZC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdG8gdXNlIGFzIGB0aGlzYCBjb250ZXh0LlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHN0YXRlIGlzIHVwZGF0ZWQuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cblxuXG4gIFJlYWN0U2VydmVyVXBkYXRlUXVldWUucHJvdG90eXBlLmVucXVldWVDYWxsYmFjayA9IGZ1bmN0aW9uIGVucXVldWVDYWxsYmFjayhwdWJsaWNJbnN0YW5jZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5pc0luVHJhbnNhY3Rpb24oKSkge1xuICAgICAgUmVhY3RVcGRhdGVRdWV1ZS5lbnF1ZXVlQ2FsbGJhY2socHVibGljSW5zdGFuY2UsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAgICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAgICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gICAqXG4gICAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAgICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cblxuXG4gIFJlYWN0U2VydmVyVXBkYXRlUXVldWUucHJvdG90eXBlLmVucXVldWVGb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIGVucXVldWVGb3JjZVVwZGF0ZShwdWJsaWNJbnN0YW5jZSkge1xuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uLmlzSW5UcmFuc2FjdGlvbigpKSB7XG4gICAgICBSZWFjdFVwZGF0ZVF1ZXVlLmVucXVldWVGb3JjZVVwZGF0ZShwdWJsaWNJbnN0YW5jZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnZm9yY2VVcGRhdGUnKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGFsbCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyBvciBgc2V0U3RhdGVgIHRvIG11dGF0ZSBzdGF0ZS5cbiAgICogWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICAgKlxuICAgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICAgKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rpb259IGNvbXBsZXRlU3RhdGUgTmV4dCBzdGF0ZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuXG5cbiAgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZS5wcm90b3R5cGUuZW5xdWV1ZVJlcGxhY2VTdGF0ZSA9IGZ1bmN0aW9uIGVucXVldWVSZXBsYWNlU3RhdGUocHVibGljSW5zdGFuY2UsIGNvbXBsZXRlU3RhdGUpIHtcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5pc0luVHJhbnNhY3Rpb24oKSkge1xuICAgICAgUmVhY3RVcGRhdGVRdWV1ZS5lbnF1ZXVlUmVwbGFjZVN0YXRlKHB1YmxpY0luc3RhbmNlLCBjb21wbGV0ZVN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdyZXBsYWNlU3RhdGUnKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBUaGlzIG9ubHkgZXhpc3RzIGJlY2F1c2UgX3BlbmRpbmdTdGF0ZSBpc1xuICAgKiBpbnRlcm5hbC4gVGhpcyBwcm92aWRlcyBhIG1lcmdpbmcgc3RyYXRlZ3kgdGhhdCBpcyBub3QgYXZhaWxhYmxlIHRvIGRlZXBcbiAgICogcHJvcGVydGllcyB3aGljaCBpcyBjb25mdXNpbmcuIFRPRE86IEV4cG9zZSBwZW5kaW5nU3RhdGUgb3IgZG9uJ3QgdXNlIGl0XG4gICAqIGR1cmluZyB0aGUgbWVyZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdHxmdW5jdGlvbn0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBzdGF0ZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuXG5cbiAgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZS5wcm90b3R5cGUuZW5xdWV1ZVNldFN0YXRlID0gZnVuY3Rpb24gZW5xdWV1ZVNldFN0YXRlKHB1YmxpY0luc3RhbmNlLCBwYXJ0aWFsU3RhdGUpIHtcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5pc0luVHJhbnNhY3Rpb24oKSkge1xuICAgICAgUmVhY3RVcGRhdGVRdWV1ZS5lbnF1ZXVlU2V0U3RhdGUocHVibGljSW5zdGFuY2UsIHBhcnRpYWxTdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnc2V0U3RhdGUnKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFJlYWN0U2VydmVyVXBkYXRlUXVldWU7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdFNlcnZlclVwZGF0ZVF1ZXVlLmpzXG4vLyBtb2R1bGUgaWQgPSAzMDdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 308 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2015-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nvar ReactCurrentOwner = __webpack_require__(182);\nvar ReactInstanceMap = __webpack_require__(289);\nvar ReactInstrumentation = __webpack_require__(235);\nvar ReactUpdates = __webpack_require__(229);\n\nvar invariant = __webpack_require__(180);\nvar warning = __webpack_require__(183);\n\nfunction enqueueUpdate(internalInstance) {\n  ReactUpdates.enqueueUpdate(internalInstance);\n}\n\nfunction formatUnexpectedArgument(arg) {\n  var type = typeof arg;\n  if (type !== 'object') {\n    return type;\n  }\n  var displayName = arg.constructor && arg.constructor.name || type;\n  var keys = Object.keys(arg);\n  if (keys.length > 0 && keys.length < 20) {\n    return displayName + ' (keys: ' + keys.join(', ') + ')';\n  }\n  return displayName;\n}\n\nfunction getInternalInstanceReadyForUpdate(publicInstance, callerName) {\n  var internalInstance = ReactInstanceMap.get(publicInstance);\n  if (!internalInstance) {\n    if (true) {\n      var ctor = publicInstance.constructor;\n      // Only warn when we have a callerName. Otherwise we should be silent.\n      // We're probably calling from enqueueCallback. We don't want to warn\n      // there because we already warned for the corresponding lifecycle method.\n       true ? warning(!callerName, '%s(...): Can only update a mounted or mounting component. ' + 'This usually means you called %s() on an unmounted component. ' + 'This is a no-op. Please check the code for the %s component.', callerName, callerName, ctor && (ctor.displayName || ctor.name) || 'ReactClass') : void 0;\n    }\n    return null;\n  }\n\n  if (true) {\n     true ? warning(ReactCurrentOwner.current == null, '%s(...): Cannot update during an existing state transition (such as ' + 'within `render` or another component\\'s constructor). Render methods ' + 'should be a pure function of props and state; constructor ' + 'side-effects are an anti-pattern, but can be moved to ' + '`componentWillMount`.', callerName) : void 0;\n  }\n\n  return internalInstance;\n}\n\n/**\n * ReactUpdateQueue allows for state updates to be scheduled into a later\n * reconciliation step.\n */\nvar ReactUpdateQueue = {\n\n  /**\n   * Checks whether or not this composite component is mounted.\n   * @param {ReactClass} publicInstance The instance we want to test.\n   * @return {boolean} True if mounted, false otherwise.\n   * @protected\n   * @final\n   */\n  isMounted: function (publicInstance) {\n    if (true) {\n      var owner = ReactCurrentOwner.current;\n      if (owner !== null) {\n         true ? warning(owner._warnedAboutRefsInRender, '%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', owner.getName() || 'A component') : void 0;\n        owner._warnedAboutRefsInRender = true;\n      }\n    }\n    var internalInstance = ReactInstanceMap.get(publicInstance);\n    if (internalInstance) {\n      // During componentWillMount and render this will still be null but after\n      // that will always render to something. At least for now. So we can use\n      // this hack.\n      return !!internalInstance._renderedComponent;\n    } else {\n      return false;\n    }\n  },\n\n  /**\n   * Enqueue a callback that will be executed after all the pending updates\n   * have processed.\n   *\n   * @param {ReactClass} publicInstance The instance to use as `this` context.\n   * @param {?function} callback Called after state is updated.\n   * @param {string} callerName Name of the calling function in the public API.\n   * @internal\n   */\n  enqueueCallback: function (publicInstance, callback, callerName) {\n    ReactUpdateQueue.validateCallback(callback, callerName);\n    var internalInstance = getInternalInstanceReadyForUpdate(publicInstance);\n\n    // Previously we would throw an error if we didn't have an internal\n    // instance. Since we want to make it a no-op instead, we mirror the same\n    // behavior we have in other enqueue* methods.\n    // We also need to ignore callbacks in componentWillMount. See\n    // enqueueUpdates.\n    if (!internalInstance) {\n      return null;\n    }\n\n    if (internalInstance._pendingCallbacks) {\n      internalInstance._pendingCallbacks.push(callback);\n    } else {\n      internalInstance._pendingCallbacks = [callback];\n    }\n    // TODO: The callback here is ignored when setState is called from\n    // componentWillMount. Either fix it or disallow doing so completely in\n    // favor of getInitialState. Alternatively, we can disallow\n    // componentWillMount during server-side rendering.\n    enqueueUpdate(internalInstance);\n  },\n\n  enqueueCallbackInternal: function (internalInstance, callback) {\n    if (internalInstance._pendingCallbacks) {\n      internalInstance._pendingCallbacks.push(callback);\n    } else {\n      internalInstance._pendingCallbacks = [callback];\n    }\n    enqueueUpdate(internalInstance);\n  },\n\n  /**\n   * Forces an update. This should only be invoked when it is known with\n   * certainty that we are **not** in a DOM transaction.\n   *\n   * You may want to call this when you know that some deeper aspect of the\n   * component's state has changed but `setState` was not called.\n   *\n   * This will not invoke `shouldComponentUpdate`, but it will invoke\n   * `componentWillUpdate` and `componentDidUpdate`.\n   *\n   * @param {ReactClass} publicInstance The instance that should rerender.\n   * @internal\n   */\n  enqueueForceUpdate: function (publicInstance) {\n    var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'forceUpdate');\n\n    if (!internalInstance) {\n      return;\n    }\n\n    internalInstance._pendingForceUpdate = true;\n\n    enqueueUpdate(internalInstance);\n  },\n\n  /**\n   * Replaces all of the state. Always use this or `setState` to mutate state.\n   * You should treat `this.state` as immutable.\n   *\n   * There is no guarantee that `this.state` will be immediately updated, so\n   * accessing `this.state` after calling this method may return the old value.\n   *\n   * @param {ReactClass} publicInstance The instance that should rerender.\n   * @param {object} completeState Next state.\n   * @internal\n   */\n  enqueueReplaceState: function (publicInstance, completeState) {\n    var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'replaceState');\n\n    if (!internalInstance) {\n      return;\n    }\n\n    internalInstance._pendingStateQueue = [completeState];\n    internalInstance._pendingReplaceState = true;\n\n    enqueueUpdate(internalInstance);\n  },\n\n  /**\n   * Sets a subset of the state. This only exists because _pendingState is\n   * internal. This provides a merging strategy that is not available to deep\n   * properties which is confusing. TODO: Expose pendingState or don't use it\n   * during the merge.\n   *\n   * @param {ReactClass} publicInstance The instance that should rerender.\n   * @param {object} partialState Next partial state to be merged with state.\n   * @internal\n   */\n  enqueueSetState: function (publicInstance, partialState) {\n    if (true) {\n      ReactInstrumentation.debugTool.onSetState();\n       true ? warning(partialState != null, 'setState(...): You passed an undefined or null state object; ' + 'instead, use forceUpdate().') : void 0;\n    }\n\n    var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'setState');\n\n    if (!internalInstance) {\n      return;\n    }\n\n    var queue = internalInstance._pendingStateQueue || (internalInstance._pendingStateQueue = []);\n    queue.push(partialState);\n\n    enqueueUpdate(internalInstance);\n  },\n\n  enqueueElementInternal: function (internalInstance, nextElement, nextContext) {\n    internalInstance._pendingElement = nextElement;\n    // TODO: introduce _pendingContext instead of setting it directly.\n    internalInstance._context = nextContext;\n    enqueueUpdate(internalInstance);\n  },\n\n  validateCallback: function (callback, callerName) {\n    !(!callback || typeof callback === 'function') ?  true ? invariant(false, '%s(...): Expected the last optional `callback` argument to be a function. Instead received: %s.', callerName, formatUnexpectedArgument(callback)) : _prodInvariant('122', callerName, formatUnexpectedArgument(callback)) : void 0;\n  }\n\n};\n\nmodule.exports = ReactUpdateQueue;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzA4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0VXBkYXRlUXVldWUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNS1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q3VycmVudE93bmVyJyk7XG52YXIgUmVhY3RJbnN0YW5jZU1hcCA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0YW5jZU1hcCcpO1xudmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xudmFyIFJlYWN0VXBkYXRlcyA9IHJlcXVpcmUoJy4vUmVhY3RVcGRhdGVzJyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG5mdW5jdGlvbiBlbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2UpIHtcbiAgUmVhY3RVcGRhdGVzLmVucXVldWVVcGRhdGUoaW50ZXJuYWxJbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVuZXhwZWN0ZWRBcmd1bWVudChhcmcpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgYXJnO1xuICBpZiAodHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuICB2YXIgZGlzcGxheU5hbWUgPSBhcmcuY29uc3RydWN0b3IgJiYgYXJnLmNvbnN0cnVjdG9yLm5hbWUgfHwgdHlwZTtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhcmcpO1xuICBpZiAoa2V5cy5sZW5ndGggPiAwICYmIGtleXMubGVuZ3RoIDwgMjApIHtcbiAgICByZXR1cm4gZGlzcGxheU5hbWUgKyAnIChrZXlzOiAnICsga2V5cy5qb2luKCcsICcpICsgJyknO1xuICB9XG4gIHJldHVybiBkaXNwbGF5TmFtZTtcbn1cblxuZnVuY3Rpb24gZ2V0SW50ZXJuYWxJbnN0YW5jZVJlYWR5Rm9yVXBkYXRlKHB1YmxpY0luc3RhbmNlLCBjYWxsZXJOYW1lKSB7XG4gIHZhciBpbnRlcm5hbEluc3RhbmNlID0gUmVhY3RJbnN0YW5jZU1hcC5nZXQocHVibGljSW5zdGFuY2UpO1xuICBpZiAoIWludGVybmFsSW5zdGFuY2UpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIGN0b3IgPSBwdWJsaWNJbnN0YW5jZS5jb25zdHJ1Y3RvcjtcbiAgICAgIC8vIE9ubHkgd2FybiB3aGVuIHdlIGhhdmUgYSBjYWxsZXJOYW1lLiBPdGhlcndpc2Ugd2Ugc2hvdWxkIGJlIHNpbGVudC5cbiAgICAgIC8vIFdlJ3JlIHByb2JhYmx5IGNhbGxpbmcgZnJvbSBlbnF1ZXVlQ2FsbGJhY2suIFdlIGRvbid0IHdhbnQgdG8gd2FyblxuICAgICAgLy8gdGhlcmUgYmVjYXVzZSB3ZSBhbHJlYWR5IHdhcm5lZCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgbGlmZWN5Y2xlIG1ldGhvZC5cbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFjYWxsZXJOYW1lLCAnJXMoLi4uKTogQ2FuIG9ubHkgdXBkYXRlIGEgbW91bnRlZCBvciBtb3VudGluZyBjb21wb25lbnQuICcgKyAnVGhpcyB1c3VhbGx5IG1lYW5zIHlvdSBjYWxsZWQgJXMoKSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LiAnICsgJ1RoaXMgaXMgYSBuby1vcC4gUGxlYXNlIGNoZWNrIHRoZSBjb2RlIGZvciB0aGUgJXMgY29tcG9uZW50LicsIGNhbGxlck5hbWUsIGNhbGxlck5hbWUsIGN0b3IgJiYgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSB8fCAnUmVhY3RDbGFzcycpIDogdm9pZCAwO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCA9PSBudWxsLCAnJXMoLi4uKTogQ2Fubm90IHVwZGF0ZSBkdXJpbmcgYW4gZXhpc3Rpbmcgc3RhdGUgdHJhbnNpdGlvbiAoc3VjaCBhcyAnICsgJ3dpdGhpbiBgcmVuZGVyYCBvciBhbm90aGVyIGNvbXBvbmVudFxcJ3MgY29uc3RydWN0b3IpLiBSZW5kZXIgbWV0aG9kcyAnICsgJ3Nob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlOyBjb25zdHJ1Y3RvciAnICsgJ3NpZGUtZWZmZWN0cyBhcmUgYW4gYW50aS1wYXR0ZXJuLCBidXQgY2FuIGJlIG1vdmVkIHRvICcgKyAnYGNvbXBvbmVudFdpbGxNb3VudGAuJywgY2FsbGVyTmFtZSkgOiB2b2lkIDA7XG4gIH1cblxuICByZXR1cm4gaW50ZXJuYWxJbnN0YW5jZTtcbn1cblxuLyoqXG4gKiBSZWFjdFVwZGF0ZVF1ZXVlIGFsbG93cyBmb3Igc3RhdGUgdXBkYXRlcyB0byBiZSBzY2hlZHVsZWQgaW50byBhIGxhdGVyXG4gKiByZWNvbmNpbGlhdGlvbiBzdGVwLlxuICovXG52YXIgUmVhY3RVcGRhdGVRdWV1ZSA9IHtcblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB3ZSB3YW50IHRvIHRlc3QuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgaXNNb3VudGVkOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtcbiAgICAgIGlmIChvd25lciAhPT0gbnVsbCkge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhvd25lci5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIsICclcyBpcyBhY2Nlc3NpbmcgaXNNb3VudGVkIGluc2lkZSBpdHMgcmVuZGVyKCkgZnVuY3Rpb24uICcgKyAncmVuZGVyKCkgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuIEl0IHNob3VsZCAnICsgJ25ldmVyIGFjY2VzcyBzb21ldGhpbmcgdGhhdCByZXF1aXJlcyBzdGFsZSBkYXRhIGZyb20gdGhlIHByZXZpb3VzICcgKyAncmVuZGVyLCBzdWNoIGFzIHJlZnMuIE1vdmUgdGhpcyBsb2dpYyB0byBjb21wb25lbnREaWRNb3VudCBhbmQgJyArICdjb21wb25lbnREaWRVcGRhdGUgaW5zdGVhZC4nLCBvd25lci5nZXROYW1lKCkgfHwgJ0EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICAgIG93bmVyLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBpbnRlcm5hbEluc3RhbmNlID0gUmVhY3RJbnN0YW5jZU1hcC5nZXQocHVibGljSW5zdGFuY2UpO1xuICAgIGlmIChpbnRlcm5hbEluc3RhbmNlKSB7XG4gICAgICAvLyBEdXJpbmcgY29tcG9uZW50V2lsbE1vdW50IGFuZCByZW5kZXIgdGhpcyB3aWxsIHN0aWxsIGJlIG51bGwgYnV0IGFmdGVyXG4gICAgICAvLyB0aGF0IHdpbGwgYWx3YXlzIHJlbmRlciB0byBzb21ldGhpbmcuIEF0IGxlYXN0IGZvciBub3cuIFNvIHdlIGNhbiB1c2VcbiAgICAgIC8vIHRoaXMgaGFjay5cbiAgICAgIHJldHVybiAhIWludGVybmFsSW5zdGFuY2UuX3JlbmRlcmVkQ29tcG9uZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBFbnF1ZXVlIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGFmdGVyIGFsbCB0aGUgcGVuZGluZyB1cGRhdGVzXG4gICAqIGhhdmUgcHJvY2Vzc2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0byB1c2UgYXMgYHRoaXNgIGNvbnRleHQuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgc3RhdGUgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxlck5hbWUgTmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlQ2FsbGJhY2s6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICBSZWFjdFVwZGF0ZVF1ZXVlLnZhbGlkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGNhbGxlck5hbWUpO1xuICAgIHZhciBpbnRlcm5hbEluc3RhbmNlID0gZ2V0SW50ZXJuYWxJbnN0YW5jZVJlYWR5Rm9yVXBkYXRlKHB1YmxpY0luc3RhbmNlKTtcblxuICAgIC8vIFByZXZpb3VzbHkgd2Ugd291bGQgdGhyb3cgYW4gZXJyb3IgaWYgd2UgZGlkbid0IGhhdmUgYW4gaW50ZXJuYWxcbiAgICAvLyBpbnN0YW5jZS4gU2luY2Ugd2Ugd2FudCB0byBtYWtlIGl0IGEgbm8tb3AgaW5zdGVhZCwgd2UgbWlycm9yIHRoZSBzYW1lXG4gICAgLy8gYmVoYXZpb3Igd2UgaGF2ZSBpbiBvdGhlciBlbnF1ZXVlKiBtZXRob2RzLlxuICAgIC8vIFdlIGFsc28gbmVlZCB0byBpZ25vcmUgY2FsbGJhY2tzIGluIGNvbXBvbmVudFdpbGxNb3VudC4gU2VlXG4gICAgLy8gZW5xdWV1ZVVwZGF0ZXMuXG4gICAgaWYgKCFpbnRlcm5hbEluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0NhbGxiYWNrcykge1xuICAgICAgaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0NhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0NhbGxiYWNrcyA9IFtjYWxsYmFja107XG4gICAgfVxuICAgIC8vIFRPRE86IFRoZSBjYWxsYmFjayBoZXJlIGlzIGlnbm9yZWQgd2hlbiBzZXRTdGF0ZSBpcyBjYWxsZWQgZnJvbVxuICAgIC8vIGNvbXBvbmVudFdpbGxNb3VudC4gRWl0aGVyIGZpeCBpdCBvciBkaXNhbGxvdyBkb2luZyBzbyBjb21wbGV0ZWx5IGluXG4gICAgLy8gZmF2b3Igb2YgZ2V0SW5pdGlhbFN0YXRlLiBBbHRlcm5hdGl2ZWx5LCB3ZSBjYW4gZGlzYWxsb3dcbiAgICAvLyBjb21wb25lbnRXaWxsTW91bnQgZHVyaW5nIHNlcnZlci1zaWRlIHJlbmRlcmluZy5cbiAgICBlbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2UpO1xuICB9LFxuXG4gIGVucXVldWVDYWxsYmFja0ludGVybmFsOiBmdW5jdGlvbiAoaW50ZXJuYWxJbnN0YW5jZSwgY2FsbGJhY2spIHtcbiAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0NhbGxiYWNrcykge1xuICAgICAgaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0NhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0NhbGxiYWNrcyA9IFtjYWxsYmFja107XG4gICAgfVxuICAgIGVucXVldWVVcGRhdGUoaW50ZXJuYWxJbnN0YW5jZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAgICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAgICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gICAqXG4gICAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAgICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZUZvcmNlVXBkYXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHtcbiAgICB2YXIgaW50ZXJuYWxJbnN0YW5jZSA9IGdldEludGVybmFsSW5zdGFuY2VSZWFkeUZvclVwZGF0ZShwdWJsaWNJbnN0YW5jZSwgJ2ZvcmNlVXBkYXRlJyk7XG5cbiAgICBpZiAoIWludGVybmFsSW5zdGFuY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nRm9yY2VVcGRhdGUgPSB0cnVlO1xuXG4gICAgZW5xdWV1ZVVwZGF0ZShpbnRlcm5hbEluc3RhbmNlKTtcbiAgfSxcblxuICAvKipcbiAgICogUmVwbGFjZXMgYWxsIG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIG9yIGBzZXRTdGF0ZWAgdG8gbXV0YXRlIHN0YXRlLlxuICAgKiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gICAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcGxldGVTdGF0ZSBOZXh0IHN0YXRlLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVSZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY29tcGxldGVTdGF0ZSkge1xuICAgIHZhciBpbnRlcm5hbEluc3RhbmNlID0gZ2V0SW50ZXJuYWxJbnN0YW5jZVJlYWR5Rm9yVXBkYXRlKHB1YmxpY0luc3RhbmNlLCAncmVwbGFjZVN0YXRlJyk7XG5cbiAgICBpZiAoIWludGVybmFsSW5zdGFuY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nU3RhdGVRdWV1ZSA9IFtjb21wbGV0ZVN0YXRlXTtcbiAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nUmVwbGFjZVN0YXRlID0gdHJ1ZTtcblxuICAgIGVucXVldWVVcGRhdGUoaW50ZXJuYWxJbnN0YW5jZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBUaGlzIG9ubHkgZXhpc3RzIGJlY2F1c2UgX3BlbmRpbmdTdGF0ZSBpc1xuICAgKiBpbnRlcm5hbC4gVGhpcyBwcm92aWRlcyBhIG1lcmdpbmcgc3RyYXRlZ3kgdGhhdCBpcyBub3QgYXZhaWxhYmxlIHRvIGRlZXBcbiAgICogcHJvcGVydGllcyB3aGljaCBpcyBjb25mdXNpbmcuIFRPRE86IEV4cG9zZSBwZW5kaW5nU3RhdGUgb3IgZG9uJ3QgdXNlIGl0XG4gICAqIGR1cmluZyB0aGUgbWVyZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBzdGF0ZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgcGFydGlhbFN0YXRlKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblNldFN0YXRlKCk7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhwYXJ0aWFsU3RhdGUgIT0gbnVsbCwgJ3NldFN0YXRlKC4uLik6IFlvdSBwYXNzZWQgYW4gdW5kZWZpbmVkIG9yIG51bGwgc3RhdGUgb2JqZWN0OyAnICsgJ2luc3RlYWQsIHVzZSBmb3JjZVVwZGF0ZSgpLicpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIHZhciBpbnRlcm5hbEluc3RhbmNlID0gZ2V0SW50ZXJuYWxJbnN0YW5jZVJlYWR5Rm9yVXBkYXRlKHB1YmxpY0luc3RhbmNlLCAnc2V0U3RhdGUnKTtcblxuICAgIGlmICghaW50ZXJuYWxJbnN0YW5jZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBxdWV1ZSA9IGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdTdGF0ZVF1ZXVlIHx8IChpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nU3RhdGVRdWV1ZSA9IFtdKTtcbiAgICBxdWV1ZS5wdXNoKHBhcnRpYWxTdGF0ZSk7XG5cbiAgICBlbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2UpO1xuICB9LFxuXG4gIGVucXVldWVFbGVtZW50SW50ZXJuYWw6IGZ1bmN0aW9uIChpbnRlcm5hbEluc3RhbmNlLCBuZXh0RWxlbWVudCwgbmV4dENvbnRleHQpIHtcbiAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nRWxlbWVudCA9IG5leHRFbGVtZW50O1xuICAgIC8vIFRPRE86IGludHJvZHVjZSBfcGVuZGluZ0NvbnRleHQgaW5zdGVhZCBvZiBzZXR0aW5nIGl0IGRpcmVjdGx5LlxuICAgIGludGVybmFsSW5zdGFuY2UuX2NvbnRleHQgPSBuZXh0Q29udGV4dDtcbiAgICBlbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2UpO1xuICB9LFxuXG4gIHZhbGlkYXRlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgICEoIWNhbGxiYWNrIHx8IHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMoLi4uKTogRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1bWVudCB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsZXJOYW1lLCBmb3JtYXRVbmV4cGVjdGVkQXJndW1lbnQoY2FsbGJhY2spKSA6IF9wcm9kSW52YXJpYW50KCcxMjInLCBjYWxsZXJOYW1lLCBmb3JtYXRVbmV4cGVjdGVkQXJndW1lbnQoY2FsbGJhY2spKSA6IHZvaWQgMDtcbiAgfVxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0VXBkYXRlUXVldWU7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RVcGRhdGVRdWV1ZS5qc1xuLy8gbW9kdWxlIGlkID0gMzA4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 309 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2015-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _assign = __webpack_require__(176);\n\nvar emptyFunction = __webpack_require__(184);\nvar warning = __webpack_require__(183);\n\nvar validateDOMNesting = emptyFunction;\n\nif (true) {\n  // This validation code was written based on the HTML5 parsing spec:\n  // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope\n  //\n  // Note: this does not catch all invalid nesting, nor does it try to (as it's\n  // not clear what practical benefit doing so provides); instead, we warn only\n  // for cases where the parser will give a parse tree differing from what React\n  // intended. For example, <b><div></div></b> is invalid but we don't warn\n  // because it still parses correctly; we do warn for other cases like nested\n  // <p> tags where the beginning of the second element implicitly closes the\n  // first, causing a confusing mess.\n\n  // https://html.spec.whatwg.org/multipage/syntax.html#special\n  var specialTags = ['address', 'applet', 'area', 'article', 'aside', 'base', 'basefont', 'bgsound', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'col', 'colgroup', 'dd', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'iframe', 'img', 'input', 'isindex', 'li', 'link', 'listing', 'main', 'marquee', 'menu', 'menuitem', 'meta', 'nav', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'p', 'param', 'plaintext', 'pre', 'script', 'section', 'select', 'source', 'style', 'summary', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul', 'wbr', 'xmp'];\n\n  // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope\n  var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template',\n\n  // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point\n  // TODO: Distinguish by namespace here -- for <title>, including it here\n  // errs on the side of fewer warnings\n  'foreignObject', 'desc', 'title'];\n\n  // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope\n  var buttonScopeTags = inScopeTags.concat(['button']);\n\n  // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags\n  var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt'];\n\n  var emptyAncestorInfo = {\n    current: null,\n\n    formTag: null,\n    aTagInScope: null,\n    buttonTagInScope: null,\n    nobrTagInScope: null,\n    pTagInButtonScope: null,\n\n    listItemTagAutoclosing: null,\n    dlItemTagAutoclosing: null\n  };\n\n  var updatedAncestorInfo = function (oldInfo, tag, instance) {\n    var ancestorInfo = _assign({}, oldInfo || emptyAncestorInfo);\n    var info = { tag: tag, instance: instance };\n\n    if (inScopeTags.indexOf(tag) !== -1) {\n      ancestorInfo.aTagInScope = null;\n      ancestorInfo.buttonTagInScope = null;\n      ancestorInfo.nobrTagInScope = null;\n    }\n    if (buttonScopeTags.indexOf(tag) !== -1) {\n      ancestorInfo.pTagInButtonScope = null;\n    }\n\n    // See rules for 'li', 'dd', 'dt' start tags in\n    // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n    if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') {\n      ancestorInfo.listItemTagAutoclosing = null;\n      ancestorInfo.dlItemTagAutoclosing = null;\n    }\n\n    ancestorInfo.current = info;\n\n    if (tag === 'form') {\n      ancestorInfo.formTag = info;\n    }\n    if (tag === 'a') {\n      ancestorInfo.aTagInScope = info;\n    }\n    if (tag === 'button') {\n      ancestorInfo.buttonTagInScope = info;\n    }\n    if (tag === 'nobr') {\n      ancestorInfo.nobrTagInScope = info;\n    }\n    if (tag === 'p') {\n      ancestorInfo.pTagInButtonScope = info;\n    }\n    if (tag === 'li') {\n      ancestorInfo.listItemTagAutoclosing = info;\n    }\n    if (tag === 'dd' || tag === 'dt') {\n      ancestorInfo.dlItemTagAutoclosing = info;\n    }\n\n    return ancestorInfo;\n  };\n\n  /**\n   * Returns whether\n   */\n  var isTagValidWithParent = function (tag, parentTag) {\n    // First, let's check if we're in an unusual parsing mode...\n    switch (parentTag) {\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect\n      case 'select':\n        return tag === 'option' || tag === 'optgroup' || tag === '#text';\n      case 'optgroup':\n        return tag === 'option' || tag === '#text';\n      // Strictly speaking, seeing an <option> doesn't mean we're in a <select>\n      // but\n      case 'option':\n        return tag === '#text';\n\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption\n      // No special behavior since these rules fall back to \"in body\" mode for\n      // all except special table nodes which cause bad parsing behavior anyway.\n\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr\n      case 'tr':\n        return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template';\n\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody\n      case 'tbody':\n      case 'thead':\n      case 'tfoot':\n        return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template';\n\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup\n      case 'colgroup':\n        return tag === 'col' || tag === 'template';\n\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable\n      case 'table':\n        return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template';\n\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead\n      case 'head':\n        return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template';\n\n      // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element\n      case 'html':\n        return tag === 'head' || tag === 'body';\n      case '#document':\n        return tag === 'html';\n    }\n\n    // Probably in the \"in body\" parsing mode, so we outlaw only tag combos\n    // where the parsing rules cause implicit opens or closes to be added.\n    // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n    switch (tag) {\n      case 'h1':\n      case 'h2':\n      case 'h3':\n      case 'h4':\n      case 'h5':\n      case 'h6':\n        return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6';\n\n      case 'rp':\n      case 'rt':\n        return impliedEndTags.indexOf(parentTag) === -1;\n\n      case 'body':\n      case 'caption':\n      case 'col':\n      case 'colgroup':\n      case 'frame':\n      case 'head':\n      case 'html':\n      case 'tbody':\n      case 'td':\n      case 'tfoot':\n      case 'th':\n      case 'thead':\n      case 'tr':\n        // These tags are only valid with a few parents that have special child\n        // parsing rules -- if we're down here, then none of those matched and\n        // so we allow it only if we don't know what the parent is, as all other\n        // cases are invalid.\n        return parentTag == null;\n    }\n\n    return true;\n  };\n\n  /**\n   * Returns whether\n   */\n  var findInvalidAncestorForTag = function (tag, ancestorInfo) {\n    switch (tag) {\n      case 'address':\n      case 'article':\n      case 'aside':\n      case 'blockquote':\n      case 'center':\n      case 'details':\n      case 'dialog':\n      case 'dir':\n      case 'div':\n      case 'dl':\n      case 'fieldset':\n      case 'figcaption':\n      case 'figure':\n      case 'footer':\n      case 'header':\n      case 'hgroup':\n      case 'main':\n      case 'menu':\n      case 'nav':\n      case 'ol':\n      case 'p':\n      case 'section':\n      case 'summary':\n      case 'ul':\n\n      case 'pre':\n      case 'listing':\n\n      case 'table':\n\n      case 'hr':\n\n      case 'xmp':\n\n      case 'h1':\n      case 'h2':\n      case 'h3':\n      case 'h4':\n      case 'h5':\n      case 'h6':\n        return ancestorInfo.pTagInButtonScope;\n\n      case 'form':\n        return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope;\n\n      case 'li':\n        return ancestorInfo.listItemTagAutoclosing;\n\n      case 'dd':\n      case 'dt':\n        return ancestorInfo.dlItemTagAutoclosing;\n\n      case 'button':\n        return ancestorInfo.buttonTagInScope;\n\n      case 'a':\n        // Spec says something about storing a list of markers, but it sounds\n        // equivalent to this check.\n        return ancestorInfo.aTagInScope;\n\n      case 'nobr':\n        return ancestorInfo.nobrTagInScope;\n    }\n\n    return null;\n  };\n\n  /**\n   * Given a ReactCompositeComponent instance, return a list of its recursive\n   * owners, starting at the root and ending with the instance itself.\n   */\n  var findOwnerStack = function (instance) {\n    if (!instance) {\n      return [];\n    }\n\n    var stack = [];\n    do {\n      stack.push(instance);\n    } while (instance = instance._currentElement._owner);\n    stack.reverse();\n    return stack;\n  };\n\n  var didWarn = {};\n\n  validateDOMNesting = function (childTag, childText, childInstance, ancestorInfo) {\n    ancestorInfo = ancestorInfo || emptyAncestorInfo;\n    var parentInfo = ancestorInfo.current;\n    var parentTag = parentInfo && parentInfo.tag;\n\n    if (childText != null) {\n       true ? warning(childTag == null, 'validateDOMNesting: when childText is passed, childTag should be null') : void 0;\n      childTag = '#text';\n    }\n\n    var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo;\n    var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo);\n    var problematic = invalidParent || invalidAncestor;\n\n    if (problematic) {\n      var ancestorTag = problematic.tag;\n      var ancestorInstance = problematic.instance;\n\n      var childOwner = childInstance && childInstance._currentElement._owner;\n      var ancestorOwner = ancestorInstance && ancestorInstance._currentElement._owner;\n\n      var childOwners = findOwnerStack(childOwner);\n      var ancestorOwners = findOwnerStack(ancestorOwner);\n\n      var minStackLen = Math.min(childOwners.length, ancestorOwners.length);\n      var i;\n\n      var deepestCommon = -1;\n      for (i = 0; i < minStackLen; i++) {\n        if (childOwners[i] === ancestorOwners[i]) {\n          deepestCommon = i;\n        } else {\n          break;\n        }\n      }\n\n      var UNKNOWN = '(unknown)';\n      var childOwnerNames = childOwners.slice(deepestCommon + 1).map(function (inst) {\n        return inst.getName() || UNKNOWN;\n      });\n      var ancestorOwnerNames = ancestorOwners.slice(deepestCommon + 1).map(function (inst) {\n        return inst.getName() || UNKNOWN;\n      });\n      var ownerInfo = [].concat(\n      // If the parent and child instances have a common owner ancestor, start\n      // with that -- otherwise we just start with the parent's owners.\n      deepestCommon !== -1 ? childOwners[deepestCommon].getName() || UNKNOWN : [], ancestorOwnerNames, ancestorTag,\n      // If we're warning about an invalid (non-parent) ancestry, add '...'\n      invalidAncestor ? ['...'] : [], childOwnerNames, childTag).join(' > ');\n\n      var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag + '|' + ownerInfo;\n      if (didWarn[warnKey]) {\n        return;\n      }\n      didWarn[warnKey] = true;\n\n      var tagDisplayName = childTag;\n      var whitespaceInfo = '';\n      if (childTag === '#text') {\n        if (/\\S/.test(childText)) {\n          tagDisplayName = 'Text nodes';\n        } else {\n          tagDisplayName = 'Whitespace text nodes';\n          whitespaceInfo = ' Make sure you don\\'t have any extra whitespace between tags on ' + 'each line of your source code.';\n        }\n      } else {\n        tagDisplayName = '<' + childTag + '>';\n      }\n\n      if (invalidParent) {\n        var info = '';\n        if (ancestorTag === 'table' && childTag === 'tr') {\n          info += ' Add a <tbody> to your code to match the DOM tree generated by ' + 'the browser.';\n        }\n         true ? warning(false, 'validateDOMNesting(...): %s cannot appear as a child of <%s>.%s ' + 'See %s.%s', tagDisplayName, ancestorTag, whitespaceInfo, ownerInfo, info) : void 0;\n      } else {\n         true ? warning(false, 'validateDOMNesting(...): %s cannot appear as a descendant of ' + '<%s>. See %s.', tagDisplayName, ancestorTag, ownerInfo) : void 0;\n      }\n    }\n  };\n\n  validateDOMNesting.updatedAncestorInfo = updatedAncestorInfo;\n\n  // For testing\n  validateDOMNesting.isTagValidInContext = function (tag, ancestorInfo) {\n    ancestorInfo = ancestorInfo || emptyAncestorInfo;\n    var parentInfo = ancestorInfo.current;\n    var parentTag = parentInfo && parentInfo.tag;\n    return isTagValidWithParent(tag, parentTag) && !findInvalidAncestorForTag(tag, ancestorInfo);\n  };\n}\n\nmodule.exports = validateDOMNesting;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzA5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL3ZhbGlkYXRlRE9NTmVzdGluZy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDE1LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eUZ1bmN0aW9uJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIHZhbGlkYXRlRE9NTmVzdGluZyA9IGVtcHR5RnVuY3Rpb247XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIFRoaXMgdmFsaWRhdGlvbiBjb2RlIHdhcyB3cml0dGVuIGJhc2VkIG9uIHRoZSBIVE1MNSBwYXJzaW5nIHNwZWM6XG4gIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLXNjb3BlXG4gIC8vXG4gIC8vIE5vdGU6IHRoaXMgZG9lcyBub3QgY2F0Y2ggYWxsIGludmFsaWQgbmVzdGluZywgbm9yIGRvZXMgaXQgdHJ5IHRvIChhcyBpdCdzXG4gIC8vIG5vdCBjbGVhciB3aGF0IHByYWN0aWNhbCBiZW5lZml0IGRvaW5nIHNvIHByb3ZpZGVzKTsgaW5zdGVhZCwgd2Ugd2FybiBvbmx5XG4gIC8vIGZvciBjYXNlcyB3aGVyZSB0aGUgcGFyc2VyIHdpbGwgZ2l2ZSBhIHBhcnNlIHRyZWUgZGlmZmVyaW5nIGZyb20gd2hhdCBSZWFjdFxuICAvLyBpbnRlbmRlZC4gRm9yIGV4YW1wbGUsIDxiPjxkaXY+PC9kaXY+PC9iPiBpcyBpbnZhbGlkIGJ1dCB3ZSBkb24ndCB3YXJuXG4gIC8vIGJlY2F1c2UgaXQgc3RpbGwgcGFyc2VzIGNvcnJlY3RseTsgd2UgZG8gd2FybiBmb3Igb3RoZXIgY2FzZXMgbGlrZSBuZXN0ZWRcbiAgLy8gPHA+IHRhZ3Mgd2hlcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Vjb25kIGVsZW1lbnQgaW1wbGljaXRseSBjbG9zZXMgdGhlXG4gIC8vIGZpcnN0LCBjYXVzaW5nIGEgY29uZnVzaW5nIG1lc3MuXG5cbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjc3BlY2lhbFxuICB2YXIgc3BlY2lhbFRhZ3MgPSBbJ2FkZHJlc3MnLCAnYXBwbGV0JywgJ2FyZWEnLCAnYXJ0aWNsZScsICdhc2lkZScsICdiYXNlJywgJ2Jhc2Vmb250JywgJ2Jnc291bmQnLCAnYmxvY2txdW90ZScsICdib2R5JywgJ2JyJywgJ2J1dHRvbicsICdjYXB0aW9uJywgJ2NlbnRlcicsICdjb2wnLCAnY29sZ3JvdXAnLCAnZGQnLCAnZGV0YWlscycsICdkaXInLCAnZGl2JywgJ2RsJywgJ2R0JywgJ2VtYmVkJywgJ2ZpZWxkc2V0JywgJ2ZpZ2NhcHRpb24nLCAnZmlndXJlJywgJ2Zvb3RlcicsICdmb3JtJywgJ2ZyYW1lJywgJ2ZyYW1lc2V0JywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2JywgJ2hlYWQnLCAnaGVhZGVyJywgJ2hncm91cCcsICdocicsICdodG1sJywgJ2lmcmFtZScsICdpbWcnLCAnaW5wdXQnLCAnaXNpbmRleCcsICdsaScsICdsaW5rJywgJ2xpc3RpbmcnLCAnbWFpbicsICdtYXJxdWVlJywgJ21lbnUnLCAnbWVudWl0ZW0nLCAnbWV0YScsICduYXYnLCAnbm9lbWJlZCcsICdub2ZyYW1lcycsICdub3NjcmlwdCcsICdvYmplY3QnLCAnb2wnLCAncCcsICdwYXJhbScsICdwbGFpbnRleHQnLCAncHJlJywgJ3NjcmlwdCcsICdzZWN0aW9uJywgJ3NlbGVjdCcsICdzb3VyY2UnLCAnc3R5bGUnLCAnc3VtbWFyeScsICd0YWJsZScsICd0Ym9keScsICd0ZCcsICd0ZW1wbGF0ZScsICd0ZXh0YXJlYScsICd0Zm9vdCcsICd0aCcsICd0aGVhZCcsICd0aXRsZScsICd0cicsICd0cmFjaycsICd1bCcsICd3YnInLCAneG1wJ107XG5cbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tc2NvcGVcbiAgdmFyIGluU2NvcGVUYWdzID0gWydhcHBsZXQnLCAnY2FwdGlvbicsICdodG1sJywgJ3RhYmxlJywgJ3RkJywgJ3RoJywgJ21hcnF1ZWUnLCAnb2JqZWN0JywgJ3RlbXBsYXRlJyxcblxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNodG1sLWludGVncmF0aW9uLXBvaW50XG4gIC8vIFRPRE86IERpc3Rpbmd1aXNoIGJ5IG5hbWVzcGFjZSBoZXJlIC0tIGZvciA8dGl0bGU+LCBpbmNsdWRpbmcgaXQgaGVyZVxuICAvLyBlcnJzIG9uIHRoZSBzaWRlIG9mIGZld2VyIHdhcm5pbmdzXG4gICdmb3JlaWduT2JqZWN0JywgJ2Rlc2MnLCAndGl0bGUnXTtcblxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMtYW4tZWxlbWVudC1pbi1idXR0b24tc2NvcGVcbiAgdmFyIGJ1dHRvblNjb3BlVGFncyA9IGluU2NvcGVUYWdzLmNvbmNhdChbJ2J1dHRvbiddKTtcblxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNnZW5lcmF0ZS1pbXBsaWVkLWVuZC10YWdzXG4gIHZhciBpbXBsaWVkRW5kVGFncyA9IFsnZGQnLCAnZHQnLCAnbGknLCAnb3B0aW9uJywgJ29wdGdyb3VwJywgJ3AnLCAncnAnLCAncnQnXTtcblxuICB2YXIgZW1wdHlBbmNlc3RvckluZm8gPSB7XG4gICAgY3VycmVudDogbnVsbCxcblxuICAgIGZvcm1UYWc6IG51bGwsXG4gICAgYVRhZ0luU2NvcGU6IG51bGwsXG4gICAgYnV0dG9uVGFnSW5TY29wZTogbnVsbCxcbiAgICBub2JyVGFnSW5TY29wZTogbnVsbCxcbiAgICBwVGFnSW5CdXR0b25TY29wZTogbnVsbCxcblxuICAgIGxpc3RJdGVtVGFnQXV0b2Nsb3Npbmc6IG51bGwsXG4gICAgZGxJdGVtVGFnQXV0b2Nsb3Npbmc6IG51bGxcbiAgfTtcblxuICB2YXIgdXBkYXRlZEFuY2VzdG9ySW5mbyA9IGZ1bmN0aW9uIChvbGRJbmZvLCB0YWcsIGluc3RhbmNlKSB7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IF9hc3NpZ24oe30sIG9sZEluZm8gfHwgZW1wdHlBbmNlc3RvckluZm8pO1xuICAgIHZhciBpbmZvID0geyB0YWc6IHRhZywgaW5zdGFuY2U6IGluc3RhbmNlIH07XG5cbiAgICBpZiAoaW5TY29wZVRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSkge1xuICAgICAgYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlID0gbnVsbDtcbiAgICAgIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlID0gbnVsbDtcbiAgICAgIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChidXR0b25TY29wZVRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSkge1xuICAgICAgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBTZWUgcnVsZXMgZm9yICdsaScsICdkZCcsICdkdCcgc3RhcnQgdGFncyBpblxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHlcbiAgICBpZiAoc3BlY2lhbFRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSAmJiB0YWcgIT09ICdhZGRyZXNzJyAmJiB0YWcgIT09ICdkaXYnICYmIHRhZyAhPT0gJ3AnKSB7XG4gICAgICBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZyA9IG51bGw7XG4gICAgICBhbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3NpbmcgPSBudWxsO1xuICAgIH1cblxuICAgIGFuY2VzdG9ySW5mby5jdXJyZW50ID0gaW5mbztcblxuICAgIGlmICh0YWcgPT09ICdmb3JtJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmZvcm1UYWcgPSBpbmZvO1xuICAgIH1cbiAgICBpZiAodGFnID09PSAnYScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuICAgIGlmICh0YWcgPT09ICdidXR0b24nKSB7XG4gICAgICBhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuICAgIGlmICh0YWcgPT09ICdub2JyJykge1xuICAgICAgYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG4gICAgaWYgKHRhZyA9PT0gJ3AnKSB7XG4gICAgICBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGUgPSBpbmZvO1xuICAgIH1cbiAgICBpZiAodGFnID09PSAnbGknKSB7XG4gICAgICBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZyA9IGluZm87XG4gICAgfVxuICAgIGlmICh0YWcgPT09ICdkZCcgfHwgdGFnID09PSAnZHQnKSB7XG4gICAgICBhbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3NpbmcgPSBpbmZvO1xuICAgIH1cblxuICAgIHJldHVybiBhbmNlc3RvckluZm87XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlclxuICAgKi9cbiAgdmFyIGlzVGFnVmFsaWRXaXRoUGFyZW50ID0gZnVuY3Rpb24gKHRhZywgcGFyZW50VGFnKSB7XG4gICAgLy8gRmlyc3QsIGxldCdzIGNoZWNrIGlmIHdlJ3JlIGluIGFuIHVudXN1YWwgcGFyc2luZyBtb2RlLi4uXG4gICAgc3dpdGNoIChwYXJlbnRUYWcpIHtcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnNlbGVjdFxuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ29wdGlvbicgfHwgdGFnID09PSAnb3B0Z3JvdXAnIHx8IHRhZyA9PT0gJyN0ZXh0JztcbiAgICAgIGNhc2UgJ29wdGdyb3VwJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ29wdGlvbicgfHwgdGFnID09PSAnI3RleHQnO1xuICAgICAgLy8gU3RyaWN0bHkgc3BlYWtpbmcsIHNlZWluZyBhbiA8b3B0aW9uPiBkb2Vzbid0IG1lYW4gd2UncmUgaW4gYSA8c2VsZWN0PlxuICAgICAgLy8gYnV0XG4gICAgICBjYXNlICdvcHRpb24nOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnI3RleHQnO1xuXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50ZFxuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluY2FwdGlvblxuICAgICAgLy8gTm8gc3BlY2lhbCBiZWhhdmlvciBzaW5jZSB0aGVzZSBydWxlcyBmYWxsIGJhY2sgdG8gXCJpbiBib2R5XCIgbW9kZSBmb3JcbiAgICAgIC8vIGFsbCBleGNlcHQgc3BlY2lhbCB0YWJsZSBub2RlcyB3aGljaCBjYXVzZSBiYWQgcGFyc2luZyBiZWhhdmlvciBhbnl3YXkuXG5cbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRyXG4gICAgICBjYXNlICd0cic6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICd0aCcgfHwgdGFnID09PSAndGQnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcblxuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGJvZHlcbiAgICAgIGNhc2UgJ3Rib2R5JzpcbiAgICAgIGNhc2UgJ3RoZWFkJzpcbiAgICAgIGNhc2UgJ3Rmb290JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ3RyJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG5cbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmNvbGdyb3VwXG4gICAgICBjYXNlICdjb2xncm91cCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdjb2wnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcblxuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGFibGVcbiAgICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2NhcHRpb24nIHx8IHRhZyA9PT0gJ2NvbGdyb3VwJyB8fCB0YWcgPT09ICd0Ym9keScgfHwgdGFnID09PSAndGZvb3QnIHx8IHRhZyA9PT0gJ3RoZWFkJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG5cbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmhlYWRcbiAgICAgIGNhc2UgJ2hlYWQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnYmFzZScgfHwgdGFnID09PSAnYmFzZWZvbnQnIHx8IHRhZyA9PT0gJ2Jnc291bmQnIHx8IHRhZyA9PT0gJ2xpbmsnIHx8IHRhZyA9PT0gJ21ldGEnIHx8IHRhZyA9PT0gJ3RpdGxlJyB8fCB0YWcgPT09ICdub3NjcmlwdCcgfHwgdGFnID09PSAnbm9mcmFtZXMnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcblxuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VtYW50aWNzLmh0bWwjdGhlLWh0bWwtZWxlbWVudFxuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdoZWFkJyB8fCB0YWcgPT09ICdib2R5JztcbiAgICAgIGNhc2UgJyNkb2N1bWVudCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdodG1sJztcbiAgICB9XG5cbiAgICAvLyBQcm9iYWJseSBpbiB0aGUgXCJpbiBib2R5XCIgcGFyc2luZyBtb2RlLCBzbyB3ZSBvdXRsYXcgb25seSB0YWcgY29tYm9zXG4gICAgLy8gd2hlcmUgdGhlIHBhcnNpbmcgcnVsZXMgY2F1c2UgaW1wbGljaXQgb3BlbnMgb3IgY2xvc2VzIHRvIGJlIGFkZGVkLlxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHlcbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSAnaDEnOlxuICAgICAgY2FzZSAnaDInOlxuICAgICAgY2FzZSAnaDMnOlxuICAgICAgY2FzZSAnaDQnOlxuICAgICAgY2FzZSAnaDUnOlxuICAgICAgY2FzZSAnaDYnOlxuICAgICAgICByZXR1cm4gcGFyZW50VGFnICE9PSAnaDEnICYmIHBhcmVudFRhZyAhPT0gJ2gyJyAmJiBwYXJlbnRUYWcgIT09ICdoMycgJiYgcGFyZW50VGFnICE9PSAnaDQnICYmIHBhcmVudFRhZyAhPT0gJ2g1JyAmJiBwYXJlbnRUYWcgIT09ICdoNic7XG5cbiAgICAgIGNhc2UgJ3JwJzpcbiAgICAgIGNhc2UgJ3J0JzpcbiAgICAgICAgcmV0dXJuIGltcGxpZWRFbmRUYWdzLmluZGV4T2YocGFyZW50VGFnKSA9PT0gLTE7XG5cbiAgICAgIGNhc2UgJ2JvZHknOlxuICAgICAgY2FzZSAnY2FwdGlvbic6XG4gICAgICBjYXNlICdjb2wnOlxuICAgICAgY2FzZSAnY29sZ3JvdXAnOlxuICAgICAgY2FzZSAnZnJhbWUnOlxuICAgICAgY2FzZSAnaGVhZCc6XG4gICAgICBjYXNlICdodG1sJzpcbiAgICAgIGNhc2UgJ3Rib2R5JzpcbiAgICAgIGNhc2UgJ3RkJzpcbiAgICAgIGNhc2UgJ3Rmb290JzpcbiAgICAgIGNhc2UgJ3RoJzpcbiAgICAgIGNhc2UgJ3RoZWFkJzpcbiAgICAgIGNhc2UgJ3RyJzpcbiAgICAgICAgLy8gVGhlc2UgdGFncyBhcmUgb25seSB2YWxpZCB3aXRoIGEgZmV3IHBhcmVudHMgdGhhdCBoYXZlIHNwZWNpYWwgY2hpbGRcbiAgICAgICAgLy8gcGFyc2luZyBydWxlcyAtLSBpZiB3ZSdyZSBkb3duIGhlcmUsIHRoZW4gbm9uZSBvZiB0aG9zZSBtYXRjaGVkIGFuZFxuICAgICAgICAvLyBzbyB3ZSBhbGxvdyBpdCBvbmx5IGlmIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgcGFyZW50IGlzLCBhcyBhbGwgb3RoZXJcbiAgICAgICAgLy8gY2FzZXMgYXJlIGludmFsaWQuXG4gICAgICAgIHJldHVybiBwYXJlbnRUYWcgPT0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyXG4gICAqL1xuICB2YXIgZmluZEludmFsaWRBbmNlc3RvckZvclRhZyA9IGZ1bmN0aW9uICh0YWcsIGFuY2VzdG9ySW5mbykge1xuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdhZGRyZXNzJzpcbiAgICAgIGNhc2UgJ2FydGljbGUnOlxuICAgICAgY2FzZSAnYXNpZGUnOlxuICAgICAgY2FzZSAnYmxvY2txdW90ZSc6XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgY2FzZSAnZGlyJzpcbiAgICAgIGNhc2UgJ2Rpdic6XG4gICAgICBjYXNlICdkbCc6XG4gICAgICBjYXNlICdmaWVsZHNldCc6XG4gICAgICBjYXNlICdmaWdjYXB0aW9uJzpcbiAgICAgIGNhc2UgJ2ZpZ3VyZSc6XG4gICAgICBjYXNlICdmb290ZXInOlxuICAgICAgY2FzZSAnaGVhZGVyJzpcbiAgICAgIGNhc2UgJ2hncm91cCc6XG4gICAgICBjYXNlICdtYWluJzpcbiAgICAgIGNhc2UgJ21lbnUnOlxuICAgICAgY2FzZSAnbmF2JzpcbiAgICAgIGNhc2UgJ29sJzpcbiAgICAgIGNhc2UgJ3AnOlxuICAgICAgY2FzZSAnc2VjdGlvbic6XG4gICAgICBjYXNlICdzdW1tYXJ5JzpcbiAgICAgIGNhc2UgJ3VsJzpcblxuICAgICAgY2FzZSAncHJlJzpcbiAgICAgIGNhc2UgJ2xpc3RpbmcnOlxuXG4gICAgICBjYXNlICd0YWJsZSc6XG5cbiAgICAgIGNhc2UgJ2hyJzpcblxuICAgICAgY2FzZSAneG1wJzpcblxuICAgICAgY2FzZSAnaDEnOlxuICAgICAgY2FzZSAnaDInOlxuICAgICAgY2FzZSAnaDMnOlxuICAgICAgY2FzZSAnaDQnOlxuICAgICAgY2FzZSAnaDUnOlxuICAgICAgY2FzZSAnaDYnOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlO1xuXG4gICAgICBjYXNlICdmb3JtJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5mb3JtVGFnIHx8IGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZTtcblxuICAgICAgY2FzZSAnbGknOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3Npbmc7XG5cbiAgICAgIGNhc2UgJ2RkJzpcbiAgICAgIGNhc2UgJ2R0JzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZztcblxuICAgICAgY2FzZSAnYnV0dG9uJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlO1xuXG4gICAgICBjYXNlICdhJzpcbiAgICAgICAgLy8gU3BlYyBzYXlzIHNvbWV0aGluZyBhYm91dCBzdG9yaW5nIGEgbGlzdCBvZiBtYXJrZXJzLCBidXQgaXQgc291bmRzXG4gICAgICAgIC8vIGVxdWl2YWxlbnQgdG8gdGhpcyBjaGVjay5cbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZTtcblxuICAgICAgY2FzZSAnbm9icic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgUmVhY3RDb21wb3NpdGVDb21wb25lbnQgaW5zdGFuY2UsIHJldHVybiBhIGxpc3Qgb2YgaXRzIHJlY3Vyc2l2ZVxuICAgKiBvd25lcnMsIHN0YXJ0aW5nIGF0IHRoZSByb290IGFuZCBlbmRpbmcgd2l0aCB0aGUgaW5zdGFuY2UgaXRzZWxmLlxuICAgKi9cbiAgdmFyIGZpbmRPd25lclN0YWNrID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHZhciBzdGFjayA9IFtdO1xuICAgIGRvIHtcbiAgICAgIHN0YWNrLnB1c2goaW5zdGFuY2UpO1xuICAgIH0gd2hpbGUgKGluc3RhbmNlID0gaW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lcik7XG4gICAgc3RhY2sucmV2ZXJzZSgpO1xuICAgIHJldHVybiBzdGFjaztcbiAgfTtcblxuICB2YXIgZGlkV2FybiA9IHt9O1xuXG4gIHZhbGlkYXRlRE9NTmVzdGluZyA9IGZ1bmN0aW9uIChjaGlsZFRhZywgY2hpbGRUZXh0LCBjaGlsZEluc3RhbmNlLCBhbmNlc3RvckluZm8pIHtcbiAgICBhbmNlc3RvckluZm8gPSBhbmNlc3RvckluZm8gfHwgZW1wdHlBbmNlc3RvckluZm87XG4gICAgdmFyIHBhcmVudEluZm8gPSBhbmNlc3RvckluZm8uY3VycmVudDtcbiAgICB2YXIgcGFyZW50VGFnID0gcGFyZW50SW5mbyAmJiBwYXJlbnRJbmZvLnRhZztcblxuICAgIGlmIChjaGlsZFRleHQgIT0gbnVsbCkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoY2hpbGRUYWcgPT0gbnVsbCwgJ3ZhbGlkYXRlRE9NTmVzdGluZzogd2hlbiBjaGlsZFRleHQgaXMgcGFzc2VkLCBjaGlsZFRhZyBzaG91bGQgYmUgbnVsbCcpIDogdm9pZCAwO1xuICAgICAgY2hpbGRUYWcgPSAnI3RleHQnO1xuICAgIH1cblxuICAgIHZhciBpbnZhbGlkUGFyZW50ID0gaXNUYWdWYWxpZFdpdGhQYXJlbnQoY2hpbGRUYWcsIHBhcmVudFRhZykgPyBudWxsIDogcGFyZW50SW5mbztcbiAgICB2YXIgaW52YWxpZEFuY2VzdG9yID0gaW52YWxpZFBhcmVudCA/IG51bGwgOiBmaW5kSW52YWxpZEFuY2VzdG9yRm9yVGFnKGNoaWxkVGFnLCBhbmNlc3RvckluZm8pO1xuICAgIHZhciBwcm9ibGVtYXRpYyA9IGludmFsaWRQYXJlbnQgfHwgaW52YWxpZEFuY2VzdG9yO1xuXG4gICAgaWYgKHByb2JsZW1hdGljKSB7XG4gICAgICB2YXIgYW5jZXN0b3JUYWcgPSBwcm9ibGVtYXRpYy50YWc7XG4gICAgICB2YXIgYW5jZXN0b3JJbnN0YW5jZSA9IHByb2JsZW1hdGljLmluc3RhbmNlO1xuXG4gICAgICB2YXIgY2hpbGRPd25lciA9IGNoaWxkSW5zdGFuY2UgJiYgY2hpbGRJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIGFuY2VzdG9yT3duZXIgPSBhbmNlc3Rvckluc3RhbmNlICYmIGFuY2VzdG9ySW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjtcblxuICAgICAgdmFyIGNoaWxkT3duZXJzID0gZmluZE93bmVyU3RhY2soY2hpbGRPd25lcik7XG4gICAgICB2YXIgYW5jZXN0b3JPd25lcnMgPSBmaW5kT3duZXJTdGFjayhhbmNlc3Rvck93bmVyKTtcblxuICAgICAgdmFyIG1pblN0YWNrTGVuID0gTWF0aC5taW4oY2hpbGRPd25lcnMubGVuZ3RoLCBhbmNlc3Rvck93bmVycy5sZW5ndGgpO1xuICAgICAgdmFyIGk7XG5cbiAgICAgIHZhciBkZWVwZXN0Q29tbW9uID0gLTE7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbWluU3RhY2tMZW47IGkrKykge1xuICAgICAgICBpZiAoY2hpbGRPd25lcnNbaV0gPT09IGFuY2VzdG9yT3duZXJzW2ldKSB7XG4gICAgICAgICAgZGVlcGVzdENvbW1vbiA9IGk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIFVOS05PV04gPSAnKHVua25vd24pJztcbiAgICAgIHZhciBjaGlsZE93bmVyTmFtZXMgPSBjaGlsZE93bmVycy5zbGljZShkZWVwZXN0Q29tbW9uICsgMSkubWFwKGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgICAgIHJldHVybiBpbnN0LmdldE5hbWUoKSB8fCBVTktOT1dOO1xuICAgICAgfSk7XG4gICAgICB2YXIgYW5jZXN0b3JPd25lck5hbWVzID0gYW5jZXN0b3JPd25lcnMuc2xpY2UoZGVlcGVzdENvbW1vbiArIDEpLm1hcChmdW5jdGlvbiAoaW5zdCkge1xuICAgICAgICByZXR1cm4gaW5zdC5nZXROYW1lKCkgfHwgVU5LTk9XTjtcbiAgICAgIH0pO1xuICAgICAgdmFyIG93bmVySW5mbyA9IFtdLmNvbmNhdChcbiAgICAgIC8vIElmIHRoZSBwYXJlbnQgYW5kIGNoaWxkIGluc3RhbmNlcyBoYXZlIGEgY29tbW9uIG93bmVyIGFuY2VzdG9yLCBzdGFydFxuICAgICAgLy8gd2l0aCB0aGF0IC0tIG90aGVyd2lzZSB3ZSBqdXN0IHN0YXJ0IHdpdGggdGhlIHBhcmVudCdzIG93bmVycy5cbiAgICAgIGRlZXBlc3RDb21tb24gIT09IC0xID8gY2hpbGRPd25lcnNbZGVlcGVzdENvbW1vbl0uZ2V0TmFtZSgpIHx8IFVOS05PV04gOiBbXSwgYW5jZXN0b3JPd25lck5hbWVzLCBhbmNlc3RvclRhZyxcbiAgICAgIC8vIElmIHdlJ3JlIHdhcm5pbmcgYWJvdXQgYW4gaW52YWxpZCAobm9uLXBhcmVudCkgYW5jZXN0cnksIGFkZCAnLi4uJ1xuICAgICAgaW52YWxpZEFuY2VzdG9yID8gWycuLi4nXSA6IFtdLCBjaGlsZE93bmVyTmFtZXMsIGNoaWxkVGFnKS5qb2luKCcgPiAnKTtcblxuICAgICAgdmFyIHdhcm5LZXkgPSAhIWludmFsaWRQYXJlbnQgKyAnfCcgKyBjaGlsZFRhZyArICd8JyArIGFuY2VzdG9yVGFnICsgJ3wnICsgb3duZXJJbmZvO1xuICAgICAgaWYgKGRpZFdhcm5bd2FybktleV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZGlkV2Fyblt3YXJuS2V5XSA9IHRydWU7XG5cbiAgICAgIHZhciB0YWdEaXNwbGF5TmFtZSA9IGNoaWxkVGFnO1xuICAgICAgdmFyIHdoaXRlc3BhY2VJbmZvID0gJyc7XG4gICAgICBpZiAoY2hpbGRUYWcgPT09ICcjdGV4dCcpIHtcbiAgICAgICAgaWYgKC9cXFMvLnRlc3QoY2hpbGRUZXh0KSkge1xuICAgICAgICAgIHRhZ0Rpc3BsYXlOYW1lID0gJ1RleHQgbm9kZXMnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhZ0Rpc3BsYXlOYW1lID0gJ1doaXRlc3BhY2UgdGV4dCBub2Rlcyc7XG4gICAgICAgICAgd2hpdGVzcGFjZUluZm8gPSAnIE1ha2Ugc3VyZSB5b3UgZG9uXFwndCBoYXZlIGFueSBleHRyYSB3aGl0ZXNwYWNlIGJldHdlZW4gdGFncyBvbiAnICsgJ2VhY2ggbGluZSBvZiB5b3VyIHNvdXJjZSBjb2RlLic7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhZ0Rpc3BsYXlOYW1lID0gJzwnICsgY2hpbGRUYWcgKyAnPic7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbnZhbGlkUGFyZW50KSB7XG4gICAgICAgIHZhciBpbmZvID0gJyc7XG4gICAgICAgIGlmIChhbmNlc3RvclRhZyA9PT0gJ3RhYmxlJyAmJiBjaGlsZFRhZyA9PT0gJ3RyJykge1xuICAgICAgICAgIGluZm8gKz0gJyBBZGQgYSA8dGJvZHk+IHRvIHlvdXIgY29kZSB0byBtYXRjaCB0aGUgRE9NIHRyZWUgZ2VuZXJhdGVkIGJ5ICcgKyAndGhlIGJyb3dzZXIuJztcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgY2hpbGQgb2YgPCVzPi4lcyAnICsgJ1NlZSAlcy4lcycsIHRhZ0Rpc3BsYXlOYW1lLCBhbmNlc3RvclRhZywgd2hpdGVzcGFjZUluZm8sIG93bmVySW5mbywgaW5mbykgOiB2b2lkIDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgZGVzY2VuZGFudCBvZiAnICsgJzwlcz4uIFNlZSAlcy4nLCB0YWdEaXNwbGF5TmFtZSwgYW5jZXN0b3JUYWcsIG93bmVySW5mbykgOiB2b2lkIDA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHZhbGlkYXRlRE9NTmVzdGluZy51cGRhdGVkQW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbztcblxuICAvLyBGb3IgdGVzdGluZ1xuICB2YWxpZGF0ZURPTU5lc3RpbmcuaXNUYWdWYWxpZEluQ29udGV4dCA9IGZ1bmN0aW9uICh0YWcsIGFuY2VzdG9ySW5mbykge1xuICAgIGFuY2VzdG9ySW5mbyA9IGFuY2VzdG9ySW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbztcbiAgICB2YXIgcGFyZW50SW5mbyA9IGFuY2VzdG9ySW5mby5jdXJyZW50O1xuICAgIHZhciBwYXJlbnRUYWcgPSBwYXJlbnRJbmZvICYmIHBhcmVudEluZm8udGFnO1xuICAgIHJldHVybiBpc1RhZ1ZhbGlkV2l0aFBhcmVudCh0YWcsIHBhcmVudFRhZykgJiYgIWZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcodGFnLCBhbmNlc3RvckluZm8pO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHZhbGlkYXRlRE9NTmVzdGluZztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi92YWxpZGF0ZURPTU5lc3RpbmcuanNcbi8vIG1vZHVsZSBpZCA9IDMwOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 310 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _assign = __webpack_require__(176);\n\nvar DOMLazyTree = __webpack_require__(254);\nvar ReactDOMComponentTree = __webpack_require__(207);\n\nvar ReactDOMEmptyComponent = function (instantiate) {\n  // ReactCompositeComponent uses this:\n  this._currentElement = null;\n  // ReactDOMComponentTree uses these:\n  this._hostNode = null;\n  this._hostParent = null;\n  this._hostContainerInfo = null;\n  this._domID = 0;\n};\n_assign(ReactDOMEmptyComponent.prototype, {\n  mountComponent: function (transaction, hostParent, hostContainerInfo, context) {\n    var domID = hostContainerInfo._idCounter++;\n    this._domID = domID;\n    this._hostParent = hostParent;\n    this._hostContainerInfo = hostContainerInfo;\n\n    var nodeValue = ' react-empty: ' + this._domID + ' ';\n    if (transaction.useCreateElement) {\n      var ownerDocument = hostContainerInfo._ownerDocument;\n      var node = ownerDocument.createComment(nodeValue);\n      ReactDOMComponentTree.precacheNode(this, node);\n      return DOMLazyTree(node);\n    } else {\n      if (transaction.renderToStaticMarkup) {\n        // Normally we'd insert a comment node, but since this is a situation\n        // where React won't take over (static pages), we can simply return\n        // nothing.\n        return '';\n      }\n      return '<!--' + nodeValue + '-->';\n    }\n  },\n  receiveComponent: function () {},\n  getHostNode: function () {\n    return ReactDOMComponentTree.getNodeFromInstance(this);\n  },\n  unmountComponent: function () {\n    ReactDOMComponentTree.uncacheNode(this);\n  }\n});\n\nmodule.exports = ReactDOMEmptyComponent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzEwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NRW1wdHlDb21wb25lbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBET01MYXp5VHJlZSA9IHJlcXVpcmUoJy4vRE9NTGF6eVRyZWUnKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xuXG52YXIgUmVhY3RET01FbXB0eUNvbXBvbmVudCA9IGZ1bmN0aW9uIChpbnN0YW50aWF0ZSkge1xuICAvLyBSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCB1c2VzIHRoaXM6XG4gIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbnVsbDtcbiAgLy8gUmVhY3RET01Db21wb25lbnRUcmVlIHVzZXMgdGhlc2U6XG4gIHRoaXMuX2hvc3ROb2RlID0gbnVsbDtcbiAgdGhpcy5faG9zdFBhcmVudCA9IG51bGw7XG4gIHRoaXMuX2hvc3RDb250YWluZXJJbmZvID0gbnVsbDtcbiAgdGhpcy5fZG9tSUQgPSAwO1xufTtcbl9hc3NpZ24oUmVhY3RET01FbXB0eUNvbXBvbmVudC5wcm90b3R5cGUsIHtcbiAgbW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQpIHtcbiAgICB2YXIgZG9tSUQgPSBob3N0Q29udGFpbmVySW5mby5faWRDb3VudGVyKys7XG4gICAgdGhpcy5fZG9tSUQgPSBkb21JRDtcbiAgICB0aGlzLl9ob3N0UGFyZW50ID0gaG9zdFBhcmVudDtcbiAgICB0aGlzLl9ob3N0Q29udGFpbmVySW5mbyA9IGhvc3RDb250YWluZXJJbmZvO1xuXG4gICAgdmFyIG5vZGVWYWx1ZSA9ICcgcmVhY3QtZW1wdHk6ICcgKyB0aGlzLl9kb21JRCArICcgJztcbiAgICBpZiAodHJhbnNhY3Rpb24udXNlQ3JlYXRlRWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyRG9jdW1lbnQgPSBob3N0Q29udGFpbmVySW5mby5fb3duZXJEb2N1bWVudDtcbiAgICAgIHZhciBub2RlID0gb3duZXJEb2N1bWVudC5jcmVhdGVDb21tZW50KG5vZGVWYWx1ZSk7XG4gICAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUucHJlY2FjaGVOb2RlKHRoaXMsIG5vZGUpO1xuICAgICAgcmV0dXJuIERPTUxhenlUcmVlKG5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHJhbnNhY3Rpb24ucmVuZGVyVG9TdGF0aWNNYXJrdXApIHtcbiAgICAgICAgLy8gTm9ybWFsbHkgd2UnZCBpbnNlcnQgYSBjb21tZW50IG5vZGUsIGJ1dCBzaW5jZSB0aGlzIGlzIGEgc2l0dWF0aW9uXG4gICAgICAgIC8vIHdoZXJlIFJlYWN0IHdvbid0IHRha2Ugb3ZlciAoc3RhdGljIHBhZ2VzKSwgd2UgY2FuIHNpbXBseSByZXR1cm5cbiAgICAgICAgLy8gbm90aGluZy5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgICAgcmV0dXJuICc8IS0tJyArIG5vZGVWYWx1ZSArICctLT4nO1xuICAgIH1cbiAgfSxcbiAgcmVjZWl2ZUNvbXBvbmVudDogZnVuY3Rpb24gKCkge30sXG4gIGdldEhvc3ROb2RlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHRoaXMpO1xuICB9LFxuICB1bm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgUmVhY3RET01Db21wb25lbnRUcmVlLnVuY2FjaGVOb2RlKHRoaXMpO1xuICB9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUVtcHR5Q29tcG9uZW50O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0RE9NRW1wdHlDb21wb25lbnQuanNcbi8vIG1vZHVsZSBpZCA9IDMxMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 311 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2015-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nvar invariant = __webpack_require__(180);\n\n/**\n * Return the lowest common ancestor of A and B, or null if they are in\n * different trees.\n */\nfunction getLowestCommonAncestor(instA, instB) {\n  !('_hostNode' in instA) ?  true ? invariant(false, 'getNodeFromInstance: Invalid argument.') : _prodInvariant('33') : void 0;\n  !('_hostNode' in instB) ?  true ? invariant(false, 'getNodeFromInstance: Invalid argument.') : _prodInvariant('33') : void 0;\n\n  var depthA = 0;\n  for (var tempA = instA; tempA; tempA = tempA._hostParent) {\n    depthA++;\n  }\n  var depthB = 0;\n  for (var tempB = instB; tempB; tempB = tempB._hostParent) {\n    depthB++;\n  }\n\n  // If A is deeper, crawl up.\n  while (depthA - depthB > 0) {\n    instA = instA._hostParent;\n    depthA--;\n  }\n\n  // If B is deeper, crawl up.\n  while (depthB - depthA > 0) {\n    instB = instB._hostParent;\n    depthB--;\n  }\n\n  // Walk in lockstep until we find a match.\n  var depth = depthA;\n  while (depth--) {\n    if (instA === instB) {\n      return instA;\n    }\n    instA = instA._hostParent;\n    instB = instB._hostParent;\n  }\n  return null;\n}\n\n/**\n * Return if A is an ancestor of B.\n */\nfunction isAncestor(instA, instB) {\n  !('_hostNode' in instA) ?  true ? invariant(false, 'isAncestor: Invalid argument.') : _prodInvariant('35') : void 0;\n  !('_hostNode' in instB) ?  true ? invariant(false, 'isAncestor: Invalid argument.') : _prodInvariant('35') : void 0;\n\n  while (instB) {\n    if (instB === instA) {\n      return true;\n    }\n    instB = instB._hostParent;\n  }\n  return false;\n}\n\n/**\n * Return the parent instance of the passed-in instance.\n */\nfunction getParentInstance(inst) {\n  !('_hostNode' in inst) ?  true ? invariant(false, 'getParentInstance: Invalid argument.') : _prodInvariant('36') : void 0;\n\n  return inst._hostParent;\n}\n\n/**\n * Simulates the traversal of a two-phase, capture/bubble event dispatch.\n */\nfunction traverseTwoPhase(inst, fn, arg) {\n  var path = [];\n  while (inst) {\n    path.push(inst);\n    inst = inst._hostParent;\n  }\n  var i;\n  for (i = path.length; i-- > 0;) {\n    fn(path[i], 'captured', arg);\n  }\n  for (i = 0; i < path.length; i++) {\n    fn(path[i], 'bubbled', arg);\n  }\n}\n\n/**\n * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that\n * should would receive a `mouseEnter` or `mouseLeave` event.\n *\n * Does not invoke the callback on the nearest common ancestor because nothing\n * \"entered\" or \"left\" that element.\n */\nfunction traverseEnterLeave(from, to, fn, argFrom, argTo) {\n  var common = from && to ? getLowestCommonAncestor(from, to) : null;\n  var pathFrom = [];\n  while (from && from !== common) {\n    pathFrom.push(from);\n    from = from._hostParent;\n  }\n  var pathTo = [];\n  while (to && to !== common) {\n    pathTo.push(to);\n    to = to._hostParent;\n  }\n  var i;\n  for (i = 0; i < pathFrom.length; i++) {\n    fn(pathFrom[i], 'bubbled', argFrom);\n  }\n  for (i = pathTo.length; i-- > 0;) {\n    fn(pathTo[i], 'captured', argTo);\n  }\n}\n\nmodule.exports = {\n  isAncestor: isAncestor,\n  getLowestCommonAncestor: getLowestCommonAncestor,\n  getParentInstance: getParentInstance,\n  traverseTwoPhase: traverseTwoPhase,\n  traverseEnterLeave: traverseEnterLeave\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzExLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NVHJlZVRyYXZlcnNhbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDE1LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogUmV0dXJuIHRoZSBsb3dlc3QgY29tbW9uIGFuY2VzdG9yIG9mIEEgYW5kIEIsIG9yIG51bGwgaWYgdGhleSBhcmUgaW5cbiAqIGRpZmZlcmVudCB0cmVlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoaW5zdEEsIGluc3RCKSB7XG4gICEoJ19ob3N0Tm9kZScgaW4gaW5zdEEpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2dldE5vZGVGcm9tSW5zdGFuY2U6IEludmFsaWQgYXJndW1lbnQuJykgOiBfcHJvZEludmFyaWFudCgnMzMnKSA6IHZvaWQgMDtcbiAgISgnX2hvc3ROb2RlJyBpbiBpbnN0QikgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnZ2V0Tm9kZUZyb21JbnN0YW5jZTogSW52YWxpZCBhcmd1bWVudC4nKSA6IF9wcm9kSW52YXJpYW50KCczMycpIDogdm9pZCAwO1xuXG4gIHZhciBkZXB0aEEgPSAwO1xuICBmb3IgKHZhciB0ZW1wQSA9IGluc3RBOyB0ZW1wQTsgdGVtcEEgPSB0ZW1wQS5faG9zdFBhcmVudCkge1xuICAgIGRlcHRoQSsrO1xuICB9XG4gIHZhciBkZXB0aEIgPSAwO1xuICBmb3IgKHZhciB0ZW1wQiA9IGluc3RCOyB0ZW1wQjsgdGVtcEIgPSB0ZW1wQi5faG9zdFBhcmVudCkge1xuICAgIGRlcHRoQisrO1xuICB9XG5cbiAgLy8gSWYgQSBpcyBkZWVwZXIsIGNyYXdsIHVwLlxuICB3aGlsZSAoZGVwdGhBIC0gZGVwdGhCID4gMCkge1xuICAgIGluc3RBID0gaW5zdEEuX2hvc3RQYXJlbnQ7XG4gICAgZGVwdGhBLS07XG4gIH1cblxuICAvLyBJZiBCIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG4gIHdoaWxlIChkZXB0aEIgLSBkZXB0aEEgPiAwKSB7XG4gICAgaW5zdEIgPSBpbnN0Qi5faG9zdFBhcmVudDtcbiAgICBkZXB0aEItLTtcbiAgfVxuXG4gIC8vIFdhbGsgaW4gbG9ja3N0ZXAgdW50aWwgd2UgZmluZCBhIG1hdGNoLlxuICB2YXIgZGVwdGggPSBkZXB0aEE7XG4gIHdoaWxlIChkZXB0aC0tKSB7XG4gICAgaWYgKGluc3RBID09PSBpbnN0Qikge1xuICAgICAgcmV0dXJuIGluc3RBO1xuICAgIH1cbiAgICBpbnN0QSA9IGluc3RBLl9ob3N0UGFyZW50O1xuICAgIGluc3RCID0gaW5zdEIuX2hvc3RQYXJlbnQ7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUmV0dXJuIGlmIEEgaXMgYW4gYW5jZXN0b3Igb2YgQi5cbiAqL1xuZnVuY3Rpb24gaXNBbmNlc3RvcihpbnN0QSwgaW5zdEIpIHtcbiAgISgnX2hvc3ROb2RlJyBpbiBpbnN0QSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnaXNBbmNlc3RvcjogSW52YWxpZCBhcmd1bWVudC4nKSA6IF9wcm9kSW52YXJpYW50KCczNScpIDogdm9pZCAwO1xuICAhKCdfaG9zdE5vZGUnIGluIGluc3RCKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdpc0FuY2VzdG9yOiBJbnZhbGlkIGFyZ3VtZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzM1JykgOiB2b2lkIDA7XG5cbiAgd2hpbGUgKGluc3RCKSB7XG4gICAgaWYgKGluc3RCID09PSBpbnN0QSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGluc3RCID0gaW5zdEIuX2hvc3RQYXJlbnQ7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgcGFyZW50IGluc3RhbmNlIG9mIHRoZSBwYXNzZWQtaW4gaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGdldFBhcmVudEluc3RhbmNlKGluc3QpIHtcbiAgISgnX2hvc3ROb2RlJyBpbiBpbnN0KSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdnZXRQYXJlbnRJbnN0YW5jZTogSW52YWxpZCBhcmd1bWVudC4nKSA6IF9wcm9kSW52YXJpYW50KCczNicpIDogdm9pZCAwO1xuXG4gIHJldHVybiBpbnN0Ll9ob3N0UGFyZW50O1xufVxuXG4vKipcbiAqIFNpbXVsYXRlcyB0aGUgdHJhdmVyc2FsIG9mIGEgdHdvLXBoYXNlLCBjYXB0dXJlL2J1YmJsZSBldmVudCBkaXNwYXRjaC5cbiAqL1xuZnVuY3Rpb24gdHJhdmVyc2VUd29QaGFzZShpbnN0LCBmbiwgYXJnKSB7XG4gIHZhciBwYXRoID0gW107XG4gIHdoaWxlIChpbnN0KSB7XG4gICAgcGF0aC5wdXNoKGluc3QpO1xuICAgIGluc3QgPSBpbnN0Ll9ob3N0UGFyZW50O1xuICB9XG4gIHZhciBpO1xuICBmb3IgKGkgPSBwYXRoLmxlbmd0aDsgaS0tID4gMDspIHtcbiAgICBmbihwYXRoW2ldLCAnY2FwdHVyZWQnLCBhcmcpO1xuICB9XG4gIGZvciAoaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgZm4ocGF0aFtpXSwgJ2J1YmJsZWQnLCBhcmcpO1xuICB9XG59XG5cbi8qKlxuICogVHJhdmVyc2VzIHRoZSBJRCBoaWVyYXJjaHkgYW5kIGludm9rZXMgdGhlIHN1cHBsaWVkIGBjYmAgb24gYW55IElEcyB0aGF0XG4gKiBzaG91bGQgd291bGQgcmVjZWl2ZSBhIGBtb3VzZUVudGVyYCBvciBgbW91c2VMZWF2ZWAgZXZlbnQuXG4gKlxuICogRG9lcyBub3QgaW52b2tlIHRoZSBjYWxsYmFjayBvbiB0aGUgbmVhcmVzdCBjb21tb24gYW5jZXN0b3IgYmVjYXVzZSBub3RoaW5nXG4gKiBcImVudGVyZWRcIiBvciBcImxlZnRcIiB0aGF0IGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIHRyYXZlcnNlRW50ZXJMZWF2ZShmcm9tLCB0bywgZm4sIGFyZ0Zyb20sIGFyZ1RvKSB7XG4gIHZhciBjb21tb24gPSBmcm9tICYmIHRvID8gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoZnJvbSwgdG8pIDogbnVsbDtcbiAgdmFyIHBhdGhGcm9tID0gW107XG4gIHdoaWxlIChmcm9tICYmIGZyb20gIT09IGNvbW1vbikge1xuICAgIHBhdGhGcm9tLnB1c2goZnJvbSk7XG4gICAgZnJvbSA9IGZyb20uX2hvc3RQYXJlbnQ7XG4gIH1cbiAgdmFyIHBhdGhUbyA9IFtdO1xuICB3aGlsZSAodG8gJiYgdG8gIT09IGNvbW1vbikge1xuICAgIHBhdGhUby5wdXNoKHRvKTtcbiAgICB0byA9IHRvLl9ob3N0UGFyZW50O1xuICB9XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBpIDwgcGF0aEZyb20ubGVuZ3RoOyBpKyspIHtcbiAgICBmbihwYXRoRnJvbVtpXSwgJ2J1YmJsZWQnLCBhcmdGcm9tKTtcbiAgfVxuICBmb3IgKGkgPSBwYXRoVG8ubGVuZ3RoOyBpLS0gPiAwOykge1xuICAgIGZuKHBhdGhUb1tpXSwgJ2NhcHR1cmVkJywgYXJnVG8pO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc0FuY2VzdG9yOiBpc0FuY2VzdG9yLFxuICBnZXRMb3dlc3RDb21tb25BbmNlc3RvcjogZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IsXG4gIGdldFBhcmVudEluc3RhbmNlOiBnZXRQYXJlbnRJbnN0YW5jZSxcbiAgdHJhdmVyc2VUd29QaGFzZTogdHJhdmVyc2VUd29QaGFzZSxcbiAgdHJhdmVyc2VFbnRlckxlYXZlOiB0cmF2ZXJzZUVudGVyTGVhdmVcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RET01UcmVlVHJhdmVyc2FsLmpzXG4vLyBtb2R1bGUgaWQgPSAzMTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 312 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208),\n    _assign = __webpack_require__(176);\n\nvar DOMChildrenOperations = __webpack_require__(253);\nvar DOMLazyTree = __webpack_require__(254);\nvar ReactDOMComponentTree = __webpack_require__(207);\n\nvar escapeTextContentForBrowser = __webpack_require__(259);\nvar invariant = __webpack_require__(180);\nvar validateDOMNesting = __webpack_require__(309);\n\n/**\n * Text nodes violate a couple assumptions that React makes about components:\n *\n *  - When mounting text into the DOM, adjacent text nodes are merged.\n *  - Text nodes cannot be assigned a React root ID.\n *\n * This component is used to wrap strings between comment nodes so that they\n * can undergo the same reconciliation that is applied to elements.\n *\n * TODO: Investigate representing React components in the DOM with text nodes.\n *\n * @class ReactDOMTextComponent\n * @extends ReactComponent\n * @internal\n */\nvar ReactDOMTextComponent = function (text) {\n  // TODO: This is really a ReactText (ReactNode), not a ReactElement\n  this._currentElement = text;\n  this._stringText = '' + text;\n  // ReactDOMComponentTree uses these:\n  this._hostNode = null;\n  this._hostParent = null;\n\n  // Properties\n  this._domID = 0;\n  this._mountIndex = 0;\n  this._closingComment = null;\n  this._commentNodes = null;\n};\n\n_assign(ReactDOMTextComponent.prototype, {\n\n  /**\n   * Creates the markup for this text node. This node is not intended to have\n   * any features besides containing text content.\n   *\n   * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n   * @return {string} Markup for this text node.\n   * @internal\n   */\n  mountComponent: function (transaction, hostParent, hostContainerInfo, context) {\n    if (true) {\n      var parentInfo;\n      if (hostParent != null) {\n        parentInfo = hostParent._ancestorInfo;\n      } else if (hostContainerInfo != null) {\n        parentInfo = hostContainerInfo._ancestorInfo;\n      }\n      if (parentInfo) {\n        // parentInfo should always be present except for the top-level\n        // component when server rendering\n        validateDOMNesting(null, this._stringText, this, parentInfo);\n      }\n    }\n\n    var domID = hostContainerInfo._idCounter++;\n    var openingValue = ' react-text: ' + domID + ' ';\n    var closingValue = ' /react-text ';\n    this._domID = domID;\n    this._hostParent = hostParent;\n    if (transaction.useCreateElement) {\n      var ownerDocument = hostContainerInfo._ownerDocument;\n      var openingComment = ownerDocument.createComment(openingValue);\n      var closingComment = ownerDocument.createComment(closingValue);\n      var lazyTree = DOMLazyTree(ownerDocument.createDocumentFragment());\n      DOMLazyTree.queueChild(lazyTree, DOMLazyTree(openingComment));\n      if (this._stringText) {\n        DOMLazyTree.queueChild(lazyTree, DOMLazyTree(ownerDocument.createTextNode(this._stringText)));\n      }\n      DOMLazyTree.queueChild(lazyTree, DOMLazyTree(closingComment));\n      ReactDOMComponentTree.precacheNode(this, openingComment);\n      this._closingComment = closingComment;\n      return lazyTree;\n    } else {\n      var escapedText = escapeTextContentForBrowser(this._stringText);\n\n      if (transaction.renderToStaticMarkup) {\n        // Normally we'd wrap this between comment nodes for the reasons stated\n        // above, but since this is a situation where React won't take over\n        // (static pages), we can simply return the text as it is.\n        return escapedText;\n      }\n\n      return '<!--' + openingValue + '-->' + escapedText + '<!--' + closingValue + '-->';\n    }\n  },\n\n  /**\n   * Updates this component by updating the text content.\n   *\n   * @param {ReactText} nextText The next text content\n   * @param {ReactReconcileTransaction} transaction\n   * @internal\n   */\n  receiveComponent: function (nextText, transaction) {\n    if (nextText !== this._currentElement) {\n      this._currentElement = nextText;\n      var nextStringText = '' + nextText;\n      if (nextStringText !== this._stringText) {\n        // TODO: Save this as pending props and use performUpdateIfNecessary\n        // and/or updateComponent to do the actual update for consistency with\n        // other component types?\n        this._stringText = nextStringText;\n        var commentNodes = this.getHostNode();\n        DOMChildrenOperations.replaceDelimitedText(commentNodes[0], commentNodes[1], nextStringText);\n      }\n    }\n  },\n\n  getHostNode: function () {\n    var hostNode = this._commentNodes;\n    if (hostNode) {\n      return hostNode;\n    }\n    if (!this._closingComment) {\n      var openingComment = ReactDOMComponentTree.getNodeFromInstance(this);\n      var node = openingComment.nextSibling;\n      while (true) {\n        !(node != null) ?  true ? invariant(false, 'Missing closing comment for text component %s', this._domID) : _prodInvariant('67', this._domID) : void 0;\n        if (node.nodeType === 8 && node.nodeValue === ' /react-text ') {\n          this._closingComment = node;\n          break;\n        }\n        node = node.nextSibling;\n      }\n    }\n    hostNode = [this._hostNode, this._closingComment];\n    this._commentNodes = hostNode;\n    return hostNode;\n  },\n\n  unmountComponent: function () {\n    this._closingComment = null;\n    this._commentNodes = null;\n    ReactDOMComponentTree.uncacheNode(this);\n  }\n\n});\n\nmodule.exports = ReactDOMTextComponent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzEyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NVGV4dENvbXBvbmVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpLFxuICAgIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBET01DaGlsZHJlbk9wZXJhdGlvbnMgPSByZXF1aXJlKCcuL0RPTUNoaWxkcmVuT3BlcmF0aW9ucycpO1xudmFyIERPTUxhenlUcmVlID0gcmVxdWlyZSgnLi9ET01MYXp5VHJlZScpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG5cbnZhciBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIgPSByZXF1aXJlKCcuL2VzY2FwZVRleHRDb250ZW50Rm9yQnJvd3NlcicpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHZhbGlkYXRlRE9NTmVzdGluZyA9IHJlcXVpcmUoJy4vdmFsaWRhdGVET01OZXN0aW5nJyk7XG5cbi8qKlxuICogVGV4dCBub2RlcyB2aW9sYXRlIGEgY291cGxlIGFzc3VtcHRpb25zIHRoYXQgUmVhY3QgbWFrZXMgYWJvdXQgY29tcG9uZW50czpcbiAqXG4gKiAgLSBXaGVuIG1vdW50aW5nIHRleHQgaW50byB0aGUgRE9NLCBhZGphY2VudCB0ZXh0IG5vZGVzIGFyZSBtZXJnZWQuXG4gKiAgLSBUZXh0IG5vZGVzIGNhbm5vdCBiZSBhc3NpZ25lZCBhIFJlYWN0IHJvb3QgSUQuXG4gKlxuICogVGhpcyBjb21wb25lbnQgaXMgdXNlZCB0byB3cmFwIHN0cmluZ3MgYmV0d2VlbiBjb21tZW50IG5vZGVzIHNvIHRoYXQgdGhleVxuICogY2FuIHVuZGVyZ28gdGhlIHNhbWUgcmVjb25jaWxpYXRpb24gdGhhdCBpcyBhcHBsaWVkIHRvIGVsZW1lbnRzLlxuICpcbiAqIFRPRE86IEludmVzdGlnYXRlIHJlcHJlc2VudGluZyBSZWFjdCBjb21wb25lbnRzIGluIHRoZSBET00gd2l0aCB0ZXh0IG5vZGVzLlxuICpcbiAqIEBjbGFzcyBSZWFjdERPTVRleHRDb21wb25lbnRcbiAqIEBleHRlbmRzIFJlYWN0Q29tcG9uZW50XG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIFJlYWN0RE9NVGV4dENvbXBvbmVudCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gIC8vIFRPRE86IFRoaXMgaXMgcmVhbGx5IGEgUmVhY3RUZXh0IChSZWFjdE5vZGUpLCBub3QgYSBSZWFjdEVsZW1lbnRcbiAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSB0ZXh0O1xuICB0aGlzLl9zdHJpbmdUZXh0ID0gJycgKyB0ZXh0O1xuICAvLyBSZWFjdERPTUNvbXBvbmVudFRyZWUgdXNlcyB0aGVzZTpcbiAgdGhpcy5faG9zdE5vZGUgPSBudWxsO1xuICB0aGlzLl9ob3N0UGFyZW50ID0gbnVsbDtcblxuICAvLyBQcm9wZXJ0aWVzXG4gIHRoaXMuX2RvbUlEID0gMDtcbiAgdGhpcy5fbW91bnRJbmRleCA9IDA7XG4gIHRoaXMuX2Nsb3NpbmdDb21tZW50ID0gbnVsbDtcbiAgdGhpcy5fY29tbWVudE5vZGVzID0gbnVsbDtcbn07XG5cbl9hc3NpZ24oUmVhY3RET01UZXh0Q29tcG9uZW50LnByb3RvdHlwZSwge1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBtYXJrdXAgZm9yIHRoaXMgdGV4dCBub2RlLiBUaGlzIG5vZGUgaXMgbm90IGludGVuZGVkIHRvIGhhdmVcbiAgICogYW55IGZlYXR1cmVzIGJlc2lkZXMgY29udGFpbmluZyB0ZXh0IGNvbnRlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbnxSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IE1hcmt1cCBmb3IgdGhpcyB0ZXh0IG5vZGUuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgbW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHBhcmVudEluZm87XG4gICAgICBpZiAoaG9zdFBhcmVudCAhPSBudWxsKSB7XG4gICAgICAgIHBhcmVudEluZm8gPSBob3N0UGFyZW50Ll9hbmNlc3RvckluZm87XG4gICAgICB9IGVsc2UgaWYgKGhvc3RDb250YWluZXJJbmZvICE9IG51bGwpIHtcbiAgICAgICAgcGFyZW50SW5mbyA9IGhvc3RDb250YWluZXJJbmZvLl9hbmNlc3RvckluZm87XG4gICAgICB9XG4gICAgICBpZiAocGFyZW50SW5mbykge1xuICAgICAgICAvLyBwYXJlbnRJbmZvIHNob3VsZCBhbHdheXMgYmUgcHJlc2VudCBleGNlcHQgZm9yIHRoZSB0b3AtbGV2ZWxcbiAgICAgICAgLy8gY29tcG9uZW50IHdoZW4gc2VydmVyIHJlbmRlcmluZ1xuICAgICAgICB2YWxpZGF0ZURPTU5lc3RpbmcobnVsbCwgdGhpcy5fc3RyaW5nVGV4dCwgdGhpcywgcGFyZW50SW5mbyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRvbUlEID0gaG9zdENvbnRhaW5lckluZm8uX2lkQ291bnRlcisrO1xuICAgIHZhciBvcGVuaW5nVmFsdWUgPSAnIHJlYWN0LXRleHQ6ICcgKyBkb21JRCArICcgJztcbiAgICB2YXIgY2xvc2luZ1ZhbHVlID0gJyAvcmVhY3QtdGV4dCAnO1xuICAgIHRoaXMuX2RvbUlEID0gZG9tSUQ7XG4gICAgdGhpcy5faG9zdFBhcmVudCA9IGhvc3RQYXJlbnQ7XG4gICAgaWYgKHRyYW5zYWN0aW9uLnVzZUNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lckRvY3VtZW50ID0gaG9zdENvbnRhaW5lckluZm8uX293bmVyRG9jdW1lbnQ7XG4gICAgICB2YXIgb3BlbmluZ0NvbW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUNvbW1lbnQob3BlbmluZ1ZhbHVlKTtcbiAgICAgIHZhciBjbG9zaW5nQ29tbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlQ29tbWVudChjbG9zaW5nVmFsdWUpO1xuICAgICAgdmFyIGxhenlUcmVlID0gRE9NTGF6eVRyZWUob3duZXJEb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkpO1xuICAgICAgRE9NTGF6eVRyZWUucXVldWVDaGlsZChsYXp5VHJlZSwgRE9NTGF6eVRyZWUob3BlbmluZ0NvbW1lbnQpKTtcbiAgICAgIGlmICh0aGlzLl9zdHJpbmdUZXh0KSB7XG4gICAgICAgIERPTUxhenlUcmVlLnF1ZXVlQ2hpbGQobGF6eVRyZWUsIERPTUxhenlUcmVlKG93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5fc3RyaW5nVGV4dCkpKTtcbiAgICAgIH1cbiAgICAgIERPTUxhenlUcmVlLnF1ZXVlQ2hpbGQobGF6eVRyZWUsIERPTUxhenlUcmVlKGNsb3NpbmdDb21tZW50KSk7XG4gICAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUucHJlY2FjaGVOb2RlKHRoaXMsIG9wZW5pbmdDb21tZW50KTtcbiAgICAgIHRoaXMuX2Nsb3NpbmdDb21tZW50ID0gY2xvc2luZ0NvbW1lbnQ7XG4gICAgICByZXR1cm4gbGF6eVRyZWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBlc2NhcGVkVGV4dCA9IGVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3Nlcih0aGlzLl9zdHJpbmdUZXh0KTtcblxuICAgICAgaWYgKHRyYW5zYWN0aW9uLnJlbmRlclRvU3RhdGljTWFya3VwKSB7XG4gICAgICAgIC8vIE5vcm1hbGx5IHdlJ2Qgd3JhcCB0aGlzIGJldHdlZW4gY29tbWVudCBub2RlcyBmb3IgdGhlIHJlYXNvbnMgc3RhdGVkXG4gICAgICAgIC8vIGFib3ZlLCBidXQgc2luY2UgdGhpcyBpcyBhIHNpdHVhdGlvbiB3aGVyZSBSZWFjdCB3b24ndCB0YWtlIG92ZXJcbiAgICAgICAgLy8gKHN0YXRpYyBwYWdlcyksIHdlIGNhbiBzaW1wbHkgcmV0dXJuIHRoZSB0ZXh0IGFzIGl0IGlzLlxuICAgICAgICByZXR1cm4gZXNjYXBlZFRleHQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnPCEtLScgKyBvcGVuaW5nVmFsdWUgKyAnLS0+JyArIGVzY2FwZWRUZXh0ICsgJzwhLS0nICsgY2xvc2luZ1ZhbHVlICsgJy0tPic7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoaXMgY29tcG9uZW50IGJ5IHVwZGF0aW5nIHRoZSB0ZXh0IGNvbnRlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RUZXh0fSBuZXh0VGV4dCBUaGUgbmV4dCB0ZXh0IGNvbnRlbnRcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlY2VpdmVDb21wb25lbnQ6IGZ1bmN0aW9uIChuZXh0VGV4dCwgdHJhbnNhY3Rpb24pIHtcbiAgICBpZiAobmV4dFRleHQgIT09IHRoaXMuX2N1cnJlbnRFbGVtZW50KSB7XG4gICAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IG5leHRUZXh0O1xuICAgICAgdmFyIG5leHRTdHJpbmdUZXh0ID0gJycgKyBuZXh0VGV4dDtcbiAgICAgIGlmIChuZXh0U3RyaW5nVGV4dCAhPT0gdGhpcy5fc3RyaW5nVGV4dCkge1xuICAgICAgICAvLyBUT0RPOiBTYXZlIHRoaXMgYXMgcGVuZGluZyBwcm9wcyBhbmQgdXNlIHBlcmZvcm1VcGRhdGVJZk5lY2Vzc2FyeVxuICAgICAgICAvLyBhbmQvb3IgdXBkYXRlQ29tcG9uZW50IHRvIGRvIHRoZSBhY3R1YWwgdXBkYXRlIGZvciBjb25zaXN0ZW5jeSB3aXRoXG4gICAgICAgIC8vIG90aGVyIGNvbXBvbmVudCB0eXBlcz9cbiAgICAgICAgdGhpcy5fc3RyaW5nVGV4dCA9IG5leHRTdHJpbmdUZXh0O1xuICAgICAgICB2YXIgY29tbWVudE5vZGVzID0gdGhpcy5nZXRIb3N0Tm9kZSgpO1xuICAgICAgICBET01DaGlsZHJlbk9wZXJhdGlvbnMucmVwbGFjZURlbGltaXRlZFRleHQoY29tbWVudE5vZGVzWzBdLCBjb21tZW50Tm9kZXNbMV0sIG5leHRTdHJpbmdUZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgZ2V0SG9zdE5vZGU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaG9zdE5vZGUgPSB0aGlzLl9jb21tZW50Tm9kZXM7XG4gICAgaWYgKGhvc3ROb2RlKSB7XG4gICAgICByZXR1cm4gaG9zdE5vZGU7XG4gICAgfVxuICAgIGlmICghdGhpcy5fY2xvc2luZ0NvbW1lbnQpIHtcbiAgICAgIHZhciBvcGVuaW5nQ29tbWVudCA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHRoaXMpO1xuICAgICAgdmFyIG5vZGUgPSBvcGVuaW5nQ29tbWVudC5uZXh0U2libGluZztcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICEobm9kZSAhPSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdNaXNzaW5nIGNsb3NpbmcgY29tbWVudCBmb3IgdGV4dCBjb21wb25lbnQgJXMnLCB0aGlzLl9kb21JRCkgOiBfcHJvZEludmFyaWFudCgnNjcnLCB0aGlzLl9kb21JRCkgOiB2b2lkIDA7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSA4ICYmIG5vZGUubm9kZVZhbHVlID09PSAnIC9yZWFjdC10ZXh0ICcpIHtcbiAgICAgICAgICB0aGlzLl9jbG9zaW5nQ29tbWVudCA9IG5vZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICAgIGhvc3ROb2RlID0gW3RoaXMuX2hvc3ROb2RlLCB0aGlzLl9jbG9zaW5nQ29tbWVudF07XG4gICAgdGhpcy5fY29tbWVudE5vZGVzID0gaG9zdE5vZGU7XG4gICAgcmV0dXJuIGhvc3ROb2RlO1xuICB9LFxuXG4gIHVubW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9jbG9zaW5nQ29tbWVudCA9IG51bGw7XG4gICAgdGhpcy5fY29tbWVudE5vZGVzID0gbnVsbDtcbiAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUudW5jYWNoZU5vZGUodGhpcyk7XG4gIH1cblxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01UZXh0Q29tcG9uZW50O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0RE9NVGV4dENvbXBvbmVudC5qc1xuLy8gbW9kdWxlIGlkID0gMzEyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 313 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _assign = __webpack_require__(176);\n\nvar ReactUpdates = __webpack_require__(229);\nvar Transaction = __webpack_require__(241);\n\nvar emptyFunction = __webpack_require__(184);\n\nvar RESET_BATCHED_UPDATES = {\n  initialize: emptyFunction,\n  close: function () {\n    ReactDefaultBatchingStrategy.isBatchingUpdates = false;\n  }\n};\n\nvar FLUSH_BATCHED_UPDATES = {\n  initialize: emptyFunction,\n  close: ReactUpdates.flushBatchedUpdates.bind(ReactUpdates)\n};\n\nvar TRANSACTION_WRAPPERS = [FLUSH_BATCHED_UPDATES, RESET_BATCHED_UPDATES];\n\nfunction ReactDefaultBatchingStrategyTransaction() {\n  this.reinitializeTransaction();\n}\n\n_assign(ReactDefaultBatchingStrategyTransaction.prototype, Transaction, {\n  getTransactionWrappers: function () {\n    return TRANSACTION_WRAPPERS;\n  }\n});\n\nvar transaction = new ReactDefaultBatchingStrategyTransaction();\n\nvar ReactDefaultBatchingStrategy = {\n  isBatchingUpdates: false,\n\n  /**\n   * Call the provided function in a context within which calls to `setState`\n   * and friends are batched such that components aren't updated unnecessarily.\n   */\n  batchedUpdates: function (callback, a, b, c, d, e) {\n    var alreadyBatchingUpdates = ReactDefaultBatchingStrategy.isBatchingUpdates;\n\n    ReactDefaultBatchingStrategy.isBatchingUpdates = true;\n\n    // The code is written this way to avoid extra allocations\n    if (alreadyBatchingUpdates) {\n      return callback(a, b, c, d, e);\n    } else {\n      return transaction.perform(callback, null, a, b, c, d, e);\n    }\n  }\n};\n\nmodule.exports = ReactDefaultBatchingStrategy;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzEzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3kuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpO1xudmFyIFRyYW5zYWN0aW9uID0gcmVxdWlyZSgnLi9UcmFuc2FjdGlvbicpO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTtcblxudmFyIFJFU0VUX0JBVENIRURfVVBEQVRFUyA9IHtcbiAgaW5pdGlhbGl6ZTogZW1wdHlGdW5jdGlvbixcbiAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICBSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5LmlzQmF0Y2hpbmdVcGRhdGVzID0gZmFsc2U7XG4gIH1cbn07XG5cbnZhciBGTFVTSF9CQVRDSEVEX1VQREFURVMgPSB7XG4gIGluaXRpYWxpemU6IGVtcHR5RnVuY3Rpb24sXG4gIGNsb3NlOiBSZWFjdFVwZGF0ZXMuZmx1c2hCYXRjaGVkVXBkYXRlcy5iaW5kKFJlYWN0VXBkYXRlcylcbn07XG5cbnZhciBUUkFOU0FDVElPTl9XUkFQUEVSUyA9IFtGTFVTSF9CQVRDSEVEX1VQREFURVMsIFJFU0VUX0JBVENIRURfVVBEQVRFU107XG5cbmZ1bmN0aW9uIFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3lUcmFuc2FjdGlvbigpIHtcbiAgdGhpcy5yZWluaXRpYWxpemVUcmFuc2FjdGlvbigpO1xufVxuXG5fYXNzaWduKFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3lUcmFuc2FjdGlvbi5wcm90b3R5cGUsIFRyYW5zYWN0aW9uLCB7XG4gIGdldFRyYW5zYWN0aW9uV3JhcHBlcnM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gVFJBTlNBQ1RJT05fV1JBUFBFUlM7XG4gIH1cbn0pO1xuXG52YXIgdHJhbnNhY3Rpb24gPSBuZXcgUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneVRyYW5zYWN0aW9uKCk7XG5cbnZhciBSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5ID0ge1xuICBpc0JhdGNoaW5nVXBkYXRlczogZmFsc2UsXG5cbiAgLyoqXG4gICAqIENhbGwgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGluIGEgY29udGV4dCB3aXRoaW4gd2hpY2ggY2FsbHMgdG8gYHNldFN0YXRlYFxuICAgKiBhbmQgZnJpZW5kcyBhcmUgYmF0Y2hlZCBzdWNoIHRoYXQgY29tcG9uZW50cyBhcmVuJ3QgdXBkYXRlZCB1bm5lY2Vzc2FyaWx5LlxuICAgKi9cbiAgYmF0Y2hlZFVwZGF0ZXM6IGZ1bmN0aW9uIChjYWxsYmFjaywgYSwgYiwgYywgZCwgZSkge1xuICAgIHZhciBhbHJlYWR5QmF0Y2hpbmdVcGRhdGVzID0gUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneS5pc0JhdGNoaW5nVXBkYXRlcztcblxuICAgIFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3kuaXNCYXRjaGluZ1VwZGF0ZXMgPSB0cnVlO1xuXG4gICAgLy8gVGhlIGNvZGUgaXMgd3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCBleHRyYSBhbGxvY2F0aW9uc1xuICAgIGlmIChhbHJlYWR5QmF0Y2hpbmdVcGRhdGVzKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soYSwgYiwgYywgZCwgZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cmFuc2FjdGlvbi5wZXJmb3JtKGNhbGxiYWNrLCBudWxsLCBhLCBiLCBjLCBkLCBlKTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5LmpzXG4vLyBtb2R1bGUgaWQgPSAzMTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 314 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _assign = __webpack_require__(176);\n\nvar EventListener = __webpack_require__(315);\nvar ExecutionEnvironment = __webpack_require__(221);\nvar PooledClass = __webpack_require__(223);\nvar ReactDOMComponentTree = __webpack_require__(207);\nvar ReactUpdates = __webpack_require__(229);\n\nvar getEventTarget = __webpack_require__(242);\nvar getUnboundedScrollPosition = __webpack_require__(316);\n\n/**\n * Find the deepest React component completely containing the root of the\n * passed-in instance (for use when entire React trees are nested within each\n * other). If React trees are not nested, returns null.\n */\nfunction findParent(inst) {\n  // TODO: It may be a good idea to cache this to prevent unnecessary DOM\n  // traversal, but caching is difficult to do correctly without using a\n  // mutation observer to listen for all DOM changes.\n  while (inst._hostParent) {\n    inst = inst._hostParent;\n  }\n  var rootNode = ReactDOMComponentTree.getNodeFromInstance(inst);\n  var container = rootNode.parentNode;\n  return ReactDOMComponentTree.getClosestInstanceFromNode(container);\n}\n\n// Used to store ancestor hierarchy in top level callback\nfunction TopLevelCallbackBookKeeping(topLevelType, nativeEvent) {\n  this.topLevelType = topLevelType;\n  this.nativeEvent = nativeEvent;\n  this.ancestors = [];\n}\n_assign(TopLevelCallbackBookKeeping.prototype, {\n  destructor: function () {\n    this.topLevelType = null;\n    this.nativeEvent = null;\n    this.ancestors.length = 0;\n  }\n});\nPooledClass.addPoolingTo(TopLevelCallbackBookKeeping, PooledClass.twoArgumentPooler);\n\nfunction handleTopLevelImpl(bookKeeping) {\n  var nativeEventTarget = getEventTarget(bookKeeping.nativeEvent);\n  var targetInst = ReactDOMComponentTree.getClosestInstanceFromNode(nativeEventTarget);\n\n  // Loop through the hierarchy, in case there's any nested components.\n  // It's important that we build the array of ancestors before calling any\n  // event handlers, because event handlers can modify the DOM, leading to\n  // inconsistencies with ReactMount's node cache. See #1105.\n  var ancestor = targetInst;\n  do {\n    bookKeeping.ancestors.push(ancestor);\n    ancestor = ancestor && findParent(ancestor);\n  } while (ancestor);\n\n  for (var i = 0; i < bookKeeping.ancestors.length; i++) {\n    targetInst = bookKeeping.ancestors[i];\n    ReactEventListener._handleTopLevel(bookKeeping.topLevelType, targetInst, bookKeeping.nativeEvent, getEventTarget(bookKeeping.nativeEvent));\n  }\n}\n\nfunction scrollValueMonitor(cb) {\n  var scrollPosition = getUnboundedScrollPosition(window);\n  cb(scrollPosition);\n}\n\nvar ReactEventListener = {\n  _enabled: true,\n  _handleTopLevel: null,\n\n  WINDOW_HANDLE: ExecutionEnvironment.canUseDOM ? window : null,\n\n  setHandleTopLevel: function (handleTopLevel) {\n    ReactEventListener._handleTopLevel = handleTopLevel;\n  },\n\n  setEnabled: function (enabled) {\n    ReactEventListener._enabled = !!enabled;\n  },\n\n  isEnabled: function () {\n    return ReactEventListener._enabled;\n  },\n\n  /**\n   * Traps top-level events by using event bubbling.\n   *\n   * @param {string} topLevelType Record from `EventConstants`.\n   * @param {string} handlerBaseName Event name (e.g. \"click\").\n   * @param {object} element Element on which to attach listener.\n   * @return {?object} An object with a remove function which will forcefully\n   *                  remove the listener.\n   * @internal\n   */\n  trapBubbledEvent: function (topLevelType, handlerBaseName, element) {\n    if (!element) {\n      return null;\n    }\n    return EventListener.listen(element, handlerBaseName, ReactEventListener.dispatchEvent.bind(null, topLevelType));\n  },\n\n  /**\n   * Traps a top-level event by using event capturing.\n   *\n   * @param {string} topLevelType Record from `EventConstants`.\n   * @param {string} handlerBaseName Event name (e.g. \"click\").\n   * @param {object} element Element on which to attach listener.\n   * @return {?object} An object with a remove function which will forcefully\n   *                  remove the listener.\n   * @internal\n   */\n  trapCapturedEvent: function (topLevelType, handlerBaseName, element) {\n    if (!element) {\n      return null;\n    }\n    return EventListener.capture(element, handlerBaseName, ReactEventListener.dispatchEvent.bind(null, topLevelType));\n  },\n\n  monitorScrollValue: function (refresh) {\n    var callback = scrollValueMonitor.bind(null, refresh);\n    EventListener.listen(window, 'scroll', callback);\n  },\n\n  dispatchEvent: function (topLevelType, nativeEvent) {\n    if (!ReactEventListener._enabled) {\n      return;\n    }\n\n    var bookKeeping = TopLevelCallbackBookKeeping.getPooled(topLevelType, nativeEvent);\n    try {\n      // Event queue being processed in the same cycle allows\n      // `preventDefault`.\n      ReactUpdates.batchedUpdates(handleTopLevelImpl, bookKeeping);\n    } finally {\n      TopLevelCallbackBookKeeping.release(bookKeeping);\n    }\n  }\n};\n\nmodule.exports = ReactEventListener;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RXZlbnRMaXN0ZW5lci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIEV2ZW50TGlzdGVuZXIgPSByZXF1aXJlKCdmYmpzL2xpYi9FdmVudExpc3RlbmVyJyk7XG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xudmFyIFBvb2xlZENsYXNzID0gcmVxdWlyZSgnLi9Qb29sZWRDbGFzcycpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RVcGRhdGVzID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZXMnKTtcblxudmFyIGdldEV2ZW50VGFyZ2V0ID0gcmVxdWlyZSgnLi9nZXRFdmVudFRhcmdldCcpO1xudmFyIGdldFVuYm91bmRlZFNjcm9sbFBvc2l0aW9uID0gcmVxdWlyZSgnZmJqcy9saWIvZ2V0VW5ib3VuZGVkU2Nyb2xsUG9zaXRpb24nKTtcblxuLyoqXG4gKiBGaW5kIHRoZSBkZWVwZXN0IFJlYWN0IGNvbXBvbmVudCBjb21wbGV0ZWx5IGNvbnRhaW5pbmcgdGhlIHJvb3Qgb2YgdGhlXG4gKiBwYXNzZWQtaW4gaW5zdGFuY2UgKGZvciB1c2Ugd2hlbiBlbnRpcmUgUmVhY3QgdHJlZXMgYXJlIG5lc3RlZCB3aXRoaW4gZWFjaFxuICogb3RoZXIpLiBJZiBSZWFjdCB0cmVlcyBhcmUgbm90IG5lc3RlZCwgcmV0dXJucyBudWxsLlxuICovXG5mdW5jdGlvbiBmaW5kUGFyZW50KGluc3QpIHtcbiAgLy8gVE9ETzogSXQgbWF5IGJlIGEgZ29vZCBpZGVhIHRvIGNhY2hlIHRoaXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSBET01cbiAgLy8gdHJhdmVyc2FsLCBidXQgY2FjaGluZyBpcyBkaWZmaWN1bHQgdG8gZG8gY29ycmVjdGx5IHdpdGhvdXQgdXNpbmcgYVxuICAvLyBtdXRhdGlvbiBvYnNlcnZlciB0byBsaXN0ZW4gZm9yIGFsbCBET00gY2hhbmdlcy5cbiAgd2hpbGUgKGluc3QuX2hvc3RQYXJlbnQpIHtcbiAgICBpbnN0ID0gaW5zdC5faG9zdFBhcmVudDtcbiAgfVxuICB2YXIgcm9vdE5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTtcbiAgdmFyIGNvbnRhaW5lciA9IHJvb3ROb2RlLnBhcmVudE5vZGU7XG4gIHJldHVybiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoY29udGFpbmVyKTtcbn1cblxuLy8gVXNlZCB0byBzdG9yZSBhbmNlc3RvciBoaWVyYXJjaHkgaW4gdG9wIGxldmVsIGNhbGxiYWNrXG5mdW5jdGlvbiBUb3BMZXZlbENhbGxiYWNrQm9va0tlZXBpbmcodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkge1xuICB0aGlzLnRvcExldmVsVHlwZSA9IHRvcExldmVsVHlwZTtcbiAgdGhpcy5uYXRpdmVFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICB0aGlzLmFuY2VzdG9ycyA9IFtdO1xufVxuX2Fzc2lnbihUb3BMZXZlbENhbGxiYWNrQm9va0tlZXBpbmcucHJvdG90eXBlLCB7XG4gIGRlc3RydWN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnRvcExldmVsVHlwZSA9IG51bGw7XG4gICAgdGhpcy5uYXRpdmVFdmVudCA9IG51bGw7XG4gICAgdGhpcy5hbmNlc3RvcnMubGVuZ3RoID0gMDtcbiAgfVxufSk7XG5Qb29sZWRDbGFzcy5hZGRQb29saW5nVG8oVG9wTGV2ZWxDYWxsYmFja0Jvb2tLZWVwaW5nLCBQb29sZWRDbGFzcy50d29Bcmd1bWVudFBvb2xlcik7XG5cbmZ1bmN0aW9uIGhhbmRsZVRvcExldmVsSW1wbChib29rS2VlcGluZykge1xuICB2YXIgbmF0aXZlRXZlbnRUYXJnZXQgPSBnZXRFdmVudFRhcmdldChib29rS2VlcGluZy5uYXRpdmVFdmVudCk7XG4gIHZhciB0YXJnZXRJbnN0ID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICAvLyBMb29wIHRocm91Z2ggdGhlIGhpZXJhcmNoeSwgaW4gY2FzZSB0aGVyZSdzIGFueSBuZXN0ZWQgY29tcG9uZW50cy5cbiAgLy8gSXQncyBpbXBvcnRhbnQgdGhhdCB3ZSBidWlsZCB0aGUgYXJyYXkgb2YgYW5jZXN0b3JzIGJlZm9yZSBjYWxsaW5nIGFueVxuICAvLyBldmVudCBoYW5kbGVycywgYmVjYXVzZSBldmVudCBoYW5kbGVycyBjYW4gbW9kaWZ5IHRoZSBET00sIGxlYWRpbmcgdG9cbiAgLy8gaW5jb25zaXN0ZW5jaWVzIHdpdGggUmVhY3RNb3VudCdzIG5vZGUgY2FjaGUuIFNlZSAjMTEwNS5cbiAgdmFyIGFuY2VzdG9yID0gdGFyZ2V0SW5zdDtcbiAgZG8ge1xuICAgIGJvb2tLZWVwaW5nLmFuY2VzdG9ycy5wdXNoKGFuY2VzdG9yKTtcbiAgICBhbmNlc3RvciA9IGFuY2VzdG9yICYmIGZpbmRQYXJlbnQoYW5jZXN0b3IpO1xuICB9IHdoaWxlIChhbmNlc3Rvcik7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBib29rS2VlcGluZy5hbmNlc3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICB0YXJnZXRJbnN0ID0gYm9va0tlZXBpbmcuYW5jZXN0b3JzW2ldO1xuICAgIFJlYWN0RXZlbnRMaXN0ZW5lci5faGFuZGxlVG9wTGV2ZWwoYm9va0tlZXBpbmcudG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBib29rS2VlcGluZy5uYXRpdmVFdmVudCwgZ2V0RXZlbnRUYXJnZXQoYm9va0tlZXBpbmcubmF0aXZlRXZlbnQpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzY3JvbGxWYWx1ZU1vbml0b3IoY2IpIHtcbiAgdmFyIHNjcm9sbFBvc2l0aW9uID0gZ2V0VW5ib3VuZGVkU2Nyb2xsUG9zaXRpb24od2luZG93KTtcbiAgY2Ioc2Nyb2xsUG9zaXRpb24pO1xufVxuXG52YXIgUmVhY3RFdmVudExpc3RlbmVyID0ge1xuICBfZW5hYmxlZDogdHJ1ZSxcbiAgX2hhbmRsZVRvcExldmVsOiBudWxsLFxuXG4gIFdJTkRPV19IQU5ETEU6IEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSA/IHdpbmRvdyA6IG51bGwsXG5cbiAgc2V0SGFuZGxlVG9wTGV2ZWw6IGZ1bmN0aW9uIChoYW5kbGVUb3BMZXZlbCkge1xuICAgIFJlYWN0RXZlbnRMaXN0ZW5lci5faGFuZGxlVG9wTGV2ZWwgPSBoYW5kbGVUb3BMZXZlbDtcbiAgfSxcblxuICBzZXRFbmFibGVkOiBmdW5jdGlvbiAoZW5hYmxlZCkge1xuICAgIFJlYWN0RXZlbnRMaXN0ZW5lci5fZW5hYmxlZCA9ICEhZW5hYmxlZDtcbiAgfSxcblxuICBpc0VuYWJsZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gUmVhY3RFdmVudExpc3RlbmVyLl9lbmFibGVkO1xuICB9LFxuXG4gIC8qKlxuICAgKiBUcmFwcyB0b3AtbGV2ZWwgZXZlbnRzIGJ5IHVzaW5nIGV2ZW50IGJ1YmJsaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9wTGV2ZWxUeXBlIFJlY29yZCBmcm9tIGBFdmVudENvbnN0YW50c2AuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoYW5kbGVyQmFzZU5hbWUgRXZlbnQgbmFtZSAoZS5nLiBcImNsaWNrXCIpLlxuICAgKiBAcGFyYW0ge29iamVjdH0gZWxlbWVudCBFbGVtZW50IG9uIHdoaWNoIHRvIGF0dGFjaCBsaXN0ZW5lci5cbiAgICogQHJldHVybiB7P29iamVjdH0gQW4gb2JqZWN0IHdpdGggYSByZW1vdmUgZnVuY3Rpb24gd2hpY2ggd2lsbCBmb3JjZWZ1bGx5XG4gICAqICAgICAgICAgICAgICAgICAgcmVtb3ZlIHRoZSBsaXN0ZW5lci5cbiAgICogQGludGVybmFsXG4gICAqL1xuICB0cmFwQnViYmxlZEV2ZW50OiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCBoYW5kbGVyQmFzZU5hbWUsIGVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gRXZlbnRMaXN0ZW5lci5saXN0ZW4oZWxlbWVudCwgaGFuZGxlckJhc2VOYW1lLCBSZWFjdEV2ZW50TGlzdGVuZXIuZGlzcGF0Y2hFdmVudC5iaW5kKG51bGwsIHRvcExldmVsVHlwZSkpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBUcmFwcyBhIHRvcC1sZXZlbCBldmVudCBieSB1c2luZyBldmVudCBjYXB0dXJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b3BMZXZlbFR5cGUgUmVjb3JkIGZyb20gYEV2ZW50Q29uc3RhbnRzYC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGhhbmRsZXJCYXNlTmFtZSBFdmVudCBuYW1lIChlLmcuIFwiY2xpY2tcIikuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBlbGVtZW50IEVsZW1lbnQgb24gd2hpY2ggdG8gYXR0YWNoIGxpc3RlbmVyLlxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBBbiBvYmplY3Qgd2l0aCBhIHJlbW92ZSBmdW5jdGlvbiB3aGljaCB3aWxsIGZvcmNlZnVsbHlcbiAgICogICAgICAgICAgICAgICAgICByZW1vdmUgdGhlIGxpc3RlbmVyLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHRyYXBDYXB0dXJlZEV2ZW50OiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCBoYW5kbGVyQmFzZU5hbWUsIGVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gRXZlbnRMaXN0ZW5lci5jYXB0dXJlKGVsZW1lbnQsIGhhbmRsZXJCYXNlTmFtZSwgUmVhY3RFdmVudExpc3RlbmVyLmRpc3BhdGNoRXZlbnQuYmluZChudWxsLCB0b3BMZXZlbFR5cGUpKTtcbiAgfSxcblxuICBtb25pdG9yU2Nyb2xsVmFsdWU6IGZ1bmN0aW9uIChyZWZyZXNoKSB7XG4gICAgdmFyIGNhbGxiYWNrID0gc2Nyb2xsVmFsdWVNb25pdG9yLmJpbmQobnVsbCwgcmVmcmVzaCk7XG4gICAgRXZlbnRMaXN0ZW5lci5saXN0ZW4od2luZG93LCAnc2Nyb2xsJywgY2FsbGJhY2spO1xuICB9LFxuXG4gIGRpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSB7XG4gICAgaWYgKCFSZWFjdEV2ZW50TGlzdGVuZXIuX2VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYm9va0tlZXBpbmcgPSBUb3BMZXZlbENhbGxiYWNrQm9va0tlZXBpbmcuZ2V0UG9vbGVkKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpO1xuICAgIHRyeSB7XG4gICAgICAvLyBFdmVudCBxdWV1ZSBiZWluZyBwcm9jZXNzZWQgaW4gdGhlIHNhbWUgY3ljbGUgYWxsb3dzXG4gICAgICAvLyBgcHJldmVudERlZmF1bHRgLlxuICAgICAgUmVhY3RVcGRhdGVzLmJhdGNoZWRVcGRhdGVzKGhhbmRsZVRvcExldmVsSW1wbCwgYm9va0tlZXBpbmcpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBUb3BMZXZlbENhbGxiYWNrQm9va0tlZXBpbmcucmVsZWFzZShib29rS2VlcGluZyk7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RXZlbnRMaXN0ZW5lcjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdEV2ZW50TGlzdGVuZXIuanNcbi8vIG1vZHVsZSBpZCA9IDMxNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 315 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @typechecks\n */\n\nvar emptyFunction = __webpack_require__(184);\n\n/**\n * Upstream version of event listener. Does not take into account specific\n * nature of platform.\n */\nvar EventListener = {\n  /**\n   * Listen to DOM events during the bubble phase.\n   *\n   * @param {DOMEventTarget} target DOM element to register listener on.\n   * @param {string} eventType Event type, e.g. 'click' or 'mouseover'.\n   * @param {function} callback Callback function.\n   * @return {object} Object with a `remove` method.\n   */\n  listen: function listen(target, eventType, callback) {\n    if (target.addEventListener) {\n      target.addEventListener(eventType, callback, false);\n      return {\n        remove: function remove() {\n          target.removeEventListener(eventType, callback, false);\n        }\n      };\n    } else if (target.attachEvent) {\n      target.attachEvent('on' + eventType, callback);\n      return {\n        remove: function remove() {\n          target.detachEvent('on' + eventType, callback);\n        }\n      };\n    }\n  },\n\n  /**\n   * Listen to DOM events during the capture phase.\n   *\n   * @param {DOMEventTarget} target DOM element to register listener on.\n   * @param {string} eventType Event type, e.g. 'click' or 'mouseover'.\n   * @param {function} callback Callback function.\n   * @return {object} Object with a `remove` method.\n   */\n  capture: function capture(target, eventType, callback) {\n    if (target.addEventListener) {\n      target.addEventListener(eventType, callback, true);\n      return {\n        remove: function remove() {\n          target.removeEventListener(eventType, callback, true);\n        }\n      };\n    } else {\n      if (true) {\n        console.error('Attempted to listen to events during the capture phase on a ' + 'browser that does not support the capture phase. Your application ' + 'will not receive some events.');\n      }\n      return {\n        remove: emptyFunction\n      };\n    }\n  },\n\n  registerDefault: function registerDefault() {}\n};\n\nmodule.exports = EventListener;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9FdmVudExpc3RlbmVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbnZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9lbXB0eUZ1bmN0aW9uJyk7XG5cbi8qKlxuICogVXBzdHJlYW0gdmVyc2lvbiBvZiBldmVudCBsaXN0ZW5lci4gRG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgc3BlY2lmaWNcbiAqIG5hdHVyZSBvZiBwbGF0Zm9ybS5cbiAqL1xudmFyIEV2ZW50TGlzdGVuZXIgPSB7XG4gIC8qKlxuICAgKiBMaXN0ZW4gdG8gRE9NIGV2ZW50cyBkdXJpbmcgdGhlIGJ1YmJsZSBwaGFzZS5cbiAgICpcbiAgICogQHBhcmFtIHtET01FdmVudFRhcmdldH0gdGFyZ2V0IERPTSBlbGVtZW50IHRvIHJlZ2lzdGVyIGxpc3RlbmVyIG9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRUeXBlIEV2ZW50IHR5cGUsIGUuZy4gJ2NsaWNrJyBvciAnbW91c2VvdmVyJy5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IHdpdGggYSBgcmVtb3ZlYCBtZXRob2QuXG4gICAqL1xuICBsaXN0ZW46IGZ1bmN0aW9uIGxpc3Rlbih0YXJnZXQsIGV2ZW50VHlwZSwgY2FsbGJhY2spIHtcbiAgICBpZiAodGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2ssIGZhbHNlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2ssIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHRhcmdldC5hdHRhY2hFdmVudCkge1xuICAgICAgdGFyZ2V0LmF0dGFjaEV2ZW50KCdvbicgKyBldmVudFR5cGUsIGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgICAgIHRhcmdldC5kZXRhY2hFdmVudCgnb24nICsgZXZlbnRUeXBlLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gdG8gRE9NIGV2ZW50cyBkdXJpbmcgdGhlIGNhcHR1cmUgcGhhc2UuXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRXZlbnRUYXJnZXR9IHRhcmdldCBET00gZWxlbWVudCB0byByZWdpc3RlciBsaXN0ZW5lciBvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50VHlwZSBFdmVudCB0eXBlLCBlLmcuICdjbGljaycgb3IgJ21vdXNlb3ZlcicuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IE9iamVjdCB3aXRoIGEgYHJlbW92ZWAgbWV0aG9kLlxuICAgKi9cbiAgY2FwdHVyZTogZnVuY3Rpb24gY2FwdHVyZSh0YXJnZXQsIGV2ZW50VHlwZSwgY2FsbGJhY2spIHtcbiAgICBpZiAodGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2ssIHRydWUpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBjYWxsYmFjaywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0F0dGVtcHRlZCB0byBsaXN0ZW4gdG8gZXZlbnRzIGR1cmluZyB0aGUgY2FwdHVyZSBwaGFzZSBvbiBhICcgKyAnYnJvd3NlciB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhlIGNhcHR1cmUgcGhhc2UuIFlvdXIgYXBwbGljYXRpb24gJyArICd3aWxsIG5vdCByZWNlaXZlIHNvbWUgZXZlbnRzLicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVtb3ZlOiBlbXB0eUZ1bmN0aW9uXG4gICAgICB9O1xuICAgIH1cbiAgfSxcblxuICByZWdpc3RlckRlZmF1bHQ6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdCgpIHt9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50TGlzdGVuZXI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2ZianMvbGliL0V2ZW50TGlzdGVuZXIuanNcbi8vIG1vZHVsZSBpZCA9IDMxNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 316 */
/***/ function(module, exports) {

    eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @typechecks\n */\n\n'use strict';\n\n/**\n * Gets the scroll position of the supplied element or window.\n *\n * The return values are unbounded, unlike `getScrollPosition`. This means they\n * may be negative or exceed the element boundaries (which is possible using\n * inertial scrolling).\n *\n * @param {DOMWindow|DOMElement} scrollable\n * @return {object} Map with `x` and `y` keys.\n */\n\nfunction getUnboundedScrollPosition(scrollable) {\n  if (scrollable === window) {\n    return {\n      x: window.pageXOffset || document.documentElement.scrollLeft,\n      y: window.pageYOffset || document.documentElement.scrollTop\n    };\n  }\n  return {\n    x: scrollable.scrollLeft,\n    y: scrollable.scrollTop\n  };\n}\n\nmodule.exports = getUnboundedScrollPosition;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9nZXRVbmJvdW5kZWRTY3JvbGxQb3NpdGlvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHR5cGVjaGVja3NcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogR2V0cyB0aGUgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBzdXBwbGllZCBlbGVtZW50IG9yIHdpbmRvdy5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlcyBhcmUgdW5ib3VuZGVkLCB1bmxpa2UgYGdldFNjcm9sbFBvc2l0aW9uYC4gVGhpcyBtZWFucyB0aGV5XG4gKiBtYXkgYmUgbmVnYXRpdmUgb3IgZXhjZWVkIHRoZSBlbGVtZW50IGJvdW5kYXJpZXMgKHdoaWNoIGlzIHBvc3NpYmxlIHVzaW5nXG4gKiBpbmVydGlhbCBzY3JvbGxpbmcpLlxuICpcbiAqIEBwYXJhbSB7RE9NV2luZG93fERPTUVsZW1lbnR9IHNjcm9sbGFibGVcbiAqIEByZXR1cm4ge29iamVjdH0gTWFwIHdpdGggYHhgIGFuZCBgeWAga2V5cy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRVbmJvdW5kZWRTY3JvbGxQb3NpdGlvbihzY3JvbGxhYmxlKSB7XG4gIGlmIChzY3JvbGxhYmxlID09PSB3aW5kb3cpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogd2luZG93LnBhZ2VYT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LFxuICAgICAgeTogd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3BcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgeDogc2Nyb2xsYWJsZS5zY3JvbGxMZWZ0LFxuICAgIHk6IHNjcm9sbGFibGUuc2Nyb2xsVG9wXG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0VW5ib3VuZGVkU2Nyb2xsUG9zaXRpb247XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2ZianMvbGliL2dldFVuYm91bmRlZFNjcm9sbFBvc2l0aW9uLmpzXG4vLyBtb2R1bGUgaWQgPSAzMTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 317 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar DOMProperty = __webpack_require__(209);\nvar EventPluginHub = __webpack_require__(215);\nvar EventPluginUtils = __webpack_require__(217);\nvar ReactComponentEnvironment = __webpack_require__(288);\nvar ReactEmptyComponent = __webpack_require__(298);\nvar ReactBrowserEventEmitter = __webpack_require__(278);\nvar ReactHostComponent = __webpack_require__(299);\nvar ReactUpdates = __webpack_require__(229);\n\nvar ReactInjection = {\n  Component: ReactComponentEnvironment.injection,\n  DOMProperty: DOMProperty.injection,\n  EmptyComponent: ReactEmptyComponent.injection,\n  EventPluginHub: EventPluginHub.injection,\n  EventPluginUtils: EventPluginUtils.injection,\n  EventEmitter: ReactBrowserEventEmitter.injection,\n  HostComponent: ReactHostComponent.injection,\n  Updates: ReactUpdates.injection\n};\n\nmodule.exports = ReactInjection;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0SW5qZWN0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBET01Qcm9wZXJ0eSA9IHJlcXVpcmUoJy4vRE9NUHJvcGVydHknKTtcbnZhciBFdmVudFBsdWdpbkh1YiA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5IdWInKTtcbnZhciBFdmVudFBsdWdpblV0aWxzID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpblV0aWxzJyk7XG52YXIgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCA9IHJlcXVpcmUoJy4vUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCcpO1xudmFyIFJlYWN0RW1wdHlDb21wb25lbnQgPSByZXF1aXJlKCcuL1JlYWN0RW1wdHlDb21wb25lbnQnKTtcbnZhciBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCcuL1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlcicpO1xudmFyIFJlYWN0SG9zdENvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RIb3N0Q29tcG9uZW50Jyk7XG52YXIgUmVhY3RVcGRhdGVzID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZXMnKTtcblxudmFyIFJlYWN0SW5qZWN0aW9uID0ge1xuICBDb21wb25lbnQ6IFJlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQuaW5qZWN0aW9uLFxuICBET01Qcm9wZXJ0eTogRE9NUHJvcGVydHkuaW5qZWN0aW9uLFxuICBFbXB0eUNvbXBvbmVudDogUmVhY3RFbXB0eUNvbXBvbmVudC5pbmplY3Rpb24sXG4gIEV2ZW50UGx1Z2luSHViOiBFdmVudFBsdWdpbkh1Yi5pbmplY3Rpb24sXG4gIEV2ZW50UGx1Z2luVXRpbHM6IEV2ZW50UGx1Z2luVXRpbHMuaW5qZWN0aW9uLFxuICBFdmVudEVtaXR0ZXI6IFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5pbmplY3Rpb24sXG4gIEhvc3RDb21wb25lbnQ6IFJlYWN0SG9zdENvbXBvbmVudC5pbmplY3Rpb24sXG4gIFVwZGF0ZXM6IFJlYWN0VXBkYXRlcy5pbmplY3Rpb25cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RJbmplY3Rpb247XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RJbmplY3Rpb24uanNcbi8vIG1vZHVsZSBpZCA9IDMxN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 318 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _assign = __webpack_require__(176);\n\nvar CallbackQueue = __webpack_require__(230);\nvar PooledClass = __webpack_require__(223);\nvar ReactBrowserEventEmitter = __webpack_require__(278);\nvar ReactInputSelection = __webpack_require__(319);\nvar ReactInstrumentation = __webpack_require__(235);\nvar Transaction = __webpack_require__(241);\nvar ReactUpdateQueue = __webpack_require__(308);\n\n/**\n * Ensures that, when possible, the selection range (currently selected text\n * input) is not disturbed by performing the transaction.\n */\nvar SELECTION_RESTORATION = {\n  /**\n   * @return {Selection} Selection information.\n   */\n  initialize: ReactInputSelection.getSelectionInformation,\n  /**\n   * @param {Selection} sel Selection information returned from `initialize`.\n   */\n  close: ReactInputSelection.restoreSelection\n};\n\n/**\n * Suppresses events (blur/focus) that could be inadvertently dispatched due to\n * high level DOM manipulations (like temporarily removing a text input from the\n * DOM).\n */\nvar EVENT_SUPPRESSION = {\n  /**\n   * @return {boolean} The enabled status of `ReactBrowserEventEmitter` before\n   * the reconciliation.\n   */\n  initialize: function () {\n    var currentlyEnabled = ReactBrowserEventEmitter.isEnabled();\n    ReactBrowserEventEmitter.setEnabled(false);\n    return currentlyEnabled;\n  },\n\n  /**\n   * @param {boolean} previouslyEnabled Enabled status of\n   *   `ReactBrowserEventEmitter` before the reconciliation occurred. `close`\n   *   restores the previous value.\n   */\n  close: function (previouslyEnabled) {\n    ReactBrowserEventEmitter.setEnabled(previouslyEnabled);\n  }\n};\n\n/**\n * Provides a queue for collecting `componentDidMount` and\n * `componentDidUpdate` callbacks during the transaction.\n */\nvar ON_DOM_READY_QUEUEING = {\n  /**\n   * Initializes the internal `onDOMReady` queue.\n   */\n  initialize: function () {\n    this.reactMountReady.reset();\n  },\n\n  /**\n   * After DOM is flushed, invoke all registered `onDOMReady` callbacks.\n   */\n  close: function () {\n    this.reactMountReady.notifyAll();\n  }\n};\n\n/**\n * Executed within the scope of the `Transaction` instance. Consider these as\n * being member methods, but with an implied ordering while being isolated from\n * each other.\n */\nvar TRANSACTION_WRAPPERS = [SELECTION_RESTORATION, EVENT_SUPPRESSION, ON_DOM_READY_QUEUEING];\n\nif (true) {\n  TRANSACTION_WRAPPERS.push({\n    initialize: ReactInstrumentation.debugTool.onBeginFlush,\n    close: ReactInstrumentation.debugTool.onEndFlush\n  });\n}\n\n/**\n * Currently:\n * - The order that these are listed in the transaction is critical:\n * - Suppresses events.\n * - Restores selection range.\n *\n * Future:\n * - Restore document/overflow scroll positions that were unintentionally\n *   modified via DOM insertions above the top viewport boundary.\n * - Implement/integrate with customized constraint based layout system and keep\n *   track of which dimensions must be remeasured.\n *\n * @class ReactReconcileTransaction\n */\nfunction ReactReconcileTransaction(useCreateElement) {\n  this.reinitializeTransaction();\n  // Only server-side rendering really needs this option (see\n  // `ReactServerRendering`), but server-side uses\n  // `ReactServerRenderingTransaction` instead. This option is here so that it's\n  // accessible and defaults to false when `ReactDOMComponent` and\n  // `ReactDOMTextComponent` checks it in `mountComponent`.`\n  this.renderToStaticMarkup = false;\n  this.reactMountReady = CallbackQueue.getPooled(null);\n  this.useCreateElement = useCreateElement;\n}\n\nvar Mixin = {\n  /**\n   * @see Transaction\n   * @abstract\n   * @final\n   * @return {array<object>} List of operation wrap procedures.\n   *   TODO: convert to array<TransactionWrapper>\n   */\n  getTransactionWrappers: function () {\n    return TRANSACTION_WRAPPERS;\n  },\n\n  /**\n   * @return {object} The queue to collect `onDOMReady` callbacks with.\n   */\n  getReactMountReady: function () {\n    return this.reactMountReady;\n  },\n\n  /**\n   * @return {object} The queue to collect React async events.\n   */\n  getUpdateQueue: function () {\n    return ReactUpdateQueue;\n  },\n\n  /**\n   * Save current transaction state -- if the return value from this method is\n   * passed to `rollback`, the transaction will be reset to that state.\n   */\n  checkpoint: function () {\n    // reactMountReady is the our only stateful wrapper\n    return this.reactMountReady.checkpoint();\n  },\n\n  rollback: function (checkpoint) {\n    this.reactMountReady.rollback(checkpoint);\n  },\n\n  /**\n   * `PooledClass` looks for this, and will invoke this before allowing this\n   * instance to be reused.\n   */\n  destructor: function () {\n    CallbackQueue.release(this.reactMountReady);\n    this.reactMountReady = null;\n  }\n};\n\n_assign(ReactReconcileTransaction.prototype, Transaction, Mixin);\n\nPooledClass.addPoolingTo(ReactReconcileTransaction);\n\nmodule.exports = ReactReconcileTransaction;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBDYWxsYmFja1F1ZXVlID0gcmVxdWlyZSgnLi9DYWxsYmFja1F1ZXVlJyk7XG52YXIgUG9vbGVkQ2xhc3MgPSByZXF1aXJlKCcuL1Bvb2xlZENsYXNzJyk7XG52YXIgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnLi9SZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXInKTtcbnZhciBSZWFjdElucHV0U2VsZWN0aW9uID0gcmVxdWlyZSgnLi9SZWFjdElucHV0U2VsZWN0aW9uJyk7XG52YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSByZXF1aXJlKCcuL1JlYWN0SW5zdHJ1bWVudGF0aW9uJyk7XG52YXIgVHJhbnNhY3Rpb24gPSByZXF1aXJlKCcuL1RyYW5zYWN0aW9uJyk7XG52YXIgUmVhY3RVcGRhdGVRdWV1ZSA9IHJlcXVpcmUoJy4vUmVhY3RVcGRhdGVRdWV1ZScpO1xuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCwgd2hlbiBwb3NzaWJsZSwgdGhlIHNlbGVjdGlvbiByYW5nZSAoY3VycmVudGx5IHNlbGVjdGVkIHRleHRcbiAqIGlucHV0KSBpcyBub3QgZGlzdHVyYmVkIGJ5IHBlcmZvcm1pbmcgdGhlIHRyYW5zYWN0aW9uLlxuICovXG52YXIgU0VMRUNUSU9OX1JFU1RPUkFUSU9OID0ge1xuICAvKipcbiAgICogQHJldHVybiB7U2VsZWN0aW9ufSBTZWxlY3Rpb24gaW5mb3JtYXRpb24uXG4gICAqL1xuICBpbml0aWFsaXplOiBSZWFjdElucHV0U2VsZWN0aW9uLmdldFNlbGVjdGlvbkluZm9ybWF0aW9uLFxuICAvKipcbiAgICogQHBhcmFtIHtTZWxlY3Rpb259IHNlbCBTZWxlY3Rpb24gaW5mb3JtYXRpb24gcmV0dXJuZWQgZnJvbSBgaW5pdGlhbGl6ZWAuXG4gICAqL1xuICBjbG9zZTogUmVhY3RJbnB1dFNlbGVjdGlvbi5yZXN0b3JlU2VsZWN0aW9uXG59O1xuXG4vKipcbiAqIFN1cHByZXNzZXMgZXZlbnRzIChibHVyL2ZvY3VzKSB0aGF0IGNvdWxkIGJlIGluYWR2ZXJ0ZW50bHkgZGlzcGF0Y2hlZCBkdWUgdG9cbiAqIGhpZ2ggbGV2ZWwgRE9NIG1hbmlwdWxhdGlvbnMgKGxpa2UgdGVtcG9yYXJpbHkgcmVtb3ZpbmcgYSB0ZXh0IGlucHV0IGZyb20gdGhlXG4gKiBET00pLlxuICovXG52YXIgRVZFTlRfU1VQUFJFU1NJT04gPSB7XG4gIC8qKlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUaGUgZW5hYmxlZCBzdGF0dXMgb2YgYFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlcmAgYmVmb3JlXG4gICAqIHRoZSByZWNvbmNpbGlhdGlvbi5cbiAgICovXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY3VycmVudGx5RW5hYmxlZCA9IFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5pc0VuYWJsZWQoKTtcbiAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuc2V0RW5hYmxlZChmYWxzZSk7XG4gICAgcmV0dXJuIGN1cnJlbnRseUVuYWJsZWQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcHJldmlvdXNseUVuYWJsZWQgRW5hYmxlZCBzdGF0dXMgb2ZcbiAgICogICBgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyYCBiZWZvcmUgdGhlIHJlY29uY2lsaWF0aW9uIG9jY3VycmVkLiBgY2xvc2VgXG4gICAqICAgcmVzdG9yZXMgdGhlIHByZXZpb3VzIHZhbHVlLlxuICAgKi9cbiAgY2xvc2U6IGZ1bmN0aW9uIChwcmV2aW91c2x5RW5hYmxlZCkge1xuICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5zZXRFbmFibGVkKHByZXZpb3VzbHlFbmFibGVkKTtcbiAgfVxufTtcblxuLyoqXG4gKiBQcm92aWRlcyBhIHF1ZXVlIGZvciBjb2xsZWN0aW5nIGBjb21wb25lbnREaWRNb3VudGAgYW5kXG4gKiBgY29tcG9uZW50RGlkVXBkYXRlYCBjYWxsYmFja3MgZHVyaW5nIHRoZSB0cmFuc2FjdGlvbi5cbiAqL1xudmFyIE9OX0RPTV9SRUFEWV9RVUVVRUlORyA9IHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBpbnRlcm5hbCBgb25ET01SZWFkeWAgcXVldWUuXG4gICAqL1xuICBpbml0aWFsaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5yZWFjdE1vdW50UmVhZHkucmVzZXQoKTtcbiAgfSxcblxuICAvKipcbiAgICogQWZ0ZXIgRE9NIGlzIGZsdXNoZWQsIGludm9rZSBhbGwgcmVnaXN0ZXJlZCBgb25ET01SZWFkeWAgY2FsbGJhY2tzLlxuICAgKi9cbiAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnJlYWN0TW91bnRSZWFkeS5ub3RpZnlBbGwoKTtcbiAgfVxufTtcblxuLyoqXG4gKiBFeGVjdXRlZCB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBgVHJhbnNhY3Rpb25gIGluc3RhbmNlLiBDb25zaWRlciB0aGVzZSBhc1xuICogYmVpbmcgbWVtYmVyIG1ldGhvZHMsIGJ1dCB3aXRoIGFuIGltcGxpZWQgb3JkZXJpbmcgd2hpbGUgYmVpbmcgaXNvbGF0ZWQgZnJvbVxuICogZWFjaCBvdGhlci5cbiAqL1xudmFyIFRSQU5TQUNUSU9OX1dSQVBQRVJTID0gW1NFTEVDVElPTl9SRVNUT1JBVElPTiwgRVZFTlRfU1VQUFJFU1NJT04sIE9OX0RPTV9SRUFEWV9RVUVVRUlOR107XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFRSQU5TQUNUSU9OX1dSQVBQRVJTLnB1c2goe1xuICAgIGluaXRpYWxpemU6IFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZ2luRmx1c2gsXG4gICAgY2xvc2U6IFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkVuZEZsdXNoXG4gIH0pO1xufVxuXG4vKipcbiAqIEN1cnJlbnRseTpcbiAqIC0gVGhlIG9yZGVyIHRoYXQgdGhlc2UgYXJlIGxpc3RlZCBpbiB0aGUgdHJhbnNhY3Rpb24gaXMgY3JpdGljYWw6XG4gKiAtIFN1cHByZXNzZXMgZXZlbnRzLlxuICogLSBSZXN0b3JlcyBzZWxlY3Rpb24gcmFuZ2UuXG4gKlxuICogRnV0dXJlOlxuICogLSBSZXN0b3JlIGRvY3VtZW50L292ZXJmbG93IHNjcm9sbCBwb3NpdGlvbnMgdGhhdCB3ZXJlIHVuaW50ZW50aW9uYWxseVxuICogICBtb2RpZmllZCB2aWEgRE9NIGluc2VydGlvbnMgYWJvdmUgdGhlIHRvcCB2aWV3cG9ydCBib3VuZGFyeS5cbiAqIC0gSW1wbGVtZW50L2ludGVncmF0ZSB3aXRoIGN1c3RvbWl6ZWQgY29uc3RyYWludCBiYXNlZCBsYXlvdXQgc3lzdGVtIGFuZCBrZWVwXG4gKiAgIHRyYWNrIG9mIHdoaWNoIGRpbWVuc2lvbnMgbXVzdCBiZSByZW1lYXN1cmVkLlxuICpcbiAqIEBjbGFzcyBSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uXG4gKi9cbmZ1bmN0aW9uIFJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24odXNlQ3JlYXRlRWxlbWVudCkge1xuICB0aGlzLnJlaW5pdGlhbGl6ZVRyYW5zYWN0aW9uKCk7XG4gIC8vIE9ubHkgc2VydmVyLXNpZGUgcmVuZGVyaW5nIHJlYWxseSBuZWVkcyB0aGlzIG9wdGlvbiAoc2VlXG4gIC8vIGBSZWFjdFNlcnZlclJlbmRlcmluZ2ApLCBidXQgc2VydmVyLXNpZGUgdXNlc1xuICAvLyBgUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbmAgaW5zdGVhZC4gVGhpcyBvcHRpb24gaXMgaGVyZSBzbyB0aGF0IGl0J3NcbiAgLy8gYWNjZXNzaWJsZSBhbmQgZGVmYXVsdHMgdG8gZmFsc2Ugd2hlbiBgUmVhY3RET01Db21wb25lbnRgIGFuZFxuICAvLyBgUmVhY3RET01UZXh0Q29tcG9uZW50YCBjaGVja3MgaXQgaW4gYG1vdW50Q29tcG9uZW50YC5gXG4gIHRoaXMucmVuZGVyVG9TdGF0aWNNYXJrdXAgPSBmYWxzZTtcbiAgdGhpcy5yZWFjdE1vdW50UmVhZHkgPSBDYWxsYmFja1F1ZXVlLmdldFBvb2xlZChudWxsKTtcbiAgdGhpcy51c2VDcmVhdGVFbGVtZW50ID0gdXNlQ3JlYXRlRWxlbWVudDtcbn1cblxudmFyIE1peGluID0ge1xuICAvKipcbiAgICogQHNlZSBUcmFuc2FjdGlvblxuICAgKiBAYWJzdHJhY3RcbiAgICogQGZpbmFsXG4gICAqIEByZXR1cm4ge2FycmF5PG9iamVjdD59IExpc3Qgb2Ygb3BlcmF0aW9uIHdyYXAgcHJvY2VkdXJlcy5cbiAgICogICBUT0RPOiBjb252ZXJ0IHRvIGFycmF5PFRyYW5zYWN0aW9uV3JhcHBlcj5cbiAgICovXG4gIGdldFRyYW5zYWN0aW9uV3JhcHBlcnM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gVFJBTlNBQ1RJT05fV1JBUFBFUlM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge29iamVjdH0gVGhlIHF1ZXVlIHRvIGNvbGxlY3QgYG9uRE9NUmVhZHlgIGNhbGxiYWNrcyB3aXRoLlxuICAgKi9cbiAgZ2V0UmVhY3RNb3VudFJlYWR5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhY3RNb3VudFJlYWR5O1xuICB9LFxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBxdWV1ZSB0byBjb2xsZWN0IFJlYWN0IGFzeW5jIGV2ZW50cy5cbiAgICovXG4gIGdldFVwZGF0ZVF1ZXVlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFJlYWN0VXBkYXRlUXVldWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNhdmUgY3VycmVudCB0cmFuc2FjdGlvbiBzdGF0ZSAtLSBpZiB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhpcyBtZXRob2QgaXNcbiAgICogcGFzc2VkIHRvIGByb2xsYmFja2AsIHRoZSB0cmFuc2FjdGlvbiB3aWxsIGJlIHJlc2V0IHRvIHRoYXQgc3RhdGUuXG4gICAqL1xuICBjaGVja3BvaW50OiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gcmVhY3RNb3VudFJlYWR5IGlzIHRoZSBvdXIgb25seSBzdGF0ZWZ1bCB3cmFwcGVyXG4gICAgcmV0dXJuIHRoaXMucmVhY3RNb3VudFJlYWR5LmNoZWNrcG9pbnQoKTtcbiAgfSxcblxuICByb2xsYmFjazogZnVuY3Rpb24gKGNoZWNrcG9pbnQpIHtcbiAgICB0aGlzLnJlYWN0TW91bnRSZWFkeS5yb2xsYmFjayhjaGVja3BvaW50KTtcbiAgfSxcblxuICAvKipcbiAgICogYFBvb2xlZENsYXNzYCBsb29rcyBmb3IgdGhpcywgYW5kIHdpbGwgaW52b2tlIHRoaXMgYmVmb3JlIGFsbG93aW5nIHRoaXNcbiAgICogaW5zdGFuY2UgdG8gYmUgcmV1c2VkLlxuICAgKi9cbiAgZGVzdHJ1Y3RvcjogZnVuY3Rpb24gKCkge1xuICAgIENhbGxiYWNrUXVldWUucmVsZWFzZSh0aGlzLnJlYWN0TW91bnRSZWFkeSk7XG4gICAgdGhpcy5yZWFjdE1vdW50UmVhZHkgPSBudWxsO1xuICB9XG59O1xuXG5fYXNzaWduKFJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24ucHJvdG90eXBlLCBUcmFuc2FjdGlvbiwgTWl4aW4pO1xuXG5Qb29sZWRDbGFzcy5hZGRQb29saW5nVG8oUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbik7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uLmpzXG4vLyBtb2R1bGUgaWQgPSAzMThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 319 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar ReactDOMSelection = __webpack_require__(320);\n\nvar containsNode = __webpack_require__(322);\nvar focusNode = __webpack_require__(267);\nvar getActiveElement = __webpack_require__(325);\n\nfunction isInDocument(node) {\n  return containsNode(document.documentElement, node);\n}\n\n/**\n * @ReactInputSelection: React input selection module. Based on Selection.js,\n * but modified to be suitable for react and has a couple of bug fixes (doesn't\n * assume buttons have range selections allowed).\n * Input selection module for React.\n */\nvar ReactInputSelection = {\n\n  hasSelectionCapabilities: function (elem) {\n    var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n    return nodeName && (nodeName === 'input' && elem.type === 'text' || nodeName === 'textarea' || elem.contentEditable === 'true');\n  },\n\n  getSelectionInformation: function () {\n    var focusedElem = getActiveElement();\n    return {\n      focusedElem: focusedElem,\n      selectionRange: ReactInputSelection.hasSelectionCapabilities(focusedElem) ? ReactInputSelection.getSelection(focusedElem) : null\n    };\n  },\n\n  /**\n   * @restoreSelection: If any selection information was potentially lost,\n   * restore it. This is useful when performing operations that could remove dom\n   * nodes and place them back in, resulting in focus being lost.\n   */\n  restoreSelection: function (priorSelectionInformation) {\n    var curFocusedElem = getActiveElement();\n    var priorFocusedElem = priorSelectionInformation.focusedElem;\n    var priorSelectionRange = priorSelectionInformation.selectionRange;\n    if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) {\n      if (ReactInputSelection.hasSelectionCapabilities(priorFocusedElem)) {\n        ReactInputSelection.setSelection(priorFocusedElem, priorSelectionRange);\n      }\n      focusNode(priorFocusedElem);\n    }\n  },\n\n  /**\n   * @getSelection: Gets the selection bounds of a focused textarea, input or\n   * contentEditable node.\n   * -@input: Look up selection bounds of this input\n   * -@return {start: selectionStart, end: selectionEnd}\n   */\n  getSelection: function (input) {\n    var selection;\n\n    if ('selectionStart' in input) {\n      // Modern browser with input or textarea.\n      selection = {\n        start: input.selectionStart,\n        end: input.selectionEnd\n      };\n    } else if (document.selection && input.nodeName && input.nodeName.toLowerCase() === 'input') {\n      // IE8 input.\n      var range = document.selection.createRange();\n      // There can only be one selection per document in IE, so it must\n      // be in our element.\n      if (range.parentElement() === input) {\n        selection = {\n          start: -range.moveStart('character', -input.value.length),\n          end: -range.moveEnd('character', -input.value.length)\n        };\n      }\n    } else {\n      // Content editable or old IE textarea.\n      selection = ReactDOMSelection.getOffsets(input);\n    }\n\n    return selection || { start: 0, end: 0 };\n  },\n\n  /**\n   * @setSelection: Sets the selection bounds of a textarea or input and focuses\n   * the input.\n   * -@input     Set selection bounds of this input or textarea\n   * -@offsets   Object of same form that is returned from get*\n   */\n  setSelection: function (input, offsets) {\n    var start = offsets.start;\n    var end = offsets.end;\n    if (end === undefined) {\n      end = start;\n    }\n\n    if ('selectionStart' in input) {\n      input.selectionStart = start;\n      input.selectionEnd = Math.min(end, input.value.length);\n    } else if (document.selection && input.nodeName && input.nodeName.toLowerCase() === 'input') {\n      var range = input.createTextRange();\n      range.collapse(true);\n      range.moveStart('character', start);\n      range.moveEnd('character', end - start);\n      range.select();\n    } else {\n      ReactDOMSelection.setOffsets(input, offsets);\n    }\n  }\n};\n\nmodule.exports = ReactInputSelection;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0SW5wdXRTZWxlY3Rpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0RE9NU2VsZWN0aW9uID0gcmVxdWlyZSgnLi9SZWFjdERPTVNlbGVjdGlvbicpO1xuXG52YXIgY29udGFpbnNOb2RlID0gcmVxdWlyZSgnZmJqcy9saWIvY29udGFpbnNOb2RlJyk7XG52YXIgZm9jdXNOb2RlID0gcmVxdWlyZSgnZmJqcy9saWIvZm9jdXNOb2RlJyk7XG52YXIgZ2V0QWN0aXZlRWxlbWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL2dldEFjdGl2ZUVsZW1lbnQnKTtcblxuZnVuY3Rpb24gaXNJbkRvY3VtZW50KG5vZGUpIHtcbiAgcmV0dXJuIGNvbnRhaW5zTm9kZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIG5vZGUpO1xufVxuXG4vKipcbiAqIEBSZWFjdElucHV0U2VsZWN0aW9uOiBSZWFjdCBpbnB1dCBzZWxlY3Rpb24gbW9kdWxlLiBCYXNlZCBvbiBTZWxlY3Rpb24uanMsXG4gKiBidXQgbW9kaWZpZWQgdG8gYmUgc3VpdGFibGUgZm9yIHJlYWN0IGFuZCBoYXMgYSBjb3VwbGUgb2YgYnVnIGZpeGVzIChkb2Vzbid0XG4gKiBhc3N1bWUgYnV0dG9ucyBoYXZlIHJhbmdlIHNlbGVjdGlvbnMgYWxsb3dlZCkuXG4gKiBJbnB1dCBzZWxlY3Rpb24gbW9kdWxlIGZvciBSZWFjdC5cbiAqL1xudmFyIFJlYWN0SW5wdXRTZWxlY3Rpb24gPSB7XG5cbiAgaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzOiBmdW5jdGlvbiAoZWxlbSkge1xuICAgIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIG5vZGVOYW1lICYmIChub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiBlbGVtLnR5cGUgPT09ICd0ZXh0JyB8fCBub2RlTmFtZSA9PT0gJ3RleHRhcmVhJyB8fCBlbGVtLmNvbnRlbnRFZGl0YWJsZSA9PT0gJ3RydWUnKTtcbiAgfSxcblxuICBnZXRTZWxlY3Rpb25JbmZvcm1hdGlvbjogZnVuY3Rpb24gKCkge1xuICAgIHZhciBmb2N1c2VkRWxlbSA9IGdldEFjdGl2ZUVsZW1lbnQoKTtcbiAgICByZXR1cm4ge1xuICAgICAgZm9jdXNlZEVsZW06IGZvY3VzZWRFbGVtLFxuICAgICAgc2VsZWN0aW9uUmFuZ2U6IFJlYWN0SW5wdXRTZWxlY3Rpb24uaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGZvY3VzZWRFbGVtKSA/IFJlYWN0SW5wdXRTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uKGZvY3VzZWRFbGVtKSA6IG51bGxcbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBAcmVzdG9yZVNlbGVjdGlvbjogSWYgYW55IHNlbGVjdGlvbiBpbmZvcm1hdGlvbiB3YXMgcG90ZW50aWFsbHkgbG9zdCxcbiAgICogcmVzdG9yZSBpdC4gVGhpcyBpcyB1c2VmdWwgd2hlbiBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgdGhhdCBjb3VsZCByZW1vdmUgZG9tXG4gICAqIG5vZGVzIGFuZCBwbGFjZSB0aGVtIGJhY2sgaW4sIHJlc3VsdGluZyBpbiBmb2N1cyBiZWluZyBsb3N0LlxuICAgKi9cbiAgcmVzdG9yZVNlbGVjdGlvbjogZnVuY3Rpb24gKHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24pIHtcbiAgICB2YXIgY3VyRm9jdXNlZEVsZW0gPSBnZXRBY3RpdmVFbGVtZW50KCk7XG4gICAgdmFyIHByaW9yRm9jdXNlZEVsZW0gPSBwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uLmZvY3VzZWRFbGVtO1xuICAgIHZhciBwcmlvclNlbGVjdGlvblJhbmdlID0gcHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbi5zZWxlY3Rpb25SYW5nZTtcbiAgICBpZiAoY3VyRm9jdXNlZEVsZW0gIT09IHByaW9yRm9jdXNlZEVsZW0gJiYgaXNJbkRvY3VtZW50KHByaW9yRm9jdXNlZEVsZW0pKSB7XG4gICAgICBpZiAoUmVhY3RJbnB1dFNlbGVjdGlvbi5oYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMocHJpb3JGb2N1c2VkRWxlbSkpIHtcbiAgICAgICAgUmVhY3RJbnB1dFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24ocHJpb3JGb2N1c2VkRWxlbSwgcHJpb3JTZWxlY3Rpb25SYW5nZSk7XG4gICAgICB9XG4gICAgICBmb2N1c05vZGUocHJpb3JGb2N1c2VkRWxlbSk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBAZ2V0U2VsZWN0aW9uOiBHZXRzIHRoZSBzZWxlY3Rpb24gYm91bmRzIG9mIGEgZm9jdXNlZCB0ZXh0YXJlYSwgaW5wdXQgb3JcbiAgICogY29udGVudEVkaXRhYmxlIG5vZGUuXG4gICAqIC1AaW5wdXQ6IExvb2sgdXAgc2VsZWN0aW9uIGJvdW5kcyBvZiB0aGlzIGlucHV0XG4gICAqIC1AcmV0dXJuIHtzdGFydDogc2VsZWN0aW9uU3RhcnQsIGVuZDogc2VsZWN0aW9uRW5kfVxuICAgKi9cbiAgZ2V0U2VsZWN0aW9uOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICB2YXIgc2VsZWN0aW9uO1xuXG4gICAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gaW5wdXQpIHtcbiAgICAgIC8vIE1vZGVybiBicm93c2VyIHdpdGggaW5wdXQgb3IgdGV4dGFyZWEuXG4gICAgICBzZWxlY3Rpb24gPSB7XG4gICAgICAgIHN0YXJ0OiBpbnB1dC5zZWxlY3Rpb25TdGFydCxcbiAgICAgICAgZW5kOiBpbnB1dC5zZWxlY3Rpb25FbmRcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudC5zZWxlY3Rpb24gJiYgaW5wdXQubm9kZU5hbWUgJiYgaW5wdXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0Jykge1xuICAgICAgLy8gSUU4IGlucHV0LlxuICAgICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7XG4gICAgICAvLyBUaGVyZSBjYW4gb25seSBiZSBvbmUgc2VsZWN0aW9uIHBlciBkb2N1bWVudCBpbiBJRSwgc28gaXQgbXVzdFxuICAgICAgLy8gYmUgaW4gb3VyIGVsZW1lbnQuXG4gICAgICBpZiAocmFuZ2UucGFyZW50RWxlbWVudCgpID09PSBpbnB1dCkge1xuICAgICAgICBzZWxlY3Rpb24gPSB7XG4gICAgICAgICAgc3RhcnQ6IC1yYW5nZS5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIC1pbnB1dC52YWx1ZS5sZW5ndGgpLFxuICAgICAgICAgIGVuZDogLXJhbmdlLm1vdmVFbmQoJ2NoYXJhY3RlcicsIC1pbnB1dC52YWx1ZS5sZW5ndGgpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvbnRlbnQgZWRpdGFibGUgb3Igb2xkIElFIHRleHRhcmVhLlxuICAgICAgc2VsZWN0aW9uID0gUmVhY3RET01TZWxlY3Rpb24uZ2V0T2Zmc2V0cyhpbnB1dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGVjdGlvbiB8fCB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTtcbiAgfSxcblxuICAvKipcbiAgICogQHNldFNlbGVjdGlvbjogU2V0cyB0aGUgc2VsZWN0aW9uIGJvdW5kcyBvZiBhIHRleHRhcmVhIG9yIGlucHV0IGFuZCBmb2N1c2VzXG4gICAqIHRoZSBpbnB1dC5cbiAgICogLUBpbnB1dCAgICAgU2V0IHNlbGVjdGlvbiBib3VuZHMgb2YgdGhpcyBpbnB1dCBvciB0ZXh0YXJlYVxuICAgKiAtQG9mZnNldHMgICBPYmplY3Qgb2Ygc2FtZSBmb3JtIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSBnZXQqXG4gICAqL1xuICBzZXRTZWxlY3Rpb246IGZ1bmN0aW9uIChpbnB1dCwgb2Zmc2V0cykge1xuICAgIHZhciBzdGFydCA9IG9mZnNldHMuc3RhcnQ7XG4gICAgdmFyIGVuZCA9IG9mZnNldHMuZW5kO1xuICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZW5kID0gc3RhcnQ7XG4gICAgfVxuXG4gICAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gaW5wdXQpIHtcbiAgICAgIGlucHV0LnNlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7XG4gICAgICBpbnB1dC5zZWxlY3Rpb25FbmQgPSBNYXRoLm1pbihlbmQsIGlucHV0LnZhbHVlLmxlbmd0aCk7XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudC5zZWxlY3Rpb24gJiYgaW5wdXQubm9kZU5hbWUgJiYgaW5wdXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0Jykge1xuICAgICAgdmFyIHJhbmdlID0gaW5wdXQuY3JlYXRlVGV4dFJhbmdlKCk7XG4gICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgIHJhbmdlLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgc3RhcnQpO1xuICAgICAgcmFuZ2UubW92ZUVuZCgnY2hhcmFjdGVyJywgZW5kIC0gc3RhcnQpO1xuICAgICAgcmFuZ2Uuc2VsZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0RE9NU2VsZWN0aW9uLnNldE9mZnNldHMoaW5wdXQsIG9mZnNldHMpO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdElucHV0U2VsZWN0aW9uO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0SW5wdXRTZWxlY3Rpb24uanNcbi8vIG1vZHVsZSBpZCA9IDMxOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 320 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar ExecutionEnvironment = __webpack_require__(221);\n\nvar getNodeForCharacterOffset = __webpack_require__(321);\nvar getTextContentAccessor = __webpack_require__(224);\n\n/**\n * While `isCollapsed` is available on the Selection object and `collapsed`\n * is available on the Range object, IE11 sometimes gets them wrong.\n * If the anchor/focus nodes and offsets are the same, the range is collapsed.\n */\nfunction isCollapsed(anchorNode, anchorOffset, focusNode, focusOffset) {\n  return anchorNode === focusNode && anchorOffset === focusOffset;\n}\n\n/**\n * Get the appropriate anchor and focus node/offset pairs for IE.\n *\n * The catch here is that IE's selection API doesn't provide information\n * about whether the selection is forward or backward, so we have to\n * behave as though it's always forward.\n *\n * IE text differs from modern selection in that it behaves as though\n * block elements end with a new line. This means character offsets will\n * differ between the two APIs.\n *\n * @param {DOMElement} node\n * @return {object}\n */\nfunction getIEOffsets(node) {\n  var selection = document.selection;\n  var selectedRange = selection.createRange();\n  var selectedLength = selectedRange.text.length;\n\n  // Duplicate selection so we can move range without breaking user selection.\n  var fromStart = selectedRange.duplicate();\n  fromStart.moveToElementText(node);\n  fromStart.setEndPoint('EndToStart', selectedRange);\n\n  var startOffset = fromStart.text.length;\n  var endOffset = startOffset + selectedLength;\n\n  return {\n    start: startOffset,\n    end: endOffset\n  };\n}\n\n/**\n * @param {DOMElement} node\n * @return {?object}\n */\nfunction getModernOffsets(node) {\n  var selection = window.getSelection && window.getSelection();\n\n  if (!selection || selection.rangeCount === 0) {\n    return null;\n  }\n\n  var anchorNode = selection.anchorNode;\n  var anchorOffset = selection.anchorOffset;\n  var focusNode = selection.focusNode;\n  var focusOffset = selection.focusOffset;\n\n  var currentRange = selection.getRangeAt(0);\n\n  // In Firefox, range.startContainer and range.endContainer can be \"anonymous\n  // divs\", e.g. the up/down buttons on an <input type=\"number\">. Anonymous\n  // divs do not seem to expose properties, triggering a \"Permission denied\n  // error\" if any of its properties are accessed. The only seemingly possible\n  // way to avoid erroring is to access a property that typically works for\n  // non-anonymous divs and catch any error that may otherwise arise. See\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=208427\n  try {\n    /* eslint-disable no-unused-expressions */\n    currentRange.startContainer.nodeType;\n    currentRange.endContainer.nodeType;\n    /* eslint-enable no-unused-expressions */\n  } catch (e) {\n    return null;\n  }\n\n  // If the node and offset values are the same, the selection is collapsed.\n  // `Selection.isCollapsed` is available natively, but IE sometimes gets\n  // this value wrong.\n  var isSelectionCollapsed = isCollapsed(selection.anchorNode, selection.anchorOffset, selection.focusNode, selection.focusOffset);\n\n  var rangeLength = isSelectionCollapsed ? 0 : currentRange.toString().length;\n\n  var tempRange = currentRange.cloneRange();\n  tempRange.selectNodeContents(node);\n  tempRange.setEnd(currentRange.startContainer, currentRange.startOffset);\n\n  var isTempRangeCollapsed = isCollapsed(tempRange.startContainer, tempRange.startOffset, tempRange.endContainer, tempRange.endOffset);\n\n  var start = isTempRangeCollapsed ? 0 : tempRange.toString().length;\n  var end = start + rangeLength;\n\n  // Detect whether the selection is backward.\n  var detectionRange = document.createRange();\n  detectionRange.setStart(anchorNode, anchorOffset);\n  detectionRange.setEnd(focusNode, focusOffset);\n  var isBackward = detectionRange.collapsed;\n\n  return {\n    start: isBackward ? end : start,\n    end: isBackward ? start : end\n  };\n}\n\n/**\n * @param {DOMElement|DOMTextNode} node\n * @param {object} offsets\n */\nfunction setIEOffsets(node, offsets) {\n  var range = document.selection.createRange().duplicate();\n  var start, end;\n\n  if (offsets.end === undefined) {\n    start = offsets.start;\n    end = start;\n  } else if (offsets.start > offsets.end) {\n    start = offsets.end;\n    end = offsets.start;\n  } else {\n    start = offsets.start;\n    end = offsets.end;\n  }\n\n  range.moveToElementText(node);\n  range.moveStart('character', start);\n  range.setEndPoint('EndToStart', range);\n  range.moveEnd('character', end - start);\n  range.select();\n}\n\n/**\n * In modern non-IE browsers, we can support both forward and backward\n * selections.\n *\n * Note: IE10+ supports the Selection object, but it does not support\n * the `extend` method, which means that even in modern IE, it's not possible\n * to programmatically create a backward selection. Thus, for all IE\n * versions, we use the old IE API to create our selections.\n *\n * @param {DOMElement|DOMTextNode} node\n * @param {object} offsets\n */\nfunction setModernOffsets(node, offsets) {\n  if (!window.getSelection) {\n    return;\n  }\n\n  var selection = window.getSelection();\n  var length = node[getTextContentAccessor()].length;\n  var start = Math.min(offsets.start, length);\n  var end = offsets.end === undefined ? start : Math.min(offsets.end, length);\n\n  // IE 11 uses modern selection, but doesn't support the extend method.\n  // Flip backward selections, so we can set with a single range.\n  if (!selection.extend && start > end) {\n    var temp = end;\n    end = start;\n    start = temp;\n  }\n\n  var startMarker = getNodeForCharacterOffset(node, start);\n  var endMarker = getNodeForCharacterOffset(node, end);\n\n  if (startMarker && endMarker) {\n    var range = document.createRange();\n    range.setStart(startMarker.node, startMarker.offset);\n    selection.removeAllRanges();\n\n    if (start > end) {\n      selection.addRange(range);\n      selection.extend(endMarker.node, endMarker.offset);\n    } else {\n      range.setEnd(endMarker.node, endMarker.offset);\n      selection.addRange(range);\n    }\n  }\n}\n\nvar useIEOffsets = ExecutionEnvironment.canUseDOM && 'selection' in document && !('getSelection' in window);\n\nvar ReactDOMSelection = {\n  /**\n   * @param {DOMElement} node\n   */\n  getOffsets: useIEOffsets ? getIEOffsets : getModernOffsets,\n\n  /**\n   * @param {DOMElement|DOMTextNode} node\n   * @param {object} offsets\n   */\n  setOffsets: useIEOffsets ? setIEOffsets : setModernOffsets\n};\n\nmodule.exports = ReactDOMSelection;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzIwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NU2VsZWN0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG5cbnZhciBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0ID0gcmVxdWlyZSgnLi9nZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0Jyk7XG52YXIgZ2V0VGV4dENvbnRlbnRBY2Nlc3NvciA9IHJlcXVpcmUoJy4vZ2V0VGV4dENvbnRlbnRBY2Nlc3NvcicpO1xuXG4vKipcbiAqIFdoaWxlIGBpc0NvbGxhcHNlZGAgaXMgYXZhaWxhYmxlIG9uIHRoZSBTZWxlY3Rpb24gb2JqZWN0IGFuZCBgY29sbGFwc2VkYFxuICogaXMgYXZhaWxhYmxlIG9uIHRoZSBSYW5nZSBvYmplY3QsIElFMTEgc29tZXRpbWVzIGdldHMgdGhlbSB3cm9uZy5cbiAqIElmIHRoZSBhbmNob3IvZm9jdXMgbm9kZXMgYW5kIG9mZnNldHMgYXJlIHRoZSBzYW1lLCB0aGUgcmFuZ2UgaXMgY29sbGFwc2VkLlxuICovXG5mdW5jdGlvbiBpc0NvbGxhcHNlZChhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpIHtcbiAgcmV0dXJuIGFuY2hvck5vZGUgPT09IGZvY3VzTm9kZSAmJiBhbmNob3JPZmZzZXQgPT09IGZvY3VzT2Zmc2V0O1xufVxuXG4vKipcbiAqIEdldCB0aGUgYXBwcm9wcmlhdGUgYW5jaG9yIGFuZCBmb2N1cyBub2RlL29mZnNldCBwYWlycyBmb3IgSUUuXG4gKlxuICogVGhlIGNhdGNoIGhlcmUgaXMgdGhhdCBJRSdzIHNlbGVjdGlvbiBBUEkgZG9lc24ndCBwcm92aWRlIGluZm9ybWF0aW9uXG4gKiBhYm91dCB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gaXMgZm9yd2FyZCBvciBiYWNrd2FyZCwgc28gd2UgaGF2ZSB0b1xuICogYmVoYXZlIGFzIHRob3VnaCBpdCdzIGFsd2F5cyBmb3J3YXJkLlxuICpcbiAqIElFIHRleHQgZGlmZmVycyBmcm9tIG1vZGVybiBzZWxlY3Rpb24gaW4gdGhhdCBpdCBiZWhhdmVzIGFzIHRob3VnaFxuICogYmxvY2sgZWxlbWVudHMgZW5kIHdpdGggYSBuZXcgbGluZS4gVGhpcyBtZWFucyBjaGFyYWN0ZXIgb2Zmc2V0cyB3aWxsXG4gKiBkaWZmZXIgYmV0d2VlbiB0aGUgdHdvIEFQSXMuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGdldElFT2Zmc2V0cyhub2RlKSB7XG4gIHZhciBzZWxlY3Rpb24gPSBkb2N1bWVudC5zZWxlY3Rpb247XG4gIHZhciBzZWxlY3RlZFJhbmdlID0gc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7XG4gIHZhciBzZWxlY3RlZExlbmd0aCA9IHNlbGVjdGVkUmFuZ2UudGV4dC5sZW5ndGg7XG5cbiAgLy8gRHVwbGljYXRlIHNlbGVjdGlvbiBzbyB3ZSBjYW4gbW92ZSByYW5nZSB3aXRob3V0IGJyZWFraW5nIHVzZXIgc2VsZWN0aW9uLlxuICB2YXIgZnJvbVN0YXJ0ID0gc2VsZWN0ZWRSYW5nZS5kdXBsaWNhdGUoKTtcbiAgZnJvbVN0YXJ0Lm1vdmVUb0VsZW1lbnRUZXh0KG5vZGUpO1xuICBmcm9tU3RhcnQuc2V0RW5kUG9pbnQoJ0VuZFRvU3RhcnQnLCBzZWxlY3RlZFJhbmdlKTtcblxuICB2YXIgc3RhcnRPZmZzZXQgPSBmcm9tU3RhcnQudGV4dC5sZW5ndGg7XG4gIHZhciBlbmRPZmZzZXQgPSBzdGFydE9mZnNldCArIHNlbGVjdGVkTGVuZ3RoO1xuXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHN0YXJ0T2Zmc2V0LFxuICAgIGVuZDogZW5kT2Zmc2V0XG4gIH07XG59XG5cbi8qKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRNb2Rlcm5PZmZzZXRzKG5vZGUpIHtcbiAgdmFyIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24gJiYgd2luZG93LmdldFNlbGVjdGlvbigpO1xuXG4gIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgYW5jaG9yTm9kZSA9IHNlbGVjdGlvbi5hbmNob3JOb2RlO1xuICB2YXIgYW5jaG9yT2Zmc2V0ID0gc2VsZWN0aW9uLmFuY2hvck9mZnNldDtcbiAgdmFyIGZvY3VzTm9kZSA9IHNlbGVjdGlvbi5mb2N1c05vZGU7XG4gIHZhciBmb2N1c09mZnNldCA9IHNlbGVjdGlvbi5mb2N1c09mZnNldDtcblxuICB2YXIgY3VycmVudFJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG5cbiAgLy8gSW4gRmlyZWZveCwgcmFuZ2Uuc3RhcnRDb250YWluZXIgYW5kIHJhbmdlLmVuZENvbnRhaW5lciBjYW4gYmUgXCJhbm9ueW1vdXNcbiAgLy8gZGl2c1wiLCBlLmcuIHRoZSB1cC9kb3duIGJ1dHRvbnMgb24gYW4gPGlucHV0IHR5cGU9XCJudW1iZXJcIj4uIEFub255bW91c1xuICAvLyBkaXZzIGRvIG5vdCBzZWVtIHRvIGV4cG9zZSBwcm9wZXJ0aWVzLCB0cmlnZ2VyaW5nIGEgXCJQZXJtaXNzaW9uIGRlbmllZFxuICAvLyBlcnJvclwiIGlmIGFueSBvZiBpdHMgcHJvcGVydGllcyBhcmUgYWNjZXNzZWQuIFRoZSBvbmx5IHNlZW1pbmdseSBwb3NzaWJsZVxuICAvLyB3YXkgdG8gYXZvaWQgZXJyb3JpbmcgaXMgdG8gYWNjZXNzIGEgcHJvcGVydHkgdGhhdCB0eXBpY2FsbHkgd29ya3MgZm9yXG4gIC8vIG5vbi1hbm9ueW1vdXMgZGl2cyBhbmQgY2F0Y2ggYW55IGVycm9yIHRoYXQgbWF5IG90aGVyd2lzZSBhcmlzZS4gU2VlXG4gIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTIwODQyN1xuICB0cnkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuICAgIGN1cnJlbnRSYW5nZS5zdGFydENvbnRhaW5lci5ub2RlVHlwZTtcbiAgICBjdXJyZW50UmFuZ2UuZW5kQ29udGFpbmVyLm5vZGVUeXBlO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIElmIHRoZSBub2RlIGFuZCBvZmZzZXQgdmFsdWVzIGFyZSB0aGUgc2FtZSwgdGhlIHNlbGVjdGlvbiBpcyBjb2xsYXBzZWQuXG4gIC8vIGBTZWxlY3Rpb24uaXNDb2xsYXBzZWRgIGlzIGF2YWlsYWJsZSBuYXRpdmVseSwgYnV0IElFIHNvbWV0aW1lcyBnZXRzXG4gIC8vIHRoaXMgdmFsdWUgd3JvbmcuXG4gIHZhciBpc1NlbGVjdGlvbkNvbGxhcHNlZCA9IGlzQ29sbGFwc2VkKHNlbGVjdGlvbi5hbmNob3JOb2RlLCBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LCBzZWxlY3Rpb24uZm9jdXNOb2RlLCBzZWxlY3Rpb24uZm9jdXNPZmZzZXQpO1xuXG4gIHZhciByYW5nZUxlbmd0aCA9IGlzU2VsZWN0aW9uQ29sbGFwc2VkID8gMCA6IGN1cnJlbnRSYW5nZS50b1N0cmluZygpLmxlbmd0aDtcblxuICB2YXIgdGVtcFJhbmdlID0gY3VycmVudFJhbmdlLmNsb25lUmFuZ2UoKTtcbiAgdGVtcFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhub2RlKTtcbiAgdGVtcFJhbmdlLnNldEVuZChjdXJyZW50UmFuZ2Uuc3RhcnRDb250YWluZXIsIGN1cnJlbnRSYW5nZS5zdGFydE9mZnNldCk7XG5cbiAgdmFyIGlzVGVtcFJhbmdlQ29sbGFwc2VkID0gaXNDb2xsYXBzZWQodGVtcFJhbmdlLnN0YXJ0Q29udGFpbmVyLCB0ZW1wUmFuZ2Uuc3RhcnRPZmZzZXQsIHRlbXBSYW5nZS5lbmRDb250YWluZXIsIHRlbXBSYW5nZS5lbmRPZmZzZXQpO1xuXG4gIHZhciBzdGFydCA9IGlzVGVtcFJhbmdlQ29sbGFwc2VkID8gMCA6IHRlbXBSYW5nZS50b1N0cmluZygpLmxlbmd0aDtcbiAgdmFyIGVuZCA9IHN0YXJ0ICsgcmFuZ2VMZW5ndGg7XG5cbiAgLy8gRGV0ZWN0IHdoZXRoZXIgdGhlIHNlbGVjdGlvbiBpcyBiYWNrd2FyZC5cbiAgdmFyIGRldGVjdGlvblJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgZGV0ZWN0aW9uUmFuZ2Uuc2V0U3RhcnQoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0KTtcbiAgZGV0ZWN0aW9uUmFuZ2Uuc2V0RW5kKGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpO1xuICB2YXIgaXNCYWNrd2FyZCA9IGRldGVjdGlvblJhbmdlLmNvbGxhcHNlZDtcblxuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBpc0JhY2t3YXJkID8gZW5kIDogc3RhcnQsXG4gICAgZW5kOiBpc0JhY2t3YXJkID8gc3RhcnQgOiBlbmRcbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvZmZzZXRzXG4gKi9cbmZ1bmN0aW9uIHNldElFT2Zmc2V0cyhub2RlLCBvZmZzZXRzKSB7XG4gIHZhciByYW5nZSA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLmR1cGxpY2F0ZSgpO1xuICB2YXIgc3RhcnQsIGVuZDtcblxuICBpZiAob2Zmc2V0cy5lbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gb2Zmc2V0cy5zdGFydDtcbiAgICBlbmQgPSBzdGFydDtcbiAgfSBlbHNlIGlmIChvZmZzZXRzLnN0YXJ0ID4gb2Zmc2V0cy5lbmQpIHtcbiAgICBzdGFydCA9IG9mZnNldHMuZW5kO1xuICAgIGVuZCA9IG9mZnNldHMuc3RhcnQ7XG4gIH0gZWxzZSB7XG4gICAgc3RhcnQgPSBvZmZzZXRzLnN0YXJ0O1xuICAgIGVuZCA9IG9mZnNldHMuZW5kO1xuICB9XG5cbiAgcmFuZ2UubW92ZVRvRWxlbWVudFRleHQobm9kZSk7XG4gIHJhbmdlLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgc3RhcnQpO1xuICByYW5nZS5zZXRFbmRQb2ludCgnRW5kVG9TdGFydCcsIHJhbmdlKTtcbiAgcmFuZ2UubW92ZUVuZCgnY2hhcmFjdGVyJywgZW5kIC0gc3RhcnQpO1xuICByYW5nZS5zZWxlY3QoKTtcbn1cblxuLyoqXG4gKiBJbiBtb2Rlcm4gbm9uLUlFIGJyb3dzZXJzLCB3ZSBjYW4gc3VwcG9ydCBib3RoIGZvcndhcmQgYW5kIGJhY2t3YXJkXG4gKiBzZWxlY3Rpb25zLlxuICpcbiAqIE5vdGU6IElFMTArIHN1cHBvcnRzIHRoZSBTZWxlY3Rpb24gb2JqZWN0LCBidXQgaXQgZG9lcyBub3Qgc3VwcG9ydFxuICogdGhlIGBleHRlbmRgIG1ldGhvZCwgd2hpY2ggbWVhbnMgdGhhdCBldmVuIGluIG1vZGVybiBJRSwgaXQncyBub3QgcG9zc2libGVcbiAqIHRvIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlIGEgYmFja3dhcmQgc2VsZWN0aW9uLiBUaHVzLCBmb3IgYWxsIElFXG4gKiB2ZXJzaW9ucywgd2UgdXNlIHRoZSBvbGQgSUUgQVBJIHRvIGNyZWF0ZSBvdXIgc2VsZWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvZmZzZXRzXG4gKi9cbmZ1bmN0aW9uIHNldE1vZGVybk9mZnNldHMobm9kZSwgb2Zmc2V0cykge1xuICBpZiAoIXdpbmRvdy5nZXRTZWxlY3Rpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICB2YXIgbGVuZ3RoID0gbm9kZVtnZXRUZXh0Q29udGVudEFjY2Vzc29yKCldLmxlbmd0aDtcbiAgdmFyIHN0YXJ0ID0gTWF0aC5taW4ob2Zmc2V0cy5zdGFydCwgbGVuZ3RoKTtcbiAgdmFyIGVuZCA9IG9mZnNldHMuZW5kID09PSB1bmRlZmluZWQgPyBzdGFydCA6IE1hdGgubWluKG9mZnNldHMuZW5kLCBsZW5ndGgpO1xuXG4gIC8vIElFIDExIHVzZXMgbW9kZXJuIHNlbGVjdGlvbiwgYnV0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZXh0ZW5kIG1ldGhvZC5cbiAgLy8gRmxpcCBiYWNrd2FyZCBzZWxlY3Rpb25zLCBzbyB3ZSBjYW4gc2V0IHdpdGggYSBzaW5nbGUgcmFuZ2UuXG4gIGlmICghc2VsZWN0aW9uLmV4dGVuZCAmJiBzdGFydCA+IGVuZCkge1xuICAgIHZhciB0ZW1wID0gZW5kO1xuICAgIGVuZCA9IHN0YXJ0O1xuICAgIHN0YXJ0ID0gdGVtcDtcbiAgfVxuXG4gIHZhciBzdGFydE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQobm9kZSwgc3RhcnQpO1xuICB2YXIgZW5kTWFya2VyID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChub2RlLCBlbmQpO1xuXG4gIGlmIChzdGFydE1hcmtlciAmJiBlbmRNYXJrZXIpIHtcbiAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNldFN0YXJ0KHN0YXJ0TWFya2VyLm5vZGUsIHN0YXJ0TWFya2VyLm9mZnNldCk7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSB7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgc2VsZWN0aW9uLmV4dGVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlLnNldEVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgdXNlSUVPZmZzZXRzID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NICYmICdzZWxlY3Rpb24nIGluIGRvY3VtZW50ICYmICEoJ2dldFNlbGVjdGlvbicgaW4gd2luZG93KTtcblxudmFyIFJlYWN0RE9NU2VsZWN0aW9uID0ge1xuICAvKipcbiAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gICAqL1xuICBnZXRPZmZzZXRzOiB1c2VJRU9mZnNldHMgPyBnZXRJRU9mZnNldHMgOiBnZXRNb2Rlcm5PZmZzZXRzLFxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAgICogQHBhcmFtIHtvYmplY3R9IG9mZnNldHNcbiAgICovXG4gIHNldE9mZnNldHM6IHVzZUlFT2Zmc2V0cyA/IHNldElFT2Zmc2V0cyA6IHNldE1vZGVybk9mZnNldHNcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01TZWxlY3Rpb247XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RET01TZWxlY3Rpb24uanNcbi8vIG1vZHVsZSBpZCA9IDMyMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 321 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\n/**\n * Given any node return the first leaf node without children.\n *\n * @param {DOMElement|DOMTextNode} node\n * @return {DOMElement|DOMTextNode}\n */\n\nfunction getLeafNode(node) {\n  while (node && node.firstChild) {\n    node = node.firstChild;\n  }\n  return node;\n}\n\n/**\n * Get the next sibling within a container. This will walk up the\n * DOM if a node's siblings have been exhausted.\n *\n * @param {DOMElement|DOMTextNode} node\n * @return {?DOMElement|DOMTextNode}\n */\nfunction getSiblingNode(node) {\n  while (node) {\n    if (node.nextSibling) {\n      return node.nextSibling;\n    }\n    node = node.parentNode;\n  }\n}\n\n/**\n * Get object describing the nodes which contain characters at offset.\n *\n * @param {DOMElement|DOMTextNode} root\n * @param {number} offset\n * @return {?object}\n */\nfunction getNodeForCharacterOffset(root, offset) {\n  var node = getLeafNode(root);\n  var nodeStart = 0;\n  var nodeEnd = 0;\n\n  while (node) {\n    if (node.nodeType === 3) {\n      nodeEnd = nodeStart + node.textContent.length;\n\n      if (nodeStart <= offset && nodeEnd >= offset) {\n        return {\n          node: node,\n          offset: offset - nodeStart\n        };\n      }\n\n      nodeStart = nodeEnd;\n    }\n\n    node = getLeafNode(getSiblingNode(node));\n  }\n}\n\nmodule.exports = getNodeForCharacterOffset;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzIxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2dldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBHaXZlbiBhbnkgbm9kZSByZXR1cm4gdGhlIGZpcnN0IGxlYWYgbm9kZSB3aXRob3V0IGNoaWxkcmVuLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHJldHVybiB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX1cbiAqL1xuXG5mdW5jdGlvbiBnZXRMZWFmTm9kZShub2RlKSB7XG4gIHdoaWxlIChub2RlICYmIG5vZGUuZmlyc3RDaGlsZCkge1xuICAgIG5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gIH1cbiAgcmV0dXJuIG5vZGU7XG59XG5cbi8qKlxuICogR2V0IHRoZSBuZXh0IHNpYmxpbmcgd2l0aGluIGEgY29udGFpbmVyLiBUaGlzIHdpbGwgd2FsayB1cCB0aGVcbiAqIERPTSBpZiBhIG5vZGUncyBzaWJsaW5ncyBoYXZlIGJlZW4gZXhoYXVzdGVkLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHJldHVybiB7P0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9XG4gKi9cbmZ1bmN0aW9uIGdldFNpYmxpbmdOb2RlKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5uZXh0U2libGluZykge1xuICAgICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XG4gICAgfVxuICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIG5vZGVzIHdoaWNoIGNvbnRhaW4gY2hhcmFjdGVycyBhdCBvZmZzZXQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSByb290XG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KHJvb3QsIG9mZnNldCkge1xuICB2YXIgbm9kZSA9IGdldExlYWZOb2RlKHJvb3QpO1xuICB2YXIgbm9kZVN0YXJ0ID0gMDtcbiAgdmFyIG5vZGVFbmQgPSAwO1xuXG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgIG5vZGVFbmQgPSBub2RlU3RhcnQgKyBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcblxuICAgICAgaWYgKG5vZGVTdGFydCA8PSBvZmZzZXQgJiYgbm9kZUVuZCA+PSBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgIG9mZnNldDogb2Zmc2V0IC0gbm9kZVN0YXJ0XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIG5vZGVTdGFydCA9IG5vZGVFbmQ7XG4gICAgfVxuXG4gICAgbm9kZSA9IGdldExlYWZOb2RlKGdldFNpYmxpbmdOb2RlKG5vZGUpKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQ7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldC5qc1xuLy8gbW9kdWxlIGlkID0gMzIxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 322 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\nvar isTextNode = __webpack_require__(323);\n\n/*eslint-disable no-bitwise */\n\n/**\n * Checks if a given DOM node contains or is another DOM node.\n */\nfunction containsNode(outerNode, innerNode) {\n  if (!outerNode || !innerNode) {\n    return false;\n  } else if (outerNode === innerNode) {\n    return true;\n  } else if (isTextNode(outerNode)) {\n    return false;\n  } else if (isTextNode(innerNode)) {\n    return containsNode(outerNode, innerNode.parentNode);\n  } else if ('contains' in outerNode) {\n    return outerNode.contains(innerNode);\n  } else if (outerNode.compareDocumentPosition) {\n    return !!(outerNode.compareDocumentPosition(innerNode) & 16);\n  } else {\n    return false;\n  }\n}\n\nmodule.exports = containsNode;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzIyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9jb250YWluc05vZGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxudmFyIGlzVGV4dE5vZGUgPSByZXF1aXJlKCcuL2lzVGV4dE5vZGUnKTtcblxuLyplc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlICovXG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZ2l2ZW4gRE9NIG5vZGUgY29udGFpbnMgb3IgaXMgYW5vdGhlciBET00gbm9kZS5cbiAqL1xuZnVuY3Rpb24gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlKSB7XG4gIGlmICghb3V0ZXJOb2RlIHx8ICFpbm5lck5vZGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAob3V0ZXJOb2RlID09PSBpbm5lck5vZGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc1RleHROb2RlKG91dGVyTm9kZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAoaXNUZXh0Tm9kZShpbm5lck5vZGUpKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5zTm9kZShvdXRlck5vZGUsIGlubmVyTm9kZS5wYXJlbnROb2RlKTtcbiAgfSBlbHNlIGlmICgnY29udGFpbnMnIGluIG91dGVyTm9kZSkge1xuICAgIHJldHVybiBvdXRlck5vZGUuY29udGFpbnMoaW5uZXJOb2RlKTtcbiAgfSBlbHNlIGlmIChvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24pIHtcbiAgICByZXR1cm4gISEob3V0ZXJOb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGlubmVyTm9kZSkgJiAxNik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29udGFpbnNOb2RlO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9mYmpzL2xpYi9jb250YWluc05vZGUuanNcbi8vIG1vZHVsZSBpZCA9IDMyMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 323 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @typechecks\n */\n\nvar isNode = __webpack_require__(324);\n\n/**\n * @param {*} object The object to check.\n * @return {boolean} Whether or not the object is a DOM text node.\n */\nfunction isTextNode(object) {\n  return isNode(object) && object.nodeType == 3;\n}\n\nmodule.exports = isTextNode;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzIzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9pc1RleHROb2RlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxudmFyIGlzTm9kZSA9IHJlcXVpcmUoJy4vaXNOb2RlJyk7XG5cbi8qKlxuICogQHBhcmFtIHsqfSBvYmplY3QgVGhlIG9iamVjdCB0byBjaGVjay5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgb3Igbm90IHRoZSBvYmplY3QgaXMgYSBET00gdGV4dCBub2RlLlxuICovXG5mdW5jdGlvbiBpc1RleHROb2RlKG9iamVjdCkge1xuICByZXR1cm4gaXNOb2RlKG9iamVjdCkgJiYgb2JqZWN0Lm5vZGVUeXBlID09IDM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNUZXh0Tm9kZTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZmJqcy9saWIvaXNUZXh0Tm9kZS5qc1xuLy8gbW9kdWxlIGlkID0gMzIzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 324 */
/***/ function(module, exports) {

    eval("'use strict';\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @typechecks\n */\n\n/**\n * @param {*} object The object to check.\n * @return {boolean} Whether or not the object is a DOM node.\n */\nfunction isNode(object) {\n  return !!(object && (typeof Node === 'function' ? object instanceof Node : typeof object === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string'));\n}\n\nmodule.exports = isNode;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzI0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9pc05vZGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHR5cGVjaGVja3NcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2hlY2suXG4gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIG9yIG5vdCB0aGUgb2JqZWN0IGlzIGEgRE9NIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIGlzTm9kZShvYmplY3QpIHtcbiAgcmV0dXJuICEhKG9iamVjdCAmJiAodHlwZW9mIE5vZGUgPT09ICdmdW5jdGlvbicgPyBvYmplY3QgaW5zdGFuY2VvZiBOb2RlIDogdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9iamVjdC5ub2RlVHlwZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIG9iamVjdC5ub2RlTmFtZSA9PT0gJ3N0cmluZycpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc05vZGU7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2ZianMvbGliL2lzTm9kZS5qc1xuLy8gbW9kdWxlIGlkID0gMzI0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 325 */
/***/ function(module, exports) {

    eval("'use strict';\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @typechecks\n */\n\n/* eslint-disable fb-www/typeof-undefined */\n\n/**\n * Same as document.activeElement but wraps in a try-catch block. In IE it is\n * not safe to call document.activeElement if there is nothing focused.\n *\n * The activeElement will be null only if the document or document body is not\n * yet defined.\n */\nfunction getActiveElement() /*?DOMElement*/{\n  if (typeof document === 'undefined') {\n    return null;\n  }\n  try {\n    return document.activeElement || document.body;\n  } catch (e) {\n    return document.body;\n  }\n}\n\nmodule.exports = getActiveElement;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzI1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9nZXRBY3RpdmVFbGVtZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgZmItd3d3L3R5cGVvZi11bmRlZmluZWQgKi9cblxuLyoqXG4gKiBTYW1lIGFzIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYnV0IHdyYXBzIGluIGEgdHJ5LWNhdGNoIGJsb2NrLiBJbiBJRSBpdCBpc1xuICogbm90IHNhZmUgdG8gY2FsbCBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGlmIHRoZXJlIGlzIG5vdGhpbmcgZm9jdXNlZC5cbiAqXG4gKiBUaGUgYWN0aXZlRWxlbWVudCB3aWxsIGJlIG51bGwgb25seSBpZiB0aGUgZG9jdW1lbnQgb3IgZG9jdW1lbnQgYm9keSBpcyBub3RcbiAqIHlldCBkZWZpbmVkLlxuICovXG5mdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50KCkgLyo/RE9NRWxlbWVudCove1xuICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5ib2R5O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QWN0aXZlRWxlbWVudDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZmJqcy9saWIvZ2V0QWN0aXZlRWxlbWVudC5qc1xuLy8gbW9kdWxlIGlkID0gMzI1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 326 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar NS = {\n  xlink: 'http://www.w3.org/1999/xlink',\n  xml: 'http://www.w3.org/XML/1998/namespace'\n};\n\n// We use attributes for everything SVG so let's avoid some duplication and run\n// code instead.\n// The following are all specified in the HTML config already so we exclude here.\n// - class (as className)\n// - color\n// - height\n// - id\n// - lang\n// - max\n// - media\n// - method\n// - min\n// - name\n// - style\n// - target\n// - type\n// - width\nvar ATTRS = {\n  accentHeight: 'accent-height',\n  accumulate: 0,\n  additive: 0,\n  alignmentBaseline: 'alignment-baseline',\n  allowReorder: 'allowReorder',\n  alphabetic: 0,\n  amplitude: 0,\n  arabicForm: 'arabic-form',\n  ascent: 0,\n  attributeName: 'attributeName',\n  attributeType: 'attributeType',\n  autoReverse: 'autoReverse',\n  azimuth: 0,\n  baseFrequency: 'baseFrequency',\n  baseProfile: 'baseProfile',\n  baselineShift: 'baseline-shift',\n  bbox: 0,\n  begin: 0,\n  bias: 0,\n  by: 0,\n  calcMode: 'calcMode',\n  capHeight: 'cap-height',\n  clip: 0,\n  clipPath: 'clip-path',\n  clipRule: 'clip-rule',\n  clipPathUnits: 'clipPathUnits',\n  colorInterpolation: 'color-interpolation',\n  colorInterpolationFilters: 'color-interpolation-filters',\n  colorProfile: 'color-profile',\n  colorRendering: 'color-rendering',\n  contentScriptType: 'contentScriptType',\n  contentStyleType: 'contentStyleType',\n  cursor: 0,\n  cx: 0,\n  cy: 0,\n  d: 0,\n  decelerate: 0,\n  descent: 0,\n  diffuseConstant: 'diffuseConstant',\n  direction: 0,\n  display: 0,\n  divisor: 0,\n  dominantBaseline: 'dominant-baseline',\n  dur: 0,\n  dx: 0,\n  dy: 0,\n  edgeMode: 'edgeMode',\n  elevation: 0,\n  enableBackground: 'enable-background',\n  end: 0,\n  exponent: 0,\n  externalResourcesRequired: 'externalResourcesRequired',\n  fill: 0,\n  fillOpacity: 'fill-opacity',\n  fillRule: 'fill-rule',\n  filter: 0,\n  filterRes: 'filterRes',\n  filterUnits: 'filterUnits',\n  floodColor: 'flood-color',\n  floodOpacity: 'flood-opacity',\n  focusable: 0,\n  fontFamily: 'font-family',\n  fontSize: 'font-size',\n  fontSizeAdjust: 'font-size-adjust',\n  fontStretch: 'font-stretch',\n  fontStyle: 'font-style',\n  fontVariant: 'font-variant',\n  fontWeight: 'font-weight',\n  format: 0,\n  from: 0,\n  fx: 0,\n  fy: 0,\n  g1: 0,\n  g2: 0,\n  glyphName: 'glyph-name',\n  glyphOrientationHorizontal: 'glyph-orientation-horizontal',\n  glyphOrientationVertical: 'glyph-orientation-vertical',\n  glyphRef: 'glyphRef',\n  gradientTransform: 'gradientTransform',\n  gradientUnits: 'gradientUnits',\n  hanging: 0,\n  horizAdvX: 'horiz-adv-x',\n  horizOriginX: 'horiz-origin-x',\n  ideographic: 0,\n  imageRendering: 'image-rendering',\n  'in': 0,\n  in2: 0,\n  intercept: 0,\n  k: 0,\n  k1: 0,\n  k2: 0,\n  k3: 0,\n  k4: 0,\n  kernelMatrix: 'kernelMatrix',\n  kernelUnitLength: 'kernelUnitLength',\n  kerning: 0,\n  keyPoints: 'keyPoints',\n  keySplines: 'keySplines',\n  keyTimes: 'keyTimes',\n  lengthAdjust: 'lengthAdjust',\n  letterSpacing: 'letter-spacing',\n  lightingColor: 'lighting-color',\n  limitingConeAngle: 'limitingConeAngle',\n  local: 0,\n  markerEnd: 'marker-end',\n  markerMid: 'marker-mid',\n  markerStart: 'marker-start',\n  markerHeight: 'markerHeight',\n  markerUnits: 'markerUnits',\n  markerWidth: 'markerWidth',\n  mask: 0,\n  maskContentUnits: 'maskContentUnits',\n  maskUnits: 'maskUnits',\n  mathematical: 0,\n  mode: 0,\n  numOctaves: 'numOctaves',\n  offset: 0,\n  opacity: 0,\n  operator: 0,\n  order: 0,\n  orient: 0,\n  orientation: 0,\n  origin: 0,\n  overflow: 0,\n  overlinePosition: 'overline-position',\n  overlineThickness: 'overline-thickness',\n  paintOrder: 'paint-order',\n  panose1: 'panose-1',\n  pathLength: 'pathLength',\n  patternContentUnits: 'patternContentUnits',\n  patternTransform: 'patternTransform',\n  patternUnits: 'patternUnits',\n  pointerEvents: 'pointer-events',\n  points: 0,\n  pointsAtX: 'pointsAtX',\n  pointsAtY: 'pointsAtY',\n  pointsAtZ: 'pointsAtZ',\n  preserveAlpha: 'preserveAlpha',\n  preserveAspectRatio: 'preserveAspectRatio',\n  primitiveUnits: 'primitiveUnits',\n  r: 0,\n  radius: 0,\n  refX: 'refX',\n  refY: 'refY',\n  renderingIntent: 'rendering-intent',\n  repeatCount: 'repeatCount',\n  repeatDur: 'repeatDur',\n  requiredExtensions: 'requiredExtensions',\n  requiredFeatures: 'requiredFeatures',\n  restart: 0,\n  result: 0,\n  rotate: 0,\n  rx: 0,\n  ry: 0,\n  scale: 0,\n  seed: 0,\n  shapeRendering: 'shape-rendering',\n  slope: 0,\n  spacing: 0,\n  specularConstant: 'specularConstant',\n  specularExponent: 'specularExponent',\n  speed: 0,\n  spreadMethod: 'spreadMethod',\n  startOffset: 'startOffset',\n  stdDeviation: 'stdDeviation',\n  stemh: 0,\n  stemv: 0,\n  stitchTiles: 'stitchTiles',\n  stopColor: 'stop-color',\n  stopOpacity: 'stop-opacity',\n  strikethroughPosition: 'strikethrough-position',\n  strikethroughThickness: 'strikethrough-thickness',\n  string: 0,\n  stroke: 0,\n  strokeDasharray: 'stroke-dasharray',\n  strokeDashoffset: 'stroke-dashoffset',\n  strokeLinecap: 'stroke-linecap',\n  strokeLinejoin: 'stroke-linejoin',\n  strokeMiterlimit: 'stroke-miterlimit',\n  strokeOpacity: 'stroke-opacity',\n  strokeWidth: 'stroke-width',\n  surfaceScale: 'surfaceScale',\n  systemLanguage: 'systemLanguage',\n  tableValues: 'tableValues',\n  targetX: 'targetX',\n  targetY: 'targetY',\n  textAnchor: 'text-anchor',\n  textDecoration: 'text-decoration',\n  textRendering: 'text-rendering',\n  textLength: 'textLength',\n  to: 0,\n  transform: 0,\n  u1: 0,\n  u2: 0,\n  underlinePosition: 'underline-position',\n  underlineThickness: 'underline-thickness',\n  unicode: 0,\n  unicodeBidi: 'unicode-bidi',\n  unicodeRange: 'unicode-range',\n  unitsPerEm: 'units-per-em',\n  vAlphabetic: 'v-alphabetic',\n  vHanging: 'v-hanging',\n  vIdeographic: 'v-ideographic',\n  vMathematical: 'v-mathematical',\n  values: 0,\n  vectorEffect: 'vector-effect',\n  version: 0,\n  vertAdvY: 'vert-adv-y',\n  vertOriginX: 'vert-origin-x',\n  vertOriginY: 'vert-origin-y',\n  viewBox: 'viewBox',\n  viewTarget: 'viewTarget',\n  visibility: 0,\n  widths: 0,\n  wordSpacing: 'word-spacing',\n  writingMode: 'writing-mode',\n  x: 0,\n  xHeight: 'x-height',\n  x1: 0,\n  x2: 0,\n  xChannelSelector: 'xChannelSelector',\n  xlinkActuate: 'xlink:actuate',\n  xlinkArcrole: 'xlink:arcrole',\n  xlinkHref: 'xlink:href',\n  xlinkRole: 'xlink:role',\n  xlinkShow: 'xlink:show',\n  xlinkTitle: 'xlink:title',\n  xlinkType: 'xlink:type',\n  xmlBase: 'xml:base',\n  xmlns: 0,\n  xmlnsXlink: 'xmlns:xlink',\n  xmlLang: 'xml:lang',\n  xmlSpace: 'xml:space',\n  y: 0,\n  y1: 0,\n  y2: 0,\n  yChannelSelector: 'yChannelSelector',\n  z: 0,\n  zoomAndPan: 'zoomAndPan'\n};\n\nvar SVGDOMPropertyConfig = {\n  Properties: {},\n  DOMAttributeNamespaces: {\n    xlinkActuate: NS.xlink,\n    xlinkArcrole: NS.xlink,\n    xlinkHref: NS.xlink,\n    xlinkRole: NS.xlink,\n    xlinkShow: NS.xlink,\n    xlinkTitle: NS.xlink,\n    xlinkType: NS.xlink,\n    xmlBase: NS.xml,\n    xmlLang: NS.xml,\n    xmlSpace: NS.xml\n  },\n  DOMAttributeNames: {}\n};\n\nObject.keys(ATTRS).forEach(function (key) {\n  SVGDOMPropertyConfig.Properties[key] = 0;\n  if (ATTRS[key]) {\n    SVGDOMPropertyConfig.DOMAttributeNames[key] = ATTRS[key];\n  }\n});\n\nmodule.exports = SVGDOMPropertyConfig;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzI2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1NWR0RPTVByb3BlcnR5Q29uZmlnLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBOUyA9IHtcbiAgeGxpbms6ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJyxcbiAgeG1sOiAnaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlJ1xufTtcblxuLy8gV2UgdXNlIGF0dHJpYnV0ZXMgZm9yIGV2ZXJ5dGhpbmcgU1ZHIHNvIGxldCdzIGF2b2lkIHNvbWUgZHVwbGljYXRpb24gYW5kIHJ1blxuLy8gY29kZSBpbnN0ZWFkLlxuLy8gVGhlIGZvbGxvd2luZyBhcmUgYWxsIHNwZWNpZmllZCBpbiB0aGUgSFRNTCBjb25maWcgYWxyZWFkeSBzbyB3ZSBleGNsdWRlIGhlcmUuXG4vLyAtIGNsYXNzIChhcyBjbGFzc05hbWUpXG4vLyAtIGNvbG9yXG4vLyAtIGhlaWdodFxuLy8gLSBpZFxuLy8gLSBsYW5nXG4vLyAtIG1heFxuLy8gLSBtZWRpYVxuLy8gLSBtZXRob2Rcbi8vIC0gbWluXG4vLyAtIG5hbWVcbi8vIC0gc3R5bGVcbi8vIC0gdGFyZ2V0XG4vLyAtIHR5cGVcbi8vIC0gd2lkdGhcbnZhciBBVFRSUyA9IHtcbiAgYWNjZW50SGVpZ2h0OiAnYWNjZW50LWhlaWdodCcsXG4gIGFjY3VtdWxhdGU6IDAsXG4gIGFkZGl0aXZlOiAwLFxuICBhbGlnbm1lbnRCYXNlbGluZTogJ2FsaWdubWVudC1iYXNlbGluZScsXG4gIGFsbG93UmVvcmRlcjogJ2FsbG93UmVvcmRlcicsXG4gIGFscGhhYmV0aWM6IDAsXG4gIGFtcGxpdHVkZTogMCxcbiAgYXJhYmljRm9ybTogJ2FyYWJpYy1mb3JtJyxcbiAgYXNjZW50OiAwLFxuICBhdHRyaWJ1dGVOYW1lOiAnYXR0cmlidXRlTmFtZScsXG4gIGF0dHJpYnV0ZVR5cGU6ICdhdHRyaWJ1dGVUeXBlJyxcbiAgYXV0b1JldmVyc2U6ICdhdXRvUmV2ZXJzZScsXG4gIGF6aW11dGg6IDAsXG4gIGJhc2VGcmVxdWVuY3k6ICdiYXNlRnJlcXVlbmN5JyxcbiAgYmFzZVByb2ZpbGU6ICdiYXNlUHJvZmlsZScsXG4gIGJhc2VsaW5lU2hpZnQ6ICdiYXNlbGluZS1zaGlmdCcsXG4gIGJib3g6IDAsXG4gIGJlZ2luOiAwLFxuICBiaWFzOiAwLFxuICBieTogMCxcbiAgY2FsY01vZGU6ICdjYWxjTW9kZScsXG4gIGNhcEhlaWdodDogJ2NhcC1oZWlnaHQnLFxuICBjbGlwOiAwLFxuICBjbGlwUGF0aDogJ2NsaXAtcGF0aCcsXG4gIGNsaXBSdWxlOiAnY2xpcC1ydWxlJyxcbiAgY2xpcFBhdGhVbml0czogJ2NsaXBQYXRoVW5pdHMnLFxuICBjb2xvckludGVycG9sYXRpb246ICdjb2xvci1pbnRlcnBvbGF0aW9uJyxcbiAgY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVyczogJ2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVycycsXG4gIGNvbG9yUHJvZmlsZTogJ2NvbG9yLXByb2ZpbGUnLFxuICBjb2xvclJlbmRlcmluZzogJ2NvbG9yLXJlbmRlcmluZycsXG4gIGNvbnRlbnRTY3JpcHRUeXBlOiAnY29udGVudFNjcmlwdFR5cGUnLFxuICBjb250ZW50U3R5bGVUeXBlOiAnY29udGVudFN0eWxlVHlwZScsXG4gIGN1cnNvcjogMCxcbiAgY3g6IDAsXG4gIGN5OiAwLFxuICBkOiAwLFxuICBkZWNlbGVyYXRlOiAwLFxuICBkZXNjZW50OiAwLFxuICBkaWZmdXNlQ29uc3RhbnQ6ICdkaWZmdXNlQ29uc3RhbnQnLFxuICBkaXJlY3Rpb246IDAsXG4gIGRpc3BsYXk6IDAsXG4gIGRpdmlzb3I6IDAsXG4gIGRvbWluYW50QmFzZWxpbmU6ICdkb21pbmFudC1iYXNlbGluZScsXG4gIGR1cjogMCxcbiAgZHg6IDAsXG4gIGR5OiAwLFxuICBlZGdlTW9kZTogJ2VkZ2VNb2RlJyxcbiAgZWxldmF0aW9uOiAwLFxuICBlbmFibGVCYWNrZ3JvdW5kOiAnZW5hYmxlLWJhY2tncm91bmQnLFxuICBlbmQ6IDAsXG4gIGV4cG9uZW50OiAwLFxuICBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkOiAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gIGZpbGw6IDAsXG4gIGZpbGxPcGFjaXR5OiAnZmlsbC1vcGFjaXR5JyxcbiAgZmlsbFJ1bGU6ICdmaWxsLXJ1bGUnLFxuICBmaWx0ZXI6IDAsXG4gIGZpbHRlclJlczogJ2ZpbHRlclJlcycsXG4gIGZpbHRlclVuaXRzOiAnZmlsdGVyVW5pdHMnLFxuICBmbG9vZENvbG9yOiAnZmxvb2QtY29sb3InLFxuICBmbG9vZE9wYWNpdHk6ICdmbG9vZC1vcGFjaXR5JyxcbiAgZm9jdXNhYmxlOiAwLFxuICBmb250RmFtaWx5OiAnZm9udC1mYW1pbHknLFxuICBmb250U2l6ZTogJ2ZvbnQtc2l6ZScsXG4gIGZvbnRTaXplQWRqdXN0OiAnZm9udC1zaXplLWFkanVzdCcsXG4gIGZvbnRTdHJldGNoOiAnZm9udC1zdHJldGNoJyxcbiAgZm9udFN0eWxlOiAnZm9udC1zdHlsZScsXG4gIGZvbnRWYXJpYW50OiAnZm9udC12YXJpYW50JyxcbiAgZm9udFdlaWdodDogJ2ZvbnQtd2VpZ2h0JyxcbiAgZm9ybWF0OiAwLFxuICBmcm9tOiAwLFxuICBmeDogMCxcbiAgZnk6IDAsXG4gIGcxOiAwLFxuICBnMjogMCxcbiAgZ2x5cGhOYW1lOiAnZ2x5cGgtbmFtZScsXG4gIGdseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsOiAnZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCcsXG4gIGdseXBoT3JpZW50YXRpb25WZXJ0aWNhbDogJ2dseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsJyxcbiAgZ2x5cGhSZWY6ICdnbHlwaFJlZicsXG4gIGdyYWRpZW50VHJhbnNmb3JtOiAnZ3JhZGllbnRUcmFuc2Zvcm0nLFxuICBncmFkaWVudFVuaXRzOiAnZ3JhZGllbnRVbml0cycsXG4gIGhhbmdpbmc6IDAsXG4gIGhvcml6QWR2WDogJ2hvcml6LWFkdi14JyxcbiAgaG9yaXpPcmlnaW5YOiAnaG9yaXotb3JpZ2luLXgnLFxuICBpZGVvZ3JhcGhpYzogMCxcbiAgaW1hZ2VSZW5kZXJpbmc6ICdpbWFnZS1yZW5kZXJpbmcnLFxuICAnaW4nOiAwLFxuICBpbjI6IDAsXG4gIGludGVyY2VwdDogMCxcbiAgazogMCxcbiAgazE6IDAsXG4gIGsyOiAwLFxuICBrMzogMCxcbiAgazQ6IDAsXG4gIGtlcm5lbE1hdHJpeDogJ2tlcm5lbE1hdHJpeCcsXG4gIGtlcm5lbFVuaXRMZW5ndGg6ICdrZXJuZWxVbml0TGVuZ3RoJyxcbiAga2VybmluZzogMCxcbiAga2V5UG9pbnRzOiAna2V5UG9pbnRzJyxcbiAga2V5U3BsaW5lczogJ2tleVNwbGluZXMnLFxuICBrZXlUaW1lczogJ2tleVRpbWVzJyxcbiAgbGVuZ3RoQWRqdXN0OiAnbGVuZ3RoQWRqdXN0JyxcbiAgbGV0dGVyU3BhY2luZzogJ2xldHRlci1zcGFjaW5nJyxcbiAgbGlnaHRpbmdDb2xvcjogJ2xpZ2h0aW5nLWNvbG9yJyxcbiAgbGltaXRpbmdDb25lQW5nbGU6ICdsaW1pdGluZ0NvbmVBbmdsZScsXG4gIGxvY2FsOiAwLFxuICBtYXJrZXJFbmQ6ICdtYXJrZXItZW5kJyxcbiAgbWFya2VyTWlkOiAnbWFya2VyLW1pZCcsXG4gIG1hcmtlclN0YXJ0OiAnbWFya2VyLXN0YXJ0JyxcbiAgbWFya2VySGVpZ2h0OiAnbWFya2VySGVpZ2h0JyxcbiAgbWFya2VyVW5pdHM6ICdtYXJrZXJVbml0cycsXG4gIG1hcmtlcldpZHRoOiAnbWFya2VyV2lkdGgnLFxuICBtYXNrOiAwLFxuICBtYXNrQ29udGVudFVuaXRzOiAnbWFza0NvbnRlbnRVbml0cycsXG4gIG1hc2tVbml0czogJ21hc2tVbml0cycsXG4gIG1hdGhlbWF0aWNhbDogMCxcbiAgbW9kZTogMCxcbiAgbnVtT2N0YXZlczogJ251bU9jdGF2ZXMnLFxuICBvZmZzZXQ6IDAsXG4gIG9wYWNpdHk6IDAsXG4gIG9wZXJhdG9yOiAwLFxuICBvcmRlcjogMCxcbiAgb3JpZW50OiAwLFxuICBvcmllbnRhdGlvbjogMCxcbiAgb3JpZ2luOiAwLFxuICBvdmVyZmxvdzogMCxcbiAgb3ZlcmxpbmVQb3NpdGlvbjogJ292ZXJsaW5lLXBvc2l0aW9uJyxcbiAgb3ZlcmxpbmVUaGlja25lc3M6ICdvdmVybGluZS10aGlja25lc3MnLFxuICBwYWludE9yZGVyOiAncGFpbnQtb3JkZXInLFxuICBwYW5vc2UxOiAncGFub3NlLTEnLFxuICBwYXRoTGVuZ3RoOiAncGF0aExlbmd0aCcsXG4gIHBhdHRlcm5Db250ZW50VW5pdHM6ICdwYXR0ZXJuQ29udGVudFVuaXRzJyxcbiAgcGF0dGVyblRyYW5zZm9ybTogJ3BhdHRlcm5UcmFuc2Zvcm0nLFxuICBwYXR0ZXJuVW5pdHM6ICdwYXR0ZXJuVW5pdHMnLFxuICBwb2ludGVyRXZlbnRzOiAncG9pbnRlci1ldmVudHMnLFxuICBwb2ludHM6IDAsXG4gIHBvaW50c0F0WDogJ3BvaW50c0F0WCcsXG4gIHBvaW50c0F0WTogJ3BvaW50c0F0WScsXG4gIHBvaW50c0F0WjogJ3BvaW50c0F0WicsXG4gIHByZXNlcnZlQWxwaGE6ICdwcmVzZXJ2ZUFscGhhJyxcbiAgcHJlc2VydmVBc3BlY3RSYXRpbzogJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLFxuICBwcmltaXRpdmVVbml0czogJ3ByaW1pdGl2ZVVuaXRzJyxcbiAgcjogMCxcbiAgcmFkaXVzOiAwLFxuICByZWZYOiAncmVmWCcsXG4gIHJlZlk6ICdyZWZZJyxcbiAgcmVuZGVyaW5nSW50ZW50OiAncmVuZGVyaW5nLWludGVudCcsXG4gIHJlcGVhdENvdW50OiAncmVwZWF0Q291bnQnLFxuICByZXBlYXREdXI6ICdyZXBlYXREdXInLFxuICByZXF1aXJlZEV4dGVuc2lvbnM6ICdyZXF1aXJlZEV4dGVuc2lvbnMnLFxuICByZXF1aXJlZEZlYXR1cmVzOiAncmVxdWlyZWRGZWF0dXJlcycsXG4gIHJlc3RhcnQ6IDAsXG4gIHJlc3VsdDogMCxcbiAgcm90YXRlOiAwLFxuICByeDogMCxcbiAgcnk6IDAsXG4gIHNjYWxlOiAwLFxuICBzZWVkOiAwLFxuICBzaGFwZVJlbmRlcmluZzogJ3NoYXBlLXJlbmRlcmluZycsXG4gIHNsb3BlOiAwLFxuICBzcGFjaW5nOiAwLFxuICBzcGVjdWxhckNvbnN0YW50OiAnc3BlY3VsYXJDb25zdGFudCcsXG4gIHNwZWN1bGFyRXhwb25lbnQ6ICdzcGVjdWxhckV4cG9uZW50JyxcbiAgc3BlZWQ6IDAsXG4gIHNwcmVhZE1ldGhvZDogJ3NwcmVhZE1ldGhvZCcsXG4gIHN0YXJ0T2Zmc2V0OiAnc3RhcnRPZmZzZXQnLFxuICBzdGREZXZpYXRpb246ICdzdGREZXZpYXRpb24nLFxuICBzdGVtaDogMCxcbiAgc3RlbXY6IDAsXG4gIHN0aXRjaFRpbGVzOiAnc3RpdGNoVGlsZXMnLFxuICBzdG9wQ29sb3I6ICdzdG9wLWNvbG9yJyxcbiAgc3RvcE9wYWNpdHk6ICdzdG9wLW9wYWNpdHknLFxuICBzdHJpa2V0aHJvdWdoUG9zaXRpb246ICdzdHJpa2V0aHJvdWdoLXBvc2l0aW9uJyxcbiAgc3RyaWtldGhyb3VnaFRoaWNrbmVzczogJ3N0cmlrZXRocm91Z2gtdGhpY2tuZXNzJyxcbiAgc3RyaW5nOiAwLFxuICBzdHJva2U6IDAsXG4gIHN0cm9rZURhc2hhcnJheTogJ3N0cm9rZS1kYXNoYXJyYXknLFxuICBzdHJva2VEYXNob2Zmc2V0OiAnc3Ryb2tlLWRhc2hvZmZzZXQnLFxuICBzdHJva2VMaW5lY2FwOiAnc3Ryb2tlLWxpbmVjYXAnLFxuICBzdHJva2VMaW5lam9pbjogJ3N0cm9rZS1saW5lam9pbicsXG4gIHN0cm9rZU1pdGVybGltaXQ6ICdzdHJva2UtbWl0ZXJsaW1pdCcsXG4gIHN0cm9rZU9wYWNpdHk6ICdzdHJva2Utb3BhY2l0eScsXG4gIHN0cm9rZVdpZHRoOiAnc3Ryb2tlLXdpZHRoJyxcbiAgc3VyZmFjZVNjYWxlOiAnc3VyZmFjZVNjYWxlJyxcbiAgc3lzdGVtTGFuZ3VhZ2U6ICdzeXN0ZW1MYW5ndWFnZScsXG4gIHRhYmxlVmFsdWVzOiAndGFibGVWYWx1ZXMnLFxuICB0YXJnZXRYOiAndGFyZ2V0WCcsXG4gIHRhcmdldFk6ICd0YXJnZXRZJyxcbiAgdGV4dEFuY2hvcjogJ3RleHQtYW5jaG9yJyxcbiAgdGV4dERlY29yYXRpb246ICd0ZXh0LWRlY29yYXRpb24nLFxuICB0ZXh0UmVuZGVyaW5nOiAndGV4dC1yZW5kZXJpbmcnLFxuICB0ZXh0TGVuZ3RoOiAndGV4dExlbmd0aCcsXG4gIHRvOiAwLFxuICB0cmFuc2Zvcm06IDAsXG4gIHUxOiAwLFxuICB1MjogMCxcbiAgdW5kZXJsaW5lUG9zaXRpb246ICd1bmRlcmxpbmUtcG9zaXRpb24nLFxuICB1bmRlcmxpbmVUaGlja25lc3M6ICd1bmRlcmxpbmUtdGhpY2tuZXNzJyxcbiAgdW5pY29kZTogMCxcbiAgdW5pY29kZUJpZGk6ICd1bmljb2RlLWJpZGknLFxuICB1bmljb2RlUmFuZ2U6ICd1bmljb2RlLXJhbmdlJyxcbiAgdW5pdHNQZXJFbTogJ3VuaXRzLXBlci1lbScsXG4gIHZBbHBoYWJldGljOiAndi1hbHBoYWJldGljJyxcbiAgdkhhbmdpbmc6ICd2LWhhbmdpbmcnLFxuICB2SWRlb2dyYXBoaWM6ICd2LWlkZW9ncmFwaGljJyxcbiAgdk1hdGhlbWF0aWNhbDogJ3YtbWF0aGVtYXRpY2FsJyxcbiAgdmFsdWVzOiAwLFxuICB2ZWN0b3JFZmZlY3Q6ICd2ZWN0b3ItZWZmZWN0JyxcbiAgdmVyc2lvbjogMCxcbiAgdmVydEFkdlk6ICd2ZXJ0LWFkdi15JyxcbiAgdmVydE9yaWdpblg6ICd2ZXJ0LW9yaWdpbi14JyxcbiAgdmVydE9yaWdpblk6ICd2ZXJ0LW9yaWdpbi15JyxcbiAgdmlld0JveDogJ3ZpZXdCb3gnLFxuICB2aWV3VGFyZ2V0OiAndmlld1RhcmdldCcsXG4gIHZpc2liaWxpdHk6IDAsXG4gIHdpZHRoczogMCxcbiAgd29yZFNwYWNpbmc6ICd3b3JkLXNwYWNpbmcnLFxuICB3cml0aW5nTW9kZTogJ3dyaXRpbmctbW9kZScsXG4gIHg6IDAsXG4gIHhIZWlnaHQ6ICd4LWhlaWdodCcsXG4gIHgxOiAwLFxuICB4MjogMCxcbiAgeENoYW5uZWxTZWxlY3RvcjogJ3hDaGFubmVsU2VsZWN0b3InLFxuICB4bGlua0FjdHVhdGU6ICd4bGluazphY3R1YXRlJyxcbiAgeGxpbmtBcmNyb2xlOiAneGxpbms6YXJjcm9sZScsXG4gIHhsaW5rSHJlZjogJ3hsaW5rOmhyZWYnLFxuICB4bGlua1JvbGU6ICd4bGluazpyb2xlJyxcbiAgeGxpbmtTaG93OiAneGxpbms6c2hvdycsXG4gIHhsaW5rVGl0bGU6ICd4bGluazp0aXRsZScsXG4gIHhsaW5rVHlwZTogJ3hsaW5rOnR5cGUnLFxuICB4bWxCYXNlOiAneG1sOmJhc2UnLFxuICB4bWxuczogMCxcbiAgeG1sbnNYbGluazogJ3htbG5zOnhsaW5rJyxcbiAgeG1sTGFuZzogJ3htbDpsYW5nJyxcbiAgeG1sU3BhY2U6ICd4bWw6c3BhY2UnLFxuICB5OiAwLFxuICB5MTogMCxcbiAgeTI6IDAsXG4gIHlDaGFubmVsU2VsZWN0b3I6ICd5Q2hhbm5lbFNlbGVjdG9yJyxcbiAgejogMCxcbiAgem9vbUFuZFBhbjogJ3pvb21BbmRQYW4nXG59O1xuXG52YXIgU1ZHRE9NUHJvcGVydHlDb25maWcgPSB7XG4gIFByb3BlcnRpZXM6IHt9LFxuICBET01BdHRyaWJ1dGVOYW1lc3BhY2VzOiB7XG4gICAgeGxpbmtBY3R1YXRlOiBOUy54bGluayxcbiAgICB4bGlua0FyY3JvbGU6IE5TLnhsaW5rLFxuICAgIHhsaW5rSHJlZjogTlMueGxpbmssXG4gICAgeGxpbmtSb2xlOiBOUy54bGluayxcbiAgICB4bGlua1Nob3c6IE5TLnhsaW5rLFxuICAgIHhsaW5rVGl0bGU6IE5TLnhsaW5rLFxuICAgIHhsaW5rVHlwZTogTlMueGxpbmssXG4gICAgeG1sQmFzZTogTlMueG1sLFxuICAgIHhtbExhbmc6IE5TLnhtbCxcbiAgICB4bWxTcGFjZTogTlMueG1sXG4gIH0sXG4gIERPTUF0dHJpYnV0ZU5hbWVzOiB7fVxufTtcblxuT2JqZWN0LmtleXMoQVRUUlMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICBTVkdET01Qcm9wZXJ0eUNvbmZpZy5Qcm9wZXJ0aWVzW2tleV0gPSAwO1xuICBpZiAoQVRUUlNba2V5XSkge1xuICAgIFNWR0RPTVByb3BlcnR5Q29uZmlnLkRPTUF0dHJpYnV0ZU5hbWVzW2tleV0gPSBBVFRSU1trZXldO1xuICB9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBTVkdET01Qcm9wZXJ0eUNvbmZpZztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9TVkdET01Qcm9wZXJ0eUNvbmZpZy5qc1xuLy8gbW9kdWxlIGlkID0gMzI2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 327 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar EventPropagators = __webpack_require__(214);\nvar ExecutionEnvironment = __webpack_require__(221);\nvar ReactDOMComponentTree = __webpack_require__(207);\nvar ReactInputSelection = __webpack_require__(319);\nvar SyntheticEvent = __webpack_require__(226);\n\nvar getActiveElement = __webpack_require__(325);\nvar isTextInputElement = __webpack_require__(244);\nvar shallowEqual = __webpack_require__(296);\n\nvar skipSelectionChangeEvent = ExecutionEnvironment.canUseDOM && 'documentMode' in document && document.documentMode <= 11;\n\nvar eventTypes = {\n  select: {\n    phasedRegistrationNames: {\n      bubbled: 'onSelect',\n      captured: 'onSelectCapture'\n    },\n    dependencies: ['topBlur', 'topContextMenu', 'topFocus', 'topKeyDown', 'topKeyUp', 'topMouseDown', 'topMouseUp', 'topSelectionChange']\n  }\n};\n\nvar activeElement = null;\nvar activeElementInst = null;\nvar lastSelection = null;\nvar mouseDown = false;\n\n// Track whether a listener exists for this plugin. If none exist, we do\n// not extract events. See #3639.\nvar hasListener = false;\n\n/**\n * Get an object which is a unique representation of the current selection.\n *\n * The return value will not be consistent across nodes or browsers, but\n * two identical selections on the same node will return identical objects.\n *\n * @param {DOMElement} node\n * @return {object}\n */\nfunction getSelection(node) {\n  if ('selectionStart' in node && ReactInputSelection.hasSelectionCapabilities(node)) {\n    return {\n      start: node.selectionStart,\n      end: node.selectionEnd\n    };\n  } else if (window.getSelection) {\n    var selection = window.getSelection();\n    return {\n      anchorNode: selection.anchorNode,\n      anchorOffset: selection.anchorOffset,\n      focusNode: selection.focusNode,\n      focusOffset: selection.focusOffset\n    };\n  } else if (document.selection) {\n    var range = document.selection.createRange();\n    return {\n      parentElement: range.parentElement(),\n      text: range.text,\n      top: range.boundingTop,\n      left: range.boundingLeft\n    };\n  }\n}\n\n/**\n * Poll selection to see whether it's changed.\n *\n * @param {object} nativeEvent\n * @return {?SyntheticEvent}\n */\nfunction constructSelectEvent(nativeEvent, nativeEventTarget) {\n  // Ensure we have the right element, and that the user is not dragging a\n  // selection (this matches native `select` event behavior). In HTML5, select\n  // fires only on input and textarea thus if there's no focused element we\n  // won't dispatch.\n  if (mouseDown || activeElement == null || activeElement !== getActiveElement()) {\n    return null;\n  }\n\n  // Only fire when selection has actually changed.\n  var currentSelection = getSelection(activeElement);\n  if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) {\n    lastSelection = currentSelection;\n\n    var syntheticEvent = SyntheticEvent.getPooled(eventTypes.select, activeElementInst, nativeEvent, nativeEventTarget);\n\n    syntheticEvent.type = 'select';\n    syntheticEvent.target = activeElement;\n\n    EventPropagators.accumulateTwoPhaseDispatches(syntheticEvent);\n\n    return syntheticEvent;\n  }\n\n  return null;\n}\n\n/**\n * This plugin creates an `onSelect` event that normalizes select events\n * across form elements.\n *\n * Supported elements are:\n * - input (see `isTextInputElement`)\n * - textarea\n * - contentEditable\n *\n * This differs from native browser implementations in the following ways:\n * - Fires on contentEditable fields as well as inputs.\n * - Fires for collapsed selection.\n * - Fires after user input.\n */\nvar SelectEventPlugin = {\n\n  eventTypes: eventTypes,\n\n  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n    if (!hasListener) {\n      return null;\n    }\n\n    var targetNode = targetInst ? ReactDOMComponentTree.getNodeFromInstance(targetInst) : window;\n\n    switch (topLevelType) {\n      // Track the input node that has focus.\n      case 'topFocus':\n        if (isTextInputElement(targetNode) || targetNode.contentEditable === 'true') {\n          activeElement = targetNode;\n          activeElementInst = targetInst;\n          lastSelection = null;\n        }\n        break;\n      case 'topBlur':\n        activeElement = null;\n        activeElementInst = null;\n        lastSelection = null;\n        break;\n\n      // Don't fire the event while the user is dragging. This matches the\n      // semantics of the native select event.\n      case 'topMouseDown':\n        mouseDown = true;\n        break;\n      case 'topContextMenu':\n      case 'topMouseUp':\n        mouseDown = false;\n        return constructSelectEvent(nativeEvent, nativeEventTarget);\n\n      // Chrome and IE fire non-standard event when selection is changed (and\n      // sometimes when it hasn't). IE's event fires out of order with respect\n      // to key and input events on deletion, so we discard it.\n      //\n      // Firefox doesn't support selectionchange, so check selection status\n      // after each key entry. The selection changes after keydown and before\n      // keyup, but we check on keydown as well in the case of holding down a\n      // key, when multiple keydown events are fired but only one keyup is.\n      // This is also our approach for IE handling, for the reason above.\n      case 'topSelectionChange':\n        if (skipSelectionChangeEvent) {\n          break;\n        }\n      // falls through\n      case 'topKeyDown':\n      case 'topKeyUp':\n        return constructSelectEvent(nativeEvent, nativeEventTarget);\n    }\n\n    return null;\n  },\n\n  didPutListener: function (inst, registrationName, listener) {\n    if (registrationName === 'onSelect') {\n      hasListener = true;\n    }\n  }\n};\n\nmodule.exports = SelectEventPlugin;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzI3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1NlbGVjdEV2ZW50UGx1Z2luLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFdmVudFByb3BhZ2F0b3JzID0gcmVxdWlyZSgnLi9FdmVudFByb3BhZ2F0b3JzJyk7XG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RJbnB1dFNlbGVjdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnB1dFNlbGVjdGlvbicpO1xudmFyIFN5bnRoZXRpY0V2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNFdmVudCcpO1xuXG52YXIgZ2V0QWN0aXZlRWxlbWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL2dldEFjdGl2ZUVsZW1lbnQnKTtcbnZhciBpc1RleHRJbnB1dEVsZW1lbnQgPSByZXF1aXJlKCcuL2lzVGV4dElucHV0RWxlbWVudCcpO1xudmFyIHNoYWxsb3dFcXVhbCA9IHJlcXVpcmUoJ2ZianMvbGliL3NoYWxsb3dFcXVhbCcpO1xuXG52YXIgc2tpcFNlbGVjdGlvbkNoYW5nZUV2ZW50ID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NICYmICdkb2N1bWVudE1vZGUnIGluIGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA8PSAxMTtcblxudmFyIGV2ZW50VHlwZXMgPSB7XG4gIHNlbGVjdDoge1xuICAgIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOiB7XG4gICAgICBidWJibGVkOiAnb25TZWxlY3QnLFxuICAgICAgY2FwdHVyZWQ6ICdvblNlbGVjdENhcHR1cmUnXG4gICAgfSxcbiAgICBkZXBlbmRlbmNpZXM6IFsndG9wQmx1cicsICd0b3BDb250ZXh0TWVudScsICd0b3BGb2N1cycsICd0b3BLZXlEb3duJywgJ3RvcEtleVVwJywgJ3RvcE1vdXNlRG93bicsICd0b3BNb3VzZVVwJywgJ3RvcFNlbGVjdGlvbkNoYW5nZSddXG4gIH1cbn07XG5cbnZhciBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG52YXIgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG52YXIgbW91c2VEb3duID0gZmFsc2U7XG5cbi8vIFRyYWNrIHdoZXRoZXIgYSBsaXN0ZW5lciBleGlzdHMgZm9yIHRoaXMgcGx1Z2luLiBJZiBub25lIGV4aXN0LCB3ZSBkb1xuLy8gbm90IGV4dHJhY3QgZXZlbnRzLiBTZWUgIzM2MzkuXG52YXIgaGFzTGlzdGVuZXIgPSBmYWxzZTtcblxuLyoqXG4gKiBHZXQgYW4gb2JqZWN0IHdoaWNoIGlzIGEgdW5pcXVlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgbm90IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG5vZGVzIG9yIGJyb3dzZXJzLCBidXRcbiAqIHR3byBpZGVudGljYWwgc2VsZWN0aW9ucyBvbiB0aGUgc2FtZSBub2RlIHdpbGwgcmV0dXJuIGlkZW50aWNhbCBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24obm9kZSkge1xuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBub2RlICYmIFJlYWN0SW5wdXRTZWxlY3Rpb24uaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKG5vZGUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0OiBub2RlLnNlbGVjdGlvblN0YXJ0LFxuICAgICAgZW5kOiBub2RlLnNlbGVjdGlvbkVuZFxuICAgIH07XG4gIH0gZWxzZSBpZiAod2luZG93LmdldFNlbGVjdGlvbikge1xuICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFuY2hvck5vZGU6IHNlbGVjdGlvbi5hbmNob3JOb2RlLFxuICAgICAgYW5jaG9yT2Zmc2V0OiBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LFxuICAgICAgZm9jdXNOb2RlOiBzZWxlY3Rpb24uZm9jdXNOb2RlLFxuICAgICAgZm9jdXNPZmZzZXQ6IHNlbGVjdGlvbi5mb2N1c09mZnNldFxuICAgIH07XG4gIH0gZWxzZSBpZiAoZG9jdW1lbnQuc2VsZWN0aW9uKSB7XG4gICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmVudEVsZW1lbnQ6IHJhbmdlLnBhcmVudEVsZW1lbnQoKSxcbiAgICAgIHRleHQ6IHJhbmdlLnRleHQsXG4gICAgICB0b3A6IHJhbmdlLmJvdW5kaW5nVG9wLFxuICAgICAgbGVmdDogcmFuZ2UuYm91bmRpbmdMZWZ0XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFBvbGwgc2VsZWN0aW9uIHRvIHNlZSB3aGV0aGVyIGl0J3MgY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4gez9TeW50aGV0aWNFdmVudH1cbiAqL1xuZnVuY3Rpb24gY29uc3RydWN0U2VsZWN0RXZlbnQobmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIC8vIEVuc3VyZSB3ZSBoYXZlIHRoZSByaWdodCBlbGVtZW50LCBhbmQgdGhhdCB0aGUgdXNlciBpcyBub3QgZHJhZ2dpbmcgYVxuICAvLyBzZWxlY3Rpb24gKHRoaXMgbWF0Y2hlcyBuYXRpdmUgYHNlbGVjdGAgZXZlbnQgYmVoYXZpb3IpLiBJbiBIVE1MNSwgc2VsZWN0XG4gIC8vIGZpcmVzIG9ubHkgb24gaW5wdXQgYW5kIHRleHRhcmVhIHRodXMgaWYgdGhlcmUncyBubyBmb2N1c2VkIGVsZW1lbnQgd2VcbiAgLy8gd29uJ3QgZGlzcGF0Y2guXG4gIGlmIChtb3VzZURvd24gfHwgYWN0aXZlRWxlbWVudCA9PSBudWxsIHx8IGFjdGl2ZUVsZW1lbnQgIT09IGdldEFjdGl2ZUVsZW1lbnQoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gT25seSBmaXJlIHdoZW4gc2VsZWN0aW9uIGhhcyBhY3R1YWxseSBjaGFuZ2VkLlxuICB2YXIgY3VycmVudFNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbihhY3RpdmVFbGVtZW50KTtcbiAgaWYgKCFsYXN0U2VsZWN0aW9uIHx8ICFzaGFsbG93RXF1YWwobGFzdFNlbGVjdGlvbiwgY3VycmVudFNlbGVjdGlvbikpIHtcbiAgICBsYXN0U2VsZWN0aW9uID0gY3VycmVudFNlbGVjdGlvbjtcblxuICAgIHZhciBzeW50aGV0aWNFdmVudCA9IFN5bnRoZXRpY0V2ZW50LmdldFBvb2xlZChldmVudFR5cGVzLnNlbGVjdCwgYWN0aXZlRWxlbWVudEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgICBzeW50aGV0aWNFdmVudC50eXBlID0gJ3NlbGVjdCc7XG4gICAgc3ludGhldGljRXZlbnQudGFyZ2V0ID0gYWN0aXZlRWxlbWVudDtcblxuICAgIEV2ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhzeW50aGV0aWNFdmVudCk7XG5cbiAgICByZXR1cm4gc3ludGhldGljRXZlbnQ7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBUaGlzIHBsdWdpbiBjcmVhdGVzIGFuIGBvblNlbGVjdGAgZXZlbnQgdGhhdCBub3JtYWxpemVzIHNlbGVjdCBldmVudHNcbiAqIGFjcm9zcyBmb3JtIGVsZW1lbnRzLlxuICpcbiAqIFN1cHBvcnRlZCBlbGVtZW50cyBhcmU6XG4gKiAtIGlucHV0IChzZWUgYGlzVGV4dElucHV0RWxlbWVudGApXG4gKiAtIHRleHRhcmVhXG4gKiAtIGNvbnRlbnRFZGl0YWJsZVxuICpcbiAqIFRoaXMgZGlmZmVycyBmcm9tIG5hdGl2ZSBicm93c2VyIGltcGxlbWVudGF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHdheXM6XG4gKiAtIEZpcmVzIG9uIGNvbnRlbnRFZGl0YWJsZSBmaWVsZHMgYXMgd2VsbCBhcyBpbnB1dHMuXG4gKiAtIEZpcmVzIGZvciBjb2xsYXBzZWQgc2VsZWN0aW9uLlxuICogLSBGaXJlcyBhZnRlciB1c2VyIGlucHV0LlxuICovXG52YXIgU2VsZWN0RXZlbnRQbHVnaW4gPSB7XG5cbiAgZXZlbnRUeXBlczogZXZlbnRUeXBlcyxcblxuICBleHRyYWN0RXZlbnRzOiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICBpZiAoIWhhc0xpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0Tm9kZSA9IHRhcmdldEluc3QgPyBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KSA6IHdpbmRvdztcblxuICAgIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7XG4gICAgICAvLyBUcmFjayB0aGUgaW5wdXQgbm9kZSB0aGF0IGhhcyBmb2N1cy5cbiAgICAgIGNhc2UgJ3RvcEZvY3VzJzpcbiAgICAgICAgaWYgKGlzVGV4dElucHV0RWxlbWVudCh0YXJnZXROb2RlKSB8fCB0YXJnZXROb2RlLmNvbnRlbnRFZGl0YWJsZSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgYWN0aXZlRWxlbWVudCA9IHRhcmdldE5vZGU7XG4gICAgICAgICAgYWN0aXZlRWxlbWVudEluc3QgPSB0YXJnZXRJbnN0O1xuICAgICAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wQmx1cic6XG4gICAgICAgIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xuICAgICAgICBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG4gICAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICBicmVhaztcblxuICAgICAgLy8gRG9uJ3QgZmlyZSB0aGUgZXZlbnQgd2hpbGUgdGhlIHVzZXIgaXMgZHJhZ2dpbmcuIFRoaXMgbWF0Y2hlcyB0aGVcbiAgICAgIC8vIHNlbWFudGljcyBvZiB0aGUgbmF0aXZlIHNlbGVjdCBldmVudC5cbiAgICAgIGNhc2UgJ3RvcE1vdXNlRG93bic6XG4gICAgICAgIG1vdXNlRG93biA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wQ29udGV4dE1lbnUnOlxuICAgICAgY2FzZSAndG9wTW91c2VVcCc6XG4gICAgICAgIG1vdXNlRG93biA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gY29uc3RydWN0U2VsZWN0RXZlbnQobmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICAgICAgLy8gQ2hyb21lIGFuZCBJRSBmaXJlIG5vbi1zdGFuZGFyZCBldmVudCB3aGVuIHNlbGVjdGlvbiBpcyBjaGFuZ2VkIChhbmRcbiAgICAgIC8vIHNvbWV0aW1lcyB3aGVuIGl0IGhhc24ndCkuIElFJ3MgZXZlbnQgZmlyZXMgb3V0IG9mIG9yZGVyIHdpdGggcmVzcGVjdFxuICAgICAgLy8gdG8ga2V5IGFuZCBpbnB1dCBldmVudHMgb24gZGVsZXRpb24sIHNvIHdlIGRpc2NhcmQgaXQuXG4gICAgICAvL1xuICAgICAgLy8gRmlyZWZveCBkb2Vzbid0IHN1cHBvcnQgc2VsZWN0aW9uY2hhbmdlLCBzbyBjaGVjayBzZWxlY3Rpb24gc3RhdHVzXG4gICAgICAvLyBhZnRlciBlYWNoIGtleSBlbnRyeS4gVGhlIHNlbGVjdGlvbiBjaGFuZ2VzIGFmdGVyIGtleWRvd24gYW5kIGJlZm9yZVxuICAgICAgLy8ga2V5dXAsIGJ1dCB3ZSBjaGVjayBvbiBrZXlkb3duIGFzIHdlbGwgaW4gdGhlIGNhc2Ugb2YgaG9sZGluZyBkb3duIGFcbiAgICAgIC8vIGtleSwgd2hlbiBtdWx0aXBsZSBrZXlkb3duIGV2ZW50cyBhcmUgZmlyZWQgYnV0IG9ubHkgb25lIGtleXVwIGlzLlxuICAgICAgLy8gVGhpcyBpcyBhbHNvIG91ciBhcHByb2FjaCBmb3IgSUUgaGFuZGxpbmcsIGZvciB0aGUgcmVhc29uIGFib3ZlLlxuICAgICAgY2FzZSAndG9wU2VsZWN0aW9uQ2hhbmdlJzpcbiAgICAgICAgaWYgKHNraXBTZWxlY3Rpb25DaGFuZ2VFdmVudCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlICd0b3BLZXlEb3duJzpcbiAgICAgIGNhc2UgJ3RvcEtleVVwJzpcbiAgICAgICAgcmV0dXJuIGNvbnN0cnVjdFNlbGVjdEV2ZW50KG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG5cbiAgZGlkUHV0TGlzdGVuZXI6IGZ1bmN0aW9uIChpbnN0LCByZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lcikge1xuICAgIGlmIChyZWdpc3RyYXRpb25OYW1lID09PSAnb25TZWxlY3QnKSB7XG4gICAgICBoYXNMaXN0ZW5lciA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNlbGVjdEV2ZW50UGx1Z2luO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL1NlbGVjdEV2ZW50UGx1Z2luLmpzXG4vLyBtb2R1bGUgaWQgPSAzMjdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 328 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nvar EventListener = __webpack_require__(315);\nvar EventPropagators = __webpack_require__(214);\nvar ReactDOMComponentTree = __webpack_require__(207);\nvar SyntheticAnimationEvent = __webpack_require__(329);\nvar SyntheticClipboardEvent = __webpack_require__(330);\nvar SyntheticEvent = __webpack_require__(226);\nvar SyntheticFocusEvent = __webpack_require__(331);\nvar SyntheticKeyboardEvent = __webpack_require__(332);\nvar SyntheticMouseEvent = __webpack_require__(247);\nvar SyntheticDragEvent = __webpack_require__(335);\nvar SyntheticTouchEvent = __webpack_require__(336);\nvar SyntheticTransitionEvent = __webpack_require__(337);\nvar SyntheticUIEvent = __webpack_require__(248);\nvar SyntheticWheelEvent = __webpack_require__(338);\n\nvar emptyFunction = __webpack_require__(184);\nvar getEventCharCode = __webpack_require__(333);\nvar invariant = __webpack_require__(180);\n\n/**\n * Turns\n * ['abort', ...]\n * into\n * eventTypes = {\n *   'abort': {\n *     phasedRegistrationNames: {\n *       bubbled: 'onAbort',\n *       captured: 'onAbortCapture',\n *     },\n *     dependencies: ['topAbort'],\n *   },\n *   ...\n * };\n * topLevelEventsToDispatchConfig = {\n *   'topAbort': { sameConfig }\n * };\n */\nvar eventTypes = {};\nvar topLevelEventsToDispatchConfig = {};\n['abort', 'animationEnd', 'animationIteration', 'animationStart', 'blur', 'canPlay', 'canPlayThrough', 'click', 'contextMenu', 'copy', 'cut', 'doubleClick', 'drag', 'dragEnd', 'dragEnter', 'dragExit', 'dragLeave', 'dragOver', 'dragStart', 'drop', 'durationChange', 'emptied', 'encrypted', 'ended', 'error', 'focus', 'input', 'invalid', 'keyDown', 'keyPress', 'keyUp', 'load', 'loadedData', 'loadedMetadata', 'loadStart', 'mouseDown', 'mouseMove', 'mouseOut', 'mouseOver', 'mouseUp', 'paste', 'pause', 'play', 'playing', 'progress', 'rateChange', 'reset', 'scroll', 'seeked', 'seeking', 'stalled', 'submit', 'suspend', 'timeUpdate', 'touchCancel', 'touchEnd', 'touchMove', 'touchStart', 'transitionEnd', 'volumeChange', 'waiting', 'wheel'].forEach(function (event) {\n  var capitalizedEvent = event[0].toUpperCase() + event.slice(1);\n  var onEvent = 'on' + capitalizedEvent;\n  var topEvent = 'top' + capitalizedEvent;\n\n  var type = {\n    phasedRegistrationNames: {\n      bubbled: onEvent,\n      captured: onEvent + 'Capture'\n    },\n    dependencies: [topEvent]\n  };\n  eventTypes[event] = type;\n  topLevelEventsToDispatchConfig[topEvent] = type;\n});\n\nvar onClickListeners = {};\n\nfunction getDictionaryKey(inst) {\n  // Prevents V8 performance issue:\n  // https://github.com/facebook/react/pull/7232\n  return '.' + inst._rootNodeID;\n}\n\nfunction isInteractive(tag) {\n  return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea';\n}\n\nvar SimpleEventPlugin = {\n\n  eventTypes: eventTypes,\n\n  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n    var dispatchConfig = topLevelEventsToDispatchConfig[topLevelType];\n    if (!dispatchConfig) {\n      return null;\n    }\n    var EventConstructor;\n    switch (topLevelType) {\n      case 'topAbort':\n      case 'topCanPlay':\n      case 'topCanPlayThrough':\n      case 'topDurationChange':\n      case 'topEmptied':\n      case 'topEncrypted':\n      case 'topEnded':\n      case 'topError':\n      case 'topInput':\n      case 'topInvalid':\n      case 'topLoad':\n      case 'topLoadedData':\n      case 'topLoadedMetadata':\n      case 'topLoadStart':\n      case 'topPause':\n      case 'topPlay':\n      case 'topPlaying':\n      case 'topProgress':\n      case 'topRateChange':\n      case 'topReset':\n      case 'topSeeked':\n      case 'topSeeking':\n      case 'topStalled':\n      case 'topSubmit':\n      case 'topSuspend':\n      case 'topTimeUpdate':\n      case 'topVolumeChange':\n      case 'topWaiting':\n        // HTML Events\n        // @see http://www.w3.org/TR/html5/index.html#events-0\n        EventConstructor = SyntheticEvent;\n        break;\n      case 'topKeyPress':\n        // Firefox creates a keypress event for function keys too. This removes\n        // the unwanted keypress events. Enter is however both printable and\n        // non-printable. One would expect Tab to be as well (but it isn't).\n        if (getEventCharCode(nativeEvent) === 0) {\n          return null;\n        }\n      /* falls through */\n      case 'topKeyDown':\n      case 'topKeyUp':\n        EventConstructor = SyntheticKeyboardEvent;\n        break;\n      case 'topBlur':\n      case 'topFocus':\n        EventConstructor = SyntheticFocusEvent;\n        break;\n      case 'topClick':\n        // Firefox creates a click event on right mouse clicks. This removes the\n        // unwanted click events.\n        if (nativeEvent.button === 2) {\n          return null;\n        }\n      /* falls through */\n      case 'topDoubleClick':\n      case 'topMouseDown':\n      case 'topMouseMove':\n      case 'topMouseUp':\n      // TODO: Disabled elements should not respond to mouse events\n      /* falls through */\n      case 'topMouseOut':\n      case 'topMouseOver':\n      case 'topContextMenu':\n        EventConstructor = SyntheticMouseEvent;\n        break;\n      case 'topDrag':\n      case 'topDragEnd':\n      case 'topDragEnter':\n      case 'topDragExit':\n      case 'topDragLeave':\n      case 'topDragOver':\n      case 'topDragStart':\n      case 'topDrop':\n        EventConstructor = SyntheticDragEvent;\n        break;\n      case 'topTouchCancel':\n      case 'topTouchEnd':\n      case 'topTouchMove':\n      case 'topTouchStart':\n        EventConstructor = SyntheticTouchEvent;\n        break;\n      case 'topAnimationEnd':\n      case 'topAnimationIteration':\n      case 'topAnimationStart':\n        EventConstructor = SyntheticAnimationEvent;\n        break;\n      case 'topTransitionEnd':\n        EventConstructor = SyntheticTransitionEvent;\n        break;\n      case 'topScroll':\n        EventConstructor = SyntheticUIEvent;\n        break;\n      case 'topWheel':\n        EventConstructor = SyntheticWheelEvent;\n        break;\n      case 'topCopy':\n      case 'topCut':\n      case 'topPaste':\n        EventConstructor = SyntheticClipboardEvent;\n        break;\n    }\n    !EventConstructor ?  true ? invariant(false, 'SimpleEventPlugin: Unhandled event type, `%s`.', topLevelType) : _prodInvariant('86', topLevelType) : void 0;\n    var event = EventConstructor.getPooled(dispatchConfig, targetInst, nativeEvent, nativeEventTarget);\n    EventPropagators.accumulateTwoPhaseDispatches(event);\n    return event;\n  },\n\n  didPutListener: function (inst, registrationName, listener) {\n    // Mobile Safari does not fire properly bubble click events on\n    // non-interactive elements, which means delegated click listeners do not\n    // fire. The workaround for this bug involves attaching an empty click\n    // listener on the target node.\n    // http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html\n    if (registrationName === 'onClick' && !isInteractive(inst._tag)) {\n      var key = getDictionaryKey(inst);\n      var node = ReactDOMComponentTree.getNodeFromInstance(inst);\n      if (!onClickListeners[key]) {\n        onClickListeners[key] = EventListener.listen(node, 'click', emptyFunction);\n      }\n    }\n  },\n\n  willDeleteListener: function (inst, registrationName) {\n    if (registrationName === 'onClick' && !isInteractive(inst._tag)) {\n      var key = getDictionaryKey(inst);\n      onClickListeners[key].remove();\n      delete onClickListeners[key];\n    }\n  }\n\n};\n\nmodule.exports = SimpleEventPlugin;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzI4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1NpbXBsZUV2ZW50UGx1Z2luLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIEV2ZW50TGlzdGVuZXIgPSByZXF1aXJlKCdmYmpzL2xpYi9FdmVudExpc3RlbmVyJyk7XG52YXIgRXZlbnRQcm9wYWdhdG9ycyA9IHJlcXVpcmUoJy4vRXZlbnRQcm9wYWdhdG9ycycpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgU3ludGhldGljQW5pbWF0aW9uRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0FuaW1hdGlvbkV2ZW50Jyk7XG52YXIgU3ludGhldGljQ2xpcGJvYXJkRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0NsaXBib2FyZEV2ZW50Jyk7XG52YXIgU3ludGhldGljRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0V2ZW50Jyk7XG52YXIgU3ludGhldGljRm9jdXNFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljRm9jdXNFdmVudCcpO1xudmFyIFN5bnRoZXRpY0tleWJvYXJkRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0tleWJvYXJkRXZlbnQnKTtcbnZhciBTeW50aGV0aWNNb3VzZUV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNNb3VzZUV2ZW50Jyk7XG52YXIgU3ludGhldGljRHJhZ0V2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNEcmFnRXZlbnQnKTtcbnZhciBTeW50aGV0aWNUb3VjaEV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNUb3VjaEV2ZW50Jyk7XG52YXIgU3ludGhldGljVHJhbnNpdGlvbkV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQnKTtcbnZhciBTeW50aGV0aWNVSUV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNVSUV2ZW50Jyk7XG52YXIgU3ludGhldGljV2hlZWxFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljV2hlZWxFdmVudCcpO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTtcbnZhciBnZXRFdmVudENoYXJDb2RlID0gcmVxdWlyZSgnLi9nZXRFdmVudENoYXJDb2RlJyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogVHVybnNcbiAqIFsnYWJvcnQnLCAuLi5dXG4gKiBpbnRvXG4gKiBldmVudFR5cGVzID0ge1xuICogICAnYWJvcnQnOiB7XG4gKiAgICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHtcbiAqICAgICAgIGJ1YmJsZWQ6ICdvbkFib3J0JyxcbiAqICAgICAgIGNhcHR1cmVkOiAnb25BYm9ydENhcHR1cmUnLFxuICogICAgIH0sXG4gKiAgICAgZGVwZW5kZW5jaWVzOiBbJ3RvcEFib3J0J10sXG4gKiAgIH0sXG4gKiAgIC4uLlxuICogfTtcbiAqIHRvcExldmVsRXZlbnRzVG9EaXNwYXRjaENvbmZpZyA9IHtcbiAqICAgJ3RvcEFib3J0JzogeyBzYW1lQ29uZmlnIH1cbiAqIH07XG4gKi9cbnZhciBldmVudFR5cGVzID0ge307XG52YXIgdG9wTGV2ZWxFdmVudHNUb0Rpc3BhdGNoQ29uZmlnID0ge307XG5bJ2Fib3J0JywgJ2FuaW1hdGlvbkVuZCcsICdhbmltYXRpb25JdGVyYXRpb24nLCAnYW5pbWF0aW9uU3RhcnQnLCAnYmx1cicsICdjYW5QbGF5JywgJ2NhblBsYXlUaHJvdWdoJywgJ2NsaWNrJywgJ2NvbnRleHRNZW51JywgJ2NvcHknLCAnY3V0JywgJ2RvdWJsZUNsaWNrJywgJ2RyYWcnLCAnZHJhZ0VuZCcsICdkcmFnRW50ZXInLCAnZHJhZ0V4aXQnLCAnZHJhZ0xlYXZlJywgJ2RyYWdPdmVyJywgJ2RyYWdTdGFydCcsICdkcm9wJywgJ2R1cmF0aW9uQ2hhbmdlJywgJ2VtcHRpZWQnLCAnZW5jcnlwdGVkJywgJ2VuZGVkJywgJ2Vycm9yJywgJ2ZvY3VzJywgJ2lucHV0JywgJ2ludmFsaWQnLCAna2V5RG93bicsICdrZXlQcmVzcycsICdrZXlVcCcsICdsb2FkJywgJ2xvYWRlZERhdGEnLCAnbG9hZGVkTWV0YWRhdGEnLCAnbG9hZFN0YXJ0JywgJ21vdXNlRG93bicsICdtb3VzZU1vdmUnLCAnbW91c2VPdXQnLCAnbW91c2VPdmVyJywgJ21vdXNlVXAnLCAncGFzdGUnLCAncGF1c2UnLCAncGxheScsICdwbGF5aW5nJywgJ3Byb2dyZXNzJywgJ3JhdGVDaGFuZ2UnLCAncmVzZXQnLCAnc2Nyb2xsJywgJ3NlZWtlZCcsICdzZWVraW5nJywgJ3N0YWxsZWQnLCAnc3VibWl0JywgJ3N1c3BlbmQnLCAndGltZVVwZGF0ZScsICd0b3VjaENhbmNlbCcsICd0b3VjaEVuZCcsICd0b3VjaE1vdmUnLCAndG91Y2hTdGFydCcsICd0cmFuc2l0aW9uRW5kJywgJ3ZvbHVtZUNoYW5nZScsICd3YWl0aW5nJywgJ3doZWVsJ10uZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgdmFyIGNhcGl0YWxpemVkRXZlbnQgPSBldmVudFswXS50b1VwcGVyQ2FzZSgpICsgZXZlbnQuc2xpY2UoMSk7XG4gIHZhciBvbkV2ZW50ID0gJ29uJyArIGNhcGl0YWxpemVkRXZlbnQ7XG4gIHZhciB0b3BFdmVudCA9ICd0b3AnICsgY2FwaXRhbGl6ZWRFdmVudDtcblxuICB2YXIgdHlwZSA9IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogb25FdmVudCxcbiAgICAgIGNhcHR1cmVkOiBvbkV2ZW50ICsgJ0NhcHR1cmUnXG4gICAgfSxcbiAgICBkZXBlbmRlbmNpZXM6IFt0b3BFdmVudF1cbiAgfTtcbiAgZXZlbnRUeXBlc1tldmVudF0gPSB0eXBlO1xuICB0b3BMZXZlbEV2ZW50c1RvRGlzcGF0Y2hDb25maWdbdG9wRXZlbnRdID0gdHlwZTtcbn0pO1xuXG52YXIgb25DbGlja0xpc3RlbmVycyA9IHt9O1xuXG5mdW5jdGlvbiBnZXREaWN0aW9uYXJ5S2V5KGluc3QpIHtcbiAgLy8gUHJldmVudHMgVjggcGVyZm9ybWFuY2UgaXNzdWU6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzcyMzJcbiAgcmV0dXJuICcuJyArIGluc3QuX3Jvb3ROb2RlSUQ7XG59XG5cbmZ1bmN0aW9uIGlzSW50ZXJhY3RpdmUodGFnKSB7XG4gIHJldHVybiB0YWcgPT09ICdidXR0b24nIHx8IHRhZyA9PT0gJ2lucHV0JyB8fCB0YWcgPT09ICdzZWxlY3QnIHx8IHRhZyA9PT0gJ3RleHRhcmVhJztcbn1cblxudmFyIFNpbXBsZUV2ZW50UGx1Z2luID0ge1xuXG4gIGV2ZW50VHlwZXM6IGV2ZW50VHlwZXMsXG5cbiAgZXh0cmFjdEV2ZW50czogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgdmFyIGRpc3BhdGNoQ29uZmlnID0gdG9wTGV2ZWxFdmVudHNUb0Rpc3BhdGNoQ29uZmlnW3RvcExldmVsVHlwZV07XG4gICAgaWYgKCFkaXNwYXRjaENvbmZpZykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBFdmVudENvbnN0cnVjdG9yO1xuICAgIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7XG4gICAgICBjYXNlICd0b3BBYm9ydCc6XG4gICAgICBjYXNlICd0b3BDYW5QbGF5JzpcbiAgICAgIGNhc2UgJ3RvcENhblBsYXlUaHJvdWdoJzpcbiAgICAgIGNhc2UgJ3RvcER1cmF0aW9uQ2hhbmdlJzpcbiAgICAgIGNhc2UgJ3RvcEVtcHRpZWQnOlxuICAgICAgY2FzZSAndG9wRW5jcnlwdGVkJzpcbiAgICAgIGNhc2UgJ3RvcEVuZGVkJzpcbiAgICAgIGNhc2UgJ3RvcEVycm9yJzpcbiAgICAgIGNhc2UgJ3RvcElucHV0JzpcbiAgICAgIGNhc2UgJ3RvcEludmFsaWQnOlxuICAgICAgY2FzZSAndG9wTG9hZCc6XG4gICAgICBjYXNlICd0b3BMb2FkZWREYXRhJzpcbiAgICAgIGNhc2UgJ3RvcExvYWRlZE1ldGFkYXRhJzpcbiAgICAgIGNhc2UgJ3RvcExvYWRTdGFydCc6XG4gICAgICBjYXNlICd0b3BQYXVzZSc6XG4gICAgICBjYXNlICd0b3BQbGF5JzpcbiAgICAgIGNhc2UgJ3RvcFBsYXlpbmcnOlxuICAgICAgY2FzZSAndG9wUHJvZ3Jlc3MnOlxuICAgICAgY2FzZSAndG9wUmF0ZUNoYW5nZSc6XG4gICAgICBjYXNlICd0b3BSZXNldCc6XG4gICAgICBjYXNlICd0b3BTZWVrZWQnOlxuICAgICAgY2FzZSAndG9wU2Vla2luZyc6XG4gICAgICBjYXNlICd0b3BTdGFsbGVkJzpcbiAgICAgIGNhc2UgJ3RvcFN1Ym1pdCc6XG4gICAgICBjYXNlICd0b3BTdXNwZW5kJzpcbiAgICAgIGNhc2UgJ3RvcFRpbWVVcGRhdGUnOlxuICAgICAgY2FzZSAndG9wVm9sdW1lQ2hhbmdlJzpcbiAgICAgIGNhc2UgJ3RvcFdhaXRpbmcnOlxuICAgICAgICAvLyBIVE1MIEV2ZW50c1xuICAgICAgICAvLyBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L2luZGV4Lmh0bWwjZXZlbnRzLTBcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY0V2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcEtleVByZXNzJzpcbiAgICAgICAgLy8gRmlyZWZveCBjcmVhdGVzIGEga2V5cHJlc3MgZXZlbnQgZm9yIGZ1bmN0aW9uIGtleXMgdG9vLiBUaGlzIHJlbW92ZXNcbiAgICAgICAgLy8gdGhlIHVud2FudGVkIGtleXByZXNzIGV2ZW50cy4gRW50ZXIgaXMgaG93ZXZlciBib3RoIHByaW50YWJsZSBhbmRcbiAgICAgICAgLy8gbm9uLXByaW50YWJsZS4gT25lIHdvdWxkIGV4cGVjdCBUYWIgdG8gYmUgYXMgd2VsbCAoYnV0IGl0IGlzbid0KS5cbiAgICAgICAgaWYgKGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZlbnQpID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgJ3RvcEtleURvd24nOlxuICAgICAgY2FzZSAndG9wS2V5VXAnOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljS2V5Ym9hcmRFdmVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3BCbHVyJzpcbiAgICAgIGNhc2UgJ3RvcEZvY3VzJzpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wQ2xpY2snOlxuICAgICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBjbGljayBldmVudCBvbiByaWdodCBtb3VzZSBjbGlja3MuIFRoaXMgcmVtb3ZlcyB0aGVcbiAgICAgICAgLy8gdW53YW50ZWQgY2xpY2sgZXZlbnRzLlxuICAgICAgICBpZiAobmF0aXZlRXZlbnQuYnV0dG9uID09PSAyKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgJ3RvcERvdWJsZUNsaWNrJzpcbiAgICAgIGNhc2UgJ3RvcE1vdXNlRG93bic6XG4gICAgICBjYXNlICd0b3BNb3VzZU1vdmUnOlxuICAgICAgY2FzZSAndG9wTW91c2VVcCc6XG4gICAgICAvLyBUT0RPOiBEaXNhYmxlZCBlbGVtZW50cyBzaG91bGQgbm90IHJlc3BvbmQgdG8gbW91c2UgZXZlbnRzXG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlICd0b3BNb3VzZU91dCc6XG4gICAgICBjYXNlICd0b3BNb3VzZU92ZXInOlxuICAgICAgY2FzZSAndG9wQ29udGV4dE1lbnUnOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljTW91c2VFdmVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3BEcmFnJzpcbiAgICAgIGNhc2UgJ3RvcERyYWdFbmQnOlxuICAgICAgY2FzZSAndG9wRHJhZ0VudGVyJzpcbiAgICAgIGNhc2UgJ3RvcERyYWdFeGl0JzpcbiAgICAgIGNhc2UgJ3RvcERyYWdMZWF2ZSc6XG4gICAgICBjYXNlICd0b3BEcmFnT3Zlcic6XG4gICAgICBjYXNlICd0b3BEcmFnU3RhcnQnOlxuICAgICAgY2FzZSAndG9wRHJvcCc6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNEcmFnRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wVG91Y2hDYW5jZWwnOlxuICAgICAgY2FzZSAndG9wVG91Y2hFbmQnOlxuICAgICAgY2FzZSAndG9wVG91Y2hNb3ZlJzpcbiAgICAgIGNhc2UgJ3RvcFRvdWNoU3RhcnQnOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljVG91Y2hFdmVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3BBbmltYXRpb25FbmQnOlxuICAgICAgY2FzZSAndG9wQW5pbWF0aW9uSXRlcmF0aW9uJzpcbiAgICAgIGNhc2UgJ3RvcEFuaW1hdGlvblN0YXJ0JzpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcFRyYW5zaXRpb25FbmQnOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljVHJhbnNpdGlvbkV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcFNjcm9sbCc6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNVSUV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcFdoZWVsJzpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY1doZWVsRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wQ29weSc6XG4gICAgICBjYXNlICd0b3BDdXQnOlxuICAgICAgY2FzZSAndG9wUGFzdGUnOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljQ2xpcGJvYXJkRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAhRXZlbnRDb25zdHJ1Y3RvciA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdTaW1wbGVFdmVudFBsdWdpbjogVW5oYW5kbGVkIGV2ZW50IHR5cGUsIGAlc2AuJywgdG9wTGV2ZWxUeXBlKSA6IF9wcm9kSW52YXJpYW50KCc4NicsIHRvcExldmVsVHlwZSkgOiB2b2lkIDA7XG4gICAgdmFyIGV2ZW50ID0gRXZlbnRDb25zdHJ1Y3Rvci5nZXRQb29sZWQoZGlzcGF0Y2hDb25maWcsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgRXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50KTtcbiAgICByZXR1cm4gZXZlbnQ7XG4gIH0sXG5cbiAgZGlkUHV0TGlzdGVuZXI6IGZ1bmN0aW9uIChpbnN0LCByZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lcikge1xuICAgIC8vIE1vYmlsZSBTYWZhcmkgZG9lcyBub3QgZmlyZSBwcm9wZXJseSBidWJibGUgY2xpY2sgZXZlbnRzIG9uXG4gICAgLy8gbm9uLWludGVyYWN0aXZlIGVsZW1lbnRzLCB3aGljaCBtZWFucyBkZWxlZ2F0ZWQgY2xpY2sgbGlzdGVuZXJzIGRvIG5vdFxuICAgIC8vIGZpcmUuIFRoZSB3b3JrYXJvdW5kIGZvciB0aGlzIGJ1ZyBpbnZvbHZlcyBhdHRhY2hpbmcgYW4gZW1wdHkgY2xpY2tcbiAgICAvLyBsaXN0ZW5lciBvbiB0aGUgdGFyZ2V0IG5vZGUuXG4gICAgLy8gaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTAvMDkvY2xpY2tfZXZlbnRfZGVsLmh0bWxcbiAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSA9PT0gJ29uQ2xpY2snICYmICFpc0ludGVyYWN0aXZlKGluc3QuX3RhZykpIHtcbiAgICAgIHZhciBrZXkgPSBnZXREaWN0aW9uYXJ5S2V5KGluc3QpO1xuICAgICAgdmFyIG5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTtcbiAgICAgIGlmICghb25DbGlja0xpc3RlbmVyc1trZXldKSB7XG4gICAgICAgIG9uQ2xpY2tMaXN0ZW5lcnNba2V5XSA9IEV2ZW50TGlzdGVuZXIubGlzdGVuKG5vZGUsICdjbGljaycsIGVtcHR5RnVuY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB3aWxsRGVsZXRlTGlzdGVuZXI6IGZ1bmN0aW9uIChpbnN0LCByZWdpc3RyYXRpb25OYW1lKSB7XG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgPT09ICdvbkNsaWNrJyAmJiAhaXNJbnRlcmFjdGl2ZShpbnN0Ll90YWcpKSB7XG4gICAgICB2YXIga2V5ID0gZ2V0RGljdGlvbmFyeUtleShpbnN0KTtcbiAgICAgIG9uQ2xpY2tMaXN0ZW5lcnNba2V5XS5yZW1vdmUoKTtcbiAgICAgIGRlbGV0ZSBvbkNsaWNrTGlzdGVuZXJzW2tleV07XG4gICAgfVxuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gU2ltcGxlRXZlbnRQbHVnaW47XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvU2ltcGxlRXZlbnRQbHVnaW4uanNcbi8vIG1vZHVsZSBpZCA9IDMyOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 329 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar SyntheticEvent = __webpack_require__(226);\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/css3-animations/#AnimationEvent-interface\n * @see https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent\n */\nvar AnimationEventInterface = {\n  animationName: null,\n  elapsedTime: null,\n  pseudoElement: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticEvent}\n */\nfunction SyntheticAnimationEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n  return SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticEvent.augmentClass(SyntheticAnimationEvent, AnimationEventInterface);\n\nmodule.exports = SyntheticAnimationEvent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzI5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0FuaW1hdGlvbkV2ZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBTeW50aGV0aWNFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljRXZlbnQnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtYW5pbWF0aW9ucy8jQW5pbWF0aW9uRXZlbnQtaW50ZXJmYWNlXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BbmltYXRpb25FdmVudFxuICovXG52YXIgQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UgPSB7XG4gIGFuaW1hdGlvbk5hbWU6IG51bGwsXG4gIGVsYXBzZWRUaW1lOiBudWxsLFxuICBwc2V1ZG9FbGVtZW50OiBudWxsXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEBleHRlbmRzIHtTeW50aGV0aWNFdmVudH1cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljQW5pbWF0aW9uRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY0V2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljQW5pbWF0aW9uRXZlbnQsIEFuaW1hdGlvbkV2ZW50SW50ZXJmYWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNBbmltYXRpb25FdmVudDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNBbmltYXRpb25FdmVudC5qc1xuLy8gbW9kdWxlIGlkID0gMzI5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 330 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar SyntheticEvent = __webpack_require__(226);\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/clipboard-apis/\n */\nvar ClipboardEventInterface = {\n  clipboardData: function (event) {\n    return 'clipboardData' in event ? event.clipboardData : window.clipboardData;\n  }\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticClipboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n  return SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticEvent.augmentClass(SyntheticClipboardEvent, ClipboardEventInterface);\n\nmodule.exports = SyntheticClipboardEvent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzMwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0NsaXBib2FyZEV2ZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBTeW50aGV0aWNFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljRXZlbnQnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NsaXBib2FyZC1hcGlzL1xuICovXG52YXIgQ2xpcGJvYXJkRXZlbnRJbnRlcmZhY2UgPSB7XG4gIGNsaXBib2FyZERhdGE6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnY2xpcGJvYXJkRGF0YScgaW4gZXZlbnQgPyBldmVudC5jbGlwYm9hcmREYXRhIDogd2luZG93LmNsaXBib2FyZERhdGE7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9XG4gKi9cbmZ1bmN0aW9uIFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBTeW50aGV0aWNFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuU3ludGhldGljRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50LCBDbGlwYm9hcmRFdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljQ2xpcGJvYXJkRXZlbnQ7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvU3ludGhldGljQ2xpcGJvYXJkRXZlbnQuanNcbi8vIG1vZHVsZSBpZCA9IDMzMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 331 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar SyntheticUIEvent = __webpack_require__(248);\n\n/**\n * @interface FocusEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar FocusEventInterface = {\n  relatedTarget: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticFocusEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n  return SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticUIEvent.augmentClass(SyntheticFocusEvent, FocusEventInterface);\n\nmodule.exports = SyntheticFocusEvent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzMxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0ZvY3VzRXZlbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY1VJRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY1VJRXZlbnQnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIEZvY3VzRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG52YXIgRm9jdXNFdmVudEludGVyZmFjZSA9IHtcbiAgcmVsYXRlZFRhcmdldDogbnVsbFxufTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAZXh0ZW5kcyB7U3ludGhldGljVUlFdmVudH1cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljRm9jdXNFdmVudChkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICByZXR1cm4gU3ludGhldGljVUlFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuU3ludGhldGljVUlFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljRm9jdXNFdmVudCwgRm9jdXNFdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljRm9jdXNFdmVudDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNGb2N1c0V2ZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAzMzFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 332 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar SyntheticUIEvent = __webpack_require__(248);\n\nvar getEventCharCode = __webpack_require__(333);\nvar getEventKey = __webpack_require__(334);\nvar getEventModifierState = __webpack_require__(250);\n\n/**\n * @interface KeyboardEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar KeyboardEventInterface = {\n  key: getEventKey,\n  location: null,\n  ctrlKey: null,\n  shiftKey: null,\n  altKey: null,\n  metaKey: null,\n  repeat: null,\n  locale: null,\n  getModifierState: getEventModifierState,\n  // Legacy Interface\n  charCode: function (event) {\n    // `charCode` is the result of a KeyPress event and represents the value of\n    // the actual printable character.\n\n    // KeyPress is deprecated, but its replacement is not yet final and not\n    // implemented in any major browser. Only KeyPress has charCode.\n    if (event.type === 'keypress') {\n      return getEventCharCode(event);\n    }\n    return 0;\n  },\n  keyCode: function (event) {\n    // `keyCode` is the result of a KeyDown/Up event and represents the value of\n    // physical keyboard key.\n\n    // The actual meaning of the value depends on the users' keyboard layout\n    // which cannot be detected. Assuming that it is a US keyboard layout\n    // provides a surprisingly accurate mapping for US and European users.\n    // Due to this, it is left to the user to implement at this time.\n    if (event.type === 'keydown' || event.type === 'keyup') {\n      return event.keyCode;\n    }\n    return 0;\n  },\n  which: function (event) {\n    // `which` is an alias for either `keyCode` or `charCode` depending on the\n    // type of the event.\n    if (event.type === 'keypress') {\n      return getEventCharCode(event);\n    }\n    if (event.type === 'keydown' || event.type === 'keyup') {\n      return event.keyCode;\n    }\n    return 0;\n  }\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticKeyboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n  return SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticUIEvent.augmentClass(SyntheticKeyboardEvent, KeyboardEventInterface);\n\nmodule.exports = SyntheticKeyboardEvent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzMyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0tleWJvYXJkRXZlbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY1VJRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY1VJRXZlbnQnKTtcblxudmFyIGdldEV2ZW50Q2hhckNvZGUgPSByZXF1aXJlKCcuL2dldEV2ZW50Q2hhckNvZGUnKTtcbnZhciBnZXRFdmVudEtleSA9IHJlcXVpcmUoJy4vZ2V0RXZlbnRLZXknKTtcbnZhciBnZXRFdmVudE1vZGlmaWVyU3RhdGUgPSByZXF1aXJlKCcuL2dldEV2ZW50TW9kaWZpZXJTdGF0ZScpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgS2V5Ym9hcmRFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cbnZhciBLZXlib2FyZEV2ZW50SW50ZXJmYWNlID0ge1xuICBrZXk6IGdldEV2ZW50S2V5LFxuICBsb2NhdGlvbjogbnVsbCxcbiAgY3RybEtleTogbnVsbCxcbiAgc2hpZnRLZXk6IG51bGwsXG4gIGFsdEtleTogbnVsbCxcbiAgbWV0YUtleTogbnVsbCxcbiAgcmVwZWF0OiBudWxsLFxuICBsb2NhbGU6IG51bGwsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgLy8gTGVnYWN5IEludGVyZmFjZVxuICBjaGFyQ29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYGNoYXJDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5UHJlc3MgZXZlbnQgYW5kIHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mXG4gICAgLy8gdGhlIGFjdHVhbCBwcmludGFibGUgY2hhcmFjdGVyLlxuXG4gICAgLy8gS2V5UHJlc3MgaXMgZGVwcmVjYXRlZCwgYnV0IGl0cyByZXBsYWNlbWVudCBpcyBub3QgeWV0IGZpbmFsIGFuZCBub3RcbiAgICAvLyBpbXBsZW1lbnRlZCBpbiBhbnkgbWFqb3IgYnJvd3Nlci4gT25seSBLZXlQcmVzcyBoYXMgY2hhckNvZGUuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgIHJldHVybiBnZXRFdmVudENoYXJDb2RlKGV2ZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH0sXG4gIGtleUNvZGU6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGBrZXlDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5RG93bi9VcCBldmVudCBhbmQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2ZcbiAgICAvLyBwaHlzaWNhbCBrZXlib2FyZCBrZXkuXG5cbiAgICAvLyBUaGUgYWN0dWFsIG1lYW5pbmcgb2YgdGhlIHZhbHVlIGRlcGVuZHMgb24gdGhlIHVzZXJzJyBrZXlib2FyZCBsYXlvdXRcbiAgICAvLyB3aGljaCBjYW5ub3QgYmUgZGV0ZWN0ZWQuIEFzc3VtaW5nIHRoYXQgaXQgaXMgYSBVUyBrZXlib2FyZCBsYXlvdXRcbiAgICAvLyBwcm92aWRlcyBhIHN1cnByaXNpbmdseSBhY2N1cmF0ZSBtYXBwaW5nIGZvciBVUyBhbmQgRXVyb3BlYW4gdXNlcnMuXG4gICAgLy8gRHVlIHRvIHRoaXMsIGl0IGlzIGxlZnQgdG8gdGhlIHVzZXIgdG8gaW1wbGVtZW50IGF0IHRoaXMgdGltZS5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgIHJldHVybiBldmVudC5rZXlDb2RlO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAgd2hpY2g6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGB3aGljaGAgaXMgYW4gYWxpYXMgZm9yIGVpdGhlciBga2V5Q29kZWAgb3IgYGNoYXJDb2RlYCBkZXBlbmRpbmcgb24gdGhlXG4gICAgLy8gdHlwZSBvZiB0aGUgZXZlbnQuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgIHJldHVybiBnZXRFdmVudENoYXJDb2RlKGV2ZW50KTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBldmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgICByZXR1cm4gZXZlbnQua2V5Q29kZTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9XG4gKi9cbmZ1bmN0aW9uIFN5bnRoZXRpY0tleWJvYXJkRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY1VJRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cblN5bnRoZXRpY1VJRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY0tleWJvYXJkRXZlbnQsIEtleWJvYXJkRXZlbnRJbnRlcmZhY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY0tleWJvYXJkRXZlbnQ7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvU3ludGhldGljS2V5Ym9hcmRFdmVudC5qc1xuLy8gbW9kdWxlIGlkID0gMzMyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 333 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\n/**\n * `charCode` represents the actual \"character code\" and is safe to use with\n * `String.fromCharCode`. As such, only keys that correspond to printable\n * characters produce a valid `charCode`, the only exception to this is Enter.\n * The Tab-key is considered non-printable and does not have a `charCode`,\n * presumably because it does not produce a tab-character in browsers.\n *\n * @param {object} nativeEvent Native browser event.\n * @return {number} Normalized `charCode` property.\n */\n\nfunction getEventCharCode(nativeEvent) {\n  var charCode;\n  var keyCode = nativeEvent.keyCode;\n\n  if ('charCode' in nativeEvent) {\n    charCode = nativeEvent.charCode;\n\n    // FF does not set `charCode` for the Enter-key, check against `keyCode`.\n    if (charCode === 0 && keyCode === 13) {\n      charCode = 13;\n    }\n  } else {\n    // IE8 does not implement `charCode`, but `keyCode` has the correct value.\n    charCode = keyCode;\n  }\n\n  // Some non-printable keys are reported in `charCode`/`keyCode`, discard them.\n  // Must not discard the (non-)printable Enter-key.\n  if (charCode >= 32 || charCode === 13) {\n    return charCode;\n  }\n\n  return 0;\n}\n\nmodule.exports = getEventCharCode;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzMzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2dldEV2ZW50Q2hhckNvZGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBgY2hhckNvZGVgIHJlcHJlc2VudHMgdGhlIGFjdHVhbCBcImNoYXJhY3RlciBjb2RlXCIgYW5kIGlzIHNhZmUgdG8gdXNlIHdpdGhcbiAqIGBTdHJpbmcuZnJvbUNoYXJDb2RlYC4gQXMgc3VjaCwgb25seSBrZXlzIHRoYXQgY29ycmVzcG9uZCB0byBwcmludGFibGVcbiAqIGNoYXJhY3RlcnMgcHJvZHVjZSBhIHZhbGlkIGBjaGFyQ29kZWAsIHRoZSBvbmx5IGV4Y2VwdGlvbiB0byB0aGlzIGlzIEVudGVyLlxuICogVGhlIFRhYi1rZXkgaXMgY29uc2lkZXJlZCBub24tcHJpbnRhYmxlIGFuZCBkb2VzIG5vdCBoYXZlIGEgYGNoYXJDb2RlYCxcbiAqIHByZXN1bWFibHkgYmVjYXVzZSBpdCBkb2VzIG5vdCBwcm9kdWNlIGEgdGFiLWNoYXJhY3RlciBpbiBicm93c2Vycy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IE5vcm1hbGl6ZWQgYGNoYXJDb2RlYCBwcm9wZXJ0eS5cbiAqL1xuXG5mdW5jdGlvbiBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBjaGFyQ29kZTtcbiAgdmFyIGtleUNvZGUgPSBuYXRpdmVFdmVudC5rZXlDb2RlO1xuXG4gIGlmICgnY2hhckNvZGUnIGluIG5hdGl2ZUV2ZW50KSB7XG4gICAgY2hhckNvZGUgPSBuYXRpdmVFdmVudC5jaGFyQ29kZTtcblxuICAgIC8vIEZGIGRvZXMgbm90IHNldCBgY2hhckNvZGVgIGZvciB0aGUgRW50ZXIta2V5LCBjaGVjayBhZ2FpbnN0IGBrZXlDb2RlYC5cbiAgICBpZiAoY2hhckNvZGUgPT09IDAgJiYga2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgIGNoYXJDb2RlID0gMTM7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElFOCBkb2VzIG5vdCBpbXBsZW1lbnQgYGNoYXJDb2RlYCwgYnV0IGBrZXlDb2RlYCBoYXMgdGhlIGNvcnJlY3QgdmFsdWUuXG4gICAgY2hhckNvZGUgPSBrZXlDb2RlO1xuICB9XG5cbiAgLy8gU29tZSBub24tcHJpbnRhYmxlIGtleXMgYXJlIHJlcG9ydGVkIGluIGBjaGFyQ29kZWAvYGtleUNvZGVgLCBkaXNjYXJkIHRoZW0uXG4gIC8vIE11c3Qgbm90IGRpc2NhcmQgdGhlIChub24tKXByaW50YWJsZSBFbnRlci1rZXkuXG4gIGlmIChjaGFyQ29kZSA+PSAzMiB8fCBjaGFyQ29kZSA9PT0gMTMpIHtcbiAgICByZXR1cm4gY2hhckNvZGU7XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRFdmVudENoYXJDb2RlO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL2dldEV2ZW50Q2hhckNvZGUuanNcbi8vIG1vZHVsZSBpZCA9IDMzM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 334 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar getEventCharCode = __webpack_require__(333);\n\n/**\n * Normalization of deprecated HTML5 `key` values\n * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names\n */\nvar normalizeKey = {\n  'Esc': 'Escape',\n  'Spacebar': ' ',\n  'Left': 'ArrowLeft',\n  'Up': 'ArrowUp',\n  'Right': 'ArrowRight',\n  'Down': 'ArrowDown',\n  'Del': 'Delete',\n  'Win': 'OS',\n  'Menu': 'ContextMenu',\n  'Apps': 'ContextMenu',\n  'Scroll': 'ScrollLock',\n  'MozPrintableKey': 'Unidentified'\n};\n\n/**\n * Translation from legacy `keyCode` to HTML5 `key`\n * Only special keys supported, all others depend on keyboard layout or browser\n * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names\n */\nvar translateToKey = {\n  8: 'Backspace',\n  9: 'Tab',\n  12: 'Clear',\n  13: 'Enter',\n  16: 'Shift',\n  17: 'Control',\n  18: 'Alt',\n  19: 'Pause',\n  20: 'CapsLock',\n  27: 'Escape',\n  32: ' ',\n  33: 'PageUp',\n  34: 'PageDown',\n  35: 'End',\n  36: 'Home',\n  37: 'ArrowLeft',\n  38: 'ArrowUp',\n  39: 'ArrowRight',\n  40: 'ArrowDown',\n  45: 'Insert',\n  46: 'Delete',\n  112: 'F1', 113: 'F2', 114: 'F3', 115: 'F4', 116: 'F5', 117: 'F6',\n  118: 'F7', 119: 'F8', 120: 'F9', 121: 'F10', 122: 'F11', 123: 'F12',\n  144: 'NumLock',\n  145: 'ScrollLock',\n  224: 'Meta'\n};\n\n/**\n * @param {object} nativeEvent Native browser event.\n * @return {string} Normalized `key` property.\n */\nfunction getEventKey(nativeEvent) {\n  if (nativeEvent.key) {\n    // Normalize inconsistent values reported by browsers due to\n    // implementations of a working draft specification.\n\n    // FireFox implements `key` but returns `MozPrintableKey` for all\n    // printable characters (normalized to `Unidentified`), ignore it.\n    var key = normalizeKey[nativeEvent.key] || nativeEvent.key;\n    if (key !== 'Unidentified') {\n      return key;\n    }\n  }\n\n  // Browser does not implement `key`, polyfill as much of it as we can.\n  if (nativeEvent.type === 'keypress') {\n    var charCode = getEventCharCode(nativeEvent);\n\n    // The enter-key is technically both printable and non-printable and can\n    // thus be captured by `keypress`, no other non-printable key should.\n    return charCode === 13 ? 'Enter' : String.fromCharCode(charCode);\n  }\n  if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') {\n    // While user keyboard layout determines the actual meaning of each\n    // `keyCode` value, almost all function keys have a universal value.\n    return translateToKey[nativeEvent.keyCode] || 'Unidentified';\n  }\n  return '';\n}\n\nmodule.exports = getEventKey;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzM0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2dldEV2ZW50S2V5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBnZXRFdmVudENoYXJDb2RlID0gcmVxdWlyZSgnLi9nZXRFdmVudENoYXJDb2RlJyk7XG5cbi8qKlxuICogTm9ybWFsaXphdGlvbiBvZiBkZXByZWNhdGVkIEhUTUw1IGBrZXlgIHZhbHVlc1xuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudCNLZXlfbmFtZXNcbiAqL1xudmFyIG5vcm1hbGl6ZUtleSA9IHtcbiAgJ0VzYyc6ICdFc2NhcGUnLFxuICAnU3BhY2ViYXInOiAnICcsXG4gICdMZWZ0JzogJ0Fycm93TGVmdCcsXG4gICdVcCc6ICdBcnJvd1VwJyxcbiAgJ1JpZ2h0JzogJ0Fycm93UmlnaHQnLFxuICAnRG93bic6ICdBcnJvd0Rvd24nLFxuICAnRGVsJzogJ0RlbGV0ZScsXG4gICdXaW4nOiAnT1MnLFxuICAnTWVudSc6ICdDb250ZXh0TWVudScsXG4gICdBcHBzJzogJ0NvbnRleHRNZW51JyxcbiAgJ1Njcm9sbCc6ICdTY3JvbGxMb2NrJyxcbiAgJ01velByaW50YWJsZUtleSc6ICdVbmlkZW50aWZpZWQnXG59O1xuXG4vKipcbiAqIFRyYW5zbGF0aW9uIGZyb20gbGVnYWN5IGBrZXlDb2RlYCB0byBIVE1MNSBga2V5YFxuICogT25seSBzcGVjaWFsIGtleXMgc3VwcG9ydGVkLCBhbGwgb3RoZXJzIGRlcGVuZCBvbiBrZXlib2FyZCBsYXlvdXQgb3IgYnJvd3NlclxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudCNLZXlfbmFtZXNcbiAqL1xudmFyIHRyYW5zbGF0ZVRvS2V5ID0ge1xuICA4OiAnQmFja3NwYWNlJyxcbiAgOTogJ1RhYicsXG4gIDEyOiAnQ2xlYXInLFxuICAxMzogJ0VudGVyJyxcbiAgMTY6ICdTaGlmdCcsXG4gIDE3OiAnQ29udHJvbCcsXG4gIDE4OiAnQWx0JyxcbiAgMTk6ICdQYXVzZScsXG4gIDIwOiAnQ2Fwc0xvY2snLFxuICAyNzogJ0VzY2FwZScsXG4gIDMyOiAnICcsXG4gIDMzOiAnUGFnZVVwJyxcbiAgMzQ6ICdQYWdlRG93bicsXG4gIDM1OiAnRW5kJyxcbiAgMzY6ICdIb21lJyxcbiAgMzc6ICdBcnJvd0xlZnQnLFxuICAzODogJ0Fycm93VXAnLFxuICAzOTogJ0Fycm93UmlnaHQnLFxuICA0MDogJ0Fycm93RG93bicsXG4gIDQ1OiAnSW5zZXJ0JyxcbiAgNDY6ICdEZWxldGUnLFxuICAxMTI6ICdGMScsIDExMzogJ0YyJywgMTE0OiAnRjMnLCAxMTU6ICdGNCcsIDExNjogJ0Y1JywgMTE3OiAnRjYnLFxuICAxMTg6ICdGNycsIDExOTogJ0Y4JywgMTIwOiAnRjknLCAxMjE6ICdGMTAnLCAxMjI6ICdGMTEnLCAxMjM6ICdGMTInLFxuICAxNDQ6ICdOdW1Mb2NrJyxcbiAgMTQ1OiAnU2Nyb2xsTG9jaycsXG4gIDIyNDogJ01ldGEnXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge3N0cmluZ30gTm9ybWFsaXplZCBga2V5YCBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gZ2V0RXZlbnRLZXkobmF0aXZlRXZlbnQpIHtcbiAgaWYgKG5hdGl2ZUV2ZW50LmtleSkge1xuICAgIC8vIE5vcm1hbGl6ZSBpbmNvbnNpc3RlbnQgdmFsdWVzIHJlcG9ydGVkIGJ5IGJyb3dzZXJzIGR1ZSB0b1xuICAgIC8vIGltcGxlbWVudGF0aW9ucyBvZiBhIHdvcmtpbmcgZHJhZnQgc3BlY2lmaWNhdGlvbi5cblxuICAgIC8vIEZpcmVGb3ggaW1wbGVtZW50cyBga2V5YCBidXQgcmV0dXJucyBgTW96UHJpbnRhYmxlS2V5YCBmb3IgYWxsXG4gICAgLy8gcHJpbnRhYmxlIGNoYXJhY3RlcnMgKG5vcm1hbGl6ZWQgdG8gYFVuaWRlbnRpZmllZGApLCBpZ25vcmUgaXQuXG4gICAgdmFyIGtleSA9IG5vcm1hbGl6ZUtleVtuYXRpdmVFdmVudC5rZXldIHx8IG5hdGl2ZUV2ZW50LmtleTtcbiAgICBpZiAoa2V5ICE9PSAnVW5pZGVudGlmaWVkJykge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cblxuICAvLyBCcm93c2VyIGRvZXMgbm90IGltcGxlbWVudCBga2V5YCwgcG9seWZpbGwgYXMgbXVjaCBvZiBpdCBhcyB3ZSBjYW4uXG4gIGlmIChuYXRpdmVFdmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgdmFyIGNoYXJDb2RlID0gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCk7XG5cbiAgICAvLyBUaGUgZW50ZXIta2V5IGlzIHRlY2huaWNhbGx5IGJvdGggcHJpbnRhYmxlIGFuZCBub24tcHJpbnRhYmxlIGFuZCBjYW5cbiAgICAvLyB0aHVzIGJlIGNhcHR1cmVkIGJ5IGBrZXlwcmVzc2AsIG5vIG90aGVyIG5vbi1wcmludGFibGUga2V5IHNob3VsZC5cbiAgICByZXR1cm4gY2hhckNvZGUgPT09IDEzID8gJ0VudGVyJyA6IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICB9XG4gIGlmIChuYXRpdmVFdmVudC50eXBlID09PSAna2V5ZG93bicgfHwgbmF0aXZlRXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgIC8vIFdoaWxlIHVzZXIga2V5Ym9hcmQgbGF5b3V0IGRldGVybWluZXMgdGhlIGFjdHVhbCBtZWFuaW5nIG9mIGVhY2hcbiAgICAvLyBga2V5Q29kZWAgdmFsdWUsIGFsbW9zdCBhbGwgZnVuY3Rpb24ga2V5cyBoYXZlIGEgdW5pdmVyc2FsIHZhbHVlLlxuICAgIHJldHVybiB0cmFuc2xhdGVUb0tleVtuYXRpdmVFdmVudC5rZXlDb2RlXSB8fCAnVW5pZGVudGlmaWVkJztcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0RXZlbnRLZXk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvZ2V0RXZlbnRLZXkuanNcbi8vIG1vZHVsZSBpZCA9IDMzNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 335 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar SyntheticMouseEvent = __webpack_require__(247);\n\n/**\n * @interface DragEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar DragEventInterface = {\n  dataTransfer: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticDragEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n  return SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticMouseEvent.augmentClass(SyntheticDragEvent, DragEventInterface);\n\nmodule.exports = SyntheticDragEvent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzM1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0RyYWdFdmVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3ludGhldGljTW91c2VFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljTW91c2VFdmVudCcpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRHJhZ0V2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xudmFyIERyYWdFdmVudEludGVyZmFjZSA9IHtcbiAgZGF0YVRyYW5zZmVyOiBudWxsXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEBleHRlbmRzIHtTeW50aGV0aWNVSUV2ZW50fVxuICovXG5mdW5jdGlvbiBTeW50aGV0aWNEcmFnRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY01vdXNlRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cblN5bnRoZXRpY01vdXNlRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY0RyYWdFdmVudCwgRHJhZ0V2ZW50SW50ZXJmYWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNEcmFnRXZlbnQ7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvU3ludGhldGljRHJhZ0V2ZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAzMzVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 336 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar SyntheticUIEvent = __webpack_require__(248);\n\nvar getEventModifierState = __webpack_require__(250);\n\n/**\n * @interface TouchEvent\n * @see http://www.w3.org/TR/touch-events/\n */\nvar TouchEventInterface = {\n  touches: null,\n  targetTouches: null,\n  changedTouches: null,\n  altKey: null,\n  metaKey: null,\n  ctrlKey: null,\n  shiftKey: null,\n  getModifierState: getEventModifierState\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticTouchEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n  return SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticUIEvent.augmentClass(SyntheticTouchEvent, TouchEventInterface);\n\nmodule.exports = SyntheticTouchEvent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzM2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY1RvdWNoRXZlbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY1VJRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY1VJRXZlbnQnKTtcblxudmFyIGdldEV2ZW50TW9kaWZpZXJTdGF0ZSA9IHJlcXVpcmUoJy4vZ2V0RXZlbnRNb2RpZmllclN0YXRlJyk7XG5cbi8qKlxuICogQGludGVyZmFjZSBUb3VjaEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3RvdWNoLWV2ZW50cy9cbiAqL1xudmFyIFRvdWNoRXZlbnRJbnRlcmZhY2UgPSB7XG4gIHRvdWNoZXM6IG51bGwsXG4gIHRhcmdldFRvdWNoZXM6IG51bGwsXG4gIGNoYW5nZWRUb3VjaGVzOiBudWxsLFxuICBhbHRLZXk6IG51bGwsXG4gIG1ldGFLZXk6IG51bGwsXG4gIGN0cmxLZXk6IG51bGwsXG4gIHNoaWZ0S2V5OiBudWxsLFxuICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGVcbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9XG4gKi9cbmZ1bmN0aW9uIFN5bnRoZXRpY1RvdWNoRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY1VJRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cblN5bnRoZXRpY1VJRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY1RvdWNoRXZlbnQsIFRvdWNoRXZlbnRJbnRlcmZhY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY1RvdWNoRXZlbnQ7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvU3ludGhldGljVG91Y2hFdmVudC5qc1xuLy8gbW9kdWxlIGlkID0gMzM2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 337 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar SyntheticEvent = __webpack_require__(226);\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/2009/WD-css3-transitions-20090320/#transition-events-\n * @see https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent\n */\nvar TransitionEventInterface = {\n  propertyName: null,\n  elapsedTime: null,\n  pseudoElement: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticEvent}\n */\nfunction SyntheticTransitionEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n  return SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticEvent.augmentClass(SyntheticTransitionEvent, TransitionEventInterface);\n\nmodule.exports = SyntheticTransitionEvent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzM3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY1RyYW5zaXRpb25FdmVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3ludGhldGljRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0V2ZW50Jyk7XG5cbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA5L1dELWNzczMtdHJhbnNpdGlvbnMtMjAwOTAzMjAvI3RyYW5zaXRpb24tZXZlbnRzLVxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVHJhbnNpdGlvbkV2ZW50XG4gKi9cbnZhciBUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSB7XG4gIHByb3BlcnR5TmFtZTogbnVsbCxcbiAgZWxhcHNlZFRpbWU6IG51bGwsXG4gIHBzZXVkb0VsZW1lbnQ6IG51bGxcbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY0V2ZW50fVxuICovXG5mdW5jdGlvbiBTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY0V2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljVHJhbnNpdGlvbkV2ZW50LCBUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQuanNcbi8vIG1vZHVsZSBpZCA9IDMzN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 338 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar SyntheticMouseEvent = __webpack_require__(247);\n\n/**\n * @interface WheelEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar WheelEventInterface = {\n  deltaX: function (event) {\n    return 'deltaX' in event ? event.deltaX :\n    // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive).\n    'wheelDeltaX' in event ? -event.wheelDeltaX : 0;\n  },\n  deltaY: function (event) {\n    return 'deltaY' in event ? event.deltaY :\n    // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive).\n    'wheelDeltaY' in event ? -event.wheelDeltaY :\n    // Fallback to `wheelDelta` for IE<9 and normalize (down is positive).\n    'wheelDelta' in event ? -event.wheelDelta : 0;\n  },\n  deltaZ: null,\n\n  // Browsers without \"deltaMode\" is reporting in raw wheel delta where one\n  // notch on the scroll is always +/- 120, roughly equivalent to pixels.\n  // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or\n  // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size.\n  deltaMode: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticMouseEvent}\n */\nfunction SyntheticWheelEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n  return SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticMouseEvent.augmentClass(SyntheticWheelEvent, WheelEventInterface);\n\nmodule.exports = SyntheticWheelEvent;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzM4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY1doZWVsRXZlbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY01vdXNlRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY01vdXNlRXZlbnQnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIFdoZWVsRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG52YXIgV2hlZWxFdmVudEludGVyZmFjZSA9IHtcbiAgZGVsdGFYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2RlbHRhWCcgaW4gZXZlbnQgPyBldmVudC5kZWx0YVggOlxuICAgIC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhWGAgZm9yIFdlYmtpdCBhbmQgbm9ybWFsaXplIChyaWdodCBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGFYJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhWCA6IDA7XG4gIH0sXG4gIGRlbHRhWTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdkZWx0YVknIGluIGV2ZW50ID8gZXZlbnQuZGVsdGFZIDpcbiAgICAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YVlgIGZvciBXZWJraXQgYW5kIG5vcm1hbGl6ZSAoZG93biBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGFZJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhWSA6XG4gICAgLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFgIGZvciBJRTw5IGFuZCBub3JtYWxpemUgKGRvd24gaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhIDogMDtcbiAgfSxcbiAgZGVsdGFaOiBudWxsLFxuXG4gIC8vIEJyb3dzZXJzIHdpdGhvdXQgXCJkZWx0YU1vZGVcIiBpcyByZXBvcnRpbmcgaW4gcmF3IHdoZWVsIGRlbHRhIHdoZXJlIG9uZVxuICAvLyBub3RjaCBvbiB0aGUgc2Nyb2xsIGlzIGFsd2F5cyArLy0gMTIwLCByb3VnaGx5IGVxdWl2YWxlbnQgdG8gcGl4ZWxzLlxuICAvLyBBIGdvb2QgYXBwcm94aW1hdGlvbiBvZiBET01fREVMVEFfTElORSAoMSkgaXMgNSUgb2Ygdmlld3BvcnQgc2l6ZSBvclxuICAvLyB+NDAgcGl4ZWxzLCBmb3IgRE9NX0RFTFRBX1NDUkVFTiAoMikgaXQgaXMgODcuNSUgb2Ygdmlld3BvcnQgc2l6ZS5cbiAgZGVsdGFNb2RlOiBudWxsXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEBleHRlbmRzIHtTeW50aGV0aWNNb3VzZUV2ZW50fVxuICovXG5mdW5jdGlvbiBTeW50aGV0aWNXaGVlbEV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBTeW50aGV0aWNNb3VzZUV2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNNb3VzZUV2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNXaGVlbEV2ZW50LCBXaGVlbEV2ZW50SW50ZXJmYWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNXaGVlbEV2ZW50O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL1N5bnRoZXRpY1doZWVsRXZlbnQuanNcbi8vIG1vZHVsZSBpZCA9IDMzOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 339 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nvar DOMLazyTree = __webpack_require__(254);\nvar DOMProperty = __webpack_require__(209);\nvar React = __webpack_require__(175);\nvar ReactBrowserEventEmitter = __webpack_require__(278);\nvar ReactCurrentOwner = __webpack_require__(182);\nvar ReactDOMComponentTree = __webpack_require__(207);\nvar ReactDOMContainerInfo = __webpack_require__(340);\nvar ReactDOMFeatureFlags = __webpack_require__(341);\nvar ReactFeatureFlags = __webpack_require__(231);\nvar ReactInstanceMap = __webpack_require__(289);\nvar ReactInstrumentation = __webpack_require__(235);\nvar ReactMarkupChecksum = __webpack_require__(342);\nvar ReactReconciler = __webpack_require__(232);\nvar ReactUpdateQueue = __webpack_require__(308);\nvar ReactUpdates = __webpack_require__(229);\n\nvar emptyObject = __webpack_require__(192);\nvar instantiateReactComponent = __webpack_require__(291);\nvar invariant = __webpack_require__(180);\nvar setInnerHTML = __webpack_require__(256);\nvar shouldUpdateReactComponent = __webpack_require__(297);\nvar warning = __webpack_require__(183);\n\nvar ATTR_NAME = DOMProperty.ID_ATTRIBUTE_NAME;\nvar ROOT_ATTR_NAME = DOMProperty.ROOT_ATTRIBUTE_NAME;\n\nvar ELEMENT_NODE_TYPE = 1;\nvar DOC_NODE_TYPE = 9;\nvar DOCUMENT_FRAGMENT_NODE_TYPE = 11;\n\nvar instancesByReactRootID = {};\n\n/**\n * Finds the index of the first character\n * that's not common between the two given strings.\n *\n * @return {number} the index of the character where the strings diverge\n */\nfunction firstDifferenceIndex(string1, string2) {\n  var minLen = Math.min(string1.length, string2.length);\n  for (var i = 0; i < minLen; i++) {\n    if (string1.charAt(i) !== string2.charAt(i)) {\n      return i;\n    }\n  }\n  return string1.length === string2.length ? -1 : minLen;\n}\n\n/**\n * @param {DOMElement|DOMDocument} container DOM element that may contain\n * a React component\n * @return {?*} DOM element that may have the reactRoot ID, or null.\n */\nfunction getReactRootElementInContainer(container) {\n  if (!container) {\n    return null;\n  }\n\n  if (container.nodeType === DOC_NODE_TYPE) {\n    return container.documentElement;\n  } else {\n    return container.firstChild;\n  }\n}\n\nfunction internalGetID(node) {\n  // If node is something like a window, document, or text node, none of\n  // which support attributes or a .getAttribute method, gracefully return\n  // the empty string, as if the attribute were missing.\n  return node.getAttribute && node.getAttribute(ATTR_NAME) || '';\n}\n\n/**\n * Mounts this component and inserts it into the DOM.\n *\n * @param {ReactComponent} componentInstance The instance to mount.\n * @param {DOMElement} container DOM element to mount into.\n * @param {ReactReconcileTransaction} transaction\n * @param {boolean} shouldReuseMarkup If true, do not insert markup\n */\nfunction mountComponentIntoNode(wrapperInstance, container, transaction, shouldReuseMarkup, context) {\n  var markerName;\n  if (ReactFeatureFlags.logTopLevelRenders) {\n    var wrappedElement = wrapperInstance._currentElement.props.child;\n    var type = wrappedElement.type;\n    markerName = 'React mount: ' + (typeof type === 'string' ? type : type.displayName || type.name);\n    console.time(markerName);\n  }\n\n  var markup = ReactReconciler.mountComponent(wrapperInstance, transaction, null, ReactDOMContainerInfo(wrapperInstance, container), context, 0 /* parentDebugID */\n  );\n\n  if (markerName) {\n    console.timeEnd(markerName);\n  }\n\n  wrapperInstance._renderedComponent._topLevelWrapper = wrapperInstance;\n  ReactMount._mountImageIntoNode(markup, container, wrapperInstance, shouldReuseMarkup, transaction);\n}\n\n/**\n * Batched mount.\n *\n * @param {ReactComponent} componentInstance The instance to mount.\n * @param {DOMElement} container DOM element to mount into.\n * @param {boolean} shouldReuseMarkup If true, do not insert markup\n */\nfunction batchedMountComponentIntoNode(componentInstance, container, shouldReuseMarkup, context) {\n  var transaction = ReactUpdates.ReactReconcileTransaction.getPooled(\n  /* useCreateElement */\n  !shouldReuseMarkup && ReactDOMFeatureFlags.useCreateElement);\n  transaction.perform(mountComponentIntoNode, null, componentInstance, container, transaction, shouldReuseMarkup, context);\n  ReactUpdates.ReactReconcileTransaction.release(transaction);\n}\n\n/**\n * Unmounts a component and removes it from the DOM.\n *\n * @param {ReactComponent} instance React component instance.\n * @param {DOMElement} container DOM element to unmount from.\n * @final\n * @internal\n * @see {ReactMount.unmountComponentAtNode}\n */\nfunction unmountComponentFromNode(instance, container, safely) {\n  if (true) {\n    ReactInstrumentation.debugTool.onBeginFlush();\n  }\n  ReactReconciler.unmountComponent(instance, safely);\n  if (true) {\n    ReactInstrumentation.debugTool.onEndFlush();\n  }\n\n  if (container.nodeType === DOC_NODE_TYPE) {\n    container = container.documentElement;\n  }\n\n  // http://jsperf.com/emptying-a-node\n  while (container.lastChild) {\n    container.removeChild(container.lastChild);\n  }\n}\n\n/**\n * True if the supplied DOM node has a direct React-rendered child that is\n * not a React root element. Useful for warning in `render`,\n * `unmountComponentAtNode`, etc.\n *\n * @param {?DOMElement} node The candidate DOM node.\n * @return {boolean} True if the DOM element contains a direct child that was\n * rendered by React but is not a root element.\n * @internal\n */\nfunction hasNonRootReactChild(container) {\n  var rootEl = getReactRootElementInContainer(container);\n  if (rootEl) {\n    var inst = ReactDOMComponentTree.getInstanceFromNode(rootEl);\n    return !!(inst && inst._hostParent);\n  }\n}\n\n/**\n * True if the supplied DOM node is a React DOM element and\n * it has been rendered by another copy of React.\n *\n * @param {?DOMElement} node The candidate DOM node.\n * @return {boolean} True if the DOM has been rendered by another copy of React\n * @internal\n */\nfunction nodeIsRenderedByOtherInstance(container) {\n  var rootEl = getReactRootElementInContainer(container);\n  return !!(rootEl && isReactNode(rootEl) && !ReactDOMComponentTree.getInstanceFromNode(rootEl));\n}\n\n/**\n * True if the supplied DOM node is a valid node element.\n *\n * @param {?DOMElement} node The candidate DOM node.\n * @return {boolean} True if the DOM is a valid DOM node.\n * @internal\n */\nfunction isValidContainer(node) {\n  return !!(node && (node.nodeType === ELEMENT_NODE_TYPE || node.nodeType === DOC_NODE_TYPE || node.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE));\n}\n\n/**\n * True if the supplied DOM node is a valid React node element.\n *\n * @param {?DOMElement} node The candidate DOM node.\n * @return {boolean} True if the DOM is a valid React DOM node.\n * @internal\n */\nfunction isReactNode(node) {\n  return isValidContainer(node) && (node.hasAttribute(ROOT_ATTR_NAME) || node.hasAttribute(ATTR_NAME));\n}\n\nfunction getHostRootInstanceInContainer(container) {\n  var rootEl = getReactRootElementInContainer(container);\n  var prevHostInstance = rootEl && ReactDOMComponentTree.getInstanceFromNode(rootEl);\n  return prevHostInstance && !prevHostInstance._hostParent ? prevHostInstance : null;\n}\n\nfunction getTopLevelWrapperInContainer(container) {\n  var root = getHostRootInstanceInContainer(container);\n  return root ? root._hostContainerInfo._topLevelWrapper : null;\n}\n\n/**\n * Temporary (?) hack so that we can store all top-level pending updates on\n * composites instead of having to worry about different types of components\n * here.\n */\nvar topLevelRootCounter = 1;\nvar TopLevelWrapper = function () {\n  this.rootID = topLevelRootCounter++;\n};\nTopLevelWrapper.prototype.isReactComponent = {};\nif (true) {\n  TopLevelWrapper.displayName = 'TopLevelWrapper';\n}\nTopLevelWrapper.prototype.render = function () {\n  return this.props.child;\n};\nTopLevelWrapper.isReactTopLevelWrapper = true;\n\n/**\n * Mounting is the process of initializing a React component by creating its\n * representative DOM elements and inserting them into a supplied `container`.\n * Any prior content inside `container` is destroyed in the process.\n *\n *   ReactMount.render(\n *     component,\n *     document.getElementById('container')\n *   );\n *\n *   <div id=\"container\">                   <-- Supplied `container`.\n *     <div data-reactid=\".3\">              <-- Rendered reactRoot of React\n *       // ...                                 component.\n *     </div>\n *   </div>\n *\n * Inside of `container`, the first element rendered is the \"reactRoot\".\n */\nvar ReactMount = {\n\n  TopLevelWrapper: TopLevelWrapper,\n\n  /**\n   * Used by devtools. The keys are not important.\n   */\n  _instancesByReactRootID: instancesByReactRootID,\n\n  /**\n   * This is a hook provided to support rendering React components while\n   * ensuring that the apparent scroll position of its `container` does not\n   * change.\n   *\n   * @param {DOMElement} container The `container` being rendered into.\n   * @param {function} renderCallback This must be called once to do the render.\n   */\n  scrollMonitor: function (container, renderCallback) {\n    renderCallback();\n  },\n\n  /**\n   * Take a component that's already mounted into the DOM and replace its props\n   * @param {ReactComponent} prevComponent component instance already in the DOM\n   * @param {ReactElement} nextElement component instance to render\n   * @param {DOMElement} container container to render into\n   * @param {?function} callback function triggered on completion\n   */\n  _updateRootComponent: function (prevComponent, nextElement, nextContext, container, callback) {\n    ReactMount.scrollMonitor(container, function () {\n      ReactUpdateQueue.enqueueElementInternal(prevComponent, nextElement, nextContext);\n      if (callback) {\n        ReactUpdateQueue.enqueueCallbackInternal(prevComponent, callback);\n      }\n    });\n\n    return prevComponent;\n  },\n\n  /**\n   * Render a new component into the DOM. Hooked by hooks!\n   *\n   * @param {ReactElement} nextElement element to render\n   * @param {DOMElement} container container to render into\n   * @param {boolean} shouldReuseMarkup if we should skip the markup insertion\n   * @return {ReactComponent} nextComponent\n   */\n  _renderNewRootComponent: function (nextElement, container, shouldReuseMarkup, context) {\n    // Various parts of our code (such as ReactCompositeComponent's\n    // _renderValidatedComponent) assume that calls to render aren't nested;\n    // verify that that's the case.\n     true ? warning(ReactCurrentOwner.current == null, '_renderNewRootComponent(): Render methods should be a pure function ' + 'of props and state; triggering nested component updates from ' + 'render is not allowed. If necessary, trigger nested updates in ' + 'componentDidUpdate. Check the render method of %s.', ReactCurrentOwner.current && ReactCurrentOwner.current.getName() || 'ReactCompositeComponent') : void 0;\n\n    !isValidContainer(container) ?  true ? invariant(false, '_registerComponent(...): Target container is not a DOM element.') : _prodInvariant('37') : void 0;\n\n    ReactBrowserEventEmitter.ensureScrollValueMonitoring();\n    var componentInstance = instantiateReactComponent(nextElement, false);\n\n    // The initial render is synchronous but any updates that happen during\n    // rendering, in componentWillMount or componentDidMount, will be batched\n    // according to the current batching strategy.\n\n    ReactUpdates.batchedUpdates(batchedMountComponentIntoNode, componentInstance, container, shouldReuseMarkup, context);\n\n    var wrapperID = componentInstance._instance.rootID;\n    instancesByReactRootID[wrapperID] = componentInstance;\n\n    return componentInstance;\n  },\n\n  /**\n   * Renders a React component into the DOM in the supplied `container`.\n   *\n   * If the React component was previously rendered into `container`, this will\n   * perform an update on it and only mutate the DOM as necessary to reflect the\n   * latest React component.\n   *\n   * @param {ReactComponent} parentComponent The conceptual parent of this render tree.\n   * @param {ReactElement} nextElement Component element to render.\n   * @param {DOMElement} container DOM element to render into.\n   * @param {?function} callback function triggered on completion\n   * @return {ReactComponent} Component instance rendered in `container`.\n   */\n  renderSubtreeIntoContainer: function (parentComponent, nextElement, container, callback) {\n    !(parentComponent != null && ReactInstanceMap.has(parentComponent)) ?  true ? invariant(false, 'parentComponent must be a valid React Component') : _prodInvariant('38') : void 0;\n    return ReactMount._renderSubtreeIntoContainer(parentComponent, nextElement, container, callback);\n  },\n\n  _renderSubtreeIntoContainer: function (parentComponent, nextElement, container, callback) {\n    ReactUpdateQueue.validateCallback(callback, 'ReactDOM.render');\n    !React.isValidElement(nextElement) ?  true ? invariant(false, 'ReactDOM.render(): Invalid component element.%s', typeof nextElement === 'string' ? ' Instead of passing a string like \\'div\\', pass ' + 'React.createElement(\\'div\\') or <div />.' : typeof nextElement === 'function' ? ' Instead of passing a class like Foo, pass ' + 'React.createElement(Foo) or <Foo />.' :\n    // Check if it quacks like an element\n    nextElement != null && nextElement.props !== undefined ? ' This may be caused by unintentionally loading two independent ' + 'copies of React.' : '') : _prodInvariant('39', typeof nextElement === 'string' ? ' Instead of passing a string like \\'div\\', pass ' + 'React.createElement(\\'div\\') or <div />.' : typeof nextElement === 'function' ? ' Instead of passing a class like Foo, pass ' + 'React.createElement(Foo) or <Foo />.' : nextElement != null && nextElement.props !== undefined ? ' This may be caused by unintentionally loading two independent ' + 'copies of React.' : '') : void 0;\n\n     true ? warning(!container || !container.tagName || container.tagName.toUpperCase() !== 'BODY', 'render(): Rendering components directly into document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try rendering into a container element created ' + 'for your app.') : void 0;\n\n    var nextWrappedElement = React.createElement(TopLevelWrapper, { child: nextElement });\n\n    var nextContext;\n    if (parentComponent) {\n      var parentInst = ReactInstanceMap.get(parentComponent);\n      nextContext = parentInst._processChildContext(parentInst._context);\n    } else {\n      nextContext = emptyObject;\n    }\n\n    var prevComponent = getTopLevelWrapperInContainer(container);\n\n    if (prevComponent) {\n      var prevWrappedElement = prevComponent._currentElement;\n      var prevElement = prevWrappedElement.props.child;\n      if (shouldUpdateReactComponent(prevElement, nextElement)) {\n        var publicInst = prevComponent._renderedComponent.getPublicInstance();\n        var updatedCallback = callback && function () {\n          callback.call(publicInst);\n        };\n        ReactMount._updateRootComponent(prevComponent, nextWrappedElement, nextContext, container, updatedCallback);\n        return publicInst;\n      } else {\n        ReactMount.unmountComponentAtNode(container);\n      }\n    }\n\n    var reactRootElement = getReactRootElementInContainer(container);\n    var containerHasReactMarkup = reactRootElement && !!internalGetID(reactRootElement);\n    var containerHasNonRootReactChild = hasNonRootReactChild(container);\n\n    if (true) {\n       true ? warning(!containerHasNonRootReactChild, 'render(...): Replacing React-rendered children with a new root ' + 'component. If you intended to update the children of this node, ' + 'you should instead have the existing children update their state ' + 'and render the new components instead of calling ReactDOM.render.') : void 0;\n\n      if (!containerHasReactMarkup || reactRootElement.nextSibling) {\n        var rootElementSibling = reactRootElement;\n        while (rootElementSibling) {\n          if (internalGetID(rootElementSibling)) {\n             true ? warning(false, 'render(): Target node has markup rendered by React, but there ' + 'are unrelated nodes as well. This is most commonly caused by ' + 'white-space inserted around server-rendered markup.') : void 0;\n            break;\n          }\n          rootElementSibling = rootElementSibling.nextSibling;\n        }\n      }\n    }\n\n    var shouldReuseMarkup = containerHasReactMarkup && !prevComponent && !containerHasNonRootReactChild;\n    var component = ReactMount._renderNewRootComponent(nextWrappedElement, container, shouldReuseMarkup, nextContext)._renderedComponent.getPublicInstance();\n    if (callback) {\n      callback.call(component);\n    }\n    return component;\n  },\n\n  /**\n   * Renders a React component into the DOM in the supplied `container`.\n   * See https://facebook.github.io/react/docs/top-level-api.html#reactdom.render\n   *\n   * If the React component was previously rendered into `container`, this will\n   * perform an update on it and only mutate the DOM as necessary to reflect the\n   * latest React component.\n   *\n   * @param {ReactElement} nextElement Component element to render.\n   * @param {DOMElement} container DOM element to render into.\n   * @param {?function} callback function triggered on completion\n   * @return {ReactComponent} Component instance rendered in `container`.\n   */\n  render: function (nextElement, container, callback) {\n    return ReactMount._renderSubtreeIntoContainer(null, nextElement, container, callback);\n  },\n\n  /**\n   * Unmounts and destroys the React component rendered in the `container`.\n   * See https://facebook.github.io/react/docs/top-level-api.html#reactdom.unmountcomponentatnode\n   *\n   * @param {DOMElement} container DOM element containing a React component.\n   * @return {boolean} True if a component was found in and unmounted from\n   *                   `container`\n   */\n  unmountComponentAtNode: function (container) {\n    // Various parts of our code (such as ReactCompositeComponent's\n    // _renderValidatedComponent) assume that calls to render aren't nested;\n    // verify that that's the case. (Strictly speaking, unmounting won't cause a\n    // render but we still don't expect to be in a render call here.)\n     true ? warning(ReactCurrentOwner.current == null, 'unmountComponentAtNode(): Render methods should be a pure function ' + 'of props and state; triggering nested component updates from render ' + 'is not allowed. If necessary, trigger nested updates in ' + 'componentDidUpdate. Check the render method of %s.', ReactCurrentOwner.current && ReactCurrentOwner.current.getName() || 'ReactCompositeComponent') : void 0;\n\n    !isValidContainer(container) ?  true ? invariant(false, 'unmountComponentAtNode(...): Target container is not a DOM element.') : _prodInvariant('40') : void 0;\n\n    if (true) {\n       true ? warning(!nodeIsRenderedByOtherInstance(container), 'unmountComponentAtNode(): The node you\\'re attempting to unmount ' + 'was rendered by another copy of React.') : void 0;\n    }\n\n    var prevComponent = getTopLevelWrapperInContainer(container);\n    if (!prevComponent) {\n      // Check if the node being unmounted was rendered by React, but isn't a\n      // root node.\n      var containerHasNonRootReactChild = hasNonRootReactChild(container);\n\n      // Check if the container itself is a React root node.\n      var isContainerReactRoot = container.nodeType === 1 && container.hasAttribute(ROOT_ATTR_NAME);\n\n      if (true) {\n         true ? warning(!containerHasNonRootReactChild, 'unmountComponentAtNode(): The node you\\'re attempting to unmount ' + 'was rendered by React and is not a top-level container. %s', isContainerReactRoot ? 'You may have accidentally passed in a React root node instead ' + 'of its container.' : 'Instead, have the parent component update its state and ' + 'rerender in order to remove this component.') : void 0;\n      }\n\n      return false;\n    }\n    delete instancesByReactRootID[prevComponent._instance.rootID];\n    ReactUpdates.batchedUpdates(unmountComponentFromNode, prevComponent, container, false);\n    return true;\n  },\n\n  _mountImageIntoNode: function (markup, container, instance, shouldReuseMarkup, transaction) {\n    !isValidContainer(container) ?  true ? invariant(false, 'mountComponentIntoNode(...): Target container is not valid.') : _prodInvariant('41') : void 0;\n\n    if (shouldReuseMarkup) {\n      var rootElement = getReactRootElementInContainer(container);\n      if (ReactMarkupChecksum.canReuseMarkup(markup, rootElement)) {\n        ReactDOMComponentTree.precacheNode(instance, rootElement);\n        return;\n      } else {\n        var checksum = rootElement.getAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME);\n        rootElement.removeAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME);\n\n        var rootMarkup = rootElement.outerHTML;\n        rootElement.setAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME, checksum);\n\n        var normalizedMarkup = markup;\n        if (true) {\n          // because rootMarkup is retrieved from the DOM, various normalizations\n          // will have occurred which will not be present in `markup`. Here,\n          // insert markup into a <div> or <iframe> depending on the container\n          // type to perform the same normalizations before comparing.\n          var normalizer;\n          if (container.nodeType === ELEMENT_NODE_TYPE) {\n            normalizer = document.createElement('div');\n            normalizer.innerHTML = markup;\n            normalizedMarkup = normalizer.innerHTML;\n          } else {\n            normalizer = document.createElement('iframe');\n            document.body.appendChild(normalizer);\n            normalizer.contentDocument.write(markup);\n            normalizedMarkup = normalizer.contentDocument.documentElement.outerHTML;\n            document.body.removeChild(normalizer);\n          }\n        }\n\n        var diffIndex = firstDifferenceIndex(normalizedMarkup, rootMarkup);\n        var difference = ' (client) ' + normalizedMarkup.substring(diffIndex - 20, diffIndex + 20) + '\\n (server) ' + rootMarkup.substring(diffIndex - 20, diffIndex + 20);\n\n        !(container.nodeType !== DOC_NODE_TYPE) ?  true ? invariant(false, 'You\\'re trying to render a component to the document using server rendering but the checksum was invalid. This usually means you rendered a different component type or props on the client from the one on the server, or your render() methods are impure. React cannot handle this case due to cross-browser quirks by rendering at the document root. You should look for environment dependent code in your components and ensure the props are the same client and server side:\\n%s', difference) : _prodInvariant('42', difference) : void 0;\n\n        if (true) {\n           true ? warning(false, 'React attempted to reuse markup in a container but the ' + 'checksum was invalid. This generally means that you are ' + 'using server rendering and the markup generated on the ' + 'server was not what the client was expecting. React injected ' + 'new markup to compensate which works but you have lost many ' + 'of the benefits of server rendering. Instead, figure out ' + 'why the markup being generated is different on the client ' + 'or server:\\n%s', difference) : void 0;\n        }\n      }\n    }\n\n    !(container.nodeType !== DOC_NODE_TYPE) ?  true ? invariant(false, 'You\\'re trying to render a component to the document but you didn\\'t use server rendering. We can\\'t do this without using server rendering due to cross-browser quirks. See ReactDOMServer.renderToString() for server rendering.') : _prodInvariant('43') : void 0;\n\n    if (transaction.useCreateElement) {\n      while (container.lastChild) {\n        container.removeChild(container.lastChild);\n      }\n      DOMLazyTree.insertTreeBefore(container, markup, null);\n    } else {\n      setInnerHTML(container, markup);\n      ReactDOMComponentTree.precacheNode(instance, container.firstChild);\n    }\n\n    if (true) {\n      var hostNode = ReactDOMComponentTree.getInstanceFromNode(container.firstChild);\n      if (hostNode._debugID !== 0) {\n        ReactInstrumentation.debugTool.onHostOperation({\n          instanceID: hostNode._debugID,\n          type: 'mount',\n          payload: markup.toString()\n        });\n      }\n    }\n  }\n};\n\nmodule.exports = ReactMount;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzM5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0TW91bnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIERPTUxhenlUcmVlID0gcmVxdWlyZSgnLi9ET01MYXp5VHJlZScpO1xudmFyIERPTVByb3BlcnR5ID0gcmVxdWlyZSgnLi9ET01Qcm9wZXJ0eScpO1xudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Jyk7XG52YXIgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnLi9SZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXInKTtcbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdEN1cnJlbnRPd25lcicpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RET01Db250YWluZXJJbmZvID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbnRhaW5lckluZm8nKTtcbnZhciBSZWFjdERPTUZlYXR1cmVGbGFncyA9IHJlcXVpcmUoJy4vUmVhY3RET01GZWF0dXJlRmxhZ3MnKTtcbnZhciBSZWFjdEZlYXR1cmVGbGFncyA9IHJlcXVpcmUoJy4vUmVhY3RGZWF0dXJlRmxhZ3MnKTtcbnZhciBSZWFjdEluc3RhbmNlTWFwID0gcmVxdWlyZSgnLi9SZWFjdEluc3RhbmNlTWFwJyk7XG52YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSByZXF1aXJlKCcuL1JlYWN0SW5zdHJ1bWVudGF0aW9uJyk7XG52YXIgUmVhY3RNYXJrdXBDaGVja3N1bSA9IHJlcXVpcmUoJy4vUmVhY3RNYXJrdXBDaGVja3N1bScpO1xudmFyIFJlYWN0UmVjb25jaWxlciA9IHJlcXVpcmUoJy4vUmVhY3RSZWNvbmNpbGVyJyk7XG52YXIgUmVhY3RVcGRhdGVRdWV1ZSA9IHJlcXVpcmUoJy4vUmVhY3RVcGRhdGVRdWV1ZScpO1xudmFyIFJlYWN0VXBkYXRlcyA9IHJlcXVpcmUoJy4vUmVhY3RVcGRhdGVzJyk7XG5cbnZhciBlbXB0eU9iamVjdCA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5T2JqZWN0Jyk7XG52YXIgaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudCA9IHJlcXVpcmUoJy4vaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudCcpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHNldElubmVySFRNTCA9IHJlcXVpcmUoJy4vc2V0SW5uZXJIVE1MJyk7XG52YXIgc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQgPSByZXF1aXJlKCcuL3Nob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIEFUVFJfTkFNRSA9IERPTVByb3BlcnR5LklEX0FUVFJJQlVURV9OQU1FO1xudmFyIFJPT1RfQVRUUl9OQU1FID0gRE9NUHJvcGVydHkuUk9PVF9BVFRSSUJVVEVfTkFNRTtcblxudmFyIEVMRU1FTlRfTk9ERV9UWVBFID0gMTtcbnZhciBET0NfTk9ERV9UWVBFID0gOTtcbnZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFX1RZUEUgPSAxMTtcblxudmFyIGluc3RhbmNlc0J5UmVhY3RSb290SUQgPSB7fTtcblxuLyoqXG4gKiBGaW5kcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlclxuICogdGhhdCdzIG5vdCBjb21tb24gYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHN0cmluZ3MuXG4gKlxuICogQHJldHVybiB7bnVtYmVyfSB0aGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciB3aGVyZSB0aGUgc3RyaW5ncyBkaXZlcmdlXG4gKi9cbmZ1bmN0aW9uIGZpcnN0RGlmZmVyZW5jZUluZGV4KHN0cmluZzEsIHN0cmluZzIpIHtcbiAgdmFyIG1pbkxlbiA9IE1hdGgubWluKHN0cmluZzEubGVuZ3RoLCBzdHJpbmcyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbWluTGVuOyBpKyspIHtcbiAgICBpZiAoc3RyaW5nMS5jaGFyQXQoaSkgIT09IHN0cmluZzIuY2hhckF0KGkpKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cmluZzEubGVuZ3RoID09PSBzdHJpbmcyLmxlbmd0aCA/IC0xIDogbWluTGVuO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01Eb2N1bWVudH0gY29udGFpbmVyIERPTSBlbGVtZW50IHRoYXQgbWF5IGNvbnRhaW5cbiAqIGEgUmVhY3QgY29tcG9uZW50XG4gKiBAcmV0dXJuIHs/Kn0gRE9NIGVsZW1lbnQgdGhhdCBtYXkgaGF2ZSB0aGUgcmVhY3RSb290IElELCBvciBudWxsLlxuICovXG5mdW5jdGlvbiBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKSB7XG4gIGlmICghY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBET0NfTk9ERV9UWVBFKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5kb2N1bWVudEVsZW1lbnQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5maXJzdENoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludGVybmFsR2V0SUQobm9kZSkge1xuICAvLyBJZiBub2RlIGlzIHNvbWV0aGluZyBsaWtlIGEgd2luZG93LCBkb2N1bWVudCwgb3IgdGV4dCBub2RlLCBub25lIG9mXG4gIC8vIHdoaWNoIHN1cHBvcnQgYXR0cmlidXRlcyBvciBhIC5nZXRBdHRyaWJ1dGUgbWV0aG9kLCBncmFjZWZ1bGx5IHJldHVyblxuICAvLyB0aGUgZW1wdHkgc3RyaW5nLCBhcyBpZiB0aGUgYXR0cmlidXRlIHdlcmUgbWlzc2luZy5cbiAgcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSkgfHwgJyc7XG59XG5cbi8qKlxuICogTW91bnRzIHRoaXMgY29tcG9uZW50IGFuZCBpbnNlcnRzIGl0IGludG8gdGhlIERPTS5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjb21wb25lbnRJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdG8gbW91bnQuXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciBET00gZWxlbWVudCB0byBtb3VudCBpbnRvLlxuICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICogQHBhcmFtIHtib29sZWFufSBzaG91bGRSZXVzZU1hcmt1cCBJZiB0cnVlLCBkbyBub3QgaW5zZXJ0IG1hcmt1cFxuICovXG5mdW5jdGlvbiBtb3VudENvbXBvbmVudEludG9Ob2RlKHdyYXBwZXJJbnN0YW5jZSwgY29udGFpbmVyLCB0cmFuc2FjdGlvbiwgc2hvdWxkUmV1c2VNYXJrdXAsIGNvbnRleHQpIHtcbiAgdmFyIG1hcmtlck5hbWU7XG4gIGlmIChSZWFjdEZlYXR1cmVGbGFncy5sb2dUb3BMZXZlbFJlbmRlcnMpIHtcbiAgICB2YXIgd3JhcHBlZEVsZW1lbnQgPSB3cmFwcGVySW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50LnByb3BzLmNoaWxkO1xuICAgIHZhciB0eXBlID0gd3JhcHBlZEVsZW1lbnQudHlwZTtcbiAgICBtYXJrZXJOYW1lID0gJ1JlYWN0IG1vdW50OiAnICsgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyA/IHR5cGUgOiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSk7XG4gICAgY29uc29sZS50aW1lKG1hcmtlck5hbWUpO1xuICB9XG5cbiAgdmFyIG1hcmt1cCA9IFJlYWN0UmVjb25jaWxlci5tb3VudENvbXBvbmVudCh3cmFwcGVySW5zdGFuY2UsIHRyYW5zYWN0aW9uLCBudWxsLCBSZWFjdERPTUNvbnRhaW5lckluZm8od3JhcHBlckluc3RhbmNlLCBjb250YWluZXIpLCBjb250ZXh0LCAwIC8qIHBhcmVudERlYnVnSUQgKi9cbiAgKTtcblxuICBpZiAobWFya2VyTmFtZSkge1xuICAgIGNvbnNvbGUudGltZUVuZChtYXJrZXJOYW1lKTtcbiAgfVxuXG4gIHdyYXBwZXJJbnN0YW5jZS5fcmVuZGVyZWRDb21wb25lbnQuX3RvcExldmVsV3JhcHBlciA9IHdyYXBwZXJJbnN0YW5jZTtcbiAgUmVhY3RNb3VudC5fbW91bnRJbWFnZUludG9Ob2RlKG1hcmt1cCwgY29udGFpbmVyLCB3cmFwcGVySW5zdGFuY2UsIHNob3VsZFJldXNlTWFya3VwLCB0cmFuc2FjdGlvbik7XG59XG5cbi8qKlxuICogQmF0Y2hlZCBtb3VudC5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjb21wb25lbnRJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdG8gbW91bnQuXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciBET00gZWxlbWVudCB0byBtb3VudCBpbnRvLlxuICogQHBhcmFtIHtib29sZWFufSBzaG91bGRSZXVzZU1hcmt1cCBJZiB0cnVlLCBkbyBub3QgaW5zZXJ0IG1hcmt1cFxuICovXG5mdW5jdGlvbiBiYXRjaGVkTW91bnRDb21wb25lbnRJbnRvTm9kZShjb21wb25lbnRJbnN0YW5jZSwgY29udGFpbmVyLCBzaG91bGRSZXVzZU1hcmt1cCwgY29udGV4dCkge1xuICB2YXIgdHJhbnNhY3Rpb24gPSBSZWFjdFVwZGF0ZXMuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5nZXRQb29sZWQoXG4gIC8qIHVzZUNyZWF0ZUVsZW1lbnQgKi9cbiAgIXNob3VsZFJldXNlTWFya3VwICYmIFJlYWN0RE9NRmVhdHVyZUZsYWdzLnVzZUNyZWF0ZUVsZW1lbnQpO1xuICB0cmFuc2FjdGlvbi5wZXJmb3JtKG1vdW50Q29tcG9uZW50SW50b05vZGUsIG51bGwsIGNvbXBvbmVudEluc3RhbmNlLCBjb250YWluZXIsIHRyYW5zYWN0aW9uLCBzaG91bGRSZXVzZU1hcmt1cCwgY29udGV4dCk7XG4gIFJlYWN0VXBkYXRlcy5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uLnJlbGVhc2UodHJhbnNhY3Rpb24pO1xufVxuXG4vKipcbiAqIFVubW91bnRzIGEgY29tcG9uZW50IGFuZCByZW1vdmVzIGl0IGZyb20gdGhlIERPTS5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBpbnN0YW5jZSBSZWFjdCBjb21wb25lbnQgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciBET00gZWxlbWVudCB0byB1bm1vdW50IGZyb20uXG4gKiBAZmluYWxcbiAqIEBpbnRlcm5hbFxuICogQHNlZSB7UmVhY3RNb3VudC51bm1vdW50Q29tcG9uZW50QXROb2RlfVxuICovXG5mdW5jdGlvbiB1bm1vdW50Q29tcG9uZW50RnJvbU5vZGUoaW5zdGFuY2UsIGNvbnRhaW5lciwgc2FmZWx5KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVnaW5GbHVzaCgpO1xuICB9XG4gIFJlYWN0UmVjb25jaWxlci51bm1vdW50Q29tcG9uZW50KGluc3RhbmNlLCBzYWZlbHkpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkVuZEZsdXNoKCk7XG4gIH1cblxuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBET0NfTk9ERV9UWVBFKSB7XG4gICAgY29udGFpbmVyID0gY29udGFpbmVyLmRvY3VtZW50RWxlbWVudDtcbiAgfVxuXG4gIC8vIGh0dHA6Ly9qc3BlcmYuY29tL2VtcHR5aW5nLWEtbm9kZVxuICB3aGlsZSAoY29udGFpbmVyLmxhc3RDaGlsZCkge1xuICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjb250YWluZXIubGFzdENoaWxkKTtcbiAgfVxufVxuXG4vKipcbiAqIFRydWUgaWYgdGhlIHN1cHBsaWVkIERPTSBub2RlIGhhcyBhIGRpcmVjdCBSZWFjdC1yZW5kZXJlZCBjaGlsZCB0aGF0IGlzXG4gKiBub3QgYSBSZWFjdCByb290IGVsZW1lbnQuIFVzZWZ1bCBmb3Igd2FybmluZyBpbiBgcmVuZGVyYCxcbiAqIGB1bm1vdW50Q29tcG9uZW50QXROb2RlYCwgZXRjLlxuICpcbiAqIEBwYXJhbSB7P0RPTUVsZW1lbnR9IG5vZGUgVGhlIGNhbmRpZGF0ZSBET00gbm9kZS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIERPTSBlbGVtZW50IGNvbnRhaW5zIGEgZGlyZWN0IGNoaWxkIHRoYXQgd2FzXG4gKiByZW5kZXJlZCBieSBSZWFjdCBidXQgaXMgbm90IGEgcm9vdCBlbGVtZW50LlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGhhc05vblJvb3RSZWFjdENoaWxkKGNvbnRhaW5lcikge1xuICB2YXIgcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gIGlmIChyb290RWwpIHtcbiAgICB2YXIgaW5zdCA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKHJvb3RFbCk7XG4gICAgcmV0dXJuICEhKGluc3QgJiYgaW5zdC5faG9zdFBhcmVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUcnVlIGlmIHRoZSBzdXBwbGllZCBET00gbm9kZSBpcyBhIFJlYWN0IERPTSBlbGVtZW50IGFuZFxuICogaXQgaGFzIGJlZW4gcmVuZGVyZWQgYnkgYW5vdGhlciBjb3B5IG9mIFJlYWN0LlxuICpcbiAqIEBwYXJhbSB7P0RPTUVsZW1lbnR9IG5vZGUgVGhlIGNhbmRpZGF0ZSBET00gbm9kZS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIERPTSBoYXMgYmVlbiByZW5kZXJlZCBieSBhbm90aGVyIGNvcHkgb2YgUmVhY3RcbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBub2RlSXNSZW5kZXJlZEJ5T3RoZXJJbnN0YW5jZShjb250YWluZXIpIHtcbiAgdmFyIHJvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICByZXR1cm4gISEocm9vdEVsICYmIGlzUmVhY3ROb2RlKHJvb3RFbCkgJiYgIVJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKHJvb3RFbCkpO1xufVxuXG4vKipcbiAqIFRydWUgaWYgdGhlIHN1cHBsaWVkIERPTSBub2RlIGlzIGEgdmFsaWQgbm9kZSBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7P0RPTUVsZW1lbnR9IG5vZGUgVGhlIGNhbmRpZGF0ZSBET00gbm9kZS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIERPTSBpcyBhIHZhbGlkIERPTSBub2RlLlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRDb250YWluZXIobm9kZSkge1xuICByZXR1cm4gISEobm9kZSAmJiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFX1RZUEUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DX05PREVfVFlQRSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFX1RZUEUpKTtcbn1cblxuLyoqXG4gKiBUcnVlIGlmIHRoZSBzdXBwbGllZCBET00gbm9kZSBpcyBhIHZhbGlkIFJlYWN0IG5vZGUgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0gez9ET01FbGVtZW50fSBub2RlIFRoZSBjYW5kaWRhdGUgRE9NIG5vZGUuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBET00gaXMgYSB2YWxpZCBSZWFjdCBET00gbm9kZS5cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBpc1JlYWN0Tm9kZShub2RlKSB7XG4gIHJldHVybiBpc1ZhbGlkQ29udGFpbmVyKG5vZGUpICYmIChub2RlLmhhc0F0dHJpYnV0ZShST09UX0FUVFJfTkFNRSkgfHwgbm9kZS5oYXNBdHRyaWJ1dGUoQVRUUl9OQU1FKSk7XG59XG5cbmZ1bmN0aW9uIGdldEhvc3RSb290SW5zdGFuY2VJbkNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgdmFyIHJvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICB2YXIgcHJldkhvc3RJbnN0YW5jZSA9IHJvb3RFbCAmJiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShyb290RWwpO1xuICByZXR1cm4gcHJldkhvc3RJbnN0YW5jZSAmJiAhcHJldkhvc3RJbnN0YW5jZS5faG9zdFBhcmVudCA/IHByZXZIb3N0SW5zdGFuY2UgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRUb3BMZXZlbFdyYXBwZXJJbkNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgdmFyIHJvb3QgPSBnZXRIb3N0Um9vdEluc3RhbmNlSW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgcmV0dXJuIHJvb3QgPyByb290Ll9ob3N0Q29udGFpbmVySW5mby5fdG9wTGV2ZWxXcmFwcGVyIDogbnVsbDtcbn1cblxuLyoqXG4gKiBUZW1wb3JhcnkgKD8pIGhhY2sgc28gdGhhdCB3ZSBjYW4gc3RvcmUgYWxsIHRvcC1sZXZlbCBwZW5kaW5nIHVwZGF0ZXMgb25cbiAqIGNvbXBvc2l0ZXMgaW5zdGVhZCBvZiBoYXZpbmcgdG8gd29ycnkgYWJvdXQgZGlmZmVyZW50IHR5cGVzIG9mIGNvbXBvbmVudHNcbiAqIGhlcmUuXG4gKi9cbnZhciB0b3BMZXZlbFJvb3RDb3VudGVyID0gMTtcbnZhciBUb3BMZXZlbFdyYXBwZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMucm9vdElEID0gdG9wTGV2ZWxSb290Q291bnRlcisrO1xufTtcblRvcExldmVsV3JhcHBlci5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCA9IHt9O1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgVG9wTGV2ZWxXcmFwcGVyLmRpc3BsYXlOYW1lID0gJ1RvcExldmVsV3JhcHBlcic7XG59XG5Ub3BMZXZlbFdyYXBwZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGQ7XG59O1xuVG9wTGV2ZWxXcmFwcGVyLmlzUmVhY3RUb3BMZXZlbFdyYXBwZXIgPSB0cnVlO1xuXG4vKipcbiAqIE1vdW50aW5nIGlzIHRoZSBwcm9jZXNzIG9mIGluaXRpYWxpemluZyBhIFJlYWN0IGNvbXBvbmVudCBieSBjcmVhdGluZyBpdHNcbiAqIHJlcHJlc2VudGF0aXZlIERPTSBlbGVtZW50cyBhbmQgaW5zZXJ0aW5nIHRoZW0gaW50byBhIHN1cHBsaWVkIGBjb250YWluZXJgLlxuICogQW55IHByaW9yIGNvbnRlbnQgaW5zaWRlIGBjb250YWluZXJgIGlzIGRlc3Ryb3llZCBpbiB0aGUgcHJvY2Vzcy5cbiAqXG4gKiAgIFJlYWN0TW91bnQucmVuZGVyKFxuICogICAgIGNvbXBvbmVudCxcbiAqICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyJylcbiAqICAgKTtcbiAqXG4gKiAgIDxkaXYgaWQ9XCJjb250YWluZXJcIj4gICAgICAgICAgICAgICAgICAgPC0tIFN1cHBsaWVkIGBjb250YWluZXJgLlxuICogICAgIDxkaXYgZGF0YS1yZWFjdGlkPVwiLjNcIj4gICAgICAgICAgICAgIDwtLSBSZW5kZXJlZCByZWFjdFJvb3Qgb2YgUmVhY3RcbiAqICAgICAgIC8vIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5cbiAqICAgICA8L2Rpdj5cbiAqICAgPC9kaXY+XG4gKlxuICogSW5zaWRlIG9mIGBjb250YWluZXJgLCB0aGUgZmlyc3QgZWxlbWVudCByZW5kZXJlZCBpcyB0aGUgXCJyZWFjdFJvb3RcIi5cbiAqL1xudmFyIFJlYWN0TW91bnQgPSB7XG5cbiAgVG9wTGV2ZWxXcmFwcGVyOiBUb3BMZXZlbFdyYXBwZXIsXG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgZGV2dG9vbHMuIFRoZSBrZXlzIGFyZSBub3QgaW1wb3J0YW50LlxuICAgKi9cbiAgX2luc3RhbmNlc0J5UmVhY3RSb290SUQ6IGluc3RhbmNlc0J5UmVhY3RSb290SUQsXG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYSBob29rIHByb3ZpZGVkIHRvIHN1cHBvcnQgcmVuZGVyaW5nIFJlYWN0IGNvbXBvbmVudHMgd2hpbGVcbiAgICogZW5zdXJpbmcgdGhhdCB0aGUgYXBwYXJlbnQgc2Nyb2xsIHBvc2l0aW9uIG9mIGl0cyBgY29udGFpbmVyYCBkb2VzIG5vdFxuICAgKiBjaGFuZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIFRoZSBgY29udGFpbmVyYCBiZWluZyByZW5kZXJlZCBpbnRvLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSByZW5kZXJDYWxsYmFjayBUaGlzIG11c3QgYmUgY2FsbGVkIG9uY2UgdG8gZG8gdGhlIHJlbmRlci5cbiAgICovXG4gIHNjcm9sbE1vbml0b3I6IGZ1bmN0aW9uIChjb250YWluZXIsIHJlbmRlckNhbGxiYWNrKSB7XG4gICAgcmVuZGVyQ2FsbGJhY2soKTtcbiAgfSxcblxuICAvKipcbiAgICogVGFrZSBhIGNvbXBvbmVudCB0aGF0J3MgYWxyZWFkeSBtb3VudGVkIGludG8gdGhlIERPTSBhbmQgcmVwbGFjZSBpdHMgcHJvcHNcbiAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gcHJldkNvbXBvbmVudCBjb21wb25lbnQgaW5zdGFuY2UgYWxyZWFkeSBpbiB0aGUgRE9NXG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0RWxlbWVudCBjb21wb25lbnQgaW5zdGFuY2UgdG8gcmVuZGVyXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIGNvbnRhaW5lciB0byByZW5kZXIgaW50b1xuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24gdHJpZ2dlcmVkIG9uIGNvbXBsZXRpb25cbiAgICovXG4gIF91cGRhdGVSb290Q29tcG9uZW50OiBmdW5jdGlvbiAocHJldkNvbXBvbmVudCwgbmV4dEVsZW1lbnQsIG5leHRDb250ZXh0LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gICAgUmVhY3RNb3VudC5zY3JvbGxNb25pdG9yKGNvbnRhaW5lciwgZnVuY3Rpb24gKCkge1xuICAgICAgUmVhY3RVcGRhdGVRdWV1ZS5lbnF1ZXVlRWxlbWVudEludGVybmFsKHByZXZDb21wb25lbnQsIG5leHRFbGVtZW50LCBuZXh0Q29udGV4dCk7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgUmVhY3RVcGRhdGVRdWV1ZS5lbnF1ZXVlQ2FsbGJhY2tJbnRlcm5hbChwcmV2Q29tcG9uZW50LCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHJldkNvbXBvbmVudDtcbiAgfSxcblxuICAvKipcbiAgICogUmVuZGVyIGEgbmV3IGNvbXBvbmVudCBpbnRvIHRoZSBET00uIEhvb2tlZCBieSBob29rcyFcbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IG5leHRFbGVtZW50IGVsZW1lbnQgdG8gcmVuZGVyXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIGNvbnRhaW5lciB0byByZW5kZXIgaW50b1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZFJldXNlTWFya3VwIGlmIHdlIHNob3VsZCBza2lwIHRoZSBtYXJrdXAgaW5zZXJ0aW9uXG4gICAqIEByZXR1cm4ge1JlYWN0Q29tcG9uZW50fSBuZXh0Q29tcG9uZW50XG4gICAqL1xuICBfcmVuZGVyTmV3Um9vdENvbXBvbmVudDogZnVuY3Rpb24gKG5leHRFbGVtZW50LCBjb250YWluZXIsIHNob3VsZFJldXNlTWFya3VwLCBjb250ZXh0KSB7XG4gICAgLy8gVmFyaW91cyBwYXJ0cyBvZiBvdXIgY29kZSAoc3VjaCBhcyBSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCdzXG4gICAgLy8gX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudCkgYXNzdW1lIHRoYXQgY2FsbHMgdG8gcmVuZGVyIGFyZW4ndCBuZXN0ZWQ7XG4gICAgLy8gdmVyaWZ5IHRoYXQgdGhhdCdzIHRoZSBjYXNlLlxuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgPT0gbnVsbCwgJ19yZW5kZXJOZXdSb290Q29tcG9uZW50KCk6IFJlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gJyArICdvZiBwcm9wcyBhbmQgc3RhdGU7IHRyaWdnZXJpbmcgbmVzdGVkIGNvbXBvbmVudCB1cGRhdGVzIGZyb20gJyArICdyZW5kZXIgaXMgbm90IGFsbG93ZWQuIElmIG5lY2Vzc2FyeSwgdHJpZ2dlciBuZXN0ZWQgdXBkYXRlcyBpbiAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgJXMuJywgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IHZvaWQgMDtcblxuICAgICFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnX3JlZ2lzdGVyQ29tcG9uZW50KC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJykgOiBfcHJvZEludmFyaWFudCgnMzcnKSA6IHZvaWQgMDtcblxuICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5lbnN1cmVTY3JvbGxWYWx1ZU1vbml0b3JpbmcoKTtcbiAgICB2YXIgY29tcG9uZW50SW5zdGFuY2UgPSBpbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KG5leHRFbGVtZW50LCBmYWxzZSk7XG5cbiAgICAvLyBUaGUgaW5pdGlhbCByZW5kZXIgaXMgc3luY2hyb25vdXMgYnV0IGFueSB1cGRhdGVzIHRoYXQgaGFwcGVuIGR1cmluZ1xuICAgIC8vIHJlbmRlcmluZywgaW4gY29tcG9uZW50V2lsbE1vdW50IG9yIGNvbXBvbmVudERpZE1vdW50LCB3aWxsIGJlIGJhdGNoZWRcbiAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgYmF0Y2hpbmcgc3RyYXRlZ3kuXG5cbiAgICBSZWFjdFVwZGF0ZXMuYmF0Y2hlZFVwZGF0ZXMoYmF0Y2hlZE1vdW50Q29tcG9uZW50SW50b05vZGUsIGNvbXBvbmVudEluc3RhbmNlLCBjb250YWluZXIsIHNob3VsZFJldXNlTWFya3VwLCBjb250ZXh0KTtcblxuICAgIHZhciB3cmFwcGVySUQgPSBjb21wb25lbnRJbnN0YW5jZS5faW5zdGFuY2Uucm9vdElEO1xuICAgIGluc3RhbmNlc0J5UmVhY3RSb290SURbd3JhcHBlcklEXSA9IGNvbXBvbmVudEluc3RhbmNlO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudEluc3RhbmNlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGEgUmVhY3QgY29tcG9uZW50IGludG8gdGhlIERPTSBpbiB0aGUgc3VwcGxpZWQgYGNvbnRhaW5lcmAuXG4gICAqXG4gICAqIElmIHRoZSBSZWFjdCBjb21wb25lbnQgd2FzIHByZXZpb3VzbHkgcmVuZGVyZWQgaW50byBgY29udGFpbmVyYCwgdGhpcyB3aWxsXG4gICAqIHBlcmZvcm0gYW4gdXBkYXRlIG9uIGl0IGFuZCBvbmx5IG11dGF0ZSB0aGUgRE9NIGFzIG5lY2Vzc2FyeSB0byByZWZsZWN0IHRoZVxuICAgKiBsYXRlc3QgUmVhY3QgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBwYXJlbnRDb21wb25lbnQgVGhlIGNvbmNlcHR1YWwgcGFyZW50IG9mIHRoaXMgcmVuZGVyIHRyZWUuXG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0RWxlbWVudCBDb21wb25lbnQgZWxlbWVudCB0byByZW5kZXIuXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIERPTSBlbGVtZW50IHRvIHJlbmRlciBpbnRvLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24gdHJpZ2dlcmVkIG9uIGNvbXBsZXRpb25cbiAgICogQHJldHVybiB7UmVhY3RDb21wb25lbnR9IENvbXBvbmVudCBpbnN0YW5jZSByZW5kZXJlZCBpbiBgY29udGFpbmVyYC5cbiAgICovXG4gIHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyOiBmdW5jdGlvbiAocGFyZW50Q29tcG9uZW50LCBuZXh0RWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICAgICEocGFyZW50Q29tcG9uZW50ICE9IG51bGwgJiYgUmVhY3RJbnN0YW5jZU1hcC5oYXMocGFyZW50Q29tcG9uZW50KSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAncGFyZW50Q29tcG9uZW50IG11c3QgYmUgYSB2YWxpZCBSZWFjdCBDb21wb25lbnQnKSA6IF9wcm9kSW52YXJpYW50KCczOCcpIDogdm9pZCAwO1xuICAgIHJldHVybiBSZWFjdE1vdW50Ll9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIG5leHRFbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKTtcbiAgfSxcblxuICBfcmVuZGVyU3VidHJlZUludG9Db250YWluZXI6IGZ1bmN0aW9uIChwYXJlbnRDb21wb25lbnQsIG5leHRFbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gICAgUmVhY3RVcGRhdGVRdWV1ZS52YWxpZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCAnUmVhY3RET00ucmVuZGVyJyk7XG4gICAgIVJlYWN0LmlzVmFsaWRFbGVtZW50KG5leHRFbGVtZW50KSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdERPTS5yZW5kZXIoKTogSW52YWxpZCBjb21wb25lbnQgZWxlbWVudC4lcycsIHR5cGVvZiBuZXh0RWxlbWVudCA9PT0gJ3N0cmluZycgPyAnIEluc3RlYWQgb2YgcGFzc2luZyBhIHN0cmluZyBsaWtlIFxcJ2RpdlxcJywgcGFzcyAnICsgJ1JlYWN0LmNyZWF0ZUVsZW1lbnQoXFwnZGl2XFwnKSBvciA8ZGl2IC8+LicgOiB0eXBlb2YgbmV4dEVsZW1lbnQgPT09ICdmdW5jdGlvbicgPyAnIEluc3RlYWQgb2YgcGFzc2luZyBhIGNsYXNzIGxpa2UgRm9vLCBwYXNzICcgKyAnUmVhY3QuY3JlYXRlRWxlbWVudChGb28pIG9yIDxGb28gLz4uJyA6XG4gICAgLy8gQ2hlY2sgaWYgaXQgcXVhY2tzIGxpa2UgYW4gZWxlbWVudFxuICAgIG5leHRFbGVtZW50ICE9IG51bGwgJiYgbmV4dEVsZW1lbnQucHJvcHMgIT09IHVuZGVmaW5lZCA/ICcgVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IHVuaW50ZW50aW9uYWxseSBsb2FkaW5nIHR3byBpbmRlcGVuZGVudCAnICsgJ2NvcGllcyBvZiBSZWFjdC4nIDogJycpIDogX3Byb2RJbnZhcmlhbnQoJzM5JywgdHlwZW9mIG5leHRFbGVtZW50ID09PSAnc3RyaW5nJyA/ICcgSW5zdGVhZCBvZiBwYXNzaW5nIGEgc3RyaW5nIGxpa2UgXFwnZGl2XFwnLCBwYXNzICcgKyAnUmVhY3QuY3JlYXRlRWxlbWVudChcXCdkaXZcXCcpIG9yIDxkaXYgLz4uJyA6IHR5cGVvZiBuZXh0RWxlbWVudCA9PT0gJ2Z1bmN0aW9uJyA/ICcgSW5zdGVhZCBvZiBwYXNzaW5nIGEgY2xhc3MgbGlrZSBGb28sIHBhc3MgJyArICdSZWFjdC5jcmVhdGVFbGVtZW50KEZvbykgb3IgPEZvbyAvPi4nIDogbmV4dEVsZW1lbnQgIT0gbnVsbCAmJiBuZXh0RWxlbWVudC5wcm9wcyAhPT0gdW5kZWZpbmVkID8gJyBUaGlzIG1heSBiZSBjYXVzZWQgYnkgdW5pbnRlbnRpb25hbGx5IGxvYWRpbmcgdHdvIGluZGVwZW5kZW50ICcgKyAnY29waWVzIG9mIFJlYWN0LicgOiAnJykgOiB2b2lkIDA7XG5cbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghY29udGFpbmVyIHx8ICFjb250YWluZXIudGFnTmFtZSB8fCBjb250YWluZXIudGFnTmFtZS50b1VwcGVyQ2FzZSgpICE9PSAnQk9EWScsICdyZW5kZXIoKTogUmVuZGVyaW5nIGNvbXBvbmVudHMgZGlyZWN0bHkgaW50byBkb2N1bWVudC5ib2R5IGlzICcgKyAnZGlzY291cmFnZWQsIHNpbmNlIGl0cyBjaGlsZHJlbiBhcmUgb2Z0ZW4gbWFuaXB1bGF0ZWQgYnkgdGhpcmQtcGFydHkgJyArICdzY3JpcHRzIGFuZCBicm93c2VyIGV4dGVuc2lvbnMuIFRoaXMgbWF5IGxlYWQgdG8gc3VidGxlICcgKyAncmVjb25jaWxpYXRpb24gaXNzdWVzLiBUcnkgcmVuZGVyaW5nIGludG8gYSBjb250YWluZXIgZWxlbWVudCBjcmVhdGVkICcgKyAnZm9yIHlvdXIgYXBwLicpIDogdm9pZCAwO1xuXG4gICAgdmFyIG5leHRXcmFwcGVkRWxlbWVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9wTGV2ZWxXcmFwcGVyLCB7IGNoaWxkOiBuZXh0RWxlbWVudCB9KTtcblxuICAgIHZhciBuZXh0Q29udGV4dDtcbiAgICBpZiAocGFyZW50Q29tcG9uZW50KSB7XG4gICAgICB2YXIgcGFyZW50SW5zdCA9IFJlYWN0SW5zdGFuY2VNYXAuZ2V0KHBhcmVudENvbXBvbmVudCk7XG4gICAgICBuZXh0Q29udGV4dCA9IHBhcmVudEluc3QuX3Byb2Nlc3NDaGlsZENvbnRleHQocGFyZW50SW5zdC5fY29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRDb250ZXh0ID0gZW1wdHlPYmplY3Q7XG4gICAgfVxuXG4gICAgdmFyIHByZXZDb21wb25lbnQgPSBnZXRUb3BMZXZlbFdyYXBwZXJJbkNvbnRhaW5lcihjb250YWluZXIpO1xuXG4gICAgaWYgKHByZXZDb21wb25lbnQpIHtcbiAgICAgIHZhciBwcmV2V3JhcHBlZEVsZW1lbnQgPSBwcmV2Q29tcG9uZW50Ll9jdXJyZW50RWxlbWVudDtcbiAgICAgIHZhciBwcmV2RWxlbWVudCA9IHByZXZXcmFwcGVkRWxlbWVudC5wcm9wcy5jaGlsZDtcbiAgICAgIGlmIChzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudChwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQpKSB7XG4gICAgICAgIHZhciBwdWJsaWNJbnN0ID0gcHJldkNvbXBvbmVudC5fcmVuZGVyZWRDb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKTtcbiAgICAgICAgdmFyIHVwZGF0ZWRDYWxsYmFjayA9IGNhbGxiYWNrICYmIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjYWxsYmFjay5jYWxsKHB1YmxpY0luc3QpO1xuICAgICAgICB9O1xuICAgICAgICBSZWFjdE1vdW50Ll91cGRhdGVSb290Q29tcG9uZW50KHByZXZDb21wb25lbnQsIG5leHRXcmFwcGVkRWxlbWVudCwgbmV4dENvbnRleHQsIGNvbnRhaW5lciwgdXBkYXRlZENhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuIHB1YmxpY0luc3Q7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBSZWFjdE1vdW50LnVubW91bnRDb21wb25lbnRBdE5vZGUoY29udGFpbmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcmVhY3RSb290RWxlbWVudCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICAgIHZhciBjb250YWluZXJIYXNSZWFjdE1hcmt1cCA9IHJlYWN0Um9vdEVsZW1lbnQgJiYgISFpbnRlcm5hbEdldElEKHJlYWN0Um9vdEVsZW1lbnQpO1xuICAgIHZhciBjb250YWluZXJIYXNOb25Sb290UmVhY3RDaGlsZCA9IGhhc05vblJvb3RSZWFjdENoaWxkKGNvbnRhaW5lcik7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWNvbnRhaW5lckhhc05vblJvb3RSZWFjdENoaWxkLCAncmVuZGVyKC4uLik6IFJlcGxhY2luZyBSZWFjdC1yZW5kZXJlZCBjaGlsZHJlbiB3aXRoIGEgbmV3IHJvb3QgJyArICdjb21wb25lbnQuIElmIHlvdSBpbnRlbmRlZCB0byB1cGRhdGUgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSwgJyArICd5b3Ugc2hvdWxkIGluc3RlYWQgaGF2ZSB0aGUgZXhpc3RpbmcgY2hpbGRyZW4gdXBkYXRlIHRoZWlyIHN0YXRlICcgKyAnYW5kIHJlbmRlciB0aGUgbmV3IGNvbXBvbmVudHMgaW5zdGVhZCBvZiBjYWxsaW5nIFJlYWN0RE9NLnJlbmRlci4nKSA6IHZvaWQgMDtcblxuICAgICAgaWYgKCFjb250YWluZXJIYXNSZWFjdE1hcmt1cCB8fCByZWFjdFJvb3RFbGVtZW50Lm5leHRTaWJsaW5nKSB7XG4gICAgICAgIHZhciByb290RWxlbWVudFNpYmxpbmcgPSByZWFjdFJvb3RFbGVtZW50O1xuICAgICAgICB3aGlsZSAocm9vdEVsZW1lbnRTaWJsaW5nKSB7XG4gICAgICAgICAgaWYgKGludGVybmFsR2V0SUQocm9vdEVsZW1lbnRTaWJsaW5nKSkge1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdyZW5kZXIoKTogVGFyZ2V0IG5vZGUgaGFzIG1hcmt1cCByZW5kZXJlZCBieSBSZWFjdCwgYnV0IHRoZXJlICcgKyAnYXJlIHVucmVsYXRlZCBub2RlcyBhcyB3ZWxsLiBUaGlzIGlzIG1vc3QgY29tbW9ubHkgY2F1c2VkIGJ5ICcgKyAnd2hpdGUtc3BhY2UgaW5zZXJ0ZWQgYXJvdW5kIHNlcnZlci1yZW5kZXJlZCBtYXJrdXAuJykgOiB2b2lkIDA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcm9vdEVsZW1lbnRTaWJsaW5nID0gcm9vdEVsZW1lbnRTaWJsaW5nLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNob3VsZFJldXNlTWFya3VwID0gY29udGFpbmVySGFzUmVhY3RNYXJrdXAgJiYgIXByZXZDb21wb25lbnQgJiYgIWNvbnRhaW5lckhhc05vblJvb3RSZWFjdENoaWxkO1xuICAgIHZhciBjb21wb25lbnQgPSBSZWFjdE1vdW50Ll9yZW5kZXJOZXdSb290Q29tcG9uZW50KG5leHRXcmFwcGVkRWxlbWVudCwgY29udGFpbmVyLCBzaG91bGRSZXVzZU1hcmt1cCwgbmV4dENvbnRleHQpLl9yZW5kZXJlZENvbXBvbmVudC5nZXRQdWJsaWNJbnN0YW5jZSgpO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2suY2FsbChjb21wb25lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGEgUmVhY3QgY29tcG9uZW50IGludG8gdGhlIERPTSBpbiB0aGUgc3VwcGxpZWQgYGNvbnRhaW5lcmAuXG4gICAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdGRvbS5yZW5kZXJcbiAgICpcbiAgICogSWYgdGhlIFJlYWN0IGNvbXBvbmVudCB3YXMgcHJldmlvdXNseSByZW5kZXJlZCBpbnRvIGBjb250YWluZXJgLCB0aGlzIHdpbGxcbiAgICogcGVyZm9ybSBhbiB1cGRhdGUgb24gaXQgYW5kIG9ubHkgbXV0YXRlIHRoZSBET00gYXMgbmVjZXNzYXJ5IHRvIHJlZmxlY3QgdGhlXG4gICAqIGxhdGVzdCBSZWFjdCBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0RWxlbWVudCBDb21wb25lbnQgZWxlbWVudCB0byByZW5kZXIuXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIERPTSBlbGVtZW50IHRvIHJlbmRlciBpbnRvLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24gdHJpZ2dlcmVkIG9uIGNvbXBsZXRpb25cbiAgICogQHJldHVybiB7UmVhY3RDb21wb25lbnR9IENvbXBvbmVudCBpbnN0YW5jZSByZW5kZXJlZCBpbiBgY29udGFpbmVyYC5cbiAgICovXG4gIHJlbmRlcjogZnVuY3Rpb24gKG5leHRFbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIFJlYWN0TW91bnQuX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKG51bGwsIG5leHRFbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKTtcbiAgfSxcblxuICAvKipcbiAgICogVW5tb3VudHMgYW5kIGRlc3Ryb3lzIHRoZSBSZWFjdCBjb21wb25lbnQgcmVuZGVyZWQgaW4gdGhlIGBjb250YWluZXJgLlxuICAgKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3Rkb20udW5tb3VudGNvbXBvbmVudGF0bm9kZVxuICAgKlxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciBET00gZWxlbWVudCBjb250YWluaW5nIGEgUmVhY3QgY29tcG9uZW50LlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGEgY29tcG9uZW50IHdhcyBmb3VuZCBpbiBhbmQgdW5tb3VudGVkIGZyb21cbiAgICogICAgICAgICAgICAgICAgICAgYGNvbnRhaW5lcmBcbiAgICovXG4gIHVubW91bnRDb21wb25lbnRBdE5vZGU6IGZ1bmN0aW9uIChjb250YWluZXIpIHtcbiAgICAvLyBWYXJpb3VzIHBhcnRzIG9mIG91ciBjb2RlIChzdWNoIGFzIFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50J3NcbiAgICAvLyBfcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50KSBhc3N1bWUgdGhhdCBjYWxscyB0byByZW5kZXIgYXJlbid0IG5lc3RlZDtcbiAgICAvLyB2ZXJpZnkgdGhhdCB0aGF0J3MgdGhlIGNhc2UuIChTdHJpY3RseSBzcGVha2luZywgdW5tb3VudGluZyB3b24ndCBjYXVzZSBhXG4gICAgLy8gcmVuZGVyIGJ1dCB3ZSBzdGlsbCBkb24ndCBleHBlY3QgdG8gYmUgaW4gYSByZW5kZXIgY2FsbCBoZXJlLilcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID09IG51bGwsICd1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFJlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gJyArICdvZiBwcm9wcyBhbmQgc3RhdGU7IHRyaWdnZXJpbmcgbmVzdGVkIGNvbXBvbmVudCB1cGRhdGVzIGZyb20gcmVuZGVyICcgKyAnaXMgbm90IGFsbG93ZWQuIElmIG5lY2Vzc2FyeSwgdHJpZ2dlciBuZXN0ZWQgdXBkYXRlcyBpbiAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgJXMuJywgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IHZvaWQgMDtcblxuICAgICFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndW5tb3VudENvbXBvbmVudEF0Tm9kZSguLi4pOiBUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzQwJykgOiB2b2lkIDA7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIW5vZGVJc1JlbmRlcmVkQnlPdGhlckluc3RhbmNlKGNvbnRhaW5lciksICd1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFRoZSBub2RlIHlvdVxcJ3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCAnICsgJ3dhcyByZW5kZXJlZCBieSBhbm90aGVyIGNvcHkgb2YgUmVhY3QuJykgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgdmFyIHByZXZDb21wb25lbnQgPSBnZXRUb3BMZXZlbFdyYXBwZXJJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICAgIGlmICghcHJldkNvbXBvbmVudCkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIG5vZGUgYmVpbmcgdW5tb3VudGVkIHdhcyByZW5kZXJlZCBieSBSZWFjdCwgYnV0IGlzbid0IGFcbiAgICAgIC8vIHJvb3Qgbm9kZS5cbiAgICAgIHZhciBjb250YWluZXJIYXNOb25Sb290UmVhY3RDaGlsZCA9IGhhc05vblJvb3RSZWFjdENoaWxkKGNvbnRhaW5lcik7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgaXRzZWxmIGlzIGEgUmVhY3Qgcm9vdCBub2RlLlxuICAgICAgdmFyIGlzQ29udGFpbmVyUmVhY3RSb290ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSAxICYmIGNvbnRhaW5lci5oYXNBdHRyaWJ1dGUoUk9PVF9BVFRSX05BTUUpO1xuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghY29udGFpbmVySGFzTm9uUm9vdFJlYWN0Q2hpbGQsICd1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFRoZSBub2RlIHlvdVxcJ3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCAnICsgJ3dhcyByZW5kZXJlZCBieSBSZWFjdCBhbmQgaXMgbm90IGEgdG9wLWxldmVsIGNvbnRhaW5lci4gJXMnLCBpc0NvbnRhaW5lclJlYWN0Um9vdCA/ICdZb3UgbWF5IGhhdmUgYWNjaWRlbnRhbGx5IHBhc3NlZCBpbiBhIFJlYWN0IHJvb3Qgbm9kZSBpbnN0ZWFkICcgKyAnb2YgaXRzIGNvbnRhaW5lci4nIDogJ0luc3RlYWQsIGhhdmUgdGhlIHBhcmVudCBjb21wb25lbnQgdXBkYXRlIGl0cyBzdGF0ZSBhbmQgJyArICdyZXJlbmRlciBpbiBvcmRlciB0byByZW1vdmUgdGhpcyBjb21wb25lbnQuJykgOiB2b2lkIDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZGVsZXRlIGluc3RhbmNlc0J5UmVhY3RSb290SURbcHJldkNvbXBvbmVudC5faW5zdGFuY2Uucm9vdElEXTtcbiAgICBSZWFjdFVwZGF0ZXMuYmF0Y2hlZFVwZGF0ZXModW5tb3VudENvbXBvbmVudEZyb21Ob2RlLCBwcmV2Q29tcG9uZW50LCBjb250YWluZXIsIGZhbHNlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcblxuICBfbW91bnRJbWFnZUludG9Ob2RlOiBmdW5jdGlvbiAobWFya3VwLCBjb250YWluZXIsIGluc3RhbmNlLCBzaG91bGRSZXVzZU1hcmt1cCwgdHJhbnNhY3Rpb24pIHtcbiAgICAhaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ21vdW50Q29tcG9uZW50SW50b05vZGUoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgdmFsaWQuJykgOiBfcHJvZEludmFyaWFudCgnNDEnKSA6IHZvaWQgMDtcblxuICAgIGlmIChzaG91bGRSZXVzZU1hcmt1cCkge1xuICAgICAgdmFyIHJvb3RFbGVtZW50ID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gICAgICBpZiAoUmVhY3RNYXJrdXBDaGVja3N1bS5jYW5SZXVzZU1hcmt1cChtYXJrdXAsIHJvb3RFbGVtZW50KSkge1xuICAgICAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUucHJlY2FjaGVOb2RlKGluc3RhbmNlLCByb290RWxlbWVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBjaGVja3N1bSA9IHJvb3RFbGVtZW50LmdldEF0dHJpYnV0ZShSZWFjdE1hcmt1cENoZWNrc3VtLkNIRUNLU1VNX0FUVFJfTkFNRSk7XG4gICAgICAgIHJvb3RFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShSZWFjdE1hcmt1cENoZWNrc3VtLkNIRUNLU1VNX0FUVFJfTkFNRSk7XG5cbiAgICAgICAgdmFyIHJvb3RNYXJrdXAgPSByb290RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZShSZWFjdE1hcmt1cENoZWNrc3VtLkNIRUNLU1VNX0FUVFJfTkFNRSwgY2hlY2tzdW0pO1xuXG4gICAgICAgIHZhciBub3JtYWxpemVkTWFya3VwID0gbWFya3VwO1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIC8vIGJlY2F1c2Ugcm9vdE1hcmt1cCBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgRE9NLCB2YXJpb3VzIG5vcm1hbGl6YXRpb25zXG4gICAgICAgICAgLy8gd2lsbCBoYXZlIG9jY3VycmVkIHdoaWNoIHdpbGwgbm90IGJlIHByZXNlbnQgaW4gYG1hcmt1cGAuIEhlcmUsXG4gICAgICAgICAgLy8gaW5zZXJ0IG1hcmt1cCBpbnRvIGEgPGRpdj4gb3IgPGlmcmFtZT4gZGVwZW5kaW5nIG9uIHRoZSBjb250YWluZXJcbiAgICAgICAgICAvLyB0eXBlIHRvIHBlcmZvcm0gdGhlIHNhbWUgbm9ybWFsaXphdGlvbnMgYmVmb3JlIGNvbXBhcmluZy5cbiAgICAgICAgICB2YXIgbm9ybWFsaXplcjtcbiAgICAgICAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREVfVFlQRSkge1xuICAgICAgICAgICAgbm9ybWFsaXplciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgbm9ybWFsaXplci5pbm5lckhUTUwgPSBtYXJrdXA7XG4gICAgICAgICAgICBub3JtYWxpemVkTWFya3VwID0gbm9ybWFsaXplci5pbm5lckhUTUw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vcm1hbGl6ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobm9ybWFsaXplcik7XG4gICAgICAgICAgICBub3JtYWxpemVyLmNvbnRlbnREb2N1bWVudC53cml0ZShtYXJrdXApO1xuICAgICAgICAgICAgbm9ybWFsaXplZE1hcmt1cCA9IG5vcm1hbGl6ZXIuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKG5vcm1hbGl6ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkaWZmSW5kZXggPSBmaXJzdERpZmZlcmVuY2VJbmRleChub3JtYWxpemVkTWFya3VwLCByb290TWFya3VwKTtcbiAgICAgICAgdmFyIGRpZmZlcmVuY2UgPSAnIChjbGllbnQpICcgKyBub3JtYWxpemVkTWFya3VwLnN1YnN0cmluZyhkaWZmSW5kZXggLSAyMCwgZGlmZkluZGV4ICsgMjApICsgJ1xcbiAoc2VydmVyKSAnICsgcm9vdE1hcmt1cC5zdWJzdHJpbmcoZGlmZkluZGV4IC0gMjAsIGRpZmZJbmRleCArIDIwKTtcblxuICAgICAgICAhKGNvbnRhaW5lci5ub2RlVHlwZSAhPT0gRE9DX05PREVfVFlQRSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnWW91XFwncmUgdHJ5aW5nIHRvIHJlbmRlciBhIGNvbXBvbmVudCB0byB0aGUgZG9jdW1lbnQgdXNpbmcgc2VydmVyIHJlbmRlcmluZyBidXQgdGhlIGNoZWNrc3VtIHdhcyBpbnZhbGlkLiBUaGlzIHVzdWFsbHkgbWVhbnMgeW91IHJlbmRlcmVkIGEgZGlmZmVyZW50IGNvbXBvbmVudCB0eXBlIG9yIHByb3BzIG9uIHRoZSBjbGllbnQgZnJvbSB0aGUgb25lIG9uIHRoZSBzZXJ2ZXIsIG9yIHlvdXIgcmVuZGVyKCkgbWV0aG9kcyBhcmUgaW1wdXJlLiBSZWFjdCBjYW5ub3QgaGFuZGxlIHRoaXMgY2FzZSBkdWUgdG8gY3Jvc3MtYnJvd3NlciBxdWlya3MgYnkgcmVuZGVyaW5nIGF0IHRoZSBkb2N1bWVudCByb290LiBZb3Ugc2hvdWxkIGxvb2sgZm9yIGVudmlyb25tZW50IGRlcGVuZGVudCBjb2RlIGluIHlvdXIgY29tcG9uZW50cyBhbmQgZW5zdXJlIHRoZSBwcm9wcyBhcmUgdGhlIHNhbWUgY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZTpcXG4lcycsIGRpZmZlcmVuY2UpIDogX3Byb2RJbnZhcmlhbnQoJzQyJywgZGlmZmVyZW5jZSkgOiB2b2lkIDA7XG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1JlYWN0IGF0dGVtcHRlZCB0byByZXVzZSBtYXJrdXAgaW4gYSBjb250YWluZXIgYnV0IHRoZSAnICsgJ2NoZWNrc3VtIHdhcyBpbnZhbGlkLiBUaGlzIGdlbmVyYWxseSBtZWFucyB0aGF0IHlvdSBhcmUgJyArICd1c2luZyBzZXJ2ZXIgcmVuZGVyaW5nIGFuZCB0aGUgbWFya3VwIGdlbmVyYXRlZCBvbiB0aGUgJyArICdzZXJ2ZXIgd2FzIG5vdCB3aGF0IHRoZSBjbGllbnQgd2FzIGV4cGVjdGluZy4gUmVhY3QgaW5qZWN0ZWQgJyArICduZXcgbWFya3VwIHRvIGNvbXBlbnNhdGUgd2hpY2ggd29ya3MgYnV0IHlvdSBoYXZlIGxvc3QgbWFueSAnICsgJ29mIHRoZSBiZW5lZml0cyBvZiBzZXJ2ZXIgcmVuZGVyaW5nLiBJbnN0ZWFkLCBmaWd1cmUgb3V0ICcgKyAnd2h5IHRoZSBtYXJrdXAgYmVpbmcgZ2VuZXJhdGVkIGlzIGRpZmZlcmVudCBvbiB0aGUgY2xpZW50ICcgKyAnb3Igc2VydmVyOlxcbiVzJywgZGlmZmVyZW5jZSkgOiB2b2lkIDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAhKGNvbnRhaW5lci5ub2RlVHlwZSAhPT0gRE9DX05PREVfVFlQRSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnWW91XFwncmUgdHJ5aW5nIHRvIHJlbmRlciBhIGNvbXBvbmVudCB0byB0aGUgZG9jdW1lbnQgYnV0IHlvdSBkaWRuXFwndCB1c2Ugc2VydmVyIHJlbmRlcmluZy4gV2UgY2FuXFwndCBkbyB0aGlzIHdpdGhvdXQgdXNpbmcgc2VydmVyIHJlbmRlcmluZyBkdWUgdG8gY3Jvc3MtYnJvd3NlciBxdWlya3MuIFNlZSBSZWFjdERPTVNlcnZlci5yZW5kZXJUb1N0cmluZygpIGZvciBzZXJ2ZXIgcmVuZGVyaW5nLicpIDogX3Byb2RJbnZhcmlhbnQoJzQzJykgOiB2b2lkIDA7XG5cbiAgICBpZiAodHJhbnNhY3Rpb24udXNlQ3JlYXRlRWxlbWVudCkge1xuICAgICAgd2hpbGUgKGNvbnRhaW5lci5sYXN0Q2hpbGQpIHtcbiAgICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGNvbnRhaW5lci5sYXN0Q2hpbGQpO1xuICAgICAgfVxuICAgICAgRE9NTGF6eVRyZWUuaW5zZXJ0VHJlZUJlZm9yZShjb250YWluZXIsIG1hcmt1cCwgbnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldElubmVySFRNTChjb250YWluZXIsIG1hcmt1cCk7XG4gICAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUucHJlY2FjaGVOb2RlKGluc3RhbmNlLCBjb250YWluZXIuZmlyc3RDaGlsZCk7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBob3N0Tm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKGNvbnRhaW5lci5maXJzdENoaWxkKTtcbiAgICAgIGlmIChob3N0Tm9kZS5fZGVidWdJRCAhPT0gMCkge1xuICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgICAgICBpbnN0YW5jZUlEOiBob3N0Tm9kZS5fZGVidWdJRCxcbiAgICAgICAgICB0eXBlOiAnbW91bnQnLFxuICAgICAgICAgIHBheWxvYWQ6IG1hcmt1cC50b1N0cmluZygpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdE1vdW50O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0TW91bnQuanNcbi8vIG1vZHVsZSBpZCA9IDMzOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 340 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar validateDOMNesting = __webpack_require__(309);\n\nvar DOC_NODE_TYPE = 9;\n\nfunction ReactDOMContainerInfo(topLevelWrapper, node) {\n  var info = {\n    _topLevelWrapper: topLevelWrapper,\n    _idCounter: 1,\n    _ownerDocument: node ? node.nodeType === DOC_NODE_TYPE ? node : node.ownerDocument : null,\n    _node: node,\n    _tag: node ? node.nodeName.toLowerCase() : null,\n    _namespaceURI: node ? node.namespaceURI : null\n  };\n  if (true) {\n    info._ancestorInfo = node ? validateDOMNesting.updatedAncestorInfo(null, info._tag, null) : null;\n  }\n  return info;\n}\n\nmodule.exports = ReactDOMContainerInfo;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NQ29udGFpbmVySW5mby5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgdmFsaWRhdGVET01OZXN0aW5nID0gcmVxdWlyZSgnLi92YWxpZGF0ZURPTU5lc3RpbmcnKTtcblxudmFyIERPQ19OT0RFX1RZUEUgPSA5O1xuXG5mdW5jdGlvbiBSZWFjdERPTUNvbnRhaW5lckluZm8odG9wTGV2ZWxXcmFwcGVyLCBub2RlKSB7XG4gIHZhciBpbmZvID0ge1xuICAgIF90b3BMZXZlbFdyYXBwZXI6IHRvcExldmVsV3JhcHBlcixcbiAgICBfaWRDb3VudGVyOiAxLFxuICAgIF9vd25lckRvY3VtZW50OiBub2RlID8gbm9kZS5ub2RlVHlwZSA9PT0gRE9DX05PREVfVFlQRSA/IG5vZGUgOiBub2RlLm93bmVyRG9jdW1lbnQgOiBudWxsLFxuICAgIF9ub2RlOiBub2RlLFxuICAgIF90YWc6IG5vZGUgPyBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgOiBudWxsLFxuICAgIF9uYW1lc3BhY2VVUkk6IG5vZGUgPyBub2RlLm5hbWVzcGFjZVVSSSA6IG51bGxcbiAgfTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpbmZvLl9hbmNlc3RvckluZm8gPSBub2RlID8gdmFsaWRhdGVET01OZXN0aW5nLnVwZGF0ZWRBbmNlc3RvckluZm8obnVsbCwgaW5mby5fdGFnLCBudWxsKSA6IG51bGw7XG4gIH1cbiAgcmV0dXJuIGluZm87XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01Db250YWluZXJJbmZvO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0RE9NQ29udGFpbmVySW5mby5qc1xuLy8gbW9kdWxlIGlkID0gMzQwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 341 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar ReactDOMFeatureFlags = {\n  useCreateElement: true,\n  useFiber: false\n};\n\nmodule.exports = ReactDOMFeatureFlags;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NRmVhdHVyZUZsYWdzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdERPTUZlYXR1cmVGbGFncyA9IHtcbiAgdXNlQ3JlYXRlRWxlbWVudDogdHJ1ZSxcbiAgdXNlRmliZXI6IGZhbHNlXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NRmVhdHVyZUZsYWdzO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0RE9NRmVhdHVyZUZsYWdzLmpzXG4vLyBtb2R1bGUgaWQgPSAzNDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 342 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar adler32 = __webpack_require__(343);\n\nvar TAG_END = /\\/?>/;\nvar COMMENT_START = /^<\\!\\-\\-/;\n\nvar ReactMarkupChecksum = {\n  CHECKSUM_ATTR_NAME: 'data-react-checksum',\n\n  /**\n   * @param {string} markup Markup string\n   * @return {string} Markup string with checksum attribute attached\n   */\n  addChecksumToMarkup: function (markup) {\n    var checksum = adler32(markup);\n\n    // Add checksum (handle both parent tags, comments and self-closing tags)\n    if (COMMENT_START.test(markup)) {\n      return markup;\n    } else {\n      return markup.replace(TAG_END, ' ' + ReactMarkupChecksum.CHECKSUM_ATTR_NAME + '=\"' + checksum + '\"$&');\n    }\n  },\n\n  /**\n   * @param {string} markup to use\n   * @param {DOMElement} element root React element\n   * @returns {boolean} whether or not the markup is the same\n   */\n  canReuseMarkup: function (markup, element) {\n    var existingChecksum = element.getAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME);\n    existingChecksum = existingChecksum && parseInt(existingChecksum, 10);\n    var markupChecksum = adler32(markup);\n    return markupChecksum === existingChecksum;\n  }\n};\n\nmodule.exports = ReactMarkupChecksum;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0TWFya3VwQ2hlY2tzdW0uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGFkbGVyMzIgPSByZXF1aXJlKCcuL2FkbGVyMzInKTtcblxudmFyIFRBR19FTkQgPSAvXFwvPz4vO1xudmFyIENPTU1FTlRfU1RBUlQgPSAvXjxcXCFcXC1cXC0vO1xuXG52YXIgUmVhY3RNYXJrdXBDaGVja3N1bSA9IHtcbiAgQ0hFQ0tTVU1fQVRUUl9OQU1FOiAnZGF0YS1yZWFjdC1jaGVja3N1bScsXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrdXAgTWFya3VwIHN0cmluZ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9IE1hcmt1cCBzdHJpbmcgd2l0aCBjaGVja3N1bSBhdHRyaWJ1dGUgYXR0YWNoZWRcbiAgICovXG4gIGFkZENoZWNrc3VtVG9NYXJrdXA6IGZ1bmN0aW9uIChtYXJrdXApIHtcbiAgICB2YXIgY2hlY2tzdW0gPSBhZGxlcjMyKG1hcmt1cCk7XG5cbiAgICAvLyBBZGQgY2hlY2tzdW0gKGhhbmRsZSBib3RoIHBhcmVudCB0YWdzLCBjb21tZW50cyBhbmQgc2VsZi1jbG9zaW5nIHRhZ3MpXG4gICAgaWYgKENPTU1FTlRfU1RBUlQudGVzdChtYXJrdXApKSB7XG4gICAgICByZXR1cm4gbWFya3VwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbWFya3VwLnJlcGxhY2UoVEFHX0VORCwgJyAnICsgUmVhY3RNYXJrdXBDaGVja3N1bS5DSEVDS1NVTV9BVFRSX05BTUUgKyAnPVwiJyArIGNoZWNrc3VtICsgJ1wiJCYnKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrdXAgdG8gdXNlXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gZWxlbWVudCByb290IFJlYWN0IGVsZW1lbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgb3Igbm90IHRoZSBtYXJrdXAgaXMgdGhlIHNhbWVcbiAgICovXG4gIGNhblJldXNlTWFya3VwOiBmdW5jdGlvbiAobWFya3VwLCBlbGVtZW50KSB7XG4gICAgdmFyIGV4aXN0aW5nQ2hlY2tzdW0gPSBlbGVtZW50LmdldEF0dHJpYnV0ZShSZWFjdE1hcmt1cENoZWNrc3VtLkNIRUNLU1VNX0FUVFJfTkFNRSk7XG4gICAgZXhpc3RpbmdDaGVja3N1bSA9IGV4aXN0aW5nQ2hlY2tzdW0gJiYgcGFyc2VJbnQoZXhpc3RpbmdDaGVja3N1bSwgMTApO1xuICAgIHZhciBtYXJrdXBDaGVja3N1bSA9IGFkbGVyMzIobWFya3VwKTtcbiAgICByZXR1cm4gbWFya3VwQ2hlY2tzdW0gPT09IGV4aXN0aW5nQ2hlY2tzdW07XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RNYXJrdXBDaGVja3N1bTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9SZWFjdE1hcmt1cENoZWNrc3VtLmpzXG4vLyBtb2R1bGUgaWQgPSAzNDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 343 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\n'use strict';\n\nvar MOD = 65521;\n\n// adler32 is not cryptographically strong, and is only used to sanity check that\n// markup generated on the server matches the markup generated on the client.\n// This implementation (a modified version of the SheetJS version) has been optimized\n// for our use case, at the expense of conforming to the adler32 specification\n// for non-ascii inputs.\nfunction adler32(data) {\n  var a = 1;\n  var b = 0;\n  var i = 0;\n  var l = data.length;\n  var m = l & ~0x3;\n  while (i < m) {\n    var n = Math.min(i + 4096, m);\n    for (; i < n; i += 4) {\n      b += (a += data.charCodeAt(i)) + (a += data.charCodeAt(i + 1)) + (a += data.charCodeAt(i + 2)) + (a += data.charCodeAt(i + 3));\n    }\n    a %= MOD;\n    b %= MOD;\n  }\n  for (; i < l; i++) {\n    b += a += data.charCodeAt(i);\n  }\n  a %= MOD;\n  b %= MOD;\n  return a | b << 16;\n}\n\nmodule.exports = adler32;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2FkbGVyMzIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgTU9EID0gNjU1MjE7XG5cbi8vIGFkbGVyMzIgaXMgbm90IGNyeXB0b2dyYXBoaWNhbGx5IHN0cm9uZywgYW5kIGlzIG9ubHkgdXNlZCB0byBzYW5pdHkgY2hlY2sgdGhhdFxuLy8gbWFya3VwIGdlbmVyYXRlZCBvbiB0aGUgc2VydmVyIG1hdGNoZXMgdGhlIG1hcmt1cCBnZW5lcmF0ZWQgb24gdGhlIGNsaWVudC5cbi8vIFRoaXMgaW1wbGVtZW50YXRpb24gKGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgU2hlZXRKUyB2ZXJzaW9uKSBoYXMgYmVlbiBvcHRpbWl6ZWRcbi8vIGZvciBvdXIgdXNlIGNhc2UsIGF0IHRoZSBleHBlbnNlIG9mIGNvbmZvcm1pbmcgdG8gdGhlIGFkbGVyMzIgc3BlY2lmaWNhdGlvblxuLy8gZm9yIG5vbi1hc2NpaSBpbnB1dHMuXG5mdW5jdGlvbiBhZGxlcjMyKGRhdGEpIHtcbiAgdmFyIGEgPSAxO1xuICB2YXIgYiA9IDA7XG4gIHZhciBpID0gMDtcbiAgdmFyIGwgPSBkYXRhLmxlbmd0aDtcbiAgdmFyIG0gPSBsICYgfjB4MztcbiAgd2hpbGUgKGkgPCBtKSB7XG4gICAgdmFyIG4gPSBNYXRoLm1pbihpICsgNDA5NiwgbSk7XG4gICAgZm9yICg7IGkgPCBuOyBpICs9IDQpIHtcbiAgICAgIGIgKz0gKGEgKz0gZGF0YS5jaGFyQ29kZUF0KGkpKSArIChhICs9IGRhdGEuY2hhckNvZGVBdChpICsgMSkpICsgKGEgKz0gZGF0YS5jaGFyQ29kZUF0KGkgKyAyKSkgKyAoYSArPSBkYXRhLmNoYXJDb2RlQXQoaSArIDMpKTtcbiAgICB9XG4gICAgYSAlPSBNT0Q7XG4gICAgYiAlPSBNT0Q7XG4gIH1cbiAgZm9yICg7IGkgPCBsOyBpKyspIHtcbiAgICBiICs9IGEgKz0gZGF0YS5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIGEgJT0gTU9EO1xuICBiICU9IE1PRDtcbiAgcmV0dXJuIGEgfCBiIDw8IDE2O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFkbGVyMzI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvYWRsZXIzMi5qc1xuLy8gbW9kdWxlIGlkID0gMzQzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 344 */
/***/ function(module, exports) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nmodule.exports = '15.4.2';//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQ0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0VmVyc2lvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICcxNS40LjInO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0VmVyc2lvbi5qc1xuLy8gbW9kdWxlIGlkID0gMzQ0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 345 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar _prodInvariant = __webpack_require__(208);\n\nvar ReactCurrentOwner = __webpack_require__(182);\nvar ReactDOMComponentTree = __webpack_require__(207);\nvar ReactInstanceMap = __webpack_require__(289);\n\nvar getHostComponentFromComposite = __webpack_require__(346);\nvar invariant = __webpack_require__(180);\nvar warning = __webpack_require__(183);\n\n/**\n * Returns the DOM node rendered by this element.\n *\n * See https://facebook.github.io/react/docs/top-level-api.html#reactdom.finddomnode\n *\n * @param {ReactComponent|DOMElement} componentOrElement\n * @return {?DOMElement} The root node of this element.\n */\nfunction findDOMNode(componentOrElement) {\n  if (true) {\n    var owner = ReactCurrentOwner.current;\n    if (owner !== null) {\n       true ? warning(owner._warnedAboutRefsInRender, '%s is accessing findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', owner.getName() || 'A component') : void 0;\n      owner._warnedAboutRefsInRender = true;\n    }\n  }\n  if (componentOrElement == null) {\n    return null;\n  }\n  if (componentOrElement.nodeType === 1) {\n    return componentOrElement;\n  }\n\n  var inst = ReactInstanceMap.get(componentOrElement);\n  if (inst) {\n    inst = getHostComponentFromComposite(inst);\n    return inst ? ReactDOMComponentTree.getNodeFromInstance(inst) : null;\n  }\n\n  if (typeof componentOrElement.render === 'function') {\n     true ?  true ? invariant(false, 'findDOMNode was called on an unmounted component.') : _prodInvariant('44') : void 0;\n  } else {\n     true ?  true ? invariant(false, 'Element appears to be neither ReactComponent nor DOMNode (keys: %s)', Object.keys(componentOrElement)) : _prodInvariant('45', Object.keys(componentOrElement)) : void 0;\n  }\n}\n\nmodule.exports = findDOMNode;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQ1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2ZpbmRET01Ob2RlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdEN1cnJlbnRPd25lcicpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RJbnN0YW5jZU1hcCA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0YW5jZU1hcCcpO1xuXG52YXIgZ2V0SG9zdENvbXBvbmVudEZyb21Db21wb3NpdGUgPSByZXF1aXJlKCcuL2dldEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlJyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBET00gbm9kZSByZW5kZXJlZCBieSB0aGlzIGVsZW1lbnQuXG4gKlxuICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0ZG9tLmZpbmRkb21ub2RlXG4gKlxuICogQHBhcmFtIHtSZWFjdENvbXBvbmVudHxET01FbGVtZW50fSBjb21wb25lbnRPckVsZW1lbnRcbiAqIEByZXR1cm4gez9ET01FbGVtZW50fSBUaGUgcm9vdCBub2RlIG9mIHRoaXMgZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gZmluZERPTU5vZGUoY29tcG9uZW50T3JFbGVtZW50KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdmFyIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtcbiAgICBpZiAob3duZXIgIT09IG51bGwpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKG93bmVyLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciwgJyVzIGlzIGFjY2Vzc2luZyBmaW5kRE9NTm9kZSBpbnNpZGUgaXRzIHJlbmRlcigpLiAnICsgJ3JlbmRlcigpIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLiBJdCBzaG91bGQgJyArICduZXZlciBhY2Nlc3Mgc29tZXRoaW5nIHRoYXQgcmVxdWlyZXMgc3RhbGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyAnICsgJ3JlbmRlciwgc3VjaCBhcyByZWZzLiBNb3ZlIHRoaXMgbG9naWMgdG8gY29tcG9uZW50RGlkTW91bnQgYW5kICcgKyAnY29tcG9uZW50RGlkVXBkYXRlIGluc3RlYWQuJywgb3duZXIuZ2V0TmFtZSgpIHx8ICdBIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgb3duZXIuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKGNvbXBvbmVudE9yRWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGNvbXBvbmVudE9yRWxlbWVudC5ub2RlVHlwZSA9PT0gMSkge1xuICAgIHJldHVybiBjb21wb25lbnRPckVsZW1lbnQ7XG4gIH1cblxuICB2YXIgaW5zdCA9IFJlYWN0SW5zdGFuY2VNYXAuZ2V0KGNvbXBvbmVudE9yRWxlbWVudCk7XG4gIGlmIChpbnN0KSB7XG4gICAgaW5zdCA9IGdldEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlKGluc3QpO1xuICAgIHJldHVybiBpbnN0ID8gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCkgOiBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBjb21wb25lbnRPckVsZW1lbnQucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgIWZhbHNlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2ZpbmRET01Ob2RlIHdhcyBjYWxsZWQgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKSA6IF9wcm9kSW52YXJpYW50KCc0NCcpIDogdm9pZCAwO1xuICB9IGVsc2Uge1xuICAgICFmYWxzZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFbGVtZW50IGFwcGVhcnMgdG8gYmUgbmVpdGhlciBSZWFjdENvbXBvbmVudCBub3IgRE9NTm9kZSAoa2V5czogJXMpJywgT2JqZWN0LmtleXMoY29tcG9uZW50T3JFbGVtZW50KSkgOiBfcHJvZEludmFyaWFudCgnNDUnLCBPYmplY3Qua2V5cyhjb21wb25lbnRPckVsZW1lbnQpKSA6IHZvaWQgMDtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbmRET01Ob2RlO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL2ZpbmRET01Ob2RlLmpzXG4vLyBtb2R1bGUgaWQgPSAzNDVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 346 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar ReactNodeTypes = __webpack_require__(293);\n\nfunction getHostComponentFromComposite(inst) {\n  var type;\n\n  while ((type = inst._renderedNodeType) === ReactNodeTypes.COMPOSITE) {\n    inst = inst._renderedComponent;\n  }\n\n  if (type === ReactNodeTypes.HOST) {\n    return inst._renderedComponent;\n  } else if (type === ReactNodeTypes.EMPTY) {\n    return null;\n  }\n}\n\nmodule.exports = getHostComponentFromComposite;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQ2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2dldEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdE5vZGVUeXBlcyA9IHJlcXVpcmUoJy4vUmVhY3ROb2RlVHlwZXMnKTtcblxuZnVuY3Rpb24gZ2V0SG9zdENvbXBvbmVudEZyb21Db21wb3NpdGUoaW5zdCkge1xuICB2YXIgdHlwZTtcblxuICB3aGlsZSAoKHR5cGUgPSBpbnN0Ll9yZW5kZXJlZE5vZGVUeXBlKSA9PT0gUmVhY3ROb2RlVHlwZXMuQ09NUE9TSVRFKSB7XG4gICAgaW5zdCA9IGluc3QuX3JlbmRlcmVkQ29tcG9uZW50O1xuICB9XG5cbiAgaWYgKHR5cGUgPT09IFJlYWN0Tm9kZVR5cGVzLkhPU1QpIHtcbiAgICByZXR1cm4gaW5zdC5fcmVuZGVyZWRDb21wb25lbnQ7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gUmVhY3ROb2RlVHlwZXMuRU1QVFkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL2dldEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlLmpzXG4vLyBtb2R1bGUgaWQgPSAzNDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 347 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar ReactMount = __webpack_require__(339);\n\nmodule.exports = ReactMount.renderSubtreeIntoContainer;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQ3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdE1vdW50ID0gcmVxdWlyZSgnLi9SZWFjdE1vdW50Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RNb3VudC5yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZG9tL2xpYi9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lci5qc1xuLy8gbW9kdWxlIGlkID0gMzQ3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 348 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar DOMProperty = __webpack_require__(209);\nvar EventPluginRegistry = __webpack_require__(216);\nvar ReactComponentTreeHook = __webpack_require__(198);\n\nvar warning = __webpack_require__(183);\n\nif (true) {\n  var reactProps = {\n    children: true,\n    dangerouslySetInnerHTML: true,\n    key: true,\n    ref: true,\n\n    autoFocus: true,\n    defaultValue: true,\n    valueLink: true,\n    defaultChecked: true,\n    checkedLink: true,\n    innerHTML: true,\n    suppressContentEditableWarning: true,\n    onFocusIn: true,\n    onFocusOut: true\n  };\n  var warnedProperties = {};\n\n  var validateProperty = function (tagName, name, debugID) {\n    if (DOMProperty.properties.hasOwnProperty(name) || DOMProperty.isCustomAttribute(name)) {\n      return true;\n    }\n    if (reactProps.hasOwnProperty(name) && reactProps[name] || warnedProperties.hasOwnProperty(name) && warnedProperties[name]) {\n      return true;\n    }\n    if (EventPluginRegistry.registrationNameModules.hasOwnProperty(name)) {\n      return true;\n    }\n    warnedProperties[name] = true;\n    var lowerCasedName = name.toLowerCase();\n\n    // data-* attributes should be lowercase; suggest the lowercase version\n    var standardName = DOMProperty.isCustomAttribute(lowerCasedName) ? lowerCasedName : DOMProperty.getPossibleStandardName.hasOwnProperty(lowerCasedName) ? DOMProperty.getPossibleStandardName[lowerCasedName] : null;\n\n    var registrationName = EventPluginRegistry.possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? EventPluginRegistry.possibleRegistrationNames[lowerCasedName] : null;\n\n    if (standardName != null) {\n       true ? warning(false, 'Unknown DOM property %s. Did you mean %s?%s', name, standardName, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0;\n      return true;\n    } else if (registrationName != null) {\n       true ? warning(false, 'Unknown event handler property %s. Did you mean `%s`?%s', name, registrationName, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0;\n      return true;\n    } else {\n      // We were unable to guess which prop the user intended.\n      // It is likely that the user was just blindly spreading/forwarding props\n      // Components should be careful to only render valid props/attributes.\n      // Warning will be invoked in warnUnknownProperties to allow grouping.\n      return false;\n    }\n  };\n}\n\nvar warnUnknownProperties = function (debugID, element) {\n  var unknownProps = [];\n  for (var key in element.props) {\n    var isValid = validateProperty(element.type, key, debugID);\n    if (!isValid) {\n      unknownProps.push(key);\n    }\n  }\n\n  var unknownPropString = unknownProps.map(function (prop) {\n    return '`' + prop + '`';\n  }).join(', ');\n\n  if (unknownProps.length === 1) {\n     true ? warning(false, 'Unknown prop %s on <%s> tag. Remove this prop from the element. ' + 'For details, see https://fb.me/react-unknown-prop%s', unknownPropString, element.type, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0;\n  } else if (unknownProps.length > 1) {\n     true ? warning(false, 'Unknown props %s on <%s> tag. Remove these props from the element. ' + 'For details, see https://fb.me/react-unknown-prop%s', unknownPropString, element.type, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0;\n  }\n};\n\nfunction handleElement(debugID, element) {\n  if (element == null || typeof element.type !== 'string') {\n    return;\n  }\n  if (element.type.indexOf('-') >= 0 || element.props.is) {\n    return;\n  }\n  warnUnknownProperties(debugID, element);\n}\n\nvar ReactDOMUnknownPropertyHook = {\n  onBeforeMountComponent: function (debugID, element) {\n    handleElement(debugID, element);\n  },\n  onBeforeUpdateComponent: function (debugID, element) {\n    handleElement(debugID, element);\n  }\n};\n\nmodule.exports = ReactDOMUnknownPropertyHook;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQ4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NVW5rbm93blByb3BlcnR5SG9vay5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NUHJvcGVydHkgPSByZXF1aXJlKCcuL0RPTVByb3BlcnR5Jyk7XG52YXIgRXZlbnRQbHVnaW5SZWdpc3RyeSA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5SZWdpc3RyeScpO1xudmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3RDb21wb25lbnRUcmVlSG9vaycpO1xuXG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIHJlYWN0UHJvcHMgPSB7XG4gICAgY2hpbGRyZW46IHRydWUsXG4gICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHRydWUsXG4gICAga2V5OiB0cnVlLFxuICAgIHJlZjogdHJ1ZSxcblxuICAgIGF1dG9Gb2N1czogdHJ1ZSxcbiAgICBkZWZhdWx0VmFsdWU6IHRydWUsXG4gICAgdmFsdWVMaW5rOiB0cnVlLFxuICAgIGRlZmF1bHRDaGVja2VkOiB0cnVlLFxuICAgIGNoZWNrZWRMaW5rOiB0cnVlLFxuICAgIGlubmVySFRNTDogdHJ1ZSxcbiAgICBzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmc6IHRydWUsXG4gICAgb25Gb2N1c0luOiB0cnVlLFxuICAgIG9uRm9jdXNPdXQ6IHRydWVcbiAgfTtcbiAgdmFyIHdhcm5lZFByb3BlcnRpZXMgPSB7fTtcblxuICB2YXIgdmFsaWRhdGVQcm9wZXJ0eSA9IGZ1bmN0aW9uICh0YWdOYW1lLCBuYW1lLCBkZWJ1Z0lEKSB7XG4gICAgaWYgKERPTVByb3BlcnR5LnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgfHwgRE9NUHJvcGVydHkuaXNDdXN0b21BdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAocmVhY3RQcm9wcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiByZWFjdFByb3BzW25hbWVdIHx8IHdhcm5lZFByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkUHJvcGVydGllc1tuYW1lXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gZGF0YS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb25cbiAgICB2YXIgc3RhbmRhcmROYW1lID0gRE9NUHJvcGVydHkuaXNDdXN0b21BdHRyaWJ1dGUobG93ZXJDYXNlZE5hbWUpID8gbG93ZXJDYXNlZE5hbWUgOiBET01Qcm9wZXJ0eS5nZXRQb3NzaWJsZVN0YW5kYXJkTmFtZS5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkgPyBET01Qcm9wZXJ0eS5nZXRQb3NzaWJsZVN0YW5kYXJkTmFtZVtsb3dlckNhc2VkTmFtZV0gOiBudWxsO1xuXG4gICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpID8gRXZlbnRQbHVnaW5SZWdpc3RyeS5wb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzW2xvd2VyQ2FzZWROYW1lXSA6IG51bGw7XG5cbiAgICBpZiAoc3RhbmRhcmROYW1lICE9IG51bGwpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVW5rbm93biBET00gcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8lcycsIG5hbWUsIHN0YW5kYXJkTmFtZSwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChkZWJ1Z0lEKSkgOiB2b2lkIDA7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgIT0gbnVsbCkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdVbmtub3duIGV2ZW50IGhhbmRsZXIgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiBgJXNgPyVzJywgbmFtZSwgcmVnaXN0cmF0aW9uTmFtZSwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChkZWJ1Z0lEKSkgOiB2b2lkIDA7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2Ugd2VyZSB1bmFibGUgdG8gZ3Vlc3Mgd2hpY2ggcHJvcCB0aGUgdXNlciBpbnRlbmRlZC5cbiAgICAgIC8vIEl0IGlzIGxpa2VseSB0aGF0IHRoZSB1c2VyIHdhcyBqdXN0IGJsaW5kbHkgc3ByZWFkaW5nL2ZvcndhcmRpbmcgcHJvcHNcbiAgICAgIC8vIENvbXBvbmVudHMgc2hvdWxkIGJlIGNhcmVmdWwgdG8gb25seSByZW5kZXIgdmFsaWQgcHJvcHMvYXR0cmlidXRlcy5cbiAgICAgIC8vIFdhcm5pbmcgd2lsbCBiZSBpbnZva2VkIGluIHdhcm5Vbmtub3duUHJvcGVydGllcyB0byBhbGxvdyBncm91cGluZy5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG59XG5cbnZhciB3YXJuVW5rbm93blByb3BlcnRpZXMgPSBmdW5jdGlvbiAoZGVidWdJRCwgZWxlbWVudCkge1xuICB2YXIgdW5rbm93blByb3BzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBlbGVtZW50LnByb3BzKSB7XG4gICAgdmFyIGlzVmFsaWQgPSB2YWxpZGF0ZVByb3BlcnR5KGVsZW1lbnQudHlwZSwga2V5LCBkZWJ1Z0lEKTtcbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIHVua25vd25Qcm9wcy5wdXNoKGtleSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHVua25vd25Qcm9wU3RyaW5nID0gdW5rbm93blByb3BzLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgIHJldHVybiAnYCcgKyBwcm9wICsgJ2AnO1xuICB9KS5qb2luKCcsICcpO1xuXG4gIGlmICh1bmtub3duUHJvcHMubGVuZ3RoID09PSAxKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdVbmtub3duIHByb3AgJXMgb24gPCVzPiB0YWcuIFJlbW92ZSB0aGlzIHByb3AgZnJvbSB0aGUgZWxlbWVudC4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vZmIubWUvcmVhY3QtdW5rbm93bi1wcm9wJXMnLCB1bmtub3duUHJvcFN0cmluZywgZWxlbWVudC50eXBlLCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpKSA6IHZvaWQgMDtcbiAgfSBlbHNlIGlmICh1bmtub3duUHJvcHMubGVuZ3RoID4gMSkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVW5rbm93biBwcm9wcyAlcyBvbiA8JXM+IHRhZy4gUmVtb3ZlIHRoZXNlIHByb3BzIGZyb20gdGhlIGVsZW1lbnQuICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL2ZiLm1lL3JlYWN0LXVua25vd24tcHJvcCVzJywgdW5rbm93blByb3BTdHJpbmcsIGVsZW1lbnQudHlwZSwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChkZWJ1Z0lEKSkgOiB2b2lkIDA7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGhhbmRsZUVsZW1lbnQoZGVidWdJRCwgZWxlbWVudCkge1xuICBpZiAoZWxlbWVudCA9PSBudWxsIHx8IHR5cGVvZiBlbGVtZW50LnR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChlbGVtZW50LnR5cGUuaW5kZXhPZignLScpID49IDAgfHwgZWxlbWVudC5wcm9wcy5pcykge1xuICAgIHJldHVybjtcbiAgfVxuICB3YXJuVW5rbm93blByb3BlcnRpZXMoZGVidWdJRCwgZWxlbWVudCk7XG59XG5cbnZhciBSZWFjdERPTVVua25vd25Qcm9wZXJ0eUhvb2sgPSB7XG4gIG9uQmVmb3JlTW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChkZWJ1Z0lELCBlbGVtZW50KSB7XG4gICAgaGFuZGxlRWxlbWVudChkZWJ1Z0lELCBlbGVtZW50KTtcbiAgfSxcbiAgb25CZWZvcmVVcGRhdGVDb21wb25lbnQ6IGZ1bmN0aW9uIChkZWJ1Z0lELCBlbGVtZW50KSB7XG4gICAgaGFuZGxlRWxlbWVudChkZWJ1Z0lELCBlbGVtZW50KTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTVVua25vd25Qcm9wZXJ0eUhvb2s7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWN0LWRvbS9saWIvUmVhY3RET01Vbmtub3duUHJvcGVydHlIb29rLmpzXG4vLyBtb2R1bGUgaWQgPSAzNDhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 349 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar ReactComponentTreeHook = __webpack_require__(198);\n\nvar warning = __webpack_require__(183);\n\nvar didWarnValueNull = false;\n\nfunction handleElement(debugID, element) {\n  if (element == null) {\n    return;\n  }\n  if (element.type !== 'input' && element.type !== 'textarea' && element.type !== 'select') {\n    return;\n  }\n  if (element.props != null && element.props.value === null && !didWarnValueNull) {\n     true ? warning(false, '`value` prop on `%s` should not be null. ' + 'Consider using the empty string to clear the component or `undefined` ' + 'for uncontrolled components.%s', element.type, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0;\n\n    didWarnValueNull = true;\n  }\n}\n\nvar ReactDOMNullInputValuePropHook = {\n  onBeforeMountComponent: function (debugID, element) {\n    handleElement(debugID, element);\n  },\n  onBeforeUpdateComponent: function (debugID, element) {\n    handleElement(debugID, element);\n  }\n};\n\nmodule.exports = ReactDOMNullInputValuePropHook;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQ5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NTnVsbElucHV0VmFsdWVQcm9wSG9vay5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG5cbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgZGlkV2FyblZhbHVlTnVsbCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBoYW5kbGVFbGVtZW50KGRlYnVnSUQsIGVsZW1lbnQpIHtcbiAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZWxlbWVudC50eXBlICE9PSAnaW5wdXQnICYmIGVsZW1lbnQudHlwZSAhPT0gJ3RleHRhcmVhJyAmJiBlbGVtZW50LnR5cGUgIT09ICdzZWxlY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChlbGVtZW50LnByb3BzICE9IG51bGwgJiYgZWxlbWVudC5wcm9wcy52YWx1ZSA9PT0gbnVsbCAmJiAhZGlkV2FyblZhbHVlTnVsbCkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYHZhbHVlYCBwcm9wIG9uIGAlc2Agc2hvdWxkIG5vdCBiZSBudWxsLiAnICsgJ0NvbnNpZGVyIHVzaW5nIHRoZSBlbXB0eSBzdHJpbmcgdG8gY2xlYXIgdGhlIGNvbXBvbmVudCBvciBgdW5kZWZpbmVkYCAnICsgJ2ZvciB1bmNvbnRyb2xsZWQgY29tcG9uZW50cy4lcycsIGVsZW1lbnQudHlwZSwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChkZWJ1Z0lEKSkgOiB2b2lkIDA7XG5cbiAgICBkaWRXYXJuVmFsdWVOdWxsID0gdHJ1ZTtcbiAgfVxufVxuXG52YXIgUmVhY3RET01OdWxsSW5wdXRWYWx1ZVByb3BIb29rID0ge1xuICBvbkJlZm9yZU1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCwgZWxlbWVudCkge1xuICAgIGhhbmRsZUVsZW1lbnQoZGVidWdJRCwgZWxlbWVudCk7XG4gIH0sXG4gIG9uQmVmb3JlVXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCwgZWxlbWVudCkge1xuICAgIGhhbmRsZUVsZW1lbnQoZGVidWdJRCwgZWxlbWVudCk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01OdWxsSW5wdXRWYWx1ZVByb3BIb29rO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0RE9NTnVsbElucHV0VmFsdWVQcm9wSG9vay5qc1xuLy8gbW9kdWxlIGlkID0gMzQ5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 350 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n'use strict';\n\nvar DOMProperty = __webpack_require__(209);\nvar ReactComponentTreeHook = __webpack_require__(198);\n\nvar warning = __webpack_require__(183);\n\nvar warnedProperties = {};\nvar rARIA = new RegExp('^(aria)-[' + DOMProperty.ATTRIBUTE_NAME_CHAR + ']*$');\n\nfunction validateProperty(tagName, name, debugID) {\n  if (warnedProperties.hasOwnProperty(name) && warnedProperties[name]) {\n    return true;\n  }\n\n  if (rARIA.test(name)) {\n    var lowerCasedName = name.toLowerCase();\n    var standardName = DOMProperty.getPossibleStandardName.hasOwnProperty(lowerCasedName) ? DOMProperty.getPossibleStandardName[lowerCasedName] : null;\n\n    // If this is an aria-* attribute, but is not listed in the known DOM\n    // DOM properties, then it is an invalid aria-* attribute.\n    if (standardName == null) {\n      warnedProperties[name] = true;\n      return false;\n    }\n    // aria-* attributes should be lowercase; suggest the lowercase version.\n    if (name !== standardName) {\n       true ? warning(false, 'Unknown ARIA attribute %s. Did you mean %s?%s', name, standardName, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0;\n      warnedProperties[name] = true;\n      return true;\n    }\n  }\n\n  return true;\n}\n\nfunction warnInvalidARIAProps(debugID, element) {\n  var invalidProps = [];\n\n  for (var key in element.props) {\n    var isValid = validateProperty(element.type, key, debugID);\n    if (!isValid) {\n      invalidProps.push(key);\n    }\n  }\n\n  var unknownPropString = invalidProps.map(function (prop) {\n    return '`' + prop + '`';\n  }).join(', ');\n\n  if (invalidProps.length === 1) {\n     true ? warning(false, 'Invalid aria prop %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop%s', unknownPropString, element.type, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0;\n  } else if (invalidProps.length > 1) {\n     true ? warning(false, 'Invalid aria props %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop%s', unknownPropString, element.type, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0;\n  }\n}\n\nfunction handleElement(debugID, element) {\n  if (element == null || typeof element.type !== 'string') {\n    return;\n  }\n  if (element.type.indexOf('-') >= 0 || element.props.is) {\n    return;\n  }\n\n  warnInvalidARIAProps(debugID, element);\n}\n\nvar ReactDOMInvalidARIAHook = {\n  onBeforeMountComponent: function (debugID, element) {\n    if (true) {\n      handleElement(debugID, element);\n    }\n  },\n  onBeforeUpdateComponent: function (debugID, element) {\n    if (true) {\n      handleElement(debugID, element);\n    }\n  }\n};\n\nmodule.exports = ReactDOMInvalidARIAHook;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzUwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NSW52YWxpZEFSSUFIb29rLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBET01Qcm9wZXJ0eSA9IHJlcXVpcmUoJy4vRE9NUHJvcGVydHknKTtcbnZhciBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcblxudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciB3YXJuZWRQcm9wZXJ0aWVzID0ge307XG52YXIgckFSSUEgPSBuZXcgUmVnRXhwKCdeKGFyaWEpLVsnICsgRE9NUHJvcGVydHkuQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eSh0YWdOYW1lLCBuYW1lLCBkZWJ1Z0lEKSB7XG4gIGlmICh3YXJuZWRQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0pIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChyQVJJQS50ZXN0KG5hbWUpKSB7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBzdGFuZGFyZE5hbWUgPSBET01Qcm9wZXJ0eS5nZXRQb3NzaWJsZVN0YW5kYXJkTmFtZS5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkgPyBET01Qcm9wZXJ0eS5nZXRQb3NzaWJsZVN0YW5kYXJkTmFtZVtsb3dlckNhc2VkTmFtZV0gOiBudWxsO1xuXG4gICAgLy8gSWYgdGhpcyBpcyBhbiBhcmlhLSogYXR0cmlidXRlLCBidXQgaXMgbm90IGxpc3RlZCBpbiB0aGUga25vd24gRE9NXG4gICAgLy8gRE9NIHByb3BlcnRpZXMsIHRoZW4gaXQgaXMgYW4gaW52YWxpZCBhcmlhLSogYXR0cmlidXRlLlxuICAgIGlmIChzdGFuZGFyZE5hbWUgPT0gbnVsbCkge1xuICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIGFyaWEtKiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBsb3dlcmNhc2U7IHN1Z2dlc3QgdGhlIGxvd2VyY2FzZSB2ZXJzaW9uLlxuICAgIGlmIChuYW1lICE9PSBzdGFuZGFyZE5hbWUpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVW5rbm93biBBUklBIGF0dHJpYnV0ZSAlcy4gRGlkIHlvdSBtZWFuICVzPyVzJywgbmFtZSwgc3RhbmRhcmROYW1lLCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpKSA6IHZvaWQgMDtcbiAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHdhcm5JbnZhbGlkQVJJQVByb3BzKGRlYnVnSUQsIGVsZW1lbnQpIHtcbiAgdmFyIGludmFsaWRQcm9wcyA9IFtdO1xuXG4gIGZvciAodmFyIGtleSBpbiBlbGVtZW50LnByb3BzKSB7XG4gICAgdmFyIGlzVmFsaWQgPSB2YWxpZGF0ZVByb3BlcnR5KGVsZW1lbnQudHlwZSwga2V5LCBkZWJ1Z0lEKTtcbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIGludmFsaWRQcm9wcy5wdXNoKGtleSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHVua25vd25Qcm9wU3RyaW5nID0gaW52YWxpZFByb3BzLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgIHJldHVybiAnYCcgKyBwcm9wICsgJ2AnO1xuICB9KS5qb2luKCcsICcpO1xuXG4gIGlmIChpbnZhbGlkUHJvcHMubGVuZ3RoID09PSAxKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdJbnZhbGlkIGFyaWEgcHJvcCAlcyBvbiA8JXM+IHRhZy4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vZmIubWUvaW52YWxpZC1hcmlhLXByb3AlcycsIHVua25vd25Qcm9wU3RyaW5nLCBlbGVtZW50LnR5cGUsIFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQoZGVidWdJRCkpIDogdm9pZCAwO1xuICB9IGVsc2UgaWYgKGludmFsaWRQcm9wcy5sZW5ndGggPiAxKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdJbnZhbGlkIGFyaWEgcHJvcHMgJXMgb24gPCVzPiB0YWcuICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL2ZiLm1lL2ludmFsaWQtYXJpYS1wcm9wJXMnLCB1bmtub3duUHJvcFN0cmluZywgZWxlbWVudC50eXBlLCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpKSA6IHZvaWQgMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVFbGVtZW50KGRlYnVnSUQsIGVsZW1lbnQpIHtcbiAgaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCB0eXBlb2YgZWxlbWVudC50eXBlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZWxlbWVudC50eXBlLmluZGV4T2YoJy0nKSA+PSAwIHx8IGVsZW1lbnQucHJvcHMuaXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB3YXJuSW52YWxpZEFSSUFQcm9wcyhkZWJ1Z0lELCBlbGVtZW50KTtcbn1cblxudmFyIFJlYWN0RE9NSW52YWxpZEFSSUFIb29rID0ge1xuICBvbkJlZm9yZU1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCwgZWxlbWVudCkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBoYW5kbGVFbGVtZW50KGRlYnVnSUQsIGVsZW1lbnQpO1xuICAgIH1cbiAgfSxcbiAgb25CZWZvcmVVcGRhdGVDb21wb25lbnQ6IGZ1bmN0aW9uIChkZWJ1Z0lELCBlbGVtZW50KSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGhhbmRsZUVsZW1lbnQoZGVidWdJRCwgZWxlbWVudCk7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NSW52YWxpZEFSSUFIb29rO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFjdC1kb20vbGliL1JlYWN0RE9NSW52YWxpZEFSSUFIb29rLmpzXG4vLyBtb2R1bGUgaWQgPSAzNTBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 351 */
/***/ function(module, exports, __webpack_require__) {

    eval("'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;};}();\n\nvar _react = __webpack_require__(174);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;} /* global $ */\n\nvar ENTER_KEY = 13;\nvar LEFT_ARROW = 37;\nvar UP_ARROW = 38;\nvar RIGHT_ARROW = 39;\nvar DOWN_ARROW = 40;\n\nvar Metacode = function Metacode(props) {var\n  m = props.m,_onClick = props.onClick,underCursor = props.underCursor;\n\n  return (\n    _react2.default.createElement('li', { onClick: function onClick() {return _onClick(m.id);}, className: underCursor ? 'keySelect' : '' },\n      _react2.default.createElement('img', { src: m.get('icon') }),\n      _react2.default.createElement('span', null, m.get('name'))));\n\n\n};var\n\nMetacodeSelect = function (_Component) {_inherits(MetacodeSelect, _Component);\n\n  function MetacodeSelect(props) {_classCallCheck(this, MetacodeSelect);var _this = _possibleConstructorReturn(this, (MetacodeSelect.__proto__ || Object.getPrototypeOf(MetacodeSelect)).call(this,\n    props));\n    _this.state = {\n      filterText: '',\n      selectingSection: true,\n      underCursor: 0 };return _this;\n\n  }_createClass(MetacodeSelect, [{ key: 'componentDidMount', value: function componentDidMount()\n\n    {\n      var self = this;\n      setTimeout(function () {\n        $(document.body).on('keyup.metacodeSelect', self.handleKeyUp.bind(self));\n      }, 10);\n    } }, { key: 'componentWillUnmount', value: function componentWillUnmount()\n\n    {\n      $(document.body).off('.metacodeSelect');\n    } }, { key: 'changeFilterText', value: function changeFilterText(\n\n    e) {\n      this.setState({ filterText: e.target.value, underCursor: 0 });\n    } }, { key: 'getSelectMetacodes', value: function getSelectMetacodes()\n\n    {var _props =\n      this.props,metacodes = _props.metacodes,recent = _props.recent,mostUsed = _props.mostUsed;var _state =\n      this.state,filterText = _state.filterText,activeTab = _state.activeTab;\n\n      var selectMetacodes = metacodes;\n      if (filterText.length > 1) {// search\n        selectMetacodes = filterText.length > 1 ? metacodes.filter(function (m) {\n          return m.get('name').toLowerCase().search(filterText.toLowerCase()) > -1;\n        }) : [];\n      }\n      return selectMetacodes;\n    } }, { key: 'handleKeyUp', value: function handleKeyUp(\n\n    e) {var\n      close = this.props.close;var\n      underCursor = this.state.underCursor;\n      var selectMetacodes = this.getSelectMetacodes();\n      var nextIndex = void 0;\n\n      switch (e.which) {\n        case ENTER_KEY:\n          if (selectMetacodes.length) this.resetAndClick(selectMetacodes[underCursor].id);\n          break;\n        case UP_ARROW:\n          if (underCursor == 0) {\n            close();\n            break;\n          }\n          nextIndex = underCursor == 0 ? selectMetacodes.length - 1 : underCursor - 1;\n          this.setState({ underCursor: nextIndex });\n          break;\n        case DOWN_ARROW:\n          nextIndex = underCursor == selectMetacodes.length - 1 ? 0 : underCursor + 1;\n          this.setState({ underCursor: nextIndex });\n          break;}\n\n    } }, { key: 'resetAndClick', value: function resetAndClick(\n\n    id) {var\n      onClick = this.props.onClick;\n      this.setState({ filterText: '', underCursor: 0 });\n      onClick(id);\n    } }, { key: 'render', value: function render()\n\n    {var _this2 = this;var _props2 =\n      this.props,onClick = _props2.onClick,close = _props2.close;var _state2 =\n      this.state,filterText = _state2.filterText,underCursor = _state2.underCursor;\n      var selectMetacodes = this.getSelectMetacodes();\n      return _react2.default.createElement('div', { className: 'metacodeSelect' },\n        _react2.default.createElement('div', { className: 'tabList' },\n          _react2.default.createElement('input', { type: 'text',\n            className: 'metacodeFilterInput',\n            placeholder: 'Search...',\n            ref: 'input',\n            value: filterText,\n            onChange: this.changeFilterText.bind(this) }),\n          _react2.default.createElement('ul', { className: 'metacodeList' },\n            selectMetacodes.map(function (m, index) {\n              return _react2.default.createElement(Metacode, { underCursor: underCursor == index,\n                key: m.id,\n                m: m,\n                onClick: _this2.resetAndClick.bind(_this2) });\n            })),\n\n          _react2.default.createElement('div', { className: 'clearfloat' })));\n\n\n    } }]);return MetacodeSelect;}(_react.Component);\n\n\nMetacodeSelect.propTypes = {\n  onClick: _react.PropTypes.func.isRequired,\n  close: _react.PropTypes.func.isRequired,\n  metacodes: _react.PropTypes.array.isRequired };exports.default =\n\n\nMetacodeSelect;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzUxLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvY29tcG9uZW50cy9NZXRhY29kZVNlbGVjdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBnbG9iYWwgJCAqL1xuXG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50LCBQcm9wVHlwZXMgfSBmcm9tICdyZWFjdCdcblxuY29uc3QgRU5URVJfS0VZID0gMTNcbmNvbnN0IExFRlRfQVJST1cgPSAzN1xuY29uc3QgVVBfQVJST1cgPSAzOFxuY29uc3QgUklHSFRfQVJST1cgPSAzOVxuY29uc3QgRE9XTl9BUlJPVyA9IDQwXG5cbmNvbnN0IE1ldGFjb2RlID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgbSwgb25DbGljaywgdW5kZXJDdXJzb3IgfSA9IHByb3BzXG4gIFxuICByZXR1cm4gKFxuICAgIDxsaSBvbkNsaWNrPXsoKSA9PiBvbkNsaWNrKG0uaWQpIH0gY2xhc3NOYW1lPXsgdW5kZXJDdXJzb3IgPyAna2V5U2VsZWN0JyA6ICcnIH0+XG4gICAgICA8aW1nIHNyYz17IG0uZ2V0KCdpY29uJykgfSAvPlxuICAgICAgPHNwYW4+eyBtLmdldCgnbmFtZScpIH08L3NwYW4+XG4gICAgPC9saT5cbiAgKVxufVxuXG5jbGFzcyBNZXRhY29kZVNlbGVjdCBleHRlbmRzIENvbXBvbmVudCB7XG4gIFxuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZmlsdGVyVGV4dDogJycsXG4gICAgICBzZWxlY3RpbmdTZWN0aW9uOiB0cnVlLFxuICAgICAgdW5kZXJDdXJzb3I6IDBcbiAgICB9XG4gIH1cbiAgXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzXG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICQoZG9jdW1lbnQuYm9keSkub24oJ2tleXVwLm1ldGFjb2RlU2VsZWN0Jywgc2VsZi5oYW5kbGVLZXlVcC5iaW5kKHNlbGYpKVxuICAgIH0sIDEwKVxuICB9XG4gIFxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAkKGRvY3VtZW50LmJvZHkpLm9mZignLm1ldGFjb2RlU2VsZWN0JylcbiAgfVxuICBcbiAgY2hhbmdlRmlsdGVyVGV4dCAoZSkge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBmaWx0ZXJUZXh0OiBlLnRhcmdldC52YWx1ZSwgdW5kZXJDdXJzb3I6IDAgfSlcbiAgfVxuICBcbiAgZ2V0U2VsZWN0TWV0YWNvZGVzICgpIHtcbiAgICBjb25zdCB7IG1ldGFjb2RlcywgcmVjZW50LCBtb3N0VXNlZCB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHsgZmlsdGVyVGV4dCwgYWN0aXZlVGFiIH0gPSB0aGlzLnN0YXRlXG5cbiAgICBsZXQgc2VsZWN0TWV0YWNvZGVzID0gbWV0YWNvZGVzXG4gICAgaWYgKGZpbHRlclRleHQubGVuZ3RoID4gMSkgeyAvLyBzZWFyY2hcbiAgICAgIHNlbGVjdE1ldGFjb2RlcyA9IGZpbHRlclRleHQubGVuZ3RoID4gMSA/IG1ldGFjb2Rlcy5maWx0ZXIobSA9PiB7XG4gICAgICAgIHJldHVybiBtLmdldCgnbmFtZScpLnRvTG93ZXJDYXNlKCkuc2VhcmNoKGZpbHRlclRleHQudG9Mb3dlckNhc2UoKSkgPiAtMVxuICAgICAgfSkgOiBbXVxuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0TWV0YWNvZGVzXG4gIH1cbiAgXG4gIGhhbmRsZUtleVVwIChlKSB7XG4gICAgY29uc3QgeyBjbG9zZSB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHsgdW5kZXJDdXJzb3IgfSA9IHRoaXMuc3RhdGVcbiAgICBjb25zdCBzZWxlY3RNZXRhY29kZXMgPSB0aGlzLmdldFNlbGVjdE1ldGFjb2RlcygpXG4gICAgbGV0IG5leHRJbmRleFxuXG4gICAgc3dpdGNoIChlLndoaWNoKSB7XG4gICAgICBjYXNlIEVOVEVSX0tFWTpcbiAgICAgICAgaWYgKHNlbGVjdE1ldGFjb2Rlcy5sZW5ndGgpIHRoaXMucmVzZXRBbmRDbGljayhzZWxlY3RNZXRhY29kZXNbdW5kZXJDdXJzb3JdLmlkKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBVUF9BUlJPVzpcbiAgICAgICAgaWYgKHVuZGVyQ3Vyc29yID09IDApIHtcbiAgICAgICAgICBjbG9zZSgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBuZXh0SW5kZXggPSB1bmRlckN1cnNvciA9PSAwID8gc2VsZWN0TWV0YWNvZGVzLmxlbmd0aCAtIDEgOiB1bmRlckN1cnNvciAtIDFcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHVuZGVyQ3Vyc29yOiBuZXh0SW5kZXggfSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgRE9XTl9BUlJPVzpcbiAgICAgICAgbmV4dEluZGV4ID0gdW5kZXJDdXJzb3IgPT0gc2VsZWN0TWV0YWNvZGVzLmxlbmd0aCAtIDEgPyAwIDogdW5kZXJDdXJzb3IgKyAxXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyB1bmRlckN1cnNvcjogbmV4dEluZGV4IH0pXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIFxuICByZXNldEFuZENsaWNrIChpZCkge1xuICAgIGNvbnN0IHsgb25DbGljayB9ID0gdGhpcy5wcm9wc1xuICAgIHRoaXMuc2V0U3RhdGUoeyBmaWx0ZXJUZXh0OiAnJywgdW5kZXJDdXJzb3I6IDAgfSlcbiAgICBvbkNsaWNrKGlkKVxuICB9XG4gIFxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgb25DbGljaywgY2xvc2UgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCB7IGZpbHRlclRleHQsIHVuZGVyQ3Vyc29yIH0gPSB0aGlzLnN0YXRlXG4gICAgY29uc3Qgc2VsZWN0TWV0YWNvZGVzID0gdGhpcy5nZXRTZWxlY3RNZXRhY29kZXMoKVxuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT0nbWV0YWNvZGVTZWxlY3QnPlxuICAgICAgPGRpdiBjbGFzc05hbWU9J3RhYkxpc3QnPlxuICAgICAgICA8aW5wdXQgdHlwZT0ndGV4dCdcbiAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdtZXRhY29kZUZpbHRlcklucHV0J1xuICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0nU2VhcmNoLi4uJ1xuICAgICAgICAgICAgICAgICByZWY9J2lucHV0J1xuICAgICAgICAgICAgICAgICB2YWx1ZT17IGZpbHRlclRleHQgfVxuICAgICAgICAgICAgICAgICBvbkNoYW5nZT17IHRoaXMuY2hhbmdlRmlsdGVyVGV4dC5iaW5kKHRoaXMpIH0gLz5cbiAgICAgICAgPHVsIGNsYXNzTmFtZT0nbWV0YWNvZGVMaXN0Jz5cbiAgICAgICAgICB7IHNlbGVjdE1ldGFjb2Rlcy5tYXAoKG0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gPE1ldGFjb2RlIHVuZGVyQ3Vyc29yPXt1bmRlckN1cnNvciA9PSBpbmRleH0gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17bS5pZH0gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG09e219IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnJlc2V0QW5kQ2xpY2suYmluZCh0aGlzKX0gLz5cbiAgICAgICAgICB9KX1cbiAgICAgICAgPC91bD5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NsZWFyZmxvYXQnPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cbn1cblxuTWV0YWNvZGVTZWxlY3QucHJvcFR5cGVzID0ge1xuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBjbG9zZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgbWV0YWNvZGVzOiBQcm9wVHlwZXMuYXJyYXkuaXNSZXF1aXJlZCxcbn1cblxuZXhwb3J0IGRlZmF1bHQgTWV0YWNvZGVTZWxlY3RcblxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9jb21wb25lbnRzL01ldGFjb2RlU2VsZWN0LmpzIl0sIm1hcHBpbmdzIjoiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 352 */
/***/ function(module, exports) {

    eval("\"use strict\";Object.defineProperty(exports, \"__esModule\", { value: true });var Mouse = {\n  didPan: false,\n  didBoxZoom: false,\n  changeInX: 0,\n  changeInY: 0,\n  edgeHoveringOver: false,\n  boxStartCoordinates: false,\n  boxEndCoordinates: false,\n  focusNodeCoords: null,\n  newNodeCoords: { x: 100, y: 0 },\n  synapseStartCoordinates: [],\n  synapseEndCoordinates: null,\n  lastNodeClick: 0,\n  lastCanvasClick: 0,\n  DOUBLE_CLICK_TOLERANCE: 501 };exports.default =\n\n\nMouse;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzUyLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvTW91c2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgTW91c2UgPSB7XG4gIGRpZFBhbjogZmFsc2UsXG4gIGRpZEJveFpvb206IGZhbHNlLFxuICBjaGFuZ2VJblg6IDAsXG4gIGNoYW5nZUluWTogMCxcbiAgZWRnZUhvdmVyaW5nT3ZlcjogZmFsc2UsXG4gIGJveFN0YXJ0Q29vcmRpbmF0ZXM6IGZhbHNlLFxuICBib3hFbmRDb29yZGluYXRlczogZmFsc2UsXG4gIGZvY3VzTm9kZUNvb3JkczogbnVsbCxcbiAgbmV3Tm9kZUNvb3JkczogeyB4OiAxMDAsIHk6IDAgfSxcbiAgc3luYXBzZVN0YXJ0Q29vcmRpbmF0ZXM6IFtdLFxuICBzeW5hcHNlRW5kQ29vcmRpbmF0ZXM6IG51bGwsXG4gIGxhc3ROb2RlQ2xpY2s6IDAsXG4gIGxhc3RDYW52YXNDbGljazogMCxcbiAgRE9VQkxFX0NMSUNLX1RPTEVSQU5DRTogNTAxXG59XG5cbmV4cG9ydCBkZWZhdWx0IE1vdXNlXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL01ldGFtYXBzL01vdXNlLmpzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 353 */
/***/ function(module, exports) {

    eval("\"use strict\";Object.defineProperty(exports, \"__esModule\", { value: true });var Selected = {\n  reset: function reset() {\n    var self = Selected;\n    self.Nodes = [];\n    self.Edges = [];\n  },\n  Nodes: [],\n  Edges: [] };exports.default =\n\n\nSelected;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzUzLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvU2VsZWN0ZWQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgU2VsZWN0ZWQgPSB7XG4gIHJlc2V0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IFNlbGVjdGVkXG4gICAgc2VsZi5Ob2RlcyA9IFtdXG4gICAgc2VsZi5FZGdlcyA9IFtdXG4gIH0sXG4gIE5vZGVzOiBbXSxcbiAgRWRnZXM6IFtdXG59XG5cbmV4cG9ydCBkZWZhdWx0IFNlbGVjdGVkXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL01ldGFtYXBzL1NlbGVjdGVkLmpzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 354 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _Control = __webpack_require__(27);var _Control2 = _interopRequireDefault(_Control);\nvar _Create = __webpack_require__(173);var _Create2 = _interopRequireDefault(_Create);\nvar _DataModel = __webpack_require__(149);var _DataModel2 = _interopRequireDefault(_DataModel);\nvar _Engine = __webpack_require__(150);var _Engine2 = _interopRequireDefault(_Engine);\nvar _JIT = __webpack_require__(355);var _JIT2 = _interopRequireDefault(_JIT);\nvar _Map = __webpack_require__(369);var _Map2 = _interopRequireDefault(_Map);\nvar _Selected = __webpack_require__(353);var _Selected2 = _interopRequireDefault(_Selected);\nvar _Settings = __webpack_require__(572);var _Settings2 = _interopRequireDefault(_Settings);\nvar _Visualize = __webpack_require__(561);var _Visualize2 = _interopRequireDefault(_Visualize);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} /* global $ */\n\nvar noOp = function noOp() {};\n\nvar Synapse = {\n  // this function is to retrieve a synapse JSON object from the database\n  // @param id = the id of the synapse to retrieve\n  get: function get(id) {var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noOp;\n    // if the desired topic is not yet in the local topic repository, fetch it\n    if (_DataModel2.default.Synapses.get(id) === undefined) {\n      $.ajax({\n        url: '/synapses/' + id + '.json',\n        success: function success(data) {\n          _DataModel2.default.Synapses.add(data);\n          callback(_DataModel2.default.Synapses.get(id));\n        } });\n\n    } else callback(_DataModel2.default.Synapses.get(id));\n  },\n\n  renderSynapse: function renderSynapse(mapping, synapse, node1, node2, fromRemote) {\n    var newedge = synapse.createEdge(mapping);\n    _Visualize2.default.mGraph.graph.addAdjacence(node1, node2, newedge.data);\n    var edgeOnViz = _Visualize2.default.mGraph.graph.getAdjacence(node1.id, node2.id);\n    synapse.set('edge', edgeOnViz);\n    synapse.updateEdge(); // links the synapse and the mapping to the edge\n    if (!fromRemote && synapse.isNew()) {\n      synapse.save(null, {\n        success: function success(synapseModel) {return _Active2.default.Map && mapping.save({ mappable_id: synapseModel.id });} });\n\n    } else if (!fromRemote && !synapse.isNew() && _Active2.default.Map) {\n      mapping.save();\n    }\n  },\n  createSynapseLocally: function createSynapseLocally(topic1id, topic2id) {\n    var self = Synapse;\n    $(document).trigger(_Map2.default.events.editedByActiveMapper);\n    // for each node in this array we will create a synapse going to the position2 node.\n    var synapsesToCreate = [];\n    var topic2 = _DataModel2.default.Topics.get(topic2id);\n    var node2 = topic2.get('node');\n    if (_Selected2.default.Nodes.length === 0) {\n      synapsesToCreate.push(_DataModel2.default.Topics.get(topic1id).get('node'));\n    } else {\n      synapsesToCreate.concat(_Selected2.default.Nodes);\n    }\n    synapsesToCreate.forEach(function (node1) {\n      var topic1 = node1.getData('topic');\n      var synapse = new _DataModel2.default.Synapse({\n        desc: _Create2.default.newSynapse.description || '',\n        topic1_id: topic1.id,\n        topic2_id: topic2.id });\n\n      _DataModel2.default.Synapses.add(synapse);\n      var mapping = new _DataModel2.default.Mapping({\n        mappable_type: 'Synapse',\n        mappable_id: synapse.cid });\n\n      _DataModel2.default.Mappings.add(mapping);\n      // this function also includes the creation of the synapse in the database\n      self.renderSynapse(mapping, synapse, node1, node2);\n    }); // for each in synapsesToCreate\n  },\n  getSynapseFromAutocomplete: function getSynapseFromAutocomplete(id) {\n    var self = Synapse;\n\n    self.get(id, function (synapse) {\n      var mapping = new _DataModel2.default.Mapping({\n        mappable_type: 'Synapse',\n        mappable_id: synapse.id });\n\n      _DataModel2.default.Mappings.add(mapping);\n      var topic1 = _DataModel2.default.Topics.get(_Create2.default.newSynapse.topic1id);\n      var node1 = topic1.get('node');\n      var topic2 = _DataModel2.default.Topics.get(_Create2.default.newSynapse.topic2id);\n      var node2 = topic2.get('node');\n      _Create2.default.newSynapse.hide();\n      self.renderSynapse(mapping, synapse, node1, node2);\n      _Engine2.default.runLayout();\n    });\n  } };exports.default =\n\n\nSynapse;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU0LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvU3luYXBzZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBnbG9iYWwgJCAqL1xuXG5pbXBvcnQgQWN0aXZlIGZyb20gJy4vQWN0aXZlJ1xuaW1wb3J0IENvbnRyb2wgZnJvbSAnLi9Db250cm9sJ1xuaW1wb3J0IENyZWF0ZSBmcm9tICcuL0NyZWF0ZSdcbmltcG9ydCBEYXRhTW9kZWwgZnJvbSAnLi9EYXRhTW9kZWwnXG5pbXBvcnQgRW5naW5lIGZyb20gJy4vRW5naW5lJ1xuaW1wb3J0IEpJVCBmcm9tICcuL0pJVCdcbmltcG9ydCBNYXAgZnJvbSAnLi9NYXAnXG5pbXBvcnQgU2VsZWN0ZWQgZnJvbSAnLi9TZWxlY3RlZCdcbmltcG9ydCBTZXR0aW5ncyBmcm9tICcuL1NldHRpbmdzJ1xuaW1wb3J0IFZpc3VhbGl6ZSBmcm9tICcuL1Zpc3VhbGl6ZSdcblxuY29uc3Qgbm9PcCA9ICgpID0+IHt9XG5cbmNvbnN0IFN5bmFwc2UgPSB7XG4gIC8vIHRoaXMgZnVuY3Rpb24gaXMgdG8gcmV0cmlldmUgYSBzeW5hcHNlIEpTT04gb2JqZWN0IGZyb20gdGhlIGRhdGFiYXNlXG4gIC8vIEBwYXJhbSBpZCA9IHRoZSBpZCBvZiB0aGUgc3luYXBzZSB0byByZXRyaWV2ZVxuICBnZXQ6IGZ1bmN0aW9uKGlkLCBjYWxsYmFjayA9IG5vT3ApIHtcbiAgICAvLyBpZiB0aGUgZGVzaXJlZCB0b3BpYyBpcyBub3QgeWV0IGluIHRoZSBsb2NhbCB0b3BpYyByZXBvc2l0b3J5LCBmZXRjaCBpdFxuICAgIGlmIChEYXRhTW9kZWwuU3luYXBzZXMuZ2V0KGlkKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAkLmFqYXgoe1xuICAgICAgICB1cmw6ICcvc3luYXBzZXMvJyArIGlkICsgJy5qc29uJyxcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgIERhdGFNb2RlbC5TeW5hcHNlcy5hZGQoZGF0YSlcbiAgICAgICAgICBjYWxsYmFjayhEYXRhTW9kZWwuU3luYXBzZXMuZ2V0KGlkKSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGVsc2UgY2FsbGJhY2soRGF0YU1vZGVsLlN5bmFwc2VzLmdldChpZCkpXG4gIH0sXG5cbiAgcmVuZGVyU3luYXBzZTogZnVuY3Rpb24obWFwcGluZywgc3luYXBzZSwgbm9kZTEsIG5vZGUyLCBmcm9tUmVtb3RlKSB7XG4gICAgY29uc3QgbmV3ZWRnZSA9IHN5bmFwc2UuY3JlYXRlRWRnZShtYXBwaW5nKVxuICAgIFZpc3VhbGl6ZS5tR3JhcGguZ3JhcGguYWRkQWRqYWNlbmNlKG5vZGUxLCBub2RlMiwgbmV3ZWRnZS5kYXRhKVxuICAgIGNvbnN0IGVkZ2VPblZpeiA9IFZpc3VhbGl6ZS5tR3JhcGguZ3JhcGguZ2V0QWRqYWNlbmNlKG5vZGUxLmlkLCBub2RlMi5pZClcbiAgICBzeW5hcHNlLnNldCgnZWRnZScsIGVkZ2VPblZpeilcbiAgICBzeW5hcHNlLnVwZGF0ZUVkZ2UoKSAvLyBsaW5rcyB0aGUgc3luYXBzZSBhbmQgdGhlIG1hcHBpbmcgdG8gdGhlIGVkZ2VcbiAgICBpZiAoIWZyb21SZW1vdGUgJiYgc3luYXBzZS5pc05ldygpKSB7XG4gICAgICBzeW5hcHNlLnNhdmUobnVsbCwge1xuICAgICAgICBzdWNjZXNzOiBzeW5hcHNlTW9kZWwgPT4gQWN0aXZlLk1hcCAmJiBtYXBwaW5nLnNhdmUoeyBtYXBwYWJsZV9pZDogc3luYXBzZU1vZGVsLmlkIH0pXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAoIWZyb21SZW1vdGUgJiYgIXN5bmFwc2UuaXNOZXcoKSAmJiBBY3RpdmUuTWFwKSB7XG4gICAgICBtYXBwaW5nLnNhdmUoKVxuICAgIH1cbiAgfSxcbiAgY3JlYXRlU3luYXBzZUxvY2FsbHk6IGZ1bmN0aW9uKHRvcGljMWlkLCB0b3BpYzJpZCkge1xuICAgIHZhciBzZWxmID0gU3luYXBzZVxuICAgICQoZG9jdW1lbnQpLnRyaWdnZXIoTWFwLmV2ZW50cy5lZGl0ZWRCeUFjdGl2ZU1hcHBlcilcbiAgICAvLyBmb3IgZWFjaCBub2RlIGluIHRoaXMgYXJyYXkgd2Ugd2lsbCBjcmVhdGUgYSBzeW5hcHNlIGdvaW5nIHRvIHRoZSBwb3NpdGlvbjIgbm9kZS5cbiAgICBjb25zdCBzeW5hcHNlc1RvQ3JlYXRlID0gW11cbiAgICBjb25zdCB0b3BpYzIgPSBEYXRhTW9kZWwuVG9waWNzLmdldCh0b3BpYzJpZClcbiAgICBjb25zdCBub2RlMiA9IHRvcGljMi5nZXQoJ25vZGUnKVxuICAgIGlmIChTZWxlY3RlZC5Ob2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHN5bmFwc2VzVG9DcmVhdGUucHVzaChEYXRhTW9kZWwuVG9waWNzLmdldCh0b3BpYzFpZCkuZ2V0KCdub2RlJykpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN5bmFwc2VzVG9DcmVhdGUuY29uY2F0KFNlbGVjdGVkLk5vZGVzKVxuICAgIH1cbiAgICBzeW5hcHNlc1RvQ3JlYXRlLmZvckVhY2gobm9kZTEgPT4ge1xuICAgICAgY29uc3QgdG9waWMxID0gbm9kZTEuZ2V0RGF0YSgndG9waWMnKVxuICAgICAgY29uc3Qgc3luYXBzZSA9IG5ldyBEYXRhTW9kZWwuU3luYXBzZSh7XG4gICAgICAgIGRlc2M6IENyZWF0ZS5uZXdTeW5hcHNlLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgICB0b3BpYzFfaWQ6IHRvcGljMS5pZCxcbiAgICAgICAgdG9waWMyX2lkOiB0b3BpYzIuaWRcbiAgICAgIH0pXG4gICAgICBEYXRhTW9kZWwuU3luYXBzZXMuYWRkKHN5bmFwc2UpXG4gICAgICBjb25zdCBtYXBwaW5nID0gbmV3IERhdGFNb2RlbC5NYXBwaW5nKHtcbiAgICAgICAgbWFwcGFibGVfdHlwZTogJ1N5bmFwc2UnLFxuICAgICAgICBtYXBwYWJsZV9pZDogc3luYXBzZS5jaWRcbiAgICAgIH0pXG4gICAgICBEYXRhTW9kZWwuTWFwcGluZ3MuYWRkKG1hcHBpbmcpXG4gICAgICAvLyB0aGlzIGZ1bmN0aW9uIGFsc28gaW5jbHVkZXMgdGhlIGNyZWF0aW9uIG9mIHRoZSBzeW5hcHNlIGluIHRoZSBkYXRhYmFzZVxuICAgICAgc2VsZi5yZW5kZXJTeW5hcHNlKG1hcHBpbmcsIHN5bmFwc2UsIG5vZGUxLCBub2RlMilcbiAgICB9KSAvLyBmb3IgZWFjaCBpbiBzeW5hcHNlc1RvQ3JlYXRlXG4gIH0sXG4gIGdldFN5bmFwc2VGcm9tQXV0b2NvbXBsZXRlOiBmdW5jdGlvbihpZCkge1xuICAgIHZhciBzZWxmID0gU3luYXBzZVxuXG4gICAgc2VsZi5nZXQoaWQsIHN5bmFwc2UgPT4ge1xuICAgICAgY29uc3QgbWFwcGluZyA9IG5ldyBEYXRhTW9kZWwuTWFwcGluZyh7XG4gICAgICAgIG1hcHBhYmxlX3R5cGU6ICdTeW5hcHNlJyxcbiAgICAgICAgbWFwcGFibGVfaWQ6IHN5bmFwc2UuaWRcbiAgICAgIH0pXG4gICAgICBEYXRhTW9kZWwuTWFwcGluZ3MuYWRkKG1hcHBpbmcpXG4gICAgICBjb25zdCB0b3BpYzEgPSBEYXRhTW9kZWwuVG9waWNzLmdldChDcmVhdGUubmV3U3luYXBzZS50b3BpYzFpZClcbiAgICAgIGNvbnN0IG5vZGUxID0gdG9waWMxLmdldCgnbm9kZScpXG4gICAgICBjb25zdCB0b3BpYzIgPSBEYXRhTW9kZWwuVG9waWNzLmdldChDcmVhdGUubmV3U3luYXBzZS50b3BpYzJpZClcbiAgICAgIGNvbnN0IG5vZGUyID0gdG9waWMyLmdldCgnbm9kZScpXG4gICAgICBDcmVhdGUubmV3U3luYXBzZS5oaWRlKClcbiAgICAgIHNlbGYucmVuZGVyU3luYXBzZShtYXBwaW5nLCBzeW5hcHNlLCBub2RlMSwgbm9kZTIpXG4gICAgICBFbmdpbmUucnVuTGF5b3V0KClcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFN5bmFwc2VcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBmcm9udGVuZC9zcmMvTWV0YW1hcHMvU3luYXBzZS5qcyJdLCJtYXBwaW5ncyI6Ijs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 355 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _values2 = __webpack_require__(151);var _values3 = _interopRequireDefault(_values2);var _get2 = __webpack_require__(118);var _get3 = _interopRequireDefault(_get2);var _each2 = __webpack_require__(137);var _each3 = _interopRequireDefault(_each2);var _find2 = __webpack_require__(28);var _find3 = _interopRequireDefault(_find2);var _templateObject = _taggedTemplateLiteral(['\\n        <ul>\\n          <li class=\"changeP toCommons\"><div class=\"rc-perm-icon\"></div>commons</li>\\n          <li class=\"changeP toPublic\"><div class=\"rc-perm-icon\"></div>public</li>\\n          <li class=\"changeP toPrivate\"><div class=\"rc-perm-icon\"></div>private</li>\\n        </ul>'], ['\\n        <ul>\\n          <li class=\"changeP toCommons\"><div class=\"rc-perm-icon\"></div>commons</li>\\n          <li class=\"changeP toPublic\"><div class=\"rc-perm-icon\"></div>public</li>\\n          <li class=\"changeP toPrivate\"><div class=\"rc-perm-icon\"></div>private</li>\\n        </ul>']),_templateObject2 = _taggedTemplateLiteral(['\\n        <li class=\"rc-permission\">\\n          <div class=\"rc-icon\"></div>\\n          Change permissions\\n          ', '\\n          <div class=\"expandLi\"></div>\\n        </li>'], ['\\n        <li class=\"rc-permission\">\\n          <div class=\"rc-icon\"></div>\\n          Change permissions\\n          ', '\\n          <div class=\"expandLi\"></div>\\n        </li>']),_templateObject3 = _taggedTemplateLiteral(['\\n        <ul id=\"fetchSiblingList\">\\n          <li class=\"fetchAll\">All<div class=\"rc-keyboard\">Alt+R</div></li>\\n          <li id=\"loadingSiblings\"></li>\\n        </ul>'], ['\\n        <ul id=\"fetchSiblingList\">\\n          <li class=\"fetchAll\">All<div class=\"rc-keyboard\">Alt+R</div></li>\\n          <li id=\"loadingSiblings\"></li>\\n        </ul>']),_templateObject4 = _taggedTemplateLiteral(['\\n        <ul>\\n          <li class=\"changeP toCommons\"><div class=\"rc-perm-icon\"></div>commons</li>\\n          <li class=\"changeP toPublic\"><div class=\"rc-perm-icon\"></div>public</li>           <li class=\"changeP toPrivate\"><div class=\"rc-perm-icon\"></div>private</li>         </ul>'], ['\\n        <ul>\\n          <li class=\"changeP toCommons\"><div class=\"rc-perm-icon\"></div>commons</li>\\n          <li class=\"changeP toPublic\"><div class=\"rc-perm-icon\"></div>public</li>           <li class=\"changeP toPrivate\"><div class=\"rc-perm-icon\"></div>private</li>         </ul>']);\n\n\nvar _outdent = __webpack_require__(148);var _outdent2 = _interopRequireDefault(_outdent);\n\nvar _JIT = __webpack_require__(170);var _JIT2 = _interopRequireDefault(_JIT);\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _Control = __webpack_require__(27);var _Control2 = _interopRequireDefault(_Control);\nvar _Create = __webpack_require__(173);var _Create2 = _interopRequireDefault(_Create);\nvar _DataModel = __webpack_require__(149);var _DataModel2 = _interopRequireDefault(_DataModel);\nvar _Engine = __webpack_require__(150);var _Engine2 = _interopRequireDefault(_Engine);\nvar _Filter = __webpack_require__(356);var _Filter2 = _interopRequireDefault(_Filter);\nvar _GlobalUI = __webpack_require__(362);var _GlobalUI2 = _interopRequireDefault(_GlobalUI);\nvar _Map = __webpack_require__(369);var _Map2 = _interopRequireDefault(_Map);\nvar _Mouse = __webpack_require__(352);var _Mouse2 = _interopRequireDefault(_Mouse);\nvar _Selected = __webpack_require__(353);var _Selected2 = _interopRequireDefault(_Selected);\nvar _Settings = __webpack_require__(572);var _Settings2 = _interopRequireDefault(_Settings);\nvar _Synapse = __webpack_require__(354);var _Synapse2 = _interopRequireDefault(_Synapse);\nvar _SynapseCard = __webpack_require__(569);var _SynapseCard2 = _interopRequireDefault(_SynapseCard);\nvar _Topic = __webpack_require__(571);var _Topic2 = _interopRequireDefault(_Topic);\nvar _TopicCard = __webpack_require__(566);var _TopicCard2 = _interopRequireDefault(_TopicCard);\nvar _Util = __webpack_require__(410);var _Util2 = _interopRequireDefault(_Util);\nvar _Visualize = __webpack_require__(561);var _Visualize2 = _interopRequireDefault(_Visualize);\nvar _clipboardJs = __webpack_require__(363);var _clipboardJs2 = _interopRequireDefault(_clipboardJs);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}function _taggedTemplateLiteral(strings, raw) {return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } }));} /* global $, Image, CanvasLoader */\n\nvar panningInt = void 0;\n\nvar JIT = {\n  tempInit: false,\n  tempNode: null,\n  tempNode2: null,\n  mouseDownPix: {},\n  dragFlag: 0,\n  dragTolerance: 0,\n  virtualPointer: {},\n\n  events: {\n    topicDrag: 'Metamaps:JIT:events:topicDrag',\n    pan: 'Metamaps:JIT:events:pan',\n    zoom: 'Metamaps:JIT:events:zoom',\n    animationDone: 'Metamaps:JIT:events:animationDone' },\n\n  vizData: [], // contains the visualization-compatible graph\n  /**\n   * This method will bind the event handlers it is interested and initialize the class.\n   */\n  init: function init(serverData) {\n    var self = JIT;\n\n    $('.zoomIn').click(self.zoomIn);\n    $('.zoomOut').click(self.zoomOut);\n\n    var zoomExtents = function zoomExtents(event) {\n      self.zoomExtents(event, _Visualize2.default.mGraph.canvas);\n    };\n    $('.zoomExtents').click(zoomExtents);\n\n    $('.takeScreenshot').click(_Map2.default.exportImage);\n\n    self.topicDescImage = new Image();\n    self.topicDescImage.src = serverData['topic_description_signifier.png'];\n\n    self.topicLinkImage = new Image();\n    self.topicLinkImage.src = serverData['topic_link_signifier.png'];\n  },\n  /**\n      * convert our topic JSON into something JIT can use\n      */\n  convertModelsToJIT: function convertModelsToJIT(topics, synapses) {\n    var jitReady = [];\n\n    var synapsesToRemove = [];\n    var mapping = void 0;\n    var node = void 0;\n    var nodes = {};\n    var existingEdge = void 0;\n    var edge = void 0;\n    var edges = [];\n\n    topics.each(function (t) {\n      node = t.createNode();\n      nodes[node.id] = node;\n    });\n    synapses.each(function (s) {\n      edge = s.createEdge();\n\n      if (topics.get(s.get('topic1_id')) === undefined || topics.get(s.get('topic2_id')) === undefined) {\n        // this means it's an invalid synapse\n        synapsesToRemove.push(s);\n      } else if (nodes[edge.nodeFrom] && nodes[edge.nodeTo]) {\n        existingEdge = (0, _find3.default)(edges, {\n          nodeFrom: edge.nodeFrom,\n          nodeTo: edge.nodeTo }) ||\n\n        (0, _find3.default)(edges, {\n          nodeFrom: edge.nodeTo,\n          nodeTo: edge.nodeFrom });\n\n\n        if (existingEdge) {\n          // for when you're dealing with multiple relationships between the same two topics\n          if (_Active2.default.Map) {\n            mapping = s.getMapping();\n            existingEdge.data['$mappingIDs'].push(mapping.id);\n          }\n          existingEdge.data['$synapseIDs'].push(s.id);\n        } else {\n          // for when you're dealing with a topic that has relationships to many different nodes\n          nodes[edge.nodeFrom].adjacencies.push(edge);\n          edges.push(edge);\n        }\n      }\n    });\n\n    (0, _each3.default)(nodes, function (node) {\n      jitReady.push(node);\n    });\n\n    return [jitReady, synapsesToRemove];\n  },\n  prepareVizData: function prepareVizData() {\n    var self = JIT;\n    var mapping = void 0;\n\n    // reset/empty vizData\n    self.vizData = [];\n    _Visualize2.default.loadLater = false;\n\n    var results = self.convertModelsToJIT(_DataModel2.default.Topics, _DataModel2.default.Synapses);\n\n    self.vizData = results[0];\n\n    // clean up the synapses array in case of any faulty data\n    (0, _each3.default)(results[1], function (synapse) {\n      mapping = synapse.getMapping();\n      _DataModel2.default.Synapses.remove(synapse);\n      if (_DataModel2.default.Mappings) _DataModel2.default.Mappings.remove(mapping);\n    });\n\n    // set up addTopic instructions in case they delete all the topics\n    // i.e. if there are 0 topics at any time, it should have instructions again\n    $('#instructions div').hide();\n    if (_Active2.default.Map && _Active2.default.Map.authorizeToEdit(_Active2.default.Mapper)) {\n      $('#instructions div.addTopic').show();\n    }\n\n    if (self.vizData.length === 0) {\n      _GlobalUI2.default.showDiv('#instructions');\n      _Visualize2.default.loadLater = true;\n    } else {\n      _GlobalUI2.default.hideDiv('#instructions');\n    }\n\n    _Visualize2.default.render();\n  }, // prepareVizData\n  edgeRender: function edgeRender(adj, canvas) {\n    // get nodes cartesian coordinates\n    var pos = adj.nodeFrom.pos.getc(true);\n    var posChild = adj.nodeTo.pos.getc(true);\n\n    var synapse = void 0;\n    if (adj.getData('displayIndex')) {\n      synapse = adj.getData('synapses')[adj.getData('displayIndex')];\n      if (!synapse) {\n        delete adj.data.$displayIndex;\n        synapse = adj.getData('synapses')[0];\n      }\n    } else {\n      synapse = adj.getData('synapses')[0];\n    }\n\n    if (!synapse) return; // this means there are no corresponding synapses for\n    // this edge, don't render it\n\n    // label placement on edges\n    if (canvas.denySelected) {\n      var color = _Settings2.default.colors.synapses.normal;\n      canvas.getCtx().fillStyle = canvas.getCtx().strokeStyle = color;\n    }\n    JIT.renderEdgeArrows(_JIT2.default.Graph.Plot.edgeHelper, adj, synapse, canvas);\n\n    // check for edge label in data\n    var desc = synapse.get('desc');\n\n    var showDesc = adj.getData('showDesc');\n\n    var drawSynapseCount = function drawSynapseCount(context, x, y, count) {\n      /*\n                                                                            circle size: 16x16px\n                                                                            positioning: overlay and center on top right corner of synapse label - 8px left and 8px down\n                                                                            color: #dab539\n                                                                            border color: #424242\n                                                                            border size: 1.5px\n                                                                            font: DIN medium\n                                                                            font-size: 14pt\n                                                                            font-color: #424242\n                                                                            */\n      context.beginPath();\n      context.arc(x, y, 8, 0, 2 * Math.PI, false);\n      context.fillStyle = '#DAB539';\n      context.strokeStyle = '#424242';\n      context.lineWidth = 1.5;\n      context.closePath();\n      context.fill();\n      context.stroke();\n\n      // add the synapse count\n      context.fillStyle = '#424242';\n      context.textAlign = 'center';\n      context.font = '14px din-medium';\n\n      context.fillText(count, x, y + 5);\n    };\n\n    if (!canvas.denySelected && desc !== '' && showDesc) {\n      // '&amp;' to '&'\n      desc = _Util2.default.decodeEntities(desc);\n\n      // now adjust the label placement\n      var ctx = canvas.getCtx();\n      ctx.font = 'bold 14px arial';\n      ctx.fillStyle = '#FFF';\n      ctx.textBaseline = 'alphabetic';\n\n      var arrayOfLabelLines = _Util2.default.splitLine(desc, 25).split('\\n');\n      var lineWidths = [];\n      for (var index = 0; index < arrayOfLabelLines.length; ++index) {\n        lineWidths.push(ctx.measureText(arrayOfLabelLines[index]).width);\n      }\n      var width = Math.max.apply(null, lineWidths) + 16;\n      var height = 16 * arrayOfLabelLines.length + 8;\n\n      var x = (pos.x + posChild.x - width) / 2;\n      var y = (pos.y + posChild.y) / 2 - height / 2;\n\n      var radius = 5;\n\n      // render background\n      ctx.beginPath();\n      ctx.moveTo(x + radius, y);\n      ctx.lineTo(x + width - radius, y);\n      ctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n      ctx.lineTo(x + width, y + height - radius);\n      ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n      ctx.lineTo(x + radius, y + height);\n      ctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n      ctx.lineTo(x, y + radius);\n      ctx.quadraticCurveTo(x, y, x + radius, y);\n      ctx.closePath();\n      ctx.fill();\n\n      // get number of synapses\n      var synapseNum = adj.getData('synapses').length;\n\n      // render text\n      ctx.fillStyle = '#424242';\n      ctx.textAlign = 'center';\n      for (var _index = 0; _index < arrayOfLabelLines.length; ++_index) {\n        ctx.fillText(arrayOfLabelLines[_index], x + width / 2, y + 18 + 16 * _index);\n      }\n\n      if (synapseNum > 1) {\n        drawSynapseCount(ctx, x + width, y, synapseNum);\n      }\n    } else if (!canvas.denySelected && showDesc) {\n      // get number of synapses\n      var _synapseNum = adj.getData('synapses').length;\n\n      if (_synapseNum > 1) {\n        var _ctx = canvas.getCtx();\n        var _x = (pos.x + posChild.x) / 2;\n        var _y = (pos.y + posChild.y) / 2;\n        drawSynapseCount(_ctx, _x, _y, _synapseNum);\n      }\n    }\n  }, // edgeRender\n  ForceDirected: {\n    animateSavedLayout: {\n      modes: ['linear'],\n      // TODO fix tests so we don't need _.get\n      transition: (0, _get3.default)(_JIT2.default, 'Trans.Quad.easeInOut'),\n      duration: 800,\n      onComplete: function onComplete() {\n        _Visualize2.default.mGraph.busy = false;\n        $(document).trigger(JIT.events.animationDone);\n      } },\n\n    animateFDLayout: {\n      modes: ['linear'],\n      // TODO fix tests so we don't need _.get\n      transition: (0, _get3.default)(_JIT2.default, 'Trans.Elastic.easeOut'),\n      duration: 800,\n      onComplete: function onComplete() {\n        _Visualize2.default.mGraph.busy = false;\n      } },\n\n    graphSettings: {\n      // id of the visualization container\n      injectInto: 'infovis',\n      // Enable zooming and panning\n      // by scrolling and DnD\n      Navigation: {\n        enable: true,\n        // Enable panning events only if we're dragging the empty\n        // canvas (and not a node).\n        panning: 'avoid nodes',\n        zooming: 28 // zoom speed. higher is more sensible\n      },\n      // Change node and edge styles such as\n      // color and width.\n      // These properties are also set per node\n      // with dollar prefixed data-properties in the\n      // JSON structure.\n      Node: {\n        overridable: true,\n        color: '#2D6A5D',\n        type: 'customNode',\n        dim: 25 },\n\n      Edge: {\n        overridable: true,\n        color: _Settings2.default.colors.synapses.normal,\n        type: 'customEdge',\n        lineWidth: 2,\n        alpha: 1 },\n\n      // Native canvas text styling\n      Label: {\n        type: 'Native', // Native or HTML\n        size: 20,\n        family: 'arial',\n        textBaseline: 'alphabetic',\n        color: _Settings2.default.colors.labels.text },\n\n      // Add Tips\n      Tips: {\n        enable: false,\n        onShow: function onShow(tip, node) {} },\n\n      // Add node events\n      Events: {\n        enable: true,\n        enableForEdges: true,\n        onMouseMove: function onMouseMove(node, eventInfo, e) {\n          JIT.onMouseMoveHandler(node, eventInfo, e);\n          // console.log('called mouse move handler')\n        },\n        // Update node positions when dragged\n        onDragMove: function onDragMove(node, eventInfo, e) {\n          JIT.onDragMoveTopicHandler(node, eventInfo, e);\n          // console.log('called drag move handler')\n        },\n        onDragEnd: function onDragEnd(node, eventInfo, e) {\n          JIT.onDragEndTopicHandler(node, eventInfo, e, false);\n          // console.log('called drag end handler')\n        },\n        onDragCancel: function onDragCancel(node, eventInfo, e) {\n          JIT.onDragCancelHandler(node, eventInfo, e, false);\n        },\n        // Implement the same handler for touchscreens\n        onTouchStart: function onTouchStart(node, eventInfo, e) {},\n        // Implement the same handler for touchscreens\n        onTouchMove: function onTouchMove(node, eventInfo, e) {\n          JIT.onDragMoveTopicHandler(node, eventInfo, e);\n        },\n        // Implement the same handler for touchscreens\n        onTouchEnd: function onTouchEnd(node, eventInfo, e) {},\n        // Implement the same handler for touchscreens\n        onTouchCancel: function onTouchCancel(node, eventInfo, e) {},\n        // Add also a click handler to nodes\n        onClick: function onClick(node, eventInfo, e) {\n          // remove the rightclickmenu\n          $('.rightclickmenu').remove();\n\n          if (_Mouse2.default.boxStartCoordinates) {\n            if (e.ctrlKey) {\n              _Visualize2.default.mGraph.busy = false;\n              _Mouse2.default.boxEndCoordinates = eventInfo.getPos();\n\n              var bS = _Mouse2.default.boxStartCoordinates;\n              var bE = _Mouse2.default.boxEndCoordinates;\n              if (Math.abs(bS.x - bE.x) > 20 && Math.abs(bS.y - bE.y) > 20) {\n                JIT.zoomToBox(e);\n                return;\n              } else {\n                _Mouse2.default.boxStartCoordinates = null;\n                _Mouse2.default.boxEndCoordinates = null;\n              }\n            }\n\n            if (e.shiftKey) {\n              _Visualize2.default.mGraph.busy = false;\n              _Mouse2.default.boxEndCoordinates = eventInfo.getPos();\n              JIT.selectWithBox(e);\n              return;\n            }\n          }\n\n          if (e.target.id !== 'infovis-canvas') return false;\n\n          // clicking on a edge, node, or clicking on blank part of canvas?\n          if (node.nodeFrom) {\n            JIT.selectEdgeOnClickHandler(node, e);\n          } else if (node && !node.nodeFrom) {\n            JIT.selectNodeOnClickHandler(node, e);\n            _Engine2.default.setFocusNode(node);\n          } else {\n            JIT.canvasClickHandler(eventInfo.getPos(), e);\n          } // if\n        },\n        // Add also a click handler to nodes\n        onRightClick: function onRightClick(node, eventInfo, e) {\n          // remove the rightclickmenu\n          $('.rightclickmenu').remove();\n\n          if (_Mouse2.default.boxStartCoordinates) {\n            _Create2.default.newSynapse.hide();\n            _Visualize2.default.mGraph.busy = false;\n            _Mouse2.default.boxEndCoordinates = eventInfo.getPos();\n            JIT.selectWithBox(e);\n            return;\n          }\n\n          if (e.target.id !== 'infovis-canvas') return false;\n\n          // clicking on a edge, node, or clicking on blank part of canvas?\n          if (node.nodeFrom) {\n            JIT.selectEdgeOnRightClickHandler(node, e);\n          } else if (node && !node.nodeFrom) {\n            JIT.selectNodeOnRightClickHandler(node, e);\n          } else {\n            // right click open space\n            _Create2.default.newSynapse.hide();\n          }\n        } },\n\n      // Number of iterations for the FD algorithm\n      iterations: 200,\n      // Edge length\n      levelDistance: 200 },\n\n    nodeSettings: {\n      'customNode': {\n        'render': function render(node, canvas) {\n          var pos = node.pos.getc(true);\n          var dim = node.getData('dim');\n          var topic = node.getData('topic');\n          var metacode = topic ? topic.getMetacode() : false;\n          var ctx = canvas.getCtx();\n\n          // if the topic is selected draw a circle around it\n          if (!canvas.denySelected && node.selected) {\n            ctx.beginPath();\n            ctx.arc(pos.x, pos.y, dim + 3, 0, 2 * Math.PI, false);\n            ctx.strokeStyle = _Settings2.default.colors.topics.selected;\n            ctx.lineWidth = 2;\n            ctx.stroke();\n          }\n\n          if (!metacode ||\n          !metacode.get('image') ||\n          !metacode.get('image').complete ||\n          typeof metacode.get('image').naturalWidth !== 'undefined' &&\n          metacode.get('image').naturalWidth === 0) {\n            ctx.beginPath();\n            ctx.arc(pos.x, pos.y, dim, 0, 2 * Math.PI, false);\n            ctx.fillStyle = '#B6B2FD';\n            ctx.fill();\n          } else {\n            ctx.drawImage(metacode.get('image'), pos.x - dim, pos.y - dim, dim * 2, dim * 2);\n          }\n\n          // if the topic has a link, draw a small image to indicate that\n          var hasLink = topic && topic.get('link') !== '' && topic.get('link') !== null;\n          var linkImage = JIT.topicLinkImage;\n          var linkImageLoaded = linkImage.complete ||\n          typeof linkImage.naturalWidth !== 'undefined' &&\n          linkImage.naturalWidth !== 0;\n          if (hasLink && linkImageLoaded) {\n            ctx.drawImage(linkImage, pos.x - dim - 8, pos.y - dim - 8, 16, 16);\n          }\n\n          // if the topic has a desc, draw a small image to indicate that\n          var hasDesc = topic && topic.get('desc') !== '' && topic.get('desc') !== null;\n          var descImage = JIT.topicDescImage;\n          var descImageLoaded = descImage.complete ||\n          typeof descImage.naturalWidth !== 'undefined' &&\n          descImage.naturalWidth !== 0;\n          if (hasDesc && descImageLoaded) {\n            ctx.drawImage(descImage, pos.x + dim - 8, pos.y - dim - 8, 16, 16);\n          }\n        },\n        'contains': function contains(node, pos) {\n          var npos = node.pos.getc(true);\n          var dim = node.getData('dim');\n          var arrayOfLabelLines = _Util2.default.splitLine(node.name, 25).split('\\n');\n          var ctx = _Visualize2.default.mGraph.canvas.getCtx();\n\n          var height = 25 * arrayOfLabelLines.length;\n\n          var lineWidths = [];\n          for (var index = 0; index < arrayOfLabelLines.length; ++index) {\n            lineWidths.push(ctx.measureText(arrayOfLabelLines[index]).width);\n          }\n          var width = Math.max.apply(null, lineWidths) + 8;\n          var labely = npos.y + node.getData('height') + 5 + height / 2;\n\n          var overLabel = this.nodeHelper.rectangle.contains({\n            x: npos.x,\n            y: labely },\n          pos, width, height);\n\n          return this.nodeHelper.circle.contains(npos, pos, dim) || overLabel;\n        } } },\n\n\n    edgeSettings: {\n      'customEdge': {\n        'render': function render(adj, canvas) {\n          JIT.edgeRender(adj, canvas);\n        },\n        'contains': function contains(adj, pos) {\n          var from = adj.nodeFrom.pos.getc();\n          var to = adj.nodeTo.pos.getc();\n\n          // this fixes an issue where when edges are perfectly horizontal or perfectly vertical\n          // it becomes incredibly difficult to hover over them\n          if (-1 < pos.x && pos.x < 1) pos.x = 0;\n          if (-1 < pos.y && pos.y < 1) pos.y = 0;\n\n          return _JIT2.default.Graph.Plot.edgeHelper.line.contains(from, to, pos, adj.Edge.epsilon + 5);\n        } } } },\n\n\n  // ForceDirected\n  ForceDirected3D: {\n    animate: {\n      modes: ['linear'],\n      // TODO fix tests so we don't need _.get\n      transition: (0, _get3.default)(_JIT2.default, 'Trans.Elastic.easeOut'),\n      duration: 2500,\n      onComplete: function onComplete() {\n        _Visualize2.default.mGraph.busy = false;\n      } },\n\n    graphSettings: {\n      // id of the visualization container\n      injectInto: 'infovis',\n      type: '3D',\n      Scene: {\n        Lighting: {\n          enable: false,\n          ambient: [0.5, 0.5, 0.5],\n          directional: {\n            direction: {\n              x: 1,\n              y: 0,\n              z: -1 },\n\n            color: [0.9, 0.9, 0.9] } } },\n\n\n\n      // Enable zooming and panning\n      // by scrolling and DnD\n      Navigation: {\n        enable: false,\n        // Enable panning events only if we're dragging the empty\n        // canvas (and not a node).\n        panning: 'avoid nodes',\n        zooming: 10 // zoom speed. higher is more sensible\n      },\n      // Change node and edge styles such as\n      // color and width.\n      // These properties are also set per node\n      // with dollar prefixed data-properties in the\n      // JSON structure.\n      Node: {\n        overridable: true,\n        type: 'sphere',\n        dim: 15,\n        color: '#ffffff' },\n\n      Edge: {\n        overridable: false,\n        type: 'tube',\n        color: '#111',\n        lineWidth: 3 },\n\n      // Native canvas text styling\n      Label: {\n        type: 'HTML', // Native or HTML\n        size: 10,\n        style: 'bold' },\n\n      // Add node events\n      Events: {\n        enable: true,\n        type: 'Native',\n        i: 0,\n        onMouseMove: function onMouseMove(node, eventInfo, e) {\n          // if(this.i++ % 3) return\n          var pos = eventInfo.getPos();\n          _Visualize2.default.cameraPosition.x += (pos.x - _Visualize2.default.cameraPosition.x) * 0.5;\n          _Visualize2.default.cameraPosition.y += (-pos.y - _Visualize2.default.cameraPosition.y) * 0.5;\n          _Visualize2.default.mGraph.plot();\n        },\n        onMouseWheel: function onMouseWheel(delta) {\n          _Visualize2.default.cameraPosition.z += -delta * 20;\n          _Visualize2.default.mGraph.plot();\n        },\n        onClick: function onClick() {} },\n\n      // Number of iterations for the FD algorithm\n      iterations: 200,\n      // Edge length\n      levelDistance: 100 },\n\n    nodeSettings: {},\n\n\n    edgeSettings: {} },\n\n\n  // ForceDirected3D\n  RGraph: {\n    animate: {\n      modes: ['polar'],\n      duration: 800,\n      onComplete: function onComplete() {\n        _Visualize2.default.mGraph.busy = false;\n      } },\n\n    // this will just be used to patch the ForceDirected graphsettings with the few things which actually differ\n    background: {\n      levelDistance: 200,\n      numberOfCircles: 4,\n      CanvasStyles: {\n        strokeStyle: '#333',\n        lineWidth: 1.5 } },\n\n\n    levelDistance: 200 },\n\n  onMouseEnter: function onMouseEnter(edge) {\n    var filtered = edge.getData('alpha') === 0;\n\n    // don't do anything if the edge is filtered\n    // or if the canvas is animating\n    if (filtered || _Visualize2.default.mGraph.busy) return;\n\n    $('canvas').css('cursor', 'pointer');\n    var edgeIsSelected = _Selected2.default.Edges.indexOf(edge);\n    // following if statement only executes if the edge being hovered over is not selected\n    if (edgeIsSelected === -1) {\n      edge.setData('showDesc', true, 'current');\n    }\n\n    edge.setDataset('end', {\n      lineWidth: 4 });\n\n    _Visualize2.default.mGraph.fx.animate({\n      modes: ['edge-property:lineWidth'],\n      duration: 100 });\n\n    _Visualize2.default.mGraph.plot();\n  }, // onMouseEnter\n  onMouseLeave: function onMouseLeave(edge) {\n    if (edge.getData('alpha') === 0) return; // don't do anything if the edge is filtered\n    $('canvas').css('cursor', 'default');\n    var edgeIsSelected = _Selected2.default.Edges.indexOf(edge);\n    // following if statement only executes if the edge being hovered over is not selected\n    if (edgeIsSelected === -1) {\n      edge.setData('showDesc', false, 'current');\n    }\n\n    edge.setDataset('end', {\n      lineWidth: 2 });\n\n    _Visualize2.default.mGraph.fx.animate({\n      modes: ['edge-property:lineWidth'],\n      duration: 100 });\n\n    _Visualize2.default.mGraph.plot();\n  }, // onMouseLeave\n  onMouseMoveHandler: function onMouseMoveHandler(_node, eventInfo, e) {\n    var self = JIT;\n\n    if (_Visualize2.default.mGraph.busy) return;\n\n    var node = eventInfo.getNode();\n    var edge = eventInfo.getEdge();\n\n    // if we're on top of a node object, act like there aren't edges under it\n    if (node !== false) {\n      if (_Mouse2.default.edgeHoveringOver) {\n        self.onMouseLeave(_Mouse2.default.edgeHoveringOver);\n      }\n      $('canvas').css('cursor', 'pointer');\n      return;\n    }\n\n    if (edge === false && _Mouse2.default.edgeHoveringOver !== false) {\n      // mouse not on an edge, but we were on an edge previously\n      self.onMouseLeave(_Mouse2.default.edgeHoveringOver);\n    } else if (edge !== false && _Mouse2.default.edgeHoveringOver === false) {\n      // mouse is on an edge, but there isn't a stored edge\n      self.onMouseEnter(edge);\n    } else if (edge !== false && _Mouse2.default.edgeHoveringOver !== edge) {\n      // mouse is on an edge, but a different edge is stored\n      self.onMouseLeave(_Mouse2.default.edgeHoveringOver);\n      self.onMouseEnter(edge);\n    }\n\n    // could be false\n    _Mouse2.default.edgeHoveringOver = edge;\n\n    if (!node && !edge) {\n      $('canvas').css('cursor', 'default');\n    }\n  }, // onMouseMoveHandler\n  enterKeyHandler: function enterKeyHandler(e) {\n    var creatingMap = _GlobalUI2.default.lightbox;\n    if (creatingMap === 'newmap' || creatingMap === 'forkmap') {\n      _GlobalUI2.default.CreateMap.submit();\n    } else if (e.target.id === 'topic_name' && !_Create2.default.newTopic.metacodeSelectorOpen) {\n      _Topic2.default.createTopicLocally();\n    } else if (_Create2.default.newSynapse.beingCreated) {\n      _Synapse2.default.createSynapseLocally(_Create2.default.newSynapse.topic1id, _Create2.default.newSynapse.topic2id);\n      _Engine2.default.runLayout();\n      _Create2.default.newSynapse.hide();\n    }\n  }, // enterKeyHandler\n  escKeyHandler: function escKeyHandler() {\n    _Control2.default.deselectAllEdges();\n    _Control2.default.deselectAllNodes();\n  }, // escKeyHandler\n  onDragMoveTopicHandler: function onDragMoveTopicHandler(node, eventInfo, e) {\n    var self = JIT;\n\n    var authorized = _Active2.default.Map && _Active2.default.Map.authorizeToEdit(_Active2.default.Mapper);\n\n    if (node && !node.nodeFrom) {\n\n      var pos = eventInfo.getPos();\n      if ((e.button === 0 || e.buttons === 0) && authorized) {\n        // start synapse creation  ->second option is for firefox\n        if (JIT.tempInit === false) {\n          JIT.tempNode = node;\n          JIT.tempInit = true;\n          _Create2.default.newSynapse.hide();\n          // set the draw synapse start positions\n          _Mouse2.default.synapseStartCoordinates = [];\n          if (_Selected2.default.Nodes.length) {\n            _Selected2.default.Nodes.forEach(function (n) {\n              _Mouse2.default.synapseStartCoordinates.push({\n                x: n.pos.getc().x,\n                y: n.pos.getc().y });\n\n            });\n          } else\n          {\n            _Mouse2.default.synapseStartCoordinates = [{\n              x: node.pos.getc().x,\n              y: node.pos.getc().y }];\n\n          }\n          _Mouse2.default.synapseEndCoordinates = {\n            x: pos.x,\n            y: pos.y };\n\n        }\n        //\n        var temp = eventInfo.getNode();\n        if (temp !== false && temp.id !== node.id && _Selected2.default.Nodes.indexOf(temp) === -1) {// this means a Node has been returned\n          JIT.tempNode2 = temp;\n          _Mouse2.default.synapseEndCoordinates = {\n            x: JIT.tempNode2.pos.getc().x,\n            y: JIT.tempNode2.pos.getc().y };\n\n          // before making the highlighted one bigger, make sure all the others are regular size\n          _Visualize2.default.mGraph.graph.eachNode(function (n) {\n            n.setData('dim', 25, 'current');\n          });\n          temp.setData('dim', 35, 'current');\n        } else if (!temp) {\n          JIT.tempNode2 = null;\n          _Mouse2.default.synapseEndCoordinates = {\n            x: pos.x,\n            y: pos.y };\n\n          _Visualize2.default.mGraph.graph.eachNode(function (n) {\n            n.setData('dim', 25, 'current');\n          });\n        }\n      }\n    }\n    _Visualize2.default.mGraph.plot();\n  }, // onDragMoveTopicHandler\n  onDragCancelHandler: function onDragCancelHandler(node, eventInfo, e) {\n    JIT.tempNode = null;\n    if (JIT.tempNode2) JIT.tempNode2.setData('dim', 25, 'current');\n    JIT.tempNode2 = null;\n    JIT.tempInit = false;\n    // reset the draw synapse positions to false\n    _Mouse2.default.synapseStartCoordinates = [];\n    _Mouse2.default.synapseEndCoordinates = null;\n    _Visualize2.default.mGraph.plot();\n  }, // onDragCancelHandler\n  onDragEndTopicHandler: function onDragEndTopicHandler(node, eventInfo, e) {\n    var self = JIT;\n    var midpoint = {};\n    var pixelPos = void 0;\n    var mapping = void 0;\n\n    if (JIT.tempInit && JIT.tempNode2 === null) {\n      _Mouse2.default.synapseEndCoordinates = null;\n    } else if (JIT.tempInit && JIT.tempNode2 !== null) {\n      // this means you want to create a synapse between two existing topics\n      _Create2.default.newSynapse.topic1id = JIT.tempNode.getData('topic').id;\n      _Create2.default.newSynapse.topic2id = JIT.tempNode2.getData('topic').id;\n      _Create2.default.newSynapse.node1 = JIT.tempNode;\n      _Create2.default.newSynapse.node2 = JIT.tempNode2;\n      JIT.tempNode2.setData('dim', 25, 'current');\n      midpoint.x = JIT.tempNode.pos.getc().x + (JIT.tempNode2.pos.getc().x - JIT.tempNode.pos.getc().x) / 2;\n      midpoint.y = JIT.tempNode.pos.getc().y + (JIT.tempNode2.pos.getc().y - JIT.tempNode.pos.getc().y) / 2;\n      pixelPos = _Util2.default.coordsToPixels(_Visualize2.default.mGraph, midpoint);\n      $('#new_synapse').css('left', pixelPos.x + 'px');\n      $('#new_synapse').css('top', pixelPos.y + 'px');\n      _Create2.default.newSynapse.open();\n      JIT.tempNode = null;\n      JIT.tempNode2 = null;\n      JIT.tempInit = false;\n    }\n    _Visualize2.default.mGraph.plot();\n  }, // onDragEndTopicHandler\n  canvasClickHandler: function canvasClickHandler(canvasLoc, e) {\n    // grab the location and timestamp of the click\n    var storedTime = _Mouse2.default.lastCanvasClick;\n    var now = Date.now(); // not compatible with IE8 FYI\n    _Mouse2.default.lastCanvasClick = now;\n\n    var authorized = _Active2.default.Map && _Active2.default.Map.authorizeToEdit(_Active2.default.Mapper);\n\n    if (now - storedTime < _Mouse2.default.DOUBLE_CLICK_TOLERANCE && !_Mouse2.default.didPan) {\n      // DOUBLE CLICK\n    } else if (!_Mouse2.default.didPan) {\n      // SINGLE CLICK, no pan\n      _Filter2.default.close();\n      _TopicCard2.default.hideCard();\n      _SynapseCard2.default.hideCard();\n      $('.rightclickmenu').remove();\n      // reset the draw synapse positions to false\n      _Mouse2.default.synapseStartCoordinates = [];\n      _Mouse2.default.synapseEndCoordinates = null;\n      JIT.tempInit = false;\n      JIT.tempNode = null;\n      JIT.tempNode2 = null;\n      if (!e.ctrlKey && !e.shiftKey) {\n        _Control2.default.deselectAllEdges();\n        _Control2.default.deselectAllNodes();\n      }\n    } else {\n      // SINGLE CLICK, resulting from pan\n    }\n  }, // canvasClickHandler\n  updateTopicPositions: function updateTopicPositions(node, pos) {\n    var len = _Selected2.default.Nodes.length;\n    // this is used to send nodes that are moving to\n    // other realtime collaborators on the same map\n    var positionsToSend = {};\n\n    // first define offset for each node\n    var xOffset = [];\n    var yOffset = [];\n    for (var i = 0; i < len; i += 1) {\n      var n = _Selected2.default.Nodes[i];\n      xOffset[i] = n.pos.getc().x - node.pos.getc().x;\n      yOffset[i] = n.pos.getc().y - node.pos.getc().y;\n    } // for\n\n    for (var _i = 0; _i < len; _i += 1) {\n      var _n = _Selected2.default.Nodes[_i];\n      var x = pos.x + xOffset[_i];\n      var y = pos.y + yOffset[_i];\n      if (_n.pos.rho || _n.pos.rho === 0) {\n        // this means we're in topic view\n        var rho = Math.sqrt(x * x + y * y);\n        var theta = Math.atan2(y, x);\n        _n.pos.setp(theta, rho);\n      } else {\n        _n.pos.setc(x, y);\n      }\n\n      if (_Active2.default.Map) {\n        var topic = _n.getData('topic');\n        // we use the topic ID not the node id\n        // because we can't depend on the node id\n        // to be the same as on other collaborators\n        // maps\n        positionsToSend[topic.id] = _n.pos;\n      }\n    } // for\n\n    if (_Active2.default.Map) {\n      $(document).trigger(JIT.events.topicDrag, [positionsToSend]);\n    }\n  },\n\n  nodeDoubleClickHandler: function nodeDoubleClickHandler(node, e) {\n    _TopicCard2.default.showCard(node);\n  }, // nodeDoubleClickHandler\n  edgeDoubleClickHandler: function edgeDoubleClickHandler(adj, e) {\n    _SynapseCard2.default.showCard(adj, e);\n  }, // nodeDoubleClickHandler\n  nodeWasDoubleClicked: function nodeWasDoubleClicked() {\n    // grab the timestamp of the click\n    var storedTime = _Mouse2.default.lastNodeClick;\n    var now = Date.now(); // not compatible with IE8 FYI\n    _Mouse2.default.lastNodeClick = now;\n\n    if (now - storedTime < _Mouse2.default.DOUBLE_CLICK_TOLERANCE) {\n      return true;\n    } else {\n      return false;\n    }\n  }, // nodeWasDoubleClicked\n  handleSelectionBeforeDragging: function handleSelectionBeforeDragging(node, e) {\n    if (_Selected2.default.Nodes.length === 0) {\n      _Control2.default.selectNode(node, e);\n    }\n    if (_Selected2.default.Nodes.indexOf(node) === -1) {\n      if (e.shiftKey) {\n        _Control2.default.selectNode(node, e);\n      } else {\n        _Control2.default.deselectAllEdges();\n        _Control2.default.deselectAllNodes();\n        _Control2.default.selectNode(node, e);\n      }\n    }\n  }, //  handleSelectionBeforeDragging\n  getNodeXY: function getNodeXY(node) {\n    if (typeof node.pos.x === 'number' && typeof node.pos.y === 'number') {\n      return node.pos;\n    } else if (typeof node.pos.theta === 'number' && typeof node.pos.rho === 'number') {\n      return new _JIT2.default.Polar(node.pos.theta, node.pos.rho).getc(true);\n    } else {\n      console.error('getNodeXY: unrecognized node pos format');\n      return {};\n    }\n  },\n  selectWithBox: function selectWithBox(e) {\n    var self = this;\n    var sX = _Mouse2.default.boxStartCoordinates.x;\n    var sY = _Mouse2.default.boxStartCoordinates.y;\n    var eX = _Mouse2.default.boxEndCoordinates.x;\n    var eY = _Mouse2.default.boxEndCoordinates.y;\n\n    if (!e.shiftKey) {\n      _Control2.default.deselectAllNodes();\n      _Control2.default.deselectAllEdges();\n    }\n\n    // select all nodes that are within the box\n    _Visualize2.default.mGraph.graph.eachNode(function (n) {\n      var pos = self.getNodeXY(n);\n      var x = pos.x;\n      var y = pos.y;\n\n      // depending on which way the person dragged the box, check that\n      // x and y are between the start and end values of the box\n      if (sX < x && x < eX && sY < y && y < eY ||\n      sX > x && x > eX && sY > y && y > eY ||\n      sX > x && x > eX && sY < y && y < eY ||\n      sX < x && x < eX && sY > y && y > eY) {\n        if (e.shiftKey) {\n          if (n.selected) {\n            _Control2.default.deselectNode(n);\n          } else {\n            _Control2.default.selectNode(n, e);\n          }\n        } else {\n          _Control2.default.selectNode(n, e);\n        }\n      }\n    });\n\n    // Convert selection box coordinates to traditional coordinates (+,+) in upper right\n    sY = -1 * sY;\n    eY = -1 * eY;\n\n    var edgesToToggle = [];\n    _DataModel2.default.Synapses.each(function (synapse) {\n      var e = synapse.get('edge');\n      if (edgesToToggle.indexOf(e) === -1) {\n        edgesToToggle.push(e);\n      }\n    });\n    edgesToToggle.forEach(function (edge) {\n      var fromNodePos = self.getNodeXY(edge.nodeFrom);\n      var fromNodeX = fromNodePos.x;\n      var fromNodeY = -1 * fromNodePos.y;\n      var toNodePos = self.getNodeXY(edge.nodeTo);\n      var toNodeX = toNodePos.x;\n      var toNodeY = -1 * toNodePos.y;\n\n      var maxX = fromNodeX;\n      var maxY = fromNodeY;\n      var minX = fromNodeX;\n      var minY = fromNodeY\n\n      // Correct maxX, MaxY values\n      ;toNodeX > maxX ? maxX = toNodeX : minX = toNodeX;\n      toNodeY > maxY ? maxY = toNodeY : minY = toNodeY;\n\n      var maxBoxX = sX;\n      var maxBoxY = sY;\n      var minBoxX = sX;\n      var minBoxY = sY\n\n      // Correct maxBoxX, maxBoxY values\n      ;eX > maxBoxX ? maxBoxX = eX : minBoxX = eX;\n      eY > maxBoxY ? maxBoxY = eY : minBoxY = eY;\n\n      // Find the slopes from the synapse fromNode to the 4 corners of the selection box\n      var slopes = [];\n      slopes.push((sY - fromNodeY) / (sX - fromNodeX));\n      slopes.push((sY - fromNodeY) / (eX - fromNodeX));\n      slopes.push((eY - fromNodeY) / (eX - fromNodeX));\n      slopes.push((eY - fromNodeY) / (sX - fromNodeX));\n\n      var minSlope = slopes[0];\n      var maxSlope = slopes[0];\n      slopes.forEach(function (entry) {\n        if (entry > maxSlope) maxSlope = entry;\n        if (entry < minSlope) minSlope = entry;\n      });\n\n      // Find synapse-in-question's slope\n      var synSlope = (toNodeY - fromNodeY) / (toNodeX - fromNodeX);\n      var b = fromNodeY - synSlope * fromNodeX;\n\n      // Use the selection box edges as test cases for synapse intersection\n      var testX = sX;\n      var testY = synSlope * testX + b;\n\n      var selectTest = void 0;\n\n      if (testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testY >= minBoxY && testY <= maxBoxY) {\n        selectTest = true;\n      }\n\n      testX = eX;\n      testY = synSlope * testX + b;\n\n      if (testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testY >= minBoxY && testY <= maxBoxY) {\n        selectTest = true;\n      }\n\n      testY = sY;\n      testX = (testY - b) / synSlope;\n\n      if (testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testX >= minBoxX && testX <= maxBoxX) {\n        selectTest = true;\n      }\n\n      testY = eY;\n      testX = (testY - b) / synSlope;\n\n      if (testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testX >= minBoxX && testX <= maxBoxX) {\n        selectTest = true;\n      }\n\n      // Case where the synapse is wholly enclosed in the seldction box\n      if (fromNodeX >= minBoxX && fromNodeX <= maxBoxX && fromNodeY >= minBoxY && fromNodeY <= maxBoxY && toNodeX >= minBoxX && toNodeX <= maxBoxX && toNodeY >= minBoxY && toNodeY <= maxBoxY) {\n        selectTest = true;\n      }\n\n      // The test synapse was selected!\n\n      if (selectTest) {\n        // shiftKey = toggleSelect, otherwise\n        if (e.shiftKey) {\n          if (_Selected2.default.Edges.indexOf(edge) !== -1) {\n            _Control2.default.deselectEdge(edge);\n          } else {\n            _Control2.default.selectEdge(edge);\n          }\n        } else {\n          _Control2.default.selectEdge(edge);\n        }\n      }\n    });\n    _Mouse2.default.boxStartCoordinates = false;\n    _Mouse2.default.boxEndCoordinates = false;\n    _Visualize2.default.mGraph.plot();\n  }, // selectWithBox\n  selectNodeOnClickHandler: function selectNodeOnClickHandler(node, e) {\n    if (_Visualize2.default.mGraph.busy) return;\n\n    var self = JIT;\n\n    // Copy topic title to clipboard\n    if (e.button === 1 && e.ctrlKey) _clipboardJs2.default.copy(node.name);\n\n    // catch right click on mac, which is often like ctrl+click\n    if (navigator.platform.indexOf('Mac') !== -1 && e.ctrlKey) {\n      self.selectNodeOnRightClickHandler(node, e);\n      return;\n    }\n\n    // if on a topic page, let alt+click center you on a new topic\n    if (_Active2.default.Topic && e.altKey) {\n      JIT.RGraph.centerOn(node.id);\n      return;\n    }\n\n    var check = self.nodeWasDoubleClicked();\n    if (check) {\n      self.nodeDoubleClickHandler(node, e);\n      return;\n    } else {\n      // wait a certain length of time, then check again, then run this code\n      setTimeout(function () {\n        if (!JIT.nodeWasDoubleClicked()) {\n          if (e.button === 1 && !e.ctrlKey) {\n            var len = _Selected2.default.Nodes.length;\n\n            for (var i = 0; i < len; i += 1) {\n              var n = _Selected2.default.Nodes[i];\n              var result = _Util2.default.openLink(_DataModel2.default.Topics.get(n.id).attributes.link);\n\n              if (!result) {// if link failed to open\n                break;\n              }\n            }\n\n            if (!node.selected) _Util2.default.openLink(_DataModel2.default.Topics.get(node.id).attributes.link);\n          }\n        }\n      }, _Mouse2.default.DOUBLE_CLICK_TOLERANCE);\n    }\n  }, // selectNodeOnClickHandler\n  selectNodeOnRightClickHandler: function selectNodeOnRightClickHandler(node, e) {\n    // the 'node' variable is a JIT node, the one that was clicked on\n    // the 'e' variable is the click event\n\n    e.preventDefault();\n    e.stopPropagation();\n\n    if (_Visualize2.default.mGraph.busy) return;\n\n    // select the node\n    _Control2.default.selectNode(node, e);\n\n    // delete old right click menu\n    $('.rightclickmenu').remove();\n    // create new menu for clicked on node\n    var rightclickmenu = document.createElement('div');\n    rightclickmenu.className = 'rightclickmenu';\n    // prevent the custom context menu from immediately opening the default context menu as well\n    rightclickmenu.setAttribute('oncontextmenu', 'return false');\n\n    // add the proper options to the menu\n    var menustring = '<ul>';\n\n    var authorized = _Active2.default.Map && _Active2.default.Map.authorizeToEdit(_Active2.default.Mapper);\n\n    var disabled = authorized ? '' : 'disabled';\n\n    if (_Active2.default.Map) menustring += '<li class=\"rc-hide\"><div class=\"rc-icon\"></div>Hide until refresh<div class=\"rc-keyboard\">Ctrl+H</div></li>';\n    if (_Active2.default.Map && _Active2.default.Mapper) menustring += '<li class=\"rc-remove ' + disabled + '\"><div class=\"rc-icon\"></div>Remove from map<div class=\"rc-keyboard\">Ctrl+M</div></li>';\n    if (_Active2.default.Topic) menustring += '<li class=\"rc-remove\"><div class=\"rc-icon\"></div>Remove from view<div class=\"rc-keyboard\">Ctrl+M</div></li>';\n    if (_Active2.default.Map && _Active2.default.Mapper) menustring += '<li class=\"rc-delete ' + disabled + '\"><div class=\"rc-icon\"></div>Delete<div class=\"rc-keyboard\">Ctrl+D</div></li>';\n\n    if (_Active2.default.Topic) {\n      menustring += '<li class=\"rc-center\"><div class=\"rc-icon\"></div>Center this topic<div class=\"rc-keyboard\">Alt+E</div></li>';\n    }\n\n    menustring += '<li class=\"rc-popout\"><div class=\"rc-icon\"></div>Open in new tab</li>';\n\n    if (_Active2.default.Mapper) {\n      var options = (0, _outdent2.default)(_templateObject);\n\n\n\n\n\n\n      menustring += '<li class=\"rc-spacer\"></li>';\n\n      menustring += (0, _outdent2.default)(_templateObject2,\n\n\n\n      options);\n\n\n\n      var metacodeOptions = $('#metacodeOptions').html();\n\n      menustring += '<li class=\"rc-metacode\"><div class=\"rc-icon\"></div>Change metacode' + metacodeOptions + '<div class=\"expandLi\"></div></li>';\n    }\n    if (_Active2.default.Topic) {\n      if (!_Active2.default.Mapper) {\n        menustring += '<li class=\"rc-spacer\"></li>';\n      }\n\n      // set up the get sibling menu as a \"lazy load\"\n      // only fill in the submenu when they hover over the get siblings list item\n      var siblingMenu = (0, _outdent2.default)(_templateObject3);\n\n\n\n\n      menustring += '<li class=\"rc-siblings\"><div class=\"rc-icon\"></div>Reveal siblings' + siblingMenu + '<div class=\"expandLi\"></div></li>';\n    }\n\n    menustring += '</ul>';\n    rightclickmenu.innerHTML = menustring;\n\n    // position the menu where the click happened\n    var position = {};\n    var RIGHTCLICK_WIDTH = 300;\n    var RIGHTCLICK_HEIGHT = 144; // this does vary somewhat, but we can use static\n    var SUBMENUS_WIDTH = 256;\n    var MAX_SUBMENU_HEIGHT = 270;\n    var windowWidth = $(window).width();\n    var windowHeight = $(window).height();\n\n    if (windowWidth - e.clientX < SUBMENUS_WIDTH) {\n      position.right = windowWidth - e.clientX;\n      $(rightclickmenu).addClass('moveMenusToLeft');\n    } else if (windowWidth - e.clientX < RIGHTCLICK_WIDTH) {\n      position.right = windowWidth - e.clientX;\n    } else if (windowWidth - e.clientX < RIGHTCLICK_WIDTH + SUBMENUS_WIDTH) {\n      position.left = e.clientX;\n      $(rightclickmenu).addClass('moveMenusToLeft');\n    } else {\n      position.left = e.clientX;\n    }\n\n    if (windowHeight - e.clientY < MAX_SUBMENU_HEIGHT) {\n      position.bottom = windowHeight - e.clientY;\n      $(rightclickmenu).addClass('moveMenusUp');\n    } else if (windowHeight - e.clientY < RIGHTCLICK_HEIGHT + MAX_SUBMENU_HEIGHT) {\n      position.top = e.clientY;\n      $(rightclickmenu).addClass('moveMenusUp');\n    } else {\n      position.top = e.clientY;\n    }\n\n    $(rightclickmenu).css(position);\n    // add the menu to the page\n    $('#wrapper').append(rightclickmenu);\n\n    // attach events to clicks on the list items\n\n    // delete the selected things from the database\n    if (authorized) {\n      $('.rc-delete').click(function () {\n        $('.rightclickmenu').remove();\n        _Control2.default.deleteSelected();\n      });\n    }\n\n    // remove the selected things from the map\n    if (_Active2.default.Topic || authorized) {\n      $('.rc-remove').click(function () {\n        $('.rightclickmenu').remove();\n        _Control2.default.removeSelectedEdges();\n        _Control2.default.removeSelectedNodes();\n      });\n    }\n\n    // hide selected nodes and synapses until refresh\n    $('.rc-hide').click(function () {\n      $('.rightclickmenu').remove();\n      _Control2.default.hideSelectedEdges();\n      _Control2.default.hideSelectedNodes();\n    });\n\n    // when in radial, center on the topic you picked\n    $('.rc-center').click(function () {\n      $('.rightclickmenu').remove();\n      _Topic2.default.centerOn(node.id);\n    });\n\n    // open the entity in a new tab\n    $('.rc-popout').click(function () {\n      $('.rightclickmenu').remove();\n      var win = window.open('/topics/' + node.id, '_blank');\n      win.focus();\n    });\n\n    // change the permission of all the selected nodes and synapses that you were the originator of\n    $('.rc-permission li').click(function () {\n      $('.rightclickmenu').remove();\n      // $(this).text() will be 'commons' 'public' or 'private'\n      _Control2.default.updateSelectedPermissions($(this).text());\n    });\n\n    // change the metacode of all the selected nodes that you have edit permission for\n    $('.rc-metacode li li').click(function () {\n      $('.rightclickmenu').remove();\n      //\n      _Control2.default.updateSelectedMetacodes($(this).attr('data-id'));\n    });\n\n    // fetch relatives\n    var fetchSent = false;\n    $('.rc-siblings').hover(function () {\n      if (!fetchSent) {\n        JIT.populateRightClickSiblings(node);\n        fetchSent = true;\n      }\n    });\n    $('.rc-siblings .fetchAll').click(function () {\n      $('.rightclickmenu').remove();\n      // data-id is a metacode id\n      _Topic2.default.fetchRelatives(node);\n    });\n  }, // selectNodeOnRightClickHandler,\n  populateRightClickSiblings: function populateRightClickSiblings(node) {\n    // depending on how many topics are selected, do different things\n    var topic = node.getData('topic');\n\n    // add a loading icon for now\n    var loader = new CanvasLoader('loadingSiblings');\n    loader.setColor('#4FC059'); // default is '#000000'\n    loader.setDiameter(15); // default is 40\n    loader.setDensity(41); // default is 40\n    loader.setRange(0.9); // default is 1.3\n    loader.show(); // Hidden by default\n\n    var topics = _DataModel2.default.Topics.map(function (t) {return t.id;});\n    var topicsString = topics.join();\n\n    var successCallback = function successCallback(data) {\n      $('#loadingSiblings').remove();\n\n      for (var key in data) {\n        var string = _DataModel2.default.Metacodes.get(key).get('name') + ' (' + data[key] + ')';\n        $('#fetchSiblingList').append('<li class=\"getSiblings\" data-id=\"' + key + '\">' + string + '</li>');\n      }\n\n      $('.rc-siblings .getSiblings').click(function () {\n        $('.rightclickmenu').remove();\n        // data-id is a metacode id\n        _Topic2.default.fetchRelatives(node, $(this).attr('data-id'));\n      });\n    };\n\n    $.ajax({\n      type: 'GET',\n      url: '/topics/' + topic.id + '/relative_numbers.json?network=' + topicsString,\n      success: successCallback,\n      error: function error() {} });\n\n  },\n  selectEdgeOnClickHandler: function selectEdgeOnClickHandler(adj, e) {\n    if (_Visualize2.default.mGraph.busy) return;\n\n    var self = JIT;\n    var synapseText = adj.data.$synapses[0].attributes.desc;\n    // Copy synapse label to clipboard\n    if (e.button === 1 && e.ctrlKey && synapseText !== '') _clipboardJs2.default.copy(synapseText);\n\n    // catch right click on mac, which is often like ctrl+click\n    if (navigator.platform.indexOf('Mac') !== -1 && e.ctrlKey) {\n      self.selectEdgeOnRightClickHandler(adj, e);\n      return;\n    }\n\n    var check = self.nodeWasDoubleClicked();\n    if (check) {\n      self.edgeDoubleClickHandler(adj, e);\n      return;\n    } else {\n      // wait a certain length of time, then check again, then run this code\n      setTimeout(function () {\n        if (!JIT.nodeWasDoubleClicked()) {\n          var edgeAlreadySelected = _Selected2.default.Edges.indexOf(adj) !== -1;\n\n          if (!e.shiftKey) {\n            _Control2.default.deselectAllNodes();\n            _Control2.default.deselectAllEdges();\n          }\n\n          if (edgeAlreadySelected) {\n            _Control2.default.deselectEdge(adj);\n          } else {\n            _Control2.default.selectEdge(adj);\n          }\n\n          _Visualize2.default.mGraph.plot();\n        }\n      }, _Mouse2.default.DOUBLE_CLICK_TOLERANCE);\n    }\n  }, // selectEdgeOnClickHandler\n  selectEdgeOnRightClickHandler: function selectEdgeOnRightClickHandler(adj, e) {\n    // the 'node' variable is a JIT node, the one that was clicked on\n    // the 'e' variable is the click event\n\n    if (adj.getData('alpha') === 0) return; // don't do anything if the edge is filtered\n\n    e.preventDefault();\n    e.stopPropagation();\n\n    if (_Visualize2.default.mGraph.busy) return;\n\n    _Control2.default.selectEdge(adj);\n\n    // delete old right click menu\n    $('.rightclickmenu').remove();\n    // create new menu for clicked on node\n    var rightclickmenu = document.createElement('div');\n    rightclickmenu.className = 'rightclickmenu';\n    // prevent the custom context menu from immediately opening the default context menu as well\n    rightclickmenu.setAttribute('oncontextmenu', 'return false');\n\n    // add the proper options to the menu\n    var menustring = '<ul>';\n\n    var authorized = _Active2.default.Map && _Active2.default.Map.authorizeToEdit(_Active2.default.Mapper);\n\n    var disabled = authorized ? '' : 'disabled';\n\n    if (_Active2.default.Map) menustring += '<li class=\"rc-hide\"><div class=\"rc-icon\"></div>Hide until refresh<div class=\"rc-keyboard\">Ctrl+H</div></li>';\n    if (_Active2.default.Map && _Active2.default.Mapper) menustring += '<li class=\"rc-remove ' + disabled + '\"><div class=\"rc-icon\"></div>Remove from map<div class=\"rc-keyboard\">Ctrl+M</div></li>';\n    if (_Active2.default.Topic) menustring += '<li class=\"rc-remove\"><div class=\"rc-icon\"></div>Remove from view<div class=\"rc-keyboard\">Ctrl+M</div></li>';\n    if (_Active2.default.Map && _Active2.default.Mapper) menustring += '<li class=\"rc-delete ' + disabled + '\"><div class=\"rc-icon\"></div>Delete<div class=\"rc-keyboard\">Ctrl+D</div></li>';\n\n    if (_Active2.default.Map && _Active2.default.Mapper) menustring += '<li class=\"rc-spacer\"></li>';\n\n    if (_Active2.default.Mapper) {\n      var permOptions = (0, _outdent2.default)(_templateObject4);\n\n\n\n\n      menustring += '<li class=\"rc-permission\"><div class=\"rc-icon\"></div>Change permissions' + permOptions + '<div class=\"expandLi\"></div></li>';\n    }\n\n    menustring += '</ul>';\n    rightclickmenu.innerHTML = menustring;\n\n    // position the menu where the click happened\n    var position = {};\n    var RIGHTCLICK_WIDTH = 300;\n    var RIGHTCLICK_HEIGHT = 144; // this does vary somewhat, but we can use static\n    var SUBMENUS_WIDTH = 256;\n    var MAX_SUBMENU_HEIGHT = 270;\n    var windowWidth = $(window).width();\n    var windowHeight = $(window).height();\n\n    if (windowWidth - e.clientX < SUBMENUS_WIDTH) {\n      position.right = windowWidth - e.clientX;\n      $(rightclickmenu).addClass('moveMenusToLeft');\n    } else if (windowWidth - e.clientX < RIGHTCLICK_WIDTH) {\n      position.right = windowWidth - e.clientX;\n    } else position.left = e.clientX;\n\n    if (windowHeight - e.clientY < MAX_SUBMENU_HEIGHT) {\n      position.bottom = windowHeight - e.clientY;\n      $(rightclickmenu).addClass('moveMenusUp');\n    } else if (windowHeight - e.clientY < RIGHTCLICK_HEIGHT + MAX_SUBMENU_HEIGHT) {\n      position.top = e.clientY;\n      $(rightclickmenu).addClass('moveMenusUp');\n    } else position.top = e.clientY;\n\n    $(rightclickmenu).css(position);\n\n    // add the menu to the page\n    $('#wrapper').append(rightclickmenu);\n\n    // attach events to clicks on the list items\n\n    // delete the selected things from the database\n    if (authorized) {\n      $('.rc-delete').click(function () {\n        $('.rightclickmenu').remove();\n        _Control2.default.deleteSelected();\n      });\n    }\n\n    // remove the selected things from the map\n    if (authorized) {\n      $('.rc-remove').click(function () {\n        $('.rightclickmenu').remove();\n        _Control2.default.removeSelectedEdges();\n        _Control2.default.removeSelectedNodes();\n      });\n    }\n\n    // hide selected nodes and synapses until refresh\n    $('.rc-hide').click(function () {\n      $('.rightclickmenu').remove();\n      _Control2.default.hideSelectedEdges();\n      _Control2.default.hideSelectedNodes();\n    });\n\n    // change the permission of all the selected nodes and synapses that you were the originator of\n    $('.rc-permission li').click(function () {\n      $('.rightclickmenu').remove();\n      // $(this).text() will be 'commons' 'public' or 'private'\n      _Control2.default.updateSelectedPermissions($(this).text());\n    });\n  }, // selectEdgeOnRightClickHandler\n  SmoothPanning: function SmoothPanning() {\n    var sx = _Visualize2.default.mGraph.canvas.scaleOffsetX;\n    var sy = _Visualize2.default.mGraph.canvas.scaleOffsetY;\n    var yVelocity = _Mouse2.default.changeInY; // initial y velocity\n    var xVelocity = _Mouse2.default.changeInX; // initial x velocity\n    var easing = 1; // frictional value\n\n    window.clearInterval(panningInt);\n    panningInt = setInterval(function () {\n      myTimer();\n    }, 1);\n\n    function myTimer() {\n      _Visualize2.default.mGraph.canvas.translate(xVelocity * easing * 1 / sx, yVelocity * easing * 1 / sy);\n      $(document).trigger(JIT.events.pan);\n      easing = easing * 0.75;\n\n      if (easing < 0.1) window.clearInterval(panningInt);\n    }\n  }, // SmoothPanning\n  renderMidArrow: function renderMidArrow(from, to, dim, swap, canvas, placement, newSynapse) {\n    var ctx = canvas.getCtx();\n    // invert edge direction\n    if (swap) {\n      var tmp = from;\n      from = to;\n      to = tmp;\n    }\n    // vect represents a line from tip to tail of the arrow\n    var vect = new _JIT2.default.Complex(to.x - from.x, to.y - from.y);\n    // scale it\n    vect.$scale(dim / vect.norm());\n    // compute the midpoint of the edge line\n    var newX = (to.x - from.x) * placement + from.x;\n    var newY = (to.y - from.y) * placement + from.y;\n    var midPoint = new _JIT2.default.Complex(newX, newY);\n\n    // move midpoint by half the \"length\" of the arrow so the arrow is centered on the midpoint\n    var arrowPoint = new _JIT2.default.Complex(vect.x / 0.7 + midPoint.x, vect.y / 0.7 + midPoint.y);\n    // compute the tail intersection point with the edge line\n    var intermediatePoint = new _JIT2.default.Complex(arrowPoint.x - vect.x, arrowPoint.y - vect.y);\n    // vector perpendicular to vect\n    var normal = new _JIT2.default.Complex(-vect.y / 2, vect.x / 2);\n    var v1 = intermediatePoint.add(normal);\n    var v2 = intermediatePoint.$add(normal.$scale(-1));\n\n    if (newSynapse) {\n      ctx.strokeStyle = '#4fc059';\n      ctx.lineWidth = 2;\n      ctx.globalAlpha = 1;\n    }\n    ctx.beginPath();\n    ctx.moveTo(from.x, from.y);\n    ctx.lineTo(to.x, to.y);\n    ctx.stroke();\n    ctx.beginPath();\n    ctx.moveTo(v1.x, v1.y);\n    ctx.lineTo(arrowPoint.x, arrowPoint.y);\n    ctx.lineTo(v2.x, v2.y);\n    ctx.stroke();\n  }, // renderMidArrow\n  renderEdgeArrows: function renderEdgeArrows(edgeHelper, adj, synapse, canvas) {\n    var self = JIT;\n\n    var directionCat = synapse.get('category');\n    var direction = synapse.getDirection();\n\n    var pos = adj.nodeFrom.pos.getc(true);\n    var posChild = adj.nodeTo.pos.getc(true);\n\n    // plot arrow edge\n    if (!direction) {\n      // render nothing for this arrow if the direction couldn't be retrieved\n    } else if (directionCat === 'none') {\n      edgeHelper.line.render({\n        x: pos.x,\n        y: pos.y },\n      {\n        x: posChild.x,\n        y: posChild.y },\n      canvas);\n    } else if (directionCat === 'both') {\n      self.renderMidArrow({\n        x: pos.x,\n        y: pos.y },\n      {\n        x: posChild.x,\n        y: posChild.y },\n      13, true, canvas, 0.7);\n      self.renderMidArrow({\n        x: pos.x,\n        y: pos.y },\n      {\n        x: posChild.x,\n        y: posChild.y },\n      13, false, canvas, 0.7);\n    } else if (directionCat === 'from-to') {\n      var inv = direction[0] !== adj.nodeFrom.id;\n      self.renderMidArrow({\n        x: pos.x,\n        y: pos.y },\n      {\n        x: posChild.x,\n        y: posChild.y },\n      13, inv, canvas, 0.7);\n      self.renderMidArrow({\n        x: pos.x,\n        y: pos.y },\n      {\n        x: posChild.x,\n        y: posChild.y },\n      13, inv, canvas, 0.3);\n    }\n  }, // renderEdgeArrows\n  zoomIn: function zoomIn(event) {\n    _Visualize2.default.mGraph.canvas.scale(1.25, 1.25);\n    $(document).trigger(JIT.events.zoom, [event]);\n  },\n  zoomOut: function zoomOut(event) {\n    _Visualize2.default.mGraph.canvas.scale(0.8, 0.8);\n    $(document).trigger(JIT.events.zoom, [event]);\n  },\n  centerMap: function centerMap(canvas) {\n    var offsetScale = canvas.scaleOffsetX;\n\n    canvas.scale(1 / offsetScale, 1 / offsetScale);\n\n    var offsetX = canvas.translateOffsetX;\n    var offsetY = canvas.translateOffsetY;\n\n    canvas.translate(-1 * offsetX, -1 * offsetY);\n  },\n  zoomToBox: function zoomToBox(event) {\n    var sX = _Mouse2.default.boxStartCoordinates.x;\n    var sY = _Mouse2.default.boxStartCoordinates.y;\n    var eX = _Mouse2.default.boxEndCoordinates.x;\n    var eY = _Mouse2.default.boxEndCoordinates.y;\n\n    var canvas = _Visualize2.default.mGraph.canvas;\n    JIT.centerMap(canvas);\n\n    var height = $(document).height();\n    var width = $(document).width();\n\n    var spanX = Math.abs(sX - eX);\n    var spanY = Math.abs(sY - eY);\n    var ratioX = width / spanX;\n    var ratioY = height / spanY;\n\n    var newRatio = Math.min(ratioX, ratioY);\n\n    if (canvas.scaleOffsetX * newRatio <= 5 && canvas.scaleOffsetX * newRatio >= 0.2) {\n      canvas.scale(newRatio, newRatio);\n    } else if (canvas.scaleOffsetX * newRatio > 5) {\n      newRatio = 5 / canvas.scaleOffsetX;\n      canvas.scale(newRatio, newRatio);\n    } else {\n      newRatio = 0.2 / canvas.scaleOffsetX;\n      canvas.scale(newRatio, newRatio);\n    }\n\n    var cogX = (sX + eX) / 2;\n    var cogY = (sY + eY) / 2;\n\n    canvas.translate(-1 * cogX, -1 * cogY);\n    $(document).trigger(JIT.events.zoom, [event]);\n\n    _Mouse2.default.boxStartCoordinates = false;\n    _Mouse2.default.boxEndCoordinates = false;\n    _Visualize2.default.mGraph.plot();\n  },\n  zoomExtents: function zoomExtents(event, canvas, denySelected) {\n    JIT.centerMap(canvas);\n    var height = canvas.getSize().height;\n    var width = canvas.getSize().width;\n    var maxX = void 0;\n    var maxY = void 0;\n    var minX = void 0;\n    var minY = void 0;\n    var counter = 0;\n\n    var nodes = void 0;\n    if (!denySelected && _Selected2.default.Nodes.length > 0) {\n      nodes = _Selected2.default.Nodes;\n    } else {\n      nodes = (0, _values3.default)(_Visualize2.default.mGraph.graph.nodes);\n    }\n\n    if (nodes.length > 1) {\n      nodes.forEach(function (n) {\n        var x = n.pos.x;\n        var y = n.pos.y;\n\n        if (counter === 0 && n.getData('alpha') === 1) {\n          maxX = x;\n          minX = x;\n          maxY = y;\n          minY = y;\n        }\n\n        var arrayOfLabelLines = _Util2.default.splitLine(n.name, 25).split('\\n');\n        var dim = n.getData('dim');\n        var ctx = canvas.getCtx();\n\n        var height = 25 * arrayOfLabelLines.length;\n\n        var lineWidths = [];\n        for (var index = 0; index < arrayOfLabelLines.length; ++index) {\n          lineWidths.push(ctx.measureText(arrayOfLabelLines[index]).width);\n        }\n        var width = Math.max.apply(null, lineWidths) + 8;\n\n        // only adjust these values if the node is not filtered\n        if (n.getData('alpha') === 1) {\n          maxX = Math.max(x + width / 2, maxX);\n          maxY = Math.max(y + n.getData('height') + 5 + height, maxY);\n          minX = Math.min(x - width / 2, minX);\n          minY = Math.min(y - dim, minY);\n\n          counter++;\n        }\n      });\n\n      var spanX = maxX - minX;\n      var spanY = maxY - minY;\n      var ratioX = spanX / width;\n      var ratioY = spanY / height;\n\n      var cogX = (maxX + minX) / 2;\n      var cogY = (maxY + minY) / 2;\n\n      canvas.translate(-1 * cogX, -1 * cogY);\n\n      var newRatio = Math.max(ratioX, ratioY);\n      var scaleMultiplier = 1 / newRatio * 0.9;\n\n      if (canvas.scaleOffsetX * scaleMultiplier <= 3 && canvas.scaleOffsetX * scaleMultiplier >= 0.2) {\n        canvas.scale(scaleMultiplier, scaleMultiplier);\n      } else if (canvas.scaleOffsetX * scaleMultiplier > 3) {\n        scaleMultiplier = 3 / canvas.scaleOffsetX;\n        canvas.scale(scaleMultiplier, scaleMultiplier);\n      } else {\n        scaleMultiplier = 0.2 / canvas.scaleOffsetX;\n        canvas.scale(scaleMultiplier, scaleMultiplier);\n      }\n\n      $(document).trigger(JIT.events.zoom, [event]);\n    } else if (nodes.length === 1) {\n      nodes.forEach(function (n) {\n        var x = n.pos.x;\n        var y = n.pos.y;\n\n        canvas.translate(-1 * x, -1 * y);\n        $(document).trigger(JIT.events.zoom, [event]);\n      });\n    }\n  } };exports.default =\n\n\nJIT;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU1LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvSklULmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGdsb2JhbCAkLCBJbWFnZSwgQ2FudmFzTG9hZGVyICovXG5cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCdcbmltcG9ydCBvdXRkZW50IGZyb20gJ291dGRlbnQnXG5cbmltcG9ydCAkaml0IGZyb20gJy4uL3BhdGNoZWQvSklUJ1xuXG5pbXBvcnQgQWN0aXZlIGZyb20gJy4vQWN0aXZlJ1xuaW1wb3J0IENvbnRyb2wgZnJvbSAnLi9Db250cm9sJ1xuaW1wb3J0IENyZWF0ZSBmcm9tICcuL0NyZWF0ZSdcbmltcG9ydCBEYXRhTW9kZWwgZnJvbSAnLi9EYXRhTW9kZWwnXG5pbXBvcnQgRW5naW5lIGZyb20gJy4vRW5naW5lJ1xuaW1wb3J0IEZpbHRlciBmcm9tICcuL0ZpbHRlcidcbmltcG9ydCBHbG9iYWxVSSBmcm9tICcuL0dsb2JhbFVJJ1xuaW1wb3J0IE1hcCBmcm9tICcuL01hcCdcbmltcG9ydCBNb3VzZSBmcm9tICcuL01vdXNlJ1xuaW1wb3J0IFNlbGVjdGVkIGZyb20gJy4vU2VsZWN0ZWQnXG5pbXBvcnQgU2V0dGluZ3MgZnJvbSAnLi9TZXR0aW5ncydcbmltcG9ydCBTeW5hcHNlIGZyb20gJy4vU3luYXBzZSdcbmltcG9ydCBTeW5hcHNlQ2FyZCBmcm9tICcuL1N5bmFwc2VDYXJkJ1xuaW1wb3J0IFRvcGljIGZyb20gJy4vVG9waWMnXG5pbXBvcnQgVG9waWNDYXJkIGZyb20gJy4vVG9waWNDYXJkJ1xuaW1wb3J0IFV0aWwgZnJvbSAnLi9VdGlsJ1xuaW1wb3J0IFZpc3VhbGl6ZSBmcm9tICcuL1Zpc3VhbGl6ZSdcbmltcG9ydCBjbGlwYm9hcmQgZnJvbSAnY2xpcGJvYXJkLWpzJ1xuXG5sZXQgcGFubmluZ0ludFxuXG5jb25zdCBKSVQgPSB7XG4gIHRlbXBJbml0OiBmYWxzZSxcbiAgdGVtcE5vZGU6IG51bGwsXG4gIHRlbXBOb2RlMjogbnVsbCxcbiAgbW91c2VEb3duUGl4OiB7fSxcbiAgZHJhZ0ZsYWc6IDAsXG4gIGRyYWdUb2xlcmFuY2U6IDAsXG4gIHZpcnR1YWxQb2ludGVyOiB7fSxcblxuICBldmVudHM6IHtcbiAgICB0b3BpY0RyYWc6ICdNZXRhbWFwczpKSVQ6ZXZlbnRzOnRvcGljRHJhZycsXG4gICAgcGFuOiAnTWV0YW1hcHM6SklUOmV2ZW50czpwYW4nLFxuICAgIHpvb206ICdNZXRhbWFwczpKSVQ6ZXZlbnRzOnpvb20nLFxuICAgIGFuaW1hdGlvbkRvbmU6ICdNZXRhbWFwczpKSVQ6ZXZlbnRzOmFuaW1hdGlvbkRvbmUnXG4gIH0sXG4gIHZpekRhdGE6IFtdLCAvLyBjb250YWlucyB0aGUgdmlzdWFsaXphdGlvbi1jb21wYXRpYmxlIGdyYXBoXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJpbmQgdGhlIGV2ZW50IGhhbmRsZXJzIGl0IGlzIGludGVyZXN0ZWQgYW5kIGluaXRpYWxpemUgdGhlIGNsYXNzLlxuICAgKi9cbiAgaW5pdDogZnVuY3Rpb24oc2VydmVyRGF0YSkge1xuICAgIGNvbnN0IHNlbGYgPSBKSVRcblxuICAgICQoJy56b29tSW4nKS5jbGljayhzZWxmLnpvb21JbilcbiAgICAkKCcuem9vbU91dCcpLmNsaWNrKHNlbGYuem9vbU91dClcblxuICAgIGNvbnN0IHpvb21FeHRlbnRzID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIHNlbGYuem9vbUV4dGVudHMoZXZlbnQsIFZpc3VhbGl6ZS5tR3JhcGguY2FudmFzKVxuICAgIH1cbiAgICAkKCcuem9vbUV4dGVudHMnKS5jbGljayh6b29tRXh0ZW50cylcblxuICAgICQoJy50YWtlU2NyZWVuc2hvdCcpLmNsaWNrKE1hcC5leHBvcnRJbWFnZSlcblxuICAgIHNlbGYudG9waWNEZXNjSW1hZ2UgPSBuZXcgSW1hZ2UoKVxuICAgIHNlbGYudG9waWNEZXNjSW1hZ2Uuc3JjID0gc2VydmVyRGF0YVsndG9waWNfZGVzY3JpcHRpb25fc2lnbmlmaWVyLnBuZyddXG5cbiAgICBzZWxmLnRvcGljTGlua0ltYWdlID0gbmV3IEltYWdlKClcbiAgICBzZWxmLnRvcGljTGlua0ltYWdlLnNyYyA9IHNlcnZlckRhdGFbJ3RvcGljX2xpbmtfc2lnbmlmaWVyLnBuZyddXG4gIH0sXG4gIC8qKlxuICAgKiBjb252ZXJ0IG91ciB0b3BpYyBKU09OIGludG8gc29tZXRoaW5nIEpJVCBjYW4gdXNlXG4gICAqL1xuICBjb252ZXJ0TW9kZWxzVG9KSVQ6IGZ1bmN0aW9uKHRvcGljcywgc3luYXBzZXMpIHtcbiAgICBjb25zdCBqaXRSZWFkeSA9IFtdXG5cbiAgICBjb25zdCBzeW5hcHNlc1RvUmVtb3ZlID0gW11cbiAgICBsZXQgbWFwcGluZ1xuICAgIGxldCBub2RlXG4gICAgY29uc3Qgbm9kZXMgPSB7fVxuICAgIGxldCBleGlzdGluZ0VkZ2VcbiAgICBsZXQgZWRnZVxuICAgIGNvbnN0IGVkZ2VzID0gW11cblxuICAgIHRvcGljcy5lYWNoKGZ1bmN0aW9uKHQpIHtcbiAgICAgIG5vZGUgPSB0LmNyZWF0ZU5vZGUoKVxuICAgICAgbm9kZXNbbm9kZS5pZF0gPSBub2RlXG4gICAgfSlcbiAgICBzeW5hcHNlcy5lYWNoKGZ1bmN0aW9uKHMpIHtcbiAgICAgIGVkZ2UgPSBzLmNyZWF0ZUVkZ2UoKVxuXG4gICAgICBpZiAodG9waWNzLmdldChzLmdldCgndG9waWMxX2lkJykpID09PSB1bmRlZmluZWQgfHwgdG9waWNzLmdldChzLmdldCgndG9waWMyX2lkJykpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gdGhpcyBtZWFucyBpdCdzIGFuIGludmFsaWQgc3luYXBzZVxuICAgICAgICBzeW5hcHNlc1RvUmVtb3ZlLnB1c2gocylcbiAgICAgIH0gZWxzZSBpZiAobm9kZXNbZWRnZS5ub2RlRnJvbV0gJiYgbm9kZXNbZWRnZS5ub2RlVG9dKSB7XG4gICAgICAgIGV4aXN0aW5nRWRnZSA9IF8uZmluZChlZGdlcywge1xuICAgICAgICAgIG5vZGVGcm9tOiBlZGdlLm5vZGVGcm9tLFxuICAgICAgICAgIG5vZGVUbzogZWRnZS5ub2RlVG9cbiAgICAgICAgfSkgfHxcbiAgICAgICAgXy5maW5kKGVkZ2VzLCB7XG4gICAgICAgICAgbm9kZUZyb206IGVkZ2Uubm9kZVRvLFxuICAgICAgICAgIG5vZGVUbzogZWRnZS5ub2RlRnJvbVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChleGlzdGluZ0VkZ2UpIHtcbiAgICAgICAgICAvLyBmb3Igd2hlbiB5b3UncmUgZGVhbGluZyB3aXRoIG11bHRpcGxlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGUgc2FtZSB0d28gdG9waWNzXG4gICAgICAgICAgaWYgKEFjdGl2ZS5NYXApIHtcbiAgICAgICAgICAgIG1hcHBpbmcgPSBzLmdldE1hcHBpbmcoKVxuICAgICAgICAgICAgZXhpc3RpbmdFZGdlLmRhdGFbJyRtYXBwaW5nSURzJ10ucHVzaChtYXBwaW5nLmlkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBleGlzdGluZ0VkZ2UuZGF0YVsnJHN5bmFwc2VJRHMnXS5wdXNoKHMuaWQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZm9yIHdoZW4geW91J3JlIGRlYWxpbmcgd2l0aCBhIHRvcGljIHRoYXQgaGFzIHJlbGF0aW9uc2hpcHMgdG8gbWFueSBkaWZmZXJlbnQgbm9kZXNcbiAgICAgICAgICBub2Rlc1tlZGdlLm5vZGVGcm9tXS5hZGphY2VuY2llcy5wdXNoKGVkZ2UpXG4gICAgICAgICAgZWRnZXMucHVzaChlZGdlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcblxuICAgIF8uZWFjaChub2RlcywgZnVuY3Rpb24obm9kZSkge1xuICAgICAgaml0UmVhZHkucHVzaChub2RlKVxuICAgIH0pXG5cbiAgICByZXR1cm4gW2ppdFJlYWR5LCBzeW5hcHNlc1RvUmVtb3ZlXVxuICB9LFxuICBwcmVwYXJlVml6RGF0YTogZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgc2VsZiA9IEpJVFxuICAgIGxldCBtYXBwaW5nXG5cbiAgICAvLyByZXNldC9lbXB0eSB2aXpEYXRhXG4gICAgc2VsZi52aXpEYXRhID0gW11cbiAgICBWaXN1YWxpemUubG9hZExhdGVyID0gZmFsc2VcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBzZWxmLmNvbnZlcnRNb2RlbHNUb0pJVChEYXRhTW9kZWwuVG9waWNzLCBEYXRhTW9kZWwuU3luYXBzZXMpXG5cbiAgICBzZWxmLnZpekRhdGEgPSByZXN1bHRzWzBdXG5cbiAgICAvLyBjbGVhbiB1cCB0aGUgc3luYXBzZXMgYXJyYXkgaW4gY2FzZSBvZiBhbnkgZmF1bHR5IGRhdGFcbiAgICBfLmVhY2gocmVzdWx0c1sxXSwgZnVuY3Rpb24oc3luYXBzZSkge1xuICAgICAgbWFwcGluZyA9IHN5bmFwc2UuZ2V0TWFwcGluZygpXG4gICAgICBEYXRhTW9kZWwuU3luYXBzZXMucmVtb3ZlKHN5bmFwc2UpXG4gICAgICBpZiAoRGF0YU1vZGVsLk1hcHBpbmdzKSBEYXRhTW9kZWwuTWFwcGluZ3MucmVtb3ZlKG1hcHBpbmcpXG4gICAgfSlcblxuICAgIC8vIHNldCB1cCBhZGRUb3BpYyBpbnN0cnVjdGlvbnMgaW4gY2FzZSB0aGV5IGRlbGV0ZSBhbGwgdGhlIHRvcGljc1xuICAgIC8vIGkuZS4gaWYgdGhlcmUgYXJlIDAgdG9waWNzIGF0IGFueSB0aW1lLCBpdCBzaG91bGQgaGF2ZSBpbnN0cnVjdGlvbnMgYWdhaW5cbiAgICAkKCcjaW5zdHJ1Y3Rpb25zIGRpdicpLmhpZGUoKVxuICAgIGlmIChBY3RpdmUuTWFwICYmIEFjdGl2ZS5NYXAuYXV0aG9yaXplVG9FZGl0KEFjdGl2ZS5NYXBwZXIpKSB7XG4gICAgICAkKCcjaW5zdHJ1Y3Rpb25zIGRpdi5hZGRUb3BpYycpLnNob3coKVxuICAgIH1cblxuICAgIGlmIChzZWxmLnZpekRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICBHbG9iYWxVSS5zaG93RGl2KCcjaW5zdHJ1Y3Rpb25zJylcbiAgICAgIFZpc3VhbGl6ZS5sb2FkTGF0ZXIgPSB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIEdsb2JhbFVJLmhpZGVEaXYoJyNpbnN0cnVjdGlvbnMnKVxuICAgIH1cblxuICAgIFZpc3VhbGl6ZS5yZW5kZXIoKVxuICB9LCAvLyBwcmVwYXJlVml6RGF0YVxuICBlZGdlUmVuZGVyOiBmdW5jdGlvbihhZGosIGNhbnZhcykge1xuICAgIC8vIGdldCBub2RlcyBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXNcbiAgICBjb25zdCBwb3MgPSBhZGoubm9kZUZyb20ucG9zLmdldGModHJ1ZSlcbiAgICBjb25zdCBwb3NDaGlsZCA9IGFkai5ub2RlVG8ucG9zLmdldGModHJ1ZSlcblxuICAgIGxldCBzeW5hcHNlXG4gICAgaWYgKGFkai5nZXREYXRhKCdkaXNwbGF5SW5kZXgnKSkge1xuICAgICAgc3luYXBzZSA9IGFkai5nZXREYXRhKCdzeW5hcHNlcycpW2Fkai5nZXREYXRhKCdkaXNwbGF5SW5kZXgnKV1cbiAgICAgIGlmICghc3luYXBzZSkge1xuICAgICAgICBkZWxldGUgYWRqLmRhdGEuJGRpc3BsYXlJbmRleFxuICAgICAgICBzeW5hcHNlID0gYWRqLmdldERhdGEoJ3N5bmFwc2VzJylbMF1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3luYXBzZSA9IGFkai5nZXREYXRhKCdzeW5hcHNlcycpWzBdXG4gICAgfVxuXG4gICAgaWYgKCFzeW5hcHNlKSByZXR1cm4gLy8gdGhpcyBtZWFucyB0aGVyZSBhcmUgbm8gY29ycmVzcG9uZGluZyBzeW5hcHNlcyBmb3JcbiAgICAvLyB0aGlzIGVkZ2UsIGRvbid0IHJlbmRlciBpdFxuXG4gICAgLy8gbGFiZWwgcGxhY2VtZW50IG9uIGVkZ2VzXG4gICAgaWYgKGNhbnZhcy5kZW55U2VsZWN0ZWQpIHtcbiAgICAgIGNvbnN0IGNvbG9yID0gU2V0dGluZ3MuY29sb3JzLnN5bmFwc2VzLm5vcm1hbFxuICAgICAgY2FudmFzLmdldEN0eCgpLmZpbGxTdHlsZSA9IGNhbnZhcy5nZXRDdHgoKS5zdHJva2VTdHlsZSA9IGNvbG9yXG4gICAgfVxuICAgIEpJVC5yZW5kZXJFZGdlQXJyb3dzKCRqaXQuR3JhcGguUGxvdC5lZGdlSGVscGVyLCBhZGosIHN5bmFwc2UsIGNhbnZhcylcblxuICAgIC8vIGNoZWNrIGZvciBlZGdlIGxhYmVsIGluIGRhdGFcbiAgICBsZXQgZGVzYyA9IHN5bmFwc2UuZ2V0KCdkZXNjJylcblxuICAgIGNvbnN0IHNob3dEZXNjID0gYWRqLmdldERhdGEoJ3Nob3dEZXNjJylcblxuICAgIGNvbnN0IGRyYXdTeW5hcHNlQ291bnQgPSBmdW5jdGlvbihjb250ZXh0LCB4LCB5LCBjb3VudCkge1xuICAgICAgLypcbiAgICAgIGNpcmNsZSBzaXplOiAxNngxNnB4XG4gICAgICBwb3NpdGlvbmluZzogb3ZlcmxheSBhbmQgY2VudGVyIG9uIHRvcCByaWdodCBjb3JuZXIgb2Ygc3luYXBzZSBsYWJlbCAtIDhweCBsZWZ0IGFuZCA4cHggZG93blxuICAgICAgY29sb3I6ICNkYWI1MzlcbiAgICAgIGJvcmRlciBjb2xvcjogIzQyNDI0MlxuICAgICAgYm9yZGVyIHNpemU6IDEuNXB4XG4gICAgICBmb250OiBESU4gbWVkaXVtXG4gICAgICBmb250LXNpemU6IDE0cHRcbiAgICAgIGZvbnQtY29sb3I6ICM0MjQyNDJcbiAgICAgICovXG4gICAgICBjb250ZXh0LmJlZ2luUGF0aCgpXG4gICAgICBjb250ZXh0LmFyYyh4LCB5LCA4LCAwLCAyICogTWF0aC5QSSwgZmFsc2UpXG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICcjREFCNTM5J1xuICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9ICcjNDI0MjQyJ1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSAxLjVcbiAgICAgIGNvbnRleHQuY2xvc2VQYXRoKClcbiAgICAgIGNvbnRleHQuZmlsbCgpXG4gICAgICBjb250ZXh0LnN0cm9rZSgpXG5cbiAgICAgIC8vIGFkZCB0aGUgc3luYXBzZSBjb3VudFxuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAnIzQyNDI0MidcbiAgICAgIGNvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcidcbiAgICAgIGNvbnRleHQuZm9udCA9ICcxNHB4IGRpbi1tZWRpdW0nXG5cbiAgICAgIGNvbnRleHQuZmlsbFRleHQoY291bnQsIHgsIHkgKyA1KVxuICAgIH1cblxuICAgIGlmICghY2FudmFzLmRlbnlTZWxlY3RlZCAmJiBkZXNjICE9PSAnJyAmJiBzaG93RGVzYykge1xuICAgICAgLy8gJyZhbXA7JyB0byAnJidcbiAgICAgIGRlc2MgPSBVdGlsLmRlY29kZUVudGl0aWVzKGRlc2MpXG5cbiAgICAgIC8vIG5vdyBhZGp1c3QgdGhlIGxhYmVsIHBsYWNlbWVudFxuICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldEN0eCgpXG4gICAgICBjdHguZm9udCA9ICdib2xkIDE0cHggYXJpYWwnXG4gICAgICBjdHguZmlsbFN0eWxlID0gJyNGRkYnXG4gICAgICBjdHgudGV4dEJhc2VsaW5lID0gJ2FscGhhYmV0aWMnXG5cbiAgICAgIGNvbnN0IGFycmF5T2ZMYWJlbExpbmVzID0gVXRpbC5zcGxpdExpbmUoZGVzYywgMjUpLnNwbGl0KCdcXG4nKVxuICAgICAgbGV0IGxpbmVXaWR0aHMgPSBbXVxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5T2ZMYWJlbExpbmVzLmxlbmd0aDsgKytpbmRleCkge1xuICAgICAgICBsaW5lV2lkdGhzLnB1c2goY3R4Lm1lYXN1cmVUZXh0KGFycmF5T2ZMYWJlbExpbmVzW2luZGV4XSkud2lkdGgpXG4gICAgICB9XG4gICAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4LmFwcGx5KG51bGwsIGxpbmVXaWR0aHMpICsgMTZcbiAgICAgIGNvbnN0IGhlaWdodCA9ICgxNiAqIGFycmF5T2ZMYWJlbExpbmVzLmxlbmd0aCkgKyA4XG5cbiAgICAgIGNvbnN0IHggPSAocG9zLnggKyBwb3NDaGlsZC54IC0gd2lkdGgpIC8gMlxuICAgICAgY29uc3QgeSA9ICgocG9zLnkgKyBwb3NDaGlsZC55KSAvIDIpIC0gaGVpZ2h0IC8gMlxuXG4gICAgICBjb25zdCByYWRpdXMgPSA1XG5cbiAgICAgIC8vIHJlbmRlciBiYWNrZ3JvdW5kXG4gICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgIGN0eC5tb3ZlVG8oeCArIHJhZGl1cywgeSlcbiAgICAgIGN0eC5saW5lVG8oeCArIHdpZHRoIC0gcmFkaXVzLCB5KVxuICAgICAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCArIHdpZHRoLCB5LCB4ICsgd2lkdGgsIHkgKyByYWRpdXMpXG4gICAgICBjdHgubGluZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCAtIHJhZGl1cylcbiAgICAgIGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCArIHdpZHRoIC0gcmFkaXVzLCB5ICsgaGVpZ2h0KVxuICAgICAgY3R4LmxpbmVUbyh4ICsgcmFkaXVzLCB5ICsgaGVpZ2h0KVxuICAgICAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCwgeSArIGhlaWdodCwgeCwgeSArIGhlaWdodCAtIHJhZGl1cylcbiAgICAgIGN0eC5saW5lVG8oeCwgeSArIHJhZGl1cylcbiAgICAgIGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKHgsIHksIHggKyByYWRpdXMsIHkpXG4gICAgICBjdHguY2xvc2VQYXRoKClcbiAgICAgIGN0eC5maWxsKClcblxuICAgICAgLy8gZ2V0IG51bWJlciBvZiBzeW5hcHNlc1xuICAgICAgY29uc3Qgc3luYXBzZU51bSA9IGFkai5nZXREYXRhKCdzeW5hcHNlcycpLmxlbmd0aFxuXG4gICAgICAvLyByZW5kZXIgdGV4dFxuICAgICAgY3R4LmZpbGxTdHlsZSA9ICcjNDI0MjQyJ1xuICAgICAgY3R4LnRleHRBbGlnbiA9ICdjZW50ZXInXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXJyYXlPZkxhYmVsTGluZXMubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgICAgIGN0eC5maWxsVGV4dChhcnJheU9mTGFiZWxMaW5lc1tpbmRleF0sIHggKyAod2lkdGggLyAyKSwgeSArIDE4ICsgKDE2ICogaW5kZXgpKVxuICAgICAgfVxuXG4gICAgICBpZiAoc3luYXBzZU51bSA+IDEpIHtcbiAgICAgICAgZHJhd1N5bmFwc2VDb3VudChjdHgsIHggKyB3aWR0aCwgeSwgc3luYXBzZU51bSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFjYW52YXMuZGVueVNlbGVjdGVkICYmIHNob3dEZXNjKSB7XG4gICAgICAvLyBnZXQgbnVtYmVyIG9mIHN5bmFwc2VzXG4gICAgICBjb25zdCBzeW5hcHNlTnVtID0gYWRqLmdldERhdGEoJ3N5bmFwc2VzJykubGVuZ3RoXG5cbiAgICAgIGlmIChzeW5hcHNlTnVtID4gMSkge1xuICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q3R4KClcbiAgICAgICAgY29uc3QgeCA9IChwb3MueCArIHBvc0NoaWxkLngpIC8gMlxuICAgICAgICBjb25zdCB5ID0gKHBvcy55ICsgcG9zQ2hpbGQueSkgLyAyXG4gICAgICAgIGRyYXdTeW5hcHNlQ291bnQoY3R4LCB4LCB5LCBzeW5hcHNlTnVtKVxuICAgICAgfVxuICAgIH1cbiAgfSwgLy8gZWRnZVJlbmRlclxuICBGb3JjZURpcmVjdGVkOiB7XG4gICAgYW5pbWF0ZVNhdmVkTGF5b3V0OiB7XG4gICAgICBtb2RlczogWydsaW5lYXInXSxcbiAgICAgIC8vIFRPRE8gZml4IHRlc3RzIHNvIHdlIGRvbid0IG5lZWQgXy5nZXRcbiAgICAgIHRyYW5zaXRpb246IF8uZ2V0KCRqaXQsICdUcmFucy5RdWFkLmVhc2VJbk91dCcpLFxuICAgICAgZHVyYXRpb246IDgwMCxcbiAgICAgIG9uQ29tcGxldGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICBWaXN1YWxpemUubUdyYXBoLmJ1c3kgPSBmYWxzZVxuICAgICAgICAkKGRvY3VtZW50KS50cmlnZ2VyKEpJVC5ldmVudHMuYW5pbWF0aW9uRG9uZSlcbiAgICAgIH1cbiAgICB9LFxuICAgIGFuaW1hdGVGRExheW91dDoge1xuICAgICAgbW9kZXM6IFsnbGluZWFyJ10sXG4gICAgICAvLyBUT0RPIGZpeCB0ZXN0cyBzbyB3ZSBkb24ndCBuZWVkIF8uZ2V0XG4gICAgICB0cmFuc2l0aW9uOiBfLmdldCgkaml0LCAnVHJhbnMuRWxhc3RpYy5lYXNlT3V0JyksXG4gICAgICBkdXJhdGlvbjogODAwLFxuICAgICAgb25Db21wbGV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIFZpc3VhbGl6ZS5tR3JhcGguYnVzeSA9IGZhbHNlXG4gICAgICB9XG4gICAgfSxcbiAgICBncmFwaFNldHRpbmdzOiB7XG4gICAgICAvLyBpZCBvZiB0aGUgdmlzdWFsaXphdGlvbiBjb250YWluZXJcbiAgICAgIGluamVjdEludG86ICdpbmZvdmlzJyxcbiAgICAgIC8vIEVuYWJsZSB6b29taW5nIGFuZCBwYW5uaW5nXG4gICAgICAvLyBieSBzY3JvbGxpbmcgYW5kIERuRFxuICAgICAgTmF2aWdhdGlvbjoge1xuICAgICAgICBlbmFibGU6IHRydWUsXG4gICAgICAgIC8vIEVuYWJsZSBwYW5uaW5nIGV2ZW50cyBvbmx5IGlmIHdlJ3JlIGRyYWdnaW5nIHRoZSBlbXB0eVxuICAgICAgICAvLyBjYW52YXMgKGFuZCBub3QgYSBub2RlKS5cbiAgICAgICAgcGFubmluZzogJ2F2b2lkIG5vZGVzJyxcbiAgICAgICAgem9vbWluZzogMjggLy8gem9vbSBzcGVlZC4gaGlnaGVyIGlzIG1vcmUgc2Vuc2libGVcbiAgICAgIH0sXG4gICAgICAvLyBDaGFuZ2Ugbm9kZSBhbmQgZWRnZSBzdHlsZXMgc3VjaCBhc1xuICAgICAgLy8gY29sb3IgYW5kIHdpZHRoLlxuICAgICAgLy8gVGhlc2UgcHJvcGVydGllcyBhcmUgYWxzbyBzZXQgcGVyIG5vZGVcbiAgICAgIC8vIHdpdGggZG9sbGFyIHByZWZpeGVkIGRhdGEtcHJvcGVydGllcyBpbiB0aGVcbiAgICAgIC8vIEpTT04gc3RydWN0dXJlLlxuICAgICAgTm9kZToge1xuICAgICAgICBvdmVycmlkYWJsZTogdHJ1ZSxcbiAgICAgICAgY29sb3I6ICcjMkQ2QTVEJyxcbiAgICAgICAgdHlwZTogJ2N1c3RvbU5vZGUnLFxuICAgICAgICBkaW06IDI1XG4gICAgICB9LFxuICAgICAgRWRnZToge1xuICAgICAgICBvdmVycmlkYWJsZTogdHJ1ZSxcbiAgICAgICAgY29sb3I6IFNldHRpbmdzLmNvbG9ycy5zeW5hcHNlcy5ub3JtYWwsXG4gICAgICAgIHR5cGU6ICdjdXN0b21FZGdlJyxcbiAgICAgICAgbGluZVdpZHRoOiAyLFxuICAgICAgICBhbHBoYTogMVxuICAgICAgfSxcbiAgICAgIC8vIE5hdGl2ZSBjYW52YXMgdGV4dCBzdHlsaW5nXG4gICAgICBMYWJlbDoge1xuICAgICAgICB0eXBlOiAnTmF0aXZlJywgLy8gTmF0aXZlIG9yIEhUTUxcbiAgICAgICAgc2l6ZTogMjAsXG4gICAgICAgIGZhbWlseTogJ2FyaWFsJyxcbiAgICAgICAgdGV4dEJhc2VsaW5lOiAnYWxwaGFiZXRpYycsXG4gICAgICAgIGNvbG9yOiBTZXR0aW5ncy5jb2xvcnMubGFiZWxzLnRleHRcbiAgICAgIH0sXG4gICAgICAvLyBBZGQgVGlwc1xuICAgICAgVGlwczoge1xuICAgICAgICBlbmFibGU6IGZhbHNlLFxuICAgICAgICBvblNob3c6IGZ1bmN0aW9uKHRpcCwgbm9kZSkge31cbiAgICAgIH0sXG4gICAgICAvLyBBZGQgbm9kZSBldmVudHNcbiAgICAgIEV2ZW50czoge1xuICAgICAgICBlbmFibGU6IHRydWUsXG4gICAgICAgIGVuYWJsZUZvckVkZ2VzOiB0cnVlLFxuICAgICAgICBvbk1vdXNlTW92ZTogZnVuY3Rpb24obm9kZSwgZXZlbnRJbmZvLCBlKSB7XG4gICAgICAgICAgSklULm9uTW91c2VNb3ZlSGFuZGxlcihub2RlLCBldmVudEluZm8sIGUpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdjYWxsZWQgbW91c2UgbW92ZSBoYW5kbGVyJylcbiAgICAgICAgfSxcbiAgICAgICAgLy8gVXBkYXRlIG5vZGUgcG9zaXRpb25zIHdoZW4gZHJhZ2dlZFxuICAgICAgICBvbkRyYWdNb3ZlOiBmdW5jdGlvbihub2RlLCBldmVudEluZm8sIGUpIHtcbiAgICAgICAgICBKSVQub25EcmFnTW92ZVRvcGljSGFuZGxlcihub2RlLCBldmVudEluZm8sIGUpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdjYWxsZWQgZHJhZyBtb3ZlIGhhbmRsZXInKVxuICAgICAgICB9LFxuICAgICAgICBvbkRyYWdFbmQ6IGZ1bmN0aW9uKG5vZGUsIGV2ZW50SW5mbywgZSkge1xuICAgICAgICAgIEpJVC5vbkRyYWdFbmRUb3BpY0hhbmRsZXIobm9kZSwgZXZlbnRJbmZvLCBlLCBmYWxzZSlcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2NhbGxlZCBkcmFnIGVuZCBoYW5kbGVyJylcbiAgICAgICAgfSxcbiAgICAgICAgb25EcmFnQ2FuY2VsOiBmdW5jdGlvbihub2RlLCBldmVudEluZm8sIGUpIHtcbiAgICAgICAgICBKSVQub25EcmFnQ2FuY2VsSGFuZGxlcihub2RlLCBldmVudEluZm8sIGUsIGZhbHNlKVxuICAgICAgICB9LFxuICAgICAgICAvLyBJbXBsZW1lbnQgdGhlIHNhbWUgaGFuZGxlciBmb3IgdG91Y2hzY3JlZW5zXG4gICAgICAgIG9uVG91Y2hTdGFydDogZnVuY3Rpb24obm9kZSwgZXZlbnRJbmZvLCBlKSB7fSxcbiAgICAgICAgLy8gSW1wbGVtZW50IHRoZSBzYW1lIGhhbmRsZXIgZm9yIHRvdWNoc2NyZWVuc1xuICAgICAgICBvblRvdWNoTW92ZTogZnVuY3Rpb24obm9kZSwgZXZlbnRJbmZvLCBlKSB7XG4gICAgICAgICAgSklULm9uRHJhZ01vdmVUb3BpY0hhbmRsZXIobm9kZSwgZXZlbnRJbmZvLCBlKVxuICAgICAgICB9LFxuICAgICAgICAvLyBJbXBsZW1lbnQgdGhlIHNhbWUgaGFuZGxlciBmb3IgdG91Y2hzY3JlZW5zXG4gICAgICAgIG9uVG91Y2hFbmQ6IGZ1bmN0aW9uKG5vZGUsIGV2ZW50SW5mbywgZSkge30sXG4gICAgICAgIC8vIEltcGxlbWVudCB0aGUgc2FtZSBoYW5kbGVyIGZvciB0b3VjaHNjcmVlbnNcbiAgICAgICAgb25Ub3VjaENhbmNlbDogZnVuY3Rpb24obm9kZSwgZXZlbnRJbmZvLCBlKSB7fSxcbiAgICAgICAgLy8gQWRkIGFsc28gYSBjbGljayBoYW5kbGVyIHRvIG5vZGVzXG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uKG5vZGUsIGV2ZW50SW5mbywgZSkge1xuICAgICAgICAgIC8vIHJlbW92ZSB0aGUgcmlnaHRjbGlja21lbnVcbiAgICAgICAgICAkKCcucmlnaHRjbGlja21lbnUnKS5yZW1vdmUoKVxuXG4gICAgICAgICAgaWYgKE1vdXNlLmJveFN0YXJ0Q29vcmRpbmF0ZXMpIHtcbiAgICAgICAgICAgIGlmIChlLmN0cmxLZXkpIHtcbiAgICAgICAgICAgICAgVmlzdWFsaXplLm1HcmFwaC5idXN5ID0gZmFsc2VcbiAgICAgICAgICAgICAgTW91c2UuYm94RW5kQ29vcmRpbmF0ZXMgPSBldmVudEluZm8uZ2V0UG9zKClcblxuICAgICAgICAgICAgICBjb25zdCBiUyA9IE1vdXNlLmJveFN0YXJ0Q29vcmRpbmF0ZXNcbiAgICAgICAgICAgICAgY29uc3QgYkUgPSBNb3VzZS5ib3hFbmRDb29yZGluYXRlc1xuICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoYlMueCAtIGJFLngpID4gMjAgJiYgTWF0aC5hYnMoYlMueSAtIGJFLnkpID4gMjApIHtcbiAgICAgICAgICAgICAgICBKSVQuem9vbVRvQm94KGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgTW91c2UuYm94U3RhcnRDb29yZGluYXRlcyA9IG51bGxcbiAgICAgICAgICAgICAgICBNb3VzZS5ib3hFbmRDb29yZGluYXRlcyA9IG51bGxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgICBWaXN1YWxpemUubUdyYXBoLmJ1c3kgPSBmYWxzZVxuICAgICAgICAgICAgICBNb3VzZS5ib3hFbmRDb29yZGluYXRlcyA9IGV2ZW50SW5mby5nZXRQb3MoKVxuICAgICAgICAgICAgICBKSVQuc2VsZWN0V2l0aEJveChlKVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZS50YXJnZXQuaWQgIT09ICdpbmZvdmlzLWNhbnZhcycpIHJldHVybiBmYWxzZVxuXG4gICAgICAgICAgLy8gY2xpY2tpbmcgb24gYSBlZGdlLCBub2RlLCBvciBjbGlja2luZyBvbiBibGFuayBwYXJ0IG9mIGNhbnZhcz9cbiAgICAgICAgICBpZiAobm9kZS5ub2RlRnJvbSkge1xuICAgICAgICAgICAgSklULnNlbGVjdEVkZ2VPbkNsaWNrSGFuZGxlcihub2RlLCBlKVxuICAgICAgICAgIH0gZWxzZSBpZiAobm9kZSAmJiAhbm9kZS5ub2RlRnJvbSkge1xuICAgICAgICAgICAgSklULnNlbGVjdE5vZGVPbkNsaWNrSGFuZGxlcihub2RlLCBlKVxuICAgICAgICAgICAgRW5naW5lLnNldEZvY3VzTm9kZShub2RlKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBKSVQuY2FudmFzQ2xpY2tIYW5kbGVyKGV2ZW50SW5mby5nZXRQb3MoKSwgZSlcbiAgICAgICAgICB9IC8vIGlmXG4gICAgICAgIH0sXG4gICAgICAgIC8vIEFkZCBhbHNvIGEgY2xpY2sgaGFuZGxlciB0byBub2Rlc1xuICAgICAgICBvblJpZ2h0Q2xpY2s6IGZ1bmN0aW9uKG5vZGUsIGV2ZW50SW5mbywgZSkge1xuICAgICAgICAgIC8vIHJlbW92ZSB0aGUgcmlnaHRjbGlja21lbnVcbiAgICAgICAgICAkKCcucmlnaHRjbGlja21lbnUnKS5yZW1vdmUoKVxuXG4gICAgICAgICAgaWYgKE1vdXNlLmJveFN0YXJ0Q29vcmRpbmF0ZXMpIHtcbiAgICAgICAgICAgIENyZWF0ZS5uZXdTeW5hcHNlLmhpZGUoKVxuICAgICAgICAgICAgVmlzdWFsaXplLm1HcmFwaC5idXN5ID0gZmFsc2VcbiAgICAgICAgICAgIE1vdXNlLmJveEVuZENvb3JkaW5hdGVzID0gZXZlbnRJbmZvLmdldFBvcygpXG4gICAgICAgICAgICBKSVQuc2VsZWN0V2l0aEJveChlKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGUudGFyZ2V0LmlkICE9PSAnaW5mb3Zpcy1jYW52YXMnKSByZXR1cm4gZmFsc2VcblxuICAgICAgICAgIC8vIGNsaWNraW5nIG9uIGEgZWRnZSwgbm9kZSwgb3IgY2xpY2tpbmcgb24gYmxhbmsgcGFydCBvZiBjYW52YXM/XG4gICAgICAgICAgaWYgKG5vZGUubm9kZUZyb20pIHtcbiAgICAgICAgICAgIEpJVC5zZWxlY3RFZGdlT25SaWdodENsaWNrSGFuZGxlcihub2RlLCBlKVxuICAgICAgICAgIH0gZWxzZSBpZiAobm9kZSAmJiAhbm9kZS5ub2RlRnJvbSkge1xuICAgICAgICAgICAgSklULnNlbGVjdE5vZGVPblJpZ2h0Q2xpY2tIYW5kbGVyKG5vZGUsIGUpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHJpZ2h0IGNsaWNrIG9wZW4gc3BhY2VcbiAgICAgICAgICAgIENyZWF0ZS5uZXdTeW5hcHNlLmhpZGUoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIE51bWJlciBvZiBpdGVyYXRpb25zIGZvciB0aGUgRkQgYWxnb3JpdGhtXG4gICAgICBpdGVyYXRpb25zOiAyMDAsXG4gICAgICAvLyBFZGdlIGxlbmd0aFxuICAgICAgbGV2ZWxEaXN0YW5jZTogMjAwXG4gICAgfSxcbiAgICBub2RlU2V0dGluZ3M6IHtcbiAgICAgICdjdXN0b21Ob2RlJzoge1xuICAgICAgICAncmVuZGVyJzogZnVuY3Rpb24obm9kZSwgY2FudmFzKSB7XG4gICAgICAgICAgY29uc3QgcG9zID0gbm9kZS5wb3MuZ2V0Yyh0cnVlKVxuICAgICAgICAgIGNvbnN0IGRpbSA9IG5vZGUuZ2V0RGF0YSgnZGltJylcbiAgICAgICAgICBjb25zdCB0b3BpYyA9IG5vZGUuZ2V0RGF0YSgndG9waWMnKVxuICAgICAgICAgIGNvbnN0IG1ldGFjb2RlID0gdG9waWMgPyB0b3BpYy5nZXRNZXRhY29kZSgpIDogZmFsc2VcbiAgICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q3R4KClcblxuICAgICAgICAgIC8vIGlmIHRoZSB0b3BpYyBpcyBzZWxlY3RlZCBkcmF3IGEgY2lyY2xlIGFyb3VuZCBpdFxuICAgICAgICAgIGlmICghY2FudmFzLmRlbnlTZWxlY3RlZCAmJiBub2RlLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgIGN0eC5hcmMocG9zLngsIHBvcy55LCBkaW0gKyAzLCAwLCAyICogTWF0aC5QSSwgZmFsc2UpXG4gICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBTZXR0aW5ncy5jb2xvcnMudG9waWNzLnNlbGVjdGVkXG4gICAgICAgICAgICBjdHgubGluZVdpZHRoID0gMlxuICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFtZXRhY29kZSB8fFxuICAgICAgICAgICAgIW1ldGFjb2RlLmdldCgnaW1hZ2UnKSB8fFxuICAgICAgICAgICAgIW1ldGFjb2RlLmdldCgnaW1hZ2UnKS5jb21wbGV0ZSB8fFxuICAgICAgICAgICAgKHR5cGVvZiBtZXRhY29kZS5nZXQoJ2ltYWdlJykubmF0dXJhbFdpZHRoICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgbWV0YWNvZGUuZ2V0KCdpbWFnZScpLm5hdHVyYWxXaWR0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgY3R4LmFyYyhwb3MueCwgcG9zLnksIGRpbSwgMCwgMiAqIE1hdGguUEksIGZhbHNlKVxuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICcjQjZCMkZEJ1xuICAgICAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdHguZHJhd0ltYWdlKG1ldGFjb2RlLmdldCgnaW1hZ2UnKSwgcG9zLnggLSBkaW0sIHBvcy55IC0gZGltLCBkaW0gKiAyLCBkaW0gKiAyKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGlmIHRoZSB0b3BpYyBoYXMgYSBsaW5rLCBkcmF3IGEgc21hbGwgaW1hZ2UgdG8gaW5kaWNhdGUgdGhhdFxuICAgICAgICAgIGNvbnN0IGhhc0xpbmsgPSB0b3BpYyAmJiB0b3BpYy5nZXQoJ2xpbmsnKSAhPT0gJycgJiYgdG9waWMuZ2V0KCdsaW5rJykgIT09IG51bGxcbiAgICAgICAgICBjb25zdCBsaW5rSW1hZ2UgPSBKSVQudG9waWNMaW5rSW1hZ2VcbiAgICAgICAgICBjb25zdCBsaW5rSW1hZ2VMb2FkZWQgPSBsaW5rSW1hZ2UuY29tcGxldGUgfHxcbiAgICAgICAgICAodHlwZW9mIGxpbmtJbWFnZS5uYXR1cmFsV2lkdGggIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgbGlua0ltYWdlLm5hdHVyYWxXaWR0aCAhPT0gMClcbiAgICAgICAgICBpZiAoaGFzTGluayAmJiBsaW5rSW1hZ2VMb2FkZWQpIHtcbiAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UobGlua0ltYWdlLCBwb3MueCAtIGRpbSAtIDgsIHBvcy55IC0gZGltIC0gOCwgMTYsIDE2KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGlmIHRoZSB0b3BpYyBoYXMgYSBkZXNjLCBkcmF3IGEgc21hbGwgaW1hZ2UgdG8gaW5kaWNhdGUgdGhhdFxuICAgICAgICAgIGNvbnN0IGhhc0Rlc2MgPSB0b3BpYyAmJiB0b3BpYy5nZXQoJ2Rlc2MnKSAhPT0gJycgJiYgdG9waWMuZ2V0KCdkZXNjJykgIT09IG51bGxcbiAgICAgICAgICBjb25zdCBkZXNjSW1hZ2UgPSBKSVQudG9waWNEZXNjSW1hZ2VcbiAgICAgICAgICBjb25zdCBkZXNjSW1hZ2VMb2FkZWQgPSBkZXNjSW1hZ2UuY29tcGxldGUgfHxcbiAgICAgICAgICAodHlwZW9mIGRlc2NJbWFnZS5uYXR1cmFsV2lkdGggIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgZGVzY0ltYWdlLm5hdHVyYWxXaWR0aCAhPT0gMClcbiAgICAgICAgICBpZiAoaGFzRGVzYyAmJiBkZXNjSW1hZ2VMb2FkZWQpIHtcbiAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoZGVzY0ltYWdlLCBwb3MueCArIGRpbSAtIDgsIHBvcy55IC0gZGltIC0gOCwgMTYsIDE2KVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJ2NvbnRhaW5zJzogZnVuY3Rpb24obm9kZSwgcG9zKSB7XG4gICAgICAgICAgY29uc3QgbnBvcyA9IG5vZGUucG9zLmdldGModHJ1ZSlcbiAgICAgICAgICBjb25zdCBkaW0gPSBub2RlLmdldERhdGEoJ2RpbScpXG4gICAgICAgICAgY29uc3QgYXJyYXlPZkxhYmVsTGluZXMgPSBVdGlsLnNwbGl0TGluZShub2RlLm5hbWUsIDI1KS5zcGxpdCgnXFxuJylcbiAgICAgICAgICBjb25zdCBjdHggPSBWaXN1YWxpemUubUdyYXBoLmNhbnZhcy5nZXRDdHgoKVxuXG4gICAgICAgICAgY29uc3QgaGVpZ2h0ID0gMjUgKiBhcnJheU9mTGFiZWxMaW5lcy5sZW5ndGhcblxuICAgICAgICAgIGxldCBsaW5lV2lkdGhzID0gW11cbiAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXJyYXlPZkxhYmVsTGluZXMubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgICAgICAgICBsaW5lV2lkdGhzLnB1c2goY3R4Lm1lYXN1cmVUZXh0KGFycmF5T2ZMYWJlbExpbmVzW2luZGV4XSkud2lkdGgpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXguYXBwbHkobnVsbCwgbGluZVdpZHRocykgKyA4XG4gICAgICAgICAgY29uc3QgbGFiZWx5ID0gbnBvcy55ICsgbm9kZS5nZXREYXRhKCdoZWlnaHQnKSArIDUgKyBoZWlnaHQgLyAyXG5cbiAgICAgICAgICBjb25zdCBvdmVyTGFiZWwgPSB0aGlzLm5vZGVIZWxwZXIucmVjdGFuZ2xlLmNvbnRhaW5zKHtcbiAgICAgICAgICAgIHg6IG5wb3MueCxcbiAgICAgICAgICAgIHk6IGxhYmVseVxuICAgICAgICAgIH0sIHBvcywgd2lkdGgsIGhlaWdodClcblxuICAgICAgICAgIHJldHVybiB0aGlzLm5vZGVIZWxwZXIuY2lyY2xlLmNvbnRhaW5zKG5wb3MsIHBvcywgZGltKSB8fCBvdmVyTGFiZWxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgZWRnZVNldHRpbmdzOiB7XG4gICAgICAnY3VzdG9tRWRnZSc6IHtcbiAgICAgICAgJ3JlbmRlcic6IGZ1bmN0aW9uKGFkaiwgY2FudmFzKSB7XG4gICAgICAgICAgSklULmVkZ2VSZW5kZXIoYWRqLCBjYW52YXMpXG4gICAgICAgIH0sXG4gICAgICAgICdjb250YWlucyc6IGZ1bmN0aW9uKGFkaiwgcG9zKSB7XG4gICAgICAgICAgY29uc3QgZnJvbSA9IGFkai5ub2RlRnJvbS5wb3MuZ2V0YygpXG4gICAgICAgICAgY29uc3QgdG8gPSBhZGoubm9kZVRvLnBvcy5nZXRjKClcblxuICAgICAgICAgIC8vIHRoaXMgZml4ZXMgYW4gaXNzdWUgd2hlcmUgd2hlbiBlZGdlcyBhcmUgcGVyZmVjdGx5IGhvcml6b250YWwgb3IgcGVyZmVjdGx5IHZlcnRpY2FsXG4gICAgICAgICAgLy8gaXQgYmVjb21lcyBpbmNyZWRpYmx5IGRpZmZpY3VsdCB0byBob3ZlciBvdmVyIHRoZW1cbiAgICAgICAgICBpZiAoLTEgPCBwb3MueCAmJiBwb3MueCA8IDEpIHBvcy54ID0gMFxuICAgICAgICAgIGlmICgtMSA8IHBvcy55ICYmIHBvcy55IDwgMSkgcG9zLnkgPSAwXG5cbiAgICAgICAgICByZXR1cm4gJGppdC5HcmFwaC5QbG90LmVkZ2VIZWxwZXIubGluZS5jb250YWlucyhmcm9tLCB0bywgcG9zLCBhZGouRWRnZS5lcHNpbG9uICsgNSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwgLy8gRm9yY2VEaXJlY3RlZFxuICBGb3JjZURpcmVjdGVkM0Q6IHtcbiAgICBhbmltYXRlOiB7XG4gICAgICBtb2RlczogWydsaW5lYXInXSxcbiAgICAgIC8vIFRPRE8gZml4IHRlc3RzIHNvIHdlIGRvbid0IG5lZWQgXy5nZXRcbiAgICAgIHRyYW5zaXRpb246IF8uZ2V0KCRqaXQsICdUcmFucy5FbGFzdGljLmVhc2VPdXQnKSxcbiAgICAgIGR1cmF0aW9uOiAyNTAwLFxuICAgICAgb25Db21wbGV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIFZpc3VhbGl6ZS5tR3JhcGguYnVzeSA9IGZhbHNlXG4gICAgICB9XG4gICAgfSxcbiAgICBncmFwaFNldHRpbmdzOiB7XG4gICAgICAvLyBpZCBvZiB0aGUgdmlzdWFsaXphdGlvbiBjb250YWluZXJcbiAgICAgIGluamVjdEludG86ICdpbmZvdmlzJyxcbiAgICAgIHR5cGU6ICczRCcsXG4gICAgICBTY2VuZToge1xuICAgICAgICBMaWdodGluZzoge1xuICAgICAgICAgIGVuYWJsZTogZmFsc2UsXG4gICAgICAgICAgYW1iaWVudDogWzAuNSwgMC41LCAwLjVdLFxuICAgICAgICAgIGRpcmVjdGlvbmFsOiB7XG4gICAgICAgICAgICBkaXJlY3Rpb246IHtcbiAgICAgICAgICAgICAgeDogMSxcbiAgICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgICAgejogLTFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb2xvcjogWzAuOSwgMC45LCAwLjldXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gRW5hYmxlIHpvb21pbmcgYW5kIHBhbm5pbmdcbiAgICAgIC8vIGJ5IHNjcm9sbGluZyBhbmQgRG5EXG4gICAgICBOYXZpZ2F0aW9uOiB7XG4gICAgICAgIGVuYWJsZTogZmFsc2UsXG4gICAgICAgIC8vIEVuYWJsZSBwYW5uaW5nIGV2ZW50cyBvbmx5IGlmIHdlJ3JlIGRyYWdnaW5nIHRoZSBlbXB0eVxuICAgICAgICAvLyBjYW52YXMgKGFuZCBub3QgYSBub2RlKS5cbiAgICAgICAgcGFubmluZzogJ2F2b2lkIG5vZGVzJyxcbiAgICAgICAgem9vbWluZzogMTAgLy8gem9vbSBzcGVlZC4gaGlnaGVyIGlzIG1vcmUgc2Vuc2libGVcbiAgICAgIH0sXG4gICAgICAvLyBDaGFuZ2Ugbm9kZSBhbmQgZWRnZSBzdHlsZXMgc3VjaCBhc1xuICAgICAgLy8gY29sb3IgYW5kIHdpZHRoLlxuICAgICAgLy8gVGhlc2UgcHJvcGVydGllcyBhcmUgYWxzbyBzZXQgcGVyIG5vZGVcbiAgICAgIC8vIHdpdGggZG9sbGFyIHByZWZpeGVkIGRhdGEtcHJvcGVydGllcyBpbiB0aGVcbiAgICAgIC8vIEpTT04gc3RydWN0dXJlLlxuICAgICAgTm9kZToge1xuICAgICAgICBvdmVycmlkYWJsZTogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ3NwaGVyZScsXG4gICAgICAgIGRpbTogMTUsXG4gICAgICAgIGNvbG9yOiAnI2ZmZmZmZidcbiAgICAgIH0sXG4gICAgICBFZGdlOiB7XG4gICAgICAgIG92ZXJyaWRhYmxlOiBmYWxzZSxcbiAgICAgICAgdHlwZTogJ3R1YmUnLFxuICAgICAgICBjb2xvcjogJyMxMTEnLFxuICAgICAgICBsaW5lV2lkdGg6IDNcbiAgICAgIH0sXG4gICAgICAvLyBOYXRpdmUgY2FudmFzIHRleHQgc3R5bGluZ1xuICAgICAgTGFiZWw6IHtcbiAgICAgICAgdHlwZTogJ0hUTUwnLCAvLyBOYXRpdmUgb3IgSFRNTFxuICAgICAgICBzaXplOiAxMCxcbiAgICAgICAgc3R5bGU6ICdib2xkJ1xuICAgICAgfSxcbiAgICAgIC8vIEFkZCBub2RlIGV2ZW50c1xuICAgICAgRXZlbnRzOiB7XG4gICAgICAgIGVuYWJsZTogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ05hdGl2ZScsXG4gICAgICAgIGk6IDAsXG4gICAgICAgIG9uTW91c2VNb3ZlOiBmdW5jdGlvbihub2RlLCBldmVudEluZm8sIGUpIHtcbiAgICAgICAgICAvLyBpZih0aGlzLmkrKyAlIDMpIHJldHVyblxuICAgICAgICAgIGNvbnN0IHBvcyA9IGV2ZW50SW5mby5nZXRQb3MoKVxuICAgICAgICAgIFZpc3VhbGl6ZS5jYW1lcmFQb3NpdGlvbi54ICs9IChwb3MueCAtIFZpc3VhbGl6ZS5jYW1lcmFQb3NpdGlvbi54KSAqIDAuNVxuICAgICAgICAgIFZpc3VhbGl6ZS5jYW1lcmFQb3NpdGlvbi55ICs9ICgtcG9zLnkgLSBWaXN1YWxpemUuY2FtZXJhUG9zaXRpb24ueSkgKiAwLjVcbiAgICAgICAgICBWaXN1YWxpemUubUdyYXBoLnBsb3QoKVxuICAgICAgICB9LFxuICAgICAgICBvbk1vdXNlV2hlZWw6IGZ1bmN0aW9uKGRlbHRhKSB7XG4gICAgICAgICAgVmlzdWFsaXplLmNhbWVyYVBvc2l0aW9uLnogKz0gLWRlbHRhICogMjBcbiAgICAgICAgICBWaXN1YWxpemUubUdyYXBoLnBsb3QoKVxuICAgICAgICB9LFxuICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbigpIHt9XG4gICAgICB9LFxuICAgICAgLy8gTnVtYmVyIG9mIGl0ZXJhdGlvbnMgZm9yIHRoZSBGRCBhbGdvcml0aG1cbiAgICAgIGl0ZXJhdGlvbnM6IDIwMCxcbiAgICAgIC8vIEVkZ2UgbGVuZ3RoXG4gICAgICBsZXZlbERpc3RhbmNlOiAxMDBcbiAgICB9LFxuICAgIG5vZGVTZXR0aW5nczoge1xuXG4gICAgfSxcbiAgICBlZGdlU2V0dGluZ3M6IHtcblxuICAgIH1cbiAgfSwgLy8gRm9yY2VEaXJlY3RlZDNEXG4gIFJHcmFwaDoge1xuICAgIGFuaW1hdGU6IHtcbiAgICAgIG1vZGVzOiBbJ3BvbGFyJ10sXG4gICAgICBkdXJhdGlvbjogODAwLFxuICAgICAgb25Db21wbGV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIFZpc3VhbGl6ZS5tR3JhcGguYnVzeSA9IGZhbHNlXG4gICAgICB9XG4gICAgfSxcbiAgICAvLyB0aGlzIHdpbGwganVzdCBiZSB1c2VkIHRvIHBhdGNoIHRoZSBGb3JjZURpcmVjdGVkIGdyYXBoc2V0dGluZ3Mgd2l0aCB0aGUgZmV3IHRoaW5ncyB3aGljaCBhY3R1YWxseSBkaWZmZXJcbiAgICBiYWNrZ3JvdW5kOiB7XG4gICAgICBsZXZlbERpc3RhbmNlOiAyMDAsXG4gICAgICBudW1iZXJPZkNpcmNsZXM6IDQsXG4gICAgICBDYW52YXNTdHlsZXM6IHtcbiAgICAgICAgc3Ryb2tlU3R5bGU6ICcjMzMzJyxcbiAgICAgICAgbGluZVdpZHRoOiAxLjVcbiAgICAgIH1cbiAgICB9LFxuICAgIGxldmVsRGlzdGFuY2U6IDIwMFxuICB9LFxuICBvbk1vdXNlRW50ZXI6IGZ1bmN0aW9uKGVkZ2UpIHtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IGVkZ2UuZ2V0RGF0YSgnYWxwaGEnKSA9PT0gMFxuXG4gICAgLy8gZG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlIGVkZ2UgaXMgZmlsdGVyZWRcbiAgICAvLyBvciBpZiB0aGUgY2FudmFzIGlzIGFuaW1hdGluZ1xuICAgIGlmIChmaWx0ZXJlZCB8fCBWaXN1YWxpemUubUdyYXBoLmJ1c3kpIHJldHVyblxuXG4gICAgJCgnY2FudmFzJykuY3NzKCdjdXJzb3InLCAncG9pbnRlcicpXG4gICAgY29uc3QgZWRnZUlzU2VsZWN0ZWQgPSBTZWxlY3RlZC5FZGdlcy5pbmRleE9mKGVkZ2UpXG4gICAgLy8gZm9sbG93aW5nIGlmIHN0YXRlbWVudCBvbmx5IGV4ZWN1dGVzIGlmIHRoZSBlZGdlIGJlaW5nIGhvdmVyZWQgb3ZlciBpcyBub3Qgc2VsZWN0ZWRcbiAgICBpZiAoZWRnZUlzU2VsZWN0ZWQgPT09IC0xKSB7XG4gICAgICBlZGdlLnNldERhdGEoJ3Nob3dEZXNjJywgdHJ1ZSwgJ2N1cnJlbnQnKVxuICAgIH1cblxuICAgIGVkZ2Uuc2V0RGF0YXNldCgnZW5kJywge1xuICAgICAgbGluZVdpZHRoOiA0XG4gICAgfSlcbiAgICBWaXN1YWxpemUubUdyYXBoLmZ4LmFuaW1hdGUoe1xuICAgICAgbW9kZXM6IFsnZWRnZS1wcm9wZXJ0eTpsaW5lV2lkdGgnXSxcbiAgICAgIGR1cmF0aW9uOiAxMDBcbiAgICB9KVxuICAgIFZpc3VhbGl6ZS5tR3JhcGgucGxvdCgpXG4gIH0sIC8vIG9uTW91c2VFbnRlclxuICBvbk1vdXNlTGVhdmU6IGZ1bmN0aW9uKGVkZ2UpIHtcbiAgICBpZiAoZWRnZS5nZXREYXRhKCdhbHBoYScpID09PSAwKSByZXR1cm4gLy8gZG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlIGVkZ2UgaXMgZmlsdGVyZWRcbiAgICAkKCdjYW52YXMnKS5jc3MoJ2N1cnNvcicsICdkZWZhdWx0JylcbiAgICBjb25zdCBlZGdlSXNTZWxlY3RlZCA9IFNlbGVjdGVkLkVkZ2VzLmluZGV4T2YoZWRnZSlcbiAgICAvLyBmb2xsb3dpbmcgaWYgc3RhdGVtZW50IG9ubHkgZXhlY3V0ZXMgaWYgdGhlIGVkZ2UgYmVpbmcgaG92ZXJlZCBvdmVyIGlzIG5vdCBzZWxlY3RlZFxuICAgIGlmIChlZGdlSXNTZWxlY3RlZCA9PT0gLTEpIHtcbiAgICAgIGVkZ2Uuc2V0RGF0YSgnc2hvd0Rlc2MnLCBmYWxzZSwgJ2N1cnJlbnQnKVxuICAgIH1cblxuICAgIGVkZ2Uuc2V0RGF0YXNldCgnZW5kJywge1xuICAgICAgbGluZVdpZHRoOiAyXG4gICAgfSlcbiAgICBWaXN1YWxpemUubUdyYXBoLmZ4LmFuaW1hdGUoe1xuICAgICAgbW9kZXM6IFsnZWRnZS1wcm9wZXJ0eTpsaW5lV2lkdGgnXSxcbiAgICAgIGR1cmF0aW9uOiAxMDBcbiAgICB9KVxuICAgIFZpc3VhbGl6ZS5tR3JhcGgucGxvdCgpXG4gIH0sIC8vIG9uTW91c2VMZWF2ZVxuICBvbk1vdXNlTW92ZUhhbmRsZXI6IGZ1bmN0aW9uKF9ub2RlLCBldmVudEluZm8sIGUpIHtcbiAgICBjb25zdCBzZWxmID0gSklUXG5cbiAgICBpZiAoVmlzdWFsaXplLm1HcmFwaC5idXN5KSByZXR1cm5cblxuICAgIGNvbnN0IG5vZGUgPSBldmVudEluZm8uZ2V0Tm9kZSgpXG4gICAgY29uc3QgZWRnZSA9IGV2ZW50SW5mby5nZXRFZGdlKClcblxuICAgIC8vIGlmIHdlJ3JlIG9uIHRvcCBvZiBhIG5vZGUgb2JqZWN0LCBhY3QgbGlrZSB0aGVyZSBhcmVuJ3QgZWRnZXMgdW5kZXIgaXRcbiAgICBpZiAobm9kZSAhPT0gZmFsc2UpIHtcbiAgICAgIGlmIChNb3VzZS5lZGdlSG92ZXJpbmdPdmVyKSB7XG4gICAgICAgIHNlbGYub25Nb3VzZUxlYXZlKE1vdXNlLmVkZ2VIb3ZlcmluZ092ZXIpXG4gICAgICB9XG4gICAgICAkKCdjYW52YXMnKS5jc3MoJ2N1cnNvcicsICdwb2ludGVyJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChlZGdlID09PSBmYWxzZSAmJiBNb3VzZS5lZGdlSG92ZXJpbmdPdmVyICE9PSBmYWxzZSkge1xuICAgICAgLy8gbW91c2Ugbm90IG9uIGFuIGVkZ2UsIGJ1dCB3ZSB3ZXJlIG9uIGFuIGVkZ2UgcHJldmlvdXNseVxuICAgICAgc2VsZi5vbk1vdXNlTGVhdmUoTW91c2UuZWRnZUhvdmVyaW5nT3ZlcilcbiAgICB9IGVsc2UgaWYgKGVkZ2UgIT09IGZhbHNlICYmIE1vdXNlLmVkZ2VIb3ZlcmluZ092ZXIgPT09IGZhbHNlKSB7XG4gICAgICAvLyBtb3VzZSBpcyBvbiBhbiBlZGdlLCBidXQgdGhlcmUgaXNuJ3QgYSBzdG9yZWQgZWRnZVxuICAgICAgc2VsZi5vbk1vdXNlRW50ZXIoZWRnZSlcbiAgICB9IGVsc2UgaWYgKGVkZ2UgIT09IGZhbHNlICYmIE1vdXNlLmVkZ2VIb3ZlcmluZ092ZXIgIT09IGVkZ2UpIHtcbiAgICAgIC8vIG1vdXNlIGlzIG9uIGFuIGVkZ2UsIGJ1dCBhIGRpZmZlcmVudCBlZGdlIGlzIHN0b3JlZFxuICAgICAgc2VsZi5vbk1vdXNlTGVhdmUoTW91c2UuZWRnZUhvdmVyaW5nT3ZlcilcbiAgICAgIHNlbGYub25Nb3VzZUVudGVyKGVkZ2UpXG4gICAgfVxuXG4gICAgLy8gY291bGQgYmUgZmFsc2VcbiAgICBNb3VzZS5lZGdlSG92ZXJpbmdPdmVyID0gZWRnZVxuXG4gICAgaWYgKCFub2RlICYmICFlZGdlKSB7XG4gICAgICAkKCdjYW52YXMnKS5jc3MoJ2N1cnNvcicsICdkZWZhdWx0JylcbiAgICB9XG4gIH0sIC8vIG9uTW91c2VNb3ZlSGFuZGxlclxuICBlbnRlcktleUhhbmRsZXI6IGZ1bmN0aW9uKGUpIHtcbiAgICBjb25zdCBjcmVhdGluZ01hcCA9IEdsb2JhbFVJLmxpZ2h0Ym94XG4gICAgaWYgKGNyZWF0aW5nTWFwID09PSAnbmV3bWFwJyB8fCBjcmVhdGluZ01hcCA9PT0gJ2ZvcmttYXAnKSB7XG4gICAgICBHbG9iYWxVSS5DcmVhdGVNYXAuc3VibWl0KClcbiAgICB9IGVsc2UgaWYgKGUudGFyZ2V0LmlkID09PSAndG9waWNfbmFtZScgJiYgIUNyZWF0ZS5uZXdUb3BpYy5tZXRhY29kZVNlbGVjdG9yT3Blbikge1xuICAgICAgVG9waWMuY3JlYXRlVG9waWNMb2NhbGx5KClcbiAgICB9IGVsc2UgaWYgKENyZWF0ZS5uZXdTeW5hcHNlLmJlaW5nQ3JlYXRlZCkge1xuICAgICAgU3luYXBzZS5jcmVhdGVTeW5hcHNlTG9jYWxseShDcmVhdGUubmV3U3luYXBzZS50b3BpYzFpZCwgQ3JlYXRlLm5ld1N5bmFwc2UudG9waWMyaWQpXG4gICAgICBFbmdpbmUucnVuTGF5b3V0KClcbiAgICAgIENyZWF0ZS5uZXdTeW5hcHNlLmhpZGUoKVxuICAgIH1cbiAgfSwgLy8gZW50ZXJLZXlIYW5kbGVyXG4gIGVzY0tleUhhbmRsZXI6IGZ1bmN0aW9uKCkge1xuICAgIENvbnRyb2wuZGVzZWxlY3RBbGxFZGdlcygpXG4gICAgQ29udHJvbC5kZXNlbGVjdEFsbE5vZGVzKClcbiAgfSwgLy8gZXNjS2V5SGFuZGxlclxuICBvbkRyYWdNb3ZlVG9waWNIYW5kbGVyOiBmdW5jdGlvbihub2RlLCBldmVudEluZm8sIGUpIHtcbiAgICB2YXIgc2VsZiA9IEpJVFxuXG4gICAgdmFyIGF1dGhvcml6ZWQgPSBBY3RpdmUuTWFwICYmIEFjdGl2ZS5NYXAuYXV0aG9yaXplVG9FZGl0KEFjdGl2ZS5NYXBwZXIpXG5cbiAgICBpZiAobm9kZSAmJiAhbm9kZS5ub2RlRnJvbSkge1xuXG4gICAgICBjb25zdCBwb3MgPSBldmVudEluZm8uZ2V0UG9zKClcbiAgICAgIGlmICgoZS5idXR0b24gPT09IDAgfHwgZS5idXR0b25zID09PSAwKSAmJiBhdXRob3JpemVkKSB7XG4gICAgICAgIC8vIHN0YXJ0IHN5bmFwc2UgY3JlYXRpb24gIC0+c2Vjb25kIG9wdGlvbiBpcyBmb3IgZmlyZWZveFxuICAgICAgICBpZiAoSklULnRlbXBJbml0ID09PSBmYWxzZSkge1xuICAgICAgICAgIEpJVC50ZW1wTm9kZSA9IG5vZGVcbiAgICAgICAgICBKSVQudGVtcEluaXQgPSB0cnVlXG4gICAgICAgICAgQ3JlYXRlLm5ld1N5bmFwc2UuaGlkZSgpXG4gICAgICAgICAgLy8gc2V0IHRoZSBkcmF3IHN5bmFwc2Ugc3RhcnQgcG9zaXRpb25zXG4gICAgICAgICAgTW91c2Uuc3luYXBzZVN0YXJ0Q29vcmRpbmF0ZXMgPSBbXVxuICAgICAgICAgIGlmIChTZWxlY3RlZC5Ob2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIFNlbGVjdGVkLk5vZGVzLmZvckVhY2gobiA9PiB7XG4gICAgICAgICAgICAgIE1vdXNlLnN5bmFwc2VTdGFydENvb3JkaW5hdGVzLnB1c2goe1xuICAgICAgICAgICAgICAgIHg6IG4ucG9zLmdldGMoKS54LFxuICAgICAgICAgICAgICAgIHk6IG4ucG9zLmdldGMoKS55XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIE1vdXNlLnN5bmFwc2VTdGFydENvb3JkaW5hdGVzID0gW3tcbiAgICAgICAgICAgICAgeDogbm9kZS5wb3MuZ2V0YygpLngsXG4gICAgICAgICAgICAgIHk6IG5vZGUucG9zLmdldGMoKS55XG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH1cbiAgICAgICAgICBNb3VzZS5zeW5hcHNlRW5kQ29vcmRpbmF0ZXMgPSB7XG4gICAgICAgICAgICB4OiBwb3MueCxcbiAgICAgICAgICAgIHk6IHBvcy55XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIGxldCB0ZW1wID0gZXZlbnRJbmZvLmdldE5vZGUoKVxuICAgICAgICBpZiAodGVtcCAhPT0gZmFsc2UgJiYgdGVtcC5pZCAhPT0gbm9kZS5pZCAmJiBTZWxlY3RlZC5Ob2Rlcy5pbmRleE9mKHRlbXApID09PSAtMSkgeyAvLyB0aGlzIG1lYW5zIGEgTm9kZSBoYXMgYmVlbiByZXR1cm5lZFxuICAgICAgICAgIEpJVC50ZW1wTm9kZTIgPSB0ZW1wXG4gICAgICAgICAgTW91c2Uuc3luYXBzZUVuZENvb3JkaW5hdGVzID0ge1xuICAgICAgICAgICAgeDogSklULnRlbXBOb2RlMi5wb3MuZ2V0YygpLngsXG4gICAgICAgICAgICB5OiBKSVQudGVtcE5vZGUyLnBvcy5nZXRjKCkueVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBiZWZvcmUgbWFraW5nIHRoZSBoaWdobGlnaHRlZCBvbmUgYmlnZ2VyLCBtYWtlIHN1cmUgYWxsIHRoZSBvdGhlcnMgYXJlIHJlZ3VsYXIgc2l6ZVxuICAgICAgICAgIFZpc3VhbGl6ZS5tR3JhcGguZ3JhcGguZWFjaE5vZGUoZnVuY3Rpb24obikge1xuICAgICAgICAgICAgbi5zZXREYXRhKCdkaW0nLCAyNSwgJ2N1cnJlbnQnKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgdGVtcC5zZXREYXRhKCdkaW0nLCAzNSwgJ2N1cnJlbnQnKVxuICAgICAgICB9IGVsc2UgaWYgKCF0ZW1wKSB7XG4gICAgICAgICAgSklULnRlbXBOb2RlMiA9IG51bGxcbiAgICAgICAgICBNb3VzZS5zeW5hcHNlRW5kQ29vcmRpbmF0ZXMgPSB7XG4gICAgICAgICAgICB4OiBwb3MueCxcbiAgICAgICAgICAgIHk6IHBvcy55XG4gICAgICAgICAgfVxuICAgICAgICAgIFZpc3VhbGl6ZS5tR3JhcGguZ3JhcGguZWFjaE5vZGUoZnVuY3Rpb24obikge1xuICAgICAgICAgICAgbi5zZXREYXRhKCdkaW0nLCAyNSwgJ2N1cnJlbnQnKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgVmlzdWFsaXplLm1HcmFwaC5wbG90KClcbiAgfSwgLy8gb25EcmFnTW92ZVRvcGljSGFuZGxlclxuICBvbkRyYWdDYW5jZWxIYW5kbGVyOiBmdW5jdGlvbihub2RlLCBldmVudEluZm8sIGUpIHtcbiAgICBKSVQudGVtcE5vZGUgPSBudWxsXG4gICAgaWYgKEpJVC50ZW1wTm9kZTIpIEpJVC50ZW1wTm9kZTIuc2V0RGF0YSgnZGltJywgMjUsICdjdXJyZW50JylcbiAgICBKSVQudGVtcE5vZGUyID0gbnVsbFxuICAgIEpJVC50ZW1wSW5pdCA9IGZhbHNlXG4gICAgLy8gcmVzZXQgdGhlIGRyYXcgc3luYXBzZSBwb3NpdGlvbnMgdG8gZmFsc2VcbiAgICBNb3VzZS5zeW5hcHNlU3RhcnRDb29yZGluYXRlcyA9IFtdXG4gICAgTW91c2Uuc3luYXBzZUVuZENvb3JkaW5hdGVzID0gbnVsbFxuICAgIFZpc3VhbGl6ZS5tR3JhcGgucGxvdCgpXG4gIH0sIC8vIG9uRHJhZ0NhbmNlbEhhbmRsZXJcbiAgb25EcmFnRW5kVG9waWNIYW5kbGVyOiBmdW5jdGlvbihub2RlLCBldmVudEluZm8sIGUpIHtcbiAgICBjb25zdCBzZWxmID0gSklUXG4gICAgY29uc3QgbWlkcG9pbnQgPSB7fVxuICAgIGxldCBwaXhlbFBvc1xuICAgIGxldCBtYXBwaW5nXG5cbiAgICBpZiAoSklULnRlbXBJbml0ICYmIEpJVC50ZW1wTm9kZTIgPT09IG51bGwpIHtcbiAgICAgIE1vdXNlLnN5bmFwc2VFbmRDb29yZGluYXRlcyA9IG51bGxcbiAgICB9IGVsc2UgaWYgKEpJVC50ZW1wSW5pdCAmJiBKSVQudGVtcE5vZGUyICE9PSBudWxsKSB7XG4gICAgICAvLyB0aGlzIG1lYW5zIHlvdSB3YW50IHRvIGNyZWF0ZSBhIHN5bmFwc2UgYmV0d2VlbiB0d28gZXhpc3RpbmcgdG9waWNzXG4gICAgICBDcmVhdGUubmV3U3luYXBzZS50b3BpYzFpZCA9IEpJVC50ZW1wTm9kZS5nZXREYXRhKCd0b3BpYycpLmlkXG4gICAgICBDcmVhdGUubmV3U3luYXBzZS50b3BpYzJpZCA9IEpJVC50ZW1wTm9kZTIuZ2V0RGF0YSgndG9waWMnKS5pZFxuICAgICAgQ3JlYXRlLm5ld1N5bmFwc2Uubm9kZTEgPSBKSVQudGVtcE5vZGVcbiAgICAgIENyZWF0ZS5uZXdTeW5hcHNlLm5vZGUyID0gSklULnRlbXBOb2RlMlxuICAgICAgSklULnRlbXBOb2RlMi5zZXREYXRhKCdkaW0nLCAyNSwgJ2N1cnJlbnQnKVxuICAgICAgbWlkcG9pbnQueCA9IEpJVC50ZW1wTm9kZS5wb3MuZ2V0YygpLnggKyAoSklULnRlbXBOb2RlMi5wb3MuZ2V0YygpLnggLSBKSVQudGVtcE5vZGUucG9zLmdldGMoKS54KSAvIDJcbiAgICAgIG1pZHBvaW50LnkgPSBKSVQudGVtcE5vZGUucG9zLmdldGMoKS55ICsgKEpJVC50ZW1wTm9kZTIucG9zLmdldGMoKS55IC0gSklULnRlbXBOb2RlLnBvcy5nZXRjKCkueSkgLyAyXG4gICAgICBwaXhlbFBvcyA9IFV0aWwuY29vcmRzVG9QaXhlbHMoVmlzdWFsaXplLm1HcmFwaCwgbWlkcG9pbnQpXG4gICAgICAkKCcjbmV3X3N5bmFwc2UnKS5jc3MoJ2xlZnQnLCBwaXhlbFBvcy54ICsgJ3B4JylcbiAgICAgICQoJyNuZXdfc3luYXBzZScpLmNzcygndG9wJywgcGl4ZWxQb3MueSArICdweCcpXG4gICAgICBDcmVhdGUubmV3U3luYXBzZS5vcGVuKClcbiAgICAgIEpJVC50ZW1wTm9kZSA9IG51bGxcbiAgICAgIEpJVC50ZW1wTm9kZTIgPSBudWxsXG4gICAgICBKSVQudGVtcEluaXQgPSBmYWxzZVxuICAgIH1cbiAgICBWaXN1YWxpemUubUdyYXBoLnBsb3QoKVxuICB9LCAvLyBvbkRyYWdFbmRUb3BpY0hhbmRsZXJcbiAgY2FudmFzQ2xpY2tIYW5kbGVyOiBmdW5jdGlvbihjYW52YXNMb2MsIGUpIHtcbiAgICAvLyBncmFiIHRoZSBsb2NhdGlvbiBhbmQgdGltZXN0YW1wIG9mIHRoZSBjbGlja1xuICAgIGNvbnN0IHN0b3JlZFRpbWUgPSBNb3VzZS5sYXN0Q2FudmFzQ2xpY2tcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpIC8vIG5vdCBjb21wYXRpYmxlIHdpdGggSUU4IEZZSVxuICAgIE1vdXNlLmxhc3RDYW52YXNDbGljayA9IG5vd1xuXG4gICAgY29uc3QgYXV0aG9yaXplZCA9IEFjdGl2ZS5NYXAgJiYgQWN0aXZlLk1hcC5hdXRob3JpemVUb0VkaXQoQWN0aXZlLk1hcHBlcilcblxuICAgIGlmIChub3cgLSBzdG9yZWRUaW1lIDwgTW91c2UuRE9VQkxFX0NMSUNLX1RPTEVSQU5DRSAmJiAhTW91c2UuZGlkUGFuKSB7XG4gICAgICAvLyBET1VCTEUgQ0xJQ0tcbiAgICB9IGVsc2UgaWYgKCFNb3VzZS5kaWRQYW4pIHtcbiAgICAgIC8vIFNJTkdMRSBDTElDSywgbm8gcGFuXG4gICAgICBGaWx0ZXIuY2xvc2UoKVxuICAgICAgVG9waWNDYXJkLmhpZGVDYXJkKClcbiAgICAgIFN5bmFwc2VDYXJkLmhpZGVDYXJkKClcbiAgICAgICQoJy5yaWdodGNsaWNrbWVudScpLnJlbW92ZSgpXG4gICAgICAvLyByZXNldCB0aGUgZHJhdyBzeW5hcHNlIHBvc2l0aW9ucyB0byBmYWxzZVxuICAgICAgTW91c2Uuc3luYXBzZVN0YXJ0Q29vcmRpbmF0ZXMgPSBbXVxuICAgICAgTW91c2Uuc3luYXBzZUVuZENvb3JkaW5hdGVzID0gbnVsbFxuICAgICAgSklULnRlbXBJbml0ID0gZmFsc2VcbiAgICAgIEpJVC50ZW1wTm9kZSA9IG51bGxcbiAgICAgIEpJVC50ZW1wTm9kZTIgPSBudWxsXG4gICAgICBpZiAoIWUuY3RybEtleSAmJiAhZS5zaGlmdEtleSkge1xuICAgICAgICBDb250cm9sLmRlc2VsZWN0QWxsRWRnZXMoKVxuICAgICAgICBDb250cm9sLmRlc2VsZWN0QWxsTm9kZXMoKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTSU5HTEUgQ0xJQ0ssIHJlc3VsdGluZyBmcm9tIHBhblxuICAgIH1cbiAgfSwgLy8gY2FudmFzQ2xpY2tIYW5kbGVyXG4gIHVwZGF0ZVRvcGljUG9zaXRpb25zOiBmdW5jdGlvbihub2RlLCBwb3MpIHtcbiAgICBjb25zdCBsZW4gPSBTZWxlY3RlZC5Ob2Rlcy5sZW5ndGhcbiAgICAvLyB0aGlzIGlzIHVzZWQgdG8gc2VuZCBub2RlcyB0aGF0IGFyZSBtb3ZpbmcgdG9cbiAgICAvLyBvdGhlciByZWFsdGltZSBjb2xsYWJvcmF0b3JzIG9uIHRoZSBzYW1lIG1hcFxuICAgIGNvbnN0IHBvc2l0aW9uc1RvU2VuZCA9IHt9XG5cbiAgICAvLyBmaXJzdCBkZWZpbmUgb2Zmc2V0IGZvciBlYWNoIG5vZGVcbiAgICB2YXIgeE9mZnNldCA9IFtdXG4gICAgdmFyIHlPZmZzZXQgPSBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IG4gPSBTZWxlY3RlZC5Ob2Rlc1tpXVxuICAgICAgeE9mZnNldFtpXSA9IG4ucG9zLmdldGMoKS54IC0gbm9kZS5wb3MuZ2V0YygpLnhcbiAgICAgIHlPZmZzZXRbaV0gPSBuLnBvcy5nZXRjKCkueSAtIG5vZGUucG9zLmdldGMoKS55XG4gICAgfSAvLyBmb3JcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IG4gPSBTZWxlY3RlZC5Ob2Rlc1tpXVxuICAgICAgY29uc3QgeCA9IHBvcy54ICsgeE9mZnNldFtpXVxuICAgICAgY29uc3QgeSA9IHBvcy55ICsgeU9mZnNldFtpXVxuICAgICAgaWYgKG4ucG9zLnJobyB8fCBuLnBvcy5yaG8gPT09IDApIHtcbiAgICAgICAgLy8gdGhpcyBtZWFucyB3ZSdyZSBpbiB0b3BpYyB2aWV3XG4gICAgICAgIGNvbnN0IHJobyA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5KVxuICAgICAgICBjb25zdCB0aGV0YSA9IE1hdGguYXRhbjIoeSwgeClcbiAgICAgICAgbi5wb3Muc2V0cCh0aGV0YSwgcmhvKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbi5wb3Muc2V0Yyh4LCB5KVxuICAgICAgfVxuXG4gICAgICBpZiAoQWN0aXZlLk1hcCkge1xuICAgICAgICBjb25zdCB0b3BpYyA9IG4uZ2V0RGF0YSgndG9waWMnKVxuICAgICAgICAvLyB3ZSB1c2UgdGhlIHRvcGljIElEIG5vdCB0aGUgbm9kZSBpZFxuICAgICAgICAvLyBiZWNhdXNlIHdlIGNhbid0IGRlcGVuZCBvbiB0aGUgbm9kZSBpZFxuICAgICAgICAvLyB0byBiZSB0aGUgc2FtZSBhcyBvbiBvdGhlciBjb2xsYWJvcmF0b3JzXG4gICAgICAgIC8vIG1hcHNcbiAgICAgICAgcG9zaXRpb25zVG9TZW5kW3RvcGljLmlkXSA9IG4ucG9zXG4gICAgICB9XG4gICAgfSAvLyBmb3JcblxuICAgIGlmIChBY3RpdmUuTWFwKSB7XG4gICAgICAkKGRvY3VtZW50KS50cmlnZ2VyKEpJVC5ldmVudHMudG9waWNEcmFnLCBbcG9zaXRpb25zVG9TZW5kXSlcbiAgICB9XG4gIH0sXG5cbiAgbm9kZURvdWJsZUNsaWNrSGFuZGxlcjogZnVuY3Rpb24obm9kZSwgZSkge1xuICAgIFRvcGljQ2FyZC5zaG93Q2FyZChub2RlKVxuICB9LCAvLyBub2RlRG91YmxlQ2xpY2tIYW5kbGVyXG4gIGVkZ2VEb3VibGVDbGlja0hhbmRsZXI6IGZ1bmN0aW9uKGFkaiwgZSkge1xuICAgIFN5bmFwc2VDYXJkLnNob3dDYXJkKGFkaiwgZSlcbiAgfSwgLy8gbm9kZURvdWJsZUNsaWNrSGFuZGxlclxuICBub2RlV2FzRG91YmxlQ2xpY2tlZDogZnVuY3Rpb24oKSB7XG4gICAgLy8gZ3JhYiB0aGUgdGltZXN0YW1wIG9mIHRoZSBjbGlja1xuICAgIGNvbnN0IHN0b3JlZFRpbWUgPSBNb3VzZS5sYXN0Tm9kZUNsaWNrXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKSAvLyBub3QgY29tcGF0aWJsZSB3aXRoIElFOCBGWUlcbiAgICBNb3VzZS5sYXN0Tm9kZUNsaWNrID0gbm93XG5cbiAgICBpZiAobm93IC0gc3RvcmVkVGltZSA8IE1vdXNlLkRPVUJMRV9DTElDS19UT0xFUkFOQ0UpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfSwgLy8gbm9kZVdhc0RvdWJsZUNsaWNrZWRcbiAgaGFuZGxlU2VsZWN0aW9uQmVmb3JlRHJhZ2dpbmc6IGZ1bmN0aW9uKG5vZGUsIGUpIHtcbiAgICBpZiAoU2VsZWN0ZWQuTm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBDb250cm9sLnNlbGVjdE5vZGUobm9kZSwgZSlcbiAgICB9XG4gICAgaWYgKFNlbGVjdGVkLk5vZGVzLmluZGV4T2Yobm9kZSkgPT09IC0xKSB7XG4gICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICBDb250cm9sLnNlbGVjdE5vZGUobm9kZSwgZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIENvbnRyb2wuZGVzZWxlY3RBbGxFZGdlcygpXG4gICAgICAgIENvbnRyb2wuZGVzZWxlY3RBbGxOb2RlcygpXG4gICAgICAgIENvbnRyb2wuc2VsZWN0Tm9kZShub2RlLCBlKVxuICAgICAgfVxuICAgIH1cbiAgfSwgLy8gIGhhbmRsZVNlbGVjdGlvbkJlZm9yZURyYWdnaW5nXG4gIGdldE5vZGVYWTogZnVuY3Rpb24obm9kZSkge1xuICAgIGlmICh0eXBlb2Ygbm9kZS5wb3MueCA9PT0gJ251bWJlcicgJiYgdHlwZW9mIG5vZGUucG9zLnkgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gbm9kZS5wb3NcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBub2RlLnBvcy50aGV0YSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIG5vZGUucG9zLnJobyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBuZXcgJGppdC5Qb2xhcihub2RlLnBvcy50aGV0YSwgbm9kZS5wb3MucmhvKS5nZXRjKHRydWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2dldE5vZGVYWTogdW5yZWNvZ25pemVkIG5vZGUgcG9zIGZvcm1hdCcpXG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gIH0sXG4gIHNlbGVjdFdpdGhCb3g6IGZ1bmN0aW9uKGUpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpc1xuICAgIGxldCBzWCA9IE1vdXNlLmJveFN0YXJ0Q29vcmRpbmF0ZXMueFxuICAgIGxldCBzWSA9IE1vdXNlLmJveFN0YXJ0Q29vcmRpbmF0ZXMueVxuICAgIGxldCBlWCA9IE1vdXNlLmJveEVuZENvb3JkaW5hdGVzLnhcbiAgICBsZXQgZVkgPSBNb3VzZS5ib3hFbmRDb29yZGluYXRlcy55XG5cbiAgICBpZiAoIWUuc2hpZnRLZXkpIHtcbiAgICAgIENvbnRyb2wuZGVzZWxlY3RBbGxOb2RlcygpXG4gICAgICBDb250cm9sLmRlc2VsZWN0QWxsRWRnZXMoKVxuICAgIH1cblxuICAgIC8vIHNlbGVjdCBhbGwgbm9kZXMgdGhhdCBhcmUgd2l0aGluIHRoZSBib3hcbiAgICBWaXN1YWxpemUubUdyYXBoLmdyYXBoLmVhY2hOb2RlKGZ1bmN0aW9uKG4pIHtcbiAgICAgIGNvbnN0IHBvcyA9IHNlbGYuZ2V0Tm9kZVhZKG4pXG4gICAgICBjb25zdCB4ID0gcG9zLnhcbiAgICAgIGNvbnN0IHkgPSBwb3MueVxuXG4gICAgICAvLyBkZXBlbmRpbmcgb24gd2hpY2ggd2F5IHRoZSBwZXJzb24gZHJhZ2dlZCB0aGUgYm94LCBjaGVjayB0aGF0XG4gICAgICAvLyB4IGFuZCB5IGFyZSBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcyBvZiB0aGUgYm94XG4gICAgICBpZiAoKHNYIDwgeCAmJiB4IDwgZVggJiYgc1kgPCB5ICYmIHkgPCBlWSkgfHxcbiAgICAgICAgKHNYID4geCAmJiB4ID4gZVggJiYgc1kgPiB5ICYmIHkgPiBlWSkgfHxcbiAgICAgICAgKHNYID4geCAmJiB4ID4gZVggJiYgc1kgPCB5ICYmIHkgPCBlWSkgfHxcbiAgICAgICAgKHNYIDwgeCAmJiB4IDwgZVggJiYgc1kgPiB5ICYmIHkgPiBlWSkpIHtcbiAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICBpZiAobi5zZWxlY3RlZCkge1xuICAgICAgICAgICAgQ29udHJvbC5kZXNlbGVjdE5vZGUobilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgQ29udHJvbC5zZWxlY3ROb2RlKG4sIGUpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIENvbnRyb2wuc2VsZWN0Tm9kZShuLCBlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIENvbnZlcnQgc2VsZWN0aW9uIGJveCBjb29yZGluYXRlcyB0byB0cmFkaXRpb25hbCBjb29yZGluYXRlcyAoKywrKSBpbiB1cHBlciByaWdodFxuICAgIHNZID0gLTEgKiBzWVxuICAgIGVZID0gLTEgKiBlWVxuXG4gICAgY29uc3QgZWRnZXNUb1RvZ2dsZSA9IFtdXG4gICAgRGF0YU1vZGVsLlN5bmFwc2VzLmVhY2goZnVuY3Rpb24oc3luYXBzZSkge1xuICAgICAgY29uc3QgZSA9IHN5bmFwc2UuZ2V0KCdlZGdlJylcbiAgICAgIGlmIChlZGdlc1RvVG9nZ2xlLmluZGV4T2YoZSkgPT09IC0xKSB7XG4gICAgICAgIGVkZ2VzVG9Ub2dnbGUucHVzaChlKVxuICAgICAgfVxuICAgIH0pXG4gICAgZWRnZXNUb1RvZ2dsZS5mb3JFYWNoKGZ1bmN0aW9uKGVkZ2UpIHtcbiAgICAgIGNvbnN0IGZyb21Ob2RlUG9zID0gc2VsZi5nZXROb2RlWFkoZWRnZS5ub2RlRnJvbSlcbiAgICAgIGNvbnN0IGZyb21Ob2RlWCA9IGZyb21Ob2RlUG9zLnhcbiAgICAgIGNvbnN0IGZyb21Ob2RlWSA9IC0xICogZnJvbU5vZGVQb3MueVxuICAgICAgY29uc3QgdG9Ob2RlUG9zID0gc2VsZi5nZXROb2RlWFkoZWRnZS5ub2RlVG8pXG4gICAgICBjb25zdCB0b05vZGVYID0gdG9Ob2RlUG9zLnhcbiAgICAgIGNvbnN0IHRvTm9kZVkgPSAtMSAqIHRvTm9kZVBvcy55XG5cbiAgICAgIGxldCBtYXhYID0gZnJvbU5vZGVYXG4gICAgICBsZXQgbWF4WSA9IGZyb21Ob2RlWVxuICAgICAgbGV0IG1pblggPSBmcm9tTm9kZVhcbiAgICAgIGxldCBtaW5ZID0gZnJvbU5vZGVZXG5cbiAgICAgIC8vIENvcnJlY3QgbWF4WCwgTWF4WSB2YWx1ZXNcbiAgICAgIDsodG9Ob2RlWCA+IG1heFgpID8gKG1heFggPSB0b05vZGVYKSA6IChtaW5YID0gdG9Ob2RlWClcbiAgICAgIDsodG9Ob2RlWSA+IG1heFkpID8gKG1heFkgPSB0b05vZGVZKSA6IChtaW5ZID0gdG9Ob2RlWSlcblxuICAgICAgbGV0IG1heEJveFggPSBzWFxuICAgICAgbGV0IG1heEJveFkgPSBzWVxuICAgICAgbGV0IG1pbkJveFggPSBzWFxuICAgICAgbGV0IG1pbkJveFkgPSBzWVxuXG4gICAgICAvLyBDb3JyZWN0IG1heEJveFgsIG1heEJveFkgdmFsdWVzXG4gICAgICA7KGVYID4gbWF4Qm94WCkgPyAobWF4Qm94WCA9IGVYKSA6IChtaW5Cb3hYID0gZVgpXG4gICAgICA7KGVZID4gbWF4Qm94WSkgPyAobWF4Qm94WSA9IGVZKSA6IChtaW5Cb3hZID0gZVkpXG5cbiAgICAgIC8vIEZpbmQgdGhlIHNsb3BlcyBmcm9tIHRoZSBzeW5hcHNlIGZyb21Ob2RlIHRvIHRoZSA0IGNvcm5lcnMgb2YgdGhlIHNlbGVjdGlvbiBib3hcbiAgICAgIGNvbnN0IHNsb3BlcyA9IFtdXG4gICAgICBzbG9wZXMucHVzaCgoc1kgLSBmcm9tTm9kZVkpIC8gKHNYIC0gZnJvbU5vZGVYKSlcbiAgICAgIHNsb3Blcy5wdXNoKChzWSAtIGZyb21Ob2RlWSkgLyAoZVggLSBmcm9tTm9kZVgpKVxuICAgICAgc2xvcGVzLnB1c2goKGVZIC0gZnJvbU5vZGVZKSAvIChlWCAtIGZyb21Ob2RlWCkpXG4gICAgICBzbG9wZXMucHVzaCgoZVkgLSBmcm9tTm9kZVkpIC8gKHNYIC0gZnJvbU5vZGVYKSlcblxuICAgICAgbGV0IG1pblNsb3BlID0gc2xvcGVzWzBdXG4gICAgICBsZXQgbWF4U2xvcGUgPSBzbG9wZXNbMF1cbiAgICAgIHNsb3Blcy5mb3JFYWNoKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgICAgIGlmIChlbnRyeSA+IG1heFNsb3BlKSBtYXhTbG9wZSA9IGVudHJ5XG4gICAgICAgIGlmIChlbnRyeSA8IG1pblNsb3BlKSBtaW5TbG9wZSA9IGVudHJ5XG4gICAgICB9KVxuXG4gICAgICAvLyBGaW5kIHN5bmFwc2UtaW4tcXVlc3Rpb24ncyBzbG9wZVxuICAgICAgY29uc3Qgc3luU2xvcGUgPSAodG9Ob2RlWSAtIGZyb21Ob2RlWSkgLyAodG9Ob2RlWCAtIGZyb21Ob2RlWClcbiAgICAgIGNvbnN0IGIgPSBmcm9tTm9kZVkgLSBzeW5TbG9wZSAqIGZyb21Ob2RlWFxuXG4gICAgICAvLyBVc2UgdGhlIHNlbGVjdGlvbiBib3ggZWRnZXMgYXMgdGVzdCBjYXNlcyBmb3Igc3luYXBzZSBpbnRlcnNlY3Rpb25cbiAgICAgIGxldCB0ZXN0WCA9IHNYXG4gICAgICBsZXQgdGVzdFkgPSBzeW5TbG9wZSAqIHRlc3RYICsgYlxuXG4gICAgICBsZXQgc2VsZWN0VGVzdFxuXG4gICAgICBpZiAodGVzdFggPj0gbWluWCAmJiB0ZXN0WCA8PSBtYXhYICYmIHRlc3RZID49IG1pblkgJiYgdGVzdFkgPD0gbWF4WSAmJiB0ZXN0WSA+PSBtaW5Cb3hZICYmIHRlc3RZIDw9IG1heEJveFkpIHtcbiAgICAgICAgc2VsZWN0VGVzdCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgdGVzdFggPSBlWFxuICAgICAgdGVzdFkgPSBzeW5TbG9wZSAqIHRlc3RYICsgYlxuXG4gICAgICBpZiAodGVzdFggPj0gbWluWCAmJiB0ZXN0WCA8PSBtYXhYICYmIHRlc3RZID49IG1pblkgJiYgdGVzdFkgPD0gbWF4WSAmJiB0ZXN0WSA+PSBtaW5Cb3hZICYmIHRlc3RZIDw9IG1heEJveFkpIHtcbiAgICAgICAgc2VsZWN0VGVzdCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgdGVzdFkgPSBzWVxuICAgICAgdGVzdFggPSAodGVzdFkgLSBiKSAvIHN5blNsb3BlXG5cbiAgICAgIGlmICh0ZXN0WCA+PSBtaW5YICYmIHRlc3RYIDw9IG1heFggJiYgdGVzdFkgPj0gbWluWSAmJiB0ZXN0WSA8PSBtYXhZICYmIHRlc3RYID49IG1pbkJveFggJiYgdGVzdFggPD0gbWF4Qm94WCkge1xuICAgICAgICBzZWxlY3RUZXN0ID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICB0ZXN0WSA9IGVZXG4gICAgICB0ZXN0WCA9ICh0ZXN0WSAtIGIpIC8gc3luU2xvcGVcblxuICAgICAgaWYgKHRlc3RYID49IG1pblggJiYgdGVzdFggPD0gbWF4WCAmJiB0ZXN0WSA+PSBtaW5ZICYmIHRlc3RZIDw9IG1heFkgJiYgdGVzdFggPj0gbWluQm94WCAmJiB0ZXN0WCA8PSBtYXhCb3hYKSB7XG4gICAgICAgIHNlbGVjdFRlc3QgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIC8vIENhc2Ugd2hlcmUgdGhlIHN5bmFwc2UgaXMgd2hvbGx5IGVuY2xvc2VkIGluIHRoZSBzZWxkY3Rpb24gYm94XG4gICAgICBpZiAoZnJvbU5vZGVYID49IG1pbkJveFggJiYgZnJvbU5vZGVYIDw9IG1heEJveFggJiYgZnJvbU5vZGVZID49IG1pbkJveFkgJiYgZnJvbU5vZGVZIDw9IG1heEJveFkgJiYgdG9Ob2RlWCA+PSBtaW5Cb3hYICYmIHRvTm9kZVggPD0gbWF4Qm94WCAmJiB0b05vZGVZID49IG1pbkJveFkgJiYgdG9Ob2RlWSA8PSBtYXhCb3hZKSB7XG4gICAgICAgIHNlbGVjdFRlc3QgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSB0ZXN0IHN5bmFwc2Ugd2FzIHNlbGVjdGVkIVxuXG4gICAgICBpZiAoc2VsZWN0VGVzdCkge1xuICAgICAgICAvLyBzaGlmdEtleSA9IHRvZ2dsZVNlbGVjdCwgb3RoZXJ3aXNlXG4gICAgICAgIGlmIChlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgaWYgKFNlbGVjdGVkLkVkZ2VzLmluZGV4T2YoZWRnZSkgIT09IC0xKSB7XG4gICAgICAgICAgICBDb250cm9sLmRlc2VsZWN0RWRnZShlZGdlKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBDb250cm9sLnNlbGVjdEVkZ2UoZWRnZSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgQ29udHJvbC5zZWxlY3RFZGdlKGVkZ2UpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIE1vdXNlLmJveFN0YXJ0Q29vcmRpbmF0ZXMgPSBmYWxzZVxuICAgIE1vdXNlLmJveEVuZENvb3JkaW5hdGVzID0gZmFsc2VcbiAgICBWaXN1YWxpemUubUdyYXBoLnBsb3QoKVxuICB9LCAvLyBzZWxlY3RXaXRoQm94XG4gIHNlbGVjdE5vZGVPbkNsaWNrSGFuZGxlcjogZnVuY3Rpb24obm9kZSwgZSkge1xuICAgIGlmIChWaXN1YWxpemUubUdyYXBoLmJ1c3kpIHJldHVyblxuXG4gICAgY29uc3Qgc2VsZiA9IEpJVFxuXG4gICAgLy8gQ29weSB0b3BpYyB0aXRsZSB0byBjbGlwYm9hcmRcbiAgICBpZiAoZS5idXR0b24gPT09IDEgJiYgZS5jdHJsS2V5KSBjbGlwYm9hcmQuY29weShub2RlLm5hbWUpXG5cbiAgICAvLyBjYXRjaCByaWdodCBjbGljayBvbiBtYWMsIHdoaWNoIGlzIG9mdGVuIGxpa2UgY3RybCtjbGlja1xuICAgIGlmIChuYXZpZ2F0b3IucGxhdGZvcm0uaW5kZXhPZignTWFjJykgIT09IC0xICYmIGUuY3RybEtleSkge1xuICAgICAgc2VsZi5zZWxlY3ROb2RlT25SaWdodENsaWNrSGFuZGxlcihub2RlLCBlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gaWYgb24gYSB0b3BpYyBwYWdlLCBsZXQgYWx0K2NsaWNrIGNlbnRlciB5b3Ugb24gYSBuZXcgdG9waWNcbiAgICBpZiAoQWN0aXZlLlRvcGljICYmIGUuYWx0S2V5KSB7XG4gICAgICBKSVQuUkdyYXBoLmNlbnRlck9uKG5vZGUuaWQpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjaGVjayA9IHNlbGYubm9kZVdhc0RvdWJsZUNsaWNrZWQoKVxuICAgIGlmIChjaGVjaykge1xuICAgICAgc2VsZi5ub2RlRG91YmxlQ2xpY2tIYW5kbGVyKG5vZGUsIGUpXG4gICAgICByZXR1cm5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gd2FpdCBhIGNlcnRhaW4gbGVuZ3RoIG9mIHRpbWUsIHRoZW4gY2hlY2sgYWdhaW4sIHRoZW4gcnVuIHRoaXMgY29kZVxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCFKSVQubm9kZVdhc0RvdWJsZUNsaWNrZWQoKSkge1xuICAgICAgICAgIGlmIChlLmJ1dHRvbiA9PT0gMSAmJiAhZS5jdHJsS2V5KSB7XG4gICAgICAgICAgICB2YXIgbGVuID0gU2VsZWN0ZWQuTm9kZXMubGVuZ3RoXG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgbGV0IG4gPSBTZWxlY3RlZC5Ob2Rlc1tpXVxuICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gVXRpbC5vcGVuTGluayhEYXRhTW9kZWwuVG9waWNzLmdldChuLmlkKS5hdHRyaWJ1dGVzLmxpbmspXG5cbiAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsgLy8gaWYgbGluayBmYWlsZWQgdG8gb3BlblxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFub2RlLnNlbGVjdGVkKSBVdGlsLm9wZW5MaW5rKERhdGFNb2RlbC5Ub3BpY3MuZ2V0KG5vZGUuaWQpLmF0dHJpYnV0ZXMubGluaylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIE1vdXNlLkRPVUJMRV9DTElDS19UT0xFUkFOQ0UpXG4gICAgfVxuICB9LCAvLyBzZWxlY3ROb2RlT25DbGlja0hhbmRsZXJcbiAgc2VsZWN0Tm9kZU9uUmlnaHRDbGlja0hhbmRsZXI6IGZ1bmN0aW9uKG5vZGUsIGUpIHtcbiAgICAvLyB0aGUgJ25vZGUnIHZhcmlhYmxlIGlzIGEgSklUIG5vZGUsIHRoZSBvbmUgdGhhdCB3YXMgY2xpY2tlZCBvblxuICAgIC8vIHRoZSAnZScgdmFyaWFibGUgaXMgdGhlIGNsaWNrIGV2ZW50XG5cbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG5cbiAgICBpZiAoVmlzdWFsaXplLm1HcmFwaC5idXN5KSByZXR1cm5cblxuICAgIC8vIHNlbGVjdCB0aGUgbm9kZVxuICAgIENvbnRyb2wuc2VsZWN0Tm9kZShub2RlLCBlKVxuXG4gICAgLy8gZGVsZXRlIG9sZCByaWdodCBjbGljayBtZW51XG4gICAgJCgnLnJpZ2h0Y2xpY2ttZW51JykucmVtb3ZlKClcbiAgICAvLyBjcmVhdGUgbmV3IG1lbnUgZm9yIGNsaWNrZWQgb24gbm9kZVxuICAgIGNvbnN0IHJpZ2h0Y2xpY2ttZW51ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICByaWdodGNsaWNrbWVudS5jbGFzc05hbWUgPSAncmlnaHRjbGlja21lbnUnXG4gICAgLy8gcHJldmVudCB0aGUgY3VzdG9tIGNvbnRleHQgbWVudSBmcm9tIGltbWVkaWF0ZWx5IG9wZW5pbmcgdGhlIGRlZmF1bHQgY29udGV4dCBtZW51IGFzIHdlbGxcbiAgICByaWdodGNsaWNrbWVudS5zZXRBdHRyaWJ1dGUoJ29uY29udGV4dG1lbnUnLCAncmV0dXJuIGZhbHNlJylcblxuICAgIC8vIGFkZCB0aGUgcHJvcGVyIG9wdGlvbnMgdG8gdGhlIG1lbnVcbiAgICBsZXQgbWVudXN0cmluZyA9ICc8dWw+J1xuXG4gICAgY29uc3QgYXV0aG9yaXplZCA9IEFjdGl2ZS5NYXAgJiYgQWN0aXZlLk1hcC5hdXRob3JpemVUb0VkaXQoQWN0aXZlLk1hcHBlcilcblxuICAgIGNvbnN0IGRpc2FibGVkID0gYXV0aG9yaXplZCA/ICcnIDogJ2Rpc2FibGVkJ1xuXG4gICAgaWYgKEFjdGl2ZS5NYXApIG1lbnVzdHJpbmcgKz0gJzxsaSBjbGFzcz1cInJjLWhpZGVcIj48ZGl2IGNsYXNzPVwicmMtaWNvblwiPjwvZGl2PkhpZGUgdW50aWwgcmVmcmVzaDxkaXYgY2xhc3M9XCJyYy1rZXlib2FyZFwiPkN0cmwrSDwvZGl2PjwvbGk+J1xuICAgIGlmIChBY3RpdmUuTWFwICYmIEFjdGl2ZS5NYXBwZXIpIG1lbnVzdHJpbmcgKz0gJzxsaSBjbGFzcz1cInJjLXJlbW92ZSAnICsgZGlzYWJsZWQgKyAnXCI+PGRpdiBjbGFzcz1cInJjLWljb25cIj48L2Rpdj5SZW1vdmUgZnJvbSBtYXA8ZGl2IGNsYXNzPVwicmMta2V5Ym9hcmRcIj5DdHJsK008L2Rpdj48L2xpPidcbiAgICBpZiAoQWN0aXZlLlRvcGljKSBtZW51c3RyaW5nICs9ICc8bGkgY2xhc3M9XCJyYy1yZW1vdmVcIj48ZGl2IGNsYXNzPVwicmMtaWNvblwiPjwvZGl2PlJlbW92ZSBmcm9tIHZpZXc8ZGl2IGNsYXNzPVwicmMta2V5Ym9hcmRcIj5DdHJsK008L2Rpdj48L2xpPidcbiAgICBpZiAoQWN0aXZlLk1hcCAmJiBBY3RpdmUuTWFwcGVyKSBtZW51c3RyaW5nICs9ICc8bGkgY2xhc3M9XCJyYy1kZWxldGUgJyArIGRpc2FibGVkICsgJ1wiPjxkaXYgY2xhc3M9XCJyYy1pY29uXCI+PC9kaXY+RGVsZXRlPGRpdiBjbGFzcz1cInJjLWtleWJvYXJkXCI+Q3RybCtEPC9kaXY+PC9saT4nXG5cbiAgICBpZiAoQWN0aXZlLlRvcGljKSB7XG4gICAgICBtZW51c3RyaW5nICs9ICc8bGkgY2xhc3M9XCJyYy1jZW50ZXJcIj48ZGl2IGNsYXNzPVwicmMtaWNvblwiPjwvZGl2PkNlbnRlciB0aGlzIHRvcGljPGRpdiBjbGFzcz1cInJjLWtleWJvYXJkXCI+QWx0K0U8L2Rpdj48L2xpPidcbiAgICB9XG5cbiAgICBtZW51c3RyaW5nICs9ICc8bGkgY2xhc3M9XCJyYy1wb3BvdXRcIj48ZGl2IGNsYXNzPVwicmMtaWNvblwiPjwvZGl2Pk9wZW4gaW4gbmV3IHRhYjwvbGk+J1xuXG4gICAgaWYgKEFjdGl2ZS5NYXBwZXIpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBvdXRkZW50YFxuICAgICAgICA8dWw+XG4gICAgICAgICAgPGxpIGNsYXNzPVwiY2hhbmdlUCB0b0NvbW1vbnNcIj48ZGl2IGNsYXNzPVwicmMtcGVybS1pY29uXCI+PC9kaXY+Y29tbW9uczwvbGk+XG4gICAgICAgICAgPGxpIGNsYXNzPVwiY2hhbmdlUCB0b1B1YmxpY1wiPjxkaXYgY2xhc3M9XCJyYy1wZXJtLWljb25cIj48L2Rpdj5wdWJsaWM8L2xpPlxuICAgICAgICAgIDxsaSBjbGFzcz1cImNoYW5nZVAgdG9Qcml2YXRlXCI+PGRpdiBjbGFzcz1cInJjLXBlcm0taWNvblwiPjwvZGl2PnByaXZhdGU8L2xpPlxuICAgICAgICA8L3VsPmBcblxuICAgICAgbWVudXN0cmluZyArPSAnPGxpIGNsYXNzPVwicmMtc3BhY2VyXCI+PC9saT4nXG5cbiAgICAgIG1lbnVzdHJpbmcgKz0gb3V0ZGVudGBcbiAgICAgICAgPGxpIGNsYXNzPVwicmMtcGVybWlzc2lvblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYy1pY29uXCI+PC9kaXY+XG4gICAgICAgICAgQ2hhbmdlIHBlcm1pc3Npb25zXG4gICAgICAgICAgJHtvcHRpb25zfVxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJleHBhbmRMaVwiPjwvZGl2PlxuICAgICAgICA8L2xpPmBcblxuICAgICAgY29uc3QgbWV0YWNvZGVPcHRpb25zID0gJCgnI21ldGFjb2RlT3B0aW9ucycpLmh0bWwoKVxuXG4gICAgICBtZW51c3RyaW5nICs9ICc8bGkgY2xhc3M9XCJyYy1tZXRhY29kZVwiPjxkaXYgY2xhc3M9XCJyYy1pY29uXCI+PC9kaXY+Q2hhbmdlIG1ldGFjb2RlJyArIG1ldGFjb2RlT3B0aW9ucyArICc8ZGl2IGNsYXNzPVwiZXhwYW5kTGlcIj48L2Rpdj48L2xpPidcbiAgICB9XG4gICAgaWYgKEFjdGl2ZS5Ub3BpYykge1xuICAgICAgaWYgKCFBY3RpdmUuTWFwcGVyKSB7XG4gICAgICAgIG1lbnVzdHJpbmcgKz0gJzxsaSBjbGFzcz1cInJjLXNwYWNlclwiPjwvbGk+J1xuICAgICAgfVxuXG4gICAgICAvLyBzZXQgdXAgdGhlIGdldCBzaWJsaW5nIG1lbnUgYXMgYSBcImxhenkgbG9hZFwiXG4gICAgICAvLyBvbmx5IGZpbGwgaW4gdGhlIHN1Ym1lbnUgd2hlbiB0aGV5IGhvdmVyIG92ZXIgdGhlIGdldCBzaWJsaW5ncyBsaXN0IGl0ZW1cbiAgICAgIGNvbnN0IHNpYmxpbmdNZW51ID0gb3V0ZGVudGBcbiAgICAgICAgPHVsIGlkPVwiZmV0Y2hTaWJsaW5nTGlzdFwiPlxuICAgICAgICAgIDxsaSBjbGFzcz1cImZldGNoQWxsXCI+QWxsPGRpdiBjbGFzcz1cInJjLWtleWJvYXJkXCI+QWx0K1I8L2Rpdj48L2xpPlxuICAgICAgICAgIDxsaSBpZD1cImxvYWRpbmdTaWJsaW5nc1wiPjwvbGk+XG4gICAgICAgIDwvdWw+YFxuICAgICAgbWVudXN0cmluZyArPSAnPGxpIGNsYXNzPVwicmMtc2libGluZ3NcIj48ZGl2IGNsYXNzPVwicmMtaWNvblwiPjwvZGl2PlJldmVhbCBzaWJsaW5ncycgKyBzaWJsaW5nTWVudSArICc8ZGl2IGNsYXNzPVwiZXhwYW5kTGlcIj48L2Rpdj48L2xpPidcbiAgICB9XG5cbiAgICBtZW51c3RyaW5nICs9ICc8L3VsPidcbiAgICByaWdodGNsaWNrbWVudS5pbm5lckhUTUwgPSBtZW51c3RyaW5nXG5cbiAgICAvLyBwb3NpdGlvbiB0aGUgbWVudSB3aGVyZSB0aGUgY2xpY2sgaGFwcGVuZWRcbiAgICBjb25zdCBwb3NpdGlvbiA9IHt9XG4gICAgY29uc3QgUklHSFRDTElDS19XSURUSCA9IDMwMFxuICAgIGNvbnN0IFJJR0hUQ0xJQ0tfSEVJR0hUID0gMTQ0IC8vIHRoaXMgZG9lcyB2YXJ5IHNvbWV3aGF0LCBidXQgd2UgY2FuIHVzZSBzdGF0aWNcbiAgICBjb25zdCBTVUJNRU5VU19XSURUSCA9IDI1NlxuICAgIGNvbnN0IE1BWF9TVUJNRU5VX0hFSUdIVCA9IDI3MFxuICAgIGNvbnN0IHdpbmRvd1dpZHRoID0gJCh3aW5kb3cpLndpZHRoKClcbiAgICBjb25zdCB3aW5kb3dIZWlnaHQgPSAkKHdpbmRvdykuaGVpZ2h0KClcblxuICAgIGlmICh3aW5kb3dXaWR0aCAtIGUuY2xpZW50WCA8IFNVQk1FTlVTX1dJRFRIKSB7XG4gICAgICBwb3NpdGlvbi5yaWdodCA9IHdpbmRvd1dpZHRoIC0gZS5jbGllbnRYXG4gICAgICAkKHJpZ2h0Y2xpY2ttZW51KS5hZGRDbGFzcygnbW92ZU1lbnVzVG9MZWZ0JylcbiAgICB9IGVsc2UgaWYgKHdpbmRvd1dpZHRoIC0gZS5jbGllbnRYIDwgUklHSFRDTElDS19XSURUSCkge1xuICAgICAgcG9zaXRpb24ucmlnaHQgPSB3aW5kb3dXaWR0aCAtIGUuY2xpZW50WFxuICAgIH0gZWxzZSBpZiAod2luZG93V2lkdGggLSBlLmNsaWVudFggPCBSSUdIVENMSUNLX1dJRFRIICsgU1VCTUVOVVNfV0lEVEgpIHtcbiAgICAgIHBvc2l0aW9uLmxlZnQgPSBlLmNsaWVudFhcbiAgICAgICQocmlnaHRjbGlja21lbnUpLmFkZENsYXNzKCdtb3ZlTWVudXNUb0xlZnQnKVxuICAgIH0gZWxzZSB7XG4gICAgICBwb3NpdGlvbi5sZWZ0ID0gZS5jbGllbnRYXG4gICAgfVxuXG4gICAgaWYgKHdpbmRvd0hlaWdodCAtIGUuY2xpZW50WSA8IE1BWF9TVUJNRU5VX0hFSUdIVCkge1xuICAgICAgcG9zaXRpb24uYm90dG9tID0gd2luZG93SGVpZ2h0IC0gZS5jbGllbnRZXG4gICAgICAkKHJpZ2h0Y2xpY2ttZW51KS5hZGRDbGFzcygnbW92ZU1lbnVzVXAnKVxuICAgIH0gZWxzZSBpZiAod2luZG93SGVpZ2h0IC0gZS5jbGllbnRZIDwgUklHSFRDTElDS19IRUlHSFQgKyBNQVhfU1VCTUVOVV9IRUlHSFQpIHtcbiAgICAgIHBvc2l0aW9uLnRvcCA9IGUuY2xpZW50WVxuICAgICAgJChyaWdodGNsaWNrbWVudSkuYWRkQ2xhc3MoJ21vdmVNZW51c1VwJylcbiAgICB9IGVsc2Uge1xuICAgICAgcG9zaXRpb24udG9wID0gZS5jbGllbnRZXG4gICAgfVxuXG4gICAgJChyaWdodGNsaWNrbWVudSkuY3NzKHBvc2l0aW9uKVxuICAgIC8vIGFkZCB0aGUgbWVudSB0byB0aGUgcGFnZVxuICAgICQoJyN3cmFwcGVyJykuYXBwZW5kKHJpZ2h0Y2xpY2ttZW51KVxuXG4gICAgLy8gYXR0YWNoIGV2ZW50cyB0byBjbGlja3Mgb24gdGhlIGxpc3QgaXRlbXNcblxuICAgIC8vIGRlbGV0ZSB0aGUgc2VsZWN0ZWQgdGhpbmdzIGZyb20gdGhlIGRhdGFiYXNlXG4gICAgaWYgKGF1dGhvcml6ZWQpIHtcbiAgICAgICQoJy5yYy1kZWxldGUnKS5jbGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgJCgnLnJpZ2h0Y2xpY2ttZW51JykucmVtb3ZlKClcbiAgICAgICAgQ29udHJvbC5kZWxldGVTZWxlY3RlZCgpXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIHJlbW92ZSB0aGUgc2VsZWN0ZWQgdGhpbmdzIGZyb20gdGhlIG1hcFxuICAgIGlmIChBY3RpdmUuVG9waWMgfHwgYXV0aG9yaXplZCkge1xuICAgICAgJCgnLnJjLXJlbW92ZScpLmNsaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgICAkKCcucmlnaHRjbGlja21lbnUnKS5yZW1vdmUoKVxuICAgICAgICBDb250cm9sLnJlbW92ZVNlbGVjdGVkRWRnZXMoKVxuICAgICAgICBDb250cm9sLnJlbW92ZVNlbGVjdGVkTm9kZXMoKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBoaWRlIHNlbGVjdGVkIG5vZGVzIGFuZCBzeW5hcHNlcyB1bnRpbCByZWZyZXNoXG4gICAgJCgnLnJjLWhpZGUnKS5jbGljayhmdW5jdGlvbigpIHtcbiAgICAgICQoJy5yaWdodGNsaWNrbWVudScpLnJlbW92ZSgpXG4gICAgICBDb250cm9sLmhpZGVTZWxlY3RlZEVkZ2VzKClcbiAgICAgIENvbnRyb2wuaGlkZVNlbGVjdGVkTm9kZXMoKVxuICAgIH0pXG5cbiAgICAvLyB3aGVuIGluIHJhZGlhbCwgY2VudGVyIG9uIHRoZSB0b3BpYyB5b3UgcGlja2VkXG4gICAgJCgnLnJjLWNlbnRlcicpLmNsaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgJCgnLnJpZ2h0Y2xpY2ttZW51JykucmVtb3ZlKClcbiAgICAgIFRvcGljLmNlbnRlck9uKG5vZGUuaWQpXG4gICAgfSlcblxuICAgIC8vIG9wZW4gdGhlIGVudGl0eSBpbiBhIG5ldyB0YWJcbiAgICAkKCcucmMtcG9wb3V0JykuY2xpY2soZnVuY3Rpb24oKSB7XG4gICAgICAkKCcucmlnaHRjbGlja21lbnUnKS5yZW1vdmUoKVxuICAgICAgY29uc3Qgd2luID0gd2luZG93Lm9wZW4oJy90b3BpY3MvJyArIG5vZGUuaWQsICdfYmxhbmsnKVxuICAgICAgd2luLmZvY3VzKClcbiAgICB9KVxuXG4gICAgLy8gY2hhbmdlIHRoZSBwZXJtaXNzaW9uIG9mIGFsbCB0aGUgc2VsZWN0ZWQgbm9kZXMgYW5kIHN5bmFwc2VzIHRoYXQgeW91IHdlcmUgdGhlIG9yaWdpbmF0b3Igb2ZcbiAgICAkKCcucmMtcGVybWlzc2lvbiBsaScpLmNsaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgJCgnLnJpZ2h0Y2xpY2ttZW51JykucmVtb3ZlKClcbiAgICAgIC8vICQodGhpcykudGV4dCgpIHdpbGwgYmUgJ2NvbW1vbnMnICdwdWJsaWMnIG9yICdwcml2YXRlJ1xuICAgICAgQ29udHJvbC51cGRhdGVTZWxlY3RlZFBlcm1pc3Npb25zKCQodGhpcykudGV4dCgpKVxuICAgIH0pXG5cbiAgICAvLyBjaGFuZ2UgdGhlIG1ldGFjb2RlIG9mIGFsbCB0aGUgc2VsZWN0ZWQgbm9kZXMgdGhhdCB5b3UgaGF2ZSBlZGl0IHBlcm1pc3Npb24gZm9yXG4gICAgJCgnLnJjLW1ldGFjb2RlIGxpIGxpJykuY2xpY2soZnVuY3Rpb24oKSB7XG4gICAgICAkKCcucmlnaHRjbGlja21lbnUnKS5yZW1vdmUoKVxuICAgICAgLy9cbiAgICAgIENvbnRyb2wudXBkYXRlU2VsZWN0ZWRNZXRhY29kZXMoJCh0aGlzKS5hdHRyKCdkYXRhLWlkJykpXG4gICAgfSlcblxuICAgIC8vIGZldGNoIHJlbGF0aXZlc1xuICAgIGxldCBmZXRjaFNlbnQgPSBmYWxzZVxuICAgICQoJy5yYy1zaWJsaW5ncycpLmhvdmVyKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFmZXRjaFNlbnQpIHtcbiAgICAgICAgSklULnBvcHVsYXRlUmlnaHRDbGlja1NpYmxpbmdzKG5vZGUpXG4gICAgICAgIGZldGNoU2VudCA9IHRydWVcbiAgICAgIH1cbiAgICB9KVxuICAgICQoJy5yYy1zaWJsaW5ncyAuZmV0Y2hBbGwnKS5jbGljayhmdW5jdGlvbigpIHtcbiAgICAgICQoJy5yaWdodGNsaWNrbWVudScpLnJlbW92ZSgpXG4gICAgICAvLyBkYXRhLWlkIGlzIGEgbWV0YWNvZGUgaWRcbiAgICAgIFRvcGljLmZldGNoUmVsYXRpdmVzKG5vZGUpXG4gICAgfSlcbiAgfSwgLy8gc2VsZWN0Tm9kZU9uUmlnaHRDbGlja0hhbmRsZXIsXG4gIHBvcHVsYXRlUmlnaHRDbGlja1NpYmxpbmdzOiBmdW5jdGlvbihub2RlKSB7XG4gICAgLy8gZGVwZW5kaW5nIG9uIGhvdyBtYW55IHRvcGljcyBhcmUgc2VsZWN0ZWQsIGRvIGRpZmZlcmVudCB0aGluZ3NcbiAgICBjb25zdCB0b3BpYyA9IG5vZGUuZ2V0RGF0YSgndG9waWMnKVxuXG4gICAgLy8gYWRkIGEgbG9hZGluZyBpY29uIGZvciBub3dcbiAgICBjb25zdCBsb2FkZXIgPSBuZXcgQ2FudmFzTG9hZGVyKCdsb2FkaW5nU2libGluZ3MnKVxuICAgIGxvYWRlci5zZXRDb2xvcignIzRGQzA1OScpIC8vIGRlZmF1bHQgaXMgJyMwMDAwMDAnXG4gICAgbG9hZGVyLnNldERpYW1ldGVyKDE1KSAvLyBkZWZhdWx0IGlzIDQwXG4gICAgbG9hZGVyLnNldERlbnNpdHkoNDEpIC8vIGRlZmF1bHQgaXMgNDBcbiAgICBsb2FkZXIuc2V0UmFuZ2UoMC45KSAvLyBkZWZhdWx0IGlzIDEuM1xuICAgIGxvYWRlci5zaG93KCkgLy8gSGlkZGVuIGJ5IGRlZmF1bHRcblxuICAgIGNvbnN0IHRvcGljcyA9IERhdGFNb2RlbC5Ub3BpY3MubWFwKGZ1bmN0aW9uKHQpIHsgcmV0dXJuIHQuaWQgfSlcbiAgICBjb25zdCB0b3BpY3NTdHJpbmcgPSB0b3BpY3Muam9pbigpXG5cbiAgICBjb25zdCBzdWNjZXNzQ2FsbGJhY2sgPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAkKCcjbG9hZGluZ1NpYmxpbmdzJykucmVtb3ZlKClcblxuICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nID0gYCR7RGF0YU1vZGVsLk1ldGFjb2Rlcy5nZXQoa2V5KS5nZXQoJ25hbWUnKX0gKCR7ZGF0YVtrZXldfSlgXG4gICAgICAgICQoJyNmZXRjaFNpYmxpbmdMaXN0JykuYXBwZW5kKGA8bGkgY2xhc3M9XCJnZXRTaWJsaW5nc1wiIGRhdGEtaWQ9XCIke2tleX1cIj4ke3N0cmluZ308L2xpPmApXG4gICAgICB9XG5cbiAgICAgICQoJy5yYy1zaWJsaW5ncyAuZ2V0U2libGluZ3MnKS5jbGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgJCgnLnJpZ2h0Y2xpY2ttZW51JykucmVtb3ZlKClcbiAgICAgICAgLy8gZGF0YS1pZCBpcyBhIG1ldGFjb2RlIGlkXG4gICAgICAgIFRvcGljLmZldGNoUmVsYXRpdmVzKG5vZGUsICQodGhpcykuYXR0cignZGF0YS1pZCcpKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICAkLmFqYXgoe1xuICAgICAgdHlwZTogJ0dFVCcsXG4gICAgICB1cmw6ICcvdG9waWNzLycgKyB0b3BpYy5pZCArICcvcmVsYXRpdmVfbnVtYmVycy5qc29uP25ldHdvcms9JyArIHRvcGljc1N0cmluZyxcbiAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3NDYWxsYmFjayxcbiAgICAgIGVycm9yOiBmdW5jdGlvbigpIHt9XG4gICAgfSlcbiAgfSxcbiAgc2VsZWN0RWRnZU9uQ2xpY2tIYW5kbGVyOiBmdW5jdGlvbihhZGosIGUpIHtcbiAgICBpZiAoVmlzdWFsaXplLm1HcmFwaC5idXN5KSByZXR1cm5cblxuICAgIGNvbnN0IHNlbGYgPSBKSVRcbiAgICB2YXIgc3luYXBzZVRleHQgPSBhZGouZGF0YS4kc3luYXBzZXNbMF0uYXR0cmlidXRlcy5kZXNjXG4gICAgLy8gQ29weSBzeW5hcHNlIGxhYmVsIHRvIGNsaXBib2FyZFxuICAgIGlmIChlLmJ1dHRvbiA9PT0gMSAmJiBlLmN0cmxLZXkgJiYgc3luYXBzZVRleHQgIT09ICcnKSBjbGlwYm9hcmQuY29weShzeW5hcHNlVGV4dClcblxuICAgIC8vIGNhdGNoIHJpZ2h0IGNsaWNrIG9uIG1hYywgd2hpY2ggaXMgb2Z0ZW4gbGlrZSBjdHJsK2NsaWNrXG4gICAgaWYgKG5hdmlnYXRvci5wbGF0Zm9ybS5pbmRleE9mKCdNYWMnKSAhPT0gLTEgJiYgZS5jdHJsS2V5KSB7XG4gICAgICBzZWxmLnNlbGVjdEVkZ2VPblJpZ2h0Q2xpY2tIYW5kbGVyKGFkaiwgZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNoZWNrID0gc2VsZi5ub2RlV2FzRG91YmxlQ2xpY2tlZCgpXG4gICAgaWYgKGNoZWNrKSB7XG4gICAgICBzZWxmLmVkZ2VEb3VibGVDbGlja0hhbmRsZXIoYWRqLCBlKVxuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHdhaXQgYSBjZXJ0YWluIGxlbmd0aCBvZiB0aW1lLCB0aGVuIGNoZWNrIGFnYWluLCB0aGVuIHJ1biB0aGlzIGNvZGVcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghSklULm5vZGVXYXNEb3VibGVDbGlja2VkKCkpIHtcbiAgICAgICAgICBjb25zdCBlZGdlQWxyZWFkeVNlbGVjdGVkID0gU2VsZWN0ZWQuRWRnZXMuaW5kZXhPZihhZGopICE9PSAtMVxuXG4gICAgICAgICAgaWYgKCFlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBDb250cm9sLmRlc2VsZWN0QWxsTm9kZXMoKVxuICAgICAgICAgICAgQ29udHJvbC5kZXNlbGVjdEFsbEVkZ2VzKClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZWRnZUFscmVhZHlTZWxlY3RlZCkge1xuICAgICAgICAgICAgQ29udHJvbC5kZXNlbGVjdEVkZ2UoYWRqKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBDb250cm9sLnNlbGVjdEVkZ2UoYWRqKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIFZpc3VhbGl6ZS5tR3JhcGgucGxvdCgpXG4gICAgICAgIH1cbiAgICAgIH0sIE1vdXNlLkRPVUJMRV9DTElDS19UT0xFUkFOQ0UpXG4gICAgfVxuICB9LCAvLyBzZWxlY3RFZGdlT25DbGlja0hhbmRsZXJcbiAgc2VsZWN0RWRnZU9uUmlnaHRDbGlja0hhbmRsZXI6IGZ1bmN0aW9uKGFkaiwgZSkge1xuICAgIC8vIHRoZSAnbm9kZScgdmFyaWFibGUgaXMgYSBKSVQgbm9kZSwgdGhlIG9uZSB0aGF0IHdhcyBjbGlja2VkIG9uXG4gICAgLy8gdGhlICdlJyB2YXJpYWJsZSBpcyB0aGUgY2xpY2sgZXZlbnRcblxuICAgIGlmIChhZGouZ2V0RGF0YSgnYWxwaGEnKSA9PT0gMCkgcmV0dXJuIC8vIGRvbid0IGRvIGFueXRoaW5nIGlmIHRoZSBlZGdlIGlzIGZpbHRlcmVkXG5cbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG5cbiAgICBpZiAoVmlzdWFsaXplLm1HcmFwaC5idXN5KSByZXR1cm5cblxuICAgIENvbnRyb2wuc2VsZWN0RWRnZShhZGopXG5cbiAgICAvLyBkZWxldGUgb2xkIHJpZ2h0IGNsaWNrIG1lbnVcbiAgICAkKCcucmlnaHRjbGlja21lbnUnKS5yZW1vdmUoKVxuICAgIC8vIGNyZWF0ZSBuZXcgbWVudSBmb3IgY2xpY2tlZCBvbiBub2RlXG4gICAgY29uc3QgcmlnaHRjbGlja21lbnUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgIHJpZ2h0Y2xpY2ttZW51LmNsYXNzTmFtZSA9ICdyaWdodGNsaWNrbWVudSdcbiAgICAvLyBwcmV2ZW50IHRoZSBjdXN0b20gY29udGV4dCBtZW51IGZyb20gaW1tZWRpYXRlbHkgb3BlbmluZyB0aGUgZGVmYXVsdCBjb250ZXh0IG1lbnUgYXMgd2VsbFxuICAgIHJpZ2h0Y2xpY2ttZW51LnNldEF0dHJpYnV0ZSgnb25jb250ZXh0bWVudScsICdyZXR1cm4gZmFsc2UnKVxuXG4gICAgLy8gYWRkIHRoZSBwcm9wZXIgb3B0aW9ucyB0byB0aGUgbWVudVxuICAgIGxldCBtZW51c3RyaW5nID0gJzx1bD4nXG5cbiAgICBjb25zdCBhdXRob3JpemVkID0gQWN0aXZlLk1hcCAmJiBBY3RpdmUuTWFwLmF1dGhvcml6ZVRvRWRpdChBY3RpdmUuTWFwcGVyKVxuXG4gICAgY29uc3QgZGlzYWJsZWQgPSBhdXRob3JpemVkID8gJycgOiAnZGlzYWJsZWQnXG5cbiAgICBpZiAoQWN0aXZlLk1hcCkgbWVudXN0cmluZyArPSAnPGxpIGNsYXNzPVwicmMtaGlkZVwiPjxkaXYgY2xhc3M9XCJyYy1pY29uXCI+PC9kaXY+SGlkZSB1bnRpbCByZWZyZXNoPGRpdiBjbGFzcz1cInJjLWtleWJvYXJkXCI+Q3RybCtIPC9kaXY+PC9saT4nXG4gICAgaWYgKEFjdGl2ZS5NYXAgJiYgQWN0aXZlLk1hcHBlcikgbWVudXN0cmluZyArPSAnPGxpIGNsYXNzPVwicmMtcmVtb3ZlICcgKyBkaXNhYmxlZCArICdcIj48ZGl2IGNsYXNzPVwicmMtaWNvblwiPjwvZGl2PlJlbW92ZSBmcm9tIG1hcDxkaXYgY2xhc3M9XCJyYy1rZXlib2FyZFwiPkN0cmwrTTwvZGl2PjwvbGk+J1xuICAgIGlmIChBY3RpdmUuVG9waWMpIG1lbnVzdHJpbmcgKz0gJzxsaSBjbGFzcz1cInJjLXJlbW92ZVwiPjxkaXYgY2xhc3M9XCJyYy1pY29uXCI+PC9kaXY+UmVtb3ZlIGZyb20gdmlldzxkaXYgY2xhc3M9XCJyYy1rZXlib2FyZFwiPkN0cmwrTTwvZGl2PjwvbGk+J1xuICAgIGlmIChBY3RpdmUuTWFwICYmIEFjdGl2ZS5NYXBwZXIpIG1lbnVzdHJpbmcgKz0gJzxsaSBjbGFzcz1cInJjLWRlbGV0ZSAnICsgZGlzYWJsZWQgKyAnXCI+PGRpdiBjbGFzcz1cInJjLWljb25cIj48L2Rpdj5EZWxldGU8ZGl2IGNsYXNzPVwicmMta2V5Ym9hcmRcIj5DdHJsK0Q8L2Rpdj48L2xpPidcblxuICAgIGlmIChBY3RpdmUuTWFwICYmIEFjdGl2ZS5NYXBwZXIpIG1lbnVzdHJpbmcgKz0gJzxsaSBjbGFzcz1cInJjLXNwYWNlclwiPjwvbGk+J1xuXG4gICAgaWYgKEFjdGl2ZS5NYXBwZXIpIHtcbiAgICAgIGNvbnN0IHBlcm1PcHRpb25zID0gb3V0ZGVudGBcbiAgICAgICAgPHVsPlxuICAgICAgICAgIDxsaSBjbGFzcz1cImNoYW5nZVAgdG9Db21tb25zXCI+PGRpdiBjbGFzcz1cInJjLXBlcm0taWNvblwiPjwvZGl2PmNvbW1vbnM8L2xpPlxuICAgICAgICAgIDxsaSBjbGFzcz1cImNoYW5nZVAgdG9QdWJsaWNcIj48ZGl2IGNsYXNzPVwicmMtcGVybS1pY29uXCI+PC9kaXY+cHVibGljPC9saT4gICAgICAgICAgIDxsaSBjbGFzcz1cImNoYW5nZVAgdG9Qcml2YXRlXCI+PGRpdiBjbGFzcz1cInJjLXBlcm0taWNvblwiPjwvZGl2PnByaXZhdGU8L2xpPiAgICAgICAgIDwvdWw+YFxuXG4gICAgICBtZW51c3RyaW5nICs9ICc8bGkgY2xhc3M9XCJyYy1wZXJtaXNzaW9uXCI+PGRpdiBjbGFzcz1cInJjLWljb25cIj48L2Rpdj5DaGFuZ2UgcGVybWlzc2lvbnMnICsgcGVybU9wdGlvbnMgKyAnPGRpdiBjbGFzcz1cImV4cGFuZExpXCI+PC9kaXY+PC9saT4nXG4gICAgfVxuXG4gICAgbWVudXN0cmluZyArPSAnPC91bD4nXG4gICAgcmlnaHRjbGlja21lbnUuaW5uZXJIVE1MID0gbWVudXN0cmluZ1xuXG4gICAgLy8gcG9zaXRpb24gdGhlIG1lbnUgd2hlcmUgdGhlIGNsaWNrIGhhcHBlbmVkXG4gICAgY29uc3QgcG9zaXRpb24gPSB7fVxuICAgIGNvbnN0IFJJR0hUQ0xJQ0tfV0lEVEggPSAzMDBcbiAgICBjb25zdCBSSUdIVENMSUNLX0hFSUdIVCA9IDE0NCAvLyB0aGlzIGRvZXMgdmFyeSBzb21ld2hhdCwgYnV0IHdlIGNhbiB1c2Ugc3RhdGljXG4gICAgY29uc3QgU1VCTUVOVVNfV0lEVEggPSAyNTZcbiAgICBjb25zdCBNQVhfU1VCTUVOVV9IRUlHSFQgPSAyNzBcbiAgICBjb25zdCB3aW5kb3dXaWR0aCA9ICQod2luZG93KS53aWR0aCgpXG4gICAgY29uc3Qgd2luZG93SGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpXG5cbiAgICBpZiAod2luZG93V2lkdGggLSBlLmNsaWVudFggPCBTVUJNRU5VU19XSURUSCkge1xuICAgICAgcG9zaXRpb24ucmlnaHQgPSB3aW5kb3dXaWR0aCAtIGUuY2xpZW50WFxuICAgICAgJChyaWdodGNsaWNrbWVudSkuYWRkQ2xhc3MoJ21vdmVNZW51c1RvTGVmdCcpXG4gICAgfSBlbHNlIGlmICh3aW5kb3dXaWR0aCAtIGUuY2xpZW50WCA8IFJJR0hUQ0xJQ0tfV0lEVEgpIHtcbiAgICAgIHBvc2l0aW9uLnJpZ2h0ID0gd2luZG93V2lkdGggLSBlLmNsaWVudFhcbiAgICB9IGVsc2UgcG9zaXRpb24ubGVmdCA9IGUuY2xpZW50WFxuXG4gICAgaWYgKHdpbmRvd0hlaWdodCAtIGUuY2xpZW50WSA8IE1BWF9TVUJNRU5VX0hFSUdIVCkge1xuICAgICAgcG9zaXRpb24uYm90dG9tID0gd2luZG93SGVpZ2h0IC0gZS5jbGllbnRZXG4gICAgICAkKHJpZ2h0Y2xpY2ttZW51KS5hZGRDbGFzcygnbW92ZU1lbnVzVXAnKVxuICAgIH0gZWxzZSBpZiAod2luZG93SGVpZ2h0IC0gZS5jbGllbnRZIDwgUklHSFRDTElDS19IRUlHSFQgKyBNQVhfU1VCTUVOVV9IRUlHSFQpIHtcbiAgICAgIHBvc2l0aW9uLnRvcCA9IGUuY2xpZW50WVxuICAgICAgJChyaWdodGNsaWNrbWVudSkuYWRkQ2xhc3MoJ21vdmVNZW51c1VwJylcbiAgICB9IGVsc2UgcG9zaXRpb24udG9wID0gZS5jbGllbnRZXG5cbiAgICAkKHJpZ2h0Y2xpY2ttZW51KS5jc3MocG9zaXRpb24pXG5cbiAgICAvLyBhZGQgdGhlIG1lbnUgdG8gdGhlIHBhZ2VcbiAgICAkKCcjd3JhcHBlcicpLmFwcGVuZChyaWdodGNsaWNrbWVudSlcblxuICAgIC8vIGF0dGFjaCBldmVudHMgdG8gY2xpY2tzIG9uIHRoZSBsaXN0IGl0ZW1zXG5cbiAgICAvLyBkZWxldGUgdGhlIHNlbGVjdGVkIHRoaW5ncyBmcm9tIHRoZSBkYXRhYmFzZVxuICAgIGlmIChhdXRob3JpemVkKSB7XG4gICAgICAkKCcucmMtZGVsZXRlJykuY2xpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgICQoJy5yaWdodGNsaWNrbWVudScpLnJlbW92ZSgpXG4gICAgICAgIENvbnRyb2wuZGVsZXRlU2VsZWN0ZWQoKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgdGhlIHNlbGVjdGVkIHRoaW5ncyBmcm9tIHRoZSBtYXBcbiAgICBpZiAoYXV0aG9yaXplZCkge1xuICAgICAgJCgnLnJjLXJlbW92ZScpLmNsaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgICAkKCcucmlnaHRjbGlja21lbnUnKS5yZW1vdmUoKVxuICAgICAgICBDb250cm9sLnJlbW92ZVNlbGVjdGVkRWRnZXMoKVxuICAgICAgICBDb250cm9sLnJlbW92ZVNlbGVjdGVkTm9kZXMoKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBoaWRlIHNlbGVjdGVkIG5vZGVzIGFuZCBzeW5hcHNlcyB1bnRpbCByZWZyZXNoXG4gICAgJCgnLnJjLWhpZGUnKS5jbGljayhmdW5jdGlvbigpIHtcbiAgICAgICQoJy5yaWdodGNsaWNrbWVudScpLnJlbW92ZSgpXG4gICAgICBDb250cm9sLmhpZGVTZWxlY3RlZEVkZ2VzKClcbiAgICAgIENvbnRyb2wuaGlkZVNlbGVjdGVkTm9kZXMoKVxuICAgIH0pXG5cbiAgICAvLyBjaGFuZ2UgdGhlIHBlcm1pc3Npb24gb2YgYWxsIHRoZSBzZWxlY3RlZCBub2RlcyBhbmQgc3luYXBzZXMgdGhhdCB5b3Ugd2VyZSB0aGUgb3JpZ2luYXRvciBvZlxuICAgICQoJy5yYy1wZXJtaXNzaW9uIGxpJykuY2xpY2soZnVuY3Rpb24oKSB7XG4gICAgICAkKCcucmlnaHRjbGlja21lbnUnKS5yZW1vdmUoKVxuICAgICAgLy8gJCh0aGlzKS50ZXh0KCkgd2lsbCBiZSAnY29tbW9ucycgJ3B1YmxpYycgb3IgJ3ByaXZhdGUnXG4gICAgICBDb250cm9sLnVwZGF0ZVNlbGVjdGVkUGVybWlzc2lvbnMoJCh0aGlzKS50ZXh0KCkpXG4gICAgfSlcbiAgfSwgLy8gc2VsZWN0RWRnZU9uUmlnaHRDbGlja0hhbmRsZXJcbiAgU21vb3RoUGFubmluZzogZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgc3ggPSBWaXN1YWxpemUubUdyYXBoLmNhbnZhcy5zY2FsZU9mZnNldFhcbiAgICBjb25zdCBzeSA9IFZpc3VhbGl6ZS5tR3JhcGguY2FudmFzLnNjYWxlT2Zmc2V0WVxuICAgIGNvbnN0IHlWZWxvY2l0eSA9IE1vdXNlLmNoYW5nZUluWSAvLyBpbml0aWFsIHkgdmVsb2NpdHlcbiAgICBjb25zdCB4VmVsb2NpdHkgPSBNb3VzZS5jaGFuZ2VJblggLy8gaW5pdGlhbCB4IHZlbG9jaXR5XG4gICAgbGV0IGVhc2luZyA9IDEgLy8gZnJpY3Rpb25hbCB2YWx1ZVxuXG4gICAgd2luZG93LmNsZWFySW50ZXJ2YWwocGFubmluZ0ludClcbiAgICBwYW5uaW5nSW50ID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICBteVRpbWVyKClcbiAgICB9LCAxKVxuXG4gICAgZnVuY3Rpb24gbXlUaW1lcigpIHtcbiAgICAgIFZpc3VhbGl6ZS5tR3JhcGguY2FudmFzLnRyYW5zbGF0ZSh4VmVsb2NpdHkgKiBlYXNpbmcgKiAxIC8gc3gsIHlWZWxvY2l0eSAqIGVhc2luZyAqIDEgLyBzeSlcbiAgICAgICQoZG9jdW1lbnQpLnRyaWdnZXIoSklULmV2ZW50cy5wYW4pXG4gICAgICBlYXNpbmcgPSBlYXNpbmcgKiAwLjc1XG5cbiAgICAgIGlmIChlYXNpbmcgPCAwLjEpIHdpbmRvdy5jbGVhckludGVydmFsKHBhbm5pbmdJbnQpXG4gICAgfVxuICB9LCAvLyBTbW9vdGhQYW5uaW5nXG4gIHJlbmRlck1pZEFycm93OiBmdW5jdGlvbihmcm9tLCB0bywgZGltLCBzd2FwLCBjYW52YXMsIHBsYWNlbWVudCwgbmV3U3luYXBzZSkge1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDdHgoKVxuICAgIC8vIGludmVydCBlZGdlIGRpcmVjdGlvblxuICAgIGlmIChzd2FwKSB7XG4gICAgICBjb25zdCB0bXAgPSBmcm9tXG4gICAgICBmcm9tID0gdG9cbiAgICAgIHRvID0gdG1wXG4gICAgfVxuICAgIC8vIHZlY3QgcmVwcmVzZW50cyBhIGxpbmUgZnJvbSB0aXAgdG8gdGFpbCBvZiB0aGUgYXJyb3dcbiAgICBjb25zdCB2ZWN0ID0gbmV3ICRqaXQuQ29tcGxleCh0by54IC0gZnJvbS54LCB0by55IC0gZnJvbS55KVxuICAgIC8vIHNjYWxlIGl0XG4gICAgdmVjdC4kc2NhbGUoZGltIC8gdmVjdC5ub3JtKCkpXG4gICAgLy8gY29tcHV0ZSB0aGUgbWlkcG9pbnQgb2YgdGhlIGVkZ2UgbGluZVxuICAgIGNvbnN0IG5ld1ggPSAodG8ueCAtIGZyb20ueCkgKiBwbGFjZW1lbnQgKyBmcm9tLnhcbiAgICBjb25zdCBuZXdZID0gKHRvLnkgLSBmcm9tLnkpICogcGxhY2VtZW50ICsgZnJvbS55XG4gICAgY29uc3QgbWlkUG9pbnQgPSBuZXcgJGppdC5Db21wbGV4KG5ld1gsIG5ld1kpXG5cbiAgICAvLyBtb3ZlIG1pZHBvaW50IGJ5IGhhbGYgdGhlIFwibGVuZ3RoXCIgb2YgdGhlIGFycm93IHNvIHRoZSBhcnJvdyBpcyBjZW50ZXJlZCBvbiB0aGUgbWlkcG9pbnRcbiAgICBjb25zdCBhcnJvd1BvaW50ID0gbmV3ICRqaXQuQ29tcGxleCgodmVjdC54IC8gMC43KSArIG1pZFBvaW50LngsICh2ZWN0LnkgLyAwLjcpICsgbWlkUG9pbnQueSlcbiAgICAvLyBjb21wdXRlIHRoZSB0YWlsIGludGVyc2VjdGlvbiBwb2ludCB3aXRoIHRoZSBlZGdlIGxpbmVcbiAgICBjb25zdCBpbnRlcm1lZGlhdGVQb2ludCA9IG5ldyAkaml0LkNvbXBsZXgoYXJyb3dQb2ludC54IC0gdmVjdC54LCBhcnJvd1BvaW50LnkgLSB2ZWN0LnkpXG4gICAgLy8gdmVjdG9yIHBlcnBlbmRpY3VsYXIgdG8gdmVjdFxuICAgIGNvbnN0IG5vcm1hbCA9IG5ldyAkaml0LkNvbXBsZXgoLXZlY3QueSAvIDIsIHZlY3QueCAvIDIpXG4gICAgY29uc3QgdjEgPSBpbnRlcm1lZGlhdGVQb2ludC5hZGQobm9ybWFsKVxuICAgIGNvbnN0IHYyID0gaW50ZXJtZWRpYXRlUG9pbnQuJGFkZChub3JtYWwuJHNjYWxlKC0xKSlcblxuICAgIGlmIChuZXdTeW5hcHNlKSB7XG4gICAgICBjdHguc3Ryb2tlU3R5bGUgPSAnIzRmYzA1OSdcbiAgICAgIGN0eC5saW5lV2lkdGggPSAyXG4gICAgICBjdHguZ2xvYmFsQWxwaGEgPSAxXG4gICAgfVxuICAgIGN0eC5iZWdpblBhdGgoKVxuICAgIGN0eC5tb3ZlVG8oZnJvbS54LCBmcm9tLnkpXG4gICAgY3R4LmxpbmVUbyh0by54LCB0by55KVxuICAgIGN0eC5zdHJva2UoKVxuICAgIGN0eC5iZWdpblBhdGgoKVxuICAgIGN0eC5tb3ZlVG8odjEueCwgdjEueSlcbiAgICBjdHgubGluZVRvKGFycm93UG9pbnQueCwgYXJyb3dQb2ludC55KVxuICAgIGN0eC5saW5lVG8odjIueCwgdjIueSlcbiAgICBjdHguc3Ryb2tlKClcbiAgfSwgLy8gcmVuZGVyTWlkQXJyb3dcbiAgcmVuZGVyRWRnZUFycm93czogZnVuY3Rpb24oZWRnZUhlbHBlciwgYWRqLCBzeW5hcHNlLCBjYW52YXMpIHtcbiAgICBjb25zdCBzZWxmID0gSklUXG5cbiAgICBjb25zdCBkaXJlY3Rpb25DYXQgPSBzeW5hcHNlLmdldCgnY2F0ZWdvcnknKVxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IHN5bmFwc2UuZ2V0RGlyZWN0aW9uKClcblxuICAgIGNvbnN0IHBvcyA9IGFkai5ub2RlRnJvbS5wb3MuZ2V0Yyh0cnVlKVxuICAgIGNvbnN0IHBvc0NoaWxkID0gYWRqLm5vZGVUby5wb3MuZ2V0Yyh0cnVlKVxuXG4gICAgLy8gcGxvdCBhcnJvdyBlZGdlXG4gICAgaWYgKCFkaXJlY3Rpb24pIHtcbiAgICAgIC8vIHJlbmRlciBub3RoaW5nIGZvciB0aGlzIGFycm93IGlmIHRoZSBkaXJlY3Rpb24gY291bGRuJ3QgYmUgcmV0cmlldmVkXG4gICAgfSBlbHNlIGlmIChkaXJlY3Rpb25DYXQgPT09ICdub25lJykge1xuICAgICAgZWRnZUhlbHBlci5saW5lLnJlbmRlcih7XG4gICAgICAgIHg6IHBvcy54LFxuICAgICAgICB5OiBwb3MueVxuICAgICAgfSwge1xuICAgICAgICB4OiBwb3NDaGlsZC54LFxuICAgICAgICB5OiBwb3NDaGlsZC55XG4gICAgICB9LCBjYW52YXMpXG4gICAgfSBlbHNlIGlmIChkaXJlY3Rpb25DYXQgPT09ICdib3RoJykge1xuICAgICAgc2VsZi5yZW5kZXJNaWRBcnJvdyh7XG4gICAgICAgIHg6IHBvcy54LFxuICAgICAgICB5OiBwb3MueVxuICAgICAgfSwge1xuICAgICAgICB4OiBwb3NDaGlsZC54LFxuICAgICAgICB5OiBwb3NDaGlsZC55XG4gICAgICB9LCAxMywgdHJ1ZSwgY2FudmFzLCAwLjcpXG4gICAgICBzZWxmLnJlbmRlck1pZEFycm93KHtcbiAgICAgICAgeDogcG9zLngsXG4gICAgICAgIHk6IHBvcy55XG4gICAgICB9LCB7XG4gICAgICAgIHg6IHBvc0NoaWxkLngsXG4gICAgICAgIHk6IHBvc0NoaWxkLnlcbiAgICAgIH0sIDEzLCBmYWxzZSwgY2FudmFzLCAwLjcpXG4gICAgfSBlbHNlIGlmIChkaXJlY3Rpb25DYXQgPT09ICdmcm9tLXRvJykge1xuICAgICAgY29uc3QgaW52ID0gKGRpcmVjdGlvblswXSAhPT0gYWRqLm5vZGVGcm9tLmlkKVxuICAgICAgc2VsZi5yZW5kZXJNaWRBcnJvdyh7XG4gICAgICAgIHg6IHBvcy54LFxuICAgICAgICB5OiBwb3MueVxuICAgICAgfSwge1xuICAgICAgICB4OiBwb3NDaGlsZC54LFxuICAgICAgICB5OiBwb3NDaGlsZC55XG4gICAgICB9LCAxMywgaW52LCBjYW52YXMsIDAuNylcbiAgICAgIHNlbGYucmVuZGVyTWlkQXJyb3coe1xuICAgICAgICB4OiBwb3MueCxcbiAgICAgICAgeTogcG9zLnlcbiAgICAgIH0sIHtcbiAgICAgICAgeDogcG9zQ2hpbGQueCxcbiAgICAgICAgeTogcG9zQ2hpbGQueVxuICAgICAgfSwgMTMsIGludiwgY2FudmFzLCAwLjMpXG4gICAgfVxuICB9LCAvLyByZW5kZXJFZGdlQXJyb3dzXG4gIHpvb21JbjogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBWaXN1YWxpemUubUdyYXBoLmNhbnZhcy5zY2FsZSgxLjI1LCAxLjI1KVxuICAgICQoZG9jdW1lbnQpLnRyaWdnZXIoSklULmV2ZW50cy56b29tLCBbZXZlbnRdKVxuICB9LFxuICB6b29tT3V0OiBmdW5jdGlvbihldmVudCkge1xuICAgIFZpc3VhbGl6ZS5tR3JhcGguY2FudmFzLnNjYWxlKDAuOCwgMC44KVxuICAgICQoZG9jdW1lbnQpLnRyaWdnZXIoSklULmV2ZW50cy56b29tLCBbZXZlbnRdKVxuICB9LFxuICBjZW50ZXJNYXA6IGZ1bmN0aW9uKGNhbnZhcykge1xuICAgIGNvbnN0IG9mZnNldFNjYWxlID0gY2FudmFzLnNjYWxlT2Zmc2V0WFxuXG4gICAgY2FudmFzLnNjYWxlKDEgLyBvZmZzZXRTY2FsZSwgMSAvIG9mZnNldFNjYWxlKVxuXG4gICAgY29uc3Qgb2Zmc2V0WCA9IGNhbnZhcy50cmFuc2xhdGVPZmZzZXRYXG4gICAgY29uc3Qgb2Zmc2V0WSA9IGNhbnZhcy50cmFuc2xhdGVPZmZzZXRZXG5cbiAgICBjYW52YXMudHJhbnNsYXRlKC0xICogb2Zmc2V0WCwgLTEgKiBvZmZzZXRZKVxuICB9LFxuICB6b29tVG9Cb3g6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgY29uc3Qgc1ggPSBNb3VzZS5ib3hTdGFydENvb3JkaW5hdGVzLnhcbiAgICBjb25zdCBzWSA9IE1vdXNlLmJveFN0YXJ0Q29vcmRpbmF0ZXMueVxuICAgIGNvbnN0IGVYID0gTW91c2UuYm94RW5kQ29vcmRpbmF0ZXMueFxuICAgIGNvbnN0IGVZID0gTW91c2UuYm94RW5kQ29vcmRpbmF0ZXMueVxuXG4gICAgbGV0IGNhbnZhcyA9IFZpc3VhbGl6ZS5tR3JhcGguY2FudmFzXG4gICAgSklULmNlbnRlck1hcChjYW52YXMpXG5cbiAgICBsZXQgaGVpZ2h0ID0gJChkb2N1bWVudCkuaGVpZ2h0KClcbiAgICBsZXQgd2lkdGggPSAkKGRvY3VtZW50KS53aWR0aCgpXG5cbiAgICBsZXQgc3BhblggPSBNYXRoLmFicyhzWCAtIGVYKVxuICAgIGxldCBzcGFuWSA9IE1hdGguYWJzKHNZIC0gZVkpXG4gICAgbGV0IHJhdGlvWCA9IHdpZHRoIC8gc3BhblhcbiAgICBsZXQgcmF0aW9ZID0gaGVpZ2h0IC8gc3BhbllcblxuICAgIGxldCBuZXdSYXRpbyA9IE1hdGgubWluKHJhdGlvWCwgcmF0aW9ZKVxuXG4gICAgaWYgKGNhbnZhcy5zY2FsZU9mZnNldFggKiBuZXdSYXRpbyA8PSA1ICYmIGNhbnZhcy5zY2FsZU9mZnNldFggKiBuZXdSYXRpbyA+PSAwLjIpIHtcbiAgICAgIGNhbnZhcy5zY2FsZShuZXdSYXRpbywgbmV3UmF0aW8pXG4gICAgfSBlbHNlIGlmIChjYW52YXMuc2NhbGVPZmZzZXRYICogbmV3UmF0aW8gPiA1KSB7XG4gICAgICBuZXdSYXRpbyA9IDUgLyBjYW52YXMuc2NhbGVPZmZzZXRYXG4gICAgICBjYW52YXMuc2NhbGUobmV3UmF0aW8sIG5ld1JhdGlvKVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdSYXRpbyA9IDAuMiAvIGNhbnZhcy5zY2FsZU9mZnNldFhcbiAgICAgIGNhbnZhcy5zY2FsZShuZXdSYXRpbywgbmV3UmF0aW8pXG4gICAgfVxuXG4gICAgY29uc3QgY29nWCA9IChzWCArIGVYKSAvIDJcbiAgICBjb25zdCBjb2dZID0gKHNZICsgZVkpIC8gMlxuXG4gICAgY2FudmFzLnRyYW5zbGF0ZSgtMSAqIGNvZ1gsIC0xICogY29nWSlcbiAgICAkKGRvY3VtZW50KS50cmlnZ2VyKEpJVC5ldmVudHMuem9vbSwgW2V2ZW50XSlcblxuICAgIE1vdXNlLmJveFN0YXJ0Q29vcmRpbmF0ZXMgPSBmYWxzZVxuICAgIE1vdXNlLmJveEVuZENvb3JkaW5hdGVzID0gZmFsc2VcbiAgICBWaXN1YWxpemUubUdyYXBoLnBsb3QoKVxuICB9LFxuICB6b29tRXh0ZW50czogZnVuY3Rpb24oZXZlbnQsIGNhbnZhcywgZGVueVNlbGVjdGVkKSB7XG4gICAgSklULmNlbnRlck1hcChjYW52YXMpXG4gICAgbGV0IGhlaWdodCA9IGNhbnZhcy5nZXRTaXplKCkuaGVpZ2h0XG4gICAgbGV0IHdpZHRoID0gY2FudmFzLmdldFNpemUoKS53aWR0aFxuICAgIGxldCBtYXhYXG4gICAgbGV0IG1heFlcbiAgICBsZXQgbWluWFxuICAgIGxldCBtaW5ZXG4gICAgbGV0IGNvdW50ZXIgPSAwXG5cbiAgICBsZXQgbm9kZXNcbiAgICBpZiAoIWRlbnlTZWxlY3RlZCAmJiBTZWxlY3RlZC5Ob2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBub2RlcyA9IFNlbGVjdGVkLk5vZGVzXG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGVzID0gXy52YWx1ZXMoVmlzdWFsaXplLm1HcmFwaC5ncmFwaC5ub2RlcylcbiAgICB9XG5cbiAgICBpZiAobm9kZXMubGVuZ3RoID4gMSkge1xuICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihuKSB7XG4gICAgICAgIGxldCB4ID0gbi5wb3MueFxuICAgICAgICBsZXQgeSA9IG4ucG9zLnlcblxuICAgICAgICBpZiAoY291bnRlciA9PT0gMCAmJiBuLmdldERhdGEoJ2FscGhhJykgPT09IDEpIHtcbiAgICAgICAgICBtYXhYID0geFxuICAgICAgICAgIG1pblggPSB4XG4gICAgICAgICAgbWF4WSA9IHlcbiAgICAgICAgICBtaW5ZID0geVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFycmF5T2ZMYWJlbExpbmVzID0gVXRpbC5zcGxpdExpbmUobi5uYW1lLCAyNSkuc3BsaXQoJ1xcbicpXG4gICAgICAgIGxldCBkaW0gPSBuLmdldERhdGEoJ2RpbScpXG4gICAgICAgIGxldCBjdHggPSBjYW52YXMuZ2V0Q3R4KClcblxuICAgICAgICBsZXQgaGVpZ2h0ID0gMjUgKiBhcnJheU9mTGFiZWxMaW5lcy5sZW5ndGhcblxuICAgICAgICBsZXQgbGluZVdpZHRocyA9IFtdXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcnJheU9mTGFiZWxMaW5lcy5sZW5ndGg7ICsraW5kZXgpIHtcbiAgICAgICAgICBsaW5lV2lkdGhzLnB1c2goY3R4Lm1lYXN1cmVUZXh0KGFycmF5T2ZMYWJlbExpbmVzW2luZGV4XSkud2lkdGgpXG4gICAgICAgIH1cbiAgICAgICAgbGV0IHdpZHRoID0gTWF0aC5tYXguYXBwbHkobnVsbCwgbGluZVdpZHRocykgKyA4XG5cbiAgICAgICAgLy8gb25seSBhZGp1c3QgdGhlc2UgdmFsdWVzIGlmIHRoZSBub2RlIGlzIG5vdCBmaWx0ZXJlZFxuICAgICAgICBpZiAobi5nZXREYXRhKCdhbHBoYScpID09PSAxKSB7XG4gICAgICAgICAgbWF4WCA9IE1hdGgubWF4KHggKyB3aWR0aCAvIDIsIG1heFgpXG4gICAgICAgICAgbWF4WSA9IE1hdGgubWF4KHkgKyBuLmdldERhdGEoJ2hlaWdodCcpICsgNSArIGhlaWdodCwgbWF4WSlcbiAgICAgICAgICBtaW5YID0gTWF0aC5taW4oeCAtIHdpZHRoIC8gMiwgbWluWClcbiAgICAgICAgICBtaW5ZID0gTWF0aC5taW4oeSAtIGRpbSwgbWluWSlcblxuICAgICAgICAgIGNvdW50ZXIrK1xuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBsZXQgc3BhblggPSBtYXhYIC0gbWluWFxuICAgICAgbGV0IHNwYW5ZID0gbWF4WSAtIG1pbllcbiAgICAgIGxldCByYXRpb1ggPSBzcGFuWCAvIHdpZHRoXG4gICAgICBsZXQgcmF0aW9ZID0gc3BhblkgLyBoZWlnaHRcblxuICAgICAgbGV0IGNvZ1ggPSAobWF4WCArIG1pblgpIC8gMlxuICAgICAgbGV0IGNvZ1kgPSAobWF4WSArIG1pblkpIC8gMlxuXG4gICAgICBjYW52YXMudHJhbnNsYXRlKC0xICogY29nWCwgLTEgKiBjb2dZKVxuXG4gICAgICBsZXQgbmV3UmF0aW8gPSBNYXRoLm1heChyYXRpb1gsIHJhdGlvWSlcbiAgICAgIGxldCBzY2FsZU11bHRpcGxpZXIgPSAxIC8gbmV3UmF0aW8gKiAwLjlcblxuICAgICAgaWYgKGNhbnZhcy5zY2FsZU9mZnNldFggKiBzY2FsZU11bHRpcGxpZXIgPD0gMyAmJiBjYW52YXMuc2NhbGVPZmZzZXRYICogc2NhbGVNdWx0aXBsaWVyID49IDAuMikge1xuICAgICAgICBjYW52YXMuc2NhbGUoc2NhbGVNdWx0aXBsaWVyLCBzY2FsZU11bHRpcGxpZXIpXG4gICAgICB9IGVsc2UgaWYgKGNhbnZhcy5zY2FsZU9mZnNldFggKiBzY2FsZU11bHRpcGxpZXIgPiAzKSB7XG4gICAgICAgIHNjYWxlTXVsdGlwbGllciA9IDMgLyBjYW52YXMuc2NhbGVPZmZzZXRYXG4gICAgICAgIGNhbnZhcy5zY2FsZShzY2FsZU11bHRpcGxpZXIsIHNjYWxlTXVsdGlwbGllcilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjYWxlTXVsdGlwbGllciA9IDAuMiAvIGNhbnZhcy5zY2FsZU9mZnNldFhcbiAgICAgICAgY2FudmFzLnNjYWxlKHNjYWxlTXVsdGlwbGllciwgc2NhbGVNdWx0aXBsaWVyKVxuICAgICAgfVxuXG4gICAgICAkKGRvY3VtZW50KS50cmlnZ2VyKEpJVC5ldmVudHMuem9vbSwgW2V2ZW50XSlcbiAgICB9IGVsc2UgaWYgKG5vZGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihuKSB7XG4gICAgICAgIGNvbnN0IHggPSBuLnBvcy54XG4gICAgICAgIGNvbnN0IHkgPSBuLnBvcy55XG5cbiAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtMSAqIHgsIC0xICogeSlcbiAgICAgICAgJChkb2N1bWVudCkudHJpZ2dlcihKSVQuZXZlbnRzLnpvb20sIFtldmVudF0pXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBKSVRcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBmcm9udGVuZC9zcmMvTWV0YW1hcHMvSklULmpzIl0sIm1hcHBpbmdzIjoiOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7OztBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 356 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _each2 = __webpack_require__(137);var _each3 = _interopRequireDefault(_each2);var _difference2 = __webpack_require__(357);var _difference3 = _interopRequireDefault(_difference2);var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {return typeof obj;} : function (obj) {return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj;}; /* global $ */\n\n\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _Control = __webpack_require__(27);var _Control2 = _interopRequireDefault(_Control);\nvar _DataModel = __webpack_require__(149);var _DataModel2 = _interopRequireDefault(_DataModel);\nvar _GlobalUI = __webpack_require__(362);var _GlobalUI2 = _interopRequireDefault(_GlobalUI);\nvar _Settings = __webpack_require__(572);var _Settings2 = _interopRequireDefault(_Settings);\nvar _Visualize = __webpack_require__(561);var _Visualize2 = _interopRequireDefault(_Visualize);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}\n\nvar Filter = {\n  filters: {\n    name: '',\n    metacodes: [],\n    mappers: [],\n    synapses: [] },\n\n  visible: {\n    metacodes: [],\n    mappers: [],\n    synapses: [] },\n\n  isOpen: false,\n  changing: false,\n  init: function init() {\n    var self = Filter;\n\n    $('.sidebarFilterIcon').click(self.toggleBox);\n\n    $('.sidebarFilterBox .showAllMetacodes').click(self.filterNoMetacodes);\n    $('.sidebarFilterBox .showAllSynapses').click(self.filterNoSynapses);\n    $('.sidebarFilterBox .showAllMappers').click(self.filterNoMappers);\n    $('.sidebarFilterBox .hideAllMetacodes').click(self.filterAllMetacodes);\n    $('.sidebarFilterBox .hideAllSynapses').click(self.filterAllSynapses);\n    $('.sidebarFilterBox .hideAllMappers').click(self.filterAllMappers);\n\n    self.bindLiClicks();\n    self.getFilterData();\n  },\n  toggleBox: function toggleBox(event) {\n    var self = Filter;\n\n    if (self.isOpen) self.close();else\n    self.open();\n\n    event.stopPropagation();\n  },\n  open: function open() {\n    var self = Filter;\n\n    _GlobalUI2.default.Account.close();\n    $('.sidebarFilterIcon div').addClass('hide');\n\n    if (!self.isOpen && !self.changing) {\n      self.changing = true;\n\n      var height = $(document).height() - 108;\n      $('.sidebarFilterBox').css('max-height', height + 'px').fadeIn(200, function () {\n        self.changing = false;\n        self.isOpen = true;\n      });\n    }\n  },\n  close: function close() {\n    var self = Filter;\n    $('.sidebarFilterIcon div').removeClass('hide');\n\n    if (!self.changing) {\n      self.changing = true;\n\n      $('.sidebarFilterBox').fadeOut(200, function () {\n        self.changing = false;\n        self.isOpen = false;\n      });\n    }\n  },\n  reset: function reset() {\n    var self = Filter;\n\n    self.filters.metacodes = [];\n    self.filters.mappers = [];\n    self.filters.synapses = [];\n    self.visible.metacodes = [];\n    self.visible.mappers = [];\n    self.visible.synapses = [];\n\n    $('#filter_by_metacode ul').empty();\n    $('#filter_by_mapper ul').empty();\n    $('#filter_by_synapse ul').empty();\n\n    $('.filterBox .showAll').addClass('active');\n  },\n  /*\n     Most of this data essentially depends on the ruby function which are happening for filter inside view filterBox\n     But what these function do is load this data into three accessible array within java : metacodes, mappers and synapses\n     */\n  getFilterData: function getFilterData() {\n    var self = Filter;\n\n    var metacode, mapper, synapse;\n\n    $('#filter_by_metacode li').each(function () {\n      metacode = $(this).attr('data-id');\n      self.filters.metacodes.push(metacode);\n      self.visible.metacodes.push(metacode);\n    });\n\n    $('#filter_by_mapper li').each(function () {\n      mapper = $(this).attr('data-id');\n      self.filters.mappers.push(mapper);\n      self.visible.mappers.push(mapper);\n    });\n\n    $('#filter_by_synapse li').each(function () {\n      synapse = $(this).attr('data-id');\n      self.filters.synapses.push(synapse);\n      self.visible.synapses.push(synapse);\n    });\n  },\n  bindLiClicks: function bindLiClicks() {\n    var self = Filter;\n    $('#filter_by_metacode ul li').unbind().click(self.toggleMetacode);\n    $('#filter_by_mapper ul li').unbind().click(self.toggleMapper);\n    $('#filter_by_synapse ul li').unbind().click(self.toggleSynapse);\n  },\n  // an abstraction function for checkMetacodes, checkMappers, checkSynapses to reduce\n  // code redundancy\n  /*\n  @param\n  */\n  updateFilters: function updateFilters(collection, propertyToCheck, correlatedModel, filtersToUse, listToModify) {\n    var self = Filter;\n\n    var newList = [];\n    var removed = [];\n    var added = [];\n\n    // the first option enables us to accept\n    // ['Topics', 'Synapses'] as 'collection'\n    if ((typeof collection === 'undefined' ? 'undefined' : _typeof(collection)) === 'object') {\n      _DataModel2.default[collection[0]].each(function (model) {\n        var prop = model.get(propertyToCheck);\n        if (prop !== null) {\n          prop = prop.toString();\n          if (newList.indexOf(prop) === -1) {\n            newList.push(prop);\n          }\n        }\n      });\n      _DataModel2.default[collection[1]].each(function (model) {\n        var prop = model.get(propertyToCheck);\n        if (prop !== null) {\n          prop = prop.toString();\n          if (newList.indexOf(prop) === -1) {\n            newList.push(prop);\n          }\n        }\n      });\n    } else if (typeof collection === 'string') {\n      _DataModel2.default[collection].each(function (model) {\n        var prop = model.get(propertyToCheck);\n        if (prop !== null) {\n          prop = prop.toString();\n          if (newList.indexOf(prop) === -1) {\n            newList.push(prop);\n          }\n        }\n      });\n    }\n\n    removed = (0, _difference3.default)(self.filters[filtersToUse], newList);\n    added = (0, _difference3.default)(newList, self.filters[filtersToUse]);\n\n    // remove the list items for things no longer present on the map\n    (0, _each3.default)(removed, function (identifier) {\n      $('#filter_by_' + listToModify + ' li[data-id=\"' + identifier + '\"]').fadeOut('fast', function () {\n        $(this).remove();\n      });\n      var index = self.visible[filtersToUse].indexOf(identifier);\n      self.visible[filtersToUse].splice(index, 1);\n    });\n\n    var model, li, jQueryLi;\n    function sortAlpha(a, b) {\n      return a.childNodes[1].innerHTML.toLowerCase() > b.childNodes[1].innerHTML.toLowerCase() ? 1 : -1;\n    }\n    // for each new filter to be added, create a list item for it and fade it in\n    (0, _each3.default)(added, function (identifier) {\n      model = _DataModel2.default[correlatedModel].get(identifier) ||\n      _DataModel2.default[correlatedModel].find(function (model) {\n        return model.get(propertyToCheck) === identifier;\n      });\n      li = model.prepareLiForFilter();\n      jQueryLi = $(li).hide();\n      $('li', '#filter_by_' + listToModify + ' ul').add(jQueryLi.fadeIn('fast')).\n      sort(sortAlpha).appendTo('#filter_by_' + listToModify + ' ul');\n      self.visible[filtersToUse].push(identifier);\n    });\n\n    // update the list of filters with the new list we just generated\n    self.filters[filtersToUse] = newList;\n\n    // make sure clicks on list items still trigger the right events\n    self.bindLiClicks();\n  },\n  checkMetacodes: function checkMetacodes() {\n    var self = Filter;\n    self.updateFilters('Topics', 'metacode_id', 'Metacodes', 'metacodes', 'metacode');\n  },\n  checkMappers: function checkMappers() {\n    var self = Filter;\n    if (_Active2.default.Map) {\n      self.updateFilters('Mappings', 'user_id', 'Mappers', 'mappers', 'mapper');\n    } else {\n      // on topic view\n      self.updateFilters(['Topics', 'Synapses'], 'user_id', 'Creators', 'mappers', 'mapper');\n    }\n  },\n  checkSynapses: function checkSynapses() {\n    var self = Filter;\n    self.updateFilters('Synapses', 'desc', 'Synapses', 'synapses', 'synapse');\n  },\n  filterAllMetacodes: function filterAllMetacodes(e) {\n    var self = Filter;\n    $('#filter_by_metacode ul li').addClass('toggledOff');\n    $('.showAllMetacodes').removeClass('active');\n    $('.hideAllMetacodes').addClass('active');\n    self.visible.metacodes = [];\n    self.passFilters();\n  },\n  filterNoMetacodes: function filterNoMetacodes(e) {\n    var self = Filter;\n    $('#filter_by_metacode ul li').removeClass('toggledOff');\n    $('.showAllMetacodes').addClass('active');\n    $('.hideAllMetacodes').removeClass('active');\n    self.visible.metacodes = self.filters.metacodes.slice();\n    self.passFilters();\n  },\n  filterAllMappers: function filterAllMappers(e) {\n    var self = Filter;\n    $('#filter_by_mapper ul li').addClass('toggledOff');\n    $('.showAllMappers').removeClass('active');\n    $('.hideAllMappers').addClass('active');\n    self.visible.mappers = [];\n    self.passFilters();\n  },\n  filterNoMappers: function filterNoMappers(e) {\n    var self = Filter;\n    $('#filter_by_mapper ul li').removeClass('toggledOff');\n    $('.showAllMappers').addClass('active');\n    $('.hideAllMappers').removeClass('active');\n    self.visible.mappers = self.filters.mappers.slice();\n    self.passFilters();\n  },\n  filterAllSynapses: function filterAllSynapses(e) {\n    var self = Filter;\n    $('#filter_by_synapse ul li').addClass('toggledOff');\n    $('.showAllSynapses').removeClass('active');\n    $('.hideAllSynapses').addClass('active');\n    self.visible.synapses = [];\n    self.passFilters();\n  },\n  filterNoSynapses: function filterNoSynapses(e) {\n    var self = Filter;\n    $('#filter_by_synapse ul li').removeClass('toggledOff');\n    $('.showAllSynapses').addClass('active');\n    $('.hideAllSynapses').removeClass('active');\n    self.visible.synapses = self.filters.synapses.slice();\n    self.passFilters();\n  },\n  // an abstraction function for toggleMetacode, toggleMapper, toggleSynapse\n  // to reduce code redundancy\n  // gets called in the context of a list item in a filter box\n  toggleLi: function toggleLi(whichToFilter) {\n    var self = Filter;\n    var id = $(this).attr('data-id');\n    if (self.visible[whichToFilter].indexOf(id) === -1) {\n      self.visible[whichToFilter].push(id);\n      $(this).removeClass('toggledOff');\n    } else {\n      var index = self.visible[whichToFilter].indexOf(id);\n      self.visible[whichToFilter].splice(index, 1);\n      $(this).addClass('toggledOff');\n    }\n    self.passFilters();\n  },\n  toggleMetacode: function toggleMetacode() {\n    var self = Filter;\n    self.toggleLi.call(this, 'metacodes');\n\n    if (self.visible.metacodes.length === self.filters.metacodes.length) {\n      $('.showAllMetacodes').addClass('active');\n      $('.hideAllMetacodes').removeClass('active');\n    } else if (self.visible.metacodes.length === 0) {\n      $('.showAllMetacodes').removeClass('active');\n      $('.hideAllMetacodes').addClass('active');\n    } else {\n      $('.showAllMetacodes').removeClass('active');\n      $('.hideAllMetacodes').removeClass('active');\n    }\n  },\n  toggleMapper: function toggleMapper() {\n    var self = Filter;\n    self.toggleLi.call(this, 'mappers');\n\n    if (self.visible.mappers.length === self.filters.mappers.length) {\n      $('.showAllMappers').addClass('active');\n      $('.hideAllMappers').removeClass('active');\n    } else if (self.visible.mappers.length === 0) {\n      $('.showAllMappers').removeClass('active');\n      $('.hideAllMappers').addClass('active');\n    } else {\n      $('.showAllMappers').removeClass('active');\n      $('.hideAllMappers').removeClass('active');\n    }\n  },\n  toggleSynapse: function toggleSynapse() {\n    var self = Filter;\n    self.toggleLi.call(this, 'synapses');\n\n    if (self.visible.synapses.length === self.filters.synapses.length) {\n      $('.showAllSynapses').addClass('active');\n      $('.hideAllSynapses').removeClass('active');\n    } else if (self.visible.synapses.length === 0) {\n      $('.showAllSynapses').removeClass('active');\n      $('.hideAllSynapses').addClass('active');\n    } else {\n      $('.showAllSynapses').removeClass('active');\n      $('.hideAllSynapses').removeClass('active');\n    }\n  },\n  passFilters: function passFilters() {\n    var self = Filter;\n    var visible = self.visible;\n\n    var passesMetacode, passesMapper, passesSynapse;\n\n    var opacityForFilter = _Active2.default.Map ? 0 : 0.4;\n\n    _DataModel2.default.Topics.each(function (topic) {\n      var n = topic.get('node');\n      var metacodeId = topic.get('metacode_id').toString();\n\n      if (visible.metacodes.indexOf(metacodeId) === -1) passesMetacode = false;else\n      passesMetacode = true;\n\n      if (_Active2.default.Map) {\n        // when on a map,\n        // we filter by mapper according to the person who added the\n        // topic or synapse to the map\n        var userId = topic.getMapping().get('user_id').toString();\n        if (visible.mappers.indexOf(userId) === -1) passesMapper = false;else\n        passesMapper = true;\n      } else {\n        // when on a topic view,\n        // we filter by mapper according to the person who created the\n        // topic or synapse\n        var _userId = topic.get('user_id').toString();\n        if (visible.mappers.indexOf(_userId) === -1) passesMapper = false;else\n        passesMapper = true;\n      }\n\n      if (passesMetacode && passesMapper) {\n        if (n) {\n          n.setData('alpha', 1, 'end');\n        } else {\n          console.log(topic);\n        }\n      } else {\n        if (n) {\n          _Control2.default.deselectNode(n, true);\n          n.setData('alpha', opacityForFilter, 'end');\n          n.eachAdjacency(function (e) {\n            _Control2.default.deselectEdge(e, true);\n          });\n        } else {\n          console.log(topic);\n        }\n      }\n    });\n\n    // flag all the edges back to 'untouched'\n    _DataModel2.default.Synapses.each(function (synapse) {\n      var e = synapse.get('edge');\n      e.setData('touched', false);\n    });\n    _DataModel2.default.Synapses.each(function (synapse) {\n      var e = synapse.get('edge');\n      var desc;\n      var userId = synapse.get('user_id').toString();\n\n      if (e && !e.getData('touched')) {\n        var synapses = e.getData('synapses');\n\n        // if any of the synapses represent by the edge are still unfiltered\n        // leave the edge visible\n        passesSynapse = false;\n        for (var i = 0; i < synapses.length; i++) {\n          desc = synapses[i].get('desc');\n          if (visible.synapses.indexOf(desc) > -1) passesSynapse = true;\n        }\n\n        // if the synapse description being displayed is now being\n        // filtered, set the displayIndex to the first unfiltered synapse if there is one\n        var displayIndex = e.getData('displayIndex') ? e.getData('displayIndex') : 0;\n        var displayedSynapse = synapses[displayIndex];\n        desc = displayedSynapse.get('desc');\n        if (passesSynapse && visible.synapses.indexOf(desc) === -1) {\n          // iterate and find an unfiltered one\n          for (var _i = 0; _i < synapses.length; _i++) {\n            desc = synapses[_i].get('desc');\n            if (visible.synapses.indexOf(desc) > -1) {\n              e.setData('displayIndex', _i);\n              break;\n            }\n          }\n        }\n\n        if (_Active2.default.Map) {\n          // when on a map,\n          // we filter by mapper according to the person who added the\n          // topic or synapse to the map\n          userId = synapse.getMapping().get('user_id').toString();\n        }\n        if (visible.mappers.indexOf(userId) === -1) passesMapper = false;else\n        passesMapper = true;\n\n        var color = _Settings2.default.colors.synapses.normal;\n        if (passesSynapse && passesMapper) {\n          e.setData('alpha', 1, 'end');\n          e.setData('color', color, 'end');\n        } else {\n          _Control2.default.deselectEdge(e, true);\n          e.setData('alpha', opacityForFilter, 'end');\n        }\n\n        e.setData('touched', true);\n      } else if (!e) {\n        console.log(synapse);\n      }\n    });\n\n    // run the animation\n    _Visualize2.default.mGraph.fx.animate({\n      modes: ['node-property:alpha',\n      'edge-property:alpha'],\n      duration: 200 });\n\n  } };exports.default =\n\n\nFilter;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU2LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvRmlsdGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGdsb2JhbCAkICovXG5cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCdcblxuaW1wb3J0IEFjdGl2ZSBmcm9tICcuL0FjdGl2ZSdcbmltcG9ydCBDb250cm9sIGZyb20gJy4vQ29udHJvbCdcbmltcG9ydCBEYXRhTW9kZWwgZnJvbSAnLi9EYXRhTW9kZWwnXG5pbXBvcnQgR2xvYmFsVUkgZnJvbSAnLi9HbG9iYWxVSSdcbmltcG9ydCBTZXR0aW5ncyBmcm9tICcuL1NldHRpbmdzJ1xuaW1wb3J0IFZpc3VhbGl6ZSBmcm9tICcuL1Zpc3VhbGl6ZSdcblxuY29uc3QgRmlsdGVyID0ge1xuICBmaWx0ZXJzOiB7XG4gICAgbmFtZTogJycsXG4gICAgbWV0YWNvZGVzOiBbXSxcbiAgICBtYXBwZXJzOiBbXSxcbiAgICBzeW5hcHNlczogW11cbiAgfSxcbiAgdmlzaWJsZToge1xuICAgIG1ldGFjb2RlczogW10sXG4gICAgbWFwcGVyczogW10sXG4gICAgc3luYXBzZXM6IFtdXG4gIH0sXG4gIGlzT3BlbjogZmFsc2UsXG4gIGNoYW5naW5nOiBmYWxzZSxcbiAgaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSBGaWx0ZXJcblxuICAgICQoJy5zaWRlYmFyRmlsdGVySWNvbicpLmNsaWNrKHNlbGYudG9nZ2xlQm94KVxuXG4gICAgJCgnLnNpZGViYXJGaWx0ZXJCb3ggLnNob3dBbGxNZXRhY29kZXMnKS5jbGljayhzZWxmLmZpbHRlck5vTWV0YWNvZGVzKVxuICAgICQoJy5zaWRlYmFyRmlsdGVyQm94IC5zaG93QWxsU3luYXBzZXMnKS5jbGljayhzZWxmLmZpbHRlck5vU3luYXBzZXMpXG4gICAgJCgnLnNpZGViYXJGaWx0ZXJCb3ggLnNob3dBbGxNYXBwZXJzJykuY2xpY2soc2VsZi5maWx0ZXJOb01hcHBlcnMpXG4gICAgJCgnLnNpZGViYXJGaWx0ZXJCb3ggLmhpZGVBbGxNZXRhY29kZXMnKS5jbGljayhzZWxmLmZpbHRlckFsbE1ldGFjb2RlcylcbiAgICAkKCcuc2lkZWJhckZpbHRlckJveCAuaGlkZUFsbFN5bmFwc2VzJykuY2xpY2soc2VsZi5maWx0ZXJBbGxTeW5hcHNlcylcbiAgICAkKCcuc2lkZWJhckZpbHRlckJveCAuaGlkZUFsbE1hcHBlcnMnKS5jbGljayhzZWxmLmZpbHRlckFsbE1hcHBlcnMpXG5cbiAgICBzZWxmLmJpbmRMaUNsaWNrcygpXG4gICAgc2VsZi5nZXRGaWx0ZXJEYXRhKClcbiAgfSxcbiAgdG9nZ2xlQm94OiBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBzZWxmID0gRmlsdGVyXG5cbiAgICBpZiAoc2VsZi5pc09wZW4pIHNlbGYuY2xvc2UoKVxuICAgIGVsc2Ugc2VsZi5vcGVuKClcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gIH0sXG4gIG9wZW46IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gRmlsdGVyXG5cbiAgICBHbG9iYWxVSS5BY2NvdW50LmNsb3NlKClcbiAgICAkKCcuc2lkZWJhckZpbHRlckljb24gZGl2JykuYWRkQ2xhc3MoJ2hpZGUnKVxuXG4gICAgaWYgKCFzZWxmLmlzT3BlbiAmJiAhc2VsZi5jaGFuZ2luZykge1xuICAgICAgc2VsZi5jaGFuZ2luZyA9IHRydWVcblxuICAgICAgdmFyIGhlaWdodCA9ICQoZG9jdW1lbnQpLmhlaWdodCgpIC0gMTA4XG4gICAgICAkKCcuc2lkZWJhckZpbHRlckJveCcpLmNzcygnbWF4LWhlaWdodCcsIGhlaWdodCArICdweCcpLmZhZGVJbigyMDAsIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLmNoYW5naW5nID0gZmFsc2VcbiAgICAgICAgc2VsZi5pc09wZW4gPSB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfSxcbiAgY2xvc2U6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gRmlsdGVyXG4gICAgJCgnLnNpZGViYXJGaWx0ZXJJY29uIGRpdicpLnJlbW92ZUNsYXNzKCdoaWRlJylcblxuICAgIGlmICghc2VsZi5jaGFuZ2luZykge1xuICAgICAgc2VsZi5jaGFuZ2luZyA9IHRydWVcblxuICAgICAgJCgnLnNpZGViYXJGaWx0ZXJCb3gnKS5mYWRlT3V0KDIwMCwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYuY2hhbmdpbmcgPSBmYWxzZVxuICAgICAgICBzZWxmLmlzT3BlbiA9IGZhbHNlXG4gICAgICB9KVxuICAgIH1cbiAgfSxcbiAgcmVzZXQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gRmlsdGVyXG5cbiAgICBzZWxmLmZpbHRlcnMubWV0YWNvZGVzID0gW11cbiAgICBzZWxmLmZpbHRlcnMubWFwcGVycyA9IFtdXG4gICAgc2VsZi5maWx0ZXJzLnN5bmFwc2VzID0gW11cbiAgICBzZWxmLnZpc2libGUubWV0YWNvZGVzID0gW11cbiAgICBzZWxmLnZpc2libGUubWFwcGVycyA9IFtdXG4gICAgc2VsZi52aXNpYmxlLnN5bmFwc2VzID0gW11cblxuICAgICQoJyNmaWx0ZXJfYnlfbWV0YWNvZGUgdWwnKS5lbXB0eSgpXG4gICAgJCgnI2ZpbHRlcl9ieV9tYXBwZXIgdWwnKS5lbXB0eSgpXG4gICAgJCgnI2ZpbHRlcl9ieV9zeW5hcHNlIHVsJykuZW1wdHkoKVxuXG4gICAgJCgnLmZpbHRlckJveCAuc2hvd0FsbCcpLmFkZENsYXNzKCdhY3RpdmUnKVxuICB9LFxuICAvKlxuICBNb3N0IG9mIHRoaXMgZGF0YSBlc3NlbnRpYWxseSBkZXBlbmRzIG9uIHRoZSBydWJ5IGZ1bmN0aW9uIHdoaWNoIGFyZSBoYXBwZW5pbmcgZm9yIGZpbHRlciBpbnNpZGUgdmlldyBmaWx0ZXJCb3hcbiAgQnV0IHdoYXQgdGhlc2UgZnVuY3Rpb24gZG8gaXMgbG9hZCB0aGlzIGRhdGEgaW50byB0aHJlZSBhY2Nlc3NpYmxlIGFycmF5IHdpdGhpbiBqYXZhIDogbWV0YWNvZGVzLCBtYXBwZXJzIGFuZCBzeW5hcHNlc1xuICAqL1xuICBnZXRGaWx0ZXJEYXRhOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IEZpbHRlclxuXG4gICAgdmFyIG1ldGFjb2RlLCBtYXBwZXIsIHN5bmFwc2VcblxuICAgICQoJyNmaWx0ZXJfYnlfbWV0YWNvZGUgbGknKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgbWV0YWNvZGUgPSAkKHRoaXMpLmF0dHIoJ2RhdGEtaWQnKVxuICAgICAgc2VsZi5maWx0ZXJzLm1ldGFjb2Rlcy5wdXNoKG1ldGFjb2RlKVxuICAgICAgc2VsZi52aXNpYmxlLm1ldGFjb2Rlcy5wdXNoKG1ldGFjb2RlKVxuICAgIH0pXG5cbiAgICAkKCcjZmlsdGVyX2J5X21hcHBlciBsaScpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICBtYXBwZXIgPSAoJCh0aGlzKS5hdHRyKCdkYXRhLWlkJykpXG4gICAgICBzZWxmLmZpbHRlcnMubWFwcGVycy5wdXNoKG1hcHBlcilcbiAgICAgIHNlbGYudmlzaWJsZS5tYXBwZXJzLnB1c2gobWFwcGVyKVxuICAgIH0pXG5cbiAgICAkKCcjZmlsdGVyX2J5X3N5bmFwc2UgbGknKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgc3luYXBzZSA9ICgkKHRoaXMpLmF0dHIoJ2RhdGEtaWQnKSlcbiAgICAgIHNlbGYuZmlsdGVycy5zeW5hcHNlcy5wdXNoKHN5bmFwc2UpXG4gICAgICBzZWxmLnZpc2libGUuc3luYXBzZXMucHVzaChzeW5hcHNlKVxuICAgIH0pXG4gIH0sXG4gIGJpbmRMaUNsaWNrczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSBGaWx0ZXJcbiAgICAkKCcjZmlsdGVyX2J5X21ldGFjb2RlIHVsIGxpJykudW5iaW5kKCkuY2xpY2soc2VsZi50b2dnbGVNZXRhY29kZSlcbiAgICAkKCcjZmlsdGVyX2J5X21hcHBlciB1bCBsaScpLnVuYmluZCgpLmNsaWNrKHNlbGYudG9nZ2xlTWFwcGVyKVxuICAgICQoJyNmaWx0ZXJfYnlfc3luYXBzZSB1bCBsaScpLnVuYmluZCgpLmNsaWNrKHNlbGYudG9nZ2xlU3luYXBzZSlcbiAgfSxcbiAgLy8gYW4gYWJzdHJhY3Rpb24gZnVuY3Rpb24gZm9yIGNoZWNrTWV0YWNvZGVzLCBjaGVja01hcHBlcnMsIGNoZWNrU3luYXBzZXMgdG8gcmVkdWNlXG4gIC8vIGNvZGUgcmVkdW5kYW5jeVxuICAvKlxuICBAcGFyYW1cbiAgKi9cbiAgdXBkYXRlRmlsdGVyczogZnVuY3Rpb24oY29sbGVjdGlvbiwgcHJvcGVydHlUb0NoZWNrLCBjb3JyZWxhdGVkTW9kZWwsIGZpbHRlcnNUb1VzZSwgbGlzdFRvTW9kaWZ5KSB7XG4gICAgdmFyIHNlbGYgPSBGaWx0ZXJcblxuICAgIHZhciBuZXdMaXN0ID0gW11cbiAgICB2YXIgcmVtb3ZlZCA9IFtdXG4gICAgdmFyIGFkZGVkID0gW11cblxuICAgIC8vIHRoZSBmaXJzdCBvcHRpb24gZW5hYmxlcyB1cyB0byBhY2NlcHRcbiAgICAvLyBbJ1RvcGljcycsICdTeW5hcHNlcyddIGFzICdjb2xsZWN0aW9uJ1xuICAgIGlmICh0eXBlb2YgY29sbGVjdGlvbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIERhdGFNb2RlbFtjb2xsZWN0aW9uWzBdXS5lYWNoKGZ1bmN0aW9uKG1vZGVsKSB7XG4gICAgICAgIHZhciBwcm9wID0gbW9kZWwuZ2V0KHByb3BlcnR5VG9DaGVjaylcbiAgICAgICAgaWYgKHByb3AgIT09IG51bGwpIHtcbiAgICAgICAgICBwcm9wID0gcHJvcC50b1N0cmluZygpXG4gICAgICAgICAgaWYgKG5ld0xpc3QuaW5kZXhPZihwcm9wKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIG5ld0xpc3QucHVzaChwcm9wKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIERhdGFNb2RlbFtjb2xsZWN0aW9uWzFdXS5lYWNoKGZ1bmN0aW9uKG1vZGVsKSB7XG4gICAgICAgIHZhciBwcm9wID0gbW9kZWwuZ2V0KHByb3BlcnR5VG9DaGVjaylcbiAgICAgICAgaWYgKHByb3AgIT09IG51bGwpIHtcbiAgICAgICAgICBwcm9wID0gcHJvcC50b1N0cmluZygpXG4gICAgICAgICAgaWYgKG5ld0xpc3QuaW5kZXhPZihwcm9wKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIG5ld0xpc3QucHVzaChwcm9wKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb2xsZWN0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgRGF0YU1vZGVsW2NvbGxlY3Rpb25dLmVhY2goZnVuY3Rpb24obW9kZWwpIHtcbiAgICAgICAgdmFyIHByb3AgPSBtb2RlbC5nZXQocHJvcGVydHlUb0NoZWNrKVxuICAgICAgICBpZiAocHJvcCAhPT0gbnVsbCkge1xuICAgICAgICAgIHByb3AgPSBwcm9wLnRvU3RyaW5nKClcbiAgICAgICAgICBpZiAobmV3TGlzdC5pbmRleE9mKHByb3ApID09PSAtMSkge1xuICAgICAgICAgICAgbmV3TGlzdC5wdXNoKHByb3ApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIHJlbW92ZWQgPSBfLmRpZmZlcmVuY2Uoc2VsZi5maWx0ZXJzW2ZpbHRlcnNUb1VzZV0sIG5ld0xpc3QpXG4gICAgYWRkZWQgPSBfLmRpZmZlcmVuY2UobmV3TGlzdCwgc2VsZi5maWx0ZXJzW2ZpbHRlcnNUb1VzZV0pXG5cbiAgICAvLyByZW1vdmUgdGhlIGxpc3QgaXRlbXMgZm9yIHRoaW5ncyBubyBsb25nZXIgcHJlc2VudCBvbiB0aGUgbWFwXG4gICAgXy5lYWNoKHJlbW92ZWQsIGZ1bmN0aW9uKGlkZW50aWZpZXIpIHtcbiAgICAgICQoJyNmaWx0ZXJfYnlfJyArIGxpc3RUb01vZGlmeSArICcgbGlbZGF0YS1pZD1cIicgKyBpZGVudGlmaWVyICsgJ1wiXScpLmZhZGVPdXQoJ2Zhc3QnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgJCh0aGlzKS5yZW1vdmUoKVxuICAgICAgfSlcbiAgICAgIGNvbnN0IGluZGV4ID0gc2VsZi52aXNpYmxlW2ZpbHRlcnNUb1VzZV0uaW5kZXhPZihpZGVudGlmaWVyKVxuICAgICAgc2VsZi52aXNpYmxlW2ZpbHRlcnNUb1VzZV0uc3BsaWNlKGluZGV4LCAxKVxuICAgIH0pXG5cbiAgICB2YXIgbW9kZWwsIGxpLCBqUXVlcnlMaVxuICAgIGZ1bmN0aW9uIHNvcnRBbHBoYShhLCBiKSB7XG4gICAgICByZXR1cm4gYS5jaGlsZE5vZGVzWzFdLmlubmVySFRNTC50b0xvd2VyQ2FzZSgpID4gYi5jaGlsZE5vZGVzWzFdLmlubmVySFRNTC50b0xvd2VyQ2FzZSgpID8gMSA6IC0xXG4gICAgfVxuICAgIC8vIGZvciBlYWNoIG5ldyBmaWx0ZXIgdG8gYmUgYWRkZWQsIGNyZWF0ZSBhIGxpc3QgaXRlbSBmb3IgaXQgYW5kIGZhZGUgaXQgaW5cbiAgICBfLmVhY2goYWRkZWQsIGZ1bmN0aW9uKGlkZW50aWZpZXIpIHtcbiAgICAgIG1vZGVsID0gRGF0YU1vZGVsW2NvcnJlbGF0ZWRNb2RlbF0uZ2V0KGlkZW50aWZpZXIpIHx8XG4gICAgICBEYXRhTW9kZWxbY29ycmVsYXRlZE1vZGVsXS5maW5kKGZ1bmN0aW9uKG1vZGVsKSB7XG4gICAgICAgIHJldHVybiBtb2RlbC5nZXQocHJvcGVydHlUb0NoZWNrKSA9PT0gaWRlbnRpZmllclxuICAgICAgfSlcbiAgICAgIGxpID0gbW9kZWwucHJlcGFyZUxpRm9yRmlsdGVyKClcbiAgICAgIGpRdWVyeUxpID0gJChsaSkuaGlkZSgpXG4gICAgICAkKCdsaScsICcjZmlsdGVyX2J5XycgKyBsaXN0VG9Nb2RpZnkgKyAnIHVsJykuYWRkKGpRdWVyeUxpLmZhZGVJbignZmFzdCcpKVxuICAgICAgICAuc29ydChzb3J0QWxwaGEpLmFwcGVuZFRvKCcjZmlsdGVyX2J5XycgKyBsaXN0VG9Nb2RpZnkgKyAnIHVsJylcbiAgICAgIHNlbGYudmlzaWJsZVtmaWx0ZXJzVG9Vc2VdLnB1c2goaWRlbnRpZmllcilcbiAgICB9KVxuXG4gICAgLy8gdXBkYXRlIHRoZSBsaXN0IG9mIGZpbHRlcnMgd2l0aCB0aGUgbmV3IGxpc3Qgd2UganVzdCBnZW5lcmF0ZWRcbiAgICBzZWxmLmZpbHRlcnNbZmlsdGVyc1RvVXNlXSA9IG5ld0xpc3RcblxuICAgIC8vIG1ha2Ugc3VyZSBjbGlja3Mgb24gbGlzdCBpdGVtcyBzdGlsbCB0cmlnZ2VyIHRoZSByaWdodCBldmVudHNcbiAgICBzZWxmLmJpbmRMaUNsaWNrcygpXG4gIH0sXG4gIGNoZWNrTWV0YWNvZGVzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IEZpbHRlclxuICAgIHNlbGYudXBkYXRlRmlsdGVycygnVG9waWNzJywgJ21ldGFjb2RlX2lkJywgJ01ldGFjb2RlcycsICdtZXRhY29kZXMnLCAnbWV0YWNvZGUnKVxuICB9LFxuICBjaGVja01hcHBlcnM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gRmlsdGVyXG4gICAgaWYgKEFjdGl2ZS5NYXApIHtcbiAgICAgIHNlbGYudXBkYXRlRmlsdGVycygnTWFwcGluZ3MnLCAndXNlcl9pZCcsICdNYXBwZXJzJywgJ21hcHBlcnMnLCAnbWFwcGVyJylcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb24gdG9waWMgdmlld1xuICAgICAgc2VsZi51cGRhdGVGaWx0ZXJzKFsnVG9waWNzJywgJ1N5bmFwc2VzJ10sICd1c2VyX2lkJywgJ0NyZWF0b3JzJywgJ21hcHBlcnMnLCAnbWFwcGVyJylcbiAgICB9XG4gIH0sXG4gIGNoZWNrU3luYXBzZXM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gRmlsdGVyXG4gICAgc2VsZi51cGRhdGVGaWx0ZXJzKCdTeW5hcHNlcycsICdkZXNjJywgJ1N5bmFwc2VzJywgJ3N5bmFwc2VzJywgJ3N5bmFwc2UnKVxuICB9LFxuICBmaWx0ZXJBbGxNZXRhY29kZXM6IGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgc2VsZiA9IEZpbHRlclxuICAgICQoJyNmaWx0ZXJfYnlfbWV0YWNvZGUgdWwgbGknKS5hZGRDbGFzcygndG9nZ2xlZE9mZicpXG4gICAgJCgnLnNob3dBbGxNZXRhY29kZXMnKS5yZW1vdmVDbGFzcygnYWN0aXZlJylcbiAgICAkKCcuaGlkZUFsbE1ldGFjb2RlcycpLmFkZENsYXNzKCdhY3RpdmUnKVxuICAgIHNlbGYudmlzaWJsZS5tZXRhY29kZXMgPSBbXVxuICAgIHNlbGYucGFzc0ZpbHRlcnMoKVxuICB9LFxuICBmaWx0ZXJOb01ldGFjb2RlczogZnVuY3Rpb24oZSkge1xuICAgIHZhciBzZWxmID0gRmlsdGVyXG4gICAgJCgnI2ZpbHRlcl9ieV9tZXRhY29kZSB1bCBsaScpLnJlbW92ZUNsYXNzKCd0b2dnbGVkT2ZmJylcbiAgICAkKCcuc2hvd0FsbE1ldGFjb2RlcycpLmFkZENsYXNzKCdhY3RpdmUnKVxuICAgICQoJy5oaWRlQWxsTWV0YWNvZGVzJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpXG4gICAgc2VsZi52aXNpYmxlLm1ldGFjb2RlcyA9IHNlbGYuZmlsdGVycy5tZXRhY29kZXMuc2xpY2UoKVxuICAgIHNlbGYucGFzc0ZpbHRlcnMoKVxuICB9LFxuICBmaWx0ZXJBbGxNYXBwZXJzOiBmdW5jdGlvbihlKSB7XG4gICAgdmFyIHNlbGYgPSBGaWx0ZXJcbiAgICAkKCcjZmlsdGVyX2J5X21hcHBlciB1bCBsaScpLmFkZENsYXNzKCd0b2dnbGVkT2ZmJylcbiAgICAkKCcuc2hvd0FsbE1hcHBlcnMnKS5yZW1vdmVDbGFzcygnYWN0aXZlJylcbiAgICAkKCcuaGlkZUFsbE1hcHBlcnMnKS5hZGRDbGFzcygnYWN0aXZlJylcbiAgICBzZWxmLnZpc2libGUubWFwcGVycyA9IFtdXG4gICAgc2VsZi5wYXNzRmlsdGVycygpXG4gIH0sXG4gIGZpbHRlck5vTWFwcGVyczogZnVuY3Rpb24oZSkge1xuICAgIHZhciBzZWxmID0gRmlsdGVyXG4gICAgJCgnI2ZpbHRlcl9ieV9tYXBwZXIgdWwgbGknKS5yZW1vdmVDbGFzcygndG9nZ2xlZE9mZicpXG4gICAgJCgnLnNob3dBbGxNYXBwZXJzJykuYWRkQ2xhc3MoJ2FjdGl2ZScpXG4gICAgJCgnLmhpZGVBbGxNYXBwZXJzJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpXG4gICAgc2VsZi52aXNpYmxlLm1hcHBlcnMgPSBzZWxmLmZpbHRlcnMubWFwcGVycy5zbGljZSgpXG4gICAgc2VsZi5wYXNzRmlsdGVycygpXG4gIH0sXG4gIGZpbHRlckFsbFN5bmFwc2VzOiBmdW5jdGlvbihlKSB7XG4gICAgdmFyIHNlbGYgPSBGaWx0ZXJcbiAgICAkKCcjZmlsdGVyX2J5X3N5bmFwc2UgdWwgbGknKS5hZGRDbGFzcygndG9nZ2xlZE9mZicpXG4gICAgJCgnLnNob3dBbGxTeW5hcHNlcycpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxuICAgICQoJy5oaWRlQWxsU3luYXBzZXMnKS5hZGRDbGFzcygnYWN0aXZlJylcbiAgICBzZWxmLnZpc2libGUuc3luYXBzZXMgPSBbXVxuICAgIHNlbGYucGFzc0ZpbHRlcnMoKVxuICB9LFxuICBmaWx0ZXJOb1N5bmFwc2VzOiBmdW5jdGlvbihlKSB7XG4gICAgdmFyIHNlbGYgPSBGaWx0ZXJcbiAgICAkKCcjZmlsdGVyX2J5X3N5bmFwc2UgdWwgbGknKS5yZW1vdmVDbGFzcygndG9nZ2xlZE9mZicpXG4gICAgJCgnLnNob3dBbGxTeW5hcHNlcycpLmFkZENsYXNzKCdhY3RpdmUnKVxuICAgICQoJy5oaWRlQWxsU3luYXBzZXMnKS5yZW1vdmVDbGFzcygnYWN0aXZlJylcbiAgICBzZWxmLnZpc2libGUuc3luYXBzZXMgPSBzZWxmLmZpbHRlcnMuc3luYXBzZXMuc2xpY2UoKVxuICAgIHNlbGYucGFzc0ZpbHRlcnMoKVxuICB9LFxuICAvLyBhbiBhYnN0cmFjdGlvbiBmdW5jdGlvbiBmb3IgdG9nZ2xlTWV0YWNvZGUsIHRvZ2dsZU1hcHBlciwgdG9nZ2xlU3luYXBzZVxuICAvLyB0byByZWR1Y2UgY29kZSByZWR1bmRhbmN5XG4gIC8vIGdldHMgY2FsbGVkIGluIHRoZSBjb250ZXh0IG9mIGEgbGlzdCBpdGVtIGluIGEgZmlsdGVyIGJveFxuICB0b2dnbGVMaTogZnVuY3Rpb24od2hpY2hUb0ZpbHRlcikge1xuICAgIHZhciBzZWxmID0gRmlsdGVyXG4gICAgdmFyIGlkID0gJCh0aGlzKS5hdHRyKCdkYXRhLWlkJylcbiAgICBpZiAoc2VsZi52aXNpYmxlW3doaWNoVG9GaWx0ZXJdLmluZGV4T2YoaWQpID09PSAtMSkge1xuICAgICAgc2VsZi52aXNpYmxlW3doaWNoVG9GaWx0ZXJdLnB1c2goaWQpXG4gICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCd0b2dnbGVkT2ZmJylcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5kZXggPSBzZWxmLnZpc2libGVbd2hpY2hUb0ZpbHRlcl0uaW5kZXhPZihpZClcbiAgICAgIHNlbGYudmlzaWJsZVt3aGljaFRvRmlsdGVyXS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAkKHRoaXMpLmFkZENsYXNzKCd0b2dnbGVkT2ZmJylcbiAgICB9XG4gICAgc2VsZi5wYXNzRmlsdGVycygpXG4gIH0sXG4gIHRvZ2dsZU1ldGFjb2RlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IEZpbHRlclxuICAgIHNlbGYudG9nZ2xlTGkuY2FsbCh0aGlzLCAnbWV0YWNvZGVzJylcblxuICAgIGlmIChzZWxmLnZpc2libGUubWV0YWNvZGVzLmxlbmd0aCA9PT0gc2VsZi5maWx0ZXJzLm1ldGFjb2Rlcy5sZW5ndGgpIHtcbiAgICAgICQoJy5zaG93QWxsTWV0YWNvZGVzJykuYWRkQ2xhc3MoJ2FjdGl2ZScpXG4gICAgICAkKCcuaGlkZUFsbE1ldGFjb2RlcycpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxuICAgIH0gZWxzZSBpZiAoc2VsZi52aXNpYmxlLm1ldGFjb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICQoJy5zaG93QWxsTWV0YWNvZGVzJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpXG4gICAgICAkKCcuaGlkZUFsbE1ldGFjb2RlcycpLmFkZENsYXNzKCdhY3RpdmUnKVxuICAgIH0gZWxzZSB7XG4gICAgICAkKCcuc2hvd0FsbE1ldGFjb2RlcycpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxuICAgICAgJCgnLmhpZGVBbGxNZXRhY29kZXMnKS5yZW1vdmVDbGFzcygnYWN0aXZlJylcbiAgICB9XG4gIH0sXG4gIHRvZ2dsZU1hcHBlcjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSBGaWx0ZXJcbiAgICBzZWxmLnRvZ2dsZUxpLmNhbGwodGhpcywgJ21hcHBlcnMnKVxuXG4gICAgaWYgKHNlbGYudmlzaWJsZS5tYXBwZXJzLmxlbmd0aCA9PT0gc2VsZi5maWx0ZXJzLm1hcHBlcnMubGVuZ3RoKSB7XG4gICAgICAkKCcuc2hvd0FsbE1hcHBlcnMnKS5hZGRDbGFzcygnYWN0aXZlJylcbiAgICAgICQoJy5oaWRlQWxsTWFwcGVycycpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxuICAgIH0gZWxzZSBpZiAoc2VsZi52aXNpYmxlLm1hcHBlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAkKCcuc2hvd0FsbE1hcHBlcnMnKS5yZW1vdmVDbGFzcygnYWN0aXZlJylcbiAgICAgICQoJy5oaWRlQWxsTWFwcGVycycpLmFkZENsYXNzKCdhY3RpdmUnKVxuICAgIH0gZWxzZSB7XG4gICAgICAkKCcuc2hvd0FsbE1hcHBlcnMnKS5yZW1vdmVDbGFzcygnYWN0aXZlJylcbiAgICAgICQoJy5oaWRlQWxsTWFwcGVycycpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxuICAgIH1cbiAgfSxcbiAgdG9nZ2xlU3luYXBzZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSBGaWx0ZXJcbiAgICBzZWxmLnRvZ2dsZUxpLmNhbGwodGhpcywgJ3N5bmFwc2VzJylcblxuICAgIGlmIChzZWxmLnZpc2libGUuc3luYXBzZXMubGVuZ3RoID09PSBzZWxmLmZpbHRlcnMuc3luYXBzZXMubGVuZ3RoKSB7XG4gICAgICAkKCcuc2hvd0FsbFN5bmFwc2VzJykuYWRkQ2xhc3MoJ2FjdGl2ZScpXG4gICAgICAkKCcuaGlkZUFsbFN5bmFwc2VzJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpXG4gICAgfSBlbHNlIGlmIChzZWxmLnZpc2libGUuc3luYXBzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAkKCcuc2hvd0FsbFN5bmFwc2VzJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpXG4gICAgICAkKCcuaGlkZUFsbFN5bmFwc2VzJykuYWRkQ2xhc3MoJ2FjdGl2ZScpXG4gICAgfSBlbHNlIHtcbiAgICAgICQoJy5zaG93QWxsU3luYXBzZXMnKS5yZW1vdmVDbGFzcygnYWN0aXZlJylcbiAgICAgICQoJy5oaWRlQWxsU3luYXBzZXMnKS5yZW1vdmVDbGFzcygnYWN0aXZlJylcbiAgICB9XG4gIH0sXG4gIHBhc3NGaWx0ZXJzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IEZpbHRlclxuICAgIHZhciB2aXNpYmxlID0gc2VsZi52aXNpYmxlXG5cbiAgICB2YXIgcGFzc2VzTWV0YWNvZGUsIHBhc3Nlc01hcHBlciwgcGFzc2VzU3luYXBzZVxuXG4gICAgdmFyIG9wYWNpdHlGb3JGaWx0ZXIgPSBBY3RpdmUuTWFwID8gMCA6IDAuNFxuXG4gICAgRGF0YU1vZGVsLlRvcGljcy5lYWNoKGZ1bmN0aW9uKHRvcGljKSB7XG4gICAgICB2YXIgbiA9IHRvcGljLmdldCgnbm9kZScpXG4gICAgICB2YXIgbWV0YWNvZGVJZCA9IHRvcGljLmdldCgnbWV0YWNvZGVfaWQnKS50b1N0cmluZygpXG5cbiAgICAgIGlmICh2aXNpYmxlLm1ldGFjb2Rlcy5pbmRleE9mKG1ldGFjb2RlSWQpID09PSAtMSkgcGFzc2VzTWV0YWNvZGUgPSBmYWxzZVxuICAgICAgZWxzZSBwYXNzZXNNZXRhY29kZSA9IHRydWVcblxuICAgICAgaWYgKEFjdGl2ZS5NYXApIHtcbiAgICAgICAgLy8gd2hlbiBvbiBhIG1hcCxcbiAgICAgICAgLy8gd2UgZmlsdGVyIGJ5IG1hcHBlciBhY2NvcmRpbmcgdG8gdGhlIHBlcnNvbiB3aG8gYWRkZWQgdGhlXG4gICAgICAgIC8vIHRvcGljIG9yIHN5bmFwc2UgdG8gdGhlIG1hcFxuICAgICAgICBsZXQgdXNlcklkID0gdG9waWMuZ2V0TWFwcGluZygpLmdldCgndXNlcl9pZCcpLnRvU3RyaW5nKClcbiAgICAgICAgaWYgKHZpc2libGUubWFwcGVycy5pbmRleE9mKHVzZXJJZCkgPT09IC0xKSBwYXNzZXNNYXBwZXIgPSBmYWxzZVxuICAgICAgICBlbHNlIHBhc3Nlc01hcHBlciA9IHRydWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHdoZW4gb24gYSB0b3BpYyB2aWV3LFxuICAgICAgICAvLyB3ZSBmaWx0ZXIgYnkgbWFwcGVyIGFjY29yZGluZyB0byB0aGUgcGVyc29uIHdobyBjcmVhdGVkIHRoZVxuICAgICAgICAvLyB0b3BpYyBvciBzeW5hcHNlXG4gICAgICAgIGxldCB1c2VySWQgPSB0b3BpYy5nZXQoJ3VzZXJfaWQnKS50b1N0cmluZygpXG4gICAgICAgIGlmICh2aXNpYmxlLm1hcHBlcnMuaW5kZXhPZih1c2VySWQpID09PSAtMSkgcGFzc2VzTWFwcGVyID0gZmFsc2VcbiAgICAgICAgZWxzZSBwYXNzZXNNYXBwZXIgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChwYXNzZXNNZXRhY29kZSAmJiBwYXNzZXNNYXBwZXIpIHtcbiAgICAgICAgaWYgKG4pIHtcbiAgICAgICAgICBuLnNldERhdGEoJ2FscGhhJywgMSwgJ2VuZCcpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2codG9waWMpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgQ29udHJvbC5kZXNlbGVjdE5vZGUobiwgdHJ1ZSlcbiAgICAgICAgICBuLnNldERhdGEoJ2FscGhhJywgb3BhY2l0eUZvckZpbHRlciwgJ2VuZCcpXG4gICAgICAgICAgbi5lYWNoQWRqYWNlbmN5KGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIENvbnRyb2wuZGVzZWxlY3RFZGdlKGUsIHRydWUpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyh0b3BpYylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyBmbGFnIGFsbCB0aGUgZWRnZXMgYmFjayB0byAndW50b3VjaGVkJ1xuICAgIERhdGFNb2RlbC5TeW5hcHNlcy5lYWNoKGZ1bmN0aW9uKHN5bmFwc2UpIHtcbiAgICAgIHZhciBlID0gc3luYXBzZS5nZXQoJ2VkZ2UnKVxuICAgICAgZS5zZXREYXRhKCd0b3VjaGVkJywgZmFsc2UpXG4gICAgfSlcbiAgICBEYXRhTW9kZWwuU3luYXBzZXMuZWFjaChmdW5jdGlvbihzeW5hcHNlKSB7XG4gICAgICB2YXIgZSA9IHN5bmFwc2UuZ2V0KCdlZGdlJylcbiAgICAgIHZhciBkZXNjXG4gICAgICB2YXIgdXNlcklkID0gc3luYXBzZS5nZXQoJ3VzZXJfaWQnKS50b1N0cmluZygpXG5cbiAgICAgIGlmIChlICYmICFlLmdldERhdGEoJ3RvdWNoZWQnKSkge1xuICAgICAgICB2YXIgc3luYXBzZXMgPSBlLmdldERhdGEoJ3N5bmFwc2VzJylcblxuICAgICAgICAvLyBpZiBhbnkgb2YgdGhlIHN5bmFwc2VzIHJlcHJlc2VudCBieSB0aGUgZWRnZSBhcmUgc3RpbGwgdW5maWx0ZXJlZFxuICAgICAgICAvLyBsZWF2ZSB0aGUgZWRnZSB2aXNpYmxlXG4gICAgICAgIHBhc3Nlc1N5bmFwc2UgPSBmYWxzZVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN5bmFwc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgZGVzYyA9IHN5bmFwc2VzW2ldLmdldCgnZGVzYycpXG4gICAgICAgICAgaWYgKHZpc2libGUuc3luYXBzZXMuaW5kZXhPZihkZXNjKSA+IC0xKSBwYXNzZXNTeW5hcHNlID0gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgdGhlIHN5bmFwc2UgZGVzY3JpcHRpb24gYmVpbmcgZGlzcGxheWVkIGlzIG5vdyBiZWluZ1xuICAgICAgICAvLyBmaWx0ZXJlZCwgc2V0IHRoZSBkaXNwbGF5SW5kZXggdG8gdGhlIGZpcnN0IHVuZmlsdGVyZWQgc3luYXBzZSBpZiB0aGVyZSBpcyBvbmVcbiAgICAgICAgdmFyIGRpc3BsYXlJbmRleCA9IGUuZ2V0RGF0YSgnZGlzcGxheUluZGV4JykgPyBlLmdldERhdGEoJ2Rpc3BsYXlJbmRleCcpIDogMFxuICAgICAgICB2YXIgZGlzcGxheWVkU3luYXBzZSA9IHN5bmFwc2VzW2Rpc3BsYXlJbmRleF1cbiAgICAgICAgZGVzYyA9IGRpc3BsYXllZFN5bmFwc2UuZ2V0KCdkZXNjJylcbiAgICAgICAgaWYgKHBhc3Nlc1N5bmFwc2UgJiYgdmlzaWJsZS5zeW5hcHNlcy5pbmRleE9mKGRlc2MpID09PSAtMSkge1xuICAgICAgICAgIC8vIGl0ZXJhdGUgYW5kIGZpbmQgYW4gdW5maWx0ZXJlZCBvbmVcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN5bmFwc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBkZXNjID0gc3luYXBzZXNbaV0uZ2V0KCdkZXNjJylcbiAgICAgICAgICAgIGlmICh2aXNpYmxlLnN5bmFwc2VzLmluZGV4T2YoZGVzYykgPiAtMSkge1xuICAgICAgICAgICAgICBlLnNldERhdGEoJ2Rpc3BsYXlJbmRleCcsIGkpXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFjdGl2ZS5NYXApIHtcbiAgICAgICAgICAvLyB3aGVuIG9uIGEgbWFwLFxuICAgICAgICAgIC8vIHdlIGZpbHRlciBieSBtYXBwZXIgYWNjb3JkaW5nIHRvIHRoZSBwZXJzb24gd2hvIGFkZGVkIHRoZVxuICAgICAgICAgIC8vIHRvcGljIG9yIHN5bmFwc2UgdG8gdGhlIG1hcFxuICAgICAgICAgIHVzZXJJZCA9IHN5bmFwc2UuZ2V0TWFwcGluZygpLmdldCgndXNlcl9pZCcpLnRvU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgICBpZiAodmlzaWJsZS5tYXBwZXJzLmluZGV4T2YodXNlcklkKSA9PT0gLTEpIHBhc3Nlc01hcHBlciA9IGZhbHNlXG4gICAgICAgIGVsc2UgcGFzc2VzTWFwcGVyID0gdHJ1ZVxuXG4gICAgICAgIHZhciBjb2xvciA9IFNldHRpbmdzLmNvbG9ycy5zeW5hcHNlcy5ub3JtYWxcbiAgICAgICAgaWYgKHBhc3Nlc1N5bmFwc2UgJiYgcGFzc2VzTWFwcGVyKSB7XG4gICAgICAgICAgZS5zZXREYXRhKCdhbHBoYScsIDEsICdlbmQnKVxuICAgICAgICAgIGUuc2V0RGF0YSgnY29sb3InLCBjb2xvciwgJ2VuZCcpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgQ29udHJvbC5kZXNlbGVjdEVkZ2UoZSwgdHJ1ZSlcbiAgICAgICAgICBlLnNldERhdGEoJ2FscGhhJywgb3BhY2l0eUZvckZpbHRlciwgJ2VuZCcpXG4gICAgICAgIH1cblxuICAgICAgICBlLnNldERhdGEoJ3RvdWNoZWQnLCB0cnVlKVxuICAgICAgfSBlbHNlIGlmICghZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhzeW5hcHNlKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyBydW4gdGhlIGFuaW1hdGlvblxuICAgIFZpc3VhbGl6ZS5tR3JhcGguZnguYW5pbWF0ZSh7XG4gICAgICBtb2RlczogWydub2RlLXByb3BlcnR5OmFscGhhJyxcbiAgICAgICAgJ2VkZ2UtcHJvcGVydHk6YWxwaGEnXSxcbiAgICAgIGR1cmF0aW9uOiAyMDBcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZpbHRlclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9GaWx0ZXIuanMiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 357 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseDifference = __webpack_require__(358),\n    baseFlatten = __webpack_require__(154),\n    baseRest = __webpack_require__(160),\n    isArrayLikeObject = __webpack_require__(361);\n\n/**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */\nvar difference = baseRest(function(array, values) {\n  return isArrayLikeObject(array)\n    ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n    : [];\n});\n\nmodule.exports = difference;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvZGlmZmVyZW5jZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZURpZmZlcmVuY2UgPSByZXF1aXJlKCcuL19iYXNlRGlmZmVyZW5jZScpLFxuICAgIGJhc2VGbGF0dGVuID0gcmVxdWlyZSgnLi9fYmFzZUZsYXR0ZW4nKSxcbiAgICBiYXNlUmVzdCA9IHJlcXVpcmUoJy4vX2Jhc2VSZXN0JyksXG4gICAgaXNBcnJheUxpa2VPYmplY3QgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlT2JqZWN0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBgYXJyYXlgIHZhbHVlcyBub3QgaW5jbHVkZWQgaW4gdGhlIG90aGVyIGdpdmVuIGFycmF5c1xuICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS5cbiAqXG4gKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gKiBAc2VlIF8ud2l0aG91dCwgXy54b3JcbiAqIEBleGFtcGxlXG4gKlxuICogXy5kaWZmZXJlbmNlKFsyLCAxXSwgWzIsIDNdKTtcbiAqIC8vID0+IFsxXVxuICovXG52YXIgZGlmZmVyZW5jZSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIGJhc2VGbGF0dGVuKHZhbHVlcywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpKVxuICAgIDogW107XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBkaWZmZXJlbmNlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9kaWZmZXJlbmNlLmpzXG4vLyBtb2R1bGUgaWQgPSAzNTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 358 */
/***/ function(module, exports, __webpack_require__) {

    eval("var SetCache = __webpack_require__(73),\n    arrayIncludes = __webpack_require__(359),\n    arrayIncludesWith = __webpack_require__(360),\n    arrayMap = __webpack_require__(127),\n    baseUnary = __webpack_require__(102),\n    cacheHas = __webpack_require__(77);\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\nfunction baseDifference(array, values, iteratee, comparator) {\n  var index = -1,\n      includes = arrayIncludes,\n      isCommon = true,\n      length = array.length,\n      result = [],\n      valuesLength = values.length;\n\n  if (!length) {\n    return result;\n  }\n  if (iteratee) {\n    values = arrayMap(values, baseUnary(iteratee));\n  }\n  if (comparator) {\n    includes = arrayIncludesWith;\n    isCommon = false;\n  }\n  else if (values.length >= LARGE_ARRAY_SIZE) {\n    includes = cacheHas;\n    isCommon = false;\n    values = new SetCache(values);\n  }\n  outer:\n  while (++index < length) {\n    var value = array[index],\n        computed = iteratee == null ? value : iteratee(value);\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (isCommon && computed === computed) {\n      var valuesIndex = valuesLength;\n      while (valuesIndex--) {\n        if (values[valuesIndex] === computed) {\n          continue outer;\n        }\n      }\n      result.push(value);\n    }\n    else if (!includes(values, computed, comparator)) {\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseDifference;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VEaWZmZXJlbmNlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBTZXRDYWNoZSA9IHJlcXVpcmUoJy4vX1NldENhY2hlJyksXG4gICAgYXJyYXlJbmNsdWRlcyA9IHJlcXVpcmUoJy4vX2FycmF5SW5jbHVkZXMnKSxcbiAgICBhcnJheUluY2x1ZGVzV2l0aCA9IHJlcXVpcmUoJy4vX2FycmF5SW5jbHVkZXNXaXRoJyksXG4gICAgYXJyYXlNYXAgPSByZXF1aXJlKCcuL19hcnJheU1hcCcpLFxuICAgIGJhc2VVbmFyeSA9IHJlcXVpcmUoJy4vX2Jhc2VVbmFyeScpLFxuICAgIGNhY2hlSGFzID0gcmVxdWlyZSgnLi9fY2FjaGVIYXMnKTtcblxuLyoqIFVzZWQgYXMgdGhlIHNpemUgdG8gZW5hYmxlIGxhcmdlIGFycmF5IG9wdGltaXphdGlvbnMuICovXG52YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uZGlmZmVyZW5jZWAgd2l0aG91dCBzdXBwb3J0XG4gKiBmb3IgZXhjbHVkaW5nIG11bHRpcGxlIGFycmF5cyBvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VEaWZmZXJlbmNlKGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzLFxuICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gW10sXG4gICAgICB2YWx1ZXNMZW5ndGggPSB2YWx1ZXMubGVuZ3RoO1xuXG4gIGlmICghbGVuZ3RoKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBpZiAoaXRlcmF0ZWUpIHtcbiAgICB2YWx1ZXMgPSBhcnJheU1hcCh2YWx1ZXMsIGJhc2VVbmFyeShpdGVyYXRlZSkpO1xuICB9XG4gIGlmIChjb21wYXJhdG9yKSB7XG4gICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICB9XG4gIGVsc2UgaWYgKHZhbHVlcy5sZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkge1xuICAgIGluY2x1ZGVzID0gY2FjaGVIYXM7XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICB2YWx1ZXMgPSBuZXcgU2V0Q2FjaGUodmFsdWVzKTtcbiAgfVxuICBvdXRlcjpcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPT0gbnVsbCA/IHZhbHVlIDogaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgaWYgKGlzQ29tbW9uICYmIGNvbXB1dGVkID09PSBjb21wdXRlZCkge1xuICAgICAgdmFyIHZhbHVlc0luZGV4ID0gdmFsdWVzTGVuZ3RoO1xuICAgICAgd2hpbGUgKHZhbHVlc0luZGV4LS0pIHtcbiAgICAgICAgaWYgKHZhbHVlc1t2YWx1ZXNJbmRleF0gPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIWluY2x1ZGVzKHZhbHVlcywgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKSB7XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZURpZmZlcmVuY2U7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19iYXNlRGlmZmVyZW5jZS5qc1xuLy8gbW9kdWxlIGlkID0gMzU4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 359 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseIndexOf = __webpack_require__(11);\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n  var length = array == null ? 0 : array.length;\n  return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5SW5jbHVkZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VJbmRleE9mID0gcmVxdWlyZSgnLi9fYmFzZUluZGV4T2YnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5jbHVkZXNgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogc3BlY2lmeWluZyBhbiBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksIHZhbHVlKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgMCkgPiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUluY2x1ZGVzO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYXJyYXlJbmNsdWRlcy5qc1xuLy8gbW9kdWxlIGlkID0gMzU5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 360 */
/***/ function(module, exports) {

    eval("/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (comparator(value, array[index])) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arrayIncludesWith;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzYwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5SW5jbHVkZXNXaXRoLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhcnJheUluY2x1ZGVzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEgY29tcGFyYXRvci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5SW5jbHVkZXNXaXRoKGFycmF5LCB2YWx1ZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGNvbXBhcmF0b3IodmFsdWUsIGFycmF5W2luZGV4XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19hcnJheUluY2x1ZGVzV2l0aC5qc1xuLy8gbW9kdWxlIGlkID0gMzYwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 361 */
/***/ function(module, exports, __webpack_require__) {

    eval("var isArrayLike = __webpack_require__(108),\n    isObjectLike = __webpack_require__(26);\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n *  else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n  return isObjectLike(value) && isArrayLike(value);\n}\n\nmodule.exports = isArrayLikeObject;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzYxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheUxpa2VPYmplY3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0FycmF5TGlrZWAgZXhjZXB0IHRoYXQgaXQgYWxzbyBjaGVja3MgaWYgYHZhbHVlYFxuICogaXMgYW4gb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LWxpa2Ugb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGlzQXJyYXlMaWtlKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5TGlrZU9iamVjdDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvaXNBcnJheUxpa2VPYmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IDM2MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 362 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });exports.NotificationIcon = exports.ImportDialog = exports.Account = exports.CreateMap = exports.Search = undefined;\n\nvar _clipboardJs = __webpack_require__(363);var _clipboardJs2 = _interopRequireDefault(_clipboardJs);\n\nvar _Create = __webpack_require__(173);var _Create2 = _interopRequireDefault(_Create);\n\nvar _Search = __webpack_require__(366);var _Search2 = _interopRequireDefault(_Search);\nvar _CreateMap = __webpack_require__(573);var _CreateMap2 = _interopRequireDefault(_CreateMap);\nvar _Account = __webpack_require__(574);var _Account2 = _interopRequireDefault(_Account);\nvar _ImportDialog = __webpack_require__(575);var _ImportDialog2 = _interopRequireDefault(_ImportDialog);\nvar _NotificationIcon = __webpack_require__(607);var _NotificationIcon2 = _interopRequireDefault(_NotificationIcon);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}\n\nvar GlobalUI = {\n  notifyTimeout: null,\n  notifyQueue: [],\n  notifying: false,\n  lightbox: null,\n  init: function init(serverData) {\n    var self = GlobalUI;\n\n    self.Search.init(serverData);\n    self.CreateMap.init(serverData);\n    self.Account.init(serverData);\n    self.ImportDialog.init(serverData, self.openLightbox, self.closeLightbox);\n    self.NotificationIcon.init(serverData);\n\n    if ($('#toast').html().trim()) self.notifyUser($('#toast').html());\n\n    // bind lightbox clicks\n    $('.openLightbox').click(function (event) {\n      self.openLightbox($(this).attr('data-open'));\n      event.preventDefault();\n      return false;\n    });\n\n    $('#lightbox_screen, #lightbox_close').click(self.closeLightbox);\n  },\n  showDiv: function showDiv(selector) {\n    $(selector).show();\n    $(selector).animate({\n      opacity: 1 },\n    200, 'easeOutCubic');\n  },\n  hideDiv: function hideDiv(selector) {\n    $(selector).animate({\n      opacity: 0 },\n    200, 'easeInCubic', function () {$(this).hide();});\n  },\n  openLightbox: function openLightbox(which) {\n    var self = GlobalUI;\n\n    $('.lightboxContent').hide();\n    $('#' + which).show();\n\n    self.lightbox = which;\n\n    $('#lightbox_overlay').show();\n\n    var heightOfContent = '-' + $('#lightbox_main').height() / 2 + 'px';\n    // animate the content in from the bottom\n    $('#lightbox_main').animate({\n      'top': '50%',\n      'margin-top': heightOfContent },\n    200, 'easeOutCubic');\n\n    // fade the black overlay in\n    $('#lightbox_screen').animate({\n      'opacity': '0.42' },\n    200);\n\n    if (which === 'switchMetacodes') {\n      _Create2.default.isSwitchingSet = true;\n    }\n  },\n\n  closeLightbox: function closeLightbox(event) {\n    var self = GlobalUI;\n\n    if (event) event.preventDefault();\n\n    // animate the lightbox content offscreen\n    $('#lightbox_main').animate({\n      'top': '100%',\n      'margin-top': '0' },\n    200, 'easeInCubic');\n\n    // fade the black overlay out\n    $('#lightbox_screen').animate({\n      'opacity': '0.0' },\n    200, function () {\n      $('#lightbox_overlay').hide();\n    });\n\n    if (self.lightbox === 'forkmap') GlobalUI.CreateMap.reset('fork_map');\n    if (self.lightbox === 'newmap') GlobalUI.CreateMap.reset('new_map');\n    if (_Create2.default && _Create2.default.isSwitchingSet) {\n      _Create2.default.cancelMetacodeSetSwitch();\n    }\n    self.lightbox = null;\n  },\n  notifyUser: function notifyUser(message) {var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var self = GlobalUI;\n\n    if (self.notifying) {\n      self.notifyQueue.push({ message: message, opts: opts });\n      return;\n    } else {\n      self._notifyUser(message, opts);\n    }\n  },\n  // note: use the wrapper function notifyUser instead of this one\n  _notifyUser: function _notifyUser(message) {var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var self = GlobalUI;var _opts$leaveOpen =\n\n    opts.leaveOpen,leaveOpen = _opts$leaveOpen === undefined ? false : _opts$leaveOpen,_opts$timeOut = opts.timeOut,timeOut = _opts$timeOut === undefined ? 8000 : _opts$timeOut;\n\n    $('#toast').html(message);\n    self.showDiv('#toast');\n    clearTimeout(self.notifyTimeOut);\n\n    if (!leaveOpen) {\n      self.notifyTimeOut = setTimeout(function () {\n        GlobalUI.clearNotify();\n      }, timeOut);\n    }\n\n    self.notifying = true;\n  },\n  clearNotify: function clearNotify() {\n    var self = GlobalUI;\n\n    // if there are messages remaining, display them\n    if (self.notifyQueue.length > 0) {var _self$notifyQueue$shi =\n      self.notifyQueue.shift(),message = _self$notifyQueue$shi.message,opts = _self$notifyQueue$shi.opts;\n      self._notifyUser(message, opts);\n    } else {\n      self.hideDiv('#toast');\n      self.notifying = false;\n    }\n  },\n  shareInvite: function shareInvite(inviteLink) {\n    _clipboardJs2.default.copy({\n      'text/plain': inviteLink }).\n    then(function () {\n      $('#joinCodesBox .popup').remove();\n      $('#joinCodesBox').append('<p class=\"popup\" style=\"text-align: center\">Copied!</p>');\n      window.setTimeout(function () {return $('#joinCodesBox .popup').remove();}, 1500);\n    }, function () {\n      $('#joinCodesBox .popup').remove();\n      $('#joinCodesBox').append('<p class=\"popup\" style=\"text-align: center\">Your browser doesn\\'t support copying, please copy manually.</p>');\n      window.setTimeout(function () {return $('#joinCodesBox .popup').remove();}, 1500);\n    });\n  } }; /* global $ */exports.\n\n\nSearch = _Search2.default;exports.CreateMap = _CreateMap2.default;exports.Account = _Account2.default;exports.ImportDialog = _ImportDialog2.default;exports.NotificationIcon = _NotificationIcon2.default;exports.default =\nGlobalUI;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzYyLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvR2xvYmFsVUkvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsICQgKi9cblxuaW1wb3J0IGNsaXBib2FyZCBmcm9tICdjbGlwYm9hcmQtanMnXG5cbmltcG9ydCBDcmVhdGUgZnJvbSAnLi4vQ3JlYXRlJ1xuXG5pbXBvcnQgU2VhcmNoIGZyb20gJy4vU2VhcmNoJ1xuaW1wb3J0IENyZWF0ZU1hcCBmcm9tICcuL0NyZWF0ZU1hcCdcbmltcG9ydCBBY2NvdW50IGZyb20gJy4vQWNjb3VudCdcbmltcG9ydCBJbXBvcnREaWFsb2cgZnJvbSAnLi9JbXBvcnREaWFsb2cnXG5pbXBvcnQgTm90aWZpY2F0aW9uSWNvbiBmcm9tICcuL05vdGlmaWNhdGlvbkljb24nXG5cbmNvbnN0IEdsb2JhbFVJID0ge1xuICBub3RpZnlUaW1lb3V0OiBudWxsLFxuICBub3RpZnlRdWV1ZTogW10sXG4gIG5vdGlmeWluZzogZmFsc2UsXG4gIGxpZ2h0Ym94OiBudWxsLFxuICBpbml0OiBmdW5jdGlvbihzZXJ2ZXJEYXRhKSB7XG4gICAgY29uc3Qgc2VsZiA9IEdsb2JhbFVJXG5cbiAgICBzZWxmLlNlYXJjaC5pbml0KHNlcnZlckRhdGEpXG4gICAgc2VsZi5DcmVhdGVNYXAuaW5pdChzZXJ2ZXJEYXRhKVxuICAgIHNlbGYuQWNjb3VudC5pbml0KHNlcnZlckRhdGEpXG4gICAgc2VsZi5JbXBvcnREaWFsb2cuaW5pdChzZXJ2ZXJEYXRhLCBzZWxmLm9wZW5MaWdodGJveCwgc2VsZi5jbG9zZUxpZ2h0Ym94KVxuICAgIHNlbGYuTm90aWZpY2F0aW9uSWNvbi5pbml0KHNlcnZlckRhdGEpXG5cbiAgICBpZiAoJCgnI3RvYXN0JykuaHRtbCgpLnRyaW0oKSkgc2VsZi5ub3RpZnlVc2VyKCQoJyN0b2FzdCcpLmh0bWwoKSlcblxuICAgIC8vIGJpbmQgbGlnaHRib3ggY2xpY2tzXG4gICAgJCgnLm9wZW5MaWdodGJveCcpLmNsaWNrKGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBzZWxmLm9wZW5MaWdodGJveCgkKHRoaXMpLmF0dHIoJ2RhdGEtb3BlbicpKVxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSlcblxuICAgICQoJyNsaWdodGJveF9zY3JlZW4sICNsaWdodGJveF9jbG9zZScpLmNsaWNrKHNlbGYuY2xvc2VMaWdodGJveClcbiAgfSxcbiAgc2hvd0RpdjogZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgICAkKHNlbGVjdG9yKS5zaG93KClcbiAgICAkKHNlbGVjdG9yKS5hbmltYXRlKHtcbiAgICAgIG9wYWNpdHk6IDFcbiAgICB9LCAyMDAsICdlYXNlT3V0Q3ViaWMnKVxuICB9LFxuICBoaWRlRGl2OiBmdW5jdGlvbihzZWxlY3Rvcikge1xuICAgICQoc2VsZWN0b3IpLmFuaW1hdGUoe1xuICAgICAgb3BhY2l0eTogMFxuICAgIH0sIDIwMCwgJ2Vhc2VJbkN1YmljJywgZnVuY3Rpb24oKSB7ICQodGhpcykuaGlkZSgpIH0pXG4gIH0sXG4gIG9wZW5MaWdodGJveDogZnVuY3Rpb24od2hpY2gpIHtcbiAgICBjb25zdCBzZWxmID0gR2xvYmFsVUlcblxuICAgICQoJy5saWdodGJveENvbnRlbnQnKS5oaWRlKClcbiAgICAkKCcjJyArIHdoaWNoKS5zaG93KClcblxuICAgIHNlbGYubGlnaHRib3ggPSB3aGljaFxuXG4gICAgJCgnI2xpZ2h0Ym94X292ZXJsYXknKS5zaG93KClcblxuICAgIHZhciBoZWlnaHRPZkNvbnRlbnQgPSAnLScgKyAoJCgnI2xpZ2h0Ym94X21haW4nKS5oZWlnaHQoKSAvIDIpICsgJ3B4J1xuICAgIC8vIGFuaW1hdGUgdGhlIGNvbnRlbnQgaW4gZnJvbSB0aGUgYm90dG9tXG4gICAgJCgnI2xpZ2h0Ym94X21haW4nKS5hbmltYXRlKHtcbiAgICAgICd0b3AnOiAnNTAlJyxcbiAgICAgICdtYXJnaW4tdG9wJzogaGVpZ2h0T2ZDb250ZW50XG4gICAgfSwgMjAwLCAnZWFzZU91dEN1YmljJylcblxuICAgIC8vIGZhZGUgdGhlIGJsYWNrIG92ZXJsYXkgaW5cbiAgICAkKCcjbGlnaHRib3hfc2NyZWVuJykuYW5pbWF0ZSh7XG4gICAgICAnb3BhY2l0eSc6ICcwLjQyJ1xuICAgIH0sIDIwMClcblxuICAgIGlmICh3aGljaCA9PT0gJ3N3aXRjaE1ldGFjb2RlcycpIHtcbiAgICAgIENyZWF0ZS5pc1N3aXRjaGluZ1NldCA9IHRydWVcbiAgICB9XG4gIH0sXG5cbiAgY2xvc2VMaWdodGJveDogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBjb25zdCBzZWxmID0gR2xvYmFsVUlcblxuICAgIGlmIChldmVudCkgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgLy8gYW5pbWF0ZSB0aGUgbGlnaHRib3ggY29udGVudCBvZmZzY3JlZW5cbiAgICAkKCcjbGlnaHRib3hfbWFpbicpLmFuaW1hdGUoe1xuICAgICAgJ3RvcCc6ICcxMDAlJyxcbiAgICAgICdtYXJnaW4tdG9wJzogJzAnXG4gICAgfSwgMjAwLCAnZWFzZUluQ3ViaWMnKVxuXG4gICAgLy8gZmFkZSB0aGUgYmxhY2sgb3ZlcmxheSBvdXRcbiAgICAkKCcjbGlnaHRib3hfc2NyZWVuJykuYW5pbWF0ZSh7XG4gICAgICAnb3BhY2l0eSc6ICcwLjAnXG4gICAgfSwgMjAwLCBmdW5jdGlvbigpIHtcbiAgICAgICQoJyNsaWdodGJveF9vdmVybGF5JykuaGlkZSgpXG4gICAgfSlcblxuICAgIGlmIChzZWxmLmxpZ2h0Ym94ID09PSAnZm9ya21hcCcpIEdsb2JhbFVJLkNyZWF0ZU1hcC5yZXNldCgnZm9ya19tYXAnKVxuICAgIGlmIChzZWxmLmxpZ2h0Ym94ID09PSAnbmV3bWFwJykgR2xvYmFsVUkuQ3JlYXRlTWFwLnJlc2V0KCduZXdfbWFwJylcbiAgICBpZiAoQ3JlYXRlICYmIENyZWF0ZS5pc1N3aXRjaGluZ1NldCkge1xuICAgICAgQ3JlYXRlLmNhbmNlbE1ldGFjb2RlU2V0U3dpdGNoKClcbiAgICB9XG4gICAgc2VsZi5saWdodGJveCA9IG51bGxcbiAgfSxcbiAgbm90aWZ5VXNlcjogZnVuY3Rpb24obWVzc2FnZSwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3Qgc2VsZiA9IEdsb2JhbFVJXG5cbiAgICBpZiAoc2VsZi5ub3RpZnlpbmcpIHtcbiAgICAgIHNlbGYubm90aWZ5UXVldWUucHVzaCh7IG1lc3NhZ2UsIG9wdHMgfSlcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLl9ub3RpZnlVc2VyKG1lc3NhZ2UsIG9wdHMpXG4gICAgfVxuICB9LFxuICAvLyBub3RlOiB1c2UgdGhlIHdyYXBwZXIgZnVuY3Rpb24gbm90aWZ5VXNlciBpbnN0ZWFkIG9mIHRoaXMgb25lXG4gIF9ub3RpZnlVc2VyOiBmdW5jdGlvbihtZXNzYWdlLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBzZWxmID0gR2xvYmFsVUlcblxuICAgIGNvbnN0IHsgbGVhdmVPcGVuID0gZmFsc2UsIHRpbWVPdXQgPSA4MDAwIH0gPSBvcHRzXG5cbiAgICAkKCcjdG9hc3QnKS5odG1sKG1lc3NhZ2UpXG4gICAgc2VsZi5zaG93RGl2KCcjdG9hc3QnKVxuICAgIGNsZWFyVGltZW91dChzZWxmLm5vdGlmeVRpbWVPdXQpXG5cbiAgICBpZiAoIWxlYXZlT3Blbikge1xuICAgICAgc2VsZi5ub3RpZnlUaW1lT3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgR2xvYmFsVUkuY2xlYXJOb3RpZnkoKVxuICAgICAgfSwgdGltZU91dClcbiAgICB9XG5cbiAgICBzZWxmLm5vdGlmeWluZyA9IHRydWVcbiAgfSxcbiAgY2xlYXJOb3RpZnk6IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHNlbGYgPSBHbG9iYWxVSVxuXG4gICAgLy8gaWYgdGhlcmUgYXJlIG1lc3NhZ2VzIHJlbWFpbmluZywgZGlzcGxheSB0aGVtXG4gICAgaWYgKHNlbGYubm90aWZ5UXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgeyBtZXNzYWdlLCBvcHRzIH0gPSBzZWxmLm5vdGlmeVF1ZXVlLnNoaWZ0KClcbiAgICAgIHNlbGYuX25vdGlmeVVzZXIobWVzc2FnZSwgb3B0cylcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5oaWRlRGl2KCcjdG9hc3QnKVxuICAgICAgc2VsZi5ub3RpZnlpbmcgPSBmYWxzZVxuICAgIH1cbiAgfSxcbiAgc2hhcmVJbnZpdGU6IGZ1bmN0aW9uKGludml0ZUxpbmspIHtcbiAgICBjbGlwYm9hcmQuY29weSh7XG4gICAgICAndGV4dC9wbGFpbic6IGludml0ZUxpbmtcbiAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICQoJyNqb2luQ29kZXNCb3ggLnBvcHVwJykucmVtb3ZlKClcbiAgICAgICQoJyNqb2luQ29kZXNCb3gnKS5hcHBlbmQoJzxwIGNsYXNzPVwicG9wdXBcIiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlclwiPkNvcGllZCE8L3A+JylcbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+ICQoJyNqb2luQ29kZXNCb3ggLnBvcHVwJykucmVtb3ZlKCksIDE1MDApXG4gICAgfSwgKCkgPT4ge1xuICAgICAgJCgnI2pvaW5Db2Rlc0JveCAucG9wdXAnKS5yZW1vdmUoKVxuICAgICAgJCgnI2pvaW5Db2Rlc0JveCcpLmFwcGVuZChgPHAgY2xhc3M9XCJwb3B1cFwiIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyXCI+WW91ciBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBjb3B5aW5nLCBwbGVhc2UgY29weSBtYW51YWxseS48L3A+YClcbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+ICQoJyNqb2luQ29kZXNCb3ggLnBvcHVwJykucmVtb3ZlKCksIDE1MDApXG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgeyBTZWFyY2gsIENyZWF0ZU1hcCwgQWNjb3VudCwgSW1wb3J0RGlhbG9nLCBOb3RpZmljYXRpb25JY29uIH1cbmV4cG9ydCBkZWZhdWx0IEdsb2JhbFVJXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL01ldGFtYXBzL0dsb2JhbFVJL2luZGV4LmpzIl0sIm1hcHBpbmdzIjoiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 363 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(setImmediate) {//  Import support https://stackoverflow.com/questions/13673346/supporting-both-commonjs-and-amd\n(function(name, definition) {\n    if (true) { module.exports = definition(); }\n    else if (typeof define === \"function\" && typeof define.amd === \"object\") { define(definition); }\n    else { this[name] = definition(); }\n}(\"clipboard\", function() {\n  if (typeof document === 'undefined' || !document.addEventListener) {\n    return null;\n  }\n\n  var clipboard = {};\n\n  clipboard.copy = (function() {\n    var _intercept = false;\n    var _data = null; // Map from data type (e.g. \"text/html\") to value.\n    var _bogusSelection = false;\n\n    function cleanup() {\n      _intercept = false;\n      _data = null;\n      if (_bogusSelection) {\n        window.getSelection().removeAllRanges();\n      }\n      _bogusSelection = false;\n    }\n\n    document.addEventListener(\"copy\", function(e) {\n      if (_intercept) {\n        for (var key in _data) {\n          e.clipboardData.setData(key, _data[key]);\n        }\n        e.preventDefault();\n      }\n    });\n\n    // Workaround for Safari: https://bugs.webkit.org/show_bug.cgi?id=156529\n    function bogusSelect() {\n      var sel = document.getSelection();\n      // If \"nothing\" is selected...\n      if (!document.queryCommandEnabled(\"copy\") && sel.isCollapsed) {\n        // ... temporarily select the entire body.\n        //\n        // We select the entire body because:\n        // - it's guaranteed to exist,\n        // - it works (unlike, say, document.head, or phantom element that is\n        //   not inserted into the DOM),\n        // - it doesn't seem to flicker (due to the synchronous copy event), and\n        // - it avoids modifying the DOM (can trigger mutation observers).\n        //\n        // Because we can't do proper feature detection (we already checked\n        // document.queryCommandEnabled(\"copy\") , which actually gives a false\n        // negative for Blink when nothing is selected) and UA sniffing is not\n        // reliable (a lot of UA strings contain \"Safari\"), this will also\n        // happen for some browsers other than Safari. :-()\n        var range = document.createRange();\n        range.selectNodeContents(document.body);\n        sel.addRange(range);\n        _bogusSelection = true;\n      }\n    };\n\n    return function(data) {\n      return new Promise(function(resolve, reject) {\n        _intercept = true;\n        if (typeof data === \"string\") {\n          _data = {\"text/plain\": data};\n        } else if (data instanceof Node) {\n          _data = {\"text/html\": new XMLSerializer().serializeToString(data)};\n        } else {\n          _data = data;\n        }\n        try {\n          bogusSelect();\n          if (document.execCommand(\"copy\")) {\n            // document.execCommand is synchronous: http://www.w3.org/TR/2015/WD-clipboard-apis-20150421/#integration-with-rich-text-editing-apis\n            // So we can call resolve() back here.\n            cleanup();\n            resolve();\n          }\n          else {\n            throw new Error(\"Unable to copy. Perhaps it's not available in your browser?\");\n          }\n        } catch (e) {\n          cleanup();\n          reject(e);\n        }\n      });\n    };\n  })();\n\n  clipboard.paste = (function() {\n    var _intercept = false;\n    var _resolve;\n    var _dataType;\n\n    document.addEventListener(\"paste\", function(e) {\n      if (_intercept) {\n        _intercept = false;\n        e.preventDefault();\n        var resolve = _resolve;\n        _resolve = null;\n        resolve(e.clipboardData.getData(_dataType));\n      }\n    });\n\n    return function(dataType) {\n      return new Promise(function(resolve, reject) {\n        _intercept = true;\n        _resolve = resolve;\n        _dataType = dataType || \"text/plain\";\n        try {\n          if (!document.execCommand(\"paste\")) {\n            _intercept = false;\n            reject(new Error(\"Unable to paste. Pasting only works in Internet Explorer at the moment.\"));\n          }\n        } catch (e) {\n          _intercept = false;\n          reject(new Error(e));\n        }\n      });\n    };\n  })();\n\n  // Handle IE behaviour.\n  if (typeof ClipboardEvent === \"undefined\" &&\n      typeof window.clipboardData !== \"undefined\" &&\n      typeof window.clipboardData.setData !== \"undefined\") {\n\n    /*! promise-polyfill 2.0.1 */\n    (function(a){function b(a,b){return function(){a.apply(b,arguments)}}function c(a){if(\"object\"!=typeof this)throw new TypeError(\"Promises must be constructed via new\");if(\"function\"!=typeof a)throw new TypeError(\"not a function\");this._state=null,this._value=null,this._deferreds=[],i(a,b(e,this),b(f,this))}function d(a){var b=this;return null===this._state?void this._deferreds.push(a):void j(function(){var c=b._state?a.onFulfilled:a.onRejected;if(null===c)return void(b._state?a.resolve:a.reject)(b._value);var d;try{d=c(b._value)}catch(e){return void a.reject(e)}a.resolve(d)})}function e(a){try{if(a===this)throw new TypeError(\"A promise cannot be resolved with itself.\");if(a&&(\"object\"==typeof a||\"function\"==typeof a)){var c=a.then;if(\"function\"==typeof c)return void i(b(c,a),b(e,this),b(f,this))}this._state=!0,this._value=a,g.call(this)}catch(d){f.call(this,d)}}function f(a){this._state=!1,this._value=a,g.call(this)}function g(){for(var a=0,b=this._deferreds.length;b>a;a++)d.call(this,this._deferreds[a]);this._deferreds=null}function h(a,b,c,d){this.onFulfilled=\"function\"==typeof a?a:null,this.onRejected=\"function\"==typeof b?b:null,this.resolve=c,this.reject=d}function i(a,b,c){var d=!1;try{a(function(a){d||(d=!0,b(a))},function(a){d||(d=!0,c(a))})}catch(e){if(d)return;d=!0,c(e)}}var j=c.immediateFn||\"function\"==typeof setImmediate&&setImmediate||function(a){setTimeout(a,1)},k=Array.isArray||function(a){return\"[object Array]\"===Object.prototype.toString.call(a)};c.prototype[\"catch\"]=function(a){return this.then(null,a)},c.prototype.then=function(a,b){var e=this;return new c(function(c,f){d.call(e,new h(a,b,c,f))})},c.all=function(){var a=Array.prototype.slice.call(1===arguments.length&&k(arguments[0])?arguments[0]:arguments);return new c(function(b,c){function d(f,g){try{if(g&&(\"object\"==typeof g||\"function\"==typeof g)){var h=g.then;if(\"function\"==typeof h)return void h.call(g,function(a){d(f,a)},c)}a[f]=g,0===--e&&b(a)}catch(i){c(i)}}if(0===a.length)return b([]);for(var e=a.length,f=0;f<a.length;f++)d(f,a[f])})},c.resolve=function(a){return a&&\"object\"==typeof a&&a.constructor===c?a:new c(function(b){b(a)})},c.reject=function(a){return new c(function(b,c){c(a)})},c.race=function(a){return new c(function(b,c){for(var d=0,e=a.length;e>d;d++)a[d].then(b,c)})},\"undefined\"!=typeof module&&module.exports?module.exports=c:a.Promise||(a.Promise=c)})(this);\n\n    clipboard.copy = function(data) {\n      return new Promise(function(resolve, reject) {\n        // IE supports string and URL types: https://msdn.microsoft.com/en-us/library/ms536744(v=vs.85).aspx\n        // We only support the string type for now.\n        if (typeof data !== \"string\" && !(\"text/plain\" in data)) {\n          throw new Error(\"You must provide a text/plain type.\");\n        }\n\n        var strData = (typeof data === \"string\" ? data : data[\"text/plain\"]);\n        var copySucceeded = window.clipboardData.setData(\"Text\", strData);\n        if (copySucceeded) {\n          resolve();\n        } else {\n          reject(new Error(\"Copying was rejected.\"));\n        }\n      });\n    };\n\n    clipboard.paste = function() {\n      return new Promise(function(resolve, reject) {\n        var strData = window.clipboardData.getData(\"Text\");\n        if (strData) {\n          resolve(strData);\n        } else {\n          // The user rejected the paste request.\n          reject(new Error(\"Pasting was rejected.\"));\n        }\n      });\n    };\n  }\n\n  return clipboard;\n}));\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(364).setImmediate))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzYzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9jbGlwYm9hcmQtanMvY2xpcGJvYXJkLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vICBJbXBvcnQgc3VwcG9ydCBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMzY3MzM0Ni9zdXBwb3J0aW5nLWJvdGgtY29tbW9uanMtYW5kLWFtZFxuKGZ1bmN0aW9uKG5hbWUsIGRlZmluaXRpb24pIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIikgeyBtb2R1bGUuZXhwb3J0cyA9IGRlZmluaXRpb24oKTsgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PT0gXCJvYmplY3RcIikgeyBkZWZpbmUoZGVmaW5pdGlvbik7IH1cbiAgICBlbHNlIHsgdGhpc1tuYW1lXSA9IGRlZmluaXRpb24oKTsgfVxufShcImNsaXBib2FyZFwiLCBmdW5jdGlvbigpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBjbGlwYm9hcmQgPSB7fTtcblxuICBjbGlwYm9hcmQuY29weSA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgX2ludGVyY2VwdCA9IGZhbHNlO1xuICAgIHZhciBfZGF0YSA9IG51bGw7IC8vIE1hcCBmcm9tIGRhdGEgdHlwZSAoZS5nLiBcInRleHQvaHRtbFwiKSB0byB2YWx1ZS5cbiAgICB2YXIgX2JvZ3VzU2VsZWN0aW9uID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgICAgX2ludGVyY2VwdCA9IGZhbHNlO1xuICAgICAgX2RhdGEgPSBudWxsO1xuICAgICAgaWYgKF9ib2d1c1NlbGVjdGlvbikge1xuICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICB9XG4gICAgICBfYm9ndXNTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29weVwiLCBmdW5jdGlvbihlKSB7XG4gICAgICBpZiAoX2ludGVyY2VwdCkge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gX2RhdGEpIHtcbiAgICAgICAgICBlLmNsaXBib2FyZERhdGEuc2V0RGF0YShrZXksIF9kYXRhW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFdvcmthcm91bmQgZm9yIFNhZmFyaTogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjUyOVxuICAgIGZ1bmN0aW9uIGJvZ3VzU2VsZWN0KCkge1xuICAgICAgdmFyIHNlbCA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuICAgICAgLy8gSWYgXCJub3RoaW5nXCIgaXMgc2VsZWN0ZWQuLi5cbiAgICAgIGlmICghZG9jdW1lbnQucXVlcnlDb21tYW5kRW5hYmxlZChcImNvcHlcIikgJiYgc2VsLmlzQ29sbGFwc2VkKSB7XG4gICAgICAgIC8vIC4uLiB0ZW1wb3JhcmlseSBzZWxlY3QgdGhlIGVudGlyZSBib2R5LlxuICAgICAgICAvL1xuICAgICAgICAvLyBXZSBzZWxlY3QgdGhlIGVudGlyZSBib2R5IGJlY2F1c2U6XG4gICAgICAgIC8vIC0gaXQncyBndWFyYW50ZWVkIHRvIGV4aXN0LFxuICAgICAgICAvLyAtIGl0IHdvcmtzICh1bmxpa2UsIHNheSwgZG9jdW1lbnQuaGVhZCwgb3IgcGhhbnRvbSBlbGVtZW50IHRoYXQgaXNcbiAgICAgICAgLy8gICBub3QgaW5zZXJ0ZWQgaW50byB0aGUgRE9NKSxcbiAgICAgICAgLy8gLSBpdCBkb2Vzbid0IHNlZW0gdG8gZmxpY2tlciAoZHVlIHRvIHRoZSBzeW5jaHJvbm91cyBjb3B5IGV2ZW50KSwgYW5kXG4gICAgICAgIC8vIC0gaXQgYXZvaWRzIG1vZGlmeWluZyB0aGUgRE9NIChjYW4gdHJpZ2dlciBtdXRhdGlvbiBvYnNlcnZlcnMpLlxuICAgICAgICAvL1xuICAgICAgICAvLyBCZWNhdXNlIHdlIGNhbid0IGRvIHByb3BlciBmZWF0dXJlIGRldGVjdGlvbiAod2UgYWxyZWFkeSBjaGVja2VkXG4gICAgICAgIC8vIGRvY3VtZW50LnF1ZXJ5Q29tbWFuZEVuYWJsZWQoXCJjb3B5XCIpICwgd2hpY2ggYWN0dWFsbHkgZ2l2ZXMgYSBmYWxzZVxuICAgICAgICAvLyBuZWdhdGl2ZSBmb3IgQmxpbmsgd2hlbiBub3RoaW5nIGlzIHNlbGVjdGVkKSBhbmQgVUEgc25pZmZpbmcgaXMgbm90XG4gICAgICAgIC8vIHJlbGlhYmxlIChhIGxvdCBvZiBVQSBzdHJpbmdzIGNvbnRhaW4gXCJTYWZhcmlcIiksIHRoaXMgd2lsbCBhbHNvXG4gICAgICAgIC8vIGhhcHBlbiBmb3Igc29tZSBicm93c2VycyBvdGhlciB0aGFuIFNhZmFyaS4gOi0oKVxuICAgICAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZG9jdW1lbnQuYm9keSk7XG4gICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgIF9ib2d1c1NlbGVjdGlvbiA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIF9pbnRlcmNlcHQgPSB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBfZGF0YSA9IHtcInRleHQvcGxhaW5cIjogZGF0YX07XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIE5vZGUpIHtcbiAgICAgICAgICBfZGF0YSA9IHtcInRleHQvaHRtbFwiOiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKGRhdGEpfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfZGF0YSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBib2d1c1NlbGVjdCgpO1xuICAgICAgICAgIGlmIChkb2N1bWVudC5leGVjQ29tbWFuZChcImNvcHlcIikpIHtcbiAgICAgICAgICAgIC8vIGRvY3VtZW50LmV4ZWNDb21tYW5kIGlzIHN5bmNocm9ub3VzOiBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDE1L1dELWNsaXBib2FyZC1hcGlzLTIwMTUwNDIxLyNpbnRlZ3JhdGlvbi13aXRoLXJpY2gtdGV4dC1lZGl0aW5nLWFwaXNcbiAgICAgICAgICAgIC8vIFNvIHdlIGNhbiBjYWxsIHJlc29sdmUoKSBiYWNrIGhlcmUuXG4gICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGNvcHkuIFBlcmhhcHMgaXQncyBub3QgYXZhaWxhYmxlIGluIHlvdXIgYnJvd3Nlcj9cIik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgfSkoKTtcblxuICBjbGlwYm9hcmQucGFzdGUgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIF9pbnRlcmNlcHQgPSBmYWxzZTtcbiAgICB2YXIgX3Jlc29sdmU7XG4gICAgdmFyIF9kYXRhVHlwZTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJwYXN0ZVwiLCBmdW5jdGlvbihlKSB7XG4gICAgICBpZiAoX2ludGVyY2VwdCkge1xuICAgICAgICBfaW50ZXJjZXB0ID0gZmFsc2U7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdmFyIHJlc29sdmUgPSBfcmVzb2x2ZTtcbiAgICAgICAgX3Jlc29sdmUgPSBudWxsO1xuICAgICAgICByZXNvbHZlKGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKF9kYXRhVHlwZSkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGRhdGFUeXBlKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIF9pbnRlcmNlcHQgPSB0cnVlO1xuICAgICAgICBfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIF9kYXRhVHlwZSA9IGRhdGFUeXBlIHx8IFwidGV4dC9wbGFpblwiO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJwYXN0ZVwiKSkge1xuICAgICAgICAgICAgX2ludGVyY2VwdCA9IGZhbHNlO1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlVuYWJsZSB0byBwYXN0ZS4gUGFzdGluZyBvbmx5IHdvcmtzIGluIEludGVybmV0IEV4cGxvcmVyIGF0IHRoZSBtb21lbnQuXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBfaW50ZXJjZXB0ID0gZmFsc2U7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihlKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgLy8gSGFuZGxlIElFIGJlaGF2aW91ci5cbiAgaWYgKHR5cGVvZiBDbGlwYm9hcmRFdmVudCA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgdHlwZW9mIHdpbmRvdy5jbGlwYm9hcmREYXRhICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICB0eXBlb2Ygd2luZG93LmNsaXBib2FyZERhdGEuc2V0RGF0YSAhPT0gXCJ1bmRlZmluZWRcIikge1xuXG4gICAgLyohIHByb21pc2UtcG9seWZpbGwgMi4wLjEgKi9cbiAgICAoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3JldHVybiBmdW5jdGlvbigpe2EuYXBwbHkoYixhcmd1bWVudHMpfX1mdW5jdGlvbiBjKGEpe2lmKFwib2JqZWN0XCIhPXR5cGVvZiB0aGlzKXRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm9taXNlcyBtdXN0IGJlIGNvbnN0cnVjdGVkIHZpYSBuZXdcIik7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgYSl0aHJvdyBuZXcgVHlwZUVycm9yKFwibm90IGEgZnVuY3Rpb25cIik7dGhpcy5fc3RhdGU9bnVsbCx0aGlzLl92YWx1ZT1udWxsLHRoaXMuX2RlZmVycmVkcz1bXSxpKGEsYihlLHRoaXMpLGIoZix0aGlzKSl9ZnVuY3Rpb24gZChhKXt2YXIgYj10aGlzO3JldHVybiBudWxsPT09dGhpcy5fc3RhdGU/dm9pZCB0aGlzLl9kZWZlcnJlZHMucHVzaChhKTp2b2lkIGooZnVuY3Rpb24oKXt2YXIgYz1iLl9zdGF0ZT9hLm9uRnVsZmlsbGVkOmEub25SZWplY3RlZDtpZihudWxsPT09YylyZXR1cm4gdm9pZChiLl9zdGF0ZT9hLnJlc29sdmU6YS5yZWplY3QpKGIuX3ZhbHVlKTt2YXIgZDt0cnl7ZD1jKGIuX3ZhbHVlKX1jYXRjaChlKXtyZXR1cm4gdm9pZCBhLnJlamVjdChlKX1hLnJlc29sdmUoZCl9KX1mdW5jdGlvbiBlKGEpe3RyeXtpZihhPT09dGhpcyl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQSBwcm9taXNlIGNhbm5vdCBiZSByZXNvbHZlZCB3aXRoIGl0c2VsZi5cIik7aWYoYSYmKFwib2JqZWN0XCI9PXR5cGVvZiBhfHxcImZ1bmN0aW9uXCI9PXR5cGVvZiBhKSl7dmFyIGM9YS50aGVuO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGMpcmV0dXJuIHZvaWQgaShiKGMsYSksYihlLHRoaXMpLGIoZix0aGlzKSl9dGhpcy5fc3RhdGU9ITAsdGhpcy5fdmFsdWU9YSxnLmNhbGwodGhpcyl9Y2F0Y2goZCl7Zi5jYWxsKHRoaXMsZCl9fWZ1bmN0aW9uIGYoYSl7dGhpcy5fc3RhdGU9ITEsdGhpcy5fdmFsdWU9YSxnLmNhbGwodGhpcyl9ZnVuY3Rpb24gZygpe2Zvcih2YXIgYT0wLGI9dGhpcy5fZGVmZXJyZWRzLmxlbmd0aDtiPmE7YSsrKWQuY2FsbCh0aGlzLHRoaXMuX2RlZmVycmVkc1thXSk7dGhpcy5fZGVmZXJyZWRzPW51bGx9ZnVuY3Rpb24gaChhLGIsYyxkKXt0aGlzLm9uRnVsZmlsbGVkPVwiZnVuY3Rpb25cIj09dHlwZW9mIGE/YTpudWxsLHRoaXMub25SZWplY3RlZD1cImZ1bmN0aW9uXCI9PXR5cGVvZiBiP2I6bnVsbCx0aGlzLnJlc29sdmU9Yyx0aGlzLnJlamVjdD1kfWZ1bmN0aW9uIGkoYSxiLGMpe3ZhciBkPSExO3RyeXthKGZ1bmN0aW9uKGEpe2R8fChkPSEwLGIoYSkpfSxmdW5jdGlvbihhKXtkfHwoZD0hMCxjKGEpKX0pfWNhdGNoKGUpe2lmKGQpcmV0dXJuO2Q9ITAsYyhlKX19dmFyIGo9Yy5pbW1lZGlhdGVGbnx8XCJmdW5jdGlvblwiPT10eXBlb2Ygc2V0SW1tZWRpYXRlJiZzZXRJbW1lZGlhdGV8fGZ1bmN0aW9uKGEpe3NldFRpbWVvdXQoYSwxKX0saz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm5cIltvYmplY3QgQXJyYXldXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSl9O2MucHJvdG90eXBlW1wiY2F0Y2hcIl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudGhlbihudWxsLGEpfSxjLnByb3RvdHlwZS50aGVuPWZ1bmN0aW9uKGEsYil7dmFyIGU9dGhpcztyZXR1cm4gbmV3IGMoZnVuY3Rpb24oYyxmKXtkLmNhbGwoZSxuZXcgaChhLGIsYyxmKSl9KX0sYy5hbGw9ZnVuY3Rpb24oKXt2YXIgYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCgxPT09YXJndW1lbnRzLmxlbmd0aCYmayhhcmd1bWVudHNbMF0pP2FyZ3VtZW50c1swXTphcmd1bWVudHMpO3JldHVybiBuZXcgYyhmdW5jdGlvbihiLGMpe2Z1bmN0aW9uIGQoZixnKXt0cnl7aWYoZyYmKFwib2JqZWN0XCI9PXR5cGVvZiBnfHxcImZ1bmN0aW9uXCI9PXR5cGVvZiBnKSl7dmFyIGg9Zy50aGVuO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGgpcmV0dXJuIHZvaWQgaC5jYWxsKGcsZnVuY3Rpb24oYSl7ZChmLGEpfSxjKX1hW2ZdPWcsMD09PS0tZSYmYihhKX1jYXRjaChpKXtjKGkpfX1pZigwPT09YS5sZW5ndGgpcmV0dXJuIGIoW10pO2Zvcih2YXIgZT1hLmxlbmd0aCxmPTA7ZjxhLmxlbmd0aDtmKyspZChmLGFbZl0pfSl9LGMucmVzb2x2ZT1mdW5jdGlvbihhKXtyZXR1cm4gYSYmXCJvYmplY3RcIj09dHlwZW9mIGEmJmEuY29uc3RydWN0b3I9PT1jP2E6bmV3IGMoZnVuY3Rpb24oYil7YihhKX0pfSxjLnJlamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IGMoZnVuY3Rpb24oYixjKXtjKGEpfSl9LGMucmFjZT1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IGMoZnVuY3Rpb24oYixjKXtmb3IodmFyIGQ9MCxlPWEubGVuZ3RoO2U+ZDtkKyspYVtkXS50aGVuKGIsYyl9KX0sXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YzphLlByb21pc2V8fChhLlByb21pc2U9Yyl9KSh0aGlzKTtcblxuICAgIGNsaXBib2FyZC5jb3B5ID0gZnVuY3Rpb24oZGF0YSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAvLyBJRSBzdXBwb3J0cyBzdHJpbmcgYW5kIFVSTCB0eXBlczogaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczUzNjc0NCh2PXZzLjg1KS5hc3B4XG4gICAgICAgIC8vIFdlIG9ubHkgc3VwcG9ydCB0aGUgc3RyaW5nIHR5cGUgZm9yIG5vdy5cbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICYmICEoXCJ0ZXh0L3BsYWluXCIgaW4gZGF0YSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgbXVzdCBwcm92aWRlIGEgdGV4dC9wbGFpbiB0eXBlLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzdHJEYXRhID0gKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiID8gZGF0YSA6IGRhdGFbXCJ0ZXh0L3BsYWluXCJdKTtcbiAgICAgICAgdmFyIGNvcHlTdWNjZWVkZWQgPSB3aW5kb3cuY2xpcGJvYXJkRGF0YS5zZXREYXRhKFwiVGV4dFwiLCBzdHJEYXRhKTtcbiAgICAgICAgaWYgKGNvcHlTdWNjZWVkZWQpIHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIkNvcHlpbmcgd2FzIHJlamVjdGVkLlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjbGlwYm9hcmQucGFzdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIHN0ckRhdGEgPSB3aW5kb3cuY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwiVGV4dFwiKTtcbiAgICAgICAgaWYgKHN0ckRhdGEpIHtcbiAgICAgICAgICByZXNvbHZlKHN0ckRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZSB1c2VyIHJlamVjdGVkIHRoZSBwYXN0ZSByZXF1ZXN0LlxuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJQYXN0aW5nIHdhcyByZWplY3RlZC5cIikpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGNsaXBib2FyZDtcbn0pKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jbGlwYm9hcmQtanMvY2xpcGJvYXJkLmpzXG4vLyBtb2R1bGUgaWQgPSAzNjNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 364 */
/***/ function(module, exports, __webpack_require__) {

    eval("var apply = Function.prototype.apply;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n  return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n  return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) {\n  if (timeout) {\n    timeout.close();\n  }\n};\n\nfunction Timeout(id, clearFn) {\n  this._id = id;\n  this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n  this._clearFn.call(window, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n  clearTimeout(item._idleTimeoutId);\n  item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n  clearTimeout(item._idleTimeoutId);\n  item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n  clearTimeout(item._idleTimeoutId);\n\n  var msecs = item._idleTimeout;\n  if (msecs >= 0) {\n    item._idleTimeoutId = setTimeout(function onTimeout() {\n      if (item._onTimeout)\n        item._onTimeout();\n    }, msecs);\n  }\n};\n\n// setimmediate attaches itself to the global object\n__webpack_require__(365);\nexports.setImmediate = setImmediate;\nexports.clearImmediate = clearImmediate;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzY0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy90aW1lcnMtYnJvd3NlcmlmeS9tYWluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcblxuLy8gRE9NIEFQSXMsIGZvciBjb21wbGV0ZW5lc3NcblxuZXhwb3J0cy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldFRpbWVvdXQsIHdpbmRvdywgYXJndW1lbnRzKSwgY2xlYXJUaW1lb3V0KTtcbn07XG5leHBvcnRzLnNldEludGVydmFsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldEludGVydmFsLCB3aW5kb3csIGFyZ3VtZW50cyksIGNsZWFySW50ZXJ2YWwpO1xufTtcbmV4cG9ydHMuY2xlYXJUaW1lb3V0ID1cbmV4cG9ydHMuY2xlYXJJbnRlcnZhbCA9IGZ1bmN0aW9uKHRpbWVvdXQpIHtcbiAgaWYgKHRpbWVvdXQpIHtcbiAgICB0aW1lb3V0LmNsb3NlKCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIFRpbWVvdXQoaWQsIGNsZWFyRm4pIHtcbiAgdGhpcy5faWQgPSBpZDtcbiAgdGhpcy5fY2xlYXJGbiA9IGNsZWFyRm47XG59XG5UaW1lb3V0LnByb3RvdHlwZS51bnJlZiA9IFRpbWVvdXQucHJvdG90eXBlLnJlZiA9IGZ1bmN0aW9uKCkge307XG5UaW1lb3V0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9jbGVhckZuLmNhbGwod2luZG93LCB0aGlzLl9pZCk7XG59O1xuXG4vLyBEb2VzIG5vdCBzdGFydCB0aGUgdGltZSwganVzdCBzZXRzIHVwIHRoZSBtZW1iZXJzIG5lZWRlZC5cbmV4cG9ydHMuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSwgbXNlY3MpIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IG1zZWNzO1xufTtcblxuZXhwb3J0cy51bmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IC0xO1xufTtcblxuZXhwb3J0cy5fdW5yZWZBY3RpdmUgPSBleHBvcnRzLmFjdGl2ZSA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuXG4gIHZhciBtc2VjcyA9IGl0ZW0uX2lkbGVUaW1lb3V0O1xuICBpZiAobXNlY3MgPj0gMCkge1xuICAgIGl0ZW0uX2lkbGVUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgIGlmIChpdGVtLl9vblRpbWVvdXQpXG4gICAgICAgIGl0ZW0uX29uVGltZW91dCgpO1xuICAgIH0sIG1zZWNzKTtcbiAgfVxufTtcblxuLy8gc2V0aW1tZWRpYXRlIGF0dGFjaGVzIGl0c2VsZiB0byB0aGUgZ2xvYmFsIG9iamVjdFxucmVxdWlyZShcInNldGltbWVkaWF0ZVwiKTtcbmV4cG9ydHMuc2V0SW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlO1xuZXhwb3J0cy5jbGVhckltbWVkaWF0ZSA9IGNsZWFySW1tZWRpYXRlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3RpbWVycy1icm93c2VyaWZ5L21haW4uanNcbi8vIG1vZHVsZSBpZCA9IDM2NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 365 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {\n    \"use strict\";\n\n    if (global.setImmediate) {\n        return;\n    }\n\n    var nextHandle = 1; // Spec says greater than zero\n    var tasksByHandle = {};\n    var currentlyRunningATask = false;\n    var doc = global.document;\n    var registerImmediate;\n\n    function setImmediate(callback) {\n      // Callback can either be a function or a string\n      if (typeof callback !== \"function\") {\n        callback = new Function(\"\" + callback);\n      }\n      // Copy function arguments\n      var args = new Array(arguments.length - 1);\n      for (var i = 0; i < args.length; i++) {\n          args[i] = arguments[i + 1];\n      }\n      // Store and register the task\n      var task = { callback: callback, args: args };\n      tasksByHandle[nextHandle] = task;\n      registerImmediate(nextHandle);\n      return nextHandle++;\n    }\n\n    function clearImmediate(handle) {\n        delete tasksByHandle[handle];\n    }\n\n    function run(task) {\n        var callback = task.callback;\n        var args = task.args;\n        switch (args.length) {\n        case 0:\n            callback();\n            break;\n        case 1:\n            callback(args[0]);\n            break;\n        case 2:\n            callback(args[0], args[1]);\n            break;\n        case 3:\n            callback(args[0], args[1], args[2]);\n            break;\n        default:\n            callback.apply(undefined, args);\n            break;\n        }\n    }\n\n    function runIfPresent(handle) {\n        // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n        // So if we're currently running a task, we'll need to delay this invocation.\n        if (currentlyRunningATask) {\n            // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n            // \"too much recursion\" error.\n            setTimeout(runIfPresent, 0, handle);\n        } else {\n            var task = tasksByHandle[handle];\n            if (task) {\n                currentlyRunningATask = true;\n                try {\n                    run(task);\n                } finally {\n                    clearImmediate(handle);\n                    currentlyRunningATask = false;\n                }\n            }\n        }\n    }\n\n    function installNextTickImplementation() {\n        registerImmediate = function(handle) {\n            process.nextTick(function () { runIfPresent(handle); });\n        };\n    }\n\n    function canUsePostMessage() {\n        // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n        // where `global.postMessage` means something completely different and can't be used for this purpose.\n        if (global.postMessage && !global.importScripts) {\n            var postMessageIsAsynchronous = true;\n            var oldOnMessage = global.onmessage;\n            global.onmessage = function() {\n                postMessageIsAsynchronous = false;\n            };\n            global.postMessage(\"\", \"*\");\n            global.onmessage = oldOnMessage;\n            return postMessageIsAsynchronous;\n        }\n    }\n\n    function installPostMessageImplementation() {\n        // Installs an event handler on `global` for the `message` event: see\n        // * https://developer.mozilla.org/en/DOM/window.postMessage\n        // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n\n        var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n        var onGlobalMessage = function(event) {\n            if (event.source === global &&\n                typeof event.data === \"string\" &&\n                event.data.indexOf(messagePrefix) === 0) {\n                runIfPresent(+event.data.slice(messagePrefix.length));\n            }\n        };\n\n        if (global.addEventListener) {\n            global.addEventListener(\"message\", onGlobalMessage, false);\n        } else {\n            global.attachEvent(\"onmessage\", onGlobalMessage);\n        }\n\n        registerImmediate = function(handle) {\n            global.postMessage(messagePrefix + handle, \"*\");\n        };\n    }\n\n    function installMessageChannelImplementation() {\n        var channel = new MessageChannel();\n        channel.port1.onmessage = function(event) {\n            var handle = event.data;\n            runIfPresent(handle);\n        };\n\n        registerImmediate = function(handle) {\n            channel.port2.postMessage(handle);\n        };\n    }\n\n    function installReadyStateChangeImplementation() {\n        var html = doc.documentElement;\n        registerImmediate = function(handle) {\n            // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted\n            // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n            var script = doc.createElement(\"script\");\n            script.onreadystatechange = function () {\n                runIfPresent(handle);\n                script.onreadystatechange = null;\n                html.removeChild(script);\n                script = null;\n            };\n            html.appendChild(script);\n        };\n    }\n\n    function installSetTimeoutImplementation() {\n        registerImmediate = function(handle) {\n            setTimeout(runIfPresent, 0, handle);\n        };\n    }\n\n    // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.\n    var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);\n    attachTo = attachTo && attachTo.setTimeout ? attachTo : global;\n\n    // Don't get fooled by e.g. browserify environments.\n    if ({}.toString.call(global.process) === \"[object process]\") {\n        // For Node.js before 0.9\n        installNextTickImplementation();\n\n    } else if (canUsePostMessage()) {\n        // For non-IE10 modern browsers\n        installPostMessageImplementation();\n\n    } else if (global.MessageChannel) {\n        // For web workers, where supported\n        installMessageChannelImplementation();\n\n    } else if (doc && \"onreadystatechange\" in doc.createElement(\"script\")) {\n        // For IE 6–8\n        installReadyStateChangeImplementation();\n\n    } else {\n        // For older browsers\n        installSetTimeoutImplementation();\n    }\n\n    attachTo.setImmediate = setImmediate;\n    attachTo.clearImmediate = clearImmediate;\n}(typeof self === \"undefined\" ? typeof global === \"undefined\" ? this : global : self));\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(200)))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzY1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zZXRpbW1lZGlhdGUvc2V0SW1tZWRpYXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiAoZ2xvYmFsLCB1bmRlZmluZWQpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIGlmIChnbG9iYWwuc2V0SW1tZWRpYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbmV4dEhhbmRsZSA9IDE7IC8vIFNwZWMgc2F5cyBncmVhdGVyIHRoYW4gemVyb1xuICAgIHZhciB0YXNrc0J5SGFuZGxlID0ge307XG4gICAgdmFyIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IGZhbHNlO1xuICAgIHZhciBkb2MgPSBnbG9iYWwuZG9jdW1lbnQ7XG4gICAgdmFyIHJlZ2lzdGVySW1tZWRpYXRlO1xuXG4gICAgZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGNhbGxiYWNrKSB7XG4gICAgICAvLyBDYWxsYmFjayBjYW4gZWl0aGVyIGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmdcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjYWxsYmFjayA9IG5ldyBGdW5jdGlvbihcIlwiICsgY2FsbGJhY2spO1xuICAgICAgfVxuICAgICAgLy8gQ29weSBmdW5jdGlvbiBhcmd1bWVudHNcbiAgICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDFdO1xuICAgICAgfVxuICAgICAgLy8gU3RvcmUgYW5kIHJlZ2lzdGVyIHRoZSB0YXNrXG4gICAgICB2YXIgdGFzayA9IHsgY2FsbGJhY2s6IGNhbGxiYWNrLCBhcmdzOiBhcmdzIH07XG4gICAgICB0YXNrc0J5SGFuZGxlW25leHRIYW5kbGVdID0gdGFzaztcbiAgICAgIHJlZ2lzdGVySW1tZWRpYXRlKG5leHRIYW5kbGUpO1xuICAgICAgcmV0dXJuIG5leHRIYW5kbGUrKztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShoYW5kbGUpIHtcbiAgICAgICAgZGVsZXRlIHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW4odGFzaykge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSB0YXNrLmNhbGxiYWNrO1xuICAgICAgICB2YXIgYXJncyA9IHRhc2suYXJncztcbiAgICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjYWxsYmFjay5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW5JZlByZXNlbnQoaGFuZGxlKSB7XG4gICAgICAgIC8vIEZyb20gdGhlIHNwZWM6IFwiV2FpdCB1bnRpbCBhbnkgaW52b2NhdGlvbnMgb2YgdGhpcyBhbGdvcml0aG0gc3RhcnRlZCBiZWZvcmUgdGhpcyBvbmUgaGF2ZSBjb21wbGV0ZWQuXCJcbiAgICAgICAgLy8gU28gaWYgd2UncmUgY3VycmVudGx5IHJ1bm5pbmcgYSB0YXNrLCB3ZSdsbCBuZWVkIHRvIGRlbGF5IHRoaXMgaW52b2NhdGlvbi5cbiAgICAgICAgaWYgKGN1cnJlbnRseVJ1bm5pbmdBVGFzaykge1xuICAgICAgICAgICAgLy8gRGVsYXkgYnkgZG9pbmcgYSBzZXRUaW1lb3V0LiBzZXRJbW1lZGlhdGUgd2FzIHRyaWVkIGluc3RlYWQsIGJ1dCBpbiBGaXJlZm94IDcgaXQgZ2VuZXJhdGVkIGFcbiAgICAgICAgICAgIC8vIFwidG9vIG11Y2ggcmVjdXJzaW9uXCIgZXJyb3IuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB0YXNrID0gdGFza3NCeUhhbmRsZVtoYW5kbGVdO1xuICAgICAgICAgICAgaWYgKHRhc2spIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bih0YXNrKTtcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckltbWVkaWF0ZShoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkgeyBydW5JZlByZXNlbnQoaGFuZGxlKTsgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FuVXNlUG9zdE1lc3NhZ2UoKSB7XG4gICAgICAgIC8vIFRoZSB0ZXN0IGFnYWluc3QgYGltcG9ydFNjcmlwdHNgIHByZXZlbnRzIHRoaXMgaW1wbGVtZW50YXRpb24gZnJvbSBiZWluZyBpbnN0YWxsZWQgaW5zaWRlIGEgd2ViIHdvcmtlcixcbiAgICAgICAgLy8gd2hlcmUgYGdsb2JhbC5wb3N0TWVzc2FnZWAgbWVhbnMgc29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50IGFuZCBjYW4ndCBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UuXG4gICAgICAgIGlmIChnbG9iYWwucG9zdE1lc3NhZ2UgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzKSB7XG4gICAgICAgICAgICB2YXIgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IHRydWU7XG4gICAgICAgICAgICB2YXIgb2xkT25NZXNzYWdlID0gZ2xvYmFsLm9ubWVzc2FnZTtcbiAgICAgICAgICAgIGdsb2JhbC5vbm1lc3NhZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzID0gZmFsc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKFwiXCIsIFwiKlwiKTtcbiAgICAgICAgICAgIGdsb2JhbC5vbm1lc3NhZ2UgPSBvbGRPbk1lc3NhZ2U7XG4gICAgICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICAvLyBJbnN0YWxscyBhbiBldmVudCBoYW5kbGVyIG9uIGBnbG9iYWxgIGZvciB0aGUgYG1lc3NhZ2VgIGV2ZW50OiBzZWVcbiAgICAgICAgLy8gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9ET00vd2luZG93LnBvc3RNZXNzYWdlXG4gICAgICAgIC8vICogaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvY29tbXMuaHRtbCNjcm9zc0RvY3VtZW50TWVzc2FnZXNcblxuICAgICAgICB2YXIgbWVzc2FnZVByZWZpeCA9IFwic2V0SW1tZWRpYXRlJFwiICsgTWF0aC5yYW5kb20oKSArIFwiJFwiO1xuICAgICAgICB2YXIgb25HbG9iYWxNZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgPT09IGdsb2JhbCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudC5kYXRhID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgZXZlbnQuZGF0YS5pbmRleE9mKG1lc3NhZ2VQcmVmaXgpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KCtldmVudC5kYXRhLnNsaWNlKG1lc3NhZ2VQcmVmaXgubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgb25HbG9iYWxNZXNzYWdlLCBmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbG9iYWwuYXR0YWNoRXZlbnQoXCJvbm1lc3NhZ2VcIiwgb25HbG9iYWxNZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBnbG9iYWwucG9zdE1lc3NhZ2UobWVzc2FnZVByZWZpeCArIGhhbmRsZSwgXCIqXCIpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxNZXNzYWdlQ2hhbm5lbEltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIHJ1bklmUHJlc2VudChoYW5kbGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKGhhbmRsZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGh0bWwgPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgPHNjcmlwdD4gZWxlbWVudDsgaXRzIHJlYWR5c3RhdGVjaGFuZ2UgZXZlbnQgd2lsbCBiZSBmaXJlZCBhc3luY2hyb25vdXNseSBvbmNlIGl0IGlzIGluc2VydGVkXG4gICAgICAgICAgICAvLyBpbnRvIHRoZSBkb2N1bWVudC4gRG8gc28sIHRodXMgcXVldWluZyB1cCB0aGUgdGFzay4gUmVtZW1iZXIgdG8gY2xlYW4gdXAgb25jZSBpdCdzIGJlZW4gY2FsbGVkLlxuICAgICAgICAgICAgdmFyIHNjcmlwdCA9IGRvYy5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICAgICAgc2NyaXB0ID0gbnVsbDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBodG1sLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFNldFRpbWVvdXRJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQocnVuSWZQcmVzZW50LCAwLCBoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIElmIHN1cHBvcnRlZCwgd2Ugc2hvdWxkIGF0dGFjaCB0byB0aGUgcHJvdG90eXBlIG9mIGdsb2JhbCwgc2luY2UgdGhhdCBpcyB3aGVyZSBzZXRUaW1lb3V0IGV0IGFsLiBsaXZlLlxuICAgIHZhciBhdHRhY2hUbyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZ2xvYmFsKTtcbiAgICBhdHRhY2hUbyA9IGF0dGFjaFRvICYmIGF0dGFjaFRvLnNldFRpbWVvdXQgPyBhdHRhY2hUbyA6IGdsb2JhbDtcblxuICAgIC8vIERvbid0IGdldCBmb29sZWQgYnkgZS5nLiBicm93c2VyaWZ5IGVudmlyb25tZW50cy5cbiAgICBpZiAoe30udG9TdHJpbmcuY2FsbChnbG9iYWwucHJvY2VzcykgPT09IFwiW29iamVjdCBwcm9jZXNzXVwiKSB7XG4gICAgICAgIC8vIEZvciBOb2RlLmpzIGJlZm9yZSAwLjlcbiAgICAgICAgaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoY2FuVXNlUG9zdE1lc3NhZ2UoKSkge1xuICAgICAgICAvLyBGb3Igbm9uLUlFMTAgbW9kZXJuIGJyb3dzZXJzXG4gICAgICAgIGluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGdsb2JhbC5NZXNzYWdlQ2hhbm5lbCkge1xuICAgICAgICAvLyBGb3Igd2ViIHdvcmtlcnMsIHdoZXJlIHN1cHBvcnRlZFxuICAgICAgICBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChkb2MgJiYgXCJvbnJlYWR5c3RhdGVjaGFuZ2VcIiBpbiBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKSkge1xuICAgICAgICAvLyBGb3IgSUUgNuKAkzhcbiAgICAgICAgaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRm9yIG9sZGVyIGJyb3dzZXJzXG4gICAgICAgIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKTtcbiAgICB9XG5cbiAgICBhdHRhY2hUby5zZXRJbW1lZGlhdGUgPSBzZXRJbW1lZGlhdGU7XG4gICAgYXR0YWNoVG8uY2xlYXJJbW1lZGlhdGUgPSBjbGVhckltbWVkaWF0ZTtcbn0odHlwZW9mIHNlbGYgPT09IFwidW5kZWZpbmVkXCIgPyB0eXBlb2YgZ2xvYmFsID09PSBcInVuZGVmaW5lZFwiID8gdGhpcyA6IGdsb2JhbCA6IHNlbGYpKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9zZXRpbW1lZGlhdGUvc2V0SW1tZWRpYXRlLmpzXG4vLyBtb2R1bGUgaWQgPSAzNjVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 366 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _Router = __webpack_require__(367);var _Router2 = _interopRequireDefault(_Router);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} /* global $, Hogan, Bloodhound, CanvasLoader */\n\nvar Search = {\n  locked: false,\n  isOpen: false,\n  limitTopicsToMe: false,\n  limitMapsToMe: false,\n  changing: false,\n  optionsInitialized: false,\n  init: function init(serverData) {\n    var self = Search;\n\n    self.wildcardIconUrl = serverData['icons/wildcard.png'];\n    self.userIconUrl = serverData['user.png'];\n\n    // this is similar to Metamaps.Loading, but it's for the search element\n    var loader = new CanvasLoader('searchLoading');\n    loader.setColor('#4fb5c0'); // default is '#000000'\n    loader.setDiameter(24); // default is 40\n    loader.setDensity(41); // default is 40\n    loader.setRange(0.9); // default is 1.3\n    loader.show(); // Hidden by default\n\n    $('.sidebarSearchIcon').click(function (e) {\n      $('.sidebarSearchField').focus();\n    });\n    $('.sidebarSearch').click(function (e) {\n      e.stopPropagation();\n    });\n\n    self.startTypeahead();\n  },\n  focus: function focus() {\n    $('.sidebarSearchField').focus();\n  },\n  startTypeahead: function startTypeahead() {\n    var self = Search;\n\n    var mapheader = _Active2.default.Mapper ? '<div class=\"searchMapsHeader searchHeader\"><h3 class=\"search-heading\">Maps</h3><input type=\"checkbox\" class=\"limitToMe\" id=\"limitMapsToMe\"></input><label for=\"limitMapsToMe\" class=\"limitToMeLabel\">added by me</label><div class=\"minimizeResults minimizeMapResults\"></div><div class=\"clearfloat\"></div></div>' : '<div class=\"searchMapsHeader searchHeader\"><h3 class=\"search-heading\">Maps</h3><div class=\"minimizeResults minimizeMapResults\"></div><div class=\"clearfloat\"></div></div>';\n    var topicheader = _Active2.default.Mapper ? '<div class=\"searchTopicsHeader searchHeader\"><h3 class=\"search-heading\">Topics</h3><input type=\"checkbox\" class=\"limitToMe\" id=\"limitTopicsToMe\"></input><label for=\"limitTopicsToMe\" class=\"limitToMeLabel\">added by me</label><div class=\"minimizeResults minimizeTopicResults\"></div><div class=\"clearfloat\"></div></div>' : '<div class=\"searchTopicsHeader searchHeader\"><h3 class=\"search-heading\">Topics</h3><div class=\"minimizeResults minimizeTopicResults\"></div><div class=\"clearfloat\"></div></div>';\n    var mapperheader = '<div class=\"searchMappersHeader searchHeader\"><h3 class=\"search-heading\">Mappers</h3><div class=\"minimizeResults minimizeMapperResults\"></div><div class=\"clearfloat\"></div></div>';\n\n    var topics = {\n      name: 'topics',\n      limit: 9999,\n\n      display: function display(s) {return s.label;},\n      templates: {\n        notFound: function notFound(s) {\n          return Hogan.compile(topicheader + $('#topicSearchTemplate').html()).render({\n            value: 'No results',\n            label: 'No results',\n            typeImageURL: self.wildcardIconUrl,\n            rtype: 'noresult' });\n\n        },\n        header: topicheader,\n        suggestion: function suggestion(s) {\n          return Hogan.compile($('#topicSearchTemplate').html()).render(s);\n        } },\n\n      source: new Bloodhound({\n        datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),\n        queryTokenizer: Bloodhound.tokenizers.whitespace,\n        remote: {\n          url: '/search/topics',\n          prepare: function prepare(query, settings) {\n            settings.url += '?term=' + query;\n            if (_Active2.default.Mapper && self.limitTopicsToMe) {\n              settings.url += '&user=' + _Active2.default.Mapper.id.toString();\n            }\n            return settings;\n          } } }) };\n\n\n\n\n    var maps = {\n      name: 'maps',\n      limit: 9999,\n      display: function display(s) {return s.label;},\n      templates: {\n        notFound: function notFound(s) {\n          return Hogan.compile(mapheader + $('#mapSearchTemplate').html()).render({\n            value: 'No results',\n            label: 'No results',\n            rtype: 'noresult' });\n\n        },\n        header: mapheader,\n        suggestion: function suggestion(s) {\n          return Hogan.compile($('#mapSearchTemplate').html()).render(s);\n        } },\n\n      source: new Bloodhound({\n        datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),\n        queryTokenizer: Bloodhound.tokenizers.whitespace,\n        remote: {\n          url: '/search/maps',\n          prepare: function prepare(query, settings) {\n            settings.url += '?term=' + query;\n            if (_Active2.default.Mapper && self.limitMapsToMe) {\n              settings.url += '&user=' + _Active2.default.Mapper.id.toString();\n            }\n            return settings;\n          } } }) };\n\n\n\n\n    var mappers = {\n      name: 'mappers',\n      limit: 9999,\n      display: function display(s) {return s.label;},\n      templates: {\n        notFound: function notFound(s) {\n          return Hogan.compile(mapperheader + $('#mapperSearchTemplate').html()).render({\n            value: 'No results',\n            label: 'No results',\n            rtype: 'noresult',\n            profile: self.userIconUrl });\n\n        },\n        header: mapperheader,\n        suggestion: function suggestion(s) {\n          return Hogan.compile($('#mapperSearchTemplate').html()).render(s);\n        } },\n\n      source: new Bloodhound({\n        datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),\n        queryTokenizer: Bloodhound.tokenizers.whitespace,\n        remote: {\n          url: '/search/mappers?term=%QUERY',\n          wildcard: '%QUERY' } }) };\n\n\n\n\n    // Take all that crazy setup data and put it together into one beautiful typeahead call!\n    $('.sidebarSearchField').typeahead(\n    {\n      highlight: true },\n\n    [topics, maps, mappers]);\n\n\n    // Set max height of the search results box to prevent it from covering bottom left footer\n    $('.sidebarSearchField').bind('typeahead:render', function (event) {\n      self.initSearchOptions();\n      self.hideLoader();\n      var h = $(window).height();\n      $('.tt-dropdown-menu').css('max-height', h - 100);\n      if (self.limitTopicsToMe) {\n        $('#limitTopicsToMe').prop('checked', true);\n      }\n      if (self.limitMapsToMe) {\n        $('#limitMapsToMe').prop('checked', true);\n      }\n    });\n    $(window).resize(function () {\n      var h = $(window).height();\n      $('.tt-dropdown-menu').css('max-height', h - 100);\n    });\n\n    // tell the autocomplete to launch a new tab with the topic, map, or mapper you clicked on\n    $('.sidebarSearchField').bind('typeahead:select', self.handleResultClick);\n\n    // don't do it, if they clicked on a 'addToMap' button\n    $('.sidebarSearch button.addToMap').click(function (event) {\n      event.stopPropagation();\n    });\n\n    // make sure that when you click on 'limit to me' or 'toggle section' it works\n    $('.sidebarSearchField.tt-input').keyup(function () {\n      if ($('.sidebarSearchField.tt-input').val() === '') {\n        self.hideLoader();\n      } else {\n        self.showLoader();\n      }\n    });\n  },\n  handleResultClick: function handleResultClick(event, datum, dataset) {\n    var self = Search;\n\n    self.hideLoader();\n\n    if (['topic', 'map', 'mapper'].indexOf(datum.rtype) !== -1) {\n      if (datum.rtype === 'topic') {\n        _Router2.default.topics(datum.id);\n      } else if (datum.rtype === 'map') {\n        _Router2.default.maps(datum.id);\n      } else if (datum.rtype === 'mapper') {\n        _Router2.default.explore('mapper', datum.id);\n      }\n    }\n  },\n  initSearchOptions: function initSearchOptions() {\n    var self = Search;\n\n    function toggleResultSet(set) {\n      var s = $('.tt-dataset-' + set + ' .tt-suggestion, .tt-dataset-' + set + ' .resultnoresult');\n      if (s.is(':visible')) {\n        s.hide();\n        $(this).removeClass('minimizeResults').addClass('maximizeResults');\n      } else {\n        s.show();\n        $(this).removeClass('maximizeResults').addClass('minimizeResults');\n      }\n    }\n\n    $('.limitToMe').unbind().bind('change', function (e) {\n      if ($(this).attr('id') === 'limitTopicsToMe') {\n        self.limitTopicsToMe = !self.limitTopicsToMe;\n      }\n      if ($(this).attr('id') === 'limitMapsToMe') {\n        self.limitMapsToMe = !self.limitMapsToMe;\n      }\n\n      // set the value of the search equal to itself to retrigger the\n      // autocomplete event\n      var searchQuery = $('.sidebarSearchField.tt-input').val();\n      $('.sidebarSearchField').typeahead('val', '').\n      typeahead('val', searchQuery);\n    });\n\n    // when the user clicks minimize section, hide the results for that section\n    $('.minimizeMapperResults').unbind().click(function (e) {\n      toggleResultSet.call(this, 'mappers');\n    });\n    $('.minimizeTopicResults').unbind().click(function (e) {\n      toggleResultSet.call(this, 'topics');\n    });\n    $('.minimizeMapResults').unbind().click(function (e) {\n      toggleResultSet.call(this, 'maps');\n    });\n  },\n  hideLoader: function hideLoader() {\n    $('#searchLoading').hide();\n  },\n  showLoader: function showLoader() {\n    $('#searchLoading').show();\n  } };exports.default =\n\n\nSearch;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzY2LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvR2xvYmFsVUkvU2VhcmNoLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGdsb2JhbCAkLCBIb2dhbiwgQmxvb2Rob3VuZCwgQ2FudmFzTG9hZGVyICovXG5cbmltcG9ydCBBY3RpdmUgZnJvbSAnLi4vQWN0aXZlJ1xuaW1wb3J0IFJvdXRlciBmcm9tICcuLi9Sb3V0ZXInXG5cbmNvbnN0IFNlYXJjaCA9IHtcbiAgbG9ja2VkOiBmYWxzZSxcbiAgaXNPcGVuOiBmYWxzZSxcbiAgbGltaXRUb3BpY3NUb01lOiBmYWxzZSxcbiAgbGltaXRNYXBzVG9NZTogZmFsc2UsXG4gIGNoYW5naW5nOiBmYWxzZSxcbiAgb3B0aW9uc0luaXRpYWxpemVkOiBmYWxzZSxcbiAgaW5pdDogZnVuY3Rpb24oc2VydmVyRGF0YSkge1xuICAgIHZhciBzZWxmID0gU2VhcmNoXG5cbiAgICBzZWxmLndpbGRjYXJkSWNvblVybCA9IHNlcnZlckRhdGFbJ2ljb25zL3dpbGRjYXJkLnBuZyddXG4gICAgc2VsZi51c2VySWNvblVybCA9IHNlcnZlckRhdGFbJ3VzZXIucG5nJ11cblxuICAgIC8vIHRoaXMgaXMgc2ltaWxhciB0byBNZXRhbWFwcy5Mb2FkaW5nLCBidXQgaXQncyBmb3IgdGhlIHNlYXJjaCBlbGVtZW50XG4gICAgdmFyIGxvYWRlciA9IG5ldyBDYW52YXNMb2FkZXIoJ3NlYXJjaExvYWRpbmcnKVxuICAgIGxvYWRlci5zZXRDb2xvcignIzRmYjVjMCcpIC8vIGRlZmF1bHQgaXMgJyMwMDAwMDAnXG4gICAgbG9hZGVyLnNldERpYW1ldGVyKDI0KSAvLyBkZWZhdWx0IGlzIDQwXG4gICAgbG9hZGVyLnNldERlbnNpdHkoNDEpIC8vIGRlZmF1bHQgaXMgNDBcbiAgICBsb2FkZXIuc2V0UmFuZ2UoMC45KSAvLyBkZWZhdWx0IGlzIDEuM1xuICAgIGxvYWRlci5zaG93KCkgLy8gSGlkZGVuIGJ5IGRlZmF1bHRcblxuICAgICQoJy5zaWRlYmFyU2VhcmNoSWNvbicpLmNsaWNrKGZ1bmN0aW9uKGUpIHtcbiAgICAgICQoJy5zaWRlYmFyU2VhcmNoRmllbGQnKS5mb2N1cygpXG4gICAgfSlcbiAgICAkKCcuc2lkZWJhclNlYXJjaCcpLmNsaWNrKGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICB9KVxuXG4gICAgc2VsZi5zdGFydFR5cGVhaGVhZCgpXG4gIH0sXG4gIGZvY3VzOiBmdW5jdGlvbigpIHtcbiAgICAkKCcuc2lkZWJhclNlYXJjaEZpZWxkJykuZm9jdXMoKVxuICB9LFxuICBzdGFydFR5cGVhaGVhZDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSBTZWFyY2hcblxuICAgIHZhciBtYXBoZWFkZXIgPSBBY3RpdmUuTWFwcGVyID8gJzxkaXYgY2xhc3M9XCJzZWFyY2hNYXBzSGVhZGVyIHNlYXJjaEhlYWRlclwiPjxoMyBjbGFzcz1cInNlYXJjaC1oZWFkaW5nXCI+TWFwczwvaDM+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwibGltaXRUb01lXCIgaWQ9XCJsaW1pdE1hcHNUb01lXCI+PC9pbnB1dD48bGFiZWwgZm9yPVwibGltaXRNYXBzVG9NZVwiIGNsYXNzPVwibGltaXRUb01lTGFiZWxcIj5hZGRlZCBieSBtZTwvbGFiZWw+PGRpdiBjbGFzcz1cIm1pbmltaXplUmVzdWx0cyBtaW5pbWl6ZU1hcFJlc3VsdHNcIj48L2Rpdj48ZGl2IGNsYXNzPVwiY2xlYXJmbG9hdFwiPjwvZGl2PjwvZGl2PicgOiAnPGRpdiBjbGFzcz1cInNlYXJjaE1hcHNIZWFkZXIgc2VhcmNoSGVhZGVyXCI+PGgzIGNsYXNzPVwic2VhcmNoLWhlYWRpbmdcIj5NYXBzPC9oMz48ZGl2IGNsYXNzPVwibWluaW1pemVSZXN1bHRzIG1pbmltaXplTWFwUmVzdWx0c1wiPjwvZGl2PjxkaXYgY2xhc3M9XCJjbGVhcmZsb2F0XCI+PC9kaXY+PC9kaXY+J1xuICAgIHZhciB0b3BpY2hlYWRlciA9IEFjdGl2ZS5NYXBwZXIgPyAnPGRpdiBjbGFzcz1cInNlYXJjaFRvcGljc0hlYWRlciBzZWFyY2hIZWFkZXJcIj48aDMgY2xhc3M9XCJzZWFyY2gtaGVhZGluZ1wiPlRvcGljczwvaDM+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwibGltaXRUb01lXCIgaWQ9XCJsaW1pdFRvcGljc1RvTWVcIj48L2lucHV0PjxsYWJlbCBmb3I9XCJsaW1pdFRvcGljc1RvTWVcIiBjbGFzcz1cImxpbWl0VG9NZUxhYmVsXCI+YWRkZWQgYnkgbWU8L2xhYmVsPjxkaXYgY2xhc3M9XCJtaW5pbWl6ZVJlc3VsdHMgbWluaW1pemVUb3BpY1Jlc3VsdHNcIj48L2Rpdj48ZGl2IGNsYXNzPVwiY2xlYXJmbG9hdFwiPjwvZGl2PjwvZGl2PicgOiAnPGRpdiBjbGFzcz1cInNlYXJjaFRvcGljc0hlYWRlciBzZWFyY2hIZWFkZXJcIj48aDMgY2xhc3M9XCJzZWFyY2gtaGVhZGluZ1wiPlRvcGljczwvaDM+PGRpdiBjbGFzcz1cIm1pbmltaXplUmVzdWx0cyBtaW5pbWl6ZVRvcGljUmVzdWx0c1wiPjwvZGl2PjxkaXYgY2xhc3M9XCJjbGVhcmZsb2F0XCI+PC9kaXY+PC9kaXY+J1xuICAgIHZhciBtYXBwZXJoZWFkZXIgPSAnPGRpdiBjbGFzcz1cInNlYXJjaE1hcHBlcnNIZWFkZXIgc2VhcmNoSGVhZGVyXCI+PGgzIGNsYXNzPVwic2VhcmNoLWhlYWRpbmdcIj5NYXBwZXJzPC9oMz48ZGl2IGNsYXNzPVwibWluaW1pemVSZXN1bHRzIG1pbmltaXplTWFwcGVyUmVzdWx0c1wiPjwvZGl2PjxkaXYgY2xhc3M9XCJjbGVhcmZsb2F0XCI+PC9kaXY+PC9kaXY+J1xuXG4gICAgdmFyIHRvcGljcyA9IHtcbiAgICAgIG5hbWU6ICd0b3BpY3MnLFxuICAgICAgbGltaXQ6IDk5OTksXG5cbiAgICAgIGRpc3BsYXk6IHMgPT4gcy5sYWJlbCxcbiAgICAgIHRlbXBsYXRlczoge1xuICAgICAgICBub3RGb3VuZDogZnVuY3Rpb24ocykge1xuICAgICAgICAgIHJldHVybiBIb2dhbi5jb21waWxlKHRvcGljaGVhZGVyICsgJCgnI3RvcGljU2VhcmNoVGVtcGxhdGUnKS5odG1sKCkpLnJlbmRlcih7XG4gICAgICAgICAgICB2YWx1ZTogJ05vIHJlc3VsdHMnLFxuICAgICAgICAgICAgbGFiZWw6ICdObyByZXN1bHRzJyxcbiAgICAgICAgICAgIHR5cGVJbWFnZVVSTDogc2VsZi53aWxkY2FyZEljb25VcmwsXG4gICAgICAgICAgICBydHlwZTogJ25vcmVzdWx0J1xuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIGhlYWRlcjogdG9waWNoZWFkZXIsXG4gICAgICAgIHN1Z2dlc3Rpb246IGZ1bmN0aW9uKHMpIHtcbiAgICAgICAgICByZXR1cm4gSG9nYW4uY29tcGlsZSgkKCcjdG9waWNTZWFyY2hUZW1wbGF0ZScpLmh0bWwoKSkucmVuZGVyKHMpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzb3VyY2U6IG5ldyBCbG9vZGhvdW5kKHtcbiAgICAgICAgZGF0dW1Ub2tlbml6ZXI6IEJsb29kaG91bmQudG9rZW5pemVycy5vYmoud2hpdGVzcGFjZSgndmFsdWUnKSxcbiAgICAgICAgcXVlcnlUb2tlbml6ZXI6IEJsb29kaG91bmQudG9rZW5pemVycy53aGl0ZXNwYWNlLFxuICAgICAgICByZW1vdGU6IHtcbiAgICAgICAgICB1cmw6ICcvc2VhcmNoL3RvcGljcycsXG4gICAgICAgICAgcHJlcGFyZTogZnVuY3Rpb24ocXVlcnksIHNldHRpbmdzKSB7XG4gICAgICAgICAgICBzZXR0aW5ncy51cmwgKz0gJz90ZXJtPScgKyBxdWVyeVxuICAgICAgICAgICAgaWYgKEFjdGl2ZS5NYXBwZXIgJiYgc2VsZi5saW1pdFRvcGljc1RvTWUpIHtcbiAgICAgICAgICAgICAgc2V0dGluZ3MudXJsICs9ICcmdXNlcj0nICsgQWN0aXZlLk1hcHBlci5pZC50b1N0cmluZygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc2V0dGluZ3NcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdmFyIG1hcHMgPSB7XG4gICAgICBuYW1lOiAnbWFwcycsXG4gICAgICBsaW1pdDogOTk5OSxcbiAgICAgIGRpc3BsYXk6IHMgPT4gcy5sYWJlbCxcbiAgICAgIHRlbXBsYXRlczoge1xuICAgICAgICBub3RGb3VuZDogZnVuY3Rpb24ocykge1xuICAgICAgICAgIHJldHVybiBIb2dhbi5jb21waWxlKG1hcGhlYWRlciArICQoJyNtYXBTZWFyY2hUZW1wbGF0ZScpLmh0bWwoKSkucmVuZGVyKHtcbiAgICAgICAgICAgIHZhbHVlOiAnTm8gcmVzdWx0cycsXG4gICAgICAgICAgICBsYWJlbDogJ05vIHJlc3VsdHMnLFxuICAgICAgICAgICAgcnR5cGU6ICdub3Jlc3VsdCdcbiAgICAgICAgICB9KVxuICAgICAgICB9LFxuICAgICAgICBoZWFkZXI6IG1hcGhlYWRlcixcbiAgICAgICAgc3VnZ2VzdGlvbjogZnVuY3Rpb24ocykge1xuICAgICAgICAgIHJldHVybiBIb2dhbi5jb21waWxlKCQoJyNtYXBTZWFyY2hUZW1wbGF0ZScpLmh0bWwoKSkucmVuZGVyKHMpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzb3VyY2U6IG5ldyBCbG9vZGhvdW5kKHtcbiAgICAgICAgZGF0dW1Ub2tlbml6ZXI6IEJsb29kaG91bmQudG9rZW5pemVycy5vYmoud2hpdGVzcGFjZSgndmFsdWUnKSxcbiAgICAgICAgcXVlcnlUb2tlbml6ZXI6IEJsb29kaG91bmQudG9rZW5pemVycy53aGl0ZXNwYWNlLFxuICAgICAgICByZW1vdGU6IHtcbiAgICAgICAgICB1cmw6ICcvc2VhcmNoL21hcHMnLFxuICAgICAgICAgIHByZXBhcmU6IGZ1bmN0aW9uKHF1ZXJ5LCBzZXR0aW5ncykge1xuICAgICAgICAgICAgc2V0dGluZ3MudXJsICs9ICc/dGVybT0nICsgcXVlcnlcbiAgICAgICAgICAgIGlmIChBY3RpdmUuTWFwcGVyICYmIHNlbGYubGltaXRNYXBzVG9NZSkge1xuICAgICAgICAgICAgICBzZXR0aW5ncy51cmwgKz0gJyZ1c2VyPScgKyBBY3RpdmUuTWFwcGVyLmlkLnRvU3RyaW5nKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzZXR0aW5nc1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICB2YXIgbWFwcGVycyA9IHtcbiAgICAgIG5hbWU6ICdtYXBwZXJzJyxcbiAgICAgIGxpbWl0OiA5OTk5LFxuICAgICAgZGlzcGxheTogcyA9PiBzLmxhYmVsLFxuICAgICAgdGVtcGxhdGVzOiB7XG4gICAgICAgIG5vdEZvdW5kOiBmdW5jdGlvbihzKSB7XG4gICAgICAgICAgcmV0dXJuIEhvZ2FuLmNvbXBpbGUobWFwcGVyaGVhZGVyICsgJCgnI21hcHBlclNlYXJjaFRlbXBsYXRlJykuaHRtbCgpKS5yZW5kZXIoe1xuICAgICAgICAgICAgdmFsdWU6ICdObyByZXN1bHRzJyxcbiAgICAgICAgICAgIGxhYmVsOiAnTm8gcmVzdWx0cycsXG4gICAgICAgICAgICBydHlwZTogJ25vcmVzdWx0JyxcbiAgICAgICAgICAgIHByb2ZpbGU6IHNlbGYudXNlckljb25VcmxcbiAgICAgICAgICB9KVxuICAgICAgICB9LFxuICAgICAgICBoZWFkZXI6IG1hcHBlcmhlYWRlcixcbiAgICAgICAgc3VnZ2VzdGlvbjogZnVuY3Rpb24ocykge1xuICAgICAgICAgIHJldHVybiBIb2dhbi5jb21waWxlKCQoJyNtYXBwZXJTZWFyY2hUZW1wbGF0ZScpLmh0bWwoKSkucmVuZGVyKHMpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzb3VyY2U6IG5ldyBCbG9vZGhvdW5kKHtcbiAgICAgICAgZGF0dW1Ub2tlbml6ZXI6IEJsb29kaG91bmQudG9rZW5pemVycy5vYmoud2hpdGVzcGFjZSgndmFsdWUnKSxcbiAgICAgICAgcXVlcnlUb2tlbml6ZXI6IEJsb29kaG91bmQudG9rZW5pemVycy53aGl0ZXNwYWNlLFxuICAgICAgICByZW1vdGU6IHtcbiAgICAgICAgICB1cmw6ICcvc2VhcmNoL21hcHBlcnM/dGVybT0lUVVFUlknLFxuICAgICAgICAgIHdpbGRjYXJkOiAnJVFVRVJZJ1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIFRha2UgYWxsIHRoYXQgY3Jhenkgc2V0dXAgZGF0YSBhbmQgcHV0IGl0IHRvZ2V0aGVyIGludG8gb25lIGJlYXV0aWZ1bCB0eXBlYWhlYWQgY2FsbCFcbiAgICAkKCcuc2lkZWJhclNlYXJjaEZpZWxkJykudHlwZWFoZWFkKFxuICAgICAge1xuICAgICAgICBoaWdobGlnaHQ6IHRydWVcbiAgICAgIH0sXG4gICAgICBbdG9waWNzLCBtYXBzLCBtYXBwZXJzXVxuICAgIClcblxuICAgIC8vIFNldCBtYXggaGVpZ2h0IG9mIHRoZSBzZWFyY2ggcmVzdWx0cyBib3ggdG8gcHJldmVudCBpdCBmcm9tIGNvdmVyaW5nIGJvdHRvbSBsZWZ0IGZvb3RlclxuICAgICQoJy5zaWRlYmFyU2VhcmNoRmllbGQnKS5iaW5kKCd0eXBlYWhlYWQ6cmVuZGVyJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIHNlbGYuaW5pdFNlYXJjaE9wdGlvbnMoKVxuICAgICAgc2VsZi5oaWRlTG9hZGVyKClcbiAgICAgIHZhciBoID0gJCh3aW5kb3cpLmhlaWdodCgpXG4gICAgICAkKCcudHQtZHJvcGRvd24tbWVudScpLmNzcygnbWF4LWhlaWdodCcsIGggLSAxMDApXG4gICAgICBpZiAoc2VsZi5saW1pdFRvcGljc1RvTWUpIHtcbiAgICAgICAgJCgnI2xpbWl0VG9waWNzVG9NZScpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKVxuICAgICAgfVxuICAgICAgaWYgKHNlbGYubGltaXRNYXBzVG9NZSkge1xuICAgICAgICAkKCcjbGltaXRNYXBzVG9NZScpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKVxuICAgICAgfVxuICAgIH0pXG4gICAgJCh3aW5kb3cpLnJlc2l6ZShmdW5jdGlvbigpIHtcbiAgICAgIHZhciBoID0gJCh3aW5kb3cpLmhlaWdodCgpXG4gICAgICAkKCcudHQtZHJvcGRvd24tbWVudScpLmNzcygnbWF4LWhlaWdodCcsIGggLSAxMDApXG4gICAgfSlcblxuICAgIC8vIHRlbGwgdGhlIGF1dG9jb21wbGV0ZSB0byBsYXVuY2ggYSBuZXcgdGFiIHdpdGggdGhlIHRvcGljLCBtYXAsIG9yIG1hcHBlciB5b3UgY2xpY2tlZCBvblxuICAgICQoJy5zaWRlYmFyU2VhcmNoRmllbGQnKS5iaW5kKCd0eXBlYWhlYWQ6c2VsZWN0Jywgc2VsZi5oYW5kbGVSZXN1bHRDbGljaylcblxuICAgIC8vIGRvbid0IGRvIGl0LCBpZiB0aGV5IGNsaWNrZWQgb24gYSAnYWRkVG9NYXAnIGJ1dHRvblxuICAgICQoJy5zaWRlYmFyU2VhcmNoIGJ1dHRvbi5hZGRUb01hcCcpLmNsaWNrKGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgIH0pXG5cbiAgICAvLyBtYWtlIHN1cmUgdGhhdCB3aGVuIHlvdSBjbGljayBvbiAnbGltaXQgdG8gbWUnIG9yICd0b2dnbGUgc2VjdGlvbicgaXQgd29ya3NcbiAgICAkKCcuc2lkZWJhclNlYXJjaEZpZWxkLnR0LWlucHV0Jykua2V5dXAoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoJCgnLnNpZGViYXJTZWFyY2hGaWVsZC50dC1pbnB1dCcpLnZhbCgpID09PSAnJykge1xuICAgICAgICBzZWxmLmhpZGVMb2FkZXIoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZi5zaG93TG9hZGVyKClcbiAgICAgIH1cbiAgICB9KVxuICB9LFxuICBoYW5kbGVSZXN1bHRDbGljazogZnVuY3Rpb24oZXZlbnQsIGRhdHVtLCBkYXRhc2V0KSB7XG4gICAgdmFyIHNlbGYgPSBTZWFyY2hcblxuICAgIHNlbGYuaGlkZUxvYWRlcigpXG5cbiAgICBpZiAoWyd0b3BpYycsICdtYXAnLCAnbWFwcGVyJ10uaW5kZXhPZihkYXR1bS5ydHlwZSkgIT09IC0xKSB7XG4gICAgICBpZiAoZGF0dW0ucnR5cGUgPT09ICd0b3BpYycpIHtcbiAgICAgICAgUm91dGVyLnRvcGljcyhkYXR1bS5pZClcbiAgICAgIH0gZWxzZSBpZiAoZGF0dW0ucnR5cGUgPT09ICdtYXAnKSB7XG4gICAgICAgIFJvdXRlci5tYXBzKGRhdHVtLmlkKVxuICAgICAgfSBlbHNlIGlmIChkYXR1bS5ydHlwZSA9PT0gJ21hcHBlcicpIHtcbiAgICAgICAgUm91dGVyLmV4cGxvcmUoJ21hcHBlcicsIGRhdHVtLmlkKVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgaW5pdFNlYXJjaE9wdGlvbnM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gU2VhcmNoXG5cbiAgICBmdW5jdGlvbiB0b2dnbGVSZXN1bHRTZXQoc2V0KSB7XG4gICAgICB2YXIgcyA9ICQoJy50dC1kYXRhc2V0LScgKyBzZXQgKyAnIC50dC1zdWdnZXN0aW9uLCAudHQtZGF0YXNldC0nICsgc2V0ICsgJyAucmVzdWx0bm9yZXN1bHQnKVxuICAgICAgaWYgKHMuaXMoJzp2aXNpYmxlJykpIHtcbiAgICAgICAgcy5oaWRlKClcbiAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnbWluaW1pemVSZXN1bHRzJykuYWRkQ2xhc3MoJ21heGltaXplUmVzdWx0cycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzLnNob3coKVxuICAgICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdtYXhpbWl6ZVJlc3VsdHMnKS5hZGRDbGFzcygnbWluaW1pemVSZXN1bHRzJylcbiAgICAgIH1cbiAgICB9XG5cbiAgICAkKCcubGltaXRUb01lJykudW5iaW5kKCkuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24oZSkge1xuICAgICAgaWYgKCQodGhpcykuYXR0cignaWQnKSA9PT0gJ2xpbWl0VG9waWNzVG9NZScpIHtcbiAgICAgICAgc2VsZi5saW1pdFRvcGljc1RvTWUgPSAhc2VsZi5saW1pdFRvcGljc1RvTWVcbiAgICAgIH1cbiAgICAgIGlmICgkKHRoaXMpLmF0dHIoJ2lkJykgPT09ICdsaW1pdE1hcHNUb01lJykge1xuICAgICAgICBzZWxmLmxpbWl0TWFwc1RvTWUgPSAhc2VsZi5saW1pdE1hcHNUb01lXG4gICAgICB9XG5cbiAgICAgIC8vIHNldCB0aGUgdmFsdWUgb2YgdGhlIHNlYXJjaCBlcXVhbCB0byBpdHNlbGYgdG8gcmV0cmlnZ2VyIHRoZVxuICAgICAgLy8gYXV0b2NvbXBsZXRlIGV2ZW50XG4gICAgICB2YXIgc2VhcmNoUXVlcnkgPSAkKCcuc2lkZWJhclNlYXJjaEZpZWxkLnR0LWlucHV0JykudmFsKClcbiAgICAgICQoJy5zaWRlYmFyU2VhcmNoRmllbGQnKS50eXBlYWhlYWQoJ3ZhbCcsICcnKVxuICAgICAgICAudHlwZWFoZWFkKCd2YWwnLCBzZWFyY2hRdWVyeSlcbiAgICB9KVxuXG4gICAgLy8gd2hlbiB0aGUgdXNlciBjbGlja3MgbWluaW1pemUgc2VjdGlvbiwgaGlkZSB0aGUgcmVzdWx0cyBmb3IgdGhhdCBzZWN0aW9uXG4gICAgJCgnLm1pbmltaXplTWFwcGVyUmVzdWx0cycpLnVuYmluZCgpLmNsaWNrKGZ1bmN0aW9uKGUpIHtcbiAgICAgIHRvZ2dsZVJlc3VsdFNldC5jYWxsKHRoaXMsICdtYXBwZXJzJylcbiAgICB9KVxuICAgICQoJy5taW5pbWl6ZVRvcGljUmVzdWx0cycpLnVuYmluZCgpLmNsaWNrKGZ1bmN0aW9uKGUpIHtcbiAgICAgIHRvZ2dsZVJlc3VsdFNldC5jYWxsKHRoaXMsICd0b3BpY3MnKVxuICAgIH0pXG4gICAgJCgnLm1pbmltaXplTWFwUmVzdWx0cycpLnVuYmluZCgpLmNsaWNrKGZ1bmN0aW9uKGUpIHtcbiAgICAgIHRvZ2dsZVJlc3VsdFNldC5jYWxsKHRoaXMsICdtYXBzJylcbiAgICB9KVxuICB9LFxuICBoaWRlTG9hZGVyOiBmdW5jdGlvbigpIHtcbiAgICAkKCcjc2VhcmNoTG9hZGluZycpLmhpZGUoKVxuICB9LFxuICBzaG93TG9hZGVyOiBmdW5jdGlvbigpIHtcbiAgICAkKCcjc2VhcmNoTG9hZGluZycpLnNob3coKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNlYXJjaFxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9HbG9iYWxVSS9TZWFyY2guanMiXSwibWFwcGluZ3MiOiI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 367 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });\n\nvar _backbone = __webpack_require__(1);var _backbone2 = _interopRequireDefault(_backbone);\n\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _DataModel = __webpack_require__(149);var _DataModel2 = _interopRequireDefault(_DataModel);\nvar _GlobalUI = __webpack_require__(362);var _GlobalUI2 = _interopRequireDefault(_GlobalUI);\nvar _Loading = __webpack_require__(368);var _Loading2 = _interopRequireDefault(_Loading);\nvar _Map = __webpack_require__(369);var _Map2 = _interopRequireDefault(_Map);\nvar _Topic = __webpack_require__(571);var _Topic2 = _interopRequireDefault(_Topic);\nvar _Views = __webpack_require__(541);var _Views2 = _interopRequireDefault(_Views);\nvar _Visualize = __webpack_require__(561);var _Visualize2 = _interopRequireDefault(_Visualize);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}try {_backbone2.default.$ = window.$;} catch (err) {} /* global $ */\n\nvar _Router = _backbone2.default.Router.extend({\n  currentPage: '',\n  currentSection: '',\n  timeoutId: undefined,\n  routes: {\n    '': 'home', // #home\n    'explore/:section': 'explore', // #explore/active\n    'explore/:section/:id': 'explore', // #explore/mapper/1234\n    'maps/:id': 'maps', // #maps/7\n    'topics/:id': 'topics' // #topics/7\n  },\n  home: function home() {\n    var self = this;\n    clearTimeout(this.timeoutId);\n\n    if (_Active2.default.Mapper) document.title = 'Explore Active Maps | Metamaps';else\n    document.title = 'Home | Metamaps';\n\n    this.currentSection = '';\n    this.currentPage = '';\n    $('.wrapper').removeClass('mapPage topicPage');\n\n    var classes = _Active2.default.Mapper ? 'homePage explorePage' : 'homePage';\n    $('.wrapper').addClass(classes);\n\n    var navigate = function navigate() {\n      self.timeoutId = setTimeout(function () {\n        self.navigateAndTrack('');\n      }, 300);\n    };\n\n    // all this only for the logged in home page\n    if (_Active2.default.Mapper) {\n      $('.homeButton a').attr('href', '/');\n      _GlobalUI2.default.hideDiv('#yield');\n\n      _GlobalUI2.default.showDiv('#explore');\n\n      _Views2.default.ExploreMaps.setCollection(_DataModel2.default.Maps.Active);\n      if (_DataModel2.default.Maps.Active.length === 0) {\n        _Views2.default.ExploreMaps.pending = true;\n        _DataModel2.default.Maps.Active.getMaps(navigate); // this will trigger an explore maps render\n      } else {\n        _Views2.default.ExploreMaps.render(navigate);\n      }\n    } else {\n      // logged out home page\n      _GlobalUI2.default.hideDiv('#explore');\n      _GlobalUI2.default.showDiv('#yield');\n      this.timeoutId = setTimeout(navigate, 500);\n    }\n\n    _GlobalUI2.default.hideDiv('#infovis');\n    _GlobalUI2.default.hideDiv('#instructions');\n    _Map2.default.end();\n    _Topic2.default.end();\n    _Active2.default.Map = null;\n    _Active2.default.Topic = null;\n  },\n  explore: function explore(section, id) {\n    var self = this;\n    clearTimeout(this.timeoutId);\n\n    // just capitalize the variable section\n    // either 'featured', 'mapper', or 'active'\n    var capitalize = section.charAt(0).toUpperCase() + section.slice(1);\n\n    if (section === 'shared' || section === 'featured' || section === 'active' || section === 'starred') {\n      document.title = 'Explore ' + capitalize + ' Maps | Metamaps';\n    } else if (section === 'mapper') {\n      $.ajax({\n        url: '/users/' + id + '.json',\n        success: function success(response) {\n          document.title = response.name + ' | Metamaps';\n        },\n        error: function error() {} });\n\n    } else if (section === 'mine') {\n      document.title = 'Explore My Maps | Metamaps';\n    }\n\n    if (_Active2.default.Mapper && section !== 'mapper') $('.homeButton a').attr('href', '/explore/' + section);\n    $('.wrapper').removeClass('homePage mapPage topicPage');\n    $('.wrapper').addClass('explorePage');\n\n    this.currentSection = 'explore';\n    this.currentPage = section;\n\n    // this will mean it's a mapper page being loaded\n    if (id) {\n      if (_DataModel2.default.Maps.Mapper.mapperId !== id) {\n        // empty the collection if we are trying to load the maps\n        // collection of a different mapper than we had previously\n        _DataModel2.default.Maps.Mapper.reset();\n        _DataModel2.default.Maps.Mapper.page = 1;\n      }\n      _DataModel2.default.Maps.Mapper.mapperId = id;\n    }\n\n    _Views2.default.ExploreMaps.setCollection(_DataModel2.default.Maps[capitalize]);\n\n    var navigate = function navigate() {\n      var path = '/explore/' + self.currentPage;\n\n      // alter url if for mapper profile page\n      if (self.currentPage === 'mapper') {\n        path += '/' + _DataModel2.default.Maps.Mapper.mapperId;\n      }\n\n      self.navigateAndTrack(path);\n    };\n    var navigateTimeout = function navigateTimeout() {\n      self.timeoutId = setTimeout(navigate, 300);\n    };\n    if (_DataModel2.default.Maps[capitalize].length === 0) {\n      _Loading2.default.show();\n      _Views2.default.ExploreMaps.pending = true;\n      setTimeout(function () {\n        _DataModel2.default.Maps[capitalize].getMaps(navigate); // this will trigger an explore maps render\n      }, 300); // wait 300 milliseconds till the other animations are done to do the fetch\n    } else {\n      if (id) {\n        _Views2.default.ExploreMaps.fetchUserThenRender(navigateTimeout);\n      } else {\n        _Views2.default.ExploreMaps.render(navigateTimeout);\n      }\n    }\n\n    _GlobalUI2.default.showDiv('#explore');\n    _GlobalUI2.default.hideDiv('#yield');\n    _GlobalUI2.default.hideDiv('#infovis');\n    _GlobalUI2.default.hideDiv('#instructions');\n    _Map2.default.end();\n    _Topic2.default.end();\n    _Active2.default.Map = null;\n    _Active2.default.Topic = null;\n  },\n  maps: function maps(id) {\n    clearTimeout(this.timeoutId);\n\n    this.currentSection = 'map';\n    this.currentPage = id;\n\n    $('.wrapper').removeClass('homePage explorePage topicPage');\n    $('.wrapper').addClass('mapPage');\n    // another class will be added to wrapper if you\n    // can edit this map '.canEditMap'\n\n    _GlobalUI2.default.hideDiv('#yield');\n    _GlobalUI2.default.hideDiv('#explore');\n\n    // clear the visualization, if there was one, before showing its div again\n    if (_Visualize2.default.mGraph) {\n      _Visualize2.default.clearVisualization();\n    }\n    _GlobalUI2.default.showDiv('#infovis');\n    _Topic2.default.end();\n    _Active2.default.Topic = null;\n\n    _Loading2.default.show();\n    _Map2.default.end();\n    _Map2.default.launch(id);\n  },\n  topics: function topics(id) {\n    clearTimeout(this.timeoutId);\n\n    this.currentSection = 'topic';\n    this.currentPage = id;\n\n    $('.wrapper').removeClass('homePage explorePage mapPage');\n    $('.wrapper').addClass('topicPage');\n\n    _GlobalUI2.default.hideDiv('#yield');\n    _GlobalUI2.default.hideDiv('#explore');\n\n    // clear the visualization, if there was one, before showing its div again\n    if (_Visualize2.default.mGraph) {\n      _Visualize2.default.clearVisualization();\n    }\n    _GlobalUI2.default.showDiv('#infovis');\n    _Map2.default.end();\n    _Active2.default.Map = null;\n\n    _Topic2.default.end();\n    _Topic2.default.launch(id);\n  } });\n\n\nvar Router = new _Router();\n\nRouter.navigateAndTrack = function (fragment, options) {\n  Router.navigate(fragment, options);\n  window.ga && window.ga('send', 'pageview', location.pathname, { title: document.title });\n};\n\nRouter.intercept = function (evt) {\n  var segments;\n\n  var href = {\n    prop: $(this).prop('href'),\n    attr: $(this).attr('href') };\n\n  var root = window.location.protocol + '//' + window.location.host + _backbone2.default.history.options.root;\n\n  if (href.prop && href.prop === root) href.attr = '';\n\n  if (href.prop && href.prop.slice(0, root.length) === root) {\n    evt.preventDefault();\n\n    segments = href.attr.split('/');\n    segments.splice(0, 1); // pop off the element created by the first /\n\n    if (href.attr === '') {\n      Router.home();\n    } else {\n      Router[segments[0]](segments[1], segments[2]);\n    }\n  }\n};\n\nRouter.init = function () {\n  _backbone2.default.history.start({\n    silent: true,\n    pushState: true,\n    root: '/' });\n\n  $(document).on('click', 'a[data-router=\"true\"]', Router.intercept);\n};exports.default =\n\nRouter;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzY3LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvUm91dGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGdsb2JhbCAkICovXG5cbmltcG9ydCBCYWNrYm9uZSBmcm9tICdiYWNrYm9uZSdcbnRyeSB7IEJhY2tib25lLiQgPSB3aW5kb3cuJCB9IGNhdGNoIChlcnIpIHt9XG5cbmltcG9ydCBBY3RpdmUgZnJvbSAnLi9BY3RpdmUnXG5pbXBvcnQgRGF0YU1vZGVsIGZyb20gJy4vRGF0YU1vZGVsJ1xuaW1wb3J0IEdsb2JhbFVJIGZyb20gJy4vR2xvYmFsVUknXG5pbXBvcnQgTG9hZGluZyBmcm9tICcuL0xvYWRpbmcnXG5pbXBvcnQgTWFwIGZyb20gJy4vTWFwJ1xuaW1wb3J0IFRvcGljIGZyb20gJy4vVG9waWMnXG5pbXBvcnQgVmlld3MgZnJvbSAnLi9WaWV3cydcbmltcG9ydCBWaXN1YWxpemUgZnJvbSAnLi9WaXN1YWxpemUnXG5cbmNvbnN0IF9Sb3V0ZXIgPSBCYWNrYm9uZS5Sb3V0ZXIuZXh0ZW5kKHtcbiAgY3VycmVudFBhZ2U6ICcnLFxuICBjdXJyZW50U2VjdGlvbjogJycsXG4gIHRpbWVvdXRJZDogdW5kZWZpbmVkLFxuICByb3V0ZXM6IHtcbiAgICAnJzogJ2hvbWUnLCAvLyAjaG9tZVxuICAgICdleHBsb3JlLzpzZWN0aW9uJzogJ2V4cGxvcmUnLCAvLyAjZXhwbG9yZS9hY3RpdmVcbiAgICAnZXhwbG9yZS86c2VjdGlvbi86aWQnOiAnZXhwbG9yZScsIC8vICNleHBsb3JlL21hcHBlci8xMjM0XG4gICAgJ21hcHMvOmlkJzogJ21hcHMnLCAvLyAjbWFwcy83XG4gICAgJ3RvcGljcy86aWQnOiAndG9waWNzJyAvLyAjdG9waWNzLzdcbiAgfSxcbiAgaG9tZTogZnVuY3Rpb24oKSB7XG4gICAgbGV0IHNlbGYgPSB0aGlzXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkKVxuXG4gICAgaWYgKEFjdGl2ZS5NYXBwZXIpIGRvY3VtZW50LnRpdGxlID0gJ0V4cGxvcmUgQWN0aXZlIE1hcHMgfCBNZXRhbWFwcydcbiAgICBlbHNlIGRvY3VtZW50LnRpdGxlID0gJ0hvbWUgfCBNZXRhbWFwcydcblxuICAgIHRoaXMuY3VycmVudFNlY3Rpb24gPSAnJ1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAnJ1xuICAgICQoJy53cmFwcGVyJykucmVtb3ZlQ2xhc3MoJ21hcFBhZ2UgdG9waWNQYWdlJylcblxuICAgIHZhciBjbGFzc2VzID0gQWN0aXZlLk1hcHBlciA/ICdob21lUGFnZSBleHBsb3JlUGFnZScgOiAnaG9tZVBhZ2UnXG4gICAgJCgnLndyYXBwZXInKS5hZGRDbGFzcyhjbGFzc2VzKVxuXG4gICAgdmFyIG5hdmlnYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYubmF2aWdhdGVBbmRUcmFjaygnJylcbiAgICAgIH0sIDMwMClcbiAgICB9XG5cbiAgICAvLyBhbGwgdGhpcyBvbmx5IGZvciB0aGUgbG9nZ2VkIGluIGhvbWUgcGFnZVxuICAgIGlmIChBY3RpdmUuTWFwcGVyKSB7XG4gICAgICAkKCcuaG9tZUJ1dHRvbiBhJykuYXR0cignaHJlZicsICcvJylcbiAgICAgIEdsb2JhbFVJLmhpZGVEaXYoJyN5aWVsZCcpXG5cbiAgICAgIEdsb2JhbFVJLnNob3dEaXYoJyNleHBsb3JlJylcblxuICAgICAgVmlld3MuRXhwbG9yZU1hcHMuc2V0Q29sbGVjdGlvbihEYXRhTW9kZWwuTWFwcy5BY3RpdmUpXG4gICAgICBpZiAoRGF0YU1vZGVsLk1hcHMuQWN0aXZlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBWaWV3cy5FeHBsb3JlTWFwcy5wZW5kaW5nID0gdHJ1ZVxuICAgICAgICBEYXRhTW9kZWwuTWFwcy5BY3RpdmUuZ2V0TWFwcyhuYXZpZ2F0ZSkgLy8gdGhpcyB3aWxsIHRyaWdnZXIgYW4gZXhwbG9yZSBtYXBzIHJlbmRlclxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgVmlld3MuRXhwbG9yZU1hcHMucmVuZGVyKG5hdmlnYXRlKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBsb2dnZWQgb3V0IGhvbWUgcGFnZVxuICAgICAgR2xvYmFsVUkuaGlkZURpdignI2V4cGxvcmUnKVxuICAgICAgR2xvYmFsVUkuc2hvd0RpdignI3lpZWxkJylcbiAgICAgIHRoaXMudGltZW91dElkID0gc2V0VGltZW91dChuYXZpZ2F0ZSwgNTAwKVxuICAgIH1cblxuICAgIEdsb2JhbFVJLmhpZGVEaXYoJyNpbmZvdmlzJylcbiAgICBHbG9iYWxVSS5oaWRlRGl2KCcjaW5zdHJ1Y3Rpb25zJylcbiAgICBNYXAuZW5kKClcbiAgICBUb3BpYy5lbmQoKVxuICAgIEFjdGl2ZS5NYXAgPSBudWxsXG4gICAgQWN0aXZlLlRvcGljID0gbnVsbFxuICB9LFxuICBleHBsb3JlOiBmdW5jdGlvbihzZWN0aW9uLCBpZCkge1xuICAgIHZhciBzZWxmID0gdGhpc1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZClcblxuICAgIC8vIGp1c3QgY2FwaXRhbGl6ZSB0aGUgdmFyaWFibGUgc2VjdGlvblxuICAgIC8vIGVpdGhlciAnZmVhdHVyZWQnLCAnbWFwcGVyJywgb3IgJ2FjdGl2ZSdcbiAgICB2YXIgY2FwaXRhbGl6ZSA9IHNlY3Rpb24uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzZWN0aW9uLnNsaWNlKDEpXG5cbiAgICBpZiAoc2VjdGlvbiA9PT0gJ3NoYXJlZCcgfHwgc2VjdGlvbiA9PT0gJ2ZlYXR1cmVkJyB8fCBzZWN0aW9uID09PSAnYWN0aXZlJyB8fCBzZWN0aW9uID09PSAnc3RhcnJlZCcpIHtcbiAgICAgIGRvY3VtZW50LnRpdGxlID0gJ0V4cGxvcmUgJyArIGNhcGl0YWxpemUgKyAnIE1hcHMgfCBNZXRhbWFwcydcbiAgICB9IGVsc2UgaWYgKHNlY3Rpb24gPT09ICdtYXBwZXInKSB7XG4gICAgICAkLmFqYXgoe1xuICAgICAgICB1cmw6ICcvdXNlcnMvJyArIGlkICsgJy5qc29uJyxcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICBkb2N1bWVudC50aXRsZSA9IHJlc3BvbnNlLm5hbWUgKyAnIHwgTWV0YW1hcHMnXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBmdW5jdGlvbigpIHt9XG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAoc2VjdGlvbiA9PT0gJ21pbmUnKSB7XG4gICAgICBkb2N1bWVudC50aXRsZSA9ICdFeHBsb3JlIE15IE1hcHMgfCBNZXRhbWFwcydcbiAgICB9XG5cbiAgICBpZiAoQWN0aXZlLk1hcHBlciAmJiBzZWN0aW9uICE9PSAnbWFwcGVyJykgJCgnLmhvbWVCdXR0b24gYScpLmF0dHIoJ2hyZWYnLCAnL2V4cGxvcmUvJyArIHNlY3Rpb24pXG4gICAgJCgnLndyYXBwZXInKS5yZW1vdmVDbGFzcygnaG9tZVBhZ2UgbWFwUGFnZSB0b3BpY1BhZ2UnKVxuICAgICQoJy53cmFwcGVyJykuYWRkQ2xhc3MoJ2V4cGxvcmVQYWdlJylcblxuICAgIHRoaXMuY3VycmVudFNlY3Rpb24gPSAnZXhwbG9yZSdcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gc2VjdGlvblxuXG4gICAgLy8gdGhpcyB3aWxsIG1lYW4gaXQncyBhIG1hcHBlciBwYWdlIGJlaW5nIGxvYWRlZFxuICAgIGlmIChpZCkge1xuICAgICAgaWYgKERhdGFNb2RlbC5NYXBzLk1hcHBlci5tYXBwZXJJZCAhPT0gaWQpIHtcbiAgICAgICAgLy8gZW1wdHkgdGhlIGNvbGxlY3Rpb24gaWYgd2UgYXJlIHRyeWluZyB0byBsb2FkIHRoZSBtYXBzXG4gICAgICAgIC8vIGNvbGxlY3Rpb24gb2YgYSBkaWZmZXJlbnQgbWFwcGVyIHRoYW4gd2UgaGFkIHByZXZpb3VzbHlcbiAgICAgICAgRGF0YU1vZGVsLk1hcHMuTWFwcGVyLnJlc2V0KClcbiAgICAgICAgRGF0YU1vZGVsLk1hcHMuTWFwcGVyLnBhZ2UgPSAxXG4gICAgICB9XG4gICAgICBEYXRhTW9kZWwuTWFwcy5NYXBwZXIubWFwcGVySWQgPSBpZFxuICAgIH1cblxuICAgIFZpZXdzLkV4cGxvcmVNYXBzLnNldENvbGxlY3Rpb24oRGF0YU1vZGVsLk1hcHNbY2FwaXRhbGl6ZV0pXG5cbiAgICB2YXIgbmF2aWdhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBwYXRoID0gJy9leHBsb3JlLycgKyBzZWxmLmN1cnJlbnRQYWdlXG5cbiAgICAgIC8vIGFsdGVyIHVybCBpZiBmb3IgbWFwcGVyIHByb2ZpbGUgcGFnZVxuICAgICAgaWYgKHNlbGYuY3VycmVudFBhZ2UgPT09ICdtYXBwZXInKSB7XG4gICAgICAgIHBhdGggKz0gJy8nICsgRGF0YU1vZGVsLk1hcHMuTWFwcGVyLm1hcHBlcklkXG4gICAgICB9XG5cbiAgICAgIHNlbGYubmF2aWdhdGVBbmRUcmFjayhwYXRoKVxuICAgIH1cbiAgICB2YXIgbmF2aWdhdGVUaW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLnRpbWVvdXRJZCA9IHNldFRpbWVvdXQobmF2aWdhdGUsIDMwMClcbiAgICB9XG4gICAgaWYgKERhdGFNb2RlbC5NYXBzW2NhcGl0YWxpemVdLmxlbmd0aCA9PT0gMCkge1xuICAgICAgTG9hZGluZy5zaG93KClcbiAgICAgIFZpZXdzLkV4cGxvcmVNYXBzLnBlbmRpbmcgPSB0cnVlXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICBEYXRhTW9kZWwuTWFwc1tjYXBpdGFsaXplXS5nZXRNYXBzKG5hdmlnYXRlKSAvLyB0aGlzIHdpbGwgdHJpZ2dlciBhbiBleHBsb3JlIG1hcHMgcmVuZGVyXG4gICAgICB9LCAzMDApIC8vIHdhaXQgMzAwIG1pbGxpc2Vjb25kcyB0aWxsIHRoZSBvdGhlciBhbmltYXRpb25zIGFyZSBkb25lIHRvIGRvIHRoZSBmZXRjaFxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaWQpIHtcbiAgICAgICAgVmlld3MuRXhwbG9yZU1hcHMuZmV0Y2hVc2VyVGhlblJlbmRlcihuYXZpZ2F0ZVRpbWVvdXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBWaWV3cy5FeHBsb3JlTWFwcy5yZW5kZXIobmF2aWdhdGVUaW1lb3V0KVxuICAgICAgfVxuICAgIH1cblxuICAgIEdsb2JhbFVJLnNob3dEaXYoJyNleHBsb3JlJylcbiAgICBHbG9iYWxVSS5oaWRlRGl2KCcjeWllbGQnKVxuICAgIEdsb2JhbFVJLmhpZGVEaXYoJyNpbmZvdmlzJylcbiAgICBHbG9iYWxVSS5oaWRlRGl2KCcjaW5zdHJ1Y3Rpb25zJylcbiAgICBNYXAuZW5kKClcbiAgICBUb3BpYy5lbmQoKVxuICAgIEFjdGl2ZS5NYXAgPSBudWxsXG4gICAgQWN0aXZlLlRvcGljID0gbnVsbFxuICB9LFxuICBtYXBzOiBmdW5jdGlvbihpZCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZClcblxuICAgIHRoaXMuY3VycmVudFNlY3Rpb24gPSAnbWFwJ1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBpZFxuXG4gICAgJCgnLndyYXBwZXInKS5yZW1vdmVDbGFzcygnaG9tZVBhZ2UgZXhwbG9yZVBhZ2UgdG9waWNQYWdlJylcbiAgICAkKCcud3JhcHBlcicpLmFkZENsYXNzKCdtYXBQYWdlJylcbiAgICAvLyBhbm90aGVyIGNsYXNzIHdpbGwgYmUgYWRkZWQgdG8gd3JhcHBlciBpZiB5b3VcbiAgICAvLyBjYW4gZWRpdCB0aGlzIG1hcCAnLmNhbkVkaXRNYXAnXG5cbiAgICBHbG9iYWxVSS5oaWRlRGl2KCcjeWllbGQnKVxuICAgIEdsb2JhbFVJLmhpZGVEaXYoJyNleHBsb3JlJylcblxuICAgIC8vIGNsZWFyIHRoZSB2aXN1YWxpemF0aW9uLCBpZiB0aGVyZSB3YXMgb25lLCBiZWZvcmUgc2hvd2luZyBpdHMgZGl2IGFnYWluXG4gICAgaWYgKFZpc3VhbGl6ZS5tR3JhcGgpIHtcbiAgICAgIFZpc3VhbGl6ZS5jbGVhclZpc3VhbGl6YXRpb24oKVxuICAgIH1cbiAgICBHbG9iYWxVSS5zaG93RGl2KCcjaW5mb3ZpcycpXG4gICAgVG9waWMuZW5kKClcbiAgICBBY3RpdmUuVG9waWMgPSBudWxsXG5cbiAgICBMb2FkaW5nLnNob3coKVxuICAgIE1hcC5lbmQoKVxuICAgIE1hcC5sYXVuY2goaWQpXG4gIH0sXG4gIHRvcGljczogZnVuY3Rpb24oaWQpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpXG5cbiAgICB0aGlzLmN1cnJlbnRTZWN0aW9uID0gJ3RvcGljJ1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBpZFxuXG4gICAgJCgnLndyYXBwZXInKS5yZW1vdmVDbGFzcygnaG9tZVBhZ2UgZXhwbG9yZVBhZ2UgbWFwUGFnZScpXG4gICAgJCgnLndyYXBwZXInKS5hZGRDbGFzcygndG9waWNQYWdlJylcblxuICAgIEdsb2JhbFVJLmhpZGVEaXYoJyN5aWVsZCcpXG4gICAgR2xvYmFsVUkuaGlkZURpdignI2V4cGxvcmUnKVxuXG4gICAgLy8gY2xlYXIgdGhlIHZpc3VhbGl6YXRpb24sIGlmIHRoZXJlIHdhcyBvbmUsIGJlZm9yZSBzaG93aW5nIGl0cyBkaXYgYWdhaW5cbiAgICBpZiAoVmlzdWFsaXplLm1HcmFwaCkge1xuICAgICAgVmlzdWFsaXplLmNsZWFyVmlzdWFsaXphdGlvbigpXG4gICAgfVxuICAgIEdsb2JhbFVJLnNob3dEaXYoJyNpbmZvdmlzJylcbiAgICBNYXAuZW5kKClcbiAgICBBY3RpdmUuTWFwID0gbnVsbFxuXG4gICAgVG9waWMuZW5kKClcbiAgICBUb3BpYy5sYXVuY2goaWQpXG4gIH1cbn0pXG5cbmNvbnN0IFJvdXRlciA9IG5ldyBfUm91dGVyKClcblxuUm91dGVyLm5hdmlnYXRlQW5kVHJhY2sgPSAoZnJhZ21lbnQsIG9wdGlvbnMpID0+IHtcbiAgUm91dGVyLm5hdmlnYXRlKGZyYWdtZW50LCBvcHRpb25zKVxuICB3aW5kb3cuZ2EgJiYgd2luZG93LmdhKCdzZW5kJywgJ3BhZ2V2aWV3JywgbG9jYXRpb24ucGF0aG5hbWUsIHt0aXRsZTogZG9jdW1lbnQudGl0bGV9KVxufVxuXG5Sb3V0ZXIuaW50ZXJjZXB0ID0gZnVuY3Rpb24oZXZ0KSB7XG4gIHZhciBzZWdtZW50c1xuXG4gIHZhciBocmVmID0ge1xuICAgIHByb3A6ICQodGhpcykucHJvcCgnaHJlZicpLFxuICAgIGF0dHI6ICQodGhpcykuYXR0cignaHJlZicpXG4gIH1cbiAgdmFyIHJvb3QgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgd2luZG93LmxvY2F0aW9uLmhvc3QgKyBCYWNrYm9uZS5oaXN0b3J5Lm9wdGlvbnMucm9vdFxuXG4gIGlmIChocmVmLnByb3AgJiYgaHJlZi5wcm9wID09PSByb290KSBocmVmLmF0dHIgPSAnJ1xuXG4gIGlmIChocmVmLnByb3AgJiYgaHJlZi5wcm9wLnNsaWNlKDAsIHJvb3QubGVuZ3RoKSA9PT0gcm9vdCkge1xuICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICBzZWdtZW50cyA9IGhyZWYuYXR0ci5zcGxpdCgnLycpXG4gICAgc2VnbWVudHMuc3BsaWNlKDAsIDEpIC8vIHBvcCBvZmYgdGhlIGVsZW1lbnQgY3JlYXRlZCBieSB0aGUgZmlyc3QgL1xuXG4gICAgaWYgKGhyZWYuYXR0ciA9PT0gJycpIHtcbiAgICAgIFJvdXRlci5ob21lKClcbiAgICB9IGVsc2Uge1xuICAgICAgUm91dGVyW3NlZ21lbnRzWzBdXShzZWdtZW50c1sxXSwgc2VnbWVudHNbMl0pXG4gICAgfVxuICB9XG59XG5cblJvdXRlci5pbml0ID0gZnVuY3Rpb24oKSB7XG4gIEJhY2tib25lLmhpc3Rvcnkuc3RhcnQoe1xuICAgIHNpbGVudDogdHJ1ZSxcbiAgICBwdXNoU3RhdGU6IHRydWUsXG4gICAgcm9vdDogJy8nXG4gIH0pXG4gICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICdhW2RhdGEtcm91dGVyPVwidHJ1ZVwiXScsIFJvdXRlci5pbnRlcmNlcHQpXG59XG5cbmV4cG9ydCBkZWZhdWx0IFJvdXRlclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9Sb3V0ZXIuanMiXSwibWFwcGluZ3MiOiI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 368 */
/***/ function(module, exports) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true }); /* global CanvasLoader, $ */\n\nvar Loading = {\n  loader: null, // needs CanvasLoader to be defined\n  hide: function hide() {\n    $('#loading').hide();\n  },\n  show: function show() {\n    $('#loading').show();\n  },\n  setup: function setup() {\n    if (!Loading.loader) Loading.loader = new CanvasLoader('loading');\n    Loading.loader.setColor('#4fb5c0'); // default is '#000000'\n    Loading.loader.setDiameter(28); // default is 40\n    Loading.loader.setDensity(41); // default is 40\n    Loading.loader.setRange(0.9); // default is 1.3\n    Loading.loader.show(); // Hidden by default\n  } };exports.default =\n\n\nLoading;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzY4LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvTG9hZGluZy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBnbG9iYWwgQ2FudmFzTG9hZGVyLCAkICovXG5cbmNvbnN0IExvYWRpbmcgPSB7XG4gIGxvYWRlcjogbnVsbCwgLy8gbmVlZHMgQ2FudmFzTG9hZGVyIHRvIGJlIGRlZmluZWRcbiAgaGlkZTogZnVuY3Rpb24oKSB7XG4gICAgJCgnI2xvYWRpbmcnKS5oaWRlKClcbiAgfSxcbiAgc2hvdzogZnVuY3Rpb24oKSB7XG4gICAgJCgnI2xvYWRpbmcnKS5zaG93KClcbiAgfSxcbiAgc2V0dXA6IGZ1bmN0aW9uKCkge1xuICAgIGlmICghTG9hZGluZy5sb2FkZXIpIExvYWRpbmcubG9hZGVyID0gbmV3IENhbnZhc0xvYWRlcignbG9hZGluZycpXG4gICAgTG9hZGluZy5sb2FkZXIuc2V0Q29sb3IoJyM0ZmI1YzAnKSAvLyBkZWZhdWx0IGlzICcjMDAwMDAwJ1xuICAgIExvYWRpbmcubG9hZGVyLnNldERpYW1ldGVyKDI4KSAvLyBkZWZhdWx0IGlzIDQwXG4gICAgTG9hZGluZy5sb2FkZXIuc2V0RGVuc2l0eSg0MSkgLy8gZGVmYXVsdCBpcyA0MFxuICAgIExvYWRpbmcubG9hZGVyLnNldFJhbmdlKDAuOSkgLy8gZGVmYXVsdCBpcyAxLjNcbiAgICBMb2FkaW5nLmxvYWRlci5zaG93KCkgLy8gSGlkZGVuIGJ5IGRlZmF1bHRcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMb2FkaW5nXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL01ldGFtYXBzL0xvYWRpbmcuanMiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 369 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });exports.InfoBox = exports.CheatSheet = undefined;var _find3 = __webpack_require__(28);var _find4 = _interopRequireDefault(_find3);var _templateObject = _taggedTemplateLiteral(['\\n      Captured map screenshot!\\n      <a id=\"map-screenshot-download-link\"\\n         href=\"', '\"\\n         download=\"', '\"\\n      >\\n        DOWNLOAD\\n      </a>'], ['\\n      Captured map screenshot!\\n      <a id=\"map-screenshot-download-link\"\\n         href=\"', '\"\\n         download=\"', '\"\\n      >\\n        DOWNLOAD\\n      </a>']);\n\nvar _outdent = __webpack_require__(148);var _outdent2 = _interopRequireDefault(_outdent);\n\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _AutoLayout = __webpack_require__(8);var _AutoLayout2 = _interopRequireDefault(_AutoLayout);\nvar _Create = __webpack_require__(173);var _Create2 = _interopRequireDefault(_Create);\nvar _DataModel = __webpack_require__(149);var _DataModel2 = _interopRequireDefault(_DataModel);\nvar _Map = __webpack_require__(370);var _Map2 = _interopRequireDefault(_Map);\nvar _Engine = __webpack_require__(150);var _Engine2 = _interopRequireDefault(_Engine);\nvar _Filter = __webpack_require__(356);var _Filter2 = _interopRequireDefault(_Filter);\nvar _GlobalUI = __webpack_require__(362);var _GlobalUI2 = _interopRequireDefault(_GlobalUI);\nvar _JIT = __webpack_require__(355);var _JIT2 = _interopRequireDefault(_JIT);\nvar _Loading = __webpack_require__(368);var _Loading2 = _interopRequireDefault(_Loading);\nvar _Realtime = __webpack_require__(435);var _Realtime2 = _interopRequireDefault(_Realtime);\nvar _Router = __webpack_require__(367);var _Router2 = _interopRequireDefault(_Router);\nvar _Selected = __webpack_require__(353);var _Selected2 = _interopRequireDefault(_Selected);\nvar _SynapseCard = __webpack_require__(569);var _SynapseCard2 = _interopRequireDefault(_SynapseCard);\nvar _TopicCard = __webpack_require__(566);var _TopicCard2 = _interopRequireDefault(_TopicCard);\nvar _Visualize = __webpack_require__(561);var _Visualize2 = _interopRequireDefault(_Visualize);\n\nvar _CheatSheet = __webpack_require__(570);var _CheatSheet2 = _interopRequireDefault(_CheatSheet);\nvar _InfoBox = __webpack_require__(409);var _InfoBox2 = _interopRequireDefault(_InfoBox);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}function _taggedTemplateLiteral(strings, raw) {return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } }));} /* global $ */\n\nvar Map = {\n  events: {\n    editedByActiveMapper: 'Metamaps:Map:events:editedByActiveMapper' },\n\n  init: function init(serverData) {\n    var self = Map;\n\n    $('#wrapper').mousedown(function (e) {\n      if (e.button === 1) return false;\n    });\n\n    $('.starMap').click(function () {\n      if ($(this).is('.starred')) self.unstar();else\n      self.star();\n    });\n\n    $('.sidebarFork').click(function () {\n      self.fork();\n    });\n\n    _GlobalUI2.default.CreateMap.emptyForkMapForm = $('#fork_map').html();\n\n    self.updateStar();\n\n    _InfoBox2.default.init(serverData, function updateThumbnail() {\n      self.uploadMapScreenshot();\n    });\n    _CheatSheet2.default.init(serverData);\n\n    $('.viewOnly .requestAccess').click(self.requestAccess);\n\n    $(document).on(Map.events.editedByActiveMapper, self.editedByActiveMapper);\n  },\n  requestAccess: function requestAccess() {\n    $('.viewOnly').removeClass('sendRequest').addClass('sentRequest');\n    var mapId = _Active2.default.Map.id;\n    $.post({\n      url: '/maps/' + mapId + '/access_request' });\n\n    _GlobalUI2.default.notifyUser('Map creator will be notified of your request');\n  },\n  setAccessRequest: function setAccessRequest(requests, activeMapper) {\n    var className = 'isViewOnly ';\n    if (activeMapper) {\n      var request = (0, _find4.default)(requests, function (r) {return r.user_id === activeMapper.id;});\n      if (!request) className += 'sendRequest';else\n      if (request && !request.answered) className += 'sentRequest';else\n      if (request && request.answered && !request.approved) className += 'requestDenied';\n    }\n    $('.viewOnly').removeClass('sendRequest sentRequest requestDenied').addClass(className);\n  },\n  launch: function launch(id) {\n    var start = function start(data) {\n      _Active2.default.Map = new _Map2.default(data.map);\n      _DataModel2.default.Mappers = new _DataModel2.default.MapperCollection(data.mappers);\n      _DataModel2.default.Collaborators = new _DataModel2.default.MapperCollection(data.collaborators);\n      _DataModel2.default.Topics = new _DataModel2.default.TopicCollection(data.topics);\n      _DataModel2.default.Synapses = new _DataModel2.default.SynapseCollection(data.synapses);\n      _DataModel2.default.Mappings = new _DataModel2.default.MappingCollection(data.mappings);\n      _DataModel2.default.Messages = data.messages;\n      _DataModel2.default.Stars = data.stars;\n      _DataModel2.default.attachCollectionEvents();\n\n      var map = _Active2.default.Map;\n      var mapper = _Active2.default.Mapper;\n\n      document.title = map.get('name') + ' | Metamaps';\n\n      // add class to .wrapper for specifying whether you can edit the map\n      if (map.authorizeToEdit(mapper)) {\n        $('.wrapper').addClass('canEditMap');\n      } else {\n        Map.setAccessRequest(data.requests, mapper);\n      }\n\n      // add class to .wrapper for specifying if the map can\n      // be collaborated on\n      if (map.get('permission') === 'commons') {\n        $('.wrapper').addClass('commonsMap');\n      }\n\n      Map.updateStar();\n\n      // set filter mapper H3 text\n      $('#filter_by_mapper h3').html('MAPPERS');\n\n      // build and render the visualization\n      _Visualize2.default.type = 'ForceDirected';\n      _JIT2.default.prepareVizData();\n\n      // update filters\n      _Filter2.default.reset();\n\n      // reset selected arrays\n      _Selected2.default.reset();\n\n      // set the proper mapinfobox content\n      _InfoBox2.default.load();\n\n      // these three update the actual filter box with the right list items\n      _Filter2.default.checkMetacodes();\n      _Filter2.default.checkSynapses();\n      _Filter2.default.checkMappers();\n\n      _Realtime2.default.startActiveMap();\n      _Loading2.default.hide();\n\n      // for mobile\n      $('#header_content').html(map.get('name'));\n    };\n\n    $.ajax({\n      url: '/maps/' + id + '/contains.json',\n      success: start });\n\n  },\n  end: function end() {\n    if (_Active2.default.Map) {\n      $('.wrapper').removeClass('canEditMap commonsMap');\n      _AutoLayout2.default.resetSpiral();\n\n      $('.rightclickmenu').remove();\n      _TopicCard2.default.hideCard();\n      _SynapseCard2.default.hideCard();\n      $('#new_topic').hide();\n      _Create2.default.newSynapse.hide();\n      _Filter2.default.close();\n      _InfoBox2.default.close();\n      _Realtime2.default.endActiveMap();\n      _Engine2.default.endActiveMap();\n      $('.viewOnly').removeClass('isViewOnly');\n    }\n  },\n  updateStar: function updateStar() {\n    if (!_Active2.default.Mapper || !_DataModel2.default.Stars) return;\n    // update the star/unstar icon\n    if (_DataModel2.default.Stars.find(function (s) {return s.user_id === _Active2.default.Mapper.id;})) {\n      $('.starMap').addClass('starred');\n      $('.starMap .tooltipsAbove').html('Unstar');\n    } else {\n      $('.starMap').removeClass('starred');\n      $('.starMap .tooltipsAbove').html('Star');\n    }\n  },\n  star: function star() {\n    var self = Map;\n\n    if (!_Active2.default.Map) return;\n    $.post('/maps/' + _Active2.default.Map.id + '/star');\n    _DataModel2.default.Stars.push({ user_id: _Active2.default.Mapper.id, map_id: _Active2.default.Map.id });\n    _DataModel2.default.Maps.Starred.add(_Active2.default.Map);\n    _GlobalUI2.default.notifyUser('Map is now starred');\n    self.updateStar();\n  },\n  unstar: function unstar() {\n    var self = Map;\n\n    if (!_Active2.default.Map) return;\n    $.post('/maps/' + _Active2.default.Map.id + '/unstar');\n    _DataModel2.default.Stars = _DataModel2.default.Stars.filter(function (s) {return s.user_id !== _Active2.default.Mapper.id;});\n    _DataModel2.default.Maps.Starred.remove(_Active2.default.Map);\n    self.updateStar();\n  },\n  fork: function fork() {\n    _GlobalUI2.default.openLightbox('forkmap');\n\n    var nodesData = '';\n    var synapsesData = '';\n    var nodesArray = [];\n    var synapsesArray = [];\n    // collect the unfiltered topics\n    _Visualize2.default.mGraph.graph.eachNode(function (n) {\n      // if the opacity is less than 1 then it's filtered\n      if (n.getData('alpha') === 1) {\n        var id = n.getData('topic').id;\n        nodesArray.push(id);\n        var x = void 0,y = void 0;\n        if (n.pos.x && n.pos.y) {\n          x = n.pos.x;\n          y = n.pos.y;\n        } else {\n          x = Math.cos(n.pos.theta) * n.pos.rho;\n          y = Math.sin(n.pos.theta) * n.pos.rho;\n        }\n        nodesData += id + '/' + x + '/' + y + ',';\n      }\n    });\n    // collect the unfiltered synapses\n    _DataModel2.default.Synapses.each(function (synapse) {\n      var desc = synapse.get('desc');\n\n      var descNotFiltered = _Filter2.default.visible.synapses.indexOf(desc) > -1;\n      // make sure that both topics are being added, otherwise, it\n      // doesn't make sense to add the synapse\n      var topicsNotFiltered = nodesArray.indexOf(synapse.get('topic1_id')) > -1;\n      topicsNotFiltered = topicsNotFiltered && nodesArray.indexOf(synapse.get('topic2_id')) > -1;\n      if (descNotFiltered && topicsNotFiltered) {\n        synapsesArray.push(synapse.id);\n      }\n    });\n\n    synapsesData = synapsesArray.join();\n    nodesData = nodesData.slice(0, -1);\n\n    _GlobalUI2.default.CreateMap.topicsToMap = nodesData;\n    _GlobalUI2.default.CreateMap.synapsesToMap = synapsesData;\n  },\n  leavePrivateMap: function leavePrivateMap() {\n    var map = _Active2.default.Map;\n    _DataModel2.default.Maps.Active.remove(map);\n    _DataModel2.default.Maps.Featured.remove(map);\n    _Router2.default.home();\n    _GlobalUI2.default.notifyUser('Sorry! That map has been changed to Private.');\n  },\n  cantEditNow: function cantEditNow() {\n    _Realtime2.default.turnOff(true); // true is for 'silence'\n    _GlobalUI2.default.notifyUser('Map was changed to Public. Editing is disabled.');\n    _Active2.default.Map.trigger('changeByOther');\n  },\n  canEditNow: function canEditNow() {\n    var confirmString = \"You've been granted permission to edit this map. \";\n    confirmString += 'Do you want to reload and enable realtime collaboration?';\n    var c = window.confirm(confirmString);\n    if (c) {\n      _Router2.default.maps(_Active2.default.Map.id);\n    }\n  },\n  editedByActiveMapper: function editedByActiveMapper() {\n    if (_Active2.default.Mapper) {\n      _DataModel2.default.Mappers.add(_Active2.default.Mapper);\n    }\n  },\n  exportImage: function exportImage() {\n    Map.uploadMapScreenshot();\n    Map.offerScreenshotDownload();\n    _GlobalUI2.default.notifyUser('Note: this button is going away. Check the map card or the import box for setting the map thumbnail or downloading a screenshot.');\n  },\n  offerScreenshotDownload: function offerScreenshotDownload() {\n    var canvas = Map.getMapCanvasForScreenshots();\n    var filename = Map.getMapScreenshotFilename(_Active2.default.Map);\n\n    var downloadMessage = (0, _outdent2.default)(_templateObject,\n\n\n    canvas.canvas.toDataURL(),\n    filename);\n\n\n\n    _GlobalUI2.default.notifyUser(downloadMessage);\n  },\n  uploadMapScreenshot: function uploadMapScreenshot() {\n    var canvas = Map.getMapCanvasForScreenshots();\n    var filename = Map.getMapScreenshotFilename(_Active2.default.Map);\n\n    canvas.canvas.toBlob(function (imageBlob) {\n      var formData = new window.FormData();\n      formData.append('map[screenshot]', imageBlob, filename);\n      $.ajax({\n        type: 'PATCH',\n        dataType: 'json',\n        url: '/maps/' + _Active2.default.Map.id,\n        data: formData,\n        processData: false,\n        contentType: false,\n        success: function success(data) {\n          _GlobalUI2.default.notifyUser('Successfully updated map screenshot.');\n        },\n        error: function error() {\n          _GlobalUI2.default.notifyUser('Failed to update map screenshot.');\n        } });\n\n    });\n  },\n  getMapCanvasForScreenshots: function getMapCanvasForScreenshots() {\n    var canvas = {};\n\n    canvas.canvas = document.createElement('canvas');\n    canvas.canvas.width = 1880; // 960\n    canvas.canvas.height = 1260; // 630\n\n    canvas.scaleOffsetX = 1;\n    canvas.scaleOffsetY = 1;\n    canvas.translateOffsetY = 0;\n    canvas.translateOffsetX = 0;\n    canvas.denySelected = true;\n\n    canvas.getSize = function () {\n      if (this.size) return this.size;\n      var canvas = this.canvas;\n      this.size = {\n        width: canvas.width,\n        height: canvas.height };\n\n      return this.size;\n    };\n    canvas.scale = function (x, y) {\n      var px = this.scaleOffsetX * x;\n      var py = this.scaleOffsetY * y;\n      var dx = this.translateOffsetX * (x - 1) / px;\n      var dy = this.translateOffsetY * (y - 1) / py;\n      this.scaleOffsetX = px;\n      this.scaleOffsetY = py;\n      this.getCtx().scale(x, y);\n      this.translate(dx, dy);\n    };\n    canvas.translate = function (x, y) {\n      var sx = this.scaleOffsetX;\n      var sy = this.scaleOffsetY;\n      this.translateOffsetX += x * sx;\n      this.translateOffsetY += y * sy;\n      this.getCtx().translate(x, y);\n    };\n    canvas.getCtx = function () {\n      return this.canvas.getContext('2d');\n    };\n    // center it\n    canvas.getCtx().translate(1880 / 2, 1260 / 2);\n\n    var mGraph = _Visualize2.default.mGraph;\n\n    var id = mGraph.root;\n    var root = mGraph.graph.getNode(id);\n    var T = !!root.visited;\n\n    // pass true to avoid basing it on a selection\n    _JIT2.default.zoomExtents(null, canvas, true);\n\n    var c = canvas.canvas;\n    var ctx = canvas.getCtx();\n    var scale = canvas.scaleOffsetX;\n\n    // draw a grey background\n    ctx.fillStyle = '#d8d9da';\n    var xPoint = -(c.width / scale) / 2 - canvas.translateOffsetX / scale;\n    var yPoint = -(c.height / scale) / 2 - canvas.translateOffsetY / scale;\n    ctx.fillRect(xPoint, yPoint, c.width / scale, c.height / scale);\n\n    // draw the graph\n    mGraph.graph.eachNode(function (node) {\n      var nodeAlpha = node.getData('alpha');\n      node.eachAdjacency(function (adj) {\n        var nodeTo = adj.nodeTo;\n        if (!!nodeTo.visited === T && node.drawn && nodeTo.drawn) {\n          mGraph.fx.plotLine(adj, canvas);\n        }\n      });\n      if (node.drawn) {\n        mGraph.fx.plotNode(node, canvas);\n      }\n      if (!mGraph.labelsHidden) {\n        if (node.drawn && nodeAlpha >= 0.95) {\n          mGraph.labels.plotLabel(canvas, node);\n        } else {\n          mGraph.labels.hideLabel(node, false);\n        }\n      }\n      node.visited = !T;\n    });\n\n    return canvas;\n  },\n  getMapScreenshotFilename: function getMapScreenshotFilename(map) {\n    var today = new Date();\n    var dd = today.getDate();\n    var mm = today.getMonth() + 1; // January is 0!\n    var yyyy = today.getFullYear();\n    if (dd < 10) {\n      dd = '0' + dd;\n    }\n    if (mm < 10) {\n      mm = '0' + mm;\n    }\n    today = mm + '/' + dd + '/' + yyyy;\n\n    var mapName = map.get('name').split(' ').join(['-']);\n    var filename = 'metamap-' + map.id + '-' + mapName + '-' + today + '.png';\n    return filename;\n  } };exports.\n\n\nCheatSheet = _CheatSheet2.default;exports.InfoBox = _InfoBox2.default;exports.default =\nMap;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzY5LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvTWFwL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGdsb2JhbCAkICovXG5cbmltcG9ydCBvdXRkZW50IGZyb20gJ291dGRlbnQnXG5pbXBvcnQgeyBmaW5kIGFzIF9maW5kIH0gZnJvbSAnbG9kYXNoJ1xuXG5pbXBvcnQgQWN0aXZlIGZyb20gJy4uL0FjdGl2ZSdcbmltcG9ydCBBdXRvTGF5b3V0IGZyb20gJy4uL0F1dG9MYXlvdXQnXG5pbXBvcnQgQ3JlYXRlIGZyb20gJy4uL0NyZWF0ZSdcbmltcG9ydCBEYXRhTW9kZWwgZnJvbSAnLi4vRGF0YU1vZGVsJ1xuaW1wb3J0IERhdGFNb2RlbE1hcCBmcm9tICcuLi9EYXRhTW9kZWwvTWFwJ1xuaW1wb3J0IEVuZ2luZSBmcm9tICcuLi9FbmdpbmUnXG5pbXBvcnQgRmlsdGVyIGZyb20gJy4uL0ZpbHRlcidcbmltcG9ydCBHbG9iYWxVSSBmcm9tICcuLi9HbG9iYWxVSSdcbmltcG9ydCBKSVQgZnJvbSAnLi4vSklUJ1xuaW1wb3J0IExvYWRpbmcgZnJvbSAnLi4vTG9hZGluZydcbmltcG9ydCBSZWFsdGltZSBmcm9tICcuLi9SZWFsdGltZSdcbmltcG9ydCBSb3V0ZXIgZnJvbSAnLi4vUm91dGVyJ1xuaW1wb3J0IFNlbGVjdGVkIGZyb20gJy4uL1NlbGVjdGVkJ1xuaW1wb3J0IFN5bmFwc2VDYXJkIGZyb20gJy4uL1N5bmFwc2VDYXJkJ1xuaW1wb3J0IFRvcGljQ2FyZCBmcm9tICcuLi9Ub3BpY0NhcmQnXG5pbXBvcnQgVmlzdWFsaXplIGZyb20gJy4uL1Zpc3VhbGl6ZSdcblxuaW1wb3J0IENoZWF0U2hlZXQgZnJvbSAnLi9DaGVhdFNoZWV0J1xuaW1wb3J0IEluZm9Cb3ggZnJvbSAnLi9JbmZvQm94J1xuXG5jb25zdCBNYXAgPSB7XG4gIGV2ZW50czoge1xuICAgIGVkaXRlZEJ5QWN0aXZlTWFwcGVyOiAnTWV0YW1hcHM6TWFwOmV2ZW50czplZGl0ZWRCeUFjdGl2ZU1hcHBlcidcbiAgfSxcbiAgaW5pdDogZnVuY3Rpb24oc2VydmVyRGF0YSkge1xuICAgIHZhciBzZWxmID0gTWFwXG5cbiAgICAkKCcjd3JhcHBlcicpLm1vdXNlZG93bihmdW5jdGlvbihlKSB7XG4gICAgICBpZiAoZS5idXR0b24gPT09IDEpIHJldHVybiBmYWxzZVxuICAgIH0pXG5cbiAgICAkKCcuc3Rhck1hcCcpLmNsaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCQodGhpcykuaXMoJy5zdGFycmVkJykpIHNlbGYudW5zdGFyKClcbiAgICAgIGVsc2Ugc2VsZi5zdGFyKClcbiAgICB9KVxuXG4gICAgJCgnLnNpZGViYXJGb3JrJykuY2xpY2soZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmZvcmsoKVxuICAgIH0pXG5cbiAgICBHbG9iYWxVSS5DcmVhdGVNYXAuZW1wdHlGb3JrTWFwRm9ybSA9ICQoJyNmb3JrX21hcCcpLmh0bWwoKVxuXG4gICAgc2VsZi51cGRhdGVTdGFyKClcblxuICAgIEluZm9Cb3guaW5pdChzZXJ2ZXJEYXRhLCBmdW5jdGlvbiB1cGRhdGVUaHVtYm5haWwoKSB7XG4gICAgICBzZWxmLnVwbG9hZE1hcFNjcmVlbnNob3QoKVxuICAgIH0pXG4gICAgQ2hlYXRTaGVldC5pbml0KHNlcnZlckRhdGEpXG5cbiAgICAkKCcudmlld09ubHkgLnJlcXVlc3RBY2Nlc3MnKS5jbGljayhzZWxmLnJlcXVlc3RBY2Nlc3MpXG5cbiAgICAkKGRvY3VtZW50KS5vbihNYXAuZXZlbnRzLmVkaXRlZEJ5QWN0aXZlTWFwcGVyLCBzZWxmLmVkaXRlZEJ5QWN0aXZlTWFwcGVyKVxuICB9LFxuICByZXF1ZXN0QWNjZXNzOiBmdW5jdGlvbigpIHtcbiAgICAkKCcudmlld09ubHknKS5yZW1vdmVDbGFzcygnc2VuZFJlcXVlc3QnKS5hZGRDbGFzcygnc2VudFJlcXVlc3QnKVxuICAgIGNvbnN0IG1hcElkID0gQWN0aXZlLk1hcC5pZFxuICAgICQucG9zdCh7XG4gICAgICB1cmw6IGAvbWFwcy8ke21hcElkfS9hY2Nlc3NfcmVxdWVzdGBcbiAgICB9KVxuICAgIEdsb2JhbFVJLm5vdGlmeVVzZXIoJ01hcCBjcmVhdG9yIHdpbGwgYmUgbm90aWZpZWQgb2YgeW91ciByZXF1ZXN0JylcbiAgfSxcbiAgc2V0QWNjZXNzUmVxdWVzdDogZnVuY3Rpb24ocmVxdWVzdHMsIGFjdGl2ZU1hcHBlcikge1xuICAgIGxldCBjbGFzc05hbWUgPSAnaXNWaWV3T25seSAnXG4gICAgaWYgKGFjdGl2ZU1hcHBlcikge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IF9maW5kKHJlcXVlc3RzLCByID0+IHIudXNlcl9pZCA9PT0gYWN0aXZlTWFwcGVyLmlkKVxuICAgICAgaWYgKCFyZXF1ZXN0KSBjbGFzc05hbWUgKz0gJ3NlbmRSZXF1ZXN0J1xuICAgICAgZWxzZSBpZiAocmVxdWVzdCAmJiAhcmVxdWVzdC5hbnN3ZXJlZCkgY2xhc3NOYW1lICs9ICdzZW50UmVxdWVzdCdcbiAgICAgIGVsc2UgaWYgKHJlcXVlc3QgJiYgcmVxdWVzdC5hbnN3ZXJlZCAmJiAhcmVxdWVzdC5hcHByb3ZlZCkgY2xhc3NOYW1lICs9ICdyZXF1ZXN0RGVuaWVkJ1xuICAgIH1cbiAgICAkKCcudmlld09ubHknKS5yZW1vdmVDbGFzcygnc2VuZFJlcXVlc3Qgc2VudFJlcXVlc3QgcmVxdWVzdERlbmllZCcpLmFkZENsYXNzKGNsYXNzTmFtZSlcbiAgfSxcbiAgbGF1bmNoOiBmdW5jdGlvbihpZCkge1xuICAgIHZhciBzdGFydCA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgIEFjdGl2ZS5NYXAgPSBuZXcgRGF0YU1vZGVsTWFwKGRhdGEubWFwKVxuICAgICAgRGF0YU1vZGVsLk1hcHBlcnMgPSBuZXcgRGF0YU1vZGVsLk1hcHBlckNvbGxlY3Rpb24oZGF0YS5tYXBwZXJzKVxuICAgICAgRGF0YU1vZGVsLkNvbGxhYm9yYXRvcnMgPSBuZXcgRGF0YU1vZGVsLk1hcHBlckNvbGxlY3Rpb24oZGF0YS5jb2xsYWJvcmF0b3JzKVxuICAgICAgRGF0YU1vZGVsLlRvcGljcyA9IG5ldyBEYXRhTW9kZWwuVG9waWNDb2xsZWN0aW9uKGRhdGEudG9waWNzKVxuICAgICAgRGF0YU1vZGVsLlN5bmFwc2VzID0gbmV3IERhdGFNb2RlbC5TeW5hcHNlQ29sbGVjdGlvbihkYXRhLnN5bmFwc2VzKVxuICAgICAgRGF0YU1vZGVsLk1hcHBpbmdzID0gbmV3IERhdGFNb2RlbC5NYXBwaW5nQ29sbGVjdGlvbihkYXRhLm1hcHBpbmdzKVxuICAgICAgRGF0YU1vZGVsLk1lc3NhZ2VzID0gZGF0YS5tZXNzYWdlc1xuICAgICAgRGF0YU1vZGVsLlN0YXJzID0gZGF0YS5zdGFyc1xuICAgICAgRGF0YU1vZGVsLmF0dGFjaENvbGxlY3Rpb25FdmVudHMoKVxuXG4gICAgICB2YXIgbWFwID0gQWN0aXZlLk1hcFxuICAgICAgdmFyIG1hcHBlciA9IEFjdGl2ZS5NYXBwZXJcblxuICAgICAgZG9jdW1lbnQudGl0bGUgPSBtYXAuZ2V0KCduYW1lJykgKyAnIHwgTWV0YW1hcHMnXG5cbiAgICAgIC8vIGFkZCBjbGFzcyB0byAud3JhcHBlciBmb3Igc3BlY2lmeWluZyB3aGV0aGVyIHlvdSBjYW4gZWRpdCB0aGUgbWFwXG4gICAgICBpZiAobWFwLmF1dGhvcml6ZVRvRWRpdChtYXBwZXIpKSB7XG4gICAgICAgICQoJy53cmFwcGVyJykuYWRkQ2xhc3MoJ2NhbkVkaXRNYXAnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTWFwLnNldEFjY2Vzc1JlcXVlc3QoZGF0YS5yZXF1ZXN0cywgbWFwcGVyKVxuICAgICAgfVxuXG4gICAgICAvLyBhZGQgY2xhc3MgdG8gLndyYXBwZXIgZm9yIHNwZWNpZnlpbmcgaWYgdGhlIG1hcCBjYW5cbiAgICAgIC8vIGJlIGNvbGxhYm9yYXRlZCBvblxuICAgICAgaWYgKG1hcC5nZXQoJ3Blcm1pc3Npb24nKSA9PT0gJ2NvbW1vbnMnKSB7XG4gICAgICAgICQoJy53cmFwcGVyJykuYWRkQ2xhc3MoJ2NvbW1vbnNNYXAnKVxuICAgICAgfVxuXG4gICAgICBNYXAudXBkYXRlU3RhcigpXG5cbiAgICAgIC8vIHNldCBmaWx0ZXIgbWFwcGVyIEgzIHRleHRcbiAgICAgICQoJyNmaWx0ZXJfYnlfbWFwcGVyIGgzJykuaHRtbCgnTUFQUEVSUycpXG5cbiAgICAgIC8vIGJ1aWxkIGFuZCByZW5kZXIgdGhlIHZpc3VhbGl6YXRpb25cbiAgICAgIFZpc3VhbGl6ZS50eXBlID0gJ0ZvcmNlRGlyZWN0ZWQnXG4gICAgICBKSVQucHJlcGFyZVZpekRhdGEoKVxuXG4gICAgICAvLyB1cGRhdGUgZmlsdGVyc1xuICAgICAgRmlsdGVyLnJlc2V0KClcblxuICAgICAgLy8gcmVzZXQgc2VsZWN0ZWQgYXJyYXlzXG4gICAgICBTZWxlY3RlZC5yZXNldCgpXG5cbiAgICAgIC8vIHNldCB0aGUgcHJvcGVyIG1hcGluZm9ib3ggY29udGVudFxuICAgICAgSW5mb0JveC5sb2FkKClcblxuICAgICAgLy8gdGhlc2UgdGhyZWUgdXBkYXRlIHRoZSBhY3R1YWwgZmlsdGVyIGJveCB3aXRoIHRoZSByaWdodCBsaXN0IGl0ZW1zXG4gICAgICBGaWx0ZXIuY2hlY2tNZXRhY29kZXMoKVxuICAgICAgRmlsdGVyLmNoZWNrU3luYXBzZXMoKVxuICAgICAgRmlsdGVyLmNoZWNrTWFwcGVycygpXG5cbiAgICAgIFJlYWx0aW1lLnN0YXJ0QWN0aXZlTWFwKClcbiAgICAgIExvYWRpbmcuaGlkZSgpXG5cbiAgICAgIC8vIGZvciBtb2JpbGVcbiAgICAgICQoJyNoZWFkZXJfY29udGVudCcpLmh0bWwobWFwLmdldCgnbmFtZScpKVxuICAgIH1cblxuICAgICQuYWpheCh7XG4gICAgICB1cmw6ICcvbWFwcy8nICsgaWQgKyAnL2NvbnRhaW5zLmpzb24nLFxuICAgICAgc3VjY2Vzczogc3RhcnRcbiAgICB9KVxuICB9LFxuICBlbmQ6IGZ1bmN0aW9uKCkge1xuICAgIGlmIChBY3RpdmUuTWFwKSB7XG4gICAgICAkKCcud3JhcHBlcicpLnJlbW92ZUNsYXNzKCdjYW5FZGl0TWFwIGNvbW1vbnNNYXAnKVxuICAgICAgQXV0b0xheW91dC5yZXNldFNwaXJhbCgpXG5cbiAgICAgICQoJy5yaWdodGNsaWNrbWVudScpLnJlbW92ZSgpXG4gICAgICBUb3BpY0NhcmQuaGlkZUNhcmQoKVxuICAgICAgU3luYXBzZUNhcmQuaGlkZUNhcmQoKVxuICAgICAgJCgnI25ld190b3BpYycpLmhpZGUoKVxuICAgICAgQ3JlYXRlLm5ld1N5bmFwc2UuaGlkZSgpXG4gICAgICBGaWx0ZXIuY2xvc2UoKVxuICAgICAgSW5mb0JveC5jbG9zZSgpXG4gICAgICBSZWFsdGltZS5lbmRBY3RpdmVNYXAoKVxuICAgICAgRW5naW5lLmVuZEFjdGl2ZU1hcCgpXG4gICAgICAkKCcudmlld09ubHknKS5yZW1vdmVDbGFzcygnaXNWaWV3T25seScpXG4gICAgfVxuICB9LFxuICB1cGRhdGVTdGFyOiBmdW5jdGlvbigpIHtcbiAgICBpZiAoIUFjdGl2ZS5NYXBwZXIgfHwgIURhdGFNb2RlbC5TdGFycykgcmV0dXJuXG4gICAgLy8gdXBkYXRlIHRoZSBzdGFyL3Vuc3RhciBpY29uXG4gICAgaWYgKERhdGFNb2RlbC5TdGFycy5maW5kKGZ1bmN0aW9uKHMpIHsgcmV0dXJuIHMudXNlcl9pZCA9PT0gQWN0aXZlLk1hcHBlci5pZCB9KSkge1xuICAgICAgJCgnLnN0YXJNYXAnKS5hZGRDbGFzcygnc3RhcnJlZCcpXG4gICAgICAkKCcuc3Rhck1hcCAudG9vbHRpcHNBYm92ZScpLmh0bWwoJ1Vuc3RhcicpXG4gICAgfSBlbHNlIHtcbiAgICAgICQoJy5zdGFyTWFwJykucmVtb3ZlQ2xhc3MoJ3N0YXJyZWQnKVxuICAgICAgJCgnLnN0YXJNYXAgLnRvb2x0aXBzQWJvdmUnKS5odG1sKCdTdGFyJylcbiAgICB9XG4gIH0sXG4gIHN0YXI6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gTWFwXG5cbiAgICBpZiAoIUFjdGl2ZS5NYXApIHJldHVyblxuICAgICQucG9zdCgnL21hcHMvJyArIEFjdGl2ZS5NYXAuaWQgKyAnL3N0YXInKVxuICAgIERhdGFNb2RlbC5TdGFycy5wdXNoKHsgdXNlcl9pZDogQWN0aXZlLk1hcHBlci5pZCwgbWFwX2lkOiBBY3RpdmUuTWFwLmlkIH0pXG4gICAgRGF0YU1vZGVsLk1hcHMuU3RhcnJlZC5hZGQoQWN0aXZlLk1hcClcbiAgICBHbG9iYWxVSS5ub3RpZnlVc2VyKCdNYXAgaXMgbm93IHN0YXJyZWQnKVxuICAgIHNlbGYudXBkYXRlU3RhcigpXG4gIH0sXG4gIHVuc3RhcjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSBNYXBcblxuICAgIGlmICghQWN0aXZlLk1hcCkgcmV0dXJuXG4gICAgJC5wb3N0KCcvbWFwcy8nICsgQWN0aXZlLk1hcC5pZCArICcvdW5zdGFyJylcbiAgICBEYXRhTW9kZWwuU3RhcnMgPSBEYXRhTW9kZWwuU3RhcnMuZmlsdGVyKGZ1bmN0aW9uKHMpIHsgcmV0dXJuIHMudXNlcl9pZCAhPT0gQWN0aXZlLk1hcHBlci5pZCB9KVxuICAgIERhdGFNb2RlbC5NYXBzLlN0YXJyZWQucmVtb3ZlKEFjdGl2ZS5NYXApXG4gICAgc2VsZi51cGRhdGVTdGFyKClcbiAgfSxcbiAgZm9yazogZnVuY3Rpb24oKSB7XG4gICAgR2xvYmFsVUkub3BlbkxpZ2h0Ym94KCdmb3JrbWFwJylcblxuICAgIGxldCBub2Rlc0RhdGEgPSAnJ1xuICAgIGxldCBzeW5hcHNlc0RhdGEgPSAnJ1xuICAgIGxldCBub2Rlc0FycmF5ID0gW11cbiAgICBsZXQgc3luYXBzZXNBcnJheSA9IFtdXG4gICAgLy8gY29sbGVjdCB0aGUgdW5maWx0ZXJlZCB0b3BpY3NcbiAgICBWaXN1YWxpemUubUdyYXBoLmdyYXBoLmVhY2hOb2RlKGZ1bmN0aW9uKG4pIHtcbiAgICAgIC8vIGlmIHRoZSBvcGFjaXR5IGlzIGxlc3MgdGhhbiAxIHRoZW4gaXQncyBmaWx0ZXJlZFxuICAgICAgaWYgKG4uZ2V0RGF0YSgnYWxwaGEnKSA9PT0gMSkge1xuICAgICAgICB2YXIgaWQgPSBuLmdldERhdGEoJ3RvcGljJykuaWRcbiAgICAgICAgbm9kZXNBcnJheS5wdXNoKGlkKVxuICAgICAgICBsZXQgeCwgeVxuICAgICAgICBpZiAobi5wb3MueCAmJiBuLnBvcy55KSB7XG4gICAgICAgICAgeCA9IG4ucG9zLnhcbiAgICAgICAgICB5ID0gbi5wb3MueVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHggPSBNYXRoLmNvcyhuLnBvcy50aGV0YSkgKiBuLnBvcy5yaG9cbiAgICAgICAgICB5ID0gTWF0aC5zaW4obi5wb3MudGhldGEpICogbi5wb3MucmhvXG4gICAgICAgIH1cbiAgICAgICAgbm9kZXNEYXRhICs9IGlkICsgJy8nICsgeCArICcvJyArIHkgKyAnLCdcbiAgICAgIH1cbiAgICB9KVxuICAgIC8vIGNvbGxlY3QgdGhlIHVuZmlsdGVyZWQgc3luYXBzZXNcbiAgICBEYXRhTW9kZWwuU3luYXBzZXMuZWFjaChmdW5jdGlvbihzeW5hcHNlKSB7XG4gICAgICB2YXIgZGVzYyA9IHN5bmFwc2UuZ2V0KCdkZXNjJylcblxuICAgICAgdmFyIGRlc2NOb3RGaWx0ZXJlZCA9IEZpbHRlci52aXNpYmxlLnN5bmFwc2VzLmluZGV4T2YoZGVzYykgPiAtMVxuICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgYm90aCB0b3BpY3MgYXJlIGJlaW5nIGFkZGVkLCBvdGhlcndpc2UsIGl0XG4gICAgICAvLyBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gYWRkIHRoZSBzeW5hcHNlXG4gICAgICB2YXIgdG9waWNzTm90RmlsdGVyZWQgPSBub2Rlc0FycmF5LmluZGV4T2Yoc3luYXBzZS5nZXQoJ3RvcGljMV9pZCcpKSA+IC0xXG4gICAgICB0b3BpY3NOb3RGaWx0ZXJlZCA9IHRvcGljc05vdEZpbHRlcmVkICYmIG5vZGVzQXJyYXkuaW5kZXhPZihzeW5hcHNlLmdldCgndG9waWMyX2lkJykpID4gLTFcbiAgICAgIGlmIChkZXNjTm90RmlsdGVyZWQgJiYgdG9waWNzTm90RmlsdGVyZWQpIHtcbiAgICAgICAgc3luYXBzZXNBcnJheS5wdXNoKHN5bmFwc2UuaWQpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHN5bmFwc2VzRGF0YSA9IHN5bmFwc2VzQXJyYXkuam9pbigpXG4gICAgbm9kZXNEYXRhID0gbm9kZXNEYXRhLnNsaWNlKDAsIC0xKVxuXG4gICAgR2xvYmFsVUkuQ3JlYXRlTWFwLnRvcGljc1RvTWFwID0gbm9kZXNEYXRhXG4gICAgR2xvYmFsVUkuQ3JlYXRlTWFwLnN5bmFwc2VzVG9NYXAgPSBzeW5hcHNlc0RhdGFcbiAgfSxcbiAgbGVhdmVQcml2YXRlTWFwOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbWFwID0gQWN0aXZlLk1hcFxuICAgIERhdGFNb2RlbC5NYXBzLkFjdGl2ZS5yZW1vdmUobWFwKVxuICAgIERhdGFNb2RlbC5NYXBzLkZlYXR1cmVkLnJlbW92ZShtYXApXG4gICAgUm91dGVyLmhvbWUoKVxuICAgIEdsb2JhbFVJLm5vdGlmeVVzZXIoJ1NvcnJ5ISBUaGF0IG1hcCBoYXMgYmVlbiBjaGFuZ2VkIHRvIFByaXZhdGUuJylcbiAgfSxcbiAgY2FudEVkaXROb3c6IGZ1bmN0aW9uKCkge1xuICAgIFJlYWx0aW1lLnR1cm5PZmYodHJ1ZSkgLy8gdHJ1ZSBpcyBmb3IgJ3NpbGVuY2UnXG4gICAgR2xvYmFsVUkubm90aWZ5VXNlcignTWFwIHdhcyBjaGFuZ2VkIHRvIFB1YmxpYy4gRWRpdGluZyBpcyBkaXNhYmxlZC4nKVxuICAgIEFjdGl2ZS5NYXAudHJpZ2dlcignY2hhbmdlQnlPdGhlcicpXG4gIH0sXG4gIGNhbkVkaXROb3c6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjb25maXJtU3RyaW5nID0gXCJZb3UndmUgYmVlbiBncmFudGVkIHBlcm1pc3Npb24gdG8gZWRpdCB0aGlzIG1hcC4gXCJcbiAgICBjb25maXJtU3RyaW5nICs9ICdEbyB5b3Ugd2FudCB0byByZWxvYWQgYW5kIGVuYWJsZSByZWFsdGltZSBjb2xsYWJvcmF0aW9uPydcbiAgICB2YXIgYyA9IHdpbmRvdy5jb25maXJtKGNvbmZpcm1TdHJpbmcpXG4gICAgaWYgKGMpIHtcbiAgICAgIFJvdXRlci5tYXBzKEFjdGl2ZS5NYXAuaWQpXG4gICAgfVxuICB9LFxuICBlZGl0ZWRCeUFjdGl2ZU1hcHBlcjogZnVuY3Rpb24oKSB7XG4gICAgaWYgKEFjdGl2ZS5NYXBwZXIpIHtcbiAgICAgIERhdGFNb2RlbC5NYXBwZXJzLmFkZChBY3RpdmUuTWFwcGVyKVxuICAgIH1cbiAgfSxcbiAgZXhwb3J0SW1hZ2U6IGZ1bmN0aW9uKCkge1xuICAgIE1hcC51cGxvYWRNYXBTY3JlZW5zaG90KClcbiAgICBNYXAub2ZmZXJTY3JlZW5zaG90RG93bmxvYWQoKVxuICAgIEdsb2JhbFVJLm5vdGlmeVVzZXIoJ05vdGU6IHRoaXMgYnV0dG9uIGlzIGdvaW5nIGF3YXkuIENoZWNrIHRoZSBtYXAgY2FyZCBvciB0aGUgaW1wb3J0IGJveCBmb3Igc2V0dGluZyB0aGUgbWFwIHRodW1ibmFpbCBvciBkb3dubG9hZGluZyBhIHNjcmVlbnNob3QuJylcbiAgfSxcbiAgb2ZmZXJTY3JlZW5zaG90RG93bmxvYWQ6ICgpID0+IHtcbiAgICBjb25zdCBjYW52YXMgPSBNYXAuZ2V0TWFwQ2FudmFzRm9yU2NyZWVuc2hvdHMoKVxuICAgIGNvbnN0IGZpbGVuYW1lID0gTWFwLmdldE1hcFNjcmVlbnNob3RGaWxlbmFtZShBY3RpdmUuTWFwKVxuXG4gICAgdmFyIGRvd25sb2FkTWVzc2FnZSA9IG91dGRlbnRgXG4gICAgICBDYXB0dXJlZCBtYXAgc2NyZWVuc2hvdCFcbiAgICAgIDxhIGlkPVwibWFwLXNjcmVlbnNob3QtZG93bmxvYWQtbGlua1wiXG4gICAgICAgICBocmVmPVwiJHtjYW52YXMuY2FudmFzLnRvRGF0YVVSTCgpfVwiXG4gICAgICAgICBkb3dubG9hZD1cIiR7ZmlsZW5hbWV9XCJcbiAgICAgID5cbiAgICAgICAgRE9XTkxPQURcbiAgICAgIDwvYT5gXG4gICAgR2xvYmFsVUkubm90aWZ5VXNlcihkb3dubG9hZE1lc3NhZ2UpXG4gIH0sXG4gIHVwbG9hZE1hcFNjcmVlbnNob3Q6ICgpID0+IHtcbiAgICBjb25zdCBjYW52YXMgPSBNYXAuZ2V0TWFwQ2FudmFzRm9yU2NyZWVuc2hvdHMoKVxuICAgIGNvbnN0IGZpbGVuYW1lID0gTWFwLmdldE1hcFNjcmVlbnNob3RGaWxlbmFtZShBY3RpdmUuTWFwKVxuXG4gICAgY2FudmFzLmNhbnZhcy50b0Jsb2IoaW1hZ2VCbG9iID0+IHtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IHdpbmRvdy5Gb3JtRGF0YSgpXG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ21hcFtzY3JlZW5zaG90XScsIGltYWdlQmxvYiwgZmlsZW5hbWUpXG4gICAgICAkLmFqYXgoe1xuICAgICAgICB0eXBlOiAnUEFUQ0gnLFxuICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgICB1cmw6IGAvbWFwcy8ke0FjdGl2ZS5NYXAuaWR9YCxcbiAgICAgICAgZGF0YTogZm9ybURhdGEsXG4gICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcbiAgICAgICAgY29udGVudFR5cGU6IGZhbHNlLFxuICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgICAgR2xvYmFsVUkubm90aWZ5VXNlcignU3VjY2Vzc2Z1bGx5IHVwZGF0ZWQgbWFwIHNjcmVlbnNob3QuJylcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIEdsb2JhbFVJLm5vdGlmeVVzZXIoJ0ZhaWxlZCB0byB1cGRhdGUgbWFwIHNjcmVlbnNob3QuJylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9LFxuICBnZXRNYXBDYW52YXNGb3JTY3JlZW5zaG90czogKCkgPT4ge1xuICAgIHZhciBjYW52YXMgPSB7fVxuXG4gICAgY2FudmFzLmNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gICAgY2FudmFzLmNhbnZhcy53aWR0aCA9IDE4ODAgLy8gOTYwXG4gICAgY2FudmFzLmNhbnZhcy5oZWlnaHQgPSAxMjYwIC8vIDYzMFxuXG4gICAgY2FudmFzLnNjYWxlT2Zmc2V0WCA9IDFcbiAgICBjYW52YXMuc2NhbGVPZmZzZXRZID0gMVxuICAgIGNhbnZhcy50cmFuc2xhdGVPZmZzZXRZID0gMFxuICAgIGNhbnZhcy50cmFuc2xhdGVPZmZzZXRYID0gMFxuICAgIGNhbnZhcy5kZW55U2VsZWN0ZWQgPSB0cnVlXG5cbiAgICBjYW52YXMuZ2V0U2l6ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuc2l6ZSkgcmV0dXJuIHRoaXMuc2l6ZVxuICAgICAgdmFyIGNhbnZhcyA9IHRoaXMuY2FudmFzXG4gICAgICB0aGlzLnNpemUgPSB7XG4gICAgICAgIHdpZHRoOiBjYW52YXMud2lkdGgsXG4gICAgICAgIGhlaWdodDogY2FudmFzLmhlaWdodFxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc2l6ZVxuICAgIH1cbiAgICBjYW52YXMuc2NhbGUgPSBmdW5jdGlvbih4LCB5KSB7XG4gICAgICBjb25zdCBweCA9IHRoaXMuc2NhbGVPZmZzZXRYICogeFxuICAgICAgY29uc3QgcHkgPSB0aGlzLnNjYWxlT2Zmc2V0WSAqIHlcbiAgICAgIGNvbnN0IGR4ID0gdGhpcy50cmFuc2xhdGVPZmZzZXRYICogKHggLSAxKSAvIHB4XG4gICAgICBjb25zdCBkeSA9IHRoaXMudHJhbnNsYXRlT2Zmc2V0WSAqICh5IC0gMSkgLyBweVxuICAgICAgdGhpcy5zY2FsZU9mZnNldFggPSBweFxuICAgICAgdGhpcy5zY2FsZU9mZnNldFkgPSBweVxuICAgICAgdGhpcy5nZXRDdHgoKS5zY2FsZSh4LCB5KVxuICAgICAgdGhpcy50cmFuc2xhdGUoZHgsIGR5KVxuICAgIH1cbiAgICBjYW52YXMudHJhbnNsYXRlID0gZnVuY3Rpb24oeCwgeSkge1xuICAgICAgY29uc3Qgc3ggPSB0aGlzLnNjYWxlT2Zmc2V0WFxuICAgICAgY29uc3Qgc3kgPSB0aGlzLnNjYWxlT2Zmc2V0WVxuICAgICAgdGhpcy50cmFuc2xhdGVPZmZzZXRYICs9IHggKiBzeFxuICAgICAgdGhpcy50cmFuc2xhdGVPZmZzZXRZICs9IHkgKiBzeVxuICAgICAgdGhpcy5nZXRDdHgoKS50cmFuc2xhdGUoeCwgeSlcbiAgICB9XG4gICAgY2FudmFzLmdldEN0eCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJylcbiAgICB9XG4gICAgLy8gY2VudGVyIGl0XG4gICAgY2FudmFzLmdldEN0eCgpLnRyYW5zbGF0ZSgxODgwIC8gMiwgMTI2MCAvIDIpXG5cbiAgICB2YXIgbUdyYXBoID0gVmlzdWFsaXplLm1HcmFwaFxuXG4gICAgdmFyIGlkID0gbUdyYXBoLnJvb3RcbiAgICB2YXIgcm9vdCA9IG1HcmFwaC5ncmFwaC5nZXROb2RlKGlkKVxuICAgIHZhciBUID0gISFyb290LnZpc2l0ZWRcblxuICAgIC8vIHBhc3MgdHJ1ZSB0byBhdm9pZCBiYXNpbmcgaXQgb24gYSBzZWxlY3Rpb25cbiAgICBKSVQuem9vbUV4dGVudHMobnVsbCwgY2FudmFzLCB0cnVlKVxuXG4gICAgY29uc3QgYyA9IGNhbnZhcy5jYW52YXNcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q3R4KClcbiAgICBjb25zdCBzY2FsZSA9IGNhbnZhcy5zY2FsZU9mZnNldFhcblxuICAgIC8vIGRyYXcgYSBncmV5IGJhY2tncm91bmRcbiAgICBjdHguZmlsbFN0eWxlID0gJyNkOGQ5ZGEnXG4gICAgY29uc3QgeFBvaW50ID0gKC0oYy53aWR0aCAvIHNjYWxlKSAvIDIpIC0gKGNhbnZhcy50cmFuc2xhdGVPZmZzZXRYIC8gc2NhbGUpXG4gICAgY29uc3QgeVBvaW50ID0gKC0oYy5oZWlnaHQgLyBzY2FsZSkgLyAyKSAtIChjYW52YXMudHJhbnNsYXRlT2Zmc2V0WSAvIHNjYWxlKVxuICAgIGN0eC5maWxsUmVjdCh4UG9pbnQsIHlQb2ludCwgYy53aWR0aCAvIHNjYWxlLCBjLmhlaWdodCAvIHNjYWxlKVxuXG4gICAgLy8gZHJhdyB0aGUgZ3JhcGhcbiAgICBtR3JhcGguZ3JhcGguZWFjaE5vZGUoZnVuY3Rpb24obm9kZSkge1xuICAgICAgdmFyIG5vZGVBbHBoYSA9IG5vZGUuZ2V0RGF0YSgnYWxwaGEnKVxuICAgICAgbm9kZS5lYWNoQWRqYWNlbmN5KGZ1bmN0aW9uKGFkaikge1xuICAgICAgICB2YXIgbm9kZVRvID0gYWRqLm5vZGVUb1xuICAgICAgICBpZiAoISFub2RlVG8udmlzaXRlZCA9PT0gVCAmJiBub2RlLmRyYXduICYmIG5vZGVUby5kcmF3bikge1xuICAgICAgICAgIG1HcmFwaC5meC5wbG90TGluZShhZGosIGNhbnZhcylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIGlmIChub2RlLmRyYXduKSB7XG4gICAgICAgIG1HcmFwaC5meC5wbG90Tm9kZShub2RlLCBjYW52YXMpXG4gICAgICB9XG4gICAgICBpZiAoIW1HcmFwaC5sYWJlbHNIaWRkZW4pIHtcbiAgICAgICAgaWYgKG5vZGUuZHJhd24gJiYgbm9kZUFscGhhID49IDAuOTUpIHtcbiAgICAgICAgICBtR3JhcGgubGFiZWxzLnBsb3RMYWJlbChjYW52YXMsIG5vZGUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbUdyYXBoLmxhYmVscy5oaWRlTGFiZWwobm9kZSwgZmFsc2UpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5vZGUudmlzaXRlZCA9ICFUXG4gICAgfSlcblxuICAgIHJldHVybiBjYW52YXNcbiAgfSxcbiAgZ2V0TWFwU2NyZWVuc2hvdEZpbGVuYW1lOiBtYXAgPT4ge1xuICAgIHZhciB0b2RheSA9IG5ldyBEYXRlKClcbiAgICB2YXIgZGQgPSB0b2RheS5nZXREYXRlKClcbiAgICB2YXIgbW0gPSB0b2RheS5nZXRNb250aCgpICsgMSAvLyBKYW51YXJ5IGlzIDAhXG4gICAgdmFyIHl5eXkgPSB0b2RheS5nZXRGdWxsWWVhcigpXG4gICAgaWYgKGRkIDwgMTApIHtcbiAgICAgIGRkID0gJzAnICsgZGRcbiAgICB9XG4gICAgaWYgKG1tIDwgMTApIHtcbiAgICAgIG1tID0gJzAnICsgbW1cbiAgICB9XG4gICAgdG9kYXkgPSBtbSArICcvJyArIGRkICsgJy8nICsgeXl5eVxuXG4gICAgdmFyIG1hcE5hbWUgPSBtYXAuZ2V0KCduYW1lJykuc3BsaXQoJyAnKS5qb2luKFsnLSddKVxuICAgIGNvbnN0IGZpbGVuYW1lID0gYG1ldGFtYXAtJHttYXAuaWR9LSR7bWFwTmFtZX0tJHt0b2RheX0ucG5nYFxuICAgIHJldHVybiBmaWxlbmFtZVxuICB9XG59XG5cbmV4cG9ydCB7IENoZWF0U2hlZXQsIEluZm9Cb3ggfVxuZXhwb3J0IGRlZmF1bHQgTWFwXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL01ldGFtYXBzL01hcC9pbmRleC5qcyJdLCJtYXBwaW5ncyI6Ijs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 370 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _omit2 = __webpack_require__(371);var _omit3 = _interopRequireDefault(_omit2);\n\n\nvar _backbone = __webpack_require__(1);var _backbone2 = _interopRequireDefault(_backbone);\n\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _InfoBox = __webpack_require__(409);var _InfoBox2 = _interopRequireDefault(_InfoBox);\nvar _Mapper = __webpack_require__(434);var _Mapper2 = _interopRequireDefault(_Mapper);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}try {_backbone2.default.$ = window.$;} catch (err) {} /* global $ */\n\nvar Map = _backbone2.default.Model.extend({\n  urlRoot: '/maps',\n  blacklist: ['created_at', 'updated_at', 'created_at_clean', 'updated_at_clean', 'user_name', 'contributor_count', 'topic_count', 'synapse_count', 'topics', 'synapses', 'mappings', 'mappers'],\n  toJSON: function toJSON(options) {\n    return (0, _omit3.default)(this.attributes, this.blacklist);\n  },\n  initialize: function initialize() {\n    this.on('changeByOther', this.updateView);\n  },\n  authorizeToEdit: function authorizeToEdit(mapper) {\n    if (mapper && (\n    this.get('permission') === 'commons' ||\n    (this.get('collaborator_ids') || []).includes(mapper.get('id')) ||\n    this.get('user_id') === mapper.get('id'))) {\n      return true;\n    } else {\n      return false;\n    }\n  },\n  authorizePermissionChange: function authorizePermissionChange(mapper) {\n    if (mapper && this.get('user_id') === mapper.get('id')) {\n      return true;\n    } else {\n      return false;\n    }\n  },\n  getUser: function getUser() {\n    return _Mapper2.default.get(this.get('user_id'));\n  },\n  updateView: function updateView() {\n    var map = _Active2.default.Map;\n    var isActiveMap = this.id === map.id;\n    if (isActiveMap) {\n      _InfoBox2.default.updateNameDescPerm(this.get('name'), this.get('desc'), this.get('permission'));\n      this.updateMapWrapper();\n      // mobile menu\n      $('#header_content').html(this.get('name'));\n      document.title = this.get('name') + ' | Metamaps';\n    }\n  },\n  updateMapWrapper: function updateMapWrapper() {\n    var map = _Active2.default.Map;\n    var isActiveMap = this.id === map.id;\n    var authorized = map && map.authorizeToEdit(_Active2.default.Mapper) ? 'canEditMap' : '';\n    var commonsMap = map && map.get('permission') === 'commons' ? 'commonsMap' : '';\n    if (isActiveMap) {\n      $('.wrapper').removeClass('canEditMap commonsMap').addClass(authorized + ' ' + commonsMap);\n    }\n  } });exports.default =\n\n\nMap;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzcwLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvRGF0YU1vZGVsL01hcC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBnbG9iYWwgJCAqL1xuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgQmFja2JvbmUgZnJvbSAnYmFja2JvbmUnXG50cnkgeyBCYWNrYm9uZS4kID0gd2luZG93LiQgfSBjYXRjaCAoZXJyKSB7fVxuXG5pbXBvcnQgQWN0aXZlIGZyb20gJy4uL0FjdGl2ZSdcbmltcG9ydCBJbmZvQm94IGZyb20gJy4uL01hcC9JbmZvQm94J1xuaW1wb3J0IE1hcHBlciBmcm9tICcuLi9NYXBwZXInXG5cbmNvbnN0IE1hcCA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG4gIHVybFJvb3Q6ICcvbWFwcycsXG4gIGJsYWNrbGlzdDogWydjcmVhdGVkX2F0JywgJ3VwZGF0ZWRfYXQnLCAnY3JlYXRlZF9hdF9jbGVhbicsICd1cGRhdGVkX2F0X2NsZWFuJywgJ3VzZXJfbmFtZScsICdjb250cmlidXRvcl9jb3VudCcsICd0b3BpY19jb3VudCcsICdzeW5hcHNlX2NvdW50JywgJ3RvcGljcycsICdzeW5hcHNlcycsICdtYXBwaW5ncycsICdtYXBwZXJzJ10sXG4gIHRvSlNPTjogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBfLm9taXQodGhpcy5hdHRyaWJ1dGVzLCB0aGlzLmJsYWNrbGlzdClcbiAgfSxcbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5vbignY2hhbmdlQnlPdGhlcicsIHRoaXMudXBkYXRlVmlldylcbiAgfSxcbiAgYXV0aG9yaXplVG9FZGl0OiBmdW5jdGlvbihtYXBwZXIpIHtcbiAgICBpZiAobWFwcGVyICYmIChcbiAgICAgIHRoaXMuZ2V0KCdwZXJtaXNzaW9uJykgPT09ICdjb21tb25zJyB8fFxuICAgICAgKHRoaXMuZ2V0KCdjb2xsYWJvcmF0b3JfaWRzJykgfHwgW10pLmluY2x1ZGVzKG1hcHBlci5nZXQoJ2lkJykpIHx8XG4gICAgICB0aGlzLmdldCgndXNlcl9pZCcpID09PSBtYXBwZXIuZ2V0KCdpZCcpKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9LFxuICBhdXRob3JpemVQZXJtaXNzaW9uQ2hhbmdlOiBmdW5jdGlvbihtYXBwZXIpIHtcbiAgICBpZiAobWFwcGVyICYmIHRoaXMuZ2V0KCd1c2VyX2lkJykgPT09IG1hcHBlci5nZXQoJ2lkJykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfSxcbiAgZ2V0VXNlcjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIE1hcHBlci5nZXQodGhpcy5nZXQoJ3VzZXJfaWQnKSlcbiAgfSxcbiAgdXBkYXRlVmlldzogZnVuY3Rpb24oKSB7XG4gICAgdmFyIG1hcCA9IEFjdGl2ZS5NYXBcbiAgICB2YXIgaXNBY3RpdmVNYXAgPSB0aGlzLmlkID09PSBtYXAuaWRcbiAgICBpZiAoaXNBY3RpdmVNYXApIHtcbiAgICAgIEluZm9Cb3gudXBkYXRlTmFtZURlc2NQZXJtKHRoaXMuZ2V0KCduYW1lJyksIHRoaXMuZ2V0KCdkZXNjJyksIHRoaXMuZ2V0KCdwZXJtaXNzaW9uJykpXG4gICAgICB0aGlzLnVwZGF0ZU1hcFdyYXBwZXIoKVxuICAgICAgLy8gbW9iaWxlIG1lbnVcbiAgICAgICQoJyNoZWFkZXJfY29udGVudCcpLmh0bWwodGhpcy5nZXQoJ25hbWUnKSlcbiAgICAgIGRvY3VtZW50LnRpdGxlID0gdGhpcy5nZXQoJ25hbWUnKSArICcgfCBNZXRhbWFwcydcbiAgICB9XG4gIH0sXG4gIHVwZGF0ZU1hcFdyYXBwZXI6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBtYXAgPSBBY3RpdmUuTWFwXG4gICAgdmFyIGlzQWN0aXZlTWFwID0gdGhpcy5pZCA9PT0gbWFwLmlkXG4gICAgdmFyIGF1dGhvcml6ZWQgPSBtYXAgJiYgbWFwLmF1dGhvcml6ZVRvRWRpdChBY3RpdmUuTWFwcGVyKSA/ICdjYW5FZGl0TWFwJyA6ICcnXG4gICAgdmFyIGNvbW1vbnNNYXAgPSBtYXAgJiYgbWFwLmdldCgncGVybWlzc2lvbicpID09PSAnY29tbW9ucycgPyAnY29tbW9uc01hcCcgOiAnJ1xuICAgIGlmIChpc0FjdGl2ZU1hcCkge1xuICAgICAgJCgnLndyYXBwZXInKS5yZW1vdmVDbGFzcygnY2FuRWRpdE1hcCBjb21tb25zTWFwJykuYWRkQ2xhc3MoYXV0aG9yaXplZCArICcgJyArIGNvbW1vbnNNYXApXG4gICAgfVxuICB9XG59KVxuXG5leHBvcnQgZGVmYXVsdCBNYXBcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBmcm9udGVuZC9zcmMvTWV0YW1hcHMvRGF0YU1vZGVsL01hcC5qcyJdLCJtYXBwaW5ncyI6Ijs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 371 */
/***/ function(module, exports, __webpack_require__) {

    eval("var arrayMap = __webpack_require__(127),\n    baseClone = __webpack_require__(372),\n    baseUnset = __webpack_require__(402),\n    castPath = __webpack_require__(120),\n    copyObject = __webpack_require__(376),\n    customOmitClone = __webpack_require__(405),\n    flatRest = __webpack_require__(407),\n    getAllKeysIn = __webpack_require__(387);\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n    CLONE_FLAT_FLAG = 2,\n    CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * The opposite of `_.pick`; this method creates an object composed of the\n * own and inherited enumerable property paths of `object` that are not omitted.\n *\n * **Note:** This method is considerably slower than `_.pick`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to omit.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omit(object, ['a', 'c']);\n * // => { 'b': '2' }\n */\nvar omit = flatRest(function(object, paths) {\n  var result = {};\n  if (object == null) {\n    return result;\n  }\n  var isDeep = false;\n  paths = arrayMap(paths, function(path) {\n    path = castPath(path, object);\n    isDeep || (isDeep = path.length > 1);\n    return path;\n  });\n  copyObject(object, getAllKeysIn(object), result);\n  if (isDeep) {\n    result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n  }\n  var length = paths.length;\n  while (length--) {\n    baseUnset(result, paths[length]);\n  }\n  return result;\n});\n\nmodule.exports = omit;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzcxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvb21pdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXJyYXlNYXAgPSByZXF1aXJlKCcuL19hcnJheU1hcCcpLFxuICAgIGJhc2VDbG9uZSA9IHJlcXVpcmUoJy4vX2Jhc2VDbG9uZScpLFxuICAgIGJhc2VVbnNldCA9IHJlcXVpcmUoJy4vX2Jhc2VVbnNldCcpLFxuICAgIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGN1c3RvbU9taXRDbG9uZSA9IHJlcXVpcmUoJy4vX2N1c3RvbU9taXRDbG9uZScpLFxuICAgIGZsYXRSZXN0ID0gcmVxdWlyZSgnLi9fZmxhdFJlc3QnKSxcbiAgICBnZXRBbGxLZXlzSW4gPSByZXF1aXJlKCcuL19nZXRBbGxLZXlzSW4nKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY2xvbmluZy4gKi9cbnZhciBDTE9ORV9ERUVQX0ZMQUcgPSAxLFxuICAgIENMT05FX0ZMQVRfRkxBRyA9IDIsXG4gICAgQ0xPTkVfU1lNQk9MU19GTEFHID0gNDtcblxuLyoqXG4gKiBUaGUgb3Bwb3NpdGUgb2YgYF8ucGlja2A7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZVxuICogb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBwYXRocyBvZiBgb2JqZWN0YCB0aGF0IGFyZSBub3Qgb21pdHRlZC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgY29uc2lkZXJhYmx5IHNsb3dlciB0aGFuIGBfLnBpY2tgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBvbWl0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gKlxuICogXy5vbWl0KG9iamVjdCwgWydhJywgJ2MnXSk7XG4gKiAvLyA9PiB7ICdiJzogJzInIH1cbiAqL1xudmFyIG9taXQgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIHBhdGhzKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICB2YXIgaXNEZWVwID0gZmFsc2U7XG4gIHBhdGhzID0gYXJyYXlNYXAocGF0aHMsIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcbiAgICBpc0RlZXAgfHwgKGlzRGVlcCA9IHBhdGgubGVuZ3RoID4gMSk7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH0pO1xuICBjb3B5T2JqZWN0KG9iamVjdCwgZ2V0QWxsS2V5c0luKG9iamVjdCksIHJlc3VsdCk7XG4gIGlmIChpc0RlZXApIHtcbiAgICByZXN1bHQgPSBiYXNlQ2xvbmUocmVzdWx0LCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9GTEFUX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbU9taXRDbG9uZSk7XG4gIH1cbiAgdmFyIGxlbmd0aCA9IHBhdGhzLmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgYmFzZVVuc2V0KHJlc3VsdCwgcGF0aHNbbGVuZ3RoXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG9taXQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL29taXQuanNcbi8vIG1vZHVsZSBpZCA9IDM3MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 372 */
/***/ function(module, exports, __webpack_require__) {

    eval("var Stack = __webpack_require__(33),\n    arrayEach = __webpack_require__(139),\n    assignValue = __webpack_require__(373),\n    baseAssign = __webpack_require__(375),\n    baseAssignIn = __webpack_require__(377),\n    cloneBuffer = __webpack_require__(381),\n    copyArray = __webpack_require__(382),\n    copySymbols = __webpack_require__(383),\n    copySymbolsIn = __webpack_require__(384),\n    getAllKeys = __webpack_require__(83),\n    getAllKeysIn = __webpack_require__(387),\n    getTag = __webpack_require__(109),\n    initCloneArray = __webpack_require__(388),\n    initCloneByTag = __webpack_require__(389),\n    initCloneObject = __webpack_require__(400),\n    isArray = __webpack_require__(86),\n    isBuffer = __webpack_require__(95),\n    isObject = __webpack_require__(18),\n    keys = __webpack_require__(90);\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n    CLONE_FLAT_FLAG = 2,\n    CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n *  1 - Deep clone\n *  2 - Flatten inherited properties\n *  4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n  var result,\n      isDeep = bitmask & CLONE_DEEP_FLAG,\n      isFlat = bitmask & CLONE_FLAT_FLAG,\n      isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n  if (customizer) {\n    result = object ? customizer(value, key, object, stack) : customizer(value);\n  }\n  if (result !== undefined) {\n    return result;\n  }\n  if (!isObject(value)) {\n    return value;\n  }\n  var isArr = isArray(value);\n  if (isArr) {\n    result = initCloneArray(value);\n    if (!isDeep) {\n      return copyArray(value, result);\n    }\n  } else {\n    var tag = getTag(value),\n        isFunc = tag == funcTag || tag == genTag;\n\n    if (isBuffer(value)) {\n      return cloneBuffer(value, isDeep);\n    }\n    if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n      result = (isFlat || isFunc) ? {} : initCloneObject(value);\n      if (!isDeep) {\n        return isFlat\n          ? copySymbolsIn(value, baseAssignIn(result, value))\n          : copySymbols(value, baseAssign(result, value));\n      }\n    } else {\n      if (!cloneableTags[tag]) {\n        return object ? value : {};\n      }\n      result = initCloneByTag(value, tag, baseClone, isDeep);\n    }\n  }\n  // Check for circular references and return its corresponding clone.\n  stack || (stack = new Stack);\n  var stacked = stack.get(value);\n  if (stacked) {\n    return stacked;\n  }\n  stack.set(value, result);\n\n  var keysFunc = isFull\n    ? (isFlat ? getAllKeysIn : getAllKeys)\n    : (isFlat ? keysIn : keys);\n\n  var props = isArr ? undefined : keysFunc(value);\n  arrayEach(props || value, function(subValue, key) {\n    if (props) {\n      key = subValue;\n      subValue = value[key];\n    }\n    // Recursively populate clone (susceptible to call stack limits).\n    assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n  });\n  return result;\n}\n\nmodule.exports = baseClone;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzcyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VDbG9uZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgU3RhY2sgPSByZXF1aXJlKCcuL19TdGFjaycpLFxuICAgIGFycmF5RWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5RWFjaCcpLFxuICAgIGFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduVmFsdWUnKSxcbiAgICBiYXNlQXNzaWduID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnbicpLFxuICAgIGJhc2VBc3NpZ25JbiA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ25JbicpLFxuICAgIGNsb25lQnVmZmVyID0gcmVxdWlyZSgnLi9fY2xvbmVCdWZmZXInKSxcbiAgICBjb3B5QXJyYXkgPSByZXF1aXJlKCcuL19jb3B5QXJyYXknKSxcbiAgICBjb3B5U3ltYm9scyA9IHJlcXVpcmUoJy4vX2NvcHlTeW1ib2xzJyksXG4gICAgY29weVN5bWJvbHNJbiA9IHJlcXVpcmUoJy4vX2NvcHlTeW1ib2xzSW4nKSxcbiAgICBnZXRBbGxLZXlzID0gcmVxdWlyZSgnLi9fZ2V0QWxsS2V5cycpLFxuICAgIGdldEFsbEtleXNJbiA9IHJlcXVpcmUoJy4vX2dldEFsbEtleXNJbicpLFxuICAgIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGluaXRDbG9uZUFycmF5ID0gcmVxdWlyZSgnLi9faW5pdENsb25lQXJyYXknKSxcbiAgICBpbml0Q2xvbmVCeVRhZyA9IHJlcXVpcmUoJy4vX2luaXRDbG9uZUJ5VGFnJyksXG4gICAgaW5pdENsb25lT2JqZWN0ID0gcmVxdWlyZSgnLi9faW5pdENsb25lT2JqZWN0JyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY2xvbmluZy4gKi9cbnZhciBDTE9ORV9ERUVQX0ZMQUcgPSAxLFxuICAgIENMT05FX0ZMQVRfRkxBRyA9IDIsXG4gICAgQ0xPTkVfU1lNQk9MU19GTEFHID0gNDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nLFxuICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBzdXBwb3J0ZWQgYnkgYF8uY2xvbmVgLiAqL1xudmFyIGNsb25lYWJsZVRhZ3MgPSB7fTtcbmNsb25lYWJsZVRhZ3NbYXJnc1RhZ10gPSBjbG9uZWFibGVUYWdzW2FycmF5VGFnXSA9XG5jbG9uZWFibGVUYWdzW2FycmF5QnVmZmVyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0YVZpZXdUYWddID1cbmNsb25lYWJsZVRhZ3NbYm9vbFRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGVUYWddID1cbmNsb25lYWJsZVRhZ3NbZmxvYXQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddID1cbmNsb25lYWJsZVRhZ3NbaW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW2ludDE2VGFnXSA9XG5jbG9uZWFibGVUYWdzW2ludDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbbWFwVGFnXSA9XG5jbG9uZWFibGVUYWdzW251bWJlclRhZ10gPSBjbG9uZWFibGVUYWdzW29iamVjdFRhZ10gPVxuY2xvbmVhYmxlVGFnc1tyZWdleHBUYWddID0gY2xvbmVhYmxlVGFnc1tzZXRUYWddID1cbmNsb25lYWJsZVRhZ3Nbc3RyaW5nVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc3ltYm9sVGFnXSA9XG5jbG9uZWFibGVUYWdzW3VpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9XG5jbG9uZWFibGVUYWdzW3VpbnQxNlRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xuY2xvbmVhYmxlVGFnc1tlcnJvclRhZ10gPSBjbG9uZWFibGVUYWdzW2Z1bmNUYWddID1cbmNsb25lYWJsZVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jbG9uZWAgYW5kIGBfLmNsb25lRGVlcGAgd2hpY2ggdHJhY2tzXG4gKiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gKiAgMSAtIERlZXAgY2xvbmVcbiAqICAyIC0gRmxhdHRlbiBpbmhlcml0ZWQgcHJvcGVydGllc1xuICogIDQgLSBDbG9uZSBzeW1ib2xzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIFRoZSBrZXkgb2YgYHZhbHVlYC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgcGFyZW50IG9iamVjdCBvZiBgdmFsdWVgLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGFuZCB0aGVpciBjbG9uZSBjb3VudGVycGFydHMuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBiYXNlQ2xvbmUodmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgb2JqZWN0LCBzdGFjaykge1xuICB2YXIgcmVzdWx0LFxuICAgICAgaXNEZWVwID0gYml0bWFzayAmIENMT05FX0RFRVBfRkxBRyxcbiAgICAgIGlzRmxhdCA9IGJpdG1hc2sgJiBDTE9ORV9GTEFUX0ZMQUcsXG4gICAgICBpc0Z1bGwgPSBiaXRtYXNrICYgQ0xPTkVfU1lNQk9MU19GTEFHO1xuXG4gIGlmIChjdXN0b21pemVyKSB7XG4gICAgcmVzdWx0ID0gb2JqZWN0ID8gY3VzdG9taXplcih2YWx1ZSwga2V5LCBvYmplY3QsIHN0YWNrKSA6IGN1c3RvbWl6ZXIodmFsdWUpO1xuICB9XG4gIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSk7XG4gIGlmIChpc0Fycikge1xuICAgIHJlc3VsdCA9IGluaXRDbG9uZUFycmF5KHZhbHVlKTtcbiAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgcmV0dXJuIGNvcHlBcnJheSh2YWx1ZSwgcmVzdWx0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSksXG4gICAgICAgIGlzRnVuYyA9IHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWc7XG5cbiAgICBpZiAoaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY2xvbmVCdWZmZXIodmFsdWUsIGlzRGVlcCk7XG4gICAgfVxuICAgIGlmICh0YWcgPT0gb2JqZWN0VGFnIHx8IHRhZyA9PSBhcmdzVGFnIHx8IChpc0Z1bmMgJiYgIW9iamVjdCkpIHtcbiAgICAgIHJlc3VsdCA9IChpc0ZsYXQgfHwgaXNGdW5jKSA/IHt9IDogaW5pdENsb25lT2JqZWN0KHZhbHVlKTtcbiAgICAgIGlmICghaXNEZWVwKSB7XG4gICAgICAgIHJldHVybiBpc0ZsYXRcbiAgICAgICAgICA/IGNvcHlTeW1ib2xzSW4odmFsdWUsIGJhc2VBc3NpZ25JbihyZXN1bHQsIHZhbHVlKSlcbiAgICAgICAgICA6IGNvcHlTeW1ib2xzKHZhbHVlLCBiYXNlQXNzaWduKHJlc3VsdCwgdmFsdWUpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFjbG9uZWFibGVUYWdzW3RhZ10pIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdCA/IHZhbHVlIDoge307XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBpbml0Q2xvbmVCeVRhZyh2YWx1ZSwgdGFnLCBiYXNlQ2xvbmUsIGlzRGVlcCk7XG4gICAgfVxuICB9XG4gIC8vIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm4gaXRzIGNvcnJlc3BvbmRpbmcgY2xvbmUuXG4gIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KHZhbHVlKTtcbiAgaWYgKHN0YWNrZWQpIHtcbiAgICByZXR1cm4gc3RhY2tlZDtcbiAgfVxuICBzdGFjay5zZXQodmFsdWUsIHJlc3VsdCk7XG5cbiAgdmFyIGtleXNGdW5jID0gaXNGdWxsXG4gICAgPyAoaXNGbGF0ID8gZ2V0QWxsS2V5c0luIDogZ2V0QWxsS2V5cylcbiAgICA6IChpc0ZsYXQgPyBrZXlzSW4gOiBrZXlzKTtcblxuICB2YXIgcHJvcHMgPSBpc0FyciA/IHVuZGVmaW5lZCA6IGtleXNGdW5jKHZhbHVlKTtcbiAgYXJyYXlFYWNoKHByb3BzIHx8IHZhbHVlLCBmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgaWYgKHByb3BzKSB7XG4gICAgICBrZXkgPSBzdWJWYWx1ZTtcbiAgICAgIHN1YlZhbHVlID0gdmFsdWVba2V5XTtcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgcG9wdWxhdGUgY2xvbmUgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICBhc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFjaykpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQ2xvbmU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19iYXNlQ2xvbmUuanNcbi8vIG1vZHVsZSBpZCA9IDM3MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 373 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseAssignValue = __webpack_require__(374),\n    eq = __webpack_require__(38);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n  var objValue = object[key];\n  if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n      (value === undefined && !(key in object))) {\n    baseAssignValue(object, key, value);\n  }\n}\n\nmodule.exports = assignValue;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzczLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Fzc2lnblZhbHVlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlQXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19iYXNlQXNzaWduVmFsdWUnKSxcbiAgICBlcSA9IHJlcXVpcmUoJy4vZXEnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBBc3NpZ25zIGB2YWx1ZWAgdG8gYGtleWAgb2YgYG9iamVjdGAgaWYgdGhlIGV4aXN0aW5nIHZhbHVlIGlzIG5vdCBlcXVpdmFsZW50XG4gKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgaWYgKCEoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgZXEob2JqVmFsdWUsIHZhbHVlKSkgfHxcbiAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NpZ25WYWx1ZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2Fzc2lnblZhbHVlLmpzXG4vLyBtb2R1bGUgaWQgPSAzNzNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 374 */
/***/ function(module, exports, __webpack_require__) {

    eval("var defineProperty = __webpack_require__(166);\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n  if (key == '__proto__' && defineProperty) {\n    defineProperty(object, key, {\n      'configurable': true,\n      'enumerable': true,\n      'value': value,\n      'writable': true\n    });\n  } else {\n    object[key] = value;\n  }\n}\n\nmodule.exports = baseAssignValue;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VBc3NpZ25WYWx1ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19kZWZpbmVQcm9wZXJ0eScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBhc3NpZ25WYWx1ZWAgYW5kIGBhc3NpZ25NZXJnZVZhbHVlYCB3aXRob3V0XG4gKiB2YWx1ZSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5ID09ICdfX3Byb3RvX18nICYmIGRlZmluZVByb3BlcnR5KSB7XG4gICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHtcbiAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgJ2VudW1lcmFibGUnOiB0cnVlLFxuICAgICAgJ3ZhbHVlJzogdmFsdWUsXG4gICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VBc3NpZ25WYWx1ZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2Jhc2VBc3NpZ25WYWx1ZS5qc1xuLy8gbW9kdWxlIGlkID0gMzc0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 375 */
/***/ function(module, exports, __webpack_require__) {

    eval("var copyObject = __webpack_require__(376),\n    keys = __webpack_require__(90);\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n  return object && copyObject(source, keys(source), object);\n}\n\nmodule.exports = baseAssign;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VBc3NpZ24uanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGNvcHlPYmplY3QgPSByZXF1aXJlKCcuL19jb3B5T2JqZWN0JyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnbihvYmplY3QsIHNvdXJjZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUFzc2lnbjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2Jhc2VBc3NpZ24uanNcbi8vIG1vZHVsZSBpZCA9IDM3NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 376 */
/***/ function(module, exports, __webpack_require__) {

    eval("var assignValue = __webpack_require__(373),\n    baseAssignValue = __webpack_require__(374);\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n  var isNew = !object;\n  object || (object = {});\n\n  var index = -1,\n      length = props.length;\n\n  while (++index < length) {\n    var key = props[index];\n\n    var newValue = customizer\n      ? customizer(object[key], source[key], key, object, source)\n      : undefined;\n\n    if (newValue === undefined) {\n      newValue = source[key];\n    }\n    if (isNew) {\n      baseAssignValue(object, key, newValue);\n    } else {\n      assignValue(object, key, newValue);\n    }\n  }\n  return object;\n}\n\nmodule.exports = copyObject;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlPYmplY3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduVmFsdWUnKSxcbiAgICBiYXNlQXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19iYXNlQXNzaWduVmFsdWUnKTtcblxuLyoqXG4gKiBDb3BpZXMgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLlxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzIHRvIGNvcHkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb3BpZWQgdmFsdWVzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UsIHByb3BzLCBvYmplY3QsIGN1c3RvbWl6ZXIpIHtcbiAgdmFyIGlzTmV3ID0gIW9iamVjdDtcbiAgb2JqZWN0IHx8IChvYmplY3QgPSB7fSk7XG5cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuXG4gICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgPyBjdXN0b21pemVyKG9iamVjdFtrZXldLCBzb3VyY2Vba2V5XSwga2V5LCBvYmplY3QsIHNvdXJjZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG5ld1ZhbHVlID0gc291cmNlW2tleV07XG4gICAgfVxuICAgIGlmIChpc05ldykge1xuICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weU9iamVjdDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2NvcHlPYmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IDM3NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 377 */
/***/ function(module, exports, __webpack_require__) {

    eval("var copyObject = __webpack_require__(376),\n    keysIn = __webpack_require__(378);\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n  return object && copyObject(source, keysIn(source), object);\n}\n\nmodule.exports = baseAssignIn;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VBc3NpZ25Jbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbkluYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXNcbiAqIG9yIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBiYXNlQXNzaWduSW4ob2JqZWN0LCBzb3VyY2UpIHtcbiAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUFzc2lnbkluO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZUFzc2lnbkluLmpzXG4vLyBtb2R1bGUgaWQgPSAzNzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 378 */
/***/ function(module, exports, __webpack_require__) {

    eval("var arrayLikeKeys = __webpack_require__(91),\n    baseKeysIn = __webpack_require__(379),\n    isArrayLike = __webpack_require__(108);\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gva2V5c0luLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheUxpa2VLZXlzID0gcmVxdWlyZSgnLi9fYXJyYXlMaWtlS2V5cycpLFxuICAgIGJhc2VLZXlzSW4gPSByZXF1aXJlKCcuL19iYXNlS2V5c0luJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXNJbihuZXcgRm9vKTtcbiAqIC8vID0+IFsnYScsICdiJywgJ2MnXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiBrZXlzSW4ob2JqZWN0KSB7XG4gIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QsIHRydWUpIDogYmFzZUtleXNJbihvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXNJbjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gva2V5c0luLmpzXG4vLyBtb2R1bGUgaWQgPSAzNzhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 379 */
/***/ function(module, exports, __webpack_require__) {

    eval("var isObject = __webpack_require__(18),\n    isPrototype = __webpack_require__(105),\n    nativeKeysIn = __webpack_require__(380);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n  if (!isObject(object)) {\n    return nativeKeysIn(object);\n  }\n  var isProto = isPrototype(object),\n      result = [];\n\n  for (var key in object) {\n    if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseKeysIn;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VLZXlzSW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKSxcbiAgICBuYXRpdmVLZXlzSW4gPSByZXF1aXJlKCcuL19uYXRpdmVLZXlzSW4nKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzSW5gIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXNJbihvYmplY3QpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXNJbihvYmplY3QpO1xuICB9XG4gIHZhciBpc1Byb3RvID0gaXNQcm90b3R5cGUob2JqZWN0KSxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoIShrZXkgPT0gJ2NvbnN0cnVjdG9yJyAmJiAoaXNQcm90byB8fCAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlS2V5c0luO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZUtleXNJbi5qc1xuLy8gbW9kdWxlIGlkID0gMzc5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 380 */
/***/ function(module, exports) {

    eval("/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n  var result = [];\n  if (object != null) {\n    for (var key in Object(object)) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = nativeKeysIn;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzgwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUtleXNJbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZVxuICogW2BPYmplY3Qua2V5c2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICogZXhjZXB0IHRoYXQgaXQgaW5jbHVkZXMgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmIChvYmplY3QgIT0gbnVsbCkge1xuICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVLZXlzSW47XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19uYXRpdmVLZXlzSW4uanNcbi8vIG1vZHVsZSBpZCA9IDM4MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 381 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(module) {var root = __webpack_require__(22);\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n    allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of  `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n  if (isDeep) {\n    return buffer.slice();\n  }\n  var length = buffer.length,\n      result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n  buffer.copy(result);\n  return result;\n}\n\nmodule.exports = cloneBuffer;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(96)(module)))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzgxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lQnVmZmVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIEJ1ZmZlciA9IG1vZHVsZUV4cG9ydHMgPyByb290LkJ1ZmZlciA6IHVuZGVmaW5lZCxcbiAgICBhbGxvY1Vuc2FmZSA9IEJ1ZmZlciA/IEJ1ZmZlci5hbGxvY1Vuc2FmZSA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgIGBidWZmZXJgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIFRoZSBidWZmZXIgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge0J1ZmZlcn0gUmV0dXJucyB0aGUgY2xvbmVkIGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gY2xvbmVCdWZmZXIoYnVmZmVyLCBpc0RlZXApIHtcbiAgaWYgKGlzRGVlcCkge1xuICAgIHJldHVybiBidWZmZXIuc2xpY2UoKTtcbiAgfVxuICB2YXIgbGVuZ3RoID0gYnVmZmVyLmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IGFsbG9jVW5zYWZlID8gYWxsb2NVbnNhZmUobGVuZ3RoKSA6IG5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICBidWZmZXIuY29weShyZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lQnVmZmVyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fY2xvbmVCdWZmZXIuanNcbi8vIG1vZHVsZSBpZCA9IDM4MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 382 */
/***/ function(module, exports) {

    eval("/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n  var index = -1,\n      length = source.length;\n\n  array || (array = Array(length));\n  while (++index < length) {\n    array[index] = source[index];\n  }\n  return array;\n}\n\nmodule.exports = copyArray;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzgyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlBcnJheS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcGllcyB0aGUgdmFsdWVzIG9mIGBzb3VyY2VgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheT1bXV0gVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIHRvLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlBcnJheShzb3VyY2UsIGFycmF5KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gc291cmNlLmxlbmd0aDtcblxuICBhcnJheSB8fCAoYXJyYXkgPSBBcnJheShsZW5ndGgpKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhcnJheVtpbmRleF0gPSBzb3VyY2VbaW5kZXhdO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5QXJyYXk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19jb3B5QXJyYXkuanNcbi8vIG1vZHVsZSBpZCA9IDM4MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 383 */
/***/ function(module, exports, __webpack_require__) {

    eval("var copyObject = __webpack_require__(376),\n    getSymbols = __webpack_require__(87);\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n  return copyObject(source, getSymbols(source), object);\n}\n\nmodule.exports = copySymbols;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzgzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlTeW1ib2xzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGdldFN5bWJvbHMgPSByZXF1aXJlKCcuL19nZXRTeW1ib2xzJyk7XG5cbi8qKlxuICogQ29waWVzIG93biBzeW1ib2xzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIGZyb20uXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgdG8uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBjb3B5U3ltYm9scyhzb3VyY2UsIG9iamVjdCkge1xuICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHMoc291cmNlKSwgb2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5U3ltYm9scztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2NvcHlTeW1ib2xzLmpzXG4vLyBtb2R1bGUgaWQgPSAzODNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 384 */
/***/ function(module, exports, __webpack_require__) {

    eval("var copyObject = __webpack_require__(376),\n    getSymbolsIn = __webpack_require__(385);\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n  return copyObject(source, getSymbolsIn(source), object);\n}\n\nmodule.exports = copySymbolsIn;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzg0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlTeW1ib2xzSW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGNvcHlPYmplY3QgPSByZXF1aXJlKCcuL19jb3B5T2JqZWN0JyksXG4gICAgZ2V0U3ltYm9sc0luID0gcmVxdWlyZSgnLi9fZ2V0U3ltYm9sc0luJyk7XG5cbi8qKlxuICogQ29waWVzIG93biBhbmQgaW5oZXJpdGVkIHN5bWJvbHMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgZnJvbS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlTeW1ib2xzSW4oc291cmNlLCBvYmplY3QpIHtcbiAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzSW4oc291cmNlKSwgb2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5U3ltYm9sc0luO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fY29weVN5bWJvbHNJbi5qc1xuLy8gbW9kdWxlIGlkID0gMzg0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 385 */
/***/ function(module, exports, __webpack_require__) {

    eval("var arrayPush = __webpack_require__(85),\n    getPrototype = __webpack_require__(386),\n    getSymbols = __webpack_require__(87),\n    stubArray = __webpack_require__(89);\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n  var result = [];\n  while (object) {\n    arrayPush(result, getSymbols(object));\n    object = getPrototype(object);\n  }\n  return result;\n};\n\nmodule.exports = getSymbolsIn;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzg1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFN5bWJvbHNJbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXJyYXlQdXNoID0gcmVxdWlyZSgnLi9fYXJyYXlQdXNoJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgZ2V0U3ltYm9scyA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHMnKSxcbiAgICBzdHViQXJyYXkgPSByZXF1aXJlKCcuL3N0dWJBcnJheScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gKi9cbnZhciBnZXRTeW1ib2xzSW4gPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHdoaWxlIChvYmplY3QpIHtcbiAgICBhcnJheVB1c2gocmVzdWx0LCBnZXRTeW1ib2xzKG9iamVjdCkpO1xuICAgIG9iamVjdCA9IGdldFByb3RvdHlwZShvYmplY3QpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFN5bWJvbHNJbjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2dldFN5bWJvbHNJbi5qc1xuLy8gbW9kdWxlIGlkID0gMzg1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 386 */
/***/ function(module, exports, __webpack_require__) {

    eval("var overArg = __webpack_require__(107);\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzg2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFByb3RvdHlwZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgb3ZlckFyZyA9IHJlcXVpcmUoJy4vX292ZXJBcmcnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0UHJvdG90eXBlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fZ2V0UHJvdG90eXBlLmpzXG4vLyBtb2R1bGUgaWQgPSAzODZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 387 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseGetAllKeys = __webpack_require__(84),\n    getSymbolsIn = __webpack_require__(385),\n    keysIn = __webpack_require__(378);\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n  return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nmodule.exports = getAllKeysIn;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzg3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldEFsbEtleXNJbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUdldEFsbEtleXMgPSByZXF1aXJlKCcuL19iYXNlR2V0QWxsS2V5cycpLFxuICAgIGdldFN5bWJvbHNJbiA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHNJbicpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsS2V5c0luKG9iamVjdCkge1xuICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzSW4sIGdldFN5bWJvbHNJbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QWxsS2V5c0luO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fZ2V0QWxsS2V5c0luLmpzXG4vLyBtb2R1bGUgaWQgPSAzODdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 388 */
/***/ function(module, exports) {

    eval("/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n  var length = array.length,\n      result = array.constructor(length);\n\n  // Add properties assigned by `RegExp#exec`.\n  if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n    result.index = array.index;\n    result.input = array.input;\n  }\n  return result;\n}\n\nmodule.exports = initCloneArray;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzg4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2luaXRDbG9uZUFycmF5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW4gYXJyYXkgY2xvbmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBhcnJheS5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gIC8vIEFkZCBwcm9wZXJ0aWVzIGFzc2lnbmVkIGJ5IGBSZWdFeHAjZXhlY2AuXG4gIGlmIChsZW5ndGggJiYgdHlwZW9mIGFycmF5WzBdID09ICdzdHJpbmcnICYmIGhhc093blByb3BlcnR5LmNhbGwoYXJyYXksICdpbmRleCcpKSB7XG4gICAgcmVzdWx0LmluZGV4ID0gYXJyYXkuaW5kZXg7XG4gICAgcmVzdWx0LmlucHV0ID0gYXJyYXkuaW5wdXQ7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbml0Q2xvbmVBcnJheTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2luaXRDbG9uZUFycmF5LmpzXG4vLyBtb2R1bGUgaWQgPSAzODhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 389 */
/***/ function(module, exports, __webpack_require__) {

    eval("var cloneArrayBuffer = __webpack_require__(390),\n    cloneDataView = __webpack_require__(391),\n    cloneMap = __webpack_require__(392),\n    cloneRegExp = __webpack_require__(395),\n    cloneSet = __webpack_require__(396),\n    cloneSymbol = __webpack_require__(398),\n    cloneTypedArray = __webpack_require__(399);\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, cloneFunc, isDeep) {\n  var Ctor = object.constructor;\n  switch (tag) {\n    case arrayBufferTag:\n      return cloneArrayBuffer(object);\n\n    case boolTag:\n    case dateTag:\n      return new Ctor(+object);\n\n    case dataViewTag:\n      return cloneDataView(object, isDeep);\n\n    case float32Tag: case float64Tag:\n    case int8Tag: case int16Tag: case int32Tag:\n    case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n      return cloneTypedArray(object, isDeep);\n\n    case mapTag:\n      return cloneMap(object, isDeep, cloneFunc);\n\n    case numberTag:\n    case stringTag:\n      return new Ctor(object);\n\n    case regexpTag:\n      return cloneRegExp(object);\n\n    case setTag:\n      return cloneSet(object, isDeep, cloneFunc);\n\n    case symbolTag:\n      return cloneSymbol(object);\n  }\n}\n\nmodule.exports = initCloneByTag;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzg5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2luaXRDbG9uZUJ5VGFnLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBjbG9uZUFycmF5QnVmZmVyID0gcmVxdWlyZSgnLi9fY2xvbmVBcnJheUJ1ZmZlcicpLFxuICAgIGNsb25lRGF0YVZpZXcgPSByZXF1aXJlKCcuL19jbG9uZURhdGFWaWV3JyksXG4gICAgY2xvbmVNYXAgPSByZXF1aXJlKCcuL19jbG9uZU1hcCcpLFxuICAgIGNsb25lUmVnRXhwID0gcmVxdWlyZSgnLi9fY2xvbmVSZWdFeHAnKSxcbiAgICBjbG9uZVNldCA9IHJlcXVpcmUoJy4vX2Nsb25lU2V0JyksXG4gICAgY2xvbmVTeW1ib2wgPSByZXF1aXJlKCcuL19jbG9uZVN5bWJvbCcpLFxuICAgIGNsb25lVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vX2Nsb25lVHlwZWRBcnJheScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuLyoqXG4gKiBJbml0aWFsaXplcyBhbiBvYmplY3QgY2xvbmUgYmFzZWQgb24gaXRzIGB0b1N0cmluZ1RhZ2AuXG4gKlxuICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjbG9uaW5nIHZhbHVlcyB3aXRoIHRhZ3Mgb2ZcbiAqIGBCb29sZWFuYCwgYERhdGVgLCBgRXJyb3JgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIG9yIGBTdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBgdG9TdHJpbmdUYWdgIG9mIHRoZSBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjbG9uZUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNsb25lIHZhbHVlcy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAqL1xuZnVuY3Rpb24gaW5pdENsb25lQnlUYWcob2JqZWN0LCB0YWcsIGNsb25lRnVuYywgaXNEZWVwKSB7XG4gIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICByZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpO1xuXG4gICAgY2FzZSBib29sVGFnOlxuICAgIGNhc2UgZGF0ZVRhZzpcbiAgICAgIHJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtcblxuICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICByZXR1cm4gY2xvbmVEYXRhVmlldyhvYmplY3QsIGlzRGVlcCk7XG5cbiAgICBjYXNlIGZsb2F0MzJUYWc6IGNhc2UgZmxvYXQ2NFRhZzpcbiAgICBjYXNlIGludDhUYWc6IGNhc2UgaW50MTZUYWc6IGNhc2UgaW50MzJUYWc6XG4gICAgY2FzZSB1aW50OFRhZzogY2FzZSB1aW50OENsYW1wZWRUYWc6IGNhc2UgdWludDE2VGFnOiBjYXNlIHVpbnQzMlRhZzpcbiAgICAgIHJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgY2FzZSBtYXBUYWc6XG4gICAgICByZXR1cm4gY2xvbmVNYXAob2JqZWN0LCBpc0RlZXAsIGNsb25lRnVuYyk7XG5cbiAgICBjYXNlIG51bWJlclRhZzpcbiAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgIHJldHVybiBuZXcgQ3RvcihvYmplY3QpO1xuXG4gICAgY2FzZSByZWdleHBUYWc6XG4gICAgICByZXR1cm4gY2xvbmVSZWdFeHAob2JqZWN0KTtcblxuICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgcmV0dXJuIGNsb25lU2V0KG9iamVjdCwgaXNEZWVwLCBjbG9uZUZ1bmMpO1xuXG4gICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICByZXR1cm4gY2xvbmVTeW1ib2wob2JqZWN0KTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluaXRDbG9uZUJ5VGFnO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9faW5pdENsb25lQnlUYWcuanNcbi8vIG1vZHVsZSBpZCA9IDM4OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 390 */
/***/ function(module, exports, __webpack_require__) {

    eval("var Uint8Array = __webpack_require__(79);\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n  var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n  new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n  return result;\n}\n\nmodule.exports = cloneArrayBuffer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lQXJyYXlCdWZmZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIFVpbnQ4QXJyYXkgPSByZXF1aXJlKCcuL19VaW50OEFycmF5Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGBhcnJheUJ1ZmZlcmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7QXJyYXlCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBhcnJheSBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyBhcnJheUJ1ZmZlci5jb25zdHJ1Y3RvcihhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgbmV3IFVpbnQ4QXJyYXkocmVzdWx0KS5zZXQobmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZUFycmF5QnVmZmVyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fY2xvbmVBcnJheUJ1ZmZlci5qc1xuLy8gbW9kdWxlIGlkID0gMzkwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 391 */
/***/ function(module, exports, __webpack_require__) {

    eval("var cloneArrayBuffer = __webpack_require__(390);\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n  var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n  return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nmodule.exports = cloneDataView;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lRGF0YVZpZXcuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGNsb25lQXJyYXlCdWZmZXIgPSByZXF1aXJlKCcuL19jbG9uZUFycmF5QnVmZmVyJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGBkYXRhVmlld2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhVmlldyBUaGUgZGF0YSB2aWV3IHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBkYXRhIHZpZXcuXG4gKi9cbmZ1bmN0aW9uIGNsb25lRGF0YVZpZXcoZGF0YVZpZXcsIGlzRGVlcCkge1xuICB2YXIgYnVmZmVyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcihkYXRhVmlldy5idWZmZXIpIDogZGF0YVZpZXcuYnVmZmVyO1xuICByZXR1cm4gbmV3IGRhdGFWaWV3LmNvbnN0cnVjdG9yKGJ1ZmZlciwgZGF0YVZpZXcuYnl0ZU9mZnNldCwgZGF0YVZpZXcuYnl0ZUxlbmd0aCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVEYXRhVmlldztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2Nsb25lRGF0YVZpZXcuanNcbi8vIG1vZHVsZSBpZCA9IDM5MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 392 */
/***/ function(module, exports, __webpack_require__) {

    eval("var addMapEntry = __webpack_require__(393),\n    arrayReduce = __webpack_require__(394),\n    mapToArray = __webpack_require__(80);\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1;\n\n/**\n * Creates a clone of `map`.\n *\n * @private\n * @param {Object} map The map to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned map.\n */\nfunction cloneMap(map, isDeep, cloneFunc) {\n  var array = isDeep ? cloneFunc(mapToArray(map), CLONE_DEEP_FLAG) : mapToArray(map);\n  return arrayReduce(array, addMapEntry, new map.constructor);\n}\n\nmodule.exports = cloneMap;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lTWFwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhZGRNYXBFbnRyeSA9IHJlcXVpcmUoJy4vX2FkZE1hcEVudHJ5JyksXG4gICAgYXJyYXlSZWR1Y2UgPSByZXF1aXJlKCcuL19hcnJheVJlZHVjZScpLFxuICAgIG1hcFRvQXJyYXkgPSByZXF1aXJlKCcuL19tYXBUb0FycmF5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG52YXIgQ0xPTkVfREVFUF9GTEFHID0gMTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYG1hcGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBjbG9uZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNsb25lRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2xvbmUgdmFsdWVzLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBtYXAuXG4gKi9cbmZ1bmN0aW9uIGNsb25lTWFwKG1hcCwgaXNEZWVwLCBjbG9uZUZ1bmMpIHtcbiAgdmFyIGFycmF5ID0gaXNEZWVwID8gY2xvbmVGdW5jKG1hcFRvQXJyYXkobWFwKSwgQ0xPTkVfREVFUF9GTEFHKSA6IG1hcFRvQXJyYXkobWFwKTtcbiAgcmV0dXJuIGFycmF5UmVkdWNlKGFycmF5LCBhZGRNYXBFbnRyeSwgbmV3IG1hcC5jb25zdHJ1Y3Rvcik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVNYXA7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19jbG9uZU1hcC5qc1xuLy8gbW9kdWxlIGlkID0gMzkyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 393 */
/***/ function(module, exports) {

    eval("/**\n * Adds the key-value `pair` to `map`.\n *\n * @private\n * @param {Object} map The map to modify.\n * @param {Array} pair The key-value pair to add.\n * @returns {Object} Returns `map`.\n */\nfunction addMapEntry(map, pair) {\n  // Don't return `map.set` because it's not chainable in IE 11.\n  map.set(pair[0], pair[1]);\n  return map;\n}\n\nmodule.exports = addMapEntry;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FkZE1hcEVudHJ5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWRkcyB0aGUga2V5LXZhbHVlIGBwYWlyYCB0byBgbWFwYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhaXIgVGhlIGtleS12YWx1ZSBwYWlyIHRvIGFkZC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG1hcGAuXG4gKi9cbmZ1bmN0aW9uIGFkZE1hcEVudHJ5KG1hcCwgcGFpcikge1xuICAvLyBEb24ndCByZXR1cm4gYG1hcC5zZXRgIGJlY2F1c2UgaXQncyBub3QgY2hhaW5hYmxlIGluIElFIDExLlxuICBtYXAuc2V0KHBhaXJbMF0sIHBhaXJbMV0pO1xuICByZXR1cm4gbWFwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFkZE1hcEVudHJ5O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYWRkTWFwRW50cnkuanNcbi8vIG1vZHVsZSBpZCA9IDM5M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 394 */
/***/ function(module, exports) {

    eval("/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n *  the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  if (initAccum && length) {\n    accumulator = array[++index];\n  }\n  while (++index < length) {\n    accumulator = iteratee(accumulator, array[index], index, array);\n  }\n  return accumulator;\n}\n\nmodule.exports = arrayReduce;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzk0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5UmVkdWNlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnJlZHVjZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAgYXNcbiAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICBhY2N1bXVsYXRvciA9IGFycmF5WysraW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYWNjdW11bGF0b3IgPSBpdGVyYXRlZShhY2N1bXVsYXRvciwgYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheVJlZHVjZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2FycmF5UmVkdWNlLmpzXG4vLyBtb2R1bGUgaWQgPSAzOTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 395 */
/***/ function(module, exports) {

    eval("/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n  var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n  result.lastIndex = regexp.lastIndex;\n  return result;\n}\n\nmodule.exports = cloneRegExp;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzk1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lUmVnRXhwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgIGZsYWdzIGZyb20gdGhlaXIgY29lcmNlZCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlRmxhZ3MgPSAvXFx3KiQvO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgcmVnZXhwYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHJlZ2V4cCBUaGUgcmVnZXhwIHRvIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHJlZ2V4cC5cbiAqL1xuZnVuY3Rpb24gY2xvbmVSZWdFeHAocmVnZXhwKSB7XG4gIHZhciByZXN1bHQgPSBuZXcgcmVnZXhwLmNvbnN0cnVjdG9yKHJlZ2V4cC5zb3VyY2UsIHJlRmxhZ3MuZXhlYyhyZWdleHApKTtcbiAgcmVzdWx0Lmxhc3RJbmRleCA9IHJlZ2V4cC5sYXN0SW5kZXg7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVSZWdFeHA7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19jbG9uZVJlZ0V4cC5qc1xuLy8gbW9kdWxlIGlkID0gMzk1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 396 */
/***/ function(module, exports, __webpack_require__) {

    eval("var addSetEntry = __webpack_require__(397),\n    arrayReduce = __webpack_require__(394),\n    setToArray = __webpack_require__(81);\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1;\n\n/**\n * Creates a clone of `set`.\n *\n * @private\n * @param {Object} set The set to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned set.\n */\nfunction cloneSet(set, isDeep, cloneFunc) {\n  var array = isDeep ? cloneFunc(setToArray(set), CLONE_DEEP_FLAG) : setToArray(set);\n  return arrayReduce(array, addSetEntry, new set.constructor);\n}\n\nmodule.exports = cloneSet;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzk2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lU2V0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhZGRTZXRFbnRyeSA9IHJlcXVpcmUoJy4vX2FkZFNldEVudHJ5JyksXG4gICAgYXJyYXlSZWR1Y2UgPSByZXF1aXJlKCcuL19hcnJheVJlZHVjZScpLFxuICAgIHNldFRvQXJyYXkgPSByZXF1aXJlKCcuL19zZXRUb0FycmF5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG52YXIgQ0xPTkVfREVFUF9GTEFHID0gMTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHNldGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBjbG9uZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNsb25lRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2xvbmUgdmFsdWVzLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBzZXQuXG4gKi9cbmZ1bmN0aW9uIGNsb25lU2V0KHNldCwgaXNEZWVwLCBjbG9uZUZ1bmMpIHtcbiAgdmFyIGFycmF5ID0gaXNEZWVwID8gY2xvbmVGdW5jKHNldFRvQXJyYXkoc2V0KSwgQ0xPTkVfREVFUF9GTEFHKSA6IHNldFRvQXJyYXkoc2V0KTtcbiAgcmV0dXJuIGFycmF5UmVkdWNlKGFycmF5LCBhZGRTZXRFbnRyeSwgbmV3IHNldC5jb25zdHJ1Y3Rvcik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVTZXQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19jbG9uZVNldC5qc1xuLy8gbW9kdWxlIGlkID0gMzk2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 397 */
/***/ function(module, exports) {

    eval("/**\n * Adds `value` to `set`.\n *\n * @private\n * @param {Object} set The set to modify.\n * @param {*} value The value to add.\n * @returns {Object} Returns `set`.\n */\nfunction addSetEntry(set, value) {\n  // Don't return `set.add` because it's not chainable in IE 11.\n  set.add(value);\n  return set;\n}\n\nmodule.exports = addSetEntry;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzk3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FkZFNldEVudHJ5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWRkcyBgdmFsdWVgIHRvIGBzZXRgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYWRkLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgc2V0YC5cbiAqL1xuZnVuY3Rpb24gYWRkU2V0RW50cnkoc2V0LCB2YWx1ZSkge1xuICAvLyBEb24ndCByZXR1cm4gYHNldC5hZGRgIGJlY2F1c2UgaXQncyBub3QgY2hhaW5hYmxlIGluIElFIDExLlxuICBzZXQuYWRkKHZhbHVlKTtcbiAgcmV0dXJuIHNldDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhZGRTZXRFbnRyeTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2FkZFNldEVudHJ5LmpzXG4vLyBtb2R1bGUgaWQgPSAzOTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 398 */
/***/ function(module, exports, __webpack_require__) {

    eval("var Symbol = __webpack_require__(21);\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n  return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nmodule.exports = cloneSymbol;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzk4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lU3ltYm9sLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBgc3ltYm9sYCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzeW1ib2wgVGhlIHN5bWJvbCBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgc3ltYm9sIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKSB7XG4gIHJldHVybiBzeW1ib2xWYWx1ZU9mID8gT2JqZWN0KHN5bWJvbFZhbHVlT2YuY2FsbChzeW1ib2wpKSA6IHt9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lU3ltYm9sO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fY2xvbmVTeW1ib2wuanNcbi8vIG1vZHVsZSBpZCA9IDM5OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 399 */
/***/ function(module, exports, __webpack_require__) {

    eval("var cloneArrayBuffer = __webpack_require__(390);\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n  var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n  return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nmodule.exports = cloneTypedArray;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzk5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lVHlwZWRBcnJheS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY2xvbmVBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQXJyYXlCdWZmZXInKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHR5cGVkQXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gdHlwZWRBcnJheSBUaGUgdHlwZWQgYXJyYXkgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHR5cGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBjbG9uZVR5cGVkQXJyYXkodHlwZWRBcnJheSwgaXNEZWVwKSB7XG4gIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKSA6IHR5cGVkQXJyYXkuYnVmZmVyO1xuICByZXR1cm4gbmV3IHR5cGVkQXJyYXkuY29uc3RydWN0b3IoYnVmZmVyLCB0eXBlZEFycmF5LmJ5dGVPZmZzZXQsIHR5cGVkQXJyYXkubGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZVR5cGVkQXJyYXk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19jbG9uZVR5cGVkQXJyYXkuanNcbi8vIG1vZHVsZSBpZCA9IDM5OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 400 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseCreate = __webpack_require__(401),\n    getPrototype = __webpack_require__(386),\n    isPrototype = __webpack_require__(105);\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n  return (typeof object.constructor == 'function' && !isPrototype(object))\n    ? baseCreate(getPrototype(object))\n    : {};\n}\n\nmodule.exports = initCloneObject;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2luaXRDbG9uZU9iamVjdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX2Jhc2VDcmVhdGUnKSxcbiAgICBnZXRQcm90b3R5cGUgPSByZXF1aXJlKCcuL19nZXRQcm90b3R5cGUnKSxcbiAgICBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAqL1xuZnVuY3Rpb24gaW5pdENsb25lT2JqZWN0KG9iamVjdCkge1xuICByZXR1cm4gKHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNQcm90b3R5cGUob2JqZWN0KSlcbiAgICA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpXG4gICAgOiB7fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbml0Q2xvbmVPYmplY3Q7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19pbml0Q2xvbmVPYmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IDQwMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 401 */
/***/ function(module, exports, __webpack_require__) {

    eval("var isObject = __webpack_require__(18);\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n  function object() {}\n  return function(proto) {\n    if (!isObject(proto)) {\n      return {};\n    }\n    if (objectCreate) {\n      return objectCreate(proto);\n    }\n    object.prototype = proto;\n    var result = new object;\n    object.prototype = undefined;\n    return result;\n  };\n}());\n\nmodule.exports = baseCreate;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VDcmVhdGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNyZWF0ZWAgd2l0aG91dCBzdXBwb3J0IGZvciBhc3NpZ25pbmdcbiAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvdG8gVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICovXG52YXIgYmFzZUNyZWF0ZSA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gb2JqZWN0KCkge31cbiAgcmV0dXJuIGZ1bmN0aW9uKHByb3RvKSB7XG4gICAgaWYgKCFpc09iamVjdChwcm90bykpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgaWYgKG9iamVjdENyZWF0ZSkge1xuICAgICAgcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7XG4gICAgfVxuICAgIG9iamVjdC5wcm90b3R5cGUgPSBwcm90bztcbiAgICB2YXIgcmVzdWx0ID0gbmV3IG9iamVjdDtcbiAgICBvYmplY3QucHJvdG90eXBlID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VDcmVhdGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19iYXNlQ3JlYXRlLmpzXG4vLyBtb2R1bGUgaWQgPSA0MDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 402 */
/***/ function(module, exports, __webpack_require__) {

    eval("var castPath = __webpack_require__(120),\n    last = __webpack_require__(169),\n    parent = __webpack_require__(403),\n    toKey = __webpack_require__(128);\n\n/**\n * The base implementation of `_.unset`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The property path to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n */\nfunction baseUnset(object, path) {\n  path = castPath(path, object);\n  object = parent(object, path);\n  return object == null || delete object[toKey(last(path))];\n}\n\nmodule.exports = baseUnset;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VVbnNldC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY2FzdFBhdGggPSByZXF1aXJlKCcuL19jYXN0UGF0aCcpLFxuICAgIGxhc3QgPSByZXF1aXJlKCcuL2xhc3QnKSxcbiAgICBwYXJlbnQgPSByZXF1aXJlKCcuL19wYXJlbnQnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5zZXRgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHByb3BlcnR5IHBhdGggdG8gdW5zZXQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHByb3BlcnR5IGlzIGRlbGV0ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZVVuc2V0KG9iamVjdCwgcGF0aCkge1xuICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcbiAgb2JqZWN0ID0gcGFyZW50KG9iamVjdCwgcGF0aCk7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCB8fCBkZWxldGUgb2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVW5zZXQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19iYXNlVW5zZXQuanNcbi8vIG1vZHVsZSBpZCA9IDQwMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 403 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseGet = __webpack_require__(119),\n    baseSlice = __webpack_require__(404);\n\n/**\n * Gets the parent value at `path` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path to get the parent value of.\n * @returns {*} Returns the parent value.\n */\nfunction parent(object, path) {\n  return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n}\n\nmodule.exports = parent;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3BhcmVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUdldCA9IHJlcXVpcmUoJy4vX2Jhc2VHZXQnKSxcbiAgICBiYXNlU2xpY2UgPSByZXF1aXJlKCcuL19iYXNlU2xpY2UnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBwYXJlbnQgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fSBwYXRoIFRoZSBwYXRoIHRvIGdldCB0aGUgcGFyZW50IHZhbHVlIG9mLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHBhcmVudCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gcGFyZW50KG9iamVjdCwgcGF0aCkge1xuICByZXR1cm4gcGF0aC5sZW5ndGggPCAyID8gb2JqZWN0IDogYmFzZUdldChvYmplY3QsIGJhc2VTbGljZShwYXRoLCAwLCAtMSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX3BhcmVudC5qc1xuLy8gbW9kdWxlIGlkID0gNDAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 404 */
/***/ function(module, exports) {

    eval("/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n  var index = -1,\n      length = array.length;\n\n  if (start < 0) {\n    start = -start > length ? 0 : (length + start);\n  }\n  end = end > length ? length : end;\n  if (end < 0) {\n    end += length;\n  }\n  length = start > end ? 0 : ((end - start) >>> 0);\n  start >>>= 0;\n\n  var result = Array(length);\n  while (++index < length) {\n    result[index] = array[index + start];\n  }\n  return result;\n}\n\nmodule.exports = baseSlice;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VTbGljZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNsaWNlYCB3aXRob3V0IGFuIGl0ZXJhdGVlIGNhbGwgZ3VhcmQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBiYXNlU2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gLXN0YXJ0ID4gbGVuZ3RoID8gMCA6IChsZW5ndGggKyBzdGFydCk7XG4gIH1cbiAgZW5kID0gZW5kID4gbGVuZ3RoID8gbGVuZ3RoIDogZW5kO1xuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5ndGg7XG4gIH1cbiAgbGVuZ3RoID0gc3RhcnQgPiBlbmQgPyAwIDogKChlbmQgLSBzdGFydCkgPj4+IDApO1xuICBzdGFydCA+Pj49IDA7XG5cbiAgdmFyIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGFycmF5W2luZGV4ICsgc3RhcnRdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNsaWNlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYmFzZVNsaWNlLmpzXG4vLyBtb2R1bGUgaWQgPSA0MDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 405 */
/***/ function(module, exports, __webpack_require__) {

    eval("var isPlainObject = __webpack_require__(406);\n\n/**\n * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n * objects.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {string} key The key of the property to inspect.\n * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n */\nfunction customOmitClone(value) {\n  return isPlainObject(value) ? undefined : value;\n}\n\nmodule.exports = customOmitClone;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2N1c3RvbU9taXRDbG9uZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4vaXNQbGFpbk9iamVjdCcpO1xuXG4vKipcbiAqIFVzZWQgYnkgYF8ub21pdGAgdG8gY3VzdG9taXplIGl0cyBgXy5jbG9uZURlZXBgIHVzZSB0byBvbmx5IGNsb25lIHBsYWluXG4gKiBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBpbnNwZWN0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHVuY2xvbmVkIHZhbHVlIG9yIGB1bmRlZmluZWRgIHRvIGRlZmVyIGNsb25pbmcgdG8gYF8uY2xvbmVEZWVwYC5cbiAqL1xuZnVuY3Rpb24gY3VzdG9tT21pdENsb25lKHZhbHVlKSB7XG4gIHJldHVybiBpc1BsYWluT2JqZWN0KHZhbHVlKSA/IHVuZGVmaW5lZCA6IHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGN1c3RvbU9taXRDbG9uZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2N1c3RvbU9taXRDbG9uZS5qc1xuLy8gbW9kdWxlIGlkID0gNDA1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 406 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseGetTag = __webpack_require__(20),\n    getPrototype = __webpack_require__(386),\n    isObjectLike = __webpack_require__(26);\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n  if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n    return false;\n  }\n  var proto = getPrototype(value);\n  if (proto === null) {\n    return true;\n  }\n  var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n  return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n    funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNQbGFpbk9iamVjdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBnZXRQcm90b3R5cGUgPSByZXF1aXJlKCcuL19nZXRQcm90b3R5cGUnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBpbmZlciB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuICovXG52YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC44LjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqIH1cbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpIHx8IGJhc2VHZXRUYWcodmFsdWUpICE9IG9iamVjdFRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGUodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgQ3RvciA9IGhhc093blByb3BlcnR5LmNhbGwocHJvdG8sICdjb25zdHJ1Y3RvcicpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gdHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJlxuICAgIGZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpID09IG9iamVjdEN0b3JTdHJpbmc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQbGFpbk9iamVjdDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvaXNQbGFpbk9iamVjdC5qc1xuLy8gbW9kdWxlIGlkID0gNDA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 407 */
/***/ function(module, exports, __webpack_require__) {

    eval("var flatten = __webpack_require__(408),\n    overRest = __webpack_require__(161),\n    setToString = __webpack_require__(163);\n\n/**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\nfunction flatRest(func) {\n  return setToString(overRest(func, undefined, flatten), func + '');\n}\n\nmodule.exports = flatRest;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2ZsYXRSZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBmbGF0dGVuID0gcmVxdWlyZSgnLi9mbGF0dGVuJyksXG4gICAgb3ZlclJlc3QgPSByZXF1aXJlKCcuL19vdmVyUmVzdCcpLFxuICAgIHNldFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fc2V0VG9TdHJpbmcnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCBmbGF0dGVucyB0aGUgcmVzdCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBmbGF0UmVzdChmdW5jKSB7XG4gIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCB1bmRlZmluZWQsIGZsYXR0ZW4pLCBmdW5jICsgJycpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZsYXRSZXN0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fZmxhdFJlc3QuanNcbi8vIG1vZHVsZSBpZCA9IDQwN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 408 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseFlatten = __webpack_require__(154);\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n  var length = array == null ? 0 : array.length;\n  return length ? baseFlatten(array, 1) : [];\n}\n\nmodule.exports = flatten;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvZmxhdHRlbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUZsYXR0ZW4gPSByZXF1aXJlKCcuL19iYXNlRmxhdHRlbicpO1xuXG4vKipcbiAqIEZsYXR0ZW5zIGBhcnJheWAgYSBzaW5nbGUgbGV2ZWwgZGVlcC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmZsYXR0ZW4oWzEsIFsyLCBbMywgWzRdXSwgNV1dKTtcbiAqIC8vID0+IFsxLCAyLCBbMywgWzRdXSwgNV1cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbihhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgMSkgOiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmbGF0dGVuO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9mbGF0dGVuLmpzXG4vLyBtb2R1bGUgaWQgPSA0MDhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 409 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _templateObject = _taggedTemplateLiteral(['\\n    <span class=\"best_in_place best_in_place_name\"\\n      id=\"best_in_place_map_{{id}}_name\"\\n      data-bip-url=\"/maps/{{id}}\"\\n      data-bip-object=\"map\"\\n      data-bip-attribute=\"name\"\\n      data-bip-type=\"textarea\"\\n      data-bip-activator=\"#mapInfoName\"\\n      data-bip-value=\"{{name}}\"\\n    >{{name}}</span>'], ['\\n    <span class=\"best_in_place best_in_place_name\"\\n      id=\"best_in_place_map_{{id}}_name\"\\n      data-bip-url=\"/maps/{{id}}\"\\n      data-bip-object=\"map\"\\n      data-bip-attribute=\"name\"\\n      data-bip-type=\"textarea\"\\n      data-bip-activator=\"#mapInfoName\"\\n      data-bip-value=\"{{name}}\"\\n    >{{name}}</span>']),_templateObject2 = _taggedTemplateLiteral(['\\n    <span class=\"best_in_place best_in_place_desc\"\\n      id=\"best_in_place_map_{{id}}_desc\"\\n      data-bip-url=\"/maps/{{id}}\"\\n      data-bip-object=\"map\"\\n      data-bip-attribute=\"desc\"\\n      data-bip-nil=\"Click to add description...\"\\n      data-bip-type=\"textarea\"\\n      data-bip-activator=\"#mapInfoDesc\"\\n      data-bip-value=\"{{desc}}\"\\n    >{{desc}}</span>'], ['\\n    <span class=\"best_in_place best_in_place_desc\"\\n      id=\"best_in_place_map_{{id}}_desc\"\\n      data-bip-url=\"/maps/{{id}}\"\\n      data-bip-object=\"map\"\\n      data-bip-attribute=\"desc\"\\n      data-bip-nil=\"Click to add description...\"\\n      data-bip-type=\"textarea\"\\n      data-bip-activator=\"#mapInfoDesc\"\\n      data-bip-value=\"{{desc}}\"\\n    >{{desc}}</span>']);\n\nvar _outdent = __webpack_require__(148);var _outdent2 = _interopRequireDefault(_outdent);\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _DataModel = __webpack_require__(149);var _DataModel2 = _interopRequireDefault(_DataModel);\nvar _GlobalUI = __webpack_require__(362);var _GlobalUI2 = _interopRequireDefault(_GlobalUI);\nvar _Router = __webpack_require__(367);var _Router2 = _interopRequireDefault(_Router);\nvar _Util = __webpack_require__(410);var _Util2 = _interopRequireDefault(_Util);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}function _taggedTemplateLiteral(strings, raw) {return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } }));} /* global $, Hogan, Bloodhound, Countable */\n\nvar InfoBox = {\n  isOpen: false,\n  changing: false,\n  selectingPermission: false,\n  changePermissionText: \"<div class='tooltips'>As the creator, you can change the permission of this map, and the permission of all the topics and synapses you have authority to change will change as well.</div>\",\n  nameHTML: (0, _outdent2.default)(_templateObject),\n\n\n\n\n\n\n\n\n\n  descHTML: (0, _outdent2.default)(_templateObject2),\n\n\n\n\n\n\n\n\n\n\n  userImageUrl: '',\n  init: function init(serverData, updateThumbnail) {\n    var self = InfoBox;\n\n    self.updateThumbnail = updateThumbnail;\n\n    $('.mapInfoIcon').click(self.toggleBox);\n    $('.mapInfoBox').click(function (event) {\n      event.stopPropagation();\n    });\n    $('body').click(self.close);\n\n    self.attachEventListeners();\n\n    self.generateBoxHTML = Hogan.compile($('#mapInfoBoxTemplate').html());\n\n    self.userImageUrl = serverData['user.png'];\n\n    var querystring = window.location.search.replace(/^\\?/, '');\n    if (querystring === 'new') {\n      self.open();\n      $('.mapInfoBox').addClass('mapRequestTitle');\n      $('#mapInfoName').trigger('click');\n      $('#mapInfoName textarea').focus();\n      $('#mapInfoName textarea').select();\n    }\n  },\n  toggleBox: function toggleBox(event) {\n    var self = InfoBox;\n\n    if (self.isOpen) self.close();else\n    self.open();\n\n    event.stopPropagation();\n  },\n  open: function open() {\n    var self = InfoBox;\n    $('.mapInfoIcon div').addClass('hide');\n    if (!self.isOpen && !self.changing) {\n      self.changing = true;\n      $('.mapInfoBox').fadeIn(200, function () {\n        self.changing = false;\n        self.isOpen = true;\n      });\n    }\n  },\n  close: function close() {\n    var self = InfoBox;\n\n    $('.mapInfoIcon div').removeClass('hide');\n    if (!self.changing) {\n      self.changing = true;\n      $('.mapInfoBox').fadeOut(200, function () {\n        self.changing = false;\n        self.isOpen = false;\n        self.hidePermissionSelect();\n        $('.mapContributors .tip').hide();\n      });\n    }\n  },\n  load: function load() {\n    var self = InfoBox;\n\n    var map = _Active2.default.Map;\n\n    var obj = map.pick('permission', 'topic_count', 'synapse_count');\n\n    var isCreator = map.authorizePermissionChange(_Active2.default.Mapper);\n    var canEdit = map.authorizeToEdit(_Active2.default.Mapper);\n    var relevantPeople = map.get('permission') === 'commons' ? _DataModel2.default.Mappers : _DataModel2.default.Collaborators;\n    var shareable = map.get('permission') !== 'private';\n\n    obj['name'] = canEdit ? Hogan.compile(self.nameHTML).render({ id: map.id, name: map.get('name') }) : map.get('name');\n    obj['desc'] = canEdit ? Hogan.compile(self.descHTML).render({ id: map.id, desc: map.get('desc') }) : map.get('desc');\n    obj['map_creator_tip'] = isCreator ? self.changePermissionText : '';\n\n    obj['contributor_count'] = relevantPeople.length;\n    obj['contributors_class'] = relevantPeople.length > 1 ? 'multiple' : '';\n    obj['contributors_class'] += relevantPeople.length === 2 ? ' mTwo' : '';\n    obj['contributor_image'] = relevantPeople.length > 0 ? relevantPeople.models[0].get('image') : self.userImageUrl;\n    obj['contributor_list'] = self.createContributorList();\n\n    obj['user_name'] = isCreator ? 'You' : map.get('user_name');\n    obj['created_at'] = map.get('created_at_clean');\n    obj['updated_at'] = map.get('updated_at_clean');\n\n    var classes = isCreator ? 'yourMap' : '';\n    classes += canEdit ? ' canEdit' : '';\n    classes += shareable ? ' shareable' : '';\n    $('.mapInfoBox').removeClass('shareable yourMap canEdit').\n    addClass(classes).\n    html(self.generateBoxHTML.render(obj));\n\n    self.attachEventListeners();\n  },\n  attachEventListeners: function attachEventListeners() {\n    var self = InfoBox;\n\n    $('.mapInfoBox.canEdit .best_in_place').best_in_place();\n\n    // because anyone who can edit the map can change the map title\n    var bipName = $('.mapInfoBox .best_in_place_name');\n    bipName.unbind('best_in_place:activate').bind('best_in_place:activate', function () {\n      var $el = bipName.find('textarea');\n      var el = $el[0];\n\n      $el.attr('maxlength', '140');\n\n      $('.mapInfoName').append('<div class=\"nameCounter forMap\"></div>');\n\n      var callback = function callback(data) {\n        $('.nameCounter.forMap').html(data.all + '/140');\n      };\n      Countable.live(el, callback);\n    });\n    bipName.unbind('best_in_place:deactivate').bind('best_in_place:deactivate', function () {\n      $('.nameCounter.forMap').remove();\n    });\n\n    $('.mapInfoName .best_in_place_name').unbind('ajax:success').bind('ajax:success', function () {\n      var name = $(this).html();\n      _Active2.default.Map.set('name', name);\n      _Active2.default.Map.trigger('saved');\n      // mobile menu\n      $('#header_content').html(name);\n      $('.mapInfoBox').removeClass('mapRequestTitle');\n      document.title = name + ' | Metamaps';\n      window.history.replaceState('', name + ' | Metamaps', window.location.pathname);\n    });\n\n    $('.mapInfoDesc .best_in_place_desc').unbind('ajax:success').bind('ajax:success', function () {\n      var desc = $(this).html();\n      _Active2.default.Map.set('desc', desc);\n      _Active2.default.Map.trigger('saved');\n    });\n\n    $('.mapInfoDesc .best_in_place_desc, .mapInfoName .best_in_place_name').unbind('keypress').keypress(function (e) {\n      var ENTER = 13;\n      if (e.which === ENTER) {\n        $(this).data('bestInPlaceEditor').update();\n      }\n    });\n\n    $('.yourMap .mapPermission').unbind().click(self.onPermissionClick);\n    // .yourMap in the unbind/bind is just a namespace for the events\n    // not a reference to the class .yourMap on the .mapInfoBox\n    $('.mapInfoBox.yourMap').unbind('.yourMap').bind('click.yourMap', self.hidePermissionSelect);\n\n    $('.yourMap .mapInfoDelete').unbind().click(self.deleteActiveMap);\n    $('.mapInfoThumbnail').unbind().click(self.updateThumbnail);\n\n    $('.mapContributors span, #mapContribs').unbind().click(function (event) {\n      $('.mapContributors .tip').toggle();\n      event.stopPropagation();\n    });\n    $('.mapContributors .tip').unbind().click(function (event) {\n      event.stopPropagation();\n    });\n    $('.mapContributors .tip li a').click(_Router2.default.intercept);\n\n    $('.mapInfoBox').unbind('.hideTip').bind('click.hideTip', function () {\n      $('.mapContributors .tip').hide();\n    });\n\n    self.addTypeahead();\n  },\n  addTypeahead: function addTypeahead() {\n    var self = InfoBox;\n\n    if (!_Active2.default.Map) return;\n\n    // for autocomplete\n    var collaborators = {\n      name: 'collaborators',\n      limit: 9999,\n      display: function display(s) {return s.label;},\n      templates: {\n        notFound: function notFound(s) {\n          return Hogan.compile($('#collaboratorSearchTemplate').html()).render({\n            value: 'No results',\n            label: 'No results',\n            rtype: 'noresult',\n            profile: self.userImageUrl });\n\n        },\n        suggestion: function suggestion(s) {\n          return Hogan.compile($('#collaboratorSearchTemplate').html()).render(s);\n        } },\n\n      source: new Bloodhound({\n        datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),\n        queryTokenizer: Bloodhound.tokenizers.whitespace,\n        remote: {\n          url: '/search/mappers?term=%QUERY',\n          wildcard: '%QUERY' } }) };\n\n\n\n\n    // for adding map collaborators, who will have edit rights\n    if (_Active2.default.Mapper && _Active2.default.Mapper.id === _Active2.default.Map.get('user_id')) {\n      $('.collaboratorSearchField').typeahead(\n      {\n        highlight: false },\n\n      [collaborators]);\n\n      $('.collaboratorSearchField').bind('typeahead:select', self.handleResultClick);\n      $('.mapContributors .removeCollaborator').click(function () {\n        self.removeCollaborator(parseInt($(this).data('id')));\n      });\n    }\n  },\n  removeCollaborator: function removeCollaborator(collaboratorId) {\n    var self = InfoBox;\n    _DataModel2.default.Collaborators.remove(_DataModel2.default.Collaborators.get(collaboratorId));\n    var mapperIds = _DataModel2.default.Collaborators.models.map(function (mapper) {return mapper.id;});\n    $.post('/maps/' + _Active2.default.Map.id + '/access', { access: mapperIds });\n    self.updateNumbers();\n  },\n  addCollaborator: function addCollaborator(newCollaboratorId) {\n    var self = InfoBox;\n\n    if (_DataModel2.default.Collaborators.get(newCollaboratorId)) {\n      _GlobalUI2.default.notifyUser('That user already has access');\n      return;\n    }\n\n    function callback(mapper) {\n      _DataModel2.default.Collaborators.add(mapper);\n      var mapperIds = _DataModel2.default.Collaborators.models.map(function (mapper) {return mapper.id;});\n      $.post('/maps/' + _Active2.default.Map.id + '/access', { access: mapperIds });\n      var name = _DataModel2.default.Collaborators.get(newCollaboratorId).get('name');\n      _GlobalUI2.default.notifyUser(name + ' will be notified');\n      self.updateNumbers();\n    }\n\n    $.getJSON('/users/' + newCollaboratorId + '.json', callback);\n  },\n  handleResultClick: function handleResultClick(event, item) {\n    var self = InfoBox;\n\n    self.addCollaborator(item.id);\n    $('.collaboratorSearchField').typeahead('val', '');\n  },\n  updateNameDescPerm: function updateNameDescPerm(name, desc, perm) {\n    $('.mapInfoBox').removeClass('mapRequestTitle');\n    $('.mapInfoName .best_in_place_name').html(name);\n    $('.mapInfoDesc .best_in_place_desc').html(desc);\n    $('.mapInfoBox .mapPermission').removeClass('commons public private').addClass(perm);\n  },\n  createContributorList: function createContributorList() {\n    var relevantPeople = _Active2.default.Map.get('permission') === 'commons' ? _DataModel2.default.Mappers : _DataModel2.default.Collaborators;\n    var activeMapperIsCreator = _Active2.default.Mapper && _Active2.default.Mapper.id === _Active2.default.Map.get('user_id');\n    var string = '';\n    string += '<ul>';\n\n    relevantPeople.each(function (m) {\n      var isCreator = _Active2.default.Map.get('user_id') === m.get('id');\n      string += '<li><a href=\"/explore/mapper/' + m.get('id') + '\">' + '<img class=\"rtUserImage\" width=\"25\" height=\"25\" src=\"' + m.get('image') + '\" />' + m.get('name');\n      if (isCreator) string += ' (creator)';\n      string += '</a>';\n      if (activeMapperIsCreator && !isCreator) string += '<span class=\"removeCollaborator\" data-id=\"' + m.get('id') + '\"></span>';\n      string += '</li>';\n    });\n\n    string += '</ul>';\n\n    if (activeMapperIsCreator) {\n      string += '<div class=\"collabSearchField\"><span class=\"addCollab\"></span><input class=\"collaboratorSearchField\" placeholder=\"Add a collaborator\"></input></div>';\n    }\n    return string;\n  },\n  updateNumbers: function updateNumbers() {\n    if (!_Active2.default.Map) return;\n\n    var self = InfoBox;\n\n    var relevantPeople = _Active2.default.Map.get('permission') === 'commons' ? _DataModel2.default.Mappers : _DataModel2.default.Collaborators;\n\n    var contributorsClass = '';\n    if (relevantPeople.length === 2) {\n      contributorsClass = 'multiple mTwo';\n    } else if (relevantPeople.length > 2) {\n      contributorsClass = 'multiple';\n    }\n\n    var contributorsImage = self.userImageUrl;\n    if (relevantPeople.length > 0) {\n      // get the first contributor and use their image\n      contributorsImage = relevantPeople.models[0].get('image');\n    }\n    $('.mapContributors img').attr('src', contributorsImage).removeClass('multiple mTwo').addClass(contributorsClass);\n    $('.mapContributors span').text(relevantPeople.length);\n    $('.mapContributors .tip').html(self.createContributorList());\n    self.addTypeahead();\n    $('.mapContributors .tip').unbind().click(function (event) {\n      event.stopPropagation();\n    });\n    $('.mapTopics').text(_DataModel2.default.Topics.length);\n    $('.mapSynapses').text(_DataModel2.default.Synapses.length);\n\n    $('.mapEditedAt').html('<span>Last edited: </span>' + _Util2.default.nowDateFormatted());\n  },\n  onPermissionClick: function onPermissionClick(event) {\n    var self = InfoBox;\n\n    if (!self.selectingPermission) {\n      self.selectingPermission = true;\n      $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow\n      if ($(this).hasClass('commons')) {\n        $(this).append('<ul class=\"permissionSelect\"><li class=\"public\"></li><li class=\"private\"></li></ul>');\n      } else if ($(this).hasClass('public')) {\n        $(this).append('<ul class=\"permissionSelect\"><li class=\"commons\"></li><li class=\"private\"></li></ul>');\n      } else if ($(this).hasClass('private')) {\n        $(this).append('<ul class=\"permissionSelect\"><li class=\"commons\"></li><li class=\"public\"></li></ul>');\n      }\n      $('.mapPermission .permissionSelect li').click(self.selectPermission);\n      event.stopPropagation();\n    }\n  },\n  hidePermissionSelect: function hidePermissionSelect() {\n    var self = InfoBox;\n\n    self.selectingPermission = false;\n    $('.mapPermission').removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow\n    $('.mapPermission .permissionSelect').remove();\n  },\n  selectPermission: function selectPermission(event) {\n    var self = InfoBox;\n\n    self.selectingPermission = false;\n    var permission = $(this).attr('class');\n    _Active2.default.Map.save({\n      permission: permission });\n\n    _Active2.default.Map.updateMapWrapper();\n    var shareable = permission === 'private' ? '' : 'shareable';\n    $('.mapPermission').removeClass('commons public private minimize').addClass(permission);\n    $('.mapPermission .permissionSelect').remove();\n    $('.mapInfoBox').removeClass('shareable').addClass(shareable);\n    event.stopPropagation();\n  },\n  deleteActiveMap: function deleteActiveMap() {\n    var confirmString = 'Are you sure you want to delete this map? ';\n    confirmString += 'This action is irreversible. It will not delete the topics and synapses on the map.';\n\n    var doIt = window.confirm(confirmString);\n    var map = _Active2.default.Map;\n    var mapper = _Active2.default.Mapper;\n    var authorized = map.authorizePermissionChange(mapper);\n\n    if (doIt && authorized) {\n      InfoBox.close();\n      _DataModel2.default.Maps.Active.remove(map);\n      _DataModel2.default.Maps.Featured.remove(map);\n      _DataModel2.default.Maps.Mine.remove(map);\n      _DataModel2.default.Maps.Shared.remove(map);\n      map.destroy();\n      _Router2.default.home();\n      _GlobalUI2.default.notifyUser('Map eliminated');\n    } else if (!authorized) {\n      window.alert(\"Hey now. We can't just go around willy nilly deleting other people's maps now can we? Run off and find something constructive to do, eh?\");\n    }\n  } };exports.default =\n\n\nInfoBox;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA5LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvTWFwL0luZm9Cb3guanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsICQsIEhvZ2FuLCBCbG9vZGhvdW5kLCBDb3VudGFibGUgKi9cblxuaW1wb3J0IG91dGRlbnQgZnJvbSAnb3V0ZGVudCdcblxuaW1wb3J0IEFjdGl2ZSBmcm9tICcuLi9BY3RpdmUnXG5pbXBvcnQgRGF0YU1vZGVsIGZyb20gJy4uL0RhdGFNb2RlbCdcbmltcG9ydCBHbG9iYWxVSSBmcm9tICcuLi9HbG9iYWxVSSdcbmltcG9ydCBSb3V0ZXIgZnJvbSAnLi4vUm91dGVyJ1xuaW1wb3J0IFV0aWwgZnJvbSAnLi4vVXRpbCdcblxuY29uc3QgSW5mb0JveCA9IHtcbiAgaXNPcGVuOiBmYWxzZSxcbiAgY2hhbmdpbmc6IGZhbHNlLFxuICBzZWxlY3RpbmdQZXJtaXNzaW9uOiBmYWxzZSxcbiAgY2hhbmdlUGVybWlzc2lvblRleHQ6IFwiPGRpdiBjbGFzcz0ndG9vbHRpcHMnPkFzIHRoZSBjcmVhdG9yLCB5b3UgY2FuIGNoYW5nZSB0aGUgcGVybWlzc2lvbiBvZiB0aGlzIG1hcCwgYW5kIHRoZSBwZXJtaXNzaW9uIG9mIGFsbCB0aGUgdG9waWNzIGFuZCBzeW5hcHNlcyB5b3UgaGF2ZSBhdXRob3JpdHkgdG8gY2hhbmdlIHdpbGwgY2hhbmdlIGFzIHdlbGwuPC9kaXY+XCIsXG4gIG5hbWVIVE1MOiBvdXRkZW50YFxuICAgIDxzcGFuIGNsYXNzPVwiYmVzdF9pbl9wbGFjZSBiZXN0X2luX3BsYWNlX25hbWVcIlxuICAgICAgaWQ9XCJiZXN0X2luX3BsYWNlX21hcF97e2lkfX1fbmFtZVwiXG4gICAgICBkYXRhLWJpcC11cmw9XCIvbWFwcy97e2lkfX1cIlxuICAgICAgZGF0YS1iaXAtb2JqZWN0PVwibWFwXCJcbiAgICAgIGRhdGEtYmlwLWF0dHJpYnV0ZT1cIm5hbWVcIlxuICAgICAgZGF0YS1iaXAtdHlwZT1cInRleHRhcmVhXCJcbiAgICAgIGRhdGEtYmlwLWFjdGl2YXRvcj1cIiNtYXBJbmZvTmFtZVwiXG4gICAgICBkYXRhLWJpcC12YWx1ZT1cInt7bmFtZX19XCJcbiAgICA+e3tuYW1lfX08L3NwYW4+YCxcbiAgZGVzY0hUTUw6IG91dGRlbnRgXG4gICAgPHNwYW4gY2xhc3M9XCJiZXN0X2luX3BsYWNlIGJlc3RfaW5fcGxhY2VfZGVzY1wiXG4gICAgICBpZD1cImJlc3RfaW5fcGxhY2VfbWFwX3t7aWR9fV9kZXNjXCJcbiAgICAgIGRhdGEtYmlwLXVybD1cIi9tYXBzL3t7aWR9fVwiXG4gICAgICBkYXRhLWJpcC1vYmplY3Q9XCJtYXBcIlxuICAgICAgZGF0YS1iaXAtYXR0cmlidXRlPVwiZGVzY1wiXG4gICAgICBkYXRhLWJpcC1uaWw9XCJDbGljayB0byBhZGQgZGVzY3JpcHRpb24uLi5cIlxuICAgICAgZGF0YS1iaXAtdHlwZT1cInRleHRhcmVhXCJcbiAgICAgIGRhdGEtYmlwLWFjdGl2YXRvcj1cIiNtYXBJbmZvRGVzY1wiXG4gICAgICBkYXRhLWJpcC12YWx1ZT1cInt7ZGVzY319XCJcbiAgICA+e3tkZXNjfX08L3NwYW4+YCxcbiAgdXNlckltYWdlVXJsOiAnJyxcbiAgaW5pdDogZnVuY3Rpb24oc2VydmVyRGF0YSwgdXBkYXRlVGh1bWJuYWlsKSB7XG4gICAgdmFyIHNlbGYgPSBJbmZvQm94XG5cbiAgICBzZWxmLnVwZGF0ZVRodW1ibmFpbCA9IHVwZGF0ZVRodW1ibmFpbFxuXG4gICAgJCgnLm1hcEluZm9JY29uJykuY2xpY2soc2VsZi50b2dnbGVCb3gpXG4gICAgJCgnLm1hcEluZm9Cb3gnKS5jbGljayhmdW5jdGlvbihldmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICB9KVxuICAgICQoJ2JvZHknKS5jbGljayhzZWxmLmNsb3NlKVxuXG4gICAgc2VsZi5hdHRhY2hFdmVudExpc3RlbmVycygpXG5cbiAgICBzZWxmLmdlbmVyYXRlQm94SFRNTCA9IEhvZ2FuLmNvbXBpbGUoJCgnI21hcEluZm9Cb3hUZW1wbGF0ZScpLmh0bWwoKSlcblxuICAgIHNlbGYudXNlckltYWdlVXJsID0gc2VydmVyRGF0YVsndXNlci5wbmcnXVxuXG4gICAgdmFyIHF1ZXJ5c3RyaW5nID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaC5yZXBsYWNlKC9eXFw/LywgJycpXG4gICAgaWYgKHF1ZXJ5c3RyaW5nID09PSAnbmV3Jykge1xuICAgICAgc2VsZi5vcGVuKClcbiAgICAgICQoJy5tYXBJbmZvQm94JykuYWRkQ2xhc3MoJ21hcFJlcXVlc3RUaXRsZScpXG4gICAgICAkKCcjbWFwSW5mb05hbWUnKS50cmlnZ2VyKCdjbGljaycpXG4gICAgICAkKCcjbWFwSW5mb05hbWUgdGV4dGFyZWEnKS5mb2N1cygpXG4gICAgICAkKCcjbWFwSW5mb05hbWUgdGV4dGFyZWEnKS5zZWxlY3QoKVxuICAgIH1cbiAgfSxcbiAgdG9nZ2xlQm94OiBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBzZWxmID0gSW5mb0JveFxuXG4gICAgaWYgKHNlbGYuaXNPcGVuKSBzZWxmLmNsb3NlKClcbiAgICBlbHNlIHNlbGYub3BlbigpXG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICB9LFxuICBvcGVuOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IEluZm9Cb3hcbiAgICAkKCcubWFwSW5mb0ljb24gZGl2JykuYWRkQ2xhc3MoJ2hpZGUnKVxuICAgIGlmICghc2VsZi5pc09wZW4gJiYgIXNlbGYuY2hhbmdpbmcpIHtcbiAgICAgIHNlbGYuY2hhbmdpbmcgPSB0cnVlXG4gICAgICAkKCcubWFwSW5mb0JveCcpLmZhZGVJbigyMDAsIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLmNoYW5naW5nID0gZmFsc2VcbiAgICAgICAgc2VsZi5pc09wZW4gPSB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfSxcbiAgY2xvc2U6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gSW5mb0JveFxuXG4gICAgJCgnLm1hcEluZm9JY29uIGRpdicpLnJlbW92ZUNsYXNzKCdoaWRlJylcbiAgICBpZiAoIXNlbGYuY2hhbmdpbmcpIHtcbiAgICAgIHNlbGYuY2hhbmdpbmcgPSB0cnVlXG4gICAgICAkKCcubWFwSW5mb0JveCcpLmZhZGVPdXQoMjAwLCBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5jaGFuZ2luZyA9IGZhbHNlXG4gICAgICAgIHNlbGYuaXNPcGVuID0gZmFsc2VcbiAgICAgICAgc2VsZi5oaWRlUGVybWlzc2lvblNlbGVjdCgpXG4gICAgICAgICQoJy5tYXBDb250cmlidXRvcnMgLnRpcCcpLmhpZGUoKVxuICAgICAgfSlcbiAgICB9XG4gIH0sXG4gIGxvYWQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gSW5mb0JveFxuXG4gICAgdmFyIG1hcCA9IEFjdGl2ZS5NYXBcblxuICAgIHZhciBvYmogPSBtYXAucGljaygncGVybWlzc2lvbicsICd0b3BpY19jb3VudCcsICdzeW5hcHNlX2NvdW50JylcblxuICAgIHZhciBpc0NyZWF0b3IgPSBtYXAuYXV0aG9yaXplUGVybWlzc2lvbkNoYW5nZShBY3RpdmUuTWFwcGVyKVxuICAgIHZhciBjYW5FZGl0ID0gbWFwLmF1dGhvcml6ZVRvRWRpdChBY3RpdmUuTWFwcGVyKVxuICAgIHZhciByZWxldmFudFBlb3BsZSA9IG1hcC5nZXQoJ3Blcm1pc3Npb24nKSA9PT0gJ2NvbW1vbnMnID8gRGF0YU1vZGVsLk1hcHBlcnMgOiBEYXRhTW9kZWwuQ29sbGFib3JhdG9yc1xuICAgIHZhciBzaGFyZWFibGUgPSBtYXAuZ2V0KCdwZXJtaXNzaW9uJykgIT09ICdwcml2YXRlJ1xuXG4gICAgb2JqWyduYW1lJ10gPSBjYW5FZGl0ID8gSG9nYW4uY29tcGlsZShzZWxmLm5hbWVIVE1MKS5yZW5kZXIoe2lkOiBtYXAuaWQsIG5hbWU6IG1hcC5nZXQoJ25hbWUnKX0pIDogbWFwLmdldCgnbmFtZScpXG4gICAgb2JqWydkZXNjJ10gPSBjYW5FZGl0ID8gSG9nYW4uY29tcGlsZShzZWxmLmRlc2NIVE1MKS5yZW5kZXIoe2lkOiBtYXAuaWQsIGRlc2M6IG1hcC5nZXQoJ2Rlc2MnKX0pIDogbWFwLmdldCgnZGVzYycpXG4gICAgb2JqWydtYXBfY3JlYXRvcl90aXAnXSA9IGlzQ3JlYXRvciA/IHNlbGYuY2hhbmdlUGVybWlzc2lvblRleHQgOiAnJ1xuXG4gICAgb2JqWydjb250cmlidXRvcl9jb3VudCddID0gcmVsZXZhbnRQZW9wbGUubGVuZ3RoXG4gICAgb2JqWydjb250cmlidXRvcnNfY2xhc3MnXSA9IHJlbGV2YW50UGVvcGxlLmxlbmd0aCA+IDEgPyAnbXVsdGlwbGUnIDogJydcbiAgICBvYmpbJ2NvbnRyaWJ1dG9yc19jbGFzcyddICs9IHJlbGV2YW50UGVvcGxlLmxlbmd0aCA9PT0gMiA/ICcgbVR3bycgOiAnJ1xuICAgIG9ialsnY29udHJpYnV0b3JfaW1hZ2UnXSA9IHJlbGV2YW50UGVvcGxlLmxlbmd0aCA+IDAgPyByZWxldmFudFBlb3BsZS5tb2RlbHNbMF0uZ2V0KCdpbWFnZScpIDogc2VsZi51c2VySW1hZ2VVcmxcbiAgICBvYmpbJ2NvbnRyaWJ1dG9yX2xpc3QnXSA9IHNlbGYuY3JlYXRlQ29udHJpYnV0b3JMaXN0KClcblxuICAgIG9ialsndXNlcl9uYW1lJ10gPSBpc0NyZWF0b3IgPyAnWW91JyA6IG1hcC5nZXQoJ3VzZXJfbmFtZScpXG4gICAgb2JqWydjcmVhdGVkX2F0J10gPSBtYXAuZ2V0KCdjcmVhdGVkX2F0X2NsZWFuJylcbiAgICBvYmpbJ3VwZGF0ZWRfYXQnXSA9IG1hcC5nZXQoJ3VwZGF0ZWRfYXRfY2xlYW4nKVxuXG4gICAgdmFyIGNsYXNzZXMgPSBpc0NyZWF0b3IgPyAneW91ck1hcCcgOiAnJ1xuICAgIGNsYXNzZXMgKz0gY2FuRWRpdCA/ICcgY2FuRWRpdCcgOiAnJ1xuICAgIGNsYXNzZXMgKz0gc2hhcmVhYmxlID8gJyBzaGFyZWFibGUnIDogJydcbiAgICAkKCcubWFwSW5mb0JveCcpLnJlbW92ZUNsYXNzKCdzaGFyZWFibGUgeW91ck1hcCBjYW5FZGl0JylcbiAgICAgIC5hZGRDbGFzcyhjbGFzc2VzKVxuICAgICAgLmh0bWwoc2VsZi5nZW5lcmF0ZUJveEhUTUwucmVuZGVyKG9iaikpXG5cbiAgICBzZWxmLmF0dGFjaEV2ZW50TGlzdGVuZXJzKClcbiAgfSxcbiAgYXR0YWNoRXZlbnRMaXN0ZW5lcnM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gSW5mb0JveFxuXG4gICAgJCgnLm1hcEluZm9Cb3guY2FuRWRpdCAuYmVzdF9pbl9wbGFjZScpLmJlc3RfaW5fcGxhY2UoKVxuXG4gICAgLy8gYmVjYXVzZSBhbnlvbmUgd2hvIGNhbiBlZGl0IHRoZSBtYXAgY2FuIGNoYW5nZSB0aGUgbWFwIHRpdGxlXG4gICAgdmFyIGJpcE5hbWUgPSAkKCcubWFwSW5mb0JveCAuYmVzdF9pbl9wbGFjZV9uYW1lJylcbiAgICBiaXBOYW1lLnVuYmluZCgnYmVzdF9pbl9wbGFjZTphY3RpdmF0ZScpLmJpbmQoJ2Jlc3RfaW5fcGxhY2U6YWN0aXZhdGUnLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciAkZWwgPSBiaXBOYW1lLmZpbmQoJ3RleHRhcmVhJylcbiAgICAgIHZhciBlbCA9ICRlbFswXVxuXG4gICAgICAkZWwuYXR0cignbWF4bGVuZ3RoJywgJzE0MCcpXG5cbiAgICAgICQoJy5tYXBJbmZvTmFtZScpLmFwcGVuZCgnPGRpdiBjbGFzcz1cIm5hbWVDb3VudGVyIGZvck1hcFwiPjwvZGl2PicpXG5cbiAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgJCgnLm5hbWVDb3VudGVyLmZvck1hcCcpLmh0bWwoZGF0YS5hbGwgKyAnLzE0MCcpXG4gICAgICB9XG4gICAgICBDb3VudGFibGUubGl2ZShlbCwgY2FsbGJhY2spXG4gICAgfSlcbiAgICBiaXBOYW1lLnVuYmluZCgnYmVzdF9pbl9wbGFjZTpkZWFjdGl2YXRlJykuYmluZCgnYmVzdF9pbl9wbGFjZTpkZWFjdGl2YXRlJywgZnVuY3Rpb24oKSB7XG4gICAgICAkKCcubmFtZUNvdW50ZXIuZm9yTWFwJykucmVtb3ZlKClcbiAgICB9KVxuXG4gICAgJCgnLm1hcEluZm9OYW1lIC5iZXN0X2luX3BsYWNlX25hbWUnKS51bmJpbmQoJ2FqYXg6c3VjY2VzcycpLmJpbmQoJ2FqYXg6c3VjY2VzcycsIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG5hbWUgPSAkKHRoaXMpLmh0bWwoKVxuICAgICAgQWN0aXZlLk1hcC5zZXQoJ25hbWUnLCBuYW1lKVxuICAgICAgQWN0aXZlLk1hcC50cmlnZ2VyKCdzYXZlZCcpXG4gICAgICAvLyBtb2JpbGUgbWVudVxuICAgICAgJCgnI2hlYWRlcl9jb250ZW50JykuaHRtbChuYW1lKVxuICAgICAgJCgnLm1hcEluZm9Cb3gnKS5yZW1vdmVDbGFzcygnbWFwUmVxdWVzdFRpdGxlJylcbiAgICAgIGRvY3VtZW50LnRpdGxlID0gYCR7bmFtZX0gfCBNZXRhbWFwc2BcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSgnJywgYCR7bmFtZX0gfCBNZXRhbWFwc2AsIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSlcbiAgICB9KVxuXG4gICAgJCgnLm1hcEluZm9EZXNjIC5iZXN0X2luX3BsYWNlX2Rlc2MnKS51bmJpbmQoJ2FqYXg6c3VjY2VzcycpLmJpbmQoJ2FqYXg6c3VjY2VzcycsIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGRlc2MgPSAkKHRoaXMpLmh0bWwoKVxuICAgICAgQWN0aXZlLk1hcC5zZXQoJ2Rlc2MnLCBkZXNjKVxuICAgICAgQWN0aXZlLk1hcC50cmlnZ2VyKCdzYXZlZCcpXG4gICAgfSlcblxuICAgICQoJy5tYXBJbmZvRGVzYyAuYmVzdF9pbl9wbGFjZV9kZXNjLCAubWFwSW5mb05hbWUgLmJlc3RfaW5fcGxhY2VfbmFtZScpLnVuYmluZCgna2V5cHJlc3MnKS5rZXlwcmVzcyhmdW5jdGlvbihlKSB7XG4gICAgICBjb25zdCBFTlRFUiA9IDEzXG4gICAgICBpZiAoZS53aGljaCA9PT0gRU5URVIpIHtcbiAgICAgICAgJCh0aGlzKS5kYXRhKCdiZXN0SW5QbGFjZUVkaXRvcicpLnVwZGF0ZSgpXG4gICAgICB9XG4gICAgfSlcblxuICAgICQoJy55b3VyTWFwIC5tYXBQZXJtaXNzaW9uJykudW5iaW5kKCkuY2xpY2soc2VsZi5vblBlcm1pc3Npb25DbGljaylcbiAgICAvLyAueW91ck1hcCBpbiB0aGUgdW5iaW5kL2JpbmQgaXMganVzdCBhIG5hbWVzcGFjZSBmb3IgdGhlIGV2ZW50c1xuICAgIC8vIG5vdCBhIHJlZmVyZW5jZSB0byB0aGUgY2xhc3MgLnlvdXJNYXAgb24gdGhlIC5tYXBJbmZvQm94XG4gICAgJCgnLm1hcEluZm9Cb3gueW91ck1hcCcpLnVuYmluZCgnLnlvdXJNYXAnKS5iaW5kKCdjbGljay55b3VyTWFwJywgc2VsZi5oaWRlUGVybWlzc2lvblNlbGVjdClcblxuICAgICQoJy55b3VyTWFwIC5tYXBJbmZvRGVsZXRlJykudW5iaW5kKCkuY2xpY2soc2VsZi5kZWxldGVBY3RpdmVNYXApXG4gICAgJCgnLm1hcEluZm9UaHVtYm5haWwnKS51bmJpbmQoKS5jbGljayhzZWxmLnVwZGF0ZVRodW1ibmFpbClcblxuICAgICQoJy5tYXBDb250cmlidXRvcnMgc3BhbiwgI21hcENvbnRyaWJzJykudW5iaW5kKCkuY2xpY2soZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICQoJy5tYXBDb250cmlidXRvcnMgLnRpcCcpLnRvZ2dsZSgpXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgIH0pXG4gICAgJCgnLm1hcENvbnRyaWJ1dG9ycyAudGlwJykudW5iaW5kKCkuY2xpY2soZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgfSlcbiAgICAkKCcubWFwQ29udHJpYnV0b3JzIC50aXAgbGkgYScpLmNsaWNrKFJvdXRlci5pbnRlcmNlcHQpXG5cbiAgICAkKCcubWFwSW5mb0JveCcpLnVuYmluZCgnLmhpZGVUaXAnKS5iaW5kKCdjbGljay5oaWRlVGlwJywgZnVuY3Rpb24oKSB7XG4gICAgICAkKCcubWFwQ29udHJpYnV0b3JzIC50aXAnKS5oaWRlKClcbiAgICB9KVxuXG4gICAgc2VsZi5hZGRUeXBlYWhlYWQoKVxuICB9LFxuICBhZGRUeXBlYWhlYWQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gSW5mb0JveFxuXG4gICAgaWYgKCFBY3RpdmUuTWFwKSByZXR1cm5cblxuICAgIC8vIGZvciBhdXRvY29tcGxldGVcbiAgICB2YXIgY29sbGFib3JhdG9ycyA9IHtcbiAgICAgIG5hbWU6ICdjb2xsYWJvcmF0b3JzJyxcbiAgICAgIGxpbWl0OiA5OTk5LFxuICAgICAgZGlzcGxheTogZnVuY3Rpb24ocykgeyByZXR1cm4gcy5sYWJlbCB9LFxuICAgICAgdGVtcGxhdGVzOiB7XG4gICAgICAgIG5vdEZvdW5kOiBmdW5jdGlvbihzKSB7XG4gICAgICAgICAgcmV0dXJuIEhvZ2FuLmNvbXBpbGUoJCgnI2NvbGxhYm9yYXRvclNlYXJjaFRlbXBsYXRlJykuaHRtbCgpKS5yZW5kZXIoe1xuICAgICAgICAgICAgdmFsdWU6ICdObyByZXN1bHRzJyxcbiAgICAgICAgICAgIGxhYmVsOiAnTm8gcmVzdWx0cycsXG4gICAgICAgICAgICBydHlwZTogJ25vcmVzdWx0JyxcbiAgICAgICAgICAgIHByb2ZpbGU6IHNlbGYudXNlckltYWdlVXJsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAgc3VnZ2VzdGlvbjogZnVuY3Rpb24ocykge1xuICAgICAgICAgIHJldHVybiBIb2dhbi5jb21waWxlKCQoJyNjb2xsYWJvcmF0b3JTZWFyY2hUZW1wbGF0ZScpLmh0bWwoKSkucmVuZGVyKHMpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzb3VyY2U6IG5ldyBCbG9vZGhvdW5kKHtcbiAgICAgICAgZGF0dW1Ub2tlbml6ZXI6IEJsb29kaG91bmQudG9rZW5pemVycy5vYmoud2hpdGVzcGFjZSgndmFsdWUnKSxcbiAgICAgICAgcXVlcnlUb2tlbml6ZXI6IEJsb29kaG91bmQudG9rZW5pemVycy53aGl0ZXNwYWNlLFxuICAgICAgICByZW1vdGU6IHtcbiAgICAgICAgICB1cmw6ICcvc2VhcmNoL21hcHBlcnM/dGVybT0lUVVFUlknLFxuICAgICAgICAgIHdpbGRjYXJkOiAnJVFVRVJZJ1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIGZvciBhZGRpbmcgbWFwIGNvbGxhYm9yYXRvcnMsIHdobyB3aWxsIGhhdmUgZWRpdCByaWdodHNcbiAgICBpZiAoQWN0aXZlLk1hcHBlciAmJiBBY3RpdmUuTWFwcGVyLmlkID09PSBBY3RpdmUuTWFwLmdldCgndXNlcl9pZCcpKSB7XG4gICAgICAkKCcuY29sbGFib3JhdG9yU2VhcmNoRmllbGQnKS50eXBlYWhlYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBoaWdobGlnaHQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFtjb2xsYWJvcmF0b3JzXVxuICAgICAgKVxuICAgICAgJCgnLmNvbGxhYm9yYXRvclNlYXJjaEZpZWxkJykuYmluZCgndHlwZWFoZWFkOnNlbGVjdCcsIHNlbGYuaGFuZGxlUmVzdWx0Q2xpY2spXG4gICAgICAkKCcubWFwQ29udHJpYnV0b3JzIC5yZW1vdmVDb2xsYWJvcmF0b3InKS5jbGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5yZW1vdmVDb2xsYWJvcmF0b3IocGFyc2VJbnQoJCh0aGlzKS5kYXRhKCdpZCcpKSlcbiAgICAgIH0pXG4gICAgfVxuICB9LFxuICByZW1vdmVDb2xsYWJvcmF0b3I6IGZ1bmN0aW9uKGNvbGxhYm9yYXRvcklkKSB7XG4gICAgdmFyIHNlbGYgPSBJbmZvQm94XG4gICAgRGF0YU1vZGVsLkNvbGxhYm9yYXRvcnMucmVtb3ZlKERhdGFNb2RlbC5Db2xsYWJvcmF0b3JzLmdldChjb2xsYWJvcmF0b3JJZCkpXG4gICAgdmFyIG1hcHBlcklkcyA9IERhdGFNb2RlbC5Db2xsYWJvcmF0b3JzLm1vZGVscy5tYXAoZnVuY3Rpb24obWFwcGVyKSB7IHJldHVybiBtYXBwZXIuaWQgfSlcbiAgICAkLnBvc3QoJy9tYXBzLycgKyBBY3RpdmUuTWFwLmlkICsgJy9hY2Nlc3MnLCB7IGFjY2VzczogbWFwcGVySWRzIH0pXG4gICAgc2VsZi51cGRhdGVOdW1iZXJzKClcbiAgfSxcbiAgYWRkQ29sbGFib3JhdG9yOiBmdW5jdGlvbihuZXdDb2xsYWJvcmF0b3JJZCkge1xuICAgIHZhciBzZWxmID0gSW5mb0JveFxuXG4gICAgaWYgKERhdGFNb2RlbC5Db2xsYWJvcmF0b3JzLmdldChuZXdDb2xsYWJvcmF0b3JJZCkpIHtcbiAgICAgIEdsb2JhbFVJLm5vdGlmeVVzZXIoJ1RoYXQgdXNlciBhbHJlYWR5IGhhcyBhY2Nlc3MnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FsbGJhY2sobWFwcGVyKSB7XG4gICAgICBEYXRhTW9kZWwuQ29sbGFib3JhdG9ycy5hZGQobWFwcGVyKVxuICAgICAgdmFyIG1hcHBlcklkcyA9IERhdGFNb2RlbC5Db2xsYWJvcmF0b3JzLm1vZGVscy5tYXAoZnVuY3Rpb24obWFwcGVyKSB7IHJldHVybiBtYXBwZXIuaWQgfSlcbiAgICAgICQucG9zdCgnL21hcHMvJyArIEFjdGl2ZS5NYXAuaWQgKyAnL2FjY2VzcycsIHsgYWNjZXNzOiBtYXBwZXJJZHMgfSlcbiAgICAgIHZhciBuYW1lID0gRGF0YU1vZGVsLkNvbGxhYm9yYXRvcnMuZ2V0KG5ld0NvbGxhYm9yYXRvcklkKS5nZXQoJ25hbWUnKVxuICAgICAgR2xvYmFsVUkubm90aWZ5VXNlcihuYW1lICsgJyB3aWxsIGJlIG5vdGlmaWVkJylcbiAgICAgIHNlbGYudXBkYXRlTnVtYmVycygpXG4gICAgfVxuXG4gICAgJC5nZXRKU09OKCcvdXNlcnMvJyArIG5ld0NvbGxhYm9yYXRvcklkICsgJy5qc29uJywgY2FsbGJhY2spXG4gIH0sXG4gIGhhbmRsZVJlc3VsdENsaWNrOiBmdW5jdGlvbihldmVudCwgaXRlbSkge1xuICAgIHZhciBzZWxmID0gSW5mb0JveFxuXG4gICAgc2VsZi5hZGRDb2xsYWJvcmF0b3IoaXRlbS5pZClcbiAgICAkKCcuY29sbGFib3JhdG9yU2VhcmNoRmllbGQnKS50eXBlYWhlYWQoJ3ZhbCcsICcnKVxuICB9LFxuICB1cGRhdGVOYW1lRGVzY1Blcm06IGZ1bmN0aW9uKG5hbWUsIGRlc2MsIHBlcm0pIHtcbiAgICAkKCcubWFwSW5mb0JveCcpLnJlbW92ZUNsYXNzKCdtYXBSZXF1ZXN0VGl0bGUnKVxuICAgICQoJy5tYXBJbmZvTmFtZSAuYmVzdF9pbl9wbGFjZV9uYW1lJykuaHRtbChuYW1lKVxuICAgICQoJy5tYXBJbmZvRGVzYyAuYmVzdF9pbl9wbGFjZV9kZXNjJykuaHRtbChkZXNjKVxuICAgICQoJy5tYXBJbmZvQm94IC5tYXBQZXJtaXNzaW9uJykucmVtb3ZlQ2xhc3MoJ2NvbW1vbnMgcHVibGljIHByaXZhdGUnKS5hZGRDbGFzcyhwZXJtKVxuICB9LFxuICBjcmVhdGVDb250cmlidXRvckxpc3Q6IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZWxldmFudFBlb3BsZSA9IEFjdGl2ZS5NYXAuZ2V0KCdwZXJtaXNzaW9uJykgPT09ICdjb21tb25zJyA/IERhdGFNb2RlbC5NYXBwZXJzIDogRGF0YU1vZGVsLkNvbGxhYm9yYXRvcnNcbiAgICB2YXIgYWN0aXZlTWFwcGVySXNDcmVhdG9yID0gQWN0aXZlLk1hcHBlciAmJiBBY3RpdmUuTWFwcGVyLmlkID09PSBBY3RpdmUuTWFwLmdldCgndXNlcl9pZCcpXG4gICAgdmFyIHN0cmluZyA9ICcnXG4gICAgc3RyaW5nICs9ICc8dWw+J1xuXG4gICAgcmVsZXZhbnRQZW9wbGUuZWFjaChmdW5jdGlvbihtKSB7XG4gICAgICB2YXIgaXNDcmVhdG9yID0gQWN0aXZlLk1hcC5nZXQoJ3VzZXJfaWQnKSA9PT0gbS5nZXQoJ2lkJylcbiAgICAgIHN0cmluZyArPSAnPGxpPjxhIGhyZWY9XCIvZXhwbG9yZS9tYXBwZXIvJyArIG0uZ2V0KCdpZCcpICsgJ1wiPicgKyAnPGltZyBjbGFzcz1cInJ0VXNlckltYWdlXCIgd2lkdGg9XCIyNVwiIGhlaWdodD1cIjI1XCIgc3JjPVwiJyArIG0uZ2V0KCdpbWFnZScpICsgJ1wiIC8+JyArIG0uZ2V0KCduYW1lJylcbiAgICAgIGlmIChpc0NyZWF0b3IpIHN0cmluZyArPSAnIChjcmVhdG9yKSdcbiAgICAgIHN0cmluZyArPSAnPC9hPidcbiAgICAgIGlmIChhY3RpdmVNYXBwZXJJc0NyZWF0b3IgJiYgIWlzQ3JlYXRvcikgc3RyaW5nICs9ICc8c3BhbiBjbGFzcz1cInJlbW92ZUNvbGxhYm9yYXRvclwiIGRhdGEtaWQ9XCInICsgbS5nZXQoJ2lkJykgKyAnXCI+PC9zcGFuPidcbiAgICAgIHN0cmluZyArPSAnPC9saT4nXG4gICAgfSlcblxuICAgIHN0cmluZyArPSAnPC91bD4nXG5cbiAgICBpZiAoYWN0aXZlTWFwcGVySXNDcmVhdG9yKSB7XG4gICAgICBzdHJpbmcgKz0gJzxkaXYgY2xhc3M9XCJjb2xsYWJTZWFyY2hGaWVsZFwiPjxzcGFuIGNsYXNzPVwiYWRkQ29sbGFiXCI+PC9zcGFuPjxpbnB1dCBjbGFzcz1cImNvbGxhYm9yYXRvclNlYXJjaEZpZWxkXCIgcGxhY2Vob2xkZXI9XCJBZGQgYSBjb2xsYWJvcmF0b3JcIj48L2lucHV0PjwvZGl2PidcbiAgICB9XG4gICAgcmV0dXJuIHN0cmluZ1xuICB9LFxuICB1cGRhdGVOdW1iZXJzOiBmdW5jdGlvbigpIHtcbiAgICBpZiAoIUFjdGl2ZS5NYXApIHJldHVyblxuXG4gICAgY29uc3Qgc2VsZiA9IEluZm9Cb3hcblxuICAgIHZhciByZWxldmFudFBlb3BsZSA9IEFjdGl2ZS5NYXAuZ2V0KCdwZXJtaXNzaW9uJykgPT09ICdjb21tb25zJyA/IERhdGFNb2RlbC5NYXBwZXJzIDogRGF0YU1vZGVsLkNvbGxhYm9yYXRvcnNcblxuICAgIGxldCBjb250cmlidXRvcnNDbGFzcyA9ICcnXG4gICAgaWYgKHJlbGV2YW50UGVvcGxlLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29udHJpYnV0b3JzQ2xhc3MgPSAnbXVsdGlwbGUgbVR3bydcbiAgICB9IGVsc2UgaWYgKHJlbGV2YW50UGVvcGxlLmxlbmd0aCA+IDIpIHtcbiAgICAgIGNvbnRyaWJ1dG9yc0NsYXNzID0gJ211bHRpcGxlJ1xuICAgIH1cblxuICAgIGxldCBjb250cmlidXRvcnNJbWFnZSA9IHNlbGYudXNlckltYWdlVXJsXG4gICAgaWYgKHJlbGV2YW50UGVvcGxlLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIGdldCB0aGUgZmlyc3QgY29udHJpYnV0b3IgYW5kIHVzZSB0aGVpciBpbWFnZVxuICAgICAgY29udHJpYnV0b3JzSW1hZ2UgPSByZWxldmFudFBlb3BsZS5tb2RlbHNbMF0uZ2V0KCdpbWFnZScpXG4gICAgfVxuICAgICQoJy5tYXBDb250cmlidXRvcnMgaW1nJykuYXR0cignc3JjJywgY29udHJpYnV0b3JzSW1hZ2UpLnJlbW92ZUNsYXNzKCdtdWx0aXBsZSBtVHdvJykuYWRkQ2xhc3MoY29udHJpYnV0b3JzQ2xhc3MpXG4gICAgJCgnLm1hcENvbnRyaWJ1dG9ycyBzcGFuJykudGV4dChyZWxldmFudFBlb3BsZS5sZW5ndGgpXG4gICAgJCgnLm1hcENvbnRyaWJ1dG9ycyAudGlwJykuaHRtbChzZWxmLmNyZWF0ZUNvbnRyaWJ1dG9yTGlzdCgpKVxuICAgIHNlbGYuYWRkVHlwZWFoZWFkKClcbiAgICAkKCcubWFwQ29udHJpYnV0b3JzIC50aXAnKS51bmJpbmQoKS5jbGljayhmdW5jdGlvbihldmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICB9KVxuICAgICQoJy5tYXBUb3BpY3MnKS50ZXh0KERhdGFNb2RlbC5Ub3BpY3MubGVuZ3RoKVxuICAgICQoJy5tYXBTeW5hcHNlcycpLnRleHQoRGF0YU1vZGVsLlN5bmFwc2VzLmxlbmd0aClcblxuICAgICQoJy5tYXBFZGl0ZWRBdCcpLmh0bWwoJzxzcGFuPkxhc3QgZWRpdGVkOiA8L3NwYW4+JyArIFV0aWwubm93RGF0ZUZvcm1hdHRlZCgpKVxuICB9LFxuICBvblBlcm1pc3Npb25DbGljazogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICB2YXIgc2VsZiA9IEluZm9Cb3hcblxuICAgIGlmICghc2VsZi5zZWxlY3RpbmdQZXJtaXNzaW9uKSB7XG4gICAgICBzZWxmLnNlbGVjdGluZ1Blcm1pc3Npb24gPSB0cnVlXG4gICAgICAkKHRoaXMpLmFkZENsYXNzKCdtaW5pbWl6ZScpIC8vIHRoaXMgbGluZSBmbGlwcyB0aGUgZHJvcCBkb3duIGFycm93IHRvIGEgcHVsbCB1cCBhcnJvd1xuICAgICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2NvbW1vbnMnKSkge1xuICAgICAgICAkKHRoaXMpLmFwcGVuZCgnPHVsIGNsYXNzPVwicGVybWlzc2lvblNlbGVjdFwiPjxsaSBjbGFzcz1cInB1YmxpY1wiPjwvbGk+PGxpIGNsYXNzPVwicHJpdmF0ZVwiPjwvbGk+PC91bD4nKVxuICAgICAgfSBlbHNlIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdwdWJsaWMnKSkge1xuICAgICAgICAkKHRoaXMpLmFwcGVuZCgnPHVsIGNsYXNzPVwicGVybWlzc2lvblNlbGVjdFwiPjxsaSBjbGFzcz1cImNvbW1vbnNcIj48L2xpPjxsaSBjbGFzcz1cInByaXZhdGVcIj48L2xpPjwvdWw+JylcbiAgICAgIH0gZWxzZSBpZiAoJCh0aGlzKS5oYXNDbGFzcygncHJpdmF0ZScpKSB7XG4gICAgICAgICQodGhpcykuYXBwZW5kKCc8dWwgY2xhc3M9XCJwZXJtaXNzaW9uU2VsZWN0XCI+PGxpIGNsYXNzPVwiY29tbW9uc1wiPjwvbGk+PGxpIGNsYXNzPVwicHVibGljXCI+PC9saT48L3VsPicpXG4gICAgICB9XG4gICAgICAkKCcubWFwUGVybWlzc2lvbiAucGVybWlzc2lvblNlbGVjdCBsaScpLmNsaWNrKHNlbGYuc2VsZWN0UGVybWlzc2lvbilcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgfVxuICB9LFxuICBoaWRlUGVybWlzc2lvblNlbGVjdDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSBJbmZvQm94XG5cbiAgICBzZWxmLnNlbGVjdGluZ1Blcm1pc3Npb24gPSBmYWxzZVxuICAgICQoJy5tYXBQZXJtaXNzaW9uJykucmVtb3ZlQ2xhc3MoJ21pbmltaXplJykgLy8gdGhpcyBsaW5lIGZsaXBzIHRoZSBwdWxsIHVwIGFycm93IHRvIGEgZHJvcCBkb3duIGFycm93XG4gICAgJCgnLm1hcFBlcm1pc3Npb24gLnBlcm1pc3Npb25TZWxlY3QnKS5yZW1vdmUoKVxuICB9LFxuICBzZWxlY3RQZXJtaXNzaW9uOiBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBzZWxmID0gSW5mb0JveFxuXG4gICAgc2VsZi5zZWxlY3RpbmdQZXJtaXNzaW9uID0gZmFsc2VcbiAgICB2YXIgcGVybWlzc2lvbiA9ICQodGhpcykuYXR0cignY2xhc3MnKVxuICAgIEFjdGl2ZS5NYXAuc2F2ZSh7XG4gICAgICBwZXJtaXNzaW9uOiBwZXJtaXNzaW9uXG4gICAgfSlcbiAgICBBY3RpdmUuTWFwLnVwZGF0ZU1hcFdyYXBwZXIoKVxuICAgIGNvbnN0IHNoYXJlYWJsZSA9IHBlcm1pc3Npb24gPT09ICdwcml2YXRlJyA/ICcnIDogJ3NoYXJlYWJsZSdcbiAgICAkKCcubWFwUGVybWlzc2lvbicpLnJlbW92ZUNsYXNzKCdjb21tb25zIHB1YmxpYyBwcml2YXRlIG1pbmltaXplJykuYWRkQ2xhc3MocGVybWlzc2lvbilcbiAgICAkKCcubWFwUGVybWlzc2lvbiAucGVybWlzc2lvblNlbGVjdCcpLnJlbW92ZSgpXG4gICAgJCgnLm1hcEluZm9Cb3gnKS5yZW1vdmVDbGFzcygnc2hhcmVhYmxlJykuYWRkQ2xhc3Moc2hhcmVhYmxlKVxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gIH0sXG4gIGRlbGV0ZUFjdGl2ZU1hcDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNvbmZpcm1TdHJpbmcgPSAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIG1hcD8gJ1xuICAgIGNvbmZpcm1TdHJpbmcgKz0gJ1RoaXMgYWN0aW9uIGlzIGlycmV2ZXJzaWJsZS4gSXQgd2lsbCBub3QgZGVsZXRlIHRoZSB0b3BpY3MgYW5kIHN5bmFwc2VzIG9uIHRoZSBtYXAuJ1xuXG4gICAgdmFyIGRvSXQgPSB3aW5kb3cuY29uZmlybShjb25maXJtU3RyaW5nKVxuICAgIHZhciBtYXAgPSBBY3RpdmUuTWFwXG4gICAgdmFyIG1hcHBlciA9IEFjdGl2ZS5NYXBwZXJcbiAgICB2YXIgYXV0aG9yaXplZCA9IG1hcC5hdXRob3JpemVQZXJtaXNzaW9uQ2hhbmdlKG1hcHBlcilcblxuICAgIGlmIChkb0l0ICYmIGF1dGhvcml6ZWQpIHtcbiAgICAgIEluZm9Cb3guY2xvc2UoKVxuICAgICAgRGF0YU1vZGVsLk1hcHMuQWN0aXZlLnJlbW92ZShtYXApXG4gICAgICBEYXRhTW9kZWwuTWFwcy5GZWF0dXJlZC5yZW1vdmUobWFwKVxuICAgICAgRGF0YU1vZGVsLk1hcHMuTWluZS5yZW1vdmUobWFwKVxuICAgICAgRGF0YU1vZGVsLk1hcHMuU2hhcmVkLnJlbW92ZShtYXApXG4gICAgICBtYXAuZGVzdHJveSgpXG4gICAgICBSb3V0ZXIuaG9tZSgpXG4gICAgICBHbG9iYWxVSS5ub3RpZnlVc2VyKCdNYXAgZWxpbWluYXRlZCcpXG4gICAgfSBlbHNlIGlmICghYXV0aG9yaXplZCkge1xuICAgICAgd2luZG93LmFsZXJ0KFwiSGV5IG5vdy4gV2UgY2FuJ3QganVzdCBnbyBhcm91bmQgd2lsbHkgbmlsbHkgZGVsZXRpbmcgb3RoZXIgcGVvcGxlJ3MgbWFwcyBub3cgY2FuIHdlPyBSdW4gb2ZmIGFuZCBmaW5kIHNvbWV0aGluZyBjb25zdHJ1Y3RpdmUgdG8gZG8sIGVoP1wiKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbmZvQm94XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL01ldGFtYXBzL01hcC9JbmZvQm94LmpzIl0sIm1hcHBpbmdzIjoiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 410 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _escapeRegExp2 = __webpack_require__(411);var _escapeRegExp3 = _interopRequireDefault(_escapeRegExp2);\n\nvar _commonmark = __webpack_require__(412);\nvar _emojiMart = __webpack_require__(433);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} /* global $ */\n\n\nvar emojiToShortcodes = {};\nObject.keys(_emojiMart.emojiIndex.emojis).forEach(function (key) {\n  var emoji = _emojiMart.emojiIndex.emojis[key];\n  emojiToShortcodes[emoji.native] = emoji.colons;\n});\n\nvar Util = {\n  // helper function to determine how many lines are needed\n  // Line Splitter Function\n  // copyright Stephen Chapman, 19th April 2006\n  // you may copy this code but please keep the copyright notice as well\n  splitLine: function splitLine(st, n) {\n    var b = '';\n    var s = st || '';\n    while (s.length > n) {\n      var c = s.substring(0, n);\n      var d = c.lastIndexOf(' ');\n      var e = c.lastIndexOf('\\n');\n      if (e !== -1) d = e;\n      if (d === -1) d = n;\n      b += c.substring(0, d) + '\\n';\n      s = s.substring(d + 1);\n    }\n    return b + s;\n  },\n\n  nowDateFormatted: function nowDateFormatted() {var date = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Date(Date.now());\n    var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1;\n    var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();\n    var year = date.getFullYear();\n\n    return month + '/' + day + '/' + year;\n  },\n\n  decodeEntities: function decodeEntities(desc) {\n    var temp = document.createElement('p');\n    temp.innerHTML = desc; // browser handles the topics\n    var str = temp.textContent || temp.innerText;\n    temp = null; // delete the element\n    return str;\n  }, // decodeEntities\n\n  getDistance: function getDistance(p1, p2) {\n    return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));\n  },\n\n  // Try using Visualize.mGraph\n  coordsToPixels: function coordsToPixels(mGraph, coords) {\n    if (mGraph) {\n      var canvas = mGraph.canvas;\n      var s = canvas.getSize();\n      var p = canvas.getPos();\n      var ox = canvas.translateOffsetX;\n      var oy = canvas.translateOffsetY;\n      var sx = canvas.scaleOffsetX;\n      var sy = canvas.scaleOffsetY;\n      return {\n        x: coords.x / (1 / sx) + p.x + s.width / 2 + ox,\n        y: coords.y / (1 / sy) + p.y + s.height / 2 + oy };\n\n    } else {\n      return {\n        x: 0,\n        y: 0 };\n\n    }\n  },\n\n  // Try using Visualize.mGraph\n  pixelsToCoords: function pixelsToCoords(mGraph, pixels) {\n    if (mGraph) {\n      var canvas = mGraph.canvas;\n      var s = canvas.getSize();\n      var p = canvas.getPos();\n      var ox = canvas.translateOffsetX;\n      var oy = canvas.translateOffsetY;\n      var sx = canvas.scaleOffsetX;\n      var sy = canvas.scaleOffsetY;\n      return {\n        x: (pixels.x - p.x - s.width / 2 - ox) * (1 / sx),\n        y: (pixels.y - p.y - s.height / 2 - oy) * (1 / sy) };\n\n    } else {\n      return {\n        x: 0,\n        y: 0 };\n\n    }\n  },\n  getPastelColor: function getPastelColor() {var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var rseed = opts.rseed === undefined ? Math.random() : opts.rseed;\n    var gseed = opts.gseed === undefined ? Math.random() : opts.gseed;\n    var bseed = opts.bseed === undefined ? Math.random() : opts.bseed;\n    var r = (Math.round(rseed * 127) + 127).toString(16);\n    var g = (Math.round(gseed * 127) + 127).toString(16);\n    var b = (Math.round(bseed * 127) + 127).toString(16);\n    return Util.colorLuminance('#' + r + g + b, -0.4);\n  },\n  // darkens a hex value by 'lum' percentage\n  colorLuminance: function colorLuminance(hex, lum) {\n    // validate hex string\n    hex = String(hex).replace(/[^0-9a-f]/gi, '');\n    if (hex.length < 6) {\n      hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n    }\n    lum = lum || 0;\n\n    // convert to decimal and change luminosity\n    var rgb = '#';\n    for (var i = 0; i < 3; i++) {\n      var c = parseInt(hex.substr(i * 2, 2), 16);\n      c = Math.round(Math.min(Math.max(0, c + c * lum), 255)).toString(16);\n      rgb += ('00' + c).substr(c.length);\n    }\n\n    return rgb;\n  },\n  openLink: function openLink(url) {\n    var win = url !== '' ? window.open(url, '_blank') : 'empty';\n\n    if (win) {\n      // Browser has allowed it to be opened\n      return true;\n    } else {\n      // Browser has blocked it\n      window.alert('Please allow popups in order to open the link');\n      return false;\n    }\n  },\n  mdToHTML: function mdToHTML(text) {\n    var safeText = text || '';\n    // use safe: true to filter xss\n    return new _commonmark.HtmlRenderer({ safe: true }).\n    render(new _commonmark.Parser().parse(safeText));\n  },\n  logCanvasAttributes: function logCanvasAttributes(canvas) {\n    var fakeMgraph = { canvas: canvas };\n    return {\n      scaleX: canvas.scaleOffsetX,\n      scaleY: canvas.scaleOffsetY,\n      centreCoords: Util.pixelsToCoords(fakeMgraph, { x: canvas.canvases[0].size.width / 2, y: canvas.canvases[0].size.height / 2 }) };\n\n  },\n  resizeCanvas: function resizeCanvas(canvas) {\n    // Store the current canvas attributes, i.e. scale and map-coordinate at the centre of the user's screen\n    var oldAttr = Util.logCanvasAttributes(canvas);\n\n    // Resize the canvas to fill the new window size. Based on how JIT works, this also resets the map back to scale 1 and tranlations = 0\n    canvas.resize($(window).width(), $(window).height());\n\n    // Return the map to the original scale, and then put the previous central map-coordinate back to the centre of user's newly resized screen\n    canvas.scale(oldAttr.scaleX, oldAttr.scaleY);\n    var newAttr = Util.logCanvasAttributes(canvas);\n    canvas.translate(newAttr.centreCoords.x - oldAttr.centreCoords.x, newAttr.centreCoords.y - oldAttr.centreCoords.y);\n  },\n  removeEmoji: function removeEmoji(withEmoji) {\n    var text = withEmoji;\n    Object.keys(_emojiMart.emojiIndex.emojis).forEach(function (key) {\n      var emoji = _emojiMart.emojiIndex.emojis[key];\n      text = text.replace(new RegExp((0, _escapeRegExp3.default)(emoji.native), 'g'), emoji.colons);\n    });\n    return text;\n  },\n  addEmoji: function addEmoji(withoutEmoji) {var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { emoticons: true };\n    var text = withoutEmoji;\n    Object.keys(_emojiMart.emojiIndex.emojis).forEach(function (key) {\n      var emoji = _emojiMart.emojiIndex.emojis[key];\n      text = text.replace(new RegExp((0, _escapeRegExp3.default)(emoji.colons), 'g'), emoji.native);\n    });\n    if (opts.emoticons) {\n      Object.keys(_emojiMart.emojiIndex.emoticons).forEach(function (emoticon) {\n        var key = _emojiMart.emojiIndex.emoticons[emoticon];\n        var emoji = _emojiMart.emojiIndex.emojis[key];\n        text = text.replace(new RegExp((0, _escapeRegExp3.default)(emoticon), 'g'), emoji.native);\n      });\n    }\n    return text;\n  } };exports.default =\n\n\nUtil;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDEwLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvVXRpbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBnbG9iYWwgJCAqL1xuXG5pbXBvcnQgeyBQYXJzZXIsIEh0bWxSZW5kZXJlciB9IGZyb20gJ2NvbW1vbm1hcmsnXG5pbXBvcnQgeyBlbW9qaUluZGV4IH0gZnJvbSAnZW1vamktbWFydCdcbmltcG9ydCB7IGVzY2FwZVJlZ0V4cCB9IGZyb20gJ2xvZGFzaCdcblxuY29uc3QgZW1vamlUb1Nob3J0Y29kZXMgPSB7fVxuT2JqZWN0LmtleXMoZW1vamlJbmRleC5lbW9qaXMpLmZvckVhY2goa2V5ID0+IHtcbiAgY29uc3QgZW1vamkgPSBlbW9qaUluZGV4LmVtb2ppc1trZXldXG4gIGVtb2ppVG9TaG9ydGNvZGVzW2Vtb2ppLm5hdGl2ZV0gPSBlbW9qaS5jb2xvbnNcbn0pXG5cbmNvbnN0IFV0aWwgPSB7XG4gIC8vIGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaG93IG1hbnkgbGluZXMgYXJlIG5lZWRlZFxuICAvLyBMaW5lIFNwbGl0dGVyIEZ1bmN0aW9uXG4gIC8vIGNvcHlyaWdodCBTdGVwaGVuIENoYXBtYW4sIDE5dGggQXByaWwgMjAwNlxuICAvLyB5b3UgbWF5IGNvcHkgdGhpcyBjb2RlIGJ1dCBwbGVhc2Uga2VlcCB0aGUgY29weXJpZ2h0IG5vdGljZSBhcyB3ZWxsXG4gIHNwbGl0TGluZTogZnVuY3Rpb24oc3QsIG4pIHtcbiAgICB2YXIgYiA9ICcnXG4gICAgdmFyIHMgPSBzdCB8fCAnJ1xuICAgIHdoaWxlIChzLmxlbmd0aCA+IG4pIHtcbiAgICAgIHZhciBjID0gcy5zdWJzdHJpbmcoMCwgbilcbiAgICAgIHZhciBkID0gYy5sYXN0SW5kZXhPZignICcpXG4gICAgICB2YXIgZSA9IGMubGFzdEluZGV4T2YoJ1xcbicpXG4gICAgICBpZiAoZSAhPT0gLTEpIGQgPSBlXG4gICAgICBpZiAoZCA9PT0gLTEpIGQgPSBuXG4gICAgICBiICs9IGMuc3Vic3RyaW5nKDAsIGQpICsgJ1xcbidcbiAgICAgIHMgPSBzLnN1YnN0cmluZyhkICsgMSlcbiAgICB9XG4gICAgcmV0dXJuIGIgKyBzXG4gIH0sXG5cbiAgbm93RGF0ZUZvcm1hdHRlZDogZnVuY3Rpb24oZGF0ZSA9IG5ldyBEYXRlKERhdGUubm93KCkpKSB7XG4gICAgY29uc3QgbW9udGggPSAoZGF0ZS5nZXRNb250aCgpICsgMSkgPCAxMCA/ICcwJyArIChkYXRlLmdldE1vbnRoKCkgKyAxKSA6IChkYXRlLmdldE1vbnRoKCkgKyAxKVxuICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF0ZSgpIDwgMTAgPyAnMCcgKyBkYXRlLmdldERhdGUoKSA6IGRhdGUuZ2V0RGF0ZSgpXG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuXG4gICAgcmV0dXJuIG1vbnRoICsgJy8nICsgZGF5ICsgJy8nICsgeWVhclxuICB9LFxuXG4gIGRlY29kZUVudGl0aWVzOiBmdW5jdGlvbihkZXNjKSB7XG4gICAgbGV0IHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJylcbiAgICB0ZW1wLmlubmVySFRNTCA9IGRlc2MgLy8gYnJvd3NlciBoYW5kbGVzIHRoZSB0b3BpY3NcbiAgICBsZXQgc3RyID0gdGVtcC50ZXh0Q29udGVudCB8fCB0ZW1wLmlubmVyVGV4dFxuICAgIHRlbXAgPSBudWxsIC8vIGRlbGV0ZSB0aGUgZWxlbWVudFxuICAgIHJldHVybiBzdHJcbiAgfSwgLy8gZGVjb2RlRW50aXRpZXNcblxuICBnZXREaXN0YW5jZTogZnVuY3Rpb24ocDEsIHAyKSB7XG4gICAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdygocDIueCAtIHAxLngpLCAyKSArIE1hdGgucG93KChwMi55IC0gcDEueSksIDIpKVxuICB9LFxuXG4gIC8vIFRyeSB1c2luZyBWaXN1YWxpemUubUdyYXBoXG4gIGNvb3Jkc1RvUGl4ZWxzOiBmdW5jdGlvbihtR3JhcGgsIGNvb3Jkcykge1xuICAgIGlmIChtR3JhcGgpIHtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IG1HcmFwaC5jYW52YXNcbiAgICAgIGNvbnN0IHMgPSBjYW52YXMuZ2V0U2l6ZSgpXG4gICAgICBjb25zdCBwID0gY2FudmFzLmdldFBvcygpXG4gICAgICBjb25zdCBveCA9IGNhbnZhcy50cmFuc2xhdGVPZmZzZXRYXG4gICAgICBjb25zdCBveSA9IGNhbnZhcy50cmFuc2xhdGVPZmZzZXRZXG4gICAgICBjb25zdCBzeCA9IGNhbnZhcy5zY2FsZU9mZnNldFhcbiAgICAgIGNvbnN0IHN5ID0gY2FudmFzLnNjYWxlT2Zmc2V0WVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogKGNvb3Jkcy54IC8gKDEgLyBzeCkpICsgcC54ICsgcy53aWR0aCAvIDIgKyBveCxcbiAgICAgICAgeTogKGNvb3Jkcy55IC8gKDEgLyBzeSkpICsgcC55ICsgcy5oZWlnaHQgLyAyICsgb3lcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMFxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvLyBUcnkgdXNpbmcgVmlzdWFsaXplLm1HcmFwaFxuICBwaXhlbHNUb0Nvb3JkczogZnVuY3Rpb24obUdyYXBoLCBwaXhlbHMpIHtcbiAgICBpZiAobUdyYXBoKSB7XG4gICAgICBjb25zdCBjYW52YXMgPSBtR3JhcGguY2FudmFzXG4gICAgICBjb25zdCBzID0gY2FudmFzLmdldFNpemUoKVxuICAgICAgY29uc3QgcCA9IGNhbnZhcy5nZXRQb3MoKVxuICAgICAgY29uc3Qgb3ggPSBjYW52YXMudHJhbnNsYXRlT2Zmc2V0WFxuICAgICAgY29uc3Qgb3kgPSBjYW52YXMudHJhbnNsYXRlT2Zmc2V0WVxuICAgICAgY29uc3Qgc3ggPSBjYW52YXMuc2NhbGVPZmZzZXRYXG4gICAgICBjb25zdCBzeSA9IGNhbnZhcy5zY2FsZU9mZnNldFlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IChwaXhlbHMueCAtIHAueCAtIHMud2lkdGggLyAyIC0gb3gpICogKDEgLyBzeCksXG4gICAgICAgIHk6IChwaXhlbHMueSAtIHAueSAtIHMuaGVpZ2h0IC8gMiAtIG95KSAqICgxIC8gc3kpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDBcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGdldFBhc3RlbENvbG9yOiBmdW5jdGlvbihvcHRzID0ge30pIHtcbiAgICBjb25zdCByc2VlZCA9IG9wdHMucnNlZWQgPT09IHVuZGVmaW5lZCA/IE1hdGgucmFuZG9tKCkgOiBvcHRzLnJzZWVkXG4gICAgY29uc3QgZ3NlZWQgPSBvcHRzLmdzZWVkID09PSB1bmRlZmluZWQgPyBNYXRoLnJhbmRvbSgpIDogb3B0cy5nc2VlZFxuICAgIGNvbnN0IGJzZWVkID0gb3B0cy5ic2VlZCA9PT0gdW5kZWZpbmVkID8gTWF0aC5yYW5kb20oKSA6IG9wdHMuYnNlZWRcbiAgICB2YXIgciA9IChNYXRoLnJvdW5kKHJzZWVkICogMTI3KSArIDEyNykudG9TdHJpbmcoMTYpXG4gICAgdmFyIGcgPSAoTWF0aC5yb3VuZChnc2VlZCAqIDEyNykgKyAxMjcpLnRvU3RyaW5nKDE2KVxuICAgIHZhciBiID0gKE1hdGgucm91bmQoYnNlZWQgKiAxMjcpICsgMTI3KS50b1N0cmluZygxNilcbiAgICByZXR1cm4gVXRpbC5jb2xvckx1bWluYW5jZSgnIycgKyByICsgZyArIGIsIC0wLjQpXG4gIH0sXG4gIC8vIGRhcmtlbnMgYSBoZXggdmFsdWUgYnkgJ2x1bScgcGVyY2VudGFnZVxuICBjb2xvckx1bWluYW5jZTogZnVuY3Rpb24oaGV4LCBsdW0pIHtcbiAgICAvLyB2YWxpZGF0ZSBoZXggc3RyaW5nXG4gICAgaGV4ID0gU3RyaW5nKGhleCkucmVwbGFjZSgvW14wLTlhLWZdL2dpLCAnJylcbiAgICBpZiAoaGV4Lmxlbmd0aCA8IDYpIHtcbiAgICAgIGhleCA9IGhleFswXSArIGhleFswXSArIGhleFsxXSArIGhleFsxXSArIGhleFsyXSArIGhleFsyXVxuICAgIH1cbiAgICBsdW0gPSBsdW0gfHwgMFxuXG4gICAgLy8gY29udmVydCB0byBkZWNpbWFsIGFuZCBjaGFuZ2UgbHVtaW5vc2l0eVxuICAgIHZhciByZ2IgPSAnIydcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgICAgbGV0IGMgPSBwYXJzZUludChoZXguc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgICBjID0gTWF0aC5yb3VuZChNYXRoLm1pbihNYXRoLm1heCgwLCBjICsgKGMgKiBsdW0pKSwgMjU1KSkudG9TdHJpbmcoMTYpXG4gICAgICByZ2IgKz0gKCcwMCcgKyBjKS5zdWJzdHIoYy5sZW5ndGgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJnYlxuICB9LFxuICBvcGVuTGluazogZnVuY3Rpb24odXJsKSB7XG4gICAgdmFyIHdpbiA9ICh1cmwgIT09ICcnKSA/IHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpIDogJ2VtcHR5J1xuXG4gICAgaWYgKHdpbikge1xuICAgICAgLy8gQnJvd3NlciBoYXMgYWxsb3dlZCBpdCB0byBiZSBvcGVuZWRcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEJyb3dzZXIgaGFzIGJsb2NrZWQgaXRcbiAgICAgIHdpbmRvdy5hbGVydCgnUGxlYXNlIGFsbG93IHBvcHVwcyBpbiBvcmRlciB0byBvcGVuIHRoZSBsaW5rJylcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfSxcbiAgbWRUb0hUTUw6IHRleHQgPT4ge1xuICAgIGNvbnN0IHNhZmVUZXh0ID0gdGV4dCB8fCAnJ1xuICAgIC8vIHVzZSBzYWZlOiB0cnVlIHRvIGZpbHRlciB4c3NcbiAgICByZXR1cm4gbmV3IEh0bWxSZW5kZXJlcih7IHNhZmU6IHRydWUgfSlcbiAgICAgIC5yZW5kZXIobmV3IFBhcnNlcigpLnBhcnNlKHNhZmVUZXh0KSlcbiAgfSxcbiAgbG9nQ2FudmFzQXR0cmlidXRlczogZnVuY3Rpb24oY2FudmFzKSB7XG4gICAgY29uc3QgZmFrZU1ncmFwaCA9IHsgY2FudmFzIH1cbiAgICByZXR1cm4ge1xuICAgICAgc2NhbGVYOiBjYW52YXMuc2NhbGVPZmZzZXRYLFxuICAgICAgc2NhbGVZOiBjYW52YXMuc2NhbGVPZmZzZXRZLFxuICAgICAgY2VudHJlQ29vcmRzOiBVdGlsLnBpeGVsc1RvQ29vcmRzKGZha2VNZ3JhcGgsIHsgeDogY2FudmFzLmNhbnZhc2VzWzBdLnNpemUud2lkdGggLyAyLCB5OiBjYW52YXMuY2FudmFzZXNbMF0uc2l6ZS5oZWlnaHQgLyAyIH0pXG4gICAgfVxuICB9LFxuICByZXNpemVDYW52YXM6IGZ1bmN0aW9uKGNhbnZhcykge1xuICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IGNhbnZhcyBhdHRyaWJ1dGVzLCBpLmUuIHNjYWxlIGFuZCBtYXAtY29vcmRpbmF0ZSBhdCB0aGUgY2VudHJlIG9mIHRoZSB1c2VyJ3Mgc2NyZWVuXG4gICAgY29uc3Qgb2xkQXR0ciA9IFV0aWwubG9nQ2FudmFzQXR0cmlidXRlcyhjYW52YXMpXG5cbiAgICAvLyBSZXNpemUgdGhlIGNhbnZhcyB0byBmaWxsIHRoZSBuZXcgd2luZG93IHNpemUuIEJhc2VkIG9uIGhvdyBKSVQgd29ya3MsIHRoaXMgYWxzbyByZXNldHMgdGhlIG1hcCBiYWNrIHRvIHNjYWxlIDEgYW5kIHRyYW5sYXRpb25zID0gMFxuICAgIGNhbnZhcy5yZXNpemUoJCh3aW5kb3cpLndpZHRoKCksICQod2luZG93KS5oZWlnaHQoKSlcblxuICAgIC8vIFJldHVybiB0aGUgbWFwIHRvIHRoZSBvcmlnaW5hbCBzY2FsZSwgYW5kIHRoZW4gcHV0IHRoZSBwcmV2aW91cyBjZW50cmFsIG1hcC1jb29yZGluYXRlIGJhY2sgdG8gdGhlIGNlbnRyZSBvZiB1c2VyJ3MgbmV3bHkgcmVzaXplZCBzY3JlZW5cbiAgICBjYW52YXMuc2NhbGUob2xkQXR0ci5zY2FsZVgsIG9sZEF0dHIuc2NhbGVZKVxuICAgIGNvbnN0IG5ld0F0dHIgPSBVdGlsLmxvZ0NhbnZhc0F0dHJpYnV0ZXMoY2FudmFzKVxuICAgIGNhbnZhcy50cmFuc2xhdGUobmV3QXR0ci5jZW50cmVDb29yZHMueCAtIG9sZEF0dHIuY2VudHJlQ29vcmRzLngsIG5ld0F0dHIuY2VudHJlQ29vcmRzLnkgLSBvbGRBdHRyLmNlbnRyZUNvb3Jkcy55KVxuICB9LFxuICByZW1vdmVFbW9qaTogZnVuY3Rpb24od2l0aEVtb2ppKSB7XG4gICAgbGV0IHRleHQgPSB3aXRoRW1vamlcbiAgICBPYmplY3Qua2V5cyhlbW9qaUluZGV4LmVtb2ppcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3QgZW1vamkgPSBlbW9qaUluZGV4LmVtb2ppc1trZXldXG4gICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAoZXNjYXBlUmVnRXhwKGVtb2ppLm5hdGl2ZSksICdnJyksIGVtb2ppLmNvbG9ucylcbiAgICB9KVxuICAgIHJldHVybiB0ZXh0XG4gIH0sXG4gIGFkZEVtb2ppOiBmdW5jdGlvbih3aXRob3V0RW1vamksIG9wdHMgPSB7IGVtb3RpY29uczogdHJ1ZSB9KSB7XG4gICAgbGV0IHRleHQgPSB3aXRob3V0RW1vamlcbiAgICBPYmplY3Qua2V5cyhlbW9qaUluZGV4LmVtb2ppcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3QgZW1vamkgPSBlbW9qaUluZGV4LmVtb2ppc1trZXldXG4gICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAoZXNjYXBlUmVnRXhwKGVtb2ppLmNvbG9ucyksICdnJyksIGVtb2ppLm5hdGl2ZSlcbiAgICB9KVxuICAgIGlmIChvcHRzLmVtb3RpY29ucykge1xuICAgICAgT2JqZWN0LmtleXMoZW1vamlJbmRleC5lbW90aWNvbnMpLmZvckVhY2goZW1vdGljb24gPT4ge1xuICAgICAgICBjb25zdCBrZXkgPSBlbW9qaUluZGV4LmVtb3RpY29uc1tlbW90aWNvbl1cbiAgICAgICAgY29uc3QgZW1vamkgPSBlbW9qaUluZGV4LmVtb2ppc1trZXldXG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UobmV3IFJlZ0V4cChlc2NhcGVSZWdFeHAoZW1vdGljb24pLCAnZycpLCBlbW9qaS5uYXRpdmUpXG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gdGV4dFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFV0aWxcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBmcm9udGVuZC9zcmMvTWV0YW1hcHMvVXRpbC5qcyJdLCJtYXBwaW5ncyI6Ijs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 411 */
/***/ function(module, exports, __webpack_require__) {

    eval("var toString = __webpack_require__(125);\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n    reHasRegExpChar = RegExp(reRegExpChar.source);\n\n/**\n * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escapeRegExp('[lodash](https://lodash.com/)');\n * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n */\nfunction escapeRegExp(string) {\n  string = toString(string);\n  return (string && reHasRegExpChar.test(string))\n    ? string.replace(reRegExpChar, '\\\\$&')\n    : string;\n}\n\nmodule.exports = escapeRegExp;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDExLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvZXNjYXBlUmVnRXhwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4vdG9TdHJpbmcnKTtcblxuLyoqXG4gKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAqL1xudmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZyxcbiAgICByZUhhc1JlZ0V4cENoYXIgPSBSZWdFeHAocmVSZWdFeHBDaGFyLnNvdXJjZSk7XG5cbi8qKlxuICogRXNjYXBlcyB0aGUgYFJlZ0V4cGAgc3BlY2lhbCBjaGFyYWN0ZXJzIFwiXlwiLCBcIiRcIiwgXCJcXFwiLCBcIi5cIiwgXCIqXCIsIFwiK1wiLFxuICogXCI/XCIsIFwiKFwiLCBcIilcIiwgXCJbXCIsIFwiXVwiLCBcIntcIiwgXCJ9XCIsIGFuZCBcInxcIiBpbiBgc3RyaW5nYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5lc2NhcGVSZWdFeHAoJ1tsb2Rhc2hdKGh0dHBzOi8vbG9kYXNoLmNvbS8pJyk7XG4gKiAvLyA9PiAnXFxbbG9kYXNoXFxdXFwoaHR0cHM6Ly9sb2Rhc2hcXC5jb20vXFwpJ1xuICovXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nKSB7XG4gIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gIHJldHVybiAoc3RyaW5nICYmIHJlSGFzUmVnRXhwQ2hhci50ZXN0KHN0cmluZykpXG4gICAgPyBzdHJpbmcucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAgIDogc3RyaW5nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVzY2FwZVJlZ0V4cDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvZXNjYXBlUmVnRXhwLmpzXG4vLyBtb2R1bGUgaWQgPSA0MTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 412 */
/***/ function(module, exports, __webpack_require__) {

    eval("\"use strict\";\n\n// commonmark.js - CommomMark in JavaScript\n// Copyright (C) 2014 John MacFarlane\n// License: BSD3.\n\n// Basic usage:\n//\n// var commonmark = require('commonmark');\n// var parser = new commonmark.Parser();\n// var renderer = new commonmark.HtmlRenderer();\n// console.log(renderer.render(parser.parse('Hello *world*')));\n\nmodule.exports.version = '0.27.0';\nmodule.exports.Node = __webpack_require__(413);\nmodule.exports.Parser = __webpack_require__(414);\n// module.exports.HtmlRenderer = require('./html');\nmodule.exports.HtmlRenderer = __webpack_require__(430);\nmodule.exports.XmlRenderer = __webpack_require__(432);\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDEyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9jb21tb25tYXJrL2xpYi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLy8gY29tbW9ubWFyay5qcyAtIENvbW1vbU1hcmsgaW4gSmF2YVNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDE0IEpvaG4gTWFjRmFybGFuZVxuLy8gTGljZW5zZTogQlNEMy5cblxuLy8gQmFzaWMgdXNhZ2U6XG4vL1xuLy8gdmFyIGNvbW1vbm1hcmsgPSByZXF1aXJlKCdjb21tb25tYXJrJyk7XG4vLyB2YXIgcGFyc2VyID0gbmV3IGNvbW1vbm1hcmsuUGFyc2VyKCk7XG4vLyB2YXIgcmVuZGVyZXIgPSBuZXcgY29tbW9ubWFyay5IdG1sUmVuZGVyZXIoKTtcbi8vIGNvbnNvbGUubG9nKHJlbmRlcmVyLnJlbmRlcihwYXJzZXIucGFyc2UoJ0hlbGxvICp3b3JsZConKSkpO1xuXG5tb2R1bGUuZXhwb3J0cy52ZXJzaW9uID0gJzAuMjcuMCc7XG5tb2R1bGUuZXhwb3J0cy5Ob2RlID0gcmVxdWlyZSgnLi9ub2RlJyk7XG5tb2R1bGUuZXhwb3J0cy5QYXJzZXIgPSByZXF1aXJlKCcuL2Jsb2NrcycpO1xuLy8gbW9kdWxlLmV4cG9ydHMuSHRtbFJlbmRlcmVyID0gcmVxdWlyZSgnLi9odG1sJyk7XG5tb2R1bGUuZXhwb3J0cy5IdG1sUmVuZGVyZXIgPSByZXF1aXJlKCcuL3JlbmRlci9odG1sJyk7XG5tb2R1bGUuZXhwb3J0cy5YbWxSZW5kZXJlciA9IHJlcXVpcmUoJy4veG1sJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29tbW9ubWFyay9saWIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDQxMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 413 */
/***/ function(module, exports) {

    eval("\"use strict\";\n\nfunction isContainer(node) {\n    switch (node._type) {\n    case 'document':\n    case 'block_quote':\n    case 'list':\n    case 'item':\n    case 'paragraph':\n    case 'heading':\n    case 'emph':\n    case 'strong':\n    case 'link':\n    case 'image':\n    case 'custom_inline':\n    case 'custom_block':\n        return true;\n    default:\n        return false;\n    }\n}\n\nvar resumeAt = function(node, entering) {\n    this.current = node;\n    this.entering = (entering === true);\n};\n\nvar next = function(){\n    var cur = this.current;\n    var entering = this.entering;\n\n    if (cur === null) {\n        return null;\n    }\n\n    var container = isContainer(cur);\n\n    if (entering && container) {\n        if (cur._firstChild) {\n            this.current = cur._firstChild;\n            this.entering = true;\n        } else {\n            // stay on node but exit\n            this.entering = false;\n        }\n\n    } else if (cur === this.root) {\n        this.current = null;\n\n    } else if (cur._next === null) {\n        this.current = cur._parent;\n        this.entering = false;\n\n    } else {\n        this.current = cur._next;\n        this.entering = true;\n    }\n\n    return {entering: entering, node: cur};\n};\n\nvar NodeWalker = function(root) {\n    return { current: root,\n             root: root,\n             entering: true,\n             next: next,\n             resumeAt: resumeAt };\n};\n\nvar Node = function(nodeType, sourcepos) {\n    this._type = nodeType;\n    this._parent = null;\n    this._firstChild = null;\n    this._lastChild = null;\n    this._prev = null;\n    this._next = null;\n    this._sourcepos = sourcepos;\n    this._lastLineBlank = false;\n    this._open = true;\n    this._string_content = null;\n    this._literal = null;\n    this._listData = {};\n    this._info = null;\n    this._destination = null;\n    this._title = null;\n    this._isFenced = false;\n    this._fenceChar = null;\n    this._fenceLength = 0;\n    this._fenceOffset = null;\n    this._level = null;\n    this._onEnter = null;\n    this._onExit = null;\n};\n\nvar proto = Node.prototype;\n\nObject.defineProperty(proto, 'isContainer', {\n    get: function () { return isContainer(this); }\n});\n\nObject.defineProperty(proto, 'type', {\n    get: function() { return this._type; }\n});\n\nObject.defineProperty(proto, 'firstChild', {\n    get: function() { return this._firstChild; }\n});\n\nObject.defineProperty(proto, 'lastChild', {\n    get: function() { return this._lastChild; }\n});\n\nObject.defineProperty(proto, 'next', {\n    get: function() { return this._next; }\n});\n\nObject.defineProperty(proto, 'prev', {\n    get: function() { return this._prev; }\n});\n\nObject.defineProperty(proto, 'parent', {\n    get: function() { return this._parent; }\n});\n\nObject.defineProperty(proto, 'sourcepos', {\n    get: function() { return this._sourcepos; }\n});\n\nObject.defineProperty(proto, 'literal', {\n    get: function() { return this._literal; },\n    set: function(s) { this._literal = s; }\n});\n\nObject.defineProperty(proto, 'destination', {\n    get: function() { return this._destination; },\n    set: function(s) { this._destination = s; }\n});\n\nObject.defineProperty(proto, 'title', {\n    get: function() { return this._title; },\n    set: function(s) { this._title = s; }\n});\n\nObject.defineProperty(proto, 'info', {\n    get: function() { return this._info; },\n    set: function(s) { this._info = s; }\n});\n\nObject.defineProperty(proto, 'level', {\n    get: function() { return this._level; },\n    set: function(s) { this._level = s; }\n});\n\nObject.defineProperty(proto, 'listType', {\n    get: function() { return this._listData.type; },\n    set: function(t) { this._listData.type = t; }\n});\n\nObject.defineProperty(proto, 'listTight', {\n    get: function() { return this._listData.tight; },\n    set: function(t) { this._listData.tight = t; }\n});\n\nObject.defineProperty(proto, 'listStart', {\n    get: function() { return this._listData.start; },\n    set: function(n) { this._listData.start = n; }\n});\n\nObject.defineProperty(proto, 'listDelimiter', {\n    get: function() { return this._listData.delimiter; },\n    set: function(delim) { this._listData.delimiter = delim; }\n});\n\nObject.defineProperty(proto, 'onEnter', {\n    get: function() { return this._onEnter; },\n    set: function(s) { this._onEnter = s; }\n});\n\nObject.defineProperty(proto, 'onExit', {\n    get: function() { return this._onExit; },\n    set: function(s) { this._onExit = s; }\n});\n\nNode.prototype.appendChild = function(child) {\n    child.unlink();\n    child._parent = this;\n    if (this._lastChild) {\n        this._lastChild._next = child;\n        child._prev = this._lastChild;\n        this._lastChild = child;\n    } else {\n        this._firstChild = child;\n        this._lastChild = child;\n    }\n};\n\nNode.prototype.prependChild = function(child) {\n    child.unlink();\n    child._parent = this;\n    if (this._firstChild) {\n        this._firstChild._prev = child;\n        child._next = this._firstChild;\n        this._firstChild = child;\n    } else {\n        this._firstChild = child;\n        this._lastChild = child;\n    }\n};\n\nNode.prototype.unlink = function() {\n    if (this._prev) {\n        this._prev._next = this._next;\n    } else if (this._parent) {\n        this._parent._firstChild = this._next;\n    }\n    if (this._next) {\n        this._next._prev = this._prev;\n    } else if (this._parent) {\n        this._parent._lastChild = this._prev;\n    }\n    this._parent = null;\n    this._next = null;\n    this._prev = null;\n};\n\nNode.prototype.insertAfter = function(sibling) {\n    sibling.unlink();\n    sibling._next = this._next;\n    if (sibling._next) {\n        sibling._next._prev = sibling;\n    }\n    sibling._prev = this;\n    this._next = sibling;\n    sibling._parent = this._parent;\n    if (!sibling._next) {\n        sibling._parent._lastChild = sibling;\n    }\n};\n\nNode.prototype.insertBefore = function(sibling) {\n    sibling.unlink();\n    sibling._prev = this._prev;\n    if (sibling._prev) {\n        sibling._prev._next = sibling;\n    }\n    sibling._next = this;\n    this._prev = sibling;\n    sibling._parent = this._parent;\n    if (!sibling._prev) {\n        sibling._parent._firstChild = sibling;\n    }\n};\n\nNode.prototype.walker = function() {\n    var walker = new NodeWalker(this);\n    return walker;\n};\n\nmodule.exports = Node;\n\n\n/* Example of use of walker:\n\n var walker = w.walker();\n var event;\n\n while (event = walker.next()) {\n console.log(event.entering, event.node.type);\n }\n\n */\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDEzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9jb21tb25tYXJrL2xpYi9ub2RlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBpc0NvbnRhaW5lcihub2RlKSB7XG4gICAgc3dpdGNoIChub2RlLl90eXBlKSB7XG4gICAgY2FzZSAnZG9jdW1lbnQnOlxuICAgIGNhc2UgJ2Jsb2NrX3F1b3RlJzpcbiAgICBjYXNlICdsaXN0JzpcbiAgICBjYXNlICdpdGVtJzpcbiAgICBjYXNlICdwYXJhZ3JhcGgnOlxuICAgIGNhc2UgJ2hlYWRpbmcnOlxuICAgIGNhc2UgJ2VtcGgnOlxuICAgIGNhc2UgJ3N0cm9uZyc6XG4gICAgY2FzZSAnbGluayc6XG4gICAgY2FzZSAnaW1hZ2UnOlxuICAgIGNhc2UgJ2N1c3RvbV9pbmxpbmUnOlxuICAgIGNhc2UgJ2N1c3RvbV9ibG9jayc6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbnZhciByZXN1bWVBdCA9IGZ1bmN0aW9uKG5vZGUsIGVudGVyaW5nKSB7XG4gICAgdGhpcy5jdXJyZW50ID0gbm9kZTtcbiAgICB0aGlzLmVudGVyaW5nID0gKGVudGVyaW5nID09PSB0cnVlKTtcbn07XG5cbnZhciBuZXh0ID0gZnVuY3Rpb24oKXtcbiAgICB2YXIgY3VyID0gdGhpcy5jdXJyZW50O1xuICAgIHZhciBlbnRlcmluZyA9IHRoaXMuZW50ZXJpbmc7XG5cbiAgICBpZiAoY3VyID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBjb250YWluZXIgPSBpc0NvbnRhaW5lcihjdXIpO1xuXG4gICAgaWYgKGVudGVyaW5nICYmIGNvbnRhaW5lcikge1xuICAgICAgICBpZiAoY3VyLl9maXJzdENoaWxkKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSBjdXIuX2ZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICB0aGlzLmVudGVyaW5nID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHN0YXkgb24gbm9kZSBidXQgZXhpdFxuICAgICAgICAgICAgdGhpcy5lbnRlcmluZyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKGN1ciA9PT0gdGhpcy5yb290KSB7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IG51bGw7XG5cbiAgICB9IGVsc2UgaWYgKGN1ci5fbmV4dCA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBjdXIuX3BhcmVudDtcbiAgICAgICAgdGhpcy5lbnRlcmluZyA9IGZhbHNlO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gY3VyLl9uZXh0O1xuICAgICAgICB0aGlzLmVudGVyaW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge2VudGVyaW5nOiBlbnRlcmluZywgbm9kZTogY3VyfTtcbn07XG5cbnZhciBOb2RlV2Fsa2VyID0gZnVuY3Rpb24ocm9vdCkge1xuICAgIHJldHVybiB7IGN1cnJlbnQ6IHJvb3QsXG4gICAgICAgICAgICAgcm9vdDogcm9vdCxcbiAgICAgICAgICAgICBlbnRlcmluZzogdHJ1ZSxcbiAgICAgICAgICAgICBuZXh0OiBuZXh0LFxuICAgICAgICAgICAgIHJlc3VtZUF0OiByZXN1bWVBdCB9O1xufTtcblxudmFyIE5vZGUgPSBmdW5jdGlvbihub2RlVHlwZSwgc291cmNlcG9zKSB7XG4gICAgdGhpcy5fdHlwZSA9IG5vZGVUeXBlO1xuICAgIHRoaXMuX3BhcmVudCA9IG51bGw7XG4gICAgdGhpcy5fZmlyc3RDaGlsZCA9IG51bGw7XG4gICAgdGhpcy5fbGFzdENoaWxkID0gbnVsbDtcbiAgICB0aGlzLl9wcmV2ID0gbnVsbDtcbiAgICB0aGlzLl9uZXh0ID0gbnVsbDtcbiAgICB0aGlzLl9zb3VyY2Vwb3MgPSBzb3VyY2Vwb3M7XG4gICAgdGhpcy5fbGFzdExpbmVCbGFuayA9IGZhbHNlO1xuICAgIHRoaXMuX29wZW4gPSB0cnVlO1xuICAgIHRoaXMuX3N0cmluZ19jb250ZW50ID0gbnVsbDtcbiAgICB0aGlzLl9saXRlcmFsID0gbnVsbDtcbiAgICB0aGlzLl9saXN0RGF0YSA9IHt9O1xuICAgIHRoaXMuX2luZm8gPSBudWxsO1xuICAgIHRoaXMuX2Rlc3RpbmF0aW9uID0gbnVsbDtcbiAgICB0aGlzLl90aXRsZSA9IG51bGw7XG4gICAgdGhpcy5faXNGZW5jZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9mZW5jZUNoYXIgPSBudWxsO1xuICAgIHRoaXMuX2ZlbmNlTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9mZW5jZU9mZnNldCA9IG51bGw7XG4gICAgdGhpcy5fbGV2ZWwgPSBudWxsO1xuICAgIHRoaXMuX29uRW50ZXIgPSBudWxsO1xuICAgIHRoaXMuX29uRXhpdCA9IG51bGw7XG59O1xuXG52YXIgcHJvdG8gPSBOb2RlLnByb3RvdHlwZTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCAnaXNDb250YWluZXInLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBpc0NvbnRhaW5lcih0aGlzKTsgfVxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90bywgJ3R5cGUnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH1cbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sICdmaXJzdENoaWxkJywge1xuICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9maXJzdENoaWxkOyB9XG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCAnbGFzdENoaWxkJywge1xuICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9sYXN0Q2hpbGQ7IH1cbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sICduZXh0Jywge1xuICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9uZXh0OyB9XG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCAncHJldicsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fcHJldjsgfVxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90bywgJ3BhcmVudCcsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fcGFyZW50OyB9XG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCAnc291cmNlcG9zJywge1xuICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zb3VyY2Vwb3M7IH1cbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sICdsaXRlcmFsJywge1xuICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9saXRlcmFsOyB9LFxuICAgIHNldDogZnVuY3Rpb24ocykgeyB0aGlzLl9saXRlcmFsID0gczsgfVxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90bywgJ2Rlc3RpbmF0aW9uJywge1xuICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9kZXN0aW5hdGlvbjsgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uKHMpIHsgdGhpcy5fZGVzdGluYXRpb24gPSBzOyB9XG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCAndGl0bGUnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3RpdGxlOyB9LFxuICAgIHNldDogZnVuY3Rpb24ocykgeyB0aGlzLl90aXRsZSA9IHM7IH1cbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sICdpbmZvJywge1xuICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9pbmZvOyB9LFxuICAgIHNldDogZnVuY3Rpb24ocykgeyB0aGlzLl9pbmZvID0gczsgfVxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90bywgJ2xldmVsJywge1xuICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9sZXZlbDsgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uKHMpIHsgdGhpcy5fbGV2ZWwgPSBzOyB9XG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCAnbGlzdFR5cGUnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX2xpc3REYXRhLnR5cGU7IH0sXG4gICAgc2V0OiBmdW5jdGlvbih0KSB7IHRoaXMuX2xpc3REYXRhLnR5cGUgPSB0OyB9XG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCAnbGlzdFRpZ2h0Jywge1xuICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9saXN0RGF0YS50aWdodDsgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uKHQpIHsgdGhpcy5fbGlzdERhdGEudGlnaHQgPSB0OyB9XG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCAnbGlzdFN0YXJ0Jywge1xuICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9saXN0RGF0YS5zdGFydDsgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uKG4pIHsgdGhpcy5fbGlzdERhdGEuc3RhcnQgPSBuOyB9XG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCAnbGlzdERlbGltaXRlcicsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fbGlzdERhdGEuZGVsaW1pdGVyOyB9LFxuICAgIHNldDogZnVuY3Rpb24oZGVsaW0pIHsgdGhpcy5fbGlzdERhdGEuZGVsaW1pdGVyID0gZGVsaW07IH1cbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sICdvbkVudGVyJywge1xuICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9vbkVudGVyOyB9LFxuICAgIHNldDogZnVuY3Rpb24ocykgeyB0aGlzLl9vbkVudGVyID0gczsgfVxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90bywgJ29uRXhpdCcsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fb25FeGl0OyB9LFxuICAgIHNldDogZnVuY3Rpb24ocykgeyB0aGlzLl9vbkV4aXQgPSBzOyB9XG59KTtcblxuTm9kZS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQgPSBmdW5jdGlvbihjaGlsZCkge1xuICAgIGNoaWxkLnVubGluaygpO1xuICAgIGNoaWxkLl9wYXJlbnQgPSB0aGlzO1xuICAgIGlmICh0aGlzLl9sYXN0Q2hpbGQpIHtcbiAgICAgICAgdGhpcy5fbGFzdENoaWxkLl9uZXh0ID0gY2hpbGQ7XG4gICAgICAgIGNoaWxkLl9wcmV2ID0gdGhpcy5fbGFzdENoaWxkO1xuICAgICAgICB0aGlzLl9sYXN0Q2hpbGQgPSBjaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9maXJzdENoaWxkID0gY2hpbGQ7XG4gICAgICAgIHRoaXMuX2xhc3RDaGlsZCA9IGNoaWxkO1xuICAgIH1cbn07XG5cbk5vZGUucHJvdG90eXBlLnByZXBlbmRDaGlsZCA9IGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgY2hpbGQudW5saW5rKCk7XG4gICAgY2hpbGQuX3BhcmVudCA9IHRoaXM7XG4gICAgaWYgKHRoaXMuX2ZpcnN0Q2hpbGQpIHtcbiAgICAgICAgdGhpcy5fZmlyc3RDaGlsZC5fcHJldiA9IGNoaWxkO1xuICAgICAgICBjaGlsZC5fbmV4dCA9IHRoaXMuX2ZpcnN0Q2hpbGQ7XG4gICAgICAgIHRoaXMuX2ZpcnN0Q2hpbGQgPSBjaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9maXJzdENoaWxkID0gY2hpbGQ7XG4gICAgICAgIHRoaXMuX2xhc3RDaGlsZCA9IGNoaWxkO1xuICAgIH1cbn07XG5cbk5vZGUucHJvdG90eXBlLnVubGluayA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9wcmV2KSB7XG4gICAgICAgIHRoaXMuX3ByZXYuX25leHQgPSB0aGlzLl9uZXh0O1xuICAgIH0gZWxzZSBpZiAodGhpcy5fcGFyZW50KSB7XG4gICAgICAgIHRoaXMuX3BhcmVudC5fZmlyc3RDaGlsZCA9IHRoaXMuX25leHQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9uZXh0KSB7XG4gICAgICAgIHRoaXMuX25leHQuX3ByZXYgPSB0aGlzLl9wcmV2O1xuICAgIH0gZWxzZSBpZiAodGhpcy5fcGFyZW50KSB7XG4gICAgICAgIHRoaXMuX3BhcmVudC5fbGFzdENoaWxkID0gdGhpcy5fcHJldjtcbiAgICB9XG4gICAgdGhpcy5fcGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLl9uZXh0ID0gbnVsbDtcbiAgICB0aGlzLl9wcmV2ID0gbnVsbDtcbn07XG5cbk5vZGUucHJvdG90eXBlLmluc2VydEFmdGVyID0gZnVuY3Rpb24oc2libGluZykge1xuICAgIHNpYmxpbmcudW5saW5rKCk7XG4gICAgc2libGluZy5fbmV4dCA9IHRoaXMuX25leHQ7XG4gICAgaWYgKHNpYmxpbmcuX25leHQpIHtcbiAgICAgICAgc2libGluZy5fbmV4dC5fcHJldiA9IHNpYmxpbmc7XG4gICAgfVxuICAgIHNpYmxpbmcuX3ByZXYgPSB0aGlzO1xuICAgIHRoaXMuX25leHQgPSBzaWJsaW5nO1xuICAgIHNpYmxpbmcuX3BhcmVudCA9IHRoaXMuX3BhcmVudDtcbiAgICBpZiAoIXNpYmxpbmcuX25leHQpIHtcbiAgICAgICAgc2libGluZy5fcGFyZW50Ll9sYXN0Q2hpbGQgPSBzaWJsaW5nO1xuICAgIH1cbn07XG5cbk5vZGUucHJvdG90eXBlLmluc2VydEJlZm9yZSA9IGZ1bmN0aW9uKHNpYmxpbmcpIHtcbiAgICBzaWJsaW5nLnVubGluaygpO1xuICAgIHNpYmxpbmcuX3ByZXYgPSB0aGlzLl9wcmV2O1xuICAgIGlmIChzaWJsaW5nLl9wcmV2KSB7XG4gICAgICAgIHNpYmxpbmcuX3ByZXYuX25leHQgPSBzaWJsaW5nO1xuICAgIH1cbiAgICBzaWJsaW5nLl9uZXh0ID0gdGhpcztcbiAgICB0aGlzLl9wcmV2ID0gc2libGluZztcbiAgICBzaWJsaW5nLl9wYXJlbnQgPSB0aGlzLl9wYXJlbnQ7XG4gICAgaWYgKCFzaWJsaW5nLl9wcmV2KSB7XG4gICAgICAgIHNpYmxpbmcuX3BhcmVudC5fZmlyc3RDaGlsZCA9IHNpYmxpbmc7XG4gICAgfVxufTtcblxuTm9kZS5wcm90b3R5cGUud2Fsa2VyID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHdhbGtlciA9IG5ldyBOb2RlV2Fsa2VyKHRoaXMpO1xuICAgIHJldHVybiB3YWxrZXI7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5vZGU7XG5cblxuLyogRXhhbXBsZSBvZiB1c2Ugb2Ygd2Fsa2VyOlxuXG4gdmFyIHdhbGtlciA9IHcud2Fsa2VyKCk7XG4gdmFyIGV2ZW50O1xuXG4gd2hpbGUgKGV2ZW50ID0gd2Fsa2VyLm5leHQoKSkge1xuIGNvbnNvbGUubG9nKGV2ZW50LmVudGVyaW5nLCBldmVudC5ub2RlLnR5cGUpO1xuIH1cblxuICovXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29tbW9ubWFyay9saWIvbm9kZS5qc1xuLy8gbW9kdWxlIGlkID0gNDEzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 414 */
/***/ function(module, exports, __webpack_require__) {

    eval("\"use strict\";\n\nvar Node = __webpack_require__(413);\nvar unescapeString = __webpack_require__(415).unescapeString;\nvar OPENTAG = __webpack_require__(415).OPENTAG;\nvar CLOSETAG = __webpack_require__(415).CLOSETAG;\n\nvar CODE_INDENT = 4;\n\nvar C_TAB = 9;\nvar C_NEWLINE = 10;\nvar C_GREATERTHAN = 62;\nvar C_LESSTHAN = 60;\nvar C_SPACE = 32;\nvar C_OPEN_BRACKET = 91;\n\nvar InlineParser = __webpack_require__(426);\n\nvar reHtmlBlockOpen = [\n   /./, // dummy for 0\n   /^<(?:script|pre|style)(?:\\s|>|$)/i,\n   /^<!--/,\n   /^<[?]/,\n   /^<![A-Z]/,\n   /^<!\\[CDATA\\[/,\n   /^<[/]?(?:address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[123456]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|title|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul)(?:\\s|[/]?[>]|$)/i,\n    new RegExp('^(?:' + OPENTAG + '|' + CLOSETAG + ')\\\\s*$', 'i')\n];\n\nvar reHtmlBlockClose = [\n   /./, // dummy for 0\n   /<\\/(?:script|pre|style)>/i,\n   /-->/,\n   /\\?>/,\n   />/,\n   /\\]\\]>/\n];\n\nvar reThematicBreak = /^(?:(?:\\*[ \\t]*){3,}|(?:_[ \\t]*){3,}|(?:-[ \\t]*){3,})[ \\t]*$/;\n\nvar reMaybeSpecial = /^[#`~*+_=<>0-9-]/;\n\nvar reNonSpace = /[^ \\t\\f\\v\\r\\n]/;\n\nvar reBulletListMarker = /^[*+-]/;\n\nvar reOrderedListMarker = /^(\\d{1,9})([.)])/;\n\nvar reATXHeadingMarker = /^#{1,6}(?:[ \\t]+|$)/;\n\nvar reCodeFence = /^`{3,}(?!.*`)|^~{3,}(?!.*~)/;\n\nvar reClosingCodeFence = /^(?:`{3,}|~{3,})(?= *$)/;\n\nvar reSetextHeadingLine = /^(?:=+|-+)[ \\t]*$/;\n\nvar reLineEnding = /\\r\\n|\\n|\\r/;\n\n// Returns true if string contains only space characters.\nvar isBlank = function(s) {\n    return !(reNonSpace.test(s));\n};\n\nvar isSpaceOrTab = function(c) {\n    return c === C_SPACE || c === C_TAB;\n};\n\nvar peek = function(ln, pos) {\n    if (pos < ln.length) {\n        return ln.charCodeAt(pos);\n    } else {\n        return -1;\n    }\n};\n\n// DOC PARSER\n\n// These are methods of a Parser object, defined below.\n\n// Returns true if block ends with a blank line, descending if needed\n// into lists and sublists.\nvar endsWithBlankLine = function(block) {\n    while (block) {\n        if (block._lastLineBlank) {\n            return true;\n        }\n        var t = block.type;\n        if (t === 'list' || t === 'item') {\n            block = block._lastChild;\n        } else {\n            break;\n        }\n    }\n    return false;\n};\n\n// Add a line to the block at the tip.  We assume the tip\n// can accept lines -- that check should be done before calling this.\nvar addLine = function() {\n    if (this.partiallyConsumedTab) {\n      this.offset += 1; // skip over tab\n      // add space characters:\n      var charsToTab = 4 - (this.column % 4);\n      this.tip._string_content += (' '.repeat(charsToTab));\n    }\n    this.tip._string_content += this.currentLine.slice(this.offset) + '\\n';\n};\n\n// Add block of type tag as a child of the tip.  If the tip can't\n// accept children, close and finalize it and try its parent,\n// and so on til we find a block that can accept children.\nvar addChild = function(tag, offset) {\n    while (!this.blocks[this.tip.type].canContain(tag)) {\n        this.finalize(this.tip, this.lineNumber - 1);\n    }\n\n    var column_number = offset + 1; // offset 0 = column 1\n    var newBlock = new Node(tag, [[this.lineNumber, column_number], [0, 0]]);\n    newBlock._string_content = '';\n    this.tip.appendChild(newBlock);\n    this.tip = newBlock;\n    return newBlock;\n};\n\n// Parse a list marker and return data on the marker (type,\n// start, delimiter, bullet character, padding) or null.\nvar parseListMarker = function(parser, container) {\n    var rest = parser.currentLine.slice(parser.nextNonspace);\n    var match;\n    var nextc;\n    var spacesStartCol;\n    var spacesStartOffset;\n    var data = { type: null,\n                 tight: true,  // lists are tight by default\n                 bulletChar: null,\n                 start: null,\n                 delimiter: null,\n                 padding: null,\n                 markerOffset: parser.indent };\n    if ((match = rest.match(reBulletListMarker))) {\n        data.type = 'bullet';\n        data.bulletChar = match[0][0];\n\n    } else if ((match = rest.match(reOrderedListMarker)) &&\n                (container.type !== 'paragraph' ||\n                 match[1] === '1')) {\n        data.type = 'ordered';\n        data.start = parseInt(match[1]);\n        data.delimiter = match[2];\n    } else {\n        return null;\n    }\n    // make sure we have spaces after\n    nextc = peek(parser.currentLine, parser.nextNonspace + match[0].length);\n    if (!(nextc === -1 || nextc === C_TAB || nextc === C_SPACE)) {\n        return null;\n    }\n\n    // if it interrupts paragraph, make sure first line isn't blank\n    if (container.type === 'paragraph' && !parser.currentLine.slice(parser.nextNonspace + match[0].length).match(reNonSpace)) {\n        return null;\n    }\n\n    // we've got a match! advance offset and calculate padding\n    parser.advanceNextNonspace(); // to start of marker\n    parser.advanceOffset(match[0].length, true); // to end of marker\n    spacesStartCol = parser.column;\n    spacesStartOffset = parser.offset;\n    do {\n        parser.advanceOffset(1, true);\n        nextc = peek(parser.currentLine, parser.offset);\n    } while (parser.column - spacesStartCol < 5 &&\n           isSpaceOrTab(nextc));\n    var blank_item = peek(parser.currentLine, parser.offset) === -1;\n    var spaces_after_marker = parser.column - spacesStartCol;\n    if (spaces_after_marker >= 5 ||\n        spaces_after_marker < 1 ||\n        blank_item) {\n        data.padding = match[0].length + 1;\n        parser.column = spacesStartCol;\n        parser.offset = spacesStartOffset;\n        if (isSpaceOrTab(peek(parser.currentLine, parser.offset))) {\n            parser.advanceOffset(1, true);\n        }\n    } else {\n        data.padding = match[0].length + spaces_after_marker;\n    }\n    return data;\n};\n\n// Returns true if the two list items are of the same type,\n// with the same delimiter and bullet character.  This is used\n// in agglomerating list items into lists.\nvar listsMatch = function(list_data, item_data) {\n    return (list_data.type === item_data.type &&\n            list_data.delimiter === item_data.delimiter &&\n            list_data.bulletChar === item_data.bulletChar);\n};\n\n// Finalize and close any unmatched blocks.\nvar closeUnmatchedBlocks = function() {\n    if (!this.allClosed) {\n        // finalize any blocks not matched\n        while (this.oldtip !== this.lastMatchedContainer) {\n            var parent = this.oldtip._parent;\n            this.finalize(this.oldtip, this.lineNumber - 1);\n            this.oldtip = parent;\n        }\n        this.allClosed = true;\n    }\n};\n\n// 'finalize' is run when the block is closed.\n// 'continue' is run to check whether the block is continuing\n// at a certain line and offset (e.g. whether a block quote\n// contains a `>`.  It returns 0 for matched, 1 for not matched,\n// and 2 for \"we've dealt with this line completely, go to next.\"\nvar blocks = {\n    document: {\n        continue: function() { return 0; },\n        finalize: function() { return; },\n        canContain: function(t) { return (t !== 'item'); },\n        acceptsLines: false\n    },\n    list: {\n        continue: function() { return 0; },\n        finalize: function(parser, block) {\n            var item = block._firstChild;\n            while (item) {\n                // check for non-final list item ending with blank line:\n                if (endsWithBlankLine(item) && item._next) {\n                    block._listData.tight = false;\n                    break;\n                }\n                // recurse into children of list item, to see if there are\n                // spaces between any of them:\n                var subitem = item._firstChild;\n                while (subitem) {\n                    if (endsWithBlankLine(subitem) &&\n                        (item._next || subitem._next)) {\n                        block._listData.tight = false;\n                        break;\n                    }\n                    subitem = subitem._next;\n                }\n                item = item._next;\n            }\n        },\n        canContain: function(t) { return (t === 'item'); },\n        acceptsLines: false\n    },\n    block_quote: {\n        continue: function(parser) {\n            var ln = parser.currentLine;\n            if (!parser.indented &&\n                peek(ln, parser.nextNonspace) === C_GREATERTHAN) {\n                parser.advanceNextNonspace();\n                parser.advanceOffset(1, false);\n                if (isSpaceOrTab(peek(ln, parser.offset))) {\n                    parser.advanceOffset(1, true);\n                }\n            } else {\n                return 1;\n            }\n            return 0;\n        },\n        finalize: function() { return; },\n        canContain: function(t) { return (t !== 'item'); },\n        acceptsLines: false\n    },\n    item: {\n        continue: function(parser, container) {\n            if (parser.blank) {\n                if (container._firstChild == null) {\n                    // Blank line after empty list item\n                    return 1;\n                } else {\n                    parser.advanceNextNonspace();\n                }\n            } else if (parser.indent >=\n                       container._listData.markerOffset +\n                       container._listData.padding) {\n                parser.advanceOffset(container._listData.markerOffset +\n                    container._listData.padding, true);\n            } else {\n                return 1;\n            }\n            return 0;\n        },\n        finalize: function() { return; },\n        canContain: function(t) { return (t !== 'item'); },\n        acceptsLines: false\n    },\n    heading: {\n        continue: function() {\n            // a heading can never container > 1 line, so fail to match:\n            return 1;\n        },\n        finalize: function() { return; },\n        canContain: function() { return false; },\n        acceptsLines: false\n    },\n    thematic_break: {\n        continue: function() {\n            // a thematic break can never container > 1 line, so fail to match:\n            return 1;\n        },\n        finalize: function() { return; },\n        canContain: function() { return false; },\n        acceptsLines: false\n    },\n    code_block: {\n        continue: function(parser, container) {\n            var ln = parser.currentLine;\n            var indent = parser.indent;\n            if (container._isFenced) { // fenced\n                var match = (indent <= 3 &&\n                    ln.charAt(parser.nextNonspace) === container._fenceChar &&\n                    ln.slice(parser.nextNonspace).match(reClosingCodeFence));\n                if (match && match[0].length >= container._fenceLength) {\n                    // closing fence - we're at end of line, so we can return\n                    parser.finalize(container, parser.lineNumber);\n                    return 2;\n                } else {\n                    // skip optional spaces of fence offset\n                    var i = container._fenceOffset;\n                    while (i > 0 && isSpaceOrTab(peek(ln, parser.offset))) {\n                        parser.advanceOffset(1, true);\n                        i--;\n                    }\n                }\n            } else { // indented\n                if (indent >= CODE_INDENT) {\n                    parser.advanceOffset(CODE_INDENT, true);\n                } else if (parser.blank) {\n                    parser.advanceNextNonspace();\n                } else {\n                    return 1;\n                }\n            }\n            return 0;\n        },\n        finalize: function(parser, block) {\n            if (block._isFenced) { // fenced\n                // first line becomes info string\n                var content = block._string_content;\n                var newlinePos = content.indexOf('\\n');\n                var firstLine = content.slice(0, newlinePos);\n                var rest = content.slice(newlinePos + 1);\n                block.info = unescapeString(firstLine.trim());\n                block._literal = rest;\n            } else { // indented\n                block._literal = block._string_content.replace(/(\\n *)+$/, '\\n');\n            }\n            block._string_content = null; // allow GC\n        },\n        canContain: function() { return false; },\n        acceptsLines: true\n    },\n    html_block: {\n        continue: function(parser, container) {\n            return ((parser.blank &&\n                     (container._htmlBlockType === 6 ||\n                      container._htmlBlockType === 7)) ? 1 : 0);\n        },\n        finalize: function(parser, block) {\n            block._literal = block._string_content.replace(/(\\n *)+$/, '');\n            block._string_content = null; // allow GC\n        },\n        canContain: function() { return false; },\n        acceptsLines: true\n    },\n    paragraph: {\n        continue: function(parser) {\n            return (parser.blank ? 1 : 0);\n        },\n        finalize: function(parser, block) {\n            var pos;\n            var hasReferenceDefs = false;\n\n            // try parsing the beginning as link reference definitions:\n            while (peek(block._string_content, 0) === C_OPEN_BRACKET &&\n                   (pos =\n                    parser.inlineParser.parseReference(block._string_content,\n                                                       parser.refmap))) {\n                block._string_content = block._string_content.slice(pos);\n                hasReferenceDefs = true;\n            }\n            if (hasReferenceDefs && isBlank(block._string_content)) {\n                block.unlink();\n            }\n        },\n        canContain: function() { return false; },\n        acceptsLines: true\n    }\n};\n\n// block start functions.  Return values:\n// 0 = no match\n// 1 = matched container, keep going\n// 2 = matched leaf, no more block starts\nvar blockStarts = [\n    // block quote\n    function(parser) {\n        if (!parser.indented &&\n            peek(parser.currentLine, parser.nextNonspace) === C_GREATERTHAN) {\n            parser.advanceNextNonspace();\n            parser.advanceOffset(1, false);\n            // optional following space\n            if (isSpaceOrTab(peek(parser.currentLine, parser.offset))) {\n                parser.advanceOffset(1, true);\n            }\n            parser.closeUnmatchedBlocks();\n            parser.addChild('block_quote', parser.nextNonspace);\n            return 1;\n        } else {\n            return 0;\n        }\n    },\n\n    // ATX heading\n    function(parser) {\n        var match;\n        if (!parser.indented &&\n            (match = parser.currentLine.slice(parser.nextNonspace).match(reATXHeadingMarker))) {\n            parser.advanceNextNonspace();\n            parser.advanceOffset(match[0].length, false);\n            parser.closeUnmatchedBlocks();\n            var container = parser.addChild('heading', parser.nextNonspace);\n            container.level = match[0].trim().length; // number of #s\n            // remove trailing ###s:\n            container._string_content =\n                parser.currentLine.slice(parser.offset).replace(/^ *#+ *$/, '').replace(/ +#+ *$/, '');\n            parser.advanceOffset(parser.currentLine.length - parser.offset);\n            return 2;\n        } else {\n            return 0;\n        }\n    },\n\n    // Fenced code block\n    function(parser) {\n        var match;\n        if (!parser.indented &&\n            (match = parser.currentLine.slice(parser.nextNonspace).match(reCodeFence))) {\n            var fenceLength = match[0].length;\n            parser.closeUnmatchedBlocks();\n            var container = parser.addChild('code_block', parser.nextNonspace);\n            container._isFenced = true;\n            container._fenceLength = fenceLength;\n            container._fenceChar = match[0][0];\n            container._fenceOffset = parser.indent;\n            parser.advanceNextNonspace();\n            parser.advanceOffset(fenceLength, false);\n            return 2;\n        } else {\n            return 0;\n        }\n    },\n\n    // HTML block\n    function(parser, container) {\n        if (!parser.indented &&\n            peek(parser.currentLine, parser.nextNonspace) === C_LESSTHAN) {\n            var s = parser.currentLine.slice(parser.nextNonspace);\n            var blockType;\n\n            for (blockType = 1; blockType <= 7; blockType++) {\n                if (reHtmlBlockOpen[blockType].test(s) &&\n                    (blockType < 7 ||\n                     container.type !== 'paragraph')) {\n                    parser.closeUnmatchedBlocks();\n                    // We don't adjust parser.offset;\n                    // spaces are part of the HTML block:\n                    var b = parser.addChild('html_block',\n                                            parser.offset);\n                    b._htmlBlockType = blockType;\n                    return 2;\n                }\n            }\n        }\n\n        return 0;\n\n    },\n\n    // Setext heading\n    function(parser, container) {\n        var match;\n        if (!parser.indented &&\n            container.type === 'paragraph' &&\n                   ((match = parser.currentLine.slice(parser.nextNonspace).match(reSetextHeadingLine)))) {\n            parser.closeUnmatchedBlocks();\n            var heading = new Node('heading', container.sourcepos);\n            heading.level = match[0][0] === '=' ? 1 : 2;\n            heading._string_content = container._string_content;\n            container.insertAfter(heading);\n            container.unlink();\n            parser.tip = heading;\n            parser.advanceOffset(parser.currentLine.length - parser.offset, false);\n            return 2;\n        } else {\n            return 0;\n        }\n    },\n\n    // thematic break\n    function(parser) {\n        if (!parser.indented &&\n            reThematicBreak.test(parser.currentLine.slice(parser.nextNonspace))) {\n            parser.closeUnmatchedBlocks();\n            parser.addChild('thematic_break', parser.nextNonspace);\n            parser.advanceOffset(parser.currentLine.length - parser.offset, false);\n            return 2;\n        } else {\n            return 0;\n        }\n    },\n\n    // list item\n    function(parser, container) {\n        var data;\n\n        if ((!parser.indented || container.type === 'list')\n                && (data = parseListMarker(parser, container))) {\n            parser.closeUnmatchedBlocks();\n\n            // add the list if needed\n            if (parser.tip.type !== 'list' ||\n                !(listsMatch(container._listData, data))) {\n                container = parser.addChild('list', parser.nextNonspace);\n                container._listData = data;\n            }\n\n            // add the list item\n            container = parser.addChild('item', parser.nextNonspace);\n            container._listData = data;\n            return 1;\n        } else {\n            return 0;\n        }\n    },\n\n    // indented code block\n    function(parser) {\n        if (parser.indented &&\n            parser.tip.type !== 'paragraph' &&\n            !parser.blank) {\n            // indented code\n            parser.advanceOffset(CODE_INDENT, true);\n            parser.closeUnmatchedBlocks();\n            parser.addChild('code_block', parser.offset);\n            return 2;\n        } else {\n            return 0;\n        }\n     }\n\n];\n\nvar advanceOffset = function(count, columns) {\n    var currentLine = this.currentLine;\n    var charsToTab, charsToAdvance;\n    var c;\n    while (count > 0 && (c = currentLine[this.offset])) {\n        if (c === '\\t') {\n            charsToTab = 4 - (this.column % 4);\n            if (columns) {\n                this.partiallyConsumedTab = charsToTab > count;\n                charsToAdvance = charsToTab > count ? count : charsToTab;\n                this.column += charsToAdvance;\n                this.offset += this.partiallyConsumedTab ? 0 : 1;\n                count -= charsToAdvance;\n            } else {\n                this.partiallyConsumedTab = false;\n                this.column += charsToTab;\n                this.offset += 1;\n                count -= 1;\n            }\n        } else {\n            this.partiallyConsumedTab = false;\n            this.offset += 1;\n            this.column += 1; // assume ascii; block starts are ascii\n            count -= 1;\n        }\n    }\n};\n\nvar advanceNextNonspace = function() {\n    this.offset = this.nextNonspace;\n    this.column = this.nextNonspaceColumn;\n    this.partiallyConsumedTab = false;\n};\n\nvar findNextNonspace = function() {\n    var currentLine = this.currentLine;\n    var i = this.offset;\n    var cols = this.column;\n    var c;\n\n    while ((c = currentLine.charAt(i)) !== '') {\n        if (c === ' ') {\n            i++;\n            cols++;\n        } else if (c === '\\t') {\n            i++;\n            cols += (4 - (cols % 4));\n        } else {\n            break;\n        }\n    }\n    this.blank = (c === '\\n' || c === '\\r' || c === '');\n    this.nextNonspace = i;\n    this.nextNonspaceColumn = cols;\n    this.indent = this.nextNonspaceColumn - this.column;\n    this.indented = this.indent >= CODE_INDENT;\n};\n\n// Analyze a line of text and update the document appropriately.\n// We parse markdown text by calling this on each line of input,\n// then finalizing the document.\nvar incorporateLine = function(ln) {\n    var all_matched = true;\n    var t;\n\n    var container = this.doc;\n    this.oldtip = this.tip;\n    this.offset = 0;\n    this.column = 0;\n    this.blank = false;\n    this.partiallyConsumedTab = false;\n    this.lineNumber += 1;\n\n    // replace NUL characters for security\n    if (ln.indexOf('\\u0000') !== -1) {\n        ln = ln.replace(/\\0/g, '\\uFFFD');\n    }\n\n    this.currentLine = ln;\n\n    // For each containing block, try to parse the associated line start.\n    // Bail out on failure: container will point to the last matching block.\n    // Set all_matched to false if not all containers match.\n    var lastChild;\n    while ((lastChild = container._lastChild) && lastChild._open) {\n        container = lastChild;\n\n        this.findNextNonspace();\n\n        switch (this.blocks[container.type].continue(this, container)) {\n        case 0: // we've matched, keep going\n            break;\n        case 1: // we've failed to match a block\n            all_matched = false;\n            break;\n        case 2: // we've hit end of line for fenced code close and can return\n            this.lastLineLength = ln.length;\n            return;\n        default:\n            throw 'continue returned illegal value, must be 0, 1, or 2';\n        }\n        if (!all_matched) {\n            container = container._parent; // back up to last matching block\n            break;\n        }\n    }\n\n    this.allClosed = (container === this.oldtip);\n    this.lastMatchedContainer = container;\n\n    var matchedLeaf = container.type !== 'paragraph' &&\n            blocks[container.type].acceptsLines;\n    var starts = this.blockStarts;\n    var startsLen = starts.length;\n    // Unless last matched container is a code block, try new container starts,\n    // adding children to the last matched container:\n    while (!matchedLeaf) {\n\n        this.findNextNonspace();\n\n        // this is a little performance optimization:\n        if (!this.indented &&\n            !reMaybeSpecial.test(ln.slice(this.nextNonspace))) {\n            this.advanceNextNonspace();\n            break;\n        }\n\n        var i = 0;\n        while (i < startsLen) {\n            var res = starts[i](this, container);\n            if (res === 1) {\n                container = this.tip;\n                break;\n            } else if (res === 2) {\n                container = this.tip;\n                matchedLeaf = true;\n                break;\n            } else {\n                i++;\n            }\n        }\n\n        if (i === startsLen) { // nothing matched\n            this.advanceNextNonspace();\n            break;\n        }\n    }\n\n    // What remains at the offset is a text line.  Add the text to the\n    // appropriate container.\n\n   // First check for a lazy paragraph continuation:\n    if (!this.allClosed && !this.blank &&\n        this.tip.type === 'paragraph') {\n        // lazy paragraph continuation\n        this.addLine();\n\n    } else { // not a lazy continuation\n\n        // finalize any blocks not matched\n        this.closeUnmatchedBlocks();\n        if (this.blank && container.lastChild) {\n            container.lastChild._lastLineBlank = true;\n        }\n\n        t = container.type;\n\n        // Block quote lines are never blank as they start with >\n        // and we don't count blanks in fenced code for purposes of tight/loose\n        // lists or breaking out of lists.  We also don't set _lastLineBlank\n        // on an empty list item, or if we just closed a fenced block.\n        var lastLineBlank = this.blank &&\n            !(t === 'block_quote' ||\n              (t === 'code_block' && container._isFenced) ||\n              (t === 'item' &&\n               !container._firstChild &&\n               container.sourcepos[0][0] === this.lineNumber));\n\n        // propagate lastLineBlank up through parents:\n        var cont = container;\n        while (cont) {\n            cont._lastLineBlank = lastLineBlank;\n            cont = cont._parent;\n        }\n\n        if (this.blocks[t].acceptsLines) {\n            this.addLine();\n            // if HtmlBlock, check for end condition\n            if (t === 'html_block' &&\n                container._htmlBlockType >= 1 &&\n                container._htmlBlockType <= 5 &&\n                reHtmlBlockClose[container._htmlBlockType].test(this.currentLine.slice(this.offset))) {\n                this.finalize(container, this.lineNumber);\n            }\n\n        } else if (this.offset < ln.length && !this.blank) {\n            // create paragraph container for line\n            container = this.addChild('paragraph', this.offset);\n            this.advanceNextNonspace();\n            this.addLine();\n        }\n    }\n    this.lastLineLength = ln.length;\n};\n\n// Finalize a block.  Close it and do any necessary postprocessing,\n// e.g. creating string_content from strings, setting the 'tight'\n// or 'loose' status of a list, and parsing the beginnings\n// of paragraphs for reference definitions.  Reset the tip to the\n// parent of the closed block.\nvar finalize = function(block, lineNumber) {\n    var above = block._parent;\n    block._open = false;\n    block.sourcepos[1] = [lineNumber, this.lastLineLength];\n\n    this.blocks[block.type].finalize(this, block);\n\n    this.tip = above;\n};\n\n// Walk through a block & children recursively, parsing string content\n// into inline content where appropriate.\nvar processInlines = function(block) {\n    var node, event, t;\n    var walker = block.walker();\n    this.inlineParser.refmap = this.refmap;\n    this.inlineParser.options = this.options;\n    while ((event = walker.next())) {\n        node = event.node;\n        t = node.type;\n        if (!event.entering && (t === 'paragraph' || t === 'heading')) {\n            this.inlineParser.parse(node);\n        }\n    }\n};\n\nvar Document = function() {\n    var doc = new Node('document', [[1, 1], [0, 0]]);\n    return doc;\n};\n\n// The main parsing function.  Returns a parsed document AST.\nvar parse = function(input) {\n    this.doc = new Document();\n    this.tip = this.doc;\n    this.refmap = {};\n    this.lineNumber = 0;\n    this.lastLineLength = 0;\n    this.offset = 0;\n    this.column = 0;\n    this.lastMatchedContainer = this.doc;\n    this.currentLine = \"\";\n    if (this.options.time) { console.time(\"preparing input\"); }\n    var lines = input.split(reLineEnding);\n    var len = lines.length;\n    if (input.charCodeAt(input.length - 1) === C_NEWLINE) {\n        // ignore last blank line created by final newline\n        len -= 1;\n    }\n    if (this.options.time) { console.timeEnd(\"preparing input\"); }\n    if (this.options.time) { console.time(\"block parsing\"); }\n    for (var i = 0; i < len; i++) {\n        this.incorporateLine(lines[i]);\n    }\n    while (this.tip) {\n        this.finalize(this.tip, len);\n    }\n    if (this.options.time) { console.timeEnd(\"block parsing\"); }\n    if (this.options.time) { console.time(\"inline parsing\"); }\n    this.processInlines(this.doc);\n    if (this.options.time) { console.timeEnd(\"inline parsing\"); }\n    return this.doc;\n};\n\n\n// The Parser object.\nfunction Parser(options){\n    return {\n        doc: new Document(),\n        blocks: blocks,\n        blockStarts: blockStarts,\n        tip: this.doc,\n        oldtip: this.doc,\n        currentLine: \"\",\n        lineNumber: 0,\n        offset: 0,\n        column: 0,\n        nextNonspace: 0,\n        nextNonspaceColumn: 0,\n        indent: 0,\n        indented: false,\n        blank: false,\n        partiallyConsumedTab: false,\n        allClosed: true,\n        lastMatchedContainer: this.doc,\n        refmap: {},\n        lastLineLength: 0,\n        inlineParser: new InlineParser(options),\n        findNextNonspace: findNextNonspace,\n        advanceOffset: advanceOffset,\n        advanceNextNonspace: advanceNextNonspace,\n        addLine: addLine,\n        addChild: addChild,\n        incorporateLine: incorporateLine,\n        finalize: finalize,\n        processInlines: processInlines,\n        closeUnmatchedBlocks: closeUnmatchedBlocks,\n        parse: parse,\n        options: options || {}\n    };\n}\n\nmodule.exports = Parser;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9jb21tb25tYXJrL2xpYi9ibG9ja3MuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBOb2RlID0gcmVxdWlyZSgnLi9ub2RlJyk7XG52YXIgdW5lc2NhcGVTdHJpbmcgPSByZXF1aXJlKCcuL2NvbW1vbicpLnVuZXNjYXBlU3RyaW5nO1xudmFyIE9QRU5UQUcgPSByZXF1aXJlKCcuL2NvbW1vbicpLk9QRU5UQUc7XG52YXIgQ0xPU0VUQUcgPSByZXF1aXJlKCcuL2NvbW1vbicpLkNMT1NFVEFHO1xuXG52YXIgQ09ERV9JTkRFTlQgPSA0O1xuXG52YXIgQ19UQUIgPSA5O1xudmFyIENfTkVXTElORSA9IDEwO1xudmFyIENfR1JFQVRFUlRIQU4gPSA2MjtcbnZhciBDX0xFU1NUSEFOID0gNjA7XG52YXIgQ19TUEFDRSA9IDMyO1xudmFyIENfT1BFTl9CUkFDS0VUID0gOTE7XG5cbnZhciBJbmxpbmVQYXJzZXIgPSByZXF1aXJlKCcuL2lubGluZXMnKTtcblxudmFyIHJlSHRtbEJsb2NrT3BlbiA9IFtcbiAgIC8uLywgLy8gZHVtbXkgZm9yIDBcbiAgIC9ePCg/OnNjcmlwdHxwcmV8c3R5bGUpKD86XFxzfD58JCkvaSxcbiAgIC9ePCEtLS8sXG4gICAvXjxbP10vLFxuICAgL148IVtBLVpdLyxcbiAgIC9ePCFcXFtDREFUQVxcWy8sXG4gICAvXjxbL10/KD86YWRkcmVzc3xhcnRpY2xlfGFzaWRlfGJhc2V8YmFzZWZvbnR8YmxvY2txdW90ZXxib2R5fGNhcHRpb258Y2VudGVyfGNvbHxjb2xncm91cHxkZHxkZXRhaWxzfGRpYWxvZ3xkaXJ8ZGl2fGRsfGR0fGZpZWxkc2V0fGZpZ2NhcHRpb258ZmlndXJlfGZvb3Rlcnxmb3JtfGZyYW1lfGZyYW1lc2V0fGhbMTIzNDU2XXxoZWFkfGhlYWRlcnxocnxodG1sfGlmcmFtZXxsZWdlbmR8bGl8bGlua3xtYWlufG1lbnV8bWVudWl0ZW18bWV0YXxuYXZ8bm9mcmFtZXN8b2x8b3B0Z3JvdXB8b3B0aW9ufHB8cGFyYW18c2VjdGlvbnxzb3VyY2V8dGl0bGV8c3VtbWFyeXx0YWJsZXx0Ym9keXx0ZHx0Zm9vdHx0aHx0aGVhZHx0aXRsZXx0cnx0cmFja3x1bCkoPzpcXHN8Wy9dP1s+XXwkKS9pLFxuICAgIG5ldyBSZWdFeHAoJ14oPzonICsgT1BFTlRBRyArICd8JyArIENMT1NFVEFHICsgJylcXFxccyokJywgJ2knKVxuXTtcblxudmFyIHJlSHRtbEJsb2NrQ2xvc2UgPSBbXG4gICAvLi8sIC8vIGR1bW15IGZvciAwXG4gICAvPFxcLyg/OnNjcmlwdHxwcmV8c3R5bGUpPi9pLFxuICAgLy0tPi8sXG4gICAvXFw/Pi8sXG4gICAvPi8sXG4gICAvXFxdXFxdPi9cbl07XG5cbnZhciByZVRoZW1hdGljQnJlYWsgPSAvXig/Oig/OlxcKlsgXFx0XSopezMsfXwoPzpfWyBcXHRdKil7Myx9fCg/Oi1bIFxcdF0qKXszLH0pWyBcXHRdKiQvO1xuXG52YXIgcmVNYXliZVNwZWNpYWwgPSAvXlsjYH4qK189PD4wLTktXS87XG5cbnZhciByZU5vblNwYWNlID0gL1teIFxcdFxcZlxcdlxcclxcbl0vO1xuXG52YXIgcmVCdWxsZXRMaXN0TWFya2VyID0gL15bKistXS87XG5cbnZhciByZU9yZGVyZWRMaXN0TWFya2VyID0gL14oXFxkezEsOX0pKFsuKV0pLztcblxudmFyIHJlQVRYSGVhZGluZ01hcmtlciA9IC9eI3sxLDZ9KD86WyBcXHRdK3wkKS87XG5cbnZhciByZUNvZGVGZW5jZSA9IC9eYHszLH0oPyEuKmApfF5+ezMsfSg/IS4qfikvO1xuXG52YXIgcmVDbG9zaW5nQ29kZUZlbmNlID0gL14oPzpgezMsfXx+ezMsfSkoPz0gKiQpLztcblxudmFyIHJlU2V0ZXh0SGVhZGluZ0xpbmUgPSAvXig/Oj0rfC0rKVsgXFx0XSokLztcblxudmFyIHJlTGluZUVuZGluZyA9IC9cXHJcXG58XFxufFxcci87XG5cbi8vIFJldHVybnMgdHJ1ZSBpZiBzdHJpbmcgY29udGFpbnMgb25seSBzcGFjZSBjaGFyYWN0ZXJzLlxudmFyIGlzQmxhbmsgPSBmdW5jdGlvbihzKSB7XG4gICAgcmV0dXJuICEocmVOb25TcGFjZS50ZXN0KHMpKTtcbn07XG5cbnZhciBpc1NwYWNlT3JUYWIgPSBmdW5jdGlvbihjKSB7XG4gICAgcmV0dXJuIGMgPT09IENfU1BBQ0UgfHwgYyA9PT0gQ19UQUI7XG59O1xuXG52YXIgcGVlayA9IGZ1bmN0aW9uKGxuLCBwb3MpIHtcbiAgICBpZiAocG9zIDwgbG4ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBsbi5jaGFyQ29kZUF0KHBvcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbn07XG5cbi8vIERPQyBQQVJTRVJcblxuLy8gVGhlc2UgYXJlIG1ldGhvZHMgb2YgYSBQYXJzZXIgb2JqZWN0LCBkZWZpbmVkIGJlbG93LlxuXG4vLyBSZXR1cm5zIHRydWUgaWYgYmxvY2sgZW5kcyB3aXRoIGEgYmxhbmsgbGluZSwgZGVzY2VuZGluZyBpZiBuZWVkZWRcbi8vIGludG8gbGlzdHMgYW5kIHN1Ymxpc3RzLlxudmFyIGVuZHNXaXRoQmxhbmtMaW5lID0gZnVuY3Rpb24oYmxvY2spIHtcbiAgICB3aGlsZSAoYmxvY2spIHtcbiAgICAgICAgaWYgKGJsb2NrLl9sYXN0TGluZUJsYW5rKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdCA9IGJsb2NrLnR5cGU7XG4gICAgICAgIGlmICh0ID09PSAnbGlzdCcgfHwgdCA9PT0gJ2l0ZW0nKSB7XG4gICAgICAgICAgICBibG9jayA9IGJsb2NrLl9sYXN0Q2hpbGQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vLyBBZGQgYSBsaW5lIHRvIHRoZSBibG9jayBhdCB0aGUgdGlwLiAgV2UgYXNzdW1lIHRoZSB0aXBcbi8vIGNhbiBhY2NlcHQgbGluZXMgLS0gdGhhdCBjaGVjayBzaG91bGQgYmUgZG9uZSBiZWZvcmUgY2FsbGluZyB0aGlzLlxudmFyIGFkZExpbmUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5wYXJ0aWFsbHlDb25zdW1lZFRhYikge1xuICAgICAgdGhpcy5vZmZzZXQgKz0gMTsgLy8gc2tpcCBvdmVyIHRhYlxuICAgICAgLy8gYWRkIHNwYWNlIGNoYXJhY3RlcnM6XG4gICAgICB2YXIgY2hhcnNUb1RhYiA9IDQgLSAodGhpcy5jb2x1bW4gJSA0KTtcbiAgICAgIHRoaXMudGlwLl9zdHJpbmdfY29udGVudCArPSAoJyAnLnJlcGVhdChjaGFyc1RvVGFiKSk7XG4gICAgfVxuICAgIHRoaXMudGlwLl9zdHJpbmdfY29udGVudCArPSB0aGlzLmN1cnJlbnRMaW5lLnNsaWNlKHRoaXMub2Zmc2V0KSArICdcXG4nO1xufTtcblxuLy8gQWRkIGJsb2NrIG9mIHR5cGUgdGFnIGFzIGEgY2hpbGQgb2YgdGhlIHRpcC4gIElmIHRoZSB0aXAgY2FuJ3Rcbi8vIGFjY2VwdCBjaGlsZHJlbiwgY2xvc2UgYW5kIGZpbmFsaXplIGl0IGFuZCB0cnkgaXRzIHBhcmVudCxcbi8vIGFuZCBzbyBvbiB0aWwgd2UgZmluZCBhIGJsb2NrIHRoYXQgY2FuIGFjY2VwdCBjaGlsZHJlbi5cbnZhciBhZGRDaGlsZCA9IGZ1bmN0aW9uKHRhZywgb2Zmc2V0KSB7XG4gICAgd2hpbGUgKCF0aGlzLmJsb2Nrc1t0aGlzLnRpcC50eXBlXS5jYW5Db250YWluKHRhZykpIHtcbiAgICAgICAgdGhpcy5maW5hbGl6ZSh0aGlzLnRpcCwgdGhpcy5saW5lTnVtYmVyIC0gMSk7XG4gICAgfVxuXG4gICAgdmFyIGNvbHVtbl9udW1iZXIgPSBvZmZzZXQgKyAxOyAvLyBvZmZzZXQgMCA9IGNvbHVtbiAxXG4gICAgdmFyIG5ld0Jsb2NrID0gbmV3IE5vZGUodGFnLCBbW3RoaXMubGluZU51bWJlciwgY29sdW1uX251bWJlcl0sIFswLCAwXV0pO1xuICAgIG5ld0Jsb2NrLl9zdHJpbmdfY29udGVudCA9ICcnO1xuICAgIHRoaXMudGlwLmFwcGVuZENoaWxkKG5ld0Jsb2NrKTtcbiAgICB0aGlzLnRpcCA9IG5ld0Jsb2NrO1xuICAgIHJldHVybiBuZXdCbG9jaztcbn07XG5cbi8vIFBhcnNlIGEgbGlzdCBtYXJrZXIgYW5kIHJldHVybiBkYXRhIG9uIHRoZSBtYXJrZXIgKHR5cGUsXG4vLyBzdGFydCwgZGVsaW1pdGVyLCBidWxsZXQgY2hhcmFjdGVyLCBwYWRkaW5nKSBvciBudWxsLlxudmFyIHBhcnNlTGlzdE1hcmtlciA9IGZ1bmN0aW9uKHBhcnNlciwgY29udGFpbmVyKSB7XG4gICAgdmFyIHJlc3QgPSBwYXJzZXIuY3VycmVudExpbmUuc2xpY2UocGFyc2VyLm5leHROb25zcGFjZSk7XG4gICAgdmFyIG1hdGNoO1xuICAgIHZhciBuZXh0YztcbiAgICB2YXIgc3BhY2VzU3RhcnRDb2w7XG4gICAgdmFyIHNwYWNlc1N0YXJ0T2Zmc2V0O1xuICAgIHZhciBkYXRhID0geyB0eXBlOiBudWxsLFxuICAgICAgICAgICAgICAgICB0aWdodDogdHJ1ZSwgIC8vIGxpc3RzIGFyZSB0aWdodCBieSBkZWZhdWx0XG4gICAgICAgICAgICAgICAgIGJ1bGxldENoYXI6IG51bGwsXG4gICAgICAgICAgICAgICAgIHN0YXJ0OiBudWxsLFxuICAgICAgICAgICAgICAgICBkZWxpbWl0ZXI6IG51bGwsXG4gICAgICAgICAgICAgICAgIHBhZGRpbmc6IG51bGwsXG4gICAgICAgICAgICAgICAgIG1hcmtlck9mZnNldDogcGFyc2VyLmluZGVudCB9O1xuICAgIGlmICgobWF0Y2ggPSByZXN0Lm1hdGNoKHJlQnVsbGV0TGlzdE1hcmtlcikpKSB7XG4gICAgICAgIGRhdGEudHlwZSA9ICdidWxsZXQnO1xuICAgICAgICBkYXRhLmJ1bGxldENoYXIgPSBtYXRjaFswXVswXTtcblxuICAgIH0gZWxzZSBpZiAoKG1hdGNoID0gcmVzdC5tYXRjaChyZU9yZGVyZWRMaXN0TWFya2VyKSkgJiZcbiAgICAgICAgICAgICAgICAoY29udGFpbmVyLnR5cGUgIT09ICdwYXJhZ3JhcGgnIHx8XG4gICAgICAgICAgICAgICAgIG1hdGNoWzFdID09PSAnMScpKSB7XG4gICAgICAgIGRhdGEudHlwZSA9ICdvcmRlcmVkJztcbiAgICAgICAgZGF0YS5zdGFydCA9IHBhcnNlSW50KG1hdGNoWzFdKTtcbiAgICAgICAgZGF0YS5kZWxpbWl0ZXIgPSBtYXRjaFsyXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgc3BhY2VzIGFmdGVyXG4gICAgbmV4dGMgPSBwZWVrKHBhcnNlci5jdXJyZW50TGluZSwgcGFyc2VyLm5leHROb25zcGFjZSArIG1hdGNoWzBdLmxlbmd0aCk7XG4gICAgaWYgKCEobmV4dGMgPT09IC0xIHx8IG5leHRjID09PSBDX1RBQiB8fCBuZXh0YyA9PT0gQ19TUEFDRSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gaWYgaXQgaW50ZXJydXB0cyBwYXJhZ3JhcGgsIG1ha2Ugc3VyZSBmaXJzdCBsaW5lIGlzbid0IGJsYW5rXG4gICAgaWYgKGNvbnRhaW5lci50eXBlID09PSAncGFyYWdyYXBoJyAmJiAhcGFyc2VyLmN1cnJlbnRMaW5lLnNsaWNlKHBhcnNlci5uZXh0Tm9uc3BhY2UgKyBtYXRjaFswXS5sZW5ndGgpLm1hdGNoKHJlTm9uU3BhY2UpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIHdlJ3ZlIGdvdCBhIG1hdGNoISBhZHZhbmNlIG9mZnNldCBhbmQgY2FsY3VsYXRlIHBhZGRpbmdcbiAgICBwYXJzZXIuYWR2YW5jZU5leHROb25zcGFjZSgpOyAvLyB0byBzdGFydCBvZiBtYXJrZXJcbiAgICBwYXJzZXIuYWR2YW5jZU9mZnNldChtYXRjaFswXS5sZW5ndGgsIHRydWUpOyAvLyB0byBlbmQgb2YgbWFya2VyXG4gICAgc3BhY2VzU3RhcnRDb2wgPSBwYXJzZXIuY29sdW1uO1xuICAgIHNwYWNlc1N0YXJ0T2Zmc2V0ID0gcGFyc2VyLm9mZnNldDtcbiAgICBkbyB7XG4gICAgICAgIHBhcnNlci5hZHZhbmNlT2Zmc2V0KDEsIHRydWUpO1xuICAgICAgICBuZXh0YyA9IHBlZWsocGFyc2VyLmN1cnJlbnRMaW5lLCBwYXJzZXIub2Zmc2V0KTtcbiAgICB9IHdoaWxlIChwYXJzZXIuY29sdW1uIC0gc3BhY2VzU3RhcnRDb2wgPCA1ICYmXG4gICAgICAgICAgIGlzU3BhY2VPclRhYihuZXh0YykpO1xuICAgIHZhciBibGFua19pdGVtID0gcGVlayhwYXJzZXIuY3VycmVudExpbmUsIHBhcnNlci5vZmZzZXQpID09PSAtMTtcbiAgICB2YXIgc3BhY2VzX2FmdGVyX21hcmtlciA9IHBhcnNlci5jb2x1bW4gLSBzcGFjZXNTdGFydENvbDtcbiAgICBpZiAoc3BhY2VzX2FmdGVyX21hcmtlciA+PSA1IHx8XG4gICAgICAgIHNwYWNlc19hZnRlcl9tYXJrZXIgPCAxIHx8XG4gICAgICAgIGJsYW5rX2l0ZW0pIHtcbiAgICAgICAgZGF0YS5wYWRkaW5nID0gbWF0Y2hbMF0ubGVuZ3RoICsgMTtcbiAgICAgICAgcGFyc2VyLmNvbHVtbiA9IHNwYWNlc1N0YXJ0Q29sO1xuICAgICAgICBwYXJzZXIub2Zmc2V0ID0gc3BhY2VzU3RhcnRPZmZzZXQ7XG4gICAgICAgIGlmIChpc1NwYWNlT3JUYWIocGVlayhwYXJzZXIuY3VycmVudExpbmUsIHBhcnNlci5vZmZzZXQpKSkge1xuICAgICAgICAgICAgcGFyc2VyLmFkdmFuY2VPZmZzZXQoMSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhLnBhZGRpbmcgPSBtYXRjaFswXS5sZW5ndGggKyBzcGFjZXNfYWZ0ZXJfbWFya2VyO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbn07XG5cbi8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIGxpc3QgaXRlbXMgYXJlIG9mIHRoZSBzYW1lIHR5cGUsXG4vLyB3aXRoIHRoZSBzYW1lIGRlbGltaXRlciBhbmQgYnVsbGV0IGNoYXJhY3Rlci4gIFRoaXMgaXMgdXNlZFxuLy8gaW4gYWdnbG9tZXJhdGluZyBsaXN0IGl0ZW1zIGludG8gbGlzdHMuXG52YXIgbGlzdHNNYXRjaCA9IGZ1bmN0aW9uKGxpc3RfZGF0YSwgaXRlbV9kYXRhKSB7XG4gICAgcmV0dXJuIChsaXN0X2RhdGEudHlwZSA9PT0gaXRlbV9kYXRhLnR5cGUgJiZcbiAgICAgICAgICAgIGxpc3RfZGF0YS5kZWxpbWl0ZXIgPT09IGl0ZW1fZGF0YS5kZWxpbWl0ZXIgJiZcbiAgICAgICAgICAgIGxpc3RfZGF0YS5idWxsZXRDaGFyID09PSBpdGVtX2RhdGEuYnVsbGV0Q2hhcik7XG59O1xuXG4vLyBGaW5hbGl6ZSBhbmQgY2xvc2UgYW55IHVubWF0Y2hlZCBibG9ja3MuXG52YXIgY2xvc2VVbm1hdGNoZWRCbG9ja3MgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuYWxsQ2xvc2VkKSB7XG4gICAgICAgIC8vIGZpbmFsaXplIGFueSBibG9ja3Mgbm90IG1hdGNoZWRcbiAgICAgICAgd2hpbGUgKHRoaXMub2xkdGlwICE9PSB0aGlzLmxhc3RNYXRjaGVkQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5vbGR0aXAuX3BhcmVudDtcbiAgICAgICAgICAgIHRoaXMuZmluYWxpemUodGhpcy5vbGR0aXAsIHRoaXMubGluZU51bWJlciAtIDEpO1xuICAgICAgICAgICAgdGhpcy5vbGR0aXAgPSBwYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hbGxDbG9zZWQgPSB0cnVlO1xuICAgIH1cbn07XG5cbi8vICdmaW5hbGl6ZScgaXMgcnVuIHdoZW4gdGhlIGJsb2NrIGlzIGNsb3NlZC5cbi8vICdjb250aW51ZScgaXMgcnVuIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGJsb2NrIGlzIGNvbnRpbnVpbmdcbi8vIGF0IGEgY2VydGFpbiBsaW5lIGFuZCBvZmZzZXQgKGUuZy4gd2hldGhlciBhIGJsb2NrIHF1b3RlXG4vLyBjb250YWlucyBhIGA+YC4gIEl0IHJldHVybnMgMCBmb3IgbWF0Y2hlZCwgMSBmb3Igbm90IG1hdGNoZWQsXG4vLyBhbmQgMiBmb3IgXCJ3ZSd2ZSBkZWFsdCB3aXRoIHRoaXMgbGluZSBjb21wbGV0ZWx5LCBnbyB0byBuZXh0LlwiXG52YXIgYmxvY2tzID0ge1xuICAgIGRvY3VtZW50OiB7XG4gICAgICAgIGNvbnRpbnVlOiBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH0sXG4gICAgICAgIGZpbmFsaXplOiBmdW5jdGlvbigpIHsgcmV0dXJuOyB9LFxuICAgICAgICBjYW5Db250YWluOiBmdW5jdGlvbih0KSB7IHJldHVybiAodCAhPT0gJ2l0ZW0nKTsgfSxcbiAgICAgICAgYWNjZXB0c0xpbmVzOiBmYWxzZVxuICAgIH0sXG4gICAgbGlzdDoge1xuICAgICAgICBjb250aW51ZTogZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9LFxuICAgICAgICBmaW5hbGl6ZTogZnVuY3Rpb24ocGFyc2VyLCBibG9jaykge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBibG9jay5fZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIHdoaWxlIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIG5vbi1maW5hbCBsaXN0IGl0ZW0gZW5kaW5nIHdpdGggYmxhbmsgbGluZTpcbiAgICAgICAgICAgICAgICBpZiAoZW5kc1dpdGhCbGFua0xpbmUoaXRlbSkgJiYgaXRlbS5fbmV4dCkge1xuICAgICAgICAgICAgICAgICAgICBibG9jay5fbGlzdERhdGEudGlnaHQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2UgaW50byBjaGlsZHJlbiBvZiBsaXN0IGl0ZW0sIHRvIHNlZSBpZiB0aGVyZSBhcmVcbiAgICAgICAgICAgICAgICAvLyBzcGFjZXMgYmV0d2VlbiBhbnkgb2YgdGhlbTpcbiAgICAgICAgICAgICAgICB2YXIgc3ViaXRlbSA9IGl0ZW0uX2ZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHN1Yml0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZHNXaXRoQmxhbmtMaW5lKHN1Yml0ZW0pICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoaXRlbS5fbmV4dCB8fCBzdWJpdGVtLl9uZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suX2xpc3REYXRhLnRpZ2h0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdWJpdGVtID0gc3ViaXRlbS5fbmV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaXRlbSA9IGl0ZW0uX25leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbkNvbnRhaW46IGZ1bmN0aW9uKHQpIHsgcmV0dXJuICh0ID09PSAnaXRlbScpOyB9LFxuICAgICAgICBhY2NlcHRzTGluZXM6IGZhbHNlXG4gICAgfSxcbiAgICBibG9ja19xdW90ZToge1xuICAgICAgICBjb250aW51ZTogZnVuY3Rpb24ocGFyc2VyKSB7XG4gICAgICAgICAgICB2YXIgbG4gPSBwYXJzZXIuY3VycmVudExpbmU7XG4gICAgICAgICAgICBpZiAoIXBhcnNlci5pbmRlbnRlZCAmJlxuICAgICAgICAgICAgICAgIHBlZWsobG4sIHBhcnNlci5uZXh0Tm9uc3BhY2UpID09PSBDX0dSRUFURVJUSEFOKSB7XG4gICAgICAgICAgICAgICAgcGFyc2VyLmFkdmFuY2VOZXh0Tm9uc3BhY2UoKTtcbiAgICAgICAgICAgICAgICBwYXJzZXIuYWR2YW5jZU9mZnNldCgxLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzU3BhY2VPclRhYihwZWVrKGxuLCBwYXJzZXIub2Zmc2V0KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmFkdmFuY2VPZmZzZXQoMSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9LFxuICAgICAgICBmaW5hbGl6ZTogZnVuY3Rpb24oKSB7IHJldHVybjsgfSxcbiAgICAgICAgY2FuQ29udGFpbjogZnVuY3Rpb24odCkgeyByZXR1cm4gKHQgIT09ICdpdGVtJyk7IH0sXG4gICAgICAgIGFjY2VwdHNMaW5lczogZmFsc2VcbiAgICB9LFxuICAgIGl0ZW06IHtcbiAgICAgICAgY29udGludWU6IGZ1bmN0aW9uKHBhcnNlciwgY29udGFpbmVyKSB7XG4gICAgICAgICAgICBpZiAocGFyc2VyLmJsYW5rKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5fZmlyc3RDaGlsZCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEJsYW5rIGxpbmUgYWZ0ZXIgZW1wdHkgbGlzdCBpdGVtXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlci5hZHZhbmNlTmV4dE5vbnNwYWNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJzZXIuaW5kZW50ID49XG4gICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5fbGlzdERhdGEubWFya2VyT2Zmc2V0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLl9saXN0RGF0YS5wYWRkaW5nKSB7XG4gICAgICAgICAgICAgICAgcGFyc2VyLmFkdmFuY2VPZmZzZXQoY29udGFpbmVyLl9saXN0RGF0YS5tYXJrZXJPZmZzZXQgK1xuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuX2xpc3REYXRhLnBhZGRpbmcsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9LFxuICAgICAgICBmaW5hbGl6ZTogZnVuY3Rpb24oKSB7IHJldHVybjsgfSxcbiAgICAgICAgY2FuQ29udGFpbjogZnVuY3Rpb24odCkgeyByZXR1cm4gKHQgIT09ICdpdGVtJyk7IH0sXG4gICAgICAgIGFjY2VwdHNMaW5lczogZmFsc2VcbiAgICB9LFxuICAgIGhlYWRpbmc6IHtcbiAgICAgICAgY29udGludWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgLy8gYSBoZWFkaW5nIGNhbiBuZXZlciBjb250YWluZXIgPiAxIGxpbmUsIHNvIGZhaWwgdG8gbWF0Y2g6XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSxcbiAgICAgICAgZmluYWxpemU6IGZ1bmN0aW9uKCkgeyByZXR1cm47IH0sXG4gICAgICAgIGNhbkNvbnRhaW46IGZ1bmN0aW9uKCkgeyByZXR1cm4gZmFsc2U7IH0sXG4gICAgICAgIGFjY2VwdHNMaW5lczogZmFsc2VcbiAgICB9LFxuICAgIHRoZW1hdGljX2JyZWFrOiB7XG4gICAgICAgIGNvbnRpbnVlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIC8vIGEgdGhlbWF0aWMgYnJlYWsgY2FuIG5ldmVyIGNvbnRhaW5lciA+IDEgbGluZSwgc28gZmFpbCB0byBtYXRjaDpcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9LFxuICAgICAgICBmaW5hbGl6ZTogZnVuY3Rpb24oKSB7IHJldHVybjsgfSxcbiAgICAgICAgY2FuQ29udGFpbjogZnVuY3Rpb24oKSB7IHJldHVybiBmYWxzZTsgfSxcbiAgICAgICAgYWNjZXB0c0xpbmVzOiBmYWxzZVxuICAgIH0sXG4gICAgY29kZV9ibG9jazoge1xuICAgICAgICBjb250aW51ZTogZnVuY3Rpb24ocGFyc2VyLCBjb250YWluZXIpIHtcbiAgICAgICAgICAgIHZhciBsbiA9IHBhcnNlci5jdXJyZW50TGluZTtcbiAgICAgICAgICAgIHZhciBpbmRlbnQgPSBwYXJzZXIuaW5kZW50O1xuICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5faXNGZW5jZWQpIHsgLy8gZmVuY2VkXG4gICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gKGluZGVudCA8PSAzICYmXG4gICAgICAgICAgICAgICAgICAgIGxuLmNoYXJBdChwYXJzZXIubmV4dE5vbnNwYWNlKSA9PT0gY29udGFpbmVyLl9mZW5jZUNoYXIgJiZcbiAgICAgICAgICAgICAgICAgICAgbG4uc2xpY2UocGFyc2VyLm5leHROb25zcGFjZSkubWF0Y2gocmVDbG9zaW5nQ29kZUZlbmNlKSk7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoICYmIG1hdGNoWzBdLmxlbmd0aCA+PSBjb250YWluZXIuX2ZlbmNlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNsb3NpbmcgZmVuY2UgLSB3ZSdyZSBhdCBlbmQgb2YgbGluZSwgc28gd2UgY2FuIHJldHVyblxuICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZmluYWxpemUoY29udGFpbmVyLCBwYXJzZXIubGluZU51bWJlcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNraXAgb3B0aW9uYWwgc3BhY2VzIG9mIGZlbmNlIG9mZnNldFxuICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGNvbnRhaW5lci5fZmVuY2VPZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpID4gMCAmJiBpc1NwYWNlT3JUYWIocGVlayhsbiwgcGFyc2VyLm9mZnNldCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuYWR2YW5jZU9mZnNldCgxLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7IC8vIGluZGVudGVkXG4gICAgICAgICAgICAgICAgaWYgKGluZGVudCA+PSBDT0RFX0lOREVOVCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZXIuYWR2YW5jZU9mZnNldChDT0RFX0lOREVOVCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJzZXIuYmxhbmspIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmFkdmFuY2VOZXh0Tm9uc3BhY2UoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSxcbiAgICAgICAgZmluYWxpemU6IGZ1bmN0aW9uKHBhcnNlciwgYmxvY2spIHtcbiAgICAgICAgICAgIGlmIChibG9jay5faXNGZW5jZWQpIHsgLy8gZmVuY2VkXG4gICAgICAgICAgICAgICAgLy8gZmlyc3QgbGluZSBiZWNvbWVzIGluZm8gc3RyaW5nXG4gICAgICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBibG9jay5fc3RyaW5nX2NvbnRlbnQ7XG4gICAgICAgICAgICAgICAgdmFyIG5ld2xpbmVQb3MgPSBjb250ZW50LmluZGV4T2YoJ1xcbicpO1xuICAgICAgICAgICAgICAgIHZhciBmaXJzdExpbmUgPSBjb250ZW50LnNsaWNlKDAsIG5ld2xpbmVQb3MpO1xuICAgICAgICAgICAgICAgIHZhciByZXN0ID0gY29udGVudC5zbGljZShuZXdsaW5lUG9zICsgMSk7XG4gICAgICAgICAgICAgICAgYmxvY2suaW5mbyA9IHVuZXNjYXBlU3RyaW5nKGZpcnN0TGluZS50cmltKCkpO1xuICAgICAgICAgICAgICAgIGJsb2NrLl9saXRlcmFsID0gcmVzdDtcbiAgICAgICAgICAgIH0gZWxzZSB7IC8vIGluZGVudGVkXG4gICAgICAgICAgICAgICAgYmxvY2suX2xpdGVyYWwgPSBibG9jay5fc3RyaW5nX2NvbnRlbnQucmVwbGFjZSgvKFxcbiAqKSskLywgJ1xcbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmxvY2suX3N0cmluZ19jb250ZW50ID0gbnVsbDsgLy8gYWxsb3cgR0NcbiAgICAgICAgfSxcbiAgICAgICAgY2FuQ29udGFpbjogZnVuY3Rpb24oKSB7IHJldHVybiBmYWxzZTsgfSxcbiAgICAgICAgYWNjZXB0c0xpbmVzOiB0cnVlXG4gICAgfSxcbiAgICBodG1sX2Jsb2NrOiB7XG4gICAgICAgIGNvbnRpbnVlOiBmdW5jdGlvbihwYXJzZXIsIGNvbnRhaW5lcikge1xuICAgICAgICAgICAgcmV0dXJuICgocGFyc2VyLmJsYW5rICYmXG4gICAgICAgICAgICAgICAgICAgICAoY29udGFpbmVyLl9odG1sQmxvY2tUeXBlID09PSA2IHx8XG4gICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLl9odG1sQmxvY2tUeXBlID09PSA3KSkgPyAxIDogMCk7XG4gICAgICAgIH0sXG4gICAgICAgIGZpbmFsaXplOiBmdW5jdGlvbihwYXJzZXIsIGJsb2NrKSB7XG4gICAgICAgICAgICBibG9jay5fbGl0ZXJhbCA9IGJsb2NrLl9zdHJpbmdfY29udGVudC5yZXBsYWNlKC8oXFxuICopKyQvLCAnJyk7XG4gICAgICAgICAgICBibG9jay5fc3RyaW5nX2NvbnRlbnQgPSBudWxsOyAvLyBhbGxvdyBHQ1xuICAgICAgICB9LFxuICAgICAgICBjYW5Db250YWluOiBmdW5jdGlvbigpIHsgcmV0dXJuIGZhbHNlOyB9LFxuICAgICAgICBhY2NlcHRzTGluZXM6IHRydWVcbiAgICB9LFxuICAgIHBhcmFncmFwaDoge1xuICAgICAgICBjb250aW51ZTogZnVuY3Rpb24ocGFyc2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gKHBhcnNlci5ibGFuayA/IDEgOiAwKTtcbiAgICAgICAgfSxcbiAgICAgICAgZmluYWxpemU6IGZ1bmN0aW9uKHBhcnNlciwgYmxvY2spIHtcbiAgICAgICAgICAgIHZhciBwb3M7XG4gICAgICAgICAgICB2YXIgaGFzUmVmZXJlbmNlRGVmcyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvLyB0cnkgcGFyc2luZyB0aGUgYmVnaW5uaW5nIGFzIGxpbmsgcmVmZXJlbmNlIGRlZmluaXRpb25zOlxuICAgICAgICAgICAgd2hpbGUgKHBlZWsoYmxvY2suX3N0cmluZ19jb250ZW50LCAwKSA9PT0gQ19PUEVOX0JSQUNLRVQgJiZcbiAgICAgICAgICAgICAgICAgICAocG9zID1cbiAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmlubGluZVBhcnNlci5wYXJzZVJlZmVyZW5jZShibG9jay5fc3RyaW5nX2NvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnJlZm1hcCkpKSB7XG4gICAgICAgICAgICAgICAgYmxvY2suX3N0cmluZ19jb250ZW50ID0gYmxvY2suX3N0cmluZ19jb250ZW50LnNsaWNlKHBvcyk7XG4gICAgICAgICAgICAgICAgaGFzUmVmZXJlbmNlRGVmcyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFzUmVmZXJlbmNlRGVmcyAmJiBpc0JsYW5rKGJsb2NrLl9zdHJpbmdfY29udGVudCkpIHtcbiAgICAgICAgICAgICAgICBibG9jay51bmxpbmsoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FuQ29udGFpbjogZnVuY3Rpb24oKSB7IHJldHVybiBmYWxzZTsgfSxcbiAgICAgICAgYWNjZXB0c0xpbmVzOiB0cnVlXG4gICAgfVxufTtcblxuLy8gYmxvY2sgc3RhcnQgZnVuY3Rpb25zLiAgUmV0dXJuIHZhbHVlczpcbi8vIDAgPSBubyBtYXRjaFxuLy8gMSA9IG1hdGNoZWQgY29udGFpbmVyLCBrZWVwIGdvaW5nXG4vLyAyID0gbWF0Y2hlZCBsZWFmLCBubyBtb3JlIGJsb2NrIHN0YXJ0c1xudmFyIGJsb2NrU3RhcnRzID0gW1xuICAgIC8vIGJsb2NrIHF1b3RlXG4gICAgZnVuY3Rpb24ocGFyc2VyKSB7XG4gICAgICAgIGlmICghcGFyc2VyLmluZGVudGVkICYmXG4gICAgICAgICAgICBwZWVrKHBhcnNlci5jdXJyZW50TGluZSwgcGFyc2VyLm5leHROb25zcGFjZSkgPT09IENfR1JFQVRFUlRIQU4pIHtcbiAgICAgICAgICAgIHBhcnNlci5hZHZhbmNlTmV4dE5vbnNwYWNlKCk7XG4gICAgICAgICAgICBwYXJzZXIuYWR2YW5jZU9mZnNldCgxLCBmYWxzZSk7XG4gICAgICAgICAgICAvLyBvcHRpb25hbCBmb2xsb3dpbmcgc3BhY2VcbiAgICAgICAgICAgIGlmIChpc1NwYWNlT3JUYWIocGVlayhwYXJzZXIuY3VycmVudExpbmUsIHBhcnNlci5vZmZzZXQpKSkge1xuICAgICAgICAgICAgICAgIHBhcnNlci5hZHZhbmNlT2Zmc2V0KDEsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyc2VyLmNsb3NlVW5tYXRjaGVkQmxvY2tzKCk7XG4gICAgICAgICAgICBwYXJzZXIuYWRkQ2hpbGQoJ2Jsb2NrX3F1b3RlJywgcGFyc2VyLm5leHROb25zcGFjZSk7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEFUWCBoZWFkaW5nXG4gICAgZnVuY3Rpb24ocGFyc2VyKSB7XG4gICAgICAgIHZhciBtYXRjaDtcbiAgICAgICAgaWYgKCFwYXJzZXIuaW5kZW50ZWQgJiZcbiAgICAgICAgICAgIChtYXRjaCA9IHBhcnNlci5jdXJyZW50TGluZS5zbGljZShwYXJzZXIubmV4dE5vbnNwYWNlKS5tYXRjaChyZUFUWEhlYWRpbmdNYXJrZXIpKSkge1xuICAgICAgICAgICAgcGFyc2VyLmFkdmFuY2VOZXh0Tm9uc3BhY2UoKTtcbiAgICAgICAgICAgIHBhcnNlci5hZHZhbmNlT2Zmc2V0KG1hdGNoWzBdLmxlbmd0aCwgZmFsc2UpO1xuICAgICAgICAgICAgcGFyc2VyLmNsb3NlVW5tYXRjaGVkQmxvY2tzKCk7XG4gICAgICAgICAgICB2YXIgY29udGFpbmVyID0gcGFyc2VyLmFkZENoaWxkKCdoZWFkaW5nJywgcGFyc2VyLm5leHROb25zcGFjZSk7XG4gICAgICAgICAgICBjb250YWluZXIubGV2ZWwgPSBtYXRjaFswXS50cmltKCkubGVuZ3RoOyAvLyBudW1iZXIgb2YgI3NcbiAgICAgICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyAjIyNzOlxuICAgICAgICAgICAgY29udGFpbmVyLl9zdHJpbmdfY29udGVudCA9XG4gICAgICAgICAgICAgICAgcGFyc2VyLmN1cnJlbnRMaW5lLnNsaWNlKHBhcnNlci5vZmZzZXQpLnJlcGxhY2UoL14gKiMrICokLywgJycpLnJlcGxhY2UoLyArIysgKiQvLCAnJyk7XG4gICAgICAgICAgICBwYXJzZXIuYWR2YW5jZU9mZnNldChwYXJzZXIuY3VycmVudExpbmUubGVuZ3RoIC0gcGFyc2VyLm9mZnNldCk7XG4gICAgICAgICAgICByZXR1cm4gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEZlbmNlZCBjb2RlIGJsb2NrXG4gICAgZnVuY3Rpb24ocGFyc2VyKSB7XG4gICAgICAgIHZhciBtYXRjaDtcbiAgICAgICAgaWYgKCFwYXJzZXIuaW5kZW50ZWQgJiZcbiAgICAgICAgICAgIChtYXRjaCA9IHBhcnNlci5jdXJyZW50TGluZS5zbGljZShwYXJzZXIubmV4dE5vbnNwYWNlKS5tYXRjaChyZUNvZGVGZW5jZSkpKSB7XG4gICAgICAgICAgICB2YXIgZmVuY2VMZW5ndGggPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgICAgICBwYXJzZXIuY2xvc2VVbm1hdGNoZWRCbG9ja3MoKTtcbiAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBwYXJzZXIuYWRkQ2hpbGQoJ2NvZGVfYmxvY2snLCBwYXJzZXIubmV4dE5vbnNwYWNlKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5faXNGZW5jZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29udGFpbmVyLl9mZW5jZUxlbmd0aCA9IGZlbmNlTGVuZ3RoO1xuICAgICAgICAgICAgY29udGFpbmVyLl9mZW5jZUNoYXIgPSBtYXRjaFswXVswXTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5fZmVuY2VPZmZzZXQgPSBwYXJzZXIuaW5kZW50O1xuICAgICAgICAgICAgcGFyc2VyLmFkdmFuY2VOZXh0Tm9uc3BhY2UoKTtcbiAgICAgICAgICAgIHBhcnNlci5hZHZhbmNlT2Zmc2V0KGZlbmNlTGVuZ3RoLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEhUTUwgYmxvY2tcbiAgICBmdW5jdGlvbihwYXJzZXIsIGNvbnRhaW5lcikge1xuICAgICAgICBpZiAoIXBhcnNlci5pbmRlbnRlZCAmJlxuICAgICAgICAgICAgcGVlayhwYXJzZXIuY3VycmVudExpbmUsIHBhcnNlci5uZXh0Tm9uc3BhY2UpID09PSBDX0xFU1NUSEFOKSB7XG4gICAgICAgICAgICB2YXIgcyA9IHBhcnNlci5jdXJyZW50TGluZS5zbGljZShwYXJzZXIubmV4dE5vbnNwYWNlKTtcbiAgICAgICAgICAgIHZhciBibG9ja1R5cGU7XG5cbiAgICAgICAgICAgIGZvciAoYmxvY2tUeXBlID0gMTsgYmxvY2tUeXBlIDw9IDc7IGJsb2NrVHlwZSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlSHRtbEJsb2NrT3BlbltibG9ja1R5cGVdLnRlc3QocykgJiZcbiAgICAgICAgICAgICAgICAgICAgKGJsb2NrVHlwZSA8IDcgfHxcbiAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci50eXBlICE9PSAncGFyYWdyYXBoJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmNsb3NlVW5tYXRjaGVkQmxvY2tzKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGFkanVzdCBwYXJzZXIub2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgICAvLyBzcGFjZXMgYXJlIHBhcnQgb2YgdGhlIEhUTUwgYmxvY2s6XG4gICAgICAgICAgICAgICAgICAgIHZhciBiID0gcGFyc2VyLmFkZENoaWxkKCdodG1sX2Jsb2NrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIGIuX2h0bWxCbG9ja1R5cGUgPSBibG9ja1R5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwO1xuXG4gICAgfSxcblxuICAgIC8vIFNldGV4dCBoZWFkaW5nXG4gICAgZnVuY3Rpb24ocGFyc2VyLCBjb250YWluZXIpIHtcbiAgICAgICAgdmFyIG1hdGNoO1xuICAgICAgICBpZiAoIXBhcnNlci5pbmRlbnRlZCAmJlxuICAgICAgICAgICAgY29udGFpbmVyLnR5cGUgPT09ICdwYXJhZ3JhcGgnICYmXG4gICAgICAgICAgICAgICAgICAgKChtYXRjaCA9IHBhcnNlci5jdXJyZW50TGluZS5zbGljZShwYXJzZXIubmV4dE5vbnNwYWNlKS5tYXRjaChyZVNldGV4dEhlYWRpbmdMaW5lKSkpKSB7XG4gICAgICAgICAgICBwYXJzZXIuY2xvc2VVbm1hdGNoZWRCbG9ja3MoKTtcbiAgICAgICAgICAgIHZhciBoZWFkaW5nID0gbmV3IE5vZGUoJ2hlYWRpbmcnLCBjb250YWluZXIuc291cmNlcG9zKTtcbiAgICAgICAgICAgIGhlYWRpbmcubGV2ZWwgPSBtYXRjaFswXVswXSA9PT0gJz0nID8gMSA6IDI7XG4gICAgICAgICAgICBoZWFkaW5nLl9zdHJpbmdfY29udGVudCA9IGNvbnRhaW5lci5fc3RyaW5nX2NvbnRlbnQ7XG4gICAgICAgICAgICBjb250YWluZXIuaW5zZXJ0QWZ0ZXIoaGVhZGluZyk7XG4gICAgICAgICAgICBjb250YWluZXIudW5saW5rKCk7XG4gICAgICAgICAgICBwYXJzZXIudGlwID0gaGVhZGluZztcbiAgICAgICAgICAgIHBhcnNlci5hZHZhbmNlT2Zmc2V0KHBhcnNlci5jdXJyZW50TGluZS5sZW5ndGggLSBwYXJzZXIub2Zmc2V0LCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIHRoZW1hdGljIGJyZWFrXG4gICAgZnVuY3Rpb24ocGFyc2VyKSB7XG4gICAgICAgIGlmICghcGFyc2VyLmluZGVudGVkICYmXG4gICAgICAgICAgICByZVRoZW1hdGljQnJlYWsudGVzdChwYXJzZXIuY3VycmVudExpbmUuc2xpY2UocGFyc2VyLm5leHROb25zcGFjZSkpKSB7XG4gICAgICAgICAgICBwYXJzZXIuY2xvc2VVbm1hdGNoZWRCbG9ja3MoKTtcbiAgICAgICAgICAgIHBhcnNlci5hZGRDaGlsZCgndGhlbWF0aWNfYnJlYWsnLCBwYXJzZXIubmV4dE5vbnNwYWNlKTtcbiAgICAgICAgICAgIHBhcnNlci5hZHZhbmNlT2Zmc2V0KHBhcnNlci5jdXJyZW50TGluZS5sZW5ndGggLSBwYXJzZXIub2Zmc2V0LCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIGxpc3QgaXRlbVxuICAgIGZ1bmN0aW9uKHBhcnNlciwgY29udGFpbmVyKSB7XG4gICAgICAgIHZhciBkYXRhO1xuXG4gICAgICAgIGlmICgoIXBhcnNlci5pbmRlbnRlZCB8fCBjb250YWluZXIudHlwZSA9PT0gJ2xpc3QnKVxuICAgICAgICAgICAgICAgICYmIChkYXRhID0gcGFyc2VMaXN0TWFya2VyKHBhcnNlciwgY29udGFpbmVyKSkpIHtcbiAgICAgICAgICAgIHBhcnNlci5jbG9zZVVubWF0Y2hlZEJsb2NrcygpO1xuXG4gICAgICAgICAgICAvLyBhZGQgdGhlIGxpc3QgaWYgbmVlZGVkXG4gICAgICAgICAgICBpZiAocGFyc2VyLnRpcC50eXBlICE9PSAnbGlzdCcgfHxcbiAgICAgICAgICAgICAgICAhKGxpc3RzTWF0Y2goY29udGFpbmVyLl9saXN0RGF0YSwgZGF0YSkpKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gcGFyc2VyLmFkZENoaWxkKCdsaXN0JywgcGFyc2VyLm5leHROb25zcGFjZSk7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLl9saXN0RGF0YSA9IGRhdGE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFkZCB0aGUgbGlzdCBpdGVtXG4gICAgICAgICAgICBjb250YWluZXIgPSBwYXJzZXIuYWRkQ2hpbGQoJ2l0ZW0nLCBwYXJzZXIubmV4dE5vbnNwYWNlKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5fbGlzdERhdGEgPSBkYXRhO1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBpbmRlbnRlZCBjb2RlIGJsb2NrXG4gICAgZnVuY3Rpb24ocGFyc2VyKSB7XG4gICAgICAgIGlmIChwYXJzZXIuaW5kZW50ZWQgJiZcbiAgICAgICAgICAgIHBhcnNlci50aXAudHlwZSAhPT0gJ3BhcmFncmFwaCcgJiZcbiAgICAgICAgICAgICFwYXJzZXIuYmxhbmspIHtcbiAgICAgICAgICAgIC8vIGluZGVudGVkIGNvZGVcbiAgICAgICAgICAgIHBhcnNlci5hZHZhbmNlT2Zmc2V0KENPREVfSU5ERU5ULCB0cnVlKTtcbiAgICAgICAgICAgIHBhcnNlci5jbG9zZVVubWF0Y2hlZEJsb2NrcygpO1xuICAgICAgICAgICAgcGFyc2VyLmFkZENoaWxkKCdjb2RlX2Jsb2NrJywgcGFyc2VyLm9mZnNldCk7XG4gICAgICAgICAgICByZXR1cm4gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgIH1cblxuXTtcblxudmFyIGFkdmFuY2VPZmZzZXQgPSBmdW5jdGlvbihjb3VudCwgY29sdW1ucykge1xuICAgIHZhciBjdXJyZW50TGluZSA9IHRoaXMuY3VycmVudExpbmU7XG4gICAgdmFyIGNoYXJzVG9UYWIsIGNoYXJzVG9BZHZhbmNlO1xuICAgIHZhciBjO1xuICAgIHdoaWxlIChjb3VudCA+IDAgJiYgKGMgPSBjdXJyZW50TGluZVt0aGlzLm9mZnNldF0pKSB7XG4gICAgICAgIGlmIChjID09PSAnXFx0Jykge1xuICAgICAgICAgICAgY2hhcnNUb1RhYiA9IDQgLSAodGhpcy5jb2x1bW4gJSA0KTtcbiAgICAgICAgICAgIGlmIChjb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJ0aWFsbHlDb25zdW1lZFRhYiA9IGNoYXJzVG9UYWIgPiBjb3VudDtcbiAgICAgICAgICAgICAgICBjaGFyc1RvQWR2YW5jZSA9IGNoYXJzVG9UYWIgPiBjb3VudCA/IGNvdW50IDogY2hhcnNUb1RhYjtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbiArPSBjaGFyc1RvQWR2YW5jZTtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCArPSB0aGlzLnBhcnRpYWxseUNvbnN1bWVkVGFiID8gMCA6IDE7XG4gICAgICAgICAgICAgICAgY291bnQgLT0gY2hhcnNUb0FkdmFuY2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucGFydGlhbGx5Q29uc3VtZWRUYWIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbiArPSBjaGFyc1RvVGFiO1xuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgY291bnQgLT0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGFydGlhbGx5Q29uc3VtZWRUYWIgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbiArPSAxOyAvLyBhc3N1bWUgYXNjaWk7IGJsb2NrIHN0YXJ0cyBhcmUgYXNjaWlcbiAgICAgICAgICAgIGNvdW50IC09IDE7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG52YXIgYWR2YW5jZU5leHROb25zcGFjZSA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMub2Zmc2V0ID0gdGhpcy5uZXh0Tm9uc3BhY2U7XG4gICAgdGhpcy5jb2x1bW4gPSB0aGlzLm5leHROb25zcGFjZUNvbHVtbjtcbiAgICB0aGlzLnBhcnRpYWxseUNvbnN1bWVkVGFiID0gZmFsc2U7XG59O1xuXG52YXIgZmluZE5leHROb25zcGFjZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjdXJyZW50TGluZSA9IHRoaXMuY3VycmVudExpbmU7XG4gICAgdmFyIGkgPSB0aGlzLm9mZnNldDtcbiAgICB2YXIgY29scyA9IHRoaXMuY29sdW1uO1xuICAgIHZhciBjO1xuXG4gICAgd2hpbGUgKChjID0gY3VycmVudExpbmUuY2hhckF0KGkpKSAhPT0gJycpIHtcbiAgICAgICAgaWYgKGMgPT09ICcgJykge1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgY29scysrO1xuICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICdcXHQnKSB7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBjb2xzICs9ICg0IC0gKGNvbHMgJSA0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmJsYW5rID0gKGMgPT09ICdcXG4nIHx8IGMgPT09ICdcXHInIHx8IGMgPT09ICcnKTtcbiAgICB0aGlzLm5leHROb25zcGFjZSA9IGk7XG4gICAgdGhpcy5uZXh0Tm9uc3BhY2VDb2x1bW4gPSBjb2xzO1xuICAgIHRoaXMuaW5kZW50ID0gdGhpcy5uZXh0Tm9uc3BhY2VDb2x1bW4gLSB0aGlzLmNvbHVtbjtcbiAgICB0aGlzLmluZGVudGVkID0gdGhpcy5pbmRlbnQgPj0gQ09ERV9JTkRFTlQ7XG59O1xuXG4vLyBBbmFseXplIGEgbGluZSBvZiB0ZXh0IGFuZCB1cGRhdGUgdGhlIGRvY3VtZW50IGFwcHJvcHJpYXRlbHkuXG4vLyBXZSBwYXJzZSBtYXJrZG93biB0ZXh0IGJ5IGNhbGxpbmcgdGhpcyBvbiBlYWNoIGxpbmUgb2YgaW5wdXQsXG4vLyB0aGVuIGZpbmFsaXppbmcgdGhlIGRvY3VtZW50LlxudmFyIGluY29ycG9yYXRlTGluZSA9IGZ1bmN0aW9uKGxuKSB7XG4gICAgdmFyIGFsbF9tYXRjaGVkID0gdHJ1ZTtcbiAgICB2YXIgdDtcblxuICAgIHZhciBjb250YWluZXIgPSB0aGlzLmRvYztcbiAgICB0aGlzLm9sZHRpcCA9IHRoaXMudGlwO1xuICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICB0aGlzLmNvbHVtbiA9IDA7XG4gICAgdGhpcy5ibGFuayA9IGZhbHNlO1xuICAgIHRoaXMucGFydGlhbGx5Q29uc3VtZWRUYWIgPSBmYWxzZTtcbiAgICB0aGlzLmxpbmVOdW1iZXIgKz0gMTtcblxuICAgIC8vIHJlcGxhY2UgTlVMIGNoYXJhY3RlcnMgZm9yIHNlY3VyaXR5XG4gICAgaWYgKGxuLmluZGV4T2YoJ1xcdTAwMDAnKSAhPT0gLTEpIHtcbiAgICAgICAgbG4gPSBsbi5yZXBsYWNlKC9cXDAvZywgJ1xcdUZGRkQnKTtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRMaW5lID0gbG47XG5cbiAgICAvLyBGb3IgZWFjaCBjb250YWluaW5nIGJsb2NrLCB0cnkgdG8gcGFyc2UgdGhlIGFzc29jaWF0ZWQgbGluZSBzdGFydC5cbiAgICAvLyBCYWlsIG91dCBvbiBmYWlsdXJlOiBjb250YWluZXIgd2lsbCBwb2ludCB0byB0aGUgbGFzdCBtYXRjaGluZyBibG9jay5cbiAgICAvLyBTZXQgYWxsX21hdGNoZWQgdG8gZmFsc2UgaWYgbm90IGFsbCBjb250YWluZXJzIG1hdGNoLlxuICAgIHZhciBsYXN0Q2hpbGQ7XG4gICAgd2hpbGUgKChsYXN0Q2hpbGQgPSBjb250YWluZXIuX2xhc3RDaGlsZCkgJiYgbGFzdENoaWxkLl9vcGVuKSB7XG4gICAgICAgIGNvbnRhaW5lciA9IGxhc3RDaGlsZDtcblxuICAgICAgICB0aGlzLmZpbmROZXh0Tm9uc3BhY2UoKTtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMuYmxvY2tzW2NvbnRhaW5lci50eXBlXS5jb250aW51ZSh0aGlzLCBjb250YWluZXIpKSB7XG4gICAgICAgIGNhc2UgMDogLy8gd2UndmUgbWF0Y2hlZCwga2VlcCBnb2luZ1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTogLy8gd2UndmUgZmFpbGVkIHRvIG1hdGNoIGEgYmxvY2tcbiAgICAgICAgICAgIGFsbF9tYXRjaGVkID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOiAvLyB3ZSd2ZSBoaXQgZW5kIG9mIGxpbmUgZm9yIGZlbmNlZCBjb2RlIGNsb3NlIGFuZCBjYW4gcmV0dXJuXG4gICAgICAgICAgICB0aGlzLmxhc3RMaW5lTGVuZ3RoID0gbG4ubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgJ2NvbnRpbnVlIHJldHVybmVkIGlsbGVnYWwgdmFsdWUsIG11c3QgYmUgMCwgMSwgb3IgMic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhbGxfbWF0Y2hlZCkge1xuICAgICAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLl9wYXJlbnQ7IC8vIGJhY2sgdXAgdG8gbGFzdCBtYXRjaGluZyBibG9ja1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmFsbENsb3NlZCA9IChjb250YWluZXIgPT09IHRoaXMub2xkdGlwKTtcbiAgICB0aGlzLmxhc3RNYXRjaGVkQ29udGFpbmVyID0gY29udGFpbmVyO1xuXG4gICAgdmFyIG1hdGNoZWRMZWFmID0gY29udGFpbmVyLnR5cGUgIT09ICdwYXJhZ3JhcGgnICYmXG4gICAgICAgICAgICBibG9ja3NbY29udGFpbmVyLnR5cGVdLmFjY2VwdHNMaW5lcztcbiAgICB2YXIgc3RhcnRzID0gdGhpcy5ibG9ja1N0YXJ0cztcbiAgICB2YXIgc3RhcnRzTGVuID0gc3RhcnRzLmxlbmd0aDtcbiAgICAvLyBVbmxlc3MgbGFzdCBtYXRjaGVkIGNvbnRhaW5lciBpcyBhIGNvZGUgYmxvY2ssIHRyeSBuZXcgY29udGFpbmVyIHN0YXJ0cyxcbiAgICAvLyBhZGRpbmcgY2hpbGRyZW4gdG8gdGhlIGxhc3QgbWF0Y2hlZCBjb250YWluZXI6XG4gICAgd2hpbGUgKCFtYXRjaGVkTGVhZikge1xuXG4gICAgICAgIHRoaXMuZmluZE5leHROb25zcGFjZSgpO1xuXG4gICAgICAgIC8vIHRoaXMgaXMgYSBsaXR0bGUgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uOlxuICAgICAgICBpZiAoIXRoaXMuaW5kZW50ZWQgJiZcbiAgICAgICAgICAgICFyZU1heWJlU3BlY2lhbC50ZXN0KGxuLnNsaWNlKHRoaXMubmV4dE5vbnNwYWNlKSkpIHtcbiAgICAgICAgICAgIHRoaXMuYWR2YW5jZU5leHROb25zcGFjZSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwgc3RhcnRzTGVuKSB7XG4gICAgICAgICAgICB2YXIgcmVzID0gc3RhcnRzW2ldKHRoaXMsIGNvbnRhaW5lcik7XG4gICAgICAgICAgICBpZiAocmVzID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gdGhpcy50aXA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlcyA9PT0gMikge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IHRoaXMudGlwO1xuICAgICAgICAgICAgICAgIG1hdGNoZWRMZWFmID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGkgPT09IHN0YXJ0c0xlbikgeyAvLyBub3RoaW5nIG1hdGNoZWRcbiAgICAgICAgICAgIHRoaXMuYWR2YW5jZU5leHROb25zcGFjZSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXaGF0IHJlbWFpbnMgYXQgdGhlIG9mZnNldCBpcyBhIHRleHQgbGluZS4gIEFkZCB0aGUgdGV4dCB0byB0aGVcbiAgICAvLyBhcHByb3ByaWF0ZSBjb250YWluZXIuXG5cbiAgIC8vIEZpcnN0IGNoZWNrIGZvciBhIGxhenkgcGFyYWdyYXBoIGNvbnRpbnVhdGlvbjpcbiAgICBpZiAoIXRoaXMuYWxsQ2xvc2VkICYmICF0aGlzLmJsYW5rICYmXG4gICAgICAgIHRoaXMudGlwLnR5cGUgPT09ICdwYXJhZ3JhcGgnKSB7XG4gICAgICAgIC8vIGxhenkgcGFyYWdyYXBoIGNvbnRpbnVhdGlvblxuICAgICAgICB0aGlzLmFkZExpbmUoKTtcblxuICAgIH0gZWxzZSB7IC8vIG5vdCBhIGxhenkgY29udGludWF0aW9uXG5cbiAgICAgICAgLy8gZmluYWxpemUgYW55IGJsb2NrcyBub3QgbWF0Y2hlZFxuICAgICAgICB0aGlzLmNsb3NlVW5tYXRjaGVkQmxvY2tzKCk7XG4gICAgICAgIGlmICh0aGlzLmJsYW5rICYmIGNvbnRhaW5lci5sYXN0Q2hpbGQpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5sYXN0Q2hpbGQuX2xhc3RMaW5lQmxhbmsgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdCA9IGNvbnRhaW5lci50eXBlO1xuXG4gICAgICAgIC8vIEJsb2NrIHF1b3RlIGxpbmVzIGFyZSBuZXZlciBibGFuayBhcyB0aGV5IHN0YXJ0IHdpdGggPlxuICAgICAgICAvLyBhbmQgd2UgZG9uJ3QgY291bnQgYmxhbmtzIGluIGZlbmNlZCBjb2RlIGZvciBwdXJwb3NlcyBvZiB0aWdodC9sb29zZVxuICAgICAgICAvLyBsaXN0cyBvciBicmVha2luZyBvdXQgb2YgbGlzdHMuICBXZSBhbHNvIGRvbid0IHNldCBfbGFzdExpbmVCbGFua1xuICAgICAgICAvLyBvbiBhbiBlbXB0eSBsaXN0IGl0ZW0sIG9yIGlmIHdlIGp1c3QgY2xvc2VkIGEgZmVuY2VkIGJsb2NrLlxuICAgICAgICB2YXIgbGFzdExpbmVCbGFuayA9IHRoaXMuYmxhbmsgJiZcbiAgICAgICAgICAgICEodCA9PT0gJ2Jsb2NrX3F1b3RlJyB8fFxuICAgICAgICAgICAgICAodCA9PT0gJ2NvZGVfYmxvY2snICYmIGNvbnRhaW5lci5faXNGZW5jZWQpIHx8XG4gICAgICAgICAgICAgICh0ID09PSAnaXRlbScgJiZcbiAgICAgICAgICAgICAgICFjb250YWluZXIuX2ZpcnN0Q2hpbGQgJiZcbiAgICAgICAgICAgICAgIGNvbnRhaW5lci5zb3VyY2Vwb3NbMF1bMF0gPT09IHRoaXMubGluZU51bWJlcikpO1xuXG4gICAgICAgIC8vIHByb3BhZ2F0ZSBsYXN0TGluZUJsYW5rIHVwIHRocm91Z2ggcGFyZW50czpcbiAgICAgICAgdmFyIGNvbnQgPSBjb250YWluZXI7XG4gICAgICAgIHdoaWxlIChjb250KSB7XG4gICAgICAgICAgICBjb250Ll9sYXN0TGluZUJsYW5rID0gbGFzdExpbmVCbGFuaztcbiAgICAgICAgICAgIGNvbnQgPSBjb250Ll9wYXJlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5ibG9ja3NbdF0uYWNjZXB0c0xpbmVzKSB7XG4gICAgICAgICAgICB0aGlzLmFkZExpbmUoKTtcbiAgICAgICAgICAgIC8vIGlmIEh0bWxCbG9jaywgY2hlY2sgZm9yIGVuZCBjb25kaXRpb25cbiAgICAgICAgICAgIGlmICh0ID09PSAnaHRtbF9ibG9jaycgJiZcbiAgICAgICAgICAgICAgICBjb250YWluZXIuX2h0bWxCbG9ja1R5cGUgPj0gMSAmJlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5faHRtbEJsb2NrVHlwZSA8PSA1ICYmXG4gICAgICAgICAgICAgICAgcmVIdG1sQmxvY2tDbG9zZVtjb250YWluZXIuX2h0bWxCbG9ja1R5cGVdLnRlc3QodGhpcy5jdXJyZW50TGluZS5zbGljZSh0aGlzLm9mZnNldCkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maW5hbGl6ZShjb250YWluZXIsIHRoaXMubGluZU51bWJlcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9mZnNldCA8IGxuLmxlbmd0aCAmJiAhdGhpcy5ibGFuaykge1xuICAgICAgICAgICAgLy8gY3JlYXRlIHBhcmFncmFwaCBjb250YWluZXIgZm9yIGxpbmVcbiAgICAgICAgICAgIGNvbnRhaW5lciA9IHRoaXMuYWRkQ2hpbGQoJ3BhcmFncmFwaCcsIHRoaXMub2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMuYWR2YW5jZU5leHROb25zcGFjZSgpO1xuICAgICAgICAgICAgdGhpcy5hZGRMaW5lKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sYXN0TGluZUxlbmd0aCA9IGxuLmxlbmd0aDtcbn07XG5cbi8vIEZpbmFsaXplIGEgYmxvY2suICBDbG9zZSBpdCBhbmQgZG8gYW55IG5lY2Vzc2FyeSBwb3N0cHJvY2Vzc2luZyxcbi8vIGUuZy4gY3JlYXRpbmcgc3RyaW5nX2NvbnRlbnQgZnJvbSBzdHJpbmdzLCBzZXR0aW5nIHRoZSAndGlnaHQnXG4vLyBvciAnbG9vc2UnIHN0YXR1cyBvZiBhIGxpc3QsIGFuZCBwYXJzaW5nIHRoZSBiZWdpbm5pbmdzXG4vLyBvZiBwYXJhZ3JhcGhzIGZvciByZWZlcmVuY2UgZGVmaW5pdGlvbnMuICBSZXNldCB0aGUgdGlwIHRvIHRoZVxuLy8gcGFyZW50IG9mIHRoZSBjbG9zZWQgYmxvY2suXG52YXIgZmluYWxpemUgPSBmdW5jdGlvbihibG9jaywgbGluZU51bWJlcikge1xuICAgIHZhciBhYm92ZSA9IGJsb2NrLl9wYXJlbnQ7XG4gICAgYmxvY2suX29wZW4gPSBmYWxzZTtcbiAgICBibG9jay5zb3VyY2Vwb3NbMV0gPSBbbGluZU51bWJlciwgdGhpcy5sYXN0TGluZUxlbmd0aF07XG5cbiAgICB0aGlzLmJsb2Nrc1tibG9jay50eXBlXS5maW5hbGl6ZSh0aGlzLCBibG9jayk7XG5cbiAgICB0aGlzLnRpcCA9IGFib3ZlO1xufTtcblxuLy8gV2FsayB0aHJvdWdoIGEgYmxvY2sgJiBjaGlsZHJlbiByZWN1cnNpdmVseSwgcGFyc2luZyBzdHJpbmcgY29udGVudFxuLy8gaW50byBpbmxpbmUgY29udGVudCB3aGVyZSBhcHByb3ByaWF0ZS5cbnZhciBwcm9jZXNzSW5saW5lcyA9IGZ1bmN0aW9uKGJsb2NrKSB7XG4gICAgdmFyIG5vZGUsIGV2ZW50LCB0O1xuICAgIHZhciB3YWxrZXIgPSBibG9jay53YWxrZXIoKTtcbiAgICB0aGlzLmlubGluZVBhcnNlci5yZWZtYXAgPSB0aGlzLnJlZm1hcDtcbiAgICB0aGlzLmlubGluZVBhcnNlci5vcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIHdoaWxlICgoZXZlbnQgPSB3YWxrZXIubmV4dCgpKSkge1xuICAgICAgICBub2RlID0gZXZlbnQubm9kZTtcbiAgICAgICAgdCA9IG5vZGUudHlwZTtcbiAgICAgICAgaWYgKCFldmVudC5lbnRlcmluZyAmJiAodCA9PT0gJ3BhcmFncmFwaCcgfHwgdCA9PT0gJ2hlYWRpbmcnKSkge1xuICAgICAgICAgICAgdGhpcy5pbmxpbmVQYXJzZXIucGFyc2Uobm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG52YXIgRG9jdW1lbnQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZG9jID0gbmV3IE5vZGUoJ2RvY3VtZW50JywgW1sxLCAxXSwgWzAsIDBdXSk7XG4gICAgcmV0dXJuIGRvYztcbn07XG5cbi8vIFRoZSBtYWluIHBhcnNpbmcgZnVuY3Rpb24uICBSZXR1cm5zIGEgcGFyc2VkIGRvY3VtZW50IEFTVC5cbnZhciBwYXJzZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgdGhpcy5kb2MgPSBuZXcgRG9jdW1lbnQoKTtcbiAgICB0aGlzLnRpcCA9IHRoaXMuZG9jO1xuICAgIHRoaXMucmVmbWFwID0ge307XG4gICAgdGhpcy5saW5lTnVtYmVyID0gMDtcbiAgICB0aGlzLmxhc3RMaW5lTGVuZ3RoID0gMDtcbiAgICB0aGlzLm9mZnNldCA9IDA7XG4gICAgdGhpcy5jb2x1bW4gPSAwO1xuICAgIHRoaXMubGFzdE1hdGNoZWRDb250YWluZXIgPSB0aGlzLmRvYztcbiAgICB0aGlzLmN1cnJlbnRMaW5lID0gXCJcIjtcbiAgICBpZiAodGhpcy5vcHRpb25zLnRpbWUpIHsgY29uc29sZS50aW1lKFwicHJlcGFyaW5nIGlucHV0XCIpOyB9XG4gICAgdmFyIGxpbmVzID0gaW5wdXQuc3BsaXQocmVMaW5lRW5kaW5nKTtcbiAgICB2YXIgbGVuID0gbGluZXMubGVuZ3RoO1xuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KGlucHV0Lmxlbmd0aCAtIDEpID09PSBDX05FV0xJTkUpIHtcbiAgICAgICAgLy8gaWdub3JlIGxhc3QgYmxhbmsgbGluZSBjcmVhdGVkIGJ5IGZpbmFsIG5ld2xpbmVcbiAgICAgICAgbGVuIC09IDE7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMudGltZSkgeyBjb25zb2xlLnRpbWVFbmQoXCJwcmVwYXJpbmcgaW5wdXRcIik7IH1cbiAgICBpZiAodGhpcy5vcHRpb25zLnRpbWUpIHsgY29uc29sZS50aW1lKFwiYmxvY2sgcGFyc2luZ1wiKTsgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdGhpcy5pbmNvcnBvcmF0ZUxpbmUobGluZXNbaV0pO1xuICAgIH1cbiAgICB3aGlsZSAodGhpcy50aXApIHtcbiAgICAgICAgdGhpcy5maW5hbGl6ZSh0aGlzLnRpcCwgbGVuKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucy50aW1lKSB7IGNvbnNvbGUudGltZUVuZChcImJsb2NrIHBhcnNpbmdcIik7IH1cbiAgICBpZiAodGhpcy5vcHRpb25zLnRpbWUpIHsgY29uc29sZS50aW1lKFwiaW5saW5lIHBhcnNpbmdcIik7IH1cbiAgICB0aGlzLnByb2Nlc3NJbmxpbmVzKHRoaXMuZG9jKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLnRpbWUpIHsgY29uc29sZS50aW1lRW5kKFwiaW5saW5lIHBhcnNpbmdcIik7IH1cbiAgICByZXR1cm4gdGhpcy5kb2M7XG59O1xuXG5cbi8vIFRoZSBQYXJzZXIgb2JqZWN0LlxuZnVuY3Rpb24gUGFyc2VyKG9wdGlvbnMpe1xuICAgIHJldHVybiB7XG4gICAgICAgIGRvYzogbmV3IERvY3VtZW50KCksXG4gICAgICAgIGJsb2NrczogYmxvY2tzLFxuICAgICAgICBibG9ja1N0YXJ0czogYmxvY2tTdGFydHMsXG4gICAgICAgIHRpcDogdGhpcy5kb2MsXG4gICAgICAgIG9sZHRpcDogdGhpcy5kb2MsXG4gICAgICAgIGN1cnJlbnRMaW5lOiBcIlwiLFxuICAgICAgICBsaW5lTnVtYmVyOiAwLFxuICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgIGNvbHVtbjogMCxcbiAgICAgICAgbmV4dE5vbnNwYWNlOiAwLFxuICAgICAgICBuZXh0Tm9uc3BhY2VDb2x1bW46IDAsXG4gICAgICAgIGluZGVudDogMCxcbiAgICAgICAgaW5kZW50ZWQ6IGZhbHNlLFxuICAgICAgICBibGFuazogZmFsc2UsXG4gICAgICAgIHBhcnRpYWxseUNvbnN1bWVkVGFiOiBmYWxzZSxcbiAgICAgICAgYWxsQ2xvc2VkOiB0cnVlLFxuICAgICAgICBsYXN0TWF0Y2hlZENvbnRhaW5lcjogdGhpcy5kb2MsXG4gICAgICAgIHJlZm1hcDoge30sXG4gICAgICAgIGxhc3RMaW5lTGVuZ3RoOiAwLFxuICAgICAgICBpbmxpbmVQYXJzZXI6IG5ldyBJbmxpbmVQYXJzZXIob3B0aW9ucyksXG4gICAgICAgIGZpbmROZXh0Tm9uc3BhY2U6IGZpbmROZXh0Tm9uc3BhY2UsXG4gICAgICAgIGFkdmFuY2VPZmZzZXQ6IGFkdmFuY2VPZmZzZXQsXG4gICAgICAgIGFkdmFuY2VOZXh0Tm9uc3BhY2U6IGFkdmFuY2VOZXh0Tm9uc3BhY2UsXG4gICAgICAgIGFkZExpbmU6IGFkZExpbmUsXG4gICAgICAgIGFkZENoaWxkOiBhZGRDaGlsZCxcbiAgICAgICAgaW5jb3Jwb3JhdGVMaW5lOiBpbmNvcnBvcmF0ZUxpbmUsXG4gICAgICAgIGZpbmFsaXplOiBmaW5hbGl6ZSxcbiAgICAgICAgcHJvY2Vzc0lubGluZXM6IHByb2Nlc3NJbmxpbmVzLFxuICAgICAgICBjbG9zZVVubWF0Y2hlZEJsb2NrczogY2xvc2VVbm1hdGNoZWRCbG9ja3MsXG4gICAgICAgIHBhcnNlOiBwYXJzZSxcbiAgICAgICAgb3B0aW9uczogb3B0aW9ucyB8fCB7fVxuICAgIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUGFyc2VyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvbW1vbm1hcmsvbGliL2Jsb2Nrcy5qc1xuLy8gbW9kdWxlIGlkID0gNDE0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 415 */
/***/ function(module, exports, __webpack_require__) {

    eval("\"use strict\";\n\nvar encode = __webpack_require__(416);\nvar decode = __webpack_require__(417);\n\nvar C_BACKSLASH = 92;\n\nvar decodeHTML = __webpack_require__(418).decodeHTML;\n\nvar ENTITY = \"&(?:#x[a-f0-9]{1,8}|#[0-9]{1,8}|[a-z][a-z0-9]{1,31});\";\n\nvar TAGNAME = '[A-Za-z][A-Za-z0-9-]*';\nvar ATTRIBUTENAME = '[a-zA-Z_:][a-zA-Z0-9:._-]*';\nvar UNQUOTEDVALUE = \"[^\\\"'=<>`\\\\x00-\\\\x20]+\";\nvar SINGLEQUOTEDVALUE = \"'[^']*'\";\nvar DOUBLEQUOTEDVALUE = '\"[^\"]*\"';\nvar ATTRIBUTEVALUE = \"(?:\" + UNQUOTEDVALUE + \"|\" + SINGLEQUOTEDVALUE + \"|\" + DOUBLEQUOTEDVALUE + \")\";\nvar ATTRIBUTEVALUESPEC = \"(?:\" + \"\\\\s*=\" + \"\\\\s*\" + ATTRIBUTEVALUE + \")\";\nvar ATTRIBUTE = \"(?:\" + \"\\\\s+\" + ATTRIBUTENAME + ATTRIBUTEVALUESPEC + \"?)\";\nvar OPENTAG = \"<\" + TAGNAME + ATTRIBUTE + \"*\" + \"\\\\s*/?>\";\nvar CLOSETAG = \"</\" + TAGNAME + \"\\\\s*[>]\";\nvar HTMLCOMMENT = \"<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->\";\nvar PROCESSINGINSTRUCTION = \"[<][?].*?[?][>]\";\nvar DECLARATION = \"<![A-Z]+\" + \"\\\\s+[^>]*>\";\nvar CDATA = \"<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>\";\nvar HTMLTAG = \"(?:\" + OPENTAG + \"|\" + CLOSETAG + \"|\" + HTMLCOMMENT + \"|\" +\n        PROCESSINGINSTRUCTION + \"|\" + DECLARATION + \"|\" + CDATA + \")\";\nvar reHtmlTag = new RegExp('^' + HTMLTAG, 'i');\n\nvar reBackslashOrAmp = /[\\\\&]/;\n\nvar ESCAPABLE = '[!\"#$%&\\'()*+,./:;<=>?@[\\\\\\\\\\\\]^_`{|}~-]';\n\nvar reEntityOrEscapedChar = new RegExp('\\\\\\\\' + ESCAPABLE + '|' + ENTITY, 'gi');\n\nvar XMLSPECIAL = '[&<>\"]';\n\nvar reXmlSpecial = new RegExp(XMLSPECIAL, 'g');\n\nvar reXmlSpecialOrEntity = new RegExp(ENTITY + '|' + XMLSPECIAL, 'gi');\n\nvar unescapeChar = function(s) {\n    if (s.charCodeAt(0) === C_BACKSLASH) {\n        return s.charAt(1);\n    } else {\n        return decodeHTML(s);\n    }\n};\n\n// Replace entities and backslash escapes with literal characters.\nvar unescapeString = function(s) {\n    if (reBackslashOrAmp.test(s)) {\n        return s.replace(reEntityOrEscapedChar, unescapeChar);\n    } else {\n        return s;\n    }\n};\n\nvar normalizeURI = function(uri) {\n    try {\n        return encode(decode(uri));\n    }\n    catch(err) {\n        return uri;\n    }\n};\n\nvar replaceUnsafeChar = function(s) {\n    switch (s) {\n    case '&':\n        return '&amp;';\n    case '<':\n        return '&lt;';\n    case '>':\n        return '&gt;';\n    case '\"':\n        return '&quot;';\n    default:\n        return s;\n    }\n};\n\nvar escapeXml = function(s, preserve_entities) {\n    if (reXmlSpecial.test(s)) {\n        if (preserve_entities) {\n            return s.replace(reXmlSpecialOrEntity, replaceUnsafeChar);\n        } else {\n            return s.replace(reXmlSpecial, replaceUnsafeChar);\n        }\n    } else {\n        return s;\n    }\n};\n\nmodule.exports = { unescapeString: unescapeString,\n                   normalizeURI: normalizeURI,\n                   escapeXml: escapeXml,\n                   reHtmlTag: reHtmlTag,\n                   OPENTAG: OPENTAG,\n                   CLOSETAG: CLOSETAG,\n                   ENTITY: ENTITY,\n                   ESCAPABLE: ESCAPABLE\n                 };\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9jb21tb25tYXJrL2xpYi9jb21tb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBlbmNvZGUgPSByZXF1aXJlKCdtZHVybC9lbmNvZGUnKTtcbnZhciBkZWNvZGUgPSByZXF1aXJlKCdtZHVybC9kZWNvZGUnKTtcblxudmFyIENfQkFDS1NMQVNIID0gOTI7XG5cbnZhciBkZWNvZGVIVE1MID0gcmVxdWlyZSgnZW50aXRpZXMnKS5kZWNvZGVIVE1MO1xuXG52YXIgRU5USVRZID0gXCImKD86I3hbYS1mMC05XXsxLDh9fCNbMC05XXsxLDh9fFthLXpdW2EtejAtOV17MSwzMX0pO1wiO1xuXG52YXIgVEFHTkFNRSA9ICdbQS1aYS16XVtBLVphLXowLTktXSonO1xudmFyIEFUVFJJQlVURU5BTUUgPSAnW2EtekEtWl86XVthLXpBLVowLTk6Ll8tXSonO1xudmFyIFVOUVVPVEVEVkFMVUUgPSBcIlteXFxcIic9PD5gXFxcXHgwMC1cXFxceDIwXStcIjtcbnZhciBTSU5HTEVRVU9URURWQUxVRSA9IFwiJ1teJ10qJ1wiO1xudmFyIERPVUJMRVFVT1RFRFZBTFVFID0gJ1wiW15cIl0qXCInO1xudmFyIEFUVFJJQlVURVZBTFVFID0gXCIoPzpcIiArIFVOUVVPVEVEVkFMVUUgKyBcInxcIiArIFNJTkdMRVFVT1RFRFZBTFVFICsgXCJ8XCIgKyBET1VCTEVRVU9URURWQUxVRSArIFwiKVwiO1xudmFyIEFUVFJJQlVURVZBTFVFU1BFQyA9IFwiKD86XCIgKyBcIlxcXFxzKj1cIiArIFwiXFxcXHMqXCIgKyBBVFRSSUJVVEVWQUxVRSArIFwiKVwiO1xudmFyIEFUVFJJQlVURSA9IFwiKD86XCIgKyBcIlxcXFxzK1wiICsgQVRUUklCVVRFTkFNRSArIEFUVFJJQlVURVZBTFVFU1BFQyArIFwiPylcIjtcbnZhciBPUEVOVEFHID0gXCI8XCIgKyBUQUdOQU1FICsgQVRUUklCVVRFICsgXCIqXCIgKyBcIlxcXFxzKi8/PlwiO1xudmFyIENMT1NFVEFHID0gXCI8L1wiICsgVEFHTkFNRSArIFwiXFxcXHMqWz5dXCI7XG52YXIgSFRNTENPTU1FTlQgPSBcIjwhLS0tLT58PCEtLSg/Oi0/W14+LV0pKD86LT9bXi1dKSotLT5cIjtcbnZhciBQUk9DRVNTSU5HSU5TVFJVQ1RJT04gPSBcIls8XVs/XS4qP1s/XVs+XVwiO1xudmFyIERFQ0xBUkFUSU9OID0gXCI8IVtBLVpdK1wiICsgXCJcXFxccytbXj5dKj5cIjtcbnZhciBDREFUQSA9IFwiPCFcXFxcW0NEQVRBXFxcXFtbXFxcXHNcXFxcU10qP1xcXFxdXFxcXF0+XCI7XG52YXIgSFRNTFRBRyA9IFwiKD86XCIgKyBPUEVOVEFHICsgXCJ8XCIgKyBDTE9TRVRBRyArIFwifFwiICsgSFRNTENPTU1FTlQgKyBcInxcIiArXG4gICAgICAgIFBST0NFU1NJTkdJTlNUUlVDVElPTiArIFwifFwiICsgREVDTEFSQVRJT04gKyBcInxcIiArIENEQVRBICsgXCIpXCI7XG52YXIgcmVIdG1sVGFnID0gbmV3IFJlZ0V4cCgnXicgKyBIVE1MVEFHLCAnaScpO1xuXG52YXIgcmVCYWNrc2xhc2hPckFtcCA9IC9bXFxcXCZdLztcblxudmFyIEVTQ0FQQUJMRSA9ICdbIVwiIyQlJlxcJygpKissLi86Ozw9Pj9AW1xcXFxcXFxcXFxcXF1eX2B7fH1+LV0nO1xuXG52YXIgcmVFbnRpdHlPckVzY2FwZWRDaGFyID0gbmV3IFJlZ0V4cCgnXFxcXFxcXFwnICsgRVNDQVBBQkxFICsgJ3wnICsgRU5USVRZLCAnZ2knKTtcblxudmFyIFhNTFNQRUNJQUwgPSAnWyY8PlwiXSc7XG5cbnZhciByZVhtbFNwZWNpYWwgPSBuZXcgUmVnRXhwKFhNTFNQRUNJQUwsICdnJyk7XG5cbnZhciByZVhtbFNwZWNpYWxPckVudGl0eSA9IG5ldyBSZWdFeHAoRU5USVRZICsgJ3wnICsgWE1MU1BFQ0lBTCwgJ2dpJyk7XG5cbnZhciB1bmVzY2FwZUNoYXIgPSBmdW5jdGlvbihzKSB7XG4gICAgaWYgKHMuY2hhckNvZGVBdCgwKSA9PT0gQ19CQUNLU0xBU0gpIHtcbiAgICAgICAgcmV0dXJuIHMuY2hhckF0KDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVIVE1MKHMpO1xuICAgIH1cbn07XG5cbi8vIFJlcGxhY2UgZW50aXRpZXMgYW5kIGJhY2tzbGFzaCBlc2NhcGVzIHdpdGggbGl0ZXJhbCBjaGFyYWN0ZXJzLlxudmFyIHVuZXNjYXBlU3RyaW5nID0gZnVuY3Rpb24ocykge1xuICAgIGlmIChyZUJhY2tzbGFzaE9yQW1wLnRlc3QocykpIHtcbiAgICAgICAgcmV0dXJuIHMucmVwbGFjZShyZUVudGl0eU9yRXNjYXBlZENoYXIsIHVuZXNjYXBlQ2hhcik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfVxufTtcblxudmFyIG5vcm1hbGl6ZVVSSSA9IGZ1bmN0aW9uKHVyaSkge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBlbmNvZGUoZGVjb2RlKHVyaSkpO1xuICAgIH1cbiAgICBjYXRjaChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHVyaTtcbiAgICB9XG59O1xuXG52YXIgcmVwbGFjZVVuc2FmZUNoYXIgPSBmdW5jdGlvbihzKSB7XG4gICAgc3dpdGNoIChzKSB7XG4gICAgY2FzZSAnJic6XG4gICAgICAgIHJldHVybiAnJmFtcDsnO1xuICAgIGNhc2UgJzwnOlxuICAgICAgICByZXR1cm4gJyZsdDsnO1xuICAgIGNhc2UgJz4nOlxuICAgICAgICByZXR1cm4gJyZndDsnO1xuICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgcmV0dXJuICcmcXVvdDsnO1xuICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBzO1xuICAgIH1cbn07XG5cbnZhciBlc2NhcGVYbWwgPSBmdW5jdGlvbihzLCBwcmVzZXJ2ZV9lbnRpdGllcykge1xuICAgIGlmIChyZVhtbFNwZWNpYWwudGVzdChzKSkge1xuICAgICAgICBpZiAocHJlc2VydmVfZW50aXRpZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBzLnJlcGxhY2UocmVYbWxTcGVjaWFsT3JFbnRpdHksIHJlcGxhY2VVbnNhZmVDaGFyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzLnJlcGxhY2UocmVYbWxTcGVjaWFsLCByZXBsYWNlVW5zYWZlQ2hhcik7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcztcbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHsgdW5lc2NhcGVTdHJpbmc6IHVuZXNjYXBlU3RyaW5nLFxuICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZVVSSTogbm9ybWFsaXplVVJJLFxuICAgICAgICAgICAgICAgICAgIGVzY2FwZVhtbDogZXNjYXBlWG1sLFxuICAgICAgICAgICAgICAgICAgIHJlSHRtbFRhZzogcmVIdG1sVGFnLFxuICAgICAgICAgICAgICAgICAgIE9QRU5UQUc6IE9QRU5UQUcsXG4gICAgICAgICAgICAgICAgICAgQ0xPU0VUQUc6IENMT1NFVEFHLFxuICAgICAgICAgICAgICAgICAgIEVOVElUWTogRU5USVRZLFxuICAgICAgICAgICAgICAgICAgIEVTQ0FQQUJMRTogRVNDQVBBQkxFXG4gICAgICAgICAgICAgICAgIH07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29tbW9ubWFyay9saWIvY29tbW9uLmpzXG4vLyBtb2R1bGUgaWQgPSA0MTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 416 */
/***/ function(module, exports) {

    eval("\n'use strict';\n\n\nvar encodeCache = {};\n\n\n// Create a lookup array where anything but characters in `chars` string\n// and alphanumeric chars is percent-encoded.\n//\nfunction getEncodeCache(exclude) {\n  var i, ch, cache = encodeCache[exclude];\n  if (cache) { return cache; }\n\n  cache = encodeCache[exclude] = [];\n\n  for (i = 0; i < 128; i++) {\n    ch = String.fromCharCode(i);\n\n    if (/^[0-9a-z]$/i.test(ch)) {\n      // always allow unencoded alphanumeric characters\n      cache.push(ch);\n    } else {\n      cache.push('%' + ('0' + i.toString(16).toUpperCase()).slice(-2));\n    }\n  }\n\n  for (i = 0; i < exclude.length; i++) {\n    cache[exclude.charCodeAt(i)] = exclude[i];\n  }\n\n  return cache;\n}\n\n\n// Encode unsafe characters with percent-encoding, skipping already\n// encoded sequences.\n//\n//  - string       - string to encode\n//  - exclude      - list of characters to ignore (in addition to a-zA-Z0-9)\n//  - keepEscaped  - don't encode '%' in a correct escape sequence (default: true)\n//\nfunction encode(string, exclude, keepEscaped) {\n  var i, l, code, nextCode, cache,\n      result = '';\n\n  if (typeof exclude !== 'string') {\n    // encode(string, keepEscaped)\n    keepEscaped  = exclude;\n    exclude = encode.defaultChars;\n  }\n\n  if (typeof keepEscaped === 'undefined') {\n    keepEscaped = true;\n  }\n\n  cache = getEncodeCache(exclude);\n\n  for (i = 0, l = string.length; i < l; i++) {\n    code = string.charCodeAt(i);\n\n    if (keepEscaped && code === 0x25 /* % */ && i + 2 < l) {\n      if (/^[0-9a-f]{2}$/i.test(string.slice(i + 1, i + 3))) {\n        result += string.slice(i, i + 3);\n        i += 2;\n        continue;\n      }\n    }\n\n    if (code < 128) {\n      result += cache[code];\n      continue;\n    }\n\n    if (code >= 0xD800 && code <= 0xDFFF) {\n      if (code >= 0xD800 && code <= 0xDBFF && i + 1 < l) {\n        nextCode = string.charCodeAt(i + 1);\n        if (nextCode >= 0xDC00 && nextCode <= 0xDFFF) {\n          result += encodeURIComponent(string[i] + string[i + 1]);\n          i++;\n          continue;\n        }\n      }\n      result += '%EF%BF%BD';\n      continue;\n    }\n\n    result += encodeURIComponent(string[i]);\n  }\n\n  return result;\n}\n\nencode.defaultChars   = \";/?:@&=+$,-_.!~*'()#\";\nencode.componentChars = \"-_.!~*'()\";\n\n\nmodule.exports = encode;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9tZHVybC9lbmNvZGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIGVuY29kZUNhY2hlID0ge307XG5cblxuLy8gQ3JlYXRlIGEgbG9va3VwIGFycmF5IHdoZXJlIGFueXRoaW5nIGJ1dCBjaGFyYWN0ZXJzIGluIGBjaGFyc2Agc3RyaW5nXG4vLyBhbmQgYWxwaGFudW1lcmljIGNoYXJzIGlzIHBlcmNlbnQtZW5jb2RlZC5cbi8vXG5mdW5jdGlvbiBnZXRFbmNvZGVDYWNoZShleGNsdWRlKSB7XG4gIHZhciBpLCBjaCwgY2FjaGUgPSBlbmNvZGVDYWNoZVtleGNsdWRlXTtcbiAgaWYgKGNhY2hlKSB7IHJldHVybiBjYWNoZTsgfVxuXG4gIGNhY2hlID0gZW5jb2RlQ2FjaGVbZXhjbHVkZV0gPSBbXTtcblxuICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHtcbiAgICBjaCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoaSk7XG5cbiAgICBpZiAoL15bMC05YS16XSQvaS50ZXN0KGNoKSkge1xuICAgICAgLy8gYWx3YXlzIGFsbG93IHVuZW5jb2RlZCBhbHBoYW51bWVyaWMgY2hhcmFjdGVyc1xuICAgICAgY2FjaGUucHVzaChjaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhY2hlLnB1c2goJyUnICsgKCcwJyArIGkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkpLnNsaWNlKC0yKSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IGV4Y2x1ZGUubGVuZ3RoOyBpKyspIHtcbiAgICBjYWNoZVtleGNsdWRlLmNoYXJDb2RlQXQoaSldID0gZXhjbHVkZVtpXTtcbiAgfVxuXG4gIHJldHVybiBjYWNoZTtcbn1cblxuXG4vLyBFbmNvZGUgdW5zYWZlIGNoYXJhY3RlcnMgd2l0aCBwZXJjZW50LWVuY29kaW5nLCBza2lwcGluZyBhbHJlYWR5XG4vLyBlbmNvZGVkIHNlcXVlbmNlcy5cbi8vXG4vLyAgLSBzdHJpbmcgICAgICAgLSBzdHJpbmcgdG8gZW5jb2RlXG4vLyAgLSBleGNsdWRlICAgICAgLSBsaXN0IG9mIGNoYXJhY3RlcnMgdG8gaWdub3JlIChpbiBhZGRpdGlvbiB0byBhLXpBLVowLTkpXG4vLyAgLSBrZWVwRXNjYXBlZCAgLSBkb24ndCBlbmNvZGUgJyUnIGluIGEgY29ycmVjdCBlc2NhcGUgc2VxdWVuY2UgKGRlZmF1bHQ6IHRydWUpXG4vL1xuZnVuY3Rpb24gZW5jb2RlKHN0cmluZywgZXhjbHVkZSwga2VlcEVzY2FwZWQpIHtcbiAgdmFyIGksIGwsIGNvZGUsIG5leHRDb2RlLCBjYWNoZSxcbiAgICAgIHJlc3VsdCA9ICcnO1xuXG4gIGlmICh0eXBlb2YgZXhjbHVkZSAhPT0gJ3N0cmluZycpIHtcbiAgICAvLyBlbmNvZGUoc3RyaW5nLCBrZWVwRXNjYXBlZClcbiAgICBrZWVwRXNjYXBlZCAgPSBleGNsdWRlO1xuICAgIGV4Y2x1ZGUgPSBlbmNvZGUuZGVmYXVsdENoYXJzO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZWVwRXNjYXBlZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBrZWVwRXNjYXBlZCA9IHRydWU7XG4gIH1cblxuICBjYWNoZSA9IGdldEVuY29kZUNhY2hlKGV4Y2x1ZGUpO1xuXG4gIGZvciAoaSA9IDAsIGwgPSBzdHJpbmcubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgY29kZSA9IHN0cmluZy5jaGFyQ29kZUF0KGkpO1xuXG4gICAgaWYgKGtlZXBFc2NhcGVkICYmIGNvZGUgPT09IDB4MjUgLyogJSAqLyAmJiBpICsgMiA8IGwpIHtcbiAgICAgIGlmICgvXlswLTlhLWZdezJ9JC9pLnRlc3Qoc3RyaW5nLnNsaWNlKGkgKyAxLCBpICsgMykpKSB7XG4gICAgICAgIHJlc3VsdCArPSBzdHJpbmcuc2xpY2UoaSwgaSArIDMpO1xuICAgICAgICBpICs9IDI7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlIDwgMTI4KSB7XG4gICAgICByZXN1bHQgKz0gY2FjaGVbY29kZV07XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY29kZSA+PSAweEQ4MDAgJiYgY29kZSA8PSAweERGRkYpIHtcbiAgICAgIGlmIChjb2RlID49IDB4RDgwMCAmJiBjb2RlIDw9IDB4REJGRiAmJiBpICsgMSA8IGwpIHtcbiAgICAgICAgbmV4dENvZGUgPSBzdHJpbmcuY2hhckNvZGVBdChpICsgMSk7XG4gICAgICAgIGlmIChuZXh0Q29kZSA+PSAweERDMDAgJiYgbmV4dENvZGUgPD0gMHhERkZGKSB7XG4gICAgICAgICAgcmVzdWx0ICs9IGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdbaV0gKyBzdHJpbmdbaSArIDFdKTtcbiAgICAgICAgICBpKys7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlc3VsdCArPSAnJUVGJUJGJUJEJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJlc3VsdCArPSBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5nW2ldKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmVuY29kZS5kZWZhdWx0Q2hhcnMgICA9IFwiOy8/OkAmPSskLC1fLiF+KicoKSNcIjtcbmVuY29kZS5jb21wb25lbnRDaGFycyA9IFwiLV8uIX4qJygpXCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBlbmNvZGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbWR1cmwvZW5jb2RlLmpzXG4vLyBtb2R1bGUgaWQgPSA0MTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 417 */
/***/ function(module, exports) {

    eval("\n'use strict';\n\n\n/* eslint-disable no-bitwise */\n\nvar decodeCache = {};\n\nfunction getDecodeCache(exclude) {\n  var i, ch, cache = decodeCache[exclude];\n  if (cache) { return cache; }\n\n  cache = decodeCache[exclude] = [];\n\n  for (i = 0; i < 128; i++) {\n    ch = String.fromCharCode(i);\n    cache.push(ch);\n  }\n\n  for (i = 0; i < exclude.length; i++) {\n    ch = exclude.charCodeAt(i);\n    cache[ch] = '%' + ('0' + ch.toString(16).toUpperCase()).slice(-2);\n  }\n\n  return cache;\n}\n\n\n// Decode percent-encoded string.\n//\nfunction decode(string, exclude) {\n  var cache;\n\n  if (typeof exclude !== 'string') {\n    exclude = decode.defaultChars;\n  }\n\n  cache = getDecodeCache(exclude);\n\n  return string.replace(/(%[a-f0-9]{2})+/gi, function(seq) {\n    var i, l, b1, b2, b3, b4, chr,\n        result = '';\n\n    for (i = 0, l = seq.length; i < l; i += 3) {\n      b1 = parseInt(seq.slice(i + 1, i + 3), 16);\n\n      if (b1 < 0x80) {\n        result += cache[b1];\n        continue;\n      }\n\n      if ((b1 & 0xE0) === 0xC0 && (i + 3 < l)) {\n        // 110xxxxx 10xxxxxx\n        b2 = parseInt(seq.slice(i + 4, i + 6), 16);\n\n        if ((b2 & 0xC0) === 0x80) {\n          chr = ((b1 << 6) & 0x7C0) | (b2 & 0x3F);\n\n          if (chr < 0x80) {\n            result += '\\ufffd\\ufffd';\n          } else {\n            result += String.fromCharCode(chr);\n          }\n\n          i += 3;\n          continue;\n        }\n      }\n\n      if ((b1 & 0xF0) === 0xE0 && (i + 6 < l)) {\n        // 1110xxxx 10xxxxxx 10xxxxxx\n        b2 = parseInt(seq.slice(i + 4, i + 6), 16);\n        b3 = parseInt(seq.slice(i + 7, i + 9), 16);\n\n        if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {\n          chr = ((b1 << 12) & 0xF000) | ((b2 << 6) & 0xFC0) | (b3 & 0x3F);\n\n          if (chr < 0x800 || (chr >= 0xD800 && chr <= 0xDFFF)) {\n            result += '\\ufffd\\ufffd\\ufffd';\n          } else {\n            result += String.fromCharCode(chr);\n          }\n\n          i += 6;\n          continue;\n        }\n      }\n\n      if ((b1 & 0xF8) === 0xF0 && (i + 9 < l)) {\n        // 111110xx 10xxxxxx 10xxxxxx 10xxxxxx\n        b2 = parseInt(seq.slice(i + 4, i + 6), 16);\n        b3 = parseInt(seq.slice(i + 7, i + 9), 16);\n        b4 = parseInt(seq.slice(i + 10, i + 12), 16);\n\n        if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80 && (b4 & 0xC0) === 0x80) {\n          chr = ((b1 << 18) & 0x1C0000) | ((b2 << 12) & 0x3F000) | ((b3 << 6) & 0xFC0) | (b4 & 0x3F);\n\n          if (chr < 0x10000 || chr > 0x10FFFF) {\n            result += '\\ufffd\\ufffd\\ufffd\\ufffd';\n          } else {\n            chr -= 0x10000;\n            result += String.fromCharCode(0xD800 + (chr >> 10), 0xDC00 + (chr & 0x3FF));\n          }\n\n          i += 9;\n          continue;\n        }\n      }\n\n      result += '\\ufffd';\n    }\n\n    return result;\n  });\n}\n\n\ndecode.defaultChars   = ';/?:@&=+$,#';\ndecode.componentChars = '';\n\n\nmodule.exports = decode;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9tZHVybC9kZWNvZGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXG4ndXNlIHN0cmljdCc7XG5cblxuLyogZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSAqL1xuXG52YXIgZGVjb2RlQ2FjaGUgPSB7fTtcblxuZnVuY3Rpb24gZ2V0RGVjb2RlQ2FjaGUoZXhjbHVkZSkge1xuICB2YXIgaSwgY2gsIGNhY2hlID0gZGVjb2RlQ2FjaGVbZXhjbHVkZV07XG4gIGlmIChjYWNoZSkgeyByZXR1cm4gY2FjaGU7IH1cblxuICBjYWNoZSA9IGRlY29kZUNhY2hlW2V4Y2x1ZGVdID0gW107XG5cbiAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7XG4gICAgY2ggPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpO1xuICAgIGNhY2hlLnB1c2goY2gpO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IGV4Y2x1ZGUubGVuZ3RoOyBpKyspIHtcbiAgICBjaCA9IGV4Y2x1ZGUuY2hhckNvZGVBdChpKTtcbiAgICBjYWNoZVtjaF0gPSAnJScgKyAoJzAnICsgY2gudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkpLnNsaWNlKC0yKTtcbiAgfVxuXG4gIHJldHVybiBjYWNoZTtcbn1cblxuXG4vLyBEZWNvZGUgcGVyY2VudC1lbmNvZGVkIHN0cmluZy5cbi8vXG5mdW5jdGlvbiBkZWNvZGUoc3RyaW5nLCBleGNsdWRlKSB7XG4gIHZhciBjYWNoZTtcblxuICBpZiAodHlwZW9mIGV4Y2x1ZGUgIT09ICdzdHJpbmcnKSB7XG4gICAgZXhjbHVkZSA9IGRlY29kZS5kZWZhdWx0Q2hhcnM7XG4gIH1cblxuICBjYWNoZSA9IGdldERlY29kZUNhY2hlKGV4Y2x1ZGUpO1xuXG4gIHJldHVybiBzdHJpbmcucmVwbGFjZSgvKCVbYS1mMC05XXsyfSkrL2dpLCBmdW5jdGlvbihzZXEpIHtcbiAgICB2YXIgaSwgbCwgYjEsIGIyLCBiMywgYjQsIGNocixcbiAgICAgICAgcmVzdWx0ID0gJyc7XG5cbiAgICBmb3IgKGkgPSAwLCBsID0gc2VxLmxlbmd0aDsgaSA8IGw7IGkgKz0gMykge1xuICAgICAgYjEgPSBwYXJzZUludChzZXEuc2xpY2UoaSArIDEsIGkgKyAzKSwgMTYpO1xuXG4gICAgICBpZiAoYjEgPCAweDgwKSB7XG4gICAgICAgIHJlc3VsdCArPSBjYWNoZVtiMV07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoKGIxICYgMHhFMCkgPT09IDB4QzAgJiYgKGkgKyAzIDwgbCkpIHtcbiAgICAgICAgLy8gMTEweHh4eHggMTB4eHh4eHhcbiAgICAgICAgYjIgPSBwYXJzZUludChzZXEuc2xpY2UoaSArIDQsIGkgKyA2KSwgMTYpO1xuXG4gICAgICAgIGlmICgoYjIgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgIGNociA9ICgoYjEgPDwgNikgJiAweDdDMCkgfCAoYjIgJiAweDNGKTtcblxuICAgICAgICAgIGlmIChjaHIgPCAweDgwKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gJ1xcdWZmZmRcXHVmZmZkJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hyKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpICs9IDM7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKChiMSAmIDB4RjApID09PSAweEUwICYmIChpICsgNiA8IGwpKSB7XG4gICAgICAgIC8vIDExMTB4eHh4IDEweHh4eHh4IDEweHh4eHh4XG4gICAgICAgIGIyID0gcGFyc2VJbnQoc2VxLnNsaWNlKGkgKyA0LCBpICsgNiksIDE2KTtcbiAgICAgICAgYjMgPSBwYXJzZUludChzZXEuc2xpY2UoaSArIDcsIGkgKyA5KSwgMTYpO1xuXG4gICAgICAgIGlmICgoYjIgJiAweEMwKSA9PT0gMHg4MCAmJiAoYjMgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgIGNociA9ICgoYjEgPDwgMTIpICYgMHhGMDAwKSB8ICgoYjIgPDwgNikgJiAweEZDMCkgfCAoYjMgJiAweDNGKTtcblxuICAgICAgICAgIGlmIChjaHIgPCAweDgwMCB8fCAoY2hyID49IDB4RDgwMCAmJiBjaHIgPD0gMHhERkZGKSkge1xuICAgICAgICAgICAgcmVzdWx0ICs9ICdcXHVmZmZkXFx1ZmZmZFxcdWZmZmQnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaHIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGkgKz0gNjtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoKGIxICYgMHhGOCkgPT09IDB4RjAgJiYgKGkgKyA5IDwgbCkpIHtcbiAgICAgICAgLy8gMTExMTEweHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHhcbiAgICAgICAgYjIgPSBwYXJzZUludChzZXEuc2xpY2UoaSArIDQsIGkgKyA2KSwgMTYpO1xuICAgICAgICBiMyA9IHBhcnNlSW50KHNlcS5zbGljZShpICsgNywgaSArIDkpLCAxNik7XG4gICAgICAgIGI0ID0gcGFyc2VJbnQoc2VxLnNsaWNlKGkgKyAxMCwgaSArIDEyKSwgMTYpO1xuXG4gICAgICAgIGlmICgoYjIgJiAweEMwKSA9PT0gMHg4MCAmJiAoYjMgJiAweEMwKSA9PT0gMHg4MCAmJiAoYjQgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgIGNociA9ICgoYjEgPDwgMTgpICYgMHgxQzAwMDApIHwgKChiMiA8PCAxMikgJiAweDNGMDAwKSB8ICgoYjMgPDwgNikgJiAweEZDMCkgfCAoYjQgJiAweDNGKTtcblxuICAgICAgICAgIGlmIChjaHIgPCAweDEwMDAwIHx8IGNociA+IDB4MTBGRkZGKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gJ1xcdWZmZmRcXHVmZmZkXFx1ZmZmZFxcdWZmZmQnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaHIgLT0gMHgxMDAwMDtcbiAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RDgwMCArIChjaHIgPj4gMTApLCAweERDMDAgKyAoY2hyICYgMHgzRkYpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpICs9IDk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0ICs9ICdcXHVmZmZkJztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcbn1cblxuXG5kZWNvZGUuZGVmYXVsdENoYXJzICAgPSAnOy8/OkAmPSskLCMnO1xuZGVjb2RlLmNvbXBvbmVudENoYXJzID0gJyc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBkZWNvZGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbWR1cmwvZGVjb2RlLmpzXG4vLyBtb2R1bGUgaWQgPSA0MTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 418 */
/***/ function(module, exports, __webpack_require__) {

    eval("var encode = __webpack_require__(419),\n    decode = __webpack_require__(422);\n\nexports.decode = function(data, level){\n\treturn (!level || level <= 0 ? decode.XML : decode.HTML)(data);\n};\n\nexports.decodeStrict = function(data, level){\n\treturn (!level || level <= 0 ? decode.XML : decode.HTMLStrict)(data);\n};\n\nexports.encode = function(data, level){\n\treturn (!level || level <= 0 ? encode.XML : encode.HTML)(data);\n};\n\nexports.encodeXML = encode.XML;\n\nexports.encodeHTML4 =\nexports.encodeHTML5 =\nexports.encodeHTML  = encode.HTML;\n\nexports.decodeXML =\nexports.decodeXMLStrict = decode.XML;\n\nexports.decodeHTML4 =\nexports.decodeHTML5 =\nexports.decodeHTML = decode.HTML;\n\nexports.decodeHTML4Strict =\nexports.decodeHTML5Strict =\nexports.decodeHTMLStrict = decode.HTMLStrict;\n\nexports.escape = encode.escape;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbnRpdGllcy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZW5jb2RlID0gcmVxdWlyZShcIi4vbGliL2VuY29kZS5qc1wiKSxcbiAgICBkZWNvZGUgPSByZXF1aXJlKFwiLi9saWIvZGVjb2RlLmpzXCIpO1xuXG5leHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uKGRhdGEsIGxldmVsKXtcblx0cmV0dXJuICghbGV2ZWwgfHwgbGV2ZWwgPD0gMCA/IGRlY29kZS5YTUwgOiBkZWNvZGUuSFRNTCkoZGF0YSk7XG59O1xuXG5leHBvcnRzLmRlY29kZVN0cmljdCA9IGZ1bmN0aW9uKGRhdGEsIGxldmVsKXtcblx0cmV0dXJuICghbGV2ZWwgfHwgbGV2ZWwgPD0gMCA/IGRlY29kZS5YTUwgOiBkZWNvZGUuSFRNTFN0cmljdCkoZGF0YSk7XG59O1xuXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uKGRhdGEsIGxldmVsKXtcblx0cmV0dXJuICghbGV2ZWwgfHwgbGV2ZWwgPD0gMCA/IGVuY29kZS5YTUwgOiBlbmNvZGUuSFRNTCkoZGF0YSk7XG59O1xuXG5leHBvcnRzLmVuY29kZVhNTCA9IGVuY29kZS5YTUw7XG5cbmV4cG9ydHMuZW5jb2RlSFRNTDQgPVxuZXhwb3J0cy5lbmNvZGVIVE1MNSA9XG5leHBvcnRzLmVuY29kZUhUTUwgID0gZW5jb2RlLkhUTUw7XG5cbmV4cG9ydHMuZGVjb2RlWE1MID1cbmV4cG9ydHMuZGVjb2RlWE1MU3RyaWN0ID0gZGVjb2RlLlhNTDtcblxuZXhwb3J0cy5kZWNvZGVIVE1MNCA9XG5leHBvcnRzLmRlY29kZUhUTUw1ID1cbmV4cG9ydHMuZGVjb2RlSFRNTCA9IGRlY29kZS5IVE1MO1xuXG5leHBvcnRzLmRlY29kZUhUTUw0U3RyaWN0ID1cbmV4cG9ydHMuZGVjb2RlSFRNTDVTdHJpY3QgPVxuZXhwb3J0cy5kZWNvZGVIVE1MU3RyaWN0ID0gZGVjb2RlLkhUTUxTdHJpY3Q7XG5cbmV4cG9ydHMuZXNjYXBlID0gZW5jb2RlLmVzY2FwZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9lbnRpdGllcy9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNDE4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 419 */
/***/ function(module, exports, __webpack_require__) {

    eval("var inverseXML = getInverseObj(__webpack_require__(420)),\n    xmlReplacer = getInverseReplacer(inverseXML);\n\nexports.XML = getInverse(inverseXML, xmlReplacer);\n\nvar inverseHTML = getInverseObj(__webpack_require__(421)),\n    htmlReplacer = getInverseReplacer(inverseHTML);\n\nexports.HTML = getInverse(inverseHTML, htmlReplacer);\n\nfunction getInverseObj(obj){\n\treturn Object.keys(obj).sort().reduce(function(inverse, name){\n\t\tinverse[obj[name]] = \"&\" + name + \";\";\n\t\treturn inverse;\n\t}, {});\n}\n\nfunction getInverseReplacer(inverse){\n\tvar single = [],\n\t    multiple = [];\n\n\tObject.keys(inverse).forEach(function(k){\n\t\tif(k.length === 1){\n\t\t\tsingle.push(\"\\\\\" + k);\n\t\t} else {\n\t\t\tmultiple.push(k);\n\t\t}\n\t});\n\n\t//TODO add ranges\n\tmultiple.unshift(\"[\" + single.join(\"\") + \"]\");\n\n\treturn new RegExp(multiple.join(\"|\"), \"g\");\n}\n\nvar re_nonASCII = /[^\\0-\\x7F]/g,\n    re_astralSymbols = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n\nfunction singleCharReplacer(c){\n\treturn \"&#x\" + c.charCodeAt(0).toString(16).toUpperCase() + \";\";\n}\n\nfunction astralReplacer(c){\n\t// http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n\tvar high = c.charCodeAt(0);\n\tvar low  = c.charCodeAt(1);\n\tvar codePoint = (high - 0xD800) * 0x400 + low - 0xDC00 + 0x10000;\n\treturn \"&#x\" + codePoint.toString(16).toUpperCase() + \";\";\n}\n\nfunction getInverse(inverse, re){\n\tfunction func(name){\n\t\treturn inverse[name];\n\t}\n\n\treturn function(data){\n\t\treturn data\n\t\t\t\t.replace(re, func)\n\t\t\t\t.replace(re_astralSymbols, astralReplacer)\n\t\t\t\t.replace(re_nonASCII, singleCharReplacer);\n\t};\n}\n\nvar re_xmlChars = getInverseReplacer(inverseXML);\n\nfunction escapeXML(data){\n\treturn data\n\t\t\t.replace(re_xmlChars, singleCharReplacer)\n\t\t\t.replace(re_astralSymbols, astralReplacer)\n\t\t\t.replace(re_nonASCII, singleCharReplacer);\n}\n\nexports.escape = escapeXML;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbnRpdGllcy9saWIvZW5jb2RlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpbnZlcnNlWE1MID0gZ2V0SW52ZXJzZU9iaihyZXF1aXJlKFwiLi4vbWFwcy94bWwuanNvblwiKSksXG4gICAgeG1sUmVwbGFjZXIgPSBnZXRJbnZlcnNlUmVwbGFjZXIoaW52ZXJzZVhNTCk7XG5cbmV4cG9ydHMuWE1MID0gZ2V0SW52ZXJzZShpbnZlcnNlWE1MLCB4bWxSZXBsYWNlcik7XG5cbnZhciBpbnZlcnNlSFRNTCA9IGdldEludmVyc2VPYmoocmVxdWlyZShcIi4uL21hcHMvZW50aXRpZXMuanNvblwiKSksXG4gICAgaHRtbFJlcGxhY2VyID0gZ2V0SW52ZXJzZVJlcGxhY2VyKGludmVyc2VIVE1MKTtcblxuZXhwb3J0cy5IVE1MID0gZ2V0SW52ZXJzZShpbnZlcnNlSFRNTCwgaHRtbFJlcGxhY2VyKTtcblxuZnVuY3Rpb24gZ2V0SW52ZXJzZU9iaihvYmope1xuXHRyZXR1cm4gT2JqZWN0LmtleXMob2JqKS5zb3J0KCkucmVkdWNlKGZ1bmN0aW9uKGludmVyc2UsIG5hbWUpe1xuXHRcdGludmVyc2Vbb2JqW25hbWVdXSA9IFwiJlwiICsgbmFtZSArIFwiO1wiO1xuXHRcdHJldHVybiBpbnZlcnNlO1xuXHR9LCB7fSk7XG59XG5cbmZ1bmN0aW9uIGdldEludmVyc2VSZXBsYWNlcihpbnZlcnNlKXtcblx0dmFyIHNpbmdsZSA9IFtdLFxuXHQgICAgbXVsdGlwbGUgPSBbXTtcblxuXHRPYmplY3Qua2V5cyhpbnZlcnNlKS5mb3JFYWNoKGZ1bmN0aW9uKGspe1xuXHRcdGlmKGsubGVuZ3RoID09PSAxKXtcblx0XHRcdHNpbmdsZS5wdXNoKFwiXFxcXFwiICsgayk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG11bHRpcGxlLnB1c2goayk7XG5cdFx0fVxuXHR9KTtcblxuXHQvL1RPRE8gYWRkIHJhbmdlc1xuXHRtdWx0aXBsZS51bnNoaWZ0KFwiW1wiICsgc2luZ2xlLmpvaW4oXCJcIikgKyBcIl1cIik7XG5cblx0cmV0dXJuIG5ldyBSZWdFeHAobXVsdGlwbGUuam9pbihcInxcIiksIFwiZ1wiKTtcbn1cblxudmFyIHJlX25vbkFTQ0lJID0gL1teXFwwLVxceDdGXS9nLFxuICAgIHJlX2FzdHJhbFN5bWJvbHMgPSAvW1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXS9nO1xuXG5mdW5jdGlvbiBzaW5nbGVDaGFyUmVwbGFjZXIoYyl7XG5cdHJldHVybiBcIiYjeFwiICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpICsgXCI7XCI7XG59XG5cbmZ1bmN0aW9uIGFzdHJhbFJlcGxhY2VyKGMpe1xuXHQvLyBodHRwOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nI3N1cnJvZ2F0ZS1mb3JtdWxhZVxuXHR2YXIgaGlnaCA9IGMuY2hhckNvZGVBdCgwKTtcblx0dmFyIGxvdyAgPSBjLmNoYXJDb2RlQXQoMSk7XG5cdHZhciBjb2RlUG9pbnQgPSAoaGlnaCAtIDB4RDgwMCkgKiAweDQwMCArIGxvdyAtIDB4REMwMCArIDB4MTAwMDA7XG5cdHJldHVybiBcIiYjeFwiICsgY29kZVBvaW50LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpICsgXCI7XCI7XG59XG5cbmZ1bmN0aW9uIGdldEludmVyc2UoaW52ZXJzZSwgcmUpe1xuXHRmdW5jdGlvbiBmdW5jKG5hbWUpe1xuXHRcdHJldHVybiBpbnZlcnNlW25hbWVdO1xuXHR9XG5cblx0cmV0dXJuIGZ1bmN0aW9uKGRhdGEpe1xuXHRcdHJldHVybiBkYXRhXG5cdFx0XHRcdC5yZXBsYWNlKHJlLCBmdW5jKVxuXHRcdFx0XHQucmVwbGFjZShyZV9hc3RyYWxTeW1ib2xzLCBhc3RyYWxSZXBsYWNlcilcblx0XHRcdFx0LnJlcGxhY2UocmVfbm9uQVNDSUksIHNpbmdsZUNoYXJSZXBsYWNlcik7XG5cdH07XG59XG5cbnZhciByZV94bWxDaGFycyA9IGdldEludmVyc2VSZXBsYWNlcihpbnZlcnNlWE1MKTtcblxuZnVuY3Rpb24gZXNjYXBlWE1MKGRhdGEpe1xuXHRyZXR1cm4gZGF0YVxuXHRcdFx0LnJlcGxhY2UocmVfeG1sQ2hhcnMsIHNpbmdsZUNoYXJSZXBsYWNlcilcblx0XHRcdC5yZXBsYWNlKHJlX2FzdHJhbFN5bWJvbHMsIGFzdHJhbFJlcGxhY2VyKVxuXHRcdFx0LnJlcGxhY2UocmVfbm9uQVNDSUksIHNpbmdsZUNoYXJSZXBsYWNlcik7XG59XG5cbmV4cG9ydHMuZXNjYXBlID0gZXNjYXBlWE1MO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2VudGl0aWVzL2xpYi9lbmNvZGUuanNcbi8vIG1vZHVsZSBpZCA9IDQxOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 420 */
/***/ function(module, exports) {

    eval("module.exports = {\n\t\"amp\": \"&\",\n\t\"apos\": \"'\",\n\t\"gt\": \">\",\n\t\"lt\": \"<\",\n\t\"quot\": \"\\\"\"\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbnRpdGllcy9tYXBzL3htbC5qc29uIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0ge1xuXHRcImFtcFwiOiBcIiZcIixcblx0XCJhcG9zXCI6IFwiJ1wiLFxuXHRcImd0XCI6IFwiPlwiLFxuXHRcImx0XCI6IFwiPFwiLFxuXHRcInF1b3RcIjogXCJcXFwiXCJcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2VudGl0aWVzL21hcHMveG1sLmpzb25cbi8vIG1vZHVsZSBpZCA9IDQyMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 421 */
/***/ function(module, exports) {

    eval("module.exports = {\n\t\"Aacute\": \"Á\",\n\t\"aacute\": \"á\",\n\t\"Abreve\": \"Ă\",\n\t\"abreve\": \"ă\",\n\t\"ac\": \"∾\",\n\t\"acd\": \"∿\",\n\t\"acE\": \"∾̳\",\n\t\"Acirc\": \"Â\",\n\t\"acirc\": \"â\",\n\t\"acute\": \"´\",\n\t\"Acy\": \"А\",\n\t\"acy\": \"а\",\n\t\"AElig\": \"Æ\",\n\t\"aelig\": \"æ\",\n\t\"af\": \"⁡\",\n\t\"Afr\": \"𝔄\",\n\t\"afr\": \"𝔞\",\n\t\"Agrave\": \"À\",\n\t\"agrave\": \"à\",\n\t\"alefsym\": \"ℵ\",\n\t\"aleph\": \"ℵ\",\n\t\"Alpha\": \"Α\",\n\t\"alpha\": \"α\",\n\t\"Amacr\": \"Ā\",\n\t\"amacr\": \"ā\",\n\t\"amalg\": \"⨿\",\n\t\"amp\": \"&\",\n\t\"AMP\": \"&\",\n\t\"andand\": \"⩕\",\n\t\"And\": \"⩓\",\n\t\"and\": \"∧\",\n\t\"andd\": \"⩜\",\n\t\"andslope\": \"⩘\",\n\t\"andv\": \"⩚\",\n\t\"ang\": \"∠\",\n\t\"ange\": \"⦤\",\n\t\"angle\": \"∠\",\n\t\"angmsdaa\": \"⦨\",\n\t\"angmsdab\": \"⦩\",\n\t\"angmsdac\": \"⦪\",\n\t\"angmsdad\": \"⦫\",\n\t\"angmsdae\": \"⦬\",\n\t\"angmsdaf\": \"⦭\",\n\t\"angmsdag\": \"⦮\",\n\t\"angmsdah\": \"⦯\",\n\t\"angmsd\": \"∡\",\n\t\"angrt\": \"∟\",\n\t\"angrtvb\": \"⊾\",\n\t\"angrtvbd\": \"⦝\",\n\t\"angsph\": \"∢\",\n\t\"angst\": \"Å\",\n\t\"angzarr\": \"⍼\",\n\t\"Aogon\": \"Ą\",\n\t\"aogon\": \"ą\",\n\t\"Aopf\": \"𝔸\",\n\t\"aopf\": \"𝕒\",\n\t\"apacir\": \"⩯\",\n\t\"ap\": \"≈\",\n\t\"apE\": \"⩰\",\n\t\"ape\": \"≊\",\n\t\"apid\": \"≋\",\n\t\"apos\": \"'\",\n\t\"ApplyFunction\": \"⁡\",\n\t\"approx\": \"≈\",\n\t\"approxeq\": \"≊\",\n\t\"Aring\": \"Å\",\n\t\"aring\": \"å\",\n\t\"Ascr\": \"𝒜\",\n\t\"ascr\": \"𝒶\",\n\t\"Assign\": \"≔\",\n\t\"ast\": \"*\",\n\t\"asymp\": \"≈\",\n\t\"asympeq\": \"≍\",\n\t\"Atilde\": \"Ã\",\n\t\"atilde\": \"ã\",\n\t\"Auml\": \"Ä\",\n\t\"auml\": \"ä\",\n\t\"awconint\": \"∳\",\n\t\"awint\": \"⨑\",\n\t\"backcong\": \"≌\",\n\t\"backepsilon\": \"϶\",\n\t\"backprime\": \"‵\",\n\t\"backsim\": \"∽\",\n\t\"backsimeq\": \"⋍\",\n\t\"Backslash\": \"∖\",\n\t\"Barv\": \"⫧\",\n\t\"barvee\": \"⊽\",\n\t\"barwed\": \"⌅\",\n\t\"Barwed\": \"⌆\",\n\t\"barwedge\": \"⌅\",\n\t\"bbrk\": \"⎵\",\n\t\"bbrktbrk\": \"⎶\",\n\t\"bcong\": \"≌\",\n\t\"Bcy\": \"Б\",\n\t\"bcy\": \"б\",\n\t\"bdquo\": \"„\",\n\t\"becaus\": \"∵\",\n\t\"because\": \"∵\",\n\t\"Because\": \"∵\",\n\t\"bemptyv\": \"⦰\",\n\t\"bepsi\": \"϶\",\n\t\"bernou\": \"ℬ\",\n\t\"Bernoullis\": \"ℬ\",\n\t\"Beta\": \"Β\",\n\t\"beta\": \"β\",\n\t\"beth\": \"ℶ\",\n\t\"between\": \"≬\",\n\t\"Bfr\": \"𝔅\",\n\t\"bfr\": \"𝔟\",\n\t\"bigcap\": \"⋂\",\n\t\"bigcirc\": \"◯\",\n\t\"bigcup\": \"⋃\",\n\t\"bigodot\": \"⨀\",\n\t\"bigoplus\": \"⨁\",\n\t\"bigotimes\": \"⨂\",\n\t\"bigsqcup\": \"⨆\",\n\t\"bigstar\": \"★\",\n\t\"bigtriangledown\": \"▽\",\n\t\"bigtriangleup\": \"△\",\n\t\"biguplus\": \"⨄\",\n\t\"bigvee\": \"⋁\",\n\t\"bigwedge\": \"⋀\",\n\t\"bkarow\": \"⤍\",\n\t\"blacklozenge\": \"⧫\",\n\t\"blacksquare\": \"▪\",\n\t\"blacktriangle\": \"▴\",\n\t\"blacktriangledown\": \"▾\",\n\t\"blacktriangleleft\": \"◂\",\n\t\"blacktriangleright\": \"▸\",\n\t\"blank\": \"␣\",\n\t\"blk12\": \"▒\",\n\t\"blk14\": \"░\",\n\t\"blk34\": \"▓\",\n\t\"block\": \"█\",\n\t\"bne\": \"=⃥\",\n\t\"bnequiv\": \"≡⃥\",\n\t\"bNot\": \"⫭\",\n\t\"bnot\": \"⌐\",\n\t\"Bopf\": \"𝔹\",\n\t\"bopf\": \"𝕓\",\n\t\"bot\": \"⊥\",\n\t\"bottom\": \"⊥\",\n\t\"bowtie\": \"⋈\",\n\t\"boxbox\": \"⧉\",\n\t\"boxdl\": \"┐\",\n\t\"boxdL\": \"╕\",\n\t\"boxDl\": \"╖\",\n\t\"boxDL\": \"╗\",\n\t\"boxdr\": \"┌\",\n\t\"boxdR\": \"╒\",\n\t\"boxDr\": \"╓\",\n\t\"boxDR\": \"╔\",\n\t\"boxh\": \"─\",\n\t\"boxH\": \"═\",\n\t\"boxhd\": \"┬\",\n\t\"boxHd\": \"╤\",\n\t\"boxhD\": \"╥\",\n\t\"boxHD\": \"╦\",\n\t\"boxhu\": \"┴\",\n\t\"boxHu\": \"╧\",\n\t\"boxhU\": \"╨\",\n\t\"boxHU\": \"╩\",\n\t\"boxminus\": \"⊟\",\n\t\"boxplus\": \"⊞\",\n\t\"boxtimes\": \"⊠\",\n\t\"boxul\": \"┘\",\n\t\"boxuL\": \"╛\",\n\t\"boxUl\": \"╜\",\n\t\"boxUL\": \"╝\",\n\t\"boxur\": \"└\",\n\t\"boxuR\": \"╘\",\n\t\"boxUr\": \"╙\",\n\t\"boxUR\": \"╚\",\n\t\"boxv\": \"│\",\n\t\"boxV\": \"║\",\n\t\"boxvh\": \"┼\",\n\t\"boxvH\": \"╪\",\n\t\"boxVh\": \"╫\",\n\t\"boxVH\": \"╬\",\n\t\"boxvl\": \"┤\",\n\t\"boxvL\": \"╡\",\n\t\"boxVl\": \"╢\",\n\t\"boxVL\": \"╣\",\n\t\"boxvr\": \"├\",\n\t\"boxvR\": \"╞\",\n\t\"boxVr\": \"╟\",\n\t\"boxVR\": \"╠\",\n\t\"bprime\": \"‵\",\n\t\"breve\": \"˘\",\n\t\"Breve\": \"˘\",\n\t\"brvbar\": \"¦\",\n\t\"bscr\": \"𝒷\",\n\t\"Bscr\": \"ℬ\",\n\t\"bsemi\": \"⁏\",\n\t\"bsim\": \"∽\",\n\t\"bsime\": \"⋍\",\n\t\"bsolb\": \"⧅\",\n\t\"bsol\": \"\\\\\",\n\t\"bsolhsub\": \"⟈\",\n\t\"bull\": \"•\",\n\t\"bullet\": \"•\",\n\t\"bump\": \"≎\",\n\t\"bumpE\": \"⪮\",\n\t\"bumpe\": \"≏\",\n\t\"Bumpeq\": \"≎\",\n\t\"bumpeq\": \"≏\",\n\t\"Cacute\": \"Ć\",\n\t\"cacute\": \"ć\",\n\t\"capand\": \"⩄\",\n\t\"capbrcup\": \"⩉\",\n\t\"capcap\": \"⩋\",\n\t\"cap\": \"∩\",\n\t\"Cap\": \"⋒\",\n\t\"capcup\": \"⩇\",\n\t\"capdot\": \"⩀\",\n\t\"CapitalDifferentialD\": \"ⅅ\",\n\t\"caps\": \"∩︀\",\n\t\"caret\": \"⁁\",\n\t\"caron\": \"ˇ\",\n\t\"Cayleys\": \"ℭ\",\n\t\"ccaps\": \"⩍\",\n\t\"Ccaron\": \"Č\",\n\t\"ccaron\": \"č\",\n\t\"Ccedil\": \"Ç\",\n\t\"ccedil\": \"ç\",\n\t\"Ccirc\": \"Ĉ\",\n\t\"ccirc\": \"ĉ\",\n\t\"Cconint\": \"∰\",\n\t\"ccups\": \"⩌\",\n\t\"ccupssm\": \"⩐\",\n\t\"Cdot\": \"Ċ\",\n\t\"cdot\": \"ċ\",\n\t\"cedil\": \"¸\",\n\t\"Cedilla\": \"¸\",\n\t\"cemptyv\": \"⦲\",\n\t\"cent\": \"¢\",\n\t\"centerdot\": \"·\",\n\t\"CenterDot\": \"·\",\n\t\"cfr\": \"𝔠\",\n\t\"Cfr\": \"ℭ\",\n\t\"CHcy\": \"Ч\",\n\t\"chcy\": \"ч\",\n\t\"check\": \"✓\",\n\t\"checkmark\": \"✓\",\n\t\"Chi\": \"Χ\",\n\t\"chi\": \"χ\",\n\t\"circ\": \"ˆ\",\n\t\"circeq\": \"≗\",\n\t\"circlearrowleft\": \"↺\",\n\t\"circlearrowright\": \"↻\",\n\t\"circledast\": \"⊛\",\n\t\"circledcirc\": \"⊚\",\n\t\"circleddash\": \"⊝\",\n\t\"CircleDot\": \"⊙\",\n\t\"circledR\": \"®\",\n\t\"circledS\": \"Ⓢ\",\n\t\"CircleMinus\": \"⊖\",\n\t\"CirclePlus\": \"⊕\",\n\t\"CircleTimes\": \"⊗\",\n\t\"cir\": \"○\",\n\t\"cirE\": \"⧃\",\n\t\"cire\": \"≗\",\n\t\"cirfnint\": \"⨐\",\n\t\"cirmid\": \"⫯\",\n\t\"cirscir\": \"⧂\",\n\t\"ClockwiseContourIntegral\": \"∲\",\n\t\"CloseCurlyDoubleQuote\": \"”\",\n\t\"CloseCurlyQuote\": \"’\",\n\t\"clubs\": \"♣\",\n\t\"clubsuit\": \"♣\",\n\t\"colon\": \":\",\n\t\"Colon\": \"∷\",\n\t\"Colone\": \"⩴\",\n\t\"colone\": \"≔\",\n\t\"coloneq\": \"≔\",\n\t\"comma\": \",\",\n\t\"commat\": \"@\",\n\t\"comp\": \"∁\",\n\t\"compfn\": \"∘\",\n\t\"complement\": \"∁\",\n\t\"complexes\": \"ℂ\",\n\t\"cong\": \"≅\",\n\t\"congdot\": \"⩭\",\n\t\"Congruent\": \"≡\",\n\t\"conint\": \"∮\",\n\t\"Conint\": \"∯\",\n\t\"ContourIntegral\": \"∮\",\n\t\"copf\": \"𝕔\",\n\t\"Copf\": \"ℂ\",\n\t\"coprod\": \"∐\",\n\t\"Coproduct\": \"∐\",\n\t\"copy\": \"©\",\n\t\"COPY\": \"©\",\n\t\"copysr\": \"℗\",\n\t\"CounterClockwiseContourIntegral\": \"∳\",\n\t\"crarr\": \"↵\",\n\t\"cross\": \"✗\",\n\t\"Cross\": \"⨯\",\n\t\"Cscr\": \"𝒞\",\n\t\"cscr\": \"𝒸\",\n\t\"csub\": \"⫏\",\n\t\"csube\": \"⫑\",\n\t\"csup\": \"⫐\",\n\t\"csupe\": \"⫒\",\n\t\"ctdot\": \"⋯\",\n\t\"cudarrl\": \"⤸\",\n\t\"cudarrr\": \"⤵\",\n\t\"cuepr\": \"⋞\",\n\t\"cuesc\": \"⋟\",\n\t\"cularr\": \"↶\",\n\t\"cularrp\": \"⤽\",\n\t\"cupbrcap\": \"⩈\",\n\t\"cupcap\": \"⩆\",\n\t\"CupCap\": \"≍\",\n\t\"cup\": \"∪\",\n\t\"Cup\": \"⋓\",\n\t\"cupcup\": \"⩊\",\n\t\"cupdot\": \"⊍\",\n\t\"cupor\": \"⩅\",\n\t\"cups\": \"∪︀\",\n\t\"curarr\": \"↷\",\n\t\"curarrm\": \"⤼\",\n\t\"curlyeqprec\": \"⋞\",\n\t\"curlyeqsucc\": \"⋟\",\n\t\"curlyvee\": \"⋎\",\n\t\"curlywedge\": \"⋏\",\n\t\"curren\": \"¤\",\n\t\"curvearrowleft\": \"↶\",\n\t\"curvearrowright\": \"↷\",\n\t\"cuvee\": \"⋎\",\n\t\"cuwed\": \"⋏\",\n\t\"cwconint\": \"∲\",\n\t\"cwint\": \"∱\",\n\t\"cylcty\": \"⌭\",\n\t\"dagger\": \"†\",\n\t\"Dagger\": \"‡\",\n\t\"daleth\": \"ℸ\",\n\t\"darr\": \"↓\",\n\t\"Darr\": \"↡\",\n\t\"dArr\": \"⇓\",\n\t\"dash\": \"‐\",\n\t\"Dashv\": \"⫤\",\n\t\"dashv\": \"⊣\",\n\t\"dbkarow\": \"⤏\",\n\t\"dblac\": \"˝\",\n\t\"Dcaron\": \"Ď\",\n\t\"dcaron\": \"ď\",\n\t\"Dcy\": \"Д\",\n\t\"dcy\": \"д\",\n\t\"ddagger\": \"‡\",\n\t\"ddarr\": \"⇊\",\n\t\"DD\": \"ⅅ\",\n\t\"dd\": \"ⅆ\",\n\t\"DDotrahd\": \"⤑\",\n\t\"ddotseq\": \"⩷\",\n\t\"deg\": \"°\",\n\t\"Del\": \"∇\",\n\t\"Delta\": \"Δ\",\n\t\"delta\": \"δ\",\n\t\"demptyv\": \"⦱\",\n\t\"dfisht\": \"⥿\",\n\t\"Dfr\": \"𝔇\",\n\t\"dfr\": \"𝔡\",\n\t\"dHar\": \"⥥\",\n\t\"dharl\": \"⇃\",\n\t\"dharr\": \"⇂\",\n\t\"DiacriticalAcute\": \"´\",\n\t\"DiacriticalDot\": \"˙\",\n\t\"DiacriticalDoubleAcute\": \"˝\",\n\t\"DiacriticalGrave\": \"`\",\n\t\"DiacriticalTilde\": \"˜\",\n\t\"diam\": \"⋄\",\n\t\"diamond\": \"⋄\",\n\t\"Diamond\": \"⋄\",\n\t\"diamondsuit\": \"♦\",\n\t\"diams\": \"♦\",\n\t\"die\": \"¨\",\n\t\"DifferentialD\": \"ⅆ\",\n\t\"digamma\": \"ϝ\",\n\t\"disin\": \"⋲\",\n\t\"div\": \"÷\",\n\t\"divide\": \"÷\",\n\t\"divideontimes\": \"⋇\",\n\t\"divonx\": \"⋇\",\n\t\"DJcy\": \"Ђ\",\n\t\"djcy\": \"ђ\",\n\t\"dlcorn\": \"⌞\",\n\t\"dlcrop\": \"⌍\",\n\t\"dollar\": \"$\",\n\t\"Dopf\": \"𝔻\",\n\t\"dopf\": \"𝕕\",\n\t\"Dot\": \"¨\",\n\t\"dot\": \"˙\",\n\t\"DotDot\": \"⃜\",\n\t\"doteq\": \"≐\",\n\t\"doteqdot\": \"≑\",\n\t\"DotEqual\": \"≐\",\n\t\"dotminus\": \"∸\",\n\t\"dotplus\": \"∔\",\n\t\"dotsquare\": \"⊡\",\n\t\"doublebarwedge\": \"⌆\",\n\t\"DoubleContourIntegral\": \"∯\",\n\t\"DoubleDot\": \"¨\",\n\t\"DoubleDownArrow\": \"⇓\",\n\t\"DoubleLeftArrow\": \"⇐\",\n\t\"DoubleLeftRightArrow\": \"⇔\",\n\t\"DoubleLeftTee\": \"⫤\",\n\t\"DoubleLongLeftArrow\": \"⟸\",\n\t\"DoubleLongLeftRightArrow\": \"⟺\",\n\t\"DoubleLongRightArrow\": \"⟹\",\n\t\"DoubleRightArrow\": \"⇒\",\n\t\"DoubleRightTee\": \"⊨\",\n\t\"DoubleUpArrow\": \"⇑\",\n\t\"DoubleUpDownArrow\": \"⇕\",\n\t\"DoubleVerticalBar\": \"∥\",\n\t\"DownArrowBar\": \"⤓\",\n\t\"downarrow\": \"↓\",\n\t\"DownArrow\": \"↓\",\n\t\"Downarrow\": \"⇓\",\n\t\"DownArrowUpArrow\": \"⇵\",\n\t\"DownBreve\": \"̑\",\n\t\"downdownarrows\": \"⇊\",\n\t\"downharpoonleft\": \"⇃\",\n\t\"downharpoonright\": \"⇂\",\n\t\"DownLeftRightVector\": \"⥐\",\n\t\"DownLeftTeeVector\": \"⥞\",\n\t\"DownLeftVectorBar\": \"⥖\",\n\t\"DownLeftVector\": \"↽\",\n\t\"DownRightTeeVector\": \"⥟\",\n\t\"DownRightVectorBar\": \"⥗\",\n\t\"DownRightVector\": \"⇁\",\n\t\"DownTeeArrow\": \"↧\",\n\t\"DownTee\": \"⊤\",\n\t\"drbkarow\": \"⤐\",\n\t\"drcorn\": \"⌟\",\n\t\"drcrop\": \"⌌\",\n\t\"Dscr\": \"𝒟\",\n\t\"dscr\": \"𝒹\",\n\t\"DScy\": \"Ѕ\",\n\t\"dscy\": \"ѕ\",\n\t\"dsol\": \"⧶\",\n\t\"Dstrok\": \"Đ\",\n\t\"dstrok\": \"đ\",\n\t\"dtdot\": \"⋱\",\n\t\"dtri\": \"▿\",\n\t\"dtrif\": \"▾\",\n\t\"duarr\": \"⇵\",\n\t\"duhar\": \"⥯\",\n\t\"dwangle\": \"⦦\",\n\t\"DZcy\": \"Џ\",\n\t\"dzcy\": \"џ\",\n\t\"dzigrarr\": \"⟿\",\n\t\"Eacute\": \"É\",\n\t\"eacute\": \"é\",\n\t\"easter\": \"⩮\",\n\t\"Ecaron\": \"Ě\",\n\t\"ecaron\": \"ě\",\n\t\"Ecirc\": \"Ê\",\n\t\"ecirc\": \"ê\",\n\t\"ecir\": \"≖\",\n\t\"ecolon\": \"≕\",\n\t\"Ecy\": \"Э\",\n\t\"ecy\": \"э\",\n\t\"eDDot\": \"⩷\",\n\t\"Edot\": \"Ė\",\n\t\"edot\": \"ė\",\n\t\"eDot\": \"≑\",\n\t\"ee\": \"ⅇ\",\n\t\"efDot\": \"≒\",\n\t\"Efr\": \"𝔈\",\n\t\"efr\": \"𝔢\",\n\t\"eg\": \"⪚\",\n\t\"Egrave\": \"È\",\n\t\"egrave\": \"è\",\n\t\"egs\": \"⪖\",\n\t\"egsdot\": \"⪘\",\n\t\"el\": \"⪙\",\n\t\"Element\": \"∈\",\n\t\"elinters\": \"⏧\",\n\t\"ell\": \"ℓ\",\n\t\"els\": \"⪕\",\n\t\"elsdot\": \"⪗\",\n\t\"Emacr\": \"Ē\",\n\t\"emacr\": \"ē\",\n\t\"empty\": \"∅\",\n\t\"emptyset\": \"∅\",\n\t\"EmptySmallSquare\": \"◻\",\n\t\"emptyv\": \"∅\",\n\t\"EmptyVerySmallSquare\": \"▫\",\n\t\"emsp13\": \" \",\n\t\"emsp14\": \" \",\n\t\"emsp\": \" \",\n\t\"ENG\": \"Ŋ\",\n\t\"eng\": \"ŋ\",\n\t\"ensp\": \" \",\n\t\"Eogon\": \"Ę\",\n\t\"eogon\": \"ę\",\n\t\"Eopf\": \"𝔼\",\n\t\"eopf\": \"𝕖\",\n\t\"epar\": \"⋕\",\n\t\"eparsl\": \"⧣\",\n\t\"eplus\": \"⩱\",\n\t\"epsi\": \"ε\",\n\t\"Epsilon\": \"Ε\",\n\t\"epsilon\": \"ε\",\n\t\"epsiv\": \"ϵ\",\n\t\"eqcirc\": \"≖\",\n\t\"eqcolon\": \"≕\",\n\t\"eqsim\": \"≂\",\n\t\"eqslantgtr\": \"⪖\",\n\t\"eqslantless\": \"⪕\",\n\t\"Equal\": \"⩵\",\n\t\"equals\": \"=\",\n\t\"EqualTilde\": \"≂\",\n\t\"equest\": \"≟\",\n\t\"Equilibrium\": \"⇌\",\n\t\"equiv\": \"≡\",\n\t\"equivDD\": \"⩸\",\n\t\"eqvparsl\": \"⧥\",\n\t\"erarr\": \"⥱\",\n\t\"erDot\": \"≓\",\n\t\"escr\": \"ℯ\",\n\t\"Escr\": \"ℰ\",\n\t\"esdot\": \"≐\",\n\t\"Esim\": \"⩳\",\n\t\"esim\": \"≂\",\n\t\"Eta\": \"Η\",\n\t\"eta\": \"η\",\n\t\"ETH\": \"Ð\",\n\t\"eth\": \"ð\",\n\t\"Euml\": \"Ë\",\n\t\"euml\": \"ë\",\n\t\"euro\": \"€\",\n\t\"excl\": \"!\",\n\t\"exist\": \"∃\",\n\t\"Exists\": \"∃\",\n\t\"expectation\": \"ℰ\",\n\t\"exponentiale\": \"ⅇ\",\n\t\"ExponentialE\": \"ⅇ\",\n\t\"fallingdotseq\": \"≒\",\n\t\"Fcy\": \"Ф\",\n\t\"fcy\": \"ф\",\n\t\"female\": \"♀\",\n\t\"ffilig\": \"ffi\",\n\t\"fflig\": \"ff\",\n\t\"ffllig\": \"ffl\",\n\t\"Ffr\": \"𝔉\",\n\t\"ffr\": \"𝔣\",\n\t\"filig\": \"fi\",\n\t\"FilledSmallSquare\": \"◼\",\n\t\"FilledVerySmallSquare\": \"▪\",\n\t\"fjlig\": \"fj\",\n\t\"flat\": \"♭\",\n\t\"fllig\": \"fl\",\n\t\"fltns\": \"▱\",\n\t\"fnof\": \"ƒ\",\n\t\"Fopf\": \"𝔽\",\n\t\"fopf\": \"𝕗\",\n\t\"forall\": \"∀\",\n\t\"ForAll\": \"∀\",\n\t\"fork\": \"⋔\",\n\t\"forkv\": \"⫙\",\n\t\"Fouriertrf\": \"ℱ\",\n\t\"fpartint\": \"⨍\",\n\t\"frac12\": \"½\",\n\t\"frac13\": \"⅓\",\n\t\"frac14\": \"¼\",\n\t\"frac15\": \"⅕\",\n\t\"frac16\": \"⅙\",\n\t\"frac18\": \"⅛\",\n\t\"frac23\": \"⅔\",\n\t\"frac25\": \"⅖\",\n\t\"frac34\": \"¾\",\n\t\"frac35\": \"⅗\",\n\t\"frac38\": \"⅜\",\n\t\"frac45\": \"⅘\",\n\t\"frac56\": \"⅚\",\n\t\"frac58\": \"⅝\",\n\t\"frac78\": \"⅞\",\n\t\"frasl\": \"⁄\",\n\t\"frown\": \"⌢\",\n\t\"fscr\": \"𝒻\",\n\t\"Fscr\": \"ℱ\",\n\t\"gacute\": \"ǵ\",\n\t\"Gamma\": \"Γ\",\n\t\"gamma\": \"γ\",\n\t\"Gammad\": \"Ϝ\",\n\t\"gammad\": \"ϝ\",\n\t\"gap\": \"⪆\",\n\t\"Gbreve\": \"Ğ\",\n\t\"gbreve\": \"ğ\",\n\t\"Gcedil\": \"Ģ\",\n\t\"Gcirc\": \"Ĝ\",\n\t\"gcirc\": \"ĝ\",\n\t\"Gcy\": \"Г\",\n\t\"gcy\": \"г\",\n\t\"Gdot\": \"Ġ\",\n\t\"gdot\": \"ġ\",\n\t\"ge\": \"≥\",\n\t\"gE\": \"≧\",\n\t\"gEl\": \"⪌\",\n\t\"gel\": \"⋛\",\n\t\"geq\": \"≥\",\n\t\"geqq\": \"≧\",\n\t\"geqslant\": \"⩾\",\n\t\"gescc\": \"⪩\",\n\t\"ges\": \"⩾\",\n\t\"gesdot\": \"⪀\",\n\t\"gesdoto\": \"⪂\",\n\t\"gesdotol\": \"⪄\",\n\t\"gesl\": \"⋛︀\",\n\t\"gesles\": \"⪔\",\n\t\"Gfr\": \"𝔊\",\n\t\"gfr\": \"𝔤\",\n\t\"gg\": \"≫\",\n\t\"Gg\": \"⋙\",\n\t\"ggg\": \"⋙\",\n\t\"gimel\": \"ℷ\",\n\t\"GJcy\": \"Ѓ\",\n\t\"gjcy\": \"ѓ\",\n\t\"gla\": \"⪥\",\n\t\"gl\": \"≷\",\n\t\"glE\": \"⪒\",\n\t\"glj\": \"⪤\",\n\t\"gnap\": \"⪊\",\n\t\"gnapprox\": \"⪊\",\n\t\"gne\": \"⪈\",\n\t\"gnE\": \"≩\",\n\t\"gneq\": \"⪈\",\n\t\"gneqq\": \"≩\",\n\t\"gnsim\": \"⋧\",\n\t\"Gopf\": \"𝔾\",\n\t\"gopf\": \"𝕘\",\n\t\"grave\": \"`\",\n\t\"GreaterEqual\": \"≥\",\n\t\"GreaterEqualLess\": \"⋛\",\n\t\"GreaterFullEqual\": \"≧\",\n\t\"GreaterGreater\": \"⪢\",\n\t\"GreaterLess\": \"≷\",\n\t\"GreaterSlantEqual\": \"⩾\",\n\t\"GreaterTilde\": \"≳\",\n\t\"Gscr\": \"𝒢\",\n\t\"gscr\": \"ℊ\",\n\t\"gsim\": \"≳\",\n\t\"gsime\": \"⪎\",\n\t\"gsiml\": \"⪐\",\n\t\"gtcc\": \"⪧\",\n\t\"gtcir\": \"⩺\",\n\t\"gt\": \">\",\n\t\"GT\": \">\",\n\t\"Gt\": \"≫\",\n\t\"gtdot\": \"⋗\",\n\t\"gtlPar\": \"⦕\",\n\t\"gtquest\": \"⩼\",\n\t\"gtrapprox\": \"⪆\",\n\t\"gtrarr\": \"⥸\",\n\t\"gtrdot\": \"⋗\",\n\t\"gtreqless\": \"⋛\",\n\t\"gtreqqless\": \"⪌\",\n\t\"gtrless\": \"≷\",\n\t\"gtrsim\": \"≳\",\n\t\"gvertneqq\": \"≩︀\",\n\t\"gvnE\": \"≩︀\",\n\t\"Hacek\": \"ˇ\",\n\t\"hairsp\": \" \",\n\t\"half\": \"½\",\n\t\"hamilt\": \"ℋ\",\n\t\"HARDcy\": \"Ъ\",\n\t\"hardcy\": \"ъ\",\n\t\"harrcir\": \"⥈\",\n\t\"harr\": \"↔\",\n\t\"hArr\": \"⇔\",\n\t\"harrw\": \"↭\",\n\t\"Hat\": \"^\",\n\t\"hbar\": \"ℏ\",\n\t\"Hcirc\": \"Ĥ\",\n\t\"hcirc\": \"ĥ\",\n\t\"hearts\": \"♥\",\n\t\"heartsuit\": \"♥\",\n\t\"hellip\": \"…\",\n\t\"hercon\": \"⊹\",\n\t\"hfr\": \"𝔥\",\n\t\"Hfr\": \"ℌ\",\n\t\"HilbertSpace\": \"ℋ\",\n\t\"hksearow\": \"⤥\",\n\t\"hkswarow\": \"⤦\",\n\t\"hoarr\": \"⇿\",\n\t\"homtht\": \"∻\",\n\t\"hookleftarrow\": \"↩\",\n\t\"hookrightarrow\": \"↪\",\n\t\"hopf\": \"𝕙\",\n\t\"Hopf\": \"ℍ\",\n\t\"horbar\": \"―\",\n\t\"HorizontalLine\": \"─\",\n\t\"hscr\": \"𝒽\",\n\t\"Hscr\": \"ℋ\",\n\t\"hslash\": \"ℏ\",\n\t\"Hstrok\": \"Ħ\",\n\t\"hstrok\": \"ħ\",\n\t\"HumpDownHump\": \"≎\",\n\t\"HumpEqual\": \"≏\",\n\t\"hybull\": \"⁃\",\n\t\"hyphen\": \"‐\",\n\t\"Iacute\": \"Í\",\n\t\"iacute\": \"í\",\n\t\"ic\": \"⁣\",\n\t\"Icirc\": \"Î\",\n\t\"icirc\": \"î\",\n\t\"Icy\": \"И\",\n\t\"icy\": \"и\",\n\t\"Idot\": \"İ\",\n\t\"IEcy\": \"Е\",\n\t\"iecy\": \"е\",\n\t\"iexcl\": \"¡\",\n\t\"iff\": \"⇔\",\n\t\"ifr\": \"𝔦\",\n\t\"Ifr\": \"ℑ\",\n\t\"Igrave\": \"Ì\",\n\t\"igrave\": \"ì\",\n\t\"ii\": \"ⅈ\",\n\t\"iiiint\": \"⨌\",\n\t\"iiint\": \"∭\",\n\t\"iinfin\": \"⧜\",\n\t\"iiota\": \"℩\",\n\t\"IJlig\": \"IJ\",\n\t\"ijlig\": \"ij\",\n\t\"Imacr\": \"Ī\",\n\t\"imacr\": \"ī\",\n\t\"image\": \"ℑ\",\n\t\"ImaginaryI\": \"ⅈ\",\n\t\"imagline\": \"ℐ\",\n\t\"imagpart\": \"ℑ\",\n\t\"imath\": \"ı\",\n\t\"Im\": \"ℑ\",\n\t\"imof\": \"⊷\",\n\t\"imped\": \"Ƶ\",\n\t\"Implies\": \"⇒\",\n\t\"incare\": \"℅\",\n\t\"in\": \"∈\",\n\t\"infin\": \"∞\",\n\t\"infintie\": \"⧝\",\n\t\"inodot\": \"ı\",\n\t\"intcal\": \"⊺\",\n\t\"int\": \"∫\",\n\t\"Int\": \"∬\",\n\t\"integers\": \"ℤ\",\n\t\"Integral\": \"∫\",\n\t\"intercal\": \"⊺\",\n\t\"Intersection\": \"⋂\",\n\t\"intlarhk\": \"⨗\",\n\t\"intprod\": \"⨼\",\n\t\"InvisibleComma\": \"⁣\",\n\t\"InvisibleTimes\": \"⁢\",\n\t\"IOcy\": \"Ё\",\n\t\"iocy\": \"ё\",\n\t\"Iogon\": \"Į\",\n\t\"iogon\": \"į\",\n\t\"Iopf\": \"𝕀\",\n\t\"iopf\": \"𝕚\",\n\t\"Iota\": \"Ι\",\n\t\"iota\": \"ι\",\n\t\"iprod\": \"⨼\",\n\t\"iquest\": \"¿\",\n\t\"iscr\": \"𝒾\",\n\t\"Iscr\": \"ℐ\",\n\t\"isin\": \"∈\",\n\t\"isindot\": \"⋵\",\n\t\"isinE\": \"⋹\",\n\t\"isins\": \"⋴\",\n\t\"isinsv\": \"⋳\",\n\t\"isinv\": \"∈\",\n\t\"it\": \"⁢\",\n\t\"Itilde\": \"Ĩ\",\n\t\"itilde\": \"ĩ\",\n\t\"Iukcy\": \"І\",\n\t\"iukcy\": \"і\",\n\t\"Iuml\": \"Ï\",\n\t\"iuml\": \"ï\",\n\t\"Jcirc\": \"Ĵ\",\n\t\"jcirc\": \"ĵ\",\n\t\"Jcy\": \"Й\",\n\t\"jcy\": \"й\",\n\t\"Jfr\": \"𝔍\",\n\t\"jfr\": \"𝔧\",\n\t\"jmath\": \"ȷ\",\n\t\"Jopf\": \"𝕁\",\n\t\"jopf\": \"𝕛\",\n\t\"Jscr\": \"𝒥\",\n\t\"jscr\": \"𝒿\",\n\t\"Jsercy\": \"Ј\",\n\t\"jsercy\": \"ј\",\n\t\"Jukcy\": \"Є\",\n\t\"jukcy\": \"є\",\n\t\"Kappa\": \"Κ\",\n\t\"kappa\": \"κ\",\n\t\"kappav\": \"ϰ\",\n\t\"Kcedil\": \"Ķ\",\n\t\"kcedil\": \"ķ\",\n\t\"Kcy\": \"К\",\n\t\"kcy\": \"к\",\n\t\"Kfr\": \"𝔎\",\n\t\"kfr\": \"𝔨\",\n\t\"kgreen\": \"ĸ\",\n\t\"KHcy\": \"Х\",\n\t\"khcy\": \"х\",\n\t\"KJcy\": \"Ќ\",\n\t\"kjcy\": \"ќ\",\n\t\"Kopf\": \"𝕂\",\n\t\"kopf\": \"𝕜\",\n\t\"Kscr\": \"𝒦\",\n\t\"kscr\": \"𝓀\",\n\t\"lAarr\": \"⇚\",\n\t\"Lacute\": \"Ĺ\",\n\t\"lacute\": \"ĺ\",\n\t\"laemptyv\": \"⦴\",\n\t\"lagran\": \"ℒ\",\n\t\"Lambda\": \"Λ\",\n\t\"lambda\": \"λ\",\n\t\"lang\": \"⟨\",\n\t\"Lang\": \"⟪\",\n\t\"langd\": \"⦑\",\n\t\"langle\": \"⟨\",\n\t\"lap\": \"⪅\",\n\t\"Laplacetrf\": \"ℒ\",\n\t\"laquo\": \"«\",\n\t\"larrb\": \"⇤\",\n\t\"larrbfs\": \"⤟\",\n\t\"larr\": \"←\",\n\t\"Larr\": \"↞\",\n\t\"lArr\": \"⇐\",\n\t\"larrfs\": \"⤝\",\n\t\"larrhk\": \"↩\",\n\t\"larrlp\": \"↫\",\n\t\"larrpl\": \"⤹\",\n\t\"larrsim\": \"⥳\",\n\t\"larrtl\": \"↢\",\n\t\"latail\": \"⤙\",\n\t\"lAtail\": \"⤛\",\n\t\"lat\": \"⪫\",\n\t\"late\": \"⪭\",\n\t\"lates\": \"⪭︀\",\n\t\"lbarr\": \"⤌\",\n\t\"lBarr\": \"⤎\",\n\t\"lbbrk\": \"❲\",\n\t\"lbrace\": \"{\",\n\t\"lbrack\": \"[\",\n\t\"lbrke\": \"⦋\",\n\t\"lbrksld\": \"⦏\",\n\t\"lbrkslu\": \"⦍\",\n\t\"Lcaron\": \"Ľ\",\n\t\"lcaron\": \"ľ\",\n\t\"Lcedil\": \"Ļ\",\n\t\"lcedil\": \"ļ\",\n\t\"lceil\": \"⌈\",\n\t\"lcub\": \"{\",\n\t\"Lcy\": \"Л\",\n\t\"lcy\": \"л\",\n\t\"ldca\": \"⤶\",\n\t\"ldquo\": \"“\",\n\t\"ldquor\": \"„\",\n\t\"ldrdhar\": \"⥧\",\n\t\"ldrushar\": \"⥋\",\n\t\"ldsh\": \"↲\",\n\t\"le\": \"≤\",\n\t\"lE\": \"≦\",\n\t\"LeftAngleBracket\": \"⟨\",\n\t\"LeftArrowBar\": \"⇤\",\n\t\"leftarrow\": \"←\",\n\t\"LeftArrow\": \"←\",\n\t\"Leftarrow\": \"⇐\",\n\t\"LeftArrowRightArrow\": \"⇆\",\n\t\"leftarrowtail\": \"↢\",\n\t\"LeftCeiling\": \"⌈\",\n\t\"LeftDoubleBracket\": \"⟦\",\n\t\"LeftDownTeeVector\": \"⥡\",\n\t\"LeftDownVectorBar\": \"⥙\",\n\t\"LeftDownVector\": \"⇃\",\n\t\"LeftFloor\": \"⌊\",\n\t\"leftharpoondown\": \"↽\",\n\t\"leftharpoonup\": \"↼\",\n\t\"leftleftarrows\": \"⇇\",\n\t\"leftrightarrow\": \"↔\",\n\t\"LeftRightArrow\": \"↔\",\n\t\"Leftrightarrow\": \"⇔\",\n\t\"leftrightarrows\": \"⇆\",\n\t\"leftrightharpoons\": \"⇋\",\n\t\"leftrightsquigarrow\": \"↭\",\n\t\"LeftRightVector\": \"⥎\",\n\t\"LeftTeeArrow\": \"↤\",\n\t\"LeftTee\": \"⊣\",\n\t\"LeftTeeVector\": \"⥚\",\n\t\"leftthreetimes\": \"⋋\",\n\t\"LeftTriangleBar\": \"⧏\",\n\t\"LeftTriangle\": \"⊲\",\n\t\"LeftTriangleEqual\": \"⊴\",\n\t\"LeftUpDownVector\": \"⥑\",\n\t\"LeftUpTeeVector\": \"⥠\",\n\t\"LeftUpVectorBar\": \"⥘\",\n\t\"LeftUpVector\": \"↿\",\n\t\"LeftVectorBar\": \"⥒\",\n\t\"LeftVector\": \"↼\",\n\t\"lEg\": \"⪋\",\n\t\"leg\": \"⋚\",\n\t\"leq\": \"≤\",\n\t\"leqq\": \"≦\",\n\t\"leqslant\": \"⩽\",\n\t\"lescc\": \"⪨\",\n\t\"les\": \"⩽\",\n\t\"lesdot\": \"⩿\",\n\t\"lesdoto\": \"⪁\",\n\t\"lesdotor\": \"⪃\",\n\t\"lesg\": \"⋚︀\",\n\t\"lesges\": \"⪓\",\n\t\"lessapprox\": \"⪅\",\n\t\"lessdot\": \"⋖\",\n\t\"lesseqgtr\": \"⋚\",\n\t\"lesseqqgtr\": \"⪋\",\n\t\"LessEqualGreater\": \"⋚\",\n\t\"LessFullEqual\": \"≦\",\n\t\"LessGreater\": \"≶\",\n\t\"lessgtr\": \"≶\",\n\t\"LessLess\": \"⪡\",\n\t\"lesssim\": \"≲\",\n\t\"LessSlantEqual\": \"⩽\",\n\t\"LessTilde\": \"≲\",\n\t\"lfisht\": \"⥼\",\n\t\"lfloor\": \"⌊\",\n\t\"Lfr\": \"𝔏\",\n\t\"lfr\": \"𝔩\",\n\t\"lg\": \"≶\",\n\t\"lgE\": \"⪑\",\n\t\"lHar\": \"⥢\",\n\t\"lhard\": \"↽\",\n\t\"lharu\": \"↼\",\n\t\"lharul\": \"⥪\",\n\t\"lhblk\": \"▄\",\n\t\"LJcy\": \"Љ\",\n\t\"ljcy\": \"љ\",\n\t\"llarr\": \"⇇\",\n\t\"ll\": \"≪\",\n\t\"Ll\": \"⋘\",\n\t\"llcorner\": \"⌞\",\n\t\"Lleftarrow\": \"⇚\",\n\t\"llhard\": \"⥫\",\n\t\"lltri\": \"◺\",\n\t\"Lmidot\": \"Ŀ\",\n\t\"lmidot\": \"ŀ\",\n\t\"lmoustache\": \"⎰\",\n\t\"lmoust\": \"⎰\",\n\t\"lnap\": \"⪉\",\n\t\"lnapprox\": \"⪉\",\n\t\"lne\": \"⪇\",\n\t\"lnE\": \"≨\",\n\t\"lneq\": \"⪇\",\n\t\"lneqq\": \"≨\",\n\t\"lnsim\": \"⋦\",\n\t\"loang\": \"⟬\",\n\t\"loarr\": \"⇽\",\n\t\"lobrk\": \"⟦\",\n\t\"longleftarrow\": \"⟵\",\n\t\"LongLeftArrow\": \"⟵\",\n\t\"Longleftarrow\": \"⟸\",\n\t\"longleftrightarrow\": \"⟷\",\n\t\"LongLeftRightArrow\": \"⟷\",\n\t\"Longleftrightarrow\": \"⟺\",\n\t\"longmapsto\": \"⟼\",\n\t\"longrightarrow\": \"⟶\",\n\t\"LongRightArrow\": \"⟶\",\n\t\"Longrightarrow\": \"⟹\",\n\t\"looparrowleft\": \"↫\",\n\t\"looparrowright\": \"↬\",\n\t\"lopar\": \"⦅\",\n\t\"Lopf\": \"𝕃\",\n\t\"lopf\": \"𝕝\",\n\t\"loplus\": \"⨭\",\n\t\"lotimes\": \"⨴\",\n\t\"lowast\": \"∗\",\n\t\"lowbar\": \"_\",\n\t\"LowerLeftArrow\": \"↙\",\n\t\"LowerRightArrow\": \"↘\",\n\t\"loz\": \"◊\",\n\t\"lozenge\": \"◊\",\n\t\"lozf\": \"⧫\",\n\t\"lpar\": \"(\",\n\t\"lparlt\": \"⦓\",\n\t\"lrarr\": \"⇆\",\n\t\"lrcorner\": \"⌟\",\n\t\"lrhar\": \"⇋\",\n\t\"lrhard\": \"⥭\",\n\t\"lrm\": \"‎\",\n\t\"lrtri\": \"⊿\",\n\t\"lsaquo\": \"‹\",\n\t\"lscr\": \"𝓁\",\n\t\"Lscr\": \"ℒ\",\n\t\"lsh\": \"↰\",\n\t\"Lsh\": \"↰\",\n\t\"lsim\": \"≲\",\n\t\"lsime\": \"⪍\",\n\t\"lsimg\": \"⪏\",\n\t\"lsqb\": \"[\",\n\t\"lsquo\": \"‘\",\n\t\"lsquor\": \"‚\",\n\t\"Lstrok\": \"Ł\",\n\t\"lstrok\": \"ł\",\n\t\"ltcc\": \"⪦\",\n\t\"ltcir\": \"⩹\",\n\t\"lt\": \"<\",\n\t\"LT\": \"<\",\n\t\"Lt\": \"≪\",\n\t\"ltdot\": \"⋖\",\n\t\"lthree\": \"⋋\",\n\t\"ltimes\": \"⋉\",\n\t\"ltlarr\": \"⥶\",\n\t\"ltquest\": \"⩻\",\n\t\"ltri\": \"◃\",\n\t\"ltrie\": \"⊴\",\n\t\"ltrif\": \"◂\",\n\t\"ltrPar\": \"⦖\",\n\t\"lurdshar\": \"⥊\",\n\t\"luruhar\": \"⥦\",\n\t\"lvertneqq\": \"≨︀\",\n\t\"lvnE\": \"≨︀\",\n\t\"macr\": \"¯\",\n\t\"male\": \"♂\",\n\t\"malt\": \"✠\",\n\t\"maltese\": \"✠\",\n\t\"Map\": \"⤅\",\n\t\"map\": \"↦\",\n\t\"mapsto\": \"↦\",\n\t\"mapstodown\": \"↧\",\n\t\"mapstoleft\": \"↤\",\n\t\"mapstoup\": \"↥\",\n\t\"marker\": \"▮\",\n\t\"mcomma\": \"⨩\",\n\t\"Mcy\": \"М\",\n\t\"mcy\": \"м\",\n\t\"mdash\": \"—\",\n\t\"mDDot\": \"∺\",\n\t\"measuredangle\": \"∡\",\n\t\"MediumSpace\": \" \",\n\t\"Mellintrf\": \"ℳ\",\n\t\"Mfr\": \"𝔐\",\n\t\"mfr\": \"𝔪\",\n\t\"mho\": \"℧\",\n\t\"micro\": \"µ\",\n\t\"midast\": \"*\",\n\t\"midcir\": \"⫰\",\n\t\"mid\": \"∣\",\n\t\"middot\": \"·\",\n\t\"minusb\": \"⊟\",\n\t\"minus\": \"−\",\n\t\"minusd\": \"∸\",\n\t\"minusdu\": \"⨪\",\n\t\"MinusPlus\": \"∓\",\n\t\"mlcp\": \"⫛\",\n\t\"mldr\": \"…\",\n\t\"mnplus\": \"∓\",\n\t\"models\": \"⊧\",\n\t\"Mopf\": \"𝕄\",\n\t\"mopf\": \"𝕞\",\n\t\"mp\": \"∓\",\n\t\"mscr\": \"𝓂\",\n\t\"Mscr\": \"ℳ\",\n\t\"mstpos\": \"∾\",\n\t\"Mu\": \"Μ\",\n\t\"mu\": \"μ\",\n\t\"multimap\": \"⊸\",\n\t\"mumap\": \"⊸\",\n\t\"nabla\": \"∇\",\n\t\"Nacute\": \"Ń\",\n\t\"nacute\": \"ń\",\n\t\"nang\": \"∠⃒\",\n\t\"nap\": \"≉\",\n\t\"napE\": \"⩰̸\",\n\t\"napid\": \"≋̸\",\n\t\"napos\": \"ʼn\",\n\t\"napprox\": \"≉\",\n\t\"natural\": \"♮\",\n\t\"naturals\": \"ℕ\",\n\t\"natur\": \"♮\",\n\t\"nbsp\": \" \",\n\t\"nbump\": \"≎̸\",\n\t\"nbumpe\": \"≏̸\",\n\t\"ncap\": \"⩃\",\n\t\"Ncaron\": \"Ň\",\n\t\"ncaron\": \"ň\",\n\t\"Ncedil\": \"Ņ\",\n\t\"ncedil\": \"ņ\",\n\t\"ncong\": \"≇\",\n\t\"ncongdot\": \"⩭̸\",\n\t\"ncup\": \"⩂\",\n\t\"Ncy\": \"Н\",\n\t\"ncy\": \"н\",\n\t\"ndash\": \"–\",\n\t\"nearhk\": \"⤤\",\n\t\"nearr\": \"↗\",\n\t\"neArr\": \"⇗\",\n\t\"nearrow\": \"↗\",\n\t\"ne\": \"≠\",\n\t\"nedot\": \"≐̸\",\n\t\"NegativeMediumSpace\": \"​\",\n\t\"NegativeThickSpace\": \"​\",\n\t\"NegativeThinSpace\": \"​\",\n\t\"NegativeVeryThinSpace\": \"​\",\n\t\"nequiv\": \"≢\",\n\t\"nesear\": \"⤨\",\n\t\"nesim\": \"≂̸\",\n\t\"NestedGreaterGreater\": \"≫\",\n\t\"NestedLessLess\": \"≪\",\n\t\"NewLine\": \"\\n\",\n\t\"nexist\": \"∄\",\n\t\"nexists\": \"∄\",\n\t\"Nfr\": \"𝔑\",\n\t\"nfr\": \"𝔫\",\n\t\"ngE\": \"≧̸\",\n\t\"nge\": \"≱\",\n\t\"ngeq\": \"≱\",\n\t\"ngeqq\": \"≧̸\",\n\t\"ngeqslant\": \"⩾̸\",\n\t\"nges\": \"⩾̸\",\n\t\"nGg\": \"⋙̸\",\n\t\"ngsim\": \"≵\",\n\t\"nGt\": \"≫⃒\",\n\t\"ngt\": \"≯\",\n\t\"ngtr\": \"≯\",\n\t\"nGtv\": \"≫̸\",\n\t\"nharr\": \"↮\",\n\t\"nhArr\": \"⇎\",\n\t\"nhpar\": \"⫲\",\n\t\"ni\": \"∋\",\n\t\"nis\": \"⋼\",\n\t\"nisd\": \"⋺\",\n\t\"niv\": \"∋\",\n\t\"NJcy\": \"Њ\",\n\t\"njcy\": \"њ\",\n\t\"nlarr\": \"↚\",\n\t\"nlArr\": \"⇍\",\n\t\"nldr\": \"‥\",\n\t\"nlE\": \"≦̸\",\n\t\"nle\": \"≰\",\n\t\"nleftarrow\": \"↚\",\n\t\"nLeftarrow\": \"⇍\",\n\t\"nleftrightarrow\": \"↮\",\n\t\"nLeftrightarrow\": \"⇎\",\n\t\"nleq\": \"≰\",\n\t\"nleqq\": \"≦̸\",\n\t\"nleqslant\": \"⩽̸\",\n\t\"nles\": \"⩽̸\",\n\t\"nless\": \"≮\",\n\t\"nLl\": \"⋘̸\",\n\t\"nlsim\": \"≴\",\n\t\"nLt\": \"≪⃒\",\n\t\"nlt\": \"≮\",\n\t\"nltri\": \"⋪\",\n\t\"nltrie\": \"⋬\",\n\t\"nLtv\": \"≪̸\",\n\t\"nmid\": \"∤\",\n\t\"NoBreak\": \"⁠\",\n\t\"NonBreakingSpace\": \" \",\n\t\"nopf\": \"𝕟\",\n\t\"Nopf\": \"ℕ\",\n\t\"Not\": \"⫬\",\n\t\"not\": \"¬\",\n\t\"NotCongruent\": \"≢\",\n\t\"NotCupCap\": \"≭\",\n\t\"NotDoubleVerticalBar\": \"∦\",\n\t\"NotElement\": \"∉\",\n\t\"NotEqual\": \"≠\",\n\t\"NotEqualTilde\": \"≂̸\",\n\t\"NotExists\": \"∄\",\n\t\"NotGreater\": \"≯\",\n\t\"NotGreaterEqual\": \"≱\",\n\t\"NotGreaterFullEqual\": \"≧̸\",\n\t\"NotGreaterGreater\": \"≫̸\",\n\t\"NotGreaterLess\": \"≹\",\n\t\"NotGreaterSlantEqual\": \"⩾̸\",\n\t\"NotGreaterTilde\": \"≵\",\n\t\"NotHumpDownHump\": \"≎̸\",\n\t\"NotHumpEqual\": \"≏̸\",\n\t\"notin\": \"∉\",\n\t\"notindot\": \"⋵̸\",\n\t\"notinE\": \"⋹̸\",\n\t\"notinva\": \"∉\",\n\t\"notinvb\": \"⋷\",\n\t\"notinvc\": \"⋶\",\n\t\"NotLeftTriangleBar\": \"⧏̸\",\n\t\"NotLeftTriangle\": \"⋪\",\n\t\"NotLeftTriangleEqual\": \"⋬\",\n\t\"NotLess\": \"≮\",\n\t\"NotLessEqual\": \"≰\",\n\t\"NotLessGreater\": \"≸\",\n\t\"NotLessLess\": \"≪̸\",\n\t\"NotLessSlantEqual\": \"⩽̸\",\n\t\"NotLessTilde\": \"≴\",\n\t\"NotNestedGreaterGreater\": \"⪢̸\",\n\t\"NotNestedLessLess\": \"⪡̸\",\n\t\"notni\": \"∌\",\n\t\"notniva\": \"∌\",\n\t\"notnivb\": \"⋾\",\n\t\"notnivc\": \"⋽\",\n\t\"NotPrecedes\": \"⊀\",\n\t\"NotPrecedesEqual\": \"⪯̸\",\n\t\"NotPrecedesSlantEqual\": \"⋠\",\n\t\"NotReverseElement\": \"∌\",\n\t\"NotRightTriangleBar\": \"⧐̸\",\n\t\"NotRightTriangle\": \"⋫\",\n\t\"NotRightTriangleEqual\": \"⋭\",\n\t\"NotSquareSubset\": \"⊏̸\",\n\t\"NotSquareSubsetEqual\": \"⋢\",\n\t\"NotSquareSuperset\": \"⊐̸\",\n\t\"NotSquareSupersetEqual\": \"⋣\",\n\t\"NotSubset\": \"⊂⃒\",\n\t\"NotSubsetEqual\": \"⊈\",\n\t\"NotSucceeds\": \"⊁\",\n\t\"NotSucceedsEqual\": \"⪰̸\",\n\t\"NotSucceedsSlantEqual\": \"⋡\",\n\t\"NotSucceedsTilde\": \"≿̸\",\n\t\"NotSuperset\": \"⊃⃒\",\n\t\"NotSupersetEqual\": \"⊉\",\n\t\"NotTilde\": \"≁\",\n\t\"NotTildeEqual\": \"≄\",\n\t\"NotTildeFullEqual\": \"≇\",\n\t\"NotTildeTilde\": \"≉\",\n\t\"NotVerticalBar\": \"∤\",\n\t\"nparallel\": \"∦\",\n\t\"npar\": \"∦\",\n\t\"nparsl\": \"⫽⃥\",\n\t\"npart\": \"∂̸\",\n\t\"npolint\": \"⨔\",\n\t\"npr\": \"⊀\",\n\t\"nprcue\": \"⋠\",\n\t\"nprec\": \"⊀\",\n\t\"npreceq\": \"⪯̸\",\n\t\"npre\": \"⪯̸\",\n\t\"nrarrc\": \"⤳̸\",\n\t\"nrarr\": \"↛\",\n\t\"nrArr\": \"⇏\",\n\t\"nrarrw\": \"↝̸\",\n\t\"nrightarrow\": \"↛\",\n\t\"nRightarrow\": \"⇏\",\n\t\"nrtri\": \"⋫\",\n\t\"nrtrie\": \"⋭\",\n\t\"nsc\": \"⊁\",\n\t\"nsccue\": \"⋡\",\n\t\"nsce\": \"⪰̸\",\n\t\"Nscr\": \"𝒩\",\n\t\"nscr\": \"𝓃\",\n\t\"nshortmid\": \"∤\",\n\t\"nshortparallel\": \"∦\",\n\t\"nsim\": \"≁\",\n\t\"nsime\": \"≄\",\n\t\"nsimeq\": \"≄\",\n\t\"nsmid\": \"∤\",\n\t\"nspar\": \"∦\",\n\t\"nsqsube\": \"⋢\",\n\t\"nsqsupe\": \"⋣\",\n\t\"nsub\": \"⊄\",\n\t\"nsubE\": \"⫅̸\",\n\t\"nsube\": \"⊈\",\n\t\"nsubset\": \"⊂⃒\",\n\t\"nsubseteq\": \"⊈\",\n\t\"nsubseteqq\": \"⫅̸\",\n\t\"nsucc\": \"⊁\",\n\t\"nsucceq\": \"⪰̸\",\n\t\"nsup\": \"⊅\",\n\t\"nsupE\": \"⫆̸\",\n\t\"nsupe\": \"⊉\",\n\t\"nsupset\": \"⊃⃒\",\n\t\"nsupseteq\": \"⊉\",\n\t\"nsupseteqq\": \"⫆̸\",\n\t\"ntgl\": \"≹\",\n\t\"Ntilde\": \"Ñ\",\n\t\"ntilde\": \"ñ\",\n\t\"ntlg\": \"≸\",\n\t\"ntriangleleft\": \"⋪\",\n\t\"ntrianglelefteq\": \"⋬\",\n\t\"ntriangleright\": \"⋫\",\n\t\"ntrianglerighteq\": \"⋭\",\n\t\"Nu\": \"Ν\",\n\t\"nu\": \"ν\",\n\t\"num\": \"#\",\n\t\"numero\": \"№\",\n\t\"numsp\": \" \",\n\t\"nvap\": \"≍⃒\",\n\t\"nvdash\": \"⊬\",\n\t\"nvDash\": \"⊭\",\n\t\"nVdash\": \"⊮\",\n\t\"nVDash\": \"⊯\",\n\t\"nvge\": \"≥⃒\",\n\t\"nvgt\": \">⃒\",\n\t\"nvHarr\": \"⤄\",\n\t\"nvinfin\": \"⧞\",\n\t\"nvlArr\": \"⤂\",\n\t\"nvle\": \"≤⃒\",\n\t\"nvlt\": \"<⃒\",\n\t\"nvltrie\": \"⊴⃒\",\n\t\"nvrArr\": \"⤃\",\n\t\"nvrtrie\": \"⊵⃒\",\n\t\"nvsim\": \"∼⃒\",\n\t\"nwarhk\": \"⤣\",\n\t\"nwarr\": \"↖\",\n\t\"nwArr\": \"⇖\",\n\t\"nwarrow\": \"↖\",\n\t\"nwnear\": \"⤧\",\n\t\"Oacute\": \"Ó\",\n\t\"oacute\": \"ó\",\n\t\"oast\": \"⊛\",\n\t\"Ocirc\": \"Ô\",\n\t\"ocirc\": \"ô\",\n\t\"ocir\": \"⊚\",\n\t\"Ocy\": \"О\",\n\t\"ocy\": \"о\",\n\t\"odash\": \"⊝\",\n\t\"Odblac\": \"Ő\",\n\t\"odblac\": \"ő\",\n\t\"odiv\": \"⨸\",\n\t\"odot\": \"⊙\",\n\t\"odsold\": \"⦼\",\n\t\"OElig\": \"Œ\",\n\t\"oelig\": \"œ\",\n\t\"ofcir\": \"⦿\",\n\t\"Ofr\": \"𝔒\",\n\t\"ofr\": \"𝔬\",\n\t\"ogon\": \"˛\",\n\t\"Ograve\": \"Ò\",\n\t\"ograve\": \"ò\",\n\t\"ogt\": \"⧁\",\n\t\"ohbar\": \"⦵\",\n\t\"ohm\": \"Ω\",\n\t\"oint\": \"∮\",\n\t\"olarr\": \"↺\",\n\t\"olcir\": \"⦾\",\n\t\"olcross\": \"⦻\",\n\t\"oline\": \"‾\",\n\t\"olt\": \"⧀\",\n\t\"Omacr\": \"Ō\",\n\t\"omacr\": \"ō\",\n\t\"Omega\": \"Ω\",\n\t\"omega\": \"ω\",\n\t\"Omicron\": \"Ο\",\n\t\"omicron\": \"ο\",\n\t\"omid\": \"⦶\",\n\t\"ominus\": \"⊖\",\n\t\"Oopf\": \"𝕆\",\n\t\"oopf\": \"𝕠\",\n\t\"opar\": \"⦷\",\n\t\"OpenCurlyDoubleQuote\": \"“\",\n\t\"OpenCurlyQuote\": \"‘\",\n\t\"operp\": \"⦹\",\n\t\"oplus\": \"⊕\",\n\t\"orarr\": \"↻\",\n\t\"Or\": \"⩔\",\n\t\"or\": \"∨\",\n\t\"ord\": \"⩝\",\n\t\"order\": \"ℴ\",\n\t\"orderof\": \"ℴ\",\n\t\"ordf\": \"ª\",\n\t\"ordm\": \"º\",\n\t\"origof\": \"⊶\",\n\t\"oror\": \"⩖\",\n\t\"orslope\": \"⩗\",\n\t\"orv\": \"⩛\",\n\t\"oS\": \"Ⓢ\",\n\t\"Oscr\": \"𝒪\",\n\t\"oscr\": \"ℴ\",\n\t\"Oslash\": \"Ø\",\n\t\"oslash\": \"ø\",\n\t\"osol\": \"⊘\",\n\t\"Otilde\": \"Õ\",\n\t\"otilde\": \"õ\",\n\t\"otimesas\": \"⨶\",\n\t\"Otimes\": \"⨷\",\n\t\"otimes\": \"⊗\",\n\t\"Ouml\": \"Ö\",\n\t\"ouml\": \"ö\",\n\t\"ovbar\": \"⌽\",\n\t\"OverBar\": \"‾\",\n\t\"OverBrace\": \"⏞\",\n\t\"OverBracket\": \"⎴\",\n\t\"OverParenthesis\": \"⏜\",\n\t\"para\": \"¶\",\n\t\"parallel\": \"∥\",\n\t\"par\": \"∥\",\n\t\"parsim\": \"⫳\",\n\t\"parsl\": \"⫽\",\n\t\"part\": \"∂\",\n\t\"PartialD\": \"∂\",\n\t\"Pcy\": \"П\",\n\t\"pcy\": \"п\",\n\t\"percnt\": \"%\",\n\t\"period\": \".\",\n\t\"permil\": \"‰\",\n\t\"perp\": \"⊥\",\n\t\"pertenk\": \"‱\",\n\t\"Pfr\": \"𝔓\",\n\t\"pfr\": \"𝔭\",\n\t\"Phi\": \"Φ\",\n\t\"phi\": \"φ\",\n\t\"phiv\": \"ϕ\",\n\t\"phmmat\": \"ℳ\",\n\t\"phone\": \"☎\",\n\t\"Pi\": \"Π\",\n\t\"pi\": \"π\",\n\t\"pitchfork\": \"⋔\",\n\t\"piv\": \"ϖ\",\n\t\"planck\": \"ℏ\",\n\t\"planckh\": \"ℎ\",\n\t\"plankv\": \"ℏ\",\n\t\"plusacir\": \"⨣\",\n\t\"plusb\": \"⊞\",\n\t\"pluscir\": \"⨢\",\n\t\"plus\": \"+\",\n\t\"plusdo\": \"∔\",\n\t\"plusdu\": \"⨥\",\n\t\"pluse\": \"⩲\",\n\t\"PlusMinus\": \"±\",\n\t\"plusmn\": \"±\",\n\t\"plussim\": \"⨦\",\n\t\"plustwo\": \"⨧\",\n\t\"pm\": \"±\",\n\t\"Poincareplane\": \"ℌ\",\n\t\"pointint\": \"⨕\",\n\t\"popf\": \"𝕡\",\n\t\"Popf\": \"ℙ\",\n\t\"pound\": \"£\",\n\t\"prap\": \"⪷\",\n\t\"Pr\": \"⪻\",\n\t\"pr\": \"≺\",\n\t\"prcue\": \"≼\",\n\t\"precapprox\": \"⪷\",\n\t\"prec\": \"≺\",\n\t\"preccurlyeq\": \"≼\",\n\t\"Precedes\": \"≺\",\n\t\"PrecedesEqual\": \"⪯\",\n\t\"PrecedesSlantEqual\": \"≼\",\n\t\"PrecedesTilde\": \"≾\",\n\t\"preceq\": \"⪯\",\n\t\"precnapprox\": \"⪹\",\n\t\"precneqq\": \"⪵\",\n\t\"precnsim\": \"⋨\",\n\t\"pre\": \"⪯\",\n\t\"prE\": \"⪳\",\n\t\"precsim\": \"≾\",\n\t\"prime\": \"′\",\n\t\"Prime\": \"″\",\n\t\"primes\": \"ℙ\",\n\t\"prnap\": \"⪹\",\n\t\"prnE\": \"⪵\",\n\t\"prnsim\": \"⋨\",\n\t\"prod\": \"∏\",\n\t\"Product\": \"∏\",\n\t\"profalar\": \"⌮\",\n\t\"profline\": \"⌒\",\n\t\"profsurf\": \"⌓\",\n\t\"prop\": \"∝\",\n\t\"Proportional\": \"∝\",\n\t\"Proportion\": \"∷\",\n\t\"propto\": \"∝\",\n\t\"prsim\": \"≾\",\n\t\"prurel\": \"⊰\",\n\t\"Pscr\": \"𝒫\",\n\t\"pscr\": \"𝓅\",\n\t\"Psi\": \"Ψ\",\n\t\"psi\": \"ψ\",\n\t\"puncsp\": \" \",\n\t\"Qfr\": \"𝔔\",\n\t\"qfr\": \"𝔮\",\n\t\"qint\": \"⨌\",\n\t\"qopf\": \"𝕢\",\n\t\"Qopf\": \"ℚ\",\n\t\"qprime\": \"⁗\",\n\t\"Qscr\": \"𝒬\",\n\t\"qscr\": \"𝓆\",\n\t\"quaternions\": \"ℍ\",\n\t\"quatint\": \"⨖\",\n\t\"quest\": \"?\",\n\t\"questeq\": \"≟\",\n\t\"quot\": \"\\\"\",\n\t\"QUOT\": \"\\\"\",\n\t\"rAarr\": \"⇛\",\n\t\"race\": \"∽̱\",\n\t\"Racute\": \"Ŕ\",\n\t\"racute\": \"ŕ\",\n\t\"radic\": \"√\",\n\t\"raemptyv\": \"⦳\",\n\t\"rang\": \"⟩\",\n\t\"Rang\": \"⟫\",\n\t\"rangd\": \"⦒\",\n\t\"range\": \"⦥\",\n\t\"rangle\": \"⟩\",\n\t\"raquo\": \"»\",\n\t\"rarrap\": \"⥵\",\n\t\"rarrb\": \"⇥\",\n\t\"rarrbfs\": \"⤠\",\n\t\"rarrc\": \"⤳\",\n\t\"rarr\": \"→\",\n\t\"Rarr\": \"↠\",\n\t\"rArr\": \"⇒\",\n\t\"rarrfs\": \"⤞\",\n\t\"rarrhk\": \"↪\",\n\t\"rarrlp\": \"↬\",\n\t\"rarrpl\": \"⥅\",\n\t\"rarrsim\": \"⥴\",\n\t\"Rarrtl\": \"⤖\",\n\t\"rarrtl\": \"↣\",\n\t\"rarrw\": \"↝\",\n\t\"ratail\": \"⤚\",\n\t\"rAtail\": \"⤜\",\n\t\"ratio\": \"∶\",\n\t\"rationals\": \"ℚ\",\n\t\"rbarr\": \"⤍\",\n\t\"rBarr\": \"⤏\",\n\t\"RBarr\": \"⤐\",\n\t\"rbbrk\": \"❳\",\n\t\"rbrace\": \"}\",\n\t\"rbrack\": \"]\",\n\t\"rbrke\": \"⦌\",\n\t\"rbrksld\": \"⦎\",\n\t\"rbrkslu\": \"⦐\",\n\t\"Rcaron\": \"Ř\",\n\t\"rcaron\": \"ř\",\n\t\"Rcedil\": \"Ŗ\",\n\t\"rcedil\": \"ŗ\",\n\t\"rceil\": \"⌉\",\n\t\"rcub\": \"}\",\n\t\"Rcy\": \"Р\",\n\t\"rcy\": \"р\",\n\t\"rdca\": \"⤷\",\n\t\"rdldhar\": \"⥩\",\n\t\"rdquo\": \"”\",\n\t\"rdquor\": \"”\",\n\t\"rdsh\": \"↳\",\n\t\"real\": \"ℜ\",\n\t\"realine\": \"ℛ\",\n\t\"realpart\": \"ℜ\",\n\t\"reals\": \"ℝ\",\n\t\"Re\": \"ℜ\",\n\t\"rect\": \"▭\",\n\t\"reg\": \"®\",\n\t\"REG\": \"®\",\n\t\"ReverseElement\": \"∋\",\n\t\"ReverseEquilibrium\": \"⇋\",\n\t\"ReverseUpEquilibrium\": \"⥯\",\n\t\"rfisht\": \"⥽\",\n\t\"rfloor\": \"⌋\",\n\t\"rfr\": \"𝔯\",\n\t\"Rfr\": \"ℜ\",\n\t\"rHar\": \"⥤\",\n\t\"rhard\": \"⇁\",\n\t\"rharu\": \"⇀\",\n\t\"rharul\": \"⥬\",\n\t\"Rho\": \"Ρ\",\n\t\"rho\": \"ρ\",\n\t\"rhov\": \"ϱ\",\n\t\"RightAngleBracket\": \"⟩\",\n\t\"RightArrowBar\": \"⇥\",\n\t\"rightarrow\": \"→\",\n\t\"RightArrow\": \"→\",\n\t\"Rightarrow\": \"⇒\",\n\t\"RightArrowLeftArrow\": \"⇄\",\n\t\"rightarrowtail\": \"↣\",\n\t\"RightCeiling\": \"⌉\",\n\t\"RightDoubleBracket\": \"⟧\",\n\t\"RightDownTeeVector\": \"⥝\",\n\t\"RightDownVectorBar\": \"⥕\",\n\t\"RightDownVector\": \"⇂\",\n\t\"RightFloor\": \"⌋\",\n\t\"rightharpoondown\": \"⇁\",\n\t\"rightharpoonup\": \"⇀\",\n\t\"rightleftarrows\": \"⇄\",\n\t\"rightleftharpoons\": \"⇌\",\n\t\"rightrightarrows\": \"⇉\",\n\t\"rightsquigarrow\": \"↝\",\n\t\"RightTeeArrow\": \"↦\",\n\t\"RightTee\": \"⊢\",\n\t\"RightTeeVector\": \"⥛\",\n\t\"rightthreetimes\": \"⋌\",\n\t\"RightTriangleBar\": \"⧐\",\n\t\"RightTriangle\": \"⊳\",\n\t\"RightTriangleEqual\": \"⊵\",\n\t\"RightUpDownVector\": \"⥏\",\n\t\"RightUpTeeVector\": \"⥜\",\n\t\"RightUpVectorBar\": \"⥔\",\n\t\"RightUpVector\": \"↾\",\n\t\"RightVectorBar\": \"⥓\",\n\t\"RightVector\": \"⇀\",\n\t\"ring\": \"˚\",\n\t\"risingdotseq\": \"≓\",\n\t\"rlarr\": \"⇄\",\n\t\"rlhar\": \"⇌\",\n\t\"rlm\": \"‏\",\n\t\"rmoustache\": \"⎱\",\n\t\"rmoust\": \"⎱\",\n\t\"rnmid\": \"⫮\",\n\t\"roang\": \"⟭\",\n\t\"roarr\": \"⇾\",\n\t\"robrk\": \"⟧\",\n\t\"ropar\": \"⦆\",\n\t\"ropf\": \"𝕣\",\n\t\"Ropf\": \"ℝ\",\n\t\"roplus\": \"⨮\",\n\t\"rotimes\": \"⨵\",\n\t\"RoundImplies\": \"⥰\",\n\t\"rpar\": \")\",\n\t\"rpargt\": \"⦔\",\n\t\"rppolint\": \"⨒\",\n\t\"rrarr\": \"⇉\",\n\t\"Rrightarrow\": \"⇛\",\n\t\"rsaquo\": \"›\",\n\t\"rscr\": \"𝓇\",\n\t\"Rscr\": \"ℛ\",\n\t\"rsh\": \"↱\",\n\t\"Rsh\": \"↱\",\n\t\"rsqb\": \"]\",\n\t\"rsquo\": \"’\",\n\t\"rsquor\": \"’\",\n\t\"rthree\": \"⋌\",\n\t\"rtimes\": \"⋊\",\n\t\"rtri\": \"▹\",\n\t\"rtrie\": \"⊵\",\n\t\"rtrif\": \"▸\",\n\t\"rtriltri\": \"⧎\",\n\t\"RuleDelayed\": \"⧴\",\n\t\"ruluhar\": \"⥨\",\n\t\"rx\": \"℞\",\n\t\"Sacute\": \"Ś\",\n\t\"sacute\": \"ś\",\n\t\"sbquo\": \"‚\",\n\t\"scap\": \"⪸\",\n\t\"Scaron\": \"Š\",\n\t\"scaron\": \"š\",\n\t\"Sc\": \"⪼\",\n\t\"sc\": \"≻\",\n\t\"sccue\": \"≽\",\n\t\"sce\": \"⪰\",\n\t\"scE\": \"⪴\",\n\t\"Scedil\": \"Ş\",\n\t\"scedil\": \"ş\",\n\t\"Scirc\": \"Ŝ\",\n\t\"scirc\": \"ŝ\",\n\t\"scnap\": \"⪺\",\n\t\"scnE\": \"⪶\",\n\t\"scnsim\": \"⋩\",\n\t\"scpolint\": \"⨓\",\n\t\"scsim\": \"≿\",\n\t\"Scy\": \"С\",\n\t\"scy\": \"с\",\n\t\"sdotb\": \"⊡\",\n\t\"sdot\": \"⋅\",\n\t\"sdote\": \"⩦\",\n\t\"searhk\": \"⤥\",\n\t\"searr\": \"↘\",\n\t\"seArr\": \"⇘\",\n\t\"searrow\": \"↘\",\n\t\"sect\": \"§\",\n\t\"semi\": \";\",\n\t\"seswar\": \"⤩\",\n\t\"setminus\": \"∖\",\n\t\"setmn\": \"∖\",\n\t\"sext\": \"✶\",\n\t\"Sfr\": \"𝔖\",\n\t\"sfr\": \"𝔰\",\n\t\"sfrown\": \"⌢\",\n\t\"sharp\": \"♯\",\n\t\"SHCHcy\": \"Щ\",\n\t\"shchcy\": \"щ\",\n\t\"SHcy\": \"Ш\",\n\t\"shcy\": \"ш\",\n\t\"ShortDownArrow\": \"↓\",\n\t\"ShortLeftArrow\": \"←\",\n\t\"shortmid\": \"∣\",\n\t\"shortparallel\": \"∥\",\n\t\"ShortRightArrow\": \"→\",\n\t\"ShortUpArrow\": \"↑\",\n\t\"shy\": \"­\",\n\t\"Sigma\": \"Σ\",\n\t\"sigma\": \"σ\",\n\t\"sigmaf\": \"ς\",\n\t\"sigmav\": \"ς\",\n\t\"sim\": \"∼\",\n\t\"simdot\": \"⩪\",\n\t\"sime\": \"≃\",\n\t\"simeq\": \"≃\",\n\t\"simg\": \"⪞\",\n\t\"simgE\": \"⪠\",\n\t\"siml\": \"⪝\",\n\t\"simlE\": \"⪟\",\n\t\"simne\": \"≆\",\n\t\"simplus\": \"⨤\",\n\t\"simrarr\": \"⥲\",\n\t\"slarr\": \"←\",\n\t\"SmallCircle\": \"∘\",\n\t\"smallsetminus\": \"∖\",\n\t\"smashp\": \"⨳\",\n\t\"smeparsl\": \"⧤\",\n\t\"smid\": \"∣\",\n\t\"smile\": \"⌣\",\n\t\"smt\": \"⪪\",\n\t\"smte\": \"⪬\",\n\t\"smtes\": \"⪬︀\",\n\t\"SOFTcy\": \"Ь\",\n\t\"softcy\": \"ь\",\n\t\"solbar\": \"⌿\",\n\t\"solb\": \"⧄\",\n\t\"sol\": \"/\",\n\t\"Sopf\": \"𝕊\",\n\t\"sopf\": \"𝕤\",\n\t\"spades\": \"♠\",\n\t\"spadesuit\": \"♠\",\n\t\"spar\": \"∥\",\n\t\"sqcap\": \"⊓\",\n\t\"sqcaps\": \"⊓︀\",\n\t\"sqcup\": \"⊔\",\n\t\"sqcups\": \"⊔︀\",\n\t\"Sqrt\": \"√\",\n\t\"sqsub\": \"⊏\",\n\t\"sqsube\": \"⊑\",\n\t\"sqsubset\": \"⊏\",\n\t\"sqsubseteq\": \"⊑\",\n\t\"sqsup\": \"⊐\",\n\t\"sqsupe\": \"⊒\",\n\t\"sqsupset\": \"⊐\",\n\t\"sqsupseteq\": \"⊒\",\n\t\"square\": \"□\",\n\t\"Square\": \"□\",\n\t\"SquareIntersection\": \"⊓\",\n\t\"SquareSubset\": \"⊏\",\n\t\"SquareSubsetEqual\": \"⊑\",\n\t\"SquareSuperset\": \"⊐\",\n\t\"SquareSupersetEqual\": \"⊒\",\n\t\"SquareUnion\": \"⊔\",\n\t\"squarf\": \"▪\",\n\t\"squ\": \"□\",\n\t\"squf\": \"▪\",\n\t\"srarr\": \"→\",\n\t\"Sscr\": \"𝒮\",\n\t\"sscr\": \"𝓈\",\n\t\"ssetmn\": \"∖\",\n\t\"ssmile\": \"⌣\",\n\t\"sstarf\": \"⋆\",\n\t\"Star\": \"⋆\",\n\t\"star\": \"☆\",\n\t\"starf\": \"★\",\n\t\"straightepsilon\": \"ϵ\",\n\t\"straightphi\": \"ϕ\",\n\t\"strns\": \"¯\",\n\t\"sub\": \"⊂\",\n\t\"Sub\": \"⋐\",\n\t\"subdot\": \"⪽\",\n\t\"subE\": \"⫅\",\n\t\"sube\": \"⊆\",\n\t\"subedot\": \"⫃\",\n\t\"submult\": \"⫁\",\n\t\"subnE\": \"⫋\",\n\t\"subne\": \"⊊\",\n\t\"subplus\": \"⪿\",\n\t\"subrarr\": \"⥹\",\n\t\"subset\": \"⊂\",\n\t\"Subset\": \"⋐\",\n\t\"subseteq\": \"⊆\",\n\t\"subseteqq\": \"⫅\",\n\t\"SubsetEqual\": \"⊆\",\n\t\"subsetneq\": \"⊊\",\n\t\"subsetneqq\": \"⫋\",\n\t\"subsim\": \"⫇\",\n\t\"subsub\": \"⫕\",\n\t\"subsup\": \"⫓\",\n\t\"succapprox\": \"⪸\",\n\t\"succ\": \"≻\",\n\t\"succcurlyeq\": \"≽\",\n\t\"Succeeds\": \"≻\",\n\t\"SucceedsEqual\": \"⪰\",\n\t\"SucceedsSlantEqual\": \"≽\",\n\t\"SucceedsTilde\": \"≿\",\n\t\"succeq\": \"⪰\",\n\t\"succnapprox\": \"⪺\",\n\t\"succneqq\": \"⪶\",\n\t\"succnsim\": \"⋩\",\n\t\"succsim\": \"≿\",\n\t\"SuchThat\": \"∋\",\n\t\"sum\": \"∑\",\n\t\"Sum\": \"∑\",\n\t\"sung\": \"♪\",\n\t\"sup1\": \"¹\",\n\t\"sup2\": \"²\",\n\t\"sup3\": \"³\",\n\t\"sup\": \"⊃\",\n\t\"Sup\": \"⋑\",\n\t\"supdot\": \"⪾\",\n\t\"supdsub\": \"⫘\",\n\t\"supE\": \"⫆\",\n\t\"supe\": \"⊇\",\n\t\"supedot\": \"⫄\",\n\t\"Superset\": \"⊃\",\n\t\"SupersetEqual\": \"⊇\",\n\t\"suphsol\": \"⟉\",\n\t\"suphsub\": \"⫗\",\n\t\"suplarr\": \"⥻\",\n\t\"supmult\": \"⫂\",\n\t\"supnE\": \"⫌\",\n\t\"supne\": \"⊋\",\n\t\"supplus\": \"⫀\",\n\t\"supset\": \"⊃\",\n\t\"Supset\": \"⋑\",\n\t\"supseteq\": \"⊇\",\n\t\"supseteqq\": \"⫆\",\n\t\"supsetneq\": \"⊋\",\n\t\"supsetneqq\": \"⫌\",\n\t\"supsim\": \"⫈\",\n\t\"supsub\": \"⫔\",\n\t\"supsup\": \"⫖\",\n\t\"swarhk\": \"⤦\",\n\t\"swarr\": \"↙\",\n\t\"swArr\": \"⇙\",\n\t\"swarrow\": \"↙\",\n\t\"swnwar\": \"⤪\",\n\t\"szlig\": \"ß\",\n\t\"Tab\": \"\\t\",\n\t\"target\": \"⌖\",\n\t\"Tau\": \"Τ\",\n\t\"tau\": \"τ\",\n\t\"tbrk\": \"⎴\",\n\t\"Tcaron\": \"Ť\",\n\t\"tcaron\": \"ť\",\n\t\"Tcedil\": \"Ţ\",\n\t\"tcedil\": \"ţ\",\n\t\"Tcy\": \"Т\",\n\t\"tcy\": \"т\",\n\t\"tdot\": \"⃛\",\n\t\"telrec\": \"⌕\",\n\t\"Tfr\": \"𝔗\",\n\t\"tfr\": \"𝔱\",\n\t\"there4\": \"∴\",\n\t\"therefore\": \"∴\",\n\t\"Therefore\": \"∴\",\n\t\"Theta\": \"Θ\",\n\t\"theta\": \"θ\",\n\t\"thetasym\": \"ϑ\",\n\t\"thetav\": \"ϑ\",\n\t\"thickapprox\": \"≈\",\n\t\"thicksim\": \"∼\",\n\t\"ThickSpace\": \"  \",\n\t\"ThinSpace\": \" \",\n\t\"thinsp\": \" \",\n\t\"thkap\": \"≈\",\n\t\"thksim\": \"∼\",\n\t\"THORN\": \"Þ\",\n\t\"thorn\": \"þ\",\n\t\"tilde\": \"˜\",\n\t\"Tilde\": \"∼\",\n\t\"TildeEqual\": \"≃\",\n\t\"TildeFullEqual\": \"≅\",\n\t\"TildeTilde\": \"≈\",\n\t\"timesbar\": \"⨱\",\n\t\"timesb\": \"⊠\",\n\t\"times\": \"×\",\n\t\"timesd\": \"⨰\",\n\t\"tint\": \"∭\",\n\t\"toea\": \"⤨\",\n\t\"topbot\": \"⌶\",\n\t\"topcir\": \"⫱\",\n\t\"top\": \"⊤\",\n\t\"Topf\": \"𝕋\",\n\t\"topf\": \"𝕥\",\n\t\"topfork\": \"⫚\",\n\t\"tosa\": \"⤩\",\n\t\"tprime\": \"‴\",\n\t\"trade\": \"™\",\n\t\"TRADE\": \"™\",\n\t\"triangle\": \"▵\",\n\t\"triangledown\": \"▿\",\n\t\"triangleleft\": \"◃\",\n\t\"trianglelefteq\": \"⊴\",\n\t\"triangleq\": \"≜\",\n\t\"triangleright\": \"▹\",\n\t\"trianglerighteq\": \"⊵\",\n\t\"tridot\": \"◬\",\n\t\"trie\": \"≜\",\n\t\"triminus\": \"⨺\",\n\t\"TripleDot\": \"⃛\",\n\t\"triplus\": \"⨹\",\n\t\"trisb\": \"⧍\",\n\t\"tritime\": \"⨻\",\n\t\"trpezium\": \"⏢\",\n\t\"Tscr\": \"𝒯\",\n\t\"tscr\": \"𝓉\",\n\t\"TScy\": \"Ц\",\n\t\"tscy\": \"ц\",\n\t\"TSHcy\": \"Ћ\",\n\t\"tshcy\": \"ћ\",\n\t\"Tstrok\": \"Ŧ\",\n\t\"tstrok\": \"ŧ\",\n\t\"twixt\": \"≬\",\n\t\"twoheadleftarrow\": \"↞\",\n\t\"twoheadrightarrow\": \"↠\",\n\t\"Uacute\": \"Ú\",\n\t\"uacute\": \"ú\",\n\t\"uarr\": \"↑\",\n\t\"Uarr\": \"↟\",\n\t\"uArr\": \"⇑\",\n\t\"Uarrocir\": \"⥉\",\n\t\"Ubrcy\": \"Ў\",\n\t\"ubrcy\": \"ў\",\n\t\"Ubreve\": \"Ŭ\",\n\t\"ubreve\": \"ŭ\",\n\t\"Ucirc\": \"Û\",\n\t\"ucirc\": \"û\",\n\t\"Ucy\": \"У\",\n\t\"ucy\": \"у\",\n\t\"udarr\": \"⇅\",\n\t\"Udblac\": \"Ű\",\n\t\"udblac\": \"ű\",\n\t\"udhar\": \"⥮\",\n\t\"ufisht\": \"⥾\",\n\t\"Ufr\": \"𝔘\",\n\t\"ufr\": \"𝔲\",\n\t\"Ugrave\": \"Ù\",\n\t\"ugrave\": \"ù\",\n\t\"uHar\": \"⥣\",\n\t\"uharl\": \"↿\",\n\t\"uharr\": \"↾\",\n\t\"uhblk\": \"▀\",\n\t\"ulcorn\": \"⌜\",\n\t\"ulcorner\": \"⌜\",\n\t\"ulcrop\": \"⌏\",\n\t\"ultri\": \"◸\",\n\t\"Umacr\": \"Ū\",\n\t\"umacr\": \"ū\",\n\t\"uml\": \"¨\",\n\t\"UnderBar\": \"_\",\n\t\"UnderBrace\": \"⏟\",\n\t\"UnderBracket\": \"⎵\",\n\t\"UnderParenthesis\": \"⏝\",\n\t\"Union\": \"⋃\",\n\t\"UnionPlus\": \"⊎\",\n\t\"Uogon\": \"Ų\",\n\t\"uogon\": \"ų\",\n\t\"Uopf\": \"𝕌\",\n\t\"uopf\": \"𝕦\",\n\t\"UpArrowBar\": \"⤒\",\n\t\"uparrow\": \"↑\",\n\t\"UpArrow\": \"↑\",\n\t\"Uparrow\": \"⇑\",\n\t\"UpArrowDownArrow\": \"⇅\",\n\t\"updownarrow\": \"↕\",\n\t\"UpDownArrow\": \"↕\",\n\t\"Updownarrow\": \"⇕\",\n\t\"UpEquilibrium\": \"⥮\",\n\t\"upharpoonleft\": \"↿\",\n\t\"upharpoonright\": \"↾\",\n\t\"uplus\": \"⊎\",\n\t\"UpperLeftArrow\": \"↖\",\n\t\"UpperRightArrow\": \"↗\",\n\t\"upsi\": \"υ\",\n\t\"Upsi\": \"ϒ\",\n\t\"upsih\": \"ϒ\",\n\t\"Upsilon\": \"Υ\",\n\t\"upsilon\": \"υ\",\n\t\"UpTeeArrow\": \"↥\",\n\t\"UpTee\": \"⊥\",\n\t\"upuparrows\": \"⇈\",\n\t\"urcorn\": \"⌝\",\n\t\"urcorner\": \"⌝\",\n\t\"urcrop\": \"⌎\",\n\t\"Uring\": \"Ů\",\n\t\"uring\": \"ů\",\n\t\"urtri\": \"◹\",\n\t\"Uscr\": \"𝒰\",\n\t\"uscr\": \"𝓊\",\n\t\"utdot\": \"⋰\",\n\t\"Utilde\": \"Ũ\",\n\t\"utilde\": \"ũ\",\n\t\"utri\": \"▵\",\n\t\"utrif\": \"▴\",\n\t\"uuarr\": \"⇈\",\n\t\"Uuml\": \"Ü\",\n\t\"uuml\": \"ü\",\n\t\"uwangle\": \"⦧\",\n\t\"vangrt\": \"⦜\",\n\t\"varepsilon\": \"ϵ\",\n\t\"varkappa\": \"ϰ\",\n\t\"varnothing\": \"∅\",\n\t\"varphi\": \"ϕ\",\n\t\"varpi\": \"ϖ\",\n\t\"varpropto\": \"∝\",\n\t\"varr\": \"↕\",\n\t\"vArr\": \"⇕\",\n\t\"varrho\": \"ϱ\",\n\t\"varsigma\": \"ς\",\n\t\"varsubsetneq\": \"⊊︀\",\n\t\"varsubsetneqq\": \"⫋︀\",\n\t\"varsupsetneq\": \"⊋︀\",\n\t\"varsupsetneqq\": \"⫌︀\",\n\t\"vartheta\": \"ϑ\",\n\t\"vartriangleleft\": \"⊲\",\n\t\"vartriangleright\": \"⊳\",\n\t\"vBar\": \"⫨\",\n\t\"Vbar\": \"⫫\",\n\t\"vBarv\": \"⫩\",\n\t\"Vcy\": \"В\",\n\t\"vcy\": \"в\",\n\t\"vdash\": \"⊢\",\n\t\"vDash\": \"⊨\",\n\t\"Vdash\": \"⊩\",\n\t\"VDash\": \"⊫\",\n\t\"Vdashl\": \"⫦\",\n\t\"veebar\": \"⊻\",\n\t\"vee\": \"∨\",\n\t\"Vee\": \"⋁\",\n\t\"veeeq\": \"≚\",\n\t\"vellip\": \"⋮\",\n\t\"verbar\": \"|\",\n\t\"Verbar\": \"‖\",\n\t\"vert\": \"|\",\n\t\"Vert\": \"‖\",\n\t\"VerticalBar\": \"∣\",\n\t\"VerticalLine\": \"|\",\n\t\"VerticalSeparator\": \"❘\",\n\t\"VerticalTilde\": \"≀\",\n\t\"VeryThinSpace\": \" \",\n\t\"Vfr\": \"𝔙\",\n\t\"vfr\": \"𝔳\",\n\t\"vltri\": \"⊲\",\n\t\"vnsub\": \"⊂⃒\",\n\t\"vnsup\": \"⊃⃒\",\n\t\"Vopf\": \"𝕍\",\n\t\"vopf\": \"𝕧\",\n\t\"vprop\": \"∝\",\n\t\"vrtri\": \"⊳\",\n\t\"Vscr\": \"𝒱\",\n\t\"vscr\": \"𝓋\",\n\t\"vsubnE\": \"⫋︀\",\n\t\"vsubne\": \"⊊︀\",\n\t\"vsupnE\": \"⫌︀\",\n\t\"vsupne\": \"⊋︀\",\n\t\"Vvdash\": \"⊪\",\n\t\"vzigzag\": \"⦚\",\n\t\"Wcirc\": \"Ŵ\",\n\t\"wcirc\": \"ŵ\",\n\t\"wedbar\": \"⩟\",\n\t\"wedge\": \"∧\",\n\t\"Wedge\": \"⋀\",\n\t\"wedgeq\": \"≙\",\n\t\"weierp\": \"℘\",\n\t\"Wfr\": \"𝔚\",\n\t\"wfr\": \"𝔴\",\n\t\"Wopf\": \"𝕎\",\n\t\"wopf\": \"𝕨\",\n\t\"wp\": \"℘\",\n\t\"wr\": \"≀\",\n\t\"wreath\": \"≀\",\n\t\"Wscr\": \"𝒲\",\n\t\"wscr\": \"𝓌\",\n\t\"xcap\": \"⋂\",\n\t\"xcirc\": \"◯\",\n\t\"xcup\": \"⋃\",\n\t\"xdtri\": \"▽\",\n\t\"Xfr\": \"𝔛\",\n\t\"xfr\": \"𝔵\",\n\t\"xharr\": \"⟷\",\n\t\"xhArr\": \"⟺\",\n\t\"Xi\": \"Ξ\",\n\t\"xi\": \"ξ\",\n\t\"xlarr\": \"⟵\",\n\t\"xlArr\": \"⟸\",\n\t\"xmap\": \"⟼\",\n\t\"xnis\": \"⋻\",\n\t\"xodot\": \"⨀\",\n\t\"Xopf\": \"𝕏\",\n\t\"xopf\": \"𝕩\",\n\t\"xoplus\": \"⨁\",\n\t\"xotime\": \"⨂\",\n\t\"xrarr\": \"⟶\",\n\t\"xrArr\": \"⟹\",\n\t\"Xscr\": \"𝒳\",\n\t\"xscr\": \"𝓍\",\n\t\"xsqcup\": \"⨆\",\n\t\"xuplus\": \"⨄\",\n\t\"xutri\": \"△\",\n\t\"xvee\": \"⋁\",\n\t\"xwedge\": \"⋀\",\n\t\"Yacute\": \"Ý\",\n\t\"yacute\": \"ý\",\n\t\"YAcy\": \"Я\",\n\t\"yacy\": \"я\",\n\t\"Ycirc\": \"Ŷ\",\n\t\"ycirc\": \"ŷ\",\n\t\"Ycy\": \"Ы\",\n\t\"ycy\": \"ы\",\n\t\"yen\": \"¥\",\n\t\"Yfr\": \"𝔜\",\n\t\"yfr\": \"𝔶\",\n\t\"YIcy\": \"Ї\",\n\t\"yicy\": \"ї\",\n\t\"Yopf\": \"𝕐\",\n\t\"yopf\": \"𝕪\",\n\t\"Yscr\": \"𝒴\",\n\t\"yscr\": \"𝓎\",\n\t\"YUcy\": \"Ю\",\n\t\"yucy\": \"ю\",\n\t\"yuml\": \"ÿ\",\n\t\"Yuml\": \"Ÿ\",\n\t\"Zacute\": \"Ź\",\n\t\"zacute\": \"ź\",\n\t\"Zcaron\": \"Ž\",\n\t\"zcaron\": \"ž\",\n\t\"Zcy\": \"З\",\n\t\"zcy\": \"з\",\n\t\"Zdot\": \"Ż\",\n\t\"zdot\": \"ż\",\n\t\"zeetrf\": \"ℨ\",\n\t\"ZeroWidthSpace\": \"​\",\n\t\"Zeta\": \"Ζ\",\n\t\"zeta\": \"ζ\",\n\t\"zfr\": \"𝔷\",\n\t\"Zfr\": \"ℨ\",\n\t\"ZHcy\": \"Ж\",\n\t\"zhcy\": \"ж\",\n\t\"zigrarr\": \"⇝\",\n\t\"zopf\": \"𝕫\",\n\t\"Zopf\": \"ℤ\",\n\t\"Zscr\": \"𝒵\",\n\t\"zscr\": \"𝓏\",\n\t\"zwj\": \"‍\",\n\t\"zwnj\": \"‌\"\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbnRpdGllcy9tYXBzL2VudGl0aWVzLmpzb24iXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSB7XG5cdFwiQWFjdXRlXCI6IFwiw4FcIixcblx0XCJhYWN1dGVcIjogXCLDoVwiLFxuXHRcIkFicmV2ZVwiOiBcIsSCXCIsXG5cdFwiYWJyZXZlXCI6IFwixINcIixcblx0XCJhY1wiOiBcIuKIvlwiLFxuXHRcImFjZFwiOiBcIuKIv1wiLFxuXHRcImFjRVwiOiBcIuKIvsyzXCIsXG5cdFwiQWNpcmNcIjogXCLDglwiLFxuXHRcImFjaXJjXCI6IFwiw6JcIixcblx0XCJhY3V0ZVwiOiBcIsK0XCIsXG5cdFwiQWN5XCI6IFwi0JBcIixcblx0XCJhY3lcIjogXCLQsFwiLFxuXHRcIkFFbGlnXCI6IFwiw4ZcIixcblx0XCJhZWxpZ1wiOiBcIsOmXCIsXG5cdFwiYWZcIjogXCLigaFcIixcblx0XCJBZnJcIjogXCLwnZSEXCIsXG5cdFwiYWZyXCI6IFwi8J2UnlwiLFxuXHRcIkFncmF2ZVwiOiBcIsOAXCIsXG5cdFwiYWdyYXZlXCI6IFwiw6BcIixcblx0XCJhbGVmc3ltXCI6IFwi4oS1XCIsXG5cdFwiYWxlcGhcIjogXCLihLVcIixcblx0XCJBbHBoYVwiOiBcIs6RXCIsXG5cdFwiYWxwaGFcIjogXCLOsVwiLFxuXHRcIkFtYWNyXCI6IFwixIBcIixcblx0XCJhbWFjclwiOiBcIsSBXCIsXG5cdFwiYW1hbGdcIjogXCLiqL9cIixcblx0XCJhbXBcIjogXCImXCIsXG5cdFwiQU1QXCI6IFwiJlwiLFxuXHRcImFuZGFuZFwiOiBcIuKplVwiLFxuXHRcIkFuZFwiOiBcIuKpk1wiLFxuXHRcImFuZFwiOiBcIuKIp1wiLFxuXHRcImFuZGRcIjogXCLiqZxcIixcblx0XCJhbmRzbG9wZVwiOiBcIuKpmFwiLFxuXHRcImFuZHZcIjogXCLiqZpcIixcblx0XCJhbmdcIjogXCLiiKBcIixcblx0XCJhbmdlXCI6IFwi4qakXCIsXG5cdFwiYW5nbGVcIjogXCLiiKBcIixcblx0XCJhbmdtc2RhYVwiOiBcIuKmqFwiLFxuXHRcImFuZ21zZGFiXCI6IFwi4qapXCIsXG5cdFwiYW5nbXNkYWNcIjogXCLipqpcIixcblx0XCJhbmdtc2RhZFwiOiBcIuKmq1wiLFxuXHRcImFuZ21zZGFlXCI6IFwi4qasXCIsXG5cdFwiYW5nbXNkYWZcIjogXCLipq1cIixcblx0XCJhbmdtc2RhZ1wiOiBcIuKmrlwiLFxuXHRcImFuZ21zZGFoXCI6IFwi4qavXCIsXG5cdFwiYW5nbXNkXCI6IFwi4oihXCIsXG5cdFwiYW5ncnRcIjogXCLiiJ9cIixcblx0XCJhbmdydHZiXCI6IFwi4oq+XCIsXG5cdFwiYW5ncnR2YmRcIjogXCLipp1cIixcblx0XCJhbmdzcGhcIjogXCLiiKJcIixcblx0XCJhbmdzdFwiOiBcIsOFXCIsXG5cdFwiYW5nemFyclwiOiBcIuKNvFwiLFxuXHRcIkFvZ29uXCI6IFwixIRcIixcblx0XCJhb2dvblwiOiBcIsSFXCIsXG5cdFwiQW9wZlwiOiBcIvCdlLhcIixcblx0XCJhb3BmXCI6IFwi8J2VklwiLFxuXHRcImFwYWNpclwiOiBcIuKpr1wiLFxuXHRcImFwXCI6IFwi4omIXCIsXG5cdFwiYXBFXCI6IFwi4qmwXCIsXG5cdFwiYXBlXCI6IFwi4omKXCIsXG5cdFwiYXBpZFwiOiBcIuKJi1wiLFxuXHRcImFwb3NcIjogXCInXCIsXG5cdFwiQXBwbHlGdW5jdGlvblwiOiBcIuKBoVwiLFxuXHRcImFwcHJveFwiOiBcIuKJiFwiLFxuXHRcImFwcHJveGVxXCI6IFwi4omKXCIsXG5cdFwiQXJpbmdcIjogXCLDhVwiLFxuXHRcImFyaW5nXCI6IFwiw6VcIixcblx0XCJBc2NyXCI6IFwi8J2SnFwiLFxuXHRcImFzY3JcIjogXCLwnZK2XCIsXG5cdFwiQXNzaWduXCI6IFwi4omUXCIsXG5cdFwiYXN0XCI6IFwiKlwiLFxuXHRcImFzeW1wXCI6IFwi4omIXCIsXG5cdFwiYXN5bXBlcVwiOiBcIuKJjVwiLFxuXHRcIkF0aWxkZVwiOiBcIsODXCIsXG5cdFwiYXRpbGRlXCI6IFwiw6NcIixcblx0XCJBdW1sXCI6IFwiw4RcIixcblx0XCJhdW1sXCI6IFwiw6RcIixcblx0XCJhd2NvbmludFwiOiBcIuKIs1wiLFxuXHRcImF3aW50XCI6IFwi4qiRXCIsXG5cdFwiYmFja2NvbmdcIjogXCLiiYxcIixcblx0XCJiYWNrZXBzaWxvblwiOiBcIs+2XCIsXG5cdFwiYmFja3ByaW1lXCI6IFwi4oC1XCIsXG5cdFwiYmFja3NpbVwiOiBcIuKIvVwiLFxuXHRcImJhY2tzaW1lcVwiOiBcIuKLjVwiLFxuXHRcIkJhY2tzbGFzaFwiOiBcIuKIllwiLFxuXHRcIkJhcnZcIjogXCLiq6dcIixcblx0XCJiYXJ2ZWVcIjogXCLiir1cIixcblx0XCJiYXJ3ZWRcIjogXCLijIVcIixcblx0XCJCYXJ3ZWRcIjogXCLijIZcIixcblx0XCJiYXJ3ZWRnZVwiOiBcIuKMhVwiLFxuXHRcImJicmtcIjogXCLijrVcIixcblx0XCJiYnJrdGJya1wiOiBcIuKOtlwiLFxuXHRcImJjb25nXCI6IFwi4omMXCIsXG5cdFwiQmN5XCI6IFwi0JFcIixcblx0XCJiY3lcIjogXCLQsVwiLFxuXHRcImJkcXVvXCI6IFwi4oCeXCIsXG5cdFwiYmVjYXVzXCI6IFwi4oi1XCIsXG5cdFwiYmVjYXVzZVwiOiBcIuKItVwiLFxuXHRcIkJlY2F1c2VcIjogXCLiiLVcIixcblx0XCJiZW1wdHl2XCI6IFwi4qawXCIsXG5cdFwiYmVwc2lcIjogXCLPtlwiLFxuXHRcImJlcm5vdVwiOiBcIuKErFwiLFxuXHRcIkJlcm5vdWxsaXNcIjogXCLihKxcIixcblx0XCJCZXRhXCI6IFwizpJcIixcblx0XCJiZXRhXCI6IFwizrJcIixcblx0XCJiZXRoXCI6IFwi4oS2XCIsXG5cdFwiYmV0d2VlblwiOiBcIuKJrFwiLFxuXHRcIkJmclwiOiBcIvCdlIVcIixcblx0XCJiZnJcIjogXCLwnZSfXCIsXG5cdFwiYmlnY2FwXCI6IFwi4ouCXCIsXG5cdFwiYmlnY2lyY1wiOiBcIuKXr1wiLFxuXHRcImJpZ2N1cFwiOiBcIuKLg1wiLFxuXHRcImJpZ29kb3RcIjogXCLiqIBcIixcblx0XCJiaWdvcGx1c1wiOiBcIuKogVwiLFxuXHRcImJpZ290aW1lc1wiOiBcIuKoglwiLFxuXHRcImJpZ3NxY3VwXCI6IFwi4qiGXCIsXG5cdFwiYmlnc3RhclwiOiBcIuKYhVwiLFxuXHRcImJpZ3RyaWFuZ2xlZG93blwiOiBcIuKWvVwiLFxuXHRcImJpZ3RyaWFuZ2xldXBcIjogXCLilrNcIixcblx0XCJiaWd1cGx1c1wiOiBcIuKohFwiLFxuXHRcImJpZ3ZlZVwiOiBcIuKLgVwiLFxuXHRcImJpZ3dlZGdlXCI6IFwi4ouAXCIsXG5cdFwiYmthcm93XCI6IFwi4qSNXCIsXG5cdFwiYmxhY2tsb3plbmdlXCI6IFwi4qerXCIsXG5cdFwiYmxhY2tzcXVhcmVcIjogXCLilqpcIixcblx0XCJibGFja3RyaWFuZ2xlXCI6IFwi4pa0XCIsXG5cdFwiYmxhY2t0cmlhbmdsZWRvd25cIjogXCLilr5cIixcblx0XCJibGFja3RyaWFuZ2xlbGVmdFwiOiBcIuKXglwiLFxuXHRcImJsYWNrdHJpYW5nbGVyaWdodFwiOiBcIuKWuFwiLFxuXHRcImJsYW5rXCI6IFwi4pCjXCIsXG5cdFwiYmxrMTJcIjogXCLilpJcIixcblx0XCJibGsxNFwiOiBcIuKWkVwiLFxuXHRcImJsazM0XCI6IFwi4paTXCIsXG5cdFwiYmxvY2tcIjogXCLilohcIixcblx0XCJibmVcIjogXCI94oOlXCIsXG5cdFwiYm5lcXVpdlwiOiBcIuKJoeKDpVwiLFxuXHRcImJOb3RcIjogXCLiq61cIixcblx0XCJibm90XCI6IFwi4oyQXCIsXG5cdFwiQm9wZlwiOiBcIvCdlLlcIixcblx0XCJib3BmXCI6IFwi8J2Vk1wiLFxuXHRcImJvdFwiOiBcIuKKpVwiLFxuXHRcImJvdHRvbVwiOiBcIuKKpVwiLFxuXHRcImJvd3RpZVwiOiBcIuKLiFwiLFxuXHRcImJveGJveFwiOiBcIuKniVwiLFxuXHRcImJveGRsXCI6IFwi4pSQXCIsXG5cdFwiYm94ZExcIjogXCLilZVcIixcblx0XCJib3hEbFwiOiBcIuKVllwiLFxuXHRcImJveERMXCI6IFwi4pWXXCIsXG5cdFwiYm94ZHJcIjogXCLilIxcIixcblx0XCJib3hkUlwiOiBcIuKVklwiLFxuXHRcImJveERyXCI6IFwi4pWTXCIsXG5cdFwiYm94RFJcIjogXCLilZRcIixcblx0XCJib3hoXCI6IFwi4pSAXCIsXG5cdFwiYm94SFwiOiBcIuKVkFwiLFxuXHRcImJveGhkXCI6IFwi4pSsXCIsXG5cdFwiYm94SGRcIjogXCLilaRcIixcblx0XCJib3hoRFwiOiBcIuKVpVwiLFxuXHRcImJveEhEXCI6IFwi4pWmXCIsXG5cdFwiYm94aHVcIjogXCLilLRcIixcblx0XCJib3hIdVwiOiBcIuKVp1wiLFxuXHRcImJveGhVXCI6IFwi4pWoXCIsXG5cdFwiYm94SFVcIjogXCLilalcIixcblx0XCJib3htaW51c1wiOiBcIuKKn1wiLFxuXHRcImJveHBsdXNcIjogXCLiip5cIixcblx0XCJib3h0aW1lc1wiOiBcIuKKoFwiLFxuXHRcImJveHVsXCI6IFwi4pSYXCIsXG5cdFwiYm94dUxcIjogXCLilZtcIixcblx0XCJib3hVbFwiOiBcIuKVnFwiLFxuXHRcImJveFVMXCI6IFwi4pWdXCIsXG5cdFwiYm94dXJcIjogXCLilJRcIixcblx0XCJib3h1UlwiOiBcIuKVmFwiLFxuXHRcImJveFVyXCI6IFwi4pWZXCIsXG5cdFwiYm94VVJcIjogXCLilZpcIixcblx0XCJib3h2XCI6IFwi4pSCXCIsXG5cdFwiYm94VlwiOiBcIuKVkVwiLFxuXHRcImJveHZoXCI6IFwi4pS8XCIsXG5cdFwiYm94dkhcIjogXCLilapcIixcblx0XCJib3hWaFwiOiBcIuKVq1wiLFxuXHRcImJveFZIXCI6IFwi4pWsXCIsXG5cdFwiYm94dmxcIjogXCLilKRcIixcblx0XCJib3h2TFwiOiBcIuKVoVwiLFxuXHRcImJveFZsXCI6IFwi4pWiXCIsXG5cdFwiYm94VkxcIjogXCLilaNcIixcblx0XCJib3h2clwiOiBcIuKUnFwiLFxuXHRcImJveHZSXCI6IFwi4pWeXCIsXG5cdFwiYm94VnJcIjogXCLilZ9cIixcblx0XCJib3hWUlwiOiBcIuKVoFwiLFxuXHRcImJwcmltZVwiOiBcIuKAtVwiLFxuXHRcImJyZXZlXCI6IFwiy5hcIixcblx0XCJCcmV2ZVwiOiBcIsuYXCIsXG5cdFwiYnJ2YmFyXCI6IFwiwqZcIixcblx0XCJic2NyXCI6IFwi8J2St1wiLFxuXHRcIkJzY3JcIjogXCLihKxcIixcblx0XCJic2VtaVwiOiBcIuKBj1wiLFxuXHRcImJzaW1cIjogXCLiiL1cIixcblx0XCJic2ltZVwiOiBcIuKLjVwiLFxuXHRcImJzb2xiXCI6IFwi4qeFXCIsXG5cdFwiYnNvbFwiOiBcIlxcXFxcIixcblx0XCJic29saHN1YlwiOiBcIuKfiFwiLFxuXHRcImJ1bGxcIjogXCLigKJcIixcblx0XCJidWxsZXRcIjogXCLigKJcIixcblx0XCJidW1wXCI6IFwi4omOXCIsXG5cdFwiYnVtcEVcIjogXCLiqq5cIixcblx0XCJidW1wZVwiOiBcIuKJj1wiLFxuXHRcIkJ1bXBlcVwiOiBcIuKJjlwiLFxuXHRcImJ1bXBlcVwiOiBcIuKJj1wiLFxuXHRcIkNhY3V0ZVwiOiBcIsSGXCIsXG5cdFwiY2FjdXRlXCI6IFwixIdcIixcblx0XCJjYXBhbmRcIjogXCLiqYRcIixcblx0XCJjYXBicmN1cFwiOiBcIuKpiVwiLFxuXHRcImNhcGNhcFwiOiBcIuKpi1wiLFxuXHRcImNhcFwiOiBcIuKIqVwiLFxuXHRcIkNhcFwiOiBcIuKLklwiLFxuXHRcImNhcGN1cFwiOiBcIuKph1wiLFxuXHRcImNhcGRvdFwiOiBcIuKpgFwiLFxuXHRcIkNhcGl0YWxEaWZmZXJlbnRpYWxEXCI6IFwi4oWFXCIsXG5cdFwiY2Fwc1wiOiBcIuKIqe+4gFwiLFxuXHRcImNhcmV0XCI6IFwi4oGBXCIsXG5cdFwiY2Fyb25cIjogXCLLh1wiLFxuXHRcIkNheWxleXNcIjogXCLihK1cIixcblx0XCJjY2Fwc1wiOiBcIuKpjVwiLFxuXHRcIkNjYXJvblwiOiBcIsSMXCIsXG5cdFwiY2Nhcm9uXCI6IFwixI1cIixcblx0XCJDY2VkaWxcIjogXCLDh1wiLFxuXHRcImNjZWRpbFwiOiBcIsOnXCIsXG5cdFwiQ2NpcmNcIjogXCLEiFwiLFxuXHRcImNjaXJjXCI6IFwixIlcIixcblx0XCJDY29uaW50XCI6IFwi4oiwXCIsXG5cdFwiY2N1cHNcIjogXCLiqYxcIixcblx0XCJjY3Vwc3NtXCI6IFwi4qmQXCIsXG5cdFwiQ2RvdFwiOiBcIsSKXCIsXG5cdFwiY2RvdFwiOiBcIsSLXCIsXG5cdFwiY2VkaWxcIjogXCLCuFwiLFxuXHRcIkNlZGlsbGFcIjogXCLCuFwiLFxuXHRcImNlbXB0eXZcIjogXCLiprJcIixcblx0XCJjZW50XCI6IFwiwqJcIixcblx0XCJjZW50ZXJkb3RcIjogXCLCt1wiLFxuXHRcIkNlbnRlckRvdFwiOiBcIsK3XCIsXG5cdFwiY2ZyXCI6IFwi8J2UoFwiLFxuXHRcIkNmclwiOiBcIuKErVwiLFxuXHRcIkNIY3lcIjogXCLQp1wiLFxuXHRcImNoY3lcIjogXCLRh1wiLFxuXHRcImNoZWNrXCI6IFwi4pyTXCIsXG5cdFwiY2hlY2ttYXJrXCI6IFwi4pyTXCIsXG5cdFwiQ2hpXCI6IFwizqdcIixcblx0XCJjaGlcIjogXCLPh1wiLFxuXHRcImNpcmNcIjogXCLLhlwiLFxuXHRcImNpcmNlcVwiOiBcIuKJl1wiLFxuXHRcImNpcmNsZWFycm93bGVmdFwiOiBcIuKGulwiLFxuXHRcImNpcmNsZWFycm93cmlnaHRcIjogXCLihrtcIixcblx0XCJjaXJjbGVkYXN0XCI6IFwi4oqbXCIsXG5cdFwiY2lyY2xlZGNpcmNcIjogXCLiippcIixcblx0XCJjaXJjbGVkZGFzaFwiOiBcIuKKnVwiLFxuXHRcIkNpcmNsZURvdFwiOiBcIuKKmVwiLFxuXHRcImNpcmNsZWRSXCI6IFwiwq5cIixcblx0XCJjaXJjbGVkU1wiOiBcIuKTiFwiLFxuXHRcIkNpcmNsZU1pbnVzXCI6IFwi4oqWXCIsXG5cdFwiQ2lyY2xlUGx1c1wiOiBcIuKKlVwiLFxuXHRcIkNpcmNsZVRpbWVzXCI6IFwi4oqXXCIsXG5cdFwiY2lyXCI6IFwi4peLXCIsXG5cdFwiY2lyRVwiOiBcIuKng1wiLFxuXHRcImNpcmVcIjogXCLiiZdcIixcblx0XCJjaXJmbmludFwiOiBcIuKokFwiLFxuXHRcImNpcm1pZFwiOiBcIuKrr1wiLFxuXHRcImNpcnNjaXJcIjogXCLip4JcIixcblx0XCJDbG9ja3dpc2VDb250b3VySW50ZWdyYWxcIjogXCLiiLJcIixcblx0XCJDbG9zZUN1cmx5RG91YmxlUXVvdGVcIjogXCLigJ1cIixcblx0XCJDbG9zZUN1cmx5UXVvdGVcIjogXCLigJlcIixcblx0XCJjbHVic1wiOiBcIuKZo1wiLFxuXHRcImNsdWJzdWl0XCI6IFwi4pmjXCIsXG5cdFwiY29sb25cIjogXCI6XCIsXG5cdFwiQ29sb25cIjogXCLiiLdcIixcblx0XCJDb2xvbmVcIjogXCLiqbRcIixcblx0XCJjb2xvbmVcIjogXCLiiZRcIixcblx0XCJjb2xvbmVxXCI6IFwi4omUXCIsXG5cdFwiY29tbWFcIjogXCIsXCIsXG5cdFwiY29tbWF0XCI6IFwiQFwiLFxuXHRcImNvbXBcIjogXCLiiIFcIixcblx0XCJjb21wZm5cIjogXCLiiJhcIixcblx0XCJjb21wbGVtZW50XCI6IFwi4oiBXCIsXG5cdFwiY29tcGxleGVzXCI6IFwi4oSCXCIsXG5cdFwiY29uZ1wiOiBcIuKJhVwiLFxuXHRcImNvbmdkb3RcIjogXCLiqa1cIixcblx0XCJDb25ncnVlbnRcIjogXCLiiaFcIixcblx0XCJjb25pbnRcIjogXCLiiK5cIixcblx0XCJDb25pbnRcIjogXCLiiK9cIixcblx0XCJDb250b3VySW50ZWdyYWxcIjogXCLiiK5cIixcblx0XCJjb3BmXCI6IFwi8J2VlFwiLFxuXHRcIkNvcGZcIjogXCLihIJcIixcblx0XCJjb3Byb2RcIjogXCLiiJBcIixcblx0XCJDb3Byb2R1Y3RcIjogXCLiiJBcIixcblx0XCJjb3B5XCI6IFwiwqlcIixcblx0XCJDT1BZXCI6IFwiwqlcIixcblx0XCJjb3B5c3JcIjogXCLihJdcIixcblx0XCJDb3VudGVyQ2xvY2t3aXNlQ29udG91ckludGVncmFsXCI6IFwi4oizXCIsXG5cdFwiY3JhcnJcIjogXCLihrVcIixcblx0XCJjcm9zc1wiOiBcIuKcl1wiLFxuXHRcIkNyb3NzXCI6IFwi4qivXCIsXG5cdFwiQ3NjclwiOiBcIvCdkp5cIixcblx0XCJjc2NyXCI6IFwi8J2SuFwiLFxuXHRcImNzdWJcIjogXCLiq49cIixcblx0XCJjc3ViZVwiOiBcIuKrkVwiLFxuXHRcImNzdXBcIjogXCLiq5BcIixcblx0XCJjc3VwZVwiOiBcIuKrklwiLFxuXHRcImN0ZG90XCI6IFwi4ouvXCIsXG5cdFwiY3VkYXJybFwiOiBcIuKkuFwiLFxuXHRcImN1ZGFycnJcIjogXCLipLVcIixcblx0XCJjdWVwclwiOiBcIuKLnlwiLFxuXHRcImN1ZXNjXCI6IFwi4oufXCIsXG5cdFwiY3VsYXJyXCI6IFwi4oa2XCIsXG5cdFwiY3VsYXJycFwiOiBcIuKkvVwiLFxuXHRcImN1cGJyY2FwXCI6IFwi4qmIXCIsXG5cdFwiY3VwY2FwXCI6IFwi4qmGXCIsXG5cdFwiQ3VwQ2FwXCI6IFwi4omNXCIsXG5cdFwiY3VwXCI6IFwi4oiqXCIsXG5cdFwiQ3VwXCI6IFwi4ouTXCIsXG5cdFwiY3VwY3VwXCI6IFwi4qmKXCIsXG5cdFwiY3VwZG90XCI6IFwi4oqNXCIsXG5cdFwiY3Vwb3JcIjogXCLiqYVcIixcblx0XCJjdXBzXCI6IFwi4oiq77iAXCIsXG5cdFwiY3VyYXJyXCI6IFwi4oa3XCIsXG5cdFwiY3VyYXJybVwiOiBcIuKkvFwiLFxuXHRcImN1cmx5ZXFwcmVjXCI6IFwi4oueXCIsXG5cdFwiY3VybHllcXN1Y2NcIjogXCLii59cIixcblx0XCJjdXJseXZlZVwiOiBcIuKLjlwiLFxuXHRcImN1cmx5d2VkZ2VcIjogXCLii49cIixcblx0XCJjdXJyZW5cIjogXCLCpFwiLFxuXHRcImN1cnZlYXJyb3dsZWZ0XCI6IFwi4oa2XCIsXG5cdFwiY3VydmVhcnJvd3JpZ2h0XCI6IFwi4oa3XCIsXG5cdFwiY3V2ZWVcIjogXCLii45cIixcblx0XCJjdXdlZFwiOiBcIuKLj1wiLFxuXHRcImN3Y29uaW50XCI6IFwi4oiyXCIsXG5cdFwiY3dpbnRcIjogXCLiiLFcIixcblx0XCJjeWxjdHlcIjogXCLijK1cIixcblx0XCJkYWdnZXJcIjogXCLigKBcIixcblx0XCJEYWdnZXJcIjogXCLigKFcIixcblx0XCJkYWxldGhcIjogXCLihLhcIixcblx0XCJkYXJyXCI6IFwi4oaTXCIsXG5cdFwiRGFyclwiOiBcIuKGoVwiLFxuXHRcImRBcnJcIjogXCLih5NcIixcblx0XCJkYXNoXCI6IFwi4oCQXCIsXG5cdFwiRGFzaHZcIjogXCLiq6RcIixcblx0XCJkYXNodlwiOiBcIuKKo1wiLFxuXHRcImRia2Fyb3dcIjogXCLipI9cIixcblx0XCJkYmxhY1wiOiBcIsudXCIsXG5cdFwiRGNhcm9uXCI6IFwixI5cIixcblx0XCJkY2Fyb25cIjogXCLEj1wiLFxuXHRcIkRjeVwiOiBcItCUXCIsXG5cdFwiZGN5XCI6IFwi0LRcIixcblx0XCJkZGFnZ2VyXCI6IFwi4oChXCIsXG5cdFwiZGRhcnJcIjogXCLih4pcIixcblx0XCJERFwiOiBcIuKFhVwiLFxuXHRcImRkXCI6IFwi4oWGXCIsXG5cdFwiRERvdHJhaGRcIjogXCLipJFcIixcblx0XCJkZG90c2VxXCI6IFwi4qm3XCIsXG5cdFwiZGVnXCI6IFwiwrBcIixcblx0XCJEZWxcIjogXCLiiIdcIixcblx0XCJEZWx0YVwiOiBcIs6UXCIsXG5cdFwiZGVsdGFcIjogXCLOtFwiLFxuXHRcImRlbXB0eXZcIjogXCLiprFcIixcblx0XCJkZmlzaHRcIjogXCLipb9cIixcblx0XCJEZnJcIjogXCLwnZSHXCIsXG5cdFwiZGZyXCI6IFwi8J2UoVwiLFxuXHRcImRIYXJcIjogXCLipaVcIixcblx0XCJkaGFybFwiOiBcIuKHg1wiLFxuXHRcImRoYXJyXCI6IFwi4oeCXCIsXG5cdFwiRGlhY3JpdGljYWxBY3V0ZVwiOiBcIsK0XCIsXG5cdFwiRGlhY3JpdGljYWxEb3RcIjogXCLLmVwiLFxuXHRcIkRpYWNyaXRpY2FsRG91YmxlQWN1dGVcIjogXCLLnVwiLFxuXHRcIkRpYWNyaXRpY2FsR3JhdmVcIjogXCJgXCIsXG5cdFwiRGlhY3JpdGljYWxUaWxkZVwiOiBcIsucXCIsXG5cdFwiZGlhbVwiOiBcIuKLhFwiLFxuXHRcImRpYW1vbmRcIjogXCLii4RcIixcblx0XCJEaWFtb25kXCI6IFwi4ouEXCIsXG5cdFwiZGlhbW9uZHN1aXRcIjogXCLimaZcIixcblx0XCJkaWFtc1wiOiBcIuKZplwiLFxuXHRcImRpZVwiOiBcIsKoXCIsXG5cdFwiRGlmZmVyZW50aWFsRFwiOiBcIuKFhlwiLFxuXHRcImRpZ2FtbWFcIjogXCLPnVwiLFxuXHRcImRpc2luXCI6IFwi4ouyXCIsXG5cdFwiZGl2XCI6IFwiw7dcIixcblx0XCJkaXZpZGVcIjogXCLDt1wiLFxuXHRcImRpdmlkZW9udGltZXNcIjogXCLii4dcIixcblx0XCJkaXZvbnhcIjogXCLii4dcIixcblx0XCJESmN5XCI6IFwi0IJcIixcblx0XCJkamN5XCI6IFwi0ZJcIixcblx0XCJkbGNvcm5cIjogXCLijJ5cIixcblx0XCJkbGNyb3BcIjogXCLijI1cIixcblx0XCJkb2xsYXJcIjogXCIkXCIsXG5cdFwiRG9wZlwiOiBcIvCdlLtcIixcblx0XCJkb3BmXCI6IFwi8J2VlVwiLFxuXHRcIkRvdFwiOiBcIsKoXCIsXG5cdFwiZG90XCI6IFwiy5lcIixcblx0XCJEb3REb3RcIjogXCLig5xcIixcblx0XCJkb3RlcVwiOiBcIuKJkFwiLFxuXHRcImRvdGVxZG90XCI6IFwi4omRXCIsXG5cdFwiRG90RXF1YWxcIjogXCLiiZBcIixcblx0XCJkb3RtaW51c1wiOiBcIuKIuFwiLFxuXHRcImRvdHBsdXNcIjogXCLiiJRcIixcblx0XCJkb3RzcXVhcmVcIjogXCLiiqFcIixcblx0XCJkb3VibGViYXJ3ZWRnZVwiOiBcIuKMhlwiLFxuXHRcIkRvdWJsZUNvbnRvdXJJbnRlZ3JhbFwiOiBcIuKIr1wiLFxuXHRcIkRvdWJsZURvdFwiOiBcIsKoXCIsXG5cdFwiRG91YmxlRG93bkFycm93XCI6IFwi4oeTXCIsXG5cdFwiRG91YmxlTGVmdEFycm93XCI6IFwi4oeQXCIsXG5cdFwiRG91YmxlTGVmdFJpZ2h0QXJyb3dcIjogXCLih5RcIixcblx0XCJEb3VibGVMZWZ0VGVlXCI6IFwi4qukXCIsXG5cdFwiRG91YmxlTG9uZ0xlZnRBcnJvd1wiOiBcIuKfuFwiLFxuXHRcIkRvdWJsZUxvbmdMZWZ0UmlnaHRBcnJvd1wiOiBcIuKfulwiLFxuXHRcIkRvdWJsZUxvbmdSaWdodEFycm93XCI6IFwi4p+5XCIsXG5cdFwiRG91YmxlUmlnaHRBcnJvd1wiOiBcIuKHklwiLFxuXHRcIkRvdWJsZVJpZ2h0VGVlXCI6IFwi4oqoXCIsXG5cdFwiRG91YmxlVXBBcnJvd1wiOiBcIuKHkVwiLFxuXHRcIkRvdWJsZVVwRG93bkFycm93XCI6IFwi4oeVXCIsXG5cdFwiRG91YmxlVmVydGljYWxCYXJcIjogXCLiiKVcIixcblx0XCJEb3duQXJyb3dCYXJcIjogXCLipJNcIixcblx0XCJkb3duYXJyb3dcIjogXCLihpNcIixcblx0XCJEb3duQXJyb3dcIjogXCLihpNcIixcblx0XCJEb3duYXJyb3dcIjogXCLih5NcIixcblx0XCJEb3duQXJyb3dVcEFycm93XCI6IFwi4oe1XCIsXG5cdFwiRG93bkJyZXZlXCI6IFwizJFcIixcblx0XCJkb3duZG93bmFycm93c1wiOiBcIuKHilwiLFxuXHRcImRvd25oYXJwb29ubGVmdFwiOiBcIuKHg1wiLFxuXHRcImRvd25oYXJwb29ucmlnaHRcIjogXCLih4JcIixcblx0XCJEb3duTGVmdFJpZ2h0VmVjdG9yXCI6IFwi4qWQXCIsXG5cdFwiRG93bkxlZnRUZWVWZWN0b3JcIjogXCLipZ5cIixcblx0XCJEb3duTGVmdFZlY3RvckJhclwiOiBcIuKlllwiLFxuXHRcIkRvd25MZWZ0VmVjdG9yXCI6IFwi4oa9XCIsXG5cdFwiRG93blJpZ2h0VGVlVmVjdG9yXCI6IFwi4qWfXCIsXG5cdFwiRG93blJpZ2h0VmVjdG9yQmFyXCI6IFwi4qWXXCIsXG5cdFwiRG93blJpZ2h0VmVjdG9yXCI6IFwi4oeBXCIsXG5cdFwiRG93blRlZUFycm93XCI6IFwi4oanXCIsXG5cdFwiRG93blRlZVwiOiBcIuKKpFwiLFxuXHRcImRyYmthcm93XCI6IFwi4qSQXCIsXG5cdFwiZHJjb3JuXCI6IFwi4oyfXCIsXG5cdFwiZHJjcm9wXCI6IFwi4oyMXCIsXG5cdFwiRHNjclwiOiBcIvCdkp9cIixcblx0XCJkc2NyXCI6IFwi8J2SuVwiLFxuXHRcIkRTY3lcIjogXCLQhVwiLFxuXHRcImRzY3lcIjogXCLRlVwiLFxuXHRcImRzb2xcIjogXCLip7ZcIixcblx0XCJEc3Ryb2tcIjogXCLEkFwiLFxuXHRcImRzdHJva1wiOiBcIsSRXCIsXG5cdFwiZHRkb3RcIjogXCLii7FcIixcblx0XCJkdHJpXCI6IFwi4pa/XCIsXG5cdFwiZHRyaWZcIjogXCLilr5cIixcblx0XCJkdWFyclwiOiBcIuKHtVwiLFxuXHRcImR1aGFyXCI6IFwi4qWvXCIsXG5cdFwiZHdhbmdsZVwiOiBcIuKmplwiLFxuXHRcIkRaY3lcIjogXCLQj1wiLFxuXHRcImR6Y3lcIjogXCLRn1wiLFxuXHRcImR6aWdyYXJyXCI6IFwi4p+/XCIsXG5cdFwiRWFjdXRlXCI6IFwiw4lcIixcblx0XCJlYWN1dGVcIjogXCLDqVwiLFxuXHRcImVhc3RlclwiOiBcIuKprlwiLFxuXHRcIkVjYXJvblwiOiBcIsSaXCIsXG5cdFwiZWNhcm9uXCI6IFwixJtcIixcblx0XCJFY2lyY1wiOiBcIsOKXCIsXG5cdFwiZWNpcmNcIjogXCLDqlwiLFxuXHRcImVjaXJcIjogXCLiiZZcIixcblx0XCJlY29sb25cIjogXCLiiZVcIixcblx0XCJFY3lcIjogXCLQrVwiLFxuXHRcImVjeVwiOiBcItGNXCIsXG5cdFwiZUREb3RcIjogXCLiqbdcIixcblx0XCJFZG90XCI6IFwixJZcIixcblx0XCJlZG90XCI6IFwixJdcIixcblx0XCJlRG90XCI6IFwi4omRXCIsXG5cdFwiZWVcIjogXCLihYdcIixcblx0XCJlZkRvdFwiOiBcIuKJklwiLFxuXHRcIkVmclwiOiBcIvCdlIhcIixcblx0XCJlZnJcIjogXCLwnZSiXCIsXG5cdFwiZWdcIjogXCLiqppcIixcblx0XCJFZ3JhdmVcIjogXCLDiFwiLFxuXHRcImVncmF2ZVwiOiBcIsOoXCIsXG5cdFwiZWdzXCI6IFwi4qqWXCIsXG5cdFwiZWdzZG90XCI6IFwi4qqYXCIsXG5cdFwiZWxcIjogXCLiqplcIixcblx0XCJFbGVtZW50XCI6IFwi4oiIXCIsXG5cdFwiZWxpbnRlcnNcIjogXCLij6dcIixcblx0XCJlbGxcIjogXCLihJNcIixcblx0XCJlbHNcIjogXCLiqpVcIixcblx0XCJlbHNkb3RcIjogXCLiqpdcIixcblx0XCJFbWFjclwiOiBcIsSSXCIsXG5cdFwiZW1hY3JcIjogXCLEk1wiLFxuXHRcImVtcHR5XCI6IFwi4oiFXCIsXG5cdFwiZW1wdHlzZXRcIjogXCLiiIVcIixcblx0XCJFbXB0eVNtYWxsU3F1YXJlXCI6IFwi4pe7XCIsXG5cdFwiZW1wdHl2XCI6IFwi4oiFXCIsXG5cdFwiRW1wdHlWZXJ5U21hbGxTcXVhcmVcIjogXCLilqtcIixcblx0XCJlbXNwMTNcIjogXCLigIRcIixcblx0XCJlbXNwMTRcIjogXCLigIVcIixcblx0XCJlbXNwXCI6IFwi4oCDXCIsXG5cdFwiRU5HXCI6IFwixYpcIixcblx0XCJlbmdcIjogXCLFi1wiLFxuXHRcImVuc3BcIjogXCLigIJcIixcblx0XCJFb2dvblwiOiBcIsSYXCIsXG5cdFwiZW9nb25cIjogXCLEmVwiLFxuXHRcIkVvcGZcIjogXCLwnZS8XCIsXG5cdFwiZW9wZlwiOiBcIvCdlZZcIixcblx0XCJlcGFyXCI6IFwi4ouVXCIsXG5cdFwiZXBhcnNsXCI6IFwi4qejXCIsXG5cdFwiZXBsdXNcIjogXCLiqbFcIixcblx0XCJlcHNpXCI6IFwizrVcIixcblx0XCJFcHNpbG9uXCI6IFwizpVcIixcblx0XCJlcHNpbG9uXCI6IFwizrVcIixcblx0XCJlcHNpdlwiOiBcIs+1XCIsXG5cdFwiZXFjaXJjXCI6IFwi4omWXCIsXG5cdFwiZXFjb2xvblwiOiBcIuKJlVwiLFxuXHRcImVxc2ltXCI6IFwi4omCXCIsXG5cdFwiZXFzbGFudGd0clwiOiBcIuKqllwiLFxuXHRcImVxc2xhbnRsZXNzXCI6IFwi4qqVXCIsXG5cdFwiRXF1YWxcIjogXCLiqbVcIixcblx0XCJlcXVhbHNcIjogXCI9XCIsXG5cdFwiRXF1YWxUaWxkZVwiOiBcIuKJglwiLFxuXHRcImVxdWVzdFwiOiBcIuKJn1wiLFxuXHRcIkVxdWlsaWJyaXVtXCI6IFwi4oeMXCIsXG5cdFwiZXF1aXZcIjogXCLiiaFcIixcblx0XCJlcXVpdkREXCI6IFwi4qm4XCIsXG5cdFwiZXF2cGFyc2xcIjogXCLip6VcIixcblx0XCJlcmFyclwiOiBcIuKlsVwiLFxuXHRcImVyRG90XCI6IFwi4omTXCIsXG5cdFwiZXNjclwiOiBcIuKEr1wiLFxuXHRcIkVzY3JcIjogXCLihLBcIixcblx0XCJlc2RvdFwiOiBcIuKJkFwiLFxuXHRcIkVzaW1cIjogXCLiqbNcIixcblx0XCJlc2ltXCI6IFwi4omCXCIsXG5cdFwiRXRhXCI6IFwizpdcIixcblx0XCJldGFcIjogXCLOt1wiLFxuXHRcIkVUSFwiOiBcIsOQXCIsXG5cdFwiZXRoXCI6IFwiw7BcIixcblx0XCJFdW1sXCI6IFwiw4tcIixcblx0XCJldW1sXCI6IFwiw6tcIixcblx0XCJldXJvXCI6IFwi4oKsXCIsXG5cdFwiZXhjbFwiOiBcIiFcIixcblx0XCJleGlzdFwiOiBcIuKIg1wiLFxuXHRcIkV4aXN0c1wiOiBcIuKIg1wiLFxuXHRcImV4cGVjdGF0aW9uXCI6IFwi4oSwXCIsXG5cdFwiZXhwb25lbnRpYWxlXCI6IFwi4oWHXCIsXG5cdFwiRXhwb25lbnRpYWxFXCI6IFwi4oWHXCIsXG5cdFwiZmFsbGluZ2RvdHNlcVwiOiBcIuKJklwiLFxuXHRcIkZjeVwiOiBcItCkXCIsXG5cdFwiZmN5XCI6IFwi0YRcIixcblx0XCJmZW1hbGVcIjogXCLimYBcIixcblx0XCJmZmlsaWdcIjogXCLvrINcIixcblx0XCJmZmxpZ1wiOiBcIu+sgFwiLFxuXHRcImZmbGxpZ1wiOiBcIu+shFwiLFxuXHRcIkZmclwiOiBcIvCdlIlcIixcblx0XCJmZnJcIjogXCLwnZSjXCIsXG5cdFwiZmlsaWdcIjogXCLvrIFcIixcblx0XCJGaWxsZWRTbWFsbFNxdWFyZVwiOiBcIuKXvFwiLFxuXHRcIkZpbGxlZFZlcnlTbWFsbFNxdWFyZVwiOiBcIuKWqlwiLFxuXHRcImZqbGlnXCI6IFwiZmpcIixcblx0XCJmbGF0XCI6IFwi4pmtXCIsXG5cdFwiZmxsaWdcIjogXCLvrIJcIixcblx0XCJmbHRuc1wiOiBcIuKWsVwiLFxuXHRcImZub2ZcIjogXCLGklwiLFxuXHRcIkZvcGZcIjogXCLwnZS9XCIsXG5cdFwiZm9wZlwiOiBcIvCdlZdcIixcblx0XCJmb3JhbGxcIjogXCLiiIBcIixcblx0XCJGb3JBbGxcIjogXCLiiIBcIixcblx0XCJmb3JrXCI6IFwi4ouUXCIsXG5cdFwiZm9ya3ZcIjogXCLiq5lcIixcblx0XCJGb3VyaWVydHJmXCI6IFwi4oSxXCIsXG5cdFwiZnBhcnRpbnRcIjogXCLiqI1cIixcblx0XCJmcmFjMTJcIjogXCLCvVwiLFxuXHRcImZyYWMxM1wiOiBcIuKFk1wiLFxuXHRcImZyYWMxNFwiOiBcIsK8XCIsXG5cdFwiZnJhYzE1XCI6IFwi4oWVXCIsXG5cdFwiZnJhYzE2XCI6IFwi4oWZXCIsXG5cdFwiZnJhYzE4XCI6IFwi4oWbXCIsXG5cdFwiZnJhYzIzXCI6IFwi4oWUXCIsXG5cdFwiZnJhYzI1XCI6IFwi4oWWXCIsXG5cdFwiZnJhYzM0XCI6IFwiwr5cIixcblx0XCJmcmFjMzVcIjogXCLihZdcIixcblx0XCJmcmFjMzhcIjogXCLihZxcIixcblx0XCJmcmFjNDVcIjogXCLihZhcIixcblx0XCJmcmFjNTZcIjogXCLihZpcIixcblx0XCJmcmFjNThcIjogXCLihZ1cIixcblx0XCJmcmFjNzhcIjogXCLihZ5cIixcblx0XCJmcmFzbFwiOiBcIuKBhFwiLFxuXHRcImZyb3duXCI6IFwi4oyiXCIsXG5cdFwiZnNjclwiOiBcIvCdkrtcIixcblx0XCJGc2NyXCI6IFwi4oSxXCIsXG5cdFwiZ2FjdXRlXCI6IFwix7VcIixcblx0XCJHYW1tYVwiOiBcIs6TXCIsXG5cdFwiZ2FtbWFcIjogXCLOs1wiLFxuXHRcIkdhbW1hZFwiOiBcIs+cXCIsXG5cdFwiZ2FtbWFkXCI6IFwiz51cIixcblx0XCJnYXBcIjogXCLiqoZcIixcblx0XCJHYnJldmVcIjogXCLEnlwiLFxuXHRcImdicmV2ZVwiOiBcIsSfXCIsXG5cdFwiR2NlZGlsXCI6IFwixKJcIixcblx0XCJHY2lyY1wiOiBcIsScXCIsXG5cdFwiZ2NpcmNcIjogXCLEnVwiLFxuXHRcIkdjeVwiOiBcItCTXCIsXG5cdFwiZ2N5XCI6IFwi0LNcIixcblx0XCJHZG90XCI6IFwixKBcIixcblx0XCJnZG90XCI6IFwixKFcIixcblx0XCJnZVwiOiBcIuKJpVwiLFxuXHRcImdFXCI6IFwi4omnXCIsXG5cdFwiZ0VsXCI6IFwi4qqMXCIsXG5cdFwiZ2VsXCI6IFwi4oubXCIsXG5cdFwiZ2VxXCI6IFwi4omlXCIsXG5cdFwiZ2VxcVwiOiBcIuKJp1wiLFxuXHRcImdlcXNsYW50XCI6IFwi4qm+XCIsXG5cdFwiZ2VzY2NcIjogXCLiqqlcIixcblx0XCJnZXNcIjogXCLiqb5cIixcblx0XCJnZXNkb3RcIjogXCLiqoBcIixcblx0XCJnZXNkb3RvXCI6IFwi4qqCXCIsXG5cdFwiZ2VzZG90b2xcIjogXCLiqoRcIixcblx0XCJnZXNsXCI6IFwi4oub77iAXCIsXG5cdFwiZ2VzbGVzXCI6IFwi4qqUXCIsXG5cdFwiR2ZyXCI6IFwi8J2UilwiLFxuXHRcImdmclwiOiBcIvCdlKRcIixcblx0XCJnZ1wiOiBcIuKJq1wiLFxuXHRcIkdnXCI6IFwi4ouZXCIsXG5cdFwiZ2dnXCI6IFwi4ouZXCIsXG5cdFwiZ2ltZWxcIjogXCLihLdcIixcblx0XCJHSmN5XCI6IFwi0INcIixcblx0XCJnamN5XCI6IFwi0ZNcIixcblx0XCJnbGFcIjogXCLiqqVcIixcblx0XCJnbFwiOiBcIuKJt1wiLFxuXHRcImdsRVwiOiBcIuKqklwiLFxuXHRcImdsalwiOiBcIuKqpFwiLFxuXHRcImduYXBcIjogXCLiqopcIixcblx0XCJnbmFwcHJveFwiOiBcIuKqilwiLFxuXHRcImduZVwiOiBcIuKqiFwiLFxuXHRcImduRVwiOiBcIuKJqVwiLFxuXHRcImduZXFcIjogXCLiqohcIixcblx0XCJnbmVxcVwiOiBcIuKJqVwiLFxuXHRcImduc2ltXCI6IFwi4ounXCIsXG5cdFwiR29wZlwiOiBcIvCdlL5cIixcblx0XCJnb3BmXCI6IFwi8J2VmFwiLFxuXHRcImdyYXZlXCI6IFwiYFwiLFxuXHRcIkdyZWF0ZXJFcXVhbFwiOiBcIuKJpVwiLFxuXHRcIkdyZWF0ZXJFcXVhbExlc3NcIjogXCLii5tcIixcblx0XCJHcmVhdGVyRnVsbEVxdWFsXCI6IFwi4omnXCIsXG5cdFwiR3JlYXRlckdyZWF0ZXJcIjogXCLiqqJcIixcblx0XCJHcmVhdGVyTGVzc1wiOiBcIuKJt1wiLFxuXHRcIkdyZWF0ZXJTbGFudEVxdWFsXCI6IFwi4qm+XCIsXG5cdFwiR3JlYXRlclRpbGRlXCI6IFwi4omzXCIsXG5cdFwiR3NjclwiOiBcIvCdkqJcIixcblx0XCJnc2NyXCI6IFwi4oSKXCIsXG5cdFwiZ3NpbVwiOiBcIuKJs1wiLFxuXHRcImdzaW1lXCI6IFwi4qqOXCIsXG5cdFwiZ3NpbWxcIjogXCLiqpBcIixcblx0XCJndGNjXCI6IFwi4qqnXCIsXG5cdFwiZ3RjaXJcIjogXCLiqbpcIixcblx0XCJndFwiOiBcIj5cIixcblx0XCJHVFwiOiBcIj5cIixcblx0XCJHdFwiOiBcIuKJq1wiLFxuXHRcImd0ZG90XCI6IFwi4ouXXCIsXG5cdFwiZ3RsUGFyXCI6IFwi4qaVXCIsXG5cdFwiZ3RxdWVzdFwiOiBcIuKpvFwiLFxuXHRcImd0cmFwcHJveFwiOiBcIuKqhlwiLFxuXHRcImd0cmFyclwiOiBcIuKluFwiLFxuXHRcImd0cmRvdFwiOiBcIuKLl1wiLFxuXHRcImd0cmVxbGVzc1wiOiBcIuKLm1wiLFxuXHRcImd0cmVxcWxlc3NcIjogXCLiqoxcIixcblx0XCJndHJsZXNzXCI6IFwi4om3XCIsXG5cdFwiZ3Ryc2ltXCI6IFwi4omzXCIsXG5cdFwiZ3ZlcnRuZXFxXCI6IFwi4omp77iAXCIsXG5cdFwiZ3ZuRVwiOiBcIuKJqe+4gFwiLFxuXHRcIkhhY2VrXCI6IFwiy4dcIixcblx0XCJoYWlyc3BcIjogXCLigIpcIixcblx0XCJoYWxmXCI6IFwiwr1cIixcblx0XCJoYW1pbHRcIjogXCLihItcIixcblx0XCJIQVJEY3lcIjogXCLQqlwiLFxuXHRcImhhcmRjeVwiOiBcItGKXCIsXG5cdFwiaGFycmNpclwiOiBcIuKliFwiLFxuXHRcImhhcnJcIjogXCLihpRcIixcblx0XCJoQXJyXCI6IFwi4oeUXCIsXG5cdFwiaGFycndcIjogXCLihq1cIixcblx0XCJIYXRcIjogXCJeXCIsXG5cdFwiaGJhclwiOiBcIuKEj1wiLFxuXHRcIkhjaXJjXCI6IFwixKRcIixcblx0XCJoY2lyY1wiOiBcIsSlXCIsXG5cdFwiaGVhcnRzXCI6IFwi4pmlXCIsXG5cdFwiaGVhcnRzdWl0XCI6IFwi4pmlXCIsXG5cdFwiaGVsbGlwXCI6IFwi4oCmXCIsXG5cdFwiaGVyY29uXCI6IFwi4oq5XCIsXG5cdFwiaGZyXCI6IFwi8J2UpVwiLFxuXHRcIkhmclwiOiBcIuKEjFwiLFxuXHRcIkhpbGJlcnRTcGFjZVwiOiBcIuKEi1wiLFxuXHRcImhrc2Vhcm93XCI6IFwi4qSlXCIsXG5cdFwiaGtzd2Fyb3dcIjogXCLipKZcIixcblx0XCJob2FyclwiOiBcIuKHv1wiLFxuXHRcImhvbXRodFwiOiBcIuKIu1wiLFxuXHRcImhvb2tsZWZ0YXJyb3dcIjogXCLihqlcIixcblx0XCJob29rcmlnaHRhcnJvd1wiOiBcIuKGqlwiLFxuXHRcImhvcGZcIjogXCLwnZWZXCIsXG5cdFwiSG9wZlwiOiBcIuKEjVwiLFxuXHRcImhvcmJhclwiOiBcIuKAlVwiLFxuXHRcIkhvcml6b250YWxMaW5lXCI6IFwi4pSAXCIsXG5cdFwiaHNjclwiOiBcIvCdkr1cIixcblx0XCJIc2NyXCI6IFwi4oSLXCIsXG5cdFwiaHNsYXNoXCI6IFwi4oSPXCIsXG5cdFwiSHN0cm9rXCI6IFwixKZcIixcblx0XCJoc3Ryb2tcIjogXCLEp1wiLFxuXHRcIkh1bXBEb3duSHVtcFwiOiBcIuKJjlwiLFxuXHRcIkh1bXBFcXVhbFwiOiBcIuKJj1wiLFxuXHRcImh5YnVsbFwiOiBcIuKBg1wiLFxuXHRcImh5cGhlblwiOiBcIuKAkFwiLFxuXHRcIklhY3V0ZVwiOiBcIsONXCIsXG5cdFwiaWFjdXRlXCI6IFwiw61cIixcblx0XCJpY1wiOiBcIuKBo1wiLFxuXHRcIkljaXJjXCI6IFwiw45cIixcblx0XCJpY2lyY1wiOiBcIsOuXCIsXG5cdFwiSWN5XCI6IFwi0JhcIixcblx0XCJpY3lcIjogXCLQuFwiLFxuXHRcIklkb3RcIjogXCLEsFwiLFxuXHRcIklFY3lcIjogXCLQlVwiLFxuXHRcImllY3lcIjogXCLQtVwiLFxuXHRcImlleGNsXCI6IFwiwqFcIixcblx0XCJpZmZcIjogXCLih5RcIixcblx0XCJpZnJcIjogXCLwnZSmXCIsXG5cdFwiSWZyXCI6IFwi4oSRXCIsXG5cdFwiSWdyYXZlXCI6IFwiw4xcIixcblx0XCJpZ3JhdmVcIjogXCLDrFwiLFxuXHRcImlpXCI6IFwi4oWIXCIsXG5cdFwiaWlpaW50XCI6IFwi4qiMXCIsXG5cdFwiaWlpbnRcIjogXCLiiK1cIixcblx0XCJpaW5maW5cIjogXCLip5xcIixcblx0XCJpaW90YVwiOiBcIuKEqVwiLFxuXHRcIklKbGlnXCI6IFwixLJcIixcblx0XCJpamxpZ1wiOiBcIsSzXCIsXG5cdFwiSW1hY3JcIjogXCLEqlwiLFxuXHRcImltYWNyXCI6IFwixKtcIixcblx0XCJpbWFnZVwiOiBcIuKEkVwiLFxuXHRcIkltYWdpbmFyeUlcIjogXCLihYhcIixcblx0XCJpbWFnbGluZVwiOiBcIuKEkFwiLFxuXHRcImltYWdwYXJ0XCI6IFwi4oSRXCIsXG5cdFwiaW1hdGhcIjogXCLEsVwiLFxuXHRcIkltXCI6IFwi4oSRXCIsXG5cdFwiaW1vZlwiOiBcIuKKt1wiLFxuXHRcImltcGVkXCI6IFwixrVcIixcblx0XCJJbXBsaWVzXCI6IFwi4oeSXCIsXG5cdFwiaW5jYXJlXCI6IFwi4oSFXCIsXG5cdFwiaW5cIjogXCLiiIhcIixcblx0XCJpbmZpblwiOiBcIuKInlwiLFxuXHRcImluZmludGllXCI6IFwi4qedXCIsXG5cdFwiaW5vZG90XCI6IFwixLFcIixcblx0XCJpbnRjYWxcIjogXCLiirpcIixcblx0XCJpbnRcIjogXCLiiKtcIixcblx0XCJJbnRcIjogXCLiiKxcIixcblx0XCJpbnRlZ2Vyc1wiOiBcIuKEpFwiLFxuXHRcIkludGVncmFsXCI6IFwi4oirXCIsXG5cdFwiaW50ZXJjYWxcIjogXCLiirpcIixcblx0XCJJbnRlcnNlY3Rpb25cIjogXCLii4JcIixcblx0XCJpbnRsYXJoa1wiOiBcIuKol1wiLFxuXHRcImludHByb2RcIjogXCLiqLxcIixcblx0XCJJbnZpc2libGVDb21tYVwiOiBcIuKBo1wiLFxuXHRcIkludmlzaWJsZVRpbWVzXCI6IFwi4oGiXCIsXG5cdFwiSU9jeVwiOiBcItCBXCIsXG5cdFwiaW9jeVwiOiBcItGRXCIsXG5cdFwiSW9nb25cIjogXCLErlwiLFxuXHRcImlvZ29uXCI6IFwixK9cIixcblx0XCJJb3BmXCI6IFwi8J2VgFwiLFxuXHRcImlvcGZcIjogXCLwnZWaXCIsXG5cdFwiSW90YVwiOiBcIs6ZXCIsXG5cdFwiaW90YVwiOiBcIs65XCIsXG5cdFwiaXByb2RcIjogXCLiqLxcIixcblx0XCJpcXVlc3RcIjogXCLCv1wiLFxuXHRcImlzY3JcIjogXCLwnZK+XCIsXG5cdFwiSXNjclwiOiBcIuKEkFwiLFxuXHRcImlzaW5cIjogXCLiiIhcIixcblx0XCJpc2luZG90XCI6IFwi4ou1XCIsXG5cdFwiaXNpbkVcIjogXCLii7lcIixcblx0XCJpc2luc1wiOiBcIuKLtFwiLFxuXHRcImlzaW5zdlwiOiBcIuKLs1wiLFxuXHRcImlzaW52XCI6IFwi4oiIXCIsXG5cdFwiaXRcIjogXCLigaJcIixcblx0XCJJdGlsZGVcIjogXCLEqFwiLFxuXHRcIml0aWxkZVwiOiBcIsSpXCIsXG5cdFwiSXVrY3lcIjogXCLQhlwiLFxuXHRcIml1a2N5XCI6IFwi0ZZcIixcblx0XCJJdW1sXCI6IFwiw49cIixcblx0XCJpdW1sXCI6IFwiw69cIixcblx0XCJKY2lyY1wiOiBcIsS0XCIsXG5cdFwiamNpcmNcIjogXCLEtVwiLFxuXHRcIkpjeVwiOiBcItCZXCIsXG5cdFwiamN5XCI6IFwi0LlcIixcblx0XCJKZnJcIjogXCLwnZSNXCIsXG5cdFwiamZyXCI6IFwi8J2Up1wiLFxuXHRcImptYXRoXCI6IFwiyLdcIixcblx0XCJKb3BmXCI6IFwi8J2VgVwiLFxuXHRcImpvcGZcIjogXCLwnZWbXCIsXG5cdFwiSnNjclwiOiBcIvCdkqVcIixcblx0XCJqc2NyXCI6IFwi8J2Sv1wiLFxuXHRcIkpzZXJjeVwiOiBcItCIXCIsXG5cdFwianNlcmN5XCI6IFwi0ZhcIixcblx0XCJKdWtjeVwiOiBcItCEXCIsXG5cdFwianVrY3lcIjogXCLRlFwiLFxuXHRcIkthcHBhXCI6IFwizppcIixcblx0XCJrYXBwYVwiOiBcIs66XCIsXG5cdFwia2FwcGF2XCI6IFwiz7BcIixcblx0XCJLY2VkaWxcIjogXCLEtlwiLFxuXHRcImtjZWRpbFwiOiBcIsS3XCIsXG5cdFwiS2N5XCI6IFwi0JpcIixcblx0XCJrY3lcIjogXCLQulwiLFxuXHRcIktmclwiOiBcIvCdlI5cIixcblx0XCJrZnJcIjogXCLwnZSoXCIsXG5cdFwia2dyZWVuXCI6IFwixLhcIixcblx0XCJLSGN5XCI6IFwi0KVcIixcblx0XCJraGN5XCI6IFwi0YVcIixcblx0XCJLSmN5XCI6IFwi0IxcIixcblx0XCJramN5XCI6IFwi0ZxcIixcblx0XCJLb3BmXCI6IFwi8J2VglwiLFxuXHRcImtvcGZcIjogXCLwnZWcXCIsXG5cdFwiS3NjclwiOiBcIvCdkqZcIixcblx0XCJrc2NyXCI6IFwi8J2TgFwiLFxuXHRcImxBYXJyXCI6IFwi4oeaXCIsXG5cdFwiTGFjdXRlXCI6IFwixLlcIixcblx0XCJsYWN1dGVcIjogXCLEulwiLFxuXHRcImxhZW1wdHl2XCI6IFwi4qa0XCIsXG5cdFwibGFncmFuXCI6IFwi4oSSXCIsXG5cdFwiTGFtYmRhXCI6IFwizptcIixcblx0XCJsYW1iZGFcIjogXCLOu1wiLFxuXHRcImxhbmdcIjogXCLin6hcIixcblx0XCJMYW5nXCI6IFwi4p+qXCIsXG5cdFwibGFuZ2RcIjogXCLippFcIixcblx0XCJsYW5nbGVcIjogXCLin6hcIixcblx0XCJsYXBcIjogXCLiqoVcIixcblx0XCJMYXBsYWNldHJmXCI6IFwi4oSSXCIsXG5cdFwibGFxdW9cIjogXCLCq1wiLFxuXHRcImxhcnJiXCI6IFwi4oekXCIsXG5cdFwibGFycmJmc1wiOiBcIuKkn1wiLFxuXHRcImxhcnJcIjogXCLihpBcIixcblx0XCJMYXJyXCI6IFwi4oaeXCIsXG5cdFwibEFyclwiOiBcIuKHkFwiLFxuXHRcImxhcnJmc1wiOiBcIuKknVwiLFxuXHRcImxhcnJoa1wiOiBcIuKGqVwiLFxuXHRcImxhcnJscFwiOiBcIuKGq1wiLFxuXHRcImxhcnJwbFwiOiBcIuKkuVwiLFxuXHRcImxhcnJzaW1cIjogXCLipbNcIixcblx0XCJsYXJydGxcIjogXCLihqJcIixcblx0XCJsYXRhaWxcIjogXCLipJlcIixcblx0XCJsQXRhaWxcIjogXCLipJtcIixcblx0XCJsYXRcIjogXCLiqqtcIixcblx0XCJsYXRlXCI6IFwi4qqtXCIsXG5cdFwibGF0ZXNcIjogXCLiqq3vuIBcIixcblx0XCJsYmFyclwiOiBcIuKkjFwiLFxuXHRcImxCYXJyXCI6IFwi4qSOXCIsXG5cdFwibGJicmtcIjogXCLinbJcIixcblx0XCJsYnJhY2VcIjogXCJ7XCIsXG5cdFwibGJyYWNrXCI6IFwiW1wiLFxuXHRcImxicmtlXCI6IFwi4qaLXCIsXG5cdFwibGJya3NsZFwiOiBcIuKmj1wiLFxuXHRcImxicmtzbHVcIjogXCLipo1cIixcblx0XCJMY2Fyb25cIjogXCLEvVwiLFxuXHRcImxjYXJvblwiOiBcIsS+XCIsXG5cdFwiTGNlZGlsXCI6IFwixLtcIixcblx0XCJsY2VkaWxcIjogXCLEvFwiLFxuXHRcImxjZWlsXCI6IFwi4oyIXCIsXG5cdFwibGN1YlwiOiBcIntcIixcblx0XCJMY3lcIjogXCLQm1wiLFxuXHRcImxjeVwiOiBcItC7XCIsXG5cdFwibGRjYVwiOiBcIuKktlwiLFxuXHRcImxkcXVvXCI6IFwi4oCcXCIsXG5cdFwibGRxdW9yXCI6IFwi4oCeXCIsXG5cdFwibGRyZGhhclwiOiBcIuKlp1wiLFxuXHRcImxkcnVzaGFyXCI6IFwi4qWLXCIsXG5cdFwibGRzaFwiOiBcIuKGslwiLFxuXHRcImxlXCI6IFwi4omkXCIsXG5cdFwibEVcIjogXCLiiaZcIixcblx0XCJMZWZ0QW5nbGVCcmFja2V0XCI6IFwi4p+oXCIsXG5cdFwiTGVmdEFycm93QmFyXCI6IFwi4oekXCIsXG5cdFwibGVmdGFycm93XCI6IFwi4oaQXCIsXG5cdFwiTGVmdEFycm93XCI6IFwi4oaQXCIsXG5cdFwiTGVmdGFycm93XCI6IFwi4oeQXCIsXG5cdFwiTGVmdEFycm93UmlnaHRBcnJvd1wiOiBcIuKHhlwiLFxuXHRcImxlZnRhcnJvd3RhaWxcIjogXCLihqJcIixcblx0XCJMZWZ0Q2VpbGluZ1wiOiBcIuKMiFwiLFxuXHRcIkxlZnREb3VibGVCcmFja2V0XCI6IFwi4p+mXCIsXG5cdFwiTGVmdERvd25UZWVWZWN0b3JcIjogXCLipaFcIixcblx0XCJMZWZ0RG93blZlY3RvckJhclwiOiBcIuKlmVwiLFxuXHRcIkxlZnREb3duVmVjdG9yXCI6IFwi4oeDXCIsXG5cdFwiTGVmdEZsb29yXCI6IFwi4oyKXCIsXG5cdFwibGVmdGhhcnBvb25kb3duXCI6IFwi4oa9XCIsXG5cdFwibGVmdGhhcnBvb251cFwiOiBcIuKGvFwiLFxuXHRcImxlZnRsZWZ0YXJyb3dzXCI6IFwi4oeHXCIsXG5cdFwibGVmdHJpZ2h0YXJyb3dcIjogXCLihpRcIixcblx0XCJMZWZ0UmlnaHRBcnJvd1wiOiBcIuKGlFwiLFxuXHRcIkxlZnRyaWdodGFycm93XCI6IFwi4oeUXCIsXG5cdFwibGVmdHJpZ2h0YXJyb3dzXCI6IFwi4oeGXCIsXG5cdFwibGVmdHJpZ2h0aGFycG9vbnNcIjogXCLih4tcIixcblx0XCJsZWZ0cmlnaHRzcXVpZ2Fycm93XCI6IFwi4oatXCIsXG5cdFwiTGVmdFJpZ2h0VmVjdG9yXCI6IFwi4qWOXCIsXG5cdFwiTGVmdFRlZUFycm93XCI6IFwi4oakXCIsXG5cdFwiTGVmdFRlZVwiOiBcIuKKo1wiLFxuXHRcIkxlZnRUZWVWZWN0b3JcIjogXCLipZpcIixcblx0XCJsZWZ0dGhyZWV0aW1lc1wiOiBcIuKLi1wiLFxuXHRcIkxlZnRUcmlhbmdsZUJhclwiOiBcIuKnj1wiLFxuXHRcIkxlZnRUcmlhbmdsZVwiOiBcIuKKslwiLFxuXHRcIkxlZnRUcmlhbmdsZUVxdWFsXCI6IFwi4oq0XCIsXG5cdFwiTGVmdFVwRG93blZlY3RvclwiOiBcIuKlkVwiLFxuXHRcIkxlZnRVcFRlZVZlY3RvclwiOiBcIuKloFwiLFxuXHRcIkxlZnRVcFZlY3RvckJhclwiOiBcIuKlmFwiLFxuXHRcIkxlZnRVcFZlY3RvclwiOiBcIuKGv1wiLFxuXHRcIkxlZnRWZWN0b3JCYXJcIjogXCLipZJcIixcblx0XCJMZWZ0VmVjdG9yXCI6IFwi4oa8XCIsXG5cdFwibEVnXCI6IFwi4qqLXCIsXG5cdFwibGVnXCI6IFwi4ouaXCIsXG5cdFwibGVxXCI6IFwi4omkXCIsXG5cdFwibGVxcVwiOiBcIuKJplwiLFxuXHRcImxlcXNsYW50XCI6IFwi4qm9XCIsXG5cdFwibGVzY2NcIjogXCLiqqhcIixcblx0XCJsZXNcIjogXCLiqb1cIixcblx0XCJsZXNkb3RcIjogXCLiqb9cIixcblx0XCJsZXNkb3RvXCI6IFwi4qqBXCIsXG5cdFwibGVzZG90b3JcIjogXCLiqoNcIixcblx0XCJsZXNnXCI6IFwi4oua77iAXCIsXG5cdFwibGVzZ2VzXCI6IFwi4qqTXCIsXG5cdFwibGVzc2FwcHJveFwiOiBcIuKqhVwiLFxuXHRcImxlc3Nkb3RcIjogXCLii5ZcIixcblx0XCJsZXNzZXFndHJcIjogXCLii5pcIixcblx0XCJsZXNzZXFxZ3RyXCI6IFwi4qqLXCIsXG5cdFwiTGVzc0VxdWFsR3JlYXRlclwiOiBcIuKLmlwiLFxuXHRcIkxlc3NGdWxsRXF1YWxcIjogXCLiiaZcIixcblx0XCJMZXNzR3JlYXRlclwiOiBcIuKJtlwiLFxuXHRcImxlc3NndHJcIjogXCLiibZcIixcblx0XCJMZXNzTGVzc1wiOiBcIuKqoVwiLFxuXHRcImxlc3NzaW1cIjogXCLiibJcIixcblx0XCJMZXNzU2xhbnRFcXVhbFwiOiBcIuKpvVwiLFxuXHRcIkxlc3NUaWxkZVwiOiBcIuKJslwiLFxuXHRcImxmaXNodFwiOiBcIuKlvFwiLFxuXHRcImxmbG9vclwiOiBcIuKMilwiLFxuXHRcIkxmclwiOiBcIvCdlI9cIixcblx0XCJsZnJcIjogXCLwnZSpXCIsXG5cdFwibGdcIjogXCLiibZcIixcblx0XCJsZ0VcIjogXCLiqpFcIixcblx0XCJsSGFyXCI6IFwi4qWiXCIsXG5cdFwibGhhcmRcIjogXCLihr1cIixcblx0XCJsaGFydVwiOiBcIuKGvFwiLFxuXHRcImxoYXJ1bFwiOiBcIuKlqlwiLFxuXHRcImxoYmxrXCI6IFwi4paEXCIsXG5cdFwiTEpjeVwiOiBcItCJXCIsXG5cdFwibGpjeVwiOiBcItGZXCIsXG5cdFwibGxhcnJcIjogXCLih4dcIixcblx0XCJsbFwiOiBcIuKJqlwiLFxuXHRcIkxsXCI6IFwi4ouYXCIsXG5cdFwibGxjb3JuZXJcIjogXCLijJ5cIixcblx0XCJMbGVmdGFycm93XCI6IFwi4oeaXCIsXG5cdFwibGxoYXJkXCI6IFwi4qWrXCIsXG5cdFwibGx0cmlcIjogXCLil7pcIixcblx0XCJMbWlkb3RcIjogXCLEv1wiLFxuXHRcImxtaWRvdFwiOiBcIsWAXCIsXG5cdFwibG1vdXN0YWNoZVwiOiBcIuKOsFwiLFxuXHRcImxtb3VzdFwiOiBcIuKOsFwiLFxuXHRcImxuYXBcIjogXCLiqolcIixcblx0XCJsbmFwcHJveFwiOiBcIuKqiVwiLFxuXHRcImxuZVwiOiBcIuKqh1wiLFxuXHRcImxuRVwiOiBcIuKJqFwiLFxuXHRcImxuZXFcIjogXCLiqodcIixcblx0XCJsbmVxcVwiOiBcIuKJqFwiLFxuXHRcImxuc2ltXCI6IFwi4oumXCIsXG5cdFwibG9hbmdcIjogXCLin6xcIixcblx0XCJsb2FyclwiOiBcIuKHvVwiLFxuXHRcImxvYnJrXCI6IFwi4p+mXCIsXG5cdFwibG9uZ2xlZnRhcnJvd1wiOiBcIuKftVwiLFxuXHRcIkxvbmdMZWZ0QXJyb3dcIjogXCLin7VcIixcblx0XCJMb25nbGVmdGFycm93XCI6IFwi4p+4XCIsXG5cdFwibG9uZ2xlZnRyaWdodGFycm93XCI6IFwi4p+3XCIsXG5cdFwiTG9uZ0xlZnRSaWdodEFycm93XCI6IFwi4p+3XCIsXG5cdFwiTG9uZ2xlZnRyaWdodGFycm93XCI6IFwi4p+6XCIsXG5cdFwibG9uZ21hcHN0b1wiOiBcIuKfvFwiLFxuXHRcImxvbmdyaWdodGFycm93XCI6IFwi4p+2XCIsXG5cdFwiTG9uZ1JpZ2h0QXJyb3dcIjogXCLin7ZcIixcblx0XCJMb25ncmlnaHRhcnJvd1wiOiBcIuKfuVwiLFxuXHRcImxvb3BhcnJvd2xlZnRcIjogXCLihqtcIixcblx0XCJsb29wYXJyb3dyaWdodFwiOiBcIuKGrFwiLFxuXHRcImxvcGFyXCI6IFwi4qaFXCIsXG5cdFwiTG9wZlwiOiBcIvCdlYNcIixcblx0XCJsb3BmXCI6IFwi8J2VnVwiLFxuXHRcImxvcGx1c1wiOiBcIuKorVwiLFxuXHRcImxvdGltZXNcIjogXCLiqLRcIixcblx0XCJsb3dhc3RcIjogXCLiiJdcIixcblx0XCJsb3diYXJcIjogXCJfXCIsXG5cdFwiTG93ZXJMZWZ0QXJyb3dcIjogXCLihplcIixcblx0XCJMb3dlclJpZ2h0QXJyb3dcIjogXCLihphcIixcblx0XCJsb3pcIjogXCLil4pcIixcblx0XCJsb3plbmdlXCI6IFwi4peKXCIsXG5cdFwibG96ZlwiOiBcIuKnq1wiLFxuXHRcImxwYXJcIjogXCIoXCIsXG5cdFwibHBhcmx0XCI6IFwi4qaTXCIsXG5cdFwibHJhcnJcIjogXCLih4ZcIixcblx0XCJscmNvcm5lclwiOiBcIuKMn1wiLFxuXHRcImxyaGFyXCI6IFwi4oeLXCIsXG5cdFwibHJoYXJkXCI6IFwi4qWtXCIsXG5cdFwibHJtXCI6IFwi4oCOXCIsXG5cdFwibHJ0cmlcIjogXCLiir9cIixcblx0XCJsc2FxdW9cIjogXCLigLlcIixcblx0XCJsc2NyXCI6IFwi8J2TgVwiLFxuXHRcIkxzY3JcIjogXCLihJJcIixcblx0XCJsc2hcIjogXCLihrBcIixcblx0XCJMc2hcIjogXCLihrBcIixcblx0XCJsc2ltXCI6IFwi4omyXCIsXG5cdFwibHNpbWVcIjogXCLiqo1cIixcblx0XCJsc2ltZ1wiOiBcIuKqj1wiLFxuXHRcImxzcWJcIjogXCJbXCIsXG5cdFwibHNxdW9cIjogXCLigJhcIixcblx0XCJsc3F1b3JcIjogXCLigJpcIixcblx0XCJMc3Ryb2tcIjogXCLFgVwiLFxuXHRcImxzdHJva1wiOiBcIsWCXCIsXG5cdFwibHRjY1wiOiBcIuKqplwiLFxuXHRcImx0Y2lyXCI6IFwi4qm5XCIsXG5cdFwibHRcIjogXCI8XCIsXG5cdFwiTFRcIjogXCI8XCIsXG5cdFwiTHRcIjogXCLiiapcIixcblx0XCJsdGRvdFwiOiBcIuKLllwiLFxuXHRcImx0aHJlZVwiOiBcIuKLi1wiLFxuXHRcImx0aW1lc1wiOiBcIuKLiVwiLFxuXHRcImx0bGFyclwiOiBcIuKltlwiLFxuXHRcImx0cXVlc3RcIjogXCLiqbtcIixcblx0XCJsdHJpXCI6IFwi4peDXCIsXG5cdFwibHRyaWVcIjogXCLiirRcIixcblx0XCJsdHJpZlwiOiBcIuKXglwiLFxuXHRcImx0clBhclwiOiBcIuKmllwiLFxuXHRcImx1cmRzaGFyXCI6IFwi4qWKXCIsXG5cdFwibHVydWhhclwiOiBcIuKlplwiLFxuXHRcImx2ZXJ0bmVxcVwiOiBcIuKJqO+4gFwiLFxuXHRcImx2bkVcIjogXCLiiajvuIBcIixcblx0XCJtYWNyXCI6IFwiwq9cIixcblx0XCJtYWxlXCI6IFwi4pmCXCIsXG5cdFwibWFsdFwiOiBcIuKcoFwiLFxuXHRcIm1hbHRlc2VcIjogXCLinKBcIixcblx0XCJNYXBcIjogXCLipIVcIixcblx0XCJtYXBcIjogXCLihqZcIixcblx0XCJtYXBzdG9cIjogXCLihqZcIixcblx0XCJtYXBzdG9kb3duXCI6IFwi4oanXCIsXG5cdFwibWFwc3RvbGVmdFwiOiBcIuKGpFwiLFxuXHRcIm1hcHN0b3VwXCI6IFwi4oalXCIsXG5cdFwibWFya2VyXCI6IFwi4pauXCIsXG5cdFwibWNvbW1hXCI6IFwi4qipXCIsXG5cdFwiTWN5XCI6IFwi0JxcIixcblx0XCJtY3lcIjogXCLQvFwiLFxuXHRcIm1kYXNoXCI6IFwi4oCUXCIsXG5cdFwibUREb3RcIjogXCLiiLpcIixcblx0XCJtZWFzdXJlZGFuZ2xlXCI6IFwi4oihXCIsXG5cdFwiTWVkaXVtU3BhY2VcIjogXCLigZ9cIixcblx0XCJNZWxsaW50cmZcIjogXCLihLNcIixcblx0XCJNZnJcIjogXCLwnZSQXCIsXG5cdFwibWZyXCI6IFwi8J2UqlwiLFxuXHRcIm1ob1wiOiBcIuKEp1wiLFxuXHRcIm1pY3JvXCI6IFwiwrVcIixcblx0XCJtaWRhc3RcIjogXCIqXCIsXG5cdFwibWlkY2lyXCI6IFwi4quwXCIsXG5cdFwibWlkXCI6IFwi4oijXCIsXG5cdFwibWlkZG90XCI6IFwiwrdcIixcblx0XCJtaW51c2JcIjogXCLiip9cIixcblx0XCJtaW51c1wiOiBcIuKIklwiLFxuXHRcIm1pbnVzZFwiOiBcIuKIuFwiLFxuXHRcIm1pbnVzZHVcIjogXCLiqKpcIixcblx0XCJNaW51c1BsdXNcIjogXCLiiJNcIixcblx0XCJtbGNwXCI6IFwi4qubXCIsXG5cdFwibWxkclwiOiBcIuKAplwiLFxuXHRcIm1ucGx1c1wiOiBcIuKIk1wiLFxuXHRcIm1vZGVsc1wiOiBcIuKKp1wiLFxuXHRcIk1vcGZcIjogXCLwnZWEXCIsXG5cdFwibW9wZlwiOiBcIvCdlZ5cIixcblx0XCJtcFwiOiBcIuKIk1wiLFxuXHRcIm1zY3JcIjogXCLwnZOCXCIsXG5cdFwiTXNjclwiOiBcIuKEs1wiLFxuXHRcIm1zdHBvc1wiOiBcIuKIvlwiLFxuXHRcIk11XCI6IFwizpxcIixcblx0XCJtdVwiOiBcIs68XCIsXG5cdFwibXVsdGltYXBcIjogXCLiirhcIixcblx0XCJtdW1hcFwiOiBcIuKKuFwiLFxuXHRcIm5hYmxhXCI6IFwi4oiHXCIsXG5cdFwiTmFjdXRlXCI6IFwixYNcIixcblx0XCJuYWN1dGVcIjogXCLFhFwiLFxuXHRcIm5hbmdcIjogXCLiiKDig5JcIixcblx0XCJuYXBcIjogXCLiiYlcIixcblx0XCJuYXBFXCI6IFwi4qmwzLhcIixcblx0XCJuYXBpZFwiOiBcIuKJi8y4XCIsXG5cdFwibmFwb3NcIjogXCLFiVwiLFxuXHRcIm5hcHByb3hcIjogXCLiiYlcIixcblx0XCJuYXR1cmFsXCI6IFwi4pmuXCIsXG5cdFwibmF0dXJhbHNcIjogXCLihJVcIixcblx0XCJuYXR1clwiOiBcIuKZrlwiLFxuXHRcIm5ic3BcIjogXCLCoFwiLFxuXHRcIm5idW1wXCI6IFwi4omOzLhcIixcblx0XCJuYnVtcGVcIjogXCLiiY/MuFwiLFxuXHRcIm5jYXBcIjogXCLiqYNcIixcblx0XCJOY2Fyb25cIjogXCLFh1wiLFxuXHRcIm5jYXJvblwiOiBcIsWIXCIsXG5cdFwiTmNlZGlsXCI6IFwixYVcIixcblx0XCJuY2VkaWxcIjogXCLFhlwiLFxuXHRcIm5jb25nXCI6IFwi4omHXCIsXG5cdFwibmNvbmdkb3RcIjogXCLiqa3MuFwiLFxuXHRcIm5jdXBcIjogXCLiqYJcIixcblx0XCJOY3lcIjogXCLQnVwiLFxuXHRcIm5jeVwiOiBcItC9XCIsXG5cdFwibmRhc2hcIjogXCLigJNcIixcblx0XCJuZWFyaGtcIjogXCLipKRcIixcblx0XCJuZWFyclwiOiBcIuKGl1wiLFxuXHRcIm5lQXJyXCI6IFwi4oeXXCIsXG5cdFwibmVhcnJvd1wiOiBcIuKGl1wiLFxuXHRcIm5lXCI6IFwi4omgXCIsXG5cdFwibmVkb3RcIjogXCLiiZDMuFwiLFxuXHRcIk5lZ2F0aXZlTWVkaXVtU3BhY2VcIjogXCLigItcIixcblx0XCJOZWdhdGl2ZVRoaWNrU3BhY2VcIjogXCLigItcIixcblx0XCJOZWdhdGl2ZVRoaW5TcGFjZVwiOiBcIuKAi1wiLFxuXHRcIk5lZ2F0aXZlVmVyeVRoaW5TcGFjZVwiOiBcIuKAi1wiLFxuXHRcIm5lcXVpdlwiOiBcIuKJolwiLFxuXHRcIm5lc2VhclwiOiBcIuKkqFwiLFxuXHRcIm5lc2ltXCI6IFwi4omCzLhcIixcblx0XCJOZXN0ZWRHcmVhdGVyR3JlYXRlclwiOiBcIuKJq1wiLFxuXHRcIk5lc3RlZExlc3NMZXNzXCI6IFwi4omqXCIsXG5cdFwiTmV3TGluZVwiOiBcIlxcblwiLFxuXHRcIm5leGlzdFwiOiBcIuKIhFwiLFxuXHRcIm5leGlzdHNcIjogXCLiiIRcIixcblx0XCJOZnJcIjogXCLwnZSRXCIsXG5cdFwibmZyXCI6IFwi8J2Uq1wiLFxuXHRcIm5nRVwiOiBcIuKJp8y4XCIsXG5cdFwibmdlXCI6IFwi4omxXCIsXG5cdFwibmdlcVwiOiBcIuKJsVwiLFxuXHRcIm5nZXFxXCI6IFwi4omnzLhcIixcblx0XCJuZ2Vxc2xhbnRcIjogXCLiqb7MuFwiLFxuXHRcIm5nZXNcIjogXCLiqb7MuFwiLFxuXHRcIm5HZ1wiOiBcIuKLmcy4XCIsXG5cdFwibmdzaW1cIjogXCLiibVcIixcblx0XCJuR3RcIjogXCLiiavig5JcIixcblx0XCJuZ3RcIjogXCLiia9cIixcblx0XCJuZ3RyXCI6IFwi4omvXCIsXG5cdFwibkd0dlwiOiBcIuKJq8y4XCIsXG5cdFwibmhhcnJcIjogXCLihq5cIixcblx0XCJuaEFyclwiOiBcIuKHjlwiLFxuXHRcIm5ocGFyXCI6IFwi4quyXCIsXG5cdFwibmlcIjogXCLiiItcIixcblx0XCJuaXNcIjogXCLii7xcIixcblx0XCJuaXNkXCI6IFwi4ou6XCIsXG5cdFwibml2XCI6IFwi4oiLXCIsXG5cdFwiTkpjeVwiOiBcItCKXCIsXG5cdFwibmpjeVwiOiBcItGaXCIsXG5cdFwibmxhcnJcIjogXCLihppcIixcblx0XCJubEFyclwiOiBcIuKHjVwiLFxuXHRcIm5sZHJcIjogXCLigKVcIixcblx0XCJubEVcIjogXCLiiabMuFwiLFxuXHRcIm5sZVwiOiBcIuKJsFwiLFxuXHRcIm5sZWZ0YXJyb3dcIjogXCLihppcIixcblx0XCJuTGVmdGFycm93XCI6IFwi4oeNXCIsXG5cdFwibmxlZnRyaWdodGFycm93XCI6IFwi4oauXCIsXG5cdFwibkxlZnRyaWdodGFycm93XCI6IFwi4oeOXCIsXG5cdFwibmxlcVwiOiBcIuKJsFwiLFxuXHRcIm5sZXFxXCI6IFwi4ommzLhcIixcblx0XCJubGVxc2xhbnRcIjogXCLiqb3MuFwiLFxuXHRcIm5sZXNcIjogXCLiqb3MuFwiLFxuXHRcIm5sZXNzXCI6IFwi4omuXCIsXG5cdFwibkxsXCI6IFwi4ouYzLhcIixcblx0XCJubHNpbVwiOiBcIuKJtFwiLFxuXHRcIm5MdFwiOiBcIuKJquKDklwiLFxuXHRcIm5sdFwiOiBcIuKJrlwiLFxuXHRcIm5sdHJpXCI6IFwi4ouqXCIsXG5cdFwibmx0cmllXCI6IFwi4ousXCIsXG5cdFwibkx0dlwiOiBcIuKJqsy4XCIsXG5cdFwibm1pZFwiOiBcIuKIpFwiLFxuXHRcIk5vQnJlYWtcIjogXCLigaBcIixcblx0XCJOb25CcmVha2luZ1NwYWNlXCI6IFwiwqBcIixcblx0XCJub3BmXCI6IFwi8J2Vn1wiLFxuXHRcIk5vcGZcIjogXCLihJVcIixcblx0XCJOb3RcIjogXCLiq6xcIixcblx0XCJub3RcIjogXCLCrFwiLFxuXHRcIk5vdENvbmdydWVudFwiOiBcIuKJolwiLFxuXHRcIk5vdEN1cENhcFwiOiBcIuKJrVwiLFxuXHRcIk5vdERvdWJsZVZlcnRpY2FsQmFyXCI6IFwi4oimXCIsXG5cdFwiTm90RWxlbWVudFwiOiBcIuKIiVwiLFxuXHRcIk5vdEVxdWFsXCI6IFwi4omgXCIsXG5cdFwiTm90RXF1YWxUaWxkZVwiOiBcIuKJgsy4XCIsXG5cdFwiTm90RXhpc3RzXCI6IFwi4oiEXCIsXG5cdFwiTm90R3JlYXRlclwiOiBcIuKJr1wiLFxuXHRcIk5vdEdyZWF0ZXJFcXVhbFwiOiBcIuKJsVwiLFxuXHRcIk5vdEdyZWF0ZXJGdWxsRXF1YWxcIjogXCLiiafMuFwiLFxuXHRcIk5vdEdyZWF0ZXJHcmVhdGVyXCI6IFwi4omrzLhcIixcblx0XCJOb3RHcmVhdGVyTGVzc1wiOiBcIuKJuVwiLFxuXHRcIk5vdEdyZWF0ZXJTbGFudEVxdWFsXCI6IFwi4qm+zLhcIixcblx0XCJOb3RHcmVhdGVyVGlsZGVcIjogXCLiibVcIixcblx0XCJOb3RIdW1wRG93bkh1bXBcIjogXCLiiY7MuFwiLFxuXHRcIk5vdEh1bXBFcXVhbFwiOiBcIuKJj8y4XCIsXG5cdFwibm90aW5cIjogXCLiiIlcIixcblx0XCJub3RpbmRvdFwiOiBcIuKLtcy4XCIsXG5cdFwibm90aW5FXCI6IFwi4ou5zLhcIixcblx0XCJub3RpbnZhXCI6IFwi4oiJXCIsXG5cdFwibm90aW52YlwiOiBcIuKLt1wiLFxuXHRcIm5vdGludmNcIjogXCLii7ZcIixcblx0XCJOb3RMZWZ0VHJpYW5nbGVCYXJcIjogXCLip4/MuFwiLFxuXHRcIk5vdExlZnRUcmlhbmdsZVwiOiBcIuKLqlwiLFxuXHRcIk5vdExlZnRUcmlhbmdsZUVxdWFsXCI6IFwi4ousXCIsXG5cdFwiTm90TGVzc1wiOiBcIuKJrlwiLFxuXHRcIk5vdExlc3NFcXVhbFwiOiBcIuKJsFwiLFxuXHRcIk5vdExlc3NHcmVhdGVyXCI6IFwi4om4XCIsXG5cdFwiTm90TGVzc0xlc3NcIjogXCLiiarMuFwiLFxuXHRcIk5vdExlc3NTbGFudEVxdWFsXCI6IFwi4qm9zLhcIixcblx0XCJOb3RMZXNzVGlsZGVcIjogXCLiibRcIixcblx0XCJOb3ROZXN0ZWRHcmVhdGVyR3JlYXRlclwiOiBcIuKqosy4XCIsXG5cdFwiTm90TmVzdGVkTGVzc0xlc3NcIjogXCLiqqHMuFwiLFxuXHRcIm5vdG5pXCI6IFwi4oiMXCIsXG5cdFwibm90bml2YVwiOiBcIuKIjFwiLFxuXHRcIm5vdG5pdmJcIjogXCLii75cIixcblx0XCJub3RuaXZjXCI6IFwi4ou9XCIsXG5cdFwiTm90UHJlY2VkZXNcIjogXCLiioBcIixcblx0XCJOb3RQcmVjZWRlc0VxdWFsXCI6IFwi4qqvzLhcIixcblx0XCJOb3RQcmVjZWRlc1NsYW50RXF1YWxcIjogXCLii6BcIixcblx0XCJOb3RSZXZlcnNlRWxlbWVudFwiOiBcIuKIjFwiLFxuXHRcIk5vdFJpZ2h0VHJpYW5nbGVCYXJcIjogXCLip5DMuFwiLFxuXHRcIk5vdFJpZ2h0VHJpYW5nbGVcIjogXCLii6tcIixcblx0XCJOb3RSaWdodFRyaWFuZ2xlRXF1YWxcIjogXCLii61cIixcblx0XCJOb3RTcXVhcmVTdWJzZXRcIjogXCLiio/MuFwiLFxuXHRcIk5vdFNxdWFyZVN1YnNldEVxdWFsXCI6IFwi4ouiXCIsXG5cdFwiTm90U3F1YXJlU3VwZXJzZXRcIjogXCLiipDMuFwiLFxuXHRcIk5vdFNxdWFyZVN1cGVyc2V0RXF1YWxcIjogXCLii6NcIixcblx0XCJOb3RTdWJzZXRcIjogXCLiioLig5JcIixcblx0XCJOb3RTdWJzZXRFcXVhbFwiOiBcIuKKiFwiLFxuXHRcIk5vdFN1Y2NlZWRzXCI6IFwi4oqBXCIsXG5cdFwiTm90U3VjY2VlZHNFcXVhbFwiOiBcIuKqsMy4XCIsXG5cdFwiTm90U3VjY2VlZHNTbGFudEVxdWFsXCI6IFwi4ouhXCIsXG5cdFwiTm90U3VjY2VlZHNUaWxkZVwiOiBcIuKJv8y4XCIsXG5cdFwiTm90U3VwZXJzZXRcIjogXCLiioPig5JcIixcblx0XCJOb3RTdXBlcnNldEVxdWFsXCI6IFwi4oqJXCIsXG5cdFwiTm90VGlsZGVcIjogXCLiiYFcIixcblx0XCJOb3RUaWxkZUVxdWFsXCI6IFwi4omEXCIsXG5cdFwiTm90VGlsZGVGdWxsRXF1YWxcIjogXCLiiYdcIixcblx0XCJOb3RUaWxkZVRpbGRlXCI6IFwi4omJXCIsXG5cdFwiTm90VmVydGljYWxCYXJcIjogXCLiiKRcIixcblx0XCJucGFyYWxsZWxcIjogXCLiiKZcIixcblx0XCJucGFyXCI6IFwi4oimXCIsXG5cdFwibnBhcnNsXCI6IFwi4qu94oOlXCIsXG5cdFwibnBhcnRcIjogXCLiiILMuFwiLFxuXHRcIm5wb2xpbnRcIjogXCLiqJRcIixcblx0XCJucHJcIjogXCLiioBcIixcblx0XCJucHJjdWVcIjogXCLii6BcIixcblx0XCJucHJlY1wiOiBcIuKKgFwiLFxuXHRcIm5wcmVjZXFcIjogXCLiqq/MuFwiLFxuXHRcIm5wcmVcIjogXCLiqq/MuFwiLFxuXHRcIm5yYXJyY1wiOiBcIuKks8y4XCIsXG5cdFwibnJhcnJcIjogXCLihptcIixcblx0XCJuckFyclwiOiBcIuKHj1wiLFxuXHRcIm5yYXJyd1wiOiBcIuKGncy4XCIsXG5cdFwibnJpZ2h0YXJyb3dcIjogXCLihptcIixcblx0XCJuUmlnaHRhcnJvd1wiOiBcIuKHj1wiLFxuXHRcIm5ydHJpXCI6IFwi4ourXCIsXG5cdFwibnJ0cmllXCI6IFwi4outXCIsXG5cdFwibnNjXCI6IFwi4oqBXCIsXG5cdFwibnNjY3VlXCI6IFwi4ouhXCIsXG5cdFwibnNjZVwiOiBcIuKqsMy4XCIsXG5cdFwiTnNjclwiOiBcIvCdkqlcIixcblx0XCJuc2NyXCI6IFwi8J2Tg1wiLFxuXHRcIm5zaG9ydG1pZFwiOiBcIuKIpFwiLFxuXHRcIm5zaG9ydHBhcmFsbGVsXCI6IFwi4oimXCIsXG5cdFwibnNpbVwiOiBcIuKJgVwiLFxuXHRcIm5zaW1lXCI6IFwi4omEXCIsXG5cdFwibnNpbWVxXCI6IFwi4omEXCIsXG5cdFwibnNtaWRcIjogXCLiiKRcIixcblx0XCJuc3BhclwiOiBcIuKIplwiLFxuXHRcIm5zcXN1YmVcIjogXCLii6JcIixcblx0XCJuc3FzdXBlXCI6IFwi4oujXCIsXG5cdFwibnN1YlwiOiBcIuKKhFwiLFxuXHRcIm5zdWJFXCI6IFwi4quFzLhcIixcblx0XCJuc3ViZVwiOiBcIuKKiFwiLFxuXHRcIm5zdWJzZXRcIjogXCLiioLig5JcIixcblx0XCJuc3Vic2V0ZXFcIjogXCLiiohcIixcblx0XCJuc3Vic2V0ZXFxXCI6IFwi4quFzLhcIixcblx0XCJuc3VjY1wiOiBcIuKKgVwiLFxuXHRcIm5zdWNjZXFcIjogXCLiqrDMuFwiLFxuXHRcIm5zdXBcIjogXCLiioVcIixcblx0XCJuc3VwRVwiOiBcIuKrhsy4XCIsXG5cdFwibnN1cGVcIjogXCLiiolcIixcblx0XCJuc3Vwc2V0XCI6IFwi4oqD4oOSXCIsXG5cdFwibnN1cHNldGVxXCI6IFwi4oqJXCIsXG5cdFwibnN1cHNldGVxcVwiOiBcIuKrhsy4XCIsXG5cdFwibnRnbFwiOiBcIuKJuVwiLFxuXHRcIk50aWxkZVwiOiBcIsORXCIsXG5cdFwibnRpbGRlXCI6IFwiw7FcIixcblx0XCJudGxnXCI6IFwi4om4XCIsXG5cdFwibnRyaWFuZ2xlbGVmdFwiOiBcIuKLqlwiLFxuXHRcIm50cmlhbmdsZWxlZnRlcVwiOiBcIuKLrFwiLFxuXHRcIm50cmlhbmdsZXJpZ2h0XCI6IFwi4ourXCIsXG5cdFwibnRyaWFuZ2xlcmlnaHRlcVwiOiBcIuKLrVwiLFxuXHRcIk51XCI6IFwizp1cIixcblx0XCJudVwiOiBcIs69XCIsXG5cdFwibnVtXCI6IFwiI1wiLFxuXHRcIm51bWVyb1wiOiBcIuKEllwiLFxuXHRcIm51bXNwXCI6IFwi4oCHXCIsXG5cdFwibnZhcFwiOiBcIuKJjeKDklwiLFxuXHRcIm52ZGFzaFwiOiBcIuKKrFwiLFxuXHRcIm52RGFzaFwiOiBcIuKKrVwiLFxuXHRcIm5WZGFzaFwiOiBcIuKKrlwiLFxuXHRcIm5WRGFzaFwiOiBcIuKKr1wiLFxuXHRcIm52Z2VcIjogXCLiiaXig5JcIixcblx0XCJudmd0XCI6IFwiPuKDklwiLFxuXHRcIm52SGFyclwiOiBcIuKkhFwiLFxuXHRcIm52aW5maW5cIjogXCLip55cIixcblx0XCJudmxBcnJcIjogXCLipIJcIixcblx0XCJudmxlXCI6IFwi4omk4oOSXCIsXG5cdFwibnZsdFwiOiBcIjzig5JcIixcblx0XCJudmx0cmllXCI6IFwi4oq04oOSXCIsXG5cdFwibnZyQXJyXCI6IFwi4qSDXCIsXG5cdFwibnZydHJpZVwiOiBcIuKKteKDklwiLFxuXHRcIm52c2ltXCI6IFwi4oi84oOSXCIsXG5cdFwibndhcmhrXCI6IFwi4qSjXCIsXG5cdFwibndhcnJcIjogXCLihpZcIixcblx0XCJud0FyclwiOiBcIuKHllwiLFxuXHRcIm53YXJyb3dcIjogXCLihpZcIixcblx0XCJud25lYXJcIjogXCLipKdcIixcblx0XCJPYWN1dGVcIjogXCLDk1wiLFxuXHRcIm9hY3V0ZVwiOiBcIsOzXCIsXG5cdFwib2FzdFwiOiBcIuKKm1wiLFxuXHRcIk9jaXJjXCI6IFwiw5RcIixcblx0XCJvY2lyY1wiOiBcIsO0XCIsXG5cdFwib2NpclwiOiBcIuKKmlwiLFxuXHRcIk9jeVwiOiBcItCeXCIsXG5cdFwib2N5XCI6IFwi0L5cIixcblx0XCJvZGFzaFwiOiBcIuKKnVwiLFxuXHRcIk9kYmxhY1wiOiBcIsWQXCIsXG5cdFwib2RibGFjXCI6IFwixZFcIixcblx0XCJvZGl2XCI6IFwi4qi4XCIsXG5cdFwib2RvdFwiOiBcIuKKmVwiLFxuXHRcIm9kc29sZFwiOiBcIuKmvFwiLFxuXHRcIk9FbGlnXCI6IFwixZJcIixcblx0XCJvZWxpZ1wiOiBcIsWTXCIsXG5cdFwib2ZjaXJcIjogXCLipr9cIixcblx0XCJPZnJcIjogXCLwnZSSXCIsXG5cdFwib2ZyXCI6IFwi8J2UrFwiLFxuXHRcIm9nb25cIjogXCLLm1wiLFxuXHRcIk9ncmF2ZVwiOiBcIsOSXCIsXG5cdFwib2dyYXZlXCI6IFwiw7JcIixcblx0XCJvZ3RcIjogXCLip4FcIixcblx0XCJvaGJhclwiOiBcIuKmtVwiLFxuXHRcIm9obVwiOiBcIs6pXCIsXG5cdFwib2ludFwiOiBcIuKIrlwiLFxuXHRcIm9sYXJyXCI6IFwi4oa6XCIsXG5cdFwib2xjaXJcIjogXCLipr5cIixcblx0XCJvbGNyb3NzXCI6IFwi4qa7XCIsXG5cdFwib2xpbmVcIjogXCLigL5cIixcblx0XCJvbHRcIjogXCLip4BcIixcblx0XCJPbWFjclwiOiBcIsWMXCIsXG5cdFwib21hY3JcIjogXCLFjVwiLFxuXHRcIk9tZWdhXCI6IFwizqlcIixcblx0XCJvbWVnYVwiOiBcIs+JXCIsXG5cdFwiT21pY3JvblwiOiBcIs6fXCIsXG5cdFwib21pY3JvblwiOiBcIs6/XCIsXG5cdFwib21pZFwiOiBcIuKmtlwiLFxuXHRcIm9taW51c1wiOiBcIuKKllwiLFxuXHRcIk9vcGZcIjogXCLwnZWGXCIsXG5cdFwib29wZlwiOiBcIvCdlaBcIixcblx0XCJvcGFyXCI6IFwi4qa3XCIsXG5cdFwiT3BlbkN1cmx5RG91YmxlUXVvdGVcIjogXCLigJxcIixcblx0XCJPcGVuQ3VybHlRdW90ZVwiOiBcIuKAmFwiLFxuXHRcIm9wZXJwXCI6IFwi4qa5XCIsXG5cdFwib3BsdXNcIjogXCLiipVcIixcblx0XCJvcmFyclwiOiBcIuKGu1wiLFxuXHRcIk9yXCI6IFwi4qmUXCIsXG5cdFwib3JcIjogXCLiiKhcIixcblx0XCJvcmRcIjogXCLiqZ1cIixcblx0XCJvcmRlclwiOiBcIuKEtFwiLFxuXHRcIm9yZGVyb2ZcIjogXCLihLRcIixcblx0XCJvcmRmXCI6IFwiwqpcIixcblx0XCJvcmRtXCI6IFwiwrpcIixcblx0XCJvcmlnb2ZcIjogXCLiirZcIixcblx0XCJvcm9yXCI6IFwi4qmWXCIsXG5cdFwib3JzbG9wZVwiOiBcIuKpl1wiLFxuXHRcIm9ydlwiOiBcIuKpm1wiLFxuXHRcIm9TXCI6IFwi4pOIXCIsXG5cdFwiT3NjclwiOiBcIvCdkqpcIixcblx0XCJvc2NyXCI6IFwi4oS0XCIsXG5cdFwiT3NsYXNoXCI6IFwiw5hcIixcblx0XCJvc2xhc2hcIjogXCLDuFwiLFxuXHRcIm9zb2xcIjogXCLiiphcIixcblx0XCJPdGlsZGVcIjogXCLDlVwiLFxuXHRcIm90aWxkZVwiOiBcIsO1XCIsXG5cdFwib3RpbWVzYXNcIjogXCLiqLZcIixcblx0XCJPdGltZXNcIjogXCLiqLdcIixcblx0XCJvdGltZXNcIjogXCLiipdcIixcblx0XCJPdW1sXCI6IFwiw5ZcIixcblx0XCJvdW1sXCI6IFwiw7ZcIixcblx0XCJvdmJhclwiOiBcIuKMvVwiLFxuXHRcIk92ZXJCYXJcIjogXCLigL5cIixcblx0XCJPdmVyQnJhY2VcIjogXCLij55cIixcblx0XCJPdmVyQnJhY2tldFwiOiBcIuKOtFwiLFxuXHRcIk92ZXJQYXJlbnRoZXNpc1wiOiBcIuKPnFwiLFxuXHRcInBhcmFcIjogXCLCtlwiLFxuXHRcInBhcmFsbGVsXCI6IFwi4oilXCIsXG5cdFwicGFyXCI6IFwi4oilXCIsXG5cdFwicGFyc2ltXCI6IFwi4quzXCIsXG5cdFwicGFyc2xcIjogXCLiq71cIixcblx0XCJwYXJ0XCI6IFwi4oiCXCIsXG5cdFwiUGFydGlhbERcIjogXCLiiIJcIixcblx0XCJQY3lcIjogXCLQn1wiLFxuXHRcInBjeVwiOiBcItC/XCIsXG5cdFwicGVyY250XCI6IFwiJVwiLFxuXHRcInBlcmlvZFwiOiBcIi5cIixcblx0XCJwZXJtaWxcIjogXCLigLBcIixcblx0XCJwZXJwXCI6IFwi4oqlXCIsXG5cdFwicGVydGVua1wiOiBcIuKAsVwiLFxuXHRcIlBmclwiOiBcIvCdlJNcIixcblx0XCJwZnJcIjogXCLwnZStXCIsXG5cdFwiUGhpXCI6IFwizqZcIixcblx0XCJwaGlcIjogXCLPhlwiLFxuXHRcInBoaXZcIjogXCLPlVwiLFxuXHRcInBobW1hdFwiOiBcIuKEs1wiLFxuXHRcInBob25lXCI6IFwi4piOXCIsXG5cdFwiUGlcIjogXCLOoFwiLFxuXHRcInBpXCI6IFwiz4BcIixcblx0XCJwaXRjaGZvcmtcIjogXCLii5RcIixcblx0XCJwaXZcIjogXCLPllwiLFxuXHRcInBsYW5ja1wiOiBcIuKEj1wiLFxuXHRcInBsYW5ja2hcIjogXCLihI5cIixcblx0XCJwbGFua3ZcIjogXCLihI9cIixcblx0XCJwbHVzYWNpclwiOiBcIuKoo1wiLFxuXHRcInBsdXNiXCI6IFwi4oqeXCIsXG5cdFwicGx1c2NpclwiOiBcIuKoolwiLFxuXHRcInBsdXNcIjogXCIrXCIsXG5cdFwicGx1c2RvXCI6IFwi4oiUXCIsXG5cdFwicGx1c2R1XCI6IFwi4qilXCIsXG5cdFwicGx1c2VcIjogXCLiqbJcIixcblx0XCJQbHVzTWludXNcIjogXCLCsVwiLFxuXHRcInBsdXNtblwiOiBcIsKxXCIsXG5cdFwicGx1c3NpbVwiOiBcIuKoplwiLFxuXHRcInBsdXN0d29cIjogXCLiqKdcIixcblx0XCJwbVwiOiBcIsKxXCIsXG5cdFwiUG9pbmNhcmVwbGFuZVwiOiBcIuKEjFwiLFxuXHRcInBvaW50aW50XCI6IFwi4qiVXCIsXG5cdFwicG9wZlwiOiBcIvCdlaFcIixcblx0XCJQb3BmXCI6IFwi4oSZXCIsXG5cdFwicG91bmRcIjogXCLCo1wiLFxuXHRcInByYXBcIjogXCLiqrdcIixcblx0XCJQclwiOiBcIuKqu1wiLFxuXHRcInByXCI6IFwi4om6XCIsXG5cdFwicHJjdWVcIjogXCLiibxcIixcblx0XCJwcmVjYXBwcm94XCI6IFwi4qq3XCIsXG5cdFwicHJlY1wiOiBcIuKJulwiLFxuXHRcInByZWNjdXJseWVxXCI6IFwi4om8XCIsXG5cdFwiUHJlY2VkZXNcIjogXCLiibpcIixcblx0XCJQcmVjZWRlc0VxdWFsXCI6IFwi4qqvXCIsXG5cdFwiUHJlY2VkZXNTbGFudEVxdWFsXCI6IFwi4om8XCIsXG5cdFwiUHJlY2VkZXNUaWxkZVwiOiBcIuKJvlwiLFxuXHRcInByZWNlcVwiOiBcIuKqr1wiLFxuXHRcInByZWNuYXBwcm94XCI6IFwi4qq5XCIsXG5cdFwicHJlY25lcXFcIjogXCLiqrVcIixcblx0XCJwcmVjbnNpbVwiOiBcIuKLqFwiLFxuXHRcInByZVwiOiBcIuKqr1wiLFxuXHRcInByRVwiOiBcIuKqs1wiLFxuXHRcInByZWNzaW1cIjogXCLiib5cIixcblx0XCJwcmltZVwiOiBcIuKAslwiLFxuXHRcIlByaW1lXCI6IFwi4oCzXCIsXG5cdFwicHJpbWVzXCI6IFwi4oSZXCIsXG5cdFwicHJuYXBcIjogXCLiqrlcIixcblx0XCJwcm5FXCI6IFwi4qq1XCIsXG5cdFwicHJuc2ltXCI6IFwi4ouoXCIsXG5cdFwicHJvZFwiOiBcIuKIj1wiLFxuXHRcIlByb2R1Y3RcIjogXCLiiI9cIixcblx0XCJwcm9mYWxhclwiOiBcIuKMrlwiLFxuXHRcInByb2ZsaW5lXCI6IFwi4oySXCIsXG5cdFwicHJvZnN1cmZcIjogXCLijJNcIixcblx0XCJwcm9wXCI6IFwi4oidXCIsXG5cdFwiUHJvcG9ydGlvbmFsXCI6IFwi4oidXCIsXG5cdFwiUHJvcG9ydGlvblwiOiBcIuKIt1wiLFxuXHRcInByb3B0b1wiOiBcIuKInVwiLFxuXHRcInByc2ltXCI6IFwi4om+XCIsXG5cdFwicHJ1cmVsXCI6IFwi4oqwXCIsXG5cdFwiUHNjclwiOiBcIvCdkqtcIixcblx0XCJwc2NyXCI6IFwi8J2ThVwiLFxuXHRcIlBzaVwiOiBcIs6oXCIsXG5cdFwicHNpXCI6IFwiz4hcIixcblx0XCJwdW5jc3BcIjogXCLigIhcIixcblx0XCJRZnJcIjogXCLwnZSUXCIsXG5cdFwicWZyXCI6IFwi8J2UrlwiLFxuXHRcInFpbnRcIjogXCLiqIxcIixcblx0XCJxb3BmXCI6IFwi8J2VolwiLFxuXHRcIlFvcGZcIjogXCLihJpcIixcblx0XCJxcHJpbWVcIjogXCLigZdcIixcblx0XCJRc2NyXCI6IFwi8J2SrFwiLFxuXHRcInFzY3JcIjogXCLwnZOGXCIsXG5cdFwicXVhdGVybmlvbnNcIjogXCLihI1cIixcblx0XCJxdWF0aW50XCI6IFwi4qiWXCIsXG5cdFwicXVlc3RcIjogXCI/XCIsXG5cdFwicXVlc3RlcVwiOiBcIuKJn1wiLFxuXHRcInF1b3RcIjogXCJcXFwiXCIsXG5cdFwiUVVPVFwiOiBcIlxcXCJcIixcblx0XCJyQWFyclwiOiBcIuKHm1wiLFxuXHRcInJhY2VcIjogXCLiiL3MsVwiLFxuXHRcIlJhY3V0ZVwiOiBcIsWUXCIsXG5cdFwicmFjdXRlXCI6IFwixZVcIixcblx0XCJyYWRpY1wiOiBcIuKImlwiLFxuXHRcInJhZW1wdHl2XCI6IFwi4qazXCIsXG5cdFwicmFuZ1wiOiBcIuKfqVwiLFxuXHRcIlJhbmdcIjogXCLin6tcIixcblx0XCJyYW5nZFwiOiBcIuKmklwiLFxuXHRcInJhbmdlXCI6IFwi4qalXCIsXG5cdFwicmFuZ2xlXCI6IFwi4p+pXCIsXG5cdFwicmFxdW9cIjogXCLCu1wiLFxuXHRcInJhcnJhcFwiOiBcIuKltVwiLFxuXHRcInJhcnJiXCI6IFwi4oelXCIsXG5cdFwicmFycmJmc1wiOiBcIuKkoFwiLFxuXHRcInJhcnJjXCI6IFwi4qSzXCIsXG5cdFwicmFyclwiOiBcIuKGklwiLFxuXHRcIlJhcnJcIjogXCLihqBcIixcblx0XCJyQXJyXCI6IFwi4oeSXCIsXG5cdFwicmFycmZzXCI6IFwi4qSeXCIsXG5cdFwicmFycmhrXCI6IFwi4oaqXCIsXG5cdFwicmFycmxwXCI6IFwi4oasXCIsXG5cdFwicmFycnBsXCI6IFwi4qWFXCIsXG5cdFwicmFycnNpbVwiOiBcIuKltFwiLFxuXHRcIlJhcnJ0bFwiOiBcIuKkllwiLFxuXHRcInJhcnJ0bFwiOiBcIuKGo1wiLFxuXHRcInJhcnJ3XCI6IFwi4oadXCIsXG5cdFwicmF0YWlsXCI6IFwi4qSaXCIsXG5cdFwickF0YWlsXCI6IFwi4qScXCIsXG5cdFwicmF0aW9cIjogXCLiiLZcIixcblx0XCJyYXRpb25hbHNcIjogXCLihJpcIixcblx0XCJyYmFyclwiOiBcIuKkjVwiLFxuXHRcInJCYXJyXCI6IFwi4qSPXCIsXG5cdFwiUkJhcnJcIjogXCLipJBcIixcblx0XCJyYmJya1wiOiBcIuKds1wiLFxuXHRcInJicmFjZVwiOiBcIn1cIixcblx0XCJyYnJhY2tcIjogXCJdXCIsXG5cdFwicmJya2VcIjogXCLipoxcIixcblx0XCJyYnJrc2xkXCI6IFwi4qaOXCIsXG5cdFwicmJya3NsdVwiOiBcIuKmkFwiLFxuXHRcIlJjYXJvblwiOiBcIsWYXCIsXG5cdFwicmNhcm9uXCI6IFwixZlcIixcblx0XCJSY2VkaWxcIjogXCLFllwiLFxuXHRcInJjZWRpbFwiOiBcIsWXXCIsXG5cdFwicmNlaWxcIjogXCLijIlcIixcblx0XCJyY3ViXCI6IFwifVwiLFxuXHRcIlJjeVwiOiBcItCgXCIsXG5cdFwicmN5XCI6IFwi0YBcIixcblx0XCJyZGNhXCI6IFwi4qS3XCIsXG5cdFwicmRsZGhhclwiOiBcIuKlqVwiLFxuXHRcInJkcXVvXCI6IFwi4oCdXCIsXG5cdFwicmRxdW9yXCI6IFwi4oCdXCIsXG5cdFwicmRzaFwiOiBcIuKGs1wiLFxuXHRcInJlYWxcIjogXCLihJxcIixcblx0XCJyZWFsaW5lXCI6IFwi4oSbXCIsXG5cdFwicmVhbHBhcnRcIjogXCLihJxcIixcblx0XCJyZWFsc1wiOiBcIuKEnVwiLFxuXHRcIlJlXCI6IFwi4oScXCIsXG5cdFwicmVjdFwiOiBcIuKWrVwiLFxuXHRcInJlZ1wiOiBcIsKuXCIsXG5cdFwiUkVHXCI6IFwiwq5cIixcblx0XCJSZXZlcnNlRWxlbWVudFwiOiBcIuKIi1wiLFxuXHRcIlJldmVyc2VFcXVpbGlicml1bVwiOiBcIuKHi1wiLFxuXHRcIlJldmVyc2VVcEVxdWlsaWJyaXVtXCI6IFwi4qWvXCIsXG5cdFwicmZpc2h0XCI6IFwi4qW9XCIsXG5cdFwicmZsb29yXCI6IFwi4oyLXCIsXG5cdFwicmZyXCI6IFwi8J2Ur1wiLFxuXHRcIlJmclwiOiBcIuKEnFwiLFxuXHRcInJIYXJcIjogXCLipaRcIixcblx0XCJyaGFyZFwiOiBcIuKHgVwiLFxuXHRcInJoYXJ1XCI6IFwi4oeAXCIsXG5cdFwicmhhcnVsXCI6IFwi4qWsXCIsXG5cdFwiUmhvXCI6IFwizqFcIixcblx0XCJyaG9cIjogXCLPgVwiLFxuXHRcInJob3ZcIjogXCLPsVwiLFxuXHRcIlJpZ2h0QW5nbGVCcmFja2V0XCI6IFwi4p+pXCIsXG5cdFwiUmlnaHRBcnJvd0JhclwiOiBcIuKHpVwiLFxuXHRcInJpZ2h0YXJyb3dcIjogXCLihpJcIixcblx0XCJSaWdodEFycm93XCI6IFwi4oaSXCIsXG5cdFwiUmlnaHRhcnJvd1wiOiBcIuKHklwiLFxuXHRcIlJpZ2h0QXJyb3dMZWZ0QXJyb3dcIjogXCLih4RcIixcblx0XCJyaWdodGFycm93dGFpbFwiOiBcIuKGo1wiLFxuXHRcIlJpZ2h0Q2VpbGluZ1wiOiBcIuKMiVwiLFxuXHRcIlJpZ2h0RG91YmxlQnJhY2tldFwiOiBcIuKfp1wiLFxuXHRcIlJpZ2h0RG93blRlZVZlY3RvclwiOiBcIuKlnVwiLFxuXHRcIlJpZ2h0RG93blZlY3RvckJhclwiOiBcIuKllVwiLFxuXHRcIlJpZ2h0RG93blZlY3RvclwiOiBcIuKHglwiLFxuXHRcIlJpZ2h0Rmxvb3JcIjogXCLijItcIixcblx0XCJyaWdodGhhcnBvb25kb3duXCI6IFwi4oeBXCIsXG5cdFwicmlnaHRoYXJwb29udXBcIjogXCLih4BcIixcblx0XCJyaWdodGxlZnRhcnJvd3NcIjogXCLih4RcIixcblx0XCJyaWdodGxlZnRoYXJwb29uc1wiOiBcIuKHjFwiLFxuXHRcInJpZ2h0cmlnaHRhcnJvd3NcIjogXCLih4lcIixcblx0XCJyaWdodHNxdWlnYXJyb3dcIjogXCLihp1cIixcblx0XCJSaWdodFRlZUFycm93XCI6IFwi4oamXCIsXG5cdFwiUmlnaHRUZWVcIjogXCLiiqJcIixcblx0XCJSaWdodFRlZVZlY3RvclwiOiBcIuKlm1wiLFxuXHRcInJpZ2h0dGhyZWV0aW1lc1wiOiBcIuKLjFwiLFxuXHRcIlJpZ2h0VHJpYW5nbGVCYXJcIjogXCLip5BcIixcblx0XCJSaWdodFRyaWFuZ2xlXCI6IFwi4oqzXCIsXG5cdFwiUmlnaHRUcmlhbmdsZUVxdWFsXCI6IFwi4oq1XCIsXG5cdFwiUmlnaHRVcERvd25WZWN0b3JcIjogXCLipY9cIixcblx0XCJSaWdodFVwVGVlVmVjdG9yXCI6IFwi4qWcXCIsXG5cdFwiUmlnaHRVcFZlY3RvckJhclwiOiBcIuKllFwiLFxuXHRcIlJpZ2h0VXBWZWN0b3JcIjogXCLihr5cIixcblx0XCJSaWdodFZlY3RvckJhclwiOiBcIuKlk1wiLFxuXHRcIlJpZ2h0VmVjdG9yXCI6IFwi4oeAXCIsXG5cdFwicmluZ1wiOiBcIsuaXCIsXG5cdFwicmlzaW5nZG90c2VxXCI6IFwi4omTXCIsXG5cdFwicmxhcnJcIjogXCLih4RcIixcblx0XCJybGhhclwiOiBcIuKHjFwiLFxuXHRcInJsbVwiOiBcIuKAj1wiLFxuXHRcInJtb3VzdGFjaGVcIjogXCLijrFcIixcblx0XCJybW91c3RcIjogXCLijrFcIixcblx0XCJybm1pZFwiOiBcIuKrrlwiLFxuXHRcInJvYW5nXCI6IFwi4p+tXCIsXG5cdFwicm9hcnJcIjogXCLih75cIixcblx0XCJyb2Jya1wiOiBcIuKfp1wiLFxuXHRcInJvcGFyXCI6IFwi4qaGXCIsXG5cdFwicm9wZlwiOiBcIvCdlaNcIixcblx0XCJSb3BmXCI6IFwi4oSdXCIsXG5cdFwicm9wbHVzXCI6IFwi4qiuXCIsXG5cdFwicm90aW1lc1wiOiBcIuKotVwiLFxuXHRcIlJvdW5kSW1wbGllc1wiOiBcIuKlsFwiLFxuXHRcInJwYXJcIjogXCIpXCIsXG5cdFwicnBhcmd0XCI6IFwi4qaUXCIsXG5cdFwicnBwb2xpbnRcIjogXCLiqJJcIixcblx0XCJycmFyclwiOiBcIuKHiVwiLFxuXHRcIlJyaWdodGFycm93XCI6IFwi4oebXCIsXG5cdFwicnNhcXVvXCI6IFwi4oC6XCIsXG5cdFwicnNjclwiOiBcIvCdk4dcIixcblx0XCJSc2NyXCI6IFwi4oSbXCIsXG5cdFwicnNoXCI6IFwi4oaxXCIsXG5cdFwiUnNoXCI6IFwi4oaxXCIsXG5cdFwicnNxYlwiOiBcIl1cIixcblx0XCJyc3F1b1wiOiBcIuKAmVwiLFxuXHRcInJzcXVvclwiOiBcIuKAmVwiLFxuXHRcInJ0aHJlZVwiOiBcIuKLjFwiLFxuXHRcInJ0aW1lc1wiOiBcIuKLilwiLFxuXHRcInJ0cmlcIjogXCLilrlcIixcblx0XCJydHJpZVwiOiBcIuKKtVwiLFxuXHRcInJ0cmlmXCI6IFwi4pa4XCIsXG5cdFwicnRyaWx0cmlcIjogXCLip45cIixcblx0XCJSdWxlRGVsYXllZFwiOiBcIuKntFwiLFxuXHRcInJ1bHVoYXJcIjogXCLipahcIixcblx0XCJyeFwiOiBcIuKEnlwiLFxuXHRcIlNhY3V0ZVwiOiBcIsWaXCIsXG5cdFwic2FjdXRlXCI6IFwixZtcIixcblx0XCJzYnF1b1wiOiBcIuKAmlwiLFxuXHRcInNjYXBcIjogXCLiqrhcIixcblx0XCJTY2Fyb25cIjogXCLFoFwiLFxuXHRcInNjYXJvblwiOiBcIsWhXCIsXG5cdFwiU2NcIjogXCLiqrxcIixcblx0XCJzY1wiOiBcIuKJu1wiLFxuXHRcInNjY3VlXCI6IFwi4om9XCIsXG5cdFwic2NlXCI6IFwi4qqwXCIsXG5cdFwic2NFXCI6IFwi4qq0XCIsXG5cdFwiU2NlZGlsXCI6IFwixZ5cIixcblx0XCJzY2VkaWxcIjogXCLFn1wiLFxuXHRcIlNjaXJjXCI6IFwixZxcIixcblx0XCJzY2lyY1wiOiBcIsWdXCIsXG5cdFwic2NuYXBcIjogXCLiqrpcIixcblx0XCJzY25FXCI6IFwi4qq2XCIsXG5cdFwic2Nuc2ltXCI6IFwi4oupXCIsXG5cdFwic2Nwb2xpbnRcIjogXCLiqJNcIixcblx0XCJzY3NpbVwiOiBcIuKJv1wiLFxuXHRcIlNjeVwiOiBcItChXCIsXG5cdFwic2N5XCI6IFwi0YFcIixcblx0XCJzZG90YlwiOiBcIuKKoVwiLFxuXHRcInNkb3RcIjogXCLii4VcIixcblx0XCJzZG90ZVwiOiBcIuKpplwiLFxuXHRcInNlYXJoa1wiOiBcIuKkpVwiLFxuXHRcInNlYXJyXCI6IFwi4oaYXCIsXG5cdFwic2VBcnJcIjogXCLih5hcIixcblx0XCJzZWFycm93XCI6IFwi4oaYXCIsXG5cdFwic2VjdFwiOiBcIsKnXCIsXG5cdFwic2VtaVwiOiBcIjtcIixcblx0XCJzZXN3YXJcIjogXCLipKlcIixcblx0XCJzZXRtaW51c1wiOiBcIuKIllwiLFxuXHRcInNldG1uXCI6IFwi4oiWXCIsXG5cdFwic2V4dFwiOiBcIuKctlwiLFxuXHRcIlNmclwiOiBcIvCdlJZcIixcblx0XCJzZnJcIjogXCLwnZSwXCIsXG5cdFwic2Zyb3duXCI6IFwi4oyiXCIsXG5cdFwic2hhcnBcIjogXCLima9cIixcblx0XCJTSENIY3lcIjogXCLQqVwiLFxuXHRcInNoY2hjeVwiOiBcItGJXCIsXG5cdFwiU0hjeVwiOiBcItCoXCIsXG5cdFwic2hjeVwiOiBcItGIXCIsXG5cdFwiU2hvcnREb3duQXJyb3dcIjogXCLihpNcIixcblx0XCJTaG9ydExlZnRBcnJvd1wiOiBcIuKGkFwiLFxuXHRcInNob3J0bWlkXCI6IFwi4oijXCIsXG5cdFwic2hvcnRwYXJhbGxlbFwiOiBcIuKIpVwiLFxuXHRcIlNob3J0UmlnaHRBcnJvd1wiOiBcIuKGklwiLFxuXHRcIlNob3J0VXBBcnJvd1wiOiBcIuKGkVwiLFxuXHRcInNoeVwiOiBcIsKtXCIsXG5cdFwiU2lnbWFcIjogXCLOo1wiLFxuXHRcInNpZ21hXCI6IFwiz4NcIixcblx0XCJzaWdtYWZcIjogXCLPglwiLFxuXHRcInNpZ21hdlwiOiBcIs+CXCIsXG5cdFwic2ltXCI6IFwi4oi8XCIsXG5cdFwic2ltZG90XCI6IFwi4qmqXCIsXG5cdFwic2ltZVwiOiBcIuKJg1wiLFxuXHRcInNpbWVxXCI6IFwi4omDXCIsXG5cdFwic2ltZ1wiOiBcIuKqnlwiLFxuXHRcInNpbWdFXCI6IFwi4qqgXCIsXG5cdFwic2ltbFwiOiBcIuKqnVwiLFxuXHRcInNpbWxFXCI6IFwi4qqfXCIsXG5cdFwic2ltbmVcIjogXCLiiYZcIixcblx0XCJzaW1wbHVzXCI6IFwi4qikXCIsXG5cdFwic2ltcmFyclwiOiBcIuKlslwiLFxuXHRcInNsYXJyXCI6IFwi4oaQXCIsXG5cdFwiU21hbGxDaXJjbGVcIjogXCLiiJhcIixcblx0XCJzbWFsbHNldG1pbnVzXCI6IFwi4oiWXCIsXG5cdFwic21hc2hwXCI6IFwi4qizXCIsXG5cdFwic21lcGFyc2xcIjogXCLip6RcIixcblx0XCJzbWlkXCI6IFwi4oijXCIsXG5cdFwic21pbGVcIjogXCLijKNcIixcblx0XCJzbXRcIjogXCLiqqpcIixcblx0XCJzbXRlXCI6IFwi4qqsXCIsXG5cdFwic210ZXNcIjogXCLiqqzvuIBcIixcblx0XCJTT0ZUY3lcIjogXCLQrFwiLFxuXHRcInNvZnRjeVwiOiBcItGMXCIsXG5cdFwic29sYmFyXCI6IFwi4oy/XCIsXG5cdFwic29sYlwiOiBcIuKnhFwiLFxuXHRcInNvbFwiOiBcIi9cIixcblx0XCJTb3BmXCI6IFwi8J2VilwiLFxuXHRcInNvcGZcIjogXCLwnZWkXCIsXG5cdFwic3BhZGVzXCI6IFwi4pmgXCIsXG5cdFwic3BhZGVzdWl0XCI6IFwi4pmgXCIsXG5cdFwic3BhclwiOiBcIuKIpVwiLFxuXHRcInNxY2FwXCI6IFwi4oqTXCIsXG5cdFwic3FjYXBzXCI6IFwi4oqT77iAXCIsXG5cdFwic3FjdXBcIjogXCLiipRcIixcblx0XCJzcWN1cHNcIjogXCLiipTvuIBcIixcblx0XCJTcXJ0XCI6IFwi4oiaXCIsXG5cdFwic3FzdWJcIjogXCLiio9cIixcblx0XCJzcXN1YmVcIjogXCLiipFcIixcblx0XCJzcXN1YnNldFwiOiBcIuKKj1wiLFxuXHRcInNxc3Vic2V0ZXFcIjogXCLiipFcIixcblx0XCJzcXN1cFwiOiBcIuKKkFwiLFxuXHRcInNxc3VwZVwiOiBcIuKKklwiLFxuXHRcInNxc3Vwc2V0XCI6IFwi4oqQXCIsXG5cdFwic3FzdXBzZXRlcVwiOiBcIuKKklwiLFxuXHRcInNxdWFyZVwiOiBcIuKWoVwiLFxuXHRcIlNxdWFyZVwiOiBcIuKWoVwiLFxuXHRcIlNxdWFyZUludGVyc2VjdGlvblwiOiBcIuKKk1wiLFxuXHRcIlNxdWFyZVN1YnNldFwiOiBcIuKKj1wiLFxuXHRcIlNxdWFyZVN1YnNldEVxdWFsXCI6IFwi4oqRXCIsXG5cdFwiU3F1YXJlU3VwZXJzZXRcIjogXCLiipBcIixcblx0XCJTcXVhcmVTdXBlcnNldEVxdWFsXCI6IFwi4oqSXCIsXG5cdFwiU3F1YXJlVW5pb25cIjogXCLiipRcIixcblx0XCJzcXVhcmZcIjogXCLilqpcIixcblx0XCJzcXVcIjogXCLilqFcIixcblx0XCJzcXVmXCI6IFwi4paqXCIsXG5cdFwic3JhcnJcIjogXCLihpJcIixcblx0XCJTc2NyXCI6IFwi8J2SrlwiLFxuXHRcInNzY3JcIjogXCLwnZOIXCIsXG5cdFwic3NldG1uXCI6IFwi4oiWXCIsXG5cdFwic3NtaWxlXCI6IFwi4oyjXCIsXG5cdFwic3N0YXJmXCI6IFwi4ouGXCIsXG5cdFwiU3RhclwiOiBcIuKLhlwiLFxuXHRcInN0YXJcIjogXCLimIZcIixcblx0XCJzdGFyZlwiOiBcIuKYhVwiLFxuXHRcInN0cmFpZ2h0ZXBzaWxvblwiOiBcIs+1XCIsXG5cdFwic3RyYWlnaHRwaGlcIjogXCLPlVwiLFxuXHRcInN0cm5zXCI6IFwiwq9cIixcblx0XCJzdWJcIjogXCLiioJcIixcblx0XCJTdWJcIjogXCLii5BcIixcblx0XCJzdWJkb3RcIjogXCLiqr1cIixcblx0XCJzdWJFXCI6IFwi4quFXCIsXG5cdFwic3ViZVwiOiBcIuKKhlwiLFxuXHRcInN1YmVkb3RcIjogXCLiq4NcIixcblx0XCJzdWJtdWx0XCI6IFwi4quBXCIsXG5cdFwic3VibkVcIjogXCLiq4tcIixcblx0XCJzdWJuZVwiOiBcIuKKilwiLFxuXHRcInN1YnBsdXNcIjogXCLiqr9cIixcblx0XCJzdWJyYXJyXCI6IFwi4qW5XCIsXG5cdFwic3Vic2V0XCI6IFwi4oqCXCIsXG5cdFwiU3Vic2V0XCI6IFwi4ouQXCIsXG5cdFwic3Vic2V0ZXFcIjogXCLiioZcIixcblx0XCJzdWJzZXRlcXFcIjogXCLiq4VcIixcblx0XCJTdWJzZXRFcXVhbFwiOiBcIuKKhlwiLFxuXHRcInN1YnNldG5lcVwiOiBcIuKKilwiLFxuXHRcInN1YnNldG5lcXFcIjogXCLiq4tcIixcblx0XCJzdWJzaW1cIjogXCLiq4dcIixcblx0XCJzdWJzdWJcIjogXCLiq5VcIixcblx0XCJzdWJzdXBcIjogXCLiq5NcIixcblx0XCJzdWNjYXBwcm94XCI6IFwi4qq4XCIsXG5cdFwic3VjY1wiOiBcIuKJu1wiLFxuXHRcInN1Y2NjdXJseWVxXCI6IFwi4om9XCIsXG5cdFwiU3VjY2VlZHNcIjogXCLiibtcIixcblx0XCJTdWNjZWVkc0VxdWFsXCI6IFwi4qqwXCIsXG5cdFwiU3VjY2VlZHNTbGFudEVxdWFsXCI6IFwi4om9XCIsXG5cdFwiU3VjY2VlZHNUaWxkZVwiOiBcIuKJv1wiLFxuXHRcInN1Y2NlcVwiOiBcIuKqsFwiLFxuXHRcInN1Y2NuYXBwcm94XCI6IFwi4qq6XCIsXG5cdFwic3VjY25lcXFcIjogXCLiqrZcIixcblx0XCJzdWNjbnNpbVwiOiBcIuKLqVwiLFxuXHRcInN1Y2NzaW1cIjogXCLiib9cIixcblx0XCJTdWNoVGhhdFwiOiBcIuKIi1wiLFxuXHRcInN1bVwiOiBcIuKIkVwiLFxuXHRcIlN1bVwiOiBcIuKIkVwiLFxuXHRcInN1bmdcIjogXCLimapcIixcblx0XCJzdXAxXCI6IFwiwrlcIixcblx0XCJzdXAyXCI6IFwiwrJcIixcblx0XCJzdXAzXCI6IFwiwrNcIixcblx0XCJzdXBcIjogXCLiioNcIixcblx0XCJTdXBcIjogXCLii5FcIixcblx0XCJzdXBkb3RcIjogXCLiqr5cIixcblx0XCJzdXBkc3ViXCI6IFwi4quYXCIsXG5cdFwic3VwRVwiOiBcIuKrhlwiLFxuXHRcInN1cGVcIjogXCLiiodcIixcblx0XCJzdXBlZG90XCI6IFwi4quEXCIsXG5cdFwiU3VwZXJzZXRcIjogXCLiioNcIixcblx0XCJTdXBlcnNldEVxdWFsXCI6IFwi4oqHXCIsXG5cdFwic3VwaHNvbFwiOiBcIuKfiVwiLFxuXHRcInN1cGhzdWJcIjogXCLiq5dcIixcblx0XCJzdXBsYXJyXCI6IFwi4qW7XCIsXG5cdFwic3VwbXVsdFwiOiBcIuKrglwiLFxuXHRcInN1cG5FXCI6IFwi4quMXCIsXG5cdFwic3VwbmVcIjogXCLiiotcIixcblx0XCJzdXBwbHVzXCI6IFwi4quAXCIsXG5cdFwic3Vwc2V0XCI6IFwi4oqDXCIsXG5cdFwiU3Vwc2V0XCI6IFwi4ouRXCIsXG5cdFwic3Vwc2V0ZXFcIjogXCLiiodcIixcblx0XCJzdXBzZXRlcXFcIjogXCLiq4ZcIixcblx0XCJzdXBzZXRuZXFcIjogXCLiiotcIixcblx0XCJzdXBzZXRuZXFxXCI6IFwi4quMXCIsXG5cdFwic3Vwc2ltXCI6IFwi4quIXCIsXG5cdFwic3Vwc3ViXCI6IFwi4quUXCIsXG5cdFwic3Vwc3VwXCI6IFwi4quWXCIsXG5cdFwic3dhcmhrXCI6IFwi4qSmXCIsXG5cdFwic3dhcnJcIjogXCLihplcIixcblx0XCJzd0FyclwiOiBcIuKHmVwiLFxuXHRcInN3YXJyb3dcIjogXCLihplcIixcblx0XCJzd253YXJcIjogXCLipKpcIixcblx0XCJzemxpZ1wiOiBcIsOfXCIsXG5cdFwiVGFiXCI6IFwiXFx0XCIsXG5cdFwidGFyZ2V0XCI6IFwi4oyWXCIsXG5cdFwiVGF1XCI6IFwizqRcIixcblx0XCJ0YXVcIjogXCLPhFwiLFxuXHRcInRicmtcIjogXCLijrRcIixcblx0XCJUY2Fyb25cIjogXCLFpFwiLFxuXHRcInRjYXJvblwiOiBcIsWlXCIsXG5cdFwiVGNlZGlsXCI6IFwixaJcIixcblx0XCJ0Y2VkaWxcIjogXCLFo1wiLFxuXHRcIlRjeVwiOiBcItCiXCIsXG5cdFwidGN5XCI6IFwi0YJcIixcblx0XCJ0ZG90XCI6IFwi4oObXCIsXG5cdFwidGVscmVjXCI6IFwi4oyVXCIsXG5cdFwiVGZyXCI6IFwi8J2Ul1wiLFxuXHRcInRmclwiOiBcIvCdlLFcIixcblx0XCJ0aGVyZTRcIjogXCLiiLRcIixcblx0XCJ0aGVyZWZvcmVcIjogXCLiiLRcIixcblx0XCJUaGVyZWZvcmVcIjogXCLiiLRcIixcblx0XCJUaGV0YVwiOiBcIs6YXCIsXG5cdFwidGhldGFcIjogXCLOuFwiLFxuXHRcInRoZXRhc3ltXCI6IFwiz5FcIixcblx0XCJ0aGV0YXZcIjogXCLPkVwiLFxuXHRcInRoaWNrYXBwcm94XCI6IFwi4omIXCIsXG5cdFwidGhpY2tzaW1cIjogXCLiiLxcIixcblx0XCJUaGlja1NwYWNlXCI6IFwi4oGf4oCKXCIsXG5cdFwiVGhpblNwYWNlXCI6IFwi4oCJXCIsXG5cdFwidGhpbnNwXCI6IFwi4oCJXCIsXG5cdFwidGhrYXBcIjogXCLiiYhcIixcblx0XCJ0aGtzaW1cIjogXCLiiLxcIixcblx0XCJUSE9STlwiOiBcIsOeXCIsXG5cdFwidGhvcm5cIjogXCLDvlwiLFxuXHRcInRpbGRlXCI6IFwiy5xcIixcblx0XCJUaWxkZVwiOiBcIuKIvFwiLFxuXHRcIlRpbGRlRXF1YWxcIjogXCLiiYNcIixcblx0XCJUaWxkZUZ1bGxFcXVhbFwiOiBcIuKJhVwiLFxuXHRcIlRpbGRlVGlsZGVcIjogXCLiiYhcIixcblx0XCJ0aW1lc2JhclwiOiBcIuKosVwiLFxuXHRcInRpbWVzYlwiOiBcIuKKoFwiLFxuXHRcInRpbWVzXCI6IFwiw5dcIixcblx0XCJ0aW1lc2RcIjogXCLiqLBcIixcblx0XCJ0aW50XCI6IFwi4oitXCIsXG5cdFwidG9lYVwiOiBcIuKkqFwiLFxuXHRcInRvcGJvdFwiOiBcIuKMtlwiLFxuXHRcInRvcGNpclwiOiBcIuKrsVwiLFxuXHRcInRvcFwiOiBcIuKKpFwiLFxuXHRcIlRvcGZcIjogXCLwnZWLXCIsXG5cdFwidG9wZlwiOiBcIvCdlaVcIixcblx0XCJ0b3Bmb3JrXCI6IFwi4quaXCIsXG5cdFwidG9zYVwiOiBcIuKkqVwiLFxuXHRcInRwcmltZVwiOiBcIuKAtFwiLFxuXHRcInRyYWRlXCI6IFwi4oSiXCIsXG5cdFwiVFJBREVcIjogXCLihKJcIixcblx0XCJ0cmlhbmdsZVwiOiBcIuKWtVwiLFxuXHRcInRyaWFuZ2xlZG93blwiOiBcIuKWv1wiLFxuXHRcInRyaWFuZ2xlbGVmdFwiOiBcIuKXg1wiLFxuXHRcInRyaWFuZ2xlbGVmdGVxXCI6IFwi4oq0XCIsXG5cdFwidHJpYW5nbGVxXCI6IFwi4omcXCIsXG5cdFwidHJpYW5nbGVyaWdodFwiOiBcIuKWuVwiLFxuXHRcInRyaWFuZ2xlcmlnaHRlcVwiOiBcIuKKtVwiLFxuXHRcInRyaWRvdFwiOiBcIuKXrFwiLFxuXHRcInRyaWVcIjogXCLiiZxcIixcblx0XCJ0cmltaW51c1wiOiBcIuKoulwiLFxuXHRcIlRyaXBsZURvdFwiOiBcIuKDm1wiLFxuXHRcInRyaXBsdXNcIjogXCLiqLlcIixcblx0XCJ0cmlzYlwiOiBcIuKnjVwiLFxuXHRcInRyaXRpbWVcIjogXCLiqLtcIixcblx0XCJ0cnBleml1bVwiOiBcIuKPolwiLFxuXHRcIlRzY3JcIjogXCLwnZKvXCIsXG5cdFwidHNjclwiOiBcIvCdk4lcIixcblx0XCJUU2N5XCI6IFwi0KZcIixcblx0XCJ0c2N5XCI6IFwi0YZcIixcblx0XCJUU0hjeVwiOiBcItCLXCIsXG5cdFwidHNoY3lcIjogXCLRm1wiLFxuXHRcIlRzdHJva1wiOiBcIsWmXCIsXG5cdFwidHN0cm9rXCI6IFwixadcIixcblx0XCJ0d2l4dFwiOiBcIuKJrFwiLFxuXHRcInR3b2hlYWRsZWZ0YXJyb3dcIjogXCLihp5cIixcblx0XCJ0d29oZWFkcmlnaHRhcnJvd1wiOiBcIuKGoFwiLFxuXHRcIlVhY3V0ZVwiOiBcIsOaXCIsXG5cdFwidWFjdXRlXCI6IFwiw7pcIixcblx0XCJ1YXJyXCI6IFwi4oaRXCIsXG5cdFwiVWFyclwiOiBcIuKGn1wiLFxuXHRcInVBcnJcIjogXCLih5FcIixcblx0XCJVYXJyb2NpclwiOiBcIuKliVwiLFxuXHRcIlVicmN5XCI6IFwi0I5cIixcblx0XCJ1YnJjeVwiOiBcItGeXCIsXG5cdFwiVWJyZXZlXCI6IFwixaxcIixcblx0XCJ1YnJldmVcIjogXCLFrVwiLFxuXHRcIlVjaXJjXCI6IFwiw5tcIixcblx0XCJ1Y2lyY1wiOiBcIsO7XCIsXG5cdFwiVWN5XCI6IFwi0KNcIixcblx0XCJ1Y3lcIjogXCLRg1wiLFxuXHRcInVkYXJyXCI6IFwi4oeFXCIsXG5cdFwiVWRibGFjXCI6IFwixbBcIixcblx0XCJ1ZGJsYWNcIjogXCLFsVwiLFxuXHRcInVkaGFyXCI6IFwi4qWuXCIsXG5cdFwidWZpc2h0XCI6IFwi4qW+XCIsXG5cdFwiVWZyXCI6IFwi8J2UmFwiLFxuXHRcInVmclwiOiBcIvCdlLJcIixcblx0XCJVZ3JhdmVcIjogXCLDmVwiLFxuXHRcInVncmF2ZVwiOiBcIsO5XCIsXG5cdFwidUhhclwiOiBcIuKlo1wiLFxuXHRcInVoYXJsXCI6IFwi4oa/XCIsXG5cdFwidWhhcnJcIjogXCLihr5cIixcblx0XCJ1aGJsa1wiOiBcIuKWgFwiLFxuXHRcInVsY29yblwiOiBcIuKMnFwiLFxuXHRcInVsY29ybmVyXCI6IFwi4oycXCIsXG5cdFwidWxjcm9wXCI6IFwi4oyPXCIsXG5cdFwidWx0cmlcIjogXCLil7hcIixcblx0XCJVbWFjclwiOiBcIsWqXCIsXG5cdFwidW1hY3JcIjogXCLFq1wiLFxuXHRcInVtbFwiOiBcIsKoXCIsXG5cdFwiVW5kZXJCYXJcIjogXCJfXCIsXG5cdFwiVW5kZXJCcmFjZVwiOiBcIuKPn1wiLFxuXHRcIlVuZGVyQnJhY2tldFwiOiBcIuKOtVwiLFxuXHRcIlVuZGVyUGFyZW50aGVzaXNcIjogXCLij51cIixcblx0XCJVbmlvblwiOiBcIuKLg1wiLFxuXHRcIlVuaW9uUGx1c1wiOiBcIuKKjlwiLFxuXHRcIlVvZ29uXCI6IFwixbJcIixcblx0XCJ1b2dvblwiOiBcIsWzXCIsXG5cdFwiVW9wZlwiOiBcIvCdlYxcIixcblx0XCJ1b3BmXCI6IFwi8J2VplwiLFxuXHRcIlVwQXJyb3dCYXJcIjogXCLipJJcIixcblx0XCJ1cGFycm93XCI6IFwi4oaRXCIsXG5cdFwiVXBBcnJvd1wiOiBcIuKGkVwiLFxuXHRcIlVwYXJyb3dcIjogXCLih5FcIixcblx0XCJVcEFycm93RG93bkFycm93XCI6IFwi4oeFXCIsXG5cdFwidXBkb3duYXJyb3dcIjogXCLihpVcIixcblx0XCJVcERvd25BcnJvd1wiOiBcIuKGlVwiLFxuXHRcIlVwZG93bmFycm93XCI6IFwi4oeVXCIsXG5cdFwiVXBFcXVpbGlicml1bVwiOiBcIuKlrlwiLFxuXHRcInVwaGFycG9vbmxlZnRcIjogXCLihr9cIixcblx0XCJ1cGhhcnBvb25yaWdodFwiOiBcIuKGvlwiLFxuXHRcInVwbHVzXCI6IFwi4oqOXCIsXG5cdFwiVXBwZXJMZWZ0QXJyb3dcIjogXCLihpZcIixcblx0XCJVcHBlclJpZ2h0QXJyb3dcIjogXCLihpdcIixcblx0XCJ1cHNpXCI6IFwiz4VcIixcblx0XCJVcHNpXCI6IFwiz5JcIixcblx0XCJ1cHNpaFwiOiBcIs+SXCIsXG5cdFwiVXBzaWxvblwiOiBcIs6lXCIsXG5cdFwidXBzaWxvblwiOiBcIs+FXCIsXG5cdFwiVXBUZWVBcnJvd1wiOiBcIuKGpVwiLFxuXHRcIlVwVGVlXCI6IFwi4oqlXCIsXG5cdFwidXB1cGFycm93c1wiOiBcIuKHiFwiLFxuXHRcInVyY29yblwiOiBcIuKMnVwiLFxuXHRcInVyY29ybmVyXCI6IFwi4oydXCIsXG5cdFwidXJjcm9wXCI6IFwi4oyOXCIsXG5cdFwiVXJpbmdcIjogXCLFrlwiLFxuXHRcInVyaW5nXCI6IFwixa9cIixcblx0XCJ1cnRyaVwiOiBcIuKXuVwiLFxuXHRcIlVzY3JcIjogXCLwnZKwXCIsXG5cdFwidXNjclwiOiBcIvCdk4pcIixcblx0XCJ1dGRvdFwiOiBcIuKLsFwiLFxuXHRcIlV0aWxkZVwiOiBcIsWoXCIsXG5cdFwidXRpbGRlXCI6IFwixalcIixcblx0XCJ1dHJpXCI6IFwi4pa1XCIsXG5cdFwidXRyaWZcIjogXCLilrRcIixcblx0XCJ1dWFyclwiOiBcIuKHiFwiLFxuXHRcIlV1bWxcIjogXCLDnFwiLFxuXHRcInV1bWxcIjogXCLDvFwiLFxuXHRcInV3YW5nbGVcIjogXCLipqdcIixcblx0XCJ2YW5ncnRcIjogXCLippxcIixcblx0XCJ2YXJlcHNpbG9uXCI6IFwiz7VcIixcblx0XCJ2YXJrYXBwYVwiOiBcIs+wXCIsXG5cdFwidmFybm90aGluZ1wiOiBcIuKIhVwiLFxuXHRcInZhcnBoaVwiOiBcIs+VXCIsXG5cdFwidmFycGlcIjogXCLPllwiLFxuXHRcInZhcnByb3B0b1wiOiBcIuKInVwiLFxuXHRcInZhcnJcIjogXCLihpVcIixcblx0XCJ2QXJyXCI6IFwi4oeVXCIsXG5cdFwidmFycmhvXCI6IFwiz7FcIixcblx0XCJ2YXJzaWdtYVwiOiBcIs+CXCIsXG5cdFwidmFyc3Vic2V0bmVxXCI6IFwi4oqK77iAXCIsXG5cdFwidmFyc3Vic2V0bmVxcVwiOiBcIuKri++4gFwiLFxuXHRcInZhcnN1cHNldG5lcVwiOiBcIuKKi++4gFwiLFxuXHRcInZhcnN1cHNldG5lcXFcIjogXCLiq4zvuIBcIixcblx0XCJ2YXJ0aGV0YVwiOiBcIs+RXCIsXG5cdFwidmFydHJpYW5nbGVsZWZ0XCI6IFwi4oqyXCIsXG5cdFwidmFydHJpYW5nbGVyaWdodFwiOiBcIuKKs1wiLFxuXHRcInZCYXJcIjogXCLiq6hcIixcblx0XCJWYmFyXCI6IFwi4qurXCIsXG5cdFwidkJhcnZcIjogXCLiq6lcIixcblx0XCJWY3lcIjogXCLQklwiLFxuXHRcInZjeVwiOiBcItCyXCIsXG5cdFwidmRhc2hcIjogXCLiiqJcIixcblx0XCJ2RGFzaFwiOiBcIuKKqFwiLFxuXHRcIlZkYXNoXCI6IFwi4oqpXCIsXG5cdFwiVkRhc2hcIjogXCLiiqtcIixcblx0XCJWZGFzaGxcIjogXCLiq6ZcIixcblx0XCJ2ZWViYXJcIjogXCLiirtcIixcblx0XCJ2ZWVcIjogXCLiiKhcIixcblx0XCJWZWVcIjogXCLii4FcIixcblx0XCJ2ZWVlcVwiOiBcIuKJmlwiLFxuXHRcInZlbGxpcFwiOiBcIuKLrlwiLFxuXHRcInZlcmJhclwiOiBcInxcIixcblx0XCJWZXJiYXJcIjogXCLigJZcIixcblx0XCJ2ZXJ0XCI6IFwifFwiLFxuXHRcIlZlcnRcIjogXCLigJZcIixcblx0XCJWZXJ0aWNhbEJhclwiOiBcIuKIo1wiLFxuXHRcIlZlcnRpY2FsTGluZVwiOiBcInxcIixcblx0XCJWZXJ0aWNhbFNlcGFyYXRvclwiOiBcIuKdmFwiLFxuXHRcIlZlcnRpY2FsVGlsZGVcIjogXCLiiYBcIixcblx0XCJWZXJ5VGhpblNwYWNlXCI6IFwi4oCKXCIsXG5cdFwiVmZyXCI6IFwi8J2UmVwiLFxuXHRcInZmclwiOiBcIvCdlLNcIixcblx0XCJ2bHRyaVwiOiBcIuKKslwiLFxuXHRcInZuc3ViXCI6IFwi4oqC4oOSXCIsXG5cdFwidm5zdXBcIjogXCLiioPig5JcIixcblx0XCJWb3BmXCI6IFwi8J2VjVwiLFxuXHRcInZvcGZcIjogXCLwnZWnXCIsXG5cdFwidnByb3BcIjogXCLiiJ1cIixcblx0XCJ2cnRyaVwiOiBcIuKKs1wiLFxuXHRcIlZzY3JcIjogXCLwnZKxXCIsXG5cdFwidnNjclwiOiBcIvCdk4tcIixcblx0XCJ2c3VibkVcIjogXCLiq4vvuIBcIixcblx0XCJ2c3VibmVcIjogXCLiiorvuIBcIixcblx0XCJ2c3VwbkVcIjogXCLiq4zvuIBcIixcblx0XCJ2c3VwbmVcIjogXCLiiovvuIBcIixcblx0XCJWdmRhc2hcIjogXCLiiqpcIixcblx0XCJ2emlnemFnXCI6IFwi4qaaXCIsXG5cdFwiV2NpcmNcIjogXCLFtFwiLFxuXHRcIndjaXJjXCI6IFwixbVcIixcblx0XCJ3ZWRiYXJcIjogXCLiqZ9cIixcblx0XCJ3ZWRnZVwiOiBcIuKIp1wiLFxuXHRcIldlZGdlXCI6IFwi4ouAXCIsXG5cdFwid2VkZ2VxXCI6IFwi4omZXCIsXG5cdFwid2VpZXJwXCI6IFwi4oSYXCIsXG5cdFwiV2ZyXCI6IFwi8J2UmlwiLFxuXHRcIndmclwiOiBcIvCdlLRcIixcblx0XCJXb3BmXCI6IFwi8J2VjlwiLFxuXHRcIndvcGZcIjogXCLwnZWoXCIsXG5cdFwid3BcIjogXCLihJhcIixcblx0XCJ3clwiOiBcIuKJgFwiLFxuXHRcIndyZWF0aFwiOiBcIuKJgFwiLFxuXHRcIldzY3JcIjogXCLwnZKyXCIsXG5cdFwid3NjclwiOiBcIvCdk4xcIixcblx0XCJ4Y2FwXCI6IFwi4ouCXCIsXG5cdFwieGNpcmNcIjogXCLil69cIixcblx0XCJ4Y3VwXCI6IFwi4ouDXCIsXG5cdFwieGR0cmlcIjogXCLilr1cIixcblx0XCJYZnJcIjogXCLwnZSbXCIsXG5cdFwieGZyXCI6IFwi8J2UtVwiLFxuXHRcInhoYXJyXCI6IFwi4p+3XCIsXG5cdFwieGhBcnJcIjogXCLin7pcIixcblx0XCJYaVwiOiBcIs6eXCIsXG5cdFwieGlcIjogXCLOvlwiLFxuXHRcInhsYXJyXCI6IFwi4p+1XCIsXG5cdFwieGxBcnJcIjogXCLin7hcIixcblx0XCJ4bWFwXCI6IFwi4p+8XCIsXG5cdFwieG5pc1wiOiBcIuKLu1wiLFxuXHRcInhvZG90XCI6IFwi4qiAXCIsXG5cdFwiWG9wZlwiOiBcIvCdlY9cIixcblx0XCJ4b3BmXCI6IFwi8J2VqVwiLFxuXHRcInhvcGx1c1wiOiBcIuKogVwiLFxuXHRcInhvdGltZVwiOiBcIuKoglwiLFxuXHRcInhyYXJyXCI6IFwi4p+2XCIsXG5cdFwieHJBcnJcIjogXCLin7lcIixcblx0XCJYc2NyXCI6IFwi8J2Ss1wiLFxuXHRcInhzY3JcIjogXCLwnZONXCIsXG5cdFwieHNxY3VwXCI6IFwi4qiGXCIsXG5cdFwieHVwbHVzXCI6IFwi4qiEXCIsXG5cdFwieHV0cmlcIjogXCLilrNcIixcblx0XCJ4dmVlXCI6IFwi4ouBXCIsXG5cdFwieHdlZGdlXCI6IFwi4ouAXCIsXG5cdFwiWWFjdXRlXCI6IFwiw51cIixcblx0XCJ5YWN1dGVcIjogXCLDvVwiLFxuXHRcIllBY3lcIjogXCLQr1wiLFxuXHRcInlhY3lcIjogXCLRj1wiLFxuXHRcIlljaXJjXCI6IFwixbZcIixcblx0XCJ5Y2lyY1wiOiBcIsW3XCIsXG5cdFwiWWN5XCI6IFwi0KtcIixcblx0XCJ5Y3lcIjogXCLRi1wiLFxuXHRcInllblwiOiBcIsKlXCIsXG5cdFwiWWZyXCI6IFwi8J2UnFwiLFxuXHRcInlmclwiOiBcIvCdlLZcIixcblx0XCJZSWN5XCI6IFwi0IdcIixcblx0XCJ5aWN5XCI6IFwi0ZdcIixcblx0XCJZb3BmXCI6IFwi8J2VkFwiLFxuXHRcInlvcGZcIjogXCLwnZWqXCIsXG5cdFwiWXNjclwiOiBcIvCdkrRcIixcblx0XCJ5c2NyXCI6IFwi8J2TjlwiLFxuXHRcIllVY3lcIjogXCLQrlwiLFxuXHRcInl1Y3lcIjogXCLRjlwiLFxuXHRcInl1bWxcIjogXCLDv1wiLFxuXHRcIll1bWxcIjogXCLFuFwiLFxuXHRcIlphY3V0ZVwiOiBcIsW5XCIsXG5cdFwiemFjdXRlXCI6IFwixbpcIixcblx0XCJaY2Fyb25cIjogXCLFvVwiLFxuXHRcInpjYXJvblwiOiBcIsW+XCIsXG5cdFwiWmN5XCI6IFwi0JdcIixcblx0XCJ6Y3lcIjogXCLQt1wiLFxuXHRcIlpkb3RcIjogXCLFu1wiLFxuXHRcInpkb3RcIjogXCLFvFwiLFxuXHRcInplZXRyZlwiOiBcIuKEqFwiLFxuXHRcIlplcm9XaWR0aFNwYWNlXCI6IFwi4oCLXCIsXG5cdFwiWmV0YVwiOiBcIs6WXCIsXG5cdFwiemV0YVwiOiBcIs62XCIsXG5cdFwiemZyXCI6IFwi8J2Ut1wiLFxuXHRcIlpmclwiOiBcIuKEqFwiLFxuXHRcIlpIY3lcIjogXCLQllwiLFxuXHRcInpoY3lcIjogXCLQtlwiLFxuXHRcInppZ3JhcnJcIjogXCLih51cIixcblx0XCJ6b3BmXCI6IFwi8J2Vq1wiLFxuXHRcIlpvcGZcIjogXCLihKRcIixcblx0XCJac2NyXCI6IFwi8J2StVwiLFxuXHRcInpzY3JcIjogXCLwnZOPXCIsXG5cdFwiendqXCI6IFwi4oCNXCIsXG5cdFwiendualwiOiBcIuKAjFwiXG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9lbnRpdGllcy9tYXBzL2VudGl0aWVzLmpzb25cbi8vIG1vZHVsZSBpZCA9IDQyMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 422 */
/***/ function(module, exports, __webpack_require__) {

    eval("var entityMap = __webpack_require__(421),\n    legacyMap = __webpack_require__(423),\n    xmlMap    = __webpack_require__(420),\n    decodeCodePoint = __webpack_require__(424);\n\nvar decodeXMLStrict  = getStrictDecoder(xmlMap),\n    decodeHTMLStrict = getStrictDecoder(entityMap);\n\nfunction getStrictDecoder(map){\n\tvar keys = Object.keys(map).join(\"|\"),\n\t    replace = getReplacer(map);\n\n\tkeys += \"|#[xX][\\\\da-fA-F]+|#\\\\d+\";\n\n\tvar re = new RegExp(\"&(?:\" + keys + \");\", \"g\");\n\n\treturn function(str){\n\t\treturn String(str).replace(re, replace);\n\t};\n}\n\nvar decodeHTML = (function(){\n\tvar legacy = Object.keys(legacyMap)\n\t\t.sort(sorter);\n\n\tvar keys = Object.keys(entityMap)\n\t\t.sort(sorter);\n\n\tfor(var i = 0, j = 0; i < keys.length; i++){\n\t\tif(legacy[j] === keys[i]){\n\t\t\tkeys[i] += \";?\";\n\t\t\tj++;\n\t\t} else {\n\t\t\tkeys[i] += \";\";\n\t\t}\n\t}\n\n\tvar re = new RegExp(\"&(?:\" + keys.join(\"|\") + \"|#[xX][\\\\da-fA-F]+;?|#\\\\d+;?)\", \"g\"),\n\t    replace = getReplacer(entityMap);\n\n\tfunction replacer(str){\n\t\tif(str.substr(-1) !== \";\") str += \";\";\n\t\treturn replace(str);\n\t}\n\n\t//TODO consider creating a merged map\n\treturn function(str){\n\t\treturn String(str).replace(re, replacer);\n\t};\n}());\n\nfunction sorter(a, b){\n\treturn a < b ? 1 : -1;\n}\n\nfunction getReplacer(map){\n\treturn function replace(str){\n\t\tif(str.charAt(1) === \"#\"){\n\t\t\tif(str.charAt(2) === \"X\" || str.charAt(2) === \"x\"){\n\t\t\t\treturn decodeCodePoint(parseInt(str.substr(3), 16));\n\t\t\t}\n\t\t\treturn decodeCodePoint(parseInt(str.substr(2), 10));\n\t\t}\n\t\treturn map[str.slice(1, -1)];\n\t};\n}\n\nmodule.exports = {\n\tXML: decodeXMLStrict,\n\tHTML: decodeHTML,\n\tHTMLStrict: decodeHTMLStrict\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbnRpdGllcy9saWIvZGVjb2RlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBlbnRpdHlNYXAgPSByZXF1aXJlKFwiLi4vbWFwcy9lbnRpdGllcy5qc29uXCIpLFxuICAgIGxlZ2FjeU1hcCA9IHJlcXVpcmUoXCIuLi9tYXBzL2xlZ2FjeS5qc29uXCIpLFxuICAgIHhtbE1hcCAgICA9IHJlcXVpcmUoXCIuLi9tYXBzL3htbC5qc29uXCIpLFxuICAgIGRlY29kZUNvZGVQb2ludCA9IHJlcXVpcmUoXCIuL2RlY29kZV9jb2RlcG9pbnQuanNcIik7XG5cbnZhciBkZWNvZGVYTUxTdHJpY3QgID0gZ2V0U3RyaWN0RGVjb2Rlcih4bWxNYXApLFxuICAgIGRlY29kZUhUTUxTdHJpY3QgPSBnZXRTdHJpY3REZWNvZGVyKGVudGl0eU1hcCk7XG5cbmZ1bmN0aW9uIGdldFN0cmljdERlY29kZXIobWFwKXtcblx0dmFyIGtleXMgPSBPYmplY3Qua2V5cyhtYXApLmpvaW4oXCJ8XCIpLFxuXHQgICAgcmVwbGFjZSA9IGdldFJlcGxhY2VyKG1hcCk7XG5cblx0a2V5cyArPSBcInwjW3hYXVtcXFxcZGEtZkEtRl0rfCNcXFxcZCtcIjtcblxuXHR2YXIgcmUgPSBuZXcgUmVnRXhwKFwiJig/OlwiICsga2V5cyArIFwiKTtcIiwgXCJnXCIpO1xuXG5cdHJldHVybiBmdW5jdGlvbihzdHIpe1xuXHRcdHJldHVybiBTdHJpbmcoc3RyKS5yZXBsYWNlKHJlLCByZXBsYWNlKTtcblx0fTtcbn1cblxudmFyIGRlY29kZUhUTUwgPSAoZnVuY3Rpb24oKXtcblx0dmFyIGxlZ2FjeSA9IE9iamVjdC5rZXlzKGxlZ2FjeU1hcClcblx0XHQuc29ydChzb3J0ZXIpO1xuXG5cdHZhciBrZXlzID0gT2JqZWN0LmtleXMoZW50aXR5TWFwKVxuXHRcdC5zb3J0KHNvcnRlcik7XG5cblx0Zm9yKHZhciBpID0gMCwgaiA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKXtcblx0XHRpZihsZWdhY3lbal0gPT09IGtleXNbaV0pe1xuXHRcdFx0a2V5c1tpXSArPSBcIjs/XCI7XG5cdFx0XHRqKys7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGtleXNbaV0gKz0gXCI7XCI7XG5cdFx0fVxuXHR9XG5cblx0dmFyIHJlID0gbmV3IFJlZ0V4cChcIiYoPzpcIiArIGtleXMuam9pbihcInxcIikgKyBcInwjW3hYXVtcXFxcZGEtZkEtRl0rOz98I1xcXFxkKzs/KVwiLCBcImdcIiksXG5cdCAgICByZXBsYWNlID0gZ2V0UmVwbGFjZXIoZW50aXR5TWFwKTtcblxuXHRmdW5jdGlvbiByZXBsYWNlcihzdHIpe1xuXHRcdGlmKHN0ci5zdWJzdHIoLTEpICE9PSBcIjtcIikgc3RyICs9IFwiO1wiO1xuXHRcdHJldHVybiByZXBsYWNlKHN0cik7XG5cdH1cblxuXHQvL1RPRE8gY29uc2lkZXIgY3JlYXRpbmcgYSBtZXJnZWQgbWFwXG5cdHJldHVybiBmdW5jdGlvbihzdHIpe1xuXHRcdHJldHVybiBTdHJpbmcoc3RyKS5yZXBsYWNlKHJlLCByZXBsYWNlcik7XG5cdH07XG59KCkpO1xuXG5mdW5jdGlvbiBzb3J0ZXIoYSwgYil7XG5cdHJldHVybiBhIDwgYiA/IDEgOiAtMTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVwbGFjZXIobWFwKXtcblx0cmV0dXJuIGZ1bmN0aW9uIHJlcGxhY2Uoc3RyKXtcblx0XHRpZihzdHIuY2hhckF0KDEpID09PSBcIiNcIil7XG5cdFx0XHRpZihzdHIuY2hhckF0KDIpID09PSBcIlhcIiB8fCBzdHIuY2hhckF0KDIpID09PSBcInhcIil7XG5cdFx0XHRcdHJldHVybiBkZWNvZGVDb2RlUG9pbnQocGFyc2VJbnQoc3RyLnN1YnN0cigzKSwgMTYpKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBkZWNvZGVDb2RlUG9pbnQocGFyc2VJbnQoc3RyLnN1YnN0cigyKSwgMTApKTtcblx0XHR9XG5cdFx0cmV0dXJuIG1hcFtzdHIuc2xpY2UoMSwgLTEpXTtcblx0fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdFhNTDogZGVjb2RlWE1MU3RyaWN0LFxuXHRIVE1MOiBkZWNvZGVIVE1MLFxuXHRIVE1MU3RyaWN0OiBkZWNvZGVIVE1MU3RyaWN0XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9lbnRpdGllcy9saWIvZGVjb2RlLmpzXG4vLyBtb2R1bGUgaWQgPSA0MjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 423 */
/***/ function(module, exports) {

    eval("module.exports = {\n\t\"Aacute\": \"Á\",\n\t\"aacute\": \"á\",\n\t\"Acirc\": \"Â\",\n\t\"acirc\": \"â\",\n\t\"acute\": \"´\",\n\t\"AElig\": \"Æ\",\n\t\"aelig\": \"æ\",\n\t\"Agrave\": \"À\",\n\t\"agrave\": \"à\",\n\t\"amp\": \"&\",\n\t\"AMP\": \"&\",\n\t\"Aring\": \"Å\",\n\t\"aring\": \"å\",\n\t\"Atilde\": \"Ã\",\n\t\"atilde\": \"ã\",\n\t\"Auml\": \"Ä\",\n\t\"auml\": \"ä\",\n\t\"brvbar\": \"¦\",\n\t\"Ccedil\": \"Ç\",\n\t\"ccedil\": \"ç\",\n\t\"cedil\": \"¸\",\n\t\"cent\": \"¢\",\n\t\"copy\": \"©\",\n\t\"COPY\": \"©\",\n\t\"curren\": \"¤\",\n\t\"deg\": \"°\",\n\t\"divide\": \"÷\",\n\t\"Eacute\": \"É\",\n\t\"eacute\": \"é\",\n\t\"Ecirc\": \"Ê\",\n\t\"ecirc\": \"ê\",\n\t\"Egrave\": \"È\",\n\t\"egrave\": \"è\",\n\t\"ETH\": \"Ð\",\n\t\"eth\": \"ð\",\n\t\"Euml\": \"Ë\",\n\t\"euml\": \"ë\",\n\t\"frac12\": \"½\",\n\t\"frac14\": \"¼\",\n\t\"frac34\": \"¾\",\n\t\"gt\": \">\",\n\t\"GT\": \">\",\n\t\"Iacute\": \"Í\",\n\t\"iacute\": \"í\",\n\t\"Icirc\": \"Î\",\n\t\"icirc\": \"î\",\n\t\"iexcl\": \"¡\",\n\t\"Igrave\": \"Ì\",\n\t\"igrave\": \"ì\",\n\t\"iquest\": \"¿\",\n\t\"Iuml\": \"Ï\",\n\t\"iuml\": \"ï\",\n\t\"laquo\": \"«\",\n\t\"lt\": \"<\",\n\t\"LT\": \"<\",\n\t\"macr\": \"¯\",\n\t\"micro\": \"µ\",\n\t\"middot\": \"·\",\n\t\"nbsp\": \" \",\n\t\"not\": \"¬\",\n\t\"Ntilde\": \"Ñ\",\n\t\"ntilde\": \"ñ\",\n\t\"Oacute\": \"Ó\",\n\t\"oacute\": \"ó\",\n\t\"Ocirc\": \"Ô\",\n\t\"ocirc\": \"ô\",\n\t\"Ograve\": \"Ò\",\n\t\"ograve\": \"ò\",\n\t\"ordf\": \"ª\",\n\t\"ordm\": \"º\",\n\t\"Oslash\": \"Ø\",\n\t\"oslash\": \"ø\",\n\t\"Otilde\": \"Õ\",\n\t\"otilde\": \"õ\",\n\t\"Ouml\": \"Ö\",\n\t\"ouml\": \"ö\",\n\t\"para\": \"¶\",\n\t\"plusmn\": \"±\",\n\t\"pound\": \"£\",\n\t\"quot\": \"\\\"\",\n\t\"QUOT\": \"\\\"\",\n\t\"raquo\": \"»\",\n\t\"reg\": \"®\",\n\t\"REG\": \"®\",\n\t\"sect\": \"§\",\n\t\"shy\": \"­\",\n\t\"sup1\": \"¹\",\n\t\"sup2\": \"²\",\n\t\"sup3\": \"³\",\n\t\"szlig\": \"ß\",\n\t\"THORN\": \"Þ\",\n\t\"thorn\": \"þ\",\n\t\"times\": \"×\",\n\t\"Uacute\": \"Ú\",\n\t\"uacute\": \"ú\",\n\t\"Ucirc\": \"Û\",\n\t\"ucirc\": \"û\",\n\t\"Ugrave\": \"Ù\",\n\t\"ugrave\": \"ù\",\n\t\"uml\": \"¨\",\n\t\"Uuml\": \"Ü\",\n\t\"uuml\": \"ü\",\n\t\"Yacute\": \"Ý\",\n\t\"yacute\": \"ý\",\n\t\"yen\": \"¥\",\n\t\"yuml\": \"ÿ\"\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbnRpdGllcy9tYXBzL2xlZ2FjeS5qc29uIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0ge1xuXHRcIkFhY3V0ZVwiOiBcIsOBXCIsXG5cdFwiYWFjdXRlXCI6IFwiw6FcIixcblx0XCJBY2lyY1wiOiBcIsOCXCIsXG5cdFwiYWNpcmNcIjogXCLDolwiLFxuXHRcImFjdXRlXCI6IFwiwrRcIixcblx0XCJBRWxpZ1wiOiBcIsOGXCIsXG5cdFwiYWVsaWdcIjogXCLDplwiLFxuXHRcIkFncmF2ZVwiOiBcIsOAXCIsXG5cdFwiYWdyYXZlXCI6IFwiw6BcIixcblx0XCJhbXBcIjogXCImXCIsXG5cdFwiQU1QXCI6IFwiJlwiLFxuXHRcIkFyaW5nXCI6IFwiw4VcIixcblx0XCJhcmluZ1wiOiBcIsOlXCIsXG5cdFwiQXRpbGRlXCI6IFwiw4NcIixcblx0XCJhdGlsZGVcIjogXCLDo1wiLFxuXHRcIkF1bWxcIjogXCLDhFwiLFxuXHRcImF1bWxcIjogXCLDpFwiLFxuXHRcImJydmJhclwiOiBcIsKmXCIsXG5cdFwiQ2NlZGlsXCI6IFwiw4dcIixcblx0XCJjY2VkaWxcIjogXCLDp1wiLFxuXHRcImNlZGlsXCI6IFwiwrhcIixcblx0XCJjZW50XCI6IFwiwqJcIixcblx0XCJjb3B5XCI6IFwiwqlcIixcblx0XCJDT1BZXCI6IFwiwqlcIixcblx0XCJjdXJyZW5cIjogXCLCpFwiLFxuXHRcImRlZ1wiOiBcIsKwXCIsXG5cdFwiZGl2aWRlXCI6IFwiw7dcIixcblx0XCJFYWN1dGVcIjogXCLDiVwiLFxuXHRcImVhY3V0ZVwiOiBcIsOpXCIsXG5cdFwiRWNpcmNcIjogXCLDilwiLFxuXHRcImVjaXJjXCI6IFwiw6pcIixcblx0XCJFZ3JhdmVcIjogXCLDiFwiLFxuXHRcImVncmF2ZVwiOiBcIsOoXCIsXG5cdFwiRVRIXCI6IFwiw5BcIixcblx0XCJldGhcIjogXCLDsFwiLFxuXHRcIkV1bWxcIjogXCLDi1wiLFxuXHRcImV1bWxcIjogXCLDq1wiLFxuXHRcImZyYWMxMlwiOiBcIsK9XCIsXG5cdFwiZnJhYzE0XCI6IFwiwrxcIixcblx0XCJmcmFjMzRcIjogXCLCvlwiLFxuXHRcImd0XCI6IFwiPlwiLFxuXHRcIkdUXCI6IFwiPlwiLFxuXHRcIklhY3V0ZVwiOiBcIsONXCIsXG5cdFwiaWFjdXRlXCI6IFwiw61cIixcblx0XCJJY2lyY1wiOiBcIsOOXCIsXG5cdFwiaWNpcmNcIjogXCLDrlwiLFxuXHRcImlleGNsXCI6IFwiwqFcIixcblx0XCJJZ3JhdmVcIjogXCLDjFwiLFxuXHRcImlncmF2ZVwiOiBcIsOsXCIsXG5cdFwiaXF1ZXN0XCI6IFwiwr9cIixcblx0XCJJdW1sXCI6IFwiw49cIixcblx0XCJpdW1sXCI6IFwiw69cIixcblx0XCJsYXF1b1wiOiBcIsKrXCIsXG5cdFwibHRcIjogXCI8XCIsXG5cdFwiTFRcIjogXCI8XCIsXG5cdFwibWFjclwiOiBcIsKvXCIsXG5cdFwibWljcm9cIjogXCLCtVwiLFxuXHRcIm1pZGRvdFwiOiBcIsK3XCIsXG5cdFwibmJzcFwiOiBcIsKgXCIsXG5cdFwibm90XCI6IFwiwqxcIixcblx0XCJOdGlsZGVcIjogXCLDkVwiLFxuXHRcIm50aWxkZVwiOiBcIsOxXCIsXG5cdFwiT2FjdXRlXCI6IFwiw5NcIixcblx0XCJvYWN1dGVcIjogXCLDs1wiLFxuXHRcIk9jaXJjXCI6IFwiw5RcIixcblx0XCJvY2lyY1wiOiBcIsO0XCIsXG5cdFwiT2dyYXZlXCI6IFwiw5JcIixcblx0XCJvZ3JhdmVcIjogXCLDslwiLFxuXHRcIm9yZGZcIjogXCLCqlwiLFxuXHRcIm9yZG1cIjogXCLCulwiLFxuXHRcIk9zbGFzaFwiOiBcIsOYXCIsXG5cdFwib3NsYXNoXCI6IFwiw7hcIixcblx0XCJPdGlsZGVcIjogXCLDlVwiLFxuXHRcIm90aWxkZVwiOiBcIsO1XCIsXG5cdFwiT3VtbFwiOiBcIsOWXCIsXG5cdFwib3VtbFwiOiBcIsO2XCIsXG5cdFwicGFyYVwiOiBcIsK2XCIsXG5cdFwicGx1c21uXCI6IFwiwrFcIixcblx0XCJwb3VuZFwiOiBcIsKjXCIsXG5cdFwicXVvdFwiOiBcIlxcXCJcIixcblx0XCJRVU9UXCI6IFwiXFxcIlwiLFxuXHRcInJhcXVvXCI6IFwiwrtcIixcblx0XCJyZWdcIjogXCLCrlwiLFxuXHRcIlJFR1wiOiBcIsKuXCIsXG5cdFwic2VjdFwiOiBcIsKnXCIsXG5cdFwic2h5XCI6IFwiwq1cIixcblx0XCJzdXAxXCI6IFwiwrlcIixcblx0XCJzdXAyXCI6IFwiwrJcIixcblx0XCJzdXAzXCI6IFwiwrNcIixcblx0XCJzemxpZ1wiOiBcIsOfXCIsXG5cdFwiVEhPUk5cIjogXCLDnlwiLFxuXHRcInRob3JuXCI6IFwiw75cIixcblx0XCJ0aW1lc1wiOiBcIsOXXCIsXG5cdFwiVWFjdXRlXCI6IFwiw5pcIixcblx0XCJ1YWN1dGVcIjogXCLDulwiLFxuXHRcIlVjaXJjXCI6IFwiw5tcIixcblx0XCJ1Y2lyY1wiOiBcIsO7XCIsXG5cdFwiVWdyYXZlXCI6IFwiw5lcIixcblx0XCJ1Z3JhdmVcIjogXCLDuVwiLFxuXHRcInVtbFwiOiBcIsKoXCIsXG5cdFwiVXVtbFwiOiBcIsOcXCIsXG5cdFwidXVtbFwiOiBcIsO8XCIsXG5cdFwiWWFjdXRlXCI6IFwiw51cIixcblx0XCJ5YWN1dGVcIjogXCLDvVwiLFxuXHRcInllblwiOiBcIsKlXCIsXG5cdFwieXVtbFwiOiBcIsO/XCJcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2VudGl0aWVzL21hcHMvbGVnYWN5Lmpzb25cbi8vIG1vZHVsZSBpZCA9IDQyM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 424 */
/***/ function(module, exports, __webpack_require__) {

    eval("var decodeMap = __webpack_require__(425);\n\nmodule.exports = decodeCodePoint;\n\n// modified version of https://github.com/mathiasbynens/he/blob/master/src/he.js#L94-L119\nfunction decodeCodePoint(codePoint){\n\n\tif((codePoint >= 0xD800 && codePoint <= 0xDFFF) || codePoint > 0x10FFFF){\n\t\treturn \"\\uFFFD\";\n\t}\n\n\tif(codePoint in decodeMap){\n\t\tcodePoint = decodeMap[codePoint];\n\t}\n\n\tvar output = \"\";\n\n\tif(codePoint > 0xFFFF){\n\t\tcodePoint -= 0x10000;\n\t\toutput += String.fromCharCode(codePoint >>> 10 & 0x3FF | 0xD800);\n\t\tcodePoint = 0xDC00 | codePoint & 0x3FF;\n\t}\n\n\toutput += String.fromCharCode(codePoint);\n\treturn output;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDI0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbnRpdGllcy9saWIvZGVjb2RlX2NvZGVwb2ludC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZGVjb2RlTWFwID0gcmVxdWlyZShcIi4uL21hcHMvZGVjb2RlLmpzb25cIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVjb2RlQ29kZVBvaW50O1xuXG4vLyBtb2RpZmllZCB2ZXJzaW9uIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL2hlL2Jsb2IvbWFzdGVyL3NyYy9oZS5qcyNMOTQtTDExOVxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50KGNvZGVQb2ludCl7XG5cblx0aWYoKGNvZGVQb2ludCA+PSAweEQ4MDAgJiYgY29kZVBvaW50IDw9IDB4REZGRikgfHwgY29kZVBvaW50ID4gMHgxMEZGRkYpe1xuXHRcdHJldHVybiBcIlxcdUZGRkRcIjtcblx0fVxuXG5cdGlmKGNvZGVQb2ludCBpbiBkZWNvZGVNYXApe1xuXHRcdGNvZGVQb2ludCA9IGRlY29kZU1hcFtjb2RlUG9pbnRdO1xuXHR9XG5cblx0dmFyIG91dHB1dCA9IFwiXCI7XG5cblx0aWYoY29kZVBvaW50ID4gMHhGRkZGKXtcblx0XHRjb2RlUG9pbnQgLT0gMHgxMDAwMDtcblx0XHRvdXRwdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApO1xuXHRcdGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGO1xuXHR9XG5cblx0b3V0cHV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZVBvaW50KTtcblx0cmV0dXJuIG91dHB1dDtcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9lbnRpdGllcy9saWIvZGVjb2RlX2NvZGVwb2ludC5qc1xuLy8gbW9kdWxlIGlkID0gNDI0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 425 */
/***/ function(module, exports) {

    eval("module.exports = {\n\t\"0\": 65533,\n\t\"128\": 8364,\n\t\"130\": 8218,\n\t\"131\": 402,\n\t\"132\": 8222,\n\t\"133\": 8230,\n\t\"134\": 8224,\n\t\"135\": 8225,\n\t\"136\": 710,\n\t\"137\": 8240,\n\t\"138\": 352,\n\t\"139\": 8249,\n\t\"140\": 338,\n\t\"142\": 381,\n\t\"145\": 8216,\n\t\"146\": 8217,\n\t\"147\": 8220,\n\t\"148\": 8221,\n\t\"149\": 8226,\n\t\"150\": 8211,\n\t\"151\": 8212,\n\t\"152\": 732,\n\t\"153\": 8482,\n\t\"154\": 353,\n\t\"155\": 8250,\n\t\"156\": 339,\n\t\"158\": 382,\n\t\"159\": 376\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDI1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbnRpdGllcy9tYXBzL2RlY29kZS5qc29uIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0ge1xuXHRcIjBcIjogNjU1MzMsXG5cdFwiMTI4XCI6IDgzNjQsXG5cdFwiMTMwXCI6IDgyMTgsXG5cdFwiMTMxXCI6IDQwMixcblx0XCIxMzJcIjogODIyMixcblx0XCIxMzNcIjogODIzMCxcblx0XCIxMzRcIjogODIyNCxcblx0XCIxMzVcIjogODIyNSxcblx0XCIxMzZcIjogNzEwLFxuXHRcIjEzN1wiOiA4MjQwLFxuXHRcIjEzOFwiOiAzNTIsXG5cdFwiMTM5XCI6IDgyNDksXG5cdFwiMTQwXCI6IDMzOCxcblx0XCIxNDJcIjogMzgxLFxuXHRcIjE0NVwiOiA4MjE2LFxuXHRcIjE0NlwiOiA4MjE3LFxuXHRcIjE0N1wiOiA4MjIwLFxuXHRcIjE0OFwiOiA4MjIxLFxuXHRcIjE0OVwiOiA4MjI2LFxuXHRcIjE1MFwiOiA4MjExLFxuXHRcIjE1MVwiOiA4MjEyLFxuXHRcIjE1MlwiOiA3MzIsXG5cdFwiMTUzXCI6IDg0ODIsXG5cdFwiMTU0XCI6IDM1Myxcblx0XCIxNTVcIjogODI1MCxcblx0XCIxNTZcIjogMzM5LFxuXHRcIjE1OFwiOiAzODIsXG5cdFwiMTU5XCI6IDM3NlxufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZW50aXRpZXMvbWFwcy9kZWNvZGUuanNvblxuLy8gbW9kdWxlIGlkID0gNDI1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 426 */
/***/ function(module, exports, __webpack_require__) {

    eval("\"use strict\";\n\nvar Node = __webpack_require__(413);\nvar common = __webpack_require__(415);\nvar normalizeReference = __webpack_require__(427);\n\nvar normalizeURI = common.normalizeURI;\nvar unescapeString = common.unescapeString;\nvar fromCodePoint = __webpack_require__(428);\nvar decodeHTML = __webpack_require__(418).decodeHTML;\n__webpack_require__(429); // Polyfill for String.prototype.repeat\n\n// Constants for character codes:\n\nvar C_NEWLINE = 10;\nvar C_ASTERISK = 42;\nvar C_UNDERSCORE = 95;\nvar C_BACKTICK = 96;\nvar C_OPEN_BRACKET = 91;\nvar C_CLOSE_BRACKET = 93;\nvar C_LESSTHAN = 60;\nvar C_BANG = 33;\nvar C_BACKSLASH = 92;\nvar C_AMPERSAND = 38;\nvar C_OPEN_PAREN = 40;\nvar C_CLOSE_PAREN = 41;\nvar C_COLON = 58;\nvar C_SINGLEQUOTE = 39;\nvar C_DOUBLEQUOTE = 34;\n\n// Some regexps used in inline parser:\n\nvar ESCAPABLE = common.ESCAPABLE;\nvar ESCAPED_CHAR = '\\\\\\\\' + ESCAPABLE;\nvar REG_CHAR = '[^\\\\\\\\()\\\\x00-\\\\x20]';\nvar IN_PARENS_NOSP = '\\\\((' + REG_CHAR + '|' + ESCAPED_CHAR + '|\\\\\\\\)*\\\\)';\n\nvar ENTITY = common.ENTITY;\nvar reHtmlTag = common.reHtmlTag;\n\nvar rePunctuation = new RegExp(/[!-#%-\\*,-/:;\\?@\\[-\\]_\\{\\}\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E42\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]|\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDF3C-\\uDF3E]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]/);\n\nvar reLinkTitle = new RegExp(\n    '^(?:\"(' + ESCAPED_CHAR + '|[^\"\\\\x00])*\"' +\n        '|' +\n        '\\'(' + ESCAPED_CHAR + '|[^\\'\\\\x00])*\\'' +\n        '|' +\n        '\\\\((' + ESCAPED_CHAR + '|[^)\\\\x00])*\\\\))');\n\nvar reLinkDestinationBraces = new RegExp(\n    '^(?:[<](?:[^ <>\\\\t\\\\n\\\\\\\\\\\\x00]' + '|' + ESCAPED_CHAR + '|' + '\\\\\\\\)*[>])');\n\nvar reLinkDestination = new RegExp(\n    '^(?:' + REG_CHAR + '+|' + ESCAPED_CHAR + '|\\\\\\\\|' + IN_PARENS_NOSP + ')*');\n\nvar reEscapable = new RegExp('^' + ESCAPABLE);\n\nvar reEntityHere = new RegExp('^' + ENTITY, 'i');\n\nvar reTicks = /`+/;\n\nvar reTicksHere = /^`+/;\n\nvar reEllipses = /\\.\\.\\./g;\n\nvar reDash = /--+/g;\n\nvar reEmailAutolink = /^<([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/;\n\nvar reAutolink = /^<[A-Za-z][A-Za-z0-9.+-]{1,31}:[^<>\\x00-\\x20]*>/i;\n\nvar reSpnl = /^ *(?:\\n *)?/;\n\nvar reWhitespaceChar = /^[ \\t\\n\\x0b\\x0c\\x0d]/;\n\nvar reWhitespace = /[ \\t\\n\\x0b\\x0c\\x0d]+/g;\n\nvar reUnicodeWhitespaceChar = /^\\s/;\n\nvar reUnicodeWhitespace = /\\s+/g;\n\nvar reFinalSpace = / *$/;\n\nvar reInitialSpace = /^ */;\n\nvar reSpaceAtEndOfLine = /^ *(?:\\n|$)/;\n\nvar reLinkLabel = new RegExp('^\\\\[(?:[^\\\\\\\\\\\\[\\\\]]|' + ESCAPED_CHAR +\n  '|\\\\\\\\){0,1000}\\\\]');\n\n// Matches a string of non-special characters.\nvar reMain = /^[^\\n`\\[\\]\\\\!<&*_'\"]+/m;\n\nvar text = function(s) {\n    var node = new Node('text');\n    node._literal = s;\n    return node;\n};\n\n// INLINE PARSER\n\n// These are methods of an InlineParser object, defined below.\n// An InlineParser keeps track of a subject (a string to be\n// parsed) and a position in that subject.\n\n// If re matches at current position in the subject, advance\n// position in subject and return the match; otherwise return null.\nvar match = function(re) {\n    var m = re.exec(this.subject.slice(this.pos));\n    if (m === null) {\n        return null;\n    } else {\n        this.pos += m.index + m[0].length;\n        return m[0];\n    }\n};\n\n// Returns the code for the character at the current subject position, or -1\n// there are no more characters.\nvar peek = function() {\n    if (this.pos < this.subject.length) {\n        return this.subject.charCodeAt(this.pos);\n    } else {\n        return -1;\n    }\n};\n\n// Parse zero or more space characters, including at most one newline\nvar spnl = function() {\n    this.match(reSpnl);\n    return true;\n};\n\n// All of the parsers below try to match something at the current position\n// in the subject.  If they succeed in matching anything, they\n// return the inline matched, advancing the subject.\n\n// Attempt to parse backticks, adding either a backtick code span or a\n// literal sequence of backticks.\nvar parseBackticks = function(block) {\n    var ticks = this.match(reTicksHere);\n    if (ticks === null) {\n        return false;\n    }\n    var afterOpenTicks = this.pos;\n    var matched;\n    var node;\n    while ((matched = this.match(reTicks)) !== null) {\n        if (matched === ticks) {\n            node = new Node('code');\n            node._literal = this.subject.slice(afterOpenTicks,\n                                        this.pos - ticks.length)\n                          .trim().replace(reWhitespace, ' ');\n            block.appendChild(node);\n            return true;\n        }\n    }\n    // If we got here, we didn't match a closing backtick sequence.\n    this.pos = afterOpenTicks;\n    block.appendChild(text(ticks));\n    return true;\n};\n\n// Parse a backslash-escaped special character, adding either the escaped\n// character, a hard line break (if the backslash is followed by a newline),\n// or a literal backslash to the block's children.  Assumes current character\n// is a backslash.\nvar parseBackslash = function(block) {\n    var subj = this.subject;\n    var node;\n    this.pos += 1;\n    if (this.peek() === C_NEWLINE) {\n        this.pos += 1;\n        node = new Node('linebreak');\n        block.appendChild(node);\n    } else if (reEscapable.test(subj.charAt(this.pos))) {\n        block.appendChild(text(subj.charAt(this.pos)));\n        this.pos += 1;\n    } else {\n        block.appendChild(text('\\\\'));\n    }\n    return true;\n};\n\n// Attempt to parse an autolink (URL or email in pointy brackets).\nvar parseAutolink = function(block) {\n    var m;\n    var dest;\n    var node;\n    if ((m = this.match(reEmailAutolink))) {\n        dest = m.slice(1, m.length - 1);\n        node = new Node('link');\n        node._destination = normalizeURI('mailto:' + dest);\n        node._title = '';\n        node.appendChild(text(dest));\n        block.appendChild(node);\n        return true;\n    } else if ((m = this.match(reAutolink))) {\n        dest = m.slice(1, m.length - 1);\n        node = new Node('link');\n        node._destination = normalizeURI(dest);\n        node._title = '';\n        node.appendChild(text(dest));\n        block.appendChild(node);\n        return true;\n    } else {\n        return false;\n    }\n};\n\n// Attempt to parse a raw HTML tag.\nvar parseHtmlTag = function(block) {\n    var m = this.match(reHtmlTag);\n    if (m === null) {\n        return false;\n    } else {\n        var node = new Node('html_inline');\n        node._literal = m;\n        block.appendChild(node);\n        return true;\n    }\n};\n\n// Scan a sequence of characters with code cc, and return information about\n// the number of delimiters and whether they are positioned such that\n// they can open and/or close emphasis or strong emphasis.  A utility\n// function for strong/emph parsing.\nvar scanDelims = function(cc) {\n    var numdelims = 0;\n    var char_before, char_after, cc_after;\n    var startpos = this.pos;\n    var left_flanking, right_flanking, can_open, can_close;\n    var after_is_whitespace, after_is_punctuation, before_is_whitespace, before_is_punctuation;\n\n    if (cc === C_SINGLEQUOTE || cc === C_DOUBLEQUOTE) {\n        numdelims++;\n        this.pos++;\n    } else {\n        while (this.peek() === cc) {\n            numdelims++;\n            this.pos++;\n        }\n    }\n\n    if (numdelims === 0) {\n        return null;\n    }\n\n    char_before = startpos === 0 ? '\\n' : this.subject.charAt(startpos - 1);\n\n    cc_after = this.peek();\n    if (cc_after === -1) {\n        char_after = '\\n';\n    } else {\n        char_after = fromCodePoint(cc_after);\n    }\n\n    after_is_whitespace = reUnicodeWhitespaceChar.test(char_after);\n    after_is_punctuation = rePunctuation.test(char_after);\n    before_is_whitespace = reUnicodeWhitespaceChar.test(char_before);\n    before_is_punctuation = rePunctuation.test(char_before);\n\n    left_flanking = !after_is_whitespace &&\n            !(after_is_punctuation && !before_is_whitespace && !before_is_punctuation);\n    right_flanking = !before_is_whitespace &&\n            !(before_is_punctuation && !after_is_whitespace && !after_is_punctuation);\n    if (cc === C_UNDERSCORE) {\n        can_open = left_flanking &&\n            (!right_flanking || before_is_punctuation);\n        can_close = right_flanking &&\n            (!left_flanking || after_is_punctuation);\n    } else if (cc === C_SINGLEQUOTE || cc === C_DOUBLEQUOTE) {\n        can_open = left_flanking && !right_flanking;\n        can_close = right_flanking;\n    } else {\n        can_open = left_flanking;\n        can_close = right_flanking;\n    }\n    this.pos = startpos;\n    return { numdelims: numdelims,\n             can_open: can_open,\n             can_close: can_close };\n};\n\n// Handle a delimiter marker for emphasis or a quote.\nvar handleDelim = function(cc, block) {\n    var res = this.scanDelims(cc);\n    if (!res) {\n        return false;\n    }\n    var numdelims = res.numdelims;\n    var startpos = this.pos;\n    var contents;\n\n    this.pos += numdelims;\n    if (cc === C_SINGLEQUOTE) {\n        contents = \"\\u2019\";\n    } else if (cc === C_DOUBLEQUOTE) {\n        contents = \"\\u201C\";\n    } else {\n        contents = this.subject.slice(startpos, this.pos);\n    }\n    var node = text(contents);\n    block.appendChild(node);\n\n    // Add entry to stack for this opener\n    this.delimiters = { cc: cc,\n                        numdelims: numdelims,\n                        node: node,\n                        previous: this.delimiters,\n                        next: null,\n                        can_open: res.can_open,\n                        can_close: res.can_close };\n    if (this.delimiters.previous !== null) {\n        this.delimiters.previous.next = this.delimiters;\n    }\n\n    return true;\n\n};\n\nvar removeDelimiter = function(delim) {\n    if (delim.previous !== null) {\n        delim.previous.next = delim.next;\n    }\n    if (delim.next === null) {\n        // top of stack\n        this.delimiters = delim.previous;\n    } else {\n        delim.next.previous = delim.previous;\n    }\n};\n\nvar removeDelimitersBetween = function(bottom, top) {\n    if (bottom.next !== top) {\n        bottom.next = top;\n        top.previous = bottom;\n    }\n};\n\nvar processEmphasis = function(stack_bottom) {\n    var opener, closer, old_closer;\n    var opener_inl, closer_inl;\n    var tempstack;\n    var use_delims;\n    var tmp, next;\n    var opener_found;\n    var openers_bottom = [];\n    var odd_match = false;\n\n    openers_bottom[C_UNDERSCORE] = stack_bottom;\n    openers_bottom[C_ASTERISK] = stack_bottom;\n    openers_bottom[C_SINGLEQUOTE] = stack_bottom;\n    openers_bottom[C_DOUBLEQUOTE] = stack_bottom;\n\n    // find first closer above stack_bottom:\n    closer = this.delimiters;\n    while (closer !== null && closer.previous !== stack_bottom) {\n        closer = closer.previous;\n    }\n    // move forward, looking for closers, and handling each\n    while (closer !== null) {\n        var closercc = closer.cc;\n        if (!closer.can_close) {\n            closer = closer.next;\n        } else {\n            // found emphasis closer. now look back for first matching opener:\n            opener = closer.previous;\n            opener_found = false;\n            while (opener !== null && opener !== stack_bottom &&\n                   opener !== openers_bottom[closercc]) {\n                odd_match = (closer.can_open || opener.can_close) &&\n                    (opener.numdelims + closer.numdelims) % 3 === 0;\n                if (opener.cc === closer.cc && opener.can_open && !odd_match) {\n                    opener_found = true;\n                    break;\n                }\n                opener = opener.previous;\n            }\n            old_closer = closer;\n\n            if (closercc === C_ASTERISK || closercc === C_UNDERSCORE) {\n                if (!opener_found) {\n                    closer = closer.next;\n                } else {\n                    // calculate actual number of delimiters used from closer\n                    if (closer.numdelims < 3 || opener.numdelims < 3) {\n                        use_delims = closer.numdelims <= opener.numdelims ?\n                            closer.numdelims : opener.numdelims;\n                    } else {\n                        use_delims = closer.numdelims % 2 === 0 ? 2 : 1;\n                    }\n\n                    opener_inl = opener.node;\n                    closer_inl = closer.node;\n\n                    // remove used delimiters from stack elts and inlines\n                    opener.numdelims -= use_delims;\n                    closer.numdelims -= use_delims;\n                    opener_inl._literal =\n                        opener_inl._literal.slice(0,\n                                                  opener_inl._literal.length - use_delims);\n                    closer_inl._literal =\n                        closer_inl._literal.slice(0,\n                                                  closer_inl._literal.length - use_delims);\n\n                    // build contents for new emph element\n                    var emph = new Node(use_delims === 1 ? 'emph' : 'strong');\n\n                    tmp = opener_inl._next;\n                    while (tmp && tmp !== closer_inl) {\n                        next = tmp._next;\n                        tmp.unlink();\n                        emph.appendChild(tmp);\n                        tmp = next;\n                    }\n\n                    opener_inl.insertAfter(emph);\n\n                    // remove elts between opener and closer in delimiters stack\n                    removeDelimitersBetween(opener, closer);\n\n                    // if opener has 0 delims, remove it and the inline\n                    if (opener.numdelims === 0) {\n                        opener_inl.unlink();\n                        this.removeDelimiter(opener);\n                    }\n\n                    if (closer.numdelims === 0) {\n                        closer_inl.unlink();\n                        tempstack = closer.next;\n                        this.removeDelimiter(closer);\n                        closer = tempstack;\n                    }\n\n                }\n\n            } else if (closercc === C_SINGLEQUOTE) {\n                closer.node._literal = \"\\u2019\";\n                if (opener_found) {\n                    opener.node._literal = \"\\u2018\";\n                }\n                closer = closer.next;\n\n            } else if (closercc === C_DOUBLEQUOTE) {\n                closer.node._literal = \"\\u201D\";\n                if (opener_found) {\n                    opener.node.literal = \"\\u201C\";\n                }\n                closer = closer.next;\n\n            }\n            if (!opener_found && !odd_match) {\n                // Set lower bound for future searches for openers:\n                // We don't do this with odd_match because a **\n                // that doesn't match an earlier * might turn into\n                // an opener, and the * might be matched by something\n                // else.\n                openers_bottom[closercc] = old_closer.previous;\n                if (!old_closer.can_open) {\n                    // We can remove a closer that can't be an opener,\n                    // once we've seen there's no matching opener:\n                    this.removeDelimiter(old_closer);\n                }\n            }\n        }\n\n    }\n\n    // remove all delimiters\n    while (this.delimiters !== null && this.delimiters !== stack_bottom) {\n        this.removeDelimiter(this.delimiters);\n    }\n};\n\n// Attempt to parse link title (sans quotes), returning the string\n// or null if no match.\nvar parseLinkTitle = function() {\n    var title = this.match(reLinkTitle);\n    if (title === null) {\n        return null;\n    } else {\n        // chop off quotes from title and unescape:\n        return unescapeString(title.substr(1, title.length - 2));\n    }\n};\n\n// Attempt to parse link destination, returning the string or\n// null if no match.\nvar parseLinkDestination = function() {\n    var res = this.match(reLinkDestinationBraces);\n    if (res === null) {\n        res = this.match(reLinkDestination);\n        if (res === null) {\n            return null;\n        } else {\n            return normalizeURI(unescapeString(res));\n        }\n    } else {  // chop off surrounding <..>:\n        return normalizeURI(unescapeString(res.substr(1, res.length - 2)));\n    }\n};\n\n// Attempt to parse a link label, returning number of characters parsed.\nvar parseLinkLabel = function() {\n    var m = this.match(reLinkLabel);\n    if (m === null || m.length > 1001) {\n        return 0;\n    } else {\n        return m.length;\n    }\n};\n\n// Add open bracket to delimiter stack and add a text node to block's children.\nvar parseOpenBracket = function(block) {\n    var startpos = this.pos;\n    this.pos += 1;\n\n    var node = text('[');\n    block.appendChild(node);\n\n    // Add entry to stack for this opener\n    this.addBracket(node, startpos, false);\n    return true;\n};\n\n// IF next character is [, and ! delimiter to delimiter stack and\n// add a text node to block's children.  Otherwise just add a text node.\nvar parseBang = function(block) {\n    var startpos = this.pos;\n    this.pos += 1;\n    if (this.peek() === C_OPEN_BRACKET) {\n        this.pos += 1;\n\n        var node = text('![');\n        block.appendChild(node);\n\n        // Add entry to stack for this opener\n        this.addBracket(node, startpos + 1, true);\n    } else {\n        block.appendChild(text('!'));\n    }\n    return true;\n};\n\n// Try to match close bracket against an opening in the delimiter\n// stack.  Add either a link or image, or a plain [ character,\n// to block's children.  If there is a matching delimiter,\n// remove it from the delimiter stack.\nvar parseCloseBracket = function(block) {\n    var startpos;\n    var is_image;\n    var dest;\n    var title;\n    var matched = false;\n    var reflabel;\n    var opener;\n\n    this.pos += 1;\n    startpos = this.pos;\n\n    // get last [ or ![\n    opener = this.brackets;\n\n    if (opener === null) {\n        // no matched opener, just return a literal\n        block.appendChild(text(']'));\n        return true;\n    }\n\n    if (!opener.active) {\n        // no matched opener, just return a literal\n        block.appendChild(text(']'));\n        // take opener off brackets stack\n        this.removeBracket();\n        return true;\n    }\n\n    // If we got here, open is a potential opener\n    is_image = opener.image;\n\n    // Check to see if we have a link/image\n\n    var savepos = this.pos;\n\n    // Inline link?\n    if (this.peek() === C_OPEN_PAREN) {\n        this.pos++;\n        if (this.spnl() &&\n            ((dest = this.parseLinkDestination()) !== null) &&\n            this.spnl() &&\n            // make sure there's a space before the title:\n            (reWhitespaceChar.test(this.subject.charAt(this.pos - 1)) &&\n             (title = this.parseLinkTitle()) || true) &&\n            this.spnl() &&\n            this.peek() === C_CLOSE_PAREN) {\n            this.pos += 1;\n            matched = true;\n        } else {\n            this.pos = savepos;\n        }\n    }\n\n    if (!matched) {\n\n        // Next, see if there's a link label\n        var beforelabel = this.pos;\n        var n = this.parseLinkLabel();\n        if (n > 2) {\n            reflabel = this.subject.slice(beforelabel, beforelabel + n);\n        } else if (!opener.bracketAfter) {\n            // Empty or missing second label means to use the first label as the reference.\n            // The reference must not contain a bracket. If we know there's a bracket, we don't even bother checking it.\n            reflabel = this.subject.slice(opener.index, startpos);\n        }\n        if (n === 0) {\n            // If shortcut reference link, rewind before spaces we skipped.\n            this.pos = savepos;\n        }\n\n        if (reflabel) {\n            // lookup rawlabel in refmap\n            var link = this.refmap[normalizeReference(reflabel)];\n            if (link) {\n                dest = link.destination;\n                title = link.title;\n                matched = true;\n            }\n        }\n    }\n\n    if (matched) {\n        var node = new Node(is_image ? 'image' : 'link');\n        node._destination = dest;\n        node._title = title || '';\n\n        var tmp, next;\n        tmp = opener.node._next;\n        while (tmp) {\n            next = tmp._next;\n            tmp.unlink();\n            node.appendChild(tmp);\n            tmp = next;\n        }\n        block.appendChild(node);\n        this.processEmphasis(opener.previousDelimiter);\n        this.removeBracket();\n        opener.node.unlink();\n\n        // We remove this bracket and processEmphasis will remove later delimiters.\n        // Now, for a link, we also deactivate earlier link openers.\n        // (no links in links)\n        if (!is_image) {\n          opener = this.brackets;\n          while (opener !== null) {\n            if (!opener.image) {\n                opener.active = false; // deactivate this opener\n            }\n            opener = opener.previous;\n          }\n        }\n\n        return true;\n\n    } else { // no match\n\n        this.removeBracket();  // remove this opener from stack\n        this.pos = startpos;\n        block.appendChild(text(']'));\n        return true;\n    }\n\n};\n\nvar addBracket = function(node, index, image) {\n    if (this.brackets !== null) {\n        this.brackets.bracketAfter = true;\n    }\n    this.brackets = { node: node,\n                      previous: this.brackets,\n                      previousDelimiter: this.delimiters,\n                      index: index,\n                      image: image,\n                      active: true };\n};\n\nvar removeBracket = function() {\n    this.brackets = this.brackets.previous;\n};\n\n// Attempt to parse an entity.\nvar parseEntity = function(block) {\n    var m;\n    if ((m = this.match(reEntityHere))) {\n        block.appendChild(text(decodeHTML(m)));\n        return true;\n    } else {\n        return false;\n    }\n};\n\n// Parse a run of ordinary characters, or a single character with\n// a special meaning in markdown, as a plain string.\nvar parseString = function(block) {\n    var m;\n    if ((m = this.match(reMain))) {\n        if (this.options.smart) {\n            block.appendChild(text(\n                m.replace(reEllipses, \"\\u2026\")\n                    .replace(reDash, function(chars) {\n                        var enCount = 0;\n                        var emCount = 0;\n                        if (chars.length % 3 === 0) { // If divisible by 3, use all em dashes\n                            emCount = chars.length / 3;\n                        } else if (chars.length % 2 === 0) { // If divisible by 2, use all en dashes\n                            enCount = chars.length / 2;\n                        } else if (chars.length % 3 === 2) { // If 2 extra dashes, use en dash for last 2; em dashes for rest\n                            enCount = 1;\n                            emCount = (chars.length - 2) / 3;\n                        } else { // Use en dashes for last 4 hyphens; em dashes for rest\n                            enCount = 2;\n                            emCount = (chars.length - 4) / 3;\n                        }\n                        return \"\\u2014\".repeat(emCount) + \"\\u2013\".repeat(enCount);\n                    })));\n        } else {\n            block.appendChild(text(m));\n        }\n        return true;\n    } else {\n        return false;\n    }\n};\n\n// Parse a newline.  If it was preceded by two spaces, return a hard\n// line break; otherwise a soft line break.\nvar parseNewline = function(block) {\n    this.pos += 1; // assume we're at a \\n\n    // check previous node for trailing spaces\n    var lastc = block._lastChild;\n    if (lastc && lastc.type === 'text' && lastc._literal[lastc._literal.length - 1] === ' ') {\n        var hardbreak = lastc._literal[lastc._literal.length - 2] === ' ';\n        lastc._literal = lastc._literal.replace(reFinalSpace, '');\n        block.appendChild(new Node(hardbreak ? 'linebreak' : 'softbreak'));\n    } else {\n        block.appendChild(new Node('softbreak'));\n    }\n    this.match(reInitialSpace); // gobble leading spaces in next line\n    return true;\n};\n\n// Attempt to parse a link reference, modifying refmap.\nvar parseReference = function(s, refmap) {\n    this.subject = s;\n    this.pos = 0;\n    var rawlabel;\n    var dest;\n    var title;\n    var matchChars;\n    var startpos = this.pos;\n\n    // label:\n    matchChars = this.parseLinkLabel();\n    if (matchChars === 0) {\n        return 0;\n    } else {\n        rawlabel = this.subject.substr(0, matchChars);\n    }\n\n    // colon:\n    if (this.peek() === C_COLON) {\n        this.pos++;\n    } else {\n        this.pos = startpos;\n        return 0;\n    }\n\n    //  link url\n    this.spnl();\n\n    dest = this.parseLinkDestination();\n    if (dest === null || dest.length === 0) {\n        this.pos = startpos;\n        return 0;\n    }\n\n    var beforetitle = this.pos;\n    this.spnl();\n    title = this.parseLinkTitle();\n    if (title === null) {\n        title = '';\n        // rewind before spaces\n        this.pos = beforetitle;\n    }\n\n    // make sure we're at line end:\n    var atLineEnd = true;\n    if (this.match(reSpaceAtEndOfLine) === null) {\n        if (title === '') {\n            atLineEnd = false;\n        } else {\n            // the potential title we found is not at the line end,\n            // but it could still be a legal link reference if we\n            // discard the title\n            title = '';\n            // rewind before spaces\n            this.pos = beforetitle;\n            // and instead check if the link URL is at the line end\n            atLineEnd = this.match(reSpaceAtEndOfLine) !== null;\n        }\n    }\n\n    if (!atLineEnd) {\n        this.pos = startpos;\n        return 0;\n    }\n\n    var normlabel = normalizeReference(rawlabel);\n    if (normlabel === '') {\n        // label must contain non-whitespace characters\n        this.pos = startpos;\n        return 0;\n    }\n\n    if (!refmap[normlabel]) {\n        refmap[normlabel] = { destination: dest, title: title };\n    }\n    return this.pos - startpos;\n};\n\n// Parse the next inline element in subject, advancing subject position.\n// On success, add the result to block's children and return true.\n// On failure, return false.\nvar parseInline = function(block) {\n    var res = false;\n    var c = this.peek();\n    if (c === -1) {\n        return false;\n    }\n    switch(c) {\n    case C_NEWLINE:\n        res = this.parseNewline(block);\n        break;\n    case C_BACKSLASH:\n        res = this.parseBackslash(block);\n        break;\n    case C_BACKTICK:\n        res = this.parseBackticks(block);\n        break;\n    case C_ASTERISK:\n    case C_UNDERSCORE:\n        res = this.handleDelim(c, block);\n        break;\n    case C_SINGLEQUOTE:\n    case C_DOUBLEQUOTE:\n        res = this.options.smart && this.handleDelim(c, block);\n        break;\n    case C_OPEN_BRACKET:\n        res = this.parseOpenBracket(block);\n        break;\n    case C_BANG:\n        res = this.parseBang(block);\n        break;\n    case C_CLOSE_BRACKET:\n        res = this.parseCloseBracket(block);\n        break;\n    case C_LESSTHAN:\n        res = this.parseAutolink(block) || this.parseHtmlTag(block);\n        break;\n    case C_AMPERSAND:\n        res = this.parseEntity(block);\n        break;\n    default:\n        res = this.parseString(block);\n        break;\n    }\n    if (!res) {\n        this.pos += 1;\n        block.appendChild(text(fromCodePoint(c)));\n    }\n\n    return true;\n};\n\n// Parse string content in block into inline children,\n// using refmap to resolve references.\nvar parseInlines = function(block) {\n    this.subject = block._string_content.trim();\n    this.pos = 0;\n    this.delimiters = null;\n    this.brackets = null;\n    while (this.parseInline(block)) {\n    }\n    block._string_content = null; // allow raw string to be garbage collected\n    this.processEmphasis(null);\n};\n\n// The InlineParser object.\nfunction InlineParser(options){\n    return {\n        subject: '',\n        delimiters: null,  // used by handleDelim method\n        brackets: null,\n        pos: 0,\n        refmap: {},\n        match: match,\n        peek: peek,\n        spnl: spnl,\n        parseBackticks: parseBackticks,\n        parseBackslash: parseBackslash,\n        parseAutolink: parseAutolink,\n        parseHtmlTag: parseHtmlTag,\n        scanDelims: scanDelims,\n        handleDelim: handleDelim,\n        parseLinkTitle: parseLinkTitle,\n        parseLinkDestination: parseLinkDestination,\n        parseLinkLabel: parseLinkLabel,\n        parseOpenBracket: parseOpenBracket,\n        parseBang: parseBang,\n        parseCloseBracket: parseCloseBracket,\n        addBracket: addBracket,\n        removeBracket: removeBracket,\n        parseEntity: parseEntity,\n        parseString: parseString,\n        parseNewline: parseNewline,\n        parseReference: parseReference,\n        parseInline: parseInline,\n        processEmphasis: processEmphasis,\n        removeDelimiter: removeDelimiter,\n        options: options || {},\n        parse: parseInlines\n    };\n}\n\nmodule.exports = InlineParser;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDI2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9jb21tb25tYXJrL2xpYi9pbmxpbmVzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xudmFyIGNvbW1vbiA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG52YXIgbm9ybWFsaXplUmVmZXJlbmNlID0gcmVxdWlyZSgnLi9ub3JtYWxpemUtcmVmZXJlbmNlJyk7XG5cbnZhciBub3JtYWxpemVVUkkgPSBjb21tb24ubm9ybWFsaXplVVJJO1xudmFyIHVuZXNjYXBlU3RyaW5nID0gY29tbW9uLnVuZXNjYXBlU3RyaW5nO1xudmFyIGZyb21Db2RlUG9pbnQgPSByZXF1aXJlKCcuL2Zyb20tY29kZS1wb2ludC5qcycpO1xudmFyIGRlY29kZUhUTUwgPSByZXF1aXJlKCdlbnRpdGllcycpLmRlY29kZUhUTUw7XG5yZXF1aXJlKCdzdHJpbmcucHJvdG90eXBlLnJlcGVhdCcpOyAvLyBQb2x5ZmlsbCBmb3IgU3RyaW5nLnByb3RvdHlwZS5yZXBlYXRcblxuLy8gQ29uc3RhbnRzIGZvciBjaGFyYWN0ZXIgY29kZXM6XG5cbnZhciBDX05FV0xJTkUgPSAxMDtcbnZhciBDX0FTVEVSSVNLID0gNDI7XG52YXIgQ19VTkRFUlNDT1JFID0gOTU7XG52YXIgQ19CQUNLVElDSyA9IDk2O1xudmFyIENfT1BFTl9CUkFDS0VUID0gOTE7XG52YXIgQ19DTE9TRV9CUkFDS0VUID0gOTM7XG52YXIgQ19MRVNTVEhBTiA9IDYwO1xudmFyIENfQkFORyA9IDMzO1xudmFyIENfQkFDS1NMQVNIID0gOTI7XG52YXIgQ19BTVBFUlNBTkQgPSAzODtcbnZhciBDX09QRU5fUEFSRU4gPSA0MDtcbnZhciBDX0NMT1NFX1BBUkVOID0gNDE7XG52YXIgQ19DT0xPTiA9IDU4O1xudmFyIENfU0lOR0xFUVVPVEUgPSAzOTtcbnZhciBDX0RPVUJMRVFVT1RFID0gMzQ7XG5cbi8vIFNvbWUgcmVnZXhwcyB1c2VkIGluIGlubGluZSBwYXJzZXI6XG5cbnZhciBFU0NBUEFCTEUgPSBjb21tb24uRVNDQVBBQkxFO1xudmFyIEVTQ0FQRURfQ0hBUiA9ICdcXFxcXFxcXCcgKyBFU0NBUEFCTEU7XG52YXIgUkVHX0NIQVIgPSAnW15cXFxcXFxcXCgpXFxcXHgwMC1cXFxceDIwXSc7XG52YXIgSU5fUEFSRU5TX05PU1AgPSAnXFxcXCgoJyArIFJFR19DSEFSICsgJ3wnICsgRVNDQVBFRF9DSEFSICsgJ3xcXFxcXFxcXCkqXFxcXCknO1xuXG52YXIgRU5USVRZID0gY29tbW9uLkVOVElUWTtcbnZhciByZUh0bWxUYWcgPSBjb21tb24ucmVIdG1sVGFnO1xuXG52YXIgcmVQdW5jdHVhdGlvbiA9IG5ldyBSZWdFeHAoL1shLSMlLVxcKiwtLzo7XFw/QFxcWy1cXF1fXFx7XFx9XFx4QTFcXHhBN1xceEFCXFx4QjZcXHhCN1xceEJCXFx4QkZcXHUwMzdFXFx1MDM4N1xcdTA1NUEtXFx1MDU1RlxcdTA1ODlcXHUwNThBXFx1MDVCRVxcdTA1QzBcXHUwNUMzXFx1MDVDNlxcdTA1RjNcXHUwNUY0XFx1MDYwOVxcdTA2MEFcXHUwNjBDXFx1MDYwRFxcdTA2MUJcXHUwNjFFXFx1MDYxRlxcdTA2NkEtXFx1MDY2RFxcdTA2RDRcXHUwNzAwLVxcdTA3MERcXHUwN0Y3LVxcdTA3RjlcXHUwODMwLVxcdTA4M0VcXHUwODVFXFx1MDk2NFxcdTA5NjVcXHUwOTcwXFx1MEFGMFxcdTBERjRcXHUwRTRGXFx1MEU1QVxcdTBFNUJcXHUwRjA0LVxcdTBGMTJcXHUwRjE0XFx1MEYzQS1cXHUwRjNEXFx1MEY4NVxcdTBGRDAtXFx1MEZENFxcdTBGRDlcXHUwRkRBXFx1MTA0QS1cXHUxMDRGXFx1MTBGQlxcdTEzNjAtXFx1MTM2OFxcdTE0MDBcXHUxNjZEXFx1MTY2RVxcdTE2OUJcXHUxNjlDXFx1MTZFQi1cXHUxNkVEXFx1MTczNVxcdTE3MzZcXHUxN0Q0LVxcdTE3RDZcXHUxN0Q4LVxcdTE3REFcXHUxODAwLVxcdTE4MEFcXHUxOTQ0XFx1MTk0NVxcdTFBMUVcXHUxQTFGXFx1MUFBMC1cXHUxQUE2XFx1MUFBOC1cXHUxQUFEXFx1MUI1QS1cXHUxQjYwXFx1MUJGQy1cXHUxQkZGXFx1MUMzQi1cXHUxQzNGXFx1MUM3RVxcdTFDN0ZcXHUxQ0MwLVxcdTFDQzdcXHUxQ0QzXFx1MjAxMC1cXHUyMDI3XFx1MjAzMC1cXHUyMDQzXFx1MjA0NS1cXHUyMDUxXFx1MjA1My1cXHUyMDVFXFx1MjA3RFxcdTIwN0VcXHUyMDhEXFx1MjA4RVxcdTIzMDgtXFx1MjMwQlxcdTIzMjlcXHUyMzJBXFx1Mjc2OC1cXHUyNzc1XFx1MjdDNVxcdTI3QzZcXHUyN0U2LVxcdTI3RUZcXHUyOTgzLVxcdTI5OThcXHUyOUQ4LVxcdTI5REJcXHUyOUZDXFx1MjlGRFxcdTJDRjktXFx1MkNGQ1xcdTJDRkVcXHUyQ0ZGXFx1MkQ3MFxcdTJFMDAtXFx1MkUyRVxcdTJFMzAtXFx1MkU0MlxcdTMwMDEtXFx1MzAwM1xcdTMwMDgtXFx1MzAxMVxcdTMwMTQtXFx1MzAxRlxcdTMwMzBcXHUzMDNEXFx1MzBBMFxcdTMwRkJcXHVBNEZFXFx1QTRGRlxcdUE2MEQtXFx1QTYwRlxcdUE2NzNcXHVBNjdFXFx1QTZGMi1cXHVBNkY3XFx1QTg3NC1cXHVBODc3XFx1QThDRVxcdUE4Q0ZcXHVBOEY4LVxcdUE4RkFcXHVBOEZDXFx1QTkyRVxcdUE5MkZcXHVBOTVGXFx1QTlDMS1cXHVBOUNEXFx1QTlERVxcdUE5REZcXHVBQTVDLVxcdUFBNUZcXHVBQURFXFx1QUFERlxcdUFBRjBcXHVBQUYxXFx1QUJFQlxcdUZEM0VcXHVGRDNGXFx1RkUxMC1cXHVGRTE5XFx1RkUzMC1cXHVGRTUyXFx1RkU1NC1cXHVGRTYxXFx1RkU2M1xcdUZFNjhcXHVGRTZBXFx1RkU2QlxcdUZGMDEtXFx1RkYwM1xcdUZGMDUtXFx1RkYwQVxcdUZGMEMtXFx1RkYwRlxcdUZGMUFcXHVGRjFCXFx1RkYxRlxcdUZGMjBcXHVGRjNCLVxcdUZGM0RcXHVGRjNGXFx1RkY1QlxcdUZGNURcXHVGRjVGLVxcdUZGNjVdfFxcdUQ4MDBbXFx1REQwMC1cXHVERDAyXFx1REY5RlxcdURGRDBdfFxcdUQ4MDFcXHVERDZGfFxcdUQ4MDJbXFx1REM1N1xcdUREMUZcXHVERDNGXFx1REU1MC1cXHVERTU4XFx1REU3RlxcdURFRjAtXFx1REVGNlxcdURGMzktXFx1REYzRlxcdURGOTktXFx1REY5Q118XFx1RDgwNFtcXHVEQzQ3LVxcdURDNERcXHVEQ0JCXFx1RENCQ1xcdURDQkUtXFx1RENDMVxcdURENDAtXFx1REQ0M1xcdURENzRcXHVERDc1XFx1RERDNS1cXHVEREM5XFx1RERDRFxcdUREREJcXHVERERELVxcdUREREZcXHVERTM4LVxcdURFM0RcXHVERUE5XXxcXHVEODA1W1xcdURDQzZcXHVEREMxLVxcdURERDdcXHVERTQxLVxcdURFNDNcXHVERjNDLVxcdURGM0VdfFxcdUQ4MDlbXFx1REM3MC1cXHVEQzc0XXxcXHVEODFBW1xcdURFNkVcXHVERTZGXFx1REVGNVxcdURGMzctXFx1REYzQlxcdURGNDRdfFxcdUQ4MkZcXHVEQzlGfFxcdUQ4MzZbXFx1REU4Ny1cXHVERThCXS8pO1xuXG52YXIgcmVMaW5rVGl0bGUgPSBuZXcgUmVnRXhwKFxuICAgICdeKD86XCIoJyArIEVTQ0FQRURfQ0hBUiArICd8W15cIlxcXFx4MDBdKSpcIicgK1xuICAgICAgICAnfCcgK1xuICAgICAgICAnXFwnKCcgKyBFU0NBUEVEX0NIQVIgKyAnfFteXFwnXFxcXHgwMF0pKlxcJycgK1xuICAgICAgICAnfCcgK1xuICAgICAgICAnXFxcXCgoJyArIEVTQ0FQRURfQ0hBUiArICd8W14pXFxcXHgwMF0pKlxcXFwpKScpO1xuXG52YXIgcmVMaW5rRGVzdGluYXRpb25CcmFjZXMgPSBuZXcgUmVnRXhwKFxuICAgICdeKD86WzxdKD86W14gPD5cXFxcdFxcXFxuXFxcXFxcXFxcXFxceDAwXScgKyAnfCcgKyBFU0NBUEVEX0NIQVIgKyAnfCcgKyAnXFxcXFxcXFwpKls+XSknKTtcblxudmFyIHJlTGlua0Rlc3RpbmF0aW9uID0gbmV3IFJlZ0V4cChcbiAgICAnXig/OicgKyBSRUdfQ0hBUiArICcrfCcgKyBFU0NBUEVEX0NIQVIgKyAnfFxcXFxcXFxcfCcgKyBJTl9QQVJFTlNfTk9TUCArICcpKicpO1xuXG52YXIgcmVFc2NhcGFibGUgPSBuZXcgUmVnRXhwKCdeJyArIEVTQ0FQQUJMRSk7XG5cbnZhciByZUVudGl0eUhlcmUgPSBuZXcgUmVnRXhwKCdeJyArIEVOVElUWSwgJ2knKTtcblxudmFyIHJlVGlja3MgPSAvYCsvO1xuXG52YXIgcmVUaWNrc0hlcmUgPSAvXmArLztcblxudmFyIHJlRWxsaXBzZXMgPSAvXFwuXFwuXFwuL2c7XG5cbnZhciByZURhc2ggPSAvLS0rL2c7XG5cbnZhciByZUVtYWlsQXV0b2xpbmsgPSAvXjwoW2EtekEtWjAtOS4hIyQlJicqK1xcLz0/Xl9ge3x9fi1dK0BbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcXC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKik+LztcblxudmFyIHJlQXV0b2xpbmsgPSAvXjxbQS1aYS16XVtBLVphLXowLTkuKy1dezEsMzF9OltePD5cXHgwMC1cXHgyMF0qPi9pO1xuXG52YXIgcmVTcG5sID0gL14gKig/OlxcbiAqKT8vO1xuXG52YXIgcmVXaGl0ZXNwYWNlQ2hhciA9IC9eWyBcXHRcXG5cXHgwYlxceDBjXFx4MGRdLztcblxudmFyIHJlV2hpdGVzcGFjZSA9IC9bIFxcdFxcblxceDBiXFx4MGNcXHgwZF0rL2c7XG5cbnZhciByZVVuaWNvZGVXaGl0ZXNwYWNlQ2hhciA9IC9eXFxzLztcblxudmFyIHJlVW5pY29kZVdoaXRlc3BhY2UgPSAvXFxzKy9nO1xuXG52YXIgcmVGaW5hbFNwYWNlID0gLyAqJC87XG5cbnZhciByZUluaXRpYWxTcGFjZSA9IC9eICovO1xuXG52YXIgcmVTcGFjZUF0RW5kT2ZMaW5lID0gL14gKig/OlxcbnwkKS87XG5cbnZhciByZUxpbmtMYWJlbCA9IG5ldyBSZWdFeHAoJ15cXFxcWyg/OlteXFxcXFxcXFxcXFxcW1xcXFxdXXwnICsgRVNDQVBFRF9DSEFSICtcbiAgJ3xcXFxcXFxcXCl7MCwxMDAwfVxcXFxdJyk7XG5cbi8vIE1hdGNoZXMgYSBzdHJpbmcgb2Ygbm9uLXNwZWNpYWwgY2hhcmFjdGVycy5cbnZhciByZU1haW4gPSAvXlteXFxuYFxcW1xcXVxcXFwhPCYqXydcIl0rL207XG5cbnZhciB0ZXh0ID0gZnVuY3Rpb24ocykge1xuICAgIHZhciBub2RlID0gbmV3IE5vZGUoJ3RleHQnKTtcbiAgICBub2RlLl9saXRlcmFsID0gcztcbiAgICByZXR1cm4gbm9kZTtcbn07XG5cbi8vIElOTElORSBQQVJTRVJcblxuLy8gVGhlc2UgYXJlIG1ldGhvZHMgb2YgYW4gSW5saW5lUGFyc2VyIG9iamVjdCwgZGVmaW5lZCBiZWxvdy5cbi8vIEFuIElubGluZVBhcnNlciBrZWVwcyB0cmFjayBvZiBhIHN1YmplY3QgKGEgc3RyaW5nIHRvIGJlXG4vLyBwYXJzZWQpIGFuZCBhIHBvc2l0aW9uIGluIHRoYXQgc3ViamVjdC5cblxuLy8gSWYgcmUgbWF0Y2hlcyBhdCBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzdWJqZWN0LCBhZHZhbmNlXG4vLyBwb3NpdGlvbiBpbiBzdWJqZWN0IGFuZCByZXR1cm4gdGhlIG1hdGNoOyBvdGhlcndpc2UgcmV0dXJuIG51bGwuXG52YXIgbWF0Y2ggPSBmdW5jdGlvbihyZSkge1xuICAgIHZhciBtID0gcmUuZXhlYyh0aGlzLnN1YmplY3Quc2xpY2UodGhpcy5wb3MpKTtcbiAgICBpZiAobSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvcyArPSBtLmluZGV4ICsgbVswXS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBtWzBdO1xuICAgIH1cbn07XG5cbi8vIFJldHVybnMgdGhlIGNvZGUgZm9yIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGN1cnJlbnQgc3ViamVjdCBwb3NpdGlvbiwgb3IgLTFcbi8vIHRoZXJlIGFyZSBubyBtb3JlIGNoYXJhY3RlcnMuXG52YXIgcGVlayA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLnBvcyA8IHRoaXMuc3ViamVjdC5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ViamVjdC5jaGFyQ29kZUF0KHRoaXMucG9zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxufTtcblxuLy8gUGFyc2UgemVybyBvciBtb3JlIHNwYWNlIGNoYXJhY3RlcnMsIGluY2x1ZGluZyBhdCBtb3N0IG9uZSBuZXdsaW5lXG52YXIgc3BubCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMubWF0Y2gocmVTcG5sKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIEFsbCBvZiB0aGUgcGFyc2VycyBiZWxvdyB0cnkgdG8gbWF0Y2ggc29tZXRoaW5nIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uXG4vLyBpbiB0aGUgc3ViamVjdC4gIElmIHRoZXkgc3VjY2VlZCBpbiBtYXRjaGluZyBhbnl0aGluZywgdGhleVxuLy8gcmV0dXJuIHRoZSBpbmxpbmUgbWF0Y2hlZCwgYWR2YW5jaW5nIHRoZSBzdWJqZWN0LlxuXG4vLyBBdHRlbXB0IHRvIHBhcnNlIGJhY2t0aWNrcywgYWRkaW5nIGVpdGhlciBhIGJhY2t0aWNrIGNvZGUgc3BhbiBvciBhXG4vLyBsaXRlcmFsIHNlcXVlbmNlIG9mIGJhY2t0aWNrcy5cbnZhciBwYXJzZUJhY2t0aWNrcyA9IGZ1bmN0aW9uKGJsb2NrKSB7XG4gICAgdmFyIHRpY2tzID0gdGhpcy5tYXRjaChyZVRpY2tzSGVyZSk7XG4gICAgaWYgKHRpY2tzID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGFmdGVyT3BlblRpY2tzID0gdGhpcy5wb3M7XG4gICAgdmFyIG1hdGNoZWQ7XG4gICAgdmFyIG5vZGU7XG4gICAgd2hpbGUgKChtYXRjaGVkID0gdGhpcy5tYXRjaChyZVRpY2tzKSkgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKG1hdGNoZWQgPT09IHRpY2tzKSB7XG4gICAgICAgICAgICBub2RlID0gbmV3IE5vZGUoJ2NvZGUnKTtcbiAgICAgICAgICAgIG5vZGUuX2xpdGVyYWwgPSB0aGlzLnN1YmplY3Quc2xpY2UoYWZ0ZXJPcGVuVGlja3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3MgLSB0aWNrcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC50cmltKCkucmVwbGFjZShyZVdoaXRlc3BhY2UsICcgJyk7XG4gICAgICAgICAgICBibG9jay5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIHdlIGdvdCBoZXJlLCB3ZSBkaWRuJ3QgbWF0Y2ggYSBjbG9zaW5nIGJhY2t0aWNrIHNlcXVlbmNlLlxuICAgIHRoaXMucG9zID0gYWZ0ZXJPcGVuVGlja3M7XG4gICAgYmxvY2suYXBwZW5kQ2hpbGQodGV4dCh0aWNrcykpO1xuICAgIHJldHVybiB0cnVlO1xufTtcblxuLy8gUGFyc2UgYSBiYWNrc2xhc2gtZXNjYXBlZCBzcGVjaWFsIGNoYXJhY3RlciwgYWRkaW5nIGVpdGhlciB0aGUgZXNjYXBlZFxuLy8gY2hhcmFjdGVyLCBhIGhhcmQgbGluZSBicmVhayAoaWYgdGhlIGJhY2tzbGFzaCBpcyBmb2xsb3dlZCBieSBhIG5ld2xpbmUpLFxuLy8gb3IgYSBsaXRlcmFsIGJhY2tzbGFzaCB0byB0aGUgYmxvY2sncyBjaGlsZHJlbi4gIEFzc3VtZXMgY3VycmVudCBjaGFyYWN0ZXJcbi8vIGlzIGEgYmFja3NsYXNoLlxudmFyIHBhcnNlQmFja3NsYXNoID0gZnVuY3Rpb24oYmxvY2spIHtcbiAgICB2YXIgc3ViaiA9IHRoaXMuc3ViamVjdDtcbiAgICB2YXIgbm9kZTtcbiAgICB0aGlzLnBvcyArPSAxO1xuICAgIGlmICh0aGlzLnBlZWsoKSA9PT0gQ19ORVdMSU5FKSB7XG4gICAgICAgIHRoaXMucG9zICs9IDE7XG4gICAgICAgIG5vZGUgPSBuZXcgTm9kZSgnbGluZWJyZWFrJyk7XG4gICAgICAgIGJsb2NrLmFwcGVuZENoaWxkKG5vZGUpO1xuICAgIH0gZWxzZSBpZiAocmVFc2NhcGFibGUudGVzdChzdWJqLmNoYXJBdCh0aGlzLnBvcykpKSB7XG4gICAgICAgIGJsb2NrLmFwcGVuZENoaWxkKHRleHQoc3Viai5jaGFyQXQodGhpcy5wb3MpKSk7XG4gICAgICAgIHRoaXMucG9zICs9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYmxvY2suYXBwZW5kQ2hpbGQodGV4dCgnXFxcXCcpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG4vLyBBdHRlbXB0IHRvIHBhcnNlIGFuIGF1dG9saW5rIChVUkwgb3IgZW1haWwgaW4gcG9pbnR5IGJyYWNrZXRzKS5cbnZhciBwYXJzZUF1dG9saW5rID0gZnVuY3Rpb24oYmxvY2spIHtcbiAgICB2YXIgbTtcbiAgICB2YXIgZGVzdDtcbiAgICB2YXIgbm9kZTtcbiAgICBpZiAoKG0gPSB0aGlzLm1hdGNoKHJlRW1haWxBdXRvbGluaykpKSB7XG4gICAgICAgIGRlc3QgPSBtLnNsaWNlKDEsIG0ubGVuZ3RoIC0gMSk7XG4gICAgICAgIG5vZGUgPSBuZXcgTm9kZSgnbGluaycpO1xuICAgICAgICBub2RlLl9kZXN0aW5hdGlvbiA9IG5vcm1hbGl6ZVVSSSgnbWFpbHRvOicgKyBkZXN0KTtcbiAgICAgICAgbm9kZS5fdGl0bGUgPSAnJztcbiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZCh0ZXh0KGRlc3QpKTtcbiAgICAgICAgYmxvY2suYXBwZW5kQ2hpbGQobm9kZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoKG0gPSB0aGlzLm1hdGNoKHJlQXV0b2xpbmspKSkge1xuICAgICAgICBkZXN0ID0gbS5zbGljZSgxLCBtLmxlbmd0aCAtIDEpO1xuICAgICAgICBub2RlID0gbmV3IE5vZGUoJ2xpbmsnKTtcbiAgICAgICAgbm9kZS5fZGVzdGluYXRpb24gPSBub3JtYWxpemVVUkkoZGVzdCk7XG4gICAgICAgIG5vZGUuX3RpdGxlID0gJyc7XG4gICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodGV4dChkZXN0KSk7XG4gICAgICAgIGJsb2NrLmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcblxuLy8gQXR0ZW1wdCB0byBwYXJzZSBhIHJhdyBIVE1MIHRhZy5cbnZhciBwYXJzZUh0bWxUYWcgPSBmdW5jdGlvbihibG9jaykge1xuICAgIHZhciBtID0gdGhpcy5tYXRjaChyZUh0bWxUYWcpO1xuICAgIGlmIChtID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbm9kZSA9IG5ldyBOb2RlKCdodG1sX2lubGluZScpO1xuICAgICAgICBub2RlLl9saXRlcmFsID0gbTtcbiAgICAgICAgYmxvY2suYXBwZW5kQ2hpbGQobm9kZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn07XG5cbi8vIFNjYW4gYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHdpdGggY29kZSBjYywgYW5kIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dFxuLy8gdGhlIG51bWJlciBvZiBkZWxpbWl0ZXJzIGFuZCB3aGV0aGVyIHRoZXkgYXJlIHBvc2l0aW9uZWQgc3VjaCB0aGF0XG4vLyB0aGV5IGNhbiBvcGVuIGFuZC9vciBjbG9zZSBlbXBoYXNpcyBvciBzdHJvbmcgZW1waGFzaXMuICBBIHV0aWxpdHlcbi8vIGZ1bmN0aW9uIGZvciBzdHJvbmcvZW1waCBwYXJzaW5nLlxudmFyIHNjYW5EZWxpbXMgPSBmdW5jdGlvbihjYykge1xuICAgIHZhciBudW1kZWxpbXMgPSAwO1xuICAgIHZhciBjaGFyX2JlZm9yZSwgY2hhcl9hZnRlciwgY2NfYWZ0ZXI7XG4gICAgdmFyIHN0YXJ0cG9zID0gdGhpcy5wb3M7XG4gICAgdmFyIGxlZnRfZmxhbmtpbmcsIHJpZ2h0X2ZsYW5raW5nLCBjYW5fb3BlbiwgY2FuX2Nsb3NlO1xuICAgIHZhciBhZnRlcl9pc193aGl0ZXNwYWNlLCBhZnRlcl9pc19wdW5jdHVhdGlvbiwgYmVmb3JlX2lzX3doaXRlc3BhY2UsIGJlZm9yZV9pc19wdW5jdHVhdGlvbjtcblxuICAgIGlmIChjYyA9PT0gQ19TSU5HTEVRVU9URSB8fCBjYyA9PT0gQ19ET1VCTEVRVU9URSkge1xuICAgICAgICBudW1kZWxpbXMrKztcbiAgICAgICAgdGhpcy5wb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgICB3aGlsZSAodGhpcy5wZWVrKCkgPT09IGNjKSB7XG4gICAgICAgICAgICBudW1kZWxpbXMrKztcbiAgICAgICAgICAgIHRoaXMucG9zKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobnVtZGVsaW1zID09PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNoYXJfYmVmb3JlID0gc3RhcnRwb3MgPT09IDAgPyAnXFxuJyA6IHRoaXMuc3ViamVjdC5jaGFyQXQoc3RhcnRwb3MgLSAxKTtcblxuICAgIGNjX2FmdGVyID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKGNjX2FmdGVyID09PSAtMSkge1xuICAgICAgICBjaGFyX2FmdGVyID0gJ1xcbic7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY2hhcl9hZnRlciA9IGZyb21Db2RlUG9pbnQoY2NfYWZ0ZXIpO1xuICAgIH1cblxuICAgIGFmdGVyX2lzX3doaXRlc3BhY2UgPSByZVVuaWNvZGVXaGl0ZXNwYWNlQ2hhci50ZXN0KGNoYXJfYWZ0ZXIpO1xuICAgIGFmdGVyX2lzX3B1bmN0dWF0aW9uID0gcmVQdW5jdHVhdGlvbi50ZXN0KGNoYXJfYWZ0ZXIpO1xuICAgIGJlZm9yZV9pc193aGl0ZXNwYWNlID0gcmVVbmljb2RlV2hpdGVzcGFjZUNoYXIudGVzdChjaGFyX2JlZm9yZSk7XG4gICAgYmVmb3JlX2lzX3B1bmN0dWF0aW9uID0gcmVQdW5jdHVhdGlvbi50ZXN0KGNoYXJfYmVmb3JlKTtcblxuICAgIGxlZnRfZmxhbmtpbmcgPSAhYWZ0ZXJfaXNfd2hpdGVzcGFjZSAmJlxuICAgICAgICAgICAgIShhZnRlcl9pc19wdW5jdHVhdGlvbiAmJiAhYmVmb3JlX2lzX3doaXRlc3BhY2UgJiYgIWJlZm9yZV9pc19wdW5jdHVhdGlvbik7XG4gICAgcmlnaHRfZmxhbmtpbmcgPSAhYmVmb3JlX2lzX3doaXRlc3BhY2UgJiZcbiAgICAgICAgICAgICEoYmVmb3JlX2lzX3B1bmN0dWF0aW9uICYmICFhZnRlcl9pc193aGl0ZXNwYWNlICYmICFhZnRlcl9pc19wdW5jdHVhdGlvbik7XG4gICAgaWYgKGNjID09PSBDX1VOREVSU0NPUkUpIHtcbiAgICAgICAgY2FuX29wZW4gPSBsZWZ0X2ZsYW5raW5nICYmXG4gICAgICAgICAgICAoIXJpZ2h0X2ZsYW5raW5nIHx8IGJlZm9yZV9pc19wdW5jdHVhdGlvbik7XG4gICAgICAgIGNhbl9jbG9zZSA9IHJpZ2h0X2ZsYW5raW5nICYmXG4gICAgICAgICAgICAoIWxlZnRfZmxhbmtpbmcgfHwgYWZ0ZXJfaXNfcHVuY3R1YXRpb24pO1xuICAgIH0gZWxzZSBpZiAoY2MgPT09IENfU0lOR0xFUVVPVEUgfHwgY2MgPT09IENfRE9VQkxFUVVPVEUpIHtcbiAgICAgICAgY2FuX29wZW4gPSBsZWZ0X2ZsYW5raW5nICYmICFyaWdodF9mbGFua2luZztcbiAgICAgICAgY2FuX2Nsb3NlID0gcmlnaHRfZmxhbmtpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY2FuX29wZW4gPSBsZWZ0X2ZsYW5raW5nO1xuICAgICAgICBjYW5fY2xvc2UgPSByaWdodF9mbGFua2luZztcbiAgICB9XG4gICAgdGhpcy5wb3MgPSBzdGFydHBvcztcbiAgICByZXR1cm4geyBudW1kZWxpbXM6IG51bWRlbGltcyxcbiAgICAgICAgICAgICBjYW5fb3BlbjogY2FuX29wZW4sXG4gICAgICAgICAgICAgY2FuX2Nsb3NlOiBjYW5fY2xvc2UgfTtcbn07XG5cbi8vIEhhbmRsZSBhIGRlbGltaXRlciBtYXJrZXIgZm9yIGVtcGhhc2lzIG9yIGEgcXVvdGUuXG52YXIgaGFuZGxlRGVsaW0gPSBmdW5jdGlvbihjYywgYmxvY2spIHtcbiAgICB2YXIgcmVzID0gdGhpcy5zY2FuRGVsaW1zKGNjKTtcbiAgICBpZiAoIXJlcykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBudW1kZWxpbXMgPSByZXMubnVtZGVsaW1zO1xuICAgIHZhciBzdGFydHBvcyA9IHRoaXMucG9zO1xuICAgIHZhciBjb250ZW50cztcblxuICAgIHRoaXMucG9zICs9IG51bWRlbGltcztcbiAgICBpZiAoY2MgPT09IENfU0lOR0xFUVVPVEUpIHtcbiAgICAgICAgY29udGVudHMgPSBcIlxcdTIwMTlcIjtcbiAgICB9IGVsc2UgaWYgKGNjID09PSBDX0RPVUJMRVFVT1RFKSB7XG4gICAgICAgIGNvbnRlbnRzID0gXCJcXHUyMDFDXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29udGVudHMgPSB0aGlzLnN1YmplY3Quc2xpY2Uoc3RhcnRwb3MsIHRoaXMucG9zKTtcbiAgICB9XG4gICAgdmFyIG5vZGUgPSB0ZXh0KGNvbnRlbnRzKTtcbiAgICBibG9jay5hcHBlbmRDaGlsZChub2RlKTtcblxuICAgIC8vIEFkZCBlbnRyeSB0byBzdGFjayBmb3IgdGhpcyBvcGVuZXJcbiAgICB0aGlzLmRlbGltaXRlcnMgPSB7IGNjOiBjYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bWRlbGltczogbnVtZGVsaW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzOiB0aGlzLmRlbGltaXRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FuX29wZW46IHJlcy5jYW5fb3BlbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbl9jbG9zZTogcmVzLmNhbl9jbG9zZSB9O1xuICAgIGlmICh0aGlzLmRlbGltaXRlcnMucHJldmlvdXMgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5kZWxpbWl0ZXJzLnByZXZpb3VzLm5leHQgPSB0aGlzLmRlbGltaXRlcnM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG5cbn07XG5cbnZhciByZW1vdmVEZWxpbWl0ZXIgPSBmdW5jdGlvbihkZWxpbSkge1xuICAgIGlmIChkZWxpbS5wcmV2aW91cyAhPT0gbnVsbCkge1xuICAgICAgICBkZWxpbS5wcmV2aW91cy5uZXh0ID0gZGVsaW0ubmV4dDtcbiAgICB9XG4gICAgaWYgKGRlbGltLm5leHQgPT09IG51bGwpIHtcbiAgICAgICAgLy8gdG9wIG9mIHN0YWNrXG4gICAgICAgIHRoaXMuZGVsaW1pdGVycyA9IGRlbGltLnByZXZpb3VzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGltLm5leHQucHJldmlvdXMgPSBkZWxpbS5wcmV2aW91cztcbiAgICB9XG59O1xuXG52YXIgcmVtb3ZlRGVsaW1pdGVyc0JldHdlZW4gPSBmdW5jdGlvbihib3R0b20sIHRvcCkge1xuICAgIGlmIChib3R0b20ubmV4dCAhPT0gdG9wKSB7XG4gICAgICAgIGJvdHRvbS5uZXh0ID0gdG9wO1xuICAgICAgICB0b3AucHJldmlvdXMgPSBib3R0b207XG4gICAgfVxufTtcblxudmFyIHByb2Nlc3NFbXBoYXNpcyA9IGZ1bmN0aW9uKHN0YWNrX2JvdHRvbSkge1xuICAgIHZhciBvcGVuZXIsIGNsb3Nlciwgb2xkX2Nsb3NlcjtcbiAgICB2YXIgb3BlbmVyX2lubCwgY2xvc2VyX2lubDtcbiAgICB2YXIgdGVtcHN0YWNrO1xuICAgIHZhciB1c2VfZGVsaW1zO1xuICAgIHZhciB0bXAsIG5leHQ7XG4gICAgdmFyIG9wZW5lcl9mb3VuZDtcbiAgICB2YXIgb3BlbmVyc19ib3R0b20gPSBbXTtcbiAgICB2YXIgb2RkX21hdGNoID0gZmFsc2U7XG5cbiAgICBvcGVuZXJzX2JvdHRvbVtDX1VOREVSU0NPUkVdID0gc3RhY2tfYm90dG9tO1xuICAgIG9wZW5lcnNfYm90dG9tW0NfQVNURVJJU0tdID0gc3RhY2tfYm90dG9tO1xuICAgIG9wZW5lcnNfYm90dG9tW0NfU0lOR0xFUVVPVEVdID0gc3RhY2tfYm90dG9tO1xuICAgIG9wZW5lcnNfYm90dG9tW0NfRE9VQkxFUVVPVEVdID0gc3RhY2tfYm90dG9tO1xuXG4gICAgLy8gZmluZCBmaXJzdCBjbG9zZXIgYWJvdmUgc3RhY2tfYm90dG9tOlxuICAgIGNsb3NlciA9IHRoaXMuZGVsaW1pdGVycztcbiAgICB3aGlsZSAoY2xvc2VyICE9PSBudWxsICYmIGNsb3Nlci5wcmV2aW91cyAhPT0gc3RhY2tfYm90dG9tKSB7XG4gICAgICAgIGNsb3NlciA9IGNsb3Nlci5wcmV2aW91cztcbiAgICB9XG4gICAgLy8gbW92ZSBmb3J3YXJkLCBsb29raW5nIGZvciBjbG9zZXJzLCBhbmQgaGFuZGxpbmcgZWFjaFxuICAgIHdoaWxlIChjbG9zZXIgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGNsb3NlcmNjID0gY2xvc2VyLmNjO1xuICAgICAgICBpZiAoIWNsb3Nlci5jYW5fY2xvc2UpIHtcbiAgICAgICAgICAgIGNsb3NlciA9IGNsb3Nlci5uZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZm91bmQgZW1waGFzaXMgY2xvc2VyLiBub3cgbG9vayBiYWNrIGZvciBmaXJzdCBtYXRjaGluZyBvcGVuZXI6XG4gICAgICAgICAgICBvcGVuZXIgPSBjbG9zZXIucHJldmlvdXM7XG4gICAgICAgICAgICBvcGVuZXJfZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgIHdoaWxlIChvcGVuZXIgIT09IG51bGwgJiYgb3BlbmVyICE9PSBzdGFja19ib3R0b20gJiZcbiAgICAgICAgICAgICAgICAgICBvcGVuZXIgIT09IG9wZW5lcnNfYm90dG9tW2Nsb3NlcmNjXSkge1xuICAgICAgICAgICAgICAgIG9kZF9tYXRjaCA9IChjbG9zZXIuY2FuX29wZW4gfHwgb3BlbmVyLmNhbl9jbG9zZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgKG9wZW5lci5udW1kZWxpbXMgKyBjbG9zZXIubnVtZGVsaW1zKSAlIDMgPT09IDA7XG4gICAgICAgICAgICAgICAgaWYgKG9wZW5lci5jYyA9PT0gY2xvc2VyLmNjICYmIG9wZW5lci5jYW5fb3BlbiAmJiAhb2RkX21hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wZW5lcl9mb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvcGVuZXIgPSBvcGVuZXIucHJldmlvdXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvbGRfY2xvc2VyID0gY2xvc2VyO1xuXG4gICAgICAgICAgICBpZiAoY2xvc2VyY2MgPT09IENfQVNURVJJU0sgfHwgY2xvc2VyY2MgPT09IENfVU5ERVJTQ09SRSkge1xuICAgICAgICAgICAgICAgIGlmICghb3BlbmVyX2ZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb3NlciA9IGNsb3Nlci5uZXh0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBhY3R1YWwgbnVtYmVyIG9mIGRlbGltaXRlcnMgdXNlZCBmcm9tIGNsb3NlclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2xvc2VyLm51bWRlbGltcyA8IDMgfHwgb3BlbmVyLm51bWRlbGltcyA8IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9kZWxpbXMgPSBjbG9zZXIubnVtZGVsaW1zIDw9IG9wZW5lci5udW1kZWxpbXMgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlci5udW1kZWxpbXMgOiBvcGVuZXIubnVtZGVsaW1zO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXNlX2RlbGltcyA9IGNsb3Nlci5udW1kZWxpbXMgJSAyID09PSAwID8gMiA6IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBvcGVuZXJfaW5sID0gb3BlbmVyLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGNsb3Nlcl9pbmwgPSBjbG9zZXIubm9kZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgdXNlZCBkZWxpbWl0ZXJzIGZyb20gc3RhY2sgZWx0cyBhbmQgaW5saW5lc1xuICAgICAgICAgICAgICAgICAgICBvcGVuZXIubnVtZGVsaW1zIC09IHVzZV9kZWxpbXM7XG4gICAgICAgICAgICAgICAgICAgIGNsb3Nlci5udW1kZWxpbXMgLT0gdXNlX2RlbGltcztcbiAgICAgICAgICAgICAgICAgICAgb3BlbmVyX2lubC5fbGl0ZXJhbCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVuZXJfaW5sLl9saXRlcmFsLnNsaWNlKDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5lcl9pbmwuX2xpdGVyYWwubGVuZ3RoIC0gdXNlX2RlbGltcyk7XG4gICAgICAgICAgICAgICAgICAgIGNsb3Nlcl9pbmwuX2xpdGVyYWwgPVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VyX2lubC5fbGl0ZXJhbC5zbGljZSgwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXJfaW5sLl9saXRlcmFsLmxlbmd0aCAtIHVzZV9kZWxpbXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGJ1aWxkIGNvbnRlbnRzIGZvciBuZXcgZW1waCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbXBoID0gbmV3IE5vZGUodXNlX2RlbGltcyA9PT0gMSA/ICdlbXBoJyA6ICdzdHJvbmcnKTtcblxuICAgICAgICAgICAgICAgICAgICB0bXAgPSBvcGVuZXJfaW5sLl9uZXh0O1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodG1wICYmIHRtcCAhPT0gY2xvc2VyX2lubCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHRtcC5fbmV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcC51bmxpbmsoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtcGguYXBwZW5kQ2hpbGQodG1wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IG5leHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBvcGVuZXJfaW5sLmluc2VydEFmdGVyKGVtcGgpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBlbHRzIGJldHdlZW4gb3BlbmVyIGFuZCBjbG9zZXIgaW4gZGVsaW1pdGVycyBzdGFja1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVEZWxpbWl0ZXJzQmV0d2VlbihvcGVuZXIsIGNsb3Nlcik7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgb3BlbmVyIGhhcyAwIGRlbGltcywgcmVtb3ZlIGl0IGFuZCB0aGUgaW5saW5lXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcGVuZXIubnVtZGVsaW1zID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVuZXJfaW5sLnVubGluaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVEZWxpbWl0ZXIob3BlbmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjbG9zZXIubnVtZGVsaW1zID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXJfaW5sLnVubGluaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHN0YWNrID0gY2xvc2VyLm5leHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZURlbGltaXRlcihjbG9zZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VyID0gdGVtcHN0YWNrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xvc2VyY2MgPT09IENfU0lOR0xFUVVPVEUpIHtcbiAgICAgICAgICAgICAgICBjbG9zZXIubm9kZS5fbGl0ZXJhbCA9IFwiXFx1MjAxOVwiO1xuICAgICAgICAgICAgICAgIGlmIChvcGVuZXJfZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgb3BlbmVyLm5vZGUuX2xpdGVyYWwgPSBcIlxcdTIwMThcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2xvc2VyID0gY2xvc2VyLm5leHQ7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xvc2VyY2MgPT09IENfRE9VQkxFUVVPVEUpIHtcbiAgICAgICAgICAgICAgICBjbG9zZXIubm9kZS5fbGl0ZXJhbCA9IFwiXFx1MjAxRFwiO1xuICAgICAgICAgICAgICAgIGlmIChvcGVuZXJfZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgb3BlbmVyLm5vZGUubGl0ZXJhbCA9IFwiXFx1MjAxQ1wiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjbG9zZXIgPSBjbG9zZXIubmV4dDtcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFvcGVuZXJfZm91bmQgJiYgIW9kZF9tYXRjaCkge1xuICAgICAgICAgICAgICAgIC8vIFNldCBsb3dlciBib3VuZCBmb3IgZnV0dXJlIHNlYXJjaGVzIGZvciBvcGVuZXJzOlxuICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGRvIHRoaXMgd2l0aCBvZGRfbWF0Y2ggYmVjYXVzZSBhICoqXG4gICAgICAgICAgICAgICAgLy8gdGhhdCBkb2Vzbid0IG1hdGNoIGFuIGVhcmxpZXIgKiBtaWdodCB0dXJuIGludG9cbiAgICAgICAgICAgICAgICAvLyBhbiBvcGVuZXIsIGFuZCB0aGUgKiBtaWdodCBiZSBtYXRjaGVkIGJ5IHNvbWV0aGluZ1xuICAgICAgICAgICAgICAgIC8vIGVsc2UuXG4gICAgICAgICAgICAgICAgb3BlbmVyc19ib3R0b21bY2xvc2VyY2NdID0gb2xkX2Nsb3Nlci5wcmV2aW91cztcbiAgICAgICAgICAgICAgICBpZiAoIW9sZF9jbG9zZXIuY2FuX29wZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2FuIHJlbW92ZSBhIGNsb3NlciB0aGF0IGNhbid0IGJlIGFuIG9wZW5lcixcbiAgICAgICAgICAgICAgICAgICAgLy8gb25jZSB3ZSd2ZSBzZWVuIHRoZXJlJ3Mgbm8gbWF0Y2hpbmcgb3BlbmVyOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZURlbGltaXRlcihvbGRfY2xvc2VyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIC8vIHJlbW92ZSBhbGwgZGVsaW1pdGVyc1xuICAgIHdoaWxlICh0aGlzLmRlbGltaXRlcnMgIT09IG51bGwgJiYgdGhpcy5kZWxpbWl0ZXJzICE9PSBzdGFja19ib3R0b20pIHtcbiAgICAgICAgdGhpcy5yZW1vdmVEZWxpbWl0ZXIodGhpcy5kZWxpbWl0ZXJzKTtcbiAgICB9XG59O1xuXG4vLyBBdHRlbXB0IHRvIHBhcnNlIGxpbmsgdGl0bGUgKHNhbnMgcXVvdGVzKSwgcmV0dXJuaW5nIHRoZSBzdHJpbmdcbi8vIG9yIG51bGwgaWYgbm8gbWF0Y2guXG52YXIgcGFyc2VMaW5rVGl0bGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdGl0bGUgPSB0aGlzLm1hdGNoKHJlTGlua1RpdGxlKTtcbiAgICBpZiAodGl0bGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY2hvcCBvZmYgcXVvdGVzIGZyb20gdGl0bGUgYW5kIHVuZXNjYXBlOlxuICAgICAgICByZXR1cm4gdW5lc2NhcGVTdHJpbmcodGl0bGUuc3Vic3RyKDEsIHRpdGxlLmxlbmd0aCAtIDIpKTtcbiAgICB9XG59O1xuXG4vLyBBdHRlbXB0IHRvIHBhcnNlIGxpbmsgZGVzdGluYXRpb24sIHJldHVybmluZyB0aGUgc3RyaW5nIG9yXG4vLyBudWxsIGlmIG5vIG1hdGNoLlxudmFyIHBhcnNlTGlua0Rlc3RpbmF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlcyA9IHRoaXMubWF0Y2gocmVMaW5rRGVzdGluYXRpb25CcmFjZXMpO1xuICAgIGlmIChyZXMgPT09IG51bGwpIHtcbiAgICAgICAgcmVzID0gdGhpcy5tYXRjaChyZUxpbmtEZXN0aW5hdGlvbik7XG4gICAgICAgIGlmIChyZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZVVSSSh1bmVzY2FwZVN0cmluZyhyZXMpKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7ICAvLyBjaG9wIG9mZiBzdXJyb3VuZGluZyA8Li4+OlxuICAgICAgICByZXR1cm4gbm9ybWFsaXplVVJJKHVuZXNjYXBlU3RyaW5nKHJlcy5zdWJzdHIoMSwgcmVzLmxlbmd0aCAtIDIpKSk7XG4gICAgfVxufTtcblxuLy8gQXR0ZW1wdCB0byBwYXJzZSBhIGxpbmsgbGFiZWwsIHJldHVybmluZyBudW1iZXIgb2YgY2hhcmFjdGVycyBwYXJzZWQuXG52YXIgcGFyc2VMaW5rTGFiZWwgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgbSA9IHRoaXMubWF0Y2gocmVMaW5rTGFiZWwpO1xuICAgIGlmIChtID09PSBudWxsIHx8IG0ubGVuZ3RoID4gMTAwMSkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbS5sZW5ndGg7XG4gICAgfVxufTtcblxuLy8gQWRkIG9wZW4gYnJhY2tldCB0byBkZWxpbWl0ZXIgc3RhY2sgYW5kIGFkZCBhIHRleHQgbm9kZSB0byBibG9jaydzIGNoaWxkcmVuLlxudmFyIHBhcnNlT3BlbkJyYWNrZXQgPSBmdW5jdGlvbihibG9jaykge1xuICAgIHZhciBzdGFydHBvcyA9IHRoaXMucG9zO1xuICAgIHRoaXMucG9zICs9IDE7XG5cbiAgICB2YXIgbm9kZSA9IHRleHQoJ1snKTtcbiAgICBibG9jay5hcHBlbmRDaGlsZChub2RlKTtcblxuICAgIC8vIEFkZCBlbnRyeSB0byBzdGFjayBmb3IgdGhpcyBvcGVuZXJcbiAgICB0aGlzLmFkZEJyYWNrZXQobm9kZSwgc3RhcnRwb3MsIGZhbHNlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIElGIG5leHQgY2hhcmFjdGVyIGlzIFssIGFuZCAhIGRlbGltaXRlciB0byBkZWxpbWl0ZXIgc3RhY2sgYW5kXG4vLyBhZGQgYSB0ZXh0IG5vZGUgdG8gYmxvY2sncyBjaGlsZHJlbi4gIE90aGVyd2lzZSBqdXN0IGFkZCBhIHRleHQgbm9kZS5cbnZhciBwYXJzZUJhbmcgPSBmdW5jdGlvbihibG9jaykge1xuICAgIHZhciBzdGFydHBvcyA9IHRoaXMucG9zO1xuICAgIHRoaXMucG9zICs9IDE7XG4gICAgaWYgKHRoaXMucGVlaygpID09PSBDX09QRU5fQlJBQ0tFVCkge1xuICAgICAgICB0aGlzLnBvcyArPSAxO1xuXG4gICAgICAgIHZhciBub2RlID0gdGV4dCgnIVsnKTtcbiAgICAgICAgYmxvY2suYXBwZW5kQ2hpbGQobm9kZSk7XG5cbiAgICAgICAgLy8gQWRkIGVudHJ5IHRvIHN0YWNrIGZvciB0aGlzIG9wZW5lclxuICAgICAgICB0aGlzLmFkZEJyYWNrZXQobm9kZSwgc3RhcnRwb3MgKyAxLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBibG9jay5hcHBlbmRDaGlsZCh0ZXh0KCchJykpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIFRyeSB0byBtYXRjaCBjbG9zZSBicmFja2V0IGFnYWluc3QgYW4gb3BlbmluZyBpbiB0aGUgZGVsaW1pdGVyXG4vLyBzdGFjay4gIEFkZCBlaXRoZXIgYSBsaW5rIG9yIGltYWdlLCBvciBhIHBsYWluIFsgY2hhcmFjdGVyLFxuLy8gdG8gYmxvY2sncyBjaGlsZHJlbi4gIElmIHRoZXJlIGlzIGEgbWF0Y2hpbmcgZGVsaW1pdGVyLFxuLy8gcmVtb3ZlIGl0IGZyb20gdGhlIGRlbGltaXRlciBzdGFjay5cbnZhciBwYXJzZUNsb3NlQnJhY2tldCA9IGZ1bmN0aW9uKGJsb2NrKSB7XG4gICAgdmFyIHN0YXJ0cG9zO1xuICAgIHZhciBpc19pbWFnZTtcbiAgICB2YXIgZGVzdDtcbiAgICB2YXIgdGl0bGU7XG4gICAgdmFyIG1hdGNoZWQgPSBmYWxzZTtcbiAgICB2YXIgcmVmbGFiZWw7XG4gICAgdmFyIG9wZW5lcjtcblxuICAgIHRoaXMucG9zICs9IDE7XG4gICAgc3RhcnRwb3MgPSB0aGlzLnBvcztcblxuICAgIC8vIGdldCBsYXN0IFsgb3IgIVtcbiAgICBvcGVuZXIgPSB0aGlzLmJyYWNrZXRzO1xuXG4gICAgaWYgKG9wZW5lciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBubyBtYXRjaGVkIG9wZW5lciwganVzdCByZXR1cm4gYSBsaXRlcmFsXG4gICAgICAgIGJsb2NrLmFwcGVuZENoaWxkKHRleHQoJ10nKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICghb3BlbmVyLmFjdGl2ZSkge1xuICAgICAgICAvLyBubyBtYXRjaGVkIG9wZW5lciwganVzdCByZXR1cm4gYSBsaXRlcmFsXG4gICAgICAgIGJsb2NrLmFwcGVuZENoaWxkKHRleHQoJ10nKSk7XG4gICAgICAgIC8vIHRha2Ugb3BlbmVyIG9mZiBicmFja2V0cyBzdGFja1xuICAgICAgICB0aGlzLnJlbW92ZUJyYWNrZXQoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgZ290IGhlcmUsIG9wZW4gaXMgYSBwb3RlbnRpYWwgb3BlbmVyXG4gICAgaXNfaW1hZ2UgPSBvcGVuZXIuaW1hZ2U7XG5cbiAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIGxpbmsvaW1hZ2VcblxuICAgIHZhciBzYXZlcG9zID0gdGhpcy5wb3M7XG5cbiAgICAvLyBJbmxpbmUgbGluaz9cbiAgICBpZiAodGhpcy5wZWVrKCkgPT09IENfT1BFTl9QQVJFTikge1xuICAgICAgICB0aGlzLnBvcysrO1xuICAgICAgICBpZiAodGhpcy5zcG5sKCkgJiZcbiAgICAgICAgICAgICgoZGVzdCA9IHRoaXMucGFyc2VMaW5rRGVzdGluYXRpb24oKSkgIT09IG51bGwpICYmXG4gICAgICAgICAgICB0aGlzLnNwbmwoKSAmJlxuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZXJlJ3MgYSBzcGFjZSBiZWZvcmUgdGhlIHRpdGxlOlxuICAgICAgICAgICAgKHJlV2hpdGVzcGFjZUNoYXIudGVzdCh0aGlzLnN1YmplY3QuY2hhckF0KHRoaXMucG9zIC0gMSkpICYmXG4gICAgICAgICAgICAgKHRpdGxlID0gdGhpcy5wYXJzZUxpbmtUaXRsZSgpKSB8fCB0cnVlKSAmJlxuICAgICAgICAgICAgdGhpcy5zcG5sKCkgJiZcbiAgICAgICAgICAgIHRoaXMucGVlaygpID09PSBDX0NMT1NFX1BBUkVOKSB7XG4gICAgICAgICAgICB0aGlzLnBvcyArPSAxO1xuICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBvcyA9IHNhdmVwb3M7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW1hdGNoZWQpIHtcblxuICAgICAgICAvLyBOZXh0LCBzZWUgaWYgdGhlcmUncyBhIGxpbmsgbGFiZWxcbiAgICAgICAgdmFyIGJlZm9yZWxhYmVsID0gdGhpcy5wb3M7XG4gICAgICAgIHZhciBuID0gdGhpcy5wYXJzZUxpbmtMYWJlbCgpO1xuICAgICAgICBpZiAobiA+IDIpIHtcbiAgICAgICAgICAgIHJlZmxhYmVsID0gdGhpcy5zdWJqZWN0LnNsaWNlKGJlZm9yZWxhYmVsLCBiZWZvcmVsYWJlbCArIG4pO1xuICAgICAgICB9IGVsc2UgaWYgKCFvcGVuZXIuYnJhY2tldEFmdGVyKSB7XG4gICAgICAgICAgICAvLyBFbXB0eSBvciBtaXNzaW5nIHNlY29uZCBsYWJlbCBtZWFucyB0byB1c2UgdGhlIGZpcnN0IGxhYmVsIGFzIHRoZSByZWZlcmVuY2UuXG4gICAgICAgICAgICAvLyBUaGUgcmVmZXJlbmNlIG11c3Qgbm90IGNvbnRhaW4gYSBicmFja2V0LiBJZiB3ZSBrbm93IHRoZXJlJ3MgYSBicmFja2V0LCB3ZSBkb24ndCBldmVuIGJvdGhlciBjaGVja2luZyBpdC5cbiAgICAgICAgICAgIHJlZmxhYmVsID0gdGhpcy5zdWJqZWN0LnNsaWNlKG9wZW5lci5pbmRleCwgc3RhcnRwb3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuID09PSAwKSB7XG4gICAgICAgICAgICAvLyBJZiBzaG9ydGN1dCByZWZlcmVuY2UgbGluaywgcmV3aW5kIGJlZm9yZSBzcGFjZXMgd2Ugc2tpcHBlZC5cbiAgICAgICAgICAgIHRoaXMucG9zID0gc2F2ZXBvcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZWZsYWJlbCkge1xuICAgICAgICAgICAgLy8gbG9va3VwIHJhd2xhYmVsIGluIHJlZm1hcFxuICAgICAgICAgICAgdmFyIGxpbmsgPSB0aGlzLnJlZm1hcFtub3JtYWxpemVSZWZlcmVuY2UocmVmbGFiZWwpXTtcbiAgICAgICAgICAgIGlmIChsaW5rKSB7XG4gICAgICAgICAgICAgICAgZGVzdCA9IGxpbmsuZGVzdGluYXRpb247XG4gICAgICAgICAgICAgICAgdGl0bGUgPSBsaW5rLnRpdGxlO1xuICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoZWQpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBuZXcgTm9kZShpc19pbWFnZSA/ICdpbWFnZScgOiAnbGluaycpO1xuICAgICAgICBub2RlLl9kZXN0aW5hdGlvbiA9IGRlc3Q7XG4gICAgICAgIG5vZGUuX3RpdGxlID0gdGl0bGUgfHwgJyc7XG5cbiAgICAgICAgdmFyIHRtcCwgbmV4dDtcbiAgICAgICAgdG1wID0gb3BlbmVyLm5vZGUuX25leHQ7XG4gICAgICAgIHdoaWxlICh0bXApIHtcbiAgICAgICAgICAgIG5leHQgPSB0bXAuX25leHQ7XG4gICAgICAgICAgICB0bXAudW5saW5rKCk7XG4gICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKHRtcCk7XG4gICAgICAgICAgICB0bXAgPSBuZXh0O1xuICAgICAgICB9XG4gICAgICAgIGJsb2NrLmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgICB0aGlzLnByb2Nlc3NFbXBoYXNpcyhvcGVuZXIucHJldmlvdXNEZWxpbWl0ZXIpO1xuICAgICAgICB0aGlzLnJlbW92ZUJyYWNrZXQoKTtcbiAgICAgICAgb3BlbmVyLm5vZGUudW5saW5rKCk7XG5cbiAgICAgICAgLy8gV2UgcmVtb3ZlIHRoaXMgYnJhY2tldCBhbmQgcHJvY2Vzc0VtcGhhc2lzIHdpbGwgcmVtb3ZlIGxhdGVyIGRlbGltaXRlcnMuXG4gICAgICAgIC8vIE5vdywgZm9yIGEgbGluaywgd2UgYWxzbyBkZWFjdGl2YXRlIGVhcmxpZXIgbGluayBvcGVuZXJzLlxuICAgICAgICAvLyAobm8gbGlua3MgaW4gbGlua3MpXG4gICAgICAgIGlmICghaXNfaW1hZ2UpIHtcbiAgICAgICAgICBvcGVuZXIgPSB0aGlzLmJyYWNrZXRzO1xuICAgICAgICAgIHdoaWxlIChvcGVuZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICghb3BlbmVyLmltYWdlKSB7XG4gICAgICAgICAgICAgICAgb3BlbmVyLmFjdGl2ZSA9IGZhbHNlOyAvLyBkZWFjdGl2YXRlIHRoaXMgb3BlbmVyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcGVuZXIgPSBvcGVuZXIucHJldmlvdXM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICB9IGVsc2UgeyAvLyBubyBtYXRjaFxuXG4gICAgICAgIHRoaXMucmVtb3ZlQnJhY2tldCgpOyAgLy8gcmVtb3ZlIHRoaXMgb3BlbmVyIGZyb20gc3RhY2tcbiAgICAgICAgdGhpcy5wb3MgPSBzdGFydHBvcztcbiAgICAgICAgYmxvY2suYXBwZW5kQ2hpbGQodGV4dCgnXScpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG59O1xuXG52YXIgYWRkQnJhY2tldCA9IGZ1bmN0aW9uKG5vZGUsIGluZGV4LCBpbWFnZSkge1xuICAgIGlmICh0aGlzLmJyYWNrZXRzICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuYnJhY2tldHMuYnJhY2tldEFmdGVyID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5icmFja2V0cyA9IHsgbm9kZTogbm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91czogdGhpcy5icmFja2V0cyxcbiAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0RlbGltaXRlcjogdGhpcy5kZWxpbWl0ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICBpbWFnZTogaW1hZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiB0cnVlIH07XG59O1xuXG52YXIgcmVtb3ZlQnJhY2tldCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuYnJhY2tldHMgPSB0aGlzLmJyYWNrZXRzLnByZXZpb3VzO1xufTtcblxuLy8gQXR0ZW1wdCB0byBwYXJzZSBhbiBlbnRpdHkuXG52YXIgcGFyc2VFbnRpdHkgPSBmdW5jdGlvbihibG9jaykge1xuICAgIHZhciBtO1xuICAgIGlmICgobSA9IHRoaXMubWF0Y2gocmVFbnRpdHlIZXJlKSkpIHtcbiAgICAgICAgYmxvY2suYXBwZW5kQ2hpbGQodGV4dChkZWNvZGVIVE1MKG0pKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xuXG4vLyBQYXJzZSBhIHJ1biBvZiBvcmRpbmFyeSBjaGFyYWN0ZXJzLCBvciBhIHNpbmdsZSBjaGFyYWN0ZXIgd2l0aFxuLy8gYSBzcGVjaWFsIG1lYW5pbmcgaW4gbWFya2Rvd24sIGFzIGEgcGxhaW4gc3RyaW5nLlxudmFyIHBhcnNlU3RyaW5nID0gZnVuY3Rpb24oYmxvY2spIHtcbiAgICB2YXIgbTtcbiAgICBpZiAoKG0gPSB0aGlzLm1hdGNoKHJlTWFpbikpKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc21hcnQpIHtcbiAgICAgICAgICAgIGJsb2NrLmFwcGVuZENoaWxkKHRleHQoXG4gICAgICAgICAgICAgICAgbS5yZXBsYWNlKHJlRWxsaXBzZXMsIFwiXFx1MjAyNlwiKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShyZURhc2gsIGZ1bmN0aW9uKGNoYXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5Db3VudCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1Db3VudCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcnMubGVuZ3RoICUgMyA9PT0gMCkgeyAvLyBJZiBkaXZpc2libGUgYnkgMywgdXNlIGFsbCBlbSBkYXNoZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbUNvdW50ID0gY2hhcnMubGVuZ3RoIC8gMztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhcnMubGVuZ3RoICUgMiA9PT0gMCkgeyAvLyBJZiBkaXZpc2libGUgYnkgMiwgdXNlIGFsbCBlbiBkYXNoZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbkNvdW50ID0gY2hhcnMubGVuZ3RoIC8gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhcnMubGVuZ3RoICUgMyA9PT0gMikgeyAvLyBJZiAyIGV4dHJhIGRhc2hlcywgdXNlIGVuIGRhc2ggZm9yIGxhc3QgMjsgZW0gZGFzaGVzIGZvciByZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5Db3VudCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1Db3VudCA9IChjaGFycy5sZW5ndGggLSAyKSAvIDM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBVc2UgZW4gZGFzaGVzIGZvciBsYXN0IDQgaHlwaGVuczsgZW0gZGFzaGVzIGZvciByZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5Db3VudCA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1Db3VudCA9IChjaGFycy5sZW5ndGggLSA0KSAvIDM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcXHUyMDE0XCIucmVwZWF0KGVtQ291bnQpICsgXCJcXHUyMDEzXCIucmVwZWF0KGVuQ291bnQpO1xuICAgICAgICAgICAgICAgICAgICB9KSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYmxvY2suYXBwZW5kQ2hpbGQodGV4dChtKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG5cbi8vIFBhcnNlIGEgbmV3bGluZS4gIElmIGl0IHdhcyBwcmVjZWRlZCBieSB0d28gc3BhY2VzLCByZXR1cm4gYSBoYXJkXG4vLyBsaW5lIGJyZWFrOyBvdGhlcndpc2UgYSBzb2Z0IGxpbmUgYnJlYWsuXG52YXIgcGFyc2VOZXdsaW5lID0gZnVuY3Rpb24oYmxvY2spIHtcbiAgICB0aGlzLnBvcyArPSAxOyAvLyBhc3N1bWUgd2UncmUgYXQgYSBcXG5cbiAgICAvLyBjaGVjayBwcmV2aW91cyBub2RlIGZvciB0cmFpbGluZyBzcGFjZXNcbiAgICB2YXIgbGFzdGMgPSBibG9jay5fbGFzdENoaWxkO1xuICAgIGlmIChsYXN0YyAmJiBsYXN0Yy50eXBlID09PSAndGV4dCcgJiYgbGFzdGMuX2xpdGVyYWxbbGFzdGMuX2xpdGVyYWwubGVuZ3RoIC0gMV0gPT09ICcgJykge1xuICAgICAgICB2YXIgaGFyZGJyZWFrID0gbGFzdGMuX2xpdGVyYWxbbGFzdGMuX2xpdGVyYWwubGVuZ3RoIC0gMl0gPT09ICcgJztcbiAgICAgICAgbGFzdGMuX2xpdGVyYWwgPSBsYXN0Yy5fbGl0ZXJhbC5yZXBsYWNlKHJlRmluYWxTcGFjZSwgJycpO1xuICAgICAgICBibG9jay5hcHBlbmRDaGlsZChuZXcgTm9kZShoYXJkYnJlYWsgPyAnbGluZWJyZWFrJyA6ICdzb2Z0YnJlYWsnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYmxvY2suYXBwZW5kQ2hpbGQobmV3IE5vZGUoJ3NvZnRicmVhaycpKTtcbiAgICB9XG4gICAgdGhpcy5tYXRjaChyZUluaXRpYWxTcGFjZSk7IC8vIGdvYmJsZSBsZWFkaW5nIHNwYWNlcyBpbiBuZXh0IGxpbmVcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIEF0dGVtcHQgdG8gcGFyc2UgYSBsaW5rIHJlZmVyZW5jZSwgbW9kaWZ5aW5nIHJlZm1hcC5cbnZhciBwYXJzZVJlZmVyZW5jZSA9IGZ1bmN0aW9uKHMsIHJlZm1hcCkge1xuICAgIHRoaXMuc3ViamVjdCA9IHM7XG4gICAgdGhpcy5wb3MgPSAwO1xuICAgIHZhciByYXdsYWJlbDtcbiAgICB2YXIgZGVzdDtcbiAgICB2YXIgdGl0bGU7XG4gICAgdmFyIG1hdGNoQ2hhcnM7XG4gICAgdmFyIHN0YXJ0cG9zID0gdGhpcy5wb3M7XG5cbiAgICAvLyBsYWJlbDpcbiAgICBtYXRjaENoYXJzID0gdGhpcy5wYXJzZUxpbmtMYWJlbCgpO1xuICAgIGlmIChtYXRjaENoYXJzID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJhd2xhYmVsID0gdGhpcy5zdWJqZWN0LnN1YnN0cigwLCBtYXRjaENoYXJzKTtcbiAgICB9XG5cbiAgICAvLyBjb2xvbjpcbiAgICBpZiAodGhpcy5wZWVrKCkgPT09IENfQ09MT04pIHtcbiAgICAgICAgdGhpcy5wb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvcyA9IHN0YXJ0cG9zO1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyAgbGluayB1cmxcbiAgICB0aGlzLnNwbmwoKTtcblxuICAgIGRlc3QgPSB0aGlzLnBhcnNlTGlua0Rlc3RpbmF0aW9uKCk7XG4gICAgaWYgKGRlc3QgPT09IG51bGwgfHwgZGVzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5wb3MgPSBzdGFydHBvcztcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgdmFyIGJlZm9yZXRpdGxlID0gdGhpcy5wb3M7XG4gICAgdGhpcy5zcG5sKCk7XG4gICAgdGl0bGUgPSB0aGlzLnBhcnNlTGlua1RpdGxlKCk7XG4gICAgaWYgKHRpdGxlID09PSBudWxsKSB7XG4gICAgICAgIHRpdGxlID0gJyc7XG4gICAgICAgIC8vIHJld2luZCBiZWZvcmUgc3BhY2VzXG4gICAgICAgIHRoaXMucG9zID0gYmVmb3JldGl0bGU7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBzdXJlIHdlJ3JlIGF0IGxpbmUgZW5kOlxuICAgIHZhciBhdExpbmVFbmQgPSB0cnVlO1xuICAgIGlmICh0aGlzLm1hdGNoKHJlU3BhY2VBdEVuZE9mTGluZSkgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKHRpdGxlID09PSAnJykge1xuICAgICAgICAgICAgYXRMaW5lRW5kID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB0aGUgcG90ZW50aWFsIHRpdGxlIHdlIGZvdW5kIGlzIG5vdCBhdCB0aGUgbGluZSBlbmQsXG4gICAgICAgICAgICAvLyBidXQgaXQgY291bGQgc3RpbGwgYmUgYSBsZWdhbCBsaW5rIHJlZmVyZW5jZSBpZiB3ZVxuICAgICAgICAgICAgLy8gZGlzY2FyZCB0aGUgdGl0bGVcbiAgICAgICAgICAgIHRpdGxlID0gJyc7XG4gICAgICAgICAgICAvLyByZXdpbmQgYmVmb3JlIHNwYWNlc1xuICAgICAgICAgICAgdGhpcy5wb3MgPSBiZWZvcmV0aXRsZTtcbiAgICAgICAgICAgIC8vIGFuZCBpbnN0ZWFkIGNoZWNrIGlmIHRoZSBsaW5rIFVSTCBpcyBhdCB0aGUgbGluZSBlbmRcbiAgICAgICAgICAgIGF0TGluZUVuZCA9IHRoaXMubWF0Y2gocmVTcGFjZUF0RW5kT2ZMaW5lKSAhPT0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYXRMaW5lRW5kKSB7XG4gICAgICAgIHRoaXMucG9zID0gc3RhcnRwb3M7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHZhciBub3JtbGFiZWwgPSBub3JtYWxpemVSZWZlcmVuY2UocmF3bGFiZWwpO1xuICAgIGlmIChub3JtbGFiZWwgPT09ICcnKSB7XG4gICAgICAgIC8vIGxhYmVsIG11c3QgY29udGFpbiBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzXG4gICAgICAgIHRoaXMucG9zID0gc3RhcnRwb3M7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGlmICghcmVmbWFwW25vcm1sYWJlbF0pIHtcbiAgICAgICAgcmVmbWFwW25vcm1sYWJlbF0gPSB7IGRlc3RpbmF0aW9uOiBkZXN0LCB0aXRsZTogdGl0bGUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucG9zIC0gc3RhcnRwb3M7XG59O1xuXG4vLyBQYXJzZSB0aGUgbmV4dCBpbmxpbmUgZWxlbWVudCBpbiBzdWJqZWN0LCBhZHZhbmNpbmcgc3ViamVjdCBwb3NpdGlvbi5cbi8vIE9uIHN1Y2Nlc3MsIGFkZCB0aGUgcmVzdWx0IHRvIGJsb2NrJ3MgY2hpbGRyZW4gYW5kIHJldHVybiB0cnVlLlxuLy8gT24gZmFpbHVyZSwgcmV0dXJuIGZhbHNlLlxudmFyIHBhcnNlSW5saW5lID0gZnVuY3Rpb24oYmxvY2spIHtcbiAgICB2YXIgcmVzID0gZmFsc2U7XG4gICAgdmFyIGMgPSB0aGlzLnBlZWsoKTtcbiAgICBpZiAoYyA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzd2l0Y2goYykge1xuICAgIGNhc2UgQ19ORVdMSU5FOlxuICAgICAgICByZXMgPSB0aGlzLnBhcnNlTmV3bGluZShibG9jayk7XG4gICAgICAgIGJyZWFrO1xuICAgIGNhc2UgQ19CQUNLU0xBU0g6XG4gICAgICAgIHJlcyA9IHRoaXMucGFyc2VCYWNrc2xhc2goYmxvY2spO1xuICAgICAgICBicmVhaztcbiAgICBjYXNlIENfQkFDS1RJQ0s6XG4gICAgICAgIHJlcyA9IHRoaXMucGFyc2VCYWNrdGlja3MoYmxvY2spO1xuICAgICAgICBicmVhaztcbiAgICBjYXNlIENfQVNURVJJU0s6XG4gICAgY2FzZSBDX1VOREVSU0NPUkU6XG4gICAgICAgIHJlcyA9IHRoaXMuaGFuZGxlRGVsaW0oYywgYmxvY2spO1xuICAgICAgICBicmVhaztcbiAgICBjYXNlIENfU0lOR0xFUVVPVEU6XG4gICAgY2FzZSBDX0RPVUJMRVFVT1RFOlxuICAgICAgICByZXMgPSB0aGlzLm9wdGlvbnMuc21hcnQgJiYgdGhpcy5oYW5kbGVEZWxpbShjLCBibG9jayk7XG4gICAgICAgIGJyZWFrO1xuICAgIGNhc2UgQ19PUEVOX0JSQUNLRVQ6XG4gICAgICAgIHJlcyA9IHRoaXMucGFyc2VPcGVuQnJhY2tldChibG9jayk7XG4gICAgICAgIGJyZWFrO1xuICAgIGNhc2UgQ19CQU5HOlxuICAgICAgICByZXMgPSB0aGlzLnBhcnNlQmFuZyhibG9jayk7XG4gICAgICAgIGJyZWFrO1xuICAgIGNhc2UgQ19DTE9TRV9CUkFDS0VUOlxuICAgICAgICByZXMgPSB0aGlzLnBhcnNlQ2xvc2VCcmFja2V0KGJsb2NrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgY2FzZSBDX0xFU1NUSEFOOlxuICAgICAgICByZXMgPSB0aGlzLnBhcnNlQXV0b2xpbmsoYmxvY2spIHx8IHRoaXMucGFyc2VIdG1sVGFnKGJsb2NrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgY2FzZSBDX0FNUEVSU0FORDpcbiAgICAgICAgcmVzID0gdGhpcy5wYXJzZUVudGl0eShibG9jayk7XG4gICAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICAgIHJlcyA9IHRoaXMucGFyc2VTdHJpbmcoYmxvY2spO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKCFyZXMpIHtcbiAgICAgICAgdGhpcy5wb3MgKz0gMTtcbiAgICAgICAgYmxvY2suYXBwZW5kQ2hpbGQodGV4dChmcm9tQ29kZVBvaW50KGMpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG4vLyBQYXJzZSBzdHJpbmcgY29udGVudCBpbiBibG9jayBpbnRvIGlubGluZSBjaGlsZHJlbixcbi8vIHVzaW5nIHJlZm1hcCB0byByZXNvbHZlIHJlZmVyZW5jZXMuXG52YXIgcGFyc2VJbmxpbmVzID0gZnVuY3Rpb24oYmxvY2spIHtcbiAgICB0aGlzLnN1YmplY3QgPSBibG9jay5fc3RyaW5nX2NvbnRlbnQudHJpbSgpO1xuICAgIHRoaXMucG9zID0gMDtcbiAgICB0aGlzLmRlbGltaXRlcnMgPSBudWxsO1xuICAgIHRoaXMuYnJhY2tldHMgPSBudWxsO1xuICAgIHdoaWxlICh0aGlzLnBhcnNlSW5saW5lKGJsb2NrKSkge1xuICAgIH1cbiAgICBibG9jay5fc3RyaW5nX2NvbnRlbnQgPSBudWxsOyAvLyBhbGxvdyByYXcgc3RyaW5nIHRvIGJlIGdhcmJhZ2UgY29sbGVjdGVkXG4gICAgdGhpcy5wcm9jZXNzRW1waGFzaXMobnVsbCk7XG59O1xuXG4vLyBUaGUgSW5saW5lUGFyc2VyIG9iamVjdC5cbmZ1bmN0aW9uIElubGluZVBhcnNlcihvcHRpb25zKXtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdWJqZWN0OiAnJyxcbiAgICAgICAgZGVsaW1pdGVyczogbnVsbCwgIC8vIHVzZWQgYnkgaGFuZGxlRGVsaW0gbWV0aG9kXG4gICAgICAgIGJyYWNrZXRzOiBudWxsLFxuICAgICAgICBwb3M6IDAsXG4gICAgICAgIHJlZm1hcDoge30sXG4gICAgICAgIG1hdGNoOiBtYXRjaCxcbiAgICAgICAgcGVlazogcGVlayxcbiAgICAgICAgc3BubDogc3BubCxcbiAgICAgICAgcGFyc2VCYWNrdGlja3M6IHBhcnNlQmFja3RpY2tzLFxuICAgICAgICBwYXJzZUJhY2tzbGFzaDogcGFyc2VCYWNrc2xhc2gsXG4gICAgICAgIHBhcnNlQXV0b2xpbms6IHBhcnNlQXV0b2xpbmssXG4gICAgICAgIHBhcnNlSHRtbFRhZzogcGFyc2VIdG1sVGFnLFxuICAgICAgICBzY2FuRGVsaW1zOiBzY2FuRGVsaW1zLFxuICAgICAgICBoYW5kbGVEZWxpbTogaGFuZGxlRGVsaW0sXG4gICAgICAgIHBhcnNlTGlua1RpdGxlOiBwYXJzZUxpbmtUaXRsZSxcbiAgICAgICAgcGFyc2VMaW5rRGVzdGluYXRpb246IHBhcnNlTGlua0Rlc3RpbmF0aW9uLFxuICAgICAgICBwYXJzZUxpbmtMYWJlbDogcGFyc2VMaW5rTGFiZWwsXG4gICAgICAgIHBhcnNlT3BlbkJyYWNrZXQ6IHBhcnNlT3BlbkJyYWNrZXQsXG4gICAgICAgIHBhcnNlQmFuZzogcGFyc2VCYW5nLFxuICAgICAgICBwYXJzZUNsb3NlQnJhY2tldDogcGFyc2VDbG9zZUJyYWNrZXQsXG4gICAgICAgIGFkZEJyYWNrZXQ6IGFkZEJyYWNrZXQsXG4gICAgICAgIHJlbW92ZUJyYWNrZXQ6IHJlbW92ZUJyYWNrZXQsXG4gICAgICAgIHBhcnNlRW50aXR5OiBwYXJzZUVudGl0eSxcbiAgICAgICAgcGFyc2VTdHJpbmc6IHBhcnNlU3RyaW5nLFxuICAgICAgICBwYXJzZU5ld2xpbmU6IHBhcnNlTmV3bGluZSxcbiAgICAgICAgcGFyc2VSZWZlcmVuY2U6IHBhcnNlUmVmZXJlbmNlLFxuICAgICAgICBwYXJzZUlubGluZTogcGFyc2VJbmxpbmUsXG4gICAgICAgIHByb2Nlc3NFbXBoYXNpczogcHJvY2Vzc0VtcGhhc2lzLFxuICAgICAgICByZW1vdmVEZWxpbWl0ZXI6IHJlbW92ZURlbGltaXRlcixcbiAgICAgICAgb3B0aW9uczogb3B0aW9ucyB8fCB7fSxcbiAgICAgICAgcGFyc2U6IHBhcnNlSW5saW5lc1xuICAgIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gSW5saW5lUGFyc2VyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvbW1vbm1hcmsvbGliL2lubGluZXMuanNcbi8vIG1vZHVsZSBpZCA9IDQyNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 427 */
/***/ function(module, exports) {

    eval("\"use strict\";\n\n/* The bulk of this code derives from https://github.com/dmoscrop/fold-case\nBut in addition to case-folding, we also normalize whitespace.\n\nfold-case is Copyright Mathias Bynens <https://mathiasbynens.be/>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n/*eslint-disable  key-spacing, comma-spacing */\n\nvar regex = /[ \\t\\r\\n]+|[A-Z\\xB5\\xC0-\\xD6\\xD8-\\xDF\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u0149\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017B\\u017D\\u017F\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189-\\u018B\\u018E-\\u0191\\u0193\\u0194\\u0196-\\u0198\\u019C\\u019D\\u019F\\u01A0\\u01A2\\u01A4\\u01A6\\u01A7\\u01A9\\u01AC\\u01AE\\u01AF\\u01B1-\\u01B3\\u01B5\\u01B7\\u01B8\\u01BC\\u01C4\\u01C5\\u01C7\\u01C8\\u01CA\\u01CB\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F0-\\u01F2\\u01F4\\u01F6-\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A\\u023B\\u023D\\u023E\\u0241\\u0243-\\u0246\\u0248\\u024A\\u024C\\u024E\\u0345\\u0370\\u0372\\u0376\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03AB\\u03B0\\u03C2\\u03CF-\\u03D1\\u03D5\\u03D6\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F0\\u03F1\\u03F4\\u03F5\\u03F7\\u03F9\\u03FA\\u03FD-\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0524\\u0526\\u0528\\u052A\\u052C\\u052E\\u0531-\\u0556\\u0587\\u10A0-\\u10C5\\u10C7\\u10CD\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E96-\\u1E9B\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08-\\u1F0F\\u1F18-\\u1F1D\\u1F28-\\u1F2F\\u1F38-\\u1F3F\\u1F48-\\u1F4D\\u1F50\\u1F52\\u1F54\\u1F56\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68-\\u1F6F\\u1F80-\\u1FAF\\u1FB2-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD2\\u1FD3\\u1FD6-\\u1FDB\\u1FE2-\\u1FE4\\u1FE6-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2126\\u212A\\u212B\\u2132\\u2160-\\u216F\\u2183\\u24B6-\\u24CF\\u2C00-\\u2C2E\\u2C60\\u2C62-\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D-\\u2C70\\u2C72\\u2C75\\u2C7E-\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\u2CEB\\u2CED\\u2CF2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA660\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA698\\uA69A\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uA78D\\uA790\\uA792\\uA796\\uA798\\uA79A\\uA79C\\uA79E\\uA7A0\\uA7A2\\uA7A4\\uA7A6\\uA7A8\\uA7AA-\\uA7AD\\uA7B0\\uA7B1\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFF21-\\uFF3A]|\\uD801[\\uDC00-\\uDC27]|\\uD806[\\uDCA0-\\uDCBF]/g;\n\nvar map = {'A':'a','B':'b','C':'c','D':'d','E':'e','F':'f','G':'g','H':'h','I':'i','J':'j','K':'k','L':'l','M':'m','N':'n','O':'o','P':'p','Q':'q','R':'r','S':'s','T':'t','U':'u','V':'v','W':'w','X':'x','Y':'y','Z':'z','\\xB5':'\\u03BC','\\xC0':'\\xE0','\\xC1':'\\xE1','\\xC2':'\\xE2','\\xC3':'\\xE3','\\xC4':'\\xE4','\\xC5':'\\xE5','\\xC6':'\\xE6','\\xC7':'\\xE7','\\xC8':'\\xE8','\\xC9':'\\xE9','\\xCA':'\\xEA','\\xCB':'\\xEB','\\xCC':'\\xEC','\\xCD':'\\xED','\\xCE':'\\xEE','\\xCF':'\\xEF','\\xD0':'\\xF0','\\xD1':'\\xF1','\\xD2':'\\xF2','\\xD3':'\\xF3','\\xD4':'\\xF4','\\xD5':'\\xF5','\\xD6':'\\xF6','\\xD8':'\\xF8','\\xD9':'\\xF9','\\xDA':'\\xFA','\\xDB':'\\xFB','\\xDC':'\\xFC','\\xDD':'\\xFD','\\xDE':'\\xFE','\\u0100':'\\u0101','\\u0102':'\\u0103','\\u0104':'\\u0105','\\u0106':'\\u0107','\\u0108':'\\u0109','\\u010A':'\\u010B','\\u010C':'\\u010D','\\u010E':'\\u010F','\\u0110':'\\u0111','\\u0112':'\\u0113','\\u0114':'\\u0115','\\u0116':'\\u0117','\\u0118':'\\u0119','\\u011A':'\\u011B','\\u011C':'\\u011D','\\u011E':'\\u011F','\\u0120':'\\u0121','\\u0122':'\\u0123','\\u0124':'\\u0125','\\u0126':'\\u0127','\\u0128':'\\u0129','\\u012A':'\\u012B','\\u012C':'\\u012D','\\u012E':'\\u012F','\\u0132':'\\u0133','\\u0134':'\\u0135','\\u0136':'\\u0137','\\u0139':'\\u013A','\\u013B':'\\u013C','\\u013D':'\\u013E','\\u013F':'\\u0140','\\u0141':'\\u0142','\\u0143':'\\u0144','\\u0145':'\\u0146','\\u0147':'\\u0148','\\u014A':'\\u014B','\\u014C':'\\u014D','\\u014E':'\\u014F','\\u0150':'\\u0151','\\u0152':'\\u0153','\\u0154':'\\u0155','\\u0156':'\\u0157','\\u0158':'\\u0159','\\u015A':'\\u015B','\\u015C':'\\u015D','\\u015E':'\\u015F','\\u0160':'\\u0161','\\u0162':'\\u0163','\\u0164':'\\u0165','\\u0166':'\\u0167','\\u0168':'\\u0169','\\u016A':'\\u016B','\\u016C':'\\u016D','\\u016E':'\\u016F','\\u0170':'\\u0171','\\u0172':'\\u0173','\\u0174':'\\u0175','\\u0176':'\\u0177','\\u0178':'\\xFF','\\u0179':'\\u017A','\\u017B':'\\u017C','\\u017D':'\\u017E','\\u017F':'s','\\u0181':'\\u0253','\\u0182':'\\u0183','\\u0184':'\\u0185','\\u0186':'\\u0254','\\u0187':'\\u0188','\\u0189':'\\u0256','\\u018A':'\\u0257','\\u018B':'\\u018C','\\u018E':'\\u01DD','\\u018F':'\\u0259','\\u0190':'\\u025B','\\u0191':'\\u0192','\\u0193':'\\u0260','\\u0194':'\\u0263','\\u0196':'\\u0269','\\u0197':'\\u0268','\\u0198':'\\u0199','\\u019C':'\\u026F','\\u019D':'\\u0272','\\u019F':'\\u0275','\\u01A0':'\\u01A1','\\u01A2':'\\u01A3','\\u01A4':'\\u01A5','\\u01A6':'\\u0280','\\u01A7':'\\u01A8','\\u01A9':'\\u0283','\\u01AC':'\\u01AD','\\u01AE':'\\u0288','\\u01AF':'\\u01B0','\\u01B1':'\\u028A','\\u01B2':'\\u028B','\\u01B3':'\\u01B4','\\u01B5':'\\u01B6','\\u01B7':'\\u0292','\\u01B8':'\\u01B9','\\u01BC':'\\u01BD','\\u01C4':'\\u01C6','\\u01C5':'\\u01C6','\\u01C7':'\\u01C9','\\u01C8':'\\u01C9','\\u01CA':'\\u01CC','\\u01CB':'\\u01CC','\\u01CD':'\\u01CE','\\u01CF':'\\u01D0','\\u01D1':'\\u01D2','\\u01D3':'\\u01D4','\\u01D5':'\\u01D6','\\u01D7':'\\u01D8','\\u01D9':'\\u01DA','\\u01DB':'\\u01DC','\\u01DE':'\\u01DF','\\u01E0':'\\u01E1','\\u01E2':'\\u01E3','\\u01E4':'\\u01E5','\\u01E6':'\\u01E7','\\u01E8':'\\u01E9','\\u01EA':'\\u01EB','\\u01EC':'\\u01ED','\\u01EE':'\\u01EF','\\u01F1':'\\u01F3','\\u01F2':'\\u01F3','\\u01F4':'\\u01F5','\\u01F6':'\\u0195','\\u01F7':'\\u01BF','\\u01F8':'\\u01F9','\\u01FA':'\\u01FB','\\u01FC':'\\u01FD','\\u01FE':'\\u01FF','\\u0200':'\\u0201','\\u0202':'\\u0203','\\u0204':'\\u0205','\\u0206':'\\u0207','\\u0208':'\\u0209','\\u020A':'\\u020B','\\u020C':'\\u020D','\\u020E':'\\u020F','\\u0210':'\\u0211','\\u0212':'\\u0213','\\u0214':'\\u0215','\\u0216':'\\u0217','\\u0218':'\\u0219','\\u021A':'\\u021B','\\u021C':'\\u021D','\\u021E':'\\u021F','\\u0220':'\\u019E','\\u0222':'\\u0223','\\u0224':'\\u0225','\\u0226':'\\u0227','\\u0228':'\\u0229','\\u022A':'\\u022B','\\u022C':'\\u022D','\\u022E':'\\u022F','\\u0230':'\\u0231','\\u0232':'\\u0233','\\u023A':'\\u2C65','\\u023B':'\\u023C','\\u023D':'\\u019A','\\u023E':'\\u2C66','\\u0241':'\\u0242','\\u0243':'\\u0180','\\u0244':'\\u0289','\\u0245':'\\u028C','\\u0246':'\\u0247','\\u0248':'\\u0249','\\u024A':'\\u024B','\\u024C':'\\u024D','\\u024E':'\\u024F','\\u0345':'\\u03B9','\\u0370':'\\u0371','\\u0372':'\\u0373','\\u0376':'\\u0377','\\u037F':'\\u03F3','\\u0386':'\\u03AC','\\u0388':'\\u03AD','\\u0389':'\\u03AE','\\u038A':'\\u03AF','\\u038C':'\\u03CC','\\u038E':'\\u03CD','\\u038F':'\\u03CE','\\u0391':'\\u03B1','\\u0392':'\\u03B2','\\u0393':'\\u03B3','\\u0394':'\\u03B4','\\u0395':'\\u03B5','\\u0396':'\\u03B6','\\u0397':'\\u03B7','\\u0398':'\\u03B8','\\u0399':'\\u03B9','\\u039A':'\\u03BA','\\u039B':'\\u03BB','\\u039C':'\\u03BC','\\u039D':'\\u03BD','\\u039E':'\\u03BE','\\u039F':'\\u03BF','\\u03A0':'\\u03C0','\\u03A1':'\\u03C1','\\u03A3':'\\u03C3','\\u03A4':'\\u03C4','\\u03A5':'\\u03C5','\\u03A6':'\\u03C6','\\u03A7':'\\u03C7','\\u03A8':'\\u03C8','\\u03A9':'\\u03C9','\\u03AA':'\\u03CA','\\u03AB':'\\u03CB','\\u03C2':'\\u03C3','\\u03CF':'\\u03D7','\\u03D0':'\\u03B2','\\u03D1':'\\u03B8','\\u03D5':'\\u03C6','\\u03D6':'\\u03C0','\\u03D8':'\\u03D9','\\u03DA':'\\u03DB','\\u03DC':'\\u03DD','\\u03DE':'\\u03DF','\\u03E0':'\\u03E1','\\u03E2':'\\u03E3','\\u03E4':'\\u03E5','\\u03E6':'\\u03E7','\\u03E8':'\\u03E9','\\u03EA':'\\u03EB','\\u03EC':'\\u03ED','\\u03EE':'\\u03EF','\\u03F0':'\\u03BA','\\u03F1':'\\u03C1','\\u03F4':'\\u03B8','\\u03F5':'\\u03B5','\\u03F7':'\\u03F8','\\u03F9':'\\u03F2','\\u03FA':'\\u03FB','\\u03FD':'\\u037B','\\u03FE':'\\u037C','\\u03FF':'\\u037D','\\u0400':'\\u0450','\\u0401':'\\u0451','\\u0402':'\\u0452','\\u0403':'\\u0453','\\u0404':'\\u0454','\\u0405':'\\u0455','\\u0406':'\\u0456','\\u0407':'\\u0457','\\u0408':'\\u0458','\\u0409':'\\u0459','\\u040A':'\\u045A','\\u040B':'\\u045B','\\u040C':'\\u045C','\\u040D':'\\u045D','\\u040E':'\\u045E','\\u040F':'\\u045F','\\u0410':'\\u0430','\\u0411':'\\u0431','\\u0412':'\\u0432','\\u0413':'\\u0433','\\u0414':'\\u0434','\\u0415':'\\u0435','\\u0416':'\\u0436','\\u0417':'\\u0437','\\u0418':'\\u0438','\\u0419':'\\u0439','\\u041A':'\\u043A','\\u041B':'\\u043B','\\u041C':'\\u043C','\\u041D':'\\u043D','\\u041E':'\\u043E','\\u041F':'\\u043F','\\u0420':'\\u0440','\\u0421':'\\u0441','\\u0422':'\\u0442','\\u0423':'\\u0443','\\u0424':'\\u0444','\\u0425':'\\u0445','\\u0426':'\\u0446','\\u0427':'\\u0447','\\u0428':'\\u0448','\\u0429':'\\u0449','\\u042A':'\\u044A','\\u042B':'\\u044B','\\u042C':'\\u044C','\\u042D':'\\u044D','\\u042E':'\\u044E','\\u042F':'\\u044F','\\u0460':'\\u0461','\\u0462':'\\u0463','\\u0464':'\\u0465','\\u0466':'\\u0467','\\u0468':'\\u0469','\\u046A':'\\u046B','\\u046C':'\\u046D','\\u046E':'\\u046F','\\u0470':'\\u0471','\\u0472':'\\u0473','\\u0474':'\\u0475','\\u0476':'\\u0477','\\u0478':'\\u0479','\\u047A':'\\u047B','\\u047C':'\\u047D','\\u047E':'\\u047F','\\u0480':'\\u0481','\\u048A':'\\u048B','\\u048C':'\\u048D','\\u048E':'\\u048F','\\u0490':'\\u0491','\\u0492':'\\u0493','\\u0494':'\\u0495','\\u0496':'\\u0497','\\u0498':'\\u0499','\\u049A':'\\u049B','\\u049C':'\\u049D','\\u049E':'\\u049F','\\u04A0':'\\u04A1','\\u04A2':'\\u04A3','\\u04A4':'\\u04A5','\\u04A6':'\\u04A7','\\u04A8':'\\u04A9','\\u04AA':'\\u04AB','\\u04AC':'\\u04AD','\\u04AE':'\\u04AF','\\u04B0':'\\u04B1','\\u04B2':'\\u04B3','\\u04B4':'\\u04B5','\\u04B6':'\\u04B7','\\u04B8':'\\u04B9','\\u04BA':'\\u04BB','\\u04BC':'\\u04BD','\\u04BE':'\\u04BF','\\u04C0':'\\u04CF','\\u04C1':'\\u04C2','\\u04C3':'\\u04C4','\\u04C5':'\\u04C6','\\u04C7':'\\u04C8','\\u04C9':'\\u04CA','\\u04CB':'\\u04CC','\\u04CD':'\\u04CE','\\u04D0':'\\u04D1','\\u04D2':'\\u04D3','\\u04D4':'\\u04D5','\\u04D6':'\\u04D7','\\u04D8':'\\u04D9','\\u04DA':'\\u04DB','\\u04DC':'\\u04DD','\\u04DE':'\\u04DF','\\u04E0':'\\u04E1','\\u04E2':'\\u04E3','\\u04E4':'\\u04E5','\\u04E6':'\\u04E7','\\u04E8':'\\u04E9','\\u04EA':'\\u04EB','\\u04EC':'\\u04ED','\\u04EE':'\\u04EF','\\u04F0':'\\u04F1','\\u04F2':'\\u04F3','\\u04F4':'\\u04F5','\\u04F6':'\\u04F7','\\u04F8':'\\u04F9','\\u04FA':'\\u04FB','\\u04FC':'\\u04FD','\\u04FE':'\\u04FF','\\u0500':'\\u0501','\\u0502':'\\u0503','\\u0504':'\\u0505','\\u0506':'\\u0507','\\u0508':'\\u0509','\\u050A':'\\u050B','\\u050C':'\\u050D','\\u050E':'\\u050F','\\u0510':'\\u0511','\\u0512':'\\u0513','\\u0514':'\\u0515','\\u0516':'\\u0517','\\u0518':'\\u0519','\\u051A':'\\u051B','\\u051C':'\\u051D','\\u051E':'\\u051F','\\u0520':'\\u0521','\\u0522':'\\u0523','\\u0524':'\\u0525','\\u0526':'\\u0527','\\u0528':'\\u0529','\\u052A':'\\u052B','\\u052C':'\\u052D','\\u052E':'\\u052F','\\u0531':'\\u0561','\\u0532':'\\u0562','\\u0533':'\\u0563','\\u0534':'\\u0564','\\u0535':'\\u0565','\\u0536':'\\u0566','\\u0537':'\\u0567','\\u0538':'\\u0568','\\u0539':'\\u0569','\\u053A':'\\u056A','\\u053B':'\\u056B','\\u053C':'\\u056C','\\u053D':'\\u056D','\\u053E':'\\u056E','\\u053F':'\\u056F','\\u0540':'\\u0570','\\u0541':'\\u0571','\\u0542':'\\u0572','\\u0543':'\\u0573','\\u0544':'\\u0574','\\u0545':'\\u0575','\\u0546':'\\u0576','\\u0547':'\\u0577','\\u0548':'\\u0578','\\u0549':'\\u0579','\\u054A':'\\u057A','\\u054B':'\\u057B','\\u054C':'\\u057C','\\u054D':'\\u057D','\\u054E':'\\u057E','\\u054F':'\\u057F','\\u0550':'\\u0580','\\u0551':'\\u0581','\\u0552':'\\u0582','\\u0553':'\\u0583','\\u0554':'\\u0584','\\u0555':'\\u0585','\\u0556':'\\u0586','\\u10A0':'\\u2D00','\\u10A1':'\\u2D01','\\u10A2':'\\u2D02','\\u10A3':'\\u2D03','\\u10A4':'\\u2D04','\\u10A5':'\\u2D05','\\u10A6':'\\u2D06','\\u10A7':'\\u2D07','\\u10A8':'\\u2D08','\\u10A9':'\\u2D09','\\u10AA':'\\u2D0A','\\u10AB':'\\u2D0B','\\u10AC':'\\u2D0C','\\u10AD':'\\u2D0D','\\u10AE':'\\u2D0E','\\u10AF':'\\u2D0F','\\u10B0':'\\u2D10','\\u10B1':'\\u2D11','\\u10B2':'\\u2D12','\\u10B3':'\\u2D13','\\u10B4':'\\u2D14','\\u10B5':'\\u2D15','\\u10B6':'\\u2D16','\\u10B7':'\\u2D17','\\u10B8':'\\u2D18','\\u10B9':'\\u2D19','\\u10BA':'\\u2D1A','\\u10BB':'\\u2D1B','\\u10BC':'\\u2D1C','\\u10BD':'\\u2D1D','\\u10BE':'\\u2D1E','\\u10BF':'\\u2D1F','\\u10C0':'\\u2D20','\\u10C1':'\\u2D21','\\u10C2':'\\u2D22','\\u10C3':'\\u2D23','\\u10C4':'\\u2D24','\\u10C5':'\\u2D25','\\u10C7':'\\u2D27','\\u10CD':'\\u2D2D','\\u1E00':'\\u1E01','\\u1E02':'\\u1E03','\\u1E04':'\\u1E05','\\u1E06':'\\u1E07','\\u1E08':'\\u1E09','\\u1E0A':'\\u1E0B','\\u1E0C':'\\u1E0D','\\u1E0E':'\\u1E0F','\\u1E10':'\\u1E11','\\u1E12':'\\u1E13','\\u1E14':'\\u1E15','\\u1E16':'\\u1E17','\\u1E18':'\\u1E19','\\u1E1A':'\\u1E1B','\\u1E1C':'\\u1E1D','\\u1E1E':'\\u1E1F','\\u1E20':'\\u1E21','\\u1E22':'\\u1E23','\\u1E24':'\\u1E25','\\u1E26':'\\u1E27','\\u1E28':'\\u1E29','\\u1E2A':'\\u1E2B','\\u1E2C':'\\u1E2D','\\u1E2E':'\\u1E2F','\\u1E30':'\\u1E31','\\u1E32':'\\u1E33','\\u1E34':'\\u1E35','\\u1E36':'\\u1E37','\\u1E38':'\\u1E39','\\u1E3A':'\\u1E3B','\\u1E3C':'\\u1E3D','\\u1E3E':'\\u1E3F','\\u1E40':'\\u1E41','\\u1E42':'\\u1E43','\\u1E44':'\\u1E45','\\u1E46':'\\u1E47','\\u1E48':'\\u1E49','\\u1E4A':'\\u1E4B','\\u1E4C':'\\u1E4D','\\u1E4E':'\\u1E4F','\\u1E50':'\\u1E51','\\u1E52':'\\u1E53','\\u1E54':'\\u1E55','\\u1E56':'\\u1E57','\\u1E58':'\\u1E59','\\u1E5A':'\\u1E5B','\\u1E5C':'\\u1E5D','\\u1E5E':'\\u1E5F','\\u1E60':'\\u1E61','\\u1E62':'\\u1E63','\\u1E64':'\\u1E65','\\u1E66':'\\u1E67','\\u1E68':'\\u1E69','\\u1E6A':'\\u1E6B','\\u1E6C':'\\u1E6D','\\u1E6E':'\\u1E6F','\\u1E70':'\\u1E71','\\u1E72':'\\u1E73','\\u1E74':'\\u1E75','\\u1E76':'\\u1E77','\\u1E78':'\\u1E79','\\u1E7A':'\\u1E7B','\\u1E7C':'\\u1E7D','\\u1E7E':'\\u1E7F','\\u1E80':'\\u1E81','\\u1E82':'\\u1E83','\\u1E84':'\\u1E85','\\u1E86':'\\u1E87','\\u1E88':'\\u1E89','\\u1E8A':'\\u1E8B','\\u1E8C':'\\u1E8D','\\u1E8E':'\\u1E8F','\\u1E90':'\\u1E91','\\u1E92':'\\u1E93','\\u1E94':'\\u1E95','\\u1E9B':'\\u1E61','\\u1EA0':'\\u1EA1','\\u1EA2':'\\u1EA3','\\u1EA4':'\\u1EA5','\\u1EA6':'\\u1EA7','\\u1EA8':'\\u1EA9','\\u1EAA':'\\u1EAB','\\u1EAC':'\\u1EAD','\\u1EAE':'\\u1EAF','\\u1EB0':'\\u1EB1','\\u1EB2':'\\u1EB3','\\u1EB4':'\\u1EB5','\\u1EB6':'\\u1EB7','\\u1EB8':'\\u1EB9','\\u1EBA':'\\u1EBB','\\u1EBC':'\\u1EBD','\\u1EBE':'\\u1EBF','\\u1EC0':'\\u1EC1','\\u1EC2':'\\u1EC3','\\u1EC4':'\\u1EC5','\\u1EC6':'\\u1EC7','\\u1EC8':'\\u1EC9','\\u1ECA':'\\u1ECB','\\u1ECC':'\\u1ECD','\\u1ECE':'\\u1ECF','\\u1ED0':'\\u1ED1','\\u1ED2':'\\u1ED3','\\u1ED4':'\\u1ED5','\\u1ED6':'\\u1ED7','\\u1ED8':'\\u1ED9','\\u1EDA':'\\u1EDB','\\u1EDC':'\\u1EDD','\\u1EDE':'\\u1EDF','\\u1EE0':'\\u1EE1','\\u1EE2':'\\u1EE3','\\u1EE4':'\\u1EE5','\\u1EE6':'\\u1EE7','\\u1EE8':'\\u1EE9','\\u1EEA':'\\u1EEB','\\u1EEC':'\\u1EED','\\u1EEE':'\\u1EEF','\\u1EF0':'\\u1EF1','\\u1EF2':'\\u1EF3','\\u1EF4':'\\u1EF5','\\u1EF6':'\\u1EF7','\\u1EF8':'\\u1EF9','\\u1EFA':'\\u1EFB','\\u1EFC':'\\u1EFD','\\u1EFE':'\\u1EFF','\\u1F08':'\\u1F00','\\u1F09':'\\u1F01','\\u1F0A':'\\u1F02','\\u1F0B':'\\u1F03','\\u1F0C':'\\u1F04','\\u1F0D':'\\u1F05','\\u1F0E':'\\u1F06','\\u1F0F':'\\u1F07','\\u1F18':'\\u1F10','\\u1F19':'\\u1F11','\\u1F1A':'\\u1F12','\\u1F1B':'\\u1F13','\\u1F1C':'\\u1F14','\\u1F1D':'\\u1F15','\\u1F28':'\\u1F20','\\u1F29':'\\u1F21','\\u1F2A':'\\u1F22','\\u1F2B':'\\u1F23','\\u1F2C':'\\u1F24','\\u1F2D':'\\u1F25','\\u1F2E':'\\u1F26','\\u1F2F':'\\u1F27','\\u1F38':'\\u1F30','\\u1F39':'\\u1F31','\\u1F3A':'\\u1F32','\\u1F3B':'\\u1F33','\\u1F3C':'\\u1F34','\\u1F3D':'\\u1F35','\\u1F3E':'\\u1F36','\\u1F3F':'\\u1F37','\\u1F48':'\\u1F40','\\u1F49':'\\u1F41','\\u1F4A':'\\u1F42','\\u1F4B':'\\u1F43','\\u1F4C':'\\u1F44','\\u1F4D':'\\u1F45','\\u1F59':'\\u1F51','\\u1F5B':'\\u1F53','\\u1F5D':'\\u1F55','\\u1F5F':'\\u1F57','\\u1F68':'\\u1F60','\\u1F69':'\\u1F61','\\u1F6A':'\\u1F62','\\u1F6B':'\\u1F63','\\u1F6C':'\\u1F64','\\u1F6D':'\\u1F65','\\u1F6E':'\\u1F66','\\u1F6F':'\\u1F67','\\u1FB8':'\\u1FB0','\\u1FB9':'\\u1FB1','\\u1FBA':'\\u1F70','\\u1FBB':'\\u1F71','\\u1FBE':'\\u03B9','\\u1FC8':'\\u1F72','\\u1FC9':'\\u1F73','\\u1FCA':'\\u1F74','\\u1FCB':'\\u1F75','\\u1FD8':'\\u1FD0','\\u1FD9':'\\u1FD1','\\u1FDA':'\\u1F76','\\u1FDB':'\\u1F77','\\u1FE8':'\\u1FE0','\\u1FE9':'\\u1FE1','\\u1FEA':'\\u1F7A','\\u1FEB':'\\u1F7B','\\u1FEC':'\\u1FE5','\\u1FF8':'\\u1F78','\\u1FF9':'\\u1F79','\\u1FFA':'\\u1F7C','\\u1FFB':'\\u1F7D','\\u2126':'\\u03C9','\\u212A':'k','\\u212B':'\\xE5','\\u2132':'\\u214E','\\u2160':'\\u2170','\\u2161':'\\u2171','\\u2162':'\\u2172','\\u2163':'\\u2173','\\u2164':'\\u2174','\\u2165':'\\u2175','\\u2166':'\\u2176','\\u2167':'\\u2177','\\u2168':'\\u2178','\\u2169':'\\u2179','\\u216A':'\\u217A','\\u216B':'\\u217B','\\u216C':'\\u217C','\\u216D':'\\u217D','\\u216E':'\\u217E','\\u216F':'\\u217F','\\u2183':'\\u2184','\\u24B6':'\\u24D0','\\u24B7':'\\u24D1','\\u24B8':'\\u24D2','\\u24B9':'\\u24D3','\\u24BA':'\\u24D4','\\u24BB':'\\u24D5','\\u24BC':'\\u24D6','\\u24BD':'\\u24D7','\\u24BE':'\\u24D8','\\u24BF':'\\u24D9','\\u24C0':'\\u24DA','\\u24C1':'\\u24DB','\\u24C2':'\\u24DC','\\u24C3':'\\u24DD','\\u24C4':'\\u24DE','\\u24C5':'\\u24DF','\\u24C6':'\\u24E0','\\u24C7':'\\u24E1','\\u24C8':'\\u24E2','\\u24C9':'\\u24E3','\\u24CA':'\\u24E4','\\u24CB':'\\u24E5','\\u24CC':'\\u24E6','\\u24CD':'\\u24E7','\\u24CE':'\\u24E8','\\u24CF':'\\u24E9','\\u2C00':'\\u2C30','\\u2C01':'\\u2C31','\\u2C02':'\\u2C32','\\u2C03':'\\u2C33','\\u2C04':'\\u2C34','\\u2C05':'\\u2C35','\\u2C06':'\\u2C36','\\u2C07':'\\u2C37','\\u2C08':'\\u2C38','\\u2C09':'\\u2C39','\\u2C0A':'\\u2C3A','\\u2C0B':'\\u2C3B','\\u2C0C':'\\u2C3C','\\u2C0D':'\\u2C3D','\\u2C0E':'\\u2C3E','\\u2C0F':'\\u2C3F','\\u2C10':'\\u2C40','\\u2C11':'\\u2C41','\\u2C12':'\\u2C42','\\u2C13':'\\u2C43','\\u2C14':'\\u2C44','\\u2C15':'\\u2C45','\\u2C16':'\\u2C46','\\u2C17':'\\u2C47','\\u2C18':'\\u2C48','\\u2C19':'\\u2C49','\\u2C1A':'\\u2C4A','\\u2C1B':'\\u2C4B','\\u2C1C':'\\u2C4C','\\u2C1D':'\\u2C4D','\\u2C1E':'\\u2C4E','\\u2C1F':'\\u2C4F','\\u2C20':'\\u2C50','\\u2C21':'\\u2C51','\\u2C22':'\\u2C52','\\u2C23':'\\u2C53','\\u2C24':'\\u2C54','\\u2C25':'\\u2C55','\\u2C26':'\\u2C56','\\u2C27':'\\u2C57','\\u2C28':'\\u2C58','\\u2C29':'\\u2C59','\\u2C2A':'\\u2C5A','\\u2C2B':'\\u2C5B','\\u2C2C':'\\u2C5C','\\u2C2D':'\\u2C5D','\\u2C2E':'\\u2C5E','\\u2C60':'\\u2C61','\\u2C62':'\\u026B','\\u2C63':'\\u1D7D','\\u2C64':'\\u027D','\\u2C67':'\\u2C68','\\u2C69':'\\u2C6A','\\u2C6B':'\\u2C6C','\\u2C6D':'\\u0251','\\u2C6E':'\\u0271','\\u2C6F':'\\u0250','\\u2C70':'\\u0252','\\u2C72':'\\u2C73','\\u2C75':'\\u2C76','\\u2C7E':'\\u023F','\\u2C7F':'\\u0240','\\u2C80':'\\u2C81','\\u2C82':'\\u2C83','\\u2C84':'\\u2C85','\\u2C86':'\\u2C87','\\u2C88':'\\u2C89','\\u2C8A':'\\u2C8B','\\u2C8C':'\\u2C8D','\\u2C8E':'\\u2C8F','\\u2C90':'\\u2C91','\\u2C92':'\\u2C93','\\u2C94':'\\u2C95','\\u2C96':'\\u2C97','\\u2C98':'\\u2C99','\\u2C9A':'\\u2C9B','\\u2C9C':'\\u2C9D','\\u2C9E':'\\u2C9F','\\u2CA0':'\\u2CA1','\\u2CA2':'\\u2CA3','\\u2CA4':'\\u2CA5','\\u2CA6':'\\u2CA7','\\u2CA8':'\\u2CA9','\\u2CAA':'\\u2CAB','\\u2CAC':'\\u2CAD','\\u2CAE':'\\u2CAF','\\u2CB0':'\\u2CB1','\\u2CB2':'\\u2CB3','\\u2CB4':'\\u2CB5','\\u2CB6':'\\u2CB7','\\u2CB8':'\\u2CB9','\\u2CBA':'\\u2CBB','\\u2CBC':'\\u2CBD','\\u2CBE':'\\u2CBF','\\u2CC0':'\\u2CC1','\\u2CC2':'\\u2CC3','\\u2CC4':'\\u2CC5','\\u2CC6':'\\u2CC7','\\u2CC8':'\\u2CC9','\\u2CCA':'\\u2CCB','\\u2CCC':'\\u2CCD','\\u2CCE':'\\u2CCF','\\u2CD0':'\\u2CD1','\\u2CD2':'\\u2CD3','\\u2CD4':'\\u2CD5','\\u2CD6':'\\u2CD7','\\u2CD8':'\\u2CD9','\\u2CDA':'\\u2CDB','\\u2CDC':'\\u2CDD','\\u2CDE':'\\u2CDF','\\u2CE0':'\\u2CE1','\\u2CE2':'\\u2CE3','\\u2CEB':'\\u2CEC','\\u2CED':'\\u2CEE','\\u2CF2':'\\u2CF3','\\uA640':'\\uA641','\\uA642':'\\uA643','\\uA644':'\\uA645','\\uA646':'\\uA647','\\uA648':'\\uA649','\\uA64A':'\\uA64B','\\uA64C':'\\uA64D','\\uA64E':'\\uA64F','\\uA650':'\\uA651','\\uA652':'\\uA653','\\uA654':'\\uA655','\\uA656':'\\uA657','\\uA658':'\\uA659','\\uA65A':'\\uA65B','\\uA65C':'\\uA65D','\\uA65E':'\\uA65F','\\uA660':'\\uA661','\\uA662':'\\uA663','\\uA664':'\\uA665','\\uA666':'\\uA667','\\uA668':'\\uA669','\\uA66A':'\\uA66B','\\uA66C':'\\uA66D','\\uA680':'\\uA681','\\uA682':'\\uA683','\\uA684':'\\uA685','\\uA686':'\\uA687','\\uA688':'\\uA689','\\uA68A':'\\uA68B','\\uA68C':'\\uA68D','\\uA68E':'\\uA68F','\\uA690':'\\uA691','\\uA692':'\\uA693','\\uA694':'\\uA695','\\uA696':'\\uA697','\\uA698':'\\uA699','\\uA69A':'\\uA69B','\\uA722':'\\uA723','\\uA724':'\\uA725','\\uA726':'\\uA727','\\uA728':'\\uA729','\\uA72A':'\\uA72B','\\uA72C':'\\uA72D','\\uA72E':'\\uA72F','\\uA732':'\\uA733','\\uA734':'\\uA735','\\uA736':'\\uA737','\\uA738':'\\uA739','\\uA73A':'\\uA73B','\\uA73C':'\\uA73D','\\uA73E':'\\uA73F','\\uA740':'\\uA741','\\uA742':'\\uA743','\\uA744':'\\uA745','\\uA746':'\\uA747','\\uA748':'\\uA749','\\uA74A':'\\uA74B','\\uA74C':'\\uA74D','\\uA74E':'\\uA74F','\\uA750':'\\uA751','\\uA752':'\\uA753','\\uA754':'\\uA755','\\uA756':'\\uA757','\\uA758':'\\uA759','\\uA75A':'\\uA75B','\\uA75C':'\\uA75D','\\uA75E':'\\uA75F','\\uA760':'\\uA761','\\uA762':'\\uA763','\\uA764':'\\uA765','\\uA766':'\\uA767','\\uA768':'\\uA769','\\uA76A':'\\uA76B','\\uA76C':'\\uA76D','\\uA76E':'\\uA76F','\\uA779':'\\uA77A','\\uA77B':'\\uA77C','\\uA77D':'\\u1D79','\\uA77E':'\\uA77F','\\uA780':'\\uA781','\\uA782':'\\uA783','\\uA784':'\\uA785','\\uA786':'\\uA787','\\uA78B':'\\uA78C','\\uA78D':'\\u0265','\\uA790':'\\uA791','\\uA792':'\\uA793','\\uA796':'\\uA797','\\uA798':'\\uA799','\\uA79A':'\\uA79B','\\uA79C':'\\uA79D','\\uA79E':'\\uA79F','\\uA7A0':'\\uA7A1','\\uA7A2':'\\uA7A3','\\uA7A4':'\\uA7A5','\\uA7A6':'\\uA7A7','\\uA7A8':'\\uA7A9','\\uA7AA':'\\u0266','\\uA7AB':'\\u025C','\\uA7AC':'\\u0261','\\uA7AD':'\\u026C','\\uA7B0':'\\u029E','\\uA7B1':'\\u0287','\\uFF21':'\\uFF41','\\uFF22':'\\uFF42','\\uFF23':'\\uFF43','\\uFF24':'\\uFF44','\\uFF25':'\\uFF45','\\uFF26':'\\uFF46','\\uFF27':'\\uFF47','\\uFF28':'\\uFF48','\\uFF29':'\\uFF49','\\uFF2A':'\\uFF4A','\\uFF2B':'\\uFF4B','\\uFF2C':'\\uFF4C','\\uFF2D':'\\uFF4D','\\uFF2E':'\\uFF4E','\\uFF2F':'\\uFF4F','\\uFF30':'\\uFF50','\\uFF31':'\\uFF51','\\uFF32':'\\uFF52','\\uFF33':'\\uFF53','\\uFF34':'\\uFF54','\\uFF35':'\\uFF55','\\uFF36':'\\uFF56','\\uFF37':'\\uFF57','\\uFF38':'\\uFF58','\\uFF39':'\\uFF59','\\uFF3A':'\\uFF5A','\\uD801\\uDC00':'\\uD801\\uDC28','\\uD801\\uDC01':'\\uD801\\uDC29','\\uD801\\uDC02':'\\uD801\\uDC2A','\\uD801\\uDC03':'\\uD801\\uDC2B','\\uD801\\uDC04':'\\uD801\\uDC2C','\\uD801\\uDC05':'\\uD801\\uDC2D','\\uD801\\uDC06':'\\uD801\\uDC2E','\\uD801\\uDC07':'\\uD801\\uDC2F','\\uD801\\uDC08':'\\uD801\\uDC30','\\uD801\\uDC09':'\\uD801\\uDC31','\\uD801\\uDC0A':'\\uD801\\uDC32','\\uD801\\uDC0B':'\\uD801\\uDC33','\\uD801\\uDC0C':'\\uD801\\uDC34','\\uD801\\uDC0D':'\\uD801\\uDC35','\\uD801\\uDC0E':'\\uD801\\uDC36','\\uD801\\uDC0F':'\\uD801\\uDC37','\\uD801\\uDC10':'\\uD801\\uDC38','\\uD801\\uDC11':'\\uD801\\uDC39','\\uD801\\uDC12':'\\uD801\\uDC3A','\\uD801\\uDC13':'\\uD801\\uDC3B','\\uD801\\uDC14':'\\uD801\\uDC3C','\\uD801\\uDC15':'\\uD801\\uDC3D','\\uD801\\uDC16':'\\uD801\\uDC3E','\\uD801\\uDC17':'\\uD801\\uDC3F','\\uD801\\uDC18':'\\uD801\\uDC40','\\uD801\\uDC19':'\\uD801\\uDC41','\\uD801\\uDC1A':'\\uD801\\uDC42','\\uD801\\uDC1B':'\\uD801\\uDC43','\\uD801\\uDC1C':'\\uD801\\uDC44','\\uD801\\uDC1D':'\\uD801\\uDC45','\\uD801\\uDC1E':'\\uD801\\uDC46','\\uD801\\uDC1F':'\\uD801\\uDC47','\\uD801\\uDC20':'\\uD801\\uDC48','\\uD801\\uDC21':'\\uD801\\uDC49','\\uD801\\uDC22':'\\uD801\\uDC4A','\\uD801\\uDC23':'\\uD801\\uDC4B','\\uD801\\uDC24':'\\uD801\\uDC4C','\\uD801\\uDC25':'\\uD801\\uDC4D','\\uD801\\uDC26':'\\uD801\\uDC4E','\\uD801\\uDC27':'\\uD801\\uDC4F','\\uD806\\uDCA0':'\\uD806\\uDCC0','\\uD806\\uDCA1':'\\uD806\\uDCC1','\\uD806\\uDCA2':'\\uD806\\uDCC2','\\uD806\\uDCA3':'\\uD806\\uDCC3','\\uD806\\uDCA4':'\\uD806\\uDCC4','\\uD806\\uDCA5':'\\uD806\\uDCC5','\\uD806\\uDCA6':'\\uD806\\uDCC6','\\uD806\\uDCA7':'\\uD806\\uDCC7','\\uD806\\uDCA8':'\\uD806\\uDCC8','\\uD806\\uDCA9':'\\uD806\\uDCC9','\\uD806\\uDCAA':'\\uD806\\uDCCA','\\uD806\\uDCAB':'\\uD806\\uDCCB','\\uD806\\uDCAC':'\\uD806\\uDCCC','\\uD806\\uDCAD':'\\uD806\\uDCCD','\\uD806\\uDCAE':'\\uD806\\uDCCE','\\uD806\\uDCAF':'\\uD806\\uDCCF','\\uD806\\uDCB0':'\\uD806\\uDCD0','\\uD806\\uDCB1':'\\uD806\\uDCD1','\\uD806\\uDCB2':'\\uD806\\uDCD2','\\uD806\\uDCB3':'\\uD806\\uDCD3','\\uD806\\uDCB4':'\\uD806\\uDCD4','\\uD806\\uDCB5':'\\uD806\\uDCD5','\\uD806\\uDCB6':'\\uD806\\uDCD6','\\uD806\\uDCB7':'\\uD806\\uDCD7','\\uD806\\uDCB8':'\\uD806\\uDCD8','\\uD806\\uDCB9':'\\uD806\\uDCD9','\\uD806\\uDCBA':'\\uD806\\uDCDA','\\uD806\\uDCBB':'\\uD806\\uDCDB','\\uD806\\uDCBC':'\\uD806\\uDCDC','\\uD806\\uDCBD':'\\uD806\\uDCDD','\\uD806\\uDCBE':'\\uD806\\uDCDE','\\uD806\\uDCBF':'\\uD806\\uDCDF','\\xDF':'ss','\\u0130':'i\\u0307','\\u0149':'\\u02BCn','\\u01F0':'j\\u030C','\\u0390':'\\u03B9\\u0308\\u0301','\\u03B0':'\\u03C5\\u0308\\u0301','\\u0587':'\\u0565\\u0582','\\u1E96':'h\\u0331','\\u1E97':'t\\u0308','\\u1E98':'w\\u030A','\\u1E99':'y\\u030A','\\u1E9A':'a\\u02BE','\\u1E9E':'ss','\\u1F50':'\\u03C5\\u0313','\\u1F52':'\\u03C5\\u0313\\u0300','\\u1F54':'\\u03C5\\u0313\\u0301','\\u1F56':'\\u03C5\\u0313\\u0342','\\u1F80':'\\u1F00\\u03B9','\\u1F81':'\\u1F01\\u03B9','\\u1F82':'\\u1F02\\u03B9','\\u1F83':'\\u1F03\\u03B9','\\u1F84':'\\u1F04\\u03B9','\\u1F85':'\\u1F05\\u03B9','\\u1F86':'\\u1F06\\u03B9','\\u1F87':'\\u1F07\\u03B9','\\u1F88':'\\u1F00\\u03B9','\\u1F89':'\\u1F01\\u03B9','\\u1F8A':'\\u1F02\\u03B9','\\u1F8B':'\\u1F03\\u03B9','\\u1F8C':'\\u1F04\\u03B9','\\u1F8D':'\\u1F05\\u03B9','\\u1F8E':'\\u1F06\\u03B9','\\u1F8F':'\\u1F07\\u03B9','\\u1F90':'\\u1F20\\u03B9','\\u1F91':'\\u1F21\\u03B9','\\u1F92':'\\u1F22\\u03B9','\\u1F93':'\\u1F23\\u03B9','\\u1F94':'\\u1F24\\u03B9','\\u1F95':'\\u1F25\\u03B9','\\u1F96':'\\u1F26\\u03B9','\\u1F97':'\\u1F27\\u03B9','\\u1F98':'\\u1F20\\u03B9','\\u1F99':'\\u1F21\\u03B9','\\u1F9A':'\\u1F22\\u03B9','\\u1F9B':'\\u1F23\\u03B9','\\u1F9C':'\\u1F24\\u03B9','\\u1F9D':'\\u1F25\\u03B9','\\u1F9E':'\\u1F26\\u03B9','\\u1F9F':'\\u1F27\\u03B9','\\u1FA0':'\\u1F60\\u03B9','\\u1FA1':'\\u1F61\\u03B9','\\u1FA2':'\\u1F62\\u03B9','\\u1FA3':'\\u1F63\\u03B9','\\u1FA4':'\\u1F64\\u03B9','\\u1FA5':'\\u1F65\\u03B9','\\u1FA6':'\\u1F66\\u03B9','\\u1FA7':'\\u1F67\\u03B9','\\u1FA8':'\\u1F60\\u03B9','\\u1FA9':'\\u1F61\\u03B9','\\u1FAA':'\\u1F62\\u03B9','\\u1FAB':'\\u1F63\\u03B9','\\u1FAC':'\\u1F64\\u03B9','\\u1FAD':'\\u1F65\\u03B9','\\u1FAE':'\\u1F66\\u03B9','\\u1FAF':'\\u1F67\\u03B9','\\u1FB2':'\\u1F70\\u03B9','\\u1FB3':'\\u03B1\\u03B9','\\u1FB4':'\\u03AC\\u03B9','\\u1FB6':'\\u03B1\\u0342','\\u1FB7':'\\u03B1\\u0342\\u03B9','\\u1FBC':'\\u03B1\\u03B9','\\u1FC2':'\\u1F74\\u03B9','\\u1FC3':'\\u03B7\\u03B9','\\u1FC4':'\\u03AE\\u03B9','\\u1FC6':'\\u03B7\\u0342','\\u1FC7':'\\u03B7\\u0342\\u03B9','\\u1FCC':'\\u03B7\\u03B9','\\u1FD2':'\\u03B9\\u0308\\u0300','\\u1FD3':'\\u03B9\\u0308\\u0301','\\u1FD6':'\\u03B9\\u0342','\\u1FD7':'\\u03B9\\u0308\\u0342','\\u1FE2':'\\u03C5\\u0308\\u0300','\\u1FE3':'\\u03C5\\u0308\\u0301','\\u1FE4':'\\u03C1\\u0313','\\u1FE6':'\\u03C5\\u0342','\\u1FE7':'\\u03C5\\u0308\\u0342','\\u1FF2':'\\u1F7C\\u03B9','\\u1FF3':'\\u03C9\\u03B9','\\u1FF4':'\\u03CE\\u03B9','\\u1FF6':'\\u03C9\\u0342','\\u1FF7':'\\u03C9\\u0342\\u03B9','\\u1FFC':'\\u03C9\\u03B9','\\uFB00':'ff','\\uFB01':'fi','\\uFB02':'fl','\\uFB03':'ffi','\\uFB04':'ffl','\\uFB05':'st','\\uFB06':'st','\\uFB13':'\\u0574\\u0576','\\uFB14':'\\u0574\\u0565','\\uFB15':'\\u0574\\u056B','\\uFB16':'\\u057E\\u0576','\\uFB17':'\\u0574\\u056D'};\n\n// Normalize reference label: collapse internal whitespace\n// to single space, remove leading/trailing whitespace, case fold.\nmodule.exports = function(string) {\n    return string.slice(1, string.length - 1).trim().replace(regex, function($0) {\n        // Note: there is no need to check `hasOwnProperty($0)` here.\n        // If character not found in lookup table, it must be whitespace.\n        return map[$0] || ' ';\n    });\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDI3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9jb21tb25tYXJrL2xpYi9ub3JtYWxpemUtcmVmZXJlbmNlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4vKiBUaGUgYnVsayBvZiB0aGlzIGNvZGUgZGVyaXZlcyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9kbW9zY3JvcC9mb2xkLWNhc2VcbkJ1dCBpbiBhZGRpdGlvbiB0byBjYXNlLWZvbGRpbmcsIHdlIGFsc28gbm9ybWFsaXplIHdoaXRlc3BhY2UuXG5cbmZvbGQtY2FzZSBpcyBDb3B5cmlnaHQgTWF0aGlhcyBCeW5lbnMgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS8+XG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZ1xuYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG5cIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbndpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbmRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0b1xucGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvXG50aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG5pbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCxcbkVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkRcbk5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkVcbkxJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT05cbk9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTlxuV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4qL1xuXG4vKmVzbGludC1kaXNhYmxlICBrZXktc3BhY2luZywgY29tbWEtc3BhY2luZyAqL1xuXG52YXIgcmVnZXggPSAvWyBcXHRcXHJcXG5dK3xbQS1aXFx4QjVcXHhDMC1cXHhENlxceEQ4LVxceERGXFx1MDEwMFxcdTAxMDJcXHUwMTA0XFx1MDEwNlxcdTAxMDhcXHUwMTBBXFx1MDEwQ1xcdTAxMEVcXHUwMTEwXFx1MDExMlxcdTAxMTRcXHUwMTE2XFx1MDExOFxcdTAxMUFcXHUwMTFDXFx1MDExRVxcdTAxMjBcXHUwMTIyXFx1MDEyNFxcdTAxMjZcXHUwMTI4XFx1MDEyQVxcdTAxMkNcXHUwMTJFXFx1MDEzMFxcdTAxMzJcXHUwMTM0XFx1MDEzNlxcdTAxMzlcXHUwMTNCXFx1MDEzRFxcdTAxM0ZcXHUwMTQxXFx1MDE0M1xcdTAxNDVcXHUwMTQ3XFx1MDE0OVxcdTAxNEFcXHUwMTRDXFx1MDE0RVxcdTAxNTBcXHUwMTUyXFx1MDE1NFxcdTAxNTZcXHUwMTU4XFx1MDE1QVxcdTAxNUNcXHUwMTVFXFx1MDE2MFxcdTAxNjJcXHUwMTY0XFx1MDE2NlxcdTAxNjhcXHUwMTZBXFx1MDE2Q1xcdTAxNkVcXHUwMTcwXFx1MDE3MlxcdTAxNzRcXHUwMTc2XFx1MDE3OFxcdTAxNzlcXHUwMTdCXFx1MDE3RFxcdTAxN0ZcXHUwMTgxXFx1MDE4MlxcdTAxODRcXHUwMTg2XFx1MDE4N1xcdTAxODktXFx1MDE4QlxcdTAxOEUtXFx1MDE5MVxcdTAxOTNcXHUwMTk0XFx1MDE5Ni1cXHUwMTk4XFx1MDE5Q1xcdTAxOURcXHUwMTlGXFx1MDFBMFxcdTAxQTJcXHUwMUE0XFx1MDFBNlxcdTAxQTdcXHUwMUE5XFx1MDFBQ1xcdTAxQUVcXHUwMUFGXFx1MDFCMS1cXHUwMUIzXFx1MDFCNVxcdTAxQjdcXHUwMUI4XFx1MDFCQ1xcdTAxQzRcXHUwMUM1XFx1MDFDN1xcdTAxQzhcXHUwMUNBXFx1MDFDQlxcdTAxQ0RcXHUwMUNGXFx1MDFEMVxcdTAxRDNcXHUwMUQ1XFx1MDFEN1xcdTAxRDlcXHUwMURCXFx1MDFERVxcdTAxRTBcXHUwMUUyXFx1MDFFNFxcdTAxRTZcXHUwMUU4XFx1MDFFQVxcdTAxRUNcXHUwMUVFXFx1MDFGMC1cXHUwMUYyXFx1MDFGNFxcdTAxRjYtXFx1MDFGOFxcdTAxRkFcXHUwMUZDXFx1MDFGRVxcdTAyMDBcXHUwMjAyXFx1MDIwNFxcdTAyMDZcXHUwMjA4XFx1MDIwQVxcdTAyMENcXHUwMjBFXFx1MDIxMFxcdTAyMTJcXHUwMjE0XFx1MDIxNlxcdTAyMThcXHUwMjFBXFx1MDIxQ1xcdTAyMUVcXHUwMjIwXFx1MDIyMlxcdTAyMjRcXHUwMjI2XFx1MDIyOFxcdTAyMkFcXHUwMjJDXFx1MDIyRVxcdTAyMzBcXHUwMjMyXFx1MDIzQVxcdTAyM0JcXHUwMjNEXFx1MDIzRVxcdTAyNDFcXHUwMjQzLVxcdTAyNDZcXHUwMjQ4XFx1MDI0QVxcdTAyNENcXHUwMjRFXFx1MDM0NVxcdTAzNzBcXHUwMzcyXFx1MDM3NlxcdTAzN0ZcXHUwMzg2XFx1MDM4OC1cXHUwMzhBXFx1MDM4Q1xcdTAzOEUtXFx1MDNBMVxcdTAzQTMtXFx1MDNBQlxcdTAzQjBcXHUwM0MyXFx1MDNDRi1cXHUwM0QxXFx1MDNENVxcdTAzRDZcXHUwM0Q4XFx1MDNEQVxcdTAzRENcXHUwM0RFXFx1MDNFMFxcdTAzRTJcXHUwM0U0XFx1MDNFNlxcdTAzRThcXHUwM0VBXFx1MDNFQ1xcdTAzRUVcXHUwM0YwXFx1MDNGMVxcdTAzRjRcXHUwM0Y1XFx1MDNGN1xcdTAzRjlcXHUwM0ZBXFx1MDNGRC1cXHUwNDJGXFx1MDQ2MFxcdTA0NjJcXHUwNDY0XFx1MDQ2NlxcdTA0NjhcXHUwNDZBXFx1MDQ2Q1xcdTA0NkVcXHUwNDcwXFx1MDQ3MlxcdTA0NzRcXHUwNDc2XFx1MDQ3OFxcdTA0N0FcXHUwNDdDXFx1MDQ3RVxcdTA0ODBcXHUwNDhBXFx1MDQ4Q1xcdTA0OEVcXHUwNDkwXFx1MDQ5MlxcdTA0OTRcXHUwNDk2XFx1MDQ5OFxcdTA0OUFcXHUwNDlDXFx1MDQ5RVxcdTA0QTBcXHUwNEEyXFx1MDRBNFxcdTA0QTZcXHUwNEE4XFx1MDRBQVxcdTA0QUNcXHUwNEFFXFx1MDRCMFxcdTA0QjJcXHUwNEI0XFx1MDRCNlxcdTA0QjhcXHUwNEJBXFx1MDRCQ1xcdTA0QkVcXHUwNEMwXFx1MDRDMVxcdTA0QzNcXHUwNEM1XFx1MDRDN1xcdTA0QzlcXHUwNENCXFx1MDRDRFxcdTA0RDBcXHUwNEQyXFx1MDRENFxcdTA0RDZcXHUwNEQ4XFx1MDREQVxcdTA0RENcXHUwNERFXFx1MDRFMFxcdTA0RTJcXHUwNEU0XFx1MDRFNlxcdTA0RThcXHUwNEVBXFx1MDRFQ1xcdTA0RUVcXHUwNEYwXFx1MDRGMlxcdTA0RjRcXHUwNEY2XFx1MDRGOFxcdTA0RkFcXHUwNEZDXFx1MDRGRVxcdTA1MDBcXHUwNTAyXFx1MDUwNFxcdTA1MDZcXHUwNTA4XFx1MDUwQVxcdTA1MENcXHUwNTBFXFx1MDUxMFxcdTA1MTJcXHUwNTE0XFx1MDUxNlxcdTA1MThcXHUwNTFBXFx1MDUxQ1xcdTA1MUVcXHUwNTIwXFx1MDUyMlxcdTA1MjRcXHUwNTI2XFx1MDUyOFxcdTA1MkFcXHUwNTJDXFx1MDUyRVxcdTA1MzEtXFx1MDU1NlxcdTA1ODdcXHUxMEEwLVxcdTEwQzVcXHUxMEM3XFx1MTBDRFxcdTFFMDBcXHUxRTAyXFx1MUUwNFxcdTFFMDZcXHUxRTA4XFx1MUUwQVxcdTFFMENcXHUxRTBFXFx1MUUxMFxcdTFFMTJcXHUxRTE0XFx1MUUxNlxcdTFFMThcXHUxRTFBXFx1MUUxQ1xcdTFFMUVcXHUxRTIwXFx1MUUyMlxcdTFFMjRcXHUxRTI2XFx1MUUyOFxcdTFFMkFcXHUxRTJDXFx1MUUyRVxcdTFFMzBcXHUxRTMyXFx1MUUzNFxcdTFFMzZcXHUxRTM4XFx1MUUzQVxcdTFFM0NcXHUxRTNFXFx1MUU0MFxcdTFFNDJcXHUxRTQ0XFx1MUU0NlxcdTFFNDhcXHUxRTRBXFx1MUU0Q1xcdTFFNEVcXHUxRTUwXFx1MUU1MlxcdTFFNTRcXHUxRTU2XFx1MUU1OFxcdTFFNUFcXHUxRTVDXFx1MUU1RVxcdTFFNjBcXHUxRTYyXFx1MUU2NFxcdTFFNjZcXHUxRTY4XFx1MUU2QVxcdTFFNkNcXHUxRTZFXFx1MUU3MFxcdTFFNzJcXHUxRTc0XFx1MUU3NlxcdTFFNzhcXHUxRTdBXFx1MUU3Q1xcdTFFN0VcXHUxRTgwXFx1MUU4MlxcdTFFODRcXHUxRTg2XFx1MUU4OFxcdTFFOEFcXHUxRThDXFx1MUU4RVxcdTFFOTBcXHUxRTkyXFx1MUU5NFxcdTFFOTYtXFx1MUU5QlxcdTFFOUVcXHUxRUEwXFx1MUVBMlxcdTFFQTRcXHUxRUE2XFx1MUVBOFxcdTFFQUFcXHUxRUFDXFx1MUVBRVxcdTFFQjBcXHUxRUIyXFx1MUVCNFxcdTFFQjZcXHUxRUI4XFx1MUVCQVxcdTFFQkNcXHUxRUJFXFx1MUVDMFxcdTFFQzJcXHUxRUM0XFx1MUVDNlxcdTFFQzhcXHUxRUNBXFx1MUVDQ1xcdTFFQ0VcXHUxRUQwXFx1MUVEMlxcdTFFRDRcXHUxRUQ2XFx1MUVEOFxcdTFFREFcXHUxRURDXFx1MUVERVxcdTFFRTBcXHUxRUUyXFx1MUVFNFxcdTFFRTZcXHUxRUU4XFx1MUVFQVxcdTFFRUNcXHUxRUVFXFx1MUVGMFxcdTFFRjJcXHUxRUY0XFx1MUVGNlxcdTFFRjhcXHUxRUZBXFx1MUVGQ1xcdTFFRkVcXHUxRjA4LVxcdTFGMEZcXHUxRjE4LVxcdTFGMURcXHUxRjI4LVxcdTFGMkZcXHUxRjM4LVxcdTFGM0ZcXHUxRjQ4LVxcdTFGNERcXHUxRjUwXFx1MUY1MlxcdTFGNTRcXHUxRjU2XFx1MUY1OVxcdTFGNUJcXHUxRjVEXFx1MUY1RlxcdTFGNjgtXFx1MUY2RlxcdTFGODAtXFx1MUZBRlxcdTFGQjItXFx1MUZCNFxcdTFGQjYtXFx1MUZCQ1xcdTFGQkVcXHUxRkMyLVxcdTFGQzRcXHUxRkM2LVxcdTFGQ0NcXHUxRkQyXFx1MUZEM1xcdTFGRDYtXFx1MUZEQlxcdTFGRTItXFx1MUZFNFxcdTFGRTYtXFx1MUZFQ1xcdTFGRjItXFx1MUZGNFxcdTFGRjYtXFx1MUZGQ1xcdTIxMjZcXHUyMTJBXFx1MjEyQlxcdTIxMzJcXHUyMTYwLVxcdTIxNkZcXHUyMTgzXFx1MjRCNi1cXHUyNENGXFx1MkMwMC1cXHUyQzJFXFx1MkM2MFxcdTJDNjItXFx1MkM2NFxcdTJDNjdcXHUyQzY5XFx1MkM2QlxcdTJDNkQtXFx1MkM3MFxcdTJDNzJcXHUyQzc1XFx1MkM3RS1cXHUyQzgwXFx1MkM4MlxcdTJDODRcXHUyQzg2XFx1MkM4OFxcdTJDOEFcXHUyQzhDXFx1MkM4RVxcdTJDOTBcXHUyQzkyXFx1MkM5NFxcdTJDOTZcXHUyQzk4XFx1MkM5QVxcdTJDOUNcXHUyQzlFXFx1MkNBMFxcdTJDQTJcXHUyQ0E0XFx1MkNBNlxcdTJDQThcXHUyQ0FBXFx1MkNBQ1xcdTJDQUVcXHUyQ0IwXFx1MkNCMlxcdTJDQjRcXHUyQ0I2XFx1MkNCOFxcdTJDQkFcXHUyQ0JDXFx1MkNCRVxcdTJDQzBcXHUyQ0MyXFx1MkNDNFxcdTJDQzZcXHUyQ0M4XFx1MkNDQVxcdTJDQ0NcXHUyQ0NFXFx1MkNEMFxcdTJDRDJcXHUyQ0Q0XFx1MkNENlxcdTJDRDhcXHUyQ0RBXFx1MkNEQ1xcdTJDREVcXHUyQ0UwXFx1MkNFMlxcdTJDRUJcXHUyQ0VEXFx1MkNGMlxcdUE2NDBcXHVBNjQyXFx1QTY0NFxcdUE2NDZcXHVBNjQ4XFx1QTY0QVxcdUE2NENcXHVBNjRFXFx1QTY1MFxcdUE2NTJcXHVBNjU0XFx1QTY1NlxcdUE2NThcXHVBNjVBXFx1QTY1Q1xcdUE2NUVcXHVBNjYwXFx1QTY2MlxcdUE2NjRcXHVBNjY2XFx1QTY2OFxcdUE2NkFcXHVBNjZDXFx1QTY4MFxcdUE2ODJcXHVBNjg0XFx1QTY4NlxcdUE2ODhcXHVBNjhBXFx1QTY4Q1xcdUE2OEVcXHVBNjkwXFx1QTY5MlxcdUE2OTRcXHVBNjk2XFx1QTY5OFxcdUE2OUFcXHVBNzIyXFx1QTcyNFxcdUE3MjZcXHVBNzI4XFx1QTcyQVxcdUE3MkNcXHVBNzJFXFx1QTczMlxcdUE3MzRcXHVBNzM2XFx1QTczOFxcdUE3M0FcXHVBNzNDXFx1QTczRVxcdUE3NDBcXHVBNzQyXFx1QTc0NFxcdUE3NDZcXHVBNzQ4XFx1QTc0QVxcdUE3NENcXHVBNzRFXFx1QTc1MFxcdUE3NTJcXHVBNzU0XFx1QTc1NlxcdUE3NThcXHVBNzVBXFx1QTc1Q1xcdUE3NUVcXHVBNzYwXFx1QTc2MlxcdUE3NjRcXHVBNzY2XFx1QTc2OFxcdUE3NkFcXHVBNzZDXFx1QTc2RVxcdUE3NzlcXHVBNzdCXFx1QTc3RFxcdUE3N0VcXHVBNzgwXFx1QTc4MlxcdUE3ODRcXHVBNzg2XFx1QTc4QlxcdUE3OERcXHVBNzkwXFx1QTc5MlxcdUE3OTZcXHVBNzk4XFx1QTc5QVxcdUE3OUNcXHVBNzlFXFx1QTdBMFxcdUE3QTJcXHVBN0E0XFx1QTdBNlxcdUE3QThcXHVBN0FBLVxcdUE3QURcXHVBN0IwXFx1QTdCMVxcdUZCMDAtXFx1RkIwNlxcdUZCMTMtXFx1RkIxN1xcdUZGMjEtXFx1RkYzQV18XFx1RDgwMVtcXHVEQzAwLVxcdURDMjddfFxcdUQ4MDZbXFx1RENBMC1cXHVEQ0JGXS9nO1xuXG52YXIgbWFwID0geydBJzonYScsJ0InOidiJywnQyc6J2MnLCdEJzonZCcsJ0UnOidlJywnRic6J2YnLCdHJzonZycsJ0gnOidoJywnSSc6J2knLCdKJzonaicsJ0snOidrJywnTCc6J2wnLCdNJzonbScsJ04nOiduJywnTyc6J28nLCdQJzoncCcsJ1EnOidxJywnUic6J3InLCdTJzoncycsJ1QnOid0JywnVSc6J3UnLCdWJzondicsJ1cnOid3JywnWCc6J3gnLCdZJzoneScsJ1onOid6JywnXFx4QjUnOidcXHUwM0JDJywnXFx4QzAnOidcXHhFMCcsJ1xceEMxJzonXFx4RTEnLCdcXHhDMic6J1xceEUyJywnXFx4QzMnOidcXHhFMycsJ1xceEM0JzonXFx4RTQnLCdcXHhDNSc6J1xceEU1JywnXFx4QzYnOidcXHhFNicsJ1xceEM3JzonXFx4RTcnLCdcXHhDOCc6J1xceEU4JywnXFx4QzknOidcXHhFOScsJ1xceENBJzonXFx4RUEnLCdcXHhDQic6J1xceEVCJywnXFx4Q0MnOidcXHhFQycsJ1xceENEJzonXFx4RUQnLCdcXHhDRSc6J1xceEVFJywnXFx4Q0YnOidcXHhFRicsJ1xceEQwJzonXFx4RjAnLCdcXHhEMSc6J1xceEYxJywnXFx4RDInOidcXHhGMicsJ1xceEQzJzonXFx4RjMnLCdcXHhENCc6J1xceEY0JywnXFx4RDUnOidcXHhGNScsJ1xceEQ2JzonXFx4RjYnLCdcXHhEOCc6J1xceEY4JywnXFx4RDknOidcXHhGOScsJ1xceERBJzonXFx4RkEnLCdcXHhEQic6J1xceEZCJywnXFx4REMnOidcXHhGQycsJ1xceEREJzonXFx4RkQnLCdcXHhERSc6J1xceEZFJywnXFx1MDEwMCc6J1xcdTAxMDEnLCdcXHUwMTAyJzonXFx1MDEwMycsJ1xcdTAxMDQnOidcXHUwMTA1JywnXFx1MDEwNic6J1xcdTAxMDcnLCdcXHUwMTA4JzonXFx1MDEwOScsJ1xcdTAxMEEnOidcXHUwMTBCJywnXFx1MDEwQyc6J1xcdTAxMEQnLCdcXHUwMTBFJzonXFx1MDEwRicsJ1xcdTAxMTAnOidcXHUwMTExJywnXFx1MDExMic6J1xcdTAxMTMnLCdcXHUwMTE0JzonXFx1MDExNScsJ1xcdTAxMTYnOidcXHUwMTE3JywnXFx1MDExOCc6J1xcdTAxMTknLCdcXHUwMTFBJzonXFx1MDExQicsJ1xcdTAxMUMnOidcXHUwMTFEJywnXFx1MDExRSc6J1xcdTAxMUYnLCdcXHUwMTIwJzonXFx1MDEyMScsJ1xcdTAxMjInOidcXHUwMTIzJywnXFx1MDEyNCc6J1xcdTAxMjUnLCdcXHUwMTI2JzonXFx1MDEyNycsJ1xcdTAxMjgnOidcXHUwMTI5JywnXFx1MDEyQSc6J1xcdTAxMkInLCdcXHUwMTJDJzonXFx1MDEyRCcsJ1xcdTAxMkUnOidcXHUwMTJGJywnXFx1MDEzMic6J1xcdTAxMzMnLCdcXHUwMTM0JzonXFx1MDEzNScsJ1xcdTAxMzYnOidcXHUwMTM3JywnXFx1MDEzOSc6J1xcdTAxM0EnLCdcXHUwMTNCJzonXFx1MDEzQycsJ1xcdTAxM0QnOidcXHUwMTNFJywnXFx1MDEzRic6J1xcdTAxNDAnLCdcXHUwMTQxJzonXFx1MDE0MicsJ1xcdTAxNDMnOidcXHUwMTQ0JywnXFx1MDE0NSc6J1xcdTAxNDYnLCdcXHUwMTQ3JzonXFx1MDE0OCcsJ1xcdTAxNEEnOidcXHUwMTRCJywnXFx1MDE0Qyc6J1xcdTAxNEQnLCdcXHUwMTRFJzonXFx1MDE0RicsJ1xcdTAxNTAnOidcXHUwMTUxJywnXFx1MDE1Mic6J1xcdTAxNTMnLCdcXHUwMTU0JzonXFx1MDE1NScsJ1xcdTAxNTYnOidcXHUwMTU3JywnXFx1MDE1OCc6J1xcdTAxNTknLCdcXHUwMTVBJzonXFx1MDE1QicsJ1xcdTAxNUMnOidcXHUwMTVEJywnXFx1MDE1RSc6J1xcdTAxNUYnLCdcXHUwMTYwJzonXFx1MDE2MScsJ1xcdTAxNjInOidcXHUwMTYzJywnXFx1MDE2NCc6J1xcdTAxNjUnLCdcXHUwMTY2JzonXFx1MDE2NycsJ1xcdTAxNjgnOidcXHUwMTY5JywnXFx1MDE2QSc6J1xcdTAxNkInLCdcXHUwMTZDJzonXFx1MDE2RCcsJ1xcdTAxNkUnOidcXHUwMTZGJywnXFx1MDE3MCc6J1xcdTAxNzEnLCdcXHUwMTcyJzonXFx1MDE3MycsJ1xcdTAxNzQnOidcXHUwMTc1JywnXFx1MDE3Nic6J1xcdTAxNzcnLCdcXHUwMTc4JzonXFx4RkYnLCdcXHUwMTc5JzonXFx1MDE3QScsJ1xcdTAxN0InOidcXHUwMTdDJywnXFx1MDE3RCc6J1xcdTAxN0UnLCdcXHUwMTdGJzoncycsJ1xcdTAxODEnOidcXHUwMjUzJywnXFx1MDE4Mic6J1xcdTAxODMnLCdcXHUwMTg0JzonXFx1MDE4NScsJ1xcdTAxODYnOidcXHUwMjU0JywnXFx1MDE4Nyc6J1xcdTAxODgnLCdcXHUwMTg5JzonXFx1MDI1NicsJ1xcdTAxOEEnOidcXHUwMjU3JywnXFx1MDE4Qic6J1xcdTAxOEMnLCdcXHUwMThFJzonXFx1MDFERCcsJ1xcdTAxOEYnOidcXHUwMjU5JywnXFx1MDE5MCc6J1xcdTAyNUInLCdcXHUwMTkxJzonXFx1MDE5MicsJ1xcdTAxOTMnOidcXHUwMjYwJywnXFx1MDE5NCc6J1xcdTAyNjMnLCdcXHUwMTk2JzonXFx1MDI2OScsJ1xcdTAxOTcnOidcXHUwMjY4JywnXFx1MDE5OCc6J1xcdTAxOTknLCdcXHUwMTlDJzonXFx1MDI2RicsJ1xcdTAxOUQnOidcXHUwMjcyJywnXFx1MDE5Ric6J1xcdTAyNzUnLCdcXHUwMUEwJzonXFx1MDFBMScsJ1xcdTAxQTInOidcXHUwMUEzJywnXFx1MDFBNCc6J1xcdTAxQTUnLCdcXHUwMUE2JzonXFx1MDI4MCcsJ1xcdTAxQTcnOidcXHUwMUE4JywnXFx1MDFBOSc6J1xcdTAyODMnLCdcXHUwMUFDJzonXFx1MDFBRCcsJ1xcdTAxQUUnOidcXHUwMjg4JywnXFx1MDFBRic6J1xcdTAxQjAnLCdcXHUwMUIxJzonXFx1MDI4QScsJ1xcdTAxQjInOidcXHUwMjhCJywnXFx1MDFCMyc6J1xcdTAxQjQnLCdcXHUwMUI1JzonXFx1MDFCNicsJ1xcdTAxQjcnOidcXHUwMjkyJywnXFx1MDFCOCc6J1xcdTAxQjknLCdcXHUwMUJDJzonXFx1MDFCRCcsJ1xcdTAxQzQnOidcXHUwMUM2JywnXFx1MDFDNSc6J1xcdTAxQzYnLCdcXHUwMUM3JzonXFx1MDFDOScsJ1xcdTAxQzgnOidcXHUwMUM5JywnXFx1MDFDQSc6J1xcdTAxQ0MnLCdcXHUwMUNCJzonXFx1MDFDQycsJ1xcdTAxQ0QnOidcXHUwMUNFJywnXFx1MDFDRic6J1xcdTAxRDAnLCdcXHUwMUQxJzonXFx1MDFEMicsJ1xcdTAxRDMnOidcXHUwMUQ0JywnXFx1MDFENSc6J1xcdTAxRDYnLCdcXHUwMUQ3JzonXFx1MDFEOCcsJ1xcdTAxRDknOidcXHUwMURBJywnXFx1MDFEQic6J1xcdTAxREMnLCdcXHUwMURFJzonXFx1MDFERicsJ1xcdTAxRTAnOidcXHUwMUUxJywnXFx1MDFFMic6J1xcdTAxRTMnLCdcXHUwMUU0JzonXFx1MDFFNScsJ1xcdTAxRTYnOidcXHUwMUU3JywnXFx1MDFFOCc6J1xcdTAxRTknLCdcXHUwMUVBJzonXFx1MDFFQicsJ1xcdTAxRUMnOidcXHUwMUVEJywnXFx1MDFFRSc6J1xcdTAxRUYnLCdcXHUwMUYxJzonXFx1MDFGMycsJ1xcdTAxRjInOidcXHUwMUYzJywnXFx1MDFGNCc6J1xcdTAxRjUnLCdcXHUwMUY2JzonXFx1MDE5NScsJ1xcdTAxRjcnOidcXHUwMUJGJywnXFx1MDFGOCc6J1xcdTAxRjknLCdcXHUwMUZBJzonXFx1MDFGQicsJ1xcdTAxRkMnOidcXHUwMUZEJywnXFx1MDFGRSc6J1xcdTAxRkYnLCdcXHUwMjAwJzonXFx1MDIwMScsJ1xcdTAyMDInOidcXHUwMjAzJywnXFx1MDIwNCc6J1xcdTAyMDUnLCdcXHUwMjA2JzonXFx1MDIwNycsJ1xcdTAyMDgnOidcXHUwMjA5JywnXFx1MDIwQSc6J1xcdTAyMEInLCdcXHUwMjBDJzonXFx1MDIwRCcsJ1xcdTAyMEUnOidcXHUwMjBGJywnXFx1MDIxMCc6J1xcdTAyMTEnLCdcXHUwMjEyJzonXFx1MDIxMycsJ1xcdTAyMTQnOidcXHUwMjE1JywnXFx1MDIxNic6J1xcdTAyMTcnLCdcXHUwMjE4JzonXFx1MDIxOScsJ1xcdTAyMUEnOidcXHUwMjFCJywnXFx1MDIxQyc6J1xcdTAyMUQnLCdcXHUwMjFFJzonXFx1MDIxRicsJ1xcdTAyMjAnOidcXHUwMTlFJywnXFx1MDIyMic6J1xcdTAyMjMnLCdcXHUwMjI0JzonXFx1MDIyNScsJ1xcdTAyMjYnOidcXHUwMjI3JywnXFx1MDIyOCc6J1xcdTAyMjknLCdcXHUwMjJBJzonXFx1MDIyQicsJ1xcdTAyMkMnOidcXHUwMjJEJywnXFx1MDIyRSc6J1xcdTAyMkYnLCdcXHUwMjMwJzonXFx1MDIzMScsJ1xcdTAyMzInOidcXHUwMjMzJywnXFx1MDIzQSc6J1xcdTJDNjUnLCdcXHUwMjNCJzonXFx1MDIzQycsJ1xcdTAyM0QnOidcXHUwMTlBJywnXFx1MDIzRSc6J1xcdTJDNjYnLCdcXHUwMjQxJzonXFx1MDI0MicsJ1xcdTAyNDMnOidcXHUwMTgwJywnXFx1MDI0NCc6J1xcdTAyODknLCdcXHUwMjQ1JzonXFx1MDI4QycsJ1xcdTAyNDYnOidcXHUwMjQ3JywnXFx1MDI0OCc6J1xcdTAyNDknLCdcXHUwMjRBJzonXFx1MDI0QicsJ1xcdTAyNEMnOidcXHUwMjREJywnXFx1MDI0RSc6J1xcdTAyNEYnLCdcXHUwMzQ1JzonXFx1MDNCOScsJ1xcdTAzNzAnOidcXHUwMzcxJywnXFx1MDM3Mic6J1xcdTAzNzMnLCdcXHUwMzc2JzonXFx1MDM3NycsJ1xcdTAzN0YnOidcXHUwM0YzJywnXFx1MDM4Nic6J1xcdTAzQUMnLCdcXHUwMzg4JzonXFx1MDNBRCcsJ1xcdTAzODknOidcXHUwM0FFJywnXFx1MDM4QSc6J1xcdTAzQUYnLCdcXHUwMzhDJzonXFx1MDNDQycsJ1xcdTAzOEUnOidcXHUwM0NEJywnXFx1MDM4Ric6J1xcdTAzQ0UnLCdcXHUwMzkxJzonXFx1MDNCMScsJ1xcdTAzOTInOidcXHUwM0IyJywnXFx1MDM5Myc6J1xcdTAzQjMnLCdcXHUwMzk0JzonXFx1MDNCNCcsJ1xcdTAzOTUnOidcXHUwM0I1JywnXFx1MDM5Nic6J1xcdTAzQjYnLCdcXHUwMzk3JzonXFx1MDNCNycsJ1xcdTAzOTgnOidcXHUwM0I4JywnXFx1MDM5OSc6J1xcdTAzQjknLCdcXHUwMzlBJzonXFx1MDNCQScsJ1xcdTAzOUInOidcXHUwM0JCJywnXFx1MDM5Qyc6J1xcdTAzQkMnLCdcXHUwMzlEJzonXFx1MDNCRCcsJ1xcdTAzOUUnOidcXHUwM0JFJywnXFx1MDM5Ric6J1xcdTAzQkYnLCdcXHUwM0EwJzonXFx1MDNDMCcsJ1xcdTAzQTEnOidcXHUwM0MxJywnXFx1MDNBMyc6J1xcdTAzQzMnLCdcXHUwM0E0JzonXFx1MDNDNCcsJ1xcdTAzQTUnOidcXHUwM0M1JywnXFx1MDNBNic6J1xcdTAzQzYnLCdcXHUwM0E3JzonXFx1MDNDNycsJ1xcdTAzQTgnOidcXHUwM0M4JywnXFx1MDNBOSc6J1xcdTAzQzknLCdcXHUwM0FBJzonXFx1MDNDQScsJ1xcdTAzQUInOidcXHUwM0NCJywnXFx1MDNDMic6J1xcdTAzQzMnLCdcXHUwM0NGJzonXFx1MDNENycsJ1xcdTAzRDAnOidcXHUwM0IyJywnXFx1MDNEMSc6J1xcdTAzQjgnLCdcXHUwM0Q1JzonXFx1MDNDNicsJ1xcdTAzRDYnOidcXHUwM0MwJywnXFx1MDNEOCc6J1xcdTAzRDknLCdcXHUwM0RBJzonXFx1MDNEQicsJ1xcdTAzREMnOidcXHUwM0REJywnXFx1MDNERSc6J1xcdTAzREYnLCdcXHUwM0UwJzonXFx1MDNFMScsJ1xcdTAzRTInOidcXHUwM0UzJywnXFx1MDNFNCc6J1xcdTAzRTUnLCdcXHUwM0U2JzonXFx1MDNFNycsJ1xcdTAzRTgnOidcXHUwM0U5JywnXFx1MDNFQSc6J1xcdTAzRUInLCdcXHUwM0VDJzonXFx1MDNFRCcsJ1xcdTAzRUUnOidcXHUwM0VGJywnXFx1MDNGMCc6J1xcdTAzQkEnLCdcXHUwM0YxJzonXFx1MDNDMScsJ1xcdTAzRjQnOidcXHUwM0I4JywnXFx1MDNGNSc6J1xcdTAzQjUnLCdcXHUwM0Y3JzonXFx1MDNGOCcsJ1xcdTAzRjknOidcXHUwM0YyJywnXFx1MDNGQSc6J1xcdTAzRkInLCdcXHUwM0ZEJzonXFx1MDM3QicsJ1xcdTAzRkUnOidcXHUwMzdDJywnXFx1MDNGRic6J1xcdTAzN0QnLCdcXHUwNDAwJzonXFx1MDQ1MCcsJ1xcdTA0MDEnOidcXHUwNDUxJywnXFx1MDQwMic6J1xcdTA0NTInLCdcXHUwNDAzJzonXFx1MDQ1MycsJ1xcdTA0MDQnOidcXHUwNDU0JywnXFx1MDQwNSc6J1xcdTA0NTUnLCdcXHUwNDA2JzonXFx1MDQ1NicsJ1xcdTA0MDcnOidcXHUwNDU3JywnXFx1MDQwOCc6J1xcdTA0NTgnLCdcXHUwNDA5JzonXFx1MDQ1OScsJ1xcdTA0MEEnOidcXHUwNDVBJywnXFx1MDQwQic6J1xcdTA0NUInLCdcXHUwNDBDJzonXFx1MDQ1QycsJ1xcdTA0MEQnOidcXHUwNDVEJywnXFx1MDQwRSc6J1xcdTA0NUUnLCdcXHUwNDBGJzonXFx1MDQ1RicsJ1xcdTA0MTAnOidcXHUwNDMwJywnXFx1MDQxMSc6J1xcdTA0MzEnLCdcXHUwNDEyJzonXFx1MDQzMicsJ1xcdTA0MTMnOidcXHUwNDMzJywnXFx1MDQxNCc6J1xcdTA0MzQnLCdcXHUwNDE1JzonXFx1MDQzNScsJ1xcdTA0MTYnOidcXHUwNDM2JywnXFx1MDQxNyc6J1xcdTA0MzcnLCdcXHUwNDE4JzonXFx1MDQzOCcsJ1xcdTA0MTknOidcXHUwNDM5JywnXFx1MDQxQSc6J1xcdTA0M0EnLCdcXHUwNDFCJzonXFx1MDQzQicsJ1xcdTA0MUMnOidcXHUwNDNDJywnXFx1MDQxRCc6J1xcdTA0M0QnLCdcXHUwNDFFJzonXFx1MDQzRScsJ1xcdTA0MUYnOidcXHUwNDNGJywnXFx1MDQyMCc6J1xcdTA0NDAnLCdcXHUwNDIxJzonXFx1MDQ0MScsJ1xcdTA0MjInOidcXHUwNDQyJywnXFx1MDQyMyc6J1xcdTA0NDMnLCdcXHUwNDI0JzonXFx1MDQ0NCcsJ1xcdTA0MjUnOidcXHUwNDQ1JywnXFx1MDQyNic6J1xcdTA0NDYnLCdcXHUwNDI3JzonXFx1MDQ0NycsJ1xcdTA0MjgnOidcXHUwNDQ4JywnXFx1MDQyOSc6J1xcdTA0NDknLCdcXHUwNDJBJzonXFx1MDQ0QScsJ1xcdTA0MkInOidcXHUwNDRCJywnXFx1MDQyQyc6J1xcdTA0NEMnLCdcXHUwNDJEJzonXFx1MDQ0RCcsJ1xcdTA0MkUnOidcXHUwNDRFJywnXFx1MDQyRic6J1xcdTA0NEYnLCdcXHUwNDYwJzonXFx1MDQ2MScsJ1xcdTA0NjInOidcXHUwNDYzJywnXFx1MDQ2NCc6J1xcdTA0NjUnLCdcXHUwNDY2JzonXFx1MDQ2NycsJ1xcdTA0NjgnOidcXHUwNDY5JywnXFx1MDQ2QSc6J1xcdTA0NkInLCdcXHUwNDZDJzonXFx1MDQ2RCcsJ1xcdTA0NkUnOidcXHUwNDZGJywnXFx1MDQ3MCc6J1xcdTA0NzEnLCdcXHUwNDcyJzonXFx1MDQ3MycsJ1xcdTA0NzQnOidcXHUwNDc1JywnXFx1MDQ3Nic6J1xcdTA0NzcnLCdcXHUwNDc4JzonXFx1MDQ3OScsJ1xcdTA0N0EnOidcXHUwNDdCJywnXFx1MDQ3Qyc6J1xcdTA0N0QnLCdcXHUwNDdFJzonXFx1MDQ3RicsJ1xcdTA0ODAnOidcXHUwNDgxJywnXFx1MDQ4QSc6J1xcdTA0OEInLCdcXHUwNDhDJzonXFx1MDQ4RCcsJ1xcdTA0OEUnOidcXHUwNDhGJywnXFx1MDQ5MCc6J1xcdTA0OTEnLCdcXHUwNDkyJzonXFx1MDQ5MycsJ1xcdTA0OTQnOidcXHUwNDk1JywnXFx1MDQ5Nic6J1xcdTA0OTcnLCdcXHUwNDk4JzonXFx1MDQ5OScsJ1xcdTA0OUEnOidcXHUwNDlCJywnXFx1MDQ5Qyc6J1xcdTA0OUQnLCdcXHUwNDlFJzonXFx1MDQ5RicsJ1xcdTA0QTAnOidcXHUwNEExJywnXFx1MDRBMic6J1xcdTA0QTMnLCdcXHUwNEE0JzonXFx1MDRBNScsJ1xcdTA0QTYnOidcXHUwNEE3JywnXFx1MDRBOCc6J1xcdTA0QTknLCdcXHUwNEFBJzonXFx1MDRBQicsJ1xcdTA0QUMnOidcXHUwNEFEJywnXFx1MDRBRSc6J1xcdTA0QUYnLCdcXHUwNEIwJzonXFx1MDRCMScsJ1xcdTA0QjInOidcXHUwNEIzJywnXFx1MDRCNCc6J1xcdTA0QjUnLCdcXHUwNEI2JzonXFx1MDRCNycsJ1xcdTA0QjgnOidcXHUwNEI5JywnXFx1MDRCQSc6J1xcdTA0QkInLCdcXHUwNEJDJzonXFx1MDRCRCcsJ1xcdTA0QkUnOidcXHUwNEJGJywnXFx1MDRDMCc6J1xcdTA0Q0YnLCdcXHUwNEMxJzonXFx1MDRDMicsJ1xcdTA0QzMnOidcXHUwNEM0JywnXFx1MDRDNSc6J1xcdTA0QzYnLCdcXHUwNEM3JzonXFx1MDRDOCcsJ1xcdTA0QzknOidcXHUwNENBJywnXFx1MDRDQic6J1xcdTA0Q0MnLCdcXHUwNENEJzonXFx1MDRDRScsJ1xcdTA0RDAnOidcXHUwNEQxJywnXFx1MDREMic6J1xcdTA0RDMnLCdcXHUwNEQ0JzonXFx1MDRENScsJ1xcdTA0RDYnOidcXHUwNEQ3JywnXFx1MDREOCc6J1xcdTA0RDknLCdcXHUwNERBJzonXFx1MDREQicsJ1xcdTA0REMnOidcXHUwNEREJywnXFx1MDRERSc6J1xcdTA0REYnLCdcXHUwNEUwJzonXFx1MDRFMScsJ1xcdTA0RTInOidcXHUwNEUzJywnXFx1MDRFNCc6J1xcdTA0RTUnLCdcXHUwNEU2JzonXFx1MDRFNycsJ1xcdTA0RTgnOidcXHUwNEU5JywnXFx1MDRFQSc6J1xcdTA0RUInLCdcXHUwNEVDJzonXFx1MDRFRCcsJ1xcdTA0RUUnOidcXHUwNEVGJywnXFx1MDRGMCc6J1xcdTA0RjEnLCdcXHUwNEYyJzonXFx1MDRGMycsJ1xcdTA0RjQnOidcXHUwNEY1JywnXFx1MDRGNic6J1xcdTA0RjcnLCdcXHUwNEY4JzonXFx1MDRGOScsJ1xcdTA0RkEnOidcXHUwNEZCJywnXFx1MDRGQyc6J1xcdTA0RkQnLCdcXHUwNEZFJzonXFx1MDRGRicsJ1xcdTA1MDAnOidcXHUwNTAxJywnXFx1MDUwMic6J1xcdTA1MDMnLCdcXHUwNTA0JzonXFx1MDUwNScsJ1xcdTA1MDYnOidcXHUwNTA3JywnXFx1MDUwOCc6J1xcdTA1MDknLCdcXHUwNTBBJzonXFx1MDUwQicsJ1xcdTA1MEMnOidcXHUwNTBEJywnXFx1MDUwRSc6J1xcdTA1MEYnLCdcXHUwNTEwJzonXFx1MDUxMScsJ1xcdTA1MTInOidcXHUwNTEzJywnXFx1MDUxNCc6J1xcdTA1MTUnLCdcXHUwNTE2JzonXFx1MDUxNycsJ1xcdTA1MTgnOidcXHUwNTE5JywnXFx1MDUxQSc6J1xcdTA1MUInLCdcXHUwNTFDJzonXFx1MDUxRCcsJ1xcdTA1MUUnOidcXHUwNTFGJywnXFx1MDUyMCc6J1xcdTA1MjEnLCdcXHUwNTIyJzonXFx1MDUyMycsJ1xcdTA1MjQnOidcXHUwNTI1JywnXFx1MDUyNic6J1xcdTA1MjcnLCdcXHUwNTI4JzonXFx1MDUyOScsJ1xcdTA1MkEnOidcXHUwNTJCJywnXFx1MDUyQyc6J1xcdTA1MkQnLCdcXHUwNTJFJzonXFx1MDUyRicsJ1xcdTA1MzEnOidcXHUwNTYxJywnXFx1MDUzMic6J1xcdTA1NjInLCdcXHUwNTMzJzonXFx1MDU2MycsJ1xcdTA1MzQnOidcXHUwNTY0JywnXFx1MDUzNSc6J1xcdTA1NjUnLCdcXHUwNTM2JzonXFx1MDU2NicsJ1xcdTA1MzcnOidcXHUwNTY3JywnXFx1MDUzOCc6J1xcdTA1NjgnLCdcXHUwNTM5JzonXFx1MDU2OScsJ1xcdTA1M0EnOidcXHUwNTZBJywnXFx1MDUzQic6J1xcdTA1NkInLCdcXHUwNTNDJzonXFx1MDU2QycsJ1xcdTA1M0QnOidcXHUwNTZEJywnXFx1MDUzRSc6J1xcdTA1NkUnLCdcXHUwNTNGJzonXFx1MDU2RicsJ1xcdTA1NDAnOidcXHUwNTcwJywnXFx1MDU0MSc6J1xcdTA1NzEnLCdcXHUwNTQyJzonXFx1MDU3MicsJ1xcdTA1NDMnOidcXHUwNTczJywnXFx1MDU0NCc6J1xcdTA1NzQnLCdcXHUwNTQ1JzonXFx1MDU3NScsJ1xcdTA1NDYnOidcXHUwNTc2JywnXFx1MDU0Nyc6J1xcdTA1NzcnLCdcXHUwNTQ4JzonXFx1MDU3OCcsJ1xcdTA1NDknOidcXHUwNTc5JywnXFx1MDU0QSc6J1xcdTA1N0EnLCdcXHUwNTRCJzonXFx1MDU3QicsJ1xcdTA1NEMnOidcXHUwNTdDJywnXFx1MDU0RCc6J1xcdTA1N0QnLCdcXHUwNTRFJzonXFx1MDU3RScsJ1xcdTA1NEYnOidcXHUwNTdGJywnXFx1MDU1MCc6J1xcdTA1ODAnLCdcXHUwNTUxJzonXFx1MDU4MScsJ1xcdTA1NTInOidcXHUwNTgyJywnXFx1MDU1Myc6J1xcdTA1ODMnLCdcXHUwNTU0JzonXFx1MDU4NCcsJ1xcdTA1NTUnOidcXHUwNTg1JywnXFx1MDU1Nic6J1xcdTA1ODYnLCdcXHUxMEEwJzonXFx1MkQwMCcsJ1xcdTEwQTEnOidcXHUyRDAxJywnXFx1MTBBMic6J1xcdTJEMDInLCdcXHUxMEEzJzonXFx1MkQwMycsJ1xcdTEwQTQnOidcXHUyRDA0JywnXFx1MTBBNSc6J1xcdTJEMDUnLCdcXHUxMEE2JzonXFx1MkQwNicsJ1xcdTEwQTcnOidcXHUyRDA3JywnXFx1MTBBOCc6J1xcdTJEMDgnLCdcXHUxMEE5JzonXFx1MkQwOScsJ1xcdTEwQUEnOidcXHUyRDBBJywnXFx1MTBBQic6J1xcdTJEMEInLCdcXHUxMEFDJzonXFx1MkQwQycsJ1xcdTEwQUQnOidcXHUyRDBEJywnXFx1MTBBRSc6J1xcdTJEMEUnLCdcXHUxMEFGJzonXFx1MkQwRicsJ1xcdTEwQjAnOidcXHUyRDEwJywnXFx1MTBCMSc6J1xcdTJEMTEnLCdcXHUxMEIyJzonXFx1MkQxMicsJ1xcdTEwQjMnOidcXHUyRDEzJywnXFx1MTBCNCc6J1xcdTJEMTQnLCdcXHUxMEI1JzonXFx1MkQxNScsJ1xcdTEwQjYnOidcXHUyRDE2JywnXFx1MTBCNyc6J1xcdTJEMTcnLCdcXHUxMEI4JzonXFx1MkQxOCcsJ1xcdTEwQjknOidcXHUyRDE5JywnXFx1MTBCQSc6J1xcdTJEMUEnLCdcXHUxMEJCJzonXFx1MkQxQicsJ1xcdTEwQkMnOidcXHUyRDFDJywnXFx1MTBCRCc6J1xcdTJEMUQnLCdcXHUxMEJFJzonXFx1MkQxRScsJ1xcdTEwQkYnOidcXHUyRDFGJywnXFx1MTBDMCc6J1xcdTJEMjAnLCdcXHUxMEMxJzonXFx1MkQyMScsJ1xcdTEwQzInOidcXHUyRDIyJywnXFx1MTBDMyc6J1xcdTJEMjMnLCdcXHUxMEM0JzonXFx1MkQyNCcsJ1xcdTEwQzUnOidcXHUyRDI1JywnXFx1MTBDNyc6J1xcdTJEMjcnLCdcXHUxMENEJzonXFx1MkQyRCcsJ1xcdTFFMDAnOidcXHUxRTAxJywnXFx1MUUwMic6J1xcdTFFMDMnLCdcXHUxRTA0JzonXFx1MUUwNScsJ1xcdTFFMDYnOidcXHUxRTA3JywnXFx1MUUwOCc6J1xcdTFFMDknLCdcXHUxRTBBJzonXFx1MUUwQicsJ1xcdTFFMEMnOidcXHUxRTBEJywnXFx1MUUwRSc6J1xcdTFFMEYnLCdcXHUxRTEwJzonXFx1MUUxMScsJ1xcdTFFMTInOidcXHUxRTEzJywnXFx1MUUxNCc6J1xcdTFFMTUnLCdcXHUxRTE2JzonXFx1MUUxNycsJ1xcdTFFMTgnOidcXHUxRTE5JywnXFx1MUUxQSc6J1xcdTFFMUInLCdcXHUxRTFDJzonXFx1MUUxRCcsJ1xcdTFFMUUnOidcXHUxRTFGJywnXFx1MUUyMCc6J1xcdTFFMjEnLCdcXHUxRTIyJzonXFx1MUUyMycsJ1xcdTFFMjQnOidcXHUxRTI1JywnXFx1MUUyNic6J1xcdTFFMjcnLCdcXHUxRTI4JzonXFx1MUUyOScsJ1xcdTFFMkEnOidcXHUxRTJCJywnXFx1MUUyQyc6J1xcdTFFMkQnLCdcXHUxRTJFJzonXFx1MUUyRicsJ1xcdTFFMzAnOidcXHUxRTMxJywnXFx1MUUzMic6J1xcdTFFMzMnLCdcXHUxRTM0JzonXFx1MUUzNScsJ1xcdTFFMzYnOidcXHUxRTM3JywnXFx1MUUzOCc6J1xcdTFFMzknLCdcXHUxRTNBJzonXFx1MUUzQicsJ1xcdTFFM0MnOidcXHUxRTNEJywnXFx1MUUzRSc6J1xcdTFFM0YnLCdcXHUxRTQwJzonXFx1MUU0MScsJ1xcdTFFNDInOidcXHUxRTQzJywnXFx1MUU0NCc6J1xcdTFFNDUnLCdcXHUxRTQ2JzonXFx1MUU0NycsJ1xcdTFFNDgnOidcXHUxRTQ5JywnXFx1MUU0QSc6J1xcdTFFNEInLCdcXHUxRTRDJzonXFx1MUU0RCcsJ1xcdTFFNEUnOidcXHUxRTRGJywnXFx1MUU1MCc6J1xcdTFFNTEnLCdcXHUxRTUyJzonXFx1MUU1MycsJ1xcdTFFNTQnOidcXHUxRTU1JywnXFx1MUU1Nic6J1xcdTFFNTcnLCdcXHUxRTU4JzonXFx1MUU1OScsJ1xcdTFFNUEnOidcXHUxRTVCJywnXFx1MUU1Qyc6J1xcdTFFNUQnLCdcXHUxRTVFJzonXFx1MUU1RicsJ1xcdTFFNjAnOidcXHUxRTYxJywnXFx1MUU2Mic6J1xcdTFFNjMnLCdcXHUxRTY0JzonXFx1MUU2NScsJ1xcdTFFNjYnOidcXHUxRTY3JywnXFx1MUU2OCc6J1xcdTFFNjknLCdcXHUxRTZBJzonXFx1MUU2QicsJ1xcdTFFNkMnOidcXHUxRTZEJywnXFx1MUU2RSc6J1xcdTFFNkYnLCdcXHUxRTcwJzonXFx1MUU3MScsJ1xcdTFFNzInOidcXHUxRTczJywnXFx1MUU3NCc6J1xcdTFFNzUnLCdcXHUxRTc2JzonXFx1MUU3NycsJ1xcdTFFNzgnOidcXHUxRTc5JywnXFx1MUU3QSc6J1xcdTFFN0InLCdcXHUxRTdDJzonXFx1MUU3RCcsJ1xcdTFFN0UnOidcXHUxRTdGJywnXFx1MUU4MCc6J1xcdTFFODEnLCdcXHUxRTgyJzonXFx1MUU4MycsJ1xcdTFFODQnOidcXHUxRTg1JywnXFx1MUU4Nic6J1xcdTFFODcnLCdcXHUxRTg4JzonXFx1MUU4OScsJ1xcdTFFOEEnOidcXHUxRThCJywnXFx1MUU4Qyc6J1xcdTFFOEQnLCdcXHUxRThFJzonXFx1MUU4RicsJ1xcdTFFOTAnOidcXHUxRTkxJywnXFx1MUU5Mic6J1xcdTFFOTMnLCdcXHUxRTk0JzonXFx1MUU5NScsJ1xcdTFFOUInOidcXHUxRTYxJywnXFx1MUVBMCc6J1xcdTFFQTEnLCdcXHUxRUEyJzonXFx1MUVBMycsJ1xcdTFFQTQnOidcXHUxRUE1JywnXFx1MUVBNic6J1xcdTFFQTcnLCdcXHUxRUE4JzonXFx1MUVBOScsJ1xcdTFFQUEnOidcXHUxRUFCJywnXFx1MUVBQyc6J1xcdTFFQUQnLCdcXHUxRUFFJzonXFx1MUVBRicsJ1xcdTFFQjAnOidcXHUxRUIxJywnXFx1MUVCMic6J1xcdTFFQjMnLCdcXHUxRUI0JzonXFx1MUVCNScsJ1xcdTFFQjYnOidcXHUxRUI3JywnXFx1MUVCOCc6J1xcdTFFQjknLCdcXHUxRUJBJzonXFx1MUVCQicsJ1xcdTFFQkMnOidcXHUxRUJEJywnXFx1MUVCRSc6J1xcdTFFQkYnLCdcXHUxRUMwJzonXFx1MUVDMScsJ1xcdTFFQzInOidcXHUxRUMzJywnXFx1MUVDNCc6J1xcdTFFQzUnLCdcXHUxRUM2JzonXFx1MUVDNycsJ1xcdTFFQzgnOidcXHUxRUM5JywnXFx1MUVDQSc6J1xcdTFFQ0InLCdcXHUxRUNDJzonXFx1MUVDRCcsJ1xcdTFFQ0UnOidcXHUxRUNGJywnXFx1MUVEMCc6J1xcdTFFRDEnLCdcXHUxRUQyJzonXFx1MUVEMycsJ1xcdTFFRDQnOidcXHUxRUQ1JywnXFx1MUVENic6J1xcdTFFRDcnLCdcXHUxRUQ4JzonXFx1MUVEOScsJ1xcdTFFREEnOidcXHUxRURCJywnXFx1MUVEQyc6J1xcdTFFREQnLCdcXHUxRURFJzonXFx1MUVERicsJ1xcdTFFRTAnOidcXHUxRUUxJywnXFx1MUVFMic6J1xcdTFFRTMnLCdcXHUxRUU0JzonXFx1MUVFNScsJ1xcdTFFRTYnOidcXHUxRUU3JywnXFx1MUVFOCc6J1xcdTFFRTknLCdcXHUxRUVBJzonXFx1MUVFQicsJ1xcdTFFRUMnOidcXHUxRUVEJywnXFx1MUVFRSc6J1xcdTFFRUYnLCdcXHUxRUYwJzonXFx1MUVGMScsJ1xcdTFFRjInOidcXHUxRUYzJywnXFx1MUVGNCc6J1xcdTFFRjUnLCdcXHUxRUY2JzonXFx1MUVGNycsJ1xcdTFFRjgnOidcXHUxRUY5JywnXFx1MUVGQSc6J1xcdTFFRkInLCdcXHUxRUZDJzonXFx1MUVGRCcsJ1xcdTFFRkUnOidcXHUxRUZGJywnXFx1MUYwOCc6J1xcdTFGMDAnLCdcXHUxRjA5JzonXFx1MUYwMScsJ1xcdTFGMEEnOidcXHUxRjAyJywnXFx1MUYwQic6J1xcdTFGMDMnLCdcXHUxRjBDJzonXFx1MUYwNCcsJ1xcdTFGMEQnOidcXHUxRjA1JywnXFx1MUYwRSc6J1xcdTFGMDYnLCdcXHUxRjBGJzonXFx1MUYwNycsJ1xcdTFGMTgnOidcXHUxRjEwJywnXFx1MUYxOSc6J1xcdTFGMTEnLCdcXHUxRjFBJzonXFx1MUYxMicsJ1xcdTFGMUInOidcXHUxRjEzJywnXFx1MUYxQyc6J1xcdTFGMTQnLCdcXHUxRjFEJzonXFx1MUYxNScsJ1xcdTFGMjgnOidcXHUxRjIwJywnXFx1MUYyOSc6J1xcdTFGMjEnLCdcXHUxRjJBJzonXFx1MUYyMicsJ1xcdTFGMkInOidcXHUxRjIzJywnXFx1MUYyQyc6J1xcdTFGMjQnLCdcXHUxRjJEJzonXFx1MUYyNScsJ1xcdTFGMkUnOidcXHUxRjI2JywnXFx1MUYyRic6J1xcdTFGMjcnLCdcXHUxRjM4JzonXFx1MUYzMCcsJ1xcdTFGMzknOidcXHUxRjMxJywnXFx1MUYzQSc6J1xcdTFGMzInLCdcXHUxRjNCJzonXFx1MUYzMycsJ1xcdTFGM0MnOidcXHUxRjM0JywnXFx1MUYzRCc6J1xcdTFGMzUnLCdcXHUxRjNFJzonXFx1MUYzNicsJ1xcdTFGM0YnOidcXHUxRjM3JywnXFx1MUY0OCc6J1xcdTFGNDAnLCdcXHUxRjQ5JzonXFx1MUY0MScsJ1xcdTFGNEEnOidcXHUxRjQyJywnXFx1MUY0Qic6J1xcdTFGNDMnLCdcXHUxRjRDJzonXFx1MUY0NCcsJ1xcdTFGNEQnOidcXHUxRjQ1JywnXFx1MUY1OSc6J1xcdTFGNTEnLCdcXHUxRjVCJzonXFx1MUY1MycsJ1xcdTFGNUQnOidcXHUxRjU1JywnXFx1MUY1Ric6J1xcdTFGNTcnLCdcXHUxRjY4JzonXFx1MUY2MCcsJ1xcdTFGNjknOidcXHUxRjYxJywnXFx1MUY2QSc6J1xcdTFGNjInLCdcXHUxRjZCJzonXFx1MUY2MycsJ1xcdTFGNkMnOidcXHUxRjY0JywnXFx1MUY2RCc6J1xcdTFGNjUnLCdcXHUxRjZFJzonXFx1MUY2NicsJ1xcdTFGNkYnOidcXHUxRjY3JywnXFx1MUZCOCc6J1xcdTFGQjAnLCdcXHUxRkI5JzonXFx1MUZCMScsJ1xcdTFGQkEnOidcXHUxRjcwJywnXFx1MUZCQic6J1xcdTFGNzEnLCdcXHUxRkJFJzonXFx1MDNCOScsJ1xcdTFGQzgnOidcXHUxRjcyJywnXFx1MUZDOSc6J1xcdTFGNzMnLCdcXHUxRkNBJzonXFx1MUY3NCcsJ1xcdTFGQ0InOidcXHUxRjc1JywnXFx1MUZEOCc6J1xcdTFGRDAnLCdcXHUxRkQ5JzonXFx1MUZEMScsJ1xcdTFGREEnOidcXHUxRjc2JywnXFx1MUZEQic6J1xcdTFGNzcnLCdcXHUxRkU4JzonXFx1MUZFMCcsJ1xcdTFGRTknOidcXHUxRkUxJywnXFx1MUZFQSc6J1xcdTFGN0EnLCdcXHUxRkVCJzonXFx1MUY3QicsJ1xcdTFGRUMnOidcXHUxRkU1JywnXFx1MUZGOCc6J1xcdTFGNzgnLCdcXHUxRkY5JzonXFx1MUY3OScsJ1xcdTFGRkEnOidcXHUxRjdDJywnXFx1MUZGQic6J1xcdTFGN0QnLCdcXHUyMTI2JzonXFx1MDNDOScsJ1xcdTIxMkEnOidrJywnXFx1MjEyQic6J1xceEU1JywnXFx1MjEzMic6J1xcdTIxNEUnLCdcXHUyMTYwJzonXFx1MjE3MCcsJ1xcdTIxNjEnOidcXHUyMTcxJywnXFx1MjE2Mic6J1xcdTIxNzInLCdcXHUyMTYzJzonXFx1MjE3MycsJ1xcdTIxNjQnOidcXHUyMTc0JywnXFx1MjE2NSc6J1xcdTIxNzUnLCdcXHUyMTY2JzonXFx1MjE3NicsJ1xcdTIxNjcnOidcXHUyMTc3JywnXFx1MjE2OCc6J1xcdTIxNzgnLCdcXHUyMTY5JzonXFx1MjE3OScsJ1xcdTIxNkEnOidcXHUyMTdBJywnXFx1MjE2Qic6J1xcdTIxN0InLCdcXHUyMTZDJzonXFx1MjE3QycsJ1xcdTIxNkQnOidcXHUyMTdEJywnXFx1MjE2RSc6J1xcdTIxN0UnLCdcXHUyMTZGJzonXFx1MjE3RicsJ1xcdTIxODMnOidcXHUyMTg0JywnXFx1MjRCNic6J1xcdTI0RDAnLCdcXHUyNEI3JzonXFx1MjREMScsJ1xcdTI0QjgnOidcXHUyNEQyJywnXFx1MjRCOSc6J1xcdTI0RDMnLCdcXHUyNEJBJzonXFx1MjRENCcsJ1xcdTI0QkInOidcXHUyNEQ1JywnXFx1MjRCQyc6J1xcdTI0RDYnLCdcXHUyNEJEJzonXFx1MjRENycsJ1xcdTI0QkUnOidcXHUyNEQ4JywnXFx1MjRCRic6J1xcdTI0RDknLCdcXHUyNEMwJzonXFx1MjREQScsJ1xcdTI0QzEnOidcXHUyNERCJywnXFx1MjRDMic6J1xcdTI0REMnLCdcXHUyNEMzJzonXFx1MjRERCcsJ1xcdTI0QzQnOidcXHUyNERFJywnXFx1MjRDNSc6J1xcdTI0REYnLCdcXHUyNEM2JzonXFx1MjRFMCcsJ1xcdTI0QzcnOidcXHUyNEUxJywnXFx1MjRDOCc6J1xcdTI0RTInLCdcXHUyNEM5JzonXFx1MjRFMycsJ1xcdTI0Q0EnOidcXHUyNEU0JywnXFx1MjRDQic6J1xcdTI0RTUnLCdcXHUyNENDJzonXFx1MjRFNicsJ1xcdTI0Q0QnOidcXHUyNEU3JywnXFx1MjRDRSc6J1xcdTI0RTgnLCdcXHUyNENGJzonXFx1MjRFOScsJ1xcdTJDMDAnOidcXHUyQzMwJywnXFx1MkMwMSc6J1xcdTJDMzEnLCdcXHUyQzAyJzonXFx1MkMzMicsJ1xcdTJDMDMnOidcXHUyQzMzJywnXFx1MkMwNCc6J1xcdTJDMzQnLCdcXHUyQzA1JzonXFx1MkMzNScsJ1xcdTJDMDYnOidcXHUyQzM2JywnXFx1MkMwNyc6J1xcdTJDMzcnLCdcXHUyQzA4JzonXFx1MkMzOCcsJ1xcdTJDMDknOidcXHUyQzM5JywnXFx1MkMwQSc6J1xcdTJDM0EnLCdcXHUyQzBCJzonXFx1MkMzQicsJ1xcdTJDMEMnOidcXHUyQzNDJywnXFx1MkMwRCc6J1xcdTJDM0QnLCdcXHUyQzBFJzonXFx1MkMzRScsJ1xcdTJDMEYnOidcXHUyQzNGJywnXFx1MkMxMCc6J1xcdTJDNDAnLCdcXHUyQzExJzonXFx1MkM0MScsJ1xcdTJDMTInOidcXHUyQzQyJywnXFx1MkMxMyc6J1xcdTJDNDMnLCdcXHUyQzE0JzonXFx1MkM0NCcsJ1xcdTJDMTUnOidcXHUyQzQ1JywnXFx1MkMxNic6J1xcdTJDNDYnLCdcXHUyQzE3JzonXFx1MkM0NycsJ1xcdTJDMTgnOidcXHUyQzQ4JywnXFx1MkMxOSc6J1xcdTJDNDknLCdcXHUyQzFBJzonXFx1MkM0QScsJ1xcdTJDMUInOidcXHUyQzRCJywnXFx1MkMxQyc6J1xcdTJDNEMnLCdcXHUyQzFEJzonXFx1MkM0RCcsJ1xcdTJDMUUnOidcXHUyQzRFJywnXFx1MkMxRic6J1xcdTJDNEYnLCdcXHUyQzIwJzonXFx1MkM1MCcsJ1xcdTJDMjEnOidcXHUyQzUxJywnXFx1MkMyMic6J1xcdTJDNTInLCdcXHUyQzIzJzonXFx1MkM1MycsJ1xcdTJDMjQnOidcXHUyQzU0JywnXFx1MkMyNSc6J1xcdTJDNTUnLCdcXHUyQzI2JzonXFx1MkM1NicsJ1xcdTJDMjcnOidcXHUyQzU3JywnXFx1MkMyOCc6J1xcdTJDNTgnLCdcXHUyQzI5JzonXFx1MkM1OScsJ1xcdTJDMkEnOidcXHUyQzVBJywnXFx1MkMyQic6J1xcdTJDNUInLCdcXHUyQzJDJzonXFx1MkM1QycsJ1xcdTJDMkQnOidcXHUyQzVEJywnXFx1MkMyRSc6J1xcdTJDNUUnLCdcXHUyQzYwJzonXFx1MkM2MScsJ1xcdTJDNjInOidcXHUwMjZCJywnXFx1MkM2Myc6J1xcdTFEN0QnLCdcXHUyQzY0JzonXFx1MDI3RCcsJ1xcdTJDNjcnOidcXHUyQzY4JywnXFx1MkM2OSc6J1xcdTJDNkEnLCdcXHUyQzZCJzonXFx1MkM2QycsJ1xcdTJDNkQnOidcXHUwMjUxJywnXFx1MkM2RSc6J1xcdTAyNzEnLCdcXHUyQzZGJzonXFx1MDI1MCcsJ1xcdTJDNzAnOidcXHUwMjUyJywnXFx1MkM3Mic6J1xcdTJDNzMnLCdcXHUyQzc1JzonXFx1MkM3NicsJ1xcdTJDN0UnOidcXHUwMjNGJywnXFx1MkM3Ric6J1xcdTAyNDAnLCdcXHUyQzgwJzonXFx1MkM4MScsJ1xcdTJDODInOidcXHUyQzgzJywnXFx1MkM4NCc6J1xcdTJDODUnLCdcXHUyQzg2JzonXFx1MkM4NycsJ1xcdTJDODgnOidcXHUyQzg5JywnXFx1MkM4QSc6J1xcdTJDOEInLCdcXHUyQzhDJzonXFx1MkM4RCcsJ1xcdTJDOEUnOidcXHUyQzhGJywnXFx1MkM5MCc6J1xcdTJDOTEnLCdcXHUyQzkyJzonXFx1MkM5MycsJ1xcdTJDOTQnOidcXHUyQzk1JywnXFx1MkM5Nic6J1xcdTJDOTcnLCdcXHUyQzk4JzonXFx1MkM5OScsJ1xcdTJDOUEnOidcXHUyQzlCJywnXFx1MkM5Qyc6J1xcdTJDOUQnLCdcXHUyQzlFJzonXFx1MkM5RicsJ1xcdTJDQTAnOidcXHUyQ0ExJywnXFx1MkNBMic6J1xcdTJDQTMnLCdcXHUyQ0E0JzonXFx1MkNBNScsJ1xcdTJDQTYnOidcXHUyQ0E3JywnXFx1MkNBOCc6J1xcdTJDQTknLCdcXHUyQ0FBJzonXFx1MkNBQicsJ1xcdTJDQUMnOidcXHUyQ0FEJywnXFx1MkNBRSc6J1xcdTJDQUYnLCdcXHUyQ0IwJzonXFx1MkNCMScsJ1xcdTJDQjInOidcXHUyQ0IzJywnXFx1MkNCNCc6J1xcdTJDQjUnLCdcXHUyQ0I2JzonXFx1MkNCNycsJ1xcdTJDQjgnOidcXHUyQ0I5JywnXFx1MkNCQSc6J1xcdTJDQkInLCdcXHUyQ0JDJzonXFx1MkNCRCcsJ1xcdTJDQkUnOidcXHUyQ0JGJywnXFx1MkNDMCc6J1xcdTJDQzEnLCdcXHUyQ0MyJzonXFx1MkNDMycsJ1xcdTJDQzQnOidcXHUyQ0M1JywnXFx1MkNDNic6J1xcdTJDQzcnLCdcXHUyQ0M4JzonXFx1MkNDOScsJ1xcdTJDQ0EnOidcXHUyQ0NCJywnXFx1MkNDQyc6J1xcdTJDQ0QnLCdcXHUyQ0NFJzonXFx1MkNDRicsJ1xcdTJDRDAnOidcXHUyQ0QxJywnXFx1MkNEMic6J1xcdTJDRDMnLCdcXHUyQ0Q0JzonXFx1MkNENScsJ1xcdTJDRDYnOidcXHUyQ0Q3JywnXFx1MkNEOCc6J1xcdTJDRDknLCdcXHUyQ0RBJzonXFx1MkNEQicsJ1xcdTJDREMnOidcXHUyQ0REJywnXFx1MkNERSc6J1xcdTJDREYnLCdcXHUyQ0UwJzonXFx1MkNFMScsJ1xcdTJDRTInOidcXHUyQ0UzJywnXFx1MkNFQic6J1xcdTJDRUMnLCdcXHUyQ0VEJzonXFx1MkNFRScsJ1xcdTJDRjInOidcXHUyQ0YzJywnXFx1QTY0MCc6J1xcdUE2NDEnLCdcXHVBNjQyJzonXFx1QTY0MycsJ1xcdUE2NDQnOidcXHVBNjQ1JywnXFx1QTY0Nic6J1xcdUE2NDcnLCdcXHVBNjQ4JzonXFx1QTY0OScsJ1xcdUE2NEEnOidcXHVBNjRCJywnXFx1QTY0Qyc6J1xcdUE2NEQnLCdcXHVBNjRFJzonXFx1QTY0RicsJ1xcdUE2NTAnOidcXHVBNjUxJywnXFx1QTY1Mic6J1xcdUE2NTMnLCdcXHVBNjU0JzonXFx1QTY1NScsJ1xcdUE2NTYnOidcXHVBNjU3JywnXFx1QTY1OCc6J1xcdUE2NTknLCdcXHVBNjVBJzonXFx1QTY1QicsJ1xcdUE2NUMnOidcXHVBNjVEJywnXFx1QTY1RSc6J1xcdUE2NUYnLCdcXHVBNjYwJzonXFx1QTY2MScsJ1xcdUE2NjInOidcXHVBNjYzJywnXFx1QTY2NCc6J1xcdUE2NjUnLCdcXHVBNjY2JzonXFx1QTY2NycsJ1xcdUE2NjgnOidcXHVBNjY5JywnXFx1QTY2QSc6J1xcdUE2NkInLCdcXHVBNjZDJzonXFx1QTY2RCcsJ1xcdUE2ODAnOidcXHVBNjgxJywnXFx1QTY4Mic6J1xcdUE2ODMnLCdcXHVBNjg0JzonXFx1QTY4NScsJ1xcdUE2ODYnOidcXHVBNjg3JywnXFx1QTY4OCc6J1xcdUE2ODknLCdcXHVBNjhBJzonXFx1QTY4QicsJ1xcdUE2OEMnOidcXHVBNjhEJywnXFx1QTY4RSc6J1xcdUE2OEYnLCdcXHVBNjkwJzonXFx1QTY5MScsJ1xcdUE2OTInOidcXHVBNjkzJywnXFx1QTY5NCc6J1xcdUE2OTUnLCdcXHVBNjk2JzonXFx1QTY5NycsJ1xcdUE2OTgnOidcXHVBNjk5JywnXFx1QTY5QSc6J1xcdUE2OUInLCdcXHVBNzIyJzonXFx1QTcyMycsJ1xcdUE3MjQnOidcXHVBNzI1JywnXFx1QTcyNic6J1xcdUE3MjcnLCdcXHVBNzI4JzonXFx1QTcyOScsJ1xcdUE3MkEnOidcXHVBNzJCJywnXFx1QTcyQyc6J1xcdUE3MkQnLCdcXHVBNzJFJzonXFx1QTcyRicsJ1xcdUE3MzInOidcXHVBNzMzJywnXFx1QTczNCc6J1xcdUE3MzUnLCdcXHVBNzM2JzonXFx1QTczNycsJ1xcdUE3MzgnOidcXHVBNzM5JywnXFx1QTczQSc6J1xcdUE3M0InLCdcXHVBNzNDJzonXFx1QTczRCcsJ1xcdUE3M0UnOidcXHVBNzNGJywnXFx1QTc0MCc6J1xcdUE3NDEnLCdcXHVBNzQyJzonXFx1QTc0MycsJ1xcdUE3NDQnOidcXHVBNzQ1JywnXFx1QTc0Nic6J1xcdUE3NDcnLCdcXHVBNzQ4JzonXFx1QTc0OScsJ1xcdUE3NEEnOidcXHVBNzRCJywnXFx1QTc0Qyc6J1xcdUE3NEQnLCdcXHVBNzRFJzonXFx1QTc0RicsJ1xcdUE3NTAnOidcXHVBNzUxJywnXFx1QTc1Mic6J1xcdUE3NTMnLCdcXHVBNzU0JzonXFx1QTc1NScsJ1xcdUE3NTYnOidcXHVBNzU3JywnXFx1QTc1OCc6J1xcdUE3NTknLCdcXHVBNzVBJzonXFx1QTc1QicsJ1xcdUE3NUMnOidcXHVBNzVEJywnXFx1QTc1RSc6J1xcdUE3NUYnLCdcXHVBNzYwJzonXFx1QTc2MScsJ1xcdUE3NjInOidcXHVBNzYzJywnXFx1QTc2NCc6J1xcdUE3NjUnLCdcXHVBNzY2JzonXFx1QTc2NycsJ1xcdUE3NjgnOidcXHVBNzY5JywnXFx1QTc2QSc6J1xcdUE3NkInLCdcXHVBNzZDJzonXFx1QTc2RCcsJ1xcdUE3NkUnOidcXHVBNzZGJywnXFx1QTc3OSc6J1xcdUE3N0EnLCdcXHVBNzdCJzonXFx1QTc3QycsJ1xcdUE3N0QnOidcXHUxRDc5JywnXFx1QTc3RSc6J1xcdUE3N0YnLCdcXHVBNzgwJzonXFx1QTc4MScsJ1xcdUE3ODInOidcXHVBNzgzJywnXFx1QTc4NCc6J1xcdUE3ODUnLCdcXHVBNzg2JzonXFx1QTc4NycsJ1xcdUE3OEInOidcXHVBNzhDJywnXFx1QTc4RCc6J1xcdTAyNjUnLCdcXHVBNzkwJzonXFx1QTc5MScsJ1xcdUE3OTInOidcXHVBNzkzJywnXFx1QTc5Nic6J1xcdUE3OTcnLCdcXHVBNzk4JzonXFx1QTc5OScsJ1xcdUE3OUEnOidcXHVBNzlCJywnXFx1QTc5Qyc6J1xcdUE3OUQnLCdcXHVBNzlFJzonXFx1QTc5RicsJ1xcdUE3QTAnOidcXHVBN0ExJywnXFx1QTdBMic6J1xcdUE3QTMnLCdcXHVBN0E0JzonXFx1QTdBNScsJ1xcdUE3QTYnOidcXHVBN0E3JywnXFx1QTdBOCc6J1xcdUE3QTknLCdcXHVBN0FBJzonXFx1MDI2NicsJ1xcdUE3QUInOidcXHUwMjVDJywnXFx1QTdBQyc6J1xcdTAyNjEnLCdcXHVBN0FEJzonXFx1MDI2QycsJ1xcdUE3QjAnOidcXHUwMjlFJywnXFx1QTdCMSc6J1xcdTAyODcnLCdcXHVGRjIxJzonXFx1RkY0MScsJ1xcdUZGMjInOidcXHVGRjQyJywnXFx1RkYyMyc6J1xcdUZGNDMnLCdcXHVGRjI0JzonXFx1RkY0NCcsJ1xcdUZGMjUnOidcXHVGRjQ1JywnXFx1RkYyNic6J1xcdUZGNDYnLCdcXHVGRjI3JzonXFx1RkY0NycsJ1xcdUZGMjgnOidcXHVGRjQ4JywnXFx1RkYyOSc6J1xcdUZGNDknLCdcXHVGRjJBJzonXFx1RkY0QScsJ1xcdUZGMkInOidcXHVGRjRCJywnXFx1RkYyQyc6J1xcdUZGNEMnLCdcXHVGRjJEJzonXFx1RkY0RCcsJ1xcdUZGMkUnOidcXHVGRjRFJywnXFx1RkYyRic6J1xcdUZGNEYnLCdcXHVGRjMwJzonXFx1RkY1MCcsJ1xcdUZGMzEnOidcXHVGRjUxJywnXFx1RkYzMic6J1xcdUZGNTInLCdcXHVGRjMzJzonXFx1RkY1MycsJ1xcdUZGMzQnOidcXHVGRjU0JywnXFx1RkYzNSc6J1xcdUZGNTUnLCdcXHVGRjM2JzonXFx1RkY1NicsJ1xcdUZGMzcnOidcXHVGRjU3JywnXFx1RkYzOCc6J1xcdUZGNTgnLCdcXHVGRjM5JzonXFx1RkY1OScsJ1xcdUZGM0EnOidcXHVGRjVBJywnXFx1RDgwMVxcdURDMDAnOidcXHVEODAxXFx1REMyOCcsJ1xcdUQ4MDFcXHVEQzAxJzonXFx1RDgwMVxcdURDMjknLCdcXHVEODAxXFx1REMwMic6J1xcdUQ4MDFcXHVEQzJBJywnXFx1RDgwMVxcdURDMDMnOidcXHVEODAxXFx1REMyQicsJ1xcdUQ4MDFcXHVEQzA0JzonXFx1RDgwMVxcdURDMkMnLCdcXHVEODAxXFx1REMwNSc6J1xcdUQ4MDFcXHVEQzJEJywnXFx1RDgwMVxcdURDMDYnOidcXHVEODAxXFx1REMyRScsJ1xcdUQ4MDFcXHVEQzA3JzonXFx1RDgwMVxcdURDMkYnLCdcXHVEODAxXFx1REMwOCc6J1xcdUQ4MDFcXHVEQzMwJywnXFx1RDgwMVxcdURDMDknOidcXHVEODAxXFx1REMzMScsJ1xcdUQ4MDFcXHVEQzBBJzonXFx1RDgwMVxcdURDMzInLCdcXHVEODAxXFx1REMwQic6J1xcdUQ4MDFcXHVEQzMzJywnXFx1RDgwMVxcdURDMEMnOidcXHVEODAxXFx1REMzNCcsJ1xcdUQ4MDFcXHVEQzBEJzonXFx1RDgwMVxcdURDMzUnLCdcXHVEODAxXFx1REMwRSc6J1xcdUQ4MDFcXHVEQzM2JywnXFx1RDgwMVxcdURDMEYnOidcXHVEODAxXFx1REMzNycsJ1xcdUQ4MDFcXHVEQzEwJzonXFx1RDgwMVxcdURDMzgnLCdcXHVEODAxXFx1REMxMSc6J1xcdUQ4MDFcXHVEQzM5JywnXFx1RDgwMVxcdURDMTInOidcXHVEODAxXFx1REMzQScsJ1xcdUQ4MDFcXHVEQzEzJzonXFx1RDgwMVxcdURDM0InLCdcXHVEODAxXFx1REMxNCc6J1xcdUQ4MDFcXHVEQzNDJywnXFx1RDgwMVxcdURDMTUnOidcXHVEODAxXFx1REMzRCcsJ1xcdUQ4MDFcXHVEQzE2JzonXFx1RDgwMVxcdURDM0UnLCdcXHVEODAxXFx1REMxNyc6J1xcdUQ4MDFcXHVEQzNGJywnXFx1RDgwMVxcdURDMTgnOidcXHVEODAxXFx1REM0MCcsJ1xcdUQ4MDFcXHVEQzE5JzonXFx1RDgwMVxcdURDNDEnLCdcXHVEODAxXFx1REMxQSc6J1xcdUQ4MDFcXHVEQzQyJywnXFx1RDgwMVxcdURDMUInOidcXHVEODAxXFx1REM0MycsJ1xcdUQ4MDFcXHVEQzFDJzonXFx1RDgwMVxcdURDNDQnLCdcXHVEODAxXFx1REMxRCc6J1xcdUQ4MDFcXHVEQzQ1JywnXFx1RDgwMVxcdURDMUUnOidcXHVEODAxXFx1REM0NicsJ1xcdUQ4MDFcXHVEQzFGJzonXFx1RDgwMVxcdURDNDcnLCdcXHVEODAxXFx1REMyMCc6J1xcdUQ4MDFcXHVEQzQ4JywnXFx1RDgwMVxcdURDMjEnOidcXHVEODAxXFx1REM0OScsJ1xcdUQ4MDFcXHVEQzIyJzonXFx1RDgwMVxcdURDNEEnLCdcXHVEODAxXFx1REMyMyc6J1xcdUQ4MDFcXHVEQzRCJywnXFx1RDgwMVxcdURDMjQnOidcXHVEODAxXFx1REM0QycsJ1xcdUQ4MDFcXHVEQzI1JzonXFx1RDgwMVxcdURDNEQnLCdcXHVEODAxXFx1REMyNic6J1xcdUQ4MDFcXHVEQzRFJywnXFx1RDgwMVxcdURDMjcnOidcXHVEODAxXFx1REM0RicsJ1xcdUQ4MDZcXHVEQ0EwJzonXFx1RDgwNlxcdURDQzAnLCdcXHVEODA2XFx1RENBMSc6J1xcdUQ4MDZcXHVEQ0MxJywnXFx1RDgwNlxcdURDQTInOidcXHVEODA2XFx1RENDMicsJ1xcdUQ4MDZcXHVEQ0EzJzonXFx1RDgwNlxcdURDQzMnLCdcXHVEODA2XFx1RENBNCc6J1xcdUQ4MDZcXHVEQ0M0JywnXFx1RDgwNlxcdURDQTUnOidcXHVEODA2XFx1RENDNScsJ1xcdUQ4MDZcXHVEQ0E2JzonXFx1RDgwNlxcdURDQzYnLCdcXHVEODA2XFx1RENBNyc6J1xcdUQ4MDZcXHVEQ0M3JywnXFx1RDgwNlxcdURDQTgnOidcXHVEODA2XFx1RENDOCcsJ1xcdUQ4MDZcXHVEQ0E5JzonXFx1RDgwNlxcdURDQzknLCdcXHVEODA2XFx1RENBQSc6J1xcdUQ4MDZcXHVEQ0NBJywnXFx1RDgwNlxcdURDQUInOidcXHVEODA2XFx1RENDQicsJ1xcdUQ4MDZcXHVEQ0FDJzonXFx1RDgwNlxcdURDQ0MnLCdcXHVEODA2XFx1RENBRCc6J1xcdUQ4MDZcXHVEQ0NEJywnXFx1RDgwNlxcdURDQUUnOidcXHVEODA2XFx1RENDRScsJ1xcdUQ4MDZcXHVEQ0FGJzonXFx1RDgwNlxcdURDQ0YnLCdcXHVEODA2XFx1RENCMCc6J1xcdUQ4MDZcXHVEQ0QwJywnXFx1RDgwNlxcdURDQjEnOidcXHVEODA2XFx1RENEMScsJ1xcdUQ4MDZcXHVEQ0IyJzonXFx1RDgwNlxcdURDRDInLCdcXHVEODA2XFx1RENCMyc6J1xcdUQ4MDZcXHVEQ0QzJywnXFx1RDgwNlxcdURDQjQnOidcXHVEODA2XFx1RENENCcsJ1xcdUQ4MDZcXHVEQ0I1JzonXFx1RDgwNlxcdURDRDUnLCdcXHVEODA2XFx1RENCNic6J1xcdUQ4MDZcXHVEQ0Q2JywnXFx1RDgwNlxcdURDQjcnOidcXHVEODA2XFx1RENENycsJ1xcdUQ4MDZcXHVEQ0I4JzonXFx1RDgwNlxcdURDRDgnLCdcXHVEODA2XFx1RENCOSc6J1xcdUQ4MDZcXHVEQ0Q5JywnXFx1RDgwNlxcdURDQkEnOidcXHVEODA2XFx1RENEQScsJ1xcdUQ4MDZcXHVEQ0JCJzonXFx1RDgwNlxcdURDREInLCdcXHVEODA2XFx1RENCQyc6J1xcdUQ4MDZcXHVEQ0RDJywnXFx1RDgwNlxcdURDQkQnOidcXHVEODA2XFx1RENERCcsJ1xcdUQ4MDZcXHVEQ0JFJzonXFx1RDgwNlxcdURDREUnLCdcXHVEODA2XFx1RENCRic6J1xcdUQ4MDZcXHVEQ0RGJywnXFx4REYnOidzcycsJ1xcdTAxMzAnOidpXFx1MDMwNycsJ1xcdTAxNDknOidcXHUwMkJDbicsJ1xcdTAxRjAnOidqXFx1MDMwQycsJ1xcdTAzOTAnOidcXHUwM0I5XFx1MDMwOFxcdTAzMDEnLCdcXHUwM0IwJzonXFx1MDNDNVxcdTAzMDhcXHUwMzAxJywnXFx1MDU4Nyc6J1xcdTA1NjVcXHUwNTgyJywnXFx1MUU5Nic6J2hcXHUwMzMxJywnXFx1MUU5Nyc6J3RcXHUwMzA4JywnXFx1MUU5OCc6J3dcXHUwMzBBJywnXFx1MUU5OSc6J3lcXHUwMzBBJywnXFx1MUU5QSc6J2FcXHUwMkJFJywnXFx1MUU5RSc6J3NzJywnXFx1MUY1MCc6J1xcdTAzQzVcXHUwMzEzJywnXFx1MUY1Mic6J1xcdTAzQzVcXHUwMzEzXFx1MDMwMCcsJ1xcdTFGNTQnOidcXHUwM0M1XFx1MDMxM1xcdTAzMDEnLCdcXHUxRjU2JzonXFx1MDNDNVxcdTAzMTNcXHUwMzQyJywnXFx1MUY4MCc6J1xcdTFGMDBcXHUwM0I5JywnXFx1MUY4MSc6J1xcdTFGMDFcXHUwM0I5JywnXFx1MUY4Mic6J1xcdTFGMDJcXHUwM0I5JywnXFx1MUY4Myc6J1xcdTFGMDNcXHUwM0I5JywnXFx1MUY4NCc6J1xcdTFGMDRcXHUwM0I5JywnXFx1MUY4NSc6J1xcdTFGMDVcXHUwM0I5JywnXFx1MUY4Nic6J1xcdTFGMDZcXHUwM0I5JywnXFx1MUY4Nyc6J1xcdTFGMDdcXHUwM0I5JywnXFx1MUY4OCc6J1xcdTFGMDBcXHUwM0I5JywnXFx1MUY4OSc6J1xcdTFGMDFcXHUwM0I5JywnXFx1MUY4QSc6J1xcdTFGMDJcXHUwM0I5JywnXFx1MUY4Qic6J1xcdTFGMDNcXHUwM0I5JywnXFx1MUY4Qyc6J1xcdTFGMDRcXHUwM0I5JywnXFx1MUY4RCc6J1xcdTFGMDVcXHUwM0I5JywnXFx1MUY4RSc6J1xcdTFGMDZcXHUwM0I5JywnXFx1MUY4Ric6J1xcdTFGMDdcXHUwM0I5JywnXFx1MUY5MCc6J1xcdTFGMjBcXHUwM0I5JywnXFx1MUY5MSc6J1xcdTFGMjFcXHUwM0I5JywnXFx1MUY5Mic6J1xcdTFGMjJcXHUwM0I5JywnXFx1MUY5Myc6J1xcdTFGMjNcXHUwM0I5JywnXFx1MUY5NCc6J1xcdTFGMjRcXHUwM0I5JywnXFx1MUY5NSc6J1xcdTFGMjVcXHUwM0I5JywnXFx1MUY5Nic6J1xcdTFGMjZcXHUwM0I5JywnXFx1MUY5Nyc6J1xcdTFGMjdcXHUwM0I5JywnXFx1MUY5OCc6J1xcdTFGMjBcXHUwM0I5JywnXFx1MUY5OSc6J1xcdTFGMjFcXHUwM0I5JywnXFx1MUY5QSc6J1xcdTFGMjJcXHUwM0I5JywnXFx1MUY5Qic6J1xcdTFGMjNcXHUwM0I5JywnXFx1MUY5Qyc6J1xcdTFGMjRcXHUwM0I5JywnXFx1MUY5RCc6J1xcdTFGMjVcXHUwM0I5JywnXFx1MUY5RSc6J1xcdTFGMjZcXHUwM0I5JywnXFx1MUY5Ric6J1xcdTFGMjdcXHUwM0I5JywnXFx1MUZBMCc6J1xcdTFGNjBcXHUwM0I5JywnXFx1MUZBMSc6J1xcdTFGNjFcXHUwM0I5JywnXFx1MUZBMic6J1xcdTFGNjJcXHUwM0I5JywnXFx1MUZBMyc6J1xcdTFGNjNcXHUwM0I5JywnXFx1MUZBNCc6J1xcdTFGNjRcXHUwM0I5JywnXFx1MUZBNSc6J1xcdTFGNjVcXHUwM0I5JywnXFx1MUZBNic6J1xcdTFGNjZcXHUwM0I5JywnXFx1MUZBNyc6J1xcdTFGNjdcXHUwM0I5JywnXFx1MUZBOCc6J1xcdTFGNjBcXHUwM0I5JywnXFx1MUZBOSc6J1xcdTFGNjFcXHUwM0I5JywnXFx1MUZBQSc6J1xcdTFGNjJcXHUwM0I5JywnXFx1MUZBQic6J1xcdTFGNjNcXHUwM0I5JywnXFx1MUZBQyc6J1xcdTFGNjRcXHUwM0I5JywnXFx1MUZBRCc6J1xcdTFGNjVcXHUwM0I5JywnXFx1MUZBRSc6J1xcdTFGNjZcXHUwM0I5JywnXFx1MUZBRic6J1xcdTFGNjdcXHUwM0I5JywnXFx1MUZCMic6J1xcdTFGNzBcXHUwM0I5JywnXFx1MUZCMyc6J1xcdTAzQjFcXHUwM0I5JywnXFx1MUZCNCc6J1xcdTAzQUNcXHUwM0I5JywnXFx1MUZCNic6J1xcdTAzQjFcXHUwMzQyJywnXFx1MUZCNyc6J1xcdTAzQjFcXHUwMzQyXFx1MDNCOScsJ1xcdTFGQkMnOidcXHUwM0IxXFx1MDNCOScsJ1xcdTFGQzInOidcXHUxRjc0XFx1MDNCOScsJ1xcdTFGQzMnOidcXHUwM0I3XFx1MDNCOScsJ1xcdTFGQzQnOidcXHUwM0FFXFx1MDNCOScsJ1xcdTFGQzYnOidcXHUwM0I3XFx1MDM0MicsJ1xcdTFGQzcnOidcXHUwM0I3XFx1MDM0MlxcdTAzQjknLCdcXHUxRkNDJzonXFx1MDNCN1xcdTAzQjknLCdcXHUxRkQyJzonXFx1MDNCOVxcdTAzMDhcXHUwMzAwJywnXFx1MUZEMyc6J1xcdTAzQjlcXHUwMzA4XFx1MDMwMScsJ1xcdTFGRDYnOidcXHUwM0I5XFx1MDM0MicsJ1xcdTFGRDcnOidcXHUwM0I5XFx1MDMwOFxcdTAzNDInLCdcXHUxRkUyJzonXFx1MDNDNVxcdTAzMDhcXHUwMzAwJywnXFx1MUZFMyc6J1xcdTAzQzVcXHUwMzA4XFx1MDMwMScsJ1xcdTFGRTQnOidcXHUwM0MxXFx1MDMxMycsJ1xcdTFGRTYnOidcXHUwM0M1XFx1MDM0MicsJ1xcdTFGRTcnOidcXHUwM0M1XFx1MDMwOFxcdTAzNDInLCdcXHUxRkYyJzonXFx1MUY3Q1xcdTAzQjknLCdcXHUxRkYzJzonXFx1MDNDOVxcdTAzQjknLCdcXHUxRkY0JzonXFx1MDNDRVxcdTAzQjknLCdcXHUxRkY2JzonXFx1MDNDOVxcdTAzNDInLCdcXHUxRkY3JzonXFx1MDNDOVxcdTAzNDJcXHUwM0I5JywnXFx1MUZGQyc6J1xcdTAzQzlcXHUwM0I5JywnXFx1RkIwMCc6J2ZmJywnXFx1RkIwMSc6J2ZpJywnXFx1RkIwMic6J2ZsJywnXFx1RkIwMyc6J2ZmaScsJ1xcdUZCMDQnOidmZmwnLCdcXHVGQjA1Jzonc3QnLCdcXHVGQjA2Jzonc3QnLCdcXHVGQjEzJzonXFx1MDU3NFxcdTA1NzYnLCdcXHVGQjE0JzonXFx1MDU3NFxcdTA1NjUnLCdcXHVGQjE1JzonXFx1MDU3NFxcdTA1NkInLCdcXHVGQjE2JzonXFx1MDU3RVxcdTA1NzYnLCdcXHVGQjE3JzonXFx1MDU3NFxcdTA1NkQnfTtcblxuLy8gTm9ybWFsaXplIHJlZmVyZW5jZSBsYWJlbDogY29sbGFwc2UgaW50ZXJuYWwgd2hpdGVzcGFjZVxuLy8gdG8gc2luZ2xlIHNwYWNlLCByZW1vdmUgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXNlIGZvbGQuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcuc2xpY2UoMSwgc3RyaW5nLmxlbmd0aCAtIDEpLnRyaW0oKS5yZXBsYWNlKHJlZ2V4LCBmdW5jdGlvbigkMCkge1xuICAgICAgICAvLyBOb3RlOiB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGBoYXNPd25Qcm9wZXJ0eSgkMClgIGhlcmUuXG4gICAgICAgIC8vIElmIGNoYXJhY3RlciBub3QgZm91bmQgaW4gbG9va3VwIHRhYmxlLCBpdCBtdXN0IGJlIHdoaXRlc3BhY2UuXG4gICAgICAgIHJldHVybiBtYXBbJDBdIHx8ICcgJztcbiAgICB9KTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29tbW9ubWFyay9saWIvbm9ybWFsaXplLXJlZmVyZW5jZS5qc1xuLy8gbW9kdWxlIGlkID0gNDI3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 428 */
/***/ function(module, exports) {

    eval("\"use strict\";\n\n// derived from https://github.com/mathiasbynens/String.fromCodePoint\n/*! http://mths.be/fromcodepoint v0.2.1 by @mathias */\nif (String.fromCodePoint) {\n    module.exports = function (_) {\n        try {\n            return String.fromCodePoint(_);\n        } catch (e) {\n            if (e instanceof RangeError) {\n                return String.fromCharCode(0xFFFD);\n            }\n            throw e;\n        }\n    };\n\n} else {\n\n  var stringFromCharCode = String.fromCharCode;\n  var floor = Math.floor;\n  var fromCodePoint = function() {\n      var MAX_SIZE = 0x4000;\n      var codeUnits = [];\n      var highSurrogate;\n      var lowSurrogate;\n      var index = -1;\n      var length = arguments.length;\n      if (!length) {\n          return '';\n      }\n      var result = '';\n      while (++index < length) {\n          var codePoint = Number(arguments[index]);\n          if (\n              !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`\n                  codePoint < 0 || // not a valid Unicode code point\n                  codePoint > 0x10FFFF || // not a valid Unicode code point\n                  floor(codePoint) !== codePoint // not an integer\n          ) {\n              return String.fromCharCode(0xFFFD);\n          }\n          if (codePoint <= 0xFFFF) { // BMP code point\n              codeUnits.push(codePoint);\n          } else { // Astral code point; split in surrogate halves\n              // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n              codePoint -= 0x10000;\n              highSurrogate = (codePoint >> 10) + 0xD800;\n              lowSurrogate = (codePoint % 0x400) + 0xDC00;\n              codeUnits.push(highSurrogate, lowSurrogate);\n          }\n          if (index + 1 === length || codeUnits.length > MAX_SIZE) {\n              result += stringFromCharCode.apply(null, codeUnits);\n              codeUnits.length = 0;\n          }\n      }\n      return result;\n  };\n  module.exports = fromCodePoint;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDI4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9jb21tb25tYXJrL2xpYi9mcm9tLWNvZGUtcG9pbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIGRlcml2ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcuZnJvbUNvZGVQb2ludFxuLyohIGh0dHA6Ly9tdGhzLmJlL2Zyb21jb2RlcG9pbnQgdjAuMi4xIGJ5IEBtYXRoaWFzICovXG5pZiAoU3RyaW5nLmZyb21Db2RlUG9pbnQpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChfKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQoXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RkZGRCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfTtcblxufSBlbHNlIHtcblxuICB2YXIgc3RyaW5nRnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbiAgdmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbiAgdmFyIGZyb21Db2RlUG9pbnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBNQVhfU0laRSA9IDB4NDAwMDtcbiAgICAgIHZhciBjb2RlVW5pdHMgPSBbXTtcbiAgICAgIHZhciBoaWdoU3Vycm9nYXRlO1xuICAgICAgdmFyIGxvd1N1cnJvZ2F0ZTtcbiAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGNvZGVQb2ludCA9IE51bWJlcihhcmd1bWVudHNbaW5kZXhdKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICFpc0Zpbml0ZShjb2RlUG9pbnQpIHx8IC8vIGBOYU5gLCBgK0luZmluaXR5YCwgb3IgYC1JbmZpbml0eWBcbiAgICAgICAgICAgICAgICAgIGNvZGVQb2ludCA8IDAgfHwgLy8gbm90IGEgdmFsaWQgVW5pY29kZSBjb2RlIHBvaW50XG4gICAgICAgICAgICAgICAgICBjb2RlUG9pbnQgPiAweDEwRkZGRiB8fCAvLyBub3QgYSB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnRcbiAgICAgICAgICAgICAgICAgIGZsb29yKGNvZGVQb2ludCkgIT09IGNvZGVQb2ludCAvLyBub3QgYW4gaW50ZWdlclxuICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgweEZGRkQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29kZVBvaW50IDw9IDB4RkZGRikgeyAvLyBCTVAgY29kZSBwb2ludFxuICAgICAgICAgICAgICBjb2RlVW5pdHMucHVzaChjb2RlUG9pbnQpO1xuICAgICAgICAgIH0gZWxzZSB7IC8vIEFzdHJhbCBjb2RlIHBvaW50OyBzcGxpdCBpbiBzdXJyb2dhdGUgaGFsdmVzXG4gICAgICAgICAgICAgIC8vIGh0dHA6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmcjc3Vycm9nYXRlLWZvcm11bGFlXG4gICAgICAgICAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwO1xuICAgICAgICAgICAgICBoaWdoU3Vycm9nYXRlID0gKGNvZGVQb2ludCA+PiAxMCkgKyAweEQ4MDA7XG4gICAgICAgICAgICAgIGxvd1N1cnJvZ2F0ZSA9IChjb2RlUG9pbnQgJSAweDQwMCkgKyAweERDMDA7XG4gICAgICAgICAgICAgIGNvZGVVbml0cy5wdXNoKGhpZ2hTdXJyb2dhdGUsIGxvd1N1cnJvZ2F0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpbmRleCArIDEgPT09IGxlbmd0aCB8fCBjb2RlVW5pdHMubGVuZ3RoID4gTUFYX1NJWkUpIHtcbiAgICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZS5hcHBseShudWxsLCBjb2RlVW5pdHMpO1xuICAgICAgICAgICAgICBjb2RlVW5pdHMubGVuZ3RoID0gMDtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBtb2R1bGUuZXhwb3J0cyA9IGZyb21Db2RlUG9pbnQ7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29tbW9ubWFyay9saWIvZnJvbS1jb2RlLXBvaW50LmpzXG4vLyBtb2R1bGUgaWQgPSA0Mjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 429 */
/***/ function(module, exports) {

    eval("/*! http://mths.be/repeat v0.2.0 by @mathias */\nif (!String.prototype.repeat) {\n\t(function() {\n\t\t'use strict'; // needed to support `apply`/`call` with `undefined`/`null`\n\t\tvar defineProperty = (function() {\n\t\t\t// IE 8 only supports `Object.defineProperty` on DOM elements\n\t\t\ttry {\n\t\t\t\tvar object = {};\n\t\t\t\tvar $defineProperty = Object.defineProperty;\n\t\t\t\tvar result = $defineProperty(object, object, object) && $defineProperty;\n\t\t\t} catch(error) {}\n\t\t\treturn result;\n\t\t}());\n\t\tvar repeat = function(count) {\n\t\t\tif (this == null) {\n\t\t\t\tthrow TypeError();\n\t\t\t}\n\t\t\tvar string = String(this);\n\t\t\t// `ToInteger`\n\t\t\tvar n = count ? Number(count) : 0;\n\t\t\tif (n != n) { // better `isNaN`\n\t\t\t\tn = 0;\n\t\t\t}\n\t\t\t// Account for out-of-bounds indices\n\t\t\tif (n < 0 || n == Infinity) {\n\t\t\t\tthrow RangeError();\n\t\t\t}\n\t\t\tvar result = '';\n\t\t\twhile (n) {\n\t\t\t\tif (n % 2 == 1) {\n\t\t\t\t\tresult += string;\n\t\t\t\t}\n\t\t\t\tif (n > 1) {\n\t\t\t\t\tstring += string;\n\t\t\t\t}\n\t\t\t\tn >>= 1;\n\t\t\t}\n\t\t\treturn result;\n\t\t};\n\t\tif (defineProperty) {\n\t\t\tdefineProperty(String.prototype, 'repeat', {\n\t\t\t\t'value': repeat,\n\t\t\t\t'configurable': true,\n\t\t\t\t'writable': true\n\t\t\t});\n\t\t} else {\n\t\t\tString.prototype.repeat = repeat;\n\t\t}\n\t}());\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDI5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zdHJpbmcucHJvdG90eXBlLnJlcGVhdC9yZXBlYXQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohIGh0dHA6Ly9tdGhzLmJlL3JlcGVhdCB2MC4yLjAgYnkgQG1hdGhpYXMgKi9cbmlmICghU3RyaW5nLnByb3RvdHlwZS5yZXBlYXQpIHtcblx0KGZ1bmN0aW9uKCkge1xuXHRcdCd1c2Ugc3RyaWN0JzsgLy8gbmVlZGVkIHRvIHN1cHBvcnQgYGFwcGx5YC9gY2FsbGAgd2l0aCBgdW5kZWZpbmVkYC9gbnVsbGBcblx0XHR2YXIgZGVmaW5lUHJvcGVydHkgPSAoZnVuY3Rpb24oKSB7XG5cdFx0XHQvLyBJRSA4IG9ubHkgc3VwcG9ydHMgYE9iamVjdC5kZWZpbmVQcm9wZXJ0eWAgb24gRE9NIGVsZW1lbnRzXG5cdFx0XHR0cnkge1xuXHRcdFx0XHR2YXIgb2JqZWN0ID0ge307XG5cdFx0XHRcdHZhciAkZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cdFx0XHRcdHZhciByZXN1bHQgPSAkZGVmaW5lUHJvcGVydHkob2JqZWN0LCBvYmplY3QsIG9iamVjdCkgJiYgJGRlZmluZVByb3BlcnR5O1xuXHRcdFx0fSBjYXRjaChlcnJvcikge31cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fSgpKTtcblx0XHR2YXIgcmVwZWF0ID0gZnVuY3Rpb24oY291bnQpIHtcblx0XHRcdGlmICh0aGlzID09IG51bGwpIHtcblx0XHRcdFx0dGhyb3cgVHlwZUVycm9yKCk7XG5cdFx0XHR9XG5cdFx0XHR2YXIgc3RyaW5nID0gU3RyaW5nKHRoaXMpO1xuXHRcdFx0Ly8gYFRvSW50ZWdlcmBcblx0XHRcdHZhciBuID0gY291bnQgPyBOdW1iZXIoY291bnQpIDogMDtcblx0XHRcdGlmIChuICE9IG4pIHsgLy8gYmV0dGVyIGBpc05hTmBcblx0XHRcdFx0biA9IDA7XG5cdFx0XHR9XG5cdFx0XHQvLyBBY2NvdW50IGZvciBvdXQtb2YtYm91bmRzIGluZGljZXNcblx0XHRcdGlmIChuIDwgMCB8fCBuID09IEluZmluaXR5KSB7XG5cdFx0XHRcdHRocm93IFJhbmdlRXJyb3IoKTtcblx0XHRcdH1cblx0XHRcdHZhciByZXN1bHQgPSAnJztcblx0XHRcdHdoaWxlIChuKSB7XG5cdFx0XHRcdGlmIChuICUgMiA9PSAxKSB7XG5cdFx0XHRcdFx0cmVzdWx0ICs9IHN0cmluZztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobiA+IDEpIHtcblx0XHRcdFx0XHRzdHJpbmcgKz0gc3RyaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG4gPj49IDE7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH07XG5cdFx0aWYgKGRlZmluZVByb3BlcnR5KSB7XG5cdFx0XHRkZWZpbmVQcm9wZXJ0eShTdHJpbmcucHJvdG90eXBlLCAncmVwZWF0Jywge1xuXHRcdFx0XHQndmFsdWUnOiByZXBlYXQsXG5cdFx0XHRcdCdjb25maWd1cmFibGUnOiB0cnVlLFxuXHRcdFx0XHQnd3JpdGFibGUnOiB0cnVlXG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0U3RyaW5nLnByb3RvdHlwZS5yZXBlYXQgPSByZXBlYXQ7XG5cdFx0fVxuXHR9KCkpO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3N0cmluZy5wcm90b3R5cGUucmVwZWF0L3JlcGVhdC5qc1xuLy8gbW9kdWxlIGlkID0gNDI5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 430 */
/***/ function(module, exports, __webpack_require__) {

    eval("\"use strict\";\n\nvar Renderer = __webpack_require__(431);\n\nvar esc = __webpack_require__(415).escapeXml;\n\nvar reUnsafeProtocol = /^javascript:|vbscript:|file:|data:/i;\nvar reSafeDataProtocol = /^data:image\\/(?:png|gif|jpeg|webp)/i;\n\nvar potentiallyUnsafe = function(url) {\n    return reUnsafeProtocol.test(url) &&\n        !reSafeDataProtocol.test(url);\n};\n\n// Helper function to produce an HTML tag.\nfunction tag(name, attrs, selfclosing) {\n    if (this.disableTags > 0) {\n        return;\n    }\n    this.buffer += ('<' + name);\n    if (attrs && attrs.length > 0) {\n        var i = 0;\n        var attrib;\n        while ((attrib = attrs[i]) !== undefined) {\n            this.buffer += (' ' + attrib[0] + '=\"' + attrib[1] + '\"');\n            i++;\n        }\n    }\n    if (selfclosing) {\n        this.buffer += ' /';\n    }\n    this.buffer += '>';\n    this.lastOut = '>';\n}\n\n\nfunction HtmlRenderer(options) {\n  options = options || {};\n  // by default, soft breaks are rendered as newlines in HTML\n  options.softbreak = options.softbreak || '\\n';\n  // set to \"<br />\" to make them hard breaks\n  // set to \" \" if you want to ignore line wrapping in source\n\n  this.disableTags = 0;\n  this.lastOut = \"\\n\";\n  this.options = options;\n}\n\n/* Node methods */\n\nfunction text(node) {\n  this.out(node.literal);\n}\n\nfunction softbreak() {\n  this.lit(this.options.softbreak);\n}\n\nfunction linebreak() {\n  this.tag('br', [], true);\n  this.cr();\n}\n\nfunction link(node, entering) {\n  var attrs = this.attrs(node);\n  if (entering) {\n      if (!(this.options.safe && potentiallyUnsafe(node.destination))) {\n          attrs.push(['href', esc(node.destination, true)]);\n      }\n      if (node.title) {\n          attrs.push(['title', esc(node.title, true)]);\n      }\n      this.tag('a', attrs);\n  } else {\n      this.tag('/a');\n  }\n}\n\nfunction image(node, entering) {\n  if (entering) {\n      if (this.disableTags === 0) {\n          if (this.options.safe &&\n               potentiallyUnsafe(node.destination)) {\n              this.lit('<img src=\"\" alt=\"');\n          } else {\n              this.lit('<img src=\"' + esc(node.destination, true) +\n                  '\" alt=\"');\n          }\n      }\n      this.disableTags += 1;\n  } else {\n      this.disableTags -= 1;\n      if (this.disableTags === 0) {\n          if (node.title) {\n              this.lit('\" title=\"' + esc(node.title, true));\n          }\n          this.lit('\" />');\n      }\n  }\n}\n\nfunction emph(node, entering) {\n  this.tag(entering ? 'em' : '/em');\n}\n\nfunction strong(node, entering) {\n  this.tag(entering ? 'strong' : '/strong');\n}\n\nfunction paragraph(node, entering) {\n  var grandparent = node.parent.parent\n    , attrs = this.attrs(node);\n  if (grandparent !== null &&\n      grandparent.type === 'list') {\n      if (grandparent.listTight) {\n          return;\n      }\n  }\n  if (entering) {\n      this.cr();\n      this.tag('p', attrs);\n  } else {\n      this.tag('/p');\n      this.cr();\n  }\n}\n\nfunction heading(node, entering) {\n  var tagname = 'h' + node.level\n    , attrs = this.attrs(node);\n  if (entering) {\n      this.cr();\n      this.tag(tagname, attrs);\n  } else {\n      this.tag('/' + tagname);\n      this.cr();\n  }\n}\n\nfunction code(node) {\n  this.tag('code');\n  this.out(node.literal);\n  this.tag('/code');\n}\n\nfunction code_block(node) {\n  var info_words = node.info ? node.info.split(/\\s+/) : []\n    , attrs = this.attrs(node);\n  if (info_words.length > 0 && info_words[0].length > 0) {\n      attrs.push(['class', 'language-' + esc(info_words[0], true)]);\n  }\n  this.cr();\n  this.tag('pre');\n  this.tag('code', attrs);\n  this.out(node.literal);\n  this.tag('/code');\n  this.tag('/pre');\n  this.cr();\n}\n\nfunction thematic_break(node) {\n  var attrs = this.attrs(node);\n  this.cr();\n  this.tag('hr', attrs, true);\n  this.cr();\n}\n\nfunction block_quote(node, entering) {\n  var attrs = this.attrs(node);\n  if (entering) {\n      this.cr();\n      this.tag('blockquote', attrs);\n      this.cr();\n  } else {\n      this.cr();\n      this.tag('/blockquote');\n      this.cr();\n  }\n}\n\nfunction list(node, entering) {\n  var tagname = node.listType === 'bullet' ? 'ul' : 'ol'\n    , attrs = this.attrs(node);\n\n  if (entering) {\n      var start = node.listStart;\n      if (start !== null && start !== 1) {\n          attrs.push(['start', start.toString()]);\n      }\n      this.cr();\n      this.tag(tagname, attrs);\n      this.cr();\n  } else {\n      this.cr();\n      this.tag('/' + tagname);\n      this.cr();\n  }\n}\n\nfunction item(node, entering) {\n  var attrs = this.attrs(node);\n  if (entering) {\n      this.tag('li', attrs);\n  } else {\n      this.tag('/li');\n      this.cr();\n  }\n}\n\nfunction html_inline(node) {\n  if (this.options.safe) {\n      this.lit('<!-- raw HTML omitted -->');\n  } else {\n      this.lit(node.literal);\n  }\n}\n\nfunction html_block(node) {\n  this.cr();\n  if (this.options.safe) {\n      this.lit('<!-- raw HTML omitted -->');\n  } else {\n      this.lit(node.literal);\n  }\n  this.cr();\n}\n\nfunction custom_inline(node, entering) {\n  if (entering && node.onEnter) {\n      this.lit(node.onEnter);\n  } else if (!entering && node.onExit) {\n      this.lit(node.onExit);\n  }\n}\n\nfunction custom_block(node, entering) {\n  this.cr();\n  if (entering && node.onEnter) {\n      this.lit(node.onEnter);\n  } else if (!entering && node.onExit) {\n      this.lit(node.onExit);\n  }\n  this.cr();\n}\n\n/* Helper methods */\n\nfunction out(s) {\n  this.lit(esc(s, false));\n}\n\nfunction attrs (node) {\n  var att = [];\n  if (this.options.sourcepos) {\n      var pos = node.sourcepos;\n      if (pos) {\n          att.push(['data-sourcepos', String(pos[0][0]) + ':' +\n                      String(pos[0][1]) + '-' + String(pos[1][0]) + ':' +\n                      String(pos[1][1])]);\n      }\n  }\n  return att;\n}\n\n// quick browser-compatible inheritance\nHtmlRenderer.prototype = Object.create(Renderer.prototype);\n\nHtmlRenderer.prototype.text = text;\nHtmlRenderer.prototype.html_inline = html_inline;\nHtmlRenderer.prototype.html_block = html_block;\nHtmlRenderer.prototype.softbreak = softbreak;\nHtmlRenderer.prototype.linebreak = linebreak;\nHtmlRenderer.prototype.link = link;\nHtmlRenderer.prototype.image = image;\nHtmlRenderer.prototype.emph = emph;\nHtmlRenderer.prototype.strong = strong;\nHtmlRenderer.prototype.paragraph = paragraph;\nHtmlRenderer.prototype.heading = heading;\nHtmlRenderer.prototype.code = code;\nHtmlRenderer.prototype.code_block = code_block;\nHtmlRenderer.prototype.thematic_break = thematic_break;\nHtmlRenderer.prototype.block_quote = block_quote;\nHtmlRenderer.prototype.list = list;\nHtmlRenderer.prototype.item = item;\nHtmlRenderer.prototype.custom_inline = custom_inline;\nHtmlRenderer.prototype.custom_block = custom_block;\n\nHtmlRenderer.prototype.out = out;\nHtmlRenderer.prototype.tag = tag;\nHtmlRenderer.prototype.attrs = attrs;\n\nmodule.exports = HtmlRenderer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9jb21tb25tYXJrL2xpYi9yZW5kZXIvaHRtbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxudmFyIFJlbmRlcmVyID0gcmVxdWlyZSgnLi9yZW5kZXJlcicpO1xuXG52YXIgZXNjID0gcmVxdWlyZSgnLi4vY29tbW9uJykuZXNjYXBlWG1sO1xuXG52YXIgcmVVbnNhZmVQcm90b2NvbCA9IC9eamF2YXNjcmlwdDp8dmJzY3JpcHQ6fGZpbGU6fGRhdGE6L2k7XG52YXIgcmVTYWZlRGF0YVByb3RvY29sID0gL15kYXRhOmltYWdlXFwvKD86cG5nfGdpZnxqcGVnfHdlYnApL2k7XG5cbnZhciBwb3RlbnRpYWxseVVuc2FmZSA9IGZ1bmN0aW9uKHVybCkge1xuICAgIHJldHVybiByZVVuc2FmZVByb3RvY29sLnRlc3QodXJsKSAmJlxuICAgICAgICAhcmVTYWZlRGF0YVByb3RvY29sLnRlc3QodXJsKTtcbn07XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBwcm9kdWNlIGFuIEhUTUwgdGFnLlxuZnVuY3Rpb24gdGFnKG5hbWUsIGF0dHJzLCBzZWxmY2xvc2luZykge1xuICAgIGlmICh0aGlzLmRpc2FibGVUYWdzID4gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYnVmZmVyICs9ICgnPCcgKyBuYW1lKTtcbiAgICBpZiAoYXR0cnMgJiYgYXR0cnMubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIHZhciBhdHRyaWI7XG4gICAgICAgIHdoaWxlICgoYXR0cmliID0gYXR0cnNbaV0pICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyICs9ICgnICcgKyBhdHRyaWJbMF0gKyAnPVwiJyArIGF0dHJpYlsxXSArICdcIicpO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChzZWxmY2xvc2luZykge1xuICAgICAgICB0aGlzLmJ1ZmZlciArPSAnIC8nO1xuICAgIH1cbiAgICB0aGlzLmJ1ZmZlciArPSAnPic7XG4gICAgdGhpcy5sYXN0T3V0ID0gJz4nO1xufVxuXG5cbmZ1bmN0aW9uIEh0bWxSZW5kZXJlcihvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAvLyBieSBkZWZhdWx0LCBzb2Z0IGJyZWFrcyBhcmUgcmVuZGVyZWQgYXMgbmV3bGluZXMgaW4gSFRNTFxuICBvcHRpb25zLnNvZnRicmVhayA9IG9wdGlvbnMuc29mdGJyZWFrIHx8ICdcXG4nO1xuICAvLyBzZXQgdG8gXCI8YnIgLz5cIiB0byBtYWtlIHRoZW0gaGFyZCBicmVha3NcbiAgLy8gc2V0IHRvIFwiIFwiIGlmIHlvdSB3YW50IHRvIGlnbm9yZSBsaW5lIHdyYXBwaW5nIGluIHNvdXJjZVxuXG4gIHRoaXMuZGlzYWJsZVRhZ3MgPSAwO1xuICB0aGlzLmxhc3RPdXQgPSBcIlxcblwiO1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xufVxuXG4vKiBOb2RlIG1ldGhvZHMgKi9cblxuZnVuY3Rpb24gdGV4dChub2RlKSB7XG4gIHRoaXMub3V0KG5vZGUubGl0ZXJhbCk7XG59XG5cbmZ1bmN0aW9uIHNvZnRicmVhaygpIHtcbiAgdGhpcy5saXQodGhpcy5vcHRpb25zLnNvZnRicmVhayk7XG59XG5cbmZ1bmN0aW9uIGxpbmVicmVhaygpIHtcbiAgdGhpcy50YWcoJ2JyJywgW10sIHRydWUpO1xuICB0aGlzLmNyKCk7XG59XG5cbmZ1bmN0aW9uIGxpbmsobm9kZSwgZW50ZXJpbmcpIHtcbiAgdmFyIGF0dHJzID0gdGhpcy5hdHRycyhub2RlKTtcbiAgaWYgKGVudGVyaW5nKSB7XG4gICAgICBpZiAoISh0aGlzLm9wdGlvbnMuc2FmZSAmJiBwb3RlbnRpYWxseVVuc2FmZShub2RlLmRlc3RpbmF0aW9uKSkpIHtcbiAgICAgICAgICBhdHRycy5wdXNoKFsnaHJlZicsIGVzYyhub2RlLmRlc3RpbmF0aW9uLCB0cnVlKV0pO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUudGl0bGUpIHtcbiAgICAgICAgICBhdHRycy5wdXNoKFsndGl0bGUnLCBlc2Mobm9kZS50aXRsZSwgdHJ1ZSldKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudGFnKCdhJywgYXR0cnMpO1xuICB9IGVsc2Uge1xuICAgICAgdGhpcy50YWcoJy9hJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW1hZ2Uobm9kZSwgZW50ZXJpbmcpIHtcbiAgaWYgKGVudGVyaW5nKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlVGFncyA9PT0gMCkge1xuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2FmZSAmJlxuICAgICAgICAgICAgICAgcG90ZW50aWFsbHlVbnNhZmUobm9kZS5kZXN0aW5hdGlvbikpIHtcbiAgICAgICAgICAgICAgdGhpcy5saXQoJzxpbWcgc3JjPVwiXCIgYWx0PVwiJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5saXQoJzxpbWcgc3JjPVwiJyArIGVzYyhub2RlLmRlc3RpbmF0aW9uLCB0cnVlKSArXG4gICAgICAgICAgICAgICAgICAnXCIgYWx0PVwiJyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5kaXNhYmxlVGFncyArPSAxO1xuICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlVGFncyAtPSAxO1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZVRhZ3MgPT09IDApIHtcbiAgICAgICAgICBpZiAobm9kZS50aXRsZSkge1xuICAgICAgICAgICAgICB0aGlzLmxpdCgnXCIgdGl0bGU9XCInICsgZXNjKG5vZGUudGl0bGUsIHRydWUpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5saXQoJ1wiIC8+Jyk7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1waChub2RlLCBlbnRlcmluZykge1xuICB0aGlzLnRhZyhlbnRlcmluZyA/ICdlbScgOiAnL2VtJyk7XG59XG5cbmZ1bmN0aW9uIHN0cm9uZyhub2RlLCBlbnRlcmluZykge1xuICB0aGlzLnRhZyhlbnRlcmluZyA/ICdzdHJvbmcnIDogJy9zdHJvbmcnKTtcbn1cblxuZnVuY3Rpb24gcGFyYWdyYXBoKG5vZGUsIGVudGVyaW5nKSB7XG4gIHZhciBncmFuZHBhcmVudCA9IG5vZGUucGFyZW50LnBhcmVudFxuICAgICwgYXR0cnMgPSB0aGlzLmF0dHJzKG5vZGUpO1xuICBpZiAoZ3JhbmRwYXJlbnQgIT09IG51bGwgJiZcbiAgICAgIGdyYW5kcGFyZW50LnR5cGUgPT09ICdsaXN0Jykge1xuICAgICAgaWYgKGdyYW5kcGFyZW50Lmxpc3RUaWdodCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgfVxuICBpZiAoZW50ZXJpbmcpIHtcbiAgICAgIHRoaXMuY3IoKTtcbiAgICAgIHRoaXMudGFnKCdwJywgYXR0cnMpO1xuICB9IGVsc2Uge1xuICAgICAgdGhpcy50YWcoJy9wJyk7XG4gICAgICB0aGlzLmNyKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGVhZGluZyhub2RlLCBlbnRlcmluZykge1xuICB2YXIgdGFnbmFtZSA9ICdoJyArIG5vZGUubGV2ZWxcbiAgICAsIGF0dHJzID0gdGhpcy5hdHRycyhub2RlKTtcbiAgaWYgKGVudGVyaW5nKSB7XG4gICAgICB0aGlzLmNyKCk7XG4gICAgICB0aGlzLnRhZyh0YWduYW1lLCBhdHRycyk7XG4gIH0gZWxzZSB7XG4gICAgICB0aGlzLnRhZygnLycgKyB0YWduYW1lKTtcbiAgICAgIHRoaXMuY3IoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2RlKG5vZGUpIHtcbiAgdGhpcy50YWcoJ2NvZGUnKTtcbiAgdGhpcy5vdXQobm9kZS5saXRlcmFsKTtcbiAgdGhpcy50YWcoJy9jb2RlJyk7XG59XG5cbmZ1bmN0aW9uIGNvZGVfYmxvY2sobm9kZSkge1xuICB2YXIgaW5mb193b3JkcyA9IG5vZGUuaW5mbyA/IG5vZGUuaW5mby5zcGxpdCgvXFxzKy8pIDogW11cbiAgICAsIGF0dHJzID0gdGhpcy5hdHRycyhub2RlKTtcbiAgaWYgKGluZm9fd29yZHMubGVuZ3RoID4gMCAmJiBpbmZvX3dvcmRzWzBdLmxlbmd0aCA+IDApIHtcbiAgICAgIGF0dHJzLnB1c2goWydjbGFzcycsICdsYW5ndWFnZS0nICsgZXNjKGluZm9fd29yZHNbMF0sIHRydWUpXSk7XG4gIH1cbiAgdGhpcy5jcigpO1xuICB0aGlzLnRhZygncHJlJyk7XG4gIHRoaXMudGFnKCdjb2RlJywgYXR0cnMpO1xuICB0aGlzLm91dChub2RlLmxpdGVyYWwpO1xuICB0aGlzLnRhZygnL2NvZGUnKTtcbiAgdGhpcy50YWcoJy9wcmUnKTtcbiAgdGhpcy5jcigpO1xufVxuXG5mdW5jdGlvbiB0aGVtYXRpY19icmVhayhub2RlKSB7XG4gIHZhciBhdHRycyA9IHRoaXMuYXR0cnMobm9kZSk7XG4gIHRoaXMuY3IoKTtcbiAgdGhpcy50YWcoJ2hyJywgYXR0cnMsIHRydWUpO1xuICB0aGlzLmNyKCk7XG59XG5cbmZ1bmN0aW9uIGJsb2NrX3F1b3RlKG5vZGUsIGVudGVyaW5nKSB7XG4gIHZhciBhdHRycyA9IHRoaXMuYXR0cnMobm9kZSk7XG4gIGlmIChlbnRlcmluZykge1xuICAgICAgdGhpcy5jcigpO1xuICAgICAgdGhpcy50YWcoJ2Jsb2NrcXVvdGUnLCBhdHRycyk7XG4gICAgICB0aGlzLmNyKCk7XG4gIH0gZWxzZSB7XG4gICAgICB0aGlzLmNyKCk7XG4gICAgICB0aGlzLnRhZygnL2Jsb2NrcXVvdGUnKTtcbiAgICAgIHRoaXMuY3IoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsaXN0KG5vZGUsIGVudGVyaW5nKSB7XG4gIHZhciB0YWduYW1lID0gbm9kZS5saXN0VHlwZSA9PT0gJ2J1bGxldCcgPyAndWwnIDogJ29sJ1xuICAgICwgYXR0cnMgPSB0aGlzLmF0dHJzKG5vZGUpO1xuXG4gIGlmIChlbnRlcmluZykge1xuICAgICAgdmFyIHN0YXJ0ID0gbm9kZS5saXN0U3RhcnQ7XG4gICAgICBpZiAoc3RhcnQgIT09IG51bGwgJiYgc3RhcnQgIT09IDEpIHtcbiAgICAgICAgICBhdHRycy5wdXNoKFsnc3RhcnQnLCBzdGFydC50b1N0cmluZygpXSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNyKCk7XG4gICAgICB0aGlzLnRhZyh0YWduYW1lLCBhdHRycyk7XG4gICAgICB0aGlzLmNyKCk7XG4gIH0gZWxzZSB7XG4gICAgICB0aGlzLmNyKCk7XG4gICAgICB0aGlzLnRhZygnLycgKyB0YWduYW1lKTtcbiAgICAgIHRoaXMuY3IoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpdGVtKG5vZGUsIGVudGVyaW5nKSB7XG4gIHZhciBhdHRycyA9IHRoaXMuYXR0cnMobm9kZSk7XG4gIGlmIChlbnRlcmluZykge1xuICAgICAgdGhpcy50YWcoJ2xpJywgYXR0cnMpO1xuICB9IGVsc2Uge1xuICAgICAgdGhpcy50YWcoJy9saScpO1xuICAgICAgdGhpcy5jcigpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGh0bWxfaW5saW5lKG5vZGUpIHtcbiAgaWYgKHRoaXMub3B0aW9ucy5zYWZlKSB7XG4gICAgICB0aGlzLmxpdCgnPCEtLSByYXcgSFRNTCBvbWl0dGVkIC0tPicpO1xuICB9IGVsc2Uge1xuICAgICAgdGhpcy5saXQobm9kZS5saXRlcmFsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBodG1sX2Jsb2NrKG5vZGUpIHtcbiAgdGhpcy5jcigpO1xuICBpZiAodGhpcy5vcHRpb25zLnNhZmUpIHtcbiAgICAgIHRoaXMubGl0KCc8IS0tIHJhdyBIVE1MIG9taXR0ZWQgLS0+Jyk7XG4gIH0gZWxzZSB7XG4gICAgICB0aGlzLmxpdChub2RlLmxpdGVyYWwpO1xuICB9XG4gIHRoaXMuY3IoKTtcbn1cblxuZnVuY3Rpb24gY3VzdG9tX2lubGluZShub2RlLCBlbnRlcmluZykge1xuICBpZiAoZW50ZXJpbmcgJiYgbm9kZS5vbkVudGVyKSB7XG4gICAgICB0aGlzLmxpdChub2RlLm9uRW50ZXIpO1xuICB9IGVsc2UgaWYgKCFlbnRlcmluZyAmJiBub2RlLm9uRXhpdCkge1xuICAgICAgdGhpcy5saXQobm9kZS5vbkV4aXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGN1c3RvbV9ibG9jayhub2RlLCBlbnRlcmluZykge1xuICB0aGlzLmNyKCk7XG4gIGlmIChlbnRlcmluZyAmJiBub2RlLm9uRW50ZXIpIHtcbiAgICAgIHRoaXMubGl0KG5vZGUub25FbnRlcik7XG4gIH0gZWxzZSBpZiAoIWVudGVyaW5nICYmIG5vZGUub25FeGl0KSB7XG4gICAgICB0aGlzLmxpdChub2RlLm9uRXhpdCk7XG4gIH1cbiAgdGhpcy5jcigpO1xufVxuXG4vKiBIZWxwZXIgbWV0aG9kcyAqL1xuXG5mdW5jdGlvbiBvdXQocykge1xuICB0aGlzLmxpdChlc2MocywgZmFsc2UpKTtcbn1cblxuZnVuY3Rpb24gYXR0cnMgKG5vZGUpIHtcbiAgdmFyIGF0dCA9IFtdO1xuICBpZiAodGhpcy5vcHRpb25zLnNvdXJjZXBvcykge1xuICAgICAgdmFyIHBvcyA9IG5vZGUuc291cmNlcG9zO1xuICAgICAgaWYgKHBvcykge1xuICAgICAgICAgIGF0dC5wdXNoKFsnZGF0YS1zb3VyY2Vwb3MnLCBTdHJpbmcocG9zWzBdWzBdKSArICc6JyArXG4gICAgICAgICAgICAgICAgICAgICAgU3RyaW5nKHBvc1swXVsxXSkgKyAnLScgKyBTdHJpbmcocG9zWzFdWzBdKSArICc6JyArXG4gICAgICAgICAgICAgICAgICAgICAgU3RyaW5nKHBvc1sxXVsxXSldKTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gYXR0O1xufVxuXG4vLyBxdWljayBicm93c2VyLWNvbXBhdGlibGUgaW5oZXJpdGFuY2Vcbkh0bWxSZW5kZXJlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFJlbmRlcmVyLnByb3RvdHlwZSk7XG5cbkh0bWxSZW5kZXJlci5wcm90b3R5cGUudGV4dCA9IHRleHQ7XG5IdG1sUmVuZGVyZXIucHJvdG90eXBlLmh0bWxfaW5saW5lID0gaHRtbF9pbmxpbmU7XG5IdG1sUmVuZGVyZXIucHJvdG90eXBlLmh0bWxfYmxvY2sgPSBodG1sX2Jsb2NrO1xuSHRtbFJlbmRlcmVyLnByb3RvdHlwZS5zb2Z0YnJlYWsgPSBzb2Z0YnJlYWs7XG5IdG1sUmVuZGVyZXIucHJvdG90eXBlLmxpbmVicmVhayA9IGxpbmVicmVhaztcbkh0bWxSZW5kZXJlci5wcm90b3R5cGUubGluayA9IGxpbms7XG5IdG1sUmVuZGVyZXIucHJvdG90eXBlLmltYWdlID0gaW1hZ2U7XG5IdG1sUmVuZGVyZXIucHJvdG90eXBlLmVtcGggPSBlbXBoO1xuSHRtbFJlbmRlcmVyLnByb3RvdHlwZS5zdHJvbmcgPSBzdHJvbmc7XG5IdG1sUmVuZGVyZXIucHJvdG90eXBlLnBhcmFncmFwaCA9IHBhcmFncmFwaDtcbkh0bWxSZW5kZXJlci5wcm90b3R5cGUuaGVhZGluZyA9IGhlYWRpbmc7XG5IdG1sUmVuZGVyZXIucHJvdG90eXBlLmNvZGUgPSBjb2RlO1xuSHRtbFJlbmRlcmVyLnByb3RvdHlwZS5jb2RlX2Jsb2NrID0gY29kZV9ibG9jaztcbkh0bWxSZW5kZXJlci5wcm90b3R5cGUudGhlbWF0aWNfYnJlYWsgPSB0aGVtYXRpY19icmVhaztcbkh0bWxSZW5kZXJlci5wcm90b3R5cGUuYmxvY2tfcXVvdGUgPSBibG9ja19xdW90ZTtcbkh0bWxSZW5kZXJlci5wcm90b3R5cGUubGlzdCA9IGxpc3Q7XG5IdG1sUmVuZGVyZXIucHJvdG90eXBlLml0ZW0gPSBpdGVtO1xuSHRtbFJlbmRlcmVyLnByb3RvdHlwZS5jdXN0b21faW5saW5lID0gY3VzdG9tX2lubGluZTtcbkh0bWxSZW5kZXJlci5wcm90b3R5cGUuY3VzdG9tX2Jsb2NrID0gY3VzdG9tX2Jsb2NrO1xuXG5IdG1sUmVuZGVyZXIucHJvdG90eXBlLm91dCA9IG91dDtcbkh0bWxSZW5kZXJlci5wcm90b3R5cGUudGFnID0gdGFnO1xuSHRtbFJlbmRlcmVyLnByb3RvdHlwZS5hdHRycyA9IGF0dHJzO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEh0bWxSZW5kZXJlcjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb21tb25tYXJrL2xpYi9yZW5kZXIvaHRtbC5qc1xuLy8gbW9kdWxlIGlkID0gNDMwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 431 */
/***/ function(module, exports) {

    eval("\"use strict\";\n\nfunction Renderer() {}\n\n/**\n *  Walks the AST and calls member methods for each Node type.\n *\n *  @param ast {Node} The root of the abstract syntax tree.\n */\nfunction render(ast) {\n  var walker = ast.walker()\n    , event\n    , type;\n\n  this.buffer = '';\n  this.lastOut = '\\n';\n\n  while((event = walker.next())) {\n    type = event.node.type;\n    if (this[type]) {\n      this[type](event.node, event.entering);\n    }\n  }\n  return this.buffer;\n}\n\n/**\n *  Concatenate a literal string to the buffer.\n *\n *  @param str {String} The string to concatenate.\n */\nfunction lit(str) {\n  this.buffer += str;\n  this.lastOut = str;\n}\n\nfunction cr() {\n    if (this.lastOut !== '\\n') {\n        this.lit('\\n');\n    }\n}\n\n/**\n *  Concatenate a string to the buffer possibly escaping the content.\n *\n *  Concrete renderer implementations should override this method.\n *\n *  @param str {String} The string to concatenate.\n */\nfunction out(str) {\n  this.lit(str);\n}\n\nRenderer.prototype.render = render;\nRenderer.prototype.out = out;\nRenderer.prototype.lit = lit;\nRenderer.prototype.cr  = cr;\n\nmodule.exports = Renderer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9jb21tb25tYXJrL2xpYi9yZW5kZXIvcmVuZGVyZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIFJlbmRlcmVyKCkge31cblxuLyoqXG4gKiAgV2Fsa3MgdGhlIEFTVCBhbmQgY2FsbHMgbWVtYmVyIG1ldGhvZHMgZm9yIGVhY2ggTm9kZSB0eXBlLlxuICpcbiAqICBAcGFyYW0gYXN0IHtOb2RlfSBUaGUgcm9vdCBvZiB0aGUgYWJzdHJhY3Qgc3ludGF4IHRyZWUuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlcihhc3QpIHtcbiAgdmFyIHdhbGtlciA9IGFzdC53YWxrZXIoKVxuICAgICwgZXZlbnRcbiAgICAsIHR5cGU7XG5cbiAgdGhpcy5idWZmZXIgPSAnJztcbiAgdGhpcy5sYXN0T3V0ID0gJ1xcbic7XG5cbiAgd2hpbGUoKGV2ZW50ID0gd2Fsa2VyLm5leHQoKSkpIHtcbiAgICB0eXBlID0gZXZlbnQubm9kZS50eXBlO1xuICAgIGlmICh0aGlzW3R5cGVdKSB7XG4gICAgICB0aGlzW3R5cGVdKGV2ZW50Lm5vZGUsIGV2ZW50LmVudGVyaW5nKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXMuYnVmZmVyO1xufVxuXG4vKipcbiAqICBDb25jYXRlbmF0ZSBhIGxpdGVyYWwgc3RyaW5nIHRvIHRoZSBidWZmZXIuXG4gKlxuICogIEBwYXJhbSBzdHIge1N0cmluZ30gVGhlIHN0cmluZyB0byBjb25jYXRlbmF0ZS5cbiAqL1xuZnVuY3Rpb24gbGl0KHN0cikge1xuICB0aGlzLmJ1ZmZlciArPSBzdHI7XG4gIHRoaXMubGFzdE91dCA9IHN0cjtcbn1cblxuZnVuY3Rpb24gY3IoKSB7XG4gICAgaWYgKHRoaXMubGFzdE91dCAhPT0gJ1xcbicpIHtcbiAgICAgICAgdGhpcy5saXQoJ1xcbicpO1xuICAgIH1cbn1cblxuLyoqXG4gKiAgQ29uY2F0ZW5hdGUgYSBzdHJpbmcgdG8gdGhlIGJ1ZmZlciBwb3NzaWJseSBlc2NhcGluZyB0aGUgY29udGVudC5cbiAqXG4gKiAgQ29uY3JldGUgcmVuZGVyZXIgaW1wbGVtZW50YXRpb25zIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC5cbiAqXG4gKiAgQHBhcmFtIHN0ciB7U3RyaW5nfSBUaGUgc3RyaW5nIHRvIGNvbmNhdGVuYXRlLlxuICovXG5mdW5jdGlvbiBvdXQoc3RyKSB7XG4gIHRoaXMubGl0KHN0cik7XG59XG5cblJlbmRlcmVyLnByb3RvdHlwZS5yZW5kZXIgPSByZW5kZXI7XG5SZW5kZXJlci5wcm90b3R5cGUub3V0ID0gb3V0O1xuUmVuZGVyZXIucHJvdG90eXBlLmxpdCA9IGxpdDtcblJlbmRlcmVyLnByb3RvdHlwZS5jciAgPSBjcjtcblxubW9kdWxlLmV4cG9ydHMgPSBSZW5kZXJlcjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb21tb25tYXJrL2xpYi9yZW5kZXIvcmVuZGVyZXIuanNcbi8vIG1vZHVsZSBpZCA9IDQzMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 432 */
/***/ function(module, exports, __webpack_require__) {

    eval("\"use strict\";\n\nvar escapeXml = __webpack_require__(415).escapeXml;\n\n// Helper function to produce an XML tag.\nvar tag = function(name, attrs, selfclosing) {\n    var result = '<' + name;\n    if (attrs && attrs.length > 0) {\n        var i = 0;\n        var attrib;\n        while ((attrib = attrs[i]) !== undefined) {\n            result += ' ' + attrib[0] + '=\"' + escapeXml(attrib[1]) + '\"';\n            i++;\n        }\n    }\n    if (selfclosing) {\n        result += ' /';\n    }\n\n    result += '>';\n    return result;\n};\n\nvar reXMLTag = /\\<[^>]*\\>/;\n\nvar toTagName = function(s) {\n    return s.replace(/([a-z])([A-Z])/g, \"$1_$2\").toLowerCase();\n};\n\nvar renderNodes = function(block) {\n\n    var attrs;\n    var tagname;\n    var walker = block.walker();\n    var event, node, entering;\n    var buffer = \"\";\n    var lastOut = \"\\n\";\n    var disableTags = 0;\n    var indentLevel = 0;\n    var indent = '  ';\n    var container;\n    var selfClosing;\n    var nodetype;\n\n    var out = function(s) {\n        if (disableTags > 0) {\n            buffer += s.replace(reXMLTag, '');\n        } else {\n            buffer += s;\n        }\n        lastOut = s;\n    };\n    var esc = this.escape;\n    var cr = function() {\n        if (lastOut !== '\\n') {\n            buffer += '\\n';\n            lastOut = '\\n';\n            for (var i = indentLevel; i > 0; i--) {\n                buffer += indent;\n            }\n        }\n    };\n\n    var options = this.options;\n\n    if (options.time) { console.time(\"rendering\"); }\n\n    buffer += '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n    buffer += '<!DOCTYPE document SYSTEM \"CommonMark.dtd\">\\n';\n\n    while ((event = walker.next())) {\n        entering = event.entering;\n        node = event.node;\n        nodetype = node.type;\n\n        container = node.isContainer;\n        selfClosing = nodetype === 'thematic_break' || nodetype === 'linebreak' ||\n            nodetype === 'softbreak';\n        tagname = toTagName(nodetype);\n\n        if (entering) {\n\n            attrs = [];\n\n            switch (nodetype) {\n            case 'document':\n                attrs.push(['xmlns', 'http://commonmark.org/xml/1.0']);\n                break;\n            case 'list':\n                if (node.listType !== null) {\n                    attrs.push(['type', node.listType.toLowerCase()]);\n                }\n                if (node.listStart !== null) {\n                    attrs.push(['start', String(node.listStart)]);\n                }\n                if (node.listTight !== null) {\n                    attrs.push(['tight', (node.listTight ? 'true' : 'false')]);\n                }\n                var delim = node.listDelimiter;\n                if (delim !== null) {\n                    var delimword = '';\n                    if (delim === '.') {\n                        delimword = 'period';\n                    } else {\n                        delimword = 'paren';\n                    }\n                    attrs.push(['delimiter', delimword]);\n                }\n                break;\n            case 'code_block':\n                if (node.info) {\n                    attrs.push(['info', node.info]);\n                }\n                break;\n            case 'heading':\n                attrs.push(['level', String(node.level)]);\n                break;\n            case 'link':\n            case 'image':\n                attrs.push(['destination', node.destination]);\n                attrs.push(['title', node.title]);\n                break;\n            case 'custom_inline':\n            case 'custom_block':\n                attrs.push(['on_enter', node.onEnter]);\n                attrs.push(['on_exit', node.onExit]);\n                break;\n            default:\n                break;\n            }\n            if (options.sourcepos) {\n                var pos = node.sourcepos;\n                if (pos) {\n                    attrs.push(['sourcepos', String(pos[0][0]) + ':' +\n                                String(pos[0][1]) + '-' + String(pos[1][0]) + ':' +\n                                String(pos[1][1])]);\n                }\n            }\n\n            cr();\n            out(tag(tagname, attrs, selfClosing));\n            if (container) {\n                indentLevel += 1;\n            } else if (!container && !selfClosing) {\n                var lit = node.literal;\n                if (lit) {\n                    out(esc(lit));\n                }\n                out(tag('/' + tagname));\n            }\n        } else {\n            indentLevel -= 1;\n            cr();\n            out(tag('/' + tagname));\n        }\n\n\n    }\n    if (options.time) { console.timeEnd(\"rendering\"); }\n    buffer += '\\n';\n    return buffer;\n};\n\n// The XmlRenderer object.\nfunction XmlRenderer(options){\n    return {\n        // default options:\n        softbreak: '\\n', // by default, soft breaks are rendered as newlines in HTML\n        // set to \"<br />\" to make them hard breaks\n        // set to \" \" if you want to ignore line wrapping in source\n        escape: escapeXml,\n        options: options || {},\n        render: renderNodes\n    };\n}\n\nmodule.exports = XmlRenderer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9jb21tb25tYXJrL2xpYi94bWwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBlc2NhcGVYbWwgPSByZXF1aXJlKCcuL2NvbW1vbicpLmVzY2FwZVhtbDtcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHByb2R1Y2UgYW4gWE1MIHRhZy5cbnZhciB0YWcgPSBmdW5jdGlvbihuYW1lLCBhdHRycywgc2VsZmNsb3NpbmcpIHtcbiAgICB2YXIgcmVzdWx0ID0gJzwnICsgbmFtZTtcbiAgICBpZiAoYXR0cnMgJiYgYXR0cnMubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIHZhciBhdHRyaWI7XG4gICAgICAgIHdoaWxlICgoYXR0cmliID0gYXR0cnNbaV0pICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAnICcgKyBhdHRyaWJbMF0gKyAnPVwiJyArIGVzY2FwZVhtbChhdHRyaWJbMV0pICsgJ1wiJztcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2VsZmNsb3NpbmcpIHtcbiAgICAgICAgcmVzdWx0ICs9ICcgLyc7XG4gICAgfVxuXG4gICAgcmVzdWx0ICs9ICc+JztcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxudmFyIHJlWE1MVGFnID0gL1xcPFtePl0qXFw+LztcblxudmFyIHRvVGFnTmFtZSA9IGZ1bmN0aW9uKHMpIHtcbiAgICByZXR1cm4gcy5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCBcIiQxXyQyXCIpLnRvTG93ZXJDYXNlKCk7XG59O1xuXG52YXIgcmVuZGVyTm9kZXMgPSBmdW5jdGlvbihibG9jaykge1xuXG4gICAgdmFyIGF0dHJzO1xuICAgIHZhciB0YWduYW1lO1xuICAgIHZhciB3YWxrZXIgPSBibG9jay53YWxrZXIoKTtcbiAgICB2YXIgZXZlbnQsIG5vZGUsIGVudGVyaW5nO1xuICAgIHZhciBidWZmZXIgPSBcIlwiO1xuICAgIHZhciBsYXN0T3V0ID0gXCJcXG5cIjtcbiAgICB2YXIgZGlzYWJsZVRhZ3MgPSAwO1xuICAgIHZhciBpbmRlbnRMZXZlbCA9IDA7XG4gICAgdmFyIGluZGVudCA9ICcgICc7XG4gICAgdmFyIGNvbnRhaW5lcjtcbiAgICB2YXIgc2VsZkNsb3Npbmc7XG4gICAgdmFyIG5vZGV0eXBlO1xuXG4gICAgdmFyIG91dCA9IGZ1bmN0aW9uKHMpIHtcbiAgICAgICAgaWYgKGRpc2FibGVUYWdzID4gMCkge1xuICAgICAgICAgICAgYnVmZmVyICs9IHMucmVwbGFjZShyZVhNTFRhZywgJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnVmZmVyICs9IHM7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdE91dCA9IHM7XG4gICAgfTtcbiAgICB2YXIgZXNjID0gdGhpcy5lc2NhcGU7XG4gICAgdmFyIGNyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChsYXN0T3V0ICE9PSAnXFxuJykge1xuICAgICAgICAgICAgYnVmZmVyICs9ICdcXG4nO1xuICAgICAgICAgICAgbGFzdE91dCA9ICdcXG4nO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGluZGVudExldmVsOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyICs9IGluZGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmIChvcHRpb25zLnRpbWUpIHsgY29uc29sZS50aW1lKFwicmVuZGVyaW5nXCIpOyB9XG5cbiAgICBidWZmZXIgKz0gJzw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/Plxcbic7XG4gICAgYnVmZmVyICs9ICc8IURPQ1RZUEUgZG9jdW1lbnQgU1lTVEVNIFwiQ29tbW9uTWFyay5kdGRcIj5cXG4nO1xuXG4gICAgd2hpbGUgKChldmVudCA9IHdhbGtlci5uZXh0KCkpKSB7XG4gICAgICAgIGVudGVyaW5nID0gZXZlbnQuZW50ZXJpbmc7XG4gICAgICAgIG5vZGUgPSBldmVudC5ub2RlO1xuICAgICAgICBub2RldHlwZSA9IG5vZGUudHlwZTtcblxuICAgICAgICBjb250YWluZXIgPSBub2RlLmlzQ29udGFpbmVyO1xuICAgICAgICBzZWxmQ2xvc2luZyA9IG5vZGV0eXBlID09PSAndGhlbWF0aWNfYnJlYWsnIHx8IG5vZGV0eXBlID09PSAnbGluZWJyZWFrJyB8fFxuICAgICAgICAgICAgbm9kZXR5cGUgPT09ICdzb2Z0YnJlYWsnO1xuICAgICAgICB0YWduYW1lID0gdG9UYWdOYW1lKG5vZGV0eXBlKTtcblxuICAgICAgICBpZiAoZW50ZXJpbmcpIHtcblxuICAgICAgICAgICAgYXR0cnMgPSBbXTtcblxuICAgICAgICAgICAgc3dpdGNoIChub2RldHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZG9jdW1lbnQnOlxuICAgICAgICAgICAgICAgIGF0dHJzLnB1c2goWyd4bWxucycsICdodHRwOi8vY29tbW9ubWFyay5vcmcveG1sLzEuMCddKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2xpc3QnOlxuICAgICAgICAgICAgICAgIGlmIChub2RlLmxpc3RUeXBlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJzLnB1c2goWyd0eXBlJywgbm9kZS5saXN0VHlwZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub2RlLmxpc3RTdGFydCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBhdHRycy5wdXNoKFsnc3RhcnQnLCBTdHJpbmcobm9kZS5saXN0U3RhcnQpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub2RlLmxpc3RUaWdodCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBhdHRycy5wdXNoKFsndGlnaHQnLCAobm9kZS5saXN0VGlnaHQgPyAndHJ1ZScgOiAnZmFsc2UnKV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZGVsaW0gPSBub2RlLmxpc3REZWxpbWl0ZXI7XG4gICAgICAgICAgICAgICAgaWYgKGRlbGltICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkZWxpbXdvcmQgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGltID09PSAnLicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGltd29yZCA9ICdwZXJpb2QnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsaW13b3JkID0gJ3BhcmVuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhdHRycy5wdXNoKFsnZGVsaW1pdGVyJywgZGVsaW13b3JkXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY29kZV9ibG9jayc6XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuaW5mbykge1xuICAgICAgICAgICAgICAgICAgICBhdHRycy5wdXNoKFsnaW5mbycsIG5vZGUuaW5mb10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2hlYWRpbmcnOlxuICAgICAgICAgICAgICAgIGF0dHJzLnB1c2goWydsZXZlbCcsIFN0cmluZyhub2RlLmxldmVsKV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbGluayc6XG4gICAgICAgICAgICBjYXNlICdpbWFnZSc6XG4gICAgICAgICAgICAgICAgYXR0cnMucHVzaChbJ2Rlc3RpbmF0aW9uJywgbm9kZS5kZXN0aW5hdGlvbl0pO1xuICAgICAgICAgICAgICAgIGF0dHJzLnB1c2goWyd0aXRsZScsIG5vZGUudGl0bGVdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2N1c3RvbV9pbmxpbmUnOlxuICAgICAgICAgICAgY2FzZSAnY3VzdG9tX2Jsb2NrJzpcbiAgICAgICAgICAgICAgICBhdHRycy5wdXNoKFsnb25fZW50ZXInLCBub2RlLm9uRW50ZXJdKTtcbiAgICAgICAgICAgICAgICBhdHRycy5wdXNoKFsnb25fZXhpdCcsIG5vZGUub25FeGl0XSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuc291cmNlcG9zKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBvcyA9IG5vZGUuc291cmNlcG9zO1xuICAgICAgICAgICAgICAgIGlmIChwb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cnMucHVzaChbJ3NvdXJjZXBvcycsIFN0cmluZyhwb3NbMF1bMF0pICsgJzonICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nKHBvc1swXVsxXSkgKyAnLScgKyBTdHJpbmcocG9zWzFdWzBdKSArICc6JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyhwb3NbMV1bMV0pXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjcigpO1xuICAgICAgICAgICAgb3V0KHRhZyh0YWduYW1lLCBhdHRycywgc2VsZkNsb3NpbmcpKTtcbiAgICAgICAgICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICBpbmRlbnRMZXZlbCArPSAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghY29udGFpbmVyICYmICFzZWxmQ2xvc2luZykge1xuICAgICAgICAgICAgICAgIHZhciBsaXQgPSBub2RlLmxpdGVyYWw7XG4gICAgICAgICAgICAgICAgaWYgKGxpdCkge1xuICAgICAgICAgICAgICAgICAgICBvdXQoZXNjKGxpdCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvdXQodGFnKCcvJyArIHRhZ25hbWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluZGVudExldmVsIC09IDE7XG4gICAgICAgICAgICBjcigpO1xuICAgICAgICAgICAgb3V0KHRhZygnLycgKyB0YWduYW1lKSk7XG4gICAgICAgIH1cblxuXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRpbWUpIHsgY29uc29sZS50aW1lRW5kKFwicmVuZGVyaW5nXCIpOyB9XG4gICAgYnVmZmVyICs9ICdcXG4nO1xuICAgIHJldHVybiBidWZmZXI7XG59O1xuXG4vLyBUaGUgWG1sUmVuZGVyZXIgb2JqZWN0LlxuZnVuY3Rpb24gWG1sUmVuZGVyZXIob3B0aW9ucyl7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLy8gZGVmYXVsdCBvcHRpb25zOlxuICAgICAgICBzb2Z0YnJlYWs6ICdcXG4nLCAvLyBieSBkZWZhdWx0LCBzb2Z0IGJyZWFrcyBhcmUgcmVuZGVyZWQgYXMgbmV3bGluZXMgaW4gSFRNTFxuICAgICAgICAvLyBzZXQgdG8gXCI8YnIgLz5cIiB0byBtYWtlIHRoZW0gaGFyZCBicmVha3NcbiAgICAgICAgLy8gc2V0IHRvIFwiIFwiIGlmIHlvdSB3YW50IHRvIGlnbm9yZSBsaW5lIHdyYXBwaW5nIGluIHNvdXJjZVxuICAgICAgICBlc2NhcGU6IGVzY2FwZVhtbCxcbiAgICAgICAgb3B0aW9uczogb3B0aW9ucyB8fCB7fSxcbiAgICAgICAgcmVuZGVyOiByZW5kZXJOb2Rlc1xuICAgIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gWG1sUmVuZGVyZXI7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29tbW9ubWFyay9saWIveG1sLmpzXG4vLyBtb2R1bGUgaWQgPSA0MzJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 433 */
/***/ function(module, exports, __webpack_require__) {

    eval("(function webpackUniversalModuleDefinition(root, factory) {\n\tif(true)\n\t\tmodule.exports = factory(__webpack_require__(174));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"react\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"EmojiMart\"] = factory(require(\"react\"));\n\telse\n\t\troot[\"EmojiMart\"] = factory(root[\"React\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_3__) {\nreturn /******/ (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\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\texports.frequently = exports.store = exports.emojiIndex = exports.Emoji = exports.Picker = undefined;\n\n\tvar _components = __webpack_require__(1);\n\n\tObject.defineProperty(exports, 'Picker', {\n\t  enumerable: true,\n\t  get: function get() {\n\t    return _components.Picker;\n\t  }\n\t});\n\tObject.defineProperty(exports, 'Emoji', {\n\t  enumerable: true,\n\t  get: function get() {\n\t    return _components.Emoji;\n\t  }\n\t});\n\n\tvar _emojiIndex = __webpack_require__(25);\n\n\tvar _emojiIndex2 = _interopRequireDefault(_emojiIndex);\n\n\tvar _store = __webpack_require__(17);\n\n\tvar _store2 = _interopRequireDefault(_store);\n\n\tvar _frequently = __webpack_require__(16);\n\n\tvar _frequently2 = _interopRequireDefault(_frequently);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\texports.emojiIndex = _emojiIndex2.default;\n\texports.store = _store2.default;\n\texports.frequently = _frequently2.default;\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\n\tvar _anchors = __webpack_require__(2);\n\n\tObject.defineProperty(exports, 'Anchors', {\n\t  enumerable: true,\n\t  get: function get() {\n\t    return _interopRequireDefault(_anchors).default;\n\t  }\n\t});\n\n\tvar _category = __webpack_require__(15);\n\n\tObject.defineProperty(exports, 'Category', {\n\t  enumerable: true,\n\t  get: function get() {\n\t    return _interopRequireDefault(_category).default;\n\t  }\n\t});\n\n\tvar _emoji = __webpack_require__(18);\n\n\tObject.defineProperty(exports, 'Emoji', {\n\t  enumerable: true,\n\t  get: function get() {\n\t    return _interopRequireDefault(_emoji).default;\n\t  }\n\t});\n\n\tvar _picker = __webpack_require__(21);\n\n\tObject.defineProperty(exports, 'Picker', {\n\t  enumerable: true,\n\t  get: function get() {\n\t    return _interopRequireDefault(_picker).default;\n\t  }\n\t});\n\n\tvar _preview = __webpack_require__(23);\n\n\tObject.defineProperty(exports, 'Preview', {\n\t  enumerable: true,\n\t  get: function get() {\n\t    return _interopRequireDefault(_preview).default;\n\t  }\n\t});\n\n\tvar _search = __webpack_require__(24);\n\n\tObject.defineProperty(exports, 'Search', {\n\t  enumerable: true,\n\t  get: function get() {\n\t    return _interopRequireDefault(_search).default;\n\t  }\n\t});\n\n\tvar _skins = __webpack_require__(26);\n\n\tObject.defineProperty(exports, 'Skins', {\n\t  enumerable: true,\n\t  get: function get() {\n\t    return _interopRequireDefault(_skins).default;\n\t  }\n\t});\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\n\tvar _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\n\tvar _react = __webpack_require__(3);\n\n\tvar _react2 = _interopRequireDefault(_react);\n\n\tvar _svgInlineReact = __webpack_require__(4);\n\n\tvar _svgInlineReact2 = _interopRequireDefault(_svgInlineReact);\n\n\tvar _svgs = __webpack_require__(5);\n\n\tvar SVGs = _interopRequireWildcard(_svgs);\n\n\tfunction _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\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _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\n\tfunction _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\n\tvar Anchors = function (_React$Component) {\n\t  _inherits(Anchors, _React$Component);\n\n\t  function Anchors(props) {\n\t    _classCallCheck(this, Anchors);\n\n\t    var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(Anchors).call(this, props));\n\n\t    var defaultCategory = props.categories[0];\n\t    if (defaultCategory.anchor) {\n\t      defaultCategory = defaultCategory.anchor;\n\t    }\n\n\t    _this.state = {\n\t      selected: defaultCategory.name\n\t    };\n\t    return _this;\n\t  }\n\n\t  _createClass(Anchors, [{\n\t    key: 'render',\n\t    value: function render() {\n\t      var _props = this.props;\n\t      var categories = _props.categories;\n\t      var onAnchorClick = _props.onAnchorClick;\n\t      var color = _props.color;\n\t      var i18n = _props.i18n;\n\t      var selected = this.state.selected;\n\n\n\t      return _react2.default.createElement(\n\t        'div',\n\t        { className: 'emoji-mart-anchors' },\n\t        categories.map(function (category, i) {\n\t          var name = category.name;\n\t          var anchor = category.anchor;\n\t          var isSelected = name == selected;\n\n\t          if (anchor) {\n\t            return null;\n\t          }\n\n\t          return _react2.default.createElement(\n\t            'span',\n\t            {\n\t              key: name,\n\t              title: i18n.categories[name.toLowerCase()],\n\t              onClick: function onClick() {\n\t                return onAnchorClick(category, i);\n\t              },\n\t              className: 'emoji-mart-anchor ' + (isSelected ? 'emoji-mart-anchor-selected' : ''),\n\t              style: { color: isSelected ? color : null }\n\t            },\n\t            _react2.default.createElement(_svgInlineReact2.default, { src: SVGs[name] }),\n\t            _react2.default.createElement('span', { className: 'emoji-mart-anchor-bar', style: { backgroundColor: color } })\n\t          );\n\t        })\n\t      );\n\t    }\n\t  }]);\n\n\t  return Anchors;\n\t}(_react2.default.Component);\n\n\texports.default = Anchors;\n\n\n\tAnchors.propTypes = {\n\t  categories: _react2.default.PropTypes.array,\n\t  onAnchorClick: _react2.default.PropTypes.func\n\t};\n\n\tAnchors.defaultProps = {\n\t  categories: [],\n\t  onAnchorClick: function onAnchorClick() {}\n\t};\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_3__;\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, '__esModule', {\n\t    value: true\n\t});\n\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n\tvar _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\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\tfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\n\tfunction _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\n\tvar _react = __webpack_require__(3);\n\n\tvar _react2 = _interopRequireDefault(_react);\n\n\tvar DOMParser = typeof window !== 'undefined' && window.DOMParser;\n\tvar process = process || {};\n\tprocess.env = process.env || {};\n\tvar parserAvailable = typeof DOMParser !== 'undefined' && DOMParser.prototype != null && DOMParser.prototype.parseFromString != null;\n\n\tif (\"production\" !== process.env.NODE_ENV && !parserAvailable) {\n\t    console.info('<InlineSVG />: `raw` prop works only when `window.DOMParser` exists.');\n\t}\n\n\tfunction isParsable(src) {\n\t    // kinda naive but meh, ain't gonna use full-blown parser for this\n\t    return parserAvailable && typeof src === 'string' && src.trim().substr(0, 4) === '<svg';\n\t}\n\n\t// parse SVG string using `DOMParser`\n\tfunction parseFromSVGString(src) {\n\t    var parser = new DOMParser();\n\t    return parser.parseFromString(src, \"image/svg+xml\");\n\t}\n\n\t// Transform DOM prop/attr names applicable to `<svg>` element but react-limited\n\tfunction switchSVGAttrToReactProp(propName) {\n\t    switch (propName) {\n\t        case 'class':\n\t            return 'className';\n\t        default:\n\t            return propName;\n\t    }\n\t}\n\n\tvar InlineSVG = (function (_React$Component) {\n\t    _inherits(InlineSVG, _React$Component);\n\n\t    _createClass(InlineSVG, null, [{\n\t        key: 'defaultProps',\n\t        value: {\n\t            element: 'i',\n\t            raw: false,\n\t            src: ''\n\t        },\n\t        enumerable: true\n\t    }, {\n\t        key: 'propTypes',\n\t        value: {\n\t            src: _react2['default'].PropTypes.string.isRequired,\n\t            element: _react2['default'].PropTypes.string,\n\t            raw: _react2['default'].PropTypes.bool\n\t        },\n\t        enumerable: true\n\t    }]);\n\n\t    function InlineSVG(props) {\n\t        _classCallCheck(this, InlineSVG);\n\n\t        _get(Object.getPrototypeOf(InlineSVG.prototype), 'constructor', this).call(this, props);\n\t        this._extractSVGProps = this._extractSVGProps.bind(this);\n\t    }\n\n\t    // Serialize `Attr` objects in `NamedNodeMap`\n\n\t    _createClass(InlineSVG, [{\n\t        key: '_serializeAttrs',\n\t        value: function _serializeAttrs(map) {\n\t            var ret = {};\n\t            var prop = undefined;\n\t            for (var i = 0; i < map.length; i++) {\n\t                prop = switchSVGAttrToReactProp(map[i].name);\n\t                ret[prop] = map[i].value;\n\t            }\n\t            return ret;\n\t        }\n\n\t        // get <svg /> element props\n\t    }, {\n\t        key: '_extractSVGProps',\n\t        value: function _extractSVGProps(src) {\n\t            var map = parseFromSVGString(src).documentElement.attributes;\n\t            return map.length > 0 ? this._serializeAttrs(map) : null;\n\t        }\n\n\t        // get content inside <svg> element.\n\t    }, {\n\t        key: '_stripSVG',\n\t        value: function _stripSVG(src) {\n\t            return parseFromSVGString(src).documentElement.innerHTML;\n\t        }\n\t    }, {\n\t        key: 'componentWillReceiveProps',\n\t        value: function componentWillReceiveProps(_ref) {\n\t            var children = _ref.children;\n\n\t            if (\"production\" !== process.env.NODE_ENV && children != null) {\n\t                console.info('<InlineSVG />: `children` prop will be ignored.');\n\t            }\n\t        }\n\t    }, {\n\t        key: 'render',\n\t        value: function render() {\n\t            var Element = undefined,\n\t                __html = undefined,\n\t                svgProps = undefined;\n\t            var _props = this.props;\n\t            var element = _props.element;\n\t            var raw = _props.raw;\n\t            var src = _props.src;\n\n\t            var otherProps = _objectWithoutProperties(_props, ['element', 'raw', 'src']);\n\n\t            if (raw === true && isParsable(src)) {\n\t                Element = 'svg';\n\t                svgProps = this._extractSVGProps(src);\n\t                __html = this._stripSVG(src);\n\t            }\n\t            __html = __html || src;\n\t            Element = Element || element;\n\t            svgProps = svgProps || {};\n\n\t            return _react2['default'].createElement(Element, _extends({}, svgProps, otherProps, { src: null, children: null,\n\t                dangerouslySetInnerHTML: { __html: __html } }));\n\t        }\n\t    }]);\n\n\t    return InlineSVG;\n\t})(_react2['default'].Component);\n\n\texports['default'] = InlineSVG;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\n\tvar _activity = __webpack_require__(6);\n\n\tObject.defineProperty(exports, 'Activity', {\n\t  enumerable: true,\n\t  get: function get() {\n\t    return _interopRequireDefault(_activity).default;\n\t  }\n\t});\n\n\tvar _flags = __webpack_require__(7);\n\n\tObject.defineProperty(exports, 'Flags', {\n\t  enumerable: true,\n\t  get: function get() {\n\t    return _interopRequireDefault(_flags).default;\n\t  }\n\t});\n\n\tvar _foods = __webpack_require__(8);\n\n\tObject.defineProperty(exports, 'Foods', {\n\t  enumerable: true,\n\t  get: function get() {\n\t    return _interopRequireDefault(_foods).default;\n\t  }\n\t});\n\n\tvar _nature = __webpack_require__(9);\n\n\tObject.defineProperty(exports, 'Nature', {\n\t  enumerable: true,\n\t  get: function get() {\n\t    return _interopRequireDefault(_nature).default;\n\t  }\n\t});\n\n\tvar _objects = __webpack_require__(10);\n\n\tObject.defineProperty(exports, 'Objects', {\n\t  enumerable: true,\n\t  get: function get() {\n\t    return _interopRequireDefault(_objects).default;\n\t  }\n\t});\n\n\tvar _people = __webpack_require__(11);\n\n\tObject.defineProperty(exports, 'People', {\n\t  enumerable: true,\n\t  get: function get() {\n\t    return _interopRequireDefault(_people).default;\n\t  }\n\t});\n\n\tvar _places = __webpack_require__(12);\n\n\tObject.defineProperty(exports, 'Places', {\n\t  enumerable: true,\n\t  get: function get() {\n\t    return _interopRequireDefault(_places).default;\n\t  }\n\t});\n\n\tvar _recent = __webpack_require__(13);\n\n\tObject.defineProperty(exports, 'Recent', {\n\t  enumerable: true,\n\t  get: function get() {\n\t    return _interopRequireDefault(_recent).default;\n\t  }\n\t});\n\n\tvar _symbols = __webpack_require__(14);\n\n\tObject.defineProperty(exports, 'Symbols', {\n\t  enumerable: true,\n\t  get: function get() {\n\t    return _interopRequireDefault(_symbols).default;\n\t  }\n\t});\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M12 0C5.373 0 0 5.372 0 12c0 6.627 5.373 12 12 12 6.628 0 12-5.373 12-12 0-6.628-5.372-12-12-12m9.949 11H17.05c.224-2.527 1.232-4.773 1.968-6.113A9.966 9.966 0 0 1 21.949 11M13 11V2.051a9.945 9.945 0 0 1 4.432 1.564c-.858 1.491-2.156 4.22-2.392 7.385H13zm-2 0H8.961c-.238-3.165-1.536-5.894-2.393-7.385A9.95 9.95 0 0 1 11 2.051V11zm0 2v8.949a9.937 9.937 0 0 1-4.432-1.564c.857-1.492 2.155-4.221 2.393-7.385H11zm4.04 0c.236 3.164 1.534 5.893 2.392 7.385A9.92 9.92 0 0 1 13 21.949V13h2.04zM4.982 4.887C5.718 6.227 6.726 8.473 6.951 11h-4.9a9.977 9.977 0 0 1 2.931-6.113M2.051 13h4.9c-.226 2.527-1.233 4.771-1.969 6.113A9.972 9.972 0 0 1 2.051 13m16.967 6.113c-.735-1.342-1.744-3.586-1.968-6.113h4.899a9.961 9.961 0 0 1-2.931 6.113\\\"></path></svg>\"\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M0 0l6.084 24H8L1.916 0zM21 5h-4l-1-4H4l3 12h3l1 4h13L21 5zM6.563 3h7.875l2 8H8.563l-2-8zm8.832 10l-2.856 1.904L12.063 13h3.332zM19 13l-1.5-6h1.938l2 8H16l3-2z\\\"></path></svg>\"\n\n/***/ },\n/* 8 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M17 4.978c-1.838 0-2.876.396-3.68.934.513-1.172 1.768-2.934 4.68-2.934a1 1 0 0 0 0-2c-2.921 0-4.629 1.365-5.547 2.512-.064.078-.119.162-.18.244C11.73 1.838 10.798.023 9.207.023 8.579.022 7.85.306 7 .978 5.027 2.54 5.329 3.902 6.492 4.999 3.609 5.222 0 7.352 0 12.969c0 4.582 4.961 11.009 9 11.009 1.975 0 2.371-.486 3-1 .629.514 1.025 1 3 1 4.039 0 9-6.418 9-11 0-5.953-4.055-8-7-8M8.242 2.546c.641-.508.943-.523.965-.523.426.169.975 1.405 1.357 3.055-1.527-.629-2.741-1.352-2.98-1.846.059-.112.241-.356.658-.686M15 21.978c-1.08 0-1.21-.109-1.559-.402l-.176-.146c-.367-.302-.816-.452-1.266-.452s-.898.15-1.266.452l-.176.146c-.347.292-.477.402-1.557.402-2.813 0-7-5.389-7-9.009 0-5.823 4.488-5.991 5-5.991 1.939 0 2.484.471 3.387 1.251l.323.276a1.995 1.995 0 0 0 2.58 0l.323-.276c.902-.78 1.447-1.251 3.387-1.251.512 0 5 .168 5 6 0 3.617-4.187 9-7 9\\\"></path></svg>\"\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M15.5 8a1.5 1.5 0 1 0 .001 3.001A1.5 1.5 0 0 0 15.5 8M8.5 8a1.5 1.5 0 1 0 .001 3.001A1.5 1.5 0 0 0 8.5 8\\\"></path><path d=\\\"M18.933 0h-.027c-.97 0-2.138.787-3.018 1.497-1.274-.374-2.612-.51-3.887-.51-1.285 0-2.616.133-3.874.517C7.245.79 6.069 0 5.093 0h-.027C3.352 0 .07 2.67.002 7.026c-.039 2.479.276 4.238 1.04 5.013.254.258.882.677 1.295.882.191 3.177.922 5.238 2.536 6.38.897.637 2.187.949 3.2 1.102C8.04 20.6 8 20.795 8 21c0 1.773 2.35 3 4 3 1.648 0 4-1.227 4-3 0-.201-.038-.393-.072-.586 2.573-.385 5.435-1.877 5.925-7.587.396-.22.887-.568 1.104-.788.763-.774 1.079-2.534 1.04-5.013C23.929 2.67 20.646 0 18.933 0M3.223 9.135c-.237.281-.837 1.155-.884 1.238-.15-.41-.368-1.349-.337-3.291.051-3.281 2.478-4.972 3.091-5.031.256.015.731.27 1.265.646-1.11 1.171-2.275 2.915-2.352 5.125-.133.546-.398.858-.783 1.313M12 22c-.901 0-1.954-.693-2-1 0-.654.475-1.236 1-1.602V20a1 1 0 1 0 2 0v-.602c.524.365 1 .947 1 1.602-.046.307-1.099 1-2 1m3-3.48v.02a4.752 4.752 0 0 0-1.262-1.02c1.092-.516 2.239-1.334 2.239-2.217 0-1.842-1.781-2.195-3.977-2.195-2.196 0-3.978.354-3.978 2.195 0 .883 1.148 1.701 2.238 2.217A4.8 4.8 0 0 0 9 18.539v-.025c-1-.076-2.182-.281-2.973-.842-1.301-.92-1.838-3.045-1.853-6.478l.023-.041c.496-.826 1.49-1.45 1.804-3.102 0-2.047 1.357-3.631 2.362-4.522C9.37 3.178 10.555 3 11.948 3c1.447 0 2.685.192 3.733.57 1 .9 2.316 2.465 2.316 4.48.313 1.651 1.307 2.275 1.803 3.102.035.058.068.117.102.178-.059 5.967-1.949 7.01-4.902 7.19m6.628-8.202c-.037-.065-.074-.13-.113-.195a7.587 7.587 0 0 0-.739-.987c-.385-.455-.648-.768-.782-1.313-.076-2.209-1.241-3.954-2.353-5.124.531-.376 1.004-.63 1.261-.647.636.071 3.044 1.764 3.096 5.031.027 1.81-.347 3.218-.37 3.235\\\"></path></svg>\"\n\n/***/ },\n/* 10 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M12 0a9 9 0 0 0-5 16.482V21s2.035 3 5 3 5-3 5-3v-4.518A9 9 0 0 0 12 0zm0 2c3.86 0 7 3.141 7 7s-3.14 7-7 7-7-3.141-7-7 3.14-7 7-7zM9 17.477c.94.332 1.946.523 3 .523s2.06-.19 3-.523v.834c-.91.436-1.925.689-3 .689a6.924 6.924 0 0 1-3-.69v-.833zm.236 3.07A8.854 8.854 0 0 0 12 21c.965 0 1.888-.167 2.758-.451C14.155 21.173 13.153 22 12 22c-1.102 0-2.117-.789-2.764-1.453z\\\"></path><path d=\\\"M14.745 12.449h-.004c-.852-.024-1.188-.858-1.577-1.824-.421-1.061-.703-1.561-1.182-1.566h-.009c-.481 0-.783.497-1.235 1.537-.436.982-.801 1.811-1.636 1.791l-.276-.043c-.565-.171-.853-.691-1.284-1.794-.125-.313-.202-.632-.27-.913-.051-.213-.127-.53-.195-.634C7.067 9.004 7.039 9 6.99 9A1 1 0 0 1 7 7h.01c1.662.017 2.015 1.373 2.198 2.134.486-.981 1.304-2.058 2.797-2.075 1.531.018 2.28 1.153 2.731 2.141l.002-.008C14.944 8.424 15.327 7 16.979 7h.032A1 1 0 1 1 17 9h-.011c-.149.076-.256.474-.319.709a6.484 6.484 0 0 1-.311.951c-.429.973-.79 1.789-1.614 1.789\\\"></path></svg>\"\n\n/***/ },\n/* 11 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0m0 22C6.486 22 2 17.514 2 12S6.486 2 12 2s10 4.486 10 10-4.486 10-10 10\\\"></path><path d=\\\"M8 7a2 2 0 1 0-.001 3.999A2 2 0 0 0 8 7M16 7a2 2 0 1 0-.001 3.999A2 2 0 0 0 16 7M15.232 15c-.693 1.195-1.87 2-3.349 2-1.477 0-2.655-.805-3.347-2H15m3-2H6a6 6 0 1 0 12 0\\\"></path></svg>\"\n\n/***/ },\n/* 12 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M6.5 12C5.122 12 4 13.121 4 14.5S5.122 17 6.5 17 9 15.879 9 14.5 7.878 12 6.5 12m0 3c-.275 0-.5-.225-.5-.5s.225-.5.5-.5.5.225.5.5-.225.5-.5.5M17.5 12c-1.378 0-2.5 1.121-2.5 2.5s1.122 2.5 2.5 2.5 2.5-1.121 2.5-2.5-1.122-2.5-2.5-2.5m0 3c-.275 0-.5-.225-.5-.5s.225-.5.5-.5.5.225.5.5-.225.5-.5.5\\\"></path><path d=\\\"M22.482 9.494l-1.039-.346L21.4 9h.6c.552 0 1-.439 1-.992 0-.006-.003-.008-.003-.008H23c0-1-.889-2-1.984-2h-.642l-.731-1.717C19.262 3.012 18.091 2 16.764 2H7.236C5.909 2 4.738 3.012 4.357 4.283L3.626 6h-.642C1.889 6 1 7 1 8h.003S1 8.002 1 8.008C1 8.561 1.448 9 2 9h.6l-.043.148-1.039.346a2.001 2.001 0 0 0-1.359 2.097l.751 7.508a1 1 0 0 0 .994.901H3v1c0 1.103.896 2 2 2h2c1.104 0 2-.897 2-2v-1h6v1c0 1.103.896 2 2 2h2c1.104 0 2-.897 2-2v-1h1.096a.999.999 0 0 0 .994-.901l.751-7.508a2.001 2.001 0 0 0-1.359-2.097M6.273 4.857C6.402 4.43 6.788 4 7.236 4h9.527c.448 0 .834.43.963.857L19.313 9H4.688l1.585-4.143zM7 21H5v-1h2v1zm12 0h-2v-1h2v1zm2.189-3H2.811l-.662-6.607L3 11h18l.852.393L21.189 18z\\\"></path></svg>\"\n\n/***/ },\n/* 13 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M13 4h-2l-.001 7H9v2h2v2h2v-2h4v-2h-4z\\\"></path><path d=\\\"M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0m0 22C6.486 22 2 17.514 2 12S6.486 2 12 2s10 4.486 10 10-4.486 10-10 10\\\"></path></svg>\"\n\n/***/ },\n/* 14 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M0 0h11v2H0zM4 11h3V6h4V4H0v2h4zM15.5 17c1.381 0 2.5-1.116 2.5-2.493s-1.119-2.493-2.5-2.493S13 13.13 13 14.507 14.119 17 15.5 17m0-2.986c.276 0 .5.222.5.493 0 .272-.224.493-.5.493s-.5-.221-.5-.493.224-.493.5-.493M21.5 19.014c-1.381 0-2.5 1.116-2.5 2.493S20.119 24 21.5 24s2.5-1.116 2.5-2.493-1.119-2.493-2.5-2.493m0 2.986a.497.497 0 0 1-.5-.493c0-.271.224-.493.5-.493s.5.222.5.493a.497.497 0 0 1-.5.493M22 13l-9 9 1.513 1.5 8.99-9.009zM17 11c2.209 0 4-1.119 4-2.5V2s.985-.161 1.498.949C23.01 4.055 23 6 23 6s1-1.119 1-3.135C24-.02 21 0 21 0h-2v6.347A5.853 5.853 0 0 0 17 6c-2.209 0-4 1.119-4 2.5s1.791 2.5 4 2.5M10.297 20.482l-1.475-1.585a47.54 47.54 0 0 1-1.442 1.129c-.307-.288-.989-1.016-2.045-2.183.902-.836 1.479-1.466 1.729-1.892s.376-.871.376-1.336c0-.592-.273-1.178-.818-1.759-.546-.581-1.329-.871-2.349-.871-1.008 0-1.79.293-2.344.879-.556.587-.832 1.181-.832 1.784 0 .813.419 1.748 1.256 2.805-.847.614-1.444 1.208-1.794 1.784a3.465 3.465 0 0 0-.523 1.833c0 .857.308 1.56.924 2.107.616.549 1.423.823 2.42.823 1.173 0 2.444-.379 3.813-1.137L8.235 24h2.819l-2.09-2.383 1.333-1.135zm-6.736-6.389a1.02 1.02 0 0 1 .73-.286c.31 0 .559.085.747.254a.849.849 0 0 1 .283.659c0 .518-.419 1.112-1.257 1.784-.536-.651-.805-1.231-.805-1.742a.901.901 0 0 1 .302-.669M3.74 22c-.427 0-.778-.116-1.057-.349-.279-.232-.418-.487-.418-.766 0-.594.509-1.288 1.527-2.083.968 1.134 1.717 1.946 2.248 2.438-.921.507-1.686.76-2.3.76\\\"></path></svg>\"\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n\tvar _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\n\tvar _react = __webpack_require__(3);\n\n\tvar _react2 = _interopRequireDefault(_react);\n\n\tvar _frequently = __webpack_require__(16);\n\n\tvar _frequently2 = _interopRequireDefault(_frequently);\n\n\tvar _ = __webpack_require__(1);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _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\n\tfunction _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\n\tvar Category = function (_React$Component) {\n\t  _inherits(Category, _React$Component);\n\n\t  function Category() {\n\t    _classCallCheck(this, Category);\n\n\t    return _possibleConstructorReturn(this, Object.getPrototypeOf(Category).apply(this, arguments));\n\t  }\n\n\t  _createClass(Category, [{\n\t    key: 'componentDidMount',\n\t    value: function componentDidMount() {\n\t      this.container = this.refs.container;\n\t      this.label = this.refs.label;\n\t      this.parent = this.container.parentNode;\n\n\t      this.margin = 0;\n\t      this.minMargin = 0;\n\n\t      this.memoizeSize();\n\t    }\n\t  }, {\n\t    key: 'shouldComponentUpdate',\n\t    value: function shouldComponentUpdate(nextProps, nextState) {\n\t      var _props = this.props;\n\t      var name = _props.name;\n\t      var perLine = _props.perLine;\n\t      var hasStickyPosition = _props.hasStickyPosition;\n\t      var emojis = _props.emojis;\n\t      var emojiProps = _props.emojiProps;\n\t      var skin = emojiProps.skin;\n\t      var size = emojiProps.size;\n\t      var set = emojiProps.set;\n\t      var nextPerLine = nextProps.perLine;\n\t      var nextHasStickyPosition = nextProps.hasStickyPosition;\n\t      var nextEmojis = nextProps.emojis;\n\t      var nextEmojiProps = nextProps.emojiProps;\n\t      var nextSkin = nextEmojiProps.skin;\n\t      var nextSize = nextEmojiProps.size;\n\t      var nextSet = nextEmojiProps.set;\n\t      var shouldUpdate = false;\n\n\t      if (name == 'Recent' && perLine != nextPerLine) {\n\t        shouldUpdate = true;\n\t      }\n\n\t      if (name == 'Search') {\n\t        shouldUpdate = !(emojis == nextEmojis);\n\t      }\n\n\t      if (skin != nextSkin || size != nextSize || set != nextSet || hasStickyPosition != nextHasStickyPosition) {\n\t        shouldUpdate = true;\n\t      }\n\n\t      return shouldUpdate;\n\t    }\n\t  }, {\n\t    key: 'memoizeSize',\n\t    value: function memoizeSize() {\n\t      var _container$getBoundin = this.container.getBoundingClientRect();\n\n\t      var top = _container$getBoundin.top;\n\t      var height = _container$getBoundin.height;\n\n\t      var _parent$getBoundingCl = this.parent.getBoundingClientRect();\n\n\t      var parentTop = _parent$getBoundingCl.top;\n\n\t      var _label$getBoundingCli = this.label.getBoundingClientRect();\n\n\t      var labelHeight = _label$getBoundingCli.height;\n\n\n\t      this.top = top - parentTop + this.parent.scrollTop;\n\n\t      if (height == 0) {\n\t        this.maxMargin = 0;\n\t      } else {\n\t        this.maxMargin = height - labelHeight;\n\t      }\n\t    }\n\t  }, {\n\t    key: 'handleScroll',\n\t    value: function handleScroll(scrollTop) {\n\t      var margin = scrollTop - this.top;\n\t      margin = margin < this.minMargin ? this.minMargin : margin;\n\t      margin = margin > this.maxMargin ? this.maxMargin : margin;\n\n\t      if (margin == this.margin) return;\n\t      var name = this.props.name;\n\n\n\t      if (!this.props.hasStickyPosition) {\n\t        this.label.style.top = margin + 'px';\n\t      }\n\n\t      this.margin = margin;\n\t      return true;\n\t    }\n\t  }, {\n\t    key: 'getEmojis',\n\t    value: function getEmojis() {\n\t      var _props2 = this.props;\n\t      var name = _props2.name;\n\t      var emojis = _props2.emojis;\n\t      var perLine = _props2.perLine;\n\n\n\t      if (name == 'Recent') {\n\t        var frequentlyUsed = _frequently2.default.get(perLine * 4);\n\n\t        if (frequentlyUsed.length) {\n\t          emojis = frequentlyUsed;\n\t        }\n\t      }\n\n\t      if (emojis) {\n\t        emojis = emojis.slice(0);\n\t      }\n\n\t      return emojis;\n\t    }\n\t  }, {\n\t    key: 'updateDisplay',\n\t    value: function updateDisplay(display) {\n\t      var emojis = this.getEmojis();\n\n\t      if (!display && !emojis) {\n\t        return;\n\t      }\n\n\t      this.container.style.display = display;\n\t    }\n\t  }, {\n\t    key: 'render',\n\t    value: function render() {\n\t      var _props3 = this.props;\n\t      var name = _props3.name;\n\t      var hasStickyPosition = _props3.hasStickyPosition;\n\t      var emojiProps = _props3.emojiProps;\n\t      var i18n = _props3.i18n;\n\t      var emojis = this.getEmojis();\n\t      var labelStyles = {};\n\t      var labelSpanStyles = {};\n\t      var containerStyles = {};\n\n\t      if (!emojis) {\n\t        containerStyles = {\n\t          display: 'none'\n\t        };\n\t      }\n\n\t      if (!hasStickyPosition) {\n\t        labelStyles = {\n\t          height: 28\n\t        };\n\n\t        labelSpanStyles = {\n\t          position: 'absolute'\n\t        };\n\t      }\n\n\t      return _react2.default.createElement(\n\t        'div',\n\t        { ref: 'container', className: 'emoji-mart-category', style: containerStyles },\n\t        _react2.default.createElement(\n\t          'div',\n\t          { style: labelStyles, 'data-name': name, className: 'emoji-mart-category-label' },\n\t          _react2.default.createElement(\n\t            'span',\n\t            { style: labelSpanStyles, ref: 'label' },\n\t            i18n.categories[name.toLowerCase()]\n\t          )\n\t        ),\n\t        emojis && emojis.map(function (emoji) {\n\t          return _react2.default.createElement(_.Emoji, _extends({\n\t            key: emoji.id || emoji,\n\t            emoji: emoji\n\t          }, emojiProps));\n\t        }),\n\t        emojis && !emojis.length && _react2.default.createElement(\n\t          'div',\n\t          { className: 'emoji-mart-no-results' },\n\t          _react2.default.createElement(_.Emoji, _extends({}, emojiProps, {\n\t            size: 22,\n\t            emoji: 'sleuth_or_spy'\n\t          })),\n\t          _react2.default.createElement(\n\t            'span',\n\t            { className: 'emoji-mart-no-results-label' },\n\t            'No emoji found'\n\t          )\n\t        )\n\t      );\n\t    }\n\t  }]);\n\n\t  return Category;\n\t}(_react2.default.Component);\n\n\texports.default = Category;\n\n\n\tCategory.propTypes = {\n\t  emojis: _react2.default.PropTypes.array,\n\t  hasStickyPosition: _react2.default.PropTypes.bool,\n\t  name: _react2.default.PropTypes.string.isRequired,\n\t  perLine: _react2.default.PropTypes.number.isRequired,\n\t  emojiProps: _react2.default.PropTypes.object.isRequired\n\t};\n\n\tCategory.defaultProps = {\n\t  emojis: [],\n\t  hasStickyPosition: true\n\t};\n\n/***/ },\n/* 16 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\n\tvar _store = __webpack_require__(17);\n\n\tvar _store2 = _interopRequireDefault(_store);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tvar frequently = _store2.default.get('frequently') || {};\n\n\tfunction add(emoji) {\n\t  var id = emoji.id;\n\n\n\t  frequently[id] || (frequently[id] = 0);\n\t  frequently[id] += 1;\n\n\t  _store2.default.set('last', id);\n\t  _store2.default.set('frequently', frequently);\n\t}\n\n\tfunction get(quantity) {\n\t  var sorted = Object.keys(frequently).sort(function (a, b) {\n\t    return frequently[a] - frequently[b];\n\t  }).reverse(),\n\t      sliced = sorted.slice(0, quantity),\n\t      last = _store2.default.get('last');\n\n\t  if (last && sliced.indexOf(last) == -1) {\n\t    sliced.pop();\n\t    sliced.push(last);\n\t  }\n\n\t  return sliced;\n\t}\n\n\texports.default = { add: add, get: get };\n\n/***/ },\n/* 17 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\tvar NAMESPACE = 'emoji-mart';\n\n\tvar isLocalStorageSupported = typeof window !== 'undefined' && 'localStorage' in window;\n\n\tfunction update(state) {\n\t  for (var key in state) {\n\t    var value = state[key];\n\t    set(key, value);\n\t  }\n\t}\n\n\tfunction set(key, value) {\n\t  if (!isLocalStorageSupported) return;\n\t  try {\n\t    window.localStorage[NAMESPACE + '.' + key] = JSON.stringify(value);\n\t  } catch (e) {}\n\t}\n\n\tfunction get(key) {\n\t  if (!isLocalStorageSupported) return;\n\t  try {\n\t    var value = window.localStorage[NAMESPACE + '.' + key];\n\t  } catch (e) {\n\t    return;\n\t  }\n\n\t  if (value) {\n\t    return JSON.parse(value);\n\t  }\n\t}\n\n\tfunction setNamespace(namespace) {\n\t  NAMESPACE = namespace;\n\t}\n\n\texports.default = { update: update, set: set, get: get, setNamespace: setNamespace };\n\n/***/ },\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\n\tvar _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\n\tvar _react = __webpack_require__(3);\n\n\tvar _react2 = _interopRequireDefault(_react);\n\n\tvar _data = __webpack_require__(19);\n\n\tvar _data2 = _interopRequireDefault(_data);\n\n\tvar _utils = __webpack_require__(20);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _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\n\tfunction _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\n\tvar SHEET_COLUMNS = 41;\n\n\tvar Emoji = function (_React$Component) {\n\t  _inherits(Emoji, _React$Component);\n\n\t  function Emoji(props) {\n\t    _classCallCheck(this, Emoji);\n\n\t    var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(Emoji).call(this, props));\n\n\t    _this.hasSkinVariations = !!_this.getData().skin_variations;\n\t    return _this;\n\t  }\n\n\t  _createClass(Emoji, [{\n\t    key: 'shouldComponentUpdate',\n\t    value: function shouldComponentUpdate(nextProps) {\n\t      return this.hasSkinVariations && nextProps.skin != this.props.skin || nextProps.size != this.props.size || nextProps.set != this.props.set || nextProps.emoji != this.props.emoji;\n\t    }\n\t  }, {\n\t    key: 'getPosition',\n\t    value: function getPosition() {\n\t      var _getData2 = this.getData();\n\n\t      var sheet_x = _getData2.sheet_x;\n\t      var sheet_y = _getData2.sheet_y;\n\t      var multiply = 100 / (SHEET_COLUMNS - 1);\n\n\t      return multiply * sheet_x + '% ' + multiply * sheet_y + '%';\n\t    }\n\t  }, {\n\t    key: 'getData',\n\t    value: function getData() {\n\t      var _props = this.props;\n\t      var emoji = _props.emoji;\n\t      var skin = _props.skin;\n\t      var set = _props.set;\n\n\t      return (0, _utils.getData)(emoji, skin, set);\n\t    }\n\t  }, {\n\t    key: 'getSanitizedData',\n\t    value: function getSanitizedData() {\n\t      var _props2 = this.props;\n\t      var emoji = _props2.emoji;\n\t      var skin = _props2.skin;\n\t      var set = _props2.set;\n\n\t      return (0, _utils.getSanitizedData)(emoji, skin, set);\n\t    }\n\t  }, {\n\t    key: 'handleClick',\n\t    value: function handleClick(e) {\n\t      var onClick = this.props.onClick;\n\t      var emoji = this.getSanitizedData();\n\n\t      onClick(emoji, e);\n\t    }\n\t  }, {\n\t    key: 'handleOver',\n\t    value: function handleOver(e) {\n\t      var onOver = this.props.onOver;\n\t      var emoji = this.getSanitizedData();\n\n\t      onOver(emoji, e);\n\t    }\n\t  }, {\n\t    key: 'handleLeave',\n\t    value: function handleLeave(e) {\n\t      var onLeave = this.props.onLeave;\n\t      var emoji = this.getSanitizedData();\n\n\t      onLeave(emoji, e);\n\t    }\n\t  }, {\n\t    key: 'render',\n\t    value: function render() {\n\t      var _props3 = this.props;\n\t      var set = _props3.set;\n\t      var size = _props3.size;\n\t      var sheetSize = _props3.sheetSize;\n\t      var native = _props3.native;\n\t      var onOver = _props3.onOver;\n\t      var onLeave = _props3.onLeave;\n\t      var backgroundImageFn = _props3.backgroundImageFn;\n\n\t      var _getData3 = this.getData();\n\n\t      var unified = _getData3.unified;\n\t      var style = {};\n\t      var children = this.props.children;\n\n\t      if (!unified) {\n\t        return null;\n\t      }\n\n\t      if (native && unified) {\n\t        style = { fontSize: size };\n\t        children = (0, _utils.unifiedToNative)(unified);\n\t      } else {\n\t        style = {\n\t          width: size,\n\t          height: size,\n\t          display: 'inline-block',\n\t          backgroundImage: 'url(' + backgroundImageFn(set, sheetSize) + ')',\n\t          backgroundSize: 100 * SHEET_COLUMNS + '%',\n\t          backgroundPosition: this.getPosition()\n\t        };\n\t      }\n\n\t      return _react2.default.createElement(\n\t        'span',\n\t        {\n\t          onClick: this.handleClick.bind(this),\n\t          onMouseEnter: this.handleOver.bind(this),\n\t          onMouseLeave: this.handleLeave.bind(this),\n\t          className: 'emoji-mart-emoji' },\n\t        _react2.default.createElement(\n\t          'span',\n\t          { style: style },\n\t          children\n\t        )\n\t      );\n\t    }\n\t  }]);\n\n\t  return Emoji;\n\t}(_react2.default.Component);\n\n\texports.default = Emoji;\n\n\n\tEmoji.propTypes = {\n\t  onOver: _react2.default.PropTypes.func,\n\t  onLeave: _react2.default.PropTypes.func,\n\t  onClick: _react2.default.PropTypes.func,\n\t  backgroundImageFn: _react2.default.PropTypes.func,\n\t  native: _react2.default.PropTypes.bool,\n\t  skin: _react2.default.PropTypes.oneOf([1, 2, 3, 4, 5, 6]),\n\t  sheetSize: _react2.default.PropTypes.oneOf([16, 20, 32, 64]),\n\t  set: _react2.default.PropTypes.oneOf(['apple', 'google', 'twitter', 'emojione']),\n\t  size: _react2.default.PropTypes.number.isRequired,\n\t  emoji: _react2.default.PropTypes.oneOfType([_react2.default.PropTypes.string, _react2.default.PropTypes.object]).isRequired\n\t};\n\n\tEmoji.defaultProps = {\n\t  skin: 1,\n\t  set: 'apple',\n\t  sheetSize: 64,\n\t  native: false,\n\t  backgroundImageFn: function backgroundImageFn(set, sheetSize) {\n\t    return 'https://unpkg.com/emoji-datasource@' + ('2.4.4') + '/sheet_' + set + '_' + sheetSize + '.png';\n\t  },\n\t  onOver: function onOver() {},\n\t  onLeave: function onLeave() {},\n\t  onClick: function onClick() {}\n\t};\n\n/***/ },\n/* 19 */\n/***/ function(module, exports) {\n\n\t\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});exports.default={\"categories\":[{\"name\":\"People\",\"emojis\":[\"grinning\",\"grimacing\",\"grin\",\"joy\",\"smiley\",\"smile\",\"sweat_smile\",\"laughing\",\"innocent\",\"wink\",\"blush\",\"slightly_smiling_face\",\"upside_down_face\",\"relaxed\",\"yum\",\"relieved\",\"heart_eyes\",\"kissing_heart\",\"kissing\",\"kissing_smiling_eyes\",\"kissing_closed_eyes\",\"stuck_out_tongue_winking_eye\",\"stuck_out_tongue_closed_eyes\",\"stuck_out_tongue\",\"money_mouth_face\",\"nerd_face\",\"sunglasses\",\"hugging_face\",\"smirk\",\"no_mouth\",\"neutral_face\",\"expressionless\",\"unamused\",\"face_with_rolling_eyes\",\"thinking_face\",\"flushed\",\"disappointed\",\"worried\",\"angry\",\"rage\",\"pensive\",\"confused\",\"slightly_frowning_face\",\"white_frowning_face\",\"persevere\",\"confounded\",\"tired_face\",\"weary\",\"triumph\",\"open_mouth\",\"scream\",\"fearful\",\"cold_sweat\",\"hushed\",\"frowning\",\"anguished\",\"cry\",\"disappointed_relieved\",\"sleepy\",\"sweat\",\"sob\",\"dizzy_face\",\"astonished\",\"zipper_mouth_face\",\"mask\",\"face_with_thermometer\",\"face_with_head_bandage\",\"sleeping\",\"zzz\",\"hankey\",\"smiling_imp\",\"imp\",\"japanese_ogre\",\"japanese_goblin\",\"skull\",\"ghost\",\"alien\",\"robot_face\",\"smiley_cat\",\"smile_cat\",\"joy_cat\",\"heart_eyes_cat\",\"smirk_cat\",\"kissing_cat\",\"scream_cat\",\"crying_cat_face\",\"pouting_cat\",\"raised_hands\",\"clap\",\"wave\",\"+1\",\"-1\",\"facepunch\",\"fist\",\"v\",\"ok_hand\",\"hand\",\"open_hands\",\"muscle\",\"pray\",\"point_up\",\"point_up_2\",\"point_down\",\"point_left\",\"point_right\",\"middle_finger\",\"raised_hand_with_fingers_splayed\",\"the_horns\",\"spock-hand\",\"writing_hand\",\"nail_care\",\"lips\",\"tongue\",\"ear\",\"nose\",\"eye\",\"eyes\",\"bust_in_silhouette\",\"busts_in_silhouette\",\"speaking_head_in_silhouette\",\"baby\",\"boy\",\"girl\",\"man\",\"woman\",\"person_with_blond_hair\",\"older_man\",\"older_woman\",\"man_with_gua_pi_mao\",\"man_with_turban\",\"cop\",\"construction_worker\",\"guardsman\",\"sleuth_or_spy\",\"santa\",\"angel\",\"princess\",\"bride_with_veil\",\"walking\",\"runner\",\"dancer\",\"dancers\",\"couple\",\"two_men_holding_hands\",\"two_women_holding_hands\",\"bow\",\"information_desk_person\",\"no_good\",\"ok_woman\",\"raising_hand\",\"person_with_pouting_face\",\"person_frowning\",\"haircut\",\"massage\",\"couple_with_heart\",\"woman-heart-woman\",\"man-heart-man\",\"couplekiss\",\"woman-kiss-woman\",\"man-kiss-man\",\"family\",\"man-woman-girl\",\"man-woman-girl-boy\",\"man-woman-boy-boy\",\"man-woman-girl-girl\",\"woman-woman-boy\",\"woman-woman-girl\",\"woman-woman-girl-boy\",\"woman-woman-boy-boy\",\"woman-woman-girl-girl\",\"man-man-boy\",\"man-man-girl\",\"man-man-girl-boy\",\"man-man-boy-boy\",\"man-man-girl-girl\",\"womans_clothes\",\"shirt\",\"jeans\",\"necktie\",\"dress\",\"bikini\",\"kimono\",\"lipstick\",\"kiss\",\"footprints\",\"high_heel\",\"sandal\",\"boot\",\"mans_shoe\",\"athletic_shoe\",\"womans_hat\",\"tophat\",\"helmet_with_white_cross\",\"mortar_board\",\"crown\",\"school_satchel\",\"pouch\",\"purse\",\"handbag\",\"briefcase\",\"eyeglasses\",\"dark_sunglasses\",\"ring\",\"closed_umbrella\"]},{\"name\":\"Nature\",\"emojis\":[\"dog\",\"cat\",\"mouse\",\"hamster\",\"rabbit\",\"bear\",\"panda_face\",\"koala\",\"tiger\",\"lion_face\",\"cow\",\"pig\",\"pig_nose\",\"frog\",\"octopus\",\"monkey_face\",\"see_no_evil\",\"hear_no_evil\",\"speak_no_evil\",\"monkey\",\"chicken\",\"penguin\",\"bird\",\"baby_chick\",\"hatching_chick\",\"hatched_chick\",\"wolf\",\"boar\",\"horse\",\"unicorn_face\",\"bee\",\"bug\",\"snail\",\"beetle\",\"ant\",\"spider\",\"scorpion\",\"crab\",\"snake\",\"turtle\",\"tropical_fish\",\"fish\",\"blowfish\",\"dolphin\",\"whale\",\"whale2\",\"crocodile\",\"leopard\",\"tiger2\",\"water_buffalo\",\"ox\",\"cow2\",\"dromedary_camel\",\"camel\",\"elephant\",\"goat\",\"ram\",\"sheep\",\"racehorse\",\"pig2\",\"rat\",\"mouse2\",\"rooster\",\"turkey\",\"dove_of_peace\",\"dog2\",\"poodle\",\"cat2\",\"rabbit2\",\"chipmunk\",\"feet\",\"dragon\",\"dragon_face\",\"cactus\",\"christmas_tree\",\"evergreen_tree\",\"deciduous_tree\",\"palm_tree\",\"seedling\",\"herb\",\"shamrock\",\"four_leaf_clover\",\"bamboo\",\"tanabata_tree\",\"leaves\",\"fallen_leaf\",\"maple_leaf\",\"ear_of_rice\",\"hibiscus\",\"sunflower\",\"rose\",\"tulip\",\"blossom\",\"cherry_blossom\",\"bouquet\",\"mushroom\",\"chestnut\",\"jack_o_lantern\",\"shell\",\"spider_web\",\"earth_americas\",\"earth_africa\",\"earth_asia\",\"full_moon\",\"waning_gibbous_moon\",\"last_quarter_moon\",\"waning_crescent_moon\",\"new_moon\",\"waxing_crescent_moon\",\"first_quarter_moon\",\"moon\",\"new_moon_with_face\",\"full_moon_with_face\",\"first_quarter_moon_with_face\",\"last_quarter_moon_with_face\",\"sun_with_face\",\"crescent_moon\",\"star\",\"star2\",\"dizzy\",\"sparkles\",\"comet\",\"sunny\",\"mostly_sunny\",\"partly_sunny\",\"barely_sunny\",\"partly_sunny_rain\",\"cloud\",\"rain_cloud\",\"thunder_cloud_and_rain\",\"lightning\",\"zap\",\"fire\",\"boom\",\"snowflake\",\"snow_cloud\",\"snowman\",\"snowman_without_snow\",\"wind_blowing_face\",\"dash\",\"tornado\",\"fog\",\"umbrella\",\"umbrella_with_rain_drops\",\"droplet\",\"sweat_drops\",\"ocean\"]},{\"name\":\"Foods\",\"emojis\":[\"green_apple\",\"apple\",\"pear\",\"tangerine\",\"lemon\",\"banana\",\"watermelon\",\"grapes\",\"strawberry\",\"melon\",\"cherries\",\"peach\",\"pineapple\",\"tomato\",\"eggplant\",\"hot_pepper\",\"corn\",\"sweet_potato\",\"honey_pot\",\"bread\",\"cheese_wedge\",\"poultry_leg\",\"meat_on_bone\",\"fried_shrimp\",\"egg\",\"hamburger\",\"fries\",\"hotdog\",\"pizza\",\"spaghetti\",\"taco\",\"burrito\",\"ramen\",\"stew\",\"fish_cake\",\"sushi\",\"bento\",\"curry\",\"rice_ball\",\"rice\",\"rice_cracker\",\"oden\",\"dango\",\"shaved_ice\",\"ice_cream\",\"icecream\",\"cake\",\"birthday\",\"custard\",\"candy\",\"lollipop\",\"chocolate_bar\",\"popcorn\",\"doughnut\",\"cookie\",\"beer\",\"beers\",\"wine_glass\",\"cocktail\",\"tropical_drink\",\"champagne\",\"sake\",\"tea\",\"coffee\",\"baby_bottle\",\"fork_and_knife\",\"knife_fork_plate\"]},{\"name\":\"Activity\",\"emojis\":[\"soccer\",\"basketball\",\"football\",\"baseball\",\"tennis\",\"volleyball\",\"rugby_football\",\"8ball\",\"golf\",\"golfer\",\"table_tennis_paddle_and_ball\",\"badminton_racquet_and_shuttlecock\",\"ice_hockey_stick_and_puck\",\"field_hockey_stick_and_ball\",\"cricket_bat_and_ball\",\"ski\",\"skier\",\"snowboarder\",\"ice_skate\",\"bow_and_arrow\",\"fishing_pole_and_fish\",\"rowboat\",\"swimmer\",\"surfer\",\"bath\",\"person_with_ball\",\"weight_lifter\",\"bicyclist\",\"mountain_bicyclist\",\"horse_racing\",\"man_in_business_suit_levitating\",\"trophy\",\"running_shirt_with_sash\",\"sports_medal\",\"medal\",\"reminder_ribbon\",\"rosette\",\"ticket\",\"admission_tickets\",\"performing_arts\",\"art\",\"circus_tent\",\"microphone\",\"headphones\",\"musical_score\",\"musical_keyboard\",\"saxophone\",\"trumpet\",\"guitar\",\"violin\",\"clapper\",\"video_game\",\"space_invader\",\"dart\",\"game_die\",\"slot_machine\",\"bowling\"]},{\"name\":\"Places\",\"emojis\":[\"car\",\"taxi\",\"blue_car\",\"bus\",\"trolleybus\",\"racing_car\",\"police_car\",\"ambulance\",\"fire_engine\",\"minibus\",\"truck\",\"articulated_lorry\",\"tractor\",\"racing_motorcycle\",\"bike\",\"rotating_light\",\"oncoming_police_car\",\"oncoming_bus\",\"oncoming_automobile\",\"oncoming_taxi\",\"aerial_tramway\",\"mountain_cableway\",\"suspension_railway\",\"railway_car\",\"train\",\"monorail\",\"bullettrain_side\",\"bullettrain_front\",\"light_rail\",\"mountain_railway\",\"steam_locomotive\",\"train2\",\"metro\",\"tram\",\"station\",\"helicopter\",\"small_airplane\",\"airplane\",\"airplane_departure\",\"airplane_arriving\",\"boat\",\"motor_boat\",\"speedboat\",\"ferry\",\"passenger_ship\",\"rocket\",\"satellite\",\"seat\",\"anchor\",\"construction\",\"fuelpump\",\"busstop\",\"vertical_traffic_light\",\"traffic_light\",\"checkered_flag\",\"ship\",\"ferris_wheel\",\"roller_coaster\",\"carousel_horse\",\"building_construction\",\"foggy\",\"tokyo_tower\",\"factory\",\"fountain\",\"rice_scene\",\"mountain\",\"snow_capped_mountain\",\"mount_fuji\",\"volcano\",\"japan\",\"camping\",\"tent\",\"national_park\",\"motorway\",\"railway_track\",\"sunrise\",\"sunrise_over_mountains\",\"desert\",\"beach_with_umbrella\",\"desert_island\",\"city_sunrise\",\"city_sunset\",\"cityscape\",\"night_with_stars\",\"bridge_at_night\",\"milky_way\",\"stars\",\"sparkler\",\"fireworks\",\"rainbow\",\"house_buildings\",\"european_castle\",\"japanese_castle\",\"stadium\",\"statue_of_liberty\",\"house\",\"house_with_garden\",\"derelict_house_building\",\"office\",\"department_store\",\"post_office\",\"european_post_office\",\"hospital\",\"bank\",\"hotel\",\"convenience_store\",\"school\",\"love_hotel\",\"wedding\",\"classical_building\",\"church\",\"mosque\",\"synagogue\",\"kaaba\",\"shinto_shrine\"]},{\"name\":\"Objects\",\"emojis\":[\"watch\",\"iphone\",\"calling\",\"computer\",\"keyboard\",\"desktop_computer\",\"printer\",\"three_button_mouse\",\"trackball\",\"joystick\",\"compression\",\"minidisc\",\"floppy_disk\",\"cd\",\"dvd\",\"vhs\",\"camera\",\"camera_with_flash\",\"video_camera\",\"movie_camera\",\"film_projector\",\"film_frames\",\"telephone_receiver\",\"phone\",\"pager\",\"fax\",\"tv\",\"radio\",\"studio_microphone\",\"level_slider\",\"control_knobs\",\"stopwatch\",\"timer_clock\",\"alarm_clock\",\"mantelpiece_clock\",\"hourglass_flowing_sand\",\"hourglass\",\"satellite_antenna\",\"battery\",\"electric_plug\",\"bulb\",\"flashlight\",\"candle\",\"wastebasket\",\"oil_drum\",\"money_with_wings\",\"dollar\",\"yen\",\"euro\",\"pound\",\"moneybag\",\"credit_card\",\"gem\",\"scales\",\"wrench\",\"hammer\",\"hammer_and_pick\",\"hammer_and_wrench\",\"pick\",\"nut_and_bolt\",\"gear\",\"chains\",\"gun\",\"bomb\",\"hocho\",\"dagger_knife\",\"crossed_swords\",\"shield\",\"smoking\",\"skull_and_crossbones\",\"coffin\",\"funeral_urn\",\"amphora\",\"crystal_ball\",\"prayer_beads\",\"barber\",\"alembic\",\"telescope\",\"microscope\",\"hole\",\"pill\",\"syringe\",\"thermometer\",\"label\",\"bookmark\",\"toilet\",\"shower\",\"bathtub\",\"key\",\"old_key\",\"couch_and_lamp\",\"sleeping_accommodation\",\"bed\",\"door\",\"bellhop_bell\",\"frame_with_picture\",\"world_map\",\"umbrella_on_ground\",\"moyai\",\"shopping_bags\",\"balloon\",\"flags\",\"ribbon\",\"gift\",\"confetti_ball\",\"tada\",\"dolls\",\"wind_chime\",\"crossed_flags\",\"izakaya_lantern\",\"email\",\"envelope_with_arrow\",\"incoming_envelope\",\"e-mail\",\"love_letter\",\"postbox\",\"mailbox_closed\",\"mailbox\",\"mailbox_with_mail\",\"mailbox_with_no_mail\",\"package\",\"postal_horn\",\"inbox_tray\",\"outbox_tray\",\"scroll\",\"page_with_curl\",\"bookmark_tabs\",\"bar_chart\",\"chart_with_upwards_trend\",\"chart_with_downwards_trend\",\"page_facing_up\",\"date\",\"calendar\",\"spiral_calendar_pad\",\"card_index\",\"card_file_box\",\"ballot_box_with_ballot\",\"file_cabinet\",\"clipboard\",\"spiral_note_pad\",\"file_folder\",\"open_file_folder\",\"card_index_dividers\",\"rolled_up_newspaper\",\"newspaper\",\"notebook\",\"closed_book\",\"green_book\",\"blue_book\",\"orange_book\",\"notebook_with_decorative_cover\",\"ledger\",\"books\",\"book\",\"link\",\"paperclip\",\"linked_paperclips\",\"scissors\",\"triangular_ruler\",\"straight_ruler\",\"pushpin\",\"round_pushpin\",\"triangular_flag_on_post\",\"waving_white_flag\",\"waving_black_flag\",\"closed_lock_with_key\",\"lock\",\"unlock\",\"lock_with_ink_pen\",\"lower_left_ballpoint_pen\",\"lower_left_fountain_pen\",\"black_nib\",\"memo\",\"pencil2\",\"lower_left_crayon\",\"lower_left_paintbrush\",\"mag\",\"mag_right\"]},{\"name\":\"Symbols\",\"emojis\":[\"heart\",\"yellow_heart\",\"green_heart\",\"blue_heart\",\"purple_heart\",\"broken_heart\",\"heavy_heart_exclamation_mark_ornament\",\"two_hearts\",\"revolving_hearts\",\"heartbeat\",\"heartpulse\",\"sparkling_heart\",\"cupid\",\"gift_heart\",\"heart_decoration\",\"peace_symbol\",\"latin_cross\",\"star_and_crescent\",\"om_symbol\",\"wheel_of_dharma\",\"star_of_david\",\"six_pointed_star\",\"menorah_with_nine_branches\",\"yin_yang\",\"orthodox_cross\",\"place_of_worship\",\"ophiuchus\",\"aries\",\"taurus\",\"gemini\",\"cancer\",\"leo\",\"virgo\",\"libra\",\"scorpius\",\"sagittarius\",\"capricorn\",\"aquarius\",\"pisces\",\"id\",\"atom_symbol\",\"u7a7a\",\"u5272\",\"radioactive_sign\",\"biohazard_sign\",\"mobile_phone_off\",\"vibration_mode\",\"u6709\",\"u7121\",\"u7533\",\"u55b6\",\"u6708\",\"eight_pointed_black_star\",\"vs\",\"accept\",\"white_flower\",\"ideograph_advantage\",\"secret\",\"congratulations\",\"u5408\",\"u6e80\",\"u7981\",\"a\",\"b\",\"ab\",\"cl\",\"o2\",\"sos\",\"no_entry\",\"name_badge\",\"no_entry_sign\",\"x\",\"o\",\"anger\",\"hotsprings\",\"no_pedestrians\",\"do_not_litter\",\"no_bicycles\",\"non-potable_water\",\"underage\",\"no_mobile_phones\",\"exclamation\",\"grey_exclamation\",\"question\",\"grey_question\",\"bangbang\",\"interrobang\",\"100\",\"low_brightness\",\"high_brightness\",\"trident\",\"fleur_de_lis\",\"part_alternation_mark\",\"warning\",\"children_crossing\",\"beginner\",\"recycle\",\"u6307\",\"chart\",\"sparkle\",\"eight_spoked_asterisk\",\"negative_squared_cross_mark\",\"white_check_mark\",\"diamond_shape_with_a_dot_inside\",\"cyclone\",\"loop\",\"globe_with_meridians\",\"m\",\"atm\",\"sa\",\"passport_control\",\"customs\",\"baggage_claim\",\"left_luggage\",\"wheelchair\",\"no_smoking\",\"wc\",\"parking\",\"potable_water\",\"mens\",\"womens\",\"baby_symbol\",\"restroom\",\"put_litter_in_its_place\",\"cinema\",\"signal_strength\",\"koko\",\"ng\",\"ok\",\"up\",\"cool\",\"new\",\"free\",\"zero\",\"one\",\"two\",\"three\",\"four\",\"five\",\"six\",\"seven\",\"eight\",\"nine\",\"keycap_ten\",\"keycap_star\",\"1234\",\"arrow_forward\",\"double_vertical_bar\",\"black_right_pointing_triangle_with_double_vertical_bar\",\"black_square_for_stop\",\"eject\",\"black_circle_for_record\",\"black_right_pointing_double_triangle_with_vertical_bar\",\"black_left_pointing_double_triangle_with_vertical_bar\",\"fast_forward\",\"rewind\",\"twisted_rightwards_arrows\",\"repeat\",\"repeat_one\",\"arrow_backward\",\"arrow_up_small\",\"arrow_down_small\",\"arrow_double_up\",\"arrow_double_down\",\"arrow_right\",\"arrow_left\",\"arrow_up\",\"arrow_down\",\"arrow_upper_right\",\"arrow_lower_right\",\"arrow_lower_left\",\"arrow_upper_left\",\"arrow_up_down\",\"left_right_arrow\",\"arrows_counterclockwise\",\"arrow_right_hook\",\"leftwards_arrow_with_hook\",\"arrow_heading_up\",\"arrow_heading_down\",\"hash\",\"information_source\",\"abc\",\"abcd\",\"capital_abcd\",\"symbols\",\"musical_note\",\"notes\",\"wavy_dash\",\"curly_loop\",\"heavy_check_mark\",\"arrows_clockwise\",\"heavy_plus_sign\",\"heavy_minus_sign\",\"heavy_division_sign\",\"heavy_multiplication_x\",\"heavy_dollar_sign\",\"currency_exchange\",\"copyright\",\"registered\",\"tm\",\"end\",\"back\",\"on\",\"top\",\"soon\",\"ballot_box_with_check\",\"radio_button\",\"white_circle\",\"black_circle\",\"red_circle\",\"large_blue_circle\",\"small_orange_diamond\",\"small_blue_diamond\",\"large_orange_diamond\",\"large_blue_diamond\",\"small_red_triangle\",\"black_small_square\",\"white_small_square\",\"black_large_square\",\"white_large_square\",\"small_red_triangle_down\",\"black_medium_square\",\"white_medium_square\",\"black_medium_small_square\",\"white_medium_small_square\",\"black_square_button\",\"white_square_button\",\"speaker\",\"sound\",\"loud_sound\",\"mute\",\"mega\",\"loudspeaker\",\"bell\",\"no_bell\",\"black_joker\",\"mahjong\",\"spades\",\"clubs\",\"hearts\",\"diamonds\",\"flower_playing_cards\",\"thought_balloon\",\"right_anger_bubble\",\"speech_balloon\",\"left_speech_bubble\",\"clock1\",\"clock2\",\"clock3\",\"clock4\",\"clock5\",\"clock6\",\"clock7\",\"clock8\",\"clock9\",\"clock10\",\"clock11\",\"clock12\",\"clock130\",\"clock230\",\"clock330\",\"clock430\",\"clock530\",\"clock630\",\"clock730\",\"clock830\",\"clock930\",\"clock1030\",\"clock1130\",\"clock1230\"]},{\"name\":\"Flags\",\"emojis\":[\"flag-ac\",\"flag-ad\",\"flag-ae\",\"flag-af\",\"flag-ag\",\"flag-ai\",\"flag-al\",\"flag-am\",\"flag-ao\",\"flag-aq\",\"flag-ar\",\"flag-as\",\"flag-at\",\"flag-au\",\"flag-aw\",\"flag-ax\",\"flag-az\",\"flag-ba\",\"flag-bb\",\"flag-bd\",\"flag-be\",\"flag-bf\",\"flag-bg\",\"flag-bh\",\"flag-bi\",\"flag-bj\",\"flag-bl\",\"flag-bm\",\"flag-bn\",\"flag-bo\",\"flag-bq\",\"flag-br\",\"flag-bs\",\"flag-bt\",\"flag-bv\",\"flag-bw\",\"flag-by\",\"flag-bz\",\"flag-ca\",\"flag-cc\",\"flag-cd\",\"flag-cf\",\"flag-cg\",\"flag-ch\",\"flag-ci\",\"flag-ck\",\"flag-cl\",\"flag-cm\",\"flag-cn\",\"flag-co\",\"flag-cp\",\"flag-cr\",\"flag-cu\",\"flag-cv\",\"flag-cw\",\"flag-cx\",\"flag-cy\",\"flag-cz\",\"flag-de\",\"flag-dg\",\"flag-dj\",\"flag-dk\",\"flag-dm\",\"flag-do\",\"flag-dz\",\"flag-ea\",\"flag-ec\",\"flag-ee\",\"flag-eg\",\"flag-eh\",\"flag-er\",\"flag-es\",\"flag-et\",\"flag-eu\",\"flag-fi\",\"flag-fj\",\"flag-fk\",\"flag-fm\",\"flag-fo\",\"flag-fr\",\"flag-ga\",\"flag-gb\",\"flag-gd\",\"flag-ge\",\"flag-gf\",\"flag-gg\",\"flag-gh\",\"flag-gi\",\"flag-gl\",\"flag-gm\",\"flag-gn\",\"flag-gp\",\"flag-gq\",\"flag-gr\",\"flag-gs\",\"flag-gt\",\"flag-gu\",\"flag-gw\",\"flag-gy\",\"flag-hk\",\"flag-hm\",\"flag-hn\",\"flag-hr\",\"flag-ht\",\"flag-hu\",\"flag-ic\",\"flag-id\",\"flag-ie\",\"flag-il\",\"flag-im\",\"flag-in\",\"flag-io\",\"flag-iq\",\"flag-ir\",\"flag-is\",\"flag-it\",\"flag-je\",\"flag-jm\",\"flag-jo\",\"flag-jp\",\"flag-ke\",\"flag-kg\",\"flag-kh\",\"flag-ki\",\"flag-km\",\"flag-kn\",\"flag-kp\",\"flag-kr\",\"flag-kw\",\"flag-ky\",\"flag-kz\",\"flag-la\",\"flag-lb\",\"flag-lc\",\"flag-li\",\"flag-lk\",\"flag-lr\",\"flag-ls\",\"flag-lt\",\"flag-lu\",\"flag-lv\",\"flag-ly\",\"flag-ma\",\"flag-mc\",\"flag-md\",\"flag-me\",\"flag-mf\",\"flag-mg\",\"flag-mh\",\"flag-mk\",\"flag-ml\",\"flag-mm\",\"flag-mn\",\"flag-mo\",\"flag-mp\",\"flag-mq\",\"flag-mr\",\"flag-ms\",\"flag-mt\",\"flag-mu\",\"flag-mv\",\"flag-mw\",\"flag-mx\",\"flag-my\",\"flag-mz\",\"flag-na\",\"flag-nc\",\"flag-ne\",\"flag-nf\",\"flag-ng\",\"flag-ni\",\"flag-nl\",\"flag-no\",\"flag-np\",\"flag-nr\",\"flag-nu\",\"flag-nz\",\"flag-om\",\"flag-pa\",\"flag-pe\",\"flag-pf\",\"flag-pg\",\"flag-ph\",\"flag-pk\",\"flag-pl\",\"flag-pm\",\"flag-pn\",\"flag-pr\",\"flag-ps\",\"flag-pt\",\"flag-pw\",\"flag-py\",\"flag-qa\",\"flag-re\",\"flag-ro\",\"flag-rs\",\"flag-ru\",\"flag-rw\",\"flag-sa\",\"flag-sb\",\"flag-sc\",\"flag-sd\",\"flag-se\",\"flag-sg\",\"flag-sh\",\"flag-si\",\"flag-sj\",\"flag-sk\",\"flag-sl\",\"flag-sm\",\"flag-sn\",\"flag-so\",\"flag-sr\",\"flag-ss\",\"flag-st\",\"flag-sv\",\"flag-sx\",\"flag-sy\",\"flag-sz\",\"flag-ta\",\"flag-tc\",\"flag-td\",\"flag-tf\",\"flag-tg\",\"flag-th\",\"flag-tj\",\"flag-tk\",\"flag-tl\",\"flag-tm\",\"flag-tn\",\"flag-to\",\"flag-tr\",\"flag-tt\",\"flag-tv\",\"flag-tw\",\"flag-tz\",\"flag-ua\",\"flag-ug\",\"flag-um\",\"flag-us\",\"flag-uy\",\"flag-uz\",\"flag-va\",\"flag-vc\",\"flag-ve\",\"flag-vg\",\"flag-vi\",\"flag-vn\",\"flag-vu\",\"flag-wf\",\"flag-ws\",\"flag-xk\",\"flag-ye\",\"flag-yt\",\"flag-za\",\"flag-zm\",\"flag-zw\"]}],\"emojis\":{\"100\":{\"name\":\"Hundred Points Symbol\",\"unified\":\"1F4AF\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":27,\"short_names\":[\"100\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"score\",\"perfect\",\"numbers\",\"century\",\"exam\",\"quiz\",\"test\",\"pass\",\"hundred\"],\"search\":\"100,hundred,points,symbol,score,perfect,numbers,century,exam,quiz,test,pass\"},\"1234\":{\"name\":\"Input Symbol for Numbers\",\"unified\":\"1F522\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":18,\"short_names\":[\"1234\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"numbers\",\"blue-square\"],\"search\":\"1234,input,symbol,for,numbers,blue-square\"},\"grinning\":{\"name\":\"Grinning Face\",\"unified\":\"1F600\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":15,\"short_names\":[\"grinning\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\":D\"],\"keywords\":[\"face\",\"smile\",\"happy\",\"joy\",\":D\"],\"search\":\"grinning,face,smile,happy,joy,:d\"},\"heart\":{\"name\":\"Heavy Black Heart\",\"unified\":\"2764\",\"variations\":[\"2764-FE0F\"],\"sheet_x\":4,\"sheet_y\":10,\"short_names\":[\"heart\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\"<3\"],\"keywords\":[\"love\",\"like\",\"valentines\"],\"search\":\"heart,heavy,black,love,like,valentines,<3\"},\"dog\":{\"name\":\"Dog Face\",\"unified\":\"1F436\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":18,\"short_names\":[\"dog\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"friend\",\"nature\",\"woof\",\"puppy\",\"pet\",\"faithful\"],\"search\":\"dog,face,animal,friend,nature,woof,puppy,pet,faithful\"},\"soccer\":{\"name\":\"Soccer Ball\",\"unified\":\"26BD\",\"variations\":[\"26BD-FE0F\"],\"sheet_x\":2,\"sheet_y\":18,\"short_names\":[\"soccer\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sports\",\"football\"],\"search\":\"soccer,ball,sports,football\"},\"watch\":{\"name\":\"Watch\",\"unified\":\"231A\",\"variations\":[\"231A-FE0F\"],\"sheet_x\":0,\"sheet_y\":14,\"short_names\":[\"watch\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"accessories\"],\"search\":\"watch,time,accessories\"},\"green_apple\":{\"name\":\"Green Apple\",\"unified\":\"1F34F\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":16,\"short_names\":[\"green_apple\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fruit\",\"nature\"],\"search\":\"green,apple,fruit,nature\"},\"flag-af\":{\"name\":\"Regional Indicator Symbol Letters AF\",\"unified\":\"1F1E6-1F1EB\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":36,\"short_names\":[\"flag-af\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,af,regional,indicator,symbol,letters\"},\"car\":{\"name\":\"Automobile\",\"unified\":\"1F697\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":35,\"short_names\":[\"car\",\"red_car\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"red\",\"transportation\",\"vehicle\"],\"search\":\"car,red,automobile,transportation,vehicle\"},\"flag-ax\":{\"name\":\"Regional Indicator Symbol Letters AX\",\"unified\":\"1F1E6-1F1FD\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":7,\"short_names\":[\"flag-ax\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ax,regional,indicator,symbol,letters\"},\"grimacing\":{\"name\":\"Grimacing Face\",\"unified\":\"1F62C\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":18,\"short_names\":[\"grimacing\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"grimace\",\"teeth\"],\"search\":\"grimacing,face,grimace,teeth\"},\"taxi\":{\"name\":\"Taxi\",\"unified\":\"1F695\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":33,\"short_names\":[\"taxi\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"uber\",\"vehicle\",\"cars\",\"transportation\"],\"search\":\"taxi,uber,vehicle,cars,transportation\"},\"iphone\":{\"name\":\"Mobile Phone\",\"unified\":\"1F4F1\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":11,\"short_names\":[\"iphone\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"technology\",\"apple\",\"gadgets\",\"dial\"],\"search\":\"iphone,mobile,phone,technology,apple,gadgets,dial\"},\"basketball\":{\"name\":\"Basketball and Hoop\",\"unified\":\"1F3C0\",\"variations\":[],\"sheet_x\":10,\"sheet_y\":6,\"short_names\":[\"basketball\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sports\",\"balls\",\"NBA\"],\"search\":\"basketball,and,hoop,sports,balls,nba\"},\"cat\":{\"name\":\"Cat Face\",\"unified\":\"1F431\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":13,\"short_names\":[\"cat\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"meow\",\"nature\",\"pet\"],\"search\":\"cat,face,animal,meow,nature,pet\"},\"apple\":{\"name\":\"Red Apple\",\"unified\":\"1F34E\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":15,\"short_names\":[\"apple\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fruit\",\"mac\",\"school\"],\"search\":\"apple,red,fruit,mac,school\"},\"yellow_heart\":{\"name\":\"Yellow Heart\",\"unified\":\"1F49B\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":2,\"short_names\":[\"yellow_heart\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\"<3\"],\"keywords\":[\"love\",\"like\",\"affection\",\"valentines\"],\"search\":\"yellow,heart,love,like,affection,valentines,<3\"},\"mouse\":{\"name\":\"Mouse Face\",\"unified\":\"1F42D\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":9,\"short_names\":[\"mouse\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"cheese\",\"rodent\"],\"search\":\"mouse,face,animal,nature,cheese,rodent\"},\"pear\":{\"name\":\"Pear\",\"unified\":\"1F350\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":17,\"short_names\":[\"pear\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fruit\",\"nature\",\"food\"],\"search\":\"pear,fruit,nature,food\"},\"green_heart\":{\"name\":\"Green Heart\",\"unified\":\"1F49A\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":1,\"short_names\":[\"green_heart\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\"<3\"],\"keywords\":[\"love\",\"like\",\"affection\",\"valentines\"],\"search\":\"green,heart,love,like,affection,valentines,<3\"},\"football\":{\"name\":\"American Football\",\"unified\":\"1F3C8\",\"variations\":[],\"sheet_x\":10,\"sheet_y\":24,\"short_names\":[\"football\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sports\",\"balls\",\"NFL\"],\"search\":\"football,american,sports,balls,nfl\"},\"grin\":{\"name\":\"Grinning Face with Smiling Eyes\",\"unified\":\"1F601\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":16,\"short_names\":[\"grin\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"happy\",\"smile\",\"joy\"],\"search\":\"grin,grinning,face,with,smiling,eyes,happy,smile,joy\"},\"flag-al\":{\"name\":\"Regional Indicator Symbol Letters AL\",\"unified\":\"1F1E6-1F1F1\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":39,\"short_names\":[\"flag-al\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,al,regional,indicator,symbol,letters\"},\"calling\":{\"name\":\"Mobile Phone with Rightwards Arrow at Left\",\"unified\":\"1F4F2\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":12,\"short_names\":[\"calling\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"iphone\",\"incoming\"],\"search\":\"calling,mobile,phone,with,rightwards,arrow,at,left,iphone,incoming\"},\"blue_car\":{\"name\":\"Recreational Vehicle\",\"unified\":\"1F699\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":37,\"short_names\":[\"blue_car\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"transportation\",\"vehicle\"],\"search\":\"blue,car,recreational,vehicle,transportation\"},\"hamster\":{\"name\":\"Hamster Face\",\"unified\":\"1F439\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":21,\"short_names\":[\"hamster\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\"],\"search\":\"hamster,face,animal,nature\"},\"blue_heart\":{\"name\":\"Blue Heart\",\"unified\":\"1F499\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":0,\"short_names\":[\"blue_heart\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\"<3\"],\"keywords\":[\"love\",\"like\",\"affection\",\"valentines\"],\"search\":\"blue,heart,love,like,affection,valentines,<3\"},\"bus\":{\"name\":\"Bus\",\"unified\":\"1F68C\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":24,\"short_names\":[\"bus\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"car\",\"vehicle\",\"transportation\"],\"search\":\"bus,car,vehicle,transportation\"},\"joy\":{\"name\":\"Face with Tears of Joy\",\"unified\":\"1F602\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":17,\"short_names\":[\"joy\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"cry\",\"tears\",\"weep\",\"happy\",\"haha\"],\"search\":\"joy,face,with,tears,of,cry,weep,happy,haha\"},\"computer\":{\"name\":\"Personal Computer\",\"unified\":\"1F4BB\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":39,\"short_names\":[\"computer\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"technology\",\"laptop\",\"screen\",\"display\",\"monitor\"],\"search\":\"computer,personal,technology,laptop,screen,display,monitor\"},\"tangerine\":{\"name\":\"Tangerine\",\"unified\":\"1F34A\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":11,\"short_names\":[\"tangerine\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"fruit\",\"nature\"],\"search\":\"tangerine,food,fruit,nature\"},\"baseball\":{\"name\":\"Baseball\",\"unified\":\"26BE\",\"variations\":[\"26BE-FE0F\"],\"sheet_x\":2,\"sheet_y\":19,\"short_names\":[\"baseball\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sports\",\"balls\"],\"search\":\"baseball,sports,balls\"},\"flag-dz\":{\"name\":\"Regional Indicator Symbol Letters DZ\",\"unified\":\"1F1E9-1F1FF\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":15,\"short_names\":[\"flag-dz\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,dz,regional,indicator,symbol,letters\"},\"tennis\":{\"name\":\"Tennis Racquet and Ball\",\"unified\":\"1F3BE\",\"variations\":[],\"sheet_x\":10,\"sheet_y\":4,\"short_names\":[\"tennis\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sports\",\"balls\",\"green\"],\"search\":\"tennis,racquet,and,ball,sports,balls,green\"},\"trolleybus\":{\"name\":\"Trolleybus\",\"unified\":\"1F68E\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":26,\"short_names\":[\"trolleybus\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"bart\",\"transportation\",\"vehicle\"],\"search\":\"trolleybus,bart,transportation,vehicle\"},\"keyboard\":{\"name\":\"Keyboard\",\"unified\":\"2328\",\"variations\":[\"2328-FE0F\"],\"sheet_x\":0,\"sheet_y\":16,\"short_names\":[\"keyboard\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"technology\",\"computer\",\"type\",\"input\",\"text\"],\"search\":\"keyboard,technology,computer,type,input,text\"},\"rabbit\":{\"name\":\"Rabbit Face\",\"unified\":\"1F430\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":12,\"short_names\":[\"rabbit\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"pet\",\"spring\",\"magic\"],\"search\":\"rabbit,face,animal,nature,pet,spring,magic\"},\"flag-as\":{\"name\":\"Regional Indicator Symbol Letters AS\",\"unified\":\"1F1E6-1F1F8\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":3,\"short_names\":[\"flag-as\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,as,regional,indicator,symbol,letters\"},\"lemon\":{\"name\":\"Lemon\",\"unified\":\"1F34B\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":12,\"short_names\":[\"lemon\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fruit\",\"nature\"],\"search\":\"lemon,fruit,nature\"},\"purple_heart\":{\"name\":\"Purple Heart\",\"unified\":\"1F49C\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":3,\"short_names\":[\"purple_heart\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\"<3\"],\"keywords\":[\"love\",\"like\",\"affection\",\"valentines\"],\"search\":\"purple,heart,love,like,affection,valentines,<3\"},\"smiley\":{\"name\":\"Smiling Face with Open Mouth\",\"unified\":\"1F603\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":18,\"short_names\":[\"smiley\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\"=)\",\"=-)\"],\"keywords\":[\"face\",\"happy\",\"joy\",\"haha\",\":D\"],\"search\":\"smiley,smiling,face,with,open,mouth,happy,joy,haha,:d,=),=-)\"},\"desktop_computer\":{\"name\":\"Desktop Computer\",\"unified\":\"1F5A5\",\"variations\":[],\"sheet_x\":25,\"sheet_y\":31,\"short_names\":[\"desktop_computer\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"technology\",\"computing\",\"screen\"],\"search\":\"desktop,computer,technology,computing,screen\"},\"racing_car\":{\"name\":\"Racing Car\",\"unified\":\"1F3CE\",\"variations\":[],\"sheet_x\":10,\"sheet_y\":40,\"short_names\":[\"racing_car\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sports\",\"race\",\"fast\",\"formula\",\"f1\"],\"search\":\"racing,car,sports,race,fast,formula,f1\"},\"volleyball\":{\"name\":\"Volleyball\",\"unified\":\"1F3D0\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":1,\"short_names\":[\"volleyball\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sports\",\"balls\"],\"search\":\"volleyball,sports,balls\"},\"banana\":{\"name\":\"Banana\",\"unified\":\"1F34C\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":13,\"short_names\":[\"banana\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fruit\",\"food\",\"monkey\"],\"search\":\"banana,fruit,food,monkey\"},\"bear\":{\"name\":\"Bear Face\",\"unified\":\"1F43B\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":23,\"short_names\":[\"bear\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"wild\"],\"search\":\"bear,face,animal,nature,wild\"},\"smile\":{\"name\":\"Smiling Face with Open Mouth and Smiling Eyes\",\"unified\":\"1F604\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":19,\"short_names\":[\"smile\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\"C:\",\"c:\",\":D\",\":-D\"],\"keywords\":[\"face\",\"happy\",\"joy\",\"funny\",\"haha\",\"laugh\",\"like\",\":D\"],\"search\":\"smile,smiling,face,with,open,mouth,and,eyes,happy,joy,funny,haha,laugh,like,:d,c:,:-d\"},\"flag-ad\":{\"name\":\"Regional Indicator Symbol Letters AD\",\"unified\":\"1F1E6-1F1E9\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":34,\"short_names\":[\"flag-ad\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ad,regional,indicator,symbol,letters\"},\"broken_heart\":{\"name\":\"Broken Heart\",\"unified\":\"1F494\",\"variations\":[],\"sheet_x\":19,\"sheet_y\":36,\"short_names\":[\"broken_heart\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\"</3\"],\"keywords\":[\"sad\",\"sorry\",\"break\"],\"search\":\"broken,heart,sad,sorry,break,</3\"},\"sweat_smile\":{\"name\":\"Smiling Face with Open Mouth and Cold Sweat\",\"unified\":\"1F605\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":20,\"short_names\":[\"sweat_smile\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"hot\",\"happy\",\"laugh\"],\"search\":\"sweat,smile,smiling,face,with,open,mouth,and,cold,hot,happy,laugh\"},\"printer\":{\"name\":\"Printer\",\"unified\":\"1F5A8\",\"variations\":[],\"sheet_x\":25,\"sheet_y\":32,\"short_names\":[\"printer\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"paper\",\"ink\"],\"search\":\"printer,paper,ink\"},\"rugby_football\":{\"name\":\"Rugby Football\",\"unified\":\"1F3C9\",\"variations\":[],\"sheet_x\":10,\"sheet_y\":25,\"short_names\":[\"rugby_football\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sports\",\"team\"],\"search\":\"rugby,football,sports,team\"},\"heavy_heart_exclamation_mark_ornament\":{\"name\":\"Heavy Heart Exclamation Mark Ornament\",\"unified\":\"2763\",\"variations\":[\"2763-FE0F\"],\"sheet_x\":4,\"sheet_y\":9,\"short_names\":[\"heavy_heart_exclamation_mark_ornament\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"decoration\",\"love\"],\"search\":\"heavy,heart,exclamation,mark,ornament,decoration,love\"},\"flag-ao\":{\"name\":\"Regional Indicator Symbol Letters AO\",\"unified\":\"1F1E6-1F1F4\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":0,\"short_names\":[\"flag-ao\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ao,regional,indicator,symbol,letters\"},\"watermelon\":{\"name\":\"Watermelon\",\"unified\":\"1F349\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":10,\"short_names\":[\"watermelon\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fruit\",\"food\",\"picnic\",\"summer\"],\"search\":\"watermelon,fruit,food,picnic,summer\"},\"panda_face\":{\"name\":\"Panda Face\",\"unified\":\"1F43C\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":24,\"short_names\":[\"panda_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\"],\"search\":\"panda,face,animal,nature\"},\"police_car\":{\"name\":\"Police Car\",\"unified\":\"1F693\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":31,\"short_names\":[\"police_car\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"vehicle\",\"cars\",\"transportation\",\"law\",\"legal\",\"enforcement\"],\"search\":\"police,car,vehicle,cars,transportation,law,legal,enforcement\"},\"ambulance\":{\"name\":\"Ambulance\",\"unified\":\"1F691\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":29,\"short_names\":[\"ambulance\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"health\",\"911\",\"hospital\"],\"search\":\"ambulance,health,911,hospital\"},\"grapes\":{\"name\":\"Grapes\",\"unified\":\"1F347\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":8,\"short_names\":[\"grapes\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fruit\",\"food\",\"wine\"],\"search\":\"grapes,fruit,food,wine\"},\"two_hearts\":{\"name\":\"Two Hearts\",\"unified\":\"1F495\",\"variations\":[],\"sheet_x\":19,\"sheet_y\":37,\"short_names\":[\"two_hearts\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"love\",\"like\",\"affection\",\"valentines\"],\"search\":\"two,hearts,love,like,affection,valentines\"},\"flag-ai\":{\"name\":\"Regional Indicator Symbol Letters AI\",\"unified\":\"1F1E6-1F1EE\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":38,\"short_names\":[\"flag-ai\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ai,regional,indicator,symbol,letters\"},\"three_button_mouse\":{\"name\":\"Three Button Mouse\",\"unified\":\"1F5B1\",\"variations\":[],\"sheet_x\":25,\"sheet_y\":33,\"short_names\":[\"three_button_mouse\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"click\"],\"search\":\"three,button,mouse,click\"},\"8ball\":{\"name\":\"Billiards\",\"unified\":\"1F3B1\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":32,\"short_names\":[\"8ball\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"pool\",\"hobby\",\"game\",\"luck\",\"magic\"],\"search\":\"8ball,billiards,pool,hobby,game,luck,magic\"},\"laughing\":{\"name\":\"Smiling Face with Open Mouth and Tightly-Closed Eyes\",\"unified\":\"1F606\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":21,\"short_names\":[\"laughing\",\"satisfied\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\":>\",\":->\"],\"keywords\":[\"happy\",\"joy\",\"lol\",\"satisfied\",\"haha\",\"face\",\"glad\",\"XD\"],\"search\":\"laughing,satisfied,smiling,face,with,open,mouth,and,tightly,closed,eyes,happy,joy,lol,haha,glad,xd,:>,:->\"},\"koala\":{\"name\":\"Koala\",\"unified\":\"1F428\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":4,\"short_names\":[\"koala\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\"],\"search\":\"koala,animal,nature\"},\"flag-aq\":{\"name\":\"Regional Indicator Symbol Letters AQ\",\"unified\":\"1F1E6-1F1F6\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":1,\"short_names\":[\"flag-aq\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,aq,regional,indicator,symbol,letters\"},\"fire_engine\":{\"name\":\"Fire Engine\",\"unified\":\"1F692\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":30,\"short_names\":[\"fire_engine\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"transportation\",\"cars\",\"vehicle\"],\"search\":\"fire,engine,transportation,cars,vehicle\"},\"revolving_hearts\":{\"name\":\"Revolving Hearts\",\"unified\":\"1F49E\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":5,\"short_names\":[\"revolving_hearts\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"love\",\"like\",\"affection\",\"valentines\"],\"search\":\"revolving,hearts,love,like,affection,valentines\"},\"golf\":{\"name\":\"Flag in Hole\",\"unified\":\"26F3\",\"variations\":[\"26F3-FE0F\"],\"sheet_x\":2,\"sheet_y\":33,\"short_names\":[\"golf\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sports\",\"business\",\"flag\",\"hole\",\"summer\"],\"search\":\"golf,flag,in,hole,sports,business,summer\"},\"innocent\":{\"name\":\"Smiling Face with Halo\",\"unified\":\"1F607\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":22,\"short_names\":[\"innocent\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"angel\",\"heaven\",\"halo\"],\"search\":\"innocent,smiling,face,with,halo,angel,heaven\"},\"strawberry\":{\"name\":\"Strawberry\",\"unified\":\"1F353\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":20,\"short_names\":[\"strawberry\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fruit\",\"food\",\"nature\"],\"search\":\"strawberry,fruit,food,nature\"},\"trackball\":{\"name\":\"Trackball\",\"unified\":\"1F5B2\",\"variations\":[],\"sheet_x\":25,\"sheet_y\":34,\"short_names\":[\"trackball\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"technology\",\"trackpad\"],\"search\":\"trackball,technology,trackpad\"},\"tiger\":{\"name\":\"Tiger Face\",\"unified\":\"1F42F\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":11,\"short_names\":[\"tiger\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"cat\",\"danger\",\"wild\",\"nature\",\"roar\"],\"search\":\"tiger,face,animal,cat,danger,wild,nature,roar\"},\"lion_face\":{\"name\":\"Lion Face\",\"unified\":\"1F981\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":16,\"short_names\":[\"lion_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\"],\"search\":\"lion,face,animal,nature\"},\"flag-ag\":{\"name\":\"Regional Indicator Symbol Letters AG\",\"unified\":\"1F1E6-1F1EC\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":37,\"short_names\":[\"flag-ag\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ag,regional,indicator,symbol,letters\"},\"minibus\":{\"name\":\"Minibus\",\"unified\":\"1F690\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":28,\"short_names\":[\"minibus\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"vehicle\",\"car\",\"transportation\"],\"search\":\"minibus,vehicle,car,transportation\"},\"melon\":{\"name\":\"Melon\",\"unified\":\"1F348\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":9,\"short_names\":[\"melon\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fruit\",\"nature\",\"food\"],\"search\":\"melon,fruit,nature,food\"},\"wink\":{\"name\":\"Winking Face\",\"unified\":\"1F609\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":24,\"short_names\":[\"wink\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\";)\",\";-)\"],\"keywords\":[\"face\",\"happy\",\"mischievous\",\"secret\"],\"search\":\"wink,winking,face,happy,mischievous,secret,;),;-)\"},\"golfer\":{\"name\":\"Golfer\",\"unified\":\"1F3CC\",\"variations\":[],\"sheet_x\":10,\"sheet_y\":38,\"short_names\":[\"golfer\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sports\",\"business\"],\"search\":\"golfer,sports,business\"},\"heartbeat\":{\"name\":\"Beating Heart\",\"unified\":\"1F493\",\"variations\":[],\"sheet_x\":19,\"sheet_y\":35,\"short_names\":[\"heartbeat\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"love\",\"like\",\"affection\",\"valentines\",\"pink\"],\"search\":\"heartbeat,beating,heart,love,like,affection,valentines,pink\"},\"joystick\":{\"name\":\"Joystick\",\"unified\":\"1F579\",\"variations\":[],\"sheet_x\":25,\"sheet_y\":7,\"short_names\":[\"joystick\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"game\",\"play\"],\"search\":\"joystick,game,play\"},\"heartpulse\":{\"name\":\"Growing Heart\",\"unified\":\"1F497\",\"variations\":[],\"sheet_x\":19,\"sheet_y\":39,\"short_names\":[\"heartpulse\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"like\",\"love\",\"affection\",\"valentines\",\"pink\"],\"search\":\"heartpulse,growing,heart,like,love,affection,valentines,pink\"},\"flag-ar\":{\"name\":\"Regional Indicator Symbol Letters AR\",\"unified\":\"1F1E6-1F1F7\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":2,\"short_names\":[\"flag-ar\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ar,regional,indicator,symbol,letters\"},\"table_tennis_paddle_and_ball\":{\"name\":\"Table Tennis Paddle and Ball\",\"unified\":\"1F3D3\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":4,\"short_names\":[\"table_tennis_paddle_and_ball\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"table,tennis,paddle,and,ball\"},\"cow\":{\"name\":\"Cow Face\",\"unified\":\"1F42E\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":10,\"short_names\":[\"cow\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"beef\",\"ox\",\"animal\",\"nature\",\"moo\",\"milk\"],\"search\":\"cow,face,beef,ox,animal,nature,moo,milk\"},\"cherries\":{\"name\":\"Cherries\",\"unified\":\"1F352\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":19,\"short_names\":[\"cherries\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"fruit\"],\"search\":\"cherries,food,fruit\"},\"compression\":{\"name\":\"Compression\",\"unified\":\"1F5DC\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":1,\"short_names\":[\"compression\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"tool\"],\"search\":\"compression,tool\"},\"truck\":{\"name\":\"Delivery Truck\",\"unified\":\"1F69A\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":38,\"short_names\":[\"truck\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"cars\",\"transportation\"],\"search\":\"truck,delivery,cars,transportation\"},\"blush\":{\"name\":\"Smiling Face with Smiling Eyes\",\"unified\":\"1F60A\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":25,\"short_names\":[\"blush\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\":)\"],\"keywords\":[\"face\",\"smile\",\"happy\",\"flushed\",\"crush\",\"embarrassed\",\"shy\",\"joy\"],\"search\":\"blush,smiling,face,with,eyes,smile,happy,flushed,crush,embarrassed,shy,joy,:)\"},\"slightly_smiling_face\":{\"name\":\"Slightly Smiling Face\",\"unified\":\"1F642\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":40,\"short_names\":[\"slightly_smiling_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\":)\",\"(:\",\":-)\"],\"keywords\":[],\"search\":\"slightly,smiling,face,:),(:,:-)\"},\"pig\":{\"name\":\"Pig Face\",\"unified\":\"1F437\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":19,\"short_names\":[\"pig\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"oink\",\"nature\"],\"search\":\"pig,face,animal,oink,nature\"},\"sparkling_heart\":{\"name\":\"Sparkling Heart\",\"unified\":\"1F496\",\"variations\":[],\"sheet_x\":19,\"sheet_y\":38,\"short_names\":[\"sparkling_heart\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"love\",\"like\",\"affection\",\"valentines\"],\"search\":\"sparkling,heart,love,like,affection,valentines\"},\"badminton_racquet_and_shuttlecock\":{\"name\":\"Badminton Racquet and Shuttlecock\",\"unified\":\"1F3F8\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":38,\"short_names\":[\"badminton_racquet_and_shuttlecock\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"badminton,racquet,and,shuttlecock\"},\"peach\":{\"name\":\"Peach\",\"unified\":\"1F351\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":18,\"short_names\":[\"peach\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fruit\",\"nature\",\"food\"],\"search\":\"peach,fruit,nature,food\"},\"minidisc\":{\"name\":\"Minidisc\",\"unified\":\"1F4BD\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":0,\"short_names\":[\"minidisc\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"technology\",\"record\",\"data\",\"disk\",\"90s\"],\"search\":\"minidisc,technology,record,data,disk,90s\"},\"articulated_lorry\":{\"name\":\"Articulated Lorry\",\"unified\":\"1F69B\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":39,\"short_names\":[\"articulated_lorry\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"vehicle\",\"cars\",\"transportation\",\"express\"],\"search\":\"articulated,lorry,vehicle,cars,transportation,express\"},\"flag-am\":{\"name\":\"Regional Indicator Symbol Letters AM\",\"unified\":\"1F1E6-1F1F2\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":40,\"short_names\":[\"flag-am\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,am,regional,indicator,symbol,letters\"},\"ice_hockey_stick_and_puck\":{\"name\":\"Ice Hockey Stick and Puck\",\"unified\":\"1F3D2\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":3,\"short_names\":[\"ice_hockey_stick_and_puck\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"ice,hockey,stick,and,puck\"},\"pineapple\":{\"name\":\"Pineapple\",\"unified\":\"1F34D\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":14,\"short_names\":[\"pineapple\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fruit\",\"nature\",\"food\"],\"search\":\"pineapple,fruit,nature,food\"},\"flag-aw\":{\"name\":\"Regional Indicator Symbol Letters AW\",\"unified\":\"1F1E6-1F1FC\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":6,\"short_names\":[\"flag-aw\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,aw,regional,indicator,symbol,letters\"},\"pig_nose\":{\"name\":\"Pig Nose\",\"unified\":\"1F43D\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":25,\"short_names\":[\"pig_nose\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"oink\"],\"search\":\"pig,nose,animal,oink\"},\"floppy_disk\":{\"name\":\"Floppy Disk\",\"unified\":\"1F4BE\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":1,\"short_names\":[\"floppy_disk\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"oldschool\",\"technology\",\"save\",\"90s\",\"80s\"],\"search\":\"floppy,disk,oldschool,technology,save,90s,80s\"},\"tractor\":{\"name\":\"Tractor\",\"unified\":\"1F69C\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":40,\"short_names\":[\"tractor\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"vehicle\",\"car\",\"farming\",\"agriculture\"],\"search\":\"tractor,vehicle,car,farming,agriculture\"},\"upside_down_face\":{\"name\":\"Upside-Down Face\",\"unified\":\"1F643\",\"variations\":[],\"sheet_x\":28,\"sheet_y\":0,\"short_names\":[\"upside_down_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"upside,down,face\"},\"cupid\":{\"name\":\"Heart with Arrow\",\"unified\":\"1F498\",\"variations\":[],\"sheet_x\":19,\"sheet_y\":40,\"short_names\":[\"cupid\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"love\",\"like\",\"heart\",\"affection\",\"valentines\"],\"search\":\"cupid,heart,with,arrow,love,like,affection,valentines\"},\"cd\":{\"name\":\"Optical Disc\",\"unified\":\"1F4BF\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":2,\"short_names\":[\"cd\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"technology\",\"dvd\",\"disk\",\"disc\",\"90s\"],\"search\":\"cd,optical,disc,technology,dvd,disk,90s\"},\"gift_heart\":{\"name\":\"Heart with Ribbon\",\"unified\":\"1F49D\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":4,\"short_names\":[\"gift_heart\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"love\",\"valentines\"],\"search\":\"gift,heart,with,ribbon,love,valentines\"},\"flag-au\":{\"name\":\"Regional Indicator Symbol Letters AU\",\"unified\":\"1F1E6-1F1FA\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":5,\"short_names\":[\"flag-au\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,au,regional,indicator,symbol,letters\"},\"field_hockey_stick_and_ball\":{\"name\":\"Field Hockey Stick and Ball\",\"unified\":\"1F3D1\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":2,\"short_names\":[\"field_hockey_stick_and_ball\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"field,hockey,stick,and,ball\"},\"tomato\":{\"name\":\"Tomato\",\"unified\":\"1F345\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":6,\"short_names\":[\"tomato\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fruit\",\"vegetable\",\"nature\",\"food\"],\"search\":\"tomato,fruit,vegetable,nature,food\"},\"racing_motorcycle\":{\"name\":\"Racing Motorcycle\",\"unified\":\"1F3CD\",\"variations\":[],\"sheet_x\":10,\"sheet_y\":39,\"short_names\":[\"racing_motorcycle\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"race\",\"sports\",\"fast\"],\"search\":\"racing,motorcycle,race,sports,fast\"},\"relaxed\":{\"name\":\"White Smiling Face\",\"unified\":\"263A\",\"variations\":[\"263A-FE0F\"],\"sheet_x\":1,\"sheet_y\":25,\"short_names\":[\"relaxed\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"blush\",\"massage\",\"happiness\"],\"search\":\"relaxed,white,smiling,face,blush,massage,happiness\"},\"frog\":{\"name\":\"Frog Face\",\"unified\":\"1F438\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":20,\"short_names\":[\"frog\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"croak\"],\"search\":\"frog,face,animal,nature,croak\"},\"cricket_bat_and_ball\":{\"name\":\"Cricket Bat and Ball\",\"unified\":\"1F3CF\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":0,\"short_names\":[\"cricket_bat_and_ball\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"cricket,bat,and,ball\"},\"dvd\":{\"name\":\"Dvd\",\"unified\":\"1F4C0\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":3,\"short_names\":[\"dvd\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"cd\",\"disk\",\"disc\"],\"search\":\"dvd,cd,disk,disc\"},\"octopus\":{\"name\":\"Octopus\",\"unified\":\"1F419\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":30,\"short_names\":[\"octopus\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"creature\",\"ocean\",\"sea\",\"nature\",\"beach\"],\"search\":\"octopus,animal,creature,ocean,sea,nature,beach\"},\"bike\":{\"name\":\"Bicycle\",\"unified\":\"1F6B2\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":26,\"short_names\":[\"bike\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sports\",\"bicycle\",\"exercise\",\"hipster\"],\"search\":\"bike,bicycle,sports,exercise,hipster\"},\"heart_decoration\":{\"name\":\"Heart Decoration\",\"unified\":\"1F49F\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":6,\"short_names\":[\"heart_decoration\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"purple-square\",\"love\",\"like\"],\"search\":\"heart,decoration,purple-square,love,like\"},\"yum\":{\"name\":\"Face Savouring Delicious Food\",\"unified\":\"1F60B\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":26,\"short_names\":[\"yum\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"happy\",\"joy\",\"tongue\",\"smile\",\"face\",\"silly\",\"yummy\"],\"search\":\"yum,face,savouring,delicious,food,happy,joy,tongue,smile,silly,yummy\"},\"eggplant\":{\"name\":\"Aubergine\",\"unified\":\"1F346\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":7,\"short_names\":[\"eggplant\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"vegetable\",\"nature\",\"food\",\"aubergine\"],\"search\":\"eggplant,aubergine,vegetable,nature,food\"},\"flag-at\":{\"name\":\"Regional Indicator Symbol Letters AT\",\"unified\":\"1F1E6-1F1F9\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":4,\"short_names\":[\"flag-at\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,at,regional,indicator,symbol,letters\"},\"rotating_light\":{\"name\":\"Police Cars Revolving Light\",\"unified\":\"1F6A8\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":16,\"short_names\":[\"rotating_light\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"police\",\"ambulance\",\"911\",\"emergency\",\"alert\",\"error\",\"pinged\",\"law\",\"legal\"],\"search\":\"rotating,light,police,cars,revolving,ambulance,911,emergency,alert,error,pinged,law,legal\"},\"monkey_face\":{\"name\":\"Monkey Face\",\"unified\":\"1F435\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":17,\"short_names\":[\"monkey_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\":o)\"],\"keywords\":[\"animal\",\"nature\",\"circus\"],\"search\":\"monkey,face,animal,nature,circus,:o)\"},\"ski\":{\"name\":\"Ski and Ski Boot\",\"unified\":\"1F3BF\",\"variations\":[],\"sheet_x\":10,\"sheet_y\":5,\"short_names\":[\"ski\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sports\",\"winter\",\"cold\",\"snow\"],\"search\":\"ski,and,boot,sports,winter,cold,snow\"},\"hot_pepper\":{\"name\":\"Hot Pepper\",\"unified\":\"1F336\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":32,\"short_names\":[\"hot_pepper\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"spicy\"],\"search\":\"hot,pepper,food,spicy\"},\"peace_symbol\":{\"name\":\"Peace Symbol\",\"unified\":\"262E\",\"variations\":[\"262E-FE0F\"],\"sheet_x\":1,\"sheet_y\":21,\"short_names\":[\"peace_symbol\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"hippie\"],\"search\":\"peace,symbol,hippie\"},\"flag-az\":{\"name\":\"Regional Indicator Symbol Letters AZ\",\"unified\":\"1F1E6-1F1FF\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":8,\"short_names\":[\"flag-az\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,az,regional,indicator,symbol,letters\"},\"relieved\":{\"name\":\"Relieved Face\",\"unified\":\"1F60C\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":27,\"short_names\":[\"relieved\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"relaxed\",\"phew\",\"massage\",\"happiness\"],\"search\":\"relieved,face,relaxed,phew,massage,happiness\"},\"vhs\":{\"name\":\"Videocassette\",\"unified\":\"1F4FC\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":22,\"short_names\":[\"vhs\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"record\",\"video\",\"oldschool\",\"90s\",\"80s\"],\"search\":\"vhs,videocassette,record,video,oldschool,90s,80s\"},\"oncoming_police_car\":{\"name\":\"Oncoming Police Car\",\"unified\":\"1F694\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":32,\"short_names\":[\"oncoming_police_car\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"vehicle\",\"law\",\"legal\",\"enforcement\",\"911\"],\"search\":\"oncoming,police,car,vehicle,law,legal,enforcement,911\"},\"corn\":{\"name\":\"Ear of Maize\",\"unified\":\"1F33D\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":39,\"short_names\":[\"corn\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"vegetable\",\"plant\"],\"search\":\"corn,ear,of,maize,food,vegetable,plant\"},\"latin_cross\":{\"name\":\"Latin Cross\",\"unified\":\"271D\",\"variations\":[\"271D-FE0F\"],\"sheet_x\":3,\"sheet_y\":37,\"short_names\":[\"latin_cross\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"christianity\"],\"search\":\"latin,cross,christianity\"},\"camera\":{\"name\":\"Camera\",\"unified\":\"1F4F7\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":17,\"short_names\":[\"camera\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"gadgets\",\"photography\"],\"search\":\"camera,gadgets,photography\"},\"see_no_evil\":{\"name\":\"See-No-Evil Monkey\",\"unified\":\"1F648\",\"variations\":[],\"sheet_x\":28,\"sheet_y\":20,\"short_names\":[\"see_no_evil\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"monkey\",\"animal\",\"nature\",\"haha\"],\"search\":\"see,no,evil,monkey,animal,nature,haha\"},\"heart_eyes\":{\"name\":\"Smiling Face with Heart-Shaped Eyes\",\"unified\":\"1F60D\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":28,\"short_names\":[\"heart_eyes\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"love\",\"like\",\"affection\",\"valentines\",\"infatuation\",\"crush\"],\"search\":\"heart,eyes,smiling,face,with,shaped,love,like,affection,valentines,infatuation,crush\"},\"flag-bs\":{\"name\":\"Regional Indicator Symbol Letters BS\",\"unified\":\"1F1E7-1F1F8\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":24,\"short_names\":[\"flag-bs\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,bs,regional,indicator,symbol,letters\"},\"skier\":{\"name\":\"Skier\",\"unified\":\"26F7\",\"variations\":[],\"sheet_x\":2,\"sheet_y\":36,\"short_names\":[\"skier\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sports\",\"winter\",\"snow\"],\"search\":\"skier,sports,winter,snow\"},\"oncoming_bus\":{\"name\":\"Oncoming Bus\",\"unified\":\"1F68D\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":25,\"short_names\":[\"oncoming_bus\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"vehicle\",\"transportation\"],\"search\":\"oncoming,bus,vehicle,transportation\"},\"snowboarder\":{\"name\":\"Snowboarder\",\"unified\":\"1F3C2\",\"variations\":[],\"sheet_x\":10,\"sheet_y\":8,\"short_names\":[\"snowboarder\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sports\",\"winter\"],\"search\":\"snowboarder,sports,winter\"},\"sweet_potato\":{\"name\":\"Roasted Sweet Potato\",\"unified\":\"1F360\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":33,\"short_names\":[\"sweet_potato\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"nature\"],\"search\":\"sweet,potato,roasted,food,nature\"},\"hear_no_evil\":{\"name\":\"Hear-No-Evil Monkey\",\"unified\":\"1F649\",\"variations\":[],\"sheet_x\":28,\"sheet_y\":21,\"short_names\":[\"hear_no_evil\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"monkey\",\"nature\"],\"search\":\"hear,no,evil,monkey,animal,nature\"},\"flag-bh\":{\"name\":\"Regional Indicator Symbol Letters BH\",\"unified\":\"1F1E7-1F1ED\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":15,\"short_names\":[\"flag-bh\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,bh,regional,indicator,symbol,letters\"},\"star_and_crescent\":{\"name\":\"Star and Crescent\",\"unified\":\"262A\",\"variations\":[\"262A-FE0F\"],\"sheet_x\":1,\"sheet_y\":20,\"short_names\":[\"star_and_crescent\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"islam\"],\"search\":\"star,and,crescent,islam\"},\"kissing_heart\":{\"name\":\"Face Throwing a Kiss\",\"unified\":\"1F618\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":39,\"short_names\":[\"kissing_heart\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"love\",\"like\",\"affection\",\"valentines\",\"infatuation\"],\"search\":\"kissing,heart,face,throwing,a,kiss,love,like,affection,valentines,infatuation\"},\"camera_with_flash\":{\"name\":\"Camera with Flash\",\"unified\":\"1F4F8\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":18,\"short_names\":[\"camera_with_flash\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photography\",\"gadgets\"],\"search\":\"camera,with,flash,photography,gadgets\"},\"ice_skate\":{\"name\":\"Ice Skate\",\"unified\":\"26F8\",\"variations\":[],\"sheet_x\":2,\"sheet_y\":37,\"short_names\":[\"ice_skate\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sports\"],\"search\":\"ice,skate,sports\"},\"oncoming_automobile\":{\"name\":\"Oncoming Automobile\",\"unified\":\"1F698\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":36,\"short_names\":[\"oncoming_automobile\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"car\",\"vehicle\",\"transportation\"],\"search\":\"oncoming,automobile,car,vehicle,transportation\"},\"speak_no_evil\":{\"name\":\"Speak-No-Evil Monkey\",\"unified\":\"1F64A\",\"variations\":[],\"sheet_x\":28,\"sheet_y\":22,\"short_names\":[\"speak_no_evil\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"monkey\",\"animal\",\"nature\",\"omg\"],\"search\":\"speak,no,evil,monkey,animal,nature,omg\"},\"honey_pot\":{\"name\":\"Honey Pot\",\"unified\":\"1F36F\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":7,\"short_names\":[\"honey_pot\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"bees\",\"sweet\",\"kitchen\"],\"search\":\"honey,pot,bees,sweet,kitchen\"},\"kissing\":{\"name\":\"Kissing Face\",\"unified\":\"1F617\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":38,\"short_names\":[\"kissing\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"love\",\"like\",\"face\",\"3\",\"valentines\",\"infatuation\"],\"search\":\"kissing,face,love,like,3,valentines,infatuation\"},\"video_camera\":{\"name\":\"Video Camera\",\"unified\":\"1F4F9\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":19,\"short_names\":[\"video_camera\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"film\",\"record\"],\"search\":\"video,camera,film,record\"},\"om_symbol\":{\"name\":\"Om Symbol\",\"unified\":\"1F549\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":5,\"short_names\":[\"om_symbol\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"hinduism\",\"buddhism\",\"sikhism\",\"jainism\"],\"search\":\"om,symbol,hinduism,buddhism,sikhism,jainism\"},\"flag-bd\":{\"name\":\"Regional Indicator Symbol Letters BD\",\"unified\":\"1F1E7-1F1E9\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":11,\"short_names\":[\"flag-bd\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,bd,regional,indicator,symbol,letters\"},\"monkey\":{\"name\":\"Monkey\",\"unified\":\"1F412\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":23,\"short_names\":[\"monkey\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"banana\",\"circus\"],\"search\":\"monkey,animal,nature,banana,circus\"},\"movie_camera\":{\"name\":\"Movie Camera\",\"unified\":\"1F3A5\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":20,\"short_names\":[\"movie_camera\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"film\",\"record\"],\"search\":\"movie,camera,film,record\"},\"oncoming_taxi\":{\"name\":\"Oncoming Taxi\",\"unified\":\"1F696\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":34,\"short_names\":[\"oncoming_taxi\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"vehicle\",\"cars\",\"uber\"],\"search\":\"oncoming,taxi,vehicle,cars,uber\"},\"flag-bb\":{\"name\":\"Regional Indicator Symbol Letters BB\",\"unified\":\"1F1E7-1F1E7\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":10,\"short_names\":[\"flag-bb\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,bb,regional,indicator,symbol,letters\"},\"kissing_smiling_eyes\":{\"name\":\"Kissing Face with Smiling Eyes\",\"unified\":\"1F619\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":40,\"short_names\":[\"kissing_smiling_eyes\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"affection\",\"valentines\",\"infatuation\"],\"search\":\"kissing,smiling,eyes,face,with,affection,valentines,infatuation\"},\"bread\":{\"name\":\"Bread\",\"unified\":\"1F35E\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":31,\"short_names\":[\"bread\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"wheat\",\"breakfast\",\"toast\"],\"search\":\"bread,food,wheat,breakfast,toast\"},\"bow_and_arrow\":{\"name\":\"Bow and Arrow\",\"unified\":\"1F3F9\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":39,\"short_names\":[\"bow_and_arrow\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sports\"],\"search\":\"bow,and,arrow,sports\"},\"wheel_of_dharma\":{\"name\":\"Wheel of Dharma\",\"unified\":\"2638\",\"variations\":[\"2638-FE0F\"],\"sheet_x\":1,\"sheet_y\":23,\"short_names\":[\"wheel_of_dharma\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"hinduism\",\"buddhism\",\"sikhism\",\"jainism\"],\"search\":\"wheel,of,dharma,hinduism,buddhism,sikhism,jainism\"},\"aerial_tramway\":{\"name\":\"Aerial Tramway\",\"unified\":\"1F6A1\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":4,\"short_names\":[\"aerial_tramway\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"transportation\",\"vehicle\",\"ski\"],\"search\":\"aerial,tramway,transportation,vehicle,ski\"},\"cheese_wedge\":{\"name\":\"Cheese Wedge\",\"unified\":\"1F9C0\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":20,\"short_names\":[\"cheese_wedge\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"chadder\"],\"search\":\"cheese,wedge,food,chadder\"},\"film_projector\":{\"name\":\"Film Projector\",\"unified\":\"1F4FD\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":23,\"short_names\":[\"film_projector\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"video\",\"tape\",\"record\",\"movie\"],\"search\":\"film,projector,video,tape,record,movie\"},\"fishing_pole_and_fish\":{\"name\":\"Fishing Pole and Fish\",\"unified\":\"1F3A3\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":18,\"short_names\":[\"fishing_pole_and_fish\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"hobby\",\"summer\"],\"search\":\"fishing,pole,and,fish,food,hobby,summer\"},\"kissing_closed_eyes\":{\"name\":\"Kissing Face with Closed Eyes\",\"unified\":\"1F61A\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":0,\"short_names\":[\"kissing_closed_eyes\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"love\",\"like\",\"affection\",\"valentines\",\"infatuation\"],\"search\":\"kissing,closed,eyes,face,with,love,like,affection,valentines,infatuation\"},\"star_of_david\":{\"name\":\"Star of David\",\"unified\":\"2721\",\"variations\":[\"2721-FE0F\"],\"sheet_x\":3,\"sheet_y\":38,\"short_names\":[\"star_of_david\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"judaism\"],\"search\":\"star,of,david,judaism\"},\"chicken\":{\"name\":\"Chicken\",\"unified\":\"1F414\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":25,\"short_names\":[\"chicken\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"cluck\",\"nature\",\"bird\"],\"search\":\"chicken,animal,cluck,nature,bird\"},\"flag-by\":{\"name\":\"Regional Indicator Symbol Letters BY\",\"unified\":\"1F1E7-1F1FE\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":28,\"short_names\":[\"flag-by\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,by,regional,indicator,symbol,letters\"},\"six_pointed_star\":{\"name\":\"Six Pointed Star with Middle Dot\",\"unified\":\"1F52F\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":31,\"short_names\":[\"six_pointed_star\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"purple-square\",\"religion\",\"jewish\",\"hexagram\"],\"search\":\"six,pointed,star,with,middle,dot,purple-square,religion,jewish,hexagram\"},\"penguin\":{\"name\":\"Penguin\",\"unified\":\"1F427\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":3,\"short_names\":[\"penguin\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\"],\"search\":\"penguin,animal,nature\"},\"mountain_cableway\":{\"name\":\"Mountain Cableway\",\"unified\":\"1F6A0\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":3,\"short_names\":[\"mountain_cableway\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"transportation\",\"vehicle\",\"ski\"],\"search\":\"mountain,cableway,transportation,vehicle,ski\"},\"stuck_out_tongue_winking_eye\":{\"name\":\"Face with Stuck-out Tongue and Winking Eye\",\"unified\":\"1F61C\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":2,\"short_names\":[\"stuck_out_tongue_winking_eye\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\";p\",\";-p\",\";b\",\";-b\",\";P\",\";-P\"],\"keywords\":[\"face\",\"prank\",\"childish\",\"playful\",\"mischievous\",\"smile\"],\"search\":\"stuck,out,tongue,winking,eye,face,with,and,prank,childish,playful,mischievous,smile,;p,;-p,;b,;-b\"},\"flag-be\":{\"name\":\"Regional Indicator Symbol Letters BE\",\"unified\":\"1F1E7-1F1EA\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":12,\"short_names\":[\"flag-be\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,be,regional,indicator,symbol,letters\"},\"film_frames\":{\"name\":\"Film Frames\",\"unified\":\"1F39E\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":13,\"short_names\":[\"film_frames\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"movie\"],\"search\":\"film,frames,movie\"},\"poultry_leg\":{\"name\":\"Poultry Leg\",\"unified\":\"1F357\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":24,\"short_names\":[\"poultry_leg\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"meat\",\"drumstick\",\"bird\",\"chicken\",\"turkey\"],\"search\":\"poultry,leg,food,meat,drumstick,bird,chicken,turkey\"},\"rowboat\":{\"name\":\"Rowboat\",\"unified\":\"1F6A3\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":6,\"short_names\":[\"rowboat\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F6A3-1F3FB\":{\"unified\":\"1F6A3-1F3FB\",\"image\":\"1f6a3-1f3fb.png\",\"sheet_x\":30,\"sheet_y\":7,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F6A3-1F3FC\":{\"unified\":\"1F6A3-1F3FC\",\"image\":\"1f6a3-1f3fc.png\",\"sheet_x\":30,\"sheet_y\":8,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F6A3-1F3FD\":{\"unified\":\"1F6A3-1F3FD\",\"image\":\"1f6a3-1f3fd.png\",\"sheet_x\":30,\"sheet_y\":9,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F6A3-1F3FE\":{\"unified\":\"1F6A3-1F3FE\",\"image\":\"1f6a3-1f3fe.png\",\"sheet_x\":30,\"sheet_y\":10,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F6A3-1F3FF\":{\"unified\":\"1F6A3-1F3FF\",\"image\":\"1f6a3-1f3ff.png\",\"sheet_x\":30,\"sheet_y\":11,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"sports\",\"hobby\",\"water\",\"ship\"],\"search\":\"rowboat,sports,hobby,water,ship\"},\"menorah_with_nine_branches\":{\"name\":\"Menorah with Nine Branches\",\"unified\":\"1F54E\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":10,\"short_names\":[\"menorah_with_nine_branches\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"hanukkah\",\"candles\",\"jewish\"],\"search\":\"menorah,with,nine,branches,hanukkah,candles,jewish\"},\"stuck_out_tongue_closed_eyes\":{\"name\":\"Face with Stuck-out Tongue and Tightly-Closed Eyes\",\"unified\":\"1F61D\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":3,\"short_names\":[\"stuck_out_tongue_closed_eyes\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"prank\",\"playful\",\"mischievous\",\"smile\"],\"search\":\"stuck,out,tongue,closed,eyes,face,with,and,tightly,prank,playful,mischievous,smile\"},\"flag-bz\":{\"name\":\"Regional Indicator Symbol Letters BZ\",\"unified\":\"1F1E7-1F1FF\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":29,\"short_names\":[\"flag-bz\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,bz,regional,indicator,symbol,letters\"},\"swimmer\":{\"name\":\"Swimmer\",\"unified\":\"1F3CA\",\"variations\":[],\"sheet_x\":10,\"sheet_y\":26,\"short_names\":[\"swimmer\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F3CA-1F3FB\":{\"unified\":\"1F3CA-1F3FB\",\"image\":\"1f3ca-1f3fb.png\",\"sheet_x\":10,\"sheet_y\":27,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F3CA-1F3FC\":{\"unified\":\"1F3CA-1F3FC\",\"image\":\"1f3ca-1f3fc.png\",\"sheet_x\":10,\"sheet_y\":28,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F3CA-1F3FD\":{\"unified\":\"1F3CA-1F3FD\",\"image\":\"1f3ca-1f3fd.png\",\"sheet_x\":10,\"sheet_y\":29,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F3CA-1F3FE\":{\"unified\":\"1F3CA-1F3FE\",\"image\":\"1f3ca-1f3fe.png\",\"sheet_x\":10,\"sheet_y\":30,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F3CA-1F3FF\":{\"unified\":\"1F3CA-1F3FF\",\"image\":\"1f3ca-1f3ff.png\",\"sheet_x\":10,\"sheet_y\":31,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"sports\",\"exercise\",\"human\",\"athlete\",\"water\",\"summer\"],\"search\":\"swimmer,sports,exercise,human,athlete,water,summer\"},\"bird\":{\"name\":\"Bird\",\"unified\":\"1F426\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":2,\"short_names\":[\"bird\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"fly\",\"tweet\",\"spring\"],\"search\":\"bird,animal,nature,fly,tweet,spring\"},\"telephone_receiver\":{\"name\":\"Telephone Receiver\",\"unified\":\"1F4DE\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":33,\"short_names\":[\"telephone_receiver\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"technology\",\"communication\",\"dial\"],\"search\":\"telephone,receiver,technology,communication,dial\"},\"meat_on_bone\":{\"name\":\"Meat on Bone\",\"unified\":\"1F356\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":23,\"short_names\":[\"meat_on_bone\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"good\",\"food\",\"drumstick\"],\"search\":\"meat,on,bone,good,food,drumstick\"},\"suspension_railway\":{\"name\":\"Suspension Railway\",\"unified\":\"1F69F\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":2,\"short_names\":[\"suspension_railway\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"vehicle\",\"transportation\"],\"search\":\"suspension,railway,vehicle,transportation\"},\"flag-bj\":{\"name\":\"Regional Indicator Symbol Letters BJ\",\"unified\":\"1F1E7-1F1EF\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":17,\"short_names\":[\"flag-bj\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,bj,regional,indicator,symbol,letters\"},\"yin_yang\":{\"name\":\"Yin Yang\",\"unified\":\"262F\",\"variations\":[\"262F-FE0F\"],\"sheet_x\":1,\"sheet_y\":22,\"short_names\":[\"yin_yang\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"balance\"],\"search\":\"yin,yang,balance\"},\"stuck_out_tongue\":{\"name\":\"Face with Stuck-out Tongue\",\"unified\":\"1F61B\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":1,\"short_names\":[\"stuck_out_tongue\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\":p\",\":-p\",\":P\",\":-P\",\":b\",\":-b\"],\"keywords\":[\"face\",\"prank\",\"childish\",\"playful\",\"mischievous\",\"smile\"],\"search\":\"stuck,out,tongue,face,with,prank,childish,playful,mischievous,smile,:p,:-p,:b,:-b\"},\"phone\":{\"name\":\"Black Telephone\",\"unified\":\"260E\",\"variations\":[\"260E-FE0F\"],\"sheet_x\":1,\"sheet_y\":5,\"short_names\":[\"phone\",\"telephone\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"technology\",\"communication\",\"dial\",\"telephone\"],\"search\":\"phone,telephone,black,technology,communication,dial\"},\"railway_car\":{\"name\":\"Railway Car\",\"unified\":\"1F683\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":15,\"short_names\":[\"railway_car\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"transportation\",\"vehicle\"],\"search\":\"railway,car,transportation,vehicle\"},\"fried_shrimp\":{\"name\":\"Fried Shrimp\",\"unified\":\"1F364\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":37,\"short_names\":[\"fried_shrimp\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"animal\",\"appetizer\",\"summer\"],\"search\":\"fried,shrimp,food,animal,appetizer,summer\"},\"surfer\":{\"name\":\"Surfer\",\"unified\":\"1F3C4\",\"variations\":[],\"sheet_x\":10,\"sheet_y\":15,\"short_names\":[\"surfer\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F3C4-1F3FB\":{\"unified\":\"1F3C4-1F3FB\",\"image\":\"1f3c4-1f3fb.png\",\"sheet_x\":10,\"sheet_y\":16,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F3C4-1F3FC\":{\"unified\":\"1F3C4-1F3FC\",\"image\":\"1f3c4-1f3fc.png\",\"sheet_x\":10,\"sheet_y\":17,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F3C4-1F3FD\":{\"unified\":\"1F3C4-1F3FD\",\"image\":\"1f3c4-1f3fd.png\",\"sheet_x\":10,\"sheet_y\":18,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F3C4-1F3FE\":{\"unified\":\"1F3C4-1F3FE\",\"image\":\"1f3c4-1f3fe.png\",\"sheet_x\":10,\"sheet_y\":19,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F3C4-1F3FF\":{\"unified\":\"1F3C4-1F3FF\",\"image\":\"1f3c4-1f3ff.png\",\"sheet_x\":10,\"sheet_y\":20,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"sports\",\"ocean\",\"sea\",\"summer\",\"beach\"],\"search\":\"surfer,sports,ocean,sea,summer,beach\"},\"baby_chick\":{\"name\":\"Baby Chick\",\"unified\":\"1F424\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":0,\"short_names\":[\"baby_chick\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"chicken\",\"bird\"],\"search\":\"baby,chick,animal,chicken,bird\"},\"egg\":{\"name\":\"Cooking\",\"unified\":\"1F373\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":11,\"short_names\":[\"egg\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"breakfast\",\"kitchen\"],\"search\":\"egg,cooking,food,breakfast,kitchen\"},\"flag-bm\":{\"name\":\"Regional Indicator Symbol Letters BM\",\"unified\":\"1F1E7-1F1F2\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":19,\"short_names\":[\"flag-bm\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,bm,regional,indicator,symbol,letters\"},\"hatching_chick\":{\"name\":\"Hatching Chick\",\"unified\":\"1F423\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":40,\"short_names\":[\"hatching_chick\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"chicken\",\"egg\",\"born\",\"baby\",\"bird\"],\"search\":\"hatching,chick,animal,chicken,egg,born,baby,bird\"},\"train\":{\"name\":\"Tram Car\",\"unified\":\"1F68B\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":23,\"short_names\":[\"train\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"transportation\",\"vehicle\",\"carriage\",\"public\",\"travel\"],\"search\":\"train,tram,car,transportation,vehicle,carriage,public,travel\"},\"pager\":{\"name\":\"Pager\",\"unified\":\"1F4DF\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":34,\"short_names\":[\"pager\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"bbcall\",\"oldschool\",\"90s\"],\"search\":\"pager,bbcall,oldschool,90s\"},\"bath\":{\"name\":\"Bath\",\"unified\":\"1F6C0\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":14,\"short_names\":[\"bath\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F6C0-1F3FB\":{\"unified\":\"1F6C0-1F3FB\",\"image\":\"1f6c0-1f3fb.png\",\"sheet_x\":31,\"sheet_y\":15,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F6C0-1F3FC\":{\"unified\":\"1F6C0-1F3FC\",\"image\":\"1f6c0-1f3fc.png\",\"sheet_x\":31,\"sheet_y\":16,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F6C0-1F3FD\":{\"unified\":\"1F6C0-1F3FD\",\"image\":\"1f6c0-1f3fd.png\",\"sheet_x\":31,\"sheet_y\":17,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F6C0-1F3FE\":{\"unified\":\"1F6C0-1F3FE\",\"image\":\"1f6c0-1f3fe.png\",\"sheet_x\":31,\"sheet_y\":18,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F6C0-1F3FF\":{\"unified\":\"1F6C0-1F3FF\",\"image\":\"1f6c0-1f3ff.png\",\"sheet_x\":31,\"sheet_y\":19,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"clean\",\"shower\",\"bathroom\"],\"search\":\"bath,clean,shower,bathroom\"},\"money_mouth_face\":{\"name\":\"Money-Mouth Face\",\"unified\":\"1F911\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":2,\"short_names\":[\"money_mouth_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"money,mouth,face\"},\"orthodox_cross\":{\"name\":\"Orthodox Cross\",\"unified\":\"2626\",\"variations\":[\"2626-FE0F\"],\"sheet_x\":1,\"sheet_y\":19,\"short_names\":[\"orthodox_cross\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"suppedaneum\",\"religion\"],\"search\":\"orthodox,cross,suppedaneum,religion\"},\"hatched_chick\":{\"name\":\"Front-Facing Baby Chick\",\"unified\":\"1F425\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":1,\"short_names\":[\"hatched_chick\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"chicken\",\"baby\",\"bird\"],\"search\":\"hatched,chick,front,facing,baby,animal,chicken,bird\"},\"place_of_worship\":{\"name\":\"Place of Worship\",\"unified\":\"1F6D0\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":30,\"short_names\":[\"place_of_worship\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"religion\",\"church\",\"temple\",\"prayer\"],\"search\":\"place,of,worship,religion,church,temple,prayer\"},\"hamburger\":{\"name\":\"Hamburger\",\"unified\":\"1F354\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":21,\"short_names\":[\"hamburger\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"meat\",\"fast food\",\"beef\",\"cheeseburger\",\"mcdonalds\",\"burger king\"],\"search\":\"hamburger,meat,fast food,beef,cheeseburger,mcdonalds,burger king\"},\"flag-bt\":{\"name\":\"Regional Indicator Symbol Letters BT\",\"unified\":\"1F1E7-1F1F9\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":25,\"short_names\":[\"flag-bt\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,bt,regional,indicator,symbol,letters\"},\"fax\":{\"name\":\"Fax Machine\",\"unified\":\"1F4E0\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":35,\"short_names\":[\"fax\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"communication\",\"technology\"],\"search\":\"fax,machine,communication,technology\"},\"nerd_face\":{\"name\":\"Nerd Face\",\"unified\":\"1F913\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":4,\"short_names\":[\"nerd_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"nerd,face\"},\"monorail\":{\"name\":\"Monorail\",\"unified\":\"1F69D\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":0,\"short_names\":[\"monorail\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"transportation\",\"vehicle\"],\"search\":\"monorail,transportation,vehicle\"},\"person_with_ball\":{\"name\":\"Person with Ball\",\"unified\":\"26F9\",\"variations\":[],\"sheet_x\":2,\"sheet_y\":38,\"short_names\":[\"person_with_ball\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"26F9-1F3FB\":{\"unified\":\"26F9-1F3FB\",\"image\":\"26f9-1f3fb.png\",\"sheet_x\":2,\"sheet_y\":39,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"26F9-1F3FC\":{\"unified\":\"26F9-1F3FC\",\"image\":\"26f9-1f3fc.png\",\"sheet_x\":2,\"sheet_y\":40,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"26F9-1F3FD\":{\"unified\":\"26F9-1F3FD\",\"image\":\"26f9-1f3fd.png\",\"sheet_x\":3,\"sheet_y\":0,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"26F9-1F3FE\":{\"unified\":\"26F9-1F3FE\",\"image\":\"26f9-1f3fe.png\",\"sheet_x\":3,\"sheet_y\":1,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"26F9-1F3FF\":{\"unified\":\"26F9-1F3FF\",\"image\":\"26f9-1f3ff.png\",\"sheet_x\":3,\"sheet_y\":2,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"sports\",\"human\"],\"search\":\"person,with,ball,sports,human\"},\"weight_lifter\":{\"name\":\"Weight Lifter\",\"unified\":\"1F3CB\",\"variations\":[],\"sheet_x\":10,\"sheet_y\":32,\"short_names\":[\"weight_lifter\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F3CB-1F3FB\":{\"unified\":\"1F3CB-1F3FB\",\"image\":\"1f3cb-1f3fb.png\",\"sheet_x\":10,\"sheet_y\":33,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F3CB-1F3FC\":{\"unified\":\"1F3CB-1F3FC\",\"image\":\"1f3cb-1f3fc.png\",\"sheet_x\":10,\"sheet_y\":34,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F3CB-1F3FD\":{\"unified\":\"1F3CB-1F3FD\",\"image\":\"1f3cb-1f3fd.png\",\"sheet_x\":10,\"sheet_y\":35,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F3CB-1F3FE\":{\"unified\":\"1F3CB-1F3FE\",\"image\":\"1f3cb-1f3fe.png\",\"sheet_x\":10,\"sheet_y\":36,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F3CB-1F3FF\":{\"unified\":\"1F3CB-1F3FF\",\"image\":\"1f3cb-1f3ff.png\",\"sheet_x\":10,\"sheet_y\":37,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"sports\",\"training\",\"exercise\"],\"search\":\"weight,lifter,sports,training,exercise\"},\"sunglasses\":{\"name\":\"Smiling Face with Sunglasses\",\"unified\":\"1F60E\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":29,\"short_names\":[\"sunglasses\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\"8)\"],\"keywords\":[\"face\",\"cool\",\"smile\",\"summer\",\"beach\"],\"search\":\"sunglasses,smiling,face,with,cool,smile,summer,beach,8)\"},\"wolf\":{\"name\":\"Wolf Face\",\"unified\":\"1F43A\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":22,\"short_names\":[\"wolf\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"wild\"],\"search\":\"wolf,face,animal,nature,wild\"},\"bullettrain_side\":{\"name\":\"High-Speed Train\",\"unified\":\"1F684\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":16,\"short_names\":[\"bullettrain_side\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"transportation\",\"vehicle\"],\"search\":\"bullettrain,side,high,speed,train,transportation,vehicle\"},\"ophiuchus\":{\"name\":\"Ophiuchus\",\"unified\":\"26CE\",\"variations\":[],\"sheet_x\":2,\"sheet_y\":23,\"short_names\":[\"ophiuchus\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sign\",\"purple-square\",\"constellation\",\"astrology\"],\"search\":\"ophiuchus,sign,purple-square,constellation,astrology\"},\"flag-bo\":{\"name\":\"Regional Indicator Symbol Letters BO\",\"unified\":\"1F1E7-1F1F4\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":21,\"short_names\":[\"flag-bo\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,bo,regional,indicator,symbol,letters\"},\"tv\":{\"name\":\"Television\",\"unified\":\"1F4FA\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":20,\"short_names\":[\"tv\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"technology\",\"program\",\"oldschool\",\"show\",\"television\"],\"search\":\"tv,television,technology,program,oldschool,show\"},\"fries\":{\"name\":\"French Fries\",\"unified\":\"1F35F\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":32,\"short_names\":[\"fries\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"chips\",\"snack\",\"fast food\"],\"search\":\"fries,french,chips,snack,fast food\"},\"bicyclist\":{\"name\":\"Bicyclist\",\"unified\":\"1F6B4\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":28,\"short_names\":[\"bicyclist\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F6B4-1F3FB\":{\"unified\":\"1F6B4-1F3FB\",\"image\":\"1f6b4-1f3fb.png\",\"sheet_x\":30,\"sheet_y\":29,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F6B4-1F3FC\":{\"unified\":\"1F6B4-1F3FC\",\"image\":\"1f6b4-1f3fc.png\",\"sheet_x\":30,\"sheet_y\":30,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F6B4-1F3FD\":{\"unified\":\"1F6B4-1F3FD\",\"image\":\"1f6b4-1f3fd.png\",\"sheet_x\":30,\"sheet_y\":31,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F6B4-1F3FE\":{\"unified\":\"1F6B4-1F3FE\",\"image\":\"1f6b4-1f3fe.png\",\"sheet_x\":30,\"sheet_y\":32,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F6B4-1F3FF\":{\"unified\":\"1F6B4-1F3FF\",\"image\":\"1f6b4-1f3ff.png\",\"sheet_x\":30,\"sheet_y\":33,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"sports\",\"bike\",\"exercise\",\"hipster\"],\"search\":\"bicyclist,sports,bike,exercise,hipster\"},\"aries\":{\"name\":\"Aries\",\"unified\":\"2648\",\"variations\":[\"2648-FE0F\"],\"sheet_x\":1,\"sheet_y\":26,\"short_names\":[\"aries\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sign\",\"purple-square\",\"zodiac\",\"astrology\"],\"search\":\"aries,sign,purple-square,zodiac,astrology\"},\"hugging_face\":{\"name\":\"Hugging Face\",\"unified\":\"1F917\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":8,\"short_names\":[\"hugging_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"hugging,face\"},\"flag-bq\":{\"name\":\"Regional Indicator Symbol Letters BQ\",\"unified\":\"1F1E7-1F1F6\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":22,\"short_names\":[\"flag-bq\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,bq,regional,indicator,symbol,letters\"},\"bullettrain_front\":{\"name\":\"High-Speed Train with Bullet Nose\",\"unified\":\"1F685\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":17,\"short_names\":[\"bullettrain_front\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"transportation\",\"vehicle\",\"speed\",\"fast\",\"public\",\"travel\"],\"search\":\"bullettrain,front,high,speed,train,with,bullet,nose,transportation,vehicle,fast,public,travel\"},\"radio\":{\"name\":\"Radio\",\"unified\":\"1F4FB\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":21,\"short_names\":[\"radio\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"communication\",\"music\",\"podcast\",\"program\"],\"search\":\"radio,communication,music,podcast,program\"},\"hotdog\":{\"name\":\"Hot Dog\",\"unified\":\"1F32D\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":23,\"short_names\":[\"hotdog\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"hotdog,hot,dog\"},\"boar\":{\"name\":\"Boar\",\"unified\":\"1F417\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":28,\"short_names\":[\"boar\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\"],\"search\":\"boar,animal,nature\"},\"studio_microphone\":{\"name\":\"Studio Microphone\",\"unified\":\"1F399\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":10,\"short_names\":[\"studio_microphone\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"singer\",\"recording\",\"artist\"],\"search\":\"studio,microphone,singer,recording,artist\"},\"pizza\":{\"name\":\"Slice of Pizza\",\"unified\":\"1F355\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":22,\"short_names\":[\"pizza\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"party\"],\"search\":\"pizza,slice,of,food,party\"},\"flag-ba\":{\"name\":\"Regional Indicator Symbol Letters BA\",\"unified\":\"1F1E7-1F1E6\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":9,\"short_names\":[\"flag-ba\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ba,regional,indicator,symbol,letters\"},\"mountain_bicyclist\":{\"name\":\"Mountain Bicyclist\",\"unified\":\"1F6B5\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":34,\"short_names\":[\"mountain_bicyclist\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F6B5-1F3FB\":{\"unified\":\"1F6B5-1F3FB\",\"image\":\"1f6b5-1f3fb.png\",\"sheet_x\":30,\"sheet_y\":35,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F6B5-1F3FC\":{\"unified\":\"1F6B5-1F3FC\",\"image\":\"1f6b5-1f3fc.png\",\"sheet_x\":30,\"sheet_y\":36,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F6B5-1F3FD\":{\"unified\":\"1F6B5-1F3FD\",\"image\":\"1f6b5-1f3fd.png\",\"sheet_x\":30,\"sheet_y\":37,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F6B5-1F3FE\":{\"unified\":\"1F6B5-1F3FE\",\"image\":\"1f6b5-1f3fe.png\",\"sheet_x\":30,\"sheet_y\":38,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F6B5-1F3FF\":{\"unified\":\"1F6B5-1F3FF\",\"image\":\"1f6b5-1f3ff.png\",\"sheet_x\":30,\"sheet_y\":39,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"transportation\",\"sports\",\"human\",\"race\",\"bike\"],\"search\":\"mountain,bicyclist,transportation,sports,human,race,bike\"},\"smirk\":{\"name\":\"Smirking Face\",\"unified\":\"1F60F\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":30,\"short_names\":[\"smirk\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"smile\",\"mean\",\"prank\",\"smug\",\"sarcasm\"],\"search\":\"smirk,smirking,face,smile,mean,prank,smug,sarcasm\"},\"light_rail\":{\"name\":\"Light Rail\",\"unified\":\"1F688\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":20,\"short_names\":[\"light_rail\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"transportation\",\"vehicle\"],\"search\":\"light,rail,transportation,vehicle\"},\"horse\":{\"name\":\"Horse Face\",\"unified\":\"1F434\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":16,\"short_names\":[\"horse\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"brown\",\"nature\"],\"search\":\"horse,face,animal,brown,nature\"},\"taurus\":{\"name\":\"Taurus\",\"unified\":\"2649\",\"variations\":[\"2649-FE0F\"],\"sheet_x\":1,\"sheet_y\":27,\"short_names\":[\"taurus\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"purple-square\",\"sign\",\"zodiac\",\"astrology\"],\"search\":\"taurus,purple-square,sign,zodiac,astrology\"},\"gemini\":{\"name\":\"Gemini\",\"unified\":\"264A\",\"variations\":[\"264A-FE0F\"],\"sheet_x\":1,\"sheet_y\":28,\"short_names\":[\"gemini\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sign\",\"zodiac\",\"purple-square\",\"astrology\"],\"search\":\"gemini,sign,zodiac,purple-square,astrology\"},\"horse_racing\":{\"name\":\"Horse Racing\",\"unified\":\"1F3C7\",\"variations\":[],\"sheet_x\":10,\"sheet_y\":23,\"short_names\":[\"horse_racing\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"betting\",\"competition\",\"gambling\",\"luck\"],\"search\":\"horse,racing,animal,betting,competition,gambling,luck\"},\"level_slider\":{\"name\":\"Level Slider\",\"unified\":\"1F39A\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":11,\"short_names\":[\"level_slider\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"scale\"],\"search\":\"level,slider,scale\"},\"flag-bw\":{\"name\":\"Regional Indicator Symbol Letters BW\",\"unified\":\"1F1E7-1F1FC\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":27,\"short_names\":[\"flag-bw\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,bw,regional,indicator,symbol,letters\"},\"unicorn_face\":{\"name\":\"Unicorn Face\",\"unified\":\"1F984\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":19,\"short_names\":[\"unicorn_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"mystical\"],\"search\":\"unicorn,face,animal,nature,mystical\"},\"mountain_railway\":{\"name\":\"Mountain Railway\",\"unified\":\"1F69E\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":1,\"short_names\":[\"mountain_railway\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"transportation\",\"vehicle\"],\"search\":\"mountain,railway,transportation,vehicle\"},\"spaghetti\":{\"name\":\"Spaghetti\",\"unified\":\"1F35D\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":30,\"short_names\":[\"spaghetti\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"italian\",\"noodle\"],\"search\":\"spaghetti,food,italian,noodle\"},\"no_mouth\":{\"name\":\"Face Without Mouth\",\"unified\":\"1F636\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":28,\"short_names\":[\"no_mouth\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"hellokitty\"],\"search\":\"no,mouth,face,without,hellokitty\"},\"flag-br\":{\"name\":\"Regional Indicator Symbol Letters BR\",\"unified\":\"1F1E7-1F1F7\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":23,\"short_names\":[\"flag-br\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,br,regional,indicator,symbol,letters\"},\"man_in_business_suit_levitating\":{\"name\":\"Man in Business Suit Levitating\",\"unified\":\"1F574\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":38,\"short_names\":[\"man_in_business_suit_levitating\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"man,in,business,suit,levitating\"},\"control_knobs\":{\"name\":\"Control Knobs\",\"unified\":\"1F39B\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":12,\"short_names\":[\"control_knobs\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"dial\"],\"search\":\"control,knobs,dial\"},\"bee\":{\"name\":\"Honeybee\",\"unified\":\"1F41D\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":34,\"short_names\":[\"bee\",\"honeybee\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"insect\",\"nature\",\"bug\",\"spring\",\"honey\"],\"search\":\"bee,honeybee,animal,insect,nature,bug,spring,honey\"},\"neutral_face\":{\"name\":\"Neutral Face\",\"unified\":\"1F610\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":31,\"short_names\":[\"neutral_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\":|\",\":-|\"],\"keywords\":[\"indifference\",\"meh\",\":|\"],\"search\":\"neutral,face,indifference,meh,:|,:-|\"},\"steam_locomotive\":{\"name\":\"Steam Locomotive\",\"unified\":\"1F682\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":14,\"short_names\":[\"steam_locomotive\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"transportation\",\"vehicle\",\"train\"],\"search\":\"steam,locomotive,transportation,vehicle,train\"},\"cancer\":{\"name\":\"Cancer\",\"unified\":\"264B\",\"variations\":[\"264B-FE0F\"],\"sheet_x\":1,\"sheet_y\":29,\"short_names\":[\"cancer\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sign\",\"zodiac\",\"purple-square\",\"astrology\"],\"search\":\"cancer,sign,zodiac,purple-square,astrology\"},\"taco\":{\"name\":\"Taco\",\"unified\":\"1F32E\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":24,\"short_names\":[\"taco\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"mexican\"],\"search\":\"taco,food,mexican\"},\"burrito\":{\"name\":\"Burrito\",\"unified\":\"1F32F\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":25,\"short_names\":[\"burrito\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"mexican\"],\"search\":\"burrito,food,mexican\"},\"expressionless\":{\"name\":\"Expressionless Face\",\"unified\":\"1F611\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":32,\"short_names\":[\"expressionless\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"indifferent\",\"-_-\",\"meh\"],\"search\":\"expressionless,face,indifferent,-_-,meh\"},\"trophy\":{\"name\":\"Trophy\",\"unified\":\"1F3C6\",\"variations\":[],\"sheet_x\":10,\"sheet_y\":22,\"short_names\":[\"trophy\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"win\",\"award\",\"contest\",\"place\",\"ftw\",\"ceremony\"],\"search\":\"trophy,win,award,contest,place,ftw,ceremony\"},\"train2\":{\"name\":\"Train\",\"unified\":\"1F686\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":18,\"short_names\":[\"train2\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"transportation\",\"vehicle\"],\"search\":\"train2,train,transportation,vehicle\"},\"flag-io\":{\"name\":\"Regional Indicator Symbol Letters IO\",\"unified\":\"1F1EE-1F1F4\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":21,\"short_names\":[\"flag-io\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,io,regional,indicator,symbol,letters\"},\"bug\":{\"name\":\"Bug\",\"unified\":\"1F41B\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":32,\"short_names\":[\"bug\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"insect\",\"nature\",\"worm\"],\"search\":\"bug,animal,insect,nature,worm\"},\"stopwatch\":{\"name\":\"Stopwatch\",\"unified\":\"23F1\",\"variations\":[],\"sheet_x\":0,\"sheet_y\":26,\"short_names\":[\"stopwatch\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"deadline\"],\"search\":\"stopwatch,time,deadline\"},\"leo\":{\"name\":\"Leo\",\"unified\":\"264C\",\"variations\":[\"264C-FE0F\"],\"sheet_x\":1,\"sheet_y\":30,\"short_names\":[\"leo\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sign\",\"purple-square\",\"zodiac\",\"astrology\"],\"search\":\"leo,sign,purple-square,zodiac,astrology\"},\"virgo\":{\"name\":\"Virgo\",\"unified\":\"264D\",\"variations\":[\"264D-FE0F\"],\"sheet_x\":1,\"sheet_y\":31,\"short_names\":[\"virgo\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sign\",\"zodiac\",\"purple-square\",\"astrology\"],\"search\":\"virgo,sign,zodiac,purple-square,astrology\"},\"running_shirt_with_sash\":{\"name\":\"Running Shirt with Sash\",\"unified\":\"1F3BD\",\"variations\":[],\"sheet_x\":10,\"sheet_y\":3,\"short_names\":[\"running_shirt_with_sash\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"play\",\"pageant\"],\"search\":\"running,shirt,with,sash,play,pageant\"},\"flag-vg\":{\"name\":\"Regional Indicator Symbol Letters VG\",\"unified\":\"1F1FB-1F1EC\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":32,\"short_names\":[\"flag-vg\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,vg,regional,indicator,symbol,letters\"},\"metro\":{\"name\":\"Metro\",\"unified\":\"1F687\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":19,\"short_names\":[\"metro\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"transportation\",\"blue-square\",\"mrt\",\"underground\",\"tube\"],\"search\":\"metro,transportation,blue-square,mrt,underground,tube\"},\"unamused\":{\"name\":\"Unamused Face\",\"unified\":\"1F612\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":33,\"short_names\":[\"unamused\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\":(\"],\"keywords\":[\"indifference\",\"bored\",\"straight face\",\"serious\"],\"search\":\"unamused,face,indifference,bored,straight face,serious,:(\"},\"snail\":{\"name\":\"Snail\",\"unified\":\"1F40C\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":17,\"short_names\":[\"snail\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"slow\",\"animal\",\"shell\"],\"search\":\"snail,slow,animal,shell\"},\"timer_clock\":{\"name\":\"Timer Clock\",\"unified\":\"23F2\",\"variations\":[],\"sheet_x\":0,\"sheet_y\":27,\"short_names\":[\"timer_clock\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"alarm\"],\"search\":\"timer,clock,alarm\"},\"ramen\":{\"name\":\"Steaming Bowl\",\"unified\":\"1F35C\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":29,\"short_names\":[\"ramen\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"japanese\",\"noodle\",\"chipsticks\"],\"search\":\"ramen,steaming,bowl,food,japanese,noodle,chipsticks\"},\"beetle\":{\"name\":\"Lady Beetle\",\"unified\":\"1F41E\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":35,\"short_names\":[\"beetle\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"insect\",\"nature\",\"ladybug\"],\"search\":\"beetle,lady,animal,insect,nature,ladybug\"},\"face_with_rolling_eyes\":{\"name\":\"Face with Rolling Eyes\",\"unified\":\"1F644\",\"variations\":[],\"sheet_x\":28,\"sheet_y\":1,\"short_names\":[\"face_with_rolling_eyes\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"face,with,rolling,eyes\"},\"libra\":{\"name\":\"Libra\",\"unified\":\"264E\",\"variations\":[\"264E-FE0F\"],\"sheet_x\":1,\"sheet_y\":32,\"short_names\":[\"libra\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sign\",\"purple-square\",\"zodiac\",\"astrology\"],\"search\":\"libra,sign,purple-square,zodiac,astrology\"},\"stew\":{\"name\":\"Pot of Food\",\"unified\":\"1F372\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":10,\"short_names\":[\"stew\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"meat\",\"soup\"],\"search\":\"stew,pot,of,food,meat,soup\"},\"sports_medal\":{\"name\":\"Sports Medal\",\"unified\":\"1F3C5\",\"variations\":[],\"sheet_x\":10,\"sheet_y\":21,\"short_names\":[\"sports_medal\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"award\",\"winning\"],\"search\":\"sports,medal,award,winning\"},\"flag-bn\":{\"name\":\"Regional Indicator Symbol Letters BN\",\"unified\":\"1F1E7-1F1F3\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":20,\"short_names\":[\"flag-bn\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,bn,regional,indicator,symbol,letters\"},\"alarm_clock\":{\"name\":\"Alarm Clock\",\"unified\":\"23F0\",\"variations\":[],\"sheet_x\":0,\"sheet_y\":25,\"short_names\":[\"alarm_clock\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"wake\"],\"search\":\"alarm,clock,time,wake\"},\"tram\":{\"name\":\"Tram\",\"unified\":\"1F68A\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":22,\"short_names\":[\"tram\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"transportation\",\"vehicle\"],\"search\":\"tram,transportation,vehicle\"},\"fish_cake\":{\"name\":\"Fish Cake with Swirl Design\",\"unified\":\"1F365\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":38,\"short_names\":[\"fish_cake\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"japan\",\"sea\",\"beach\"],\"search\":\"fish,cake,with,swirl,design,food,japan,sea,beach\"},\"thinking_face\":{\"name\":\"Thinking Face\",\"unified\":\"1F914\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":5,\"short_names\":[\"thinking_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"thinking,face\"},\"medal\":{\"name\":\"Military Medal\",\"unified\":\"1F396\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":8,\"short_names\":[\"medal\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"medal,military\"},\"mantelpiece_clock\":{\"name\":\"Mantelpiece Clock\",\"unified\":\"1F570\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":36,\"short_names\":[\"mantelpiece_clock\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\"],\"search\":\"mantelpiece,clock,time\"},\"station\":{\"name\":\"Station\",\"unified\":\"1F689\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":21,\"short_names\":[\"station\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"transportation\",\"vehicle\",\"public\"],\"search\":\"station,transportation,vehicle,public\"},\"flag-bg\":{\"name\":\"Regional Indicator Symbol Letters BG\",\"unified\":\"1F1E7-1F1EC\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":14,\"short_names\":[\"flag-bg\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,bg,regional,indicator,symbol,letters\"},\"ant\":{\"name\":\"Ant\",\"unified\":\"1F41C\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":33,\"short_names\":[\"ant\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"insect\",\"nature\",\"bug\"],\"search\":\"ant,animal,insect,nature,bug\"},\"scorpius\":{\"name\":\"Scorpius\",\"unified\":\"264F\",\"variations\":[\"264F-FE0F\"],\"sheet_x\":1,\"sheet_y\":33,\"short_names\":[\"scorpius\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sign\",\"zodiac\",\"purple-square\",\"astrology\",\"scorpio\"],\"search\":\"scorpius,sign,zodiac,purple-square,astrology,scorpio\"},\"sushi\":{\"name\":\"Sushi\",\"unified\":\"1F363\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":36,\"short_names\":[\"sushi\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"fish\",\"japanese\",\"rice\"],\"search\":\"sushi,food,fish,japanese,rice\"},\"flushed\":{\"name\":\"Flushed Face\",\"unified\":\"1F633\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":25,\"short_names\":[\"flushed\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"blush\",\"shy\",\"flattered\"],\"search\":\"flushed,face,blush,shy,flattered\"},\"spider\":{\"name\":\"Spider\",\"unified\":\"1F577\",\"variations\":[],\"sheet_x\":25,\"sheet_y\":5,\"short_names\":[\"spider\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"arachnid\"],\"search\":\"spider,animal,arachnid\"},\"reminder_ribbon\":{\"name\":\"Reminder Ribbon\",\"unified\":\"1F397\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":9,\"short_names\":[\"reminder_ribbon\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sports\",\"cause\",\"supprt\",\"awareness\"],\"search\":\"reminder,ribbon,sports,cause,supprt,awareness\"},\"helicopter\":{\"name\":\"Helicopter\",\"unified\":\"1F681\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":13,\"short_names\":[\"helicopter\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"transportation\",\"vehicle\",\"fly\"],\"search\":\"helicopter,transportation,vehicle,fly\"},\"sagittarius\":{\"name\":\"Sagittarius\",\"unified\":\"2650\",\"variations\":[\"2650-FE0F\"],\"sheet_x\":1,\"sheet_y\":34,\"short_names\":[\"sagittarius\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sign\",\"zodiac\",\"purple-square\",\"astrology\"],\"search\":\"sagittarius,sign,zodiac,purple-square,astrology\"},\"flag-bf\":{\"name\":\"Regional Indicator Symbol Letters BF\",\"unified\":\"1F1E7-1F1EB\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":13,\"short_names\":[\"flag-bf\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,bf,regional,indicator,symbol,letters\"},\"hourglass_flowing_sand\":{\"name\":\"Hourglass with Flowing Sand\",\"unified\":\"23F3\",\"variations\":[],\"sheet_x\":0,\"sheet_y\":28,\"short_names\":[\"hourglass_flowing_sand\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"oldschool\",\"time\",\"countdown\"],\"search\":\"hourglass,flowing,sand,with,oldschool,time,countdown\"},\"small_airplane\":{\"name\":\"Small Airplane\",\"unified\":\"1F6E9\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":37,\"short_names\":[\"small_airplane\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"flight\",\"transportation\",\"fly\",\"vehicle\"],\"search\":\"small,airplane,flight,transportation,fly,vehicle\"},\"rosette\":{\"name\":\"Rosette\",\"unified\":\"1F3F5\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":36,\"short_names\":[\"rosette\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"flower\",\"decoration\",\"military\"],\"search\":\"rosette,flower,decoration,military\"},\"bento\":{\"name\":\"Bento Box\",\"unified\":\"1F371\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":9,\"short_names\":[\"bento\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"japanese\",\"box\"],\"search\":\"bento,box,food,japanese\"},\"capricorn\":{\"name\":\"Capricorn\",\"unified\":\"2651\",\"variations\":[\"2651-FE0F\"],\"sheet_x\":1,\"sheet_y\":35,\"short_names\":[\"capricorn\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sign\",\"zodiac\",\"purple-square\",\"astrology\"],\"search\":\"capricorn,sign,zodiac,purple-square,astrology\"},\"flag-bi\":{\"name\":\"Regional Indicator Symbol Letters BI\",\"unified\":\"1F1E7-1F1EE\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":16,\"short_names\":[\"flag-bi\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,bi,regional,indicator,symbol,letters\"},\"disappointed\":{\"name\":\"Disappointed Face\",\"unified\":\"1F61E\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":4,\"short_names\":[\"disappointed\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\"):\",\":(\",\":-(\"],\"keywords\":[\"face\",\"sad\",\"upset\",\"depressed\",\":(\"],\"search\":\"disappointed,face,sad,upset,depressed,:(,):,:-(\"},\"scorpion\":{\"name\":\"Scorpion\",\"unified\":\"1F982\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":17,\"short_names\":[\"scorpion\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"arachnid\"],\"search\":\"scorpion,animal,arachnid\"},\"hourglass\":{\"name\":\"Hourglass\",\"unified\":\"231B\",\"variations\":[\"231B-FE0F\"],\"sheet_x\":0,\"sheet_y\":15,\"short_names\":[\"hourglass\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"clock\",\"oldschool\",\"limit\",\"exam\",\"quiz\",\"test\"],\"search\":\"hourglass,time,clock,oldschool,limit,exam,quiz,test\"},\"crab\":{\"name\":\"Crab\",\"unified\":\"1F980\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":15,\"short_names\":[\"crab\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"crustacean\"],\"search\":\"crab,animal,crustacean\"},\"satellite_antenna\":{\"name\":\"Satellite Antenna\",\"unified\":\"1F4E1\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":36,\"short_names\":[\"satellite_antenna\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"satellite,antenna\"},\"airplane\":{\"name\":\"Airplane\",\"unified\":\"2708\",\"variations\":[\"2708-FE0F\"],\"sheet_x\":3,\"sheet_y\":7,\"short_names\":[\"airplane\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"vehicle\",\"transportation\",\"flight\",\"fly\"],\"search\":\"airplane,vehicle,transportation,flight,fly\"},\"aquarius\":{\"name\":\"Aquarius\",\"unified\":\"2652\",\"variations\":[\"2652-FE0F\"],\"sheet_x\":1,\"sheet_y\":36,\"short_names\":[\"aquarius\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sign\",\"purple-square\",\"zodiac\",\"astrology\"],\"search\":\"aquarius,sign,purple-square,zodiac,astrology\"},\"ticket\":{\"name\":\"Ticket\",\"unified\":\"1F3AB\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":26,\"short_names\":[\"ticket\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"event\",\"concert\",\"pass\"],\"search\":\"ticket,event,concert,pass\"},\"worried\":{\"name\":\"Worried Face\",\"unified\":\"1F61F\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":5,\"short_names\":[\"worried\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"concern\",\"nervous\",\":(\"],\"search\":\"worried,face,concern,nervous,:(\"},\"flag-cv\":{\"name\":\"Regional Indicator Symbol Letters CV\",\"unified\":\"1F1E8-1F1FB\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":4,\"short_names\":[\"flag-cv\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,cv,regional,indicator,symbol,letters\"},\"curry\":{\"name\":\"Curry and Rice\",\"unified\":\"1F35B\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":28,\"short_names\":[\"curry\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"spicy\",\"hot\",\"indian\"],\"search\":\"curry,and,rice,food,spicy,hot,indian\"},\"pisces\":{\"name\":\"Pisces\",\"unified\":\"2653\",\"variations\":[\"2653-FE0F\"],\"sheet_x\":1,\"sheet_y\":37,\"short_names\":[\"pisces\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"purple-square\",\"sign\",\"zodiac\",\"astrology\"],\"search\":\"pisces,purple-square,sign,zodiac,astrology\"},\"airplane_departure\":{\"name\":\"Airplane Departure\",\"unified\":\"1F6EB\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":38,\"short_names\":[\"airplane_departure\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"airport\",\"flight\",\"landing\"],\"search\":\"airplane,departure,airport,flight,landing\"},\"flag-kh\":{\"name\":\"Regional Indicator Symbol Letters KH\",\"unified\":\"1F1F0-1F1ED\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":32,\"short_names\":[\"flag-kh\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,kh,regional,indicator,symbol,letters\"},\"battery\":{\"name\":\"Battery\",\"unified\":\"1F50B\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":36,\"short_names\":[\"battery\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"power\",\"energy\",\"sustain\"],\"search\":\"battery,power,energy,sustain\"},\"snake\":{\"name\":\"Snake\",\"unified\":\"1F40D\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":18,\"short_names\":[\"snake\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"evil\",\"nature\",\"hiss\",\"python\"],\"search\":\"snake,animal,evil,nature,hiss,python\"},\"angry\":{\"name\":\"Angry Face\",\"unified\":\"1F620\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":6,\"short_names\":[\"angry\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\">:(\",\">:-(\"],\"keywords\":[\"mad\",\"face\",\"annoyed\",\"frustrated\"],\"search\":\"angry,face,mad,annoyed,frustrated,>:(,>:-(\"},\"rice_ball\":{\"name\":\"Rice Ball\",\"unified\":\"1F359\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":26,\"short_names\":[\"rice_ball\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"japanese\"],\"search\":\"rice,ball,food,japanese\"},\"admission_tickets\":{\"name\":\"Admission Tickets\",\"unified\":\"1F39F\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":14,\"short_names\":[\"admission_tickets\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"admission,tickets\"},\"performing_arts\":{\"name\":\"Performing Arts\",\"unified\":\"1F3AD\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":28,\"short_names\":[\"performing_arts\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"acting\",\"theater\",\"drama\"],\"search\":\"performing,arts,acting,theater,drama\"},\"rage\":{\"name\":\"Pouting Face\",\"unified\":\"1F621\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":7,\"short_names\":[\"rage\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"angry\",\"mad\",\"hate\",\"despise\"],\"search\":\"rage,pouting,face,angry,mad,hate,despise\"},\"rice\":{\"name\":\"Cooked Rice\",\"unified\":\"1F35A\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":27,\"short_names\":[\"rice\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"china\",\"asian\"],\"search\":\"rice,cooked,food,china,asian\"},\"airplane_arriving\":{\"name\":\"Airplane Arriving\",\"unified\":\"1F6EC\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":39,\"short_names\":[\"airplane_arriving\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"airplane,arriving\"},\"id\":{\"name\":\"Squared Id\",\"unified\":\"1F194\",\"variations\":[],\"sheet_x\":4,\"sheet_y\":40,\"short_names\":[\"id\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"purple-square\",\"words\"],\"search\":\"id,squared,purple-square,words\"},\"flag-cm\":{\"name\":\"Regional Indicator Symbol Letters CM\",\"unified\":\"1F1E8-1F1F2\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":39,\"short_names\":[\"flag-cm\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,cm,regional,indicator,symbol,letters\"},\"turtle\":{\"name\":\"Turtle\",\"unified\":\"1F422\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":39,\"short_names\":[\"turtle\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"slow\",\"nature\",\"tortoise\"],\"search\":\"turtle,animal,slow,nature,tortoise\"},\"electric_plug\":{\"name\":\"Electric Plug\",\"unified\":\"1F50C\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":37,\"short_names\":[\"electric_plug\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"charger\",\"power\"],\"search\":\"electric,plug,charger,power\"},\"tropical_fish\":{\"name\":\"Tropical Fish\",\"unified\":\"1F420\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":37,\"short_names\":[\"tropical_fish\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"swim\",\"ocean\",\"beach\",\"nemo\"],\"search\":\"tropical,fish,animal,swim,ocean,beach,nemo\"},\"bulb\":{\"name\":\"Electric Light Bulb\",\"unified\":\"1F4A1\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":8,\"short_names\":[\"bulb\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"light\",\"electricity\",\"idea\"],\"search\":\"bulb,electric,light,electricity,idea\"},\"pensive\":{\"name\":\"Pensive Face\",\"unified\":\"1F614\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":35,\"short_names\":[\"pensive\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"sad\",\"depressed\",\"okay\",\"upset\"],\"search\":\"pensive,face,sad,depressed,okay,upset\"},\"rice_cracker\":{\"name\":\"Rice Cracker\",\"unified\":\"1F358\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":25,\"short_names\":[\"rice_cracker\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"japanese\"],\"search\":\"rice,cracker,food,japanese\"},\"art\":{\"name\":\"Artist Palette\",\"unified\":\"1F3A8\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":23,\"short_names\":[\"art\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"design\",\"paint\",\"draw\",\"colors\"],\"search\":\"art,artist,palette,design,paint,draw,colors\"},\"boat\":{\"name\":\"Sailboat\",\"unified\":\"26F5\",\"variations\":[\"26F5-FE0F\"],\"sheet_x\":2,\"sheet_y\":35,\"short_names\":[\"boat\",\"sailboat\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"ship\",\"summer\",\"transportation\",\"water\",\"sailing\",\"sailboat\"],\"search\":\"boat,sailboat,ship,summer,transportation,water,sailing\"},\"atom_symbol\":{\"name\":\"Atom Symbol\",\"unified\":\"269B\",\"variations\":[],\"sheet_x\":2,\"sheet_y\":10,\"short_names\":[\"atom_symbol\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"science\"],\"search\":\"atom,symbol,science\"},\"flag-ca\":{\"name\":\"Regional Indicator Symbol Letters CA\",\"unified\":\"1F1E8-1F1E6\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":30,\"short_names\":[\"flag-ca\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ca,regional,indicator,symbol,letters\"},\"oden\":{\"name\":\"Oden\",\"unified\":\"1F362\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":35,\"short_names\":[\"oden\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"japanese\"],\"search\":\"oden,food,japanese\"},\"flashlight\":{\"name\":\"Electric Torch\",\"unified\":\"1F526\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":22,\"short_names\":[\"flashlight\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"dark\",\"camping\",\"sight\",\"night\"],\"search\":\"flashlight,electric,torch,dark,camping,sight,night\"},\"confused\":{\"name\":\"Confused Face\",\"unified\":\"1F615\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":36,\"short_names\":[\"confused\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\":\\\\\",\":-\\\\\",\":/\",\":-/\"],\"keywords\":[\"face\",\"indifference\",\"huh\",\"weird\",\"hmmm\"],\"search\":\"confused,face,indifference,huh,weird,hmmm,:\\\\,:-\\\\,:/,:-/\"},\"u7a7a\":{\"name\":\"Squared Cjk Unified Ideograph-7a7a\",\"unified\":\"1F233\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":11,\"short_names\":[\"u7a7a\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"kanji\",\"japanese\",\"chinese\",\"empty\",\"sky\",\"blue-square\"],\"search\":\"u7a7a,squared,cjk,unified,ideograph,7a7a,kanji,japanese,chinese,empty,sky,blue-square\"},\"circus_tent\":{\"name\":\"Circus Tent\",\"unified\":\"1F3AA\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":25,\"short_names\":[\"circus_tent\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"festival\",\"carnival\",\"party\"],\"search\":\"circus,tent,festival,carnival,party\"},\"motor_boat\":{\"name\":\"Motor Boat\",\"unified\":\"1F6E5\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":36,\"short_names\":[\"motor_boat\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"ship\"],\"search\":\"motor,boat,ship\"},\"flag-ic\":{\"name\":\"Regional Indicator Symbol Letters IC\",\"unified\":\"1F1EE-1F1E8\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":15,\"short_names\":[\"flag-ic\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ic,regional,indicator,symbol,letters\"},\"fish\":{\"name\":\"Fish\",\"unified\":\"1F41F\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":36,\"short_names\":[\"fish\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"food\",\"nature\"],\"search\":\"fish,animal,food,nature\"},\"microphone\":{\"name\":\"Microphone\",\"unified\":\"1F3A4\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":19,\"short_names\":[\"microphone\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sound\",\"music\",\"PA\"],\"search\":\"microphone,sound,music,pa\"},\"flag-ky\":{\"name\":\"Regional Indicator Symbol Letters KY\",\"unified\":\"1F1F0-1F1FE\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":39,\"short_names\":[\"flag-ky\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ky,regional,indicator,symbol,letters\"},\"candle\":{\"name\":\"Candle\",\"unified\":\"1F56F\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":35,\"short_names\":[\"candle\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fire\",\"wax\"],\"search\":\"candle,fire,wax\"},\"dango\":{\"name\":\"Dango\",\"unified\":\"1F361\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":34,\"short_names\":[\"dango\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"barbecue\",\"meat\"],\"search\":\"dango,food,barbecue,meat\"},\"slightly_frowning_face\":{\"name\":\"Slightly Frowning Face\",\"unified\":\"1F641\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":39,\"short_names\":[\"slightly_frowning_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"slightly,frowning,face\"},\"blowfish\":{\"name\":\"Blowfish\",\"unified\":\"1F421\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":38,\"short_names\":[\"blowfish\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"food\",\"sea\",\"ocean\"],\"search\":\"blowfish,animal,nature,food,sea,ocean\"},\"u5272\":{\"name\":\"Squared Cjk Unified Ideograph-5272\",\"unified\":\"1F239\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":17,\"short_names\":[\"u5272\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"cut\",\"divide\",\"chinese\",\"kanji\",\"pink-square\"],\"search\":\"u5272,squared,cjk,unified,ideograph,5272,cut,divide,chinese,kanji,pink-square\"},\"speedboat\":{\"name\":\"Speedboat\",\"unified\":\"1F6A4\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":12,\"short_names\":[\"speedboat\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"ship\",\"transportation\",\"vehicle\",\"summer\"],\"search\":\"speedboat,ship,transportation,vehicle,summer\"},\"white_frowning_face\":{\"name\":\"White Frowning Face\",\"unified\":\"2639\",\"variations\":[\"2639-FE0F\"],\"sheet_x\":1,\"sheet_y\":24,\"short_names\":[\"white_frowning_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"white,frowning,face\"},\"dolphin\":{\"name\":\"Dolphin\",\"unified\":\"1F42C\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":8,\"short_names\":[\"dolphin\",\"flipper\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"fish\",\"sea\",\"ocean\",\"flipper\",\"fins\",\"beach\"],\"search\":\"dolphin,flipper,animal,nature,fish,sea,ocean,fins,beach\"},\"radioactive_sign\":{\"name\":\"Radioactive Sign\",\"unified\":\"2622\",\"variations\":[\"2622-FE0F\"],\"sheet_x\":1,\"sheet_y\":17,\"short_names\":[\"radioactive_sign\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nuclear\",\"danger\"],\"search\":\"radioactive,sign,nuclear,danger\"},\"headphones\":{\"name\":\"Headphone\",\"unified\":\"1F3A7\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":22,\"short_names\":[\"headphones\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"music\",\"score\",\"gadgets\"],\"search\":\"headphones,headphone,music,score,gadgets\"},\"flag-cf\":{\"name\":\"Regional Indicator Symbol Letters CF\",\"unified\":\"1F1E8-1F1EB\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":33,\"short_names\":[\"flag-cf\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,cf,regional,indicator,symbol,letters\"},\"ferry\":{\"name\":\"Ferry\",\"unified\":\"26F4\",\"variations\":[],\"sheet_x\":2,\"sheet_y\":34,\"short_names\":[\"ferry\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"boat\",\"ship\",\"yacht\"],\"search\":\"ferry,boat,ship,yacht\"},\"wastebasket\":{\"name\":\"Wastebasket\",\"unified\":\"1F5D1\",\"variations\":[],\"sheet_x\":25,\"sheet_y\":39,\"short_names\":[\"wastebasket\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"bin\",\"trash\",\"rubbish\",\"garbage\",\"toss\"],\"search\":\"wastebasket,bin,trash,rubbish,garbage,toss\"},\"shaved_ice\":{\"name\":\"Shaved Ice\",\"unified\":\"1F367\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":40,\"short_names\":[\"shaved_ice\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"hot\",\"dessert\",\"summer\"],\"search\":\"shaved,ice,hot,dessert,summer\"},\"whale\":{\"name\":\"Spouting Whale\",\"unified\":\"1F433\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":15,\"short_names\":[\"whale\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"sea\",\"ocean\"],\"search\":\"whale,spouting,animal,nature,sea,ocean\"},\"oil_drum\":{\"name\":\"Oil Drum\",\"unified\":\"1F6E2\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":33,\"short_names\":[\"oil_drum\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"barrell\"],\"search\":\"oil,drum,barrell\"},\"ice_cream\":{\"name\":\"Ice Cream\",\"unified\":\"1F368\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":0,\"short_names\":[\"ice_cream\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"hot\",\"dessert\"],\"search\":\"ice,cream,food,hot,dessert\"},\"passenger_ship\":{\"name\":\"Passenger Ship\",\"unified\":\"1F6F3\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":0,\"short_names\":[\"passenger_ship\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"yacht\",\"cruise\",\"ferry\"],\"search\":\"passenger,ship,yacht,cruise,ferry\"},\"biohazard_sign\":{\"name\":\"Biohazard Sign\",\"unified\":\"2623\",\"variations\":[\"2623-FE0F\"],\"sheet_x\":1,\"sheet_y\":18,\"short_names\":[\"biohazard_sign\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"danger\"],\"search\":\"biohazard,sign,danger\"},\"musical_score\":{\"name\":\"Musical Score\",\"unified\":\"1F3BC\",\"variations\":[],\"sheet_x\":10,\"sheet_y\":2,\"short_names\":[\"musical_score\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"treble\",\"clef\"],\"search\":\"musical,score,treble,clef\"},\"persevere\":{\"name\":\"Persevering Face\",\"unified\":\"1F623\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":9,\"short_names\":[\"persevere\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"sick\",\"no\",\"upset\",\"oops\"],\"search\":\"persevere,persevering,face,sick,no,upset,oops\"},\"flag-td\":{\"name\":\"Regional Indicator Symbol Letters TD\",\"unified\":\"1F1F9-1F1E9\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":8,\"short_names\":[\"flag-td\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,td,regional,indicator,symbol,letters\"},\"icecream\":{\"name\":\"Soft Ice Cream\",\"unified\":\"1F366\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":39,\"short_names\":[\"icecream\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"hot\",\"dessert\",\"summer\"],\"search\":\"icecream,soft,ice,cream,food,hot,dessert,summer\"},\"whale2\":{\"name\":\"Whale\",\"unified\":\"1F40B\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":16,\"short_names\":[\"whale2\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"sea\",\"ocean\"],\"search\":\"whale2,whale,animal,nature,sea,ocean\"},\"musical_keyboard\":{\"name\":\"Musical Keyboard\",\"unified\":\"1F3B9\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":40,\"short_names\":[\"musical_keyboard\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"piano\",\"instrument\"],\"search\":\"musical,keyboard,piano,instrument\"},\"money_with_wings\":{\"name\":\"Money with Wings\",\"unified\":\"1F4B8\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":36,\"short_names\":[\"money_with_wings\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"dollar\",\"bills\",\"payment\",\"sale\"],\"search\":\"money,with,wings,dollar,bills,payment,sale\"},\"confounded\":{\"name\":\"Confounded Face\",\"unified\":\"1F616\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":37,\"short_names\":[\"confounded\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"confused\",\"sick\",\"unwell\",\"oops\"],\"search\":\"confounded,face,confused,sick,unwell,oops\"},\"rocket\":{\"name\":\"Rocket\",\"unified\":\"1F680\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":12,\"short_names\":[\"rocket\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"launch\",\"ship\",\"staffmode\",\"NASA\",\"outer space\",\"outer_space\",\"fly\"],\"search\":\"rocket,launch,ship,staffmode,nasa,outer space,outer_space,fly\"},\"mobile_phone_off\":{\"name\":\"Mobile Phone off\",\"unified\":\"1F4F4\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":14,\"short_names\":[\"mobile_phone_off\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"mute\",\"orange-square\",\"silence\",\"quiet\"],\"search\":\"mobile,phone,off,mute,orange-square,silence,quiet\"},\"flag-cl\":{\"name\":\"Regional Indicator Symbol Letters CL\",\"unified\":\"1F1E8-1F1F1\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":38,\"short_names\":[\"flag-cl\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,cl,regional,indicator,symbol,letters\"},\"satellite\":{\"name\":\"Satellite\",\"unified\":\"1F6F0\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":40,\"short_names\":[\"satellite\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"communication\",\"future\",\"radio\",\"space\"],\"search\":\"satellite,communication,future,radio,space\"},\"flag-cn\":{\"name\":\"Regional Indicator Symbol Letters CN\",\"unified\":\"1F1E8-1F1F3\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":40,\"short_names\":[\"flag-cn\",\"cn\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,cn,regional,indicator,symbol,letters\"},\"crocodile\":{\"name\":\"Crocodile\",\"unified\":\"1F40A\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":15,\"short_names\":[\"crocodile\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"reptile\"],\"search\":\"crocodile,animal,nature,reptile\"},\"cake\":{\"name\":\"Shortcake\",\"unified\":\"1F370\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":8,\"short_names\":[\"cake\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"dessert\"],\"search\":\"cake,shortcake,food,dessert\"},\"dollar\":{\"name\":\"Banknote with Dollar Sign\",\"unified\":\"1F4B5\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":33,\"short_names\":[\"dollar\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"money\",\"sales\",\"bill\",\"currency\"],\"search\":\"dollar,banknote,with,sign,money,sales,bill,currency\"},\"vibration_mode\":{\"name\":\"Vibration Mode\",\"unified\":\"1F4F3\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":13,\"short_names\":[\"vibration_mode\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"orange-square\",\"phone\"],\"search\":\"vibration,mode,orange-square,phone\"},\"tired_face\":{\"name\":\"Tired Face\",\"unified\":\"1F62B\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":17,\"short_names\":[\"tired_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sick\",\"whine\",\"upset\",\"frustrated\"],\"search\":\"tired,face,sick,whine,upset,frustrated\"},\"saxophone\":{\"name\":\"Saxophone\",\"unified\":\"1F3B7\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":38,\"short_names\":[\"saxophone\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"music\",\"instrument\",\"jazz\",\"blues\"],\"search\":\"saxophone,music,instrument,jazz,blues\"},\"flag-cx\":{\"name\":\"Regional Indicator Symbol Letters CX\",\"unified\":\"1F1E8-1F1FD\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":6,\"short_names\":[\"flag-cx\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,cx,regional,indicator,symbol,letters\"},\"seat\":{\"name\":\"Seat\",\"unified\":\"1F4BA\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":38,\"short_names\":[\"seat\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sit\",\"airplane\",\"transport\",\"bus\",\"flight\",\"fly\"],\"search\":\"seat,sit,airplane,transport,bus,flight,fly\"},\"trumpet\":{\"name\":\"Trumpet\",\"unified\":\"1F3BA\",\"variations\":[],\"sheet_x\":10,\"sheet_y\":0,\"short_names\":[\"trumpet\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"music\",\"brass\"],\"search\":\"trumpet,music,brass\"},\"yen\":{\"name\":\"Banknote with Yen Sign\",\"unified\":\"1F4B4\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":32,\"short_names\":[\"yen\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"money\",\"sales\",\"japanese\",\"dollar\",\"currency\"],\"search\":\"yen,banknote,with,sign,money,sales,japanese,dollar,currency\"},\"leopard\":{\"name\":\"Leopard\",\"unified\":\"1F406\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":11,\"short_names\":[\"leopard\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\"],\"search\":\"leopard,animal,nature\"},\"u6709\":{\"name\":\"Squared Cjk Unified Ideograph-6709\",\"unified\":\"1F236\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":14,\"short_names\":[\"u6709\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"orange-square\",\"chinese\",\"have\",\"kanji\"],\"search\":\"u6709,squared,cjk,unified,ideograph,6709,orange-square,chinese,have,kanji\"},\"birthday\":{\"name\":\"Birthday Cake\",\"unified\":\"1F382\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":26,\"short_names\":[\"birthday\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"dessert\"],\"search\":\"birthday,cake,food,dessert\"},\"weary\":{\"name\":\"Weary Face\",\"unified\":\"1F629\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":15,\"short_names\":[\"weary\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"tired\",\"sleepy\",\"sad\",\"frustrated\",\"upset\"],\"search\":\"weary,face,tired,sleepy,sad,frustrated,upset\"},\"tiger2\":{\"name\":\"Tiger\",\"unified\":\"1F405\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":10,\"short_names\":[\"tiger2\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"roar\"],\"search\":\"tiger2,tiger,animal,nature,roar\"},\"flag-cc\":{\"name\":\"Regional Indicator Symbol Letters CC\",\"unified\":\"1F1E8-1F1E8\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":31,\"short_names\":[\"flag-cc\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,cc,regional,indicator,symbol,letters\"},\"u7121\":{\"name\":\"Squared Cjk Unified Ideograph-7121\",\"unified\":\"1F21A\",\"variations\":[\"1F21A-FE0F\"],\"sheet_x\":5,\"sheet_y\":8,\"short_names\":[\"u7121\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nothing\",\"chinese\",\"kanji\",\"japanese\",\"orange-square\"],\"search\":\"u7121,squared,cjk,unified,ideograph,7121,nothing,chinese,kanji,japanese,orange-square\"},\"euro\":{\"name\":\"Banknote with Euro Sign\",\"unified\":\"1F4B6\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":34,\"short_names\":[\"euro\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"money\",\"sales\",\"dollar\",\"currency\"],\"search\":\"euro,banknote,with,sign,money,sales,dollar,currency\"},\"custard\":{\"name\":\"Custard\",\"unified\":\"1F36E\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":6,\"short_names\":[\"custard\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"dessert\",\"food\"],\"search\":\"custard,dessert,food\"},\"triumph\":{\"name\":\"Face with Look of Triumph\",\"unified\":\"1F624\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":10,\"short_names\":[\"triumph\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"gas\",\"phew\",\"proud\",\"pride\"],\"search\":\"triumph,face,with,look,of,gas,phew,proud,pride\"},\"anchor\":{\"name\":\"Anchor\",\"unified\":\"2693\",\"variations\":[\"2693-FE0F\"],\"sheet_x\":2,\"sheet_y\":5,\"short_names\":[\"anchor\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"ship\",\"ferry\",\"sea\",\"boat\"],\"search\":\"anchor,ship,ferry,sea,boat\"},\"guitar\":{\"name\":\"Guitar\",\"unified\":\"1F3B8\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":39,\"short_names\":[\"guitar\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"music\",\"instrument\"],\"search\":\"guitar,music,instrument\"},\"violin\":{\"name\":\"Violin\",\"unified\":\"1F3BB\",\"variations\":[],\"sheet_x\":10,\"sheet_y\":1,\"short_names\":[\"violin\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"music\",\"instrument\",\"orchestra\",\"symphony\"],\"search\":\"violin,music,instrument,orchestra,symphony\"},\"construction\":{\"name\":\"Construction Sign\",\"unified\":\"1F6A7\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":15,\"short_names\":[\"construction\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"wip\",\"progress\",\"caution\",\"warning\"],\"search\":\"construction,sign,wip,progress,caution,warning\"},\"water_buffalo\":{\"name\":\"Water Buffalo\",\"unified\":\"1F403\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":8,\"short_names\":[\"water_buffalo\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"ox\",\"cow\"],\"search\":\"water,buffalo,animal,nature,ox,cow\"},\"candy\":{\"name\":\"Candy\",\"unified\":\"1F36C\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":4,\"short_names\":[\"candy\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"snack\",\"dessert\",\"sweet\"],\"search\":\"candy,snack,dessert,sweet\"},\"pound\":{\"name\":\"Banknote with Pound Sign\",\"unified\":\"1F4B7\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":35,\"short_names\":[\"pound\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"british\",\"sterling\",\"money\",\"sales\",\"bills\",\"uk\",\"england\",\"currency\"],\"search\":\"pound,banknote,with,sign,british,sterling,money,sales,bills,uk,england,currency\"},\"flag-co\":{\"name\":\"Regional Indicator Symbol Letters CO\",\"unified\":\"1F1E8-1F1F4\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":0,\"short_names\":[\"flag-co\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,co,regional,indicator,symbol,letters\"},\"open_mouth\":{\"name\":\"Face with Open Mouth\",\"unified\":\"1F62E\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":20,\"short_names\":[\"open_mouth\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\":o\",\":-o\",\":O\",\":-O\"],\"keywords\":[\"face\",\"surprise\",\"impressed\",\"wow\"],\"search\":\"open,mouth,face,with,surprise,impressed,wow,:o,:-o\"},\"u7533\":{\"name\":\"Squared Cjk Unified Ideograph-7533\",\"unified\":\"1F238\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":16,\"short_names\":[\"u7533\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"chinese\",\"japanese\",\"kanji\",\"orange-square\"],\"search\":\"u7533,squared,cjk,unified,ideograph,7533,chinese,japanese,kanji,orange-square\"},\"ox\":{\"name\":\"Ox\",\"unified\":\"1F402\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":7,\"short_names\":[\"ox\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"cow\",\"beef\"],\"search\":\"ox,animal,cow,beef\"},\"scream\":{\"name\":\"Face Screaming in Fear\",\"unified\":\"1F631\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":23,\"short_names\":[\"scream\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"munch\",\"scared\",\"omg\"],\"search\":\"scream,face,screaming,in,fear,munch,scared,omg\"},\"flag-km\":{\"name\":\"Regional Indicator Symbol Letters KM\",\"unified\":\"1F1F0-1F1F2\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":34,\"short_names\":[\"flag-km\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,km,regional,indicator,symbol,letters\"},\"clapper\":{\"name\":\"Clapper Board\",\"unified\":\"1F3AC\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":27,\"short_names\":[\"clapper\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"movie\",\"film\",\"record\"],\"search\":\"clapper,board,movie,film,record\"},\"u55b6\":{\"name\":\"Squared Cjk Unified Ideograph-55b6\",\"unified\":\"1F23A\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":18,\"short_names\":[\"u55b6\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"japanese\",\"opening hours\",\"orange-square\"],\"search\":\"u55b6,squared,cjk,unified,ideograph,55b6,japanese,opening hours,orange-square\"},\"fuelpump\":{\"name\":\"Fuel Pump\",\"unified\":\"26FD\",\"variations\":[\"26FD-FE0F\"],\"sheet_x\":3,\"sheet_y\":4,\"short_names\":[\"fuelpump\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"gas station\",\"petroleum\"],\"search\":\"fuelpump,fuel,pump,gas station,petroleum\"},\"moneybag\":{\"name\":\"Money Bag\",\"unified\":\"1F4B0\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":28,\"short_names\":[\"moneybag\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"dollar\",\"payment\",\"coins\",\"sale\"],\"search\":\"moneybag,money,bag,dollar,payment,coins,sale\"},\"lollipop\":{\"name\":\"Lollipop\",\"unified\":\"1F36D\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":5,\"short_names\":[\"lollipop\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"snack\",\"candy\",\"sweet\"],\"search\":\"lollipop,food,snack,candy,sweet\"},\"credit_card\":{\"name\":\"Credit Card\",\"unified\":\"1F4B3\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":31,\"short_names\":[\"credit_card\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"money\",\"sales\",\"dollar\",\"bill\",\"payment\",\"shopping\"],\"search\":\"credit,card,money,sales,dollar,bill,payment,shopping\"},\"cow2\":{\"name\":\"Cow\",\"unified\":\"1F404\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":9,\"short_names\":[\"cow2\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"beef\",\"ox\",\"animal\",\"nature\",\"moo\",\"milk\"],\"search\":\"cow2,cow,beef,ox,animal,nature,moo,milk\"},\"video_game\":{\"name\":\"Video Game\",\"unified\":\"1F3AE\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":29,\"short_names\":[\"video_game\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"play\",\"console\",\"PS4\",\"controller\"],\"search\":\"video,game,play,console,ps4,controller\"},\"busstop\":{\"name\":\"Bus Stop\",\"unified\":\"1F68F\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":27,\"short_names\":[\"busstop\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"transportation\",\"wait\"],\"search\":\"busstop,bus,stop,transportation,wait\"},\"chocolate_bar\":{\"name\":\"Chocolate Bar\",\"unified\":\"1F36B\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":3,\"short_names\":[\"chocolate_bar\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"snack\",\"dessert\",\"sweet\"],\"search\":\"chocolate,bar,food,snack,dessert,sweet\"},\"u6708\":{\"name\":\"Squared Cjk Unified Ideograph-6708\",\"unified\":\"1F237\",\"variations\":[\"1F237-FE0F\"],\"sheet_x\":5,\"sheet_y\":15,\"short_names\":[\"u6708\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"chinese\",\"month\",\"moon\",\"japanese\",\"orange-square\",\"kanji\"],\"search\":\"u6708,squared,cjk,unified,ideograph,6708,chinese,month,moon,japanese,orange-square,kanji\"},\"fearful\":{\"name\":\"Fearful Face\",\"unified\":\"1F628\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":14,\"short_names\":[\"fearful\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"scared\",\"terrified\",\"nervous\",\"oops\",\"huh\"],\"search\":\"fearful,face,scared,terrified,nervous,oops,huh\"},\"flag-cg\":{\"name\":\"Regional Indicator Symbol Letters CG\",\"unified\":\"1F1E8-1F1EC\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":34,\"short_names\":[\"flag-cg\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,cg,regional,indicator,symbol,letters\"},\"dromedary_camel\":{\"name\":\"Dromedary Camel\",\"unified\":\"1F42A\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":6,\"short_names\":[\"dromedary_camel\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"hot\",\"desert\",\"hump\"],\"search\":\"dromedary,camel,animal,hot,desert,hump\"},\"popcorn\":{\"name\":\"Popcorn\",\"unified\":\"1F37F\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":23,\"short_names\":[\"popcorn\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"movie theater\",\"films\",\"snack\"],\"search\":\"popcorn,food,movie theater,films,snack\"},\"eight_pointed_black_star\":{\"name\":\"Eight Pointed Black Star\",\"unified\":\"2734\",\"variations\":[\"2734-FE0F\"],\"sheet_x\":4,\"sheet_y\":0,\"short_names\":[\"eight_pointed_black_star\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"orange-square\",\"shape\",\"polygon\"],\"search\":\"eight,pointed,black,star,orange-square,shape,polygon\"},\"gem\":{\"name\":\"Gem Stone\",\"unified\":\"1F48E\",\"variations\":[],\"sheet_x\":19,\"sheet_y\":30,\"short_names\":[\"gem\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue\",\"ruby\",\"diamond\",\"jewelry\"],\"search\":\"gem,stone,blue,ruby,diamond,jewelry\"},\"space_invader\":{\"name\":\"Alien Monster\",\"unified\":\"1F47E\",\"variations\":[],\"sheet_x\":18,\"sheet_y\":25,\"short_names\":[\"space_invader\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"game\",\"arcade\",\"play\"],\"search\":\"space,invader,alien,monster,game,arcade,play\"},\"vertical_traffic_light\":{\"name\":\"Vertical Traffic Light\",\"unified\":\"1F6A6\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":14,\"short_names\":[\"vertical_traffic_light\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"transportation\",\"driving\"],\"search\":\"vertical,traffic,light,transportation,driving\"},\"cold_sweat\":{\"name\":\"Face with Open Mouth and Cold Sweat\",\"unified\":\"1F630\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":22,\"short_names\":[\"cold_sweat\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"nervous\"],\"search\":\"cold,sweat,face,with,open,mouth,and,nervous\"},\"flag-cd\":{\"name\":\"Regional Indicator Symbol Letters CD\",\"unified\":\"1F1E8-1F1E9\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":32,\"short_names\":[\"flag-cd\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,cd,regional,indicator,symbol,letters\"},\"flag-ck\":{\"name\":\"Regional Indicator Symbol Letters CK\",\"unified\":\"1F1E8-1F1F0\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":37,\"short_names\":[\"flag-ck\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ck,regional,indicator,symbol,letters\"},\"hushed\":{\"name\":\"Hushed Face\",\"unified\":\"1F62F\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":21,\"short_names\":[\"hushed\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"woo\",\"shh\"],\"search\":\"hushed,face,woo,shh\"},\"traffic_light\":{\"name\":\"Horizontal Traffic Light\",\"unified\":\"1F6A5\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":13,\"short_names\":[\"traffic_light\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"transportation\",\"signal\"],\"search\":\"traffic,light,horizontal,transportation,signal\"},\"doughnut\":{\"name\":\"Doughnut\",\"unified\":\"1F369\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":1,\"short_names\":[\"doughnut\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"dessert\",\"snack\",\"sweet\",\"donut\"],\"search\":\"doughnut,food,dessert,snack,sweet,donut\"},\"camel\":{\"name\":\"Bactrian Camel\",\"unified\":\"1F42B\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":7,\"short_names\":[\"camel\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"hot\",\"desert\",\"hump\"],\"search\":\"camel,bactrian,animal,nature,hot,desert,hump\"},\"dart\":{\"name\":\"Direct Hit\",\"unified\":\"1F3AF\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":30,\"short_names\":[\"dart\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"game\",\"play\",\"bar\"],\"search\":\"dart,direct,hit,game,play,bar\"},\"scales\":{\"name\":\"Scales\",\"unified\":\"2696\",\"variations\":[],\"sheet_x\":2,\"sheet_y\":7,\"short_names\":[\"scales\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"law\",\"fairness\",\"weight\"],\"search\":\"scales,law,fairness,weight\"},\"vs\":{\"name\":\"Squared Vs\",\"unified\":\"1F19A\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":5,\"short_names\":[\"vs\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"words\",\"orange-square\"],\"search\":\"vs,squared,words,orange-square\"},\"elephant\":{\"name\":\"Elephant\",\"unified\":\"1F418\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":29,\"short_names\":[\"elephant\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"nose\",\"thailand\",\"circus\"],\"search\":\"elephant,animal,nature,nose,thailand,circus\"},\"wrench\":{\"name\":\"Wrench\",\"unified\":\"1F527\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":23,\"short_names\":[\"wrench\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"tools\",\"diy\",\"ikea\",\"fix\",\"maintainer\"],\"search\":\"wrench,tools,diy,ikea,fix,maintainer\"},\"game_die\":{\"name\":\"Game Die\",\"unified\":\"1F3B2\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":33,\"short_names\":[\"game_die\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"dice\",\"random\",\"tabbletop\",\"play\",\"luck\"],\"search\":\"game,die,dice,random,tabbletop,play,luck\"},\"accept\":{\"name\":\"Circled Ideograph Accept\",\"unified\":\"1F251\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":20,\"short_names\":[\"accept\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"ok\",\"good\",\"chinese\",\"kanji\",\"agree\",\"yes\",\"orange-circle\"],\"search\":\"accept,circled,ideograph,ok,good,chinese,kanji,agree,yes,orange-circle\"},\"cookie\":{\"name\":\"Cookie\",\"unified\":\"1F36A\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":2,\"short_names\":[\"cookie\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"snack\",\"oreo\",\"chocolate\",\"sweet\",\"dessert\"],\"search\":\"cookie,food,snack,oreo,chocolate,sweet,dessert\"},\"flag-cr\":{\"name\":\"Regional Indicator Symbol Letters CR\",\"unified\":\"1F1E8-1F1F7\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":2,\"short_names\":[\"flag-cr\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,cr,regional,indicator,symbol,letters\"},\"checkered_flag\":{\"name\":\"Chequered Flag\",\"unified\":\"1F3C1\",\"variations\":[],\"sheet_x\":10,\"sheet_y\":7,\"short_names\":[\"checkered_flag\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"contest\",\"finishline\",\"rase\",\"gokart\"],\"search\":\"checkered,flag,chequered,contest,finishline,rase,gokart\"},\"frowning\":{\"name\":\"Frowning Face with Open Mouth\",\"unified\":\"1F626\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":12,\"short_names\":[\"frowning\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"aw\",\"what\"],\"search\":\"frowning,face,with,open,mouth,aw,what\"},\"white_flower\":{\"name\":\"White Flower\",\"unified\":\"1F4AE\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":26,\"short_names\":[\"white_flower\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"japanese\",\"spring\"],\"search\":\"white,flower,japanese,spring\"},\"ship\":{\"name\":\"Ship\",\"unified\":\"1F6A2\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":5,\"short_names\":[\"ship\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"transportation\",\"titanic\",\"deploy\"],\"search\":\"ship,transportation,titanic,deploy\"},\"hammer\":{\"name\":\"Hammer\",\"unified\":\"1F528\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":24,\"short_names\":[\"hammer\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"tools\",\"build\",\"create\"],\"search\":\"hammer,tools,build,create\"},\"flag-hr\":{\"name\":\"Regional Indicator Symbol Letters HR\",\"unified\":\"1F1ED-1F1F7\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":12,\"short_names\":[\"flag-hr\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,hr,regional,indicator,symbol,letters\"},\"anguished\":{\"name\":\"Anguished Face\",\"unified\":\"1F627\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":13,\"short_names\":[\"anguished\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\"D:\"],\"keywords\":[\"face\",\"stunned\",\"nervous\"],\"search\":\"anguished,face,stunned,nervous,d:\"},\"goat\":{\"name\":\"Goat\",\"unified\":\"1F410\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":21,\"short_names\":[\"goat\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\"],\"search\":\"goat,animal,nature\"},\"beer\":{\"name\":\"Beer Mug\",\"unified\":\"1F37A\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":18,\"short_names\":[\"beer\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"relax\",\"beverage\",\"drink\",\"drunk\",\"party\",\"pub\",\"summer\",\"alcohol\",\"booze\"],\"search\":\"beer,mug,relax,beverage,drink,drunk,party,pub,summer,alcohol,booze\"},\"slot_machine\":{\"name\":\"Slot Machine\",\"unified\":\"1F3B0\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":31,\"short_names\":[\"slot_machine\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"bet\",\"gamble\",\"vegas\",\"fruit machine\",\"luck\",\"casino\"],\"search\":\"slot,machine,bet,gamble,vegas,fruit machine,luck,casino\"},\"flag-cu\":{\"name\":\"Regional Indicator Symbol Letters CU\",\"unified\":\"1F1E8-1F1FA\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":3,\"short_names\":[\"flag-cu\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,cu,regional,indicator,symbol,letters\"},\"hammer_and_pick\":{\"name\":\"Hammer and Pick\",\"unified\":\"2692\",\"variations\":[],\"sheet_x\":2,\"sheet_y\":4,\"short_names\":[\"hammer_and_pick\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"tools\",\"build\",\"create\"],\"search\":\"hammer,and,pick,tools,build,create\"},\"beers\":{\"name\":\"Clinking Beer Mugs\",\"unified\":\"1F37B\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":19,\"short_names\":[\"beers\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"relax\",\"beverage\",\"drink\",\"drunk\",\"party\",\"pub\",\"summer\",\"alcohol\",\"booze\"],\"search\":\"beers,clinking,beer,mugs,relax,beverage,drink,drunk,party,pub,summer,alcohol,booze\"},\"ferris_wheel\":{\"name\":\"Ferris Wheel\",\"unified\":\"1F3A1\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":16,\"short_names\":[\"ferris_wheel\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"carnival\",\"londoneye\"],\"search\":\"ferris,wheel,photo,carnival,londoneye\"},\"ideograph_advantage\":{\"name\":\"Circled Ideograph Advantage\",\"unified\":\"1F250\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":19,\"short_names\":[\"ideograph_advantage\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"chinese\",\"kanji\",\"obtain\",\"get\",\"circle\"],\"search\":\"ideograph,advantage,circled,chinese,kanji,obtain,get,circle\"},\"ram\":{\"name\":\"Ram\",\"unified\":\"1F40F\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":20,\"short_names\":[\"ram\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"sheep\",\"nature\"],\"search\":\"ram,animal,sheep,nature\"},\"cry\":{\"name\":\"Crying Face\",\"unified\":\"1F622\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":8,\"short_names\":[\"cry\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\":'(\"],\"keywords\":[\"face\",\"tears\",\"sad\",\"depressed\",\"upset\",\":'(\"],\"search\":\"cry,crying,face,tears,sad,depressed,upset,:'(\"},\"bowling\":{\"name\":\"Bowling\",\"unified\":\"1F3B3\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":34,\"short_names\":[\"bowling\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sports\",\"fun\",\"play\"],\"search\":\"bowling,sports,fun,play\"},\"flag-cw\":{\"name\":\"Regional Indicator Symbol Letters CW\",\"unified\":\"1F1E8-1F1FC\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":5,\"short_names\":[\"flag-cw\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,cw,regional,indicator,symbol,letters\"},\"secret\":{\"name\":\"Circled Ideograph Secret\",\"unified\":\"3299\",\"variations\":[\"3299-FE0F\"],\"sheet_x\":4,\"sheet_y\":29,\"short_names\":[\"secret\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"privacy\",\"chinese\",\"sshh\",\"kanji\",\"red-circle\"],\"search\":\"secret,circled,ideograph,privacy,chinese,sshh,kanji,red-circle\"},\"disappointed_relieved\":{\"name\":\"Disappointed but Relieved Face\",\"unified\":\"1F625\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":11,\"short_names\":[\"disappointed_relieved\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"phew\",\"sweat\",\"nervous\"],\"search\":\"disappointed,relieved,but,face,phew,sweat,nervous\"},\"hammer_and_wrench\":{\"name\":\"Hammer and Wrench\",\"unified\":\"1F6E0\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":31,\"short_names\":[\"hammer_and_wrench\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"tools\",\"build\",\"create\"],\"search\":\"hammer,and,wrench,tools,build,create\"},\"roller_coaster\":{\"name\":\"Roller Coaster\",\"unified\":\"1F3A2\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":17,\"short_names\":[\"roller_coaster\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"carnival\",\"playground\",\"photo\",\"fun\"],\"search\":\"roller,coaster,carnival,playground,photo,fun\"},\"sheep\":{\"name\":\"Sheep\",\"unified\":\"1F411\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":22,\"short_names\":[\"sheep\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"wool\",\"shipit\"],\"search\":\"sheep,animal,nature,wool,shipit\"},\"wine_glass\":{\"name\":\"Wine Glass\",\"unified\":\"1F377\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":15,\"short_names\":[\"wine_glass\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"drink\",\"beverage\",\"drunk\",\"alcohol\",\"booze\"],\"search\":\"wine,glass,drink,beverage,drunk,alcohol,booze\"},\"congratulations\":{\"name\":\"Circled Ideograph Congratulation\",\"unified\":\"3297\",\"variations\":[\"3297-FE0F\"],\"sheet_x\":4,\"sheet_y\":28,\"short_names\":[\"congratulations\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"chinese\",\"kanji\",\"japanese\",\"red-circle\"],\"search\":\"congratulations,circled,ideograph,congratulation,chinese,kanji,japanese,red-circle\"},\"sleepy\":{\"name\":\"Sleepy Face\",\"unified\":\"1F62A\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":16,\"short_names\":[\"sleepy\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"tired\",\"rest\",\"nap\"],\"search\":\"sleepy,face,tired,rest,nap\"},\"carousel_horse\":{\"name\":\"Carousel Horse\",\"unified\":\"1F3A0\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":15,\"short_names\":[\"carousel_horse\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"carnival\"],\"search\":\"carousel,horse,photo,carnival\"},\"pick\":{\"name\":\"Pick\",\"unified\":\"26CF\",\"variations\":[],\"sheet_x\":2,\"sheet_y\":24,\"short_names\":[\"pick\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"tools\",\"dig\"],\"search\":\"pick,tools,dig\"},\"flag-cy\":{\"name\":\"Regional Indicator Symbol Letters CY\",\"unified\":\"1F1E8-1F1FE\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":7,\"short_names\":[\"flag-cy\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,cy,regional,indicator,symbol,letters\"},\"cocktail\":{\"name\":\"Cocktail Glass\",\"unified\":\"1F378\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":16,\"short_names\":[\"cocktail\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"drink\",\"drunk\",\"alcohol\",\"beverage\",\"booze\"],\"search\":\"cocktail,glass,drink,drunk,alcohol,beverage,booze\"},\"racehorse\":{\"name\":\"Horse\",\"unified\":\"1F40E\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":19,\"short_names\":[\"racehorse\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"gamble\",\"luck\"],\"search\":\"racehorse,horse,animal,gamble,luck\"},\"flag-cz\":{\"name\":\"Regional Indicator Symbol Letters CZ\",\"unified\":\"1F1E8-1F1FF\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":8,\"short_names\":[\"flag-cz\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,cz,regional,indicator,symbol,letters\"},\"tropical_drink\":{\"name\":\"Tropical Drink\",\"unified\":\"1F379\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":17,\"short_names\":[\"tropical_drink\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"beverage\",\"cocktail\",\"summer\",\"beach\",\"alcohol\",\"booze\"],\"search\":\"tropical,drink,beverage,cocktail,summer,beach,alcohol,booze\"},\"u5408\":{\"name\":\"Squared Cjk Unified Ideograph-5408\",\"unified\":\"1F234\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":12,\"short_names\":[\"u5408\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"japanese\",\"chinese\",\"join\",\"kanji\",\"red-square\"],\"search\":\"u5408,squared,cjk,unified,ideograph,5408,japanese,chinese,join,kanji,red-square\"},\"nut_and_bolt\":{\"name\":\"Nut and Bolt\",\"unified\":\"1F529\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":25,\"short_names\":[\"nut_and_bolt\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"handy\",\"tools\",\"fix\"],\"search\":\"nut,and,bolt,handy,tools,fix\"},\"sweat\":{\"name\":\"Face with Cold Sweat\",\"unified\":\"1F613\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":34,\"short_names\":[\"sweat\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"hot\",\"sad\",\"tired\",\"exercise\"],\"search\":\"sweat,face,with,cold,hot,sad,tired,exercise\"},\"building_construction\":{\"name\":\"Building Construction\",\"unified\":\"1F3D7\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":8,\"short_names\":[\"building_construction\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"wip\",\"working\",\"progress\"],\"search\":\"building,construction,wip,working,progress\"},\"pig2\":{\"name\":\"Pig\",\"unified\":\"1F416\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":27,\"short_names\":[\"pig2\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\"],\"search\":\"pig2,pig,animal,nature\"},\"sob\":{\"name\":\"Loudly Crying Face\",\"unified\":\"1F62D\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":19,\"short_names\":[\"sob\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\":'(\"],\"keywords\":[\"face\",\"cry\",\"tears\",\"sad\",\"upset\",\"depressed\"],\"search\":\"sob,loudly,crying,face,cry,tears,sad,upset,depressed,:'(\"},\"u6e80\":{\"name\":\"Squared Cjk Unified Ideograph-6e80\",\"unified\":\"1F235\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":13,\"short_names\":[\"u6e80\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"full\",\"chinese\",\"japanese\",\"red-square\",\"kanji\"],\"search\":\"u6e80,squared,cjk,unified,ideograph,6e80,full,chinese,japanese,red-square,kanji\"},\"flag-dk\":{\"name\":\"Regional Indicator Symbol Letters DK\",\"unified\":\"1F1E9-1F1F0\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":12,\"short_names\":[\"flag-dk\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,dk,regional,indicator,symbol,letters\"},\"gear\":{\"name\":\"Gear\",\"unified\":\"2699\",\"variations\":[],\"sheet_x\":2,\"sheet_y\":9,\"short_names\":[\"gear\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"cog\"],\"search\":\"gear,cog\"},\"rat\":{\"name\":\"Rat\",\"unified\":\"1F400\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":5,\"short_names\":[\"rat\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"mouse\",\"rodent\"],\"search\":\"rat,animal,mouse,rodent\"},\"champagne\":{\"name\":\"Bottle with Popping Cork\",\"unified\":\"1F37E\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":22,\"short_names\":[\"champagne\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"champagne,bottle,with,popping,cork\"},\"foggy\":{\"name\":\"Foggy\",\"unified\":\"1F301\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":22,\"short_names\":[\"foggy\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"mountain\"],\"search\":\"foggy,photo,mountain\"},\"tokyo_tower\":{\"name\":\"Tokyo Tower\",\"unified\":\"1F5FC\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":11,\"short_names\":[\"tokyo_tower\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"japanese\"],\"search\":\"tokyo,tower,photo,japanese\"},\"dizzy_face\":{\"name\":\"Dizzy Face\",\"unified\":\"1F635\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":27,\"short_names\":[\"dizzy_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"spent\",\"unconscious\",\"xox\"],\"search\":\"dizzy,face,spent,unconscious,xox\"},\"sake\":{\"name\":\"Sake Bottle and Cup\",\"unified\":\"1F376\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":14,\"short_names\":[\"sake\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"wine\",\"drink\",\"drunk\",\"beverage\",\"japanese\",\"alcohol\",\"booze\"],\"search\":\"sake,bottle,and,cup,wine,drink,drunk,beverage,japanese,alcohol,booze\"},\"u7981\":{\"name\":\"Squared Cjk Unified Ideograph-7981\",\"unified\":\"1F232\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":10,\"short_names\":[\"u7981\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"kanji\",\"japanese\",\"chinese\",\"forbidden\",\"limit\",\"restricted\",\"red-square\"],\"search\":\"u7981,squared,cjk,unified,ideograph,7981,kanji,japanese,chinese,forbidden,limit,restricted,red-square\"},\"mouse2\":{\"name\":\"Mouse\",\"unified\":\"1F401\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":6,\"short_names\":[\"mouse2\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"rodent\"],\"search\":\"mouse2,mouse,animal,nature,rodent\"},\"flag-dj\":{\"name\":\"Regional Indicator Symbol Letters DJ\",\"unified\":\"1F1E9-1F1EF\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":11,\"short_names\":[\"flag-dj\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,dj,regional,indicator,symbol,letters\"},\"chains\":{\"name\":\"Chains\",\"unified\":\"26D3\",\"variations\":[],\"sheet_x\":2,\"sheet_y\":26,\"short_names\":[\"chains\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"lock\",\"arrest\"],\"search\":\"chains,lock,arrest\"},\"a\":{\"name\":\"Negative Squared Latin Capital Letter a\",\"unified\":\"1F170\",\"variations\":[\"1F170-FE0F\"],\"sheet_x\":4,\"sheet_y\":32,\"short_names\":[\"a\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"red-square\",\"alphabet\",\"letter\"],\"search\":\"a,negative,squared,latin,capital,letter,red-square,alphabet\"},\"tea\":{\"name\":\"Teacup Without Handle\",\"unified\":\"1F375\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":13,\"short_names\":[\"tea\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"drink\",\"bowl\",\"breakfast\",\"green\",\"british\"],\"search\":\"tea,teacup,without,handle,drink,bowl,breakfast,green,british\"},\"gun\":{\"name\":\"Pistol\",\"unified\":\"1F52B\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":27,\"short_names\":[\"gun\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"violence\",\"weapon\",\"pistol\",\"revolver\"],\"search\":\"gun,pistol,violence,weapon,revolver\"},\"astonished\":{\"name\":\"Astonished Face\",\"unified\":\"1F632\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":24,\"short_names\":[\"astonished\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"xox\",\"surprised\",\"poisoned\"],\"search\":\"astonished,face,xox,surprised,poisoned\"},\"flag-dm\":{\"name\":\"Regional Indicator Symbol Letters DM\",\"unified\":\"1F1E9-1F1F2\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":13,\"short_names\":[\"flag-dm\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,dm,regional,indicator,symbol,letters\"},\"rooster\":{\"name\":\"Rooster\",\"unified\":\"1F413\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":24,\"short_names\":[\"rooster\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"chicken\"],\"search\":\"rooster,animal,nature,chicken\"},\"factory\":{\"name\":\"Factory\",\"unified\":\"1F3ED\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":30,\"short_names\":[\"factory\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"building\",\"industry\",\"pollution\",\"smoke\"],\"search\":\"factory,building,industry,pollution,smoke\"},\"coffee\":{\"name\":\"Hot Beverage\",\"unified\":\"2615\",\"variations\":[\"2615-FE0F\"],\"sheet_x\":1,\"sheet_y\":8,\"short_names\":[\"coffee\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"beverage\",\"caffeine\",\"latte\",\"espresso\"],\"search\":\"coffee,hot,beverage,caffeine,latte,espresso\"},\"bomb\":{\"name\":\"Bomb\",\"unified\":\"1F4A3\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":10,\"short_names\":[\"bomb\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"boom\",\"explode\",\"explosion\",\"terrorism\"],\"search\":\"bomb,boom,explode,explosion,terrorism\"},\"flag-do\":{\"name\":\"Regional Indicator Symbol Letters DO\",\"unified\":\"1F1E9-1F1F4\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":14,\"short_names\":[\"flag-do\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,do,regional,indicator,symbol,letters\"},\"fountain\":{\"name\":\"Fountain\",\"unified\":\"26F2\",\"variations\":[\"26F2-FE0F\"],\"sheet_x\":2,\"sheet_y\":32,\"short_names\":[\"fountain\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"summer\",\"water\",\"fresh\"],\"search\":\"fountain,photo,summer,water,fresh\"},\"turkey\":{\"name\":\"Turkey\",\"unified\":\"1F983\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":18,\"short_names\":[\"turkey\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"bird\"],\"search\":\"turkey,animal,bird\"},\"zipper_mouth_face\":{\"name\":\"Zipper-Mouth Face\",\"unified\":\"1F910\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":1,\"short_names\":[\"zipper_mouth_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"zipper,mouth,face\"},\"b\":{\"name\":\"Negative Squared Latin Capital Letter B\",\"unified\":\"1F171\",\"variations\":[\"1F171-FE0F\"],\"sheet_x\":4,\"sheet_y\":33,\"short_names\":[\"b\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"red-square\",\"alphabet\",\"letter\"],\"search\":\"b,negative,squared,latin,capital,letter,red-square,alphabet\"},\"mask\":{\"name\":\"Face with Medical Mask\",\"unified\":\"1F637\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":29,\"short_names\":[\"mask\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"sick\",\"ill\",\"disease\"],\"search\":\"mask,face,with,medical,sick,ill,disease\"},\"flag-ec\":{\"name\":\"Regional Indicator Symbol Letters EC\",\"unified\":\"1F1EA-1F1E8\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":17,\"short_names\":[\"flag-ec\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ec,regional,indicator,symbol,letters\"},\"ab\":{\"name\":\"Negative Squared Ab\",\"unified\":\"1F18E\",\"variations\":[],\"sheet_x\":4,\"sheet_y\":36,\"short_names\":[\"ab\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"red-square\",\"alphabet\"],\"search\":\"ab,negative,squared,red-square,alphabet\"},\"rice_scene\":{\"name\":\"Moon Viewing Ceremony\",\"unified\":\"1F391\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":5,\"short_names\":[\"rice_scene\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"japan\",\"asia\",\"tsukimi\"],\"search\":\"rice,scene,moon,viewing,ceremony,photo,japan,asia,tsukimi\"},\"baby_bottle\":{\"name\":\"Baby Bottle\",\"unified\":\"1F37C\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":20,\"short_names\":[\"baby_bottle\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"container\",\"milk\"],\"search\":\"baby,bottle,food,container,milk\"},\"hocho\":{\"name\":\"Hocho\",\"unified\":\"1F52A\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":26,\"short_names\":[\"hocho\",\"knife\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"knife\",\"blade\",\"cutlery\",\"kitchen\",\"weapon\"],\"search\":\"hocho,knife,blade,cutlery,kitchen,weapon\"},\"dove_of_peace\":{\"name\":\"Dove of Peace\",\"unified\":\"1F54A\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":6,\"short_names\":[\"dove_of_peace\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"bird\"],\"search\":\"dove,of,peace,animal,bird\"},\"cl\":{\"name\":\"Squared Cl\",\"unified\":\"1F191\",\"variations\":[],\"sheet_x\":4,\"sheet_y\":37,\"short_names\":[\"cl\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"alphabet\",\"words\",\"red-square\"],\"search\":\"cl,squared,alphabet,words,red-square\"},\"dog2\":{\"name\":\"Dog\",\"unified\":\"1F415\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":26,\"short_names\":[\"dog2\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"friend\",\"doge\",\"pet\",\"faithful\"],\"search\":\"dog2,dog,animal,nature,friend,doge,pet,faithful\"},\"fork_and_knife\":{\"name\":\"Fork and Knife\",\"unified\":\"1F374\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":12,\"short_names\":[\"fork_and_knife\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"cutlery\",\"kitchen\"],\"search\":\"fork,and,knife,cutlery,kitchen\"},\"dagger_knife\":{\"name\":\"Dagger Knife\",\"unified\":\"1F5E1\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":4,\"short_names\":[\"dagger_knife\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"weapon\"],\"search\":\"dagger,knife,weapon\"},\"mountain\":{\"name\":\"Mountain\",\"unified\":\"26F0\",\"variations\":[],\"sheet_x\":2,\"sheet_y\":30,\"short_names\":[\"mountain\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"nature\",\"environment\"],\"search\":\"mountain,photo,nature,environment\"},\"face_with_thermometer\":{\"name\":\"Face with Thermometer\",\"unified\":\"1F912\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":3,\"short_names\":[\"face_with_thermometer\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"face,with,thermometer\"},\"flag-eg\":{\"name\":\"Regional Indicator Symbol Letters EG\",\"unified\":\"1F1EA-1F1EC\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":19,\"short_names\":[\"flag-eg\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,eg,regional,indicator,symbol,letters\"},\"poodle\":{\"name\":\"Poodle\",\"unified\":\"1F429\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":5,\"short_names\":[\"poodle\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"dog\",\"animal\",\"101\",\"nature\",\"pet\"],\"search\":\"poodle,dog,animal,101,nature,pet\"},\"flag-sv\":{\"name\":\"Regional Indicator Symbol Letters SV\",\"unified\":\"1F1F8-1F1FB\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":2,\"short_names\":[\"flag-sv\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,sv,regional,indicator,symbol,letters\"},\"snow_capped_mountain\":{\"name\":\"Snow Capped Mountain\",\"unified\":\"1F3D4\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":5,\"short_names\":[\"snow_capped_mountain\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"nature\",\"environment\",\"winter\",\"cold\"],\"search\":\"snow,capped,mountain,photo,nature,environment,winter,cold\"},\"face_with_head_bandage\":{\"name\":\"Face with Head-Bandage\",\"unified\":\"1F915\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":6,\"short_names\":[\"face_with_head_bandage\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"face,with,head,bandage\"},\"o2\":{\"name\":\"Negative Squared Latin Capital Letter O\",\"unified\":\"1F17E\",\"variations\":[\"1F17E-FE0F\"],\"sheet_x\":4,\"sheet_y\":34,\"short_names\":[\"o2\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"alphabet\",\"red-square\",\"letter\"],\"search\":\"o2,negative,squared,latin,capital,letter,o,alphabet,red-square\"},\"knife_fork_plate\":{\"name\":\"Fork and Knife with Plate\",\"unified\":\"1F37D\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":21,\"short_names\":[\"knife_fork_plate\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"knife,fork,plate,and,with\"},\"crossed_swords\":{\"name\":\"Crossed Swords\",\"unified\":\"2694\",\"variations\":[],\"sheet_x\":2,\"sheet_y\":6,\"short_names\":[\"crossed_swords\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"weapon\"],\"search\":\"crossed,swords,weapon\"},\"sos\":{\"name\":\"Squared Sos\",\"unified\":\"1F198\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":3,\"short_names\":[\"sos\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"help\",\"red-square\",\"words\",\"emergency\",\"911\"],\"search\":\"sos,squared,help,red-square,words,emergency,911\"},\"flag-gq\":{\"name\":\"Regional Indicator Symbol Letters GQ\",\"unified\":\"1F1EC-1F1F6\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":2,\"short_names\":[\"flag-gq\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,gq,regional,indicator,symbol,letters\"},\"mount_fuji\":{\"name\":\"Mount Fuji\",\"unified\":\"1F5FB\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":10,\"short_names\":[\"mount_fuji\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"mountain\",\"nature\",\"japanese\"],\"search\":\"mount,fuji,photo,mountain,nature,japanese\"},\"cat2\":{\"name\":\"Cat\",\"unified\":\"1F408\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":13,\"short_names\":[\"cat2\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"meow\",\"pet\",\"cats\"],\"search\":\"cat2,cat,animal,meow,pet,cats\"},\"shield\":{\"name\":\"Shield\",\"unified\":\"1F6E1\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":32,\"short_names\":[\"shield\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"protection\",\"security\"],\"search\":\"shield,protection,security\"},\"sleeping\":{\"name\":\"Sleeping Face\",\"unified\":\"1F634\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":26,\"short_names\":[\"sleeping\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"tired\",\"sleepy\",\"night\",\"zzz\"],\"search\":\"sleeping,face,tired,sleepy,night,zzz\"},\"volcano\":{\"name\":\"Volcano\",\"unified\":\"1F30B\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":32,\"short_names\":[\"volcano\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"nature\",\"disaster\"],\"search\":\"volcano,photo,nature,disaster\"},\"rabbit2\":{\"name\":\"Rabbit\",\"unified\":\"1F407\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":12,\"short_names\":[\"rabbit2\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"pet\",\"magic\",\"spring\"],\"search\":\"rabbit2,rabbit,animal,nature,pet,magic,spring\"},\"smoking\":{\"name\":\"Smoking Symbol\",\"unified\":\"1F6AC\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":20,\"short_names\":[\"smoking\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"kills\",\"tobacco\",\"cigarette\",\"joint\"],\"search\":\"smoking,symbol,kills,tobacco,cigarette,joint\"},\"flag-er\":{\"name\":\"Regional Indicator Symbol Letters ER\",\"unified\":\"1F1EA-1F1F7\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":21,\"short_names\":[\"flag-er\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,er,regional,indicator,symbol,letters\"},\"zzz\":{\"name\":\"Sleeping Symbol\",\"unified\":\"1F4A4\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":11,\"short_names\":[\"zzz\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sleepy\",\"tired\"],\"search\":\"zzz,sleeping,symbol,sleepy,tired\"},\"no_entry\":{\"name\":\"No Entry\",\"unified\":\"26D4\",\"variations\":[\"26D4-FE0F\"],\"sheet_x\":2,\"sheet_y\":27,\"short_names\":[\"no_entry\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"limit\",\"security\",\"privacy\",\"bad\",\"denied\",\"stop\",\"circle\"],\"search\":\"no,entry,limit,security,privacy,bad,denied,stop,circle\"},\"hankey\":{\"name\":\"Pile of Poo\",\"unified\":\"1F4A9\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":16,\"short_names\":[\"hankey\",\"poop\",\"shit\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"poop\",\"shitface\",\"fail\",\"turd\"],\"search\":\"hankey,poop,shit,pile,of,poo,shitface,fail,turd\"},\"flag-ee\":{\"name\":\"Regional Indicator Symbol Letters EE\",\"unified\":\"1F1EA-1F1EA\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":18,\"short_names\":[\"flag-ee\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ee,regional,indicator,symbol,letters\"},\"skull_and_crossbones\":{\"name\":\"Skull and Crossbones\",\"unified\":\"2620\",\"variations\":[\"2620-FE0F\"],\"sheet_x\":1,\"sheet_y\":16,\"short_names\":[\"skull_and_crossbones\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"poison\",\"danger\",\"deadly\",\"scary\"],\"search\":\"skull,and,crossbones,poison,danger,deadly,scary\"},\"chipmunk\":{\"name\":\"Chipmunk\",\"unified\":\"1F43F\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":27,\"short_names\":[\"chipmunk\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"nature\",\"rodent\"],\"search\":\"chipmunk,animal,nature,rodent\"},\"japan\":{\"name\":\"Silhouette of Japan\",\"unified\":\"1F5FE\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":13,\"short_names\":[\"japan\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nation\",\"country\",\"japanese\",\"asia\"],\"search\":\"japan,silhouette,of,nation,country,japanese,asia\"},\"name_badge\":{\"name\":\"Name Badge\",\"unified\":\"1F4DB\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":30,\"short_names\":[\"name_badge\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fire\",\"forbid\"],\"search\":\"name,badge,fire,forbid\"},\"coffin\":{\"name\":\"Coffin\",\"unified\":\"26B0\",\"variations\":[],\"sheet_x\":2,\"sheet_y\":16,\"short_names\":[\"coffin\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"vampire\",\"dead\",\"die\",\"death\",\"rip\"],\"search\":\"coffin,vampire,dead,die,death,rip\"},\"camping\":{\"name\":\"Camping\",\"unified\":\"1F3D5\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":6,\"short_names\":[\"camping\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"outdoors\",\"tent\"],\"search\":\"camping,photo,outdoors,tent\"},\"feet\":{\"name\":\"Paw Prints\",\"unified\":\"1F43E\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":26,\"short_names\":[\"feet\",\"paw_prints\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"tracking\",\"footprints\",\"dog\",\"cat\",\"pet\",\"paw_prints\"],\"search\":\"feet,paw,prints,animal,tracking,footprints,dog,cat,pet,paw_prints\"},\"flag-et\":{\"name\":\"Regional Indicator Symbol Letters ET\",\"unified\":\"1F1EA-1F1F9\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":23,\"short_names\":[\"flag-et\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,et,regional,indicator,symbol,letters\"},\"no_entry_sign\":{\"name\":\"No Entry Sign\",\"unified\":\"1F6AB\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":19,\"short_names\":[\"no_entry_sign\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"forbid\",\"stop\",\"limit\",\"denied\",\"disallow\",\"circle\"],\"search\":\"no,entry,sign,forbid,stop,limit,denied,disallow,circle\"},\"smiling_imp\":{\"name\":\"Smiling Face with Horns\",\"unified\":\"1F608\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":23,\"short_names\":[\"smiling_imp\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"devil\",\"horns\"],\"search\":\"smiling,imp,face,with,horns,devil\"},\"imp\":{\"name\":\"Imp\",\"unified\":\"1F47F\",\"variations\":[],\"sheet_x\":18,\"sheet_y\":26,\"short_names\":[\"imp\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"devil\",\"angry\",\"horns\"],\"search\":\"imp,devil,angry,horns\"},\"funeral_urn\":{\"name\":\"Funeral Urn\",\"unified\":\"26B1\",\"variations\":[],\"sheet_x\":2,\"sheet_y\":17,\"short_names\":[\"funeral_urn\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"dead\",\"die\",\"death\",\"rip\",\"ashes\"],\"search\":\"funeral,urn,dead,die,death,rip,ashes\"},\"tent\":{\"name\":\"Tent\",\"unified\":\"26FA\",\"variations\":[\"26FA-FE0F\"],\"sheet_x\":3,\"sheet_y\":3,\"short_names\":[\"tent\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"camping\",\"outdoors\"],\"search\":\"tent,photo,camping,outdoors\"},\"dragon\":{\"name\":\"Dragon\",\"unified\":\"1F409\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":14,\"short_names\":[\"dragon\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"myth\",\"nature\",\"chinese\",\"green\"],\"search\":\"dragon,animal,myth,nature,chinese,green\"},\"x\":{\"name\":\"Cross Mark\",\"unified\":\"274C\",\"variations\":[],\"sheet_x\":4,\"sheet_y\":3,\"short_names\":[\"x\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"no\",\"delete\",\"remove\",\"cancel\"],\"search\":\"x,cross,mark,no,delete,remove,cancel\"},\"flag-eu\":{\"name\":\"Regional Indicator Symbol Letters EU\",\"unified\":\"1F1EA-1F1FA\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":24,\"short_names\":[\"flag-eu\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,eu,regional,indicator,symbol,letters\"},\"amphora\":{\"name\":\"Amphora\",\"unified\":\"1F3FA\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":40,\"short_names\":[\"amphora\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"vase\",\"jar\"],\"search\":\"amphora,vase,jar\"},\"o\":{\"name\":\"Heavy Large Circle\",\"unified\":\"2B55\",\"variations\":[\"2B55-FE0F\"],\"sheet_x\":4,\"sheet_y\":25,\"short_names\":[\"o\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"circle\",\"round\"],\"search\":\"o,heavy,large,circle,round\"},\"national_park\":{\"name\":\"National Park\",\"unified\":\"1F3DE\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":15,\"short_names\":[\"national_park\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"environment\",\"nature\"],\"search\":\"national,park,photo,environment,nature\"},\"dragon_face\":{\"name\":\"Dragon Face\",\"unified\":\"1F432\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":14,\"short_names\":[\"dragon_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"myth\",\"nature\",\"chinese\",\"green\"],\"search\":\"dragon,face,animal,myth,nature,chinese,green\"},\"flag-fk\":{\"name\":\"Regional Indicator Symbol Letters FK\",\"unified\":\"1F1EB-1F1F0\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":27,\"short_names\":[\"flag-fk\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,fk,regional,indicator,symbol,letters\"},\"japanese_ogre\":{\"name\":\"Japanese Ogre\",\"unified\":\"1F479\",\"variations\":[],\"sheet_x\":18,\"sheet_y\":15,\"short_names\":[\"japanese_ogre\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"monster\",\"red\",\"mask\",\"halloween\",\"scary\",\"creepy\",\"devil\",\"demon\"],\"search\":\"japanese,ogre,monster,red,mask,halloween,scary,creepy,devil,demon\"},\"japanese_goblin\":{\"name\":\"Japanese Goblin\",\"unified\":\"1F47A\",\"variations\":[],\"sheet_x\":18,\"sheet_y\":16,\"short_names\":[\"japanese_goblin\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"red\",\"evil\",\"mask\",\"monster\",\"scary\",\"creepy\"],\"search\":\"japanese,goblin,red,evil,mask,monster,scary,creepy\"},\"flag-fo\":{\"name\":\"Regional Indicator Symbol Letters FO\",\"unified\":\"1F1EB-1F1F4\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":29,\"short_names\":[\"flag-fo\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,fo,regional,indicator,symbol,letters\"},\"motorway\":{\"name\":\"Motorway\",\"unified\":\"1F6E3\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":34,\"short_names\":[\"motorway\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"road\",\"cupertino\",\"interstate\",\"highway\"],\"search\":\"motorway,road,cupertino,interstate,highway\"},\"cactus\":{\"name\":\"Cactus\",\"unified\":\"1F335\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":31,\"short_names\":[\"cactus\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"vegetable\",\"plant\",\"nature\"],\"search\":\"cactus,vegetable,plant,nature\"},\"anger\":{\"name\":\"Anger Symbol\",\"unified\":\"1F4A2\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":9,\"short_names\":[\"anger\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"angry\",\"mad\"],\"search\":\"anger,symbol,angry,mad\"},\"crystal_ball\":{\"name\":\"Crystal Ball\",\"unified\":\"1F52E\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":30,\"short_names\":[\"crystal_ball\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"disco\",\"party\",\"magic\",\"circus\",\"fortune_teller\"],\"search\":\"crystal,ball,disco,party,magic,circus,fortune_teller\"},\"skull\":{\"name\":\"Skull\",\"unified\":\"1F480\",\"variations\":[],\"sheet_x\":18,\"sheet_y\":27,\"short_names\":[\"skull\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"dead\",\"skeleton\",\"creepy\"],\"search\":\"skull,dead,skeleton,creepy\"},\"hotsprings\":{\"name\":\"Hot Springs\",\"unified\":\"2668\",\"variations\":[\"2668-FE0F\"],\"sheet_x\":2,\"sheet_y\":1,\"short_names\":[\"hotsprings\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"bath\",\"warm\",\"relax\"],\"search\":\"hotsprings,hot,springs,bath,warm,relax\"},\"flag-fj\":{\"name\":\"Regional Indicator Symbol Letters FJ\",\"unified\":\"1F1EB-1F1EF\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":26,\"short_names\":[\"flag-fj\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,fj,regional,indicator,symbol,letters\"},\"prayer_beads\":{\"name\":\"Prayer Beads\",\"unified\":\"1F4FF\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":24,\"short_names\":[\"prayer_beads\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"dhikr\",\"religious\"],\"search\":\"prayer,beads,dhikr,religious\"},\"christmas_tree\":{\"name\":\"Christmas Tree\",\"unified\":\"1F384\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":28,\"short_names\":[\"christmas_tree\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"festival\",\"vacation\",\"december\",\"xmas\",\"celebration\"],\"search\":\"christmas,tree,festival,vacation,december,xmas,celebration\"},\"railway_track\":{\"name\":\"Railway Track\",\"unified\":\"1F6E4\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":35,\"short_names\":[\"railway_track\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"train\",\"transportation\"],\"search\":\"railway,track,train,transportation\"},\"flag-fi\":{\"name\":\"Regional Indicator Symbol Letters FI\",\"unified\":\"1F1EB-1F1EE\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":25,\"short_names\":[\"flag-fi\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,fi,regional,indicator,symbol,letters\"},\"barber\":{\"name\":\"Barber Pole\",\"unified\":\"1F488\",\"variations\":[],\"sheet_x\":19,\"sheet_y\":24,\"short_names\":[\"barber\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"hair\",\"salon\",\"style\"],\"search\":\"barber,pole,hair,salon,style\"},\"ghost\":{\"name\":\"Ghost\",\"unified\":\"1F47B\",\"variations\":[],\"sheet_x\":18,\"sheet_y\":17,\"short_names\":[\"ghost\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"halloween\",\"spooky\",\"scary\"],\"search\":\"ghost,halloween,spooky,scary\"},\"sunrise\":{\"name\":\"Sunrise\",\"unified\":\"1F305\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":26,\"short_names\":[\"sunrise\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"morning\",\"view\",\"vacation\",\"photo\"],\"search\":\"sunrise,morning,view,vacation,photo\"},\"evergreen_tree\":{\"name\":\"Evergreen Tree\",\"unified\":\"1F332\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":28,\"short_names\":[\"evergreen_tree\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"plant\",\"nature\"],\"search\":\"evergreen,tree,plant,nature\"},\"no_pedestrians\":{\"name\":\"No Pedestrians\",\"unified\":\"1F6B7\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":5,\"short_names\":[\"no_pedestrians\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"rules\",\"crossing\",\"walking\",\"circle\"],\"search\":\"no,pedestrians,rules,crossing,walking,circle\"},\"sunrise_over_mountains\":{\"name\":\"Sunrise over Mountains\",\"unified\":\"1F304\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":25,\"short_names\":[\"sunrise_over_mountains\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"view\",\"vacation\",\"photo\"],\"search\":\"sunrise,over,mountains,view,vacation,photo\"},\"alembic\":{\"name\":\"Alembic\",\"unified\":\"2697\",\"variations\":[],\"sheet_x\":2,\"sheet_y\":8,\"short_names\":[\"alembic\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"distilling\",\"science\",\"experiment\"],\"search\":\"alembic,distilling,science,experiment\"},\"alien\":{\"name\":\"Extraterrestrial Alien\",\"unified\":\"1F47D\",\"variations\":[],\"sheet_x\":18,\"sheet_y\":24,\"short_names\":[\"alien\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"UFO\",\"paul\",\"weird\",\"outer_space\"],\"search\":\"alien,extraterrestrial,ufo,paul,weird,outer_space\"},\"deciduous_tree\":{\"name\":\"Deciduous Tree\",\"unified\":\"1F333\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":29,\"short_names\":[\"deciduous_tree\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"plant\",\"nature\"],\"search\":\"deciduous,tree,plant,nature\"},\"do_not_litter\":{\"name\":\"Do Not Litter Symbol\",\"unified\":\"1F6AF\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":23,\"short_names\":[\"do_not_litter\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"trash\",\"bin\",\"garbage\",\"circle\"],\"search\":\"do,not,litter,symbol,trash,bin,garbage,circle\"},\"flag-fr\":{\"name\":\"Regional Indicator Symbol Letters FR\",\"unified\":\"1F1EB-1F1F7\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":30,\"short_names\":[\"flag-fr\",\"fr\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,fr,regional,indicator,symbol,letters\"},\"telescope\":{\"name\":\"Telescope\",\"unified\":\"1F52D\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":29,\"short_names\":[\"telescope\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"stars\",\"space\",\"zoom\"],\"search\":\"telescope,stars,space,zoom\"},\"palm_tree\":{\"name\":\"Palm Tree\",\"unified\":\"1F334\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":30,\"short_names\":[\"palm_tree\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"plant\",\"vegetable\",\"nature\",\"summer\",\"beach\"],\"search\":\"palm,tree,plant,vegetable,nature,summer,beach\"},\"no_bicycles\":{\"name\":\"No Bicycles\",\"unified\":\"1F6B3\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":27,\"short_names\":[\"no_bicycles\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"cyclist\",\"prohibited\",\"circle\"],\"search\":\"no,bicycles,cyclist,prohibited,circle\"},\"desert\":{\"name\":\"Desert\",\"unified\":\"1F3DC\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":13,\"short_names\":[\"desert\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"warm\",\"saharah\"],\"search\":\"desert,photo,warm,saharah\"},\"robot_face\":{\"name\":\"Robot Face\",\"unified\":\"1F916\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":7,\"short_names\":[\"robot_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"robot,face\"},\"flag-gf\":{\"name\":\"Regional Indicator Symbol Letters GF\",\"unified\":\"1F1EC-1F1EB\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":35,\"short_names\":[\"flag-gf\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,gf,regional,indicator,symbol,letters\"},\"non-potable_water\":{\"name\":\"Non-Potable Water Symbol\",\"unified\":\"1F6B1\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":25,\"short_names\":[\"non-potable_water\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"drink\",\"faucet\",\"tap\",\"circle\"],\"search\":\"non,potable,water,symbol,drink,faucet,tap,circle\"},\"beach_with_umbrella\":{\"name\":\"Beach with Umbrella\",\"unified\":\"1F3D6\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":7,\"short_names\":[\"beach_with_umbrella\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"weather\",\"summer\",\"sunny\",\"sand\"],\"search\":\"beach,with,umbrella,weather,summer,sunny,sand\"},\"microscope\":{\"name\":\"Microscope\",\"unified\":\"1F52C\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":28,\"short_names\":[\"microscope\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"laboratory\",\"experiment\",\"zoomin\",\"science\",\"study\"],\"search\":\"microscope,laboratory,experiment,zoomin,science,study\"},\"seedling\":{\"name\":\"Seedling\",\"unified\":\"1F331\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":27,\"short_names\":[\"seedling\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"plant\",\"nature\",\"grass\",\"lawn\",\"spring\"],\"search\":\"seedling,plant,nature,grass,lawn,spring\"},\"smiley_cat\":{\"name\":\"Smiling Cat Face with Open Mouth\",\"unified\":\"1F63A\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":32,\"short_names\":[\"smiley_cat\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"cats\",\"happy\"],\"search\":\"smiley,cat,smiling,face,with,open,mouth,animal,cats,happy\"},\"flag-pf\":{\"name\":\"Regional Indicator Symbol Letters PF\",\"unified\":\"1F1F5-1F1EB\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":8,\"short_names\":[\"flag-pf\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,pf,regional,indicator,symbol,letters\"},\"herb\":{\"name\":\"Herb\",\"unified\":\"1F33F\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":0,\"short_names\":[\"herb\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"vegetable\",\"plant\",\"medicine\",\"weed\",\"grass\",\"lawn\"],\"search\":\"herb,vegetable,plant,medicine,weed,grass,lawn\"},\"underage\":{\"name\":\"No One Under Eighteen Symbol\",\"unified\":\"1F51E\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":14,\"short_names\":[\"underage\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"18\",\"drink\",\"pub\",\"night\",\"minor\",\"circle\"],\"search\":\"underage,no,one,under,eighteen,symbol,18,drink,pub,night,minor,circle\"},\"hole\":{\"name\":\"Hole\",\"unified\":\"1F573\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":37,\"short_names\":[\"hole\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"embarrassing\"],\"search\":\"hole,embarrassing\"},\"flag-tf\":{\"name\":\"Regional Indicator Symbol Letters TF\",\"unified\":\"1F1F9-1F1EB\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":9,\"short_names\":[\"flag-tf\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,tf,regional,indicator,symbol,letters\"},\"desert_island\":{\"name\":\"Desert Island\",\"unified\":\"1F3DD\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":14,\"short_names\":[\"desert_island\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"tropical\"],\"search\":\"desert,island,photo,tropical\"},\"smile_cat\":{\"name\":\"Grinning Cat Face with Smiling Eyes\",\"unified\":\"1F638\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":30,\"short_names\":[\"smile_cat\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"cats\"],\"search\":\"smile,cat,grinning,face,with,smiling,eyes,animal,cats\"},\"pill\":{\"name\":\"Pill\",\"unified\":\"1F48A\",\"variations\":[],\"sheet_x\":19,\"sheet_y\":26,\"short_names\":[\"pill\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"health\",\"medicine\",\"doctor\",\"pharmacy\",\"drug\"],\"search\":\"pill,health,medicine,doctor,pharmacy,drug\"},\"shamrock\":{\"name\":\"Shamrock\",\"unified\":\"2618\",\"variations\":[],\"sheet_x\":1,\"sheet_y\":9,\"short_names\":[\"shamrock\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"vegetable\",\"plant\",\"nature\",\"irish\"],\"search\":\"shamrock,vegetable,plant,nature,irish\"},\"flag-ga\":{\"name\":\"Regional Indicator Symbol Letters GA\",\"unified\":\"1F1EC-1F1E6\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":31,\"short_names\":[\"flag-ga\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ga,regional,indicator,symbol,letters\"},\"city_sunrise\":{\"name\":\"Sunset over Buildings\",\"unified\":\"1F307\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":28,\"short_names\":[\"city_sunrise\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"good morning\",\"dawn\"],\"search\":\"city,sunrise,sunset,over,buildings,photo,good morning,dawn\"},\"joy_cat\":{\"name\":\"Cat Face with Tears of Joy\",\"unified\":\"1F639\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":31,\"short_names\":[\"joy_cat\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"cats\",\"haha\",\"happy\",\"tears\"],\"search\":\"joy,cat,face,with,tears,of,animal,cats,haha,happy\"},\"no_mobile_phones\":{\"name\":\"No Mobile Phones\",\"unified\":\"1F4F5\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":15,\"short_names\":[\"no_mobile_phones\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"iphone\",\"mute\",\"circle\"],\"search\":\"no,mobile,phones,iphone,mute,circle\"},\"heart_eyes_cat\":{\"name\":\"Smiling Cat Face with Heart-Shaped Eyes\",\"unified\":\"1F63B\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":33,\"short_names\":[\"heart_eyes_cat\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"love\",\"like\",\"affection\",\"cats\",\"valentines\"],\"search\":\"heart,eyes,cat,smiling,face,with,shaped,animal,love,like,affection,cats,valentines\"},\"syringe\":{\"name\":\"Syringe\",\"unified\":\"1F489\",\"variations\":[],\"sheet_x\":19,\"sheet_y\":25,\"short_names\":[\"syringe\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"health\",\"hospital\",\"drugs\",\"blood\",\"medicine\",\"needle\",\"doctor\",\"nurse\"],\"search\":\"syringe,health,hospital,drugs,blood,medicine,needle,doctor,nurse\"},\"exclamation\":{\"name\":\"Heavy Exclamation Mark Symbol\",\"unified\":\"2757\",\"variations\":[\"2757-FE0F\"],\"sheet_x\":4,\"sheet_y\":8,\"short_names\":[\"exclamation\",\"heavy_exclamation_mark\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"heavy_exclamation_mark\",\"danger\",\"surprise\",\"punctuation\",\"wow\",\"warning\"],\"search\":\"exclamation,heavy,mark,symbol,heavy_exclamation_mark,danger,surprise,punctuation,wow,warning\"},\"city_sunset\":{\"name\":\"Cityscape at Dusk\",\"unified\":\"1F306\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":27,\"short_names\":[\"city_sunset\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"evening\",\"sky\",\"buildings\"],\"search\":\"city,sunset,cityscape,at,dusk,photo,evening,sky,buildings\"},\"flag-gm\":{\"name\":\"Regional Indicator Symbol Letters GM\",\"unified\":\"1F1EC-1F1F2\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":40,\"short_names\":[\"flag-gm\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,gm,regional,indicator,symbol,letters\"},\"four_leaf_clover\":{\"name\":\"Four Leaf Clover\",\"unified\":\"1F340\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":1,\"short_names\":[\"four_leaf_clover\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"vegetable\",\"plant\",\"nature\",\"lucky\",\"irish\"],\"search\":\"four,leaf,clover,vegetable,plant,nature,lucky,irish\"},\"grey_exclamation\":{\"name\":\"White Exclamation Mark Ornament\",\"unified\":\"2755\",\"variations\":[],\"sheet_x\":4,\"sheet_y\":7,\"short_names\":[\"grey_exclamation\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"surprise\",\"punctuation\",\"gray\",\"wow\",\"warning\"],\"search\":\"grey,exclamation,white,mark,ornament,surprise,punctuation,gray,wow,warning\"},\"smirk_cat\":{\"name\":\"Cat Face with Wry Smile\",\"unified\":\"1F63C\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":34,\"short_names\":[\"smirk_cat\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"cats\"],\"search\":\"smirk,cat,face,with,wry,smile,animal,cats\"},\"thermometer\":{\"name\":\"Thermometer\",\"unified\":\"1F321\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":13,\"short_names\":[\"thermometer\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"weather\",\"temperature\",\"hot\",\"cold\"],\"search\":\"thermometer,weather,temperature,hot,cold\"},\"cityscape\":{\"name\":\"Cityscape\",\"unified\":\"1F3D9\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":10,\"short_names\":[\"cityscape\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"night life\",\"urban\"],\"search\":\"cityscape,photo,night life,urban\"},\"flag-ge\":{\"name\":\"Regional Indicator Symbol Letters GE\",\"unified\":\"1F1EC-1F1EA\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":34,\"short_names\":[\"flag-ge\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ge,regional,indicator,symbol,letters\"},\"bamboo\":{\"name\":\"Pine Decoration\",\"unified\":\"1F38D\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":1,\"short_names\":[\"bamboo\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"plant\",\"nature\",\"vegetable\",\"panda\",\"pine_decoration\"],\"search\":\"bamboo,pine,decoration,plant,nature,vegetable,panda,pine_decoration\"},\"flag-de\":{\"name\":\"Regional Indicator Symbol Letters DE\",\"unified\":\"1F1E9-1F1EA\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":9,\"short_names\":[\"flag-de\",\"de\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,de,regional,indicator,symbol,letters\"},\"night_with_stars\":{\"name\":\"Night with Stars\",\"unified\":\"1F303\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":24,\"short_names\":[\"night_with_stars\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"evening\",\"city\",\"downtown\"],\"search\":\"night,with,stars,evening,city,downtown\"},\"kissing_cat\":{\"name\":\"Kissing Cat Face with Closed Eyes\",\"unified\":\"1F63D\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":35,\"short_names\":[\"kissing_cat\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"cats\"],\"search\":\"kissing,cat,face,with,closed,eyes,animal,cats\"},\"tanabata_tree\":{\"name\":\"Tanabata Tree\",\"unified\":\"1F38B\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":40,\"short_names\":[\"tanabata_tree\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"plant\",\"nature\",\"branch\",\"summer\"],\"search\":\"tanabata,tree,plant,nature,branch,summer\"},\"label\":{\"name\":\"Label\",\"unified\":\"1F3F7\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":37,\"short_names\":[\"label\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sale\",\"tag\"],\"search\":\"label,sale,tag\"},\"question\":{\"name\":\"Black Question Mark Ornament\",\"unified\":\"2753\",\"variations\":[],\"sheet_x\":4,\"sheet_y\":5,\"short_names\":[\"question\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"doubt\",\"confused\"],\"search\":\"question,black,mark,ornament,doubt,confused\"},\"leaves\":{\"name\":\"Leaf Fluttering in Wind\",\"unified\":\"1F343\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":4,\"short_names\":[\"leaves\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"plant\",\"tree\",\"vegetable\",\"grass\",\"lawn\",\"spring\"],\"search\":\"leaves,leaf,fluttering,in,wind,nature,plant,tree,vegetable,grass,lawn,spring\"},\"grey_question\":{\"name\":\"White Question Mark Ornament\",\"unified\":\"2754\",\"variations\":[],\"sheet_x\":4,\"sheet_y\":6,\"short_names\":[\"grey_question\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"doubts\",\"gray\",\"huh\",\"confused\"],\"search\":\"grey,question,white,mark,ornament,doubts,gray,huh,confused\"},\"scream_cat\":{\"name\":\"Weary Cat Face\",\"unified\":\"1F640\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":38,\"short_names\":[\"scream_cat\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"cats\",\"munch\",\"scared\"],\"search\":\"scream,cat,weary,face,animal,cats,munch,scared\"},\"bookmark\":{\"name\":\"Bookmark\",\"unified\":\"1F516\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":6,\"short_names\":[\"bookmark\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"favorite\",\"label\",\"save\"],\"search\":\"bookmark,favorite,label,save\"},\"bridge_at_night\":{\"name\":\"Bridge at Night\",\"unified\":\"1F309\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":30,\"short_names\":[\"bridge_at_night\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"sanfrancisco\"],\"search\":\"bridge,at,night,photo,sanfrancisco\"},\"flag-gh\":{\"name\":\"Regional Indicator Symbol Letters GH\",\"unified\":\"1F1EC-1F1ED\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":37,\"short_names\":[\"flag-gh\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,gh,regional,indicator,symbol,letters\"},\"milky_way\":{\"name\":\"Milky Way\",\"unified\":\"1F30C\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":33,\"short_names\":[\"milky_way\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"space\",\"stars\"],\"search\":\"milky,way,photo,space,stars\"},\"toilet\":{\"name\":\"Toilet\",\"unified\":\"1F6BD\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":11,\"short_names\":[\"toilet\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"restroom\",\"wc\",\"washroom\",\"bathroom\",\"potty\"],\"search\":\"toilet,restroom,wc,washroom,bathroom,potty\"},\"crying_cat_face\":{\"name\":\"Crying Cat Face\",\"unified\":\"1F63F\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":37,\"short_names\":[\"crying_cat_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"tears\",\"weep\",\"sad\",\"cats\",\"upset\"],\"search\":\"crying,cat,face,animal,tears,weep,sad,cats,upset\"},\"bangbang\":{\"name\":\"Double Exclamation Mark\",\"unified\":\"203C\",\"variations\":[\"203C-FE0F\"],\"sheet_x\":0,\"sheet_y\":2,\"short_names\":[\"bangbang\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"exclamation\",\"surprise\"],\"search\":\"bangbang,double,exclamation,mark,surprise\"},\"fallen_leaf\":{\"name\":\"Fallen Leaf\",\"unified\":\"1F342\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":3,\"short_names\":[\"fallen_leaf\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"plant\",\"vegetable\",\"leaves\"],\"search\":\"fallen,leaf,nature,plant,vegetable,leaves\"},\"flag-gi\":{\"name\":\"Regional Indicator Symbol Letters GI\",\"unified\":\"1F1EC-1F1EE\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":38,\"short_names\":[\"flag-gi\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,gi,regional,indicator,symbol,letters\"},\"pouting_cat\":{\"name\":\"Pouting Cat Face\",\"unified\":\"1F63E\",\"variations\":[],\"sheet_x\":27,\"sheet_y\":36,\"short_names\":[\"pouting_cat\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"cats\"],\"search\":\"pouting,cat,face,animal,cats\"},\"maple_leaf\":{\"name\":\"Maple Leaf\",\"unified\":\"1F341\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":2,\"short_names\":[\"maple_leaf\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"plant\",\"vegetable\",\"canada\",\"fall\"],\"search\":\"maple,leaf,nature,plant,vegetable,canada,fall\"},\"flag-gr\":{\"name\":\"Regional Indicator Symbol Letters GR\",\"unified\":\"1F1EC-1F1F7\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":3,\"short_names\":[\"flag-gr\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,gr,regional,indicator,symbol,letters\"},\"interrobang\":{\"name\":\"Exclamation Question Mark\",\"unified\":\"2049\",\"variations\":[\"2049-FE0F\"],\"sheet_x\":0,\"sheet_y\":3,\"short_names\":[\"interrobang\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"wat\",\"punctuation\",\"surprise\"],\"search\":\"interrobang,exclamation,question,mark,wat,punctuation,surprise\"},\"stars\":{\"name\":\"Shooting Star\",\"unified\":\"1F320\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":12,\"short_names\":[\"stars\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"night\",\"photo\"],\"search\":\"stars,shooting,star,night,photo\"},\"shower\":{\"name\":\"Shower\",\"unified\":\"1F6BF\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":13,\"short_names\":[\"shower\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"clean\",\"water\",\"bathroom\"],\"search\":\"shower,clean,water,bathroom\"},\"raised_hands\":{\"name\":\"Person Raising Both Hands in Celebration\",\"unified\":\"1F64C\",\"variations\":[],\"sheet_x\":28,\"sheet_y\":29,\"short_names\":[\"raised_hands\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F64C-1F3FB\":{\"unified\":\"1F64C-1F3FB\",\"image\":\"1f64c-1f3fb.png\",\"sheet_x\":28,\"sheet_y\":30,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F64C-1F3FC\":{\"unified\":\"1F64C-1F3FC\",\"image\":\"1f64c-1f3fc.png\",\"sheet_x\":28,\"sheet_y\":31,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F64C-1F3FD\":{\"unified\":\"1F64C-1F3FD\",\"image\":\"1f64c-1f3fd.png\",\"sheet_x\":28,\"sheet_y\":32,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F64C-1F3FE\":{\"unified\":\"1F64C-1F3FE\",\"image\":\"1f64c-1f3fe.png\",\"sheet_x\":28,\"sheet_y\":33,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F64C-1F3FF\":{\"unified\":\"1F64C-1F3FF\",\"image\":\"1f64c-1f3ff.png\",\"sheet_x\":28,\"sheet_y\":34,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"gesture\",\"hooray\",\"yea\",\"celebration\"],\"search\":\"raised,hands,person,raising,both,in,celebration,gesture,hooray,yea\"},\"flag-gl\":{\"name\":\"Regional Indicator Symbol Letters GL\",\"unified\":\"1F1EC-1F1F1\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":39,\"short_names\":[\"flag-gl\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,gl,regional,indicator,symbol,letters\"},\"ear_of_rice\":{\"name\":\"Ear of Rice\",\"unified\":\"1F33E\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":40,\"short_names\":[\"ear_of_rice\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"plant\"],\"search\":\"ear,of,rice,nature,plant\"},\"sparkler\":{\"name\":\"Firework Sparkler\",\"unified\":\"1F387\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":36,\"short_names\":[\"sparkler\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"stars\",\"night\",\"shine\"],\"search\":\"sparkler,firework,stars,night,shine\"},\"bathtub\":{\"name\":\"Bathtub\",\"unified\":\"1F6C1\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":20,\"short_names\":[\"bathtub\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"clean\",\"shower\",\"bathroom\"],\"search\":\"bathtub,clean,shower,bathroom\"},\"hibiscus\":{\"name\":\"Hibiscus\",\"unified\":\"1F33A\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":36,\"short_names\":[\"hibiscus\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"plant\",\"vegetable\",\"flowers\",\"beach\"],\"search\":\"hibiscus,plant,vegetable,flowers,beach\"},\"flag-gd\":{\"name\":\"Regional Indicator Symbol Letters GD\",\"unified\":\"1F1EC-1F1E9\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":33,\"short_names\":[\"flag-gd\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,gd,regional,indicator,symbol,letters\"},\"key\":{\"name\":\"Key\",\"unified\":\"1F511\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":1,\"short_names\":[\"key\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"lock\",\"door\",\"password\"],\"search\":\"key,lock,door,password\"},\"low_brightness\":{\"name\":\"Low Brightness Symbol\",\"unified\":\"1F505\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":30,\"short_names\":[\"low_brightness\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sun\",\"afternoon\",\"warm\",\"summer\"],\"search\":\"low,brightness,symbol,sun,afternoon,warm,summer\"},\"fireworks\":{\"name\":\"Fireworks\",\"unified\":\"1F386\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":35,\"short_names\":[\"fireworks\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"festival\",\"carnival\",\"congratulations\"],\"search\":\"fireworks,photo,festival,carnival,congratulations\"},\"clap\":{\"name\":\"Clapping Hands Sign\",\"unified\":\"1F44F\",\"variations\":[],\"sheet_x\":15,\"sheet_y\":16,\"short_names\":[\"clap\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F44F-1F3FB\":{\"unified\":\"1F44F-1F3FB\",\"image\":\"1f44f-1f3fb.png\",\"sheet_x\":15,\"sheet_y\":17,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44F-1F3FC\":{\"unified\":\"1F44F-1F3FC\",\"image\":\"1f44f-1f3fc.png\",\"sheet_x\":15,\"sheet_y\":18,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44F-1F3FD\":{\"unified\":\"1F44F-1F3FD\",\"image\":\"1f44f-1f3fd.png\",\"sheet_x\":15,\"sheet_y\":19,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44F-1F3FE\":{\"unified\":\"1F44F-1F3FE\",\"image\":\"1f44f-1f3fe.png\",\"sheet_x\":15,\"sheet_y\":20,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44F-1F3FF\":{\"unified\":\"1F44F-1F3FF\",\"image\":\"1f44f-1f3ff.png\",\"sheet_x\":15,\"sheet_y\":21,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"hands\",\"praise\",\"applause\",\"congrats\",\"yay\"],\"search\":\"clap,clapping,hands,sign,praise,applause,congrats,yay\"},\"flag-gp\":{\"name\":\"Regional Indicator Symbol Letters GP\",\"unified\":\"1F1EC-1F1F5\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":1,\"short_names\":[\"flag-gp\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,gp,regional,indicator,symbol,letters\"},\"old_key\":{\"name\":\"Old Key\",\"unified\":\"1F5DD\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":2,\"short_names\":[\"old_key\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"lock\",\"door\",\"password\"],\"search\":\"old,key,lock,door,password\"},\"high_brightness\":{\"name\":\"High Brightness Symbol\",\"unified\":\"1F506\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":31,\"short_names\":[\"high_brightness\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sun\",\"light\"],\"search\":\"high,brightness,symbol,sun,light\"},\"rainbow\":{\"name\":\"Rainbow\",\"unified\":\"1F308\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":29,\"short_names\":[\"rainbow\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"happy\",\"unicorn\",\"photo\",\"sky\",\"spring\"],\"search\":\"rainbow,nature,happy,unicorn,photo,sky,spring\"},\"wave\":{\"name\":\"Waving Hand Sign\",\"unified\":\"1F44B\",\"variations\":[],\"sheet_x\":14,\"sheet_y\":33,\"short_names\":[\"wave\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F44B-1F3FB\":{\"unified\":\"1F44B-1F3FB\",\"image\":\"1f44b-1f3fb.png\",\"sheet_x\":14,\"sheet_y\":34,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44B-1F3FC\":{\"unified\":\"1F44B-1F3FC\",\"image\":\"1f44b-1f3fc.png\",\"sheet_x\":14,\"sheet_y\":35,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44B-1F3FD\":{\"unified\":\"1F44B-1F3FD\",\"image\":\"1f44b-1f3fd.png\",\"sheet_x\":14,\"sheet_y\":36,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44B-1F3FE\":{\"unified\":\"1F44B-1F3FE\",\"image\":\"1f44b-1f3fe.png\",\"sheet_x\":14,\"sheet_y\":37,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44B-1F3FF\":{\"unified\":\"1F44B-1F3FF\",\"image\":\"1f44b-1f3ff.png\",\"sheet_x\":14,\"sheet_y\":38,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"hands\",\"gesture\",\"goodbye\",\"solong\",\"farewell\",\"hello\",\"palm\"],\"search\":\"wave,waving,hand,sign,hands,gesture,goodbye,solong,farewell,hello,palm\"},\"sunflower\":{\"name\":\"Sunflower\",\"unified\":\"1F33B\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":37,\"short_names\":[\"sunflower\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"plant\",\"fall\"],\"search\":\"sunflower,nature,plant,fall\"},\"+1\":{\"name\":\"Thumbs Up Sign\",\"unified\":\"1F44D\",\"variations\":[],\"sheet_x\":15,\"sheet_y\":4,\"short_names\":[\"+1\",\"thumbsup\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F44D-1F3FB\":{\"unified\":\"1F44D-1F3FB\",\"image\":\"1f44d-1f3fb.png\",\"sheet_x\":15,\"sheet_y\":5,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44D-1F3FC\":{\"unified\":\"1F44D-1F3FC\",\"image\":\"1f44d-1f3fc.png\",\"sheet_x\":15,\"sheet_y\":6,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44D-1F3FD\":{\"unified\":\"1F44D-1F3FD\",\"image\":\"1f44d-1f3fd.png\",\"sheet_x\":15,\"sheet_y\":7,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44D-1F3FE\":{\"unified\":\"1F44D-1F3FE\",\"image\":\"1f44d-1f3fe.png\",\"sheet_x\":15,\"sheet_y\":8,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44D-1F3FF\":{\"unified\":\"1F44D-1F3FF\",\"image\":\"1f44d-1f3ff.png\",\"sheet_x\":15,\"sheet_y\":9,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"thumbsup\",\"yes\",\"awesome\",\"good\",\"agree\",\"accept\",\"cool\",\"hand\",\"like\"],\"search\":\"+1,thumbsup,thumbs,up,sign,yes,awesome,good,agree,accept,cool,hand,like\"},\"couch_and_lamp\":{\"name\":\"Couch and Lamp\",\"unified\":\"1F6CB\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":25,\"short_names\":[\"couch_and_lamp\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"read\",\"chill\"],\"search\":\"couch,and,lamp,read,chill\"},\"house_buildings\":{\"name\":\"House Buildings\",\"unified\":\"1F3D8\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":9,\"short_names\":[\"house_buildings\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"house,buildings\"},\"rose\":{\"name\":\"Rose\",\"unified\":\"1F339\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":35,\"short_names\":[\"rose\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"flowers\",\"valentines\",\"love\",\"spring\"],\"search\":\"rose,flowers,valentines,love,spring\"},\"trident\":{\"name\":\"Trident Emblem\",\"unified\":\"1F531\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":33,\"short_names\":[\"trident\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"weapon\",\"spear\"],\"search\":\"trident,emblem,weapon,spear\"},\"flag-gu\":{\"name\":\"Regional Indicator Symbol Letters GU\",\"unified\":\"1F1EC-1F1FA\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":6,\"short_names\":[\"flag-gu\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,gu,regional,indicator,symbol,letters\"},\"european_castle\":{\"name\":\"European Castle\",\"unified\":\"1F3F0\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":33,\"short_names\":[\"european_castle\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"building\",\"royalty\",\"history\"],\"search\":\"european,castle,building,royalty,history\"},\"-1\":{\"name\":\"Thumbs Down Sign\",\"unified\":\"1F44E\",\"variations\":[],\"sheet_x\":15,\"sheet_y\":10,\"short_names\":[\"-1\",\"thumbsdown\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F44E-1F3FB\":{\"unified\":\"1F44E-1F3FB\",\"image\":\"1f44e-1f3fb.png\",\"sheet_x\":15,\"sheet_y\":11,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44E-1F3FC\":{\"unified\":\"1F44E-1F3FC\",\"image\":\"1f44e-1f3fc.png\",\"sheet_x\":15,\"sheet_y\":12,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44E-1F3FD\":{\"unified\":\"1F44E-1F3FD\",\"image\":\"1f44e-1f3fd.png\",\"sheet_x\":15,\"sheet_y\":13,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44E-1F3FE\":{\"unified\":\"1F44E-1F3FE\",\"image\":\"1f44e-1f3fe.png\",\"sheet_x\":15,\"sheet_y\":14,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44E-1F3FF\":{\"unified\":\"1F44E-1F3FF\",\"image\":\"1f44e-1f3ff.png\",\"sheet_x\":15,\"sheet_y\":15,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"thumbsdown\",\"no\",\"dislike\",\"hand\"],\"search\":\",1,thumbsdown,thumbs,down,sign,no,dislike,hand\"},\"fleur_de_lis\":{\"name\":\"Fleur-De-Lis\",\"unified\":\"269C\",\"variations\":[],\"sheet_x\":2,\"sheet_y\":11,\"short_names\":[\"fleur_de_lis\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"decorative\",\"scout\"],\"search\":\"fleur,de,lis,decorative,scout\"},\"tulip\":{\"name\":\"Tulip\",\"unified\":\"1F337\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":33,\"short_names\":[\"tulip\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"flowers\",\"plant\",\"nature\",\"summer\",\"spring\"],\"search\":\"tulip,flowers,plant,nature,summer,spring\"},\"sleeping_accommodation\":{\"name\":\"Sleeping Accommodation\",\"unified\":\"1F6CC\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":26,\"short_names\":[\"sleeping_accommodation\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"bed\",\"rest\"],\"search\":\"sleeping,accommodation,bed,rest\"},\"flag-gt\":{\"name\":\"Regional Indicator Symbol Letters GT\",\"unified\":\"1F1EC-1F1F9\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":5,\"short_names\":[\"flag-gt\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,gt,regional,indicator,symbol,letters\"},\"part_alternation_mark\":{\"name\":\"Part Alternation Mark\",\"unified\":\"303D\",\"variations\":[\"303D-FE0F\"],\"sheet_x\":4,\"sheet_y\":27,\"short_names\":[\"part_alternation_mark\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"graph\",\"presentation\",\"stats\",\"business\",\"economics\",\"bad\"],\"search\":\"part,alternation,mark,graph,presentation,stats,business,economics,bad\"},\"blossom\":{\"name\":\"Blossom\",\"unified\":\"1F33C\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":38,\"short_names\":[\"blossom\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"flowers\",\"yellow\"],\"search\":\"blossom,nature,flowers,yellow\"},\"bed\":{\"name\":\"Bed\",\"unified\":\"1F6CF\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":29,\"short_names\":[\"bed\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sleep\",\"rest\"],\"search\":\"bed,sleep,rest\"},\"flag-gg\":{\"name\":\"Regional Indicator Symbol Letters GG\",\"unified\":\"1F1EC-1F1EC\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":36,\"short_names\":[\"flag-gg\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,gg,regional,indicator,symbol,letters\"},\"japanese_castle\":{\"name\":\"Japanese Castle\",\"unified\":\"1F3EF\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":32,\"short_names\":[\"japanese_castle\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"building\"],\"search\":\"japanese,castle,photo,building\"},\"facepunch\":{\"name\":\"Fisted Hand Sign\",\"unified\":\"1F44A\",\"variations\":[],\"sheet_x\":14,\"sheet_y\":27,\"short_names\":[\"facepunch\",\"punch\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F44A-1F3FB\":{\"unified\":\"1F44A-1F3FB\",\"image\":\"1f44a-1f3fb.png\",\"sheet_x\":14,\"sheet_y\":28,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44A-1F3FC\":{\"unified\":\"1F44A-1F3FC\",\"image\":\"1f44a-1f3fc.png\",\"sheet_x\":14,\"sheet_y\":29,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44A-1F3FD\":{\"unified\":\"1F44A-1F3FD\",\"image\":\"1f44a-1f3fd.png\",\"sheet_x\":14,\"sheet_y\":30,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44A-1F3FE\":{\"unified\":\"1F44A-1F3FE\",\"image\":\"1f44a-1f3fe.png\",\"sheet_x\":14,\"sheet_y\":31,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44A-1F3FF\":{\"unified\":\"1F44A-1F3FF\",\"image\":\"1f44a-1f3ff.png\",\"sheet_x\":14,\"sheet_y\":32,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"angry\",\"violence\",\"fist\",\"hit\",\"attack\",\"hand\"],\"search\":\"facepunch,punch,fisted,hand,sign,angry,violence,fist,hit,attack\"},\"stadium\":{\"name\":\"Stadium\",\"unified\":\"1F3DF\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":16,\"short_names\":[\"stadium\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photo\",\"place\",\"sports\",\"concert\",\"venue\"],\"search\":\"stadium,photo,place,sports,concert,venue\"},\"flag-gn\":{\"name\":\"Regional Indicator Symbol Letters GN\",\"unified\":\"1F1EC-1F1F3\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":0,\"short_names\":[\"flag-gn\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,gn,regional,indicator,symbol,letters\"},\"warning\":{\"name\":\"Warning Sign\",\"unified\":\"26A0\",\"variations\":[\"26A0-FE0F\"],\"sheet_x\":2,\"sheet_y\":12,\"short_names\":[\"warning\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"exclamation\",\"wip\",\"alert\",\"error\",\"problem\",\"issue\"],\"search\":\"warning,sign,exclamation,wip,alert,error,problem,issue\"},\"door\":{\"name\":\"Door\",\"unified\":\"1F6AA\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":18,\"short_names\":[\"door\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"house\",\"entry\",\"exit\"],\"search\":\"door,house,entry,exit\"},\"cherry_blossom\":{\"name\":\"Cherry Blossom\",\"unified\":\"1F338\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":34,\"short_names\":[\"cherry_blossom\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"plant\",\"spring\",\"flower\"],\"search\":\"cherry,blossom,nature,plant,spring,flower\"},\"fist\":{\"name\":\"Raised Fist\",\"unified\":\"270A\",\"variations\":[],\"sheet_x\":3,\"sheet_y\":9,\"short_names\":[\"fist\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"270A-1F3FB\":{\"unified\":\"270A-1F3FB\",\"image\":\"270a-1f3fb.png\",\"sheet_x\":3,\"sheet_y\":10,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"270A-1F3FC\":{\"unified\":\"270A-1F3FC\",\"image\":\"270a-1f3fc.png\",\"sheet_x\":3,\"sheet_y\":11,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"270A-1F3FD\":{\"unified\":\"270A-1F3FD\",\"image\":\"270a-1f3fd.png\",\"sheet_x\":3,\"sheet_y\":12,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"270A-1F3FE\":{\"unified\":\"270A-1F3FE\",\"image\":\"270a-1f3fe.png\",\"sheet_x\":3,\"sheet_y\":13,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"270A-1F3FF\":{\"unified\":\"270A-1F3FF\",\"image\":\"270a-1f3ff.png\",\"sheet_x\":3,\"sheet_y\":14,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"fingers\",\"hand\",\"grasp\"],\"search\":\"fist,raised,fingers,hand,grasp\"},\"statue_of_liberty\":{\"name\":\"Statue of Liberty\",\"unified\":\"1F5FD\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":12,\"short_names\":[\"statue_of_liberty\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"american\",\"newyork\"],\"search\":\"statue,of,liberty,american,newyork\"},\"v\":{\"name\":\"Victory Hand\",\"unified\":\"270C\",\"variations\":[\"270C-FE0F\"],\"sheet_x\":3,\"sheet_y\":21,\"short_names\":[\"v\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"270C-1F3FB\":{\"unified\":\"270C-1F3FB\",\"image\":\"270c-1f3fb.png\",\"sheet_x\":3,\"sheet_y\":22,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"270C-1F3FC\":{\"unified\":\"270C-1F3FC\",\"image\":\"270c-1f3fc.png\",\"sheet_x\":3,\"sheet_y\":23,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"270C-1F3FD\":{\"unified\":\"270C-1F3FD\",\"image\":\"270c-1f3fd.png\",\"sheet_x\":3,\"sheet_y\":24,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"270C-1F3FE\":{\"unified\":\"270C-1F3FE\",\"image\":\"270c-1f3fe.png\",\"sheet_x\":3,\"sheet_y\":25,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"270C-1F3FF\":{\"unified\":\"270C-1F3FF\",\"image\":\"270c-1f3ff.png\",\"sheet_x\":3,\"sheet_y\":26,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"fingers\",\"ohyeah\",\"hand\",\"peace\",\"victory\",\"two\"],\"search\":\"v,victory,hand,fingers,ohyeah,peace,two\"},\"children_crossing\":{\"name\":\"Children Crossing\",\"unified\":\"1F6B8\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":6,\"short_names\":[\"children_crossing\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"school\",\"warning\",\"danger\",\"sign\",\"driving\",\"yellow-diamond\"],\"search\":\"children,crossing,school,warning,danger,sign,driving,yellow-diamond\"},\"bouquet\":{\"name\":\"Bouquet\",\"unified\":\"1F490\",\"variations\":[],\"sheet_x\":19,\"sheet_y\":32,\"short_names\":[\"bouquet\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"flowers\",\"nature\",\"spring\"],\"search\":\"bouquet,flowers,nature,spring\"},\"bellhop_bell\":{\"name\":\"Bellhop Bell\",\"unified\":\"1F6CE\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":28,\"short_names\":[\"bellhop_bell\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"service\"],\"search\":\"bellhop,bell,service\"},\"flag-gw\":{\"name\":\"Regional Indicator Symbol Letters GW\",\"unified\":\"1F1EC-1F1FC\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":7,\"short_names\":[\"flag-gw\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,gw,regional,indicator,symbol,letters\"},\"beginner\":{\"name\":\"Japanese Symbol for Beginner\",\"unified\":\"1F530\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":32,\"short_names\":[\"beginner\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"badge\",\"shield\"],\"search\":\"beginner,japanese,symbol,for,badge,shield\"},\"house\":{\"name\":\"House Building\",\"unified\":\"1F3E0\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":17,\"short_names\":[\"house\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"building\",\"home\"],\"search\":\"house,building,home\"},\"mushroom\":{\"name\":\"Mushroom\",\"unified\":\"1F344\",\"variations\":[],\"sheet_x\":7,\"sheet_y\":5,\"short_names\":[\"mushroom\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"plant\",\"vegetable\"],\"search\":\"mushroom,plant,vegetable\"},\"frame_with_picture\":{\"name\":\"Frame with Picture\",\"unified\":\"1F5BC\",\"variations\":[],\"sheet_x\":25,\"sheet_y\":35,\"short_names\":[\"frame_with_picture\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"photography\"],\"search\":\"frame,with,picture,photography\"},\"ok_hand\":{\"name\":\"Ok Hand Sign\",\"unified\":\"1F44C\",\"variations\":[],\"sheet_x\":14,\"sheet_y\":39,\"short_names\":[\"ok_hand\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F44C-1F3FB\":{\"unified\":\"1F44C-1F3FB\",\"image\":\"1f44c-1f3fb.png\",\"sheet_x\":14,\"sheet_y\":40,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44C-1F3FC\":{\"unified\":\"1F44C-1F3FC\",\"image\":\"1f44c-1f3fc.png\",\"sheet_x\":15,\"sheet_y\":0,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44C-1F3FD\":{\"unified\":\"1F44C-1F3FD\",\"image\":\"1f44c-1f3fd.png\",\"sheet_x\":15,\"sheet_y\":1,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44C-1F3FE\":{\"unified\":\"1F44C-1F3FE\",\"image\":\"1f44c-1f3fe.png\",\"sheet_x\":15,\"sheet_y\":2,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F44C-1F3FF\":{\"unified\":\"1F44C-1F3FF\",\"image\":\"1f44c-1f3ff.png\",\"sheet_x\":15,\"sheet_y\":3,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"fingers\",\"limbs\",\"perfect\"],\"search\":\"ok,hand,sign,fingers,limbs,perfect\"},\"flag-gy\":{\"name\":\"Regional Indicator Symbol Letters GY\",\"unified\":\"1F1EC-1F1FE\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":8,\"short_names\":[\"flag-gy\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,gy,regional,indicator,symbol,letters\"},\"flag-ht\":{\"name\":\"Regional Indicator Symbol Letters HT\",\"unified\":\"1F1ED-1F1F9\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":13,\"short_names\":[\"flag-ht\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ht,regional,indicator,symbol,letters\"},\"house_with_garden\":{\"name\":\"House with Garden\",\"unified\":\"1F3E1\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":18,\"short_names\":[\"house_with_garden\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"home\",\"plant\",\"nature\"],\"search\":\"house,with,garden,home,plant,nature\"},\"world_map\":{\"name\":\"World Map\",\"unified\":\"1F5FA\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":9,\"short_names\":[\"world_map\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"location\",\"direction\"],\"search\":\"world,map,location,direction\"},\"chestnut\":{\"name\":\"Chestnut\",\"unified\":\"1F330\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":26,\"short_names\":[\"chestnut\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"food\",\"squirrel\"],\"search\":\"chestnut,food,squirrel\"},\"hand\":{\"name\":\"Raised Hand\",\"unified\":\"270B\",\"variations\":[],\"sheet_x\":3,\"sheet_y\":15,\"short_names\":[\"hand\",\"raised_hand\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"270B-1F3FB\":{\"unified\":\"270B-1F3FB\",\"image\":\"270b-1f3fb.png\",\"sheet_x\":3,\"sheet_y\":16,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"270B-1F3FC\":{\"unified\":\"270B-1F3FC\",\"image\":\"270b-1f3fc.png\",\"sheet_x\":3,\"sheet_y\":17,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"270B-1F3FD\":{\"unified\":\"270B-1F3FD\",\"image\":\"270b-1f3fd.png\",\"sheet_x\":3,\"sheet_y\":18,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"270B-1F3FE\":{\"unified\":\"270B-1F3FE\",\"image\":\"270b-1f3fe.png\",\"sheet_x\":3,\"sheet_y\":19,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"270B-1F3FF\":{\"unified\":\"270B-1F3FF\",\"image\":\"270b-1f3ff.png\",\"sheet_x\":3,\"sheet_y\":20,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"fingers\",\"stop\",\"highfive\",\"palm\",\"ban\",\"raised_hand\"],\"search\":\"hand,raised,fingers,stop,highfive,palm,ban,raised_hand\"},\"recycle\":{\"name\":\"Black Universal Recycling Symbol\",\"unified\":\"267B\",\"variations\":[\"267B-FE0F\"],\"sheet_x\":2,\"sheet_y\":2,\"short_names\":[\"recycle\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"arrow\",\"environment\",\"garbage\",\"trash\"],\"search\":\"recycle,black,universal,recycling,symbol,arrow,environment,garbage,trash\"},\"umbrella_on_ground\":{\"name\":\"Umbrella on Ground\",\"unified\":\"26F1\",\"variations\":[],\"sheet_x\":2,\"sheet_y\":31,\"short_names\":[\"umbrella_on_ground\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"weather\",\"summer\"],\"search\":\"umbrella,on,ground,weather,summer\"},\"jack_o_lantern\":{\"name\":\"Jack-O-Lantern\",\"unified\":\"1F383\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":27,\"short_names\":[\"jack_o_lantern\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"halloween\",\"light\",\"pumpkin\",\"creepy\",\"fall\"],\"search\":\"jack,o,lantern,halloween,light,pumpkin,creepy,fall\"},\"open_hands\":{\"name\":\"Open Hands Sign\",\"unified\":\"1F450\",\"variations\":[],\"sheet_x\":15,\"sheet_y\":22,\"short_names\":[\"open_hands\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F450-1F3FB\":{\"unified\":\"1F450-1F3FB\",\"image\":\"1f450-1f3fb.png\",\"sheet_x\":15,\"sheet_y\":23,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F450-1F3FC\":{\"unified\":\"1F450-1F3FC\",\"image\":\"1f450-1f3fc.png\",\"sheet_x\":15,\"sheet_y\":24,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F450-1F3FD\":{\"unified\":\"1F450-1F3FD\",\"image\":\"1f450-1f3fd.png\",\"sheet_x\":15,\"sheet_y\":25,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F450-1F3FE\":{\"unified\":\"1F450-1F3FE\",\"image\":\"1f450-1f3fe.png\",\"sheet_x\":15,\"sheet_y\":26,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F450-1F3FF\":{\"unified\":\"1F450-1F3FF\",\"image\":\"1f450-1f3ff.png\",\"sheet_x\":15,\"sheet_y\":27,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"fingers\",\"butterfly\"],\"search\":\"open,hands,sign,fingers,butterfly\"},\"derelict_house_building\":{\"name\":\"Derelict House Building\",\"unified\":\"1F3DA\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":11,\"short_names\":[\"derelict_house_building\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"derelict,house,building\"},\"u6307\":{\"name\":\"Squared Cjk Unified Ideograph-6307\",\"unified\":\"1F22F\",\"variations\":[\"1F22F-FE0F\"],\"sheet_x\":5,\"sheet_y\":9,\"short_names\":[\"u6307\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"chinese\",\"point\",\"green-square\",\"kanji\"],\"search\":\"u6307,squared,cjk,unified,ideograph,6307,chinese,point,green-square,kanji\"},\"flag-hn\":{\"name\":\"Regional Indicator Symbol Letters HN\",\"unified\":\"1F1ED-1F1F3\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":11,\"short_names\":[\"flag-hn\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,hn,regional,indicator,symbol,letters\"},\"shell\":{\"name\":\"Spiral Shell\",\"unified\":\"1F41A\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":31,\"short_names\":[\"shell\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"sea\",\"beach\"],\"search\":\"shell,spiral,nature,sea,beach\"},\"flag-hk\":{\"name\":\"Regional Indicator Symbol Letters HK\",\"unified\":\"1F1ED-1F1F0\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":9,\"short_names\":[\"flag-hk\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,hk,regional,indicator,symbol,letters\"},\"moyai\":{\"name\":\"Moyai\",\"unified\":\"1F5FF\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":14,\"short_names\":[\"moyai\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"rock\",\"easter island\",\"moai\"],\"search\":\"moyai,rock,easter island,moai\"},\"muscle\":{\"name\":\"Flexed Biceps\",\"unified\":\"1F4AA\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":17,\"short_names\":[\"muscle\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F4AA-1F3FB\":{\"unified\":\"1F4AA-1F3FB\",\"image\":\"1f4aa-1f3fb.png\",\"sheet_x\":20,\"sheet_y\":18,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F4AA-1F3FC\":{\"unified\":\"1F4AA-1F3FC\",\"image\":\"1f4aa-1f3fc.png\",\"sheet_x\":20,\"sheet_y\":19,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F4AA-1F3FD\":{\"unified\":\"1F4AA-1F3FD\",\"image\":\"1f4aa-1f3fd.png\",\"sheet_x\":20,\"sheet_y\":20,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F4AA-1F3FE\":{\"unified\":\"1F4AA-1F3FE\",\"image\":\"1f4aa-1f3fe.png\",\"sheet_x\":20,\"sheet_y\":21,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F4AA-1F3FF\":{\"unified\":\"1F4AA-1F3FF\",\"image\":\"1f4aa-1f3ff.png\",\"sheet_x\":20,\"sheet_y\":22,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"arm\",\"flex\",\"hand\",\"summer\",\"strong\",\"biceps\"],\"search\":\"muscle,flexed,biceps,arm,flex,hand,summer,strong\"},\"chart\":{\"name\":\"Chart with Upwards Trend and Yen Sign\",\"unified\":\"1F4B9\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":37,\"short_names\":[\"chart\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"green-square\",\"graph\",\"presentation\",\"stats\"],\"search\":\"chart,with,upwards,trend,and,yen,sign,green-square,graph,presentation,stats\"},\"office\":{\"name\":\"Office Building\",\"unified\":\"1F3E2\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":19,\"short_names\":[\"office\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"building\",\"bureau\",\"work\"],\"search\":\"office,building,bureau,work\"},\"shopping_bags\":{\"name\":\"Shopping Bags\",\"unified\":\"1F6CD\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":27,\"short_names\":[\"shopping_bags\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"mall\",\"buy\",\"purchase\"],\"search\":\"shopping,bags,mall,buy,purchase\"},\"department_store\":{\"name\":\"Department Store\",\"unified\":\"1F3EC\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":29,\"short_names\":[\"department_store\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"building\",\"shopping\",\"mall\"],\"search\":\"department,store,building,shopping,mall\"},\"pray\":{\"name\":\"Person with Folded Hands\",\"unified\":\"1F64F\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":6,\"short_names\":[\"pray\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F64F-1F3FB\":{\"unified\":\"1F64F-1F3FB\",\"image\":\"1f64f-1f3fb.png\",\"sheet_x\":29,\"sheet_y\":7,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F64F-1F3FC\":{\"unified\":\"1F64F-1F3FC\",\"image\":\"1f64f-1f3fc.png\",\"sheet_x\":29,\"sheet_y\":8,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F64F-1F3FD\":{\"unified\":\"1F64F-1F3FD\",\"image\":\"1f64f-1f3fd.png\",\"sheet_x\":29,\"sheet_y\":9,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F64F-1F3FE\":{\"unified\":\"1F64F-1F3FE\",\"image\":\"1f64f-1f3fe.png\",\"sheet_x\":29,\"sheet_y\":10,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F64F-1F3FF\":{\"unified\":\"1F64F-1F3FF\",\"image\":\"1f64f-1f3ff.png\",\"sheet_x\":29,\"sheet_y\":11,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"please\",\"hope\",\"wish\",\"namaste\",\"highfive\"],\"search\":\"pray,person,with,folded,hands,please,hope,wish,namaste,highfive\"},\"flag-hu\":{\"name\":\"Regional Indicator Symbol Letters HU\",\"unified\":\"1F1ED-1F1FA\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":14,\"short_names\":[\"flag-hu\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,hu,regional,indicator,symbol,letters\"},\"sparkle\":{\"name\":\"Sparkle\",\"unified\":\"2747\",\"variations\":[\"2747-FE0F\"],\"sheet_x\":4,\"sheet_y\":2,\"short_names\":[\"sparkle\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"stars\",\"green-square\",\"awesome\",\"good\",\"fireworks\"],\"search\":\"sparkle,stars,green-square,awesome,good,fireworks\"},\"spider_web\":{\"name\":\"Spider Web\",\"unified\":\"1F578\",\"variations\":[],\"sheet_x\":25,\"sheet_y\":6,\"short_names\":[\"spider_web\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"animal\",\"insect\",\"arachnid\",\"silk\"],\"search\":\"spider,web,animal,insect,arachnid,silk\"},\"point_up\":{\"name\":\"White Up Pointing Index\",\"unified\":\"261D\",\"variations\":[\"261D-FE0F\"],\"sheet_x\":1,\"sheet_y\":10,\"short_names\":[\"point_up\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"261D-1F3FB\":{\"unified\":\"261D-1F3FB\",\"image\":\"261d-1f3fb.png\",\"sheet_x\":1,\"sheet_y\":11,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"261D-1F3FC\":{\"unified\":\"261D-1F3FC\",\"image\":\"261d-1f3fc.png\",\"sheet_x\":1,\"sheet_y\":12,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"261D-1F3FD\":{\"unified\":\"261D-1F3FD\",\"image\":\"261d-1f3fd.png\",\"sheet_x\":1,\"sheet_y\":13,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"261D-1F3FE\":{\"unified\":\"261D-1F3FE\",\"image\":\"261d-1f3fe.png\",\"sheet_x\":1,\"sheet_y\":14,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"261D-1F3FF\":{\"unified\":\"261D-1F3FF\",\"image\":\"261d-1f3ff.png\",\"sheet_x\":1,\"sheet_y\":15,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"hand\",\"fingers\",\"direction\"],\"search\":\"point,up,white,pointing,index,hand,fingers,direction\"},\"eight_spoked_asterisk\":{\"name\":\"Eight Spoked Asterisk\",\"unified\":\"2733\",\"variations\":[\"2733-FE0F\"],\"sheet_x\":3,\"sheet_y\":40,\"short_names\":[\"eight_spoked_asterisk\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"star\",\"sparkle\",\"green-square\"],\"search\":\"eight,spoked,asterisk,star,sparkle,green-square\"},\"flag-is\":{\"name\":\"Regional Indicator Symbol Letters IS\",\"unified\":\"1F1EE-1F1F8\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":24,\"short_names\":[\"flag-is\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,is,regional,indicator,symbol,letters\"},\"post_office\":{\"name\":\"Japanese Post Office\",\"unified\":\"1F3E3\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":20,\"short_names\":[\"post_office\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"building\",\"email\",\"communication\"],\"search\":\"post,office,japanese,building,email,communication\"},\"earth_americas\":{\"name\":\"Earth Globe Americas\",\"unified\":\"1F30E\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":35,\"short_names\":[\"earth_americas\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"globe\",\"world\",\"USA\",\"international\"],\"search\":\"earth,americas,globe,world,usa,international\"},\"balloon\":{\"name\":\"Balloon\",\"unified\":\"1F388\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":37,\"short_names\":[\"balloon\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"party\",\"celebration\",\"birthday\",\"circus\"],\"search\":\"balloon,party,celebration,birthday,circus\"},\"european_post_office\":{\"name\":\"European Post Office\",\"unified\":\"1F3E4\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":21,\"short_names\":[\"european_post_office\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"building\",\"email\"],\"search\":\"european,post,office,building,email\"},\"point_up_2\":{\"name\":\"White Up Pointing Backhand Index\",\"unified\":\"1F446\",\"variations\":[],\"sheet_x\":14,\"sheet_y\":3,\"short_names\":[\"point_up_2\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F446-1F3FB\":{\"unified\":\"1F446-1F3FB\",\"image\":\"1f446-1f3fb.png\",\"sheet_x\":14,\"sheet_y\":4,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F446-1F3FC\":{\"unified\":\"1F446-1F3FC\",\"image\":\"1f446-1f3fc.png\",\"sheet_x\":14,\"sheet_y\":5,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F446-1F3FD\":{\"unified\":\"1F446-1F3FD\",\"image\":\"1f446-1f3fd.png\",\"sheet_x\":14,\"sheet_y\":6,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F446-1F3FE\":{\"unified\":\"1F446-1F3FE\",\"image\":\"1f446-1f3fe.png\",\"sheet_x\":14,\"sheet_y\":7,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F446-1F3FF\":{\"unified\":\"1F446-1F3FF\",\"image\":\"1f446-1f3ff.png\",\"sheet_x\":14,\"sheet_y\":8,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"fingers\",\"hand\",\"direction\"],\"search\":\"point,up,2,white,pointing,backhand,index,fingers,hand,direction\"},\"earth_africa\":{\"name\":\"Earth Globe Europe-Africa\",\"unified\":\"1F30D\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":34,\"short_names\":[\"earth_africa\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"globe\",\"world\",\"international\"],\"search\":\"earth,africa,globe,europe,world,international\"},\"negative_squared_cross_mark\":{\"name\":\"Negative Squared Cross Mark\",\"unified\":\"274E\",\"variations\":[],\"sheet_x\":4,\"sheet_y\":4,\"short_names\":[\"negative_squared_cross_mark\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"x\",\"green-square\",\"no\",\"deny\"],\"search\":\"negative,squared,cross,mark,x,green-square,no,deny\"},\"flags\":{\"name\":\"Carp Streamer\",\"unified\":\"1F38F\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":3,\"short_names\":[\"flags\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fish\",\"japanese\",\"koinobori\",\"carp\",\"banner\"],\"search\":\"flags,carp,streamer,fish,japanese,koinobori,banner\"},\"flag-in\":{\"name\":\"Regional Indicator Symbol Letters IN\",\"unified\":\"1F1EE-1F1F3\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":20,\"short_names\":[\"flag-in\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,in,regional,indicator,symbol,letters\"},\"hospital\":{\"name\":\"Hospital\",\"unified\":\"1F3E5\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":22,\"short_names\":[\"hospital\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"building\",\"health\",\"surgery\",\"doctor\"],\"search\":\"hospital,building,health,surgery,doctor\"},\"point_down\":{\"name\":\"White Down Pointing Backhand Index\",\"unified\":\"1F447\",\"variations\":[],\"sheet_x\":14,\"sheet_y\":9,\"short_names\":[\"point_down\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F447-1F3FB\":{\"unified\":\"1F447-1F3FB\",\"image\":\"1f447-1f3fb.png\",\"sheet_x\":14,\"sheet_y\":10,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F447-1F3FC\":{\"unified\":\"1F447-1F3FC\",\"image\":\"1f447-1f3fc.png\",\"sheet_x\":14,\"sheet_y\":11,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F447-1F3FD\":{\"unified\":\"1F447-1F3FD\",\"image\":\"1f447-1f3fd.png\",\"sheet_x\":14,\"sheet_y\":12,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F447-1F3FE\":{\"unified\":\"1F447-1F3FE\",\"image\":\"1f447-1f3fe.png\",\"sheet_x\":14,\"sheet_y\":13,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F447-1F3FF\":{\"unified\":\"1F447-1F3FF\",\"image\":\"1f447-1f3ff.png\",\"sheet_x\":14,\"sheet_y\":14,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"fingers\",\"hand\",\"direction\"],\"search\":\"point,down,white,pointing,backhand,index,fingers,hand,direction\"},\"white_check_mark\":{\"name\":\"White Heavy Check Mark\",\"unified\":\"2705\",\"variations\":[],\"sheet_x\":3,\"sheet_y\":6,\"short_names\":[\"white_check_mark\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"green-square\",\"ok\",\"agree\",\"vote\",\"election\",\"answer\"],\"search\":\"white,check,mark,heavy,green-square,ok,agree,vote,election,answer\"},\"ribbon\":{\"name\":\"Ribbon\",\"unified\":\"1F380\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":24,\"short_names\":[\"ribbon\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"decoration\",\"pink\",\"girl\",\"bowtie\"],\"search\":\"ribbon,decoration,pink,girl,bowtie\"},\"earth_asia\":{\"name\":\"Earth Globe Asia-Australia\",\"unified\":\"1F30F\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":36,\"short_names\":[\"earth_asia\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"globe\",\"world\",\"east\",\"international\"],\"search\":\"earth,asia,globe,australia,world,east,international\"},\"flag-id\":{\"name\":\"Regional Indicator Symbol Letters ID\",\"unified\":\"1F1EE-1F1E9\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":16,\"short_names\":[\"flag-id\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,id,regional,indicator,symbol,letters\"},\"full_moon\":{\"name\":\"Full Moon Symbol\",\"unified\":\"1F315\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":1,\"short_names\":[\"full_moon\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"yellow\",\"twilight\",\"planet\",\"space\",\"night\",\"evening\",\"sleep\"],\"search\":\"full,moon,symbol,nature,yellow,twilight,planet,space,night,evening,sleep\"},\"point_left\":{\"name\":\"White Left Pointing Backhand Index\",\"unified\":\"1F448\",\"variations\":[],\"sheet_x\":14,\"sheet_y\":15,\"short_names\":[\"point_left\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F448-1F3FB\":{\"unified\":\"1F448-1F3FB\",\"image\":\"1f448-1f3fb.png\",\"sheet_x\":14,\"sheet_y\":16,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F448-1F3FC\":{\"unified\":\"1F448-1F3FC\",\"image\":\"1f448-1f3fc.png\",\"sheet_x\":14,\"sheet_y\":17,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F448-1F3FD\":{\"unified\":\"1F448-1F3FD\",\"image\":\"1f448-1f3fd.png\",\"sheet_x\":14,\"sheet_y\":18,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F448-1F3FE\":{\"unified\":\"1F448-1F3FE\",\"image\":\"1f448-1f3fe.png\",\"sheet_x\":14,\"sheet_y\":19,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F448-1F3FF\":{\"unified\":\"1F448-1F3FF\",\"image\":\"1f448-1f3ff.png\",\"sheet_x\":14,\"sheet_y\":20,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"direction\",\"fingers\",\"hand\"],\"search\":\"point,left,white,pointing,backhand,index,direction,fingers,hand\"},\"flag-ir\":{\"name\":\"Regional Indicator Symbol Letters IR\",\"unified\":\"1F1EE-1F1F7\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":23,\"short_names\":[\"flag-ir\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ir,regional,indicator,symbol,letters\"},\"gift\":{\"name\":\"Wrapped Present\",\"unified\":\"1F381\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":25,\"short_names\":[\"gift\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"present\",\"birthday\",\"christmas\",\"xmas\"],\"search\":\"gift,wrapped,present,birthday,christmas,xmas\"},\"bank\":{\"name\":\"Bank\",\"unified\":\"1F3E6\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":23,\"short_names\":[\"bank\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"building\",\"money\",\"sales\",\"cash\",\"business\",\"enterprise\"],\"search\":\"bank,building,money,sales,cash,business,enterprise\"},\"diamond_shape_with_a_dot_inside\":{\"name\":\"Diamond Shape with a Dot Inside\",\"unified\":\"1F4A0\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":7,\"short_names\":[\"diamond_shape_with_a_dot_inside\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"jewel\",\"blue\",\"gem\",\"crystal\",\"fancy\"],\"search\":\"diamond,shape,with,a,dot,inside,jewel,blue,gem,crystal,fancy\"},\"flag-iq\":{\"name\":\"Regional Indicator Symbol Letters IQ\",\"unified\":\"1F1EE-1F1F6\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":22,\"short_names\":[\"flag-iq\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,iq,regional,indicator,symbol,letters\"},\"confetti_ball\":{\"name\":\"Confetti Ball\",\"unified\":\"1F38A\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":39,\"short_names\":[\"confetti_ball\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"festival\",\"party\",\"birthday\",\"circus\"],\"search\":\"confetti,ball,festival,party,birthday,circus\"},\"point_right\":{\"name\":\"White Right Pointing Backhand Index\",\"unified\":\"1F449\",\"variations\":[],\"sheet_x\":14,\"sheet_y\":21,\"short_names\":[\"point_right\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F449-1F3FB\":{\"unified\":\"1F449-1F3FB\",\"image\":\"1f449-1f3fb.png\",\"sheet_x\":14,\"sheet_y\":22,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F449-1F3FC\":{\"unified\":\"1F449-1F3FC\",\"image\":\"1f449-1f3fc.png\",\"sheet_x\":14,\"sheet_y\":23,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F449-1F3FD\":{\"unified\":\"1F449-1F3FD\",\"image\":\"1f449-1f3fd.png\",\"sheet_x\":14,\"sheet_y\":24,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F449-1F3FE\":{\"unified\":\"1F449-1F3FE\",\"image\":\"1f449-1f3fe.png\",\"sheet_x\":14,\"sheet_y\":25,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F449-1F3FF\":{\"unified\":\"1F449-1F3FF\",\"image\":\"1f449-1f3ff.png\",\"sheet_x\":14,\"sheet_y\":26,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"fingers\",\"hand\",\"direction\"],\"search\":\"point,right,white,pointing,backhand,index,fingers,hand,direction\"},\"cyclone\":{\"name\":\"Cyclone\",\"unified\":\"1F300\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":21,\"short_names\":[\"cyclone\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"weather\",\"swirl\",\"blue\",\"cloud\"],\"search\":\"cyclone,weather,swirl,blue,cloud\"},\"waning_gibbous_moon\":{\"name\":\"Waning Gibbous Moon Symbol\",\"unified\":\"1F316\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":2,\"short_names\":[\"waning_gibbous_moon\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"twilight\",\"planet\",\"space\",\"night\",\"evening\",\"sleep\",\"waxing_gibbous_moon\"],\"search\":\"waning,gibbous,moon,symbol,nature,twilight,planet,space,night,evening,sleep,waxing_gibbous_moon\"},\"hotel\":{\"name\":\"Hotel\",\"unified\":\"1F3E8\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":25,\"short_names\":[\"hotel\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"building\",\"whotel\",\"accomodation\",\"checkin\"],\"search\":\"hotel,building,whotel,accomodation,checkin\"},\"loop\":{\"name\":\"Double Curly Loop\",\"unified\":\"27BF\",\"variations\":[],\"sheet_x\":4,\"sheet_y\":16,\"short_names\":[\"loop\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"tape\",\"cassette\"],\"search\":\"loop,double,curly,tape,cassette\"},\"convenience_store\":{\"name\":\"Convenience Store\",\"unified\":\"1F3EA\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":27,\"short_names\":[\"convenience_store\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"building\",\"shopping\",\"groceries\"],\"search\":\"convenience,store,building,shopping,groceries\"},\"last_quarter_moon\":{\"name\":\"Last Quarter Moon Symbol\",\"unified\":\"1F317\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":3,\"short_names\":[\"last_quarter_moon\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"twilight\",\"planet\",\"space\",\"night\",\"evening\",\"sleep\"],\"search\":\"last,quarter,moon,symbol,nature,twilight,planet,space,night,evening,sleep\"},\"tada\":{\"name\":\"Party Popper\",\"unified\":\"1F389\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":38,\"short_names\":[\"tada\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"party\",\"contulations\",\"birthday\",\"magic\",\"circus\"],\"search\":\"tada,party,popper,contulations,birthday,magic,circus\"},\"middle_finger\":{\"name\":\"Reversed Hand with Middle Finger Extended\",\"unified\":\"1F595\",\"variations\":[],\"sheet_x\":25,\"sheet_y\":19,\"short_names\":[\"middle_finger\",\"reversed_hand_with_middle_finger_extended\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F595-1F3FB\":{\"unified\":\"1F595-1F3FB\",\"image\":\"1f595-1f3fb.png\",\"sheet_x\":25,\"sheet_y\":20,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F595-1F3FC\":{\"unified\":\"1F595-1F3FC\",\"image\":\"1f595-1f3fc.png\",\"sheet_x\":25,\"sheet_y\":21,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F595-1F3FD\":{\"unified\":\"1F595-1F3FD\",\"image\":\"1f595-1f3fd.png\",\"sheet_x\":25,\"sheet_y\":22,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F595-1F3FE\":{\"unified\":\"1F595-1F3FE\",\"image\":\"1f595-1f3fe.png\",\"sheet_x\":25,\"sheet_y\":23,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F595-1F3FF\":{\"unified\":\"1F595-1F3FF\",\"image\":\"1f595-1f3ff.png\",\"sheet_x\":25,\"sheet_y\":24,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"hand\",\"fingers\",\"rude\"],\"search\":\"middle,finger,reversed,hand,with,extended,fingers,rude\"},\"flag-ie\":{\"name\":\"Regional Indicator Symbol Letters IE\",\"unified\":\"1F1EE-1F1EA\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":17,\"short_names\":[\"flag-ie\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ie,regional,indicator,symbol,letters\"},\"dolls\":{\"name\":\"Japanese Dolls\",\"unified\":\"1F38E\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":2,\"short_names\":[\"dolls\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"japanese\",\"toy\",\"kimono\"],\"search\":\"dolls,japanese,toy,kimono\"},\"globe_with_meridians\":{\"name\":\"Globe with Meridians\",\"unified\":\"1F310\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":37,\"short_names\":[\"globe_with_meridians\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"earth\",\"international\",\"world\",\"internet\",\"interweb\",\"i18n\"],\"search\":\"globe,with,meridians,earth,international,world,internet,interweb,i18n\"},\"flag-im\":{\"name\":\"Regional Indicator Symbol Letters IM\",\"unified\":\"1F1EE-1F1F2\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":19,\"short_names\":[\"flag-im\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,im,regional,indicator,symbol,letters\"},\"waning_crescent_moon\":{\"name\":\"Waning Crescent Moon Symbol\",\"unified\":\"1F318\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":4,\"short_names\":[\"waning_crescent_moon\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"twilight\",\"planet\",\"space\",\"night\",\"evening\",\"sleep\"],\"search\":\"waning,crescent,moon,symbol,nature,twilight,planet,space,night,evening,sleep\"},\"raised_hand_with_fingers_splayed\":{\"name\":\"Raised Hand with Fingers Splayed\",\"unified\":\"1F590\",\"variations\":[],\"sheet_x\":25,\"sheet_y\":13,\"short_names\":[\"raised_hand_with_fingers_splayed\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F590-1F3FB\":{\"unified\":\"1F590-1F3FB\",\"image\":\"1f590-1f3fb.png\",\"sheet_x\":25,\"sheet_y\":14,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F590-1F3FC\":{\"unified\":\"1F590-1F3FC\",\"image\":\"1f590-1f3fc.png\",\"sheet_x\":25,\"sheet_y\":15,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F590-1F3FD\":{\"unified\":\"1F590-1F3FD\",\"image\":\"1f590-1f3fd.png\",\"sheet_x\":25,\"sheet_y\":16,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F590-1F3FE\":{\"unified\":\"1F590-1F3FE\",\"image\":\"1f590-1f3fe.png\",\"sheet_x\":25,\"sheet_y\":17,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F590-1F3FF\":{\"unified\":\"1F590-1F3FF\",\"image\":\"1f590-1f3ff.png\",\"sheet_x\":25,\"sheet_y\":18,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[],\"search\":\"raised,hand,with,fingers,splayed\"},\"school\":{\"name\":\"School\",\"unified\":\"1F3EB\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":28,\"short_names\":[\"school\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"building\",\"student\",\"education\",\"learn\",\"teach\"],\"search\":\"school,building,student,education,learn,teach\"},\"new_moon\":{\"name\":\"New Moon Symbol\",\"unified\":\"1F311\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":38,\"short_names\":[\"new_moon\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"twilight\",\"planet\",\"space\",\"night\",\"evening\",\"sleep\"],\"search\":\"new,moon,symbol,nature,twilight,planet,space,night,evening,sleep\"},\"the_horns\":{\"name\":\"Sign of the Horns\",\"unified\":\"1F918\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":9,\"short_names\":[\"the_horns\",\"sign_of_the_horns\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F918-1F3FB\":{\"unified\":\"1F918-1F3FB\",\"image\":\"1f918-1f3fb.png\",\"sheet_x\":32,\"sheet_y\":10,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F918-1F3FC\":{\"unified\":\"1F918-1F3FC\",\"image\":\"1f918-1f3fc.png\",\"sheet_x\":32,\"sheet_y\":11,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F918-1F3FD\":{\"unified\":\"1F918-1F3FD\",\"image\":\"1f918-1f3fd.png\",\"sheet_x\":32,\"sheet_y\":12,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F918-1F3FE\":{\"unified\":\"1F918-1F3FE\",\"image\":\"1f918-1f3fe.png\",\"sheet_x\":32,\"sheet_y\":13,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F918-1F3FF\":{\"unified\":\"1F918-1F3FF\",\"image\":\"1f918-1f3ff.png\",\"sheet_x\":32,\"sheet_y\":14,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[],\"search\":\"the,horns,sign,of\"},\"love_hotel\":{\"name\":\"Love Hotel\",\"unified\":\"1F3E9\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":26,\"short_names\":[\"love_hotel\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"like\",\"affection\",\"dating\"],\"search\":\"love,hotel,like,affection,dating\"},\"m\":{\"name\":\"Circled Latin Capital Letter M\",\"unified\":\"24C2\",\"variations\":[\"24C2-FE0F\"],\"sheet_x\":0,\"sheet_y\":32,\"short_names\":[\"m\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"alphabet\",\"blue-circle\",\"letter\"],\"search\":\"m,circled,latin,capital,letter,alphabet,blue-circle\"},\"flag-il\":{\"name\":\"Regional Indicator Symbol Letters IL\",\"unified\":\"1F1EE-1F1F1\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":18,\"short_names\":[\"flag-il\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,il,regional,indicator,symbol,letters\"},\"wind_chime\":{\"name\":\"Wind Chime\",\"unified\":\"1F390\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":4,\"short_names\":[\"wind_chime\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"ding\",\"spring\",\"bell\"],\"search\":\"wind,chime,nature,ding,spring,bell\"},\"spock-hand\":{\"name\":\"Raised Hand with Part Between Middle and Ring Fingers\",\"unified\":\"1F596\",\"variations\":[],\"sheet_x\":25,\"sheet_y\":25,\"short_names\":[\"spock-hand\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F596-1F3FB\":{\"unified\":\"1F596-1F3FB\",\"image\":\"1f596-1f3fb.png\",\"sheet_x\":25,\"sheet_y\":26,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F596-1F3FC\":{\"unified\":\"1F596-1F3FC\",\"image\":\"1f596-1f3fc.png\",\"sheet_x\":25,\"sheet_y\":27,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F596-1F3FD\":{\"unified\":\"1F596-1F3FD\",\"image\":\"1f596-1f3fd.png\",\"sheet_x\":25,\"sheet_y\":28,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F596-1F3FE\":{\"unified\":\"1F596-1F3FE\",\"image\":\"1f596-1f3fe.png\",\"sheet_x\":25,\"sheet_y\":29,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F596-1F3FF\":{\"unified\":\"1F596-1F3FF\",\"image\":\"1f596-1f3ff.png\",\"sheet_x\":25,\"sheet_y\":30,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[],\"search\":\"spock,hand,raised,with,part,between,middle,and,ring,fingers\"},\"wedding\":{\"name\":\"Wedding\",\"unified\":\"1F492\",\"variations\":[],\"sheet_x\":19,\"sheet_y\":34,\"short_names\":[\"wedding\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"love\",\"like\",\"affection\",\"couple\",\"marriage\",\"bride\",\"groom\"],\"search\":\"wedding,love,like,affection,couple,marriage,bride,groom\"},\"atm\":{\"name\":\"Automated Teller Machine\",\"unified\":\"1F3E7\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":24,\"short_names\":[\"atm\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"money\",\"sales\",\"cash\",\"blue-square\",\"payment\",\"bank\"],\"search\":\"atm,automated,teller,machine,money,sales,cash,blue-square,payment,bank\"},\"crossed_flags\":{\"name\":\"Crossed Flags\",\"unified\":\"1F38C\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":0,\"short_names\":[\"crossed_flags\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"japanese\",\"nation\",\"country\",\"border\"],\"search\":\"crossed,flags,japanese,nation,country,border\"},\"flag-it\":{\"name\":\"Regional Indicator Symbol Letters IT\",\"unified\":\"1F1EE-1F1F9\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":25,\"short_names\":[\"flag-it\",\"it\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,it,regional,indicator,symbol,letters\"},\"waxing_crescent_moon\":{\"name\":\"Waxing Crescent Moon Symbol\",\"unified\":\"1F312\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":39,\"short_names\":[\"waxing_crescent_moon\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"twilight\",\"planet\",\"space\",\"night\",\"evening\",\"sleep\"],\"search\":\"waxing,crescent,moon,symbol,nature,twilight,planet,space,night,evening,sleep\"},\"izakaya_lantern\":{\"name\":\"Izakaya Lantern\",\"unified\":\"1F3EE\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":31,\"short_names\":[\"izakaya_lantern\",\"lantern\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"light\",\"paper\",\"halloween\",\"spooky\"],\"search\":\"izakaya,lantern,light,paper,halloween,spooky\"},\"first_quarter_moon\":{\"name\":\"First Quarter Moon Symbol\",\"unified\":\"1F313\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":40,\"short_names\":[\"first_quarter_moon\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"twilight\",\"planet\",\"space\",\"night\",\"evening\",\"sleep\"],\"search\":\"first,quarter,moon,symbol,nature,twilight,planet,space,night,evening,sleep\"},\"sa\":{\"name\":\"Squared Katakana Sa\",\"unified\":\"1F202\",\"variations\":[\"1F202-FE0F\"],\"sheet_x\":5,\"sheet_y\":7,\"short_names\":[\"sa\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"japanese\",\"blue-square\",\"katakana\"],\"search\":\"sa,squared,katakana,japanese,blue-square\"},\"classical_building\":{\"name\":\"Classical Building\",\"unified\":\"1F3DB\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":12,\"short_names\":[\"classical_building\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"classical,building\"},\"writing_hand\":{\"name\":\"Writing Hand\",\"unified\":\"270D\",\"variations\":[\"270D-FE0F\"],\"sheet_x\":3,\"sheet_y\":27,\"short_names\":[\"writing_hand\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"270D-1F3FB\":{\"unified\":\"270D-1F3FB\",\"image\":\"270d-1f3fb.png\",\"sheet_x\":3,\"sheet_y\":28,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"270D-1F3FC\":{\"unified\":\"270D-1F3FC\",\"image\":\"270d-1f3fc.png\",\"sheet_x\":3,\"sheet_y\":29,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"270D-1F3FD\":{\"unified\":\"270D-1F3FD\",\"image\":\"270d-1f3fd.png\",\"sheet_x\":3,\"sheet_y\":30,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"270D-1F3FE\":{\"unified\":\"270D-1F3FE\",\"image\":\"270d-1f3fe.png\",\"sheet_x\":3,\"sheet_y\":31,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"270D-1F3FF\":{\"unified\":\"270D-1F3FF\",\"image\":\"270d-1f3ff.png\",\"sheet_x\":3,\"sheet_y\":32,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"pen\",\"stationery\"],\"search\":\"writing,hand,pen,stationery\"},\"flag-ci\":{\"name\":\"Regional Indicator Symbol Letters CI\",\"unified\":\"1F1E8-1F1EE\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":36,\"short_names\":[\"flag-ci\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ci,regional,indicator,symbol,letters\"},\"moon\":{\"name\":\"Waxing Gibbous Moon Symbol\",\"unified\":\"1F314\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":0,\"short_names\":[\"moon\",\"waxing_gibbous_moon\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"night\",\"sky\",\"gray\",\"twilight\",\"planet\",\"space\",\"evening\",\"sleep\"],\"search\":\"moon,waxing,gibbous,symbol,nature,night,sky,gray,twilight,planet,space,evening,sleep\"},\"church\":{\"name\":\"Church\",\"unified\":\"26EA\",\"variations\":[\"26EA-FE0F\"],\"sheet_x\":2,\"sheet_y\":29,\"short_names\":[\"church\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"building\",\"religion\",\"christ\"],\"search\":\"church,building,religion,christ\"},\"email\":{\"name\":\"Envelope\",\"unified\":\"2709\",\"variations\":[\"2709-FE0F\"],\"sheet_x\":3,\"sheet_y\":8,\"short_names\":[\"email\",\"envelope\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"communication\",\"inbox\"],\"search\":\"email,envelope,communication,inbox\"},\"passport_control\":{\"name\":\"Passport Control\",\"unified\":\"1F6C2\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":21,\"short_names\":[\"passport_control\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"custom\",\"blue-square\"],\"search\":\"passport,control,custom,blue-square\"},\"nail_care\":{\"name\":\"Nail Polish\",\"unified\":\"1F485\",\"variations\":[],\"sheet_x\":19,\"sheet_y\":6,\"short_names\":[\"nail_care\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F485-1F3FB\":{\"unified\":\"1F485-1F3FB\",\"image\":\"1f485-1f3fb.png\",\"sheet_x\":19,\"sheet_y\":7,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F485-1F3FC\":{\"unified\":\"1F485-1F3FC\",\"image\":\"1f485-1f3fc.png\",\"sheet_x\":19,\"sheet_y\":8,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F485-1F3FD\":{\"unified\":\"1F485-1F3FD\",\"image\":\"1f485-1f3fd.png\",\"sheet_x\":19,\"sheet_y\":9,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F485-1F3FE\":{\"unified\":\"1F485-1F3FE\",\"image\":\"1f485-1f3fe.png\",\"sheet_x\":19,\"sheet_y\":10,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F485-1F3FF\":{\"unified\":\"1F485-1F3FF\",\"image\":\"1f485-1f3ff.png\",\"sheet_x\":19,\"sheet_y\":11,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"beauty\",\"manicure\",\"finger\",\"fashion\"],\"search\":\"nail,care,polish,beauty,manicure,finger,fashion\"},\"flag-jm\":{\"name\":\"Regional Indicator Symbol Letters JM\",\"unified\":\"1F1EF-1F1F2\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":27,\"short_names\":[\"flag-jm\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,jm,regional,indicator,symbol,letters\"},\"lips\":{\"name\":\"Mouth\",\"unified\":\"1F444\",\"variations\":[],\"sheet_x\":14,\"sheet_y\":1,\"short_names\":[\"lips\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"mouth\",\"kiss\"],\"search\":\"lips,mouth,kiss\"},\"mosque\":{\"name\":\"Mosque\",\"unified\":\"1F54C\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":8,\"short_names\":[\"mosque\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"islam\",\"worship\",\"minaret\"],\"search\":\"mosque,islam,worship,minaret\"},\"flag-jp\":{\"name\":\"Regional Indicator Symbol Letters JP\",\"unified\":\"1F1EF-1F1F5\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":29,\"short_names\":[\"flag-jp\",\"jp\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,jp,regional,indicator,symbol,letters\"},\"new_moon_with_face\":{\"name\":\"New Moon with Face\",\"unified\":\"1F31A\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":6,\"short_names\":[\"new_moon_with_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"twilight\",\"planet\",\"space\",\"night\",\"evening\",\"sleep\"],\"search\":\"new,moon,with,face,nature,twilight,planet,space,night,evening,sleep\"},\"customs\":{\"name\":\"Customs\",\"unified\":\"1F6C3\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":22,\"short_names\":[\"customs\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"passport\",\"border\",\"blue-square\"],\"search\":\"customs,passport,border,blue-square\"},\"envelope_with_arrow\":{\"name\":\"Envelope with Downwards Arrow Above\",\"unified\":\"1F4E9\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":3,\"short_names\":[\"envelope_with_arrow\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"email\",\"communication\"],\"search\":\"envelope,with,arrow,downwards,above,email,communication\"},\"full_moon_with_face\":{\"name\":\"Full Moon with Face\",\"unified\":\"1F31D\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":9,\"short_names\":[\"full_moon_with_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"twilight\",\"planet\",\"space\",\"night\",\"evening\",\"sleep\"],\"search\":\"full,moon,with,face,nature,twilight,planet,space,night,evening,sleep\"},\"flag-je\":{\"name\":\"Regional Indicator Symbol Letters JE\",\"unified\":\"1F1EF-1F1EA\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":26,\"short_names\":[\"flag-je\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,je,regional,indicator,symbol,letters\"},\"synagogue\":{\"name\":\"Synagogue\",\"unified\":\"1F54D\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":9,\"short_names\":[\"synagogue\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"judaism\",\"worship\",\"temple\",\"jewish\"],\"search\":\"synagogue,judaism,worship,temple,jewish\"},\"baggage_claim\":{\"name\":\"Baggage Claim\",\"unified\":\"1F6C4\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":23,\"short_names\":[\"baggage_claim\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"airport\",\"transport\"],\"search\":\"baggage,claim,blue-square,airport,transport\"},\"tongue\":{\"name\":\"Tongue\",\"unified\":\"1F445\",\"variations\":[],\"sheet_x\":14,\"sheet_y\":2,\"short_names\":[\"tongue\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"mouth\",\"playful\"],\"search\":\"tongue,mouth,playful\"},\"incoming_envelope\":{\"name\":\"Incoming Envelope\",\"unified\":\"1F4E8\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":2,\"short_names\":[\"incoming_envelope\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"email\",\"inbox\"],\"search\":\"incoming,envelope,email,inbox\"},\"e-mail\":{\"name\":\"E-Mail Symbol\",\"unified\":\"1F4E7\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":1,\"short_names\":[\"e-mail\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"e,mail,symbol\"},\"ear\":{\"name\":\"Ear\",\"unified\":\"1F442\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":30,\"short_names\":[\"ear\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F442-1F3FB\":{\"unified\":\"1F442-1F3FB\",\"image\":\"1f442-1f3fb.png\",\"sheet_x\":13,\"sheet_y\":31,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F442-1F3FC\":{\"unified\":\"1F442-1F3FC\",\"image\":\"1f442-1f3fc.png\",\"sheet_x\":13,\"sheet_y\":32,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F442-1F3FD\":{\"unified\":\"1F442-1F3FD\",\"image\":\"1f442-1f3fd.png\",\"sheet_x\":13,\"sheet_y\":33,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F442-1F3FE\":{\"unified\":\"1F442-1F3FE\",\"image\":\"1f442-1f3fe.png\",\"sheet_x\":13,\"sheet_y\":34,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F442-1F3FF\":{\"unified\":\"1F442-1F3FF\",\"image\":\"1f442-1f3ff.png\",\"sheet_x\":13,\"sheet_y\":35,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"face\",\"hear\",\"sound\",\"listen\"],\"search\":\"ear,face,hear,sound,listen\"},\"first_quarter_moon_with_face\":{\"name\":\"First Quarter Moon with Face\",\"unified\":\"1F31B\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":7,\"short_names\":[\"first_quarter_moon_with_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"twilight\",\"planet\",\"space\",\"night\",\"evening\",\"sleep\"],\"search\":\"first,quarter,moon,with,face,nature,twilight,planet,space,night,evening,sleep\"},\"left_luggage\":{\"name\":\"Left Luggage\",\"unified\":\"1F6C5\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":24,\"short_names\":[\"left_luggage\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"travel\"],\"search\":\"left,luggage,blue-square,travel\"},\"kaaba\":{\"name\":\"Kaaba\",\"unified\":\"1F54B\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":7,\"short_names\":[\"kaaba\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"mecca\",\"mosque\",\"islam\"],\"search\":\"kaaba,mecca,mosque,islam\"},\"flag-jo\":{\"name\":\"Regional Indicator Symbol Letters JO\",\"unified\":\"1F1EF-1F1F4\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":28,\"short_names\":[\"flag-jo\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,jo,regional,indicator,symbol,letters\"},\"flag-kz\":{\"name\":\"Regional Indicator Symbol Letters KZ\",\"unified\":\"1F1F0-1F1FF\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":40,\"short_names\":[\"flag-kz\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,kz,regional,indicator,symbol,letters\"},\"wheelchair\":{\"name\":\"Wheelchair Symbol\",\"unified\":\"267F\",\"variations\":[\"267F-FE0F\"],\"sheet_x\":2,\"sheet_y\":3,\"short_names\":[\"wheelchair\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"disabled\",\"a11y\",\"accessibility\"],\"search\":\"wheelchair,symbol,blue-square,disabled,a11y,accessibility\"},\"last_quarter_moon_with_face\":{\"name\":\"Last Quarter Moon with Face\",\"unified\":\"1F31C\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":8,\"short_names\":[\"last_quarter_moon_with_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"twilight\",\"planet\",\"space\",\"night\",\"evening\",\"sleep\"],\"search\":\"last,quarter,moon,with,face,nature,twilight,planet,space,night,evening,sleep\"},\"nose\":{\"name\":\"Nose\",\"unified\":\"1F443\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":36,\"short_names\":[\"nose\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F443-1F3FB\":{\"unified\":\"1F443-1F3FB\",\"image\":\"1f443-1f3fb.png\",\"sheet_x\":13,\"sheet_y\":37,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F443-1F3FC\":{\"unified\":\"1F443-1F3FC\",\"image\":\"1f443-1f3fc.png\",\"sheet_x\":13,\"sheet_y\":38,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F443-1F3FD\":{\"unified\":\"1F443-1F3FD\",\"image\":\"1f443-1f3fd.png\",\"sheet_x\":13,\"sheet_y\":39,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F443-1F3FE\":{\"unified\":\"1F443-1F3FE\",\"image\":\"1f443-1f3fe.png\",\"sheet_x\":13,\"sheet_y\":40,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F443-1F3FF\":{\"unified\":\"1F443-1F3FF\",\"image\":\"1f443-1f3ff.png\",\"sheet_x\":14,\"sheet_y\":0,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"smell\",\"sniff\"],\"search\":\"nose,smell,sniff\"},\"love_letter\":{\"name\":\"Love Letter\",\"unified\":\"1F48C\",\"variations\":[],\"sheet_x\":19,\"sheet_y\":28,\"short_names\":[\"love_letter\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"email\",\"like\",\"affection\",\"envelope\",\"valentines\"],\"search\":\"love,letter,email,like,affection,envelope,valentines\"},\"shinto_shrine\":{\"name\":\"Shinto Shrine\",\"unified\":\"26E9\",\"variations\":[],\"sheet_x\":2,\"sheet_y\":28,\"short_names\":[\"shinto_shrine\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"temple\",\"japan\",\"kyoto\"],\"search\":\"shinto,shrine,temple,japan,kyoto\"},\"no_smoking\":{\"name\":\"No Smoking Symbol\",\"unified\":\"1F6AD\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":21,\"short_names\":[\"no_smoking\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"cigarette\",\"blue-square\",\"smell\",\"smoke\"],\"search\":\"no,smoking,symbol,cigarette,blue-square,smell,smoke\"},\"postbox\":{\"name\":\"Postbox\",\"unified\":\"1F4EE\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":8,\"short_names\":[\"postbox\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"email\",\"letter\",\"envelope\"],\"search\":\"postbox,email,letter,envelope\"},\"eye\":{\"name\":\"Eye\",\"unified\":\"1F441\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":29,\"short_names\":[\"eye\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"look\",\"see\",\"watch\",\"stare\"],\"search\":\"eye,face,look,see,watch,stare\"},\"sun_with_face\":{\"name\":\"Sun with Face\",\"unified\":\"1F31E\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":10,\"short_names\":[\"sun_with_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"nature\",\"morning\",\"sky\"],\"search\":\"sun,with,face,nature,morning,sky\"},\"flag-ke\":{\"name\":\"Regional Indicator Symbol Letters KE\",\"unified\":\"1F1F0-1F1EA\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":30,\"short_names\":[\"flag-ke\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ke,regional,indicator,symbol,letters\"},\"mailbox_closed\":{\"name\":\"Closed Mailbox with Lowered Flag\",\"unified\":\"1F4EA\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":4,\"short_names\":[\"mailbox_closed\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"email\",\"communication\",\"inbox\"],\"search\":\"mailbox,closed,with,lowered,flag,email,communication,inbox\"},\"flag-ki\":{\"name\":\"Regional Indicator Symbol Letters KI\",\"unified\":\"1F1F0-1F1EE\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":33,\"short_names\":[\"flag-ki\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ki,regional,indicator,symbol,letters\"},\"eyes\":{\"name\":\"Eyes\",\"unified\":\"1F440\",\"variations\":[],\"sheet_x\":13,\"sheet_y\":28,\"short_names\":[\"eyes\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"look\",\"watch\",\"stalk\",\"peek\",\"see\"],\"search\":\"eyes,look,watch,stalk,peek,see\"},\"wc\":{\"name\":\"Water Closet\",\"unified\":\"1F6BE\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":12,\"short_names\":[\"wc\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"toilet\",\"restroom\",\"blue-square\"],\"search\":\"wc,water,closet,toilet,restroom,blue-square\"},\"crescent_moon\":{\"name\":\"Crescent Moon\",\"unified\":\"1F319\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":5,\"short_names\":[\"crescent_moon\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"night\",\"sleep\",\"sky\",\"evening\",\"magic\"],\"search\":\"crescent,moon,night,sleep,sky,evening,magic\"},\"mailbox\":{\"name\":\"Closed Mailbox with Raised Flag\",\"unified\":\"1F4EB\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":5,\"short_names\":[\"mailbox\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"email\",\"inbox\",\"communication\"],\"search\":\"mailbox,closed,with,raised,flag,email,inbox,communication\"},\"flag-xk\":{\"name\":\"Regional Indicator Symbol Letters XK\",\"unified\":\"1F1FD-1F1F0\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":38,\"short_names\":[\"flag-xk\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,xk,regional,indicator,symbol,letters\"},\"parking\":{\"name\":\"Negative Squared Latin Capital Letter P\",\"unified\":\"1F17F\",\"variations\":[\"1F17F-FE0F\"],\"sheet_x\":4,\"sheet_y\":35,\"short_names\":[\"parking\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"cars\",\"blue-square\",\"alphabet\",\"letter\"],\"search\":\"parking,negative,squared,latin,capital,letter,p,cars,blue-square,alphabet\"},\"bust_in_silhouette\":{\"name\":\"Bust in Silhouette\",\"unified\":\"1F464\",\"variations\":[],\"sheet_x\":16,\"sheet_y\":6,\"short_names\":[\"bust_in_silhouette\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"user\",\"person\",\"human\"],\"search\":\"bust,in,silhouette,user,person,human\"},\"star\":{\"name\":\"White Medium Star\",\"unified\":\"2B50\",\"variations\":[\"2B50-FE0F\"],\"sheet_x\":4,\"sheet_y\":24,\"short_names\":[\"star\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"night\",\"yellow\"],\"search\":\"star,white,medium,night,yellow\"},\"star2\":{\"name\":\"Glowing Star\",\"unified\":\"1F31F\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":11,\"short_names\":[\"star2\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"night\",\"sparkle\",\"awesome\",\"good\",\"magic\"],\"search\":\"star2,glowing,star,night,sparkle,awesome,good,magic\"},\"mailbox_with_mail\":{\"name\":\"Open Mailbox with Raised Flag\",\"unified\":\"1F4EC\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":6,\"short_names\":[\"mailbox_with_mail\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"email\",\"inbox\",\"communication\"],\"search\":\"mailbox,with,mail,open,raised,flag,email,inbox,communication\"},\"potable_water\":{\"name\":\"Potable Water Symbol\",\"unified\":\"1F6B0\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":24,\"short_names\":[\"potable_water\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"liquid\",\"restroom\",\"cleaning\",\"faucet\"],\"search\":\"potable,water,symbol,blue-square,liquid,restroom,cleaning,faucet\"},\"busts_in_silhouette\":{\"name\":\"Busts in Silhouette\",\"unified\":\"1F465\",\"variations\":[],\"sheet_x\":16,\"sheet_y\":7,\"short_names\":[\"busts_in_silhouette\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"user\",\"person\",\"human\",\"group\",\"team\"],\"search\":\"busts,in,silhouette,user,person,human,group,team\"},\"flag-kw\":{\"name\":\"Regional Indicator Symbol Letters KW\",\"unified\":\"1F1F0-1F1FC\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":38,\"short_names\":[\"flag-kw\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,kw,regional,indicator,symbol,letters\"},\"mens\":{\"name\":\"Mens Symbol\",\"unified\":\"1F6B9\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":7,\"short_names\":[\"mens\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"toilet\",\"restroom\",\"wc\",\"blue-square\",\"gender\",\"male\"],\"search\":\"mens,symbol,toilet,restroom,wc,blue-square,gender,male\"},\"dizzy\":{\"name\":\"Dizzy Symbol\",\"unified\":\"1F4AB\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":23,\"short_names\":[\"dizzy\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"star\",\"sparkle\",\"shoot\",\"magic\"],\"search\":\"dizzy,symbol,star,sparkle,shoot,magic\"},\"speaking_head_in_silhouette\":{\"name\":\"Speaking Head in Silhouette\",\"unified\":\"1F5E3\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":5,\"short_names\":[\"speaking_head_in_silhouette\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"speaking,head,in,silhouette\"},\"flag-kg\":{\"name\":\"Regional Indicator Symbol Letters KG\",\"unified\":\"1F1F0-1F1EC\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":31,\"short_names\":[\"flag-kg\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,kg,regional,indicator,symbol,letters\"},\"mailbox_with_no_mail\":{\"name\":\"Open Mailbox with Lowered Flag\",\"unified\":\"1F4ED\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":7,\"short_names\":[\"mailbox_with_no_mail\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"email\",\"inbox\"],\"search\":\"mailbox,with,no,mail,open,lowered,flag,email,inbox\"},\"sparkles\":{\"name\":\"Sparkles\",\"unified\":\"2728\",\"variations\":[],\"sheet_x\":3,\"sheet_y\":39,\"short_names\":[\"sparkles\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"stars\",\"shine\",\"shiny\",\"cool\",\"awesome\",\"good\",\"magic\"],\"search\":\"sparkles,stars,shine,shiny,cool,awesome,good,magic\"},\"baby\":{\"name\":\"Baby\",\"unified\":\"1F476\",\"variations\":[],\"sheet_x\":17,\"sheet_y\":38,\"short_names\":[\"baby\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F476-1F3FB\":{\"unified\":\"1F476-1F3FB\",\"image\":\"1f476-1f3fb.png\",\"sheet_x\":17,\"sheet_y\":39,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F476-1F3FC\":{\"unified\":\"1F476-1F3FC\",\"image\":\"1f476-1f3fc.png\",\"sheet_x\":17,\"sheet_y\":40,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F476-1F3FD\":{\"unified\":\"1F476-1F3FD\",\"image\":\"1f476-1f3fd.png\",\"sheet_x\":18,\"sheet_y\":0,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F476-1F3FE\":{\"unified\":\"1F476-1F3FE\",\"image\":\"1f476-1f3fe.png\",\"sheet_x\":18,\"sheet_y\":1,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F476-1F3FF\":{\"unified\":\"1F476-1F3FF\",\"image\":\"1f476-1f3ff.png\",\"sheet_x\":18,\"sheet_y\":2,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"child\",\"boy\",\"girl\",\"toddler\"],\"search\":\"baby,child,boy,girl,toddler\"},\"package\":{\"name\":\"Package\",\"unified\":\"1F4E6\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":0,\"short_names\":[\"package\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"mail\",\"gift\",\"cardboard\",\"box\",\"moving\"],\"search\":\"package,mail,gift,cardboard,box,moving\"},\"womens\":{\"name\":\"Womens Symbol\",\"unified\":\"1F6BA\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":8,\"short_names\":[\"womens\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"purple-square\",\"woman\",\"female\",\"toilet\",\"loo\",\"restroom\",\"gender\"],\"search\":\"womens,symbol,purple-square,woman,female,toilet,loo,restroom,gender\"},\"flag-la\":{\"name\":\"Regional Indicator Symbol Letters LA\",\"unified\":\"1F1F1-1F1E6\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":0,\"short_names\":[\"flag-la\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,la,regional,indicator,symbol,letters\"},\"baby_symbol\":{\"name\":\"Baby Symbol\",\"unified\":\"1F6BC\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":10,\"short_names\":[\"baby_symbol\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"orange-square\",\"child\"],\"search\":\"baby,symbol,orange-square,child\"},\"flag-lv\":{\"name\":\"Regional Indicator Symbol Letters LV\",\"unified\":\"1F1F1-1F1FB\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":9,\"short_names\":[\"flag-lv\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,lv,regional,indicator,symbol,letters\"},\"postal_horn\":{\"name\":\"Postal Horn\",\"unified\":\"1F4EF\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":9,\"short_names\":[\"postal_horn\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"instrument\",\"music\"],\"search\":\"postal,horn,instrument,music\"},\"comet\":{\"name\":\"Comet\",\"unified\":\"2604\",\"variations\":[\"2604-FE0F\"],\"sheet_x\":1,\"sheet_y\":4,\"short_names\":[\"comet\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"space\"],\"search\":\"comet,space\"},\"boy\":{\"name\":\"Boy\",\"unified\":\"1F466\",\"variations\":[],\"sheet_x\":16,\"sheet_y\":8,\"short_names\":[\"boy\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F466-1F3FB\":{\"unified\":\"1F466-1F3FB\",\"image\":\"1f466-1f3fb.png\",\"sheet_x\":16,\"sheet_y\":9,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F466-1F3FC\":{\"unified\":\"1F466-1F3FC\",\"image\":\"1f466-1f3fc.png\",\"sheet_x\":16,\"sheet_y\":10,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F466-1F3FD\":{\"unified\":\"1F466-1F3FD\",\"image\":\"1f466-1f3fd.png\",\"sheet_x\":16,\"sheet_y\":11,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F466-1F3FE\":{\"unified\":\"1F466-1F3FE\",\"image\":\"1f466-1f3fe.png\",\"sheet_x\":16,\"sheet_y\":12,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F466-1F3FF\":{\"unified\":\"1F466-1F3FF\",\"image\":\"1f466-1f3ff.png\",\"sheet_x\":16,\"sheet_y\":13,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"man\",\"male\",\"guy\",\"teenager\"],\"search\":\"boy,man,male,guy,teenager\"},\"restroom\":{\"name\":\"Restroom\",\"unified\":\"1F6BB\",\"variations\":[],\"sheet_x\":31,\"sheet_y\":9,\"short_names\":[\"restroom\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"toilet\",\"refresh\",\"wc\",\"gender\"],\"search\":\"restroom,blue-square,toilet,refresh,wc,gender\"},\"flag-lb\":{\"name\":\"Regional Indicator Symbol Letters LB\",\"unified\":\"1F1F1-1F1E7\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":1,\"short_names\":[\"flag-lb\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,lb,regional,indicator,symbol,letters\"},\"inbox_tray\":{\"name\":\"Inbox Tray\",\"unified\":\"1F4E5\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":40,\"short_names\":[\"inbox_tray\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"email\",\"documents\"],\"search\":\"inbox,tray,email,documents\"},\"sunny\":{\"name\":\"Black Sun with Rays\",\"unified\":\"2600\",\"variations\":[\"2600-FE0F\"],\"sheet_x\":1,\"sheet_y\":0,\"short_names\":[\"sunny\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"weather\",\"nature\",\"brightness\",\"summer\",\"beach\",\"spring\"],\"search\":\"sunny,black,sun,with,rays,weather,nature,brightness,summer,beach,spring\"},\"girl\":{\"name\":\"Girl\",\"unified\":\"1F467\",\"variations\":[],\"sheet_x\":16,\"sheet_y\":14,\"short_names\":[\"girl\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F467-1F3FB\":{\"unified\":\"1F467-1F3FB\",\"image\":\"1f467-1f3fb.png\",\"sheet_x\":16,\"sheet_y\":15,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F467-1F3FC\":{\"unified\":\"1F467-1F3FC\",\"image\":\"1f467-1f3fc.png\",\"sheet_x\":16,\"sheet_y\":16,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F467-1F3FD\":{\"unified\":\"1F467-1F3FD\",\"image\":\"1f467-1f3fd.png\",\"sheet_x\":16,\"sheet_y\":17,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F467-1F3FE\":{\"unified\":\"1F467-1F3FE\",\"image\":\"1f467-1f3fe.png\",\"sheet_x\":16,\"sheet_y\":18,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F467-1F3FF\":{\"unified\":\"1F467-1F3FF\",\"image\":\"1f467-1f3ff.png\",\"sheet_x\":16,\"sheet_y\":19,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"female\",\"woman\",\"teenager\"],\"search\":\"girl,female,woman,teenager\"},\"man\":{\"name\":\"Man\",\"unified\":\"1F468\",\"variations\":[],\"sheet_x\":16,\"sheet_y\":20,\"short_names\":[\"man\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F468-1F3FB\":{\"unified\":\"1F468-1F3FB\",\"image\":\"1f468-1f3fb.png\",\"sheet_x\":16,\"sheet_y\":21,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F468-1F3FC\":{\"unified\":\"1F468-1F3FC\",\"image\":\"1f468-1f3fc.png\",\"sheet_x\":16,\"sheet_y\":22,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F468-1F3FD\":{\"unified\":\"1F468-1F3FD\",\"image\":\"1f468-1f3fd.png\",\"sheet_x\":16,\"sheet_y\":23,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F468-1F3FE\":{\"unified\":\"1F468-1F3FE\",\"image\":\"1f468-1f3fe.png\",\"sheet_x\":16,\"sheet_y\":24,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F468-1F3FF\":{\"unified\":\"1F468-1F3FF\",\"image\":\"1f468-1f3ff.png\",\"sheet_x\":16,\"sheet_y\":25,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"mustache\",\"father\",\"dad\",\"guy\",\"classy\",\"sir\",\"moustache\"],\"search\":\"man,mustache,father,dad,guy,classy,sir,moustache\"},\"put_litter_in_its_place\":{\"name\":\"Put Litter in Its Place Symbol\",\"unified\":\"1F6AE\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":22,\"short_names\":[\"put_litter_in_its_place\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"sign\",\"human\",\"info\"],\"search\":\"put,litter,in,its,place,symbol,blue-square,sign,human,info\"},\"mostly_sunny\":{\"name\":\"White Sun with Small Cloud\",\"unified\":\"1F324\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":14,\"short_names\":[\"mostly_sunny\",\"sun_small_cloud\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"mostly,sunny,sun,small,cloud,white,with\"},\"flag-ls\":{\"name\":\"Regional Indicator Symbol Letters LS\",\"unified\":\"1F1F1-1F1F8\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":6,\"short_names\":[\"flag-ls\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ls,regional,indicator,symbol,letters\"},\"outbox_tray\":{\"name\":\"Outbox Tray\",\"unified\":\"1F4E4\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":39,\"short_names\":[\"outbox_tray\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"inbox\",\"email\"],\"search\":\"outbox,tray,inbox,email\"},\"cinema\":{\"name\":\"Cinema\",\"unified\":\"1F3A6\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":21,\"short_names\":[\"cinema\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"record\",\"film\",\"movie\",\"curtain\",\"stage\",\"theater\"],\"search\":\"cinema,blue-square,record,film,movie,curtain,stage,theater\"},\"flag-lr\":{\"name\":\"Regional Indicator Symbol Letters LR\",\"unified\":\"1F1F1-1F1F7\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":5,\"short_names\":[\"flag-lr\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,lr,regional,indicator,symbol,letters\"},\"scroll\":{\"name\":\"Scroll\",\"unified\":\"1F4DC\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":31,\"short_names\":[\"scroll\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"documents\",\"ancient\",\"history\",\"paper\"],\"search\":\"scroll,documents,ancient,history,paper\"},\"partly_sunny\":{\"name\":\"Sun Behind Cloud\",\"unified\":\"26C5\",\"variations\":[\"26C5-FE0F\"],\"sheet_x\":2,\"sheet_y\":21,\"short_names\":[\"partly_sunny\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"weather\",\"nature\",\"cloudy\",\"morning\",\"fall\",\"spring\"],\"search\":\"partly,sunny,sun,behind,cloud,weather,nature,cloudy,morning,fall,spring\"},\"woman\":{\"name\":\"Woman\",\"unified\":\"1F469\",\"variations\":[],\"sheet_x\":16,\"sheet_y\":26,\"short_names\":[\"woman\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F469-1F3FB\":{\"unified\":\"1F469-1F3FB\",\"image\":\"1f469-1f3fb.png\",\"sheet_x\":16,\"sheet_y\":27,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F469-1F3FC\":{\"unified\":\"1F469-1F3FC\",\"image\":\"1f469-1f3fc.png\",\"sheet_x\":16,\"sheet_y\":28,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F469-1F3FD\":{\"unified\":\"1F469-1F3FD\",\"image\":\"1f469-1f3fd.png\",\"sheet_x\":16,\"sheet_y\":29,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F469-1F3FE\":{\"unified\":\"1F469-1F3FE\",\"image\":\"1f469-1f3fe.png\",\"sheet_x\":16,\"sheet_y\":30,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F469-1F3FF\":{\"unified\":\"1F469-1F3FF\",\"image\":\"1f469-1f3ff.png\",\"sheet_x\":16,\"sheet_y\":31,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"female\",\"girls\",\"lady\"],\"search\":\"woman,female,girls,lady\"},\"signal_strength\":{\"name\":\"Antenna with Bars\",\"unified\":\"1F4F6\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":16,\"short_names\":[\"signal_strength\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"reception\",\"phone\",\"internet\",\"connection\",\"wifi\",\"bluetooth\",\"bars\"],\"search\":\"signal,strength,antenna,with,bars,blue-square,reception,phone,internet,connection,wifi,bluetooth\"},\"person_with_blond_hair\":{\"name\":\"Person with Blond Hair\",\"unified\":\"1F471\",\"variations\":[],\"sheet_x\":17,\"sheet_y\":8,\"short_names\":[\"person_with_blond_hair\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F471-1F3FB\":{\"unified\":\"1F471-1F3FB\",\"image\":\"1f471-1f3fb.png\",\"sheet_x\":17,\"sheet_y\":9,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F471-1F3FC\":{\"unified\":\"1F471-1F3FC\",\"image\":\"1f471-1f3fc.png\",\"sheet_x\":17,\"sheet_y\":10,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F471-1F3FD\":{\"unified\":\"1F471-1F3FD\",\"image\":\"1f471-1f3fd.png\",\"sheet_x\":17,\"sheet_y\":11,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F471-1F3FE\":{\"unified\":\"1F471-1F3FE\",\"image\":\"1f471-1f3fe.png\",\"sheet_x\":17,\"sheet_y\":12,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F471-1F3FF\":{\"unified\":\"1F471-1F3FF\",\"image\":\"1f471-1f3ff.png\",\"sheet_x\":17,\"sheet_y\":13,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"man\",\"male\",\"boy\",\"blonde\",\"guy\"],\"search\":\"person,with,blond,hair,man,male,boy,blonde,guy\"},\"barely_sunny\":{\"name\":\"White Sun Behind Cloud\",\"unified\":\"1F325\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":15,\"short_names\":[\"barely_sunny\",\"sun_behind_cloud\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"barely,sunny,sun,behind,cloud,white\"},\"page_with_curl\":{\"name\":\"Page with Curl\",\"unified\":\"1F4C3\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":6,\"short_names\":[\"page_with_curl\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"documents\",\"office\",\"paper\"],\"search\":\"page,with,curl,documents,office,paper\"},\"flag-ly\":{\"name\":\"Regional Indicator Symbol Letters LY\",\"unified\":\"1F1F1-1F1FE\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":10,\"short_names\":[\"flag-ly\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ly,regional,indicator,symbol,letters\"},\"bookmark_tabs\":{\"name\":\"Bookmark Tabs\",\"unified\":\"1F4D1\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":20,\"short_names\":[\"bookmark_tabs\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"favorite\",\"save\",\"order\",\"tidy\"],\"search\":\"bookmark,tabs,favorite,save,order,tidy\"},\"flag-li\":{\"name\":\"Regional Indicator Symbol Letters LI\",\"unified\":\"1F1F1-1F1EE\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":3,\"short_names\":[\"flag-li\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,li,regional,indicator,symbol,letters\"},\"older_man\":{\"name\":\"Older Man\",\"unified\":\"1F474\",\"variations\":[],\"sheet_x\":17,\"sheet_y\":26,\"short_names\":[\"older_man\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F474-1F3FB\":{\"unified\":\"1F474-1F3FB\",\"image\":\"1f474-1f3fb.png\",\"sheet_x\":17,\"sheet_y\":27,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F474-1F3FC\":{\"unified\":\"1F474-1F3FC\",\"image\":\"1f474-1f3fc.png\",\"sheet_x\":17,\"sheet_y\":28,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F474-1F3FD\":{\"unified\":\"1F474-1F3FD\",\"image\":\"1f474-1f3fd.png\",\"sheet_x\":17,\"sheet_y\":29,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F474-1F3FE\":{\"unified\":\"1F474-1F3FE\",\"image\":\"1f474-1f3fe.png\",\"sheet_x\":17,\"sheet_y\":30,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F474-1F3FF\":{\"unified\":\"1F474-1F3FF\",\"image\":\"1f474-1f3ff.png\",\"sheet_x\":17,\"sheet_y\":31,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"human\",\"male\",\"men\"],\"search\":\"older,man,human,male,men\"},\"partly_sunny_rain\":{\"name\":\"White Sun Behind Cloud with Rain\",\"unified\":\"1F326\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":16,\"short_names\":[\"partly_sunny_rain\",\"sun_behind_rain_cloud\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"partly,sunny,rain,sun,behind,cloud,white,with\"},\"koko\":{\"name\":\"Squared Katakana Koko\",\"unified\":\"1F201\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":6,\"short_names\":[\"koko\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"here\",\"katakana\",\"japanese\",\"destination\"],\"search\":\"koko,squared,katakana,blue-square,here,japanese,destination\"},\"bar_chart\":{\"name\":\"Bar Chart\",\"unified\":\"1F4CA\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":13,\"short_names\":[\"bar_chart\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"graph\",\"presentation\",\"stats\"],\"search\":\"bar,chart,graph,presentation,stats\"},\"cloud\":{\"name\":\"Cloud\",\"unified\":\"2601\",\"variations\":[\"2601-FE0F\"],\"sheet_x\":1,\"sheet_y\":1,\"short_names\":[\"cloud\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"weather\",\"sky\"],\"search\":\"cloud,weather,sky\"},\"ng\":{\"name\":\"Squared Ng\",\"unified\":\"1F196\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":1,\"short_names\":[\"ng\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"words\",\"shape\",\"icon\"],\"search\":\"ng,squared,blue-square,words,shape,icon\"},\"flag-lt\":{\"name\":\"Regional Indicator Symbol Letters LT\",\"unified\":\"1F1F1-1F1F9\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":7,\"short_names\":[\"flag-lt\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,lt,regional,indicator,symbol,letters\"},\"older_woman\":{\"name\":\"Older Woman\",\"unified\":\"1F475\",\"variations\":[],\"sheet_x\":17,\"sheet_y\":32,\"short_names\":[\"older_woman\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F475-1F3FB\":{\"unified\":\"1F475-1F3FB\",\"image\":\"1f475-1f3fb.png\",\"sheet_x\":17,\"sheet_y\":33,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F475-1F3FC\":{\"unified\":\"1F475-1F3FC\",\"image\":\"1f475-1f3fc.png\",\"sheet_x\":17,\"sheet_y\":34,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F475-1F3FD\":{\"unified\":\"1F475-1F3FD\",\"image\":\"1f475-1f3fd.png\",\"sheet_x\":17,\"sheet_y\":35,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F475-1F3FE\":{\"unified\":\"1F475-1F3FE\",\"image\":\"1f475-1f3fe.png\",\"sheet_x\":17,\"sheet_y\":36,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F475-1F3FF\":{\"unified\":\"1F475-1F3FF\",\"image\":\"1f475-1f3ff.png\",\"sheet_x\":17,\"sheet_y\":37,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"female\",\"women\",\"girl\",\"lady\"],\"search\":\"older,woman,female,women,girl,lady\"},\"rain_cloud\":{\"name\":\"Cloud with Rain\",\"unified\":\"1F327\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":17,\"short_names\":[\"rain_cloud\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"rain,cloud,with\"},\"flag-lu\":{\"name\":\"Regional Indicator Symbol Letters LU\",\"unified\":\"1F1F1-1F1FA\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":8,\"short_names\":[\"flag-lu\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,lu,regional,indicator,symbol,letters\"},\"chart_with_upwards_trend\":{\"name\":\"Chart with Upwards Trend\",\"unified\":\"1F4C8\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":11,\"short_names\":[\"chart_with_upwards_trend\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"graph\",\"presentation\",\"stats\",\"recovery\",\"business\",\"economics\",\"money\",\"sales\",\"good\",\"success\"],\"search\":\"chart,with,upwards,trend,graph,presentation,stats,recovery,business,economics,money,sales,good,success\"},\"ok\":{\"name\":\"Squared Ok\",\"unified\":\"1F197\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":2,\"short_names\":[\"ok\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"good\",\"agree\",\"yes\",\"blue-square\"],\"search\":\"ok,squared,good,agree,yes,blue-square\"},\"man_with_gua_pi_mao\":{\"name\":\"Man with Gua Pi Mao\",\"unified\":\"1F472\",\"variations\":[],\"sheet_x\":17,\"sheet_y\":14,\"short_names\":[\"man_with_gua_pi_mao\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F472-1F3FB\":{\"unified\":\"1F472-1F3FB\",\"image\":\"1f472-1f3fb.png\",\"sheet_x\":17,\"sheet_y\":15,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F472-1F3FC\":{\"unified\":\"1F472-1F3FC\",\"image\":\"1f472-1f3fc.png\",\"sheet_x\":17,\"sheet_y\":16,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F472-1F3FD\":{\"unified\":\"1F472-1F3FD\",\"image\":\"1f472-1f3fd.png\",\"sheet_x\":17,\"sheet_y\":17,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F472-1F3FE\":{\"unified\":\"1F472-1F3FE\",\"image\":\"1f472-1f3fe.png\",\"sheet_x\":17,\"sheet_y\":18,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F472-1F3FF\":{\"unified\":\"1F472-1F3FF\",\"image\":\"1f472-1f3ff.png\",\"sheet_x\":17,\"sheet_y\":19,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"male\",\"boy\"],\"search\":\"man,with,gua,pi,mao,male,boy\"},\"thunder_cloud_and_rain\":{\"name\":\"Thunder Cloud and Rain\",\"unified\":\"26C8\",\"variations\":[],\"sheet_x\":2,\"sheet_y\":22,\"short_names\":[\"thunder_cloud_and_rain\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"weather\",\"lightning\"],\"search\":\"thunder,cloud,and,rain,weather,lightning\"},\"up\":{\"name\":\"Squared Up with Exclamation Mark\",\"unified\":\"1F199\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":4,\"short_names\":[\"up\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"above\",\"high\"],\"search\":\"up,squared,with,exclamation,mark,blue-square,above,high\"},\"man_with_turban\":{\"name\":\"Man with Turban\",\"unified\":\"1F473\",\"variations\":[],\"sheet_x\":17,\"sheet_y\":20,\"short_names\":[\"man_with_turban\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F473-1F3FB\":{\"unified\":\"1F473-1F3FB\",\"image\":\"1f473-1f3fb.png\",\"sheet_x\":17,\"sheet_y\":21,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F473-1F3FC\":{\"unified\":\"1F473-1F3FC\",\"image\":\"1f473-1f3fc.png\",\"sheet_x\":17,\"sheet_y\":22,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F473-1F3FD\":{\"unified\":\"1F473-1F3FD\",\"image\":\"1f473-1f3fd.png\",\"sheet_x\":17,\"sheet_y\":23,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F473-1F3FE\":{\"unified\":\"1F473-1F3FE\",\"image\":\"1f473-1f3fe.png\",\"sheet_x\":17,\"sheet_y\":24,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F473-1F3FF\":{\"unified\":\"1F473-1F3FF\",\"image\":\"1f473-1f3ff.png\",\"sheet_x\":17,\"sheet_y\":25,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"male\",\"indian\",\"hinduism\",\"arabs\"],\"search\":\"man,with,turban,male,indian,hinduism,arabs\"},\"chart_with_downwards_trend\":{\"name\":\"Chart with Downwards Trend\",\"unified\":\"1F4C9\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":12,\"short_names\":[\"chart_with_downwards_trend\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"graph\",\"presentation\",\"stats\",\"recession\",\"business\",\"economics\",\"money\",\"sales\",\"bad\",\"failure\"],\"search\":\"chart,with,downwards,trend,graph,presentation,stats,recession,business,economics,money,sales,bad,failure\"},\"flag-mo\":{\"name\":\"Regional Indicator Symbol Letters MO\",\"unified\":\"1F1F2-1F1F4\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":22,\"short_names\":[\"flag-mo\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,mo,regional,indicator,symbol,letters\"},\"page_facing_up\":{\"name\":\"Page Facing Up\",\"unified\":\"1F4C4\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":7,\"short_names\":[\"page_facing_up\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"documents\",\"office\",\"paper\",\"information\"],\"search\":\"page,facing,up,documents,office,paper,information\"},\"cool\":{\"name\":\"Squared Cool\",\"unified\":\"1F192\",\"variations\":[],\"sheet_x\":4,\"sheet_y\":38,\"short_names\":[\"cool\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"words\",\"blue-square\"],\"search\":\"cool,squared,words,blue-square\"},\"lightning\":{\"name\":\"Cloud with Lightning\",\"unified\":\"1F329\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":19,\"short_names\":[\"lightning\",\"lightning_cloud\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"lightning,cloud,with\"},\"flag-mk\":{\"name\":\"Regional Indicator Symbol Letters MK\",\"unified\":\"1F1F2-1F1F0\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":18,\"short_names\":[\"flag-mk\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,mk,regional,indicator,symbol,letters\"},\"cop\":{\"name\":\"Police Officer\",\"unified\":\"1F46E\",\"variations\":[],\"sheet_x\":16,\"sheet_y\":36,\"short_names\":[\"cop\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F46E-1F3FB\":{\"unified\":\"1F46E-1F3FB\",\"image\":\"1f46e-1f3fb.png\",\"sheet_x\":16,\"sheet_y\":37,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F46E-1F3FC\":{\"unified\":\"1F46E-1F3FC\",\"image\":\"1f46e-1f3fc.png\",\"sheet_x\":16,\"sheet_y\":38,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F46E-1F3FD\":{\"unified\":\"1F46E-1F3FD\",\"image\":\"1f46e-1f3fd.png\",\"sheet_x\":16,\"sheet_y\":39,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F46E-1F3FE\":{\"unified\":\"1F46E-1F3FE\",\"image\":\"1f46e-1f3fe.png\",\"sheet_x\":16,\"sheet_y\":40,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F46E-1F3FF\":{\"unified\":\"1F46E-1F3FF\",\"image\":\"1f46e-1f3ff.png\",\"sheet_x\":17,\"sheet_y\":0,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"man\",\"police\",\"law\",\"legal\",\"enforcement\",\"arrest\",\"911\"],\"search\":\"cop,police,officer,man,law,legal,enforcement,arrest,911\"},\"flag-mg\":{\"name\":\"Regional Indicator Symbol Letters MG\",\"unified\":\"1F1F2-1F1EC\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":16,\"short_names\":[\"flag-mg\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,mg,regional,indicator,symbol,letters\"},\"date\":{\"name\":\"Calendar\",\"unified\":\"1F4C5\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":8,\"short_names\":[\"date\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"calendar\",\"schedule\"],\"search\":\"date,calendar,schedule\"},\"new\":{\"name\":\"Squared New\",\"unified\":\"1F195\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":0,\"short_names\":[\"new\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"words\",\"start\"],\"search\":\"new,squared,blue-square,words,start\"},\"zap\":{\"name\":\"High Voltage Sign\",\"unified\":\"26A1\",\"variations\":[\"26A1-FE0F\"],\"sheet_x\":2,\"sheet_y\":13,\"short_names\":[\"zap\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"thunder\",\"weather\",\"lightning bolt\",\"fast\"],\"search\":\"zap,high,voltage,sign,thunder,weather,lightning bolt,fast\"},\"construction_worker\":{\"name\":\"Construction Worker\",\"unified\":\"1F477\",\"variations\":[],\"sheet_x\":18,\"sheet_y\":3,\"short_names\":[\"construction_worker\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F477-1F3FB\":{\"unified\":\"1F477-1F3FB\",\"image\":\"1f477-1f3fb.png\",\"sheet_x\":18,\"sheet_y\":4,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F477-1F3FC\":{\"unified\":\"1F477-1F3FC\",\"image\":\"1f477-1f3fc.png\",\"sheet_x\":18,\"sheet_y\":5,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F477-1F3FD\":{\"unified\":\"1F477-1F3FD\",\"image\":\"1f477-1f3fd.png\",\"sheet_x\":18,\"sheet_y\":6,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F477-1F3FE\":{\"unified\":\"1F477-1F3FE\",\"image\":\"1f477-1f3fe.png\",\"sheet_x\":18,\"sheet_y\":7,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F477-1F3FF\":{\"unified\":\"1F477-1F3FF\",\"image\":\"1f477-1f3ff.png\",\"sheet_x\":18,\"sheet_y\":8,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"male\",\"human\",\"wip\",\"guy\",\"build\"],\"search\":\"construction,worker,male,human,wip,guy,build\"},\"guardsman\":{\"name\":\"Guardsman\",\"unified\":\"1F482\",\"variations\":[],\"sheet_x\":18,\"sheet_y\":34,\"short_names\":[\"guardsman\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F482-1F3FB\":{\"unified\":\"1F482-1F3FB\",\"image\":\"1f482-1f3fb.png\",\"sheet_x\":18,\"sheet_y\":35,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F482-1F3FC\":{\"unified\":\"1F482-1F3FC\",\"image\":\"1f482-1f3fc.png\",\"sheet_x\":18,\"sheet_y\":36,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F482-1F3FD\":{\"unified\":\"1F482-1F3FD\",\"image\":\"1f482-1f3fd.png\",\"sheet_x\":18,\"sheet_y\":37,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F482-1F3FE\":{\"unified\":\"1F482-1F3FE\",\"image\":\"1f482-1f3fe.png\",\"sheet_x\":18,\"sheet_y\":38,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F482-1F3FF\":{\"unified\":\"1F482-1F3FF\",\"image\":\"1f482-1f3ff.png\",\"sheet_x\":18,\"sheet_y\":39,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"uk\",\"gb\",\"british\",\"male\",\"guy\",\"royal\"],\"search\":\"guardsman,uk,gb,british,male,guy,royal\"},\"fire\":{\"name\":\"Fire\",\"unified\":\"1F525\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":21,\"short_names\":[\"fire\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"hot\",\"cook\",\"flame\"],\"search\":\"fire,hot,cook,flame\"},\"free\":{\"name\":\"Squared Free\",\"unified\":\"1F193\",\"variations\":[],\"sheet_x\":4,\"sheet_y\":39,\"short_names\":[\"free\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"words\"],\"search\":\"free,squared,blue-square,words\"},\"flag-mw\":{\"name\":\"Regional Indicator Symbol Letters MW\",\"unified\":\"1F1F2-1F1FC\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":30,\"short_names\":[\"flag-mw\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,mw,regional,indicator,symbol,letters\"},\"calendar\":{\"name\":\"Tear-off Calendar\",\"unified\":\"1F4C6\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":9,\"short_names\":[\"calendar\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"schedule\",\"date\",\"planning\"],\"search\":\"calendar,tear,off,schedule,date,planning\"},\"spiral_calendar_pad\":{\"name\":\"Spiral Calendar Pad\",\"unified\":\"1F5D3\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":0,\"short_names\":[\"spiral_calendar_pad\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"date\",\"schedule\",\"planning\"],\"search\":\"spiral,calendar,pad,date,schedule,planning\"},\"boom\":{\"name\":\"Collision Symbol\",\"unified\":\"1F4A5\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":12,\"short_names\":[\"boom\",\"collision\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"bomb\",\"explode\",\"explosion\",\"collision\",\"blown\"],\"search\":\"boom,collision,symbol,bomb,explode,explosion,blown\"},\"flag-my\":{\"name\":\"Regional Indicator Symbol Letters MY\",\"unified\":\"1F1F2-1F1FE\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":32,\"short_names\":[\"flag-my\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,my,regional,indicator,symbol,letters\"},\"zero\":{\"name\":\"Keycap 0\",\"unified\":\"0030-20E3\",\"variations\":[\"0030-FE0F-20E3\"],\"sheet_x\":32,\"sheet_y\":23,\"short_names\":[\"zero\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"0\",\"numbers\",\"blue-square\",\"null\"],\"search\":\"zero,keycap,0,numbers,blue-square,null\"},\"sleuth_or_spy\":{\"name\":\"Sleuth or Spy\",\"unified\":\"1F575\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":39,\"short_names\":[\"sleuth_or_spy\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F575-1F3FB\":{\"unified\":\"1F575-1F3FB\",\"image\":\"1f575-1f3fb.png\",\"sheet_x\":24,\"sheet_y\":40,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":false,\"has_img_emojione\":true},\"1F575-1F3FC\":{\"unified\":\"1F575-1F3FC\",\"image\":\"1f575-1f3fc.png\",\"sheet_x\":25,\"sheet_y\":0,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":false,\"has_img_emojione\":true},\"1F575-1F3FD\":{\"unified\":\"1F575-1F3FD\",\"image\":\"1f575-1f3fd.png\",\"sheet_x\":25,\"sheet_y\":1,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":false,\"has_img_emojione\":true},\"1F575-1F3FE\":{\"unified\":\"1F575-1F3FE\",\"image\":\"1f575-1f3fe.png\",\"sheet_x\":25,\"sheet_y\":2,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":false,\"has_img_emojione\":true},\"1F575-1F3FF\":{\"unified\":\"1F575-1F3FF\",\"image\":\"1f575-1f3ff.png\",\"sheet_x\":25,\"sheet_y\":3,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":false,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[],\"search\":\"sleuth,or,spy\"},\"one\":{\"name\":\"Keycap 1\",\"unified\":\"0031-20E3\",\"variations\":[\"0031-FE0F-20E3\"],\"sheet_x\":32,\"sheet_y\":24,\"short_names\":[\"one\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"numbers\",\"1\"],\"search\":\"one,keycap,1,blue-square,numbers\"},\"santa\":{\"name\":\"Father Christmas\",\"unified\":\"1F385\",\"variations\":[],\"sheet_x\":8,\"sheet_y\":29,\"short_names\":[\"santa\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F385-1F3FB\":{\"unified\":\"1F385-1F3FB\",\"image\":\"1f385-1f3fb.png\",\"sheet_x\":8,\"sheet_y\":30,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F385-1F3FC\":{\"unified\":\"1F385-1F3FC\",\"image\":\"1f385-1f3fc.png\",\"sheet_x\":8,\"sheet_y\":31,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F385-1F3FD\":{\"unified\":\"1F385-1F3FD\",\"image\":\"1f385-1f3fd.png\",\"sheet_x\":8,\"sheet_y\":32,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F385-1F3FE\":{\"unified\":\"1F385-1F3FE\",\"image\":\"1f385-1f3fe.png\",\"sheet_x\":8,\"sheet_y\":33,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F385-1F3FF\":{\"unified\":\"1F385-1F3FF\",\"image\":\"1f385-1f3ff.png\",\"sheet_x\":8,\"sheet_y\":34,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"festival\",\"man\",\"male\",\"xmas\",\"father christmas\"],\"search\":\"santa,father,christmas,festival,man,male,xmas,father christmas\"},\"card_index\":{\"name\":\"Card Index\",\"unified\":\"1F4C7\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":10,\"short_names\":[\"card_index\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"business\",\"stationery\"],\"search\":\"card,index,business,stationery\"},\"snowflake\":{\"name\":\"Snowflake\",\"unified\":\"2744\",\"variations\":[\"2744-FE0F\"],\"sheet_x\":4,\"sheet_y\":1,\"short_names\":[\"snowflake\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"winter\",\"season\",\"cold\",\"weather\",\"christmas\",\"xmas\"],\"search\":\"snowflake,winter,season,cold,weather,christmas,xmas\"},\"flag-mv\":{\"name\":\"Regional Indicator Symbol Letters MV\",\"unified\":\"1F1F2-1F1FB\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":29,\"short_names\":[\"flag-mv\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,mv,regional,indicator,symbol,letters\"},\"snow_cloud\":{\"name\":\"Cloud with Snow\",\"unified\":\"1F328\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":18,\"short_names\":[\"snow_cloud\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"snow,cloud,with\"},\"angel\":{\"name\":\"Baby Angel\",\"unified\":\"1F47C\",\"variations\":[],\"sheet_x\":18,\"sheet_y\":18,\"short_names\":[\"angel\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F47C-1F3FB\":{\"unified\":\"1F47C-1F3FB\",\"image\":\"1f47c-1f3fb.png\",\"sheet_x\":18,\"sheet_y\":19,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F47C-1F3FC\":{\"unified\":\"1F47C-1F3FC\",\"image\":\"1f47c-1f3fc.png\",\"sheet_x\":18,\"sheet_y\":20,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F47C-1F3FD\":{\"unified\":\"1F47C-1F3FD\",\"image\":\"1f47c-1f3fd.png\",\"sheet_x\":18,\"sheet_y\":21,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F47C-1F3FE\":{\"unified\":\"1F47C-1F3FE\",\"image\":\"1f47c-1f3fe.png\",\"sheet_x\":18,\"sheet_y\":22,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F47C-1F3FF\":{\"unified\":\"1F47C-1F3FF\",\"image\":\"1f47c-1f3ff.png\",\"sheet_x\":18,\"sheet_y\":23,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"heaven\",\"wings\",\"halo\"],\"search\":\"angel,baby,heaven,wings,halo\"},\"two\":{\"name\":\"Keycap 2\",\"unified\":\"0032-20E3\",\"variations\":[\"0032-FE0F-20E3\"],\"sheet_x\":32,\"sheet_y\":25,\"short_names\":[\"two\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"numbers\",\"2\",\"prime\",\"blue-square\"],\"search\":\"two,keycap,2,numbers,prime,blue-square\"},\"card_file_box\":{\"name\":\"Card File Box\",\"unified\":\"1F5C3\",\"variations\":[],\"sheet_x\":25,\"sheet_y\":37,\"short_names\":[\"card_file_box\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"business\",\"stationery\"],\"search\":\"card,file,box,business,stationery\"},\"flag-ml\":{\"name\":\"Regional Indicator Symbol Letters ML\",\"unified\":\"1F1F2-1F1F1\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":19,\"short_names\":[\"flag-ml\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ml,regional,indicator,symbol,letters\"},\"three\":{\"name\":\"Keycap 3\",\"unified\":\"0033-20E3\",\"variations\":[\"0033-FE0F-20E3\"],\"sheet_x\":32,\"sheet_y\":26,\"short_names\":[\"three\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"3\",\"numbers\",\"prime\",\"blue-square\"],\"search\":\"three,keycap,3,numbers,prime,blue-square\"},\"princess\":{\"name\":\"Princess\",\"unified\":\"1F478\",\"variations\":[],\"sheet_x\":18,\"sheet_y\":9,\"short_names\":[\"princess\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F478-1F3FB\":{\"unified\":\"1F478-1F3FB\",\"image\":\"1f478-1f3fb.png\",\"sheet_x\":18,\"sheet_y\":10,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F478-1F3FC\":{\"unified\":\"1F478-1F3FC\",\"image\":\"1f478-1f3fc.png\",\"sheet_x\":18,\"sheet_y\":11,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F478-1F3FD\":{\"unified\":\"1F478-1F3FD\",\"image\":\"1f478-1f3fd.png\",\"sheet_x\":18,\"sheet_y\":12,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F478-1F3FE\":{\"unified\":\"1F478-1F3FE\",\"image\":\"1f478-1f3fe.png\",\"sheet_x\":18,\"sheet_y\":13,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F478-1F3FF\":{\"unified\":\"1F478-1F3FF\",\"image\":\"1f478-1f3ff.png\",\"sheet_x\":18,\"sheet_y\":14,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"girl\",\"woman\",\"female\",\"blond\",\"crown\",\"royal\",\"queen\"],\"search\":\"princess,girl,woman,female,blond,crown,royal,queen\"},\"snowman\":{\"name\":\"Snowman\",\"unified\":\"2603\",\"variations\":[\"2603-FE0F\"],\"sheet_x\":1,\"sheet_y\":3,\"short_names\":[\"snowman\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"winter\",\"season\",\"cold\",\"weather\",\"christmas\",\"xmas\",\"frozen\",\"without_snow\"],\"search\":\"snowman,winter,season,cold,weather,christmas,xmas,frozen,without_snow\"},\"ballot_box_with_ballot\":{\"name\":\"Ballot Box with Ballot\",\"unified\":\"1F5F3\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":8,\"short_names\":[\"ballot_box_with_ballot\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"election\",\"vote\"],\"search\":\"ballot,box,with,election,vote\"},\"flag-mt\":{\"name\":\"Regional Indicator Symbol Letters MT\",\"unified\":\"1F1F2-1F1F9\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":27,\"short_names\":[\"flag-mt\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,mt,regional,indicator,symbol,letters\"},\"file_cabinet\":{\"name\":\"File Cabinet\",\"unified\":\"1F5C4\",\"variations\":[],\"sheet_x\":25,\"sheet_y\":38,\"short_names\":[\"file_cabinet\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"filing\",\"organizing\"],\"search\":\"file,cabinet,filing,organizing\"},\"bride_with_veil\":{\"name\":\"Bride with Veil\",\"unified\":\"1F470\",\"variations\":[],\"sheet_x\":17,\"sheet_y\":2,\"short_names\":[\"bride_with_veil\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F470-1F3FB\":{\"unified\":\"1F470-1F3FB\",\"image\":\"1f470-1f3fb.png\",\"sheet_x\":17,\"sheet_y\":3,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F470-1F3FC\":{\"unified\":\"1F470-1F3FC\",\"image\":\"1f470-1f3fc.png\",\"sheet_x\":17,\"sheet_y\":4,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F470-1F3FD\":{\"unified\":\"1F470-1F3FD\",\"image\":\"1f470-1f3fd.png\",\"sheet_x\":17,\"sheet_y\":5,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F470-1F3FE\":{\"unified\":\"1F470-1F3FE\",\"image\":\"1f470-1f3fe.png\",\"sheet_x\":17,\"sheet_y\":6,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F470-1F3FF\":{\"unified\":\"1F470-1F3FF\",\"image\":\"1f470-1f3ff.png\",\"sheet_x\":17,\"sheet_y\":7,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"couple\",\"marriage\",\"wedding\"],\"search\":\"bride,with,veil,couple,marriage,wedding\"},\"flag-mh\":{\"name\":\"Regional Indicator Symbol Letters MH\",\"unified\":\"1F1F2-1F1ED\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":17,\"short_names\":[\"flag-mh\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,mh,regional,indicator,symbol,letters\"},\"snowman_without_snow\":{\"name\":\"Snowman Without Snow\",\"unified\":\"26C4\",\"variations\":[\"26C4-FE0F\"],\"sheet_x\":2,\"sheet_y\":20,\"short_names\":[\"snowman_without_snow\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"snowman,without,snow\"},\"four\":{\"name\":\"Keycap 4\",\"unified\":\"0034-20E3\",\"variations\":[\"0034-FE0F-20E3\"],\"sheet_x\":32,\"sheet_y\":27,\"short_names\":[\"four\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"4\",\"numbers\",\"blue-square\"],\"search\":\"four,keycap,4,numbers,blue-square\"},\"clipboard\":{\"name\":\"Clipboard\",\"unified\":\"1F4CB\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":14,\"short_names\":[\"clipboard\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"stationery\",\"documents\"],\"search\":\"clipboard,stationery,documents\"},\"wind_blowing_face\":{\"name\":\"Wind Blowing Face\",\"unified\":\"1F32C\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":22,\"short_names\":[\"wind_blowing_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"gust\",\"air\"],\"search\":\"wind,blowing,face,gust,air\"},\"five\":{\"name\":\"Keycap 5\",\"unified\":\"0035-20E3\",\"variations\":[\"0035-FE0F-20E3\"],\"sheet_x\":32,\"sheet_y\":28,\"short_names\":[\"five\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"5\",\"numbers\",\"blue-square\",\"prime\"],\"search\":\"five,keycap,5,numbers,blue-square,prime\"},\"walking\":{\"name\":\"Pedestrian\",\"unified\":\"1F6B6\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":40,\"short_names\":[\"walking\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F6B6-1F3FB\":{\"unified\":\"1F6B6-1F3FB\",\"image\":\"1f6b6-1f3fb.png\",\"sheet_x\":31,\"sheet_y\":0,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F6B6-1F3FC\":{\"unified\":\"1F6B6-1F3FC\",\"image\":\"1f6b6-1f3fc.png\",\"sheet_x\":31,\"sheet_y\":1,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F6B6-1F3FD\":{\"unified\":\"1F6B6-1F3FD\",\"image\":\"1f6b6-1f3fd.png\",\"sheet_x\":31,\"sheet_y\":2,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F6B6-1F3FE\":{\"unified\":\"1F6B6-1F3FE\",\"image\":\"1f6b6-1f3fe.png\",\"sheet_x\":31,\"sheet_y\":3,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F6B6-1F3FF\":{\"unified\":\"1F6B6-1F3FF\",\"image\":\"1f6b6-1f3ff.png\",\"sheet_x\":31,\"sheet_y\":4,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"human\",\"feet\",\"steps\"],\"search\":\"walking,pedestrian,human,feet,steps\"},\"flag-mq\":{\"name\":\"Regional Indicator Symbol Letters MQ\",\"unified\":\"1F1F2-1F1F6\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":24,\"short_names\":[\"flag-mq\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,mq,regional,indicator,symbol,letters\"},\"six\":{\"name\":\"Keycap 6\",\"unified\":\"0036-20E3\",\"variations\":[\"0036-FE0F-20E3\"],\"sheet_x\":32,\"sheet_y\":29,\"short_names\":[\"six\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"6\",\"numbers\",\"blue-square\"],\"search\":\"six,keycap,6,numbers,blue-square\"},\"dash\":{\"name\":\"Dash Symbol\",\"unified\":\"1F4A8\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":15,\"short_names\":[\"dash\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"wind\",\"air\",\"fast\",\"shoo\",\"fart\",\"smoke\",\"puff\"],\"search\":\"dash,symbol,wind,air,fast,shoo,fart,smoke,puff\"},\"flag-mr\":{\"name\":\"Regional Indicator Symbol Letters MR\",\"unified\":\"1F1F2-1F1F7\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":25,\"short_names\":[\"flag-mr\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,mr,regional,indicator,symbol,letters\"},\"runner\":{\"name\":\"Runner\",\"unified\":\"1F3C3\",\"variations\":[],\"sheet_x\":10,\"sheet_y\":9,\"short_names\":[\"runner\",\"running\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F3C3-1F3FB\":{\"unified\":\"1F3C3-1F3FB\",\"image\":\"1f3c3-1f3fb.png\",\"sheet_x\":10,\"sheet_y\":10,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F3C3-1F3FC\":{\"unified\":\"1F3C3-1F3FC\",\"image\":\"1f3c3-1f3fc.png\",\"sheet_x\":10,\"sheet_y\":11,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F3C3-1F3FD\":{\"unified\":\"1F3C3-1F3FD\",\"image\":\"1f3c3-1f3fd.png\",\"sheet_x\":10,\"sheet_y\":12,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F3C3-1F3FE\":{\"unified\":\"1F3C3-1F3FE\",\"image\":\"1f3c3-1f3fe.png\",\"sheet_x\":10,\"sheet_y\":13,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F3C3-1F3FF\":{\"unified\":\"1F3C3-1F3FF\",\"image\":\"1f3c3-1f3ff.png\",\"sheet_x\":10,\"sheet_y\":14,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"man\",\"walking\",\"exercise\",\"race\",\"running\"],\"search\":\"runner,running,man,walking,exercise,race\"},\"spiral_note_pad\":{\"name\":\"Spiral Note Pad\",\"unified\":\"1F5D2\",\"variations\":[],\"sheet_x\":25,\"sheet_y\":40,\"short_names\":[\"spiral_note_pad\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"memo\",\"stationery\"],\"search\":\"spiral,note,pad,memo,stationery\"},\"seven\":{\"name\":\"Keycap 7\",\"unified\":\"0037-20E3\",\"variations\":[\"0037-FE0F-20E3\"],\"sheet_x\":32,\"sheet_y\":30,\"short_names\":[\"seven\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"7\",\"numbers\",\"blue-square\",\"prime\"],\"search\":\"seven,keycap,7,numbers,blue-square,prime\"},\"tornado\":{\"name\":\"Cloud with Tornado\",\"unified\":\"1F32A\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":20,\"short_names\":[\"tornado\",\"tornado_cloud\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"tornado,cloud,with\"},\"file_folder\":{\"name\":\"File Folder\",\"unified\":\"1F4C1\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":4,\"short_names\":[\"file_folder\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"documents\",\"business\",\"office\"],\"search\":\"file,folder,documents,business,office\"},\"flag-mu\":{\"name\":\"Regional Indicator Symbol Letters MU\",\"unified\":\"1F1F2-1F1FA\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":28,\"short_names\":[\"flag-mu\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,mu,regional,indicator,symbol,letters\"},\"dancer\":{\"name\":\"Dancer\",\"unified\":\"1F483\",\"variations\":[],\"sheet_x\":18,\"sheet_y\":40,\"short_names\":[\"dancer\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F483-1F3FB\":{\"unified\":\"1F483-1F3FB\",\"image\":\"1f483-1f3fb.png\",\"sheet_x\":19,\"sheet_y\":0,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F483-1F3FC\":{\"unified\":\"1F483-1F3FC\",\"image\":\"1f483-1f3fc.png\",\"sheet_x\":19,\"sheet_y\":1,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F483-1F3FD\":{\"unified\":\"1F483-1F3FD\",\"image\":\"1f483-1f3fd.png\",\"sheet_x\":19,\"sheet_y\":2,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F483-1F3FE\":{\"unified\":\"1F483-1F3FE\",\"image\":\"1f483-1f3fe.png\",\"sheet_x\":19,\"sheet_y\":3,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F483-1F3FF\":{\"unified\":\"1F483-1F3FF\",\"image\":\"1f483-1f3ff.png\",\"sheet_x\":19,\"sheet_y\":4,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"female\",\"girl\",\"woman\",\"fun\"],\"search\":\"dancer,female,girl,woman,fun\"},\"open_file_folder\":{\"name\":\"Open File Folder\",\"unified\":\"1F4C2\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":5,\"short_names\":[\"open_file_folder\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"documents\",\"load\"],\"search\":\"open,file,folder,documents,load\"},\"eight\":{\"name\":\"Keycap 8\",\"unified\":\"0038-20E3\",\"variations\":[\"0038-FE0F-20E3\"],\"sheet_x\":32,\"sheet_y\":31,\"short_names\":[\"eight\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"8\",\"blue-square\",\"numbers\"],\"search\":\"eight,keycap,8,blue-square,numbers\"},\"fog\":{\"name\":\"Fog\",\"unified\":\"1F32B\",\"variations\":[],\"sheet_x\":6,\"sheet_y\":21,\"short_names\":[\"fog\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"weather\"],\"search\":\"fog,weather\"},\"dancers\":{\"name\":\"Woman with Bunny Ears\",\"unified\":\"1F46F\",\"variations\":[],\"sheet_x\":17,\"sheet_y\":1,\"short_names\":[\"dancers\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"female\",\"bunny\",\"women\",\"girls\"],\"search\":\"dancers,woman,with,bunny,ears,female,women,girls\"},\"flag-yt\":{\"name\":\"Regional Indicator Symbol Letters YT\",\"unified\":\"1F1FE-1F1F9\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":40,\"short_names\":[\"flag-yt\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,yt,regional,indicator,symbol,letters\"},\"flag-mx\":{\"name\":\"Regional Indicator Symbol Letters MX\",\"unified\":\"1F1F2-1F1FD\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":31,\"short_names\":[\"flag-mx\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,mx,regional,indicator,symbol,letters\"},\"card_index_dividers\":{\"name\":\"Card Index Dividers\",\"unified\":\"1F5C2\",\"variations\":[],\"sheet_x\":25,\"sheet_y\":36,\"short_names\":[\"card_index_dividers\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"organizing\",\"business\",\"stationery\"],\"search\":\"card,index,dividers,organizing,business,stationery\"},\"couple\":{\"name\":\"Man and Woman Holding Hands\",\"unified\":\"1F46B\",\"variations\":[],\"sheet_x\":16,\"sheet_y\":33,\"short_names\":[\"couple\",\"man_and_woman_holding_hands\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"pair\",\"people\",\"human\",\"love\",\"date\",\"dating\",\"like\",\"affection\",\"valentines\",\"marriage\"],\"search\":\"couple,man,and,woman,holding,hands,pair,people,human,love,date,dating,like,affection,valentines,marriage\"},\"umbrella\":{\"name\":\"Umbrella\",\"unified\":\"2602\",\"variations\":[\"2602-FE0F\"],\"sheet_x\":1,\"sheet_y\":2,\"short_names\":[\"umbrella\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"rainy\",\"weather\",\"spring\"],\"search\":\"umbrella,rainy,weather,spring\"},\"nine\":{\"name\":\"Keycap 9\",\"unified\":\"0039-20E3\",\"variations\":[\"0039-FE0F-20E3\"],\"sheet_x\":32,\"sheet_y\":32,\"short_names\":[\"nine\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"numbers\",\"9\"],\"search\":\"nine,keycap,9,blue-square,numbers\"},\"rolled_up_newspaper\":{\"name\":\"Rolled-Up Newspaper\",\"unified\":\"1F5DE\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":3,\"short_names\":[\"rolled_up_newspaper\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"press\",\"headline\"],\"search\":\"rolled,up,newspaper,press,headline\"},\"flag-fm\":{\"name\":\"Regional Indicator Symbol Letters FM\",\"unified\":\"1F1EB-1F1F2\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":28,\"short_names\":[\"flag-fm\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,fm,regional,indicator,symbol,letters\"},\"umbrella_with_rain_drops\":{\"name\":\"Umbrella with Rain Drops\",\"unified\":\"2614\",\"variations\":[\"2614-FE0F\"],\"sheet_x\":1,\"sheet_y\":7,\"short_names\":[\"umbrella_with_rain_drops\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"umbrella,with,rain,drops\"},\"two_men_holding_hands\":{\"name\":\"Two Men Holding Hands\",\"unified\":\"1F46C\",\"variations\":[],\"sheet_x\":16,\"sheet_y\":34,\"short_names\":[\"two_men_holding_hands\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"pair\",\"couple\",\"love\",\"like\",\"bromance\",\"friendship\",\"people\",\"human\"],\"search\":\"two,men,holding,hands,pair,couple,love,like,bromance,friendship,people,human\"},\"keycap_ten\":{\"name\":\"Keycap Ten\",\"unified\":\"1F51F\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":15,\"short_names\":[\"keycap_ten\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"numbers\",\"10\",\"blue-square\"],\"search\":\"keycap,ten,numbers,10,blue-square\"},\"newspaper\":{\"name\":\"Newspaper\",\"unified\":\"1F4F0\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":10,\"short_names\":[\"newspaper\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"press\",\"headline\"],\"search\":\"newspaper,press,headline\"},\"keycap_star\":{\"name\":\"Keycap Star\",\"unified\":\"002A-20E3\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":22,\"short_names\":[\"keycap_star\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"asterisk\"],\"search\":\"keycap,star,asterisk\"},\"flag-md\":{\"name\":\"Regional Indicator Symbol Letters MD\",\"unified\":\"1F1F2-1F1E9\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":13,\"short_names\":[\"flag-md\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,md,regional,indicator,symbol,letters\"},\"two_women_holding_hands\":{\"name\":\"Two Women Holding Hands\",\"unified\":\"1F46D\",\"variations\":[],\"sheet_x\":16,\"sheet_y\":35,\"short_names\":[\"two_women_holding_hands\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"pair\",\"friendship\",\"couple\",\"love\",\"like\",\"female\",\"people\",\"human\"],\"search\":\"two,women,holding,hands,pair,friendship,couple,love,like,female,people,human\"},\"droplet\":{\"name\":\"Droplet\",\"unified\":\"1F4A7\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":14,\"short_names\":[\"droplet\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"water\",\"drip\",\"faucet\",\"spring\"],\"search\":\"droplet,water,drip,faucet,spring\"},\"bow\":{\"name\":\"Person Bowing Deeply\",\"unified\":\"1F647\",\"variations\":[],\"sheet_x\":28,\"sheet_y\":14,\"short_names\":[\"bow\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F647-1F3FB\":{\"unified\":\"1F647-1F3FB\",\"image\":\"1f647-1f3fb.png\",\"sheet_x\":28,\"sheet_y\":15,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F647-1F3FC\":{\"unified\":\"1F647-1F3FC\",\"image\":\"1f647-1f3fc.png\",\"sheet_x\":28,\"sheet_y\":16,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F647-1F3FD\":{\"unified\":\"1F647-1F3FD\",\"image\":\"1f647-1f3fd.png\",\"sheet_x\":28,\"sheet_y\":17,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F647-1F3FE\":{\"unified\":\"1F647-1F3FE\",\"image\":\"1f647-1f3fe.png\",\"sheet_x\":28,\"sheet_y\":18,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F647-1F3FF\":{\"unified\":\"1F647-1F3FF\",\"image\":\"1f647-1f3ff.png\",\"sheet_x\":28,\"sheet_y\":19,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"man\",\"male\",\"boy\"],\"search\":\"bow,person,bowing,deeply,man,male,boy\"},\"notebook\":{\"name\":\"Notebook\",\"unified\":\"1F4D3\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":22,\"short_names\":[\"notebook\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"stationery\",\"record\",\"notes\",\"paper\",\"study\"],\"search\":\"notebook,stationery,record,notes,paper,study\"},\"sweat_drops\":{\"name\":\"Splashing Sweat Symbol\",\"unified\":\"1F4A6\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":13,\"short_names\":[\"sweat_drops\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"water\",\"drip\",\"oops\"],\"search\":\"sweat,drops,splashing,symbol,water,drip,oops\"},\"flag-mc\":{\"name\":\"Regional Indicator Symbol Letters MC\",\"unified\":\"1F1F2-1F1E8\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":12,\"short_names\":[\"flag-mc\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,mc,regional,indicator,symbol,letters\"},\"closed_book\":{\"name\":\"Closed Book\",\"unified\":\"1F4D5\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":24,\"short_names\":[\"closed_book\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"read\",\"library\",\"knowledge\",\"textbook\",\"learn\"],\"search\":\"closed,book,read,library,knowledge,textbook,learn\"},\"flag-mn\":{\"name\":\"Regional Indicator Symbol Letters MN\",\"unified\":\"1F1F2-1F1F3\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":21,\"short_names\":[\"flag-mn\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,mn,regional,indicator,symbol,letters\"},\"arrow_forward\":{\"name\":\"Black Right-Pointing Triangle\",\"unified\":\"25B6\",\"variations\":[\"25B6-FE0F\"],\"sheet_x\":0,\"sheet_y\":35,\"short_names\":[\"arrow_forward\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"right\",\"direction\",\"play\"],\"search\":\"arrow,forward,black,right,pointing,triangle,blue-square,direction,play\"},\"information_desk_person\":{\"name\":\"Information Desk Person\",\"unified\":\"1F481\",\"variations\":[],\"sheet_x\":18,\"sheet_y\":28,\"short_names\":[\"information_desk_person\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F481-1F3FB\":{\"unified\":\"1F481-1F3FB\",\"image\":\"1f481-1f3fb.png\",\"sheet_x\":18,\"sheet_y\":29,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F481-1F3FC\":{\"unified\":\"1F481-1F3FC\",\"image\":\"1f481-1f3fc.png\",\"sheet_x\":18,\"sheet_y\":30,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F481-1F3FD\":{\"unified\":\"1F481-1F3FD\",\"image\":\"1f481-1f3fd.png\",\"sheet_x\":18,\"sheet_y\":31,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F481-1F3FE\":{\"unified\":\"1F481-1F3FE\",\"image\":\"1f481-1f3fe.png\",\"sheet_x\":18,\"sheet_y\":32,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F481-1F3FF\":{\"unified\":\"1F481-1F3FF\",\"image\":\"1f481-1f3ff.png\",\"sheet_x\":18,\"sheet_y\":33,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"female\",\"girl\",\"woman\",\"human\"],\"search\":\"information,desk,person,female,girl,woman,human\"},\"ocean\":{\"name\":\"Water Wave\",\"unified\":\"1F30A\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":31,\"short_names\":[\"ocean\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sea\",\"water\",\"wave\",\"nature\",\"tsunami\",\"disaster\"],\"search\":\"ocean,water,wave,sea,nature,tsunami,disaster\"},\"double_vertical_bar\":{\"name\":\"Double Vertical Bar\",\"unified\":\"23F8\",\"variations\":[],\"sheet_x\":0,\"sheet_y\":29,\"short_names\":[\"double_vertical_bar\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"pause\",\"blue-square\"],\"search\":\"double,vertical,bar,pause,blue-square\"},\"green_book\":{\"name\":\"Green Book\",\"unified\":\"1F4D7\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":26,\"short_names\":[\"green_book\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"read\",\"library\",\"knowledge\",\"study\"],\"search\":\"green,book,read,library,knowledge,study\"},\"no_good\":{\"name\":\"Face with No Good Gesture\",\"unified\":\"1F645\",\"variations\":[],\"sheet_x\":28,\"sheet_y\":2,\"short_names\":[\"no_good\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F645-1F3FB\":{\"unified\":\"1F645-1F3FB\",\"image\":\"1f645-1f3fb.png\",\"sheet_x\":28,\"sheet_y\":3,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F645-1F3FC\":{\"unified\":\"1F645-1F3FC\",\"image\":\"1f645-1f3fc.png\",\"sheet_x\":28,\"sheet_y\":4,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F645-1F3FD\":{\"unified\":\"1F645-1F3FD\",\"image\":\"1f645-1f3fd.png\",\"sheet_x\":28,\"sheet_y\":5,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F645-1F3FE\":{\"unified\":\"1F645-1F3FE\",\"image\":\"1f645-1f3fe.png\",\"sheet_x\":28,\"sheet_y\":6,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F645-1F3FF\":{\"unified\":\"1F645-1F3FF\",\"image\":\"1f645-1f3ff.png\",\"sheet_x\":28,\"sheet_y\":7,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"female\",\"girl\",\"woman\",\"nope\"],\"search\":\"no,good,face,with,gesture,female,girl,woman,nope\"},\"flag-me\":{\"name\":\"Regional Indicator Symbol Letters ME\",\"unified\":\"1F1F2-1F1EA\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":14,\"short_names\":[\"flag-me\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,me,regional,indicator,symbol,letters\"},\"flag-ms\":{\"name\":\"Regional Indicator Symbol Letters MS\",\"unified\":\"1F1F2-1F1F8\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":26,\"short_names\":[\"flag-ms\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ms,regional,indicator,symbol,letters\"},\"ok_woman\":{\"name\":\"Face with Ok Gesture\",\"unified\":\"1F646\",\"variations\":[],\"sheet_x\":28,\"sheet_y\":8,\"short_names\":[\"ok_woman\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F646-1F3FB\":{\"unified\":\"1F646-1F3FB\",\"image\":\"1f646-1f3fb.png\",\"sheet_x\":28,\"sheet_y\":9,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F646-1F3FC\":{\"unified\":\"1F646-1F3FC\",\"image\":\"1f646-1f3fc.png\",\"sheet_x\":28,\"sheet_y\":10,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F646-1F3FD\":{\"unified\":\"1F646-1F3FD\",\"image\":\"1f646-1f3fd.png\",\"sheet_x\":28,\"sheet_y\":11,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F646-1F3FE\":{\"unified\":\"1F646-1F3FE\",\"image\":\"1f646-1f3fe.png\",\"sheet_x\":28,\"sheet_y\":12,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F646-1F3FF\":{\"unified\":\"1F646-1F3FF\",\"image\":\"1f646-1f3ff.png\",\"sheet_x\":28,\"sheet_y\":13,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"women\",\"girl\",\"female\",\"pink\",\"human\"],\"search\":\"ok,woman,face,with,gesture,women,girl,female,pink,human\"},\"blue_book\":{\"name\":\"Blue Book\",\"unified\":\"1F4D8\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":27,\"short_names\":[\"blue_book\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"read\",\"library\",\"knowledge\",\"learn\",\"study\"],\"search\":\"blue,book,read,library,knowledge,learn,study\"},\"black_right_pointing_triangle_with_double_vertical_bar\":{\"name\":\"Black Right-Pointing Triangle with Double Vertical Bar\",\"unified\":\"23EF\",\"variations\":[],\"sheet_x\":0,\"sheet_y\":24,\"short_names\":[\"black_right_pointing_triangle_with_double_vertical_bar\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"forward\",\"next\",\"blue-square\"],\"search\":\"black,right,pointing,triangle,with,double,vertical,bar,forward,next,blue-square\"},\"raising_hand\":{\"name\":\"Happy Person Raising One Hand\",\"unified\":\"1F64B\",\"variations\":[],\"sheet_x\":28,\"sheet_y\":23,\"short_names\":[\"raising_hand\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F64B-1F3FB\":{\"unified\":\"1F64B-1F3FB\",\"image\":\"1f64b-1f3fb.png\",\"sheet_x\":28,\"sheet_y\":24,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F64B-1F3FC\":{\"unified\":\"1F64B-1F3FC\",\"image\":\"1f64b-1f3fc.png\",\"sheet_x\":28,\"sheet_y\":25,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F64B-1F3FD\":{\"unified\":\"1F64B-1F3FD\",\"image\":\"1f64b-1f3fd.png\",\"sheet_x\":28,\"sheet_y\":26,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F64B-1F3FE\":{\"unified\":\"1F64B-1F3FE\",\"image\":\"1f64b-1f3fe.png\",\"sheet_x\":28,\"sheet_y\":27,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F64B-1F3FF\":{\"unified\":\"1F64B-1F3FF\",\"image\":\"1f64b-1f3ff.png\",\"sheet_x\":28,\"sheet_y\":28,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"female\",\"girl\",\"woman\"],\"search\":\"raising,hand,happy,person,one,female,girl,woman\"},\"black_square_for_stop\":{\"name\":\"Black Square for Stop\",\"unified\":\"23F9\",\"variations\":[],\"sheet_x\":0,\"sheet_y\":30,\"short_names\":[\"black_square_for_stop\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\"],\"search\":\"black,square,for,stop,blue-square\"},\"orange_book\":{\"name\":\"Orange Book\",\"unified\":\"1F4D9\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":28,\"short_names\":[\"orange_book\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"read\",\"library\",\"knowledge\",\"textbook\",\"study\"],\"search\":\"orange,book,read,library,knowledge,textbook,study\"},\"flag-ma\":{\"name\":\"Regional Indicator Symbol Letters MA\",\"unified\":\"1F1F2-1F1E6\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":11,\"short_names\":[\"flag-ma\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ma,regional,indicator,symbol,letters\"},\"flag-mz\":{\"name\":\"Regional Indicator Symbol Letters MZ\",\"unified\":\"1F1F2-1F1FF\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":33,\"short_names\":[\"flag-mz\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,mz,regional,indicator,symbol,letters\"},\"notebook_with_decorative_cover\":{\"name\":\"Notebook with Decorative Cover\",\"unified\":\"1F4D4\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":23,\"short_names\":[\"notebook_with_decorative_cover\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"classroom\",\"notes\",\"record\",\"paper\",\"study\"],\"search\":\"notebook,with,decorative,cover,classroom,notes,record,paper,study\"},\"person_with_pouting_face\":{\"name\":\"Person with Pouting Face\",\"unified\":\"1F64E\",\"variations\":[],\"sheet_x\":29,\"sheet_y\":0,\"short_names\":[\"person_with_pouting_face\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F64E-1F3FB\":{\"unified\":\"1F64E-1F3FB\",\"image\":\"1f64e-1f3fb.png\",\"sheet_x\":29,\"sheet_y\":1,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F64E-1F3FC\":{\"unified\":\"1F64E-1F3FC\",\"image\":\"1f64e-1f3fc.png\",\"sheet_x\":29,\"sheet_y\":2,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F64E-1F3FD\":{\"unified\":\"1F64E-1F3FD\",\"image\":\"1f64e-1f3fd.png\",\"sheet_x\":29,\"sheet_y\":3,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F64E-1F3FE\":{\"unified\":\"1F64E-1F3FE\",\"image\":\"1f64e-1f3fe.png\",\"sheet_x\":29,\"sheet_y\":4,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F64E-1F3FF\":{\"unified\":\"1F64E-1F3FF\",\"image\":\"1f64e-1f3ff.png\",\"sheet_x\":29,\"sheet_y\":5,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"female\",\"girl\",\"woman\"],\"search\":\"person,with,pouting,face,female,girl,woman\"},\"eject\":{\"name\":\"Eject Symbol\",\"unified\":\"23CF\",\"variations\":[],\"sheet_x\":0,\"sheet_y\":17,\"short_names\":[\"eject\"],\"has_img_apple\":false,\"has_img_google\":true,\"has_img_twitter\":false,\"has_img_emojione\":false,\"emoticons\":[],\"keywords\":[],\"search\":\"eject,symbol\"},\"black_circle_for_record\":{\"name\":\"Black Circle for Record\",\"unified\":\"23FA\",\"variations\":[],\"sheet_x\":0,\"sheet_y\":31,\"short_names\":[\"black_circle_for_record\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\"],\"search\":\"black,circle,for,record,blue-square\"},\"flag-mm\":{\"name\":\"Regional Indicator Symbol Letters MM\",\"unified\":\"1F1F2-1F1F2\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":20,\"short_names\":[\"flag-mm\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,mm,regional,indicator,symbol,letters\"},\"person_frowning\":{\"name\":\"Person Frowning\",\"unified\":\"1F64D\",\"variations\":[],\"sheet_x\":28,\"sheet_y\":35,\"short_names\":[\"person_frowning\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F64D-1F3FB\":{\"unified\":\"1F64D-1F3FB\",\"image\":\"1f64d-1f3fb.png\",\"sheet_x\":28,\"sheet_y\":36,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F64D-1F3FC\":{\"unified\":\"1F64D-1F3FC\",\"image\":\"1f64d-1f3fc.png\",\"sheet_x\":28,\"sheet_y\":37,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F64D-1F3FD\":{\"unified\":\"1F64D-1F3FD\",\"image\":\"1f64d-1f3fd.png\",\"sheet_x\":28,\"sheet_y\":38,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F64D-1F3FE\":{\"unified\":\"1F64D-1F3FE\",\"image\":\"1f64d-1f3fe.png\",\"sheet_x\":28,\"sheet_y\":39,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F64D-1F3FF\":{\"unified\":\"1F64D-1F3FF\",\"image\":\"1f64d-1f3ff.png\",\"sheet_x\":28,\"sheet_y\":40,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"female\",\"girl\",\"woman\",\"sad\",\"depressed\",\"discouraged\",\"unhappy\"],\"search\":\"person,frowning,female,girl,woman,sad,depressed,discouraged,unhappy\"},\"ledger\":{\"name\":\"Ledger\",\"unified\":\"1F4D2\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":21,\"short_names\":[\"ledger\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"notes\",\"paper\"],\"search\":\"ledger,notes,paper\"},\"flag-na\":{\"name\":\"Regional Indicator Symbol Letters NA\",\"unified\":\"1F1F3-1F1E6\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":34,\"short_names\":[\"flag-na\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,na,regional,indicator,symbol,letters\"},\"haircut\":{\"name\":\"Haircut\",\"unified\":\"1F487\",\"variations\":[],\"sheet_x\":19,\"sheet_y\":18,\"short_names\":[\"haircut\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F487-1F3FB\":{\"unified\":\"1F487-1F3FB\",\"image\":\"1f487-1f3fb.png\",\"sheet_x\":19,\"sheet_y\":19,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F487-1F3FC\":{\"unified\":\"1F487-1F3FC\",\"image\":\"1f487-1f3fc.png\",\"sheet_x\":19,\"sheet_y\":20,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F487-1F3FD\":{\"unified\":\"1F487-1F3FD\",\"image\":\"1f487-1f3fd.png\",\"sheet_x\":19,\"sheet_y\":21,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F487-1F3FE\":{\"unified\":\"1F487-1F3FE\",\"image\":\"1f487-1f3fe.png\",\"sheet_x\":19,\"sheet_y\":22,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F487-1F3FF\":{\"unified\":\"1F487-1F3FF\",\"image\":\"1f487-1f3ff.png\",\"sheet_x\":19,\"sheet_y\":23,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"female\",\"girl\",\"woman\"],\"search\":\"haircut,female,girl,woman\"},\"books\":{\"name\":\"Books\",\"unified\":\"1F4DA\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":29,\"short_names\":[\"books\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"literature\",\"library\",\"study\"],\"search\":\"books,literature,library,study\"},\"black_right_pointing_double_triangle_with_vertical_bar\":{\"name\":\"Black Right-Pointing Double Triangle with Vertical Bar\",\"unified\":\"23ED\",\"variations\":[],\"sheet_x\":0,\"sheet_y\":22,\"short_names\":[\"black_right_pointing_double_triangle_with_vertical_bar\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"play\",\"pause\"],\"search\":\"black,right,pointing,double,triangle,with,vertical,bar,blue-square,play,pause\"},\"book\":{\"name\":\"Open Book\",\"unified\":\"1F4D6\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":25,\"short_names\":[\"book\",\"open_book\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"open_book\",\"read\",\"library\",\"knowledge\",\"literature\",\"learn\",\"study\"],\"search\":\"book,open,open_book,read,library,knowledge,literature,learn,study\"},\"flag-nr\":{\"name\":\"Regional Indicator Symbol Letters NR\",\"unified\":\"1F1F3-1F1F7\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":2,\"short_names\":[\"flag-nr\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,nr,regional,indicator,symbol,letters\"},\"black_left_pointing_double_triangle_with_vertical_bar\":{\"name\":\"Black Left-Pointing Double Triangle with Vertical Bar\",\"unified\":\"23EE\",\"variations\":[],\"sheet_x\":0,\"sheet_y\":23,\"short_names\":[\"black_left_pointing_double_triangle_with_vertical_bar\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"backward\"],\"search\":\"black,left,pointing,double,triangle,with,vertical,bar,backward\"},\"massage\":{\"name\":\"Face Massage\",\"unified\":\"1F486\",\"variations\":[],\"sheet_x\":19,\"sheet_y\":12,\"short_names\":[\"massage\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"skin_variations\":{\"1F486-1F3FB\":{\"unified\":\"1F486-1F3FB\",\"image\":\"1f486-1f3fb.png\",\"sheet_x\":19,\"sheet_y\":13,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F486-1F3FC\":{\"unified\":\"1F486-1F3FC\",\"image\":\"1f486-1f3fc.png\",\"sheet_x\":19,\"sheet_y\":14,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F486-1F3FD\":{\"unified\":\"1F486-1F3FD\",\"image\":\"1f486-1f3fd.png\",\"sheet_x\":19,\"sheet_y\":15,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F486-1F3FE\":{\"unified\":\"1F486-1F3FE\",\"image\":\"1f486-1f3fe.png\",\"sheet_x\":19,\"sheet_y\":16,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true},\"1F486-1F3FF\":{\"unified\":\"1F486-1F3FF\",\"image\":\"1f486-1f3ff.png\",\"sheet_x\":19,\"sheet_y\":17,\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true}},\"emoticons\":[],\"keywords\":[\"female\",\"girl\",\"woman\",\"head\"],\"search\":\"massage,face,female,girl,woman,head\"},\"couple_with_heart\":{\"name\":\"Couple with Heart\",\"unified\":\"1F491\",\"variations\":[],\"sheet_x\":19,\"sheet_y\":33,\"short_names\":[\"couple_with_heart\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"pair\",\"love\",\"like\",\"affection\",\"human\",\"dating\",\"valentines\",\"marriage\"],\"search\":\"couple,with,heart,pair,love,like,affection,human,dating,valentines,marriage\"},\"fast_forward\":{\"name\":\"Black Right-Pointing Double Triangle\",\"unified\":\"23E9\",\"variations\":[],\"sheet_x\":0,\"sheet_y\":18,\"short_names\":[\"fast_forward\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"play\",\"speed\",\"continue\"],\"search\":\"fast,forward,black,right,pointing,double,triangle,blue-square,play,speed,continue\"},\"flag-np\":{\"name\":\"Regional Indicator Symbol Letters NP\",\"unified\":\"1F1F3-1F1F5\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":1,\"short_names\":[\"flag-np\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,np,regional,indicator,symbol,letters\"},\"link\":{\"name\":\"Link Symbol\",\"unified\":\"1F517\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":7,\"short_names\":[\"link\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"rings\",\"url\"],\"search\":\"link,symbol,rings,url\"},\"paperclip\":{\"name\":\"Paperclip\",\"unified\":\"1F4CE\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":17,\"short_names\":[\"paperclip\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"documents\",\"stationery\"],\"search\":\"paperclip,documents,stationery\"},\"rewind\":{\"name\":\"Black Left-Pointing Double Triangle\",\"unified\":\"23EA\",\"variations\":[],\"sheet_x\":0,\"sheet_y\":19,\"short_names\":[\"rewind\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"play\",\"blue-square\"],\"search\":\"rewind,black,left,pointing,double,triangle,play,blue-square\"},\"woman-heart-woman\":{\"name\":\"Woman Heart Woman\",\"unified\":\"1F469-200D-2764-FE0F-200D-1F469\",\"variations\":[],\"sheet_x\":39,\"sheet_y\":19,\"short_names\":[\"woman-heart-woman\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":false,\"emoticons\":[],\"keywords\":[],\"search\":\"woman,heart\"},\"flag-nl\":{\"name\":\"Regional Indicator Symbol Letters NL\",\"unified\":\"1F1F3-1F1F1\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":40,\"short_names\":[\"flag-nl\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,nl,regional,indicator,symbol,letters\"},\"linked_paperclips\":{\"name\":\"Linked Paperclips\",\"unified\":\"1F587\",\"variations\":[],\"sheet_x\":25,\"sheet_y\":8,\"short_names\":[\"linked_paperclips\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"documents\",\"stationery\"],\"search\":\"linked,paperclips,documents,stationery\"},\"man-heart-man\":{\"name\":\"Man Heart Man\",\"unified\":\"1F468-200D-2764-FE0F-200D-1F468\",\"variations\":[],\"sheet_x\":39,\"sheet_y\":12,\"short_names\":[\"man-heart-man\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":false,\"emoticons\":[],\"keywords\":[],\"search\":\"man,heart\"},\"flag-nc\":{\"name\":\"Regional Indicator Symbol Letters NC\",\"unified\":\"1F1F3-1F1E8\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":35,\"short_names\":[\"flag-nc\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,nc,regional,indicator,symbol,letters\"},\"twisted_rightwards_arrows\":{\"name\":\"Twisted Rightwards Arrows\",\"unified\":\"1F500\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":25,\"short_names\":[\"twisted_rightwards_arrows\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"shuffle\",\"music\",\"random\"],\"search\":\"twisted,rightwards,arrows,blue-square,shuffle,music,random\"},\"couplekiss\":{\"name\":\"Kiss\",\"unified\":\"1F48F\",\"variations\":[],\"sheet_x\":19,\"sheet_y\":31,\"short_names\":[\"couplekiss\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"pair\",\"valentines\",\"love\",\"like\",\"dating\",\"marriage\"],\"search\":\"couplekiss,kiss,pair,valentines,love,like,dating,marriage\"},\"flag-nz\":{\"name\":\"Regional Indicator Symbol Letters NZ\",\"unified\":\"1F1F3-1F1FF\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":4,\"short_names\":[\"flag-nz\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,nz,regional,indicator,symbol,letters\"},\"scissors\":{\"name\":\"Black Scissors\",\"unified\":\"2702\",\"variations\":[\"2702-FE0F\"],\"sheet_x\":3,\"sheet_y\":5,\"short_names\":[\"scissors\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"stationery\",\"cut\"],\"search\":\"scissors,black,stationery,cut\"},\"repeat\":{\"name\":\"Clockwise Rightwards and Leftwards Open Circle Arrows\",\"unified\":\"1F501\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":26,\"short_names\":[\"repeat\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"loop\",\"record\"],\"search\":\"repeat,clockwise,rightwards,and,leftwards,open,circle,arrows,loop,record\"},\"repeat_one\":{\"name\":\"Clockwise Rightwards and Leftwards Open Circle Arrows with Circled One Overlay\",\"unified\":\"1F502\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":27,\"short_names\":[\"repeat_one\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"loop\"],\"search\":\"repeat,one,clockwise,rightwards,and,leftwards,open,circle,arrows,with,circled,overlay,blue-square,loop\"},\"flag-ni\":{\"name\":\"Regional Indicator Symbol Letters NI\",\"unified\":\"1F1F3-1F1EE\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":39,\"short_names\":[\"flag-ni\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ni,regional,indicator,symbol,letters\"},\"woman-kiss-woman\":{\"name\":\"Woman Kiss Woman\",\"unified\":\"1F469-200D-2764-FE0F-200D-1F48B-200D-1F469\",\"variations\":[],\"sheet_x\":39,\"sheet_y\":20,\"short_names\":[\"woman-kiss-woman\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":false,\"emoticons\":[],\"keywords\":[],\"search\":\"woman,kiss\"},\"triangular_ruler\":{\"name\":\"Triangular Ruler\",\"unified\":\"1F4D0\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":19,\"short_names\":[\"triangular_ruler\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"stationery\",\"math\",\"architect\",\"sketch\"],\"search\":\"triangular,ruler,stationery,math,architect,sketch\"},\"straight_ruler\":{\"name\":\"Straight Ruler\",\"unified\":\"1F4CF\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":18,\"short_names\":[\"straight_ruler\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"stationery\",\"calculate\",\"length\",\"math\",\"school\",\"drawing\",\"architect\",\"sketch\"],\"search\":\"straight,ruler,stationery,calculate,length,math,school,drawing,architect,sketch\"},\"flag-ne\":{\"name\":\"Regional Indicator Symbol Letters NE\",\"unified\":\"1F1F3-1F1EA\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":36,\"short_names\":[\"flag-ne\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ne,regional,indicator,symbol,letters\"},\"man-kiss-man\":{\"name\":\"Man Kiss Man\",\"unified\":\"1F468-200D-2764-FE0F-200D-1F48B-200D-1F468\",\"variations\":[],\"sheet_x\":39,\"sheet_y\":13,\"short_names\":[\"man-kiss-man\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":false,\"emoticons\":[],\"keywords\":[],\"search\":\"man,kiss\"},\"arrow_backward\":{\"name\":\"Black Left-Pointing Triangle\",\"unified\":\"25C0\",\"variations\":[\"25C0-FE0F\"],\"sheet_x\":0,\"sheet_y\":36,\"short_names\":[\"arrow_backward\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"left\",\"direction\"],\"search\":\"arrow,backward,black,left,pointing,triangle,blue-square,direction\"},\"arrow_up_small\":{\"name\":\"Up-Pointing Small Red Triangle\",\"unified\":\"1F53C\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":3,\"short_names\":[\"arrow_up_small\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"triangle\",\"direction\",\"point\",\"forward\",\"top\"],\"search\":\"arrow,up,small,pointing,red,triangle,blue-square,direction,point,forward,top\"},\"flag-ng\":{\"name\":\"Regional Indicator Symbol Letters NG\",\"unified\":\"1F1F3-1F1EC\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":38,\"short_names\":[\"flag-ng\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ng,regional,indicator,symbol,letters\"},\"family\":{\"name\":\"Family\",\"unified\":\"1F46A\",\"variations\":[\"1F468-200D-1F469-200D-1F466\"],\"sheet_x\":16,\"sheet_y\":32,\"short_names\":[\"family\",\"man-woman-boy\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"home\",\"parents\",\"child\",\"mom\",\"dad\",\"father\",\"mother\",\"people\",\"human\"],\"search\":\"family,man,woman,boy,home,parents,child,mom,dad,father,mother,people,human\"},\"pushpin\":{\"name\":\"Pushpin\",\"unified\":\"1F4CC\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":15,\"short_names\":[\"pushpin\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"stationery\",\"mark\",\"here\"],\"search\":\"pushpin,stationery,mark,here\"},\"man-woman-girl\":{\"name\":\"Man Woman Girl\",\"unified\":\"1F468-200D-1F469-200D-1F467\",\"variations\":[],\"sheet_x\":39,\"sheet_y\":9,\"short_names\":[\"man-woman-girl\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"man,woman,girl\"},\"round_pushpin\":{\"name\":\"Round Pushpin\",\"unified\":\"1F4CD\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":16,\"short_names\":[\"round_pushpin\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"stationery\",\"location\",\"map\",\"here\"],\"search\":\"round,pushpin,stationery,location,map,here\"},\"arrow_down_small\":{\"name\":\"Down-Pointing Small Red Triangle\",\"unified\":\"1F53D\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":4,\"short_names\":[\"arrow_down_small\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"direction\",\"bottom\"],\"search\":\"arrow,down,small,pointing,red,triangle,blue-square,direction,bottom\"},\"flag-nu\":{\"name\":\"Regional Indicator Symbol Letters NU\",\"unified\":\"1F1F3-1F1FA\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":3,\"short_names\":[\"flag-nu\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,nu,regional,indicator,symbol,letters\"},\"flag-nf\":{\"name\":\"Regional Indicator Symbol Letters NF\",\"unified\":\"1F1F3-1F1EB\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":37,\"short_names\":[\"flag-nf\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,nf,regional,indicator,symbol,letters\"},\"triangular_flag_on_post\":{\"name\":\"Triangular Flag on Post\",\"unified\":\"1F6A9\",\"variations\":[],\"sheet_x\":30,\"sheet_y\":17,\"short_names\":[\"triangular_flag_on_post\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"mark\",\"milestone\",\"place\"],\"search\":\"triangular,flag,on,post,mark,milestone,place\"},\"man-woman-girl-boy\":{\"name\":\"Man Woman Girl Boy\",\"unified\":\"1F468-200D-1F469-200D-1F467-200D-1F466\",\"variations\":[],\"sheet_x\":39,\"sheet_y\":10,\"short_names\":[\"man-woman-girl-boy\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"man,woman,girl,boy\"},\"arrow_double_up\":{\"name\":\"Black Up-Pointing Double Triangle\",\"unified\":\"23EB\",\"variations\":[],\"sheet_x\":0,\"sheet_y\":20,\"short_names\":[\"arrow_double_up\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"direction\",\"top\"],\"search\":\"arrow,double,up,black,pointing,triangle,blue-square,direction,top\"},\"man-woman-boy-boy\":{\"name\":\"Man Woman Boy Boy\",\"unified\":\"1F468-200D-1F469-200D-1F466-200D-1F466\",\"variations\":[],\"sheet_x\":39,\"sheet_y\":8,\"short_names\":[\"man-woman-boy-boy\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"man,woman,boy\"},\"flag-mp\":{\"name\":\"Regional Indicator Symbol Letters MP\",\"unified\":\"1F1F2-1F1F5\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":23,\"short_names\":[\"flag-mp\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,mp,regional,indicator,symbol,letters\"},\"waving_white_flag\":{\"name\":\"Waving White Flag\",\"unified\":\"1F3F3\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":34,\"short_names\":[\"waving_white_flag\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"losing\",\"loser\",\"lost\",\"surrender\",\"give up\",\"fail\"],\"search\":\"waving,white,flag,losing,loser,lost,surrender,give up,fail\"},\"arrow_double_down\":{\"name\":\"Black Down-Pointing Double Triangle\",\"unified\":\"23EC\",\"variations\":[],\"sheet_x\":0,\"sheet_y\":21,\"short_names\":[\"arrow_double_down\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"direction\",\"bottom\"],\"search\":\"arrow,double,down,black,pointing,triangle,blue-square,direction,bottom\"},\"man-woman-girl-girl\":{\"name\":\"Man Woman Girl Girl\",\"unified\":\"1F468-200D-1F469-200D-1F467-200D-1F467\",\"variations\":[],\"sheet_x\":39,\"sheet_y\":11,\"short_names\":[\"man-woman-girl-girl\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"man,woman,girl\"},\"flag-kp\":{\"name\":\"Regional Indicator Symbol Letters KP\",\"unified\":\"1F1F0-1F1F5\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":36,\"short_names\":[\"flag-kp\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,kp,regional,indicator,symbol,letters\"},\"waving_black_flag\":{\"name\":\"Waving Black Flag\",\"unified\":\"1F3F4\",\"variations\":[],\"sheet_x\":11,\"sheet_y\":35,\"short_names\":[\"waving_black_flag\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"pirate\"],\"search\":\"waving,black,flag,pirate\"},\"arrow_right\":{\"name\":\"Black Rightwards Arrow\",\"unified\":\"27A1\",\"variations\":[\"27A1-FE0F\"],\"sheet_x\":4,\"sheet_y\":14,\"short_names\":[\"arrow_right\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"next\"],\"search\":\"arrow,right,black,rightwards,blue-square,next\"},\"flag-no\":{\"name\":\"Regional Indicator Symbol Letters NO\",\"unified\":\"1F1F3-1F1F4\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":0,\"short_names\":[\"flag-no\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,no,regional,indicator,symbol,letters\"},\"woman-woman-boy\":{\"name\":\"Woman Woman Boy\",\"unified\":\"1F469-200D-1F469-200D-1F466\",\"variations\":[],\"sheet_x\":39,\"sheet_y\":14,\"short_names\":[\"woman-woman-boy\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"woman,boy\"},\"arrow_left\":{\"name\":\"Leftwards Black Arrow\",\"unified\":\"2B05\",\"variations\":[\"2B05-FE0F\"],\"sheet_x\":4,\"sheet_y\":19,\"short_names\":[\"arrow_left\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"previous\",\"back\"],\"search\":\"arrow,left,leftwards,black,blue-square,previous,back\"},\"closed_lock_with_key\":{\"name\":\"Closed Lock with Key\",\"unified\":\"1F510\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":0,\"short_names\":[\"closed_lock_with_key\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"security\",\"privacy\"],\"search\":\"closed,lock,with,key,security,privacy\"},\"flag-om\":{\"name\":\"Regional Indicator Symbol Letters OM\",\"unified\":\"1F1F4-1F1F2\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":5,\"short_names\":[\"flag-om\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,om,regional,indicator,symbol,letters\"},\"lock\":{\"name\":\"Lock\",\"unified\":\"1F512\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":2,\"short_names\":[\"lock\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"security\",\"password\",\"padlock\"],\"search\":\"lock,security,password,padlock\"},\"arrow_up\":{\"name\":\"Upwards Black Arrow\",\"unified\":\"2B06\",\"variations\":[\"2B06-FE0F\"],\"sheet_x\":4,\"sheet_y\":20,\"short_names\":[\"arrow_up\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"continue\",\"top\",\"direction\"],\"search\":\"arrow,up,upwards,black,blue-square,continue,top,direction\"},\"woman-woman-girl\":{\"name\":\"Woman Woman Girl\",\"unified\":\"1F469-200D-1F469-200D-1F467\",\"variations\":[],\"sheet_x\":39,\"sheet_y\":16,\"short_names\":[\"woman-woman-girl\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"woman,girl\"},\"arrow_down\":{\"name\":\"Downwards Black Arrow\",\"unified\":\"2B07\",\"variations\":[\"2B07-FE0F\"],\"sheet_x\":4,\"sheet_y\":21,\"short_names\":[\"arrow_down\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"direction\",\"bottom\"],\"search\":\"arrow,down,downwards,black,blue-square,direction,bottom\"},\"flag-pk\":{\"name\":\"Regional Indicator Symbol Letters PK\",\"unified\":\"1F1F5-1F1F0\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":11,\"short_names\":[\"flag-pk\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,pk,regional,indicator,symbol,letters\"},\"woman-woman-girl-boy\":{\"name\":\"Woman Woman Girl Boy\",\"unified\":\"1F469-200D-1F469-200D-1F467-200D-1F466\",\"variations\":[],\"sheet_x\":39,\"sheet_y\":17,\"short_names\":[\"woman-woman-girl-boy\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"woman,girl,boy\"},\"unlock\":{\"name\":\"Open Lock\",\"unified\":\"1F513\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":3,\"short_names\":[\"unlock\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"privacy\",\"security\"],\"search\":\"unlock,open,lock,privacy,security\"},\"woman-woman-boy-boy\":{\"name\":\"Woman Woman Boy Boy\",\"unified\":\"1F469-200D-1F469-200D-1F466-200D-1F466\",\"variations\":[],\"sheet_x\":39,\"sheet_y\":15,\"short_names\":[\"woman-woman-boy-boy\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"woman,boy\"},\"lock_with_ink_pen\":{\"name\":\"Lock with Ink Pen\",\"unified\":\"1F50F\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":40,\"short_names\":[\"lock_with_ink_pen\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"security\",\"secret\"],\"search\":\"lock,with,ink,pen,security,secret\"},\"flag-pw\":{\"name\":\"Regional Indicator Symbol Letters PW\",\"unified\":\"1F1F5-1F1FC\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":18,\"short_names\":[\"flag-pw\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,pw,regional,indicator,symbol,letters\"},\"arrow_upper_right\":{\"name\":\"North East Arrow\",\"unified\":\"2197\",\"variations\":[\"2197-FE0F\"],\"sheet_x\":0,\"sheet_y\":9,\"short_names\":[\"arrow_upper_right\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"point\",\"direction\",\"diagonal\",\"northeast\"],\"search\":\"arrow,upper,right,north,east,blue-square,point,direction,diagonal,northeast\"},\"woman-woman-girl-girl\":{\"name\":\"Woman Woman Girl Girl\",\"unified\":\"1F469-200D-1F469-200D-1F467-200D-1F467\",\"variations\":[],\"sheet_x\":39,\"sheet_y\":18,\"short_names\":[\"woman-woman-girl-girl\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"woman,girl\"},\"arrow_lower_right\":{\"name\":\"South East Arrow\",\"unified\":\"2198\",\"variations\":[\"2198-FE0F\"],\"sheet_x\":0,\"sheet_y\":10,\"short_names\":[\"arrow_lower_right\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"direction\",\"diagonal\",\"southeast\"],\"search\":\"arrow,lower,right,south,east,blue-square,direction,diagonal,southeast\"},\"lower_left_ballpoint_pen\":{\"name\":\"Lower Left Ballpoint Pen\",\"unified\":\"1F58A\",\"variations\":[],\"sheet_x\":25,\"sheet_y\":9,\"short_names\":[\"lower_left_ballpoint_pen\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"stationery\",\"writing\",\"write\"],\"search\":\"lower,left,ballpoint,pen,stationery,writing,write\"},\"flag-ps\":{\"name\":\"Regional Indicator Symbol Letters PS\",\"unified\":\"1F1F5-1F1F8\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":16,\"short_names\":[\"flag-ps\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ps,regional,indicator,symbol,letters\"},\"flag-pa\":{\"name\":\"Regional Indicator Symbol Letters PA\",\"unified\":\"1F1F5-1F1E6\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":6,\"short_names\":[\"flag-pa\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,pa,regional,indicator,symbol,letters\"},\"lower_left_fountain_pen\":{\"name\":\"Lower Left Fountain Pen\",\"unified\":\"1F58B\",\"variations\":[],\"sheet_x\":25,\"sheet_y\":10,\"short_names\":[\"lower_left_fountain_pen\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"stationery\",\"writing\",\"write\"],\"search\":\"lower,left,fountain,pen,stationery,writing,write\"},\"arrow_lower_left\":{\"name\":\"South West Arrow\",\"unified\":\"2199\",\"variations\":[\"2199-FE0F\"],\"sheet_x\":0,\"sheet_y\":11,\"short_names\":[\"arrow_lower_left\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"direction\",\"diagonal\",\"southwest\"],\"search\":\"arrow,lower,left,south,west,blue-square,direction,diagonal,southwest\"},\"man-man-boy\":{\"name\":\"Man Man Boy\",\"unified\":\"1F468-200D-1F468-200D-1F466\",\"variations\":[],\"sheet_x\":39,\"sheet_y\":3,\"short_names\":[\"man-man-boy\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"man,boy\"},\"black_nib\":{\"name\":\"Black Nib\",\"unified\":\"2712\",\"variations\":[\"2712-FE0F\"],\"sheet_x\":3,\"sheet_y\":34,\"short_names\":[\"black_nib\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"pen\",\"stationery\",\"writing\",\"write\"],\"search\":\"black,nib,pen,stationery,writing,write\"},\"flag-pg\":{\"name\":\"Regional Indicator Symbol Letters PG\",\"unified\":\"1F1F5-1F1EC\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":9,\"short_names\":[\"flag-pg\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,pg,regional,indicator,symbol,letters\"},\"arrow_upper_left\":{\"name\":\"North West Arrow\",\"unified\":\"2196\",\"variations\":[\"2196-FE0F\"],\"sheet_x\":0,\"sheet_y\":8,\"short_names\":[\"arrow_upper_left\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"point\",\"direction\",\"diagonal\",\"northwest\"],\"search\":\"arrow,upper,left,north,west,blue-square,point,direction,diagonal,northwest\"},\"man-man-girl\":{\"name\":\"Man Man Girl\",\"unified\":\"1F468-200D-1F468-200D-1F467\",\"variations\":[],\"sheet_x\":39,\"sheet_y\":5,\"short_names\":[\"man-man-girl\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"man,girl\"},\"man-man-girl-boy\":{\"name\":\"Man Man Girl Boy\",\"unified\":\"1F468-200D-1F468-200D-1F467-200D-1F466\",\"variations\":[],\"sheet_x\":39,\"sheet_y\":6,\"short_names\":[\"man-man-girl-boy\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"man,girl,boy\"},\"arrow_up_down\":{\"name\":\"Up Down Arrow\",\"unified\":\"2195\",\"variations\":[\"2195-FE0F\"],\"sheet_x\":0,\"sheet_y\":7,\"short_names\":[\"arrow_up_down\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"direction\",\"way\",\"vertical\"],\"search\":\"arrow,up,down,blue-square,direction,way,vertical\"},\"memo\":{\"name\":\"Memo\",\"unified\":\"1F4DD\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":32,\"short_names\":[\"memo\",\"pencil\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"write\",\"documents\",\"stationery\",\"pencil\",\"paper\",\"writing\",\"legal\",\"exam\",\"quiz\",\"test\",\"study\"],\"search\":\"memo,pencil,write,documents,stationery,paper,writing,legal,exam,quiz,test,study\"},\"flag-py\":{\"name\":\"Regional Indicator Symbol Letters PY\",\"unified\":\"1F1F5-1F1FE\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":19,\"short_names\":[\"flag-py\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,py,regional,indicator,symbol,letters\"},\"flag-pe\":{\"name\":\"Regional Indicator Symbol Letters PE\",\"unified\":\"1F1F5-1F1EA\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":7,\"short_names\":[\"flag-pe\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,pe,regional,indicator,symbol,letters\"},\"pencil2\":{\"name\":\"Pencil\",\"unified\":\"270F\",\"variations\":[\"270F-FE0F\"],\"sheet_x\":3,\"sheet_y\":33,\"short_names\":[\"pencil2\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"stationery\",\"write\",\"paper\",\"writing\",\"school\",\"study\"],\"search\":\"pencil2,pencil,stationery,write,paper,writing,school,study\"},\"man-man-boy-boy\":{\"name\":\"Man Man Boy Boy\",\"unified\":\"1F468-200D-1F468-200D-1F466-200D-1F466\",\"variations\":[],\"sheet_x\":39,\"sheet_y\":4,\"short_names\":[\"man-man-boy-boy\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"man,boy\"},\"left_right_arrow\":{\"name\":\"Left Right Arrow\",\"unified\":\"2194\",\"variations\":[\"2194-FE0F\"],\"sheet_x\":0,\"sheet_y\":6,\"short_names\":[\"left_right_arrow\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shape\",\"direction\",\"horizontal\",\"sideways\"],\"search\":\"left,right,arrow,shape,direction,horizontal,sideways\"},\"man-man-girl-girl\":{\"name\":\"Man Man Girl Girl\",\"unified\":\"1F468-200D-1F468-200D-1F467-200D-1F467\",\"variations\":[],\"sheet_x\":39,\"sheet_y\":7,\"short_names\":[\"man-man-girl-girl\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"man,girl\"},\"arrows_counterclockwise\":{\"name\":\"Anticlockwise Downwards and Upwards Open Circle Arrows\",\"unified\":\"1F504\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":29,\"short_names\":[\"arrows_counterclockwise\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"sync\",\"cycle\"],\"search\":\"arrows,counterclockwise,anticlockwise,downwards,and,upwards,open,circle,blue-square,sync,cycle\"},\"flag-ph\":{\"name\":\"Regional Indicator Symbol Letters PH\",\"unified\":\"1F1F5-1F1ED\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":10,\"short_names\":[\"flag-ph\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ph,regional,indicator,symbol,letters\"},\"lower_left_crayon\":{\"name\":\"Lower Left Crayon\",\"unified\":\"1F58D\",\"variations\":[],\"sheet_x\":25,\"sheet_y\":12,\"short_names\":[\"lower_left_crayon\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"drawing\",\"creativity\"],\"search\":\"lower,left,crayon,drawing,creativity\"},\"womans_clothes\":{\"name\":\"Womans Clothes\",\"unified\":\"1F45A\",\"variations\":[],\"sheet_x\":15,\"sheet_y\":37,\"short_names\":[\"womans_clothes\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fashion\",\"shopping\",\"female\"],\"search\":\"womans,clothes,fashion,shopping,female\"},\"lower_left_paintbrush\":{\"name\":\"Lower Left Paintbrush\",\"unified\":\"1F58C\",\"variations\":[],\"sheet_x\":25,\"sheet_y\":11,\"short_names\":[\"lower_left_paintbrush\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"drawing\",\"creativity\",\"art\"],\"search\":\"lower,left,paintbrush,drawing,creativity,art\"},\"flag-pn\":{\"name\":\"Regional Indicator Symbol Letters PN\",\"unified\":\"1F1F5-1F1F3\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":14,\"short_names\":[\"flag-pn\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,pn,regional,indicator,symbol,letters\"},\"arrow_right_hook\":{\"name\":\"Rightwards Arrow with Hook\",\"unified\":\"21AA\",\"variations\":[\"21AA-FE0F\"],\"sheet_x\":0,\"sheet_y\":13,\"short_names\":[\"arrow_right_hook\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"return\",\"rotade\",\"direction\"],\"search\":\"arrow,right,hook,rightwards,with,blue-square,return,rotade,direction\"},\"leftwards_arrow_with_hook\":{\"name\":\"Leftwards Arrow with Hook\",\"unified\":\"21A9\",\"variations\":[\"21A9-FE0F\"],\"sheet_x\":0,\"sheet_y\":12,\"short_names\":[\"leftwards_arrow_with_hook\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"back\",\"return\",\"blue-square\",\"undo\",\"enter\"],\"search\":\"leftwards,arrow,with,hook,back,return,blue-square,undo,enter\"},\"mag\":{\"name\":\"Left-Pointing Magnifying Glass\",\"unified\":\"1F50D\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":38,\"short_names\":[\"mag\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"search\",\"zoom\",\"find\",\"detective\"],\"search\":\"mag,left,pointing,magnifying,glass,search,zoom,find,detective\"},\"flag-pl\":{\"name\":\"Regional Indicator Symbol Letters PL\",\"unified\":\"1F1F5-1F1F1\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":12,\"short_names\":[\"flag-pl\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,pl,regional,indicator,symbol,letters\"},\"shirt\":{\"name\":\"T-Shirt\",\"unified\":\"1F455\",\"variations\":[],\"sheet_x\":15,\"sheet_y\":32,\"short_names\":[\"shirt\",\"tshirt\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fashion\",\"cloth\",\"casual\",\"tshirt\",\"tee\"],\"search\":\"shirt,tshirt,t,fashion,cloth,casual,tee\"},\"flag-pt\":{\"name\":\"Regional Indicator Symbol Letters PT\",\"unified\":\"1F1F5-1F1F9\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":17,\"short_names\":[\"flag-pt\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,pt,regional,indicator,symbol,letters\"},\"jeans\":{\"name\":\"Jeans\",\"unified\":\"1F456\",\"variations\":[],\"sheet_x\":15,\"sheet_y\":33,\"short_names\":[\"jeans\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fashion\",\"shopping\"],\"search\":\"jeans,fashion,shopping\"},\"mag_right\":{\"name\":\"Right-Pointing Magnifying Glass\",\"unified\":\"1F50E\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":39,\"short_names\":[\"mag_right\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"search\",\"zoom\",\"find\",\"detective\"],\"search\":\"mag,right,pointing,magnifying,glass,search,zoom,find,detective\"},\"arrow_heading_up\":{\"name\":\"Arrow Pointing Rightwards Then Curving Upwards\",\"unified\":\"2934\",\"variations\":[\"2934-FE0F\"],\"sheet_x\":4,\"sheet_y\":17,\"short_names\":[\"arrow_heading_up\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"direction\",\"top\"],\"search\":\"arrow,heading,up,pointing,rightwards,then,curving,upwards,blue-square,direction,top\"},\"necktie\":{\"name\":\"Necktie\",\"unified\":\"1F454\",\"variations\":[],\"sheet_x\":15,\"sheet_y\":31,\"short_names\":[\"necktie\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shirt\",\"suitup\",\"formal\",\"fashion\",\"cloth\",\"business\"],\"search\":\"necktie,shirt,suitup,formal,fashion,cloth,business\"},\"flag-pr\":{\"name\":\"Regional Indicator Symbol Letters PR\",\"unified\":\"1F1F5-1F1F7\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":15,\"short_names\":[\"flag-pr\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,pr,regional,indicator,symbol,letters\"},\"arrow_heading_down\":{\"name\":\"Arrow Pointing Rightwards Then Curving Downwards\",\"unified\":\"2935\",\"variations\":[\"2935-FE0F\"],\"sheet_x\":4,\"sheet_y\":18,\"short_names\":[\"arrow_heading_down\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"direction\",\"bottom\"],\"search\":\"arrow,heading,down,pointing,rightwards,then,curving,downwards,blue-square,direction,bottom\"},\"dress\":{\"name\":\"Dress\",\"unified\":\"1F457\",\"variations\":[],\"sheet_x\":15,\"sheet_y\":34,\"short_names\":[\"dress\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"clothes\",\"fashion\",\"shopping\"],\"search\":\"dress,clothes,fashion,shopping\"},\"flag-qa\":{\"name\":\"Regional Indicator Symbol Letters QA\",\"unified\":\"1F1F6-1F1E6\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":20,\"short_names\":[\"flag-qa\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,qa,regional,indicator,symbol,letters\"},\"hash\":{\"name\":\"Hash Key\",\"unified\":\"0023-20E3\",\"variations\":[\"0023-FE0F-20E3\"],\"sheet_x\":32,\"sheet_y\":21,\"short_names\":[\"hash\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"symbol\",\"blue-square\",\"twitter\"],\"search\":\"hash,key,symbol,blue-square,twitter\"},\"flag-re\":{\"name\":\"Regional Indicator Symbol Letters RE\",\"unified\":\"1F1F7-1F1EA\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":21,\"short_names\":[\"flag-re\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,re,regional,indicator,symbol,letters\"},\"bikini\":{\"name\":\"Bikini\",\"unified\":\"1F459\",\"variations\":[],\"sheet_x\":15,\"sheet_y\":36,\"short_names\":[\"bikini\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"swimming\",\"female\",\"woman\",\"girl\",\"fashion\",\"beach\",\"summer\"],\"search\":\"bikini,swimming,female,woman,girl,fashion,beach,summer\"},\"information_source\":{\"name\":\"Information Source\",\"unified\":\"2139\",\"variations\":[\"2139-FE0F\"],\"sheet_x\":0,\"sheet_y\":5,\"short_names\":[\"information_source\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"alphabet\",\"letter\"],\"search\":\"information,source,blue-square,alphabet,letter\"},\"kimono\":{\"name\":\"Kimono\",\"unified\":\"1F458\",\"variations\":[],\"sheet_x\":15,\"sheet_y\":35,\"short_names\":[\"kimono\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"dress\",\"fashion\",\"women\",\"female\",\"japanese\"],\"search\":\"kimono,dress,fashion,women,female,japanese\"},\"abc\":{\"name\":\"Input Symbol for Latin Letters\",\"unified\":\"1F524\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":20,\"short_names\":[\"abc\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"alphabet\"],\"search\":\"abc,input,symbol,for,latin,letters,blue-square,alphabet\"},\"flag-ro\":{\"name\":\"Regional Indicator Symbol Letters RO\",\"unified\":\"1F1F7-1F1F4\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":22,\"short_names\":[\"flag-ro\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ro,regional,indicator,symbol,letters\"},\"lipstick\":{\"name\":\"Lipstick\",\"unified\":\"1F484\",\"variations\":[],\"sheet_x\":19,\"sheet_y\":5,\"short_names\":[\"lipstick\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"female\",\"girl\",\"fashion\",\"woman\"],\"search\":\"lipstick,female,girl,fashion,woman\"},\"flag-ru\":{\"name\":\"Regional Indicator Symbol Letters RU\",\"unified\":\"1F1F7-1F1FA\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":24,\"short_names\":[\"flag-ru\",\"ru\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ru,regional,indicator,symbol,letters\"},\"abcd\":{\"name\":\"Input Symbol for Latin Small Letters\",\"unified\":\"1F521\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":17,\"short_names\":[\"abcd\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"alphabet\"],\"search\":\"abcd,input,symbol,for,latin,small,letters,blue-square,alphabet\"},\"kiss\":{\"name\":\"Kiss Mark\",\"unified\":\"1F48B\",\"variations\":[],\"sheet_x\":19,\"sheet_y\":27,\"short_names\":[\"kiss\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[\":*\",\":-*\"],\"keywords\":[\"face\",\"lips\",\"love\",\"like\",\"affection\",\"valentines\"],\"search\":\"kiss,mark,face,lips,love,like,affection,valentines,:*,:-*\"},\"capital_abcd\":{\"name\":\"Input Symbol for Latin Capital Letters\",\"unified\":\"1F520\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":16,\"short_names\":[\"capital_abcd\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"alphabet\",\"words\",\"blue-square\"],\"search\":\"capital,abcd,input,symbol,for,latin,letters,alphabet,words,blue-square\"},\"flag-rw\":{\"name\":\"Regional Indicator Symbol Letters RW\",\"unified\":\"1F1F7-1F1FC\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":25,\"short_names\":[\"flag-rw\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,rw,regional,indicator,symbol,letters\"},\"footprints\":{\"name\":\"Footprints\",\"unified\":\"1F463\",\"variations\":[],\"sheet_x\":16,\"sheet_y\":5,\"short_names\":[\"footprints\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"feet\",\"tracking\",\"walking\",\"beach\"],\"search\":\"footprints,feet,tracking,walking,beach\"},\"flag-bl\":{\"name\":\"Regional Indicator Symbol Letters BL\",\"unified\":\"1F1E7-1F1F1\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":18,\"short_names\":[\"flag-bl\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,bl,regional,indicator,symbol,letters\"},\"symbols\":{\"name\":\"Input Symbol for Symbols\",\"unified\":\"1F523\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":19,\"short_names\":[\"symbols\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"blue-square\",\"music\",\"note\",\"ampersand\",\"percent\",\"glyphs\",\"characters\"],\"search\":\"symbols,input,symbol,for,blue-square,music,note,ampersand,percent,glyphs,characters\"},\"high_heel\":{\"name\":\"High-Heeled Shoe\",\"unified\":\"1F460\",\"variations\":[],\"sheet_x\":16,\"sheet_y\":2,\"short_names\":[\"high_heel\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fashion\",\"shoes\",\"female\",\"pumps\",\"stiletto\"],\"search\":\"high,heel,heeled,shoe,fashion,shoes,female,pumps,stiletto\"},\"musical_note\":{\"name\":\"Musical Note\",\"unified\":\"1F3B5\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":36,\"short_names\":[\"musical_note\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"score\",\"tone\",\"sound\"],\"search\":\"musical,note,score,tone,sound\"},\"flag-sh\":{\"name\":\"Regional Indicator Symbol Letters SH\",\"unified\":\"1F1F8-1F1ED\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":32,\"short_names\":[\"flag-sh\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,sh,regional,indicator,symbol,letters\"},\"flag-kn\":{\"name\":\"Regional Indicator Symbol Letters KN\",\"unified\":\"1F1F0-1F1F3\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":35,\"short_names\":[\"flag-kn\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,kn,regional,indicator,symbol,letters\"},\"notes\":{\"name\":\"Multiple Musical Notes\",\"unified\":\"1F3B6\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":37,\"short_names\":[\"notes\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"music\",\"score\"],\"search\":\"notes,multiple,musical,music,score\"},\"sandal\":{\"name\":\"Womans Sandal\",\"unified\":\"1F461\",\"variations\":[],\"sheet_x\":16,\"sheet_y\":3,\"short_names\":[\"sandal\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shoes\",\"fashion\",\"flip flops\"],\"search\":\"sandal,womans,shoes,fashion,flip flops\"},\"boot\":{\"name\":\"Womans Boots\",\"unified\":\"1F462\",\"variations\":[],\"sheet_x\":16,\"sheet_y\":4,\"short_names\":[\"boot\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shoes\",\"fashion\"],\"search\":\"boot,womans,boots,shoes,fashion\"},\"wavy_dash\":{\"name\":\"Wavy Dash\",\"unified\":\"3030\",\"variations\":[\"3030-FE0F\"],\"sheet_x\":4,\"sheet_y\":26,\"short_names\":[\"wavy_dash\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"draw\",\"line\",\"moustache\",\"mustache\",\"squiggle\",\"scribble\"],\"search\":\"wavy,dash,draw,line,moustache,mustache,squiggle,scribble\"},\"flag-lc\":{\"name\":\"Regional Indicator Symbol Letters LC\",\"unified\":\"1F1F1-1F1E8\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":2,\"short_names\":[\"flag-lc\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,lc,regional,indicator,symbol,letters\"},\"flag-pm\":{\"name\":\"Regional Indicator Symbol Letters PM\",\"unified\":\"1F1F5-1F1F2\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":13,\"short_names\":[\"flag-pm\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,pm,regional,indicator,symbol,letters\"},\"mans_shoe\":{\"name\":\"Mans Shoe\",\"unified\":\"1F45E\",\"variations\":[],\"sheet_x\":16,\"sheet_y\":0,\"short_names\":[\"mans_shoe\",\"shoe\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fashion\",\"male\"],\"search\":\"mans,shoe,fashion,male\"},\"curly_loop\":{\"name\":\"Curly Loop\",\"unified\":\"27B0\",\"variations\":[],\"sheet_x\":4,\"sheet_y\":15,\"short_names\":[\"curly_loop\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"scribble\",\"draw\",\"shape\",\"squiggle\"],\"search\":\"curly,loop,scribble,draw,shape,squiggle\"},\"flag-vc\":{\"name\":\"Regional Indicator Symbol Letters VC\",\"unified\":\"1F1FB-1F1E8\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":30,\"short_names\":[\"flag-vc\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,vc,regional,indicator,symbol,letters\"},\"heavy_check_mark\":{\"name\":\"Heavy Check Mark\",\"unified\":\"2714\",\"variations\":[\"2714-FE0F\"],\"sheet_x\":3,\"sheet_y\":35,\"short_names\":[\"heavy_check_mark\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"ok\",\"nike\",\"answer\",\"yes\",\"tick\"],\"search\":\"heavy,check,mark,ok,nike,answer,yes,tick\"},\"athletic_shoe\":{\"name\":\"Athletic Shoe\",\"unified\":\"1F45F\",\"variations\":[],\"sheet_x\":16,\"sheet_y\":1,\"short_names\":[\"athletic_shoe\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shoes\",\"sports\",\"sneakers\"],\"search\":\"athletic,shoe,shoes,sports,sneakers\"},\"womans_hat\":{\"name\":\"Womans Hat\",\"unified\":\"1F452\",\"variations\":[],\"sheet_x\":15,\"sheet_y\":29,\"short_names\":[\"womans_hat\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fashion\",\"accessories\",\"female\",\"lady\",\"spring\"],\"search\":\"womans,hat,fashion,accessories,female,lady,spring\"},\"flag-ws\":{\"name\":\"Regional Indicator Symbol Letters WS\",\"unified\":\"1F1FC-1F1F8\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":37,\"short_names\":[\"flag-ws\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ws,regional,indicator,symbol,letters\"},\"arrows_clockwise\":{\"name\":\"Clockwise Downwards and Upwards Open Circle Arrows\",\"unified\":\"1F503\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":28,\"short_names\":[\"arrows_clockwise\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sync\",\"cycle\",\"round\",\"repeat\"],\"search\":\"arrows,clockwise,downwards,and,upwards,open,circle,sync,cycle,round,repeat\"},\"heavy_plus_sign\":{\"name\":\"Heavy Plus Sign\",\"unified\":\"2795\",\"variations\":[],\"sheet_x\":4,\"sheet_y\":11,\"short_names\":[\"heavy_plus_sign\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"math\",\"calculation\",\"addition\",\"more\",\"increase\"],\"search\":\"heavy,plus,sign,math,calculation,addition,more,increase\"},\"tophat\":{\"name\":\"Top Hat\",\"unified\":\"1F3A9\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":24,\"short_names\":[\"tophat\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"magic\",\"gentleman\",\"classy\",\"circus\"],\"search\":\"tophat,top,hat,magic,gentleman,classy,circus\"},\"flag-sm\":{\"name\":\"Regional Indicator Symbol Letters SM\",\"unified\":\"1F1F8-1F1F2\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":37,\"short_names\":[\"flag-sm\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,sm,regional,indicator,symbol,letters\"},\"helmet_with_white_cross\":{\"name\":\"Helmet with White Cross\",\"unified\":\"26D1\",\"variations\":[],\"sheet_x\":2,\"sheet_y\":25,\"short_names\":[\"helmet_with_white_cross\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"helmet,with,white,cross\"},\"heavy_minus_sign\":{\"name\":\"Heavy Minus Sign\",\"unified\":\"2796\",\"variations\":[],\"sheet_x\":4,\"sheet_y\":12,\"short_names\":[\"heavy_minus_sign\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"math\",\"calculation\",\"subtract\",\"less\"],\"search\":\"heavy,minus,sign,math,calculation,subtract,less\"},\"flag-st\":{\"name\":\"Regional Indicator Symbol Letters ST\",\"unified\":\"1F1F8-1F1F9\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":1,\"short_names\":[\"flag-st\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,st,regional,indicator,symbol,letters\"},\"flag-sa\":{\"name\":\"Regional Indicator Symbol Letters SA\",\"unified\":\"1F1F8-1F1E6\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":26,\"short_names\":[\"flag-sa\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,sa,regional,indicator,symbol,letters\"},\"heavy_division_sign\":{\"name\":\"Heavy Division Sign\",\"unified\":\"2797\",\"variations\":[],\"sheet_x\":4,\"sheet_y\":13,\"short_names\":[\"heavy_division_sign\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"divide\",\"math\",\"calculation\"],\"search\":\"heavy,division,sign,divide,math,calculation\"},\"mortar_board\":{\"name\":\"Graduation Cap\",\"unified\":\"1F393\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":7,\"short_names\":[\"mortar_board\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"school\",\"college\",\"degree\",\"university\",\"graduation\",\"cap\",\"hat\",\"legal\",\"learn\",\"education\"],\"search\":\"mortar,board,graduation,cap,school,college,degree,university,hat,legal,learn,education\"},\"flag-sn\":{\"name\":\"Regional Indicator Symbol Letters SN\",\"unified\":\"1F1F8-1F1F3\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":38,\"short_names\":[\"flag-sn\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,sn,regional,indicator,symbol,letters\"},\"heavy_multiplication_x\":{\"name\":\"Heavy Multiplication X\",\"unified\":\"2716\",\"variations\":[\"2716-FE0F\"],\"sheet_x\":3,\"sheet_y\":36,\"short_names\":[\"heavy_multiplication_x\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"math\",\"calculation\"],\"search\":\"heavy,multiplication,x,math,calculation\"},\"crown\":{\"name\":\"Crown\",\"unified\":\"1F451\",\"variations\":[],\"sheet_x\":15,\"sheet_y\":28,\"short_names\":[\"crown\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"king\",\"kod\",\"leader\",\"royalty\",\"lord\"],\"search\":\"crown,king,kod,leader,royalty,lord\"},\"school_satchel\":{\"name\":\"School Satchel\",\"unified\":\"1F392\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":6,\"short_names\":[\"school_satchel\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"student\",\"education\",\"bag\"],\"search\":\"school,satchel,student,education,bag\"},\"flag-rs\":{\"name\":\"Regional Indicator Symbol Letters RS\",\"unified\":\"1F1F7-1F1F8\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":23,\"short_names\":[\"flag-rs\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,rs,regional,indicator,symbol,letters\"},\"heavy_dollar_sign\":{\"name\":\"Heavy Dollar Sign\",\"unified\":\"1F4B2\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":30,\"short_names\":[\"heavy_dollar_sign\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"money\",\"sales\",\"payment\",\"currency\",\"buck\"],\"search\":\"heavy,dollar,sign,money,sales,payment,currency,buck\"},\"flag-sc\":{\"name\":\"Regional Indicator Symbol Letters SC\",\"unified\":\"1F1F8-1F1E8\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":28,\"short_names\":[\"flag-sc\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,sc,regional,indicator,symbol,letters\"},\"currency_exchange\":{\"name\":\"Currency Exchange\",\"unified\":\"1F4B1\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":29,\"short_names\":[\"currency_exchange\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"money\",\"sales\",\"dollar\",\"travel\"],\"search\":\"currency,exchange,money,sales,dollar,travel\"},\"pouch\":{\"name\":\"Pouch\",\"unified\":\"1F45D\",\"variations\":[],\"sheet_x\":15,\"sheet_y\":40,\"short_names\":[\"pouch\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"bag\",\"accessories\",\"shopping\"],\"search\":\"pouch,bag,accessories,shopping\"},\"purse\":{\"name\":\"Purse\",\"unified\":\"1F45B\",\"variations\":[],\"sheet_x\":15,\"sheet_y\":38,\"short_names\":[\"purse\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fashion\",\"accessories\",\"money\",\"sales\",\"shopping\"],\"search\":\"purse,fashion,accessories,money,sales,shopping\"},\"flag-sl\":{\"name\":\"Regional Indicator Symbol Letters SL\",\"unified\":\"1F1F8-1F1F1\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":36,\"short_names\":[\"flag-sl\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,sl,regional,indicator,symbol,letters\"},\"copyright\":{\"name\":\"Copyright Sign\",\"unified\":\"00A9\",\"variations\":[\"00A9-FE0F\"],\"sheet_x\":0,\"sheet_y\":0,\"short_names\":[\"copyright\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":false,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"ip\",\"license\",\"circle\",\"law\",\"legal\"],\"search\":\"copyright,sign,ip,license,circle,law,legal\"},\"handbag\":{\"name\":\"Handbag\",\"unified\":\"1F45C\",\"variations\":[],\"sheet_x\":15,\"sheet_y\":39,\"short_names\":[\"handbag\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fashion\",\"accessory\",\"accessories\",\"shopping\"],\"search\":\"handbag,fashion,accessory,accessories,shopping\"},\"flag-sg\":{\"name\":\"Regional Indicator Symbol Letters SG\",\"unified\":\"1F1F8-1F1EC\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":31,\"short_names\":[\"flag-sg\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,sg,regional,indicator,symbol,letters\"},\"registered\":{\"name\":\"Registered Sign\",\"unified\":\"00AE\",\"variations\":[\"00AE-FE0F\"],\"sheet_x\":0,\"sheet_y\":1,\"short_names\":[\"registered\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":false,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"alphabet\",\"circle\"],\"search\":\"registered,sign,alphabet,circle\"},\"briefcase\":{\"name\":\"Briefcase\",\"unified\":\"1F4BC\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":40,\"short_names\":[\"briefcase\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"business\",\"documents\",\"work\",\"law\",\"legal\"],\"search\":\"briefcase,business,documents,work,law,legal\"},\"flag-sx\":{\"name\":\"Regional Indicator Symbol Letters SX\",\"unified\":\"1F1F8-1F1FD\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":3,\"short_names\":[\"flag-sx\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,sx,regional,indicator,symbol,letters\"},\"tm\":{\"name\":\"Trade Mark Sign\",\"unified\":\"2122\",\"variations\":[\"2122-FE0F\"],\"sheet_x\":0,\"sheet_y\":4,\"short_names\":[\"tm\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":false,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"trademark\",\"brand\",\"law\",\"legal\"],\"search\":\"tm,trade,mark,sign,trademark,brand,law,legal\"},\"flag-sk\":{\"name\":\"Regional Indicator Symbol Letters SK\",\"unified\":\"1F1F8-1F1F0\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":35,\"short_names\":[\"flag-sk\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,sk,regional,indicator,symbol,letters\"},\"eyeglasses\":{\"name\":\"Eyeglasses\",\"unified\":\"1F453\",\"variations\":[],\"sheet_x\":15,\"sheet_y\":30,\"short_names\":[\"eyeglasses\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"fashion\",\"accessories\",\"eyesight\",\"nerdy\",\"dork\",\"geek\"],\"search\":\"eyeglasses,fashion,accessories,eyesight,nerdy,dork,geek\"},\"end\":{\"name\":\"End with Leftwards Arrow Above\",\"unified\":\"1F51A\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":10,\"short_names\":[\"end\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"words\",\"arrow\"],\"search\":\"end,with,leftwards,arrow,above,words\"},\"dark_sunglasses\":{\"name\":\"Dark Sunglasses\",\"unified\":\"1F576\",\"variations\":[],\"sheet_x\":25,\"sheet_y\":4,\"short_names\":[\"dark_sunglasses\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"face\",\"cool\",\"accessories\"],\"search\":\"dark,sunglasses,face,cool,accessories\"},\"flag-si\":{\"name\":\"Regional Indicator Symbol Letters SI\",\"unified\":\"1F1F8-1F1EE\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":33,\"short_names\":[\"flag-si\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,si,regional,indicator,symbol,letters\"},\"back\":{\"name\":\"Back with Leftwards Arrow Above\",\"unified\":\"1F519\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":9,\"short_names\":[\"back\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"arrow\",\"words\",\"return\"],\"search\":\"back,with,leftwards,arrow,above,words,return\"},\"ring\":{\"name\":\"Ring\",\"unified\":\"1F48D\",\"variations\":[],\"sheet_x\":19,\"sheet_y\":29,\"short_names\":[\"ring\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"wedding\",\"propose\",\"marriage\",\"valentines\",\"diamond\",\"fashion\",\"jewelry\",\"gem\"],\"search\":\"ring,wedding,propose,marriage,valentines,diamond,fashion,jewelry,gem\"},\"flag-sb\":{\"name\":\"Regional Indicator Symbol Letters SB\",\"unified\":\"1F1F8-1F1E7\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":27,\"short_names\":[\"flag-sb\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,sb,regional,indicator,symbol,letters\"},\"on\":{\"name\":\"On with Exclamation Mark with Left Right Arrow Above\",\"unified\":\"1F51B\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":11,\"short_names\":[\"on\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"arrow\",\"words\"],\"search\":\"on,with,exclamation,mark,left,right,arrow,above,words\"},\"top\":{\"name\":\"Top with Upwards Arrow Above\",\"unified\":\"1F51D\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":13,\"short_names\":[\"top\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"words\",\"blue-square\"],\"search\":\"top,with,upwards,arrow,above,words,blue-square\"},\"flag-so\":{\"name\":\"Regional Indicator Symbol Letters SO\",\"unified\":\"1F1F8-1F1F4\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":39,\"short_names\":[\"flag-so\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,so,regional,indicator,symbol,letters\"},\"closed_umbrella\":{\"name\":\"Closed Umbrella\",\"unified\":\"1F302\",\"variations\":[],\"sheet_x\":5,\"sheet_y\":23,\"short_names\":[\"closed_umbrella\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"weather\",\"rain\",\"drizzle\"],\"search\":\"closed,umbrella,weather,rain,drizzle\"},\"flag-za\":{\"name\":\"Regional Indicator Symbol Letters ZA\",\"unified\":\"1F1FF-1F1E6\",\"variations\":[],\"sheet_x\":39,\"sheet_y\":0,\"short_names\":[\"flag-za\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,za,regional,indicator,symbol,letters\"},\"soon\":{\"name\":\"Soon with Rightwards Arrow Above\",\"unified\":\"1F51C\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":12,\"short_names\":[\"soon\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"arrow\",\"words\"],\"search\":\"soon,with,rightwards,arrow,above,words\"},\"flag-gs\":{\"name\":\"Regional Indicator Symbol Letters GS\",\"unified\":\"1F1EC-1F1F8\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":4,\"short_names\":[\"flag-gs\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,gs,regional,indicator,symbol,letters\"},\"ballot_box_with_check\":{\"name\":\"Ballot Box with Check\",\"unified\":\"2611\",\"variations\":[\"2611-FE0F\"],\"sheet_x\":1,\"sheet_y\":6,\"short_names\":[\"ballot_box_with_check\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"ok\",\"agree\",\"confirm\",\"black-square\",\"vote\",\"election\",\"yes\"],\"search\":\"ballot,box,with,check,ok,agree,confirm,black-square,vote,election,yes\"},\"radio_button\":{\"name\":\"Radio Button\",\"unified\":\"1F518\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":8,\"short_names\":[\"radio_button\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"input\",\"old\",\"music\",\"circle\"],\"search\":\"radio,button,input,old,music,circle\"},\"flag-kr\":{\"name\":\"Regional Indicator Symbol Letters KR\",\"unified\":\"1F1F0-1F1F7\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":37,\"short_names\":[\"flag-kr\",\"kr\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,kr,regional,indicator,symbol,letters\"},\"flag-ss\":{\"name\":\"Regional Indicator Symbol Letters SS\",\"unified\":\"1F1F8-1F1F8\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":0,\"short_names\":[\"flag-ss\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ss,regional,indicator,symbol,letters\"},\"white_circle\":{\"name\":\"Medium White Circle\",\"unified\":\"26AA\",\"variations\":[\"26AA-FE0F\"],\"sheet_x\":2,\"sheet_y\":14,\"short_names\":[\"white_circle\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shape\",\"round\"],\"search\":\"white,circle,medium,shape,round\"},\"flag-es\":{\"name\":\"Regional Indicator Symbol Letters ES\",\"unified\":\"1F1EA-1F1F8\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":22,\"short_names\":[\"flag-es\",\"es\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,es,regional,indicator,symbol,letters\"},\"black_circle\":{\"name\":\"Medium Black Circle\",\"unified\":\"26AB\",\"variations\":[\"26AB-FE0F\"],\"sheet_x\":2,\"sheet_y\":15,\"short_names\":[\"black_circle\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shape\",\"button\",\"round\"],\"search\":\"black,circle,medium,shape,button,round\"},\"flag-lk\":{\"name\":\"Regional Indicator Symbol Letters LK\",\"unified\":\"1F1F1-1F1F0\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":4,\"short_names\":[\"flag-lk\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,lk,regional,indicator,symbol,letters\"},\"red_circle\":{\"name\":\"Large Red Circle\",\"unified\":\"1F534\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":36,\"short_names\":[\"red_circle\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shape\",\"error\",\"danger\"],\"search\":\"red,circle,large,shape,error,danger\"},\"flag-sd\":{\"name\":\"Regional Indicator Symbol Letters SD\",\"unified\":\"1F1F8-1F1E9\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":29,\"short_names\":[\"flag-sd\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,sd,regional,indicator,symbol,letters\"},\"large_blue_circle\":{\"name\":\"Large Blue Circle\",\"unified\":\"1F535\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":37,\"short_names\":[\"large_blue_circle\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shape\",\"icon\",\"button\"],\"search\":\"large,blue,circle,shape,icon,button\"},\"small_orange_diamond\":{\"name\":\"Small Orange Diamond\",\"unified\":\"1F538\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":40,\"short_names\":[\"small_orange_diamond\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shape\",\"jewel\",\"gem\"],\"search\":\"small,orange,diamond,shape,jewel,gem\"},\"flag-sr\":{\"name\":\"Regional Indicator Symbol Letters SR\",\"unified\":\"1F1F8-1F1F7\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":40,\"short_names\":[\"flag-sr\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,sr,regional,indicator,symbol,letters\"},\"small_blue_diamond\":{\"name\":\"Small Blue Diamond\",\"unified\":\"1F539\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":0,\"short_names\":[\"small_blue_diamond\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shape\",\"jewel\",\"gem\"],\"search\":\"small,blue,diamond,shape,jewel,gem\"},\"flag-sz\":{\"name\":\"Regional Indicator Symbol Letters SZ\",\"unified\":\"1F1F8-1F1FF\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":5,\"short_names\":[\"flag-sz\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,sz,regional,indicator,symbol,letters\"},\"large_orange_diamond\":{\"name\":\"Large Orange Diamond\",\"unified\":\"1F536\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":38,\"short_names\":[\"large_orange_diamond\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shape\",\"jewel\",\"gem\"],\"search\":\"large,orange,diamond,shape,jewel,gem\"},\"flag-se\":{\"name\":\"Regional Indicator Symbol Letters SE\",\"unified\":\"1F1F8-1F1EA\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":30,\"short_names\":[\"flag-se\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,se,regional,indicator,symbol,letters\"},\"flag-ch\":{\"name\":\"Regional Indicator Symbol Letters CH\",\"unified\":\"1F1E8-1F1ED\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":35,\"short_names\":[\"flag-ch\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ch,regional,indicator,symbol,letters\"},\"large_blue_diamond\":{\"name\":\"Large Blue Diamond\",\"unified\":\"1F537\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":39,\"short_names\":[\"large_blue_diamond\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shape\",\"jewel\",\"gem\"],\"search\":\"large,blue,diamond,shape,jewel,gem\"},\"flag-sy\":{\"name\":\"Regional Indicator Symbol Letters SY\",\"unified\":\"1F1F8-1F1FE\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":4,\"short_names\":[\"flag-sy\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,sy,regional,indicator,symbol,letters\"},\"small_red_triangle\":{\"name\":\"Up-Pointing Red Triangle\",\"unified\":\"1F53A\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":1,\"short_names\":[\"small_red_triangle\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shape\",\"direction\",\"up\",\"top\"],\"search\":\"small,red,triangle,up,pointing,shape,direction,top\"},\"flag-tw\":{\"name\":\"Regional Indicator Symbol Letters TW\",\"unified\":\"1F1F9-1F1FC\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":21,\"short_names\":[\"flag-tw\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,tw,regional,indicator,symbol,letters\"},\"black_small_square\":{\"name\":\"Black Small Square\",\"unified\":\"25AA\",\"variations\":[\"25AA-FE0F\"],\"sheet_x\":0,\"sheet_y\":33,\"short_names\":[\"black_small_square\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shape\",\"icon\"],\"search\":\"black,small,square,shape,icon\"},\"white_small_square\":{\"name\":\"White Small Square\",\"unified\":\"25AB\",\"variations\":[\"25AB-FE0F\"],\"sheet_x\":0,\"sheet_y\":34,\"short_names\":[\"white_small_square\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shape\",\"icon\"],\"search\":\"white,small,square,shape,icon\"},\"flag-tj\":{\"name\":\"Regional Indicator Symbol Letters TJ\",\"unified\":\"1F1F9-1F1EF\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":12,\"short_names\":[\"flag-tj\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,tj,regional,indicator,symbol,letters\"},\"black_large_square\":{\"name\":\"Black Large Square\",\"unified\":\"2B1B\",\"variations\":[\"2B1B-FE0F\"],\"sheet_x\":4,\"sheet_y\":22,\"short_names\":[\"black_large_square\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shape\",\"icon\",\"button\"],\"search\":\"black,large,square,shape,icon,button\"},\"flag-tz\":{\"name\":\"Regional Indicator Symbol Letters TZ\",\"unified\":\"1F1F9-1F1FF\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":22,\"short_names\":[\"flag-tz\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,tz,regional,indicator,symbol,letters\"},\"white_large_square\":{\"name\":\"White Large Square\",\"unified\":\"2B1C\",\"variations\":[\"2B1C-FE0F\"],\"sheet_x\":4,\"sheet_y\":23,\"short_names\":[\"white_large_square\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shape\",\"icon\",\"stone\",\"button\"],\"search\":\"white,large,square,shape,icon,stone,button\"},\"flag-th\":{\"name\":\"Regional Indicator Symbol Letters TH\",\"unified\":\"1F1F9-1F1ED\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":11,\"short_names\":[\"flag-th\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,th,regional,indicator,symbol,letters\"},\"flag-tl\":{\"name\":\"Regional Indicator Symbol Letters TL\",\"unified\":\"1F1F9-1F1F1\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":14,\"short_names\":[\"flag-tl\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,tl,regional,indicator,symbol,letters\"},\"small_red_triangle_down\":{\"name\":\"Down-Pointing Red Triangle\",\"unified\":\"1F53B\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":2,\"short_names\":[\"small_red_triangle_down\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shape\",\"direction\",\"bottom\"],\"search\":\"small,red,triangle,down,pointing,shape,direction,bottom\"},\"flag-tg\":{\"name\":\"Regional Indicator Symbol Letters TG\",\"unified\":\"1F1F9-1F1EC\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":10,\"short_names\":[\"flag-tg\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,tg,regional,indicator,symbol,letters\"},\"black_medium_square\":{\"name\":\"Black Medium Square\",\"unified\":\"25FC\",\"variations\":[\"25FC-FE0F\"],\"sheet_x\":0,\"sheet_y\":38,\"short_names\":[\"black_medium_square\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shape\",\"button\",\"icon\"],\"search\":\"black,medium,square,shape,button,icon\"},\"flag-tk\":{\"name\":\"Regional Indicator Symbol Letters TK\",\"unified\":\"1F1F9-1F1F0\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":13,\"short_names\":[\"flag-tk\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,tk,regional,indicator,symbol,letters\"},\"white_medium_square\":{\"name\":\"White Medium Square\",\"unified\":\"25FB\",\"variations\":[\"25FB-FE0F\"],\"sheet_x\":0,\"sheet_y\":37,\"short_names\":[\"white_medium_square\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shape\",\"stone\",\"icon\"],\"search\":\"white,medium,square,shape,stone,icon\"},\"flag-to\":{\"name\":\"Regional Indicator Symbol Letters TO\",\"unified\":\"1F1F9-1F1F4\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":17,\"short_names\":[\"flag-to\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,to,regional,indicator,symbol,letters\"},\"black_medium_small_square\":{\"name\":\"Black Medium Small Square\",\"unified\":\"25FE\",\"variations\":[\"25FE-FE0F\"],\"sheet_x\":0,\"sheet_y\":40,\"short_names\":[\"black_medium_small_square\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"icon\",\"shape\",\"button\"],\"search\":\"black,medium,small,square,icon,shape,button\"},\"white_medium_small_square\":{\"name\":\"White Medium Small Square\",\"unified\":\"25FD\",\"variations\":[\"25FD-FE0F\"],\"sheet_x\":0,\"sheet_y\":39,\"short_names\":[\"white_medium_small_square\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shape\",\"stone\",\"icon\",\"button\"],\"search\":\"white,medium,small,square,shape,stone,icon,button\"},\"flag-tt\":{\"name\":\"Regional Indicator Symbol Letters TT\",\"unified\":\"1F1F9-1F1F9\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":19,\"short_names\":[\"flag-tt\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,tt,regional,indicator,symbol,letters\"},\"black_square_button\":{\"name\":\"Black Square Button\",\"unified\":\"1F532\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":34,\"short_names\":[\"black_square_button\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shape\",\"input\",\"frame\"],\"search\":\"black,square,button,shape,input,frame\"},\"flag-tn\":{\"name\":\"Regional Indicator Symbol Letters TN\",\"unified\":\"1F1F9-1F1F3\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":16,\"short_names\":[\"flag-tn\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,tn,regional,indicator,symbol,letters\"},\"flag-tr\":{\"name\":\"Regional Indicator Symbol Letters TR\",\"unified\":\"1F1F9-1F1F7\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":18,\"short_names\":[\"flag-tr\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,tr,regional,indicator,symbol,letters\"},\"white_square_button\":{\"name\":\"White Square Button\",\"unified\":\"1F533\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":35,\"short_names\":[\"white_square_button\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"shape\",\"input\"],\"search\":\"white,square,button,shape,input\"},\"flag-tm\":{\"name\":\"Regional Indicator Symbol Letters TM\",\"unified\":\"1F1F9-1F1F2\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":15,\"short_names\":[\"flag-tm\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,tm,regional,indicator,symbol,letters\"},\"speaker\":{\"name\":\"Speaker\",\"unified\":\"1F508\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":33,\"short_names\":[\"speaker\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sound\",\"volume\",\"silence\",\"broadcast\"],\"search\":\"speaker,sound,volume,silence,broadcast\"},\"flag-tc\":{\"name\":\"Regional Indicator Symbol Letters TC\",\"unified\":\"1F1F9-1F1E8\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":7,\"short_names\":[\"flag-tc\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,tc,regional,indicator,symbol,letters\"},\"sound\":{\"name\":\"Speaker with One Sound Wave\",\"unified\":\"1F509\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":34,\"short_names\":[\"sound\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"volume\",\"speaker\",\"broadcast\"],\"search\":\"sound,speaker,with,one,wave,volume,broadcast\"},\"flag-tv\":{\"name\":\"Regional Indicator Symbol Letters TV\",\"unified\":\"1F1F9-1F1FB\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":20,\"short_names\":[\"flag-tv\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,tv,regional,indicator,symbol,letters\"},\"loud_sound\":{\"name\":\"Speaker with Three Sound Waves\",\"unified\":\"1F50A\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":35,\"short_names\":[\"loud_sound\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"volume\",\"noise\",\"noisy\",\"speaker\",\"broadcast\"],\"search\":\"loud,sound,speaker,with,three,waves,volume,noise,noisy,broadcast\"},\"mute\":{\"name\":\"Speaker with Cancellation Stroke\",\"unified\":\"1F507\",\"variations\":[],\"sheet_x\":22,\"sheet_y\":32,\"short_names\":[\"mute\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sound\",\"volume\",\"silence\",\"quiet\"],\"search\":\"mute,speaker,with,cancellation,stroke,sound,volume,silence,quiet\"},\"flag-ug\":{\"name\":\"Regional Indicator Symbol Letters UG\",\"unified\":\"1F1FA-1F1EC\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":24,\"short_names\":[\"flag-ug\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ug,regional,indicator,symbol,letters\"},\"flag-ua\":{\"name\":\"Regional Indicator Symbol Letters UA\",\"unified\":\"1F1FA-1F1E6\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":23,\"short_names\":[\"flag-ua\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ua,regional,indicator,symbol,letters\"},\"mega\":{\"name\":\"Cheering Megaphone\",\"unified\":\"1F4E3\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":38,\"short_names\":[\"mega\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sound\",\"speaker\",\"volume\"],\"search\":\"mega,cheering,megaphone,sound,speaker,volume\"},\"flag-ae\":{\"name\":\"Regional Indicator Symbol Letters AE\",\"unified\":\"1F1E6-1F1EA\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":35,\"short_names\":[\"flag-ae\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ae,regional,indicator,symbol,letters\"},\"loudspeaker\":{\"name\":\"Public Address Loudspeaker\",\"unified\":\"1F4E2\",\"variations\":[],\"sheet_x\":21,\"sheet_y\":37,\"short_names\":[\"loudspeaker\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"volume\",\"sound\"],\"search\":\"loudspeaker,public,address,volume,sound\"},\"bell\":{\"name\":\"Bell\",\"unified\":\"1F514\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":4,\"short_names\":[\"bell\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sound\",\"notification\",\"christmas\",\"xmas\",\"chime\"],\"search\":\"bell,sound,notification,christmas,xmas,chime\"},\"flag-gb\":{\"name\":\"Regional Indicator Symbol Letters GB\",\"unified\":\"1F1EC-1F1E7\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":32,\"short_names\":[\"flag-gb\",\"gb\",\"uk\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,gb,uk,regional,indicator,symbol,letters\"},\"flag-us\":{\"name\":\"Regional Indicator Symbol Letters US\",\"unified\":\"1F1FA-1F1F8\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":26,\"short_names\":[\"flag-us\",\"us\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,us,regional,indicator,symbol,letters\"},\"no_bell\":{\"name\":\"Bell with Cancellation Stroke\",\"unified\":\"1F515\",\"variations\":[],\"sheet_x\":23,\"sheet_y\":5,\"short_names\":[\"no_bell\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"sound\",\"volume\",\"mute\",\"quiet\",\"silent\"],\"search\":\"no,bell,with,cancellation,stroke,sound,volume,mute,quiet,silent\"},\"flag-vi\":{\"name\":\"Regional Indicator Symbol Letters VI\",\"unified\":\"1F1FB-1F1EE\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":33,\"short_names\":[\"flag-vi\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,vi,regional,indicator,symbol,letters\"},\"black_joker\":{\"name\":\"Playing Card Black Joker\",\"unified\":\"1F0CF\",\"variations\":[],\"sheet_x\":4,\"sheet_y\":31,\"short_names\":[\"black_joker\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"poker\",\"cards\",\"game\",\"play\",\"magic\"],\"search\":\"black,joker,playing,card,poker,cards,game,play,magic\"},\"mahjong\":{\"name\":\"Mahjong Tile Red Dragon\",\"unified\":\"1F004\",\"variations\":[\"1F004-FE0F\"],\"sheet_x\":4,\"sheet_y\":30,\"short_names\":[\"mahjong\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"game\",\"play\",\"chinese\",\"kanji\"],\"search\":\"mahjong,tile,red,dragon,game,play,chinese,kanji\"},\"flag-uy\":{\"name\":\"Regional Indicator Symbol Letters UY\",\"unified\":\"1F1FA-1F1FE\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":27,\"short_names\":[\"flag-uy\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,uy,regional,indicator,symbol,letters\"},\"spades\":{\"name\":\"Black Spade Suit\",\"unified\":\"2660\",\"variations\":[\"2660-FE0F\"],\"sheet_x\":1,\"sheet_y\":38,\"short_names\":[\"spades\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"poker\",\"cards\",\"suits\",\"magic\"],\"search\":\"spades,black,spade,suit,poker,cards,suits,magic\"},\"flag-uz\":{\"name\":\"Regional Indicator Symbol Letters UZ\",\"unified\":\"1F1FA-1F1FF\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":28,\"short_names\":[\"flag-uz\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,uz,regional,indicator,symbol,letters\"},\"clubs\":{\"name\":\"Black Club Suit\",\"unified\":\"2663\",\"variations\":[\"2663-FE0F\"],\"sheet_x\":1,\"sheet_y\":39,\"short_names\":[\"clubs\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"poker\",\"cards\",\"magic\",\"suits\"],\"search\":\"clubs,black,club,suit,poker,cards,magic,suits\"},\"flag-vu\":{\"name\":\"Regional Indicator Symbol Letters VU\",\"unified\":\"1F1FB-1F1FA\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":35,\"short_names\":[\"flag-vu\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,vu,regional,indicator,symbol,letters\"},\"hearts\":{\"name\":\"Black Heart Suit\",\"unified\":\"2665\",\"variations\":[\"2665-FE0F\"],\"sheet_x\":1,\"sheet_y\":40,\"short_names\":[\"hearts\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"poker\",\"cards\",\"magic\",\"suits\"],\"search\":\"hearts,black,heart,suit,poker,cards,magic,suits\"},\"flag-va\":{\"name\":\"Regional Indicator Symbol Letters VA\",\"unified\":\"1F1FB-1F1E6\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":29,\"short_names\":[\"flag-va\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,va,regional,indicator,symbol,letters\"},\"diamonds\":{\"name\":\"Black Diamond Suit\",\"unified\":\"2666\",\"variations\":[\"2666-FE0F\"],\"sheet_x\":2,\"sheet_y\":0,\"short_names\":[\"diamonds\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"poker\",\"cards\",\"magic\",\"suits\"],\"search\":\"diamonds,black,diamond,suit,poker,cards,magic,suits\"},\"flag-ve\":{\"name\":\"Regional Indicator Symbol Letters VE\",\"unified\":\"1F1FB-1F1EA\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":31,\"short_names\":[\"flag-ve\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ve,regional,indicator,symbol,letters\"},\"flag-vn\":{\"name\":\"Regional Indicator Symbol Letters VN\",\"unified\":\"1F1FB-1F1F3\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":34,\"short_names\":[\"flag-vn\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,vn,regional,indicator,symbol,letters\"},\"flower_playing_cards\":{\"name\":\"Flower Playing Cards\",\"unified\":\"1F3B4\",\"variations\":[],\"sheet_x\":9,\"sheet_y\":35,\"short_names\":[\"flower_playing_cards\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"game\",\"sunset\",\"red\"],\"search\":\"flower,playing,cards,game,sunset,red\"},\"thought_balloon\":{\"name\":\"Thought Balloon\",\"unified\":\"1F4AD\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":25,\"short_names\":[\"thought_balloon\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"bubble\",\"cloud\",\"speech\",\"thinking\"],\"search\":\"thought,balloon,bubble,cloud,speech,thinking\"},\"flag-wf\":{\"name\":\"Regional Indicator Symbol Letters WF\",\"unified\":\"1F1FC-1F1EB\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":36,\"short_names\":[\"flag-wf\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,wf,regional,indicator,symbol,letters\"},\"flag-eh\":{\"name\":\"Regional Indicator Symbol Letters EH\",\"unified\":\"1F1EA-1F1ED\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":20,\"short_names\":[\"flag-eh\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,eh,regional,indicator,symbol,letters\"},\"right_anger_bubble\":{\"name\":\"Right Anger Bubble\",\"unified\":\"1F5EF\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":7,\"short_names\":[\"right_anger_bubble\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"caption\",\"speech\",\"thinking\",\"mad\"],\"search\":\"right,anger,bubble,caption,speech,thinking,mad\"},\"speech_balloon\":{\"name\":\"Speech Balloon\",\"unified\":\"1F4AC\",\"variations\":[],\"sheet_x\":20,\"sheet_y\":24,\"short_names\":[\"speech_balloon\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"bubble\",\"words\",\"message\",\"talk\",\"chatting\"],\"search\":\"speech,balloon,bubble,words,message,talk,chatting\"},\"flag-ye\":{\"name\":\"Regional Indicator Symbol Letters YE\",\"unified\":\"1F1FE-1F1EA\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":39,\"short_names\":[\"flag-ye\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ye,regional,indicator,symbol,letters\"},\"left_speech_bubble\":{\"name\":\"Left Speech Bubble\",\"unified\":\"1F5E8\",\"variations\":[],\"sheet_x\":26,\"sheet_y\":6,\"short_names\":[\"left_speech_bubble\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":false,\"emoticons\":[],\"keywords\":[\"words\",\"message\",\"talk\",\"chatting\"],\"search\":\"left,speech,bubble,words,message,talk,chatting\"},\"flag-zm\":{\"name\":\"Regional Indicator Symbol Letters ZM\",\"unified\":\"1F1FF-1F1F2\",\"variations\":[],\"sheet_x\":39,\"sheet_y\":1,\"short_names\":[\"flag-zm\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,zm,regional,indicator,symbol,letters\"},\"clock1\":{\"name\":\"Clock Face One Oclock\",\"unified\":\"1F550\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":11,\"short_names\":[\"clock1\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\"],\"search\":\"clock1,clock,face,one,oclock,time,late,early,schedule\"},\"flag-zw\":{\"name\":\"Regional Indicator Symbol Letters ZW\",\"unified\":\"1F1FF-1F1FC\",\"variations\":[],\"sheet_x\":39,\"sheet_y\":2,\"short_names\":[\"flag-zw\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,zw,regional,indicator,symbol,letters\"},\"flag-ac\":{\"name\":\"Regional Indicator Symbol Letters AC\",\"unified\":\"1F1E6-1F1E8\",\"variations\":[],\"sheet_x\":32,\"sheet_y\":33,\"short_names\":[\"flag-ac\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ac,regional,indicator,symbol,letters\"},\"clock2\":{\"name\":\"Clock Face Two Oclock\",\"unified\":\"1F551\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":12,\"short_names\":[\"clock2\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\"],\"search\":\"clock2,clock,face,two,oclock,time,late,early,schedule\"},\"flag-bv\":{\"name\":\"Regional Indicator Symbol Letters BV\",\"unified\":\"1F1E7-1F1FB\",\"variations\":[],\"sheet_x\":33,\"sheet_y\":26,\"short_names\":[\"flag-bv\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,bv,regional,indicator,symbol,letters\"},\"clock3\":{\"name\":\"Clock Face Three Oclock\",\"unified\":\"1F552\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":13,\"short_names\":[\"clock3\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\"],\"search\":\"clock3,clock,face,three,oclock,time,late,early,schedule\"},\"flag-cp\":{\"name\":\"Regional Indicator Symbol Letters CP\",\"unified\":\"1F1E8-1F1F5\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":1,\"short_names\":[\"flag-cp\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,cp,regional,indicator,symbol,letters\"},\"clock4\":{\"name\":\"Clock Face Four Oclock\",\"unified\":\"1F553\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":14,\"short_names\":[\"clock4\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\"],\"search\":\"clock4,clock,face,four,oclock,time,late,early,schedule\"},\"clock5\":{\"name\":\"Clock Face Five Oclock\",\"unified\":\"1F554\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":15,\"short_names\":[\"clock5\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\"],\"search\":\"clock5,clock,face,five,oclock,time,late,early,schedule\"},\"flag-dg\":{\"name\":\"Regional Indicator Symbol Letters DG\",\"unified\":\"1F1E9-1F1EC\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":10,\"short_names\":[\"flag-dg\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,dg,regional,indicator,symbol,letters\"},\"clock6\":{\"name\":\"Clock Face Six Oclock\",\"unified\":\"1F555\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":16,\"short_names\":[\"clock6\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\",\"dawn\",\"dusk\"],\"search\":\"clock6,clock,face,six,oclock,time,late,early,schedule,dawn,dusk\"},\"flag-ea\":{\"name\":\"Regional Indicator Symbol Letters EA\",\"unified\":\"1F1EA-1F1E6\",\"variations\":[],\"sheet_x\":34,\"sheet_y\":16,\"short_names\":[\"flag-ea\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ea,regional,indicator,symbol,letters\"},\"flag-hm\":{\"name\":\"Regional Indicator Symbol Letters HM\",\"unified\":\"1F1ED-1F1F2\",\"variations\":[],\"sheet_x\":35,\"sheet_y\":10,\"short_names\":[\"flag-hm\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,hm,regional,indicator,symbol,letters\"},\"clock7\":{\"name\":\"Clock Face Seven Oclock\",\"unified\":\"1F556\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":17,\"short_names\":[\"clock7\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\"],\"search\":\"clock7,clock,face,seven,oclock,time,late,early,schedule\"},\"flag-mf\":{\"name\":\"Regional Indicator Symbol Letters MF\",\"unified\":\"1F1F2-1F1EB\",\"variations\":[],\"sheet_x\":36,\"sheet_y\":15,\"short_names\":[\"flag-mf\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,mf,regional,indicator,symbol,letters\"},\"clock8\":{\"name\":\"Clock Face Eight Oclock\",\"unified\":\"1F557\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":18,\"short_names\":[\"clock8\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\"],\"search\":\"clock8,clock,face,eight,oclock,time,late,early,schedule\"},\"clock9\":{\"name\":\"Clock Face Nine Oclock\",\"unified\":\"1F558\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":19,\"short_names\":[\"clock9\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\"],\"search\":\"clock9,clock,face,nine,oclock,time,late,early,schedule\"},\"flag-sj\":{\"name\":\"Regional Indicator Symbol Letters SJ\",\"unified\":\"1F1F8-1F1EF\",\"variations\":[],\"sheet_x\":37,\"sheet_y\":34,\"short_names\":[\"flag-sj\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,sj,regional,indicator,symbol,letters\"},\"flag-ta\":{\"name\":\"Regional Indicator Symbol Letters TA\",\"unified\":\"1F1F9-1F1E6\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":6,\"short_names\":[\"flag-ta\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,ta,regional,indicator,symbol,letters\"},\"clock10\":{\"name\":\"Clock Face Ten Oclock\",\"unified\":\"1F559\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":20,\"short_names\":[\"clock10\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\"],\"search\":\"clock10,clock,face,ten,oclock,time,late,early,schedule\"},\"flag-um\":{\"name\":\"Regional Indicator Symbol Letters UM\",\"unified\":\"1F1FA-1F1F2\",\"variations\":[],\"sheet_x\":38,\"sheet_y\":25,\"short_names\":[\"flag-um\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"flag,um,regional,indicator,symbol,letters\"},\"clock11\":{\"name\":\"Clock Face Eleven Oclock\",\"unified\":\"1F55A\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":21,\"short_names\":[\"clock11\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\"],\"search\":\"clock11,clock,face,eleven,oclock,time,late,early,schedule\"},\"clock12\":{\"name\":\"Clock Face Twelve Oclock\",\"unified\":\"1F55B\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":22,\"short_names\":[\"clock12\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"noon\",\"midnight\",\"midday\",\"late\",\"early\",\"schedule\"],\"search\":\"clock12,clock,face,twelve,oclock,time,noon,midnight,midday,late,early,schedule\"},\"clock130\":{\"name\":\"Clock Face One-Thirty\",\"unified\":\"1F55C\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":23,\"short_names\":[\"clock130\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\"],\"search\":\"clock130,clock,face,one,thirty,time,late,early,schedule\"},\"clock230\":{\"name\":\"Clock Face Two-Thirty\",\"unified\":\"1F55D\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":24,\"short_names\":[\"clock230\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\"],\"search\":\"clock230,clock,face,two,thirty,time,late,early,schedule\"},\"clock330\":{\"name\":\"Clock Face Three-Thirty\",\"unified\":\"1F55E\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":25,\"short_names\":[\"clock330\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\"],\"search\":\"clock330,clock,face,three,thirty,time,late,early,schedule\"},\"clock430\":{\"name\":\"Clock Face Four-Thirty\",\"unified\":\"1F55F\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":26,\"short_names\":[\"clock430\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\"],\"search\":\"clock430,clock,face,four,thirty,time,late,early,schedule\"},\"clock530\":{\"name\":\"Clock Face Five-Thirty\",\"unified\":\"1F560\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":27,\"short_names\":[\"clock530\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\"],\"search\":\"clock530,clock,face,five,thirty,time,late,early,schedule\"},\"clock630\":{\"name\":\"Clock Face Six-Thirty\",\"unified\":\"1F561\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":28,\"short_names\":[\"clock630\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\"],\"search\":\"clock630,clock,face,six,thirty,time,late,early,schedule\"},\"clock730\":{\"name\":\"Clock Face Seven-Thirty\",\"unified\":\"1F562\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":29,\"short_names\":[\"clock730\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\"],\"search\":\"clock730,clock,face,seven,thirty,time,late,early,schedule\"},\"clock830\":{\"name\":\"Clock Face Eight-Thirty\",\"unified\":\"1F563\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":30,\"short_names\":[\"clock830\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\"],\"search\":\"clock830,clock,face,eight,thirty,time,late,early,schedule\"},\"clock930\":{\"name\":\"Clock Face Nine-Thirty\",\"unified\":\"1F564\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":31,\"short_names\":[\"clock930\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\"],\"search\":\"clock930,clock,face,nine,thirty,time,late,early,schedule\"},\"clock1030\":{\"name\":\"Clock Face Ten-Thirty\",\"unified\":\"1F565\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":32,\"short_names\":[\"clock1030\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\"],\"search\":\"clock1030,clock,face,ten,thirty,time,late,early,schedule\"},\"clock1130\":{\"name\":\"Clock Face Eleven-Thirty\",\"unified\":\"1F566\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":33,\"short_names\":[\"clock1130\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\"],\"search\":\"clock1130,clock,face,eleven,thirty,time,late,early,schedule\"},\"clock1230\":{\"name\":\"Clock Face Twelve-Thirty\",\"unified\":\"1F567\",\"variations\":[],\"sheet_x\":24,\"sheet_y\":34,\"short_names\":[\"clock1230\"],\"has_img_apple\":true,\"has_img_google\":true,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[\"time\",\"late\",\"early\",\"schedule\"],\"search\":\"clock1230,clock,face,twelve,thirty,time,late,early,schedule\"}},\"skins\":{\"skin-tone-2\":{\"name\":\"Emoji Modifier Fitzpatrick Type-1-2\",\"unified\":\"1F3FB\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":0,\"short_names\":[\"skin-tone-2\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"skin,tone,2,emoji,modifier,fitzpatrick,type,1\"},\"skin-tone-3\":{\"name\":\"Emoji Modifier Fitzpatrick Type-3\",\"unified\":\"1F3FC\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":1,\"short_names\":[\"skin-tone-3\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"skin,tone,3,emoji,modifier,fitzpatrick,type\"},\"skin-tone-4\":{\"name\":\"Emoji Modifier Fitzpatrick Type-4\",\"unified\":\"1F3FD\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":2,\"short_names\":[\"skin-tone-4\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"skin,tone,4,emoji,modifier,fitzpatrick,type\"},\"skin-tone-5\":{\"name\":\"Emoji Modifier Fitzpatrick Type-5\",\"unified\":\"1F3FE\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":3,\"short_names\":[\"skin-tone-5\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"skin,tone,5,emoji,modifier,fitzpatrick,type\"},\"skin-tone-6\":{\"name\":\"Emoji Modifier Fitzpatrick Type-6\",\"unified\":\"1F3FF\",\"variations\":[],\"sheet_x\":12,\"sheet_y\":4,\"short_names\":[\"skin-tone-6\"],\"has_img_apple\":true,\"has_img_google\":false,\"has_img_twitter\":true,\"has_img_emojione\":true,\"emoticons\":[],\"keywords\":[],\"search\":\"skin,tone,6,emoji,modifier,fitzpatrick,type\"}},\"short_names\":{\"red_car\":\"car\",\"satisfied\":\"laughing\",\"telephone\":\"phone\",\"honeybee\":\"bee\",\"sailboat\":\"boat\",\"flipper\":\"dolphin\",\"cn\":\"flag-cn\",\"knife\":\"hocho\",\"poop\":\"hankey\",\"shit\":\"hankey\",\"paw_prints\":\"feet\",\"fr\":\"flag-fr\",\"heavy_exclamation_mark\":\"exclamation\",\"de\":\"flag-de\",\"thumbsup\":\"+1\",\"thumbsdown\":\"-1\",\"punch\":\"facepunch\",\"raised_hand\":\"hand\",\"reversed_hand_with_middle_finger_extended\":\"middle_finger\",\"sign_of_the_horns\":\"the_horns\",\"it\":\"flag-it\",\"lantern\":\"izakaya_lantern\",\"waxing_gibbous_moon\":\"moon\",\"envelope\":\"email\",\"jp\":\"flag-jp\",\"sun_small_cloud\":\"mostly_sunny\",\"sun_behind_cloud\":\"barely_sunny\",\"sun_behind_rain_cloud\":\"partly_sunny_rain\",\"lightning_cloud\":\"lightning\",\"collision\":\"boom\",\"running\":\"runner\",\"tornado_cloud\":\"tornado\",\"man_and_woman_holding_hands\":\"couple\",\"open_book\":\"book\",\"man-woman-boy\":\"family\",\"pencil\":\"memo\",\"tshirt\":\"shirt\",\"ru\":\"flag-ru\",\"shoe\":\"mans_shoe\",\"kr\":\"flag-kr\",\"es\":\"flag-es\",\"gb\":\"flag-gb\",\"uk\":\"flag-gb\",\"us\":\"flag-us\"}};\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\texports.unifiedToNative = exports.deepMerge = exports.intersect = exports.getSanitizedData = exports.getData = undefined;\n\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\n\tvar _data = __webpack_require__(19);\n\n\tvar _data2 = _interopRequireDefault(_data);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n\tvar COLONS_REGEX = /^(?:\\:([^\\:]+)\\:)(?:\\:skin-tone-(\\d)\\:)?$/;\n\tvar SKINS = ['1F3FA', '1F3FB', '1F3FC', '1F3FD', '1F3FE', '1F3FF'];\n\n\tfunction unifiedToNative(unified) {\n\t  var unicodes = unified.split('-'),\n\t      codePoints = unicodes.map(function (u) {\n\t    return '0x' + u;\n\t  });\n\n\t  return String.fromCodePoint.apply(String, _toConsumableArray(codePoints));\n\t}\n\n\tfunction sanitize(emoji) {\n\t  var name = emoji.name;\n\t  var short_names = emoji.short_names;\n\t  var skin_tone = emoji.skin_tone;\n\t  var skin_variations = emoji.skin_variations;\n\t  var emoticons = emoji.emoticons;\n\t  var unified = emoji.unified;\n\t  var id = short_names[0];\n\t  var colons = ':' + id + ':';\n\n\t  if (skin_tone) {\n\t    colons += ':skin-tone-' + skin_tone + ':';\n\t  }\n\n\t  return {\n\t    id: id,\n\t    name: name,\n\t    colons: colons,\n\t    emoticons: emoticons,\n\t    skin: skin_tone || (skin_variations ? 1 : null),\n\t    native: unifiedToNative(unified)\n\t  };\n\t}\n\n\tfunction getSanitizedData() {\n\t  return sanitize(getData.apply(undefined, arguments));\n\t}\n\n\tfunction getData(emoji, skin, set) {\n\t  var emojiData = {};\n\n\t  if (typeof emoji == 'string') {\n\t    var matches = emoji.match(COLONS_REGEX);\n\n\t    if (matches) {\n\t      emoji = matches[1];\n\n\t      if (matches[2]) {\n\t        skin = parseInt(matches[2]);\n\t      }\n\t    }\n\n\t    if (_data2.default.short_names.hasOwnProperty(emoji)) {\n\t      emoji = _data2.default.short_names[emoji];\n\t    }\n\n\t    if (_data2.default.emojis.hasOwnProperty(emoji)) {\n\t      emojiData = _data2.default.emojis[emoji];\n\t    }\n\t  } else if (emoji.id) {\n\t    if (_data2.default.short_names.hasOwnProperty(emoji.id)) {\n\t      emoji.id = _data2.default.short_names[emoji.id];\n\t    }\n\n\t    if (_data2.default.emojis.hasOwnProperty(emoji.id)) {\n\t      emojiData = _data2.default.emojis[emoji.id];\n\t      skin || (skin = emoji.skin);\n\t    }\n\t  }\n\n\t  if (emojiData.skin_variations && skin > 1 && set) {\n\t    emojiData = JSON.parse(JSON.stringify(emojiData));\n\n\t    var skinKey = SKINS[skin - 1],\n\t        variationKey = emojiData.unified + '-' + skinKey,\n\t        variationData = emojiData.skin_variations[variationKey];\n\n\t    if (variationData['has_img_' + set]) {\n\t      emojiData.skin_tone = skin;\n\n\t      for (var k in variationData) {\n\t        var v = variationData[k];\n\t        emojiData[k] = v;\n\t      }\n\t    }\n\t  }\n\n\t  return emojiData;\n\t}\n\n\tfunction intersect(a, b) {\n\t  var aSet = new Set(a),\n\t      bSet = new Set(b),\n\t      intersection = null;\n\n\t  intersection = new Set([].concat(_toConsumableArray(aSet)).filter(function (x) {\n\t    return bSet.has(x);\n\t  }));\n\n\t  return Array.from(intersection);\n\t}\n\n\tfunction deepMerge(a, b) {\n\t  var o = {};\n\n\t  for (var key in a) {\n\t    var originalValue = a[key],\n\t        value = originalValue;\n\n\t    if (b.hasOwnProperty(key)) {\n\t      value = b[key];\n\t    }\n\n\t    if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object') {\n\t      value = deepMerge(originalValue, value);\n\t    }\n\n\t    o[key] = value;\n\t  }\n\n\t  return o;\n\t}\n\n\texports.getData = getData;\n\texports.getSanitizedData = getSanitizedData;\n\texports.intersect = intersect;\n\texports.deepMerge = deepMerge;\n\texports.unifiedToNative = unifiedToNative;\n\n/***/ },\n/* 21 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n\tvar _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\n\t__webpack_require__(22);\n\n\tvar _react = __webpack_require__(3);\n\n\tvar _react2 = _interopRequireDefault(_react);\n\n\tvar _data = __webpack_require__(19);\n\n\tvar _data2 = _interopRequireDefault(_data);\n\n\tvar _store = __webpack_require__(17);\n\n\tvar _store2 = _interopRequireDefault(_store);\n\n\tvar _frequently = __webpack_require__(16);\n\n\tvar _frequently2 = _interopRequireDefault(_frequently);\n\n\tvar _utils = __webpack_require__(20);\n\n\tvar _ = __webpack_require__(1);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _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\n\tfunction _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\n\tvar RECENT_CATEGORY = { name: 'Recent', emojis: null };\n\tvar SEARCH_CATEGORY = { name: 'Search', emojis: null, anchor: RECENT_CATEGORY };\n\n\tvar CATEGORIES = [SEARCH_CATEGORY, RECENT_CATEGORY].concat(_data2.default.categories);\n\n\tvar I18N = {\n\t  search: 'Search',\n\t  categories: {\n\t    search: 'Search Results',\n\t    recent: 'Frequently Used',\n\t    people: 'Smileys & People',\n\t    nature: 'Animals & Nature',\n\t    foods: 'Food & Drink',\n\t    activity: 'Activity',\n\t    places: 'Travel & Places',\n\t    objects: 'Objects',\n\t    symbols: 'Symbols',\n\t    flags: 'Flags'\n\t  }\n\t};\n\n\tvar Picker = function (_React$Component) {\n\t  _inherits(Picker, _React$Component);\n\n\t  function Picker(props) {\n\t    _classCallCheck(this, Picker);\n\n\t    var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(Picker).call(this, props));\n\n\t    _this.i18n = (0, _utils.deepMerge)(I18N, props.i18n);\n\t    _this.state = {\n\t      skin: _store2.default.get('skin') || props.skin,\n\t      firstRender: true\n\t    };\n\t    return _this;\n\t  }\n\n\t  _createClass(Picker, [{\n\t    key: 'componentWillReceiveProps',\n\t    value: function componentWillReceiveProps(props) {\n\t      if (props.skin && !_store2.default.get('skin')) {\n\t        this.setState({ skin: props.skin });\n\t      }\n\t    }\n\t  }, {\n\t    key: 'componentDidMount',\n\t    value: function componentDidMount() {\n\t      var _this2 = this;\n\n\t      if (this.state.firstRender) {\n\t        this.testStickyPosition();\n\t        this.firstRenderTimeout = setTimeout(function () {\n\t          _this2.setState({ firstRender: false });\n\t        }, 60);\n\t      }\n\t    }\n\t  }, {\n\t    key: 'componentDidUpdate',\n\t    value: function componentDidUpdate() {\n\t      this.updateCategoriesSize();\n\t      this.handleScroll();\n\t    }\n\t  }, {\n\t    key: 'componentWillUnmount',\n\t    value: function componentWillUnmount() {\n\t      SEARCH_CATEGORY.emojis = null;\n\n\t      clearTimeout(this.leaveTimeout);\n\t      clearTimeout(this.firstRenderTimeout);\n\t    }\n\t  }, {\n\t    key: 'testStickyPosition',\n\t    value: function testStickyPosition() {\n\t      var stickyTestElement = document.createElement('div');\n\t      var _arr = ['', '-webkit-', '-ms-', '-moz-', '-o-'];\n\t      for (var _i = 0; _i < _arr.length; _i++) {\n\t        var prefix = _arr[_i];\n\t        stickyTestElement.style.position = prefix + 'sticky';\n\t      }\n\n\t      this.hasStickyPosition = !!stickyTestElement.style.position.length;\n\t    }\n\t  }, {\n\t    key: 'handleEmojiOver',\n\t    value: function handleEmojiOver(emoji) {\n\t      var preview = this.refs.preview;\n\n\t      preview.setState({ emoji: emoji });\n\t      clearTimeout(this.leaveTimeout);\n\t    }\n\t  }, {\n\t    key: 'handleEmojiLeave',\n\t    value: function handleEmojiLeave(emoji) {\n\t      var _this3 = this;\n\n\t      this.leaveTimeout = setTimeout(function () {\n\t        var preview = _this3.refs.preview;\n\n\t        preview.setState({ emoji: null });\n\t      }, 16);\n\t    }\n\t  }, {\n\t    key: 'handleEmojiClick',\n\t    value: function handleEmojiClick(emoji, e) {\n\t      var _this4 = this;\n\n\t      this.props.onClick(emoji, e);\n\t      _frequently2.default.add(emoji);\n\n\t      var component = this.refs['category-1'];\n\t      if (component) {\n\t        (function () {\n\t          var maxMargin = component.maxMargin;\n\t          component.forceUpdate();\n\n\t          window.requestAnimationFrame(function () {\n\t            component.memoizeSize();\n\t            if (maxMargin == component.maxMargin) return;\n\n\t            _this4.updateCategoriesSize();\n\t            _this4.handleScrollPaint();\n\n\t            if (SEARCH_CATEGORY.emojis) {\n\t              component.updateDisplay('none');\n\t            }\n\t          });\n\t        })();\n\t      }\n\t    }\n\t  }, {\n\t    key: 'handleScroll',\n\t    value: function handleScroll() {\n\t      if (!this.waitingForPaint) {\n\t        this.waitingForPaint = true;\n\t        window.requestAnimationFrame(this.handleScrollPaint.bind(this));\n\t      }\n\t    }\n\t  }, {\n\t    key: 'handleScrollPaint',\n\t    value: function handleScrollPaint() {\n\t      this.waitingForPaint = false;\n\n\t      if (!this.refs.scroll) {\n\t        return;\n\t      }\n\n\t      var target = this.refs.scroll,\n\t          scrollTop = target.scrollTop,\n\t          scrollingDown = scrollTop > (this.scrollTop || 0),\n\t          activeCategory = null,\n\t          minTop = 0;\n\n\t      for (var i = 0, l = CATEGORIES.length; i < l; i++) {\n\t        var ii = scrollingDown ? CATEGORIES.length - 1 - i : i,\n\t            category = CATEGORIES[ii],\n\t            component = this.refs['category-' + ii];\n\n\t        if (component) {\n\t          var active = component.handleScroll(scrollTop);\n\n\t          if (!minTop || component.top < minTop) {\n\t            if (component.top > 0) {\n\t              minTop = component.top;\n\t            }\n\t          }\n\n\t          if (active && !activeCategory) {\n\t            if (category.anchor) category = category.anchor;\n\t            activeCategory = category;\n\t          }\n\t        }\n\t      }\n\n\t      if (scrollTop < minTop) {\n\t        activeCategory = RECENT_CATEGORY;\n\t      }\n\n\t      if (activeCategory) {\n\t        var anchors = this.refs.anchors;\n\t        var _activeCategory = activeCategory;\n\t        var categoryName = _activeCategory.name;\n\n\n\t        if (anchors.state.selected != categoryName) {\n\t          anchors.setState({ selected: categoryName });\n\t        }\n\t      }\n\n\t      this.scrollTop = scrollTop;\n\t    }\n\t  }, {\n\t    key: 'handleSearch',\n\t    value: function handleSearch(emojis) {\n\t      SEARCH_CATEGORY.emojis = emojis;\n\n\t      for (var i = 0, l = CATEGORIES.length; i < l; i++) {\n\t        var component = this.refs['category-' + i];\n\n\t        if (component && component.props.name != 'Search') {\n\t          var display = emojis ? 'none' : null;\n\t          component.updateDisplay(display);\n\t        }\n\t      }\n\n\t      this.forceUpdate();\n\t    }\n\t  }, {\n\t    key: 'handleAnchorClick',\n\t    value: function handleAnchorClick(category, i) {\n\t      var component = this.refs['category-' + i];\n\t      var _refs = this.refs;\n\t      var scroll = _refs.scroll;\n\t      var anchors = _refs.anchors;\n\t      var scrollToComponent = null;\n\n\t      scrollToComponent = function scrollToComponent() {\n\t        if (component) {\n\t          var top = component.top;\n\n\n\t          if (category.name == 'Recent') {\n\t            top = 0;\n\t          } else {\n\t            top += 1;\n\t          }\n\n\t          scroll.scrollTop = top;\n\t        }\n\t      };\n\n\t      if (SEARCH_CATEGORY.emojis) {\n\t        this.handleSearch(null);\n\t        this.refs.search.clear();\n\n\t        window.requestAnimationFrame(scrollToComponent);\n\t      } else {\n\t        scrollToComponent();\n\t      }\n\t    }\n\t  }, {\n\t    key: 'handleSkinChange',\n\t    value: function handleSkinChange(skin) {\n\t      var newState = { skin: skin };\n\n\t      this.setState(newState);\n\t      _store2.default.update(newState);\n\t    }\n\t  }, {\n\t    key: 'updateCategoriesSize',\n\t    value: function updateCategoriesSize() {\n\t      for (var i = 0, l = CATEGORIES.length; i < l; i++) {\n\t        var component = this.refs['category-' + i];\n\t        if (component) component.memoizeSize();\n\t      }\n\t    }\n\t  }, {\n\t    key: 'getCategories',\n\t    value: function getCategories() {\n\t      var categories = CATEGORIES;\n\n\t      return this.state.firstRender ? categories.slice(0, 3) : categories;\n\t    }\n\t  }, {\n\t    key: 'render',\n\t    value: function render() {\n\t      var _this5 = this;\n\n\t      var _props = this.props;\n\t      var perLine = _props.perLine;\n\t      var emojiSize = _props.emojiSize;\n\t      var set = _props.set;\n\t      var sheetSize = _props.sheetSize;\n\t      var style = _props.style;\n\t      var title = _props.title;\n\t      var emoji = _props.emoji;\n\t      var color = _props.color;\n\t      var backgroundImageFn = _props.backgroundImageFn;\n\t      var skin = this.state.skin;\n\t      var width = perLine * (emojiSize + 12) + 12 + 2;\n\n\t      return _react2.default.createElement(\n\t        'div',\n\t        { style: _extends({}, style, { width: width }), className: 'emoji-mart' },\n\t        _react2.default.createElement(\n\t          'div',\n\t          { className: 'emoji-mart-bar' },\n\t          _react2.default.createElement(_.Anchors, {\n\t            ref: 'anchors',\n\t            i18n: this.i18n,\n\t            color: color,\n\t            categories: CATEGORIES,\n\t            onAnchorClick: this.handleAnchorClick.bind(this)\n\t          })\n\t        ),\n\t        _react2.default.createElement(\n\t          'div',\n\t          { ref: 'scroll', className: 'emoji-mart-scroll', onScroll: this.handleScroll.bind(this) },\n\t          _react2.default.createElement(_.Search, {\n\t            ref: 'search',\n\t            onSearch: this.handleSearch.bind(this),\n\t            i18n: this.i18n\n\t          }),\n\t          this.getCategories().map(function (category, i) {\n\t            return _react2.default.createElement(_.Category, {\n\t              ref: 'category-' + i,\n\t              key: category.name,\n\t              name: category.name,\n\t              emojis: category.emojis,\n\t              perLine: perLine,\n\t              hasStickyPosition: _this5.hasStickyPosition,\n\t              i18n: _this5.i18n,\n\t              emojiProps: {\n\t                skin: skin,\n\t                size: emojiSize,\n\t                set: set,\n\t                sheetSize: sheetSize,\n\t                backgroundImageFn: backgroundImageFn,\n\t                onOver: _this5.handleEmojiOver.bind(_this5),\n\t                onLeave: _this5.handleEmojiLeave.bind(_this5),\n\t                onClick: _this5.handleEmojiClick.bind(_this5)\n\t              }\n\t            });\n\t          })\n\t        ),\n\t        _react2.default.createElement(\n\t          'div',\n\t          { className: 'emoji-mart-bar' },\n\t          _react2.default.createElement(_.Preview, {\n\t            ref: 'preview',\n\t            title: title,\n\t            emoji: emoji,\n\t            emojiProps: {\n\t              size: 38,\n\t              skin: skin,\n\t              set: set,\n\t              sheetSize: sheetSize,\n\t              backgroundImageFn: backgroundImageFn\n\t            },\n\t            skinsProps: {\n\t              skin: skin,\n\t              onChange: this.handleSkinChange.bind(this)\n\t            }\n\t          })\n\t        )\n\t      );\n\t    }\n\t  }]);\n\n\t  return Picker;\n\t}(_react2.default.Component);\n\n\texports.default = Picker;\n\n\n\tPicker.propTypes = {\n\t  onClick: _react2.default.PropTypes.func,\n\t  perLine: _react2.default.PropTypes.number,\n\t  emojiSize: _react2.default.PropTypes.number,\n\t  i18n: _react2.default.PropTypes.object,\n\t  style: _react2.default.PropTypes.object,\n\t  title: _react2.default.PropTypes.string,\n\t  emoji: _react2.default.PropTypes.string,\n\t  color: _react2.default.PropTypes.string,\n\t  set: _.Emoji.propTypes.set,\n\t  backgroundImageFn: _.Emoji.propTypes.backgroundImageFn,\n\t  skin: _.Emoji.propTypes.skin,\n\t  sheetSize: _.Emoji.propTypes.sheetSize\n\t};\n\n\tPicker.defaultProps = {\n\t  onClick: function onClick() {},\n\t  emojiSize: 24,\n\t  perLine: 9,\n\t  i18n: {},\n\t  style: {},\n\t  title: 'Emoji Mart™',\n\t  emoji: 'department_store',\n\t  color: '#ae65c5',\n\t  set: _.Emoji.defaultProps.set,\n\t  skin: _.Emoji.defaultProps.skin,\n\t  sheetSize: _.Emoji.defaultProps.sheetSize,\n\t  backgroundImageFn: _.Emoji.defaultProps.backgroundImageFn\n\t};\n\n/***/ },\n/* 22 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\t// http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n\t// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating\n\n\t// requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel\n\n\t// MIT license\n\n\tvar isWindowAvailable = typeof window !== 'undefined';\n\n\tisWindowAvailable && function () {\n\t  var lastTime = 0;\n\t  var vendors = ['ms', 'moz', 'webkit', 'o'];\n\n\t  for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\n\t    window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];\n\t    window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n\t  }\n\n\t  if (!window.requestAnimationFrame) window.requestAnimationFrame = function (callback, element) {\n\t    var currTime = new Date().getTime();\n\t    var timeToCall = Math.max(0, 16 - (currTime - lastTime));\n\t    var id = window.setTimeout(function () {\n\t      callback(currTime + timeToCall);\n\t    }, timeToCall);\n\n\t    lastTime = currTime + timeToCall;\n\t    return id;\n\t  };\n\n\t  if (!window.cancelAnimationFrame) window.cancelAnimationFrame = function (id) {\n\t    clearTimeout(id);\n\t  };\n\t}();\n\n/***/ },\n/* 23 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n\tvar _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\n\tvar _react = __webpack_require__(3);\n\n\tvar _react2 = _interopRequireDefault(_react);\n\n\tvar _ = __webpack_require__(1);\n\n\tvar _utils = __webpack_require__(20);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _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\n\tfunction _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\n\tvar Preview = function (_React$Component) {\n\t  _inherits(Preview, _React$Component);\n\n\t  function Preview(props) {\n\t    _classCallCheck(this, Preview);\n\n\t    var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(Preview).call(this, props));\n\n\t    _this.state = { emoji: null };\n\t    return _this;\n\t  }\n\n\t  _createClass(Preview, [{\n\t    key: 'render',\n\t    value: function render() {\n\t      var emoji = this.state.emoji;\n\t      var _props = this.props;\n\t      var emojiProps = _props.emojiProps;\n\t      var skinsProps = _props.skinsProps;\n\t      var title = _props.title;\n\t      var idleEmoji = _props.emoji;\n\n\n\t      if (emoji) {\n\t        var emojiData = (0, _utils.getData)(emoji);\n\t        var emoticons = emojiData.emoticons;\n\t        var knownEmoticons = [];\n\t        var listedEmoticons = [];\n\n\t        var _iteratorNormalCompletion = true;\n\t        var _didIteratorError = false;\n\t        var _iteratorError = undefined;\n\n\t        try {\n\t          for (var _iterator = emoticons[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n\t            var emoticon = _step.value;\n\n\t            if (knownEmoticons.indexOf(emoticon.toLowerCase()) == -1) {\n\t              knownEmoticons.push(emoticon.toLowerCase());\n\t              listedEmoticons.push(emoticon);\n\t            }\n\t          }\n\t        } catch (err) {\n\t          _didIteratorError = true;\n\t          _iteratorError = err;\n\t        } finally {\n\t          try {\n\t            if (!_iteratorNormalCompletion && _iterator.return) {\n\t              _iterator.return();\n\t            }\n\t          } finally {\n\t            if (_didIteratorError) {\n\t              throw _iteratorError;\n\t            }\n\t          }\n\t        }\n\n\t        return _react2.default.createElement(\n\t          'div',\n\t          { className: 'emoji-mart-preview' },\n\t          _react2.default.createElement(\n\t            'div',\n\t            { className: 'emoji-mart-preview-emoji' },\n\t            _react2.default.createElement(_.Emoji, _extends({\n\t              key: emoji.id,\n\t              emoji: emoji\n\t            }, emojiProps))\n\t          ),\n\t          _react2.default.createElement(\n\t            'div',\n\t            { className: 'emoji-mart-preview-data' },\n\t            _react2.default.createElement(\n\t              'div',\n\t              { className: 'emoji-mart-preview-name' },\n\t              emoji.name\n\t            ),\n\t            _react2.default.createElement(\n\t              'div',\n\t              { className: 'emoji-mart-preview-shortnames' },\n\t              emojiData.short_names.map(function (short_name) {\n\t                return _react2.default.createElement(\n\t                  'span',\n\t                  { key: short_name, className: 'emoji-mart-preview-shortname' },\n\t                  ':',\n\t                  short_name,\n\t                  ':'\n\t                );\n\t              })\n\t            ),\n\t            _react2.default.createElement(\n\t              'div',\n\t              { className: 'emoji-mart-preview-emoticons' },\n\t              listedEmoticons.map(function (emoticon) {\n\t                return _react2.default.createElement(\n\t                  'span',\n\t                  { key: emoticon, className: 'emoji-mart-preview-emoticon' },\n\t                  emoticon\n\t                );\n\t              })\n\t            )\n\t          )\n\t        );\n\t      } else {\n\t        return _react2.default.createElement(\n\t          'div',\n\t          { className: 'emoji-mart-preview' },\n\t          _react2.default.createElement(\n\t            'div',\n\t            { className: 'emoji-mart-preview-emoji' },\n\t            _react2.default.createElement(_.Emoji, _extends({\n\t              emoji: idleEmoji\n\t            }, emojiProps))\n\t          ),\n\t          _react2.default.createElement(\n\t            'div',\n\t            { className: 'emoji-mart-preview-data' },\n\t            _react2.default.createElement(\n\t              'span',\n\t              { className: 'emoji-mart-title-label' },\n\t              title\n\t            )\n\t          ),\n\t          _react2.default.createElement(\n\t            'div',\n\t            { className: 'emoji-mart-preview-skins' },\n\t            _react2.default.createElement(_.Skins, skinsProps)\n\t          )\n\t        );\n\t      }\n\t    }\n\t  }]);\n\n\t  return Preview;\n\t}(_react2.default.Component);\n\n\texports.default = Preview;\n\n\n\tPreview.propTypes = {\n\t  title: _react2.default.PropTypes.string.isRequired,\n\t  emoji: _react2.default.PropTypes.string.isRequired,\n\t  emojiProps: _react2.default.PropTypes.object.isRequired,\n\t  skinsProps: _react2.default.PropTypes.object.isRequired\n\t};\n\n/***/ },\n/* 24 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\n\tvar _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\n\tvar _react = __webpack_require__(3);\n\n\tvar _react2 = _interopRequireDefault(_react);\n\n\tvar _emojiIndex = __webpack_require__(25);\n\n\tvar _emojiIndex2 = _interopRequireDefault(_emojiIndex);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _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\n\tfunction _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\n\tvar Search = function (_React$Component) {\n\t  _inherits(Search, _React$Component);\n\n\t  function Search() {\n\t    _classCallCheck(this, Search);\n\n\t    return _possibleConstructorReturn(this, Object.getPrototypeOf(Search).apply(this, arguments));\n\t  }\n\n\t  _createClass(Search, [{\n\t    key: 'handleChange',\n\t    value: function handleChange() {\n\t      var input = this.refs.input;\n\t      var value = input.value;\n\n\t      this.props.onSearch(_emojiIndex2.default.search(value));\n\t    }\n\t  }, {\n\t    key: 'clear',\n\t    value: function clear() {\n\t      this.refs.input.value = '';\n\t    }\n\t  }, {\n\t    key: 'render',\n\t    value: function render() {\n\t      var i18n = this.props.i18n;\n\n\n\t      return _react2.default.createElement('input', {\n\t        ref: 'input',\n\t        type: 'text',\n\t        onChange: this.handleChange.bind(this),\n\t        placeholder: i18n.search,\n\t        className: 'emoji-mart-search'\n\t      });\n\t    }\n\t  }]);\n\n\t  return Search;\n\t}(_react2.default.Component);\n\n\texports.default = Search;\n\n\n\tSearch.propTypes = {\n\t  onSearch: _react2.default.PropTypes.func,\n\t  maxResults: _react2.default.PropTypes.number\n\t};\n\n\tSearch.defaultProps = {\n\t  onSearch: function onSearch() {},\n\t  maxResults: 75\n\t};\n\n/***/ },\n/* 25 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\n\tvar _data = __webpack_require__(19);\n\n\tvar _data2 = _interopRequireDefault(_data);\n\n\tvar _ = __webpack_require__(20);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n\tvar index = {};\n\tvar emojisList = {};\n\tvar emoticonsList = {};\n\n\tfor (var emoji in _data2.default.emojis) {\n\t  var emojiData = _data2.default.emojis[emoji];\n\t  var short_names = emojiData.short_names;\n\t  var emoticons = emojiData.emoticons;\n\t  var id = short_names[0];\n\n\t  var _iteratorNormalCompletion = true;\n\t  var _didIteratorError = false;\n\t  var _iteratorError = undefined;\n\n\t  try {\n\t    for (var _iterator = emoticons[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n\t      var emoticon = _step.value;\n\n\t      if (!emoticonsList[emoticon]) {\n\t        emoticonsList[emoticon] = id;\n\t      }\n\t    }\n\t  } catch (err) {\n\t    _didIteratorError = true;\n\t    _iteratorError = err;\n\t  } finally {\n\t    try {\n\t      if (!_iteratorNormalCompletion && _iterator.return) {\n\t        _iterator.return();\n\t      }\n\t    } finally {\n\t      if (_didIteratorError) {\n\t        throw _iteratorError;\n\t      }\n\t    }\n\t  }\n\n\t  emojisList[id] = (0, _.getSanitizedData)(id);\n\t}\n\n\tfunction search(value) {\n\t  var maxResults = arguments.length <= 1 || arguments[1] === undefined ? 75 : arguments[1];\n\n\t  var results = null;\n\n\t  if (value.length) {\n\t    var values = value.toLowerCase().split(/[\\s|,|\\-|_]+/),\n\t        allResults = [];\n\n\t    if (values.length > 2) {\n\t      values = [values[0], values[1]];\n\t    }\n\n\t    allResults = values.map(function (value) {\n\t      var aPool = _data2.default.emojis,\n\t          aIndex = index,\n\t          length = 0;\n\n\t      if (value == '-' || value == '-1') {\n\t        return [emojisList['-1']];\n\t      }\n\n\t      var _iteratorNormalCompletion2 = true;\n\t      var _didIteratorError2 = false;\n\t      var _iteratorError2 = undefined;\n\n\t      try {\n\t        for (var _iterator2 = value.split('')[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n\t          var char = _step2.value;\n\n\t          length++;\n\n\t          aIndex[char] || (aIndex[char] = {});\n\t          aIndex = aIndex[char];\n\n\t          if (!aIndex.results) {\n\t            (function () {\n\t              var scores = {};\n\n\t              aIndex.results = [];\n\t              aIndex.pool = {};\n\n\t              for (var id in aPool) {\n\t                var _emoji = aPool[id];\n\t                var _search = _emoji.search;\n\t                var sub = value.substr(0, length);\n\t                var subIndex = _search.indexOf(sub);\n\n\t                if (subIndex != -1) {\n\t                  var score = subIndex + 1;\n\t                  if (sub == id) score = 0;\n\n\t                  aIndex.results.push(emojisList[id]);\n\t                  aIndex.pool[id] = _emoji;\n\n\t                  scores[id] = score;\n\t                }\n\t              }\n\n\t              aIndex.results.sort(function (a, b) {\n\t                var aScore = scores[a.id],\n\t                    bScore = scores[b.id];\n\n\t                return aScore - bScore;\n\t              });\n\t            })();\n\t          }\n\n\t          aPool = aIndex.pool;\n\t        }\n\t      } catch (err) {\n\t        _didIteratorError2 = true;\n\t        _iteratorError2 = err;\n\t      } finally {\n\t        try {\n\t          if (!_iteratorNormalCompletion2 && _iterator2.return) {\n\t            _iterator2.return();\n\t          }\n\t        } finally {\n\t          if (_didIteratorError2) {\n\t            throw _iteratorError2;\n\t          }\n\t        }\n\t      }\n\n\t      return aIndex.results;\n\t    }).filter(function (a) {\n\t      return a;\n\t    });\n\n\t    if (allResults.length > 1) {\n\t      results = _.intersect.apply(undefined, _toConsumableArray(allResults));\n\t    } else if (allResults.length) {\n\t      results = allResults[0];\n\t    } else {\n\t      results = [];\n\t    }\n\t  }\n\n\t  if (results && results.length) {\n\t    results = results.slice(0, maxResults);\n\t  }\n\n\t  return results;\n\t}\n\n\texports.default = { search: search, emojis: emojisList, emoticons: emoticonsList };\n\n/***/ },\n/* 26 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\n\tvar _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\n\tvar _react = __webpack_require__(3);\n\n\tvar _react2 = _interopRequireDefault(_react);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _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\n\tfunction _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\n\tvar Skins = function (_React$Component) {\n\t  _inherits(Skins, _React$Component);\n\n\t  function Skins(props) {\n\t    _classCallCheck(this, Skins);\n\n\t    var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(Skins).call(this, props));\n\n\t    _this.state = {\n\t      opened: false\n\t    };\n\t    return _this;\n\t  }\n\n\t  _createClass(Skins, [{\n\t    key: 'handleClick',\n\t    value: function handleClick(skin) {\n\t      var onChange = this.props.onChange;\n\n\n\t      if (!this.state.opened) {\n\t        this.setState({ opened: true });\n\t      } else {\n\t        onChange(skin);\n\t        this.setState({ opened: false });\n\t      }\n\t    }\n\t  }, {\n\t    key: 'render',\n\t    value: function render() {\n\t      var _this2 = this;\n\n\t      var skin = this.props.skin;\n\t      var opened = this.state.opened;\n\n\n\t      return _react2.default.createElement(\n\t        'div',\n\t        null,\n\t        _react2.default.createElement(\n\t          'div',\n\t          { className: 'emoji-mart-skin-swatches ' + (opened ? 'emoji-mart-skin-swatches-opened' : '') },\n\t          Array(6).fill().map(function (_, i) {\n\t            var skinTone = i + 1,\n\t                selected = skinTone == skin;\n\n\t            return _react2.default.createElement(\n\t              'span',\n\t              { key: 'skin-tone-' + skinTone, className: 'emoji-mart-skin-swatch ' + (selected ? 'emoji-mart-skin-swatch-selected' : '') },\n\t              _react2.default.createElement('span', {\n\t                onClick: function onClick() {\n\t                  return _this2.handleClick(skinTone);\n\t                },\n\t                className: 'emoji-mart-skin emoji-mart-skin-tone-' + skinTone })\n\t            );\n\t          })\n\t        )\n\t      );\n\t    }\n\t  }]);\n\n\t  return Skins;\n\t}(_react2.default.Component);\n\n\texports.default = Skins;\n\n\n\tSkins.propTypes = {\n\t  onChange: _react2.default.PropTypes.func,\n\t  skin: _react2.default.PropTypes.number.isRequired\n\t};\n\n\tSkins.defaultProps = {\n\t  onChange: function onChange() {}\n\t};\n\n/***/ }\n/******/ ])\n});\n;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbW9qaS1tYXJ0L2Rpc3QvZW1vamktbWFydC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXCJyZWFjdFwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJFbW9qaU1hcnRcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiRW1vamlNYXJ0XCJdID0gZmFjdG9yeShyb290W1wiUmVhY3RcIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8zX18pIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fSxcbi8qKioqKiovIFx0XHRcdGlkOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGxvYWRlZDogZmFsc2Vcbi8qKioqKiovIFx0XHR9O1xuXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuXG5cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRleHBvcnRzLmZyZXF1ZW50bHkgPSBleHBvcnRzLnN0b3JlID0gZXhwb3J0cy5lbW9qaUluZGV4ID0gZXhwb3J0cy5FbW9qaSA9IGV4cG9ydHMuUGlja2VyID0gdW5kZWZpbmVkO1xuXG5cdHZhciBfY29tcG9uZW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdQaWNrZXInLCB7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcblx0ICAgIHJldHVybiBfY29tcG9uZW50cy5QaWNrZXI7XG5cdCAgfVxuXHR9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdFbW9qaScsIHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuXHQgICAgcmV0dXJuIF9jb21wb25lbnRzLkVtb2ppO1xuXHQgIH1cblx0fSk7XG5cblx0dmFyIF9lbW9qaUluZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7XG5cblx0dmFyIF9lbW9qaUluZGV4MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Vtb2ppSW5kZXgpO1xuXG5cdHZhciBfc3RvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KTtcblxuXHR2YXIgX3N0b3JlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3N0b3JlKTtcblxuXHR2YXIgX2ZyZXF1ZW50bHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KTtcblxuXHR2YXIgX2ZyZXF1ZW50bHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZnJlcXVlbnRseSk7XG5cblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuXHRleHBvcnRzLmVtb2ppSW5kZXggPSBfZW1vamlJbmRleDIuZGVmYXVsdDtcblx0ZXhwb3J0cy5zdG9yZSA9IF9zdG9yZTIuZGVmYXVsdDtcblx0ZXhwb3J0cy5mcmVxdWVudGx5ID0gX2ZyZXF1ZW50bHkyLmRlZmF1bHQ7XG5cbi8qKiovIH0sXG4vKiAxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cblx0dmFyIF9hbmNob3JzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ0FuY2hvcnMnLCB7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcblx0ICAgIHJldHVybiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hbmNob3JzKS5kZWZhdWx0O1xuXHQgIH1cblx0fSk7XG5cblx0dmFyIF9jYXRlZ29yeSA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnQ2F0ZWdvcnknLCB7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcblx0ICAgIHJldHVybiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jYXRlZ29yeSkuZGVmYXVsdDtcblx0ICB9XG5cdH0pO1xuXG5cdHZhciBfZW1vamkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4KTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ0Vtb2ppJywge1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG5cdCAgICByZXR1cm4gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZW1vamkpLmRlZmF1bHQ7XG5cdCAgfVxuXHR9KTtcblxuXHR2YXIgX3BpY2tlciA9IF9fd2VicGFja19yZXF1aXJlX18oMjEpO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnUGlja2VyJywge1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG5cdCAgICByZXR1cm4gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcGlja2VyKS5kZWZhdWx0O1xuXHQgIH1cblx0fSk7XG5cblx0dmFyIF9wcmV2aWV3ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMyk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdQcmV2aWV3Jywge1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG5cdCAgICByZXR1cm4gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJldmlldykuZGVmYXVsdDtcblx0ICB9XG5cdH0pO1xuXG5cdHZhciBfc2VhcmNoID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdTZWFyY2gnLCB7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcblx0ICAgIHJldHVybiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zZWFyY2gpLmRlZmF1bHQ7XG5cdCAgfVxuXHR9KTtcblxuXHR2YXIgX3NraW5zID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNik7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdTa2lucycsIHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuXHQgICAgcmV0dXJuIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NraW5zKS5kZWZhdWx0O1xuXHQgIH1cblx0fSk7XG5cblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqKi8gfSxcbi8qIDIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0JztcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5cdHZhciBfcmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG5cdHZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG5cdHZhciBfc3ZnSW5saW5lUmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXG5cdHZhciBfc3ZnSW5saW5lUmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3ZnSW5saW5lUmVhY3QpO1xuXG5cdHZhciBfc3ZncyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG5cblx0dmFyIFNWR3MgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfc3Zncyk7XG5cblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBlbHNlIHsgdmFyIG5ld09iaiA9IHt9OyBpZiAob2JqICE9IG51bGwpIHsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyByZXR1cm4gbmV3T2JqOyB9IH1cblxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5cdGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cblx0ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cblx0ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cblx0dmFyIEFuY2hvcnMgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuXHQgIF9pbmhlcml0cyhBbmNob3JzLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuXHQgIGZ1bmN0aW9uIEFuY2hvcnMocHJvcHMpIHtcblx0ICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBbmNob3JzKTtcblxuXHQgICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgT2JqZWN0LmdldFByb3RvdHlwZU9mKEFuY2hvcnMpLmNhbGwodGhpcywgcHJvcHMpKTtcblxuXHQgICAgdmFyIGRlZmF1bHRDYXRlZ29yeSA9IHByb3BzLmNhdGVnb3JpZXNbMF07XG5cdCAgICBpZiAoZGVmYXVsdENhdGVnb3J5LmFuY2hvcikge1xuXHQgICAgICBkZWZhdWx0Q2F0ZWdvcnkgPSBkZWZhdWx0Q2F0ZWdvcnkuYW5jaG9yO1xuXHQgICAgfVxuXG5cdCAgICBfdGhpcy5zdGF0ZSA9IHtcblx0ICAgICAgc2VsZWN0ZWQ6IGRlZmF1bHRDYXRlZ29yeS5uYW1lXG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIF90aGlzO1xuXHQgIH1cblxuXHQgIF9jcmVhdGVDbGFzcyhBbmNob3JzLCBbe1xuXHQgICAga2V5OiAncmVuZGVyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdCAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzO1xuXHQgICAgICB2YXIgY2F0ZWdvcmllcyA9IF9wcm9wcy5jYXRlZ29yaWVzO1xuXHQgICAgICB2YXIgb25BbmNob3JDbGljayA9IF9wcm9wcy5vbkFuY2hvckNsaWNrO1xuXHQgICAgICB2YXIgY29sb3IgPSBfcHJvcHMuY29sb3I7XG5cdCAgICAgIHZhciBpMThuID0gX3Byb3BzLmkxOG47XG5cdCAgICAgIHZhciBzZWxlY3RlZCA9IHRoaXMuc3RhdGUuc2VsZWN0ZWQ7XG5cblxuXHQgICAgICByZXR1cm4gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXG5cdCAgICAgICAgJ2RpdicsXG5cdCAgICAgICAgeyBjbGFzc05hbWU6ICdlbW9qaS1tYXJ0LWFuY2hvcnMnIH0sXG5cdCAgICAgICAgY2F0ZWdvcmllcy5tYXAoZnVuY3Rpb24gKGNhdGVnb3J5LCBpKSB7XG5cdCAgICAgICAgICB2YXIgbmFtZSA9IGNhdGVnb3J5Lm5hbWU7XG5cdCAgICAgICAgICB2YXIgYW5jaG9yID0gY2F0ZWdvcnkuYW5jaG9yO1xuXHQgICAgICAgICAgdmFyIGlzU2VsZWN0ZWQgPSBuYW1lID09IHNlbGVjdGVkO1xuXG5cdCAgICAgICAgICBpZiAoYW5jaG9yKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBudWxsO1xuXHQgICAgICAgICAgfVxuXG5cdCAgICAgICAgICByZXR1cm4gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXG5cdCAgICAgICAgICAgICdzcGFuJyxcblx0ICAgICAgICAgICAge1xuXHQgICAgICAgICAgICAgIGtleTogbmFtZSxcblx0ICAgICAgICAgICAgICB0aXRsZTogaTE4bi5jYXRlZ29yaWVzW25hbWUudG9Mb3dlckNhc2UoKV0sXG5cdCAgICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBvbkFuY2hvckNsaWNrKGNhdGVnb3J5LCBpKTtcblx0ICAgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ2Vtb2ppLW1hcnQtYW5jaG9yICcgKyAoaXNTZWxlY3RlZCA/ICdlbW9qaS1tYXJ0LWFuY2hvci1zZWxlY3RlZCcgOiAnJyksXG5cdCAgICAgICAgICAgICAgc3R5bGU6IHsgY29sb3I6IGlzU2VsZWN0ZWQgPyBjb2xvciA6IG51bGwgfVxuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChfc3ZnSW5saW5lUmVhY3QyLmRlZmF1bHQsIHsgc3JjOiBTVkdzW25hbWVdIH0pLFxuXHQgICAgICAgICAgICBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgnc3BhbicsIHsgY2xhc3NOYW1lOiAnZW1vamktbWFydC1hbmNob3ItYmFyJywgc3R5bGU6IHsgYmFja2dyb3VuZENvbG9yOiBjb2xvciB9IH0pXG5cdCAgICAgICAgICApO1xuXHQgICAgICAgIH0pXG5cdCAgICAgICk7XG5cdCAgICB9XG5cdCAgfV0pO1xuXG5cdCAgcmV0dXJuIEFuY2hvcnM7XG5cdH0oX3JlYWN0Mi5kZWZhdWx0LkNvbXBvbmVudCk7XG5cblx0ZXhwb3J0cy5kZWZhdWx0ID0gQW5jaG9ycztcblxuXG5cdEFuY2hvcnMucHJvcFR5cGVzID0ge1xuXHQgIGNhdGVnb3JpZXM6IF9yZWFjdDIuZGVmYXVsdC5Qcm9wVHlwZXMuYXJyYXksXG5cdCAgb25BbmNob3JDbGljazogX3JlYWN0Mi5kZWZhdWx0LlByb3BUeXBlcy5mdW5jXG5cdH07XG5cblx0QW5jaG9ycy5kZWZhdWx0UHJvcHMgPSB7XG5cdCAgY2F0ZWdvcmllczogW10sXG5cdCAgb25BbmNob3JDbGljazogZnVuY3Rpb24gb25BbmNob3JDbGljaygpIHt9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfM19fO1xuXG4vKioqLyB9LFxuLyogNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcblx0ICAgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXG5cdHZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cblx0dmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuXHR2YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeCwgX3gyLCBfeDMpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gsIHByb3BlcnR5ID0gX3gyLCByZWNlaXZlciA9IF94MzsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeCA9IHBhcmVudDsgX3gyID0gcHJvcGVydHk7IF94MyA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBkZXNjID0gcGFyZW50ID0gdW5kZWZpbmVkOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmICgndmFsdWUnIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5cdGZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhvYmosIGtleXMpIHsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBpIGluIG9iaikgeyBpZiAoa2V5cy5pbmRleE9mKGkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGkpKSBjb250aW51ZTsgdGFyZ2V0W2ldID0gb2JqW2ldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuXHRmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOyB9IH1cblxuXHRmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAnZnVuY3Rpb24nICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAnICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5cdHZhciBfcmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG5cdHZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG5cdHZhciBET01QYXJzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuRE9NUGFyc2VyO1xuXHR2YXIgcHJvY2VzcyA9IHByb2Nlc3MgfHwge307XG5cdHByb2Nlc3MuZW52ID0gcHJvY2Vzcy5lbnYgfHwge307XG5cdHZhciBwYXJzZXJBdmFpbGFibGUgPSB0eXBlb2YgRE9NUGFyc2VyICE9PSAndW5kZWZpbmVkJyAmJiBET01QYXJzZXIucHJvdG90eXBlICE9IG51bGwgJiYgRE9NUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZyb21TdHJpbmcgIT0gbnVsbDtcblxuXHRpZiAoXCJwcm9kdWN0aW9uXCIgIT09IHByb2Nlc3MuZW52Lk5PREVfRU5WICYmICFwYXJzZXJBdmFpbGFibGUpIHtcblx0ICAgIGNvbnNvbGUuaW5mbygnPElubGluZVNWRyAvPjogYHJhd2AgcHJvcCB3b3JrcyBvbmx5IHdoZW4gYHdpbmRvdy5ET01QYXJzZXJgIGV4aXN0cy4nKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGlzUGFyc2FibGUoc3JjKSB7XG5cdCAgICAvLyBraW5kYSBuYWl2ZSBidXQgbWVoLCBhaW4ndCBnb25uYSB1c2UgZnVsbC1ibG93biBwYXJzZXIgZm9yIHRoaXNcblx0ICAgIHJldHVybiBwYXJzZXJBdmFpbGFibGUgJiYgdHlwZW9mIHNyYyA9PT0gJ3N0cmluZycgJiYgc3JjLnRyaW0oKS5zdWJzdHIoMCwgNCkgPT09ICc8c3ZnJztcblx0fVxuXG5cdC8vIHBhcnNlIFNWRyBzdHJpbmcgdXNpbmcgYERPTVBhcnNlcmBcblx0ZnVuY3Rpb24gcGFyc2VGcm9tU1ZHU3RyaW5nKHNyYykge1xuXHQgICAgdmFyIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcblx0ICAgIHJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHNyYywgXCJpbWFnZS9zdmcreG1sXCIpO1xuXHR9XG5cblx0Ly8gVHJhbnNmb3JtIERPTSBwcm9wL2F0dHIgbmFtZXMgYXBwbGljYWJsZSB0byBgPHN2Zz5gIGVsZW1lbnQgYnV0IHJlYWN0LWxpbWl0ZWRcblx0ZnVuY3Rpb24gc3dpdGNoU1ZHQXR0clRvUmVhY3RQcm9wKHByb3BOYW1lKSB7XG5cdCAgICBzd2l0Y2ggKHByb3BOYW1lKSB7XG5cdCAgICAgICAgY2FzZSAnY2xhc3MnOlxuXHQgICAgICAgICAgICByZXR1cm4gJ2NsYXNzTmFtZSc7XG5cdCAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgcmV0dXJuIHByb3BOYW1lO1xuXHQgICAgfVxuXHR9XG5cblx0dmFyIElubGluZVNWRyA9IChmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuXHQgICAgX2luaGVyaXRzKElubGluZVNWRywgX1JlYWN0JENvbXBvbmVudCk7XG5cblx0ICAgIF9jcmVhdGVDbGFzcyhJbmxpbmVTVkcsIG51bGwsIFt7XG5cdCAgICAgICAga2V5OiAnZGVmYXVsdFByb3BzJyxcblx0ICAgICAgICB2YWx1ZToge1xuXHQgICAgICAgICAgICBlbGVtZW50OiAnaScsXG5cdCAgICAgICAgICAgIHJhdzogZmFsc2UsXG5cdCAgICAgICAgICAgIHNyYzogJydcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGVudW1lcmFibGU6IHRydWVcblx0ICAgIH0sIHtcblx0ICAgICAgICBrZXk6ICdwcm9wVHlwZXMnLFxuXHQgICAgICAgIHZhbHVlOiB7XG5cdCAgICAgICAgICAgIHNyYzogX3JlYWN0MlsnZGVmYXVsdCddLlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcblx0ICAgICAgICAgICAgZWxlbWVudDogX3JlYWN0MlsnZGVmYXVsdCddLlByb3BUeXBlcy5zdHJpbmcsXG5cdCAgICAgICAgICAgIHJhdzogX3JlYWN0MlsnZGVmYXVsdCddLlByb3BUeXBlcy5ib29sXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG5cdCAgICB9XSk7XG5cblx0ICAgIGZ1bmN0aW9uIElubGluZVNWRyhwcm9wcykge1xuXHQgICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBJbmxpbmVTVkcpO1xuXG5cdCAgICAgICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoSW5saW5lU1ZHLnByb3RvdHlwZSksICdjb25zdHJ1Y3RvcicsIHRoaXMpLmNhbGwodGhpcywgcHJvcHMpO1xuXHQgICAgICAgIHRoaXMuX2V4dHJhY3RTVkdQcm9wcyA9IHRoaXMuX2V4dHJhY3RTVkdQcm9wcy5iaW5kKHRoaXMpO1xuXHQgICAgfVxuXG5cdCAgICAvLyBTZXJpYWxpemUgYEF0dHJgIG9iamVjdHMgaW4gYE5hbWVkTm9kZU1hcGBcblxuXHQgICAgX2NyZWF0ZUNsYXNzKElubGluZVNWRywgW3tcblx0ICAgICAgICBrZXk6ICdfc2VyaWFsaXplQXR0cnMnLFxuXHQgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfc2VyaWFsaXplQXR0cnMobWFwKSB7XG5cdCAgICAgICAgICAgIHZhciByZXQgPSB7fTtcblx0ICAgICAgICAgICAgdmFyIHByb3AgPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBwcm9wID0gc3dpdGNoU1ZHQXR0clRvUmVhY3RQcm9wKG1hcFtpXS5uYW1lKTtcblx0ICAgICAgICAgICAgICAgIHJldFtwcm9wXSA9IG1hcFtpXS52YWx1ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4gcmV0O1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIC8vIGdldCA8c3ZnIC8+IGVsZW1lbnQgcHJvcHNcblx0ICAgIH0sIHtcblx0ICAgICAgICBrZXk6ICdfZXh0cmFjdFNWR1Byb3BzJyxcblx0ICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX2V4dHJhY3RTVkdQcm9wcyhzcmMpIHtcblx0ICAgICAgICAgICAgdmFyIG1hcCA9IHBhcnNlRnJvbVNWR1N0cmluZyhzcmMpLmRvY3VtZW50RWxlbWVudC5hdHRyaWJ1dGVzO1xuXHQgICAgICAgICAgICByZXR1cm4gbWFwLmxlbmd0aCA+IDAgPyB0aGlzLl9zZXJpYWxpemVBdHRycyhtYXApIDogbnVsbDtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyBnZXQgY29udGVudCBpbnNpZGUgPHN2Zz4gZWxlbWVudC5cblx0ICAgIH0sIHtcblx0ICAgICAgICBrZXk6ICdfc3RyaXBTVkcnLFxuXHQgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfc3RyaXBTVkcoc3JjKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBwYXJzZUZyb21TVkdTdHJpbmcoc3JjKS5kb2N1bWVudEVsZW1lbnQuaW5uZXJIVE1MO1xuXHQgICAgICAgIH1cblx0ICAgIH0sIHtcblx0ICAgICAgICBrZXk6ICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJyxcblx0ICAgICAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhfcmVmKSB7XG5cdCAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG5cblx0ICAgICAgICAgICAgaWYgKFwicHJvZHVjdGlvblwiICE9PSBwcm9jZXNzLmVudi5OT0RFX0VOViAmJiBjaGlsZHJlbiAhPSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJzxJbmxpbmVTVkcgLz46IGBjaGlsZHJlbmAgcHJvcCB3aWxsIGJlIGlnbm9yZWQuJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9LCB7XG5cdCAgICAgICAga2V5OiAncmVuZGVyJyxcblx0ICAgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuXHQgICAgICAgICAgICB2YXIgRWxlbWVudCA9IHVuZGVmaW5lZCxcblx0ICAgICAgICAgICAgICAgIF9faHRtbCA9IHVuZGVmaW5lZCxcblx0ICAgICAgICAgICAgICAgIHN2Z1Byb3BzID0gdW5kZWZpbmVkO1xuXHQgICAgICAgICAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcztcblx0ICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBfcHJvcHMuZWxlbWVudDtcblx0ICAgICAgICAgICAgdmFyIHJhdyA9IF9wcm9wcy5yYXc7XG5cdCAgICAgICAgICAgIHZhciBzcmMgPSBfcHJvcHMuc3JjO1xuXG5cdCAgICAgICAgICAgIHZhciBvdGhlclByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9wcm9wcywgWydlbGVtZW50JywgJ3JhdycsICdzcmMnXSk7XG5cblx0ICAgICAgICAgICAgaWYgKHJhdyA9PT0gdHJ1ZSAmJiBpc1BhcnNhYmxlKHNyYykpIHtcblx0ICAgICAgICAgICAgICAgIEVsZW1lbnQgPSAnc3ZnJztcblx0ICAgICAgICAgICAgICAgIHN2Z1Byb3BzID0gdGhpcy5fZXh0cmFjdFNWR1Byb3BzKHNyYyk7XG5cdCAgICAgICAgICAgICAgICBfX2h0bWwgPSB0aGlzLl9zdHJpcFNWRyhzcmMpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIF9faHRtbCA9IF9faHRtbCB8fCBzcmM7XG5cdCAgICAgICAgICAgIEVsZW1lbnQgPSBFbGVtZW50IHx8IGVsZW1lbnQ7XG5cdCAgICAgICAgICAgIHN2Z1Byb3BzID0gc3ZnUHJvcHMgfHwge307XG5cblx0ICAgICAgICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KEVsZW1lbnQsIF9leHRlbmRzKHt9LCBzdmdQcm9wcywgb3RoZXJQcm9wcywgeyBzcmM6IG51bGwsIGNoaWxkcmVuOiBudWxsLFxuXHQgICAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHsgX19odG1sOiBfX2h0bWwgfSB9KSk7XG5cdCAgICAgICAgfVxuXHQgICAgfV0pO1xuXG5cdCAgICByZXR1cm4gSW5saW5lU1ZHO1xuXHR9KShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuXHRleHBvcnRzWydkZWZhdWx0J10gPSBJbmxpbmVTVkc7XG5cdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9LFxuLyogNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXG5cdHZhciBfYWN0aXZpdHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnQWN0aXZpdHknLCB7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcblx0ICAgIHJldHVybiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hY3Rpdml0eSkuZGVmYXVsdDtcblx0ICB9XG5cdH0pO1xuXG5cdHZhciBfZmxhZ3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnRmxhZ3MnLCB7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcblx0ICAgIHJldHVybiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9mbGFncykuZGVmYXVsdDtcblx0ICB9XG5cdH0pO1xuXG5cdHZhciBfZm9vZHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnRm9vZHMnLCB7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcblx0ICAgIHJldHVybiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9mb29kcykuZGVmYXVsdDtcblx0ICB9XG5cdH0pO1xuXG5cdHZhciBfbmF0dXJlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ05hdHVyZScsIHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuXHQgICAgcmV0dXJuIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX25hdHVyZSkuZGVmYXVsdDtcblx0ICB9XG5cdH0pO1xuXG5cdHZhciBfb2JqZWN0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnT2JqZWN0cycsIHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuXHQgICAgcmV0dXJuIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdHMpLmRlZmF1bHQ7XG5cdCAgfVxuXHR9KTtcblxuXHR2YXIgX3Blb3BsZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnUGVvcGxlJywge1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG5cdCAgICByZXR1cm4gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcGVvcGxlKS5kZWZhdWx0O1xuXHQgIH1cblx0fSk7XG5cblx0dmFyIF9wbGFjZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ1BsYWNlcycsIHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuXHQgICAgcmV0dXJuIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3BsYWNlcykuZGVmYXVsdDtcblx0ICB9XG5cdH0pO1xuXG5cdHZhciBfcmVjZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdSZWNlbnQnLCB7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcblx0ICAgIHJldHVybiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWNlbnQpLmRlZmF1bHQ7XG5cdCAgfVxuXHR9KTtcblxuXHR2YXIgX3N5bWJvbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ1N5bWJvbHMnLCB7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcblx0ICAgIHJldHVybiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zeW1ib2xzKS5kZWZhdWx0O1xuXHQgIH1cblx0fSk7XG5cblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqKi8gfSxcbi8qIDYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gXCI8c3ZnIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgdmlld0JveD1cXFwiMCAwIDI0IDI0XFxcIj48cGF0aCBkPVxcXCJNMTIgMEM1LjM3MyAwIDAgNS4zNzIgMCAxMmMwIDYuNjI3IDUuMzczIDEyIDEyIDEyIDYuNjI4IDAgMTItNS4zNzMgMTItMTIgMC02LjYyOC01LjM3Mi0xMi0xMi0xMm05Ljk0OSAxMUgxNy4wNWMuMjI0LTIuNTI3IDEuMjMyLTQuNzczIDEuOTY4LTYuMTEzQTkuOTY2IDkuOTY2IDAgMCAxIDIxLjk0OSAxMU0xMyAxMVYyLjA1MWE5Ljk0NSA5Ljk0NSAwIDAgMSA0LjQzMiAxLjU2NGMtLjg1OCAxLjQ5MS0yLjE1NiA0LjIyLTIuMzkyIDcuMzg1SDEzem0tMiAwSDguOTYxYy0uMjM4LTMuMTY1LTEuNTM2LTUuODk0LTIuMzkzLTcuMzg1QTkuOTUgOS45NSAwIDAgMSAxMSAyLjA1MVYxMXptMCAydjguOTQ5YTkuOTM3IDkuOTM3IDAgMCAxLTQuNDMyLTEuNTY0Yy44NTctMS40OTIgMi4xNTUtNC4yMjEgMi4zOTMtNy4zODVIMTF6bTQuMDQgMGMuMjM2IDMuMTY0IDEuNTM0IDUuODkzIDIuMzkyIDcuMzg1QTkuOTIgOS45MiAwIDAgMSAxMyAyMS45NDlWMTNoMi4wNHpNNC45ODIgNC44ODdDNS43MTggNi4yMjcgNi43MjYgOC40NzMgNi45NTEgMTFoLTQuOWE5Ljk3NyA5Ljk3NyAwIDAgMSAyLjkzMS02LjExM00yLjA1MSAxM2g0LjljLS4yMjYgMi41MjctMS4yMzMgNC43NzEtMS45NjkgNi4xMTNBOS45NzIgOS45NzIgMCAwIDEgMi4wNTEgMTNtMTYuOTY3IDYuMTEzYy0uNzM1LTEuMzQyLTEuNzQ0LTMuNTg2LTEuOTY4LTYuMTEzaDQuODk5YTkuOTYxIDkuOTYxIDAgMCAxLTIuOTMxIDYuMTEzXFxcIj48L3BhdGg+PC9zdmc+XCJcblxuLyoqKi8gfSxcbi8qIDcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gXCI8c3ZnIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgdmlld0JveD1cXFwiMCAwIDI0IDI0XFxcIj48cGF0aCBkPVxcXCJNMCAwbDYuMDg0IDI0SDhMMS45MTYgMHpNMjEgNWgtNGwtMS00SDRsMyAxMmgzbDEgNGgxM0wyMSA1ek02LjU2MyAzaDcuODc1bDIgOEg4LjU2M2wtMi04em04LjgzMiAxMGwtMi44NTYgMS45MDRMMTIuMDYzIDEzaDMuMzMyek0xOSAxM2wtMS41LTZoMS45MzhsMiA4SDE2bDMtMnpcXFwiPjwvcGF0aD48L3N2Zz5cIlxuXG4vKioqLyB9LFxuLyogOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBcIjxzdmcgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiB2aWV3Qm94PVxcXCIwIDAgMjQgMjRcXFwiPjxwYXRoIGQ9XFxcIk0xNyA0Ljk3OGMtMS44MzggMC0yLjg3Ni4zOTYtMy42OC45MzQuNTEzLTEuMTcyIDEuNzY4LTIuOTM0IDQuNjgtMi45MzRhMSAxIDAgMCAwIDAtMmMtMi45MjEgMC00LjYyOSAxLjM2NS01LjU0NyAyLjUxMi0uMDY0LjA3OC0uMTE5LjE2Mi0uMTguMjQ0QzExLjczIDEuODM4IDEwLjc5OC4wMjMgOS4yMDcuMDIzIDguNTc5LjAyMiA3Ljg1LjMwNiA3IC45NzggNS4wMjcgMi41NCA1LjMyOSAzLjkwMiA2LjQ5MiA0Ljk5OSAzLjYwOSA1LjIyMiAwIDcuMzUyIDAgMTIuOTY5YzAgNC41ODIgNC45NjEgMTEuMDA5IDkgMTEuMDA5IDEuOTc1IDAgMi4zNzEtLjQ4NiAzLTEgLjYyOS41MTQgMS4wMjUgMSAzIDEgNC4wMzkgMCA5LTYuNDE4IDktMTEgMC01Ljk1My00LjA1NS04LTctOE04LjI0MiAyLjU0NmMuNjQxLS41MDguOTQzLS41MjMuOTY1LS41MjMuNDI2LjE2OS45NzUgMS40MDUgMS4zNTcgMy4wNTUtMS41MjctLjYyOS0yLjc0MS0xLjM1Mi0yLjk4LTEuODQ2LjA1OS0uMTEyLjI0MS0uMzU2LjY1OC0uNjg2TTE1IDIxLjk3OGMtMS4wOCAwLTEuMjEtLjEwOS0xLjU1OS0uNDAybC0uMTc2LS4xNDZjLS4zNjctLjMwMi0uODE2LS40NTItMS4yNjYtLjQ1MnMtLjg5OC4xNS0xLjI2Ni40NTJsLS4xNzYuMTQ2Yy0uMzQ3LjI5Mi0uNDc3LjQwMi0xLjU1Ny40MDItMi44MTMgMC03LTUuMzg5LTctOS4wMDkgMC01LjgyMyA0LjQ4OC01Ljk5MSA1LTUuOTkxIDEuOTM5IDAgMi40ODQuNDcxIDMuMzg3IDEuMjUxbC4zMjMuMjc2YTEuOTk1IDEuOTk1IDAgMCAwIDIuNTggMGwuMzIzLS4yNzZjLjkwMi0uNzggMS40NDctMS4yNTEgMy4zODctMS4yNTEuNTEyIDAgNSAuMTY4IDUgNiAwIDMuNjE3LTQuMTg3IDktNyA5XFxcIj48L3BhdGg+PC9zdmc+XCJcblxuLyoqKi8gfSxcbi8qIDkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gXCI8c3ZnIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgdmlld0JveD1cXFwiMCAwIDI0IDI0XFxcIj48cGF0aCBkPVxcXCJNMTUuNSA4YTEuNSAxLjUgMCAxIDAgLjAwMSAzLjAwMUExLjUgMS41IDAgMCAwIDE1LjUgOE04LjUgOGExLjUgMS41IDAgMSAwIC4wMDEgMy4wMDFBMS41IDEuNSAwIDAgMCA4LjUgOFxcXCI+PC9wYXRoPjxwYXRoIGQ9XFxcIk0xOC45MzMgMGgtLjAyN2MtLjk3IDAtMi4xMzguNzg3LTMuMDE4IDEuNDk3LTEuMjc0LS4zNzQtMi42MTItLjUxLTMuODg3LS41MS0xLjI4NSAwLTIuNjE2LjEzMy0zLjg3NC41MTdDNy4yNDUuNzkgNi4wNjkgMCA1LjA5MyAwaC0uMDI3QzMuMzUyIDAgLjA3IDIuNjcuMDAyIDcuMDI2Yy0uMDM5IDIuNDc5LjI3NiA0LjIzOCAxLjA0IDUuMDEzLjI1NC4yNTguODgyLjY3NyAxLjI5NS44ODIuMTkxIDMuMTc3LjkyMiA1LjIzOCAyLjUzNiA2LjM4Ljg5Ny42MzcgMi4xODcuOTQ5IDMuMiAxLjEwMkM4LjA0IDIwLjYgOCAyMC43OTUgOCAyMWMwIDEuNzczIDIuMzUgMyA0IDMgMS42NDggMCA0LTEuMjI3IDQtMyAwLS4yMDEtLjAzOC0uMzkzLS4wNzItLjU4NiAyLjU3My0uMzg1IDUuNDM1LTEuODc3IDUuOTI1LTcuNTg3LjM5Ni0uMjIuODg3LS41NjggMS4xMDQtLjc4OC43NjMtLjc3NCAxLjA3OS0yLjUzNCAxLjA0LTUuMDEzQzIzLjkyOSAyLjY3IDIwLjY0NiAwIDE4LjkzMyAwTTMuMjIzIDkuMTM1Yy0uMjM3LjI4MS0uODM3IDEuMTU1LS44ODQgMS4yMzgtLjE1LS40MS0uMzY4LTEuMzQ5LS4zMzctMy4yOTEuMDUxLTMuMjgxIDIuNDc4LTQuOTcyIDMuMDkxLTUuMDMxLjI1Ni4wMTUuNzMxLjI3IDEuMjY1LjY0Ni0xLjExIDEuMTcxLTIuMjc1IDIuOTE1LTIuMzUyIDUuMTI1LS4xMzMuNTQ2LS4zOTguODU4LS43ODMgMS4zMTNNMTIgMjJjLS45MDEgMC0xLjk1NC0uNjkzLTItMSAwLS42NTQuNDc1LTEuMjM2IDEtMS42MDJWMjBhMSAxIDAgMSAwIDIgMHYtLjYwMmMuNTI0LjM2NSAxIC45NDcgMSAxLjYwMi0uMDQ2LjMwNy0xLjA5OSAxLTIgMW0zLTMuNDh2LjAyYTQuNzUyIDQuNzUyIDAgMCAwLTEuMjYyLTEuMDJjMS4wOTItLjUxNiAyLjIzOS0xLjMzNCAyLjIzOS0yLjIxNyAwLTEuODQyLTEuNzgxLTIuMTk1LTMuOTc3LTIuMTk1LTIuMTk2IDAtMy45NzguMzU0LTMuOTc4IDIuMTk1IDAgLjg4MyAxLjE0OCAxLjcwMSAyLjIzOCAyLjIxN0E0LjggNC44IDAgMCAwIDkgMTguNTM5di0uMDI1Yy0xLS4wNzYtMi4xODItLjI4MS0yLjk3My0uODQyLTEuMzAxLS45Mi0xLjgzOC0zLjA0NS0xLjg1My02LjQ3OGwuMDIzLS4wNDFjLjQ5Ni0uODI2IDEuNDktMS40NSAxLjgwNC0zLjEwMiAwLTIuMDQ3IDEuMzU3LTMuNjMxIDIuMzYyLTQuNTIyQzkuMzcgMy4xNzggMTAuNTU1IDMgMTEuOTQ4IDNjMS40NDcgMCAyLjY4NS4xOTIgMy43MzMuNTcgMSAuOSAyLjMxNiAyLjQ2NSAyLjMxNiA0LjQ4LjMxMyAxLjY1MSAxLjMwNyAyLjI3NSAxLjgwMyAzLjEwMi4wMzUuMDU4LjA2OC4xMTcuMTAyLjE3OC0uMDU5IDUuOTY3LTEuOTQ5IDcuMDEtNC45MDIgNy4xOW02LjYyOC04LjIwMmMtLjAzNy0uMDY1LS4wNzQtLjEzLS4xMTMtLjE5NWE3LjU4NyA3LjU4NyAwIDAgMC0uNzM5LS45ODdjLS4zODUtLjQ1NS0uNjQ4LS43NjgtLjc4Mi0xLjMxMy0uMDc2LTIuMjA5LTEuMjQxLTMuOTU0LTIuMzUzLTUuMTI0LjUzMS0uMzc2IDEuMDA0LS42MyAxLjI2MS0uNjQ3LjYzNi4wNzEgMy4wNDQgMS43NjQgMy4wOTYgNS4wMzEuMDI3IDEuODEtLjM0NyAzLjIxOC0uMzcgMy4yMzVcXFwiPjwvcGF0aD48L3N2Zz5cIlxuXG4vKioqLyB9LFxuLyogMTAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gXCI8c3ZnIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgdmlld0JveD1cXFwiMCAwIDI0IDI0XFxcIj48cGF0aCBkPVxcXCJNMTIgMGE5IDkgMCAwIDAtNSAxNi40ODJWMjFzMi4wMzUgMyA1IDMgNS0zIDUtM3YtNC41MThBOSA5IDAgMCAwIDEyIDB6bTAgMmMzLjg2IDAgNyAzLjE0MSA3IDdzLTMuMTQgNy03IDctNy0zLjE0MS03LTcgMy4xNC03IDctN3pNOSAxNy40NzdjLjk0LjMzMiAxLjk0Ni41MjMgMyAuNTIzczIuMDYtLjE5IDMtLjUyM3YuODM0Yy0uOTEuNDM2LTEuOTI1LjY4OS0zIC42ODlhNi45MjQgNi45MjQgMCAwIDEtMy0uNjl2LS44MzN6bS4yMzYgMy4wN0E4Ljg1NCA4Ljg1NCAwIDAgMCAxMiAyMWMuOTY1IDAgMS44ODgtLjE2NyAyLjc1OC0uNDUxQzE0LjE1NSAyMS4xNzMgMTMuMTUzIDIyIDEyIDIyYy0xLjEwMiAwLTIuMTE3LS43ODktMi43NjQtMS40NTN6XFxcIj48L3BhdGg+PHBhdGggZD1cXFwiTTE0Ljc0NSAxMi40NDloLS4wMDRjLS44NTItLjAyNC0xLjE4OC0uODU4LTEuNTc3LTEuODI0LS40MjEtMS4wNjEtLjcwMy0xLjU2MS0xLjE4Mi0xLjU2NmgtLjAwOWMtLjQ4MSAwLS43ODMuNDk3LTEuMjM1IDEuNTM3LS40MzYuOTgyLS44MDEgMS44MTEtMS42MzYgMS43OTFsLS4yNzYtLjA0M2MtLjU2NS0uMTcxLS44NTMtLjY5MS0xLjI4NC0xLjc5NC0uMTI1LS4zMTMtLjIwMi0uNjMyLS4yNy0uOTEzLS4wNTEtLjIxMy0uMTI3LS41My0uMTk1LS42MzRDNy4wNjcgOS4wMDQgNy4wMzkgOSA2Ljk5IDlBMSAxIDAgMCAxIDcgN2guMDFjMS42NjIuMDE3IDIuMDE1IDEuMzczIDIuMTk4IDIuMTM0LjQ4Ni0uOTgxIDEuMzA0LTIuMDU4IDIuNzk3LTIuMDc1IDEuNTMxLjAxOCAyLjI4IDEuMTUzIDIuNzMxIDIuMTQxbC4wMDItLjAwOEMxNC45NDQgOC40MjQgMTUuMzI3IDcgMTYuOTc5IDdoLjAzMkExIDEgMCAxIDEgMTcgOWgtLjAxMWMtLjE0OS4wNzYtLjI1Ni40NzQtLjMxOS43MDlhNi40ODQgNi40ODQgMCAwIDEtLjMxMS45NTFjLS40MjkuOTczLS43OSAxLjc4OS0xLjYxNCAxLjc4OVxcXCI+PC9wYXRoPjwvc3ZnPlwiXG5cbi8qKiovIH0sXG4vKiAxMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBcIjxzdmcgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiB2aWV3Qm94PVxcXCIwIDAgMjQgMjRcXFwiPjxwYXRoIGQ9XFxcIk0xMiAwQzUuMzczIDAgMCA1LjM3MyAwIDEyczUuMzczIDEyIDEyIDEyIDEyLTUuMzczIDEyLTEyUzE4LjYyNyAwIDEyIDBtMCAyMkM2LjQ4NiAyMiAyIDE3LjUxNCAyIDEyUzYuNDg2IDIgMTIgMnMxMCA0LjQ4NiAxMCAxMC00LjQ4NiAxMC0xMCAxMFxcXCI+PC9wYXRoPjxwYXRoIGQ9XFxcIk04IDdhMiAyIDAgMSAwLS4wMDEgMy45OTlBMiAyIDAgMCAwIDggN00xNiA3YTIgMiAwIDEgMC0uMDAxIDMuOTk5QTIgMiAwIDAgMCAxNiA3TTE1LjIzMiAxNWMtLjY5MyAxLjE5NS0xLjg3IDItMy4zNDkgMi0xLjQ3NyAwLTIuNjU1LS44MDUtMy4zNDctMkgxNW0zLTJINmE2IDYgMCAxIDAgMTIgMFxcXCI+PC9wYXRoPjwvc3ZnPlwiXG5cbi8qKiovIH0sXG4vKiAxMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBcIjxzdmcgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiB2aWV3Qm94PVxcXCIwIDAgMjQgMjRcXFwiPjxwYXRoIGQ9XFxcIk02LjUgMTJDNS4xMjIgMTIgNCAxMy4xMjEgNCAxNC41UzUuMTIyIDE3IDYuNSAxNyA5IDE1Ljg3OSA5IDE0LjUgNy44NzggMTIgNi41IDEybTAgM2MtLjI3NSAwLS41LS4yMjUtLjUtLjVzLjIyNS0uNS41LS41LjUuMjI1LjUuNS0uMjI1LjUtLjUuNU0xNy41IDEyYy0xLjM3OCAwLTIuNSAxLjEyMS0yLjUgMi41czEuMTIyIDIuNSAyLjUgMi41IDIuNS0xLjEyMSAyLjUtMi41LTEuMTIyLTIuNS0yLjUtMi41bTAgM2MtLjI3NSAwLS41LS4yMjUtLjUtLjVzLjIyNS0uNS41LS41LjUuMjI1LjUuNS0uMjI1LjUtLjUuNVxcXCI+PC9wYXRoPjxwYXRoIGQ9XFxcIk0yMi40ODIgOS40OTRsLTEuMDM5LS4zNDZMMjEuNCA5aC42Yy41NTIgMCAxLS40MzkgMS0uOTkyIDAtLjAwNi0uMDAzLS4wMDgtLjAwMy0uMDA4SDIzYzAtMS0uODg5LTItMS45ODQtMmgtLjY0MmwtLjczMS0xLjcxN0MxOS4yNjIgMy4wMTIgMTguMDkxIDIgMTYuNzY0IDJINy4yMzZDNS45MDkgMiA0LjczOCAzLjAxMiA0LjM1NyA0LjI4M0wzLjYyNiA2aC0uNjQyQzEuODg5IDYgMSA3IDEgOGguMDAzUzEgOC4wMDIgMSA4LjAwOEMxIDguNTYxIDEuNDQ4IDkgMiA5aC42bC0uMDQzLjE0OC0xLjAzOS4zNDZhMi4wMDEgMi4wMDEgMCAwIDAtMS4zNTkgMi4wOTdsLjc1MSA3LjUwOGExIDEgMCAwIDAgLjk5NC45MDFIM3YxYzAgMS4xMDMuODk2IDIgMiAyaDJjMS4xMDQgMCAyLS44OTcgMi0ydi0xaDZ2MWMwIDEuMTAzLjg5NiAyIDIgMmgyYzEuMTA0IDAgMi0uODk3IDItMnYtMWgxLjA5NmEuOTk5Ljk5OSAwIDAgMCAuOTk0LS45MDFsLjc1MS03LjUwOGEyLjAwMSAyLjAwMSAwIDAgMC0xLjM1OS0yLjA5N002LjI3MyA0Ljg1N0M2LjQwMiA0LjQzIDYuNzg4IDQgNy4yMzYgNGg5LjUyN2MuNDQ4IDAgLjgzNC40My45NjMuODU3TDE5LjMxMyA5SDQuNjg4bDEuNTg1LTQuMTQzek03IDIxSDV2LTFoMnYxem0xMiAwaC0ydi0xaDJ2MXptMi4xODktM0gyLjgxMWwtLjY2Mi02LjYwN0wzIDExaDE4bC44NTIuMzkzTDIxLjE4OSAxOHpcXFwiPjwvcGF0aD48L3N2Zz5cIlxuXG4vKioqLyB9LFxuLyogMTMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gXCI8c3ZnIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgdmlld0JveD1cXFwiMCAwIDI0IDI0XFxcIj48cGF0aCBkPVxcXCJNMTMgNGgtMmwtLjAwMSA3SDl2MmgydjJoMnYtMmg0di0yaC00elxcXCI+PC9wYXRoPjxwYXRoIGQ9XFxcIk0xMiAwQzUuMzczIDAgMCA1LjM3MyAwIDEyczUuMzczIDEyIDEyIDEyIDEyLTUuMzczIDEyLTEyUzE4LjYyNyAwIDEyIDBtMCAyMkM2LjQ4NiAyMiAyIDE3LjUxNCAyIDEyUzYuNDg2IDIgMTIgMnMxMCA0LjQ4NiAxMCAxMC00LjQ4NiAxMC0xMCAxMFxcXCI+PC9wYXRoPjwvc3ZnPlwiXG5cbi8qKiovIH0sXG4vKiAxNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBcIjxzdmcgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiB2aWV3Qm94PVxcXCIwIDAgMjQgMjRcXFwiPjxwYXRoIGQ9XFxcIk0wIDBoMTF2Mkgwek00IDExaDNWNmg0VjRIMHYyaDR6TTE1LjUgMTdjMS4zODEgMCAyLjUtMS4xMTYgMi41LTIuNDkzcy0xLjExOS0yLjQ5My0yLjUtMi40OTNTMTMgMTMuMTMgMTMgMTQuNTA3IDE0LjExOSAxNyAxNS41IDE3bTAtMi45ODZjLjI3NiAwIC41LjIyMi41LjQ5MyAwIC4yNzItLjIyNC40OTMtLjUuNDkzcy0uNS0uMjIxLS41LS40OTMuMjI0LS40OTMuNS0uNDkzTTIxLjUgMTkuMDE0Yy0xLjM4MSAwLTIuNSAxLjExNi0yLjUgMi40OTNTMjAuMTE5IDI0IDIxLjUgMjRzMi41LTEuMTE2IDIuNS0yLjQ5My0xLjExOS0yLjQ5My0yLjUtMi40OTNtMCAyLjk4NmEuNDk3LjQ5NyAwIDAgMS0uNS0uNDkzYzAtLjI3MS4yMjQtLjQ5My41LS40OTNzLjUuMjIyLjUuNDkzYS40OTcuNDk3IDAgMCAxLS41LjQ5M00yMiAxM2wtOSA5IDEuNTEzIDEuNSA4Ljk5LTkuMDA5ek0xNyAxMWMyLjIwOSAwIDQtMS4xMTkgNC0yLjVWMnMuOTg1LS4xNjEgMS40OTguOTQ5QzIzLjAxIDQuMDU1IDIzIDYgMjMgNnMxLTEuMTE5IDEtMy4xMzVDMjQtLjAyIDIxIDAgMjEgMGgtMnY2LjM0N0E1Ljg1MyA1Ljg1MyAwIDAgMCAxNyA2Yy0yLjIwOSAwLTQgMS4xMTktNCAyLjVzMS43OTEgMi41IDQgMi41TTEwLjI5NyAyMC40ODJsLTEuNDc1LTEuNTg1YTQ3LjU0IDQ3LjU0IDAgMCAxLTEuNDQyIDEuMTI5Yy0uMzA3LS4yODgtLjk4OS0xLjAxNi0yLjA0NS0yLjE4My45MDItLjgzNiAxLjQ3OS0xLjQ2NiAxLjcyOS0xLjg5MnMuMzc2LS44NzEuMzc2LTEuMzM2YzAtLjU5Mi0uMjczLTEuMTc4LS44MTgtMS43NTktLjU0Ni0uNTgxLTEuMzI5LS44NzEtMi4zNDktLjg3MS0xLjAwOCAwLTEuNzkuMjkzLTIuMzQ0Ljg3OS0uNTU2LjU4Ny0uODMyIDEuMTgxLS44MzIgMS43ODQgMCAuODEzLjQxOSAxLjc0OCAxLjI1NiAyLjgwNS0uODQ3LjYxNC0xLjQ0NCAxLjIwOC0xLjc5NCAxLjc4NGEzLjQ2NSAzLjQ2NSAwIDAgMC0uNTIzIDEuODMzYzAgLjg1Ny4zMDggMS41Ni45MjQgMi4xMDcuNjE2LjU0OSAxLjQyMy44MjMgMi40Mi44MjMgMS4xNzMgMCAyLjQ0NC0uMzc5IDMuODEzLTEuMTM3TDguMjM1IDI0aDIuODE5bC0yLjA5LTIuMzgzIDEuMzMzLTEuMTM1em0tNi43MzYtNi4zODlhMS4wMiAxLjAyIDAgMCAxIC43My0uMjg2Yy4zMSAwIC41NTkuMDg1Ljc0Ny4yNTRhLjg0OS44NDkgMCAwIDEgLjI4My42NTljMCAuNTE4LS40MTkgMS4xMTItMS4yNTcgMS43ODQtLjUzNi0uNjUxLS44MDUtMS4yMzEtLjgwNS0xLjc0MmEuOTAxLjkwMSAwIDAgMSAuMzAyLS42NjlNMy43NCAyMmMtLjQyNyAwLS43NzgtLjExNi0xLjA1Ny0uMzQ5LS4yNzktLjIzMi0uNDE4LS40ODctLjQxOC0uNzY2IDAtLjU5NC41MDktMS4yODggMS41MjctMi4wODMuOTY4IDEuMTM0IDEuNzE3IDEuOTQ2IDIuMjQ4IDIuNDM4LS45MjEuNTA3LTEuNjg2Ljc2LTIuMy43NlxcXCI+PC9wYXRoPjwvc3ZnPlwiXG5cbi8qKiovIH0sXG4vKiAxNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXG5cdHZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cblx0dmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuXHR2YXIgX3JlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblxuXHR2YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxuXHR2YXIgX2ZyZXF1ZW50bHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KTtcblxuXHR2YXIgX2ZyZXF1ZW50bHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZnJlcXVlbnRseSk7XG5cblx0dmFyIF8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cblx0ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuXHRmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuXHRmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuXHR2YXIgQ2F0ZWdvcnkgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuXHQgIF9pbmhlcml0cyhDYXRlZ29yeSwgX1JlYWN0JENvbXBvbmVudCk7XG5cblx0ICBmdW5jdGlvbiBDYXRlZ29yeSgpIHtcblx0ICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDYXRlZ29yeSk7XG5cblx0ICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ2F0ZWdvcnkpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuXHQgIH1cblxuXHQgIF9jcmVhdGVDbGFzcyhDYXRlZ29yeSwgW3tcblx0ICAgIGtleTogJ2NvbXBvbmVudERpZE1vdW50Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcblx0ICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLnJlZnMuY29udGFpbmVyO1xuXHQgICAgICB0aGlzLmxhYmVsID0gdGhpcy5yZWZzLmxhYmVsO1xuXHQgICAgICB0aGlzLnBhcmVudCA9IHRoaXMuY29udGFpbmVyLnBhcmVudE5vZGU7XG5cblx0ICAgICAgdGhpcy5tYXJnaW4gPSAwO1xuXHQgICAgICB0aGlzLm1pbk1hcmdpbiA9IDA7XG5cblx0ICAgICAgdGhpcy5tZW1vaXplU2l6ZSgpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ3Nob3VsZENvbXBvbmVudFVwZGF0ZScsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG5cdCAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzO1xuXHQgICAgICB2YXIgbmFtZSA9IF9wcm9wcy5uYW1lO1xuXHQgICAgICB2YXIgcGVyTGluZSA9IF9wcm9wcy5wZXJMaW5lO1xuXHQgICAgICB2YXIgaGFzU3RpY2t5UG9zaXRpb24gPSBfcHJvcHMuaGFzU3RpY2t5UG9zaXRpb247XG5cdCAgICAgIHZhciBlbW9qaXMgPSBfcHJvcHMuZW1vamlzO1xuXHQgICAgICB2YXIgZW1vamlQcm9wcyA9IF9wcm9wcy5lbW9qaVByb3BzO1xuXHQgICAgICB2YXIgc2tpbiA9IGVtb2ppUHJvcHMuc2tpbjtcblx0ICAgICAgdmFyIHNpemUgPSBlbW9qaVByb3BzLnNpemU7XG5cdCAgICAgIHZhciBzZXQgPSBlbW9qaVByb3BzLnNldDtcblx0ICAgICAgdmFyIG5leHRQZXJMaW5lID0gbmV4dFByb3BzLnBlckxpbmU7XG5cdCAgICAgIHZhciBuZXh0SGFzU3RpY2t5UG9zaXRpb24gPSBuZXh0UHJvcHMuaGFzU3RpY2t5UG9zaXRpb247XG5cdCAgICAgIHZhciBuZXh0RW1vamlzID0gbmV4dFByb3BzLmVtb2ppcztcblx0ICAgICAgdmFyIG5leHRFbW9qaVByb3BzID0gbmV4dFByb3BzLmVtb2ppUHJvcHM7XG5cdCAgICAgIHZhciBuZXh0U2tpbiA9IG5leHRFbW9qaVByb3BzLnNraW47XG5cdCAgICAgIHZhciBuZXh0U2l6ZSA9IG5leHRFbW9qaVByb3BzLnNpemU7XG5cdCAgICAgIHZhciBuZXh0U2V0ID0gbmV4dEVtb2ppUHJvcHMuc2V0O1xuXHQgICAgICB2YXIgc2hvdWxkVXBkYXRlID0gZmFsc2U7XG5cblx0ICAgICAgaWYgKG5hbWUgPT0gJ1JlY2VudCcgJiYgcGVyTGluZSAhPSBuZXh0UGVyTGluZSkge1xuXHQgICAgICAgIHNob3VsZFVwZGF0ZSA9IHRydWU7XG5cdCAgICAgIH1cblxuXHQgICAgICBpZiAobmFtZSA9PSAnU2VhcmNoJykge1xuXHQgICAgICAgIHNob3VsZFVwZGF0ZSA9ICEoZW1vamlzID09IG5leHRFbW9qaXMpO1xuXHQgICAgICB9XG5cblx0ICAgICAgaWYgKHNraW4gIT0gbmV4dFNraW4gfHwgc2l6ZSAhPSBuZXh0U2l6ZSB8fCBzZXQgIT0gbmV4dFNldCB8fCBoYXNTdGlja3lQb3NpdGlvbiAhPSBuZXh0SGFzU3RpY2t5UG9zaXRpb24pIHtcblx0ICAgICAgICBzaG91bGRVcGRhdGUgPSB0cnVlO1xuXHQgICAgICB9XG5cblx0ICAgICAgcmV0dXJuIHNob3VsZFVwZGF0ZTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdtZW1vaXplU2l6ZScsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gbWVtb2l6ZVNpemUoKSB7XG5cdCAgICAgIHZhciBfY29udGFpbmVyJGdldEJvdW5kaW4gPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHQgICAgICB2YXIgdG9wID0gX2NvbnRhaW5lciRnZXRCb3VuZGluLnRvcDtcblx0ICAgICAgdmFyIGhlaWdodCA9IF9jb250YWluZXIkZ2V0Qm91bmRpbi5oZWlnaHQ7XG5cblx0ICAgICAgdmFyIF9wYXJlbnQkZ2V0Qm91bmRpbmdDbCA9IHRoaXMucGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG5cdCAgICAgIHZhciBwYXJlbnRUb3AgPSBfcGFyZW50JGdldEJvdW5kaW5nQ2wudG9wO1xuXG5cdCAgICAgIHZhciBfbGFiZWwkZ2V0Qm91bmRpbmdDbGkgPSB0aGlzLmxhYmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG5cdCAgICAgIHZhciBsYWJlbEhlaWdodCA9IF9sYWJlbCRnZXRCb3VuZGluZ0NsaS5oZWlnaHQ7XG5cblxuXHQgICAgICB0aGlzLnRvcCA9IHRvcCAtIHBhcmVudFRvcCArIHRoaXMucGFyZW50LnNjcm9sbFRvcDtcblxuXHQgICAgICBpZiAoaGVpZ2h0ID09IDApIHtcblx0ICAgICAgICB0aGlzLm1heE1hcmdpbiA9IDA7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5tYXhNYXJnaW4gPSBoZWlnaHQgLSBsYWJlbEhlaWdodDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2hhbmRsZVNjcm9sbCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlU2Nyb2xsKHNjcm9sbFRvcCkge1xuXHQgICAgICB2YXIgbWFyZ2luID0gc2Nyb2xsVG9wIC0gdGhpcy50b3A7XG5cdCAgICAgIG1hcmdpbiA9IG1hcmdpbiA8IHRoaXMubWluTWFyZ2luID8gdGhpcy5taW5NYXJnaW4gOiBtYXJnaW47XG5cdCAgICAgIG1hcmdpbiA9IG1hcmdpbiA+IHRoaXMubWF4TWFyZ2luID8gdGhpcy5tYXhNYXJnaW4gOiBtYXJnaW47XG5cblx0ICAgICAgaWYgKG1hcmdpbiA9PSB0aGlzLm1hcmdpbikgcmV0dXJuO1xuXHQgICAgICB2YXIgbmFtZSA9IHRoaXMucHJvcHMubmFtZTtcblxuXG5cdCAgICAgIGlmICghdGhpcy5wcm9wcy5oYXNTdGlja3lQb3NpdGlvbikge1xuXHQgICAgICAgIHRoaXMubGFiZWwuc3R5bGUudG9wID0gbWFyZ2luICsgJ3B4Jztcblx0ICAgICAgfVxuXG5cdCAgICAgIHRoaXMubWFyZ2luID0gbWFyZ2luO1xuXHQgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdnZXRFbW9qaXMnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEVtb2ppcygpIHtcblx0ICAgICAgdmFyIF9wcm9wczIgPSB0aGlzLnByb3BzO1xuXHQgICAgICB2YXIgbmFtZSA9IF9wcm9wczIubmFtZTtcblx0ICAgICAgdmFyIGVtb2ppcyA9IF9wcm9wczIuZW1vamlzO1xuXHQgICAgICB2YXIgcGVyTGluZSA9IF9wcm9wczIucGVyTGluZTtcblxuXG5cdCAgICAgIGlmIChuYW1lID09ICdSZWNlbnQnKSB7XG5cdCAgICAgICAgdmFyIGZyZXF1ZW50bHlVc2VkID0gX2ZyZXF1ZW50bHkyLmRlZmF1bHQuZ2V0KHBlckxpbmUgKiA0KTtcblxuXHQgICAgICAgIGlmIChmcmVxdWVudGx5VXNlZC5sZW5ndGgpIHtcblx0ICAgICAgICAgIGVtb2ppcyA9IGZyZXF1ZW50bHlVc2VkO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXG5cdCAgICAgIGlmIChlbW9qaXMpIHtcblx0ICAgICAgICBlbW9qaXMgPSBlbW9qaXMuc2xpY2UoMCk7XG5cdCAgICAgIH1cblxuXHQgICAgICByZXR1cm4gZW1vamlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ3VwZGF0ZURpc3BsYXknLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZURpc3BsYXkoZGlzcGxheSkge1xuXHQgICAgICB2YXIgZW1vamlzID0gdGhpcy5nZXRFbW9qaXMoKTtcblxuXHQgICAgICBpZiAoIWRpc3BsYXkgJiYgIWVtb2ppcykge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXG5cdCAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSBkaXNwbGF5O1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ3JlbmRlcicsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuXHQgICAgICB2YXIgX3Byb3BzMyA9IHRoaXMucHJvcHM7XG5cdCAgICAgIHZhciBuYW1lID0gX3Byb3BzMy5uYW1lO1xuXHQgICAgICB2YXIgaGFzU3RpY2t5UG9zaXRpb24gPSBfcHJvcHMzLmhhc1N0aWNreVBvc2l0aW9uO1xuXHQgICAgICB2YXIgZW1vamlQcm9wcyA9IF9wcm9wczMuZW1vamlQcm9wcztcblx0ICAgICAgdmFyIGkxOG4gPSBfcHJvcHMzLmkxOG47XG5cdCAgICAgIHZhciBlbW9qaXMgPSB0aGlzLmdldEVtb2ppcygpO1xuXHQgICAgICB2YXIgbGFiZWxTdHlsZXMgPSB7fTtcblx0ICAgICAgdmFyIGxhYmVsU3BhblN0eWxlcyA9IHt9O1xuXHQgICAgICB2YXIgY29udGFpbmVyU3R5bGVzID0ge307XG5cblx0ICAgICAgaWYgKCFlbW9qaXMpIHtcblx0ICAgICAgICBjb250YWluZXJTdHlsZXMgPSB7XG5cdCAgICAgICAgICBkaXNwbGF5OiAnbm9uZSdcblx0ICAgICAgICB9O1xuXHQgICAgICB9XG5cblx0ICAgICAgaWYgKCFoYXNTdGlja3lQb3NpdGlvbikge1xuXHQgICAgICAgIGxhYmVsU3R5bGVzID0ge1xuXHQgICAgICAgICAgaGVpZ2h0OiAyOFxuXHQgICAgICAgIH07XG5cblx0ICAgICAgICBsYWJlbFNwYW5TdHlsZXMgPSB7XG5cdCAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuXHQgICAgICAgIH07XG5cdCAgICAgIH1cblxuXHQgICAgICByZXR1cm4gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXG5cdCAgICAgICAgJ2RpdicsXG5cdCAgICAgICAgeyByZWY6ICdjb250YWluZXInLCBjbGFzc05hbWU6ICdlbW9qaS1tYXJ0LWNhdGVnb3J5Jywgc3R5bGU6IGNvbnRhaW5lclN0eWxlcyB9LFxuXHQgICAgICAgIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFxuXHQgICAgICAgICAgJ2RpdicsXG5cdCAgICAgICAgICB7IHN0eWxlOiBsYWJlbFN0eWxlcywgJ2RhdGEtbmFtZSc6IG5hbWUsIGNsYXNzTmFtZTogJ2Vtb2ppLW1hcnQtY2F0ZWdvcnktbGFiZWwnIH0sXG5cdCAgICAgICAgICBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcblx0ICAgICAgICAgICAgJ3NwYW4nLFxuXHQgICAgICAgICAgICB7IHN0eWxlOiBsYWJlbFNwYW5TdHlsZXMsIHJlZjogJ2xhYmVsJyB9LFxuXHQgICAgICAgICAgICBpMThuLmNhdGVnb3JpZXNbbmFtZS50b0xvd2VyQ2FzZSgpXVxuXHQgICAgICAgICAgKVxuXHQgICAgICAgICksXG5cdCAgICAgICAgZW1vamlzICYmIGVtb2ppcy5tYXAoZnVuY3Rpb24gKGVtb2ppKSB7XG5cdCAgICAgICAgICByZXR1cm4gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXy5FbW9qaSwgX2V4dGVuZHMoe1xuXHQgICAgICAgICAgICBrZXk6IGVtb2ppLmlkIHx8IGVtb2ppLFxuXHQgICAgICAgICAgICBlbW9qaTogZW1vamlcblx0ICAgICAgICAgIH0sIGVtb2ppUHJvcHMpKTtcblx0ICAgICAgICB9KSxcblx0ICAgICAgICBlbW9qaXMgJiYgIWVtb2ppcy5sZW5ndGggJiYgX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXG5cdCAgICAgICAgICAnZGl2Jyxcblx0ICAgICAgICAgIHsgY2xhc3NOYW1lOiAnZW1vamktbWFydC1uby1yZXN1bHRzJyB9LFxuXHQgICAgICAgICAgX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXy5FbW9qaSwgX2V4dGVuZHMoe30sIGVtb2ppUHJvcHMsIHtcblx0ICAgICAgICAgICAgc2l6ZTogMjIsXG5cdCAgICAgICAgICAgIGVtb2ppOiAnc2xldXRoX29yX3NweSdcblx0ICAgICAgICAgIH0pKSxcblx0ICAgICAgICAgIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFxuXHQgICAgICAgICAgICAnc3BhbicsXG5cdCAgICAgICAgICAgIHsgY2xhc3NOYW1lOiAnZW1vamktbWFydC1uby1yZXN1bHRzLWxhYmVsJyB9LFxuXHQgICAgICAgICAgICAnTm8gZW1vamkgZm91bmQnXG5cdCAgICAgICAgICApXG5cdCAgICAgICAgKVxuXHQgICAgICApO1xuXHQgICAgfVxuXHQgIH1dKTtcblxuXHQgIHJldHVybiBDYXRlZ29yeTtcblx0fShfcmVhY3QyLmRlZmF1bHQuQ29tcG9uZW50KTtcblxuXHRleHBvcnRzLmRlZmF1bHQgPSBDYXRlZ29yeTtcblxuXG5cdENhdGVnb3J5LnByb3BUeXBlcyA9IHtcblx0ICBlbW9qaXM6IF9yZWFjdDIuZGVmYXVsdC5Qcm9wVHlwZXMuYXJyYXksXG5cdCAgaGFzU3RpY2t5UG9zaXRpb246IF9yZWFjdDIuZGVmYXVsdC5Qcm9wVHlwZXMuYm9vbCxcblx0ICBuYW1lOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuXHQgIHBlckxpbmU6IF9yZWFjdDIuZGVmYXVsdC5Qcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG5cdCAgZW1vamlQcm9wczogX3JlYWN0Mi5kZWZhdWx0LlByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZFxuXHR9O1xuXG5cdENhdGVnb3J5LmRlZmF1bHRQcm9wcyA9IHtcblx0ICBlbW9qaXM6IFtdLFxuXHQgIGhhc1N0aWNreVBvc2l0aW9uOiB0cnVlXG5cdH07XG5cbi8qKiovIH0sXG4vKiAxNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXG5cdHZhciBfc3RvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KTtcblxuXHR2YXIgX3N0b3JlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3N0b3JlKTtcblxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5cdHZhciBmcmVxdWVudGx5ID0gX3N0b3JlMi5kZWZhdWx0LmdldCgnZnJlcXVlbnRseScpIHx8IHt9O1xuXG5cdGZ1bmN0aW9uIGFkZChlbW9qaSkge1xuXHQgIHZhciBpZCA9IGVtb2ppLmlkO1xuXG5cblx0ICBmcmVxdWVudGx5W2lkXSB8fCAoZnJlcXVlbnRseVtpZF0gPSAwKTtcblx0ICBmcmVxdWVudGx5W2lkXSArPSAxO1xuXG5cdCAgX3N0b3JlMi5kZWZhdWx0LnNldCgnbGFzdCcsIGlkKTtcblx0ICBfc3RvcmUyLmRlZmF1bHQuc2V0KCdmcmVxdWVudGx5JywgZnJlcXVlbnRseSk7XG5cdH1cblxuXHRmdW5jdGlvbiBnZXQocXVhbnRpdHkpIHtcblx0ICB2YXIgc29ydGVkID0gT2JqZWN0LmtleXMoZnJlcXVlbnRseSkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuXHQgICAgcmV0dXJuIGZyZXF1ZW50bHlbYV0gLSBmcmVxdWVudGx5W2JdO1xuXHQgIH0pLnJldmVyc2UoKSxcblx0ICAgICAgc2xpY2VkID0gc29ydGVkLnNsaWNlKDAsIHF1YW50aXR5KSxcblx0ICAgICAgbGFzdCA9IF9zdG9yZTIuZGVmYXVsdC5nZXQoJ2xhc3QnKTtcblxuXHQgIGlmIChsYXN0ICYmIHNsaWNlZC5pbmRleE9mKGxhc3QpID09IC0xKSB7XG5cdCAgICBzbGljZWQucG9wKCk7XG5cdCAgICBzbGljZWQucHVzaChsYXN0KTtcblx0ICB9XG5cblx0ICByZXR1cm4gc2xpY2VkO1xuXHR9XG5cblx0ZXhwb3J0cy5kZWZhdWx0ID0geyBhZGQ6IGFkZCwgZ2V0OiBnZXQgfTtcblxuLyoqKi8gfSxcbi8qIDE3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdHZhciBOQU1FU1BBQ0UgPSAnZW1vamktbWFydCc7XG5cblx0dmFyIGlzTG9jYWxTdG9yYWdlU3VwcG9ydGVkID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2xvY2FsU3RvcmFnZScgaW4gd2luZG93O1xuXG5cdGZ1bmN0aW9uIHVwZGF0ZShzdGF0ZSkge1xuXHQgIGZvciAodmFyIGtleSBpbiBzdGF0ZSkge1xuXHQgICAgdmFyIHZhbHVlID0gc3RhdGVba2V5XTtcblx0ICAgIHNldChrZXksIHZhbHVlKTtcblx0ICB9XG5cdH1cblxuXHRmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuXHQgIGlmICghaXNMb2NhbFN0b3JhZ2VTdXBwb3J0ZWQpIHJldHVybjtcblx0ICB0cnkge1xuXHQgICAgd2luZG93LmxvY2FsU3RvcmFnZVtOQU1FU1BBQ0UgKyAnLicgKyBrZXldID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuXHQgIH0gY2F0Y2ggKGUpIHt9XG5cdH1cblxuXHRmdW5jdGlvbiBnZXQoa2V5KSB7XG5cdCAgaWYgKCFpc0xvY2FsU3RvcmFnZVN1cHBvcnRlZCkgcmV0dXJuO1xuXHQgIHRyeSB7XG5cdCAgICB2YXIgdmFsdWUgPSB3aW5kb3cubG9jYWxTdG9yYWdlW05BTUVTUEFDRSArICcuJyArIGtleV07XG5cdCAgfSBjYXRjaCAoZSkge1xuXHQgICAgcmV0dXJuO1xuXHQgIH1cblxuXHQgIGlmICh2YWx1ZSkge1xuXHQgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpO1xuXHQgIH1cblx0fVxuXG5cdGZ1bmN0aW9uIHNldE5hbWVzcGFjZShuYW1lc3BhY2UpIHtcblx0ICBOQU1FU1BBQ0UgPSBuYW1lc3BhY2U7XG5cdH1cblxuXHRleHBvcnRzLmRlZmF1bHQgPSB7IHVwZGF0ZTogdXBkYXRlLCBzZXQ6IHNldCwgZ2V0OiBnZXQsIHNldE5hbWVzcGFjZTogc2V0TmFtZXNwYWNlIH07XG5cbi8qKiovIH0sXG4vKiAxOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXG5cdHZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cblx0dmFyIF9yZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cblx0dmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cblx0dmFyIF9kYXRhID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSk7XG5cblx0dmFyIF9kYXRhMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RhdGEpO1xuXG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTtcblxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5cdGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cblx0ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cblx0ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cblx0dmFyIFNIRUVUX0NPTFVNTlMgPSA0MTtcblxuXHR2YXIgRW1vamkgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuXHQgIF9pbmhlcml0cyhFbW9qaSwgX1JlYWN0JENvbXBvbmVudCk7XG5cblx0ICBmdW5jdGlvbiBFbW9qaShwcm9wcykge1xuXHQgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEVtb2ppKTtcblxuXHQgICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgT2JqZWN0LmdldFByb3RvdHlwZU9mKEVtb2ppKS5jYWxsKHRoaXMsIHByb3BzKSk7XG5cblx0ICAgIF90aGlzLmhhc1NraW5WYXJpYXRpb25zID0gISFfdGhpcy5nZXREYXRhKCkuc2tpbl92YXJpYXRpb25zO1xuXHQgICAgcmV0dXJuIF90aGlzO1xuXHQgIH1cblxuXHQgIF9jcmVhdGVDbGFzcyhFbW9qaSwgW3tcblx0ICAgIGtleTogJ3Nob3VsZENvbXBvbmVudFVwZGF0ZScsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcykge1xuXHQgICAgICByZXR1cm4gdGhpcy5oYXNTa2luVmFyaWF0aW9ucyAmJiBuZXh0UHJvcHMuc2tpbiAhPSB0aGlzLnByb3BzLnNraW4gfHwgbmV4dFByb3BzLnNpemUgIT0gdGhpcy5wcm9wcy5zaXplIHx8IG5leHRQcm9wcy5zZXQgIT0gdGhpcy5wcm9wcy5zZXQgfHwgbmV4dFByb3BzLmVtb2ppICE9IHRoaXMucHJvcHMuZW1vamk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZ2V0UG9zaXRpb24nLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBvc2l0aW9uKCkge1xuXHQgICAgICB2YXIgX2dldERhdGEyID0gdGhpcy5nZXREYXRhKCk7XG5cblx0ICAgICAgdmFyIHNoZWV0X3ggPSBfZ2V0RGF0YTIuc2hlZXRfeDtcblx0ICAgICAgdmFyIHNoZWV0X3kgPSBfZ2V0RGF0YTIuc2hlZXRfeTtcblx0ICAgICAgdmFyIG11bHRpcGx5ID0gMTAwIC8gKFNIRUVUX0NPTFVNTlMgLSAxKTtcblxuXHQgICAgICByZXR1cm4gbXVsdGlwbHkgKiBzaGVldF94ICsgJyUgJyArIG11bHRpcGx5ICogc2hlZXRfeSArICclJztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdnZXREYXRhJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREYXRhKCkge1xuXHQgICAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcztcblx0ICAgICAgdmFyIGVtb2ppID0gX3Byb3BzLmVtb2ppO1xuXHQgICAgICB2YXIgc2tpbiA9IF9wcm9wcy5za2luO1xuXHQgICAgICB2YXIgc2V0ID0gX3Byb3BzLnNldDtcblxuXHQgICAgICByZXR1cm4gKDAsIF91dGlscy5nZXREYXRhKShlbW9qaSwgc2tpbiwgc2V0KTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdnZXRTYW5pdGl6ZWREYXRhJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTYW5pdGl6ZWREYXRhKCkge1xuXHQgICAgICB2YXIgX3Byb3BzMiA9IHRoaXMucHJvcHM7XG5cdCAgICAgIHZhciBlbW9qaSA9IF9wcm9wczIuZW1vamk7XG5cdCAgICAgIHZhciBza2luID0gX3Byb3BzMi5za2luO1xuXHQgICAgICB2YXIgc2V0ID0gX3Byb3BzMi5zZXQ7XG5cblx0ICAgICAgcmV0dXJuICgwLCBfdXRpbHMuZ2V0U2FuaXRpemVkRGF0YSkoZW1vamksIHNraW4sIHNldCk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnaGFuZGxlQ2xpY2snLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGUpIHtcblx0ICAgICAgdmFyIG9uQ2xpY2sgPSB0aGlzLnByb3BzLm9uQ2xpY2s7XG5cdCAgICAgIHZhciBlbW9qaSA9IHRoaXMuZ2V0U2FuaXRpemVkRGF0YSgpO1xuXG5cdCAgICAgIG9uQ2xpY2soZW1vamksIGUpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2hhbmRsZU92ZXInLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZU92ZXIoZSkge1xuXHQgICAgICB2YXIgb25PdmVyID0gdGhpcy5wcm9wcy5vbk92ZXI7XG5cdCAgICAgIHZhciBlbW9qaSA9IHRoaXMuZ2V0U2FuaXRpemVkRGF0YSgpO1xuXG5cdCAgICAgIG9uT3ZlcihlbW9qaSwgZSk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnaGFuZGxlTGVhdmUnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZUxlYXZlKGUpIHtcblx0ICAgICAgdmFyIG9uTGVhdmUgPSB0aGlzLnByb3BzLm9uTGVhdmU7XG5cdCAgICAgIHZhciBlbW9qaSA9IHRoaXMuZ2V0U2FuaXRpemVkRGF0YSgpO1xuXG5cdCAgICAgIG9uTGVhdmUoZW1vamksIGUpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ3JlbmRlcicsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuXHQgICAgICB2YXIgX3Byb3BzMyA9IHRoaXMucHJvcHM7XG5cdCAgICAgIHZhciBzZXQgPSBfcHJvcHMzLnNldDtcblx0ICAgICAgdmFyIHNpemUgPSBfcHJvcHMzLnNpemU7XG5cdCAgICAgIHZhciBzaGVldFNpemUgPSBfcHJvcHMzLnNoZWV0U2l6ZTtcblx0ICAgICAgdmFyIG5hdGl2ZSA9IF9wcm9wczMubmF0aXZlO1xuXHQgICAgICB2YXIgb25PdmVyID0gX3Byb3BzMy5vbk92ZXI7XG5cdCAgICAgIHZhciBvbkxlYXZlID0gX3Byb3BzMy5vbkxlYXZlO1xuXHQgICAgICB2YXIgYmFja2dyb3VuZEltYWdlRm4gPSBfcHJvcHMzLmJhY2tncm91bmRJbWFnZUZuO1xuXG5cdCAgICAgIHZhciBfZ2V0RGF0YTMgPSB0aGlzLmdldERhdGEoKTtcblxuXHQgICAgICB2YXIgdW5pZmllZCA9IF9nZXREYXRhMy51bmlmaWVkO1xuXHQgICAgICB2YXIgc3R5bGUgPSB7fTtcblx0ICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5wcm9wcy5jaGlsZHJlbjtcblxuXHQgICAgICBpZiAoIXVuaWZpZWQpIHtcblx0ICAgICAgICByZXR1cm4gbnVsbDtcblx0ICAgICAgfVxuXG5cdCAgICAgIGlmIChuYXRpdmUgJiYgdW5pZmllZCkge1xuXHQgICAgICAgIHN0eWxlID0geyBmb250U2l6ZTogc2l6ZSB9O1xuXHQgICAgICAgIGNoaWxkcmVuID0gKDAsIF91dGlscy51bmlmaWVkVG9OYXRpdmUpKHVuaWZpZWQpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHN0eWxlID0ge1xuXHQgICAgICAgICAgd2lkdGg6IHNpemUsXG5cdCAgICAgICAgICBoZWlnaHQ6IHNpemUsXG5cdCAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcblx0ICAgICAgICAgIGJhY2tncm91bmRJbWFnZTogJ3VybCgnICsgYmFja2dyb3VuZEltYWdlRm4oc2V0LCBzaGVldFNpemUpICsgJyknLFxuXHQgICAgICAgICAgYmFja2dyb3VuZFNpemU6IDEwMCAqIFNIRUVUX0NPTFVNTlMgKyAnJScsXG5cdCAgICAgICAgICBiYWNrZ3JvdW5kUG9zaXRpb246IHRoaXMuZ2V0UG9zaXRpb24oKVxuXHQgICAgICAgIH07XG5cdCAgICAgIH1cblxuXHQgICAgICByZXR1cm4gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXG5cdCAgICAgICAgJ3NwYW4nLFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2xpY2suYmluZCh0aGlzKSxcblx0ICAgICAgICAgIG9uTW91c2VFbnRlcjogdGhpcy5oYW5kbGVPdmVyLmJpbmQodGhpcyksXG5cdCAgICAgICAgICBvbk1vdXNlTGVhdmU6IHRoaXMuaGFuZGxlTGVhdmUuYmluZCh0aGlzKSxcblx0ICAgICAgICAgIGNsYXNzTmFtZTogJ2Vtb2ppLW1hcnQtZW1vamknIH0sXG5cdCAgICAgICAgX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXG5cdCAgICAgICAgICAnc3BhbicsXG5cdCAgICAgICAgICB7IHN0eWxlOiBzdHlsZSB9LFxuXHQgICAgICAgICAgY2hpbGRyZW5cblx0ICAgICAgICApXG5cdCAgICAgICk7XG5cdCAgICB9XG5cdCAgfV0pO1xuXG5cdCAgcmV0dXJuIEVtb2ppO1xuXHR9KF9yZWFjdDIuZGVmYXVsdC5Db21wb25lbnQpO1xuXG5cdGV4cG9ydHMuZGVmYXVsdCA9IEVtb2ppO1xuXG5cblx0RW1vamkucHJvcFR5cGVzID0ge1xuXHQgIG9uT3ZlcjogX3JlYWN0Mi5kZWZhdWx0LlByb3BUeXBlcy5mdW5jLFxuXHQgIG9uTGVhdmU6IF9yZWFjdDIuZGVmYXVsdC5Qcm9wVHlwZXMuZnVuYyxcblx0ICBvbkNsaWNrOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLmZ1bmMsXG5cdCAgYmFja2dyb3VuZEltYWdlRm46IF9yZWFjdDIuZGVmYXVsdC5Qcm9wVHlwZXMuZnVuYyxcblx0ICBuYXRpdmU6IF9yZWFjdDIuZGVmYXVsdC5Qcm9wVHlwZXMuYm9vbCxcblx0ICBza2luOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLm9uZU9mKFsxLCAyLCAzLCA0LCA1LCA2XSksXG5cdCAgc2hlZXRTaXplOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLm9uZU9mKFsxNiwgMjAsIDMyLCA2NF0pLFxuXHQgIHNldDogX3JlYWN0Mi5kZWZhdWx0LlByb3BUeXBlcy5vbmVPZihbJ2FwcGxlJywgJ2dvb2dsZScsICd0d2l0dGVyJywgJ2Vtb2ppb25lJ10pLFxuXHQgIHNpemU6IF9yZWFjdDIuZGVmYXVsdC5Qcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG5cdCAgZW1vamk6IF9yZWFjdDIuZGVmYXVsdC5Qcm9wVHlwZXMub25lT2ZUeXBlKFtfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLnN0cmluZywgX3JlYWN0Mi5kZWZhdWx0LlByb3BUeXBlcy5vYmplY3RdKS5pc1JlcXVpcmVkXG5cdH07XG5cblx0RW1vamkuZGVmYXVsdFByb3BzID0ge1xuXHQgIHNraW46IDEsXG5cdCAgc2V0OiAnYXBwbGUnLFxuXHQgIHNoZWV0U2l6ZTogNjQsXG5cdCAgbmF0aXZlOiBmYWxzZSxcblx0ICBiYWNrZ3JvdW5kSW1hZ2VGbjogZnVuY3Rpb24gYmFja2dyb3VuZEltYWdlRm4oc2V0LCBzaGVldFNpemUpIHtcblx0ICAgIHJldHVybiAnaHR0cHM6Ly91bnBrZy5jb20vZW1vamktZGF0YXNvdXJjZUAnICsgKCcyLjQuNCcpICsgJy9zaGVldF8nICsgc2V0ICsgJ18nICsgc2hlZXRTaXplICsgJy5wbmcnO1xuXHQgIH0sXG5cdCAgb25PdmVyOiBmdW5jdGlvbiBvbk92ZXIoKSB7fSxcblx0ICBvbkxlYXZlOiBmdW5jdGlvbiBvbkxlYXZlKCkge30sXG5cdCAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHt9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOnRydWV9KTtleHBvcnRzLmRlZmF1bHQ9e1wiY2F0ZWdvcmllc1wiOlt7XCJuYW1lXCI6XCJQZW9wbGVcIixcImVtb2ppc1wiOltcImdyaW5uaW5nXCIsXCJncmltYWNpbmdcIixcImdyaW5cIixcImpveVwiLFwic21pbGV5XCIsXCJzbWlsZVwiLFwic3dlYXRfc21pbGVcIixcImxhdWdoaW5nXCIsXCJpbm5vY2VudFwiLFwid2lua1wiLFwiYmx1c2hcIixcInNsaWdodGx5X3NtaWxpbmdfZmFjZVwiLFwidXBzaWRlX2Rvd25fZmFjZVwiLFwicmVsYXhlZFwiLFwieXVtXCIsXCJyZWxpZXZlZFwiLFwiaGVhcnRfZXllc1wiLFwia2lzc2luZ19oZWFydFwiLFwia2lzc2luZ1wiLFwia2lzc2luZ19zbWlsaW5nX2V5ZXNcIixcImtpc3NpbmdfY2xvc2VkX2V5ZXNcIixcInN0dWNrX291dF90b25ndWVfd2lua2luZ19leWVcIixcInN0dWNrX291dF90b25ndWVfY2xvc2VkX2V5ZXNcIixcInN0dWNrX291dF90b25ndWVcIixcIm1vbmV5X21vdXRoX2ZhY2VcIixcIm5lcmRfZmFjZVwiLFwic3VuZ2xhc3Nlc1wiLFwiaHVnZ2luZ19mYWNlXCIsXCJzbWlya1wiLFwibm9fbW91dGhcIixcIm5ldXRyYWxfZmFjZVwiLFwiZXhwcmVzc2lvbmxlc3NcIixcInVuYW11c2VkXCIsXCJmYWNlX3dpdGhfcm9sbGluZ19leWVzXCIsXCJ0aGlua2luZ19mYWNlXCIsXCJmbHVzaGVkXCIsXCJkaXNhcHBvaW50ZWRcIixcIndvcnJpZWRcIixcImFuZ3J5XCIsXCJyYWdlXCIsXCJwZW5zaXZlXCIsXCJjb25mdXNlZFwiLFwic2xpZ2h0bHlfZnJvd25pbmdfZmFjZVwiLFwid2hpdGVfZnJvd25pbmdfZmFjZVwiLFwicGVyc2V2ZXJlXCIsXCJjb25mb3VuZGVkXCIsXCJ0aXJlZF9mYWNlXCIsXCJ3ZWFyeVwiLFwidHJpdW1waFwiLFwib3Blbl9tb3V0aFwiLFwic2NyZWFtXCIsXCJmZWFyZnVsXCIsXCJjb2xkX3N3ZWF0XCIsXCJodXNoZWRcIixcImZyb3duaW5nXCIsXCJhbmd1aXNoZWRcIixcImNyeVwiLFwiZGlzYXBwb2ludGVkX3JlbGlldmVkXCIsXCJzbGVlcHlcIixcInN3ZWF0XCIsXCJzb2JcIixcImRpenp5X2ZhY2VcIixcImFzdG9uaXNoZWRcIixcInppcHBlcl9tb3V0aF9mYWNlXCIsXCJtYXNrXCIsXCJmYWNlX3dpdGhfdGhlcm1vbWV0ZXJcIixcImZhY2Vfd2l0aF9oZWFkX2JhbmRhZ2VcIixcInNsZWVwaW5nXCIsXCJ6enpcIixcImhhbmtleVwiLFwic21pbGluZ19pbXBcIixcImltcFwiLFwiamFwYW5lc2Vfb2dyZVwiLFwiamFwYW5lc2VfZ29ibGluXCIsXCJza3VsbFwiLFwiZ2hvc3RcIixcImFsaWVuXCIsXCJyb2JvdF9mYWNlXCIsXCJzbWlsZXlfY2F0XCIsXCJzbWlsZV9jYXRcIixcImpveV9jYXRcIixcImhlYXJ0X2V5ZXNfY2F0XCIsXCJzbWlya19jYXRcIixcImtpc3NpbmdfY2F0XCIsXCJzY3JlYW1fY2F0XCIsXCJjcnlpbmdfY2F0X2ZhY2VcIixcInBvdXRpbmdfY2F0XCIsXCJyYWlzZWRfaGFuZHNcIixcImNsYXBcIixcIndhdmVcIixcIisxXCIsXCItMVwiLFwiZmFjZXB1bmNoXCIsXCJmaXN0XCIsXCJ2XCIsXCJva19oYW5kXCIsXCJoYW5kXCIsXCJvcGVuX2hhbmRzXCIsXCJtdXNjbGVcIixcInByYXlcIixcInBvaW50X3VwXCIsXCJwb2ludF91cF8yXCIsXCJwb2ludF9kb3duXCIsXCJwb2ludF9sZWZ0XCIsXCJwb2ludF9yaWdodFwiLFwibWlkZGxlX2ZpbmdlclwiLFwicmFpc2VkX2hhbmRfd2l0aF9maW5nZXJzX3NwbGF5ZWRcIixcInRoZV9ob3Juc1wiLFwic3BvY2staGFuZFwiLFwid3JpdGluZ19oYW5kXCIsXCJuYWlsX2NhcmVcIixcImxpcHNcIixcInRvbmd1ZVwiLFwiZWFyXCIsXCJub3NlXCIsXCJleWVcIixcImV5ZXNcIixcImJ1c3RfaW5fc2lsaG91ZXR0ZVwiLFwiYnVzdHNfaW5fc2lsaG91ZXR0ZVwiLFwic3BlYWtpbmdfaGVhZF9pbl9zaWxob3VldHRlXCIsXCJiYWJ5XCIsXCJib3lcIixcImdpcmxcIixcIm1hblwiLFwid29tYW5cIixcInBlcnNvbl93aXRoX2Jsb25kX2hhaXJcIixcIm9sZGVyX21hblwiLFwib2xkZXJfd29tYW5cIixcIm1hbl93aXRoX2d1YV9waV9tYW9cIixcIm1hbl93aXRoX3R1cmJhblwiLFwiY29wXCIsXCJjb25zdHJ1Y3Rpb25fd29ya2VyXCIsXCJndWFyZHNtYW5cIixcInNsZXV0aF9vcl9zcHlcIixcInNhbnRhXCIsXCJhbmdlbFwiLFwicHJpbmNlc3NcIixcImJyaWRlX3dpdGhfdmVpbFwiLFwid2Fsa2luZ1wiLFwicnVubmVyXCIsXCJkYW5jZXJcIixcImRhbmNlcnNcIixcImNvdXBsZVwiLFwidHdvX21lbl9ob2xkaW5nX2hhbmRzXCIsXCJ0d29fd29tZW5faG9sZGluZ19oYW5kc1wiLFwiYm93XCIsXCJpbmZvcm1hdGlvbl9kZXNrX3BlcnNvblwiLFwibm9fZ29vZFwiLFwib2tfd29tYW5cIixcInJhaXNpbmdfaGFuZFwiLFwicGVyc29uX3dpdGhfcG91dGluZ19mYWNlXCIsXCJwZXJzb25fZnJvd25pbmdcIixcImhhaXJjdXRcIixcIm1hc3NhZ2VcIixcImNvdXBsZV93aXRoX2hlYXJ0XCIsXCJ3b21hbi1oZWFydC13b21hblwiLFwibWFuLWhlYXJ0LW1hblwiLFwiY291cGxla2lzc1wiLFwid29tYW4ta2lzcy13b21hblwiLFwibWFuLWtpc3MtbWFuXCIsXCJmYW1pbHlcIixcIm1hbi13b21hbi1naXJsXCIsXCJtYW4td29tYW4tZ2lybC1ib3lcIixcIm1hbi13b21hbi1ib3ktYm95XCIsXCJtYW4td29tYW4tZ2lybC1naXJsXCIsXCJ3b21hbi13b21hbi1ib3lcIixcIndvbWFuLXdvbWFuLWdpcmxcIixcIndvbWFuLXdvbWFuLWdpcmwtYm95XCIsXCJ3b21hbi13b21hbi1ib3ktYm95XCIsXCJ3b21hbi13b21hbi1naXJsLWdpcmxcIixcIm1hbi1tYW4tYm95XCIsXCJtYW4tbWFuLWdpcmxcIixcIm1hbi1tYW4tZ2lybC1ib3lcIixcIm1hbi1tYW4tYm95LWJveVwiLFwibWFuLW1hbi1naXJsLWdpcmxcIixcIndvbWFuc19jbG90aGVzXCIsXCJzaGlydFwiLFwiamVhbnNcIixcIm5lY2t0aWVcIixcImRyZXNzXCIsXCJiaWtpbmlcIixcImtpbW9ub1wiLFwibGlwc3RpY2tcIixcImtpc3NcIixcImZvb3RwcmludHNcIixcImhpZ2hfaGVlbFwiLFwic2FuZGFsXCIsXCJib290XCIsXCJtYW5zX3Nob2VcIixcImF0aGxldGljX3Nob2VcIixcIndvbWFuc19oYXRcIixcInRvcGhhdFwiLFwiaGVsbWV0X3dpdGhfd2hpdGVfY3Jvc3NcIixcIm1vcnRhcl9ib2FyZFwiLFwiY3Jvd25cIixcInNjaG9vbF9zYXRjaGVsXCIsXCJwb3VjaFwiLFwicHVyc2VcIixcImhhbmRiYWdcIixcImJyaWVmY2FzZVwiLFwiZXllZ2xhc3Nlc1wiLFwiZGFya19zdW5nbGFzc2VzXCIsXCJyaW5nXCIsXCJjbG9zZWRfdW1icmVsbGFcIl19LHtcIm5hbWVcIjpcIk5hdHVyZVwiLFwiZW1vamlzXCI6W1wiZG9nXCIsXCJjYXRcIixcIm1vdXNlXCIsXCJoYW1zdGVyXCIsXCJyYWJiaXRcIixcImJlYXJcIixcInBhbmRhX2ZhY2VcIixcImtvYWxhXCIsXCJ0aWdlclwiLFwibGlvbl9mYWNlXCIsXCJjb3dcIixcInBpZ1wiLFwicGlnX25vc2VcIixcImZyb2dcIixcIm9jdG9wdXNcIixcIm1vbmtleV9mYWNlXCIsXCJzZWVfbm9fZXZpbFwiLFwiaGVhcl9ub19ldmlsXCIsXCJzcGVha19ub19ldmlsXCIsXCJtb25rZXlcIixcImNoaWNrZW5cIixcInBlbmd1aW5cIixcImJpcmRcIixcImJhYnlfY2hpY2tcIixcImhhdGNoaW5nX2NoaWNrXCIsXCJoYXRjaGVkX2NoaWNrXCIsXCJ3b2xmXCIsXCJib2FyXCIsXCJob3JzZVwiLFwidW5pY29ybl9mYWNlXCIsXCJiZWVcIixcImJ1Z1wiLFwic25haWxcIixcImJlZXRsZVwiLFwiYW50XCIsXCJzcGlkZXJcIixcInNjb3JwaW9uXCIsXCJjcmFiXCIsXCJzbmFrZVwiLFwidHVydGxlXCIsXCJ0cm9waWNhbF9maXNoXCIsXCJmaXNoXCIsXCJibG93ZmlzaFwiLFwiZG9scGhpblwiLFwid2hhbGVcIixcIndoYWxlMlwiLFwiY3JvY29kaWxlXCIsXCJsZW9wYXJkXCIsXCJ0aWdlcjJcIixcIndhdGVyX2J1ZmZhbG9cIixcIm94XCIsXCJjb3cyXCIsXCJkcm9tZWRhcnlfY2FtZWxcIixcImNhbWVsXCIsXCJlbGVwaGFudFwiLFwiZ29hdFwiLFwicmFtXCIsXCJzaGVlcFwiLFwicmFjZWhvcnNlXCIsXCJwaWcyXCIsXCJyYXRcIixcIm1vdXNlMlwiLFwicm9vc3RlclwiLFwidHVya2V5XCIsXCJkb3ZlX29mX3BlYWNlXCIsXCJkb2cyXCIsXCJwb29kbGVcIixcImNhdDJcIixcInJhYmJpdDJcIixcImNoaXBtdW5rXCIsXCJmZWV0XCIsXCJkcmFnb25cIixcImRyYWdvbl9mYWNlXCIsXCJjYWN0dXNcIixcImNocmlzdG1hc190cmVlXCIsXCJldmVyZ3JlZW5fdHJlZVwiLFwiZGVjaWR1b3VzX3RyZWVcIixcInBhbG1fdHJlZVwiLFwic2VlZGxpbmdcIixcImhlcmJcIixcInNoYW1yb2NrXCIsXCJmb3VyX2xlYWZfY2xvdmVyXCIsXCJiYW1ib29cIixcInRhbmFiYXRhX3RyZWVcIixcImxlYXZlc1wiLFwiZmFsbGVuX2xlYWZcIixcIm1hcGxlX2xlYWZcIixcImVhcl9vZl9yaWNlXCIsXCJoaWJpc2N1c1wiLFwic3VuZmxvd2VyXCIsXCJyb3NlXCIsXCJ0dWxpcFwiLFwiYmxvc3NvbVwiLFwiY2hlcnJ5X2Jsb3Nzb21cIixcImJvdXF1ZXRcIixcIm11c2hyb29tXCIsXCJjaGVzdG51dFwiLFwiamFja19vX2xhbnRlcm5cIixcInNoZWxsXCIsXCJzcGlkZXJfd2ViXCIsXCJlYXJ0aF9hbWVyaWNhc1wiLFwiZWFydGhfYWZyaWNhXCIsXCJlYXJ0aF9hc2lhXCIsXCJmdWxsX21vb25cIixcIndhbmluZ19naWJib3VzX21vb25cIixcImxhc3RfcXVhcnRlcl9tb29uXCIsXCJ3YW5pbmdfY3Jlc2NlbnRfbW9vblwiLFwibmV3X21vb25cIixcIndheGluZ19jcmVzY2VudF9tb29uXCIsXCJmaXJzdF9xdWFydGVyX21vb25cIixcIm1vb25cIixcIm5ld19tb29uX3dpdGhfZmFjZVwiLFwiZnVsbF9tb29uX3dpdGhfZmFjZVwiLFwiZmlyc3RfcXVhcnRlcl9tb29uX3dpdGhfZmFjZVwiLFwibGFzdF9xdWFydGVyX21vb25fd2l0aF9mYWNlXCIsXCJzdW5fd2l0aF9mYWNlXCIsXCJjcmVzY2VudF9tb29uXCIsXCJzdGFyXCIsXCJzdGFyMlwiLFwiZGl6enlcIixcInNwYXJrbGVzXCIsXCJjb21ldFwiLFwic3VubnlcIixcIm1vc3RseV9zdW5ueVwiLFwicGFydGx5X3N1bm55XCIsXCJiYXJlbHlfc3VubnlcIixcInBhcnRseV9zdW5ueV9yYWluXCIsXCJjbG91ZFwiLFwicmFpbl9jbG91ZFwiLFwidGh1bmRlcl9jbG91ZF9hbmRfcmFpblwiLFwibGlnaHRuaW5nXCIsXCJ6YXBcIixcImZpcmVcIixcImJvb21cIixcInNub3dmbGFrZVwiLFwic25vd19jbG91ZFwiLFwic25vd21hblwiLFwic25vd21hbl93aXRob3V0X3Nub3dcIixcIndpbmRfYmxvd2luZ19mYWNlXCIsXCJkYXNoXCIsXCJ0b3JuYWRvXCIsXCJmb2dcIixcInVtYnJlbGxhXCIsXCJ1bWJyZWxsYV93aXRoX3JhaW5fZHJvcHNcIixcImRyb3BsZXRcIixcInN3ZWF0X2Ryb3BzXCIsXCJvY2VhblwiXX0se1wibmFtZVwiOlwiRm9vZHNcIixcImVtb2ppc1wiOltcImdyZWVuX2FwcGxlXCIsXCJhcHBsZVwiLFwicGVhclwiLFwidGFuZ2VyaW5lXCIsXCJsZW1vblwiLFwiYmFuYW5hXCIsXCJ3YXRlcm1lbG9uXCIsXCJncmFwZXNcIixcInN0cmF3YmVycnlcIixcIm1lbG9uXCIsXCJjaGVycmllc1wiLFwicGVhY2hcIixcInBpbmVhcHBsZVwiLFwidG9tYXRvXCIsXCJlZ2dwbGFudFwiLFwiaG90X3BlcHBlclwiLFwiY29yblwiLFwic3dlZXRfcG90YXRvXCIsXCJob25leV9wb3RcIixcImJyZWFkXCIsXCJjaGVlc2Vfd2VkZ2VcIixcInBvdWx0cnlfbGVnXCIsXCJtZWF0X29uX2JvbmVcIixcImZyaWVkX3NocmltcFwiLFwiZWdnXCIsXCJoYW1idXJnZXJcIixcImZyaWVzXCIsXCJob3Rkb2dcIixcInBpenphXCIsXCJzcGFnaGV0dGlcIixcInRhY29cIixcImJ1cnJpdG9cIixcInJhbWVuXCIsXCJzdGV3XCIsXCJmaXNoX2Nha2VcIixcInN1c2hpXCIsXCJiZW50b1wiLFwiY3VycnlcIixcInJpY2VfYmFsbFwiLFwicmljZVwiLFwicmljZV9jcmFja2VyXCIsXCJvZGVuXCIsXCJkYW5nb1wiLFwic2hhdmVkX2ljZVwiLFwiaWNlX2NyZWFtXCIsXCJpY2VjcmVhbVwiLFwiY2FrZVwiLFwiYmlydGhkYXlcIixcImN1c3RhcmRcIixcImNhbmR5XCIsXCJsb2xsaXBvcFwiLFwiY2hvY29sYXRlX2JhclwiLFwicG9wY29yblwiLFwiZG91Z2hudXRcIixcImNvb2tpZVwiLFwiYmVlclwiLFwiYmVlcnNcIixcIndpbmVfZ2xhc3NcIixcImNvY2t0YWlsXCIsXCJ0cm9waWNhbF9kcmlua1wiLFwiY2hhbXBhZ25lXCIsXCJzYWtlXCIsXCJ0ZWFcIixcImNvZmZlZVwiLFwiYmFieV9ib3R0bGVcIixcImZvcmtfYW5kX2tuaWZlXCIsXCJrbmlmZV9mb3JrX3BsYXRlXCJdfSx7XCJuYW1lXCI6XCJBY3Rpdml0eVwiLFwiZW1vamlzXCI6W1wic29jY2VyXCIsXCJiYXNrZXRiYWxsXCIsXCJmb290YmFsbFwiLFwiYmFzZWJhbGxcIixcInRlbm5pc1wiLFwidm9sbGV5YmFsbFwiLFwicnVnYnlfZm9vdGJhbGxcIixcIjhiYWxsXCIsXCJnb2xmXCIsXCJnb2xmZXJcIixcInRhYmxlX3Rlbm5pc19wYWRkbGVfYW5kX2JhbGxcIixcImJhZG1pbnRvbl9yYWNxdWV0X2FuZF9zaHV0dGxlY29ja1wiLFwiaWNlX2hvY2tleV9zdGlja19hbmRfcHVja1wiLFwiZmllbGRfaG9ja2V5X3N0aWNrX2FuZF9iYWxsXCIsXCJjcmlja2V0X2JhdF9hbmRfYmFsbFwiLFwic2tpXCIsXCJza2llclwiLFwic25vd2JvYXJkZXJcIixcImljZV9za2F0ZVwiLFwiYm93X2FuZF9hcnJvd1wiLFwiZmlzaGluZ19wb2xlX2FuZF9maXNoXCIsXCJyb3dib2F0XCIsXCJzd2ltbWVyXCIsXCJzdXJmZXJcIixcImJhdGhcIixcInBlcnNvbl93aXRoX2JhbGxcIixcIndlaWdodF9saWZ0ZXJcIixcImJpY3ljbGlzdFwiLFwibW91bnRhaW5fYmljeWNsaXN0XCIsXCJob3JzZV9yYWNpbmdcIixcIm1hbl9pbl9idXNpbmVzc19zdWl0X2xldml0YXRpbmdcIixcInRyb3BoeVwiLFwicnVubmluZ19zaGlydF93aXRoX3Nhc2hcIixcInNwb3J0c19tZWRhbFwiLFwibWVkYWxcIixcInJlbWluZGVyX3JpYmJvblwiLFwicm9zZXR0ZVwiLFwidGlja2V0XCIsXCJhZG1pc3Npb25fdGlja2V0c1wiLFwicGVyZm9ybWluZ19hcnRzXCIsXCJhcnRcIixcImNpcmN1c190ZW50XCIsXCJtaWNyb3Bob25lXCIsXCJoZWFkcGhvbmVzXCIsXCJtdXNpY2FsX3Njb3JlXCIsXCJtdXNpY2FsX2tleWJvYXJkXCIsXCJzYXhvcGhvbmVcIixcInRydW1wZXRcIixcImd1aXRhclwiLFwidmlvbGluXCIsXCJjbGFwcGVyXCIsXCJ2aWRlb19nYW1lXCIsXCJzcGFjZV9pbnZhZGVyXCIsXCJkYXJ0XCIsXCJnYW1lX2RpZVwiLFwic2xvdF9tYWNoaW5lXCIsXCJib3dsaW5nXCJdfSx7XCJuYW1lXCI6XCJQbGFjZXNcIixcImVtb2ppc1wiOltcImNhclwiLFwidGF4aVwiLFwiYmx1ZV9jYXJcIixcImJ1c1wiLFwidHJvbGxleWJ1c1wiLFwicmFjaW5nX2NhclwiLFwicG9saWNlX2NhclwiLFwiYW1idWxhbmNlXCIsXCJmaXJlX2VuZ2luZVwiLFwibWluaWJ1c1wiLFwidHJ1Y2tcIixcImFydGljdWxhdGVkX2xvcnJ5XCIsXCJ0cmFjdG9yXCIsXCJyYWNpbmdfbW90b3JjeWNsZVwiLFwiYmlrZVwiLFwicm90YXRpbmdfbGlnaHRcIixcIm9uY29taW5nX3BvbGljZV9jYXJcIixcIm9uY29taW5nX2J1c1wiLFwib25jb21pbmdfYXV0b21vYmlsZVwiLFwib25jb21pbmdfdGF4aVwiLFwiYWVyaWFsX3RyYW13YXlcIixcIm1vdW50YWluX2NhYmxld2F5XCIsXCJzdXNwZW5zaW9uX3JhaWx3YXlcIixcInJhaWx3YXlfY2FyXCIsXCJ0cmFpblwiLFwibW9ub3JhaWxcIixcImJ1bGxldHRyYWluX3NpZGVcIixcImJ1bGxldHRyYWluX2Zyb250XCIsXCJsaWdodF9yYWlsXCIsXCJtb3VudGFpbl9yYWlsd2F5XCIsXCJzdGVhbV9sb2NvbW90aXZlXCIsXCJ0cmFpbjJcIixcIm1ldHJvXCIsXCJ0cmFtXCIsXCJzdGF0aW9uXCIsXCJoZWxpY29wdGVyXCIsXCJzbWFsbF9haXJwbGFuZVwiLFwiYWlycGxhbmVcIixcImFpcnBsYW5lX2RlcGFydHVyZVwiLFwiYWlycGxhbmVfYXJyaXZpbmdcIixcImJvYXRcIixcIm1vdG9yX2JvYXRcIixcInNwZWVkYm9hdFwiLFwiZmVycnlcIixcInBhc3Nlbmdlcl9zaGlwXCIsXCJyb2NrZXRcIixcInNhdGVsbGl0ZVwiLFwic2VhdFwiLFwiYW5jaG9yXCIsXCJjb25zdHJ1Y3Rpb25cIixcImZ1ZWxwdW1wXCIsXCJidXNzdG9wXCIsXCJ2ZXJ0aWNhbF90cmFmZmljX2xpZ2h0XCIsXCJ0cmFmZmljX2xpZ2h0XCIsXCJjaGVja2VyZWRfZmxhZ1wiLFwic2hpcFwiLFwiZmVycmlzX3doZWVsXCIsXCJyb2xsZXJfY29hc3RlclwiLFwiY2Fyb3VzZWxfaG9yc2VcIixcImJ1aWxkaW5nX2NvbnN0cnVjdGlvblwiLFwiZm9nZ3lcIixcInRva3lvX3Rvd2VyXCIsXCJmYWN0b3J5XCIsXCJmb3VudGFpblwiLFwicmljZV9zY2VuZVwiLFwibW91bnRhaW5cIixcInNub3dfY2FwcGVkX21vdW50YWluXCIsXCJtb3VudF9mdWppXCIsXCJ2b2xjYW5vXCIsXCJqYXBhblwiLFwiY2FtcGluZ1wiLFwidGVudFwiLFwibmF0aW9uYWxfcGFya1wiLFwibW90b3J3YXlcIixcInJhaWx3YXlfdHJhY2tcIixcInN1bnJpc2VcIixcInN1bnJpc2Vfb3Zlcl9tb3VudGFpbnNcIixcImRlc2VydFwiLFwiYmVhY2hfd2l0aF91bWJyZWxsYVwiLFwiZGVzZXJ0X2lzbGFuZFwiLFwiY2l0eV9zdW5yaXNlXCIsXCJjaXR5X3N1bnNldFwiLFwiY2l0eXNjYXBlXCIsXCJuaWdodF93aXRoX3N0YXJzXCIsXCJicmlkZ2VfYXRfbmlnaHRcIixcIm1pbGt5X3dheVwiLFwic3RhcnNcIixcInNwYXJrbGVyXCIsXCJmaXJld29ya3NcIixcInJhaW5ib3dcIixcImhvdXNlX2J1aWxkaW5nc1wiLFwiZXVyb3BlYW5fY2FzdGxlXCIsXCJqYXBhbmVzZV9jYXN0bGVcIixcInN0YWRpdW1cIixcInN0YXR1ZV9vZl9saWJlcnR5XCIsXCJob3VzZVwiLFwiaG91c2Vfd2l0aF9nYXJkZW5cIixcImRlcmVsaWN0X2hvdXNlX2J1aWxkaW5nXCIsXCJvZmZpY2VcIixcImRlcGFydG1lbnRfc3RvcmVcIixcInBvc3Rfb2ZmaWNlXCIsXCJldXJvcGVhbl9wb3N0X29mZmljZVwiLFwiaG9zcGl0YWxcIixcImJhbmtcIixcImhvdGVsXCIsXCJjb252ZW5pZW5jZV9zdG9yZVwiLFwic2Nob29sXCIsXCJsb3ZlX2hvdGVsXCIsXCJ3ZWRkaW5nXCIsXCJjbGFzc2ljYWxfYnVpbGRpbmdcIixcImNodXJjaFwiLFwibW9zcXVlXCIsXCJzeW5hZ29ndWVcIixcImthYWJhXCIsXCJzaGludG9fc2hyaW5lXCJdfSx7XCJuYW1lXCI6XCJPYmplY3RzXCIsXCJlbW9qaXNcIjpbXCJ3YXRjaFwiLFwiaXBob25lXCIsXCJjYWxsaW5nXCIsXCJjb21wdXRlclwiLFwia2V5Ym9hcmRcIixcImRlc2t0b3BfY29tcHV0ZXJcIixcInByaW50ZXJcIixcInRocmVlX2J1dHRvbl9tb3VzZVwiLFwidHJhY2tiYWxsXCIsXCJqb3lzdGlja1wiLFwiY29tcHJlc3Npb25cIixcIm1pbmlkaXNjXCIsXCJmbG9wcHlfZGlza1wiLFwiY2RcIixcImR2ZFwiLFwidmhzXCIsXCJjYW1lcmFcIixcImNhbWVyYV93aXRoX2ZsYXNoXCIsXCJ2aWRlb19jYW1lcmFcIixcIm1vdmllX2NhbWVyYVwiLFwiZmlsbV9wcm9qZWN0b3JcIixcImZpbG1fZnJhbWVzXCIsXCJ0ZWxlcGhvbmVfcmVjZWl2ZXJcIixcInBob25lXCIsXCJwYWdlclwiLFwiZmF4XCIsXCJ0dlwiLFwicmFkaW9cIixcInN0dWRpb19taWNyb3Bob25lXCIsXCJsZXZlbF9zbGlkZXJcIixcImNvbnRyb2xfa25vYnNcIixcInN0b3B3YXRjaFwiLFwidGltZXJfY2xvY2tcIixcImFsYXJtX2Nsb2NrXCIsXCJtYW50ZWxwaWVjZV9jbG9ja1wiLFwiaG91cmdsYXNzX2Zsb3dpbmdfc2FuZFwiLFwiaG91cmdsYXNzXCIsXCJzYXRlbGxpdGVfYW50ZW5uYVwiLFwiYmF0dGVyeVwiLFwiZWxlY3RyaWNfcGx1Z1wiLFwiYnVsYlwiLFwiZmxhc2hsaWdodFwiLFwiY2FuZGxlXCIsXCJ3YXN0ZWJhc2tldFwiLFwib2lsX2RydW1cIixcIm1vbmV5X3dpdGhfd2luZ3NcIixcImRvbGxhclwiLFwieWVuXCIsXCJldXJvXCIsXCJwb3VuZFwiLFwibW9uZXliYWdcIixcImNyZWRpdF9jYXJkXCIsXCJnZW1cIixcInNjYWxlc1wiLFwid3JlbmNoXCIsXCJoYW1tZXJcIixcImhhbW1lcl9hbmRfcGlja1wiLFwiaGFtbWVyX2FuZF93cmVuY2hcIixcInBpY2tcIixcIm51dF9hbmRfYm9sdFwiLFwiZ2VhclwiLFwiY2hhaW5zXCIsXCJndW5cIixcImJvbWJcIixcImhvY2hvXCIsXCJkYWdnZXJfa25pZmVcIixcImNyb3NzZWRfc3dvcmRzXCIsXCJzaGllbGRcIixcInNtb2tpbmdcIixcInNrdWxsX2FuZF9jcm9zc2JvbmVzXCIsXCJjb2ZmaW5cIixcImZ1bmVyYWxfdXJuXCIsXCJhbXBob3JhXCIsXCJjcnlzdGFsX2JhbGxcIixcInByYXllcl9iZWFkc1wiLFwiYmFyYmVyXCIsXCJhbGVtYmljXCIsXCJ0ZWxlc2NvcGVcIixcIm1pY3Jvc2NvcGVcIixcImhvbGVcIixcInBpbGxcIixcInN5cmluZ2VcIixcInRoZXJtb21ldGVyXCIsXCJsYWJlbFwiLFwiYm9va21hcmtcIixcInRvaWxldFwiLFwic2hvd2VyXCIsXCJiYXRodHViXCIsXCJrZXlcIixcIm9sZF9rZXlcIixcImNvdWNoX2FuZF9sYW1wXCIsXCJzbGVlcGluZ19hY2NvbW1vZGF0aW9uXCIsXCJiZWRcIixcImRvb3JcIixcImJlbGxob3BfYmVsbFwiLFwiZnJhbWVfd2l0aF9waWN0dXJlXCIsXCJ3b3JsZF9tYXBcIixcInVtYnJlbGxhX29uX2dyb3VuZFwiLFwibW95YWlcIixcInNob3BwaW5nX2JhZ3NcIixcImJhbGxvb25cIixcImZsYWdzXCIsXCJyaWJib25cIixcImdpZnRcIixcImNvbmZldHRpX2JhbGxcIixcInRhZGFcIixcImRvbGxzXCIsXCJ3aW5kX2NoaW1lXCIsXCJjcm9zc2VkX2ZsYWdzXCIsXCJpemFrYXlhX2xhbnRlcm5cIixcImVtYWlsXCIsXCJlbnZlbG9wZV93aXRoX2Fycm93XCIsXCJpbmNvbWluZ19lbnZlbG9wZVwiLFwiZS1tYWlsXCIsXCJsb3ZlX2xldHRlclwiLFwicG9zdGJveFwiLFwibWFpbGJveF9jbG9zZWRcIixcIm1haWxib3hcIixcIm1haWxib3hfd2l0aF9tYWlsXCIsXCJtYWlsYm94X3dpdGhfbm9fbWFpbFwiLFwicGFja2FnZVwiLFwicG9zdGFsX2hvcm5cIixcImluYm94X3RyYXlcIixcIm91dGJveF90cmF5XCIsXCJzY3JvbGxcIixcInBhZ2Vfd2l0aF9jdXJsXCIsXCJib29rbWFya190YWJzXCIsXCJiYXJfY2hhcnRcIixcImNoYXJ0X3dpdGhfdXB3YXJkc190cmVuZFwiLFwiY2hhcnRfd2l0aF9kb3dud2FyZHNfdHJlbmRcIixcInBhZ2VfZmFjaW5nX3VwXCIsXCJkYXRlXCIsXCJjYWxlbmRhclwiLFwic3BpcmFsX2NhbGVuZGFyX3BhZFwiLFwiY2FyZF9pbmRleFwiLFwiY2FyZF9maWxlX2JveFwiLFwiYmFsbG90X2JveF93aXRoX2JhbGxvdFwiLFwiZmlsZV9jYWJpbmV0XCIsXCJjbGlwYm9hcmRcIixcInNwaXJhbF9ub3RlX3BhZFwiLFwiZmlsZV9mb2xkZXJcIixcIm9wZW5fZmlsZV9mb2xkZXJcIixcImNhcmRfaW5kZXhfZGl2aWRlcnNcIixcInJvbGxlZF91cF9uZXdzcGFwZXJcIixcIm5ld3NwYXBlclwiLFwibm90ZWJvb2tcIixcImNsb3NlZF9ib29rXCIsXCJncmVlbl9ib29rXCIsXCJibHVlX2Jvb2tcIixcIm9yYW5nZV9ib29rXCIsXCJub3RlYm9va193aXRoX2RlY29yYXRpdmVfY292ZXJcIixcImxlZGdlclwiLFwiYm9va3NcIixcImJvb2tcIixcImxpbmtcIixcInBhcGVyY2xpcFwiLFwibGlua2VkX3BhcGVyY2xpcHNcIixcInNjaXNzb3JzXCIsXCJ0cmlhbmd1bGFyX3J1bGVyXCIsXCJzdHJhaWdodF9ydWxlclwiLFwicHVzaHBpblwiLFwicm91bmRfcHVzaHBpblwiLFwidHJpYW5ndWxhcl9mbGFnX29uX3Bvc3RcIixcIndhdmluZ193aGl0ZV9mbGFnXCIsXCJ3YXZpbmdfYmxhY2tfZmxhZ1wiLFwiY2xvc2VkX2xvY2tfd2l0aF9rZXlcIixcImxvY2tcIixcInVubG9ja1wiLFwibG9ja193aXRoX2lua19wZW5cIixcImxvd2VyX2xlZnRfYmFsbHBvaW50X3BlblwiLFwibG93ZXJfbGVmdF9mb3VudGFpbl9wZW5cIixcImJsYWNrX25pYlwiLFwibWVtb1wiLFwicGVuY2lsMlwiLFwibG93ZXJfbGVmdF9jcmF5b25cIixcImxvd2VyX2xlZnRfcGFpbnRicnVzaFwiLFwibWFnXCIsXCJtYWdfcmlnaHRcIl19LHtcIm5hbWVcIjpcIlN5bWJvbHNcIixcImVtb2ppc1wiOltcImhlYXJ0XCIsXCJ5ZWxsb3dfaGVhcnRcIixcImdyZWVuX2hlYXJ0XCIsXCJibHVlX2hlYXJ0XCIsXCJwdXJwbGVfaGVhcnRcIixcImJyb2tlbl9oZWFydFwiLFwiaGVhdnlfaGVhcnRfZXhjbGFtYXRpb25fbWFya19vcm5hbWVudFwiLFwidHdvX2hlYXJ0c1wiLFwicmV2b2x2aW5nX2hlYXJ0c1wiLFwiaGVhcnRiZWF0XCIsXCJoZWFydHB1bHNlXCIsXCJzcGFya2xpbmdfaGVhcnRcIixcImN1cGlkXCIsXCJnaWZ0X2hlYXJ0XCIsXCJoZWFydF9kZWNvcmF0aW9uXCIsXCJwZWFjZV9zeW1ib2xcIixcImxhdGluX2Nyb3NzXCIsXCJzdGFyX2FuZF9jcmVzY2VudFwiLFwib21fc3ltYm9sXCIsXCJ3aGVlbF9vZl9kaGFybWFcIixcInN0YXJfb2ZfZGF2aWRcIixcInNpeF9wb2ludGVkX3N0YXJcIixcIm1lbm9yYWhfd2l0aF9uaW5lX2JyYW5jaGVzXCIsXCJ5aW5feWFuZ1wiLFwib3J0aG9kb3hfY3Jvc3NcIixcInBsYWNlX29mX3dvcnNoaXBcIixcIm9waGl1Y2h1c1wiLFwiYXJpZXNcIixcInRhdXJ1c1wiLFwiZ2VtaW5pXCIsXCJjYW5jZXJcIixcImxlb1wiLFwidmlyZ29cIixcImxpYnJhXCIsXCJzY29ycGl1c1wiLFwic2FnaXR0YXJpdXNcIixcImNhcHJpY29yblwiLFwiYXF1YXJpdXNcIixcInBpc2Nlc1wiLFwiaWRcIixcImF0b21fc3ltYm9sXCIsXCJ1N2E3YVwiLFwidTUyNzJcIixcInJhZGlvYWN0aXZlX3NpZ25cIixcImJpb2hhemFyZF9zaWduXCIsXCJtb2JpbGVfcGhvbmVfb2ZmXCIsXCJ2aWJyYXRpb25fbW9kZVwiLFwidTY3MDlcIixcInU3MTIxXCIsXCJ1NzUzM1wiLFwidTU1YjZcIixcInU2NzA4XCIsXCJlaWdodF9wb2ludGVkX2JsYWNrX3N0YXJcIixcInZzXCIsXCJhY2NlcHRcIixcIndoaXRlX2Zsb3dlclwiLFwiaWRlb2dyYXBoX2FkdmFudGFnZVwiLFwic2VjcmV0XCIsXCJjb25ncmF0dWxhdGlvbnNcIixcInU1NDA4XCIsXCJ1NmU4MFwiLFwidTc5ODFcIixcImFcIixcImJcIixcImFiXCIsXCJjbFwiLFwibzJcIixcInNvc1wiLFwibm9fZW50cnlcIixcIm5hbWVfYmFkZ2VcIixcIm5vX2VudHJ5X3NpZ25cIixcInhcIixcIm9cIixcImFuZ2VyXCIsXCJob3RzcHJpbmdzXCIsXCJub19wZWRlc3RyaWFuc1wiLFwiZG9fbm90X2xpdHRlclwiLFwibm9fYmljeWNsZXNcIixcIm5vbi1wb3RhYmxlX3dhdGVyXCIsXCJ1bmRlcmFnZVwiLFwibm9fbW9iaWxlX3Bob25lc1wiLFwiZXhjbGFtYXRpb25cIixcImdyZXlfZXhjbGFtYXRpb25cIixcInF1ZXN0aW9uXCIsXCJncmV5X3F1ZXN0aW9uXCIsXCJiYW5nYmFuZ1wiLFwiaW50ZXJyb2JhbmdcIixcIjEwMFwiLFwibG93X2JyaWdodG5lc3NcIixcImhpZ2hfYnJpZ2h0bmVzc1wiLFwidHJpZGVudFwiLFwiZmxldXJfZGVfbGlzXCIsXCJwYXJ0X2FsdGVybmF0aW9uX21hcmtcIixcIndhcm5pbmdcIixcImNoaWxkcmVuX2Nyb3NzaW5nXCIsXCJiZWdpbm5lclwiLFwicmVjeWNsZVwiLFwidTYzMDdcIixcImNoYXJ0XCIsXCJzcGFya2xlXCIsXCJlaWdodF9zcG9rZWRfYXN0ZXJpc2tcIixcIm5lZ2F0aXZlX3NxdWFyZWRfY3Jvc3NfbWFya1wiLFwid2hpdGVfY2hlY2tfbWFya1wiLFwiZGlhbW9uZF9zaGFwZV93aXRoX2FfZG90X2luc2lkZVwiLFwiY3ljbG9uZVwiLFwibG9vcFwiLFwiZ2xvYmVfd2l0aF9tZXJpZGlhbnNcIixcIm1cIixcImF0bVwiLFwic2FcIixcInBhc3Nwb3J0X2NvbnRyb2xcIixcImN1c3RvbXNcIixcImJhZ2dhZ2VfY2xhaW1cIixcImxlZnRfbHVnZ2FnZVwiLFwid2hlZWxjaGFpclwiLFwibm9fc21va2luZ1wiLFwid2NcIixcInBhcmtpbmdcIixcInBvdGFibGVfd2F0ZXJcIixcIm1lbnNcIixcIndvbWVuc1wiLFwiYmFieV9zeW1ib2xcIixcInJlc3Ryb29tXCIsXCJwdXRfbGl0dGVyX2luX2l0c19wbGFjZVwiLFwiY2luZW1hXCIsXCJzaWduYWxfc3RyZW5ndGhcIixcImtva29cIixcIm5nXCIsXCJva1wiLFwidXBcIixcImNvb2xcIixcIm5ld1wiLFwiZnJlZVwiLFwiemVyb1wiLFwib25lXCIsXCJ0d29cIixcInRocmVlXCIsXCJmb3VyXCIsXCJmaXZlXCIsXCJzaXhcIixcInNldmVuXCIsXCJlaWdodFwiLFwibmluZVwiLFwia2V5Y2FwX3RlblwiLFwia2V5Y2FwX3N0YXJcIixcIjEyMzRcIixcImFycm93X2ZvcndhcmRcIixcImRvdWJsZV92ZXJ0aWNhbF9iYXJcIixcImJsYWNrX3JpZ2h0X3BvaW50aW5nX3RyaWFuZ2xlX3dpdGhfZG91YmxlX3ZlcnRpY2FsX2JhclwiLFwiYmxhY2tfc3F1YXJlX2Zvcl9zdG9wXCIsXCJlamVjdFwiLFwiYmxhY2tfY2lyY2xlX2Zvcl9yZWNvcmRcIixcImJsYWNrX3JpZ2h0X3BvaW50aW5nX2RvdWJsZV90cmlhbmdsZV93aXRoX3ZlcnRpY2FsX2JhclwiLFwiYmxhY2tfbGVmdF9wb2ludGluZ19kb3VibGVfdHJpYW5nbGVfd2l0aF92ZXJ0aWNhbF9iYXJcIixcImZhc3RfZm9yd2FyZFwiLFwicmV3aW5kXCIsXCJ0d2lzdGVkX3JpZ2h0d2FyZHNfYXJyb3dzXCIsXCJyZXBlYXRcIixcInJlcGVhdF9vbmVcIixcImFycm93X2JhY2t3YXJkXCIsXCJhcnJvd191cF9zbWFsbFwiLFwiYXJyb3dfZG93bl9zbWFsbFwiLFwiYXJyb3dfZG91YmxlX3VwXCIsXCJhcnJvd19kb3VibGVfZG93blwiLFwiYXJyb3dfcmlnaHRcIixcImFycm93X2xlZnRcIixcImFycm93X3VwXCIsXCJhcnJvd19kb3duXCIsXCJhcnJvd191cHBlcl9yaWdodFwiLFwiYXJyb3dfbG93ZXJfcmlnaHRcIixcImFycm93X2xvd2VyX2xlZnRcIixcImFycm93X3VwcGVyX2xlZnRcIixcImFycm93X3VwX2Rvd25cIixcImxlZnRfcmlnaHRfYXJyb3dcIixcImFycm93c19jb3VudGVyY2xvY2t3aXNlXCIsXCJhcnJvd19yaWdodF9ob29rXCIsXCJsZWZ0d2FyZHNfYXJyb3dfd2l0aF9ob29rXCIsXCJhcnJvd19oZWFkaW5nX3VwXCIsXCJhcnJvd19oZWFkaW5nX2Rvd25cIixcImhhc2hcIixcImluZm9ybWF0aW9uX3NvdXJjZVwiLFwiYWJjXCIsXCJhYmNkXCIsXCJjYXBpdGFsX2FiY2RcIixcInN5bWJvbHNcIixcIm11c2ljYWxfbm90ZVwiLFwibm90ZXNcIixcIndhdnlfZGFzaFwiLFwiY3VybHlfbG9vcFwiLFwiaGVhdnlfY2hlY2tfbWFya1wiLFwiYXJyb3dzX2Nsb2Nrd2lzZVwiLFwiaGVhdnlfcGx1c19zaWduXCIsXCJoZWF2eV9taW51c19zaWduXCIsXCJoZWF2eV9kaXZpc2lvbl9zaWduXCIsXCJoZWF2eV9tdWx0aXBsaWNhdGlvbl94XCIsXCJoZWF2eV9kb2xsYXJfc2lnblwiLFwiY3VycmVuY3lfZXhjaGFuZ2VcIixcImNvcHlyaWdodFwiLFwicmVnaXN0ZXJlZFwiLFwidG1cIixcImVuZFwiLFwiYmFja1wiLFwib25cIixcInRvcFwiLFwic29vblwiLFwiYmFsbG90X2JveF93aXRoX2NoZWNrXCIsXCJyYWRpb19idXR0b25cIixcIndoaXRlX2NpcmNsZVwiLFwiYmxhY2tfY2lyY2xlXCIsXCJyZWRfY2lyY2xlXCIsXCJsYXJnZV9ibHVlX2NpcmNsZVwiLFwic21hbGxfb3JhbmdlX2RpYW1vbmRcIixcInNtYWxsX2JsdWVfZGlhbW9uZFwiLFwibGFyZ2Vfb3JhbmdlX2RpYW1vbmRcIixcImxhcmdlX2JsdWVfZGlhbW9uZFwiLFwic21hbGxfcmVkX3RyaWFuZ2xlXCIsXCJibGFja19zbWFsbF9zcXVhcmVcIixcIndoaXRlX3NtYWxsX3NxdWFyZVwiLFwiYmxhY2tfbGFyZ2Vfc3F1YXJlXCIsXCJ3aGl0ZV9sYXJnZV9zcXVhcmVcIixcInNtYWxsX3JlZF90cmlhbmdsZV9kb3duXCIsXCJibGFja19tZWRpdW1fc3F1YXJlXCIsXCJ3aGl0ZV9tZWRpdW1fc3F1YXJlXCIsXCJibGFja19tZWRpdW1fc21hbGxfc3F1YXJlXCIsXCJ3aGl0ZV9tZWRpdW1fc21hbGxfc3F1YXJlXCIsXCJibGFja19zcXVhcmVfYnV0dG9uXCIsXCJ3aGl0ZV9zcXVhcmVfYnV0dG9uXCIsXCJzcGVha2VyXCIsXCJzb3VuZFwiLFwibG91ZF9zb3VuZFwiLFwibXV0ZVwiLFwibWVnYVwiLFwibG91ZHNwZWFrZXJcIixcImJlbGxcIixcIm5vX2JlbGxcIixcImJsYWNrX2pva2VyXCIsXCJtYWhqb25nXCIsXCJzcGFkZXNcIixcImNsdWJzXCIsXCJoZWFydHNcIixcImRpYW1vbmRzXCIsXCJmbG93ZXJfcGxheWluZ19jYXJkc1wiLFwidGhvdWdodF9iYWxsb29uXCIsXCJyaWdodF9hbmdlcl9idWJibGVcIixcInNwZWVjaF9iYWxsb29uXCIsXCJsZWZ0X3NwZWVjaF9idWJibGVcIixcImNsb2NrMVwiLFwiY2xvY2syXCIsXCJjbG9jazNcIixcImNsb2NrNFwiLFwiY2xvY2s1XCIsXCJjbG9jazZcIixcImNsb2NrN1wiLFwiY2xvY2s4XCIsXCJjbG9jazlcIixcImNsb2NrMTBcIixcImNsb2NrMTFcIixcImNsb2NrMTJcIixcImNsb2NrMTMwXCIsXCJjbG9jazIzMFwiLFwiY2xvY2szMzBcIixcImNsb2NrNDMwXCIsXCJjbG9jazUzMFwiLFwiY2xvY2s2MzBcIixcImNsb2NrNzMwXCIsXCJjbG9jazgzMFwiLFwiY2xvY2s5MzBcIixcImNsb2NrMTAzMFwiLFwiY2xvY2sxMTMwXCIsXCJjbG9jazEyMzBcIl19LHtcIm5hbWVcIjpcIkZsYWdzXCIsXCJlbW9qaXNcIjpbXCJmbGFnLWFjXCIsXCJmbGFnLWFkXCIsXCJmbGFnLWFlXCIsXCJmbGFnLWFmXCIsXCJmbGFnLWFnXCIsXCJmbGFnLWFpXCIsXCJmbGFnLWFsXCIsXCJmbGFnLWFtXCIsXCJmbGFnLWFvXCIsXCJmbGFnLWFxXCIsXCJmbGFnLWFyXCIsXCJmbGFnLWFzXCIsXCJmbGFnLWF0XCIsXCJmbGFnLWF1XCIsXCJmbGFnLWF3XCIsXCJmbGFnLWF4XCIsXCJmbGFnLWF6XCIsXCJmbGFnLWJhXCIsXCJmbGFnLWJiXCIsXCJmbGFnLWJkXCIsXCJmbGFnLWJlXCIsXCJmbGFnLWJmXCIsXCJmbGFnLWJnXCIsXCJmbGFnLWJoXCIsXCJmbGFnLWJpXCIsXCJmbGFnLWJqXCIsXCJmbGFnLWJsXCIsXCJmbGFnLWJtXCIsXCJmbGFnLWJuXCIsXCJmbGFnLWJvXCIsXCJmbGFnLWJxXCIsXCJmbGFnLWJyXCIsXCJmbGFnLWJzXCIsXCJmbGFnLWJ0XCIsXCJmbGFnLWJ2XCIsXCJmbGFnLWJ3XCIsXCJmbGFnLWJ5XCIsXCJmbGFnLWJ6XCIsXCJmbGFnLWNhXCIsXCJmbGFnLWNjXCIsXCJmbGFnLWNkXCIsXCJmbGFnLWNmXCIsXCJmbGFnLWNnXCIsXCJmbGFnLWNoXCIsXCJmbGFnLWNpXCIsXCJmbGFnLWNrXCIsXCJmbGFnLWNsXCIsXCJmbGFnLWNtXCIsXCJmbGFnLWNuXCIsXCJmbGFnLWNvXCIsXCJmbGFnLWNwXCIsXCJmbGFnLWNyXCIsXCJmbGFnLWN1XCIsXCJmbGFnLWN2XCIsXCJmbGFnLWN3XCIsXCJmbGFnLWN4XCIsXCJmbGFnLWN5XCIsXCJmbGFnLWN6XCIsXCJmbGFnLWRlXCIsXCJmbGFnLWRnXCIsXCJmbGFnLWRqXCIsXCJmbGFnLWRrXCIsXCJmbGFnLWRtXCIsXCJmbGFnLWRvXCIsXCJmbGFnLWR6XCIsXCJmbGFnLWVhXCIsXCJmbGFnLWVjXCIsXCJmbGFnLWVlXCIsXCJmbGFnLWVnXCIsXCJmbGFnLWVoXCIsXCJmbGFnLWVyXCIsXCJmbGFnLWVzXCIsXCJmbGFnLWV0XCIsXCJmbGFnLWV1XCIsXCJmbGFnLWZpXCIsXCJmbGFnLWZqXCIsXCJmbGFnLWZrXCIsXCJmbGFnLWZtXCIsXCJmbGFnLWZvXCIsXCJmbGFnLWZyXCIsXCJmbGFnLWdhXCIsXCJmbGFnLWdiXCIsXCJmbGFnLWdkXCIsXCJmbGFnLWdlXCIsXCJmbGFnLWdmXCIsXCJmbGFnLWdnXCIsXCJmbGFnLWdoXCIsXCJmbGFnLWdpXCIsXCJmbGFnLWdsXCIsXCJmbGFnLWdtXCIsXCJmbGFnLWduXCIsXCJmbGFnLWdwXCIsXCJmbGFnLWdxXCIsXCJmbGFnLWdyXCIsXCJmbGFnLWdzXCIsXCJmbGFnLWd0XCIsXCJmbGFnLWd1XCIsXCJmbGFnLWd3XCIsXCJmbGFnLWd5XCIsXCJmbGFnLWhrXCIsXCJmbGFnLWhtXCIsXCJmbGFnLWhuXCIsXCJmbGFnLWhyXCIsXCJmbGFnLWh0XCIsXCJmbGFnLWh1XCIsXCJmbGFnLWljXCIsXCJmbGFnLWlkXCIsXCJmbGFnLWllXCIsXCJmbGFnLWlsXCIsXCJmbGFnLWltXCIsXCJmbGFnLWluXCIsXCJmbGFnLWlvXCIsXCJmbGFnLWlxXCIsXCJmbGFnLWlyXCIsXCJmbGFnLWlzXCIsXCJmbGFnLWl0XCIsXCJmbGFnLWplXCIsXCJmbGFnLWptXCIsXCJmbGFnLWpvXCIsXCJmbGFnLWpwXCIsXCJmbGFnLWtlXCIsXCJmbGFnLWtnXCIsXCJmbGFnLWtoXCIsXCJmbGFnLWtpXCIsXCJmbGFnLWttXCIsXCJmbGFnLWtuXCIsXCJmbGFnLWtwXCIsXCJmbGFnLWtyXCIsXCJmbGFnLWt3XCIsXCJmbGFnLWt5XCIsXCJmbGFnLWt6XCIsXCJmbGFnLWxhXCIsXCJmbGFnLWxiXCIsXCJmbGFnLWxjXCIsXCJmbGFnLWxpXCIsXCJmbGFnLWxrXCIsXCJmbGFnLWxyXCIsXCJmbGFnLWxzXCIsXCJmbGFnLWx0XCIsXCJmbGFnLWx1XCIsXCJmbGFnLWx2XCIsXCJmbGFnLWx5XCIsXCJmbGFnLW1hXCIsXCJmbGFnLW1jXCIsXCJmbGFnLW1kXCIsXCJmbGFnLW1lXCIsXCJmbGFnLW1mXCIsXCJmbGFnLW1nXCIsXCJmbGFnLW1oXCIsXCJmbGFnLW1rXCIsXCJmbGFnLW1sXCIsXCJmbGFnLW1tXCIsXCJmbGFnLW1uXCIsXCJmbGFnLW1vXCIsXCJmbGFnLW1wXCIsXCJmbGFnLW1xXCIsXCJmbGFnLW1yXCIsXCJmbGFnLW1zXCIsXCJmbGFnLW10XCIsXCJmbGFnLW11XCIsXCJmbGFnLW12XCIsXCJmbGFnLW13XCIsXCJmbGFnLW14XCIsXCJmbGFnLW15XCIsXCJmbGFnLW16XCIsXCJmbGFnLW5hXCIsXCJmbGFnLW5jXCIsXCJmbGFnLW5lXCIsXCJmbGFnLW5mXCIsXCJmbGFnLW5nXCIsXCJmbGFnLW5pXCIsXCJmbGFnLW5sXCIsXCJmbGFnLW5vXCIsXCJmbGFnLW5wXCIsXCJmbGFnLW5yXCIsXCJmbGFnLW51XCIsXCJmbGFnLW56XCIsXCJmbGFnLW9tXCIsXCJmbGFnLXBhXCIsXCJmbGFnLXBlXCIsXCJmbGFnLXBmXCIsXCJmbGFnLXBnXCIsXCJmbGFnLXBoXCIsXCJmbGFnLXBrXCIsXCJmbGFnLXBsXCIsXCJmbGFnLXBtXCIsXCJmbGFnLXBuXCIsXCJmbGFnLXByXCIsXCJmbGFnLXBzXCIsXCJmbGFnLXB0XCIsXCJmbGFnLXB3XCIsXCJmbGFnLXB5XCIsXCJmbGFnLXFhXCIsXCJmbGFnLXJlXCIsXCJmbGFnLXJvXCIsXCJmbGFnLXJzXCIsXCJmbGFnLXJ1XCIsXCJmbGFnLXJ3XCIsXCJmbGFnLXNhXCIsXCJmbGFnLXNiXCIsXCJmbGFnLXNjXCIsXCJmbGFnLXNkXCIsXCJmbGFnLXNlXCIsXCJmbGFnLXNnXCIsXCJmbGFnLXNoXCIsXCJmbGFnLXNpXCIsXCJmbGFnLXNqXCIsXCJmbGFnLXNrXCIsXCJmbGFnLXNsXCIsXCJmbGFnLXNtXCIsXCJmbGFnLXNuXCIsXCJmbGFnLXNvXCIsXCJmbGFnLXNyXCIsXCJmbGFnLXNzXCIsXCJmbGFnLXN0XCIsXCJmbGFnLXN2XCIsXCJmbGFnLXN4XCIsXCJmbGFnLXN5XCIsXCJmbGFnLXN6XCIsXCJmbGFnLXRhXCIsXCJmbGFnLXRjXCIsXCJmbGFnLXRkXCIsXCJmbGFnLXRmXCIsXCJmbGFnLXRnXCIsXCJmbGFnLXRoXCIsXCJmbGFnLXRqXCIsXCJmbGFnLXRrXCIsXCJmbGFnLXRsXCIsXCJmbGFnLXRtXCIsXCJmbGFnLXRuXCIsXCJmbGFnLXRvXCIsXCJmbGFnLXRyXCIsXCJmbGFnLXR0XCIsXCJmbGFnLXR2XCIsXCJmbGFnLXR3XCIsXCJmbGFnLXR6XCIsXCJmbGFnLXVhXCIsXCJmbGFnLXVnXCIsXCJmbGFnLXVtXCIsXCJmbGFnLXVzXCIsXCJmbGFnLXV5XCIsXCJmbGFnLXV6XCIsXCJmbGFnLXZhXCIsXCJmbGFnLXZjXCIsXCJmbGFnLXZlXCIsXCJmbGFnLXZnXCIsXCJmbGFnLXZpXCIsXCJmbGFnLXZuXCIsXCJmbGFnLXZ1XCIsXCJmbGFnLXdmXCIsXCJmbGFnLXdzXCIsXCJmbGFnLXhrXCIsXCJmbGFnLXllXCIsXCJmbGFnLXl0XCIsXCJmbGFnLXphXCIsXCJmbGFnLXptXCIsXCJmbGFnLXp3XCJdfV0sXCJlbW9qaXNcIjp7XCIxMDBcIjp7XCJuYW1lXCI6XCJIdW5kcmVkIFBvaW50cyBTeW1ib2xcIixcInVuaWZpZWRcIjpcIjFGNEFGXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjAsXCJzaGVldF95XCI6MjcsXCJzaG9ydF9uYW1lc1wiOltcIjEwMFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNjb3JlXCIsXCJwZXJmZWN0XCIsXCJudW1iZXJzXCIsXCJjZW50dXJ5XCIsXCJleGFtXCIsXCJxdWl6XCIsXCJ0ZXN0XCIsXCJwYXNzXCIsXCJodW5kcmVkXCJdLFwic2VhcmNoXCI6XCIxMDAsaHVuZHJlZCxwb2ludHMsc3ltYm9sLHNjb3JlLHBlcmZlY3QsbnVtYmVycyxjZW50dXJ5LGV4YW0scXVpeix0ZXN0LHBhc3NcIn0sXCIxMjM0XCI6e1wibmFtZVwiOlwiSW5wdXQgU3ltYm9sIGZvciBOdW1iZXJzXCIsXCJ1bmlmaWVkXCI6XCIxRjUyMlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIzLFwic2hlZXRfeVwiOjE4LFwic2hvcnRfbmFtZXNcIjpbXCIxMjM0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibnVtYmVyc1wiLFwiYmx1ZS1zcXVhcmVcIl0sXCJzZWFyY2hcIjpcIjEyMzQsaW5wdXQsc3ltYm9sLGZvcixudW1iZXJzLGJsdWUtc3F1YXJlXCJ9LFwiZ3Jpbm5pbmdcIjp7XCJuYW1lXCI6XCJHcmlubmluZyBGYWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjYwMFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI2LFwic2hlZXRfeVwiOjE1LFwic2hvcnRfbmFtZXNcIjpbXCJncmlubmluZ1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W1wiOkRcIl0sXCJrZXl3b3Jkc1wiOltcImZhY2VcIixcInNtaWxlXCIsXCJoYXBweVwiLFwiam95XCIsXCI6RFwiXSxcInNlYXJjaFwiOlwiZ3Jpbm5pbmcsZmFjZSxzbWlsZSxoYXBweSxqb3ksOmRcIn0sXCJoZWFydFwiOntcIm5hbWVcIjpcIkhlYXZ5IEJsYWNrIEhlYXJ0XCIsXCJ1bmlmaWVkXCI6XCIyNzY0XCIsXCJ2YXJpYXRpb25zXCI6W1wiMjc2NC1GRTBGXCJdLFwic2hlZXRfeFwiOjQsXCJzaGVldF95XCI6MTAsXCJzaG9ydF9uYW1lc1wiOltcImhlYXJ0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXCI8M1wiXSxcImtleXdvcmRzXCI6W1wibG92ZVwiLFwibGlrZVwiLFwidmFsZW50aW5lc1wiXSxcInNlYXJjaFwiOlwiaGVhcnQsaGVhdnksYmxhY2ssbG92ZSxsaWtlLHZhbGVudGluZXMsPDNcIn0sXCJkb2dcIjp7XCJuYW1lXCI6XCJEb2cgRmFjZVwiLFwidW5pZmllZFwiOlwiMUY0MzZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMyxcInNoZWV0X3lcIjoxOCxcInNob3J0X25hbWVzXCI6W1wiZG9nXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJmcmllbmRcIixcIm5hdHVyZVwiLFwid29vZlwiLFwicHVwcHlcIixcInBldFwiLFwiZmFpdGhmdWxcIl0sXCJzZWFyY2hcIjpcImRvZyxmYWNlLGFuaW1hbCxmcmllbmQsbmF0dXJlLHdvb2YscHVwcHkscGV0LGZhaXRoZnVsXCJ9LFwic29jY2VyXCI6e1wibmFtZVwiOlwiU29jY2VyIEJhbGxcIixcInVuaWZpZWRcIjpcIjI2QkRcIixcInZhcmlhdGlvbnNcIjpbXCIyNkJELUZFMEZcIl0sXCJzaGVldF94XCI6MixcInNoZWV0X3lcIjoxOCxcInNob3J0X25hbWVzXCI6W1wic29jY2VyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic3BvcnRzXCIsXCJmb290YmFsbFwiXSxcInNlYXJjaFwiOlwic29jY2VyLGJhbGwsc3BvcnRzLGZvb3RiYWxsXCJ9LFwid2F0Y2hcIjp7XCJuYW1lXCI6XCJXYXRjaFwiLFwidW5pZmllZFwiOlwiMjMxQVwiLFwidmFyaWF0aW9uc1wiOltcIjIzMUEtRkUwRlwiXSxcInNoZWV0X3hcIjowLFwic2hlZXRfeVwiOjE0LFwic2hvcnRfbmFtZXNcIjpbXCJ3YXRjaFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRpbWVcIixcImFjY2Vzc29yaWVzXCJdLFwic2VhcmNoXCI6XCJ3YXRjaCx0aW1lLGFjY2Vzc29yaWVzXCJ9LFwiZ3JlZW5fYXBwbGVcIjp7XCJuYW1lXCI6XCJHcmVlbiBBcHBsZVwiLFwidW5pZmllZFwiOlwiMUYzNEZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo3LFwic2hlZXRfeVwiOjE2LFwic2hvcnRfbmFtZXNcIjpbXCJncmVlbl9hcHBsZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZydWl0XCIsXCJuYXR1cmVcIl0sXCJzZWFyY2hcIjpcImdyZWVuLGFwcGxlLGZydWl0LG5hdHVyZVwifSxcImZsYWctYWZcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQUZcIixcInVuaWZpZWRcIjpcIjFGMUU2LTFGMUVCXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzIsXCJzaGVldF95XCI6MzYsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctYWZcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxhZixyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJjYXJcIjp7XCJuYW1lXCI6XCJBdXRvbW9iaWxlXCIsXCJ1bmlmaWVkXCI6XCIxRjY5N1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI5LFwic2hlZXRfeVwiOjM1LFwic2hvcnRfbmFtZXNcIjpbXCJjYXJcIixcInJlZF9jYXJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJyZWRcIixcInRyYW5zcG9ydGF0aW9uXCIsXCJ2ZWhpY2xlXCJdLFwic2VhcmNoXCI6XCJjYXIscmVkLGF1dG9tb2JpbGUsdHJhbnNwb3J0YXRpb24sdmVoaWNsZVwifSxcImZsYWctYXhcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQVhcIixcInVuaWZpZWRcIjpcIjFGMUU2LTFGMUZEXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzMsXCJzaGVldF95XCI6NyxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1heFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGF4LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImdyaW1hY2luZ1wiOntcIm5hbWVcIjpcIkdyaW1hY2luZyBGYWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjYyQ1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI3LFwic2hlZXRfeVwiOjE4LFwic2hvcnRfbmFtZXNcIjpbXCJncmltYWNpbmdcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmYWNlXCIsXCJncmltYWNlXCIsXCJ0ZWV0aFwiXSxcInNlYXJjaFwiOlwiZ3JpbWFjaW5nLGZhY2UsZ3JpbWFjZSx0ZWV0aFwifSxcInRheGlcIjp7XCJuYW1lXCI6XCJUYXhpXCIsXCJ1bmlmaWVkXCI6XCIxRjY5NVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI5LFwic2hlZXRfeVwiOjMzLFwic2hvcnRfbmFtZXNcIjpbXCJ0YXhpXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widWJlclwiLFwidmVoaWNsZVwiLFwiY2Fyc1wiLFwidHJhbnNwb3J0YXRpb25cIl0sXCJzZWFyY2hcIjpcInRheGksdWJlcix2ZWhpY2xlLGNhcnMsdHJhbnNwb3J0YXRpb25cIn0sXCJpcGhvbmVcIjp7XCJuYW1lXCI6XCJNb2JpbGUgUGhvbmVcIixcInVuaWZpZWRcIjpcIjFGNEYxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjIsXCJzaGVldF95XCI6MTEsXCJzaG9ydF9uYW1lc1wiOltcImlwaG9uZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRlY2hub2xvZ3lcIixcImFwcGxlXCIsXCJnYWRnZXRzXCIsXCJkaWFsXCJdLFwic2VhcmNoXCI6XCJpcGhvbmUsbW9iaWxlLHBob25lLHRlY2hub2xvZ3ksYXBwbGUsZ2FkZ2V0cyxkaWFsXCJ9LFwiYmFza2V0YmFsbFwiOntcIm5hbWVcIjpcIkJhc2tldGJhbGwgYW5kIEhvb3BcIixcInVuaWZpZWRcIjpcIjFGM0MwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTAsXCJzaGVldF95XCI6NixcInNob3J0X25hbWVzXCI6W1wiYmFza2V0YmFsbFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNwb3J0c1wiLFwiYmFsbHNcIixcIk5CQVwiXSxcInNlYXJjaFwiOlwiYmFza2V0YmFsbCxhbmQsaG9vcCxzcG9ydHMsYmFsbHMsbmJhXCJ9LFwiY2F0XCI6e1wibmFtZVwiOlwiQ2F0IEZhY2VcIixcInVuaWZpZWRcIjpcIjFGNDMxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTMsXCJzaGVldF95XCI6MTMsXCJzaG9ydF9uYW1lc1wiOltcImNhdFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwibWVvd1wiLFwibmF0dXJlXCIsXCJwZXRcIl0sXCJzZWFyY2hcIjpcImNhdCxmYWNlLGFuaW1hbCxtZW93LG5hdHVyZSxwZXRcIn0sXCJhcHBsZVwiOntcIm5hbWVcIjpcIlJlZCBBcHBsZVwiLFwidW5pZmllZFwiOlwiMUYzNEVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo3LFwic2hlZXRfeVwiOjE1LFwic2hvcnRfbmFtZXNcIjpbXCJhcHBsZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZydWl0XCIsXCJtYWNcIixcInNjaG9vbFwiXSxcInNlYXJjaFwiOlwiYXBwbGUscmVkLGZydWl0LG1hYyxzY2hvb2xcIn0sXCJ5ZWxsb3dfaGVhcnRcIjp7XCJuYW1lXCI6XCJZZWxsb3cgSGVhcnRcIixcInVuaWZpZWRcIjpcIjFGNDlCXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjAsXCJzaGVldF95XCI6MixcInNob3J0X25hbWVzXCI6W1wieWVsbG93X2hlYXJ0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXCI8M1wiXSxcImtleXdvcmRzXCI6W1wibG92ZVwiLFwibGlrZVwiLFwiYWZmZWN0aW9uXCIsXCJ2YWxlbnRpbmVzXCJdLFwic2VhcmNoXCI6XCJ5ZWxsb3csaGVhcnQsbG92ZSxsaWtlLGFmZmVjdGlvbix2YWxlbnRpbmVzLDwzXCJ9LFwibW91c2VcIjp7XCJuYW1lXCI6XCJNb3VzZSBGYWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjQyRFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEzLFwic2hlZXRfeVwiOjksXCJzaG9ydF9uYW1lc1wiOltcIm1vdXNlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJuYXR1cmVcIixcImNoZWVzZVwiLFwicm9kZW50XCJdLFwic2VhcmNoXCI6XCJtb3VzZSxmYWNlLGFuaW1hbCxuYXR1cmUsY2hlZXNlLHJvZGVudFwifSxcInBlYXJcIjp7XCJuYW1lXCI6XCJQZWFyXCIsXCJ1bmlmaWVkXCI6XCIxRjM1MFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjcsXCJzaGVldF95XCI6MTcsXCJzaG9ydF9uYW1lc1wiOltcInBlYXJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmcnVpdFwiLFwibmF0dXJlXCIsXCJmb29kXCJdLFwic2VhcmNoXCI6XCJwZWFyLGZydWl0LG5hdHVyZSxmb29kXCJ9LFwiZ3JlZW5faGVhcnRcIjp7XCJuYW1lXCI6XCJHcmVlbiBIZWFydFwiLFwidW5pZmllZFwiOlwiMUY0OUFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMCxcInNoZWV0X3lcIjoxLFwic2hvcnRfbmFtZXNcIjpbXCJncmVlbl9oZWFydFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W1wiPDNcIl0sXCJrZXl3b3Jkc1wiOltcImxvdmVcIixcImxpa2VcIixcImFmZmVjdGlvblwiLFwidmFsZW50aW5lc1wiXSxcInNlYXJjaFwiOlwiZ3JlZW4saGVhcnQsbG92ZSxsaWtlLGFmZmVjdGlvbix2YWxlbnRpbmVzLDwzXCJ9LFwiZm9vdGJhbGxcIjp7XCJuYW1lXCI6XCJBbWVyaWNhbiBGb290YmFsbFwiLFwidW5pZmllZFwiOlwiMUYzQzhcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMCxcInNoZWV0X3lcIjoyNCxcInNob3J0X25hbWVzXCI6W1wiZm9vdGJhbGxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzcG9ydHNcIixcImJhbGxzXCIsXCJORkxcIl0sXCJzZWFyY2hcIjpcImZvb3RiYWxsLGFtZXJpY2FuLHNwb3J0cyxiYWxscyxuZmxcIn0sXCJncmluXCI6e1wibmFtZVwiOlwiR3Jpbm5pbmcgRmFjZSB3aXRoIFNtaWxpbmcgRXllc1wiLFwidW5pZmllZFwiOlwiMUY2MDFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNixcInNoZWV0X3lcIjoxNixcInNob3J0X25hbWVzXCI6W1wiZ3JpblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZhY2VcIixcImhhcHB5XCIsXCJzbWlsZVwiLFwiam95XCJdLFwic2VhcmNoXCI6XCJncmluLGdyaW5uaW5nLGZhY2Usd2l0aCxzbWlsaW5nLGV5ZXMsaGFwcHksc21pbGUsam95XCJ9LFwiZmxhZy1hbFwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBBTFwiLFwidW5pZmllZFwiOlwiMUYxRTYtMUYxRjFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMixcInNoZWV0X3lcIjozOSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1hbFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGFsLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImNhbGxpbmdcIjp7XCJuYW1lXCI6XCJNb2JpbGUgUGhvbmUgd2l0aCBSaWdodHdhcmRzIEFycm93IGF0IExlZnRcIixcInVuaWZpZWRcIjpcIjFGNEYyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjIsXCJzaGVldF95XCI6MTIsXCJzaG9ydF9uYW1lc1wiOltcImNhbGxpbmdcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJpcGhvbmVcIixcImluY29taW5nXCJdLFwic2VhcmNoXCI6XCJjYWxsaW5nLG1vYmlsZSxwaG9uZSx3aXRoLHJpZ2h0d2FyZHMsYXJyb3csYXQsbGVmdCxpcGhvbmUsaW5jb21pbmdcIn0sXCJibHVlX2NhclwiOntcIm5hbWVcIjpcIlJlY3JlYXRpb25hbCBWZWhpY2xlXCIsXCJ1bmlmaWVkXCI6XCIxRjY5OVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI5LFwic2hlZXRfeVwiOjM3LFwic2hvcnRfbmFtZXNcIjpbXCJibHVlX2NhclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRyYW5zcG9ydGF0aW9uXCIsXCJ2ZWhpY2xlXCJdLFwic2VhcmNoXCI6XCJibHVlLGNhcixyZWNyZWF0aW9uYWwsdmVoaWNsZSx0cmFuc3BvcnRhdGlvblwifSxcImhhbXN0ZXJcIjp7XCJuYW1lXCI6XCJIYW1zdGVyIEZhY2VcIixcInVuaWZpZWRcIjpcIjFGNDM5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTMsXCJzaGVldF95XCI6MjEsXCJzaG9ydF9uYW1lc1wiOltcImhhbXN0ZXJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcIm5hdHVyZVwiXSxcInNlYXJjaFwiOlwiaGFtc3RlcixmYWNlLGFuaW1hbCxuYXR1cmVcIn0sXCJibHVlX2hlYXJ0XCI6e1wibmFtZVwiOlwiQmx1ZSBIZWFydFwiLFwidW5pZmllZFwiOlwiMUY0OTlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMCxcInNoZWV0X3lcIjowLFwic2hvcnRfbmFtZXNcIjpbXCJibHVlX2hlYXJ0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXCI8M1wiXSxcImtleXdvcmRzXCI6W1wibG92ZVwiLFwibGlrZVwiLFwiYWZmZWN0aW9uXCIsXCJ2YWxlbnRpbmVzXCJdLFwic2VhcmNoXCI6XCJibHVlLGhlYXJ0LGxvdmUsbGlrZSxhZmZlY3Rpb24sdmFsZW50aW5lcyw8M1wifSxcImJ1c1wiOntcIm5hbWVcIjpcIkJ1c1wiLFwidW5pZmllZFwiOlwiMUY2OENcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyOSxcInNoZWV0X3lcIjoyNCxcInNob3J0X25hbWVzXCI6W1wiYnVzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiY2FyXCIsXCJ2ZWhpY2xlXCIsXCJ0cmFuc3BvcnRhdGlvblwiXSxcInNlYXJjaFwiOlwiYnVzLGNhcix2ZWhpY2xlLHRyYW5zcG9ydGF0aW9uXCJ9LFwiam95XCI6e1wibmFtZVwiOlwiRmFjZSB3aXRoIFRlYXJzIG9mIEpveVwiLFwidW5pZmllZFwiOlwiMUY2MDJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNixcInNoZWV0X3lcIjoxNyxcInNob3J0X25hbWVzXCI6W1wiam95XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmFjZVwiLFwiY3J5XCIsXCJ0ZWFyc1wiLFwid2VlcFwiLFwiaGFwcHlcIixcImhhaGFcIl0sXCJzZWFyY2hcIjpcImpveSxmYWNlLHdpdGgsdGVhcnMsb2YsY3J5LHdlZXAsaGFwcHksaGFoYVwifSxcImNvbXB1dGVyXCI6e1wibmFtZVwiOlwiUGVyc29uYWwgQ29tcHV0ZXJcIixcInVuaWZpZWRcIjpcIjFGNEJCXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjAsXCJzaGVldF95XCI6MzksXCJzaG9ydF9uYW1lc1wiOltcImNvbXB1dGVyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widGVjaG5vbG9neVwiLFwibGFwdG9wXCIsXCJzY3JlZW5cIixcImRpc3BsYXlcIixcIm1vbml0b3JcIl0sXCJzZWFyY2hcIjpcImNvbXB1dGVyLHBlcnNvbmFsLHRlY2hub2xvZ3ksbGFwdG9wLHNjcmVlbixkaXNwbGF5LG1vbml0b3JcIn0sXCJ0YW5nZXJpbmVcIjp7XCJuYW1lXCI6XCJUYW5nZXJpbmVcIixcInVuaWZpZWRcIjpcIjFGMzRBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NyxcInNoZWV0X3lcIjoxMSxcInNob3J0X25hbWVzXCI6W1widGFuZ2VyaW5lXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZm9vZFwiLFwiZnJ1aXRcIixcIm5hdHVyZVwiXSxcInNlYXJjaFwiOlwidGFuZ2VyaW5lLGZvb2QsZnJ1aXQsbmF0dXJlXCJ9LFwiYmFzZWJhbGxcIjp7XCJuYW1lXCI6XCJCYXNlYmFsbFwiLFwidW5pZmllZFwiOlwiMjZCRVwiLFwidmFyaWF0aW9uc1wiOltcIjI2QkUtRkUwRlwiXSxcInNoZWV0X3hcIjoyLFwic2hlZXRfeVwiOjE5LFwic2hvcnRfbmFtZXNcIjpbXCJiYXNlYmFsbFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNwb3J0c1wiLFwiYmFsbHNcIl0sXCJzZWFyY2hcIjpcImJhc2ViYWxsLHNwb3J0cyxiYWxsc1wifSxcImZsYWctZHpcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgRFpcIixcInVuaWZpZWRcIjpcIjFGMUU5LTFGMUZGXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzQsXCJzaGVldF95XCI6MTUsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctZHpcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxkeixyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJ0ZW5uaXNcIjp7XCJuYW1lXCI6XCJUZW5uaXMgUmFjcXVldCBhbmQgQmFsbFwiLFwidW5pZmllZFwiOlwiMUYzQkVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMCxcInNoZWV0X3lcIjo0LFwic2hvcnRfbmFtZXNcIjpbXCJ0ZW5uaXNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzcG9ydHNcIixcImJhbGxzXCIsXCJncmVlblwiXSxcInNlYXJjaFwiOlwidGVubmlzLHJhY3F1ZXQsYW5kLGJhbGwsc3BvcnRzLGJhbGxzLGdyZWVuXCJ9LFwidHJvbGxleWJ1c1wiOntcIm5hbWVcIjpcIlRyb2xsZXlidXNcIixcInVuaWZpZWRcIjpcIjFGNjhFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjksXCJzaGVldF95XCI6MjYsXCJzaG9ydF9uYW1lc1wiOltcInRyb2xsZXlidXNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJiYXJ0XCIsXCJ0cmFuc3BvcnRhdGlvblwiLFwidmVoaWNsZVwiXSxcInNlYXJjaFwiOlwidHJvbGxleWJ1cyxiYXJ0LHRyYW5zcG9ydGF0aW9uLHZlaGljbGVcIn0sXCJrZXlib2FyZFwiOntcIm5hbWVcIjpcIktleWJvYXJkXCIsXCJ1bmlmaWVkXCI6XCIyMzI4XCIsXCJ2YXJpYXRpb25zXCI6W1wiMjMyOC1GRTBGXCJdLFwic2hlZXRfeFwiOjAsXCJzaGVldF95XCI6MTYsXCJzaG9ydF9uYW1lc1wiOltcImtleWJvYXJkXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widGVjaG5vbG9neVwiLFwiY29tcHV0ZXJcIixcInR5cGVcIixcImlucHV0XCIsXCJ0ZXh0XCJdLFwic2VhcmNoXCI6XCJrZXlib2FyZCx0ZWNobm9sb2d5LGNvbXB1dGVyLHR5cGUsaW5wdXQsdGV4dFwifSxcInJhYmJpdFwiOntcIm5hbWVcIjpcIlJhYmJpdCBGYWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjQzMFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEzLFwic2hlZXRfeVwiOjEyLFwic2hvcnRfbmFtZXNcIjpbXCJyYWJiaXRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcIm5hdHVyZVwiLFwicGV0XCIsXCJzcHJpbmdcIixcIm1hZ2ljXCJdLFwic2VhcmNoXCI6XCJyYWJiaXQsZmFjZSxhbmltYWwsbmF0dXJlLHBldCxzcHJpbmcsbWFnaWNcIn0sXCJmbGFnLWFzXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEFTXCIsXCJ1bmlmaWVkXCI6XCIxRjFFNi0xRjFGOFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMzLFwic2hlZXRfeVwiOjMsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctYXNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxhcyxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJsZW1vblwiOntcIm5hbWVcIjpcIkxlbW9uXCIsXCJ1bmlmaWVkXCI6XCIxRjM0QlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjcsXCJzaGVldF95XCI6MTIsXCJzaG9ydF9uYW1lc1wiOltcImxlbW9uXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZnJ1aXRcIixcIm5hdHVyZVwiXSxcInNlYXJjaFwiOlwibGVtb24sZnJ1aXQsbmF0dXJlXCJ9LFwicHVycGxlX2hlYXJ0XCI6e1wibmFtZVwiOlwiUHVycGxlIEhlYXJ0XCIsXCJ1bmlmaWVkXCI6XCIxRjQ5Q1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIwLFwic2hlZXRfeVwiOjMsXCJzaG9ydF9uYW1lc1wiOltcInB1cnBsZV9oZWFydFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W1wiPDNcIl0sXCJrZXl3b3Jkc1wiOltcImxvdmVcIixcImxpa2VcIixcImFmZmVjdGlvblwiLFwidmFsZW50aW5lc1wiXSxcInNlYXJjaFwiOlwicHVycGxlLGhlYXJ0LGxvdmUsbGlrZSxhZmZlY3Rpb24sdmFsZW50aW5lcyw8M1wifSxcInNtaWxleVwiOntcIm5hbWVcIjpcIlNtaWxpbmcgRmFjZSB3aXRoIE9wZW4gTW91dGhcIixcInVuaWZpZWRcIjpcIjFGNjAzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjYsXCJzaGVldF95XCI6MTgsXCJzaG9ydF9uYW1lc1wiOltcInNtaWxleVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W1wiPSlcIixcIj0tKVwiXSxcImtleXdvcmRzXCI6W1wiZmFjZVwiLFwiaGFwcHlcIixcImpveVwiLFwiaGFoYVwiLFwiOkRcIl0sXCJzZWFyY2hcIjpcInNtaWxleSxzbWlsaW5nLGZhY2Usd2l0aCxvcGVuLG1vdXRoLGhhcHB5LGpveSxoYWhhLDpkLD0pLD0tKVwifSxcImRlc2t0b3BfY29tcHV0ZXJcIjp7XCJuYW1lXCI6XCJEZXNrdG9wIENvbXB1dGVyXCIsXCJ1bmlmaWVkXCI6XCIxRjVBNVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI1LFwic2hlZXRfeVwiOjMxLFwic2hvcnRfbmFtZXNcIjpbXCJkZXNrdG9wX2NvbXB1dGVyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widGVjaG5vbG9neVwiLFwiY29tcHV0aW5nXCIsXCJzY3JlZW5cIl0sXCJzZWFyY2hcIjpcImRlc2t0b3AsY29tcHV0ZXIsdGVjaG5vbG9neSxjb21wdXRpbmcsc2NyZWVuXCJ9LFwicmFjaW5nX2NhclwiOntcIm5hbWVcIjpcIlJhY2luZyBDYXJcIixcInVuaWZpZWRcIjpcIjFGM0NFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTAsXCJzaGVldF95XCI6NDAsXCJzaG9ydF9uYW1lc1wiOltcInJhY2luZ19jYXJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzcG9ydHNcIixcInJhY2VcIixcImZhc3RcIixcImZvcm11bGFcIixcImYxXCJdLFwic2VhcmNoXCI6XCJyYWNpbmcsY2FyLHNwb3J0cyxyYWNlLGZhc3QsZm9ybXVsYSxmMVwifSxcInZvbGxleWJhbGxcIjp7XCJuYW1lXCI6XCJWb2xsZXliYWxsXCIsXCJ1bmlmaWVkXCI6XCIxRjNEMFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjExLFwic2hlZXRfeVwiOjEsXCJzaG9ydF9uYW1lc1wiOltcInZvbGxleWJhbGxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzcG9ydHNcIixcImJhbGxzXCJdLFwic2VhcmNoXCI6XCJ2b2xsZXliYWxsLHNwb3J0cyxiYWxsc1wifSxcImJhbmFuYVwiOntcIm5hbWVcIjpcIkJhbmFuYVwiLFwidW5pZmllZFwiOlwiMUYzNENcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo3LFwic2hlZXRfeVwiOjEzLFwic2hvcnRfbmFtZXNcIjpbXCJiYW5hbmFcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmcnVpdFwiLFwiZm9vZFwiLFwibW9ua2V5XCJdLFwic2VhcmNoXCI6XCJiYW5hbmEsZnJ1aXQsZm9vZCxtb25rZXlcIn0sXCJiZWFyXCI6e1wibmFtZVwiOlwiQmVhciBGYWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjQzQlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEzLFwic2hlZXRfeVwiOjIzLFwic2hvcnRfbmFtZXNcIjpbXCJiZWFyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJuYXR1cmVcIixcIndpbGRcIl0sXCJzZWFyY2hcIjpcImJlYXIsZmFjZSxhbmltYWwsbmF0dXJlLHdpbGRcIn0sXCJzbWlsZVwiOntcIm5hbWVcIjpcIlNtaWxpbmcgRmFjZSB3aXRoIE9wZW4gTW91dGggYW5kIFNtaWxpbmcgRXllc1wiLFwidW5pZmllZFwiOlwiMUY2MDRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNixcInNoZWV0X3lcIjoxOSxcInNob3J0X25hbWVzXCI6W1wic21pbGVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltcIkM6XCIsXCJjOlwiLFwiOkRcIixcIjotRFwiXSxcImtleXdvcmRzXCI6W1wiZmFjZVwiLFwiaGFwcHlcIixcImpveVwiLFwiZnVubnlcIixcImhhaGFcIixcImxhdWdoXCIsXCJsaWtlXCIsXCI6RFwiXSxcInNlYXJjaFwiOlwic21pbGUsc21pbGluZyxmYWNlLHdpdGgsb3Blbixtb3V0aCxhbmQsZXllcyxoYXBweSxqb3ksZnVubnksaGFoYSxsYXVnaCxsaWtlLDpkLGM6LDotZFwifSxcImZsYWctYWRcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQURcIixcInVuaWZpZWRcIjpcIjFGMUU2LTFGMUU5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzIsXCJzaGVldF95XCI6MzQsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctYWRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxhZCxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJicm9rZW5faGVhcnRcIjp7XCJuYW1lXCI6XCJCcm9rZW4gSGVhcnRcIixcInVuaWZpZWRcIjpcIjFGNDk0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTksXCJzaGVldF95XCI6MzYsXCJzaG9ydF9uYW1lc1wiOltcImJyb2tlbl9oZWFydFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W1wiPC8zXCJdLFwia2V5d29yZHNcIjpbXCJzYWRcIixcInNvcnJ5XCIsXCJicmVha1wiXSxcInNlYXJjaFwiOlwiYnJva2VuLGhlYXJ0LHNhZCxzb3JyeSxicmVhayw8LzNcIn0sXCJzd2VhdF9zbWlsZVwiOntcIm5hbWVcIjpcIlNtaWxpbmcgRmFjZSB3aXRoIE9wZW4gTW91dGggYW5kIENvbGQgU3dlYXRcIixcInVuaWZpZWRcIjpcIjFGNjA1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjYsXCJzaGVldF95XCI6MjAsXCJzaG9ydF9uYW1lc1wiOltcInN3ZWF0X3NtaWxlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmFjZVwiLFwiaG90XCIsXCJoYXBweVwiLFwibGF1Z2hcIl0sXCJzZWFyY2hcIjpcInN3ZWF0LHNtaWxlLHNtaWxpbmcsZmFjZSx3aXRoLG9wZW4sbW91dGgsYW5kLGNvbGQsaG90LGhhcHB5LGxhdWdoXCJ9LFwicHJpbnRlclwiOntcIm5hbWVcIjpcIlByaW50ZXJcIixcInVuaWZpZWRcIjpcIjFGNUE4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjUsXCJzaGVldF95XCI6MzIsXCJzaG9ydF9uYW1lc1wiOltcInByaW50ZXJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJwYXBlclwiLFwiaW5rXCJdLFwic2VhcmNoXCI6XCJwcmludGVyLHBhcGVyLGlua1wifSxcInJ1Z2J5X2Zvb3RiYWxsXCI6e1wibmFtZVwiOlwiUnVnYnkgRm9vdGJhbGxcIixcInVuaWZpZWRcIjpcIjFGM0M5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTAsXCJzaGVldF95XCI6MjUsXCJzaG9ydF9uYW1lc1wiOltcInJ1Z2J5X2Zvb3RiYWxsXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic3BvcnRzXCIsXCJ0ZWFtXCJdLFwic2VhcmNoXCI6XCJydWdieSxmb290YmFsbCxzcG9ydHMsdGVhbVwifSxcImhlYXZ5X2hlYXJ0X2V4Y2xhbWF0aW9uX21hcmtfb3JuYW1lbnRcIjp7XCJuYW1lXCI6XCJIZWF2eSBIZWFydCBFeGNsYW1hdGlvbiBNYXJrIE9ybmFtZW50XCIsXCJ1bmlmaWVkXCI6XCIyNzYzXCIsXCJ2YXJpYXRpb25zXCI6W1wiMjc2My1GRTBGXCJdLFwic2hlZXRfeFwiOjQsXCJzaGVldF95XCI6OSxcInNob3J0X25hbWVzXCI6W1wiaGVhdnlfaGVhcnRfZXhjbGFtYXRpb25fbWFya19vcm5hbWVudFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImRlY29yYXRpb25cIixcImxvdmVcIl0sXCJzZWFyY2hcIjpcImhlYXZ5LGhlYXJ0LGV4Y2xhbWF0aW9uLG1hcmssb3JuYW1lbnQsZGVjb3JhdGlvbixsb3ZlXCJ9LFwiZmxhZy1hb1wiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBBT1wiLFwidW5pZmllZFwiOlwiMUYxRTYtMUYxRjRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMyxcInNoZWV0X3lcIjowLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWFvXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsYW8scmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwid2F0ZXJtZWxvblwiOntcIm5hbWVcIjpcIldhdGVybWVsb25cIixcInVuaWZpZWRcIjpcIjFGMzQ5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NyxcInNoZWV0X3lcIjoxMCxcInNob3J0X25hbWVzXCI6W1wid2F0ZXJtZWxvblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZydWl0XCIsXCJmb29kXCIsXCJwaWNuaWNcIixcInN1bW1lclwiXSxcInNlYXJjaFwiOlwid2F0ZXJtZWxvbixmcnVpdCxmb29kLHBpY25pYyxzdW1tZXJcIn0sXCJwYW5kYV9mYWNlXCI6e1wibmFtZVwiOlwiUGFuZGEgRmFjZVwiLFwidW5pZmllZFwiOlwiMUY0M0NcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMyxcInNoZWV0X3lcIjoyNCxcInNob3J0X25hbWVzXCI6W1wicGFuZGFfZmFjZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwibmF0dXJlXCJdLFwic2VhcmNoXCI6XCJwYW5kYSxmYWNlLGFuaW1hbCxuYXR1cmVcIn0sXCJwb2xpY2VfY2FyXCI6e1wibmFtZVwiOlwiUG9saWNlIENhclwiLFwidW5pZmllZFwiOlwiMUY2OTNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyOSxcInNoZWV0X3lcIjozMSxcInNob3J0X25hbWVzXCI6W1wicG9saWNlX2NhclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInZlaGljbGVcIixcImNhcnNcIixcInRyYW5zcG9ydGF0aW9uXCIsXCJsYXdcIixcImxlZ2FsXCIsXCJlbmZvcmNlbWVudFwiXSxcInNlYXJjaFwiOlwicG9saWNlLGNhcix2ZWhpY2xlLGNhcnMsdHJhbnNwb3J0YXRpb24sbGF3LGxlZ2FsLGVuZm9yY2VtZW50XCJ9LFwiYW1idWxhbmNlXCI6e1wibmFtZVwiOlwiQW1idWxhbmNlXCIsXCJ1bmlmaWVkXCI6XCIxRjY5MVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI5LFwic2hlZXRfeVwiOjI5LFwic2hvcnRfbmFtZXNcIjpbXCJhbWJ1bGFuY2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJoZWFsdGhcIixcIjkxMVwiLFwiaG9zcGl0YWxcIl0sXCJzZWFyY2hcIjpcImFtYnVsYW5jZSxoZWFsdGgsOTExLGhvc3BpdGFsXCJ9LFwiZ3JhcGVzXCI6e1wibmFtZVwiOlwiR3JhcGVzXCIsXCJ1bmlmaWVkXCI6XCIxRjM0N1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjcsXCJzaGVldF95XCI6OCxcInNob3J0X25hbWVzXCI6W1wiZ3JhcGVzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZnJ1aXRcIixcImZvb2RcIixcIndpbmVcIl0sXCJzZWFyY2hcIjpcImdyYXBlcyxmcnVpdCxmb29kLHdpbmVcIn0sXCJ0d29faGVhcnRzXCI6e1wibmFtZVwiOlwiVHdvIEhlYXJ0c1wiLFwidW5pZmllZFwiOlwiMUY0OTVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxOSxcInNoZWV0X3lcIjozNyxcInNob3J0X25hbWVzXCI6W1widHdvX2hlYXJ0c1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImxvdmVcIixcImxpa2VcIixcImFmZmVjdGlvblwiLFwidmFsZW50aW5lc1wiXSxcInNlYXJjaFwiOlwidHdvLGhlYXJ0cyxsb3ZlLGxpa2UsYWZmZWN0aW9uLHZhbGVudGluZXNcIn0sXCJmbGFnLWFpXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEFJXCIsXCJ1bmlmaWVkXCI6XCIxRjFFNi0xRjFFRVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMyLFwic2hlZXRfeVwiOjM4LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWFpXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsYWkscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwidGhyZWVfYnV0dG9uX21vdXNlXCI6e1wibmFtZVwiOlwiVGhyZWUgQnV0dG9uIE1vdXNlXCIsXCJ1bmlmaWVkXCI6XCIxRjVCMVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI1LFwic2hlZXRfeVwiOjMzLFwic2hvcnRfbmFtZXNcIjpbXCJ0aHJlZV9idXR0b25fbW91c2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJjbGlja1wiXSxcInNlYXJjaFwiOlwidGhyZWUsYnV0dG9uLG1vdXNlLGNsaWNrXCJ9LFwiOGJhbGxcIjp7XCJuYW1lXCI6XCJCaWxsaWFyZHNcIixcInVuaWZpZWRcIjpcIjFGM0IxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OSxcInNoZWV0X3lcIjozMixcInNob3J0X25hbWVzXCI6W1wiOGJhbGxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJwb29sXCIsXCJob2JieVwiLFwiZ2FtZVwiLFwibHVja1wiLFwibWFnaWNcIl0sXCJzZWFyY2hcIjpcIjhiYWxsLGJpbGxpYXJkcyxwb29sLGhvYmJ5LGdhbWUsbHVjayxtYWdpY1wifSxcImxhdWdoaW5nXCI6e1wibmFtZVwiOlwiU21pbGluZyBGYWNlIHdpdGggT3BlbiBNb3V0aCBhbmQgVGlnaHRseS1DbG9zZWQgRXllc1wiLFwidW5pZmllZFwiOlwiMUY2MDZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNixcInNoZWV0X3lcIjoyMSxcInNob3J0X25hbWVzXCI6W1wibGF1Z2hpbmdcIixcInNhdGlzZmllZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W1wiOj5cIixcIjotPlwiXSxcImtleXdvcmRzXCI6W1wiaGFwcHlcIixcImpveVwiLFwibG9sXCIsXCJzYXRpc2ZpZWRcIixcImhhaGFcIixcImZhY2VcIixcImdsYWRcIixcIlhEXCJdLFwic2VhcmNoXCI6XCJsYXVnaGluZyxzYXRpc2ZpZWQsc21pbGluZyxmYWNlLHdpdGgsb3Blbixtb3V0aCxhbmQsdGlnaHRseSxjbG9zZWQsZXllcyxoYXBweSxqb3ksbG9sLGhhaGEsZ2xhZCx4ZCw6Piw6LT5cIn0sXCJrb2FsYVwiOntcIm5hbWVcIjpcIktvYWxhXCIsXCJ1bmlmaWVkXCI6XCIxRjQyOFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEzLFwic2hlZXRfeVwiOjQsXCJzaG9ydF9uYW1lc1wiOltcImtvYWxhXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJuYXR1cmVcIl0sXCJzZWFyY2hcIjpcImtvYWxhLGFuaW1hbCxuYXR1cmVcIn0sXCJmbGFnLWFxXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEFRXCIsXCJ1bmlmaWVkXCI6XCIxRjFFNi0xRjFGNlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMzLFwic2hlZXRfeVwiOjEsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctYXFcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsYXEscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZmlyZV9lbmdpbmVcIjp7XCJuYW1lXCI6XCJGaXJlIEVuZ2luZVwiLFwidW5pZmllZFwiOlwiMUY2OTJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyOSxcInNoZWV0X3lcIjozMCxcInNob3J0X25hbWVzXCI6W1wiZmlyZV9lbmdpbmVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ0cmFuc3BvcnRhdGlvblwiLFwiY2Fyc1wiLFwidmVoaWNsZVwiXSxcInNlYXJjaFwiOlwiZmlyZSxlbmdpbmUsdHJhbnNwb3J0YXRpb24sY2Fycyx2ZWhpY2xlXCJ9LFwicmV2b2x2aW5nX2hlYXJ0c1wiOntcIm5hbWVcIjpcIlJldm9sdmluZyBIZWFydHNcIixcInVuaWZpZWRcIjpcIjFGNDlFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjAsXCJzaGVldF95XCI6NSxcInNob3J0X25hbWVzXCI6W1wicmV2b2x2aW5nX2hlYXJ0c1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImxvdmVcIixcImxpa2VcIixcImFmZmVjdGlvblwiLFwidmFsZW50aW5lc1wiXSxcInNlYXJjaFwiOlwicmV2b2x2aW5nLGhlYXJ0cyxsb3ZlLGxpa2UsYWZmZWN0aW9uLHZhbGVudGluZXNcIn0sXCJnb2xmXCI6e1wibmFtZVwiOlwiRmxhZyBpbiBIb2xlXCIsXCJ1bmlmaWVkXCI6XCIyNkYzXCIsXCJ2YXJpYXRpb25zXCI6W1wiMjZGMy1GRTBGXCJdLFwic2hlZXRfeFwiOjIsXCJzaGVldF95XCI6MzMsXCJzaG9ydF9uYW1lc1wiOltcImdvbGZcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzcG9ydHNcIixcImJ1c2luZXNzXCIsXCJmbGFnXCIsXCJob2xlXCIsXCJzdW1tZXJcIl0sXCJzZWFyY2hcIjpcImdvbGYsZmxhZyxpbixob2xlLHNwb3J0cyxidXNpbmVzcyxzdW1tZXJcIn0sXCJpbm5vY2VudFwiOntcIm5hbWVcIjpcIlNtaWxpbmcgRmFjZSB3aXRoIEhhbG9cIixcInVuaWZpZWRcIjpcIjFGNjA3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjYsXCJzaGVldF95XCI6MjIsXCJzaG9ydF9uYW1lc1wiOltcImlubm9jZW50XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmFjZVwiLFwiYW5nZWxcIixcImhlYXZlblwiLFwiaGFsb1wiXSxcInNlYXJjaFwiOlwiaW5ub2NlbnQsc21pbGluZyxmYWNlLHdpdGgsaGFsbyxhbmdlbCxoZWF2ZW5cIn0sXCJzdHJhd2JlcnJ5XCI6e1wibmFtZVwiOlwiU3RyYXdiZXJyeVwiLFwidW5pZmllZFwiOlwiMUYzNTNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo3LFwic2hlZXRfeVwiOjIwLFwic2hvcnRfbmFtZXNcIjpbXCJzdHJhd2JlcnJ5XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZnJ1aXRcIixcImZvb2RcIixcIm5hdHVyZVwiXSxcInNlYXJjaFwiOlwic3RyYXdiZXJyeSxmcnVpdCxmb29kLG5hdHVyZVwifSxcInRyYWNrYmFsbFwiOntcIm5hbWVcIjpcIlRyYWNrYmFsbFwiLFwidW5pZmllZFwiOlwiMUY1QjJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNSxcInNoZWV0X3lcIjozNCxcInNob3J0X25hbWVzXCI6W1widHJhY2tiYWxsXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widGVjaG5vbG9neVwiLFwidHJhY2twYWRcIl0sXCJzZWFyY2hcIjpcInRyYWNrYmFsbCx0ZWNobm9sb2d5LHRyYWNrcGFkXCJ9LFwidGlnZXJcIjp7XCJuYW1lXCI6XCJUaWdlciBGYWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjQyRlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEzLFwic2hlZXRfeVwiOjExLFwic2hvcnRfbmFtZXNcIjpbXCJ0aWdlclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwiY2F0XCIsXCJkYW5nZXJcIixcIndpbGRcIixcIm5hdHVyZVwiLFwicm9hclwiXSxcInNlYXJjaFwiOlwidGlnZXIsZmFjZSxhbmltYWwsY2F0LGRhbmdlcix3aWxkLG5hdHVyZSxyb2FyXCJ9LFwibGlvbl9mYWNlXCI6e1wibmFtZVwiOlwiTGlvbiBGYWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjk4MVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMyLFwic2hlZXRfeVwiOjE2LFwic2hvcnRfbmFtZXNcIjpbXCJsaW9uX2ZhY2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcIm5hdHVyZVwiXSxcInNlYXJjaFwiOlwibGlvbixmYWNlLGFuaW1hbCxuYXR1cmVcIn0sXCJmbGFnLWFnXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEFHXCIsXCJ1bmlmaWVkXCI6XCIxRjFFNi0xRjFFQ1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMyLFwic2hlZXRfeVwiOjM3LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWFnXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsYWcscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwibWluaWJ1c1wiOntcIm5hbWVcIjpcIk1pbmlidXNcIixcInVuaWZpZWRcIjpcIjFGNjkwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjksXCJzaGVldF95XCI6MjgsXCJzaG9ydF9uYW1lc1wiOltcIm1pbmlidXNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ2ZWhpY2xlXCIsXCJjYXJcIixcInRyYW5zcG9ydGF0aW9uXCJdLFwic2VhcmNoXCI6XCJtaW5pYnVzLHZlaGljbGUsY2FyLHRyYW5zcG9ydGF0aW9uXCJ9LFwibWVsb25cIjp7XCJuYW1lXCI6XCJNZWxvblwiLFwidW5pZmllZFwiOlwiMUYzNDhcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo3LFwic2hlZXRfeVwiOjksXCJzaG9ydF9uYW1lc1wiOltcIm1lbG9uXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZnJ1aXRcIixcIm5hdHVyZVwiLFwiZm9vZFwiXSxcInNlYXJjaFwiOlwibWVsb24sZnJ1aXQsbmF0dXJlLGZvb2RcIn0sXCJ3aW5rXCI6e1wibmFtZVwiOlwiV2lua2luZyBGYWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjYwOVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI2LFwic2hlZXRfeVwiOjI0LFwic2hvcnRfbmFtZXNcIjpbXCJ3aW5rXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXCI7KVwiLFwiOy0pXCJdLFwia2V5d29yZHNcIjpbXCJmYWNlXCIsXCJoYXBweVwiLFwibWlzY2hpZXZvdXNcIixcInNlY3JldFwiXSxcInNlYXJjaFwiOlwid2luayx3aW5raW5nLGZhY2UsaGFwcHksbWlzY2hpZXZvdXMsc2VjcmV0LDspLDstKVwifSxcImdvbGZlclwiOntcIm5hbWVcIjpcIkdvbGZlclwiLFwidW5pZmllZFwiOlwiMUYzQ0NcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMCxcInNoZWV0X3lcIjozOCxcInNob3J0X25hbWVzXCI6W1wiZ29sZmVyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic3BvcnRzXCIsXCJidXNpbmVzc1wiXSxcInNlYXJjaFwiOlwiZ29sZmVyLHNwb3J0cyxidXNpbmVzc1wifSxcImhlYXJ0YmVhdFwiOntcIm5hbWVcIjpcIkJlYXRpbmcgSGVhcnRcIixcInVuaWZpZWRcIjpcIjFGNDkzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTksXCJzaGVldF95XCI6MzUsXCJzaG9ydF9uYW1lc1wiOltcImhlYXJ0YmVhdFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImxvdmVcIixcImxpa2VcIixcImFmZmVjdGlvblwiLFwidmFsZW50aW5lc1wiLFwicGlua1wiXSxcInNlYXJjaFwiOlwiaGVhcnRiZWF0LGJlYXRpbmcsaGVhcnQsbG92ZSxsaWtlLGFmZmVjdGlvbix2YWxlbnRpbmVzLHBpbmtcIn0sXCJqb3lzdGlja1wiOntcIm5hbWVcIjpcIkpveXN0aWNrXCIsXCJ1bmlmaWVkXCI6XCIxRjU3OVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI1LFwic2hlZXRfeVwiOjcsXCJzaG9ydF9uYW1lc1wiOltcImpveXN0aWNrXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZ2FtZVwiLFwicGxheVwiXSxcInNlYXJjaFwiOlwiam95c3RpY2ssZ2FtZSxwbGF5XCJ9LFwiaGVhcnRwdWxzZVwiOntcIm5hbWVcIjpcIkdyb3dpbmcgSGVhcnRcIixcInVuaWZpZWRcIjpcIjFGNDk3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTksXCJzaGVldF95XCI6MzksXCJzaG9ydF9uYW1lc1wiOltcImhlYXJ0cHVsc2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJsaWtlXCIsXCJsb3ZlXCIsXCJhZmZlY3Rpb25cIixcInZhbGVudGluZXNcIixcInBpbmtcIl0sXCJzZWFyY2hcIjpcImhlYXJ0cHVsc2UsZ3Jvd2luZyxoZWFydCxsaWtlLGxvdmUsYWZmZWN0aW9uLHZhbGVudGluZXMscGlua1wifSxcImZsYWctYXJcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQVJcIixcInVuaWZpZWRcIjpcIjFGMUU2LTFGMUY3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzMsXCJzaGVldF95XCI6MixcInNob3J0X25hbWVzXCI6W1wiZmxhZy1hclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGFyLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcInRhYmxlX3Rlbm5pc19wYWRkbGVfYW5kX2JhbGxcIjp7XCJuYW1lXCI6XCJUYWJsZSBUZW5uaXMgUGFkZGxlIGFuZCBCYWxsXCIsXCJ1bmlmaWVkXCI6XCIxRjNEM1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjExLFwic2hlZXRfeVwiOjQsXCJzaG9ydF9uYW1lc1wiOltcInRhYmxlX3Rlbm5pc19wYWRkbGVfYW5kX2JhbGxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwidGFibGUsdGVubmlzLHBhZGRsZSxhbmQsYmFsbFwifSxcImNvd1wiOntcIm5hbWVcIjpcIkNvdyBGYWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjQyRVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEzLFwic2hlZXRfeVwiOjEwLFwic2hvcnRfbmFtZXNcIjpbXCJjb3dcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJiZWVmXCIsXCJveFwiLFwiYW5pbWFsXCIsXCJuYXR1cmVcIixcIm1vb1wiLFwibWlsa1wiXSxcInNlYXJjaFwiOlwiY293LGZhY2UsYmVlZixveCxhbmltYWwsbmF0dXJlLG1vbyxtaWxrXCJ9LFwiY2hlcnJpZXNcIjp7XCJuYW1lXCI6XCJDaGVycmllc1wiLFwidW5pZmllZFwiOlwiMUYzNTJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo3LFwic2hlZXRfeVwiOjE5LFwic2hvcnRfbmFtZXNcIjpbXCJjaGVycmllc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZvb2RcIixcImZydWl0XCJdLFwic2VhcmNoXCI6XCJjaGVycmllcyxmb29kLGZydWl0XCJ9LFwiY29tcHJlc3Npb25cIjp7XCJuYW1lXCI6XCJDb21wcmVzc2lvblwiLFwidW5pZmllZFwiOlwiMUY1RENcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNixcInNoZWV0X3lcIjoxLFwic2hvcnRfbmFtZXNcIjpbXCJjb21wcmVzc2lvblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRvb2xcIl0sXCJzZWFyY2hcIjpcImNvbXByZXNzaW9uLHRvb2xcIn0sXCJ0cnVja1wiOntcIm5hbWVcIjpcIkRlbGl2ZXJ5IFRydWNrXCIsXCJ1bmlmaWVkXCI6XCIxRjY5QVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI5LFwic2hlZXRfeVwiOjM4LFwic2hvcnRfbmFtZXNcIjpbXCJ0cnVja1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImNhcnNcIixcInRyYW5zcG9ydGF0aW9uXCJdLFwic2VhcmNoXCI6XCJ0cnVjayxkZWxpdmVyeSxjYXJzLHRyYW5zcG9ydGF0aW9uXCJ9LFwiYmx1c2hcIjp7XCJuYW1lXCI6XCJTbWlsaW5nIEZhY2Ugd2l0aCBTbWlsaW5nIEV5ZXNcIixcInVuaWZpZWRcIjpcIjFGNjBBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjYsXCJzaGVldF95XCI6MjUsXCJzaG9ydF9uYW1lc1wiOltcImJsdXNoXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXCI6KVwiXSxcImtleXdvcmRzXCI6W1wiZmFjZVwiLFwic21pbGVcIixcImhhcHB5XCIsXCJmbHVzaGVkXCIsXCJjcnVzaFwiLFwiZW1iYXJyYXNzZWRcIixcInNoeVwiLFwiam95XCJdLFwic2VhcmNoXCI6XCJibHVzaCxzbWlsaW5nLGZhY2Usd2l0aCxleWVzLHNtaWxlLGhhcHB5LGZsdXNoZWQsY3J1c2gsZW1iYXJyYXNzZWQsc2h5LGpveSw6KVwifSxcInNsaWdodGx5X3NtaWxpbmdfZmFjZVwiOntcIm5hbWVcIjpcIlNsaWdodGx5IFNtaWxpbmcgRmFjZVwiLFwidW5pZmllZFwiOlwiMUY2NDJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNyxcInNoZWV0X3lcIjo0MCxcInNob3J0X25hbWVzXCI6W1wic2xpZ2h0bHlfc21pbGluZ19mYWNlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXCI6KVwiLFwiKDpcIixcIjotKVwiXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcInNsaWdodGx5LHNtaWxpbmcsZmFjZSw6KSwoOiw6LSlcIn0sXCJwaWdcIjp7XCJuYW1lXCI6XCJQaWcgRmFjZVwiLFwidW5pZmllZFwiOlwiMUY0MzdcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMyxcInNoZWV0X3lcIjoxOSxcInNob3J0X25hbWVzXCI6W1wicGlnXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJvaW5rXCIsXCJuYXR1cmVcIl0sXCJzZWFyY2hcIjpcInBpZyxmYWNlLGFuaW1hbCxvaW5rLG5hdHVyZVwifSxcInNwYXJrbGluZ19oZWFydFwiOntcIm5hbWVcIjpcIlNwYXJrbGluZyBIZWFydFwiLFwidW5pZmllZFwiOlwiMUY0OTZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxOSxcInNoZWV0X3lcIjozOCxcInNob3J0X25hbWVzXCI6W1wic3BhcmtsaW5nX2hlYXJ0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibG92ZVwiLFwibGlrZVwiLFwiYWZmZWN0aW9uXCIsXCJ2YWxlbnRpbmVzXCJdLFwic2VhcmNoXCI6XCJzcGFya2xpbmcsaGVhcnQsbG92ZSxsaWtlLGFmZmVjdGlvbix2YWxlbnRpbmVzXCJ9LFwiYmFkbWludG9uX3JhY3F1ZXRfYW5kX3NodXR0bGVjb2NrXCI6e1wibmFtZVwiOlwiQmFkbWludG9uIFJhY3F1ZXQgYW5kIFNodXR0bGVjb2NrXCIsXCJ1bmlmaWVkXCI6XCIxRjNGOFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjExLFwic2hlZXRfeVwiOjM4LFwic2hvcnRfbmFtZXNcIjpbXCJiYWRtaW50b25fcmFjcXVldF9hbmRfc2h1dHRsZWNvY2tcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiYmFkbWludG9uLHJhY3F1ZXQsYW5kLHNodXR0bGVjb2NrXCJ9LFwicGVhY2hcIjp7XCJuYW1lXCI6XCJQZWFjaFwiLFwidW5pZmllZFwiOlwiMUYzNTFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo3LFwic2hlZXRfeVwiOjE4LFwic2hvcnRfbmFtZXNcIjpbXCJwZWFjaFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZydWl0XCIsXCJuYXR1cmVcIixcImZvb2RcIl0sXCJzZWFyY2hcIjpcInBlYWNoLGZydWl0LG5hdHVyZSxmb29kXCJ9LFwibWluaWRpc2NcIjp7XCJuYW1lXCI6XCJNaW5pZGlzY1wiLFwidW5pZmllZFwiOlwiMUY0QkRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMSxcInNoZWV0X3lcIjowLFwic2hvcnRfbmFtZXNcIjpbXCJtaW5pZGlzY1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRlY2hub2xvZ3lcIixcInJlY29yZFwiLFwiZGF0YVwiLFwiZGlza1wiLFwiOTBzXCJdLFwic2VhcmNoXCI6XCJtaW5pZGlzYyx0ZWNobm9sb2d5LHJlY29yZCxkYXRhLGRpc2ssOTBzXCJ9LFwiYXJ0aWN1bGF0ZWRfbG9ycnlcIjp7XCJuYW1lXCI6XCJBcnRpY3VsYXRlZCBMb3JyeVwiLFwidW5pZmllZFwiOlwiMUY2OUJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyOSxcInNoZWV0X3lcIjozOSxcInNob3J0X25hbWVzXCI6W1wiYXJ0aWN1bGF0ZWRfbG9ycnlcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ2ZWhpY2xlXCIsXCJjYXJzXCIsXCJ0cmFuc3BvcnRhdGlvblwiLFwiZXhwcmVzc1wiXSxcInNlYXJjaFwiOlwiYXJ0aWN1bGF0ZWQsbG9ycnksdmVoaWNsZSxjYXJzLHRyYW5zcG9ydGF0aW9uLGV4cHJlc3NcIn0sXCJmbGFnLWFtXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEFNXCIsXCJ1bmlmaWVkXCI6XCIxRjFFNi0xRjFGMlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMyLFwic2hlZXRfeVwiOjQwLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWFtXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsYW0scmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiaWNlX2hvY2tleV9zdGlja19hbmRfcHVja1wiOntcIm5hbWVcIjpcIkljZSBIb2NrZXkgU3RpY2sgYW5kIFB1Y2tcIixcInVuaWZpZWRcIjpcIjFGM0QyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTEsXCJzaGVldF95XCI6MyxcInNob3J0X25hbWVzXCI6W1wiaWNlX2hvY2tleV9zdGlja19hbmRfcHVja1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJpY2UsaG9ja2V5LHN0aWNrLGFuZCxwdWNrXCJ9LFwicGluZWFwcGxlXCI6e1wibmFtZVwiOlwiUGluZWFwcGxlXCIsXCJ1bmlmaWVkXCI6XCIxRjM0RFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjcsXCJzaGVldF95XCI6MTQsXCJzaG9ydF9uYW1lc1wiOltcInBpbmVhcHBsZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZydWl0XCIsXCJuYXR1cmVcIixcImZvb2RcIl0sXCJzZWFyY2hcIjpcInBpbmVhcHBsZSxmcnVpdCxuYXR1cmUsZm9vZFwifSxcImZsYWctYXdcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQVdcIixcInVuaWZpZWRcIjpcIjFGMUU2LTFGMUZDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzMsXCJzaGVldF95XCI6NixcInNob3J0X25hbWVzXCI6W1wiZmxhZy1hd1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGF3LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcInBpZ19ub3NlXCI6e1wibmFtZVwiOlwiUGlnIE5vc2VcIixcInVuaWZpZWRcIjpcIjFGNDNEXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTMsXCJzaGVldF95XCI6MjUsXCJzaG9ydF9uYW1lc1wiOltcInBpZ19ub3NlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJvaW5rXCJdLFwic2VhcmNoXCI6XCJwaWcsbm9zZSxhbmltYWwsb2lua1wifSxcImZsb3BweV9kaXNrXCI6e1wibmFtZVwiOlwiRmxvcHB5IERpc2tcIixcInVuaWZpZWRcIjpcIjFGNEJFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjEsXCJzaGVldF95XCI6MSxcInNob3J0X25hbWVzXCI6W1wiZmxvcHB5X2Rpc2tcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJvbGRzY2hvb2xcIixcInRlY2hub2xvZ3lcIixcInNhdmVcIixcIjkwc1wiLFwiODBzXCJdLFwic2VhcmNoXCI6XCJmbG9wcHksZGlzayxvbGRzY2hvb2wsdGVjaG5vbG9neSxzYXZlLDkwcyw4MHNcIn0sXCJ0cmFjdG9yXCI6e1wibmFtZVwiOlwiVHJhY3RvclwiLFwidW5pZmllZFwiOlwiMUY2OUNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyOSxcInNoZWV0X3lcIjo0MCxcInNob3J0X25hbWVzXCI6W1widHJhY3RvclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInZlaGljbGVcIixcImNhclwiLFwiZmFybWluZ1wiLFwiYWdyaWN1bHR1cmVcIl0sXCJzZWFyY2hcIjpcInRyYWN0b3IsdmVoaWNsZSxjYXIsZmFybWluZyxhZ3JpY3VsdHVyZVwifSxcInVwc2lkZV9kb3duX2ZhY2VcIjp7XCJuYW1lXCI6XCJVcHNpZGUtRG93biBGYWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjY0M1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI4LFwic2hlZXRfeVwiOjAsXCJzaG9ydF9uYW1lc1wiOltcInVwc2lkZV9kb3duX2ZhY2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwidXBzaWRlLGRvd24sZmFjZVwifSxcImN1cGlkXCI6e1wibmFtZVwiOlwiSGVhcnQgd2l0aCBBcnJvd1wiLFwidW5pZmllZFwiOlwiMUY0OThcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxOSxcInNoZWV0X3lcIjo0MCxcInNob3J0X25hbWVzXCI6W1wiY3VwaWRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJsb3ZlXCIsXCJsaWtlXCIsXCJoZWFydFwiLFwiYWZmZWN0aW9uXCIsXCJ2YWxlbnRpbmVzXCJdLFwic2VhcmNoXCI6XCJjdXBpZCxoZWFydCx3aXRoLGFycm93LGxvdmUsbGlrZSxhZmZlY3Rpb24sdmFsZW50aW5lc1wifSxcImNkXCI6e1wibmFtZVwiOlwiT3B0aWNhbCBEaXNjXCIsXCJ1bmlmaWVkXCI6XCIxRjRCRlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIxLFwic2hlZXRfeVwiOjIsXCJzaG9ydF9uYW1lc1wiOltcImNkXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widGVjaG5vbG9neVwiLFwiZHZkXCIsXCJkaXNrXCIsXCJkaXNjXCIsXCI5MHNcIl0sXCJzZWFyY2hcIjpcImNkLG9wdGljYWwsZGlzYyx0ZWNobm9sb2d5LGR2ZCxkaXNrLDkwc1wifSxcImdpZnRfaGVhcnRcIjp7XCJuYW1lXCI6XCJIZWFydCB3aXRoIFJpYmJvblwiLFwidW5pZmllZFwiOlwiMUY0OURcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMCxcInNoZWV0X3lcIjo0LFwic2hvcnRfbmFtZXNcIjpbXCJnaWZ0X2hlYXJ0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibG92ZVwiLFwidmFsZW50aW5lc1wiXSxcInNlYXJjaFwiOlwiZ2lmdCxoZWFydCx3aXRoLHJpYmJvbixsb3ZlLHZhbGVudGluZXNcIn0sXCJmbGFnLWF1XCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEFVXCIsXCJ1bmlmaWVkXCI6XCIxRjFFNi0xRjFGQVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMzLFwic2hlZXRfeVwiOjUsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctYXVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxhdSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJmaWVsZF9ob2NrZXlfc3RpY2tfYW5kX2JhbGxcIjp7XCJuYW1lXCI6XCJGaWVsZCBIb2NrZXkgU3RpY2sgYW5kIEJhbGxcIixcInVuaWZpZWRcIjpcIjFGM0QxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTEsXCJzaGVldF95XCI6MixcInNob3J0X25hbWVzXCI6W1wiZmllbGRfaG9ja2V5X3N0aWNrX2FuZF9iYWxsXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZpZWxkLGhvY2tleSxzdGljayxhbmQsYmFsbFwifSxcInRvbWF0b1wiOntcIm5hbWVcIjpcIlRvbWF0b1wiLFwidW5pZmllZFwiOlwiMUYzNDVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo3LFwic2hlZXRfeVwiOjYsXCJzaG9ydF9uYW1lc1wiOltcInRvbWF0b1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZydWl0XCIsXCJ2ZWdldGFibGVcIixcIm5hdHVyZVwiLFwiZm9vZFwiXSxcInNlYXJjaFwiOlwidG9tYXRvLGZydWl0LHZlZ2V0YWJsZSxuYXR1cmUsZm9vZFwifSxcInJhY2luZ19tb3RvcmN5Y2xlXCI6e1wibmFtZVwiOlwiUmFjaW5nIE1vdG9yY3ljbGVcIixcInVuaWZpZWRcIjpcIjFGM0NEXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTAsXCJzaGVldF95XCI6MzksXCJzaG9ydF9uYW1lc1wiOltcInJhY2luZ19tb3RvcmN5Y2xlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicmFjZVwiLFwic3BvcnRzXCIsXCJmYXN0XCJdLFwic2VhcmNoXCI6XCJyYWNpbmcsbW90b3JjeWNsZSxyYWNlLHNwb3J0cyxmYXN0XCJ9LFwicmVsYXhlZFwiOntcIm5hbWVcIjpcIldoaXRlIFNtaWxpbmcgRmFjZVwiLFwidW5pZmllZFwiOlwiMjYzQVwiLFwidmFyaWF0aW9uc1wiOltcIjI2M0EtRkUwRlwiXSxcInNoZWV0X3hcIjoxLFwic2hlZXRfeVwiOjI1LFwic2hvcnRfbmFtZXNcIjpbXCJyZWxheGVkXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmFjZVwiLFwiYmx1c2hcIixcIm1hc3NhZ2VcIixcImhhcHBpbmVzc1wiXSxcInNlYXJjaFwiOlwicmVsYXhlZCx3aGl0ZSxzbWlsaW5nLGZhY2UsYmx1c2gsbWFzc2FnZSxoYXBwaW5lc3NcIn0sXCJmcm9nXCI6e1wibmFtZVwiOlwiRnJvZyBGYWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjQzOFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEzLFwic2hlZXRfeVwiOjIwLFwic2hvcnRfbmFtZXNcIjpbXCJmcm9nXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJuYXR1cmVcIixcImNyb2FrXCJdLFwic2VhcmNoXCI6XCJmcm9nLGZhY2UsYW5pbWFsLG5hdHVyZSxjcm9ha1wifSxcImNyaWNrZXRfYmF0X2FuZF9iYWxsXCI6e1wibmFtZVwiOlwiQ3JpY2tldCBCYXQgYW5kIEJhbGxcIixcInVuaWZpZWRcIjpcIjFGM0NGXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTEsXCJzaGVldF95XCI6MCxcInNob3J0X25hbWVzXCI6W1wiY3JpY2tldF9iYXRfYW5kX2JhbGxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiY3JpY2tldCxiYXQsYW5kLGJhbGxcIn0sXCJkdmRcIjp7XCJuYW1lXCI6XCJEdmRcIixcInVuaWZpZWRcIjpcIjFGNEMwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjEsXCJzaGVldF95XCI6MyxcInNob3J0X25hbWVzXCI6W1wiZHZkXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiY2RcIixcImRpc2tcIixcImRpc2NcIl0sXCJzZWFyY2hcIjpcImR2ZCxjZCxkaXNrLGRpc2NcIn0sXCJvY3RvcHVzXCI6e1wibmFtZVwiOlwiT2N0b3B1c1wiLFwidW5pZmllZFwiOlwiMUY0MTlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMixcInNoZWV0X3lcIjozMCxcInNob3J0X25hbWVzXCI6W1wib2N0b3B1c1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwiY3JlYXR1cmVcIixcIm9jZWFuXCIsXCJzZWFcIixcIm5hdHVyZVwiLFwiYmVhY2hcIl0sXCJzZWFyY2hcIjpcIm9jdG9wdXMsYW5pbWFsLGNyZWF0dXJlLG9jZWFuLHNlYSxuYXR1cmUsYmVhY2hcIn0sXCJiaWtlXCI6e1wibmFtZVwiOlwiQmljeWNsZVwiLFwidW5pZmllZFwiOlwiMUY2QjJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMCxcInNoZWV0X3lcIjoyNixcInNob3J0X25hbWVzXCI6W1wiYmlrZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNwb3J0c1wiLFwiYmljeWNsZVwiLFwiZXhlcmNpc2VcIixcImhpcHN0ZXJcIl0sXCJzZWFyY2hcIjpcImJpa2UsYmljeWNsZSxzcG9ydHMsZXhlcmNpc2UsaGlwc3RlclwifSxcImhlYXJ0X2RlY29yYXRpb25cIjp7XCJuYW1lXCI6XCJIZWFydCBEZWNvcmF0aW9uXCIsXCJ1bmlmaWVkXCI6XCIxRjQ5RlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIwLFwic2hlZXRfeVwiOjYsXCJzaG9ydF9uYW1lc1wiOltcImhlYXJ0X2RlY29yYXRpb25cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJwdXJwbGUtc3F1YXJlXCIsXCJsb3ZlXCIsXCJsaWtlXCJdLFwic2VhcmNoXCI6XCJoZWFydCxkZWNvcmF0aW9uLHB1cnBsZS1zcXVhcmUsbG92ZSxsaWtlXCJ9LFwieXVtXCI6e1wibmFtZVwiOlwiRmFjZSBTYXZvdXJpbmcgRGVsaWNpb3VzIEZvb2RcIixcInVuaWZpZWRcIjpcIjFGNjBCXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjYsXCJzaGVldF95XCI6MjYsXCJzaG9ydF9uYW1lc1wiOltcInl1bVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImhhcHB5XCIsXCJqb3lcIixcInRvbmd1ZVwiLFwic21pbGVcIixcImZhY2VcIixcInNpbGx5XCIsXCJ5dW1teVwiXSxcInNlYXJjaFwiOlwieXVtLGZhY2Usc2F2b3VyaW5nLGRlbGljaW91cyxmb29kLGhhcHB5LGpveSx0b25ndWUsc21pbGUsc2lsbHkseXVtbXlcIn0sXCJlZ2dwbGFudFwiOntcIm5hbWVcIjpcIkF1YmVyZ2luZVwiLFwidW5pZmllZFwiOlwiMUYzNDZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo3LFwic2hlZXRfeVwiOjcsXCJzaG9ydF9uYW1lc1wiOltcImVnZ3BsYW50XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widmVnZXRhYmxlXCIsXCJuYXR1cmVcIixcImZvb2RcIixcImF1YmVyZ2luZVwiXSxcInNlYXJjaFwiOlwiZWdncGxhbnQsYXViZXJnaW5lLHZlZ2V0YWJsZSxuYXR1cmUsZm9vZFwifSxcImZsYWctYXRcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQVRcIixcInVuaWZpZWRcIjpcIjFGMUU2LTFGMUY5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzMsXCJzaGVldF95XCI6NCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1hdFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGF0LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcInJvdGF0aW5nX2xpZ2h0XCI6e1wibmFtZVwiOlwiUG9saWNlIENhcnMgUmV2b2x2aW5nIExpZ2h0XCIsXCJ1bmlmaWVkXCI6XCIxRjZBOFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMwLFwic2hlZXRfeVwiOjE2LFwic2hvcnRfbmFtZXNcIjpbXCJyb3RhdGluZ19saWdodFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBvbGljZVwiLFwiYW1idWxhbmNlXCIsXCI5MTFcIixcImVtZXJnZW5jeVwiLFwiYWxlcnRcIixcImVycm9yXCIsXCJwaW5nZWRcIixcImxhd1wiLFwibGVnYWxcIl0sXCJzZWFyY2hcIjpcInJvdGF0aW5nLGxpZ2h0LHBvbGljZSxjYXJzLHJldm9sdmluZyxhbWJ1bGFuY2UsOTExLGVtZXJnZW5jeSxhbGVydCxlcnJvcixwaW5nZWQsbGF3LGxlZ2FsXCJ9LFwibW9ua2V5X2ZhY2VcIjp7XCJuYW1lXCI6XCJNb25rZXkgRmFjZVwiLFwidW5pZmllZFwiOlwiMUY0MzVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMyxcInNoZWV0X3lcIjoxNyxcInNob3J0X25hbWVzXCI6W1wibW9ua2V5X2ZhY2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltcIjpvKVwiXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJuYXR1cmVcIixcImNpcmN1c1wiXSxcInNlYXJjaFwiOlwibW9ua2V5LGZhY2UsYW5pbWFsLG5hdHVyZSxjaXJjdXMsOm8pXCJ9LFwic2tpXCI6e1wibmFtZVwiOlwiU2tpIGFuZCBTa2kgQm9vdFwiLFwidW5pZmllZFwiOlwiMUYzQkZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMCxcInNoZWV0X3lcIjo1LFwic2hvcnRfbmFtZXNcIjpbXCJza2lcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzcG9ydHNcIixcIndpbnRlclwiLFwiY29sZFwiLFwic25vd1wiXSxcInNlYXJjaFwiOlwic2tpLGFuZCxib290LHNwb3J0cyx3aW50ZXIsY29sZCxzbm93XCJ9LFwiaG90X3BlcHBlclwiOntcIm5hbWVcIjpcIkhvdCBQZXBwZXJcIixcInVuaWZpZWRcIjpcIjFGMzM2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NixcInNoZWV0X3lcIjozMixcInNob3J0X25hbWVzXCI6W1wiaG90X3BlcHBlclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZvb2RcIixcInNwaWN5XCJdLFwic2VhcmNoXCI6XCJob3QscGVwcGVyLGZvb2Qsc3BpY3lcIn0sXCJwZWFjZV9zeW1ib2xcIjp7XCJuYW1lXCI6XCJQZWFjZSBTeW1ib2xcIixcInVuaWZpZWRcIjpcIjI2MkVcIixcInZhcmlhdGlvbnNcIjpbXCIyNjJFLUZFMEZcIl0sXCJzaGVldF94XCI6MSxcInNoZWV0X3lcIjoyMSxcInNob3J0X25hbWVzXCI6W1wicGVhY2Vfc3ltYm9sXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiaGlwcGllXCJdLFwic2VhcmNoXCI6XCJwZWFjZSxzeW1ib2wsaGlwcGllXCJ9LFwiZmxhZy1helwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBBWlwiLFwidW5pZmllZFwiOlwiMUYxRTYtMUYxRkZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMyxcInNoZWV0X3lcIjo4LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWF6XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsYXoscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwicmVsaWV2ZWRcIjp7XCJuYW1lXCI6XCJSZWxpZXZlZCBGYWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjYwQ1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI2LFwic2hlZXRfeVwiOjI3LFwic2hvcnRfbmFtZXNcIjpbXCJyZWxpZXZlZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZhY2VcIixcInJlbGF4ZWRcIixcInBoZXdcIixcIm1hc3NhZ2VcIixcImhhcHBpbmVzc1wiXSxcInNlYXJjaFwiOlwicmVsaWV2ZWQsZmFjZSxyZWxheGVkLHBoZXcsbWFzc2FnZSxoYXBwaW5lc3NcIn0sXCJ2aHNcIjp7XCJuYW1lXCI6XCJWaWRlb2Nhc3NldHRlXCIsXCJ1bmlmaWVkXCI6XCIxRjRGQ1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIyLFwic2hlZXRfeVwiOjIyLFwic2hvcnRfbmFtZXNcIjpbXCJ2aHNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJyZWNvcmRcIixcInZpZGVvXCIsXCJvbGRzY2hvb2xcIixcIjkwc1wiLFwiODBzXCJdLFwic2VhcmNoXCI6XCJ2aHMsdmlkZW9jYXNzZXR0ZSxyZWNvcmQsdmlkZW8sb2xkc2Nob29sLDkwcyw4MHNcIn0sXCJvbmNvbWluZ19wb2xpY2VfY2FyXCI6e1wibmFtZVwiOlwiT25jb21pbmcgUG9saWNlIENhclwiLFwidW5pZmllZFwiOlwiMUY2OTRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyOSxcInNoZWV0X3lcIjozMixcInNob3J0X25hbWVzXCI6W1wib25jb21pbmdfcG9saWNlX2NhclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInZlaGljbGVcIixcImxhd1wiLFwibGVnYWxcIixcImVuZm9yY2VtZW50XCIsXCI5MTFcIl0sXCJzZWFyY2hcIjpcIm9uY29taW5nLHBvbGljZSxjYXIsdmVoaWNsZSxsYXcsbGVnYWwsZW5mb3JjZW1lbnQsOTExXCJ9LFwiY29yblwiOntcIm5hbWVcIjpcIkVhciBvZiBNYWl6ZVwiLFwidW5pZmllZFwiOlwiMUYzM0RcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo2LFwic2hlZXRfeVwiOjM5LFwic2hvcnRfbmFtZXNcIjpbXCJjb3JuXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZm9vZFwiLFwidmVnZXRhYmxlXCIsXCJwbGFudFwiXSxcInNlYXJjaFwiOlwiY29ybixlYXIsb2YsbWFpemUsZm9vZCx2ZWdldGFibGUscGxhbnRcIn0sXCJsYXRpbl9jcm9zc1wiOntcIm5hbWVcIjpcIkxhdGluIENyb3NzXCIsXCJ1bmlmaWVkXCI6XCIyNzFEXCIsXCJ2YXJpYXRpb25zXCI6W1wiMjcxRC1GRTBGXCJdLFwic2hlZXRfeFwiOjMsXCJzaGVldF95XCI6MzcsXCJzaG9ydF9uYW1lc1wiOltcImxhdGluX2Nyb3NzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiY2hyaXN0aWFuaXR5XCJdLFwic2VhcmNoXCI6XCJsYXRpbixjcm9zcyxjaHJpc3RpYW5pdHlcIn0sXCJjYW1lcmFcIjp7XCJuYW1lXCI6XCJDYW1lcmFcIixcInVuaWZpZWRcIjpcIjFGNEY3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjIsXCJzaGVldF95XCI6MTcsXCJzaG9ydF9uYW1lc1wiOltcImNhbWVyYVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImdhZGdldHNcIixcInBob3RvZ3JhcGh5XCJdLFwic2VhcmNoXCI6XCJjYW1lcmEsZ2FkZ2V0cyxwaG90b2dyYXBoeVwifSxcInNlZV9ub19ldmlsXCI6e1wibmFtZVwiOlwiU2VlLU5vLUV2aWwgTW9ua2V5XCIsXCJ1bmlmaWVkXCI6XCIxRjY0OFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI4LFwic2hlZXRfeVwiOjIwLFwic2hvcnRfbmFtZXNcIjpbXCJzZWVfbm9fZXZpbFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm1vbmtleVwiLFwiYW5pbWFsXCIsXCJuYXR1cmVcIixcImhhaGFcIl0sXCJzZWFyY2hcIjpcInNlZSxubyxldmlsLG1vbmtleSxhbmltYWwsbmF0dXJlLGhhaGFcIn0sXCJoZWFydF9leWVzXCI6e1wibmFtZVwiOlwiU21pbGluZyBGYWNlIHdpdGggSGVhcnQtU2hhcGVkIEV5ZXNcIixcInVuaWZpZWRcIjpcIjFGNjBEXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjYsXCJzaGVldF95XCI6MjgsXCJzaG9ydF9uYW1lc1wiOltcImhlYXJ0X2V5ZXNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmYWNlXCIsXCJsb3ZlXCIsXCJsaWtlXCIsXCJhZmZlY3Rpb25cIixcInZhbGVudGluZXNcIixcImluZmF0dWF0aW9uXCIsXCJjcnVzaFwiXSxcInNlYXJjaFwiOlwiaGVhcnQsZXllcyxzbWlsaW5nLGZhY2Usd2l0aCxzaGFwZWQsbG92ZSxsaWtlLGFmZmVjdGlvbix2YWxlbnRpbmVzLGluZmF0dWF0aW9uLGNydXNoXCJ9LFwiZmxhZy1ic1wiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBCU1wiLFwidW5pZmllZFwiOlwiMUYxRTctMUYxRjhcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMyxcInNoZWV0X3lcIjoyNCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1ic1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGJzLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcInNraWVyXCI6e1wibmFtZVwiOlwiU2tpZXJcIixcInVuaWZpZWRcIjpcIjI2RjdcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyLFwic2hlZXRfeVwiOjM2LFwic2hvcnRfbmFtZXNcIjpbXCJza2llclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNwb3J0c1wiLFwid2ludGVyXCIsXCJzbm93XCJdLFwic2VhcmNoXCI6XCJza2llcixzcG9ydHMsd2ludGVyLHNub3dcIn0sXCJvbmNvbWluZ19idXNcIjp7XCJuYW1lXCI6XCJPbmNvbWluZyBCdXNcIixcInVuaWZpZWRcIjpcIjFGNjhEXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjksXCJzaGVldF95XCI6MjUsXCJzaG9ydF9uYW1lc1wiOltcIm9uY29taW5nX2J1c1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInZlaGljbGVcIixcInRyYW5zcG9ydGF0aW9uXCJdLFwic2VhcmNoXCI6XCJvbmNvbWluZyxidXMsdmVoaWNsZSx0cmFuc3BvcnRhdGlvblwifSxcInNub3dib2FyZGVyXCI6e1wibmFtZVwiOlwiU25vd2JvYXJkZXJcIixcInVuaWZpZWRcIjpcIjFGM0MyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTAsXCJzaGVldF95XCI6OCxcInNob3J0X25hbWVzXCI6W1wic25vd2JvYXJkZXJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzcG9ydHNcIixcIndpbnRlclwiXSxcInNlYXJjaFwiOlwic25vd2JvYXJkZXIsc3BvcnRzLHdpbnRlclwifSxcInN3ZWV0X3BvdGF0b1wiOntcIm5hbWVcIjpcIlJvYXN0ZWQgU3dlZXQgUG90YXRvXCIsXCJ1bmlmaWVkXCI6XCIxRjM2MFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjcsXCJzaGVldF95XCI6MzMsXCJzaG9ydF9uYW1lc1wiOltcInN3ZWV0X3BvdGF0b1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZvb2RcIixcIm5hdHVyZVwiXSxcInNlYXJjaFwiOlwic3dlZXQscG90YXRvLHJvYXN0ZWQsZm9vZCxuYXR1cmVcIn0sXCJoZWFyX25vX2V2aWxcIjp7XCJuYW1lXCI6XCJIZWFyLU5vLUV2aWwgTW9ua2V5XCIsXCJ1bmlmaWVkXCI6XCIxRjY0OVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI4LFwic2hlZXRfeVwiOjIxLFwic2hvcnRfbmFtZXNcIjpbXCJoZWFyX25vX2V2aWxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcIm1vbmtleVwiLFwibmF0dXJlXCJdLFwic2VhcmNoXCI6XCJoZWFyLG5vLGV2aWwsbW9ua2V5LGFuaW1hbCxuYXR1cmVcIn0sXCJmbGFnLWJoXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEJIXCIsXCJ1bmlmaWVkXCI6XCIxRjFFNy0xRjFFRFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMzLFwic2hlZXRfeVwiOjE1LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWJoXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsYmgscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwic3Rhcl9hbmRfY3Jlc2NlbnRcIjp7XCJuYW1lXCI6XCJTdGFyIGFuZCBDcmVzY2VudFwiLFwidW5pZmllZFwiOlwiMjYyQVwiLFwidmFyaWF0aW9uc1wiOltcIjI2MkEtRkUwRlwiXSxcInNoZWV0X3hcIjoxLFwic2hlZXRfeVwiOjIwLFwic2hvcnRfbmFtZXNcIjpbXCJzdGFyX2FuZF9jcmVzY2VudFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImlzbGFtXCJdLFwic2VhcmNoXCI6XCJzdGFyLGFuZCxjcmVzY2VudCxpc2xhbVwifSxcImtpc3NpbmdfaGVhcnRcIjp7XCJuYW1lXCI6XCJGYWNlIFRocm93aW5nIGEgS2lzc1wiLFwidW5pZmllZFwiOlwiMUY2MThcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNixcInNoZWV0X3lcIjozOSxcInNob3J0X25hbWVzXCI6W1wia2lzc2luZ19oZWFydFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZhY2VcIixcImxvdmVcIixcImxpa2VcIixcImFmZmVjdGlvblwiLFwidmFsZW50aW5lc1wiLFwiaW5mYXR1YXRpb25cIl0sXCJzZWFyY2hcIjpcImtpc3NpbmcsaGVhcnQsZmFjZSx0aHJvd2luZyxhLGtpc3MsbG92ZSxsaWtlLGFmZmVjdGlvbix2YWxlbnRpbmVzLGluZmF0dWF0aW9uXCJ9LFwiY2FtZXJhX3dpdGhfZmxhc2hcIjp7XCJuYW1lXCI6XCJDYW1lcmEgd2l0aCBGbGFzaFwiLFwidW5pZmllZFwiOlwiMUY0RjhcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMixcInNoZWV0X3lcIjoxOCxcInNob3J0X25hbWVzXCI6W1wiY2FtZXJhX3dpdGhfZmxhc2hcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJwaG90b2dyYXBoeVwiLFwiZ2FkZ2V0c1wiXSxcInNlYXJjaFwiOlwiY2FtZXJhLHdpdGgsZmxhc2gscGhvdG9ncmFwaHksZ2FkZ2V0c1wifSxcImljZV9za2F0ZVwiOntcIm5hbWVcIjpcIkljZSBTa2F0ZVwiLFwidW5pZmllZFwiOlwiMjZGOFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIsXCJzaGVldF95XCI6MzcsXCJzaG9ydF9uYW1lc1wiOltcImljZV9za2F0ZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNwb3J0c1wiXSxcInNlYXJjaFwiOlwiaWNlLHNrYXRlLHNwb3J0c1wifSxcIm9uY29taW5nX2F1dG9tb2JpbGVcIjp7XCJuYW1lXCI6XCJPbmNvbWluZyBBdXRvbW9iaWxlXCIsXCJ1bmlmaWVkXCI6XCIxRjY5OFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI5LFwic2hlZXRfeVwiOjM2LFwic2hvcnRfbmFtZXNcIjpbXCJvbmNvbWluZ19hdXRvbW9iaWxlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiY2FyXCIsXCJ2ZWhpY2xlXCIsXCJ0cmFuc3BvcnRhdGlvblwiXSxcInNlYXJjaFwiOlwib25jb21pbmcsYXV0b21vYmlsZSxjYXIsdmVoaWNsZSx0cmFuc3BvcnRhdGlvblwifSxcInNwZWFrX25vX2V2aWxcIjp7XCJuYW1lXCI6XCJTcGVhay1Oby1FdmlsIE1vbmtleVwiLFwidW5pZmllZFwiOlwiMUY2NEFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyOCxcInNoZWV0X3lcIjoyMixcInNob3J0X25hbWVzXCI6W1wic3BlYWtfbm9fZXZpbFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm1vbmtleVwiLFwiYW5pbWFsXCIsXCJuYXR1cmVcIixcIm9tZ1wiXSxcInNlYXJjaFwiOlwic3BlYWssbm8sZXZpbCxtb25rZXksYW5pbWFsLG5hdHVyZSxvbWdcIn0sXCJob25leV9wb3RcIjp7XCJuYW1lXCI6XCJIb25leSBQb3RcIixcInVuaWZpZWRcIjpcIjFGMzZGXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OCxcInNoZWV0X3lcIjo3LFwic2hvcnRfbmFtZXNcIjpbXCJob25leV9wb3RcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJiZWVzXCIsXCJzd2VldFwiLFwia2l0Y2hlblwiXSxcInNlYXJjaFwiOlwiaG9uZXkscG90LGJlZXMsc3dlZXQsa2l0Y2hlblwifSxcImtpc3NpbmdcIjp7XCJuYW1lXCI6XCJLaXNzaW5nIEZhY2VcIixcInVuaWZpZWRcIjpcIjFGNjE3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjYsXCJzaGVldF95XCI6MzgsXCJzaG9ydF9uYW1lc1wiOltcImtpc3NpbmdcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJsb3ZlXCIsXCJsaWtlXCIsXCJmYWNlXCIsXCIzXCIsXCJ2YWxlbnRpbmVzXCIsXCJpbmZhdHVhdGlvblwiXSxcInNlYXJjaFwiOlwia2lzc2luZyxmYWNlLGxvdmUsbGlrZSwzLHZhbGVudGluZXMsaW5mYXR1YXRpb25cIn0sXCJ2aWRlb19jYW1lcmFcIjp7XCJuYW1lXCI6XCJWaWRlbyBDYW1lcmFcIixcInVuaWZpZWRcIjpcIjFGNEY5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjIsXCJzaGVldF95XCI6MTksXCJzaG9ydF9uYW1lc1wiOltcInZpZGVvX2NhbWVyYVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZpbG1cIixcInJlY29yZFwiXSxcInNlYXJjaFwiOlwidmlkZW8sY2FtZXJhLGZpbG0scmVjb3JkXCJ9LFwib21fc3ltYm9sXCI6e1wibmFtZVwiOlwiT20gU3ltYm9sXCIsXCJ1bmlmaWVkXCI6XCIxRjU0OVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI0LFwic2hlZXRfeVwiOjUsXCJzaG9ydF9uYW1lc1wiOltcIm9tX3N5bWJvbFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImhpbmR1aXNtXCIsXCJidWRkaGlzbVwiLFwic2lraGlzbVwiLFwiamFpbmlzbVwiXSxcInNlYXJjaFwiOlwib20sc3ltYm9sLGhpbmR1aXNtLGJ1ZGRoaXNtLHNpa2hpc20samFpbmlzbVwifSxcImZsYWctYmRcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQkRcIixcInVuaWZpZWRcIjpcIjFGMUU3LTFGMUU5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzMsXCJzaGVldF95XCI6MTEsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctYmRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxiZCxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJtb25rZXlcIjp7XCJuYW1lXCI6XCJNb25rZXlcIixcInVuaWZpZWRcIjpcIjFGNDEyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTIsXCJzaGVldF95XCI6MjMsXCJzaG9ydF9uYW1lc1wiOltcIm1vbmtleVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwibmF0dXJlXCIsXCJiYW5hbmFcIixcImNpcmN1c1wiXSxcInNlYXJjaFwiOlwibW9ua2V5LGFuaW1hbCxuYXR1cmUsYmFuYW5hLGNpcmN1c1wifSxcIm1vdmllX2NhbWVyYVwiOntcIm5hbWVcIjpcIk1vdmllIENhbWVyYVwiLFwidW5pZmllZFwiOlwiMUYzQTVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo5LFwic2hlZXRfeVwiOjIwLFwic2hvcnRfbmFtZXNcIjpbXCJtb3ZpZV9jYW1lcmFcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmaWxtXCIsXCJyZWNvcmRcIl0sXCJzZWFyY2hcIjpcIm1vdmllLGNhbWVyYSxmaWxtLHJlY29yZFwifSxcIm9uY29taW5nX3RheGlcIjp7XCJuYW1lXCI6XCJPbmNvbWluZyBUYXhpXCIsXCJ1bmlmaWVkXCI6XCIxRjY5NlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI5LFwic2hlZXRfeVwiOjM0LFwic2hvcnRfbmFtZXNcIjpbXCJvbmNvbWluZ190YXhpXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widmVoaWNsZVwiLFwiY2Fyc1wiLFwidWJlclwiXSxcInNlYXJjaFwiOlwib25jb21pbmcsdGF4aSx2ZWhpY2xlLGNhcnMsdWJlclwifSxcImZsYWctYmJcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQkJcIixcInVuaWZpZWRcIjpcIjFGMUU3LTFGMUU3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzMsXCJzaGVldF95XCI6MTAsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctYmJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxiYixyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJraXNzaW5nX3NtaWxpbmdfZXllc1wiOntcIm5hbWVcIjpcIktpc3NpbmcgRmFjZSB3aXRoIFNtaWxpbmcgRXllc1wiLFwidW5pZmllZFwiOlwiMUY2MTlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNixcInNoZWV0X3lcIjo0MCxcInNob3J0X25hbWVzXCI6W1wia2lzc2luZ19zbWlsaW5nX2V5ZXNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmYWNlXCIsXCJhZmZlY3Rpb25cIixcInZhbGVudGluZXNcIixcImluZmF0dWF0aW9uXCJdLFwic2VhcmNoXCI6XCJraXNzaW5nLHNtaWxpbmcsZXllcyxmYWNlLHdpdGgsYWZmZWN0aW9uLHZhbGVudGluZXMsaW5mYXR1YXRpb25cIn0sXCJicmVhZFwiOntcIm5hbWVcIjpcIkJyZWFkXCIsXCJ1bmlmaWVkXCI6XCIxRjM1RVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjcsXCJzaGVldF95XCI6MzEsXCJzaG9ydF9uYW1lc1wiOltcImJyZWFkXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZm9vZFwiLFwid2hlYXRcIixcImJyZWFrZmFzdFwiLFwidG9hc3RcIl0sXCJzZWFyY2hcIjpcImJyZWFkLGZvb2Qsd2hlYXQsYnJlYWtmYXN0LHRvYXN0XCJ9LFwiYm93X2FuZF9hcnJvd1wiOntcIm5hbWVcIjpcIkJvdyBhbmQgQXJyb3dcIixcInVuaWZpZWRcIjpcIjFGM0Y5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTEsXCJzaGVldF95XCI6MzksXCJzaG9ydF9uYW1lc1wiOltcImJvd19hbmRfYXJyb3dcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzcG9ydHNcIl0sXCJzZWFyY2hcIjpcImJvdyxhbmQsYXJyb3csc3BvcnRzXCJ9LFwid2hlZWxfb2ZfZGhhcm1hXCI6e1wibmFtZVwiOlwiV2hlZWwgb2YgRGhhcm1hXCIsXCJ1bmlmaWVkXCI6XCIyNjM4XCIsXCJ2YXJpYXRpb25zXCI6W1wiMjYzOC1GRTBGXCJdLFwic2hlZXRfeFwiOjEsXCJzaGVldF95XCI6MjMsXCJzaG9ydF9uYW1lc1wiOltcIndoZWVsX29mX2RoYXJtYVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImhpbmR1aXNtXCIsXCJidWRkaGlzbVwiLFwic2lraGlzbVwiLFwiamFpbmlzbVwiXSxcInNlYXJjaFwiOlwid2hlZWwsb2YsZGhhcm1hLGhpbmR1aXNtLGJ1ZGRoaXNtLHNpa2hpc20samFpbmlzbVwifSxcImFlcmlhbF90cmFtd2F5XCI6e1wibmFtZVwiOlwiQWVyaWFsIFRyYW13YXlcIixcInVuaWZpZWRcIjpcIjFGNkExXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzAsXCJzaGVldF95XCI6NCxcInNob3J0X25hbWVzXCI6W1wiYWVyaWFsX3RyYW13YXlcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ0cmFuc3BvcnRhdGlvblwiLFwidmVoaWNsZVwiLFwic2tpXCJdLFwic2VhcmNoXCI6XCJhZXJpYWwsdHJhbXdheSx0cmFuc3BvcnRhdGlvbix2ZWhpY2xlLHNraVwifSxcImNoZWVzZV93ZWRnZVwiOntcIm5hbWVcIjpcIkNoZWVzZSBXZWRnZVwiLFwidW5pZmllZFwiOlwiMUY5QzBcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMixcInNoZWV0X3lcIjoyMCxcInNob3J0X25hbWVzXCI6W1wiY2hlZXNlX3dlZGdlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZm9vZFwiLFwiY2hhZGRlclwiXSxcInNlYXJjaFwiOlwiY2hlZXNlLHdlZGdlLGZvb2QsY2hhZGRlclwifSxcImZpbG1fcHJvamVjdG9yXCI6e1wibmFtZVwiOlwiRmlsbSBQcm9qZWN0b3JcIixcInVuaWZpZWRcIjpcIjFGNEZEXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjIsXCJzaGVldF95XCI6MjMsXCJzaG9ydF9uYW1lc1wiOltcImZpbG1fcHJvamVjdG9yXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widmlkZW9cIixcInRhcGVcIixcInJlY29yZFwiLFwibW92aWVcIl0sXCJzZWFyY2hcIjpcImZpbG0scHJvamVjdG9yLHZpZGVvLHRhcGUscmVjb3JkLG1vdmllXCJ9LFwiZmlzaGluZ19wb2xlX2FuZF9maXNoXCI6e1wibmFtZVwiOlwiRmlzaGluZyBQb2xlIGFuZCBGaXNoXCIsXCJ1bmlmaWVkXCI6XCIxRjNBM1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjksXCJzaGVldF95XCI6MTgsXCJzaG9ydF9uYW1lc1wiOltcImZpc2hpbmdfcG9sZV9hbmRfZmlzaFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZvb2RcIixcImhvYmJ5XCIsXCJzdW1tZXJcIl0sXCJzZWFyY2hcIjpcImZpc2hpbmcscG9sZSxhbmQsZmlzaCxmb29kLGhvYmJ5LHN1bW1lclwifSxcImtpc3NpbmdfY2xvc2VkX2V5ZXNcIjp7XCJuYW1lXCI6XCJLaXNzaW5nIEZhY2Ugd2l0aCBDbG9zZWQgRXllc1wiLFwidW5pZmllZFwiOlwiMUY2MUFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNyxcInNoZWV0X3lcIjowLFwic2hvcnRfbmFtZXNcIjpbXCJraXNzaW5nX2Nsb3NlZF9leWVzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmFjZVwiLFwibG92ZVwiLFwibGlrZVwiLFwiYWZmZWN0aW9uXCIsXCJ2YWxlbnRpbmVzXCIsXCJpbmZhdHVhdGlvblwiXSxcInNlYXJjaFwiOlwia2lzc2luZyxjbG9zZWQsZXllcyxmYWNlLHdpdGgsbG92ZSxsaWtlLGFmZmVjdGlvbix2YWxlbnRpbmVzLGluZmF0dWF0aW9uXCJ9LFwic3Rhcl9vZl9kYXZpZFwiOntcIm5hbWVcIjpcIlN0YXIgb2YgRGF2aWRcIixcInVuaWZpZWRcIjpcIjI3MjFcIixcInZhcmlhdGlvbnNcIjpbXCIyNzIxLUZFMEZcIl0sXCJzaGVldF94XCI6MyxcInNoZWV0X3lcIjozOCxcInNob3J0X25hbWVzXCI6W1wic3Rhcl9vZl9kYXZpZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImp1ZGFpc21cIl0sXCJzZWFyY2hcIjpcInN0YXIsb2YsZGF2aWQsanVkYWlzbVwifSxcImNoaWNrZW5cIjp7XCJuYW1lXCI6XCJDaGlja2VuXCIsXCJ1bmlmaWVkXCI6XCIxRjQxNFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEyLFwic2hlZXRfeVwiOjI1LFwic2hvcnRfbmFtZXNcIjpbXCJjaGlja2VuXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJjbHVja1wiLFwibmF0dXJlXCIsXCJiaXJkXCJdLFwic2VhcmNoXCI6XCJjaGlja2VuLGFuaW1hbCxjbHVjayxuYXR1cmUsYmlyZFwifSxcImZsYWctYnlcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQllcIixcInVuaWZpZWRcIjpcIjFGMUU3LTFGMUZFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzMsXCJzaGVldF95XCI6MjgsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctYnlcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxieSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJzaXhfcG9pbnRlZF9zdGFyXCI6e1wibmFtZVwiOlwiU2l4IFBvaW50ZWQgU3RhciB3aXRoIE1pZGRsZSBEb3RcIixcInVuaWZpZWRcIjpcIjFGNTJGXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjMsXCJzaGVldF95XCI6MzEsXCJzaG9ydF9uYW1lc1wiOltcInNpeF9wb2ludGVkX3N0YXJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJwdXJwbGUtc3F1YXJlXCIsXCJyZWxpZ2lvblwiLFwiamV3aXNoXCIsXCJoZXhhZ3JhbVwiXSxcInNlYXJjaFwiOlwic2l4LHBvaW50ZWQsc3Rhcix3aXRoLG1pZGRsZSxkb3QscHVycGxlLXNxdWFyZSxyZWxpZ2lvbixqZXdpc2gsaGV4YWdyYW1cIn0sXCJwZW5ndWluXCI6e1wibmFtZVwiOlwiUGVuZ3VpblwiLFwidW5pZmllZFwiOlwiMUY0MjdcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMyxcInNoZWV0X3lcIjozLFwic2hvcnRfbmFtZXNcIjpbXCJwZW5ndWluXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJuYXR1cmVcIl0sXCJzZWFyY2hcIjpcInBlbmd1aW4sYW5pbWFsLG5hdHVyZVwifSxcIm1vdW50YWluX2NhYmxld2F5XCI6e1wibmFtZVwiOlwiTW91bnRhaW4gQ2FibGV3YXlcIixcInVuaWZpZWRcIjpcIjFGNkEwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzAsXCJzaGVldF95XCI6MyxcInNob3J0X25hbWVzXCI6W1wibW91bnRhaW5fY2FibGV3YXlcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ0cmFuc3BvcnRhdGlvblwiLFwidmVoaWNsZVwiLFwic2tpXCJdLFwic2VhcmNoXCI6XCJtb3VudGFpbixjYWJsZXdheSx0cmFuc3BvcnRhdGlvbix2ZWhpY2xlLHNraVwifSxcInN0dWNrX291dF90b25ndWVfd2lua2luZ19leWVcIjp7XCJuYW1lXCI6XCJGYWNlIHdpdGggU3R1Y2stb3V0IFRvbmd1ZSBhbmQgV2lua2luZyBFeWVcIixcInVuaWZpZWRcIjpcIjFGNjFDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjcsXCJzaGVldF95XCI6MixcInNob3J0X25hbWVzXCI6W1wic3R1Y2tfb3V0X3Rvbmd1ZV93aW5raW5nX2V5ZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W1wiO3BcIixcIjstcFwiLFwiO2JcIixcIjstYlwiLFwiO1BcIixcIjstUFwiXSxcImtleXdvcmRzXCI6W1wiZmFjZVwiLFwicHJhbmtcIixcImNoaWxkaXNoXCIsXCJwbGF5ZnVsXCIsXCJtaXNjaGlldm91c1wiLFwic21pbGVcIl0sXCJzZWFyY2hcIjpcInN0dWNrLG91dCx0b25ndWUsd2lua2luZyxleWUsZmFjZSx3aXRoLGFuZCxwcmFuayxjaGlsZGlzaCxwbGF5ZnVsLG1pc2NoaWV2b3VzLHNtaWxlLDtwLDstcCw7Yiw7LWJcIn0sXCJmbGFnLWJlXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEJFXCIsXCJ1bmlmaWVkXCI6XCIxRjFFNy0xRjFFQVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMzLFwic2hlZXRfeVwiOjEyLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWJlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsYmUscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZmlsbV9mcmFtZXNcIjp7XCJuYW1lXCI6XCJGaWxtIEZyYW1lc1wiLFwidW5pZmllZFwiOlwiMUYzOUVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo5LFwic2hlZXRfeVwiOjEzLFwic2hvcnRfbmFtZXNcIjpbXCJmaWxtX2ZyYW1lc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm1vdmllXCJdLFwic2VhcmNoXCI6XCJmaWxtLGZyYW1lcyxtb3ZpZVwifSxcInBvdWx0cnlfbGVnXCI6e1wibmFtZVwiOlwiUG91bHRyeSBMZWdcIixcInVuaWZpZWRcIjpcIjFGMzU3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NyxcInNoZWV0X3lcIjoyNCxcInNob3J0X25hbWVzXCI6W1wicG91bHRyeV9sZWdcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmb29kXCIsXCJtZWF0XCIsXCJkcnVtc3RpY2tcIixcImJpcmRcIixcImNoaWNrZW5cIixcInR1cmtleVwiXSxcInNlYXJjaFwiOlwicG91bHRyeSxsZWcsZm9vZCxtZWF0LGRydW1zdGljayxiaXJkLGNoaWNrZW4sdHVya2V5XCJ9LFwicm93Ym9hdFwiOntcIm5hbWVcIjpcIlJvd2JvYXRcIixcInVuaWZpZWRcIjpcIjFGNkEzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzAsXCJzaGVldF95XCI6NixcInNob3J0X25hbWVzXCI6W1wicm93Ym9hdFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUY2QTMtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjZBMy0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmNmEzLTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjMwLFwic2hlZXRfeVwiOjcsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY2QTMtMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjZBMy0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmNmEzLTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjMwLFwic2hlZXRfeVwiOjgsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY2QTMtMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIxRjZBMy0xRjNGRFwiLFwiaW1hZ2VcIjpcIjFmNmEzLTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjMwLFwic2hlZXRfeVwiOjksXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY2QTMtMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIxRjZBMy0xRjNGRVwiLFwiaW1hZ2VcIjpcIjFmNmEzLTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjMwLFwic2hlZXRfeVwiOjEwLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNkEzLTFGM0ZGXCI6e1widW5pZmllZFwiOlwiMUY2QTMtMUYzRkZcIixcImltYWdlXCI6XCIxZjZhMy0xZjNmZi5wbmdcIixcInNoZWV0X3hcIjozMCxcInNoZWV0X3lcIjoxMSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX19LFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNwb3J0c1wiLFwiaG9iYnlcIixcIndhdGVyXCIsXCJzaGlwXCJdLFwic2VhcmNoXCI6XCJyb3dib2F0LHNwb3J0cyxob2JieSx3YXRlcixzaGlwXCJ9LFwibWVub3JhaF93aXRoX25pbmVfYnJhbmNoZXNcIjp7XCJuYW1lXCI6XCJNZW5vcmFoIHdpdGggTmluZSBCcmFuY2hlc1wiLFwidW5pZmllZFwiOlwiMUY1NEVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNCxcInNoZWV0X3lcIjoxMCxcInNob3J0X25hbWVzXCI6W1wibWVub3JhaF93aXRoX25pbmVfYnJhbmNoZXNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJoYW51a2thaFwiLFwiY2FuZGxlc1wiLFwiamV3aXNoXCJdLFwic2VhcmNoXCI6XCJtZW5vcmFoLHdpdGgsbmluZSxicmFuY2hlcyxoYW51a2thaCxjYW5kbGVzLGpld2lzaFwifSxcInN0dWNrX291dF90b25ndWVfY2xvc2VkX2V5ZXNcIjp7XCJuYW1lXCI6XCJGYWNlIHdpdGggU3R1Y2stb3V0IFRvbmd1ZSBhbmQgVGlnaHRseS1DbG9zZWQgRXllc1wiLFwidW5pZmllZFwiOlwiMUY2MURcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNyxcInNoZWV0X3lcIjozLFwic2hvcnRfbmFtZXNcIjpbXCJzdHVja19vdXRfdG9uZ3VlX2Nsb3NlZF9leWVzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmFjZVwiLFwicHJhbmtcIixcInBsYXlmdWxcIixcIm1pc2NoaWV2b3VzXCIsXCJzbWlsZVwiXSxcInNlYXJjaFwiOlwic3R1Y2ssb3V0LHRvbmd1ZSxjbG9zZWQsZXllcyxmYWNlLHdpdGgsYW5kLHRpZ2h0bHkscHJhbmsscGxheWZ1bCxtaXNjaGlldm91cyxzbWlsZVwifSxcImZsYWctYnpcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQlpcIixcInVuaWZpZWRcIjpcIjFGMUU3LTFGMUZGXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzMsXCJzaGVldF95XCI6MjksXCJzaG9ydF9uYW1lc1wiOltcImZsYWctYnpcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxieixyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJzd2ltbWVyXCI6e1wibmFtZVwiOlwiU3dpbW1lclwiLFwidW5pZmllZFwiOlwiMUYzQ0FcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMCxcInNoZWV0X3lcIjoyNixcInNob3J0X25hbWVzXCI6W1wic3dpbW1lclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUYzQ0EtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjNDQS0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmM2NhLTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjEwLFwic2hlZXRfeVwiOjI3LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGM0NBLTFGM0ZDXCI6e1widW5pZmllZFwiOlwiMUYzQ0EtMUYzRkNcIixcImltYWdlXCI6XCIxZjNjYS0xZjNmYy5wbmdcIixcInNoZWV0X3hcIjoxMCxcInNoZWV0X3lcIjoyOCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjNDQS0xRjNGRFwiOntcInVuaWZpZWRcIjpcIjFGM0NBLTFGM0ZEXCIsXCJpbWFnZVwiOlwiMWYzY2EtMWYzZmQucG5nXCIsXCJzaGVldF94XCI6MTAsXCJzaGVldF95XCI6MjksXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUYzQ0EtMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIxRjNDQS0xRjNGRVwiLFwiaW1hZ2VcIjpcIjFmM2NhLTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjEwLFwic2hlZXRfeVwiOjMwLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGM0NBLTFGM0ZGXCI6e1widW5pZmllZFwiOlwiMUYzQ0EtMUYzRkZcIixcImltYWdlXCI6XCIxZjNjYS0xZjNmZi5wbmdcIixcInNoZWV0X3hcIjoxMCxcInNoZWV0X3lcIjozMSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX19LFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNwb3J0c1wiLFwiZXhlcmNpc2VcIixcImh1bWFuXCIsXCJhdGhsZXRlXCIsXCJ3YXRlclwiLFwic3VtbWVyXCJdLFwic2VhcmNoXCI6XCJzd2ltbWVyLHNwb3J0cyxleGVyY2lzZSxodW1hbixhdGhsZXRlLHdhdGVyLHN1bW1lclwifSxcImJpcmRcIjp7XCJuYW1lXCI6XCJCaXJkXCIsXCJ1bmlmaWVkXCI6XCIxRjQyNlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEzLFwic2hlZXRfeVwiOjIsXCJzaG9ydF9uYW1lc1wiOltcImJpcmRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcIm5hdHVyZVwiLFwiZmx5XCIsXCJ0d2VldFwiLFwic3ByaW5nXCJdLFwic2VhcmNoXCI6XCJiaXJkLGFuaW1hbCxuYXR1cmUsZmx5LHR3ZWV0LHNwcmluZ1wifSxcInRlbGVwaG9uZV9yZWNlaXZlclwiOntcIm5hbWVcIjpcIlRlbGVwaG9uZSBSZWNlaXZlclwiLFwidW5pZmllZFwiOlwiMUY0REVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMSxcInNoZWV0X3lcIjozMyxcInNob3J0X25hbWVzXCI6W1widGVsZXBob25lX3JlY2VpdmVyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widGVjaG5vbG9neVwiLFwiY29tbXVuaWNhdGlvblwiLFwiZGlhbFwiXSxcInNlYXJjaFwiOlwidGVsZXBob25lLHJlY2VpdmVyLHRlY2hub2xvZ3ksY29tbXVuaWNhdGlvbixkaWFsXCJ9LFwibWVhdF9vbl9ib25lXCI6e1wibmFtZVwiOlwiTWVhdCBvbiBCb25lXCIsXCJ1bmlmaWVkXCI6XCIxRjM1NlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjcsXCJzaGVldF95XCI6MjMsXCJzaG9ydF9uYW1lc1wiOltcIm1lYXRfb25fYm9uZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImdvb2RcIixcImZvb2RcIixcImRydW1zdGlja1wiXSxcInNlYXJjaFwiOlwibWVhdCxvbixib25lLGdvb2QsZm9vZCxkcnVtc3RpY2tcIn0sXCJzdXNwZW5zaW9uX3JhaWx3YXlcIjp7XCJuYW1lXCI6XCJTdXNwZW5zaW9uIFJhaWx3YXlcIixcInVuaWZpZWRcIjpcIjFGNjlGXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzAsXCJzaGVldF95XCI6MixcInNob3J0X25hbWVzXCI6W1wic3VzcGVuc2lvbl9yYWlsd2F5XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widmVoaWNsZVwiLFwidHJhbnNwb3J0YXRpb25cIl0sXCJzZWFyY2hcIjpcInN1c3BlbnNpb24scmFpbHdheSx2ZWhpY2xlLHRyYW5zcG9ydGF0aW9uXCJ9LFwiZmxhZy1ialwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBCSlwiLFwidW5pZmllZFwiOlwiMUYxRTctMUYxRUZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMyxcInNoZWV0X3lcIjoxNyxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1ialwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGJqLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcInlpbl95YW5nXCI6e1wibmFtZVwiOlwiWWluIFlhbmdcIixcInVuaWZpZWRcIjpcIjI2MkZcIixcInZhcmlhdGlvbnNcIjpbXCIyNjJGLUZFMEZcIl0sXCJzaGVldF94XCI6MSxcInNoZWV0X3lcIjoyMixcInNob3J0X25hbWVzXCI6W1wieWluX3lhbmdcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJiYWxhbmNlXCJdLFwic2VhcmNoXCI6XCJ5aW4seWFuZyxiYWxhbmNlXCJ9LFwic3R1Y2tfb3V0X3Rvbmd1ZVwiOntcIm5hbWVcIjpcIkZhY2Ugd2l0aCBTdHVjay1vdXQgVG9uZ3VlXCIsXCJ1bmlmaWVkXCI6XCIxRjYxQlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI3LFwic2hlZXRfeVwiOjEsXCJzaG9ydF9uYW1lc1wiOltcInN0dWNrX291dF90b25ndWVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltcIjpwXCIsXCI6LXBcIixcIjpQXCIsXCI6LVBcIixcIjpiXCIsXCI6LWJcIl0sXCJrZXl3b3Jkc1wiOltcImZhY2VcIixcInByYW5rXCIsXCJjaGlsZGlzaFwiLFwicGxheWZ1bFwiLFwibWlzY2hpZXZvdXNcIixcInNtaWxlXCJdLFwic2VhcmNoXCI6XCJzdHVjayxvdXQsdG9uZ3VlLGZhY2Usd2l0aCxwcmFuayxjaGlsZGlzaCxwbGF5ZnVsLG1pc2NoaWV2b3VzLHNtaWxlLDpwLDotcCw6Yiw6LWJcIn0sXCJwaG9uZVwiOntcIm5hbWVcIjpcIkJsYWNrIFRlbGVwaG9uZVwiLFwidW5pZmllZFwiOlwiMjYwRVwiLFwidmFyaWF0aW9uc1wiOltcIjI2MEUtRkUwRlwiXSxcInNoZWV0X3hcIjoxLFwic2hlZXRfeVwiOjUsXCJzaG9ydF9uYW1lc1wiOltcInBob25lXCIsXCJ0ZWxlcGhvbmVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ0ZWNobm9sb2d5XCIsXCJjb21tdW5pY2F0aW9uXCIsXCJkaWFsXCIsXCJ0ZWxlcGhvbmVcIl0sXCJzZWFyY2hcIjpcInBob25lLHRlbGVwaG9uZSxibGFjayx0ZWNobm9sb2d5LGNvbW11bmljYXRpb24sZGlhbFwifSxcInJhaWx3YXlfY2FyXCI6e1wibmFtZVwiOlwiUmFpbHdheSBDYXJcIixcInVuaWZpZWRcIjpcIjFGNjgzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjksXCJzaGVldF95XCI6MTUsXCJzaG9ydF9uYW1lc1wiOltcInJhaWx3YXlfY2FyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widHJhbnNwb3J0YXRpb25cIixcInZlaGljbGVcIl0sXCJzZWFyY2hcIjpcInJhaWx3YXksY2FyLHRyYW5zcG9ydGF0aW9uLHZlaGljbGVcIn0sXCJmcmllZF9zaHJpbXBcIjp7XCJuYW1lXCI6XCJGcmllZCBTaHJpbXBcIixcInVuaWZpZWRcIjpcIjFGMzY0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NyxcInNoZWV0X3lcIjozNyxcInNob3J0X25hbWVzXCI6W1wiZnJpZWRfc2hyaW1wXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZm9vZFwiLFwiYW5pbWFsXCIsXCJhcHBldGl6ZXJcIixcInN1bW1lclwiXSxcInNlYXJjaFwiOlwiZnJpZWQsc2hyaW1wLGZvb2QsYW5pbWFsLGFwcGV0aXplcixzdW1tZXJcIn0sXCJzdXJmZXJcIjp7XCJuYW1lXCI6XCJTdXJmZXJcIixcInVuaWZpZWRcIjpcIjFGM0M0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTAsXCJzaGVldF95XCI6MTUsXCJzaG9ydF9uYW1lc1wiOltcInN1cmZlclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUYzQzQtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjNDNC0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmM2M0LTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjEwLFwic2hlZXRfeVwiOjE2LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGM0M0LTFGM0ZDXCI6e1widW5pZmllZFwiOlwiMUYzQzQtMUYzRkNcIixcImltYWdlXCI6XCIxZjNjNC0xZjNmYy5wbmdcIixcInNoZWV0X3hcIjoxMCxcInNoZWV0X3lcIjoxNyxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjNDNC0xRjNGRFwiOntcInVuaWZpZWRcIjpcIjFGM0M0LTFGM0ZEXCIsXCJpbWFnZVwiOlwiMWYzYzQtMWYzZmQucG5nXCIsXCJzaGVldF94XCI6MTAsXCJzaGVldF95XCI6MTgsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUYzQzQtMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIxRjNDNC0xRjNGRVwiLFwiaW1hZ2VcIjpcIjFmM2M0LTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjEwLFwic2hlZXRfeVwiOjE5LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGM0M0LTFGM0ZGXCI6e1widW5pZmllZFwiOlwiMUYzQzQtMUYzRkZcIixcImltYWdlXCI6XCIxZjNjNC0xZjNmZi5wbmdcIixcInNoZWV0X3hcIjoxMCxcInNoZWV0X3lcIjoyMCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX19LFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNwb3J0c1wiLFwib2NlYW5cIixcInNlYVwiLFwic3VtbWVyXCIsXCJiZWFjaFwiXSxcInNlYXJjaFwiOlwic3VyZmVyLHNwb3J0cyxvY2VhbixzZWEsc3VtbWVyLGJlYWNoXCJ9LFwiYmFieV9jaGlja1wiOntcIm5hbWVcIjpcIkJhYnkgQ2hpY2tcIixcInVuaWZpZWRcIjpcIjFGNDI0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTMsXCJzaGVldF95XCI6MCxcInNob3J0X25hbWVzXCI6W1wiYmFieV9jaGlja1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwiY2hpY2tlblwiLFwiYmlyZFwiXSxcInNlYXJjaFwiOlwiYmFieSxjaGljayxhbmltYWwsY2hpY2tlbixiaXJkXCJ9LFwiZWdnXCI6e1wibmFtZVwiOlwiQ29va2luZ1wiLFwidW5pZmllZFwiOlwiMUYzNzNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo4LFwic2hlZXRfeVwiOjExLFwic2hvcnRfbmFtZXNcIjpbXCJlZ2dcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmb29kXCIsXCJicmVha2Zhc3RcIixcImtpdGNoZW5cIl0sXCJzZWFyY2hcIjpcImVnZyxjb29raW5nLGZvb2QsYnJlYWtmYXN0LGtpdGNoZW5cIn0sXCJmbGFnLWJtXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEJNXCIsXCJ1bmlmaWVkXCI6XCIxRjFFNy0xRjFGMlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMzLFwic2hlZXRfeVwiOjE5LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWJtXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsYm0scmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiaGF0Y2hpbmdfY2hpY2tcIjp7XCJuYW1lXCI6XCJIYXRjaGluZyBDaGlja1wiLFwidW5pZmllZFwiOlwiMUY0MjNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMixcInNoZWV0X3lcIjo0MCxcInNob3J0X25hbWVzXCI6W1wiaGF0Y2hpbmdfY2hpY2tcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcImNoaWNrZW5cIixcImVnZ1wiLFwiYm9yblwiLFwiYmFieVwiLFwiYmlyZFwiXSxcInNlYXJjaFwiOlwiaGF0Y2hpbmcsY2hpY2ssYW5pbWFsLGNoaWNrZW4sZWdnLGJvcm4sYmFieSxiaXJkXCJ9LFwidHJhaW5cIjp7XCJuYW1lXCI6XCJUcmFtIENhclwiLFwidW5pZmllZFwiOlwiMUY2OEJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyOSxcInNoZWV0X3lcIjoyMyxcInNob3J0X25hbWVzXCI6W1widHJhaW5cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ0cmFuc3BvcnRhdGlvblwiLFwidmVoaWNsZVwiLFwiY2FycmlhZ2VcIixcInB1YmxpY1wiLFwidHJhdmVsXCJdLFwic2VhcmNoXCI6XCJ0cmFpbix0cmFtLGNhcix0cmFuc3BvcnRhdGlvbix2ZWhpY2xlLGNhcnJpYWdlLHB1YmxpYyx0cmF2ZWxcIn0sXCJwYWdlclwiOntcIm5hbWVcIjpcIlBhZ2VyXCIsXCJ1bmlmaWVkXCI6XCIxRjRERlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIxLFwic2hlZXRfeVwiOjM0LFwic2hvcnRfbmFtZXNcIjpbXCJwYWdlclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJiY2FsbFwiLFwib2xkc2Nob29sXCIsXCI5MHNcIl0sXCJzZWFyY2hcIjpcInBhZ2VyLGJiY2FsbCxvbGRzY2hvb2wsOTBzXCJ9LFwiYmF0aFwiOntcIm5hbWVcIjpcIkJhdGhcIixcInVuaWZpZWRcIjpcIjFGNkMwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzEsXCJzaGVldF95XCI6MTQsXCJzaG9ydF9uYW1lc1wiOltcImJhdGhcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcInNraW5fdmFyaWF0aW9uc1wiOntcIjFGNkMwLTFGM0ZCXCI6e1widW5pZmllZFwiOlwiMUY2QzAtMUYzRkJcIixcImltYWdlXCI6XCIxZjZjMC0xZjNmYi5wbmdcIixcInNoZWV0X3hcIjozMSxcInNoZWV0X3lcIjoxNSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjZDMC0xRjNGQ1wiOntcInVuaWZpZWRcIjpcIjFGNkMwLTFGM0ZDXCIsXCJpbWFnZVwiOlwiMWY2YzAtMWYzZmMucG5nXCIsXCJzaGVldF94XCI6MzEsXCJzaGVldF95XCI6MTYsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY2QzAtMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIxRjZDMC0xRjNGRFwiLFwiaW1hZ2VcIjpcIjFmNmMwLTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjMxLFwic2hlZXRfeVwiOjE3LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNkMwLTFGM0ZFXCI6e1widW5pZmllZFwiOlwiMUY2QzAtMUYzRkVcIixcImltYWdlXCI6XCIxZjZjMC0xZjNmZS5wbmdcIixcInNoZWV0X3hcIjozMSxcInNoZWV0X3lcIjoxOCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjZDMC0xRjNGRlwiOntcInVuaWZpZWRcIjpcIjFGNkMwLTFGM0ZGXCIsXCJpbWFnZVwiOlwiMWY2YzAtMWYzZmYucG5nXCIsXCJzaGVldF94XCI6MzEsXCJzaGVldF95XCI6MTksXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJjbGVhblwiLFwic2hvd2VyXCIsXCJiYXRocm9vbVwiXSxcInNlYXJjaFwiOlwiYmF0aCxjbGVhbixzaG93ZXIsYmF0aHJvb21cIn0sXCJtb25leV9tb3V0aF9mYWNlXCI6e1wibmFtZVwiOlwiTW9uZXktTW91dGggRmFjZVwiLFwidW5pZmllZFwiOlwiMUY5MTFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMixcInNoZWV0X3lcIjoyLFwic2hvcnRfbmFtZXNcIjpbXCJtb25leV9tb3V0aF9mYWNlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcIm1vbmV5LG1vdXRoLGZhY2VcIn0sXCJvcnRob2RveF9jcm9zc1wiOntcIm5hbWVcIjpcIk9ydGhvZG94IENyb3NzXCIsXCJ1bmlmaWVkXCI6XCIyNjI2XCIsXCJ2YXJpYXRpb25zXCI6W1wiMjYyNi1GRTBGXCJdLFwic2hlZXRfeFwiOjEsXCJzaGVldF95XCI6MTksXCJzaG9ydF9uYW1lc1wiOltcIm9ydGhvZG94X2Nyb3NzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic3VwcGVkYW5ldW1cIixcInJlbGlnaW9uXCJdLFwic2VhcmNoXCI6XCJvcnRob2RveCxjcm9zcyxzdXBwZWRhbmV1bSxyZWxpZ2lvblwifSxcImhhdGNoZWRfY2hpY2tcIjp7XCJuYW1lXCI6XCJGcm9udC1GYWNpbmcgQmFieSBDaGlja1wiLFwidW5pZmllZFwiOlwiMUY0MjVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMyxcInNoZWV0X3lcIjoxLFwic2hvcnRfbmFtZXNcIjpbXCJoYXRjaGVkX2NoaWNrXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJjaGlja2VuXCIsXCJiYWJ5XCIsXCJiaXJkXCJdLFwic2VhcmNoXCI6XCJoYXRjaGVkLGNoaWNrLGZyb250LGZhY2luZyxiYWJ5LGFuaW1hbCxjaGlja2VuLGJpcmRcIn0sXCJwbGFjZV9vZl93b3JzaGlwXCI6e1wibmFtZVwiOlwiUGxhY2Ugb2YgV29yc2hpcFwiLFwidW5pZmllZFwiOlwiMUY2RDBcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMSxcInNoZWV0X3lcIjozMCxcInNob3J0X25hbWVzXCI6W1wicGxhY2Vfb2Zfd29yc2hpcFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInJlbGlnaW9uXCIsXCJjaHVyY2hcIixcInRlbXBsZVwiLFwicHJheWVyXCJdLFwic2VhcmNoXCI6XCJwbGFjZSxvZix3b3JzaGlwLHJlbGlnaW9uLGNodXJjaCx0ZW1wbGUscHJheWVyXCJ9LFwiaGFtYnVyZ2VyXCI6e1wibmFtZVwiOlwiSGFtYnVyZ2VyXCIsXCJ1bmlmaWVkXCI6XCIxRjM1NFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjcsXCJzaGVldF95XCI6MjEsXCJzaG9ydF9uYW1lc1wiOltcImhhbWJ1cmdlclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm1lYXRcIixcImZhc3QgZm9vZFwiLFwiYmVlZlwiLFwiY2hlZXNlYnVyZ2VyXCIsXCJtY2RvbmFsZHNcIixcImJ1cmdlciBraW5nXCJdLFwic2VhcmNoXCI6XCJoYW1idXJnZXIsbWVhdCxmYXN0IGZvb2QsYmVlZixjaGVlc2VidXJnZXIsbWNkb25hbGRzLGJ1cmdlciBraW5nXCJ9LFwiZmxhZy1idFwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBCVFwiLFwidW5pZmllZFwiOlwiMUYxRTctMUYxRjlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMyxcInNoZWV0X3lcIjoyNSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1idFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGJ0LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImZheFwiOntcIm5hbWVcIjpcIkZheCBNYWNoaW5lXCIsXCJ1bmlmaWVkXCI6XCIxRjRFMFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIxLFwic2hlZXRfeVwiOjM1LFwic2hvcnRfbmFtZXNcIjpbXCJmYXhcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJjb21tdW5pY2F0aW9uXCIsXCJ0ZWNobm9sb2d5XCJdLFwic2VhcmNoXCI6XCJmYXgsbWFjaGluZSxjb21tdW5pY2F0aW9uLHRlY2hub2xvZ3lcIn0sXCJuZXJkX2ZhY2VcIjp7XCJuYW1lXCI6XCJOZXJkIEZhY2VcIixcInVuaWZpZWRcIjpcIjFGOTEzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzIsXCJzaGVldF95XCI6NCxcInNob3J0X25hbWVzXCI6W1wibmVyZF9mYWNlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcIm5lcmQsZmFjZVwifSxcIm1vbm9yYWlsXCI6e1wibmFtZVwiOlwiTW9ub3JhaWxcIixcInVuaWZpZWRcIjpcIjFGNjlEXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzAsXCJzaGVldF95XCI6MCxcInNob3J0X25hbWVzXCI6W1wibW9ub3JhaWxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ0cmFuc3BvcnRhdGlvblwiLFwidmVoaWNsZVwiXSxcInNlYXJjaFwiOlwibW9ub3JhaWwsdHJhbnNwb3J0YXRpb24sdmVoaWNsZVwifSxcInBlcnNvbl93aXRoX2JhbGxcIjp7XCJuYW1lXCI6XCJQZXJzb24gd2l0aCBCYWxsXCIsXCJ1bmlmaWVkXCI6XCIyNkY5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MixcInNoZWV0X3lcIjozOCxcInNob3J0X25hbWVzXCI6W1wicGVyc29uX3dpdGhfYmFsbFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMjZGOS0xRjNGQlwiOntcInVuaWZpZWRcIjpcIjI2RjktMUYzRkJcIixcImltYWdlXCI6XCIyNmY5LTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjIsXCJzaGVldF95XCI6MzksXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMjZGOS0xRjNGQ1wiOntcInVuaWZpZWRcIjpcIjI2RjktMUYzRkNcIixcImltYWdlXCI6XCIyNmY5LTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjIsXCJzaGVldF95XCI6NDAsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMjZGOS0xRjNGRFwiOntcInVuaWZpZWRcIjpcIjI2RjktMUYzRkRcIixcImltYWdlXCI6XCIyNmY5LTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjMsXCJzaGVldF95XCI6MCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIyNkY5LTFGM0ZFXCI6e1widW5pZmllZFwiOlwiMjZGOS0xRjNGRVwiLFwiaW1hZ2VcIjpcIjI2ZjktMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MyxcInNoZWV0X3lcIjoxLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjI2RjktMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIyNkY5LTFGM0ZGXCIsXCJpbWFnZVwiOlwiMjZmOS0xZjNmZi5wbmdcIixcInNoZWV0X3hcIjozLFwic2hlZXRfeVwiOjIsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzcG9ydHNcIixcImh1bWFuXCJdLFwic2VhcmNoXCI6XCJwZXJzb24sd2l0aCxiYWxsLHNwb3J0cyxodW1hblwifSxcIndlaWdodF9saWZ0ZXJcIjp7XCJuYW1lXCI6XCJXZWlnaHQgTGlmdGVyXCIsXCJ1bmlmaWVkXCI6XCIxRjNDQlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEwLFwic2hlZXRfeVwiOjMyLFwic2hvcnRfbmFtZXNcIjpbXCJ3ZWlnaHRfbGlmdGVyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJza2luX3ZhcmlhdGlvbnNcIjp7XCIxRjNDQi0xRjNGQlwiOntcInVuaWZpZWRcIjpcIjFGM0NCLTFGM0ZCXCIsXCJpbWFnZVwiOlwiMWYzY2ItMWYzZmIucG5nXCIsXCJzaGVldF94XCI6MTAsXCJzaGVldF95XCI6MzMsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUYzQ0ItMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjNDQi0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmM2NiLTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjEwLFwic2hlZXRfeVwiOjM0LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGM0NCLTFGM0ZEXCI6e1widW5pZmllZFwiOlwiMUYzQ0ItMUYzRkRcIixcImltYWdlXCI6XCIxZjNjYi0xZjNmZC5wbmdcIixcInNoZWV0X3hcIjoxMCxcInNoZWV0X3lcIjozNSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjNDQi0xRjNGRVwiOntcInVuaWZpZWRcIjpcIjFGM0NCLTFGM0ZFXCIsXCJpbWFnZVwiOlwiMWYzY2ItMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MTAsXCJzaGVldF95XCI6MzYsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUYzQ0ItMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjNDQi0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmM2NiLTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjEwLFwic2hlZXRfeVwiOjM3LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfX0sXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic3BvcnRzXCIsXCJ0cmFpbmluZ1wiLFwiZXhlcmNpc2VcIl0sXCJzZWFyY2hcIjpcIndlaWdodCxsaWZ0ZXIsc3BvcnRzLHRyYWluaW5nLGV4ZXJjaXNlXCJ9LFwic3VuZ2xhc3Nlc1wiOntcIm5hbWVcIjpcIlNtaWxpbmcgRmFjZSB3aXRoIFN1bmdsYXNzZXNcIixcInVuaWZpZWRcIjpcIjFGNjBFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjYsXCJzaGVldF95XCI6MjksXCJzaG9ydF9uYW1lc1wiOltcInN1bmdsYXNzZXNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltcIjgpXCJdLFwia2V5d29yZHNcIjpbXCJmYWNlXCIsXCJjb29sXCIsXCJzbWlsZVwiLFwic3VtbWVyXCIsXCJiZWFjaFwiXSxcInNlYXJjaFwiOlwic3VuZ2xhc3NlcyxzbWlsaW5nLGZhY2Usd2l0aCxjb29sLHNtaWxlLHN1bW1lcixiZWFjaCw4KVwifSxcIndvbGZcIjp7XCJuYW1lXCI6XCJXb2xmIEZhY2VcIixcInVuaWZpZWRcIjpcIjFGNDNBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTMsXCJzaGVldF95XCI6MjIsXCJzaG9ydF9uYW1lc1wiOltcIndvbGZcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcIm5hdHVyZVwiLFwid2lsZFwiXSxcInNlYXJjaFwiOlwid29sZixmYWNlLGFuaW1hbCxuYXR1cmUsd2lsZFwifSxcImJ1bGxldHRyYWluX3NpZGVcIjp7XCJuYW1lXCI6XCJIaWdoLVNwZWVkIFRyYWluXCIsXCJ1bmlmaWVkXCI6XCIxRjY4NFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI5LFwic2hlZXRfeVwiOjE2LFwic2hvcnRfbmFtZXNcIjpbXCJidWxsZXR0cmFpbl9zaWRlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widHJhbnNwb3J0YXRpb25cIixcInZlaGljbGVcIl0sXCJzZWFyY2hcIjpcImJ1bGxldHRyYWluLHNpZGUsaGlnaCxzcGVlZCx0cmFpbix0cmFuc3BvcnRhdGlvbix2ZWhpY2xlXCJ9LFwib3BoaXVjaHVzXCI6e1wibmFtZVwiOlwiT3BoaXVjaHVzXCIsXCJ1bmlmaWVkXCI6XCIyNkNFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MixcInNoZWV0X3lcIjoyMyxcInNob3J0X25hbWVzXCI6W1wib3BoaXVjaHVzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic2lnblwiLFwicHVycGxlLXNxdWFyZVwiLFwiY29uc3RlbGxhdGlvblwiLFwiYXN0cm9sb2d5XCJdLFwic2VhcmNoXCI6XCJvcGhpdWNodXMsc2lnbixwdXJwbGUtc3F1YXJlLGNvbnN0ZWxsYXRpb24sYXN0cm9sb2d5XCJ9LFwiZmxhZy1ib1wiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBCT1wiLFwidW5pZmllZFwiOlwiMUYxRTctMUYxRjRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMyxcInNoZWV0X3lcIjoyMSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1ib1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGJvLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcInR2XCI6e1wibmFtZVwiOlwiVGVsZXZpc2lvblwiLFwidW5pZmllZFwiOlwiMUY0RkFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMixcInNoZWV0X3lcIjoyMCxcInNob3J0X25hbWVzXCI6W1widHZcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ0ZWNobm9sb2d5XCIsXCJwcm9ncmFtXCIsXCJvbGRzY2hvb2xcIixcInNob3dcIixcInRlbGV2aXNpb25cIl0sXCJzZWFyY2hcIjpcInR2LHRlbGV2aXNpb24sdGVjaG5vbG9neSxwcm9ncmFtLG9sZHNjaG9vbCxzaG93XCJ9LFwiZnJpZXNcIjp7XCJuYW1lXCI6XCJGcmVuY2ggRnJpZXNcIixcInVuaWZpZWRcIjpcIjFGMzVGXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NyxcInNoZWV0X3lcIjozMixcInNob3J0X25hbWVzXCI6W1wiZnJpZXNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJjaGlwc1wiLFwic25hY2tcIixcImZhc3QgZm9vZFwiXSxcInNlYXJjaFwiOlwiZnJpZXMsZnJlbmNoLGNoaXBzLHNuYWNrLGZhc3QgZm9vZFwifSxcImJpY3ljbGlzdFwiOntcIm5hbWVcIjpcIkJpY3ljbGlzdFwiLFwidW5pZmllZFwiOlwiMUY2QjRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMCxcInNoZWV0X3lcIjoyOCxcInNob3J0X25hbWVzXCI6W1wiYmljeWNsaXN0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJza2luX3ZhcmlhdGlvbnNcIjp7XCIxRjZCNC0xRjNGQlwiOntcInVuaWZpZWRcIjpcIjFGNkI0LTFGM0ZCXCIsXCJpbWFnZVwiOlwiMWY2YjQtMWYzZmIucG5nXCIsXCJzaGVldF94XCI6MzAsXCJzaGVldF95XCI6MjksXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY2QjQtMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjZCNC0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmNmI0LTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjMwLFwic2hlZXRfeVwiOjMwLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNkI0LTFGM0ZEXCI6e1widW5pZmllZFwiOlwiMUY2QjQtMUYzRkRcIixcImltYWdlXCI6XCIxZjZiNC0xZjNmZC5wbmdcIixcInNoZWV0X3hcIjozMCxcInNoZWV0X3lcIjozMSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjZCNC0xRjNGRVwiOntcInVuaWZpZWRcIjpcIjFGNkI0LTFGM0ZFXCIsXCJpbWFnZVwiOlwiMWY2YjQtMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MzAsXCJzaGVldF95XCI6MzIsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY2QjQtMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjZCNC0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmNmI0LTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjMwLFwic2hlZXRfeVwiOjMzLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfX0sXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic3BvcnRzXCIsXCJiaWtlXCIsXCJleGVyY2lzZVwiLFwiaGlwc3RlclwiXSxcInNlYXJjaFwiOlwiYmljeWNsaXN0LHNwb3J0cyxiaWtlLGV4ZXJjaXNlLGhpcHN0ZXJcIn0sXCJhcmllc1wiOntcIm5hbWVcIjpcIkFyaWVzXCIsXCJ1bmlmaWVkXCI6XCIyNjQ4XCIsXCJ2YXJpYXRpb25zXCI6W1wiMjY0OC1GRTBGXCJdLFwic2hlZXRfeFwiOjEsXCJzaGVldF95XCI6MjYsXCJzaG9ydF9uYW1lc1wiOltcImFyaWVzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic2lnblwiLFwicHVycGxlLXNxdWFyZVwiLFwiem9kaWFjXCIsXCJhc3Ryb2xvZ3lcIl0sXCJzZWFyY2hcIjpcImFyaWVzLHNpZ24scHVycGxlLXNxdWFyZSx6b2RpYWMsYXN0cm9sb2d5XCJ9LFwiaHVnZ2luZ19mYWNlXCI6e1wibmFtZVwiOlwiSHVnZ2luZyBGYWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjkxN1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMyLFwic2hlZXRfeVwiOjgsXCJzaG9ydF9uYW1lc1wiOltcImh1Z2dpbmdfZmFjZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJodWdnaW5nLGZhY2VcIn0sXCJmbGFnLWJxXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEJRXCIsXCJ1bmlmaWVkXCI6XCIxRjFFNy0xRjFGNlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMzLFwic2hlZXRfeVwiOjIyLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWJxXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGJxLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImJ1bGxldHRyYWluX2Zyb250XCI6e1wibmFtZVwiOlwiSGlnaC1TcGVlZCBUcmFpbiB3aXRoIEJ1bGxldCBOb3NlXCIsXCJ1bmlmaWVkXCI6XCIxRjY4NVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI5LFwic2hlZXRfeVwiOjE3LFwic2hvcnRfbmFtZXNcIjpbXCJidWxsZXR0cmFpbl9mcm9udFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRyYW5zcG9ydGF0aW9uXCIsXCJ2ZWhpY2xlXCIsXCJzcGVlZFwiLFwiZmFzdFwiLFwicHVibGljXCIsXCJ0cmF2ZWxcIl0sXCJzZWFyY2hcIjpcImJ1bGxldHRyYWluLGZyb250LGhpZ2gsc3BlZWQsdHJhaW4sd2l0aCxidWxsZXQsbm9zZSx0cmFuc3BvcnRhdGlvbix2ZWhpY2xlLGZhc3QscHVibGljLHRyYXZlbFwifSxcInJhZGlvXCI6e1wibmFtZVwiOlwiUmFkaW9cIixcInVuaWZpZWRcIjpcIjFGNEZCXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjIsXCJzaGVldF95XCI6MjEsXCJzaG9ydF9uYW1lc1wiOltcInJhZGlvXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiY29tbXVuaWNhdGlvblwiLFwibXVzaWNcIixcInBvZGNhc3RcIixcInByb2dyYW1cIl0sXCJzZWFyY2hcIjpcInJhZGlvLGNvbW11bmljYXRpb24sbXVzaWMscG9kY2FzdCxwcm9ncmFtXCJ9LFwiaG90ZG9nXCI6e1wibmFtZVwiOlwiSG90IERvZ1wiLFwidW5pZmllZFwiOlwiMUYzMkRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo2LFwic2hlZXRfeVwiOjIzLFwic2hvcnRfbmFtZXNcIjpbXCJob3Rkb2dcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiaG90ZG9nLGhvdCxkb2dcIn0sXCJib2FyXCI6e1wibmFtZVwiOlwiQm9hclwiLFwidW5pZmllZFwiOlwiMUY0MTdcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMixcInNoZWV0X3lcIjoyOCxcInNob3J0X25hbWVzXCI6W1wiYm9hclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwibmF0dXJlXCJdLFwic2VhcmNoXCI6XCJib2FyLGFuaW1hbCxuYXR1cmVcIn0sXCJzdHVkaW9fbWljcm9waG9uZVwiOntcIm5hbWVcIjpcIlN0dWRpbyBNaWNyb3Bob25lXCIsXCJ1bmlmaWVkXCI6XCIxRjM5OVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjksXCJzaGVldF95XCI6MTAsXCJzaG9ydF9uYW1lc1wiOltcInN0dWRpb19taWNyb3Bob25lXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic2luZ2VyXCIsXCJyZWNvcmRpbmdcIixcImFydGlzdFwiXSxcInNlYXJjaFwiOlwic3R1ZGlvLG1pY3JvcGhvbmUsc2luZ2VyLHJlY29yZGluZyxhcnRpc3RcIn0sXCJwaXp6YVwiOntcIm5hbWVcIjpcIlNsaWNlIG9mIFBpenphXCIsXCJ1bmlmaWVkXCI6XCIxRjM1NVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjcsXCJzaGVldF95XCI6MjIsXCJzaG9ydF9uYW1lc1wiOltcInBpenphXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZm9vZFwiLFwicGFydHlcIl0sXCJzZWFyY2hcIjpcInBpenphLHNsaWNlLG9mLGZvb2QscGFydHlcIn0sXCJmbGFnLWJhXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEJBXCIsXCJ1bmlmaWVkXCI6XCIxRjFFNy0xRjFFNlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMzLFwic2hlZXRfeVwiOjksXCJzaG9ydF9uYW1lc1wiOltcImZsYWctYmFcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxiYSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJtb3VudGFpbl9iaWN5Y2xpc3RcIjp7XCJuYW1lXCI6XCJNb3VudGFpbiBCaWN5Y2xpc3RcIixcInVuaWZpZWRcIjpcIjFGNkI1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzAsXCJzaGVldF95XCI6MzQsXCJzaG9ydF9uYW1lc1wiOltcIm1vdW50YWluX2JpY3ljbGlzdFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUY2QjUtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjZCNS0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmNmI1LTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjMwLFwic2hlZXRfeVwiOjM1LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNkI1LTFGM0ZDXCI6e1widW5pZmllZFwiOlwiMUY2QjUtMUYzRkNcIixcImltYWdlXCI6XCIxZjZiNS0xZjNmYy5wbmdcIixcInNoZWV0X3hcIjozMCxcInNoZWV0X3lcIjozNixcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjZCNS0xRjNGRFwiOntcInVuaWZpZWRcIjpcIjFGNkI1LTFGM0ZEXCIsXCJpbWFnZVwiOlwiMWY2YjUtMWYzZmQucG5nXCIsXCJzaGVldF94XCI6MzAsXCJzaGVldF95XCI6MzcsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY2QjUtMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIxRjZCNS0xRjNGRVwiLFwiaW1hZ2VcIjpcIjFmNmI1LTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjMwLFwic2hlZXRfeVwiOjM4LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNkI1LTFGM0ZGXCI6e1widW5pZmllZFwiOlwiMUY2QjUtMUYzRkZcIixcImltYWdlXCI6XCIxZjZiNS0xZjNmZi5wbmdcIixcInNoZWV0X3hcIjozMCxcInNoZWV0X3lcIjozOSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX19LFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRyYW5zcG9ydGF0aW9uXCIsXCJzcG9ydHNcIixcImh1bWFuXCIsXCJyYWNlXCIsXCJiaWtlXCJdLFwic2VhcmNoXCI6XCJtb3VudGFpbixiaWN5Y2xpc3QsdHJhbnNwb3J0YXRpb24sc3BvcnRzLGh1bWFuLHJhY2UsYmlrZVwifSxcInNtaXJrXCI6e1wibmFtZVwiOlwiU21pcmtpbmcgRmFjZVwiLFwidW5pZmllZFwiOlwiMUY2MEZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNixcInNoZWV0X3lcIjozMCxcInNob3J0X25hbWVzXCI6W1wic21pcmtcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmYWNlXCIsXCJzbWlsZVwiLFwibWVhblwiLFwicHJhbmtcIixcInNtdWdcIixcInNhcmNhc21cIl0sXCJzZWFyY2hcIjpcInNtaXJrLHNtaXJraW5nLGZhY2Usc21pbGUsbWVhbixwcmFuayxzbXVnLHNhcmNhc21cIn0sXCJsaWdodF9yYWlsXCI6e1wibmFtZVwiOlwiTGlnaHQgUmFpbFwiLFwidW5pZmllZFwiOlwiMUY2ODhcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyOSxcInNoZWV0X3lcIjoyMCxcInNob3J0X25hbWVzXCI6W1wibGlnaHRfcmFpbFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRyYW5zcG9ydGF0aW9uXCIsXCJ2ZWhpY2xlXCJdLFwic2VhcmNoXCI6XCJsaWdodCxyYWlsLHRyYW5zcG9ydGF0aW9uLHZlaGljbGVcIn0sXCJob3JzZVwiOntcIm5hbWVcIjpcIkhvcnNlIEZhY2VcIixcInVuaWZpZWRcIjpcIjFGNDM0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTMsXCJzaGVldF95XCI6MTYsXCJzaG9ydF9uYW1lc1wiOltcImhvcnNlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJicm93blwiLFwibmF0dXJlXCJdLFwic2VhcmNoXCI6XCJob3JzZSxmYWNlLGFuaW1hbCxicm93bixuYXR1cmVcIn0sXCJ0YXVydXNcIjp7XCJuYW1lXCI6XCJUYXVydXNcIixcInVuaWZpZWRcIjpcIjI2NDlcIixcInZhcmlhdGlvbnNcIjpbXCIyNjQ5LUZFMEZcIl0sXCJzaGVldF94XCI6MSxcInNoZWV0X3lcIjoyNyxcInNob3J0X25hbWVzXCI6W1widGF1cnVzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicHVycGxlLXNxdWFyZVwiLFwic2lnblwiLFwiem9kaWFjXCIsXCJhc3Ryb2xvZ3lcIl0sXCJzZWFyY2hcIjpcInRhdXJ1cyxwdXJwbGUtc3F1YXJlLHNpZ24sem9kaWFjLGFzdHJvbG9neVwifSxcImdlbWluaVwiOntcIm5hbWVcIjpcIkdlbWluaVwiLFwidW5pZmllZFwiOlwiMjY0QVwiLFwidmFyaWF0aW9uc1wiOltcIjI2NEEtRkUwRlwiXSxcInNoZWV0X3hcIjoxLFwic2hlZXRfeVwiOjI4LFwic2hvcnRfbmFtZXNcIjpbXCJnZW1pbmlcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzaWduXCIsXCJ6b2RpYWNcIixcInB1cnBsZS1zcXVhcmVcIixcImFzdHJvbG9neVwiXSxcInNlYXJjaFwiOlwiZ2VtaW5pLHNpZ24sem9kaWFjLHB1cnBsZS1zcXVhcmUsYXN0cm9sb2d5XCJ9LFwiaG9yc2VfcmFjaW5nXCI6e1wibmFtZVwiOlwiSG9yc2UgUmFjaW5nXCIsXCJ1bmlmaWVkXCI6XCIxRjNDN1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEwLFwic2hlZXRfeVwiOjIzLFwic2hvcnRfbmFtZXNcIjpbXCJob3JzZV9yYWNpbmdcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcImJldHRpbmdcIixcImNvbXBldGl0aW9uXCIsXCJnYW1ibGluZ1wiLFwibHVja1wiXSxcInNlYXJjaFwiOlwiaG9yc2UscmFjaW5nLGFuaW1hbCxiZXR0aW5nLGNvbXBldGl0aW9uLGdhbWJsaW5nLGx1Y2tcIn0sXCJsZXZlbF9zbGlkZXJcIjp7XCJuYW1lXCI6XCJMZXZlbCBTbGlkZXJcIixcInVuaWZpZWRcIjpcIjFGMzlBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OSxcInNoZWV0X3lcIjoxMSxcInNob3J0X25hbWVzXCI6W1wibGV2ZWxfc2xpZGVyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic2NhbGVcIl0sXCJzZWFyY2hcIjpcImxldmVsLHNsaWRlcixzY2FsZVwifSxcImZsYWctYndcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQldcIixcInVuaWZpZWRcIjpcIjFGMUU3LTFGMUZDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzMsXCJzaGVldF95XCI6MjcsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctYndcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxidyxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJ1bmljb3JuX2ZhY2VcIjp7XCJuYW1lXCI6XCJVbmljb3JuIEZhY2VcIixcInVuaWZpZWRcIjpcIjFGOTg0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzIsXCJzaGVldF95XCI6MTksXCJzaG9ydF9uYW1lc1wiOltcInVuaWNvcm5fZmFjZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwibmF0dXJlXCIsXCJteXN0aWNhbFwiXSxcInNlYXJjaFwiOlwidW5pY29ybixmYWNlLGFuaW1hbCxuYXR1cmUsbXlzdGljYWxcIn0sXCJtb3VudGFpbl9yYWlsd2F5XCI6e1wibmFtZVwiOlwiTW91bnRhaW4gUmFpbHdheVwiLFwidW5pZmllZFwiOlwiMUY2OUVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMCxcInNoZWV0X3lcIjoxLFwic2hvcnRfbmFtZXNcIjpbXCJtb3VudGFpbl9yYWlsd2F5XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widHJhbnNwb3J0YXRpb25cIixcInZlaGljbGVcIl0sXCJzZWFyY2hcIjpcIm1vdW50YWluLHJhaWx3YXksdHJhbnNwb3J0YXRpb24sdmVoaWNsZVwifSxcInNwYWdoZXR0aVwiOntcIm5hbWVcIjpcIlNwYWdoZXR0aVwiLFwidW5pZmllZFwiOlwiMUYzNURcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo3LFwic2hlZXRfeVwiOjMwLFwic2hvcnRfbmFtZXNcIjpbXCJzcGFnaGV0dGlcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmb29kXCIsXCJpdGFsaWFuXCIsXCJub29kbGVcIl0sXCJzZWFyY2hcIjpcInNwYWdoZXR0aSxmb29kLGl0YWxpYW4sbm9vZGxlXCJ9LFwibm9fbW91dGhcIjp7XCJuYW1lXCI6XCJGYWNlIFdpdGhvdXQgTW91dGhcIixcInVuaWZpZWRcIjpcIjFGNjM2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjcsXCJzaGVldF95XCI6MjgsXCJzaG9ydF9uYW1lc1wiOltcIm5vX21vdXRoXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmFjZVwiLFwiaGVsbG9raXR0eVwiXSxcInNlYXJjaFwiOlwibm8sbW91dGgsZmFjZSx3aXRob3V0LGhlbGxva2l0dHlcIn0sXCJmbGFnLWJyXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEJSXCIsXCJ1bmlmaWVkXCI6XCIxRjFFNy0xRjFGN1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMzLFwic2hlZXRfeVwiOjIzLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWJyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsYnIscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwibWFuX2luX2J1c2luZXNzX3N1aXRfbGV2aXRhdGluZ1wiOntcIm5hbWVcIjpcIk1hbiBpbiBCdXNpbmVzcyBTdWl0IExldml0YXRpbmdcIixcInVuaWZpZWRcIjpcIjFGNTc0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjQsXCJzaGVldF95XCI6MzgsXCJzaG9ydF9uYW1lc1wiOltcIm1hbl9pbl9idXNpbmVzc19zdWl0X2xldml0YXRpbmdcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwibWFuLGluLGJ1c2luZXNzLHN1aXQsbGV2aXRhdGluZ1wifSxcImNvbnRyb2xfa25vYnNcIjp7XCJuYW1lXCI6XCJDb250cm9sIEtub2JzXCIsXCJ1bmlmaWVkXCI6XCIxRjM5QlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjksXCJzaGVldF95XCI6MTIsXCJzaG9ydF9uYW1lc1wiOltcImNvbnRyb2xfa25vYnNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJkaWFsXCJdLFwic2VhcmNoXCI6XCJjb250cm9sLGtub2JzLGRpYWxcIn0sXCJiZWVcIjp7XCJuYW1lXCI6XCJIb25leWJlZVwiLFwidW5pZmllZFwiOlwiMUY0MURcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMixcInNoZWV0X3lcIjozNCxcInNob3J0X25hbWVzXCI6W1wiYmVlXCIsXCJob25leWJlZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwiaW5zZWN0XCIsXCJuYXR1cmVcIixcImJ1Z1wiLFwic3ByaW5nXCIsXCJob25leVwiXSxcInNlYXJjaFwiOlwiYmVlLGhvbmV5YmVlLGFuaW1hbCxpbnNlY3QsbmF0dXJlLGJ1ZyxzcHJpbmcsaG9uZXlcIn0sXCJuZXV0cmFsX2ZhY2VcIjp7XCJuYW1lXCI6XCJOZXV0cmFsIEZhY2VcIixcInVuaWZpZWRcIjpcIjFGNjEwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjYsXCJzaGVldF95XCI6MzEsXCJzaG9ydF9uYW1lc1wiOltcIm5ldXRyYWxfZmFjZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W1wiOnxcIixcIjotfFwiXSxcImtleXdvcmRzXCI6W1wiaW5kaWZmZXJlbmNlXCIsXCJtZWhcIixcIjp8XCJdLFwic2VhcmNoXCI6XCJuZXV0cmFsLGZhY2UsaW5kaWZmZXJlbmNlLG1laCw6fCw6LXxcIn0sXCJzdGVhbV9sb2NvbW90aXZlXCI6e1wibmFtZVwiOlwiU3RlYW0gTG9jb21vdGl2ZVwiLFwidW5pZmllZFwiOlwiMUY2ODJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyOSxcInNoZWV0X3lcIjoxNCxcInNob3J0X25hbWVzXCI6W1wic3RlYW1fbG9jb21vdGl2ZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRyYW5zcG9ydGF0aW9uXCIsXCJ2ZWhpY2xlXCIsXCJ0cmFpblwiXSxcInNlYXJjaFwiOlwic3RlYW0sbG9jb21vdGl2ZSx0cmFuc3BvcnRhdGlvbix2ZWhpY2xlLHRyYWluXCJ9LFwiY2FuY2VyXCI6e1wibmFtZVwiOlwiQ2FuY2VyXCIsXCJ1bmlmaWVkXCI6XCIyNjRCXCIsXCJ2YXJpYXRpb25zXCI6W1wiMjY0Qi1GRTBGXCJdLFwic2hlZXRfeFwiOjEsXCJzaGVldF95XCI6MjksXCJzaG9ydF9uYW1lc1wiOltcImNhbmNlclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNpZ25cIixcInpvZGlhY1wiLFwicHVycGxlLXNxdWFyZVwiLFwiYXN0cm9sb2d5XCJdLFwic2VhcmNoXCI6XCJjYW5jZXIsc2lnbix6b2RpYWMscHVycGxlLXNxdWFyZSxhc3Ryb2xvZ3lcIn0sXCJ0YWNvXCI6e1wibmFtZVwiOlwiVGFjb1wiLFwidW5pZmllZFwiOlwiMUYzMkVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo2LFwic2hlZXRfeVwiOjI0LFwic2hvcnRfbmFtZXNcIjpbXCJ0YWNvXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZm9vZFwiLFwibWV4aWNhblwiXSxcInNlYXJjaFwiOlwidGFjbyxmb29kLG1leGljYW5cIn0sXCJidXJyaXRvXCI6e1wibmFtZVwiOlwiQnVycml0b1wiLFwidW5pZmllZFwiOlwiMUYzMkZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo2LFwic2hlZXRfeVwiOjI1LFwic2hvcnRfbmFtZXNcIjpbXCJidXJyaXRvXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZm9vZFwiLFwibWV4aWNhblwiXSxcInNlYXJjaFwiOlwiYnVycml0byxmb29kLG1leGljYW5cIn0sXCJleHByZXNzaW9ubGVzc1wiOntcIm5hbWVcIjpcIkV4cHJlc3Npb25sZXNzIEZhY2VcIixcInVuaWZpZWRcIjpcIjFGNjExXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjYsXCJzaGVldF95XCI6MzIsXCJzaG9ydF9uYW1lc1wiOltcImV4cHJlc3Npb25sZXNzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmFjZVwiLFwiaW5kaWZmZXJlbnRcIixcIi1fLVwiLFwibWVoXCJdLFwic2VhcmNoXCI6XCJleHByZXNzaW9ubGVzcyxmYWNlLGluZGlmZmVyZW50LC1fLSxtZWhcIn0sXCJ0cm9waHlcIjp7XCJuYW1lXCI6XCJUcm9waHlcIixcInVuaWZpZWRcIjpcIjFGM0M2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTAsXCJzaGVldF95XCI6MjIsXCJzaG9ydF9uYW1lc1wiOltcInRyb3BoeVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIndpblwiLFwiYXdhcmRcIixcImNvbnRlc3RcIixcInBsYWNlXCIsXCJmdHdcIixcImNlcmVtb255XCJdLFwic2VhcmNoXCI6XCJ0cm9waHksd2luLGF3YXJkLGNvbnRlc3QscGxhY2UsZnR3LGNlcmVtb255XCJ9LFwidHJhaW4yXCI6e1wibmFtZVwiOlwiVHJhaW5cIixcInVuaWZpZWRcIjpcIjFGNjg2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjksXCJzaGVldF95XCI6MTgsXCJzaG9ydF9uYW1lc1wiOltcInRyYWluMlwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRyYW5zcG9ydGF0aW9uXCIsXCJ2ZWhpY2xlXCJdLFwic2VhcmNoXCI6XCJ0cmFpbjIsdHJhaW4sdHJhbnNwb3J0YXRpb24sdmVoaWNsZVwifSxcImZsYWctaW9cIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgSU9cIixcInVuaWZpZWRcIjpcIjFGMUVFLTFGMUY0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzUsXCJzaGVldF95XCI6MjEsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctaW9cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxpbyxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJidWdcIjp7XCJuYW1lXCI6XCJCdWdcIixcInVuaWZpZWRcIjpcIjFGNDFCXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTIsXCJzaGVldF95XCI6MzIsXCJzaG9ydF9uYW1lc1wiOltcImJ1Z1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwiaW5zZWN0XCIsXCJuYXR1cmVcIixcIndvcm1cIl0sXCJzZWFyY2hcIjpcImJ1ZyxhbmltYWwsaW5zZWN0LG5hdHVyZSx3b3JtXCJ9LFwic3RvcHdhdGNoXCI6e1wibmFtZVwiOlwiU3RvcHdhdGNoXCIsXCJ1bmlmaWVkXCI6XCIyM0YxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MCxcInNoZWV0X3lcIjoyNixcInNob3J0X25hbWVzXCI6W1wic3RvcHdhdGNoXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widGltZVwiLFwiZGVhZGxpbmVcIl0sXCJzZWFyY2hcIjpcInN0b3B3YXRjaCx0aW1lLGRlYWRsaW5lXCJ9LFwibGVvXCI6e1wibmFtZVwiOlwiTGVvXCIsXCJ1bmlmaWVkXCI6XCIyNjRDXCIsXCJ2YXJpYXRpb25zXCI6W1wiMjY0Qy1GRTBGXCJdLFwic2hlZXRfeFwiOjEsXCJzaGVldF95XCI6MzAsXCJzaG9ydF9uYW1lc1wiOltcImxlb1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNpZ25cIixcInB1cnBsZS1zcXVhcmVcIixcInpvZGlhY1wiLFwiYXN0cm9sb2d5XCJdLFwic2VhcmNoXCI6XCJsZW8sc2lnbixwdXJwbGUtc3F1YXJlLHpvZGlhYyxhc3Ryb2xvZ3lcIn0sXCJ2aXJnb1wiOntcIm5hbWVcIjpcIlZpcmdvXCIsXCJ1bmlmaWVkXCI6XCIyNjREXCIsXCJ2YXJpYXRpb25zXCI6W1wiMjY0RC1GRTBGXCJdLFwic2hlZXRfeFwiOjEsXCJzaGVldF95XCI6MzEsXCJzaG9ydF9uYW1lc1wiOltcInZpcmdvXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic2lnblwiLFwiem9kaWFjXCIsXCJwdXJwbGUtc3F1YXJlXCIsXCJhc3Ryb2xvZ3lcIl0sXCJzZWFyY2hcIjpcInZpcmdvLHNpZ24sem9kaWFjLHB1cnBsZS1zcXVhcmUsYXN0cm9sb2d5XCJ9LFwicnVubmluZ19zaGlydF93aXRoX3Nhc2hcIjp7XCJuYW1lXCI6XCJSdW5uaW5nIFNoaXJ0IHdpdGggU2FzaFwiLFwidW5pZmllZFwiOlwiMUYzQkRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMCxcInNoZWV0X3lcIjozLFwic2hvcnRfbmFtZXNcIjpbXCJydW5uaW5nX3NoaXJ0X3dpdGhfc2FzaFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBsYXlcIixcInBhZ2VhbnRcIl0sXCJzZWFyY2hcIjpcInJ1bm5pbmcsc2hpcnQsd2l0aCxzYXNoLHBsYXkscGFnZWFudFwifSxcImZsYWctdmdcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgVkdcIixcInVuaWZpZWRcIjpcIjFGMUZCLTFGMUVDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzgsXCJzaGVldF95XCI6MzIsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctdmdcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyx2ZyxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJtZXRyb1wiOntcIm5hbWVcIjpcIk1ldHJvXCIsXCJ1bmlmaWVkXCI6XCIxRjY4N1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI5LFwic2hlZXRfeVwiOjE5LFwic2hvcnRfbmFtZXNcIjpbXCJtZXRyb1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRyYW5zcG9ydGF0aW9uXCIsXCJibHVlLXNxdWFyZVwiLFwibXJ0XCIsXCJ1bmRlcmdyb3VuZFwiLFwidHViZVwiXSxcInNlYXJjaFwiOlwibWV0cm8sdHJhbnNwb3J0YXRpb24sYmx1ZS1zcXVhcmUsbXJ0LHVuZGVyZ3JvdW5kLHR1YmVcIn0sXCJ1bmFtdXNlZFwiOntcIm5hbWVcIjpcIlVuYW11c2VkIEZhY2VcIixcInVuaWZpZWRcIjpcIjFGNjEyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjYsXCJzaGVldF95XCI6MzMsXCJzaG9ydF9uYW1lc1wiOltcInVuYW11c2VkXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXCI6KFwiXSxcImtleXdvcmRzXCI6W1wiaW5kaWZmZXJlbmNlXCIsXCJib3JlZFwiLFwic3RyYWlnaHQgZmFjZVwiLFwic2VyaW91c1wiXSxcInNlYXJjaFwiOlwidW5hbXVzZWQsZmFjZSxpbmRpZmZlcmVuY2UsYm9yZWQsc3RyYWlnaHQgZmFjZSxzZXJpb3VzLDooXCJ9LFwic25haWxcIjp7XCJuYW1lXCI6XCJTbmFpbFwiLFwidW5pZmllZFwiOlwiMUY0MENcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMixcInNoZWV0X3lcIjoxNyxcInNob3J0X25hbWVzXCI6W1wic25haWxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzbG93XCIsXCJhbmltYWxcIixcInNoZWxsXCJdLFwic2VhcmNoXCI6XCJzbmFpbCxzbG93LGFuaW1hbCxzaGVsbFwifSxcInRpbWVyX2Nsb2NrXCI6e1wibmFtZVwiOlwiVGltZXIgQ2xvY2tcIixcInVuaWZpZWRcIjpcIjIzRjJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjowLFwic2hlZXRfeVwiOjI3LFwic2hvcnRfbmFtZXNcIjpbXCJ0aW1lcl9jbG9ja1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFsYXJtXCJdLFwic2VhcmNoXCI6XCJ0aW1lcixjbG9jayxhbGFybVwifSxcInJhbWVuXCI6e1wibmFtZVwiOlwiU3RlYW1pbmcgQm93bFwiLFwidW5pZmllZFwiOlwiMUYzNUNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo3LFwic2hlZXRfeVwiOjI5LFwic2hvcnRfbmFtZXNcIjpbXCJyYW1lblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZvb2RcIixcImphcGFuZXNlXCIsXCJub29kbGVcIixcImNoaXBzdGlja3NcIl0sXCJzZWFyY2hcIjpcInJhbWVuLHN0ZWFtaW5nLGJvd2wsZm9vZCxqYXBhbmVzZSxub29kbGUsY2hpcHN0aWNrc1wifSxcImJlZXRsZVwiOntcIm5hbWVcIjpcIkxhZHkgQmVldGxlXCIsXCJ1bmlmaWVkXCI6XCIxRjQxRVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEyLFwic2hlZXRfeVwiOjM1LFwic2hvcnRfbmFtZXNcIjpbXCJiZWV0bGVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcImluc2VjdFwiLFwibmF0dXJlXCIsXCJsYWR5YnVnXCJdLFwic2VhcmNoXCI6XCJiZWV0bGUsbGFkeSxhbmltYWwsaW5zZWN0LG5hdHVyZSxsYWR5YnVnXCJ9LFwiZmFjZV93aXRoX3JvbGxpbmdfZXllc1wiOntcIm5hbWVcIjpcIkZhY2Ugd2l0aCBSb2xsaW5nIEV5ZXNcIixcInVuaWZpZWRcIjpcIjFGNjQ0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjgsXCJzaGVldF95XCI6MSxcInNob3J0X25hbWVzXCI6W1wiZmFjZV93aXRoX3JvbGxpbmdfZXllc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmYWNlLHdpdGgscm9sbGluZyxleWVzXCJ9LFwibGlicmFcIjp7XCJuYW1lXCI6XCJMaWJyYVwiLFwidW5pZmllZFwiOlwiMjY0RVwiLFwidmFyaWF0aW9uc1wiOltcIjI2NEUtRkUwRlwiXSxcInNoZWV0X3hcIjoxLFwic2hlZXRfeVwiOjMyLFwic2hvcnRfbmFtZXNcIjpbXCJsaWJyYVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNpZ25cIixcInB1cnBsZS1zcXVhcmVcIixcInpvZGlhY1wiLFwiYXN0cm9sb2d5XCJdLFwic2VhcmNoXCI6XCJsaWJyYSxzaWduLHB1cnBsZS1zcXVhcmUsem9kaWFjLGFzdHJvbG9neVwifSxcInN0ZXdcIjp7XCJuYW1lXCI6XCJQb3Qgb2YgRm9vZFwiLFwidW5pZmllZFwiOlwiMUYzNzJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo4LFwic2hlZXRfeVwiOjEwLFwic2hvcnRfbmFtZXNcIjpbXCJzdGV3XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZm9vZFwiLFwibWVhdFwiLFwic291cFwiXSxcInNlYXJjaFwiOlwic3Rldyxwb3Qsb2YsZm9vZCxtZWF0LHNvdXBcIn0sXCJzcG9ydHNfbWVkYWxcIjp7XCJuYW1lXCI6XCJTcG9ydHMgTWVkYWxcIixcInVuaWZpZWRcIjpcIjFGM0M1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTAsXCJzaGVldF95XCI6MjEsXCJzaG9ydF9uYW1lc1wiOltcInNwb3J0c19tZWRhbFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImF3YXJkXCIsXCJ3aW5uaW5nXCJdLFwic2VhcmNoXCI6XCJzcG9ydHMsbWVkYWwsYXdhcmQsd2lubmluZ1wifSxcImZsYWctYm5cIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQk5cIixcInVuaWZpZWRcIjpcIjFGMUU3LTFGMUYzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzMsXCJzaGVldF95XCI6MjAsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctYm5cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxibixyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJhbGFybV9jbG9ja1wiOntcIm5hbWVcIjpcIkFsYXJtIENsb2NrXCIsXCJ1bmlmaWVkXCI6XCIyM0YwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MCxcInNoZWV0X3lcIjoyNSxcInNob3J0X25hbWVzXCI6W1wiYWxhcm1fY2xvY2tcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ0aW1lXCIsXCJ3YWtlXCJdLFwic2VhcmNoXCI6XCJhbGFybSxjbG9jayx0aW1lLHdha2VcIn0sXCJ0cmFtXCI6e1wibmFtZVwiOlwiVHJhbVwiLFwidW5pZmllZFwiOlwiMUY2OEFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyOSxcInNoZWV0X3lcIjoyMixcInNob3J0X25hbWVzXCI6W1widHJhbVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRyYW5zcG9ydGF0aW9uXCIsXCJ2ZWhpY2xlXCJdLFwic2VhcmNoXCI6XCJ0cmFtLHRyYW5zcG9ydGF0aW9uLHZlaGljbGVcIn0sXCJmaXNoX2Nha2VcIjp7XCJuYW1lXCI6XCJGaXNoIENha2Ugd2l0aCBTd2lybCBEZXNpZ25cIixcInVuaWZpZWRcIjpcIjFGMzY1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NyxcInNoZWV0X3lcIjozOCxcInNob3J0X25hbWVzXCI6W1wiZmlzaF9jYWtlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZm9vZFwiLFwiamFwYW5cIixcInNlYVwiLFwiYmVhY2hcIl0sXCJzZWFyY2hcIjpcImZpc2gsY2FrZSx3aXRoLHN3aXJsLGRlc2lnbixmb29kLGphcGFuLHNlYSxiZWFjaFwifSxcInRoaW5raW5nX2ZhY2VcIjp7XCJuYW1lXCI6XCJUaGlua2luZyBGYWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjkxNFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMyLFwic2hlZXRfeVwiOjUsXCJzaG9ydF9uYW1lc1wiOltcInRoaW5raW5nX2ZhY2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwidGhpbmtpbmcsZmFjZVwifSxcIm1lZGFsXCI6e1wibmFtZVwiOlwiTWlsaXRhcnkgTWVkYWxcIixcInVuaWZpZWRcIjpcIjFGMzk2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OSxcInNoZWV0X3lcIjo4LFwic2hvcnRfbmFtZXNcIjpbXCJtZWRhbFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJtZWRhbCxtaWxpdGFyeVwifSxcIm1hbnRlbHBpZWNlX2Nsb2NrXCI6e1wibmFtZVwiOlwiTWFudGVscGllY2UgQ2xvY2tcIixcInVuaWZpZWRcIjpcIjFGNTcwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjQsXCJzaGVldF95XCI6MzYsXCJzaG9ydF9uYW1lc1wiOltcIm1hbnRlbHBpZWNlX2Nsb2NrXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widGltZVwiXSxcInNlYXJjaFwiOlwibWFudGVscGllY2UsY2xvY2ssdGltZVwifSxcInN0YXRpb25cIjp7XCJuYW1lXCI6XCJTdGF0aW9uXCIsXCJ1bmlmaWVkXCI6XCIxRjY4OVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI5LFwic2hlZXRfeVwiOjIxLFwic2hvcnRfbmFtZXNcIjpbXCJzdGF0aW9uXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widHJhbnNwb3J0YXRpb25cIixcInZlaGljbGVcIixcInB1YmxpY1wiXSxcInNlYXJjaFwiOlwic3RhdGlvbix0cmFuc3BvcnRhdGlvbix2ZWhpY2xlLHB1YmxpY1wifSxcImZsYWctYmdcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQkdcIixcInVuaWZpZWRcIjpcIjFGMUU3LTFGMUVDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzMsXCJzaGVldF95XCI6MTQsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctYmdcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxiZyxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJhbnRcIjp7XCJuYW1lXCI6XCJBbnRcIixcInVuaWZpZWRcIjpcIjFGNDFDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTIsXCJzaGVldF95XCI6MzMsXCJzaG9ydF9uYW1lc1wiOltcImFudFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwiaW5zZWN0XCIsXCJuYXR1cmVcIixcImJ1Z1wiXSxcInNlYXJjaFwiOlwiYW50LGFuaW1hbCxpbnNlY3QsbmF0dXJlLGJ1Z1wifSxcInNjb3JwaXVzXCI6e1wibmFtZVwiOlwiU2NvcnBpdXNcIixcInVuaWZpZWRcIjpcIjI2NEZcIixcInZhcmlhdGlvbnNcIjpbXCIyNjRGLUZFMEZcIl0sXCJzaGVldF94XCI6MSxcInNoZWV0X3lcIjozMyxcInNob3J0X25hbWVzXCI6W1wic2NvcnBpdXNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzaWduXCIsXCJ6b2RpYWNcIixcInB1cnBsZS1zcXVhcmVcIixcImFzdHJvbG9neVwiLFwic2NvcnBpb1wiXSxcInNlYXJjaFwiOlwic2NvcnBpdXMsc2lnbix6b2RpYWMscHVycGxlLXNxdWFyZSxhc3Ryb2xvZ3ksc2NvcnBpb1wifSxcInN1c2hpXCI6e1wibmFtZVwiOlwiU3VzaGlcIixcInVuaWZpZWRcIjpcIjFGMzYzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NyxcInNoZWV0X3lcIjozNixcInNob3J0X25hbWVzXCI6W1wic3VzaGlcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmb29kXCIsXCJmaXNoXCIsXCJqYXBhbmVzZVwiLFwicmljZVwiXSxcInNlYXJjaFwiOlwic3VzaGksZm9vZCxmaXNoLGphcGFuZXNlLHJpY2VcIn0sXCJmbHVzaGVkXCI6e1wibmFtZVwiOlwiRmx1c2hlZCBGYWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjYzM1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI3LFwic2hlZXRfeVwiOjI1LFwic2hvcnRfbmFtZXNcIjpbXCJmbHVzaGVkXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmFjZVwiLFwiYmx1c2hcIixcInNoeVwiLFwiZmxhdHRlcmVkXCJdLFwic2VhcmNoXCI6XCJmbHVzaGVkLGZhY2UsYmx1c2gsc2h5LGZsYXR0ZXJlZFwifSxcInNwaWRlclwiOntcIm5hbWVcIjpcIlNwaWRlclwiLFwidW5pZmllZFwiOlwiMUY1NzdcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNSxcInNoZWV0X3lcIjo1LFwic2hvcnRfbmFtZXNcIjpbXCJzcGlkZXJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcImFyYWNobmlkXCJdLFwic2VhcmNoXCI6XCJzcGlkZXIsYW5pbWFsLGFyYWNobmlkXCJ9LFwicmVtaW5kZXJfcmliYm9uXCI6e1wibmFtZVwiOlwiUmVtaW5kZXIgUmliYm9uXCIsXCJ1bmlmaWVkXCI6XCIxRjM5N1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjksXCJzaGVldF95XCI6OSxcInNob3J0X25hbWVzXCI6W1wicmVtaW5kZXJfcmliYm9uXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic3BvcnRzXCIsXCJjYXVzZVwiLFwic3VwcHJ0XCIsXCJhd2FyZW5lc3NcIl0sXCJzZWFyY2hcIjpcInJlbWluZGVyLHJpYmJvbixzcG9ydHMsY2F1c2Usc3VwcHJ0LGF3YXJlbmVzc1wifSxcImhlbGljb3B0ZXJcIjp7XCJuYW1lXCI6XCJIZWxpY29wdGVyXCIsXCJ1bmlmaWVkXCI6XCIxRjY4MVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI5LFwic2hlZXRfeVwiOjEzLFwic2hvcnRfbmFtZXNcIjpbXCJoZWxpY29wdGVyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widHJhbnNwb3J0YXRpb25cIixcInZlaGljbGVcIixcImZseVwiXSxcInNlYXJjaFwiOlwiaGVsaWNvcHRlcix0cmFuc3BvcnRhdGlvbix2ZWhpY2xlLGZseVwifSxcInNhZ2l0dGFyaXVzXCI6e1wibmFtZVwiOlwiU2FnaXR0YXJpdXNcIixcInVuaWZpZWRcIjpcIjI2NTBcIixcInZhcmlhdGlvbnNcIjpbXCIyNjUwLUZFMEZcIl0sXCJzaGVldF94XCI6MSxcInNoZWV0X3lcIjozNCxcInNob3J0X25hbWVzXCI6W1wic2FnaXR0YXJpdXNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzaWduXCIsXCJ6b2RpYWNcIixcInB1cnBsZS1zcXVhcmVcIixcImFzdHJvbG9neVwiXSxcInNlYXJjaFwiOlwic2FnaXR0YXJpdXMsc2lnbix6b2RpYWMscHVycGxlLXNxdWFyZSxhc3Ryb2xvZ3lcIn0sXCJmbGFnLWJmXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEJGXCIsXCJ1bmlmaWVkXCI6XCIxRjFFNy0xRjFFQlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMzLFwic2hlZXRfeVwiOjEzLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWJmXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsYmYscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiaG91cmdsYXNzX2Zsb3dpbmdfc2FuZFwiOntcIm5hbWVcIjpcIkhvdXJnbGFzcyB3aXRoIEZsb3dpbmcgU2FuZFwiLFwidW5pZmllZFwiOlwiMjNGM1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjAsXCJzaGVldF95XCI6MjgsXCJzaG9ydF9uYW1lc1wiOltcImhvdXJnbGFzc19mbG93aW5nX3NhbmRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJvbGRzY2hvb2xcIixcInRpbWVcIixcImNvdW50ZG93blwiXSxcInNlYXJjaFwiOlwiaG91cmdsYXNzLGZsb3dpbmcsc2FuZCx3aXRoLG9sZHNjaG9vbCx0aW1lLGNvdW50ZG93blwifSxcInNtYWxsX2FpcnBsYW5lXCI6e1wibmFtZVwiOlwiU21hbGwgQWlycGxhbmVcIixcInVuaWZpZWRcIjpcIjFGNkU5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzEsXCJzaGVldF95XCI6MzcsXCJzaG9ydF9uYW1lc1wiOltcInNtYWxsX2FpcnBsYW5lXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmxpZ2h0XCIsXCJ0cmFuc3BvcnRhdGlvblwiLFwiZmx5XCIsXCJ2ZWhpY2xlXCJdLFwic2VhcmNoXCI6XCJzbWFsbCxhaXJwbGFuZSxmbGlnaHQsdHJhbnNwb3J0YXRpb24sZmx5LHZlaGljbGVcIn0sXCJyb3NldHRlXCI6e1wibmFtZVwiOlwiUm9zZXR0ZVwiLFwidW5pZmllZFwiOlwiMUYzRjVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMSxcInNoZWV0X3lcIjozNixcInNob3J0X25hbWVzXCI6W1wicm9zZXR0ZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZsb3dlclwiLFwiZGVjb3JhdGlvblwiLFwibWlsaXRhcnlcIl0sXCJzZWFyY2hcIjpcInJvc2V0dGUsZmxvd2VyLGRlY29yYXRpb24sbWlsaXRhcnlcIn0sXCJiZW50b1wiOntcIm5hbWVcIjpcIkJlbnRvIEJveFwiLFwidW5pZmllZFwiOlwiMUYzNzFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo4LFwic2hlZXRfeVwiOjksXCJzaG9ydF9uYW1lc1wiOltcImJlbnRvXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZm9vZFwiLFwiamFwYW5lc2VcIixcImJveFwiXSxcInNlYXJjaFwiOlwiYmVudG8sYm94LGZvb2QsamFwYW5lc2VcIn0sXCJjYXByaWNvcm5cIjp7XCJuYW1lXCI6XCJDYXByaWNvcm5cIixcInVuaWZpZWRcIjpcIjI2NTFcIixcInZhcmlhdGlvbnNcIjpbXCIyNjUxLUZFMEZcIl0sXCJzaGVldF94XCI6MSxcInNoZWV0X3lcIjozNSxcInNob3J0X25hbWVzXCI6W1wiY2Fwcmljb3JuXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic2lnblwiLFwiem9kaWFjXCIsXCJwdXJwbGUtc3F1YXJlXCIsXCJhc3Ryb2xvZ3lcIl0sXCJzZWFyY2hcIjpcImNhcHJpY29ybixzaWduLHpvZGlhYyxwdXJwbGUtc3F1YXJlLGFzdHJvbG9neVwifSxcImZsYWctYmlcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQklcIixcInVuaWZpZWRcIjpcIjFGMUU3LTFGMUVFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzMsXCJzaGVldF95XCI6MTYsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctYmlcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxiaSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJkaXNhcHBvaW50ZWRcIjp7XCJuYW1lXCI6XCJEaXNhcHBvaW50ZWQgRmFjZVwiLFwidW5pZmllZFwiOlwiMUY2MUVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNyxcInNoZWV0X3lcIjo0LFwic2hvcnRfbmFtZXNcIjpbXCJkaXNhcHBvaW50ZWRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltcIik6XCIsXCI6KFwiLFwiOi0oXCJdLFwia2V5d29yZHNcIjpbXCJmYWNlXCIsXCJzYWRcIixcInVwc2V0XCIsXCJkZXByZXNzZWRcIixcIjooXCJdLFwic2VhcmNoXCI6XCJkaXNhcHBvaW50ZWQsZmFjZSxzYWQsdXBzZXQsZGVwcmVzc2VkLDooLCk6LDotKFwifSxcInNjb3JwaW9uXCI6e1wibmFtZVwiOlwiU2NvcnBpb25cIixcInVuaWZpZWRcIjpcIjFGOTgyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzIsXCJzaGVldF95XCI6MTcsXCJzaG9ydF9uYW1lc1wiOltcInNjb3JwaW9uXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJhcmFjaG5pZFwiXSxcInNlYXJjaFwiOlwic2NvcnBpb24sYW5pbWFsLGFyYWNobmlkXCJ9LFwiaG91cmdsYXNzXCI6e1wibmFtZVwiOlwiSG91cmdsYXNzXCIsXCJ1bmlmaWVkXCI6XCIyMzFCXCIsXCJ2YXJpYXRpb25zXCI6W1wiMjMxQi1GRTBGXCJdLFwic2hlZXRfeFwiOjAsXCJzaGVldF95XCI6MTUsXCJzaG9ydF9uYW1lc1wiOltcImhvdXJnbGFzc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRpbWVcIixcImNsb2NrXCIsXCJvbGRzY2hvb2xcIixcImxpbWl0XCIsXCJleGFtXCIsXCJxdWl6XCIsXCJ0ZXN0XCJdLFwic2VhcmNoXCI6XCJob3VyZ2xhc3MsdGltZSxjbG9jayxvbGRzY2hvb2wsbGltaXQsZXhhbSxxdWl6LHRlc3RcIn0sXCJjcmFiXCI6e1wibmFtZVwiOlwiQ3JhYlwiLFwidW5pZmllZFwiOlwiMUY5ODBcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMixcInNoZWV0X3lcIjoxNSxcInNob3J0X25hbWVzXCI6W1wiY3JhYlwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwiY3J1c3RhY2VhblwiXSxcInNlYXJjaFwiOlwiY3JhYixhbmltYWwsY3J1c3RhY2VhblwifSxcInNhdGVsbGl0ZV9hbnRlbm5hXCI6e1wibmFtZVwiOlwiU2F0ZWxsaXRlIEFudGVubmFcIixcInVuaWZpZWRcIjpcIjFGNEUxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjEsXCJzaGVldF95XCI6MzYsXCJzaG9ydF9uYW1lc1wiOltcInNhdGVsbGl0ZV9hbnRlbm5hXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcInNhdGVsbGl0ZSxhbnRlbm5hXCJ9LFwiYWlycGxhbmVcIjp7XCJuYW1lXCI6XCJBaXJwbGFuZVwiLFwidW5pZmllZFwiOlwiMjcwOFwiLFwidmFyaWF0aW9uc1wiOltcIjI3MDgtRkUwRlwiXSxcInNoZWV0X3hcIjozLFwic2hlZXRfeVwiOjcsXCJzaG9ydF9uYW1lc1wiOltcImFpcnBsYW5lXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widmVoaWNsZVwiLFwidHJhbnNwb3J0YXRpb25cIixcImZsaWdodFwiLFwiZmx5XCJdLFwic2VhcmNoXCI6XCJhaXJwbGFuZSx2ZWhpY2xlLHRyYW5zcG9ydGF0aW9uLGZsaWdodCxmbHlcIn0sXCJhcXVhcml1c1wiOntcIm5hbWVcIjpcIkFxdWFyaXVzXCIsXCJ1bmlmaWVkXCI6XCIyNjUyXCIsXCJ2YXJpYXRpb25zXCI6W1wiMjY1Mi1GRTBGXCJdLFwic2hlZXRfeFwiOjEsXCJzaGVldF95XCI6MzYsXCJzaG9ydF9uYW1lc1wiOltcImFxdWFyaXVzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic2lnblwiLFwicHVycGxlLXNxdWFyZVwiLFwiem9kaWFjXCIsXCJhc3Ryb2xvZ3lcIl0sXCJzZWFyY2hcIjpcImFxdWFyaXVzLHNpZ24scHVycGxlLXNxdWFyZSx6b2RpYWMsYXN0cm9sb2d5XCJ9LFwidGlja2V0XCI6e1wibmFtZVwiOlwiVGlja2V0XCIsXCJ1bmlmaWVkXCI6XCIxRjNBQlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjksXCJzaGVldF95XCI6MjYsXCJzaG9ydF9uYW1lc1wiOltcInRpY2tldFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImV2ZW50XCIsXCJjb25jZXJ0XCIsXCJwYXNzXCJdLFwic2VhcmNoXCI6XCJ0aWNrZXQsZXZlbnQsY29uY2VydCxwYXNzXCJ9LFwid29ycmllZFwiOntcIm5hbWVcIjpcIldvcnJpZWQgRmFjZVwiLFwidW5pZmllZFwiOlwiMUY2MUZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNyxcInNoZWV0X3lcIjo1LFwic2hvcnRfbmFtZXNcIjpbXCJ3b3JyaWVkXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmFjZVwiLFwiY29uY2VyblwiLFwibmVydm91c1wiLFwiOihcIl0sXCJzZWFyY2hcIjpcIndvcnJpZWQsZmFjZSxjb25jZXJuLG5lcnZvdXMsOihcIn0sXCJmbGFnLWN2XCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIENWXCIsXCJ1bmlmaWVkXCI6XCIxRjFFOC0xRjFGQlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM0LFwic2hlZXRfeVwiOjQsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctY3ZcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxjdixyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJjdXJyeVwiOntcIm5hbWVcIjpcIkN1cnJ5IGFuZCBSaWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjM1QlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjcsXCJzaGVldF95XCI6MjgsXCJzaG9ydF9uYW1lc1wiOltcImN1cnJ5XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZm9vZFwiLFwic3BpY3lcIixcImhvdFwiLFwiaW5kaWFuXCJdLFwic2VhcmNoXCI6XCJjdXJyeSxhbmQscmljZSxmb29kLHNwaWN5LGhvdCxpbmRpYW5cIn0sXCJwaXNjZXNcIjp7XCJuYW1lXCI6XCJQaXNjZXNcIixcInVuaWZpZWRcIjpcIjI2NTNcIixcInZhcmlhdGlvbnNcIjpbXCIyNjUzLUZFMEZcIl0sXCJzaGVldF94XCI6MSxcInNoZWV0X3lcIjozNyxcInNob3J0X25hbWVzXCI6W1wicGlzY2VzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicHVycGxlLXNxdWFyZVwiLFwic2lnblwiLFwiem9kaWFjXCIsXCJhc3Ryb2xvZ3lcIl0sXCJzZWFyY2hcIjpcInBpc2NlcyxwdXJwbGUtc3F1YXJlLHNpZ24sem9kaWFjLGFzdHJvbG9neVwifSxcImFpcnBsYW5lX2RlcGFydHVyZVwiOntcIm5hbWVcIjpcIkFpcnBsYW5lIERlcGFydHVyZVwiLFwidW5pZmllZFwiOlwiMUY2RUJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMSxcInNoZWV0X3lcIjozOCxcInNob3J0X25hbWVzXCI6W1wiYWlycGxhbmVfZGVwYXJ0dXJlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYWlycG9ydFwiLFwiZmxpZ2h0XCIsXCJsYW5kaW5nXCJdLFwic2VhcmNoXCI6XCJhaXJwbGFuZSxkZXBhcnR1cmUsYWlycG9ydCxmbGlnaHQsbGFuZGluZ1wifSxcImZsYWcta2hcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgS0hcIixcInVuaWZpZWRcIjpcIjFGMUYwLTFGMUVEXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzUsXCJzaGVldF95XCI6MzIsXCJzaG9ydF9uYW1lc1wiOltcImZsYWcta2hcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxraCxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJiYXR0ZXJ5XCI6e1wibmFtZVwiOlwiQmF0dGVyeVwiLFwidW5pZmllZFwiOlwiMUY1MEJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMixcInNoZWV0X3lcIjozNixcInNob3J0X25hbWVzXCI6W1wiYmF0dGVyeVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBvd2VyXCIsXCJlbmVyZ3lcIixcInN1c3RhaW5cIl0sXCJzZWFyY2hcIjpcImJhdHRlcnkscG93ZXIsZW5lcmd5LHN1c3RhaW5cIn0sXCJzbmFrZVwiOntcIm5hbWVcIjpcIlNuYWtlXCIsXCJ1bmlmaWVkXCI6XCIxRjQwRFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEyLFwic2hlZXRfeVwiOjE4LFwic2hvcnRfbmFtZXNcIjpbXCJzbmFrZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwiZXZpbFwiLFwibmF0dXJlXCIsXCJoaXNzXCIsXCJweXRob25cIl0sXCJzZWFyY2hcIjpcInNuYWtlLGFuaW1hbCxldmlsLG5hdHVyZSxoaXNzLHB5dGhvblwifSxcImFuZ3J5XCI6e1wibmFtZVwiOlwiQW5ncnkgRmFjZVwiLFwidW5pZmllZFwiOlwiMUY2MjBcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNyxcInNoZWV0X3lcIjo2LFwic2hvcnRfbmFtZXNcIjpbXCJhbmdyeVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W1wiPjooXCIsXCI+Oi0oXCJdLFwia2V5d29yZHNcIjpbXCJtYWRcIixcImZhY2VcIixcImFubm95ZWRcIixcImZydXN0cmF0ZWRcIl0sXCJzZWFyY2hcIjpcImFuZ3J5LGZhY2UsbWFkLGFubm95ZWQsZnJ1c3RyYXRlZCw+OigsPjotKFwifSxcInJpY2VfYmFsbFwiOntcIm5hbWVcIjpcIlJpY2UgQmFsbFwiLFwidW5pZmllZFwiOlwiMUYzNTlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo3LFwic2hlZXRfeVwiOjI2LFwic2hvcnRfbmFtZXNcIjpbXCJyaWNlX2JhbGxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmb29kXCIsXCJqYXBhbmVzZVwiXSxcInNlYXJjaFwiOlwicmljZSxiYWxsLGZvb2QsamFwYW5lc2VcIn0sXCJhZG1pc3Npb25fdGlja2V0c1wiOntcIm5hbWVcIjpcIkFkbWlzc2lvbiBUaWNrZXRzXCIsXCJ1bmlmaWVkXCI6XCIxRjM5RlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjksXCJzaGVldF95XCI6MTQsXCJzaG9ydF9uYW1lc1wiOltcImFkbWlzc2lvbl90aWNrZXRzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImFkbWlzc2lvbix0aWNrZXRzXCJ9LFwicGVyZm9ybWluZ19hcnRzXCI6e1wibmFtZVwiOlwiUGVyZm9ybWluZyBBcnRzXCIsXCJ1bmlmaWVkXCI6XCIxRjNBRFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjksXCJzaGVldF95XCI6MjgsXCJzaG9ydF9uYW1lc1wiOltcInBlcmZvcm1pbmdfYXJ0c1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFjdGluZ1wiLFwidGhlYXRlclwiLFwiZHJhbWFcIl0sXCJzZWFyY2hcIjpcInBlcmZvcm1pbmcsYXJ0cyxhY3RpbmcsdGhlYXRlcixkcmFtYVwifSxcInJhZ2VcIjp7XCJuYW1lXCI6XCJQb3V0aW5nIEZhY2VcIixcInVuaWZpZWRcIjpcIjFGNjIxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjcsXCJzaGVldF95XCI6NyxcInNob3J0X25hbWVzXCI6W1wicmFnZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuZ3J5XCIsXCJtYWRcIixcImhhdGVcIixcImRlc3Bpc2VcIl0sXCJzZWFyY2hcIjpcInJhZ2UscG91dGluZyxmYWNlLGFuZ3J5LG1hZCxoYXRlLGRlc3Bpc2VcIn0sXCJyaWNlXCI6e1wibmFtZVwiOlwiQ29va2VkIFJpY2VcIixcInVuaWZpZWRcIjpcIjFGMzVBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NyxcInNoZWV0X3lcIjoyNyxcInNob3J0X25hbWVzXCI6W1wicmljZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZvb2RcIixcImNoaW5hXCIsXCJhc2lhblwiXSxcInNlYXJjaFwiOlwicmljZSxjb29rZWQsZm9vZCxjaGluYSxhc2lhblwifSxcImFpcnBsYW5lX2Fycml2aW5nXCI6e1wibmFtZVwiOlwiQWlycGxhbmUgQXJyaXZpbmdcIixcInVuaWZpZWRcIjpcIjFGNkVDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzEsXCJzaGVldF95XCI6MzksXCJzaG9ydF9uYW1lc1wiOltcImFpcnBsYW5lX2Fycml2aW5nXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImFpcnBsYW5lLGFycml2aW5nXCJ9LFwiaWRcIjp7XCJuYW1lXCI6XCJTcXVhcmVkIElkXCIsXCJ1bmlmaWVkXCI6XCIxRjE5NFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjQsXCJzaGVldF95XCI6NDAsXCJzaG9ydF9uYW1lc1wiOltcImlkXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicHVycGxlLXNxdWFyZVwiLFwid29yZHNcIl0sXCJzZWFyY2hcIjpcImlkLHNxdWFyZWQscHVycGxlLXNxdWFyZSx3b3Jkc1wifSxcImZsYWctY21cIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQ01cIixcInVuaWZpZWRcIjpcIjFGMUU4LTFGMUYyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzMsXCJzaGVldF95XCI6MzksXCJzaG9ydF9uYW1lc1wiOltcImZsYWctY21cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxjbSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJ0dXJ0bGVcIjp7XCJuYW1lXCI6XCJUdXJ0bGVcIixcInVuaWZpZWRcIjpcIjFGNDIyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTIsXCJzaGVldF95XCI6MzksXCJzaG9ydF9uYW1lc1wiOltcInR1cnRsZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwic2xvd1wiLFwibmF0dXJlXCIsXCJ0b3J0b2lzZVwiXSxcInNlYXJjaFwiOlwidHVydGxlLGFuaW1hbCxzbG93LG5hdHVyZSx0b3J0b2lzZVwifSxcImVsZWN0cmljX3BsdWdcIjp7XCJuYW1lXCI6XCJFbGVjdHJpYyBQbHVnXCIsXCJ1bmlmaWVkXCI6XCIxRjUwQ1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIyLFwic2hlZXRfeVwiOjM3LFwic2hvcnRfbmFtZXNcIjpbXCJlbGVjdHJpY19wbHVnXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiY2hhcmdlclwiLFwicG93ZXJcIl0sXCJzZWFyY2hcIjpcImVsZWN0cmljLHBsdWcsY2hhcmdlcixwb3dlclwifSxcInRyb3BpY2FsX2Zpc2hcIjp7XCJuYW1lXCI6XCJUcm9waWNhbCBGaXNoXCIsXCJ1bmlmaWVkXCI6XCIxRjQyMFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEyLFwic2hlZXRfeVwiOjM3LFwic2hvcnRfbmFtZXNcIjpbXCJ0cm9waWNhbF9maXNoXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJzd2ltXCIsXCJvY2VhblwiLFwiYmVhY2hcIixcIm5lbW9cIl0sXCJzZWFyY2hcIjpcInRyb3BpY2FsLGZpc2gsYW5pbWFsLHN3aW0sb2NlYW4sYmVhY2gsbmVtb1wifSxcImJ1bGJcIjp7XCJuYW1lXCI6XCJFbGVjdHJpYyBMaWdodCBCdWxiXCIsXCJ1bmlmaWVkXCI6XCIxRjRBMVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIwLFwic2hlZXRfeVwiOjgsXCJzaG9ydF9uYW1lc1wiOltcImJ1bGJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJsaWdodFwiLFwiZWxlY3RyaWNpdHlcIixcImlkZWFcIl0sXCJzZWFyY2hcIjpcImJ1bGIsZWxlY3RyaWMsbGlnaHQsZWxlY3RyaWNpdHksaWRlYVwifSxcInBlbnNpdmVcIjp7XCJuYW1lXCI6XCJQZW5zaXZlIEZhY2VcIixcInVuaWZpZWRcIjpcIjFGNjE0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjYsXCJzaGVldF95XCI6MzUsXCJzaG9ydF9uYW1lc1wiOltcInBlbnNpdmVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmYWNlXCIsXCJzYWRcIixcImRlcHJlc3NlZFwiLFwib2theVwiLFwidXBzZXRcIl0sXCJzZWFyY2hcIjpcInBlbnNpdmUsZmFjZSxzYWQsZGVwcmVzc2VkLG9rYXksdXBzZXRcIn0sXCJyaWNlX2NyYWNrZXJcIjp7XCJuYW1lXCI6XCJSaWNlIENyYWNrZXJcIixcInVuaWZpZWRcIjpcIjFGMzU4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NyxcInNoZWV0X3lcIjoyNSxcInNob3J0X25hbWVzXCI6W1wicmljZV9jcmFja2VyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZm9vZFwiLFwiamFwYW5lc2VcIl0sXCJzZWFyY2hcIjpcInJpY2UsY3JhY2tlcixmb29kLGphcGFuZXNlXCJ9LFwiYXJ0XCI6e1wibmFtZVwiOlwiQXJ0aXN0IFBhbGV0dGVcIixcInVuaWZpZWRcIjpcIjFGM0E4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OSxcInNoZWV0X3lcIjoyMyxcInNob3J0X25hbWVzXCI6W1wiYXJ0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZGVzaWduXCIsXCJwYWludFwiLFwiZHJhd1wiLFwiY29sb3JzXCJdLFwic2VhcmNoXCI6XCJhcnQsYXJ0aXN0LHBhbGV0dGUsZGVzaWduLHBhaW50LGRyYXcsY29sb3JzXCJ9LFwiYm9hdFwiOntcIm5hbWVcIjpcIlNhaWxib2F0XCIsXCJ1bmlmaWVkXCI6XCIyNkY1XCIsXCJ2YXJpYXRpb25zXCI6W1wiMjZGNS1GRTBGXCJdLFwic2hlZXRfeFwiOjIsXCJzaGVldF95XCI6MzUsXCJzaG9ydF9uYW1lc1wiOltcImJvYXRcIixcInNhaWxib2F0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic2hpcFwiLFwic3VtbWVyXCIsXCJ0cmFuc3BvcnRhdGlvblwiLFwid2F0ZXJcIixcInNhaWxpbmdcIixcInNhaWxib2F0XCJdLFwic2VhcmNoXCI6XCJib2F0LHNhaWxib2F0LHNoaXAsc3VtbWVyLHRyYW5zcG9ydGF0aW9uLHdhdGVyLHNhaWxpbmdcIn0sXCJhdG9tX3N5bWJvbFwiOntcIm5hbWVcIjpcIkF0b20gU3ltYm9sXCIsXCJ1bmlmaWVkXCI6XCIyNjlCXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MixcInNoZWV0X3lcIjoxMCxcInNob3J0X25hbWVzXCI6W1wiYXRvbV9zeW1ib2xcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzY2llbmNlXCJdLFwic2VhcmNoXCI6XCJhdG9tLHN5bWJvbCxzY2llbmNlXCJ9LFwiZmxhZy1jYVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBDQVwiLFwidW5pZmllZFwiOlwiMUYxRTgtMUYxRTZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMyxcInNoZWV0X3lcIjozMCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1jYVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGNhLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcIm9kZW5cIjp7XCJuYW1lXCI6XCJPZGVuXCIsXCJ1bmlmaWVkXCI6XCIxRjM2MlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjcsXCJzaGVldF95XCI6MzUsXCJzaG9ydF9uYW1lc1wiOltcIm9kZW5cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmb29kXCIsXCJqYXBhbmVzZVwiXSxcInNlYXJjaFwiOlwib2Rlbixmb29kLGphcGFuZXNlXCJ9LFwiZmxhc2hsaWdodFwiOntcIm5hbWVcIjpcIkVsZWN0cmljIFRvcmNoXCIsXCJ1bmlmaWVkXCI6XCIxRjUyNlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIzLFwic2hlZXRfeVwiOjIyLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFzaGxpZ2h0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZGFya1wiLFwiY2FtcGluZ1wiLFwic2lnaHRcIixcIm5pZ2h0XCJdLFwic2VhcmNoXCI6XCJmbGFzaGxpZ2h0LGVsZWN0cmljLHRvcmNoLGRhcmssY2FtcGluZyxzaWdodCxuaWdodFwifSxcImNvbmZ1c2VkXCI6e1wibmFtZVwiOlwiQ29uZnVzZWQgRmFjZVwiLFwidW5pZmllZFwiOlwiMUY2MTVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNixcInNoZWV0X3lcIjozNixcInNob3J0X25hbWVzXCI6W1wiY29uZnVzZWRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltcIjpcXFxcXCIsXCI6LVxcXFxcIixcIjovXCIsXCI6LS9cIl0sXCJrZXl3b3Jkc1wiOltcImZhY2VcIixcImluZGlmZmVyZW5jZVwiLFwiaHVoXCIsXCJ3ZWlyZFwiLFwiaG1tbVwiXSxcInNlYXJjaFwiOlwiY29uZnVzZWQsZmFjZSxpbmRpZmZlcmVuY2UsaHVoLHdlaXJkLGhtbW0sOlxcXFwsOi1cXFxcLDovLDotL1wifSxcInU3YTdhXCI6e1wibmFtZVwiOlwiU3F1YXJlZCBDamsgVW5pZmllZCBJZGVvZ3JhcGgtN2E3YVwiLFwidW5pZmllZFwiOlwiMUYyMzNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo1LFwic2hlZXRfeVwiOjExLFwic2hvcnRfbmFtZXNcIjpbXCJ1N2E3YVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImthbmppXCIsXCJqYXBhbmVzZVwiLFwiY2hpbmVzZVwiLFwiZW1wdHlcIixcInNreVwiLFwiYmx1ZS1zcXVhcmVcIl0sXCJzZWFyY2hcIjpcInU3YTdhLHNxdWFyZWQsY2prLHVuaWZpZWQsaWRlb2dyYXBoLDdhN2Esa2FuamksamFwYW5lc2UsY2hpbmVzZSxlbXB0eSxza3ksYmx1ZS1zcXVhcmVcIn0sXCJjaXJjdXNfdGVudFwiOntcIm5hbWVcIjpcIkNpcmN1cyBUZW50XCIsXCJ1bmlmaWVkXCI6XCIxRjNBQVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjksXCJzaGVldF95XCI6MjUsXCJzaG9ydF9uYW1lc1wiOltcImNpcmN1c190ZW50XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmVzdGl2YWxcIixcImNhcm5pdmFsXCIsXCJwYXJ0eVwiXSxcInNlYXJjaFwiOlwiY2lyY3VzLHRlbnQsZmVzdGl2YWwsY2Fybml2YWwscGFydHlcIn0sXCJtb3Rvcl9ib2F0XCI6e1wibmFtZVwiOlwiTW90b3IgQm9hdFwiLFwidW5pZmllZFwiOlwiMUY2RTVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMSxcInNoZWV0X3lcIjozNixcInNob3J0X25hbWVzXCI6W1wibW90b3JfYm9hdFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNoaXBcIl0sXCJzZWFyY2hcIjpcIm1vdG9yLGJvYXQsc2hpcFwifSxcImZsYWctaWNcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgSUNcIixcInVuaWZpZWRcIjpcIjFGMUVFLTFGMUU4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzUsXCJzaGVldF95XCI6MTUsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctaWNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsaWMscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZmlzaFwiOntcIm5hbWVcIjpcIkZpc2hcIixcInVuaWZpZWRcIjpcIjFGNDFGXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTIsXCJzaGVldF95XCI6MzYsXCJzaG9ydF9uYW1lc1wiOltcImZpc2hcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcImZvb2RcIixcIm5hdHVyZVwiXSxcInNlYXJjaFwiOlwiZmlzaCxhbmltYWwsZm9vZCxuYXR1cmVcIn0sXCJtaWNyb3Bob25lXCI6e1wibmFtZVwiOlwiTWljcm9waG9uZVwiLFwidW5pZmllZFwiOlwiMUYzQTRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo5LFwic2hlZXRfeVwiOjE5LFwic2hvcnRfbmFtZXNcIjpbXCJtaWNyb3Bob25lXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic291bmRcIixcIm11c2ljXCIsXCJQQVwiXSxcInNlYXJjaFwiOlwibWljcm9waG9uZSxzb3VuZCxtdXNpYyxwYVwifSxcImZsYWcta3lcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgS1lcIixcInVuaWZpZWRcIjpcIjFGMUYwLTFGMUZFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzUsXCJzaGVldF95XCI6MzksXCJzaG9ydF9uYW1lc1wiOltcImZsYWcta3lcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxreSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJjYW5kbGVcIjp7XCJuYW1lXCI6XCJDYW5kbGVcIixcInVuaWZpZWRcIjpcIjFGNTZGXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjQsXCJzaGVldF95XCI6MzUsXCJzaG9ydF9uYW1lc1wiOltcImNhbmRsZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZpcmVcIixcIndheFwiXSxcInNlYXJjaFwiOlwiY2FuZGxlLGZpcmUsd2F4XCJ9LFwiZGFuZ29cIjp7XCJuYW1lXCI6XCJEYW5nb1wiLFwidW5pZmllZFwiOlwiMUYzNjFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo3LFwic2hlZXRfeVwiOjM0LFwic2hvcnRfbmFtZXNcIjpbXCJkYW5nb1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZvb2RcIixcImJhcmJlY3VlXCIsXCJtZWF0XCJdLFwic2VhcmNoXCI6XCJkYW5nbyxmb29kLGJhcmJlY3VlLG1lYXRcIn0sXCJzbGlnaHRseV9mcm93bmluZ19mYWNlXCI6e1wibmFtZVwiOlwiU2xpZ2h0bHkgRnJvd25pbmcgRmFjZVwiLFwidW5pZmllZFwiOlwiMUY2NDFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNyxcInNoZWV0X3lcIjozOSxcInNob3J0X25hbWVzXCI6W1wic2xpZ2h0bHlfZnJvd25pbmdfZmFjZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJzbGlnaHRseSxmcm93bmluZyxmYWNlXCJ9LFwiYmxvd2Zpc2hcIjp7XCJuYW1lXCI6XCJCbG93ZmlzaFwiLFwidW5pZmllZFwiOlwiMUY0MjFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMixcInNoZWV0X3lcIjozOCxcInNob3J0X25hbWVzXCI6W1wiYmxvd2Zpc2hcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcIm5hdHVyZVwiLFwiZm9vZFwiLFwic2VhXCIsXCJvY2VhblwiXSxcInNlYXJjaFwiOlwiYmxvd2Zpc2gsYW5pbWFsLG5hdHVyZSxmb29kLHNlYSxvY2VhblwifSxcInU1MjcyXCI6e1wibmFtZVwiOlwiU3F1YXJlZCBDamsgVW5pZmllZCBJZGVvZ3JhcGgtNTI3MlwiLFwidW5pZmllZFwiOlwiMUYyMzlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo1LFwic2hlZXRfeVwiOjE3LFwic2hvcnRfbmFtZXNcIjpbXCJ1NTI3MlwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImN1dFwiLFwiZGl2aWRlXCIsXCJjaGluZXNlXCIsXCJrYW5qaVwiLFwicGluay1zcXVhcmVcIl0sXCJzZWFyY2hcIjpcInU1MjcyLHNxdWFyZWQsY2prLHVuaWZpZWQsaWRlb2dyYXBoLDUyNzIsY3V0LGRpdmlkZSxjaGluZXNlLGthbmppLHBpbmstc3F1YXJlXCJ9LFwic3BlZWRib2F0XCI6e1wibmFtZVwiOlwiU3BlZWRib2F0XCIsXCJ1bmlmaWVkXCI6XCIxRjZBNFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMwLFwic2hlZXRfeVwiOjEyLFwic2hvcnRfbmFtZXNcIjpbXCJzcGVlZGJvYXRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzaGlwXCIsXCJ0cmFuc3BvcnRhdGlvblwiLFwidmVoaWNsZVwiLFwic3VtbWVyXCJdLFwic2VhcmNoXCI6XCJzcGVlZGJvYXQsc2hpcCx0cmFuc3BvcnRhdGlvbix2ZWhpY2xlLHN1bW1lclwifSxcIndoaXRlX2Zyb3duaW5nX2ZhY2VcIjp7XCJuYW1lXCI6XCJXaGl0ZSBGcm93bmluZyBGYWNlXCIsXCJ1bmlmaWVkXCI6XCIyNjM5XCIsXCJ2YXJpYXRpb25zXCI6W1wiMjYzOS1GRTBGXCJdLFwic2hlZXRfeFwiOjEsXCJzaGVldF95XCI6MjQsXCJzaG9ydF9uYW1lc1wiOltcIndoaXRlX2Zyb3duaW5nX2ZhY2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwid2hpdGUsZnJvd25pbmcsZmFjZVwifSxcImRvbHBoaW5cIjp7XCJuYW1lXCI6XCJEb2xwaGluXCIsXCJ1bmlmaWVkXCI6XCIxRjQyQ1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEzLFwic2hlZXRfeVwiOjgsXCJzaG9ydF9uYW1lc1wiOltcImRvbHBoaW5cIixcImZsaXBwZXJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcIm5hdHVyZVwiLFwiZmlzaFwiLFwic2VhXCIsXCJvY2VhblwiLFwiZmxpcHBlclwiLFwiZmluc1wiLFwiYmVhY2hcIl0sXCJzZWFyY2hcIjpcImRvbHBoaW4sZmxpcHBlcixhbmltYWwsbmF0dXJlLGZpc2gsc2VhLG9jZWFuLGZpbnMsYmVhY2hcIn0sXCJyYWRpb2FjdGl2ZV9zaWduXCI6e1wibmFtZVwiOlwiUmFkaW9hY3RpdmUgU2lnblwiLFwidW5pZmllZFwiOlwiMjYyMlwiLFwidmFyaWF0aW9uc1wiOltcIjI2MjItRkUwRlwiXSxcInNoZWV0X3hcIjoxLFwic2hlZXRfeVwiOjE3LFwic2hvcnRfbmFtZXNcIjpbXCJyYWRpb2FjdGl2ZV9zaWduXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibnVjbGVhclwiLFwiZGFuZ2VyXCJdLFwic2VhcmNoXCI6XCJyYWRpb2FjdGl2ZSxzaWduLG51Y2xlYXIsZGFuZ2VyXCJ9LFwiaGVhZHBob25lc1wiOntcIm5hbWVcIjpcIkhlYWRwaG9uZVwiLFwidW5pZmllZFwiOlwiMUYzQTdcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo5LFwic2hlZXRfeVwiOjIyLFwic2hvcnRfbmFtZXNcIjpbXCJoZWFkcGhvbmVzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibXVzaWNcIixcInNjb3JlXCIsXCJnYWRnZXRzXCJdLFwic2VhcmNoXCI6XCJoZWFkcGhvbmVzLGhlYWRwaG9uZSxtdXNpYyxzY29yZSxnYWRnZXRzXCJ9LFwiZmxhZy1jZlwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBDRlwiLFwidW5pZmllZFwiOlwiMUYxRTgtMUYxRUJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMyxcInNoZWV0X3lcIjozMyxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1jZlwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGNmLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImZlcnJ5XCI6e1wibmFtZVwiOlwiRmVycnlcIixcInVuaWZpZWRcIjpcIjI2RjRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyLFwic2hlZXRfeVwiOjM0LFwic2hvcnRfbmFtZXNcIjpbXCJmZXJyeVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJvYXRcIixcInNoaXBcIixcInlhY2h0XCJdLFwic2VhcmNoXCI6XCJmZXJyeSxib2F0LHNoaXAseWFjaHRcIn0sXCJ3YXN0ZWJhc2tldFwiOntcIm5hbWVcIjpcIldhc3RlYmFza2V0XCIsXCJ1bmlmaWVkXCI6XCIxRjVEMVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI1LFwic2hlZXRfeVwiOjM5LFwic2hvcnRfbmFtZXNcIjpbXCJ3YXN0ZWJhc2tldFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJpblwiLFwidHJhc2hcIixcInJ1YmJpc2hcIixcImdhcmJhZ2VcIixcInRvc3NcIl0sXCJzZWFyY2hcIjpcIndhc3RlYmFza2V0LGJpbix0cmFzaCxydWJiaXNoLGdhcmJhZ2UsdG9zc1wifSxcInNoYXZlZF9pY2VcIjp7XCJuYW1lXCI6XCJTaGF2ZWQgSWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjM2N1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjcsXCJzaGVldF95XCI6NDAsXCJzaG9ydF9uYW1lc1wiOltcInNoYXZlZF9pY2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJob3RcIixcImRlc3NlcnRcIixcInN1bW1lclwiXSxcInNlYXJjaFwiOlwic2hhdmVkLGljZSxob3QsZGVzc2VydCxzdW1tZXJcIn0sXCJ3aGFsZVwiOntcIm5hbWVcIjpcIlNwb3V0aW5nIFdoYWxlXCIsXCJ1bmlmaWVkXCI6XCIxRjQzM1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEzLFwic2hlZXRfeVwiOjE1LFwic2hvcnRfbmFtZXNcIjpbXCJ3aGFsZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwibmF0dXJlXCIsXCJzZWFcIixcIm9jZWFuXCJdLFwic2VhcmNoXCI6XCJ3aGFsZSxzcG91dGluZyxhbmltYWwsbmF0dXJlLHNlYSxvY2VhblwifSxcIm9pbF9kcnVtXCI6e1wibmFtZVwiOlwiT2lsIERydW1cIixcInVuaWZpZWRcIjpcIjFGNkUyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzEsXCJzaGVldF95XCI6MzMsXCJzaG9ydF9uYW1lc1wiOltcIm9pbF9kcnVtXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYmFycmVsbFwiXSxcInNlYXJjaFwiOlwib2lsLGRydW0sYmFycmVsbFwifSxcImljZV9jcmVhbVwiOntcIm5hbWVcIjpcIkljZSBDcmVhbVwiLFwidW5pZmllZFwiOlwiMUYzNjhcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo4LFwic2hlZXRfeVwiOjAsXCJzaG9ydF9uYW1lc1wiOltcImljZV9jcmVhbVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZvb2RcIixcImhvdFwiLFwiZGVzc2VydFwiXSxcInNlYXJjaFwiOlwiaWNlLGNyZWFtLGZvb2QsaG90LGRlc3NlcnRcIn0sXCJwYXNzZW5nZXJfc2hpcFwiOntcIm5hbWVcIjpcIlBhc3NlbmdlciBTaGlwXCIsXCJ1bmlmaWVkXCI6XCIxRjZGM1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMyLFwic2hlZXRfeVwiOjAsXCJzaG9ydF9uYW1lc1wiOltcInBhc3Nlbmdlcl9zaGlwXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wieWFjaHRcIixcImNydWlzZVwiLFwiZmVycnlcIl0sXCJzZWFyY2hcIjpcInBhc3NlbmdlcixzaGlwLHlhY2h0LGNydWlzZSxmZXJyeVwifSxcImJpb2hhemFyZF9zaWduXCI6e1wibmFtZVwiOlwiQmlvaGF6YXJkIFNpZ25cIixcInVuaWZpZWRcIjpcIjI2MjNcIixcInZhcmlhdGlvbnNcIjpbXCIyNjIzLUZFMEZcIl0sXCJzaGVldF94XCI6MSxcInNoZWV0X3lcIjoxOCxcInNob3J0X25hbWVzXCI6W1wiYmlvaGF6YXJkX3NpZ25cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJkYW5nZXJcIl0sXCJzZWFyY2hcIjpcImJpb2hhemFyZCxzaWduLGRhbmdlclwifSxcIm11c2ljYWxfc2NvcmVcIjp7XCJuYW1lXCI6XCJNdXNpY2FsIFNjb3JlXCIsXCJ1bmlmaWVkXCI6XCIxRjNCQ1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEwLFwic2hlZXRfeVwiOjIsXCJzaG9ydF9uYW1lc1wiOltcIm11c2ljYWxfc2NvcmVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ0cmVibGVcIixcImNsZWZcIl0sXCJzZWFyY2hcIjpcIm11c2ljYWwsc2NvcmUsdHJlYmxlLGNsZWZcIn0sXCJwZXJzZXZlcmVcIjp7XCJuYW1lXCI6XCJQZXJzZXZlcmluZyBGYWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjYyM1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI3LFwic2hlZXRfeVwiOjksXCJzaG9ydF9uYW1lc1wiOltcInBlcnNldmVyZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZhY2VcIixcInNpY2tcIixcIm5vXCIsXCJ1cHNldFwiLFwib29wc1wiXSxcInNlYXJjaFwiOlwicGVyc2V2ZXJlLHBlcnNldmVyaW5nLGZhY2Usc2ljayxubyx1cHNldCxvb3BzXCJ9LFwiZmxhZy10ZFwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBURFwiLFwidW5pZmllZFwiOlwiMUYxRjktMUYxRTlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozOCxcInNoZWV0X3lcIjo4LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXRkXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsdGQscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiaWNlY3JlYW1cIjp7XCJuYW1lXCI6XCJTb2Z0IEljZSBDcmVhbVwiLFwidW5pZmllZFwiOlwiMUYzNjZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo3LFwic2hlZXRfeVwiOjM5LFwic2hvcnRfbmFtZXNcIjpbXCJpY2VjcmVhbVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZvb2RcIixcImhvdFwiLFwiZGVzc2VydFwiLFwic3VtbWVyXCJdLFwic2VhcmNoXCI6XCJpY2VjcmVhbSxzb2Z0LGljZSxjcmVhbSxmb29kLGhvdCxkZXNzZXJ0LHN1bW1lclwifSxcIndoYWxlMlwiOntcIm5hbWVcIjpcIldoYWxlXCIsXCJ1bmlmaWVkXCI6XCIxRjQwQlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEyLFwic2hlZXRfeVwiOjE2LFwic2hvcnRfbmFtZXNcIjpbXCJ3aGFsZTJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcIm5hdHVyZVwiLFwic2VhXCIsXCJvY2VhblwiXSxcInNlYXJjaFwiOlwid2hhbGUyLHdoYWxlLGFuaW1hbCxuYXR1cmUsc2VhLG9jZWFuXCJ9LFwibXVzaWNhbF9rZXlib2FyZFwiOntcIm5hbWVcIjpcIk11c2ljYWwgS2V5Ym9hcmRcIixcInVuaWZpZWRcIjpcIjFGM0I5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OSxcInNoZWV0X3lcIjo0MCxcInNob3J0X25hbWVzXCI6W1wibXVzaWNhbF9rZXlib2FyZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBpYW5vXCIsXCJpbnN0cnVtZW50XCJdLFwic2VhcmNoXCI6XCJtdXNpY2FsLGtleWJvYXJkLHBpYW5vLGluc3RydW1lbnRcIn0sXCJtb25leV93aXRoX3dpbmdzXCI6e1wibmFtZVwiOlwiTW9uZXkgd2l0aCBXaW5nc1wiLFwidW5pZmllZFwiOlwiMUY0QjhcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMCxcInNoZWV0X3lcIjozNixcInNob3J0X25hbWVzXCI6W1wibW9uZXlfd2l0aF93aW5nc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImRvbGxhclwiLFwiYmlsbHNcIixcInBheW1lbnRcIixcInNhbGVcIl0sXCJzZWFyY2hcIjpcIm1vbmV5LHdpdGgsd2luZ3MsZG9sbGFyLGJpbGxzLHBheW1lbnQsc2FsZVwifSxcImNvbmZvdW5kZWRcIjp7XCJuYW1lXCI6XCJDb25mb3VuZGVkIEZhY2VcIixcInVuaWZpZWRcIjpcIjFGNjE2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjYsXCJzaGVldF95XCI6MzcsXCJzaG9ydF9uYW1lc1wiOltcImNvbmZvdW5kZWRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmYWNlXCIsXCJjb25mdXNlZFwiLFwic2lja1wiLFwidW53ZWxsXCIsXCJvb3BzXCJdLFwic2VhcmNoXCI6XCJjb25mb3VuZGVkLGZhY2UsY29uZnVzZWQsc2ljayx1bndlbGwsb29wc1wifSxcInJvY2tldFwiOntcIm5hbWVcIjpcIlJvY2tldFwiLFwidW5pZmllZFwiOlwiMUY2ODBcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyOSxcInNoZWV0X3lcIjoxMixcInNob3J0X25hbWVzXCI6W1wicm9ja2V0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibGF1bmNoXCIsXCJzaGlwXCIsXCJzdGFmZm1vZGVcIixcIk5BU0FcIixcIm91dGVyIHNwYWNlXCIsXCJvdXRlcl9zcGFjZVwiLFwiZmx5XCJdLFwic2VhcmNoXCI6XCJyb2NrZXQsbGF1bmNoLHNoaXAsc3RhZmZtb2RlLG5hc2Esb3V0ZXIgc3BhY2Usb3V0ZXJfc3BhY2UsZmx5XCJ9LFwibW9iaWxlX3Bob25lX29mZlwiOntcIm5hbWVcIjpcIk1vYmlsZSBQaG9uZSBvZmZcIixcInVuaWZpZWRcIjpcIjFGNEY0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjIsXCJzaGVldF95XCI6MTQsXCJzaG9ydF9uYW1lc1wiOltcIm1vYmlsZV9waG9uZV9vZmZcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJtdXRlXCIsXCJvcmFuZ2Utc3F1YXJlXCIsXCJzaWxlbmNlXCIsXCJxdWlldFwiXSxcInNlYXJjaFwiOlwibW9iaWxlLHBob25lLG9mZixtdXRlLG9yYW5nZS1zcXVhcmUsc2lsZW5jZSxxdWlldFwifSxcImZsYWctY2xcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQ0xcIixcInVuaWZpZWRcIjpcIjFGMUU4LTFGMUYxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzMsXCJzaGVldF95XCI6MzgsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctY2xcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxjbCxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJzYXRlbGxpdGVcIjp7XCJuYW1lXCI6XCJTYXRlbGxpdGVcIixcInVuaWZpZWRcIjpcIjFGNkYwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzEsXCJzaGVldF95XCI6NDAsXCJzaG9ydF9uYW1lc1wiOltcInNhdGVsbGl0ZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImNvbW11bmljYXRpb25cIixcImZ1dHVyZVwiLFwicmFkaW9cIixcInNwYWNlXCJdLFwic2VhcmNoXCI6XCJzYXRlbGxpdGUsY29tbXVuaWNhdGlvbixmdXR1cmUscmFkaW8sc3BhY2VcIn0sXCJmbGFnLWNuXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIENOXCIsXCJ1bmlmaWVkXCI6XCIxRjFFOC0xRjFGM1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMzLFwic2hlZXRfeVwiOjQwLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWNuXCIsXCJjblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGNuLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImNyb2NvZGlsZVwiOntcIm5hbWVcIjpcIkNyb2NvZGlsZVwiLFwidW5pZmllZFwiOlwiMUY0MEFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMixcInNoZWV0X3lcIjoxNSxcInNob3J0X25hbWVzXCI6W1wiY3JvY29kaWxlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJuYXR1cmVcIixcInJlcHRpbGVcIl0sXCJzZWFyY2hcIjpcImNyb2NvZGlsZSxhbmltYWwsbmF0dXJlLHJlcHRpbGVcIn0sXCJjYWtlXCI6e1wibmFtZVwiOlwiU2hvcnRjYWtlXCIsXCJ1bmlmaWVkXCI6XCIxRjM3MFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjgsXCJzaGVldF95XCI6OCxcInNob3J0X25hbWVzXCI6W1wiY2FrZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZvb2RcIixcImRlc3NlcnRcIl0sXCJzZWFyY2hcIjpcImNha2Usc2hvcnRjYWtlLGZvb2QsZGVzc2VydFwifSxcImRvbGxhclwiOntcIm5hbWVcIjpcIkJhbmtub3RlIHdpdGggRG9sbGFyIFNpZ25cIixcInVuaWZpZWRcIjpcIjFGNEI1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjAsXCJzaGVldF95XCI6MzMsXCJzaG9ydF9uYW1lc1wiOltcImRvbGxhclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm1vbmV5XCIsXCJzYWxlc1wiLFwiYmlsbFwiLFwiY3VycmVuY3lcIl0sXCJzZWFyY2hcIjpcImRvbGxhcixiYW5rbm90ZSx3aXRoLHNpZ24sbW9uZXksc2FsZXMsYmlsbCxjdXJyZW5jeVwifSxcInZpYnJhdGlvbl9tb2RlXCI6e1wibmFtZVwiOlwiVmlicmF0aW9uIE1vZGVcIixcInVuaWZpZWRcIjpcIjFGNEYzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjIsXCJzaGVldF95XCI6MTMsXCJzaG9ydF9uYW1lc1wiOltcInZpYnJhdGlvbl9tb2RlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wib3JhbmdlLXNxdWFyZVwiLFwicGhvbmVcIl0sXCJzZWFyY2hcIjpcInZpYnJhdGlvbixtb2RlLG9yYW5nZS1zcXVhcmUscGhvbmVcIn0sXCJ0aXJlZF9mYWNlXCI6e1wibmFtZVwiOlwiVGlyZWQgRmFjZVwiLFwidW5pZmllZFwiOlwiMUY2MkJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNyxcInNoZWV0X3lcIjoxNyxcInNob3J0X25hbWVzXCI6W1widGlyZWRfZmFjZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNpY2tcIixcIndoaW5lXCIsXCJ1cHNldFwiLFwiZnJ1c3RyYXRlZFwiXSxcInNlYXJjaFwiOlwidGlyZWQsZmFjZSxzaWNrLHdoaW5lLHVwc2V0LGZydXN0cmF0ZWRcIn0sXCJzYXhvcGhvbmVcIjp7XCJuYW1lXCI6XCJTYXhvcGhvbmVcIixcInVuaWZpZWRcIjpcIjFGM0I3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OSxcInNoZWV0X3lcIjozOCxcInNob3J0X25hbWVzXCI6W1wic2F4b3Bob25lXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibXVzaWNcIixcImluc3RydW1lbnRcIixcImphenpcIixcImJsdWVzXCJdLFwic2VhcmNoXCI6XCJzYXhvcGhvbmUsbXVzaWMsaW5zdHJ1bWVudCxqYXp6LGJsdWVzXCJ9LFwiZmxhZy1jeFwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBDWFwiLFwidW5pZmllZFwiOlwiMUYxRTgtMUYxRkRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNCxcInNoZWV0X3lcIjo2LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWN4XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsY3gscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwic2VhdFwiOntcIm5hbWVcIjpcIlNlYXRcIixcInVuaWZpZWRcIjpcIjFGNEJBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjAsXCJzaGVldF95XCI6MzgsXCJzaG9ydF9uYW1lc1wiOltcInNlYXRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzaXRcIixcImFpcnBsYW5lXCIsXCJ0cmFuc3BvcnRcIixcImJ1c1wiLFwiZmxpZ2h0XCIsXCJmbHlcIl0sXCJzZWFyY2hcIjpcInNlYXQsc2l0LGFpcnBsYW5lLHRyYW5zcG9ydCxidXMsZmxpZ2h0LGZseVwifSxcInRydW1wZXRcIjp7XCJuYW1lXCI6XCJUcnVtcGV0XCIsXCJ1bmlmaWVkXCI6XCIxRjNCQVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEwLFwic2hlZXRfeVwiOjAsXCJzaG9ydF9uYW1lc1wiOltcInRydW1wZXRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJtdXNpY1wiLFwiYnJhc3NcIl0sXCJzZWFyY2hcIjpcInRydW1wZXQsbXVzaWMsYnJhc3NcIn0sXCJ5ZW5cIjp7XCJuYW1lXCI6XCJCYW5rbm90ZSB3aXRoIFllbiBTaWduXCIsXCJ1bmlmaWVkXCI6XCIxRjRCNFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIwLFwic2hlZXRfeVwiOjMyLFwic2hvcnRfbmFtZXNcIjpbXCJ5ZW5cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJtb25leVwiLFwic2FsZXNcIixcImphcGFuZXNlXCIsXCJkb2xsYXJcIixcImN1cnJlbmN5XCJdLFwic2VhcmNoXCI6XCJ5ZW4sYmFua25vdGUsd2l0aCxzaWduLG1vbmV5LHNhbGVzLGphcGFuZXNlLGRvbGxhcixjdXJyZW5jeVwifSxcImxlb3BhcmRcIjp7XCJuYW1lXCI6XCJMZW9wYXJkXCIsXCJ1bmlmaWVkXCI6XCIxRjQwNlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEyLFwic2hlZXRfeVwiOjExLFwic2hvcnRfbmFtZXNcIjpbXCJsZW9wYXJkXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJuYXR1cmVcIl0sXCJzZWFyY2hcIjpcImxlb3BhcmQsYW5pbWFsLG5hdHVyZVwifSxcInU2NzA5XCI6e1wibmFtZVwiOlwiU3F1YXJlZCBDamsgVW5pZmllZCBJZGVvZ3JhcGgtNjcwOVwiLFwidW5pZmllZFwiOlwiMUYyMzZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo1LFwic2hlZXRfeVwiOjE0LFwic2hvcnRfbmFtZXNcIjpbXCJ1NjcwOVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm9yYW5nZS1zcXVhcmVcIixcImNoaW5lc2VcIixcImhhdmVcIixcImthbmppXCJdLFwic2VhcmNoXCI6XCJ1NjcwOSxzcXVhcmVkLGNqayx1bmlmaWVkLGlkZW9ncmFwaCw2NzA5LG9yYW5nZS1zcXVhcmUsY2hpbmVzZSxoYXZlLGthbmppXCJ9LFwiYmlydGhkYXlcIjp7XCJuYW1lXCI6XCJCaXJ0aGRheSBDYWtlXCIsXCJ1bmlmaWVkXCI6XCIxRjM4MlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjgsXCJzaGVldF95XCI6MjYsXCJzaG9ydF9uYW1lc1wiOltcImJpcnRoZGF5XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZm9vZFwiLFwiZGVzc2VydFwiXSxcInNlYXJjaFwiOlwiYmlydGhkYXksY2FrZSxmb29kLGRlc3NlcnRcIn0sXCJ3ZWFyeVwiOntcIm5hbWVcIjpcIldlYXJ5IEZhY2VcIixcInVuaWZpZWRcIjpcIjFGNjI5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjcsXCJzaGVldF95XCI6MTUsXCJzaG9ydF9uYW1lc1wiOltcIndlYXJ5XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmFjZVwiLFwidGlyZWRcIixcInNsZWVweVwiLFwic2FkXCIsXCJmcnVzdHJhdGVkXCIsXCJ1cHNldFwiXSxcInNlYXJjaFwiOlwid2VhcnksZmFjZSx0aXJlZCxzbGVlcHksc2FkLGZydXN0cmF0ZWQsdXBzZXRcIn0sXCJ0aWdlcjJcIjp7XCJuYW1lXCI6XCJUaWdlclwiLFwidW5pZmllZFwiOlwiMUY0MDVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMixcInNoZWV0X3lcIjoxMCxcInNob3J0X25hbWVzXCI6W1widGlnZXIyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJuYXR1cmVcIixcInJvYXJcIl0sXCJzZWFyY2hcIjpcInRpZ2VyMix0aWdlcixhbmltYWwsbmF0dXJlLHJvYXJcIn0sXCJmbGFnLWNjXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIENDXCIsXCJ1bmlmaWVkXCI6XCIxRjFFOC0xRjFFOFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMzLFwic2hlZXRfeVwiOjMxLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWNjXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsY2MscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwidTcxMjFcIjp7XCJuYW1lXCI6XCJTcXVhcmVkIENqayBVbmlmaWVkIElkZW9ncmFwaC03MTIxXCIsXCJ1bmlmaWVkXCI6XCIxRjIxQVwiLFwidmFyaWF0aW9uc1wiOltcIjFGMjFBLUZFMEZcIl0sXCJzaGVldF94XCI6NSxcInNoZWV0X3lcIjo4LFwic2hvcnRfbmFtZXNcIjpbXCJ1NzEyMVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm5vdGhpbmdcIixcImNoaW5lc2VcIixcImthbmppXCIsXCJqYXBhbmVzZVwiLFwib3JhbmdlLXNxdWFyZVwiXSxcInNlYXJjaFwiOlwidTcxMjEsc3F1YXJlZCxjamssdW5pZmllZCxpZGVvZ3JhcGgsNzEyMSxub3RoaW5nLGNoaW5lc2Usa2FuamksamFwYW5lc2Usb3JhbmdlLXNxdWFyZVwifSxcImV1cm9cIjp7XCJuYW1lXCI6XCJCYW5rbm90ZSB3aXRoIEV1cm8gU2lnblwiLFwidW5pZmllZFwiOlwiMUY0QjZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMCxcInNoZWV0X3lcIjozNCxcInNob3J0X25hbWVzXCI6W1wiZXVyb1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm1vbmV5XCIsXCJzYWxlc1wiLFwiZG9sbGFyXCIsXCJjdXJyZW5jeVwiXSxcInNlYXJjaFwiOlwiZXVybyxiYW5rbm90ZSx3aXRoLHNpZ24sbW9uZXksc2FsZXMsZG9sbGFyLGN1cnJlbmN5XCJ9LFwiY3VzdGFyZFwiOntcIm5hbWVcIjpcIkN1c3RhcmRcIixcInVuaWZpZWRcIjpcIjFGMzZFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OCxcInNoZWV0X3lcIjo2LFwic2hvcnRfbmFtZXNcIjpbXCJjdXN0YXJkXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZGVzc2VydFwiLFwiZm9vZFwiXSxcInNlYXJjaFwiOlwiY3VzdGFyZCxkZXNzZXJ0LGZvb2RcIn0sXCJ0cml1bXBoXCI6e1wibmFtZVwiOlwiRmFjZSB3aXRoIExvb2sgb2YgVHJpdW1waFwiLFwidW5pZmllZFwiOlwiMUY2MjRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNyxcInNoZWV0X3lcIjoxMCxcInNob3J0X25hbWVzXCI6W1widHJpdW1waFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZhY2VcIixcImdhc1wiLFwicGhld1wiLFwicHJvdWRcIixcInByaWRlXCJdLFwic2VhcmNoXCI6XCJ0cml1bXBoLGZhY2Usd2l0aCxsb29rLG9mLGdhcyxwaGV3LHByb3VkLHByaWRlXCJ9LFwiYW5jaG9yXCI6e1wibmFtZVwiOlwiQW5jaG9yXCIsXCJ1bmlmaWVkXCI6XCIyNjkzXCIsXCJ2YXJpYXRpb25zXCI6W1wiMjY5My1GRTBGXCJdLFwic2hlZXRfeFwiOjIsXCJzaGVldF95XCI6NSxcInNob3J0X25hbWVzXCI6W1wiYW5jaG9yXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic2hpcFwiLFwiZmVycnlcIixcInNlYVwiLFwiYm9hdFwiXSxcInNlYXJjaFwiOlwiYW5jaG9yLHNoaXAsZmVycnksc2VhLGJvYXRcIn0sXCJndWl0YXJcIjp7XCJuYW1lXCI6XCJHdWl0YXJcIixcInVuaWZpZWRcIjpcIjFGM0I4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OSxcInNoZWV0X3lcIjozOSxcInNob3J0X25hbWVzXCI6W1wiZ3VpdGFyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibXVzaWNcIixcImluc3RydW1lbnRcIl0sXCJzZWFyY2hcIjpcImd1aXRhcixtdXNpYyxpbnN0cnVtZW50XCJ9LFwidmlvbGluXCI6e1wibmFtZVwiOlwiVmlvbGluXCIsXCJ1bmlmaWVkXCI6XCIxRjNCQlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEwLFwic2hlZXRfeVwiOjEsXCJzaG9ydF9uYW1lc1wiOltcInZpb2xpblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm11c2ljXCIsXCJpbnN0cnVtZW50XCIsXCJvcmNoZXN0cmFcIixcInN5bXBob255XCJdLFwic2VhcmNoXCI6XCJ2aW9saW4sbXVzaWMsaW5zdHJ1bWVudCxvcmNoZXN0cmEsc3ltcGhvbnlcIn0sXCJjb25zdHJ1Y3Rpb25cIjp7XCJuYW1lXCI6XCJDb25zdHJ1Y3Rpb24gU2lnblwiLFwidW5pZmllZFwiOlwiMUY2QTdcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMCxcInNoZWV0X3lcIjoxNSxcInNob3J0X25hbWVzXCI6W1wiY29uc3RydWN0aW9uXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wid2lwXCIsXCJwcm9ncmVzc1wiLFwiY2F1dGlvblwiLFwid2FybmluZ1wiXSxcInNlYXJjaFwiOlwiY29uc3RydWN0aW9uLHNpZ24sd2lwLHByb2dyZXNzLGNhdXRpb24sd2FybmluZ1wifSxcIndhdGVyX2J1ZmZhbG9cIjp7XCJuYW1lXCI6XCJXYXRlciBCdWZmYWxvXCIsXCJ1bmlmaWVkXCI6XCIxRjQwM1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEyLFwic2hlZXRfeVwiOjgsXCJzaG9ydF9uYW1lc1wiOltcIndhdGVyX2J1ZmZhbG9cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcIm5hdHVyZVwiLFwib3hcIixcImNvd1wiXSxcInNlYXJjaFwiOlwid2F0ZXIsYnVmZmFsbyxhbmltYWwsbmF0dXJlLG94LGNvd1wifSxcImNhbmR5XCI6e1wibmFtZVwiOlwiQ2FuZHlcIixcInVuaWZpZWRcIjpcIjFGMzZDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OCxcInNoZWV0X3lcIjo0LFwic2hvcnRfbmFtZXNcIjpbXCJjYW5keVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNuYWNrXCIsXCJkZXNzZXJ0XCIsXCJzd2VldFwiXSxcInNlYXJjaFwiOlwiY2FuZHksc25hY2ssZGVzc2VydCxzd2VldFwifSxcInBvdW5kXCI6e1wibmFtZVwiOlwiQmFua25vdGUgd2l0aCBQb3VuZCBTaWduXCIsXCJ1bmlmaWVkXCI6XCIxRjRCN1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIwLFwic2hlZXRfeVwiOjM1LFwic2hvcnRfbmFtZXNcIjpbXCJwb3VuZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJyaXRpc2hcIixcInN0ZXJsaW5nXCIsXCJtb25leVwiLFwic2FsZXNcIixcImJpbGxzXCIsXCJ1a1wiLFwiZW5nbGFuZFwiLFwiY3VycmVuY3lcIl0sXCJzZWFyY2hcIjpcInBvdW5kLGJhbmtub3RlLHdpdGgsc2lnbixicml0aXNoLHN0ZXJsaW5nLG1vbmV5LHNhbGVzLGJpbGxzLHVrLGVuZ2xhbmQsY3VycmVuY3lcIn0sXCJmbGFnLWNvXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIENPXCIsXCJ1bmlmaWVkXCI6XCIxRjFFOC0xRjFGNFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM0LFwic2hlZXRfeVwiOjAsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctY29cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxjbyxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJvcGVuX21vdXRoXCI6e1wibmFtZVwiOlwiRmFjZSB3aXRoIE9wZW4gTW91dGhcIixcInVuaWZpZWRcIjpcIjFGNjJFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjcsXCJzaGVldF95XCI6MjAsXCJzaG9ydF9uYW1lc1wiOltcIm9wZW5fbW91dGhcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltcIjpvXCIsXCI6LW9cIixcIjpPXCIsXCI6LU9cIl0sXCJrZXl3b3Jkc1wiOltcImZhY2VcIixcInN1cnByaXNlXCIsXCJpbXByZXNzZWRcIixcIndvd1wiXSxcInNlYXJjaFwiOlwib3Blbixtb3V0aCxmYWNlLHdpdGgsc3VycHJpc2UsaW1wcmVzc2VkLHdvdyw6byw6LW9cIn0sXCJ1NzUzM1wiOntcIm5hbWVcIjpcIlNxdWFyZWQgQ2prIFVuaWZpZWQgSWRlb2dyYXBoLTc1MzNcIixcInVuaWZpZWRcIjpcIjFGMjM4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NSxcInNoZWV0X3lcIjoxNixcInNob3J0X25hbWVzXCI6W1widTc1MzNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJjaGluZXNlXCIsXCJqYXBhbmVzZVwiLFwia2FuamlcIixcIm9yYW5nZS1zcXVhcmVcIl0sXCJzZWFyY2hcIjpcInU3NTMzLHNxdWFyZWQsY2prLHVuaWZpZWQsaWRlb2dyYXBoLDc1MzMsY2hpbmVzZSxqYXBhbmVzZSxrYW5qaSxvcmFuZ2Utc3F1YXJlXCJ9LFwib3hcIjp7XCJuYW1lXCI6XCJPeFwiLFwidW5pZmllZFwiOlwiMUY0MDJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMixcInNoZWV0X3lcIjo3LFwic2hvcnRfbmFtZXNcIjpbXCJveFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwiY293XCIsXCJiZWVmXCJdLFwic2VhcmNoXCI6XCJveCxhbmltYWwsY293LGJlZWZcIn0sXCJzY3JlYW1cIjp7XCJuYW1lXCI6XCJGYWNlIFNjcmVhbWluZyBpbiBGZWFyXCIsXCJ1bmlmaWVkXCI6XCIxRjYzMVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI3LFwic2hlZXRfeVwiOjIzLFwic2hvcnRfbmFtZXNcIjpbXCJzY3JlYW1cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmYWNlXCIsXCJtdW5jaFwiLFwic2NhcmVkXCIsXCJvbWdcIl0sXCJzZWFyY2hcIjpcInNjcmVhbSxmYWNlLHNjcmVhbWluZyxpbixmZWFyLG11bmNoLHNjYXJlZCxvbWdcIn0sXCJmbGFnLWttXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEtNXCIsXCJ1bmlmaWVkXCI6XCIxRjFGMC0xRjFGMlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM1LFwic2hlZXRfeVwiOjM0LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWttXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsa20scmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiY2xhcHBlclwiOntcIm5hbWVcIjpcIkNsYXBwZXIgQm9hcmRcIixcInVuaWZpZWRcIjpcIjFGM0FDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OSxcInNoZWV0X3lcIjoyNyxcInNob3J0X25hbWVzXCI6W1wiY2xhcHBlclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm1vdmllXCIsXCJmaWxtXCIsXCJyZWNvcmRcIl0sXCJzZWFyY2hcIjpcImNsYXBwZXIsYm9hcmQsbW92aWUsZmlsbSxyZWNvcmRcIn0sXCJ1NTViNlwiOntcIm5hbWVcIjpcIlNxdWFyZWQgQ2prIFVuaWZpZWQgSWRlb2dyYXBoLTU1YjZcIixcInVuaWZpZWRcIjpcIjFGMjNBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NSxcInNoZWV0X3lcIjoxOCxcInNob3J0X25hbWVzXCI6W1widTU1YjZcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJqYXBhbmVzZVwiLFwib3BlbmluZyBob3Vyc1wiLFwib3JhbmdlLXNxdWFyZVwiXSxcInNlYXJjaFwiOlwidTU1YjYsc3F1YXJlZCxjamssdW5pZmllZCxpZGVvZ3JhcGgsNTViNixqYXBhbmVzZSxvcGVuaW5nIGhvdXJzLG9yYW5nZS1zcXVhcmVcIn0sXCJmdWVscHVtcFwiOntcIm5hbWVcIjpcIkZ1ZWwgUHVtcFwiLFwidW5pZmllZFwiOlwiMjZGRFwiLFwidmFyaWF0aW9uc1wiOltcIjI2RkQtRkUwRlwiXSxcInNoZWV0X3hcIjozLFwic2hlZXRfeVwiOjQsXCJzaG9ydF9uYW1lc1wiOltcImZ1ZWxwdW1wXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZ2FzIHN0YXRpb25cIixcInBldHJvbGV1bVwiXSxcInNlYXJjaFwiOlwiZnVlbHB1bXAsZnVlbCxwdW1wLGdhcyBzdGF0aW9uLHBldHJvbGV1bVwifSxcIm1vbmV5YmFnXCI6e1wibmFtZVwiOlwiTW9uZXkgQmFnXCIsXCJ1bmlmaWVkXCI6XCIxRjRCMFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIwLFwic2hlZXRfeVwiOjI4LFwic2hvcnRfbmFtZXNcIjpbXCJtb25leWJhZ1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImRvbGxhclwiLFwicGF5bWVudFwiLFwiY29pbnNcIixcInNhbGVcIl0sXCJzZWFyY2hcIjpcIm1vbmV5YmFnLG1vbmV5LGJhZyxkb2xsYXIscGF5bWVudCxjb2lucyxzYWxlXCJ9LFwibG9sbGlwb3BcIjp7XCJuYW1lXCI6XCJMb2xsaXBvcFwiLFwidW5pZmllZFwiOlwiMUYzNkRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo4LFwic2hlZXRfeVwiOjUsXCJzaG9ydF9uYW1lc1wiOltcImxvbGxpcG9wXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZm9vZFwiLFwic25hY2tcIixcImNhbmR5XCIsXCJzd2VldFwiXSxcInNlYXJjaFwiOlwibG9sbGlwb3AsZm9vZCxzbmFjayxjYW5keSxzd2VldFwifSxcImNyZWRpdF9jYXJkXCI6e1wibmFtZVwiOlwiQ3JlZGl0IENhcmRcIixcInVuaWZpZWRcIjpcIjFGNEIzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjAsXCJzaGVldF95XCI6MzEsXCJzaG9ydF9uYW1lc1wiOltcImNyZWRpdF9jYXJkXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibW9uZXlcIixcInNhbGVzXCIsXCJkb2xsYXJcIixcImJpbGxcIixcInBheW1lbnRcIixcInNob3BwaW5nXCJdLFwic2VhcmNoXCI6XCJjcmVkaXQsY2FyZCxtb25leSxzYWxlcyxkb2xsYXIsYmlsbCxwYXltZW50LHNob3BwaW5nXCJ9LFwiY293MlwiOntcIm5hbWVcIjpcIkNvd1wiLFwidW5pZmllZFwiOlwiMUY0MDRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMixcInNoZWV0X3lcIjo5LFwic2hvcnRfbmFtZXNcIjpbXCJjb3cyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYmVlZlwiLFwib3hcIixcImFuaW1hbFwiLFwibmF0dXJlXCIsXCJtb29cIixcIm1pbGtcIl0sXCJzZWFyY2hcIjpcImNvdzIsY293LGJlZWYsb3gsYW5pbWFsLG5hdHVyZSxtb28sbWlsa1wifSxcInZpZGVvX2dhbWVcIjp7XCJuYW1lXCI6XCJWaWRlbyBHYW1lXCIsXCJ1bmlmaWVkXCI6XCIxRjNBRVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjksXCJzaGVldF95XCI6MjksXCJzaG9ydF9uYW1lc1wiOltcInZpZGVvX2dhbWVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJwbGF5XCIsXCJjb25zb2xlXCIsXCJQUzRcIixcImNvbnRyb2xsZXJcIl0sXCJzZWFyY2hcIjpcInZpZGVvLGdhbWUscGxheSxjb25zb2xlLHBzNCxjb250cm9sbGVyXCJ9LFwiYnVzc3RvcFwiOntcIm5hbWVcIjpcIkJ1cyBTdG9wXCIsXCJ1bmlmaWVkXCI6XCIxRjY4RlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI5LFwic2hlZXRfeVwiOjI3LFwic2hvcnRfbmFtZXNcIjpbXCJidXNzdG9wXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widHJhbnNwb3J0YXRpb25cIixcIndhaXRcIl0sXCJzZWFyY2hcIjpcImJ1c3N0b3AsYnVzLHN0b3AsdHJhbnNwb3J0YXRpb24sd2FpdFwifSxcImNob2NvbGF0ZV9iYXJcIjp7XCJuYW1lXCI6XCJDaG9jb2xhdGUgQmFyXCIsXCJ1bmlmaWVkXCI6XCIxRjM2QlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjgsXCJzaGVldF95XCI6MyxcInNob3J0X25hbWVzXCI6W1wiY2hvY29sYXRlX2JhclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZvb2RcIixcInNuYWNrXCIsXCJkZXNzZXJ0XCIsXCJzd2VldFwiXSxcInNlYXJjaFwiOlwiY2hvY29sYXRlLGJhcixmb29kLHNuYWNrLGRlc3NlcnQsc3dlZXRcIn0sXCJ1NjcwOFwiOntcIm5hbWVcIjpcIlNxdWFyZWQgQ2prIFVuaWZpZWQgSWRlb2dyYXBoLTY3MDhcIixcInVuaWZpZWRcIjpcIjFGMjM3XCIsXCJ2YXJpYXRpb25zXCI6W1wiMUYyMzctRkUwRlwiXSxcInNoZWV0X3hcIjo1LFwic2hlZXRfeVwiOjE1LFwic2hvcnRfbmFtZXNcIjpbXCJ1NjcwOFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImNoaW5lc2VcIixcIm1vbnRoXCIsXCJtb29uXCIsXCJqYXBhbmVzZVwiLFwib3JhbmdlLXNxdWFyZVwiLFwia2FuamlcIl0sXCJzZWFyY2hcIjpcInU2NzA4LHNxdWFyZWQsY2prLHVuaWZpZWQsaWRlb2dyYXBoLDY3MDgsY2hpbmVzZSxtb250aCxtb29uLGphcGFuZXNlLG9yYW5nZS1zcXVhcmUsa2FuamlcIn0sXCJmZWFyZnVsXCI6e1wibmFtZVwiOlwiRmVhcmZ1bCBGYWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjYyOFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI3LFwic2hlZXRfeVwiOjE0LFwic2hvcnRfbmFtZXNcIjpbXCJmZWFyZnVsXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmFjZVwiLFwic2NhcmVkXCIsXCJ0ZXJyaWZpZWRcIixcIm5lcnZvdXNcIixcIm9vcHNcIixcImh1aFwiXSxcInNlYXJjaFwiOlwiZmVhcmZ1bCxmYWNlLHNjYXJlZCx0ZXJyaWZpZWQsbmVydm91cyxvb3BzLGh1aFwifSxcImZsYWctY2dcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQ0dcIixcInVuaWZpZWRcIjpcIjFGMUU4LTFGMUVDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzMsXCJzaGVldF95XCI6MzQsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctY2dcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxjZyxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJkcm9tZWRhcnlfY2FtZWxcIjp7XCJuYW1lXCI6XCJEcm9tZWRhcnkgQ2FtZWxcIixcInVuaWZpZWRcIjpcIjFGNDJBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTMsXCJzaGVldF95XCI6NixcInNob3J0X25hbWVzXCI6W1wiZHJvbWVkYXJ5X2NhbWVsXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJob3RcIixcImRlc2VydFwiLFwiaHVtcFwiXSxcInNlYXJjaFwiOlwiZHJvbWVkYXJ5LGNhbWVsLGFuaW1hbCxob3QsZGVzZXJ0LGh1bXBcIn0sXCJwb3Bjb3JuXCI6e1wibmFtZVwiOlwiUG9wY29yblwiLFwidW5pZmllZFwiOlwiMUYzN0ZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo4LFwic2hlZXRfeVwiOjIzLFwic2hvcnRfbmFtZXNcIjpbXCJwb3Bjb3JuXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZm9vZFwiLFwibW92aWUgdGhlYXRlclwiLFwiZmlsbXNcIixcInNuYWNrXCJdLFwic2VhcmNoXCI6XCJwb3Bjb3JuLGZvb2QsbW92aWUgdGhlYXRlcixmaWxtcyxzbmFja1wifSxcImVpZ2h0X3BvaW50ZWRfYmxhY2tfc3RhclwiOntcIm5hbWVcIjpcIkVpZ2h0IFBvaW50ZWQgQmxhY2sgU3RhclwiLFwidW5pZmllZFwiOlwiMjczNFwiLFwidmFyaWF0aW9uc1wiOltcIjI3MzQtRkUwRlwiXSxcInNoZWV0X3hcIjo0LFwic2hlZXRfeVwiOjAsXCJzaG9ydF9uYW1lc1wiOltcImVpZ2h0X3BvaW50ZWRfYmxhY2tfc3RhclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm9yYW5nZS1zcXVhcmVcIixcInNoYXBlXCIsXCJwb2x5Z29uXCJdLFwic2VhcmNoXCI6XCJlaWdodCxwb2ludGVkLGJsYWNrLHN0YXIsb3JhbmdlLXNxdWFyZSxzaGFwZSxwb2x5Z29uXCJ9LFwiZ2VtXCI6e1wibmFtZVwiOlwiR2VtIFN0b25lXCIsXCJ1bmlmaWVkXCI6XCIxRjQ4RVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE5LFwic2hlZXRfeVwiOjMwLFwic2hvcnRfbmFtZXNcIjpbXCJnZW1cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJibHVlXCIsXCJydWJ5XCIsXCJkaWFtb25kXCIsXCJqZXdlbHJ5XCJdLFwic2VhcmNoXCI6XCJnZW0sc3RvbmUsYmx1ZSxydWJ5LGRpYW1vbmQsamV3ZWxyeVwifSxcInNwYWNlX2ludmFkZXJcIjp7XCJuYW1lXCI6XCJBbGllbiBNb25zdGVyXCIsXCJ1bmlmaWVkXCI6XCIxRjQ3RVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE4LFwic2hlZXRfeVwiOjI1LFwic2hvcnRfbmFtZXNcIjpbXCJzcGFjZV9pbnZhZGVyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZ2FtZVwiLFwiYXJjYWRlXCIsXCJwbGF5XCJdLFwic2VhcmNoXCI6XCJzcGFjZSxpbnZhZGVyLGFsaWVuLG1vbnN0ZXIsZ2FtZSxhcmNhZGUscGxheVwifSxcInZlcnRpY2FsX3RyYWZmaWNfbGlnaHRcIjp7XCJuYW1lXCI6XCJWZXJ0aWNhbCBUcmFmZmljIExpZ2h0XCIsXCJ1bmlmaWVkXCI6XCIxRjZBNlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMwLFwic2hlZXRfeVwiOjE0LFwic2hvcnRfbmFtZXNcIjpbXCJ2ZXJ0aWNhbF90cmFmZmljX2xpZ2h0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widHJhbnNwb3J0YXRpb25cIixcImRyaXZpbmdcIl0sXCJzZWFyY2hcIjpcInZlcnRpY2FsLHRyYWZmaWMsbGlnaHQsdHJhbnNwb3J0YXRpb24sZHJpdmluZ1wifSxcImNvbGRfc3dlYXRcIjp7XCJuYW1lXCI6XCJGYWNlIHdpdGggT3BlbiBNb3V0aCBhbmQgQ29sZCBTd2VhdFwiLFwidW5pZmllZFwiOlwiMUY2MzBcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNyxcInNoZWV0X3lcIjoyMixcInNob3J0X25hbWVzXCI6W1wiY29sZF9zd2VhdFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZhY2VcIixcIm5lcnZvdXNcIl0sXCJzZWFyY2hcIjpcImNvbGQsc3dlYXQsZmFjZSx3aXRoLG9wZW4sbW91dGgsYW5kLG5lcnZvdXNcIn0sXCJmbGFnLWNkXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIENEXCIsXCJ1bmlmaWVkXCI6XCIxRjFFOC0xRjFFOVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMzLFwic2hlZXRfeVwiOjMyLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWNkXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsY2QscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZmxhZy1ja1wiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBDS1wiLFwidW5pZmllZFwiOlwiMUYxRTgtMUYxRjBcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMyxcInNoZWV0X3lcIjozNyxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1ja1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGNrLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImh1c2hlZFwiOntcIm5hbWVcIjpcIkh1c2hlZCBGYWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjYyRlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI3LFwic2hlZXRfeVwiOjIxLFwic2hvcnRfbmFtZXNcIjpbXCJodXNoZWRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmYWNlXCIsXCJ3b29cIixcInNoaFwiXSxcInNlYXJjaFwiOlwiaHVzaGVkLGZhY2Usd29vLHNoaFwifSxcInRyYWZmaWNfbGlnaHRcIjp7XCJuYW1lXCI6XCJIb3Jpem9udGFsIFRyYWZmaWMgTGlnaHRcIixcInVuaWZpZWRcIjpcIjFGNkE1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzAsXCJzaGVldF95XCI6MTMsXCJzaG9ydF9uYW1lc1wiOltcInRyYWZmaWNfbGlnaHRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ0cmFuc3BvcnRhdGlvblwiLFwic2lnbmFsXCJdLFwic2VhcmNoXCI6XCJ0cmFmZmljLGxpZ2h0LGhvcml6b250YWwsdHJhbnNwb3J0YXRpb24sc2lnbmFsXCJ9LFwiZG91Z2hudXRcIjp7XCJuYW1lXCI6XCJEb3VnaG51dFwiLFwidW5pZmllZFwiOlwiMUYzNjlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo4LFwic2hlZXRfeVwiOjEsXCJzaG9ydF9uYW1lc1wiOltcImRvdWdobnV0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZm9vZFwiLFwiZGVzc2VydFwiLFwic25hY2tcIixcInN3ZWV0XCIsXCJkb251dFwiXSxcInNlYXJjaFwiOlwiZG91Z2hudXQsZm9vZCxkZXNzZXJ0LHNuYWNrLHN3ZWV0LGRvbnV0XCJ9LFwiY2FtZWxcIjp7XCJuYW1lXCI6XCJCYWN0cmlhbiBDYW1lbFwiLFwidW5pZmllZFwiOlwiMUY0MkJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMyxcInNoZWV0X3lcIjo3LFwic2hvcnRfbmFtZXNcIjpbXCJjYW1lbFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwibmF0dXJlXCIsXCJob3RcIixcImRlc2VydFwiLFwiaHVtcFwiXSxcInNlYXJjaFwiOlwiY2FtZWwsYmFjdHJpYW4sYW5pbWFsLG5hdHVyZSxob3QsZGVzZXJ0LGh1bXBcIn0sXCJkYXJ0XCI6e1wibmFtZVwiOlwiRGlyZWN0IEhpdFwiLFwidW5pZmllZFwiOlwiMUYzQUZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo5LFwic2hlZXRfeVwiOjMwLFwic2hvcnRfbmFtZXNcIjpbXCJkYXJ0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZ2FtZVwiLFwicGxheVwiLFwiYmFyXCJdLFwic2VhcmNoXCI6XCJkYXJ0LGRpcmVjdCxoaXQsZ2FtZSxwbGF5LGJhclwifSxcInNjYWxlc1wiOntcIm5hbWVcIjpcIlNjYWxlc1wiLFwidW5pZmllZFwiOlwiMjY5NlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIsXCJzaGVldF95XCI6NyxcInNob3J0X25hbWVzXCI6W1wic2NhbGVzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibGF3XCIsXCJmYWlybmVzc1wiLFwid2VpZ2h0XCJdLFwic2VhcmNoXCI6XCJzY2FsZXMsbGF3LGZhaXJuZXNzLHdlaWdodFwifSxcInZzXCI6e1wibmFtZVwiOlwiU3F1YXJlZCBWc1wiLFwidW5pZmllZFwiOlwiMUYxOUFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo1LFwic2hlZXRfeVwiOjUsXCJzaG9ydF9uYW1lc1wiOltcInZzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wid29yZHNcIixcIm9yYW5nZS1zcXVhcmVcIl0sXCJzZWFyY2hcIjpcInZzLHNxdWFyZWQsd29yZHMsb3JhbmdlLXNxdWFyZVwifSxcImVsZXBoYW50XCI6e1wibmFtZVwiOlwiRWxlcGhhbnRcIixcInVuaWZpZWRcIjpcIjFGNDE4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTIsXCJzaGVldF95XCI6MjksXCJzaG9ydF9uYW1lc1wiOltcImVsZXBoYW50XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJuYXR1cmVcIixcIm5vc2VcIixcInRoYWlsYW5kXCIsXCJjaXJjdXNcIl0sXCJzZWFyY2hcIjpcImVsZXBoYW50LGFuaW1hbCxuYXR1cmUsbm9zZSx0aGFpbGFuZCxjaXJjdXNcIn0sXCJ3cmVuY2hcIjp7XCJuYW1lXCI6XCJXcmVuY2hcIixcInVuaWZpZWRcIjpcIjFGNTI3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjMsXCJzaGVldF95XCI6MjMsXCJzaG9ydF9uYW1lc1wiOltcIndyZW5jaFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRvb2xzXCIsXCJkaXlcIixcImlrZWFcIixcImZpeFwiLFwibWFpbnRhaW5lclwiXSxcInNlYXJjaFwiOlwid3JlbmNoLHRvb2xzLGRpeSxpa2VhLGZpeCxtYWludGFpbmVyXCJ9LFwiZ2FtZV9kaWVcIjp7XCJuYW1lXCI6XCJHYW1lIERpZVwiLFwidW5pZmllZFwiOlwiMUYzQjJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo5LFwic2hlZXRfeVwiOjMzLFwic2hvcnRfbmFtZXNcIjpbXCJnYW1lX2RpZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImRpY2VcIixcInJhbmRvbVwiLFwidGFiYmxldG9wXCIsXCJwbGF5XCIsXCJsdWNrXCJdLFwic2VhcmNoXCI6XCJnYW1lLGRpZSxkaWNlLHJhbmRvbSx0YWJibGV0b3AscGxheSxsdWNrXCJ9LFwiYWNjZXB0XCI6e1wibmFtZVwiOlwiQ2lyY2xlZCBJZGVvZ3JhcGggQWNjZXB0XCIsXCJ1bmlmaWVkXCI6XCIxRjI1MVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjUsXCJzaGVldF95XCI6MjAsXCJzaG9ydF9uYW1lc1wiOltcImFjY2VwdFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm9rXCIsXCJnb29kXCIsXCJjaGluZXNlXCIsXCJrYW5qaVwiLFwiYWdyZWVcIixcInllc1wiLFwib3JhbmdlLWNpcmNsZVwiXSxcInNlYXJjaFwiOlwiYWNjZXB0LGNpcmNsZWQsaWRlb2dyYXBoLG9rLGdvb2QsY2hpbmVzZSxrYW5qaSxhZ3JlZSx5ZXMsb3JhbmdlLWNpcmNsZVwifSxcImNvb2tpZVwiOntcIm5hbWVcIjpcIkNvb2tpZVwiLFwidW5pZmllZFwiOlwiMUYzNkFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo4LFwic2hlZXRfeVwiOjIsXCJzaG9ydF9uYW1lc1wiOltcImNvb2tpZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZvb2RcIixcInNuYWNrXCIsXCJvcmVvXCIsXCJjaG9jb2xhdGVcIixcInN3ZWV0XCIsXCJkZXNzZXJ0XCJdLFwic2VhcmNoXCI6XCJjb29raWUsZm9vZCxzbmFjayxvcmVvLGNob2NvbGF0ZSxzd2VldCxkZXNzZXJ0XCJ9LFwiZmxhZy1jclwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBDUlwiLFwidW5pZmllZFwiOlwiMUYxRTgtMUYxRjdcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNCxcInNoZWV0X3lcIjoyLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWNyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsY3IscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiY2hlY2tlcmVkX2ZsYWdcIjp7XCJuYW1lXCI6XCJDaGVxdWVyZWQgRmxhZ1wiLFwidW5pZmllZFwiOlwiMUYzQzFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMCxcInNoZWV0X3lcIjo3LFwic2hvcnRfbmFtZXNcIjpbXCJjaGVja2VyZWRfZmxhZ1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImNvbnRlc3RcIixcImZpbmlzaGxpbmVcIixcInJhc2VcIixcImdva2FydFwiXSxcInNlYXJjaFwiOlwiY2hlY2tlcmVkLGZsYWcsY2hlcXVlcmVkLGNvbnRlc3QsZmluaXNobGluZSxyYXNlLGdva2FydFwifSxcImZyb3duaW5nXCI6e1wibmFtZVwiOlwiRnJvd25pbmcgRmFjZSB3aXRoIE9wZW4gTW91dGhcIixcInVuaWZpZWRcIjpcIjFGNjI2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjcsXCJzaGVldF95XCI6MTIsXCJzaG9ydF9uYW1lc1wiOltcImZyb3duaW5nXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmFjZVwiLFwiYXdcIixcIndoYXRcIl0sXCJzZWFyY2hcIjpcImZyb3duaW5nLGZhY2Usd2l0aCxvcGVuLG1vdXRoLGF3LHdoYXRcIn0sXCJ3aGl0ZV9mbG93ZXJcIjp7XCJuYW1lXCI6XCJXaGl0ZSBGbG93ZXJcIixcInVuaWZpZWRcIjpcIjFGNEFFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjAsXCJzaGVldF95XCI6MjYsXCJzaG9ydF9uYW1lc1wiOltcIndoaXRlX2Zsb3dlclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImphcGFuZXNlXCIsXCJzcHJpbmdcIl0sXCJzZWFyY2hcIjpcIndoaXRlLGZsb3dlcixqYXBhbmVzZSxzcHJpbmdcIn0sXCJzaGlwXCI6e1wibmFtZVwiOlwiU2hpcFwiLFwidW5pZmllZFwiOlwiMUY2QTJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMCxcInNoZWV0X3lcIjo1LFwic2hvcnRfbmFtZXNcIjpbXCJzaGlwXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widHJhbnNwb3J0YXRpb25cIixcInRpdGFuaWNcIixcImRlcGxveVwiXSxcInNlYXJjaFwiOlwic2hpcCx0cmFuc3BvcnRhdGlvbix0aXRhbmljLGRlcGxveVwifSxcImhhbW1lclwiOntcIm5hbWVcIjpcIkhhbW1lclwiLFwidW5pZmllZFwiOlwiMUY1MjhcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMyxcInNoZWV0X3lcIjoyNCxcInNob3J0X25hbWVzXCI6W1wiaGFtbWVyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widG9vbHNcIixcImJ1aWxkXCIsXCJjcmVhdGVcIl0sXCJzZWFyY2hcIjpcImhhbW1lcix0b29scyxidWlsZCxjcmVhdGVcIn0sXCJmbGFnLWhyXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEhSXCIsXCJ1bmlmaWVkXCI6XCIxRjFFRC0xRjFGN1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM1LFwic2hlZXRfeVwiOjEyLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWhyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsaHIscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiYW5ndWlzaGVkXCI6e1wibmFtZVwiOlwiQW5ndWlzaGVkIEZhY2VcIixcInVuaWZpZWRcIjpcIjFGNjI3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjcsXCJzaGVldF95XCI6MTMsXCJzaG9ydF9uYW1lc1wiOltcImFuZ3Vpc2hlZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W1wiRDpcIl0sXCJrZXl3b3Jkc1wiOltcImZhY2VcIixcInN0dW5uZWRcIixcIm5lcnZvdXNcIl0sXCJzZWFyY2hcIjpcImFuZ3Vpc2hlZCxmYWNlLHN0dW5uZWQsbmVydm91cyxkOlwifSxcImdvYXRcIjp7XCJuYW1lXCI6XCJHb2F0XCIsXCJ1bmlmaWVkXCI6XCIxRjQxMFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEyLFwic2hlZXRfeVwiOjIxLFwic2hvcnRfbmFtZXNcIjpbXCJnb2F0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJuYXR1cmVcIl0sXCJzZWFyY2hcIjpcImdvYXQsYW5pbWFsLG5hdHVyZVwifSxcImJlZXJcIjp7XCJuYW1lXCI6XCJCZWVyIE11Z1wiLFwidW5pZmllZFwiOlwiMUYzN0FcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo4LFwic2hlZXRfeVwiOjE4LFwic2hvcnRfbmFtZXNcIjpbXCJiZWVyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicmVsYXhcIixcImJldmVyYWdlXCIsXCJkcmlua1wiLFwiZHJ1bmtcIixcInBhcnR5XCIsXCJwdWJcIixcInN1bW1lclwiLFwiYWxjb2hvbFwiLFwiYm9vemVcIl0sXCJzZWFyY2hcIjpcImJlZXIsbXVnLHJlbGF4LGJldmVyYWdlLGRyaW5rLGRydW5rLHBhcnR5LHB1YixzdW1tZXIsYWxjb2hvbCxib296ZVwifSxcInNsb3RfbWFjaGluZVwiOntcIm5hbWVcIjpcIlNsb3QgTWFjaGluZVwiLFwidW5pZmllZFwiOlwiMUYzQjBcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo5LFwic2hlZXRfeVwiOjMxLFwic2hvcnRfbmFtZXNcIjpbXCJzbG90X21hY2hpbmVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJiZXRcIixcImdhbWJsZVwiLFwidmVnYXNcIixcImZydWl0IG1hY2hpbmVcIixcImx1Y2tcIixcImNhc2lub1wiXSxcInNlYXJjaFwiOlwic2xvdCxtYWNoaW5lLGJldCxnYW1ibGUsdmVnYXMsZnJ1aXQgbWFjaGluZSxsdWNrLGNhc2lub1wifSxcImZsYWctY3VcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQ1VcIixcInVuaWZpZWRcIjpcIjFGMUU4LTFGMUZBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzQsXCJzaGVldF95XCI6MyxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1jdVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGN1LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImhhbW1lcl9hbmRfcGlja1wiOntcIm5hbWVcIjpcIkhhbW1lciBhbmQgUGlja1wiLFwidW5pZmllZFwiOlwiMjY5MlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIsXCJzaGVldF95XCI6NCxcInNob3J0X25hbWVzXCI6W1wiaGFtbWVyX2FuZF9waWNrXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widG9vbHNcIixcImJ1aWxkXCIsXCJjcmVhdGVcIl0sXCJzZWFyY2hcIjpcImhhbW1lcixhbmQscGljayx0b29scyxidWlsZCxjcmVhdGVcIn0sXCJiZWVyc1wiOntcIm5hbWVcIjpcIkNsaW5raW5nIEJlZXIgTXVnc1wiLFwidW5pZmllZFwiOlwiMUYzN0JcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo4LFwic2hlZXRfeVwiOjE5LFwic2hvcnRfbmFtZXNcIjpbXCJiZWVyc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInJlbGF4XCIsXCJiZXZlcmFnZVwiLFwiZHJpbmtcIixcImRydW5rXCIsXCJwYXJ0eVwiLFwicHViXCIsXCJzdW1tZXJcIixcImFsY29ob2xcIixcImJvb3plXCJdLFwic2VhcmNoXCI6XCJiZWVycyxjbGlua2luZyxiZWVyLG11Z3MscmVsYXgsYmV2ZXJhZ2UsZHJpbmssZHJ1bmsscGFydHkscHViLHN1bW1lcixhbGNvaG9sLGJvb3plXCJ9LFwiZmVycmlzX3doZWVsXCI6e1wibmFtZVwiOlwiRmVycmlzIFdoZWVsXCIsXCJ1bmlmaWVkXCI6XCIxRjNBMVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjksXCJzaGVldF95XCI6MTYsXCJzaG9ydF9uYW1lc1wiOltcImZlcnJpc193aGVlbFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBob3RvXCIsXCJjYXJuaXZhbFwiLFwibG9uZG9uZXllXCJdLFwic2VhcmNoXCI6XCJmZXJyaXMsd2hlZWwscGhvdG8sY2Fybml2YWwsbG9uZG9uZXllXCJ9LFwiaWRlb2dyYXBoX2FkdmFudGFnZVwiOntcIm5hbWVcIjpcIkNpcmNsZWQgSWRlb2dyYXBoIEFkdmFudGFnZVwiLFwidW5pZmllZFwiOlwiMUYyNTBcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo1LFwic2hlZXRfeVwiOjE5LFwic2hvcnRfbmFtZXNcIjpbXCJpZGVvZ3JhcGhfYWR2YW50YWdlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiY2hpbmVzZVwiLFwia2FuamlcIixcIm9idGFpblwiLFwiZ2V0XCIsXCJjaXJjbGVcIl0sXCJzZWFyY2hcIjpcImlkZW9ncmFwaCxhZHZhbnRhZ2UsY2lyY2xlZCxjaGluZXNlLGthbmppLG9idGFpbixnZXQsY2lyY2xlXCJ9LFwicmFtXCI6e1wibmFtZVwiOlwiUmFtXCIsXCJ1bmlmaWVkXCI6XCIxRjQwRlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEyLFwic2hlZXRfeVwiOjIwLFwic2hvcnRfbmFtZXNcIjpbXCJyYW1cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcInNoZWVwXCIsXCJuYXR1cmVcIl0sXCJzZWFyY2hcIjpcInJhbSxhbmltYWwsc2hlZXAsbmF0dXJlXCJ9LFwiY3J5XCI6e1wibmFtZVwiOlwiQ3J5aW5nIEZhY2VcIixcInVuaWZpZWRcIjpcIjFGNjIyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjcsXCJzaGVldF95XCI6OCxcInNob3J0X25hbWVzXCI6W1wiY3J5XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXCI6JyhcIl0sXCJrZXl3b3Jkc1wiOltcImZhY2VcIixcInRlYXJzXCIsXCJzYWRcIixcImRlcHJlc3NlZFwiLFwidXBzZXRcIixcIjonKFwiXSxcInNlYXJjaFwiOlwiY3J5LGNyeWluZyxmYWNlLHRlYXJzLHNhZCxkZXByZXNzZWQsdXBzZXQsOicoXCJ9LFwiYm93bGluZ1wiOntcIm5hbWVcIjpcIkJvd2xpbmdcIixcInVuaWZpZWRcIjpcIjFGM0IzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OSxcInNoZWV0X3lcIjozNCxcInNob3J0X25hbWVzXCI6W1wiYm93bGluZ1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNwb3J0c1wiLFwiZnVuXCIsXCJwbGF5XCJdLFwic2VhcmNoXCI6XCJib3dsaW5nLHNwb3J0cyxmdW4scGxheVwifSxcImZsYWctY3dcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQ1dcIixcInVuaWZpZWRcIjpcIjFGMUU4LTFGMUZDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzQsXCJzaGVldF95XCI6NSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1jd1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGN3LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcInNlY3JldFwiOntcIm5hbWVcIjpcIkNpcmNsZWQgSWRlb2dyYXBoIFNlY3JldFwiLFwidW5pZmllZFwiOlwiMzI5OVwiLFwidmFyaWF0aW9uc1wiOltcIjMyOTktRkUwRlwiXSxcInNoZWV0X3hcIjo0LFwic2hlZXRfeVwiOjI5LFwic2hvcnRfbmFtZXNcIjpbXCJzZWNyZXRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJwcml2YWN5XCIsXCJjaGluZXNlXCIsXCJzc2hoXCIsXCJrYW5qaVwiLFwicmVkLWNpcmNsZVwiXSxcInNlYXJjaFwiOlwic2VjcmV0LGNpcmNsZWQsaWRlb2dyYXBoLHByaXZhY3ksY2hpbmVzZSxzc2hoLGthbmppLHJlZC1jaXJjbGVcIn0sXCJkaXNhcHBvaW50ZWRfcmVsaWV2ZWRcIjp7XCJuYW1lXCI6XCJEaXNhcHBvaW50ZWQgYnV0IFJlbGlldmVkIEZhY2VcIixcInVuaWZpZWRcIjpcIjFGNjI1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjcsXCJzaGVldF95XCI6MTEsXCJzaG9ydF9uYW1lc1wiOltcImRpc2FwcG9pbnRlZF9yZWxpZXZlZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZhY2VcIixcInBoZXdcIixcInN3ZWF0XCIsXCJuZXJ2b3VzXCJdLFwic2VhcmNoXCI6XCJkaXNhcHBvaW50ZWQscmVsaWV2ZWQsYnV0LGZhY2UscGhldyxzd2VhdCxuZXJ2b3VzXCJ9LFwiaGFtbWVyX2FuZF93cmVuY2hcIjp7XCJuYW1lXCI6XCJIYW1tZXIgYW5kIFdyZW5jaFwiLFwidW5pZmllZFwiOlwiMUY2RTBcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMSxcInNoZWV0X3lcIjozMSxcInNob3J0X25hbWVzXCI6W1wiaGFtbWVyX2FuZF93cmVuY2hcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ0b29sc1wiLFwiYnVpbGRcIixcImNyZWF0ZVwiXSxcInNlYXJjaFwiOlwiaGFtbWVyLGFuZCx3cmVuY2gsdG9vbHMsYnVpbGQsY3JlYXRlXCJ9LFwicm9sbGVyX2NvYXN0ZXJcIjp7XCJuYW1lXCI6XCJSb2xsZXIgQ29hc3RlclwiLFwidW5pZmllZFwiOlwiMUYzQTJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo5LFwic2hlZXRfeVwiOjE3LFwic2hvcnRfbmFtZXNcIjpbXCJyb2xsZXJfY29hc3RlclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImNhcm5pdmFsXCIsXCJwbGF5Z3JvdW5kXCIsXCJwaG90b1wiLFwiZnVuXCJdLFwic2VhcmNoXCI6XCJyb2xsZXIsY29hc3RlcixjYXJuaXZhbCxwbGF5Z3JvdW5kLHBob3RvLGZ1blwifSxcInNoZWVwXCI6e1wibmFtZVwiOlwiU2hlZXBcIixcInVuaWZpZWRcIjpcIjFGNDExXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTIsXCJzaGVldF95XCI6MjIsXCJzaG9ydF9uYW1lc1wiOltcInNoZWVwXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJuYXR1cmVcIixcIndvb2xcIixcInNoaXBpdFwiXSxcInNlYXJjaFwiOlwic2hlZXAsYW5pbWFsLG5hdHVyZSx3b29sLHNoaXBpdFwifSxcIndpbmVfZ2xhc3NcIjp7XCJuYW1lXCI6XCJXaW5lIEdsYXNzXCIsXCJ1bmlmaWVkXCI6XCIxRjM3N1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjgsXCJzaGVldF95XCI6MTUsXCJzaG9ydF9uYW1lc1wiOltcIndpbmVfZ2xhc3NcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJkcmlua1wiLFwiYmV2ZXJhZ2VcIixcImRydW5rXCIsXCJhbGNvaG9sXCIsXCJib296ZVwiXSxcInNlYXJjaFwiOlwid2luZSxnbGFzcyxkcmluayxiZXZlcmFnZSxkcnVuayxhbGNvaG9sLGJvb3plXCJ9LFwiY29uZ3JhdHVsYXRpb25zXCI6e1wibmFtZVwiOlwiQ2lyY2xlZCBJZGVvZ3JhcGggQ29uZ3JhdHVsYXRpb25cIixcInVuaWZpZWRcIjpcIjMyOTdcIixcInZhcmlhdGlvbnNcIjpbXCIzMjk3LUZFMEZcIl0sXCJzaGVldF94XCI6NCxcInNoZWV0X3lcIjoyOCxcInNob3J0X25hbWVzXCI6W1wiY29uZ3JhdHVsYXRpb25zXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiY2hpbmVzZVwiLFwia2FuamlcIixcImphcGFuZXNlXCIsXCJyZWQtY2lyY2xlXCJdLFwic2VhcmNoXCI6XCJjb25ncmF0dWxhdGlvbnMsY2lyY2xlZCxpZGVvZ3JhcGgsY29uZ3JhdHVsYXRpb24sY2hpbmVzZSxrYW5qaSxqYXBhbmVzZSxyZWQtY2lyY2xlXCJ9LFwic2xlZXB5XCI6e1wibmFtZVwiOlwiU2xlZXB5IEZhY2VcIixcInVuaWZpZWRcIjpcIjFGNjJBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjcsXCJzaGVldF95XCI6MTYsXCJzaG9ydF9uYW1lc1wiOltcInNsZWVweVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZhY2VcIixcInRpcmVkXCIsXCJyZXN0XCIsXCJuYXBcIl0sXCJzZWFyY2hcIjpcInNsZWVweSxmYWNlLHRpcmVkLHJlc3QsbmFwXCJ9LFwiY2Fyb3VzZWxfaG9yc2VcIjp7XCJuYW1lXCI6XCJDYXJvdXNlbCBIb3JzZVwiLFwidW5pZmllZFwiOlwiMUYzQTBcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo5LFwic2hlZXRfeVwiOjE1LFwic2hvcnRfbmFtZXNcIjpbXCJjYXJvdXNlbF9ob3JzZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBob3RvXCIsXCJjYXJuaXZhbFwiXSxcInNlYXJjaFwiOlwiY2Fyb3VzZWwsaG9yc2UscGhvdG8sY2Fybml2YWxcIn0sXCJwaWNrXCI6e1wibmFtZVwiOlwiUGlja1wiLFwidW5pZmllZFwiOlwiMjZDRlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIsXCJzaGVldF95XCI6MjQsXCJzaG9ydF9uYW1lc1wiOltcInBpY2tcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ0b29sc1wiLFwiZGlnXCJdLFwic2VhcmNoXCI6XCJwaWNrLHRvb2xzLGRpZ1wifSxcImZsYWctY3lcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQ1lcIixcInVuaWZpZWRcIjpcIjFGMUU4LTFGMUZFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzQsXCJzaGVldF95XCI6NyxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1jeVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGN5LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImNvY2t0YWlsXCI6e1wibmFtZVwiOlwiQ29ja3RhaWwgR2xhc3NcIixcInVuaWZpZWRcIjpcIjFGMzc4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OCxcInNoZWV0X3lcIjoxNixcInNob3J0X25hbWVzXCI6W1wiY29ja3RhaWxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJkcmlua1wiLFwiZHJ1bmtcIixcImFsY29ob2xcIixcImJldmVyYWdlXCIsXCJib296ZVwiXSxcInNlYXJjaFwiOlwiY29ja3RhaWwsZ2xhc3MsZHJpbmssZHJ1bmssYWxjb2hvbCxiZXZlcmFnZSxib296ZVwifSxcInJhY2Vob3JzZVwiOntcIm5hbWVcIjpcIkhvcnNlXCIsXCJ1bmlmaWVkXCI6XCIxRjQwRVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEyLFwic2hlZXRfeVwiOjE5LFwic2hvcnRfbmFtZXNcIjpbXCJyYWNlaG9yc2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcImdhbWJsZVwiLFwibHVja1wiXSxcInNlYXJjaFwiOlwicmFjZWhvcnNlLGhvcnNlLGFuaW1hbCxnYW1ibGUsbHVja1wifSxcImZsYWctY3pcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQ1pcIixcInVuaWZpZWRcIjpcIjFGMUU4LTFGMUZGXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzQsXCJzaGVldF95XCI6OCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1jelwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGN6LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcInRyb3BpY2FsX2RyaW5rXCI6e1wibmFtZVwiOlwiVHJvcGljYWwgRHJpbmtcIixcInVuaWZpZWRcIjpcIjFGMzc5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OCxcInNoZWV0X3lcIjoxNyxcInNob3J0X25hbWVzXCI6W1widHJvcGljYWxfZHJpbmtcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJiZXZlcmFnZVwiLFwiY29ja3RhaWxcIixcInN1bW1lclwiLFwiYmVhY2hcIixcImFsY29ob2xcIixcImJvb3plXCJdLFwic2VhcmNoXCI6XCJ0cm9waWNhbCxkcmluayxiZXZlcmFnZSxjb2NrdGFpbCxzdW1tZXIsYmVhY2gsYWxjb2hvbCxib296ZVwifSxcInU1NDA4XCI6e1wibmFtZVwiOlwiU3F1YXJlZCBDamsgVW5pZmllZCBJZGVvZ3JhcGgtNTQwOFwiLFwidW5pZmllZFwiOlwiMUYyMzRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo1LFwic2hlZXRfeVwiOjEyLFwic2hvcnRfbmFtZXNcIjpbXCJ1NTQwOFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImphcGFuZXNlXCIsXCJjaGluZXNlXCIsXCJqb2luXCIsXCJrYW5qaVwiLFwicmVkLXNxdWFyZVwiXSxcInNlYXJjaFwiOlwidTU0MDgsc3F1YXJlZCxjamssdW5pZmllZCxpZGVvZ3JhcGgsNTQwOCxqYXBhbmVzZSxjaGluZXNlLGpvaW4sa2FuamkscmVkLXNxdWFyZVwifSxcIm51dF9hbmRfYm9sdFwiOntcIm5hbWVcIjpcIk51dCBhbmQgQm9sdFwiLFwidW5pZmllZFwiOlwiMUY1MjlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMyxcInNoZWV0X3lcIjoyNSxcInNob3J0X25hbWVzXCI6W1wibnV0X2FuZF9ib2x0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiaGFuZHlcIixcInRvb2xzXCIsXCJmaXhcIl0sXCJzZWFyY2hcIjpcIm51dCxhbmQsYm9sdCxoYW5keSx0b29scyxmaXhcIn0sXCJzd2VhdFwiOntcIm5hbWVcIjpcIkZhY2Ugd2l0aCBDb2xkIFN3ZWF0XCIsXCJ1bmlmaWVkXCI6XCIxRjYxM1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI2LFwic2hlZXRfeVwiOjM0LFwic2hvcnRfbmFtZXNcIjpbXCJzd2VhdFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZhY2VcIixcImhvdFwiLFwic2FkXCIsXCJ0aXJlZFwiLFwiZXhlcmNpc2VcIl0sXCJzZWFyY2hcIjpcInN3ZWF0LGZhY2Usd2l0aCxjb2xkLGhvdCxzYWQsdGlyZWQsZXhlcmNpc2VcIn0sXCJidWlsZGluZ19jb25zdHJ1Y3Rpb25cIjp7XCJuYW1lXCI6XCJCdWlsZGluZyBDb25zdHJ1Y3Rpb25cIixcInVuaWZpZWRcIjpcIjFGM0Q3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTEsXCJzaGVldF95XCI6OCxcInNob3J0X25hbWVzXCI6W1wiYnVpbGRpbmdfY29uc3RydWN0aW9uXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wid2lwXCIsXCJ3b3JraW5nXCIsXCJwcm9ncmVzc1wiXSxcInNlYXJjaFwiOlwiYnVpbGRpbmcsY29uc3RydWN0aW9uLHdpcCx3b3JraW5nLHByb2dyZXNzXCJ9LFwicGlnMlwiOntcIm5hbWVcIjpcIlBpZ1wiLFwidW5pZmllZFwiOlwiMUY0MTZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMixcInNoZWV0X3lcIjoyNyxcInNob3J0X25hbWVzXCI6W1wicGlnMlwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwibmF0dXJlXCJdLFwic2VhcmNoXCI6XCJwaWcyLHBpZyxhbmltYWwsbmF0dXJlXCJ9LFwic29iXCI6e1wibmFtZVwiOlwiTG91ZGx5IENyeWluZyBGYWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjYyRFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI3LFwic2hlZXRfeVwiOjE5LFwic2hvcnRfbmFtZXNcIjpbXCJzb2JcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltcIjonKFwiXSxcImtleXdvcmRzXCI6W1wiZmFjZVwiLFwiY3J5XCIsXCJ0ZWFyc1wiLFwic2FkXCIsXCJ1cHNldFwiLFwiZGVwcmVzc2VkXCJdLFwic2VhcmNoXCI6XCJzb2IsbG91ZGx5LGNyeWluZyxmYWNlLGNyeSx0ZWFycyxzYWQsdXBzZXQsZGVwcmVzc2VkLDonKFwifSxcInU2ZTgwXCI6e1wibmFtZVwiOlwiU3F1YXJlZCBDamsgVW5pZmllZCBJZGVvZ3JhcGgtNmU4MFwiLFwidW5pZmllZFwiOlwiMUYyMzVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo1LFwic2hlZXRfeVwiOjEzLFwic2hvcnRfbmFtZXNcIjpbXCJ1NmU4MFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZ1bGxcIixcImNoaW5lc2VcIixcImphcGFuZXNlXCIsXCJyZWQtc3F1YXJlXCIsXCJrYW5qaVwiXSxcInNlYXJjaFwiOlwidTZlODAsc3F1YXJlZCxjamssdW5pZmllZCxpZGVvZ3JhcGgsNmU4MCxmdWxsLGNoaW5lc2UsamFwYW5lc2UscmVkLXNxdWFyZSxrYW5qaVwifSxcImZsYWctZGtcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgREtcIixcInVuaWZpZWRcIjpcIjFGMUU5LTFGMUYwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzQsXCJzaGVldF95XCI6MTIsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctZGtcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxkayxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJnZWFyXCI6e1wibmFtZVwiOlwiR2VhclwiLFwidW5pZmllZFwiOlwiMjY5OVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIsXCJzaGVldF95XCI6OSxcInNob3J0X25hbWVzXCI6W1wiZ2VhclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImNvZ1wiXSxcInNlYXJjaFwiOlwiZ2Vhcixjb2dcIn0sXCJyYXRcIjp7XCJuYW1lXCI6XCJSYXRcIixcInVuaWZpZWRcIjpcIjFGNDAwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTIsXCJzaGVldF95XCI6NSxcInNob3J0X25hbWVzXCI6W1wicmF0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJtb3VzZVwiLFwicm9kZW50XCJdLFwic2VhcmNoXCI6XCJyYXQsYW5pbWFsLG1vdXNlLHJvZGVudFwifSxcImNoYW1wYWduZVwiOntcIm5hbWVcIjpcIkJvdHRsZSB3aXRoIFBvcHBpbmcgQ29ya1wiLFwidW5pZmllZFwiOlwiMUYzN0VcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo4LFwic2hlZXRfeVwiOjIyLFwic2hvcnRfbmFtZXNcIjpbXCJjaGFtcGFnbmVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiY2hhbXBhZ25lLGJvdHRsZSx3aXRoLHBvcHBpbmcsY29ya1wifSxcImZvZ2d5XCI6e1wibmFtZVwiOlwiRm9nZ3lcIixcInVuaWZpZWRcIjpcIjFGMzAxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NSxcInNoZWV0X3lcIjoyMixcInNob3J0X25hbWVzXCI6W1wiZm9nZ3lcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJwaG90b1wiLFwibW91bnRhaW5cIl0sXCJzZWFyY2hcIjpcImZvZ2d5LHBob3RvLG1vdW50YWluXCJ9LFwidG9reW9fdG93ZXJcIjp7XCJuYW1lXCI6XCJUb2t5byBUb3dlclwiLFwidW5pZmllZFwiOlwiMUY1RkNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNixcInNoZWV0X3lcIjoxMSxcInNob3J0X25hbWVzXCI6W1widG9reW9fdG93ZXJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJwaG90b1wiLFwiamFwYW5lc2VcIl0sXCJzZWFyY2hcIjpcInRva3lvLHRvd2VyLHBob3RvLGphcGFuZXNlXCJ9LFwiZGl6enlfZmFjZVwiOntcIm5hbWVcIjpcIkRpenp5IEZhY2VcIixcInVuaWZpZWRcIjpcIjFGNjM1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjcsXCJzaGVldF95XCI6MjcsXCJzaG9ydF9uYW1lc1wiOltcImRpenp5X2ZhY2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzcGVudFwiLFwidW5jb25zY2lvdXNcIixcInhveFwiXSxcInNlYXJjaFwiOlwiZGl6enksZmFjZSxzcGVudCx1bmNvbnNjaW91cyx4b3hcIn0sXCJzYWtlXCI6e1wibmFtZVwiOlwiU2FrZSBCb3R0bGUgYW5kIEN1cFwiLFwidW5pZmllZFwiOlwiMUYzNzZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo4LFwic2hlZXRfeVwiOjE0LFwic2hvcnRfbmFtZXNcIjpbXCJzYWtlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wid2luZVwiLFwiZHJpbmtcIixcImRydW5rXCIsXCJiZXZlcmFnZVwiLFwiamFwYW5lc2VcIixcImFsY29ob2xcIixcImJvb3plXCJdLFwic2VhcmNoXCI6XCJzYWtlLGJvdHRsZSxhbmQsY3VwLHdpbmUsZHJpbmssZHJ1bmssYmV2ZXJhZ2UsamFwYW5lc2UsYWxjb2hvbCxib296ZVwifSxcInU3OTgxXCI6e1wibmFtZVwiOlwiU3F1YXJlZCBDamsgVW5pZmllZCBJZGVvZ3JhcGgtNzk4MVwiLFwidW5pZmllZFwiOlwiMUYyMzJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo1LFwic2hlZXRfeVwiOjEwLFwic2hvcnRfbmFtZXNcIjpbXCJ1Nzk4MVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImthbmppXCIsXCJqYXBhbmVzZVwiLFwiY2hpbmVzZVwiLFwiZm9yYmlkZGVuXCIsXCJsaW1pdFwiLFwicmVzdHJpY3RlZFwiLFwicmVkLXNxdWFyZVwiXSxcInNlYXJjaFwiOlwidTc5ODEsc3F1YXJlZCxjamssdW5pZmllZCxpZGVvZ3JhcGgsNzk4MSxrYW5qaSxqYXBhbmVzZSxjaGluZXNlLGZvcmJpZGRlbixsaW1pdCxyZXN0cmljdGVkLHJlZC1zcXVhcmVcIn0sXCJtb3VzZTJcIjp7XCJuYW1lXCI6XCJNb3VzZVwiLFwidW5pZmllZFwiOlwiMUY0MDFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMixcInNoZWV0X3lcIjo2LFwic2hvcnRfbmFtZXNcIjpbXCJtb3VzZTJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcIm5hdHVyZVwiLFwicm9kZW50XCJdLFwic2VhcmNoXCI6XCJtb3VzZTIsbW91c2UsYW5pbWFsLG5hdHVyZSxyb2RlbnRcIn0sXCJmbGFnLWRqXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIERKXCIsXCJ1bmlmaWVkXCI6XCIxRjFFOS0xRjFFRlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM0LFwic2hlZXRfeVwiOjExLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWRqXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsZGoscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiY2hhaW5zXCI6e1wibmFtZVwiOlwiQ2hhaW5zXCIsXCJ1bmlmaWVkXCI6XCIyNkQzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MixcInNoZWV0X3lcIjoyNixcInNob3J0X25hbWVzXCI6W1wiY2hhaW5zXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibG9ja1wiLFwiYXJyZXN0XCJdLFwic2VhcmNoXCI6XCJjaGFpbnMsbG9jayxhcnJlc3RcIn0sXCJhXCI6e1wibmFtZVwiOlwiTmVnYXRpdmUgU3F1YXJlZCBMYXRpbiBDYXBpdGFsIExldHRlciBhXCIsXCJ1bmlmaWVkXCI6XCIxRjE3MFwiLFwidmFyaWF0aW9uc1wiOltcIjFGMTcwLUZFMEZcIl0sXCJzaGVldF94XCI6NCxcInNoZWV0X3lcIjozMixcInNob3J0X25hbWVzXCI6W1wiYVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInJlZC1zcXVhcmVcIixcImFscGhhYmV0XCIsXCJsZXR0ZXJcIl0sXCJzZWFyY2hcIjpcImEsbmVnYXRpdmUsc3F1YXJlZCxsYXRpbixjYXBpdGFsLGxldHRlcixyZWQtc3F1YXJlLGFscGhhYmV0XCJ9LFwidGVhXCI6e1wibmFtZVwiOlwiVGVhY3VwIFdpdGhvdXQgSGFuZGxlXCIsXCJ1bmlmaWVkXCI6XCIxRjM3NVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjgsXCJzaGVldF95XCI6MTMsXCJzaG9ydF9uYW1lc1wiOltcInRlYVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImRyaW5rXCIsXCJib3dsXCIsXCJicmVha2Zhc3RcIixcImdyZWVuXCIsXCJicml0aXNoXCJdLFwic2VhcmNoXCI6XCJ0ZWEsdGVhY3VwLHdpdGhvdXQsaGFuZGxlLGRyaW5rLGJvd2wsYnJlYWtmYXN0LGdyZWVuLGJyaXRpc2hcIn0sXCJndW5cIjp7XCJuYW1lXCI6XCJQaXN0b2xcIixcInVuaWZpZWRcIjpcIjFGNTJCXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjMsXCJzaGVldF95XCI6MjcsXCJzaG9ydF9uYW1lc1wiOltcImd1blwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInZpb2xlbmNlXCIsXCJ3ZWFwb25cIixcInBpc3RvbFwiLFwicmV2b2x2ZXJcIl0sXCJzZWFyY2hcIjpcImd1bixwaXN0b2wsdmlvbGVuY2Usd2VhcG9uLHJldm9sdmVyXCJ9LFwiYXN0b25pc2hlZFwiOntcIm5hbWVcIjpcIkFzdG9uaXNoZWQgRmFjZVwiLFwidW5pZmllZFwiOlwiMUY2MzJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNyxcInNoZWV0X3lcIjoyNCxcInNob3J0X25hbWVzXCI6W1wiYXN0b25pc2hlZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZhY2VcIixcInhveFwiLFwic3VycHJpc2VkXCIsXCJwb2lzb25lZFwiXSxcInNlYXJjaFwiOlwiYXN0b25pc2hlZCxmYWNlLHhveCxzdXJwcmlzZWQscG9pc29uZWRcIn0sXCJmbGFnLWRtXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIERNXCIsXCJ1bmlmaWVkXCI6XCIxRjFFOS0xRjFGMlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM0LFwic2hlZXRfeVwiOjEzLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWRtXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsZG0scmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwicm9vc3RlclwiOntcIm5hbWVcIjpcIlJvb3N0ZXJcIixcInVuaWZpZWRcIjpcIjFGNDEzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTIsXCJzaGVldF95XCI6MjQsXCJzaG9ydF9uYW1lc1wiOltcInJvb3N0ZXJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcIm5hdHVyZVwiLFwiY2hpY2tlblwiXSxcInNlYXJjaFwiOlwicm9vc3RlcixhbmltYWwsbmF0dXJlLGNoaWNrZW5cIn0sXCJmYWN0b3J5XCI6e1wibmFtZVwiOlwiRmFjdG9yeVwiLFwidW5pZmllZFwiOlwiMUYzRURcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMSxcInNoZWV0X3lcIjozMCxcInNob3J0X25hbWVzXCI6W1wiZmFjdG9yeVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJ1aWxkaW5nXCIsXCJpbmR1c3RyeVwiLFwicG9sbHV0aW9uXCIsXCJzbW9rZVwiXSxcInNlYXJjaFwiOlwiZmFjdG9yeSxidWlsZGluZyxpbmR1c3RyeSxwb2xsdXRpb24sc21va2VcIn0sXCJjb2ZmZWVcIjp7XCJuYW1lXCI6XCJIb3QgQmV2ZXJhZ2VcIixcInVuaWZpZWRcIjpcIjI2MTVcIixcInZhcmlhdGlvbnNcIjpbXCIyNjE1LUZFMEZcIl0sXCJzaGVldF94XCI6MSxcInNoZWV0X3lcIjo4LFwic2hvcnRfbmFtZXNcIjpbXCJjb2ZmZWVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJiZXZlcmFnZVwiLFwiY2FmZmVpbmVcIixcImxhdHRlXCIsXCJlc3ByZXNzb1wiXSxcInNlYXJjaFwiOlwiY29mZmVlLGhvdCxiZXZlcmFnZSxjYWZmZWluZSxsYXR0ZSxlc3ByZXNzb1wifSxcImJvbWJcIjp7XCJuYW1lXCI6XCJCb21iXCIsXCJ1bmlmaWVkXCI6XCIxRjRBM1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIwLFwic2hlZXRfeVwiOjEwLFwic2hvcnRfbmFtZXNcIjpbXCJib21iXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYm9vbVwiLFwiZXhwbG9kZVwiLFwiZXhwbG9zaW9uXCIsXCJ0ZXJyb3Jpc21cIl0sXCJzZWFyY2hcIjpcImJvbWIsYm9vbSxleHBsb2RlLGV4cGxvc2lvbix0ZXJyb3Jpc21cIn0sXCJmbGFnLWRvXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIERPXCIsXCJ1bmlmaWVkXCI6XCIxRjFFOS0xRjFGNFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM0LFwic2hlZXRfeVwiOjE0LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWRvXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsZG8scmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZm91bnRhaW5cIjp7XCJuYW1lXCI6XCJGb3VudGFpblwiLFwidW5pZmllZFwiOlwiMjZGMlwiLFwidmFyaWF0aW9uc1wiOltcIjI2RjItRkUwRlwiXSxcInNoZWV0X3hcIjoyLFwic2hlZXRfeVwiOjMyLFwic2hvcnRfbmFtZXNcIjpbXCJmb3VudGFpblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBob3RvXCIsXCJzdW1tZXJcIixcIndhdGVyXCIsXCJmcmVzaFwiXSxcInNlYXJjaFwiOlwiZm91bnRhaW4scGhvdG8sc3VtbWVyLHdhdGVyLGZyZXNoXCJ9LFwidHVya2V5XCI6e1wibmFtZVwiOlwiVHVya2V5XCIsXCJ1bmlmaWVkXCI6XCIxRjk4M1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMyLFwic2hlZXRfeVwiOjE4LFwic2hvcnRfbmFtZXNcIjpbXCJ0dXJrZXlcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcImJpcmRcIl0sXCJzZWFyY2hcIjpcInR1cmtleSxhbmltYWwsYmlyZFwifSxcInppcHBlcl9tb3V0aF9mYWNlXCI6e1wibmFtZVwiOlwiWmlwcGVyLU1vdXRoIEZhY2VcIixcInVuaWZpZWRcIjpcIjFGOTEwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzIsXCJzaGVldF95XCI6MSxcInNob3J0X25hbWVzXCI6W1wiemlwcGVyX21vdXRoX2ZhY2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiemlwcGVyLG1vdXRoLGZhY2VcIn0sXCJiXCI6e1wibmFtZVwiOlwiTmVnYXRpdmUgU3F1YXJlZCBMYXRpbiBDYXBpdGFsIExldHRlciBCXCIsXCJ1bmlmaWVkXCI6XCIxRjE3MVwiLFwidmFyaWF0aW9uc1wiOltcIjFGMTcxLUZFMEZcIl0sXCJzaGVldF94XCI6NCxcInNoZWV0X3lcIjozMyxcInNob3J0X25hbWVzXCI6W1wiYlwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInJlZC1zcXVhcmVcIixcImFscGhhYmV0XCIsXCJsZXR0ZXJcIl0sXCJzZWFyY2hcIjpcImIsbmVnYXRpdmUsc3F1YXJlZCxsYXRpbixjYXBpdGFsLGxldHRlcixyZWQtc3F1YXJlLGFscGhhYmV0XCJ9LFwibWFza1wiOntcIm5hbWVcIjpcIkZhY2Ugd2l0aCBNZWRpY2FsIE1hc2tcIixcInVuaWZpZWRcIjpcIjFGNjM3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjcsXCJzaGVldF95XCI6MjksXCJzaG9ydF9uYW1lc1wiOltcIm1hc2tcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmYWNlXCIsXCJzaWNrXCIsXCJpbGxcIixcImRpc2Vhc2VcIl0sXCJzZWFyY2hcIjpcIm1hc2ssZmFjZSx3aXRoLG1lZGljYWwsc2ljayxpbGwsZGlzZWFzZVwifSxcImZsYWctZWNcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgRUNcIixcInVuaWZpZWRcIjpcIjFGMUVBLTFGMUU4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzQsXCJzaGVldF95XCI6MTcsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctZWNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxlYyxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJhYlwiOntcIm5hbWVcIjpcIk5lZ2F0aXZlIFNxdWFyZWQgQWJcIixcInVuaWZpZWRcIjpcIjFGMThFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NCxcInNoZWV0X3lcIjozNixcInNob3J0X25hbWVzXCI6W1wiYWJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJyZWQtc3F1YXJlXCIsXCJhbHBoYWJldFwiXSxcInNlYXJjaFwiOlwiYWIsbmVnYXRpdmUsc3F1YXJlZCxyZWQtc3F1YXJlLGFscGhhYmV0XCJ9LFwicmljZV9zY2VuZVwiOntcIm5hbWVcIjpcIk1vb24gVmlld2luZyBDZXJlbW9ueVwiLFwidW5pZmllZFwiOlwiMUYzOTFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo5LFwic2hlZXRfeVwiOjUsXCJzaG9ydF9uYW1lc1wiOltcInJpY2Vfc2NlbmVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJwaG90b1wiLFwiamFwYW5cIixcImFzaWFcIixcInRzdWtpbWlcIl0sXCJzZWFyY2hcIjpcInJpY2Usc2NlbmUsbW9vbix2aWV3aW5nLGNlcmVtb255LHBob3RvLGphcGFuLGFzaWEsdHN1a2ltaVwifSxcImJhYnlfYm90dGxlXCI6e1wibmFtZVwiOlwiQmFieSBCb3R0bGVcIixcInVuaWZpZWRcIjpcIjFGMzdDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OCxcInNoZWV0X3lcIjoyMCxcInNob3J0X25hbWVzXCI6W1wiYmFieV9ib3R0bGVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmb29kXCIsXCJjb250YWluZXJcIixcIm1pbGtcIl0sXCJzZWFyY2hcIjpcImJhYnksYm90dGxlLGZvb2QsY29udGFpbmVyLG1pbGtcIn0sXCJob2Nob1wiOntcIm5hbWVcIjpcIkhvY2hvXCIsXCJ1bmlmaWVkXCI6XCIxRjUyQVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIzLFwic2hlZXRfeVwiOjI2LFwic2hvcnRfbmFtZXNcIjpbXCJob2Nob1wiLFwia25pZmVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJrbmlmZVwiLFwiYmxhZGVcIixcImN1dGxlcnlcIixcImtpdGNoZW5cIixcIndlYXBvblwiXSxcInNlYXJjaFwiOlwiaG9jaG8sa25pZmUsYmxhZGUsY3V0bGVyeSxraXRjaGVuLHdlYXBvblwifSxcImRvdmVfb2ZfcGVhY2VcIjp7XCJuYW1lXCI6XCJEb3ZlIG9mIFBlYWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjU0QVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI0LFwic2hlZXRfeVwiOjYsXCJzaG9ydF9uYW1lc1wiOltcImRvdmVfb2ZfcGVhY2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcImJpcmRcIl0sXCJzZWFyY2hcIjpcImRvdmUsb2YscGVhY2UsYW5pbWFsLGJpcmRcIn0sXCJjbFwiOntcIm5hbWVcIjpcIlNxdWFyZWQgQ2xcIixcInVuaWZpZWRcIjpcIjFGMTkxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NCxcInNoZWV0X3lcIjozNyxcInNob3J0X25hbWVzXCI6W1wiY2xcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbHBoYWJldFwiLFwid29yZHNcIixcInJlZC1zcXVhcmVcIl0sXCJzZWFyY2hcIjpcImNsLHNxdWFyZWQsYWxwaGFiZXQsd29yZHMscmVkLXNxdWFyZVwifSxcImRvZzJcIjp7XCJuYW1lXCI6XCJEb2dcIixcInVuaWZpZWRcIjpcIjFGNDE1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTIsXCJzaGVldF95XCI6MjYsXCJzaG9ydF9uYW1lc1wiOltcImRvZzJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcIm5hdHVyZVwiLFwiZnJpZW5kXCIsXCJkb2dlXCIsXCJwZXRcIixcImZhaXRoZnVsXCJdLFwic2VhcmNoXCI6XCJkb2cyLGRvZyxhbmltYWwsbmF0dXJlLGZyaWVuZCxkb2dlLHBldCxmYWl0aGZ1bFwifSxcImZvcmtfYW5kX2tuaWZlXCI6e1wibmFtZVwiOlwiRm9yayBhbmQgS25pZmVcIixcInVuaWZpZWRcIjpcIjFGMzc0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OCxcInNoZWV0X3lcIjoxMixcInNob3J0X25hbWVzXCI6W1wiZm9ya19hbmRfa25pZmVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJjdXRsZXJ5XCIsXCJraXRjaGVuXCJdLFwic2VhcmNoXCI6XCJmb3JrLGFuZCxrbmlmZSxjdXRsZXJ5LGtpdGNoZW5cIn0sXCJkYWdnZXJfa25pZmVcIjp7XCJuYW1lXCI6XCJEYWdnZXIgS25pZmVcIixcInVuaWZpZWRcIjpcIjFGNUUxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjYsXCJzaGVldF95XCI6NCxcInNob3J0X25hbWVzXCI6W1wiZGFnZ2VyX2tuaWZlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wid2VhcG9uXCJdLFwic2VhcmNoXCI6XCJkYWdnZXIsa25pZmUsd2VhcG9uXCJ9LFwibW91bnRhaW5cIjp7XCJuYW1lXCI6XCJNb3VudGFpblwiLFwidW5pZmllZFwiOlwiMjZGMFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIsXCJzaGVldF95XCI6MzAsXCJzaG9ydF9uYW1lc1wiOltcIm1vdW50YWluXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicGhvdG9cIixcIm5hdHVyZVwiLFwiZW52aXJvbm1lbnRcIl0sXCJzZWFyY2hcIjpcIm1vdW50YWluLHBob3RvLG5hdHVyZSxlbnZpcm9ubWVudFwifSxcImZhY2Vfd2l0aF90aGVybW9tZXRlclwiOntcIm5hbWVcIjpcIkZhY2Ugd2l0aCBUaGVybW9tZXRlclwiLFwidW5pZmllZFwiOlwiMUY5MTJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMixcInNoZWV0X3lcIjozLFwic2hvcnRfbmFtZXNcIjpbXCJmYWNlX3dpdGhfdGhlcm1vbWV0ZXJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmFjZSx3aXRoLHRoZXJtb21ldGVyXCJ9LFwiZmxhZy1lZ1wiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBFR1wiLFwidW5pZmllZFwiOlwiMUYxRUEtMUYxRUNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNCxcInNoZWV0X3lcIjoxOSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1lZ1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGVnLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcInBvb2RsZVwiOntcIm5hbWVcIjpcIlBvb2RsZVwiLFwidW5pZmllZFwiOlwiMUY0MjlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMyxcInNoZWV0X3lcIjo1LFwic2hvcnRfbmFtZXNcIjpbXCJwb29kbGVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJkb2dcIixcImFuaW1hbFwiLFwiMTAxXCIsXCJuYXR1cmVcIixcInBldFwiXSxcInNlYXJjaFwiOlwicG9vZGxlLGRvZyxhbmltYWwsMTAxLG5hdHVyZSxwZXRcIn0sXCJmbGFnLXN2XCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFNWXCIsXCJ1bmlmaWVkXCI6XCIxRjFGOC0xRjFGQlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM4LFwic2hlZXRfeVwiOjIsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctc3ZcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxzdixyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJzbm93X2NhcHBlZF9tb3VudGFpblwiOntcIm5hbWVcIjpcIlNub3cgQ2FwcGVkIE1vdW50YWluXCIsXCJ1bmlmaWVkXCI6XCIxRjNENFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjExLFwic2hlZXRfeVwiOjUsXCJzaG9ydF9uYW1lc1wiOltcInNub3dfY2FwcGVkX21vdW50YWluXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicGhvdG9cIixcIm5hdHVyZVwiLFwiZW52aXJvbm1lbnRcIixcIndpbnRlclwiLFwiY29sZFwiXSxcInNlYXJjaFwiOlwic25vdyxjYXBwZWQsbW91bnRhaW4scGhvdG8sbmF0dXJlLGVudmlyb25tZW50LHdpbnRlcixjb2xkXCJ9LFwiZmFjZV93aXRoX2hlYWRfYmFuZGFnZVwiOntcIm5hbWVcIjpcIkZhY2Ugd2l0aCBIZWFkLUJhbmRhZ2VcIixcInVuaWZpZWRcIjpcIjFGOTE1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzIsXCJzaGVldF95XCI6NixcInNob3J0X25hbWVzXCI6W1wiZmFjZV93aXRoX2hlYWRfYmFuZGFnZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmYWNlLHdpdGgsaGVhZCxiYW5kYWdlXCJ9LFwibzJcIjp7XCJuYW1lXCI6XCJOZWdhdGl2ZSBTcXVhcmVkIExhdGluIENhcGl0YWwgTGV0dGVyIE9cIixcInVuaWZpZWRcIjpcIjFGMTdFXCIsXCJ2YXJpYXRpb25zXCI6W1wiMUYxN0UtRkUwRlwiXSxcInNoZWV0X3hcIjo0LFwic2hlZXRfeVwiOjM0LFwic2hvcnRfbmFtZXNcIjpbXCJvMlwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFscGhhYmV0XCIsXCJyZWQtc3F1YXJlXCIsXCJsZXR0ZXJcIl0sXCJzZWFyY2hcIjpcIm8yLG5lZ2F0aXZlLHNxdWFyZWQsbGF0aW4sY2FwaXRhbCxsZXR0ZXIsbyxhbHBoYWJldCxyZWQtc3F1YXJlXCJ9LFwia25pZmVfZm9ya19wbGF0ZVwiOntcIm5hbWVcIjpcIkZvcmsgYW5kIEtuaWZlIHdpdGggUGxhdGVcIixcInVuaWZpZWRcIjpcIjFGMzdEXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OCxcInNoZWV0X3lcIjoyMSxcInNob3J0X25hbWVzXCI6W1wia25pZmVfZm9ya19wbGF0ZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJrbmlmZSxmb3JrLHBsYXRlLGFuZCx3aXRoXCJ9LFwiY3Jvc3NlZF9zd29yZHNcIjp7XCJuYW1lXCI6XCJDcm9zc2VkIFN3b3Jkc1wiLFwidW5pZmllZFwiOlwiMjY5NFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIsXCJzaGVldF95XCI6NixcInNob3J0X25hbWVzXCI6W1wiY3Jvc3NlZF9zd29yZHNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ3ZWFwb25cIl0sXCJzZWFyY2hcIjpcImNyb3NzZWQsc3dvcmRzLHdlYXBvblwifSxcInNvc1wiOntcIm5hbWVcIjpcIlNxdWFyZWQgU29zXCIsXCJ1bmlmaWVkXCI6XCIxRjE5OFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjUsXCJzaGVldF95XCI6MyxcInNob3J0X25hbWVzXCI6W1wic29zXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiaGVscFwiLFwicmVkLXNxdWFyZVwiLFwid29yZHNcIixcImVtZXJnZW5jeVwiLFwiOTExXCJdLFwic2VhcmNoXCI6XCJzb3Msc3F1YXJlZCxoZWxwLHJlZC1zcXVhcmUsd29yZHMsZW1lcmdlbmN5LDkxMVwifSxcImZsYWctZ3FcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgR1FcIixcInVuaWZpZWRcIjpcIjFGMUVDLTFGMUY2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzUsXCJzaGVldF95XCI6MixcInNob3J0X25hbWVzXCI6W1wiZmxhZy1ncVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGdxLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcIm1vdW50X2Z1amlcIjp7XCJuYW1lXCI6XCJNb3VudCBGdWppXCIsXCJ1bmlmaWVkXCI6XCIxRjVGQlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI2LFwic2hlZXRfeVwiOjEwLFwic2hvcnRfbmFtZXNcIjpbXCJtb3VudF9mdWppXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicGhvdG9cIixcIm1vdW50YWluXCIsXCJuYXR1cmVcIixcImphcGFuZXNlXCJdLFwic2VhcmNoXCI6XCJtb3VudCxmdWppLHBob3RvLG1vdW50YWluLG5hdHVyZSxqYXBhbmVzZVwifSxcImNhdDJcIjp7XCJuYW1lXCI6XCJDYXRcIixcInVuaWZpZWRcIjpcIjFGNDA4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTIsXCJzaGVldF95XCI6MTMsXCJzaG9ydF9uYW1lc1wiOltcImNhdDJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcIm1lb3dcIixcInBldFwiLFwiY2F0c1wiXSxcInNlYXJjaFwiOlwiY2F0MixjYXQsYW5pbWFsLG1lb3cscGV0LGNhdHNcIn0sXCJzaGllbGRcIjp7XCJuYW1lXCI6XCJTaGllbGRcIixcInVuaWZpZWRcIjpcIjFGNkUxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzEsXCJzaGVldF95XCI6MzIsXCJzaG9ydF9uYW1lc1wiOltcInNoaWVsZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInByb3RlY3Rpb25cIixcInNlY3VyaXR5XCJdLFwic2VhcmNoXCI6XCJzaGllbGQscHJvdGVjdGlvbixzZWN1cml0eVwifSxcInNsZWVwaW5nXCI6e1wibmFtZVwiOlwiU2xlZXBpbmcgRmFjZVwiLFwidW5pZmllZFwiOlwiMUY2MzRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNyxcInNoZWV0X3lcIjoyNixcInNob3J0X25hbWVzXCI6W1wic2xlZXBpbmdcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmYWNlXCIsXCJ0aXJlZFwiLFwic2xlZXB5XCIsXCJuaWdodFwiLFwienp6XCJdLFwic2VhcmNoXCI6XCJzbGVlcGluZyxmYWNlLHRpcmVkLHNsZWVweSxuaWdodCx6enpcIn0sXCJ2b2xjYW5vXCI6e1wibmFtZVwiOlwiVm9sY2Fub1wiLFwidW5pZmllZFwiOlwiMUYzMEJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo1LFwic2hlZXRfeVwiOjMyLFwic2hvcnRfbmFtZXNcIjpbXCJ2b2xjYW5vXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicGhvdG9cIixcIm5hdHVyZVwiLFwiZGlzYXN0ZXJcIl0sXCJzZWFyY2hcIjpcInZvbGNhbm8scGhvdG8sbmF0dXJlLGRpc2FzdGVyXCJ9LFwicmFiYml0MlwiOntcIm5hbWVcIjpcIlJhYmJpdFwiLFwidW5pZmllZFwiOlwiMUY0MDdcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMixcInNoZWV0X3lcIjoxMixcInNob3J0X25hbWVzXCI6W1wicmFiYml0MlwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwibmF0dXJlXCIsXCJwZXRcIixcIm1hZ2ljXCIsXCJzcHJpbmdcIl0sXCJzZWFyY2hcIjpcInJhYmJpdDIscmFiYml0LGFuaW1hbCxuYXR1cmUscGV0LG1hZ2ljLHNwcmluZ1wifSxcInNtb2tpbmdcIjp7XCJuYW1lXCI6XCJTbW9raW5nIFN5bWJvbFwiLFwidW5pZmllZFwiOlwiMUY2QUNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMCxcInNoZWV0X3lcIjoyMCxcInNob3J0X25hbWVzXCI6W1wic21va2luZ1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImtpbGxzXCIsXCJ0b2JhY2NvXCIsXCJjaWdhcmV0dGVcIixcImpvaW50XCJdLFwic2VhcmNoXCI6XCJzbW9raW5nLHN5bWJvbCxraWxscyx0b2JhY2NvLGNpZ2FyZXR0ZSxqb2ludFwifSxcImZsYWctZXJcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgRVJcIixcInVuaWZpZWRcIjpcIjFGMUVBLTFGMUY3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzQsXCJzaGVldF95XCI6MjEsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctZXJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxlcixyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJ6enpcIjp7XCJuYW1lXCI6XCJTbGVlcGluZyBTeW1ib2xcIixcInVuaWZpZWRcIjpcIjFGNEE0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjAsXCJzaGVldF95XCI6MTEsXCJzaG9ydF9uYW1lc1wiOltcInp6elwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNsZWVweVwiLFwidGlyZWRcIl0sXCJzZWFyY2hcIjpcInp6eixzbGVlcGluZyxzeW1ib2wsc2xlZXB5LHRpcmVkXCJ9LFwibm9fZW50cnlcIjp7XCJuYW1lXCI6XCJObyBFbnRyeVwiLFwidW5pZmllZFwiOlwiMjZENFwiLFwidmFyaWF0aW9uc1wiOltcIjI2RDQtRkUwRlwiXSxcInNoZWV0X3hcIjoyLFwic2hlZXRfeVwiOjI3LFwic2hvcnRfbmFtZXNcIjpbXCJub19lbnRyeVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImxpbWl0XCIsXCJzZWN1cml0eVwiLFwicHJpdmFjeVwiLFwiYmFkXCIsXCJkZW5pZWRcIixcInN0b3BcIixcImNpcmNsZVwiXSxcInNlYXJjaFwiOlwibm8sZW50cnksbGltaXQsc2VjdXJpdHkscHJpdmFjeSxiYWQsZGVuaWVkLHN0b3AsY2lyY2xlXCJ9LFwiaGFua2V5XCI6e1wibmFtZVwiOlwiUGlsZSBvZiBQb29cIixcInVuaWZpZWRcIjpcIjFGNEE5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjAsXCJzaGVldF95XCI6MTYsXCJzaG9ydF9uYW1lc1wiOltcImhhbmtleVwiLFwicG9vcFwiLFwic2hpdFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBvb3BcIixcInNoaXRmYWNlXCIsXCJmYWlsXCIsXCJ0dXJkXCJdLFwic2VhcmNoXCI6XCJoYW5rZXkscG9vcCxzaGl0LHBpbGUsb2YscG9vLHNoaXRmYWNlLGZhaWwsdHVyZFwifSxcImZsYWctZWVcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgRUVcIixcInVuaWZpZWRcIjpcIjFGMUVBLTFGMUVBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzQsXCJzaGVldF95XCI6MTgsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctZWVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxlZSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJza3VsbF9hbmRfY3Jvc3Nib25lc1wiOntcIm5hbWVcIjpcIlNrdWxsIGFuZCBDcm9zc2JvbmVzXCIsXCJ1bmlmaWVkXCI6XCIyNjIwXCIsXCJ2YXJpYXRpb25zXCI6W1wiMjYyMC1GRTBGXCJdLFwic2hlZXRfeFwiOjEsXCJzaGVldF95XCI6MTYsXCJzaG9ydF9uYW1lc1wiOltcInNrdWxsX2FuZF9jcm9zc2JvbmVzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicG9pc29uXCIsXCJkYW5nZXJcIixcImRlYWRseVwiLFwic2NhcnlcIl0sXCJzZWFyY2hcIjpcInNrdWxsLGFuZCxjcm9zc2JvbmVzLHBvaXNvbixkYW5nZXIsZGVhZGx5LHNjYXJ5XCJ9LFwiY2hpcG11bmtcIjp7XCJuYW1lXCI6XCJDaGlwbXVua1wiLFwidW5pZmllZFwiOlwiMUY0M0ZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMyxcInNoZWV0X3lcIjoyNyxcInNob3J0X25hbWVzXCI6W1wiY2hpcG11bmtcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcIm5hdHVyZVwiLFwicm9kZW50XCJdLFwic2VhcmNoXCI6XCJjaGlwbXVuayxhbmltYWwsbmF0dXJlLHJvZGVudFwifSxcImphcGFuXCI6e1wibmFtZVwiOlwiU2lsaG91ZXR0ZSBvZiBKYXBhblwiLFwidW5pZmllZFwiOlwiMUY1RkVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNixcInNoZWV0X3lcIjoxMyxcInNob3J0X25hbWVzXCI6W1wiamFwYW5cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJuYXRpb25cIixcImNvdW50cnlcIixcImphcGFuZXNlXCIsXCJhc2lhXCJdLFwic2VhcmNoXCI6XCJqYXBhbixzaWxob3VldHRlLG9mLG5hdGlvbixjb3VudHJ5LGphcGFuZXNlLGFzaWFcIn0sXCJuYW1lX2JhZGdlXCI6e1wibmFtZVwiOlwiTmFtZSBCYWRnZVwiLFwidW5pZmllZFwiOlwiMUY0REJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMSxcInNoZWV0X3lcIjozMCxcInNob3J0X25hbWVzXCI6W1wibmFtZV9iYWRnZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZpcmVcIixcImZvcmJpZFwiXSxcInNlYXJjaFwiOlwibmFtZSxiYWRnZSxmaXJlLGZvcmJpZFwifSxcImNvZmZpblwiOntcIm5hbWVcIjpcIkNvZmZpblwiLFwidW5pZmllZFwiOlwiMjZCMFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIsXCJzaGVldF95XCI6MTYsXCJzaG9ydF9uYW1lc1wiOltcImNvZmZpblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInZhbXBpcmVcIixcImRlYWRcIixcImRpZVwiLFwiZGVhdGhcIixcInJpcFwiXSxcInNlYXJjaFwiOlwiY29mZmluLHZhbXBpcmUsZGVhZCxkaWUsZGVhdGgscmlwXCJ9LFwiY2FtcGluZ1wiOntcIm5hbWVcIjpcIkNhbXBpbmdcIixcInVuaWZpZWRcIjpcIjFGM0Q1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTEsXCJzaGVldF95XCI6NixcInNob3J0X25hbWVzXCI6W1wiY2FtcGluZ1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBob3RvXCIsXCJvdXRkb29yc1wiLFwidGVudFwiXSxcInNlYXJjaFwiOlwiY2FtcGluZyxwaG90byxvdXRkb29ycyx0ZW50XCJ9LFwiZmVldFwiOntcIm5hbWVcIjpcIlBhdyBQcmludHNcIixcInVuaWZpZWRcIjpcIjFGNDNFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTMsXCJzaGVldF95XCI6MjYsXCJzaG9ydF9uYW1lc1wiOltcImZlZXRcIixcInBhd19wcmludHNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcInRyYWNraW5nXCIsXCJmb290cHJpbnRzXCIsXCJkb2dcIixcImNhdFwiLFwicGV0XCIsXCJwYXdfcHJpbnRzXCJdLFwic2VhcmNoXCI6XCJmZWV0LHBhdyxwcmludHMsYW5pbWFsLHRyYWNraW5nLGZvb3RwcmludHMsZG9nLGNhdCxwZXQscGF3X3ByaW50c1wifSxcImZsYWctZXRcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgRVRcIixcInVuaWZpZWRcIjpcIjFGMUVBLTFGMUY5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzQsXCJzaGVldF95XCI6MjMsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctZXRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxldCxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJub19lbnRyeV9zaWduXCI6e1wibmFtZVwiOlwiTm8gRW50cnkgU2lnblwiLFwidW5pZmllZFwiOlwiMUY2QUJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMCxcInNoZWV0X3lcIjoxOSxcInNob3J0X25hbWVzXCI6W1wibm9fZW50cnlfc2lnblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZvcmJpZFwiLFwic3RvcFwiLFwibGltaXRcIixcImRlbmllZFwiLFwiZGlzYWxsb3dcIixcImNpcmNsZVwiXSxcInNlYXJjaFwiOlwibm8sZW50cnksc2lnbixmb3JiaWQsc3RvcCxsaW1pdCxkZW5pZWQsZGlzYWxsb3csY2lyY2xlXCJ9LFwic21pbGluZ19pbXBcIjp7XCJuYW1lXCI6XCJTbWlsaW5nIEZhY2Ugd2l0aCBIb3Juc1wiLFwidW5pZmllZFwiOlwiMUY2MDhcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNixcInNoZWV0X3lcIjoyMyxcInNob3J0X25hbWVzXCI6W1wic21pbGluZ19pbXBcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJkZXZpbFwiLFwiaG9ybnNcIl0sXCJzZWFyY2hcIjpcInNtaWxpbmcsaW1wLGZhY2Usd2l0aCxob3JucyxkZXZpbFwifSxcImltcFwiOntcIm5hbWVcIjpcIkltcFwiLFwidW5pZmllZFwiOlwiMUY0N0ZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxOCxcInNoZWV0X3lcIjoyNixcInNob3J0X25hbWVzXCI6W1wiaW1wXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZGV2aWxcIixcImFuZ3J5XCIsXCJob3Juc1wiXSxcInNlYXJjaFwiOlwiaW1wLGRldmlsLGFuZ3J5LGhvcm5zXCJ9LFwiZnVuZXJhbF91cm5cIjp7XCJuYW1lXCI6XCJGdW5lcmFsIFVyblwiLFwidW5pZmllZFwiOlwiMjZCMVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIsXCJzaGVldF95XCI6MTcsXCJzaG9ydF9uYW1lc1wiOltcImZ1bmVyYWxfdXJuXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZGVhZFwiLFwiZGllXCIsXCJkZWF0aFwiLFwicmlwXCIsXCJhc2hlc1wiXSxcInNlYXJjaFwiOlwiZnVuZXJhbCx1cm4sZGVhZCxkaWUsZGVhdGgscmlwLGFzaGVzXCJ9LFwidGVudFwiOntcIm5hbWVcIjpcIlRlbnRcIixcInVuaWZpZWRcIjpcIjI2RkFcIixcInZhcmlhdGlvbnNcIjpbXCIyNkZBLUZFMEZcIl0sXCJzaGVldF94XCI6MyxcInNoZWV0X3lcIjozLFwic2hvcnRfbmFtZXNcIjpbXCJ0ZW50XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicGhvdG9cIixcImNhbXBpbmdcIixcIm91dGRvb3JzXCJdLFwic2VhcmNoXCI6XCJ0ZW50LHBob3RvLGNhbXBpbmcsb3V0ZG9vcnNcIn0sXCJkcmFnb25cIjp7XCJuYW1lXCI6XCJEcmFnb25cIixcInVuaWZpZWRcIjpcIjFGNDA5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTIsXCJzaGVldF95XCI6MTQsXCJzaG9ydF9uYW1lc1wiOltcImRyYWdvblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwibXl0aFwiLFwibmF0dXJlXCIsXCJjaGluZXNlXCIsXCJncmVlblwiXSxcInNlYXJjaFwiOlwiZHJhZ29uLGFuaW1hbCxteXRoLG5hdHVyZSxjaGluZXNlLGdyZWVuXCJ9LFwieFwiOntcIm5hbWVcIjpcIkNyb3NzIE1hcmtcIixcInVuaWZpZWRcIjpcIjI3NENcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo0LFwic2hlZXRfeVwiOjMsXCJzaG9ydF9uYW1lc1wiOltcInhcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJub1wiLFwiZGVsZXRlXCIsXCJyZW1vdmVcIixcImNhbmNlbFwiXSxcInNlYXJjaFwiOlwieCxjcm9zcyxtYXJrLG5vLGRlbGV0ZSxyZW1vdmUsY2FuY2VsXCJ9LFwiZmxhZy1ldVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBFVVwiLFwidW5pZmllZFwiOlwiMUYxRUEtMUYxRkFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNCxcInNoZWV0X3lcIjoyNCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1ldVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGV1LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImFtcGhvcmFcIjp7XCJuYW1lXCI6XCJBbXBob3JhXCIsXCJ1bmlmaWVkXCI6XCIxRjNGQVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjExLFwic2hlZXRfeVwiOjQwLFwic2hvcnRfbmFtZXNcIjpbXCJhbXBob3JhXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widmFzZVwiLFwiamFyXCJdLFwic2VhcmNoXCI6XCJhbXBob3JhLHZhc2UsamFyXCJ9LFwib1wiOntcIm5hbWVcIjpcIkhlYXZ5IExhcmdlIENpcmNsZVwiLFwidW5pZmllZFwiOlwiMkI1NVwiLFwidmFyaWF0aW9uc1wiOltcIjJCNTUtRkUwRlwiXSxcInNoZWV0X3hcIjo0LFwic2hlZXRfeVwiOjI1LFwic2hvcnRfbmFtZXNcIjpbXCJvXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiY2lyY2xlXCIsXCJyb3VuZFwiXSxcInNlYXJjaFwiOlwibyxoZWF2eSxsYXJnZSxjaXJjbGUscm91bmRcIn0sXCJuYXRpb25hbF9wYXJrXCI6e1wibmFtZVwiOlwiTmF0aW9uYWwgUGFya1wiLFwidW5pZmllZFwiOlwiMUYzREVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMSxcInNoZWV0X3lcIjoxNSxcInNob3J0X25hbWVzXCI6W1wibmF0aW9uYWxfcGFya1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBob3RvXCIsXCJlbnZpcm9ubWVudFwiLFwibmF0dXJlXCJdLFwic2VhcmNoXCI6XCJuYXRpb25hbCxwYXJrLHBob3RvLGVudmlyb25tZW50LG5hdHVyZVwifSxcImRyYWdvbl9mYWNlXCI6e1wibmFtZVwiOlwiRHJhZ29uIEZhY2VcIixcInVuaWZpZWRcIjpcIjFGNDMyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTMsXCJzaGVldF95XCI6MTQsXCJzaG9ydF9uYW1lc1wiOltcImRyYWdvbl9mYWNlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW5pbWFsXCIsXCJteXRoXCIsXCJuYXR1cmVcIixcImNoaW5lc2VcIixcImdyZWVuXCJdLFwic2VhcmNoXCI6XCJkcmFnb24sZmFjZSxhbmltYWwsbXl0aCxuYXR1cmUsY2hpbmVzZSxncmVlblwifSxcImZsYWctZmtcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgRktcIixcInVuaWZpZWRcIjpcIjFGMUVCLTFGMUYwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzQsXCJzaGVldF95XCI6MjcsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctZmtcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsZmsscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiamFwYW5lc2Vfb2dyZVwiOntcIm5hbWVcIjpcIkphcGFuZXNlIE9ncmVcIixcInVuaWZpZWRcIjpcIjFGNDc5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTgsXCJzaGVldF95XCI6MTUsXCJzaG9ydF9uYW1lc1wiOltcImphcGFuZXNlX29ncmVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJtb25zdGVyXCIsXCJyZWRcIixcIm1hc2tcIixcImhhbGxvd2VlblwiLFwic2NhcnlcIixcImNyZWVweVwiLFwiZGV2aWxcIixcImRlbW9uXCJdLFwic2VhcmNoXCI6XCJqYXBhbmVzZSxvZ3JlLG1vbnN0ZXIscmVkLG1hc2ssaGFsbG93ZWVuLHNjYXJ5LGNyZWVweSxkZXZpbCxkZW1vblwifSxcImphcGFuZXNlX2dvYmxpblwiOntcIm5hbWVcIjpcIkphcGFuZXNlIEdvYmxpblwiLFwidW5pZmllZFwiOlwiMUY0N0FcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxOCxcInNoZWV0X3lcIjoxNixcInNob3J0X25hbWVzXCI6W1wiamFwYW5lc2VfZ29ibGluXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicmVkXCIsXCJldmlsXCIsXCJtYXNrXCIsXCJtb25zdGVyXCIsXCJzY2FyeVwiLFwiY3JlZXB5XCJdLFwic2VhcmNoXCI6XCJqYXBhbmVzZSxnb2JsaW4scmVkLGV2aWwsbWFzayxtb25zdGVyLHNjYXJ5LGNyZWVweVwifSxcImZsYWctZm9cIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgRk9cIixcInVuaWZpZWRcIjpcIjFGMUVCLTFGMUY0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzQsXCJzaGVldF95XCI6MjksXCJzaG9ydF9uYW1lc1wiOltcImZsYWctZm9cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxmbyxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJtb3RvcndheVwiOntcIm5hbWVcIjpcIk1vdG9yd2F5XCIsXCJ1bmlmaWVkXCI6XCIxRjZFM1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMxLFwic2hlZXRfeVwiOjM0LFwic2hvcnRfbmFtZXNcIjpbXCJtb3RvcndheVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInJvYWRcIixcImN1cGVydGlub1wiLFwiaW50ZXJzdGF0ZVwiLFwiaGlnaHdheVwiXSxcInNlYXJjaFwiOlwibW90b3J3YXkscm9hZCxjdXBlcnRpbm8saW50ZXJzdGF0ZSxoaWdod2F5XCJ9LFwiY2FjdHVzXCI6e1wibmFtZVwiOlwiQ2FjdHVzXCIsXCJ1bmlmaWVkXCI6XCIxRjMzNVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjYsXCJzaGVldF95XCI6MzEsXCJzaG9ydF9uYW1lc1wiOltcImNhY3R1c1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInZlZ2V0YWJsZVwiLFwicGxhbnRcIixcIm5hdHVyZVwiXSxcInNlYXJjaFwiOlwiY2FjdHVzLHZlZ2V0YWJsZSxwbGFudCxuYXR1cmVcIn0sXCJhbmdlclwiOntcIm5hbWVcIjpcIkFuZ2VyIFN5bWJvbFwiLFwidW5pZmllZFwiOlwiMUY0QTJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMCxcInNoZWV0X3lcIjo5LFwic2hvcnRfbmFtZXNcIjpbXCJhbmdlclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuZ3J5XCIsXCJtYWRcIl0sXCJzZWFyY2hcIjpcImFuZ2VyLHN5bWJvbCxhbmdyeSxtYWRcIn0sXCJjcnlzdGFsX2JhbGxcIjp7XCJuYW1lXCI6XCJDcnlzdGFsIEJhbGxcIixcInVuaWZpZWRcIjpcIjFGNTJFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjMsXCJzaGVldF95XCI6MzAsXCJzaG9ydF9uYW1lc1wiOltcImNyeXN0YWxfYmFsbFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImRpc2NvXCIsXCJwYXJ0eVwiLFwibWFnaWNcIixcImNpcmN1c1wiLFwiZm9ydHVuZV90ZWxsZXJcIl0sXCJzZWFyY2hcIjpcImNyeXN0YWwsYmFsbCxkaXNjbyxwYXJ0eSxtYWdpYyxjaXJjdXMsZm9ydHVuZV90ZWxsZXJcIn0sXCJza3VsbFwiOntcIm5hbWVcIjpcIlNrdWxsXCIsXCJ1bmlmaWVkXCI6XCIxRjQ4MFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE4LFwic2hlZXRfeVwiOjI3LFwic2hvcnRfbmFtZXNcIjpbXCJza3VsbFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImRlYWRcIixcInNrZWxldG9uXCIsXCJjcmVlcHlcIl0sXCJzZWFyY2hcIjpcInNrdWxsLGRlYWQsc2tlbGV0b24sY3JlZXB5XCJ9LFwiaG90c3ByaW5nc1wiOntcIm5hbWVcIjpcIkhvdCBTcHJpbmdzXCIsXCJ1bmlmaWVkXCI6XCIyNjY4XCIsXCJ2YXJpYXRpb25zXCI6W1wiMjY2OC1GRTBGXCJdLFwic2hlZXRfeFwiOjIsXCJzaGVldF95XCI6MSxcInNob3J0X25hbWVzXCI6W1wiaG90c3ByaW5nc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJhdGhcIixcIndhcm1cIixcInJlbGF4XCJdLFwic2VhcmNoXCI6XCJob3RzcHJpbmdzLGhvdCxzcHJpbmdzLGJhdGgsd2FybSxyZWxheFwifSxcImZsYWctZmpcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgRkpcIixcInVuaWZpZWRcIjpcIjFGMUVCLTFGMUVGXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzQsXCJzaGVldF95XCI6MjYsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctZmpcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxmaixyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJwcmF5ZXJfYmVhZHNcIjp7XCJuYW1lXCI6XCJQcmF5ZXIgQmVhZHNcIixcInVuaWZpZWRcIjpcIjFGNEZGXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjIsXCJzaGVldF95XCI6MjQsXCJzaG9ydF9uYW1lc1wiOltcInByYXllcl9iZWFkc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImRoaWtyXCIsXCJyZWxpZ2lvdXNcIl0sXCJzZWFyY2hcIjpcInByYXllcixiZWFkcyxkaGlrcixyZWxpZ2lvdXNcIn0sXCJjaHJpc3RtYXNfdHJlZVwiOntcIm5hbWVcIjpcIkNocmlzdG1hcyBUcmVlXCIsXCJ1bmlmaWVkXCI6XCIxRjM4NFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjgsXCJzaGVldF95XCI6MjgsXCJzaG9ydF9uYW1lc1wiOltcImNocmlzdG1hc190cmVlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmVzdGl2YWxcIixcInZhY2F0aW9uXCIsXCJkZWNlbWJlclwiLFwieG1hc1wiLFwiY2VsZWJyYXRpb25cIl0sXCJzZWFyY2hcIjpcImNocmlzdG1hcyx0cmVlLGZlc3RpdmFsLHZhY2F0aW9uLGRlY2VtYmVyLHhtYXMsY2VsZWJyYXRpb25cIn0sXCJyYWlsd2F5X3RyYWNrXCI6e1wibmFtZVwiOlwiUmFpbHdheSBUcmFja1wiLFwidW5pZmllZFwiOlwiMUY2RTRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMSxcInNoZWV0X3lcIjozNSxcInNob3J0X25hbWVzXCI6W1wicmFpbHdheV90cmFja1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRyYWluXCIsXCJ0cmFuc3BvcnRhdGlvblwiXSxcInNlYXJjaFwiOlwicmFpbHdheSx0cmFjayx0cmFpbix0cmFuc3BvcnRhdGlvblwifSxcImZsYWctZmlcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgRklcIixcInVuaWZpZWRcIjpcIjFGMUVCLTFGMUVFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzQsXCJzaGVldF95XCI6MjUsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctZmlcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxmaSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJiYXJiZXJcIjp7XCJuYW1lXCI6XCJCYXJiZXIgUG9sZVwiLFwidW5pZmllZFwiOlwiMUY0ODhcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxOSxcInNoZWV0X3lcIjoyNCxcInNob3J0X25hbWVzXCI6W1wiYmFyYmVyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiaGFpclwiLFwic2Fsb25cIixcInN0eWxlXCJdLFwic2VhcmNoXCI6XCJiYXJiZXIscG9sZSxoYWlyLHNhbG9uLHN0eWxlXCJ9LFwiZ2hvc3RcIjp7XCJuYW1lXCI6XCJHaG9zdFwiLFwidW5pZmllZFwiOlwiMUY0N0JcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxOCxcInNoZWV0X3lcIjoxNyxcInNob3J0X25hbWVzXCI6W1wiZ2hvc3RcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJoYWxsb3dlZW5cIixcInNwb29reVwiLFwic2NhcnlcIl0sXCJzZWFyY2hcIjpcImdob3N0LGhhbGxvd2VlbixzcG9va3ksc2NhcnlcIn0sXCJzdW5yaXNlXCI6e1wibmFtZVwiOlwiU3VucmlzZVwiLFwidW5pZmllZFwiOlwiMUYzMDVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo1LFwic2hlZXRfeVwiOjI2LFwic2hvcnRfbmFtZXNcIjpbXCJzdW5yaXNlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibW9ybmluZ1wiLFwidmlld1wiLFwidmFjYXRpb25cIixcInBob3RvXCJdLFwic2VhcmNoXCI6XCJzdW5yaXNlLG1vcm5pbmcsdmlldyx2YWNhdGlvbixwaG90b1wifSxcImV2ZXJncmVlbl90cmVlXCI6e1wibmFtZVwiOlwiRXZlcmdyZWVuIFRyZWVcIixcInVuaWZpZWRcIjpcIjFGMzMyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NixcInNoZWV0X3lcIjoyOCxcInNob3J0X25hbWVzXCI6W1wiZXZlcmdyZWVuX3RyZWVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJwbGFudFwiLFwibmF0dXJlXCJdLFwic2VhcmNoXCI6XCJldmVyZ3JlZW4sdHJlZSxwbGFudCxuYXR1cmVcIn0sXCJub19wZWRlc3RyaWFuc1wiOntcIm5hbWVcIjpcIk5vIFBlZGVzdHJpYW5zXCIsXCJ1bmlmaWVkXCI6XCIxRjZCN1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMxLFwic2hlZXRfeVwiOjUsXCJzaG9ydF9uYW1lc1wiOltcIm5vX3BlZGVzdHJpYW5zXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicnVsZXNcIixcImNyb3NzaW5nXCIsXCJ3YWxraW5nXCIsXCJjaXJjbGVcIl0sXCJzZWFyY2hcIjpcIm5vLHBlZGVzdHJpYW5zLHJ1bGVzLGNyb3NzaW5nLHdhbGtpbmcsY2lyY2xlXCJ9LFwic3VucmlzZV9vdmVyX21vdW50YWluc1wiOntcIm5hbWVcIjpcIlN1bnJpc2Ugb3ZlciBNb3VudGFpbnNcIixcInVuaWZpZWRcIjpcIjFGMzA0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NSxcInNoZWV0X3lcIjoyNSxcInNob3J0X25hbWVzXCI6W1wic3VucmlzZV9vdmVyX21vdW50YWluc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInZpZXdcIixcInZhY2F0aW9uXCIsXCJwaG90b1wiXSxcInNlYXJjaFwiOlwic3VucmlzZSxvdmVyLG1vdW50YWlucyx2aWV3LHZhY2F0aW9uLHBob3RvXCJ9LFwiYWxlbWJpY1wiOntcIm5hbWVcIjpcIkFsZW1iaWNcIixcInVuaWZpZWRcIjpcIjI2OTdcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyLFwic2hlZXRfeVwiOjgsXCJzaG9ydF9uYW1lc1wiOltcImFsZW1iaWNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJkaXN0aWxsaW5nXCIsXCJzY2llbmNlXCIsXCJleHBlcmltZW50XCJdLFwic2VhcmNoXCI6XCJhbGVtYmljLGRpc3RpbGxpbmcsc2NpZW5jZSxleHBlcmltZW50XCJ9LFwiYWxpZW5cIjp7XCJuYW1lXCI6XCJFeHRyYXRlcnJlc3RyaWFsIEFsaWVuXCIsXCJ1bmlmaWVkXCI6XCIxRjQ3RFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE4LFwic2hlZXRfeVwiOjI0LFwic2hvcnRfbmFtZXNcIjpbXCJhbGllblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIlVGT1wiLFwicGF1bFwiLFwid2VpcmRcIixcIm91dGVyX3NwYWNlXCJdLFwic2VhcmNoXCI6XCJhbGllbixleHRyYXRlcnJlc3RyaWFsLHVmbyxwYXVsLHdlaXJkLG91dGVyX3NwYWNlXCJ9LFwiZGVjaWR1b3VzX3RyZWVcIjp7XCJuYW1lXCI6XCJEZWNpZHVvdXMgVHJlZVwiLFwidW5pZmllZFwiOlwiMUYzMzNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo2LFwic2hlZXRfeVwiOjI5LFwic2hvcnRfbmFtZXNcIjpbXCJkZWNpZHVvdXNfdHJlZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBsYW50XCIsXCJuYXR1cmVcIl0sXCJzZWFyY2hcIjpcImRlY2lkdW91cyx0cmVlLHBsYW50LG5hdHVyZVwifSxcImRvX25vdF9saXR0ZXJcIjp7XCJuYW1lXCI6XCJEbyBOb3QgTGl0dGVyIFN5bWJvbFwiLFwidW5pZmllZFwiOlwiMUY2QUZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMCxcInNoZWV0X3lcIjoyMyxcInNob3J0X25hbWVzXCI6W1wiZG9fbm90X2xpdHRlclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRyYXNoXCIsXCJiaW5cIixcImdhcmJhZ2VcIixcImNpcmNsZVwiXSxcInNlYXJjaFwiOlwiZG8sbm90LGxpdHRlcixzeW1ib2wsdHJhc2gsYmluLGdhcmJhZ2UsY2lyY2xlXCJ9LFwiZmxhZy1mclwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBGUlwiLFwidW5pZmllZFwiOlwiMUYxRUItMUYxRjdcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNCxcInNoZWV0X3lcIjozMCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1mclwiLFwiZnJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxmcixyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJ0ZWxlc2NvcGVcIjp7XCJuYW1lXCI6XCJUZWxlc2NvcGVcIixcInVuaWZpZWRcIjpcIjFGNTJEXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjMsXCJzaGVldF95XCI6MjksXCJzaG9ydF9uYW1lc1wiOltcInRlbGVzY29wZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInN0YXJzXCIsXCJzcGFjZVwiLFwiem9vbVwiXSxcInNlYXJjaFwiOlwidGVsZXNjb3BlLHN0YXJzLHNwYWNlLHpvb21cIn0sXCJwYWxtX3RyZWVcIjp7XCJuYW1lXCI6XCJQYWxtIFRyZWVcIixcInVuaWZpZWRcIjpcIjFGMzM0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NixcInNoZWV0X3lcIjozMCxcInNob3J0X25hbWVzXCI6W1wicGFsbV90cmVlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicGxhbnRcIixcInZlZ2V0YWJsZVwiLFwibmF0dXJlXCIsXCJzdW1tZXJcIixcImJlYWNoXCJdLFwic2VhcmNoXCI6XCJwYWxtLHRyZWUscGxhbnQsdmVnZXRhYmxlLG5hdHVyZSxzdW1tZXIsYmVhY2hcIn0sXCJub19iaWN5Y2xlc1wiOntcIm5hbWVcIjpcIk5vIEJpY3ljbGVzXCIsXCJ1bmlmaWVkXCI6XCIxRjZCM1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMwLFwic2hlZXRfeVwiOjI3LFwic2hvcnRfbmFtZXNcIjpbXCJub19iaWN5Y2xlc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImN5Y2xpc3RcIixcInByb2hpYml0ZWRcIixcImNpcmNsZVwiXSxcInNlYXJjaFwiOlwibm8sYmljeWNsZXMsY3ljbGlzdCxwcm9oaWJpdGVkLGNpcmNsZVwifSxcImRlc2VydFwiOntcIm5hbWVcIjpcIkRlc2VydFwiLFwidW5pZmllZFwiOlwiMUYzRENcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMSxcInNoZWV0X3lcIjoxMyxcInNob3J0X25hbWVzXCI6W1wiZGVzZXJ0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicGhvdG9cIixcIndhcm1cIixcInNhaGFyYWhcIl0sXCJzZWFyY2hcIjpcImRlc2VydCxwaG90byx3YXJtLHNhaGFyYWhcIn0sXCJyb2JvdF9mYWNlXCI6e1wibmFtZVwiOlwiUm9ib3QgRmFjZVwiLFwidW5pZmllZFwiOlwiMUY5MTZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMixcInNoZWV0X3lcIjo3LFwic2hvcnRfbmFtZXNcIjpbXCJyb2JvdF9mYWNlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcInJvYm90LGZhY2VcIn0sXCJmbGFnLWdmXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEdGXCIsXCJ1bmlmaWVkXCI6XCIxRjFFQy0xRjFFQlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM0LFwic2hlZXRfeVwiOjM1LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWdmXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGdmLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcIm5vbi1wb3RhYmxlX3dhdGVyXCI6e1wibmFtZVwiOlwiTm9uLVBvdGFibGUgV2F0ZXIgU3ltYm9sXCIsXCJ1bmlmaWVkXCI6XCIxRjZCMVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMwLFwic2hlZXRfeVwiOjI1LFwic2hvcnRfbmFtZXNcIjpbXCJub24tcG90YWJsZV93YXRlclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImRyaW5rXCIsXCJmYXVjZXRcIixcInRhcFwiLFwiY2lyY2xlXCJdLFwic2VhcmNoXCI6XCJub24scG90YWJsZSx3YXRlcixzeW1ib2wsZHJpbmssZmF1Y2V0LHRhcCxjaXJjbGVcIn0sXCJiZWFjaF93aXRoX3VtYnJlbGxhXCI6e1wibmFtZVwiOlwiQmVhY2ggd2l0aCBVbWJyZWxsYVwiLFwidW5pZmllZFwiOlwiMUYzRDZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMSxcInNoZWV0X3lcIjo3LFwic2hvcnRfbmFtZXNcIjpbXCJiZWFjaF93aXRoX3VtYnJlbGxhXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wid2VhdGhlclwiLFwic3VtbWVyXCIsXCJzdW5ueVwiLFwic2FuZFwiXSxcInNlYXJjaFwiOlwiYmVhY2gsd2l0aCx1bWJyZWxsYSx3ZWF0aGVyLHN1bW1lcixzdW5ueSxzYW5kXCJ9LFwibWljcm9zY29wZVwiOntcIm5hbWVcIjpcIk1pY3Jvc2NvcGVcIixcInVuaWZpZWRcIjpcIjFGNTJDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjMsXCJzaGVldF95XCI6MjgsXCJzaG9ydF9uYW1lc1wiOltcIm1pY3Jvc2NvcGVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJsYWJvcmF0b3J5XCIsXCJleHBlcmltZW50XCIsXCJ6b29taW5cIixcInNjaWVuY2VcIixcInN0dWR5XCJdLFwic2VhcmNoXCI6XCJtaWNyb3Njb3BlLGxhYm9yYXRvcnksZXhwZXJpbWVudCx6b29taW4sc2NpZW5jZSxzdHVkeVwifSxcInNlZWRsaW5nXCI6e1wibmFtZVwiOlwiU2VlZGxpbmdcIixcInVuaWZpZWRcIjpcIjFGMzMxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NixcInNoZWV0X3lcIjoyNyxcInNob3J0X25hbWVzXCI6W1wic2VlZGxpbmdcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJwbGFudFwiLFwibmF0dXJlXCIsXCJncmFzc1wiLFwibGF3blwiLFwic3ByaW5nXCJdLFwic2VhcmNoXCI6XCJzZWVkbGluZyxwbGFudCxuYXR1cmUsZ3Jhc3MsbGF3bixzcHJpbmdcIn0sXCJzbWlsZXlfY2F0XCI6e1wibmFtZVwiOlwiU21pbGluZyBDYXQgRmFjZSB3aXRoIE9wZW4gTW91dGhcIixcInVuaWZpZWRcIjpcIjFGNjNBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjcsXCJzaGVldF95XCI6MzIsXCJzaG9ydF9uYW1lc1wiOltcInNtaWxleV9jYXRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcImNhdHNcIixcImhhcHB5XCJdLFwic2VhcmNoXCI6XCJzbWlsZXksY2F0LHNtaWxpbmcsZmFjZSx3aXRoLG9wZW4sbW91dGgsYW5pbWFsLGNhdHMsaGFwcHlcIn0sXCJmbGFnLXBmXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFBGXCIsXCJ1bmlmaWVkXCI6XCIxRjFGNS0xRjFFQlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM3LFwic2hlZXRfeVwiOjgsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctcGZcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxwZixyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJoZXJiXCI6e1wibmFtZVwiOlwiSGVyYlwiLFwidW5pZmllZFwiOlwiMUYzM0ZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo3LFwic2hlZXRfeVwiOjAsXCJzaG9ydF9uYW1lc1wiOltcImhlcmJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ2ZWdldGFibGVcIixcInBsYW50XCIsXCJtZWRpY2luZVwiLFwid2VlZFwiLFwiZ3Jhc3NcIixcImxhd25cIl0sXCJzZWFyY2hcIjpcImhlcmIsdmVnZXRhYmxlLHBsYW50LG1lZGljaW5lLHdlZWQsZ3Jhc3MsbGF3blwifSxcInVuZGVyYWdlXCI6e1wibmFtZVwiOlwiTm8gT25lIFVuZGVyIEVpZ2h0ZWVuIFN5bWJvbFwiLFwidW5pZmllZFwiOlwiMUY1MUVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMyxcInNoZWV0X3lcIjoxNCxcInNob3J0X25hbWVzXCI6W1widW5kZXJhZ2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCIxOFwiLFwiZHJpbmtcIixcInB1YlwiLFwibmlnaHRcIixcIm1pbm9yXCIsXCJjaXJjbGVcIl0sXCJzZWFyY2hcIjpcInVuZGVyYWdlLG5vLG9uZSx1bmRlcixlaWdodGVlbixzeW1ib2wsMTgsZHJpbmsscHViLG5pZ2h0LG1pbm9yLGNpcmNsZVwifSxcImhvbGVcIjp7XCJuYW1lXCI6XCJIb2xlXCIsXCJ1bmlmaWVkXCI6XCIxRjU3M1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI0LFwic2hlZXRfeVwiOjM3LFwic2hvcnRfbmFtZXNcIjpbXCJob2xlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZW1iYXJyYXNzaW5nXCJdLFwic2VhcmNoXCI6XCJob2xlLGVtYmFycmFzc2luZ1wifSxcImZsYWctdGZcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgVEZcIixcInVuaWZpZWRcIjpcIjFGMUY5LTFGMUVCXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzgsXCJzaGVldF95XCI6OSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy10ZlwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyx0ZixyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJkZXNlcnRfaXNsYW5kXCI6e1wibmFtZVwiOlwiRGVzZXJ0IElzbGFuZFwiLFwidW5pZmllZFwiOlwiMUYzRERcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMSxcInNoZWV0X3lcIjoxNCxcInNob3J0X25hbWVzXCI6W1wiZGVzZXJ0X2lzbGFuZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBob3RvXCIsXCJ0cm9waWNhbFwiXSxcInNlYXJjaFwiOlwiZGVzZXJ0LGlzbGFuZCxwaG90byx0cm9waWNhbFwifSxcInNtaWxlX2NhdFwiOntcIm5hbWVcIjpcIkdyaW5uaW5nIENhdCBGYWNlIHdpdGggU21pbGluZyBFeWVzXCIsXCJ1bmlmaWVkXCI6XCIxRjYzOFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI3LFwic2hlZXRfeVwiOjMwLFwic2hvcnRfbmFtZXNcIjpbXCJzbWlsZV9jYXRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcImNhdHNcIl0sXCJzZWFyY2hcIjpcInNtaWxlLGNhdCxncmlubmluZyxmYWNlLHdpdGgsc21pbGluZyxleWVzLGFuaW1hbCxjYXRzXCJ9LFwicGlsbFwiOntcIm5hbWVcIjpcIlBpbGxcIixcInVuaWZpZWRcIjpcIjFGNDhBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTksXCJzaGVldF95XCI6MjYsXCJzaG9ydF9uYW1lc1wiOltcInBpbGxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJoZWFsdGhcIixcIm1lZGljaW5lXCIsXCJkb2N0b3JcIixcInBoYXJtYWN5XCIsXCJkcnVnXCJdLFwic2VhcmNoXCI6XCJwaWxsLGhlYWx0aCxtZWRpY2luZSxkb2N0b3IscGhhcm1hY3ksZHJ1Z1wifSxcInNoYW1yb2NrXCI6e1wibmFtZVwiOlwiU2hhbXJvY2tcIixcInVuaWZpZWRcIjpcIjI2MThcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxLFwic2hlZXRfeVwiOjksXCJzaG9ydF9uYW1lc1wiOltcInNoYW1yb2NrXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widmVnZXRhYmxlXCIsXCJwbGFudFwiLFwibmF0dXJlXCIsXCJpcmlzaFwiXSxcInNlYXJjaFwiOlwic2hhbXJvY2ssdmVnZXRhYmxlLHBsYW50LG5hdHVyZSxpcmlzaFwifSxcImZsYWctZ2FcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgR0FcIixcInVuaWZpZWRcIjpcIjFGMUVDLTFGMUU2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzQsXCJzaGVldF95XCI6MzEsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctZ2FcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxnYSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJjaXR5X3N1bnJpc2VcIjp7XCJuYW1lXCI6XCJTdW5zZXQgb3ZlciBCdWlsZGluZ3NcIixcInVuaWZpZWRcIjpcIjFGMzA3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NSxcInNoZWV0X3lcIjoyOCxcInNob3J0X25hbWVzXCI6W1wiY2l0eV9zdW5yaXNlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicGhvdG9cIixcImdvb2QgbW9ybmluZ1wiLFwiZGF3blwiXSxcInNlYXJjaFwiOlwiY2l0eSxzdW5yaXNlLHN1bnNldCxvdmVyLGJ1aWxkaW5ncyxwaG90byxnb29kIG1vcm5pbmcsZGF3blwifSxcImpveV9jYXRcIjp7XCJuYW1lXCI6XCJDYXQgRmFjZSB3aXRoIFRlYXJzIG9mIEpveVwiLFwidW5pZmllZFwiOlwiMUY2MzlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNyxcInNoZWV0X3lcIjozMSxcInNob3J0X25hbWVzXCI6W1wiam95X2NhdFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwiY2F0c1wiLFwiaGFoYVwiLFwiaGFwcHlcIixcInRlYXJzXCJdLFwic2VhcmNoXCI6XCJqb3ksY2F0LGZhY2Usd2l0aCx0ZWFycyxvZixhbmltYWwsY2F0cyxoYWhhLGhhcHB5XCJ9LFwibm9fbW9iaWxlX3Bob25lc1wiOntcIm5hbWVcIjpcIk5vIE1vYmlsZSBQaG9uZXNcIixcInVuaWZpZWRcIjpcIjFGNEY1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjIsXCJzaGVldF95XCI6MTUsXCJzaG9ydF9uYW1lc1wiOltcIm5vX21vYmlsZV9waG9uZXNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJpcGhvbmVcIixcIm11dGVcIixcImNpcmNsZVwiXSxcInNlYXJjaFwiOlwibm8sbW9iaWxlLHBob25lcyxpcGhvbmUsbXV0ZSxjaXJjbGVcIn0sXCJoZWFydF9leWVzX2NhdFwiOntcIm5hbWVcIjpcIlNtaWxpbmcgQ2F0IEZhY2Ugd2l0aCBIZWFydC1TaGFwZWQgRXllc1wiLFwidW5pZmllZFwiOlwiMUY2M0JcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNyxcInNoZWV0X3lcIjozMyxcInNob3J0X25hbWVzXCI6W1wiaGVhcnRfZXllc19jYXRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcImxvdmVcIixcImxpa2VcIixcImFmZmVjdGlvblwiLFwiY2F0c1wiLFwidmFsZW50aW5lc1wiXSxcInNlYXJjaFwiOlwiaGVhcnQsZXllcyxjYXQsc21pbGluZyxmYWNlLHdpdGgsc2hhcGVkLGFuaW1hbCxsb3ZlLGxpa2UsYWZmZWN0aW9uLGNhdHMsdmFsZW50aW5lc1wifSxcInN5cmluZ2VcIjp7XCJuYW1lXCI6XCJTeXJpbmdlXCIsXCJ1bmlmaWVkXCI6XCIxRjQ4OVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE5LFwic2hlZXRfeVwiOjI1LFwic2hvcnRfbmFtZXNcIjpbXCJzeXJpbmdlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiaGVhbHRoXCIsXCJob3NwaXRhbFwiLFwiZHJ1Z3NcIixcImJsb29kXCIsXCJtZWRpY2luZVwiLFwibmVlZGxlXCIsXCJkb2N0b3JcIixcIm51cnNlXCJdLFwic2VhcmNoXCI6XCJzeXJpbmdlLGhlYWx0aCxob3NwaXRhbCxkcnVncyxibG9vZCxtZWRpY2luZSxuZWVkbGUsZG9jdG9yLG51cnNlXCJ9LFwiZXhjbGFtYXRpb25cIjp7XCJuYW1lXCI6XCJIZWF2eSBFeGNsYW1hdGlvbiBNYXJrIFN5bWJvbFwiLFwidW5pZmllZFwiOlwiMjc1N1wiLFwidmFyaWF0aW9uc1wiOltcIjI3NTctRkUwRlwiXSxcInNoZWV0X3hcIjo0LFwic2hlZXRfeVwiOjgsXCJzaG9ydF9uYW1lc1wiOltcImV4Y2xhbWF0aW9uXCIsXCJoZWF2eV9leGNsYW1hdGlvbl9tYXJrXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiaGVhdnlfZXhjbGFtYXRpb25fbWFya1wiLFwiZGFuZ2VyXCIsXCJzdXJwcmlzZVwiLFwicHVuY3R1YXRpb25cIixcIndvd1wiLFwid2FybmluZ1wiXSxcInNlYXJjaFwiOlwiZXhjbGFtYXRpb24saGVhdnksbWFyayxzeW1ib2wsaGVhdnlfZXhjbGFtYXRpb25fbWFyayxkYW5nZXIsc3VycHJpc2UscHVuY3R1YXRpb24sd293LHdhcm5pbmdcIn0sXCJjaXR5X3N1bnNldFwiOntcIm5hbWVcIjpcIkNpdHlzY2FwZSBhdCBEdXNrXCIsXCJ1bmlmaWVkXCI6XCIxRjMwNlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjUsXCJzaGVldF95XCI6MjcsXCJzaG9ydF9uYW1lc1wiOltcImNpdHlfc3Vuc2V0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicGhvdG9cIixcImV2ZW5pbmdcIixcInNreVwiLFwiYnVpbGRpbmdzXCJdLFwic2VhcmNoXCI6XCJjaXR5LHN1bnNldCxjaXR5c2NhcGUsYXQsZHVzayxwaG90byxldmVuaW5nLHNreSxidWlsZGluZ3NcIn0sXCJmbGFnLWdtXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEdNXCIsXCJ1bmlmaWVkXCI6XCIxRjFFQy0xRjFGMlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM0LFwic2hlZXRfeVwiOjQwLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWdtXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsZ20scmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZm91cl9sZWFmX2Nsb3ZlclwiOntcIm5hbWVcIjpcIkZvdXIgTGVhZiBDbG92ZXJcIixcInVuaWZpZWRcIjpcIjFGMzQwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NyxcInNoZWV0X3lcIjoxLFwic2hvcnRfbmFtZXNcIjpbXCJmb3VyX2xlYWZfY2xvdmVyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widmVnZXRhYmxlXCIsXCJwbGFudFwiLFwibmF0dXJlXCIsXCJsdWNreVwiLFwiaXJpc2hcIl0sXCJzZWFyY2hcIjpcImZvdXIsbGVhZixjbG92ZXIsdmVnZXRhYmxlLHBsYW50LG5hdHVyZSxsdWNreSxpcmlzaFwifSxcImdyZXlfZXhjbGFtYXRpb25cIjp7XCJuYW1lXCI6XCJXaGl0ZSBFeGNsYW1hdGlvbiBNYXJrIE9ybmFtZW50XCIsXCJ1bmlmaWVkXCI6XCIyNzU1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NCxcInNoZWV0X3lcIjo3LFwic2hvcnRfbmFtZXNcIjpbXCJncmV5X2V4Y2xhbWF0aW9uXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic3VycHJpc2VcIixcInB1bmN0dWF0aW9uXCIsXCJncmF5XCIsXCJ3b3dcIixcIndhcm5pbmdcIl0sXCJzZWFyY2hcIjpcImdyZXksZXhjbGFtYXRpb24sd2hpdGUsbWFyayxvcm5hbWVudCxzdXJwcmlzZSxwdW5jdHVhdGlvbixncmF5LHdvdyx3YXJuaW5nXCJ9LFwic21pcmtfY2F0XCI6e1wibmFtZVwiOlwiQ2F0IEZhY2Ugd2l0aCBXcnkgU21pbGVcIixcInVuaWZpZWRcIjpcIjFGNjNDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjcsXCJzaGVldF95XCI6MzQsXCJzaG9ydF9uYW1lc1wiOltcInNtaXJrX2NhdFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwiY2F0c1wiXSxcInNlYXJjaFwiOlwic21pcmssY2F0LGZhY2Usd2l0aCx3cnksc21pbGUsYW5pbWFsLGNhdHNcIn0sXCJ0aGVybW9tZXRlclwiOntcIm5hbWVcIjpcIlRoZXJtb21ldGVyXCIsXCJ1bmlmaWVkXCI6XCIxRjMyMVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjYsXCJzaGVldF95XCI6MTMsXCJzaG9ydF9uYW1lc1wiOltcInRoZXJtb21ldGVyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wid2VhdGhlclwiLFwidGVtcGVyYXR1cmVcIixcImhvdFwiLFwiY29sZFwiXSxcInNlYXJjaFwiOlwidGhlcm1vbWV0ZXIsd2VhdGhlcix0ZW1wZXJhdHVyZSxob3QsY29sZFwifSxcImNpdHlzY2FwZVwiOntcIm5hbWVcIjpcIkNpdHlzY2FwZVwiLFwidW5pZmllZFwiOlwiMUYzRDlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMSxcInNoZWV0X3lcIjoxMCxcInNob3J0X25hbWVzXCI6W1wiY2l0eXNjYXBlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicGhvdG9cIixcIm5pZ2h0IGxpZmVcIixcInVyYmFuXCJdLFwic2VhcmNoXCI6XCJjaXR5c2NhcGUscGhvdG8sbmlnaHQgbGlmZSx1cmJhblwifSxcImZsYWctZ2VcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgR0VcIixcInVuaWZpZWRcIjpcIjFGMUVDLTFGMUVBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzQsXCJzaGVldF95XCI6MzQsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctZ2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxnZSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJiYW1ib29cIjp7XCJuYW1lXCI6XCJQaW5lIERlY29yYXRpb25cIixcInVuaWZpZWRcIjpcIjFGMzhEXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OSxcInNoZWV0X3lcIjoxLFwic2hvcnRfbmFtZXNcIjpbXCJiYW1ib29cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJwbGFudFwiLFwibmF0dXJlXCIsXCJ2ZWdldGFibGVcIixcInBhbmRhXCIsXCJwaW5lX2RlY29yYXRpb25cIl0sXCJzZWFyY2hcIjpcImJhbWJvbyxwaW5lLGRlY29yYXRpb24scGxhbnQsbmF0dXJlLHZlZ2V0YWJsZSxwYW5kYSxwaW5lX2RlY29yYXRpb25cIn0sXCJmbGFnLWRlXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIERFXCIsXCJ1bmlmaWVkXCI6XCIxRjFFOS0xRjFFQVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM0LFwic2hlZXRfeVwiOjksXCJzaG9ydF9uYW1lc1wiOltcImZsYWctZGVcIixcImRlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsZGUscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwibmlnaHRfd2l0aF9zdGFyc1wiOntcIm5hbWVcIjpcIk5pZ2h0IHdpdGggU3RhcnNcIixcInVuaWZpZWRcIjpcIjFGMzAzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NSxcInNoZWV0X3lcIjoyNCxcInNob3J0X25hbWVzXCI6W1wibmlnaHRfd2l0aF9zdGFyc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImV2ZW5pbmdcIixcImNpdHlcIixcImRvd250b3duXCJdLFwic2VhcmNoXCI6XCJuaWdodCx3aXRoLHN0YXJzLGV2ZW5pbmcsY2l0eSxkb3dudG93blwifSxcImtpc3NpbmdfY2F0XCI6e1wibmFtZVwiOlwiS2lzc2luZyBDYXQgRmFjZSB3aXRoIENsb3NlZCBFeWVzXCIsXCJ1bmlmaWVkXCI6XCIxRjYzRFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI3LFwic2hlZXRfeVwiOjM1LFwic2hvcnRfbmFtZXNcIjpbXCJraXNzaW5nX2NhdFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwiY2F0c1wiXSxcInNlYXJjaFwiOlwia2lzc2luZyxjYXQsZmFjZSx3aXRoLGNsb3NlZCxleWVzLGFuaW1hbCxjYXRzXCJ9LFwidGFuYWJhdGFfdHJlZVwiOntcIm5hbWVcIjpcIlRhbmFiYXRhIFRyZWVcIixcInVuaWZpZWRcIjpcIjFGMzhCXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OCxcInNoZWV0X3lcIjo0MCxcInNob3J0X25hbWVzXCI6W1widGFuYWJhdGFfdHJlZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBsYW50XCIsXCJuYXR1cmVcIixcImJyYW5jaFwiLFwic3VtbWVyXCJdLFwic2VhcmNoXCI6XCJ0YW5hYmF0YSx0cmVlLHBsYW50LG5hdHVyZSxicmFuY2gsc3VtbWVyXCJ9LFwibGFiZWxcIjp7XCJuYW1lXCI6XCJMYWJlbFwiLFwidW5pZmllZFwiOlwiMUYzRjdcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMSxcInNoZWV0X3lcIjozNyxcInNob3J0X25hbWVzXCI6W1wibGFiZWxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzYWxlXCIsXCJ0YWdcIl0sXCJzZWFyY2hcIjpcImxhYmVsLHNhbGUsdGFnXCJ9LFwicXVlc3Rpb25cIjp7XCJuYW1lXCI6XCJCbGFjayBRdWVzdGlvbiBNYXJrIE9ybmFtZW50XCIsXCJ1bmlmaWVkXCI6XCIyNzUzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NCxcInNoZWV0X3lcIjo1LFwic2hvcnRfbmFtZXNcIjpbXCJxdWVzdGlvblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImRvdWJ0XCIsXCJjb25mdXNlZFwiXSxcInNlYXJjaFwiOlwicXVlc3Rpb24sYmxhY2ssbWFyayxvcm5hbWVudCxkb3VidCxjb25mdXNlZFwifSxcImxlYXZlc1wiOntcIm5hbWVcIjpcIkxlYWYgRmx1dHRlcmluZyBpbiBXaW5kXCIsXCJ1bmlmaWVkXCI6XCIxRjM0M1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjcsXCJzaGVldF95XCI6NCxcInNob3J0X25hbWVzXCI6W1wibGVhdmVzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibmF0dXJlXCIsXCJwbGFudFwiLFwidHJlZVwiLFwidmVnZXRhYmxlXCIsXCJncmFzc1wiLFwibGF3blwiLFwic3ByaW5nXCJdLFwic2VhcmNoXCI6XCJsZWF2ZXMsbGVhZixmbHV0dGVyaW5nLGluLHdpbmQsbmF0dXJlLHBsYW50LHRyZWUsdmVnZXRhYmxlLGdyYXNzLGxhd24sc3ByaW5nXCJ9LFwiZ3JleV9xdWVzdGlvblwiOntcIm5hbWVcIjpcIldoaXRlIFF1ZXN0aW9uIE1hcmsgT3JuYW1lbnRcIixcInVuaWZpZWRcIjpcIjI3NTRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo0LFwic2hlZXRfeVwiOjYsXCJzaG9ydF9uYW1lc1wiOltcImdyZXlfcXVlc3Rpb25cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJkb3VidHNcIixcImdyYXlcIixcImh1aFwiLFwiY29uZnVzZWRcIl0sXCJzZWFyY2hcIjpcImdyZXkscXVlc3Rpb24sd2hpdGUsbWFyayxvcm5hbWVudCxkb3VidHMsZ3JheSxodWgsY29uZnVzZWRcIn0sXCJzY3JlYW1fY2F0XCI6e1wibmFtZVwiOlwiV2VhcnkgQ2F0IEZhY2VcIixcInVuaWZpZWRcIjpcIjFGNjQwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjcsXCJzaGVldF95XCI6MzgsXCJzaG9ydF9uYW1lc1wiOltcInNjcmVhbV9jYXRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcImNhdHNcIixcIm11bmNoXCIsXCJzY2FyZWRcIl0sXCJzZWFyY2hcIjpcInNjcmVhbSxjYXQsd2VhcnksZmFjZSxhbmltYWwsY2F0cyxtdW5jaCxzY2FyZWRcIn0sXCJib29rbWFya1wiOntcIm5hbWVcIjpcIkJvb2ttYXJrXCIsXCJ1bmlmaWVkXCI6XCIxRjUxNlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIzLFwic2hlZXRfeVwiOjYsXCJzaG9ydF9uYW1lc1wiOltcImJvb2ttYXJrXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmF2b3JpdGVcIixcImxhYmVsXCIsXCJzYXZlXCJdLFwic2VhcmNoXCI6XCJib29rbWFyayxmYXZvcml0ZSxsYWJlbCxzYXZlXCJ9LFwiYnJpZGdlX2F0X25pZ2h0XCI6e1wibmFtZVwiOlwiQnJpZGdlIGF0IE5pZ2h0XCIsXCJ1bmlmaWVkXCI6XCIxRjMwOVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjUsXCJzaGVldF95XCI6MzAsXCJzaG9ydF9uYW1lc1wiOltcImJyaWRnZV9hdF9uaWdodFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBob3RvXCIsXCJzYW5mcmFuY2lzY29cIl0sXCJzZWFyY2hcIjpcImJyaWRnZSxhdCxuaWdodCxwaG90byxzYW5mcmFuY2lzY29cIn0sXCJmbGFnLWdoXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEdIXCIsXCJ1bmlmaWVkXCI6XCIxRjFFQy0xRjFFRFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM0LFwic2hlZXRfeVwiOjM3LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWdoXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsZ2gscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwibWlsa3lfd2F5XCI6e1wibmFtZVwiOlwiTWlsa3kgV2F5XCIsXCJ1bmlmaWVkXCI6XCIxRjMwQ1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjUsXCJzaGVldF95XCI6MzMsXCJzaG9ydF9uYW1lc1wiOltcIm1pbGt5X3dheVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBob3RvXCIsXCJzcGFjZVwiLFwic3RhcnNcIl0sXCJzZWFyY2hcIjpcIm1pbGt5LHdheSxwaG90byxzcGFjZSxzdGFyc1wifSxcInRvaWxldFwiOntcIm5hbWVcIjpcIlRvaWxldFwiLFwidW5pZmllZFwiOlwiMUY2QkRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMSxcInNoZWV0X3lcIjoxMSxcInNob3J0X25hbWVzXCI6W1widG9pbGV0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicmVzdHJvb21cIixcIndjXCIsXCJ3YXNocm9vbVwiLFwiYmF0aHJvb21cIixcInBvdHR5XCJdLFwic2VhcmNoXCI6XCJ0b2lsZXQscmVzdHJvb20sd2Msd2FzaHJvb20sYmF0aHJvb20scG90dHlcIn0sXCJjcnlpbmdfY2F0X2ZhY2VcIjp7XCJuYW1lXCI6XCJDcnlpbmcgQ2F0IEZhY2VcIixcInVuaWZpZWRcIjpcIjFGNjNGXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjcsXCJzaGVldF95XCI6MzcsXCJzaG9ydF9uYW1lc1wiOltcImNyeWluZ19jYXRfZmFjZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwidGVhcnNcIixcIndlZXBcIixcInNhZFwiLFwiY2F0c1wiLFwidXBzZXRcIl0sXCJzZWFyY2hcIjpcImNyeWluZyxjYXQsZmFjZSxhbmltYWwsdGVhcnMsd2VlcCxzYWQsY2F0cyx1cHNldFwifSxcImJhbmdiYW5nXCI6e1wibmFtZVwiOlwiRG91YmxlIEV4Y2xhbWF0aW9uIE1hcmtcIixcInVuaWZpZWRcIjpcIjIwM0NcIixcInZhcmlhdGlvbnNcIjpbXCIyMDNDLUZFMEZcIl0sXCJzaGVldF94XCI6MCxcInNoZWV0X3lcIjoyLFwic2hvcnRfbmFtZXNcIjpbXCJiYW5nYmFuZ1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImV4Y2xhbWF0aW9uXCIsXCJzdXJwcmlzZVwiXSxcInNlYXJjaFwiOlwiYmFuZ2JhbmcsZG91YmxlLGV4Y2xhbWF0aW9uLG1hcmssc3VycHJpc2VcIn0sXCJmYWxsZW5fbGVhZlwiOntcIm5hbWVcIjpcIkZhbGxlbiBMZWFmXCIsXCJ1bmlmaWVkXCI6XCIxRjM0MlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjcsXCJzaGVldF95XCI6MyxcInNob3J0X25hbWVzXCI6W1wiZmFsbGVuX2xlYWZcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJuYXR1cmVcIixcInBsYW50XCIsXCJ2ZWdldGFibGVcIixcImxlYXZlc1wiXSxcInNlYXJjaFwiOlwiZmFsbGVuLGxlYWYsbmF0dXJlLHBsYW50LHZlZ2V0YWJsZSxsZWF2ZXNcIn0sXCJmbGFnLWdpXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEdJXCIsXCJ1bmlmaWVkXCI6XCIxRjFFQy0xRjFFRVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM0LFwic2hlZXRfeVwiOjM4LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWdpXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsZ2kscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwicG91dGluZ19jYXRcIjp7XCJuYW1lXCI6XCJQb3V0aW5nIENhdCBGYWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjYzRVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI3LFwic2hlZXRfeVwiOjM2LFwic2hvcnRfbmFtZXNcIjpbXCJwb3V0aW5nX2NhdFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuaW1hbFwiLFwiY2F0c1wiXSxcInNlYXJjaFwiOlwicG91dGluZyxjYXQsZmFjZSxhbmltYWwsY2F0c1wifSxcIm1hcGxlX2xlYWZcIjp7XCJuYW1lXCI6XCJNYXBsZSBMZWFmXCIsXCJ1bmlmaWVkXCI6XCIxRjM0MVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjcsXCJzaGVldF95XCI6MixcInNob3J0X25hbWVzXCI6W1wibWFwbGVfbGVhZlwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm5hdHVyZVwiLFwicGxhbnRcIixcInZlZ2V0YWJsZVwiLFwiY2FuYWRhXCIsXCJmYWxsXCJdLFwic2VhcmNoXCI6XCJtYXBsZSxsZWFmLG5hdHVyZSxwbGFudCx2ZWdldGFibGUsY2FuYWRhLGZhbGxcIn0sXCJmbGFnLWdyXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEdSXCIsXCJ1bmlmaWVkXCI6XCIxRjFFQy0xRjFGN1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM1LFwic2hlZXRfeVwiOjMsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctZ3JcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxncixyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJpbnRlcnJvYmFuZ1wiOntcIm5hbWVcIjpcIkV4Y2xhbWF0aW9uIFF1ZXN0aW9uIE1hcmtcIixcInVuaWZpZWRcIjpcIjIwNDlcIixcInZhcmlhdGlvbnNcIjpbXCIyMDQ5LUZFMEZcIl0sXCJzaGVldF94XCI6MCxcInNoZWV0X3lcIjozLFwic2hvcnRfbmFtZXNcIjpbXCJpbnRlcnJvYmFuZ1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIndhdFwiLFwicHVuY3R1YXRpb25cIixcInN1cnByaXNlXCJdLFwic2VhcmNoXCI6XCJpbnRlcnJvYmFuZyxleGNsYW1hdGlvbixxdWVzdGlvbixtYXJrLHdhdCxwdW5jdHVhdGlvbixzdXJwcmlzZVwifSxcInN0YXJzXCI6e1wibmFtZVwiOlwiU2hvb3RpbmcgU3RhclwiLFwidW5pZmllZFwiOlwiMUYzMjBcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo2LFwic2hlZXRfeVwiOjEyLFwic2hvcnRfbmFtZXNcIjpbXCJzdGFyc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm5pZ2h0XCIsXCJwaG90b1wiXSxcInNlYXJjaFwiOlwic3RhcnMsc2hvb3Rpbmcsc3RhcixuaWdodCxwaG90b1wifSxcInNob3dlclwiOntcIm5hbWVcIjpcIlNob3dlclwiLFwidW5pZmllZFwiOlwiMUY2QkZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMSxcInNoZWV0X3lcIjoxMyxcInNob3J0X25hbWVzXCI6W1wic2hvd2VyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiY2xlYW5cIixcIndhdGVyXCIsXCJiYXRocm9vbVwiXSxcInNlYXJjaFwiOlwic2hvd2VyLGNsZWFuLHdhdGVyLGJhdGhyb29tXCJ9LFwicmFpc2VkX2hhbmRzXCI6e1wibmFtZVwiOlwiUGVyc29uIFJhaXNpbmcgQm90aCBIYW5kcyBpbiBDZWxlYnJhdGlvblwiLFwidW5pZmllZFwiOlwiMUY2NENcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyOCxcInNoZWV0X3lcIjoyOSxcInNob3J0X25hbWVzXCI6W1wicmFpc2VkX2hhbmRzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJza2luX3ZhcmlhdGlvbnNcIjp7XCIxRjY0Qy0xRjNGQlwiOntcInVuaWZpZWRcIjpcIjFGNjRDLTFGM0ZCXCIsXCJpbWFnZVwiOlwiMWY2NGMtMWYzZmIucG5nXCIsXCJzaGVldF94XCI6MjgsXCJzaGVldF95XCI6MzAsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY2NEMtMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjY0Qy0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmNjRjLTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjI4LFwic2hlZXRfeVwiOjMxLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNjRDLTFGM0ZEXCI6e1widW5pZmllZFwiOlwiMUY2NEMtMUYzRkRcIixcImltYWdlXCI6XCIxZjY0Yy0xZjNmZC5wbmdcIixcInNoZWV0X3hcIjoyOCxcInNoZWV0X3lcIjozMixcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjY0Qy0xRjNGRVwiOntcInVuaWZpZWRcIjpcIjFGNjRDLTFGM0ZFXCIsXCJpbWFnZVwiOlwiMWY2NGMtMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MjgsXCJzaGVldF95XCI6MzMsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY2NEMtMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjY0Qy0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmNjRjLTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjI4LFwic2hlZXRfeVwiOjM0LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfX0sXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZ2VzdHVyZVwiLFwiaG9vcmF5XCIsXCJ5ZWFcIixcImNlbGVicmF0aW9uXCJdLFwic2VhcmNoXCI6XCJyYWlzZWQsaGFuZHMscGVyc29uLHJhaXNpbmcsYm90aCxpbixjZWxlYnJhdGlvbixnZXN0dXJlLGhvb3JheSx5ZWFcIn0sXCJmbGFnLWdsXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEdMXCIsXCJ1bmlmaWVkXCI6XCIxRjFFQy0xRjFGMVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM0LFwic2hlZXRfeVwiOjM5LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWdsXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsZ2wscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZWFyX29mX3JpY2VcIjp7XCJuYW1lXCI6XCJFYXIgb2YgUmljZVwiLFwidW5pZmllZFwiOlwiMUYzM0VcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo2LFwic2hlZXRfeVwiOjQwLFwic2hvcnRfbmFtZXNcIjpbXCJlYXJfb2ZfcmljZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm5hdHVyZVwiLFwicGxhbnRcIl0sXCJzZWFyY2hcIjpcImVhcixvZixyaWNlLG5hdHVyZSxwbGFudFwifSxcInNwYXJrbGVyXCI6e1wibmFtZVwiOlwiRmlyZXdvcmsgU3BhcmtsZXJcIixcInVuaWZpZWRcIjpcIjFGMzg3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OCxcInNoZWV0X3lcIjozNixcInNob3J0X25hbWVzXCI6W1wic3BhcmtsZXJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzdGFyc1wiLFwibmlnaHRcIixcInNoaW5lXCJdLFwic2VhcmNoXCI6XCJzcGFya2xlcixmaXJld29yayxzdGFycyxuaWdodCxzaGluZVwifSxcImJhdGh0dWJcIjp7XCJuYW1lXCI6XCJCYXRodHViXCIsXCJ1bmlmaWVkXCI6XCIxRjZDMVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMxLFwic2hlZXRfeVwiOjIwLFwic2hvcnRfbmFtZXNcIjpbXCJiYXRodHViXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiY2xlYW5cIixcInNob3dlclwiLFwiYmF0aHJvb21cIl0sXCJzZWFyY2hcIjpcImJhdGh0dWIsY2xlYW4sc2hvd2VyLGJhdGhyb29tXCJ9LFwiaGliaXNjdXNcIjp7XCJuYW1lXCI6XCJIaWJpc2N1c1wiLFwidW5pZmllZFwiOlwiMUYzM0FcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo2LFwic2hlZXRfeVwiOjM2LFwic2hvcnRfbmFtZXNcIjpbXCJoaWJpc2N1c1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBsYW50XCIsXCJ2ZWdldGFibGVcIixcImZsb3dlcnNcIixcImJlYWNoXCJdLFwic2VhcmNoXCI6XCJoaWJpc2N1cyxwbGFudCx2ZWdldGFibGUsZmxvd2VycyxiZWFjaFwifSxcImZsYWctZ2RcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgR0RcIixcInVuaWZpZWRcIjpcIjFGMUVDLTFGMUU5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzQsXCJzaGVldF95XCI6MzMsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctZ2RcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxnZCxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJrZXlcIjp7XCJuYW1lXCI6XCJLZXlcIixcInVuaWZpZWRcIjpcIjFGNTExXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjMsXCJzaGVldF95XCI6MSxcInNob3J0X25hbWVzXCI6W1wia2V5XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibG9ja1wiLFwiZG9vclwiLFwicGFzc3dvcmRcIl0sXCJzZWFyY2hcIjpcImtleSxsb2NrLGRvb3IscGFzc3dvcmRcIn0sXCJsb3dfYnJpZ2h0bmVzc1wiOntcIm5hbWVcIjpcIkxvdyBCcmlnaHRuZXNzIFN5bWJvbFwiLFwidW5pZmllZFwiOlwiMUY1MDVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMixcInNoZWV0X3lcIjozMCxcInNob3J0X25hbWVzXCI6W1wibG93X2JyaWdodG5lc3NcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzdW5cIixcImFmdGVybm9vblwiLFwid2FybVwiLFwic3VtbWVyXCJdLFwic2VhcmNoXCI6XCJsb3csYnJpZ2h0bmVzcyxzeW1ib2wsc3VuLGFmdGVybm9vbix3YXJtLHN1bW1lclwifSxcImZpcmV3b3Jrc1wiOntcIm5hbWVcIjpcIkZpcmV3b3Jrc1wiLFwidW5pZmllZFwiOlwiMUYzODZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo4LFwic2hlZXRfeVwiOjM1LFwic2hvcnRfbmFtZXNcIjpbXCJmaXJld29ya3NcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJwaG90b1wiLFwiZmVzdGl2YWxcIixcImNhcm5pdmFsXCIsXCJjb25ncmF0dWxhdGlvbnNcIl0sXCJzZWFyY2hcIjpcImZpcmV3b3JrcyxwaG90byxmZXN0aXZhbCxjYXJuaXZhbCxjb25ncmF0dWxhdGlvbnNcIn0sXCJjbGFwXCI6e1wibmFtZVwiOlwiQ2xhcHBpbmcgSGFuZHMgU2lnblwiLFwidW5pZmllZFwiOlwiMUY0NEZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxNSxcInNoZWV0X3lcIjoxNixcInNob3J0X25hbWVzXCI6W1wiY2xhcFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUY0NEYtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ0Ri0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmNDRmLTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjE1LFwic2hlZXRfeVwiOjE3LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDRGLTFGM0ZDXCI6e1widW5pZmllZFwiOlwiMUY0NEYtMUYzRkNcIixcImltYWdlXCI6XCIxZjQ0Zi0xZjNmYy5wbmdcIixcInNoZWV0X3hcIjoxNSxcInNoZWV0X3lcIjoxOCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ0Ri0xRjNGRFwiOntcInVuaWZpZWRcIjpcIjFGNDRGLTFGM0ZEXCIsXCJpbWFnZVwiOlwiMWY0NGYtMWYzZmQucG5nXCIsXCJzaGVldF94XCI6MTUsXCJzaGVldF95XCI6MTksXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NEYtMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ0Ri0xRjNGRVwiLFwiaW1hZ2VcIjpcIjFmNDRmLTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjE1LFwic2hlZXRfeVwiOjIwLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDRGLTFGM0ZGXCI6e1widW5pZmllZFwiOlwiMUY0NEYtMUYzRkZcIixcImltYWdlXCI6XCIxZjQ0Zi0xZjNmZi5wbmdcIixcInNoZWV0X3hcIjoxNSxcInNoZWV0X3lcIjoyMSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX19LFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImhhbmRzXCIsXCJwcmFpc2VcIixcImFwcGxhdXNlXCIsXCJjb25ncmF0c1wiLFwieWF5XCJdLFwic2VhcmNoXCI6XCJjbGFwLGNsYXBwaW5nLGhhbmRzLHNpZ24scHJhaXNlLGFwcGxhdXNlLGNvbmdyYXRzLHlheVwifSxcImZsYWctZ3BcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgR1BcIixcInVuaWZpZWRcIjpcIjFGMUVDLTFGMUY1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzUsXCJzaGVldF95XCI6MSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1ncFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxncCxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJvbGRfa2V5XCI6e1wibmFtZVwiOlwiT2xkIEtleVwiLFwidW5pZmllZFwiOlwiMUY1RERcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNixcInNoZWV0X3lcIjoyLFwic2hvcnRfbmFtZXNcIjpbXCJvbGRfa2V5XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibG9ja1wiLFwiZG9vclwiLFwicGFzc3dvcmRcIl0sXCJzZWFyY2hcIjpcIm9sZCxrZXksbG9jayxkb29yLHBhc3N3b3JkXCJ9LFwiaGlnaF9icmlnaHRuZXNzXCI6e1wibmFtZVwiOlwiSGlnaCBCcmlnaHRuZXNzIFN5bWJvbFwiLFwidW5pZmllZFwiOlwiMUY1MDZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMixcInNoZWV0X3lcIjozMSxcInNob3J0X25hbWVzXCI6W1wiaGlnaF9icmlnaHRuZXNzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic3VuXCIsXCJsaWdodFwiXSxcInNlYXJjaFwiOlwiaGlnaCxicmlnaHRuZXNzLHN5bWJvbCxzdW4sbGlnaHRcIn0sXCJyYWluYm93XCI6e1wibmFtZVwiOlwiUmFpbmJvd1wiLFwidW5pZmllZFwiOlwiMUYzMDhcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo1LFwic2hlZXRfeVwiOjI5LFwic2hvcnRfbmFtZXNcIjpbXCJyYWluYm93XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibmF0dXJlXCIsXCJoYXBweVwiLFwidW5pY29yblwiLFwicGhvdG9cIixcInNreVwiLFwic3ByaW5nXCJdLFwic2VhcmNoXCI6XCJyYWluYm93LG5hdHVyZSxoYXBweSx1bmljb3JuLHBob3RvLHNreSxzcHJpbmdcIn0sXCJ3YXZlXCI6e1wibmFtZVwiOlwiV2F2aW5nIEhhbmQgU2lnblwiLFwidW5pZmllZFwiOlwiMUY0NEJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxNCxcInNoZWV0X3lcIjozMyxcInNob3J0X25hbWVzXCI6W1wid2F2ZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUY0NEItMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ0Qi0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmNDRiLTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjE0LFwic2hlZXRfeVwiOjM0LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDRCLTFGM0ZDXCI6e1widW5pZmllZFwiOlwiMUY0NEItMUYzRkNcIixcImltYWdlXCI6XCIxZjQ0Yi0xZjNmYy5wbmdcIixcInNoZWV0X3hcIjoxNCxcInNoZWV0X3lcIjozNSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ0Qi0xRjNGRFwiOntcInVuaWZpZWRcIjpcIjFGNDRCLTFGM0ZEXCIsXCJpbWFnZVwiOlwiMWY0NGItMWYzZmQucG5nXCIsXCJzaGVldF94XCI6MTQsXCJzaGVldF95XCI6MzYsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NEItMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ0Qi0xRjNGRVwiLFwiaW1hZ2VcIjpcIjFmNDRiLTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjE0LFwic2hlZXRfeVwiOjM3LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDRCLTFGM0ZGXCI6e1widW5pZmllZFwiOlwiMUY0NEItMUYzRkZcIixcImltYWdlXCI6XCIxZjQ0Yi0xZjNmZi5wbmdcIixcInNoZWV0X3hcIjoxNCxcInNoZWV0X3lcIjozOCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX19LFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImhhbmRzXCIsXCJnZXN0dXJlXCIsXCJnb29kYnllXCIsXCJzb2xvbmdcIixcImZhcmV3ZWxsXCIsXCJoZWxsb1wiLFwicGFsbVwiXSxcInNlYXJjaFwiOlwid2F2ZSx3YXZpbmcsaGFuZCxzaWduLGhhbmRzLGdlc3R1cmUsZ29vZGJ5ZSxzb2xvbmcsZmFyZXdlbGwsaGVsbG8scGFsbVwifSxcInN1bmZsb3dlclwiOntcIm5hbWVcIjpcIlN1bmZsb3dlclwiLFwidW5pZmllZFwiOlwiMUYzM0JcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo2LFwic2hlZXRfeVwiOjM3LFwic2hvcnRfbmFtZXNcIjpbXCJzdW5mbG93ZXJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJuYXR1cmVcIixcInBsYW50XCIsXCJmYWxsXCJdLFwic2VhcmNoXCI6XCJzdW5mbG93ZXIsbmF0dXJlLHBsYW50LGZhbGxcIn0sXCIrMVwiOntcIm5hbWVcIjpcIlRodW1icyBVcCBTaWduXCIsXCJ1bmlmaWVkXCI6XCIxRjQ0RFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE1LFwic2hlZXRfeVwiOjQsXCJzaG9ydF9uYW1lc1wiOltcIisxXCIsXCJ0aHVtYnN1cFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUY0NEQtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ0RC0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmNDRkLTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjE1LFwic2hlZXRfeVwiOjUsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NEQtMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ0RC0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmNDRkLTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjE1LFwic2hlZXRfeVwiOjYsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NEQtMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ0RC0xRjNGRFwiLFwiaW1hZ2VcIjpcIjFmNDRkLTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjE1LFwic2hlZXRfeVwiOjcsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NEQtMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ0RC0xRjNGRVwiLFwiaW1hZ2VcIjpcIjFmNDRkLTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjE1LFwic2hlZXRfeVwiOjgsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NEQtMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ0RC0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmNDRkLTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjE1LFwic2hlZXRfeVwiOjksXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ0aHVtYnN1cFwiLFwieWVzXCIsXCJhd2Vzb21lXCIsXCJnb29kXCIsXCJhZ3JlZVwiLFwiYWNjZXB0XCIsXCJjb29sXCIsXCJoYW5kXCIsXCJsaWtlXCJdLFwic2VhcmNoXCI6XCIrMSx0aHVtYnN1cCx0aHVtYnMsdXAsc2lnbix5ZXMsYXdlc29tZSxnb29kLGFncmVlLGFjY2VwdCxjb29sLGhhbmQsbGlrZVwifSxcImNvdWNoX2FuZF9sYW1wXCI6e1wibmFtZVwiOlwiQ291Y2ggYW5kIExhbXBcIixcInVuaWZpZWRcIjpcIjFGNkNCXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzEsXCJzaGVldF95XCI6MjUsXCJzaG9ydF9uYW1lc1wiOltcImNvdWNoX2FuZF9sYW1wXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicmVhZFwiLFwiY2hpbGxcIl0sXCJzZWFyY2hcIjpcImNvdWNoLGFuZCxsYW1wLHJlYWQsY2hpbGxcIn0sXCJob3VzZV9idWlsZGluZ3NcIjp7XCJuYW1lXCI6XCJIb3VzZSBCdWlsZGluZ3NcIixcInVuaWZpZWRcIjpcIjFGM0Q4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTEsXCJzaGVldF95XCI6OSxcInNob3J0X25hbWVzXCI6W1wiaG91c2VfYnVpbGRpbmdzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImhvdXNlLGJ1aWxkaW5nc1wifSxcInJvc2VcIjp7XCJuYW1lXCI6XCJSb3NlXCIsXCJ1bmlmaWVkXCI6XCIxRjMzOVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjYsXCJzaGVldF95XCI6MzUsXCJzaG9ydF9uYW1lc1wiOltcInJvc2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmbG93ZXJzXCIsXCJ2YWxlbnRpbmVzXCIsXCJsb3ZlXCIsXCJzcHJpbmdcIl0sXCJzZWFyY2hcIjpcInJvc2UsZmxvd2Vycyx2YWxlbnRpbmVzLGxvdmUsc3ByaW5nXCJ9LFwidHJpZGVudFwiOntcIm5hbWVcIjpcIlRyaWRlbnQgRW1ibGVtXCIsXCJ1bmlmaWVkXCI6XCIxRjUzMVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIzLFwic2hlZXRfeVwiOjMzLFwic2hvcnRfbmFtZXNcIjpbXCJ0cmlkZW50XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wid2VhcG9uXCIsXCJzcGVhclwiXSxcInNlYXJjaFwiOlwidHJpZGVudCxlbWJsZW0sd2VhcG9uLHNwZWFyXCJ9LFwiZmxhZy1ndVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBHVVwiLFwidW5pZmllZFwiOlwiMUYxRUMtMUYxRkFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNSxcInNoZWV0X3lcIjo2LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWd1XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsZ3UscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZXVyb3BlYW5fY2FzdGxlXCI6e1wibmFtZVwiOlwiRXVyb3BlYW4gQ2FzdGxlXCIsXCJ1bmlmaWVkXCI6XCIxRjNGMFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjExLFwic2hlZXRfeVwiOjMzLFwic2hvcnRfbmFtZXNcIjpbXCJldXJvcGVhbl9jYXN0bGVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJidWlsZGluZ1wiLFwicm95YWx0eVwiLFwiaGlzdG9yeVwiXSxcInNlYXJjaFwiOlwiZXVyb3BlYW4sY2FzdGxlLGJ1aWxkaW5nLHJveWFsdHksaGlzdG9yeVwifSxcIi0xXCI6e1wibmFtZVwiOlwiVGh1bWJzIERvd24gU2lnblwiLFwidW5pZmllZFwiOlwiMUY0NEVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxNSxcInNoZWV0X3lcIjoxMCxcInNob3J0X25hbWVzXCI6W1wiLTFcIixcInRodW1ic2Rvd25cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcInNraW5fdmFyaWF0aW9uc1wiOntcIjFGNDRFLTFGM0ZCXCI6e1widW5pZmllZFwiOlwiMUY0NEUtMUYzRkJcIixcImltYWdlXCI6XCIxZjQ0ZS0xZjNmYi5wbmdcIixcInNoZWV0X3hcIjoxNSxcInNoZWV0X3lcIjoxMSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ0RS0xRjNGQ1wiOntcInVuaWZpZWRcIjpcIjFGNDRFLTFGM0ZDXCIsXCJpbWFnZVwiOlwiMWY0NGUtMWYzZmMucG5nXCIsXCJzaGVldF94XCI6MTUsXCJzaGVldF95XCI6MTIsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NEUtMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ0RS0xRjNGRFwiLFwiaW1hZ2VcIjpcIjFmNDRlLTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjE1LFwic2hlZXRfeVwiOjEzLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDRFLTFGM0ZFXCI6e1widW5pZmllZFwiOlwiMUY0NEUtMUYzRkVcIixcImltYWdlXCI6XCIxZjQ0ZS0xZjNmZS5wbmdcIixcInNoZWV0X3hcIjoxNSxcInNoZWV0X3lcIjoxNCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ0RS0xRjNGRlwiOntcInVuaWZpZWRcIjpcIjFGNDRFLTFGM0ZGXCIsXCJpbWFnZVwiOlwiMWY0NGUtMWYzZmYucG5nXCIsXCJzaGVldF94XCI6MTUsXCJzaGVldF95XCI6MTUsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ0aHVtYnNkb3duXCIsXCJub1wiLFwiZGlzbGlrZVwiLFwiaGFuZFwiXSxcInNlYXJjaFwiOlwiLDEsdGh1bWJzZG93bix0aHVtYnMsZG93bixzaWduLG5vLGRpc2xpa2UsaGFuZFwifSxcImZsZXVyX2RlX2xpc1wiOntcIm5hbWVcIjpcIkZsZXVyLURlLUxpc1wiLFwidW5pZmllZFwiOlwiMjY5Q1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIsXCJzaGVldF95XCI6MTEsXCJzaG9ydF9uYW1lc1wiOltcImZsZXVyX2RlX2xpc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImRlY29yYXRpdmVcIixcInNjb3V0XCJdLFwic2VhcmNoXCI6XCJmbGV1cixkZSxsaXMsZGVjb3JhdGl2ZSxzY291dFwifSxcInR1bGlwXCI6e1wibmFtZVwiOlwiVHVsaXBcIixcInVuaWZpZWRcIjpcIjFGMzM3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NixcInNoZWV0X3lcIjozMyxcInNob3J0X25hbWVzXCI6W1widHVsaXBcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmbG93ZXJzXCIsXCJwbGFudFwiLFwibmF0dXJlXCIsXCJzdW1tZXJcIixcInNwcmluZ1wiXSxcInNlYXJjaFwiOlwidHVsaXAsZmxvd2VycyxwbGFudCxuYXR1cmUsc3VtbWVyLHNwcmluZ1wifSxcInNsZWVwaW5nX2FjY29tbW9kYXRpb25cIjp7XCJuYW1lXCI6XCJTbGVlcGluZyBBY2NvbW1vZGF0aW9uXCIsXCJ1bmlmaWVkXCI6XCIxRjZDQ1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMxLFwic2hlZXRfeVwiOjI2LFwic2hvcnRfbmFtZXNcIjpbXCJzbGVlcGluZ19hY2NvbW1vZGF0aW9uXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYmVkXCIsXCJyZXN0XCJdLFwic2VhcmNoXCI6XCJzbGVlcGluZyxhY2NvbW1vZGF0aW9uLGJlZCxyZXN0XCJ9LFwiZmxhZy1ndFwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBHVFwiLFwidW5pZmllZFwiOlwiMUYxRUMtMUYxRjlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNSxcInNoZWV0X3lcIjo1LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWd0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsZ3QscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwicGFydF9hbHRlcm5hdGlvbl9tYXJrXCI6e1wibmFtZVwiOlwiUGFydCBBbHRlcm5hdGlvbiBNYXJrXCIsXCJ1bmlmaWVkXCI6XCIzMDNEXCIsXCJ2YXJpYXRpb25zXCI6W1wiMzAzRC1GRTBGXCJdLFwic2hlZXRfeFwiOjQsXCJzaGVldF95XCI6MjcsXCJzaG9ydF9uYW1lc1wiOltcInBhcnRfYWx0ZXJuYXRpb25fbWFya1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImdyYXBoXCIsXCJwcmVzZW50YXRpb25cIixcInN0YXRzXCIsXCJidXNpbmVzc1wiLFwiZWNvbm9taWNzXCIsXCJiYWRcIl0sXCJzZWFyY2hcIjpcInBhcnQsYWx0ZXJuYXRpb24sbWFyayxncmFwaCxwcmVzZW50YXRpb24sc3RhdHMsYnVzaW5lc3MsZWNvbm9taWNzLGJhZFwifSxcImJsb3Nzb21cIjp7XCJuYW1lXCI6XCJCbG9zc29tXCIsXCJ1bmlmaWVkXCI6XCIxRjMzQ1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjYsXCJzaGVldF95XCI6MzgsXCJzaG9ydF9uYW1lc1wiOltcImJsb3Nzb21cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJuYXR1cmVcIixcImZsb3dlcnNcIixcInllbGxvd1wiXSxcInNlYXJjaFwiOlwiYmxvc3NvbSxuYXR1cmUsZmxvd2Vycyx5ZWxsb3dcIn0sXCJiZWRcIjp7XCJuYW1lXCI6XCJCZWRcIixcInVuaWZpZWRcIjpcIjFGNkNGXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzEsXCJzaGVldF95XCI6MjksXCJzaG9ydF9uYW1lc1wiOltcImJlZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNsZWVwXCIsXCJyZXN0XCJdLFwic2VhcmNoXCI6XCJiZWQsc2xlZXAscmVzdFwifSxcImZsYWctZ2dcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgR0dcIixcInVuaWZpZWRcIjpcIjFGMUVDLTFGMUVDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzQsXCJzaGVldF95XCI6MzYsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctZ2dcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxnZyxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJqYXBhbmVzZV9jYXN0bGVcIjp7XCJuYW1lXCI6XCJKYXBhbmVzZSBDYXN0bGVcIixcInVuaWZpZWRcIjpcIjFGM0VGXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTEsXCJzaGVldF95XCI6MzIsXCJzaG9ydF9uYW1lc1wiOltcImphcGFuZXNlX2Nhc3RsZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBob3RvXCIsXCJidWlsZGluZ1wiXSxcInNlYXJjaFwiOlwiamFwYW5lc2UsY2FzdGxlLHBob3RvLGJ1aWxkaW5nXCJ9LFwiZmFjZXB1bmNoXCI6e1wibmFtZVwiOlwiRmlzdGVkIEhhbmQgU2lnblwiLFwidW5pZmllZFwiOlwiMUY0NEFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxNCxcInNoZWV0X3lcIjoyNyxcInNob3J0X25hbWVzXCI6W1wiZmFjZXB1bmNoXCIsXCJwdW5jaFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUY0NEEtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ0QS0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmNDRhLTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjE0LFwic2hlZXRfeVwiOjI4LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDRBLTFGM0ZDXCI6e1widW5pZmllZFwiOlwiMUY0NEEtMUYzRkNcIixcImltYWdlXCI6XCIxZjQ0YS0xZjNmYy5wbmdcIixcInNoZWV0X3hcIjoxNCxcInNoZWV0X3lcIjoyOSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ0QS0xRjNGRFwiOntcInVuaWZpZWRcIjpcIjFGNDRBLTFGM0ZEXCIsXCJpbWFnZVwiOlwiMWY0NGEtMWYzZmQucG5nXCIsXCJzaGVldF94XCI6MTQsXCJzaGVldF95XCI6MzAsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NEEtMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ0QS0xRjNGRVwiLFwiaW1hZ2VcIjpcIjFmNDRhLTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjE0LFwic2hlZXRfeVwiOjMxLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDRBLTFGM0ZGXCI6e1widW5pZmllZFwiOlwiMUY0NEEtMUYzRkZcIixcImltYWdlXCI6XCIxZjQ0YS0xZjNmZi5wbmdcIixcInNoZWV0X3hcIjoxNCxcInNoZWV0X3lcIjozMixcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX19LFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFuZ3J5XCIsXCJ2aW9sZW5jZVwiLFwiZmlzdFwiLFwiaGl0XCIsXCJhdHRhY2tcIixcImhhbmRcIl0sXCJzZWFyY2hcIjpcImZhY2VwdW5jaCxwdW5jaCxmaXN0ZWQsaGFuZCxzaWduLGFuZ3J5LHZpb2xlbmNlLGZpc3QsaGl0LGF0dGFja1wifSxcInN0YWRpdW1cIjp7XCJuYW1lXCI6XCJTdGFkaXVtXCIsXCJ1bmlmaWVkXCI6XCIxRjNERlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjExLFwic2hlZXRfeVwiOjE2LFwic2hvcnRfbmFtZXNcIjpbXCJzdGFkaXVtXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicGhvdG9cIixcInBsYWNlXCIsXCJzcG9ydHNcIixcImNvbmNlcnRcIixcInZlbnVlXCJdLFwic2VhcmNoXCI6XCJzdGFkaXVtLHBob3RvLHBsYWNlLHNwb3J0cyxjb25jZXJ0LHZlbnVlXCJ9LFwiZmxhZy1nblwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBHTlwiLFwidW5pZmllZFwiOlwiMUYxRUMtMUYxRjNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNSxcInNoZWV0X3lcIjowLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWduXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsZ24scmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwid2FybmluZ1wiOntcIm5hbWVcIjpcIldhcm5pbmcgU2lnblwiLFwidW5pZmllZFwiOlwiMjZBMFwiLFwidmFyaWF0aW9uc1wiOltcIjI2QTAtRkUwRlwiXSxcInNoZWV0X3hcIjoyLFwic2hlZXRfeVwiOjEyLFwic2hvcnRfbmFtZXNcIjpbXCJ3YXJuaW5nXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZXhjbGFtYXRpb25cIixcIndpcFwiLFwiYWxlcnRcIixcImVycm9yXCIsXCJwcm9ibGVtXCIsXCJpc3N1ZVwiXSxcInNlYXJjaFwiOlwid2FybmluZyxzaWduLGV4Y2xhbWF0aW9uLHdpcCxhbGVydCxlcnJvcixwcm9ibGVtLGlzc3VlXCJ9LFwiZG9vclwiOntcIm5hbWVcIjpcIkRvb3JcIixcInVuaWZpZWRcIjpcIjFGNkFBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzAsXCJzaGVldF95XCI6MTgsXCJzaG9ydF9uYW1lc1wiOltcImRvb3JcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJob3VzZVwiLFwiZW50cnlcIixcImV4aXRcIl0sXCJzZWFyY2hcIjpcImRvb3IsaG91c2UsZW50cnksZXhpdFwifSxcImNoZXJyeV9ibG9zc29tXCI6e1wibmFtZVwiOlwiQ2hlcnJ5IEJsb3Nzb21cIixcInVuaWZpZWRcIjpcIjFGMzM4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NixcInNoZWV0X3lcIjozNCxcInNob3J0X25hbWVzXCI6W1wiY2hlcnJ5X2Jsb3Nzb21cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJuYXR1cmVcIixcInBsYW50XCIsXCJzcHJpbmdcIixcImZsb3dlclwiXSxcInNlYXJjaFwiOlwiY2hlcnJ5LGJsb3Nzb20sbmF0dXJlLHBsYW50LHNwcmluZyxmbG93ZXJcIn0sXCJmaXN0XCI6e1wibmFtZVwiOlwiUmFpc2VkIEZpc3RcIixcInVuaWZpZWRcIjpcIjI3MEFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozLFwic2hlZXRfeVwiOjksXCJzaG9ydF9uYW1lc1wiOltcImZpc3RcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcInNraW5fdmFyaWF0aW9uc1wiOntcIjI3MEEtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIyNzBBLTFGM0ZCXCIsXCJpbWFnZVwiOlwiMjcwYS0xZjNmYi5wbmdcIixcInNoZWV0X3hcIjozLFwic2hlZXRfeVwiOjEwLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjI3MEEtMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIyNzBBLTFGM0ZDXCIsXCJpbWFnZVwiOlwiMjcwYS0xZjNmYy5wbmdcIixcInNoZWV0X3hcIjozLFwic2hlZXRfeVwiOjExLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjI3MEEtMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIyNzBBLTFGM0ZEXCIsXCJpbWFnZVwiOlwiMjcwYS0xZjNmZC5wbmdcIixcInNoZWV0X3hcIjozLFwic2hlZXRfeVwiOjEyLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjI3MEEtMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIyNzBBLTFGM0ZFXCIsXCJpbWFnZVwiOlwiMjcwYS0xZjNmZS5wbmdcIixcInNoZWV0X3hcIjozLFwic2hlZXRfeVwiOjEzLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjI3MEEtMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIyNzBBLTFGM0ZGXCIsXCJpbWFnZVwiOlwiMjcwYS0xZjNmZi5wbmdcIixcInNoZWV0X3hcIjozLFwic2hlZXRfeVwiOjE0LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfX0sXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmluZ2Vyc1wiLFwiaGFuZFwiLFwiZ3Jhc3BcIl0sXCJzZWFyY2hcIjpcImZpc3QscmFpc2VkLGZpbmdlcnMsaGFuZCxncmFzcFwifSxcInN0YXR1ZV9vZl9saWJlcnR5XCI6e1wibmFtZVwiOlwiU3RhdHVlIG9mIExpYmVydHlcIixcInVuaWZpZWRcIjpcIjFGNUZEXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjYsXCJzaGVldF95XCI6MTIsXCJzaG9ydF9uYW1lc1wiOltcInN0YXR1ZV9vZl9saWJlcnR5XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYW1lcmljYW5cIixcIm5ld3lvcmtcIl0sXCJzZWFyY2hcIjpcInN0YXR1ZSxvZixsaWJlcnR5LGFtZXJpY2FuLG5ld3lvcmtcIn0sXCJ2XCI6e1wibmFtZVwiOlwiVmljdG9yeSBIYW5kXCIsXCJ1bmlmaWVkXCI6XCIyNzBDXCIsXCJ2YXJpYXRpb25zXCI6W1wiMjcwQy1GRTBGXCJdLFwic2hlZXRfeFwiOjMsXCJzaGVldF95XCI6MjEsXCJzaG9ydF9uYW1lc1wiOltcInZcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcInNraW5fdmFyaWF0aW9uc1wiOntcIjI3MEMtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIyNzBDLTFGM0ZCXCIsXCJpbWFnZVwiOlwiMjcwYy0xZjNmYi5wbmdcIixcInNoZWV0X3hcIjozLFwic2hlZXRfeVwiOjIyLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjI3MEMtMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIyNzBDLTFGM0ZDXCIsXCJpbWFnZVwiOlwiMjcwYy0xZjNmYy5wbmdcIixcInNoZWV0X3hcIjozLFwic2hlZXRfeVwiOjIzLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjI3MEMtMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIyNzBDLTFGM0ZEXCIsXCJpbWFnZVwiOlwiMjcwYy0xZjNmZC5wbmdcIixcInNoZWV0X3hcIjozLFwic2hlZXRfeVwiOjI0LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjI3MEMtMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIyNzBDLTFGM0ZFXCIsXCJpbWFnZVwiOlwiMjcwYy0xZjNmZS5wbmdcIixcInNoZWV0X3hcIjozLFwic2hlZXRfeVwiOjI1LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjI3MEMtMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIyNzBDLTFGM0ZGXCIsXCJpbWFnZVwiOlwiMjcwYy0xZjNmZi5wbmdcIixcInNoZWV0X3hcIjozLFwic2hlZXRfeVwiOjI2LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfX0sXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmluZ2Vyc1wiLFwib2h5ZWFoXCIsXCJoYW5kXCIsXCJwZWFjZVwiLFwidmljdG9yeVwiLFwidHdvXCJdLFwic2VhcmNoXCI6XCJ2LHZpY3RvcnksaGFuZCxmaW5nZXJzLG9oeWVhaCxwZWFjZSx0d29cIn0sXCJjaGlsZHJlbl9jcm9zc2luZ1wiOntcIm5hbWVcIjpcIkNoaWxkcmVuIENyb3NzaW5nXCIsXCJ1bmlmaWVkXCI6XCIxRjZCOFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMxLFwic2hlZXRfeVwiOjYsXCJzaG9ydF9uYW1lc1wiOltcImNoaWxkcmVuX2Nyb3NzaW5nXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic2Nob29sXCIsXCJ3YXJuaW5nXCIsXCJkYW5nZXJcIixcInNpZ25cIixcImRyaXZpbmdcIixcInllbGxvdy1kaWFtb25kXCJdLFwic2VhcmNoXCI6XCJjaGlsZHJlbixjcm9zc2luZyxzY2hvb2wsd2FybmluZyxkYW5nZXIsc2lnbixkcml2aW5nLHllbGxvdy1kaWFtb25kXCJ9LFwiYm91cXVldFwiOntcIm5hbWVcIjpcIkJvdXF1ZXRcIixcInVuaWZpZWRcIjpcIjFGNDkwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTksXCJzaGVldF95XCI6MzIsXCJzaG9ydF9uYW1lc1wiOltcImJvdXF1ZXRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmbG93ZXJzXCIsXCJuYXR1cmVcIixcInNwcmluZ1wiXSxcInNlYXJjaFwiOlwiYm91cXVldCxmbG93ZXJzLG5hdHVyZSxzcHJpbmdcIn0sXCJiZWxsaG9wX2JlbGxcIjp7XCJuYW1lXCI6XCJCZWxsaG9wIEJlbGxcIixcInVuaWZpZWRcIjpcIjFGNkNFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzEsXCJzaGVldF95XCI6MjgsXCJzaG9ydF9uYW1lc1wiOltcImJlbGxob3BfYmVsbFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNlcnZpY2VcIl0sXCJzZWFyY2hcIjpcImJlbGxob3AsYmVsbCxzZXJ2aWNlXCJ9LFwiZmxhZy1nd1wiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBHV1wiLFwidW5pZmllZFwiOlwiMUYxRUMtMUYxRkNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNSxcInNoZWV0X3lcIjo3LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWd3XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsZ3cscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiYmVnaW5uZXJcIjp7XCJuYW1lXCI6XCJKYXBhbmVzZSBTeW1ib2wgZm9yIEJlZ2lubmVyXCIsXCJ1bmlmaWVkXCI6XCIxRjUzMFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIzLFwic2hlZXRfeVwiOjMyLFwic2hvcnRfbmFtZXNcIjpbXCJiZWdpbm5lclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJhZGdlXCIsXCJzaGllbGRcIl0sXCJzZWFyY2hcIjpcImJlZ2lubmVyLGphcGFuZXNlLHN5bWJvbCxmb3IsYmFkZ2Usc2hpZWxkXCJ9LFwiaG91c2VcIjp7XCJuYW1lXCI6XCJIb3VzZSBCdWlsZGluZ1wiLFwidW5pZmllZFwiOlwiMUYzRTBcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMSxcInNoZWV0X3lcIjoxNyxcInNob3J0X25hbWVzXCI6W1wiaG91c2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJidWlsZGluZ1wiLFwiaG9tZVwiXSxcInNlYXJjaFwiOlwiaG91c2UsYnVpbGRpbmcsaG9tZVwifSxcIm11c2hyb29tXCI6e1wibmFtZVwiOlwiTXVzaHJvb21cIixcInVuaWZpZWRcIjpcIjFGMzQ0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NyxcInNoZWV0X3lcIjo1LFwic2hvcnRfbmFtZXNcIjpbXCJtdXNocm9vbVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBsYW50XCIsXCJ2ZWdldGFibGVcIl0sXCJzZWFyY2hcIjpcIm11c2hyb29tLHBsYW50LHZlZ2V0YWJsZVwifSxcImZyYW1lX3dpdGhfcGljdHVyZVwiOntcIm5hbWVcIjpcIkZyYW1lIHdpdGggUGljdHVyZVwiLFwidW5pZmllZFwiOlwiMUY1QkNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNSxcInNoZWV0X3lcIjozNSxcInNob3J0X25hbWVzXCI6W1wiZnJhbWVfd2l0aF9waWN0dXJlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicGhvdG9ncmFwaHlcIl0sXCJzZWFyY2hcIjpcImZyYW1lLHdpdGgscGljdHVyZSxwaG90b2dyYXBoeVwifSxcIm9rX2hhbmRcIjp7XCJuYW1lXCI6XCJPayBIYW5kIFNpZ25cIixcInVuaWZpZWRcIjpcIjFGNDRDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTQsXCJzaGVldF95XCI6MzksXCJzaG9ydF9uYW1lc1wiOltcIm9rX2hhbmRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcInNraW5fdmFyaWF0aW9uc1wiOntcIjFGNDRDLTFGM0ZCXCI6e1widW5pZmllZFwiOlwiMUY0NEMtMUYzRkJcIixcImltYWdlXCI6XCIxZjQ0Yy0xZjNmYi5wbmdcIixcInNoZWV0X3hcIjoxNCxcInNoZWV0X3lcIjo0MCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ0Qy0xRjNGQ1wiOntcInVuaWZpZWRcIjpcIjFGNDRDLTFGM0ZDXCIsXCJpbWFnZVwiOlwiMWY0NGMtMWYzZmMucG5nXCIsXCJzaGVldF94XCI6MTUsXCJzaGVldF95XCI6MCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ0Qy0xRjNGRFwiOntcInVuaWZpZWRcIjpcIjFGNDRDLTFGM0ZEXCIsXCJpbWFnZVwiOlwiMWY0NGMtMWYzZmQucG5nXCIsXCJzaGVldF94XCI6MTUsXCJzaGVldF95XCI6MSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ0Qy0xRjNGRVwiOntcInVuaWZpZWRcIjpcIjFGNDRDLTFGM0ZFXCIsXCJpbWFnZVwiOlwiMWY0NGMtMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MTUsXCJzaGVldF95XCI6MixcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ0Qy0xRjNGRlwiOntcInVuaWZpZWRcIjpcIjFGNDRDLTFGM0ZGXCIsXCJpbWFnZVwiOlwiMWY0NGMtMWYzZmYucG5nXCIsXCJzaGVldF94XCI6MTUsXCJzaGVldF95XCI6MyxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX19LFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZpbmdlcnNcIixcImxpbWJzXCIsXCJwZXJmZWN0XCJdLFwic2VhcmNoXCI6XCJvayxoYW5kLHNpZ24sZmluZ2VycyxsaW1icyxwZXJmZWN0XCJ9LFwiZmxhZy1neVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBHWVwiLFwidW5pZmllZFwiOlwiMUYxRUMtMUYxRkVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNSxcInNoZWV0X3lcIjo4LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWd5XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsZ3kscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZmxhZy1odFwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBIVFwiLFwidW5pZmllZFwiOlwiMUYxRUQtMUYxRjlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNSxcInNoZWV0X3lcIjoxMyxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1odFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGh0LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImhvdXNlX3dpdGhfZ2FyZGVuXCI6e1wibmFtZVwiOlwiSG91c2Ugd2l0aCBHYXJkZW5cIixcInVuaWZpZWRcIjpcIjFGM0UxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTEsXCJzaGVldF95XCI6MTgsXCJzaG9ydF9uYW1lc1wiOltcImhvdXNlX3dpdGhfZ2FyZGVuXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiaG9tZVwiLFwicGxhbnRcIixcIm5hdHVyZVwiXSxcInNlYXJjaFwiOlwiaG91c2Usd2l0aCxnYXJkZW4saG9tZSxwbGFudCxuYXR1cmVcIn0sXCJ3b3JsZF9tYXBcIjp7XCJuYW1lXCI6XCJXb3JsZCBNYXBcIixcInVuaWZpZWRcIjpcIjFGNUZBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjYsXCJzaGVldF95XCI6OSxcInNob3J0X25hbWVzXCI6W1wid29ybGRfbWFwXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibG9jYXRpb25cIixcImRpcmVjdGlvblwiXSxcInNlYXJjaFwiOlwid29ybGQsbWFwLGxvY2F0aW9uLGRpcmVjdGlvblwifSxcImNoZXN0bnV0XCI6e1wibmFtZVwiOlwiQ2hlc3RudXRcIixcInVuaWZpZWRcIjpcIjFGMzMwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NixcInNoZWV0X3lcIjoyNixcInNob3J0X25hbWVzXCI6W1wiY2hlc3RudXRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmb29kXCIsXCJzcXVpcnJlbFwiXSxcInNlYXJjaFwiOlwiY2hlc3RudXQsZm9vZCxzcXVpcnJlbFwifSxcImhhbmRcIjp7XCJuYW1lXCI6XCJSYWlzZWQgSGFuZFwiLFwidW5pZmllZFwiOlwiMjcwQlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMsXCJzaGVldF95XCI6MTUsXCJzaG9ydF9uYW1lc1wiOltcImhhbmRcIixcInJhaXNlZF9oYW5kXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJza2luX3ZhcmlhdGlvbnNcIjp7XCIyNzBCLTFGM0ZCXCI6e1widW5pZmllZFwiOlwiMjcwQi0xRjNGQlwiLFwiaW1hZ2VcIjpcIjI3MGItMWYzZmIucG5nXCIsXCJzaGVldF94XCI6MyxcInNoZWV0X3lcIjoxNixcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIyNzBCLTFGM0ZDXCI6e1widW5pZmllZFwiOlwiMjcwQi0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjI3MGItMWYzZmMucG5nXCIsXCJzaGVldF94XCI6MyxcInNoZWV0X3lcIjoxNyxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIyNzBCLTFGM0ZEXCI6e1widW5pZmllZFwiOlwiMjcwQi0xRjNGRFwiLFwiaW1hZ2VcIjpcIjI3MGItMWYzZmQucG5nXCIsXCJzaGVldF94XCI6MyxcInNoZWV0X3lcIjoxOCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIyNzBCLTFGM0ZFXCI6e1widW5pZmllZFwiOlwiMjcwQi0xRjNGRVwiLFwiaW1hZ2VcIjpcIjI3MGItMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MyxcInNoZWV0X3lcIjoxOSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIyNzBCLTFGM0ZGXCI6e1widW5pZmllZFwiOlwiMjcwQi0xRjNGRlwiLFwiaW1hZ2VcIjpcIjI3MGItMWYzZmYucG5nXCIsXCJzaGVldF94XCI6MyxcInNoZWV0X3lcIjoyMCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX19LFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZpbmdlcnNcIixcInN0b3BcIixcImhpZ2hmaXZlXCIsXCJwYWxtXCIsXCJiYW5cIixcInJhaXNlZF9oYW5kXCJdLFwic2VhcmNoXCI6XCJoYW5kLHJhaXNlZCxmaW5nZXJzLHN0b3AsaGlnaGZpdmUscGFsbSxiYW4scmFpc2VkX2hhbmRcIn0sXCJyZWN5Y2xlXCI6e1wibmFtZVwiOlwiQmxhY2sgVW5pdmVyc2FsIFJlY3ljbGluZyBTeW1ib2xcIixcInVuaWZpZWRcIjpcIjI2N0JcIixcInZhcmlhdGlvbnNcIjpbXCIyNjdCLUZFMEZcIl0sXCJzaGVldF94XCI6MixcInNoZWV0X3lcIjoyLFwic2hvcnRfbmFtZXNcIjpbXCJyZWN5Y2xlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYXJyb3dcIixcImVudmlyb25tZW50XCIsXCJnYXJiYWdlXCIsXCJ0cmFzaFwiXSxcInNlYXJjaFwiOlwicmVjeWNsZSxibGFjayx1bml2ZXJzYWwscmVjeWNsaW5nLHN5bWJvbCxhcnJvdyxlbnZpcm9ubWVudCxnYXJiYWdlLHRyYXNoXCJ9LFwidW1icmVsbGFfb25fZ3JvdW5kXCI6e1wibmFtZVwiOlwiVW1icmVsbGEgb24gR3JvdW5kXCIsXCJ1bmlmaWVkXCI6XCIyNkYxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MixcInNoZWV0X3lcIjozMSxcInNob3J0X25hbWVzXCI6W1widW1icmVsbGFfb25fZ3JvdW5kXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wid2VhdGhlclwiLFwic3VtbWVyXCJdLFwic2VhcmNoXCI6XCJ1bWJyZWxsYSxvbixncm91bmQsd2VhdGhlcixzdW1tZXJcIn0sXCJqYWNrX29fbGFudGVyblwiOntcIm5hbWVcIjpcIkphY2stTy1MYW50ZXJuXCIsXCJ1bmlmaWVkXCI6XCIxRjM4M1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjgsXCJzaGVldF95XCI6MjcsXCJzaG9ydF9uYW1lc1wiOltcImphY2tfb19sYW50ZXJuXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiaGFsbG93ZWVuXCIsXCJsaWdodFwiLFwicHVtcGtpblwiLFwiY3JlZXB5XCIsXCJmYWxsXCJdLFwic2VhcmNoXCI6XCJqYWNrLG8sbGFudGVybixoYWxsb3dlZW4sbGlnaHQscHVtcGtpbixjcmVlcHksZmFsbFwifSxcIm9wZW5faGFuZHNcIjp7XCJuYW1lXCI6XCJPcGVuIEhhbmRzIFNpZ25cIixcInVuaWZpZWRcIjpcIjFGNDUwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTUsXCJzaGVldF95XCI6MjIsXCJzaG9ydF9uYW1lc1wiOltcIm9wZW5faGFuZHNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcInNraW5fdmFyaWF0aW9uc1wiOntcIjFGNDUwLTFGM0ZCXCI6e1widW5pZmllZFwiOlwiMUY0NTAtMUYzRkJcIixcImltYWdlXCI6XCIxZjQ1MC0xZjNmYi5wbmdcIixcInNoZWV0X3hcIjoxNSxcInNoZWV0X3lcIjoyMyxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ1MC0xRjNGQ1wiOntcInVuaWZpZWRcIjpcIjFGNDUwLTFGM0ZDXCIsXCJpbWFnZVwiOlwiMWY0NTAtMWYzZmMucG5nXCIsXCJzaGVldF94XCI6MTUsXCJzaGVldF95XCI6MjQsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NTAtMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ1MC0xRjNGRFwiLFwiaW1hZ2VcIjpcIjFmNDUwLTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjE1LFwic2hlZXRfeVwiOjI1LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDUwLTFGM0ZFXCI6e1widW5pZmllZFwiOlwiMUY0NTAtMUYzRkVcIixcImltYWdlXCI6XCIxZjQ1MC0xZjNmZS5wbmdcIixcInNoZWV0X3hcIjoxNSxcInNoZWV0X3lcIjoyNixcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ1MC0xRjNGRlwiOntcInVuaWZpZWRcIjpcIjFGNDUwLTFGM0ZGXCIsXCJpbWFnZVwiOlwiMWY0NTAtMWYzZmYucG5nXCIsXCJzaGVldF94XCI6MTUsXCJzaGVldF95XCI6MjcsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmaW5nZXJzXCIsXCJidXR0ZXJmbHlcIl0sXCJzZWFyY2hcIjpcIm9wZW4saGFuZHMsc2lnbixmaW5nZXJzLGJ1dHRlcmZseVwifSxcImRlcmVsaWN0X2hvdXNlX2J1aWxkaW5nXCI6e1wibmFtZVwiOlwiRGVyZWxpY3QgSG91c2UgQnVpbGRpbmdcIixcInVuaWZpZWRcIjpcIjFGM0RBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTEsXCJzaGVldF95XCI6MTEsXCJzaG9ydF9uYW1lc1wiOltcImRlcmVsaWN0X2hvdXNlX2J1aWxkaW5nXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImRlcmVsaWN0LGhvdXNlLGJ1aWxkaW5nXCJ9LFwidTYzMDdcIjp7XCJuYW1lXCI6XCJTcXVhcmVkIENqayBVbmlmaWVkIElkZW9ncmFwaC02MzA3XCIsXCJ1bmlmaWVkXCI6XCIxRjIyRlwiLFwidmFyaWF0aW9uc1wiOltcIjFGMjJGLUZFMEZcIl0sXCJzaGVldF94XCI6NSxcInNoZWV0X3lcIjo5LFwic2hvcnRfbmFtZXNcIjpbXCJ1NjMwN1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImNoaW5lc2VcIixcInBvaW50XCIsXCJncmVlbi1zcXVhcmVcIixcImthbmppXCJdLFwic2VhcmNoXCI6XCJ1NjMwNyxzcXVhcmVkLGNqayx1bmlmaWVkLGlkZW9ncmFwaCw2MzA3LGNoaW5lc2UscG9pbnQsZ3JlZW4tc3F1YXJlLGthbmppXCJ9LFwiZmxhZy1oblwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBITlwiLFwidW5pZmllZFwiOlwiMUYxRUQtMUYxRjNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNSxcInNoZWV0X3lcIjoxMSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1oblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGhuLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcInNoZWxsXCI6e1wibmFtZVwiOlwiU3BpcmFsIFNoZWxsXCIsXCJ1bmlmaWVkXCI6XCIxRjQxQVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEyLFwic2hlZXRfeVwiOjMxLFwic2hvcnRfbmFtZXNcIjpbXCJzaGVsbFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm5hdHVyZVwiLFwic2VhXCIsXCJiZWFjaFwiXSxcInNlYXJjaFwiOlwic2hlbGwsc3BpcmFsLG5hdHVyZSxzZWEsYmVhY2hcIn0sXCJmbGFnLWhrXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEhLXCIsXCJ1bmlmaWVkXCI6XCIxRjFFRC0xRjFGMFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM1LFwic2hlZXRfeVwiOjksXCJzaG9ydF9uYW1lc1wiOltcImZsYWctaGtcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxoayxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJtb3lhaVwiOntcIm5hbWVcIjpcIk1veWFpXCIsXCJ1bmlmaWVkXCI6XCIxRjVGRlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI2LFwic2hlZXRfeVwiOjE0LFwic2hvcnRfbmFtZXNcIjpbXCJtb3lhaVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInJvY2tcIixcImVhc3RlciBpc2xhbmRcIixcIm1vYWlcIl0sXCJzZWFyY2hcIjpcIm1veWFpLHJvY2ssZWFzdGVyIGlzbGFuZCxtb2FpXCJ9LFwibXVzY2xlXCI6e1wibmFtZVwiOlwiRmxleGVkIEJpY2Vwc1wiLFwidW5pZmllZFwiOlwiMUY0QUFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMCxcInNoZWV0X3lcIjoxNyxcInNob3J0X25hbWVzXCI6W1wibXVzY2xlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJza2luX3ZhcmlhdGlvbnNcIjp7XCIxRjRBQS0xRjNGQlwiOntcInVuaWZpZWRcIjpcIjFGNEFBLTFGM0ZCXCIsXCJpbWFnZVwiOlwiMWY0YWEtMWYzZmIucG5nXCIsXCJzaGVldF94XCI6MjAsXCJzaGVldF95XCI6MTgsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0QUEtMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjRBQS0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmNGFhLTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjIwLFwic2hlZXRfeVwiOjE5LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNEFBLTFGM0ZEXCI6e1widW5pZmllZFwiOlwiMUY0QUEtMUYzRkRcIixcImltYWdlXCI6XCIxZjRhYS0xZjNmZC5wbmdcIixcInNoZWV0X3hcIjoyMCxcInNoZWV0X3lcIjoyMCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjRBQS0xRjNGRVwiOntcInVuaWZpZWRcIjpcIjFGNEFBLTFGM0ZFXCIsXCJpbWFnZVwiOlwiMWY0YWEtMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MjAsXCJzaGVldF95XCI6MjEsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0QUEtMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjRBQS0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmNGFhLTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjIwLFwic2hlZXRfeVwiOjIyLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfX0sXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYXJtXCIsXCJmbGV4XCIsXCJoYW5kXCIsXCJzdW1tZXJcIixcInN0cm9uZ1wiLFwiYmljZXBzXCJdLFwic2VhcmNoXCI6XCJtdXNjbGUsZmxleGVkLGJpY2Vwcyxhcm0sZmxleCxoYW5kLHN1bW1lcixzdHJvbmdcIn0sXCJjaGFydFwiOntcIm5hbWVcIjpcIkNoYXJ0IHdpdGggVXB3YXJkcyBUcmVuZCBhbmQgWWVuIFNpZ25cIixcInVuaWZpZWRcIjpcIjFGNEI5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjAsXCJzaGVldF95XCI6MzcsXCJzaG9ydF9uYW1lc1wiOltcImNoYXJ0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZ3JlZW4tc3F1YXJlXCIsXCJncmFwaFwiLFwicHJlc2VudGF0aW9uXCIsXCJzdGF0c1wiXSxcInNlYXJjaFwiOlwiY2hhcnQsd2l0aCx1cHdhcmRzLHRyZW5kLGFuZCx5ZW4sc2lnbixncmVlbi1zcXVhcmUsZ3JhcGgscHJlc2VudGF0aW9uLHN0YXRzXCJ9LFwib2ZmaWNlXCI6e1wibmFtZVwiOlwiT2ZmaWNlIEJ1aWxkaW5nXCIsXCJ1bmlmaWVkXCI6XCIxRjNFMlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjExLFwic2hlZXRfeVwiOjE5LFwic2hvcnRfbmFtZXNcIjpbXCJvZmZpY2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJidWlsZGluZ1wiLFwiYnVyZWF1XCIsXCJ3b3JrXCJdLFwic2VhcmNoXCI6XCJvZmZpY2UsYnVpbGRpbmcsYnVyZWF1LHdvcmtcIn0sXCJzaG9wcGluZ19iYWdzXCI6e1wibmFtZVwiOlwiU2hvcHBpbmcgQmFnc1wiLFwidW5pZmllZFwiOlwiMUY2Q0RcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMSxcInNoZWV0X3lcIjoyNyxcInNob3J0X25hbWVzXCI6W1wic2hvcHBpbmdfYmFnc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm1hbGxcIixcImJ1eVwiLFwicHVyY2hhc2VcIl0sXCJzZWFyY2hcIjpcInNob3BwaW5nLGJhZ3MsbWFsbCxidXkscHVyY2hhc2VcIn0sXCJkZXBhcnRtZW50X3N0b3JlXCI6e1wibmFtZVwiOlwiRGVwYXJ0bWVudCBTdG9yZVwiLFwidW5pZmllZFwiOlwiMUYzRUNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMSxcInNoZWV0X3lcIjoyOSxcInNob3J0X25hbWVzXCI6W1wiZGVwYXJ0bWVudF9zdG9yZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJ1aWxkaW5nXCIsXCJzaG9wcGluZ1wiLFwibWFsbFwiXSxcInNlYXJjaFwiOlwiZGVwYXJ0bWVudCxzdG9yZSxidWlsZGluZyxzaG9wcGluZyxtYWxsXCJ9LFwicHJheVwiOntcIm5hbWVcIjpcIlBlcnNvbiB3aXRoIEZvbGRlZCBIYW5kc1wiLFwidW5pZmllZFwiOlwiMUY2NEZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyOSxcInNoZWV0X3lcIjo2LFwic2hvcnRfbmFtZXNcIjpbXCJwcmF5XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJza2luX3ZhcmlhdGlvbnNcIjp7XCIxRjY0Ri0xRjNGQlwiOntcInVuaWZpZWRcIjpcIjFGNjRGLTFGM0ZCXCIsXCJpbWFnZVwiOlwiMWY2NGYtMWYzZmIucG5nXCIsXCJzaGVldF94XCI6MjksXCJzaGVldF95XCI6NyxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjY0Ri0xRjNGQ1wiOntcInVuaWZpZWRcIjpcIjFGNjRGLTFGM0ZDXCIsXCJpbWFnZVwiOlwiMWY2NGYtMWYzZmMucG5nXCIsXCJzaGVldF94XCI6MjksXCJzaGVldF95XCI6OCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjY0Ri0xRjNGRFwiOntcInVuaWZpZWRcIjpcIjFGNjRGLTFGM0ZEXCIsXCJpbWFnZVwiOlwiMWY2NGYtMWYzZmQucG5nXCIsXCJzaGVldF94XCI6MjksXCJzaGVldF95XCI6OSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjY0Ri0xRjNGRVwiOntcInVuaWZpZWRcIjpcIjFGNjRGLTFGM0ZFXCIsXCJpbWFnZVwiOlwiMWY2NGYtMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MjksXCJzaGVldF95XCI6MTAsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY2NEYtMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjY0Ri0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmNjRmLTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjI5LFwic2hlZXRfeVwiOjExLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfX0sXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicGxlYXNlXCIsXCJob3BlXCIsXCJ3aXNoXCIsXCJuYW1hc3RlXCIsXCJoaWdoZml2ZVwiXSxcInNlYXJjaFwiOlwicHJheSxwZXJzb24sd2l0aCxmb2xkZWQsaGFuZHMscGxlYXNlLGhvcGUsd2lzaCxuYW1hc3RlLGhpZ2hmaXZlXCJ9LFwiZmxhZy1odVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBIVVwiLFwidW5pZmllZFwiOlwiMUYxRUQtMUYxRkFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNSxcInNoZWV0X3lcIjoxNCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1odVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGh1LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcInNwYXJrbGVcIjp7XCJuYW1lXCI6XCJTcGFya2xlXCIsXCJ1bmlmaWVkXCI6XCIyNzQ3XCIsXCJ2YXJpYXRpb25zXCI6W1wiMjc0Ny1GRTBGXCJdLFwic2hlZXRfeFwiOjQsXCJzaGVldF95XCI6MixcInNob3J0X25hbWVzXCI6W1wic3BhcmtsZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInN0YXJzXCIsXCJncmVlbi1zcXVhcmVcIixcImF3ZXNvbWVcIixcImdvb2RcIixcImZpcmV3b3Jrc1wiXSxcInNlYXJjaFwiOlwic3BhcmtsZSxzdGFycyxncmVlbi1zcXVhcmUsYXdlc29tZSxnb29kLGZpcmV3b3Jrc1wifSxcInNwaWRlcl93ZWJcIjp7XCJuYW1lXCI6XCJTcGlkZXIgV2ViXCIsXCJ1bmlmaWVkXCI6XCIxRjU3OFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI1LFwic2hlZXRfeVwiOjYsXCJzaG9ydF9uYW1lc1wiOltcInNwaWRlcl93ZWJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbmltYWxcIixcImluc2VjdFwiLFwiYXJhY2huaWRcIixcInNpbGtcIl0sXCJzZWFyY2hcIjpcInNwaWRlcix3ZWIsYW5pbWFsLGluc2VjdCxhcmFjaG5pZCxzaWxrXCJ9LFwicG9pbnRfdXBcIjp7XCJuYW1lXCI6XCJXaGl0ZSBVcCBQb2ludGluZyBJbmRleFwiLFwidW5pZmllZFwiOlwiMjYxRFwiLFwidmFyaWF0aW9uc1wiOltcIjI2MUQtRkUwRlwiXSxcInNoZWV0X3hcIjoxLFwic2hlZXRfeVwiOjEwLFwic2hvcnRfbmFtZXNcIjpbXCJwb2ludF91cFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMjYxRC0xRjNGQlwiOntcInVuaWZpZWRcIjpcIjI2MUQtMUYzRkJcIixcImltYWdlXCI6XCIyNjFkLTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjEsXCJzaGVldF95XCI6MTEsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMjYxRC0xRjNGQ1wiOntcInVuaWZpZWRcIjpcIjI2MUQtMUYzRkNcIixcImltYWdlXCI6XCIyNjFkLTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjEsXCJzaGVldF95XCI6MTIsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMjYxRC0xRjNGRFwiOntcInVuaWZpZWRcIjpcIjI2MUQtMUYzRkRcIixcImltYWdlXCI6XCIyNjFkLTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjEsXCJzaGVldF95XCI6MTMsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMjYxRC0xRjNGRVwiOntcInVuaWZpZWRcIjpcIjI2MUQtMUYzRkVcIixcImltYWdlXCI6XCIyNjFkLTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjEsXCJzaGVldF95XCI6MTQsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMjYxRC0xRjNGRlwiOntcInVuaWZpZWRcIjpcIjI2MUQtMUYzRkZcIixcImltYWdlXCI6XCIyNjFkLTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjEsXCJzaGVldF95XCI6MTUsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJoYW5kXCIsXCJmaW5nZXJzXCIsXCJkaXJlY3Rpb25cIl0sXCJzZWFyY2hcIjpcInBvaW50LHVwLHdoaXRlLHBvaW50aW5nLGluZGV4LGhhbmQsZmluZ2VycyxkaXJlY3Rpb25cIn0sXCJlaWdodF9zcG9rZWRfYXN0ZXJpc2tcIjp7XCJuYW1lXCI6XCJFaWdodCBTcG9rZWQgQXN0ZXJpc2tcIixcInVuaWZpZWRcIjpcIjI3MzNcIixcInZhcmlhdGlvbnNcIjpbXCIyNzMzLUZFMEZcIl0sXCJzaGVldF94XCI6MyxcInNoZWV0X3lcIjo0MCxcInNob3J0X25hbWVzXCI6W1wiZWlnaHRfc3Bva2VkX2FzdGVyaXNrXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic3RhclwiLFwic3BhcmtsZVwiLFwiZ3JlZW4tc3F1YXJlXCJdLFwic2VhcmNoXCI6XCJlaWdodCxzcG9rZWQsYXN0ZXJpc2ssc3RhcixzcGFya2xlLGdyZWVuLXNxdWFyZVwifSxcImZsYWctaXNcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgSVNcIixcInVuaWZpZWRcIjpcIjFGMUVFLTFGMUY4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzUsXCJzaGVldF95XCI6MjQsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctaXNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxpcyxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJwb3N0X29mZmljZVwiOntcIm5hbWVcIjpcIkphcGFuZXNlIFBvc3QgT2ZmaWNlXCIsXCJ1bmlmaWVkXCI6XCIxRjNFM1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjExLFwic2hlZXRfeVwiOjIwLFwic2hvcnRfbmFtZXNcIjpbXCJwb3N0X29mZmljZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJ1aWxkaW5nXCIsXCJlbWFpbFwiLFwiY29tbXVuaWNhdGlvblwiXSxcInNlYXJjaFwiOlwicG9zdCxvZmZpY2UsamFwYW5lc2UsYnVpbGRpbmcsZW1haWwsY29tbXVuaWNhdGlvblwifSxcImVhcnRoX2FtZXJpY2FzXCI6e1wibmFtZVwiOlwiRWFydGggR2xvYmUgQW1lcmljYXNcIixcInVuaWZpZWRcIjpcIjFGMzBFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NSxcInNoZWV0X3lcIjozNSxcInNob3J0X25hbWVzXCI6W1wiZWFydGhfYW1lcmljYXNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJnbG9iZVwiLFwid29ybGRcIixcIlVTQVwiLFwiaW50ZXJuYXRpb25hbFwiXSxcInNlYXJjaFwiOlwiZWFydGgsYW1lcmljYXMsZ2xvYmUsd29ybGQsdXNhLGludGVybmF0aW9uYWxcIn0sXCJiYWxsb29uXCI6e1wibmFtZVwiOlwiQmFsbG9vblwiLFwidW5pZmllZFwiOlwiMUYzODhcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo4LFwic2hlZXRfeVwiOjM3LFwic2hvcnRfbmFtZXNcIjpbXCJiYWxsb29uXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicGFydHlcIixcImNlbGVicmF0aW9uXCIsXCJiaXJ0aGRheVwiLFwiY2lyY3VzXCJdLFwic2VhcmNoXCI6XCJiYWxsb29uLHBhcnR5LGNlbGVicmF0aW9uLGJpcnRoZGF5LGNpcmN1c1wifSxcImV1cm9wZWFuX3Bvc3Rfb2ZmaWNlXCI6e1wibmFtZVwiOlwiRXVyb3BlYW4gUG9zdCBPZmZpY2VcIixcInVuaWZpZWRcIjpcIjFGM0U0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTEsXCJzaGVldF95XCI6MjEsXCJzaG9ydF9uYW1lc1wiOltcImV1cm9wZWFuX3Bvc3Rfb2ZmaWNlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYnVpbGRpbmdcIixcImVtYWlsXCJdLFwic2VhcmNoXCI6XCJldXJvcGVhbixwb3N0LG9mZmljZSxidWlsZGluZyxlbWFpbFwifSxcInBvaW50X3VwXzJcIjp7XCJuYW1lXCI6XCJXaGl0ZSBVcCBQb2ludGluZyBCYWNraGFuZCBJbmRleFwiLFwidW5pZmllZFwiOlwiMUY0NDZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxNCxcInNoZWV0X3lcIjozLFwic2hvcnRfbmFtZXNcIjpbXCJwb2ludF91cF8yXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJza2luX3ZhcmlhdGlvbnNcIjp7XCIxRjQ0Ni0xRjNGQlwiOntcInVuaWZpZWRcIjpcIjFGNDQ2LTFGM0ZCXCIsXCJpbWFnZVwiOlwiMWY0NDYtMWYzZmIucG5nXCIsXCJzaGVldF94XCI6MTQsXCJzaGVldF95XCI6NCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ0Ni0xRjNGQ1wiOntcInVuaWZpZWRcIjpcIjFGNDQ2LTFGM0ZDXCIsXCJpbWFnZVwiOlwiMWY0NDYtMWYzZmMucG5nXCIsXCJzaGVldF94XCI6MTQsXCJzaGVldF95XCI6NSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ0Ni0xRjNGRFwiOntcInVuaWZpZWRcIjpcIjFGNDQ2LTFGM0ZEXCIsXCJpbWFnZVwiOlwiMWY0NDYtMWYzZmQucG5nXCIsXCJzaGVldF94XCI6MTQsXCJzaGVldF95XCI6NixcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ0Ni0xRjNGRVwiOntcInVuaWZpZWRcIjpcIjFGNDQ2LTFGM0ZFXCIsXCJpbWFnZVwiOlwiMWY0NDYtMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MTQsXCJzaGVldF95XCI6NyxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ0Ni0xRjNGRlwiOntcInVuaWZpZWRcIjpcIjFGNDQ2LTFGM0ZGXCIsXCJpbWFnZVwiOlwiMWY0NDYtMWYzZmYucG5nXCIsXCJzaGVldF94XCI6MTQsXCJzaGVldF95XCI6OCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX19LFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZpbmdlcnNcIixcImhhbmRcIixcImRpcmVjdGlvblwiXSxcInNlYXJjaFwiOlwicG9pbnQsdXAsMix3aGl0ZSxwb2ludGluZyxiYWNraGFuZCxpbmRleCxmaW5nZXJzLGhhbmQsZGlyZWN0aW9uXCJ9LFwiZWFydGhfYWZyaWNhXCI6e1wibmFtZVwiOlwiRWFydGggR2xvYmUgRXVyb3BlLUFmcmljYVwiLFwidW5pZmllZFwiOlwiMUYzMERcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo1LFwic2hlZXRfeVwiOjM0LFwic2hvcnRfbmFtZXNcIjpbXCJlYXJ0aF9hZnJpY2FcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJnbG9iZVwiLFwid29ybGRcIixcImludGVybmF0aW9uYWxcIl0sXCJzZWFyY2hcIjpcImVhcnRoLGFmcmljYSxnbG9iZSxldXJvcGUsd29ybGQsaW50ZXJuYXRpb25hbFwifSxcIm5lZ2F0aXZlX3NxdWFyZWRfY3Jvc3NfbWFya1wiOntcIm5hbWVcIjpcIk5lZ2F0aXZlIFNxdWFyZWQgQ3Jvc3MgTWFya1wiLFwidW5pZmllZFwiOlwiMjc0RVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjQsXCJzaGVldF95XCI6NCxcInNob3J0X25hbWVzXCI6W1wibmVnYXRpdmVfc3F1YXJlZF9jcm9zc19tYXJrXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wieFwiLFwiZ3JlZW4tc3F1YXJlXCIsXCJub1wiLFwiZGVueVwiXSxcInNlYXJjaFwiOlwibmVnYXRpdmUsc3F1YXJlZCxjcm9zcyxtYXJrLHgsZ3JlZW4tc3F1YXJlLG5vLGRlbnlcIn0sXCJmbGFnc1wiOntcIm5hbWVcIjpcIkNhcnAgU3RyZWFtZXJcIixcInVuaWZpZWRcIjpcIjFGMzhGXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OSxcInNoZWV0X3lcIjozLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZpc2hcIixcImphcGFuZXNlXCIsXCJrb2lub2JvcmlcIixcImNhcnBcIixcImJhbm5lclwiXSxcInNlYXJjaFwiOlwiZmxhZ3MsY2FycCxzdHJlYW1lcixmaXNoLGphcGFuZXNlLGtvaW5vYm9yaSxiYW5uZXJcIn0sXCJmbGFnLWluXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIElOXCIsXCJ1bmlmaWVkXCI6XCIxRjFFRS0xRjFGM1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM1LFwic2hlZXRfeVwiOjIwLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWluXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsaW4scmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiaG9zcGl0YWxcIjp7XCJuYW1lXCI6XCJIb3NwaXRhbFwiLFwidW5pZmllZFwiOlwiMUYzRTVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMSxcInNoZWV0X3lcIjoyMixcInNob3J0X25hbWVzXCI6W1wiaG9zcGl0YWxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJidWlsZGluZ1wiLFwiaGVhbHRoXCIsXCJzdXJnZXJ5XCIsXCJkb2N0b3JcIl0sXCJzZWFyY2hcIjpcImhvc3BpdGFsLGJ1aWxkaW5nLGhlYWx0aCxzdXJnZXJ5LGRvY3RvclwifSxcInBvaW50X2Rvd25cIjp7XCJuYW1lXCI6XCJXaGl0ZSBEb3duIFBvaW50aW5nIEJhY2toYW5kIEluZGV4XCIsXCJ1bmlmaWVkXCI6XCIxRjQ0N1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE0LFwic2hlZXRfeVwiOjksXCJzaG9ydF9uYW1lc1wiOltcInBvaW50X2Rvd25cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcInNraW5fdmFyaWF0aW9uc1wiOntcIjFGNDQ3LTFGM0ZCXCI6e1widW5pZmllZFwiOlwiMUY0NDctMUYzRkJcIixcImltYWdlXCI6XCIxZjQ0Ny0xZjNmYi5wbmdcIixcInNoZWV0X3hcIjoxNCxcInNoZWV0X3lcIjoxMCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ0Ny0xRjNGQ1wiOntcInVuaWZpZWRcIjpcIjFGNDQ3LTFGM0ZDXCIsXCJpbWFnZVwiOlwiMWY0NDctMWYzZmMucG5nXCIsXCJzaGVldF94XCI6MTQsXCJzaGVldF95XCI6MTEsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NDctMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ0Ny0xRjNGRFwiLFwiaW1hZ2VcIjpcIjFmNDQ3LTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjE0LFwic2hlZXRfeVwiOjEyLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDQ3LTFGM0ZFXCI6e1widW5pZmllZFwiOlwiMUY0NDctMUYzRkVcIixcImltYWdlXCI6XCIxZjQ0Ny0xZjNmZS5wbmdcIixcInNoZWV0X3hcIjoxNCxcInNoZWV0X3lcIjoxMyxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ0Ny0xRjNGRlwiOntcInVuaWZpZWRcIjpcIjFGNDQ3LTFGM0ZGXCIsXCJpbWFnZVwiOlwiMWY0NDctMWYzZmYucG5nXCIsXCJzaGVldF94XCI6MTQsXCJzaGVldF95XCI6MTQsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmaW5nZXJzXCIsXCJoYW5kXCIsXCJkaXJlY3Rpb25cIl0sXCJzZWFyY2hcIjpcInBvaW50LGRvd24sd2hpdGUscG9pbnRpbmcsYmFja2hhbmQsaW5kZXgsZmluZ2VycyxoYW5kLGRpcmVjdGlvblwifSxcIndoaXRlX2NoZWNrX21hcmtcIjp7XCJuYW1lXCI6XCJXaGl0ZSBIZWF2eSBDaGVjayBNYXJrXCIsXCJ1bmlmaWVkXCI6XCIyNzA1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MyxcInNoZWV0X3lcIjo2LFwic2hvcnRfbmFtZXNcIjpbXCJ3aGl0ZV9jaGVja19tYXJrXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZ3JlZW4tc3F1YXJlXCIsXCJva1wiLFwiYWdyZWVcIixcInZvdGVcIixcImVsZWN0aW9uXCIsXCJhbnN3ZXJcIl0sXCJzZWFyY2hcIjpcIndoaXRlLGNoZWNrLG1hcmssaGVhdnksZ3JlZW4tc3F1YXJlLG9rLGFncmVlLHZvdGUsZWxlY3Rpb24sYW5zd2VyXCJ9LFwicmliYm9uXCI6e1wibmFtZVwiOlwiUmliYm9uXCIsXCJ1bmlmaWVkXCI6XCIxRjM4MFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjgsXCJzaGVldF95XCI6MjQsXCJzaG9ydF9uYW1lc1wiOltcInJpYmJvblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImRlY29yYXRpb25cIixcInBpbmtcIixcImdpcmxcIixcImJvd3RpZVwiXSxcInNlYXJjaFwiOlwicmliYm9uLGRlY29yYXRpb24scGluayxnaXJsLGJvd3RpZVwifSxcImVhcnRoX2FzaWFcIjp7XCJuYW1lXCI6XCJFYXJ0aCBHbG9iZSBBc2lhLUF1c3RyYWxpYVwiLFwidW5pZmllZFwiOlwiMUYzMEZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo1LFwic2hlZXRfeVwiOjM2LFwic2hvcnRfbmFtZXNcIjpbXCJlYXJ0aF9hc2lhXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZ2xvYmVcIixcIndvcmxkXCIsXCJlYXN0XCIsXCJpbnRlcm5hdGlvbmFsXCJdLFwic2VhcmNoXCI6XCJlYXJ0aCxhc2lhLGdsb2JlLGF1c3RyYWxpYSx3b3JsZCxlYXN0LGludGVybmF0aW9uYWxcIn0sXCJmbGFnLWlkXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIElEXCIsXCJ1bmlmaWVkXCI6XCIxRjFFRS0xRjFFOVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM1LFwic2hlZXRfeVwiOjE2LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWlkXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsaWQscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZnVsbF9tb29uXCI6e1wibmFtZVwiOlwiRnVsbCBNb29uIFN5bWJvbFwiLFwidW5pZmllZFwiOlwiMUYzMTVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo2LFwic2hlZXRfeVwiOjEsXCJzaG9ydF9uYW1lc1wiOltcImZ1bGxfbW9vblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm5hdHVyZVwiLFwieWVsbG93XCIsXCJ0d2lsaWdodFwiLFwicGxhbmV0XCIsXCJzcGFjZVwiLFwibmlnaHRcIixcImV2ZW5pbmdcIixcInNsZWVwXCJdLFwic2VhcmNoXCI6XCJmdWxsLG1vb24sc3ltYm9sLG5hdHVyZSx5ZWxsb3csdHdpbGlnaHQscGxhbmV0LHNwYWNlLG5pZ2h0LGV2ZW5pbmcsc2xlZXBcIn0sXCJwb2ludF9sZWZ0XCI6e1wibmFtZVwiOlwiV2hpdGUgTGVmdCBQb2ludGluZyBCYWNraGFuZCBJbmRleFwiLFwidW5pZmllZFwiOlwiMUY0NDhcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxNCxcInNoZWV0X3lcIjoxNSxcInNob3J0X25hbWVzXCI6W1wicG9pbnRfbGVmdFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUY0NDgtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ0OC0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmNDQ4LTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjE0LFwic2hlZXRfeVwiOjE2LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDQ4LTFGM0ZDXCI6e1widW5pZmllZFwiOlwiMUY0NDgtMUYzRkNcIixcImltYWdlXCI6XCIxZjQ0OC0xZjNmYy5wbmdcIixcInNoZWV0X3hcIjoxNCxcInNoZWV0X3lcIjoxNyxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ0OC0xRjNGRFwiOntcInVuaWZpZWRcIjpcIjFGNDQ4LTFGM0ZEXCIsXCJpbWFnZVwiOlwiMWY0NDgtMWYzZmQucG5nXCIsXCJzaGVldF94XCI6MTQsXCJzaGVldF95XCI6MTgsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NDgtMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ0OC0xRjNGRVwiLFwiaW1hZ2VcIjpcIjFmNDQ4LTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjE0LFwic2hlZXRfeVwiOjE5LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDQ4LTFGM0ZGXCI6e1widW5pZmllZFwiOlwiMUY0NDgtMUYzRkZcIixcImltYWdlXCI6XCIxZjQ0OC0xZjNmZi5wbmdcIixcInNoZWV0X3hcIjoxNCxcInNoZWV0X3lcIjoyMCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX19LFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImRpcmVjdGlvblwiLFwiZmluZ2Vyc1wiLFwiaGFuZFwiXSxcInNlYXJjaFwiOlwicG9pbnQsbGVmdCx3aGl0ZSxwb2ludGluZyxiYWNraGFuZCxpbmRleCxkaXJlY3Rpb24sZmluZ2VycyxoYW5kXCJ9LFwiZmxhZy1pclwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBJUlwiLFwidW5pZmllZFwiOlwiMUYxRUUtMUYxRjdcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNSxcInNoZWV0X3lcIjoyMyxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1pclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGlyLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImdpZnRcIjp7XCJuYW1lXCI6XCJXcmFwcGVkIFByZXNlbnRcIixcInVuaWZpZWRcIjpcIjFGMzgxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OCxcInNoZWV0X3lcIjoyNSxcInNob3J0X25hbWVzXCI6W1wiZ2lmdFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInByZXNlbnRcIixcImJpcnRoZGF5XCIsXCJjaHJpc3RtYXNcIixcInhtYXNcIl0sXCJzZWFyY2hcIjpcImdpZnQsd3JhcHBlZCxwcmVzZW50LGJpcnRoZGF5LGNocmlzdG1hcyx4bWFzXCJ9LFwiYmFua1wiOntcIm5hbWVcIjpcIkJhbmtcIixcInVuaWZpZWRcIjpcIjFGM0U2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTEsXCJzaGVldF95XCI6MjMsXCJzaG9ydF9uYW1lc1wiOltcImJhbmtcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJidWlsZGluZ1wiLFwibW9uZXlcIixcInNhbGVzXCIsXCJjYXNoXCIsXCJidXNpbmVzc1wiLFwiZW50ZXJwcmlzZVwiXSxcInNlYXJjaFwiOlwiYmFuayxidWlsZGluZyxtb25leSxzYWxlcyxjYXNoLGJ1c2luZXNzLGVudGVycHJpc2VcIn0sXCJkaWFtb25kX3NoYXBlX3dpdGhfYV9kb3RfaW5zaWRlXCI6e1wibmFtZVwiOlwiRGlhbW9uZCBTaGFwZSB3aXRoIGEgRG90IEluc2lkZVwiLFwidW5pZmllZFwiOlwiMUY0QTBcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMCxcInNoZWV0X3lcIjo3LFwic2hvcnRfbmFtZXNcIjpbXCJkaWFtb25kX3NoYXBlX3dpdGhfYV9kb3RfaW5zaWRlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiamV3ZWxcIixcImJsdWVcIixcImdlbVwiLFwiY3J5c3RhbFwiLFwiZmFuY3lcIl0sXCJzZWFyY2hcIjpcImRpYW1vbmQsc2hhcGUsd2l0aCxhLGRvdCxpbnNpZGUsamV3ZWwsYmx1ZSxnZW0sY3J5c3RhbCxmYW5jeVwifSxcImZsYWctaXFcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgSVFcIixcInVuaWZpZWRcIjpcIjFGMUVFLTFGMUY2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzUsXCJzaGVldF95XCI6MjIsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctaXFcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxpcSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJjb25mZXR0aV9iYWxsXCI6e1wibmFtZVwiOlwiQ29uZmV0dGkgQmFsbFwiLFwidW5pZmllZFwiOlwiMUYzOEFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo4LFwic2hlZXRfeVwiOjM5LFwic2hvcnRfbmFtZXNcIjpbXCJjb25mZXR0aV9iYWxsXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmVzdGl2YWxcIixcInBhcnR5XCIsXCJiaXJ0aGRheVwiLFwiY2lyY3VzXCJdLFwic2VhcmNoXCI6XCJjb25mZXR0aSxiYWxsLGZlc3RpdmFsLHBhcnR5LGJpcnRoZGF5LGNpcmN1c1wifSxcInBvaW50X3JpZ2h0XCI6e1wibmFtZVwiOlwiV2hpdGUgUmlnaHQgUG9pbnRpbmcgQmFja2hhbmQgSW5kZXhcIixcInVuaWZpZWRcIjpcIjFGNDQ5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTQsXCJzaGVldF95XCI6MjEsXCJzaG9ydF9uYW1lc1wiOltcInBvaW50X3JpZ2h0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJza2luX3ZhcmlhdGlvbnNcIjp7XCIxRjQ0OS0xRjNGQlwiOntcInVuaWZpZWRcIjpcIjFGNDQ5LTFGM0ZCXCIsXCJpbWFnZVwiOlwiMWY0NDktMWYzZmIucG5nXCIsXCJzaGVldF94XCI6MTQsXCJzaGVldF95XCI6MjIsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NDktMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ0OS0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmNDQ5LTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjE0LFwic2hlZXRfeVwiOjIzLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDQ5LTFGM0ZEXCI6e1widW5pZmllZFwiOlwiMUY0NDktMUYzRkRcIixcImltYWdlXCI6XCIxZjQ0OS0xZjNmZC5wbmdcIixcInNoZWV0X3hcIjoxNCxcInNoZWV0X3lcIjoyNCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ0OS0xRjNGRVwiOntcInVuaWZpZWRcIjpcIjFGNDQ5LTFGM0ZFXCIsXCJpbWFnZVwiOlwiMWY0NDktMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MTQsXCJzaGVldF95XCI6MjUsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NDktMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ0OS0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmNDQ5LTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjE0LFwic2hlZXRfeVwiOjI2LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfX0sXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmluZ2Vyc1wiLFwiaGFuZFwiLFwiZGlyZWN0aW9uXCJdLFwic2VhcmNoXCI6XCJwb2ludCxyaWdodCx3aGl0ZSxwb2ludGluZyxiYWNraGFuZCxpbmRleCxmaW5nZXJzLGhhbmQsZGlyZWN0aW9uXCJ9LFwiY3ljbG9uZVwiOntcIm5hbWVcIjpcIkN5Y2xvbmVcIixcInVuaWZpZWRcIjpcIjFGMzAwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NSxcInNoZWV0X3lcIjoyMSxcInNob3J0X25hbWVzXCI6W1wiY3ljbG9uZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIndlYXRoZXJcIixcInN3aXJsXCIsXCJibHVlXCIsXCJjbG91ZFwiXSxcInNlYXJjaFwiOlwiY3ljbG9uZSx3ZWF0aGVyLHN3aXJsLGJsdWUsY2xvdWRcIn0sXCJ3YW5pbmdfZ2liYm91c19tb29uXCI6e1wibmFtZVwiOlwiV2FuaW5nIEdpYmJvdXMgTW9vbiBTeW1ib2xcIixcInVuaWZpZWRcIjpcIjFGMzE2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NixcInNoZWV0X3lcIjoyLFwic2hvcnRfbmFtZXNcIjpbXCJ3YW5pbmdfZ2liYm91c19tb29uXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibmF0dXJlXCIsXCJ0d2lsaWdodFwiLFwicGxhbmV0XCIsXCJzcGFjZVwiLFwibmlnaHRcIixcImV2ZW5pbmdcIixcInNsZWVwXCIsXCJ3YXhpbmdfZ2liYm91c19tb29uXCJdLFwic2VhcmNoXCI6XCJ3YW5pbmcsZ2liYm91cyxtb29uLHN5bWJvbCxuYXR1cmUsdHdpbGlnaHQscGxhbmV0LHNwYWNlLG5pZ2h0LGV2ZW5pbmcsc2xlZXAsd2F4aW5nX2dpYmJvdXNfbW9vblwifSxcImhvdGVsXCI6e1wibmFtZVwiOlwiSG90ZWxcIixcInVuaWZpZWRcIjpcIjFGM0U4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTEsXCJzaGVldF95XCI6MjUsXCJzaG9ydF9uYW1lc1wiOltcImhvdGVsXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYnVpbGRpbmdcIixcIndob3RlbFwiLFwiYWNjb21vZGF0aW9uXCIsXCJjaGVja2luXCJdLFwic2VhcmNoXCI6XCJob3RlbCxidWlsZGluZyx3aG90ZWwsYWNjb21vZGF0aW9uLGNoZWNraW5cIn0sXCJsb29wXCI6e1wibmFtZVwiOlwiRG91YmxlIEN1cmx5IExvb3BcIixcInVuaWZpZWRcIjpcIjI3QkZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo0LFwic2hlZXRfeVwiOjE2LFwic2hvcnRfbmFtZXNcIjpbXCJsb29wXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widGFwZVwiLFwiY2Fzc2V0dGVcIl0sXCJzZWFyY2hcIjpcImxvb3AsZG91YmxlLGN1cmx5LHRhcGUsY2Fzc2V0dGVcIn0sXCJjb252ZW5pZW5jZV9zdG9yZVwiOntcIm5hbWVcIjpcIkNvbnZlbmllbmNlIFN0b3JlXCIsXCJ1bmlmaWVkXCI6XCIxRjNFQVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjExLFwic2hlZXRfeVwiOjI3LFwic2hvcnRfbmFtZXNcIjpbXCJjb252ZW5pZW5jZV9zdG9yZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJ1aWxkaW5nXCIsXCJzaG9wcGluZ1wiLFwiZ3JvY2VyaWVzXCJdLFwic2VhcmNoXCI6XCJjb252ZW5pZW5jZSxzdG9yZSxidWlsZGluZyxzaG9wcGluZyxncm9jZXJpZXNcIn0sXCJsYXN0X3F1YXJ0ZXJfbW9vblwiOntcIm5hbWVcIjpcIkxhc3QgUXVhcnRlciBNb29uIFN5bWJvbFwiLFwidW5pZmllZFwiOlwiMUYzMTdcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo2LFwic2hlZXRfeVwiOjMsXCJzaG9ydF9uYW1lc1wiOltcImxhc3RfcXVhcnRlcl9tb29uXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibmF0dXJlXCIsXCJ0d2lsaWdodFwiLFwicGxhbmV0XCIsXCJzcGFjZVwiLFwibmlnaHRcIixcImV2ZW5pbmdcIixcInNsZWVwXCJdLFwic2VhcmNoXCI6XCJsYXN0LHF1YXJ0ZXIsbW9vbixzeW1ib2wsbmF0dXJlLHR3aWxpZ2h0LHBsYW5ldCxzcGFjZSxuaWdodCxldmVuaW5nLHNsZWVwXCJ9LFwidGFkYVwiOntcIm5hbWVcIjpcIlBhcnR5IFBvcHBlclwiLFwidW5pZmllZFwiOlwiMUYzODlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo4LFwic2hlZXRfeVwiOjM4LFwic2hvcnRfbmFtZXNcIjpbXCJ0YWRhXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicGFydHlcIixcImNvbnR1bGF0aW9uc1wiLFwiYmlydGhkYXlcIixcIm1hZ2ljXCIsXCJjaXJjdXNcIl0sXCJzZWFyY2hcIjpcInRhZGEscGFydHkscG9wcGVyLGNvbnR1bGF0aW9ucyxiaXJ0aGRheSxtYWdpYyxjaXJjdXNcIn0sXCJtaWRkbGVfZmluZ2VyXCI6e1wibmFtZVwiOlwiUmV2ZXJzZWQgSGFuZCB3aXRoIE1pZGRsZSBGaW5nZXIgRXh0ZW5kZWRcIixcInVuaWZpZWRcIjpcIjFGNTk1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjUsXCJzaGVldF95XCI6MTksXCJzaG9ydF9uYW1lc1wiOltcIm1pZGRsZV9maW5nZXJcIixcInJldmVyc2VkX2hhbmRfd2l0aF9taWRkbGVfZmluZ2VyX2V4dGVuZGVkXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJza2luX3ZhcmlhdGlvbnNcIjp7XCIxRjU5NS0xRjNGQlwiOntcInVuaWZpZWRcIjpcIjFGNTk1LTFGM0ZCXCIsXCJpbWFnZVwiOlwiMWY1OTUtMWYzZmIucG5nXCIsXCJzaGVldF94XCI6MjUsXCJzaGVldF95XCI6MjAsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY1OTUtMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjU5NS0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmNTk1LTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjI1LFwic2hlZXRfeVwiOjIxLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNTk1LTFGM0ZEXCI6e1widW5pZmllZFwiOlwiMUY1OTUtMUYzRkRcIixcImltYWdlXCI6XCIxZjU5NS0xZjNmZC5wbmdcIixcInNoZWV0X3hcIjoyNSxcInNoZWV0X3lcIjoyMixcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjU5NS0xRjNGRVwiOntcInVuaWZpZWRcIjpcIjFGNTk1LTFGM0ZFXCIsXCJpbWFnZVwiOlwiMWY1OTUtMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MjUsXCJzaGVldF95XCI6MjMsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY1OTUtMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjU5NS0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmNTk1LTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjI1LFwic2hlZXRfeVwiOjI0LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfX0sXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiaGFuZFwiLFwiZmluZ2Vyc1wiLFwicnVkZVwiXSxcInNlYXJjaFwiOlwibWlkZGxlLGZpbmdlcixyZXZlcnNlZCxoYW5kLHdpdGgsZXh0ZW5kZWQsZmluZ2VycyxydWRlXCJ9LFwiZmxhZy1pZVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBJRVwiLFwidW5pZmllZFwiOlwiMUYxRUUtMUYxRUFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNSxcInNoZWV0X3lcIjoxNyxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1pZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGllLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImRvbGxzXCI6e1wibmFtZVwiOlwiSmFwYW5lc2UgRG9sbHNcIixcInVuaWZpZWRcIjpcIjFGMzhFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OSxcInNoZWV0X3lcIjoyLFwic2hvcnRfbmFtZXNcIjpbXCJkb2xsc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImphcGFuZXNlXCIsXCJ0b3lcIixcImtpbW9ub1wiXSxcInNlYXJjaFwiOlwiZG9sbHMsamFwYW5lc2UsdG95LGtpbW9ub1wifSxcImdsb2JlX3dpdGhfbWVyaWRpYW5zXCI6e1wibmFtZVwiOlwiR2xvYmUgd2l0aCBNZXJpZGlhbnNcIixcInVuaWZpZWRcIjpcIjFGMzEwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NSxcInNoZWV0X3lcIjozNyxcInNob3J0X25hbWVzXCI6W1wiZ2xvYmVfd2l0aF9tZXJpZGlhbnNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJlYXJ0aFwiLFwiaW50ZXJuYXRpb25hbFwiLFwid29ybGRcIixcImludGVybmV0XCIsXCJpbnRlcndlYlwiLFwiaTE4blwiXSxcInNlYXJjaFwiOlwiZ2xvYmUsd2l0aCxtZXJpZGlhbnMsZWFydGgsaW50ZXJuYXRpb25hbCx3b3JsZCxpbnRlcm5ldCxpbnRlcndlYixpMThuXCJ9LFwiZmxhZy1pbVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBJTVwiLFwidW5pZmllZFwiOlwiMUYxRUUtMUYxRjJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNSxcInNoZWV0X3lcIjoxOSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1pbVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGltLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcIndhbmluZ19jcmVzY2VudF9tb29uXCI6e1wibmFtZVwiOlwiV2FuaW5nIENyZXNjZW50IE1vb24gU3ltYm9sXCIsXCJ1bmlmaWVkXCI6XCIxRjMxOFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjYsXCJzaGVldF95XCI6NCxcInNob3J0X25hbWVzXCI6W1wid2FuaW5nX2NyZXNjZW50X21vb25cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJuYXR1cmVcIixcInR3aWxpZ2h0XCIsXCJwbGFuZXRcIixcInNwYWNlXCIsXCJuaWdodFwiLFwiZXZlbmluZ1wiLFwic2xlZXBcIl0sXCJzZWFyY2hcIjpcIndhbmluZyxjcmVzY2VudCxtb29uLHN5bWJvbCxuYXR1cmUsdHdpbGlnaHQscGxhbmV0LHNwYWNlLG5pZ2h0LGV2ZW5pbmcsc2xlZXBcIn0sXCJyYWlzZWRfaGFuZF93aXRoX2ZpbmdlcnNfc3BsYXllZFwiOntcIm5hbWVcIjpcIlJhaXNlZCBIYW5kIHdpdGggRmluZ2VycyBTcGxheWVkXCIsXCJ1bmlmaWVkXCI6XCIxRjU5MFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI1LFwic2hlZXRfeVwiOjEzLFwic2hvcnRfbmFtZXNcIjpbXCJyYWlzZWRfaGFuZF93aXRoX2ZpbmdlcnNfc3BsYXllZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUY1OTAtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjU5MC0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmNTkwLTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjI1LFwic2hlZXRfeVwiOjE0LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNTkwLTFGM0ZDXCI6e1widW5pZmllZFwiOlwiMUY1OTAtMUYzRkNcIixcImltYWdlXCI6XCIxZjU5MC0xZjNmYy5wbmdcIixcInNoZWV0X3hcIjoyNSxcInNoZWV0X3lcIjoxNSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjU5MC0xRjNGRFwiOntcInVuaWZpZWRcIjpcIjFGNTkwLTFGM0ZEXCIsXCJpbWFnZVwiOlwiMWY1OTAtMWYzZmQucG5nXCIsXCJzaGVldF94XCI6MjUsXCJzaGVldF95XCI6MTYsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY1OTAtMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIxRjU5MC0xRjNGRVwiLFwiaW1hZ2VcIjpcIjFmNTkwLTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjI1LFwic2hlZXRfeVwiOjE3LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNTkwLTFGM0ZGXCI6e1widW5pZmllZFwiOlwiMUY1OTAtMUYzRkZcIixcImltYWdlXCI6XCIxZjU5MC0xZjNmZi5wbmdcIixcInNoZWV0X3hcIjoyNSxcInNoZWV0X3lcIjoxOCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX19LFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJyYWlzZWQsaGFuZCx3aXRoLGZpbmdlcnMsc3BsYXllZFwifSxcInNjaG9vbFwiOntcIm5hbWVcIjpcIlNjaG9vbFwiLFwidW5pZmllZFwiOlwiMUYzRUJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMSxcInNoZWV0X3lcIjoyOCxcInNob3J0X25hbWVzXCI6W1wic2Nob29sXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYnVpbGRpbmdcIixcInN0dWRlbnRcIixcImVkdWNhdGlvblwiLFwibGVhcm5cIixcInRlYWNoXCJdLFwic2VhcmNoXCI6XCJzY2hvb2wsYnVpbGRpbmcsc3R1ZGVudCxlZHVjYXRpb24sbGVhcm4sdGVhY2hcIn0sXCJuZXdfbW9vblwiOntcIm5hbWVcIjpcIk5ldyBNb29uIFN5bWJvbFwiLFwidW5pZmllZFwiOlwiMUYzMTFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo1LFwic2hlZXRfeVwiOjM4LFwic2hvcnRfbmFtZXNcIjpbXCJuZXdfbW9vblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm5hdHVyZVwiLFwidHdpbGlnaHRcIixcInBsYW5ldFwiLFwic3BhY2VcIixcIm5pZ2h0XCIsXCJldmVuaW5nXCIsXCJzbGVlcFwiXSxcInNlYXJjaFwiOlwibmV3LG1vb24sc3ltYm9sLG5hdHVyZSx0d2lsaWdodCxwbGFuZXQsc3BhY2UsbmlnaHQsZXZlbmluZyxzbGVlcFwifSxcInRoZV9ob3Juc1wiOntcIm5hbWVcIjpcIlNpZ24gb2YgdGhlIEhvcm5zXCIsXCJ1bmlmaWVkXCI6XCIxRjkxOFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMyLFwic2hlZXRfeVwiOjksXCJzaG9ydF9uYW1lc1wiOltcInRoZV9ob3Juc1wiLFwic2lnbl9vZl90aGVfaG9ybnNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcInNraW5fdmFyaWF0aW9uc1wiOntcIjFGOTE4LTFGM0ZCXCI6e1widW5pZmllZFwiOlwiMUY5MTgtMUYzRkJcIixcImltYWdlXCI6XCIxZjkxOC0xZjNmYi5wbmdcIixcInNoZWV0X3hcIjozMixcInNoZWV0X3lcIjoxMCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjkxOC0xRjNGQ1wiOntcInVuaWZpZWRcIjpcIjFGOTE4LTFGM0ZDXCIsXCJpbWFnZVwiOlwiMWY5MTgtMWYzZmMucG5nXCIsXCJzaGVldF94XCI6MzIsXCJzaGVldF95XCI6MTEsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY5MTgtMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIxRjkxOC0xRjNGRFwiLFwiaW1hZ2VcIjpcIjFmOTE4LTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjMyLFwic2hlZXRfeVwiOjEyLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGOTE4LTFGM0ZFXCI6e1widW5pZmllZFwiOlwiMUY5MTgtMUYzRkVcIixcImltYWdlXCI6XCIxZjkxOC0xZjNmZS5wbmdcIixcInNoZWV0X3hcIjozMixcInNoZWV0X3lcIjoxMyxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjkxOC0xRjNGRlwiOntcInVuaWZpZWRcIjpcIjFGOTE4LTFGM0ZGXCIsXCJpbWFnZVwiOlwiMWY5MTgtMWYzZmYucG5nXCIsXCJzaGVldF94XCI6MzIsXCJzaGVldF95XCI6MTQsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwidGhlLGhvcm5zLHNpZ24sb2ZcIn0sXCJsb3ZlX2hvdGVsXCI6e1wibmFtZVwiOlwiTG92ZSBIb3RlbFwiLFwidW5pZmllZFwiOlwiMUYzRTlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMSxcInNoZWV0X3lcIjoyNixcInNob3J0X25hbWVzXCI6W1wibG92ZV9ob3RlbFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImxpa2VcIixcImFmZmVjdGlvblwiLFwiZGF0aW5nXCJdLFwic2VhcmNoXCI6XCJsb3ZlLGhvdGVsLGxpa2UsYWZmZWN0aW9uLGRhdGluZ1wifSxcIm1cIjp7XCJuYW1lXCI6XCJDaXJjbGVkIExhdGluIENhcGl0YWwgTGV0dGVyIE1cIixcInVuaWZpZWRcIjpcIjI0QzJcIixcInZhcmlhdGlvbnNcIjpbXCIyNEMyLUZFMEZcIl0sXCJzaGVldF94XCI6MCxcInNoZWV0X3lcIjozMixcInNob3J0X25hbWVzXCI6W1wibVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFscGhhYmV0XCIsXCJibHVlLWNpcmNsZVwiLFwibGV0dGVyXCJdLFwic2VhcmNoXCI6XCJtLGNpcmNsZWQsbGF0aW4sY2FwaXRhbCxsZXR0ZXIsYWxwaGFiZXQsYmx1ZS1jaXJjbGVcIn0sXCJmbGFnLWlsXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIElMXCIsXCJ1bmlmaWVkXCI6XCIxRjFFRS0xRjFGMVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM1LFwic2hlZXRfeVwiOjE4LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWlsXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsaWwscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwid2luZF9jaGltZVwiOntcIm5hbWVcIjpcIldpbmQgQ2hpbWVcIixcInVuaWZpZWRcIjpcIjFGMzkwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OSxcInNoZWV0X3lcIjo0LFwic2hvcnRfbmFtZXNcIjpbXCJ3aW5kX2NoaW1lXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibmF0dXJlXCIsXCJkaW5nXCIsXCJzcHJpbmdcIixcImJlbGxcIl0sXCJzZWFyY2hcIjpcIndpbmQsY2hpbWUsbmF0dXJlLGRpbmcsc3ByaW5nLGJlbGxcIn0sXCJzcG9jay1oYW5kXCI6e1wibmFtZVwiOlwiUmFpc2VkIEhhbmQgd2l0aCBQYXJ0IEJldHdlZW4gTWlkZGxlIGFuZCBSaW5nIEZpbmdlcnNcIixcInVuaWZpZWRcIjpcIjFGNTk2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjUsXCJzaGVldF95XCI6MjUsXCJzaG9ydF9uYW1lc1wiOltcInNwb2NrLWhhbmRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcInNraW5fdmFyaWF0aW9uc1wiOntcIjFGNTk2LTFGM0ZCXCI6e1widW5pZmllZFwiOlwiMUY1OTYtMUYzRkJcIixcImltYWdlXCI6XCIxZjU5Ni0xZjNmYi5wbmdcIixcInNoZWV0X3hcIjoyNSxcInNoZWV0X3lcIjoyNixcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjU5Ni0xRjNGQ1wiOntcInVuaWZpZWRcIjpcIjFGNTk2LTFGM0ZDXCIsXCJpbWFnZVwiOlwiMWY1OTYtMWYzZmMucG5nXCIsXCJzaGVldF94XCI6MjUsXCJzaGVldF95XCI6MjcsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY1OTYtMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIxRjU5Ni0xRjNGRFwiLFwiaW1hZ2VcIjpcIjFmNTk2LTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjI1LFwic2hlZXRfeVwiOjI4LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNTk2LTFGM0ZFXCI6e1widW5pZmllZFwiOlwiMUY1OTYtMUYzRkVcIixcImltYWdlXCI6XCIxZjU5Ni0xZjNmZS5wbmdcIixcInNoZWV0X3hcIjoyNSxcInNoZWV0X3lcIjoyOSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjU5Ni0xRjNGRlwiOntcInVuaWZpZWRcIjpcIjFGNTk2LTFGM0ZGXCIsXCJpbWFnZVwiOlwiMWY1OTYtMWYzZmYucG5nXCIsXCJzaGVldF94XCI6MjUsXCJzaGVldF95XCI6MzAsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwic3BvY2ssaGFuZCxyYWlzZWQsd2l0aCxwYXJ0LGJldHdlZW4sbWlkZGxlLGFuZCxyaW5nLGZpbmdlcnNcIn0sXCJ3ZWRkaW5nXCI6e1wibmFtZVwiOlwiV2VkZGluZ1wiLFwidW5pZmllZFwiOlwiMUY0OTJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxOSxcInNoZWV0X3lcIjozNCxcInNob3J0X25hbWVzXCI6W1wid2VkZGluZ1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImxvdmVcIixcImxpa2VcIixcImFmZmVjdGlvblwiLFwiY291cGxlXCIsXCJtYXJyaWFnZVwiLFwiYnJpZGVcIixcImdyb29tXCJdLFwic2VhcmNoXCI6XCJ3ZWRkaW5nLGxvdmUsbGlrZSxhZmZlY3Rpb24sY291cGxlLG1hcnJpYWdlLGJyaWRlLGdyb29tXCJ9LFwiYXRtXCI6e1wibmFtZVwiOlwiQXV0b21hdGVkIFRlbGxlciBNYWNoaW5lXCIsXCJ1bmlmaWVkXCI6XCIxRjNFN1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjExLFwic2hlZXRfeVwiOjI0LFwic2hvcnRfbmFtZXNcIjpbXCJhdG1cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJtb25leVwiLFwic2FsZXNcIixcImNhc2hcIixcImJsdWUtc3F1YXJlXCIsXCJwYXltZW50XCIsXCJiYW5rXCJdLFwic2VhcmNoXCI6XCJhdG0sYXV0b21hdGVkLHRlbGxlcixtYWNoaW5lLG1vbmV5LHNhbGVzLGNhc2gsYmx1ZS1zcXVhcmUscGF5bWVudCxiYW5rXCJ9LFwiY3Jvc3NlZF9mbGFnc1wiOntcIm5hbWVcIjpcIkNyb3NzZWQgRmxhZ3NcIixcInVuaWZpZWRcIjpcIjFGMzhDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OSxcInNoZWV0X3lcIjowLFwic2hvcnRfbmFtZXNcIjpbXCJjcm9zc2VkX2ZsYWdzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiamFwYW5lc2VcIixcIm5hdGlvblwiLFwiY291bnRyeVwiLFwiYm9yZGVyXCJdLFwic2VhcmNoXCI6XCJjcm9zc2VkLGZsYWdzLGphcGFuZXNlLG5hdGlvbixjb3VudHJ5LGJvcmRlclwifSxcImZsYWctaXRcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgSVRcIixcInVuaWZpZWRcIjpcIjFGMUVFLTFGMUY5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzUsXCJzaGVldF95XCI6MjUsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctaXRcIixcIml0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsaXQscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwid2F4aW5nX2NyZXNjZW50X21vb25cIjp7XCJuYW1lXCI6XCJXYXhpbmcgQ3Jlc2NlbnQgTW9vbiBTeW1ib2xcIixcInVuaWZpZWRcIjpcIjFGMzEyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NSxcInNoZWV0X3lcIjozOSxcInNob3J0X25hbWVzXCI6W1wid2F4aW5nX2NyZXNjZW50X21vb25cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJuYXR1cmVcIixcInR3aWxpZ2h0XCIsXCJwbGFuZXRcIixcInNwYWNlXCIsXCJuaWdodFwiLFwiZXZlbmluZ1wiLFwic2xlZXBcIl0sXCJzZWFyY2hcIjpcIndheGluZyxjcmVzY2VudCxtb29uLHN5bWJvbCxuYXR1cmUsdHdpbGlnaHQscGxhbmV0LHNwYWNlLG5pZ2h0LGV2ZW5pbmcsc2xlZXBcIn0sXCJpemFrYXlhX2xhbnRlcm5cIjp7XCJuYW1lXCI6XCJJemFrYXlhIExhbnRlcm5cIixcInVuaWZpZWRcIjpcIjFGM0VFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTEsXCJzaGVldF95XCI6MzEsXCJzaG9ydF9uYW1lc1wiOltcIml6YWtheWFfbGFudGVyblwiLFwibGFudGVyblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImxpZ2h0XCIsXCJwYXBlclwiLFwiaGFsbG93ZWVuXCIsXCJzcG9va3lcIl0sXCJzZWFyY2hcIjpcIml6YWtheWEsbGFudGVybixsaWdodCxwYXBlcixoYWxsb3dlZW4sc3Bvb2t5XCJ9LFwiZmlyc3RfcXVhcnRlcl9tb29uXCI6e1wibmFtZVwiOlwiRmlyc3QgUXVhcnRlciBNb29uIFN5bWJvbFwiLFwidW5pZmllZFwiOlwiMUYzMTNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo1LFwic2hlZXRfeVwiOjQwLFwic2hvcnRfbmFtZXNcIjpbXCJmaXJzdF9xdWFydGVyX21vb25cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJuYXR1cmVcIixcInR3aWxpZ2h0XCIsXCJwbGFuZXRcIixcInNwYWNlXCIsXCJuaWdodFwiLFwiZXZlbmluZ1wiLFwic2xlZXBcIl0sXCJzZWFyY2hcIjpcImZpcnN0LHF1YXJ0ZXIsbW9vbixzeW1ib2wsbmF0dXJlLHR3aWxpZ2h0LHBsYW5ldCxzcGFjZSxuaWdodCxldmVuaW5nLHNsZWVwXCJ9LFwic2FcIjp7XCJuYW1lXCI6XCJTcXVhcmVkIEthdGFrYW5hIFNhXCIsXCJ1bmlmaWVkXCI6XCIxRjIwMlwiLFwidmFyaWF0aW9uc1wiOltcIjFGMjAyLUZFMEZcIl0sXCJzaGVldF94XCI6NSxcInNoZWV0X3lcIjo3LFwic2hvcnRfbmFtZXNcIjpbXCJzYVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImphcGFuZXNlXCIsXCJibHVlLXNxdWFyZVwiLFwia2F0YWthbmFcIl0sXCJzZWFyY2hcIjpcInNhLHNxdWFyZWQsa2F0YWthbmEsamFwYW5lc2UsYmx1ZS1zcXVhcmVcIn0sXCJjbGFzc2ljYWxfYnVpbGRpbmdcIjp7XCJuYW1lXCI6XCJDbGFzc2ljYWwgQnVpbGRpbmdcIixcInVuaWZpZWRcIjpcIjFGM0RCXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTEsXCJzaGVldF95XCI6MTIsXCJzaG9ydF9uYW1lc1wiOltcImNsYXNzaWNhbF9idWlsZGluZ1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJjbGFzc2ljYWwsYnVpbGRpbmdcIn0sXCJ3cml0aW5nX2hhbmRcIjp7XCJuYW1lXCI6XCJXcml0aW5nIEhhbmRcIixcInVuaWZpZWRcIjpcIjI3MERcIixcInZhcmlhdGlvbnNcIjpbXCIyNzBELUZFMEZcIl0sXCJzaGVldF94XCI6MyxcInNoZWV0X3lcIjoyNyxcInNob3J0X25hbWVzXCI6W1wid3JpdGluZ19oYW5kXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJza2luX3ZhcmlhdGlvbnNcIjp7XCIyNzBELTFGM0ZCXCI6e1widW5pZmllZFwiOlwiMjcwRC0xRjNGQlwiLFwiaW1hZ2VcIjpcIjI3MGQtMWYzZmIucG5nXCIsXCJzaGVldF94XCI6MyxcInNoZWV0X3lcIjoyOCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIyNzBELTFGM0ZDXCI6e1widW5pZmllZFwiOlwiMjcwRC0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjI3MGQtMWYzZmMucG5nXCIsXCJzaGVldF94XCI6MyxcInNoZWV0X3lcIjoyOSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIyNzBELTFGM0ZEXCI6e1widW5pZmllZFwiOlwiMjcwRC0xRjNGRFwiLFwiaW1hZ2VcIjpcIjI3MGQtMWYzZmQucG5nXCIsXCJzaGVldF94XCI6MyxcInNoZWV0X3lcIjozMCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIyNzBELTFGM0ZFXCI6e1widW5pZmllZFwiOlwiMjcwRC0xRjNGRVwiLFwiaW1hZ2VcIjpcIjI3MGQtMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MyxcInNoZWV0X3lcIjozMSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIyNzBELTFGM0ZGXCI6e1widW5pZmllZFwiOlwiMjcwRC0xRjNGRlwiLFwiaW1hZ2VcIjpcIjI3MGQtMWYzZmYucG5nXCIsXCJzaGVldF94XCI6MyxcInNoZWV0X3lcIjozMixcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX19LFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBlblwiLFwic3RhdGlvbmVyeVwiXSxcInNlYXJjaFwiOlwid3JpdGluZyxoYW5kLHBlbixzdGF0aW9uZXJ5XCJ9LFwiZmxhZy1jaVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBDSVwiLFwidW5pZmllZFwiOlwiMUYxRTgtMUYxRUVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMyxcInNoZWV0X3lcIjozNixcInNob3J0X25hbWVzXCI6W1wiZmxhZy1jaVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGNpLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcIm1vb25cIjp7XCJuYW1lXCI6XCJXYXhpbmcgR2liYm91cyBNb29uIFN5bWJvbFwiLFwidW5pZmllZFwiOlwiMUYzMTRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo2LFwic2hlZXRfeVwiOjAsXCJzaG9ydF9uYW1lc1wiOltcIm1vb25cIixcIndheGluZ19naWJib3VzX21vb25cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJuYXR1cmVcIixcIm5pZ2h0XCIsXCJza3lcIixcImdyYXlcIixcInR3aWxpZ2h0XCIsXCJwbGFuZXRcIixcInNwYWNlXCIsXCJldmVuaW5nXCIsXCJzbGVlcFwiXSxcInNlYXJjaFwiOlwibW9vbix3YXhpbmcsZ2liYm91cyxzeW1ib2wsbmF0dXJlLG5pZ2h0LHNreSxncmF5LHR3aWxpZ2h0LHBsYW5ldCxzcGFjZSxldmVuaW5nLHNsZWVwXCJ9LFwiY2h1cmNoXCI6e1wibmFtZVwiOlwiQ2h1cmNoXCIsXCJ1bmlmaWVkXCI6XCIyNkVBXCIsXCJ2YXJpYXRpb25zXCI6W1wiMjZFQS1GRTBGXCJdLFwic2hlZXRfeFwiOjIsXCJzaGVldF95XCI6MjksXCJzaG9ydF9uYW1lc1wiOltcImNodXJjaFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJ1aWxkaW5nXCIsXCJyZWxpZ2lvblwiLFwiY2hyaXN0XCJdLFwic2VhcmNoXCI6XCJjaHVyY2gsYnVpbGRpbmcscmVsaWdpb24sY2hyaXN0XCJ9LFwiZW1haWxcIjp7XCJuYW1lXCI6XCJFbnZlbG9wZVwiLFwidW5pZmllZFwiOlwiMjcwOVwiLFwidmFyaWF0aW9uc1wiOltcIjI3MDktRkUwRlwiXSxcInNoZWV0X3hcIjozLFwic2hlZXRfeVwiOjgsXCJzaG9ydF9uYW1lc1wiOltcImVtYWlsXCIsXCJlbnZlbG9wZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImNvbW11bmljYXRpb25cIixcImluYm94XCJdLFwic2VhcmNoXCI6XCJlbWFpbCxlbnZlbG9wZSxjb21tdW5pY2F0aW9uLGluYm94XCJ9LFwicGFzc3BvcnRfY29udHJvbFwiOntcIm5hbWVcIjpcIlBhc3Nwb3J0IENvbnRyb2xcIixcInVuaWZpZWRcIjpcIjFGNkMyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzEsXCJzaGVldF95XCI6MjEsXCJzaG9ydF9uYW1lc1wiOltcInBhc3Nwb3J0X2NvbnRyb2xcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJjdXN0b21cIixcImJsdWUtc3F1YXJlXCJdLFwic2VhcmNoXCI6XCJwYXNzcG9ydCxjb250cm9sLGN1c3RvbSxibHVlLXNxdWFyZVwifSxcIm5haWxfY2FyZVwiOntcIm5hbWVcIjpcIk5haWwgUG9saXNoXCIsXCJ1bmlmaWVkXCI6XCIxRjQ4NVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE5LFwic2hlZXRfeVwiOjYsXCJzaG9ydF9uYW1lc1wiOltcIm5haWxfY2FyZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUY0ODUtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ4NS0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmNDg1LTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjE5LFwic2hlZXRfeVwiOjcsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0ODUtMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ4NS0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmNDg1LTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjE5LFwic2hlZXRfeVwiOjgsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0ODUtMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ4NS0xRjNGRFwiLFwiaW1hZ2VcIjpcIjFmNDg1LTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjE5LFwic2hlZXRfeVwiOjksXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0ODUtMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ4NS0xRjNGRVwiLFwiaW1hZ2VcIjpcIjFmNDg1LTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjE5LFwic2hlZXRfeVwiOjEwLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDg1LTFGM0ZGXCI6e1widW5pZmllZFwiOlwiMUY0ODUtMUYzRkZcIixcImltYWdlXCI6XCIxZjQ4NS0xZjNmZi5wbmdcIixcInNoZWV0X3hcIjoxOSxcInNoZWV0X3lcIjoxMSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX19LFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJlYXV0eVwiLFwibWFuaWN1cmVcIixcImZpbmdlclwiLFwiZmFzaGlvblwiXSxcInNlYXJjaFwiOlwibmFpbCxjYXJlLHBvbGlzaCxiZWF1dHksbWFuaWN1cmUsZmluZ2VyLGZhc2hpb25cIn0sXCJmbGFnLWptXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEpNXCIsXCJ1bmlmaWVkXCI6XCIxRjFFRi0xRjFGMlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM1LFwic2hlZXRfeVwiOjI3LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWptXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsam0scmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwibGlwc1wiOntcIm5hbWVcIjpcIk1vdXRoXCIsXCJ1bmlmaWVkXCI6XCIxRjQ0NFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE0LFwic2hlZXRfeVwiOjEsXCJzaG9ydF9uYW1lc1wiOltcImxpcHNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJtb3V0aFwiLFwia2lzc1wiXSxcInNlYXJjaFwiOlwibGlwcyxtb3V0aCxraXNzXCJ9LFwibW9zcXVlXCI6e1wibmFtZVwiOlwiTW9zcXVlXCIsXCJ1bmlmaWVkXCI6XCIxRjU0Q1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI0LFwic2hlZXRfeVwiOjgsXCJzaG9ydF9uYW1lc1wiOltcIm1vc3F1ZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImlzbGFtXCIsXCJ3b3JzaGlwXCIsXCJtaW5hcmV0XCJdLFwic2VhcmNoXCI6XCJtb3NxdWUsaXNsYW0sd29yc2hpcCxtaW5hcmV0XCJ9LFwiZmxhZy1qcFwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBKUFwiLFwidW5pZmllZFwiOlwiMUYxRUYtMUYxRjVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNSxcInNoZWV0X3lcIjoyOSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1qcFwiLFwianBcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxqcCxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJuZXdfbW9vbl93aXRoX2ZhY2VcIjp7XCJuYW1lXCI6XCJOZXcgTW9vbiB3aXRoIEZhY2VcIixcInVuaWZpZWRcIjpcIjFGMzFBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NixcInNoZWV0X3lcIjo2LFwic2hvcnRfbmFtZXNcIjpbXCJuZXdfbW9vbl93aXRoX2ZhY2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJuYXR1cmVcIixcInR3aWxpZ2h0XCIsXCJwbGFuZXRcIixcInNwYWNlXCIsXCJuaWdodFwiLFwiZXZlbmluZ1wiLFwic2xlZXBcIl0sXCJzZWFyY2hcIjpcIm5ldyxtb29uLHdpdGgsZmFjZSxuYXR1cmUsdHdpbGlnaHQscGxhbmV0LHNwYWNlLG5pZ2h0LGV2ZW5pbmcsc2xlZXBcIn0sXCJjdXN0b21zXCI6e1wibmFtZVwiOlwiQ3VzdG9tc1wiLFwidW5pZmllZFwiOlwiMUY2QzNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMSxcInNoZWV0X3lcIjoyMixcInNob3J0X25hbWVzXCI6W1wiY3VzdG9tc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBhc3Nwb3J0XCIsXCJib3JkZXJcIixcImJsdWUtc3F1YXJlXCJdLFwic2VhcmNoXCI6XCJjdXN0b21zLHBhc3Nwb3J0LGJvcmRlcixibHVlLXNxdWFyZVwifSxcImVudmVsb3BlX3dpdGhfYXJyb3dcIjp7XCJuYW1lXCI6XCJFbnZlbG9wZSB3aXRoIERvd253YXJkcyBBcnJvdyBBYm92ZVwiLFwidW5pZmllZFwiOlwiMUY0RTlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMixcInNoZWV0X3lcIjozLFwic2hvcnRfbmFtZXNcIjpbXCJlbnZlbG9wZV93aXRoX2Fycm93XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZW1haWxcIixcImNvbW11bmljYXRpb25cIl0sXCJzZWFyY2hcIjpcImVudmVsb3BlLHdpdGgsYXJyb3csZG93bndhcmRzLGFib3ZlLGVtYWlsLGNvbW11bmljYXRpb25cIn0sXCJmdWxsX21vb25fd2l0aF9mYWNlXCI6e1wibmFtZVwiOlwiRnVsbCBNb29uIHdpdGggRmFjZVwiLFwidW5pZmllZFwiOlwiMUYzMURcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo2LFwic2hlZXRfeVwiOjksXCJzaG9ydF9uYW1lc1wiOltcImZ1bGxfbW9vbl93aXRoX2ZhY2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJuYXR1cmVcIixcInR3aWxpZ2h0XCIsXCJwbGFuZXRcIixcInNwYWNlXCIsXCJuaWdodFwiLFwiZXZlbmluZ1wiLFwic2xlZXBcIl0sXCJzZWFyY2hcIjpcImZ1bGwsbW9vbix3aXRoLGZhY2UsbmF0dXJlLHR3aWxpZ2h0LHBsYW5ldCxzcGFjZSxuaWdodCxldmVuaW5nLHNsZWVwXCJ9LFwiZmxhZy1qZVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBKRVwiLFwidW5pZmllZFwiOlwiMUYxRUYtMUYxRUFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNSxcInNoZWV0X3lcIjoyNixcInNob3J0X25hbWVzXCI6W1wiZmxhZy1qZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGplLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcInN5bmFnb2d1ZVwiOntcIm5hbWVcIjpcIlN5bmFnb2d1ZVwiLFwidW5pZmllZFwiOlwiMUY1NERcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNCxcInNoZWV0X3lcIjo5LFwic2hvcnRfbmFtZXNcIjpbXCJzeW5hZ29ndWVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJqdWRhaXNtXCIsXCJ3b3JzaGlwXCIsXCJ0ZW1wbGVcIixcImpld2lzaFwiXSxcInNlYXJjaFwiOlwic3luYWdvZ3VlLGp1ZGFpc20sd29yc2hpcCx0ZW1wbGUsamV3aXNoXCJ9LFwiYmFnZ2FnZV9jbGFpbVwiOntcIm5hbWVcIjpcIkJhZ2dhZ2UgQ2xhaW1cIixcInVuaWZpZWRcIjpcIjFGNkM0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzEsXCJzaGVldF95XCI6MjMsXCJzaG9ydF9uYW1lc1wiOltcImJhZ2dhZ2VfY2xhaW1cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJibHVlLXNxdWFyZVwiLFwiYWlycG9ydFwiLFwidHJhbnNwb3J0XCJdLFwic2VhcmNoXCI6XCJiYWdnYWdlLGNsYWltLGJsdWUtc3F1YXJlLGFpcnBvcnQsdHJhbnNwb3J0XCJ9LFwidG9uZ3VlXCI6e1wibmFtZVwiOlwiVG9uZ3VlXCIsXCJ1bmlmaWVkXCI6XCIxRjQ0NVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE0LFwic2hlZXRfeVwiOjIsXCJzaG9ydF9uYW1lc1wiOltcInRvbmd1ZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm1vdXRoXCIsXCJwbGF5ZnVsXCJdLFwic2VhcmNoXCI6XCJ0b25ndWUsbW91dGgscGxheWZ1bFwifSxcImluY29taW5nX2VudmVsb3BlXCI6e1wibmFtZVwiOlwiSW5jb21pbmcgRW52ZWxvcGVcIixcInVuaWZpZWRcIjpcIjFGNEU4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjIsXCJzaGVldF95XCI6MixcInNob3J0X25hbWVzXCI6W1wiaW5jb21pbmdfZW52ZWxvcGVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJlbWFpbFwiLFwiaW5ib3hcIl0sXCJzZWFyY2hcIjpcImluY29taW5nLGVudmVsb3BlLGVtYWlsLGluYm94XCJ9LFwiZS1tYWlsXCI6e1wibmFtZVwiOlwiRS1NYWlsIFN5bWJvbFwiLFwidW5pZmllZFwiOlwiMUY0RTdcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMixcInNoZWV0X3lcIjoxLFwic2hvcnRfbmFtZXNcIjpbXCJlLW1haWxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZSxtYWlsLHN5bWJvbFwifSxcImVhclwiOntcIm5hbWVcIjpcIkVhclwiLFwidW5pZmllZFwiOlwiMUY0NDJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMyxcInNoZWV0X3lcIjozMCxcInNob3J0X25hbWVzXCI6W1wiZWFyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJza2luX3ZhcmlhdGlvbnNcIjp7XCIxRjQ0Mi0xRjNGQlwiOntcInVuaWZpZWRcIjpcIjFGNDQyLTFGM0ZCXCIsXCJpbWFnZVwiOlwiMWY0NDItMWYzZmIucG5nXCIsXCJzaGVldF94XCI6MTMsXCJzaGVldF95XCI6MzEsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NDItMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ0Mi0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmNDQyLTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjEzLFwic2hlZXRfeVwiOjMyLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDQyLTFGM0ZEXCI6e1widW5pZmllZFwiOlwiMUY0NDItMUYzRkRcIixcImltYWdlXCI6XCIxZjQ0Mi0xZjNmZC5wbmdcIixcInNoZWV0X3hcIjoxMyxcInNoZWV0X3lcIjozMyxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ0Mi0xRjNGRVwiOntcInVuaWZpZWRcIjpcIjFGNDQyLTFGM0ZFXCIsXCJpbWFnZVwiOlwiMWY0NDItMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MTMsXCJzaGVldF95XCI6MzQsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NDItMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ0Mi0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmNDQyLTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjEzLFwic2hlZXRfeVwiOjM1LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfX0sXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmFjZVwiLFwiaGVhclwiLFwic291bmRcIixcImxpc3RlblwiXSxcInNlYXJjaFwiOlwiZWFyLGZhY2UsaGVhcixzb3VuZCxsaXN0ZW5cIn0sXCJmaXJzdF9xdWFydGVyX21vb25fd2l0aF9mYWNlXCI6e1wibmFtZVwiOlwiRmlyc3QgUXVhcnRlciBNb29uIHdpdGggRmFjZVwiLFwidW5pZmllZFwiOlwiMUYzMUJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo2LFwic2hlZXRfeVwiOjcsXCJzaG9ydF9uYW1lc1wiOltcImZpcnN0X3F1YXJ0ZXJfbW9vbl93aXRoX2ZhY2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJuYXR1cmVcIixcInR3aWxpZ2h0XCIsXCJwbGFuZXRcIixcInNwYWNlXCIsXCJuaWdodFwiLFwiZXZlbmluZ1wiLFwic2xlZXBcIl0sXCJzZWFyY2hcIjpcImZpcnN0LHF1YXJ0ZXIsbW9vbix3aXRoLGZhY2UsbmF0dXJlLHR3aWxpZ2h0LHBsYW5ldCxzcGFjZSxuaWdodCxldmVuaW5nLHNsZWVwXCJ9LFwibGVmdF9sdWdnYWdlXCI6e1wibmFtZVwiOlwiTGVmdCBMdWdnYWdlXCIsXCJ1bmlmaWVkXCI6XCIxRjZDNVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMxLFwic2hlZXRfeVwiOjI0LFwic2hvcnRfbmFtZXNcIjpbXCJsZWZ0X2x1Z2dhZ2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJibHVlLXNxdWFyZVwiLFwidHJhdmVsXCJdLFwic2VhcmNoXCI6XCJsZWZ0LGx1Z2dhZ2UsYmx1ZS1zcXVhcmUsdHJhdmVsXCJ9LFwia2FhYmFcIjp7XCJuYW1lXCI6XCJLYWFiYVwiLFwidW5pZmllZFwiOlwiMUY1NEJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNCxcInNoZWV0X3lcIjo3LFwic2hvcnRfbmFtZXNcIjpbXCJrYWFiYVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm1lY2NhXCIsXCJtb3NxdWVcIixcImlzbGFtXCJdLFwic2VhcmNoXCI6XCJrYWFiYSxtZWNjYSxtb3NxdWUsaXNsYW1cIn0sXCJmbGFnLWpvXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEpPXCIsXCJ1bmlmaWVkXCI6XCIxRjFFRi0xRjFGNFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM1LFwic2hlZXRfeVwiOjI4LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWpvXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsam8scmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZmxhZy1relwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBLWlwiLFwidW5pZmllZFwiOlwiMUYxRjAtMUYxRkZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNSxcInNoZWV0X3lcIjo0MCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1relwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGt6LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcIndoZWVsY2hhaXJcIjp7XCJuYW1lXCI6XCJXaGVlbGNoYWlyIFN5bWJvbFwiLFwidW5pZmllZFwiOlwiMjY3RlwiLFwidmFyaWF0aW9uc1wiOltcIjI2N0YtRkUwRlwiXSxcInNoZWV0X3hcIjoyLFwic2hlZXRfeVwiOjMsXCJzaG9ydF9uYW1lc1wiOltcIndoZWVsY2hhaXJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJibHVlLXNxdWFyZVwiLFwiZGlzYWJsZWRcIixcImExMXlcIixcImFjY2Vzc2liaWxpdHlcIl0sXCJzZWFyY2hcIjpcIndoZWVsY2hhaXIsc3ltYm9sLGJsdWUtc3F1YXJlLGRpc2FibGVkLGExMXksYWNjZXNzaWJpbGl0eVwifSxcImxhc3RfcXVhcnRlcl9tb29uX3dpdGhfZmFjZVwiOntcIm5hbWVcIjpcIkxhc3QgUXVhcnRlciBNb29uIHdpdGggRmFjZVwiLFwidW5pZmllZFwiOlwiMUYzMUNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo2LFwic2hlZXRfeVwiOjgsXCJzaG9ydF9uYW1lc1wiOltcImxhc3RfcXVhcnRlcl9tb29uX3dpdGhfZmFjZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm5hdHVyZVwiLFwidHdpbGlnaHRcIixcInBsYW5ldFwiLFwic3BhY2VcIixcIm5pZ2h0XCIsXCJldmVuaW5nXCIsXCJzbGVlcFwiXSxcInNlYXJjaFwiOlwibGFzdCxxdWFydGVyLG1vb24sd2l0aCxmYWNlLG5hdHVyZSx0d2lsaWdodCxwbGFuZXQsc3BhY2UsbmlnaHQsZXZlbmluZyxzbGVlcFwifSxcIm5vc2VcIjp7XCJuYW1lXCI6XCJOb3NlXCIsXCJ1bmlmaWVkXCI6XCIxRjQ0M1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEzLFwic2hlZXRfeVwiOjM2LFwic2hvcnRfbmFtZXNcIjpbXCJub3NlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJza2luX3ZhcmlhdGlvbnNcIjp7XCIxRjQ0My0xRjNGQlwiOntcInVuaWZpZWRcIjpcIjFGNDQzLTFGM0ZCXCIsXCJpbWFnZVwiOlwiMWY0NDMtMWYzZmIucG5nXCIsXCJzaGVldF94XCI6MTMsXCJzaGVldF95XCI6MzcsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NDMtMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ0My0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmNDQzLTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjEzLFwic2hlZXRfeVwiOjM4LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDQzLTFGM0ZEXCI6e1widW5pZmllZFwiOlwiMUY0NDMtMUYzRkRcIixcImltYWdlXCI6XCIxZjQ0My0xZjNmZC5wbmdcIixcInNoZWV0X3hcIjoxMyxcInNoZWV0X3lcIjozOSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ0My0xRjNGRVwiOntcInVuaWZpZWRcIjpcIjFGNDQzLTFGM0ZFXCIsXCJpbWFnZVwiOlwiMWY0NDMtMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MTMsXCJzaGVldF95XCI6NDAsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NDMtMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ0My0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmNDQzLTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjE0LFwic2hlZXRfeVwiOjAsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzbWVsbFwiLFwic25pZmZcIl0sXCJzZWFyY2hcIjpcIm5vc2Usc21lbGwsc25pZmZcIn0sXCJsb3ZlX2xldHRlclwiOntcIm5hbWVcIjpcIkxvdmUgTGV0dGVyXCIsXCJ1bmlmaWVkXCI6XCIxRjQ4Q1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE5LFwic2hlZXRfeVwiOjI4LFwic2hvcnRfbmFtZXNcIjpbXCJsb3ZlX2xldHRlclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImVtYWlsXCIsXCJsaWtlXCIsXCJhZmZlY3Rpb25cIixcImVudmVsb3BlXCIsXCJ2YWxlbnRpbmVzXCJdLFwic2VhcmNoXCI6XCJsb3ZlLGxldHRlcixlbWFpbCxsaWtlLGFmZmVjdGlvbixlbnZlbG9wZSx2YWxlbnRpbmVzXCJ9LFwic2hpbnRvX3NocmluZVwiOntcIm5hbWVcIjpcIlNoaW50byBTaHJpbmVcIixcInVuaWZpZWRcIjpcIjI2RTlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyLFwic2hlZXRfeVwiOjI4LFwic2hvcnRfbmFtZXNcIjpbXCJzaGludG9fc2hyaW5lXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widGVtcGxlXCIsXCJqYXBhblwiLFwia3lvdG9cIl0sXCJzZWFyY2hcIjpcInNoaW50byxzaHJpbmUsdGVtcGxlLGphcGFuLGt5b3RvXCJ9LFwibm9fc21va2luZ1wiOntcIm5hbWVcIjpcIk5vIFNtb2tpbmcgU3ltYm9sXCIsXCJ1bmlmaWVkXCI6XCIxRjZBRFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMwLFwic2hlZXRfeVwiOjIxLFwic2hvcnRfbmFtZXNcIjpbXCJub19zbW9raW5nXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiY2lnYXJldHRlXCIsXCJibHVlLXNxdWFyZVwiLFwic21lbGxcIixcInNtb2tlXCJdLFwic2VhcmNoXCI6XCJubyxzbW9raW5nLHN5bWJvbCxjaWdhcmV0dGUsYmx1ZS1zcXVhcmUsc21lbGwsc21va2VcIn0sXCJwb3N0Ym94XCI6e1wibmFtZVwiOlwiUG9zdGJveFwiLFwidW5pZmllZFwiOlwiMUY0RUVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMixcInNoZWV0X3lcIjo4LFwic2hvcnRfbmFtZXNcIjpbXCJwb3N0Ym94XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZW1haWxcIixcImxldHRlclwiLFwiZW52ZWxvcGVcIl0sXCJzZWFyY2hcIjpcInBvc3Rib3gsZW1haWwsbGV0dGVyLGVudmVsb3BlXCJ9LFwiZXllXCI6e1wibmFtZVwiOlwiRXllXCIsXCJ1bmlmaWVkXCI6XCIxRjQ0MVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEzLFwic2hlZXRfeVwiOjI5LFwic2hvcnRfbmFtZXNcIjpbXCJleWVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmYWNlXCIsXCJsb29rXCIsXCJzZWVcIixcIndhdGNoXCIsXCJzdGFyZVwiXSxcInNlYXJjaFwiOlwiZXllLGZhY2UsbG9vayxzZWUsd2F0Y2gsc3RhcmVcIn0sXCJzdW5fd2l0aF9mYWNlXCI6e1wibmFtZVwiOlwiU3VuIHdpdGggRmFjZVwiLFwidW5pZmllZFwiOlwiMUYzMUVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo2LFwic2hlZXRfeVwiOjEwLFwic2hvcnRfbmFtZXNcIjpbXCJzdW5fd2l0aF9mYWNlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibmF0dXJlXCIsXCJtb3JuaW5nXCIsXCJza3lcIl0sXCJzZWFyY2hcIjpcInN1bix3aXRoLGZhY2UsbmF0dXJlLG1vcm5pbmcsc2t5XCJ9LFwiZmxhZy1rZVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBLRVwiLFwidW5pZmllZFwiOlwiMUYxRjAtMUYxRUFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNSxcInNoZWV0X3lcIjozMCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1rZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGtlLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcIm1haWxib3hfY2xvc2VkXCI6e1wibmFtZVwiOlwiQ2xvc2VkIE1haWxib3ggd2l0aCBMb3dlcmVkIEZsYWdcIixcInVuaWZpZWRcIjpcIjFGNEVBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjIsXCJzaGVldF95XCI6NCxcInNob3J0X25hbWVzXCI6W1wibWFpbGJveF9jbG9zZWRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJlbWFpbFwiLFwiY29tbXVuaWNhdGlvblwiLFwiaW5ib3hcIl0sXCJzZWFyY2hcIjpcIm1haWxib3gsY2xvc2VkLHdpdGgsbG93ZXJlZCxmbGFnLGVtYWlsLGNvbW11bmljYXRpb24saW5ib3hcIn0sXCJmbGFnLWtpXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEtJXCIsXCJ1bmlmaWVkXCI6XCIxRjFGMC0xRjFFRVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM1LFwic2hlZXRfeVwiOjMzLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWtpXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsa2kscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZXllc1wiOntcIm5hbWVcIjpcIkV5ZXNcIixcInVuaWZpZWRcIjpcIjFGNDQwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTMsXCJzaGVldF95XCI6MjgsXCJzaG9ydF9uYW1lc1wiOltcImV5ZXNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJsb29rXCIsXCJ3YXRjaFwiLFwic3RhbGtcIixcInBlZWtcIixcInNlZVwiXSxcInNlYXJjaFwiOlwiZXllcyxsb29rLHdhdGNoLHN0YWxrLHBlZWssc2VlXCJ9LFwid2NcIjp7XCJuYW1lXCI6XCJXYXRlciBDbG9zZXRcIixcInVuaWZpZWRcIjpcIjFGNkJFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzEsXCJzaGVldF95XCI6MTIsXCJzaG9ydF9uYW1lc1wiOltcIndjXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widG9pbGV0XCIsXCJyZXN0cm9vbVwiLFwiYmx1ZS1zcXVhcmVcIl0sXCJzZWFyY2hcIjpcIndjLHdhdGVyLGNsb3NldCx0b2lsZXQscmVzdHJvb20sYmx1ZS1zcXVhcmVcIn0sXCJjcmVzY2VudF9tb29uXCI6e1wibmFtZVwiOlwiQ3Jlc2NlbnQgTW9vblwiLFwidW5pZmllZFwiOlwiMUYzMTlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo2LFwic2hlZXRfeVwiOjUsXCJzaG9ydF9uYW1lc1wiOltcImNyZXNjZW50X21vb25cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJuaWdodFwiLFwic2xlZXBcIixcInNreVwiLFwiZXZlbmluZ1wiLFwibWFnaWNcIl0sXCJzZWFyY2hcIjpcImNyZXNjZW50LG1vb24sbmlnaHQsc2xlZXAsc2t5LGV2ZW5pbmcsbWFnaWNcIn0sXCJtYWlsYm94XCI6e1wibmFtZVwiOlwiQ2xvc2VkIE1haWxib3ggd2l0aCBSYWlzZWQgRmxhZ1wiLFwidW5pZmllZFwiOlwiMUY0RUJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMixcInNoZWV0X3lcIjo1LFwic2hvcnRfbmFtZXNcIjpbXCJtYWlsYm94XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZW1haWxcIixcImluYm94XCIsXCJjb21tdW5pY2F0aW9uXCJdLFwic2VhcmNoXCI6XCJtYWlsYm94LGNsb3NlZCx3aXRoLHJhaXNlZCxmbGFnLGVtYWlsLGluYm94LGNvbW11bmljYXRpb25cIn0sXCJmbGFnLXhrXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFhLXCIsXCJ1bmlmaWVkXCI6XCIxRjFGRC0xRjFGMFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM4LFwic2hlZXRfeVwiOjM4LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXhrXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHhrLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcInBhcmtpbmdcIjp7XCJuYW1lXCI6XCJOZWdhdGl2ZSBTcXVhcmVkIExhdGluIENhcGl0YWwgTGV0dGVyIFBcIixcInVuaWZpZWRcIjpcIjFGMTdGXCIsXCJ2YXJpYXRpb25zXCI6W1wiMUYxN0YtRkUwRlwiXSxcInNoZWV0X3hcIjo0LFwic2hlZXRfeVwiOjM1LFwic2hvcnRfbmFtZXNcIjpbXCJwYXJraW5nXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiY2Fyc1wiLFwiYmx1ZS1zcXVhcmVcIixcImFscGhhYmV0XCIsXCJsZXR0ZXJcIl0sXCJzZWFyY2hcIjpcInBhcmtpbmcsbmVnYXRpdmUsc3F1YXJlZCxsYXRpbixjYXBpdGFsLGxldHRlcixwLGNhcnMsYmx1ZS1zcXVhcmUsYWxwaGFiZXRcIn0sXCJidXN0X2luX3NpbGhvdWV0dGVcIjp7XCJuYW1lXCI6XCJCdXN0IGluIFNpbGhvdWV0dGVcIixcInVuaWZpZWRcIjpcIjFGNDY0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTYsXCJzaGVldF95XCI6NixcInNob3J0X25hbWVzXCI6W1wiYnVzdF9pbl9zaWxob3VldHRlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widXNlclwiLFwicGVyc29uXCIsXCJodW1hblwiXSxcInNlYXJjaFwiOlwiYnVzdCxpbixzaWxob3VldHRlLHVzZXIscGVyc29uLGh1bWFuXCJ9LFwic3RhclwiOntcIm5hbWVcIjpcIldoaXRlIE1lZGl1bSBTdGFyXCIsXCJ1bmlmaWVkXCI6XCIyQjUwXCIsXCJ2YXJpYXRpb25zXCI6W1wiMkI1MC1GRTBGXCJdLFwic2hlZXRfeFwiOjQsXCJzaGVldF95XCI6MjQsXCJzaG9ydF9uYW1lc1wiOltcInN0YXJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJuaWdodFwiLFwieWVsbG93XCJdLFwic2VhcmNoXCI6XCJzdGFyLHdoaXRlLG1lZGl1bSxuaWdodCx5ZWxsb3dcIn0sXCJzdGFyMlwiOntcIm5hbWVcIjpcIkdsb3dpbmcgU3RhclwiLFwidW5pZmllZFwiOlwiMUYzMUZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo2LFwic2hlZXRfeVwiOjExLFwic2hvcnRfbmFtZXNcIjpbXCJzdGFyMlwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm5pZ2h0XCIsXCJzcGFya2xlXCIsXCJhd2Vzb21lXCIsXCJnb29kXCIsXCJtYWdpY1wiXSxcInNlYXJjaFwiOlwic3RhcjIsZ2xvd2luZyxzdGFyLG5pZ2h0LHNwYXJrbGUsYXdlc29tZSxnb29kLG1hZ2ljXCJ9LFwibWFpbGJveF93aXRoX21haWxcIjp7XCJuYW1lXCI6XCJPcGVuIE1haWxib3ggd2l0aCBSYWlzZWQgRmxhZ1wiLFwidW5pZmllZFwiOlwiMUY0RUNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMixcInNoZWV0X3lcIjo2LFwic2hvcnRfbmFtZXNcIjpbXCJtYWlsYm94X3dpdGhfbWFpbFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImVtYWlsXCIsXCJpbmJveFwiLFwiY29tbXVuaWNhdGlvblwiXSxcInNlYXJjaFwiOlwibWFpbGJveCx3aXRoLG1haWwsb3BlbixyYWlzZWQsZmxhZyxlbWFpbCxpbmJveCxjb21tdW5pY2F0aW9uXCJ9LFwicG90YWJsZV93YXRlclwiOntcIm5hbWVcIjpcIlBvdGFibGUgV2F0ZXIgU3ltYm9sXCIsXCJ1bmlmaWVkXCI6XCIxRjZCMFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMwLFwic2hlZXRfeVwiOjI0LFwic2hvcnRfbmFtZXNcIjpbXCJwb3RhYmxlX3dhdGVyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYmx1ZS1zcXVhcmVcIixcImxpcXVpZFwiLFwicmVzdHJvb21cIixcImNsZWFuaW5nXCIsXCJmYXVjZXRcIl0sXCJzZWFyY2hcIjpcInBvdGFibGUsd2F0ZXIsc3ltYm9sLGJsdWUtc3F1YXJlLGxpcXVpZCxyZXN0cm9vbSxjbGVhbmluZyxmYXVjZXRcIn0sXCJidXN0c19pbl9zaWxob3VldHRlXCI6e1wibmFtZVwiOlwiQnVzdHMgaW4gU2lsaG91ZXR0ZVwiLFwidW5pZmllZFwiOlwiMUY0NjVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxNixcInNoZWV0X3lcIjo3LFwic2hvcnRfbmFtZXNcIjpbXCJidXN0c19pbl9zaWxob3VldHRlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widXNlclwiLFwicGVyc29uXCIsXCJodW1hblwiLFwiZ3JvdXBcIixcInRlYW1cIl0sXCJzZWFyY2hcIjpcImJ1c3RzLGluLHNpbGhvdWV0dGUsdXNlcixwZXJzb24saHVtYW4sZ3JvdXAsdGVhbVwifSxcImZsYWcta3dcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgS1dcIixcInVuaWZpZWRcIjpcIjFGMUYwLTFGMUZDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzUsXCJzaGVldF95XCI6MzgsXCJzaG9ydF9uYW1lc1wiOltcImZsYWcta3dcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxrdyxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJtZW5zXCI6e1wibmFtZVwiOlwiTWVucyBTeW1ib2xcIixcInVuaWZpZWRcIjpcIjFGNkI5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzEsXCJzaGVldF95XCI6NyxcInNob3J0X25hbWVzXCI6W1wibWVuc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRvaWxldFwiLFwicmVzdHJvb21cIixcIndjXCIsXCJibHVlLXNxdWFyZVwiLFwiZ2VuZGVyXCIsXCJtYWxlXCJdLFwic2VhcmNoXCI6XCJtZW5zLHN5bWJvbCx0b2lsZXQscmVzdHJvb20sd2MsYmx1ZS1zcXVhcmUsZ2VuZGVyLG1hbGVcIn0sXCJkaXp6eVwiOntcIm5hbWVcIjpcIkRpenp5IFN5bWJvbFwiLFwidW5pZmllZFwiOlwiMUY0QUJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMCxcInNoZWV0X3lcIjoyMyxcInNob3J0X25hbWVzXCI6W1wiZGl6enlcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzdGFyXCIsXCJzcGFya2xlXCIsXCJzaG9vdFwiLFwibWFnaWNcIl0sXCJzZWFyY2hcIjpcImRpenp5LHN5bWJvbCxzdGFyLHNwYXJrbGUsc2hvb3QsbWFnaWNcIn0sXCJzcGVha2luZ19oZWFkX2luX3NpbGhvdWV0dGVcIjp7XCJuYW1lXCI6XCJTcGVha2luZyBIZWFkIGluIFNpbGhvdWV0dGVcIixcInVuaWZpZWRcIjpcIjFGNUUzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjYsXCJzaGVldF95XCI6NSxcInNob3J0X25hbWVzXCI6W1wic3BlYWtpbmdfaGVhZF9pbl9zaWxob3VldHRlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcInNwZWFraW5nLGhlYWQsaW4sc2lsaG91ZXR0ZVwifSxcImZsYWcta2dcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgS0dcIixcInVuaWZpZWRcIjpcIjFGMUYwLTFGMUVDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzUsXCJzaGVldF95XCI6MzEsXCJzaG9ydF9uYW1lc1wiOltcImZsYWcta2dcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxrZyxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJtYWlsYm94X3dpdGhfbm9fbWFpbFwiOntcIm5hbWVcIjpcIk9wZW4gTWFpbGJveCB3aXRoIExvd2VyZWQgRmxhZ1wiLFwidW5pZmllZFwiOlwiMUY0RURcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMixcInNoZWV0X3lcIjo3LFwic2hvcnRfbmFtZXNcIjpbXCJtYWlsYm94X3dpdGhfbm9fbWFpbFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImVtYWlsXCIsXCJpbmJveFwiXSxcInNlYXJjaFwiOlwibWFpbGJveCx3aXRoLG5vLG1haWwsb3Blbixsb3dlcmVkLGZsYWcsZW1haWwsaW5ib3hcIn0sXCJzcGFya2xlc1wiOntcIm5hbWVcIjpcIlNwYXJrbGVzXCIsXCJ1bmlmaWVkXCI6XCIyNzI4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MyxcInNoZWV0X3lcIjozOSxcInNob3J0X25hbWVzXCI6W1wic3BhcmtsZXNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzdGFyc1wiLFwic2hpbmVcIixcInNoaW55XCIsXCJjb29sXCIsXCJhd2Vzb21lXCIsXCJnb29kXCIsXCJtYWdpY1wiXSxcInNlYXJjaFwiOlwic3BhcmtsZXMsc3RhcnMsc2hpbmUsc2hpbnksY29vbCxhd2Vzb21lLGdvb2QsbWFnaWNcIn0sXCJiYWJ5XCI6e1wibmFtZVwiOlwiQmFieVwiLFwidW5pZmllZFwiOlwiMUY0NzZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxNyxcInNoZWV0X3lcIjozOCxcInNob3J0X25hbWVzXCI6W1wiYmFieVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUY0NzYtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ3Ni0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmNDc2LTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjE3LFwic2hlZXRfeVwiOjM5LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDc2LTFGM0ZDXCI6e1widW5pZmllZFwiOlwiMUY0NzYtMUYzRkNcIixcImltYWdlXCI6XCIxZjQ3Ni0xZjNmYy5wbmdcIixcInNoZWV0X3hcIjoxNyxcInNoZWV0X3lcIjo0MCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ3Ni0xRjNGRFwiOntcInVuaWZpZWRcIjpcIjFGNDc2LTFGM0ZEXCIsXCJpbWFnZVwiOlwiMWY0NzYtMWYzZmQucG5nXCIsXCJzaGVldF94XCI6MTgsXCJzaGVldF95XCI6MCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ3Ni0xRjNGRVwiOntcInVuaWZpZWRcIjpcIjFGNDc2LTFGM0ZFXCIsXCJpbWFnZVwiOlwiMWY0NzYtMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MTgsXCJzaGVldF95XCI6MSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ3Ni0xRjNGRlwiOntcInVuaWZpZWRcIjpcIjFGNDc2LTFGM0ZGXCIsXCJpbWFnZVwiOlwiMWY0NzYtMWYzZmYucG5nXCIsXCJzaGVldF94XCI6MTgsXCJzaGVldF95XCI6MixcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX19LFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImNoaWxkXCIsXCJib3lcIixcImdpcmxcIixcInRvZGRsZXJcIl0sXCJzZWFyY2hcIjpcImJhYnksY2hpbGQsYm95LGdpcmwsdG9kZGxlclwifSxcInBhY2thZ2VcIjp7XCJuYW1lXCI6XCJQYWNrYWdlXCIsXCJ1bmlmaWVkXCI6XCIxRjRFNlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIyLFwic2hlZXRfeVwiOjAsXCJzaG9ydF9uYW1lc1wiOltcInBhY2thZ2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJtYWlsXCIsXCJnaWZ0XCIsXCJjYXJkYm9hcmRcIixcImJveFwiLFwibW92aW5nXCJdLFwic2VhcmNoXCI6XCJwYWNrYWdlLG1haWwsZ2lmdCxjYXJkYm9hcmQsYm94LG1vdmluZ1wifSxcIndvbWVuc1wiOntcIm5hbWVcIjpcIldvbWVucyBTeW1ib2xcIixcInVuaWZpZWRcIjpcIjFGNkJBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzEsXCJzaGVldF95XCI6OCxcInNob3J0X25hbWVzXCI6W1wid29tZW5zXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicHVycGxlLXNxdWFyZVwiLFwid29tYW5cIixcImZlbWFsZVwiLFwidG9pbGV0XCIsXCJsb29cIixcInJlc3Ryb29tXCIsXCJnZW5kZXJcIl0sXCJzZWFyY2hcIjpcIndvbWVucyxzeW1ib2wscHVycGxlLXNxdWFyZSx3b21hbixmZW1hbGUsdG9pbGV0LGxvbyxyZXN0cm9vbSxnZW5kZXJcIn0sXCJmbGFnLWxhXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIExBXCIsXCJ1bmlmaWVkXCI6XCIxRjFGMS0xRjFFNlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM2LFwic2hlZXRfeVwiOjAsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctbGFcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxsYSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJiYWJ5X3N5bWJvbFwiOntcIm5hbWVcIjpcIkJhYnkgU3ltYm9sXCIsXCJ1bmlmaWVkXCI6XCIxRjZCQ1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMxLFwic2hlZXRfeVwiOjEwLFwic2hvcnRfbmFtZXNcIjpbXCJiYWJ5X3N5bWJvbFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm9yYW5nZS1zcXVhcmVcIixcImNoaWxkXCJdLFwic2VhcmNoXCI6XCJiYWJ5LHN5bWJvbCxvcmFuZ2Utc3F1YXJlLGNoaWxkXCJ9LFwiZmxhZy1sdlwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBMVlwiLFwidW5pZmllZFwiOlwiMUYxRjEtMUYxRkJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNixcInNoZWV0X3lcIjo5LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWx2XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsbHYscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwicG9zdGFsX2hvcm5cIjp7XCJuYW1lXCI6XCJQb3N0YWwgSG9yblwiLFwidW5pZmllZFwiOlwiMUY0RUZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMixcInNoZWV0X3lcIjo5LFwic2hvcnRfbmFtZXNcIjpbXCJwb3N0YWxfaG9yblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImluc3RydW1lbnRcIixcIm11c2ljXCJdLFwic2VhcmNoXCI6XCJwb3N0YWwsaG9ybixpbnN0cnVtZW50LG11c2ljXCJ9LFwiY29tZXRcIjp7XCJuYW1lXCI6XCJDb21ldFwiLFwidW5pZmllZFwiOlwiMjYwNFwiLFwidmFyaWF0aW9uc1wiOltcIjI2MDQtRkUwRlwiXSxcInNoZWV0X3hcIjoxLFwic2hlZXRfeVwiOjQsXCJzaG9ydF9uYW1lc1wiOltcImNvbWV0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic3BhY2VcIl0sXCJzZWFyY2hcIjpcImNvbWV0LHNwYWNlXCJ9LFwiYm95XCI6e1wibmFtZVwiOlwiQm95XCIsXCJ1bmlmaWVkXCI6XCIxRjQ2NlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE2LFwic2hlZXRfeVwiOjgsXCJzaG9ydF9uYW1lc1wiOltcImJveVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUY0NjYtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ2Ni0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmNDY2LTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjE2LFwic2hlZXRfeVwiOjksXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NjYtMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ2Ni0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmNDY2LTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjE2LFwic2hlZXRfeVwiOjEwLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDY2LTFGM0ZEXCI6e1widW5pZmllZFwiOlwiMUY0NjYtMUYzRkRcIixcImltYWdlXCI6XCIxZjQ2Ni0xZjNmZC5wbmdcIixcInNoZWV0X3hcIjoxNixcInNoZWV0X3lcIjoxMSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ2Ni0xRjNGRVwiOntcInVuaWZpZWRcIjpcIjFGNDY2LTFGM0ZFXCIsXCJpbWFnZVwiOlwiMWY0NjYtMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MTYsXCJzaGVldF95XCI6MTIsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NjYtMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ2Ni0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmNDY2LTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjE2LFwic2hlZXRfeVwiOjEzLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfX0sXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibWFuXCIsXCJtYWxlXCIsXCJndXlcIixcInRlZW5hZ2VyXCJdLFwic2VhcmNoXCI6XCJib3ksbWFuLG1hbGUsZ3V5LHRlZW5hZ2VyXCJ9LFwicmVzdHJvb21cIjp7XCJuYW1lXCI6XCJSZXN0cm9vbVwiLFwidW5pZmllZFwiOlwiMUY2QkJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMSxcInNoZWV0X3lcIjo5LFwic2hvcnRfbmFtZXNcIjpbXCJyZXN0cm9vbVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJsdWUtc3F1YXJlXCIsXCJ0b2lsZXRcIixcInJlZnJlc2hcIixcIndjXCIsXCJnZW5kZXJcIl0sXCJzZWFyY2hcIjpcInJlc3Ryb29tLGJsdWUtc3F1YXJlLHRvaWxldCxyZWZyZXNoLHdjLGdlbmRlclwifSxcImZsYWctbGJcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgTEJcIixcInVuaWZpZWRcIjpcIjFGMUYxLTFGMUU3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzYsXCJzaGVldF95XCI6MSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1sYlwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGxiLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImluYm94X3RyYXlcIjp7XCJuYW1lXCI6XCJJbmJveCBUcmF5XCIsXCJ1bmlmaWVkXCI6XCIxRjRFNVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIxLFwic2hlZXRfeVwiOjQwLFwic2hvcnRfbmFtZXNcIjpbXCJpbmJveF90cmF5XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZW1haWxcIixcImRvY3VtZW50c1wiXSxcInNlYXJjaFwiOlwiaW5ib3gsdHJheSxlbWFpbCxkb2N1bWVudHNcIn0sXCJzdW5ueVwiOntcIm5hbWVcIjpcIkJsYWNrIFN1biB3aXRoIFJheXNcIixcInVuaWZpZWRcIjpcIjI2MDBcIixcInZhcmlhdGlvbnNcIjpbXCIyNjAwLUZFMEZcIl0sXCJzaGVldF94XCI6MSxcInNoZWV0X3lcIjowLFwic2hvcnRfbmFtZXNcIjpbXCJzdW5ueVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIndlYXRoZXJcIixcIm5hdHVyZVwiLFwiYnJpZ2h0bmVzc1wiLFwic3VtbWVyXCIsXCJiZWFjaFwiLFwic3ByaW5nXCJdLFwic2VhcmNoXCI6XCJzdW5ueSxibGFjayxzdW4sd2l0aCxyYXlzLHdlYXRoZXIsbmF0dXJlLGJyaWdodG5lc3Msc3VtbWVyLGJlYWNoLHNwcmluZ1wifSxcImdpcmxcIjp7XCJuYW1lXCI6XCJHaXJsXCIsXCJ1bmlmaWVkXCI6XCIxRjQ2N1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE2LFwic2hlZXRfeVwiOjE0LFwic2hvcnRfbmFtZXNcIjpbXCJnaXJsXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJza2luX3ZhcmlhdGlvbnNcIjp7XCIxRjQ2Ny0xRjNGQlwiOntcInVuaWZpZWRcIjpcIjFGNDY3LTFGM0ZCXCIsXCJpbWFnZVwiOlwiMWY0NjctMWYzZmIucG5nXCIsXCJzaGVldF94XCI6MTYsXCJzaGVldF95XCI6MTUsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NjctMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ2Ny0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmNDY3LTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjE2LFwic2hlZXRfeVwiOjE2LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDY3LTFGM0ZEXCI6e1widW5pZmllZFwiOlwiMUY0NjctMUYzRkRcIixcImltYWdlXCI6XCIxZjQ2Ny0xZjNmZC5wbmdcIixcInNoZWV0X3hcIjoxNixcInNoZWV0X3lcIjoxNyxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ2Ny0xRjNGRVwiOntcInVuaWZpZWRcIjpcIjFGNDY3LTFGM0ZFXCIsXCJpbWFnZVwiOlwiMWY0NjctMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MTYsXCJzaGVldF95XCI6MTgsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NjctMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ2Ny0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmNDY3LTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjE2LFwic2hlZXRfeVwiOjE5LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfX0sXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmVtYWxlXCIsXCJ3b21hblwiLFwidGVlbmFnZXJcIl0sXCJzZWFyY2hcIjpcImdpcmwsZmVtYWxlLHdvbWFuLHRlZW5hZ2VyXCJ9LFwibWFuXCI6e1wibmFtZVwiOlwiTWFuXCIsXCJ1bmlmaWVkXCI6XCIxRjQ2OFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE2LFwic2hlZXRfeVwiOjIwLFwic2hvcnRfbmFtZXNcIjpbXCJtYW5cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcInNraW5fdmFyaWF0aW9uc1wiOntcIjFGNDY4LTFGM0ZCXCI6e1widW5pZmllZFwiOlwiMUY0NjgtMUYzRkJcIixcImltYWdlXCI6XCIxZjQ2OC0xZjNmYi5wbmdcIixcInNoZWV0X3hcIjoxNixcInNoZWV0X3lcIjoyMSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ2OC0xRjNGQ1wiOntcInVuaWZpZWRcIjpcIjFGNDY4LTFGM0ZDXCIsXCJpbWFnZVwiOlwiMWY0NjgtMWYzZmMucG5nXCIsXCJzaGVldF94XCI6MTYsXCJzaGVldF95XCI6MjIsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NjgtMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ2OC0xRjNGRFwiLFwiaW1hZ2VcIjpcIjFmNDY4LTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjE2LFwic2hlZXRfeVwiOjIzLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDY4LTFGM0ZFXCI6e1widW5pZmllZFwiOlwiMUY0NjgtMUYzRkVcIixcImltYWdlXCI6XCIxZjQ2OC0xZjNmZS5wbmdcIixcInNoZWV0X3hcIjoxNixcInNoZWV0X3lcIjoyNCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ2OC0xRjNGRlwiOntcInVuaWZpZWRcIjpcIjFGNDY4LTFGM0ZGXCIsXCJpbWFnZVwiOlwiMWY0NjgtMWYzZmYucG5nXCIsXCJzaGVldF94XCI6MTYsXCJzaGVldF95XCI6MjUsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJtdXN0YWNoZVwiLFwiZmF0aGVyXCIsXCJkYWRcIixcImd1eVwiLFwiY2xhc3N5XCIsXCJzaXJcIixcIm1vdXN0YWNoZVwiXSxcInNlYXJjaFwiOlwibWFuLG11c3RhY2hlLGZhdGhlcixkYWQsZ3V5LGNsYXNzeSxzaXIsbW91c3RhY2hlXCJ9LFwicHV0X2xpdHRlcl9pbl9pdHNfcGxhY2VcIjp7XCJuYW1lXCI6XCJQdXQgTGl0dGVyIGluIEl0cyBQbGFjZSBTeW1ib2xcIixcInVuaWZpZWRcIjpcIjFGNkFFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzAsXCJzaGVldF95XCI6MjIsXCJzaG9ydF9uYW1lc1wiOltcInB1dF9saXR0ZXJfaW5faXRzX3BsYWNlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYmx1ZS1zcXVhcmVcIixcInNpZ25cIixcImh1bWFuXCIsXCJpbmZvXCJdLFwic2VhcmNoXCI6XCJwdXQsbGl0dGVyLGluLGl0cyxwbGFjZSxzeW1ib2wsYmx1ZS1zcXVhcmUsc2lnbixodW1hbixpbmZvXCJ9LFwibW9zdGx5X3N1bm55XCI6e1wibmFtZVwiOlwiV2hpdGUgU3VuIHdpdGggU21hbGwgQ2xvdWRcIixcInVuaWZpZWRcIjpcIjFGMzI0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NixcInNoZWV0X3lcIjoxNCxcInNob3J0X25hbWVzXCI6W1wibW9zdGx5X3N1bm55XCIsXCJzdW5fc21hbGxfY2xvdWRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwibW9zdGx5LHN1bm55LHN1bixzbWFsbCxjbG91ZCx3aGl0ZSx3aXRoXCJ9LFwiZmxhZy1sc1wiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBMU1wiLFwidW5pZmllZFwiOlwiMUYxRjEtMUYxRjhcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNixcInNoZWV0X3lcIjo2LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWxzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsbHMscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwib3V0Ym94X3RyYXlcIjp7XCJuYW1lXCI6XCJPdXRib3ggVHJheVwiLFwidW5pZmllZFwiOlwiMUY0RTRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMSxcInNoZWV0X3lcIjozOSxcInNob3J0X25hbWVzXCI6W1wib3V0Ym94X3RyYXlcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJpbmJveFwiLFwiZW1haWxcIl0sXCJzZWFyY2hcIjpcIm91dGJveCx0cmF5LGluYm94LGVtYWlsXCJ9LFwiY2luZW1hXCI6e1wibmFtZVwiOlwiQ2luZW1hXCIsXCJ1bmlmaWVkXCI6XCIxRjNBNlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjksXCJzaGVldF95XCI6MjEsXCJzaG9ydF9uYW1lc1wiOltcImNpbmVtYVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJsdWUtc3F1YXJlXCIsXCJyZWNvcmRcIixcImZpbG1cIixcIm1vdmllXCIsXCJjdXJ0YWluXCIsXCJzdGFnZVwiLFwidGhlYXRlclwiXSxcInNlYXJjaFwiOlwiY2luZW1hLGJsdWUtc3F1YXJlLHJlY29yZCxmaWxtLG1vdmllLGN1cnRhaW4sc3RhZ2UsdGhlYXRlclwifSxcImZsYWctbHJcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgTFJcIixcInVuaWZpZWRcIjpcIjFGMUYxLTFGMUY3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzYsXCJzaGVldF95XCI6NSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1sclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGxyLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcInNjcm9sbFwiOntcIm5hbWVcIjpcIlNjcm9sbFwiLFwidW5pZmllZFwiOlwiMUY0RENcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMSxcInNoZWV0X3lcIjozMSxcInNob3J0X25hbWVzXCI6W1wic2Nyb2xsXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZG9jdW1lbnRzXCIsXCJhbmNpZW50XCIsXCJoaXN0b3J5XCIsXCJwYXBlclwiXSxcInNlYXJjaFwiOlwic2Nyb2xsLGRvY3VtZW50cyxhbmNpZW50LGhpc3RvcnkscGFwZXJcIn0sXCJwYXJ0bHlfc3VubnlcIjp7XCJuYW1lXCI6XCJTdW4gQmVoaW5kIENsb3VkXCIsXCJ1bmlmaWVkXCI6XCIyNkM1XCIsXCJ2YXJpYXRpb25zXCI6W1wiMjZDNS1GRTBGXCJdLFwic2hlZXRfeFwiOjIsXCJzaGVldF95XCI6MjEsXCJzaG9ydF9uYW1lc1wiOltcInBhcnRseV9zdW5ueVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIndlYXRoZXJcIixcIm5hdHVyZVwiLFwiY2xvdWR5XCIsXCJtb3JuaW5nXCIsXCJmYWxsXCIsXCJzcHJpbmdcIl0sXCJzZWFyY2hcIjpcInBhcnRseSxzdW5ueSxzdW4sYmVoaW5kLGNsb3VkLHdlYXRoZXIsbmF0dXJlLGNsb3VkeSxtb3JuaW5nLGZhbGwsc3ByaW5nXCJ9LFwid29tYW5cIjp7XCJuYW1lXCI6XCJXb21hblwiLFwidW5pZmllZFwiOlwiMUY0NjlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxNixcInNoZWV0X3lcIjoyNixcInNob3J0X25hbWVzXCI6W1wid29tYW5cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcInNraW5fdmFyaWF0aW9uc1wiOntcIjFGNDY5LTFGM0ZCXCI6e1widW5pZmllZFwiOlwiMUY0NjktMUYzRkJcIixcImltYWdlXCI6XCIxZjQ2OS0xZjNmYi5wbmdcIixcInNoZWV0X3hcIjoxNixcInNoZWV0X3lcIjoyNyxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ2OS0xRjNGQ1wiOntcInVuaWZpZWRcIjpcIjFGNDY5LTFGM0ZDXCIsXCJpbWFnZVwiOlwiMWY0NjktMWYzZmMucG5nXCIsXCJzaGVldF94XCI6MTYsXCJzaGVldF95XCI6MjgsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NjktMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ2OS0xRjNGRFwiLFwiaW1hZ2VcIjpcIjFmNDY5LTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjE2LFwic2hlZXRfeVwiOjI5LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDY5LTFGM0ZFXCI6e1widW5pZmllZFwiOlwiMUY0NjktMUYzRkVcIixcImltYWdlXCI6XCIxZjQ2OS0xZjNmZS5wbmdcIixcInNoZWV0X3hcIjoxNixcInNoZWV0X3lcIjozMCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ2OS0xRjNGRlwiOntcInVuaWZpZWRcIjpcIjFGNDY5LTFGM0ZGXCIsXCJpbWFnZVwiOlwiMWY0NjktMWYzZmYucG5nXCIsXCJzaGVldF94XCI6MTYsXCJzaGVldF95XCI6MzEsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmZW1hbGVcIixcImdpcmxzXCIsXCJsYWR5XCJdLFwic2VhcmNoXCI6XCJ3b21hbixmZW1hbGUsZ2lybHMsbGFkeVwifSxcInNpZ25hbF9zdHJlbmd0aFwiOntcIm5hbWVcIjpcIkFudGVubmEgd2l0aCBCYXJzXCIsXCJ1bmlmaWVkXCI6XCIxRjRGNlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIyLFwic2hlZXRfeVwiOjE2LFwic2hvcnRfbmFtZXNcIjpbXCJzaWduYWxfc3RyZW5ndGhcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJibHVlLXNxdWFyZVwiLFwicmVjZXB0aW9uXCIsXCJwaG9uZVwiLFwiaW50ZXJuZXRcIixcImNvbm5lY3Rpb25cIixcIndpZmlcIixcImJsdWV0b290aFwiLFwiYmFyc1wiXSxcInNlYXJjaFwiOlwic2lnbmFsLHN0cmVuZ3RoLGFudGVubmEsd2l0aCxiYXJzLGJsdWUtc3F1YXJlLHJlY2VwdGlvbixwaG9uZSxpbnRlcm5ldCxjb25uZWN0aW9uLHdpZmksYmx1ZXRvb3RoXCJ9LFwicGVyc29uX3dpdGhfYmxvbmRfaGFpclwiOntcIm5hbWVcIjpcIlBlcnNvbiB3aXRoIEJsb25kIEhhaXJcIixcInVuaWZpZWRcIjpcIjFGNDcxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTcsXCJzaGVldF95XCI6OCxcInNob3J0X25hbWVzXCI6W1wicGVyc29uX3dpdGhfYmxvbmRfaGFpclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUY0NzEtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ3MS0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmNDcxLTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjE3LFwic2hlZXRfeVwiOjksXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NzEtMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ3MS0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmNDcxLTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjE3LFwic2hlZXRfeVwiOjEwLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDcxLTFGM0ZEXCI6e1widW5pZmllZFwiOlwiMUY0NzEtMUYzRkRcIixcImltYWdlXCI6XCIxZjQ3MS0xZjNmZC5wbmdcIixcInNoZWV0X3hcIjoxNyxcInNoZWV0X3lcIjoxMSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ3MS0xRjNGRVwiOntcInVuaWZpZWRcIjpcIjFGNDcxLTFGM0ZFXCIsXCJpbWFnZVwiOlwiMWY0NzEtMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MTcsXCJzaGVldF95XCI6MTIsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NzEtMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ3MS0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmNDcxLTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjE3LFwic2hlZXRfeVwiOjEzLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfX0sXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibWFuXCIsXCJtYWxlXCIsXCJib3lcIixcImJsb25kZVwiLFwiZ3V5XCJdLFwic2VhcmNoXCI6XCJwZXJzb24sd2l0aCxibG9uZCxoYWlyLG1hbixtYWxlLGJveSxibG9uZGUsZ3V5XCJ9LFwiYmFyZWx5X3N1bm55XCI6e1wibmFtZVwiOlwiV2hpdGUgU3VuIEJlaGluZCBDbG91ZFwiLFwidW5pZmllZFwiOlwiMUYzMjVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo2LFwic2hlZXRfeVwiOjE1LFwic2hvcnRfbmFtZXNcIjpbXCJiYXJlbHlfc3VubnlcIixcInN1bl9iZWhpbmRfY2xvdWRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiYmFyZWx5LHN1bm55LHN1bixiZWhpbmQsY2xvdWQsd2hpdGVcIn0sXCJwYWdlX3dpdGhfY3VybFwiOntcIm5hbWVcIjpcIlBhZ2Ugd2l0aCBDdXJsXCIsXCJ1bmlmaWVkXCI6XCIxRjRDM1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIxLFwic2hlZXRfeVwiOjYsXCJzaG9ydF9uYW1lc1wiOltcInBhZ2Vfd2l0aF9jdXJsXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZG9jdW1lbnRzXCIsXCJvZmZpY2VcIixcInBhcGVyXCJdLFwic2VhcmNoXCI6XCJwYWdlLHdpdGgsY3VybCxkb2N1bWVudHMsb2ZmaWNlLHBhcGVyXCJ9LFwiZmxhZy1seVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBMWVwiLFwidW5pZmllZFwiOlwiMUYxRjEtMUYxRkVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNixcInNoZWV0X3lcIjoxMCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1seVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGx5LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImJvb2ttYXJrX3RhYnNcIjp7XCJuYW1lXCI6XCJCb29rbWFyayBUYWJzXCIsXCJ1bmlmaWVkXCI6XCIxRjREMVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIxLFwic2hlZXRfeVwiOjIwLFwic2hvcnRfbmFtZXNcIjpbXCJib29rbWFya190YWJzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmF2b3JpdGVcIixcInNhdmVcIixcIm9yZGVyXCIsXCJ0aWR5XCJdLFwic2VhcmNoXCI6XCJib29rbWFyayx0YWJzLGZhdm9yaXRlLHNhdmUsb3JkZXIsdGlkeVwifSxcImZsYWctbGlcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgTElcIixcInVuaWZpZWRcIjpcIjFGMUYxLTFGMUVFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzYsXCJzaGVldF95XCI6MyxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1saVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGxpLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcIm9sZGVyX21hblwiOntcIm5hbWVcIjpcIk9sZGVyIE1hblwiLFwidW5pZmllZFwiOlwiMUY0NzRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxNyxcInNoZWV0X3lcIjoyNixcInNob3J0X25hbWVzXCI6W1wib2xkZXJfbWFuXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJza2luX3ZhcmlhdGlvbnNcIjp7XCIxRjQ3NC0xRjNGQlwiOntcInVuaWZpZWRcIjpcIjFGNDc0LTFGM0ZCXCIsXCJpbWFnZVwiOlwiMWY0NzQtMWYzZmIucG5nXCIsXCJzaGVldF94XCI6MTcsXCJzaGVldF95XCI6MjcsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NzQtMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ3NC0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmNDc0LTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjE3LFwic2hlZXRfeVwiOjI4LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDc0LTFGM0ZEXCI6e1widW5pZmllZFwiOlwiMUY0NzQtMUYzRkRcIixcImltYWdlXCI6XCIxZjQ3NC0xZjNmZC5wbmdcIixcInNoZWV0X3hcIjoxNyxcInNoZWV0X3lcIjoyOSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ3NC0xRjNGRVwiOntcInVuaWZpZWRcIjpcIjFGNDc0LTFGM0ZFXCIsXCJpbWFnZVwiOlwiMWY0NzQtMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MTcsXCJzaGVldF95XCI6MzAsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NzQtMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ3NC0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmNDc0LTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjE3LFwic2hlZXRfeVwiOjMxLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfX0sXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiaHVtYW5cIixcIm1hbGVcIixcIm1lblwiXSxcInNlYXJjaFwiOlwib2xkZXIsbWFuLGh1bWFuLG1hbGUsbWVuXCJ9LFwicGFydGx5X3N1bm55X3JhaW5cIjp7XCJuYW1lXCI6XCJXaGl0ZSBTdW4gQmVoaW5kIENsb3VkIHdpdGggUmFpblwiLFwidW5pZmllZFwiOlwiMUYzMjZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo2LFwic2hlZXRfeVwiOjE2LFwic2hvcnRfbmFtZXNcIjpbXCJwYXJ0bHlfc3VubnlfcmFpblwiLFwic3VuX2JlaGluZF9yYWluX2Nsb3VkXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcInBhcnRseSxzdW5ueSxyYWluLHN1bixiZWhpbmQsY2xvdWQsd2hpdGUsd2l0aFwifSxcImtva29cIjp7XCJuYW1lXCI6XCJTcXVhcmVkIEthdGFrYW5hIEtva29cIixcInVuaWZpZWRcIjpcIjFGMjAxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NSxcInNoZWV0X3lcIjo2LFwic2hvcnRfbmFtZXNcIjpbXCJrb2tvXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYmx1ZS1zcXVhcmVcIixcImhlcmVcIixcImthdGFrYW5hXCIsXCJqYXBhbmVzZVwiLFwiZGVzdGluYXRpb25cIl0sXCJzZWFyY2hcIjpcImtva28sc3F1YXJlZCxrYXRha2FuYSxibHVlLXNxdWFyZSxoZXJlLGphcGFuZXNlLGRlc3RpbmF0aW9uXCJ9LFwiYmFyX2NoYXJ0XCI6e1wibmFtZVwiOlwiQmFyIENoYXJ0XCIsXCJ1bmlmaWVkXCI6XCIxRjRDQVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIxLFwic2hlZXRfeVwiOjEzLFwic2hvcnRfbmFtZXNcIjpbXCJiYXJfY2hhcnRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJncmFwaFwiLFwicHJlc2VudGF0aW9uXCIsXCJzdGF0c1wiXSxcInNlYXJjaFwiOlwiYmFyLGNoYXJ0LGdyYXBoLHByZXNlbnRhdGlvbixzdGF0c1wifSxcImNsb3VkXCI6e1wibmFtZVwiOlwiQ2xvdWRcIixcInVuaWZpZWRcIjpcIjI2MDFcIixcInZhcmlhdGlvbnNcIjpbXCIyNjAxLUZFMEZcIl0sXCJzaGVldF94XCI6MSxcInNoZWV0X3lcIjoxLFwic2hvcnRfbmFtZXNcIjpbXCJjbG91ZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIndlYXRoZXJcIixcInNreVwiXSxcInNlYXJjaFwiOlwiY2xvdWQsd2VhdGhlcixza3lcIn0sXCJuZ1wiOntcIm5hbWVcIjpcIlNxdWFyZWQgTmdcIixcInVuaWZpZWRcIjpcIjFGMTk2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NSxcInNoZWV0X3lcIjoxLFwic2hvcnRfbmFtZXNcIjpbXCJuZ1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJsdWUtc3F1YXJlXCIsXCJ3b3Jkc1wiLFwic2hhcGVcIixcImljb25cIl0sXCJzZWFyY2hcIjpcIm5nLHNxdWFyZWQsYmx1ZS1zcXVhcmUsd29yZHMsc2hhcGUsaWNvblwifSxcImZsYWctbHRcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgTFRcIixcInVuaWZpZWRcIjpcIjFGMUYxLTFGMUY5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzYsXCJzaGVldF95XCI6NyxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1sdFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGx0LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcIm9sZGVyX3dvbWFuXCI6e1wibmFtZVwiOlwiT2xkZXIgV29tYW5cIixcInVuaWZpZWRcIjpcIjFGNDc1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTcsXCJzaGVldF95XCI6MzIsXCJzaG9ydF9uYW1lc1wiOltcIm9sZGVyX3dvbWFuXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJza2luX3ZhcmlhdGlvbnNcIjp7XCIxRjQ3NS0xRjNGQlwiOntcInVuaWZpZWRcIjpcIjFGNDc1LTFGM0ZCXCIsXCJpbWFnZVwiOlwiMWY0NzUtMWYzZmIucG5nXCIsXCJzaGVldF94XCI6MTcsXCJzaGVldF95XCI6MzMsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NzUtMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ3NS0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmNDc1LTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjE3LFwic2hlZXRfeVwiOjM0LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDc1LTFGM0ZEXCI6e1widW5pZmllZFwiOlwiMUY0NzUtMUYzRkRcIixcImltYWdlXCI6XCIxZjQ3NS0xZjNmZC5wbmdcIixcInNoZWV0X3hcIjoxNyxcInNoZWV0X3lcIjozNSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ3NS0xRjNGRVwiOntcInVuaWZpZWRcIjpcIjFGNDc1LTFGM0ZFXCIsXCJpbWFnZVwiOlwiMWY0NzUtMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MTcsXCJzaGVldF95XCI6MzYsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NzUtMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ3NS0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmNDc1LTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjE3LFwic2hlZXRfeVwiOjM3LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfX0sXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmVtYWxlXCIsXCJ3b21lblwiLFwiZ2lybFwiLFwibGFkeVwiXSxcInNlYXJjaFwiOlwib2xkZXIsd29tYW4sZmVtYWxlLHdvbWVuLGdpcmwsbGFkeVwifSxcInJhaW5fY2xvdWRcIjp7XCJuYW1lXCI6XCJDbG91ZCB3aXRoIFJhaW5cIixcInVuaWZpZWRcIjpcIjFGMzI3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NixcInNoZWV0X3lcIjoxNyxcInNob3J0X25hbWVzXCI6W1wicmFpbl9jbG91ZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJyYWluLGNsb3VkLHdpdGhcIn0sXCJmbGFnLWx1XCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIExVXCIsXCJ1bmlmaWVkXCI6XCIxRjFGMS0xRjFGQVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM2LFwic2hlZXRfeVwiOjgsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctbHVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxsdSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJjaGFydF93aXRoX3Vwd2FyZHNfdHJlbmRcIjp7XCJuYW1lXCI6XCJDaGFydCB3aXRoIFVwd2FyZHMgVHJlbmRcIixcInVuaWZpZWRcIjpcIjFGNEM4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjEsXCJzaGVldF95XCI6MTEsXCJzaG9ydF9uYW1lc1wiOltcImNoYXJ0X3dpdGhfdXB3YXJkc190cmVuZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImdyYXBoXCIsXCJwcmVzZW50YXRpb25cIixcInN0YXRzXCIsXCJyZWNvdmVyeVwiLFwiYnVzaW5lc3NcIixcImVjb25vbWljc1wiLFwibW9uZXlcIixcInNhbGVzXCIsXCJnb29kXCIsXCJzdWNjZXNzXCJdLFwic2VhcmNoXCI6XCJjaGFydCx3aXRoLHVwd2FyZHMsdHJlbmQsZ3JhcGgscHJlc2VudGF0aW9uLHN0YXRzLHJlY292ZXJ5LGJ1c2luZXNzLGVjb25vbWljcyxtb25leSxzYWxlcyxnb29kLHN1Y2Nlc3NcIn0sXCJva1wiOntcIm5hbWVcIjpcIlNxdWFyZWQgT2tcIixcInVuaWZpZWRcIjpcIjFGMTk3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NSxcInNoZWV0X3lcIjoyLFwic2hvcnRfbmFtZXNcIjpbXCJva1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImdvb2RcIixcImFncmVlXCIsXCJ5ZXNcIixcImJsdWUtc3F1YXJlXCJdLFwic2VhcmNoXCI6XCJvayxzcXVhcmVkLGdvb2QsYWdyZWUseWVzLGJsdWUtc3F1YXJlXCJ9LFwibWFuX3dpdGhfZ3VhX3BpX21hb1wiOntcIm5hbWVcIjpcIk1hbiB3aXRoIEd1YSBQaSBNYW9cIixcInVuaWZpZWRcIjpcIjFGNDcyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTcsXCJzaGVldF95XCI6MTQsXCJzaG9ydF9uYW1lc1wiOltcIm1hbl93aXRoX2d1YV9waV9tYW9cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcInNraW5fdmFyaWF0aW9uc1wiOntcIjFGNDcyLTFGM0ZCXCI6e1widW5pZmllZFwiOlwiMUY0NzItMUYzRkJcIixcImltYWdlXCI6XCIxZjQ3Mi0xZjNmYi5wbmdcIixcInNoZWV0X3hcIjoxNyxcInNoZWV0X3lcIjoxNSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ3Mi0xRjNGQ1wiOntcInVuaWZpZWRcIjpcIjFGNDcyLTFGM0ZDXCIsXCJpbWFnZVwiOlwiMWY0NzItMWYzZmMucG5nXCIsXCJzaGVldF94XCI6MTcsXCJzaGVldF95XCI6MTYsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NzItMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ3Mi0xRjNGRFwiLFwiaW1hZ2VcIjpcIjFmNDcyLTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjE3LFwic2hlZXRfeVwiOjE3LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDcyLTFGM0ZFXCI6e1widW5pZmllZFwiOlwiMUY0NzItMUYzRkVcIixcImltYWdlXCI6XCIxZjQ3Mi0xZjNmZS5wbmdcIixcInNoZWV0X3hcIjoxNyxcInNoZWV0X3lcIjoxOCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ3Mi0xRjNGRlwiOntcInVuaWZpZWRcIjpcIjFGNDcyLTFGM0ZGXCIsXCJpbWFnZVwiOlwiMWY0NzItMWYzZmYucG5nXCIsXCJzaGVldF94XCI6MTcsXCJzaGVldF95XCI6MTksXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJtYWxlXCIsXCJib3lcIl0sXCJzZWFyY2hcIjpcIm1hbix3aXRoLGd1YSxwaSxtYW8sbWFsZSxib3lcIn0sXCJ0aHVuZGVyX2Nsb3VkX2FuZF9yYWluXCI6e1wibmFtZVwiOlwiVGh1bmRlciBDbG91ZCBhbmQgUmFpblwiLFwidW5pZmllZFwiOlwiMjZDOFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIsXCJzaGVldF95XCI6MjIsXCJzaG9ydF9uYW1lc1wiOltcInRodW5kZXJfY2xvdWRfYW5kX3JhaW5cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ3ZWF0aGVyXCIsXCJsaWdodG5pbmdcIl0sXCJzZWFyY2hcIjpcInRodW5kZXIsY2xvdWQsYW5kLHJhaW4sd2VhdGhlcixsaWdodG5pbmdcIn0sXCJ1cFwiOntcIm5hbWVcIjpcIlNxdWFyZWQgVXAgd2l0aCBFeGNsYW1hdGlvbiBNYXJrXCIsXCJ1bmlmaWVkXCI6XCIxRjE5OVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjUsXCJzaGVldF95XCI6NCxcInNob3J0X25hbWVzXCI6W1widXBcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJibHVlLXNxdWFyZVwiLFwiYWJvdmVcIixcImhpZ2hcIl0sXCJzZWFyY2hcIjpcInVwLHNxdWFyZWQsd2l0aCxleGNsYW1hdGlvbixtYXJrLGJsdWUtc3F1YXJlLGFib3ZlLGhpZ2hcIn0sXCJtYW5fd2l0aF90dXJiYW5cIjp7XCJuYW1lXCI6XCJNYW4gd2l0aCBUdXJiYW5cIixcInVuaWZpZWRcIjpcIjFGNDczXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTcsXCJzaGVldF95XCI6MjAsXCJzaG9ydF9uYW1lc1wiOltcIm1hbl93aXRoX3R1cmJhblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUY0NzMtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ3My0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmNDczLTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjE3LFwic2hlZXRfeVwiOjIxLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDczLTFGM0ZDXCI6e1widW5pZmllZFwiOlwiMUY0NzMtMUYzRkNcIixcImltYWdlXCI6XCIxZjQ3My0xZjNmYy5wbmdcIixcInNoZWV0X3hcIjoxNyxcInNoZWV0X3lcIjoyMixcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ3My0xRjNGRFwiOntcInVuaWZpZWRcIjpcIjFGNDczLTFGM0ZEXCIsXCJpbWFnZVwiOlwiMWY0NzMtMWYzZmQucG5nXCIsXCJzaGVldF94XCI6MTcsXCJzaGVldF95XCI6MjMsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NzMtMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ3My0xRjNGRVwiLFwiaW1hZ2VcIjpcIjFmNDczLTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjE3LFwic2hlZXRfeVwiOjI0LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDczLTFGM0ZGXCI6e1widW5pZmllZFwiOlwiMUY0NzMtMUYzRkZcIixcImltYWdlXCI6XCIxZjQ3My0xZjNmZi5wbmdcIixcInNoZWV0X3hcIjoxNyxcInNoZWV0X3lcIjoyNSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX19LFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm1hbGVcIixcImluZGlhblwiLFwiaGluZHVpc21cIixcImFyYWJzXCJdLFwic2VhcmNoXCI6XCJtYW4sd2l0aCx0dXJiYW4sbWFsZSxpbmRpYW4saGluZHVpc20sYXJhYnNcIn0sXCJjaGFydF93aXRoX2Rvd253YXJkc190cmVuZFwiOntcIm5hbWVcIjpcIkNoYXJ0IHdpdGggRG93bndhcmRzIFRyZW5kXCIsXCJ1bmlmaWVkXCI6XCIxRjRDOVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIxLFwic2hlZXRfeVwiOjEyLFwic2hvcnRfbmFtZXNcIjpbXCJjaGFydF93aXRoX2Rvd253YXJkc190cmVuZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImdyYXBoXCIsXCJwcmVzZW50YXRpb25cIixcInN0YXRzXCIsXCJyZWNlc3Npb25cIixcImJ1c2luZXNzXCIsXCJlY29ub21pY3NcIixcIm1vbmV5XCIsXCJzYWxlc1wiLFwiYmFkXCIsXCJmYWlsdXJlXCJdLFwic2VhcmNoXCI6XCJjaGFydCx3aXRoLGRvd253YXJkcyx0cmVuZCxncmFwaCxwcmVzZW50YXRpb24sc3RhdHMscmVjZXNzaW9uLGJ1c2luZXNzLGVjb25vbWljcyxtb25leSxzYWxlcyxiYWQsZmFpbHVyZVwifSxcImZsYWctbW9cIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgTU9cIixcInVuaWZpZWRcIjpcIjFGMUYyLTFGMUY0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzYsXCJzaGVldF95XCI6MjIsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctbW9cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxtbyxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJwYWdlX2ZhY2luZ191cFwiOntcIm5hbWVcIjpcIlBhZ2UgRmFjaW5nIFVwXCIsXCJ1bmlmaWVkXCI6XCIxRjRDNFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIxLFwic2hlZXRfeVwiOjcsXCJzaG9ydF9uYW1lc1wiOltcInBhZ2VfZmFjaW5nX3VwXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZG9jdW1lbnRzXCIsXCJvZmZpY2VcIixcInBhcGVyXCIsXCJpbmZvcm1hdGlvblwiXSxcInNlYXJjaFwiOlwicGFnZSxmYWNpbmcsdXAsZG9jdW1lbnRzLG9mZmljZSxwYXBlcixpbmZvcm1hdGlvblwifSxcImNvb2xcIjp7XCJuYW1lXCI6XCJTcXVhcmVkIENvb2xcIixcInVuaWZpZWRcIjpcIjFGMTkyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NCxcInNoZWV0X3lcIjozOCxcInNob3J0X25hbWVzXCI6W1wiY29vbFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIndvcmRzXCIsXCJibHVlLXNxdWFyZVwiXSxcInNlYXJjaFwiOlwiY29vbCxzcXVhcmVkLHdvcmRzLGJsdWUtc3F1YXJlXCJ9LFwibGlnaHRuaW5nXCI6e1wibmFtZVwiOlwiQ2xvdWQgd2l0aCBMaWdodG5pbmdcIixcInVuaWZpZWRcIjpcIjFGMzI5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NixcInNoZWV0X3lcIjoxOSxcInNob3J0X25hbWVzXCI6W1wibGlnaHRuaW5nXCIsXCJsaWdodG5pbmdfY2xvdWRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwibGlnaHRuaW5nLGNsb3VkLHdpdGhcIn0sXCJmbGFnLW1rXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIE1LXCIsXCJ1bmlmaWVkXCI6XCIxRjFGMi0xRjFGMFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM2LFwic2hlZXRfeVwiOjE4LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLW1rXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsbWsscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiY29wXCI6e1wibmFtZVwiOlwiUG9saWNlIE9mZmljZXJcIixcInVuaWZpZWRcIjpcIjFGNDZFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTYsXCJzaGVldF95XCI6MzYsXCJzaG9ydF9uYW1lc1wiOltcImNvcFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUY0NkUtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ2RS0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmNDZlLTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjE2LFwic2hlZXRfeVwiOjM3LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDZFLTFGM0ZDXCI6e1widW5pZmllZFwiOlwiMUY0NkUtMUYzRkNcIixcImltYWdlXCI6XCIxZjQ2ZS0xZjNmYy5wbmdcIixcInNoZWV0X3hcIjoxNixcInNoZWV0X3lcIjozOCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ2RS0xRjNGRFwiOntcInVuaWZpZWRcIjpcIjFGNDZFLTFGM0ZEXCIsXCJpbWFnZVwiOlwiMWY0NmUtMWYzZmQucG5nXCIsXCJzaGVldF94XCI6MTYsXCJzaGVldF95XCI6MzksXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NkUtMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ2RS0xRjNGRVwiLFwiaW1hZ2VcIjpcIjFmNDZlLTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjE2LFwic2hlZXRfeVwiOjQwLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDZFLTFGM0ZGXCI6e1widW5pZmllZFwiOlwiMUY0NkUtMUYzRkZcIixcImltYWdlXCI6XCIxZjQ2ZS0xZjNmZi5wbmdcIixcInNoZWV0X3hcIjoxNyxcInNoZWV0X3lcIjowLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfX0sXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibWFuXCIsXCJwb2xpY2VcIixcImxhd1wiLFwibGVnYWxcIixcImVuZm9yY2VtZW50XCIsXCJhcnJlc3RcIixcIjkxMVwiXSxcInNlYXJjaFwiOlwiY29wLHBvbGljZSxvZmZpY2VyLG1hbixsYXcsbGVnYWwsZW5mb3JjZW1lbnQsYXJyZXN0LDkxMVwifSxcImZsYWctbWdcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgTUdcIixcInVuaWZpZWRcIjpcIjFGMUYyLTFGMUVDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzYsXCJzaGVldF95XCI6MTYsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctbWdcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxtZyxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJkYXRlXCI6e1wibmFtZVwiOlwiQ2FsZW5kYXJcIixcInVuaWZpZWRcIjpcIjFGNEM1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjEsXCJzaGVldF95XCI6OCxcInNob3J0X25hbWVzXCI6W1wiZGF0ZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImNhbGVuZGFyXCIsXCJzY2hlZHVsZVwiXSxcInNlYXJjaFwiOlwiZGF0ZSxjYWxlbmRhcixzY2hlZHVsZVwifSxcIm5ld1wiOntcIm5hbWVcIjpcIlNxdWFyZWQgTmV3XCIsXCJ1bmlmaWVkXCI6XCIxRjE5NVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjUsXCJzaGVldF95XCI6MCxcInNob3J0X25hbWVzXCI6W1wibmV3XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYmx1ZS1zcXVhcmVcIixcIndvcmRzXCIsXCJzdGFydFwiXSxcInNlYXJjaFwiOlwibmV3LHNxdWFyZWQsYmx1ZS1zcXVhcmUsd29yZHMsc3RhcnRcIn0sXCJ6YXBcIjp7XCJuYW1lXCI6XCJIaWdoIFZvbHRhZ2UgU2lnblwiLFwidW5pZmllZFwiOlwiMjZBMVwiLFwidmFyaWF0aW9uc1wiOltcIjI2QTEtRkUwRlwiXSxcInNoZWV0X3hcIjoyLFwic2hlZXRfeVwiOjEzLFwic2hvcnRfbmFtZXNcIjpbXCJ6YXBcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ0aHVuZGVyXCIsXCJ3ZWF0aGVyXCIsXCJsaWdodG5pbmcgYm9sdFwiLFwiZmFzdFwiXSxcInNlYXJjaFwiOlwiemFwLGhpZ2gsdm9sdGFnZSxzaWduLHRodW5kZXIsd2VhdGhlcixsaWdodG5pbmcgYm9sdCxmYXN0XCJ9LFwiY29uc3RydWN0aW9uX3dvcmtlclwiOntcIm5hbWVcIjpcIkNvbnN0cnVjdGlvbiBXb3JrZXJcIixcInVuaWZpZWRcIjpcIjFGNDc3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTgsXCJzaGVldF95XCI6MyxcInNob3J0X25hbWVzXCI6W1wiY29uc3RydWN0aW9uX3dvcmtlclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUY0NzctMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ3Ny0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmNDc3LTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjE4LFwic2hlZXRfeVwiOjQsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NzctMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ3Ny0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmNDc3LTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjE4LFwic2hlZXRfeVwiOjUsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NzctMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ3Ny0xRjNGRFwiLFwiaW1hZ2VcIjpcIjFmNDc3LTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjE4LFwic2hlZXRfeVwiOjYsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NzctMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ3Ny0xRjNGRVwiLFwiaW1hZ2VcIjpcIjFmNDc3LTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjE4LFwic2hlZXRfeVwiOjcsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NzctMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ3Ny0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmNDc3LTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjE4LFwic2hlZXRfeVwiOjgsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJtYWxlXCIsXCJodW1hblwiLFwid2lwXCIsXCJndXlcIixcImJ1aWxkXCJdLFwic2VhcmNoXCI6XCJjb25zdHJ1Y3Rpb24sd29ya2VyLG1hbGUsaHVtYW4sd2lwLGd1eSxidWlsZFwifSxcImd1YXJkc21hblwiOntcIm5hbWVcIjpcIkd1YXJkc21hblwiLFwidW5pZmllZFwiOlwiMUY0ODJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxOCxcInNoZWV0X3lcIjozNCxcInNob3J0X25hbWVzXCI6W1wiZ3VhcmRzbWFuXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJza2luX3ZhcmlhdGlvbnNcIjp7XCIxRjQ4Mi0xRjNGQlwiOntcInVuaWZpZWRcIjpcIjFGNDgyLTFGM0ZCXCIsXCJpbWFnZVwiOlwiMWY0ODItMWYzZmIucG5nXCIsXCJzaGVldF94XCI6MTgsXCJzaGVldF95XCI6MzUsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0ODItMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ4Mi0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmNDgyLTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjE4LFwic2hlZXRfeVwiOjM2LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDgyLTFGM0ZEXCI6e1widW5pZmllZFwiOlwiMUY0ODItMUYzRkRcIixcImltYWdlXCI6XCIxZjQ4Mi0xZjNmZC5wbmdcIixcInNoZWV0X3hcIjoxOCxcInNoZWV0X3lcIjozNyxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ4Mi0xRjNGRVwiOntcInVuaWZpZWRcIjpcIjFGNDgyLTFGM0ZFXCIsXCJpbWFnZVwiOlwiMWY0ODItMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MTgsXCJzaGVldF95XCI6MzgsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0ODItMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ4Mi0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmNDgyLTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjE4LFwic2hlZXRfeVwiOjM5LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfX0sXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widWtcIixcImdiXCIsXCJicml0aXNoXCIsXCJtYWxlXCIsXCJndXlcIixcInJveWFsXCJdLFwic2VhcmNoXCI6XCJndWFyZHNtYW4sdWssZ2IsYnJpdGlzaCxtYWxlLGd1eSxyb3lhbFwifSxcImZpcmVcIjp7XCJuYW1lXCI6XCJGaXJlXCIsXCJ1bmlmaWVkXCI6XCIxRjUyNVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIzLFwic2hlZXRfeVwiOjIxLFwic2hvcnRfbmFtZXNcIjpbXCJmaXJlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiaG90XCIsXCJjb29rXCIsXCJmbGFtZVwiXSxcInNlYXJjaFwiOlwiZmlyZSxob3QsY29vayxmbGFtZVwifSxcImZyZWVcIjp7XCJuYW1lXCI6XCJTcXVhcmVkIEZyZWVcIixcInVuaWZpZWRcIjpcIjFGMTkzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NCxcInNoZWV0X3lcIjozOSxcInNob3J0X25hbWVzXCI6W1wiZnJlZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJsdWUtc3F1YXJlXCIsXCJ3b3Jkc1wiXSxcInNlYXJjaFwiOlwiZnJlZSxzcXVhcmVkLGJsdWUtc3F1YXJlLHdvcmRzXCJ9LFwiZmxhZy1td1wiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBNV1wiLFwidW5pZmllZFwiOlwiMUYxRjItMUYxRkNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNixcInNoZWV0X3lcIjozMCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1td1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLG13LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImNhbGVuZGFyXCI6e1wibmFtZVwiOlwiVGVhci1vZmYgQ2FsZW5kYXJcIixcInVuaWZpZWRcIjpcIjFGNEM2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjEsXCJzaGVldF95XCI6OSxcInNob3J0X25hbWVzXCI6W1wiY2FsZW5kYXJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzY2hlZHVsZVwiLFwiZGF0ZVwiLFwicGxhbm5pbmdcIl0sXCJzZWFyY2hcIjpcImNhbGVuZGFyLHRlYXIsb2ZmLHNjaGVkdWxlLGRhdGUscGxhbm5pbmdcIn0sXCJzcGlyYWxfY2FsZW5kYXJfcGFkXCI6e1wibmFtZVwiOlwiU3BpcmFsIENhbGVuZGFyIFBhZFwiLFwidW5pZmllZFwiOlwiMUY1RDNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNixcInNoZWV0X3lcIjowLFwic2hvcnRfbmFtZXNcIjpbXCJzcGlyYWxfY2FsZW5kYXJfcGFkXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZGF0ZVwiLFwic2NoZWR1bGVcIixcInBsYW5uaW5nXCJdLFwic2VhcmNoXCI6XCJzcGlyYWwsY2FsZW5kYXIscGFkLGRhdGUsc2NoZWR1bGUscGxhbm5pbmdcIn0sXCJib29tXCI6e1wibmFtZVwiOlwiQ29sbGlzaW9uIFN5bWJvbFwiLFwidW5pZmllZFwiOlwiMUY0QTVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMCxcInNoZWV0X3lcIjoxMixcInNob3J0X25hbWVzXCI6W1wiYm9vbVwiLFwiY29sbGlzaW9uXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYm9tYlwiLFwiZXhwbG9kZVwiLFwiZXhwbG9zaW9uXCIsXCJjb2xsaXNpb25cIixcImJsb3duXCJdLFwic2VhcmNoXCI6XCJib29tLGNvbGxpc2lvbixzeW1ib2wsYm9tYixleHBsb2RlLGV4cGxvc2lvbixibG93blwifSxcImZsYWctbXlcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgTVlcIixcInVuaWZpZWRcIjpcIjFGMUYyLTFGMUZFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzYsXCJzaGVldF95XCI6MzIsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctbXlcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxteSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJ6ZXJvXCI6e1wibmFtZVwiOlwiS2V5Y2FwIDBcIixcInVuaWZpZWRcIjpcIjAwMzAtMjBFM1wiLFwidmFyaWF0aW9uc1wiOltcIjAwMzAtRkUwRi0yMEUzXCJdLFwic2hlZXRfeFwiOjMyLFwic2hlZXRfeVwiOjIzLFwic2hvcnRfbmFtZXNcIjpbXCJ6ZXJvXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiMFwiLFwibnVtYmVyc1wiLFwiYmx1ZS1zcXVhcmVcIixcIm51bGxcIl0sXCJzZWFyY2hcIjpcInplcm8sa2V5Y2FwLDAsbnVtYmVycyxibHVlLXNxdWFyZSxudWxsXCJ9LFwic2xldXRoX29yX3NweVwiOntcIm5hbWVcIjpcIlNsZXV0aCBvciBTcHlcIixcInVuaWZpZWRcIjpcIjFGNTc1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjQsXCJzaGVldF95XCI6MzksXCJzaG9ydF9uYW1lc1wiOltcInNsZXV0aF9vcl9zcHlcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcInNraW5fdmFyaWF0aW9uc1wiOntcIjFGNTc1LTFGM0ZCXCI6e1widW5pZmllZFwiOlwiMUY1NzUtMUYzRkJcIixcImltYWdlXCI6XCIxZjU3NS0xZjNmYi5wbmdcIixcInNoZWV0X3hcIjoyNCxcInNoZWV0X3lcIjo0MCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOmZhbHNlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY1NzUtMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjU3NS0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmNTc1LTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjI1LFwic2hlZXRfeVwiOjAsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjpmYWxzZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNTc1LTFGM0ZEXCI6e1widW5pZmllZFwiOlwiMUY1NzUtMUYzRkRcIixcImltYWdlXCI6XCIxZjU3NS0xZjNmZC5wbmdcIixcInNoZWV0X3hcIjoyNSxcInNoZWV0X3lcIjoxLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6ZmFsc2UsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjU3NS0xRjNGRVwiOntcInVuaWZpZWRcIjpcIjFGNTc1LTFGM0ZFXCIsXCJpbWFnZVwiOlwiMWY1NzUtMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MjUsXCJzaGVldF95XCI6MixcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOmZhbHNlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY1NzUtMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjU3NS0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmNTc1LTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjI1LFwic2hlZXRfeVwiOjMsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjpmYWxzZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfX0sXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcInNsZXV0aCxvcixzcHlcIn0sXCJvbmVcIjp7XCJuYW1lXCI6XCJLZXljYXAgMVwiLFwidW5pZmllZFwiOlwiMDAzMS0yMEUzXCIsXCJ2YXJpYXRpb25zXCI6W1wiMDAzMS1GRTBGLTIwRTNcIl0sXCJzaGVldF94XCI6MzIsXCJzaGVldF95XCI6MjQsXCJzaG9ydF9uYW1lc1wiOltcIm9uZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJsdWUtc3F1YXJlXCIsXCJudW1iZXJzXCIsXCIxXCJdLFwic2VhcmNoXCI6XCJvbmUsa2V5Y2FwLDEsYmx1ZS1zcXVhcmUsbnVtYmVyc1wifSxcInNhbnRhXCI6e1wibmFtZVwiOlwiRmF0aGVyIENocmlzdG1hc1wiLFwidW5pZmllZFwiOlwiMUYzODVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo4LFwic2hlZXRfeVwiOjI5LFwic2hvcnRfbmFtZXNcIjpbXCJzYW50YVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUYzODUtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjM4NS0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmMzg1LTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjgsXCJzaGVldF95XCI6MzAsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUYzODUtMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjM4NS0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmMzg1LTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjgsXCJzaGVldF95XCI6MzEsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUYzODUtMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIxRjM4NS0xRjNGRFwiLFwiaW1hZ2VcIjpcIjFmMzg1LTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjgsXCJzaGVldF95XCI6MzIsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUYzODUtMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIxRjM4NS0xRjNGRVwiLFwiaW1hZ2VcIjpcIjFmMzg1LTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjgsXCJzaGVldF95XCI6MzMsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUYzODUtMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjM4NS0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmMzg1LTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjgsXCJzaGVldF95XCI6MzQsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmZXN0aXZhbFwiLFwibWFuXCIsXCJtYWxlXCIsXCJ4bWFzXCIsXCJmYXRoZXIgY2hyaXN0bWFzXCJdLFwic2VhcmNoXCI6XCJzYW50YSxmYXRoZXIsY2hyaXN0bWFzLGZlc3RpdmFsLG1hbixtYWxlLHhtYXMsZmF0aGVyIGNocmlzdG1hc1wifSxcImNhcmRfaW5kZXhcIjp7XCJuYW1lXCI6XCJDYXJkIEluZGV4XCIsXCJ1bmlmaWVkXCI6XCIxRjRDN1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIxLFwic2hlZXRfeVwiOjEwLFwic2hvcnRfbmFtZXNcIjpbXCJjYXJkX2luZGV4XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYnVzaW5lc3NcIixcInN0YXRpb25lcnlcIl0sXCJzZWFyY2hcIjpcImNhcmQsaW5kZXgsYnVzaW5lc3Msc3RhdGlvbmVyeVwifSxcInNub3dmbGFrZVwiOntcIm5hbWVcIjpcIlNub3dmbGFrZVwiLFwidW5pZmllZFwiOlwiMjc0NFwiLFwidmFyaWF0aW9uc1wiOltcIjI3NDQtRkUwRlwiXSxcInNoZWV0X3hcIjo0LFwic2hlZXRfeVwiOjEsXCJzaG9ydF9uYW1lc1wiOltcInNub3dmbGFrZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIndpbnRlclwiLFwic2Vhc29uXCIsXCJjb2xkXCIsXCJ3ZWF0aGVyXCIsXCJjaHJpc3RtYXNcIixcInhtYXNcIl0sXCJzZWFyY2hcIjpcInNub3dmbGFrZSx3aW50ZXIsc2Vhc29uLGNvbGQsd2VhdGhlcixjaHJpc3RtYXMseG1hc1wifSxcImZsYWctbXZcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgTVZcIixcInVuaWZpZWRcIjpcIjFGMUYyLTFGMUZCXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzYsXCJzaGVldF95XCI6MjksXCJzaG9ydF9uYW1lc1wiOltcImZsYWctbXZcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxtdixyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJzbm93X2Nsb3VkXCI6e1wibmFtZVwiOlwiQ2xvdWQgd2l0aCBTbm93XCIsXCJ1bmlmaWVkXCI6XCIxRjMyOFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjYsXCJzaGVldF95XCI6MTgsXCJzaG9ydF9uYW1lc1wiOltcInNub3dfY2xvdWRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwic25vdyxjbG91ZCx3aXRoXCJ9LFwiYW5nZWxcIjp7XCJuYW1lXCI6XCJCYWJ5IEFuZ2VsXCIsXCJ1bmlmaWVkXCI6XCIxRjQ3Q1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE4LFwic2hlZXRfeVwiOjE4LFwic2hvcnRfbmFtZXNcIjpbXCJhbmdlbFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUY0N0MtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ3Qy0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmNDdjLTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjE4LFwic2hlZXRfeVwiOjE5LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDdDLTFGM0ZDXCI6e1widW5pZmllZFwiOlwiMUY0N0MtMUYzRkNcIixcImltYWdlXCI6XCIxZjQ3Yy0xZjNmYy5wbmdcIixcInNoZWV0X3hcIjoxOCxcInNoZWV0X3lcIjoyMCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ3Qy0xRjNGRFwiOntcInVuaWZpZWRcIjpcIjFGNDdDLTFGM0ZEXCIsXCJpbWFnZVwiOlwiMWY0N2MtMWYzZmQucG5nXCIsXCJzaGVldF94XCI6MTgsXCJzaGVldF95XCI6MjEsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0N0MtMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ3Qy0xRjNGRVwiLFwiaW1hZ2VcIjpcIjFmNDdjLTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjE4LFwic2hlZXRfeVwiOjIyLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDdDLTFGM0ZGXCI6e1widW5pZmllZFwiOlwiMUY0N0MtMUYzRkZcIixcImltYWdlXCI6XCIxZjQ3Yy0xZjNmZi5wbmdcIixcInNoZWV0X3hcIjoxOCxcInNoZWV0X3lcIjoyMyxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX19LFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImhlYXZlblwiLFwid2luZ3NcIixcImhhbG9cIl0sXCJzZWFyY2hcIjpcImFuZ2VsLGJhYnksaGVhdmVuLHdpbmdzLGhhbG9cIn0sXCJ0d29cIjp7XCJuYW1lXCI6XCJLZXljYXAgMlwiLFwidW5pZmllZFwiOlwiMDAzMi0yMEUzXCIsXCJ2YXJpYXRpb25zXCI6W1wiMDAzMi1GRTBGLTIwRTNcIl0sXCJzaGVldF94XCI6MzIsXCJzaGVldF95XCI6MjUsXCJzaG9ydF9uYW1lc1wiOltcInR3b1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm51bWJlcnNcIixcIjJcIixcInByaW1lXCIsXCJibHVlLXNxdWFyZVwiXSxcInNlYXJjaFwiOlwidHdvLGtleWNhcCwyLG51bWJlcnMscHJpbWUsYmx1ZS1zcXVhcmVcIn0sXCJjYXJkX2ZpbGVfYm94XCI6e1wibmFtZVwiOlwiQ2FyZCBGaWxlIEJveFwiLFwidW5pZmllZFwiOlwiMUY1QzNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNSxcInNoZWV0X3lcIjozNyxcInNob3J0X25hbWVzXCI6W1wiY2FyZF9maWxlX2JveFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJ1c2luZXNzXCIsXCJzdGF0aW9uZXJ5XCJdLFwic2VhcmNoXCI6XCJjYXJkLGZpbGUsYm94LGJ1c2luZXNzLHN0YXRpb25lcnlcIn0sXCJmbGFnLW1sXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIE1MXCIsXCJ1bmlmaWVkXCI6XCIxRjFGMi0xRjFGMVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM2LFwic2hlZXRfeVwiOjE5LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLW1sXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsbWwscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwidGhyZWVcIjp7XCJuYW1lXCI6XCJLZXljYXAgM1wiLFwidW5pZmllZFwiOlwiMDAzMy0yMEUzXCIsXCJ2YXJpYXRpb25zXCI6W1wiMDAzMy1GRTBGLTIwRTNcIl0sXCJzaGVldF94XCI6MzIsXCJzaGVldF95XCI6MjYsXCJzaG9ydF9uYW1lc1wiOltcInRocmVlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiM1wiLFwibnVtYmVyc1wiLFwicHJpbWVcIixcImJsdWUtc3F1YXJlXCJdLFwic2VhcmNoXCI6XCJ0aHJlZSxrZXljYXAsMyxudW1iZXJzLHByaW1lLGJsdWUtc3F1YXJlXCJ9LFwicHJpbmNlc3NcIjp7XCJuYW1lXCI6XCJQcmluY2Vzc1wiLFwidW5pZmllZFwiOlwiMUY0NzhcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxOCxcInNoZWV0X3lcIjo5LFwic2hvcnRfbmFtZXNcIjpbXCJwcmluY2Vzc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUY0NzgtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ3OC0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmNDc4LTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjE4LFwic2hlZXRfeVwiOjEwLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDc4LTFGM0ZDXCI6e1widW5pZmllZFwiOlwiMUY0NzgtMUYzRkNcIixcImltYWdlXCI6XCIxZjQ3OC0xZjNmYy5wbmdcIixcInNoZWV0X3hcIjoxOCxcInNoZWV0X3lcIjoxMSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ3OC0xRjNGRFwiOntcInVuaWZpZWRcIjpcIjFGNDc4LTFGM0ZEXCIsXCJpbWFnZVwiOlwiMWY0NzgtMWYzZmQucG5nXCIsXCJzaGVldF94XCI6MTgsXCJzaGVldF95XCI6MTIsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0NzgtMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ3OC0xRjNGRVwiLFwiaW1hZ2VcIjpcIjFmNDc4LTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjE4LFwic2hlZXRfeVwiOjEzLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDc4LTFGM0ZGXCI6e1widW5pZmllZFwiOlwiMUY0NzgtMUYzRkZcIixcImltYWdlXCI6XCIxZjQ3OC0xZjNmZi5wbmdcIixcInNoZWV0X3hcIjoxOCxcInNoZWV0X3lcIjoxNCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX19LFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImdpcmxcIixcIndvbWFuXCIsXCJmZW1hbGVcIixcImJsb25kXCIsXCJjcm93blwiLFwicm95YWxcIixcInF1ZWVuXCJdLFwic2VhcmNoXCI6XCJwcmluY2VzcyxnaXJsLHdvbWFuLGZlbWFsZSxibG9uZCxjcm93bixyb3lhbCxxdWVlblwifSxcInNub3dtYW5cIjp7XCJuYW1lXCI6XCJTbm93bWFuXCIsXCJ1bmlmaWVkXCI6XCIyNjAzXCIsXCJ2YXJpYXRpb25zXCI6W1wiMjYwMy1GRTBGXCJdLFwic2hlZXRfeFwiOjEsXCJzaGVldF95XCI6MyxcInNob3J0X25hbWVzXCI6W1wic25vd21hblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIndpbnRlclwiLFwic2Vhc29uXCIsXCJjb2xkXCIsXCJ3ZWF0aGVyXCIsXCJjaHJpc3RtYXNcIixcInhtYXNcIixcImZyb3plblwiLFwid2l0aG91dF9zbm93XCJdLFwic2VhcmNoXCI6XCJzbm93bWFuLHdpbnRlcixzZWFzb24sY29sZCx3ZWF0aGVyLGNocmlzdG1hcyx4bWFzLGZyb3plbix3aXRob3V0X3Nub3dcIn0sXCJiYWxsb3RfYm94X3dpdGhfYmFsbG90XCI6e1wibmFtZVwiOlwiQmFsbG90IEJveCB3aXRoIEJhbGxvdFwiLFwidW5pZmllZFwiOlwiMUY1RjNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNixcInNoZWV0X3lcIjo4LFwic2hvcnRfbmFtZXNcIjpbXCJiYWxsb3RfYm94X3dpdGhfYmFsbG90XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZWxlY3Rpb25cIixcInZvdGVcIl0sXCJzZWFyY2hcIjpcImJhbGxvdCxib3gsd2l0aCxlbGVjdGlvbix2b3RlXCJ9LFwiZmxhZy1tdFwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBNVFwiLFwidW5pZmllZFwiOlwiMUYxRjItMUYxRjlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNixcInNoZWV0X3lcIjoyNyxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1tdFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLG10LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImZpbGVfY2FiaW5ldFwiOntcIm5hbWVcIjpcIkZpbGUgQ2FiaW5ldFwiLFwidW5pZmllZFwiOlwiMUY1QzRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNSxcInNoZWV0X3lcIjozOCxcInNob3J0X25hbWVzXCI6W1wiZmlsZV9jYWJpbmV0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmlsaW5nXCIsXCJvcmdhbml6aW5nXCJdLFwic2VhcmNoXCI6XCJmaWxlLGNhYmluZXQsZmlsaW5nLG9yZ2FuaXppbmdcIn0sXCJicmlkZV93aXRoX3ZlaWxcIjp7XCJuYW1lXCI6XCJCcmlkZSB3aXRoIFZlaWxcIixcInVuaWZpZWRcIjpcIjFGNDcwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTcsXCJzaGVldF95XCI6MixcInNob3J0X25hbWVzXCI6W1wiYnJpZGVfd2l0aF92ZWlsXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJza2luX3ZhcmlhdGlvbnNcIjp7XCIxRjQ3MC0xRjNGQlwiOntcInVuaWZpZWRcIjpcIjFGNDcwLTFGM0ZCXCIsXCJpbWFnZVwiOlwiMWY0NzAtMWYzZmIucG5nXCIsXCJzaGVldF94XCI6MTcsXCJzaGVldF95XCI6MyxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ3MC0xRjNGQ1wiOntcInVuaWZpZWRcIjpcIjFGNDcwLTFGM0ZDXCIsXCJpbWFnZVwiOlwiMWY0NzAtMWYzZmMucG5nXCIsXCJzaGVldF94XCI6MTcsXCJzaGVldF95XCI6NCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ3MC0xRjNGRFwiOntcInVuaWZpZWRcIjpcIjFGNDcwLTFGM0ZEXCIsXCJpbWFnZVwiOlwiMWY0NzAtMWYzZmQucG5nXCIsXCJzaGVldF94XCI6MTcsXCJzaGVldF95XCI6NSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ3MC0xRjNGRVwiOntcInVuaWZpZWRcIjpcIjFGNDcwLTFGM0ZFXCIsXCJpbWFnZVwiOlwiMWY0NzAtMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MTcsXCJzaGVldF95XCI6NixcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ3MC0xRjNGRlwiOntcInVuaWZpZWRcIjpcIjFGNDcwLTFGM0ZGXCIsXCJpbWFnZVwiOlwiMWY0NzAtMWYzZmYucG5nXCIsXCJzaGVldF94XCI6MTcsXCJzaGVldF95XCI6NyxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX19LFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImNvdXBsZVwiLFwibWFycmlhZ2VcIixcIndlZGRpbmdcIl0sXCJzZWFyY2hcIjpcImJyaWRlLHdpdGgsdmVpbCxjb3VwbGUsbWFycmlhZ2Usd2VkZGluZ1wifSxcImZsYWctbWhcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgTUhcIixcInVuaWZpZWRcIjpcIjFGMUYyLTFGMUVEXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzYsXCJzaGVldF95XCI6MTcsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctbWhcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxtaCxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJzbm93bWFuX3dpdGhvdXRfc25vd1wiOntcIm5hbWVcIjpcIlNub3dtYW4gV2l0aG91dCBTbm93XCIsXCJ1bmlmaWVkXCI6XCIyNkM0XCIsXCJ2YXJpYXRpb25zXCI6W1wiMjZDNC1GRTBGXCJdLFwic2hlZXRfeFwiOjIsXCJzaGVldF95XCI6MjAsXCJzaG9ydF9uYW1lc1wiOltcInNub3dtYW5fd2l0aG91dF9zbm93XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcInNub3dtYW4sd2l0aG91dCxzbm93XCJ9LFwiZm91clwiOntcIm5hbWVcIjpcIktleWNhcCA0XCIsXCJ1bmlmaWVkXCI6XCIwMDM0LTIwRTNcIixcInZhcmlhdGlvbnNcIjpbXCIwMDM0LUZFMEYtMjBFM1wiXSxcInNoZWV0X3hcIjozMixcInNoZWV0X3lcIjoyNyxcInNob3J0X25hbWVzXCI6W1wiZm91clwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIjRcIixcIm51bWJlcnNcIixcImJsdWUtc3F1YXJlXCJdLFwic2VhcmNoXCI6XCJmb3VyLGtleWNhcCw0LG51bWJlcnMsYmx1ZS1zcXVhcmVcIn0sXCJjbGlwYm9hcmRcIjp7XCJuYW1lXCI6XCJDbGlwYm9hcmRcIixcInVuaWZpZWRcIjpcIjFGNENCXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjEsXCJzaGVldF95XCI6MTQsXCJzaG9ydF9uYW1lc1wiOltcImNsaXBib2FyZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInN0YXRpb25lcnlcIixcImRvY3VtZW50c1wiXSxcInNlYXJjaFwiOlwiY2xpcGJvYXJkLHN0YXRpb25lcnksZG9jdW1lbnRzXCJ9LFwid2luZF9ibG93aW5nX2ZhY2VcIjp7XCJuYW1lXCI6XCJXaW5kIEJsb3dpbmcgRmFjZVwiLFwidW5pZmllZFwiOlwiMUYzMkNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo2LFwic2hlZXRfeVwiOjIyLFwic2hvcnRfbmFtZXNcIjpbXCJ3aW5kX2Jsb3dpbmdfZmFjZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImd1c3RcIixcImFpclwiXSxcInNlYXJjaFwiOlwid2luZCxibG93aW5nLGZhY2UsZ3VzdCxhaXJcIn0sXCJmaXZlXCI6e1wibmFtZVwiOlwiS2V5Y2FwIDVcIixcInVuaWZpZWRcIjpcIjAwMzUtMjBFM1wiLFwidmFyaWF0aW9uc1wiOltcIjAwMzUtRkUwRi0yMEUzXCJdLFwic2hlZXRfeFwiOjMyLFwic2hlZXRfeVwiOjI4LFwic2hvcnRfbmFtZXNcIjpbXCJmaXZlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiNVwiLFwibnVtYmVyc1wiLFwiYmx1ZS1zcXVhcmVcIixcInByaW1lXCJdLFwic2VhcmNoXCI6XCJmaXZlLGtleWNhcCw1LG51bWJlcnMsYmx1ZS1zcXVhcmUscHJpbWVcIn0sXCJ3YWxraW5nXCI6e1wibmFtZVwiOlwiUGVkZXN0cmlhblwiLFwidW5pZmllZFwiOlwiMUY2QjZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMCxcInNoZWV0X3lcIjo0MCxcInNob3J0X25hbWVzXCI6W1wid2Fsa2luZ1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUY2QjYtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjZCNi0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmNmI2LTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjMxLFwic2hlZXRfeVwiOjAsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY2QjYtMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjZCNi0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmNmI2LTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjMxLFwic2hlZXRfeVwiOjEsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY2QjYtMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIxRjZCNi0xRjNGRFwiLFwiaW1hZ2VcIjpcIjFmNmI2LTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjMxLFwic2hlZXRfeVwiOjIsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY2QjYtMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIxRjZCNi0xRjNGRVwiLFwiaW1hZ2VcIjpcIjFmNmI2LTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjMxLFwic2hlZXRfeVwiOjMsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY2QjYtMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjZCNi0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmNmI2LTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjMxLFwic2hlZXRfeVwiOjQsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJodW1hblwiLFwiZmVldFwiLFwic3RlcHNcIl0sXCJzZWFyY2hcIjpcIndhbGtpbmcscGVkZXN0cmlhbixodW1hbixmZWV0LHN0ZXBzXCJ9LFwiZmxhZy1tcVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBNUVwiLFwidW5pZmllZFwiOlwiMUYxRjItMUYxRjZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNixcInNoZWV0X3lcIjoyNCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1tcVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxtcSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJzaXhcIjp7XCJuYW1lXCI6XCJLZXljYXAgNlwiLFwidW5pZmllZFwiOlwiMDAzNi0yMEUzXCIsXCJ2YXJpYXRpb25zXCI6W1wiMDAzNi1GRTBGLTIwRTNcIl0sXCJzaGVldF94XCI6MzIsXCJzaGVldF95XCI6MjksXCJzaG9ydF9uYW1lc1wiOltcInNpeFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIjZcIixcIm51bWJlcnNcIixcImJsdWUtc3F1YXJlXCJdLFwic2VhcmNoXCI6XCJzaXgsa2V5Y2FwLDYsbnVtYmVycyxibHVlLXNxdWFyZVwifSxcImRhc2hcIjp7XCJuYW1lXCI6XCJEYXNoIFN5bWJvbFwiLFwidW5pZmllZFwiOlwiMUY0QThcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMCxcInNoZWV0X3lcIjoxNSxcInNob3J0X25hbWVzXCI6W1wiZGFzaFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIndpbmRcIixcImFpclwiLFwiZmFzdFwiLFwic2hvb1wiLFwiZmFydFwiLFwic21va2VcIixcInB1ZmZcIl0sXCJzZWFyY2hcIjpcImRhc2gsc3ltYm9sLHdpbmQsYWlyLGZhc3Qsc2hvbyxmYXJ0LHNtb2tlLHB1ZmZcIn0sXCJmbGFnLW1yXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIE1SXCIsXCJ1bmlmaWVkXCI6XCIxRjFGMi0xRjFGN1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM2LFwic2hlZXRfeVwiOjI1LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLW1yXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsbXIscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwicnVubmVyXCI6e1wibmFtZVwiOlwiUnVubmVyXCIsXCJ1bmlmaWVkXCI6XCIxRjNDM1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEwLFwic2hlZXRfeVwiOjksXCJzaG9ydF9uYW1lc1wiOltcInJ1bm5lclwiLFwicnVubmluZ1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUYzQzMtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjNDMy0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmM2MzLTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjEwLFwic2hlZXRfeVwiOjEwLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGM0MzLTFGM0ZDXCI6e1widW5pZmllZFwiOlwiMUYzQzMtMUYzRkNcIixcImltYWdlXCI6XCIxZjNjMy0xZjNmYy5wbmdcIixcInNoZWV0X3hcIjoxMCxcInNoZWV0X3lcIjoxMSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjNDMy0xRjNGRFwiOntcInVuaWZpZWRcIjpcIjFGM0MzLTFGM0ZEXCIsXCJpbWFnZVwiOlwiMWYzYzMtMWYzZmQucG5nXCIsXCJzaGVldF94XCI6MTAsXCJzaGVldF95XCI6MTIsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUYzQzMtMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIxRjNDMy0xRjNGRVwiLFwiaW1hZ2VcIjpcIjFmM2MzLTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjEwLFwic2hlZXRfeVwiOjEzLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGM0MzLTFGM0ZGXCI6e1widW5pZmllZFwiOlwiMUYzQzMtMUYzRkZcIixcImltYWdlXCI6XCIxZjNjMy0xZjNmZi5wbmdcIixcInNoZWV0X3hcIjoxMCxcInNoZWV0X3lcIjoxNCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX19LFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm1hblwiLFwid2Fsa2luZ1wiLFwiZXhlcmNpc2VcIixcInJhY2VcIixcInJ1bm5pbmdcIl0sXCJzZWFyY2hcIjpcInJ1bm5lcixydW5uaW5nLG1hbix3YWxraW5nLGV4ZXJjaXNlLHJhY2VcIn0sXCJzcGlyYWxfbm90ZV9wYWRcIjp7XCJuYW1lXCI6XCJTcGlyYWwgTm90ZSBQYWRcIixcInVuaWZpZWRcIjpcIjFGNUQyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjUsXCJzaGVldF95XCI6NDAsXCJzaG9ydF9uYW1lc1wiOltcInNwaXJhbF9ub3RlX3BhZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm1lbW9cIixcInN0YXRpb25lcnlcIl0sXCJzZWFyY2hcIjpcInNwaXJhbCxub3RlLHBhZCxtZW1vLHN0YXRpb25lcnlcIn0sXCJzZXZlblwiOntcIm5hbWVcIjpcIktleWNhcCA3XCIsXCJ1bmlmaWVkXCI6XCIwMDM3LTIwRTNcIixcInZhcmlhdGlvbnNcIjpbXCIwMDM3LUZFMEYtMjBFM1wiXSxcInNoZWV0X3hcIjozMixcInNoZWV0X3lcIjozMCxcInNob3J0X25hbWVzXCI6W1wic2V2ZW5cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCI3XCIsXCJudW1iZXJzXCIsXCJibHVlLXNxdWFyZVwiLFwicHJpbWVcIl0sXCJzZWFyY2hcIjpcInNldmVuLGtleWNhcCw3LG51bWJlcnMsYmx1ZS1zcXVhcmUscHJpbWVcIn0sXCJ0b3JuYWRvXCI6e1wibmFtZVwiOlwiQ2xvdWQgd2l0aCBUb3JuYWRvXCIsXCJ1bmlmaWVkXCI6XCIxRjMyQVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjYsXCJzaGVldF95XCI6MjAsXCJzaG9ydF9uYW1lc1wiOltcInRvcm5hZG9cIixcInRvcm5hZG9fY2xvdWRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwidG9ybmFkbyxjbG91ZCx3aXRoXCJ9LFwiZmlsZV9mb2xkZXJcIjp7XCJuYW1lXCI6XCJGaWxlIEZvbGRlclwiLFwidW5pZmllZFwiOlwiMUY0QzFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMSxcInNoZWV0X3lcIjo0LFwic2hvcnRfbmFtZXNcIjpbXCJmaWxlX2ZvbGRlclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImRvY3VtZW50c1wiLFwiYnVzaW5lc3NcIixcIm9mZmljZVwiXSxcInNlYXJjaFwiOlwiZmlsZSxmb2xkZXIsZG9jdW1lbnRzLGJ1c2luZXNzLG9mZmljZVwifSxcImZsYWctbXVcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgTVVcIixcInVuaWZpZWRcIjpcIjFGMUYyLTFGMUZBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzYsXCJzaGVldF95XCI6MjgsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctbXVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxtdSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJkYW5jZXJcIjp7XCJuYW1lXCI6XCJEYW5jZXJcIixcInVuaWZpZWRcIjpcIjFGNDgzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTgsXCJzaGVldF95XCI6NDAsXCJzaG9ydF9uYW1lc1wiOltcImRhbmNlclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUY0ODMtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ4My0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmNDgzLTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjE5LFwic2hlZXRfeVwiOjAsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0ODMtMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ4My0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmNDgzLTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjE5LFwic2hlZXRfeVwiOjEsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0ODMtMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ4My0xRjNGRFwiLFwiaW1hZ2VcIjpcIjFmNDgzLTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjE5LFwic2hlZXRfeVwiOjIsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0ODMtMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ4My0xRjNGRVwiLFwiaW1hZ2VcIjpcIjFmNDgzLTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjE5LFwic2hlZXRfeVwiOjMsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0ODMtMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ4My0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmNDgzLTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjE5LFwic2hlZXRfeVwiOjQsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmZW1hbGVcIixcImdpcmxcIixcIndvbWFuXCIsXCJmdW5cIl0sXCJzZWFyY2hcIjpcImRhbmNlcixmZW1hbGUsZ2lybCx3b21hbixmdW5cIn0sXCJvcGVuX2ZpbGVfZm9sZGVyXCI6e1wibmFtZVwiOlwiT3BlbiBGaWxlIEZvbGRlclwiLFwidW5pZmllZFwiOlwiMUY0QzJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMSxcInNoZWV0X3lcIjo1LFwic2hvcnRfbmFtZXNcIjpbXCJvcGVuX2ZpbGVfZm9sZGVyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZG9jdW1lbnRzXCIsXCJsb2FkXCJdLFwic2VhcmNoXCI6XCJvcGVuLGZpbGUsZm9sZGVyLGRvY3VtZW50cyxsb2FkXCJ9LFwiZWlnaHRcIjp7XCJuYW1lXCI6XCJLZXljYXAgOFwiLFwidW5pZmllZFwiOlwiMDAzOC0yMEUzXCIsXCJ2YXJpYXRpb25zXCI6W1wiMDAzOC1GRTBGLTIwRTNcIl0sXCJzaGVldF94XCI6MzIsXCJzaGVldF95XCI6MzEsXCJzaG9ydF9uYW1lc1wiOltcImVpZ2h0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiOFwiLFwiYmx1ZS1zcXVhcmVcIixcIm51bWJlcnNcIl0sXCJzZWFyY2hcIjpcImVpZ2h0LGtleWNhcCw4LGJsdWUtc3F1YXJlLG51bWJlcnNcIn0sXCJmb2dcIjp7XCJuYW1lXCI6XCJGb2dcIixcInVuaWZpZWRcIjpcIjFGMzJCXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NixcInNoZWV0X3lcIjoyMSxcInNob3J0X25hbWVzXCI6W1wiZm9nXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wid2VhdGhlclwiXSxcInNlYXJjaFwiOlwiZm9nLHdlYXRoZXJcIn0sXCJkYW5jZXJzXCI6e1wibmFtZVwiOlwiV29tYW4gd2l0aCBCdW5ueSBFYXJzXCIsXCJ1bmlmaWVkXCI6XCIxRjQ2RlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE3LFwic2hlZXRfeVwiOjEsXCJzaG9ydF9uYW1lc1wiOltcImRhbmNlcnNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmZW1hbGVcIixcImJ1bm55XCIsXCJ3b21lblwiLFwiZ2lybHNcIl0sXCJzZWFyY2hcIjpcImRhbmNlcnMsd29tYW4sd2l0aCxidW5ueSxlYXJzLGZlbWFsZSx3b21lbixnaXJsc1wifSxcImZsYWcteXRcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgWVRcIixcInVuaWZpZWRcIjpcIjFGMUZFLTFGMUY5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzgsXCJzaGVldF95XCI6NDAsXCJzaG9ydF9uYW1lc1wiOltcImZsYWcteXRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcseXQscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZmxhZy1teFwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBNWFwiLFwidW5pZmllZFwiOlwiMUYxRjItMUYxRkRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNixcInNoZWV0X3lcIjozMSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1teFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLG14LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImNhcmRfaW5kZXhfZGl2aWRlcnNcIjp7XCJuYW1lXCI6XCJDYXJkIEluZGV4IERpdmlkZXJzXCIsXCJ1bmlmaWVkXCI6XCIxRjVDMlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI1LFwic2hlZXRfeVwiOjM2LFwic2hvcnRfbmFtZXNcIjpbXCJjYXJkX2luZGV4X2RpdmlkZXJzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wib3JnYW5pemluZ1wiLFwiYnVzaW5lc3NcIixcInN0YXRpb25lcnlcIl0sXCJzZWFyY2hcIjpcImNhcmQsaW5kZXgsZGl2aWRlcnMsb3JnYW5pemluZyxidXNpbmVzcyxzdGF0aW9uZXJ5XCJ9LFwiY291cGxlXCI6e1wibmFtZVwiOlwiTWFuIGFuZCBXb21hbiBIb2xkaW5nIEhhbmRzXCIsXCJ1bmlmaWVkXCI6XCIxRjQ2QlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE2LFwic2hlZXRfeVwiOjMzLFwic2hvcnRfbmFtZXNcIjpbXCJjb3VwbGVcIixcIm1hbl9hbmRfd29tYW5faG9sZGluZ19oYW5kc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBhaXJcIixcInBlb3BsZVwiLFwiaHVtYW5cIixcImxvdmVcIixcImRhdGVcIixcImRhdGluZ1wiLFwibGlrZVwiLFwiYWZmZWN0aW9uXCIsXCJ2YWxlbnRpbmVzXCIsXCJtYXJyaWFnZVwiXSxcInNlYXJjaFwiOlwiY291cGxlLG1hbixhbmQsd29tYW4saG9sZGluZyxoYW5kcyxwYWlyLHBlb3BsZSxodW1hbixsb3ZlLGRhdGUsZGF0aW5nLGxpa2UsYWZmZWN0aW9uLHZhbGVudGluZXMsbWFycmlhZ2VcIn0sXCJ1bWJyZWxsYVwiOntcIm5hbWVcIjpcIlVtYnJlbGxhXCIsXCJ1bmlmaWVkXCI6XCIyNjAyXCIsXCJ2YXJpYXRpb25zXCI6W1wiMjYwMi1GRTBGXCJdLFwic2hlZXRfeFwiOjEsXCJzaGVldF95XCI6MixcInNob3J0X25hbWVzXCI6W1widW1icmVsbGFcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJyYWlueVwiLFwid2VhdGhlclwiLFwic3ByaW5nXCJdLFwic2VhcmNoXCI6XCJ1bWJyZWxsYSxyYWlueSx3ZWF0aGVyLHNwcmluZ1wifSxcIm5pbmVcIjp7XCJuYW1lXCI6XCJLZXljYXAgOVwiLFwidW5pZmllZFwiOlwiMDAzOS0yMEUzXCIsXCJ2YXJpYXRpb25zXCI6W1wiMDAzOS1GRTBGLTIwRTNcIl0sXCJzaGVldF94XCI6MzIsXCJzaGVldF95XCI6MzIsXCJzaG9ydF9uYW1lc1wiOltcIm5pbmVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJibHVlLXNxdWFyZVwiLFwibnVtYmVyc1wiLFwiOVwiXSxcInNlYXJjaFwiOlwibmluZSxrZXljYXAsOSxibHVlLXNxdWFyZSxudW1iZXJzXCJ9LFwicm9sbGVkX3VwX25ld3NwYXBlclwiOntcIm5hbWVcIjpcIlJvbGxlZC1VcCBOZXdzcGFwZXJcIixcInVuaWZpZWRcIjpcIjFGNURFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjYsXCJzaGVldF95XCI6MyxcInNob3J0X25hbWVzXCI6W1wicm9sbGVkX3VwX25ld3NwYXBlclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInByZXNzXCIsXCJoZWFkbGluZVwiXSxcInNlYXJjaFwiOlwicm9sbGVkLHVwLG5ld3NwYXBlcixwcmVzcyxoZWFkbGluZVwifSxcImZsYWctZm1cIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgRk1cIixcInVuaWZpZWRcIjpcIjFGMUVCLTFGMUYyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzQsXCJzaGVldF95XCI6MjgsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctZm1cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxmbSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJ1bWJyZWxsYV93aXRoX3JhaW5fZHJvcHNcIjp7XCJuYW1lXCI6XCJVbWJyZWxsYSB3aXRoIFJhaW4gRHJvcHNcIixcInVuaWZpZWRcIjpcIjI2MTRcIixcInZhcmlhdGlvbnNcIjpbXCIyNjE0LUZFMEZcIl0sXCJzaGVldF94XCI6MSxcInNoZWV0X3lcIjo3LFwic2hvcnRfbmFtZXNcIjpbXCJ1bWJyZWxsYV93aXRoX3JhaW5fZHJvcHNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwidW1icmVsbGEsd2l0aCxyYWluLGRyb3BzXCJ9LFwidHdvX21lbl9ob2xkaW5nX2hhbmRzXCI6e1wibmFtZVwiOlwiVHdvIE1lbiBIb2xkaW5nIEhhbmRzXCIsXCJ1bmlmaWVkXCI6XCIxRjQ2Q1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE2LFwic2hlZXRfeVwiOjM0LFwic2hvcnRfbmFtZXNcIjpbXCJ0d29fbWVuX2hvbGRpbmdfaGFuZHNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJwYWlyXCIsXCJjb3VwbGVcIixcImxvdmVcIixcImxpa2VcIixcImJyb21hbmNlXCIsXCJmcmllbmRzaGlwXCIsXCJwZW9wbGVcIixcImh1bWFuXCJdLFwic2VhcmNoXCI6XCJ0d28sbWVuLGhvbGRpbmcsaGFuZHMscGFpcixjb3VwbGUsbG92ZSxsaWtlLGJyb21hbmNlLGZyaWVuZHNoaXAscGVvcGxlLGh1bWFuXCJ9LFwia2V5Y2FwX3RlblwiOntcIm5hbWVcIjpcIktleWNhcCBUZW5cIixcInVuaWZpZWRcIjpcIjFGNTFGXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjMsXCJzaGVldF95XCI6MTUsXCJzaG9ydF9uYW1lc1wiOltcImtleWNhcF90ZW5cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJudW1iZXJzXCIsXCIxMFwiLFwiYmx1ZS1zcXVhcmVcIl0sXCJzZWFyY2hcIjpcImtleWNhcCx0ZW4sbnVtYmVycywxMCxibHVlLXNxdWFyZVwifSxcIm5ld3NwYXBlclwiOntcIm5hbWVcIjpcIk5ld3NwYXBlclwiLFwidW5pZmllZFwiOlwiMUY0RjBcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMixcInNoZWV0X3lcIjoxMCxcInNob3J0X25hbWVzXCI6W1wibmV3c3BhcGVyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicHJlc3NcIixcImhlYWRsaW5lXCJdLFwic2VhcmNoXCI6XCJuZXdzcGFwZXIscHJlc3MsaGVhZGxpbmVcIn0sXCJrZXljYXBfc3RhclwiOntcIm5hbWVcIjpcIktleWNhcCBTdGFyXCIsXCJ1bmlmaWVkXCI6XCIwMDJBLTIwRTNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMixcInNoZWV0X3lcIjoyMixcInNob3J0X25hbWVzXCI6W1wia2V5Y2FwX3N0YXJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhc3Rlcmlza1wiXSxcInNlYXJjaFwiOlwia2V5Y2FwLHN0YXIsYXN0ZXJpc2tcIn0sXCJmbGFnLW1kXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIE1EXCIsXCJ1bmlmaWVkXCI6XCIxRjFGMi0xRjFFOVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM2LFwic2hlZXRfeVwiOjEzLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLW1kXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsbWQscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwidHdvX3dvbWVuX2hvbGRpbmdfaGFuZHNcIjp7XCJuYW1lXCI6XCJUd28gV29tZW4gSG9sZGluZyBIYW5kc1wiLFwidW5pZmllZFwiOlwiMUY0NkRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxNixcInNoZWV0X3lcIjozNSxcInNob3J0X25hbWVzXCI6W1widHdvX3dvbWVuX2hvbGRpbmdfaGFuZHNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJwYWlyXCIsXCJmcmllbmRzaGlwXCIsXCJjb3VwbGVcIixcImxvdmVcIixcImxpa2VcIixcImZlbWFsZVwiLFwicGVvcGxlXCIsXCJodW1hblwiXSxcInNlYXJjaFwiOlwidHdvLHdvbWVuLGhvbGRpbmcsaGFuZHMscGFpcixmcmllbmRzaGlwLGNvdXBsZSxsb3ZlLGxpa2UsZmVtYWxlLHBlb3BsZSxodW1hblwifSxcImRyb3BsZXRcIjp7XCJuYW1lXCI6XCJEcm9wbGV0XCIsXCJ1bmlmaWVkXCI6XCIxRjRBN1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIwLFwic2hlZXRfeVwiOjE0LFwic2hvcnRfbmFtZXNcIjpbXCJkcm9wbGV0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wid2F0ZXJcIixcImRyaXBcIixcImZhdWNldFwiLFwic3ByaW5nXCJdLFwic2VhcmNoXCI6XCJkcm9wbGV0LHdhdGVyLGRyaXAsZmF1Y2V0LHNwcmluZ1wifSxcImJvd1wiOntcIm5hbWVcIjpcIlBlcnNvbiBCb3dpbmcgRGVlcGx5XCIsXCJ1bmlmaWVkXCI6XCIxRjY0N1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI4LFwic2hlZXRfeVwiOjE0LFwic2hvcnRfbmFtZXNcIjpbXCJib3dcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcInNraW5fdmFyaWF0aW9uc1wiOntcIjFGNjQ3LTFGM0ZCXCI6e1widW5pZmllZFwiOlwiMUY2NDctMUYzRkJcIixcImltYWdlXCI6XCIxZjY0Ny0xZjNmYi5wbmdcIixcInNoZWV0X3hcIjoyOCxcInNoZWV0X3lcIjoxNSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjY0Ny0xRjNGQ1wiOntcInVuaWZpZWRcIjpcIjFGNjQ3LTFGM0ZDXCIsXCJpbWFnZVwiOlwiMWY2NDctMWYzZmMucG5nXCIsXCJzaGVldF94XCI6MjgsXCJzaGVldF95XCI6MTYsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY2NDctMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIxRjY0Ny0xRjNGRFwiLFwiaW1hZ2VcIjpcIjFmNjQ3LTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjI4LFwic2hlZXRfeVwiOjE3LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNjQ3LTFGM0ZFXCI6e1widW5pZmllZFwiOlwiMUY2NDctMUYzRkVcIixcImltYWdlXCI6XCIxZjY0Ny0xZjNmZS5wbmdcIixcInNoZWV0X3hcIjoyOCxcInNoZWV0X3lcIjoxOCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjY0Ny0xRjNGRlwiOntcInVuaWZpZWRcIjpcIjFGNjQ3LTFGM0ZGXCIsXCJpbWFnZVwiOlwiMWY2NDctMWYzZmYucG5nXCIsXCJzaGVldF94XCI6MjgsXCJzaGVldF95XCI6MTksXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJtYW5cIixcIm1hbGVcIixcImJveVwiXSxcInNlYXJjaFwiOlwiYm93LHBlcnNvbixib3dpbmcsZGVlcGx5LG1hbixtYWxlLGJveVwifSxcIm5vdGVib29rXCI6e1wibmFtZVwiOlwiTm90ZWJvb2tcIixcInVuaWZpZWRcIjpcIjFGNEQzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjEsXCJzaGVldF95XCI6MjIsXCJzaG9ydF9uYW1lc1wiOltcIm5vdGVib29rXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic3RhdGlvbmVyeVwiLFwicmVjb3JkXCIsXCJub3Rlc1wiLFwicGFwZXJcIixcInN0dWR5XCJdLFwic2VhcmNoXCI6XCJub3RlYm9vayxzdGF0aW9uZXJ5LHJlY29yZCxub3RlcyxwYXBlcixzdHVkeVwifSxcInN3ZWF0X2Ryb3BzXCI6e1wibmFtZVwiOlwiU3BsYXNoaW5nIFN3ZWF0IFN5bWJvbFwiLFwidW5pZmllZFwiOlwiMUY0QTZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMCxcInNoZWV0X3lcIjoxMyxcInNob3J0X25hbWVzXCI6W1wic3dlYXRfZHJvcHNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ3YXRlclwiLFwiZHJpcFwiLFwib29wc1wiXSxcInNlYXJjaFwiOlwic3dlYXQsZHJvcHMsc3BsYXNoaW5nLHN5bWJvbCx3YXRlcixkcmlwLG9vcHNcIn0sXCJmbGFnLW1jXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIE1DXCIsXCJ1bmlmaWVkXCI6XCIxRjFGMi0xRjFFOFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM2LFwic2hlZXRfeVwiOjEyLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLW1jXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsbWMscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiY2xvc2VkX2Jvb2tcIjp7XCJuYW1lXCI6XCJDbG9zZWQgQm9va1wiLFwidW5pZmllZFwiOlwiMUY0RDVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMSxcInNoZWV0X3lcIjoyNCxcInNob3J0X25hbWVzXCI6W1wiY2xvc2VkX2Jvb2tcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJyZWFkXCIsXCJsaWJyYXJ5XCIsXCJrbm93bGVkZ2VcIixcInRleHRib29rXCIsXCJsZWFyblwiXSxcInNlYXJjaFwiOlwiY2xvc2VkLGJvb2sscmVhZCxsaWJyYXJ5LGtub3dsZWRnZSx0ZXh0Ym9vayxsZWFyblwifSxcImZsYWctbW5cIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgTU5cIixcInVuaWZpZWRcIjpcIjFGMUYyLTFGMUYzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzYsXCJzaGVldF95XCI6MjEsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctbW5cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxtbixyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJhcnJvd19mb3J3YXJkXCI6e1wibmFtZVwiOlwiQmxhY2sgUmlnaHQtUG9pbnRpbmcgVHJpYW5nbGVcIixcInVuaWZpZWRcIjpcIjI1QjZcIixcInZhcmlhdGlvbnNcIjpbXCIyNUI2LUZFMEZcIl0sXCJzaGVldF94XCI6MCxcInNoZWV0X3lcIjozNSxcInNob3J0X25hbWVzXCI6W1wiYXJyb3dfZm9yd2FyZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJsdWUtc3F1YXJlXCIsXCJyaWdodFwiLFwiZGlyZWN0aW9uXCIsXCJwbGF5XCJdLFwic2VhcmNoXCI6XCJhcnJvdyxmb3J3YXJkLGJsYWNrLHJpZ2h0LHBvaW50aW5nLHRyaWFuZ2xlLGJsdWUtc3F1YXJlLGRpcmVjdGlvbixwbGF5XCJ9LFwiaW5mb3JtYXRpb25fZGVza19wZXJzb25cIjp7XCJuYW1lXCI6XCJJbmZvcm1hdGlvbiBEZXNrIFBlcnNvblwiLFwidW5pZmllZFwiOlwiMUY0ODFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxOCxcInNoZWV0X3lcIjoyOCxcInNob3J0X25hbWVzXCI6W1wiaW5mb3JtYXRpb25fZGVza19wZXJzb25cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcInNraW5fdmFyaWF0aW9uc1wiOntcIjFGNDgxLTFGM0ZCXCI6e1widW5pZmllZFwiOlwiMUY0ODEtMUYzRkJcIixcImltYWdlXCI6XCIxZjQ4MS0xZjNmYi5wbmdcIixcInNoZWV0X3hcIjoxOCxcInNoZWV0X3lcIjoyOSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ4MS0xRjNGQ1wiOntcInVuaWZpZWRcIjpcIjFGNDgxLTFGM0ZDXCIsXCJpbWFnZVwiOlwiMWY0ODEtMWYzZmMucG5nXCIsXCJzaGVldF94XCI6MTgsXCJzaGVldF95XCI6MzAsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0ODEtMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ4MS0xRjNGRFwiLFwiaW1hZ2VcIjpcIjFmNDgxLTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjE4LFwic2hlZXRfeVwiOjMxLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDgxLTFGM0ZFXCI6e1widW5pZmllZFwiOlwiMUY0ODEtMUYzRkVcIixcImltYWdlXCI6XCIxZjQ4MS0xZjNmZS5wbmdcIixcInNoZWV0X3hcIjoxOCxcInNoZWV0X3lcIjozMixcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ4MS0xRjNGRlwiOntcInVuaWZpZWRcIjpcIjFGNDgxLTFGM0ZGXCIsXCJpbWFnZVwiOlwiMWY0ODEtMWYzZmYucG5nXCIsXCJzaGVldF94XCI6MTgsXCJzaGVldF95XCI6MzMsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmZW1hbGVcIixcImdpcmxcIixcIndvbWFuXCIsXCJodW1hblwiXSxcInNlYXJjaFwiOlwiaW5mb3JtYXRpb24sZGVzayxwZXJzb24sZmVtYWxlLGdpcmwsd29tYW4saHVtYW5cIn0sXCJvY2VhblwiOntcIm5hbWVcIjpcIldhdGVyIFdhdmVcIixcInVuaWZpZWRcIjpcIjFGMzBBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NSxcInNoZWV0X3lcIjozMSxcInNob3J0X25hbWVzXCI6W1wib2NlYW5cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzZWFcIixcIndhdGVyXCIsXCJ3YXZlXCIsXCJuYXR1cmVcIixcInRzdW5hbWlcIixcImRpc2FzdGVyXCJdLFwic2VhcmNoXCI6XCJvY2Vhbix3YXRlcix3YXZlLHNlYSxuYXR1cmUsdHN1bmFtaSxkaXNhc3RlclwifSxcImRvdWJsZV92ZXJ0aWNhbF9iYXJcIjp7XCJuYW1lXCI6XCJEb3VibGUgVmVydGljYWwgQmFyXCIsXCJ1bmlmaWVkXCI6XCIyM0Y4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MCxcInNoZWV0X3lcIjoyOSxcInNob3J0X25hbWVzXCI6W1wiZG91YmxlX3ZlcnRpY2FsX2JhclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBhdXNlXCIsXCJibHVlLXNxdWFyZVwiXSxcInNlYXJjaFwiOlwiZG91YmxlLHZlcnRpY2FsLGJhcixwYXVzZSxibHVlLXNxdWFyZVwifSxcImdyZWVuX2Jvb2tcIjp7XCJuYW1lXCI6XCJHcmVlbiBCb29rXCIsXCJ1bmlmaWVkXCI6XCIxRjREN1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIxLFwic2hlZXRfeVwiOjI2LFwic2hvcnRfbmFtZXNcIjpbXCJncmVlbl9ib29rXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicmVhZFwiLFwibGlicmFyeVwiLFwia25vd2xlZGdlXCIsXCJzdHVkeVwiXSxcInNlYXJjaFwiOlwiZ3JlZW4sYm9vayxyZWFkLGxpYnJhcnksa25vd2xlZGdlLHN0dWR5XCJ9LFwibm9fZ29vZFwiOntcIm5hbWVcIjpcIkZhY2Ugd2l0aCBObyBHb29kIEdlc3R1cmVcIixcInVuaWZpZWRcIjpcIjFGNjQ1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjgsXCJzaGVldF95XCI6MixcInNob3J0X25hbWVzXCI6W1wibm9fZ29vZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwic2tpbl92YXJpYXRpb25zXCI6e1wiMUY2NDUtMUYzRkJcIjp7XCJ1bmlmaWVkXCI6XCIxRjY0NS0xRjNGQlwiLFwiaW1hZ2VcIjpcIjFmNjQ1LTFmM2ZiLnBuZ1wiLFwic2hlZXRfeFwiOjI4LFwic2hlZXRfeVwiOjMsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY2NDUtMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjY0NS0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmNjQ1LTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjI4LFwic2hlZXRfeVwiOjQsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY2NDUtMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIxRjY0NS0xRjNGRFwiLFwiaW1hZ2VcIjpcIjFmNjQ1LTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjI4LFwic2hlZXRfeVwiOjUsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY2NDUtMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIxRjY0NS0xRjNGRVwiLFwiaW1hZ2VcIjpcIjFmNjQ1LTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjI4LFwic2hlZXRfeVwiOjYsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY2NDUtMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjY0NS0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmNjQ1LTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjI4LFwic2hlZXRfeVwiOjcsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmZW1hbGVcIixcImdpcmxcIixcIndvbWFuXCIsXCJub3BlXCJdLFwic2VhcmNoXCI6XCJubyxnb29kLGZhY2Usd2l0aCxnZXN0dXJlLGZlbWFsZSxnaXJsLHdvbWFuLG5vcGVcIn0sXCJmbGFnLW1lXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIE1FXCIsXCJ1bmlmaWVkXCI6XCIxRjFGMi0xRjFFQVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM2LFwic2hlZXRfeVwiOjE0LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLW1lXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsbWUscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZmxhZy1tc1wiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBNU1wiLFwidW5pZmllZFwiOlwiMUYxRjItMUYxRjhcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNixcInNoZWV0X3lcIjoyNixcInNob3J0X25hbWVzXCI6W1wiZmxhZy1tc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLG1zLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcIm9rX3dvbWFuXCI6e1wibmFtZVwiOlwiRmFjZSB3aXRoIE9rIEdlc3R1cmVcIixcInVuaWZpZWRcIjpcIjFGNjQ2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjgsXCJzaGVldF95XCI6OCxcInNob3J0X25hbWVzXCI6W1wib2tfd29tYW5cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcInNraW5fdmFyaWF0aW9uc1wiOntcIjFGNjQ2LTFGM0ZCXCI6e1widW5pZmllZFwiOlwiMUY2NDYtMUYzRkJcIixcImltYWdlXCI6XCIxZjY0Ni0xZjNmYi5wbmdcIixcInNoZWV0X3hcIjoyOCxcInNoZWV0X3lcIjo5LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNjQ2LTFGM0ZDXCI6e1widW5pZmllZFwiOlwiMUY2NDYtMUYzRkNcIixcImltYWdlXCI6XCIxZjY0Ni0xZjNmYy5wbmdcIixcInNoZWV0X3hcIjoyOCxcInNoZWV0X3lcIjoxMCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjY0Ni0xRjNGRFwiOntcInVuaWZpZWRcIjpcIjFGNjQ2LTFGM0ZEXCIsXCJpbWFnZVwiOlwiMWY2NDYtMWYzZmQucG5nXCIsXCJzaGVldF94XCI6MjgsXCJzaGVldF95XCI6MTEsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY2NDYtMUYzRkVcIjp7XCJ1bmlmaWVkXCI6XCIxRjY0Ni0xRjNGRVwiLFwiaW1hZ2VcIjpcIjFmNjQ2LTFmM2ZlLnBuZ1wiLFwic2hlZXRfeFwiOjI4LFwic2hlZXRfeVwiOjEyLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNjQ2LTFGM0ZGXCI6e1widW5pZmllZFwiOlwiMUY2NDYtMUYzRkZcIixcImltYWdlXCI6XCIxZjY0Ni0xZjNmZi5wbmdcIixcInNoZWV0X3hcIjoyOCxcInNoZWV0X3lcIjoxMyxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX19LFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIndvbWVuXCIsXCJnaXJsXCIsXCJmZW1hbGVcIixcInBpbmtcIixcImh1bWFuXCJdLFwic2VhcmNoXCI6XCJvayx3b21hbixmYWNlLHdpdGgsZ2VzdHVyZSx3b21lbixnaXJsLGZlbWFsZSxwaW5rLGh1bWFuXCJ9LFwiYmx1ZV9ib29rXCI6e1wibmFtZVwiOlwiQmx1ZSBCb29rXCIsXCJ1bmlmaWVkXCI6XCIxRjREOFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIxLFwic2hlZXRfeVwiOjI3LFwic2hvcnRfbmFtZXNcIjpbXCJibHVlX2Jvb2tcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJyZWFkXCIsXCJsaWJyYXJ5XCIsXCJrbm93bGVkZ2VcIixcImxlYXJuXCIsXCJzdHVkeVwiXSxcInNlYXJjaFwiOlwiYmx1ZSxib29rLHJlYWQsbGlicmFyeSxrbm93bGVkZ2UsbGVhcm4sc3R1ZHlcIn0sXCJibGFja19yaWdodF9wb2ludGluZ190cmlhbmdsZV93aXRoX2RvdWJsZV92ZXJ0aWNhbF9iYXJcIjp7XCJuYW1lXCI6XCJCbGFjayBSaWdodC1Qb2ludGluZyBUcmlhbmdsZSB3aXRoIERvdWJsZSBWZXJ0aWNhbCBCYXJcIixcInVuaWZpZWRcIjpcIjIzRUZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjowLFwic2hlZXRfeVwiOjI0LFwic2hvcnRfbmFtZXNcIjpbXCJibGFja19yaWdodF9wb2ludGluZ190cmlhbmdsZV93aXRoX2RvdWJsZV92ZXJ0aWNhbF9iYXJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmb3J3YXJkXCIsXCJuZXh0XCIsXCJibHVlLXNxdWFyZVwiXSxcInNlYXJjaFwiOlwiYmxhY2sscmlnaHQscG9pbnRpbmcsdHJpYW5nbGUsd2l0aCxkb3VibGUsdmVydGljYWwsYmFyLGZvcndhcmQsbmV4dCxibHVlLXNxdWFyZVwifSxcInJhaXNpbmdfaGFuZFwiOntcIm5hbWVcIjpcIkhhcHB5IFBlcnNvbiBSYWlzaW5nIE9uZSBIYW5kXCIsXCJ1bmlmaWVkXCI6XCIxRjY0QlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI4LFwic2hlZXRfeVwiOjIzLFwic2hvcnRfbmFtZXNcIjpbXCJyYWlzaW5nX2hhbmRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcInNraW5fdmFyaWF0aW9uc1wiOntcIjFGNjRCLTFGM0ZCXCI6e1widW5pZmllZFwiOlwiMUY2NEItMUYzRkJcIixcImltYWdlXCI6XCIxZjY0Yi0xZjNmYi5wbmdcIixcInNoZWV0X3hcIjoyOCxcInNoZWV0X3lcIjoyNCxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjY0Qi0xRjNGQ1wiOntcInVuaWZpZWRcIjpcIjFGNjRCLTFGM0ZDXCIsXCJpbWFnZVwiOlwiMWY2NGItMWYzZmMucG5nXCIsXCJzaGVldF94XCI6MjgsXCJzaGVldF95XCI6MjUsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY2NEItMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIxRjY0Qi0xRjNGRFwiLFwiaW1hZ2VcIjpcIjFmNjRiLTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjI4LFwic2hlZXRfeVwiOjI2LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNjRCLTFGM0ZFXCI6e1widW5pZmllZFwiOlwiMUY2NEItMUYzRkVcIixcImltYWdlXCI6XCIxZjY0Yi0xZjNmZS5wbmdcIixcInNoZWV0X3hcIjoyOCxcInNoZWV0X3lcIjoyNyxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjY0Qi0xRjNGRlwiOntcInVuaWZpZWRcIjpcIjFGNjRCLTFGM0ZGXCIsXCJpbWFnZVwiOlwiMWY2NGItMWYzZmYucG5nXCIsXCJzaGVldF94XCI6MjgsXCJzaGVldF95XCI6MjgsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmZW1hbGVcIixcImdpcmxcIixcIndvbWFuXCJdLFwic2VhcmNoXCI6XCJyYWlzaW5nLGhhbmQsaGFwcHkscGVyc29uLG9uZSxmZW1hbGUsZ2lybCx3b21hblwifSxcImJsYWNrX3NxdWFyZV9mb3Jfc3RvcFwiOntcIm5hbWVcIjpcIkJsYWNrIFNxdWFyZSBmb3IgU3RvcFwiLFwidW5pZmllZFwiOlwiMjNGOVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjAsXCJzaGVldF95XCI6MzAsXCJzaG9ydF9uYW1lc1wiOltcImJsYWNrX3NxdWFyZV9mb3Jfc3RvcFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJsdWUtc3F1YXJlXCJdLFwic2VhcmNoXCI6XCJibGFjayxzcXVhcmUsZm9yLHN0b3AsYmx1ZS1zcXVhcmVcIn0sXCJvcmFuZ2VfYm9va1wiOntcIm5hbWVcIjpcIk9yYW5nZSBCb29rXCIsXCJ1bmlmaWVkXCI6XCIxRjREOVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIxLFwic2hlZXRfeVwiOjI4LFwic2hvcnRfbmFtZXNcIjpbXCJvcmFuZ2VfYm9va1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInJlYWRcIixcImxpYnJhcnlcIixcImtub3dsZWRnZVwiLFwidGV4dGJvb2tcIixcInN0dWR5XCJdLFwic2VhcmNoXCI6XCJvcmFuZ2UsYm9vayxyZWFkLGxpYnJhcnksa25vd2xlZGdlLHRleHRib29rLHN0dWR5XCJ9LFwiZmxhZy1tYVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBNQVwiLFwidW5pZmllZFwiOlwiMUYxRjItMUYxRTZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNixcInNoZWV0X3lcIjoxMSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1tYVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLG1hLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImZsYWctbXpcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgTVpcIixcInVuaWZpZWRcIjpcIjFGMUYyLTFGMUZGXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzYsXCJzaGVldF95XCI6MzMsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctbXpcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxteixyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJub3RlYm9va193aXRoX2RlY29yYXRpdmVfY292ZXJcIjp7XCJuYW1lXCI6XCJOb3RlYm9vayB3aXRoIERlY29yYXRpdmUgQ292ZXJcIixcInVuaWZpZWRcIjpcIjFGNEQ0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjEsXCJzaGVldF95XCI6MjMsXCJzaG9ydF9uYW1lc1wiOltcIm5vdGVib29rX3dpdGhfZGVjb3JhdGl2ZV9jb3ZlclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImNsYXNzcm9vbVwiLFwibm90ZXNcIixcInJlY29yZFwiLFwicGFwZXJcIixcInN0dWR5XCJdLFwic2VhcmNoXCI6XCJub3RlYm9vayx3aXRoLGRlY29yYXRpdmUsY292ZXIsY2xhc3Nyb29tLG5vdGVzLHJlY29yZCxwYXBlcixzdHVkeVwifSxcInBlcnNvbl93aXRoX3BvdXRpbmdfZmFjZVwiOntcIm5hbWVcIjpcIlBlcnNvbiB3aXRoIFBvdXRpbmcgRmFjZVwiLFwidW5pZmllZFwiOlwiMUY2NEVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyOSxcInNoZWV0X3lcIjowLFwic2hvcnRfbmFtZXNcIjpbXCJwZXJzb25fd2l0aF9wb3V0aW5nX2ZhY2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcInNraW5fdmFyaWF0aW9uc1wiOntcIjFGNjRFLTFGM0ZCXCI6e1widW5pZmllZFwiOlwiMUY2NEUtMUYzRkJcIixcImltYWdlXCI6XCIxZjY0ZS0xZjNmYi5wbmdcIixcInNoZWV0X3hcIjoyOSxcInNoZWV0X3lcIjoxLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNjRFLTFGM0ZDXCI6e1widW5pZmllZFwiOlwiMUY2NEUtMUYzRkNcIixcImltYWdlXCI6XCIxZjY0ZS0xZjNmYy5wbmdcIixcInNoZWV0X3hcIjoyOSxcInNoZWV0X3lcIjoyLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNjRFLTFGM0ZEXCI6e1widW5pZmllZFwiOlwiMUY2NEUtMUYzRkRcIixcImltYWdlXCI6XCIxZjY0ZS0xZjNmZC5wbmdcIixcInNoZWV0X3hcIjoyOSxcInNoZWV0X3lcIjozLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNjRFLTFGM0ZFXCI6e1widW5pZmllZFwiOlwiMUY2NEUtMUYzRkVcIixcImltYWdlXCI6XCIxZjY0ZS0xZjNmZS5wbmdcIixcInNoZWV0X3hcIjoyOSxcInNoZWV0X3lcIjo0LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNjRFLTFGM0ZGXCI6e1widW5pZmllZFwiOlwiMUY2NEUtMUYzRkZcIixcImltYWdlXCI6XCIxZjY0ZS0xZjNmZi5wbmdcIixcInNoZWV0X3hcIjoyOSxcInNoZWV0X3lcIjo1LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfX0sXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmVtYWxlXCIsXCJnaXJsXCIsXCJ3b21hblwiXSxcInNlYXJjaFwiOlwicGVyc29uLHdpdGgscG91dGluZyxmYWNlLGZlbWFsZSxnaXJsLHdvbWFuXCJ9LFwiZWplY3RcIjp7XCJuYW1lXCI6XCJFamVjdCBTeW1ib2xcIixcInVuaWZpZWRcIjpcIjIzQ0ZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjowLFwic2hlZXRfeVwiOjE3LFwic2hvcnRfbmFtZXNcIjpbXCJlamVjdFwiXSxcImhhc19pbWdfYXBwbGVcIjpmYWxzZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOmZhbHNlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOmZhbHNlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJlamVjdCxzeW1ib2xcIn0sXCJibGFja19jaXJjbGVfZm9yX3JlY29yZFwiOntcIm5hbWVcIjpcIkJsYWNrIENpcmNsZSBmb3IgUmVjb3JkXCIsXCJ1bmlmaWVkXCI6XCIyM0ZBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MCxcInNoZWV0X3lcIjozMSxcInNob3J0X25hbWVzXCI6W1wiYmxhY2tfY2lyY2xlX2Zvcl9yZWNvcmRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJibHVlLXNxdWFyZVwiXSxcInNlYXJjaFwiOlwiYmxhY2ssY2lyY2xlLGZvcixyZWNvcmQsYmx1ZS1zcXVhcmVcIn0sXCJmbGFnLW1tXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIE1NXCIsXCJ1bmlmaWVkXCI6XCIxRjFGMi0xRjFGMlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM2LFwic2hlZXRfeVwiOjIwLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLW1tXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsbW0scmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwicGVyc29uX2Zyb3duaW5nXCI6e1wibmFtZVwiOlwiUGVyc29uIEZyb3duaW5nXCIsXCJ1bmlmaWVkXCI6XCIxRjY0RFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI4LFwic2hlZXRfeVwiOjM1LFwic2hvcnRfbmFtZXNcIjpbXCJwZXJzb25fZnJvd25pbmdcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcInNraW5fdmFyaWF0aW9uc1wiOntcIjFGNjRELTFGM0ZCXCI6e1widW5pZmllZFwiOlwiMUY2NEQtMUYzRkJcIixcImltYWdlXCI6XCIxZjY0ZC0xZjNmYi5wbmdcIixcInNoZWV0X3hcIjoyOCxcInNoZWV0X3lcIjozNixcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjY0RC0xRjNGQ1wiOntcInVuaWZpZWRcIjpcIjFGNjRELTFGM0ZDXCIsXCJpbWFnZVwiOlwiMWY2NGQtMWYzZmMucG5nXCIsXCJzaGVldF94XCI6MjgsXCJzaGVldF95XCI6MzcsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY2NEQtMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIxRjY0RC0xRjNGRFwiLFwiaW1hZ2VcIjpcIjFmNjRkLTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjI4LFwic2hlZXRfeVwiOjM4LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNjRELTFGM0ZFXCI6e1widW5pZmllZFwiOlwiMUY2NEQtMUYzRkVcIixcImltYWdlXCI6XCIxZjY0ZC0xZjNmZS5wbmdcIixcInNoZWV0X3hcIjoyOCxcInNoZWV0X3lcIjozOSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjY0RC0xRjNGRlwiOntcInVuaWZpZWRcIjpcIjFGNjRELTFGM0ZGXCIsXCJpbWFnZVwiOlwiMWY2NGQtMWYzZmYucG5nXCIsXCJzaGVldF94XCI6MjgsXCJzaGVldF95XCI6NDAsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmZW1hbGVcIixcImdpcmxcIixcIndvbWFuXCIsXCJzYWRcIixcImRlcHJlc3NlZFwiLFwiZGlzY291cmFnZWRcIixcInVuaGFwcHlcIl0sXCJzZWFyY2hcIjpcInBlcnNvbixmcm93bmluZyxmZW1hbGUsZ2lybCx3b21hbixzYWQsZGVwcmVzc2VkLGRpc2NvdXJhZ2VkLHVuaGFwcHlcIn0sXCJsZWRnZXJcIjp7XCJuYW1lXCI6XCJMZWRnZXJcIixcInVuaWZpZWRcIjpcIjFGNEQyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjEsXCJzaGVldF95XCI6MjEsXCJzaG9ydF9uYW1lc1wiOltcImxlZGdlclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm5vdGVzXCIsXCJwYXBlclwiXSxcInNlYXJjaFwiOlwibGVkZ2VyLG5vdGVzLHBhcGVyXCJ9LFwiZmxhZy1uYVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBOQVwiLFwidW5pZmllZFwiOlwiMUYxRjMtMUYxRTZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNixcInNoZWV0X3lcIjozNCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1uYVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLG5hLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImhhaXJjdXRcIjp7XCJuYW1lXCI6XCJIYWlyY3V0XCIsXCJ1bmlmaWVkXCI6XCIxRjQ4N1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE5LFwic2hlZXRfeVwiOjE4LFwic2hvcnRfbmFtZXNcIjpbXCJoYWlyY3V0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJza2luX3ZhcmlhdGlvbnNcIjp7XCIxRjQ4Ny0xRjNGQlwiOntcInVuaWZpZWRcIjpcIjFGNDg3LTFGM0ZCXCIsXCJpbWFnZVwiOlwiMWY0ODctMWYzZmIucG5nXCIsXCJzaGVldF94XCI6MTksXCJzaGVldF95XCI6MTksXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0ODctMUYzRkNcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ4Ny0xRjNGQ1wiLFwiaW1hZ2VcIjpcIjFmNDg3LTFmM2ZjLnBuZ1wiLFwic2hlZXRfeFwiOjE5LFwic2hlZXRfeVwiOjIwLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDg3LTFGM0ZEXCI6e1widW5pZmllZFwiOlwiMUY0ODctMUYzRkRcIixcImltYWdlXCI6XCIxZjQ4Ny0xZjNmZC5wbmdcIixcInNoZWV0X3hcIjoxOSxcInNoZWV0X3lcIjoyMSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ4Ny0xRjNGRVwiOntcInVuaWZpZWRcIjpcIjFGNDg3LTFGM0ZFXCIsXCJpbWFnZVwiOlwiMWY0ODctMWYzZmUucG5nXCIsXCJzaGVldF94XCI6MTksXCJzaGVldF95XCI6MjIsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0ODctMUYzRkZcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ4Ny0xRjNGRlwiLFwiaW1hZ2VcIjpcIjFmNDg3LTFmM2ZmLnBuZ1wiLFwic2hlZXRfeFwiOjE5LFwic2hlZXRfeVwiOjIzLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfX0sXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmVtYWxlXCIsXCJnaXJsXCIsXCJ3b21hblwiXSxcInNlYXJjaFwiOlwiaGFpcmN1dCxmZW1hbGUsZ2lybCx3b21hblwifSxcImJvb2tzXCI6e1wibmFtZVwiOlwiQm9va3NcIixcInVuaWZpZWRcIjpcIjFGNERBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjEsXCJzaGVldF95XCI6MjksXCJzaG9ydF9uYW1lc1wiOltcImJvb2tzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibGl0ZXJhdHVyZVwiLFwibGlicmFyeVwiLFwic3R1ZHlcIl0sXCJzZWFyY2hcIjpcImJvb2tzLGxpdGVyYXR1cmUsbGlicmFyeSxzdHVkeVwifSxcImJsYWNrX3JpZ2h0X3BvaW50aW5nX2RvdWJsZV90cmlhbmdsZV93aXRoX3ZlcnRpY2FsX2JhclwiOntcIm5hbWVcIjpcIkJsYWNrIFJpZ2h0LVBvaW50aW5nIERvdWJsZSBUcmlhbmdsZSB3aXRoIFZlcnRpY2FsIEJhclwiLFwidW5pZmllZFwiOlwiMjNFRFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjAsXCJzaGVldF95XCI6MjIsXCJzaG9ydF9uYW1lc1wiOltcImJsYWNrX3JpZ2h0X3BvaW50aW5nX2RvdWJsZV90cmlhbmdsZV93aXRoX3ZlcnRpY2FsX2JhclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJsdWUtc3F1YXJlXCIsXCJwbGF5XCIsXCJwYXVzZVwiXSxcInNlYXJjaFwiOlwiYmxhY2sscmlnaHQscG9pbnRpbmcsZG91YmxlLHRyaWFuZ2xlLHdpdGgsdmVydGljYWwsYmFyLGJsdWUtc3F1YXJlLHBsYXkscGF1c2VcIn0sXCJib29rXCI6e1wibmFtZVwiOlwiT3BlbiBCb29rXCIsXCJ1bmlmaWVkXCI6XCIxRjRENlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIxLFwic2hlZXRfeVwiOjI1LFwic2hvcnRfbmFtZXNcIjpbXCJib29rXCIsXCJvcGVuX2Jvb2tcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJvcGVuX2Jvb2tcIixcInJlYWRcIixcImxpYnJhcnlcIixcImtub3dsZWRnZVwiLFwibGl0ZXJhdHVyZVwiLFwibGVhcm5cIixcInN0dWR5XCJdLFwic2VhcmNoXCI6XCJib29rLG9wZW4sb3Blbl9ib29rLHJlYWQsbGlicmFyeSxrbm93bGVkZ2UsbGl0ZXJhdHVyZSxsZWFybixzdHVkeVwifSxcImZsYWctbnJcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgTlJcIixcInVuaWZpZWRcIjpcIjFGMUYzLTFGMUY3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzcsXCJzaGVldF95XCI6MixcInNob3J0X25hbWVzXCI6W1wiZmxhZy1uclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLG5yLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImJsYWNrX2xlZnRfcG9pbnRpbmdfZG91YmxlX3RyaWFuZ2xlX3dpdGhfdmVydGljYWxfYmFyXCI6e1wibmFtZVwiOlwiQmxhY2sgTGVmdC1Qb2ludGluZyBEb3VibGUgVHJpYW5nbGUgd2l0aCBWZXJ0aWNhbCBCYXJcIixcInVuaWZpZWRcIjpcIjIzRUVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjowLFwic2hlZXRfeVwiOjIzLFwic2hvcnRfbmFtZXNcIjpbXCJibGFja19sZWZ0X3BvaW50aW5nX2RvdWJsZV90cmlhbmdsZV93aXRoX3ZlcnRpY2FsX2JhclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJhY2t3YXJkXCJdLFwic2VhcmNoXCI6XCJibGFjayxsZWZ0LHBvaW50aW5nLGRvdWJsZSx0cmlhbmdsZSx3aXRoLHZlcnRpY2FsLGJhcixiYWNrd2FyZFwifSxcIm1hc3NhZ2VcIjp7XCJuYW1lXCI6XCJGYWNlIE1hc3NhZ2VcIixcInVuaWZpZWRcIjpcIjFGNDg2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTksXCJzaGVldF95XCI6MTIsXCJzaG9ydF9uYW1lc1wiOltcIm1hc3NhZ2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcInNraW5fdmFyaWF0aW9uc1wiOntcIjFGNDg2LTFGM0ZCXCI6e1widW5pZmllZFwiOlwiMUY0ODYtMUYzRkJcIixcImltYWdlXCI6XCIxZjQ4Ni0xZjNmYi5wbmdcIixcInNoZWV0X3hcIjoxOSxcInNoZWV0X3lcIjoxMyxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ4Ni0xRjNGQ1wiOntcInVuaWZpZWRcIjpcIjFGNDg2LTFGM0ZDXCIsXCJpbWFnZVwiOlwiMWY0ODYtMWYzZmMucG5nXCIsXCJzaGVldF94XCI6MTksXCJzaGVldF95XCI6MTQsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9LFwiMUY0ODYtMUYzRkRcIjp7XCJ1bmlmaWVkXCI6XCIxRjQ4Ni0xRjNGRFwiLFwiaW1hZ2VcIjpcIjFmNDg2LTFmM2ZkLnBuZ1wiLFwic2hlZXRfeFwiOjE5LFwic2hlZXRfeVwiOjE1LFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlfSxcIjFGNDg2LTFGM0ZFXCI6e1widW5pZmllZFwiOlwiMUY0ODYtMUYzRkVcIixcImltYWdlXCI6XCIxZjQ4Ni0xZjNmZS5wbmdcIixcInNoZWV0X3hcIjoxOSxcInNoZWV0X3lcIjoxNixcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZX0sXCIxRjQ4Ni0xRjNGRlwiOntcInVuaWZpZWRcIjpcIjFGNDg2LTFGM0ZGXCIsXCJpbWFnZVwiOlwiMWY0ODYtMWYzZmYucG5nXCIsXCJzaGVldF94XCI6MTksXCJzaGVldF95XCI6MTcsXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWV9fSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmZW1hbGVcIixcImdpcmxcIixcIndvbWFuXCIsXCJoZWFkXCJdLFwic2VhcmNoXCI6XCJtYXNzYWdlLGZhY2UsZmVtYWxlLGdpcmwsd29tYW4saGVhZFwifSxcImNvdXBsZV93aXRoX2hlYXJ0XCI6e1wibmFtZVwiOlwiQ291cGxlIHdpdGggSGVhcnRcIixcInVuaWZpZWRcIjpcIjFGNDkxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTksXCJzaGVldF95XCI6MzMsXCJzaG9ydF9uYW1lc1wiOltcImNvdXBsZV93aXRoX2hlYXJ0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicGFpclwiLFwibG92ZVwiLFwibGlrZVwiLFwiYWZmZWN0aW9uXCIsXCJodW1hblwiLFwiZGF0aW5nXCIsXCJ2YWxlbnRpbmVzXCIsXCJtYXJyaWFnZVwiXSxcInNlYXJjaFwiOlwiY291cGxlLHdpdGgsaGVhcnQscGFpcixsb3ZlLGxpa2UsYWZmZWN0aW9uLGh1bWFuLGRhdGluZyx2YWxlbnRpbmVzLG1hcnJpYWdlXCJ9LFwiZmFzdF9mb3J3YXJkXCI6e1wibmFtZVwiOlwiQmxhY2sgUmlnaHQtUG9pbnRpbmcgRG91YmxlIFRyaWFuZ2xlXCIsXCJ1bmlmaWVkXCI6XCIyM0U5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MCxcInNoZWV0X3lcIjoxOCxcInNob3J0X25hbWVzXCI6W1wiZmFzdF9mb3J3YXJkXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYmx1ZS1zcXVhcmVcIixcInBsYXlcIixcInNwZWVkXCIsXCJjb250aW51ZVwiXSxcInNlYXJjaFwiOlwiZmFzdCxmb3J3YXJkLGJsYWNrLHJpZ2h0LHBvaW50aW5nLGRvdWJsZSx0cmlhbmdsZSxibHVlLXNxdWFyZSxwbGF5LHNwZWVkLGNvbnRpbnVlXCJ9LFwiZmxhZy1ucFwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBOUFwiLFwidW5pZmllZFwiOlwiMUYxRjMtMUYxRjVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNyxcInNoZWV0X3lcIjoxLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLW5wXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsbnAscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwibGlua1wiOntcIm5hbWVcIjpcIkxpbmsgU3ltYm9sXCIsXCJ1bmlmaWVkXCI6XCIxRjUxN1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIzLFwic2hlZXRfeVwiOjcsXCJzaG9ydF9uYW1lc1wiOltcImxpbmtcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJyaW5nc1wiLFwidXJsXCJdLFwic2VhcmNoXCI6XCJsaW5rLHN5bWJvbCxyaW5ncyx1cmxcIn0sXCJwYXBlcmNsaXBcIjp7XCJuYW1lXCI6XCJQYXBlcmNsaXBcIixcInVuaWZpZWRcIjpcIjFGNENFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjEsXCJzaGVldF95XCI6MTcsXCJzaG9ydF9uYW1lc1wiOltcInBhcGVyY2xpcFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImRvY3VtZW50c1wiLFwic3RhdGlvbmVyeVwiXSxcInNlYXJjaFwiOlwicGFwZXJjbGlwLGRvY3VtZW50cyxzdGF0aW9uZXJ5XCJ9LFwicmV3aW5kXCI6e1wibmFtZVwiOlwiQmxhY2sgTGVmdC1Qb2ludGluZyBEb3VibGUgVHJpYW5nbGVcIixcInVuaWZpZWRcIjpcIjIzRUFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjowLFwic2hlZXRfeVwiOjE5LFwic2hvcnRfbmFtZXNcIjpbXCJyZXdpbmRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJwbGF5XCIsXCJibHVlLXNxdWFyZVwiXSxcInNlYXJjaFwiOlwicmV3aW5kLGJsYWNrLGxlZnQscG9pbnRpbmcsZG91YmxlLHRyaWFuZ2xlLHBsYXksYmx1ZS1zcXVhcmVcIn0sXCJ3b21hbi1oZWFydC13b21hblwiOntcIm5hbWVcIjpcIldvbWFuIEhlYXJ0IFdvbWFuXCIsXCJ1bmlmaWVkXCI6XCIxRjQ2OS0yMDBELTI3NjQtRkUwRi0yMDBELTFGNDY5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzksXCJzaGVldF95XCI6MTksXCJzaG9ydF9uYW1lc1wiOltcIndvbWFuLWhlYXJ0LXdvbWFuXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOmZhbHNlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJ3b21hbixoZWFydFwifSxcImZsYWctbmxcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgTkxcIixcInVuaWZpZWRcIjpcIjFGMUYzLTFGMUYxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzYsXCJzaGVldF95XCI6NDAsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctbmxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxubCxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJsaW5rZWRfcGFwZXJjbGlwc1wiOntcIm5hbWVcIjpcIkxpbmtlZCBQYXBlcmNsaXBzXCIsXCJ1bmlmaWVkXCI6XCIxRjU4N1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI1LFwic2hlZXRfeVwiOjgsXCJzaG9ydF9uYW1lc1wiOltcImxpbmtlZF9wYXBlcmNsaXBzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZG9jdW1lbnRzXCIsXCJzdGF0aW9uZXJ5XCJdLFwic2VhcmNoXCI6XCJsaW5rZWQscGFwZXJjbGlwcyxkb2N1bWVudHMsc3RhdGlvbmVyeVwifSxcIm1hbi1oZWFydC1tYW5cIjp7XCJuYW1lXCI6XCJNYW4gSGVhcnQgTWFuXCIsXCJ1bmlmaWVkXCI6XCIxRjQ2OC0yMDBELTI3NjQtRkUwRi0yMDBELTFGNDY4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzksXCJzaGVldF95XCI6MTIsXCJzaG9ydF9uYW1lc1wiOltcIm1hbi1oZWFydC1tYW5cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6ZmFsc2UsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcIm1hbixoZWFydFwifSxcImZsYWctbmNcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgTkNcIixcInVuaWZpZWRcIjpcIjFGMUYzLTFGMUU4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzYsXCJzaGVldF95XCI6MzUsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctbmNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsbmMscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwidHdpc3RlZF9yaWdodHdhcmRzX2Fycm93c1wiOntcIm5hbWVcIjpcIlR3aXN0ZWQgUmlnaHR3YXJkcyBBcnJvd3NcIixcInVuaWZpZWRcIjpcIjFGNTAwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjIsXCJzaGVldF95XCI6MjUsXCJzaG9ydF9uYW1lc1wiOltcInR3aXN0ZWRfcmlnaHR3YXJkc19hcnJvd3NcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJibHVlLXNxdWFyZVwiLFwic2h1ZmZsZVwiLFwibXVzaWNcIixcInJhbmRvbVwiXSxcInNlYXJjaFwiOlwidHdpc3RlZCxyaWdodHdhcmRzLGFycm93cyxibHVlLXNxdWFyZSxzaHVmZmxlLG11c2ljLHJhbmRvbVwifSxcImNvdXBsZWtpc3NcIjp7XCJuYW1lXCI6XCJLaXNzXCIsXCJ1bmlmaWVkXCI6XCIxRjQ4RlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE5LFwic2hlZXRfeVwiOjMxLFwic2hvcnRfbmFtZXNcIjpbXCJjb3VwbGVraXNzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wicGFpclwiLFwidmFsZW50aW5lc1wiLFwibG92ZVwiLFwibGlrZVwiLFwiZGF0aW5nXCIsXCJtYXJyaWFnZVwiXSxcInNlYXJjaFwiOlwiY291cGxla2lzcyxraXNzLHBhaXIsdmFsZW50aW5lcyxsb3ZlLGxpa2UsZGF0aW5nLG1hcnJpYWdlXCJ9LFwiZmxhZy1uelwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBOWlwiLFwidW5pZmllZFwiOlwiMUYxRjMtMUYxRkZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNyxcInNoZWV0X3lcIjo0LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLW56XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsbnoscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwic2Npc3NvcnNcIjp7XCJuYW1lXCI6XCJCbGFjayBTY2lzc29yc1wiLFwidW5pZmllZFwiOlwiMjcwMlwiLFwidmFyaWF0aW9uc1wiOltcIjI3MDItRkUwRlwiXSxcInNoZWV0X3hcIjozLFwic2hlZXRfeVwiOjUsXCJzaG9ydF9uYW1lc1wiOltcInNjaXNzb3JzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic3RhdGlvbmVyeVwiLFwiY3V0XCJdLFwic2VhcmNoXCI6XCJzY2lzc29ycyxibGFjayxzdGF0aW9uZXJ5LGN1dFwifSxcInJlcGVhdFwiOntcIm5hbWVcIjpcIkNsb2Nrd2lzZSBSaWdodHdhcmRzIGFuZCBMZWZ0d2FyZHMgT3BlbiBDaXJjbGUgQXJyb3dzXCIsXCJ1bmlmaWVkXCI6XCIxRjUwMVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIyLFwic2hlZXRfeVwiOjI2LFwic2hvcnRfbmFtZXNcIjpbXCJyZXBlYXRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJsb29wXCIsXCJyZWNvcmRcIl0sXCJzZWFyY2hcIjpcInJlcGVhdCxjbG9ja3dpc2UscmlnaHR3YXJkcyxhbmQsbGVmdHdhcmRzLG9wZW4sY2lyY2xlLGFycm93cyxsb29wLHJlY29yZFwifSxcInJlcGVhdF9vbmVcIjp7XCJuYW1lXCI6XCJDbG9ja3dpc2UgUmlnaHR3YXJkcyBhbmQgTGVmdHdhcmRzIE9wZW4gQ2lyY2xlIEFycm93cyB3aXRoIENpcmNsZWQgT25lIE92ZXJsYXlcIixcInVuaWZpZWRcIjpcIjFGNTAyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjIsXCJzaGVldF95XCI6MjcsXCJzaG9ydF9uYW1lc1wiOltcInJlcGVhdF9vbmVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJibHVlLXNxdWFyZVwiLFwibG9vcFwiXSxcInNlYXJjaFwiOlwicmVwZWF0LG9uZSxjbG9ja3dpc2UscmlnaHR3YXJkcyxhbmQsbGVmdHdhcmRzLG9wZW4sY2lyY2xlLGFycm93cyx3aXRoLGNpcmNsZWQsb3ZlcmxheSxibHVlLXNxdWFyZSxsb29wXCJ9LFwiZmxhZy1uaVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBOSVwiLFwidW5pZmllZFwiOlwiMUYxRjMtMUYxRUVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNixcInNoZWV0X3lcIjozOSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1uaVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLG5pLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcIndvbWFuLWtpc3Mtd29tYW5cIjp7XCJuYW1lXCI6XCJXb21hbiBLaXNzIFdvbWFuXCIsXCJ1bmlmaWVkXCI6XCIxRjQ2OS0yMDBELTI3NjQtRkUwRi0yMDBELTFGNDhCLTIwMEQtMUY0NjlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozOSxcInNoZWV0X3lcIjoyMCxcInNob3J0X25hbWVzXCI6W1wid29tYW4ta2lzcy13b21hblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjpmYWxzZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwid29tYW4sa2lzc1wifSxcInRyaWFuZ3VsYXJfcnVsZXJcIjp7XCJuYW1lXCI6XCJUcmlhbmd1bGFyIFJ1bGVyXCIsXCJ1bmlmaWVkXCI6XCIxRjREMFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIxLFwic2hlZXRfeVwiOjE5LFwic2hvcnRfbmFtZXNcIjpbXCJ0cmlhbmd1bGFyX3J1bGVyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic3RhdGlvbmVyeVwiLFwibWF0aFwiLFwiYXJjaGl0ZWN0XCIsXCJza2V0Y2hcIl0sXCJzZWFyY2hcIjpcInRyaWFuZ3VsYXIscnVsZXIsc3RhdGlvbmVyeSxtYXRoLGFyY2hpdGVjdCxza2V0Y2hcIn0sXCJzdHJhaWdodF9ydWxlclwiOntcIm5hbWVcIjpcIlN0cmFpZ2h0IFJ1bGVyXCIsXCJ1bmlmaWVkXCI6XCIxRjRDRlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIxLFwic2hlZXRfeVwiOjE4LFwic2hvcnRfbmFtZXNcIjpbXCJzdHJhaWdodF9ydWxlclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInN0YXRpb25lcnlcIixcImNhbGN1bGF0ZVwiLFwibGVuZ3RoXCIsXCJtYXRoXCIsXCJzY2hvb2xcIixcImRyYXdpbmdcIixcImFyY2hpdGVjdFwiLFwic2tldGNoXCJdLFwic2VhcmNoXCI6XCJzdHJhaWdodCxydWxlcixzdGF0aW9uZXJ5LGNhbGN1bGF0ZSxsZW5ndGgsbWF0aCxzY2hvb2wsZHJhd2luZyxhcmNoaXRlY3Qsc2tldGNoXCJ9LFwiZmxhZy1uZVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBORVwiLFwidW5pZmllZFwiOlwiMUYxRjMtMUYxRUFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNixcInNoZWV0X3lcIjozNixcInNob3J0X25hbWVzXCI6W1wiZmxhZy1uZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLG5lLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcIm1hbi1raXNzLW1hblwiOntcIm5hbWVcIjpcIk1hbiBLaXNzIE1hblwiLFwidW5pZmllZFwiOlwiMUY0NjgtMjAwRC0yNzY0LUZFMEYtMjAwRC0xRjQ4Qi0yMDBELTFGNDY4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzksXCJzaGVldF95XCI6MTMsXCJzaG9ydF9uYW1lc1wiOltcIm1hbi1raXNzLW1hblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjpmYWxzZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwibWFuLGtpc3NcIn0sXCJhcnJvd19iYWNrd2FyZFwiOntcIm5hbWVcIjpcIkJsYWNrIExlZnQtUG9pbnRpbmcgVHJpYW5nbGVcIixcInVuaWZpZWRcIjpcIjI1QzBcIixcInZhcmlhdGlvbnNcIjpbXCIyNUMwLUZFMEZcIl0sXCJzaGVldF94XCI6MCxcInNoZWV0X3lcIjozNixcInNob3J0X25hbWVzXCI6W1wiYXJyb3dfYmFja3dhcmRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJibHVlLXNxdWFyZVwiLFwibGVmdFwiLFwiZGlyZWN0aW9uXCJdLFwic2VhcmNoXCI6XCJhcnJvdyxiYWNrd2FyZCxibGFjayxsZWZ0LHBvaW50aW5nLHRyaWFuZ2xlLGJsdWUtc3F1YXJlLGRpcmVjdGlvblwifSxcImFycm93X3VwX3NtYWxsXCI6e1wibmFtZVwiOlwiVXAtUG9pbnRpbmcgU21hbGwgUmVkIFRyaWFuZ2xlXCIsXCJ1bmlmaWVkXCI6XCIxRjUzQ1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI0LFwic2hlZXRfeVwiOjMsXCJzaG9ydF9uYW1lc1wiOltcImFycm93X3VwX3NtYWxsXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYmx1ZS1zcXVhcmVcIixcInRyaWFuZ2xlXCIsXCJkaXJlY3Rpb25cIixcInBvaW50XCIsXCJmb3J3YXJkXCIsXCJ0b3BcIl0sXCJzZWFyY2hcIjpcImFycm93LHVwLHNtYWxsLHBvaW50aW5nLHJlZCx0cmlhbmdsZSxibHVlLXNxdWFyZSxkaXJlY3Rpb24scG9pbnQsZm9yd2FyZCx0b3BcIn0sXCJmbGFnLW5nXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIE5HXCIsXCJ1bmlmaWVkXCI6XCIxRjFGMy0xRjFFQ1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM2LFwic2hlZXRfeVwiOjM4LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLW5nXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsbmcscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZmFtaWx5XCI6e1wibmFtZVwiOlwiRmFtaWx5XCIsXCJ1bmlmaWVkXCI6XCIxRjQ2QVwiLFwidmFyaWF0aW9uc1wiOltcIjFGNDY4LTIwMEQtMUY0NjktMjAwRC0xRjQ2NlwiXSxcInNoZWV0X3hcIjoxNixcInNoZWV0X3lcIjozMixcInNob3J0X25hbWVzXCI6W1wiZmFtaWx5XCIsXCJtYW4td29tYW4tYm95XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiaG9tZVwiLFwicGFyZW50c1wiLFwiY2hpbGRcIixcIm1vbVwiLFwiZGFkXCIsXCJmYXRoZXJcIixcIm1vdGhlclwiLFwicGVvcGxlXCIsXCJodW1hblwiXSxcInNlYXJjaFwiOlwiZmFtaWx5LG1hbix3b21hbixib3ksaG9tZSxwYXJlbnRzLGNoaWxkLG1vbSxkYWQsZmF0aGVyLG1vdGhlcixwZW9wbGUsaHVtYW5cIn0sXCJwdXNocGluXCI6e1wibmFtZVwiOlwiUHVzaHBpblwiLFwidW5pZmllZFwiOlwiMUY0Q0NcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMSxcInNoZWV0X3lcIjoxNSxcInNob3J0X25hbWVzXCI6W1wicHVzaHBpblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInN0YXRpb25lcnlcIixcIm1hcmtcIixcImhlcmVcIl0sXCJzZWFyY2hcIjpcInB1c2hwaW4sc3RhdGlvbmVyeSxtYXJrLGhlcmVcIn0sXCJtYW4td29tYW4tZ2lybFwiOntcIm5hbWVcIjpcIk1hbiBXb21hbiBHaXJsXCIsXCJ1bmlmaWVkXCI6XCIxRjQ2OC0yMDBELTFGNDY5LTIwMEQtMUY0NjdcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozOSxcInNoZWV0X3lcIjo5LFwic2hvcnRfbmFtZXNcIjpbXCJtYW4td29tYW4tZ2lybFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJtYW4sd29tYW4sZ2lybFwifSxcInJvdW5kX3B1c2hwaW5cIjp7XCJuYW1lXCI6XCJSb3VuZCBQdXNocGluXCIsXCJ1bmlmaWVkXCI6XCIxRjRDRFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIxLFwic2hlZXRfeVwiOjE2LFwic2hvcnRfbmFtZXNcIjpbXCJyb3VuZF9wdXNocGluXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic3RhdGlvbmVyeVwiLFwibG9jYXRpb25cIixcIm1hcFwiLFwiaGVyZVwiXSxcInNlYXJjaFwiOlwicm91bmQscHVzaHBpbixzdGF0aW9uZXJ5LGxvY2F0aW9uLG1hcCxoZXJlXCJ9LFwiYXJyb3dfZG93bl9zbWFsbFwiOntcIm5hbWVcIjpcIkRvd24tUG9pbnRpbmcgU21hbGwgUmVkIFRyaWFuZ2xlXCIsXCJ1bmlmaWVkXCI6XCIxRjUzRFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI0LFwic2hlZXRfeVwiOjQsXCJzaG9ydF9uYW1lc1wiOltcImFycm93X2Rvd25fc21hbGxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJibHVlLXNxdWFyZVwiLFwiZGlyZWN0aW9uXCIsXCJib3R0b21cIl0sXCJzZWFyY2hcIjpcImFycm93LGRvd24sc21hbGwscG9pbnRpbmcscmVkLHRyaWFuZ2xlLGJsdWUtc3F1YXJlLGRpcmVjdGlvbixib3R0b21cIn0sXCJmbGFnLW51XCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIE5VXCIsXCJ1bmlmaWVkXCI6XCIxRjFGMy0xRjFGQVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM3LFwic2hlZXRfeVwiOjMsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctbnVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxudSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJmbGFnLW5mXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIE5GXCIsXCJ1bmlmaWVkXCI6XCIxRjFGMy0xRjFFQlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM2LFwic2hlZXRfeVwiOjM3LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLW5mXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsbmYscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwidHJpYW5ndWxhcl9mbGFnX29uX3Bvc3RcIjp7XCJuYW1lXCI6XCJUcmlhbmd1bGFyIEZsYWcgb24gUG9zdFwiLFwidW5pZmllZFwiOlwiMUY2QTlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMCxcInNoZWV0X3lcIjoxNyxcInNob3J0X25hbWVzXCI6W1widHJpYW5ndWxhcl9mbGFnX29uX3Bvc3RcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJtYXJrXCIsXCJtaWxlc3RvbmVcIixcInBsYWNlXCJdLFwic2VhcmNoXCI6XCJ0cmlhbmd1bGFyLGZsYWcsb24scG9zdCxtYXJrLG1pbGVzdG9uZSxwbGFjZVwifSxcIm1hbi13b21hbi1naXJsLWJveVwiOntcIm5hbWVcIjpcIk1hbiBXb21hbiBHaXJsIEJveVwiLFwidW5pZmllZFwiOlwiMUY0NjgtMjAwRC0xRjQ2OS0yMDBELTFGNDY3LTIwMEQtMUY0NjZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozOSxcInNoZWV0X3lcIjoxMCxcInNob3J0X25hbWVzXCI6W1wibWFuLXdvbWFuLWdpcmwtYm95XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcIm1hbix3b21hbixnaXJsLGJveVwifSxcImFycm93X2RvdWJsZV91cFwiOntcIm5hbWVcIjpcIkJsYWNrIFVwLVBvaW50aW5nIERvdWJsZSBUcmlhbmdsZVwiLFwidW5pZmllZFwiOlwiMjNFQlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjAsXCJzaGVldF95XCI6MjAsXCJzaG9ydF9uYW1lc1wiOltcImFycm93X2RvdWJsZV91cFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJsdWUtc3F1YXJlXCIsXCJkaXJlY3Rpb25cIixcInRvcFwiXSxcInNlYXJjaFwiOlwiYXJyb3csZG91YmxlLHVwLGJsYWNrLHBvaW50aW5nLHRyaWFuZ2xlLGJsdWUtc3F1YXJlLGRpcmVjdGlvbix0b3BcIn0sXCJtYW4td29tYW4tYm95LWJveVwiOntcIm5hbWVcIjpcIk1hbiBXb21hbiBCb3kgQm95XCIsXCJ1bmlmaWVkXCI6XCIxRjQ2OC0yMDBELTFGNDY5LTIwMEQtMUY0NjYtMjAwRC0xRjQ2NlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM5LFwic2hlZXRfeVwiOjgsXCJzaG9ydF9uYW1lc1wiOltcIm1hbi13b21hbi1ib3ktYm95XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcIm1hbix3b21hbixib3lcIn0sXCJmbGFnLW1wXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIE1QXCIsXCJ1bmlmaWVkXCI6XCIxRjFGMi0xRjFGNVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM2LFwic2hlZXRfeVwiOjIzLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLW1wXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsbXAscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwid2F2aW5nX3doaXRlX2ZsYWdcIjp7XCJuYW1lXCI6XCJXYXZpbmcgV2hpdGUgRmxhZ1wiLFwidW5pZmllZFwiOlwiMUYzRjNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMSxcInNoZWV0X3lcIjozNCxcInNob3J0X25hbWVzXCI6W1wid2F2aW5nX3doaXRlX2ZsYWdcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJsb3NpbmdcIixcImxvc2VyXCIsXCJsb3N0XCIsXCJzdXJyZW5kZXJcIixcImdpdmUgdXBcIixcImZhaWxcIl0sXCJzZWFyY2hcIjpcIndhdmluZyx3aGl0ZSxmbGFnLGxvc2luZyxsb3Nlcixsb3N0LHN1cnJlbmRlcixnaXZlIHVwLGZhaWxcIn0sXCJhcnJvd19kb3VibGVfZG93blwiOntcIm5hbWVcIjpcIkJsYWNrIERvd24tUG9pbnRpbmcgRG91YmxlIFRyaWFuZ2xlXCIsXCJ1bmlmaWVkXCI6XCIyM0VDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MCxcInNoZWV0X3lcIjoyMSxcInNob3J0X25hbWVzXCI6W1wiYXJyb3dfZG91YmxlX2Rvd25cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJibHVlLXNxdWFyZVwiLFwiZGlyZWN0aW9uXCIsXCJib3R0b21cIl0sXCJzZWFyY2hcIjpcImFycm93LGRvdWJsZSxkb3duLGJsYWNrLHBvaW50aW5nLHRyaWFuZ2xlLGJsdWUtc3F1YXJlLGRpcmVjdGlvbixib3R0b21cIn0sXCJtYW4td29tYW4tZ2lybC1naXJsXCI6e1wibmFtZVwiOlwiTWFuIFdvbWFuIEdpcmwgR2lybFwiLFwidW5pZmllZFwiOlwiMUY0NjgtMjAwRC0xRjQ2OS0yMDBELTFGNDY3LTIwMEQtMUY0NjdcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozOSxcInNoZWV0X3lcIjoxMSxcInNob3J0X25hbWVzXCI6W1wibWFuLXdvbWFuLWdpcmwtZ2lybFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJtYW4sd29tYW4sZ2lybFwifSxcImZsYWcta3BcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgS1BcIixcInVuaWZpZWRcIjpcIjFGMUYwLTFGMUY1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzUsXCJzaGVldF95XCI6MzYsXCJzaG9ydF9uYW1lc1wiOltcImZsYWcta3BcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxrcCxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJ3YXZpbmdfYmxhY2tfZmxhZ1wiOntcIm5hbWVcIjpcIldhdmluZyBCbGFjayBGbGFnXCIsXCJ1bmlmaWVkXCI6XCIxRjNGNFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjExLFwic2hlZXRfeVwiOjM1LFwic2hvcnRfbmFtZXNcIjpbXCJ3YXZpbmdfYmxhY2tfZmxhZ1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBpcmF0ZVwiXSxcInNlYXJjaFwiOlwid2F2aW5nLGJsYWNrLGZsYWcscGlyYXRlXCJ9LFwiYXJyb3dfcmlnaHRcIjp7XCJuYW1lXCI6XCJCbGFjayBSaWdodHdhcmRzIEFycm93XCIsXCJ1bmlmaWVkXCI6XCIyN0ExXCIsXCJ2YXJpYXRpb25zXCI6W1wiMjdBMS1GRTBGXCJdLFwic2hlZXRfeFwiOjQsXCJzaGVldF95XCI6MTQsXCJzaG9ydF9uYW1lc1wiOltcImFycm93X3JpZ2h0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYmx1ZS1zcXVhcmVcIixcIm5leHRcIl0sXCJzZWFyY2hcIjpcImFycm93LHJpZ2h0LGJsYWNrLHJpZ2h0d2FyZHMsYmx1ZS1zcXVhcmUsbmV4dFwifSxcImZsYWctbm9cIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgTk9cIixcInVuaWZpZWRcIjpcIjFGMUYzLTFGMUY0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzcsXCJzaGVldF95XCI6MCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1ub1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLG5vLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcIndvbWFuLXdvbWFuLWJveVwiOntcIm5hbWVcIjpcIldvbWFuIFdvbWFuIEJveVwiLFwidW5pZmllZFwiOlwiMUY0NjktMjAwRC0xRjQ2OS0yMDBELTFGNDY2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzksXCJzaGVldF95XCI6MTQsXCJzaG9ydF9uYW1lc1wiOltcIndvbWFuLXdvbWFuLWJveVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJ3b21hbixib3lcIn0sXCJhcnJvd19sZWZ0XCI6e1wibmFtZVwiOlwiTGVmdHdhcmRzIEJsYWNrIEFycm93XCIsXCJ1bmlmaWVkXCI6XCIyQjA1XCIsXCJ2YXJpYXRpb25zXCI6W1wiMkIwNS1GRTBGXCJdLFwic2hlZXRfeFwiOjQsXCJzaGVldF95XCI6MTksXCJzaG9ydF9uYW1lc1wiOltcImFycm93X2xlZnRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJibHVlLXNxdWFyZVwiLFwicHJldmlvdXNcIixcImJhY2tcIl0sXCJzZWFyY2hcIjpcImFycm93LGxlZnQsbGVmdHdhcmRzLGJsYWNrLGJsdWUtc3F1YXJlLHByZXZpb3VzLGJhY2tcIn0sXCJjbG9zZWRfbG9ja193aXRoX2tleVwiOntcIm5hbWVcIjpcIkNsb3NlZCBMb2NrIHdpdGggS2V5XCIsXCJ1bmlmaWVkXCI6XCIxRjUxMFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIzLFwic2hlZXRfeVwiOjAsXCJzaG9ydF9uYW1lc1wiOltcImNsb3NlZF9sb2NrX3dpdGhfa2V5XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic2VjdXJpdHlcIixcInByaXZhY3lcIl0sXCJzZWFyY2hcIjpcImNsb3NlZCxsb2NrLHdpdGgsa2V5LHNlY3VyaXR5LHByaXZhY3lcIn0sXCJmbGFnLW9tXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIE9NXCIsXCJ1bmlmaWVkXCI6XCIxRjFGNC0xRjFGMlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM3LFwic2hlZXRfeVwiOjUsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctb21cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxvbSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJsb2NrXCI6e1wibmFtZVwiOlwiTG9ja1wiLFwidW5pZmllZFwiOlwiMUY1MTJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMyxcInNoZWV0X3lcIjoyLFwic2hvcnRfbmFtZXNcIjpbXCJsb2NrXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic2VjdXJpdHlcIixcInBhc3N3b3JkXCIsXCJwYWRsb2NrXCJdLFwic2VhcmNoXCI6XCJsb2NrLHNlY3VyaXR5LHBhc3N3b3JkLHBhZGxvY2tcIn0sXCJhcnJvd191cFwiOntcIm5hbWVcIjpcIlVwd2FyZHMgQmxhY2sgQXJyb3dcIixcInVuaWZpZWRcIjpcIjJCMDZcIixcInZhcmlhdGlvbnNcIjpbXCIyQjA2LUZFMEZcIl0sXCJzaGVldF94XCI6NCxcInNoZWV0X3lcIjoyMCxcInNob3J0X25hbWVzXCI6W1wiYXJyb3dfdXBcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJibHVlLXNxdWFyZVwiLFwiY29udGludWVcIixcInRvcFwiLFwiZGlyZWN0aW9uXCJdLFwic2VhcmNoXCI6XCJhcnJvdyx1cCx1cHdhcmRzLGJsYWNrLGJsdWUtc3F1YXJlLGNvbnRpbnVlLHRvcCxkaXJlY3Rpb25cIn0sXCJ3b21hbi13b21hbi1naXJsXCI6e1wibmFtZVwiOlwiV29tYW4gV29tYW4gR2lybFwiLFwidW5pZmllZFwiOlwiMUY0NjktMjAwRC0xRjQ2OS0yMDBELTFGNDY3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzksXCJzaGVldF95XCI6MTYsXCJzaG9ydF9uYW1lc1wiOltcIndvbWFuLXdvbWFuLWdpcmxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwid29tYW4sZ2lybFwifSxcImFycm93X2Rvd25cIjp7XCJuYW1lXCI6XCJEb3dud2FyZHMgQmxhY2sgQXJyb3dcIixcInVuaWZpZWRcIjpcIjJCMDdcIixcInZhcmlhdGlvbnNcIjpbXCIyQjA3LUZFMEZcIl0sXCJzaGVldF94XCI6NCxcInNoZWV0X3lcIjoyMSxcInNob3J0X25hbWVzXCI6W1wiYXJyb3dfZG93blwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJsdWUtc3F1YXJlXCIsXCJkaXJlY3Rpb25cIixcImJvdHRvbVwiXSxcInNlYXJjaFwiOlwiYXJyb3csZG93bixkb3dud2FyZHMsYmxhY2ssYmx1ZS1zcXVhcmUsZGlyZWN0aW9uLGJvdHRvbVwifSxcImZsYWctcGtcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgUEtcIixcInVuaWZpZWRcIjpcIjFGMUY1LTFGMUYwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzcsXCJzaGVldF95XCI6MTEsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctcGtcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxwayxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJ3b21hbi13b21hbi1naXJsLWJveVwiOntcIm5hbWVcIjpcIldvbWFuIFdvbWFuIEdpcmwgQm95XCIsXCJ1bmlmaWVkXCI6XCIxRjQ2OS0yMDBELTFGNDY5LTIwMEQtMUY0NjctMjAwRC0xRjQ2NlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM5LFwic2hlZXRfeVwiOjE3LFwic2hvcnRfbmFtZXNcIjpbXCJ3b21hbi13b21hbi1naXJsLWJveVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJ3b21hbixnaXJsLGJveVwifSxcInVubG9ja1wiOntcIm5hbWVcIjpcIk9wZW4gTG9ja1wiLFwidW5pZmllZFwiOlwiMUY1MTNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMyxcInNoZWV0X3lcIjozLFwic2hvcnRfbmFtZXNcIjpbXCJ1bmxvY2tcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJwcml2YWN5XCIsXCJzZWN1cml0eVwiXSxcInNlYXJjaFwiOlwidW5sb2NrLG9wZW4sbG9jayxwcml2YWN5LHNlY3VyaXR5XCJ9LFwid29tYW4td29tYW4tYm95LWJveVwiOntcIm5hbWVcIjpcIldvbWFuIFdvbWFuIEJveSBCb3lcIixcInVuaWZpZWRcIjpcIjFGNDY5LTIwMEQtMUY0NjktMjAwRC0xRjQ2Ni0yMDBELTFGNDY2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzksXCJzaGVldF95XCI6MTUsXCJzaG9ydF9uYW1lc1wiOltcIndvbWFuLXdvbWFuLWJveS1ib3lcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwid29tYW4sYm95XCJ9LFwibG9ja193aXRoX2lua19wZW5cIjp7XCJuYW1lXCI6XCJMb2NrIHdpdGggSW5rIFBlblwiLFwidW5pZmllZFwiOlwiMUY1MEZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMixcInNoZWV0X3lcIjo0MCxcInNob3J0X25hbWVzXCI6W1wibG9ja193aXRoX2lua19wZW5cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzZWN1cml0eVwiLFwic2VjcmV0XCJdLFwic2VhcmNoXCI6XCJsb2NrLHdpdGgsaW5rLHBlbixzZWN1cml0eSxzZWNyZXRcIn0sXCJmbGFnLXB3XCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFBXXCIsXCJ1bmlmaWVkXCI6XCIxRjFGNS0xRjFGQ1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM3LFwic2hlZXRfeVwiOjE4LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXB3XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcscHcscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiYXJyb3dfdXBwZXJfcmlnaHRcIjp7XCJuYW1lXCI6XCJOb3J0aCBFYXN0IEFycm93XCIsXCJ1bmlmaWVkXCI6XCIyMTk3XCIsXCJ2YXJpYXRpb25zXCI6W1wiMjE5Ny1GRTBGXCJdLFwic2hlZXRfeFwiOjAsXCJzaGVldF95XCI6OSxcInNob3J0X25hbWVzXCI6W1wiYXJyb3dfdXBwZXJfcmlnaHRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJibHVlLXNxdWFyZVwiLFwicG9pbnRcIixcImRpcmVjdGlvblwiLFwiZGlhZ29uYWxcIixcIm5vcnRoZWFzdFwiXSxcInNlYXJjaFwiOlwiYXJyb3csdXBwZXIscmlnaHQsbm9ydGgsZWFzdCxibHVlLXNxdWFyZSxwb2ludCxkaXJlY3Rpb24sZGlhZ29uYWwsbm9ydGhlYXN0XCJ9LFwid29tYW4td29tYW4tZ2lybC1naXJsXCI6e1wibmFtZVwiOlwiV29tYW4gV29tYW4gR2lybCBHaXJsXCIsXCJ1bmlmaWVkXCI6XCIxRjQ2OS0yMDBELTFGNDY5LTIwMEQtMUY0NjctMjAwRC0xRjQ2N1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM5LFwic2hlZXRfeVwiOjE4LFwic2hvcnRfbmFtZXNcIjpbXCJ3b21hbi13b21hbi1naXJsLWdpcmxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwid29tYW4sZ2lybFwifSxcImFycm93X2xvd2VyX3JpZ2h0XCI6e1wibmFtZVwiOlwiU291dGggRWFzdCBBcnJvd1wiLFwidW5pZmllZFwiOlwiMjE5OFwiLFwidmFyaWF0aW9uc1wiOltcIjIxOTgtRkUwRlwiXSxcInNoZWV0X3hcIjowLFwic2hlZXRfeVwiOjEwLFwic2hvcnRfbmFtZXNcIjpbXCJhcnJvd19sb3dlcl9yaWdodFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJsdWUtc3F1YXJlXCIsXCJkaXJlY3Rpb25cIixcImRpYWdvbmFsXCIsXCJzb3V0aGVhc3RcIl0sXCJzZWFyY2hcIjpcImFycm93LGxvd2VyLHJpZ2h0LHNvdXRoLGVhc3QsYmx1ZS1zcXVhcmUsZGlyZWN0aW9uLGRpYWdvbmFsLHNvdXRoZWFzdFwifSxcImxvd2VyX2xlZnRfYmFsbHBvaW50X3BlblwiOntcIm5hbWVcIjpcIkxvd2VyIExlZnQgQmFsbHBvaW50IFBlblwiLFwidW5pZmllZFwiOlwiMUY1OEFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNSxcInNoZWV0X3lcIjo5LFwic2hvcnRfbmFtZXNcIjpbXCJsb3dlcl9sZWZ0X2JhbGxwb2ludF9wZW5cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzdGF0aW9uZXJ5XCIsXCJ3cml0aW5nXCIsXCJ3cml0ZVwiXSxcInNlYXJjaFwiOlwibG93ZXIsbGVmdCxiYWxscG9pbnQscGVuLHN0YXRpb25lcnksd3JpdGluZyx3cml0ZVwifSxcImZsYWctcHNcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgUFNcIixcInVuaWZpZWRcIjpcIjFGMUY1LTFGMUY4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzcsXCJzaGVldF95XCI6MTYsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctcHNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxwcyxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJmbGFnLXBhXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFBBXCIsXCJ1bmlmaWVkXCI6XCIxRjFGNS0xRjFFNlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM3LFwic2hlZXRfeVwiOjYsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctcGFcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxwYSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJsb3dlcl9sZWZ0X2ZvdW50YWluX3BlblwiOntcIm5hbWVcIjpcIkxvd2VyIExlZnQgRm91bnRhaW4gUGVuXCIsXCJ1bmlmaWVkXCI6XCIxRjU4QlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI1LFwic2hlZXRfeVwiOjEwLFwic2hvcnRfbmFtZXNcIjpbXCJsb3dlcl9sZWZ0X2ZvdW50YWluX3BlblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInN0YXRpb25lcnlcIixcIndyaXRpbmdcIixcIndyaXRlXCJdLFwic2VhcmNoXCI6XCJsb3dlcixsZWZ0LGZvdW50YWluLHBlbixzdGF0aW9uZXJ5LHdyaXRpbmcsd3JpdGVcIn0sXCJhcnJvd19sb3dlcl9sZWZ0XCI6e1wibmFtZVwiOlwiU291dGggV2VzdCBBcnJvd1wiLFwidW5pZmllZFwiOlwiMjE5OVwiLFwidmFyaWF0aW9uc1wiOltcIjIxOTktRkUwRlwiXSxcInNoZWV0X3hcIjowLFwic2hlZXRfeVwiOjExLFwic2hvcnRfbmFtZXNcIjpbXCJhcnJvd19sb3dlcl9sZWZ0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYmx1ZS1zcXVhcmVcIixcImRpcmVjdGlvblwiLFwiZGlhZ29uYWxcIixcInNvdXRod2VzdFwiXSxcInNlYXJjaFwiOlwiYXJyb3csbG93ZXIsbGVmdCxzb3V0aCx3ZXN0LGJsdWUtc3F1YXJlLGRpcmVjdGlvbixkaWFnb25hbCxzb3V0aHdlc3RcIn0sXCJtYW4tbWFuLWJveVwiOntcIm5hbWVcIjpcIk1hbiBNYW4gQm95XCIsXCJ1bmlmaWVkXCI6XCIxRjQ2OC0yMDBELTFGNDY4LTIwMEQtMUY0NjZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozOSxcInNoZWV0X3lcIjozLFwic2hvcnRfbmFtZXNcIjpbXCJtYW4tbWFuLWJveVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJtYW4sYm95XCJ9LFwiYmxhY2tfbmliXCI6e1wibmFtZVwiOlwiQmxhY2sgTmliXCIsXCJ1bmlmaWVkXCI6XCIyNzEyXCIsXCJ2YXJpYXRpb25zXCI6W1wiMjcxMi1GRTBGXCJdLFwic2hlZXRfeFwiOjMsXCJzaGVldF95XCI6MzQsXCJzaG9ydF9uYW1lc1wiOltcImJsYWNrX25pYlwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBlblwiLFwic3RhdGlvbmVyeVwiLFwid3JpdGluZ1wiLFwid3JpdGVcIl0sXCJzZWFyY2hcIjpcImJsYWNrLG5pYixwZW4sc3RhdGlvbmVyeSx3cml0aW5nLHdyaXRlXCJ9LFwiZmxhZy1wZ1wiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBQR1wiLFwidW5pZmllZFwiOlwiMUYxRjUtMUYxRUNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNyxcInNoZWV0X3lcIjo5LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXBnXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcscGcscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiYXJyb3dfdXBwZXJfbGVmdFwiOntcIm5hbWVcIjpcIk5vcnRoIFdlc3QgQXJyb3dcIixcInVuaWZpZWRcIjpcIjIxOTZcIixcInZhcmlhdGlvbnNcIjpbXCIyMTk2LUZFMEZcIl0sXCJzaGVldF94XCI6MCxcInNoZWV0X3lcIjo4LFwic2hvcnRfbmFtZXNcIjpbXCJhcnJvd191cHBlcl9sZWZ0XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYmx1ZS1zcXVhcmVcIixcInBvaW50XCIsXCJkaXJlY3Rpb25cIixcImRpYWdvbmFsXCIsXCJub3J0aHdlc3RcIl0sXCJzZWFyY2hcIjpcImFycm93LHVwcGVyLGxlZnQsbm9ydGgsd2VzdCxibHVlLXNxdWFyZSxwb2ludCxkaXJlY3Rpb24sZGlhZ29uYWwsbm9ydGh3ZXN0XCJ9LFwibWFuLW1hbi1naXJsXCI6e1wibmFtZVwiOlwiTWFuIE1hbiBHaXJsXCIsXCJ1bmlmaWVkXCI6XCIxRjQ2OC0yMDBELTFGNDY4LTIwMEQtMUY0NjdcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozOSxcInNoZWV0X3lcIjo1LFwic2hvcnRfbmFtZXNcIjpbXCJtYW4tbWFuLWdpcmxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwibWFuLGdpcmxcIn0sXCJtYW4tbWFuLWdpcmwtYm95XCI6e1wibmFtZVwiOlwiTWFuIE1hbiBHaXJsIEJveVwiLFwidW5pZmllZFwiOlwiMUY0NjgtMjAwRC0xRjQ2OC0yMDBELTFGNDY3LTIwMEQtMUY0NjZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozOSxcInNoZWV0X3lcIjo2LFwic2hvcnRfbmFtZXNcIjpbXCJtYW4tbWFuLWdpcmwtYm95XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcIm1hbixnaXJsLGJveVwifSxcImFycm93X3VwX2Rvd25cIjp7XCJuYW1lXCI6XCJVcCBEb3duIEFycm93XCIsXCJ1bmlmaWVkXCI6XCIyMTk1XCIsXCJ2YXJpYXRpb25zXCI6W1wiMjE5NS1GRTBGXCJdLFwic2hlZXRfeFwiOjAsXCJzaGVldF95XCI6NyxcInNob3J0X25hbWVzXCI6W1wiYXJyb3dfdXBfZG93blwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJsdWUtc3F1YXJlXCIsXCJkaXJlY3Rpb25cIixcIndheVwiLFwidmVydGljYWxcIl0sXCJzZWFyY2hcIjpcImFycm93LHVwLGRvd24sYmx1ZS1zcXVhcmUsZGlyZWN0aW9uLHdheSx2ZXJ0aWNhbFwifSxcIm1lbW9cIjp7XCJuYW1lXCI6XCJNZW1vXCIsXCJ1bmlmaWVkXCI6XCIxRjRERFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIxLFwic2hlZXRfeVwiOjMyLFwic2hvcnRfbmFtZXNcIjpbXCJtZW1vXCIsXCJwZW5jaWxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ3cml0ZVwiLFwiZG9jdW1lbnRzXCIsXCJzdGF0aW9uZXJ5XCIsXCJwZW5jaWxcIixcInBhcGVyXCIsXCJ3cml0aW5nXCIsXCJsZWdhbFwiLFwiZXhhbVwiLFwicXVpelwiLFwidGVzdFwiLFwic3R1ZHlcIl0sXCJzZWFyY2hcIjpcIm1lbW8scGVuY2lsLHdyaXRlLGRvY3VtZW50cyxzdGF0aW9uZXJ5LHBhcGVyLHdyaXRpbmcsbGVnYWwsZXhhbSxxdWl6LHRlc3Qsc3R1ZHlcIn0sXCJmbGFnLXB5XCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFBZXCIsXCJ1bmlmaWVkXCI6XCIxRjFGNS0xRjFGRVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM3LFwic2hlZXRfeVwiOjE5LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXB5XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcscHkscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZmxhZy1wZVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBQRVwiLFwidW5pZmllZFwiOlwiMUYxRjUtMUYxRUFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNyxcInNoZWV0X3lcIjo3LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXBlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcscGUscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwicGVuY2lsMlwiOntcIm5hbWVcIjpcIlBlbmNpbFwiLFwidW5pZmllZFwiOlwiMjcwRlwiLFwidmFyaWF0aW9uc1wiOltcIjI3MEYtRkUwRlwiXSxcInNoZWV0X3hcIjozLFwic2hlZXRfeVwiOjMzLFwic2hvcnRfbmFtZXNcIjpbXCJwZW5jaWwyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic3RhdGlvbmVyeVwiLFwid3JpdGVcIixcInBhcGVyXCIsXCJ3cml0aW5nXCIsXCJzY2hvb2xcIixcInN0dWR5XCJdLFwic2VhcmNoXCI6XCJwZW5jaWwyLHBlbmNpbCxzdGF0aW9uZXJ5LHdyaXRlLHBhcGVyLHdyaXRpbmcsc2Nob29sLHN0dWR5XCJ9LFwibWFuLW1hbi1ib3ktYm95XCI6e1wibmFtZVwiOlwiTWFuIE1hbiBCb3kgQm95XCIsXCJ1bmlmaWVkXCI6XCIxRjQ2OC0yMDBELTFGNDY4LTIwMEQtMUY0NjYtMjAwRC0xRjQ2NlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM5LFwic2hlZXRfeVwiOjQsXCJzaG9ydF9uYW1lc1wiOltcIm1hbi1tYW4tYm95LWJveVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJtYW4sYm95XCJ9LFwibGVmdF9yaWdodF9hcnJvd1wiOntcIm5hbWVcIjpcIkxlZnQgUmlnaHQgQXJyb3dcIixcInVuaWZpZWRcIjpcIjIxOTRcIixcInZhcmlhdGlvbnNcIjpbXCIyMTk0LUZFMEZcIl0sXCJzaGVldF94XCI6MCxcInNoZWV0X3lcIjo2LFwic2hvcnRfbmFtZXNcIjpbXCJsZWZ0X3JpZ2h0X2Fycm93XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic2hhcGVcIixcImRpcmVjdGlvblwiLFwiaG9yaXpvbnRhbFwiLFwic2lkZXdheXNcIl0sXCJzZWFyY2hcIjpcImxlZnQscmlnaHQsYXJyb3csc2hhcGUsZGlyZWN0aW9uLGhvcml6b250YWwsc2lkZXdheXNcIn0sXCJtYW4tbWFuLWdpcmwtZ2lybFwiOntcIm5hbWVcIjpcIk1hbiBNYW4gR2lybCBHaXJsXCIsXCJ1bmlmaWVkXCI6XCIxRjQ2OC0yMDBELTFGNDY4LTIwMEQtMUY0NjctMjAwRC0xRjQ2N1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM5LFwic2hlZXRfeVwiOjcsXCJzaG9ydF9uYW1lc1wiOltcIm1hbi1tYW4tZ2lybC1naXJsXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcIm1hbixnaXJsXCJ9LFwiYXJyb3dzX2NvdW50ZXJjbG9ja3dpc2VcIjp7XCJuYW1lXCI6XCJBbnRpY2xvY2t3aXNlIERvd253YXJkcyBhbmQgVXB3YXJkcyBPcGVuIENpcmNsZSBBcnJvd3NcIixcInVuaWZpZWRcIjpcIjFGNTA0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjIsXCJzaGVldF95XCI6MjksXCJzaG9ydF9uYW1lc1wiOltcImFycm93c19jb3VudGVyY2xvY2t3aXNlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYmx1ZS1zcXVhcmVcIixcInN5bmNcIixcImN5Y2xlXCJdLFwic2VhcmNoXCI6XCJhcnJvd3MsY291bnRlcmNsb2Nrd2lzZSxhbnRpY2xvY2t3aXNlLGRvd253YXJkcyxhbmQsdXB3YXJkcyxvcGVuLGNpcmNsZSxibHVlLXNxdWFyZSxzeW5jLGN5Y2xlXCJ9LFwiZmxhZy1waFwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBQSFwiLFwidW5pZmllZFwiOlwiMUYxRjUtMUYxRURcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNyxcInNoZWV0X3lcIjoxMCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1waFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHBoLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImxvd2VyX2xlZnRfY3JheW9uXCI6e1wibmFtZVwiOlwiTG93ZXIgTGVmdCBDcmF5b25cIixcInVuaWZpZWRcIjpcIjFGNThEXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjUsXCJzaGVldF95XCI6MTIsXCJzaG9ydF9uYW1lc1wiOltcImxvd2VyX2xlZnRfY3JheW9uXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZHJhd2luZ1wiLFwiY3JlYXRpdml0eVwiXSxcInNlYXJjaFwiOlwibG93ZXIsbGVmdCxjcmF5b24sZHJhd2luZyxjcmVhdGl2aXR5XCJ9LFwid29tYW5zX2Nsb3RoZXNcIjp7XCJuYW1lXCI6XCJXb21hbnMgQ2xvdGhlc1wiLFwidW5pZmllZFwiOlwiMUY0NUFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxNSxcInNoZWV0X3lcIjozNyxcInNob3J0X25hbWVzXCI6W1wid29tYW5zX2Nsb3RoZXNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmYXNoaW9uXCIsXCJzaG9wcGluZ1wiLFwiZmVtYWxlXCJdLFwic2VhcmNoXCI6XCJ3b21hbnMsY2xvdGhlcyxmYXNoaW9uLHNob3BwaW5nLGZlbWFsZVwifSxcImxvd2VyX2xlZnRfcGFpbnRicnVzaFwiOntcIm5hbWVcIjpcIkxvd2VyIExlZnQgUGFpbnRicnVzaFwiLFwidW5pZmllZFwiOlwiMUY1OENcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNSxcInNoZWV0X3lcIjoxMSxcInNob3J0X25hbWVzXCI6W1wibG93ZXJfbGVmdF9wYWludGJydXNoXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZHJhd2luZ1wiLFwiY3JlYXRpdml0eVwiLFwiYXJ0XCJdLFwic2VhcmNoXCI6XCJsb3dlcixsZWZ0LHBhaW50YnJ1c2gsZHJhd2luZyxjcmVhdGl2aXR5LGFydFwifSxcImZsYWctcG5cIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgUE5cIixcInVuaWZpZWRcIjpcIjFGMUY1LTFGMUYzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzcsXCJzaGVldF95XCI6MTQsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctcG5cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxwbixyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJhcnJvd19yaWdodF9ob29rXCI6e1wibmFtZVwiOlwiUmlnaHR3YXJkcyBBcnJvdyB3aXRoIEhvb2tcIixcInVuaWZpZWRcIjpcIjIxQUFcIixcInZhcmlhdGlvbnNcIjpbXCIyMUFBLUZFMEZcIl0sXCJzaGVldF94XCI6MCxcInNoZWV0X3lcIjoxMyxcInNob3J0X25hbWVzXCI6W1wiYXJyb3dfcmlnaHRfaG9va1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJsdWUtc3F1YXJlXCIsXCJyZXR1cm5cIixcInJvdGFkZVwiLFwiZGlyZWN0aW9uXCJdLFwic2VhcmNoXCI6XCJhcnJvdyxyaWdodCxob29rLHJpZ2h0d2FyZHMsd2l0aCxibHVlLXNxdWFyZSxyZXR1cm4scm90YWRlLGRpcmVjdGlvblwifSxcImxlZnR3YXJkc19hcnJvd193aXRoX2hvb2tcIjp7XCJuYW1lXCI6XCJMZWZ0d2FyZHMgQXJyb3cgd2l0aCBIb29rXCIsXCJ1bmlmaWVkXCI6XCIyMUE5XCIsXCJ2YXJpYXRpb25zXCI6W1wiMjFBOS1GRTBGXCJdLFwic2hlZXRfeFwiOjAsXCJzaGVldF95XCI6MTIsXCJzaG9ydF9uYW1lc1wiOltcImxlZnR3YXJkc19hcnJvd193aXRoX2hvb2tcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJiYWNrXCIsXCJyZXR1cm5cIixcImJsdWUtc3F1YXJlXCIsXCJ1bmRvXCIsXCJlbnRlclwiXSxcInNlYXJjaFwiOlwibGVmdHdhcmRzLGFycm93LHdpdGgsaG9vayxiYWNrLHJldHVybixibHVlLXNxdWFyZSx1bmRvLGVudGVyXCJ9LFwibWFnXCI6e1wibmFtZVwiOlwiTGVmdC1Qb2ludGluZyBNYWduaWZ5aW5nIEdsYXNzXCIsXCJ1bmlmaWVkXCI6XCIxRjUwRFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIyLFwic2hlZXRfeVwiOjM4LFwic2hvcnRfbmFtZXNcIjpbXCJtYWdcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzZWFyY2hcIixcInpvb21cIixcImZpbmRcIixcImRldGVjdGl2ZVwiXSxcInNlYXJjaFwiOlwibWFnLGxlZnQscG9pbnRpbmcsbWFnbmlmeWluZyxnbGFzcyxzZWFyY2gsem9vbSxmaW5kLGRldGVjdGl2ZVwifSxcImZsYWctcGxcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgUExcIixcInVuaWZpZWRcIjpcIjFGMUY1LTFGMUYxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzcsXCJzaGVldF95XCI6MTIsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctcGxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxwbCxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJzaGlydFwiOntcIm5hbWVcIjpcIlQtU2hpcnRcIixcInVuaWZpZWRcIjpcIjFGNDU1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTUsXCJzaGVldF95XCI6MzIsXCJzaG9ydF9uYW1lc1wiOltcInNoaXJ0XCIsXCJ0c2hpcnRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmYXNoaW9uXCIsXCJjbG90aFwiLFwiY2FzdWFsXCIsXCJ0c2hpcnRcIixcInRlZVwiXSxcInNlYXJjaFwiOlwic2hpcnQsdHNoaXJ0LHQsZmFzaGlvbixjbG90aCxjYXN1YWwsdGVlXCJ9LFwiZmxhZy1wdFwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBQVFwiLFwidW5pZmllZFwiOlwiMUYxRjUtMUYxRjlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNyxcInNoZWV0X3lcIjoxNyxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1wdFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHB0LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImplYW5zXCI6e1wibmFtZVwiOlwiSmVhbnNcIixcInVuaWZpZWRcIjpcIjFGNDU2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTUsXCJzaGVldF95XCI6MzMsXCJzaG9ydF9uYW1lc1wiOltcImplYW5zXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmFzaGlvblwiLFwic2hvcHBpbmdcIl0sXCJzZWFyY2hcIjpcImplYW5zLGZhc2hpb24sc2hvcHBpbmdcIn0sXCJtYWdfcmlnaHRcIjp7XCJuYW1lXCI6XCJSaWdodC1Qb2ludGluZyBNYWduaWZ5aW5nIEdsYXNzXCIsXCJ1bmlmaWVkXCI6XCIxRjUwRVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIyLFwic2hlZXRfeVwiOjM5LFwic2hvcnRfbmFtZXNcIjpbXCJtYWdfcmlnaHRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzZWFyY2hcIixcInpvb21cIixcImZpbmRcIixcImRldGVjdGl2ZVwiXSxcInNlYXJjaFwiOlwibWFnLHJpZ2h0LHBvaW50aW5nLG1hZ25pZnlpbmcsZ2xhc3Msc2VhcmNoLHpvb20sZmluZCxkZXRlY3RpdmVcIn0sXCJhcnJvd19oZWFkaW5nX3VwXCI6e1wibmFtZVwiOlwiQXJyb3cgUG9pbnRpbmcgUmlnaHR3YXJkcyBUaGVuIEN1cnZpbmcgVXB3YXJkc1wiLFwidW5pZmllZFwiOlwiMjkzNFwiLFwidmFyaWF0aW9uc1wiOltcIjI5MzQtRkUwRlwiXSxcInNoZWV0X3hcIjo0LFwic2hlZXRfeVwiOjE3LFwic2hvcnRfbmFtZXNcIjpbXCJhcnJvd19oZWFkaW5nX3VwXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYmx1ZS1zcXVhcmVcIixcImRpcmVjdGlvblwiLFwidG9wXCJdLFwic2VhcmNoXCI6XCJhcnJvdyxoZWFkaW5nLHVwLHBvaW50aW5nLHJpZ2h0d2FyZHMsdGhlbixjdXJ2aW5nLHVwd2FyZHMsYmx1ZS1zcXVhcmUsZGlyZWN0aW9uLHRvcFwifSxcIm5lY2t0aWVcIjp7XCJuYW1lXCI6XCJOZWNrdGllXCIsXCJ1bmlmaWVkXCI6XCIxRjQ1NFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE1LFwic2hlZXRfeVwiOjMxLFwic2hvcnRfbmFtZXNcIjpbXCJuZWNrdGllXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic2hpcnRcIixcInN1aXR1cFwiLFwiZm9ybWFsXCIsXCJmYXNoaW9uXCIsXCJjbG90aFwiLFwiYnVzaW5lc3NcIl0sXCJzZWFyY2hcIjpcIm5lY2t0aWUsc2hpcnQsc3VpdHVwLGZvcm1hbCxmYXNoaW9uLGNsb3RoLGJ1c2luZXNzXCJ9LFwiZmxhZy1wclwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBQUlwiLFwidW5pZmllZFwiOlwiMUYxRjUtMUYxRjdcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNyxcInNoZWV0X3lcIjoxNSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1wclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHByLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImFycm93X2hlYWRpbmdfZG93blwiOntcIm5hbWVcIjpcIkFycm93IFBvaW50aW5nIFJpZ2h0d2FyZHMgVGhlbiBDdXJ2aW5nIERvd253YXJkc1wiLFwidW5pZmllZFwiOlwiMjkzNVwiLFwidmFyaWF0aW9uc1wiOltcIjI5MzUtRkUwRlwiXSxcInNoZWV0X3hcIjo0LFwic2hlZXRfeVwiOjE4LFwic2hvcnRfbmFtZXNcIjpbXCJhcnJvd19oZWFkaW5nX2Rvd25cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJibHVlLXNxdWFyZVwiLFwiZGlyZWN0aW9uXCIsXCJib3R0b21cIl0sXCJzZWFyY2hcIjpcImFycm93LGhlYWRpbmcsZG93bixwb2ludGluZyxyaWdodHdhcmRzLHRoZW4sY3VydmluZyxkb3dud2FyZHMsYmx1ZS1zcXVhcmUsZGlyZWN0aW9uLGJvdHRvbVwifSxcImRyZXNzXCI6e1wibmFtZVwiOlwiRHJlc3NcIixcInVuaWZpZWRcIjpcIjFGNDU3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTUsXCJzaGVldF95XCI6MzQsXCJzaG9ydF9uYW1lc1wiOltcImRyZXNzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiY2xvdGhlc1wiLFwiZmFzaGlvblwiLFwic2hvcHBpbmdcIl0sXCJzZWFyY2hcIjpcImRyZXNzLGNsb3RoZXMsZmFzaGlvbixzaG9wcGluZ1wifSxcImZsYWctcWFcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgUUFcIixcInVuaWZpZWRcIjpcIjFGMUY2LTFGMUU2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzcsXCJzaGVldF95XCI6MjAsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctcWFcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxxYSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJoYXNoXCI6e1wibmFtZVwiOlwiSGFzaCBLZXlcIixcInVuaWZpZWRcIjpcIjAwMjMtMjBFM1wiLFwidmFyaWF0aW9uc1wiOltcIjAwMjMtRkUwRi0yMEUzXCJdLFwic2hlZXRfeFwiOjMyLFwic2hlZXRfeVwiOjIxLFwic2hvcnRfbmFtZXNcIjpbXCJoYXNoXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic3ltYm9sXCIsXCJibHVlLXNxdWFyZVwiLFwidHdpdHRlclwiXSxcInNlYXJjaFwiOlwiaGFzaCxrZXksc3ltYm9sLGJsdWUtc3F1YXJlLHR3aXR0ZXJcIn0sXCJmbGFnLXJlXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFJFXCIsXCJ1bmlmaWVkXCI6XCIxRjFGNy0xRjFFQVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM3LFwic2hlZXRfeVwiOjIxLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXJlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHJlLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImJpa2luaVwiOntcIm5hbWVcIjpcIkJpa2luaVwiLFwidW5pZmllZFwiOlwiMUY0NTlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxNSxcInNoZWV0X3lcIjozNixcInNob3J0X25hbWVzXCI6W1wiYmlraW5pXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic3dpbW1pbmdcIixcImZlbWFsZVwiLFwid29tYW5cIixcImdpcmxcIixcImZhc2hpb25cIixcImJlYWNoXCIsXCJzdW1tZXJcIl0sXCJzZWFyY2hcIjpcImJpa2luaSxzd2ltbWluZyxmZW1hbGUsd29tYW4sZ2lybCxmYXNoaW9uLGJlYWNoLHN1bW1lclwifSxcImluZm9ybWF0aW9uX3NvdXJjZVwiOntcIm5hbWVcIjpcIkluZm9ybWF0aW9uIFNvdXJjZVwiLFwidW5pZmllZFwiOlwiMjEzOVwiLFwidmFyaWF0aW9uc1wiOltcIjIxMzktRkUwRlwiXSxcInNoZWV0X3hcIjowLFwic2hlZXRfeVwiOjUsXCJzaG9ydF9uYW1lc1wiOltcImluZm9ybWF0aW9uX3NvdXJjZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImJsdWUtc3F1YXJlXCIsXCJhbHBoYWJldFwiLFwibGV0dGVyXCJdLFwic2VhcmNoXCI6XCJpbmZvcm1hdGlvbixzb3VyY2UsYmx1ZS1zcXVhcmUsYWxwaGFiZXQsbGV0dGVyXCJ9LFwia2ltb25vXCI6e1wibmFtZVwiOlwiS2ltb25vXCIsXCJ1bmlmaWVkXCI6XCIxRjQ1OFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE1LFwic2hlZXRfeVwiOjM1LFwic2hvcnRfbmFtZXNcIjpbXCJraW1vbm9cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJkcmVzc1wiLFwiZmFzaGlvblwiLFwid29tZW5cIixcImZlbWFsZVwiLFwiamFwYW5lc2VcIl0sXCJzZWFyY2hcIjpcImtpbW9ubyxkcmVzcyxmYXNoaW9uLHdvbWVuLGZlbWFsZSxqYXBhbmVzZVwifSxcImFiY1wiOntcIm5hbWVcIjpcIklucHV0IFN5bWJvbCBmb3IgTGF0aW4gTGV0dGVyc1wiLFwidW5pZmllZFwiOlwiMUY1MjRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMyxcInNoZWV0X3lcIjoyMCxcInNob3J0X25hbWVzXCI6W1wiYWJjXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYmx1ZS1zcXVhcmVcIixcImFscGhhYmV0XCJdLFwic2VhcmNoXCI6XCJhYmMsaW5wdXQsc3ltYm9sLGZvcixsYXRpbixsZXR0ZXJzLGJsdWUtc3F1YXJlLGFscGhhYmV0XCJ9LFwiZmxhZy1yb1wiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBST1wiLFwidW5pZmllZFwiOlwiMUYxRjctMUYxRjRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNyxcInNoZWV0X3lcIjoyMixcInNob3J0X25hbWVzXCI6W1wiZmxhZy1yb1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHJvLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImxpcHN0aWNrXCI6e1wibmFtZVwiOlwiTGlwc3RpY2tcIixcInVuaWZpZWRcIjpcIjFGNDg0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTksXCJzaGVldF95XCI6NSxcInNob3J0X25hbWVzXCI6W1wibGlwc3RpY2tcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmZW1hbGVcIixcImdpcmxcIixcImZhc2hpb25cIixcIndvbWFuXCJdLFwic2VhcmNoXCI6XCJsaXBzdGljayxmZW1hbGUsZ2lybCxmYXNoaW9uLHdvbWFuXCJ9LFwiZmxhZy1ydVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBSVVwiLFwidW5pZmllZFwiOlwiMUYxRjctMUYxRkFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNyxcInNoZWV0X3lcIjoyNCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1ydVwiLFwicnVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxydSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJhYmNkXCI6e1wibmFtZVwiOlwiSW5wdXQgU3ltYm9sIGZvciBMYXRpbiBTbWFsbCBMZXR0ZXJzXCIsXCJ1bmlmaWVkXCI6XCIxRjUyMVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIzLFwic2hlZXRfeVwiOjE3LFwic2hvcnRfbmFtZXNcIjpbXCJhYmNkXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYmx1ZS1zcXVhcmVcIixcImFscGhhYmV0XCJdLFwic2VhcmNoXCI6XCJhYmNkLGlucHV0LHN5bWJvbCxmb3IsbGF0aW4sc21hbGwsbGV0dGVycyxibHVlLXNxdWFyZSxhbHBoYWJldFwifSxcImtpc3NcIjp7XCJuYW1lXCI6XCJLaXNzIE1hcmtcIixcInVuaWZpZWRcIjpcIjFGNDhCXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTksXCJzaGVldF95XCI6MjcsXCJzaG9ydF9uYW1lc1wiOltcImtpc3NcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltcIjoqXCIsXCI6LSpcIl0sXCJrZXl3b3Jkc1wiOltcImZhY2VcIixcImxpcHNcIixcImxvdmVcIixcImxpa2VcIixcImFmZmVjdGlvblwiLFwidmFsZW50aW5lc1wiXSxcInNlYXJjaFwiOlwia2lzcyxtYXJrLGZhY2UsbGlwcyxsb3ZlLGxpa2UsYWZmZWN0aW9uLHZhbGVudGluZXMsOiosOi0qXCJ9LFwiY2FwaXRhbF9hYmNkXCI6e1wibmFtZVwiOlwiSW5wdXQgU3ltYm9sIGZvciBMYXRpbiBDYXBpdGFsIExldHRlcnNcIixcInVuaWZpZWRcIjpcIjFGNTIwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjMsXCJzaGVldF95XCI6MTYsXCJzaG9ydF9uYW1lc1wiOltcImNhcGl0YWxfYWJjZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImFscGhhYmV0XCIsXCJ3b3Jkc1wiLFwiYmx1ZS1zcXVhcmVcIl0sXCJzZWFyY2hcIjpcImNhcGl0YWwsYWJjZCxpbnB1dCxzeW1ib2wsZm9yLGxhdGluLGxldHRlcnMsYWxwaGFiZXQsd29yZHMsYmx1ZS1zcXVhcmVcIn0sXCJmbGFnLXJ3XCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFJXXCIsXCJ1bmlmaWVkXCI6XCIxRjFGNy0xRjFGQ1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM3LFwic2hlZXRfeVwiOjI1LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXJ3XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcscncscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZm9vdHByaW50c1wiOntcIm5hbWVcIjpcIkZvb3RwcmludHNcIixcInVuaWZpZWRcIjpcIjFGNDYzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTYsXCJzaGVldF95XCI6NSxcInNob3J0X25hbWVzXCI6W1wiZm9vdHByaW50c1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZlZXRcIixcInRyYWNraW5nXCIsXCJ3YWxraW5nXCIsXCJiZWFjaFwiXSxcInNlYXJjaFwiOlwiZm9vdHByaW50cyxmZWV0LHRyYWNraW5nLHdhbGtpbmcsYmVhY2hcIn0sXCJmbGFnLWJsXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEJMXCIsXCJ1bmlmaWVkXCI6XCIxRjFFNy0xRjFGMVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjMzLFwic2hlZXRfeVwiOjE4LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWJsXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGJsLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcInN5bWJvbHNcIjp7XCJuYW1lXCI6XCJJbnB1dCBTeW1ib2wgZm9yIFN5bWJvbHNcIixcInVuaWZpZWRcIjpcIjFGNTIzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjMsXCJzaGVldF95XCI6MTksXCJzaG9ydF9uYW1lc1wiOltcInN5bWJvbHNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJibHVlLXNxdWFyZVwiLFwibXVzaWNcIixcIm5vdGVcIixcImFtcGVyc2FuZFwiLFwicGVyY2VudFwiLFwiZ2x5cGhzXCIsXCJjaGFyYWN0ZXJzXCJdLFwic2VhcmNoXCI6XCJzeW1ib2xzLGlucHV0LHN5bWJvbCxmb3IsYmx1ZS1zcXVhcmUsbXVzaWMsbm90ZSxhbXBlcnNhbmQscGVyY2VudCxnbHlwaHMsY2hhcmFjdGVyc1wifSxcImhpZ2hfaGVlbFwiOntcIm5hbWVcIjpcIkhpZ2gtSGVlbGVkIFNob2VcIixcInVuaWZpZWRcIjpcIjFGNDYwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTYsXCJzaGVldF95XCI6MixcInNob3J0X25hbWVzXCI6W1wiaGlnaF9oZWVsXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmFzaGlvblwiLFwic2hvZXNcIixcImZlbWFsZVwiLFwicHVtcHNcIixcInN0aWxldHRvXCJdLFwic2VhcmNoXCI6XCJoaWdoLGhlZWwsaGVlbGVkLHNob2UsZmFzaGlvbixzaG9lcyxmZW1hbGUscHVtcHMsc3RpbGV0dG9cIn0sXCJtdXNpY2FsX25vdGVcIjp7XCJuYW1lXCI6XCJNdXNpY2FsIE5vdGVcIixcInVuaWZpZWRcIjpcIjFGM0I1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OSxcInNoZWV0X3lcIjozNixcInNob3J0X25hbWVzXCI6W1wibXVzaWNhbF9ub3RlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic2NvcmVcIixcInRvbmVcIixcInNvdW5kXCJdLFwic2VhcmNoXCI6XCJtdXNpY2FsLG5vdGUsc2NvcmUsdG9uZSxzb3VuZFwifSxcImZsYWctc2hcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgU0hcIixcInVuaWZpZWRcIjpcIjFGMUY4LTFGMUVEXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzcsXCJzaGVldF95XCI6MzIsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctc2hcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsc2gscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZmxhZy1rblwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBLTlwiLFwidW5pZmllZFwiOlwiMUYxRjAtMUYxRjNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNSxcInNoZWV0X3lcIjozNSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1rblwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGtuLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcIm5vdGVzXCI6e1wibmFtZVwiOlwiTXVsdGlwbGUgTXVzaWNhbCBOb3Rlc1wiLFwidW5pZmllZFwiOlwiMUYzQjZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo5LFwic2hlZXRfeVwiOjM3LFwic2hvcnRfbmFtZXNcIjpbXCJub3Rlc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm11c2ljXCIsXCJzY29yZVwiXSxcInNlYXJjaFwiOlwibm90ZXMsbXVsdGlwbGUsbXVzaWNhbCxtdXNpYyxzY29yZVwifSxcInNhbmRhbFwiOntcIm5hbWVcIjpcIldvbWFucyBTYW5kYWxcIixcInVuaWZpZWRcIjpcIjFGNDYxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTYsXCJzaGVldF95XCI6MyxcInNob3J0X25hbWVzXCI6W1wic2FuZGFsXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic2hvZXNcIixcImZhc2hpb25cIixcImZsaXAgZmxvcHNcIl0sXCJzZWFyY2hcIjpcInNhbmRhbCx3b21hbnMsc2hvZXMsZmFzaGlvbixmbGlwIGZsb3BzXCJ9LFwiYm9vdFwiOntcIm5hbWVcIjpcIldvbWFucyBCb290c1wiLFwidW5pZmllZFwiOlwiMUY0NjJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxNixcInNoZWV0X3lcIjo0LFwic2hvcnRfbmFtZXNcIjpbXCJib290XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic2hvZXNcIixcImZhc2hpb25cIl0sXCJzZWFyY2hcIjpcImJvb3Qsd29tYW5zLGJvb3RzLHNob2VzLGZhc2hpb25cIn0sXCJ3YXZ5X2Rhc2hcIjp7XCJuYW1lXCI6XCJXYXZ5IERhc2hcIixcInVuaWZpZWRcIjpcIjMwMzBcIixcInZhcmlhdGlvbnNcIjpbXCIzMDMwLUZFMEZcIl0sXCJzaGVldF94XCI6NCxcInNoZWV0X3lcIjoyNixcInNob3J0X25hbWVzXCI6W1wid2F2eV9kYXNoXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZHJhd1wiLFwibGluZVwiLFwibW91c3RhY2hlXCIsXCJtdXN0YWNoZVwiLFwic3F1aWdnbGVcIixcInNjcmliYmxlXCJdLFwic2VhcmNoXCI6XCJ3YXZ5LGRhc2gsZHJhdyxsaW5lLG1vdXN0YWNoZSxtdXN0YWNoZSxzcXVpZ2dsZSxzY3JpYmJsZVwifSxcImZsYWctbGNcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgTENcIixcInVuaWZpZWRcIjpcIjFGMUYxLTFGMUU4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzYsXCJzaGVldF95XCI6MixcInNob3J0X25hbWVzXCI6W1wiZmxhZy1sY1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGxjLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImZsYWctcG1cIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgUE1cIixcInVuaWZpZWRcIjpcIjFGMUY1LTFGMUYyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzcsXCJzaGVldF95XCI6MTMsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctcG1cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcscG0scmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwibWFuc19zaG9lXCI6e1wibmFtZVwiOlwiTWFucyBTaG9lXCIsXCJ1bmlmaWVkXCI6XCIxRjQ1RVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE2LFwic2hlZXRfeVwiOjAsXCJzaG9ydF9uYW1lc1wiOltcIm1hbnNfc2hvZVwiLFwic2hvZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZhc2hpb25cIixcIm1hbGVcIl0sXCJzZWFyY2hcIjpcIm1hbnMsc2hvZSxmYXNoaW9uLG1hbGVcIn0sXCJjdXJseV9sb29wXCI6e1wibmFtZVwiOlwiQ3VybHkgTG9vcFwiLFwidW5pZmllZFwiOlwiMjdCMFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjQsXCJzaGVldF95XCI6MTUsXCJzaG9ydF9uYW1lc1wiOltcImN1cmx5X2xvb3BcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzY3JpYmJsZVwiLFwiZHJhd1wiLFwic2hhcGVcIixcInNxdWlnZ2xlXCJdLFwic2VhcmNoXCI6XCJjdXJseSxsb29wLHNjcmliYmxlLGRyYXcsc2hhcGUsc3F1aWdnbGVcIn0sXCJmbGFnLXZjXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFZDXCIsXCJ1bmlmaWVkXCI6XCIxRjFGQi0xRjFFOFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM4LFwic2hlZXRfeVwiOjMwLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXZjXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsdmMscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiaGVhdnlfY2hlY2tfbWFya1wiOntcIm5hbWVcIjpcIkhlYXZ5IENoZWNrIE1hcmtcIixcInVuaWZpZWRcIjpcIjI3MTRcIixcInZhcmlhdGlvbnNcIjpbXCIyNzE0LUZFMEZcIl0sXCJzaGVldF94XCI6MyxcInNoZWV0X3lcIjozNSxcInNob3J0X25hbWVzXCI6W1wiaGVhdnlfY2hlY2tfbWFya1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm9rXCIsXCJuaWtlXCIsXCJhbnN3ZXJcIixcInllc1wiLFwidGlja1wiXSxcInNlYXJjaFwiOlwiaGVhdnksY2hlY2ssbWFyayxvayxuaWtlLGFuc3dlcix5ZXMsdGlja1wifSxcImF0aGxldGljX3Nob2VcIjp7XCJuYW1lXCI6XCJBdGhsZXRpYyBTaG9lXCIsXCJ1bmlmaWVkXCI6XCIxRjQ1RlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjE2LFwic2hlZXRfeVwiOjEsXCJzaG9ydF9uYW1lc1wiOltcImF0aGxldGljX3Nob2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzaG9lc1wiLFwic3BvcnRzXCIsXCJzbmVha2Vyc1wiXSxcInNlYXJjaFwiOlwiYXRobGV0aWMsc2hvZSxzaG9lcyxzcG9ydHMsc25lYWtlcnNcIn0sXCJ3b21hbnNfaGF0XCI6e1wibmFtZVwiOlwiV29tYW5zIEhhdFwiLFwidW5pZmllZFwiOlwiMUY0NTJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxNSxcInNoZWV0X3lcIjoyOSxcInNob3J0X25hbWVzXCI6W1wid29tYW5zX2hhdFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZhc2hpb25cIixcImFjY2Vzc29yaWVzXCIsXCJmZW1hbGVcIixcImxhZHlcIixcInNwcmluZ1wiXSxcInNlYXJjaFwiOlwid29tYW5zLGhhdCxmYXNoaW9uLGFjY2Vzc29yaWVzLGZlbWFsZSxsYWR5LHNwcmluZ1wifSxcImZsYWctd3NcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgV1NcIixcInVuaWZpZWRcIjpcIjFGMUZDLTFGMUY4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzgsXCJzaGVldF95XCI6MzcsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctd3NcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyx3cyxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJhcnJvd3NfY2xvY2t3aXNlXCI6e1wibmFtZVwiOlwiQ2xvY2t3aXNlIERvd253YXJkcyBhbmQgVXB3YXJkcyBPcGVuIENpcmNsZSBBcnJvd3NcIixcInVuaWZpZWRcIjpcIjFGNTAzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjIsXCJzaGVldF95XCI6MjgsXCJzaG9ydF9uYW1lc1wiOltcImFycm93c19jbG9ja3dpc2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzeW5jXCIsXCJjeWNsZVwiLFwicm91bmRcIixcInJlcGVhdFwiXSxcInNlYXJjaFwiOlwiYXJyb3dzLGNsb2Nrd2lzZSxkb3dud2FyZHMsYW5kLHVwd2FyZHMsb3BlbixjaXJjbGUsc3luYyxjeWNsZSxyb3VuZCxyZXBlYXRcIn0sXCJoZWF2eV9wbHVzX3NpZ25cIjp7XCJuYW1lXCI6XCJIZWF2eSBQbHVzIFNpZ25cIixcInVuaWZpZWRcIjpcIjI3OTVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo0LFwic2hlZXRfeVwiOjExLFwic2hvcnRfbmFtZXNcIjpbXCJoZWF2eV9wbHVzX3NpZ25cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJtYXRoXCIsXCJjYWxjdWxhdGlvblwiLFwiYWRkaXRpb25cIixcIm1vcmVcIixcImluY3JlYXNlXCJdLFwic2VhcmNoXCI6XCJoZWF2eSxwbHVzLHNpZ24sbWF0aCxjYWxjdWxhdGlvbixhZGRpdGlvbixtb3JlLGluY3JlYXNlXCJ9LFwidG9waGF0XCI6e1wibmFtZVwiOlwiVG9wIEhhdFwiLFwidW5pZmllZFwiOlwiMUYzQTlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo5LFwic2hlZXRfeVwiOjI0LFwic2hvcnRfbmFtZXNcIjpbXCJ0b3BoYXRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJtYWdpY1wiLFwiZ2VudGxlbWFuXCIsXCJjbGFzc3lcIixcImNpcmN1c1wiXSxcInNlYXJjaFwiOlwidG9waGF0LHRvcCxoYXQsbWFnaWMsZ2VudGxlbWFuLGNsYXNzeSxjaXJjdXNcIn0sXCJmbGFnLXNtXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFNNXCIsXCJ1bmlmaWVkXCI6XCIxRjFGOC0xRjFGMlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM3LFwic2hlZXRfeVwiOjM3LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXNtXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsc20scmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiaGVsbWV0X3dpdGhfd2hpdGVfY3Jvc3NcIjp7XCJuYW1lXCI6XCJIZWxtZXQgd2l0aCBXaGl0ZSBDcm9zc1wiLFwidW5pZmllZFwiOlwiMjZEMVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIsXCJzaGVldF95XCI6MjUsXCJzaG9ydF9uYW1lc1wiOltcImhlbG1ldF93aXRoX3doaXRlX2Nyb3NzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImhlbG1ldCx3aXRoLHdoaXRlLGNyb3NzXCJ9LFwiaGVhdnlfbWludXNfc2lnblwiOntcIm5hbWVcIjpcIkhlYXZ5IE1pbnVzIFNpZ25cIixcInVuaWZpZWRcIjpcIjI3OTZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo0LFwic2hlZXRfeVwiOjEyLFwic2hvcnRfbmFtZXNcIjpbXCJoZWF2eV9taW51c19zaWduXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibWF0aFwiLFwiY2FsY3VsYXRpb25cIixcInN1YnRyYWN0XCIsXCJsZXNzXCJdLFwic2VhcmNoXCI6XCJoZWF2eSxtaW51cyxzaWduLG1hdGgsY2FsY3VsYXRpb24sc3VidHJhY3QsbGVzc1wifSxcImZsYWctc3RcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgU1RcIixcInVuaWZpZWRcIjpcIjFGMUY4LTFGMUY5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzgsXCJzaGVldF95XCI6MSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1zdFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHN0LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImZsYWctc2FcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgU0FcIixcInVuaWZpZWRcIjpcIjFGMUY4LTFGMUU2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzcsXCJzaGVldF95XCI6MjYsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctc2FcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxzYSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJoZWF2eV9kaXZpc2lvbl9zaWduXCI6e1wibmFtZVwiOlwiSGVhdnkgRGl2aXNpb24gU2lnblwiLFwidW5pZmllZFwiOlwiMjc5N1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjQsXCJzaGVldF95XCI6MTMsXCJzaG9ydF9uYW1lc1wiOltcImhlYXZ5X2RpdmlzaW9uX3NpZ25cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJkaXZpZGVcIixcIm1hdGhcIixcImNhbGN1bGF0aW9uXCJdLFwic2VhcmNoXCI6XCJoZWF2eSxkaXZpc2lvbixzaWduLGRpdmlkZSxtYXRoLGNhbGN1bGF0aW9uXCJ9LFwibW9ydGFyX2JvYXJkXCI6e1wibmFtZVwiOlwiR3JhZHVhdGlvbiBDYXBcIixcInVuaWZpZWRcIjpcIjFGMzkzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OSxcInNoZWV0X3lcIjo3LFwic2hvcnRfbmFtZXNcIjpbXCJtb3J0YXJfYm9hcmRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzY2hvb2xcIixcImNvbGxlZ2VcIixcImRlZ3JlZVwiLFwidW5pdmVyc2l0eVwiLFwiZ3JhZHVhdGlvblwiLFwiY2FwXCIsXCJoYXRcIixcImxlZ2FsXCIsXCJsZWFyblwiLFwiZWR1Y2F0aW9uXCJdLFwic2VhcmNoXCI6XCJtb3J0YXIsYm9hcmQsZ3JhZHVhdGlvbixjYXAsc2Nob29sLGNvbGxlZ2UsZGVncmVlLHVuaXZlcnNpdHksaGF0LGxlZ2FsLGxlYXJuLGVkdWNhdGlvblwifSxcImZsYWctc25cIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgU05cIixcInVuaWZpZWRcIjpcIjFGMUY4LTFGMUYzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzcsXCJzaGVldF95XCI6MzgsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctc25cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxzbixyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJoZWF2eV9tdWx0aXBsaWNhdGlvbl94XCI6e1wibmFtZVwiOlwiSGVhdnkgTXVsdGlwbGljYXRpb24gWFwiLFwidW5pZmllZFwiOlwiMjcxNlwiLFwidmFyaWF0aW9uc1wiOltcIjI3MTYtRkUwRlwiXSxcInNoZWV0X3hcIjozLFwic2hlZXRfeVwiOjM2LFwic2hvcnRfbmFtZXNcIjpbXCJoZWF2eV9tdWx0aXBsaWNhdGlvbl94XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibWF0aFwiLFwiY2FsY3VsYXRpb25cIl0sXCJzZWFyY2hcIjpcImhlYXZ5LG11bHRpcGxpY2F0aW9uLHgsbWF0aCxjYWxjdWxhdGlvblwifSxcImNyb3duXCI6e1wibmFtZVwiOlwiQ3Jvd25cIixcInVuaWZpZWRcIjpcIjFGNDUxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTUsXCJzaGVldF95XCI6MjgsXCJzaG9ydF9uYW1lc1wiOltcImNyb3duXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wia2luZ1wiLFwia29kXCIsXCJsZWFkZXJcIixcInJveWFsdHlcIixcImxvcmRcIl0sXCJzZWFyY2hcIjpcImNyb3duLGtpbmcsa29kLGxlYWRlcixyb3lhbHR5LGxvcmRcIn0sXCJzY2hvb2xfc2F0Y2hlbFwiOntcIm5hbWVcIjpcIlNjaG9vbCBTYXRjaGVsXCIsXCJ1bmlmaWVkXCI6XCIxRjM5MlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjksXCJzaGVldF95XCI6NixcInNob3J0X25hbWVzXCI6W1wic2Nob29sX3NhdGNoZWxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzdHVkZW50XCIsXCJlZHVjYXRpb25cIixcImJhZ1wiXSxcInNlYXJjaFwiOlwic2Nob29sLHNhdGNoZWwsc3R1ZGVudCxlZHVjYXRpb24sYmFnXCJ9LFwiZmxhZy1yc1wiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBSU1wiLFwidW5pZmllZFwiOlwiMUYxRjctMUYxRjhcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNyxcInNoZWV0X3lcIjoyMyxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1yc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHJzLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImhlYXZ5X2RvbGxhcl9zaWduXCI6e1wibmFtZVwiOlwiSGVhdnkgRG9sbGFyIFNpZ25cIixcInVuaWZpZWRcIjpcIjFGNEIyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjAsXCJzaGVldF95XCI6MzAsXCJzaG9ydF9uYW1lc1wiOltcImhlYXZ5X2RvbGxhcl9zaWduXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibW9uZXlcIixcInNhbGVzXCIsXCJwYXltZW50XCIsXCJjdXJyZW5jeVwiLFwiYnVja1wiXSxcInNlYXJjaFwiOlwiaGVhdnksZG9sbGFyLHNpZ24sbW9uZXksc2FsZXMscGF5bWVudCxjdXJyZW5jeSxidWNrXCJ9LFwiZmxhZy1zY1wiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBTQ1wiLFwidW5pZmllZFwiOlwiMUYxRjgtMUYxRThcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNyxcInNoZWV0X3lcIjoyOCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1zY1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHNjLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImN1cnJlbmN5X2V4Y2hhbmdlXCI6e1wibmFtZVwiOlwiQ3VycmVuY3kgRXhjaGFuZ2VcIixcInVuaWZpZWRcIjpcIjFGNEIxXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjAsXCJzaGVldF95XCI6MjksXCJzaG9ydF9uYW1lc1wiOltcImN1cnJlbmN5X2V4Y2hhbmdlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wibW9uZXlcIixcInNhbGVzXCIsXCJkb2xsYXJcIixcInRyYXZlbFwiXSxcInNlYXJjaFwiOlwiY3VycmVuY3ksZXhjaGFuZ2UsbW9uZXksc2FsZXMsZG9sbGFyLHRyYXZlbFwifSxcInBvdWNoXCI6e1wibmFtZVwiOlwiUG91Y2hcIixcInVuaWZpZWRcIjpcIjFGNDVEXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTUsXCJzaGVldF95XCI6NDAsXCJzaG9ydF9uYW1lc1wiOltcInBvdWNoXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiYmFnXCIsXCJhY2Nlc3Nvcmllc1wiLFwic2hvcHBpbmdcIl0sXCJzZWFyY2hcIjpcInBvdWNoLGJhZyxhY2Nlc3NvcmllcyxzaG9wcGluZ1wifSxcInB1cnNlXCI6e1wibmFtZVwiOlwiUHVyc2VcIixcInVuaWZpZWRcIjpcIjFGNDVCXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTUsXCJzaGVldF95XCI6MzgsXCJzaG9ydF9uYW1lc1wiOltcInB1cnNlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiZmFzaGlvblwiLFwiYWNjZXNzb3JpZXNcIixcIm1vbmV5XCIsXCJzYWxlc1wiLFwic2hvcHBpbmdcIl0sXCJzZWFyY2hcIjpcInB1cnNlLGZhc2hpb24sYWNjZXNzb3JpZXMsbW9uZXksc2FsZXMsc2hvcHBpbmdcIn0sXCJmbGFnLXNsXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFNMXCIsXCJ1bmlmaWVkXCI6XCIxRjFGOC0xRjFGMVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM3LFwic2hlZXRfeVwiOjM2LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXNsXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsc2wscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiY29weXJpZ2h0XCI6e1wibmFtZVwiOlwiQ29weXJpZ2h0IFNpZ25cIixcInVuaWZpZWRcIjpcIjAwQTlcIixcInZhcmlhdGlvbnNcIjpbXCIwMEE5LUZFMEZcIl0sXCJzaGVldF94XCI6MCxcInNoZWV0X3lcIjowLFwic2hvcnRfbmFtZXNcIjpbXCJjb3B5cmlnaHRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOmZhbHNlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiaXBcIixcImxpY2Vuc2VcIixcImNpcmNsZVwiLFwibGF3XCIsXCJsZWdhbFwiXSxcInNlYXJjaFwiOlwiY29weXJpZ2h0LHNpZ24saXAsbGljZW5zZSxjaXJjbGUsbGF3LGxlZ2FsXCJ9LFwiaGFuZGJhZ1wiOntcIm5hbWVcIjpcIkhhbmRiYWdcIixcInVuaWZpZWRcIjpcIjFGNDVDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTUsXCJzaGVldF95XCI6MzksXCJzaG9ydF9uYW1lc1wiOltcImhhbmRiYWdcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJmYXNoaW9uXCIsXCJhY2Nlc3NvcnlcIixcImFjY2Vzc29yaWVzXCIsXCJzaG9wcGluZ1wiXSxcInNlYXJjaFwiOlwiaGFuZGJhZyxmYXNoaW9uLGFjY2Vzc29yeSxhY2Nlc3NvcmllcyxzaG9wcGluZ1wifSxcImZsYWctc2dcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgU0dcIixcInVuaWZpZWRcIjpcIjFGMUY4LTFGMUVDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzcsXCJzaGVldF95XCI6MzEsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctc2dcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxzZyxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJyZWdpc3RlcmVkXCI6e1wibmFtZVwiOlwiUmVnaXN0ZXJlZCBTaWduXCIsXCJ1bmlmaWVkXCI6XCIwMEFFXCIsXCJ2YXJpYXRpb25zXCI6W1wiMDBBRS1GRTBGXCJdLFwic2hlZXRfeFwiOjAsXCJzaGVldF95XCI6MSxcInNob3J0X25hbWVzXCI6W1wicmVnaXN0ZXJlZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6ZmFsc2UsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhbHBoYWJldFwiLFwiY2lyY2xlXCJdLFwic2VhcmNoXCI6XCJyZWdpc3RlcmVkLHNpZ24sYWxwaGFiZXQsY2lyY2xlXCJ9LFwiYnJpZWZjYXNlXCI6e1wibmFtZVwiOlwiQnJpZWZjYXNlXCIsXCJ1bmlmaWVkXCI6XCIxRjRCQ1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIwLFwic2hlZXRfeVwiOjQwLFwic2hvcnRfbmFtZXNcIjpbXCJicmllZmNhc2VcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJidXNpbmVzc1wiLFwiZG9jdW1lbnRzXCIsXCJ3b3JrXCIsXCJsYXdcIixcImxlZ2FsXCJdLFwic2VhcmNoXCI6XCJicmllZmNhc2UsYnVzaW5lc3MsZG9jdW1lbnRzLHdvcmssbGF3LGxlZ2FsXCJ9LFwiZmxhZy1zeFwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBTWFwiLFwidW5pZmllZFwiOlwiMUYxRjgtMUYxRkRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozOCxcInNoZWV0X3lcIjozLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXN4XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsc3gscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwidG1cIjp7XCJuYW1lXCI6XCJUcmFkZSBNYXJrIFNpZ25cIixcInVuaWZpZWRcIjpcIjIxMjJcIixcInZhcmlhdGlvbnNcIjpbXCIyMTIyLUZFMEZcIl0sXCJzaGVldF94XCI6MCxcInNoZWV0X3lcIjo0LFwic2hvcnRfbmFtZXNcIjpbXCJ0bVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6ZmFsc2UsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ0cmFkZW1hcmtcIixcImJyYW5kXCIsXCJsYXdcIixcImxlZ2FsXCJdLFwic2VhcmNoXCI6XCJ0bSx0cmFkZSxtYXJrLHNpZ24sdHJhZGVtYXJrLGJyYW5kLGxhdyxsZWdhbFwifSxcImZsYWctc2tcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgU0tcIixcInVuaWZpZWRcIjpcIjFGMUY4LTFGMUYwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzcsXCJzaGVldF95XCI6MzUsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctc2tcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxzayxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJleWVnbGFzc2VzXCI6e1wibmFtZVwiOlwiRXllZ2xhc3Nlc1wiLFwidW5pZmllZFwiOlwiMUY0NTNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxNSxcInNoZWV0X3lcIjozMCxcInNob3J0X25hbWVzXCI6W1wiZXllZ2xhc3Nlc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZhc2hpb25cIixcImFjY2Vzc29yaWVzXCIsXCJleWVzaWdodFwiLFwibmVyZHlcIixcImRvcmtcIixcImdlZWtcIl0sXCJzZWFyY2hcIjpcImV5ZWdsYXNzZXMsZmFzaGlvbixhY2Nlc3NvcmllcyxleWVzaWdodCxuZXJkeSxkb3JrLGdlZWtcIn0sXCJlbmRcIjp7XCJuYW1lXCI6XCJFbmQgd2l0aCBMZWZ0d2FyZHMgQXJyb3cgQWJvdmVcIixcInVuaWZpZWRcIjpcIjFGNTFBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjMsXCJzaGVldF95XCI6MTAsXCJzaG9ydF9uYW1lc1wiOltcImVuZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIndvcmRzXCIsXCJhcnJvd1wiXSxcInNlYXJjaFwiOlwiZW5kLHdpdGgsbGVmdHdhcmRzLGFycm93LGFib3ZlLHdvcmRzXCJ9LFwiZGFya19zdW5nbGFzc2VzXCI6e1wibmFtZVwiOlwiRGFyayBTdW5nbGFzc2VzXCIsXCJ1bmlmaWVkXCI6XCIxRjU3NlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI1LFwic2hlZXRfeVwiOjQsXCJzaG9ydF9uYW1lc1wiOltcImRhcmtfc3VuZ2xhc3Nlc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImZhY2VcIixcImNvb2xcIixcImFjY2Vzc29yaWVzXCJdLFwic2VhcmNoXCI6XCJkYXJrLHN1bmdsYXNzZXMsZmFjZSxjb29sLGFjY2Vzc29yaWVzXCJ9LFwiZmxhZy1zaVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBTSVwiLFwidW5pZmllZFwiOlwiMUYxRjgtMUYxRUVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNyxcInNoZWV0X3lcIjozMyxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1zaVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHNpLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImJhY2tcIjp7XCJuYW1lXCI6XCJCYWNrIHdpdGggTGVmdHdhcmRzIEFycm93IEFib3ZlXCIsXCJ1bmlmaWVkXCI6XCIxRjUxOVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIzLFwic2hlZXRfeVwiOjksXCJzaG9ydF9uYW1lc1wiOltcImJhY2tcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhcnJvd1wiLFwid29yZHNcIixcInJldHVyblwiXSxcInNlYXJjaFwiOlwiYmFjayx3aXRoLGxlZnR3YXJkcyxhcnJvdyxhYm92ZSx3b3JkcyxyZXR1cm5cIn0sXCJyaW5nXCI6e1wibmFtZVwiOlwiUmluZ1wiLFwidW5pZmllZFwiOlwiMUY0OERcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxOSxcInNoZWV0X3lcIjoyOSxcInNob3J0X25hbWVzXCI6W1wicmluZ1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIndlZGRpbmdcIixcInByb3Bvc2VcIixcIm1hcnJpYWdlXCIsXCJ2YWxlbnRpbmVzXCIsXCJkaWFtb25kXCIsXCJmYXNoaW9uXCIsXCJqZXdlbHJ5XCIsXCJnZW1cIl0sXCJzZWFyY2hcIjpcInJpbmcsd2VkZGluZyxwcm9wb3NlLG1hcnJpYWdlLHZhbGVudGluZXMsZGlhbW9uZCxmYXNoaW9uLGpld2VscnksZ2VtXCJ9LFwiZmxhZy1zYlwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBTQlwiLFwidW5pZmllZFwiOlwiMUYxRjgtMUYxRTdcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNyxcInNoZWV0X3lcIjoyNyxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1zYlwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHNiLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcIm9uXCI6e1wibmFtZVwiOlwiT24gd2l0aCBFeGNsYW1hdGlvbiBNYXJrIHdpdGggTGVmdCBSaWdodCBBcnJvdyBBYm92ZVwiLFwidW5pZmllZFwiOlwiMUY1MUJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMyxcInNoZWV0X3lcIjoxMSxcInNob3J0X25hbWVzXCI6W1wib25cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhcnJvd1wiLFwid29yZHNcIl0sXCJzZWFyY2hcIjpcIm9uLHdpdGgsZXhjbGFtYXRpb24sbWFyayxsZWZ0LHJpZ2h0LGFycm93LGFib3ZlLHdvcmRzXCJ9LFwidG9wXCI6e1wibmFtZVwiOlwiVG9wIHdpdGggVXB3YXJkcyBBcnJvdyBBYm92ZVwiLFwidW5pZmllZFwiOlwiMUY1MURcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMyxcInNoZWV0X3lcIjoxMyxcInNob3J0X25hbWVzXCI6W1widG9wXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wid29yZHNcIixcImJsdWUtc3F1YXJlXCJdLFwic2VhcmNoXCI6XCJ0b3Asd2l0aCx1cHdhcmRzLGFycm93LGFib3ZlLHdvcmRzLGJsdWUtc3F1YXJlXCJ9LFwiZmxhZy1zb1wiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBTT1wiLFwidW5pZmllZFwiOlwiMUYxRjgtMUYxRjRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNyxcInNoZWV0X3lcIjozOSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1zb1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHNvLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImNsb3NlZF91bWJyZWxsYVwiOntcIm5hbWVcIjpcIkNsb3NlZCBVbWJyZWxsYVwiLFwidW5pZmllZFwiOlwiMUYzMDJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjo1LFwic2hlZXRfeVwiOjIzLFwic2hvcnRfbmFtZXNcIjpbXCJjbG9zZWRfdW1icmVsbGFcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ3ZWF0aGVyXCIsXCJyYWluXCIsXCJkcml6emxlXCJdLFwic2VhcmNoXCI6XCJjbG9zZWQsdW1icmVsbGEsd2VhdGhlcixyYWluLGRyaXp6bGVcIn0sXCJmbGFnLXphXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFpBXCIsXCJ1bmlmaWVkXCI6XCIxRjFGRi0xRjFFNlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM5LFwic2hlZXRfeVwiOjAsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctemFcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyx6YSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJzb29uXCI6e1wibmFtZVwiOlwiU29vbiB3aXRoIFJpZ2h0d2FyZHMgQXJyb3cgQWJvdmVcIixcInVuaWZpZWRcIjpcIjFGNTFDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjMsXCJzaGVldF95XCI6MTIsXCJzaG9ydF9uYW1lc1wiOltcInNvb25cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJhcnJvd1wiLFwid29yZHNcIl0sXCJzZWFyY2hcIjpcInNvb24sd2l0aCxyaWdodHdhcmRzLGFycm93LGFib3ZlLHdvcmRzXCJ9LFwiZmxhZy1nc1wiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBHU1wiLFwidW5pZmllZFwiOlwiMUYxRUMtMUYxRjhcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNSxcInNoZWV0X3lcIjo0LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWdzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGdzLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImJhbGxvdF9ib3hfd2l0aF9jaGVja1wiOntcIm5hbWVcIjpcIkJhbGxvdCBCb3ggd2l0aCBDaGVja1wiLFwidW5pZmllZFwiOlwiMjYxMVwiLFwidmFyaWF0aW9uc1wiOltcIjI2MTEtRkUwRlwiXSxcInNoZWV0X3hcIjoxLFwic2hlZXRfeVwiOjYsXCJzaG9ydF9uYW1lc1wiOltcImJhbGxvdF9ib3hfd2l0aF9jaGVja1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIm9rXCIsXCJhZ3JlZVwiLFwiY29uZmlybVwiLFwiYmxhY2stc3F1YXJlXCIsXCJ2b3RlXCIsXCJlbGVjdGlvblwiLFwieWVzXCJdLFwic2VhcmNoXCI6XCJiYWxsb3QsYm94LHdpdGgsY2hlY2ssb2ssYWdyZWUsY29uZmlybSxibGFjay1zcXVhcmUsdm90ZSxlbGVjdGlvbix5ZXNcIn0sXCJyYWRpb19idXR0b25cIjp7XCJuYW1lXCI6XCJSYWRpbyBCdXR0b25cIixcInVuaWZpZWRcIjpcIjFGNTE4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjMsXCJzaGVldF95XCI6OCxcInNob3J0X25hbWVzXCI6W1wicmFkaW9fYnV0dG9uXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiaW5wdXRcIixcIm9sZFwiLFwibXVzaWNcIixcImNpcmNsZVwiXSxcInNlYXJjaFwiOlwicmFkaW8sYnV0dG9uLGlucHV0LG9sZCxtdXNpYyxjaXJjbGVcIn0sXCJmbGFnLWtyXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEtSXCIsXCJ1bmlmaWVkXCI6XCIxRjFGMC0xRjFGN1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM1LFwic2hlZXRfeVwiOjM3LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWtyXCIsXCJrclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGtyLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImZsYWctc3NcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgU1NcIixcInVuaWZpZWRcIjpcIjFGMUY4LTFGMUY4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzgsXCJzaGVldF95XCI6MCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1zc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHNzLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcIndoaXRlX2NpcmNsZVwiOntcIm5hbWVcIjpcIk1lZGl1bSBXaGl0ZSBDaXJjbGVcIixcInVuaWZpZWRcIjpcIjI2QUFcIixcInZhcmlhdGlvbnNcIjpbXCIyNkFBLUZFMEZcIl0sXCJzaGVldF94XCI6MixcInNoZWV0X3lcIjoxNCxcInNob3J0X25hbWVzXCI6W1wid2hpdGVfY2lyY2xlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic2hhcGVcIixcInJvdW5kXCJdLFwic2VhcmNoXCI6XCJ3aGl0ZSxjaXJjbGUsbWVkaXVtLHNoYXBlLHJvdW5kXCJ9LFwiZmxhZy1lc1wiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBFU1wiLFwidW5pZmllZFwiOlwiMUYxRUEtMUYxRjhcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNCxcInNoZWV0X3lcIjoyMixcInNob3J0X25hbWVzXCI6W1wiZmxhZy1lc1wiLFwiZXNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxlcyxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJibGFja19jaXJjbGVcIjp7XCJuYW1lXCI6XCJNZWRpdW0gQmxhY2sgQ2lyY2xlXCIsXCJ1bmlmaWVkXCI6XCIyNkFCXCIsXCJ2YXJpYXRpb25zXCI6W1wiMjZBQi1GRTBGXCJdLFwic2hlZXRfeFwiOjIsXCJzaGVldF95XCI6MTUsXCJzaG9ydF9uYW1lc1wiOltcImJsYWNrX2NpcmNsZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNoYXBlXCIsXCJidXR0b25cIixcInJvdW5kXCJdLFwic2VhcmNoXCI6XCJibGFjayxjaXJjbGUsbWVkaXVtLHNoYXBlLGJ1dHRvbixyb3VuZFwifSxcImZsYWctbGtcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgTEtcIixcInVuaWZpZWRcIjpcIjFGMUYxLTFGMUYwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzYsXCJzaGVldF95XCI6NCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1sa1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGxrLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcInJlZF9jaXJjbGVcIjp7XCJuYW1lXCI6XCJMYXJnZSBSZWQgQ2lyY2xlXCIsXCJ1bmlmaWVkXCI6XCIxRjUzNFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIzLFwic2hlZXRfeVwiOjM2LFwic2hvcnRfbmFtZXNcIjpbXCJyZWRfY2lyY2xlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic2hhcGVcIixcImVycm9yXCIsXCJkYW5nZXJcIl0sXCJzZWFyY2hcIjpcInJlZCxjaXJjbGUsbGFyZ2Usc2hhcGUsZXJyb3IsZGFuZ2VyXCJ9LFwiZmxhZy1zZFwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBTRFwiLFwidW5pZmllZFwiOlwiMUYxRjgtMUYxRTlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNyxcInNoZWV0X3lcIjoyOSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1zZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHNkLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImxhcmdlX2JsdWVfY2lyY2xlXCI6e1wibmFtZVwiOlwiTGFyZ2UgQmx1ZSBDaXJjbGVcIixcInVuaWZpZWRcIjpcIjFGNTM1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjMsXCJzaGVldF95XCI6MzcsXCJzaG9ydF9uYW1lc1wiOltcImxhcmdlX2JsdWVfY2lyY2xlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic2hhcGVcIixcImljb25cIixcImJ1dHRvblwiXSxcInNlYXJjaFwiOlwibGFyZ2UsYmx1ZSxjaXJjbGUsc2hhcGUsaWNvbixidXR0b25cIn0sXCJzbWFsbF9vcmFuZ2VfZGlhbW9uZFwiOntcIm5hbWVcIjpcIlNtYWxsIE9yYW5nZSBEaWFtb25kXCIsXCJ1bmlmaWVkXCI6XCIxRjUzOFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIzLFwic2hlZXRfeVwiOjQwLFwic2hvcnRfbmFtZXNcIjpbXCJzbWFsbF9vcmFuZ2VfZGlhbW9uZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNoYXBlXCIsXCJqZXdlbFwiLFwiZ2VtXCJdLFwic2VhcmNoXCI6XCJzbWFsbCxvcmFuZ2UsZGlhbW9uZCxzaGFwZSxqZXdlbCxnZW1cIn0sXCJmbGFnLXNyXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFNSXCIsXCJ1bmlmaWVkXCI6XCIxRjFGOC0xRjFGN1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM3LFwic2hlZXRfeVwiOjQwLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXNyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsc3IscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwic21hbGxfYmx1ZV9kaWFtb25kXCI6e1wibmFtZVwiOlwiU21hbGwgQmx1ZSBEaWFtb25kXCIsXCJ1bmlmaWVkXCI6XCIxRjUzOVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI0LFwic2hlZXRfeVwiOjAsXCJzaG9ydF9uYW1lc1wiOltcInNtYWxsX2JsdWVfZGlhbW9uZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNoYXBlXCIsXCJqZXdlbFwiLFwiZ2VtXCJdLFwic2VhcmNoXCI6XCJzbWFsbCxibHVlLGRpYW1vbmQsc2hhcGUsamV3ZWwsZ2VtXCJ9LFwiZmxhZy1zelwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBTWlwiLFwidW5pZmllZFwiOlwiMUYxRjgtMUYxRkZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozOCxcInNoZWV0X3lcIjo1LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXN6XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsc3oscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwibGFyZ2Vfb3JhbmdlX2RpYW1vbmRcIjp7XCJuYW1lXCI6XCJMYXJnZSBPcmFuZ2UgRGlhbW9uZFwiLFwidW5pZmllZFwiOlwiMUY1MzZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMyxcInNoZWV0X3lcIjozOCxcInNob3J0X25hbWVzXCI6W1wibGFyZ2Vfb3JhbmdlX2RpYW1vbmRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzaGFwZVwiLFwiamV3ZWxcIixcImdlbVwiXSxcInNlYXJjaFwiOlwibGFyZ2Usb3JhbmdlLGRpYW1vbmQsc2hhcGUsamV3ZWwsZ2VtXCJ9LFwiZmxhZy1zZVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBTRVwiLFwidW5pZmllZFwiOlwiMUYxRjgtMUYxRUFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNyxcInNoZWV0X3lcIjozMCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1zZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHNlLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImZsYWctY2hcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQ0hcIixcInVuaWZpZWRcIjpcIjFGMUU4LTFGMUVEXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzMsXCJzaGVldF95XCI6MzUsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctY2hcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxjaCxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJsYXJnZV9ibHVlX2RpYW1vbmRcIjp7XCJuYW1lXCI6XCJMYXJnZSBCbHVlIERpYW1vbmRcIixcInVuaWZpZWRcIjpcIjFGNTM3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjMsXCJzaGVldF95XCI6MzksXCJzaG9ydF9uYW1lc1wiOltcImxhcmdlX2JsdWVfZGlhbW9uZFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNoYXBlXCIsXCJqZXdlbFwiLFwiZ2VtXCJdLFwic2VhcmNoXCI6XCJsYXJnZSxibHVlLGRpYW1vbmQsc2hhcGUsamV3ZWwsZ2VtXCJ9LFwiZmxhZy1zeVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBTWVwiLFwidW5pZmllZFwiOlwiMUYxRjgtMUYxRkVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozOCxcInNoZWV0X3lcIjo0LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXN5XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsc3kscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwic21hbGxfcmVkX3RyaWFuZ2xlXCI6e1wibmFtZVwiOlwiVXAtUG9pbnRpbmcgUmVkIFRyaWFuZ2xlXCIsXCJ1bmlmaWVkXCI6XCIxRjUzQVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI0LFwic2hlZXRfeVwiOjEsXCJzaG9ydF9uYW1lc1wiOltcInNtYWxsX3JlZF90cmlhbmdsZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNoYXBlXCIsXCJkaXJlY3Rpb25cIixcInVwXCIsXCJ0b3BcIl0sXCJzZWFyY2hcIjpcInNtYWxsLHJlZCx0cmlhbmdsZSx1cCxwb2ludGluZyxzaGFwZSxkaXJlY3Rpb24sdG9wXCJ9LFwiZmxhZy10d1wiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBUV1wiLFwidW5pZmllZFwiOlwiMUYxRjktMUYxRkNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozOCxcInNoZWV0X3lcIjoyMSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy10d1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHR3LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImJsYWNrX3NtYWxsX3NxdWFyZVwiOntcIm5hbWVcIjpcIkJsYWNrIFNtYWxsIFNxdWFyZVwiLFwidW5pZmllZFwiOlwiMjVBQVwiLFwidmFyaWF0aW9uc1wiOltcIjI1QUEtRkUwRlwiXSxcInNoZWV0X3hcIjowLFwic2hlZXRfeVwiOjMzLFwic2hvcnRfbmFtZXNcIjpbXCJibGFja19zbWFsbF9zcXVhcmVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzaGFwZVwiLFwiaWNvblwiXSxcInNlYXJjaFwiOlwiYmxhY2ssc21hbGwsc3F1YXJlLHNoYXBlLGljb25cIn0sXCJ3aGl0ZV9zbWFsbF9zcXVhcmVcIjp7XCJuYW1lXCI6XCJXaGl0ZSBTbWFsbCBTcXVhcmVcIixcInVuaWZpZWRcIjpcIjI1QUJcIixcInZhcmlhdGlvbnNcIjpbXCIyNUFCLUZFMEZcIl0sXCJzaGVldF94XCI6MCxcInNoZWV0X3lcIjozNCxcInNob3J0X25hbWVzXCI6W1wid2hpdGVfc21hbGxfc3F1YXJlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic2hhcGVcIixcImljb25cIl0sXCJzZWFyY2hcIjpcIndoaXRlLHNtYWxsLHNxdWFyZSxzaGFwZSxpY29uXCJ9LFwiZmxhZy10alwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBUSlwiLFwidW5pZmllZFwiOlwiMUYxRjktMUYxRUZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozOCxcInNoZWV0X3lcIjoxMixcInNob3J0X25hbWVzXCI6W1wiZmxhZy10alwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHRqLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImJsYWNrX2xhcmdlX3NxdWFyZVwiOntcIm5hbWVcIjpcIkJsYWNrIExhcmdlIFNxdWFyZVwiLFwidW5pZmllZFwiOlwiMkIxQlwiLFwidmFyaWF0aW9uc1wiOltcIjJCMUItRkUwRlwiXSxcInNoZWV0X3hcIjo0LFwic2hlZXRfeVwiOjIyLFwic2hvcnRfbmFtZXNcIjpbXCJibGFja19sYXJnZV9zcXVhcmVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzaGFwZVwiLFwiaWNvblwiLFwiYnV0dG9uXCJdLFwic2VhcmNoXCI6XCJibGFjayxsYXJnZSxzcXVhcmUsc2hhcGUsaWNvbixidXR0b25cIn0sXCJmbGFnLXR6XCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFRaXCIsXCJ1bmlmaWVkXCI6XCIxRjFGOS0xRjFGRlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM4LFwic2hlZXRfeVwiOjIyLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXR6XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsdHoscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwid2hpdGVfbGFyZ2Vfc3F1YXJlXCI6e1wibmFtZVwiOlwiV2hpdGUgTGFyZ2UgU3F1YXJlXCIsXCJ1bmlmaWVkXCI6XCIyQjFDXCIsXCJ2YXJpYXRpb25zXCI6W1wiMkIxQy1GRTBGXCJdLFwic2hlZXRfeFwiOjQsXCJzaGVldF95XCI6MjMsXCJzaG9ydF9uYW1lc1wiOltcIndoaXRlX2xhcmdlX3NxdWFyZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNoYXBlXCIsXCJpY29uXCIsXCJzdG9uZVwiLFwiYnV0dG9uXCJdLFwic2VhcmNoXCI6XCJ3aGl0ZSxsYXJnZSxzcXVhcmUsc2hhcGUsaWNvbixzdG9uZSxidXR0b25cIn0sXCJmbGFnLXRoXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFRIXCIsXCJ1bmlmaWVkXCI6XCIxRjFGOS0xRjFFRFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM4LFwic2hlZXRfeVwiOjExLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXRoXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsdGgscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZmxhZy10bFwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBUTFwiLFwidW5pZmllZFwiOlwiMUYxRjktMUYxRjFcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozOCxcInNoZWV0X3lcIjoxNCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy10bFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHRsLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcInNtYWxsX3JlZF90cmlhbmdsZV9kb3duXCI6e1wibmFtZVwiOlwiRG93bi1Qb2ludGluZyBSZWQgVHJpYW5nbGVcIixcInVuaWZpZWRcIjpcIjFGNTNCXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjQsXCJzaGVldF95XCI6MixcInNob3J0X25hbWVzXCI6W1wic21hbGxfcmVkX3RyaWFuZ2xlX2Rvd25cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzaGFwZVwiLFwiZGlyZWN0aW9uXCIsXCJib3R0b21cIl0sXCJzZWFyY2hcIjpcInNtYWxsLHJlZCx0cmlhbmdsZSxkb3duLHBvaW50aW5nLHNoYXBlLGRpcmVjdGlvbixib3R0b21cIn0sXCJmbGFnLXRnXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFRHXCIsXCJ1bmlmaWVkXCI6XCIxRjFGOS0xRjFFQ1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM4LFwic2hlZXRfeVwiOjEwLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXRnXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsdGcscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiYmxhY2tfbWVkaXVtX3NxdWFyZVwiOntcIm5hbWVcIjpcIkJsYWNrIE1lZGl1bSBTcXVhcmVcIixcInVuaWZpZWRcIjpcIjI1RkNcIixcInZhcmlhdGlvbnNcIjpbXCIyNUZDLUZFMEZcIl0sXCJzaGVldF94XCI6MCxcInNoZWV0X3lcIjozOCxcInNob3J0X25hbWVzXCI6W1wiYmxhY2tfbWVkaXVtX3NxdWFyZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNoYXBlXCIsXCJidXR0b25cIixcImljb25cIl0sXCJzZWFyY2hcIjpcImJsYWNrLG1lZGl1bSxzcXVhcmUsc2hhcGUsYnV0dG9uLGljb25cIn0sXCJmbGFnLXRrXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFRLXCIsXCJ1bmlmaWVkXCI6XCIxRjFGOS0xRjFGMFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM4LFwic2hlZXRfeVwiOjEzLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXRrXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsdGsscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwid2hpdGVfbWVkaXVtX3NxdWFyZVwiOntcIm5hbWVcIjpcIldoaXRlIE1lZGl1bSBTcXVhcmVcIixcInVuaWZpZWRcIjpcIjI1RkJcIixcInZhcmlhdGlvbnNcIjpbXCIyNUZCLUZFMEZcIl0sXCJzaGVldF94XCI6MCxcInNoZWV0X3lcIjozNyxcInNob3J0X25hbWVzXCI6W1wid2hpdGVfbWVkaXVtX3NxdWFyZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNoYXBlXCIsXCJzdG9uZVwiLFwiaWNvblwiXSxcInNlYXJjaFwiOlwid2hpdGUsbWVkaXVtLHNxdWFyZSxzaGFwZSxzdG9uZSxpY29uXCJ9LFwiZmxhZy10b1wiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBUT1wiLFwidW5pZmllZFwiOlwiMUYxRjktMUYxRjRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozOCxcInNoZWV0X3lcIjoxNyxcInNob3J0X25hbWVzXCI6W1wiZmxhZy10b1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHRvLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImJsYWNrX21lZGl1bV9zbWFsbF9zcXVhcmVcIjp7XCJuYW1lXCI6XCJCbGFjayBNZWRpdW0gU21hbGwgU3F1YXJlXCIsXCJ1bmlmaWVkXCI6XCIyNUZFXCIsXCJ2YXJpYXRpb25zXCI6W1wiMjVGRS1GRTBGXCJdLFwic2hlZXRfeFwiOjAsXCJzaGVldF95XCI6NDAsXCJzaG9ydF9uYW1lc1wiOltcImJsYWNrX21lZGl1bV9zbWFsbF9zcXVhcmVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJpY29uXCIsXCJzaGFwZVwiLFwiYnV0dG9uXCJdLFwic2VhcmNoXCI6XCJibGFjayxtZWRpdW0sc21hbGwsc3F1YXJlLGljb24sc2hhcGUsYnV0dG9uXCJ9LFwid2hpdGVfbWVkaXVtX3NtYWxsX3NxdWFyZVwiOntcIm5hbWVcIjpcIldoaXRlIE1lZGl1bSBTbWFsbCBTcXVhcmVcIixcInVuaWZpZWRcIjpcIjI1RkRcIixcInZhcmlhdGlvbnNcIjpbXCIyNUZELUZFMEZcIl0sXCJzaGVldF94XCI6MCxcInNoZWV0X3lcIjozOSxcInNob3J0X25hbWVzXCI6W1wid2hpdGVfbWVkaXVtX3NtYWxsX3NxdWFyZVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInNoYXBlXCIsXCJzdG9uZVwiLFwiaWNvblwiLFwiYnV0dG9uXCJdLFwic2VhcmNoXCI6XCJ3aGl0ZSxtZWRpdW0sc21hbGwsc3F1YXJlLHNoYXBlLHN0b25lLGljb24sYnV0dG9uXCJ9LFwiZmxhZy10dFwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBUVFwiLFwidW5pZmllZFwiOlwiMUYxRjktMUYxRjlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozOCxcInNoZWV0X3lcIjoxOSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy10dFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHR0LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImJsYWNrX3NxdWFyZV9idXR0b25cIjp7XCJuYW1lXCI6XCJCbGFjayBTcXVhcmUgQnV0dG9uXCIsXCJ1bmlmaWVkXCI6XCIxRjUzMlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIzLFwic2hlZXRfeVwiOjM0LFwic2hvcnRfbmFtZXNcIjpbXCJibGFja19zcXVhcmVfYnV0dG9uXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic2hhcGVcIixcImlucHV0XCIsXCJmcmFtZVwiXSxcInNlYXJjaFwiOlwiYmxhY2ssc3F1YXJlLGJ1dHRvbixzaGFwZSxpbnB1dCxmcmFtZVwifSxcImZsYWctdG5cIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgVE5cIixcInVuaWZpZWRcIjpcIjFGMUY5LTFGMUYzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzgsXCJzaGVldF95XCI6MTYsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctdG5cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyx0bixyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJmbGFnLXRyXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFRSXCIsXCJ1bmlmaWVkXCI6XCIxRjFGOS0xRjFGN1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM4LFwic2hlZXRfeVwiOjE4LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXRyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsdHIscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwid2hpdGVfc3F1YXJlX2J1dHRvblwiOntcIm5hbWVcIjpcIldoaXRlIFNxdWFyZSBCdXR0b25cIixcInVuaWZpZWRcIjpcIjFGNTMzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjMsXCJzaGVldF95XCI6MzUsXCJzaG9ydF9uYW1lc1wiOltcIndoaXRlX3NxdWFyZV9idXR0b25cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzaGFwZVwiLFwiaW5wdXRcIl0sXCJzZWFyY2hcIjpcIndoaXRlLHNxdWFyZSxidXR0b24sc2hhcGUsaW5wdXRcIn0sXCJmbGFnLXRtXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFRNXCIsXCJ1bmlmaWVkXCI6XCIxRjFGOS0xRjFGMlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM4LFwic2hlZXRfeVwiOjE1LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXRtXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsdG0scmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwic3BlYWtlclwiOntcIm5hbWVcIjpcIlNwZWFrZXJcIixcInVuaWZpZWRcIjpcIjFGNTA4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjIsXCJzaGVldF95XCI6MzMsXCJzaG9ydF9uYW1lc1wiOltcInNwZWFrZXJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzb3VuZFwiLFwidm9sdW1lXCIsXCJzaWxlbmNlXCIsXCJicm9hZGNhc3RcIl0sXCJzZWFyY2hcIjpcInNwZWFrZXIsc291bmQsdm9sdW1lLHNpbGVuY2UsYnJvYWRjYXN0XCJ9LFwiZmxhZy10Y1wiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBUQ1wiLFwidW5pZmllZFwiOlwiMUYxRjktMUYxRThcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozOCxcInNoZWV0X3lcIjo3LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXRjXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsdGMscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwic291bmRcIjp7XCJuYW1lXCI6XCJTcGVha2VyIHdpdGggT25lIFNvdW5kIFdhdmVcIixcInVuaWZpZWRcIjpcIjFGNTA5XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjIsXCJzaGVldF95XCI6MzQsXCJzaG9ydF9uYW1lc1wiOltcInNvdW5kXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widm9sdW1lXCIsXCJzcGVha2VyXCIsXCJicm9hZGNhc3RcIl0sXCJzZWFyY2hcIjpcInNvdW5kLHNwZWFrZXIsd2l0aCxvbmUsd2F2ZSx2b2x1bWUsYnJvYWRjYXN0XCJ9LFwiZmxhZy10dlwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBUVlwiLFwidW5pZmllZFwiOlwiMUYxRjktMUYxRkJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozOCxcInNoZWV0X3lcIjoyMCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy10dlwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHR2LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImxvdWRfc291bmRcIjp7XCJuYW1lXCI6XCJTcGVha2VyIHdpdGggVGhyZWUgU291bmQgV2F2ZXNcIixcInVuaWZpZWRcIjpcIjFGNTBBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjIsXCJzaGVldF95XCI6MzUsXCJzaG9ydF9uYW1lc1wiOltcImxvdWRfc291bmRcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ2b2x1bWVcIixcIm5vaXNlXCIsXCJub2lzeVwiLFwic3BlYWtlclwiLFwiYnJvYWRjYXN0XCJdLFwic2VhcmNoXCI6XCJsb3VkLHNvdW5kLHNwZWFrZXIsd2l0aCx0aHJlZSx3YXZlcyx2b2x1bWUsbm9pc2Usbm9pc3ksYnJvYWRjYXN0XCJ9LFwibXV0ZVwiOntcIm5hbWVcIjpcIlNwZWFrZXIgd2l0aCBDYW5jZWxsYXRpb24gU3Ryb2tlXCIsXCJ1bmlmaWVkXCI6XCIxRjUwN1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIyLFwic2hlZXRfeVwiOjMyLFwic2hvcnRfbmFtZXNcIjpbXCJtdXRlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wic291bmRcIixcInZvbHVtZVwiLFwic2lsZW5jZVwiLFwicXVpZXRcIl0sXCJzZWFyY2hcIjpcIm11dGUsc3BlYWtlcix3aXRoLGNhbmNlbGxhdGlvbixzdHJva2Usc291bmQsdm9sdW1lLHNpbGVuY2UscXVpZXRcIn0sXCJmbGFnLXVnXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFVHXCIsXCJ1bmlmaWVkXCI6XCIxRjFGQS0xRjFFQ1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM4LFwic2hlZXRfeVwiOjI0LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXVnXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsdWcscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZmxhZy11YVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBVQVwiLFwidW5pZmllZFwiOlwiMUYxRkEtMUYxRTZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozOCxcInNoZWV0X3lcIjoyMyxcInNob3J0X25hbWVzXCI6W1wiZmxhZy11YVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHVhLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcIm1lZ2FcIjp7XCJuYW1lXCI6XCJDaGVlcmluZyBNZWdhcGhvbmVcIixcInVuaWZpZWRcIjpcIjFGNEUzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjEsXCJzaGVldF95XCI6MzgsXCJzaG9ydF9uYW1lc1wiOltcIm1lZ2FcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzb3VuZFwiLFwic3BlYWtlclwiLFwidm9sdW1lXCJdLFwic2VhcmNoXCI6XCJtZWdhLGNoZWVyaW5nLG1lZ2FwaG9uZSxzb3VuZCxzcGVha2VyLHZvbHVtZVwifSxcImZsYWctYWVcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQUVcIixcInVuaWZpZWRcIjpcIjFGMUU2LTFGMUVBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzIsXCJzaGVldF95XCI6MzUsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctYWVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxhZSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJsb3Vkc3BlYWtlclwiOntcIm5hbWVcIjpcIlB1YmxpYyBBZGRyZXNzIExvdWRzcGVha2VyXCIsXCJ1bmlmaWVkXCI6XCIxRjRFMlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIxLFwic2hlZXRfeVwiOjM3LFwic2hvcnRfbmFtZXNcIjpbXCJsb3Vkc3BlYWtlclwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInZvbHVtZVwiLFwic291bmRcIl0sXCJzZWFyY2hcIjpcImxvdWRzcGVha2VyLHB1YmxpYyxhZGRyZXNzLHZvbHVtZSxzb3VuZFwifSxcImJlbGxcIjp7XCJuYW1lXCI6XCJCZWxsXCIsXCJ1bmlmaWVkXCI6XCIxRjUxNFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIzLFwic2hlZXRfeVwiOjQsXCJzaG9ydF9uYW1lc1wiOltcImJlbGxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzb3VuZFwiLFwibm90aWZpY2F0aW9uXCIsXCJjaHJpc3RtYXNcIixcInhtYXNcIixcImNoaW1lXCJdLFwic2VhcmNoXCI6XCJiZWxsLHNvdW5kLG5vdGlmaWNhdGlvbixjaHJpc3RtYXMseG1hcyxjaGltZVwifSxcImZsYWctZ2JcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgR0JcIixcInVuaWZpZWRcIjpcIjFGMUVDLTFGMUU3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzQsXCJzaGVldF95XCI6MzIsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctZ2JcIixcImdiXCIsXCJ1a1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGdiLHVrLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImZsYWctdXNcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgVVNcIixcInVuaWZpZWRcIjpcIjFGMUZBLTFGMUY4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzgsXCJzaGVldF95XCI6MjYsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctdXNcIixcInVzXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsdXMscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwibm9fYmVsbFwiOntcIm5hbWVcIjpcIkJlbGwgd2l0aCBDYW5jZWxsYXRpb24gU3Ryb2tlXCIsXCJ1bmlmaWVkXCI6XCIxRjUxNVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIzLFwic2hlZXRfeVwiOjUsXCJzaG9ydF9uYW1lc1wiOltcIm5vX2JlbGxcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJzb3VuZFwiLFwidm9sdW1lXCIsXCJtdXRlXCIsXCJxdWlldFwiLFwic2lsZW50XCJdLFwic2VhcmNoXCI6XCJubyxiZWxsLHdpdGgsY2FuY2VsbGF0aW9uLHN0cm9rZSxzb3VuZCx2b2x1bWUsbXV0ZSxxdWlldCxzaWxlbnRcIn0sXCJmbGFnLXZpXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFZJXCIsXCJ1bmlmaWVkXCI6XCIxRjFGQi0xRjFFRVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM4LFwic2hlZXRfeVwiOjMzLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXZpXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsdmkscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiYmxhY2tfam9rZXJcIjp7XCJuYW1lXCI6XCJQbGF5aW5nIENhcmQgQmxhY2sgSm9rZXJcIixcInVuaWZpZWRcIjpcIjFGMENGXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6NCxcInNoZWV0X3lcIjozMSxcInNob3J0X25hbWVzXCI6W1wiYmxhY2tfam9rZXJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJwb2tlclwiLFwiY2FyZHNcIixcImdhbWVcIixcInBsYXlcIixcIm1hZ2ljXCJdLFwic2VhcmNoXCI6XCJibGFjayxqb2tlcixwbGF5aW5nLGNhcmQscG9rZXIsY2FyZHMsZ2FtZSxwbGF5LG1hZ2ljXCJ9LFwibWFoam9uZ1wiOntcIm5hbWVcIjpcIk1haGpvbmcgVGlsZSBSZWQgRHJhZ29uXCIsXCJ1bmlmaWVkXCI6XCIxRjAwNFwiLFwidmFyaWF0aW9uc1wiOltcIjFGMDA0LUZFMEZcIl0sXCJzaGVldF94XCI6NCxcInNoZWV0X3lcIjozMCxcInNob3J0X25hbWVzXCI6W1wibWFoam9uZ1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcImdhbWVcIixcInBsYXlcIixcImNoaW5lc2VcIixcImthbmppXCJdLFwic2VhcmNoXCI6XCJtYWhqb25nLHRpbGUscmVkLGRyYWdvbixnYW1lLHBsYXksY2hpbmVzZSxrYW5qaVwifSxcImZsYWctdXlcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgVVlcIixcInVuaWZpZWRcIjpcIjFGMUZBLTFGMUZFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzgsXCJzaGVldF95XCI6MjcsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctdXlcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyx1eSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJzcGFkZXNcIjp7XCJuYW1lXCI6XCJCbGFjayBTcGFkZSBTdWl0XCIsXCJ1bmlmaWVkXCI6XCIyNjYwXCIsXCJ2YXJpYXRpb25zXCI6W1wiMjY2MC1GRTBGXCJdLFwic2hlZXRfeFwiOjEsXCJzaGVldF95XCI6MzgsXCJzaG9ydF9uYW1lc1wiOltcInNwYWRlc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBva2VyXCIsXCJjYXJkc1wiLFwic3VpdHNcIixcIm1hZ2ljXCJdLFwic2VhcmNoXCI6XCJzcGFkZXMsYmxhY2ssc3BhZGUsc3VpdCxwb2tlcixjYXJkcyxzdWl0cyxtYWdpY1wifSxcImZsYWctdXpcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgVVpcIixcInVuaWZpZWRcIjpcIjFGMUZBLTFGMUZGXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzgsXCJzaGVldF95XCI6MjgsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctdXpcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyx1eixyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJjbHVic1wiOntcIm5hbWVcIjpcIkJsYWNrIENsdWIgU3VpdFwiLFwidW5pZmllZFwiOlwiMjY2M1wiLFwidmFyaWF0aW9uc1wiOltcIjI2NjMtRkUwRlwiXSxcInNoZWV0X3hcIjoxLFwic2hlZXRfeVwiOjM5LFwic2hvcnRfbmFtZXNcIjpbXCJjbHVic1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBva2VyXCIsXCJjYXJkc1wiLFwibWFnaWNcIixcInN1aXRzXCJdLFwic2VhcmNoXCI6XCJjbHVicyxibGFjayxjbHViLHN1aXQscG9rZXIsY2FyZHMsbWFnaWMsc3VpdHNcIn0sXCJmbGFnLXZ1XCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFZVXCIsXCJ1bmlmaWVkXCI6XCIxRjFGQi0xRjFGQVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM4LFwic2hlZXRfeVwiOjM1LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXZ1XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsdnUscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiaGVhcnRzXCI6e1wibmFtZVwiOlwiQmxhY2sgSGVhcnQgU3VpdFwiLFwidW5pZmllZFwiOlwiMjY2NVwiLFwidmFyaWF0aW9uc1wiOltcIjI2NjUtRkUwRlwiXSxcInNoZWV0X3hcIjoxLFwic2hlZXRfeVwiOjQwLFwic2hvcnRfbmFtZXNcIjpbXCJoZWFydHNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJwb2tlclwiLFwiY2FyZHNcIixcIm1hZ2ljXCIsXCJzdWl0c1wiXSxcInNlYXJjaFwiOlwiaGVhcnRzLGJsYWNrLGhlYXJ0LHN1aXQscG9rZXIsY2FyZHMsbWFnaWMsc3VpdHNcIn0sXCJmbGFnLXZhXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFZBXCIsXCJ1bmlmaWVkXCI6XCIxRjFGQi0xRjFFNlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM4LFwic2hlZXRfeVwiOjI5LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXZhXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsdmEscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZGlhbW9uZHNcIjp7XCJuYW1lXCI6XCJCbGFjayBEaWFtb25kIFN1aXRcIixcInVuaWZpZWRcIjpcIjI2NjZcIixcInZhcmlhdGlvbnNcIjpbXCIyNjY2LUZFMEZcIl0sXCJzaGVldF94XCI6MixcInNoZWV0X3lcIjowLFwic2hvcnRfbmFtZXNcIjpbXCJkaWFtb25kc1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInBva2VyXCIsXCJjYXJkc1wiLFwibWFnaWNcIixcInN1aXRzXCJdLFwic2VhcmNoXCI6XCJkaWFtb25kcyxibGFjayxkaWFtb25kLHN1aXQscG9rZXIsY2FyZHMsbWFnaWMsc3VpdHNcIn0sXCJmbGFnLXZlXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFZFXCIsXCJ1bmlmaWVkXCI6XCIxRjFGQi0xRjFFQVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM4LFwic2hlZXRfeVwiOjMxLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLXZlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsdmUscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZmxhZy12blwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBWTlwiLFwidW5pZmllZFwiOlwiMUYxRkItMUYxRjNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozOCxcInNoZWV0X3lcIjozNCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy12blwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHZuLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImZsb3dlcl9wbGF5aW5nX2NhcmRzXCI6e1wibmFtZVwiOlwiRmxvd2VyIFBsYXlpbmcgQ2FyZHNcIixcInVuaWZpZWRcIjpcIjFGM0I0XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6OSxcInNoZWV0X3lcIjozNSxcInNob3J0X25hbWVzXCI6W1wiZmxvd2VyX3BsYXlpbmdfY2FyZHNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJnYW1lXCIsXCJzdW5zZXRcIixcInJlZFwiXSxcInNlYXJjaFwiOlwiZmxvd2VyLHBsYXlpbmcsY2FyZHMsZ2FtZSxzdW5zZXQscmVkXCJ9LFwidGhvdWdodF9iYWxsb29uXCI6e1wibmFtZVwiOlwiVGhvdWdodCBCYWxsb29uXCIsXCJ1bmlmaWVkXCI6XCIxRjRBRFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjIwLFwic2hlZXRfeVwiOjI1LFwic2hvcnRfbmFtZXNcIjpbXCJ0aG91Z2h0X2JhbGxvb25cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJidWJibGVcIixcImNsb3VkXCIsXCJzcGVlY2hcIixcInRoaW5raW5nXCJdLFwic2VhcmNoXCI6XCJ0aG91Z2h0LGJhbGxvb24sYnViYmxlLGNsb3VkLHNwZWVjaCx0aGlua2luZ1wifSxcImZsYWctd2ZcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgV0ZcIixcInVuaWZpZWRcIjpcIjFGMUZDLTFGMUVCXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzgsXCJzaGVldF95XCI6MzYsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctd2ZcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsd2YscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiZmxhZy1laFwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBFSFwiLFwidW5pZmllZFwiOlwiMUYxRUEtMUYxRURcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNCxcInNoZWV0X3lcIjoyMCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1laFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxlaCxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJyaWdodF9hbmdlcl9idWJibGVcIjp7XCJuYW1lXCI6XCJSaWdodCBBbmdlciBCdWJibGVcIixcInVuaWZpZWRcIjpcIjFGNUVGXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjYsXCJzaGVldF95XCI6NyxcInNob3J0X25hbWVzXCI6W1wicmlnaHRfYW5nZXJfYnViYmxlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1wiY2FwdGlvblwiLFwic3BlZWNoXCIsXCJ0aGlua2luZ1wiLFwibWFkXCJdLFwic2VhcmNoXCI6XCJyaWdodCxhbmdlcixidWJibGUsY2FwdGlvbixzcGVlY2gsdGhpbmtpbmcsbWFkXCJ9LFwic3BlZWNoX2JhbGxvb25cIjp7XCJuYW1lXCI6XCJTcGVlY2ggQmFsbG9vblwiLFwidW5pZmllZFwiOlwiMUY0QUNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyMCxcInNoZWV0X3lcIjoyNCxcInNob3J0X25hbWVzXCI6W1wic3BlZWNoX2JhbGxvb25cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJidWJibGVcIixcIndvcmRzXCIsXCJtZXNzYWdlXCIsXCJ0YWxrXCIsXCJjaGF0dGluZ1wiXSxcInNlYXJjaFwiOlwic3BlZWNoLGJhbGxvb24sYnViYmxlLHdvcmRzLG1lc3NhZ2UsdGFsayxjaGF0dGluZ1wifSxcImZsYWcteWVcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgWUVcIixcInVuaWZpZWRcIjpcIjFGMUZFLTFGMUVBXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzgsXCJzaGVldF95XCI6MzksXCJzaG9ydF9uYW1lc1wiOltcImZsYWcteWVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyx5ZSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJsZWZ0X3NwZWVjaF9idWJibGVcIjp7XCJuYW1lXCI6XCJMZWZ0IFNwZWVjaCBCdWJibGVcIixcInVuaWZpZWRcIjpcIjFGNUU4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjYsXCJzaGVldF95XCI6NixcInNob3J0X25hbWVzXCI6W1wibGVmdF9zcGVlY2hfYnViYmxlXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOmZhbHNlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcIndvcmRzXCIsXCJtZXNzYWdlXCIsXCJ0YWxrXCIsXCJjaGF0dGluZ1wiXSxcInNlYXJjaFwiOlwibGVmdCxzcGVlY2gsYnViYmxlLHdvcmRzLG1lc3NhZ2UsdGFsayxjaGF0dGluZ1wifSxcImZsYWctem1cIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgWk1cIixcInVuaWZpZWRcIjpcIjFGMUZGLTFGMUYyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzksXCJzaGVldF95XCI6MSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy16bVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHptLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImNsb2NrMVwiOntcIm5hbWVcIjpcIkNsb2NrIEZhY2UgT25lIE9jbG9ja1wiLFwidW5pZmllZFwiOlwiMUY1NTBcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNCxcInNoZWV0X3lcIjoxMSxcInNob3J0X25hbWVzXCI6W1wiY2xvY2sxXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widGltZVwiLFwibGF0ZVwiLFwiZWFybHlcIixcInNjaGVkdWxlXCJdLFwic2VhcmNoXCI6XCJjbG9jazEsY2xvY2ssZmFjZSxvbmUsb2Nsb2NrLHRpbWUsbGF0ZSxlYXJseSxzY2hlZHVsZVwifSxcImZsYWctendcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgWldcIixcInVuaWZpZWRcIjpcIjFGMUZGLTFGMUZDXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzksXCJzaGVldF95XCI6MixcInNob3J0X25hbWVzXCI6W1wiZmxhZy16d1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLHp3LHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImZsYWctYWNcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgQUNcIixcInVuaWZpZWRcIjpcIjFGMUU2LTFGMUU4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzIsXCJzaGVldF95XCI6MzMsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctYWNcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsYWMscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiY2xvY2syXCI6e1wibmFtZVwiOlwiQ2xvY2sgRmFjZSBUd28gT2Nsb2NrXCIsXCJ1bmlmaWVkXCI6XCIxRjU1MVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI0LFwic2hlZXRfeVwiOjEyLFwic2hvcnRfbmFtZXNcIjpbXCJjbG9jazJcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ0aW1lXCIsXCJsYXRlXCIsXCJlYXJseVwiLFwic2NoZWR1bGVcIl0sXCJzZWFyY2hcIjpcImNsb2NrMixjbG9jayxmYWNlLHR3byxvY2xvY2ssdGltZSxsYXRlLGVhcmx5LHNjaGVkdWxlXCJ9LFwiZmxhZy1idlwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBCVlwiLFwidW5pZmllZFwiOlwiMUYxRTctMUYxRkJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozMyxcInNoZWV0X3lcIjoyNixcInNob3J0X25hbWVzXCI6W1wiZmxhZy1idlwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxidixyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJjbG9jazNcIjp7XCJuYW1lXCI6XCJDbG9jayBGYWNlIFRocmVlIE9jbG9ja1wiLFwidW5pZmllZFwiOlwiMUY1NTJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNCxcInNoZWV0X3lcIjoxMyxcInNob3J0X25hbWVzXCI6W1wiY2xvY2szXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widGltZVwiLFwibGF0ZVwiLFwiZWFybHlcIixcInNjaGVkdWxlXCJdLFwic2VhcmNoXCI6XCJjbG9jazMsY2xvY2ssZmFjZSx0aHJlZSxvY2xvY2ssdGltZSxsYXRlLGVhcmx5LHNjaGVkdWxlXCJ9LFwiZmxhZy1jcFwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBDUFwiLFwidW5pZmllZFwiOlwiMUYxRTgtMUYxRjVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNCxcInNoZWV0X3lcIjoxLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWNwXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGNwLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImNsb2NrNFwiOntcIm5hbWVcIjpcIkNsb2NrIEZhY2UgRm91ciBPY2xvY2tcIixcInVuaWZpZWRcIjpcIjFGNTUzXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjQsXCJzaGVldF95XCI6MTQsXCJzaG9ydF9uYW1lc1wiOltcImNsb2NrNFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRpbWVcIixcImxhdGVcIixcImVhcmx5XCIsXCJzY2hlZHVsZVwiXSxcInNlYXJjaFwiOlwiY2xvY2s0LGNsb2NrLGZhY2UsZm91cixvY2xvY2ssdGltZSxsYXRlLGVhcmx5LHNjaGVkdWxlXCJ9LFwiY2xvY2s1XCI6e1wibmFtZVwiOlwiQ2xvY2sgRmFjZSBGaXZlIE9jbG9ja1wiLFwidW5pZmllZFwiOlwiMUY1NTRcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNCxcInNoZWV0X3lcIjoxNSxcInNob3J0X25hbWVzXCI6W1wiY2xvY2s1XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widGltZVwiLFwibGF0ZVwiLFwiZWFybHlcIixcInNjaGVkdWxlXCJdLFwic2VhcmNoXCI6XCJjbG9jazUsY2xvY2ssZmFjZSxmaXZlLG9jbG9jayx0aW1lLGxhdGUsZWFybHksc2NoZWR1bGVcIn0sXCJmbGFnLWRnXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIERHXCIsXCJ1bmlmaWVkXCI6XCIxRjFFOS0xRjFFQ1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM0LFwic2hlZXRfeVwiOjEwLFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWRnXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGRnLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImNsb2NrNlwiOntcIm5hbWVcIjpcIkNsb2NrIEZhY2UgU2l4IE9jbG9ja1wiLFwidW5pZmllZFwiOlwiMUY1NTVcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNCxcInNoZWV0X3lcIjoxNixcInNob3J0X25hbWVzXCI6W1wiY2xvY2s2XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widGltZVwiLFwibGF0ZVwiLFwiZWFybHlcIixcInNjaGVkdWxlXCIsXCJkYXduXCIsXCJkdXNrXCJdLFwic2VhcmNoXCI6XCJjbG9jazYsY2xvY2ssZmFjZSxzaXgsb2Nsb2NrLHRpbWUsbGF0ZSxlYXJseSxzY2hlZHVsZSxkYXduLGR1c2tcIn0sXCJmbGFnLWVhXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIEVBXCIsXCJ1bmlmaWVkXCI6XCIxRjFFQS0xRjFFNlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM0LFwic2hlZXRfeVwiOjE2LFwic2hvcnRfbmFtZXNcIjpbXCJmbGFnLWVhXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJmbGFnLGVhLHJlZ2lvbmFsLGluZGljYXRvcixzeW1ib2wsbGV0dGVyc1wifSxcImZsYWctaG1cIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgSE1cIixcInVuaWZpZWRcIjpcIjFGMUVELTFGMUYyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzUsXCJzaGVldF95XCI6MTAsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctaG1cIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsaG0scmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiY2xvY2s3XCI6e1wibmFtZVwiOlwiQ2xvY2sgRmFjZSBTZXZlbiBPY2xvY2tcIixcInVuaWZpZWRcIjpcIjFGNTU2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjQsXCJzaGVldF95XCI6MTcsXCJzaG9ydF9uYW1lc1wiOltcImNsb2NrN1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRpbWVcIixcImxhdGVcIixcImVhcmx5XCIsXCJzY2hlZHVsZVwiXSxcInNlYXJjaFwiOlwiY2xvY2s3LGNsb2NrLGZhY2Usc2V2ZW4sb2Nsb2NrLHRpbWUsbGF0ZSxlYXJseSxzY2hlZHVsZVwifSxcImZsYWctbWZcIjp7XCJuYW1lXCI6XCJSZWdpb25hbCBJbmRpY2F0b3IgU3ltYm9sIExldHRlcnMgTUZcIixcInVuaWZpZWRcIjpcIjFGMUYyLTFGMUVCXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MzYsXCJzaGVldF95XCI6MTUsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctbWZcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsbWYscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiY2xvY2s4XCI6e1wibmFtZVwiOlwiQ2xvY2sgRmFjZSBFaWdodCBPY2xvY2tcIixcInVuaWZpZWRcIjpcIjFGNTU3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjQsXCJzaGVldF95XCI6MTgsXCJzaG9ydF9uYW1lc1wiOltcImNsb2NrOFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRpbWVcIixcImxhdGVcIixcImVhcmx5XCIsXCJzY2hlZHVsZVwiXSxcInNlYXJjaFwiOlwiY2xvY2s4LGNsb2NrLGZhY2UsZWlnaHQsb2Nsb2NrLHRpbWUsbGF0ZSxlYXJseSxzY2hlZHVsZVwifSxcImNsb2NrOVwiOntcIm5hbWVcIjpcIkNsb2NrIEZhY2UgTmluZSBPY2xvY2tcIixcInVuaWZpZWRcIjpcIjFGNTU4XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjQsXCJzaGVldF95XCI6MTksXCJzaG9ydF9uYW1lc1wiOltcImNsb2NrOVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRpbWVcIixcImxhdGVcIixcImVhcmx5XCIsXCJzY2hlZHVsZVwiXSxcInNlYXJjaFwiOlwiY2xvY2s5LGNsb2NrLGZhY2UsbmluZSxvY2xvY2ssdGltZSxsYXRlLGVhcmx5LHNjaGVkdWxlXCJ9LFwiZmxhZy1zalwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBTSlwiLFwidW5pZmllZFwiOlwiMUYxRjgtMUYxRUZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozNyxcInNoZWV0X3lcIjozNCxcInNob3J0X25hbWVzXCI6W1wiZmxhZy1zalwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyxzaixyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJmbGFnLXRhXCI6e1wibmFtZVwiOlwiUmVnaW9uYWwgSW5kaWNhdG9yIFN5bWJvbCBMZXR0ZXJzIFRBXCIsXCJ1bmlmaWVkXCI6XCIxRjFGOS0xRjFFNlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjM4LFwic2hlZXRfeVwiOjYsXCJzaG9ydF9uYW1lc1wiOltcImZsYWctdGFcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcImZsYWcsdGEscmVnaW9uYWwsaW5kaWNhdG9yLHN5bWJvbCxsZXR0ZXJzXCJ9LFwiY2xvY2sxMFwiOntcIm5hbWVcIjpcIkNsb2NrIEZhY2UgVGVuIE9jbG9ja1wiLFwidW5pZmllZFwiOlwiMUY1NTlcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNCxcInNoZWV0X3lcIjoyMCxcInNob3J0X25hbWVzXCI6W1wiY2xvY2sxMFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRpbWVcIixcImxhdGVcIixcImVhcmx5XCIsXCJzY2hlZHVsZVwiXSxcInNlYXJjaFwiOlwiY2xvY2sxMCxjbG9jayxmYWNlLHRlbixvY2xvY2ssdGltZSxsYXRlLGVhcmx5LHNjaGVkdWxlXCJ9LFwiZmxhZy11bVwiOntcIm5hbWVcIjpcIlJlZ2lvbmFsIEluZGljYXRvciBTeW1ib2wgTGV0dGVycyBVTVwiLFwidW5pZmllZFwiOlwiMUYxRkEtMUYxRjJcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjozOCxcInNoZWV0X3lcIjoyNSxcInNob3J0X25hbWVzXCI6W1wiZmxhZy11bVwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwiZmxhZyx1bSxyZWdpb25hbCxpbmRpY2F0b3Isc3ltYm9sLGxldHRlcnNcIn0sXCJjbG9jazExXCI6e1wibmFtZVwiOlwiQ2xvY2sgRmFjZSBFbGV2ZW4gT2Nsb2NrXCIsXCJ1bmlmaWVkXCI6XCIxRjU1QVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI0LFwic2hlZXRfeVwiOjIxLFwic2hvcnRfbmFtZXNcIjpbXCJjbG9jazExXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widGltZVwiLFwibGF0ZVwiLFwiZWFybHlcIixcInNjaGVkdWxlXCJdLFwic2VhcmNoXCI6XCJjbG9jazExLGNsb2NrLGZhY2UsZWxldmVuLG9jbG9jayx0aW1lLGxhdGUsZWFybHksc2NoZWR1bGVcIn0sXCJjbG9jazEyXCI6e1wibmFtZVwiOlwiQ2xvY2sgRmFjZSBUd2VsdmUgT2Nsb2NrXCIsXCJ1bmlmaWVkXCI6XCIxRjU1QlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI0LFwic2hlZXRfeVwiOjIyLFwic2hvcnRfbmFtZXNcIjpbXCJjbG9jazEyXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widGltZVwiLFwibm9vblwiLFwibWlkbmlnaHRcIixcIm1pZGRheVwiLFwibGF0ZVwiLFwiZWFybHlcIixcInNjaGVkdWxlXCJdLFwic2VhcmNoXCI6XCJjbG9jazEyLGNsb2NrLGZhY2UsdHdlbHZlLG9jbG9jayx0aW1lLG5vb24sbWlkbmlnaHQsbWlkZGF5LGxhdGUsZWFybHksc2NoZWR1bGVcIn0sXCJjbG9jazEzMFwiOntcIm5hbWVcIjpcIkNsb2NrIEZhY2UgT25lLVRoaXJ0eVwiLFwidW5pZmllZFwiOlwiMUY1NUNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNCxcInNoZWV0X3lcIjoyMyxcInNob3J0X25hbWVzXCI6W1wiY2xvY2sxMzBcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ0aW1lXCIsXCJsYXRlXCIsXCJlYXJseVwiLFwic2NoZWR1bGVcIl0sXCJzZWFyY2hcIjpcImNsb2NrMTMwLGNsb2NrLGZhY2Usb25lLHRoaXJ0eSx0aW1lLGxhdGUsZWFybHksc2NoZWR1bGVcIn0sXCJjbG9jazIzMFwiOntcIm5hbWVcIjpcIkNsb2NrIEZhY2UgVHdvLVRoaXJ0eVwiLFwidW5pZmllZFwiOlwiMUY1NURcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoyNCxcInNoZWV0X3lcIjoyNCxcInNob3J0X25hbWVzXCI6W1wiY2xvY2syMzBcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6dHJ1ZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXCJ0aW1lXCIsXCJsYXRlXCIsXCJlYXJseVwiLFwic2NoZWR1bGVcIl0sXCJzZWFyY2hcIjpcImNsb2NrMjMwLGNsb2NrLGZhY2UsdHdvLHRoaXJ0eSx0aW1lLGxhdGUsZWFybHksc2NoZWR1bGVcIn0sXCJjbG9jazMzMFwiOntcIm5hbWVcIjpcIkNsb2NrIEZhY2UgVGhyZWUtVGhpcnR5XCIsXCJ1bmlmaWVkXCI6XCIxRjU1RVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI0LFwic2hlZXRfeVwiOjI1LFwic2hvcnRfbmFtZXNcIjpbXCJjbG9jazMzMFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRpbWVcIixcImxhdGVcIixcImVhcmx5XCIsXCJzY2hlZHVsZVwiXSxcInNlYXJjaFwiOlwiY2xvY2szMzAsY2xvY2ssZmFjZSx0aHJlZSx0aGlydHksdGltZSxsYXRlLGVhcmx5LHNjaGVkdWxlXCJ9LFwiY2xvY2s0MzBcIjp7XCJuYW1lXCI6XCJDbG9jayBGYWNlIEZvdXItVGhpcnR5XCIsXCJ1bmlmaWVkXCI6XCIxRjU1RlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI0LFwic2hlZXRfeVwiOjI2LFwic2hvcnRfbmFtZXNcIjpbXCJjbG9jazQzMFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRpbWVcIixcImxhdGVcIixcImVhcmx5XCIsXCJzY2hlZHVsZVwiXSxcInNlYXJjaFwiOlwiY2xvY2s0MzAsY2xvY2ssZmFjZSxmb3VyLHRoaXJ0eSx0aW1lLGxhdGUsZWFybHksc2NoZWR1bGVcIn0sXCJjbG9jazUzMFwiOntcIm5hbWVcIjpcIkNsb2NrIEZhY2UgRml2ZS1UaGlydHlcIixcInVuaWZpZWRcIjpcIjFGNTYwXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjQsXCJzaGVldF95XCI6MjcsXCJzaG9ydF9uYW1lc1wiOltcImNsb2NrNTMwXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widGltZVwiLFwibGF0ZVwiLFwiZWFybHlcIixcInNjaGVkdWxlXCJdLFwic2VhcmNoXCI6XCJjbG9jazUzMCxjbG9jayxmYWNlLGZpdmUsdGhpcnR5LHRpbWUsbGF0ZSxlYXJseSxzY2hlZHVsZVwifSxcImNsb2NrNjMwXCI6e1wibmFtZVwiOlwiQ2xvY2sgRmFjZSBTaXgtVGhpcnR5XCIsXCJ1bmlmaWVkXCI6XCIxRjU2MVwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI0LFwic2hlZXRfeVwiOjI4LFwic2hvcnRfbmFtZXNcIjpbXCJjbG9jazYzMFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRpbWVcIixcImxhdGVcIixcImVhcmx5XCIsXCJzY2hlZHVsZVwiXSxcInNlYXJjaFwiOlwiY2xvY2s2MzAsY2xvY2ssZmFjZSxzaXgsdGhpcnR5LHRpbWUsbGF0ZSxlYXJseSxzY2hlZHVsZVwifSxcImNsb2NrNzMwXCI6e1wibmFtZVwiOlwiQ2xvY2sgRmFjZSBTZXZlbi1UaGlydHlcIixcInVuaWZpZWRcIjpcIjFGNTYyXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjQsXCJzaGVldF95XCI6MjksXCJzaG9ydF9uYW1lc1wiOltcImNsb2NrNzMwXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOnRydWUsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W1widGltZVwiLFwibGF0ZVwiLFwiZWFybHlcIixcInNjaGVkdWxlXCJdLFwic2VhcmNoXCI6XCJjbG9jazczMCxjbG9jayxmYWNlLHNldmVuLHRoaXJ0eSx0aW1lLGxhdGUsZWFybHksc2NoZWR1bGVcIn0sXCJjbG9jazgzMFwiOntcIm5hbWVcIjpcIkNsb2NrIEZhY2UgRWlnaHQtVGhpcnR5XCIsXCJ1bmlmaWVkXCI6XCIxRjU2M1wiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI0LFwic2hlZXRfeVwiOjMwLFwic2hvcnRfbmFtZXNcIjpbXCJjbG9jazgzMFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRpbWVcIixcImxhdGVcIixcImVhcmx5XCIsXCJzY2hlZHVsZVwiXSxcInNlYXJjaFwiOlwiY2xvY2s4MzAsY2xvY2ssZmFjZSxlaWdodCx0aGlydHksdGltZSxsYXRlLGVhcmx5LHNjaGVkdWxlXCJ9LFwiY2xvY2s5MzBcIjp7XCJuYW1lXCI6XCJDbG9jayBGYWNlIE5pbmUtVGhpcnR5XCIsXCJ1bmlmaWVkXCI6XCIxRjU2NFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjI0LFwic2hlZXRfeVwiOjMxLFwic2hvcnRfbmFtZXNcIjpbXCJjbG9jazkzMFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRpbWVcIixcImxhdGVcIixcImVhcmx5XCIsXCJzY2hlZHVsZVwiXSxcInNlYXJjaFwiOlwiY2xvY2s5MzAsY2xvY2ssZmFjZSxuaW5lLHRoaXJ0eSx0aW1lLGxhdGUsZWFybHksc2NoZWR1bGVcIn0sXCJjbG9jazEwMzBcIjp7XCJuYW1lXCI6XCJDbG9jayBGYWNlIFRlbi1UaGlydHlcIixcInVuaWZpZWRcIjpcIjFGNTY1XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjQsXCJzaGVldF95XCI6MzIsXCJzaG9ydF9uYW1lc1wiOltcImNsb2NrMTAzMFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRpbWVcIixcImxhdGVcIixcImVhcmx5XCIsXCJzY2hlZHVsZVwiXSxcInNlYXJjaFwiOlwiY2xvY2sxMDMwLGNsb2NrLGZhY2UsdGVuLHRoaXJ0eSx0aW1lLGxhdGUsZWFybHksc2NoZWR1bGVcIn0sXCJjbG9jazExMzBcIjp7XCJuYW1lXCI6XCJDbG9jayBGYWNlIEVsZXZlbi1UaGlydHlcIixcInVuaWZpZWRcIjpcIjFGNTY2XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjQsXCJzaGVldF95XCI6MzMsXCJzaG9ydF9uYW1lc1wiOltcImNsb2NrMTEzMFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRpbWVcIixcImxhdGVcIixcImVhcmx5XCIsXCJzY2hlZHVsZVwiXSxcInNlYXJjaFwiOlwiY2xvY2sxMTMwLGNsb2NrLGZhY2UsZWxldmVuLHRoaXJ0eSx0aW1lLGxhdGUsZWFybHksc2NoZWR1bGVcIn0sXCJjbG9jazEyMzBcIjp7XCJuYW1lXCI6XCJDbG9jayBGYWNlIFR3ZWx2ZS1UaGlydHlcIixcInVuaWZpZWRcIjpcIjFGNTY3XCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MjQsXCJzaGVldF95XCI6MzQsXCJzaG9ydF9uYW1lc1wiOltcImNsb2NrMTIzMFwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjp0cnVlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltcInRpbWVcIixcImxhdGVcIixcImVhcmx5XCIsXCJzY2hlZHVsZVwiXSxcInNlYXJjaFwiOlwiY2xvY2sxMjMwLGNsb2NrLGZhY2UsdHdlbHZlLHRoaXJ0eSx0aW1lLGxhdGUsZWFybHksc2NoZWR1bGVcIn19LFwic2tpbnNcIjp7XCJza2luLXRvbmUtMlwiOntcIm5hbWVcIjpcIkVtb2ppIE1vZGlmaWVyIEZpdHpwYXRyaWNrIFR5cGUtMS0yXCIsXCJ1bmlmaWVkXCI6XCIxRjNGQlwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEyLFwic2hlZXRfeVwiOjAsXCJzaG9ydF9uYW1lc1wiOltcInNraW4tdG9uZS0yXCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJza2luLHRvbmUsMixlbW9qaSxtb2RpZmllcixmaXR6cGF0cmljayx0eXBlLDFcIn0sXCJza2luLXRvbmUtM1wiOntcIm5hbWVcIjpcIkVtb2ppIE1vZGlmaWVyIEZpdHpwYXRyaWNrIFR5cGUtM1wiLFwidW5pZmllZFwiOlwiMUYzRkNcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMixcInNoZWV0X3lcIjoxLFwic2hvcnRfbmFtZXNcIjpbXCJza2luLXRvbmUtM1wiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwic2tpbix0b25lLDMsZW1vamksbW9kaWZpZXIsZml0enBhdHJpY2ssdHlwZVwifSxcInNraW4tdG9uZS00XCI6e1wibmFtZVwiOlwiRW1vamkgTW9kaWZpZXIgRml0enBhdHJpY2sgVHlwZS00XCIsXCJ1bmlmaWVkXCI6XCIxRjNGRFwiLFwidmFyaWF0aW9uc1wiOltdLFwic2hlZXRfeFwiOjEyLFwic2hlZXRfeVwiOjIsXCJzaG9ydF9uYW1lc1wiOltcInNraW4tdG9uZS00XCJdLFwiaGFzX2ltZ19hcHBsZVwiOnRydWUsXCJoYXNfaW1nX2dvb2dsZVwiOmZhbHNlLFwiaGFzX2ltZ190d2l0dGVyXCI6dHJ1ZSxcImhhc19pbWdfZW1vamlvbmVcIjp0cnVlLFwiZW1vdGljb25zXCI6W10sXCJrZXl3b3Jkc1wiOltdLFwic2VhcmNoXCI6XCJza2luLHRvbmUsNCxlbW9qaSxtb2RpZmllcixmaXR6cGF0cmljayx0eXBlXCJ9LFwic2tpbi10b25lLTVcIjp7XCJuYW1lXCI6XCJFbW9qaSBNb2RpZmllciBGaXR6cGF0cmljayBUeXBlLTVcIixcInVuaWZpZWRcIjpcIjFGM0ZFXCIsXCJ2YXJpYXRpb25zXCI6W10sXCJzaGVldF94XCI6MTIsXCJzaGVldF95XCI6MyxcInNob3J0X25hbWVzXCI6W1wic2tpbi10b25lLTVcIl0sXCJoYXNfaW1nX2FwcGxlXCI6dHJ1ZSxcImhhc19pbWdfZ29vZ2xlXCI6ZmFsc2UsXCJoYXNfaW1nX3R3aXR0ZXJcIjp0cnVlLFwiaGFzX2ltZ19lbW9qaW9uZVwiOnRydWUsXCJlbW90aWNvbnNcIjpbXSxcImtleXdvcmRzXCI6W10sXCJzZWFyY2hcIjpcInNraW4sdG9uZSw1LGVtb2ppLG1vZGlmaWVyLGZpdHpwYXRyaWNrLHR5cGVcIn0sXCJza2luLXRvbmUtNlwiOntcIm5hbWVcIjpcIkVtb2ppIE1vZGlmaWVyIEZpdHpwYXRyaWNrIFR5cGUtNlwiLFwidW5pZmllZFwiOlwiMUYzRkZcIixcInZhcmlhdGlvbnNcIjpbXSxcInNoZWV0X3hcIjoxMixcInNoZWV0X3lcIjo0LFwic2hvcnRfbmFtZXNcIjpbXCJza2luLXRvbmUtNlwiXSxcImhhc19pbWdfYXBwbGVcIjp0cnVlLFwiaGFzX2ltZ19nb29nbGVcIjpmYWxzZSxcImhhc19pbWdfdHdpdHRlclwiOnRydWUsXCJoYXNfaW1nX2Vtb2ppb25lXCI6dHJ1ZSxcImVtb3RpY29uc1wiOltdLFwia2V5d29yZHNcIjpbXSxcInNlYXJjaFwiOlwic2tpbix0b25lLDYsZW1vamksbW9kaWZpZXIsZml0enBhdHJpY2ssdHlwZVwifX0sXCJzaG9ydF9uYW1lc1wiOntcInJlZF9jYXJcIjpcImNhclwiLFwic2F0aXNmaWVkXCI6XCJsYXVnaGluZ1wiLFwidGVsZXBob25lXCI6XCJwaG9uZVwiLFwiaG9uZXliZWVcIjpcImJlZVwiLFwic2FpbGJvYXRcIjpcImJvYXRcIixcImZsaXBwZXJcIjpcImRvbHBoaW5cIixcImNuXCI6XCJmbGFnLWNuXCIsXCJrbmlmZVwiOlwiaG9jaG9cIixcInBvb3BcIjpcImhhbmtleVwiLFwic2hpdFwiOlwiaGFua2V5XCIsXCJwYXdfcHJpbnRzXCI6XCJmZWV0XCIsXCJmclwiOlwiZmxhZy1mclwiLFwiaGVhdnlfZXhjbGFtYXRpb25fbWFya1wiOlwiZXhjbGFtYXRpb25cIixcImRlXCI6XCJmbGFnLWRlXCIsXCJ0aHVtYnN1cFwiOlwiKzFcIixcInRodW1ic2Rvd25cIjpcIi0xXCIsXCJwdW5jaFwiOlwiZmFjZXB1bmNoXCIsXCJyYWlzZWRfaGFuZFwiOlwiaGFuZFwiLFwicmV2ZXJzZWRfaGFuZF93aXRoX21pZGRsZV9maW5nZXJfZXh0ZW5kZWRcIjpcIm1pZGRsZV9maW5nZXJcIixcInNpZ25fb2ZfdGhlX2hvcm5zXCI6XCJ0aGVfaG9ybnNcIixcIml0XCI6XCJmbGFnLWl0XCIsXCJsYW50ZXJuXCI6XCJpemFrYXlhX2xhbnRlcm5cIixcIndheGluZ19naWJib3VzX21vb25cIjpcIm1vb25cIixcImVudmVsb3BlXCI6XCJlbWFpbFwiLFwianBcIjpcImZsYWctanBcIixcInN1bl9zbWFsbF9jbG91ZFwiOlwibW9zdGx5X3N1bm55XCIsXCJzdW5fYmVoaW5kX2Nsb3VkXCI6XCJiYXJlbHlfc3VubnlcIixcInN1bl9iZWhpbmRfcmFpbl9jbG91ZFwiOlwicGFydGx5X3N1bm55X3JhaW5cIixcImxpZ2h0bmluZ19jbG91ZFwiOlwibGlnaHRuaW5nXCIsXCJjb2xsaXNpb25cIjpcImJvb21cIixcInJ1bm5pbmdcIjpcInJ1bm5lclwiLFwidG9ybmFkb19jbG91ZFwiOlwidG9ybmFkb1wiLFwibWFuX2FuZF93b21hbl9ob2xkaW5nX2hhbmRzXCI6XCJjb3VwbGVcIixcIm9wZW5fYm9va1wiOlwiYm9va1wiLFwibWFuLXdvbWFuLWJveVwiOlwiZmFtaWx5XCIsXCJwZW5jaWxcIjpcIm1lbW9cIixcInRzaGlydFwiOlwic2hpcnRcIixcInJ1XCI6XCJmbGFnLXJ1XCIsXCJzaG9lXCI6XCJtYW5zX3Nob2VcIixcImtyXCI6XCJmbGFnLWtyXCIsXCJlc1wiOlwiZmxhZy1lc1wiLFwiZ2JcIjpcImZsYWctZ2JcIixcInVrXCI6XCJmbGFnLWdiXCIsXCJ1c1wiOlwiZmxhZy11c1wifX07XG5cbi8qKiovIH0sXG4vKiAyMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRleHBvcnRzLnVuaWZpZWRUb05hdGl2ZSA9IGV4cG9ydHMuZGVlcE1lcmdlID0gZXhwb3J0cy5pbnRlcnNlY3QgPSBleHBvcnRzLmdldFNhbml0aXplZERhdGEgPSBleHBvcnRzLmdldERhdGEgPSB1bmRlZmluZWQ7XG5cblx0dmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cblx0dmFyIF9kYXRhID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSk7XG5cblx0dmFyIF9kYXRhMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RhdGEpO1xuXG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cblx0ZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSBlbHNlIHsgcmV0dXJuIEFycmF5LmZyb20oYXJyKTsgfSB9XG5cblx0dmFyIENPTE9OU19SRUdFWCA9IC9eKD86XFw6KFteXFw6XSspXFw6KSg/OlxcOnNraW4tdG9uZS0oXFxkKVxcOik/JC87XG5cdHZhciBTS0lOUyA9IFsnMUYzRkEnLCAnMUYzRkInLCAnMUYzRkMnLCAnMUYzRkQnLCAnMUYzRkUnLCAnMUYzRkYnXTtcblxuXHRmdW5jdGlvbiB1bmlmaWVkVG9OYXRpdmUodW5pZmllZCkge1xuXHQgIHZhciB1bmljb2RlcyA9IHVuaWZpZWQuc3BsaXQoJy0nKSxcblx0ICAgICAgY29kZVBvaW50cyA9IHVuaWNvZGVzLm1hcChmdW5jdGlvbiAodSkge1xuXHQgICAgcmV0dXJuICcweCcgKyB1O1xuXHQgIH0pO1xuXG5cdCAgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50LmFwcGx5KFN0cmluZywgX3RvQ29uc3VtYWJsZUFycmF5KGNvZGVQb2ludHMpKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHNhbml0aXplKGVtb2ppKSB7XG5cdCAgdmFyIG5hbWUgPSBlbW9qaS5uYW1lO1xuXHQgIHZhciBzaG9ydF9uYW1lcyA9IGVtb2ppLnNob3J0X25hbWVzO1xuXHQgIHZhciBza2luX3RvbmUgPSBlbW9qaS5za2luX3RvbmU7XG5cdCAgdmFyIHNraW5fdmFyaWF0aW9ucyA9IGVtb2ppLnNraW5fdmFyaWF0aW9ucztcblx0ICB2YXIgZW1vdGljb25zID0gZW1vamkuZW1vdGljb25zO1xuXHQgIHZhciB1bmlmaWVkID0gZW1vamkudW5pZmllZDtcblx0ICB2YXIgaWQgPSBzaG9ydF9uYW1lc1swXTtcblx0ICB2YXIgY29sb25zID0gJzonICsgaWQgKyAnOic7XG5cblx0ICBpZiAoc2tpbl90b25lKSB7XG5cdCAgICBjb2xvbnMgKz0gJzpza2luLXRvbmUtJyArIHNraW5fdG9uZSArICc6Jztcblx0ICB9XG5cblx0ICByZXR1cm4ge1xuXHQgICAgaWQ6IGlkLFxuXHQgICAgbmFtZTogbmFtZSxcblx0ICAgIGNvbG9uczogY29sb25zLFxuXHQgICAgZW1vdGljb25zOiBlbW90aWNvbnMsXG5cdCAgICBza2luOiBza2luX3RvbmUgfHwgKHNraW5fdmFyaWF0aW9ucyA/IDEgOiBudWxsKSxcblx0ICAgIG5hdGl2ZTogdW5pZmllZFRvTmF0aXZlKHVuaWZpZWQpXG5cdCAgfTtcblx0fVxuXG5cdGZ1bmN0aW9uIGdldFNhbml0aXplZERhdGEoKSB7XG5cdCAgcmV0dXJuIHNhbml0aXplKGdldERhdGEuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGdldERhdGEoZW1vamksIHNraW4sIHNldCkge1xuXHQgIHZhciBlbW9qaURhdGEgPSB7fTtcblxuXHQgIGlmICh0eXBlb2YgZW1vamkgPT0gJ3N0cmluZycpIHtcblx0ICAgIHZhciBtYXRjaGVzID0gZW1vamkubWF0Y2goQ09MT05TX1JFR0VYKTtcblxuXHQgICAgaWYgKG1hdGNoZXMpIHtcblx0ICAgICAgZW1vamkgPSBtYXRjaGVzWzFdO1xuXG5cdCAgICAgIGlmIChtYXRjaGVzWzJdKSB7XG5cdCAgICAgICAgc2tpbiA9IHBhcnNlSW50KG1hdGNoZXNbMl0pO1xuXHQgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIGlmIChfZGF0YTIuZGVmYXVsdC5zaG9ydF9uYW1lcy5oYXNPd25Qcm9wZXJ0eShlbW9qaSkpIHtcblx0ICAgICAgZW1vamkgPSBfZGF0YTIuZGVmYXVsdC5zaG9ydF9uYW1lc1tlbW9qaV07XG5cdCAgICB9XG5cblx0ICAgIGlmIChfZGF0YTIuZGVmYXVsdC5lbW9qaXMuaGFzT3duUHJvcGVydHkoZW1vamkpKSB7XG5cdCAgICAgIGVtb2ppRGF0YSA9IF9kYXRhMi5kZWZhdWx0LmVtb2ppc1tlbW9qaV07XG5cdCAgICB9XG5cdCAgfSBlbHNlIGlmIChlbW9qaS5pZCkge1xuXHQgICAgaWYgKF9kYXRhMi5kZWZhdWx0LnNob3J0X25hbWVzLmhhc093blByb3BlcnR5KGVtb2ppLmlkKSkge1xuXHQgICAgICBlbW9qaS5pZCA9IF9kYXRhMi5kZWZhdWx0LnNob3J0X25hbWVzW2Vtb2ppLmlkXTtcblx0ICAgIH1cblxuXHQgICAgaWYgKF9kYXRhMi5kZWZhdWx0LmVtb2ppcy5oYXNPd25Qcm9wZXJ0eShlbW9qaS5pZCkpIHtcblx0ICAgICAgZW1vamlEYXRhID0gX2RhdGEyLmRlZmF1bHQuZW1vamlzW2Vtb2ppLmlkXTtcblx0ICAgICAgc2tpbiB8fCAoc2tpbiA9IGVtb2ppLnNraW4pO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIGlmIChlbW9qaURhdGEuc2tpbl92YXJpYXRpb25zICYmIHNraW4gPiAxICYmIHNldCkge1xuXHQgICAgZW1vamlEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlbW9qaURhdGEpKTtcblxuXHQgICAgdmFyIHNraW5LZXkgPSBTS0lOU1tza2luIC0gMV0sXG5cdCAgICAgICAgdmFyaWF0aW9uS2V5ID0gZW1vamlEYXRhLnVuaWZpZWQgKyAnLScgKyBza2luS2V5LFxuXHQgICAgICAgIHZhcmlhdGlvbkRhdGEgPSBlbW9qaURhdGEuc2tpbl92YXJpYXRpb25zW3ZhcmlhdGlvbktleV07XG5cblx0ICAgIGlmICh2YXJpYXRpb25EYXRhWydoYXNfaW1nXycgKyBzZXRdKSB7XG5cdCAgICAgIGVtb2ppRGF0YS5za2luX3RvbmUgPSBza2luO1xuXG5cdCAgICAgIGZvciAodmFyIGsgaW4gdmFyaWF0aW9uRGF0YSkge1xuXHQgICAgICAgIHZhciB2ID0gdmFyaWF0aW9uRGF0YVtrXTtcblx0ICAgICAgICBlbW9qaURhdGFba10gPSB2O1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgcmV0dXJuIGVtb2ppRGF0YTtcblx0fVxuXG5cdGZ1bmN0aW9uIGludGVyc2VjdChhLCBiKSB7XG5cdCAgdmFyIGFTZXQgPSBuZXcgU2V0KGEpLFxuXHQgICAgICBiU2V0ID0gbmV3IFNldChiKSxcblx0ICAgICAgaW50ZXJzZWN0aW9uID0gbnVsbDtcblxuXHQgIGludGVyc2VjdGlvbiA9IG5ldyBTZXQoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShhU2V0KSkuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG5cdCAgICByZXR1cm4gYlNldC5oYXMoeCk7XG5cdCAgfSkpO1xuXG5cdCAgcmV0dXJuIEFycmF5LmZyb20oaW50ZXJzZWN0aW9uKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGRlZXBNZXJnZShhLCBiKSB7XG5cdCAgdmFyIG8gPSB7fTtcblxuXHQgIGZvciAodmFyIGtleSBpbiBhKSB7XG5cdCAgICB2YXIgb3JpZ2luYWxWYWx1ZSA9IGFba2V5XSxcblx0ICAgICAgICB2YWx1ZSA9IG9yaWdpbmFsVmFsdWU7XG5cblx0ICAgIGlmIChiLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0ICAgICAgdmFsdWUgPSBiW2tleV07XG5cdCAgICB9XG5cblx0ICAgIGlmICgodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZih2YWx1ZSkpID09PSAnb2JqZWN0Jykge1xuXHQgICAgICB2YWx1ZSA9IGRlZXBNZXJnZShvcmlnaW5hbFZhbHVlLCB2YWx1ZSk7XG5cdCAgICB9XG5cblx0ICAgIG9ba2V5XSA9IHZhbHVlO1xuXHQgIH1cblxuXHQgIHJldHVybiBvO1xuXHR9XG5cblx0ZXhwb3J0cy5nZXREYXRhID0gZ2V0RGF0YTtcblx0ZXhwb3J0cy5nZXRTYW5pdGl6ZWREYXRhID0gZ2V0U2FuaXRpemVkRGF0YTtcblx0ZXhwb3J0cy5pbnRlcnNlY3QgPSBpbnRlcnNlY3Q7XG5cdGV4cG9ydHMuZGVlcE1lcmdlID0gZGVlcE1lcmdlO1xuXHRleHBvcnRzLnVuaWZpZWRUb05hdGl2ZSA9IHVuaWZpZWRUb05hdGl2ZTtcblxuLyoqKi8gfSxcbi8qIDIxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cblx0dmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5cdF9fd2VicGFja19yZXF1aXJlX18oMjIpO1xuXG5cdHZhciBfcmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG5cdHZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG5cdHZhciBfZGF0YSA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpO1xuXG5cdHZhciBfZGF0YTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kYXRhKTtcblxuXHR2YXIgX3N0b3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNyk7XG5cblx0dmFyIF9zdG9yZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zdG9yZSk7XG5cblx0dmFyIF9mcmVxdWVudGx5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNik7XG5cblx0dmFyIF9mcmVxdWVudGx5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ZyZXF1ZW50bHkpO1xuXG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTtcblxuXHR2YXIgXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuXHRmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5cdGZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5cdGZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5cdHZhciBSRUNFTlRfQ0FURUdPUlkgPSB7IG5hbWU6ICdSZWNlbnQnLCBlbW9qaXM6IG51bGwgfTtcblx0dmFyIFNFQVJDSF9DQVRFR09SWSA9IHsgbmFtZTogJ1NlYXJjaCcsIGVtb2ppczogbnVsbCwgYW5jaG9yOiBSRUNFTlRfQ0FURUdPUlkgfTtcblxuXHR2YXIgQ0FURUdPUklFUyA9IFtTRUFSQ0hfQ0FURUdPUlksIFJFQ0VOVF9DQVRFR09SWV0uY29uY2F0KF9kYXRhMi5kZWZhdWx0LmNhdGVnb3JpZXMpO1xuXG5cdHZhciBJMThOID0ge1xuXHQgIHNlYXJjaDogJ1NlYXJjaCcsXG5cdCAgY2F0ZWdvcmllczoge1xuXHQgICAgc2VhcmNoOiAnU2VhcmNoIFJlc3VsdHMnLFxuXHQgICAgcmVjZW50OiAnRnJlcXVlbnRseSBVc2VkJyxcblx0ICAgIHBlb3BsZTogJ1NtaWxleXMgJiBQZW9wbGUnLFxuXHQgICAgbmF0dXJlOiAnQW5pbWFscyAmIE5hdHVyZScsXG5cdCAgICBmb29kczogJ0Zvb2QgJiBEcmluaycsXG5cdCAgICBhY3Rpdml0eTogJ0FjdGl2aXR5Jyxcblx0ICAgIHBsYWNlczogJ1RyYXZlbCAmIFBsYWNlcycsXG5cdCAgICBvYmplY3RzOiAnT2JqZWN0cycsXG5cdCAgICBzeW1ib2xzOiAnU3ltYm9scycsXG5cdCAgICBmbGFnczogJ0ZsYWdzJ1xuXHQgIH1cblx0fTtcblxuXHR2YXIgUGlja2VyID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcblx0ICBfaW5oZXJpdHMoUGlja2VyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuXHQgIGZ1bmN0aW9uIFBpY2tlcihwcm9wcykge1xuXHQgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBpY2tlcik7XG5cblx0ICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIE9iamVjdC5nZXRQcm90b3R5cGVPZihQaWNrZXIpLmNhbGwodGhpcywgcHJvcHMpKTtcblxuXHQgICAgX3RoaXMuaTE4biA9ICgwLCBfdXRpbHMuZGVlcE1lcmdlKShJMThOLCBwcm9wcy5pMThuKTtcblx0ICAgIF90aGlzLnN0YXRlID0ge1xuXHQgICAgICBza2luOiBfc3RvcmUyLmRlZmF1bHQuZ2V0KCdza2luJykgfHwgcHJvcHMuc2tpbixcblx0ICAgICAgZmlyc3RSZW5kZXI6IHRydWVcblx0ICAgIH07XG5cdCAgICByZXR1cm4gX3RoaXM7XG5cdCAgfVxuXG5cdCAgX2NyZWF0ZUNsYXNzKFBpY2tlciwgW3tcblx0ICAgIGtleTogJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMocHJvcHMpIHtcblx0ICAgICAgaWYgKHByb3BzLnNraW4gJiYgIV9zdG9yZTIuZGVmYXVsdC5nZXQoJ3NraW4nKSkge1xuXHQgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBza2luOiBwcm9wcy5za2luIH0pO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnY29tcG9uZW50RGlkTW91bnQnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuXHQgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuXHQgICAgICBpZiAodGhpcy5zdGF0ZS5maXJzdFJlbmRlcikge1xuXHQgICAgICAgIHRoaXMudGVzdFN0aWNreVBvc2l0aW9uKCk7XG5cdCAgICAgICAgdGhpcy5maXJzdFJlbmRlclRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIF90aGlzMi5zZXRTdGF0ZSh7IGZpcnN0UmVuZGVyOiBmYWxzZSB9KTtcblx0ICAgICAgICB9LCA2MCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdjb21wb25lbnREaWRVcGRhdGUnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcblx0ICAgICAgdGhpcy51cGRhdGVDYXRlZ29yaWVzU2l6ZSgpO1xuXHQgICAgICB0aGlzLmhhbmRsZVNjcm9sbCgpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2NvbXBvbmVudFdpbGxVbm1vdW50Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcblx0ICAgICAgU0VBUkNIX0NBVEVHT1JZLmVtb2ppcyA9IG51bGw7XG5cblx0ICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubGVhdmVUaW1lb3V0KTtcblx0ICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZmlyc3RSZW5kZXJUaW1lb3V0KTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICd0ZXN0U3RpY2t5UG9zaXRpb24nLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHRlc3RTdGlja3lQb3NpdGlvbigpIHtcblx0ICAgICAgdmFyIHN0aWNreVRlc3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdCAgICAgIHZhciBfYXJyID0gWycnLCAnLXdlYmtpdC0nLCAnLW1zLScsICctbW96LScsICctby0nXTtcblx0ICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IF9hcnIubGVuZ3RoOyBfaSsrKSB7XG5cdCAgICAgICAgdmFyIHByZWZpeCA9IF9hcnJbX2ldO1xuXHQgICAgICAgIHN0aWNreVRlc3RFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gcHJlZml4ICsgJ3N0aWNreSc7XG5cdCAgICAgIH1cblxuXHQgICAgICB0aGlzLmhhc1N0aWNreVBvc2l0aW9uID0gISFzdGlja3lUZXN0RWxlbWVudC5zdHlsZS5wb3NpdGlvbi5sZW5ndGg7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnaGFuZGxlRW1vamlPdmVyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVFbW9qaU92ZXIoZW1vamkpIHtcblx0ICAgICAgdmFyIHByZXZpZXcgPSB0aGlzLnJlZnMucHJldmlldztcblxuXHQgICAgICBwcmV2aWV3LnNldFN0YXRlKHsgZW1vamk6IGVtb2ppIH0pO1xuXHQgICAgICBjbGVhclRpbWVvdXQodGhpcy5sZWF2ZVRpbWVvdXQpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2hhbmRsZUVtb2ppTGVhdmUnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZUVtb2ppTGVhdmUoZW1vamkpIHtcblx0ICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cblx0ICAgICAgdGhpcy5sZWF2ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgcHJldmlldyA9IF90aGlzMy5yZWZzLnByZXZpZXc7XG5cblx0ICAgICAgICBwcmV2aWV3LnNldFN0YXRlKHsgZW1vamk6IG51bGwgfSk7XG5cdCAgICAgIH0sIDE2KTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdoYW5kbGVFbW9qaUNsaWNrJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVFbW9qaUNsaWNrKGVtb2ppLCBlKSB7XG5cdCAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG5cdCAgICAgIHRoaXMucHJvcHMub25DbGljayhlbW9qaSwgZSk7XG5cdCAgICAgIF9mcmVxdWVudGx5Mi5kZWZhdWx0LmFkZChlbW9qaSk7XG5cblx0ICAgICAgdmFyIGNvbXBvbmVudCA9IHRoaXMucmVmc1snY2F0ZWdvcnktMSddO1xuXHQgICAgICBpZiAoY29tcG9uZW50KSB7XG5cdCAgICAgICAgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIHZhciBtYXhNYXJnaW4gPSBjb21wb25lbnQubWF4TWFyZ2luO1xuXHQgICAgICAgICAgY29tcG9uZW50LmZvcmNlVXBkYXRlKCk7XG5cblx0ICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBjb21wb25lbnQubWVtb2l6ZVNpemUoKTtcblx0ICAgICAgICAgICAgaWYgKG1heE1hcmdpbiA9PSBjb21wb25lbnQubWF4TWFyZ2luKSByZXR1cm47XG5cblx0ICAgICAgICAgICAgX3RoaXM0LnVwZGF0ZUNhdGVnb3JpZXNTaXplKCk7XG5cdCAgICAgICAgICAgIF90aGlzNC5oYW5kbGVTY3JvbGxQYWludCgpO1xuXG5cdCAgICAgICAgICAgIGlmIChTRUFSQ0hfQ0FURUdPUlkuZW1vamlzKSB7XG5cdCAgICAgICAgICAgICAgY29tcG9uZW50LnVwZGF0ZURpc3BsYXkoJ25vbmUnKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfSkoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2hhbmRsZVNjcm9sbCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlU2Nyb2xsKCkge1xuXHQgICAgICBpZiAoIXRoaXMud2FpdGluZ0ZvclBhaW50KSB7XG5cdCAgICAgICAgdGhpcy53YWl0aW5nRm9yUGFpbnQgPSB0cnVlO1xuXHQgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5oYW5kbGVTY3JvbGxQYWludC5iaW5kKHRoaXMpKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2hhbmRsZVNjcm9sbFBhaW50Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVTY3JvbGxQYWludCgpIHtcblx0ICAgICAgdGhpcy53YWl0aW5nRm9yUGFpbnQgPSBmYWxzZTtcblxuXHQgICAgICBpZiAoIXRoaXMucmVmcy5zY3JvbGwpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblxuXHQgICAgICB2YXIgdGFyZ2V0ID0gdGhpcy5yZWZzLnNjcm9sbCxcblx0ICAgICAgICAgIHNjcm9sbFRvcCA9IHRhcmdldC5zY3JvbGxUb3AsXG5cdCAgICAgICAgICBzY3JvbGxpbmdEb3duID0gc2Nyb2xsVG9wID4gKHRoaXMuc2Nyb2xsVG9wIHx8IDApLFxuXHQgICAgICAgICAgYWN0aXZlQ2F0ZWdvcnkgPSBudWxsLFxuXHQgICAgICAgICAgbWluVG9wID0gMDtcblxuXHQgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IENBVEVHT1JJRVMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdCAgICAgICAgdmFyIGlpID0gc2Nyb2xsaW5nRG93biA/IENBVEVHT1JJRVMubGVuZ3RoIC0gMSAtIGkgOiBpLFxuXHQgICAgICAgICAgICBjYXRlZ29yeSA9IENBVEVHT1JJRVNbaWldLFxuXHQgICAgICAgICAgICBjb21wb25lbnQgPSB0aGlzLnJlZnNbJ2NhdGVnb3J5LScgKyBpaV07XG5cblx0ICAgICAgICBpZiAoY29tcG9uZW50KSB7XG5cdCAgICAgICAgICB2YXIgYWN0aXZlID0gY29tcG9uZW50LmhhbmRsZVNjcm9sbChzY3JvbGxUb3ApO1xuXG5cdCAgICAgICAgICBpZiAoIW1pblRvcCB8fCBjb21wb25lbnQudG9wIDwgbWluVG9wKSB7XG5cdCAgICAgICAgICAgIGlmIChjb21wb25lbnQudG9wID4gMCkge1xuXHQgICAgICAgICAgICAgIG1pblRvcCA9IGNvbXBvbmVudC50b3A7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH1cblxuXHQgICAgICAgICAgaWYgKGFjdGl2ZSAmJiAhYWN0aXZlQ2F0ZWdvcnkpIHtcblx0ICAgICAgICAgICAgaWYgKGNhdGVnb3J5LmFuY2hvcikgY2F0ZWdvcnkgPSBjYXRlZ29yeS5hbmNob3I7XG5cdCAgICAgICAgICAgIGFjdGl2ZUNhdGVnb3J5ID0gY2F0ZWdvcnk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cblx0ICAgICAgaWYgKHNjcm9sbFRvcCA8IG1pblRvcCkge1xuXHQgICAgICAgIGFjdGl2ZUNhdGVnb3J5ID0gUkVDRU5UX0NBVEVHT1JZO1xuXHQgICAgICB9XG5cblx0ICAgICAgaWYgKGFjdGl2ZUNhdGVnb3J5KSB7XG5cdCAgICAgICAgdmFyIGFuY2hvcnMgPSB0aGlzLnJlZnMuYW5jaG9ycztcblx0ICAgICAgICB2YXIgX2FjdGl2ZUNhdGVnb3J5ID0gYWN0aXZlQ2F0ZWdvcnk7XG5cdCAgICAgICAgdmFyIGNhdGVnb3J5TmFtZSA9IF9hY3RpdmVDYXRlZ29yeS5uYW1lO1xuXG5cblx0ICAgICAgICBpZiAoYW5jaG9ycy5zdGF0ZS5zZWxlY3RlZCAhPSBjYXRlZ29yeU5hbWUpIHtcblx0ICAgICAgICAgIGFuY2hvcnMuc2V0U3RhdGUoeyBzZWxlY3RlZDogY2F0ZWdvcnlOYW1lIH0pO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXG5cdCAgICAgIHRoaXMuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2hhbmRsZVNlYXJjaCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlU2VhcmNoKGVtb2ppcykge1xuXHQgICAgICBTRUFSQ0hfQ0FURUdPUlkuZW1vamlzID0gZW1vamlzO1xuXG5cdCAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gQ0FURUdPUklFUy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0ICAgICAgICB2YXIgY29tcG9uZW50ID0gdGhpcy5yZWZzWydjYXRlZ29yeS0nICsgaV07XG5cblx0ICAgICAgICBpZiAoY29tcG9uZW50ICYmIGNvbXBvbmVudC5wcm9wcy5uYW1lICE9ICdTZWFyY2gnKSB7XG5cdCAgICAgICAgICB2YXIgZGlzcGxheSA9IGVtb2ppcyA/ICdub25lJyA6IG51bGw7XG5cdCAgICAgICAgICBjb21wb25lbnQudXBkYXRlRGlzcGxheShkaXNwbGF5KTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblxuXHQgICAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnaGFuZGxlQW5jaG9yQ2xpY2snLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZUFuY2hvckNsaWNrKGNhdGVnb3J5LCBpKSB7XG5cdCAgICAgIHZhciBjb21wb25lbnQgPSB0aGlzLnJlZnNbJ2NhdGVnb3J5LScgKyBpXTtcblx0ICAgICAgdmFyIF9yZWZzID0gdGhpcy5yZWZzO1xuXHQgICAgICB2YXIgc2Nyb2xsID0gX3JlZnMuc2Nyb2xsO1xuXHQgICAgICB2YXIgYW5jaG9ycyA9IF9yZWZzLmFuY2hvcnM7XG5cdCAgICAgIHZhciBzY3JvbGxUb0NvbXBvbmVudCA9IG51bGw7XG5cblx0ICAgICAgc2Nyb2xsVG9Db21wb25lbnQgPSBmdW5jdGlvbiBzY3JvbGxUb0NvbXBvbmVudCgpIHtcblx0ICAgICAgICBpZiAoY29tcG9uZW50KSB7XG5cdCAgICAgICAgICB2YXIgdG9wID0gY29tcG9uZW50LnRvcDtcblxuXG5cdCAgICAgICAgICBpZiAoY2F0ZWdvcnkubmFtZSA9PSAnUmVjZW50Jykge1xuXHQgICAgICAgICAgICB0b3AgPSAwO1xuXHQgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgdG9wICs9IDE7XG5cdCAgICAgICAgICB9XG5cblx0ICAgICAgICAgIHNjcm9sbC5zY3JvbGxUb3AgPSB0b3A7XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXG5cdCAgICAgIGlmIChTRUFSQ0hfQ0FURUdPUlkuZW1vamlzKSB7XG5cdCAgICAgICAgdGhpcy5oYW5kbGVTZWFyY2gobnVsbCk7XG5cdCAgICAgICAgdGhpcy5yZWZzLnNlYXJjaC5jbGVhcigpO1xuXG5cdCAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShzY3JvbGxUb0NvbXBvbmVudCk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgc2Nyb2xsVG9Db21wb25lbnQoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2hhbmRsZVNraW5DaGFuZ2UnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZVNraW5DaGFuZ2Uoc2tpbikge1xuXHQgICAgICB2YXIgbmV3U3RhdGUgPSB7IHNraW46IHNraW4gfTtcblxuXHQgICAgICB0aGlzLnNldFN0YXRlKG5ld1N0YXRlKTtcblx0ICAgICAgX3N0b3JlMi5kZWZhdWx0LnVwZGF0ZShuZXdTdGF0ZSk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAndXBkYXRlQ2F0ZWdvcmllc1NpemUnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZUNhdGVnb3JpZXNTaXplKCkge1xuXHQgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IENBVEVHT1JJRVMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdCAgICAgICAgdmFyIGNvbXBvbmVudCA9IHRoaXMucmVmc1snY2F0ZWdvcnktJyArIGldO1xuXHQgICAgICAgIGlmIChjb21wb25lbnQpIGNvbXBvbmVudC5tZW1vaXplU2l6ZSgpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZ2V0Q2F0ZWdvcmllcycsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q2F0ZWdvcmllcygpIHtcblx0ICAgICAgdmFyIGNhdGVnb3JpZXMgPSBDQVRFR09SSUVTO1xuXG5cdCAgICAgIHJldHVybiB0aGlzLnN0YXRlLmZpcnN0UmVuZGVyID8gY2F0ZWdvcmllcy5zbGljZSgwLCAzKSA6IGNhdGVnb3JpZXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAncmVuZGVyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdCAgICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG5cdCAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzO1xuXHQgICAgICB2YXIgcGVyTGluZSA9IF9wcm9wcy5wZXJMaW5lO1xuXHQgICAgICB2YXIgZW1vamlTaXplID0gX3Byb3BzLmVtb2ppU2l6ZTtcblx0ICAgICAgdmFyIHNldCA9IF9wcm9wcy5zZXQ7XG5cdCAgICAgIHZhciBzaGVldFNpemUgPSBfcHJvcHMuc2hlZXRTaXplO1xuXHQgICAgICB2YXIgc3R5bGUgPSBfcHJvcHMuc3R5bGU7XG5cdCAgICAgIHZhciB0aXRsZSA9IF9wcm9wcy50aXRsZTtcblx0ICAgICAgdmFyIGVtb2ppID0gX3Byb3BzLmVtb2ppO1xuXHQgICAgICB2YXIgY29sb3IgPSBfcHJvcHMuY29sb3I7XG5cdCAgICAgIHZhciBiYWNrZ3JvdW5kSW1hZ2VGbiA9IF9wcm9wcy5iYWNrZ3JvdW5kSW1hZ2VGbjtcblx0ICAgICAgdmFyIHNraW4gPSB0aGlzLnN0YXRlLnNraW47XG5cdCAgICAgIHZhciB3aWR0aCA9IHBlckxpbmUgKiAoZW1vamlTaXplICsgMTIpICsgMTIgKyAyO1xuXG5cdCAgICAgIHJldHVybiBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcblx0ICAgICAgICAnZGl2Jyxcblx0ICAgICAgICB7IHN0eWxlOiBfZXh0ZW5kcyh7fSwgc3R5bGUsIHsgd2lkdGg6IHdpZHRoIH0pLCBjbGFzc05hbWU6ICdlbW9qaS1tYXJ0JyB9LFxuXHQgICAgICAgIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFxuXHQgICAgICAgICAgJ2RpdicsXG5cdCAgICAgICAgICB7IGNsYXNzTmFtZTogJ2Vtb2ppLW1hcnQtYmFyJyB9LFxuXHQgICAgICAgICAgX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXy5BbmNob3JzLCB7XG5cdCAgICAgICAgICAgIHJlZjogJ2FuY2hvcnMnLFxuXHQgICAgICAgICAgICBpMThuOiB0aGlzLmkxOG4sXG5cdCAgICAgICAgICAgIGNvbG9yOiBjb2xvcixcblx0ICAgICAgICAgICAgY2F0ZWdvcmllczogQ0FURUdPUklFUyxcblx0ICAgICAgICAgICAgb25BbmNob3JDbGljazogdGhpcy5oYW5kbGVBbmNob3JDbGljay5iaW5kKHRoaXMpXG5cdCAgICAgICAgICB9KVxuXHQgICAgICAgICksXG5cdCAgICAgICAgX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXG5cdCAgICAgICAgICAnZGl2Jyxcblx0ICAgICAgICAgIHsgcmVmOiAnc2Nyb2xsJywgY2xhc3NOYW1lOiAnZW1vamktbWFydC1zY3JvbGwnLCBvblNjcm9sbDogdGhpcy5oYW5kbGVTY3JvbGwuYmluZCh0aGlzKSB9LFxuXHQgICAgICAgICAgX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXy5TZWFyY2gsIHtcblx0ICAgICAgICAgICAgcmVmOiAnc2VhcmNoJyxcblx0ICAgICAgICAgICAgb25TZWFyY2g6IHRoaXMuaGFuZGxlU2VhcmNoLmJpbmQodGhpcyksXG5cdCAgICAgICAgICAgIGkxOG46IHRoaXMuaTE4blxuXHQgICAgICAgICAgfSksXG5cdCAgICAgICAgICB0aGlzLmdldENhdGVnb3JpZXMoKS5tYXAoZnVuY3Rpb24gKGNhdGVnb3J5LCBpKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChfLkNhdGVnb3J5LCB7XG5cdCAgICAgICAgICAgICAgcmVmOiAnY2F0ZWdvcnktJyArIGksXG5cdCAgICAgICAgICAgICAga2V5OiBjYXRlZ29yeS5uYW1lLFxuXHQgICAgICAgICAgICAgIG5hbWU6IGNhdGVnb3J5Lm5hbWUsXG5cdCAgICAgICAgICAgICAgZW1vamlzOiBjYXRlZ29yeS5lbW9qaXMsXG5cdCAgICAgICAgICAgICAgcGVyTGluZTogcGVyTGluZSxcblx0ICAgICAgICAgICAgICBoYXNTdGlja3lQb3NpdGlvbjogX3RoaXM1Lmhhc1N0aWNreVBvc2l0aW9uLFxuXHQgICAgICAgICAgICAgIGkxOG46IF90aGlzNS5pMThuLFxuXHQgICAgICAgICAgICAgIGVtb2ppUHJvcHM6IHtcblx0ICAgICAgICAgICAgICAgIHNraW46IHNraW4sXG5cdCAgICAgICAgICAgICAgICBzaXplOiBlbW9qaVNpemUsXG5cdCAgICAgICAgICAgICAgICBzZXQ6IHNldCxcblx0ICAgICAgICAgICAgICAgIHNoZWV0U2l6ZTogc2hlZXRTaXplLFxuXHQgICAgICAgICAgICAgICAgYmFja2dyb3VuZEltYWdlRm46IGJhY2tncm91bmRJbWFnZUZuLFxuXHQgICAgICAgICAgICAgICAgb25PdmVyOiBfdGhpczUuaGFuZGxlRW1vamlPdmVyLmJpbmQoX3RoaXM1KSxcblx0ICAgICAgICAgICAgICAgIG9uTGVhdmU6IF90aGlzNS5oYW5kbGVFbW9qaUxlYXZlLmJpbmQoX3RoaXM1KSxcblx0ICAgICAgICAgICAgICAgIG9uQ2xpY2s6IF90aGlzNS5oYW5kbGVFbW9qaUNsaWNrLmJpbmQoX3RoaXM1KVxuXHQgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICB9KVxuXHQgICAgICAgICksXG5cdCAgICAgICAgX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXG5cdCAgICAgICAgICAnZGl2Jyxcblx0ICAgICAgICAgIHsgY2xhc3NOYW1lOiAnZW1vamktbWFydC1iYXInIH0sXG5cdCAgICAgICAgICBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChfLlByZXZpZXcsIHtcblx0ICAgICAgICAgICAgcmVmOiAncHJldmlldycsXG5cdCAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcblx0ICAgICAgICAgICAgZW1vamk6IGVtb2ppLFxuXHQgICAgICAgICAgICBlbW9qaVByb3BzOiB7XG5cdCAgICAgICAgICAgICAgc2l6ZTogMzgsXG5cdCAgICAgICAgICAgICAgc2tpbjogc2tpbixcblx0ICAgICAgICAgICAgICBzZXQ6IHNldCxcblx0ICAgICAgICAgICAgICBzaGVldFNpemU6IHNoZWV0U2l6ZSxcblx0ICAgICAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2VGbjogYmFja2dyb3VuZEltYWdlRm5cblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgc2tpbnNQcm9wczoge1xuXHQgICAgICAgICAgICAgIHNraW46IHNraW4sXG5cdCAgICAgICAgICAgICAgb25DaGFuZ2U6IHRoaXMuaGFuZGxlU2tpbkNoYW5nZS5iaW5kKHRoaXMpXG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH0pXG5cdCAgICAgICAgKVxuXHQgICAgICApO1xuXHQgICAgfVxuXHQgIH1dKTtcblxuXHQgIHJldHVybiBQaWNrZXI7XG5cdH0oX3JlYWN0Mi5kZWZhdWx0LkNvbXBvbmVudCk7XG5cblx0ZXhwb3J0cy5kZWZhdWx0ID0gUGlja2VyO1xuXG5cblx0UGlja2VyLnByb3BUeXBlcyA9IHtcblx0ICBvbkNsaWNrOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLmZ1bmMsXG5cdCAgcGVyTGluZTogX3JlYWN0Mi5kZWZhdWx0LlByb3BUeXBlcy5udW1iZXIsXG5cdCAgZW1vamlTaXplOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLm51bWJlcixcblx0ICBpMThuOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLm9iamVjdCxcblx0ICBzdHlsZTogX3JlYWN0Mi5kZWZhdWx0LlByb3BUeXBlcy5vYmplY3QsXG5cdCAgdGl0bGU6IF9yZWFjdDIuZGVmYXVsdC5Qcm9wVHlwZXMuc3RyaW5nLFxuXHQgIGVtb2ppOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLnN0cmluZyxcblx0ICBjb2xvcjogX3JlYWN0Mi5kZWZhdWx0LlByb3BUeXBlcy5zdHJpbmcsXG5cdCAgc2V0OiBfLkVtb2ppLnByb3BUeXBlcy5zZXQsXG5cdCAgYmFja2dyb3VuZEltYWdlRm46IF8uRW1vamkucHJvcFR5cGVzLmJhY2tncm91bmRJbWFnZUZuLFxuXHQgIHNraW46IF8uRW1vamkucHJvcFR5cGVzLnNraW4sXG5cdCAgc2hlZXRTaXplOiBfLkVtb2ppLnByb3BUeXBlcy5zaGVldFNpemVcblx0fTtcblxuXHRQaWNrZXIuZGVmYXVsdFByb3BzID0ge1xuXHQgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7fSxcblx0ICBlbW9qaVNpemU6IDI0LFxuXHQgIHBlckxpbmU6IDksXG5cdCAgaTE4bjoge30sXG5cdCAgc3R5bGU6IHt9LFxuXHQgIHRpdGxlOiAnRW1vamkgTWFydOKEoicsXG5cdCAgZW1vamk6ICdkZXBhcnRtZW50X3N0b3JlJyxcblx0ICBjb2xvcjogJyNhZTY1YzUnLFxuXHQgIHNldDogXy5FbW9qaS5kZWZhdWx0UHJvcHMuc2V0LFxuXHQgIHNraW46IF8uRW1vamkuZGVmYXVsdFByb3BzLnNraW4sXG5cdCAgc2hlZXRTaXplOiBfLkVtb2ppLmRlZmF1bHRQcm9wcy5zaGVldFNpemUsXG5cdCAgYmFja2dyb3VuZEltYWdlRm46IF8uRW1vamkuZGVmYXVsdFByb3BzLmJhY2tncm91bmRJbWFnZUZuXG5cdH07XG5cbi8qKiovIH0sXG4vKiAyMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXG5cdC8vIGh0dHA6Ly9wYXVsaXJpc2guY29tLzIwMTEvcmVxdWVzdGFuaW1hdGlvbmZyYW1lLWZvci1zbWFydC1hbmltYXRpbmcvXG5cdC8vIGh0dHA6Ly9teS5vcGVyYS5jb20vZW1vbGxlci9ibG9nLzIwMTEvMTIvMjAvcmVxdWVzdGFuaW1hdGlvbmZyYW1lLWZvci1zbWFydC1lci1hbmltYXRpbmdcblxuXHQvLyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgcG9seWZpbGwgYnkgRXJpayBNw7ZsbGVyLiBmaXhlcyBmcm9tIFBhdWwgSXJpc2ggYW5kIFRpbm8gWmlqZGVsXG5cblx0Ly8gTUlUIGxpY2Vuc2VcblxuXHR2YXIgaXNXaW5kb3dBdmFpbGFibGUgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcblxuXHRpc1dpbmRvd0F2YWlsYWJsZSAmJiBmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGxhc3RUaW1lID0gMDtcblx0ICB2YXIgdmVuZG9ycyA9IFsnbXMnLCAnbW96JywgJ3dlYmtpdCcsICdvJ107XG5cblx0ICBmb3IgKHZhciB4ID0gMDsgeCA8IHZlbmRvcnMubGVuZ3RoICYmICF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lOyArK3gpIHtcblx0ICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB3aW5kb3dbdmVuZG9yc1t4XSArICdSZXF1ZXN0QW5pbWF0aW9uRnJhbWUnXTtcblx0ICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW3hdICsgJ0NhbmNlbEFuaW1hdGlvbkZyYW1lJ10gfHwgd2luZG93W3ZlbmRvcnNbeF0gKyAnQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lJ107XG5cdCAgfVxuXG5cdCAgaWYgKCF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBlbGVtZW50KSB7XG5cdCAgICB2YXIgY3VyclRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblx0ICAgIHZhciB0aW1lVG9DYWxsID0gTWF0aC5tYXgoMCwgMTYgLSAoY3VyclRpbWUgLSBsYXN0VGltZSkpO1xuXHQgICAgdmFyIGlkID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICBjYWxsYmFjayhjdXJyVGltZSArIHRpbWVUb0NhbGwpO1xuXHQgICAgfSwgdGltZVRvQ2FsbCk7XG5cblx0ICAgIGxhc3RUaW1lID0gY3VyclRpbWUgKyB0aW1lVG9DYWxsO1xuXHQgICAgcmV0dXJuIGlkO1xuXHQgIH07XG5cblx0ICBpZiAoIXdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSkgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gKGlkKSB7XG5cdCAgICBjbGVhclRpbWVvdXQoaWQpO1xuXHQgIH07XG5cdH0oKTtcblxuLyoqKi8gfSxcbi8qIDIzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cblx0dmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5cdHZhciBfcmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG5cdHZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG5cdHZhciBfID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMCk7XG5cblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuXHRmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5cdGZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5cdGZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5cdHZhciBQcmV2aWV3ID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcblx0ICBfaW5oZXJpdHMoUHJldmlldywgX1JlYWN0JENvbXBvbmVudCk7XG5cblx0ICBmdW5jdGlvbiBQcmV2aWV3KHByb3BzKSB7XG5cdCAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHJldmlldyk7XG5cblx0ICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIE9iamVjdC5nZXRQcm90b3R5cGVPZihQcmV2aWV3KS5jYWxsKHRoaXMsIHByb3BzKSk7XG5cblx0ICAgIF90aGlzLnN0YXRlID0geyBlbW9qaTogbnVsbCB9O1xuXHQgICAgcmV0dXJuIF90aGlzO1xuXHQgIH1cblxuXHQgIF9jcmVhdGVDbGFzcyhQcmV2aWV3LCBbe1xuXHQgICAga2V5OiAncmVuZGVyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdCAgICAgIHZhciBlbW9qaSA9IHRoaXMuc3RhdGUuZW1vamk7XG5cdCAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzO1xuXHQgICAgICB2YXIgZW1vamlQcm9wcyA9IF9wcm9wcy5lbW9qaVByb3BzO1xuXHQgICAgICB2YXIgc2tpbnNQcm9wcyA9IF9wcm9wcy5za2luc1Byb3BzO1xuXHQgICAgICB2YXIgdGl0bGUgPSBfcHJvcHMudGl0bGU7XG5cdCAgICAgIHZhciBpZGxlRW1vamkgPSBfcHJvcHMuZW1vamk7XG5cblxuXHQgICAgICBpZiAoZW1vamkpIHtcblx0ICAgICAgICB2YXIgZW1vamlEYXRhID0gKDAsIF91dGlscy5nZXREYXRhKShlbW9qaSk7XG5cdCAgICAgICAgdmFyIGVtb3RpY29ucyA9IGVtb2ppRGF0YS5lbW90aWNvbnM7XG5cdCAgICAgICAgdmFyIGtub3duRW1vdGljb25zID0gW107XG5cdCAgICAgICAgdmFyIGxpc3RlZEVtb3RpY29ucyA9IFtdO1xuXG5cdCAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuXHQgICAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvciA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBfaXRlcmF0b3JFcnJvciA9IHVuZGVmaW5lZDtcblxuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBlbW90aWNvbnNbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gKF9zdGVwID0gX2l0ZXJhdG9yLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlKSB7XG5cdCAgICAgICAgICAgIHZhciBlbW90aWNvbiA9IF9zdGVwLnZhbHVlO1xuXG5cdCAgICAgICAgICAgIGlmIChrbm93bkVtb3RpY29ucy5pbmRleE9mKGVtb3RpY29uLnRvTG93ZXJDYXNlKCkpID09IC0xKSB7XG5cdCAgICAgICAgICAgICAga25vd25FbW90aWNvbnMucHVzaChlbW90aWNvbi50b0xvd2VyQ2FzZSgpKTtcblx0ICAgICAgICAgICAgICBsaXN0ZWRFbW90aWNvbnMucHVzaChlbW90aWNvbik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9IGNhdGNoIChlcnIpIHtcblx0ICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcblx0ICAgICAgICAgIF9pdGVyYXRvckVycm9yID0gZXJyO1xuXHQgICAgICAgIH0gZmluYWxseSB7XG5cdCAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gJiYgX2l0ZXJhdG9yLnJldHVybikge1xuXHQgICAgICAgICAgICAgIF9pdGVyYXRvci5yZXR1cm4oKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgfSBmaW5hbGx5IHtcblx0ICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yKSB7XG5cdCAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cblx0ICAgICAgICByZXR1cm4gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXG5cdCAgICAgICAgICAnZGl2Jyxcblx0ICAgICAgICAgIHsgY2xhc3NOYW1lOiAnZW1vamktbWFydC1wcmV2aWV3JyB9LFxuXHQgICAgICAgICAgX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXG5cdCAgICAgICAgICAgICdkaXYnLFxuXHQgICAgICAgICAgICB7IGNsYXNzTmFtZTogJ2Vtb2ppLW1hcnQtcHJldmlldy1lbW9qaScgfSxcblx0ICAgICAgICAgICAgX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXy5FbW9qaSwgX2V4dGVuZHMoe1xuXHQgICAgICAgICAgICAgIGtleTogZW1vamkuaWQsXG5cdCAgICAgICAgICAgICAgZW1vamk6IGVtb2ppXG5cdCAgICAgICAgICAgIH0sIGVtb2ppUHJvcHMpKVxuXHQgICAgICAgICAgKSxcblx0ICAgICAgICAgIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFxuXHQgICAgICAgICAgICAnZGl2Jyxcblx0ICAgICAgICAgICAgeyBjbGFzc05hbWU6ICdlbW9qaS1tYXJ0LXByZXZpZXctZGF0YScgfSxcblx0ICAgICAgICAgICAgX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXG5cdCAgICAgICAgICAgICAgJ2RpdicsXG5cdCAgICAgICAgICAgICAgeyBjbGFzc05hbWU6ICdlbW9qaS1tYXJ0LXByZXZpZXctbmFtZScgfSxcblx0ICAgICAgICAgICAgICBlbW9qaS5uYW1lXG5cdCAgICAgICAgICAgICksXG5cdCAgICAgICAgICAgIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFxuXHQgICAgICAgICAgICAgICdkaXYnLFxuXHQgICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiAnZW1vamktbWFydC1wcmV2aWV3LXNob3J0bmFtZXMnIH0sXG5cdCAgICAgICAgICAgICAgZW1vamlEYXRhLnNob3J0X25hbWVzLm1hcChmdW5jdGlvbiAoc2hvcnRfbmFtZSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFxuXHQgICAgICAgICAgICAgICAgICAnc3BhbicsXG5cdCAgICAgICAgICAgICAgICAgIHsga2V5OiBzaG9ydF9uYW1lLCBjbGFzc05hbWU6ICdlbW9qaS1tYXJ0LXByZXZpZXctc2hvcnRuYW1lJyB9LFxuXHQgICAgICAgICAgICAgICAgICAnOicsXG5cdCAgICAgICAgICAgICAgICAgIHNob3J0X25hbWUsXG5cdCAgICAgICAgICAgICAgICAgICc6J1xuXHQgICAgICAgICAgICAgICAgKTtcblx0ICAgICAgICAgICAgICB9KVxuXHQgICAgICAgICAgICApLFxuXHQgICAgICAgICAgICBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcblx0ICAgICAgICAgICAgICAnZGl2Jyxcblx0ICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogJ2Vtb2ppLW1hcnQtcHJldmlldy1lbW90aWNvbnMnIH0sXG5cdCAgICAgICAgICAgICAgbGlzdGVkRW1vdGljb25zLm1hcChmdW5jdGlvbiAoZW1vdGljb24pIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcblx0ICAgICAgICAgICAgICAgICAgJ3NwYW4nLFxuXHQgICAgICAgICAgICAgICAgICB7IGtleTogZW1vdGljb24sIGNsYXNzTmFtZTogJ2Vtb2ppLW1hcnQtcHJldmlldy1lbW90aWNvbicgfSxcblx0ICAgICAgICAgICAgICAgICAgZW1vdGljb25cblx0ICAgICAgICAgICAgICAgICk7XG5cdCAgICAgICAgICAgICAgfSlcblx0ICAgICAgICAgICAgKVxuXHQgICAgICAgICAgKVxuXHQgICAgICAgICk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgcmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFxuXHQgICAgICAgICAgJ2RpdicsXG5cdCAgICAgICAgICB7IGNsYXNzTmFtZTogJ2Vtb2ppLW1hcnQtcHJldmlldycgfSxcblx0ICAgICAgICAgIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFxuXHQgICAgICAgICAgICAnZGl2Jyxcblx0ICAgICAgICAgICAgeyBjbGFzc05hbWU6ICdlbW9qaS1tYXJ0LXByZXZpZXctZW1vamknIH0sXG5cdCAgICAgICAgICAgIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF8uRW1vamksIF9leHRlbmRzKHtcblx0ICAgICAgICAgICAgICBlbW9qaTogaWRsZUVtb2ppXG5cdCAgICAgICAgICAgIH0sIGVtb2ppUHJvcHMpKVxuXHQgICAgICAgICAgKSxcblx0ICAgICAgICAgIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFxuXHQgICAgICAgICAgICAnZGl2Jyxcblx0ICAgICAgICAgICAgeyBjbGFzc05hbWU6ICdlbW9qaS1tYXJ0LXByZXZpZXctZGF0YScgfSxcblx0ICAgICAgICAgICAgX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXG5cdCAgICAgICAgICAgICAgJ3NwYW4nLFxuXHQgICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiAnZW1vamktbWFydC10aXRsZS1sYWJlbCcgfSxcblx0ICAgICAgICAgICAgICB0aXRsZVxuXHQgICAgICAgICAgICApXG5cdCAgICAgICAgICApLFxuXHQgICAgICAgICAgX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXG5cdCAgICAgICAgICAgICdkaXYnLFxuXHQgICAgICAgICAgICB7IGNsYXNzTmFtZTogJ2Vtb2ppLW1hcnQtcHJldmlldy1za2lucycgfSxcblx0ICAgICAgICAgICAgX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXy5Ta2lucywgc2tpbnNQcm9wcylcblx0ICAgICAgICAgIClcblx0ICAgICAgICApO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfV0pO1xuXG5cdCAgcmV0dXJuIFByZXZpZXc7XG5cdH0oX3JlYWN0Mi5kZWZhdWx0LkNvbXBvbmVudCk7XG5cblx0ZXhwb3J0cy5kZWZhdWx0ID0gUHJldmlldztcblxuXG5cdFByZXZpZXcucHJvcFR5cGVzID0ge1xuXHQgIHRpdGxlOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuXHQgIGVtb2ppOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuXHQgIGVtb2ppUHJvcHM6IF9yZWFjdDIuZGVmYXVsdC5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG5cdCAgc2tpbnNQcm9wczogX3JlYWN0Mi5kZWZhdWx0LlByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZFxuXHR9O1xuXG4vKioqLyB9LFxuLyogMjQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0JztcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5cdHZhciBfcmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG5cdHZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG5cdHZhciBfZW1vamlJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oMjUpO1xuXG5cdHZhciBfZW1vamlJbmRleDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbW9qaUluZGV4KTtcblxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5cdGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cblx0ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cblx0ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cblx0dmFyIFNlYXJjaCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG5cdCAgX2luaGVyaXRzKFNlYXJjaCwgX1JlYWN0JENvbXBvbmVudCk7XG5cblx0ICBmdW5jdGlvbiBTZWFyY2goKSB7XG5cdCAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU2VhcmNoKTtcblxuXHQgICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIE9iamVjdC5nZXRQcm90b3R5cGVPZihTZWFyY2gpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuXHQgIH1cblxuXHQgIF9jcmVhdGVDbGFzcyhTZWFyY2gsIFt7XG5cdCAgICBrZXk6ICdoYW5kbGVDaGFuZ2UnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZUNoYW5nZSgpIHtcblx0ICAgICAgdmFyIGlucHV0ID0gdGhpcy5yZWZzLmlucHV0O1xuXHQgICAgICB2YXIgdmFsdWUgPSBpbnB1dC52YWx1ZTtcblxuXHQgICAgICB0aGlzLnByb3BzLm9uU2VhcmNoKF9lbW9qaUluZGV4Mi5kZWZhdWx0LnNlYXJjaCh2YWx1ZSkpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2NsZWFyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcigpIHtcblx0ICAgICAgdGhpcy5yZWZzLmlucHV0LnZhbHVlID0gJyc7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAncmVuZGVyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdCAgICAgIHZhciBpMThuID0gdGhpcy5wcm9wcy5pMThuO1xuXG5cblx0ICAgICAgcmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCdpbnB1dCcsIHtcblx0ICAgICAgICByZWY6ICdpbnB1dCcsXG5cdCAgICAgICAgdHlwZTogJ3RleHQnLFxuXHQgICAgICAgIG9uQ2hhbmdlOiB0aGlzLmhhbmRsZUNoYW5nZS5iaW5kKHRoaXMpLFxuXHQgICAgICAgIHBsYWNlaG9sZGVyOiBpMThuLnNlYXJjaCxcblx0ICAgICAgICBjbGFzc05hbWU6ICdlbW9qaS1tYXJ0LXNlYXJjaCdcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfV0pO1xuXG5cdCAgcmV0dXJuIFNlYXJjaDtcblx0fShfcmVhY3QyLmRlZmF1bHQuQ29tcG9uZW50KTtcblxuXHRleHBvcnRzLmRlZmF1bHQgPSBTZWFyY2g7XG5cblxuXHRTZWFyY2gucHJvcFR5cGVzID0ge1xuXHQgIG9uU2VhcmNoOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLmZ1bmMsXG5cdCAgbWF4UmVzdWx0czogX3JlYWN0Mi5kZWZhdWx0LlByb3BUeXBlcy5udW1iZXJcblx0fTtcblxuXHRTZWFyY2guZGVmYXVsdFByb3BzID0ge1xuXHQgIG9uU2VhcmNoOiBmdW5jdGlvbiBvblNlYXJjaCgpIHt9LFxuXHQgIG1heFJlc3VsdHM6IDc1XG5cdH07XG5cbi8qKiovIH0sXG4vKiAyNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXG5cdHZhciBfZGF0YSA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpO1xuXG5cdHZhciBfZGF0YTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kYXRhKTtcblxuXHR2YXIgXyA9IF9fd2VicGFja19yZXF1aXJlX18oMjApO1xuXG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cblx0ZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSBlbHNlIHsgcmV0dXJuIEFycmF5LmZyb20oYXJyKTsgfSB9XG5cblx0dmFyIGluZGV4ID0ge307XG5cdHZhciBlbW9qaXNMaXN0ID0ge307XG5cdHZhciBlbW90aWNvbnNMaXN0ID0ge307XG5cblx0Zm9yICh2YXIgZW1vamkgaW4gX2RhdGEyLmRlZmF1bHQuZW1vamlzKSB7XG5cdCAgdmFyIGVtb2ppRGF0YSA9IF9kYXRhMi5kZWZhdWx0LmVtb2ppc1tlbW9qaV07XG5cdCAgdmFyIHNob3J0X25hbWVzID0gZW1vamlEYXRhLnNob3J0X25hbWVzO1xuXHQgIHZhciBlbW90aWNvbnMgPSBlbW9qaURhdGEuZW1vdGljb25zO1xuXHQgIHZhciBpZCA9IHNob3J0X25hbWVzWzBdO1xuXG5cdCAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuXHQgIHZhciBfZGlkSXRlcmF0b3JFcnJvciA9IGZhbHNlO1xuXHQgIHZhciBfaXRlcmF0b3JFcnJvciA9IHVuZGVmaW5lZDtcblxuXHQgIHRyeSB7XG5cdCAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBlbW90aWNvbnNbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gKF9zdGVwID0gX2l0ZXJhdG9yLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlKSB7XG5cdCAgICAgIHZhciBlbW90aWNvbiA9IF9zdGVwLnZhbHVlO1xuXG5cdCAgICAgIGlmICghZW1vdGljb25zTGlzdFtlbW90aWNvbl0pIHtcblx0ICAgICAgICBlbW90aWNvbnNMaXN0W2Vtb3RpY29uXSA9IGlkO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSBjYXRjaCAoZXJyKSB7XG5cdCAgICBfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG5cdCAgICBfaXRlcmF0b3JFcnJvciA9IGVycjtcblx0ICB9IGZpbmFsbHkge1xuXHQgICAgdHJ5IHtcblx0ICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uICYmIF9pdGVyYXRvci5yZXR1cm4pIHtcblx0ICAgICAgICBfaXRlcmF0b3IucmV0dXJuKCk7XG5cdCAgICAgIH1cblx0ICAgIH0gZmluYWxseSB7XG5cdCAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcikge1xuXHQgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgZW1vamlzTGlzdFtpZF0gPSAoMCwgXy5nZXRTYW5pdGl6ZWREYXRhKShpZCk7XG5cdH1cblxuXHRmdW5jdGlvbiBzZWFyY2godmFsdWUpIHtcblx0ICB2YXIgbWF4UmVzdWx0cyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IDc1IDogYXJndW1lbnRzWzFdO1xuXG5cdCAgdmFyIHJlc3VsdHMgPSBudWxsO1xuXG5cdCAgaWYgKHZhbHVlLmxlbmd0aCkge1xuXHQgICAgdmFyIHZhbHVlcyA9IHZhbHVlLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1tcXHN8LHxcXC18X10rLyksXG5cdCAgICAgICAgYWxsUmVzdWx0cyA9IFtdO1xuXG5cdCAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDIpIHtcblx0ICAgICAgdmFsdWVzID0gW3ZhbHVlc1swXSwgdmFsdWVzWzFdXTtcblx0ICAgIH1cblxuXHQgICAgYWxsUmVzdWx0cyA9IHZhbHVlcy5tYXAoZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgIHZhciBhUG9vbCA9IF9kYXRhMi5kZWZhdWx0LmVtb2ppcyxcblx0ICAgICAgICAgIGFJbmRleCA9IGluZGV4LFxuXHQgICAgICAgICAgbGVuZ3RoID0gMDtcblxuXHQgICAgICBpZiAodmFsdWUgPT0gJy0nIHx8IHZhbHVlID09ICctMScpIHtcblx0ICAgICAgICByZXR1cm4gW2Vtb2ppc0xpc3RbJy0xJ11dO1xuXHQgICAgICB9XG5cblx0ICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yID0gdHJ1ZTtcblx0ICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yMiA9IGZhbHNlO1xuXHQgICAgICB2YXIgX2l0ZXJhdG9yRXJyb3IyID0gdW5kZWZpbmVkO1xuXG5cdCAgICAgIHRyeSB7XG5cdCAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IHZhbHVlLnNwbGl0KCcnKVtTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwMjsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiA9IChfc3RlcDIgPSBfaXRlcmF0b3IyLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yID0gdHJ1ZSkge1xuXHQgICAgICAgICAgdmFyIGNoYXIgPSBfc3RlcDIudmFsdWU7XG5cblx0ICAgICAgICAgIGxlbmd0aCsrO1xuXG5cdCAgICAgICAgICBhSW5kZXhbY2hhcl0gfHwgKGFJbmRleFtjaGFyXSA9IHt9KTtcblx0ICAgICAgICAgIGFJbmRleCA9IGFJbmRleFtjaGFyXTtcblxuXHQgICAgICAgICAgaWYgKCFhSW5kZXgucmVzdWx0cykge1xuXHQgICAgICAgICAgICAoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgIHZhciBzY29yZXMgPSB7fTtcblxuXHQgICAgICAgICAgICAgIGFJbmRleC5yZXN1bHRzID0gW107XG5cdCAgICAgICAgICAgICAgYUluZGV4LnBvb2wgPSB7fTtcblxuXHQgICAgICAgICAgICAgIGZvciAodmFyIGlkIGluIGFQb29sKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgX2Vtb2ppID0gYVBvb2xbaWRdO1xuXHQgICAgICAgICAgICAgICAgdmFyIF9zZWFyY2ggPSBfZW1vamkuc2VhcmNoO1xuXHQgICAgICAgICAgICAgICAgdmFyIHN1YiA9IHZhbHVlLnN1YnN0cigwLCBsZW5ndGgpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHN1YkluZGV4ID0gX3NlYXJjaC5pbmRleE9mKHN1Yik7XG5cblx0ICAgICAgICAgICAgICAgIGlmIChzdWJJbmRleCAhPSAtMSkge1xuXHQgICAgICAgICAgICAgICAgICB2YXIgc2NvcmUgPSBzdWJJbmRleCArIDE7XG5cdCAgICAgICAgICAgICAgICAgIGlmIChzdWIgPT0gaWQpIHNjb3JlID0gMDtcblxuXHQgICAgICAgICAgICAgICAgICBhSW5kZXgucmVzdWx0cy5wdXNoKGVtb2ppc0xpc3RbaWRdKTtcblx0ICAgICAgICAgICAgICAgICAgYUluZGV4LnBvb2xbaWRdID0gX2Vtb2ppO1xuXG5cdCAgICAgICAgICAgICAgICAgIHNjb3Jlc1tpZF0gPSBzY29yZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICBhSW5kZXgucmVzdWx0cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgYVNjb3JlID0gc2NvcmVzW2EuaWRdLFxuXHQgICAgICAgICAgICAgICAgICAgIGJTY29yZSA9IHNjb3Jlc1tiLmlkXTtcblxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGFTY29yZSAtIGJTY29yZTtcblx0ICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfSkoKTtcblx0ICAgICAgICAgIH1cblxuXHQgICAgICAgICAgYVBvb2wgPSBhSW5kZXgucG9vbDtcblx0ICAgICAgICB9XG5cdCAgICAgIH0gY2F0Y2ggKGVycikge1xuXHQgICAgICAgIF9kaWRJdGVyYXRvckVycm9yMiA9IHRydWU7XG5cdCAgICAgICAgX2l0ZXJhdG9yRXJyb3IyID0gZXJyO1xuXHQgICAgICB9IGZpbmFsbHkge1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yICYmIF9pdGVyYXRvcjIucmV0dXJuKSB7XG5cdCAgICAgICAgICAgIF9pdGVyYXRvcjIucmV0dXJuKCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSBmaW5hbGx5IHtcblx0ICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjIpIHtcblx0ICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IyO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXG5cdCAgICAgIHJldHVybiBhSW5kZXgucmVzdWx0cztcblx0ICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoYSkge1xuXHQgICAgICByZXR1cm4gYTtcblx0ICAgIH0pO1xuXG5cdCAgICBpZiAoYWxsUmVzdWx0cy5sZW5ndGggPiAxKSB7XG5cdCAgICAgIHJlc3VsdHMgPSBfLmludGVyc2VjdC5hcHBseSh1bmRlZmluZWQsIF90b0NvbnN1bWFibGVBcnJheShhbGxSZXN1bHRzKSk7XG5cdCAgICB9IGVsc2UgaWYgKGFsbFJlc3VsdHMubGVuZ3RoKSB7XG5cdCAgICAgIHJlc3VsdHMgPSBhbGxSZXN1bHRzWzBdO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgcmVzdWx0cyA9IFtdO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIGlmIChyZXN1bHRzICYmIHJlc3VsdHMubGVuZ3RoKSB7XG5cdCAgICByZXN1bHRzID0gcmVzdWx0cy5zbGljZSgwLCBtYXhSZXN1bHRzKTtcblx0ICB9XG5cblx0ICByZXR1cm4gcmVzdWx0cztcblx0fVxuXG5cdGV4cG9ydHMuZGVmYXVsdCA9IHsgc2VhcmNoOiBzZWFyY2gsIGVtb2ppczogZW1vamlzTGlzdCwgZW1vdGljb25zOiBlbW90aWNvbnNMaXN0IH07XG5cbi8qKiovIH0sXG4vKiAyNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXG5cdHZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cblx0dmFyIF9yZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cblx0dmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuXHRmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5cdGZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5cdGZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5cdHZhciBTa2lucyA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG5cdCAgX2luaGVyaXRzKFNraW5zLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuXHQgIGZ1bmN0aW9uIFNraW5zKHByb3BzKSB7XG5cdCAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU2tpbnMpO1xuXG5cdCAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoU2tpbnMpLmNhbGwodGhpcywgcHJvcHMpKTtcblxuXHQgICAgX3RoaXMuc3RhdGUgPSB7XG5cdCAgICAgIG9wZW5lZDogZmFsc2Vcblx0ICAgIH07XG5cdCAgICByZXR1cm4gX3RoaXM7XG5cdCAgfVxuXG5cdCAgX2NyZWF0ZUNsYXNzKFNraW5zLCBbe1xuXHQgICAga2V5OiAnaGFuZGxlQ2xpY2snLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKHNraW4pIHtcblx0ICAgICAgdmFyIG9uQ2hhbmdlID0gdGhpcy5wcm9wcy5vbkNoYW5nZTtcblxuXG5cdCAgICAgIGlmICghdGhpcy5zdGF0ZS5vcGVuZWQpIHtcblx0ICAgICAgICB0aGlzLnNldFN0YXRlKHsgb3BlbmVkOiB0cnVlIH0pO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIG9uQ2hhbmdlKHNraW4pO1xuXHQgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBvcGVuZWQ6IGZhbHNlIH0pO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAncmVuZGVyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdCAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG5cdCAgICAgIHZhciBza2luID0gdGhpcy5wcm9wcy5za2luO1xuXHQgICAgICB2YXIgb3BlbmVkID0gdGhpcy5zdGF0ZS5vcGVuZWQ7XG5cblxuXHQgICAgICByZXR1cm4gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXG5cdCAgICAgICAgJ2RpdicsXG5cdCAgICAgICAgbnVsbCxcblx0ICAgICAgICBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcblx0ICAgICAgICAgICdkaXYnLFxuXHQgICAgICAgICAgeyBjbGFzc05hbWU6ICdlbW9qaS1tYXJ0LXNraW4tc3dhdGNoZXMgJyArIChvcGVuZWQgPyAnZW1vamktbWFydC1za2luLXN3YXRjaGVzLW9wZW5lZCcgOiAnJykgfSxcblx0ICAgICAgICAgIEFycmF5KDYpLmZpbGwoKS5tYXAoZnVuY3Rpb24gKF8sIGkpIHtcblx0ICAgICAgICAgICAgdmFyIHNraW5Ub25lID0gaSArIDEsXG5cdCAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHNraW5Ub25lID09IHNraW47XG5cblx0ICAgICAgICAgICAgcmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFxuXHQgICAgICAgICAgICAgICdzcGFuJyxcblx0ICAgICAgICAgICAgICB7IGtleTogJ3NraW4tdG9uZS0nICsgc2tpblRvbmUsIGNsYXNzTmFtZTogJ2Vtb2ppLW1hcnQtc2tpbi1zd2F0Y2ggJyArIChzZWxlY3RlZCA/ICdlbW9qaS1tYXJ0LXNraW4tc3dhdGNoLXNlbGVjdGVkJyA6ICcnKSB9LFxuXHQgICAgICAgICAgICAgIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCdzcGFuJywge1xuXHQgICAgICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcblx0ICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5oYW5kbGVDbGljayhza2luVG9uZSk7XG5cdCAgICAgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnZW1vamktbWFydC1za2luIGVtb2ppLW1hcnQtc2tpbi10b25lLScgKyBza2luVG9uZSB9KVxuXHQgICAgICAgICAgICApO1xuXHQgICAgICAgICAgfSlcblx0ICAgICAgICApXG5cdCAgICAgICk7XG5cdCAgICB9XG5cdCAgfV0pO1xuXG5cdCAgcmV0dXJuIFNraW5zO1xuXHR9KF9yZWFjdDIuZGVmYXVsdC5Db21wb25lbnQpO1xuXG5cdGV4cG9ydHMuZGVmYXVsdCA9IFNraW5zO1xuXG5cblx0U2tpbnMucHJvcFR5cGVzID0ge1xuXHQgIG9uQ2hhbmdlOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLmZ1bmMsXG5cdCAgc2tpbjogX3JlYWN0Mi5kZWZhdWx0LlByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZFxuXHR9O1xuXG5cdFNraW5zLmRlZmF1bHRQcm9wcyA9IHtcblx0ICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoKSB7fVxuXHR9O1xuXG4vKioqLyB9XG4vKioqKioqLyBdKVxufSk7XG47XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Vtb2ppLW1hcnQvZGlzdC9lbW9qaS1tYXJ0LmpzXG4vLyBtb2R1bGUgaWQgPSA0MzNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 434 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });\n\nvar _DataModel = __webpack_require__(149);var _DataModel2 = _interopRequireDefault(_DataModel);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}\n\nvar Mapper = {\n  // this function is to retrieve a mapper JSON object from the database\n  // @param id = the id of the mapper to retrieve\n  get: function get(id, callback) {\n    $.ajax({\n      url: '/users/' + id + '.json',\n      success: function success(data) {\n        callback(new _DataModel2.default.Mapper(data));\n      } });\n\n  } }; /* global $ */exports.default =\n\n\nMapper;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDM0LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvTWFwcGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGdsb2JhbCAkICovXG5cbmltcG9ydCBEYXRhTW9kZWwgZnJvbSAnLi9EYXRhTW9kZWwnXG5cbmNvbnN0IE1hcHBlciA9IHtcbiAgLy8gdGhpcyBmdW5jdGlvbiBpcyB0byByZXRyaWV2ZSBhIG1hcHBlciBKU09OIG9iamVjdCBmcm9tIHRoZSBkYXRhYmFzZVxuICAvLyBAcGFyYW0gaWQgPSB0aGUgaWQgb2YgdGhlIG1hcHBlciB0byByZXRyaWV2ZVxuICBnZXQ6IGZ1bmN0aW9uKGlkLCBjYWxsYmFjaykge1xuICAgICQuYWpheCh7XG4gICAgICB1cmw6IGAvdXNlcnMvJHtpZH0uanNvbmAsXG4gICAgICBzdWNjZXNzOiBkYXRhID0+IHtcbiAgICAgICAgY2FsbGJhY2sobmV3IERhdGFNb2RlbC5NYXBwZXIoZGF0YSkpXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYXBwZXJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBmcm9udGVuZC9zcmMvTWV0YW1hcHMvTWFwcGVyLmpzIl0sIm1hcHBpbmdzIjoiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 435 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });\n\nvar _simplewebrtc = __webpack_require__(436);var _simplewebrtc2 = _interopRequireDefault(_simplewebrtc);\nvar _socketioconnection = __webpack_require__(490);var _socketioconnection2 = _interopRequireDefault(_socketioconnection);\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _Cable = __webpack_require__(9);var _Cable2 = _interopRequireDefault(_Cable);\nvar _Create = __webpack_require__(173);var _Create2 = _interopRequireDefault(_Create);\nvar _DataModel = __webpack_require__(149);var _DataModel2 = _interopRequireDefault(_DataModel);\nvar _JIT = __webpack_require__(355);var _JIT2 = _interopRequireDefault(_JIT);\nvar _Util = __webpack_require__(410);var _Util2 = _interopRequireDefault(_Util);\nvar _Views = __webpack_require__(541);var _Views2 = _interopRequireDefault(_Views);\nvar _Visualize = __webpack_require__(561);var _Visualize2 = _interopRequireDefault(_Visualize);\n\nvar _events = __webpack_require__(560);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar _receivable = __webpack_require__(567);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar _sendable = __webpack_require__(568);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar Realtime = {\n  juntoState: { connectedPeople: {}, liveMaps: {} },\n  videoId: 'video-wrapper',\n  socket: null,\n  webrtc: null,\n  readyToCall: false,\n  mappersOnMap: {},\n  disconnected: false,\n  chatOpen: false,\n  soundId: null,\n  broadcastingStatus: false,\n  inConversation: false,\n  localVideo: null,\n  'junto_spinner_darkgrey.gif': '',\n  init: function init(serverData) {\n    var self = Realtime;\n\n    self.addJuntoListeners();\n\n    self.socket = new _socketioconnection2.default({\n      url: serverData['REALTIME_SERVER'],\n      socketio: {\n        // don't poll forever if in development\n        reconnectionAttempts: serverData.RAILS_ENV === 'development' ? 5 : Infinity } });\n\n\n    self['junto_spinner_darkgrey.gif'] = serverData['junto_spinner_darkgrey.gif'];\n\n    self.socket.on('connect', function () {\n      console.log('connected');\n      if (_Active2.default.Map && _Active2.default.Mapper && _Active2.default.Map.authorizeToEdit(_Active2.default.Mapper)) {\n        self.checkForCall();\n        self.joinMap();\n      }\n      subscribeToEvents(self, self.socket);\n      self.disconnected = false;\n    });\n    self.socket.on('disconnect', function () {\n      self.disconnected = true;\n    });\n\n    if (_Active2.default.Mapper) {\n      self.webrtc = new _simplewebrtc2.default({\n        connection: self.socket,\n        localVideoEl: self.videoId,\n        remoteVideosEl: '',\n        debug: true,\n        detectSpeakingEvents: false, // true,\n        autoAdjustMic: false, // true,\n        autoRequestMedia: false,\n        localVideo: {\n          autoplay: true,\n          mirror: true,\n          muted: true },\n\n        media: {\n          video: true,\n          audio: true },\n\n        nick: _Active2.default.Mapper.id });\n\n      self.webrtc.webrtc.on('iceFailed', function (peer) {\n        console.log('local ice failure', peer);\n        // local ice failure\n      });\n      self.webrtc.webrtc.on('connectivityError', function (peer) {\n        console.log('remote ice failure', peer);\n        // remote ice failure\n      });\n\n      var $video = $('<video></video>').attr('id', self.videoId);\n      self.localVideo = {\n        $video: $video,\n        view: new _Views2.default.VideoView($video[0], $('body'), 'me', true, {\n          DOUBLE_CLICK_TOLERANCE: 200,\n          avatar: _Active2.default.Mapper ? _Active2.default.Mapper.get('image') : '' }) };\n\n\n\n      self.room = new _Views2.default.Room({\n        webrtc: self.webrtc,\n        socket: self.socket,\n        room: 'global',\n        $video: self.localVideo.$video,\n        myVideoView: self.localVideo.view,\n        config: { DOUBLE_CLICK_TOLERANCE: 200 } });\n\n      self.room.videoAdded(self.handleVideoAdded);\n\n      self.startActiveMap();\n    } // if Active.Mapper\n  },\n  addJuntoListeners: function addJuntoListeners() {\n    var self = Realtime;\n\n    $(document).on(_Views.ChatView.events.openTray, function () {\n      $('.main').addClass('compressed');\n      self.chatOpen = true;\n      self.positionPeerIcons();\n    });\n    $(document).on(_Views.ChatView.events.closeTray, function () {\n      $('.main').removeClass('compressed');\n      self.chatOpen = false;\n      self.positionPeerIcons();\n    });\n    $(document).on(_Views.ChatView.events.videosOn, function () {\n      $('#wrapper').removeClass('hideVideos');\n    });\n    $(document).on(_Views.ChatView.events.videosOff, function () {\n      $('#wrapper').addClass('hideVideos');\n    });\n    $(document).on(_Views.ChatView.events.cursorsOn, function () {\n      $('#wrapper').removeClass('hideCursors');\n    });\n    $(document).on(_Views.ChatView.events.cursorsOff, function () {\n      $('#wrapper').addClass('hideCursors');\n    });\n  },\n  startActiveMap: function startActiveMap() {\n    var self = Realtime;\n    if (_Active2.default.Map && _Active2.default.Mapper) {\n      if (_Active2.default.Map.authorizeToEdit(_Active2.default.Mapper)) {\n        self.turnOn();\n        self.checkForCall();\n        self.joinMap();\n      }\n      self.setupChat(); // chat can happen on public maps too\n      _Cable2.default.subscribeToMap(_Active2.default.Map.id); // people with edit rights can still see live updates\n    }\n  },\n  endActiveMap: function endActiveMap() {\n    var self = Realtime;\n    $(document).off('.map');\n    // leave the appropriate rooms to leave\n    if (self.inConversation) self.leaveCall();\n    self.leaveMap();\n    $('.collabCompass').remove();\n    if (self.room) self.room.leave();\n    _Views.ChatView.hide();\n    _Views.ChatView.close();\n    _Views.ChatView.reset();\n    _Cable2.default.unsubscribeFromMap();\n  },\n  turnOn: function turnOn(notify) {\n    var self = Realtime;\n    $('.collabCompass').show();\n    self.room.room = 'map-' + _Active2.default.Map.id;\n    self.activeMapper = {\n      id: _Active2.default.Mapper.id,\n      name: _Active2.default.Mapper.get('name'),\n      username: _Active2.default.Mapper.get('name'),\n      image: _Active2.default.Mapper.get('image'),\n      color: _Util2.default.getPastelColor(),\n      self: true };\n\n    self.localVideo.view.$container.find('.video-cutoff').css({\n      border: '4px solid ' + self.activeMapper.color });\n\n    self.setupLocalEvents();\n  },\n  setupChat: function setupChat() {\n    var self = Realtime;\n    _Views.ChatView.setNewMap();\n    _Views.ChatView.addParticipant(self.activeMapper);\n    _Views.ChatView.addMessages(new _DataModel2.default.MessageCollection(_DataModel2.default.Messages), true);\n    _Views.ChatView.show();\n  },\n  setupLocalEvents: function setupLocalEvents() {\n    var self = Realtime;\n    // local event listeners that trigger events\n    var panOrZoom = function panOrZoom() {\n      self.positionPeerIcons();\n      _Create2.default.newSynapse.updateForm();\n      _Create2.default.newTopic.position();\n    };\n    $(document).on(_JIT2.default.events.zoom + '.map', panOrZoom);\n    $(document).on(_JIT2.default.events.pan + '.map', panOrZoom);\n    $(document).on('mousemove.map', function (event) {\n      var pixels = {\n        x: event.pageX,\n        y: event.pageY };\n\n      var coords = _Util2.default.pixelsToCoords(_Visualize2.default.mGraph, pixels);\n      self.sendCoords(coords);\n    });\n    $(document).on(_JIT2.default.events.topicDrag + '.map', function (event, positions) {\n      self.dragTopic(positions);\n    });\n  },\n  countOthersInConversation: function countOthersInConversation() {\n    var self = Realtime;\n    var count = 0;\n    for (var key in self.mappersOnMap) {\n      if (self.mappersOnMap[key].inConversation) count++;\n    }\n    return count;\n  },\n  handleVideoAdded: function handleVideoAdded(v, id) {\n    var self = Realtime;\n    self.positionVideos();\n    v.setParent($('#wrapper'));\n    v.$container.find('.video-cutoff').css({\n      border: '4px solid ' + self.mappersOnMap[id].color });\n\n    $('#wrapper').append(v.$container);\n  },\n  positionVideos: function positionVideos() {\n    var self = Realtime;\n    var videoIds = Object.keys(self.room.videos);\n    // var numOfVideos = videoIds.length\n    // var numOfVideosToPosition = _.filter(videoIds, function(id) {\n    //   return !self.room.videos[id].manuallyPositioned\n    // }).length\n\n    var screenHeight = $(document).height();\n    var topExtraPadding = 20;\n    var topPadding = 30;\n    var leftPadding = 30;\n    var videoHeight = 150;\n    var videoWidth = 180;\n    var column = 0;\n    var row = 0;\n    var yFormula = function yFormula() {\n      var y = topExtraPadding + (topPadding + videoHeight) * row + topPadding;\n      if (y + videoHeight > screenHeight) {\n        row = 0;\n        column += 1;\n        y = yFormula();\n      }\n      row++;\n      return y;\n    };\n    var xFormula = function xFormula() {\n      var x = (leftPadding + videoWidth) * column + leftPadding;\n      return x;\n    };\n\n    // do self first\n    var myVideo = Realtime.localVideo.view;\n    if (!myVideo.manuallyPositioned) {\n      myVideo.$container.css({\n        top: yFormula() + 'px',\n        left: xFormula() + 'px' });\n\n    }\n    videoIds.forEach(function (id) {\n      var video = self.room.videos[id];\n      if (!video.manuallyPositioned) {\n        video.$container.css({\n          top: yFormula() + 'px',\n          left: xFormula() + 'px' });\n\n      }\n    });\n  },\n  callEnded: function callEnded() {\n    var self = Realtime;\n\n    _Views.ChatView.conversationEnded();\n    self.room.leaveVideoOnly();\n    self.inConversation = false;\n    self.localVideo.view.$container.hide().css({\n      top: '72px',\n      left: '30px' });\n\n    self.localVideo.view.audioOn();\n    self.localVideo.view.videoOn();\n  },\n  createCompass: function createCompass(name, id, image, color) {\n    var str = '<img width=\"28\" height=\"28\" src=\"' + image + '\" /><p>' + name + '</p>';\n    str += '<div id=\"compassArrow' + id + '\" class=\"compassArrow\"></div>';\n    $('#compass' + id).remove();\n    $('<div/>', {\n      id: 'compass' + id,\n      class: 'collabCompass' }).\n    html(str).appendTo('#wrapper');\n    $('#compass' + id + ' img').css({\n      'border': '2px solid ' + color });\n\n    $('#compass' + id + ' p').css({\n      'background-color': color });\n\n  },\n  positionPeerIcons: function positionPeerIcons() {\n    var self = Realtime;\n    for (var key in self.mappersOnMap) {\n      self.positionPeerIcon(key);\n    }\n  },\n  positionPeerIcon: function positionPeerIcon(id) {\n    var self = Realtime;\n    var mapper = self.mappersOnMap[id];\n\n    var origPixels = _Util2.default.coordsToPixels(_Visualize2.default.mGraph, mapper.coords);\n    var pixels = self.limitPixelsToScreen(origPixels);\n    $('#compass' + id).css({\n      left: pixels.x + 'px',\n      top: pixels.y + 'px' });\n\n    /* showing the arrow if the collaborator is off of the viewport screen */\n    if (origPixels.x !== pixels.x || origPixels.y !== pixels.y) {\n      var dy = origPixels.y - pixels.y; // opposite\n      var dx = origPixels.x - pixels.x; // adjacent\n      var angle = Math.atan2(dy, dx);\n\n      $('#compassArrow' + id).show().css({\n        transform: 'rotate(' + angle + 'rad)',\n        '-webkit-transform': 'rotate(' + angle + 'rad)' });\n\n\n      if (dx > 0) {\n        $('#compass' + id).addClass('labelLeft');\n      }\n    } else {\n      $('#compassArrow' + id).hide();\n      $('#compass' + id).removeClass('labelLeft');\n    }\n  },\n  limitPixelsToScreen: function limitPixelsToScreen(pixels) {\n    var self = Realtime;\n\n    var boundary = self.chatOpen ? '#wrapper' : document;\n    var xLimit, yLimit;\n    var xMax = $(boundary).width();\n    var yMax = $(boundary).height();\n    var compassDiameter = 56;\n    var compassArrowSize = 24;\n\n    xLimit = Math.max(0 + compassArrowSize, pixels.x);\n    xLimit = Math.min(xLimit, xMax - compassDiameter);\n    yLimit = Math.max(0 + compassArrowSize, pixels.y);\n    yLimit = Math.min(yLimit, yMax - compassDiameter);\n\n    return { x: xLimit, y: yLimit };\n  } }; /* global $ */\n\n\nvar sendables = [\n['joinMap', _sendable.joinMap],\n['leaveMap', _sendable.leaveMap],\n['checkForCall', _sendable.checkForCall],\n['acceptCall', _sendable.acceptCall],\n['denyCall', _sendable.denyCall],\n['denyInvite', _sendable.denyInvite],\n['inviteToJoin', _sendable.inviteToJoin],\n['inviteACall', _sendable.inviteACall],\n['joinCall', _sendable.joinCall],\n['leaveCall', _sendable.leaveCall],\n['sendMapperInfo', _sendable.sendMapperInfo],\n['sendCoords', _sendable.sendCoords],\n['dragTopic', _sendable.dragTopic]];\n\nsendables.forEach(function (sendable) {\n  Realtime[sendable[0]] = sendable[1](Realtime);\n});\n\nvar subscribeToEvents = function subscribeToEvents(Realtime, socket) {\n  socket.on(_events.JUNTO_UPDATED, (0, _receivable.juntoUpdated)(Realtime));\n  socket.on(_events.INVITED_TO_CALL, (0, _receivable.invitedToCall)(Realtime));\n  socket.on(_events.INVITED_TO_JOIN, (0, _receivable.invitedToJoin)(Realtime));\n  socket.on(_events.CALL_ACCEPTED, (0, _receivable.callAccepted)(Realtime));\n  socket.on(_events.CALL_DENIED, (0, _receivable.callDenied)(Realtime));\n  socket.on(_events.INVITE_DENIED, (0, _receivable.inviteDenied)(Realtime));\n  socket.on(_events.CALL_IN_PROGRESS, (0, _receivable.callInProgress)(Realtime));\n  socket.on(_events.CALL_STARTED, (0, _receivable.callStarted)(Realtime));\n  socket.on(_events.MAPPER_LIST_UPDATED, (0, _receivable.mapperListUpdated)(Realtime));\n  socket.on(_events.MAPPER_JOINED_CALL, (0, _receivable.mapperJoinedCall)(Realtime));\n  socket.on(_events.MAPPER_LEFT_CALL, (0, _receivable.mapperLeftCall)(Realtime));\n  socket.on(_events.PEER_COORDS_UPDATED, (0, _receivable.peerCoordsUpdated)(Realtime));\n  socket.on(_events.NEW_MAPPER, (0, _receivable.newMapper)(Realtime));\n  socket.on(_events.LOST_MAPPER, (0, _receivable.lostMapper)(Realtime));\n  socket.on(_events.TOPIC_DRAGGED, (0, _receivable.topicDragged)(Realtime));\n};exports.default =\n\nRealtime;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDM1LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvUmVhbHRpbWUvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsICQgKi9cblxuaW1wb3J0IFNpbXBsZVdlYlJUQyBmcm9tICdzaW1wbGV3ZWJydGMnXG5pbXBvcnQgU29ja2V0SW9Db25uZWN0aW9uIGZyb20gJ3NpbXBsZXdlYnJ0Yy9zb2NrZXRpb2Nvbm5lY3Rpb24nXG5cbmltcG9ydCBBY3RpdmUgZnJvbSAnLi4vQWN0aXZlJ1xuaW1wb3J0IENhYmxlIGZyb20gJy4uL0NhYmxlJ1xuaW1wb3J0IENyZWF0ZSBmcm9tICcuLi9DcmVhdGUnXG5pbXBvcnQgRGF0YU1vZGVsIGZyb20gJy4uL0RhdGFNb2RlbCdcbmltcG9ydCBKSVQgZnJvbSAnLi4vSklUJ1xuaW1wb3J0IFV0aWwgZnJvbSAnLi4vVXRpbCdcbmltcG9ydCBWaWV3cywgeyBDaGF0VmlldyB9IGZyb20gJy4uL1ZpZXdzJ1xuaW1wb3J0IFZpc3VhbGl6ZSBmcm9tICcuLi9WaXN1YWxpemUnXG5cbmltcG9ydCB7XG4gIEpVTlRPX1VQREFURUQsXG4gIElOVklURURfVE9fQ0FMTCxcbiAgSU5WSVRFRF9UT19KT0lOLFxuICBDQUxMX0FDQ0VQVEVELFxuICBDQUxMX0RFTklFRCxcbiAgSU5WSVRFX0RFTklFRCxcbiAgQ0FMTF9JTl9QUk9HUkVTUyxcbiAgQ0FMTF9TVEFSVEVELFxuICBNQVBQRVJfTElTVF9VUERBVEVELFxuICBNQVBQRVJfSk9JTkVEX0NBTEwsXG4gIE1BUFBFUl9MRUZUX0NBTEwsXG4gIE5FV19NQVBQRVIsXG4gIExPU1RfTUFQUEVSLFxuICBQRUVSX0NPT1JEU19VUERBVEVELFxuICBUT1BJQ19EUkFHR0VEXG59IGZyb20gJy4vZXZlbnRzJ1xuXG5pbXBvcnQge1xuICBqdW50b1VwZGF0ZWQsXG4gIGludml0ZWRUb0NhbGwsXG4gIGludml0ZWRUb0pvaW4sXG4gIGNhbGxBY2NlcHRlZCxcbiAgY2FsbERlbmllZCxcbiAgaW52aXRlRGVuaWVkLFxuICBjYWxsSW5Qcm9ncmVzcyxcbiAgY2FsbFN0YXJ0ZWQsXG4gIG1hcHBlckxpc3RVcGRhdGVkLFxuICBtYXBwZXJKb2luZWRDYWxsLFxuICBtYXBwZXJMZWZ0Q2FsbCxcbiAgcGVlckNvb3Jkc1VwZGF0ZWQsXG4gIG5ld01hcHBlcixcbiAgbG9zdE1hcHBlcixcbiAgdG9waWNEcmFnZ2VkXG59IGZyb20gJy4vcmVjZWl2YWJsZSdcblxuaW1wb3J0IHtcbiAgam9pbk1hcCxcbiAgbGVhdmVNYXAsXG4gIGNoZWNrRm9yQ2FsbCxcbiAgYWNjZXB0Q2FsbCxcbiAgZGVueUNhbGwsXG4gIGRlbnlJbnZpdGUsXG4gIGludml0ZVRvSm9pbixcbiAgaW52aXRlQUNhbGwsXG4gIGpvaW5DYWxsLFxuICBsZWF2ZUNhbGwsXG4gIHNlbmRDb29yZHMsXG4gIHNlbmRNYXBwZXJJbmZvLFxuICBkcmFnVG9waWNcbn0gZnJvbSAnLi9zZW5kYWJsZSdcblxubGV0IFJlYWx0aW1lID0ge1xuICBqdW50b1N0YXRlOiB7IGNvbm5lY3RlZFBlb3BsZToge30sIGxpdmVNYXBzOiB7fSB9LFxuICB2aWRlb0lkOiAndmlkZW8td3JhcHBlcicsXG4gIHNvY2tldDogbnVsbCxcbiAgd2VicnRjOiBudWxsLFxuICByZWFkeVRvQ2FsbDogZmFsc2UsXG4gIG1hcHBlcnNPbk1hcDoge30sXG4gIGRpc2Nvbm5lY3RlZDogZmFsc2UsXG4gIGNoYXRPcGVuOiBmYWxzZSxcbiAgc291bmRJZDogbnVsbCxcbiAgYnJvYWRjYXN0aW5nU3RhdHVzOiBmYWxzZSxcbiAgaW5Db252ZXJzYXRpb246IGZhbHNlLFxuICBsb2NhbFZpZGVvOiBudWxsLFxuICAnanVudG9fc3Bpbm5lcl9kYXJrZ3JleS5naWYnOiAnJyxcbiAgaW5pdDogZnVuY3Rpb24oc2VydmVyRGF0YSkge1xuICAgIHZhciBzZWxmID0gUmVhbHRpbWVcblxuICAgIHNlbGYuYWRkSnVudG9MaXN0ZW5lcnMoKVxuXG4gICAgc2VsZi5zb2NrZXQgPSBuZXcgU29ja2V0SW9Db25uZWN0aW9uKHtcbiAgICAgIHVybDogc2VydmVyRGF0YVsnUkVBTFRJTUVfU0VSVkVSJ10sXG4gICAgICBzb2NrZXRpbzoge1xuICAgICAgICAvLyBkb24ndCBwb2xsIGZvcmV2ZXIgaWYgaW4gZGV2ZWxvcG1lbnRcbiAgICAgICAgcmVjb25uZWN0aW9uQXR0ZW1wdHM6IHNlcnZlckRhdGEuUkFJTFNfRU5WID09PSAnZGV2ZWxvcG1lbnQnID8gNSA6IEluZmluaXR5XG4gICAgICB9XG4gICAgfSlcbiAgICBzZWxmWydqdW50b19zcGlubmVyX2RhcmtncmV5LmdpZiddID0gc2VydmVyRGF0YVsnanVudG9fc3Bpbm5lcl9kYXJrZ3JleS5naWYnXVxuXG4gICAgc2VsZi5zb2NrZXQub24oJ2Nvbm5lY3QnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdjb25uZWN0ZWQnKVxuICAgICAgaWYgKEFjdGl2ZS5NYXAgJiYgQWN0aXZlLk1hcHBlciAmJiBBY3RpdmUuTWFwLmF1dGhvcml6ZVRvRWRpdChBY3RpdmUuTWFwcGVyKSkge1xuICAgICAgICBzZWxmLmNoZWNrRm9yQ2FsbCgpXG4gICAgICAgIHNlbGYuam9pbk1hcCgpXG4gICAgICB9XG4gICAgICBzdWJzY3JpYmVUb0V2ZW50cyhzZWxmLCBzZWxmLnNvY2tldClcbiAgICAgIHNlbGYuZGlzY29ubmVjdGVkID0gZmFsc2VcbiAgICB9KVxuICAgIHNlbGYuc29ja2V0Lm9uKCdkaXNjb25uZWN0JywgZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmRpc2Nvbm5lY3RlZCA9IHRydWVcbiAgICB9KVxuXG4gICAgaWYgKEFjdGl2ZS5NYXBwZXIpIHtcbiAgICAgIHNlbGYud2VicnRjID0gbmV3IFNpbXBsZVdlYlJUQyh7XG4gICAgICAgIGNvbm5lY3Rpb246IHNlbGYuc29ja2V0LFxuICAgICAgICBsb2NhbFZpZGVvRWw6IHNlbGYudmlkZW9JZCxcbiAgICAgICAgcmVtb3RlVmlkZW9zRWw6ICcnLFxuICAgICAgICBkZWJ1ZzogdHJ1ZSxcbiAgICAgICAgZGV0ZWN0U3BlYWtpbmdFdmVudHM6IGZhbHNlLCAvLyB0cnVlLFxuICAgICAgICBhdXRvQWRqdXN0TWljOiBmYWxzZSwgLy8gdHJ1ZSxcbiAgICAgICAgYXV0b1JlcXVlc3RNZWRpYTogZmFsc2UsXG4gICAgICAgIGxvY2FsVmlkZW86IHtcbiAgICAgICAgICBhdXRvcGxheTogdHJ1ZSxcbiAgICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgICAgbXV0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgbWVkaWE6IHtcbiAgICAgICAgICB2aWRlbzogdHJ1ZSxcbiAgICAgICAgICBhdWRpbzogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBuaWNrOiBBY3RpdmUuTWFwcGVyLmlkXG4gICAgICB9KVxuICAgICAgc2VsZi53ZWJydGMud2VicnRjLm9uKCdpY2VGYWlsZWQnLCBmdW5jdGlvbihwZWVyKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdsb2NhbCBpY2UgZmFpbHVyZScsIHBlZXIpXG4gICAgICAgIC8vIGxvY2FsIGljZSBmYWlsdXJlXG4gICAgICB9KVxuICAgICAgc2VsZi53ZWJydGMud2VicnRjLm9uKCdjb25uZWN0aXZpdHlFcnJvcicsIGZ1bmN0aW9uKHBlZXIpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ3JlbW90ZSBpY2UgZmFpbHVyZScsIHBlZXIpXG4gICAgICAgIC8vIHJlbW90ZSBpY2UgZmFpbHVyZVxuICAgICAgfSlcblxuICAgICAgdmFyICR2aWRlbyA9ICQoJzx2aWRlbz48L3ZpZGVvPicpLmF0dHIoJ2lkJywgc2VsZi52aWRlb0lkKVxuICAgICAgc2VsZi5sb2NhbFZpZGVvID0ge1xuICAgICAgICAkdmlkZW86ICR2aWRlbyxcbiAgICAgICAgdmlldzogbmV3IFZpZXdzLlZpZGVvVmlldygkdmlkZW9bMF0sICQoJ2JvZHknKSwgJ21lJywgdHJ1ZSwge1xuICAgICAgICAgIERPVUJMRV9DTElDS19UT0xFUkFOQ0U6IDIwMCxcbiAgICAgICAgICBhdmF0YXI6IEFjdGl2ZS5NYXBwZXIgPyBBY3RpdmUuTWFwcGVyLmdldCgnaW1hZ2UnKSA6ICcnXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIHNlbGYucm9vbSA9IG5ldyBWaWV3cy5Sb29tKHtcbiAgICAgICAgd2VicnRjOiBzZWxmLndlYnJ0YyxcbiAgICAgICAgc29ja2V0OiBzZWxmLnNvY2tldCxcbiAgICAgICAgcm9vbTogJ2dsb2JhbCcsXG4gICAgICAgICR2aWRlbzogc2VsZi5sb2NhbFZpZGVvLiR2aWRlbyxcbiAgICAgICAgbXlWaWRlb1ZpZXc6IHNlbGYubG9jYWxWaWRlby52aWV3LFxuICAgICAgICBjb25maWc6IHsgRE9VQkxFX0NMSUNLX1RPTEVSQU5DRTogMjAwIH1cbiAgICAgIH0pXG4gICAgICBzZWxmLnJvb20udmlkZW9BZGRlZChzZWxmLmhhbmRsZVZpZGVvQWRkZWQpXG5cbiAgICAgIHNlbGYuc3RhcnRBY3RpdmVNYXAoKVxuICAgIH0gLy8gaWYgQWN0aXZlLk1hcHBlclxuICB9LFxuICBhZGRKdW50b0xpc3RlbmVyczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSBSZWFsdGltZVxuXG4gICAgJChkb2N1bWVudCkub24oQ2hhdFZpZXcuZXZlbnRzLm9wZW5UcmF5LCBmdW5jdGlvbigpIHtcbiAgICAgICQoJy5tYWluJykuYWRkQ2xhc3MoJ2NvbXByZXNzZWQnKVxuICAgICAgc2VsZi5jaGF0T3BlbiA9IHRydWVcbiAgICAgIHNlbGYucG9zaXRpb25QZWVySWNvbnMoKVxuICAgIH0pXG4gICAgJChkb2N1bWVudCkub24oQ2hhdFZpZXcuZXZlbnRzLmNsb3NlVHJheSwgZnVuY3Rpb24oKSB7XG4gICAgICAkKCcubWFpbicpLnJlbW92ZUNsYXNzKCdjb21wcmVzc2VkJylcbiAgICAgIHNlbGYuY2hhdE9wZW4gPSBmYWxzZVxuICAgICAgc2VsZi5wb3NpdGlvblBlZXJJY29ucygpXG4gICAgfSlcbiAgICAkKGRvY3VtZW50KS5vbihDaGF0Vmlldy5ldmVudHMudmlkZW9zT24sIGZ1bmN0aW9uKCkge1xuICAgICAgJCgnI3dyYXBwZXInKS5yZW1vdmVDbGFzcygnaGlkZVZpZGVvcycpXG4gICAgfSlcbiAgICAkKGRvY3VtZW50KS5vbihDaGF0Vmlldy5ldmVudHMudmlkZW9zT2ZmLCBmdW5jdGlvbigpIHtcbiAgICAgICQoJyN3cmFwcGVyJykuYWRkQ2xhc3MoJ2hpZGVWaWRlb3MnKVxuICAgIH0pXG4gICAgJChkb2N1bWVudCkub24oQ2hhdFZpZXcuZXZlbnRzLmN1cnNvcnNPbiwgZnVuY3Rpb24oKSB7XG4gICAgICAkKCcjd3JhcHBlcicpLnJlbW92ZUNsYXNzKCdoaWRlQ3Vyc29ycycpXG4gICAgfSlcbiAgICAkKGRvY3VtZW50KS5vbihDaGF0Vmlldy5ldmVudHMuY3Vyc29yc09mZiwgZnVuY3Rpb24oKSB7XG4gICAgICAkKCcjd3JhcHBlcicpLmFkZENsYXNzKCdoaWRlQ3Vyc29ycycpXG4gICAgfSlcbiAgfSxcbiAgc3RhcnRBY3RpdmVNYXA6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gUmVhbHRpbWVcbiAgICBpZiAoQWN0aXZlLk1hcCAmJiBBY3RpdmUuTWFwcGVyKSB7XG4gICAgICBpZiAoQWN0aXZlLk1hcC5hdXRob3JpemVUb0VkaXQoQWN0aXZlLk1hcHBlcikpIHtcbiAgICAgICAgc2VsZi50dXJuT24oKVxuICAgICAgICBzZWxmLmNoZWNrRm9yQ2FsbCgpXG4gICAgICAgIHNlbGYuam9pbk1hcCgpXG4gICAgICB9XG4gICAgICBzZWxmLnNldHVwQ2hhdCgpIC8vIGNoYXQgY2FuIGhhcHBlbiBvbiBwdWJsaWMgbWFwcyB0b29cbiAgICAgIENhYmxlLnN1YnNjcmliZVRvTWFwKEFjdGl2ZS5NYXAuaWQpIC8vIHBlb3BsZSB3aXRoIGVkaXQgcmlnaHRzIGNhbiBzdGlsbCBzZWUgbGl2ZSB1cGRhdGVzXG4gICAgfVxuICB9LFxuICBlbmRBY3RpdmVNYXA6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gUmVhbHRpbWVcbiAgICAkKGRvY3VtZW50KS5vZmYoJy5tYXAnKVxuICAgIC8vIGxlYXZlIHRoZSBhcHByb3ByaWF0ZSByb29tcyB0byBsZWF2ZVxuICAgIGlmIChzZWxmLmluQ29udmVyc2F0aW9uKSBzZWxmLmxlYXZlQ2FsbCgpXG4gICAgc2VsZi5sZWF2ZU1hcCgpXG4gICAgJCgnLmNvbGxhYkNvbXBhc3MnKS5yZW1vdmUoKVxuICAgIGlmIChzZWxmLnJvb20pIHNlbGYucm9vbS5sZWF2ZSgpXG4gICAgQ2hhdFZpZXcuaGlkZSgpXG4gICAgQ2hhdFZpZXcuY2xvc2UoKVxuICAgIENoYXRWaWV3LnJlc2V0KClcbiAgICBDYWJsZS51bnN1YnNjcmliZUZyb21NYXAoKVxuICB9LFxuICB0dXJuT246IGZ1bmN0aW9uKG5vdGlmeSkge1xuICAgIHZhciBzZWxmID0gUmVhbHRpbWVcbiAgICAkKCcuY29sbGFiQ29tcGFzcycpLnNob3coKVxuICAgIHNlbGYucm9vbS5yb29tID0gJ21hcC0nICsgQWN0aXZlLk1hcC5pZFxuICAgIHNlbGYuYWN0aXZlTWFwcGVyID0ge1xuICAgICAgaWQ6IEFjdGl2ZS5NYXBwZXIuaWQsXG4gICAgICBuYW1lOiBBY3RpdmUuTWFwcGVyLmdldCgnbmFtZScpLFxuICAgICAgdXNlcm5hbWU6IEFjdGl2ZS5NYXBwZXIuZ2V0KCduYW1lJyksXG4gICAgICBpbWFnZTogQWN0aXZlLk1hcHBlci5nZXQoJ2ltYWdlJyksXG4gICAgICBjb2xvcjogVXRpbC5nZXRQYXN0ZWxDb2xvcigpLFxuICAgICAgc2VsZjogdHJ1ZVxuICAgIH1cbiAgICBzZWxmLmxvY2FsVmlkZW8udmlldy4kY29udGFpbmVyLmZpbmQoJy52aWRlby1jdXRvZmYnKS5jc3Moe1xuICAgICAgYm9yZGVyOiAnNHB4IHNvbGlkICcgKyBzZWxmLmFjdGl2ZU1hcHBlci5jb2xvclxuICAgIH0pXG4gICAgc2VsZi5zZXR1cExvY2FsRXZlbnRzKClcbiAgfSxcbiAgc2V0dXBDaGF0OiBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBzZWxmID0gUmVhbHRpbWVcbiAgICBDaGF0Vmlldy5zZXROZXdNYXAoKVxuICAgIENoYXRWaWV3LmFkZFBhcnRpY2lwYW50KHNlbGYuYWN0aXZlTWFwcGVyKVxuICAgIENoYXRWaWV3LmFkZE1lc3NhZ2VzKG5ldyBEYXRhTW9kZWwuTWVzc2FnZUNvbGxlY3Rpb24oRGF0YU1vZGVsLk1lc3NhZ2VzKSwgdHJ1ZSlcbiAgICBDaGF0Vmlldy5zaG93KClcbiAgfSxcbiAgc2V0dXBMb2NhbEV2ZW50czogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSBSZWFsdGltZVxuICAgIC8vIGxvY2FsIGV2ZW50IGxpc3RlbmVycyB0aGF0IHRyaWdnZXIgZXZlbnRzXG4gICAgY29uc3QgcGFuT3Jab29tID0gKCkgPT4ge1xuICAgICAgc2VsZi5wb3NpdGlvblBlZXJJY29ucygpXG4gICAgICBDcmVhdGUubmV3U3luYXBzZS51cGRhdGVGb3JtKClcbiAgICAgIENyZWF0ZS5uZXdUb3BpYy5wb3NpdGlvbigpXG4gICAgfVxuICAgICQoZG9jdW1lbnQpLm9uKEpJVC5ldmVudHMuem9vbSArICcubWFwJywgcGFuT3Jab29tKVxuICAgICQoZG9jdW1lbnQpLm9uKEpJVC5ldmVudHMucGFuICsgJy5tYXAnLCBwYW5Pclpvb20pXG4gICAgJChkb2N1bWVudCkub24oJ21vdXNlbW92ZS5tYXAnLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgdmFyIHBpeGVscyA9IHtcbiAgICAgICAgeDogZXZlbnQucGFnZVgsXG4gICAgICAgIHk6IGV2ZW50LnBhZ2VZXG4gICAgICB9XG4gICAgICB2YXIgY29vcmRzID0gVXRpbC5waXhlbHNUb0Nvb3JkcyhWaXN1YWxpemUubUdyYXBoLCBwaXhlbHMpXG4gICAgICBzZWxmLnNlbmRDb29yZHMoY29vcmRzKVxuICAgIH0pXG4gICAgJChkb2N1bWVudCkub24oSklULmV2ZW50cy50b3BpY0RyYWcgKyAnLm1hcCcsIGZ1bmN0aW9uKGV2ZW50LCBwb3NpdGlvbnMpIHtcbiAgICAgIHNlbGYuZHJhZ1RvcGljKHBvc2l0aW9ucylcbiAgICB9KVxuICB9LFxuICBjb3VudE90aGVyc0luQ29udmVyc2F0aW9uOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IFJlYWx0aW1lXG4gICAgdmFyIGNvdW50ID0gMFxuICAgIGZvciAodmFyIGtleSBpbiBzZWxmLm1hcHBlcnNPbk1hcCkge1xuICAgICAgaWYgKHNlbGYubWFwcGVyc09uTWFwW2tleV0uaW5Db252ZXJzYXRpb24pIGNvdW50KytcbiAgICB9XG4gICAgcmV0dXJuIGNvdW50XG4gIH0sXG4gIGhhbmRsZVZpZGVvQWRkZWQ6IGZ1bmN0aW9uKHYsIGlkKSB7XG4gICAgdmFyIHNlbGYgPSBSZWFsdGltZVxuICAgIHNlbGYucG9zaXRpb25WaWRlb3MoKVxuICAgIHYuc2V0UGFyZW50KCQoJyN3cmFwcGVyJykpXG4gICAgdi4kY29udGFpbmVyLmZpbmQoJy52aWRlby1jdXRvZmYnKS5jc3Moe1xuICAgICAgYm9yZGVyOiAnNHB4IHNvbGlkICcgKyBzZWxmLm1hcHBlcnNPbk1hcFtpZF0uY29sb3JcbiAgICB9KVxuICAgICQoJyN3cmFwcGVyJykuYXBwZW5kKHYuJGNvbnRhaW5lcilcbiAgfSxcbiAgcG9zaXRpb25WaWRlb3M6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gUmVhbHRpbWVcbiAgICB2YXIgdmlkZW9JZHMgPSBPYmplY3Qua2V5cyhzZWxmLnJvb20udmlkZW9zKVxuICAgIC8vIHZhciBudW1PZlZpZGVvcyA9IHZpZGVvSWRzLmxlbmd0aFxuICAgIC8vIHZhciBudW1PZlZpZGVvc1RvUG9zaXRpb24gPSBfLmZpbHRlcih2aWRlb0lkcywgZnVuY3Rpb24oaWQpIHtcbiAgICAvLyAgIHJldHVybiAhc2VsZi5yb29tLnZpZGVvc1tpZF0ubWFudWFsbHlQb3NpdGlvbmVkXG4gICAgLy8gfSkubGVuZ3RoXG5cbiAgICB2YXIgc2NyZWVuSGVpZ2h0ID0gJChkb2N1bWVudCkuaGVpZ2h0KClcbiAgICB2YXIgdG9wRXh0cmFQYWRkaW5nID0gMjBcbiAgICB2YXIgdG9wUGFkZGluZyA9IDMwXG4gICAgdmFyIGxlZnRQYWRkaW5nID0gMzBcbiAgICB2YXIgdmlkZW9IZWlnaHQgPSAxNTBcbiAgICB2YXIgdmlkZW9XaWR0aCA9IDE4MFxuICAgIHZhciBjb2x1bW4gPSAwXG4gICAgdmFyIHJvdyA9IDBcbiAgICB2YXIgeUZvcm11bGEgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB5ID0gdG9wRXh0cmFQYWRkaW5nICsgKHRvcFBhZGRpbmcgKyB2aWRlb0hlaWdodCkgKiByb3cgKyB0b3BQYWRkaW5nXG4gICAgICBpZiAoeSArIHZpZGVvSGVpZ2h0ID4gc2NyZWVuSGVpZ2h0KSB7XG4gICAgICAgIHJvdyA9IDBcbiAgICAgICAgY29sdW1uICs9IDFcbiAgICAgICAgeSA9IHlGb3JtdWxhKClcbiAgICAgIH1cbiAgICAgIHJvdysrXG4gICAgICByZXR1cm4geVxuICAgIH1cbiAgICB2YXIgeEZvcm11bGEgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB4ID0gKGxlZnRQYWRkaW5nICsgdmlkZW9XaWR0aCkgKiBjb2x1bW4gKyBsZWZ0UGFkZGluZ1xuICAgICAgcmV0dXJuIHhcbiAgICB9XG5cbiAgICAvLyBkbyBzZWxmIGZpcnN0XG4gICAgdmFyIG15VmlkZW8gPSBSZWFsdGltZS5sb2NhbFZpZGVvLnZpZXdcbiAgICBpZiAoIW15VmlkZW8ubWFudWFsbHlQb3NpdGlvbmVkKSB7XG4gICAgICBteVZpZGVvLiRjb250YWluZXIuY3NzKHtcbiAgICAgICAgdG9wOiB5Rm9ybXVsYSgpICsgJ3B4JyxcbiAgICAgICAgbGVmdDogeEZvcm11bGEoKSArICdweCdcbiAgICAgIH0pXG4gICAgfVxuICAgIHZpZGVvSWRzLmZvckVhY2goZnVuY3Rpb24oaWQpIHtcbiAgICAgIHZhciB2aWRlbyA9IHNlbGYucm9vbS52aWRlb3NbaWRdXG4gICAgICBpZiAoIXZpZGVvLm1hbnVhbGx5UG9zaXRpb25lZCkge1xuICAgICAgICB2aWRlby4kY29udGFpbmVyLmNzcyh7XG4gICAgICAgICAgdG9wOiB5Rm9ybXVsYSgpICsgJ3B4JyxcbiAgICAgICAgICBsZWZ0OiB4Rm9ybXVsYSgpICsgJ3B4J1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH0sXG4gIGNhbGxFbmRlZDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSBSZWFsdGltZVxuXG4gICAgQ2hhdFZpZXcuY29udmVyc2F0aW9uRW5kZWQoKVxuICAgIHNlbGYucm9vbS5sZWF2ZVZpZGVvT25seSgpXG4gICAgc2VsZi5pbkNvbnZlcnNhdGlvbiA9IGZhbHNlXG4gICAgc2VsZi5sb2NhbFZpZGVvLnZpZXcuJGNvbnRhaW5lci5oaWRlKCkuY3NzKHtcbiAgICAgIHRvcDogJzcycHgnLFxuICAgICAgbGVmdDogJzMwcHgnXG4gICAgfSlcbiAgICBzZWxmLmxvY2FsVmlkZW8udmlldy5hdWRpb09uKClcbiAgICBzZWxmLmxvY2FsVmlkZW8udmlldy52aWRlb09uKClcbiAgfSxcbiAgY3JlYXRlQ29tcGFzczogZnVuY3Rpb24obmFtZSwgaWQsIGltYWdlLCBjb2xvcikge1xuICAgIHZhciBzdHIgPSAnPGltZyB3aWR0aD1cIjI4XCIgaGVpZ2h0PVwiMjhcIiBzcmM9XCInICsgaW1hZ2UgKyAnXCIgLz48cD4nICsgbmFtZSArICc8L3A+J1xuICAgIHN0ciArPSAnPGRpdiBpZD1cImNvbXBhc3NBcnJvdycgKyBpZCArICdcIiBjbGFzcz1cImNvbXBhc3NBcnJvd1wiPjwvZGl2PidcbiAgICAkKCcjY29tcGFzcycgKyBpZCkucmVtb3ZlKClcbiAgICAkKCc8ZGl2Lz4nLCB7XG4gICAgICBpZDogJ2NvbXBhc3MnICsgaWQsXG4gICAgICBjbGFzczogJ2NvbGxhYkNvbXBhc3MnXG4gICAgfSkuaHRtbChzdHIpLmFwcGVuZFRvKCcjd3JhcHBlcicpXG4gICAgJCgnI2NvbXBhc3MnICsgaWQgKyAnIGltZycpLmNzcyh7XG4gICAgICAnYm9yZGVyJzogJzJweCBzb2xpZCAnICsgY29sb3JcbiAgICB9KVxuICAgICQoJyNjb21wYXNzJyArIGlkICsgJyBwJykuY3NzKHtcbiAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogY29sb3JcbiAgICB9KVxuICB9LFxuICBwb3NpdGlvblBlZXJJY29uczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSBSZWFsdGltZVxuICAgIGZvciAodmFyIGtleSBpbiBzZWxmLm1hcHBlcnNPbk1hcCkge1xuICAgICAgc2VsZi5wb3NpdGlvblBlZXJJY29uKGtleSlcbiAgICB9XG4gIH0sXG4gIHBvc2l0aW9uUGVlckljb246IGZ1bmN0aW9uKGlkKSB7XG4gICAgdmFyIHNlbGYgPSBSZWFsdGltZVxuICAgIHZhciBtYXBwZXIgPSBzZWxmLm1hcHBlcnNPbk1hcFtpZF1cblxuICAgIHZhciBvcmlnUGl4ZWxzID0gVXRpbC5jb29yZHNUb1BpeGVscyhWaXN1YWxpemUubUdyYXBoLCBtYXBwZXIuY29vcmRzKVxuICAgIHZhciBwaXhlbHMgPSBzZWxmLmxpbWl0UGl4ZWxzVG9TY3JlZW4ob3JpZ1BpeGVscylcbiAgICAkKCcjY29tcGFzcycgKyBpZCkuY3NzKHtcbiAgICAgIGxlZnQ6IHBpeGVscy54ICsgJ3B4JyxcbiAgICAgIHRvcDogcGl4ZWxzLnkgKyAncHgnXG4gICAgfSlcbiAgICAvKiBzaG93aW5nIHRoZSBhcnJvdyBpZiB0aGUgY29sbGFib3JhdG9yIGlzIG9mZiBvZiB0aGUgdmlld3BvcnQgc2NyZWVuICovXG4gICAgaWYgKG9yaWdQaXhlbHMueCAhPT0gcGl4ZWxzLnggfHwgb3JpZ1BpeGVscy55ICE9PSBwaXhlbHMueSkge1xuICAgICAgdmFyIGR5ID0gb3JpZ1BpeGVscy55IC0gcGl4ZWxzLnkgLy8gb3Bwb3NpdGVcbiAgICAgIHZhciBkeCA9IG9yaWdQaXhlbHMueCAtIHBpeGVscy54IC8vIGFkamFjZW50XG4gICAgICB2YXIgYW5nbGUgPSBNYXRoLmF0YW4yKGR5LCBkeClcblxuICAgICAgJCgnI2NvbXBhc3NBcnJvdycgKyBpZCkuc2hvdygpLmNzcyh7XG4gICAgICAgIHRyYW5zZm9ybTogJ3JvdGF0ZSgnICsgYW5nbGUgKyAncmFkKScsXG4gICAgICAgICctd2Via2l0LXRyYW5zZm9ybSc6ICdyb3RhdGUoJyArIGFuZ2xlICsgJ3JhZCknXG4gICAgICB9KVxuXG4gICAgICBpZiAoZHggPiAwKSB7XG4gICAgICAgICQoJyNjb21wYXNzJyArIGlkKS5hZGRDbGFzcygnbGFiZWxMZWZ0JylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgJCgnI2NvbXBhc3NBcnJvdycgKyBpZCkuaGlkZSgpXG4gICAgICAkKCcjY29tcGFzcycgKyBpZCkucmVtb3ZlQ2xhc3MoJ2xhYmVsTGVmdCcpXG4gICAgfVxuICB9LFxuICBsaW1pdFBpeGVsc1RvU2NyZWVuOiBmdW5jdGlvbihwaXhlbHMpIHtcbiAgICB2YXIgc2VsZiA9IFJlYWx0aW1lXG5cbiAgICB2YXIgYm91bmRhcnkgPSBzZWxmLmNoYXRPcGVuID8gJyN3cmFwcGVyJyA6IGRvY3VtZW50XG4gICAgdmFyIHhMaW1pdCwgeUxpbWl0XG4gICAgdmFyIHhNYXggPSAkKGJvdW5kYXJ5KS53aWR0aCgpXG4gICAgdmFyIHlNYXggPSAkKGJvdW5kYXJ5KS5oZWlnaHQoKVxuICAgIHZhciBjb21wYXNzRGlhbWV0ZXIgPSA1NlxuICAgIHZhciBjb21wYXNzQXJyb3dTaXplID0gMjRcblxuICAgIHhMaW1pdCA9IE1hdGgubWF4KDAgKyBjb21wYXNzQXJyb3dTaXplLCBwaXhlbHMueClcbiAgICB4TGltaXQgPSBNYXRoLm1pbih4TGltaXQsIHhNYXggLSBjb21wYXNzRGlhbWV0ZXIpXG4gICAgeUxpbWl0ID0gTWF0aC5tYXgoMCArIGNvbXBhc3NBcnJvd1NpemUsIHBpeGVscy55KVxuICAgIHlMaW1pdCA9IE1hdGgubWluKHlMaW1pdCwgeU1heCAtIGNvbXBhc3NEaWFtZXRlcilcblxuICAgIHJldHVybiB7eDogeExpbWl0LCB5OiB5TGltaXR9XG4gIH1cbn1cblxuY29uc3Qgc2VuZGFibGVzID0gW1xuICBbJ2pvaW5NYXAnLCBqb2luTWFwXSxcbiAgWydsZWF2ZU1hcCcsIGxlYXZlTWFwXSxcbiAgWydjaGVja0ZvckNhbGwnLCBjaGVja0ZvckNhbGxdLFxuICBbJ2FjY2VwdENhbGwnLCBhY2NlcHRDYWxsXSxcbiAgWydkZW55Q2FsbCcsIGRlbnlDYWxsXSxcbiAgWydkZW55SW52aXRlJywgZGVueUludml0ZV0sXG4gIFsnaW52aXRlVG9Kb2luJywgaW52aXRlVG9Kb2luXSxcbiAgWydpbnZpdGVBQ2FsbCcsIGludml0ZUFDYWxsXSxcbiAgWydqb2luQ2FsbCcsIGpvaW5DYWxsXSxcbiAgWydsZWF2ZUNhbGwnLCBsZWF2ZUNhbGxdLFxuICBbJ3NlbmRNYXBwZXJJbmZvJywgc2VuZE1hcHBlckluZm9dLFxuICBbJ3NlbmRDb29yZHMnLCBzZW5kQ29vcmRzXSxcbiAgWydkcmFnVG9waWMnLCBkcmFnVG9waWNdXG5dXG5zZW5kYWJsZXMuZm9yRWFjaChzZW5kYWJsZSA9PiB7XG4gIFJlYWx0aW1lW3NlbmRhYmxlWzBdXSA9IHNlbmRhYmxlWzFdKFJlYWx0aW1lKVxufSlcblxuY29uc3Qgc3Vic2NyaWJlVG9FdmVudHMgPSAoUmVhbHRpbWUsIHNvY2tldCkgPT4ge1xuICBzb2NrZXQub24oSlVOVE9fVVBEQVRFRCwganVudG9VcGRhdGVkKFJlYWx0aW1lKSlcbiAgc29ja2V0Lm9uKElOVklURURfVE9fQ0FMTCwgaW52aXRlZFRvQ2FsbChSZWFsdGltZSkpXG4gIHNvY2tldC5vbihJTlZJVEVEX1RPX0pPSU4sIGludml0ZWRUb0pvaW4oUmVhbHRpbWUpKVxuICBzb2NrZXQub24oQ0FMTF9BQ0NFUFRFRCwgY2FsbEFjY2VwdGVkKFJlYWx0aW1lKSlcbiAgc29ja2V0Lm9uKENBTExfREVOSUVELCBjYWxsRGVuaWVkKFJlYWx0aW1lKSlcbiAgc29ja2V0Lm9uKElOVklURV9ERU5JRUQsIGludml0ZURlbmllZChSZWFsdGltZSkpXG4gIHNvY2tldC5vbihDQUxMX0lOX1BST0dSRVNTLCBjYWxsSW5Qcm9ncmVzcyhSZWFsdGltZSkpXG4gIHNvY2tldC5vbihDQUxMX1NUQVJURUQsIGNhbGxTdGFydGVkKFJlYWx0aW1lKSlcbiAgc29ja2V0Lm9uKE1BUFBFUl9MSVNUX1VQREFURUQsIG1hcHBlckxpc3RVcGRhdGVkKFJlYWx0aW1lKSlcbiAgc29ja2V0Lm9uKE1BUFBFUl9KT0lORURfQ0FMTCwgbWFwcGVySm9pbmVkQ2FsbChSZWFsdGltZSkpXG4gIHNvY2tldC5vbihNQVBQRVJfTEVGVF9DQUxMLCBtYXBwZXJMZWZ0Q2FsbChSZWFsdGltZSkpXG4gIHNvY2tldC5vbihQRUVSX0NPT1JEU19VUERBVEVELCBwZWVyQ29vcmRzVXBkYXRlZChSZWFsdGltZSkpXG4gIHNvY2tldC5vbihORVdfTUFQUEVSLCBuZXdNYXBwZXIoUmVhbHRpbWUpKVxuICBzb2NrZXQub24oTE9TVF9NQVBQRVIsIGxvc3RNYXBwZXIoUmVhbHRpbWUpKVxuICBzb2NrZXQub24oVE9QSUNfRFJBR0dFRCwgdG9waWNEcmFnZ2VkKFJlYWx0aW1lKSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVhbHRpbWVcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBmcm9udGVuZC9zcmMvTWV0YW1hcHMvUmVhbHRpbWUvaW5kZXguanMiXSwibWFwcGluZ3MiOiI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 436 */
/***/ function(module, exports, __webpack_require__) {

    eval("var WebRTC = __webpack_require__(437);\nvar WildEmitter = __webpack_require__(445);\nvar webrtcSupport = __webpack_require__(441);\nvar attachMediaStream = __webpack_require__(489);\nvar mockconsole = __webpack_require__(442);\nvar SocketIoConnection = __webpack_require__(490);\n\nfunction SimpleWebRTC(opts) {\n    var self = this;\n    var options = opts || {};\n    var config = this.config = {\n            url: 'https://sandbox.simplewebrtc.com:443/',\n            socketio: {/* 'force new connection':true*/},\n            connection: null,\n            debug: false,\n            localVideoEl: '',\n            remoteVideosEl: '',\n            enableDataChannels: true,\n            autoRequestMedia: false,\n            autoRemoveVideos: true,\n            adjustPeerVolume: false,\n            peerVolumeWhenSpeaking: 0.25,\n            media: {\n                video: true,\n                audio: true\n            },\n            receiveMedia: {\n                offerToReceiveAudio: 1,\n                offerToReceiveVideo: 1\n            },\n            localVideo: {\n                autoplay: true,\n                mirror: true,\n                muted: true\n            }\n        };\n    var item, connection;\n\n    // We also allow a 'logger' option. It can be any object that implements\n    // log, warn, and error methods.\n    // We log nothing by default, following \"the rule of silence\":\n    // http://www.linfo.org/rule_of_silence.html\n    this.logger = function () {\n        // we assume that if you're in debug mode and you didn't\n        // pass in a logger, you actually want to log as much as\n        // possible.\n        if (opts.debug) {\n            return opts.logger || console;\n        } else {\n        // or we'll use your logger which should have its own logic\n        // for output. Or we'll return the no-op.\n            return opts.logger || mockconsole;\n        }\n    }();\n\n    // set our config from options\n    for (item in options) {\n        if (options.hasOwnProperty(item)) {\n            this.config[item] = options[item];\n        }\n    }\n\n    // attach detected support for convenience\n    this.capabilities = webrtcSupport;\n\n    // call WildEmitter constructor\n    WildEmitter.call(this);\n\n    // create default SocketIoConnection if it's not passed in\n    if (this.config.connection === null) {\n        connection = this.connection = new SocketIoConnection(this.config);\n    } else {\n        connection = this.connection = this.config.connection;\n    }\n\n    connection.on('connect', function () {\n        self.emit('connectionReady', connection.getSessionid());\n        self.sessionReady = true;\n        self.testReadiness();\n    });\n\n    connection.on('message', function (message) {\n        var peers = self.webrtc.getPeers(message.from, message.roomType);\n        var peer;\n\n        if (message.type === 'offer') {\n            if (peers.length) {\n                peers.forEach(function (p) {\n                    if (p.sid == message.sid) peer = p;\n                });\n                //if (!peer) peer = peers[0]; // fallback for old protocol versions\n            }\n            if (!peer) {\n                peer = self.webrtc.createPeer({\n                    id: message.from,\n                    sid: message.sid,\n                    type: message.roomType,\n                    enableDataChannels: self.config.enableDataChannels && message.roomType !== 'screen',\n                    sharemyscreen: message.roomType === 'screen' && !message.broadcaster,\n                    broadcaster: message.roomType === 'screen' && !message.broadcaster ? self.connection.getSessionid() : null\n                });\n                self.emit('createdPeer', peer);\n            }\n            peer.handleMessage(message);\n        } else if (peers.length) {\n            peers.forEach(function (peer) {\n                if (message.sid) {\n                    if (peer.sid === message.sid) {\n                        peer.handleMessage(message);\n                    }\n                } else {\n                    peer.handleMessage(message);\n                }\n            });\n        }\n    });\n\n    connection.on('remove', function (room) {\n        if (room.id !== self.connection.getSessionid()) {\n            self.webrtc.removePeers(room.id, room.type);\n        }\n    });\n\n    // instantiate our main WebRTC helper\n    // using same logger from logic here\n    opts.logger = this.logger;\n    opts.debug = false;\n    this.webrtc = new WebRTC(opts);\n\n    // attach a few methods from underlying lib to simple.\n    ['mute', 'unmute', 'pauseVideo', 'resumeVideo', 'pause', 'resume', 'sendToAll', 'sendDirectlyToAll', 'getPeers'].forEach(function (method) {\n        self[method] = self.webrtc[method].bind(self.webrtc);\n    });\n\n    // proxy events from WebRTC\n    this.webrtc.on('*', function () {\n        self.emit.apply(self, arguments);\n    });\n\n    // log all events in debug mode\n    if (config.debug) {\n        this.on('*', this.logger.log.bind(this.logger, 'SimpleWebRTC event:'));\n    }\n\n    // check for readiness\n    this.webrtc.on('localStream', function () {\n        self.testReadiness();\n    });\n\n    this.webrtc.on('message', function (payload) {\n        self.connection.emit('message', payload);\n    });\n\n    this.webrtc.on('peerStreamAdded', this.handlePeerStreamAdded.bind(this));\n    this.webrtc.on('peerStreamRemoved', this.handlePeerStreamRemoved.bind(this));\n\n    // echo cancellation attempts\n    if (this.config.adjustPeerVolume) {\n        this.webrtc.on('speaking', this.setVolumeForAll.bind(this, this.config.peerVolumeWhenSpeaking));\n        this.webrtc.on('stoppedSpeaking', this.setVolumeForAll.bind(this, 1));\n    }\n\n    connection.on('stunservers', function (args) {\n        // resets/overrides the config\n        self.webrtc.config.peerConnectionConfig.iceServers = args;\n        self.emit('stunservers', args);\n    });\n    connection.on('turnservers', function (args) {\n        // appends to the config\n        self.webrtc.config.peerConnectionConfig.iceServers = self.webrtc.config.peerConnectionConfig.iceServers.concat(args);\n        self.emit('turnservers', args);\n    });\n\n    this.webrtc.on('iceFailed', function (peer) {\n        // local ice failure\n    });\n    this.webrtc.on('connectivityError', function (peer) {\n        // remote ice failure\n    });\n\n\n    // sending mute/unmute to all peers\n    this.webrtc.on('audioOn', function () {\n        self.webrtc.sendToAll('unmute', {name: 'audio'});\n    });\n    this.webrtc.on('audioOff', function () {\n        self.webrtc.sendToAll('mute', {name: 'audio'});\n    });\n    this.webrtc.on('videoOn', function () {\n        self.webrtc.sendToAll('unmute', {name: 'video'});\n    });\n    this.webrtc.on('videoOff', function () {\n        self.webrtc.sendToAll('mute', {name: 'video'});\n    });\n\n    // screensharing events\n    this.webrtc.on('localScreen', function (stream) {\n        var item,\n            el = document.createElement('video'),\n            container = self.getRemoteVideoContainer();\n\n        el.oncontextmenu = function () { return false; };\n        el.id = 'localScreen';\n        attachMediaStream(stream, el);\n        if (container) {\n            container.appendChild(el);\n        }\n\n        self.emit('localScreenAdded', el);\n        self.connection.emit('shareScreen');\n\n        self.webrtc.peers.forEach(function (existingPeer) {\n            var peer;\n            if (existingPeer.type === 'video') {\n                peer = self.webrtc.createPeer({\n                    id: existingPeer.id,\n                    type: 'screen',\n                    sharemyscreen: true,\n                    enableDataChannels: false,\n                    receiveMedia: {\n                        offerToReceiveAudio: 0,\n                        offerToReceiveVideo: 0\n                    },\n                    broadcaster: self.connection.getSessionid(),\n                });\n                self.emit('createdPeer', peer);\n                peer.start();\n            }\n        });\n    });\n    this.webrtc.on('localScreenStopped', function (stream) {\n        self.stopScreenShare();\n        /*\n        self.connection.emit('unshareScreen');\n        self.webrtc.peers.forEach(function (peer) {\n            if (peer.sharemyscreen) {\n                peer.end();\n            }\n        });\n        */\n    });\n\n    this.webrtc.on('channelMessage', function (peer, label, data) {\n        if (data.type == 'volume') {\n            self.emit('remoteVolumeChange', peer, data.volume);\n        }\n    });\n\n    if (this.config.autoRequestMedia) this.startLocalVideo();\n}\n\n\nSimpleWebRTC.prototype = Object.create(WildEmitter.prototype, {\n    constructor: {\n        value: SimpleWebRTC\n    }\n});\n\nSimpleWebRTC.prototype.leaveRoom = function () {\n    if (this.roomName) {\n        this.connection.emit('leave');\n        while (this.webrtc.peers.length) {\n            this.webrtc.peers[0].end();\n        }\n        if (this.getLocalScreen()) {\n            this.stopScreenShare();\n        }\n        this.emit('leftRoom', this.roomName);\n        this.roomName = undefined;\n    }\n};\n\nSimpleWebRTC.prototype.disconnect = function () {\n    this.connection.disconnect();\n    delete this.connection;\n};\n\nSimpleWebRTC.prototype.handlePeerStreamAdded = function (peer) {\n    var self = this;\n    var container = this.getRemoteVideoContainer();\n    var video = attachMediaStream(peer.stream);\n\n    // store video element as part of peer for easy removal\n    peer.videoEl = video;\n    video.id = this.getDomId(peer);\n\n    if (container) container.appendChild(video);\n\n    this.emit('videoAdded', video, peer);\n\n    // send our mute status to new peer if we're muted\n    // currently called with a small delay because it arrives before\n    // the video element is created otherwise (which happens after\n    // the async setRemoteDescription-createAnswer)\n    window.setTimeout(function () {\n        if (!self.webrtc.isAudioEnabled()) {\n            peer.send('mute', {name: 'audio'});\n        }\n        if (!self.webrtc.isVideoEnabled()) {\n            peer.send('mute', {name: 'video'});\n        }\n    }, 250);\n};\n\nSimpleWebRTC.prototype.handlePeerStreamRemoved = function (peer) {\n    var container = this.getRemoteVideoContainer();\n    var videoEl = peer.videoEl;\n    if (this.config.autoRemoveVideos && container && videoEl) {\n        container.removeChild(videoEl);\n    }\n    if (videoEl) this.emit('videoRemoved', videoEl, peer);\n};\n\nSimpleWebRTC.prototype.getDomId = function (peer) {\n    return [peer.id, peer.type, peer.broadcaster ? 'broadcasting' : 'incoming'].join('_');\n};\n\n// set volume on video tag for all peers takse a value between 0 and 1\nSimpleWebRTC.prototype.setVolumeForAll = function (volume) {\n    this.webrtc.peers.forEach(function (peer) {\n        if (peer.videoEl) peer.videoEl.volume = volume;\n    });\n};\n\nSimpleWebRTC.prototype.joinRoom = function (name, cb) {\n    var self = this;\n    this.roomName = name;\n    this.connection.emit('join', name, function (err, roomDescription) {\n        console.log('join CB', err, roomDescription);\n        if (err) {\n            self.emit('error', err);\n        } else {\n            var id,\n                client,\n                type,\n                peer;\n            for (id in roomDescription.clients) {\n                client = roomDescription.clients[id];\n                for (type in client) {\n                    if (client[type]) {\n                        peer = self.webrtc.createPeer({\n                            id: id,\n                            type: type,\n                            enableDataChannels: self.config.enableDataChannels && type !== 'screen',\n                            receiveMedia: {\n                                offerToReceiveAudio: type !== 'screen' && self.config.receiveMedia.offerToReceiveAudio ? 1 : 0,\n                                offerToReceiveVideo: self.config.receiveMedia.offerToReceiveVideo\n                            }\n                        });\n                        self.emit('createdPeer', peer);\n                        peer.start();\n                    }\n                }\n            }\n        }\n\n        if (cb) cb(err, roomDescription);\n        self.emit('joinedRoom', name);\n    });\n};\n\nSimpleWebRTC.prototype.getEl = function (idOrEl) {\n    if (typeof idOrEl === 'string') {\n        return document.getElementById(idOrEl);\n    } else {\n        return idOrEl;\n    }\n};\n\nSimpleWebRTC.prototype.startLocalVideo = function () {\n    var self = this;\n    this.webrtc.startLocalMedia(this.config.media, function (err, stream) {\n        if (err) {\n            self.emit('localMediaError', err);\n        } else {\n            attachMediaStream(stream, self.getLocalVideoContainer(), self.config.localVideo);\n        }\n    });\n};\n\nSimpleWebRTC.prototype.stopLocalVideo = function () {\n    this.webrtc.stopLocalMedia();\n};\n\n// this accepts either element ID or element\n// and either the video tag itself or a container\n// that will be used to put the video tag into.\nSimpleWebRTC.prototype.getLocalVideoContainer = function () {\n    var el = this.getEl(this.config.localVideoEl);\n    if (el && el.tagName === 'VIDEO') {\n        el.oncontextmenu = function () { return false; };\n        return el;\n    } else if (el) {\n        var video = document.createElement('video');\n        video.oncontextmenu = function () { return false; };\n        el.appendChild(video);\n        return video;\n    } else {\n        return;\n    }\n};\n\nSimpleWebRTC.prototype.getRemoteVideoContainer = function () {\n    return this.getEl(this.config.remoteVideosEl);\n};\n\nSimpleWebRTC.prototype.shareScreen = function (cb) {\n    this.webrtc.startScreenShare(cb);\n};\n\nSimpleWebRTC.prototype.getLocalScreen = function () {\n    return this.webrtc.localScreen;\n};\n\nSimpleWebRTC.prototype.stopScreenShare = function () {\n    this.connection.emit('unshareScreen');\n    var videoEl = document.getElementById('localScreen');\n    var container = this.getRemoteVideoContainer();\n    var stream = this.getLocalScreen();\n\n    if (this.config.autoRemoveVideos && container && videoEl) {\n        container.removeChild(videoEl);\n    }\n\n    // a hack to emit the event the removes the video\n    // element that we want\n    if (videoEl) this.emit('videoRemoved', videoEl);\n    if (stream) {\n        stream.getTracks().forEach(function (track) { track.stop(); });\n    }\n    this.webrtc.peers.forEach(function (peer) {\n        if (peer.broadcaster) {\n            peer.end();\n        }\n    });\n    //delete this.webrtc.localScreen;\n};\n\nSimpleWebRTC.prototype.testReadiness = function () {\n    var self = this;\n    if (this.sessionReady) {\n        if (!this.config.media.video && !this.config.media.audio) {\n            self.emit('readyToCall', self.connection.getSessionid());\n        } else if (this.webrtc.localStreams.length > 0) {\n            self.emit('readyToCall', self.connection.getSessionid());\n        }\n    }\n};\n\nSimpleWebRTC.prototype.createRoom = function (name, cb) {\n    this.roomName = name;\n    if (arguments.length === 2) {\n        this.connection.emit('create', name, cb);\n    } else {\n        this.connection.emit('create', name);\n    }\n};\n\nSimpleWebRTC.prototype.sendFile = function () {\n    if (!webrtcSupport.dataChannel) {\n        return this.emit('error', new Error('DataChannelNotSupported'));\n    }\n\n};\n\nmodule.exports = SimpleWebRTC;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDM2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zaW1wbGV3ZWJydGMvc2ltcGxld2VicnRjLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBXZWJSVEMgPSByZXF1aXJlKCcuL3dlYnJ0YycpO1xudmFyIFdpbGRFbWl0dGVyID0gcmVxdWlyZSgnd2lsZGVtaXR0ZXInKTtcbnZhciB3ZWJydGNTdXBwb3J0ID0gcmVxdWlyZSgnd2VicnRjc3VwcG9ydCcpO1xudmFyIGF0dGFjaE1lZGlhU3RyZWFtID0gcmVxdWlyZSgnYXR0YWNobWVkaWFzdHJlYW0nKTtcbnZhciBtb2NrY29uc29sZSA9IHJlcXVpcmUoJ21vY2tjb25zb2xlJyk7XG52YXIgU29ja2V0SW9Db25uZWN0aW9uID0gcmVxdWlyZSgnLi9zb2NrZXRpb2Nvbm5lY3Rpb24nKTtcblxuZnVuY3Rpb24gU2ltcGxlV2ViUlRDKG9wdHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIG9wdGlvbnMgPSBvcHRzIHx8IHt9O1xuICAgIHZhciBjb25maWcgPSB0aGlzLmNvbmZpZyA9IHtcbiAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vc2FuZGJveC5zaW1wbGV3ZWJydGMuY29tOjQ0My8nLFxuICAgICAgICAgICAgc29ja2V0aW86IHsvKiAnZm9yY2UgbmV3IGNvbm5lY3Rpb24nOnRydWUqL30sXG4gICAgICAgICAgICBjb25uZWN0aW9uOiBudWxsLFxuICAgICAgICAgICAgZGVidWc6IGZhbHNlLFxuICAgICAgICAgICAgbG9jYWxWaWRlb0VsOiAnJyxcbiAgICAgICAgICAgIHJlbW90ZVZpZGVvc0VsOiAnJyxcbiAgICAgICAgICAgIGVuYWJsZURhdGFDaGFubmVsczogdHJ1ZSxcbiAgICAgICAgICAgIGF1dG9SZXF1ZXN0TWVkaWE6IGZhbHNlLFxuICAgICAgICAgICAgYXV0b1JlbW92ZVZpZGVvczogdHJ1ZSxcbiAgICAgICAgICAgIGFkanVzdFBlZXJWb2x1bWU6IGZhbHNlLFxuICAgICAgICAgICAgcGVlclZvbHVtZVdoZW5TcGVha2luZzogMC4yNSxcbiAgICAgICAgICAgIG1lZGlhOiB7XG4gICAgICAgICAgICAgICAgdmlkZW86IHRydWUsXG4gICAgICAgICAgICAgICAgYXVkaW86IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWNlaXZlTWVkaWE6IHtcbiAgICAgICAgICAgICAgICBvZmZlclRvUmVjZWl2ZUF1ZGlvOiAxLFxuICAgICAgICAgICAgICAgIG9mZmVyVG9SZWNlaXZlVmlkZW86IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsb2NhbFZpZGVvOiB7XG4gICAgICAgICAgICAgICAgYXV0b3BsYXk6IHRydWUsXG4gICAgICAgICAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICAgICAgICAgIG11dGVkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgdmFyIGl0ZW0sIGNvbm5lY3Rpb247XG5cbiAgICAvLyBXZSBhbHNvIGFsbG93IGEgJ2xvZ2dlcicgb3B0aW9uLiBJdCBjYW4gYmUgYW55IG9iamVjdCB0aGF0IGltcGxlbWVudHNcbiAgICAvLyBsb2csIHdhcm4sIGFuZCBlcnJvciBtZXRob2RzLlxuICAgIC8vIFdlIGxvZyBub3RoaW5nIGJ5IGRlZmF1bHQsIGZvbGxvd2luZyBcInRoZSBydWxlIG9mIHNpbGVuY2VcIjpcbiAgICAvLyBodHRwOi8vd3d3LmxpbmZvLm9yZy9ydWxlX29mX3NpbGVuY2UuaHRtbFxuICAgIHRoaXMubG9nZ2VyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyB3ZSBhc3N1bWUgdGhhdCBpZiB5b3UncmUgaW4gZGVidWcgbW9kZSBhbmQgeW91IGRpZG4ndFxuICAgICAgICAvLyBwYXNzIGluIGEgbG9nZ2VyLCB5b3UgYWN0dWFsbHkgd2FudCB0byBsb2cgYXMgbXVjaCBhc1xuICAgICAgICAvLyBwb3NzaWJsZS5cbiAgICAgICAgaWYgKG9wdHMuZGVidWcpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRzLmxvZ2dlciB8fCBjb25zb2xlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBvciB3ZSdsbCB1c2UgeW91ciBsb2dnZXIgd2hpY2ggc2hvdWxkIGhhdmUgaXRzIG93biBsb2dpY1xuICAgICAgICAvLyBmb3Igb3V0cHV0LiBPciB3ZSdsbCByZXR1cm4gdGhlIG5vLW9wLlxuICAgICAgICAgICAgcmV0dXJuIG9wdHMubG9nZ2VyIHx8IG1vY2tjb25zb2xlO1xuICAgICAgICB9XG4gICAgfSgpO1xuXG4gICAgLy8gc2V0IG91ciBjb25maWcgZnJvbSBvcHRpb25zXG4gICAgZm9yIChpdGVtIGluIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoaXRlbSkpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnW2l0ZW1dID0gb3B0aW9uc1tpdGVtXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGF0dGFjaCBkZXRlY3RlZCBzdXBwb3J0IGZvciBjb252ZW5pZW5jZVxuICAgIHRoaXMuY2FwYWJpbGl0aWVzID0gd2VicnRjU3VwcG9ydDtcblxuICAgIC8vIGNhbGwgV2lsZEVtaXR0ZXIgY29uc3RydWN0b3JcbiAgICBXaWxkRW1pdHRlci5jYWxsKHRoaXMpO1xuXG4gICAgLy8gY3JlYXRlIGRlZmF1bHQgU29ja2V0SW9Db25uZWN0aW9uIGlmIGl0J3Mgbm90IHBhc3NlZCBpblxuICAgIGlmICh0aGlzLmNvbmZpZy5jb25uZWN0aW9uID09PSBudWxsKSB7XG4gICAgICAgIGNvbm5lY3Rpb24gPSB0aGlzLmNvbm5lY3Rpb24gPSBuZXcgU29ja2V0SW9Db25uZWN0aW9uKHRoaXMuY29uZmlnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9uID0gdGhpcy5jb25maWcuY29ubmVjdGlvbjtcbiAgICB9XG5cbiAgICBjb25uZWN0aW9uLm9uKCdjb25uZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLmVtaXQoJ2Nvbm5lY3Rpb25SZWFkeScsIGNvbm5lY3Rpb24uZ2V0U2Vzc2lvbmlkKCkpO1xuICAgICAgICBzZWxmLnNlc3Npb25SZWFkeSA9IHRydWU7XG4gICAgICAgIHNlbGYudGVzdFJlYWRpbmVzcygpO1xuICAgIH0pO1xuXG4gICAgY29ubmVjdGlvbi5vbignbWVzc2FnZScsIGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgIHZhciBwZWVycyA9IHNlbGYud2VicnRjLmdldFBlZXJzKG1lc3NhZ2UuZnJvbSwgbWVzc2FnZS5yb29tVHlwZSk7XG4gICAgICAgIHZhciBwZWVyO1xuXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgPT09ICdvZmZlcicpIHtcbiAgICAgICAgICAgIGlmIChwZWVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBwZWVycy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwLnNpZCA9PSBtZXNzYWdlLnNpZCkgcGVlciA9IHA7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy9pZiAoIXBlZXIpIHBlZXIgPSBwZWVyc1swXTsgLy8gZmFsbGJhY2sgZm9yIG9sZCBwcm90b2NvbCB2ZXJzaW9uc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwZWVyKSB7XG4gICAgICAgICAgICAgICAgcGVlciA9IHNlbGYud2VicnRjLmNyZWF0ZVBlZXIoe1xuICAgICAgICAgICAgICAgICAgICBpZDogbWVzc2FnZS5mcm9tLFxuICAgICAgICAgICAgICAgICAgICBzaWQ6IG1lc3NhZ2Uuc2lkLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBtZXNzYWdlLnJvb21UeXBlLFxuICAgICAgICAgICAgICAgICAgICBlbmFibGVEYXRhQ2hhbm5lbHM6IHNlbGYuY29uZmlnLmVuYWJsZURhdGFDaGFubmVscyAmJiBtZXNzYWdlLnJvb21UeXBlICE9PSAnc2NyZWVuJyxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVteXNjcmVlbjogbWVzc2FnZS5yb29tVHlwZSA9PT0gJ3NjcmVlbicgJiYgIW1lc3NhZ2UuYnJvYWRjYXN0ZXIsXG4gICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdGVyOiBtZXNzYWdlLnJvb21UeXBlID09PSAnc2NyZWVuJyAmJiAhbWVzc2FnZS5icm9hZGNhc3RlciA/IHNlbGYuY29ubmVjdGlvbi5nZXRTZXNzaW9uaWQoKSA6IG51bGxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ2NyZWF0ZWRQZWVyJywgcGVlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwZWVyLmhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSBpZiAocGVlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBwZWVycy5mb3JFYWNoKGZ1bmN0aW9uIChwZWVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2Uuc2lkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwZWVyLnNpZCA9PT0gbWVzc2FnZS5zaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlZXIuaGFuZGxlTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBlZXIuaGFuZGxlTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29ubmVjdGlvbi5vbigncmVtb3ZlJywgZnVuY3Rpb24gKHJvb20pIHtcbiAgICAgICAgaWYgKHJvb20uaWQgIT09IHNlbGYuY29ubmVjdGlvbi5nZXRTZXNzaW9uaWQoKSkge1xuICAgICAgICAgICAgc2VsZi53ZWJydGMucmVtb3ZlUGVlcnMocm9vbS5pZCwgcm9vbS50eXBlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gaW5zdGFudGlhdGUgb3VyIG1haW4gV2ViUlRDIGhlbHBlclxuICAgIC8vIHVzaW5nIHNhbWUgbG9nZ2VyIGZyb20gbG9naWMgaGVyZVxuICAgIG9wdHMubG9nZ2VyID0gdGhpcy5sb2dnZXI7XG4gICAgb3B0cy5kZWJ1ZyA9IGZhbHNlO1xuICAgIHRoaXMud2VicnRjID0gbmV3IFdlYlJUQyhvcHRzKTtcblxuICAgIC8vIGF0dGFjaCBhIGZldyBtZXRob2RzIGZyb20gdW5kZXJseWluZyBsaWIgdG8gc2ltcGxlLlxuICAgIFsnbXV0ZScsICd1bm11dGUnLCAncGF1c2VWaWRlbycsICdyZXN1bWVWaWRlbycsICdwYXVzZScsICdyZXN1bWUnLCAnc2VuZFRvQWxsJywgJ3NlbmREaXJlY3RseVRvQWxsJywgJ2dldFBlZXJzJ10uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICAgIHNlbGZbbWV0aG9kXSA9IHNlbGYud2VicnRjW21ldGhvZF0uYmluZChzZWxmLndlYnJ0Yyk7XG4gICAgfSk7XG5cbiAgICAvLyBwcm94eSBldmVudHMgZnJvbSBXZWJSVENcbiAgICB0aGlzLndlYnJ0Yy5vbignKicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5lbWl0LmFwcGx5KHNlbGYsIGFyZ3VtZW50cyk7XG4gICAgfSk7XG5cbiAgICAvLyBsb2cgYWxsIGV2ZW50cyBpbiBkZWJ1ZyBtb2RlXG4gICAgaWYgKGNvbmZpZy5kZWJ1Zykge1xuICAgICAgICB0aGlzLm9uKCcqJywgdGhpcy5sb2dnZXIubG9nLmJpbmQodGhpcy5sb2dnZXIsICdTaW1wbGVXZWJSVEMgZXZlbnQ6JykpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGZvciByZWFkaW5lc3NcbiAgICB0aGlzLndlYnJ0Yy5vbignbG9jYWxTdHJlYW0nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYudGVzdFJlYWRpbmVzcygpO1xuICAgIH0pO1xuXG4gICAgdGhpcy53ZWJydGMub24oJ21lc3NhZ2UnLCBmdW5jdGlvbiAocGF5bG9hZCkge1xuICAgICAgICBzZWxmLmNvbm5lY3Rpb24uZW1pdCgnbWVzc2FnZScsIHBheWxvYWQpO1xuICAgIH0pO1xuXG4gICAgdGhpcy53ZWJydGMub24oJ3BlZXJTdHJlYW1BZGRlZCcsIHRoaXMuaGFuZGxlUGVlclN0cmVhbUFkZGVkLmJpbmQodGhpcykpO1xuICAgIHRoaXMud2VicnRjLm9uKCdwZWVyU3RyZWFtUmVtb3ZlZCcsIHRoaXMuaGFuZGxlUGVlclN0cmVhbVJlbW92ZWQuYmluZCh0aGlzKSk7XG5cbiAgICAvLyBlY2hvIGNhbmNlbGxhdGlvbiBhdHRlbXB0c1xuICAgIGlmICh0aGlzLmNvbmZpZy5hZGp1c3RQZWVyVm9sdW1lKSB7XG4gICAgICAgIHRoaXMud2VicnRjLm9uKCdzcGVha2luZycsIHRoaXMuc2V0Vm9sdW1lRm9yQWxsLmJpbmQodGhpcywgdGhpcy5jb25maWcucGVlclZvbHVtZVdoZW5TcGVha2luZykpO1xuICAgICAgICB0aGlzLndlYnJ0Yy5vbignc3RvcHBlZFNwZWFraW5nJywgdGhpcy5zZXRWb2x1bWVGb3JBbGwuYmluZCh0aGlzLCAxKSk7XG4gICAgfVxuXG4gICAgY29ubmVjdGlvbi5vbignc3R1bnNlcnZlcnMnLCBmdW5jdGlvbiAoYXJncykge1xuICAgICAgICAvLyByZXNldHMvb3ZlcnJpZGVzIHRoZSBjb25maWdcbiAgICAgICAgc2VsZi53ZWJydGMuY29uZmlnLnBlZXJDb25uZWN0aW9uQ29uZmlnLmljZVNlcnZlcnMgPSBhcmdzO1xuICAgICAgICBzZWxmLmVtaXQoJ3N0dW5zZXJ2ZXJzJywgYXJncyk7XG4gICAgfSk7XG4gICAgY29ubmVjdGlvbi5vbigndHVybnNlcnZlcnMnLCBmdW5jdGlvbiAoYXJncykge1xuICAgICAgICAvLyBhcHBlbmRzIHRvIHRoZSBjb25maWdcbiAgICAgICAgc2VsZi53ZWJydGMuY29uZmlnLnBlZXJDb25uZWN0aW9uQ29uZmlnLmljZVNlcnZlcnMgPSBzZWxmLndlYnJ0Yy5jb25maWcucGVlckNvbm5lY3Rpb25Db25maWcuaWNlU2VydmVycy5jb25jYXQoYXJncyk7XG4gICAgICAgIHNlbGYuZW1pdCgndHVybnNlcnZlcnMnLCBhcmdzKTtcbiAgICB9KTtcblxuICAgIHRoaXMud2VicnRjLm9uKCdpY2VGYWlsZWQnLCBmdW5jdGlvbiAocGVlcikge1xuICAgICAgICAvLyBsb2NhbCBpY2UgZmFpbHVyZVxuICAgIH0pO1xuICAgIHRoaXMud2VicnRjLm9uKCdjb25uZWN0aXZpdHlFcnJvcicsIGZ1bmN0aW9uIChwZWVyKSB7XG4gICAgICAgIC8vIHJlbW90ZSBpY2UgZmFpbHVyZVxuICAgIH0pO1xuXG5cbiAgICAvLyBzZW5kaW5nIG11dGUvdW5tdXRlIHRvIGFsbCBwZWVyc1xuICAgIHRoaXMud2VicnRjLm9uKCdhdWRpb09uJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLndlYnJ0Yy5zZW5kVG9BbGwoJ3VubXV0ZScsIHtuYW1lOiAnYXVkaW8nfSk7XG4gICAgfSk7XG4gICAgdGhpcy53ZWJydGMub24oJ2F1ZGlvT2ZmJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLndlYnJ0Yy5zZW5kVG9BbGwoJ211dGUnLCB7bmFtZTogJ2F1ZGlvJ30pO1xuICAgIH0pO1xuICAgIHRoaXMud2VicnRjLm9uKCd2aWRlb09uJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLndlYnJ0Yy5zZW5kVG9BbGwoJ3VubXV0ZScsIHtuYW1lOiAndmlkZW8nfSk7XG4gICAgfSk7XG4gICAgdGhpcy53ZWJydGMub24oJ3ZpZGVvT2ZmJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLndlYnJ0Yy5zZW5kVG9BbGwoJ211dGUnLCB7bmFtZTogJ3ZpZGVvJ30pO1xuICAgIH0pO1xuXG4gICAgLy8gc2NyZWVuc2hhcmluZyBldmVudHNcbiAgICB0aGlzLndlYnJ0Yy5vbignbG9jYWxTY3JlZW4nLCBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gICAgICAgIHZhciBpdGVtLFxuICAgICAgICAgICAgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpLFxuICAgICAgICAgICAgY29udGFpbmVyID0gc2VsZi5nZXRSZW1vdGVWaWRlb0NvbnRhaW5lcigpO1xuXG4gICAgICAgIGVsLm9uY29udGV4dG1lbnUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZTsgfTtcbiAgICAgICAgZWwuaWQgPSAnbG9jYWxTY3JlZW4nO1xuICAgICAgICBhdHRhY2hNZWRpYVN0cmVhbShzdHJlYW0sIGVsKTtcbiAgICAgICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYuZW1pdCgnbG9jYWxTY3JlZW5BZGRlZCcsIGVsKTtcbiAgICAgICAgc2VsZi5jb25uZWN0aW9uLmVtaXQoJ3NoYXJlU2NyZWVuJyk7XG5cbiAgICAgICAgc2VsZi53ZWJydGMucGVlcnMuZm9yRWFjaChmdW5jdGlvbiAoZXhpc3RpbmdQZWVyKSB7XG4gICAgICAgICAgICB2YXIgcGVlcjtcbiAgICAgICAgICAgIGlmIChleGlzdGluZ1BlZXIudHlwZSA9PT0gJ3ZpZGVvJykge1xuICAgICAgICAgICAgICAgIHBlZXIgPSBzZWxmLndlYnJ0Yy5jcmVhdGVQZWVyKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGV4aXN0aW5nUGVlci5pZCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3NjcmVlbicsXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlbXlzY3JlZW46IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZURhdGFDaGFubmVsczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHJlY2VpdmVNZWRpYToge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2ZmZXJUb1JlY2VpdmVBdWRpbzogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZmVyVG9SZWNlaXZlVmlkZW86IDBcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0ZXI6IHNlbGYuY29ubmVjdGlvbi5nZXRTZXNzaW9uaWQoKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ2NyZWF0ZWRQZWVyJywgcGVlcik7XG4gICAgICAgICAgICAgICAgcGVlci5zdGFydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLndlYnJ0Yy5vbignbG9jYWxTY3JlZW5TdG9wcGVkJywgZnVuY3Rpb24gKHN0cmVhbSkge1xuICAgICAgICBzZWxmLnN0b3BTY3JlZW5TaGFyZSgpO1xuICAgICAgICAvKlxuICAgICAgICBzZWxmLmNvbm5lY3Rpb24uZW1pdCgndW5zaGFyZVNjcmVlbicpO1xuICAgICAgICBzZWxmLndlYnJ0Yy5wZWVycy5mb3JFYWNoKGZ1bmN0aW9uIChwZWVyKSB7XG4gICAgICAgICAgICBpZiAocGVlci5zaGFyZW15c2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgcGVlci5lbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgICovXG4gICAgfSk7XG5cbiAgICB0aGlzLndlYnJ0Yy5vbignY2hhbm5lbE1lc3NhZ2UnLCBmdW5jdGlvbiAocGVlciwgbGFiZWwsIGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PSAndm9sdW1lJykge1xuICAgICAgICAgICAgc2VsZi5lbWl0KCdyZW1vdGVWb2x1bWVDaGFuZ2UnLCBwZWVyLCBkYXRhLnZvbHVtZSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5hdXRvUmVxdWVzdE1lZGlhKSB0aGlzLnN0YXJ0TG9jYWxWaWRlbygpO1xufVxuXG5cblNpbXBsZVdlYlJUQy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFdpbGRFbWl0dGVyLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBTaW1wbGVXZWJSVENcbiAgICB9XG59KTtcblxuU2ltcGxlV2ViUlRDLnByb3RvdHlwZS5sZWF2ZVJvb20gPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMucm9vbU5hbWUpIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2xlYXZlJyk7XG4gICAgICAgIHdoaWxlICh0aGlzLndlYnJ0Yy5wZWVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMud2VicnRjLnBlZXJzWzBdLmVuZCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdldExvY2FsU2NyZWVuKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcFNjcmVlblNoYXJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KCdsZWZ0Um9vbScsIHRoaXMucm9vbU5hbWUpO1xuICAgICAgICB0aGlzLnJvb21OYW1lID0gdW5kZWZpbmVkO1xuICAgIH1cbn07XG5cblNpbXBsZVdlYlJUQy5wcm90b3R5cGUuZGlzY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuICAgIGRlbGV0ZSB0aGlzLmNvbm5lY3Rpb247XG59O1xuXG5TaW1wbGVXZWJSVEMucHJvdG90eXBlLmhhbmRsZVBlZXJTdHJlYW1BZGRlZCA9IGZ1bmN0aW9uIChwZWVyKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBjb250YWluZXIgPSB0aGlzLmdldFJlbW90ZVZpZGVvQ29udGFpbmVyKCk7XG4gICAgdmFyIHZpZGVvID0gYXR0YWNoTWVkaWFTdHJlYW0ocGVlci5zdHJlYW0pO1xuXG4gICAgLy8gc3RvcmUgdmlkZW8gZWxlbWVudCBhcyBwYXJ0IG9mIHBlZXIgZm9yIGVhc3kgcmVtb3ZhbFxuICAgIHBlZXIudmlkZW9FbCA9IHZpZGVvO1xuICAgIHZpZGVvLmlkID0gdGhpcy5nZXREb21JZChwZWVyKTtcblxuICAgIGlmIChjb250YWluZXIpIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh2aWRlbyk7XG5cbiAgICB0aGlzLmVtaXQoJ3ZpZGVvQWRkZWQnLCB2aWRlbywgcGVlcik7XG5cbiAgICAvLyBzZW5kIG91ciBtdXRlIHN0YXR1cyB0byBuZXcgcGVlciBpZiB3ZSdyZSBtdXRlZFxuICAgIC8vIGN1cnJlbnRseSBjYWxsZWQgd2l0aCBhIHNtYWxsIGRlbGF5IGJlY2F1c2UgaXQgYXJyaXZlcyBiZWZvcmVcbiAgICAvLyB0aGUgdmlkZW8gZWxlbWVudCBpcyBjcmVhdGVkIG90aGVyd2lzZSAod2hpY2ggaGFwcGVucyBhZnRlclxuICAgIC8vIHRoZSBhc3luYyBzZXRSZW1vdGVEZXNjcmlwdGlvbi1jcmVhdGVBbnN3ZXIpXG4gICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXNlbGYud2VicnRjLmlzQXVkaW9FbmFibGVkKCkpIHtcbiAgICAgICAgICAgIHBlZXIuc2VuZCgnbXV0ZScsIHtuYW1lOiAnYXVkaW8nfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxmLndlYnJ0Yy5pc1ZpZGVvRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICBwZWVyLnNlbmQoJ211dGUnLCB7bmFtZTogJ3ZpZGVvJ30pO1xuICAgICAgICB9XG4gICAgfSwgMjUwKTtcbn07XG5cblNpbXBsZVdlYlJUQy5wcm90b3R5cGUuaGFuZGxlUGVlclN0cmVhbVJlbW92ZWQgPSBmdW5jdGlvbiAocGVlcikge1xuICAgIHZhciBjb250YWluZXIgPSB0aGlzLmdldFJlbW90ZVZpZGVvQ29udGFpbmVyKCk7XG4gICAgdmFyIHZpZGVvRWwgPSBwZWVyLnZpZGVvRWw7XG4gICAgaWYgKHRoaXMuY29uZmlnLmF1dG9SZW1vdmVWaWRlb3MgJiYgY29udGFpbmVyICYmIHZpZGVvRWwpIHtcbiAgICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKHZpZGVvRWwpO1xuICAgIH1cbiAgICBpZiAodmlkZW9FbCkgdGhpcy5lbWl0KCd2aWRlb1JlbW92ZWQnLCB2aWRlb0VsLCBwZWVyKTtcbn07XG5cblNpbXBsZVdlYlJUQy5wcm90b3R5cGUuZ2V0RG9tSWQgPSBmdW5jdGlvbiAocGVlcikge1xuICAgIHJldHVybiBbcGVlci5pZCwgcGVlci50eXBlLCBwZWVyLmJyb2FkY2FzdGVyID8gJ2Jyb2FkY2FzdGluZycgOiAnaW5jb21pbmcnXS5qb2luKCdfJyk7XG59O1xuXG4vLyBzZXQgdm9sdW1lIG9uIHZpZGVvIHRhZyBmb3IgYWxsIHBlZXJzIHRha3NlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxXG5TaW1wbGVXZWJSVEMucHJvdG90eXBlLnNldFZvbHVtZUZvckFsbCA9IGZ1bmN0aW9uICh2b2x1bWUpIHtcbiAgICB0aGlzLndlYnJ0Yy5wZWVycy5mb3JFYWNoKGZ1bmN0aW9uIChwZWVyKSB7XG4gICAgICAgIGlmIChwZWVyLnZpZGVvRWwpIHBlZXIudmlkZW9FbC52b2x1bWUgPSB2b2x1bWU7XG4gICAgfSk7XG59O1xuXG5TaW1wbGVXZWJSVEMucHJvdG90eXBlLmpvaW5Sb29tID0gZnVuY3Rpb24gKG5hbWUsIGNiKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucm9vbU5hbWUgPSBuYW1lO1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdqb2luJywgbmFtZSwgZnVuY3Rpb24gKGVyciwgcm9vbURlc2NyaXB0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdqb2luIENCJywgZXJyLCByb29tRGVzY3JpcHRpb24pO1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBpZCxcbiAgICAgICAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICBwZWVyO1xuICAgICAgICAgICAgZm9yIChpZCBpbiByb29tRGVzY3JpcHRpb24uY2xpZW50cykge1xuICAgICAgICAgICAgICAgIGNsaWVudCA9IHJvb21EZXNjcmlwdGlvbi5jbGllbnRzW2lkXTtcbiAgICAgICAgICAgICAgICBmb3IgKHR5cGUgaW4gY2xpZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnRbdHlwZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlZXIgPSBzZWxmLndlYnJ0Yy5jcmVhdGVQZWVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVEYXRhQ2hhbm5lbHM6IHNlbGYuY29uZmlnLmVuYWJsZURhdGFDaGFubmVscyAmJiB0eXBlICE9PSAnc2NyZWVuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlTWVkaWE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmZXJUb1JlY2VpdmVBdWRpbzogdHlwZSAhPT0gJ3NjcmVlbicgJiYgc2VsZi5jb25maWcucmVjZWl2ZU1lZGlhLm9mZmVyVG9SZWNlaXZlQXVkaW8gPyAxIDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmZXJUb1JlY2VpdmVWaWRlbzogc2VsZi5jb25maWcucmVjZWl2ZU1lZGlhLm9mZmVyVG9SZWNlaXZlVmlkZW9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnY3JlYXRlZFBlZXInLCBwZWVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlZXIuc3RhcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYikgY2IoZXJyLCByb29tRGVzY3JpcHRpb24pO1xuICAgICAgICBzZWxmLmVtaXQoJ2pvaW5lZFJvb20nLCBuYW1lKTtcbiAgICB9KTtcbn07XG5cblNpbXBsZVdlYlJUQy5wcm90b3R5cGUuZ2V0RWwgPSBmdW5jdGlvbiAoaWRPckVsKSB7XG4gICAgaWYgKHR5cGVvZiBpZE9yRWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZE9yRWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpZE9yRWw7XG4gICAgfVxufTtcblxuU2ltcGxlV2ViUlRDLnByb3RvdHlwZS5zdGFydExvY2FsVmlkZW8gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMud2VicnRjLnN0YXJ0TG9jYWxNZWRpYSh0aGlzLmNvbmZpZy5tZWRpYSwgZnVuY3Rpb24gKGVyciwgc3RyZWFtKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHNlbGYuZW1pdCgnbG9jYWxNZWRpYUVycm9yJywgZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF0dGFjaE1lZGlhU3RyZWFtKHN0cmVhbSwgc2VsZi5nZXRMb2NhbFZpZGVvQ29udGFpbmVyKCksIHNlbGYuY29uZmlnLmxvY2FsVmlkZW8pO1xuICAgICAgICB9XG4gICAgfSk7XG59O1xuXG5TaW1wbGVXZWJSVEMucHJvdG90eXBlLnN0b3BMb2NhbFZpZGVvID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMud2VicnRjLnN0b3BMb2NhbE1lZGlhKCk7XG59O1xuXG4vLyB0aGlzIGFjY2VwdHMgZWl0aGVyIGVsZW1lbnQgSUQgb3IgZWxlbWVudFxuLy8gYW5kIGVpdGhlciB0aGUgdmlkZW8gdGFnIGl0c2VsZiBvciBhIGNvbnRhaW5lclxuLy8gdGhhdCB3aWxsIGJlIHVzZWQgdG8gcHV0IHRoZSB2aWRlbyB0YWcgaW50by5cblNpbXBsZVdlYlJUQy5wcm90b3R5cGUuZ2V0TG9jYWxWaWRlb0NvbnRhaW5lciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZWwgPSB0aGlzLmdldEVsKHRoaXMuY29uZmlnLmxvY2FsVmlkZW9FbCk7XG4gICAgaWYgKGVsICYmIGVsLnRhZ05hbWUgPT09ICdWSURFTycpIHtcbiAgICAgICAgZWwub25jb250ZXh0bWVudSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZhbHNlOyB9O1xuICAgICAgICByZXR1cm4gZWw7XG4gICAgfSBlbHNlIGlmIChlbCkge1xuICAgICAgICB2YXIgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgICAgICB2aWRlby5vbmNvbnRleHRtZW51ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZmFsc2U7IH07XG4gICAgICAgIGVsLmFwcGVuZENoaWxkKHZpZGVvKTtcbiAgICAgICAgcmV0dXJuIHZpZGVvO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG59O1xuXG5TaW1wbGVXZWJSVEMucHJvdG90eXBlLmdldFJlbW90ZVZpZGVvQ29udGFpbmVyID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmdldEVsKHRoaXMuY29uZmlnLnJlbW90ZVZpZGVvc0VsKTtcbn07XG5cblNpbXBsZVdlYlJUQy5wcm90b3R5cGUuc2hhcmVTY3JlZW4gPSBmdW5jdGlvbiAoY2IpIHtcbiAgICB0aGlzLndlYnJ0Yy5zdGFydFNjcmVlblNoYXJlKGNiKTtcbn07XG5cblNpbXBsZVdlYlJUQy5wcm90b3R5cGUuZ2V0TG9jYWxTY3JlZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMud2VicnRjLmxvY2FsU2NyZWVuO1xufTtcblxuU2ltcGxlV2ViUlRDLnByb3RvdHlwZS5zdG9wU2NyZWVuU2hhcmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ3Vuc2hhcmVTY3JlZW4nKTtcbiAgICB2YXIgdmlkZW9FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2NhbFNjcmVlbicpO1xuICAgIHZhciBjb250YWluZXIgPSB0aGlzLmdldFJlbW90ZVZpZGVvQ29udGFpbmVyKCk7XG4gICAgdmFyIHN0cmVhbSA9IHRoaXMuZ2V0TG9jYWxTY3JlZW4oKTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5hdXRvUmVtb3ZlVmlkZW9zICYmIGNvbnRhaW5lciAmJiB2aWRlb0VsKSB7XG4gICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZCh2aWRlb0VsKTtcbiAgICB9XG5cbiAgICAvLyBhIGhhY2sgdG8gZW1pdCB0aGUgZXZlbnQgdGhlIHJlbW92ZXMgdGhlIHZpZGVvXG4gICAgLy8gZWxlbWVudCB0aGF0IHdlIHdhbnRcbiAgICBpZiAodmlkZW9FbCkgdGhpcy5lbWl0KCd2aWRlb1JlbW92ZWQnLCB2aWRlb0VsKTtcbiAgICBpZiAoc3RyZWFtKSB7XG4gICAgICAgIHN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKGZ1bmN0aW9uICh0cmFjaykgeyB0cmFjay5zdG9wKCk7IH0pO1xuICAgIH1cbiAgICB0aGlzLndlYnJ0Yy5wZWVycy5mb3JFYWNoKGZ1bmN0aW9uIChwZWVyKSB7XG4gICAgICAgIGlmIChwZWVyLmJyb2FkY2FzdGVyKSB7XG4gICAgICAgICAgICBwZWVyLmVuZCgpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgLy9kZWxldGUgdGhpcy53ZWJydGMubG9jYWxTY3JlZW47XG59O1xuXG5TaW1wbGVXZWJSVEMucHJvdG90eXBlLnRlc3RSZWFkaW5lc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmICh0aGlzLnNlc3Npb25SZWFkeSkge1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLm1lZGlhLnZpZGVvICYmICF0aGlzLmNvbmZpZy5tZWRpYS5hdWRpbykge1xuICAgICAgICAgICAgc2VsZi5lbWl0KCdyZWFkeVRvQ2FsbCcsIHNlbGYuY29ubmVjdGlvbi5nZXRTZXNzaW9uaWQoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy53ZWJydGMubG9jYWxTdHJlYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNlbGYuZW1pdCgncmVhZHlUb0NhbGwnLCBzZWxmLmNvbm5lY3Rpb24uZ2V0U2Vzc2lvbmlkKCkpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuU2ltcGxlV2ViUlRDLnByb3RvdHlwZS5jcmVhdGVSb29tID0gZnVuY3Rpb24gKG5hbWUsIGNiKSB7XG4gICAgdGhpcy5yb29tTmFtZSA9IG5hbWU7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2NyZWF0ZScsIG5hbWUsIGNiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnY3JlYXRlJywgbmFtZSk7XG4gICAgfVxufTtcblxuU2ltcGxlV2ViUlRDLnByb3RvdHlwZS5zZW5kRmlsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXdlYnJ0Y1N1cHBvcnQuZGF0YUNoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ0RhdGFDaGFubmVsTm90U3VwcG9ydGVkJykpO1xuICAgIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBTaW1wbGVXZWJSVEM7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vc2ltcGxld2VicnRjL3NpbXBsZXdlYnJ0Yy5qc1xuLy8gbW9kdWxlIGlkID0gNDM2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 437 */
/***/ function(module, exports, __webpack_require__) {

    eval("var util = __webpack_require__(438);\nvar webrtcSupport = __webpack_require__(441);\nvar mockconsole = __webpack_require__(442);\nvar localMedia = __webpack_require__(443);\nvar Peer = __webpack_require__(470);\n\n\nfunction WebRTC(opts) {\n    var self = this;\n    var options = opts || {};\n    var config = this.config = {\n            debug: false,\n            // makes the entire PC config overridable\n            peerConnectionConfig: {\n                iceServers: [{'urls': 'stun:stun.l.google.com:19302'}]\n            },\n            peerConnectionConstraints: {\n                optional: []\n            },\n            receiveMedia: {\n                offerToReceiveAudio: 1,\n                offerToReceiveVideo: 1\n            },\n            enableDataChannels: true\n        };\n    var item;\n\n    // We also allow a 'logger' option. It can be any object that implements\n    // log, warn, and error methods.\n    // We log nothing by default, following \"the rule of silence\":\n    // http://www.linfo.org/rule_of_silence.html\n    this.logger = function () {\n        // we assume that if you're in debug mode and you didn't\n        // pass in a logger, you actually want to log as much as\n        // possible.\n        if (opts.debug) {\n            return opts.logger || console;\n        } else {\n        // or we'll use your logger which should have its own logic\n        // for output. Or we'll return the no-op.\n            return opts.logger || mockconsole;\n        }\n    }();\n\n    // set options\n    for (item in options) {\n        if (options.hasOwnProperty(item)) {\n            this.config[item] = options[item];\n        }\n    }\n\n    // check for support\n    if (!webrtcSupport.support) {\n        this.logger.error('Your browser doesn\\'t seem to support WebRTC');\n    }\n\n    // where we'll store our peer connections\n    this.peers = [];\n\n    // call localMedia constructor\n    localMedia.call(this, this.config);\n\n    this.on('speaking', function () {\n        if (!self.hardMuted) {\n            // FIXME: should use sendDirectlyToAll, but currently has different semantics wrt payload\n            self.peers.forEach(function (peer) {\n                if (peer.enableDataChannels) {\n                    var dc = peer.getDataChannel('hark');\n                    if (dc.readyState != 'open') return;\n                    dc.send(JSON.stringify({type: 'speaking'}));\n                }\n            });\n        }\n    });\n    this.on('stoppedSpeaking', function () {\n        if (!self.hardMuted) {\n            // FIXME: should use sendDirectlyToAll, but currently has different semantics wrt payload\n            self.peers.forEach(function (peer) {\n                if (peer.enableDataChannels) {\n                    var dc = peer.getDataChannel('hark');\n                    if (dc.readyState != 'open') return;\n                    dc.send(JSON.stringify({type: 'stoppedSpeaking'}));\n                }\n            });\n        }\n    });\n    this.on('volumeChange', function (volume, treshold) {\n        if (!self.hardMuted) {\n            // FIXME: should use sendDirectlyToAll, but currently has different semantics wrt payload\n            self.peers.forEach(function (peer) {\n                if (peer.enableDataChannels) {\n                    var dc = peer.getDataChannel('hark');\n                    if (dc.readyState != 'open') return;\n                    dc.send(JSON.stringify({type: 'volume', volume: volume }));\n                }\n            });\n        }\n    });\n\n    // log events in debug mode\n    if (this.config.debug) {\n        this.on('*', function (event, val1, val2) {\n            var logger;\n            // if you didn't pass in a logger and you explicitly turning on debug\n            // we're just going to assume you're wanting log output with console\n            if (self.config.logger === mockconsole) {\n                logger = console;\n            } else {\n                logger = self.logger;\n            }\n            logger.log('event:', event, val1, val2);\n        });\n    }\n}\n\nutil.inherits(WebRTC, localMedia);\n\nWebRTC.prototype.createPeer = function (opts) {\n    var peer;\n    opts.parent = this;\n    peer = new Peer(opts);\n    this.peers.push(peer);\n    return peer;\n};\n\n// removes peers\nWebRTC.prototype.removePeers = function (id, type) {\n    this.getPeers(id, type).forEach(function (peer) {\n        peer.end();\n    });\n};\n\n// fetches all Peer objects by session id and/or type\nWebRTC.prototype.getPeers = function (sessionId, type) {\n    return this.peers.filter(function (peer) {\n        return (!sessionId || peer.id === sessionId) && (!type || peer.type === type);\n    });\n};\n\n// sends message to all\nWebRTC.prototype.sendToAll = function (message, payload) {\n    this.peers.forEach(function (peer) {\n        peer.send(message, payload);\n    });\n};\n\n// sends message to all using a datachannel\n// only sends to anyone who has an open datachannel\nWebRTC.prototype.sendDirectlyToAll = function (channel, message, payload) {\n    this.peers.forEach(function (peer) {\n        if (peer.enableDataChannels) {\n            peer.sendDirectly(channel, message, payload);\n        }\n    });\n};\n\nmodule.exports = WebRTC;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDM3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zaW1wbGV3ZWJydGMvd2VicnRjLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xudmFyIHdlYnJ0Y1N1cHBvcnQgPSByZXF1aXJlKCd3ZWJydGNzdXBwb3J0Jyk7XG52YXIgbW9ja2NvbnNvbGUgPSByZXF1aXJlKCdtb2NrY29uc29sZScpO1xudmFyIGxvY2FsTWVkaWEgPSByZXF1aXJlKCdsb2NhbG1lZGlhJyk7XG52YXIgUGVlciA9IHJlcXVpcmUoJy4vcGVlcicpO1xuXG5cbmZ1bmN0aW9uIFdlYlJUQyhvcHRzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBvcHRpb25zID0gb3B0cyB8fCB7fTtcbiAgICB2YXIgY29uZmlnID0gdGhpcy5jb25maWcgPSB7XG4gICAgICAgICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgICAgICAgICAvLyBtYWtlcyB0aGUgZW50aXJlIFBDIGNvbmZpZyBvdmVycmlkYWJsZVxuICAgICAgICAgICAgcGVlckNvbm5lY3Rpb25Db25maWc6IHtcbiAgICAgICAgICAgICAgICBpY2VTZXJ2ZXJzOiBbeyd1cmxzJzogJ3N0dW46c3R1bi5sLmdvb2dsZS5jb206MTkzMDInfV1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwZWVyQ29ubmVjdGlvbkNvbnN0cmFpbnRzOiB7XG4gICAgICAgICAgICAgICAgb3B0aW9uYWw6IFtdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVjZWl2ZU1lZGlhOiB7XG4gICAgICAgICAgICAgICAgb2ZmZXJUb1JlY2VpdmVBdWRpbzogMSxcbiAgICAgICAgICAgICAgICBvZmZlclRvUmVjZWl2ZVZpZGVvOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5hYmxlRGF0YUNoYW5uZWxzOiB0cnVlXG4gICAgICAgIH07XG4gICAgdmFyIGl0ZW07XG5cbiAgICAvLyBXZSBhbHNvIGFsbG93IGEgJ2xvZ2dlcicgb3B0aW9uLiBJdCBjYW4gYmUgYW55IG9iamVjdCB0aGF0IGltcGxlbWVudHNcbiAgICAvLyBsb2csIHdhcm4sIGFuZCBlcnJvciBtZXRob2RzLlxuICAgIC8vIFdlIGxvZyBub3RoaW5nIGJ5IGRlZmF1bHQsIGZvbGxvd2luZyBcInRoZSBydWxlIG9mIHNpbGVuY2VcIjpcbiAgICAvLyBodHRwOi8vd3d3LmxpbmZvLm9yZy9ydWxlX29mX3NpbGVuY2UuaHRtbFxuICAgIHRoaXMubG9nZ2VyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyB3ZSBhc3N1bWUgdGhhdCBpZiB5b3UncmUgaW4gZGVidWcgbW9kZSBhbmQgeW91IGRpZG4ndFxuICAgICAgICAvLyBwYXNzIGluIGEgbG9nZ2VyLCB5b3UgYWN0dWFsbHkgd2FudCB0byBsb2cgYXMgbXVjaCBhc1xuICAgICAgICAvLyBwb3NzaWJsZS5cbiAgICAgICAgaWYgKG9wdHMuZGVidWcpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRzLmxvZ2dlciB8fCBjb25zb2xlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBvciB3ZSdsbCB1c2UgeW91ciBsb2dnZXIgd2hpY2ggc2hvdWxkIGhhdmUgaXRzIG93biBsb2dpY1xuICAgICAgICAvLyBmb3Igb3V0cHV0LiBPciB3ZSdsbCByZXR1cm4gdGhlIG5vLW9wLlxuICAgICAgICAgICAgcmV0dXJuIG9wdHMubG9nZ2VyIHx8IG1vY2tjb25zb2xlO1xuICAgICAgICB9XG4gICAgfSgpO1xuXG4gICAgLy8gc2V0IG9wdGlvbnNcbiAgICBmb3IgKGl0ZW0gaW4gb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShpdGVtKSkge1xuICAgICAgICAgICAgdGhpcy5jb25maWdbaXRlbV0gPSBvcHRpb25zW2l0ZW1dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgZm9yIHN1cHBvcnRcbiAgICBpZiAoIXdlYnJ0Y1N1cHBvcnQuc3VwcG9ydCkge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignWW91ciBicm93c2VyIGRvZXNuXFwndCBzZWVtIHRvIHN1cHBvcnQgV2ViUlRDJyk7XG4gICAgfVxuXG4gICAgLy8gd2hlcmUgd2UnbGwgc3RvcmUgb3VyIHBlZXIgY29ubmVjdGlvbnNcbiAgICB0aGlzLnBlZXJzID0gW107XG5cbiAgICAvLyBjYWxsIGxvY2FsTWVkaWEgY29uc3RydWN0b3JcbiAgICBsb2NhbE1lZGlhLmNhbGwodGhpcywgdGhpcy5jb25maWcpO1xuXG4gICAgdGhpcy5vbignc3BlYWtpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghc2VsZi5oYXJkTXV0ZWQpIHtcbiAgICAgICAgICAgIC8vIEZJWE1FOiBzaG91bGQgdXNlIHNlbmREaXJlY3RseVRvQWxsLCBidXQgY3VycmVudGx5IGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIHdydCBwYXlsb2FkXG4gICAgICAgICAgICBzZWxmLnBlZXJzLmZvckVhY2goZnVuY3Rpb24gKHBlZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAocGVlci5lbmFibGVEYXRhQ2hhbm5lbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRjID0gcGVlci5nZXREYXRhQ2hhbm5lbCgnaGFyaycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGMucmVhZHlTdGF0ZSAhPSAnb3BlbicpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgZGMuc2VuZChKU09OLnN0cmluZ2lmeSh7dHlwZTogJ3NwZWFraW5nJ30pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMub24oJ3N0b3BwZWRTcGVha2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFzZWxmLmhhcmRNdXRlZCkge1xuICAgICAgICAgICAgLy8gRklYTUU6IHNob3VsZCB1c2Ugc2VuZERpcmVjdGx5VG9BbGwsIGJ1dCBjdXJyZW50bHkgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3Mgd3J0IHBheWxvYWRcbiAgICAgICAgICAgIHNlbGYucGVlcnMuZm9yRWFjaChmdW5jdGlvbiAocGVlcikge1xuICAgICAgICAgICAgICAgIGlmIChwZWVyLmVuYWJsZURhdGFDaGFubmVscykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGMgPSBwZWVyLmdldERhdGFDaGFubmVsKCdoYXJrJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYy5yZWFkeVN0YXRlICE9ICdvcGVuJykgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBkYy5zZW5kKEpTT04uc3RyaW5naWZ5KHt0eXBlOiAnc3RvcHBlZFNwZWFraW5nJ30pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMub24oJ3ZvbHVtZUNoYW5nZScsIGZ1bmN0aW9uICh2b2x1bWUsIHRyZXNob2xkKSB7XG4gICAgICAgIGlmICghc2VsZi5oYXJkTXV0ZWQpIHtcbiAgICAgICAgICAgIC8vIEZJWE1FOiBzaG91bGQgdXNlIHNlbmREaXJlY3RseVRvQWxsLCBidXQgY3VycmVudGx5IGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIHdydCBwYXlsb2FkXG4gICAgICAgICAgICBzZWxmLnBlZXJzLmZvckVhY2goZnVuY3Rpb24gKHBlZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAocGVlci5lbmFibGVEYXRhQ2hhbm5lbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRjID0gcGVlci5nZXREYXRhQ2hhbm5lbCgnaGFyaycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGMucmVhZHlTdGF0ZSAhPSAnb3BlbicpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgZGMuc2VuZChKU09OLnN0cmluZ2lmeSh7dHlwZTogJ3ZvbHVtZScsIHZvbHVtZTogdm9sdW1lIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gbG9nIGV2ZW50cyBpbiBkZWJ1ZyBtb2RlXG4gICAgaWYgKHRoaXMuY29uZmlnLmRlYnVnKSB7XG4gICAgICAgIHRoaXMub24oJyonLCBmdW5jdGlvbiAoZXZlbnQsIHZhbDEsIHZhbDIpIHtcbiAgICAgICAgICAgIHZhciBsb2dnZXI7XG4gICAgICAgICAgICAvLyBpZiB5b3UgZGlkbid0IHBhc3MgaW4gYSBsb2dnZXIgYW5kIHlvdSBleHBsaWNpdGx5IHR1cm5pbmcgb24gZGVidWdcbiAgICAgICAgICAgIC8vIHdlJ3JlIGp1c3QgZ29pbmcgdG8gYXNzdW1lIHlvdSdyZSB3YW50aW5nIGxvZyBvdXRwdXQgd2l0aCBjb25zb2xlXG4gICAgICAgICAgICBpZiAoc2VsZi5jb25maWcubG9nZ2VyID09PSBtb2NrY29uc29sZSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlciA9IGNvbnNvbGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlciA9IHNlbGYubG9nZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nZ2VyLmxvZygnZXZlbnQ6JywgZXZlbnQsIHZhbDEsIHZhbDIpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbnV0aWwuaW5oZXJpdHMoV2ViUlRDLCBsb2NhbE1lZGlhKTtcblxuV2ViUlRDLnByb3RvdHlwZS5jcmVhdGVQZWVyID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgICB2YXIgcGVlcjtcbiAgICBvcHRzLnBhcmVudCA9IHRoaXM7XG4gICAgcGVlciA9IG5ldyBQZWVyKG9wdHMpO1xuICAgIHRoaXMucGVlcnMucHVzaChwZWVyKTtcbiAgICByZXR1cm4gcGVlcjtcbn07XG5cbi8vIHJlbW92ZXMgcGVlcnNcbldlYlJUQy5wcm90b3R5cGUucmVtb3ZlUGVlcnMgPSBmdW5jdGlvbiAoaWQsIHR5cGUpIHtcbiAgICB0aGlzLmdldFBlZXJzKGlkLCB0eXBlKS5mb3JFYWNoKGZ1bmN0aW9uIChwZWVyKSB7XG4gICAgICAgIHBlZXIuZW5kKCk7XG4gICAgfSk7XG59O1xuXG4vLyBmZXRjaGVzIGFsbCBQZWVyIG9iamVjdHMgYnkgc2Vzc2lvbiBpZCBhbmQvb3IgdHlwZVxuV2ViUlRDLnByb3RvdHlwZS5nZXRQZWVycyA9IGZ1bmN0aW9uIChzZXNzaW9uSWQsIHR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5wZWVycy5maWx0ZXIoZnVuY3Rpb24gKHBlZXIpIHtcbiAgICAgICAgcmV0dXJuICghc2Vzc2lvbklkIHx8IHBlZXIuaWQgPT09IHNlc3Npb25JZCkgJiYgKCF0eXBlIHx8IHBlZXIudHlwZSA9PT0gdHlwZSk7XG4gICAgfSk7XG59O1xuXG4vLyBzZW5kcyBtZXNzYWdlIHRvIGFsbFxuV2ViUlRDLnByb3RvdHlwZS5zZW5kVG9BbGwgPSBmdW5jdGlvbiAobWVzc2FnZSwgcGF5bG9hZCkge1xuICAgIHRoaXMucGVlcnMuZm9yRWFjaChmdW5jdGlvbiAocGVlcikge1xuICAgICAgICBwZWVyLnNlbmQobWVzc2FnZSwgcGF5bG9hZCk7XG4gICAgfSk7XG59O1xuXG4vLyBzZW5kcyBtZXNzYWdlIHRvIGFsbCB1c2luZyBhIGRhdGFjaGFubmVsXG4vLyBvbmx5IHNlbmRzIHRvIGFueW9uZSB3aG8gaGFzIGFuIG9wZW4gZGF0YWNoYW5uZWxcbldlYlJUQy5wcm90b3R5cGUuc2VuZERpcmVjdGx5VG9BbGwgPSBmdW5jdGlvbiAoY2hhbm5lbCwgbWVzc2FnZSwgcGF5bG9hZCkge1xuICAgIHRoaXMucGVlcnMuZm9yRWFjaChmdW5jdGlvbiAocGVlcikge1xuICAgICAgICBpZiAocGVlci5lbmFibGVEYXRhQ2hhbm5lbHMpIHtcbiAgICAgICAgICAgIHBlZXIuc2VuZERpcmVjdGx5KGNoYW5uZWwsIG1lc3NhZ2UsIHBheWxvYWQpO1xuICAgICAgICB9XG4gICAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdlYlJUQztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9zaW1wbGV3ZWJydGMvd2VicnRjLmpzXG4vLyBtb2R1bGUgaWQgPSA0Mzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 438 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(global, process) {// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n  if (!isString(f)) {\n    var objects = [];\n    for (var i = 0; i < arguments.length; i++) {\n      objects.push(inspect(arguments[i]));\n    }\n    return objects.join(' ');\n  }\n\n  var i = 1;\n  var args = arguments;\n  var len = args.length;\n  var str = String(f).replace(formatRegExp, function(x) {\n    if (x === '%%') return '%';\n    if (i >= len) return x;\n    switch (x) {\n      case '%s': return String(args[i++]);\n      case '%d': return Number(args[i++]);\n      case '%j':\n        try {\n          return JSON.stringify(args[i++]);\n        } catch (_) {\n          return '[Circular]';\n        }\n      default:\n        return x;\n    }\n  });\n  for (var x = args[i]; i < len; x = args[++i]) {\n    if (isNull(x) || !isObject(x)) {\n      str += ' ' + x;\n    } else {\n      str += ' ' + inspect(x);\n    }\n  }\n  return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n  // Allow for deprecating things in the process of starting up.\n  if (isUndefined(global.process)) {\n    return function() {\n      return exports.deprecate(fn, msg).apply(this, arguments);\n    };\n  }\n\n  if (process.noDeprecation === true) {\n    return fn;\n  }\n\n  var warned = false;\n  function deprecated() {\n    if (!warned) {\n      if (process.throwDeprecation) {\n        throw new Error(msg);\n      } else if (process.traceDeprecation) {\n        console.trace(msg);\n      } else {\n        console.error(msg);\n      }\n      warned = true;\n    }\n    return fn.apply(this, arguments);\n  }\n\n  return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n  if (isUndefined(debugEnviron))\n    debugEnviron = process.env.NODE_DEBUG || '';\n  set = set.toUpperCase();\n  if (!debugs[set]) {\n    if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n      var pid = process.pid;\n      debugs[set] = function() {\n        var msg = exports.format.apply(exports, arguments);\n        console.error('%s %d: %s', set, pid, msg);\n      };\n    } else {\n      debugs[set] = function() {};\n    }\n  }\n  return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n  // default options\n  var ctx = {\n    seen: [],\n    stylize: stylizeNoColor\n  };\n  // legacy...\n  if (arguments.length >= 3) ctx.depth = arguments[2];\n  if (arguments.length >= 4) ctx.colors = arguments[3];\n  if (isBoolean(opts)) {\n    // legacy...\n    ctx.showHidden = opts;\n  } else if (opts) {\n    // got an \"options\" object\n    exports._extend(ctx, opts);\n  }\n  // set default options\n  if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n  if (isUndefined(ctx.depth)) ctx.depth = 2;\n  if (isUndefined(ctx.colors)) ctx.colors = false;\n  if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n  if (ctx.colors) ctx.stylize = stylizeWithColor;\n  return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n  'bold' : [1, 22],\n  'italic' : [3, 23],\n  'underline' : [4, 24],\n  'inverse' : [7, 27],\n  'white' : [37, 39],\n  'grey' : [90, 39],\n  'black' : [30, 39],\n  'blue' : [34, 39],\n  'cyan' : [36, 39],\n  'green' : [32, 39],\n  'magenta' : [35, 39],\n  'red' : [31, 39],\n  'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n  'special': 'cyan',\n  'number': 'yellow',\n  'boolean': 'yellow',\n  'undefined': 'grey',\n  'null': 'bold',\n  'string': 'green',\n  'date': 'magenta',\n  // \"name\": intentionally not styling\n  'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n  var style = inspect.styles[styleType];\n\n  if (style) {\n    return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n           '\\u001b[' + inspect.colors[style][1] + 'm';\n  } else {\n    return str;\n  }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n  return str;\n}\n\n\nfunction arrayToHash(array) {\n  var hash = {};\n\n  array.forEach(function(val, idx) {\n    hash[val] = true;\n  });\n\n  return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n  // Provide a hook for user-specified inspect functions.\n  // Check that value is an object with an inspect function on it\n  if (ctx.customInspect &&\n      value &&\n      isFunction(value.inspect) &&\n      // Filter out the util module, it's inspect function is special\n      value.inspect !== exports.inspect &&\n      // Also filter out any prototype objects using the circular check.\n      !(value.constructor && value.constructor.prototype === value)) {\n    var ret = value.inspect(recurseTimes, ctx);\n    if (!isString(ret)) {\n      ret = formatValue(ctx, ret, recurseTimes);\n    }\n    return ret;\n  }\n\n  // Primitive types cannot have properties\n  var primitive = formatPrimitive(ctx, value);\n  if (primitive) {\n    return primitive;\n  }\n\n  // Look up the keys of the object.\n  var keys = Object.keys(value);\n  var visibleKeys = arrayToHash(keys);\n\n  if (ctx.showHidden) {\n    keys = Object.getOwnPropertyNames(value);\n  }\n\n  // IE doesn't make error fields non-enumerable\n  // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n  if (isError(value)\n      && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n    return formatError(value);\n  }\n\n  // Some type of object without properties can be shortcutted.\n  if (keys.length === 0) {\n    if (isFunction(value)) {\n      var name = value.name ? ': ' + value.name : '';\n      return ctx.stylize('[Function' + name + ']', 'special');\n    }\n    if (isRegExp(value)) {\n      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n    }\n    if (isDate(value)) {\n      return ctx.stylize(Date.prototype.toString.call(value), 'date');\n    }\n    if (isError(value)) {\n      return formatError(value);\n    }\n  }\n\n  var base = '', array = false, braces = ['{', '}'];\n\n  // Make Array say that they are Array\n  if (isArray(value)) {\n    array = true;\n    braces = ['[', ']'];\n  }\n\n  // Make functions say that they are functions\n  if (isFunction(value)) {\n    var n = value.name ? ': ' + value.name : '';\n    base = ' [Function' + n + ']';\n  }\n\n  // Make RegExps say that they are RegExps\n  if (isRegExp(value)) {\n    base = ' ' + RegExp.prototype.toString.call(value);\n  }\n\n  // Make dates with properties first say the date\n  if (isDate(value)) {\n    base = ' ' + Date.prototype.toUTCString.call(value);\n  }\n\n  // Make error with message first say the error\n  if (isError(value)) {\n    base = ' ' + formatError(value);\n  }\n\n  if (keys.length === 0 && (!array || value.length == 0)) {\n    return braces[0] + base + braces[1];\n  }\n\n  if (recurseTimes < 0) {\n    if (isRegExp(value)) {\n      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n    } else {\n      return ctx.stylize('[Object]', 'special');\n    }\n  }\n\n  ctx.seen.push(value);\n\n  var output;\n  if (array) {\n    output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n  } else {\n    output = keys.map(function(key) {\n      return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n    });\n  }\n\n  ctx.seen.pop();\n\n  return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n  if (isUndefined(value))\n    return ctx.stylize('undefined', 'undefined');\n  if (isString(value)) {\n    var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n                                             .replace(/'/g, \"\\\\'\")\n                                             .replace(/\\\\\"/g, '\"') + '\\'';\n    return ctx.stylize(simple, 'string');\n  }\n  if (isNumber(value))\n    return ctx.stylize('' + value, 'number');\n  if (isBoolean(value))\n    return ctx.stylize('' + value, 'boolean');\n  // For some reason typeof null is \"object\", so special case here.\n  if (isNull(value))\n    return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n  return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n  var output = [];\n  for (var i = 0, l = value.length; i < l; ++i) {\n    if (hasOwnProperty(value, String(i))) {\n      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n          String(i), true));\n    } else {\n      output.push('');\n    }\n  }\n  keys.forEach(function(key) {\n    if (!key.match(/^\\d+$/)) {\n      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n          key, true));\n    }\n  });\n  return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n  var name, str, desc;\n  desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n  if (desc.get) {\n    if (desc.set) {\n      str = ctx.stylize('[Getter/Setter]', 'special');\n    } else {\n      str = ctx.stylize('[Getter]', 'special');\n    }\n  } else {\n    if (desc.set) {\n      str = ctx.stylize('[Setter]', 'special');\n    }\n  }\n  if (!hasOwnProperty(visibleKeys, key)) {\n    name = '[' + key + ']';\n  }\n  if (!str) {\n    if (ctx.seen.indexOf(desc.value) < 0) {\n      if (isNull(recurseTimes)) {\n        str = formatValue(ctx, desc.value, null);\n      } else {\n        str = formatValue(ctx, desc.value, recurseTimes - 1);\n      }\n      if (str.indexOf('\\n') > -1) {\n        if (array) {\n          str = str.split('\\n').map(function(line) {\n            return '  ' + line;\n          }).join('\\n').substr(2);\n        } else {\n          str = '\\n' + str.split('\\n').map(function(line) {\n            return '   ' + line;\n          }).join('\\n');\n        }\n      }\n    } else {\n      str = ctx.stylize('[Circular]', 'special');\n    }\n  }\n  if (isUndefined(name)) {\n    if (array && key.match(/^\\d+$/)) {\n      return str;\n    }\n    name = JSON.stringify('' + key);\n    if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n      name = name.substr(1, name.length - 2);\n      name = ctx.stylize(name, 'name');\n    } else {\n      name = name.replace(/'/g, \"\\\\'\")\n                 .replace(/\\\\\"/g, '\"')\n                 .replace(/(^\"|\"$)/g, \"'\");\n      name = ctx.stylize(name, 'string');\n    }\n  }\n\n  return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n  var numLinesEst = 0;\n  var length = output.reduce(function(prev, cur) {\n    numLinesEst++;\n    if (cur.indexOf('\\n') >= 0) numLinesEst++;\n    return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n  }, 0);\n\n  if (length > 60) {\n    return braces[0] +\n           (base === '' ? '' : base + '\\n ') +\n           ' ' +\n           output.join(',\\n  ') +\n           ' ' +\n           braces[1];\n  }\n\n  return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n  return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n  return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n  return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n  return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n  return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n  return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n  return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n  return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n  return isObject(e) &&\n      (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n  return arg === null ||\n         typeof arg === 'boolean' ||\n         typeof arg === 'number' ||\n         typeof arg === 'string' ||\n         typeof arg === 'symbol' ||  // ES6 symbol\n         typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = __webpack_require__(439);\n\nfunction objectToString(o) {\n  return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n  return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n              'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n  var d = new Date();\n  var time = [pad(d.getHours()),\n              pad(d.getMinutes()),\n              pad(d.getSeconds())].join(':');\n  return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n  console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n *     prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = __webpack_require__(440);\n\nexports._extend = function(origin, add) {\n  // Don't do anything if add isn't an object\n  if (!add || !isObject(add)) return origin;\n\n  var keys = Object.keys(add);\n  var i = keys.length;\n  while (i--) {\n    origin[keys[i]] = add[keys[i]];\n  }\n  return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n  return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(200)))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDM4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBmb3JtYXRSZWdFeHAgPSAvJVtzZGolXS9nO1xuZXhwb3J0cy5mb3JtYXQgPSBmdW5jdGlvbihmKSB7XG4gIGlmICghaXNTdHJpbmcoZikpIHtcbiAgICB2YXIgb2JqZWN0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvYmplY3RzLnB1c2goaW5zcGVjdChhcmd1bWVudHNbaV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdHMuam9pbignICcpO1xuICB9XG5cbiAgdmFyIGkgPSAxO1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoO1xuICB2YXIgc3RyID0gU3RyaW5nKGYpLnJlcGxhY2UoZm9ybWF0UmVnRXhwLCBmdW5jdGlvbih4KSB7XG4gICAgaWYgKHggPT09ICclJScpIHJldHVybiAnJSc7XG4gICAgaWYgKGkgPj0gbGVuKSByZXR1cm4geDtcbiAgICBzd2l0Y2ggKHgpIHtcbiAgICAgIGNhc2UgJyVzJzogcmV0dXJuIFN0cmluZyhhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWQnOiByZXR1cm4gTnVtYmVyKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclaic6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZ3NbaSsrXSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gIH0pO1xuICBmb3IgKHZhciB4ID0gYXJnc1tpXTsgaSA8IGxlbjsgeCA9IGFyZ3NbKytpXSkge1xuICAgIGlmIChpc051bGwoeCkgfHwgIWlzT2JqZWN0KHgpKSB7XG4gICAgICBzdHIgKz0gJyAnICsgeDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyICs9ICcgJyArIGluc3BlY3QoeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHI7XG59O1xuXG5cbi8vIE1hcmsgdGhhdCBhIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuXG4vLyBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuLy8gSWYgLS1uby1kZXByZWNhdGlvbiBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cbmV4cG9ydHMuZGVwcmVjYXRlID0gZnVuY3Rpb24oZm4sIG1zZykge1xuICAvLyBBbGxvdyBmb3IgZGVwcmVjYXRpbmcgdGhpbmdzIGluIHRoZSBwcm9jZXNzIG9mIHN0YXJ0aW5nIHVwLlxuICBpZiAoaXNVbmRlZmluZWQoZ2xvYmFsLnByb2Nlc3MpKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV4cG9ydHMuZGVwcmVjYXRlKGZuLCBtc2cpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLm5vRGVwcmVjYXRpb24gPT09IHRydWUpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChwcm9jZXNzLnRocm93RGVwcmVjYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MudHJhY2VEZXByZWNhdGlvbikge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufTtcblxuXG52YXIgZGVidWdzID0ge307XG52YXIgZGVidWdFbnZpcm9uO1xuZXhwb3J0cy5kZWJ1Z2xvZyA9IGZ1bmN0aW9uKHNldCkge1xuICBpZiAoaXNVbmRlZmluZWQoZGVidWdFbnZpcm9uKSlcbiAgICBkZWJ1Z0Vudmlyb24gPSBwcm9jZXNzLmVudi5OT0RFX0RFQlVHIHx8ICcnO1xuICBzZXQgPSBzZXQudG9VcHBlckNhc2UoKTtcbiAgaWYgKCFkZWJ1Z3Nbc2V0XSkge1xuICAgIGlmIChuZXcgUmVnRXhwKCdcXFxcYicgKyBzZXQgKyAnXFxcXGInLCAnaScpLnRlc3QoZGVidWdFbnZpcm9uKSkge1xuICAgICAgdmFyIHBpZCA9IHByb2Nlc3MucGlkO1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG1zZyA9IGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyVzICVkOiAlcycsIHNldCwgcGlkLCBtc2cpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHt9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVidWdzW3NldF07XG59O1xuXG5cbi8qKlxuICogRWNob3MgdGhlIHZhbHVlIG9mIGEgdmFsdWUuIFRyeXMgdG8gcHJpbnQgdGhlIHZhbHVlIG91dFxuICogaW4gdGhlIGJlc3Qgd2F5IHBvc3NpYmxlIGdpdmVuIHRoZSBkaWZmZXJlbnQgdHlwZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHByaW50IG91dC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSBvdXRwdXQuXG4gKi9cbi8qIGxlZ2FjeTogb2JqLCBzaG93SGlkZGVuLCBkZXB0aCwgY29sb3JzKi9cbmZ1bmN0aW9uIGluc3BlY3Qob2JqLCBvcHRzKSB7XG4gIC8vIGRlZmF1bHQgb3B0aW9uc1xuICB2YXIgY3R4ID0ge1xuICAgIHNlZW46IFtdLFxuICAgIHN0eWxpemU6IHN0eWxpemVOb0NvbG9yXG4gIH07XG4gIC8vIGxlZ2FjeS4uLlxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAzKSBjdHguZGVwdGggPSBhcmd1bWVudHNbMl07XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDQpIGN0eC5jb2xvcnMgPSBhcmd1bWVudHNbM107XG4gIGlmIChpc0Jvb2xlYW4ob3B0cykpIHtcbiAgICAvLyBsZWdhY3kuLi5cbiAgICBjdHguc2hvd0hpZGRlbiA9IG9wdHM7XG4gIH0gZWxzZSBpZiAob3B0cykge1xuICAgIC8vIGdvdCBhbiBcIm9wdGlvbnNcIiBvYmplY3RcbiAgICBleHBvcnRzLl9leHRlbmQoY3R4LCBvcHRzKTtcbiAgfVxuICAvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG4gIGlmIChpc1VuZGVmaW5lZChjdHguc2hvd0hpZGRlbikpIGN0eC5zaG93SGlkZGVuID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguZGVwdGgpKSBjdHguZGVwdGggPSAyO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmNvbG9ycykpIGN0eC5jb2xvcnMgPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jdXN0b21JbnNwZWN0KSkgY3R4LmN1c3RvbUluc3BlY3QgPSB0cnVlO1xuICBpZiAoY3R4LmNvbG9ycykgY3R4LnN0eWxpemUgPSBzdHlsaXplV2l0aENvbG9yO1xuICByZXR1cm4gZm9ybWF0VmFsdWUoY3R4LCBvYmosIGN0eC5kZXB0aCk7XG59XG5leHBvcnRzLmluc3BlY3QgPSBpbnNwZWN0O1xuXG5cbi8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQU5TSV9lc2NhcGVfY29kZSNncmFwaGljc1xuaW5zcGVjdC5jb2xvcnMgPSB7XG4gICdib2xkJyA6IFsxLCAyMl0sXG4gICdpdGFsaWMnIDogWzMsIDIzXSxcbiAgJ3VuZGVybGluZScgOiBbNCwgMjRdLFxuICAnaW52ZXJzZScgOiBbNywgMjddLFxuICAnd2hpdGUnIDogWzM3LCAzOV0sXG4gICdncmV5JyA6IFs5MCwgMzldLFxuICAnYmxhY2snIDogWzMwLCAzOV0sXG4gICdibHVlJyA6IFszNCwgMzldLFxuICAnY3lhbicgOiBbMzYsIDM5XSxcbiAgJ2dyZWVuJyA6IFszMiwgMzldLFxuICAnbWFnZW50YScgOiBbMzUsIDM5XSxcbiAgJ3JlZCcgOiBbMzEsIDM5XSxcbiAgJ3llbGxvdycgOiBbMzMsIDM5XVxufTtcblxuLy8gRG9uJ3QgdXNlICdibHVlJyBub3QgdmlzaWJsZSBvbiBjbWQuZXhlXG5pbnNwZWN0LnN0eWxlcyA9IHtcbiAgJ3NwZWNpYWwnOiAnY3lhbicsXG4gICdudW1iZXInOiAneWVsbG93JyxcbiAgJ2Jvb2xlYW4nOiAneWVsbG93JyxcbiAgJ3VuZGVmaW5lZCc6ICdncmV5JyxcbiAgJ251bGwnOiAnYm9sZCcsXG4gICdzdHJpbmcnOiAnZ3JlZW4nLFxuICAnZGF0ZSc6ICdtYWdlbnRhJyxcbiAgLy8gXCJuYW1lXCI6IGludGVudGlvbmFsbHkgbm90IHN0eWxpbmdcbiAgJ3JlZ2V4cCc6ICdyZWQnXG59O1xuXG5cbmZ1bmN0aW9uIHN0eWxpemVXaXRoQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgdmFyIHN0eWxlID0gaW5zcGVjdC5zdHlsZXNbc3R5bGVUeXBlXTtcblxuICBpZiAoc3R5bGUpIHtcbiAgICByZXR1cm4gJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVswXSArICdtJyArIHN0ciArXG4gICAgICAgICAgICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMV0gKyAnbSc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHN0eWxpemVOb0NvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHJldHVybiBzdHI7XG59XG5cblxuZnVuY3Rpb24gYXJyYXlUb0hhc2goYXJyYXkpIHtcbiAgdmFyIGhhc2ggPSB7fTtcblxuICBhcnJheS5mb3JFYWNoKGZ1bmN0aW9uKHZhbCwgaWR4KSB7XG4gICAgaGFzaFt2YWxdID0gdHJ1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGhhc2g7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0VmFsdWUoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzKSB7XG4gIC8vIFByb3ZpZGUgYSBob29rIGZvciB1c2VyLXNwZWNpZmllZCBpbnNwZWN0IGZ1bmN0aW9ucy5cbiAgLy8gQ2hlY2sgdGhhdCB2YWx1ZSBpcyBhbiBvYmplY3Qgd2l0aCBhbiBpbnNwZWN0IGZ1bmN0aW9uIG9uIGl0XG4gIGlmIChjdHguY3VzdG9tSW5zcGVjdCAmJlxuICAgICAgdmFsdWUgJiZcbiAgICAgIGlzRnVuY3Rpb24odmFsdWUuaW5zcGVjdCkgJiZcbiAgICAgIC8vIEZpbHRlciBvdXQgdGhlIHV0aWwgbW9kdWxlLCBpdCdzIGluc3BlY3QgZnVuY3Rpb24gaXMgc3BlY2lhbFxuICAgICAgdmFsdWUuaW5zcGVjdCAhPT0gZXhwb3J0cy5pbnNwZWN0ICYmXG4gICAgICAvLyBBbHNvIGZpbHRlciBvdXQgYW55IHByb3RvdHlwZSBvYmplY3RzIHVzaW5nIHRoZSBjaXJjdWxhciBjaGVjay5cbiAgICAgICEodmFsdWUuY29uc3RydWN0b3IgJiYgdmFsdWUuY29uc3RydWN0b3IucHJvdG90eXBlID09PSB2YWx1ZSkpIHtcbiAgICB2YXIgcmV0ID0gdmFsdWUuaW5zcGVjdChyZWN1cnNlVGltZXMsIGN0eCk7XG4gICAgaWYgKCFpc1N0cmluZyhyZXQpKSB7XG4gICAgICByZXQgPSBmb3JtYXRWYWx1ZShjdHgsIHJldCwgcmVjdXJzZVRpbWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8vIFByaW1pdGl2ZSB0eXBlcyBjYW5ub3QgaGF2ZSBwcm9wZXJ0aWVzXG4gIHZhciBwcmltaXRpdmUgPSBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSk7XG4gIGlmIChwcmltaXRpdmUpIHtcbiAgICByZXR1cm4gcHJpbWl0aXZlO1xuICB9XG5cbiAgLy8gTG9vayB1cCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0LlxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgdmFyIHZpc2libGVLZXlzID0gYXJyYXlUb0hhc2goa2V5cyk7XG5cbiAgaWYgKGN0eC5zaG93SGlkZGVuKSB7XG4gICAga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKTtcbiAgfVxuXG4gIC8vIElFIGRvZXNuJ3QgbWFrZSBlcnJvciBmaWVsZHMgbm9uLWVudW1lcmFibGVcbiAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2R3dzUyc2J0KHY9dnMuOTQpLmFzcHhcbiAgaWYgKGlzRXJyb3IodmFsdWUpXG4gICAgICAmJiAoa2V5cy5pbmRleE9mKCdtZXNzYWdlJykgPj0gMCB8fCBrZXlzLmluZGV4T2YoJ2Rlc2NyaXB0aW9uJykgPj0gMCkpIHtcbiAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgLy8gU29tZSB0eXBlIG9mIG9iamVjdCB3aXRob3V0IHByb3BlcnRpZXMgY2FuIGJlIHNob3J0Y3V0dGVkLlxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHZhciBuYW1lID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tGdW5jdGlvbicgKyBuYW1lICsgJ10nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH1cbiAgICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAnZGF0ZScpO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGJhc2UgPSAnJywgYXJyYXkgPSBmYWxzZSwgYnJhY2VzID0gWyd7JywgJ30nXTtcblxuICAvLyBNYWtlIEFycmF5IHNheSB0aGF0IHRoZXkgYXJlIEFycmF5XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGFycmF5ID0gdHJ1ZTtcbiAgICBicmFjZXMgPSBbJ1snLCAnXSddO1xuICB9XG5cbiAgLy8gTWFrZSBmdW5jdGlvbnMgc2F5IHRoYXQgdGhleSBhcmUgZnVuY3Rpb25zXG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHZhciBuID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgYmFzZSA9ICcgW0Z1bmN0aW9uJyArIG4gKyAnXSc7XG4gIH1cblxuICAvLyBNYWtlIFJlZ0V4cHMgc2F5IHRoYXQgdGhleSBhcmUgUmVnRXhwc1xuICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGRhdGVzIHdpdGggcHJvcGVydGllcyBmaXJzdCBzYXkgdGhlIGRhdGVcbiAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGVycm9yIHdpdGggbWVzc2FnZSBmaXJzdCBzYXkgdGhlIGVycm9yXG4gIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDAgJiYgKCFhcnJheSB8fCB2YWx1ZS5sZW5ndGggPT0gMCkpIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArIGJyYWNlc1sxXTtcbiAgfVxuXG4gIGlmIChyZWN1cnNlVGltZXMgPCAwKSB7XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbT2JqZWN0XScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG5cbiAgY3R4LnNlZW4ucHVzaCh2YWx1ZSk7XG5cbiAgdmFyIG91dHB1dDtcbiAgaWYgKGFycmF5KSB7XG4gICAgb3V0cHV0ID0gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cyk7XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0ID0ga2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSk7XG4gICAgfSk7XG4gIH1cblxuICBjdHguc2Vlbi5wb3AoKTtcblxuICByZXR1cm4gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKSB7XG4gIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyk7XG4gIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICB2YXIgc2ltcGxlID0gJ1xcJycgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkucmVwbGFjZSgvXlwifFwiJC9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJykgKyAnXFwnJztcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoc2ltcGxlLCAnc3RyaW5nJyk7XG4gIH1cbiAgaWYgKGlzTnVtYmVyKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ251bWJlcicpO1xuICBpZiAoaXNCb29sZWFuKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ2Jvb2xlYW4nKTtcbiAgLy8gRm9yIHNvbWUgcmVhc29uIHR5cGVvZiBudWxsIGlzIFwib2JqZWN0XCIsIHNvIHNwZWNpYWwgY2FzZSBoZXJlLlxuICBpZiAoaXNOdWxsKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ251bGwnLCAnbnVsbCcpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEVycm9yKHZhbHVlKSB7XG4gIHJldHVybiAnWycgKyBFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgKyAnXSc7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIGZvciAodmFyIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5KHZhbHVlLCBTdHJpbmcoaSkpKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIFN0cmluZyhpKSwgdHJ1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgfVxuICB9XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoIWtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAga2V5LCB0cnVlKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KSB7XG4gIHZhciBuYW1lLCBzdHIsIGRlc2M7XG4gIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpIHx8IHsgdmFsdWU6IHZhbHVlW2tleV0gfTtcbiAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlci9TZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoIWhhc093blByb3BlcnR5KHZpc2libGVLZXlzLCBrZXkpKSB7XG4gICAgbmFtZSA9ICdbJyArIGtleSArICddJztcbiAgfVxuICBpZiAoIXN0cikge1xuICAgIGlmIChjdHguc2Vlbi5pbmRleE9mKGRlc2MudmFsdWUpIDwgMCkge1xuICAgICAgaWYgKGlzTnVsbChyZWN1cnNlVGltZXMpKSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIHJlY3Vyc2VUaW1lcyAtIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdcXG4nKSA+IC0xKSB7XG4gICAgICAgIGlmIChhcnJheSkge1xuICAgICAgICAgIHN0ciA9IHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKS5zdWJzdHIoMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyID0gJ1xcbicgKyBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbQ2lyY3VsYXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgaWYgKGFycmF5ICYmIGtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIG5hbWUgPSBKU09OLnN0cmluZ2lmeSgnJyArIGtleSk7XG4gICAgaWYgKG5hbWUubWF0Y2goL15cIihbYS16QS1aX11bYS16QS1aXzAtOV0qKVwiJC8pKSB7XG4gICAgICBuYW1lID0gbmFtZS5zdWJzdHIoMSwgbmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnbmFtZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKF5cInxcIiQpL2csIFwiJ1wiKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5hbWUgKyAnOiAnICsgc3RyO1xufVxuXG5cbmZ1bmN0aW9uIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKSB7XG4gIHZhciBudW1MaW5lc0VzdCA9IDA7XG4gIHZhciBsZW5ndGggPSBvdXRwdXQucmVkdWNlKGZ1bmN0aW9uKHByZXYsIGN1cikge1xuICAgIG51bUxpbmVzRXN0Kys7XG4gICAgaWYgKGN1ci5pbmRleE9mKCdcXG4nKSA+PSAwKSBudW1MaW5lc0VzdCsrO1xuICAgIHJldHVybiBwcmV2ICsgY3VyLnJlcGxhY2UoL1xcdTAwMWJcXFtcXGRcXGQ/bS9nLCAnJykubGVuZ3RoICsgMTtcbiAgfSwgMCk7XG5cbiAgaWYgKGxlbmd0aCA+IDYwKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArXG4gICAgICAgICAgIChiYXNlID09PSAnJyA/ICcnIDogYmFzZSArICdcXG4gJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBvdXRwdXQuam9pbignLFxcbiAgJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBicmFjZXNbMV07XG4gIH1cblxuICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArICcgJyArIG91dHB1dC5qb2luKCcsICcpICsgJyAnICsgYnJhY2VzWzFdO1xufVxuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5mdW5jdGlvbiBpc0FycmF5KGFyKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFyKTtcbn1cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbCA9IGlzTnVsbDtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQgPSBpc051bGxPclVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmV4cG9ydHMuaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJlKSAmJiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGQpICYmIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiBpc09iamVjdChlKSAmJlxuICAgICAgKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gcmVxdWlyZSgnLi9zdXBwb3J0L2lzQnVmZmVyJyk7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cblxuXG5mdW5jdGlvbiBwYWQobikge1xuICByZXR1cm4gbiA8IDEwID8gJzAnICsgbi50b1N0cmluZygxMCkgOiBuLnRvU3RyaW5nKDEwKTtcbn1cblxuXG52YXIgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsXG4gICAgICAgICAgICAgICdPY3QnLCAnTm92JywgJ0RlYyddO1xuXG4vLyAyNiBGZWIgMTY6MTk6MzRcbmZ1bmN0aW9uIHRpbWVzdGFtcCgpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICB2YXIgdGltZSA9IFtwYWQoZC5nZXRIb3VycygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0TWludXRlcygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0U2Vjb25kcygpKV0uam9pbignOicpO1xuICByZXR1cm4gW2QuZ2V0RGF0ZSgpLCBtb250aHNbZC5nZXRNb250aCgpXSwgdGltZV0uam9pbignICcpO1xufVxuXG5cbi8vIGxvZyBpcyBqdXN0IGEgdGhpbiB3cmFwcGVyIHRvIGNvbnNvbGUubG9nIHRoYXQgcHJlcGVuZHMgYSB0aW1lc3RhbXBcbmV4cG9ydHMubG9nID0gZnVuY3Rpb24oKSB7XG4gIGNvbnNvbGUubG9nKCclcyAtICVzJywgdGltZXN0YW1wKCksIGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cykpO1xufTtcblxuXG4vKipcbiAqIEluaGVyaXQgdGhlIHByb3RvdHlwZSBtZXRob2RzIGZyb20gb25lIGNvbnN0cnVjdG9yIGludG8gYW5vdGhlci5cbiAqXG4gKiBUaGUgRnVuY3Rpb24ucHJvdG90eXBlLmluaGVyaXRzIGZyb20gbGFuZy5qcyByZXdyaXR0ZW4gYXMgYSBzdGFuZGFsb25lXG4gKiBmdW5jdGlvbiAobm90IG9uIEZ1bmN0aW9uLnByb3RvdHlwZSkuIE5PVEU6IElmIHRoaXMgZmlsZSBpcyB0byBiZSBsb2FkZWRcbiAqIGR1cmluZyBib290c3RyYXBwaW5nIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgcmV3cml0dGVuIHVzaW5nIHNvbWUgbmF0aXZlXG4gKiBmdW5jdGlvbnMgYXMgcHJvdG90eXBlIHNldHVwIHVzaW5nIG5vcm1hbCBKYXZhU2NyaXB0IGRvZXMgbm90IHdvcmsgYXNcbiAqIGV4cGVjdGVkIGR1cmluZyBib290c3RyYXBwaW5nIChzZWUgbWlycm9yLmpzIGluIHIxMTQ5MDMpLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gd2hpY2ggbmVlZHMgdG8gaW5oZXJpdCB0aGVcbiAqICAgICBwcm90b3R5cGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gdG8gaW5oZXJpdCBwcm90b3R5cGUgZnJvbS5cbiAqL1xuZXhwb3J0cy5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmV4cG9ydHMuX2V4dGVuZCA9IGZ1bmN0aW9uKG9yaWdpbiwgYWRkKSB7XG4gIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIGFkZCBpc24ndCBhbiBvYmplY3RcbiAgaWYgKCFhZGQgfHwgIWlzT2JqZWN0KGFkZCkpIHJldHVybiBvcmlnaW47XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhZGQpO1xuICB2YXIgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgb3JpZ2luW2tleXNbaV1dID0gYWRkW2tleXNbaV1dO1xuICB9XG4gIHJldHVybiBvcmlnaW47XG59O1xuXG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3V0aWwvdXRpbC5qc1xuLy8gbW9kdWxlIGlkID0gNDM4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 439 */
/***/ function(module, exports) {

    eval("module.exports = function isBuffer(arg) {\n  return arg && typeof arg === 'object'\n    && typeof arg.copy === 'function'\n    && typeof arg.fill === 'function'\n    && typeof arg.readUInt8 === 'function';\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDM5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCdWZmZXIoYXJnKSB7XG4gIHJldHVybiBhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCdcbiAgICAmJiB0eXBlb2YgYXJnLmNvcHkgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLmZpbGwgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLnJlYWRVSW50OCA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdXRpbC9zdXBwb3J0L2lzQnVmZmVyQnJvd3Nlci5qc1xuLy8gbW9kdWxlIGlkID0gNDM5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 440 */
/***/ function(module, exports) {

    eval("if (typeof Object.create === 'function') {\n  // implementation from standard node.js 'util' module\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    ctor.prototype = Object.create(superCtor.prototype, {\n      constructor: {\n        value: ctor,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n  };\n} else {\n  // old school shim for old browsers\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    var TempCtor = function () {}\n    TempCtor.prototype = superCtor.prototype\n    ctor.prototype = new TempCtor()\n    ctor.prototype.constructor = ctor\n  }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgfVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanNcbi8vIG1vZHVsZSBpZCA9IDQ0MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 441 */
/***/ function(module, exports) {

    eval("// created by @HenrikJoreteg\nvar prefix;\nvar version;\n\nif (window.mozRTCPeerConnection || navigator.mozGetUserMedia) {\n    prefix = 'moz';\n    version = parseInt(navigator.userAgent.match(/Firefox\\/([0-9]+)\\./)[1], 10);\n} else if (window.webkitRTCPeerConnection || navigator.webkitGetUserMedia) {\n    prefix = 'webkit';\n    version = navigator.userAgent.match(/Chrom(e|ium)/) && parseInt(navigator.userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./)[2], 10);\n}\n\nvar PC = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;\nvar IceCandidate = window.mozRTCIceCandidate || window.RTCIceCandidate;\nvar SessionDescription = window.mozRTCSessionDescription || window.RTCSessionDescription;\nvar MediaStream = window.webkitMediaStream || window.MediaStream;\nvar screenSharing = window.location.protocol === 'https:' &&\n    ((prefix === 'webkit' && version >= 26) ||\n     (prefix === 'moz' && version >= 33))\nvar AudioContext = window.AudioContext || window.webkitAudioContext;\nvar videoEl = document.createElement('video');\nvar supportVp8 = videoEl && videoEl.canPlayType && videoEl.canPlayType('video/webm; codecs=\"vp8\", vorbis') === \"probably\";\nvar getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.msGetUserMedia || navigator.mozGetUserMedia;\n\n// export support flags and constructors.prototype && PC\nmodule.exports = {\n    prefix: prefix,\n    browserVersion: version,\n    support: !!PC && !!getUserMedia,\n    // new support style\n    supportRTCPeerConnection: !!PC,\n    supportVp8: supportVp8,\n    supportGetUserMedia: !!getUserMedia,\n    supportDataChannel: !!(PC && PC.prototype && PC.prototype.createDataChannel),\n    supportWebAudio: !!(AudioContext && AudioContext.prototype.createMediaStreamSource),\n    supportMediaStream: !!(MediaStream && MediaStream.prototype.removeTrack),\n    supportScreenSharing: !!screenSharing,\n    // constructors\n    AudioContext: AudioContext,\n    PeerConnection: PC,\n    SessionDescription: SessionDescription,\n    IceCandidate: IceCandidate,\n    MediaStream: MediaStream,\n    getUserMedia: getUserMedia\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy93ZWJydGNzdXBwb3J0L2luZGV4LWJyb3dzZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gY3JlYXRlZCBieSBASGVucmlrSm9yZXRlZ1xudmFyIHByZWZpeDtcbnZhciB2ZXJzaW9uO1xuXG5pZiAod2luZG93Lm1velJUQ1BlZXJDb25uZWN0aW9uIHx8IG5hdmlnYXRvci5tb3pHZXRVc2VyTWVkaWEpIHtcbiAgICBwcmVmaXggPSAnbW96JztcbiAgICB2ZXJzaW9uID0gcGFyc2VJbnQobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvRmlyZWZveFxcLyhbMC05XSspXFwuLylbMV0sIDEwKTtcbn0gZWxzZSBpZiAod2luZG93LndlYmtpdFJUQ1BlZXJDb25uZWN0aW9uIHx8IG5hdmlnYXRvci53ZWJraXRHZXRVc2VyTWVkaWEpIHtcbiAgICBwcmVmaXggPSAnd2Via2l0JztcbiAgICB2ZXJzaW9uID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQ2hyb20oZXxpdW0pLykgJiYgcGFyc2VJbnQobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQ2hyb20oZXxpdW0pXFwvKFswLTldKylcXC4vKVsyXSwgMTApO1xufVxuXG52YXIgUEMgPSB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24gfHwgd2luZG93Lm1velJUQ1BlZXJDb25uZWN0aW9uIHx8IHdpbmRvdy53ZWJraXRSVENQZWVyQ29ubmVjdGlvbjtcbnZhciBJY2VDYW5kaWRhdGUgPSB3aW5kb3cubW96UlRDSWNlQ2FuZGlkYXRlIHx8IHdpbmRvdy5SVENJY2VDYW5kaWRhdGU7XG52YXIgU2Vzc2lvbkRlc2NyaXB0aW9uID0gd2luZG93Lm1velJUQ1Nlc3Npb25EZXNjcmlwdGlvbiB8fCB3aW5kb3cuUlRDU2Vzc2lvbkRlc2NyaXB0aW9uO1xudmFyIE1lZGlhU3RyZWFtID0gd2luZG93LndlYmtpdE1lZGlhU3RyZWFtIHx8IHdpbmRvdy5NZWRpYVN0cmVhbTtcbnZhciBzY3JlZW5TaGFyaW5nID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JyAmJlxuICAgICgocHJlZml4ID09PSAnd2Via2l0JyAmJiB2ZXJzaW9uID49IDI2KSB8fFxuICAgICAocHJlZml4ID09PSAnbW96JyAmJiB2ZXJzaW9uID49IDMzKSlcbnZhciBBdWRpb0NvbnRleHQgPSB3aW5kb3cuQXVkaW9Db250ZXh0IHx8IHdpbmRvdy53ZWJraXRBdWRpb0NvbnRleHQ7XG52YXIgdmlkZW9FbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG52YXIgc3VwcG9ydFZwOCA9IHZpZGVvRWwgJiYgdmlkZW9FbC5jYW5QbGF5VHlwZSAmJiB2aWRlb0VsLmNhblBsYXlUeXBlKCd2aWRlby93ZWJtOyBjb2RlY3M9XCJ2cDhcIiwgdm9yYmlzJykgPT09IFwicHJvYmFibHlcIjtcbnZhciBnZXRVc2VyTWVkaWEgPSBuYXZpZ2F0b3IuZ2V0VXNlck1lZGlhIHx8IG5hdmlnYXRvci53ZWJraXRHZXRVc2VyTWVkaWEgfHwgbmF2aWdhdG9yLm1zR2V0VXNlck1lZGlhIHx8IG5hdmlnYXRvci5tb3pHZXRVc2VyTWVkaWE7XG5cbi8vIGV4cG9ydCBzdXBwb3J0IGZsYWdzIGFuZCBjb25zdHJ1Y3RvcnMucHJvdG90eXBlICYmIFBDXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBwcmVmaXg6IHByZWZpeCxcbiAgICBicm93c2VyVmVyc2lvbjogdmVyc2lvbixcbiAgICBzdXBwb3J0OiAhIVBDICYmICEhZ2V0VXNlck1lZGlhLFxuICAgIC8vIG5ldyBzdXBwb3J0IHN0eWxlXG4gICAgc3VwcG9ydFJUQ1BlZXJDb25uZWN0aW9uOiAhIVBDLFxuICAgIHN1cHBvcnRWcDg6IHN1cHBvcnRWcDgsXG4gICAgc3VwcG9ydEdldFVzZXJNZWRpYTogISFnZXRVc2VyTWVkaWEsXG4gICAgc3VwcG9ydERhdGFDaGFubmVsOiAhIShQQyAmJiBQQy5wcm90b3R5cGUgJiYgUEMucHJvdG90eXBlLmNyZWF0ZURhdGFDaGFubmVsKSxcbiAgICBzdXBwb3J0V2ViQXVkaW86ICEhKEF1ZGlvQ29udGV4dCAmJiBBdWRpb0NvbnRleHQucHJvdG90eXBlLmNyZWF0ZU1lZGlhU3RyZWFtU291cmNlKSxcbiAgICBzdXBwb3J0TWVkaWFTdHJlYW06ICEhKE1lZGlhU3RyZWFtICYmIE1lZGlhU3RyZWFtLnByb3RvdHlwZS5yZW1vdmVUcmFjayksXG4gICAgc3VwcG9ydFNjcmVlblNoYXJpbmc6ICEhc2NyZWVuU2hhcmluZyxcbiAgICAvLyBjb25zdHJ1Y3RvcnNcbiAgICBBdWRpb0NvbnRleHQ6IEF1ZGlvQ29udGV4dCxcbiAgICBQZWVyQ29ubmVjdGlvbjogUEMsXG4gICAgU2Vzc2lvbkRlc2NyaXB0aW9uOiBTZXNzaW9uRGVzY3JpcHRpb24sXG4gICAgSWNlQ2FuZGlkYXRlOiBJY2VDYW5kaWRhdGUsXG4gICAgTWVkaWFTdHJlYW06IE1lZGlhU3RyZWFtLFxuICAgIGdldFVzZXJNZWRpYTogZ2V0VXNlck1lZGlhXG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3dlYnJ0Y3N1cHBvcnQvaW5kZXgtYnJvd3Nlci5qc1xuLy8gbW9kdWxlIGlkID0gNDQxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 442 */
/***/ function(module, exports) {

    eval("var methods = \"assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,time,timeEnd,trace,warn\".split(\",\");\nvar l = methods.length;\nvar fn = function () {};\nvar mockconsole = {};\n\nwhile (l--) {\n    mockconsole[methods[l]] = fn;\n}\n\nmodule.exports = mockconsole;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9tb2NrY29uc29sZS9tb2NrY29uc29sZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgbWV0aG9kcyA9IFwiYXNzZXJ0LGNvdW50LGRlYnVnLGRpcixkaXJ4bWwsZXJyb3IsZXhjZXB0aW9uLGdyb3VwLGdyb3VwQ29sbGFwc2VkLGdyb3VwRW5kLGluZm8sbG9nLG1hcmtUaW1lbGluZSxwcm9maWxlLHByb2ZpbGVFbmQsdGltZSx0aW1lRW5kLHRyYWNlLHdhcm5cIi5zcGxpdChcIixcIik7XG52YXIgbCA9IG1ldGhvZHMubGVuZ3RoO1xudmFyIGZuID0gZnVuY3Rpb24gKCkge307XG52YXIgbW9ja2NvbnNvbGUgPSB7fTtcblxud2hpbGUgKGwtLSkge1xuICAgIG1vY2tjb25zb2xlW21ldGhvZHNbbF1dID0gZm47XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbW9ja2NvbnNvbGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbW9ja2NvbnNvbGUvbW9ja2NvbnNvbGUuanNcbi8vIG1vZHVsZSBpZCA9IDQ0MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 443 */
/***/ function(module, exports, __webpack_require__) {

    eval("var util = __webpack_require__(438);\nvar hark = __webpack_require__(444);\nvar webrtcSupport = __webpack_require__(441);\nvar getUserMedia = __webpack_require__(446);\nvar getScreenMedia = __webpack_require__(457);\nvar WildEmitter = __webpack_require__(445);\nvar GainController = __webpack_require__(468);\nvar mockconsole = __webpack_require__(442);\n\n\nfunction isAllTracksEnded(stream) {\n    var isAllTracksEnded = true;\n    stream.getTracks().forEach(function (t) {\n        isAllTracksEnded = t.readyState === 'ended' && isAllTracksEnded;\n    });\n    return isAllTracksEnded;\n}\n\nfunction LocalMedia(opts) {\n    WildEmitter.call(this);\n\n    var config = this.config = {\n        autoAdjustMic: false,\n        detectSpeakingEvents: false,\n        audioFallback: false,\n        media: {\n            audio: true,\n            video: true\n        },\n        logger: mockconsole\n    };\n\n    var item;\n    for (item in opts) {\n        if (opts.hasOwnProperty(item)) {\n            this.config[item] = opts[item];\n        }\n    }\n\n    this.logger = config.logger;\n    this._log = this.logger.log.bind(this.logger, 'LocalMedia:');\n    this._logerror = this.logger.error.bind(this.logger, 'LocalMedia:');\n\n    this.screenSharingSupport = webrtcSupport.supportScreenSharing;\n\n    this.localStreams = [];\n    this.localScreens = [];\n\n    if (!webrtcSupport.supportGetUserMedia) {\n        this._logerror('Your browser does not support local media capture.');\n    }\n}\n\nutil.inherits(LocalMedia, WildEmitter);\n\n\nLocalMedia.prototype.start = function (mediaConstraints, cb) {\n    var self = this;\n    var constraints = mediaConstraints || this.config.media;\n\n    getUserMedia(constraints, function (err, stream) {\n\n        if (!err) {\n            if (constraints.audio && self.config.detectSpeakingEvents) {\n                self.setupAudioMonitor(stream, self.config.harkOptions);\n            }\n            self.localStreams.push(stream);\n\n            if (self.config.autoAdjustMic) {\n                self.gainController = new GainController(stream);\n                // start out somewhat muted if we can track audio\n                self.setMicIfEnabled(0.5);\n            }\n\n            stream.getTracks().forEach(function (track) {\n                track.addEventListener('ended', function () {\n                    if (isAllTracksEnded(stream)) {\n                        var idx = self.localStreams.indexOf(stream);\n                        if (idx > -1) {\n                            self.localStreams.splice(idx, 1);\n                            self.emit('localStreamStopped', stream);\n                        }\n                    }\n                });\n            });\n\n            self.emit('localStream', stream);\n        } else {\n            // Fallback for users without a camera\n            if (self.config.audioFallback && err.name === 'DevicesNotFoundError' && constraints.video !== false) {\n                constraints.video = false;\n                self.start(constraints, cb);\n                return;\n            }\n        }\n        if (cb) {\n            return cb(err, stream);\n        }\n    });\n};\n\nLocalMedia.prototype.stop = function (stream) {\n    // FIXME: duplicates cleanup code until fixed in FF\n    if (stream) {\n        stream.getTracks().forEach(function (track) { track.stop(); });\n        var idx = this.localStreams.indexOf(stream);\n        if (idx > -1) {\n            if (webrtcSupport.prefix === 'moz') {\n                this.emit('localStreamStopped', stream);\n            }\n            this.localStreams.splice(idx, 1);\n        } else {\n            idx = this.localScreens.indexOf(stream);\n            if (idx > -1) {\n                if (webrtcSupport.prefix === 'moz') {\n                    this.emit('localScreenStopped', stream);\n                }\n                this.localScreens.splice(idx, 1);\n            }\n        }\n    } else {\n        this.stopStreams();\n        this.stopScreenShare();\n    }\n};\n\nLocalMedia.prototype.stopStreams = function () {\n    var self = this;\n    if (this.audioMonitor) {\n        this.audioMonitor.stop();\n        delete this.audioMonitor;\n    }\n    this.localStreams.forEach(function (stream) {\n        stream.getTracks().forEach(function (track) { track.stop(); });\n        if (webrtcSupport.prefix === 'moz') {\n            self.emit('localStreamStopped', stream);\n        }\n    });\n    this.localStreams = [];\n};\n\nLocalMedia.prototype.startScreenShare = function (cb) {\n    var self = this;\n    getScreenMedia(function (err, stream) {\n        if (!err) {\n            self.localScreens.push(stream);\n\n            stream.getTracks().forEach(function (track) {\n                track.addEventListener('ended', function () {\n                    if (isAllTracksEnded(stream)) {\n                        var idx = self.localScreens.indexOf(stream);\n                        if (idx > -1) {\n                            self.localScreens.splice(idx, 1);\n                            self.emit('localScreenStopped', stream);\n                        }\n                    }\n                });\n            });\n\n            self.emit('localScreen', stream);\n        }\n\n        // enable the callback\n        if (cb) {\n            return cb(err, stream);\n        }\n    });\n};\n\nLocalMedia.prototype.stopScreenShare = function (stream) {\n    var self = this;\n    if (stream) {\n        stream.getTracks().forEach(function (track) { track.stop(); });\n        var idx = this.localScreens.indexOf(stream);\n        if (idx > -1) {\n            if (webrtcSupport.prefix === 'moz') {\n                this.emit('localScreenStopped', stream);\n            }\n            this.localScreens.splice(idx, 1);\n        }\n    } else {\n        this.localScreens.forEach(function (stream) {\n            stream.getTracks().forEach(function (track) { track.stop(); });\n            if (webrtcSupport.prefix === 'moz') {\n                self.emit('localScreenStopped', stream);\n            }\n        });\n        this.localScreens = [];\n    }\n};\n\n// Audio controls\nLocalMedia.prototype.mute = function () {\n    this._audioEnabled(false);\n    this.hardMuted = true;\n    this.emit('audioOff');\n};\n\nLocalMedia.prototype.unmute = function () {\n    this._audioEnabled(true);\n    this.hardMuted = false;\n    this.emit('audioOn');\n};\n\nLocalMedia.prototype.setupAudioMonitor = function (stream, harkOptions) {\n    this._log('Setup audio');\n    var audio = this.audioMonitor = hark(stream, harkOptions);\n    var self = this;\n    var timeout;\n\n    audio.on('speaking', function () {\n        self.emit('speaking');\n        if (self.hardMuted) {\n            return;\n        }\n        self.setMicIfEnabled(1);\n    });\n\n    audio.on('stopped_speaking', function () {\n        if (timeout) {\n            clearTimeout(timeout);\n        }\n\n        timeout = setTimeout(function () {\n            self.emit('stoppedSpeaking');\n            if (self.hardMuted) {\n                return;\n            }\n            self.setMicIfEnabled(0.5);\n        }, 1000);\n    });\n    audio.on('volume_change', function (volume, treshold) {\n        self.emit('volumeChange', volume, treshold);\n    });\n};\n\n// We do this as a seperate method in order to\n// still leave the \"setMicVolume\" as a working\n// method.\nLocalMedia.prototype.setMicIfEnabled = function (volume) {\n    if (!this.config.autoAdjustMic) {\n        return;\n    }\n    this.gainController.setGain(volume);\n};\n\n// Video controls\nLocalMedia.prototype.pauseVideo = function () {\n    this._videoEnabled(false);\n    this.emit('videoOff');\n};\nLocalMedia.prototype.resumeVideo = function () {\n    this._videoEnabled(true);\n    this.emit('videoOn');\n};\n\n// Combined controls\nLocalMedia.prototype.pause = function () {\n    this.mute();\n    this.pauseVideo();\n};\nLocalMedia.prototype.resume = function () {\n    this.unmute();\n    this.resumeVideo();\n};\n\n// Internal methods for enabling/disabling audio/video\nLocalMedia.prototype._audioEnabled = function (bool) {\n    // work around for chrome 27 bug where disabling tracks\n    // doesn't seem to work (works in canary, remove when working)\n    this.setMicIfEnabled(bool ? 1 : 0);\n    this.localStreams.forEach(function (stream) {\n        stream.getAudioTracks().forEach(function (track) {\n            track.enabled = !!bool;\n        });\n    });\n};\nLocalMedia.prototype._videoEnabled = function (bool) {\n    this.localStreams.forEach(function (stream) {\n        stream.getVideoTracks().forEach(function (track) {\n            track.enabled = !!bool;\n        });\n    });\n};\n\n// check if all audio streams are enabled\nLocalMedia.prototype.isAudioEnabled = function () {\n    var enabled = true;\n    this.localStreams.forEach(function (stream) {\n        stream.getAudioTracks().forEach(function (track) {\n            enabled = enabled && track.enabled;\n        });\n    });\n    return enabled;\n};\n\n// check if all video streams are enabled\nLocalMedia.prototype.isVideoEnabled = function () {\n    var enabled = true;\n    this.localStreams.forEach(function (stream) {\n        stream.getVideoTracks().forEach(function (track) {\n            enabled = enabled && track.enabled;\n        });\n    });\n    return enabled;\n};\n\n// Backwards Compat\nLocalMedia.prototype.startLocalMedia = LocalMedia.prototype.start;\nLocalMedia.prototype.stopLocalMedia = LocalMedia.prototype.stop;\n\n// fallback for old .localStream behaviour\nObject.defineProperty(LocalMedia.prototype, 'localStream', {\n    get: function () {\n        return this.localStreams.length > 0 ? this.localStreams[0] : null;\n    }\n});\n// fallback for old .localScreen behaviour\nObject.defineProperty(LocalMedia.prototype, 'localScreen', {\n    get: function () {\n        return this.localScreens.length > 0 ? this.localScreens[0] : null;\n    }\n});\n\nmodule.exports = LocalMedia;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2NhbG1lZGlhL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xudmFyIGhhcmsgPSByZXF1aXJlKCdoYXJrJyk7XG52YXIgd2VicnRjU3VwcG9ydCA9IHJlcXVpcmUoJ3dlYnJ0Y3N1cHBvcnQnKTtcbnZhciBnZXRVc2VyTWVkaWEgPSByZXF1aXJlKCdnZXR1c2VybWVkaWEnKTtcbnZhciBnZXRTY3JlZW5NZWRpYSA9IHJlcXVpcmUoJ2dldHNjcmVlbm1lZGlhJyk7XG52YXIgV2lsZEVtaXR0ZXIgPSByZXF1aXJlKCd3aWxkZW1pdHRlcicpO1xudmFyIEdhaW5Db250cm9sbGVyID0gcmVxdWlyZSgnbWVkaWFzdHJlYW0tZ2FpbicpO1xudmFyIG1vY2tjb25zb2xlID0gcmVxdWlyZSgnbW9ja2NvbnNvbGUnKTtcblxuXG5mdW5jdGlvbiBpc0FsbFRyYWNrc0VuZGVkKHN0cmVhbSkge1xuICAgIHZhciBpc0FsbFRyYWNrc0VuZGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICBpc0FsbFRyYWNrc0VuZGVkID0gdC5yZWFkeVN0YXRlID09PSAnZW5kZWQnICYmIGlzQWxsVHJhY2tzRW5kZWQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIGlzQWxsVHJhY2tzRW5kZWQ7XG59XG5cbmZ1bmN0aW9uIExvY2FsTWVkaWEob3B0cykge1xuICAgIFdpbGRFbWl0dGVyLmNhbGwodGhpcyk7XG5cbiAgICB2YXIgY29uZmlnID0gdGhpcy5jb25maWcgPSB7XG4gICAgICAgIGF1dG9BZGp1c3RNaWM6IGZhbHNlLFxuICAgICAgICBkZXRlY3RTcGVha2luZ0V2ZW50czogZmFsc2UsXG4gICAgICAgIGF1ZGlvRmFsbGJhY2s6IGZhbHNlLFxuICAgICAgICBtZWRpYToge1xuICAgICAgICAgICAgYXVkaW86IHRydWUsXG4gICAgICAgICAgICB2aWRlbzogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBsb2dnZXI6IG1vY2tjb25zb2xlXG4gICAgfTtcblxuICAgIHZhciBpdGVtO1xuICAgIGZvciAoaXRlbSBpbiBvcHRzKSB7XG4gICAgICAgIGlmIChvcHRzLmhhc093blByb3BlcnR5KGl0ZW0pKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ1tpdGVtXSA9IG9wdHNbaXRlbV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxvZ2dlciA9IGNvbmZpZy5sb2dnZXI7XG4gICAgdGhpcy5fbG9nID0gdGhpcy5sb2dnZXIubG9nLmJpbmQodGhpcy5sb2dnZXIsICdMb2NhbE1lZGlhOicpO1xuICAgIHRoaXMuX2xvZ2Vycm9yID0gdGhpcy5sb2dnZXIuZXJyb3IuYmluZCh0aGlzLmxvZ2dlciwgJ0xvY2FsTWVkaWE6Jyk7XG5cbiAgICB0aGlzLnNjcmVlblNoYXJpbmdTdXBwb3J0ID0gd2VicnRjU3VwcG9ydC5zdXBwb3J0U2NyZWVuU2hhcmluZztcblxuICAgIHRoaXMubG9jYWxTdHJlYW1zID0gW107XG4gICAgdGhpcy5sb2NhbFNjcmVlbnMgPSBbXTtcblxuICAgIGlmICghd2VicnRjU3VwcG9ydC5zdXBwb3J0R2V0VXNlck1lZGlhKSB7XG4gICAgICAgIHRoaXMuX2xvZ2Vycm9yKCdZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBsb2NhbCBtZWRpYSBjYXB0dXJlLicpO1xuICAgIH1cbn1cblxudXRpbC5pbmhlcml0cyhMb2NhbE1lZGlhLCBXaWxkRW1pdHRlcik7XG5cblxuTG9jYWxNZWRpYS5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAobWVkaWFDb25zdHJhaW50cywgY2IpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGNvbnN0cmFpbnRzID0gbWVkaWFDb25zdHJhaW50cyB8fCB0aGlzLmNvbmZpZy5tZWRpYTtcblxuICAgIGdldFVzZXJNZWRpYShjb25zdHJhaW50cywgZnVuY3Rpb24gKGVyciwgc3RyZWFtKSB7XG5cbiAgICAgICAgaWYgKCFlcnIpIHtcbiAgICAgICAgICAgIGlmIChjb25zdHJhaW50cy5hdWRpbyAmJiBzZWxmLmNvbmZpZy5kZXRlY3RTcGVha2luZ0V2ZW50cykge1xuICAgICAgICAgICAgICAgIHNlbGYuc2V0dXBBdWRpb01vbml0b3Ioc3RyZWFtLCBzZWxmLmNvbmZpZy5oYXJrT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxmLmxvY2FsU3RyZWFtcy5wdXNoKHN0cmVhbSk7XG5cbiAgICAgICAgICAgIGlmIChzZWxmLmNvbmZpZy5hdXRvQWRqdXN0TWljKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5nYWluQ29udHJvbGxlciA9IG5ldyBHYWluQ29udHJvbGxlcihzdHJlYW0pO1xuICAgICAgICAgICAgICAgIC8vIHN0YXJ0IG91dCBzb21ld2hhdCBtdXRlZCBpZiB3ZSBjYW4gdHJhY2sgYXVkaW9cbiAgICAgICAgICAgICAgICBzZWxmLnNldE1pY0lmRW5hYmxlZCgwLjUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaChmdW5jdGlvbiAodHJhY2spIHtcbiAgICAgICAgICAgICAgICB0cmFjay5hZGRFdmVudExpc3RlbmVyKCdlbmRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQWxsVHJhY2tzRW5kZWQoc3RyZWFtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkeCA9IHNlbGYubG9jYWxTdHJlYW1zLmluZGV4T2Yoc3RyZWFtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9jYWxTdHJlYW1zLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnbG9jYWxTdHJlYW1TdG9wcGVkJywgc3RyZWFtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHNlbGYuZW1pdCgnbG9jYWxTdHJlYW0nLCBzdHJlYW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2sgZm9yIHVzZXJzIHdpdGhvdXQgYSBjYW1lcmFcbiAgICAgICAgICAgIGlmIChzZWxmLmNvbmZpZy5hdWRpb0ZhbGxiYWNrICYmIGVyci5uYW1lID09PSAnRGV2aWNlc05vdEZvdW5kRXJyb3InICYmIGNvbnN0cmFpbnRzLnZpZGVvICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzLnZpZGVvID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgc2VsZi5zdGFydChjb25zdHJhaW50cywgY2IpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY2IpIHtcbiAgICAgICAgICAgIHJldHVybiBjYihlcnIsIHN0cmVhbSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5cbkxvY2FsTWVkaWEucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gICAgLy8gRklYTUU6IGR1cGxpY2F0ZXMgY2xlYW51cCBjb2RlIHVudGlsIGZpeGVkIGluIEZGXG4gICAgaWYgKHN0cmVhbSkge1xuICAgICAgICBzdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaChmdW5jdGlvbiAodHJhY2spIHsgdHJhY2suc3RvcCgpOyB9KTtcbiAgICAgICAgdmFyIGlkeCA9IHRoaXMubG9jYWxTdHJlYW1zLmluZGV4T2Yoc3RyZWFtKTtcbiAgICAgICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgICAgICAgICBpZiAod2VicnRjU3VwcG9ydC5wcmVmaXggPT09ICdtb3onKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdsb2NhbFN0cmVhbVN0b3BwZWQnLCBzdHJlYW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sb2NhbFN0cmVhbXMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZHggPSB0aGlzLmxvY2FsU2NyZWVucy5pbmRleE9mKHN0cmVhbSk7XG4gICAgICAgICAgICBpZiAoaWR4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAod2VicnRjU3VwcG9ydC5wcmVmaXggPT09ICdtb3onKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnbG9jYWxTY3JlZW5TdG9wcGVkJywgc3RyZWFtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhbFNjcmVlbnMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0b3BTdHJlYW1zKCk7XG4gICAgICAgIHRoaXMuc3RvcFNjcmVlblNoYXJlKCk7XG4gICAgfVxufTtcblxuTG9jYWxNZWRpYS5wcm90b3R5cGUuc3RvcFN0cmVhbXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmICh0aGlzLmF1ZGlvTW9uaXRvcikge1xuICAgICAgICB0aGlzLmF1ZGlvTW9uaXRvci5zdG9wKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmF1ZGlvTW9uaXRvcjtcbiAgICB9XG4gICAgdGhpcy5sb2NhbFN0cmVhbXMuZm9yRWFjaChmdW5jdGlvbiAoc3RyZWFtKSB7XG4gICAgICAgIHN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKGZ1bmN0aW9uICh0cmFjaykgeyB0cmFjay5zdG9wKCk7IH0pO1xuICAgICAgICBpZiAod2VicnRjU3VwcG9ydC5wcmVmaXggPT09ICdtb3onKSB7XG4gICAgICAgICAgICBzZWxmLmVtaXQoJ2xvY2FsU3RyZWFtU3RvcHBlZCcsIHN0cmVhbSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmxvY2FsU3RyZWFtcyA9IFtdO1xufTtcblxuTG9jYWxNZWRpYS5wcm90b3R5cGUuc3RhcnRTY3JlZW5TaGFyZSA9IGZ1bmN0aW9uIChjYikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBnZXRTY3JlZW5NZWRpYShmdW5jdGlvbiAoZXJyLCBzdHJlYW0pIHtcbiAgICAgICAgaWYgKCFlcnIpIHtcbiAgICAgICAgICAgIHNlbGYubG9jYWxTY3JlZW5zLnB1c2goc3RyZWFtKTtcblxuICAgICAgICAgICAgc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goZnVuY3Rpb24gKHRyYWNrKSB7XG4gICAgICAgICAgICAgICAgdHJhY2suYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FsbFRyYWNrc0VuZGVkKHN0cmVhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZHggPSBzZWxmLmxvY2FsU2NyZWVucy5pbmRleE9mKHN0cmVhbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvY2FsU2NyZWVucy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ2xvY2FsU2NyZWVuU3RvcHBlZCcsIHN0cmVhbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzZWxmLmVtaXQoJ2xvY2FsU2NyZWVuJywgc3RyZWFtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVuYWJsZSB0aGUgY2FsbGJhY2tcbiAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgICByZXR1cm4gY2IoZXJyLCBzdHJlYW0pO1xuICAgICAgICB9XG4gICAgfSk7XG59O1xuXG5Mb2NhbE1lZGlhLnByb3RvdHlwZS5zdG9wU2NyZWVuU2hhcmUgPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzdHJlYW0pIHtcbiAgICAgICAgc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goZnVuY3Rpb24gKHRyYWNrKSB7IHRyYWNrLnN0b3AoKTsgfSk7XG4gICAgICAgIHZhciBpZHggPSB0aGlzLmxvY2FsU2NyZWVucy5pbmRleE9mKHN0cmVhbSk7XG4gICAgICAgIGlmIChpZHggPiAtMSkge1xuICAgICAgICAgICAgaWYgKHdlYnJ0Y1N1cHBvcnQucHJlZml4ID09PSAnbW96Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnbG9jYWxTY3JlZW5TdG9wcGVkJywgc3RyZWFtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9jYWxTY3JlZW5zLnNwbGljZShpZHgsIDEpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2NhbFNjcmVlbnMuZm9yRWFjaChmdW5jdGlvbiAoc3RyZWFtKSB7XG4gICAgICAgICAgICBzdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaChmdW5jdGlvbiAodHJhY2spIHsgdHJhY2suc3RvcCgpOyB9KTtcbiAgICAgICAgICAgIGlmICh3ZWJydGNTdXBwb3J0LnByZWZpeCA9PT0gJ21veicpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ2xvY2FsU2NyZWVuU3RvcHBlZCcsIHN0cmVhbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmxvY2FsU2NyZWVucyA9IFtdO1xuICAgIH1cbn07XG5cbi8vIEF1ZGlvIGNvbnRyb2xzXG5Mb2NhbE1lZGlhLnByb3RvdHlwZS5tdXRlID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX2F1ZGlvRW5hYmxlZChmYWxzZSk7XG4gICAgdGhpcy5oYXJkTXV0ZWQgPSB0cnVlO1xuICAgIHRoaXMuZW1pdCgnYXVkaW9PZmYnKTtcbn07XG5cbkxvY2FsTWVkaWEucHJvdG90eXBlLnVubXV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9hdWRpb0VuYWJsZWQodHJ1ZSk7XG4gICAgdGhpcy5oYXJkTXV0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ2F1ZGlvT24nKTtcbn07XG5cbkxvY2FsTWVkaWEucHJvdG90eXBlLnNldHVwQXVkaW9Nb25pdG9yID0gZnVuY3Rpb24gKHN0cmVhbSwgaGFya09wdGlvbnMpIHtcbiAgICB0aGlzLl9sb2coJ1NldHVwIGF1ZGlvJyk7XG4gICAgdmFyIGF1ZGlvID0gdGhpcy5hdWRpb01vbml0b3IgPSBoYXJrKHN0cmVhbSwgaGFya09wdGlvbnMpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgdGltZW91dDtcblxuICAgIGF1ZGlvLm9uKCdzcGVha2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5lbWl0KCdzcGVha2luZycpO1xuICAgICAgICBpZiAoc2VsZi5oYXJkTXV0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZWxmLnNldE1pY0lmRW5hYmxlZCgxKTtcbiAgICB9KTtcblxuICAgIGF1ZGlvLm9uKCdzdG9wcGVkX3NwZWFraW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGltZW91dCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5lbWl0KCdzdG9wcGVkU3BlYWtpbmcnKTtcbiAgICAgICAgICAgIGlmIChzZWxmLmhhcmRNdXRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGYuc2V0TWljSWZFbmFibGVkKDAuNSk7XG4gICAgICAgIH0sIDEwMDApO1xuICAgIH0pO1xuICAgIGF1ZGlvLm9uKCd2b2x1bWVfY2hhbmdlJywgZnVuY3Rpb24gKHZvbHVtZSwgdHJlc2hvbGQpIHtcbiAgICAgICAgc2VsZi5lbWl0KCd2b2x1bWVDaGFuZ2UnLCB2b2x1bWUsIHRyZXNob2xkKTtcbiAgICB9KTtcbn07XG5cbi8vIFdlIGRvIHRoaXMgYXMgYSBzZXBlcmF0ZSBtZXRob2QgaW4gb3JkZXIgdG9cbi8vIHN0aWxsIGxlYXZlIHRoZSBcInNldE1pY1ZvbHVtZVwiIGFzIGEgd29ya2luZ1xuLy8gbWV0aG9kLlxuTG9jYWxNZWRpYS5wcm90b3R5cGUuc2V0TWljSWZFbmFibGVkID0gZnVuY3Rpb24gKHZvbHVtZSkge1xuICAgIGlmICghdGhpcy5jb25maWcuYXV0b0FkanVzdE1pYykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZ2FpbkNvbnRyb2xsZXIuc2V0R2Fpbih2b2x1bWUpO1xufTtcblxuLy8gVmlkZW8gY29udHJvbHNcbkxvY2FsTWVkaWEucHJvdG90eXBlLnBhdXNlVmlkZW8gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fdmlkZW9FbmFibGVkKGZhbHNlKTtcbiAgICB0aGlzLmVtaXQoJ3ZpZGVvT2ZmJyk7XG59O1xuTG9jYWxNZWRpYS5wcm90b3R5cGUucmVzdW1lVmlkZW8gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fdmlkZW9FbmFibGVkKHRydWUpO1xuICAgIHRoaXMuZW1pdCgndmlkZW9PbicpO1xufTtcblxuLy8gQ29tYmluZWQgY29udHJvbHNcbkxvY2FsTWVkaWEucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMubXV0ZSgpO1xuICAgIHRoaXMucGF1c2VWaWRlbygpO1xufTtcbkxvY2FsTWVkaWEucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnVubXV0ZSgpO1xuICAgIHRoaXMucmVzdW1lVmlkZW8oKTtcbn07XG5cbi8vIEludGVybmFsIG1ldGhvZHMgZm9yIGVuYWJsaW5nL2Rpc2FibGluZyBhdWRpby92aWRlb1xuTG9jYWxNZWRpYS5wcm90b3R5cGUuX2F1ZGlvRW5hYmxlZCA9IGZ1bmN0aW9uIChib29sKSB7XG4gICAgLy8gd29yayBhcm91bmQgZm9yIGNocm9tZSAyNyBidWcgd2hlcmUgZGlzYWJsaW5nIHRyYWNrc1xuICAgIC8vIGRvZXNuJ3Qgc2VlbSB0byB3b3JrICh3b3JrcyBpbiBjYW5hcnksIHJlbW92ZSB3aGVuIHdvcmtpbmcpXG4gICAgdGhpcy5zZXRNaWNJZkVuYWJsZWQoYm9vbCA/IDEgOiAwKTtcbiAgICB0aGlzLmxvY2FsU3RyZWFtcy5mb3JFYWNoKGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgICAgICAgc3RyZWFtLmdldEF1ZGlvVHJhY2tzKCkuZm9yRWFjaChmdW5jdGlvbiAodHJhY2spIHtcbiAgICAgICAgICAgIHRyYWNrLmVuYWJsZWQgPSAhIWJvb2w7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcbkxvY2FsTWVkaWEucHJvdG90eXBlLl92aWRlb0VuYWJsZWQgPSBmdW5jdGlvbiAoYm9vbCkge1xuICAgIHRoaXMubG9jYWxTdHJlYW1zLmZvckVhY2goZnVuY3Rpb24gKHN0cmVhbSkge1xuICAgICAgICBzdHJlYW0uZ2V0VmlkZW9UcmFja3MoKS5mb3JFYWNoKGZ1bmN0aW9uICh0cmFjaykge1xuICAgICAgICAgICAgdHJhY2suZW5hYmxlZCA9ICEhYm9vbDtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG4vLyBjaGVjayBpZiBhbGwgYXVkaW8gc3RyZWFtcyBhcmUgZW5hYmxlZFxuTG9jYWxNZWRpYS5wcm90b3R5cGUuaXNBdWRpb0VuYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVuYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMubG9jYWxTdHJlYW1zLmZvckVhY2goZnVuY3Rpb24gKHN0cmVhbSkge1xuICAgICAgICBzdHJlYW0uZ2V0QXVkaW9UcmFja3MoKS5mb3JFYWNoKGZ1bmN0aW9uICh0cmFjaykge1xuICAgICAgICAgICAgZW5hYmxlZCA9IGVuYWJsZWQgJiYgdHJhY2suZW5hYmxlZDtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGVuYWJsZWQ7XG59O1xuXG4vLyBjaGVjayBpZiBhbGwgdmlkZW8gc3RyZWFtcyBhcmUgZW5hYmxlZFxuTG9jYWxNZWRpYS5wcm90b3R5cGUuaXNWaWRlb0VuYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVuYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMubG9jYWxTdHJlYW1zLmZvckVhY2goZnVuY3Rpb24gKHN0cmVhbSkge1xuICAgICAgICBzdHJlYW0uZ2V0VmlkZW9UcmFja3MoKS5mb3JFYWNoKGZ1bmN0aW9uICh0cmFjaykge1xuICAgICAgICAgICAgZW5hYmxlZCA9IGVuYWJsZWQgJiYgdHJhY2suZW5hYmxlZDtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGVuYWJsZWQ7XG59O1xuXG4vLyBCYWNrd2FyZHMgQ29tcGF0XG5Mb2NhbE1lZGlhLnByb3RvdHlwZS5zdGFydExvY2FsTWVkaWEgPSBMb2NhbE1lZGlhLnByb3RvdHlwZS5zdGFydDtcbkxvY2FsTWVkaWEucHJvdG90eXBlLnN0b3BMb2NhbE1lZGlhID0gTG9jYWxNZWRpYS5wcm90b3R5cGUuc3RvcDtcblxuLy8gZmFsbGJhY2sgZm9yIG9sZCAubG9jYWxTdHJlYW0gYmVoYXZpb3VyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoTG9jYWxNZWRpYS5wcm90b3R5cGUsICdsb2NhbFN0cmVhbScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxTdHJlYW1zLmxlbmd0aCA+IDAgPyB0aGlzLmxvY2FsU3RyZWFtc1swXSA6IG51bGw7XG4gICAgfVxufSk7XG4vLyBmYWxsYmFjayBmb3Igb2xkIC5sb2NhbFNjcmVlbiBiZWhhdmlvdXJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShMb2NhbE1lZGlhLnByb3RvdHlwZSwgJ2xvY2FsU2NyZWVuJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbFNjcmVlbnMubGVuZ3RoID4gMCA/IHRoaXMubG9jYWxTY3JlZW5zWzBdIDogbnVsbDtcbiAgICB9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBMb2NhbE1lZGlhO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvY2FsbWVkaWEvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDQ0M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 444 */
/***/ function(module, exports, __webpack_require__) {

    eval("var WildEmitter = __webpack_require__(445);\n\nfunction getMaxVolume (analyser, fftBins) {\n  var maxVolume = -Infinity;\n  analyser.getFloatFrequencyData(fftBins);\n\n  for(var i=4, ii=fftBins.length; i < ii; i++) {\n    if (fftBins[i] > maxVolume && fftBins[i] < 0) {\n      maxVolume = fftBins[i];\n    }\n  };\n\n  return maxVolume;\n}\n\n\nvar audioContextType;\nif (typeof window !== 'undefined') {\n  audioContextType = window.AudioContext || window.webkitAudioContext;\n}\n// use a single audio context due to hardware limits\nvar audioContext = null;\nmodule.exports = function(stream, options) {\n  var harker = new WildEmitter();\n\n\n  // make it not break in non-supported browsers\n  if (!audioContextType) return harker;\n\n  //Config\n  var options = options || {},\n      smoothing = (options.smoothing || 0.1),\n      interval = (options.interval || 50),\n      threshold = options.threshold,\n      play = options.play,\n      history = options.history || 10,\n      running = true;\n\n  //Setup Audio Context\n  if (!audioContext) {\n    audioContext = new audioContextType();\n  }\n  var sourceNode, fftBins, analyser;\n\n  analyser = audioContext.createAnalyser();\n  analyser.fftSize = 512;\n  analyser.smoothingTimeConstant = smoothing;\n  fftBins = new Float32Array(analyser.fftSize);\n\n  if (stream.jquery) stream = stream[0];\n  if (stream instanceof HTMLAudioElement || stream instanceof HTMLVideoElement) {\n    //Audio Tag\n    sourceNode = audioContext.createMediaElementSource(stream);\n    if (typeof play === 'undefined') play = true;\n    threshold = threshold || -50;\n  } else {\n    //WebRTC Stream\n    sourceNode = audioContext.createMediaStreamSource(stream);\n    threshold = threshold || -50;\n  }\n\n  sourceNode.connect(analyser);\n  if (play) analyser.connect(audioContext.destination);\n\n  harker.speaking = false;\n\n  harker.setThreshold = function(t) {\n    threshold = t;\n  };\n\n  harker.setInterval = function(i) {\n    interval = i;\n  };\n\n  harker.stop = function() {\n    running = false;\n    harker.emit('volume_change', -100, threshold);\n    if (harker.speaking) {\n      harker.speaking = false;\n      harker.emit('stopped_speaking');\n    }\n    analyser.disconnect();\n    sourceNode.disconnect();\n  };\n  harker.speakingHistory = [];\n  for (var i = 0; i < history; i++) {\n      harker.speakingHistory.push(0);\n  }\n\n  // Poll the analyser node to determine if speaking\n  // and emit events if changed\n  var looper = function() {\n    setTimeout(function() {\n\n      //check if stop has been called\n      if(!running) {\n        return;\n      }\n\n      var currentVolume = getMaxVolume(analyser, fftBins);\n\n      harker.emit('volume_change', currentVolume, threshold);\n\n      var history = 0;\n      if (currentVolume > threshold && !harker.speaking) {\n        // trigger quickly, short history\n        for (var i = harker.speakingHistory.length - 3; i < harker.speakingHistory.length; i++) {\n          history += harker.speakingHistory[i];\n        }\n        if (history >= 2) {\n          harker.speaking = true;\n          harker.emit('speaking');\n        }\n      } else if (currentVolume < threshold && harker.speaking) {\n        for (var i = 0; i < harker.speakingHistory.length; i++) {\n          history += harker.speakingHistory[i];\n        }\n        if (history == 0) {\n          harker.speaking = false;\n          harker.emit('stopped_speaking');\n        }\n      }\n      harker.speakingHistory.shift();\n      harker.speakingHistory.push(0 + (currentVolume > threshold));\n\n      looper();\n    }, interval);\n  };\n  looper();\n\n\n  return harker;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQ0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9oYXJrL2hhcmsuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIFdpbGRFbWl0dGVyID0gcmVxdWlyZSgnd2lsZGVtaXR0ZXInKTtcblxuZnVuY3Rpb24gZ2V0TWF4Vm9sdW1lIChhbmFseXNlciwgZmZ0Qmlucykge1xuICB2YXIgbWF4Vm9sdW1lID0gLUluZmluaXR5O1xuICBhbmFseXNlci5nZXRGbG9hdEZyZXF1ZW5jeURhdGEoZmZ0Qmlucyk7XG5cbiAgZm9yKHZhciBpPTQsIGlpPWZmdEJpbnMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgIGlmIChmZnRCaW5zW2ldID4gbWF4Vm9sdW1lICYmIGZmdEJpbnNbaV0gPCAwKSB7XG4gICAgICBtYXhWb2x1bWUgPSBmZnRCaW5zW2ldO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gbWF4Vm9sdW1lO1xufVxuXG5cbnZhciBhdWRpb0NvbnRleHRUeXBlO1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIGF1ZGlvQ29udGV4dFR5cGUgPSB3aW5kb3cuQXVkaW9Db250ZXh0IHx8IHdpbmRvdy53ZWJraXRBdWRpb0NvbnRleHQ7XG59XG4vLyB1c2UgYSBzaW5nbGUgYXVkaW8gY29udGV4dCBkdWUgdG8gaGFyZHdhcmUgbGltaXRzXG52YXIgYXVkaW9Db250ZXh0ID0gbnVsbDtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oc3RyZWFtLCBvcHRpb25zKSB7XG4gIHZhciBoYXJrZXIgPSBuZXcgV2lsZEVtaXR0ZXIoKTtcblxuXG4gIC8vIG1ha2UgaXQgbm90IGJyZWFrIGluIG5vbi1zdXBwb3J0ZWQgYnJvd3NlcnNcbiAgaWYgKCFhdWRpb0NvbnRleHRUeXBlKSByZXR1cm4gaGFya2VyO1xuXG4gIC8vQ29uZmlnXG4gIHZhciBvcHRpb25zID0gb3B0aW9ucyB8fCB7fSxcbiAgICAgIHNtb290aGluZyA9IChvcHRpb25zLnNtb290aGluZyB8fCAwLjEpLFxuICAgICAgaW50ZXJ2YWwgPSAob3B0aW9ucy5pbnRlcnZhbCB8fCA1MCksXG4gICAgICB0aHJlc2hvbGQgPSBvcHRpb25zLnRocmVzaG9sZCxcbiAgICAgIHBsYXkgPSBvcHRpb25zLnBsYXksXG4gICAgICBoaXN0b3J5ID0gb3B0aW9ucy5oaXN0b3J5IHx8IDEwLFxuICAgICAgcnVubmluZyA9IHRydWU7XG5cbiAgLy9TZXR1cCBBdWRpbyBDb250ZXh0XG4gIGlmICghYXVkaW9Db250ZXh0KSB7XG4gICAgYXVkaW9Db250ZXh0ID0gbmV3IGF1ZGlvQ29udGV4dFR5cGUoKTtcbiAgfVxuICB2YXIgc291cmNlTm9kZSwgZmZ0QmlucywgYW5hbHlzZXI7XG5cbiAgYW5hbHlzZXIgPSBhdWRpb0NvbnRleHQuY3JlYXRlQW5hbHlzZXIoKTtcbiAgYW5hbHlzZXIuZmZ0U2l6ZSA9IDUxMjtcbiAgYW5hbHlzZXIuc21vb3RoaW5nVGltZUNvbnN0YW50ID0gc21vb3RoaW5nO1xuICBmZnRCaW5zID0gbmV3IEZsb2F0MzJBcnJheShhbmFseXNlci5mZnRTaXplKTtcblxuICBpZiAoc3RyZWFtLmpxdWVyeSkgc3RyZWFtID0gc3RyZWFtWzBdO1xuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgSFRNTEF1ZGlvRWxlbWVudCB8fCBzdHJlYW0gaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50KSB7XG4gICAgLy9BdWRpbyBUYWdcbiAgICBzb3VyY2VOb2RlID0gYXVkaW9Db250ZXh0LmNyZWF0ZU1lZGlhRWxlbWVudFNvdXJjZShzdHJlYW0pO1xuICAgIGlmICh0eXBlb2YgcGxheSA9PT0gJ3VuZGVmaW5lZCcpIHBsYXkgPSB0cnVlO1xuICAgIHRocmVzaG9sZCA9IHRocmVzaG9sZCB8fCAtNTA7XG4gIH0gZWxzZSB7XG4gICAgLy9XZWJSVEMgU3RyZWFtXG4gICAgc291cmNlTm9kZSA9IGF1ZGlvQ29udGV4dC5jcmVhdGVNZWRpYVN0cmVhbVNvdXJjZShzdHJlYW0pO1xuICAgIHRocmVzaG9sZCA9IHRocmVzaG9sZCB8fCAtNTA7XG4gIH1cblxuICBzb3VyY2VOb2RlLmNvbm5lY3QoYW5hbHlzZXIpO1xuICBpZiAocGxheSkgYW5hbHlzZXIuY29ubmVjdChhdWRpb0NvbnRleHQuZGVzdGluYXRpb24pO1xuXG4gIGhhcmtlci5zcGVha2luZyA9IGZhbHNlO1xuXG4gIGhhcmtlci5zZXRUaHJlc2hvbGQgPSBmdW5jdGlvbih0KSB7XG4gICAgdGhyZXNob2xkID0gdDtcbiAgfTtcblxuICBoYXJrZXIuc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbihpKSB7XG4gICAgaW50ZXJ2YWwgPSBpO1xuICB9O1xuXG4gIGhhcmtlci5zdG9wID0gZnVuY3Rpb24oKSB7XG4gICAgcnVubmluZyA9IGZhbHNlO1xuICAgIGhhcmtlci5lbWl0KCd2b2x1bWVfY2hhbmdlJywgLTEwMCwgdGhyZXNob2xkKTtcbiAgICBpZiAoaGFya2VyLnNwZWFraW5nKSB7XG4gICAgICBoYXJrZXIuc3BlYWtpbmcgPSBmYWxzZTtcbiAgICAgIGhhcmtlci5lbWl0KCdzdG9wcGVkX3NwZWFraW5nJyk7XG4gICAgfVxuICAgIGFuYWx5c2VyLmRpc2Nvbm5lY3QoKTtcbiAgICBzb3VyY2VOb2RlLmRpc2Nvbm5lY3QoKTtcbiAgfTtcbiAgaGFya2VyLnNwZWFraW5nSGlzdG9yeSA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGhpc3Rvcnk7IGkrKykge1xuICAgICAgaGFya2VyLnNwZWFraW5nSGlzdG9yeS5wdXNoKDApO1xuICB9XG5cbiAgLy8gUG9sbCB0aGUgYW5hbHlzZXIgbm9kZSB0byBkZXRlcm1pbmUgaWYgc3BlYWtpbmdcbiAgLy8gYW5kIGVtaXQgZXZlbnRzIGlmIGNoYW5nZWRcbiAgdmFyIGxvb3BlciA9IGZ1bmN0aW9uKCkge1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cbiAgICAgIC8vY2hlY2sgaWYgc3RvcCBoYXMgYmVlbiBjYWxsZWRcbiAgICAgIGlmKCFydW5uaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGN1cnJlbnRWb2x1bWUgPSBnZXRNYXhWb2x1bWUoYW5hbHlzZXIsIGZmdEJpbnMpO1xuXG4gICAgICBoYXJrZXIuZW1pdCgndm9sdW1lX2NoYW5nZScsIGN1cnJlbnRWb2x1bWUsIHRocmVzaG9sZCk7XG5cbiAgICAgIHZhciBoaXN0b3J5ID0gMDtcbiAgICAgIGlmIChjdXJyZW50Vm9sdW1lID4gdGhyZXNob2xkICYmICFoYXJrZXIuc3BlYWtpbmcpIHtcbiAgICAgICAgLy8gdHJpZ2dlciBxdWlja2x5LCBzaG9ydCBoaXN0b3J5XG4gICAgICAgIGZvciAodmFyIGkgPSBoYXJrZXIuc3BlYWtpbmdIaXN0b3J5Lmxlbmd0aCAtIDM7IGkgPCBoYXJrZXIuc3BlYWtpbmdIaXN0b3J5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaGlzdG9yeSArPSBoYXJrZXIuc3BlYWtpbmdIaXN0b3J5W2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoaXN0b3J5ID49IDIpIHtcbiAgICAgICAgICBoYXJrZXIuc3BlYWtpbmcgPSB0cnVlO1xuICAgICAgICAgIGhhcmtlci5lbWl0KCdzcGVha2luZycpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWb2x1bWUgPCB0aHJlc2hvbGQgJiYgaGFya2VyLnNwZWFraW5nKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFya2VyLnNwZWFraW5nSGlzdG9yeS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGhpc3RvcnkgKz0gaGFya2VyLnNwZWFraW5nSGlzdG9yeVtpXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGlzdG9yeSA9PSAwKSB7XG4gICAgICAgICAgaGFya2VyLnNwZWFraW5nID0gZmFsc2U7XG4gICAgICAgICAgaGFya2VyLmVtaXQoJ3N0b3BwZWRfc3BlYWtpbmcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaGFya2VyLnNwZWFraW5nSGlzdG9yeS5zaGlmdCgpO1xuICAgICAgaGFya2VyLnNwZWFraW5nSGlzdG9yeS5wdXNoKDAgKyAoY3VycmVudFZvbHVtZSA+IHRocmVzaG9sZCkpO1xuXG4gICAgICBsb29wZXIoKTtcbiAgICB9LCBpbnRlcnZhbCk7XG4gIH07XG4gIGxvb3BlcigpO1xuXG5cbiAgcmV0dXJuIGhhcmtlcjtcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9oYXJrL2hhcmsuanNcbi8vIG1vZHVsZSBpZCA9IDQ0NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 445 */
/***/ function(module, exports) {

    eval("/*\r\nWildEmitter.js is a slim little event emitter by @henrikjoreteg largely based\r\non @visionmedia's Emitter from UI Kit.\r\n\r\nWhy? I wanted it standalone.\r\n\r\nI also wanted support for wildcard emitters like this:\r\n\r\nemitter.on('*', function (eventName, other, event, payloads) {\r\n\r\n});\r\n\r\nemitter.on('somenamespace*', function (eventName, payloads) {\r\n\r\n});\r\n\r\nPlease note that callbacks triggered by wildcard registered events also get\r\nthe event name as the first argument.\r\n*/\r\n\r\nmodule.exports = WildEmitter;\r\n\r\nfunction WildEmitter() { }\r\n\r\nWildEmitter.mixin = function (constructor) {\r\n    var prototype = constructor.prototype || constructor;\r\n\r\n    prototype.isWildEmitter= true;\r\n\r\n    // Listen on the given `event` with `fn`. Store a group name if present.\r\n    prototype.on = function (event, groupName, fn) {\r\n        this.callbacks = this.callbacks || {};\r\n        var hasGroup = (arguments.length === 3),\r\n            group = hasGroup ? arguments[1] : undefined,\r\n            func = hasGroup ? arguments[2] : arguments[1];\r\n        func._groupName = group;\r\n        (this.callbacks[event] = this.callbacks[event] || []).push(func);\r\n        return this;\r\n    };\r\n\r\n    // Adds an `event` listener that will be invoked a single\r\n    // time then automatically removed.\r\n    prototype.once = function (event, groupName, fn) {\r\n        var self = this,\r\n            hasGroup = (arguments.length === 3),\r\n            group = hasGroup ? arguments[1] : undefined,\r\n            func = hasGroup ? arguments[2] : arguments[1];\r\n        function on() {\r\n            self.off(event, on);\r\n            func.apply(this, arguments);\r\n        }\r\n        this.on(event, group, on);\r\n        return this;\r\n    };\r\n\r\n    // Unbinds an entire group\r\n    prototype.releaseGroup = function (groupName) {\r\n        this.callbacks = this.callbacks || {};\r\n        var item, i, len, handlers;\r\n        for (item in this.callbacks) {\r\n            handlers = this.callbacks[item];\r\n            for (i = 0, len = handlers.length; i < len; i++) {\r\n                if (handlers[i]._groupName === groupName) {\r\n                    //console.log('removing');\r\n                    // remove it and shorten the array we're looping through\r\n                    handlers.splice(i, 1);\r\n                    i--;\r\n                    len--;\r\n                }\r\n            }\r\n        }\r\n        return this;\r\n    };\r\n\r\n    // Remove the given callback for `event` or all\r\n    // registered callbacks.\r\n    prototype.off = function (event, fn) {\r\n        this.callbacks = this.callbacks || {};\r\n        var callbacks = this.callbacks[event],\r\n            i;\r\n\r\n        if (!callbacks) return this;\r\n\r\n        // remove all handlers\r\n        if (arguments.length === 1) {\r\n            delete this.callbacks[event];\r\n            return this;\r\n        }\r\n\r\n        // remove specific handler\r\n        i = callbacks.indexOf(fn);\r\n        callbacks.splice(i, 1);\r\n        if (callbacks.length === 0) {\r\n            delete this.callbacks[event];\r\n        }\r\n        return this;\r\n    };\r\n\r\n    /// Emit `event` with the given args.\r\n    // also calls any `*` handlers\r\n    prototype.emit = function (event) {\r\n        this.callbacks = this.callbacks || {};\r\n        var args = [].slice.call(arguments, 1),\r\n            callbacks = this.callbacks[event],\r\n            specialCallbacks = this.getWildcardCallbacks(event),\r\n            i,\r\n            len,\r\n            item,\r\n            listeners;\r\n\r\n        if (callbacks) {\r\n            listeners = callbacks.slice();\r\n            for (i = 0, len = listeners.length; i < len; ++i) {\r\n                if (!listeners[i]) {\r\n                    break;\r\n                }\r\n                listeners[i].apply(this, args);\r\n            }\r\n        }\r\n\r\n        if (specialCallbacks) {\r\n            len = specialCallbacks.length;\r\n            listeners = specialCallbacks.slice();\r\n            for (i = 0, len = listeners.length; i < len; ++i) {\r\n                if (!listeners[i]) {\r\n                    break;\r\n                }\r\n                listeners[i].apply(this, [event].concat(args));\r\n            }\r\n        }\r\n\r\n        return this;\r\n    };\r\n\r\n    // Helper for for finding special wildcard event handlers that match the event\r\n    prototype.getWildcardCallbacks = function (eventName) {\r\n        this.callbacks = this.callbacks || {};\r\n        var item,\r\n            split,\r\n            result = [];\r\n\r\n        for (item in this.callbacks) {\r\n            split = item.split('*');\r\n            if (item === '*' || (split.length === 2 && eventName.slice(0, split[0].length) === split[0])) {\r\n                result = result.concat(this.callbacks[item]);\r\n            }\r\n        }\r\n        return result;\r\n    };\r\n\r\n};\r\n\r\nWildEmitter.mixin(WildEmitter);\r\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQ1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy93aWxkZW1pdHRlci93aWxkZW1pdHRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG5XaWxkRW1pdHRlci5qcyBpcyBhIHNsaW0gbGl0dGxlIGV2ZW50IGVtaXR0ZXIgYnkgQGhlbnJpa2pvcmV0ZWcgbGFyZ2VseSBiYXNlZFxyXG5vbiBAdmlzaW9ubWVkaWEncyBFbWl0dGVyIGZyb20gVUkgS2l0LlxyXG5cclxuV2h5PyBJIHdhbnRlZCBpdCBzdGFuZGFsb25lLlxyXG5cclxuSSBhbHNvIHdhbnRlZCBzdXBwb3J0IGZvciB3aWxkY2FyZCBlbWl0dGVycyBsaWtlIHRoaXM6XHJcblxyXG5lbWl0dGVyLm9uKCcqJywgZnVuY3Rpb24gKGV2ZW50TmFtZSwgb3RoZXIsIGV2ZW50LCBwYXlsb2Fkcykge1xyXG5cclxufSk7XHJcblxyXG5lbWl0dGVyLm9uKCdzb21lbmFtZXNwYWNlKicsIGZ1bmN0aW9uIChldmVudE5hbWUsIHBheWxvYWRzKSB7XHJcblxyXG59KTtcclxuXHJcblBsZWFzZSBub3RlIHRoYXQgY2FsbGJhY2tzIHRyaWdnZXJlZCBieSB3aWxkY2FyZCByZWdpc3RlcmVkIGV2ZW50cyBhbHNvIGdldFxyXG50aGUgZXZlbnQgbmFtZSBhcyB0aGUgZmlyc3QgYXJndW1lbnQuXHJcbiovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFdpbGRFbWl0dGVyO1xyXG5cclxuZnVuY3Rpb24gV2lsZEVtaXR0ZXIoKSB7IH1cclxuXHJcbldpbGRFbWl0dGVyLm1peGluID0gZnVuY3Rpb24gKGNvbnN0cnVjdG9yKSB7XHJcbiAgICB2YXIgcHJvdG90eXBlID0gY29uc3RydWN0b3IucHJvdG90eXBlIHx8IGNvbnN0cnVjdG9yO1xyXG5cclxuICAgIHByb3RvdHlwZS5pc1dpbGRFbWl0dGVyPSB0cnVlO1xyXG5cclxuICAgIC8vIExpc3RlbiBvbiB0aGUgZ2l2ZW4gYGV2ZW50YCB3aXRoIGBmbmAuIFN0b3JlIGEgZ3JvdXAgbmFtZSBpZiBwcmVzZW50LlxyXG4gICAgcHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGV2ZW50LCBncm91cE5hbWUsIGZuKSB7XHJcbiAgICAgICAgdGhpcy5jYWxsYmFja3MgPSB0aGlzLmNhbGxiYWNrcyB8fCB7fTtcclxuICAgICAgICB2YXIgaGFzR3JvdXAgPSAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyksXHJcbiAgICAgICAgICAgIGdyb3VwID0gaGFzR3JvdXAgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIGZ1bmMgPSBoYXNHcm91cCA/IGFyZ3VtZW50c1syXSA6IGFyZ3VtZW50c1sxXTtcclxuICAgICAgICBmdW5jLl9ncm91cE5hbWUgPSBncm91cDtcclxuICAgICAgICAodGhpcy5jYWxsYmFja3NbZXZlbnRdID0gdGhpcy5jYWxsYmFja3NbZXZlbnRdIHx8IFtdKS5wdXNoKGZ1bmMpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBBZGRzIGFuIGBldmVudGAgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGludm9rZWQgYSBzaW5nbGVcclxuICAgIC8vIHRpbWUgdGhlbiBhdXRvbWF0aWNhbGx5IHJlbW92ZWQuXHJcbiAgICBwcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIChldmVudCwgZ3JvdXBOYW1lLCBmbikge1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcyxcclxuICAgICAgICAgICAgaGFzR3JvdXAgPSAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyksXHJcbiAgICAgICAgICAgIGdyb3VwID0gaGFzR3JvdXAgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIGZ1bmMgPSBoYXNHcm91cCA/IGFyZ3VtZW50c1syXSA6IGFyZ3VtZW50c1sxXTtcclxuICAgICAgICBmdW5jdGlvbiBvbigpIHtcclxuICAgICAgICAgICAgc2VsZi5vZmYoZXZlbnQsIG9uKTtcclxuICAgICAgICAgICAgZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9uKGV2ZW50LCBncm91cCwgb24pO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBVbmJpbmRzIGFuIGVudGlyZSBncm91cFxyXG4gICAgcHJvdG90eXBlLnJlbGVhc2VHcm91cCA9IGZ1bmN0aW9uIChncm91cE5hbWUpIHtcclxuICAgICAgICB0aGlzLmNhbGxiYWNrcyA9IHRoaXMuY2FsbGJhY2tzIHx8IHt9O1xyXG4gICAgICAgIHZhciBpdGVtLCBpLCBsZW4sIGhhbmRsZXJzO1xyXG4gICAgICAgIGZvciAoaXRlbSBpbiB0aGlzLmNhbGxiYWNrcykge1xyXG4gICAgICAgICAgICBoYW5kbGVycyA9IHRoaXMuY2FsbGJhY2tzW2l0ZW1dO1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJzW2ldLl9ncm91cE5hbWUgPT09IGdyb3VwTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3JlbW92aW5nJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGl0IGFuZCBzaG9ydGVuIHRoZSBhcnJheSB3ZSdyZSBsb29waW5nIHRocm91Z2hcclxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVycy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaS0tO1xyXG4gICAgICAgICAgICAgICAgICAgIGxlbi0tO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBSZW1vdmUgdGhlIGdpdmVuIGNhbGxiYWNrIGZvciBgZXZlbnRgIG9yIGFsbFxyXG4gICAgLy8gcmVnaXN0ZXJlZCBjYWxsYmFja3MuXHJcbiAgICBwcm90b3R5cGUub2ZmID0gZnVuY3Rpb24gKGV2ZW50LCBmbikge1xyXG4gICAgICAgIHRoaXMuY2FsbGJhY2tzID0gdGhpcy5jYWxsYmFja3MgfHwge307XHJcbiAgICAgICAgdmFyIGNhbGxiYWNrcyA9IHRoaXMuY2FsbGJhY2tzW2V2ZW50XSxcclxuICAgICAgICAgICAgaTtcclxuXHJcbiAgICAgICAgaWYgKCFjYWxsYmFja3MpIHJldHVybiB0aGlzO1xyXG5cclxuICAgICAgICAvLyByZW1vdmUgYWxsIGhhbmRsZXJzXHJcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2FsbGJhY2tzW2V2ZW50XTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyByZW1vdmUgc3BlY2lmaWMgaGFuZGxlclxyXG4gICAgICAgIGkgPSBjYWxsYmFja3MuaW5kZXhPZihmbik7XHJcbiAgICAgICAgY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcclxuICAgICAgICBpZiAoY2FsbGJhY2tzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jYWxsYmFja3NbZXZlbnRdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcblxyXG4gICAgLy8vIEVtaXQgYGV2ZW50YCB3aXRoIHRoZSBnaXZlbiBhcmdzLlxyXG4gICAgLy8gYWxzbyBjYWxscyBhbnkgYCpgIGhhbmRsZXJzXHJcbiAgICBwcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgIHRoaXMuY2FsbGJhY2tzID0gdGhpcy5jYWxsYmFja3MgfHwge307XHJcbiAgICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSksXHJcbiAgICAgICAgICAgIGNhbGxiYWNrcyA9IHRoaXMuY2FsbGJhY2tzW2V2ZW50XSxcclxuICAgICAgICAgICAgc3BlY2lhbENhbGxiYWNrcyA9IHRoaXMuZ2V0V2lsZGNhcmRDYWxsYmFja3MoZXZlbnQpLFxyXG4gICAgICAgICAgICBpLFxyXG4gICAgICAgICAgICBsZW4sXHJcbiAgICAgICAgICAgIGl0ZW0sXHJcbiAgICAgICAgICAgIGxpc3RlbmVycztcclxuXHJcbiAgICAgICAgaWYgKGNhbGxiYWNrcykge1xyXG4gICAgICAgICAgICBsaXN0ZW5lcnMgPSBjYWxsYmFja3Muc2xpY2UoKTtcclxuICAgICAgICAgICAgZm9yIChpID0gMCwgbGVuID0gbGlzdGVuZXJzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxpc3RlbmVyc1tpXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzW2ldLmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3BlY2lhbENhbGxiYWNrcykge1xyXG4gICAgICAgICAgICBsZW4gPSBzcGVjaWFsQ2FsbGJhY2tzLmxlbmd0aDtcclxuICAgICAgICAgICAgbGlzdGVuZXJzID0gc3BlY2lhbENhbGxiYWNrcy5zbGljZSgpO1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBsaXN0ZW5lcnMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcclxuICAgICAgICAgICAgICAgIGlmICghbGlzdGVuZXJzW2ldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkodGhpcywgW2V2ZW50XS5jb25jYXQoYXJncykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcblxyXG4gICAgLy8gSGVscGVyIGZvciBmb3IgZmluZGluZyBzcGVjaWFsIHdpbGRjYXJkIGV2ZW50IGhhbmRsZXJzIHRoYXQgbWF0Y2ggdGhlIGV2ZW50XHJcbiAgICBwcm90b3R5cGUuZ2V0V2lsZGNhcmRDYWxsYmFja3MgPSBmdW5jdGlvbiAoZXZlbnROYW1lKSB7XHJcbiAgICAgICAgdGhpcy5jYWxsYmFja3MgPSB0aGlzLmNhbGxiYWNrcyB8fCB7fTtcclxuICAgICAgICB2YXIgaXRlbSxcclxuICAgICAgICAgICAgc3BsaXQsXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGl0ZW0gaW4gdGhpcy5jYWxsYmFja3MpIHtcclxuICAgICAgICAgICAgc3BsaXQgPSBpdGVtLnNwbGl0KCcqJyk7XHJcbiAgICAgICAgICAgIGlmIChpdGVtID09PSAnKicgfHwgKHNwbGl0Lmxlbmd0aCA9PT0gMiAmJiBldmVudE5hbWUuc2xpY2UoMCwgc3BsaXRbMF0ubGVuZ3RoKSA9PT0gc3BsaXRbMF0pKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KHRoaXMuY2FsbGJhY2tzW2l0ZW1dKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfTtcclxuXHJcbn07XHJcblxyXG5XaWxkRW1pdHRlci5taXhpbihXaWxkRW1pdHRlcik7XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi93aWxkZW1pdHRlci93aWxkZW1pdHRlci5qc1xuLy8gbW9kdWxlIGlkID0gNDQ1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 446 */
/***/ function(module, exports, __webpack_require__) {

    eval("// getUserMedia helper by @HenrikJoreteg used for navigator.getUserMedia shim\nvar adapter = __webpack_require__(447);\n\nmodule.exports = function (constraints, cb) {\n    var error;\n    var haveOpts = arguments.length === 2;\n    var defaultOpts = {video: true, audio: true};\n\n    var denied = 'PermissionDeniedError';\n    var altDenied = 'PERMISSION_DENIED';\n    var notSatisfied = 'ConstraintNotSatisfiedError';\n\n    // make constraints optional\n    if (!haveOpts) {\n        cb = constraints;\n        constraints = defaultOpts;\n    }\n\n    // treat lack of browser support like an error\n    if (typeof navigator === 'undefined' || !navigator.getUserMedia) {\n        // throw proper error per spec\n        error = new Error('MediaStreamError');\n        error.name = 'NotSupportedError';\n\n        // keep all callbacks async\n        return setTimeout(function () {\n            cb(error);\n        }, 0);\n    }\n\n    // normalize error handling when no media types are requested\n    if (!constraints.audio && !constraints.video) {\n        error = new Error('MediaStreamError');\n        error.name = 'NoMediaRequestedError';\n\n        // keep all callbacks async\n        return setTimeout(function () {\n            cb(error);\n        }, 0);\n    }\n\n    // testing support -- note: using the about:config pref is better\n    // for Firefox 39+, this might get removed in the future\n    if (localStorage && localStorage.useFirefoxFakeDevice === 'true') {\n        constraints.fake = true;\n    }\n\n    navigator.mediaDevices.getUserMedia(constraints)\n    .then(function (stream) {\n        cb(null, stream);\n    }).catch(function (err) {\n        var error;\n        // coerce into an error object since FF gives us a string\n        // there are only two valid names according to the spec\n        // we coerce all non-denied to \"constraint not satisfied\".\n        if (typeof err === 'string') {\n            error = new Error('MediaStreamError');\n            if (err === denied || err === altDenied) {\n                error.name = denied;\n            } else {\n                error.name = notSatisfied;\n            }\n        } else {\n            // if we get an error object make sure '.name' property is set\n            // according to spec: http://dev.w3.org/2011/webrtc/editor/getusermedia.html#navigatorusermediaerror-and-navigatorusermediaerrorcallback\n            error = err;\n            if (!error.name) {\n                // this is likely chrome which\n                // sets a property called \"ERROR_DENIED\" on the error object\n                // if so we make sure to set a name\n                if (error[denied]) {\n                    err.name = denied;\n                } else {\n                    err.name = notSatisfied;\n                }\n            }\n        }\n\n        cb(error);\n    });\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQ2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2NhbG1lZGlhL25vZGVfbW9kdWxlcy9nZXR1c2VybWVkaWEvaW5kZXgtYnJvd3Nlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBnZXRVc2VyTWVkaWEgaGVscGVyIGJ5IEBIZW5yaWtKb3JldGVnIHVzZWQgZm9yIG5hdmlnYXRvci5nZXRVc2VyTWVkaWEgc2hpbVxudmFyIGFkYXB0ZXIgPSByZXF1aXJlKCd3ZWJydGMtYWRhcHRlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjb25zdHJhaW50cywgY2IpIHtcbiAgICB2YXIgZXJyb3I7XG4gICAgdmFyIGhhdmVPcHRzID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMjtcbiAgICB2YXIgZGVmYXVsdE9wdHMgPSB7dmlkZW86IHRydWUsIGF1ZGlvOiB0cnVlfTtcblxuICAgIHZhciBkZW5pZWQgPSAnUGVybWlzc2lvbkRlbmllZEVycm9yJztcbiAgICB2YXIgYWx0RGVuaWVkID0gJ1BFUk1JU1NJT05fREVOSUVEJztcbiAgICB2YXIgbm90U2F0aXNmaWVkID0gJ0NvbnN0cmFpbnROb3RTYXRpc2ZpZWRFcnJvcic7XG5cbiAgICAvLyBtYWtlIGNvbnN0cmFpbnRzIG9wdGlvbmFsXG4gICAgaWYgKCFoYXZlT3B0cykge1xuICAgICAgICBjYiA9IGNvbnN0cmFpbnRzO1xuICAgICAgICBjb25zdHJhaW50cyA9IGRlZmF1bHRPcHRzO1xuICAgIH1cblxuICAgIC8vIHRyZWF0IGxhY2sgb2YgYnJvd3NlciBzdXBwb3J0IGxpa2UgYW4gZXJyb3JcbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciA9PT0gJ3VuZGVmaW5lZCcgfHwgIW5hdmlnYXRvci5nZXRVc2VyTWVkaWEpIHtcbiAgICAgICAgLy8gdGhyb3cgcHJvcGVyIGVycm9yIHBlciBzcGVjXG4gICAgICAgIGVycm9yID0gbmV3IEVycm9yKCdNZWRpYVN0cmVhbUVycm9yJyk7XG4gICAgICAgIGVycm9yLm5hbWUgPSAnTm90U3VwcG9ydGVkRXJyb3InO1xuXG4gICAgICAgIC8vIGtlZXAgYWxsIGNhbGxiYWNrcyBhc3luY1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjYihlcnJvcik7XG4gICAgICAgIH0sIDApO1xuICAgIH1cblxuICAgIC8vIG5vcm1hbGl6ZSBlcnJvciBoYW5kbGluZyB3aGVuIG5vIG1lZGlhIHR5cGVzIGFyZSByZXF1ZXN0ZWRcbiAgICBpZiAoIWNvbnN0cmFpbnRzLmF1ZGlvICYmICFjb25zdHJhaW50cy52aWRlbykge1xuICAgICAgICBlcnJvciA9IG5ldyBFcnJvcignTWVkaWFTdHJlYW1FcnJvcicpO1xuICAgICAgICBlcnJvci5uYW1lID0gJ05vTWVkaWFSZXF1ZXN0ZWRFcnJvcic7XG5cbiAgICAgICAgLy8ga2VlcCBhbGwgY2FsbGJhY2tzIGFzeW5jXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNiKGVycm9yKTtcbiAgICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgLy8gdGVzdGluZyBzdXBwb3J0IC0tIG5vdGU6IHVzaW5nIHRoZSBhYm91dDpjb25maWcgcHJlZiBpcyBiZXR0ZXJcbiAgICAvLyBmb3IgRmlyZWZveCAzOSssIHRoaXMgbWlnaHQgZ2V0IHJlbW92ZWQgaW4gdGhlIGZ1dHVyZVxuICAgIGlmIChsb2NhbFN0b3JhZ2UgJiYgbG9jYWxTdG9yYWdlLnVzZUZpcmVmb3hGYWtlRGV2aWNlID09PSAndHJ1ZScpIHtcbiAgICAgICAgY29uc3RyYWludHMuZmFrZSA9IHRydWU7XG4gICAgfVxuXG4gICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoY29uc3RyYWludHMpXG4gICAgLnRoZW4oZnVuY3Rpb24gKHN0cmVhbSkge1xuICAgICAgICBjYihudWxsLCBzdHJlYW0pO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgdmFyIGVycm9yO1xuICAgICAgICAvLyBjb2VyY2UgaW50byBhbiBlcnJvciBvYmplY3Qgc2luY2UgRkYgZ2l2ZXMgdXMgYSBzdHJpbmdcbiAgICAgICAgLy8gdGhlcmUgYXJlIG9ubHkgdHdvIHZhbGlkIG5hbWVzIGFjY29yZGluZyB0byB0aGUgc3BlY1xuICAgICAgICAvLyB3ZSBjb2VyY2UgYWxsIG5vbi1kZW5pZWQgdG8gXCJjb25zdHJhaW50IG5vdCBzYXRpc2ZpZWRcIi5cbiAgICAgICAgaWYgKHR5cGVvZiBlcnIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcignTWVkaWFTdHJlYW1FcnJvcicpO1xuICAgICAgICAgICAgaWYgKGVyciA9PT0gZGVuaWVkIHx8IGVyciA9PT0gYWx0RGVuaWVkKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IubmFtZSA9IGRlbmllZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXJyb3IubmFtZSA9IG5vdFNhdGlzZmllZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIHdlIGdldCBhbiBlcnJvciBvYmplY3QgbWFrZSBzdXJlICcubmFtZScgcHJvcGVydHkgaXMgc2V0XG4gICAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gc3BlYzogaHR0cDovL2Rldi53My5vcmcvMjAxMS93ZWJydGMvZWRpdG9yL2dldHVzZXJtZWRpYS5odG1sI25hdmlnYXRvcnVzZXJtZWRpYWVycm9yLWFuZC1uYXZpZ2F0b3J1c2VybWVkaWFlcnJvcmNhbGxiYWNrXG4gICAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgICAgIGlmICghZXJyb3IubmFtZSkge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbGlrZWx5IGNocm9tZSB3aGljaFxuICAgICAgICAgICAgICAgIC8vIHNldHMgYSBwcm9wZXJ0eSBjYWxsZWQgXCJFUlJPUl9ERU5JRURcIiBvbiB0aGUgZXJyb3Igb2JqZWN0XG4gICAgICAgICAgICAgICAgLy8gaWYgc28gd2UgbWFrZSBzdXJlIHRvIHNldCBhIG5hbWVcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3JbZGVuaWVkXSkge1xuICAgICAgICAgICAgICAgICAgICBlcnIubmFtZSA9IGRlbmllZDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlcnIubmFtZSA9IG5vdFNhdGlzZmllZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjYihlcnJvcik7XG4gICAgfSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvY2FsbWVkaWEvfi9nZXR1c2VybWVkaWEvaW5kZXgtYnJvd3Nlci5qc1xuLy8gbW9kdWxlIGlkID0gNDQ2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 447 */
/***/ function(module, exports, __webpack_require__) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n\n'use strict';\n\n// Shimming starts here.\n(function() {\n  // Utils.\n  var logging = __webpack_require__(448).log;\n  var browserDetails = __webpack_require__(448).browserDetails;\n  // Export to the adapter global object visible in the browser.\n  module.exports.browserDetails = browserDetails;\n  module.exports.extractVersion = __webpack_require__(448).extractVersion;\n  module.exports.disableLog = __webpack_require__(448).disableLog;\n\n  // Uncomment the line below if you want logging to occur, including logging\n  // for the switch statement below. Can also be turned on in the browser via\n  // adapter.disableLog(false), but then logging from the switch statement below\n  // will not appear.\n  // require('./utils').disableLog(false);\n\n  // Browser shims.\n  var chromeShim = __webpack_require__(449) || null;\n  var edgeShim = __webpack_require__(451) || null;\n  var firefoxShim = __webpack_require__(454) || null;\n  var safariShim = __webpack_require__(456) || null;\n\n  // Shim browser if found.\n  switch (browserDetails.browser) {\n    case 'opera': // fallthrough as it uses chrome shims\n    case 'chrome':\n      if (!chromeShim || !chromeShim.shimPeerConnection) {\n        logging('Chrome shim is not included in this adapter release.');\n        return;\n      }\n      logging('adapter.js shimming chrome.');\n      // Export to the adapter global object visible in the browser.\n      module.exports.browserShim = chromeShim;\n\n      chromeShim.shimGetUserMedia();\n      chromeShim.shimMediaStream();\n      chromeShim.shimSourceObject();\n      chromeShim.shimPeerConnection();\n      chromeShim.shimOnTrack();\n      break;\n    case 'firefox':\n      if (!firefoxShim || !firefoxShim.shimPeerConnection) {\n        logging('Firefox shim is not included in this adapter release.');\n        return;\n      }\n      logging('adapter.js shimming firefox.');\n      // Export to the adapter global object visible in the browser.\n      module.exports.browserShim = firefoxShim;\n\n      firefoxShim.shimGetUserMedia();\n      firefoxShim.shimSourceObject();\n      firefoxShim.shimPeerConnection();\n      firefoxShim.shimOnTrack();\n      break;\n    case 'edge':\n      if (!edgeShim || !edgeShim.shimPeerConnection) {\n        logging('MS edge shim is not included in this adapter release.');\n        return;\n      }\n      logging('adapter.js shimming edge.');\n      // Export to the adapter global object visible in the browser.\n      module.exports.browserShim = edgeShim;\n\n      edgeShim.shimGetUserMedia();\n      edgeShim.shimPeerConnection();\n      break;\n    case 'safari':\n      if (!safariShim) {\n        logging('Safari shim is not included in this adapter release.');\n        return;\n      }\n      logging('adapter.js shimming safari.');\n      // Export to the adapter global object visible in the browser.\n      module.exports.browserShim = safariShim;\n\n      safariShim.shimGetUserMedia();\n      break;\n    default:\n      logging('Unsupported browser!');\n  }\n})();\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQ3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2NhbG1lZGlhL25vZGVfbW9kdWxlcy93ZWJydGMtYWRhcHRlci9zcmMvanMvYWRhcHRlcl9jb3JlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiAgQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBXZWJSVEMgcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlXG4gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlXG4gKiAgdHJlZS5cbiAqL1xuIC8qIGVzbGludC1lbnYgbm9kZSAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8vIFNoaW1taW5nIHN0YXJ0cyBoZXJlLlxuKGZ1bmN0aW9uKCkge1xuICAvLyBVdGlscy5cbiAgdmFyIGxvZ2dpbmcgPSByZXF1aXJlKCcuL3V0aWxzJykubG9nO1xuICB2YXIgYnJvd3NlckRldGFpbHMgPSByZXF1aXJlKCcuL3V0aWxzJykuYnJvd3NlckRldGFpbHM7XG4gIC8vIEV4cG9ydCB0byB0aGUgYWRhcHRlciBnbG9iYWwgb2JqZWN0IHZpc2libGUgaW4gdGhlIGJyb3dzZXIuXG4gIG1vZHVsZS5leHBvcnRzLmJyb3dzZXJEZXRhaWxzID0gYnJvd3NlckRldGFpbHM7XG4gIG1vZHVsZS5leHBvcnRzLmV4dHJhY3RWZXJzaW9uID0gcmVxdWlyZSgnLi91dGlscycpLmV4dHJhY3RWZXJzaW9uO1xuICBtb2R1bGUuZXhwb3J0cy5kaXNhYmxlTG9nID0gcmVxdWlyZSgnLi91dGlscycpLmRpc2FibGVMb2c7XG5cbiAgLy8gVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IGlmIHlvdSB3YW50IGxvZ2dpbmcgdG8gb2NjdXIsIGluY2x1ZGluZyBsb2dnaW5nXG4gIC8vIGZvciB0aGUgc3dpdGNoIHN0YXRlbWVudCBiZWxvdy4gQ2FuIGFsc28gYmUgdHVybmVkIG9uIGluIHRoZSBicm93c2VyIHZpYVxuICAvLyBhZGFwdGVyLmRpc2FibGVMb2coZmFsc2UpLCBidXQgdGhlbiBsb2dnaW5nIGZyb20gdGhlIHN3aXRjaCBzdGF0ZW1lbnQgYmVsb3dcbiAgLy8gd2lsbCBub3QgYXBwZWFyLlxuICAvLyByZXF1aXJlKCcuL3V0aWxzJykuZGlzYWJsZUxvZyhmYWxzZSk7XG5cbiAgLy8gQnJvd3NlciBzaGltcy5cbiAgdmFyIGNocm9tZVNoaW0gPSByZXF1aXJlKCcuL2Nocm9tZS9jaHJvbWVfc2hpbScpIHx8IG51bGw7XG4gIHZhciBlZGdlU2hpbSA9IHJlcXVpcmUoJy4vZWRnZS9lZGdlX3NoaW0nKSB8fCBudWxsO1xuICB2YXIgZmlyZWZveFNoaW0gPSByZXF1aXJlKCcuL2ZpcmVmb3gvZmlyZWZveF9zaGltJykgfHwgbnVsbDtcbiAgdmFyIHNhZmFyaVNoaW0gPSByZXF1aXJlKCcuL3NhZmFyaS9zYWZhcmlfc2hpbScpIHx8IG51bGw7XG5cbiAgLy8gU2hpbSBicm93c2VyIGlmIGZvdW5kLlxuICBzd2l0Y2ggKGJyb3dzZXJEZXRhaWxzLmJyb3dzZXIpIHtcbiAgICBjYXNlICdvcGVyYSc6IC8vIGZhbGx0aHJvdWdoIGFzIGl0IHVzZXMgY2hyb21lIHNoaW1zXG4gICAgY2FzZSAnY2hyb21lJzpcbiAgICAgIGlmICghY2hyb21lU2hpbSB8fCAhY2hyb21lU2hpbS5zaGltUGVlckNvbm5lY3Rpb24pIHtcbiAgICAgICAgbG9nZ2luZygnQ2hyb21lIHNoaW0gaXMgbm90IGluY2x1ZGVkIGluIHRoaXMgYWRhcHRlciByZWxlYXNlLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2dnaW5nKCdhZGFwdGVyLmpzIHNoaW1taW5nIGNocm9tZS4nKTtcbiAgICAgIC8vIEV4cG9ydCB0byB0aGUgYWRhcHRlciBnbG9iYWwgb2JqZWN0IHZpc2libGUgaW4gdGhlIGJyb3dzZXIuXG4gICAgICBtb2R1bGUuZXhwb3J0cy5icm93c2VyU2hpbSA9IGNocm9tZVNoaW07XG5cbiAgICAgIGNocm9tZVNoaW0uc2hpbUdldFVzZXJNZWRpYSgpO1xuICAgICAgY2hyb21lU2hpbS5zaGltTWVkaWFTdHJlYW0oKTtcbiAgICAgIGNocm9tZVNoaW0uc2hpbVNvdXJjZU9iamVjdCgpO1xuICAgICAgY2hyb21lU2hpbS5zaGltUGVlckNvbm5lY3Rpb24oKTtcbiAgICAgIGNocm9tZVNoaW0uc2hpbU9uVHJhY2soKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ZpcmVmb3gnOlxuICAgICAgaWYgKCFmaXJlZm94U2hpbSB8fCAhZmlyZWZveFNoaW0uc2hpbVBlZXJDb25uZWN0aW9uKSB7XG4gICAgICAgIGxvZ2dpbmcoJ0ZpcmVmb3ggc2hpbSBpcyBub3QgaW5jbHVkZWQgaW4gdGhpcyBhZGFwdGVyIHJlbGVhc2UuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxvZ2dpbmcoJ2FkYXB0ZXIuanMgc2hpbW1pbmcgZmlyZWZveC4nKTtcbiAgICAgIC8vIEV4cG9ydCB0byB0aGUgYWRhcHRlciBnbG9iYWwgb2JqZWN0IHZpc2libGUgaW4gdGhlIGJyb3dzZXIuXG4gICAgICBtb2R1bGUuZXhwb3J0cy5icm93c2VyU2hpbSA9IGZpcmVmb3hTaGltO1xuXG4gICAgICBmaXJlZm94U2hpbS5zaGltR2V0VXNlck1lZGlhKCk7XG4gICAgICBmaXJlZm94U2hpbS5zaGltU291cmNlT2JqZWN0KCk7XG4gICAgICBmaXJlZm94U2hpbS5zaGltUGVlckNvbm5lY3Rpb24oKTtcbiAgICAgIGZpcmVmb3hTaGltLnNoaW1PblRyYWNrKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdlZGdlJzpcbiAgICAgIGlmICghZWRnZVNoaW0gfHwgIWVkZ2VTaGltLnNoaW1QZWVyQ29ubmVjdGlvbikge1xuICAgICAgICBsb2dnaW5nKCdNUyBlZGdlIHNoaW0gaXMgbm90IGluY2x1ZGVkIGluIHRoaXMgYWRhcHRlciByZWxlYXNlLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2dnaW5nKCdhZGFwdGVyLmpzIHNoaW1taW5nIGVkZ2UuJyk7XG4gICAgICAvLyBFeHBvcnQgdG8gdGhlIGFkYXB0ZXIgZ2xvYmFsIG9iamVjdCB2aXNpYmxlIGluIHRoZSBicm93c2VyLlxuICAgICAgbW9kdWxlLmV4cG9ydHMuYnJvd3NlclNoaW0gPSBlZGdlU2hpbTtcblxuICAgICAgZWRnZVNoaW0uc2hpbUdldFVzZXJNZWRpYSgpO1xuICAgICAgZWRnZVNoaW0uc2hpbVBlZXJDb25uZWN0aW9uKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzYWZhcmknOlxuICAgICAgaWYgKCFzYWZhcmlTaGltKSB7XG4gICAgICAgIGxvZ2dpbmcoJ1NhZmFyaSBzaGltIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGlzIGFkYXB0ZXIgcmVsZWFzZS4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbG9nZ2luZygnYWRhcHRlci5qcyBzaGltbWluZyBzYWZhcmkuJyk7XG4gICAgICAvLyBFeHBvcnQgdG8gdGhlIGFkYXB0ZXIgZ2xvYmFsIG9iamVjdCB2aXNpYmxlIGluIHRoZSBicm93c2VyLlxuICAgICAgbW9kdWxlLmV4cG9ydHMuYnJvd3NlclNoaW0gPSBzYWZhcmlTaGltO1xuXG4gICAgICBzYWZhcmlTaGltLnNoaW1HZXRVc2VyTWVkaWEoKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBsb2dnaW5nKCdVbnN1cHBvcnRlZCBicm93c2VyIScpO1xuICB9XG59KSgpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvY2FsbWVkaWEvfi93ZWJydGMtYWRhcHRlci9zcmMvanMvYWRhcHRlcl9jb3JlLmpzXG4vLyBtb2R1bGUgaWQgPSA0NDdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 448 */
/***/ function(module, exports) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar logDisabled_ = true;\n\n// Utility methods.\nvar utils = {\n  disableLog: function(bool) {\n    if (typeof bool !== 'boolean') {\n      return new Error('Argument type: ' + typeof bool +\n          '. Please use a boolean.');\n    }\n    logDisabled_ = bool;\n    return (bool) ? 'adapter.js logging disabled' :\n        'adapter.js logging enabled';\n  },\n\n  log: function() {\n    if (typeof window === 'object') {\n      if (logDisabled_) {\n        return;\n      }\n      if (typeof console !== 'undefined' && typeof console.log === 'function') {\n        console.log.apply(console, arguments);\n      }\n    }\n  },\n\n  /**\n   * Extract browser version out of the provided user agent string.\n   *\n   * @param {!string} uastring userAgent string.\n   * @param {!string} expr Regular expression used as match criteria.\n   * @param {!number} pos position in the version string to be returned.\n   * @return {!number} browser version.\n   */\n  extractVersion: function(uastring, expr, pos) {\n    var match = uastring.match(expr);\n    return match && match.length >= pos && parseInt(match[pos], 10);\n  },\n\n  /**\n   * Browser detector.\n   *\n   * @return {object} result containing browser, version and minVersion\n   *     properties.\n   */\n  detectBrowser: function() {\n    // Returned result object.\n    var result = {};\n    result.browser = null;\n    result.version = null;\n    result.minVersion = null;\n\n    // Fail early if it's not a browser\n    if (typeof window === 'undefined' || !window.navigator) {\n      result.browser = 'Not a browser.';\n      return result;\n    }\n\n    // Firefox.\n    if (navigator.mozGetUserMedia) {\n      result.browser = 'firefox';\n      result.version = this.extractVersion(navigator.userAgent,\n          /Firefox\\/([0-9]+)\\./, 1);\n      result.minVersion = 31;\n\n    // all webkit-based browsers\n    } else if (navigator.webkitGetUserMedia) {\n      // Chrome, Chromium, Webview, Opera, all use the chrome shim for now\n      if (window.webkitRTCPeerConnection) {\n        result.browser = 'chrome';\n        result.version = this.extractVersion(navigator.userAgent,\n          /Chrom(e|ium)\\/([0-9]+)\\./, 2);\n        result.minVersion = 38;\n\n      // Safari or unknown webkit-based\n      // for the time being Safari has support for MediaStreams but not webRTC\n      } else {\n        // Safari UA substrings of interest for reference:\n        // - webkit version:           AppleWebKit/602.1.25 (also used in Op,Cr)\n        // - safari UI version:        Version/9.0.3 (unique to Safari)\n        // - safari UI webkit version: Safari/601.4.4 (also used in Op,Cr)\n        //\n        // if the webkit version and safari UI webkit versions are equals,\n        // ... this is a stable version.\n        //\n        // only the internal webkit version is important today to know if\n        // media streams are supported\n        //\n        if (navigator.userAgent.match(/Version\\/(\\d+).(\\d+)/)) {\n          result.browser = 'safari';\n          result.version = this.extractVersion(navigator.userAgent,\n            /AppleWebKit\\/([0-9]+)\\./, 1);\n          result.minVersion = 602;\n\n        // unknown webkit-based browser\n        } else {\n          result.browser = 'Unsupported webkit-based browser ' +\n              'with GUM support but no WebRTC support.';\n          return result;\n        }\n      }\n\n    // Edge.\n    } else if (navigator.mediaDevices &&\n        navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)) {\n      result.browser = 'edge';\n      result.version = this.extractVersion(navigator.userAgent,\n          /Edge\\/(\\d+).(\\d+)$/, 2);\n      result.minVersion = 10547;\n\n    // Default fallthrough: not supported.\n    } else {\n      result.browser = 'Not a supported browser.';\n      return result;\n    }\n\n    // Warn if version is less than minVersion.\n    if (result.version < result.minVersion) {\n      utils.log('Browser: ' + result.browser + ' Version: ' + result.version +\n          ' < minimum supported version: ' + result.minVersion +\n          '\\n some things might not work!');\n    }\n\n    return result;\n  }\n};\n\n// Export.\nmodule.exports = {\n  log: utils.log,\n  disableLog: utils.disableLog,\n  browserDetails: utils.detectBrowser(),\n  extractVersion: utils.extractVersion\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQ4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2NhbG1lZGlhL25vZGVfbW9kdWxlcy93ZWJydGMtYWRhcHRlci9zcmMvanMvdXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqICBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFdlYlJUQyBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2VcbiAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2VcbiAqICB0cmVlLlxuICovXG4gLyogZXNsaW50LWVudiBub2RlICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBsb2dEaXNhYmxlZF8gPSB0cnVlO1xuXG4vLyBVdGlsaXR5IG1ldGhvZHMuXG52YXIgdXRpbHMgPSB7XG4gIGRpc2FibGVMb2c6IGZ1bmN0aW9uKGJvb2wpIHtcbiAgICBpZiAodHlwZW9mIGJvb2wgIT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcignQXJndW1lbnQgdHlwZTogJyArIHR5cGVvZiBib29sICtcbiAgICAgICAgICAnLiBQbGVhc2UgdXNlIGEgYm9vbGVhbi4nKTtcbiAgICB9XG4gICAgbG9nRGlzYWJsZWRfID0gYm9vbDtcbiAgICByZXR1cm4gKGJvb2wpID8gJ2FkYXB0ZXIuanMgbG9nZ2luZyBkaXNhYmxlZCcgOlxuICAgICAgICAnYWRhcHRlci5qcyBsb2dnaW5nIGVuYWJsZWQnO1xuICB9LFxuXG4gIGxvZzogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAobG9nRGlzYWJsZWRfKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUubG9nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGJyb3dzZXIgdmVyc2lvbiBvdXQgb2YgdGhlIHByb3ZpZGVkIHVzZXIgYWdlbnQgc3RyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0geyFzdHJpbmd9IHVhc3RyaW5nIHVzZXJBZ2VudCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7IXN0cmluZ30gZXhwciBSZWd1bGFyIGV4cHJlc3Npb24gdXNlZCBhcyBtYXRjaCBjcml0ZXJpYS5cbiAgICogQHBhcmFtIHshbnVtYmVyfSBwb3MgcG9zaXRpb24gaW4gdGhlIHZlcnNpb24gc3RyaW5nIHRvIGJlIHJldHVybmVkLlxuICAgKiBAcmV0dXJuIHshbnVtYmVyfSBicm93c2VyIHZlcnNpb24uXG4gICAqL1xuICBleHRyYWN0VmVyc2lvbjogZnVuY3Rpb24odWFzdHJpbmcsIGV4cHIsIHBvcykge1xuICAgIHZhciBtYXRjaCA9IHVhc3RyaW5nLm1hdGNoKGV4cHIpO1xuICAgIHJldHVybiBtYXRjaCAmJiBtYXRjaC5sZW5ndGggPj0gcG9zICYmIHBhcnNlSW50KG1hdGNoW3Bvc10sIDEwKTtcbiAgfSxcblxuICAvKipcbiAgICogQnJvd3NlciBkZXRlY3Rvci5cbiAgICpcbiAgICogQHJldHVybiB7b2JqZWN0fSByZXN1bHQgY29udGFpbmluZyBicm93c2VyLCB2ZXJzaW9uIGFuZCBtaW5WZXJzaW9uXG4gICAqICAgICBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgZGV0ZWN0QnJvd3NlcjogZnVuY3Rpb24oKSB7XG4gICAgLy8gUmV0dXJuZWQgcmVzdWx0IG9iamVjdC5cbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgcmVzdWx0LmJyb3dzZXIgPSBudWxsO1xuICAgIHJlc3VsdC52ZXJzaW9uID0gbnVsbDtcbiAgICByZXN1bHQubWluVmVyc2lvbiA9IG51bGw7XG5cbiAgICAvLyBGYWlsIGVhcmx5IGlmIGl0J3Mgbm90IGEgYnJvd3NlclxuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCAhd2luZG93Lm5hdmlnYXRvcikge1xuICAgICAgcmVzdWx0LmJyb3dzZXIgPSAnTm90IGEgYnJvd3Nlci4nO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBGaXJlZm94LlxuICAgIGlmIChuYXZpZ2F0b3IubW96R2V0VXNlck1lZGlhKSB7XG4gICAgICByZXN1bHQuYnJvd3NlciA9ICdmaXJlZm94JztcbiAgICAgIHJlc3VsdC52ZXJzaW9uID0gdGhpcy5leHRyYWN0VmVyc2lvbihuYXZpZ2F0b3IudXNlckFnZW50LFxuICAgICAgICAgIC9GaXJlZm94XFwvKFswLTldKylcXC4vLCAxKTtcbiAgICAgIHJlc3VsdC5taW5WZXJzaW9uID0gMzE7XG5cbiAgICAvLyBhbGwgd2Via2l0LWJhc2VkIGJyb3dzZXJzXG4gICAgfSBlbHNlIGlmIChuYXZpZ2F0b3Iud2Via2l0R2V0VXNlck1lZGlhKSB7XG4gICAgICAvLyBDaHJvbWUsIENocm9taXVtLCBXZWJ2aWV3LCBPcGVyYSwgYWxsIHVzZSB0aGUgY2hyb21lIHNoaW0gZm9yIG5vd1xuICAgICAgaWYgKHdpbmRvdy53ZWJraXRSVENQZWVyQ29ubmVjdGlvbikge1xuICAgICAgICByZXN1bHQuYnJvd3NlciA9ICdjaHJvbWUnO1xuICAgICAgICByZXN1bHQudmVyc2lvbiA9IHRoaXMuZXh0cmFjdFZlcnNpb24obmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICAgICAgICAvQ2hyb20oZXxpdW0pXFwvKFswLTldKylcXC4vLCAyKTtcbiAgICAgICAgcmVzdWx0Lm1pblZlcnNpb24gPSAzODtcblxuICAgICAgLy8gU2FmYXJpIG9yIHVua25vd24gd2Via2l0LWJhc2VkXG4gICAgICAvLyBmb3IgdGhlIHRpbWUgYmVpbmcgU2FmYXJpIGhhcyBzdXBwb3J0IGZvciBNZWRpYVN0cmVhbXMgYnV0IG5vdCB3ZWJSVENcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNhZmFyaSBVQSBzdWJzdHJpbmdzIG9mIGludGVyZXN0IGZvciByZWZlcmVuY2U6XG4gICAgICAgIC8vIC0gd2Via2l0IHZlcnNpb246ICAgICAgICAgICBBcHBsZVdlYktpdC82MDIuMS4yNSAoYWxzbyB1c2VkIGluIE9wLENyKVxuICAgICAgICAvLyAtIHNhZmFyaSBVSSB2ZXJzaW9uOiAgICAgICAgVmVyc2lvbi85LjAuMyAodW5pcXVlIHRvIFNhZmFyaSlcbiAgICAgICAgLy8gLSBzYWZhcmkgVUkgd2Via2l0IHZlcnNpb246IFNhZmFyaS82MDEuNC40IChhbHNvIHVzZWQgaW4gT3AsQ3IpXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGlmIHRoZSB3ZWJraXQgdmVyc2lvbiBhbmQgc2FmYXJpIFVJIHdlYmtpdCB2ZXJzaW9ucyBhcmUgZXF1YWxzLFxuICAgICAgICAvLyAuLi4gdGhpcyBpcyBhIHN0YWJsZSB2ZXJzaW9uLlxuICAgICAgICAvL1xuICAgICAgICAvLyBvbmx5IHRoZSBpbnRlcm5hbCB3ZWJraXQgdmVyc2lvbiBpcyBpbXBvcnRhbnQgdG9kYXkgdG8ga25vdyBpZlxuICAgICAgICAvLyBtZWRpYSBzdHJlYW1zIGFyZSBzdXBwb3J0ZWRcbiAgICAgICAgLy9cbiAgICAgICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1ZlcnNpb25cXC8oXFxkKykuKFxcZCspLykpIHtcbiAgICAgICAgICByZXN1bHQuYnJvd3NlciA9ICdzYWZhcmknO1xuICAgICAgICAgIHJlc3VsdC52ZXJzaW9uID0gdGhpcy5leHRyYWN0VmVyc2lvbihuYXZpZ2F0b3IudXNlckFnZW50LFxuICAgICAgICAgICAgL0FwcGxlV2ViS2l0XFwvKFswLTldKylcXC4vLCAxKTtcbiAgICAgICAgICByZXN1bHQubWluVmVyc2lvbiA9IDYwMjtcblxuICAgICAgICAvLyB1bmtub3duIHdlYmtpdC1iYXNlZCBicm93c2VyXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0LmJyb3dzZXIgPSAnVW5zdXBwb3J0ZWQgd2Via2l0LWJhc2VkIGJyb3dzZXIgJyArXG4gICAgICAgICAgICAgICd3aXRoIEdVTSBzdXBwb3J0IGJ1dCBubyBXZWJSVEMgc3VwcG9ydC4nO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIC8vIEVkZ2UuXG4gICAgfSBlbHNlIGlmIChuYXZpZ2F0b3IubWVkaWFEZXZpY2VzICYmXG4gICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0VkZ2VcXC8oXFxkKykuKFxcZCspJC8pKSB7XG4gICAgICByZXN1bHQuYnJvd3NlciA9ICdlZGdlJztcbiAgICAgIHJlc3VsdC52ZXJzaW9uID0gdGhpcy5leHRyYWN0VmVyc2lvbihuYXZpZ2F0b3IudXNlckFnZW50LFxuICAgICAgICAgIC9FZGdlXFwvKFxcZCspLihcXGQrKSQvLCAyKTtcbiAgICAgIHJlc3VsdC5taW5WZXJzaW9uID0gMTA1NDc7XG5cbiAgICAvLyBEZWZhdWx0IGZhbGx0aHJvdWdoOiBub3Qgc3VwcG9ydGVkLlxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQuYnJvd3NlciA9ICdOb3QgYSBzdXBwb3J0ZWQgYnJvd3Nlci4nO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBXYXJuIGlmIHZlcnNpb24gaXMgbGVzcyB0aGFuIG1pblZlcnNpb24uXG4gICAgaWYgKHJlc3VsdC52ZXJzaW9uIDwgcmVzdWx0Lm1pblZlcnNpb24pIHtcbiAgICAgIHV0aWxzLmxvZygnQnJvd3NlcjogJyArIHJlc3VsdC5icm93c2VyICsgJyBWZXJzaW9uOiAnICsgcmVzdWx0LnZlcnNpb24gK1xuICAgICAgICAgICcgPCBtaW5pbXVtIHN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgcmVzdWx0Lm1pblZlcnNpb24gK1xuICAgICAgICAgICdcXG4gc29tZSB0aGluZ3MgbWlnaHQgbm90IHdvcmshJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcblxuLy8gRXhwb3J0LlxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGxvZzogdXRpbHMubG9nLFxuICBkaXNhYmxlTG9nOiB1dGlscy5kaXNhYmxlTG9nLFxuICBicm93c2VyRGV0YWlsczogdXRpbHMuZGV0ZWN0QnJvd3NlcigpLFxuICBleHRyYWN0VmVyc2lvbjogdXRpbHMuZXh0cmFjdFZlcnNpb25cbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9jYWxtZWRpYS9+L3dlYnJ0Yy1hZGFwdGVyL3NyYy9qcy91dGlscy5qc1xuLy8gbW9kdWxlIGlkID0gNDQ4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 449 */
/***/ function(module, exports, __webpack_require__) {

    eval("\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\nvar logging = __webpack_require__(448).log;\nvar browserDetails = __webpack_require__(448).browserDetails;\n\nvar chromeShim = {\n  shimMediaStream: function() {\n    window.MediaStream = window.MediaStream || window.webkitMediaStream;\n  },\n\n  shimOnTrack: function() {\n    if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n        window.RTCPeerConnection.prototype)) {\n      Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n        get: function() {\n          return this._ontrack;\n        },\n        set: function(f) {\n          var self = this;\n          if (this._ontrack) {\n            this.removeEventListener('track', this._ontrack);\n            this.removeEventListener('addstream', this._ontrackpoly);\n          }\n          this.addEventListener('track', this._ontrack = f);\n          this.addEventListener('addstream', this._ontrackpoly = function(e) {\n            // onaddstream does not fire when a track is added to an existing\n            // stream. But stream.onaddtrack is implemented so we use that.\n            e.stream.addEventListener('addtrack', function(te) {\n              var event = new Event('track');\n              event.track = te.track;\n              event.receiver = {track: te.track};\n              event.streams = [e.stream];\n              self.dispatchEvent(event);\n            });\n            e.stream.getTracks().forEach(function(track) {\n              var event = new Event('track');\n              event.track = track;\n              event.receiver = {track: track};\n              event.streams = [e.stream];\n              this.dispatchEvent(event);\n            }.bind(this));\n          }.bind(this));\n        }\n      });\n    }\n  },\n\n  shimSourceObject: function() {\n    if (typeof window === 'object') {\n      if (window.HTMLMediaElement &&\n        !('srcObject' in window.HTMLMediaElement.prototype)) {\n        // Shim the srcObject property, once, when HTMLMediaElement is found.\n        Object.defineProperty(window.HTMLMediaElement.prototype, 'srcObject', {\n          get: function() {\n            return this._srcObject;\n          },\n          set: function(stream) {\n            var self = this;\n            // Use _srcObject as a private property for this shim\n            this._srcObject = stream;\n            if (this.src) {\n              URL.revokeObjectURL(this.src);\n            }\n\n            if (!stream) {\n              this.src = '';\n              return;\n            }\n            this.src = URL.createObjectURL(stream);\n            // We need to recreate the blob url when a track is added or\n            // removed. Doing it manually since we want to avoid a recursion.\n            stream.addEventListener('addtrack', function() {\n              if (self.src) {\n                URL.revokeObjectURL(self.src);\n              }\n              self.src = URL.createObjectURL(stream);\n            });\n            stream.addEventListener('removetrack', function() {\n              if (self.src) {\n                URL.revokeObjectURL(self.src);\n              }\n              self.src = URL.createObjectURL(stream);\n            });\n          }\n        });\n      }\n    }\n  },\n\n  shimPeerConnection: function() {\n    // The RTCPeerConnection object.\n    window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n      // Translate iceTransportPolicy to iceTransports,\n      // see https://code.google.com/p/webrtc/issues/detail?id=4869\n      logging('PeerConnection');\n      if (pcConfig && pcConfig.iceTransportPolicy) {\n        pcConfig.iceTransports = pcConfig.iceTransportPolicy;\n      }\n\n      var pc = new webkitRTCPeerConnection(pcConfig, pcConstraints);\n      var origGetStats = pc.getStats.bind(pc);\n      pc.getStats = function(selector, successCallback, errorCallback) {\n        var self = this;\n        var args = arguments;\n\n        // If selector is a function then we are in the old style stats so just\n        // pass back the original getStats format to avoid breaking old users.\n        if (arguments.length > 0 && typeof selector === 'function') {\n          return origGetStats(selector, successCallback);\n        }\n\n        var fixChromeStats_ = function(response) {\n          var standardReport = {};\n          var reports = response.result();\n          reports.forEach(function(report) {\n            var standardStats = {\n              id: report.id,\n              timestamp: report.timestamp,\n              type: report.type\n            };\n            report.names().forEach(function(name) {\n              standardStats[name] = report.stat(name);\n            });\n            standardReport[standardStats.id] = standardStats;\n          });\n\n          return standardReport;\n        };\n\n        // shim getStats with maplike support\n        var makeMapStats = function(stats, legacyStats) {\n          var map = new Map(Object.keys(stats).map(function(key) {\n            return[key, stats[key]];\n          }));\n          legacyStats = legacyStats || stats;\n          Object.keys(legacyStats).forEach(function(key) {\n            map[key] = legacyStats[key];\n          });\n          return map;\n        };\n\n        if (arguments.length >= 2) {\n          var successCallbackWrapper_ = function(response) {\n            args[1](makeMapStats(fixChromeStats_(response)));\n          };\n\n          return origGetStats.apply(this, [successCallbackWrapper_,\n              arguments[0]]);\n        }\n\n        // promise-support\n        return new Promise(function(resolve, reject) {\n          if (args.length === 1 && typeof selector === 'object') {\n            origGetStats.apply(self, [\n              function(response) {\n                resolve(makeMapStats(fixChromeStats_(response)));\n              }, reject]);\n          } else {\n            // Preserve legacy chrome stats only on legacy access of stats obj\n            origGetStats.apply(self, [\n              function(response) {\n                resolve(makeMapStats(fixChromeStats_(response),\n                    response.result()));\n              }, reject]);\n          }\n        }).then(successCallback, errorCallback);\n      };\n\n      return pc;\n    };\n    window.RTCPeerConnection.prototype = webkitRTCPeerConnection.prototype;\n\n    // wrap static methods. Currently just generateCertificate.\n    if (webkitRTCPeerConnection.generateCertificate) {\n      Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n        get: function() {\n          return webkitRTCPeerConnection.generateCertificate;\n        }\n      });\n    }\n\n    ['createOffer', 'createAnswer'].forEach(function(method) {\n      var nativeMethod = webkitRTCPeerConnection.prototype[method];\n      webkitRTCPeerConnection.prototype[method] = function() {\n        var self = this;\n        if (arguments.length < 1 || (arguments.length === 1 &&\n            typeof arguments[0] === 'object')) {\n          var opts = arguments.length === 1 ? arguments[0] : undefined;\n          return new Promise(function(resolve, reject) {\n            nativeMethod.apply(self, [resolve, reject, opts]);\n          });\n        }\n        return nativeMethod.apply(this, arguments);\n      };\n    });\n\n    // add promise support -- natively available in Chrome 51\n    if (browserDetails.version < 51) {\n      ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n          .forEach(function(method) {\n            var nativeMethod = webkitRTCPeerConnection.prototype[method];\n            webkitRTCPeerConnection.prototype[method] = function() {\n              var args = arguments;\n              var self = this;\n              var promise = new Promise(function(resolve, reject) {\n                nativeMethod.apply(self, [args[0], resolve, reject]);\n              });\n              if (args.length < 2) {\n                return promise;\n              }\n              return promise.then(function() {\n                args[1].apply(null, []);\n              },\n              function(err) {\n                if (args.length >= 3) {\n                  args[2].apply(null, [err]);\n                }\n              });\n            };\n          });\n    }\n\n    // support for addIceCandidate(null)\n    var nativeAddIceCandidate =\n        RTCPeerConnection.prototype.addIceCandidate;\n    RTCPeerConnection.prototype.addIceCandidate = function() {\n      return arguments[0] === null ? Promise.resolve()\n          : nativeAddIceCandidate.apply(this, arguments);\n    };\n\n    // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n    ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n        .forEach(function(method) {\n          var nativeMethod = webkitRTCPeerConnection.prototype[method];\n          webkitRTCPeerConnection.prototype[method] = function() {\n            arguments[0] = new ((method === 'addIceCandidate') ?\n                RTCIceCandidate : RTCSessionDescription)(arguments[0]);\n            return nativeMethod.apply(this, arguments);\n          };\n        });\n  },\n\n  // Attach a media stream to an element.\n  attachMediaStream: function(element, stream) {\n    logging('DEPRECATED, attachMediaStream will soon be removed.');\n    if (browserDetails.version >= 43) {\n      element.srcObject = stream;\n    } else if (typeof element.src !== 'undefined') {\n      element.src = URL.createObjectURL(stream);\n    } else {\n      logging('Error attaching stream to element.');\n    }\n  },\n\n  reattachMediaStream: function(to, from) {\n    logging('DEPRECATED, reattachMediaStream will soon be removed.');\n    if (browserDetails.version >= 43) {\n      to.srcObject = from.srcObject;\n    } else {\n      to.src = from.src;\n    }\n  }\n};\n\n\n// Expose public methods.\nmodule.exports = {\n  shimMediaStream: chromeShim.shimMediaStream,\n  shimOnTrack: chromeShim.shimOnTrack,\n  shimSourceObject: chromeShim.shimSourceObject,\n  shimPeerConnection: chromeShim.shimPeerConnection,\n  shimGetUserMedia: __webpack_require__(450),\n  attachMediaStream: chromeShim.attachMediaStream,\n  reattachMediaStream: chromeShim.reattachMediaStream\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQ5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2NhbG1lZGlhL25vZGVfbW9kdWxlcy93ZWJydGMtYWRhcHRlci9zcmMvanMvY2hyb21lL2Nocm9tZV9zaGltLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlxuLypcbiAqICBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFdlYlJUQyBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2VcbiAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2VcbiAqICB0cmVlLlxuICovXG4gLyogZXNsaW50LWVudiBub2RlICovXG4ndXNlIHN0cmljdCc7XG52YXIgbG9nZ2luZyA9IHJlcXVpcmUoJy4uL3V0aWxzLmpzJykubG9nO1xudmFyIGJyb3dzZXJEZXRhaWxzID0gcmVxdWlyZSgnLi4vdXRpbHMuanMnKS5icm93c2VyRGV0YWlscztcblxudmFyIGNocm9tZVNoaW0gPSB7XG4gIHNoaW1NZWRpYVN0cmVhbTogZnVuY3Rpb24oKSB7XG4gICAgd2luZG93Lk1lZGlhU3RyZWFtID0gd2luZG93Lk1lZGlhU3RyZWFtIHx8IHdpbmRvdy53ZWJraXRNZWRpYVN0cmVhbTtcbiAgfSxcblxuICBzaGltT25UcmFjazogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnICYmIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbiAmJiAhKCdvbnRyYWNrJyBpblxuICAgICAgICB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUsICdvbnRyYWNrJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9vbnRyYWNrO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uKGYpIHtcbiAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgaWYgKHRoaXMuX29udHJhY2spIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHJhY2snLCB0aGlzLl9vbnRyYWNrKTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWRkc3RyZWFtJywgdGhpcy5fb250cmFja3BvbHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYWNrJywgdGhpcy5fb250cmFjayA9IGYpO1xuICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignYWRkc3RyZWFtJywgdGhpcy5fb250cmFja3BvbHkgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAvLyBvbmFkZHN0cmVhbSBkb2VzIG5vdCBmaXJlIHdoZW4gYSB0cmFjayBpcyBhZGRlZCB0byBhbiBleGlzdGluZ1xuICAgICAgICAgICAgLy8gc3RyZWFtLiBCdXQgc3RyZWFtLm9uYWRkdHJhY2sgaXMgaW1wbGVtZW50ZWQgc28gd2UgdXNlIHRoYXQuXG4gICAgICAgICAgICBlLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdhZGR0cmFjaycsIGZ1bmN0aW9uKHRlKSB7XG4gICAgICAgICAgICAgIHZhciBldmVudCA9IG5ldyBFdmVudCgndHJhY2snKTtcbiAgICAgICAgICAgICAgZXZlbnQudHJhY2sgPSB0ZS50cmFjaztcbiAgICAgICAgICAgICAgZXZlbnQucmVjZWl2ZXIgPSB7dHJhY2s6IHRlLnRyYWNrfTtcbiAgICAgICAgICAgICAgZXZlbnQuc3RyZWFtcyA9IFtlLnN0cmVhbV07XG4gICAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGUuc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goZnVuY3Rpb24odHJhY2spIHtcbiAgICAgICAgICAgICAgdmFyIGV2ZW50ID0gbmV3IEV2ZW50KCd0cmFjaycpO1xuICAgICAgICAgICAgICBldmVudC50cmFjayA9IHRyYWNrO1xuICAgICAgICAgICAgICBldmVudC5yZWNlaXZlciA9IHt0cmFjazogdHJhY2t9O1xuICAgICAgICAgICAgICBldmVudC5zdHJlYW1zID0gW2Uuc3RyZWFtXTtcbiAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIHNoaW1Tb3VyY2VPYmplY3Q6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHdpbmRvdy5IVE1MTWVkaWFFbGVtZW50ICYmXG4gICAgICAgICEoJ3NyY09iamVjdCcgaW4gd2luZG93LkhUTUxNZWRpYUVsZW1lbnQucHJvdG90eXBlKSkge1xuICAgICAgICAvLyBTaGltIHRoZSBzcmNPYmplY3QgcHJvcGVydHksIG9uY2UsIHdoZW4gSFRNTE1lZGlhRWxlbWVudCBpcyBmb3VuZC5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5IVE1MTWVkaWFFbGVtZW50LnByb3RvdHlwZSwgJ3NyY09iamVjdCcsIHtcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NyY09iamVjdDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldDogZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICAvLyBVc2UgX3NyY09iamVjdCBhcyBhIHByaXZhdGUgcHJvcGVydHkgZm9yIHRoaXMgc2hpbVxuICAgICAgICAgICAgdGhpcy5fc3JjT2JqZWN0ID0gc3RyZWFtO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3JjKSB7XG4gICAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodGhpcy5zcmMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXN0cmVhbSkge1xuICAgICAgICAgICAgICB0aGlzLnNyYyA9ICcnO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoc3RyZWFtKTtcbiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlIGJsb2IgdXJsIHdoZW4gYSB0cmFjayBpcyBhZGRlZCBvclxuICAgICAgICAgICAgLy8gcmVtb3ZlZC4gRG9pbmcgaXQgbWFudWFsbHkgc2luY2Ugd2Ugd2FudCB0byBhdm9pZCBhIHJlY3Vyc2lvbi5cbiAgICAgICAgICAgIHN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdhZGR0cmFjaycsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoc2VsZi5zcmMpIHtcbiAgICAgICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHNlbGYuc3JjKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzZWxmLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoc3RyZWFtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3JlbW92ZXRyYWNrJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChzZWxmLnNyYykge1xuICAgICAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoc2VsZi5zcmMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHNlbGYuc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChzdHJlYW0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgc2hpbVBlZXJDb25uZWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAvLyBUaGUgUlRDUGVlckNvbm5lY3Rpb24gb2JqZWN0LlxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKHBjQ29uZmlnLCBwY0NvbnN0cmFpbnRzKSB7XG4gICAgICAvLyBUcmFuc2xhdGUgaWNlVHJhbnNwb3J0UG9saWN5IHRvIGljZVRyYW5zcG9ydHMsXG4gICAgICAvLyBzZWUgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC93ZWJydGMvaXNzdWVzL2RldGFpbD9pZD00ODY5XG4gICAgICBsb2dnaW5nKCdQZWVyQ29ubmVjdGlvbicpO1xuICAgICAgaWYgKHBjQ29uZmlnICYmIHBjQ29uZmlnLmljZVRyYW5zcG9ydFBvbGljeSkge1xuICAgICAgICBwY0NvbmZpZy5pY2VUcmFuc3BvcnRzID0gcGNDb25maWcuaWNlVHJhbnNwb3J0UG9saWN5O1xuICAgICAgfVxuXG4gICAgICB2YXIgcGMgPSBuZXcgd2Via2l0UlRDUGVlckNvbm5lY3Rpb24ocGNDb25maWcsIHBjQ29uc3RyYWludHMpO1xuICAgICAgdmFyIG9yaWdHZXRTdGF0cyA9IHBjLmdldFN0YXRzLmJpbmQocGMpO1xuICAgICAgcGMuZ2V0U3RhdHMgPSBmdW5jdGlvbihzZWxlY3Rvciwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG5cbiAgICAgICAgLy8gSWYgc2VsZWN0b3IgaXMgYSBmdW5jdGlvbiB0aGVuIHdlIGFyZSBpbiB0aGUgb2xkIHN0eWxlIHN0YXRzIHNvIGp1c3RcbiAgICAgICAgLy8gcGFzcyBiYWNrIHRoZSBvcmlnaW5hbCBnZXRTdGF0cyBmb3JtYXQgdG8gYXZvaWQgYnJlYWtpbmcgb2xkIHVzZXJzLlxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdHlwZW9mIHNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIG9yaWdHZXRTdGF0cyhzZWxlY3Rvciwgc3VjY2Vzc0NhbGxiYWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmaXhDaHJvbWVTdGF0c18gPSBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgIHZhciBzdGFuZGFyZFJlcG9ydCA9IHt9O1xuICAgICAgICAgIHZhciByZXBvcnRzID0gcmVzcG9uc2UucmVzdWx0KCk7XG4gICAgICAgICAgcmVwb3J0cy5mb3JFYWNoKGZ1bmN0aW9uKHJlcG9ydCkge1xuICAgICAgICAgICAgdmFyIHN0YW5kYXJkU3RhdHMgPSB7XG4gICAgICAgICAgICAgIGlkOiByZXBvcnQuaWQsXG4gICAgICAgICAgICAgIHRpbWVzdGFtcDogcmVwb3J0LnRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgdHlwZTogcmVwb3J0LnR5cGVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXBvcnQubmFtZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICAgICAgc3RhbmRhcmRTdGF0c1tuYW1lXSA9IHJlcG9ydC5zdGF0KG5hbWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdGFuZGFyZFJlcG9ydFtzdGFuZGFyZFN0YXRzLmlkXSA9IHN0YW5kYXJkU3RhdHM7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gc3RhbmRhcmRSZXBvcnQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gc2hpbSBnZXRTdGF0cyB3aXRoIG1hcGxpa2Ugc3VwcG9ydFxuICAgICAgICB2YXIgbWFrZU1hcFN0YXRzID0gZnVuY3Rpb24oc3RhdHMsIGxlZ2FjeVN0YXRzKSB7XG4gICAgICAgICAgdmFyIG1hcCA9IG5ldyBNYXAoT2JqZWN0LmtleXMoc3RhdHMpLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgIHJldHVybltrZXksIHN0YXRzW2tleV1dO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgICBsZWdhY3lTdGF0cyA9IGxlZ2FjeVN0YXRzIHx8IHN0YXRzO1xuICAgICAgICAgIE9iamVjdC5rZXlzKGxlZ2FjeVN0YXRzKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgICAgbWFwW2tleV0gPSBsZWdhY3lTdGF0c1trZXldO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikge1xuICAgICAgICAgIHZhciBzdWNjZXNzQ2FsbGJhY2tXcmFwcGVyXyA9IGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBhcmdzWzFdKG1ha2VNYXBTdGF0cyhmaXhDaHJvbWVTdGF0c18ocmVzcG9uc2UpKSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHJldHVybiBvcmlnR2V0U3RhdHMuYXBwbHkodGhpcywgW3N1Y2Nlc3NDYWxsYmFja1dyYXBwZXJfLFxuICAgICAgICAgICAgICBhcmd1bWVudHNbMF1dKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHByb21pc2Utc3VwcG9ydFxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIG9yaWdHZXRTdGF0cy5hcHBseShzZWxmLCBbXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShtYWtlTWFwU3RhdHMoZml4Q2hyb21lU3RhdHNfKHJlc3BvbnNlKSkpO1xuICAgICAgICAgICAgICB9LCByZWplY3RdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUHJlc2VydmUgbGVnYWN5IGNocm9tZSBzdGF0cyBvbmx5IG9uIGxlZ2FjeSBhY2Nlc3Mgb2Ygc3RhdHMgb2JqXG4gICAgICAgICAgICBvcmlnR2V0U3RhdHMuYXBwbHkoc2VsZiwgW1xuICAgICAgICAgICAgICBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUobWFrZU1hcFN0YXRzKGZpeENocm9tZVN0YXRzXyhyZXNwb25zZSksXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlc3VsdCgpKSk7XG4gICAgICAgICAgICAgIH0sIHJlamVjdF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkudGhlbihzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHBjO1xuICAgIH07XG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZSA9IHdlYmtpdFJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZTtcblxuICAgIC8vIHdyYXAgc3RhdGljIG1ldGhvZHMuIEN1cnJlbnRseSBqdXN0IGdlbmVyYXRlQ2VydGlmaWNhdGUuXG4gICAgaWYgKHdlYmtpdFJUQ1BlZXJDb25uZWN0aW9uLmdlbmVyYXRlQ2VydGlmaWNhdGUpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24sICdnZW5lcmF0ZUNlcnRpZmljYXRlJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiB3ZWJraXRSVENQZWVyQ29ubmVjdGlvbi5nZW5lcmF0ZUNlcnRpZmljYXRlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBbJ2NyZWF0ZU9mZmVyJywgJ2NyZWF0ZUFuc3dlciddLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICB2YXIgbmF0aXZlTWV0aG9kID0gd2Via2l0UlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlW21ldGhvZF07XG4gICAgICB3ZWJraXRSVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMSB8fCAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgdHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ29iamVjdCcpKSB7XG4gICAgICAgICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkO1xuICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIG5hdGl2ZU1ldGhvZC5hcHBseShzZWxmLCBbcmVzb2x2ZSwgcmVqZWN0LCBvcHRzXSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5hdGl2ZU1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIGFkZCBwcm9taXNlIHN1cHBvcnQgLS0gbmF0aXZlbHkgYXZhaWxhYmxlIGluIENocm9tZSA1MVxuICAgIGlmIChicm93c2VyRGV0YWlscy52ZXJzaW9uIDwgNTEpIHtcbiAgICAgIFsnc2V0TG9jYWxEZXNjcmlwdGlvbicsICdzZXRSZW1vdGVEZXNjcmlwdGlvbicsICdhZGRJY2VDYW5kaWRhdGUnXVxuICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgICAgICAgdmFyIG5hdGl2ZU1ldGhvZCA9IHdlYmtpdFJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZVttZXRob2RdO1xuICAgICAgICAgICAgd2Via2l0UlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICBuYXRpdmVNZXRob2QuYXBwbHkoc2VsZiwgW2FyZ3NbMF0sIHJlc29sdmUsIHJlamVjdF0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgYXJnc1sxXS5hcHBseShudWxsLCBbXSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+PSAzKSB7XG4gICAgICAgICAgICAgICAgICBhcmdzWzJdLmFwcGx5KG51bGwsIFtlcnJdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBzdXBwb3J0IGZvciBhZGRJY2VDYW5kaWRhdGUobnVsbClcbiAgICB2YXIgbmF0aXZlQWRkSWNlQ2FuZGlkYXRlID1cbiAgICAgICAgUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLmFkZEljZUNhbmRpZGF0ZTtcbiAgICBSVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuYWRkSWNlQ2FuZGlkYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzWzBdID09PSBudWxsID8gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICA6IG5hdGl2ZUFkZEljZUNhbmRpZGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICAvLyBzaGltIGltcGxpY2l0IGNyZWF0aW9uIG9mIFJUQ1Nlc3Npb25EZXNjcmlwdGlvbi9SVENJY2VDYW5kaWRhdGVcbiAgICBbJ3NldExvY2FsRGVzY3JpcHRpb24nLCAnc2V0UmVtb3RlRGVzY3JpcHRpb24nLCAnYWRkSWNlQ2FuZGlkYXRlJ11cbiAgICAgICAgLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICAgICAgdmFyIG5hdGl2ZU1ldGhvZCA9IHdlYmtpdFJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZVttZXRob2RdO1xuICAgICAgICAgIHdlYmtpdFJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBhcmd1bWVudHNbMF0gPSBuZXcgKChtZXRob2QgPT09ICdhZGRJY2VDYW5kaWRhdGUnKSA/XG4gICAgICAgICAgICAgICAgUlRDSWNlQ2FuZGlkYXRlIDogUlRDU2Vzc2lvbkRlc2NyaXB0aW9uKShhcmd1bWVudHNbMF0pO1xuICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZU1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICB9LFxuXG4gIC8vIEF0dGFjaCBhIG1lZGlhIHN0cmVhbSB0byBhbiBlbGVtZW50LlxuICBhdHRhY2hNZWRpYVN0cmVhbTogZnVuY3Rpb24oZWxlbWVudCwgc3RyZWFtKSB7XG4gICAgbG9nZ2luZygnREVQUkVDQVRFRCwgYXR0YWNoTWVkaWFTdHJlYW0gd2lsbCBzb29uIGJlIHJlbW92ZWQuJyk7XG4gICAgaWYgKGJyb3dzZXJEZXRhaWxzLnZlcnNpb24gPj0gNDMpIHtcbiAgICAgIGVsZW1lbnQuc3JjT2JqZWN0ID0gc3RyZWFtO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnQuc3JjICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZWxlbWVudC5zcmMgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKHN0cmVhbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dpbmcoJ0Vycm9yIGF0dGFjaGluZyBzdHJlYW0gdG8gZWxlbWVudC4nKTtcbiAgICB9XG4gIH0sXG5cbiAgcmVhdHRhY2hNZWRpYVN0cmVhbTogZnVuY3Rpb24odG8sIGZyb20pIHtcbiAgICBsb2dnaW5nKCdERVBSRUNBVEVELCByZWF0dGFjaE1lZGlhU3RyZWFtIHdpbGwgc29vbiBiZSByZW1vdmVkLicpO1xuICAgIGlmIChicm93c2VyRGV0YWlscy52ZXJzaW9uID49IDQzKSB7XG4gICAgICB0by5zcmNPYmplY3QgPSBmcm9tLnNyY09iamVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdG8uc3JjID0gZnJvbS5zcmM7XG4gICAgfVxuICB9XG59O1xuXG5cbi8vIEV4cG9zZSBwdWJsaWMgbWV0aG9kcy5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzaGltTWVkaWFTdHJlYW06IGNocm9tZVNoaW0uc2hpbU1lZGlhU3RyZWFtLFxuICBzaGltT25UcmFjazogY2hyb21lU2hpbS5zaGltT25UcmFjayxcbiAgc2hpbVNvdXJjZU9iamVjdDogY2hyb21lU2hpbS5zaGltU291cmNlT2JqZWN0LFxuICBzaGltUGVlckNvbm5lY3Rpb246IGNocm9tZVNoaW0uc2hpbVBlZXJDb25uZWN0aW9uLFxuICBzaGltR2V0VXNlck1lZGlhOiByZXF1aXJlKCcuL2dldHVzZXJtZWRpYScpLFxuICBhdHRhY2hNZWRpYVN0cmVhbTogY2hyb21lU2hpbS5hdHRhY2hNZWRpYVN0cmVhbSxcbiAgcmVhdHRhY2hNZWRpYVN0cmVhbTogY2hyb21lU2hpbS5yZWF0dGFjaE1lZGlhU3RyZWFtXG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvY2FsbWVkaWEvfi93ZWJydGMtYWRhcHRlci9zcmMvanMvY2hyb21lL2Nocm9tZV9zaGltLmpzXG4vLyBtb2R1bGUgaWQgPSA0NDlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 450 */
/***/ function(module, exports, __webpack_require__) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\nvar logging = __webpack_require__(448).log;\n\n// Expose public methods.\nmodule.exports = function() {\n  var constraintsToChrome_ = function(c) {\n    if (typeof c !== 'object' || c.mandatory || c.optional) {\n      return c;\n    }\n    var cc = {};\n    Object.keys(c).forEach(function(key) {\n      if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n        return;\n      }\n      var r = (typeof c[key] === 'object') ? c[key] : {ideal: c[key]};\n      if (r.exact !== undefined && typeof r.exact === 'number') {\n        r.min = r.max = r.exact;\n      }\n      var oldname_ = function(prefix, name) {\n        if (prefix) {\n          return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n        }\n        return (name === 'deviceId') ? 'sourceId' : name;\n      };\n      if (r.ideal !== undefined) {\n        cc.optional = cc.optional || [];\n        var oc = {};\n        if (typeof r.ideal === 'number') {\n          oc[oldname_('min', key)] = r.ideal;\n          cc.optional.push(oc);\n          oc = {};\n          oc[oldname_('max', key)] = r.ideal;\n          cc.optional.push(oc);\n        } else {\n          oc[oldname_('', key)] = r.ideal;\n          cc.optional.push(oc);\n        }\n      }\n      if (r.exact !== undefined && typeof r.exact !== 'number') {\n        cc.mandatory = cc.mandatory || {};\n        cc.mandatory[oldname_('', key)] = r.exact;\n      } else {\n        ['min', 'max'].forEach(function(mix) {\n          if (r[mix] !== undefined) {\n            cc.mandatory = cc.mandatory || {};\n            cc.mandatory[oldname_(mix, key)] = r[mix];\n          }\n        });\n      }\n    });\n    if (c.advanced) {\n      cc.optional = (cc.optional || []).concat(c.advanced);\n    }\n    return cc;\n  };\n\n  var shimConstraints_ = function(constraints, func) {\n    constraints = JSON.parse(JSON.stringify(constraints));\n    if (constraints && constraints.audio) {\n      constraints.audio = constraintsToChrome_(constraints.audio);\n    }\n    if (constraints && typeof constraints.video === 'object') {\n      // Shim facingMode for mobile, where it defaults to \"user\".\n      var face = constraints.video.facingMode;\n      face = face && ((typeof face === 'object') ? face : {ideal: face});\n\n      if ((face && (face.exact === 'user' || face.exact === 'environment' ||\n                    face.ideal === 'user' || face.ideal === 'environment')) &&\n          !(navigator.mediaDevices.getSupportedConstraints &&\n            navigator.mediaDevices.getSupportedConstraints().facingMode)) {\n        delete constraints.video.facingMode;\n        if (face.exact === 'environment' || face.ideal === 'environment') {\n          // Look for \"back\" in label, or use last cam (typically back cam).\n          return navigator.mediaDevices.enumerateDevices()\n          .then(function(devices) {\n            devices = devices.filter(function(d) {\n              return d.kind === 'videoinput';\n            });\n            var back = devices.find(function(d) {\n              return d.label.toLowerCase().indexOf('back') !== -1;\n            }) || (devices.length && devices[devices.length - 1]);\n            if (back) {\n              constraints.video.deviceId = face.exact ? {exact: back.deviceId} :\n                                                        {ideal: back.deviceId};\n            }\n            constraints.video = constraintsToChrome_(constraints.video);\n            logging('chrome: ' + JSON.stringify(constraints));\n            return func(constraints);\n          });\n        }\n      }\n      constraints.video = constraintsToChrome_(constraints.video);\n    }\n    logging('chrome: ' + JSON.stringify(constraints));\n    return func(constraints);\n  };\n\n  var shimError_ = function(e) {\n    return {\n      name: {\n        PermissionDeniedError: 'NotAllowedError',\n        ConstraintNotSatisfiedError: 'OverconstrainedError'\n      }[e.name] || e.name,\n      message: e.message,\n      constraint: e.constraintName,\n      toString: function() {\n        return this.name + (this.message && ': ') + this.message;\n      }\n    };\n  };\n\n  var getUserMedia_ = function(constraints, onSuccess, onError) {\n    shimConstraints_(constraints, function(c) {\n      navigator.webkitGetUserMedia(c, onSuccess, function(e) {\n        onError(shimError_(e));\n      });\n    });\n  };\n\n  navigator.getUserMedia = getUserMedia_;\n\n  // Returns the result of getUserMedia as a Promise.\n  var getUserMediaPromise_ = function(constraints) {\n    return new Promise(function(resolve, reject) {\n      navigator.getUserMedia(constraints, resolve, reject);\n    });\n  };\n\n  if (!navigator.mediaDevices) {\n    navigator.mediaDevices = {\n      getUserMedia: getUserMediaPromise_,\n      enumerateDevices: function() {\n        return new Promise(function(resolve) {\n          var kinds = {audio: 'audioinput', video: 'videoinput'};\n          return MediaStreamTrack.getSources(function(devices) {\n            resolve(devices.map(function(device) {\n              return {label: device.label,\n                      kind: kinds[device.kind],\n                      deviceId: device.id,\n                      groupId: ''};\n            }));\n          });\n        });\n      }\n    };\n  }\n\n  // A shim for getUserMedia method on the mediaDevices object.\n  // TODO(KaptenJansson) remove once implemented in Chrome stable.\n  if (!navigator.mediaDevices.getUserMedia) {\n    navigator.mediaDevices.getUserMedia = function(constraints) {\n      return getUserMediaPromise_(constraints);\n    };\n  } else {\n    // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n    // function which returns a Promise, it does not accept spec-style\n    // constraints.\n    var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n        bind(navigator.mediaDevices);\n    navigator.mediaDevices.getUserMedia = function(cs) {\n      return shimConstraints_(cs, function(c) {\n        return origGetUserMedia(c).catch(function(e) {\n          return Promise.reject(shimError_(e));\n        });\n      });\n    };\n  }\n\n  // Dummy devicechange event methods.\n  // TODO(KaptenJansson) remove once implemented in Chrome stable.\n  if (typeof navigator.mediaDevices.addEventListener === 'undefined') {\n    navigator.mediaDevices.addEventListener = function() {\n      logging('Dummy mediaDevices.addEventListener called.');\n    };\n  }\n  if (typeof navigator.mediaDevices.removeEventListener === 'undefined') {\n    navigator.mediaDevices.removeEventListener = function() {\n      logging('Dummy mediaDevices.removeEventListener called.');\n    };\n  }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDUwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2NhbG1lZGlhL25vZGVfbW9kdWxlcy93ZWJydGMtYWRhcHRlci9zcmMvanMvY2hyb21lL2dldHVzZXJtZWRpYS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogIENvcHlyaWdodCAoYykgMjAxNiBUaGUgV2ViUlRDIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZVxuICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZVxuICogIHRyZWUuXG4gKi9cbiAvKiBlc2xpbnQtZW52IG5vZGUgKi9cbid1c2Ugc3RyaWN0JztcbnZhciBsb2dnaW5nID0gcmVxdWlyZSgnLi4vdXRpbHMuanMnKS5sb2c7XG5cbi8vIEV4cG9zZSBwdWJsaWMgbWV0aG9kcy5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBjb25zdHJhaW50c1RvQ2hyb21lXyA9IGZ1bmN0aW9uKGMpIHtcbiAgICBpZiAodHlwZW9mIGMgIT09ICdvYmplY3QnIHx8IGMubWFuZGF0b3J5IHx8IGMub3B0aW9uYWwpIHtcbiAgICAgIHJldHVybiBjO1xuICAgIH1cbiAgICB2YXIgY2MgPSB7fTtcbiAgICBPYmplY3Qua2V5cyhjKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgaWYgKGtleSA9PT0gJ3JlcXVpcmUnIHx8IGtleSA9PT0gJ2FkdmFuY2VkJyB8fCBrZXkgPT09ICdtZWRpYVNvdXJjZScpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIHIgPSAodHlwZW9mIGNba2V5XSA9PT0gJ29iamVjdCcpID8gY1trZXldIDoge2lkZWFsOiBjW2tleV19O1xuICAgICAgaWYgKHIuZXhhY3QgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygci5leGFjdCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgci5taW4gPSByLm1heCA9IHIuZXhhY3Q7XG4gICAgICB9XG4gICAgICB2YXIgb2xkbmFtZV8gPSBmdW5jdGlvbihwcmVmaXgsIG5hbWUpIHtcbiAgICAgICAgaWYgKHByZWZpeCkge1xuICAgICAgICAgIHJldHVybiBwcmVmaXggKyBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKG5hbWUgPT09ICdkZXZpY2VJZCcpID8gJ3NvdXJjZUlkJyA6IG5hbWU7XG4gICAgICB9O1xuICAgICAgaWYgKHIuaWRlYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjYy5vcHRpb25hbCA9IGNjLm9wdGlvbmFsIHx8IFtdO1xuICAgICAgICB2YXIgb2MgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiByLmlkZWFsID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIG9jW29sZG5hbWVfKCdtaW4nLCBrZXkpXSA9IHIuaWRlYWw7XG4gICAgICAgICAgY2Mub3B0aW9uYWwucHVzaChvYyk7XG4gICAgICAgICAgb2MgPSB7fTtcbiAgICAgICAgICBvY1tvbGRuYW1lXygnbWF4Jywga2V5KV0gPSByLmlkZWFsO1xuICAgICAgICAgIGNjLm9wdGlvbmFsLnB1c2gob2MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9jW29sZG5hbWVfKCcnLCBrZXkpXSA9IHIuaWRlYWw7XG4gICAgICAgICAgY2Mub3B0aW9uYWwucHVzaChvYyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChyLmV4YWN0ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHIuZXhhY3QgIT09ICdudW1iZXInKSB7XG4gICAgICAgIGNjLm1hbmRhdG9yeSA9IGNjLm1hbmRhdG9yeSB8fCB7fTtcbiAgICAgICAgY2MubWFuZGF0b3J5W29sZG5hbWVfKCcnLCBrZXkpXSA9IHIuZXhhY3Q7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBbJ21pbicsICdtYXgnXS5mb3JFYWNoKGZ1bmN0aW9uKG1peCkge1xuICAgICAgICAgIGlmIChyW21peF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2MubWFuZGF0b3J5ID0gY2MubWFuZGF0b3J5IHx8IHt9O1xuICAgICAgICAgICAgY2MubWFuZGF0b3J5W29sZG5hbWVfKG1peCwga2V5KV0gPSByW21peF07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoYy5hZHZhbmNlZCkge1xuICAgICAgY2Mub3B0aW9uYWwgPSAoY2Mub3B0aW9uYWwgfHwgW10pLmNvbmNhdChjLmFkdmFuY2VkKTtcbiAgICB9XG4gICAgcmV0dXJuIGNjO1xuICB9O1xuXG4gIHZhciBzaGltQ29uc3RyYWludHNfID0gZnVuY3Rpb24oY29uc3RyYWludHMsIGZ1bmMpIHtcbiAgICBjb25zdHJhaW50cyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoY29uc3RyYWludHMpKTtcbiAgICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMuYXVkaW8pIHtcbiAgICAgIGNvbnN0cmFpbnRzLmF1ZGlvID0gY29uc3RyYWludHNUb0Nocm9tZV8oY29uc3RyYWludHMuYXVkaW8pO1xuICAgIH1cbiAgICBpZiAoY29uc3RyYWludHMgJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvID09PSAnb2JqZWN0Jykge1xuICAgICAgLy8gU2hpbSBmYWNpbmdNb2RlIGZvciBtb2JpbGUsIHdoZXJlIGl0IGRlZmF1bHRzIHRvIFwidXNlclwiLlxuICAgICAgdmFyIGZhY2UgPSBjb25zdHJhaW50cy52aWRlby5mYWNpbmdNb2RlO1xuICAgICAgZmFjZSA9IGZhY2UgJiYgKCh0eXBlb2YgZmFjZSA9PT0gJ29iamVjdCcpID8gZmFjZSA6IHtpZGVhbDogZmFjZX0pO1xuXG4gICAgICBpZiAoKGZhY2UgJiYgKGZhY2UuZXhhY3QgPT09ICd1c2VyJyB8fCBmYWNlLmV4YWN0ID09PSAnZW52aXJvbm1lbnQnIHx8XG4gICAgICAgICAgICAgICAgICAgIGZhY2UuaWRlYWwgPT09ICd1c2VyJyB8fCBmYWNlLmlkZWFsID09PSAnZW52aXJvbm1lbnQnKSkgJiZcbiAgICAgICAgICAhKG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0U3VwcG9ydGVkQ29uc3RyYWludHMgJiZcbiAgICAgICAgICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0U3VwcG9ydGVkQ29uc3RyYWludHMoKS5mYWNpbmdNb2RlKSkge1xuICAgICAgICBkZWxldGUgY29uc3RyYWludHMudmlkZW8uZmFjaW5nTW9kZTtcbiAgICAgICAgaWYgKGZhY2UuZXhhY3QgPT09ICdlbnZpcm9ubWVudCcgfHwgZmFjZS5pZGVhbCA9PT0gJ2Vudmlyb25tZW50Jykge1xuICAgICAgICAgIC8vIExvb2sgZm9yIFwiYmFja1wiIGluIGxhYmVsLCBvciB1c2UgbGFzdCBjYW0gKHR5cGljYWxseSBiYWNrIGNhbSkuXG4gICAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpXG4gICAgICAgICAgLnRoZW4oZnVuY3Rpb24oZGV2aWNlcykge1xuICAgICAgICAgICAgZGV2aWNlcyA9IGRldmljZXMuZmlsdGVyKGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGQua2luZCA9PT0gJ3ZpZGVvaW5wdXQnO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIgYmFjayA9IGRldmljZXMuZmluZChmdW5jdGlvbihkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkLmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignYmFjaycpICE9PSAtMTtcbiAgICAgICAgICAgIH0pIHx8IChkZXZpY2VzLmxlbmd0aCAmJiBkZXZpY2VzW2RldmljZXMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgaWYgKGJhY2spIHtcbiAgICAgICAgICAgICAgY29uc3RyYWludHMudmlkZW8uZGV2aWNlSWQgPSBmYWNlLmV4YWN0ID8ge2V4YWN0OiBiYWNrLmRldmljZUlkfSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZGVhbDogYmFjay5kZXZpY2VJZH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdHJhaW50cy52aWRlbyA9IGNvbnN0cmFpbnRzVG9DaHJvbWVfKGNvbnN0cmFpbnRzLnZpZGVvKTtcbiAgICAgICAgICAgIGxvZ2dpbmcoJ2Nocm9tZTogJyArIEpTT04uc3RyaW5naWZ5KGNvbnN0cmFpbnRzKSk7XG4gICAgICAgICAgICByZXR1cm4gZnVuYyhjb25zdHJhaW50cyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0cmFpbnRzLnZpZGVvID0gY29uc3RyYWludHNUb0Nocm9tZV8oY29uc3RyYWludHMudmlkZW8pO1xuICAgIH1cbiAgICBsb2dnaW5nKCdjaHJvbWU6ICcgKyBKU09OLnN0cmluZ2lmeShjb25zdHJhaW50cykpO1xuICAgIHJldHVybiBmdW5jKGNvbnN0cmFpbnRzKTtcbiAgfTtcblxuICB2YXIgc2hpbUVycm9yXyA9IGZ1bmN0aW9uKGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZToge1xuICAgICAgICBQZXJtaXNzaW9uRGVuaWVkRXJyb3I6ICdOb3RBbGxvd2VkRXJyb3InLFxuICAgICAgICBDb25zdHJhaW50Tm90U2F0aXNmaWVkRXJyb3I6ICdPdmVyY29uc3RyYWluZWRFcnJvcidcbiAgICAgIH1bZS5uYW1lXSB8fCBlLm5hbWUsXG4gICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICBjb25zdHJhaW50OiBlLmNvbnN0cmFpbnROYW1lLFxuICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lICsgKHRoaXMubWVzc2FnZSAmJiAnOiAnKSArIHRoaXMubWVzc2FnZTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIHZhciBnZXRVc2VyTWVkaWFfID0gZnVuY3Rpb24oY29uc3RyYWludHMsIG9uU3VjY2Vzcywgb25FcnJvcikge1xuICAgIHNoaW1Db25zdHJhaW50c18oY29uc3RyYWludHMsIGZ1bmN0aW9uKGMpIHtcbiAgICAgIG5hdmlnYXRvci53ZWJraXRHZXRVc2VyTWVkaWEoYywgb25TdWNjZXNzLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIG9uRXJyb3Ioc2hpbUVycm9yXyhlKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBuYXZpZ2F0b3IuZ2V0VXNlck1lZGlhID0gZ2V0VXNlck1lZGlhXztcblxuICAvLyBSZXR1cm5zIHRoZSByZXN1bHQgb2YgZ2V0VXNlck1lZGlhIGFzIGEgUHJvbWlzZS5cbiAgdmFyIGdldFVzZXJNZWRpYVByb21pc2VfID0gZnVuY3Rpb24oY29uc3RyYWludHMpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBuYXZpZ2F0b3IuZ2V0VXNlck1lZGlhKGNvbnN0cmFpbnRzLCByZXNvbHZlLCByZWplY3QpO1xuICAgIH0pO1xuICB9O1xuXG4gIGlmICghbmF2aWdhdG9yLm1lZGlhRGV2aWNlcykge1xuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMgPSB7XG4gICAgICBnZXRVc2VyTWVkaWE6IGdldFVzZXJNZWRpYVByb21pc2VfLFxuICAgICAgZW51bWVyYXRlRGV2aWNlczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7XG4gICAgICAgICAgdmFyIGtpbmRzID0ge2F1ZGlvOiAnYXVkaW9pbnB1dCcsIHZpZGVvOiAndmlkZW9pbnB1dCd9O1xuICAgICAgICAgIHJldHVybiBNZWRpYVN0cmVhbVRyYWNrLmdldFNvdXJjZXMoZnVuY3Rpb24oZGV2aWNlcykge1xuICAgICAgICAgICAgcmVzb2x2ZShkZXZpY2VzLm1hcChmdW5jdGlvbihkZXZpY2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtsYWJlbDogZGV2aWNlLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6IGtpbmRzW2RldmljZS5raW5kXSxcbiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZDogZGV2aWNlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgIGdyb3VwSWQ6ICcnfTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIEEgc2hpbSBmb3IgZ2V0VXNlck1lZGlhIG1ldGhvZCBvbiB0aGUgbWVkaWFEZXZpY2VzIG9iamVjdC5cbiAgLy8gVE9ETyhLYXB0ZW5KYW5zc29uKSByZW1vdmUgb25jZSBpbXBsZW1lbnRlZCBpbiBDaHJvbWUgc3RhYmxlLlxuICBpZiAoIW5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKSB7XG4gICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEgPSBmdW5jdGlvbihjb25zdHJhaW50cykge1xuICAgICAgcmV0dXJuIGdldFVzZXJNZWRpYVByb21pc2VfKGNvbnN0cmFpbnRzKTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIEV2ZW4gdGhvdWdoIENocm9tZSA0NSBoYXMgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcyBhbmQgYSBnZXRVc2VyTWVkaWFcbiAgICAvLyBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgUHJvbWlzZSwgaXQgZG9lcyBub3QgYWNjZXB0IHNwZWMtc3R5bGVcbiAgICAvLyBjb25zdHJhaW50cy5cbiAgICB2YXIgb3JpZ0dldFVzZXJNZWRpYSA9IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhLlxuICAgICAgICBiaW5kKG5hdmlnYXRvci5tZWRpYURldmljZXMpO1xuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhID0gZnVuY3Rpb24oY3MpIHtcbiAgICAgIHJldHVybiBzaGltQ29uc3RyYWludHNfKGNzLCBmdW5jdGlvbihjKSB7XG4gICAgICAgIHJldHVybiBvcmlnR2V0VXNlck1lZGlhKGMpLmNhdGNoKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3Qoc2hpbUVycm9yXyhlKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIER1bW15IGRldmljZWNoYW5nZSBldmVudCBtZXRob2RzLlxuICAvLyBUT0RPKEthcHRlbkphbnNzb24pIHJlbW92ZSBvbmNlIGltcGxlbWVudGVkIGluIENocm9tZSBzdGFibGUuXG4gIGlmICh0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5hZGRFdmVudExpc3RlbmVyID09PSAndW5kZWZpbmVkJykge1xuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKCkge1xuICAgICAgbG9nZ2luZygnRHVtbXkgbWVkaWFEZXZpY2VzLmFkZEV2ZW50TGlzdGVuZXIgY2FsbGVkLicpO1xuICAgIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLnJlbW92ZUV2ZW50TGlzdGVuZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5yZW1vdmVFdmVudExpc3RlbmVyID0gZnVuY3Rpb24oKSB7XG4gICAgICBsb2dnaW5nKCdEdW1teSBtZWRpYURldmljZXMucmVtb3ZlRXZlbnRMaXN0ZW5lciBjYWxsZWQuJyk7XG4gICAgfTtcbiAgfVxufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2NhbG1lZGlhL34vd2VicnRjLWFkYXB0ZXIvc3JjL2pzL2Nocm9tZS9nZXR1c2VybWVkaWEuanNcbi8vIG1vZHVsZSBpZCA9IDQ1MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 451 */
/***/ function(module, exports, __webpack_require__) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar SDPUtils = __webpack_require__(452);\nvar logging = __webpack_require__(448).log;\n\nvar edgeShim = {\n  shimPeerConnection: function() {\n    if (window.RTCIceGatherer) {\n      // ORTC defines an RTCIceCandidate object but no constructor.\n      // Not implemented in Edge.\n      if (!window.RTCIceCandidate) {\n        window.RTCIceCandidate = function(args) {\n          return args;\n        };\n      }\n      // ORTC does not have a session description object but\n      // other browsers (i.e. Chrome) that will support both PC and ORTC\n      // in the future might have this defined already.\n      if (!window.RTCSessionDescription) {\n        window.RTCSessionDescription = function(args) {\n          return args;\n        };\n      }\n    }\n\n    window.RTCPeerConnection = function(config) {\n      var self = this;\n\n      var _eventTarget = document.createDocumentFragment();\n      ['addEventListener', 'removeEventListener', 'dispatchEvent']\n          .forEach(function(method) {\n            self[method] = _eventTarget[method].bind(_eventTarget);\n          });\n\n      this.onicecandidate = null;\n      this.onaddstream = null;\n      this.ontrack = null;\n      this.onremovestream = null;\n      this.onsignalingstatechange = null;\n      this.oniceconnectionstatechange = null;\n      this.onnegotiationneeded = null;\n      this.ondatachannel = null;\n\n      this.localStreams = [];\n      this.remoteStreams = [];\n      this.getLocalStreams = function() {\n        return self.localStreams;\n      };\n      this.getRemoteStreams = function() {\n        return self.remoteStreams;\n      };\n\n      this.localDescription = new RTCSessionDescription({\n        type: '',\n        sdp: ''\n      });\n      this.remoteDescription = new RTCSessionDescription({\n        type: '',\n        sdp: ''\n      });\n      this.signalingState = 'stable';\n      this.iceConnectionState = 'new';\n      this.iceGatheringState = 'new';\n\n      this.iceOptions = {\n        gatherPolicy: 'all',\n        iceServers: []\n      };\n      if (config && config.iceTransportPolicy) {\n        switch (config.iceTransportPolicy) {\n          case 'all':\n          case 'relay':\n            this.iceOptions.gatherPolicy = config.iceTransportPolicy;\n            break;\n          case 'none':\n            // FIXME: remove once implementation and spec have added this.\n            throw new TypeError('iceTransportPolicy \"none\" not supported');\n          default:\n            // don't set iceTransportPolicy.\n            break;\n        }\n      }\n      this.usingBundle = config && config.bundlePolicy === 'max-bundle';\n\n      if (config && config.iceServers) {\n        // Edge does not like\n        // 1) stun:\n        // 2) turn: that does not have all of turn:host:port?transport=udp\n        var iceServers = JSON.parse(JSON.stringify(config.iceServers));\n        this.iceOptions.iceServers = iceServers.filter(function(server) {\n          if (server && server.urls) {\n            var urls = server.urls;\n            if (typeof urls === 'string') {\n              urls = [urls];\n            }\n            urls = urls.filter(function(url) {\n              return url.indexOf('turn:') === 0 &&\n                  url.indexOf('transport=udp') !== -1;\n            })[0];\n            return !!urls;\n          }\n          return false;\n        });\n      }\n\n      // per-track iceGathers, iceTransports, dtlsTransports, rtpSenders, ...\n      // everything that is needed to describe a SDP m-line.\n      this.transceivers = [];\n\n      // since the iceGatherer is currently created in createOffer but we\n      // must not emit candidates until after setLocalDescription we buffer\n      // them in this array.\n      this._localIceCandidatesBuffer = [];\n    };\n\n    window.RTCPeerConnection.prototype._emitBufferedCandidates = function() {\n      var self = this;\n      var sections = SDPUtils.splitSections(self.localDescription.sdp);\n      // FIXME: need to apply ice candidates in a way which is async but\n      // in-order\n      this._localIceCandidatesBuffer.forEach(function(event) {\n        var end = !event.candidate || Object.keys(event.candidate).length === 0;\n        if (end) {\n          for (var j = 1; j < sections.length; j++) {\n            if (sections[j].indexOf('\\r\\na=end-of-candidates\\r\\n') === -1) {\n              sections[j] += 'a=end-of-candidates\\r\\n';\n            }\n          }\n        } else if (event.candidate.candidate.indexOf('typ endOfCandidates')\n            === -1) {\n          sections[event.candidate.sdpMLineIndex + 1] +=\n              'a=' + event.candidate.candidate + '\\r\\n';\n        }\n        self.localDescription.sdp = sections.join('');\n        self.dispatchEvent(event);\n        if (self.onicecandidate !== null) {\n          self.onicecandidate(event);\n        }\n        if (!event.candidate && self.iceGatheringState !== 'complete') {\n          var complete = self.transceivers.every(function(transceiver) {\n            return transceiver.iceGatherer &&\n                transceiver.iceGatherer.state === 'completed';\n          });\n          if (complete) {\n            self.iceGatheringState = 'complete';\n          }\n        }\n      });\n      this._localIceCandidatesBuffer = [];\n    };\n\n    window.RTCPeerConnection.prototype.addStream = function(stream) {\n      // Clone is necessary for local demos mostly, attaching directly\n      // to two different senders does not work (build 10547).\n      this.localStreams.push(stream.clone());\n      this._maybeFireNegotiationNeeded();\n    };\n\n    window.RTCPeerConnection.prototype.removeStream = function(stream) {\n      var idx = this.localStreams.indexOf(stream);\n      if (idx > -1) {\n        this.localStreams.splice(idx, 1);\n        this._maybeFireNegotiationNeeded();\n      }\n    };\n\n    window.RTCPeerConnection.prototype.getSenders = function() {\n      return this.transceivers.filter(function(transceiver) {\n        return !!transceiver.rtpSender;\n      })\n      .map(function(transceiver) {\n        return transceiver.rtpSender;\n      });\n    };\n\n    window.RTCPeerConnection.prototype.getReceivers = function() {\n      return this.transceivers.filter(function(transceiver) {\n        return !!transceiver.rtpReceiver;\n      })\n      .map(function(transceiver) {\n        return transceiver.rtpReceiver;\n      });\n    };\n\n    // Determines the intersection of local and remote capabilities.\n    window.RTCPeerConnection.prototype._getCommonCapabilities =\n        function(localCapabilities, remoteCapabilities) {\n          var commonCapabilities = {\n            codecs: [],\n            headerExtensions: [],\n            fecMechanisms: []\n          };\n          localCapabilities.codecs.forEach(function(lCodec) {\n            for (var i = 0; i < remoteCapabilities.codecs.length; i++) {\n              var rCodec = remoteCapabilities.codecs[i];\n              if (lCodec.name.toLowerCase() === rCodec.name.toLowerCase() &&\n                  lCodec.clockRate === rCodec.clockRate &&\n                  lCodec.numChannels === rCodec.numChannels) {\n                // push rCodec so we reply with offerer payload type\n                commonCapabilities.codecs.push(rCodec);\n\n                // FIXME: also need to determine intersection between\n                // .rtcpFeedback and .parameters\n                break;\n              }\n            }\n          });\n\n          localCapabilities.headerExtensions\n              .forEach(function(lHeaderExtension) {\n                for (var i = 0; i < remoteCapabilities.headerExtensions.length;\n                     i++) {\n                  var rHeaderExtension = remoteCapabilities.headerExtensions[i];\n                  if (lHeaderExtension.uri === rHeaderExtension.uri) {\n                    commonCapabilities.headerExtensions.push(rHeaderExtension);\n                    break;\n                  }\n                }\n              });\n\n          // FIXME: fecMechanisms\n          return commonCapabilities;\n        };\n\n    // Create ICE gatherer, ICE transport and DTLS transport.\n    window.RTCPeerConnection.prototype._createIceAndDtlsTransports =\n        function(mid, sdpMLineIndex) {\n          var self = this;\n          var iceGatherer = new RTCIceGatherer(self.iceOptions);\n          var iceTransport = new RTCIceTransport(iceGatherer);\n          iceGatherer.onlocalcandidate = function(evt) {\n            var event = new Event('icecandidate');\n            event.candidate = {sdpMid: mid, sdpMLineIndex: sdpMLineIndex};\n\n            var cand = evt.candidate;\n            var end = !cand || Object.keys(cand).length === 0;\n            // Edge emits an empty object for RTCIceCandidateComplete‥\n            if (end) {\n              // polyfill since RTCIceGatherer.state is not implemented in\n              // Edge 10547 yet.\n              if (iceGatherer.state === undefined) {\n                iceGatherer.state = 'completed';\n              }\n\n              // Emit a candidate with type endOfCandidates to make the samples\n              // work. Edge requires addIceCandidate with this empty candidate\n              // to start checking. The real solution is to signal\n              // end-of-candidates to the other side when getting the null\n              // candidate but some apps (like the samples) don't do that.\n              event.candidate.candidate =\n                  'candidate:1 1 udp 1 0.0.0.0 9 typ endOfCandidates';\n            } else {\n              // RTCIceCandidate doesn't have a component, needs to be added\n              cand.component = iceTransport.component === 'RTCP' ? 2 : 1;\n              event.candidate.candidate = SDPUtils.writeCandidate(cand);\n            }\n\n            // update local description.\n            var sections = SDPUtils.splitSections(self.localDescription.sdp);\n            if (event.candidate.candidate.indexOf('typ endOfCandidates')\n                === -1) {\n              sections[event.candidate.sdpMLineIndex + 1] +=\n                  'a=' + event.candidate.candidate + '\\r\\n';\n            } else {\n              sections[event.candidate.sdpMLineIndex + 1] +=\n                  'a=end-of-candidates\\r\\n';\n            }\n            self.localDescription.sdp = sections.join('');\n\n            var complete = self.transceivers.every(function(transceiver) {\n              return transceiver.iceGatherer &&\n                  transceiver.iceGatherer.state === 'completed';\n            });\n\n            // Emit candidate if localDescription is set.\n            // Also emits null candidate when all gatherers are complete.\n            switch (self.iceGatheringState) {\n              case 'new':\n                self._localIceCandidatesBuffer.push(event);\n                if (end && complete) {\n                  self._localIceCandidatesBuffer.push(\n                      new Event('icecandidate'));\n                }\n                break;\n              case 'gathering':\n                self._emitBufferedCandidates();\n                self.dispatchEvent(event);\n                if (self.onicecandidate !== null) {\n                  self.onicecandidate(event);\n                }\n                if (complete) {\n                  self.dispatchEvent(new Event('icecandidate'));\n                  if (self.onicecandidate !== null) {\n                    self.onicecandidate(new Event('icecandidate'));\n                  }\n                  self.iceGatheringState = 'complete';\n                }\n                break;\n              case 'complete':\n                // should not happen... currently!\n                break;\n              default: // no-op.\n                break;\n            }\n          };\n          iceTransport.onicestatechange = function() {\n            self._updateConnectionState();\n          };\n\n          var dtlsTransport = new RTCDtlsTransport(iceTransport);\n          dtlsTransport.ondtlsstatechange = function() {\n            self._updateConnectionState();\n          };\n          dtlsTransport.onerror = function() {\n            // onerror does not set state to failed by itself.\n            dtlsTransport.state = 'failed';\n            self._updateConnectionState();\n          };\n\n          return {\n            iceGatherer: iceGatherer,\n            iceTransport: iceTransport,\n            dtlsTransport: dtlsTransport\n          };\n        };\n\n    // Start the RTP Sender and Receiver for a transceiver.\n    window.RTCPeerConnection.prototype._transceive = function(transceiver,\n        send, recv) {\n      var params = this._getCommonCapabilities(transceiver.localCapabilities,\n          transceiver.remoteCapabilities);\n      if (send && transceiver.rtpSender) {\n        params.encodings = transceiver.sendEncodingParameters;\n        params.rtcp = {\n          cname: SDPUtils.localCName\n        };\n        if (transceiver.recvEncodingParameters.length) {\n          params.rtcp.ssrc = transceiver.recvEncodingParameters[0].ssrc;\n        }\n        transceiver.rtpSender.send(params);\n      }\n      if (recv && transceiver.rtpReceiver) {\n        params.encodings = transceiver.recvEncodingParameters;\n        params.rtcp = {\n          cname: transceiver.cname\n        };\n        if (transceiver.sendEncodingParameters.length) {\n          params.rtcp.ssrc = transceiver.sendEncodingParameters[0].ssrc;\n        }\n        transceiver.rtpReceiver.receive(params);\n      }\n    };\n\n    window.RTCPeerConnection.prototype.setLocalDescription =\n        function(description) {\n          var self = this;\n          var sections;\n          var sessionpart;\n          if (description.type === 'offer') {\n            // FIXME: What was the purpose of this empty if statement?\n            // if (!this._pendingOffer) {\n            // } else {\n            if (this._pendingOffer) {\n              // VERY limited support for SDP munging. Limited to:\n              // * changing the order of codecs\n              sections = SDPUtils.splitSections(description.sdp);\n              sessionpart = sections.shift();\n              sections.forEach(function(mediaSection, sdpMLineIndex) {\n                var caps = SDPUtils.parseRtpParameters(mediaSection);\n                self._pendingOffer[sdpMLineIndex].localCapabilities = caps;\n              });\n              this.transceivers = this._pendingOffer;\n              delete this._pendingOffer;\n            }\n          } else if (description.type === 'answer') {\n            sections = SDPUtils.splitSections(self.remoteDescription.sdp);\n            sessionpart = sections.shift();\n            var isIceLite = SDPUtils.matchPrefix(sessionpart,\n                'a=ice-lite').length > 0;\n            sections.forEach(function(mediaSection, sdpMLineIndex) {\n              var transceiver = self.transceivers[sdpMLineIndex];\n              var iceGatherer = transceiver.iceGatherer;\n              var iceTransport = transceiver.iceTransport;\n              var dtlsTransport = transceiver.dtlsTransport;\n              var localCapabilities = transceiver.localCapabilities;\n              var remoteCapabilities = transceiver.remoteCapabilities;\n              var rejected = mediaSection.split('\\n', 1)[0]\n                  .split(' ', 2)[1] === '0';\n\n              if (!rejected) {\n                var remoteIceParameters = SDPUtils.getIceParameters(\n                    mediaSection, sessionpart);\n                if (isIceLite) {\n                  var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:')\n                  .map(function(cand) {\n                    return SDPUtils.parseCandidate(cand);\n                  })\n                  .filter(function(cand) {\n                    return cand.component === '1';\n                  });\n                  // ice-lite only includes host candidates in the SDP so we can\n                  // use setRemoteCandidates (which implies an\n                  // RTCIceCandidateComplete)\n                  if (cands.length) {\n                    iceTransport.setRemoteCandidates(cands);\n                  }\n                }\n                var remoteDtlsParameters = SDPUtils.getDtlsParameters(\n                    mediaSection, sessionpart);\n                if (isIceLite) {\n                  remoteDtlsParameters.role = 'server';\n                }\n\n                if (!self.usingBundle || sdpMLineIndex === 0) {\n                  iceTransport.start(iceGatherer, remoteIceParameters,\n                      isIceLite ? 'controlling' : 'controlled');\n                  dtlsTransport.start(remoteDtlsParameters);\n                }\n\n                // Calculate intersection of capabilities.\n                var params = self._getCommonCapabilities(localCapabilities,\n                    remoteCapabilities);\n\n                // Start the RTCRtpSender. The RTCRtpReceiver for this\n                // transceiver has already been started in setRemoteDescription.\n                self._transceive(transceiver,\n                    params.codecs.length > 0,\n                    false);\n              }\n            });\n          }\n\n          this.localDescription = {\n            type: description.type,\n            sdp: description.sdp\n          };\n          switch (description.type) {\n            case 'offer':\n              this._updateSignalingState('have-local-offer');\n              break;\n            case 'answer':\n              this._updateSignalingState('stable');\n              break;\n            default:\n              throw new TypeError('unsupported type \"' + description.type +\n                  '\"');\n          }\n\n          // If a success callback was provided, emit ICE candidates after it\n          // has been executed. Otherwise, emit callback after the Promise is\n          // resolved.\n          var hasCallback = arguments.length > 1 &&\n            typeof arguments[1] === 'function';\n          if (hasCallback) {\n            var cb = arguments[1];\n            window.setTimeout(function() {\n              cb();\n              if (self.iceGatheringState === 'new') {\n                self.iceGatheringState = 'gathering';\n              }\n              self._emitBufferedCandidates();\n            }, 0);\n          }\n          var p = Promise.resolve();\n          p.then(function() {\n            if (!hasCallback) {\n              if (self.iceGatheringState === 'new') {\n                self.iceGatheringState = 'gathering';\n              }\n              // Usually candidates will be emitted earlier.\n              window.setTimeout(self._emitBufferedCandidates.bind(self), 500);\n            }\n          });\n          return p;\n        };\n\n    window.RTCPeerConnection.prototype.setRemoteDescription =\n        function(description) {\n          var self = this;\n          var stream = new MediaStream();\n          var receiverList = [];\n          var sections = SDPUtils.splitSections(description.sdp);\n          var sessionpart = sections.shift();\n          var isIceLite = SDPUtils.matchPrefix(sessionpart,\n              'a=ice-lite').length > 0;\n          this.usingBundle = SDPUtils.matchPrefix(sessionpart,\n              'a=group:BUNDLE ').length > 0;\n          sections.forEach(function(mediaSection, sdpMLineIndex) {\n            var lines = SDPUtils.splitLines(mediaSection);\n            var mline = lines[0].substr(2).split(' ');\n            var kind = mline[0];\n            var rejected = mline[1] === '0';\n            var direction = SDPUtils.getDirection(mediaSection, sessionpart);\n\n            var transceiver;\n            var iceGatherer;\n            var iceTransport;\n            var dtlsTransport;\n            var rtpSender;\n            var rtpReceiver;\n            var sendEncodingParameters;\n            var recvEncodingParameters;\n            var localCapabilities;\n\n            var track;\n            // FIXME: ensure the mediaSection has rtcp-mux set.\n            var remoteCapabilities = SDPUtils.parseRtpParameters(mediaSection);\n            var remoteIceParameters;\n            var remoteDtlsParameters;\n            if (!rejected) {\n              remoteIceParameters = SDPUtils.getIceParameters(mediaSection,\n                  sessionpart);\n              remoteDtlsParameters = SDPUtils.getDtlsParameters(mediaSection,\n                  sessionpart);\n              remoteDtlsParameters.role = 'client';\n            }\n            recvEncodingParameters =\n                SDPUtils.parseRtpEncodingParameters(mediaSection);\n\n            var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:');\n            if (mid.length) {\n              mid = mid[0].substr(6);\n            } else {\n              mid = SDPUtils.generateIdentifier();\n            }\n\n            var cname;\n            // Gets the first SSRC. Note that with RTX there might be multiple\n            // SSRCs.\n            var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n                .map(function(line) {\n                  return SDPUtils.parseSsrcMedia(line);\n                })\n                .filter(function(obj) {\n                  return obj.attribute === 'cname';\n                })[0];\n            if (remoteSsrc) {\n              cname = remoteSsrc.value;\n            }\n\n            var isComplete = SDPUtils.matchPrefix(mediaSection,\n                'a=end-of-candidates').length > 0;\n            var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:')\n                .map(function(cand) {\n                  return SDPUtils.parseCandidate(cand);\n                })\n                .filter(function(cand) {\n                  return cand.component === '1';\n                });\n            if (description.type === 'offer' && !rejected) {\n              var transports = self.usingBundle && sdpMLineIndex > 0 ? {\n                iceGatherer: self.transceivers[0].iceGatherer,\n                iceTransport: self.transceivers[0].iceTransport,\n                dtlsTransport: self.transceivers[0].dtlsTransport\n              } : self._createIceAndDtlsTransports(mid, sdpMLineIndex);\n\n              if (isComplete) {\n                transports.iceTransport.setRemoteCandidates(cands);\n              }\n\n              localCapabilities = RTCRtpReceiver.getCapabilities(kind);\n              sendEncodingParameters = [{\n                ssrc: (2 * sdpMLineIndex + 2) * 1001\n              }];\n\n              rtpReceiver = new RTCRtpReceiver(transports.dtlsTransport, kind);\n\n              track = rtpReceiver.track;\n              receiverList.push([track, rtpReceiver]);\n              // FIXME: not correct when there are multiple streams but that is\n              // not currently supported in this shim.\n              stream.addTrack(track);\n\n              // FIXME: look at direction.\n              if (self.localStreams.length > 0 &&\n                  self.localStreams[0].getTracks().length >= sdpMLineIndex) {\n                // FIXME: actually more complicated, needs to match types etc\n                var localtrack = self.localStreams[0]\n                    .getTracks()[sdpMLineIndex];\n                rtpSender = new RTCRtpSender(localtrack,\n                    transports.dtlsTransport);\n              }\n\n              self.transceivers[sdpMLineIndex] = {\n                iceGatherer: transports.iceGatherer,\n                iceTransport: transports.iceTransport,\n                dtlsTransport: transports.dtlsTransport,\n                localCapabilities: localCapabilities,\n                remoteCapabilities: remoteCapabilities,\n                rtpSender: rtpSender,\n                rtpReceiver: rtpReceiver,\n                kind: kind,\n                mid: mid,\n                cname: cname,\n                sendEncodingParameters: sendEncodingParameters,\n                recvEncodingParameters: recvEncodingParameters\n              };\n              // Start the RTCRtpReceiver now. The RTPSender is started in\n              // setLocalDescription.\n              self._transceive(self.transceivers[sdpMLineIndex],\n                  false,\n                  direction === 'sendrecv' || direction === 'sendonly');\n            } else if (description.type === 'answer' && !rejected) {\n              transceiver = self.transceivers[sdpMLineIndex];\n              iceGatherer = transceiver.iceGatherer;\n              iceTransport = transceiver.iceTransport;\n              dtlsTransport = transceiver.dtlsTransport;\n              rtpSender = transceiver.rtpSender;\n              rtpReceiver = transceiver.rtpReceiver;\n              sendEncodingParameters = transceiver.sendEncodingParameters;\n              localCapabilities = transceiver.localCapabilities;\n\n              self.transceivers[sdpMLineIndex].recvEncodingParameters =\n                  recvEncodingParameters;\n              self.transceivers[sdpMLineIndex].remoteCapabilities =\n                  remoteCapabilities;\n              self.transceivers[sdpMLineIndex].cname = cname;\n\n              if ((isIceLite || isComplete) && cands.length) {\n                iceTransport.setRemoteCandidates(cands);\n              }\n              if (!self.usingBundle || sdpMLineIndex === 0) {\n                iceTransport.start(iceGatherer, remoteIceParameters,\n                    'controlling');\n                dtlsTransport.start(remoteDtlsParameters);\n              }\n\n              self._transceive(transceiver,\n                  direction === 'sendrecv' || direction === 'recvonly',\n                  direction === 'sendrecv' || direction === 'sendonly');\n\n              if (rtpReceiver &&\n                  (direction === 'sendrecv' || direction === 'sendonly')) {\n                track = rtpReceiver.track;\n                receiverList.push([track, rtpReceiver]);\n                stream.addTrack(track);\n              } else {\n                // FIXME: actually the receiver should be created later.\n                delete transceiver.rtpReceiver;\n              }\n            }\n          });\n\n          this.remoteDescription = {\n            type: description.type,\n            sdp: description.sdp\n          };\n          switch (description.type) {\n            case 'offer':\n              this._updateSignalingState('have-remote-offer');\n              break;\n            case 'answer':\n              this._updateSignalingState('stable');\n              break;\n            default:\n              throw new TypeError('unsupported type \"' + description.type +\n                  '\"');\n          }\n          if (stream.getTracks().length) {\n            self.remoteStreams.push(stream);\n            window.setTimeout(function() {\n              var event = new Event('addstream');\n              event.stream = stream;\n              self.dispatchEvent(event);\n              if (self.onaddstream !== null) {\n                window.setTimeout(function() {\n                  self.onaddstream(event);\n                }, 0);\n              }\n\n              receiverList.forEach(function(item) {\n                var track = item[0];\n                var receiver = item[1];\n                var trackEvent = new Event('track');\n                trackEvent.track = track;\n                trackEvent.receiver = receiver;\n                trackEvent.streams = [stream];\n                self.dispatchEvent(event);\n                if (self.ontrack !== null) {\n                  window.setTimeout(function() {\n                    self.ontrack(trackEvent);\n                  }, 0);\n                }\n              });\n            }, 0);\n          }\n          if (arguments.length > 1 && typeof arguments[1] === 'function') {\n            window.setTimeout(arguments[1], 0);\n          }\n          return Promise.resolve();\n        };\n\n    window.RTCPeerConnection.prototype.close = function() {\n      this.transceivers.forEach(function(transceiver) {\n        /* not yet\n        if (transceiver.iceGatherer) {\n          transceiver.iceGatherer.close();\n        }\n        */\n        if (transceiver.iceTransport) {\n          transceiver.iceTransport.stop();\n        }\n        if (transceiver.dtlsTransport) {\n          transceiver.dtlsTransport.stop();\n        }\n        if (transceiver.rtpSender) {\n          transceiver.rtpSender.stop();\n        }\n        if (transceiver.rtpReceiver) {\n          transceiver.rtpReceiver.stop();\n        }\n      });\n      // FIXME: clean up tracks, local streams, remote streams, etc\n      this._updateSignalingState('closed');\n    };\n\n    // Update the signaling state.\n    window.RTCPeerConnection.prototype._updateSignalingState =\n        function(newState) {\n          this.signalingState = newState;\n          var event = new Event('signalingstatechange');\n          this.dispatchEvent(event);\n          if (this.onsignalingstatechange !== null) {\n            this.onsignalingstatechange(event);\n          }\n        };\n\n    // Determine whether to fire the negotiationneeded event.\n    window.RTCPeerConnection.prototype._maybeFireNegotiationNeeded =\n        function() {\n          // Fire away (for now).\n          var event = new Event('negotiationneeded');\n          this.dispatchEvent(event);\n          if (this.onnegotiationneeded !== null) {\n            this.onnegotiationneeded(event);\n          }\n        };\n\n    // Update the connection state.\n    window.RTCPeerConnection.prototype._updateConnectionState = function() {\n      var self = this;\n      var newState;\n      var states = {\n        'new': 0,\n        closed: 0,\n        connecting: 0,\n        checking: 0,\n        connected: 0,\n        completed: 0,\n        failed: 0\n      };\n      this.transceivers.forEach(function(transceiver) {\n        states[transceiver.iceTransport.state]++;\n        states[transceiver.dtlsTransport.state]++;\n      });\n      // ICETransport.completed and connected are the same for this purpose.\n      states.connected += states.completed;\n\n      newState = 'new';\n      if (states.failed > 0) {\n        newState = 'failed';\n      } else if (states.connecting > 0 || states.checking > 0) {\n        newState = 'connecting';\n      } else if (states.disconnected > 0) {\n        newState = 'disconnected';\n      } else if (states.new > 0) {\n        newState = 'new';\n      } else if (states.connected > 0 || states.completed > 0) {\n        newState = 'connected';\n      }\n\n      if (newState !== self.iceConnectionState) {\n        self.iceConnectionState = newState;\n        var event = new Event('iceconnectionstatechange');\n        this.dispatchEvent(event);\n        if (this.oniceconnectionstatechange !== null) {\n          this.oniceconnectionstatechange(event);\n        }\n      }\n    };\n\n    window.RTCPeerConnection.prototype.createOffer = function() {\n      var self = this;\n      if (this._pendingOffer) {\n        throw new Error('createOffer called while there is a pending offer.');\n      }\n      var offerOptions;\n      if (arguments.length === 1 && typeof arguments[0] !== 'function') {\n        offerOptions = arguments[0];\n      } else if (arguments.length === 3) {\n        offerOptions = arguments[2];\n      }\n\n      var tracks = [];\n      var numAudioTracks = 0;\n      var numVideoTracks = 0;\n      // Default to sendrecv.\n      if (this.localStreams.length) {\n        numAudioTracks = this.localStreams[0].getAudioTracks().length;\n        numVideoTracks = this.localStreams[0].getVideoTracks().length;\n      }\n      // Determine number of audio and video tracks we need to send/recv.\n      if (offerOptions) {\n        // Reject Chrome legacy constraints.\n        if (offerOptions.mandatory || offerOptions.optional) {\n          throw new TypeError(\n              'Legacy mandatory/optional constraints not supported.');\n        }\n        if (offerOptions.offerToReceiveAudio !== undefined) {\n          numAudioTracks = offerOptions.offerToReceiveAudio;\n        }\n        if (offerOptions.offerToReceiveVideo !== undefined) {\n          numVideoTracks = offerOptions.offerToReceiveVideo;\n        }\n      }\n      if (this.localStreams.length) {\n        // Push local streams.\n        this.localStreams[0].getTracks().forEach(function(track) {\n          tracks.push({\n            kind: track.kind,\n            track: track,\n            wantReceive: track.kind === 'audio' ?\n                numAudioTracks > 0 : numVideoTracks > 0\n          });\n          if (track.kind === 'audio') {\n            numAudioTracks--;\n          } else if (track.kind === 'video') {\n            numVideoTracks--;\n          }\n        });\n      }\n      // Create M-lines for recvonly streams.\n      while (numAudioTracks > 0 || numVideoTracks > 0) {\n        if (numAudioTracks > 0) {\n          tracks.push({\n            kind: 'audio',\n            wantReceive: true\n          });\n          numAudioTracks--;\n        }\n        if (numVideoTracks > 0) {\n          tracks.push({\n            kind: 'video',\n            wantReceive: true\n          });\n          numVideoTracks--;\n        }\n      }\n\n      var sdp = SDPUtils.writeSessionBoilerplate();\n      var transceivers = [];\n      tracks.forEach(function(mline, sdpMLineIndex) {\n        // For each track, create an ice gatherer, ice transport,\n        // dtls transport, potentially rtpsender and rtpreceiver.\n        var track = mline.track;\n        var kind = mline.kind;\n        var mid = SDPUtils.generateIdentifier();\n\n        var transports = self.usingBundle && sdpMLineIndex > 0 ? {\n          iceGatherer: transceivers[0].iceGatherer,\n          iceTransport: transceivers[0].iceTransport,\n          dtlsTransport: transceivers[0].dtlsTransport\n        } : self._createIceAndDtlsTransports(mid, sdpMLineIndex);\n\n        var localCapabilities = RTCRtpSender.getCapabilities(kind);\n        var rtpSender;\n        var rtpReceiver;\n\n        // generate an ssrc now, to be used later in rtpSender.send\n        var sendEncodingParameters = [{\n          ssrc: (2 * sdpMLineIndex + 1) * 1001\n        }];\n        if (track) {\n          rtpSender = new RTCRtpSender(track, transports.dtlsTransport);\n        }\n\n        if (mline.wantReceive) {\n          rtpReceiver = new RTCRtpReceiver(transports.dtlsTransport, kind);\n        }\n\n        transceivers[sdpMLineIndex] = {\n          iceGatherer: transports.iceGatherer,\n          iceTransport: transports.iceTransport,\n          dtlsTransport: transports.dtlsTransport,\n          localCapabilities: localCapabilities,\n          remoteCapabilities: null,\n          rtpSender: rtpSender,\n          rtpReceiver: rtpReceiver,\n          kind: kind,\n          mid: mid,\n          sendEncodingParameters: sendEncodingParameters,\n          recvEncodingParameters: null\n        };\n      });\n      if (this.usingBundle) {\n        sdp += 'a=group:BUNDLE ' + transceivers.map(function(t) {\n          return t.mid;\n        }).join(' ') + '\\r\\n';\n      }\n      tracks.forEach(function(mline, sdpMLineIndex) {\n        var transceiver = transceivers[sdpMLineIndex];\n        sdp += SDPUtils.writeMediaSection(transceiver,\n            transceiver.localCapabilities, 'offer', self.localStreams[0]);\n      });\n\n      this._pendingOffer = transceivers;\n      var desc = new RTCSessionDescription({\n        type: 'offer',\n        sdp: sdp\n      });\n      if (arguments.length && typeof arguments[0] === 'function') {\n        window.setTimeout(arguments[0], 0, desc);\n      }\n      return Promise.resolve(desc);\n    };\n\n    window.RTCPeerConnection.prototype.createAnswer = function() {\n      var self = this;\n\n      var sdp = SDPUtils.writeSessionBoilerplate();\n      if (this.usingBundle) {\n        sdp += 'a=group:BUNDLE ' + this.transceivers.map(function(t) {\n          return t.mid;\n        }).join(' ') + '\\r\\n';\n      }\n      this.transceivers.forEach(function(transceiver) {\n        // Calculate intersection of capabilities.\n        var commonCapabilities = self._getCommonCapabilities(\n            transceiver.localCapabilities,\n            transceiver.remoteCapabilities);\n\n        sdp += SDPUtils.writeMediaSection(transceiver, commonCapabilities,\n            'answer', self.localStreams[0]);\n      });\n\n      var desc = new RTCSessionDescription({\n        type: 'answer',\n        sdp: sdp\n      });\n      if (arguments.length && typeof arguments[0] === 'function') {\n        window.setTimeout(arguments[0], 0, desc);\n      }\n      return Promise.resolve(desc);\n    };\n\n    window.RTCPeerConnection.prototype.addIceCandidate = function(candidate) {\n      if (candidate === null) {\n        this.transceivers.forEach(function(transceiver) {\n          transceiver.iceTransport.addRemoteCandidate({});\n        });\n      } else {\n        var mLineIndex = candidate.sdpMLineIndex;\n        if (candidate.sdpMid) {\n          for (var i = 0; i < this.transceivers.length; i++) {\n            if (this.transceivers[i].mid === candidate.sdpMid) {\n              mLineIndex = i;\n              break;\n            }\n          }\n        }\n        var transceiver = this.transceivers[mLineIndex];\n        if (transceiver) {\n          var cand = Object.keys(candidate.candidate).length > 0 ?\n              SDPUtils.parseCandidate(candidate.candidate) : {};\n          // Ignore Chrome's invalid candidates since Edge does not like them.\n          if (cand.protocol === 'tcp' && cand.port === 0) {\n            return;\n          }\n          // Ignore RTCP candidates, we assume RTCP-MUX.\n          if (cand.component !== '1') {\n            return;\n          }\n          // A dirty hack to make samples work.\n          if (cand.type === 'endOfCandidates') {\n            cand = {};\n          }\n          transceiver.iceTransport.addRemoteCandidate(cand);\n\n          // update the remoteDescription.\n          var sections = SDPUtils.splitSections(this.remoteDescription.sdp);\n          sections[mLineIndex + 1] += (cand.type ? candidate.candidate.trim()\n              : 'a=end-of-candidates') + '\\r\\n';\n          this.remoteDescription.sdp = sections.join('');\n        }\n      }\n      if (arguments.length > 1 && typeof arguments[1] === 'function') {\n        window.setTimeout(arguments[1], 0);\n      }\n      return Promise.resolve();\n    };\n\n    window.RTCPeerConnection.prototype.getStats = function() {\n      var promises = [];\n      this.transceivers.forEach(function(transceiver) {\n        ['rtpSender', 'rtpReceiver', 'iceGatherer', 'iceTransport',\n            'dtlsTransport'].forEach(function(method) {\n              if (transceiver[method]) {\n                promises.push(transceiver[method].getStats());\n              }\n            });\n      });\n      var cb = arguments.length > 1 && typeof arguments[1] === 'function' &&\n          arguments[1];\n      return new Promise(function(resolve) {\n        // shim getStats with maplike support\n        var results = new Map();\n        Promise.all(promises).then(function(res) {\n          res.forEach(function(result) {\n            Object.keys(result).forEach(function(id) {\n              results.set(id, result[id]);\n              results[id] = result[id];\n            });\n          });\n          if (cb) {\n            window.setTimeout(cb, 0, results);\n          }\n          resolve(results);\n        });\n      });\n    };\n  },\n\n  // Attach a media stream to an element.\n  attachMediaStream: function(element, stream) {\n    logging('DEPRECATED, attachMediaStream will soon be removed.');\n    element.srcObject = stream;\n  },\n\n  reattachMediaStream: function(to, from) {\n    logging('DEPRECATED, reattachMediaStream will soon be removed.');\n    to.srcObject = from.srcObject;\n  }\n};\n\n// Expose public methods.\nmodule.exports = {\n  shimPeerConnection: edgeShim.shimPeerConnection,\n  shimGetUserMedia: __webpack_require__(453),\n  attachMediaStream: edgeShim.attachMediaStream,\n  reattachMediaStream: edgeShim.reattachMediaStream\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDUxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2NhbG1lZGlhL25vZGVfbW9kdWxlcy93ZWJydGMtYWRhcHRlci9zcmMvanMvZWRnZS9lZGdlX3NoaW0uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqICBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFdlYlJUQyBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2VcbiAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2VcbiAqICB0cmVlLlxuICovXG4gLyogZXNsaW50LWVudiBub2RlICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBTRFBVdGlscyA9IHJlcXVpcmUoJ3NkcCcpO1xudmFyIGxvZ2dpbmcgPSByZXF1aXJlKCcuLi91dGlscycpLmxvZztcblxudmFyIGVkZ2VTaGltID0ge1xuICBzaGltUGVlckNvbm5lY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgIGlmICh3aW5kb3cuUlRDSWNlR2F0aGVyZXIpIHtcbiAgICAgIC8vIE9SVEMgZGVmaW5lcyBhbiBSVENJY2VDYW5kaWRhdGUgb2JqZWN0IGJ1dCBubyBjb25zdHJ1Y3Rvci5cbiAgICAgIC8vIE5vdCBpbXBsZW1lbnRlZCBpbiBFZGdlLlxuICAgICAgaWYgKCF3aW5kb3cuUlRDSWNlQ2FuZGlkYXRlKSB7XG4gICAgICAgIHdpbmRvdy5SVENJY2VDYW5kaWRhdGUgPSBmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIGFyZ3M7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBPUlRDIGRvZXMgbm90IGhhdmUgYSBzZXNzaW9uIGRlc2NyaXB0aW9uIG9iamVjdCBidXRcbiAgICAgIC8vIG90aGVyIGJyb3dzZXJzIChpLmUuIENocm9tZSkgdGhhdCB3aWxsIHN1cHBvcnQgYm90aCBQQyBhbmQgT1JUQ1xuICAgICAgLy8gaW4gdGhlIGZ1dHVyZSBtaWdodCBoYXZlIHRoaXMgZGVmaW5lZCBhbHJlYWR5LlxuICAgICAgaWYgKCF3aW5kb3cuUlRDU2Vzc2lvbkRlc2NyaXB0aW9uKSB7XG4gICAgICAgIHdpbmRvdy5SVENTZXNzaW9uRGVzY3JpcHRpb24gPSBmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIGFyZ3M7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uID0gZnVuY3Rpb24oY29uZmlnKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIHZhciBfZXZlbnRUYXJnZXQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICBbJ2FkZEV2ZW50TGlzdGVuZXInLCAncmVtb3ZlRXZlbnRMaXN0ZW5lcicsICdkaXNwYXRjaEV2ZW50J11cbiAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgICAgICAgIHNlbGZbbWV0aG9kXSA9IF9ldmVudFRhcmdldFttZXRob2RdLmJpbmQoX2V2ZW50VGFyZ2V0KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgdGhpcy5vbmljZWNhbmRpZGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLm9uYWRkc3RyZWFtID0gbnVsbDtcbiAgICAgIHRoaXMub250cmFjayA9IG51bGw7XG4gICAgICB0aGlzLm9ucmVtb3Zlc3RyZWFtID0gbnVsbDtcbiAgICAgIHRoaXMub25zaWduYWxpbmdzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICB0aGlzLm9uaWNlY29ubmVjdGlvbnN0YXRlY2hhbmdlID0gbnVsbDtcbiAgICAgIHRoaXMub25uZWdvdGlhdGlvbm5lZWRlZCA9IG51bGw7XG4gICAgICB0aGlzLm9uZGF0YWNoYW5uZWwgPSBudWxsO1xuXG4gICAgICB0aGlzLmxvY2FsU3RyZWFtcyA9IFtdO1xuICAgICAgdGhpcy5yZW1vdGVTdHJlYW1zID0gW107XG4gICAgICB0aGlzLmdldExvY2FsU3RyZWFtcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc2VsZi5sb2NhbFN0cmVhbXM7XG4gICAgICB9O1xuICAgICAgdGhpcy5nZXRSZW1vdGVTdHJlYW1zID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBzZWxmLnJlbW90ZVN0cmVhbXM7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLmxvY2FsRGVzY3JpcHRpb24gPSBuZXcgUlRDU2Vzc2lvbkRlc2NyaXB0aW9uKHtcbiAgICAgICAgdHlwZTogJycsXG4gICAgICAgIHNkcDogJydcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZW1vdGVEZXNjcmlwdGlvbiA9IG5ldyBSVENTZXNzaW9uRGVzY3JpcHRpb24oe1xuICAgICAgICB0eXBlOiAnJyxcbiAgICAgICAgc2RwOiAnJ1xuICAgICAgfSk7XG4gICAgICB0aGlzLnNpZ25hbGluZ1N0YXRlID0gJ3N0YWJsZSc7XG4gICAgICB0aGlzLmljZUNvbm5lY3Rpb25TdGF0ZSA9ICduZXcnO1xuICAgICAgdGhpcy5pY2VHYXRoZXJpbmdTdGF0ZSA9ICduZXcnO1xuXG4gICAgICB0aGlzLmljZU9wdGlvbnMgPSB7XG4gICAgICAgIGdhdGhlclBvbGljeTogJ2FsbCcsXG4gICAgICAgIGljZVNlcnZlcnM6IFtdXG4gICAgICB9O1xuICAgICAgaWYgKGNvbmZpZyAmJiBjb25maWcuaWNlVHJhbnNwb3J0UG9saWN5KSB7XG4gICAgICAgIHN3aXRjaCAoY29uZmlnLmljZVRyYW5zcG9ydFBvbGljeSkge1xuICAgICAgICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgICAgY2FzZSAncmVsYXknOlxuICAgICAgICAgICAgdGhpcy5pY2VPcHRpb25zLmdhdGhlclBvbGljeSA9IGNvbmZpZy5pY2VUcmFuc3BvcnRQb2xpY3k7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdub25lJzpcbiAgICAgICAgICAgIC8vIEZJWE1FOiByZW1vdmUgb25jZSBpbXBsZW1lbnRhdGlvbiBhbmQgc3BlYyBoYXZlIGFkZGVkIHRoaXMuXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpY2VUcmFuc3BvcnRQb2xpY3kgXCJub25lXCIgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBkb24ndCBzZXQgaWNlVHJhbnNwb3J0UG9saWN5LlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudXNpbmdCdW5kbGUgPSBjb25maWcgJiYgY29uZmlnLmJ1bmRsZVBvbGljeSA9PT0gJ21heC1idW5kbGUnO1xuXG4gICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5pY2VTZXJ2ZXJzKSB7XG4gICAgICAgIC8vIEVkZ2UgZG9lcyBub3QgbGlrZVxuICAgICAgICAvLyAxKSBzdHVuOlxuICAgICAgICAvLyAyKSB0dXJuOiB0aGF0IGRvZXMgbm90IGhhdmUgYWxsIG9mIHR1cm46aG9zdDpwb3J0P3RyYW5zcG9ydD11ZHBcbiAgICAgICAgdmFyIGljZVNlcnZlcnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNvbmZpZy5pY2VTZXJ2ZXJzKSk7XG4gICAgICAgIHRoaXMuaWNlT3B0aW9ucy5pY2VTZXJ2ZXJzID0gaWNlU2VydmVycy5maWx0ZXIoZnVuY3Rpb24oc2VydmVyKSB7XG4gICAgICAgICAgaWYgKHNlcnZlciAmJiBzZXJ2ZXIudXJscykge1xuICAgICAgICAgICAgdmFyIHVybHMgPSBzZXJ2ZXIudXJscztcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJscyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgdXJscyA9IFt1cmxzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVybHMgPSB1cmxzLmZpbHRlcihmdW5jdGlvbih1cmwpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHVybC5pbmRleE9mKCd0dXJuOicpID09PSAwICYmXG4gICAgICAgICAgICAgICAgICB1cmwuaW5kZXhPZigndHJhbnNwb3J0PXVkcCcpICE9PSAtMTtcbiAgICAgICAgICAgIH0pWzBdO1xuICAgICAgICAgICAgcmV0dXJuICEhdXJscztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gcGVyLXRyYWNrIGljZUdhdGhlcnMsIGljZVRyYW5zcG9ydHMsIGR0bHNUcmFuc3BvcnRzLCBydHBTZW5kZXJzLCAuLi5cbiAgICAgIC8vIGV2ZXJ5dGhpbmcgdGhhdCBpcyBuZWVkZWQgdG8gZGVzY3JpYmUgYSBTRFAgbS1saW5lLlxuICAgICAgdGhpcy50cmFuc2NlaXZlcnMgPSBbXTtcblxuICAgICAgLy8gc2luY2UgdGhlIGljZUdhdGhlcmVyIGlzIGN1cnJlbnRseSBjcmVhdGVkIGluIGNyZWF0ZU9mZmVyIGJ1dCB3ZVxuICAgICAgLy8gbXVzdCBub3QgZW1pdCBjYW5kaWRhdGVzIHVudGlsIGFmdGVyIHNldExvY2FsRGVzY3JpcHRpb24gd2UgYnVmZmVyXG4gICAgICAvLyB0aGVtIGluIHRoaXMgYXJyYXkuXG4gICAgICB0aGlzLl9sb2NhbEljZUNhbmRpZGF0ZXNCdWZmZXIgPSBbXTtcbiAgICB9O1xuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5fZW1pdEJ1ZmZlcmVkQ2FuZGlkYXRlcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNlY3Rpb25zID0gU0RQVXRpbHMuc3BsaXRTZWN0aW9ucyhzZWxmLmxvY2FsRGVzY3JpcHRpb24uc2RwKTtcbiAgICAgIC8vIEZJWE1FOiBuZWVkIHRvIGFwcGx5IGljZSBjYW5kaWRhdGVzIGluIGEgd2F5IHdoaWNoIGlzIGFzeW5jIGJ1dFxuICAgICAgLy8gaW4tb3JkZXJcbiAgICAgIHRoaXMuX2xvY2FsSWNlQ2FuZGlkYXRlc0J1ZmZlci5mb3JFYWNoKGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIHZhciBlbmQgPSAhZXZlbnQuY2FuZGlkYXRlIHx8IE9iamVjdC5rZXlzKGV2ZW50LmNhbmRpZGF0ZSkubGVuZ3RoID09PSAwO1xuICAgICAgICBpZiAoZW5kKSB7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDE7IGogPCBzZWN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHNlY3Rpb25zW2pdLmluZGV4T2YoJ1xcclxcbmE9ZW5kLW9mLWNhbmRpZGF0ZXNcXHJcXG4nKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgc2VjdGlvbnNbal0gKz0gJ2E9ZW5kLW9mLWNhbmRpZGF0ZXNcXHJcXG4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5jYW5kaWRhdGUuY2FuZGlkYXRlLmluZGV4T2YoJ3R5cCBlbmRPZkNhbmRpZGF0ZXMnKVxuICAgICAgICAgICAgPT09IC0xKSB7XG4gICAgICAgICAgc2VjdGlvbnNbZXZlbnQuY2FuZGlkYXRlLnNkcE1MaW5lSW5kZXggKyAxXSArPVxuICAgICAgICAgICAgICAnYT0nICsgZXZlbnQuY2FuZGlkYXRlLmNhbmRpZGF0ZSArICdcXHJcXG4nO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYubG9jYWxEZXNjcmlwdGlvbi5zZHAgPSBzZWN0aW9ucy5qb2luKCcnKTtcbiAgICAgICAgc2VsZi5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgaWYgKHNlbGYub25pY2VjYW5kaWRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICBzZWxmLm9uaWNlY2FuZGlkYXRlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWV2ZW50LmNhbmRpZGF0ZSAmJiBzZWxmLmljZUdhdGhlcmluZ1N0YXRlICE9PSAnY29tcGxldGUnKSB7XG4gICAgICAgICAgdmFyIGNvbXBsZXRlID0gc2VsZi50cmFuc2NlaXZlcnMuZXZlcnkoZnVuY3Rpb24odHJhbnNjZWl2ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2NlaXZlci5pY2VHYXRoZXJlciAmJlxuICAgICAgICAgICAgICAgIHRyYW5zY2VpdmVyLmljZUdhdGhlcmVyLnN0YXRlID09PSAnY29tcGxldGVkJztcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoY29tcGxldGUpIHtcbiAgICAgICAgICAgIHNlbGYuaWNlR2F0aGVyaW5nU3RhdGUgPSAnY29tcGxldGUnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLl9sb2NhbEljZUNhbmRpZGF0ZXNCdWZmZXIgPSBbXTtcbiAgICB9O1xuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5hZGRTdHJlYW0gPSBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICAgIC8vIENsb25lIGlzIG5lY2Vzc2FyeSBmb3IgbG9jYWwgZGVtb3MgbW9zdGx5LCBhdHRhY2hpbmcgZGlyZWN0bHlcbiAgICAgIC8vIHRvIHR3byBkaWZmZXJlbnQgc2VuZGVycyBkb2VzIG5vdCB3b3JrIChidWlsZCAxMDU0NykuXG4gICAgICB0aGlzLmxvY2FsU3RyZWFtcy5wdXNoKHN0cmVhbS5jbG9uZSgpKTtcbiAgICAgIHRoaXMuX21heWJlRmlyZU5lZ290aWF0aW9uTmVlZGVkKCk7XG4gICAgfTtcblxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUucmVtb3ZlU3RyZWFtID0gZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICB2YXIgaWR4ID0gdGhpcy5sb2NhbFN0cmVhbXMuaW5kZXhPZihzdHJlYW0pO1xuICAgICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgICAgIHRoaXMubG9jYWxTdHJlYW1zLnNwbGljZShpZHgsIDEpO1xuICAgICAgICB0aGlzLl9tYXliZUZpcmVOZWdvdGlhdGlvbk5lZWRlZCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLmdldFNlbmRlcnMgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zY2VpdmVycy5maWx0ZXIoZnVuY3Rpb24odHJhbnNjZWl2ZXIpIHtcbiAgICAgICAgcmV0dXJuICEhdHJhbnNjZWl2ZXIucnRwU2VuZGVyO1xuICAgICAgfSlcbiAgICAgIC5tYXAoZnVuY3Rpb24odHJhbnNjZWl2ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zY2VpdmVyLnJ0cFNlbmRlcjtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLmdldFJlY2VpdmVycyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNjZWl2ZXJzLmZpbHRlcihmdW5jdGlvbih0cmFuc2NlaXZlcikge1xuICAgICAgICByZXR1cm4gISF0cmFuc2NlaXZlci5ydHBSZWNlaXZlcjtcbiAgICAgIH0pXG4gICAgICAubWFwKGZ1bmN0aW9uKHRyYW5zY2VpdmVyKSB7XG4gICAgICAgIHJldHVybiB0cmFuc2NlaXZlci5ydHBSZWNlaXZlcjtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBEZXRlcm1pbmVzIHRoZSBpbnRlcnNlY3Rpb24gb2YgbG9jYWwgYW5kIHJlbW90ZSBjYXBhYmlsaXRpZXMuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5fZ2V0Q29tbW9uQ2FwYWJpbGl0aWVzID1cbiAgICAgICAgZnVuY3Rpb24obG9jYWxDYXBhYmlsaXRpZXMsIHJlbW90ZUNhcGFiaWxpdGllcykge1xuICAgICAgICAgIHZhciBjb21tb25DYXBhYmlsaXRpZXMgPSB7XG4gICAgICAgICAgICBjb2RlY3M6IFtdLFxuICAgICAgICAgICAgaGVhZGVyRXh0ZW5zaW9uczogW10sXG4gICAgICAgICAgICBmZWNNZWNoYW5pc21zOiBbXVxuICAgICAgICAgIH07XG4gICAgICAgICAgbG9jYWxDYXBhYmlsaXRpZXMuY29kZWNzLmZvckVhY2goZnVuY3Rpb24obENvZGVjKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlbW90ZUNhcGFiaWxpdGllcy5jb2RlY3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFyIHJDb2RlYyA9IHJlbW90ZUNhcGFiaWxpdGllcy5jb2RlY3NbaV07XG4gICAgICAgICAgICAgIGlmIChsQ29kZWMubmFtZS50b0xvd2VyQ2FzZSgpID09PSByQ29kZWMubmFtZS50b0xvd2VyQ2FzZSgpICYmXG4gICAgICAgICAgICAgICAgICBsQ29kZWMuY2xvY2tSYXRlID09PSByQ29kZWMuY2xvY2tSYXRlICYmXG4gICAgICAgICAgICAgICAgICBsQ29kZWMubnVtQ2hhbm5lbHMgPT09IHJDb2RlYy5udW1DaGFubmVscykge1xuICAgICAgICAgICAgICAgIC8vIHB1c2ggckNvZGVjIHNvIHdlIHJlcGx5IHdpdGggb2ZmZXJlciBwYXlsb2FkIHR5cGVcbiAgICAgICAgICAgICAgICBjb21tb25DYXBhYmlsaXRpZXMuY29kZWNzLnB1c2gockNvZGVjKTtcblxuICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBhbHNvIG5lZWQgdG8gZGV0ZXJtaW5lIGludGVyc2VjdGlvbiBiZXR3ZWVuXG4gICAgICAgICAgICAgICAgLy8gLnJ0Y3BGZWVkYmFjayBhbmQgLnBhcmFtZXRlcnNcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbG9jYWxDYXBhYmlsaXRpZXMuaGVhZGVyRXh0ZW5zaW9uc1xuICAgICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbihsSGVhZGVyRXh0ZW5zaW9uKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZW1vdGVDYXBhYmlsaXRpZXMuaGVhZGVyRXh0ZW5zaW9ucy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICBpKyspIHtcbiAgICAgICAgICAgICAgICAgIHZhciBySGVhZGVyRXh0ZW5zaW9uID0gcmVtb3RlQ2FwYWJpbGl0aWVzLmhlYWRlckV4dGVuc2lvbnNbaV07XG4gICAgICAgICAgICAgICAgICBpZiAobEhlYWRlckV4dGVuc2lvbi51cmkgPT09IHJIZWFkZXJFeHRlbnNpb24udXJpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbkNhcGFiaWxpdGllcy5oZWFkZXJFeHRlbnNpb25zLnB1c2gockhlYWRlckV4dGVuc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBGSVhNRTogZmVjTWVjaGFuaXNtc1xuICAgICAgICAgIHJldHVybiBjb21tb25DYXBhYmlsaXRpZXM7XG4gICAgICAgIH07XG5cbiAgICAvLyBDcmVhdGUgSUNFIGdhdGhlcmVyLCBJQ0UgdHJhbnNwb3J0IGFuZCBEVExTIHRyYW5zcG9ydC5cbiAgICB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLl9jcmVhdGVJY2VBbmREdGxzVHJhbnNwb3J0cyA9XG4gICAgICAgIGZ1bmN0aW9uKG1pZCwgc2RwTUxpbmVJbmRleCkge1xuICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgICB2YXIgaWNlR2F0aGVyZXIgPSBuZXcgUlRDSWNlR2F0aGVyZXIoc2VsZi5pY2VPcHRpb25zKTtcbiAgICAgICAgICB2YXIgaWNlVHJhbnNwb3J0ID0gbmV3IFJUQ0ljZVRyYW5zcG9ydChpY2VHYXRoZXJlcik7XG4gICAgICAgICAgaWNlR2F0aGVyZXIub25sb2NhbGNhbmRpZGF0ZSA9IGZ1bmN0aW9uKGV2dCkge1xuICAgICAgICAgICAgdmFyIGV2ZW50ID0gbmV3IEV2ZW50KCdpY2VjYW5kaWRhdGUnKTtcbiAgICAgICAgICAgIGV2ZW50LmNhbmRpZGF0ZSA9IHtzZHBNaWQ6IG1pZCwgc2RwTUxpbmVJbmRleDogc2RwTUxpbmVJbmRleH07XG5cbiAgICAgICAgICAgIHZhciBjYW5kID0gZXZ0LmNhbmRpZGF0ZTtcbiAgICAgICAgICAgIHZhciBlbmQgPSAhY2FuZCB8fCBPYmplY3Qua2V5cyhjYW5kKS5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICAvLyBFZGdlIGVtaXRzIGFuIGVtcHR5IG9iamVjdCBmb3IgUlRDSWNlQ2FuZGlkYXRlQ29tcGxldGXigKVcbiAgICAgICAgICAgIGlmIChlbmQpIHtcbiAgICAgICAgICAgICAgLy8gcG9seWZpbGwgc2luY2UgUlRDSWNlR2F0aGVyZXIuc3RhdGUgaXMgbm90IGltcGxlbWVudGVkIGluXG4gICAgICAgICAgICAgIC8vIEVkZ2UgMTA1NDcgeWV0LlxuICAgICAgICAgICAgICBpZiAoaWNlR2F0aGVyZXIuc3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGljZUdhdGhlcmVyLnN0YXRlID0gJ2NvbXBsZXRlZCc7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBFbWl0IGEgY2FuZGlkYXRlIHdpdGggdHlwZSBlbmRPZkNhbmRpZGF0ZXMgdG8gbWFrZSB0aGUgc2FtcGxlc1xuICAgICAgICAgICAgICAvLyB3b3JrLiBFZGdlIHJlcXVpcmVzIGFkZEljZUNhbmRpZGF0ZSB3aXRoIHRoaXMgZW1wdHkgY2FuZGlkYXRlXG4gICAgICAgICAgICAgIC8vIHRvIHN0YXJ0IGNoZWNraW5nLiBUaGUgcmVhbCBzb2x1dGlvbiBpcyB0byBzaWduYWxcbiAgICAgICAgICAgICAgLy8gZW5kLW9mLWNhbmRpZGF0ZXMgdG8gdGhlIG90aGVyIHNpZGUgd2hlbiBnZXR0aW5nIHRoZSBudWxsXG4gICAgICAgICAgICAgIC8vIGNhbmRpZGF0ZSBidXQgc29tZSBhcHBzIChsaWtlIHRoZSBzYW1wbGVzKSBkb24ndCBkbyB0aGF0LlxuICAgICAgICAgICAgICBldmVudC5jYW5kaWRhdGUuY2FuZGlkYXRlID1cbiAgICAgICAgICAgICAgICAgICdjYW5kaWRhdGU6MSAxIHVkcCAxIDAuMC4wLjAgOSB0eXAgZW5kT2ZDYW5kaWRhdGVzJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFJUQ0ljZUNhbmRpZGF0ZSBkb2Vzbid0IGhhdmUgYSBjb21wb25lbnQsIG5lZWRzIHRvIGJlIGFkZGVkXG4gICAgICAgICAgICAgIGNhbmQuY29tcG9uZW50ID0gaWNlVHJhbnNwb3J0LmNvbXBvbmVudCA9PT0gJ1JUQ1AnID8gMiA6IDE7XG4gICAgICAgICAgICAgIGV2ZW50LmNhbmRpZGF0ZS5jYW5kaWRhdGUgPSBTRFBVdGlscy53cml0ZUNhbmRpZGF0ZShjYW5kKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdXBkYXRlIGxvY2FsIGRlc2NyaXB0aW9uLlxuICAgICAgICAgICAgdmFyIHNlY3Rpb25zID0gU0RQVXRpbHMuc3BsaXRTZWN0aW9ucyhzZWxmLmxvY2FsRGVzY3JpcHRpb24uc2RwKTtcbiAgICAgICAgICAgIGlmIChldmVudC5jYW5kaWRhdGUuY2FuZGlkYXRlLmluZGV4T2YoJ3R5cCBlbmRPZkNhbmRpZGF0ZXMnKVxuICAgICAgICAgICAgICAgID09PSAtMSkge1xuICAgICAgICAgICAgICBzZWN0aW9uc1tldmVudC5jYW5kaWRhdGUuc2RwTUxpbmVJbmRleCArIDFdICs9XG4gICAgICAgICAgICAgICAgICAnYT0nICsgZXZlbnQuY2FuZGlkYXRlLmNhbmRpZGF0ZSArICdcXHJcXG4nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2VjdGlvbnNbZXZlbnQuY2FuZGlkYXRlLnNkcE1MaW5lSW5kZXggKyAxXSArPVxuICAgICAgICAgICAgICAgICAgJ2E9ZW5kLW9mLWNhbmRpZGF0ZXNcXHJcXG4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZi5sb2NhbERlc2NyaXB0aW9uLnNkcCA9IHNlY3Rpb25zLmpvaW4oJycpO1xuXG4gICAgICAgICAgICB2YXIgY29tcGxldGUgPSBzZWxmLnRyYW5zY2VpdmVycy5ldmVyeShmdW5jdGlvbih0cmFuc2NlaXZlcikge1xuICAgICAgICAgICAgICByZXR1cm4gdHJhbnNjZWl2ZXIuaWNlR2F0aGVyZXIgJiZcbiAgICAgICAgICAgICAgICAgIHRyYW5zY2VpdmVyLmljZUdhdGhlcmVyLnN0YXRlID09PSAnY29tcGxldGVkJztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBFbWl0IGNhbmRpZGF0ZSBpZiBsb2NhbERlc2NyaXB0aW9uIGlzIHNldC5cbiAgICAgICAgICAgIC8vIEFsc28gZW1pdHMgbnVsbCBjYW5kaWRhdGUgd2hlbiBhbGwgZ2F0aGVyZXJzIGFyZSBjb21wbGV0ZS5cbiAgICAgICAgICAgIHN3aXRjaCAoc2VsZi5pY2VHYXRoZXJpbmdTdGF0ZSkge1xuICAgICAgICAgICAgICBjYXNlICduZXcnOlxuICAgICAgICAgICAgICAgIHNlbGYuX2xvY2FsSWNlQ2FuZGlkYXRlc0J1ZmZlci5wdXNoKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoZW5kICYmIGNvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICBzZWxmLl9sb2NhbEljZUNhbmRpZGF0ZXNCdWZmZXIucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICBuZXcgRXZlbnQoJ2ljZWNhbmRpZGF0ZScpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2dhdGhlcmluZyc6XG4gICAgICAgICAgICAgICAgc2VsZi5fZW1pdEJ1ZmZlcmVkQ2FuZGlkYXRlcygpO1xuICAgICAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYub25pY2VjYW5kaWRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIHNlbGYub25pY2VjYW5kaWRhdGUoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2ljZWNhbmRpZGF0ZScpKTtcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9uaWNlY2FuZGlkYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYub25pY2VjYW5kaWRhdGUobmV3IEV2ZW50KCdpY2VjYW5kaWRhdGUnKSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBzZWxmLmljZUdhdGhlcmluZ1N0YXRlID0gJ2NvbXBsZXRlJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2NvbXBsZXRlJzpcbiAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlbi4uLiBjdXJyZW50bHkhXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6IC8vIG5vLW9wLlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWNlVHJhbnNwb3J0Lm9uaWNlc3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYuX3VwZGF0ZUNvbm5lY3Rpb25TdGF0ZSgpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICB2YXIgZHRsc1RyYW5zcG9ydCA9IG5ldyBSVENEdGxzVHJhbnNwb3J0KGljZVRyYW5zcG9ydCk7XG4gICAgICAgICAgZHRsc1RyYW5zcG9ydC5vbmR0bHNzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5fdXBkYXRlQ29ubmVjdGlvblN0YXRlKCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBkdGxzVHJhbnNwb3J0Lm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIC8vIG9uZXJyb3IgZG9lcyBub3Qgc2V0IHN0YXRlIHRvIGZhaWxlZCBieSBpdHNlbGYuXG4gICAgICAgICAgICBkdGxzVHJhbnNwb3J0LnN0YXRlID0gJ2ZhaWxlZCc7XG4gICAgICAgICAgICBzZWxmLl91cGRhdGVDb25uZWN0aW9uU3RhdGUoKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGljZUdhdGhlcmVyOiBpY2VHYXRoZXJlcixcbiAgICAgICAgICAgIGljZVRyYW5zcG9ydDogaWNlVHJhbnNwb3J0LFxuICAgICAgICAgICAgZHRsc1RyYW5zcG9ydDogZHRsc1RyYW5zcG9ydFxuICAgICAgICAgIH07XG4gICAgICAgIH07XG5cbiAgICAvLyBTdGFydCB0aGUgUlRQIFNlbmRlciBhbmQgUmVjZWl2ZXIgZm9yIGEgdHJhbnNjZWl2ZXIuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5fdHJhbnNjZWl2ZSA9IGZ1bmN0aW9uKHRyYW5zY2VpdmVyLFxuICAgICAgICBzZW5kLCByZWN2KSB7XG4gICAgICB2YXIgcGFyYW1zID0gdGhpcy5fZ2V0Q29tbW9uQ2FwYWJpbGl0aWVzKHRyYW5zY2VpdmVyLmxvY2FsQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgIHRyYW5zY2VpdmVyLnJlbW90ZUNhcGFiaWxpdGllcyk7XG4gICAgICBpZiAoc2VuZCAmJiB0cmFuc2NlaXZlci5ydHBTZW5kZXIpIHtcbiAgICAgICAgcGFyYW1zLmVuY29kaW5ncyA9IHRyYW5zY2VpdmVyLnNlbmRFbmNvZGluZ1BhcmFtZXRlcnM7XG4gICAgICAgIHBhcmFtcy5ydGNwID0ge1xuICAgICAgICAgIGNuYW1lOiBTRFBVdGlscy5sb2NhbENOYW1lXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0cmFuc2NlaXZlci5yZWN2RW5jb2RpbmdQYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgICAgICAgIHBhcmFtcy5ydGNwLnNzcmMgPSB0cmFuc2NlaXZlci5yZWN2RW5jb2RpbmdQYXJhbWV0ZXJzWzBdLnNzcmM7XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNjZWl2ZXIucnRwU2VuZGVyLnNlbmQocGFyYW1zKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWN2ICYmIHRyYW5zY2VpdmVyLnJ0cFJlY2VpdmVyKSB7XG4gICAgICAgIHBhcmFtcy5lbmNvZGluZ3MgPSB0cmFuc2NlaXZlci5yZWN2RW5jb2RpbmdQYXJhbWV0ZXJzO1xuICAgICAgICBwYXJhbXMucnRjcCA9IHtcbiAgICAgICAgICBjbmFtZTogdHJhbnNjZWl2ZXIuY25hbWVcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRyYW5zY2VpdmVyLnNlbmRFbmNvZGluZ1BhcmFtZXRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgcGFyYW1zLnJ0Y3Auc3NyYyA9IHRyYW5zY2VpdmVyLnNlbmRFbmNvZGluZ1BhcmFtZXRlcnNbMF0uc3NyYztcbiAgICAgICAgfVxuICAgICAgICB0cmFuc2NlaXZlci5ydHBSZWNlaXZlci5yZWNlaXZlKHBhcmFtcyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuc2V0TG9jYWxEZXNjcmlwdGlvbiA9XG4gICAgICAgIGZ1bmN0aW9uKGRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAgIHZhciBzZWN0aW9ucztcbiAgICAgICAgICB2YXIgc2Vzc2lvbnBhcnQ7XG4gICAgICAgICAgaWYgKGRlc2NyaXB0aW9uLnR5cGUgPT09ICdvZmZlcicpIHtcbiAgICAgICAgICAgIC8vIEZJWE1FOiBXaGF0IHdhcyB0aGUgcHVycG9zZSBvZiB0aGlzIGVtcHR5IGlmIHN0YXRlbWVudD9cbiAgICAgICAgICAgIC8vIGlmICghdGhpcy5fcGVuZGluZ09mZmVyKSB7XG4gICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdPZmZlcikge1xuICAgICAgICAgICAgICAvLyBWRVJZIGxpbWl0ZWQgc3VwcG9ydCBmb3IgU0RQIG11bmdpbmcuIExpbWl0ZWQgdG86XG4gICAgICAgICAgICAgIC8vICogY2hhbmdpbmcgdGhlIG9yZGVyIG9mIGNvZGVjc1xuICAgICAgICAgICAgICBzZWN0aW9ucyA9IFNEUFV0aWxzLnNwbGl0U2VjdGlvbnMoZGVzY3JpcHRpb24uc2RwKTtcbiAgICAgICAgICAgICAgc2Vzc2lvbnBhcnQgPSBzZWN0aW9ucy5zaGlmdCgpO1xuICAgICAgICAgICAgICBzZWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKG1lZGlhU2VjdGlvbiwgc2RwTUxpbmVJbmRleCkge1xuICAgICAgICAgICAgICAgIHZhciBjYXBzID0gU0RQVXRpbHMucGFyc2VSdHBQYXJhbWV0ZXJzKG1lZGlhU2VjdGlvbik7XG4gICAgICAgICAgICAgICAgc2VsZi5fcGVuZGluZ09mZmVyW3NkcE1MaW5lSW5kZXhdLmxvY2FsQ2FwYWJpbGl0aWVzID0gY2FwcztcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRoaXMudHJhbnNjZWl2ZXJzID0gdGhpcy5fcGVuZGluZ09mZmVyO1xuICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fcGVuZGluZ09mZmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRpb24udHlwZSA9PT0gJ2Fuc3dlcicpIHtcbiAgICAgICAgICAgIHNlY3Rpb25zID0gU0RQVXRpbHMuc3BsaXRTZWN0aW9ucyhzZWxmLnJlbW90ZURlc2NyaXB0aW9uLnNkcCk7XG4gICAgICAgICAgICBzZXNzaW9ucGFydCA9IHNlY3Rpb25zLnNoaWZ0KCk7XG4gICAgICAgICAgICB2YXIgaXNJY2VMaXRlID0gU0RQVXRpbHMubWF0Y2hQcmVmaXgoc2Vzc2lvbnBhcnQsXG4gICAgICAgICAgICAgICAgJ2E9aWNlLWxpdGUnKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgc2VjdGlvbnMuZm9yRWFjaChmdW5jdGlvbihtZWRpYVNlY3Rpb24sIHNkcE1MaW5lSW5kZXgpIHtcbiAgICAgICAgICAgICAgdmFyIHRyYW5zY2VpdmVyID0gc2VsZi50cmFuc2NlaXZlcnNbc2RwTUxpbmVJbmRleF07XG4gICAgICAgICAgICAgIHZhciBpY2VHYXRoZXJlciA9IHRyYW5zY2VpdmVyLmljZUdhdGhlcmVyO1xuICAgICAgICAgICAgICB2YXIgaWNlVHJhbnNwb3J0ID0gdHJhbnNjZWl2ZXIuaWNlVHJhbnNwb3J0O1xuICAgICAgICAgICAgICB2YXIgZHRsc1RyYW5zcG9ydCA9IHRyYW5zY2VpdmVyLmR0bHNUcmFuc3BvcnQ7XG4gICAgICAgICAgICAgIHZhciBsb2NhbENhcGFiaWxpdGllcyA9IHRyYW5zY2VpdmVyLmxvY2FsQ2FwYWJpbGl0aWVzO1xuICAgICAgICAgICAgICB2YXIgcmVtb3RlQ2FwYWJpbGl0aWVzID0gdHJhbnNjZWl2ZXIucmVtb3RlQ2FwYWJpbGl0aWVzO1xuICAgICAgICAgICAgICB2YXIgcmVqZWN0ZWQgPSBtZWRpYVNlY3Rpb24uc3BsaXQoJ1xcbicsIDEpWzBdXG4gICAgICAgICAgICAgICAgICAuc3BsaXQoJyAnLCAyKVsxXSA9PT0gJzAnO1xuXG4gICAgICAgICAgICAgIGlmICghcmVqZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVtb3RlSWNlUGFyYW1ldGVycyA9IFNEUFV0aWxzLmdldEljZVBhcmFtZXRlcnMoXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhU2VjdGlvbiwgc2Vzc2lvbnBhcnQpO1xuICAgICAgICAgICAgICAgIGlmIChpc0ljZUxpdGUpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBjYW5kcyA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiwgJ2E9Y2FuZGlkYXRlOicpXG4gICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uKGNhbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNEUFV0aWxzLnBhcnNlQ2FuZGlkYXRlKGNhbmQpO1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24oY2FuZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FuZC5jb21wb25lbnQgPT09ICcxJztcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgLy8gaWNlLWxpdGUgb25seSBpbmNsdWRlcyBob3N0IGNhbmRpZGF0ZXMgaW4gdGhlIFNEUCBzbyB3ZSBjYW5cbiAgICAgICAgICAgICAgICAgIC8vIHVzZSBzZXRSZW1vdGVDYW5kaWRhdGVzICh3aGljaCBpbXBsaWVzIGFuXG4gICAgICAgICAgICAgICAgICAvLyBSVENJY2VDYW5kaWRhdGVDb21wbGV0ZSlcbiAgICAgICAgICAgICAgICAgIGlmIChjYW5kcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWNlVHJhbnNwb3J0LnNldFJlbW90ZUNhbmRpZGF0ZXMoY2FuZHMpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcmVtb3RlRHRsc1BhcmFtZXRlcnMgPSBTRFBVdGlscy5nZXREdGxzUGFyYW1ldGVycyhcbiAgICAgICAgICAgICAgICAgICAgbWVkaWFTZWN0aW9uLCBzZXNzaW9ucGFydCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzSWNlTGl0ZSkge1xuICAgICAgICAgICAgICAgICAgcmVtb3RlRHRsc1BhcmFtZXRlcnMucm9sZSA9ICdzZXJ2ZXInO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghc2VsZi51c2luZ0J1bmRsZSB8fCBzZHBNTGluZUluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICBpY2VUcmFuc3BvcnQuc3RhcnQoaWNlR2F0aGVyZXIsIHJlbW90ZUljZVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgaXNJY2VMaXRlID8gJ2NvbnRyb2xsaW5nJyA6ICdjb250cm9sbGVkJyk7XG4gICAgICAgICAgICAgICAgICBkdGxzVHJhbnNwb3J0LnN0YXJ0KHJlbW90ZUR0bHNQYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgaW50ZXJzZWN0aW9uIG9mIGNhcGFiaWxpdGllcy5cbiAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0gc2VsZi5fZ2V0Q29tbW9uQ2FwYWJpbGl0aWVzKGxvY2FsQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgICAgICAgICByZW1vdGVDYXBhYmlsaXRpZXMpO1xuXG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgdGhlIFJUQ1J0cFNlbmRlci4gVGhlIFJUQ1J0cFJlY2VpdmVyIGZvciB0aGlzXG4gICAgICAgICAgICAgICAgLy8gdHJhbnNjZWl2ZXIgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkIGluIHNldFJlbW90ZURlc2NyaXB0aW9uLlxuICAgICAgICAgICAgICAgIHNlbGYuX3RyYW5zY2VpdmUodHJhbnNjZWl2ZXIsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jb2RlY3MubGVuZ3RoID4gMCxcbiAgICAgICAgICAgICAgICAgICAgZmFsc2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmxvY2FsRGVzY3JpcHRpb24gPSB7XG4gICAgICAgICAgICB0eXBlOiBkZXNjcmlwdGlvbi50eXBlLFxuICAgICAgICAgICAgc2RwOiBkZXNjcmlwdGlvbi5zZHBcbiAgICAgICAgICB9O1xuICAgICAgICAgIHN3aXRjaCAoZGVzY3JpcHRpb24udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnb2ZmZXInOlxuICAgICAgICAgICAgICB0aGlzLl91cGRhdGVTaWduYWxpbmdTdGF0ZSgnaGF2ZS1sb2NhbC1vZmZlcicpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Fuc3dlcic6XG4gICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVNpZ25hbGluZ1N0YXRlKCdzdGFibGUnKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1bnN1cHBvcnRlZCB0eXBlIFwiJyArIGRlc2NyaXB0aW9uLnR5cGUgK1xuICAgICAgICAgICAgICAgICAgJ1wiJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgYSBzdWNjZXNzIGNhbGxiYWNrIHdhcyBwcm92aWRlZCwgZW1pdCBJQ0UgY2FuZGlkYXRlcyBhZnRlciBpdFxuICAgICAgICAgIC8vIGhhcyBiZWVuIGV4ZWN1dGVkLiBPdGhlcndpc2UsIGVtaXQgY2FsbGJhY2sgYWZ0ZXIgdGhlIFByb21pc2UgaXNcbiAgICAgICAgICAvLyByZXNvbHZlZC5cbiAgICAgICAgICB2YXIgaGFzQ2FsbGJhY2sgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJlxuICAgICAgICAgICAgdHlwZW9mIGFyZ3VtZW50c1sxXSA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgICAgICBpZiAoaGFzQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIHZhciBjYiA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBjYigpO1xuICAgICAgICAgICAgICBpZiAoc2VsZi5pY2VHYXRoZXJpbmdTdGF0ZSA9PT0gJ25ldycpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmljZUdhdGhlcmluZ1N0YXRlID0gJ2dhdGhlcmluZyc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc2VsZi5fZW1pdEJ1ZmZlcmVkQ2FuZGlkYXRlcygpO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBwID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgcC50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKCFoYXNDYWxsYmFjaykge1xuICAgICAgICAgICAgICBpZiAoc2VsZi5pY2VHYXRoZXJpbmdTdGF0ZSA9PT0gJ25ldycpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmljZUdhdGhlcmluZ1N0YXRlID0gJ2dhdGhlcmluZyc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gVXN1YWxseSBjYW5kaWRhdGVzIHdpbGwgYmUgZW1pdHRlZCBlYXJsaWVyLlxuICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChzZWxmLl9lbWl0QnVmZmVyZWRDYW5kaWRhdGVzLmJpbmQoc2VsZiksIDUwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHA7XG4gICAgICAgIH07XG5cbiAgICB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLnNldFJlbW90ZURlc2NyaXB0aW9uID1cbiAgICAgICAgZnVuY3Rpb24oZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyBNZWRpYVN0cmVhbSgpO1xuICAgICAgICAgIHZhciByZWNlaXZlckxpc3QgPSBbXTtcbiAgICAgICAgICB2YXIgc2VjdGlvbnMgPSBTRFBVdGlscy5zcGxpdFNlY3Rpb25zKGRlc2NyaXB0aW9uLnNkcCk7XG4gICAgICAgICAgdmFyIHNlc3Npb25wYXJ0ID0gc2VjdGlvbnMuc2hpZnQoKTtcbiAgICAgICAgICB2YXIgaXNJY2VMaXRlID0gU0RQVXRpbHMubWF0Y2hQcmVmaXgoc2Vzc2lvbnBhcnQsXG4gICAgICAgICAgICAgICdhPWljZS1saXRlJykubGVuZ3RoID4gMDtcbiAgICAgICAgICB0aGlzLnVzaW5nQnVuZGxlID0gU0RQVXRpbHMubWF0Y2hQcmVmaXgoc2Vzc2lvbnBhcnQsXG4gICAgICAgICAgICAgICdhPWdyb3VwOkJVTkRMRSAnKS5sZW5ndGggPiAwO1xuICAgICAgICAgIHNlY3Rpb25zLmZvckVhY2goZnVuY3Rpb24obWVkaWFTZWN0aW9uLCBzZHBNTGluZUluZGV4KSB7XG4gICAgICAgICAgICB2YXIgbGluZXMgPSBTRFBVdGlscy5zcGxpdExpbmVzKG1lZGlhU2VjdGlvbik7XG4gICAgICAgICAgICB2YXIgbWxpbmUgPSBsaW5lc1swXS5zdWJzdHIoMikuc3BsaXQoJyAnKTtcbiAgICAgICAgICAgIHZhciBraW5kID0gbWxpbmVbMF07XG4gICAgICAgICAgICB2YXIgcmVqZWN0ZWQgPSBtbGluZVsxXSA9PT0gJzAnO1xuICAgICAgICAgICAgdmFyIGRpcmVjdGlvbiA9IFNEUFV0aWxzLmdldERpcmVjdGlvbihtZWRpYVNlY3Rpb24sIHNlc3Npb25wYXJ0KTtcblxuICAgICAgICAgICAgdmFyIHRyYW5zY2VpdmVyO1xuICAgICAgICAgICAgdmFyIGljZUdhdGhlcmVyO1xuICAgICAgICAgICAgdmFyIGljZVRyYW5zcG9ydDtcbiAgICAgICAgICAgIHZhciBkdGxzVHJhbnNwb3J0O1xuICAgICAgICAgICAgdmFyIHJ0cFNlbmRlcjtcbiAgICAgICAgICAgIHZhciBydHBSZWNlaXZlcjtcbiAgICAgICAgICAgIHZhciBzZW5kRW5jb2RpbmdQYXJhbWV0ZXJzO1xuICAgICAgICAgICAgdmFyIHJlY3ZFbmNvZGluZ1BhcmFtZXRlcnM7XG4gICAgICAgICAgICB2YXIgbG9jYWxDYXBhYmlsaXRpZXM7XG5cbiAgICAgICAgICAgIHZhciB0cmFjaztcbiAgICAgICAgICAgIC8vIEZJWE1FOiBlbnN1cmUgdGhlIG1lZGlhU2VjdGlvbiBoYXMgcnRjcC1tdXggc2V0LlxuICAgICAgICAgICAgdmFyIHJlbW90ZUNhcGFiaWxpdGllcyA9IFNEUFV0aWxzLnBhcnNlUnRwUGFyYW1ldGVycyhtZWRpYVNlY3Rpb24pO1xuICAgICAgICAgICAgdmFyIHJlbW90ZUljZVBhcmFtZXRlcnM7XG4gICAgICAgICAgICB2YXIgcmVtb3RlRHRsc1BhcmFtZXRlcnM7XG4gICAgICAgICAgICBpZiAoIXJlamVjdGVkKSB7XG4gICAgICAgICAgICAgIHJlbW90ZUljZVBhcmFtZXRlcnMgPSBTRFBVdGlscy5nZXRJY2VQYXJhbWV0ZXJzKG1lZGlhU2VjdGlvbixcbiAgICAgICAgICAgICAgICAgIHNlc3Npb25wYXJ0KTtcbiAgICAgICAgICAgICAgcmVtb3RlRHRsc1BhcmFtZXRlcnMgPSBTRFBVdGlscy5nZXREdGxzUGFyYW1ldGVycyhtZWRpYVNlY3Rpb24sXG4gICAgICAgICAgICAgICAgICBzZXNzaW9ucGFydCk7XG4gICAgICAgICAgICAgIHJlbW90ZUR0bHNQYXJhbWV0ZXJzLnJvbGUgPSAnY2xpZW50JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlY3ZFbmNvZGluZ1BhcmFtZXRlcnMgPVxuICAgICAgICAgICAgICAgIFNEUFV0aWxzLnBhcnNlUnRwRW5jb2RpbmdQYXJhbWV0ZXJzKG1lZGlhU2VjdGlvbik7XG5cbiAgICAgICAgICAgIHZhciBtaWQgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPW1pZDonKTtcbiAgICAgICAgICAgIGlmIChtaWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIG1pZCA9IG1pZFswXS5zdWJzdHIoNik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtaWQgPSBTRFBVdGlscy5nZW5lcmF0ZUlkZW50aWZpZXIoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGNuYW1lO1xuICAgICAgICAgICAgLy8gR2V0cyB0aGUgZmlyc3QgU1NSQy4gTm90ZSB0aGF0IHdpdGggUlRYIHRoZXJlIG1pZ2h0IGJlIG11bHRpcGxlXG4gICAgICAgICAgICAvLyBTU1JDcy5cbiAgICAgICAgICAgIHZhciByZW1vdGVTc3JjID0gU0RQVXRpbHMubWF0Y2hQcmVmaXgobWVkaWFTZWN0aW9uLCAnYT1zc3JjOicpXG4gICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gU0RQVXRpbHMucGFyc2VTc3JjTWVkaWEobGluZSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKG9iaikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iai5hdHRyaWJ1dGUgPT09ICdjbmFtZSc7XG4gICAgICAgICAgICAgICAgfSlbMF07XG4gICAgICAgICAgICBpZiAocmVtb3RlU3NyYykge1xuICAgICAgICAgICAgICBjbmFtZSA9IHJlbW90ZVNzcmMudmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBpc0NvbXBsZXRlID0gU0RQVXRpbHMubWF0Y2hQcmVmaXgobWVkaWFTZWN0aW9uLFxuICAgICAgICAgICAgICAgICdhPWVuZC1vZi1jYW5kaWRhdGVzJykubGVuZ3RoID4gMDtcbiAgICAgICAgICAgIHZhciBjYW5kcyA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiwgJ2E9Y2FuZGlkYXRlOicpXG4gICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbihjYW5kKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gU0RQVXRpbHMucGFyc2VDYW5kaWRhdGUoY2FuZCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKGNhbmQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBjYW5kLmNvbXBvbmVudCA9PT0gJzEnO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uLnR5cGUgPT09ICdvZmZlcicgJiYgIXJlamVjdGVkKSB7XG4gICAgICAgICAgICAgIHZhciB0cmFuc3BvcnRzID0gc2VsZi51c2luZ0J1bmRsZSAmJiBzZHBNTGluZUluZGV4ID4gMCA/IHtcbiAgICAgICAgICAgICAgICBpY2VHYXRoZXJlcjogc2VsZi50cmFuc2NlaXZlcnNbMF0uaWNlR2F0aGVyZXIsXG4gICAgICAgICAgICAgICAgaWNlVHJhbnNwb3J0OiBzZWxmLnRyYW5zY2VpdmVyc1swXS5pY2VUcmFuc3BvcnQsXG4gICAgICAgICAgICAgICAgZHRsc1RyYW5zcG9ydDogc2VsZi50cmFuc2NlaXZlcnNbMF0uZHRsc1RyYW5zcG9ydFxuICAgICAgICAgICAgICB9IDogc2VsZi5fY3JlYXRlSWNlQW5kRHRsc1RyYW5zcG9ydHMobWlkLCBzZHBNTGluZUluZGV4KTtcblxuICAgICAgICAgICAgICBpZiAoaXNDb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgIHRyYW5zcG9ydHMuaWNlVHJhbnNwb3J0LnNldFJlbW90ZUNhbmRpZGF0ZXMoY2FuZHMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgbG9jYWxDYXBhYmlsaXRpZXMgPSBSVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMoa2luZCk7XG4gICAgICAgICAgICAgIHNlbmRFbmNvZGluZ1BhcmFtZXRlcnMgPSBbe1xuICAgICAgICAgICAgICAgIHNzcmM6ICgyICogc2RwTUxpbmVJbmRleCArIDIpICogMTAwMVxuICAgICAgICAgICAgICB9XTtcblxuICAgICAgICAgICAgICBydHBSZWNlaXZlciA9IG5ldyBSVENSdHBSZWNlaXZlcih0cmFuc3BvcnRzLmR0bHNUcmFuc3BvcnQsIGtpbmQpO1xuXG4gICAgICAgICAgICAgIHRyYWNrID0gcnRwUmVjZWl2ZXIudHJhY2s7XG4gICAgICAgICAgICAgIHJlY2VpdmVyTGlzdC5wdXNoKFt0cmFjaywgcnRwUmVjZWl2ZXJdKTtcbiAgICAgICAgICAgICAgLy8gRklYTUU6IG5vdCBjb3JyZWN0IHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIHN0cmVhbXMgYnV0IHRoYXQgaXNcbiAgICAgICAgICAgICAgLy8gbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgaW4gdGhpcyBzaGltLlxuICAgICAgICAgICAgICBzdHJlYW0uYWRkVHJhY2sodHJhY2spO1xuXG4gICAgICAgICAgICAgIC8vIEZJWE1FOiBsb29rIGF0IGRpcmVjdGlvbi5cbiAgICAgICAgICAgICAgaWYgKHNlbGYubG9jYWxTdHJlYW1zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICAgIHNlbGYubG9jYWxTdHJlYW1zWzBdLmdldFRyYWNrcygpLmxlbmd0aCA+PSBzZHBNTGluZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgLy8gRklYTUU6IGFjdHVhbGx5IG1vcmUgY29tcGxpY2F0ZWQsIG5lZWRzIHRvIG1hdGNoIHR5cGVzIGV0Y1xuICAgICAgICAgICAgICAgIHZhciBsb2NhbHRyYWNrID0gc2VsZi5sb2NhbFN0cmVhbXNbMF1cbiAgICAgICAgICAgICAgICAgICAgLmdldFRyYWNrcygpW3NkcE1MaW5lSW5kZXhdO1xuICAgICAgICAgICAgICAgIHJ0cFNlbmRlciA9IG5ldyBSVENSdHBTZW5kZXIobG9jYWx0cmFjayxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0cy5kdGxzVHJhbnNwb3J0KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNlbGYudHJhbnNjZWl2ZXJzW3NkcE1MaW5lSW5kZXhdID0ge1xuICAgICAgICAgICAgICAgIGljZUdhdGhlcmVyOiB0cmFuc3BvcnRzLmljZUdhdGhlcmVyLFxuICAgICAgICAgICAgICAgIGljZVRyYW5zcG9ydDogdHJhbnNwb3J0cy5pY2VUcmFuc3BvcnQsXG4gICAgICAgICAgICAgICAgZHRsc1RyYW5zcG9ydDogdHJhbnNwb3J0cy5kdGxzVHJhbnNwb3J0LFxuICAgICAgICAgICAgICAgIGxvY2FsQ2FwYWJpbGl0aWVzOiBsb2NhbENhcGFiaWxpdGllcyxcbiAgICAgICAgICAgICAgICByZW1vdGVDYXBhYmlsaXRpZXM6IHJlbW90ZUNhcGFiaWxpdGllcyxcbiAgICAgICAgICAgICAgICBydHBTZW5kZXI6IHJ0cFNlbmRlcixcbiAgICAgICAgICAgICAgICBydHBSZWNlaXZlcjogcnRwUmVjZWl2ZXIsXG4gICAgICAgICAgICAgICAga2luZDoga2luZCxcbiAgICAgICAgICAgICAgICBtaWQ6IG1pZCxcbiAgICAgICAgICAgICAgICBjbmFtZTogY25hbWUsXG4gICAgICAgICAgICAgICAgc2VuZEVuY29kaW5nUGFyYW1ldGVyczogc2VuZEVuY29kaW5nUGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZWN2RW5jb2RpbmdQYXJhbWV0ZXJzOiByZWN2RW5jb2RpbmdQYXJhbWV0ZXJzXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBSVENSdHBSZWNlaXZlciBub3cuIFRoZSBSVFBTZW5kZXIgaXMgc3RhcnRlZCBpblxuICAgICAgICAgICAgICAvLyBzZXRMb2NhbERlc2NyaXB0aW9uLlxuICAgICAgICAgICAgICBzZWxmLl90cmFuc2NlaXZlKHNlbGYudHJhbnNjZWl2ZXJzW3NkcE1MaW5lSW5kZXhdLFxuICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09ICdzZW5kcmVjdicgfHwgZGlyZWN0aW9uID09PSAnc2VuZG9ubHknKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRpb24udHlwZSA9PT0gJ2Fuc3dlcicgJiYgIXJlamVjdGVkKSB7XG4gICAgICAgICAgICAgIHRyYW5zY2VpdmVyID0gc2VsZi50cmFuc2NlaXZlcnNbc2RwTUxpbmVJbmRleF07XG4gICAgICAgICAgICAgIGljZUdhdGhlcmVyID0gdHJhbnNjZWl2ZXIuaWNlR2F0aGVyZXI7XG4gICAgICAgICAgICAgIGljZVRyYW5zcG9ydCA9IHRyYW5zY2VpdmVyLmljZVRyYW5zcG9ydDtcbiAgICAgICAgICAgICAgZHRsc1RyYW5zcG9ydCA9IHRyYW5zY2VpdmVyLmR0bHNUcmFuc3BvcnQ7XG4gICAgICAgICAgICAgIHJ0cFNlbmRlciA9IHRyYW5zY2VpdmVyLnJ0cFNlbmRlcjtcbiAgICAgICAgICAgICAgcnRwUmVjZWl2ZXIgPSB0cmFuc2NlaXZlci5ydHBSZWNlaXZlcjtcbiAgICAgICAgICAgICAgc2VuZEVuY29kaW5nUGFyYW1ldGVycyA9IHRyYW5zY2VpdmVyLnNlbmRFbmNvZGluZ1BhcmFtZXRlcnM7XG4gICAgICAgICAgICAgIGxvY2FsQ2FwYWJpbGl0aWVzID0gdHJhbnNjZWl2ZXIubG9jYWxDYXBhYmlsaXRpZXM7XG5cbiAgICAgICAgICAgICAgc2VsZi50cmFuc2NlaXZlcnNbc2RwTUxpbmVJbmRleF0ucmVjdkVuY29kaW5nUGFyYW1ldGVycyA9XG4gICAgICAgICAgICAgICAgICByZWN2RW5jb2RpbmdQYXJhbWV0ZXJzO1xuICAgICAgICAgICAgICBzZWxmLnRyYW5zY2VpdmVyc1tzZHBNTGluZUluZGV4XS5yZW1vdGVDYXBhYmlsaXRpZXMgPVxuICAgICAgICAgICAgICAgICAgcmVtb3RlQ2FwYWJpbGl0aWVzO1xuICAgICAgICAgICAgICBzZWxmLnRyYW5zY2VpdmVyc1tzZHBNTGluZUluZGV4XS5jbmFtZSA9IGNuYW1lO1xuXG4gICAgICAgICAgICAgIGlmICgoaXNJY2VMaXRlIHx8IGlzQ29tcGxldGUpICYmIGNhbmRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGljZVRyYW5zcG9ydC5zZXRSZW1vdGVDYW5kaWRhdGVzKGNhbmRzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIXNlbGYudXNpbmdCdW5kbGUgfHwgc2RwTUxpbmVJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGljZVRyYW5zcG9ydC5zdGFydChpY2VHYXRoZXJlciwgcmVtb3RlSWNlUGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgICAgJ2NvbnRyb2xsaW5nJyk7XG4gICAgICAgICAgICAgICAgZHRsc1RyYW5zcG9ydC5zdGFydChyZW1vdGVEdGxzUGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzZWxmLl90cmFuc2NlaXZlKHRyYW5zY2VpdmVyLFxuICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID09PSAnc2VuZHJlY3YnIHx8IGRpcmVjdGlvbiA9PT0gJ3JlY3Zvbmx5JyxcbiAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9PT0gJ3NlbmRyZWN2JyB8fCBkaXJlY3Rpb24gPT09ICdzZW5kb25seScpO1xuXG4gICAgICAgICAgICAgIGlmIChydHBSZWNlaXZlciAmJlxuICAgICAgICAgICAgICAgICAgKGRpcmVjdGlvbiA9PT0gJ3NlbmRyZWN2JyB8fCBkaXJlY3Rpb24gPT09ICdzZW5kb25seScpKSB7XG4gICAgICAgICAgICAgICAgdHJhY2sgPSBydHBSZWNlaXZlci50cmFjaztcbiAgICAgICAgICAgICAgICByZWNlaXZlckxpc3QucHVzaChbdHJhY2ssIHJ0cFJlY2VpdmVyXSk7XG4gICAgICAgICAgICAgICAgc3RyZWFtLmFkZFRyYWNrKHRyYWNrKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBGSVhNRTogYWN0dWFsbHkgdGhlIHJlY2VpdmVyIHNob3VsZCBiZSBjcmVhdGVkIGxhdGVyLlxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0cmFuc2NlaXZlci5ydHBSZWNlaXZlcjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy5yZW1vdGVEZXNjcmlwdGlvbiA9IHtcbiAgICAgICAgICAgIHR5cGU6IGRlc2NyaXB0aW9uLnR5cGUsXG4gICAgICAgICAgICBzZHA6IGRlc2NyaXB0aW9uLnNkcFxuICAgICAgICAgIH07XG4gICAgICAgICAgc3dpdGNoIChkZXNjcmlwdGlvbi50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdvZmZlcic6XG4gICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVNpZ25hbGluZ1N0YXRlKCdoYXZlLXJlbW90ZS1vZmZlcicpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Fuc3dlcic6XG4gICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVNpZ25hbGluZ1N0YXRlKCdzdGFibGUnKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1bnN1cHBvcnRlZCB0eXBlIFwiJyArIGRlc2NyaXB0aW9uLnR5cGUgK1xuICAgICAgICAgICAgICAgICAgJ1wiJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdHJlYW0uZ2V0VHJhY2tzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICBzZWxmLnJlbW90ZVN0cmVhbXMucHVzaChzdHJlYW0pO1xuICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHZhciBldmVudCA9IG5ldyBFdmVudCgnYWRkc3RyZWFtJyk7XG4gICAgICAgICAgICAgIGV2ZW50LnN0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgICAgICAgc2VsZi5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgICAgaWYgKHNlbGYub25hZGRzdHJlYW0gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgIHNlbGYub25hZGRzdHJlYW0oZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmVjZWl2ZXJMaXN0LmZvckVhY2goZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgICAgICAgIHZhciB0cmFjayA9IGl0ZW1bMF07XG4gICAgICAgICAgICAgICAgdmFyIHJlY2VpdmVyID0gaXRlbVsxXTtcbiAgICAgICAgICAgICAgICB2YXIgdHJhY2tFdmVudCA9IG5ldyBFdmVudCgndHJhY2snKTtcbiAgICAgICAgICAgICAgICB0cmFja0V2ZW50LnRyYWNrID0gdHJhY2s7XG4gICAgICAgICAgICAgICAgdHJhY2tFdmVudC5yZWNlaXZlciA9IHJlY2VpdmVyO1xuICAgICAgICAgICAgICAgIHRyYWNrRXZlbnQuc3RyZWFtcyA9IFtzdHJlYW1dO1xuICAgICAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYub250cmFjayAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYub250cmFjayh0cmFja0V2ZW50KTtcbiAgICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHR5cGVvZiBhcmd1bWVudHNbMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGFyZ3VtZW50c1sxXSwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfTtcblxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMudHJhbnNjZWl2ZXJzLmZvckVhY2goZnVuY3Rpb24odHJhbnNjZWl2ZXIpIHtcbiAgICAgICAgLyogbm90IHlldFxuICAgICAgICBpZiAodHJhbnNjZWl2ZXIuaWNlR2F0aGVyZXIpIHtcbiAgICAgICAgICB0cmFuc2NlaXZlci5pY2VHYXRoZXJlci5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgICovXG4gICAgICAgIGlmICh0cmFuc2NlaXZlci5pY2VUcmFuc3BvcnQpIHtcbiAgICAgICAgICB0cmFuc2NlaXZlci5pY2VUcmFuc3BvcnQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFuc2NlaXZlci5kdGxzVHJhbnNwb3J0KSB7XG4gICAgICAgICAgdHJhbnNjZWl2ZXIuZHRsc1RyYW5zcG9ydC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYW5zY2VpdmVyLnJ0cFNlbmRlcikge1xuICAgICAgICAgIHRyYW5zY2VpdmVyLnJ0cFNlbmRlci5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYW5zY2VpdmVyLnJ0cFJlY2VpdmVyKSB7XG4gICAgICAgICAgdHJhbnNjZWl2ZXIucnRwUmVjZWl2ZXIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIEZJWE1FOiBjbGVhbiB1cCB0cmFja3MsIGxvY2FsIHN0cmVhbXMsIHJlbW90ZSBzdHJlYW1zLCBldGNcbiAgICAgIHRoaXMuX3VwZGF0ZVNpZ25hbGluZ1N0YXRlKCdjbG9zZWQnKTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHRoZSBzaWduYWxpbmcgc3RhdGUuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5fdXBkYXRlU2lnbmFsaW5nU3RhdGUgPVxuICAgICAgICBmdW5jdGlvbihuZXdTdGF0ZSkge1xuICAgICAgICAgIHRoaXMuc2lnbmFsaW5nU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgICB2YXIgZXZlbnQgPSBuZXcgRXZlbnQoJ3NpZ25hbGluZ3N0YXRlY2hhbmdlJyk7XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICBpZiAodGhpcy5vbnNpZ25hbGluZ3N0YXRlY2hhbmdlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm9uc2lnbmFsaW5nc3RhdGVjaGFuZ2UoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgIC8vIERldGVybWluZSB3aGV0aGVyIHRvIGZpcmUgdGhlIG5lZ290aWF0aW9ubmVlZGVkIGV2ZW50LlxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuX21heWJlRmlyZU5lZ290aWF0aW9uTmVlZGVkID1cbiAgICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgLy8gRmlyZSBhd2F5IChmb3Igbm93KS5cbiAgICAgICAgICB2YXIgZXZlbnQgPSBuZXcgRXZlbnQoJ25lZ290aWF0aW9ubmVlZGVkJyk7XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICBpZiAodGhpcy5vbm5lZ290aWF0aW9ubmVlZGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm9ubmVnb3RpYXRpb25uZWVkZWQoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgY29ubmVjdGlvbiBzdGF0ZS5cbiAgICB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLl91cGRhdGVDb25uZWN0aW9uU3RhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBuZXdTdGF0ZTtcbiAgICAgIHZhciBzdGF0ZXMgPSB7XG4gICAgICAgICduZXcnOiAwLFxuICAgICAgICBjbG9zZWQ6IDAsXG4gICAgICAgIGNvbm5lY3Rpbmc6IDAsXG4gICAgICAgIGNoZWNraW5nOiAwLFxuICAgICAgICBjb25uZWN0ZWQ6IDAsXG4gICAgICAgIGNvbXBsZXRlZDogMCxcbiAgICAgICAgZmFpbGVkOiAwXG4gICAgICB9O1xuICAgICAgdGhpcy50cmFuc2NlaXZlcnMuZm9yRWFjaChmdW5jdGlvbih0cmFuc2NlaXZlcikge1xuICAgICAgICBzdGF0ZXNbdHJhbnNjZWl2ZXIuaWNlVHJhbnNwb3J0LnN0YXRlXSsrO1xuICAgICAgICBzdGF0ZXNbdHJhbnNjZWl2ZXIuZHRsc1RyYW5zcG9ydC5zdGF0ZV0rKztcbiAgICAgIH0pO1xuICAgICAgLy8gSUNFVHJhbnNwb3J0LmNvbXBsZXRlZCBhbmQgY29ubmVjdGVkIGFyZSB0aGUgc2FtZSBmb3IgdGhpcyBwdXJwb3NlLlxuICAgICAgc3RhdGVzLmNvbm5lY3RlZCArPSBzdGF0ZXMuY29tcGxldGVkO1xuXG4gICAgICBuZXdTdGF0ZSA9ICduZXcnO1xuICAgICAgaWYgKHN0YXRlcy5mYWlsZWQgPiAwKSB7XG4gICAgICAgIG5ld1N0YXRlID0gJ2ZhaWxlZCc7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlcy5jb25uZWN0aW5nID4gMCB8fCBzdGF0ZXMuY2hlY2tpbmcgPiAwKSB7XG4gICAgICAgIG5ld1N0YXRlID0gJ2Nvbm5lY3RpbmcnO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZXMuZGlzY29ubmVjdGVkID4gMCkge1xuICAgICAgICBuZXdTdGF0ZSA9ICdkaXNjb25uZWN0ZWQnO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZXMubmV3ID4gMCkge1xuICAgICAgICBuZXdTdGF0ZSA9ICduZXcnO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZXMuY29ubmVjdGVkID4gMCB8fCBzdGF0ZXMuY29tcGxldGVkID4gMCkge1xuICAgICAgICBuZXdTdGF0ZSA9ICdjb25uZWN0ZWQnO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV3U3RhdGUgIT09IHNlbGYuaWNlQ29ubmVjdGlvblN0YXRlKSB7XG4gICAgICAgIHNlbGYuaWNlQ29ubmVjdGlvblN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIHZhciBldmVudCA9IG5ldyBFdmVudCgnaWNlY29ubmVjdGlvbnN0YXRlY2hhbmdlJyk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgIGlmICh0aGlzLm9uaWNlY29ubmVjdGlvbnN0YXRlY2hhbmdlICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5vbmljZWNvbm5lY3Rpb25zdGF0ZWNoYW5nZShldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVPZmZlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgaWYgKHRoaXMuX3BlbmRpbmdPZmZlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyZWF0ZU9mZmVyIGNhbGxlZCB3aGlsZSB0aGVyZSBpcyBhIHBlbmRpbmcgb2ZmZXIuJyk7XG4gICAgICB9XG4gICAgICB2YXIgb2ZmZXJPcHRpb25zO1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3VtZW50c1swXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvZmZlck9wdGlvbnMgPSBhcmd1bWVudHNbMF07XG4gICAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgb2ZmZXJPcHRpb25zID0gYXJndW1lbnRzWzJdO1xuICAgICAgfVxuXG4gICAgICB2YXIgdHJhY2tzID0gW107XG4gICAgICB2YXIgbnVtQXVkaW9UcmFja3MgPSAwO1xuICAgICAgdmFyIG51bVZpZGVvVHJhY2tzID0gMDtcbiAgICAgIC8vIERlZmF1bHQgdG8gc2VuZHJlY3YuXG4gICAgICBpZiAodGhpcy5sb2NhbFN0cmVhbXMubGVuZ3RoKSB7XG4gICAgICAgIG51bUF1ZGlvVHJhY2tzID0gdGhpcy5sb2NhbFN0cmVhbXNbMF0uZ2V0QXVkaW9UcmFja3MoKS5sZW5ndGg7XG4gICAgICAgIG51bVZpZGVvVHJhY2tzID0gdGhpcy5sb2NhbFN0cmVhbXNbMF0uZ2V0VmlkZW9UcmFja3MoKS5sZW5ndGg7XG4gICAgICB9XG4gICAgICAvLyBEZXRlcm1pbmUgbnVtYmVyIG9mIGF1ZGlvIGFuZCB2aWRlbyB0cmFja3Mgd2UgbmVlZCB0byBzZW5kL3JlY3YuXG4gICAgICBpZiAob2ZmZXJPcHRpb25zKSB7XG4gICAgICAgIC8vIFJlamVjdCBDaHJvbWUgbGVnYWN5IGNvbnN0cmFpbnRzLlxuICAgICAgICBpZiAob2ZmZXJPcHRpb25zLm1hbmRhdG9yeSB8fCBvZmZlck9wdGlvbnMub3B0aW9uYWwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAnTGVnYWN5IG1hbmRhdG9yeS9vcHRpb25hbCBjb25zdHJhaW50cyBub3Qgc3VwcG9ydGVkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvZmZlck9wdGlvbnMub2ZmZXJUb1JlY2VpdmVBdWRpbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbnVtQXVkaW9UcmFja3MgPSBvZmZlck9wdGlvbnMub2ZmZXJUb1JlY2VpdmVBdWRpbztcbiAgICAgICAgfVxuICAgICAgICBpZiAob2ZmZXJPcHRpb25zLm9mZmVyVG9SZWNlaXZlVmlkZW8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG51bVZpZGVvVHJhY2tzID0gb2ZmZXJPcHRpb25zLm9mZmVyVG9SZWNlaXZlVmlkZW87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmxvY2FsU3RyZWFtcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gUHVzaCBsb2NhbCBzdHJlYW1zLlxuICAgICAgICB0aGlzLmxvY2FsU3RyZWFtc1swXS5nZXRUcmFja3MoKS5mb3JFYWNoKGZ1bmN0aW9uKHRyYWNrKSB7XG4gICAgICAgICAgdHJhY2tzLnB1c2goe1xuICAgICAgICAgICAga2luZDogdHJhY2sua2luZCxcbiAgICAgICAgICAgIHRyYWNrOiB0cmFjayxcbiAgICAgICAgICAgIHdhbnRSZWNlaXZlOiB0cmFjay5raW5kID09PSAnYXVkaW8nID9cbiAgICAgICAgICAgICAgICBudW1BdWRpb1RyYWNrcyA+IDAgOiBudW1WaWRlb1RyYWNrcyA+IDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAodHJhY2sua2luZCA9PT0gJ2F1ZGlvJykge1xuICAgICAgICAgICAgbnVtQXVkaW9UcmFja3MtLTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLmtpbmQgPT09ICd2aWRlbycpIHtcbiAgICAgICAgICAgIG51bVZpZGVvVHJhY2tzLS07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIENyZWF0ZSBNLWxpbmVzIGZvciByZWN2b25seSBzdHJlYW1zLlxuICAgICAgd2hpbGUgKG51bUF1ZGlvVHJhY2tzID4gMCB8fCBudW1WaWRlb1RyYWNrcyA+IDApIHtcbiAgICAgICAgaWYgKG51bUF1ZGlvVHJhY2tzID4gMCkge1xuICAgICAgICAgIHRyYWNrcy5wdXNoKHtcbiAgICAgICAgICAgIGtpbmQ6ICdhdWRpbycsXG4gICAgICAgICAgICB3YW50UmVjZWl2ZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG51bUF1ZGlvVHJhY2tzLS07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG51bVZpZGVvVHJhY2tzID4gMCkge1xuICAgICAgICAgIHRyYWNrcy5wdXNoKHtcbiAgICAgICAgICAgIGtpbmQ6ICd2aWRlbycsXG4gICAgICAgICAgICB3YW50UmVjZWl2ZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG51bVZpZGVvVHJhY2tzLS07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHNkcCA9IFNEUFV0aWxzLndyaXRlU2Vzc2lvbkJvaWxlcnBsYXRlKCk7XG4gICAgICB2YXIgdHJhbnNjZWl2ZXJzID0gW107XG4gICAgICB0cmFja3MuZm9yRWFjaChmdW5jdGlvbihtbGluZSwgc2RwTUxpbmVJbmRleCkge1xuICAgICAgICAvLyBGb3IgZWFjaCB0cmFjaywgY3JlYXRlIGFuIGljZSBnYXRoZXJlciwgaWNlIHRyYW5zcG9ydCxcbiAgICAgICAgLy8gZHRscyB0cmFuc3BvcnQsIHBvdGVudGlhbGx5IHJ0cHNlbmRlciBhbmQgcnRwcmVjZWl2ZXIuXG4gICAgICAgIHZhciB0cmFjayA9IG1saW5lLnRyYWNrO1xuICAgICAgICB2YXIga2luZCA9IG1saW5lLmtpbmQ7XG4gICAgICAgIHZhciBtaWQgPSBTRFBVdGlscy5nZW5lcmF0ZUlkZW50aWZpZXIoKTtcblxuICAgICAgICB2YXIgdHJhbnNwb3J0cyA9IHNlbGYudXNpbmdCdW5kbGUgJiYgc2RwTUxpbmVJbmRleCA+IDAgPyB7XG4gICAgICAgICAgaWNlR2F0aGVyZXI6IHRyYW5zY2VpdmVyc1swXS5pY2VHYXRoZXJlcixcbiAgICAgICAgICBpY2VUcmFuc3BvcnQ6IHRyYW5zY2VpdmVyc1swXS5pY2VUcmFuc3BvcnQsXG4gICAgICAgICAgZHRsc1RyYW5zcG9ydDogdHJhbnNjZWl2ZXJzWzBdLmR0bHNUcmFuc3BvcnRcbiAgICAgICAgfSA6IHNlbGYuX2NyZWF0ZUljZUFuZER0bHNUcmFuc3BvcnRzKG1pZCwgc2RwTUxpbmVJbmRleCk7XG5cbiAgICAgICAgdmFyIGxvY2FsQ2FwYWJpbGl0aWVzID0gUlRDUnRwU2VuZGVyLmdldENhcGFiaWxpdGllcyhraW5kKTtcbiAgICAgICAgdmFyIHJ0cFNlbmRlcjtcbiAgICAgICAgdmFyIHJ0cFJlY2VpdmVyO1xuXG4gICAgICAgIC8vIGdlbmVyYXRlIGFuIHNzcmMgbm93LCB0byBiZSB1c2VkIGxhdGVyIGluIHJ0cFNlbmRlci5zZW5kXG4gICAgICAgIHZhciBzZW5kRW5jb2RpbmdQYXJhbWV0ZXJzID0gW3tcbiAgICAgICAgICBzc3JjOiAoMiAqIHNkcE1MaW5lSW5kZXggKyAxKSAqIDEwMDFcbiAgICAgICAgfV07XG4gICAgICAgIGlmICh0cmFjaykge1xuICAgICAgICAgIHJ0cFNlbmRlciA9IG5ldyBSVENSdHBTZW5kZXIodHJhY2ssIHRyYW5zcG9ydHMuZHRsc1RyYW5zcG9ydCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWxpbmUud2FudFJlY2VpdmUpIHtcbiAgICAgICAgICBydHBSZWNlaXZlciA9IG5ldyBSVENSdHBSZWNlaXZlcih0cmFuc3BvcnRzLmR0bHNUcmFuc3BvcnQsIGtpbmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJhbnNjZWl2ZXJzW3NkcE1MaW5lSW5kZXhdID0ge1xuICAgICAgICAgIGljZUdhdGhlcmVyOiB0cmFuc3BvcnRzLmljZUdhdGhlcmVyLFxuICAgICAgICAgIGljZVRyYW5zcG9ydDogdHJhbnNwb3J0cy5pY2VUcmFuc3BvcnQsXG4gICAgICAgICAgZHRsc1RyYW5zcG9ydDogdHJhbnNwb3J0cy5kdGxzVHJhbnNwb3J0LFxuICAgICAgICAgIGxvY2FsQ2FwYWJpbGl0aWVzOiBsb2NhbENhcGFiaWxpdGllcyxcbiAgICAgICAgICByZW1vdGVDYXBhYmlsaXRpZXM6IG51bGwsXG4gICAgICAgICAgcnRwU2VuZGVyOiBydHBTZW5kZXIsXG4gICAgICAgICAgcnRwUmVjZWl2ZXI6IHJ0cFJlY2VpdmVyLFxuICAgICAgICAgIGtpbmQ6IGtpbmQsXG4gICAgICAgICAgbWlkOiBtaWQsXG4gICAgICAgICAgc2VuZEVuY29kaW5nUGFyYW1ldGVyczogc2VuZEVuY29kaW5nUGFyYW1ldGVycyxcbiAgICAgICAgICByZWN2RW5jb2RpbmdQYXJhbWV0ZXJzOiBudWxsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLnVzaW5nQnVuZGxlKSB7XG4gICAgICAgIHNkcCArPSAnYT1ncm91cDpCVU5ETEUgJyArIHRyYW5zY2VpdmVycy5tYXAoZnVuY3Rpb24odCkge1xuICAgICAgICAgIHJldHVybiB0Lm1pZDtcbiAgICAgICAgfSkuam9pbignICcpICsgJ1xcclxcbic7XG4gICAgICB9XG4gICAgICB0cmFja3MuZm9yRWFjaChmdW5jdGlvbihtbGluZSwgc2RwTUxpbmVJbmRleCkge1xuICAgICAgICB2YXIgdHJhbnNjZWl2ZXIgPSB0cmFuc2NlaXZlcnNbc2RwTUxpbmVJbmRleF07XG4gICAgICAgIHNkcCArPSBTRFBVdGlscy53cml0ZU1lZGlhU2VjdGlvbih0cmFuc2NlaXZlcixcbiAgICAgICAgICAgIHRyYW5zY2VpdmVyLmxvY2FsQ2FwYWJpbGl0aWVzLCAnb2ZmZXInLCBzZWxmLmxvY2FsU3RyZWFtc1swXSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fcGVuZGluZ09mZmVyID0gdHJhbnNjZWl2ZXJzO1xuICAgICAgdmFyIGRlc2MgPSBuZXcgUlRDU2Vzc2lvbkRlc2NyaXB0aW9uKHtcbiAgICAgICAgdHlwZTogJ29mZmVyJyxcbiAgICAgICAgc2RwOiBzZHBcbiAgICAgIH0pO1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggJiYgdHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3aW5kb3cuc2V0VGltZW91dChhcmd1bWVudHNbMF0sIDAsIGRlc2MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShkZXNjKTtcbiAgICB9O1xuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVBbnN3ZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgdmFyIHNkcCA9IFNEUFV0aWxzLndyaXRlU2Vzc2lvbkJvaWxlcnBsYXRlKCk7XG4gICAgICBpZiAodGhpcy51c2luZ0J1bmRsZSkge1xuICAgICAgICBzZHAgKz0gJ2E9Z3JvdXA6QlVORExFICcgKyB0aGlzLnRyYW5zY2VpdmVycy5tYXAoZnVuY3Rpb24odCkge1xuICAgICAgICAgIHJldHVybiB0Lm1pZDtcbiAgICAgICAgfSkuam9pbignICcpICsgJ1xcclxcbic7XG4gICAgICB9XG4gICAgICB0aGlzLnRyYW5zY2VpdmVycy5mb3JFYWNoKGZ1bmN0aW9uKHRyYW5zY2VpdmVyKSB7XG4gICAgICAgIC8vIENhbGN1bGF0ZSBpbnRlcnNlY3Rpb24gb2YgY2FwYWJpbGl0aWVzLlxuICAgICAgICB2YXIgY29tbW9uQ2FwYWJpbGl0aWVzID0gc2VsZi5fZ2V0Q29tbW9uQ2FwYWJpbGl0aWVzKFxuICAgICAgICAgICAgdHJhbnNjZWl2ZXIubG9jYWxDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICB0cmFuc2NlaXZlci5yZW1vdGVDYXBhYmlsaXRpZXMpO1xuXG4gICAgICAgIHNkcCArPSBTRFBVdGlscy53cml0ZU1lZGlhU2VjdGlvbih0cmFuc2NlaXZlciwgY29tbW9uQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgJ2Fuc3dlcicsIHNlbGYubG9jYWxTdHJlYW1zWzBdKTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgZGVzYyA9IG5ldyBSVENTZXNzaW9uRGVzY3JpcHRpb24oe1xuICAgICAgICB0eXBlOiAnYW5zd2VyJyxcbiAgICAgICAgc2RwOiBzZHBcbiAgICAgIH0pO1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggJiYgdHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3aW5kb3cuc2V0VGltZW91dChhcmd1bWVudHNbMF0sIDAsIGRlc2MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShkZXNjKTtcbiAgICB9O1xuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5hZGRJY2VDYW5kaWRhdGUgPSBmdW5jdGlvbihjYW5kaWRhdGUpIHtcbiAgICAgIGlmIChjYW5kaWRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy50cmFuc2NlaXZlcnMuZm9yRWFjaChmdW5jdGlvbih0cmFuc2NlaXZlcikge1xuICAgICAgICAgIHRyYW5zY2VpdmVyLmljZVRyYW5zcG9ydC5hZGRSZW1vdGVDYW5kaWRhdGUoe30pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBtTGluZUluZGV4ID0gY2FuZGlkYXRlLnNkcE1MaW5lSW5kZXg7XG4gICAgICAgIGlmIChjYW5kaWRhdGUuc2RwTWlkKSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRyYW5zY2VpdmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNjZWl2ZXJzW2ldLm1pZCA9PT0gY2FuZGlkYXRlLnNkcE1pZCkge1xuICAgICAgICAgICAgICBtTGluZUluZGV4ID0gaTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciB0cmFuc2NlaXZlciA9IHRoaXMudHJhbnNjZWl2ZXJzW21MaW5lSW5kZXhdO1xuICAgICAgICBpZiAodHJhbnNjZWl2ZXIpIHtcbiAgICAgICAgICB2YXIgY2FuZCA9IE9iamVjdC5rZXlzKGNhbmRpZGF0ZS5jYW5kaWRhdGUpLmxlbmd0aCA+IDAgP1xuICAgICAgICAgICAgICBTRFBVdGlscy5wYXJzZUNhbmRpZGF0ZShjYW5kaWRhdGUuY2FuZGlkYXRlKSA6IHt9O1xuICAgICAgICAgIC8vIElnbm9yZSBDaHJvbWUncyBpbnZhbGlkIGNhbmRpZGF0ZXMgc2luY2UgRWRnZSBkb2VzIG5vdCBsaWtlIHRoZW0uXG4gICAgICAgICAgaWYgKGNhbmQucHJvdG9jb2wgPT09ICd0Y3AnICYmIGNhbmQucG9ydCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBJZ25vcmUgUlRDUCBjYW5kaWRhdGVzLCB3ZSBhc3N1bWUgUlRDUC1NVVguXG4gICAgICAgICAgaWYgKGNhbmQuY29tcG9uZW50ICE9PSAnMScpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQSBkaXJ0eSBoYWNrIHRvIG1ha2Ugc2FtcGxlcyB3b3JrLlxuICAgICAgICAgIGlmIChjYW5kLnR5cGUgPT09ICdlbmRPZkNhbmRpZGF0ZXMnKSB7XG4gICAgICAgICAgICBjYW5kID0ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyYW5zY2VpdmVyLmljZVRyYW5zcG9ydC5hZGRSZW1vdGVDYW5kaWRhdGUoY2FuZCk7XG5cbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIHJlbW90ZURlc2NyaXB0aW9uLlxuICAgICAgICAgIHZhciBzZWN0aW9ucyA9IFNEUFV0aWxzLnNwbGl0U2VjdGlvbnModGhpcy5yZW1vdGVEZXNjcmlwdGlvbi5zZHApO1xuICAgICAgICAgIHNlY3Rpb25zW21MaW5lSW5kZXggKyAxXSArPSAoY2FuZC50eXBlID8gY2FuZGlkYXRlLmNhbmRpZGF0ZS50cmltKClcbiAgICAgICAgICAgICAgOiAnYT1lbmQtb2YtY2FuZGlkYXRlcycpICsgJ1xcclxcbic7XG4gICAgICAgICAgdGhpcy5yZW1vdGVEZXNjcmlwdGlvbi5zZHAgPSBzZWN0aW9ucy5qb2luKCcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHR5cGVvZiBhcmd1bWVudHNbMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoYXJndW1lbnRzWzFdLCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9O1xuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5nZXRTdGF0cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHByb21pc2VzID0gW107XG4gICAgICB0aGlzLnRyYW5zY2VpdmVycy5mb3JFYWNoKGZ1bmN0aW9uKHRyYW5zY2VpdmVyKSB7XG4gICAgICAgIFsncnRwU2VuZGVyJywgJ3J0cFJlY2VpdmVyJywgJ2ljZUdhdGhlcmVyJywgJ2ljZVRyYW5zcG9ydCcsXG4gICAgICAgICAgICAnZHRsc1RyYW5zcG9ydCddLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICAgICAgICAgIGlmICh0cmFuc2NlaXZlclttZXRob2RdKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0cmFuc2NlaXZlclttZXRob2RdLmdldFN0YXRzKCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdmFyIGNiID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdHlwZW9mIGFyZ3VtZW50c1sxXSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICAgIGFyZ3VtZW50c1sxXTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7XG4gICAgICAgIC8vIHNoaW0gZ2V0U3RhdHMgd2l0aCBtYXBsaWtlIHN1cHBvcnRcbiAgICAgICAgdmFyIHJlc3VsdHMgPSBuZXcgTWFwKCk7XG4gICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uKHJlcykge1xuICAgICAgICAgIHJlcy5mb3JFYWNoKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMocmVzdWx0KS5mb3JFYWNoKGZ1bmN0aW9uKGlkKSB7XG4gICAgICAgICAgICAgIHJlc3VsdHMuc2V0KGlkLCByZXN1bHRbaWRdKTtcbiAgICAgICAgICAgICAgcmVzdWx0c1tpZF0gPSByZXN1bHRbaWRdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChjYiwgMCwgcmVzdWx0cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUocmVzdWx0cyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfSxcblxuICAvLyBBdHRhY2ggYSBtZWRpYSBzdHJlYW0gdG8gYW4gZWxlbWVudC5cbiAgYXR0YWNoTWVkaWFTdHJlYW06IGZ1bmN0aW9uKGVsZW1lbnQsIHN0cmVhbSkge1xuICAgIGxvZ2dpbmcoJ0RFUFJFQ0FURUQsIGF0dGFjaE1lZGlhU3RyZWFtIHdpbGwgc29vbiBiZSByZW1vdmVkLicpO1xuICAgIGVsZW1lbnQuc3JjT2JqZWN0ID0gc3RyZWFtO1xuICB9LFxuXG4gIHJlYXR0YWNoTWVkaWFTdHJlYW06IGZ1bmN0aW9uKHRvLCBmcm9tKSB7XG4gICAgbG9nZ2luZygnREVQUkVDQVRFRCwgcmVhdHRhY2hNZWRpYVN0cmVhbSB3aWxsIHNvb24gYmUgcmVtb3ZlZC4nKTtcbiAgICB0by5zcmNPYmplY3QgPSBmcm9tLnNyY09iamVjdDtcbiAgfVxufTtcblxuLy8gRXhwb3NlIHB1YmxpYyBtZXRob2RzLlxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNoaW1QZWVyQ29ubmVjdGlvbjogZWRnZVNoaW0uc2hpbVBlZXJDb25uZWN0aW9uLFxuICBzaGltR2V0VXNlck1lZGlhOiByZXF1aXJlKCcuL2dldHVzZXJtZWRpYScpLFxuICBhdHRhY2hNZWRpYVN0cmVhbTogZWRnZVNoaW0uYXR0YWNoTWVkaWFTdHJlYW0sXG4gIHJlYXR0YWNoTWVkaWFTdHJlYW06IGVkZ2VTaGltLnJlYXR0YWNoTWVkaWFTdHJlYW1cbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9jYWxtZWRpYS9+L3dlYnJ0Yy1hZGFwdGVyL3NyYy9qcy9lZGdlL2VkZ2Vfc2hpbS5qc1xuLy8gbW9kdWxlIGlkID0gNDUxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 452 */
/***/ function(module, exports) {

    eval(" /* eslint-env node */\n'use strict';\n\n// SDP helpers.\nvar SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n  return Math.random().toString(36).substr(2, 10);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n  return blob.trim().split('\\n').map(function(line) {\n    return line.trim();\n  });\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n  var parts = blob.split('\\nm=');\n  return parts.map(function(part, index) {\n    return (index > 0 ? 'm=' + part : part).trim() + '\\r\\n';\n  });\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n  return SDPUtils.splitLines(blob).filter(function(line) {\n    return line.indexOf(prefix) === 0;\n  });\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\nSDPUtils.parseCandidate = function(line) {\n  var parts;\n  // Parse both variants.\n  if (line.indexOf('a=candidate:') === 0) {\n    parts = line.substring(12).split(' ');\n  } else {\n    parts = line.substring(10).split(' ');\n  }\n\n  var candidate = {\n    foundation: parts[0],\n    component: parts[1],\n    protocol: parts[2].toLowerCase(),\n    priority: parseInt(parts[3], 10),\n    ip: parts[4],\n    port: parseInt(parts[5], 10),\n    // skip parts[6] == 'typ'\n    type: parts[7]\n  };\n\n  for (var i = 8; i < parts.length; i += 2) {\n    switch (parts[i]) {\n      case 'raddr':\n        candidate.relatedAddress = parts[i + 1];\n        break;\n      case 'rport':\n        candidate.relatedPort = parseInt(parts[i + 1], 10);\n        break;\n      case 'tcptype':\n        candidate.tcpType = parts[i + 1];\n        break;\n      default: // Unknown extensions are silently ignored.\n        break;\n    }\n  }\n  return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\nSDPUtils.writeCandidate = function(candidate) {\n  var sdp = [];\n  sdp.push(candidate.foundation);\n  sdp.push(candidate.component);\n  sdp.push(candidate.protocol.toUpperCase());\n  sdp.push(candidate.priority);\n  sdp.push(candidate.ip);\n  sdp.push(candidate.port);\n\n  var type = candidate.type;\n  sdp.push('typ');\n  sdp.push(type);\n  if (type !== 'host' && candidate.relatedAddress &&\n      candidate.relatedPort) {\n    sdp.push('raddr');\n    sdp.push(candidate.relatedAddress); // was: relAddr\n    sdp.push('rport');\n    sdp.push(candidate.relatedPort); // was: relPort\n  }\n  if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n    sdp.push('tcptype');\n    sdp.push(candidate.tcpType);\n  }\n  return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n  var parts = line.substr(9).split(' ');\n  var parsed = {\n    payloadType: parseInt(parts.shift(), 10) // was: id\n  };\n\n  parts = parts[0].split('/');\n\n  parsed.name = parts[0];\n  parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n  // was: channels\n  parsed.numChannels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n  return parsed;\n};\n\n// Generate an a=rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n  var pt = codec.payloadType;\n  if (codec.preferredPayloadType !== undefined) {\n    pt = codec.preferredPayloadType;\n  }\n  return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n      (codec.numChannels !== 1 ? '/' + codec.numChannels : '') + '\\r\\n';\n};\n\n// Parses an a=extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n  var parts = line.substr(9).split(' ');\n  return {\n    id: parseInt(parts[0], 10),\n    uri: parts[1]\n  };\n};\n\n// Generates a=extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n  return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n       ' ' + headerExtension.uri + '\\r\\n';\n};\n\n// Parses an ftmp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n  var parsed = {};\n  var kv;\n  var parts = line.substr(line.indexOf(' ') + 1).split(';');\n  for (var j = 0; j < parts.length; j++) {\n    kv = parts[j].trim().split('=');\n    parsed[kv[0].trim()] = kv[1];\n  }\n  return parsed;\n};\n\n// Generates an a=ftmp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n  var line = '';\n  var pt = codec.payloadType;\n  if (codec.preferredPayloadType !== undefined) {\n    pt = codec.preferredPayloadType;\n  }\n  if (codec.parameters && Object.keys(codec.parameters).length) {\n    var params = [];\n    Object.keys(codec.parameters).forEach(function(param) {\n      params.push(param + '=' + codec.parameters[param]);\n    });\n    line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n  }\n  return line;\n};\n\n// Parses an rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n  var parts = line.substr(line.indexOf(' ') + 1).split(' ');\n  return {\n    type: parts.shift(),\n    parameter: parts.join(' ')\n  };\n};\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n  var lines = '';\n  var pt = codec.payloadType;\n  if (codec.preferredPayloadType !== undefined) {\n    pt = codec.preferredPayloadType;\n  }\n  if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n    // FIXME: special handling for trr-int?\n    codec.rtcpFeedback.forEach(function(fb) {\n      lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n      (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n          '\\r\\n';\n    });\n  }\n  return lines;\n};\n\n// Parses an RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n  var sp = line.indexOf(' ');\n  var parts = {\n    ssrc: parseInt(line.substr(7, sp - 7), 10)\n  };\n  var colon = line.indexOf(':', sp);\n  if (colon > -1) {\n    parts.attribute = line.substr(sp + 1, colon - sp - 1);\n    parts.value = line.substr(colon + 1);\n  } else {\n    parts.attribute = line.substr(sp + 1);\n  }\n  return parts;\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n//   get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n  var lines = SDPUtils.splitLines(mediaSection);\n  // Search in session part, too.\n  lines = lines.concat(SDPUtils.splitLines(sessionpart));\n  var fpLine = lines.filter(function(line) {\n    return line.indexOf('a=fingerprint:') === 0;\n  })[0].substr(14);\n  // Note: a=setup line is ignored since we use the 'auto' role.\n  var dtlsParameters = {\n    role: 'auto',\n    fingerprints: [{\n      algorithm: fpLine.split(' ')[0],\n      value: fpLine.split(' ')[1]\n    }]\n  };\n  return dtlsParameters;\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n  var sdp = 'a=setup:' + setupType + '\\r\\n';\n  params.fingerprints.forEach(function(fp) {\n    sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n  });\n  return sdp;\n};\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n//   get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n  var lines = SDPUtils.splitLines(mediaSection);\n  // Search in session part, too.\n  lines = lines.concat(SDPUtils.splitLines(sessionpart));\n  var iceParameters = {\n    usernameFragment: lines.filter(function(line) {\n      return line.indexOf('a=ice-ufrag:') === 0;\n    })[0].substr(12),\n    password: lines.filter(function(line) {\n      return line.indexOf('a=ice-pwd:') === 0;\n    })[0].substr(10)\n  };\n  return iceParameters;\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n  return 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n      'a=ice-pwd:' + params.password + '\\r\\n';\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n  var description = {\n    codecs: [],\n    headerExtensions: [],\n    fecMechanisms: [],\n    rtcp: []\n  };\n  var lines = SDPUtils.splitLines(mediaSection);\n  var mline = lines[0].split(' ');\n  for (var i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n    var pt = mline[i];\n    var rtpmapline = SDPUtils.matchPrefix(\n        mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n    if (rtpmapline) {\n      var codec = SDPUtils.parseRtpMap(rtpmapline);\n      var fmtps = SDPUtils.matchPrefix(\n          mediaSection, 'a=fmtp:' + pt + ' ');\n      // Only the first a=fmtp:<pt> is considered.\n      codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n      codec.rtcpFeedback = SDPUtils.matchPrefix(\n          mediaSection, 'a=rtcp-fb:' + pt + ' ')\n        .map(SDPUtils.parseRtcpFb);\n      description.codecs.push(codec);\n      // parse FEC mechanisms from rtpmap lines.\n      switch (codec.name.toUpperCase()) {\n        case 'RED':\n        case 'ULPFEC':\n          description.fecMechanisms.push(codec.name.toUpperCase());\n          break;\n        default: // only RED and ULPFEC are recognized as FEC mechanisms.\n          break;\n      }\n    }\n  }\n  SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(function(line) {\n    description.headerExtensions.push(SDPUtils.parseExtmap(line));\n  });\n  // FIXME: parse rtcp.\n  return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n  var sdp = '';\n\n  // Build the mline.\n  sdp += 'm=' + kind + ' ';\n  sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n  sdp += ' UDP/TLS/RTP/SAVPF ';\n  sdp += caps.codecs.map(function(codec) {\n    if (codec.preferredPayloadType !== undefined) {\n      return codec.preferredPayloadType;\n    }\n    return codec.payloadType;\n  }).join(' ') + '\\r\\n';\n\n  sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n  sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n  // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n  caps.codecs.forEach(function(codec) {\n    sdp += SDPUtils.writeRtpMap(codec);\n    sdp += SDPUtils.writeFmtp(codec);\n    sdp += SDPUtils.writeRtcpFb(codec);\n  });\n  sdp += 'a=rtcp-mux\\r\\n';\n\n  caps.headerExtensions.forEach(function(extension) {\n    sdp += SDPUtils.writeExtmap(extension);\n  });\n  // FIXME: write fecMechanisms.\n  return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n  var encodingParameters = [];\n  var description = SDPUtils.parseRtpParameters(mediaSection);\n  var hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n  var hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n  // filter a=ssrc:... cname:, ignore PlanB-msid\n  var ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n  .map(function(line) {\n    return SDPUtils.parseSsrcMedia(line);\n  })\n  .filter(function(parts) {\n    return parts.attribute === 'cname';\n  });\n  var primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n  var secondarySsrc;\n\n  var flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n  .map(function(line) {\n    var parts = line.split(' ');\n    parts.shift();\n    return parts.map(function(part) {\n      return parseInt(part, 10);\n    });\n  });\n  if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n    secondarySsrc = flows[0][1];\n  }\n\n  description.codecs.forEach(function(codec) {\n    if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n      var encParam = {\n        ssrc: primarySsrc,\n        codecPayloadType: parseInt(codec.parameters.apt, 10),\n        rtx: {\n          payloadType: codec.payloadType,\n          ssrc: secondarySsrc\n        }\n      };\n      encodingParameters.push(encParam);\n      if (hasRed) {\n        encParam = JSON.parse(JSON.stringify(encParam));\n        encParam.fec = {\n          ssrc: secondarySsrc,\n          mechanism: hasUlpfec ? 'red+ulpfec' : 'red'\n        };\n        encodingParameters.push(encParam);\n      }\n    }\n  });\n  if (encodingParameters.length === 0 && primarySsrc) {\n    encodingParameters.push({\n      ssrc: primarySsrc\n    });\n  }\n\n  // we support both b=AS and b=TIAS but interpret AS as TIAS.\n  var bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n  if (bandwidth.length) {\n    if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n      bandwidth = parseInt(bandwidth[0].substr(7), 10);\n    } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n      bandwidth = parseInt(bandwidth[0].substr(5), 10);\n    }\n    encodingParameters.forEach(function(params) {\n      params.maxBitrate = bandwidth;\n    });\n  }\n  return encodingParameters;\n};\n\nSDPUtils.writeSessionBoilerplate = function() {\n  // FIXME: sess-id should be an NTP timestamp.\n  return 'v=0\\r\\n' +\n      'o=thisisadapterortc 8169639915646943137 2 IN IP4 127.0.0.1\\r\\n' +\n      's=-\\r\\n' +\n      't=0 0\\r\\n';\n};\n\nSDPUtils.writeMediaSection = function(transceiver, caps, type, stream) {\n  var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n  // Map ICE parameters (ufrag, pwd) to SDP.\n  sdp += SDPUtils.writeIceParameters(\n      transceiver.iceGatherer.getLocalParameters());\n\n  // Map DTLS parameters to SDP.\n  sdp += SDPUtils.writeDtlsParameters(\n      transceiver.dtlsTransport.getLocalParameters(),\n      type === 'offer' ? 'actpass' : 'active');\n\n  sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n  if (transceiver.rtpSender && transceiver.rtpReceiver) {\n    sdp += 'a=sendrecv\\r\\n';\n  } else if (transceiver.rtpSender) {\n    sdp += 'a=sendonly\\r\\n';\n  } else if (transceiver.rtpReceiver) {\n    sdp += 'a=recvonly\\r\\n';\n  } else {\n    sdp += 'a=inactive\\r\\n';\n  }\n\n  // FIXME: for RTX there might be multiple SSRCs. Not implemented in Edge yet.\n  if (transceiver.rtpSender) {\n    var msid = 'msid:' + stream.id + ' ' +\n        transceiver.rtpSender.track.id + '\\r\\n';\n    sdp += 'a=' + msid;\n    sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n        ' ' + msid;\n  }\n  // FIXME: this should be written by writeRtpDescription.\n  sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n      ' cname:' + SDPUtils.localCName + '\\r\\n';\n  return sdp;\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n  // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n  var lines = SDPUtils.splitLines(mediaSection);\n  for (var i = 0; i < lines.length; i++) {\n    switch (lines[i]) {\n      case 'a=sendrecv':\n      case 'a=sendonly':\n      case 'a=recvonly':\n      case 'a=inactive':\n        return lines[i].substr(2);\n      default:\n        // FIXME: What should happen here?\n    }\n  }\n  if (sessionpart) {\n    return SDPUtils.getDirection(sessionpart);\n  }\n  return 'sendrecv';\n};\n\n// Expose public methods.\nmodule.exports = SDPUtils;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDUyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zZHAvc2RwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIiAvKiBlc2xpbnQtZW52IG5vZGUgKi9cbid1c2Ugc3RyaWN0JztcblxuLy8gU0RQIGhlbHBlcnMuXG52YXIgU0RQVXRpbHMgPSB7fTtcblxuLy8gR2VuZXJhdGUgYW4gYWxwaGFudW1lcmljIGlkZW50aWZpZXIgZm9yIGNuYW1lIG9yIG1pZHMuXG4vLyBUT0RPOiB1c2UgVVVJRHMgaW5zdGVhZD8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vamVkLzk4Mjg4M1xuU0RQVXRpbHMuZ2VuZXJhdGVJZGVudGlmaWVyID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgMTApO1xufTtcblxuLy8gVGhlIFJUQ1AgQ05BTUUgdXNlZCBieSBhbGwgcGVlcmNvbm5lY3Rpb25zIGZyb20gdGhlIHNhbWUgSlMuXG5TRFBVdGlscy5sb2NhbENOYW1lID0gU0RQVXRpbHMuZ2VuZXJhdGVJZGVudGlmaWVyKCk7XG5cbi8vIFNwbGl0cyBTRFAgaW50byBsaW5lcywgZGVhbGluZyB3aXRoIGJvdGggQ1JMRiBhbmQgTEYuXG5TRFBVdGlscy5zcGxpdExpbmVzID0gZnVuY3Rpb24oYmxvYikge1xuICByZXR1cm4gYmxvYi50cmltKCkuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgcmV0dXJuIGxpbmUudHJpbSgpO1xuICB9KTtcbn07XG4vLyBTcGxpdHMgU0RQIGludG8gc2Vzc2lvbnBhcnQgYW5kIG1lZGlhc2VjdGlvbnMuIEVuc3VyZXMgQ1JMRi5cblNEUFV0aWxzLnNwbGl0U2VjdGlvbnMgPSBmdW5jdGlvbihibG9iKSB7XG4gIHZhciBwYXJ0cyA9IGJsb2Iuc3BsaXQoJ1xcbm09Jyk7XG4gIHJldHVybiBwYXJ0cy5tYXAoZnVuY3Rpb24ocGFydCwgaW5kZXgpIHtcbiAgICByZXR1cm4gKGluZGV4ID4gMCA/ICdtPScgKyBwYXJ0IDogcGFydCkudHJpbSgpICsgJ1xcclxcbic7XG4gIH0pO1xufTtcblxuLy8gUmV0dXJucyBsaW5lcyB0aGF0IHN0YXJ0IHdpdGggYSBjZXJ0YWluIHByZWZpeC5cblNEUFV0aWxzLm1hdGNoUHJlZml4ID0gZnVuY3Rpb24oYmxvYiwgcHJlZml4KSB7XG4gIHJldHVybiBTRFBVdGlscy5zcGxpdExpbmVzKGJsb2IpLmZpbHRlcihmdW5jdGlvbihsaW5lKSB7XG4gICAgcmV0dXJuIGxpbmUuaW5kZXhPZihwcmVmaXgpID09PSAwO1xuICB9KTtcbn07XG5cbi8vIFBhcnNlcyBhbiBJQ0UgY2FuZGlkYXRlIGxpbmUuIFNhbXBsZSBpbnB1dDpcbi8vIGNhbmRpZGF0ZTo3MDI3ODYzNTAgMiB1ZHAgNDE4MTk5MDIgOC44LjguOCA2MDc2OSB0eXAgcmVsYXkgcmFkZHIgOC44LjguOFxuLy8gcnBvcnQgNTU5OTZcIlxuU0RQVXRpbHMucGFyc2VDYW5kaWRhdGUgPSBmdW5jdGlvbihsaW5lKSB7XG4gIHZhciBwYXJ0cztcbiAgLy8gUGFyc2UgYm90aCB2YXJpYW50cy5cbiAgaWYgKGxpbmUuaW5kZXhPZignYT1jYW5kaWRhdGU6JykgPT09IDApIHtcbiAgICBwYXJ0cyA9IGxpbmUuc3Vic3RyaW5nKDEyKS5zcGxpdCgnICcpO1xuICB9IGVsc2Uge1xuICAgIHBhcnRzID0gbGluZS5zdWJzdHJpbmcoMTApLnNwbGl0KCcgJyk7XG4gIH1cblxuICB2YXIgY2FuZGlkYXRlID0ge1xuICAgIGZvdW5kYXRpb246IHBhcnRzWzBdLFxuICAgIGNvbXBvbmVudDogcGFydHNbMV0sXG4gICAgcHJvdG9jb2w6IHBhcnRzWzJdLnRvTG93ZXJDYXNlKCksXG4gICAgcHJpb3JpdHk6IHBhcnNlSW50KHBhcnRzWzNdLCAxMCksXG4gICAgaXA6IHBhcnRzWzRdLFxuICAgIHBvcnQ6IHBhcnNlSW50KHBhcnRzWzVdLCAxMCksXG4gICAgLy8gc2tpcCBwYXJ0c1s2XSA9PSAndHlwJ1xuICAgIHR5cGU6IHBhcnRzWzddXG4gIH07XG5cbiAgZm9yICh2YXIgaSA9IDg7IGkgPCBwYXJ0cy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHN3aXRjaCAocGFydHNbaV0pIHtcbiAgICAgIGNhc2UgJ3JhZGRyJzpcbiAgICAgICAgY2FuZGlkYXRlLnJlbGF0ZWRBZGRyZXNzID0gcGFydHNbaSArIDFdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Jwb3J0JzpcbiAgICAgICAgY2FuZGlkYXRlLnJlbGF0ZWRQb3J0ID0gcGFyc2VJbnQocGFydHNbaSArIDFdLCAxMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGNwdHlwZSc6XG4gICAgICAgIGNhbmRpZGF0ZS50Y3BUeXBlID0gcGFydHNbaSArIDFdO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6IC8vIFVua25vd24gZXh0ZW5zaW9ucyBhcmUgc2lsZW50bHkgaWdub3JlZC5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBjYW5kaWRhdGU7XG59O1xuXG4vLyBUcmFuc2xhdGVzIGEgY2FuZGlkYXRlIG9iamVjdCBpbnRvIFNEUCBjYW5kaWRhdGUgYXR0cmlidXRlLlxuU0RQVXRpbHMud3JpdGVDYW5kaWRhdGUgPSBmdW5jdGlvbihjYW5kaWRhdGUpIHtcbiAgdmFyIHNkcCA9IFtdO1xuICBzZHAucHVzaChjYW5kaWRhdGUuZm91bmRhdGlvbik7XG4gIHNkcC5wdXNoKGNhbmRpZGF0ZS5jb21wb25lbnQpO1xuICBzZHAucHVzaChjYW5kaWRhdGUucHJvdG9jb2wudG9VcHBlckNhc2UoKSk7XG4gIHNkcC5wdXNoKGNhbmRpZGF0ZS5wcmlvcml0eSk7XG4gIHNkcC5wdXNoKGNhbmRpZGF0ZS5pcCk7XG4gIHNkcC5wdXNoKGNhbmRpZGF0ZS5wb3J0KTtcblxuICB2YXIgdHlwZSA9IGNhbmRpZGF0ZS50eXBlO1xuICBzZHAucHVzaCgndHlwJyk7XG4gIHNkcC5wdXNoKHR5cGUpO1xuICBpZiAodHlwZSAhPT0gJ2hvc3QnICYmIGNhbmRpZGF0ZS5yZWxhdGVkQWRkcmVzcyAmJlxuICAgICAgY2FuZGlkYXRlLnJlbGF0ZWRQb3J0KSB7XG4gICAgc2RwLnB1c2goJ3JhZGRyJyk7XG4gICAgc2RwLnB1c2goY2FuZGlkYXRlLnJlbGF0ZWRBZGRyZXNzKTsgLy8gd2FzOiByZWxBZGRyXG4gICAgc2RwLnB1c2goJ3Jwb3J0Jyk7XG4gICAgc2RwLnB1c2goY2FuZGlkYXRlLnJlbGF0ZWRQb3J0KTsgLy8gd2FzOiByZWxQb3J0XG4gIH1cbiAgaWYgKGNhbmRpZGF0ZS50Y3BUeXBlICYmIGNhbmRpZGF0ZS5wcm90b2NvbC50b0xvd2VyQ2FzZSgpID09PSAndGNwJykge1xuICAgIHNkcC5wdXNoKCd0Y3B0eXBlJyk7XG4gICAgc2RwLnB1c2goY2FuZGlkYXRlLnRjcFR5cGUpO1xuICB9XG4gIHJldHVybiAnY2FuZGlkYXRlOicgKyBzZHAuam9pbignICcpO1xufTtcblxuLy8gUGFyc2VzIGFuIHJ0cG1hcCBsaW5lLCByZXR1cm5zIFJUQ1J0cENvZGRlY1BhcmFtZXRlcnMuIFNhbXBsZSBpbnB1dDpcbi8vIGE9cnRwbWFwOjExMSBvcHVzLzQ4MDAwLzJcblNEUFV0aWxzLnBhcnNlUnRwTWFwID0gZnVuY3Rpb24obGluZSkge1xuICB2YXIgcGFydHMgPSBsaW5lLnN1YnN0cig5KS5zcGxpdCgnICcpO1xuICB2YXIgcGFyc2VkID0ge1xuICAgIHBheWxvYWRUeXBlOiBwYXJzZUludChwYXJ0cy5zaGlmdCgpLCAxMCkgLy8gd2FzOiBpZFxuICB9O1xuXG4gIHBhcnRzID0gcGFydHNbMF0uc3BsaXQoJy8nKTtcblxuICBwYXJzZWQubmFtZSA9IHBhcnRzWzBdO1xuICBwYXJzZWQuY2xvY2tSYXRlID0gcGFyc2VJbnQocGFydHNbMV0sIDEwKTsgLy8gd2FzOiBjbG9ja3JhdGVcbiAgLy8gd2FzOiBjaGFubmVsc1xuICBwYXJzZWQubnVtQ2hhbm5lbHMgPSBwYXJ0cy5sZW5ndGggPT09IDMgPyBwYXJzZUludChwYXJ0c1syXSwgMTApIDogMTtcbiAgcmV0dXJuIHBhcnNlZDtcbn07XG5cbi8vIEdlbmVyYXRlIGFuIGE9cnRwbWFwIGxpbmUgZnJvbSBSVENSdHBDb2RlY0NhcGFiaWxpdHkgb3Jcbi8vIFJUQ1J0cENvZGVjUGFyYW1ldGVycy5cblNEUFV0aWxzLndyaXRlUnRwTWFwID0gZnVuY3Rpb24oY29kZWMpIHtcbiAgdmFyIHB0ID0gY29kZWMucGF5bG9hZFR5cGU7XG4gIGlmIChjb2RlYy5wcmVmZXJyZWRQYXlsb2FkVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcHQgPSBjb2RlYy5wcmVmZXJyZWRQYXlsb2FkVHlwZTtcbiAgfVxuICByZXR1cm4gJ2E9cnRwbWFwOicgKyBwdCArICcgJyArIGNvZGVjLm5hbWUgKyAnLycgKyBjb2RlYy5jbG9ja1JhdGUgK1xuICAgICAgKGNvZGVjLm51bUNoYW5uZWxzICE9PSAxID8gJy8nICsgY29kZWMubnVtQ2hhbm5lbHMgOiAnJykgKyAnXFxyXFxuJztcbn07XG5cbi8vIFBhcnNlcyBhbiBhPWV4dG1hcCBsaW5lIChoZWFkZXJleHRlbnNpb24gZnJvbSBSRkMgNTI4NSkuIFNhbXBsZSBpbnB1dDpcbi8vIGE9ZXh0bWFwOjIgdXJuOmlldGY6cGFyYW1zOnJ0cC1oZHJleHQ6dG9mZnNldFxuU0RQVXRpbHMucGFyc2VFeHRtYXAgPSBmdW5jdGlvbihsaW5lKSB7XG4gIHZhciBwYXJ0cyA9IGxpbmUuc3Vic3RyKDkpLnNwbGl0KCcgJyk7XG4gIHJldHVybiB7XG4gICAgaWQ6IHBhcnNlSW50KHBhcnRzWzBdLCAxMCksXG4gICAgdXJpOiBwYXJ0c1sxXVxuICB9O1xufTtcblxuLy8gR2VuZXJhdGVzIGE9ZXh0bWFwIGxpbmUgZnJvbSBSVENSdHBIZWFkZXJFeHRlbnNpb25QYXJhbWV0ZXJzIG9yXG4vLyBSVENSdHBIZWFkZXJFeHRlbnNpb24uXG5TRFBVdGlscy53cml0ZUV4dG1hcCA9IGZ1bmN0aW9uKGhlYWRlckV4dGVuc2lvbikge1xuICByZXR1cm4gJ2E9ZXh0bWFwOicgKyAoaGVhZGVyRXh0ZW5zaW9uLmlkIHx8IGhlYWRlckV4dGVuc2lvbi5wcmVmZXJyZWRJZCkgK1xuICAgICAgICcgJyArIGhlYWRlckV4dGVuc2lvbi51cmkgKyAnXFxyXFxuJztcbn07XG5cbi8vIFBhcnNlcyBhbiBmdG1wIGxpbmUsIHJldHVybnMgZGljdGlvbmFyeS4gU2FtcGxlIGlucHV0OlxuLy8gYT1mbXRwOjk2IHZicj1vbjtjbmc9b25cbi8vIEFsc28gZGVhbHMgd2l0aCB2YnI9b247IGNuZz1vblxuU0RQVXRpbHMucGFyc2VGbXRwID0gZnVuY3Rpb24obGluZSkge1xuICB2YXIgcGFyc2VkID0ge307XG4gIHZhciBrdjtcbiAgdmFyIHBhcnRzID0gbGluZS5zdWJzdHIobGluZS5pbmRleE9mKCcgJykgKyAxKS5zcGxpdCgnOycpO1xuICBmb3IgKHZhciBqID0gMDsgaiA8IHBhcnRzLmxlbmd0aDsgaisrKSB7XG4gICAga3YgPSBwYXJ0c1tqXS50cmltKCkuc3BsaXQoJz0nKTtcbiAgICBwYXJzZWRba3ZbMF0udHJpbSgpXSA9IGt2WzFdO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59O1xuXG4vLyBHZW5lcmF0ZXMgYW4gYT1mdG1wIGxpbmUgZnJvbSBSVENSdHBDb2RlY0NhcGFiaWxpdHkgb3IgUlRDUnRwQ29kZWNQYXJhbWV0ZXJzLlxuU0RQVXRpbHMud3JpdGVGbXRwID0gZnVuY3Rpb24oY29kZWMpIHtcbiAgdmFyIGxpbmUgPSAnJztcbiAgdmFyIHB0ID0gY29kZWMucGF5bG9hZFR5cGU7XG4gIGlmIChjb2RlYy5wcmVmZXJyZWRQYXlsb2FkVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcHQgPSBjb2RlYy5wcmVmZXJyZWRQYXlsb2FkVHlwZTtcbiAgfVxuICBpZiAoY29kZWMucGFyYW1ldGVycyAmJiBPYmplY3Qua2V5cyhjb2RlYy5wYXJhbWV0ZXJzKS5sZW5ndGgpIHtcbiAgICB2YXIgcGFyYW1zID0gW107XG4gICAgT2JqZWN0LmtleXMoY29kZWMucGFyYW1ldGVycykuZm9yRWFjaChmdW5jdGlvbihwYXJhbSkge1xuICAgICAgcGFyYW1zLnB1c2gocGFyYW0gKyAnPScgKyBjb2RlYy5wYXJhbWV0ZXJzW3BhcmFtXSk7XG4gICAgfSk7XG4gICAgbGluZSArPSAnYT1mbXRwOicgKyBwdCArICcgJyArIHBhcmFtcy5qb2luKCc7JykgKyAnXFxyXFxuJztcbiAgfVxuICByZXR1cm4gbGluZTtcbn07XG5cbi8vIFBhcnNlcyBhbiBydGNwLWZiIGxpbmUsIHJldHVybnMgUlRDUFJ0Y3BGZWVkYmFjayBvYmplY3QuIFNhbXBsZSBpbnB1dDpcbi8vIGE9cnRjcC1mYjo5OCBuYWNrIHJwc2lcblNEUFV0aWxzLnBhcnNlUnRjcEZiID0gZnVuY3Rpb24obGluZSkge1xuICB2YXIgcGFydHMgPSBsaW5lLnN1YnN0cihsaW5lLmluZGV4T2YoJyAnKSArIDEpLnNwbGl0KCcgJyk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogcGFydHMuc2hpZnQoKSxcbiAgICBwYXJhbWV0ZXI6IHBhcnRzLmpvaW4oJyAnKVxuICB9O1xufTtcbi8vIEdlbmVyYXRlIGE9cnRjcC1mYiBsaW5lcyBmcm9tIFJUQ1J0cENvZGVjQ2FwYWJpbGl0eSBvciBSVENSdHBDb2RlY1BhcmFtZXRlcnMuXG5TRFBVdGlscy53cml0ZVJ0Y3BGYiA9IGZ1bmN0aW9uKGNvZGVjKSB7XG4gIHZhciBsaW5lcyA9ICcnO1xuICB2YXIgcHQgPSBjb2RlYy5wYXlsb2FkVHlwZTtcbiAgaWYgKGNvZGVjLnByZWZlcnJlZFBheWxvYWRUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBwdCA9IGNvZGVjLnByZWZlcnJlZFBheWxvYWRUeXBlO1xuICB9XG4gIGlmIChjb2RlYy5ydGNwRmVlZGJhY2sgJiYgY29kZWMucnRjcEZlZWRiYWNrLmxlbmd0aCkge1xuICAgIC8vIEZJWE1FOiBzcGVjaWFsIGhhbmRsaW5nIGZvciB0cnItaW50P1xuICAgIGNvZGVjLnJ0Y3BGZWVkYmFjay5mb3JFYWNoKGZ1bmN0aW9uKGZiKSB7XG4gICAgICBsaW5lcyArPSAnYT1ydGNwLWZiOicgKyBwdCArICcgJyArIGZiLnR5cGUgK1xuICAgICAgKGZiLnBhcmFtZXRlciAmJiBmYi5wYXJhbWV0ZXIubGVuZ3RoID8gJyAnICsgZmIucGFyYW1ldGVyIDogJycpICtcbiAgICAgICAgICAnXFxyXFxuJztcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbGluZXM7XG59O1xuXG4vLyBQYXJzZXMgYW4gUkZDIDU1NzYgc3NyYyBtZWRpYSBhdHRyaWJ1dGUuIFNhbXBsZSBpbnB1dDpcbi8vIGE9c3NyYzozNzM1OTI4NTU5IGNuYW1lOnNvbWV0aGluZ1xuU0RQVXRpbHMucGFyc2VTc3JjTWVkaWEgPSBmdW5jdGlvbihsaW5lKSB7XG4gIHZhciBzcCA9IGxpbmUuaW5kZXhPZignICcpO1xuICB2YXIgcGFydHMgPSB7XG4gICAgc3NyYzogcGFyc2VJbnQobGluZS5zdWJzdHIoNywgc3AgLSA3KSwgMTApXG4gIH07XG4gIHZhciBjb2xvbiA9IGxpbmUuaW5kZXhPZignOicsIHNwKTtcbiAgaWYgKGNvbG9uID4gLTEpIHtcbiAgICBwYXJ0cy5hdHRyaWJ1dGUgPSBsaW5lLnN1YnN0cihzcCArIDEsIGNvbG9uIC0gc3AgLSAxKTtcbiAgICBwYXJ0cy52YWx1ZSA9IGxpbmUuc3Vic3RyKGNvbG9uICsgMSk7XG4gIH0gZWxzZSB7XG4gICAgcGFydHMuYXR0cmlidXRlID0gbGluZS5zdWJzdHIoc3AgKyAxKTtcbiAgfVxuICByZXR1cm4gcGFydHM7XG59O1xuXG4vLyBFeHRyYWN0cyBEVExTIHBhcmFtZXRlcnMgZnJvbSBTRFAgbWVkaWEgc2VjdGlvbiBvciBzZXNzaW9ucGFydC5cbi8vIEZJWE1FOiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciBmdW5jdGlvbnMgdGhpcyBzaG91bGQgb25seVxuLy8gICBnZXQgdGhlIGZpbmdlcnByaW50IGxpbmUgYXMgaW5wdXQuIFNlZSBhbHNvIGdldEljZVBhcmFtZXRlcnMuXG5TRFBVdGlscy5nZXREdGxzUGFyYW1ldGVycyA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbiwgc2Vzc2lvbnBhcnQpIHtcbiAgdmFyIGxpbmVzID0gU0RQVXRpbHMuc3BsaXRMaW5lcyhtZWRpYVNlY3Rpb24pO1xuICAvLyBTZWFyY2ggaW4gc2Vzc2lvbiBwYXJ0LCB0b28uXG4gIGxpbmVzID0gbGluZXMuY29uY2F0KFNEUFV0aWxzLnNwbGl0TGluZXMoc2Vzc2lvbnBhcnQpKTtcbiAgdmFyIGZwTGluZSA9IGxpbmVzLmZpbHRlcihmdW5jdGlvbihsaW5lKSB7XG4gICAgcmV0dXJuIGxpbmUuaW5kZXhPZignYT1maW5nZXJwcmludDonKSA9PT0gMDtcbiAgfSlbMF0uc3Vic3RyKDE0KTtcbiAgLy8gTm90ZTogYT1zZXR1cCBsaW5lIGlzIGlnbm9yZWQgc2luY2Ugd2UgdXNlIHRoZSAnYXV0bycgcm9sZS5cbiAgdmFyIGR0bHNQYXJhbWV0ZXJzID0ge1xuICAgIHJvbGU6ICdhdXRvJyxcbiAgICBmaW5nZXJwcmludHM6IFt7XG4gICAgICBhbGdvcml0aG06IGZwTGluZS5zcGxpdCgnICcpWzBdLFxuICAgICAgdmFsdWU6IGZwTGluZS5zcGxpdCgnICcpWzFdXG4gICAgfV1cbiAgfTtcbiAgcmV0dXJuIGR0bHNQYXJhbWV0ZXJzO1xufTtcblxuLy8gU2VyaWFsaXplcyBEVExTIHBhcmFtZXRlcnMgdG8gU0RQLlxuU0RQVXRpbHMud3JpdGVEdGxzUGFyYW1ldGVycyA9IGZ1bmN0aW9uKHBhcmFtcywgc2V0dXBUeXBlKSB7XG4gIHZhciBzZHAgPSAnYT1zZXR1cDonICsgc2V0dXBUeXBlICsgJ1xcclxcbic7XG4gIHBhcmFtcy5maW5nZXJwcmludHMuZm9yRWFjaChmdW5jdGlvbihmcCkge1xuICAgIHNkcCArPSAnYT1maW5nZXJwcmludDonICsgZnAuYWxnb3JpdGhtICsgJyAnICsgZnAudmFsdWUgKyAnXFxyXFxuJztcbiAgfSk7XG4gIHJldHVybiBzZHA7XG59O1xuLy8gUGFyc2VzIElDRSBpbmZvcm1hdGlvbiBmcm9tIFNEUCBtZWRpYSBzZWN0aW9uIG9yIHNlc3Npb25wYXJ0LlxuLy8gRklYTUU6IGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIGZ1bmN0aW9ucyB0aGlzIHNob3VsZCBvbmx5XG4vLyAgIGdldCB0aGUgaWNlLXVmcmFnIGFuZCBpY2UtcHdkIGxpbmVzIGFzIGlucHV0LlxuU0RQVXRpbHMuZ2V0SWNlUGFyYW1ldGVycyA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbiwgc2Vzc2lvbnBhcnQpIHtcbiAgdmFyIGxpbmVzID0gU0RQVXRpbHMuc3BsaXRMaW5lcyhtZWRpYVNlY3Rpb24pO1xuICAvLyBTZWFyY2ggaW4gc2Vzc2lvbiBwYXJ0LCB0b28uXG4gIGxpbmVzID0gbGluZXMuY29uY2F0KFNEUFV0aWxzLnNwbGl0TGluZXMoc2Vzc2lvbnBhcnQpKTtcbiAgdmFyIGljZVBhcmFtZXRlcnMgPSB7XG4gICAgdXNlcm5hbWVGcmFnbWVudDogbGluZXMuZmlsdGVyKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgIHJldHVybiBsaW5lLmluZGV4T2YoJ2E9aWNlLXVmcmFnOicpID09PSAwO1xuICAgIH0pWzBdLnN1YnN0cigxMiksXG4gICAgcGFzc3dvcmQ6IGxpbmVzLmZpbHRlcihmdW5jdGlvbihsaW5lKSB7XG4gICAgICByZXR1cm4gbGluZS5pbmRleE9mKCdhPWljZS1wd2Q6JykgPT09IDA7XG4gICAgfSlbMF0uc3Vic3RyKDEwKVxuICB9O1xuICByZXR1cm4gaWNlUGFyYW1ldGVycztcbn07XG5cbi8vIFNlcmlhbGl6ZXMgSUNFIHBhcmFtZXRlcnMgdG8gU0RQLlxuU0RQVXRpbHMud3JpdGVJY2VQYXJhbWV0ZXJzID0gZnVuY3Rpb24ocGFyYW1zKSB7XG4gIHJldHVybiAnYT1pY2UtdWZyYWc6JyArIHBhcmFtcy51c2VybmFtZUZyYWdtZW50ICsgJ1xcclxcbicgK1xuICAgICAgJ2E9aWNlLXB3ZDonICsgcGFyYW1zLnBhc3N3b3JkICsgJ1xcclxcbic7XG59O1xuXG4vLyBQYXJzZXMgdGhlIFNEUCBtZWRpYSBzZWN0aW9uIGFuZCByZXR1cm5zIFJUQ1J0cFBhcmFtZXRlcnMuXG5TRFBVdGlscy5wYXJzZVJ0cFBhcmFtZXRlcnMgPSBmdW5jdGlvbihtZWRpYVNlY3Rpb24pIHtcbiAgdmFyIGRlc2NyaXB0aW9uID0ge1xuICAgIGNvZGVjczogW10sXG4gICAgaGVhZGVyRXh0ZW5zaW9uczogW10sXG4gICAgZmVjTWVjaGFuaXNtczogW10sXG4gICAgcnRjcDogW11cbiAgfTtcbiAgdmFyIGxpbmVzID0gU0RQVXRpbHMuc3BsaXRMaW5lcyhtZWRpYVNlY3Rpb24pO1xuICB2YXIgbWxpbmUgPSBsaW5lc1swXS5zcGxpdCgnICcpO1xuICBmb3IgKHZhciBpID0gMzsgaSA8IG1saW5lLmxlbmd0aDsgaSsrKSB7IC8vIGZpbmQgYWxsIGNvZGVjcyBmcm9tIG1saW5lWzMuLl1cbiAgICB2YXIgcHQgPSBtbGluZVtpXTtcbiAgICB2YXIgcnRwbWFwbGluZSA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KFxuICAgICAgICBtZWRpYVNlY3Rpb24sICdhPXJ0cG1hcDonICsgcHQgKyAnICcpWzBdO1xuICAgIGlmIChydHBtYXBsaW5lKSB7XG4gICAgICB2YXIgY29kZWMgPSBTRFBVdGlscy5wYXJzZVJ0cE1hcChydHBtYXBsaW5lKTtcbiAgICAgIHZhciBmbXRwcyA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KFxuICAgICAgICAgIG1lZGlhU2VjdGlvbiwgJ2E9Zm10cDonICsgcHQgKyAnICcpO1xuICAgICAgLy8gT25seSB0aGUgZmlyc3QgYT1mbXRwOjxwdD4gaXMgY29uc2lkZXJlZC5cbiAgICAgIGNvZGVjLnBhcmFtZXRlcnMgPSBmbXRwcy5sZW5ndGggPyBTRFBVdGlscy5wYXJzZUZtdHAoZm10cHNbMF0pIDoge307XG4gICAgICBjb2RlYy5ydGNwRmVlZGJhY2sgPSBTRFBVdGlscy5tYXRjaFByZWZpeChcbiAgICAgICAgICBtZWRpYVNlY3Rpb24sICdhPXJ0Y3AtZmI6JyArIHB0ICsgJyAnKVxuICAgICAgICAubWFwKFNEUFV0aWxzLnBhcnNlUnRjcEZiKTtcbiAgICAgIGRlc2NyaXB0aW9uLmNvZGVjcy5wdXNoKGNvZGVjKTtcbiAgICAgIC8vIHBhcnNlIEZFQyBtZWNoYW5pc21zIGZyb20gcnRwbWFwIGxpbmVzLlxuICAgICAgc3dpdGNoIChjb2RlYy5uYW1lLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgY2FzZSAnUkVEJzpcbiAgICAgICAgY2FzZSAnVUxQRkVDJzpcbiAgICAgICAgICBkZXNjcmlwdGlvbi5mZWNNZWNoYW5pc21zLnB1c2goY29kZWMubmFtZS50b1VwcGVyQ2FzZSgpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDogLy8gb25seSBSRUQgYW5kIFVMUEZFQyBhcmUgcmVjb2duaXplZCBhcyBGRUMgbWVjaGFuaXNtcy5cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgU0RQVXRpbHMubWF0Y2hQcmVmaXgobWVkaWFTZWN0aW9uLCAnYT1leHRtYXA6JykuZm9yRWFjaChmdW5jdGlvbihsaW5lKSB7XG4gICAgZGVzY3JpcHRpb24uaGVhZGVyRXh0ZW5zaW9ucy5wdXNoKFNEUFV0aWxzLnBhcnNlRXh0bWFwKGxpbmUpKTtcbiAgfSk7XG4gIC8vIEZJWE1FOiBwYXJzZSBydGNwLlxuICByZXR1cm4gZGVzY3JpcHRpb247XG59O1xuXG4vLyBHZW5lcmF0ZXMgcGFydHMgb2YgdGhlIFNEUCBtZWRpYSBzZWN0aW9uIGRlc2NyaWJpbmcgdGhlIGNhcGFiaWxpdGllcyAvXG4vLyBwYXJhbWV0ZXJzLlxuU0RQVXRpbHMud3JpdGVSdHBEZXNjcmlwdGlvbiA9IGZ1bmN0aW9uKGtpbmQsIGNhcHMpIHtcbiAgdmFyIHNkcCA9ICcnO1xuXG4gIC8vIEJ1aWxkIHRoZSBtbGluZS5cbiAgc2RwICs9ICdtPScgKyBraW5kICsgJyAnO1xuICBzZHAgKz0gY2Fwcy5jb2RlY3MubGVuZ3RoID4gMCA/ICc5JyA6ICcwJzsgLy8gcmVqZWN0IGlmIG5vIGNvZGVjcy5cbiAgc2RwICs9ICcgVURQL1RMUy9SVFAvU0FWUEYgJztcbiAgc2RwICs9IGNhcHMuY29kZWNzLm1hcChmdW5jdGlvbihjb2RlYykge1xuICAgIGlmIChjb2RlYy5wcmVmZXJyZWRQYXlsb2FkVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY29kZWMucHJlZmVycmVkUGF5bG9hZFR5cGU7XG4gICAgfVxuICAgIHJldHVybiBjb2RlYy5wYXlsb2FkVHlwZTtcbiAgfSkuam9pbignICcpICsgJ1xcclxcbic7XG5cbiAgc2RwICs9ICdjPUlOIElQNCAwLjAuMC4wXFxyXFxuJztcbiAgc2RwICs9ICdhPXJ0Y3A6OSBJTiBJUDQgMC4wLjAuMFxcclxcbic7XG5cbiAgLy8gQWRkIGE9cnRwbWFwIGxpbmVzIGZvciBlYWNoIGNvZGVjLiBBbHNvIGZtdHAgYW5kIHJ0Y3AtZmIuXG4gIGNhcHMuY29kZWNzLmZvckVhY2goZnVuY3Rpb24oY29kZWMpIHtcbiAgICBzZHAgKz0gU0RQVXRpbHMud3JpdGVSdHBNYXAoY29kZWMpO1xuICAgIHNkcCArPSBTRFBVdGlscy53cml0ZUZtdHAoY29kZWMpO1xuICAgIHNkcCArPSBTRFBVdGlscy53cml0ZVJ0Y3BGYihjb2RlYyk7XG4gIH0pO1xuICBzZHAgKz0gJ2E9cnRjcC1tdXhcXHJcXG4nO1xuXG4gIGNhcHMuaGVhZGVyRXh0ZW5zaW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgIHNkcCArPSBTRFBVdGlscy53cml0ZUV4dG1hcChleHRlbnNpb24pO1xuICB9KTtcbiAgLy8gRklYTUU6IHdyaXRlIGZlY01lY2hhbmlzbXMuXG4gIHJldHVybiBzZHA7XG59O1xuXG4vLyBQYXJzZXMgdGhlIFNEUCBtZWRpYSBzZWN0aW9uIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mXG4vLyBSVENSdHBFbmNvZGluZ1BhcmFtZXRlcnMuXG5TRFBVdGlscy5wYXJzZVJ0cEVuY29kaW5nUGFyYW1ldGVycyA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbikge1xuICB2YXIgZW5jb2RpbmdQYXJhbWV0ZXJzID0gW107XG4gIHZhciBkZXNjcmlwdGlvbiA9IFNEUFV0aWxzLnBhcnNlUnRwUGFyYW1ldGVycyhtZWRpYVNlY3Rpb24pO1xuICB2YXIgaGFzUmVkID0gZGVzY3JpcHRpb24uZmVjTWVjaGFuaXNtcy5pbmRleE9mKCdSRUQnKSAhPT0gLTE7XG4gIHZhciBoYXNVbHBmZWMgPSBkZXNjcmlwdGlvbi5mZWNNZWNoYW5pc21zLmluZGV4T2YoJ1VMUEZFQycpICE9PSAtMTtcblxuICAvLyBmaWx0ZXIgYT1zc3JjOi4uLiBjbmFtZTosIGlnbm9yZSBQbGFuQi1tc2lkXG4gIHZhciBzc3JjcyA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiwgJ2E9c3NyYzonKVxuICAubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICByZXR1cm4gU0RQVXRpbHMucGFyc2VTc3JjTWVkaWEobGluZSk7XG4gIH0pXG4gIC5maWx0ZXIoZnVuY3Rpb24ocGFydHMpIHtcbiAgICByZXR1cm4gcGFydHMuYXR0cmlidXRlID09PSAnY25hbWUnO1xuICB9KTtcbiAgdmFyIHByaW1hcnlTc3JjID0gc3NyY3MubGVuZ3RoID4gMCAmJiBzc3Jjc1swXS5zc3JjO1xuICB2YXIgc2Vjb25kYXJ5U3NyYztcblxuICB2YXIgZmxvd3MgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPXNzcmMtZ3JvdXA6RklEJylcbiAgLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgdmFyIHBhcnRzID0gbGluZS5zcGxpdCgnICcpO1xuICAgIHBhcnRzLnNoaWZ0KCk7XG4gICAgcmV0dXJuIHBhcnRzLm1hcChmdW5jdGlvbihwYXJ0KSB7XG4gICAgICByZXR1cm4gcGFyc2VJbnQocGFydCwgMTApO1xuICAgIH0pO1xuICB9KTtcbiAgaWYgKGZsb3dzLmxlbmd0aCA+IDAgJiYgZmxvd3NbMF0ubGVuZ3RoID4gMSAmJiBmbG93c1swXVswXSA9PT0gcHJpbWFyeVNzcmMpIHtcbiAgICBzZWNvbmRhcnlTc3JjID0gZmxvd3NbMF1bMV07XG4gIH1cblxuICBkZXNjcmlwdGlvbi5jb2RlY3MuZm9yRWFjaChmdW5jdGlvbihjb2RlYykge1xuICAgIGlmIChjb2RlYy5uYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdSVFgnICYmIGNvZGVjLnBhcmFtZXRlcnMuYXB0KSB7XG4gICAgICB2YXIgZW5jUGFyYW0gPSB7XG4gICAgICAgIHNzcmM6IHByaW1hcnlTc3JjLFxuICAgICAgICBjb2RlY1BheWxvYWRUeXBlOiBwYXJzZUludChjb2RlYy5wYXJhbWV0ZXJzLmFwdCwgMTApLFxuICAgICAgICBydHg6IHtcbiAgICAgICAgICBwYXlsb2FkVHlwZTogY29kZWMucGF5bG9hZFR5cGUsXG4gICAgICAgICAgc3NyYzogc2Vjb25kYXJ5U3NyY1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgZW5jb2RpbmdQYXJhbWV0ZXJzLnB1c2goZW5jUGFyYW0pO1xuICAgICAgaWYgKGhhc1JlZCkge1xuICAgICAgICBlbmNQYXJhbSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZW5jUGFyYW0pKTtcbiAgICAgICAgZW5jUGFyYW0uZmVjID0ge1xuICAgICAgICAgIHNzcmM6IHNlY29uZGFyeVNzcmMsXG4gICAgICAgICAgbWVjaGFuaXNtOiBoYXNVbHBmZWMgPyAncmVkK3VscGZlYycgOiAncmVkJ1xuICAgICAgICB9O1xuICAgICAgICBlbmNvZGluZ1BhcmFtZXRlcnMucHVzaChlbmNQYXJhbSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgaWYgKGVuY29kaW5nUGFyYW1ldGVycy5sZW5ndGggPT09IDAgJiYgcHJpbWFyeVNzcmMpIHtcbiAgICBlbmNvZGluZ1BhcmFtZXRlcnMucHVzaCh7XG4gICAgICBzc3JjOiBwcmltYXJ5U3NyY1xuICAgIH0pO1xuICB9XG5cbiAgLy8gd2Ugc3VwcG9ydCBib3RoIGI9QVMgYW5kIGI9VElBUyBidXQgaW50ZXJwcmV0IEFTIGFzIFRJQVMuXG4gIHZhciBiYW5kd2lkdGggPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdiPScpO1xuICBpZiAoYmFuZHdpZHRoLmxlbmd0aCkge1xuICAgIGlmIChiYW5kd2lkdGhbMF0uaW5kZXhPZignYj1USUFTOicpID09PSAwKSB7XG4gICAgICBiYW5kd2lkdGggPSBwYXJzZUludChiYW5kd2lkdGhbMF0uc3Vic3RyKDcpLCAxMCk7XG4gICAgfSBlbHNlIGlmIChiYW5kd2lkdGhbMF0uaW5kZXhPZignYj1BUzonKSA9PT0gMCkge1xuICAgICAgYmFuZHdpZHRoID0gcGFyc2VJbnQoYmFuZHdpZHRoWzBdLnN1YnN0cig1KSwgMTApO1xuICAgIH1cbiAgICBlbmNvZGluZ1BhcmFtZXRlcnMuZm9yRWFjaChmdW5jdGlvbihwYXJhbXMpIHtcbiAgICAgIHBhcmFtcy5tYXhCaXRyYXRlID0gYmFuZHdpZHRoO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBlbmNvZGluZ1BhcmFtZXRlcnM7XG59O1xuXG5TRFBVdGlscy53cml0ZVNlc3Npb25Cb2lsZXJwbGF0ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyBGSVhNRTogc2Vzcy1pZCBzaG91bGQgYmUgYW4gTlRQIHRpbWVzdGFtcC5cbiAgcmV0dXJuICd2PTBcXHJcXG4nICtcbiAgICAgICdvPXRoaXNpc2FkYXB0ZXJvcnRjIDgxNjk2Mzk5MTU2NDY5NDMxMzcgMiBJTiBJUDQgMTI3LjAuMC4xXFxyXFxuJyArXG4gICAgICAncz0tXFxyXFxuJyArXG4gICAgICAndD0wIDBcXHJcXG4nO1xufTtcblxuU0RQVXRpbHMud3JpdGVNZWRpYVNlY3Rpb24gPSBmdW5jdGlvbih0cmFuc2NlaXZlciwgY2FwcywgdHlwZSwgc3RyZWFtKSB7XG4gIHZhciBzZHAgPSBTRFBVdGlscy53cml0ZVJ0cERlc2NyaXB0aW9uKHRyYW5zY2VpdmVyLmtpbmQsIGNhcHMpO1xuXG4gIC8vIE1hcCBJQ0UgcGFyYW1ldGVycyAodWZyYWcsIHB3ZCkgdG8gU0RQLlxuICBzZHAgKz0gU0RQVXRpbHMud3JpdGVJY2VQYXJhbWV0ZXJzKFxuICAgICAgdHJhbnNjZWl2ZXIuaWNlR2F0aGVyZXIuZ2V0TG9jYWxQYXJhbWV0ZXJzKCkpO1xuXG4gIC8vIE1hcCBEVExTIHBhcmFtZXRlcnMgdG8gU0RQLlxuICBzZHAgKz0gU0RQVXRpbHMud3JpdGVEdGxzUGFyYW1ldGVycyhcbiAgICAgIHRyYW5zY2VpdmVyLmR0bHNUcmFuc3BvcnQuZ2V0TG9jYWxQYXJhbWV0ZXJzKCksXG4gICAgICB0eXBlID09PSAnb2ZmZXInID8gJ2FjdHBhc3MnIDogJ2FjdGl2ZScpO1xuXG4gIHNkcCArPSAnYT1taWQ6JyArIHRyYW5zY2VpdmVyLm1pZCArICdcXHJcXG4nO1xuXG4gIGlmICh0cmFuc2NlaXZlci5ydHBTZW5kZXIgJiYgdHJhbnNjZWl2ZXIucnRwUmVjZWl2ZXIpIHtcbiAgICBzZHAgKz0gJ2E9c2VuZHJlY3ZcXHJcXG4nO1xuICB9IGVsc2UgaWYgKHRyYW5zY2VpdmVyLnJ0cFNlbmRlcikge1xuICAgIHNkcCArPSAnYT1zZW5kb25seVxcclxcbic7XG4gIH0gZWxzZSBpZiAodHJhbnNjZWl2ZXIucnRwUmVjZWl2ZXIpIHtcbiAgICBzZHAgKz0gJ2E9cmVjdm9ubHlcXHJcXG4nO1xuICB9IGVsc2Uge1xuICAgIHNkcCArPSAnYT1pbmFjdGl2ZVxcclxcbic7XG4gIH1cblxuICAvLyBGSVhNRTogZm9yIFJUWCB0aGVyZSBtaWdodCBiZSBtdWx0aXBsZSBTU1JDcy4gTm90IGltcGxlbWVudGVkIGluIEVkZ2UgeWV0LlxuICBpZiAodHJhbnNjZWl2ZXIucnRwU2VuZGVyKSB7XG4gICAgdmFyIG1zaWQgPSAnbXNpZDonICsgc3RyZWFtLmlkICsgJyAnICtcbiAgICAgICAgdHJhbnNjZWl2ZXIucnRwU2VuZGVyLnRyYWNrLmlkICsgJ1xcclxcbic7XG4gICAgc2RwICs9ICdhPScgKyBtc2lkO1xuICAgIHNkcCArPSAnYT1zc3JjOicgKyB0cmFuc2NlaXZlci5zZW5kRW5jb2RpbmdQYXJhbWV0ZXJzWzBdLnNzcmMgK1xuICAgICAgICAnICcgKyBtc2lkO1xuICB9XG4gIC8vIEZJWE1FOiB0aGlzIHNob3VsZCBiZSB3cml0dGVuIGJ5IHdyaXRlUnRwRGVzY3JpcHRpb24uXG4gIHNkcCArPSAnYT1zc3JjOicgKyB0cmFuc2NlaXZlci5zZW5kRW5jb2RpbmdQYXJhbWV0ZXJzWzBdLnNzcmMgK1xuICAgICAgJyBjbmFtZTonICsgU0RQVXRpbHMubG9jYWxDTmFtZSArICdcXHJcXG4nO1xuICByZXR1cm4gc2RwO1xufTtcblxuLy8gR2V0cyB0aGUgZGlyZWN0aW9uIGZyb20gdGhlIG1lZGlhU2VjdGlvbiBvciB0aGUgc2Vzc2lvbnBhcnQuXG5TRFBVdGlscy5nZXREaXJlY3Rpb24gPSBmdW5jdGlvbihtZWRpYVNlY3Rpb24sIHNlc3Npb25wYXJ0KSB7XG4gIC8vIExvb2sgZm9yIHNlbmRyZWN2LCBzZW5kb25seSwgcmVjdm9ubHksIGluYWN0aXZlLCBkZWZhdWx0IHRvIHNlbmRyZWN2LlxuICB2YXIgbGluZXMgPSBTRFBVdGlscy5zcGxpdExpbmVzKG1lZGlhU2VjdGlvbik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICBzd2l0Y2ggKGxpbmVzW2ldKSB7XG4gICAgICBjYXNlICdhPXNlbmRyZWN2JzpcbiAgICAgIGNhc2UgJ2E9c2VuZG9ubHknOlxuICAgICAgY2FzZSAnYT1yZWN2b25seSc6XG4gICAgICBjYXNlICdhPWluYWN0aXZlJzpcbiAgICAgICAgcmV0dXJuIGxpbmVzW2ldLnN1YnN0cigyKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIEZJWE1FOiBXaGF0IHNob3VsZCBoYXBwZW4gaGVyZT9cbiAgICB9XG4gIH1cbiAgaWYgKHNlc3Npb25wYXJ0KSB7XG4gICAgcmV0dXJuIFNEUFV0aWxzLmdldERpcmVjdGlvbihzZXNzaW9ucGFydCk7XG4gIH1cbiAgcmV0dXJuICdzZW5kcmVjdic7XG59O1xuXG4vLyBFeHBvc2UgcHVibGljIG1ldGhvZHMuXG5tb2R1bGUuZXhwb3J0cyA9IFNEUFV0aWxzO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3NkcC9zZHAuanNcbi8vIG1vZHVsZSBpZCA9IDQ1MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 453 */
/***/ function(module, exports) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\n// Expose public methods.\nmodule.exports = function() {\n  var shimError_ = function(e) {\n    return {\n      name: {PermissionDeniedError: 'NotAllowedError'}[e.name] || e.name,\n      message: e.message,\n      constraint: e.constraint,\n      toString: function() {\n        return this.name;\n      }\n    };\n  };\n\n  // getUserMedia error shim.\n  var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n      bind(navigator.mediaDevices);\n  navigator.mediaDevices.getUserMedia = function(c) {\n    return origGetUserMedia(c).catch(function(e) {\n      return Promise.reject(shimError_(e));\n    });\n  };\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDUzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2NhbG1lZGlhL25vZGVfbW9kdWxlcy93ZWJydGMtYWRhcHRlci9zcmMvanMvZWRnZS9nZXR1c2VybWVkaWEuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqICBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFdlYlJUQyBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2VcbiAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2VcbiAqICB0cmVlLlxuICovXG4gLyogZXNsaW50LWVudiBub2RlICovXG4ndXNlIHN0cmljdCc7XG5cbi8vIEV4cG9zZSBwdWJsaWMgbWV0aG9kcy5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzaGltRXJyb3JfID0gZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiB7UGVybWlzc2lvbkRlbmllZEVycm9yOiAnTm90QWxsb3dlZEVycm9yJ31bZS5uYW1lXSB8fCBlLm5hbWUsXG4gICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICBjb25zdHJhaW50OiBlLmNvbnN0cmFpbnQsXG4gICAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICAvLyBnZXRVc2VyTWVkaWEgZXJyb3Igc2hpbS5cbiAgdmFyIG9yaWdHZXRVc2VyTWVkaWEgPSBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYS5cbiAgICAgIGJpbmQobmF2aWdhdG9yLm1lZGlhRGV2aWNlcyk7XG4gIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhID0gZnVuY3Rpb24oYykge1xuICAgIHJldHVybiBvcmlnR2V0VXNlck1lZGlhKGMpLmNhdGNoKGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChzaGltRXJyb3JfKGUpKTtcbiAgICB9KTtcbiAgfTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9jYWxtZWRpYS9+L3dlYnJ0Yy1hZGFwdGVyL3NyYy9qcy9lZGdlL2dldHVzZXJtZWRpYS5qc1xuLy8gbW9kdWxlIGlkID0gNDUzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 454 */
/***/ function(module, exports, __webpack_require__) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar logging = __webpack_require__(448).log;\nvar browserDetails = __webpack_require__(448).browserDetails;\n\nvar firefoxShim = {\n  shimOnTrack: function() {\n    if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n        window.RTCPeerConnection.prototype)) {\n      Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n        get: function() {\n          return this._ontrack;\n        },\n        set: function(f) {\n          if (this._ontrack) {\n            this.removeEventListener('track', this._ontrack);\n            this.removeEventListener('addstream', this._ontrackpoly);\n          }\n          this.addEventListener('track', this._ontrack = f);\n          this.addEventListener('addstream', this._ontrackpoly = function(e) {\n            e.stream.getTracks().forEach(function(track) {\n              var event = new Event('track');\n              event.track = track;\n              event.receiver = {track: track};\n              event.streams = [e.stream];\n              this.dispatchEvent(event);\n            }.bind(this));\n          }.bind(this));\n        }\n      });\n    }\n  },\n\n  shimSourceObject: function() {\n    // Firefox has supported mozSrcObject since FF22, unprefixed in 42.\n    if (typeof window === 'object') {\n      if (window.HTMLMediaElement &&\n        !('srcObject' in window.HTMLMediaElement.prototype)) {\n        // Shim the srcObject property, once, when HTMLMediaElement is found.\n        Object.defineProperty(window.HTMLMediaElement.prototype, 'srcObject', {\n          get: function() {\n            return this.mozSrcObject;\n          },\n          set: function(stream) {\n            this.mozSrcObject = stream;\n          }\n        });\n      }\n    }\n  },\n\n  shimPeerConnection: function() {\n    if (typeof window !== 'object' || !(window.RTCPeerConnection ||\n        window.mozRTCPeerConnection)) {\n      return; // probably media.peerconnection.enabled=false in about:config\n    }\n    // The RTCPeerConnection object.\n    if (!window.RTCPeerConnection) {\n      window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n        if (browserDetails.version < 38) {\n          // .urls is not supported in FF < 38.\n          // create RTCIceServers with a single url.\n          if (pcConfig && pcConfig.iceServers) {\n            var newIceServers = [];\n            for (var i = 0; i < pcConfig.iceServers.length; i++) {\n              var server = pcConfig.iceServers[i];\n              if (server.hasOwnProperty('urls')) {\n                for (var j = 0; j < server.urls.length; j++) {\n                  var newServer = {\n                    url: server.urls[j]\n                  };\n                  if (server.urls[j].indexOf('turn') === 0) {\n                    newServer.username = server.username;\n                    newServer.credential = server.credential;\n                  }\n                  newIceServers.push(newServer);\n                }\n              } else {\n                newIceServers.push(pcConfig.iceServers[i]);\n              }\n            }\n            pcConfig.iceServers = newIceServers;\n          }\n        }\n        return new mozRTCPeerConnection(pcConfig, pcConstraints);\n      };\n      window.RTCPeerConnection.prototype = mozRTCPeerConnection.prototype;\n\n      // wrap static methods. Currently just generateCertificate.\n      if (mozRTCPeerConnection.generateCertificate) {\n        Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n          get: function() {\n            return mozRTCPeerConnection.generateCertificate;\n          }\n        });\n      }\n\n      window.RTCSessionDescription = mozRTCSessionDescription;\n      window.RTCIceCandidate = mozRTCIceCandidate;\n    }\n\n    // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n    ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n        .forEach(function(method) {\n          var nativeMethod = RTCPeerConnection.prototype[method];\n          RTCPeerConnection.prototype[method] = function() {\n            arguments[0] = new ((method === 'addIceCandidate') ?\n                RTCIceCandidate : RTCSessionDescription)(arguments[0]);\n            return nativeMethod.apply(this, arguments);\n          };\n        });\n\n    // support for addIceCandidate(null)\n    var nativeAddIceCandidate =\n        RTCPeerConnection.prototype.addIceCandidate;\n    RTCPeerConnection.prototype.addIceCandidate = function() {\n      return arguments[0] === null ? Promise.resolve()\n          : nativeAddIceCandidate.apply(this, arguments);\n    };\n\n    // shim getStats with maplike support\n    var makeMapStats = function(stats) {\n      var map = new Map();\n      Object.keys(stats).forEach(function(key) {\n        map.set(key, stats[key]);\n        map[key] = stats[key];\n      });\n      return map;\n    };\n\n    var nativeGetStats = RTCPeerConnection.prototype.getStats;\n    RTCPeerConnection.prototype.getStats = function(selector, onSucc, onErr) {\n      return nativeGetStats.apply(this, [selector || null])\n        .then(function(stats) {\n          return makeMapStats(stats);\n        })\n        .then(onSucc, onErr);\n    };\n  },\n\n  // Attach a media stream to an element.\n  attachMediaStream: function(element, stream) {\n    logging('DEPRECATED, attachMediaStream will soon be removed.');\n    element.srcObject = stream;\n  },\n\n  reattachMediaStream: function(to, from) {\n    logging('DEPRECATED, reattachMediaStream will soon be removed.');\n    to.srcObject = from.srcObject;\n  }\n};\n\n// Expose public methods.\nmodule.exports = {\n  shimOnTrack: firefoxShim.shimOnTrack,\n  shimSourceObject: firefoxShim.shimSourceObject,\n  shimPeerConnection: firefoxShim.shimPeerConnection,\n  shimGetUserMedia: __webpack_require__(455),\n  attachMediaStream: firefoxShim.attachMediaStream,\n  reattachMediaStream: firefoxShim.reattachMediaStream\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2NhbG1lZGlhL25vZGVfbW9kdWxlcy93ZWJydGMtYWRhcHRlci9zcmMvanMvZmlyZWZveC9maXJlZm94X3NoaW0uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqICBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFdlYlJUQyBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2VcbiAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2VcbiAqICB0cmVlLlxuICovXG4gLyogZXNsaW50LWVudiBub2RlICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBsb2dnaW5nID0gcmVxdWlyZSgnLi4vdXRpbHMnKS5sb2c7XG52YXIgYnJvd3NlckRldGFpbHMgPSByZXF1aXJlKCcuLi91dGlscycpLmJyb3dzZXJEZXRhaWxzO1xuXG52YXIgZmlyZWZveFNoaW0gPSB7XG4gIHNoaW1PblRyYWNrOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcgJiYgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uICYmICEoJ29udHJhY2snIGluXG4gICAgICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUpKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZSwgJ29udHJhY2snLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX29udHJhY2s7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24oZikge1xuICAgICAgICAgIGlmICh0aGlzLl9vbnRyYWNrKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYWNrJywgdGhpcy5fb250cmFjayk7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2FkZHN0cmVhbScsIHRoaXMuX29udHJhY2twb2x5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCd0cmFjaycsIHRoaXMuX29udHJhY2sgPSBmKTtcbiAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2FkZHN0cmVhbScsIHRoaXMuX29udHJhY2twb2x5ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgZS5zdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaChmdW5jdGlvbih0cmFjaykge1xuICAgICAgICAgICAgICB2YXIgZXZlbnQgPSBuZXcgRXZlbnQoJ3RyYWNrJyk7XG4gICAgICAgICAgICAgIGV2ZW50LnRyYWNrID0gdHJhY2s7XG4gICAgICAgICAgICAgIGV2ZW50LnJlY2VpdmVyID0ge3RyYWNrOiB0cmFja307XG4gICAgICAgICAgICAgIGV2ZW50LnN0cmVhbXMgPSBbZS5zdHJlYW1dO1xuICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgc2hpbVNvdXJjZU9iamVjdDogZnVuY3Rpb24oKSB7XG4gICAgLy8gRmlyZWZveCBoYXMgc3VwcG9ydGVkIG1velNyY09iamVjdCBzaW5jZSBGRjIyLCB1bnByZWZpeGVkIGluIDQyLlxuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHdpbmRvdy5IVE1MTWVkaWFFbGVtZW50ICYmXG4gICAgICAgICEoJ3NyY09iamVjdCcgaW4gd2luZG93LkhUTUxNZWRpYUVsZW1lbnQucHJvdG90eXBlKSkge1xuICAgICAgICAvLyBTaGltIHRoZSBzcmNPYmplY3QgcHJvcGVydHksIG9uY2UsIHdoZW4gSFRNTE1lZGlhRWxlbWVudCBpcyBmb3VuZC5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5IVE1MTWVkaWFFbGVtZW50LnByb3RvdHlwZSwgJ3NyY09iamVjdCcsIHtcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubW96U3JjT2JqZWN0O1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc2V0OiBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICAgICAgICAgIHRoaXMubW96U3JjT2JqZWN0ID0gc3RyZWFtO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHNoaW1QZWVyQ29ubmVjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICdvYmplY3QnIHx8ICEod2luZG93LlJUQ1BlZXJDb25uZWN0aW9uIHx8XG4gICAgICAgIHdpbmRvdy5tb3pSVENQZWVyQ29ubmVjdGlvbikpIHtcbiAgICAgIHJldHVybjsgLy8gcHJvYmFibHkgbWVkaWEucGVlcmNvbm5lY3Rpb24uZW5hYmxlZD1mYWxzZSBpbiBhYm91dDpjb25maWdcbiAgICB9XG4gICAgLy8gVGhlIFJUQ1BlZXJDb25uZWN0aW9uIG9iamVjdC5cbiAgICBpZiAoIXdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbikge1xuICAgICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uID0gZnVuY3Rpb24ocGNDb25maWcsIHBjQ29uc3RyYWludHMpIHtcbiAgICAgICAgaWYgKGJyb3dzZXJEZXRhaWxzLnZlcnNpb24gPCAzOCkge1xuICAgICAgICAgIC8vIC51cmxzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gRkYgPCAzOC5cbiAgICAgICAgICAvLyBjcmVhdGUgUlRDSWNlU2VydmVycyB3aXRoIGEgc2luZ2xlIHVybC5cbiAgICAgICAgICBpZiAocGNDb25maWcgJiYgcGNDb25maWcuaWNlU2VydmVycykge1xuICAgICAgICAgICAgdmFyIG5ld0ljZVNlcnZlcnMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGNDb25maWcuaWNlU2VydmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICB2YXIgc2VydmVyID0gcGNDb25maWcuaWNlU2VydmVyc1tpXTtcbiAgICAgICAgICAgICAgaWYgKHNlcnZlci5oYXNPd25Qcm9wZXJ0eSgndXJscycpKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZXJ2ZXIudXJscy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgdmFyIG5ld1NlcnZlciA9IHtcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBzZXJ2ZXIudXJsc1tqXVxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXIudXJsc1tqXS5pbmRleE9mKCd0dXJuJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3U2VydmVyLnVzZXJuYW1lID0gc2VydmVyLnVzZXJuYW1lO1xuICAgICAgICAgICAgICAgICAgICBuZXdTZXJ2ZXIuY3JlZGVudGlhbCA9IHNlcnZlci5jcmVkZW50aWFsO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgbmV3SWNlU2VydmVycy5wdXNoKG5ld1NlcnZlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld0ljZVNlcnZlcnMucHVzaChwY0NvbmZpZy5pY2VTZXJ2ZXJzW2ldKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGNDb25maWcuaWNlU2VydmVycyA9IG5ld0ljZVNlcnZlcnM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgbW96UlRDUGVlckNvbm5lY3Rpb24ocGNDb25maWcsIHBjQ29uc3RyYWludHMpO1xuICAgICAgfTtcbiAgICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUgPSBtb3pSVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGU7XG5cbiAgICAgIC8vIHdyYXAgc3RhdGljIG1ldGhvZHMuIEN1cnJlbnRseSBqdXN0IGdlbmVyYXRlQ2VydGlmaWNhdGUuXG4gICAgICBpZiAobW96UlRDUGVlckNvbm5lY3Rpb24uZ2VuZXJhdGVDZXJ0aWZpY2F0ZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLCAnZ2VuZXJhdGVDZXJ0aWZpY2F0ZScsIHtcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIG1velJUQ1BlZXJDb25uZWN0aW9uLmdlbmVyYXRlQ2VydGlmaWNhdGU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgd2luZG93LlJUQ1Nlc3Npb25EZXNjcmlwdGlvbiA9IG1velJUQ1Nlc3Npb25EZXNjcmlwdGlvbjtcbiAgICAgIHdpbmRvdy5SVENJY2VDYW5kaWRhdGUgPSBtb3pSVENJY2VDYW5kaWRhdGU7XG4gICAgfVxuXG4gICAgLy8gc2hpbSBhd2F5IG5lZWQgZm9yIG9ic29sZXRlIFJUQ0ljZUNhbmRpZGF0ZS9SVENTZXNzaW9uRGVzY3JpcHRpb24uXG4gICAgWydzZXRMb2NhbERlc2NyaXB0aW9uJywgJ3NldFJlbW90ZURlc2NyaXB0aW9uJywgJ2FkZEljZUNhbmRpZGF0ZSddXG4gICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgICAgIHZhciBuYXRpdmVNZXRob2QgPSBSVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGVbbWV0aG9kXTtcbiAgICAgICAgICBSVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgYXJndW1lbnRzWzBdID0gbmV3ICgobWV0aG9kID09PSAnYWRkSWNlQ2FuZGlkYXRlJykgP1xuICAgICAgICAgICAgICAgIFJUQ0ljZUNhbmRpZGF0ZSA6IFJUQ1Nlc3Npb25EZXNjcmlwdGlvbikoYXJndW1lbnRzWzBdKTtcbiAgICAgICAgICAgIHJldHVybiBuYXRpdmVNZXRob2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgIC8vIHN1cHBvcnQgZm9yIGFkZEljZUNhbmRpZGF0ZShudWxsKVxuICAgIHZhciBuYXRpdmVBZGRJY2VDYW5kaWRhdGUgPVxuICAgICAgICBSVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuYWRkSWNlQ2FuZGlkYXRlO1xuICAgIFJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5hZGRJY2VDYW5kaWRhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHNbMF0gPT09IG51bGwgPyBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgIDogbmF0aXZlQWRkSWNlQ2FuZGlkYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIC8vIHNoaW0gZ2V0U3RhdHMgd2l0aCBtYXBsaWtlIHN1cHBvcnRcbiAgICB2YXIgbWFrZU1hcFN0YXRzID0gZnVuY3Rpb24oc3RhdHMpIHtcbiAgICAgIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gICAgICBPYmplY3Qua2V5cyhzdGF0cykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgbWFwLnNldChrZXksIHN0YXRzW2tleV0pO1xuICAgICAgICBtYXBba2V5XSA9IHN0YXRzW2tleV07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBtYXA7XG4gICAgfTtcblxuICAgIHZhciBuYXRpdmVHZXRTdGF0cyA9IFJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5nZXRTdGF0cztcbiAgICBSVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuZ2V0U3RhdHMgPSBmdW5jdGlvbihzZWxlY3Rvciwgb25TdWNjLCBvbkVycikge1xuICAgICAgcmV0dXJuIG5hdGl2ZUdldFN0YXRzLmFwcGx5KHRoaXMsIFtzZWxlY3RvciB8fCBudWxsXSlcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24oc3RhdHMpIHtcbiAgICAgICAgICByZXR1cm4gbWFrZU1hcFN0YXRzKHN0YXRzKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4ob25TdWNjLCBvbkVycik7XG4gICAgfTtcbiAgfSxcblxuICAvLyBBdHRhY2ggYSBtZWRpYSBzdHJlYW0gdG8gYW4gZWxlbWVudC5cbiAgYXR0YWNoTWVkaWFTdHJlYW06IGZ1bmN0aW9uKGVsZW1lbnQsIHN0cmVhbSkge1xuICAgIGxvZ2dpbmcoJ0RFUFJFQ0FURUQsIGF0dGFjaE1lZGlhU3RyZWFtIHdpbGwgc29vbiBiZSByZW1vdmVkLicpO1xuICAgIGVsZW1lbnQuc3JjT2JqZWN0ID0gc3RyZWFtO1xuICB9LFxuXG4gIHJlYXR0YWNoTWVkaWFTdHJlYW06IGZ1bmN0aW9uKHRvLCBmcm9tKSB7XG4gICAgbG9nZ2luZygnREVQUkVDQVRFRCwgcmVhdHRhY2hNZWRpYVN0cmVhbSB3aWxsIHNvb24gYmUgcmVtb3ZlZC4nKTtcbiAgICB0by5zcmNPYmplY3QgPSBmcm9tLnNyY09iamVjdDtcbiAgfVxufTtcblxuLy8gRXhwb3NlIHB1YmxpYyBtZXRob2RzLlxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNoaW1PblRyYWNrOiBmaXJlZm94U2hpbS5zaGltT25UcmFjayxcbiAgc2hpbVNvdXJjZU9iamVjdDogZmlyZWZveFNoaW0uc2hpbVNvdXJjZU9iamVjdCxcbiAgc2hpbVBlZXJDb25uZWN0aW9uOiBmaXJlZm94U2hpbS5zaGltUGVlckNvbm5lY3Rpb24sXG4gIHNoaW1HZXRVc2VyTWVkaWE6IHJlcXVpcmUoJy4vZ2V0dXNlcm1lZGlhJyksXG4gIGF0dGFjaE1lZGlhU3RyZWFtOiBmaXJlZm94U2hpbS5hdHRhY2hNZWRpYVN0cmVhbSxcbiAgcmVhdHRhY2hNZWRpYVN0cmVhbTogZmlyZWZveFNoaW0ucmVhdHRhY2hNZWRpYVN0cmVhbVxufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2NhbG1lZGlhL34vd2VicnRjLWFkYXB0ZXIvc3JjL2pzL2ZpcmVmb3gvZmlyZWZveF9zaGltLmpzXG4vLyBtb2R1bGUgaWQgPSA0NTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 455 */
/***/ function(module, exports, __webpack_require__) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar logging = __webpack_require__(448).log;\nvar browserDetails = __webpack_require__(448).browserDetails;\n\n// Expose public methods.\nmodule.exports = function() {\n  var shimError_ = function(e) {\n    return {\n      name: {\n        SecurityError: 'NotAllowedError',\n        PermissionDeniedError: 'NotAllowedError'\n      }[e.name] || e.name,\n      message: {\n        'The operation is insecure.': 'The request is not allowed by the ' +\n        'user agent or the platform in the current context.'\n      }[e.message] || e.message,\n      constraint: e.constraint,\n      toString: function() {\n        return this.name + (this.message && ': ') + this.message;\n      }\n    };\n  };\n\n  // getUserMedia constraints shim.\n  var getUserMedia_ = function(constraints, onSuccess, onError) {\n    var constraintsToFF37_ = function(c) {\n      if (typeof c !== 'object' || c.require) {\n        return c;\n      }\n      var require = [];\n      Object.keys(c).forEach(function(key) {\n        if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n          return;\n        }\n        var r = c[key] = (typeof c[key] === 'object') ?\n            c[key] : {ideal: c[key]};\n        if (r.min !== undefined ||\n            r.max !== undefined || r.exact !== undefined) {\n          require.push(key);\n        }\n        if (r.exact !== undefined) {\n          if (typeof r.exact === 'number') {\n            r. min = r.max = r.exact;\n          } else {\n            c[key] = r.exact;\n          }\n          delete r.exact;\n        }\n        if (r.ideal !== undefined) {\n          c.advanced = c.advanced || [];\n          var oc = {};\n          if (typeof r.ideal === 'number') {\n            oc[key] = {min: r.ideal, max: r.ideal};\n          } else {\n            oc[key] = r.ideal;\n          }\n          c.advanced.push(oc);\n          delete r.ideal;\n          if (!Object.keys(r).length) {\n            delete c[key];\n          }\n        }\n      });\n      if (require.length) {\n        c.require = require;\n      }\n      return c;\n    };\n    constraints = JSON.parse(JSON.stringify(constraints));\n    if (browserDetails.version < 38) {\n      logging('spec: ' + JSON.stringify(constraints));\n      if (constraints.audio) {\n        constraints.audio = constraintsToFF37_(constraints.audio);\n      }\n      if (constraints.video) {\n        constraints.video = constraintsToFF37_(constraints.video);\n      }\n      logging('ff37: ' + JSON.stringify(constraints));\n    }\n    return navigator.mozGetUserMedia(constraints, onSuccess, function(e) {\n      onError(shimError_(e));\n    });\n  };\n\n  // Returns the result of getUserMedia as a Promise.\n  var getUserMediaPromise_ = function(constraints) {\n    return new Promise(function(resolve, reject) {\n      getUserMedia_(constraints, resolve, reject);\n    });\n  };\n\n  // Shim for mediaDevices on older versions.\n  if (!navigator.mediaDevices) {\n    navigator.mediaDevices = {getUserMedia: getUserMediaPromise_,\n      addEventListener: function() { },\n      removeEventListener: function() { }\n    };\n  }\n  navigator.mediaDevices.enumerateDevices =\n      navigator.mediaDevices.enumerateDevices || function() {\n        return new Promise(function(resolve) {\n          var infos = [\n            {kind: 'audioinput', deviceId: 'default', label: '', groupId: ''},\n            {kind: 'videoinput', deviceId: 'default', label: '', groupId: ''}\n          ];\n          resolve(infos);\n        });\n      };\n\n  if (browserDetails.version < 41) {\n    // Work around http://bugzil.la/1169665\n    var orgEnumerateDevices =\n        navigator.mediaDevices.enumerateDevices.bind(navigator.mediaDevices);\n    navigator.mediaDevices.enumerateDevices = function() {\n      return orgEnumerateDevices().then(undefined, function(e) {\n        if (e.name === 'NotFoundError') {\n          return [];\n        }\n        throw e;\n      });\n    };\n  }\n  if (browserDetails.version < 49) {\n    var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n        bind(navigator.mediaDevices);\n    navigator.mediaDevices.getUserMedia = function(c) {\n      return origGetUserMedia(c).catch(function(e) {\n        return Promise.reject(shimError_(e));\n      });\n    };\n  }\n  navigator.getUserMedia = function(constraints, onSuccess, onError) {\n    if (browserDetails.version < 44) {\n      return getUserMedia_(constraints, onSuccess, onError);\n    }\n    // Replace Firefox 44+'s deprecation warning with unprefixed version.\n    console.warn('navigator.getUserMedia has been replaced by ' +\n                 'navigator.mediaDevices.getUserMedia');\n    navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n  };\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2NhbG1lZGlhL25vZGVfbW9kdWxlcy93ZWJydGMtYWRhcHRlci9zcmMvanMvZmlyZWZveC9nZXR1c2VybWVkaWEuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqICBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFdlYlJUQyBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2VcbiAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2VcbiAqICB0cmVlLlxuICovXG4gLyogZXNsaW50LWVudiBub2RlICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBsb2dnaW5nID0gcmVxdWlyZSgnLi4vdXRpbHMnKS5sb2c7XG52YXIgYnJvd3NlckRldGFpbHMgPSByZXF1aXJlKCcuLi91dGlscycpLmJyb3dzZXJEZXRhaWxzO1xuXG4vLyBFeHBvc2UgcHVibGljIG1ldGhvZHMuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2hpbUVycm9yXyA9IGZ1bmN0aW9uKGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZToge1xuICAgICAgICBTZWN1cml0eUVycm9yOiAnTm90QWxsb3dlZEVycm9yJyxcbiAgICAgICAgUGVybWlzc2lvbkRlbmllZEVycm9yOiAnTm90QWxsb3dlZEVycm9yJ1xuICAgICAgfVtlLm5hbWVdIHx8IGUubmFtZSxcbiAgICAgIG1lc3NhZ2U6IHtcbiAgICAgICAgJ1RoZSBvcGVyYXRpb24gaXMgaW5zZWN1cmUuJzogJ1RoZSByZXF1ZXN0IGlzIG5vdCBhbGxvd2VkIGJ5IHRoZSAnICtcbiAgICAgICAgJ3VzZXIgYWdlbnQgb3IgdGhlIHBsYXRmb3JtIGluIHRoZSBjdXJyZW50IGNvbnRleHQuJ1xuICAgICAgfVtlLm1lc3NhZ2VdIHx8IGUubWVzc2FnZSxcbiAgICAgIGNvbnN0cmFpbnQ6IGUuY29uc3RyYWludCxcbiAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZSArICh0aGlzLm1lc3NhZ2UgJiYgJzogJykgKyB0aGlzLm1lc3NhZ2U7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICAvLyBnZXRVc2VyTWVkaWEgY29uc3RyYWludHMgc2hpbS5cbiAgdmFyIGdldFVzZXJNZWRpYV8gPSBmdW5jdGlvbihjb25zdHJhaW50cywgb25TdWNjZXNzLCBvbkVycm9yKSB7XG4gICAgdmFyIGNvbnN0cmFpbnRzVG9GRjM3XyA9IGZ1bmN0aW9uKGMpIHtcbiAgICAgIGlmICh0eXBlb2YgYyAhPT0gJ29iamVjdCcgfHwgYy5yZXF1aXJlKSB7XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfVxuICAgICAgdmFyIHJlcXVpcmUgPSBbXTtcbiAgICAgIE9iamVjdC5rZXlzKGMpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmIChrZXkgPT09ICdyZXF1aXJlJyB8fCBrZXkgPT09ICdhZHZhbmNlZCcgfHwga2V5ID09PSAnbWVkaWFTb3VyY2UnKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciByID0gY1trZXldID0gKHR5cGVvZiBjW2tleV0gPT09ICdvYmplY3QnKSA/XG4gICAgICAgICAgICBjW2tleV0gOiB7aWRlYWw6IGNba2V5XX07XG4gICAgICAgIGlmIChyLm1pbiAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICByLm1heCAhPT0gdW5kZWZpbmVkIHx8IHIuZXhhY3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlcXVpcmUucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLmV4YWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHIuZXhhY3QgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByLiBtaW4gPSByLm1heCA9IHIuZXhhY3Q7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNba2V5XSA9IHIuZXhhY3Q7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlbGV0ZSByLmV4YWN0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLmlkZWFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjLmFkdmFuY2VkID0gYy5hZHZhbmNlZCB8fCBbXTtcbiAgICAgICAgICB2YXIgb2MgPSB7fTtcbiAgICAgICAgICBpZiAodHlwZW9mIHIuaWRlYWwgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBvY1trZXldID0ge21pbjogci5pZGVhbCwgbWF4OiByLmlkZWFsfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2Nba2V5XSA9IHIuaWRlYWw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGMuYWR2YW5jZWQucHVzaChvYyk7XG4gICAgICAgICAgZGVsZXRlIHIuaWRlYWw7XG4gICAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhyKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChyZXF1aXJlLmxlbmd0aCkge1xuICAgICAgICBjLnJlcXVpcmUgPSByZXF1aXJlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGM7XG4gICAgfTtcbiAgICBjb25zdHJhaW50cyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoY29uc3RyYWludHMpKTtcbiAgICBpZiAoYnJvd3NlckRldGFpbHMudmVyc2lvbiA8IDM4KSB7XG4gICAgICBsb2dnaW5nKCdzcGVjOiAnICsgSlNPTi5zdHJpbmdpZnkoY29uc3RyYWludHMpKTtcbiAgICAgIGlmIChjb25zdHJhaW50cy5hdWRpbykge1xuICAgICAgICBjb25zdHJhaW50cy5hdWRpbyA9IGNvbnN0cmFpbnRzVG9GRjM3Xyhjb25zdHJhaW50cy5hdWRpbyk7XG4gICAgICB9XG4gICAgICBpZiAoY29uc3RyYWludHMudmlkZW8pIHtcbiAgICAgICAgY29uc3RyYWludHMudmlkZW8gPSBjb25zdHJhaW50c1RvRkYzN18oY29uc3RyYWludHMudmlkZW8pO1xuICAgICAgfVxuICAgICAgbG9nZ2luZygnZmYzNzogJyArIEpTT04uc3RyaW5naWZ5KGNvbnN0cmFpbnRzKSk7XG4gICAgfVxuICAgIHJldHVybiBuYXZpZ2F0b3IubW96R2V0VXNlck1lZGlhKGNvbnN0cmFpbnRzLCBvblN1Y2Nlc3MsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIG9uRXJyb3Ioc2hpbUVycm9yXyhlKSk7XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGdldFVzZXJNZWRpYSBhcyBhIFByb21pc2UuXG4gIHZhciBnZXRVc2VyTWVkaWFQcm9taXNlXyA9IGZ1bmN0aW9uKGNvbnN0cmFpbnRzKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZ2V0VXNlck1lZGlhXyhjb25zdHJhaW50cywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBTaGltIGZvciBtZWRpYURldmljZXMgb24gb2xkZXIgdmVyc2lvbnMuXG4gIGlmICghbmF2aWdhdG9yLm1lZGlhRGV2aWNlcykge1xuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMgPSB7Z2V0VXNlck1lZGlhOiBnZXRVc2VyTWVkaWFQcm9taXNlXyxcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uKCkgeyB9LFxuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24oKSB7IH1cbiAgICB9O1xuICB9XG4gIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcyA9XG4gICAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMgfHwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7XG4gICAgICAgICAgdmFyIGluZm9zID0gW1xuICAgICAgICAgICAge2tpbmQ6ICdhdWRpb2lucHV0JywgZGV2aWNlSWQ6ICdkZWZhdWx0JywgbGFiZWw6ICcnLCBncm91cElkOiAnJ30sXG4gICAgICAgICAgICB7a2luZDogJ3ZpZGVvaW5wdXQnLCBkZXZpY2VJZDogJ2RlZmF1bHQnLCBsYWJlbDogJycsIGdyb3VwSWQ6ICcnfVxuICAgICAgICAgIF07XG4gICAgICAgICAgcmVzb2x2ZShpbmZvcyk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICBpZiAoYnJvd3NlckRldGFpbHMudmVyc2lvbiA8IDQxKSB7XG4gICAgLy8gV29yayBhcm91bmQgaHR0cDovL2J1Z3ppbC5sYS8xMTY5NjY1XG4gICAgdmFyIG9yZ0VudW1lcmF0ZURldmljZXMgPVxuICAgICAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMuYmluZChuYXZpZ2F0b3IubWVkaWFEZXZpY2VzKTtcbiAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBvcmdFbnVtZXJhdGVEZXZpY2VzKCkudGhlbih1bmRlZmluZWQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgaWYgKGUubmFtZSA9PT0gJ05vdEZvdW5kRXJyb3InKSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG4gIGlmIChicm93c2VyRGV0YWlscy52ZXJzaW9uIDwgNDkpIHtcbiAgICB2YXIgb3JpZ0dldFVzZXJNZWRpYSA9IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhLlxuICAgICAgICBiaW5kKG5hdmlnYXRvci5tZWRpYURldmljZXMpO1xuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhID0gZnVuY3Rpb24oYykge1xuICAgICAgcmV0dXJuIG9yaWdHZXRVc2VyTWVkaWEoYykuY2F0Y2goZnVuY3Rpb24oZSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3Qoc2hpbUVycm9yXyhlKSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG4gIG5hdmlnYXRvci5nZXRVc2VyTWVkaWEgPSBmdW5jdGlvbihjb25zdHJhaW50cywgb25TdWNjZXNzLCBvbkVycm9yKSB7XG4gICAgaWYgKGJyb3dzZXJEZXRhaWxzLnZlcnNpb24gPCA0NCkge1xuICAgICAgcmV0dXJuIGdldFVzZXJNZWRpYV8oY29uc3RyYWludHMsIG9uU3VjY2Vzcywgb25FcnJvcik7XG4gICAgfVxuICAgIC8vIFJlcGxhY2UgRmlyZWZveCA0NCsncyBkZXByZWNhdGlvbiB3YXJuaW5nIHdpdGggdW5wcmVmaXhlZCB2ZXJzaW9uLlxuICAgIGNvbnNvbGUud2FybignbmF2aWdhdG9yLmdldFVzZXJNZWRpYSBoYXMgYmVlbiByZXBsYWNlZCBieSAnICtcbiAgICAgICAgICAgICAgICAgJ25hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhJyk7XG4gICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoY29uc3RyYWludHMpLnRoZW4ob25TdWNjZXNzLCBvbkVycm9yKTtcbiAgfTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9jYWxtZWRpYS9+L3dlYnJ0Yy1hZGFwdGVyL3NyYy9qcy9maXJlZm94L2dldHVzZXJtZWRpYS5qc1xuLy8gbW9kdWxlIGlkID0gNDU1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 456 */
/***/ function(module, exports) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n'use strict';\nvar safariShim = {\n  // TODO: DrAlex, should be here, double check against LayoutTests\n  // shimOnTrack: function() { },\n\n  // TODO: DrAlex\n  // attachMediaStream: function(element, stream) { },\n  // reattachMediaStream: function(to, from) { },\n\n  // TODO: once the back-end for the mac port is done, add.\n  // TODO: check for webkitGTK+\n  // shimPeerConnection: function() { },\n\n  shimGetUserMedia: function() {\n    navigator.getUserMedia = navigator.webkitGetUserMedia;\n  }\n};\n\n// Expose public methods.\nmodule.exports = {\n  shimGetUserMedia: safariShim.shimGetUserMedia\n  // TODO\n  // shimOnTrack: safariShim.shimOnTrack,\n  // shimPeerConnection: safariShim.shimPeerConnection,\n  // attachMediaStream: safariShim.attachMediaStream,\n  // reattachMediaStream: safariShim.reattachMediaStream\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2NhbG1lZGlhL25vZGVfbW9kdWxlcy93ZWJydGMtYWRhcHRlci9zcmMvanMvc2FmYXJpL3NhZmFyaV9zaGltLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiAgQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBXZWJSVEMgcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlXG4gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlXG4gKiAgdHJlZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xudmFyIHNhZmFyaVNoaW0gPSB7XG4gIC8vIFRPRE86IERyQWxleCwgc2hvdWxkIGJlIGhlcmUsIGRvdWJsZSBjaGVjayBhZ2FpbnN0IExheW91dFRlc3RzXG4gIC8vIHNoaW1PblRyYWNrOiBmdW5jdGlvbigpIHsgfSxcblxuICAvLyBUT0RPOiBEckFsZXhcbiAgLy8gYXR0YWNoTWVkaWFTdHJlYW06IGZ1bmN0aW9uKGVsZW1lbnQsIHN0cmVhbSkgeyB9LFxuICAvLyByZWF0dGFjaE1lZGlhU3RyZWFtOiBmdW5jdGlvbih0bywgZnJvbSkgeyB9LFxuXG4gIC8vIFRPRE86IG9uY2UgdGhlIGJhY2stZW5kIGZvciB0aGUgbWFjIHBvcnQgaXMgZG9uZSwgYWRkLlxuICAvLyBUT0RPOiBjaGVjayBmb3Igd2Via2l0R1RLK1xuICAvLyBzaGltUGVlckNvbm5lY3Rpb246IGZ1bmN0aW9uKCkgeyB9LFxuXG4gIHNoaW1HZXRVc2VyTWVkaWE6IGZ1bmN0aW9uKCkge1xuICAgIG5hdmlnYXRvci5nZXRVc2VyTWVkaWEgPSBuYXZpZ2F0b3Iud2Via2l0R2V0VXNlck1lZGlhO1xuICB9XG59O1xuXG4vLyBFeHBvc2UgcHVibGljIG1ldGhvZHMuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2hpbUdldFVzZXJNZWRpYTogc2FmYXJpU2hpbS5zaGltR2V0VXNlck1lZGlhXG4gIC8vIFRPRE9cbiAgLy8gc2hpbU9uVHJhY2s6IHNhZmFyaVNoaW0uc2hpbU9uVHJhY2ssXG4gIC8vIHNoaW1QZWVyQ29ubmVjdGlvbjogc2FmYXJpU2hpbS5zaGltUGVlckNvbm5lY3Rpb24sXG4gIC8vIGF0dGFjaE1lZGlhU3RyZWFtOiBzYWZhcmlTaGltLmF0dGFjaE1lZGlhU3RyZWFtLFxuICAvLyByZWF0dGFjaE1lZGlhU3RyZWFtOiBzYWZhcmlTaGltLnJlYXR0YWNoTWVkaWFTdHJlYW1cbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9jYWxtZWRpYS9+L3dlYnJ0Yy1hZGFwdGVyL3NyYy9qcy9zYWZhcmkvc2FmYXJpX3NoaW0uanNcbi8vIG1vZHVsZSBpZCA9IDQ1NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 457 */
/***/ function(module, exports, __webpack_require__) {

    eval("// getScreenMedia helper by @HenrikJoreteg\nvar getUserMedia = __webpack_require__(458);\n\n// cache for constraints and callback\nvar cache = {};\n\nmodule.exports = function (constraints, cb) {\n    var hasConstraints = arguments.length === 2;\n    var callback = hasConstraints ? cb : constraints;\n    var error;\n\n    if (typeof window === 'undefined' || window.location.protocol === 'http:') {\n        error = new Error('NavigatorUserMediaError');\n        error.name = 'HTTPS_REQUIRED';\n        return callback(error);\n    }\n\n    if (window.navigator.userAgent.match('Chrome')) {\n        var chromever = parseInt(window.navigator.userAgent.match(/Chrome\\/(.*) /)[1], 10);\n        var maxver = 33;\n        var isCef = !window.chrome.webstore;\n        // \"known\" crash in chrome 34 and 35 on linux\n        if (window.navigator.userAgent.match('Linux')) maxver = 35;\n\n        // check that the extension is installed by looking for a\n        // sessionStorage variable that contains the extension id\n        // this has to be set after installation unless the contest\n        // script does that\n        if (sessionStorage.getScreenMediaJSExtensionId) {\n            chrome.runtime.sendMessage(sessionStorage.getScreenMediaJSExtensionId,\n                {type:'getScreen', id: 1}, null,\n                function (data) {\n                    if (!data || data.sourceId === '') { // user canceled\n                        var error = new Error('NavigatorUserMediaError');\n                        error.name = 'NotAllowedError';\n                        callback(error);\n                    } else {\n                        constraints = (hasConstraints && constraints) || {audio: false, video: {\n                            mandatory: {\n                                chromeMediaSource: 'desktop',\n                                maxWidth: window.screen.width,\n                                maxHeight: window.screen.height,\n                                maxFrameRate: 3\n                            }\n                        }};\n                        constraints.video.mandatory.chromeMediaSourceId = data.sourceId;\n                        getUserMedia(constraints, callback);\n                    }\n                }\n            );\n        } else if (window.cefGetScreenMedia) {\n            //window.cefGetScreenMedia is experimental - may be removed without notice\n            window.cefGetScreenMedia(function(sourceId) {\n                if (!sourceId) {\n                    var error = new Error('cefGetScreenMediaError');\n                    error.name = 'CEF_GETSCREENMEDIA_CANCELED';\n                    callback(error);\n                } else {\n                    constraints = (hasConstraints && constraints) || {audio: false, video: {\n                        mandatory: {\n                            chromeMediaSource: 'desktop',\n                            maxWidth: window.screen.width,\n                            maxHeight: window.screen.height,\n                            maxFrameRate: 3\n                        },\n                        optional: [\n                            {googLeakyBucket: true},\n                            {googTemporalLayeredScreencast: true}\n                        ]\n                    }};\n                    constraints.video.mandatory.chromeMediaSourceId = sourceId;\n                    getUserMedia(constraints, callback);\n                }\n            });\n        } else if (isCef || (chromever >= 26 && chromever <= maxver)) {\n            // chrome 26 - chrome 33 way to do it -- requires bad chrome://flags\n            // note: this is basically in maintenance mode and will go away soon\n            constraints = (hasConstraints && constraints) || {\n                video: {\n                    mandatory: {\n                        googLeakyBucket: true,\n                        maxWidth: window.screen.width,\n                        maxHeight: window.screen.height,\n                        maxFrameRate: 3,\n                        chromeMediaSource: 'screen'\n                    }\n                }\n            };\n            getUserMedia(constraints, callback);\n        } else {\n            // chrome 34+ way requiring an extension\n            var pending = window.setTimeout(function () {\n                error = new Error('NavigatorUserMediaError');\n                error.name = 'EXTENSION_UNAVAILABLE';\n                return callback(error);\n            }, 1000);\n            cache[pending] = [callback, hasConstraints ? constraints : null];\n            window.postMessage({ type: 'getScreen', id: pending }, '*');\n        }\n    } else if (window.navigator.userAgent.match('Firefox')) {\n        var ffver = parseInt(window.navigator.userAgent.match(/Firefox\\/(.*)/)[1], 10);\n        if (ffver >= 33) {\n            constraints = (hasConstraints && constraints) || {\n                video: {\n                    mozMediaSource: 'window',\n                    mediaSource: 'window'\n                }\n            };\n            getUserMedia(constraints, function (err, stream) {\n                callback(err, stream);\n                // workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=1045810\n                if (!err) {\n                    var lastTime = stream.currentTime;\n                    var polly = window.setInterval(function () {\n                        if (!stream) window.clearInterval(polly);\n                        if (stream.currentTime == lastTime) {\n                            window.clearInterval(polly);\n                            if (stream.onended) {\n                                stream.onended();\n                            }\n                        }\n                        lastTime = stream.currentTime;\n                    }, 500);\n                }\n            });\n        } else {\n            error = new Error('NavigatorUserMediaError');\n            error.name = 'EXTENSION_UNAVAILABLE'; // does not make much sense but...\n        }\n    }\n};\n\ntypeof window !== 'undefined' && window.addEventListener('message', function (event) {\n    if (event.origin != window.location.origin) {\n        return;\n    }\n    if (event.data.type == 'gotScreen' && cache[event.data.id]) {\n        var data = cache[event.data.id];\n        var constraints = data[1];\n        var callback = data[0];\n        delete cache[event.data.id];\n\n        if (event.data.sourceId === '') { // user canceled\n            var error = new Error('NavigatorUserMediaError');\n            error.name = 'NotAllowedError';\n            callback(error);\n        } else {\n            constraints = constraints || {audio: false, video: {\n                mandatory: {\n                    chromeMediaSource: 'desktop',\n                    maxWidth: window.screen.width,\n                    maxHeight: window.screen.height,\n                    maxFrameRate: 3\n                },\n                optional: [\n                    {googLeakyBucket: true},\n                    {googTemporalLayeredScreencast: true}\n                ]\n            }};\n            constraints.video.mandatory.chromeMediaSourceId = event.data.sourceId;\n            getUserMedia(constraints, callback);\n        }\n    } else if (event.data.type == 'getScreenPending') {\n        window.clearTimeout(event.data.id);\n    }\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9nZXRzY3JlZW5tZWRpYS9nZXRzY3JlZW5tZWRpYS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBnZXRTY3JlZW5NZWRpYSBoZWxwZXIgYnkgQEhlbnJpa0pvcmV0ZWdcbnZhciBnZXRVc2VyTWVkaWEgPSByZXF1aXJlKCdnZXR1c2VybWVkaWEnKTtcblxuLy8gY2FjaGUgZm9yIGNvbnN0cmFpbnRzIGFuZCBjYWxsYmFja1xudmFyIGNhY2hlID0ge307XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNvbnN0cmFpbnRzLCBjYikge1xuICAgIHZhciBoYXNDb25zdHJhaW50cyA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDI7XG4gICAgdmFyIGNhbGxiYWNrID0gaGFzQ29uc3RyYWludHMgPyBjYiA6IGNvbnN0cmFpbnRzO1xuICAgIHZhciBlcnJvcjtcblxuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwOicpIHtcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ05hdmlnYXRvclVzZXJNZWRpYUVycm9yJyk7XG4gICAgICAgIGVycm9yLm5hbWUgPSAnSFRUUFNfUkVRVUlSRUQnO1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyb3IpO1xuICAgIH1cblxuICAgIGlmICh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgnQ2hyb21lJykpIHtcbiAgICAgICAgdmFyIGNocm9tZXZlciA9IHBhcnNlSW50KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcXC8oLiopIC8pWzFdLCAxMCk7XG4gICAgICAgIHZhciBtYXh2ZXIgPSAzMztcbiAgICAgICAgdmFyIGlzQ2VmID0gIXdpbmRvdy5jaHJvbWUud2Vic3RvcmU7XG4gICAgICAgIC8vIFwia25vd25cIiBjcmFzaCBpbiBjaHJvbWUgMzQgYW5kIDM1IG9uIGxpbnV4XG4gICAgICAgIGlmICh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgnTGludXgnKSkgbWF4dmVyID0gMzU7XG5cbiAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgZXh0ZW5zaW9uIGlzIGluc3RhbGxlZCBieSBsb29raW5nIGZvciBhXG4gICAgICAgIC8vIHNlc3Npb25TdG9yYWdlIHZhcmlhYmxlIHRoYXQgY29udGFpbnMgdGhlIGV4dGVuc2lvbiBpZFxuICAgICAgICAvLyB0aGlzIGhhcyB0byBiZSBzZXQgYWZ0ZXIgaW5zdGFsbGF0aW9uIHVubGVzcyB0aGUgY29udGVzdFxuICAgICAgICAvLyBzY3JpcHQgZG9lcyB0aGF0XG4gICAgICAgIGlmIChzZXNzaW9uU3RvcmFnZS5nZXRTY3JlZW5NZWRpYUpTRXh0ZW5zaW9uSWQpIHtcbiAgICAgICAgICAgIGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHNlc3Npb25TdG9yYWdlLmdldFNjcmVlbk1lZGlhSlNFeHRlbnNpb25JZCxcbiAgICAgICAgICAgICAgICB7dHlwZTonZ2V0U2NyZWVuJywgaWQ6IDF9LCBudWxsLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGF0YSB8fCBkYXRhLnNvdXJjZUlkID09PSAnJykgeyAvLyB1c2VyIGNhbmNlbGVkXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ05hdmlnYXRvclVzZXJNZWRpYUVycm9yJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5uYW1lID0gJ05vdEFsbG93ZWRFcnJvcic7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50cyA9IChoYXNDb25zdHJhaW50cyAmJiBjb25zdHJhaW50cykgfHwge2F1ZGlvOiBmYWxzZSwgdmlkZW86IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5kYXRvcnk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hyb21lTWVkaWFTb3VyY2U6ICdkZXNrdG9wJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IHdpbmRvdy5zY3JlZW4ud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodDogd2luZG93LnNjcmVlbi5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEZyYW1lUmF0ZTogM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH19O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHMudmlkZW8ubWFuZGF0b3J5LmNocm9tZU1lZGlhU291cmNlSWQgPSBkYXRhLnNvdXJjZUlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VXNlck1lZGlhKGNvbnN0cmFpbnRzLCBjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5jZWZHZXRTY3JlZW5NZWRpYSkge1xuICAgICAgICAgICAgLy93aW5kb3cuY2VmR2V0U2NyZWVuTWVkaWEgaXMgZXhwZXJpbWVudGFsIC0gbWF5IGJlIHJlbW92ZWQgd2l0aG91dCBub3RpY2VcbiAgICAgICAgICAgIHdpbmRvdy5jZWZHZXRTY3JlZW5NZWRpYShmdW5jdGlvbihzb3VyY2VJZCkge1xuICAgICAgICAgICAgICAgIGlmICghc291cmNlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdjZWZHZXRTY3JlZW5NZWRpYUVycm9yJyk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUgPSAnQ0VGX0dFVFNDUkVFTk1FRElBX0NBTkNFTEVEJztcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzID0gKGhhc0NvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzKSB8fCB7YXVkaW86IGZhbHNlLCB2aWRlbzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFuZGF0b3J5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hyb21lTWVkaWFTb3VyY2U6ICdkZXNrdG9wJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogd2luZG93LnNjcmVlbi53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IHdpbmRvdy5zY3JlZW4uaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEZyYW1lUmF0ZTogM1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2dvb2dMZWFreUJ1Y2tldDogdHJ1ZX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2dvb2dUZW1wb3JhbExheWVyZWRTY3JlZW5jYXN0OiB0cnVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICB9fTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHMudmlkZW8ubWFuZGF0b3J5LmNocm9tZU1lZGlhU291cmNlSWQgPSBzb3VyY2VJZDtcbiAgICAgICAgICAgICAgICAgICAgZ2V0VXNlck1lZGlhKGNvbnN0cmFpbnRzLCBjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNDZWYgfHwgKGNocm9tZXZlciA+PSAyNiAmJiBjaHJvbWV2ZXIgPD0gbWF4dmVyKSkge1xuICAgICAgICAgICAgLy8gY2hyb21lIDI2IC0gY2hyb21lIDMzIHdheSB0byBkbyBpdCAtLSByZXF1aXJlcyBiYWQgY2hyb21lOi8vZmxhZ3NcbiAgICAgICAgICAgIC8vIG5vdGU6IHRoaXMgaXMgYmFzaWNhbGx5IGluIG1haW50ZW5hbmNlIG1vZGUgYW5kIHdpbGwgZ28gYXdheSBzb29uXG4gICAgICAgICAgICBjb25zdHJhaW50cyA9IChoYXNDb25zdHJhaW50cyAmJiBjb25zdHJhaW50cykgfHwge1xuICAgICAgICAgICAgICAgIHZpZGVvOiB7XG4gICAgICAgICAgICAgICAgICAgIG1hbmRhdG9yeToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ0xlYWt5QnVja2V0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IHdpbmRvdy5zY3JlZW4ud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IHdpbmRvdy5zY3JlZW4uaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4RnJhbWVSYXRlOiAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hyb21lTWVkaWFTb3VyY2U6ICdzY3JlZW4nXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZ2V0VXNlck1lZGlhKGNvbnN0cmFpbnRzLCBjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBjaHJvbWUgMzQrIHdheSByZXF1aXJpbmcgYW4gZXh0ZW5zaW9uXG4gICAgICAgICAgICB2YXIgcGVuZGluZyA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcignTmF2aWdhdG9yVXNlck1lZGlhRXJyb3InKTtcbiAgICAgICAgICAgICAgICBlcnJvci5uYW1lID0gJ0VYVEVOU0lPTl9VTkFWQUlMQUJMRSc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycm9yKTtcbiAgICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICAgICAgY2FjaGVbcGVuZGluZ10gPSBbY2FsbGJhY2ssIGhhc0NvbnN0cmFpbnRzID8gY29uc3RyYWludHMgOiBudWxsXTtcbiAgICAgICAgICAgIHdpbmRvdy5wb3N0TWVzc2FnZSh7IHR5cGU6ICdnZXRTY3JlZW4nLCBpZDogcGVuZGluZyB9LCAnKicpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgnRmlyZWZveCcpKSB7XG4gICAgICAgIHZhciBmZnZlciA9IHBhcnNlSW50KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9GaXJlZm94XFwvKC4qKS8pWzFdLCAxMCk7XG4gICAgICAgIGlmIChmZnZlciA+PSAzMykge1xuICAgICAgICAgICAgY29uc3RyYWludHMgPSAoaGFzQ29uc3RyYWludHMgJiYgY29uc3RyYWludHMpIHx8IHtcbiAgICAgICAgICAgICAgICB2aWRlbzoge1xuICAgICAgICAgICAgICAgICAgICBtb3pNZWRpYVNvdXJjZTogJ3dpbmRvdycsXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhU291cmNlOiAnd2luZG93J1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBnZXRVc2VyTWVkaWEoY29uc3RyYWludHMsIGZ1bmN0aW9uIChlcnIsIHN0cmVhbSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgc3RyZWFtKTtcbiAgICAgICAgICAgICAgICAvLyB3b3JrYXJvdW5kIGZvciBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDQ1ODEwXG4gICAgICAgICAgICAgICAgaWYgKCFlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RUaW1lID0gc3RyZWFtLmN1cnJlbnRUaW1lO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcG9sbHkgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJlYW0pIHdpbmRvdy5jbGVhckludGVydmFsKHBvbGx5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0uY3VycmVudFRpbWUgPT0gbGFzdFRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbChwb2xseSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5vbmVuZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5vbmVuZGVkKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFRpbWUgPSBzdHJlYW0uY3VycmVudFRpbWU7XG4gICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcignTmF2aWdhdG9yVXNlck1lZGlhRXJyb3InKTtcbiAgICAgICAgICAgIGVycm9yLm5hbWUgPSAnRVhURU5TSU9OX1VOQVZBSUxBQkxFJzsgLy8gZG9lcyBub3QgbWFrZSBtdWNoIHNlbnNlIGJ1dC4uLlxuICAgICAgICB9XG4gICAgfVxufTtcblxudHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQub3JpZ2luICE9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXZlbnQuZGF0YS50eXBlID09ICdnb3RTY3JlZW4nICYmIGNhY2hlW2V2ZW50LmRhdGEuaWRdKSB7XG4gICAgICAgIHZhciBkYXRhID0gY2FjaGVbZXZlbnQuZGF0YS5pZF07XG4gICAgICAgIHZhciBjb25zdHJhaW50cyA9IGRhdGFbMV07XG4gICAgICAgIHZhciBjYWxsYmFjayA9IGRhdGFbMF07XG4gICAgICAgIGRlbGV0ZSBjYWNoZVtldmVudC5kYXRhLmlkXTtcblxuICAgICAgICBpZiAoZXZlbnQuZGF0YS5zb3VyY2VJZCA9PT0gJycpIHsgLy8gdXNlciBjYW5jZWxlZFxuICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdOYXZpZ2F0b3JVc2VyTWVkaWFFcnJvcicpO1xuICAgICAgICAgICAgZXJyb3IubmFtZSA9ICdOb3RBbGxvd2VkRXJyb3InO1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3RyYWludHMgPSBjb25zdHJhaW50cyB8fCB7YXVkaW86IGZhbHNlLCB2aWRlbzoge1xuICAgICAgICAgICAgICAgIG1hbmRhdG9yeToge1xuICAgICAgICAgICAgICAgICAgICBjaHJvbWVNZWRpYVNvdXJjZTogJ2Rlc2t0b3AnLFxuICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogd2luZG93LnNjcmVlbi53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiB3aW5kb3cuc2NyZWVuLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgbWF4RnJhbWVSYXRlOiAzXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvcHRpb25hbDogW1xuICAgICAgICAgICAgICAgICAgICB7Z29vZ0xlYWt5QnVja2V0OiB0cnVlfSxcbiAgICAgICAgICAgICAgICAgICAge2dvb2dUZW1wb3JhbExheWVyZWRTY3JlZW5jYXN0OiB0cnVlfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH19O1xuICAgICAgICAgICAgY29uc3RyYWludHMudmlkZW8ubWFuZGF0b3J5LmNocm9tZU1lZGlhU291cmNlSWQgPSBldmVudC5kYXRhLnNvdXJjZUlkO1xuICAgICAgICAgICAgZ2V0VXNlck1lZGlhKGNvbnN0cmFpbnRzLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV2ZW50LmRhdGEudHlwZSA9PSAnZ2V0U2NyZWVuUGVuZGluZycpIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChldmVudC5kYXRhLmlkKTtcbiAgICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9nZXRzY3JlZW5tZWRpYS9nZXRzY3JlZW5tZWRpYS5qc1xuLy8gbW9kdWxlIGlkID0gNDU3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 458 */
/***/ function(module, exports, __webpack_require__) {

    eval("// getUserMedia helper by @HenrikJoreteg used for navigator.getUserMedia shim\nvar adapter = __webpack_require__(459);\n\nmodule.exports = function (constraints, cb) {\n    var error;\n    var haveOpts = arguments.length === 2;\n    var defaultOpts = {video: true, audio: true};\n\n    var denied = 'PermissionDeniedError';\n    var altDenied = 'PERMISSION_DENIED';\n    var notSatisfied = 'ConstraintNotSatisfiedError';\n\n    // make constraints optional\n    if (!haveOpts) {\n        cb = constraints;\n        constraints = defaultOpts;\n    }\n\n    // treat lack of browser support like an error\n    if (typeof navigator === 'undefined' || !navigator.getUserMedia) {\n        // throw proper error per spec\n        error = new Error('MediaStreamError');\n        error.name = 'NotSupportedError';\n\n        // keep all callbacks async\n        return setTimeout(function () {\n            cb(error);\n        }, 0);\n    }\n\n    // normalize error handling when no media types are requested\n    if (!constraints.audio && !constraints.video) {\n        error = new Error('MediaStreamError');\n        error.name = 'NoMediaRequestedError';\n\n        // keep all callbacks async\n        return setTimeout(function () {\n            cb(error);\n        }, 0);\n    }\n\n    navigator.mediaDevices.getUserMedia(constraints)\n    .then(function (stream) {\n        cb(null, stream);\n    }).catch(function (err) {\n        var error;\n        // coerce into an error object since FF gives us a string\n        // there are only two valid names according to the spec\n        // we coerce all non-denied to \"constraint not satisfied\".\n        if (typeof err === 'string') {\n            error = new Error('MediaStreamError');\n            if (err === denied || err === altDenied) {\n                error.name = denied;\n            } else {\n                error.name = notSatisfied;\n            }\n        } else {\n            // if we get an error object make sure '.name' property is set\n            // according to spec: http://dev.w3.org/2011/webrtc/editor/getusermedia.html#navigatorusermediaerror-and-navigatorusermediaerrorcallback\n            error = err;\n            if (!error.name) {\n                // this is likely chrome which\n                // sets a property called \"ERROR_DENIED\" on the error object\n                // if so we make sure to set a name\n                if (error[denied]) {\n                    err.name = denied;\n                } else {\n                    err.name = notSatisfied;\n                }\n            }\n        }\n\n        cb(error);\n    });\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9nZXR1c2VybWVkaWEvZ2V0dXNlcm1lZGlhLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGdldFVzZXJNZWRpYSBoZWxwZXIgYnkgQEhlbnJpa0pvcmV0ZWcgdXNlZCBmb3IgbmF2aWdhdG9yLmdldFVzZXJNZWRpYSBzaGltXG52YXIgYWRhcHRlciA9IHJlcXVpcmUoJ3dlYnJ0Yy1hZGFwdGVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNvbnN0cmFpbnRzLCBjYikge1xuICAgIHZhciBlcnJvcjtcbiAgICB2YXIgaGF2ZU9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID09PSAyO1xuICAgIHZhciBkZWZhdWx0T3B0cyA9IHt2aWRlbzogdHJ1ZSwgYXVkaW86IHRydWV9O1xuXG4gICAgdmFyIGRlbmllZCA9ICdQZXJtaXNzaW9uRGVuaWVkRXJyb3InO1xuICAgIHZhciBhbHREZW5pZWQgPSAnUEVSTUlTU0lPTl9ERU5JRUQnO1xuICAgIHZhciBub3RTYXRpc2ZpZWQgPSAnQ29uc3RyYWludE5vdFNhdGlzZmllZEVycm9yJztcblxuICAgIC8vIG1ha2UgY29uc3RyYWludHMgb3B0aW9uYWxcbiAgICBpZiAoIWhhdmVPcHRzKSB7XG4gICAgICAgIGNiID0gY29uc3RyYWludHM7XG4gICAgICAgIGNvbnN0cmFpbnRzID0gZGVmYXVsdE9wdHM7XG4gICAgfVxuXG4gICAgLy8gdHJlYXQgbGFjayBvZiBicm93c2VyIHN1cHBvcnQgbGlrZSBhbiBlcnJvclxuICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAndW5kZWZpbmVkJyB8fCAhbmF2aWdhdG9yLmdldFVzZXJNZWRpYSkge1xuICAgICAgICAvLyB0aHJvdyBwcm9wZXIgZXJyb3IgcGVyIHNwZWNcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ01lZGlhU3RyZWFtRXJyb3InKTtcbiAgICAgICAgZXJyb3IubmFtZSA9ICdOb3RTdXBwb3J0ZWRFcnJvcic7XG5cbiAgICAgICAgLy8ga2VlcCBhbGwgY2FsbGJhY2tzIGFzeW5jXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNiKGVycm9yKTtcbiAgICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgLy8gbm9ybWFsaXplIGVycm9yIGhhbmRsaW5nIHdoZW4gbm8gbWVkaWEgdHlwZXMgYXJlIHJlcXVlc3RlZFxuICAgIGlmICghY29uc3RyYWludHMuYXVkaW8gJiYgIWNvbnN0cmFpbnRzLnZpZGVvKSB7XG4gICAgICAgIGVycm9yID0gbmV3IEVycm9yKCdNZWRpYVN0cmVhbUVycm9yJyk7XG4gICAgICAgIGVycm9yLm5hbWUgPSAnTm9NZWRpYVJlcXVlc3RlZEVycm9yJztcblxuICAgICAgICAvLyBrZWVwIGFsbCBjYWxsYmFja3MgYXN5bmNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY2IoZXJyb3IpO1xuICAgICAgICB9LCAwKTtcbiAgICB9XG5cbiAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShjb25zdHJhaW50cylcbiAgICAudGhlbihmdW5jdGlvbiAoc3RyZWFtKSB7XG4gICAgICAgIGNiKG51bGwsIHN0cmVhbSk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICB2YXIgZXJyb3I7XG4gICAgICAgIC8vIGNvZXJjZSBpbnRvIGFuIGVycm9yIG9iamVjdCBzaW5jZSBGRiBnaXZlcyB1cyBhIHN0cmluZ1xuICAgICAgICAvLyB0aGVyZSBhcmUgb25seSB0d28gdmFsaWQgbmFtZXMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjXG4gICAgICAgIC8vIHdlIGNvZXJjZSBhbGwgbm9uLWRlbmllZCB0byBcImNvbnN0cmFpbnQgbm90IHNhdGlzZmllZFwiLlxuICAgICAgICBpZiAodHlwZW9mIGVyciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKCdNZWRpYVN0cmVhbUVycm9yJyk7XG4gICAgICAgICAgICBpZiAoZXJyID09PSBkZW5pZWQgfHwgZXJyID09PSBhbHREZW5pZWQpIHtcbiAgICAgICAgICAgICAgICBlcnJvci5uYW1lID0gZGVuaWVkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlcnJvci5uYW1lID0gbm90U2F0aXNmaWVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgd2UgZ2V0IGFuIGVycm9yIG9iamVjdCBtYWtlIHN1cmUgJy5uYW1lJyBwcm9wZXJ0eSBpcyBzZXRcbiAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byBzcGVjOiBodHRwOi8vZGV2LnczLm9yZy8yMDExL3dlYnJ0Yy9lZGl0b3IvZ2V0dXNlcm1lZGlhLmh0bWwjbmF2aWdhdG9ydXNlcm1lZGlhZXJyb3ItYW5kLW5hdmlnYXRvcnVzZXJtZWRpYWVycm9yY2FsbGJhY2tcbiAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICAgICAgaWYgKCFlcnJvci5uYW1lKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBsaWtlbHkgY2hyb21lIHdoaWNoXG4gICAgICAgICAgICAgICAgLy8gc2V0cyBhIHByb3BlcnR5IGNhbGxlZCBcIkVSUk9SX0RFTklFRFwiIG9uIHRoZSBlcnJvciBvYmplY3RcbiAgICAgICAgICAgICAgICAvLyBpZiBzbyB3ZSBtYWtlIHN1cmUgdG8gc2V0IGEgbmFtZVxuICAgICAgICAgICAgICAgIGlmIChlcnJvcltkZW5pZWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGVyci5uYW1lID0gZGVuaWVkO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVyci5uYW1lID0gbm90U2F0aXNmaWVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNiKGVycm9yKTtcbiAgICB9KTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZ2V0dXNlcm1lZGlhL2dldHVzZXJtZWRpYS5qc1xuLy8gbW9kdWxlIGlkID0gNDU4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 459 */
/***/ function(module, exports, __webpack_require__) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n\n'use strict';\n\n// Shimming starts here.\n(function() {\n  // Utils.\n  var logging = __webpack_require__(460).log;\n  var browserDetails = __webpack_require__(460).browserDetails;\n  // Export to the adapter global object visible in the browser.\n  module.exports.browserDetails = browserDetails;\n  module.exports.extractVersion = __webpack_require__(460).extractVersion;\n  module.exports.disableLog = __webpack_require__(460).disableLog;\n\n  // Uncomment the line below if you want logging to occur, including logging\n  // for the switch statement below. Can also be turned on in the browser via\n  // adapter.disableLog(false), but then logging from the switch statement below\n  // will not appear.\n  // require('./utils').disableLog(false);\n\n  // Browser shims.\n  var chromeShim = __webpack_require__(461) || null;\n  var edgeShim = __webpack_require__(463) || null;\n  var firefoxShim = __webpack_require__(465) || null;\n  var safariShim = __webpack_require__(467) || null;\n\n  // Shim browser if found.\n  switch (browserDetails.browser) {\n    case 'opera': // fallthrough as it uses chrome shims\n    case 'chrome':\n      if (!chromeShim || !chromeShim.shimPeerConnection) {\n        logging('Chrome shim is not included in this adapter release.');\n        return;\n      }\n      logging('adapter.js shimming chrome.');\n      // Export to the adapter global object visible in the browser.\n      module.exports.browserShim = chromeShim;\n\n      chromeShim.shimGetUserMedia();\n      chromeShim.shimMediaStream();\n      chromeShim.shimSourceObject();\n      chromeShim.shimPeerConnection();\n      chromeShim.shimOnTrack();\n      break;\n    case 'firefox':\n      if (!firefoxShim || !firefoxShim.shimPeerConnection) {\n        logging('Firefox shim is not included in this adapter release.');\n        return;\n      }\n      logging('adapter.js shimming firefox.');\n      // Export to the adapter global object visible in the browser.\n      module.exports.browserShim = firefoxShim;\n\n      firefoxShim.shimGetUserMedia();\n      firefoxShim.shimSourceObject();\n      firefoxShim.shimPeerConnection();\n      firefoxShim.shimOnTrack();\n      break;\n    case 'edge':\n      if (!edgeShim || !edgeShim.shimPeerConnection) {\n        logging('MS edge shim is not included in this adapter release.');\n        return;\n      }\n      logging('adapter.js shimming edge.');\n      // Export to the adapter global object visible in the browser.\n      module.exports.browserShim = edgeShim;\n\n      edgeShim.shimGetUserMedia();\n      edgeShim.shimPeerConnection();\n      break;\n    case 'safari':\n      if (!safariShim) {\n        logging('Safari shim is not included in this adapter release.');\n        return;\n      }\n      logging('adapter.js shimming safari.');\n      // Export to the adapter global object visible in the browser.\n      module.exports.browserShim = safariShim;\n\n      safariShim.shimGetUserMedia();\n      break;\n    default:\n      logging('Unsupported browser!');\n  }\n})();\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy93ZWJydGMtYWRhcHRlci9zcmMvanMvYWRhcHRlcl9jb3JlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiAgQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBXZWJSVEMgcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlXG4gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlXG4gKiAgdHJlZS5cbiAqL1xuIC8qIGVzbGludC1lbnYgbm9kZSAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8vIFNoaW1taW5nIHN0YXJ0cyBoZXJlLlxuKGZ1bmN0aW9uKCkge1xuICAvLyBVdGlscy5cbiAgdmFyIGxvZ2dpbmcgPSByZXF1aXJlKCcuL3V0aWxzJykubG9nO1xuICB2YXIgYnJvd3NlckRldGFpbHMgPSByZXF1aXJlKCcuL3V0aWxzJykuYnJvd3NlckRldGFpbHM7XG4gIC8vIEV4cG9ydCB0byB0aGUgYWRhcHRlciBnbG9iYWwgb2JqZWN0IHZpc2libGUgaW4gdGhlIGJyb3dzZXIuXG4gIG1vZHVsZS5leHBvcnRzLmJyb3dzZXJEZXRhaWxzID0gYnJvd3NlckRldGFpbHM7XG4gIG1vZHVsZS5leHBvcnRzLmV4dHJhY3RWZXJzaW9uID0gcmVxdWlyZSgnLi91dGlscycpLmV4dHJhY3RWZXJzaW9uO1xuICBtb2R1bGUuZXhwb3J0cy5kaXNhYmxlTG9nID0gcmVxdWlyZSgnLi91dGlscycpLmRpc2FibGVMb2c7XG5cbiAgLy8gVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IGlmIHlvdSB3YW50IGxvZ2dpbmcgdG8gb2NjdXIsIGluY2x1ZGluZyBsb2dnaW5nXG4gIC8vIGZvciB0aGUgc3dpdGNoIHN0YXRlbWVudCBiZWxvdy4gQ2FuIGFsc28gYmUgdHVybmVkIG9uIGluIHRoZSBicm93c2VyIHZpYVxuICAvLyBhZGFwdGVyLmRpc2FibGVMb2coZmFsc2UpLCBidXQgdGhlbiBsb2dnaW5nIGZyb20gdGhlIHN3aXRjaCBzdGF0ZW1lbnQgYmVsb3dcbiAgLy8gd2lsbCBub3QgYXBwZWFyLlxuICAvLyByZXF1aXJlKCcuL3V0aWxzJykuZGlzYWJsZUxvZyhmYWxzZSk7XG5cbiAgLy8gQnJvd3NlciBzaGltcy5cbiAgdmFyIGNocm9tZVNoaW0gPSByZXF1aXJlKCcuL2Nocm9tZS9jaHJvbWVfc2hpbScpIHx8IG51bGw7XG4gIHZhciBlZGdlU2hpbSA9IHJlcXVpcmUoJy4vZWRnZS9lZGdlX3NoaW0nKSB8fCBudWxsO1xuICB2YXIgZmlyZWZveFNoaW0gPSByZXF1aXJlKCcuL2ZpcmVmb3gvZmlyZWZveF9zaGltJykgfHwgbnVsbDtcbiAgdmFyIHNhZmFyaVNoaW0gPSByZXF1aXJlKCcuL3NhZmFyaS9zYWZhcmlfc2hpbScpIHx8IG51bGw7XG5cbiAgLy8gU2hpbSBicm93c2VyIGlmIGZvdW5kLlxuICBzd2l0Y2ggKGJyb3dzZXJEZXRhaWxzLmJyb3dzZXIpIHtcbiAgICBjYXNlICdvcGVyYSc6IC8vIGZhbGx0aHJvdWdoIGFzIGl0IHVzZXMgY2hyb21lIHNoaW1zXG4gICAgY2FzZSAnY2hyb21lJzpcbiAgICAgIGlmICghY2hyb21lU2hpbSB8fCAhY2hyb21lU2hpbS5zaGltUGVlckNvbm5lY3Rpb24pIHtcbiAgICAgICAgbG9nZ2luZygnQ2hyb21lIHNoaW0gaXMgbm90IGluY2x1ZGVkIGluIHRoaXMgYWRhcHRlciByZWxlYXNlLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2dnaW5nKCdhZGFwdGVyLmpzIHNoaW1taW5nIGNocm9tZS4nKTtcbiAgICAgIC8vIEV4cG9ydCB0byB0aGUgYWRhcHRlciBnbG9iYWwgb2JqZWN0IHZpc2libGUgaW4gdGhlIGJyb3dzZXIuXG4gICAgICBtb2R1bGUuZXhwb3J0cy5icm93c2VyU2hpbSA9IGNocm9tZVNoaW07XG5cbiAgICAgIGNocm9tZVNoaW0uc2hpbUdldFVzZXJNZWRpYSgpO1xuICAgICAgY2hyb21lU2hpbS5zaGltTWVkaWFTdHJlYW0oKTtcbiAgICAgIGNocm9tZVNoaW0uc2hpbVNvdXJjZU9iamVjdCgpO1xuICAgICAgY2hyb21lU2hpbS5zaGltUGVlckNvbm5lY3Rpb24oKTtcbiAgICAgIGNocm9tZVNoaW0uc2hpbU9uVHJhY2soKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ZpcmVmb3gnOlxuICAgICAgaWYgKCFmaXJlZm94U2hpbSB8fCAhZmlyZWZveFNoaW0uc2hpbVBlZXJDb25uZWN0aW9uKSB7XG4gICAgICAgIGxvZ2dpbmcoJ0ZpcmVmb3ggc2hpbSBpcyBub3QgaW5jbHVkZWQgaW4gdGhpcyBhZGFwdGVyIHJlbGVhc2UuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxvZ2dpbmcoJ2FkYXB0ZXIuanMgc2hpbW1pbmcgZmlyZWZveC4nKTtcbiAgICAgIC8vIEV4cG9ydCB0byB0aGUgYWRhcHRlciBnbG9iYWwgb2JqZWN0IHZpc2libGUgaW4gdGhlIGJyb3dzZXIuXG4gICAgICBtb2R1bGUuZXhwb3J0cy5icm93c2VyU2hpbSA9IGZpcmVmb3hTaGltO1xuXG4gICAgICBmaXJlZm94U2hpbS5zaGltR2V0VXNlck1lZGlhKCk7XG4gICAgICBmaXJlZm94U2hpbS5zaGltU291cmNlT2JqZWN0KCk7XG4gICAgICBmaXJlZm94U2hpbS5zaGltUGVlckNvbm5lY3Rpb24oKTtcbiAgICAgIGZpcmVmb3hTaGltLnNoaW1PblRyYWNrKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdlZGdlJzpcbiAgICAgIGlmICghZWRnZVNoaW0gfHwgIWVkZ2VTaGltLnNoaW1QZWVyQ29ubmVjdGlvbikge1xuICAgICAgICBsb2dnaW5nKCdNUyBlZGdlIHNoaW0gaXMgbm90IGluY2x1ZGVkIGluIHRoaXMgYWRhcHRlciByZWxlYXNlLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2dnaW5nKCdhZGFwdGVyLmpzIHNoaW1taW5nIGVkZ2UuJyk7XG4gICAgICAvLyBFeHBvcnQgdG8gdGhlIGFkYXB0ZXIgZ2xvYmFsIG9iamVjdCB2aXNpYmxlIGluIHRoZSBicm93c2VyLlxuICAgICAgbW9kdWxlLmV4cG9ydHMuYnJvd3NlclNoaW0gPSBlZGdlU2hpbTtcblxuICAgICAgZWRnZVNoaW0uc2hpbUdldFVzZXJNZWRpYSgpO1xuICAgICAgZWRnZVNoaW0uc2hpbVBlZXJDb25uZWN0aW9uKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzYWZhcmknOlxuICAgICAgaWYgKCFzYWZhcmlTaGltKSB7XG4gICAgICAgIGxvZ2dpbmcoJ1NhZmFyaSBzaGltIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGlzIGFkYXB0ZXIgcmVsZWFzZS4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbG9nZ2luZygnYWRhcHRlci5qcyBzaGltbWluZyBzYWZhcmkuJyk7XG4gICAgICAvLyBFeHBvcnQgdG8gdGhlIGFkYXB0ZXIgZ2xvYmFsIG9iamVjdCB2aXNpYmxlIGluIHRoZSBicm93c2VyLlxuICAgICAgbW9kdWxlLmV4cG9ydHMuYnJvd3NlclNoaW0gPSBzYWZhcmlTaGltO1xuXG4gICAgICBzYWZhcmlTaGltLnNoaW1HZXRVc2VyTWVkaWEoKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBsb2dnaW5nKCdVbnN1cHBvcnRlZCBicm93c2VyIScpO1xuICB9XG59KSgpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3dlYnJ0Yy1hZGFwdGVyL3NyYy9qcy9hZGFwdGVyX2NvcmUuanNcbi8vIG1vZHVsZSBpZCA9IDQ1OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 460 */
/***/ function(module, exports) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar logDisabled_ = true;\n\n// Utility methods.\nvar utils = {\n  disableLog: function(bool) {\n    if (typeof bool !== 'boolean') {\n      return new Error('Argument type: ' + typeof bool +\n          '. Please use a boolean.');\n    }\n    logDisabled_ = bool;\n    return (bool) ? 'adapter.js logging disabled' :\n        'adapter.js logging enabled';\n  },\n\n  log: function() {\n    if (typeof window === 'object') {\n      if (logDisabled_) {\n        return;\n      }\n      if (typeof console !== 'undefined' && typeof console.log === 'function') {\n        console.log.apply(console, arguments);\n      }\n    }\n  },\n\n  /**\n   * Extract browser version out of the provided user agent string.\n   *\n   * @param {!string} uastring userAgent string.\n   * @param {!string} expr Regular expression used as match criteria.\n   * @param {!number} pos position in the version string to be returned.\n   * @return {!number} browser version.\n   */\n  extractVersion: function(uastring, expr, pos) {\n    var match = uastring.match(expr);\n    return match && match.length >= pos && parseInt(match[pos], 10);\n  },\n\n  /**\n   * Browser detector.\n   *\n   * @return {object} result containing browser and version\n   *     properties.\n   */\n  detectBrowser: function() {\n    // Returned result object.\n    var result = {};\n    result.browser = null;\n    result.version = null;\n\n    // Fail early if it's not a browser\n    if (typeof window === 'undefined' || !window.navigator) {\n      result.browser = 'Not a browser.';\n      return result;\n    }\n\n    // Firefox.\n    if (navigator.mozGetUserMedia) {\n      result.browser = 'firefox';\n      result.version = this.extractVersion(navigator.userAgent,\n          /Firefox\\/([0-9]+)\\./, 1);\n\n    // all webkit-based browsers\n    } else if (navigator.webkitGetUserMedia) {\n      // Chrome, Chromium, Webview, Opera, all use the chrome shim for now\n      if (window.webkitRTCPeerConnection) {\n        result.browser = 'chrome';\n        result.version = this.extractVersion(navigator.userAgent,\n          /Chrom(e|ium)\\/([0-9]+)\\./, 2);\n\n      // Safari or unknown webkit-based\n      // for the time being Safari has support for MediaStreams but not webRTC\n      } else {\n        // Safari UA substrings of interest for reference:\n        // - webkit version:           AppleWebKit/602.1.25 (also used in Op,Cr)\n        // - safari UI version:        Version/9.0.3 (unique to Safari)\n        // - safari UI webkit version: Safari/601.4.4 (also used in Op,Cr)\n        //\n        // if the webkit version and safari UI webkit versions are equals,\n        // ... this is a stable version.\n        //\n        // only the internal webkit version is important today to know if\n        // media streams are supported\n        //\n        if (navigator.userAgent.match(/Version\\/(\\d+).(\\d+)/)) {\n          result.browser = 'safari';\n          result.version = this.extractVersion(navigator.userAgent,\n            /AppleWebKit\\/([0-9]+)\\./, 1);\n\n        // unknown webkit-based browser\n        } else {\n          result.browser = 'Unsupported webkit-based browser ' +\n              'with GUM support but no WebRTC support.';\n          return result;\n        }\n      }\n\n    // Edge.\n    } else if (navigator.mediaDevices &&\n        navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)) {\n      result.browser = 'edge';\n      result.version = this.extractVersion(navigator.userAgent,\n          /Edge\\/(\\d+).(\\d+)$/, 2);\n\n    // Default fallthrough: not supported.\n    } else {\n      result.browser = 'Not a supported browser.';\n      return result;\n    }\n\n    return result;\n  }\n};\n\n// Export.\nmodule.exports = {\n  log: utils.log,\n  disableLog: utils.disableLog,\n  browserDetails: utils.detectBrowser(),\n  extractVersion: utils.extractVersion\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy93ZWJydGMtYWRhcHRlci9zcmMvanMvdXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqICBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFdlYlJUQyBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2VcbiAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2VcbiAqICB0cmVlLlxuICovXG4gLyogZXNsaW50LWVudiBub2RlICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBsb2dEaXNhYmxlZF8gPSB0cnVlO1xuXG4vLyBVdGlsaXR5IG1ldGhvZHMuXG52YXIgdXRpbHMgPSB7XG4gIGRpc2FibGVMb2c6IGZ1bmN0aW9uKGJvb2wpIHtcbiAgICBpZiAodHlwZW9mIGJvb2wgIT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcignQXJndW1lbnQgdHlwZTogJyArIHR5cGVvZiBib29sICtcbiAgICAgICAgICAnLiBQbGVhc2UgdXNlIGEgYm9vbGVhbi4nKTtcbiAgICB9XG4gICAgbG9nRGlzYWJsZWRfID0gYm9vbDtcbiAgICByZXR1cm4gKGJvb2wpID8gJ2FkYXB0ZXIuanMgbG9nZ2luZyBkaXNhYmxlZCcgOlxuICAgICAgICAnYWRhcHRlci5qcyBsb2dnaW5nIGVuYWJsZWQnO1xuICB9LFxuXG4gIGxvZzogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAobG9nRGlzYWJsZWRfKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUubG9nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGJyb3dzZXIgdmVyc2lvbiBvdXQgb2YgdGhlIHByb3ZpZGVkIHVzZXIgYWdlbnQgc3RyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0geyFzdHJpbmd9IHVhc3RyaW5nIHVzZXJBZ2VudCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7IXN0cmluZ30gZXhwciBSZWd1bGFyIGV4cHJlc3Npb24gdXNlZCBhcyBtYXRjaCBjcml0ZXJpYS5cbiAgICogQHBhcmFtIHshbnVtYmVyfSBwb3MgcG9zaXRpb24gaW4gdGhlIHZlcnNpb24gc3RyaW5nIHRvIGJlIHJldHVybmVkLlxuICAgKiBAcmV0dXJuIHshbnVtYmVyfSBicm93c2VyIHZlcnNpb24uXG4gICAqL1xuICBleHRyYWN0VmVyc2lvbjogZnVuY3Rpb24odWFzdHJpbmcsIGV4cHIsIHBvcykge1xuICAgIHZhciBtYXRjaCA9IHVhc3RyaW5nLm1hdGNoKGV4cHIpO1xuICAgIHJldHVybiBtYXRjaCAmJiBtYXRjaC5sZW5ndGggPj0gcG9zICYmIHBhcnNlSW50KG1hdGNoW3Bvc10sIDEwKTtcbiAgfSxcblxuICAvKipcbiAgICogQnJvd3NlciBkZXRlY3Rvci5cbiAgICpcbiAgICogQHJldHVybiB7b2JqZWN0fSByZXN1bHQgY29udGFpbmluZyBicm93c2VyIGFuZCB2ZXJzaW9uXG4gICAqICAgICBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgZGV0ZWN0QnJvd3NlcjogZnVuY3Rpb24oKSB7XG4gICAgLy8gUmV0dXJuZWQgcmVzdWx0IG9iamVjdC5cbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgcmVzdWx0LmJyb3dzZXIgPSBudWxsO1xuICAgIHJlc3VsdC52ZXJzaW9uID0gbnVsbDtcblxuICAgIC8vIEZhaWwgZWFybHkgaWYgaXQncyBub3QgYSBicm93c2VyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF3aW5kb3cubmF2aWdhdG9yKSB7XG4gICAgICByZXN1bHQuYnJvd3NlciA9ICdOb3QgYSBicm93c2VyLic7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIEZpcmVmb3guXG4gICAgaWYgKG5hdmlnYXRvci5tb3pHZXRVc2VyTWVkaWEpIHtcbiAgICAgIHJlc3VsdC5icm93c2VyID0gJ2ZpcmVmb3gnO1xuICAgICAgcmVzdWx0LnZlcnNpb24gPSB0aGlzLmV4dHJhY3RWZXJzaW9uKG5hdmlnYXRvci51c2VyQWdlbnQsXG4gICAgICAgICAgL0ZpcmVmb3hcXC8oWzAtOV0rKVxcLi8sIDEpO1xuXG4gICAgLy8gYWxsIHdlYmtpdC1iYXNlZCBicm93c2Vyc1xuICAgIH0gZWxzZSBpZiAobmF2aWdhdG9yLndlYmtpdEdldFVzZXJNZWRpYSkge1xuICAgICAgLy8gQ2hyb21lLCBDaHJvbWl1bSwgV2VidmlldywgT3BlcmEsIGFsbCB1c2UgdGhlIGNocm9tZSBzaGltIGZvciBub3dcbiAgICAgIGlmICh3aW5kb3cud2Via2l0UlRDUGVlckNvbm5lY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0LmJyb3dzZXIgPSAnY2hyb21lJztcbiAgICAgICAgcmVzdWx0LnZlcnNpb24gPSB0aGlzLmV4dHJhY3RWZXJzaW9uKG5hdmlnYXRvci51c2VyQWdlbnQsXG4gICAgICAgICAgL0Nocm9tKGV8aXVtKVxcLyhbMC05XSspXFwuLywgMik7XG5cbiAgICAgIC8vIFNhZmFyaSBvciB1bmtub3duIHdlYmtpdC1iYXNlZFxuICAgICAgLy8gZm9yIHRoZSB0aW1lIGJlaW5nIFNhZmFyaSBoYXMgc3VwcG9ydCBmb3IgTWVkaWFTdHJlYW1zIGJ1dCBub3Qgd2ViUlRDXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTYWZhcmkgVUEgc3Vic3RyaW5ncyBvZiBpbnRlcmVzdCBmb3IgcmVmZXJlbmNlOlxuICAgICAgICAvLyAtIHdlYmtpdCB2ZXJzaW9uOiAgICAgICAgICAgQXBwbGVXZWJLaXQvNjAyLjEuMjUgKGFsc28gdXNlZCBpbiBPcCxDcilcbiAgICAgICAgLy8gLSBzYWZhcmkgVUkgdmVyc2lvbjogICAgICAgIFZlcnNpb24vOS4wLjMgKHVuaXF1ZSB0byBTYWZhcmkpXG4gICAgICAgIC8vIC0gc2FmYXJpIFVJIHdlYmtpdCB2ZXJzaW9uOiBTYWZhcmkvNjAxLjQuNCAoYWxzbyB1c2VkIGluIE9wLENyKVxuICAgICAgICAvL1xuICAgICAgICAvLyBpZiB0aGUgd2Via2l0IHZlcnNpb24gYW5kIHNhZmFyaSBVSSB3ZWJraXQgdmVyc2lvbnMgYXJlIGVxdWFscyxcbiAgICAgICAgLy8gLi4uIHRoaXMgaXMgYSBzdGFibGUgdmVyc2lvbi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gb25seSB0aGUgaW50ZXJuYWwgd2Via2l0IHZlcnNpb24gaXMgaW1wb3J0YW50IHRvZGF5IHRvIGtub3cgaWZcbiAgICAgICAgLy8gbWVkaWEgc3RyZWFtcyBhcmUgc3VwcG9ydGVkXG4gICAgICAgIC8vXG4gICAgICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9WZXJzaW9uXFwvKFxcZCspLihcXGQrKS8pKSB7XG4gICAgICAgICAgcmVzdWx0LmJyb3dzZXIgPSAnc2FmYXJpJztcbiAgICAgICAgICByZXN1bHQudmVyc2lvbiA9IHRoaXMuZXh0cmFjdFZlcnNpb24obmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICAgICAgICAgIC9BcHBsZVdlYktpdFxcLyhbMC05XSspXFwuLywgMSk7XG5cbiAgICAgICAgLy8gdW5rbm93biB3ZWJraXQtYmFzZWQgYnJvd3NlclxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdC5icm93c2VyID0gJ1Vuc3VwcG9ydGVkIHdlYmtpdC1iYXNlZCBicm93c2VyICcgK1xuICAgICAgICAgICAgICAnd2l0aCBHVU0gc3VwcG9ydCBidXQgbm8gV2ViUlRDIHN1cHBvcnQuJztcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAvLyBFZGdlLlxuICAgIH0gZWxzZSBpZiAobmF2aWdhdG9yLm1lZGlhRGV2aWNlcyAmJlxuICAgICAgICBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9FZGdlXFwvKFxcZCspLihcXGQrKSQvKSkge1xuICAgICAgcmVzdWx0LmJyb3dzZXIgPSAnZWRnZSc7XG4gICAgICByZXN1bHQudmVyc2lvbiA9IHRoaXMuZXh0cmFjdFZlcnNpb24obmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICAgICAgICAvRWRnZVxcLyhcXGQrKS4oXFxkKykkLywgMik7XG5cbiAgICAvLyBEZWZhdWx0IGZhbGx0aHJvdWdoOiBub3Qgc3VwcG9ydGVkLlxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQuYnJvd3NlciA9ICdOb3QgYSBzdXBwb3J0ZWQgYnJvd3Nlci4nO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuXG4vLyBFeHBvcnQuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbG9nOiB1dGlscy5sb2csXG4gIGRpc2FibGVMb2c6IHV0aWxzLmRpc2FibGVMb2csXG4gIGJyb3dzZXJEZXRhaWxzOiB1dGlscy5kZXRlY3RCcm93c2VyKCksXG4gIGV4dHJhY3RWZXJzaW9uOiB1dGlscy5leHRyYWN0VmVyc2lvblxufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi93ZWJydGMtYWRhcHRlci9zcmMvanMvdXRpbHMuanNcbi8vIG1vZHVsZSBpZCA9IDQ2MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 461 */
/***/ function(module, exports, __webpack_require__) {

    eval("\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\nvar logging = __webpack_require__(460).log;\nvar browserDetails = __webpack_require__(460).browserDetails;\n\nvar chromeShim = {\n  shimMediaStream: function() {\n    window.MediaStream = window.MediaStream || window.webkitMediaStream;\n  },\n\n  shimOnTrack: function() {\n    if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n        window.RTCPeerConnection.prototype)) {\n      Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n        get: function() {\n          return this._ontrack;\n        },\n        set: function(f) {\n          var self = this;\n          if (this._ontrack) {\n            this.removeEventListener('track', this._ontrack);\n            this.removeEventListener('addstream', this._ontrackpoly);\n          }\n          this.addEventListener('track', this._ontrack = f);\n          this.addEventListener('addstream', this._ontrackpoly = function(e) {\n            // onaddstream does not fire when a track is added to an existing\n            // stream. But stream.onaddtrack is implemented so we use that.\n            e.stream.addEventListener('addtrack', function(te) {\n              var event = new Event('track');\n              event.track = te.track;\n              event.receiver = {track: te.track};\n              event.streams = [e.stream];\n              self.dispatchEvent(event);\n            });\n            e.stream.getTracks().forEach(function(track) {\n              var event = new Event('track');\n              event.track = track;\n              event.receiver = {track: track};\n              event.streams = [e.stream];\n              this.dispatchEvent(event);\n            }.bind(this));\n          }.bind(this));\n        }\n      });\n    }\n  },\n\n  shimSourceObject: function() {\n    if (typeof window === 'object') {\n      if (window.HTMLMediaElement &&\n        !('srcObject' in window.HTMLMediaElement.prototype)) {\n        // Shim the srcObject property, once, when HTMLMediaElement is found.\n        Object.defineProperty(window.HTMLMediaElement.prototype, 'srcObject', {\n          get: function() {\n            return this._srcObject;\n          },\n          set: function(stream) {\n            var self = this;\n            // Use _srcObject as a private property for this shim\n            this._srcObject = stream;\n            if (this.src) {\n              URL.revokeObjectURL(this.src);\n            }\n\n            if (!stream) {\n              this.src = '';\n              return;\n            }\n            this.src = URL.createObjectURL(stream);\n            // We need to recreate the blob url when a track is added or\n            // removed. Doing it manually since we want to avoid a recursion.\n            stream.addEventListener('addtrack', function() {\n              if (self.src) {\n                URL.revokeObjectURL(self.src);\n              }\n              self.src = URL.createObjectURL(stream);\n            });\n            stream.addEventListener('removetrack', function() {\n              if (self.src) {\n                URL.revokeObjectURL(self.src);\n              }\n              self.src = URL.createObjectURL(stream);\n            });\n          }\n        });\n      }\n    }\n  },\n\n  shimPeerConnection: function() {\n    // The RTCPeerConnection object.\n    window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n      // Translate iceTransportPolicy to iceTransports,\n      // see https://code.google.com/p/webrtc/issues/detail?id=4869\n      logging('PeerConnection');\n      if (pcConfig && pcConfig.iceTransportPolicy) {\n        pcConfig.iceTransports = pcConfig.iceTransportPolicy;\n      }\n\n      var pc = new webkitRTCPeerConnection(pcConfig, pcConstraints);\n      var origGetStats = pc.getStats.bind(pc);\n      pc.getStats = function(selector, successCallback, errorCallback) {\n        var self = this;\n        var args = arguments;\n\n        // If selector is a function then we are in the old style stats so just\n        // pass back the original getStats format to avoid breaking old users.\n        if (arguments.length > 0 && typeof selector === 'function') {\n          return origGetStats(selector, successCallback);\n        }\n\n        var fixChromeStats_ = function(response) {\n          var standardReport = {};\n          var reports = response.result();\n          reports.forEach(function(report) {\n            var standardStats = {\n              id: report.id,\n              timestamp: report.timestamp,\n              type: report.type\n            };\n            report.names().forEach(function(name) {\n              standardStats[name] = report.stat(name);\n            });\n            standardReport[standardStats.id] = standardStats;\n          });\n\n          return standardReport;\n        };\n\n        // shim getStats with maplike support\n        var makeMapStats = function(stats, legacyStats) {\n          var map = new Map(Object.keys(stats).map(function(key) {\n            return[key, stats[key]];\n          }));\n          legacyStats = legacyStats || stats;\n          Object.keys(legacyStats).forEach(function(key) {\n            map[key] = legacyStats[key];\n          });\n          return map;\n        };\n\n        if (arguments.length >= 2) {\n          var successCallbackWrapper_ = function(response) {\n            args[1](makeMapStats(fixChromeStats_(response)));\n          };\n\n          return origGetStats.apply(this, [successCallbackWrapper_,\n              arguments[0]]);\n        }\n\n        // promise-support\n        return new Promise(function(resolve, reject) {\n          if (args.length === 1 && typeof selector === 'object') {\n            origGetStats.apply(self, [\n              function(response) {\n                resolve(makeMapStats(fixChromeStats_(response)));\n              }, reject]);\n          } else {\n            // Preserve legacy chrome stats only on legacy access of stats obj\n            origGetStats.apply(self, [\n              function(response) {\n                resolve(makeMapStats(fixChromeStats_(response),\n                    response.result()));\n              }, reject]);\n          }\n        }).then(successCallback, errorCallback);\n      };\n\n      return pc;\n    };\n    window.RTCPeerConnection.prototype = webkitRTCPeerConnection.prototype;\n\n    // wrap static methods. Currently just generateCertificate.\n    if (webkitRTCPeerConnection.generateCertificate) {\n      Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n        get: function() {\n          return webkitRTCPeerConnection.generateCertificate;\n        }\n      });\n    }\n\n    ['createOffer', 'createAnswer'].forEach(function(method) {\n      var nativeMethod = webkitRTCPeerConnection.prototype[method];\n      webkitRTCPeerConnection.prototype[method] = function() {\n        var self = this;\n        if (arguments.length < 1 || (arguments.length === 1 &&\n            typeof arguments[0] === 'object')) {\n          var opts = arguments.length === 1 ? arguments[0] : undefined;\n          return new Promise(function(resolve, reject) {\n            nativeMethod.apply(self, [resolve, reject, opts]);\n          });\n        }\n        return nativeMethod.apply(this, arguments);\n      };\n    });\n\n    // add promise support -- natively available in Chrome 51\n    if (browserDetails.version < 51) {\n      ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n          .forEach(function(method) {\n            var nativeMethod = webkitRTCPeerConnection.prototype[method];\n            webkitRTCPeerConnection.prototype[method] = function() {\n              var args = arguments;\n              var self = this;\n              var promise = new Promise(function(resolve, reject) {\n                nativeMethod.apply(self, [args[0], resolve, reject]);\n              });\n              if (args.length < 2) {\n                return promise;\n              }\n              return promise.then(function() {\n                args[1].apply(null, []);\n              },\n              function(err) {\n                if (args.length >= 3) {\n                  args[2].apply(null, [err]);\n                }\n              });\n            };\n          });\n    }\n\n    // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n    ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n        .forEach(function(method) {\n          var nativeMethod = webkitRTCPeerConnection.prototype[method];\n          webkitRTCPeerConnection.prototype[method] = function() {\n            arguments[0] = new ((method === 'addIceCandidate') ?\n                RTCIceCandidate : RTCSessionDescription)(arguments[0]);\n            return nativeMethod.apply(this, arguments);\n          };\n        });\n\n    // support for addIceCandidate(null or undefined)\n    var nativeAddIceCandidate =\n        RTCPeerConnection.prototype.addIceCandidate;\n    RTCPeerConnection.prototype.addIceCandidate = function() {\n      if (!arguments[0]) {\n        if (arguments[1]) {\n          arguments[1].apply(null);\n        }\n        return Promise.resolve();\n      }\n      return nativeAddIceCandidate.apply(this, arguments);\n    };\n  }\n};\n\n\n// Expose public methods.\nmodule.exports = {\n  shimMediaStream: chromeShim.shimMediaStream,\n  shimOnTrack: chromeShim.shimOnTrack,\n  shimSourceObject: chromeShim.shimSourceObject,\n  shimPeerConnection: chromeShim.shimPeerConnection,\n  shimGetUserMedia: __webpack_require__(462)\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy93ZWJydGMtYWRhcHRlci9zcmMvanMvY2hyb21lL2Nocm9tZV9zaGltLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlxuLypcbiAqICBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFdlYlJUQyBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2VcbiAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2VcbiAqICB0cmVlLlxuICovXG4gLyogZXNsaW50LWVudiBub2RlICovXG4ndXNlIHN0cmljdCc7XG52YXIgbG9nZ2luZyA9IHJlcXVpcmUoJy4uL3V0aWxzLmpzJykubG9nO1xudmFyIGJyb3dzZXJEZXRhaWxzID0gcmVxdWlyZSgnLi4vdXRpbHMuanMnKS5icm93c2VyRGV0YWlscztcblxudmFyIGNocm9tZVNoaW0gPSB7XG4gIHNoaW1NZWRpYVN0cmVhbTogZnVuY3Rpb24oKSB7XG4gICAgd2luZG93Lk1lZGlhU3RyZWFtID0gd2luZG93Lk1lZGlhU3RyZWFtIHx8IHdpbmRvdy53ZWJraXRNZWRpYVN0cmVhbTtcbiAgfSxcblxuICBzaGltT25UcmFjazogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnICYmIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbiAmJiAhKCdvbnRyYWNrJyBpblxuICAgICAgICB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUsICdvbnRyYWNrJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9vbnRyYWNrO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uKGYpIHtcbiAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgaWYgKHRoaXMuX29udHJhY2spIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHJhY2snLCB0aGlzLl9vbnRyYWNrKTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWRkc3RyZWFtJywgdGhpcy5fb250cmFja3BvbHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYWNrJywgdGhpcy5fb250cmFjayA9IGYpO1xuICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignYWRkc3RyZWFtJywgdGhpcy5fb250cmFja3BvbHkgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAvLyBvbmFkZHN0cmVhbSBkb2VzIG5vdCBmaXJlIHdoZW4gYSB0cmFjayBpcyBhZGRlZCB0byBhbiBleGlzdGluZ1xuICAgICAgICAgICAgLy8gc3RyZWFtLiBCdXQgc3RyZWFtLm9uYWRkdHJhY2sgaXMgaW1wbGVtZW50ZWQgc28gd2UgdXNlIHRoYXQuXG4gICAgICAgICAgICBlLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdhZGR0cmFjaycsIGZ1bmN0aW9uKHRlKSB7XG4gICAgICAgICAgICAgIHZhciBldmVudCA9IG5ldyBFdmVudCgndHJhY2snKTtcbiAgICAgICAgICAgICAgZXZlbnQudHJhY2sgPSB0ZS50cmFjaztcbiAgICAgICAgICAgICAgZXZlbnQucmVjZWl2ZXIgPSB7dHJhY2s6IHRlLnRyYWNrfTtcbiAgICAgICAgICAgICAgZXZlbnQuc3RyZWFtcyA9IFtlLnN0cmVhbV07XG4gICAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGUuc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goZnVuY3Rpb24odHJhY2spIHtcbiAgICAgICAgICAgICAgdmFyIGV2ZW50ID0gbmV3IEV2ZW50KCd0cmFjaycpO1xuICAgICAgICAgICAgICBldmVudC50cmFjayA9IHRyYWNrO1xuICAgICAgICAgICAgICBldmVudC5yZWNlaXZlciA9IHt0cmFjazogdHJhY2t9O1xuICAgICAgICAgICAgICBldmVudC5zdHJlYW1zID0gW2Uuc3RyZWFtXTtcbiAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIHNoaW1Tb3VyY2VPYmplY3Q6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHdpbmRvdy5IVE1MTWVkaWFFbGVtZW50ICYmXG4gICAgICAgICEoJ3NyY09iamVjdCcgaW4gd2luZG93LkhUTUxNZWRpYUVsZW1lbnQucHJvdG90eXBlKSkge1xuICAgICAgICAvLyBTaGltIHRoZSBzcmNPYmplY3QgcHJvcGVydHksIG9uY2UsIHdoZW4gSFRNTE1lZGlhRWxlbWVudCBpcyBmb3VuZC5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5IVE1MTWVkaWFFbGVtZW50LnByb3RvdHlwZSwgJ3NyY09iamVjdCcsIHtcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NyY09iamVjdDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldDogZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICAvLyBVc2UgX3NyY09iamVjdCBhcyBhIHByaXZhdGUgcHJvcGVydHkgZm9yIHRoaXMgc2hpbVxuICAgICAgICAgICAgdGhpcy5fc3JjT2JqZWN0ID0gc3RyZWFtO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3JjKSB7XG4gICAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodGhpcy5zcmMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXN0cmVhbSkge1xuICAgICAgICAgICAgICB0aGlzLnNyYyA9ICcnO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoc3RyZWFtKTtcbiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlIGJsb2IgdXJsIHdoZW4gYSB0cmFjayBpcyBhZGRlZCBvclxuICAgICAgICAgICAgLy8gcmVtb3ZlZC4gRG9pbmcgaXQgbWFudWFsbHkgc2luY2Ugd2Ugd2FudCB0byBhdm9pZCBhIHJlY3Vyc2lvbi5cbiAgICAgICAgICAgIHN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdhZGR0cmFjaycsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoc2VsZi5zcmMpIHtcbiAgICAgICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHNlbGYuc3JjKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzZWxmLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoc3RyZWFtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3JlbW92ZXRyYWNrJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChzZWxmLnNyYykge1xuICAgICAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoc2VsZi5zcmMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHNlbGYuc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChzdHJlYW0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgc2hpbVBlZXJDb25uZWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAvLyBUaGUgUlRDUGVlckNvbm5lY3Rpb24gb2JqZWN0LlxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKHBjQ29uZmlnLCBwY0NvbnN0cmFpbnRzKSB7XG4gICAgICAvLyBUcmFuc2xhdGUgaWNlVHJhbnNwb3J0UG9saWN5IHRvIGljZVRyYW5zcG9ydHMsXG4gICAgICAvLyBzZWUgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC93ZWJydGMvaXNzdWVzL2RldGFpbD9pZD00ODY5XG4gICAgICBsb2dnaW5nKCdQZWVyQ29ubmVjdGlvbicpO1xuICAgICAgaWYgKHBjQ29uZmlnICYmIHBjQ29uZmlnLmljZVRyYW5zcG9ydFBvbGljeSkge1xuICAgICAgICBwY0NvbmZpZy5pY2VUcmFuc3BvcnRzID0gcGNDb25maWcuaWNlVHJhbnNwb3J0UG9saWN5O1xuICAgICAgfVxuXG4gICAgICB2YXIgcGMgPSBuZXcgd2Via2l0UlRDUGVlckNvbm5lY3Rpb24ocGNDb25maWcsIHBjQ29uc3RyYWludHMpO1xuICAgICAgdmFyIG9yaWdHZXRTdGF0cyA9IHBjLmdldFN0YXRzLmJpbmQocGMpO1xuICAgICAgcGMuZ2V0U3RhdHMgPSBmdW5jdGlvbihzZWxlY3Rvciwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG5cbiAgICAgICAgLy8gSWYgc2VsZWN0b3IgaXMgYSBmdW5jdGlvbiB0aGVuIHdlIGFyZSBpbiB0aGUgb2xkIHN0eWxlIHN0YXRzIHNvIGp1c3RcbiAgICAgICAgLy8gcGFzcyBiYWNrIHRoZSBvcmlnaW5hbCBnZXRTdGF0cyBmb3JtYXQgdG8gYXZvaWQgYnJlYWtpbmcgb2xkIHVzZXJzLlxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdHlwZW9mIHNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIG9yaWdHZXRTdGF0cyhzZWxlY3Rvciwgc3VjY2Vzc0NhbGxiYWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmaXhDaHJvbWVTdGF0c18gPSBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgIHZhciBzdGFuZGFyZFJlcG9ydCA9IHt9O1xuICAgICAgICAgIHZhciByZXBvcnRzID0gcmVzcG9uc2UucmVzdWx0KCk7XG4gICAgICAgICAgcmVwb3J0cy5mb3JFYWNoKGZ1bmN0aW9uKHJlcG9ydCkge1xuICAgICAgICAgICAgdmFyIHN0YW5kYXJkU3RhdHMgPSB7XG4gICAgICAgICAgICAgIGlkOiByZXBvcnQuaWQsXG4gICAgICAgICAgICAgIHRpbWVzdGFtcDogcmVwb3J0LnRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgdHlwZTogcmVwb3J0LnR5cGVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXBvcnQubmFtZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICAgICAgc3RhbmRhcmRTdGF0c1tuYW1lXSA9IHJlcG9ydC5zdGF0KG5hbWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdGFuZGFyZFJlcG9ydFtzdGFuZGFyZFN0YXRzLmlkXSA9IHN0YW5kYXJkU3RhdHM7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gc3RhbmRhcmRSZXBvcnQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gc2hpbSBnZXRTdGF0cyB3aXRoIG1hcGxpa2Ugc3VwcG9ydFxuICAgICAgICB2YXIgbWFrZU1hcFN0YXRzID0gZnVuY3Rpb24oc3RhdHMsIGxlZ2FjeVN0YXRzKSB7XG4gICAgICAgICAgdmFyIG1hcCA9IG5ldyBNYXAoT2JqZWN0LmtleXMoc3RhdHMpLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgIHJldHVybltrZXksIHN0YXRzW2tleV1dO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgICBsZWdhY3lTdGF0cyA9IGxlZ2FjeVN0YXRzIHx8IHN0YXRzO1xuICAgICAgICAgIE9iamVjdC5rZXlzKGxlZ2FjeVN0YXRzKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgICAgbWFwW2tleV0gPSBsZWdhY3lTdGF0c1trZXldO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikge1xuICAgICAgICAgIHZhciBzdWNjZXNzQ2FsbGJhY2tXcmFwcGVyXyA9IGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBhcmdzWzFdKG1ha2VNYXBTdGF0cyhmaXhDaHJvbWVTdGF0c18ocmVzcG9uc2UpKSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHJldHVybiBvcmlnR2V0U3RhdHMuYXBwbHkodGhpcywgW3N1Y2Nlc3NDYWxsYmFja1dyYXBwZXJfLFxuICAgICAgICAgICAgICBhcmd1bWVudHNbMF1dKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHByb21pc2Utc3VwcG9ydFxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIG9yaWdHZXRTdGF0cy5hcHBseShzZWxmLCBbXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShtYWtlTWFwU3RhdHMoZml4Q2hyb21lU3RhdHNfKHJlc3BvbnNlKSkpO1xuICAgICAgICAgICAgICB9LCByZWplY3RdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUHJlc2VydmUgbGVnYWN5IGNocm9tZSBzdGF0cyBvbmx5IG9uIGxlZ2FjeSBhY2Nlc3Mgb2Ygc3RhdHMgb2JqXG4gICAgICAgICAgICBvcmlnR2V0U3RhdHMuYXBwbHkoc2VsZiwgW1xuICAgICAgICAgICAgICBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUobWFrZU1hcFN0YXRzKGZpeENocm9tZVN0YXRzXyhyZXNwb25zZSksXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlc3VsdCgpKSk7XG4gICAgICAgICAgICAgIH0sIHJlamVjdF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkudGhlbihzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHBjO1xuICAgIH07XG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZSA9IHdlYmtpdFJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZTtcblxuICAgIC8vIHdyYXAgc3RhdGljIG1ldGhvZHMuIEN1cnJlbnRseSBqdXN0IGdlbmVyYXRlQ2VydGlmaWNhdGUuXG4gICAgaWYgKHdlYmtpdFJUQ1BlZXJDb25uZWN0aW9uLmdlbmVyYXRlQ2VydGlmaWNhdGUpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24sICdnZW5lcmF0ZUNlcnRpZmljYXRlJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiB3ZWJraXRSVENQZWVyQ29ubmVjdGlvbi5nZW5lcmF0ZUNlcnRpZmljYXRlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBbJ2NyZWF0ZU9mZmVyJywgJ2NyZWF0ZUFuc3dlciddLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICB2YXIgbmF0aXZlTWV0aG9kID0gd2Via2l0UlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlW21ldGhvZF07XG4gICAgICB3ZWJraXRSVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMSB8fCAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgdHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ29iamVjdCcpKSB7XG4gICAgICAgICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkO1xuICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIG5hdGl2ZU1ldGhvZC5hcHBseShzZWxmLCBbcmVzb2x2ZSwgcmVqZWN0LCBvcHRzXSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5hdGl2ZU1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIGFkZCBwcm9taXNlIHN1cHBvcnQgLS0gbmF0aXZlbHkgYXZhaWxhYmxlIGluIENocm9tZSA1MVxuICAgIGlmIChicm93c2VyRGV0YWlscy52ZXJzaW9uIDwgNTEpIHtcbiAgICAgIFsnc2V0TG9jYWxEZXNjcmlwdGlvbicsICdzZXRSZW1vdGVEZXNjcmlwdGlvbicsICdhZGRJY2VDYW5kaWRhdGUnXVxuICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgICAgICAgdmFyIG5hdGl2ZU1ldGhvZCA9IHdlYmtpdFJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZVttZXRob2RdO1xuICAgICAgICAgICAgd2Via2l0UlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICBuYXRpdmVNZXRob2QuYXBwbHkoc2VsZiwgW2FyZ3NbMF0sIHJlc29sdmUsIHJlamVjdF0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgYXJnc1sxXS5hcHBseShudWxsLCBbXSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+PSAzKSB7XG4gICAgICAgICAgICAgICAgICBhcmdzWzJdLmFwcGx5KG51bGwsIFtlcnJdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBzaGltIGltcGxpY2l0IGNyZWF0aW9uIG9mIFJUQ1Nlc3Npb25EZXNjcmlwdGlvbi9SVENJY2VDYW5kaWRhdGVcbiAgICBbJ3NldExvY2FsRGVzY3JpcHRpb24nLCAnc2V0UmVtb3RlRGVzY3JpcHRpb24nLCAnYWRkSWNlQ2FuZGlkYXRlJ11cbiAgICAgICAgLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICAgICAgdmFyIG5hdGl2ZU1ldGhvZCA9IHdlYmtpdFJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZVttZXRob2RdO1xuICAgICAgICAgIHdlYmtpdFJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBhcmd1bWVudHNbMF0gPSBuZXcgKChtZXRob2QgPT09ICdhZGRJY2VDYW5kaWRhdGUnKSA/XG4gICAgICAgICAgICAgICAgUlRDSWNlQ2FuZGlkYXRlIDogUlRDU2Vzc2lvbkRlc2NyaXB0aW9uKShhcmd1bWVudHNbMF0pO1xuICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZU1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgLy8gc3VwcG9ydCBmb3IgYWRkSWNlQ2FuZGlkYXRlKG51bGwgb3IgdW5kZWZpbmVkKVxuICAgIHZhciBuYXRpdmVBZGRJY2VDYW5kaWRhdGUgPVxuICAgICAgICBSVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuYWRkSWNlQ2FuZGlkYXRlO1xuICAgIFJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5hZGRJY2VDYW5kaWRhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghYXJndW1lbnRzWzBdKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHNbMV0pIHtcbiAgICAgICAgICBhcmd1bWVudHNbMV0uYXBwbHkobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5hdGl2ZUFkZEljZUNhbmRpZGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cbn07XG5cblxuLy8gRXhwb3NlIHB1YmxpYyBtZXRob2RzLlxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNoaW1NZWRpYVN0cmVhbTogY2hyb21lU2hpbS5zaGltTWVkaWFTdHJlYW0sXG4gIHNoaW1PblRyYWNrOiBjaHJvbWVTaGltLnNoaW1PblRyYWNrLFxuICBzaGltU291cmNlT2JqZWN0OiBjaHJvbWVTaGltLnNoaW1Tb3VyY2VPYmplY3QsXG4gIHNoaW1QZWVyQ29ubmVjdGlvbjogY2hyb21lU2hpbS5zaGltUGVlckNvbm5lY3Rpb24sXG4gIHNoaW1HZXRVc2VyTWVkaWE6IHJlcXVpcmUoJy4vZ2V0dXNlcm1lZGlhJylcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vd2VicnRjLWFkYXB0ZXIvc3JjL2pzL2Nocm9tZS9jaHJvbWVfc2hpbS5qc1xuLy8gbW9kdWxlIGlkID0gNDYxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 462 */
/***/ function(module, exports, __webpack_require__) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\nvar logging = __webpack_require__(460).log;\n\n// Expose public methods.\nmodule.exports = function() {\n  var constraintsToChrome_ = function(c) {\n    if (typeof c !== 'object' || c.mandatory || c.optional) {\n      return c;\n    }\n    var cc = {};\n    Object.keys(c).forEach(function(key) {\n      if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n        return;\n      }\n      var r = (typeof c[key] === 'object') ? c[key] : {ideal: c[key]};\n      if (r.exact !== undefined && typeof r.exact === 'number') {\n        r.min = r.max = r.exact;\n      }\n      var oldname_ = function(prefix, name) {\n        if (prefix) {\n          return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n        }\n        return (name === 'deviceId') ? 'sourceId' : name;\n      };\n      if (r.ideal !== undefined) {\n        cc.optional = cc.optional || [];\n        var oc = {};\n        if (typeof r.ideal === 'number') {\n          oc[oldname_('min', key)] = r.ideal;\n          cc.optional.push(oc);\n          oc = {};\n          oc[oldname_('max', key)] = r.ideal;\n          cc.optional.push(oc);\n        } else {\n          oc[oldname_('', key)] = r.ideal;\n          cc.optional.push(oc);\n        }\n      }\n      if (r.exact !== undefined && typeof r.exact !== 'number') {\n        cc.mandatory = cc.mandatory || {};\n        cc.mandatory[oldname_('', key)] = r.exact;\n      } else {\n        ['min', 'max'].forEach(function(mix) {\n          if (r[mix] !== undefined) {\n            cc.mandatory = cc.mandatory || {};\n            cc.mandatory[oldname_(mix, key)] = r[mix];\n          }\n        });\n      }\n    });\n    if (c.advanced) {\n      cc.optional = (cc.optional || []).concat(c.advanced);\n    }\n    return cc;\n  };\n\n  var shimConstraints_ = function(constraints, func) {\n    constraints = JSON.parse(JSON.stringify(constraints));\n    if (constraints && constraints.audio) {\n      constraints.audio = constraintsToChrome_(constraints.audio);\n    }\n    if (constraints && typeof constraints.video === 'object') {\n      // Shim facingMode for mobile, where it defaults to \"user\".\n      var face = constraints.video.facingMode;\n      face = face && ((typeof face === 'object') ? face : {ideal: face});\n\n      if ((face && (face.exact === 'user' || face.exact === 'environment' ||\n                    face.ideal === 'user' || face.ideal === 'environment')) &&\n          !(navigator.mediaDevices.getSupportedConstraints &&\n            navigator.mediaDevices.getSupportedConstraints().facingMode)) {\n        delete constraints.video.facingMode;\n        if (face.exact === 'environment' || face.ideal === 'environment') {\n          // Look for \"back\" in label, or use last cam (typically back cam).\n          return navigator.mediaDevices.enumerateDevices()\n          .then(function(devices) {\n            devices = devices.filter(function(d) {\n              return d.kind === 'videoinput';\n            });\n            var back = devices.find(function(d) {\n              return d.label.toLowerCase().indexOf('back') !== -1;\n            }) || (devices.length && devices[devices.length - 1]);\n            if (back) {\n              constraints.video.deviceId = face.exact ? {exact: back.deviceId} :\n                                                        {ideal: back.deviceId};\n            }\n            constraints.video = constraintsToChrome_(constraints.video);\n            logging('chrome: ' + JSON.stringify(constraints));\n            return func(constraints);\n          });\n        }\n      }\n      constraints.video = constraintsToChrome_(constraints.video);\n    }\n    logging('chrome: ' + JSON.stringify(constraints));\n    return func(constraints);\n  };\n\n  var shimError_ = function(e) {\n    return {\n      name: {\n        PermissionDeniedError: 'NotAllowedError',\n        ConstraintNotSatisfiedError: 'OverconstrainedError'\n      }[e.name] || e.name,\n      message: e.message,\n      constraint: e.constraintName,\n      toString: function() {\n        return this.name + (this.message && ': ') + this.message;\n      }\n    };\n  };\n\n  var getUserMedia_ = function(constraints, onSuccess, onError) {\n    shimConstraints_(constraints, function(c) {\n      navigator.webkitGetUserMedia(c, onSuccess, function(e) {\n        onError(shimError_(e));\n      });\n    });\n  };\n\n  navigator.getUserMedia = getUserMedia_;\n\n  // Returns the result of getUserMedia as a Promise.\n  var getUserMediaPromise_ = function(constraints) {\n    return new Promise(function(resolve, reject) {\n      navigator.getUserMedia(constraints, resolve, reject);\n    });\n  };\n\n  if (!navigator.mediaDevices) {\n    navigator.mediaDevices = {\n      getUserMedia: getUserMediaPromise_,\n      enumerateDevices: function() {\n        return new Promise(function(resolve) {\n          var kinds = {audio: 'audioinput', video: 'videoinput'};\n          return MediaStreamTrack.getSources(function(devices) {\n            resolve(devices.map(function(device) {\n              return {label: device.label,\n                      kind: kinds[device.kind],\n                      deviceId: device.id,\n                      groupId: ''};\n            }));\n          });\n        });\n      }\n    };\n  }\n\n  // A shim for getUserMedia method on the mediaDevices object.\n  // TODO(KaptenJansson) remove once implemented in Chrome stable.\n  if (!navigator.mediaDevices.getUserMedia) {\n    navigator.mediaDevices.getUserMedia = function(constraints) {\n      return getUserMediaPromise_(constraints);\n    };\n  } else {\n    // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n    // function which returns a Promise, it does not accept spec-style\n    // constraints.\n    var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n        bind(navigator.mediaDevices);\n    navigator.mediaDevices.getUserMedia = function(cs) {\n      return shimConstraints_(cs, function(c) {\n        return origGetUserMedia(c).then(function(stream) {\n          if (c.audio && !stream.getAudioTracks().length ||\n              c.video && !stream.getVideoTracks().length) {\n            stream.getTracks().forEach(function(track) {\n              track.stop();\n            });\n            throw new DOMException('', 'NotFoundError');\n          }\n          return stream;\n        }, function(e) {\n          return Promise.reject(shimError_(e));\n        });\n      });\n    };\n  }\n\n  // Dummy devicechange event methods.\n  // TODO(KaptenJansson) remove once implemented in Chrome stable.\n  if (typeof navigator.mediaDevices.addEventListener === 'undefined') {\n    navigator.mediaDevices.addEventListener = function() {\n      logging('Dummy mediaDevices.addEventListener called.');\n    };\n  }\n  if (typeof navigator.mediaDevices.removeEventListener === 'undefined') {\n    navigator.mediaDevices.removeEventListener = function() {\n      logging('Dummy mediaDevices.removeEventListener called.');\n    };\n  }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy93ZWJydGMtYWRhcHRlci9zcmMvanMvY2hyb21lL2dldHVzZXJtZWRpYS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogIENvcHlyaWdodCAoYykgMjAxNiBUaGUgV2ViUlRDIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZVxuICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZVxuICogIHRyZWUuXG4gKi9cbiAvKiBlc2xpbnQtZW52IG5vZGUgKi9cbid1c2Ugc3RyaWN0JztcbnZhciBsb2dnaW5nID0gcmVxdWlyZSgnLi4vdXRpbHMuanMnKS5sb2c7XG5cbi8vIEV4cG9zZSBwdWJsaWMgbWV0aG9kcy5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBjb25zdHJhaW50c1RvQ2hyb21lXyA9IGZ1bmN0aW9uKGMpIHtcbiAgICBpZiAodHlwZW9mIGMgIT09ICdvYmplY3QnIHx8IGMubWFuZGF0b3J5IHx8IGMub3B0aW9uYWwpIHtcbiAgICAgIHJldHVybiBjO1xuICAgIH1cbiAgICB2YXIgY2MgPSB7fTtcbiAgICBPYmplY3Qua2V5cyhjKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgaWYgKGtleSA9PT0gJ3JlcXVpcmUnIHx8IGtleSA9PT0gJ2FkdmFuY2VkJyB8fCBrZXkgPT09ICdtZWRpYVNvdXJjZScpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIHIgPSAodHlwZW9mIGNba2V5XSA9PT0gJ29iamVjdCcpID8gY1trZXldIDoge2lkZWFsOiBjW2tleV19O1xuICAgICAgaWYgKHIuZXhhY3QgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygci5leGFjdCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgci5taW4gPSByLm1heCA9IHIuZXhhY3Q7XG4gICAgICB9XG4gICAgICB2YXIgb2xkbmFtZV8gPSBmdW5jdGlvbihwcmVmaXgsIG5hbWUpIHtcbiAgICAgICAgaWYgKHByZWZpeCkge1xuICAgICAgICAgIHJldHVybiBwcmVmaXggKyBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKG5hbWUgPT09ICdkZXZpY2VJZCcpID8gJ3NvdXJjZUlkJyA6IG5hbWU7XG4gICAgICB9O1xuICAgICAgaWYgKHIuaWRlYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjYy5vcHRpb25hbCA9IGNjLm9wdGlvbmFsIHx8IFtdO1xuICAgICAgICB2YXIgb2MgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiByLmlkZWFsID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIG9jW29sZG5hbWVfKCdtaW4nLCBrZXkpXSA9IHIuaWRlYWw7XG4gICAgICAgICAgY2Mub3B0aW9uYWwucHVzaChvYyk7XG4gICAgICAgICAgb2MgPSB7fTtcbiAgICAgICAgICBvY1tvbGRuYW1lXygnbWF4Jywga2V5KV0gPSByLmlkZWFsO1xuICAgICAgICAgIGNjLm9wdGlvbmFsLnB1c2gob2MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9jW29sZG5hbWVfKCcnLCBrZXkpXSA9IHIuaWRlYWw7XG4gICAgICAgICAgY2Mub3B0aW9uYWwucHVzaChvYyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChyLmV4YWN0ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHIuZXhhY3QgIT09ICdudW1iZXInKSB7XG4gICAgICAgIGNjLm1hbmRhdG9yeSA9IGNjLm1hbmRhdG9yeSB8fCB7fTtcbiAgICAgICAgY2MubWFuZGF0b3J5W29sZG5hbWVfKCcnLCBrZXkpXSA9IHIuZXhhY3Q7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBbJ21pbicsICdtYXgnXS5mb3JFYWNoKGZ1bmN0aW9uKG1peCkge1xuICAgICAgICAgIGlmIChyW21peF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2MubWFuZGF0b3J5ID0gY2MubWFuZGF0b3J5IHx8IHt9O1xuICAgICAgICAgICAgY2MubWFuZGF0b3J5W29sZG5hbWVfKG1peCwga2V5KV0gPSByW21peF07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoYy5hZHZhbmNlZCkge1xuICAgICAgY2Mub3B0aW9uYWwgPSAoY2Mub3B0aW9uYWwgfHwgW10pLmNvbmNhdChjLmFkdmFuY2VkKTtcbiAgICB9XG4gICAgcmV0dXJuIGNjO1xuICB9O1xuXG4gIHZhciBzaGltQ29uc3RyYWludHNfID0gZnVuY3Rpb24oY29uc3RyYWludHMsIGZ1bmMpIHtcbiAgICBjb25zdHJhaW50cyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoY29uc3RyYWludHMpKTtcbiAgICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMuYXVkaW8pIHtcbiAgICAgIGNvbnN0cmFpbnRzLmF1ZGlvID0gY29uc3RyYWludHNUb0Nocm9tZV8oY29uc3RyYWludHMuYXVkaW8pO1xuICAgIH1cbiAgICBpZiAoY29uc3RyYWludHMgJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvID09PSAnb2JqZWN0Jykge1xuICAgICAgLy8gU2hpbSBmYWNpbmdNb2RlIGZvciBtb2JpbGUsIHdoZXJlIGl0IGRlZmF1bHRzIHRvIFwidXNlclwiLlxuICAgICAgdmFyIGZhY2UgPSBjb25zdHJhaW50cy52aWRlby5mYWNpbmdNb2RlO1xuICAgICAgZmFjZSA9IGZhY2UgJiYgKCh0eXBlb2YgZmFjZSA9PT0gJ29iamVjdCcpID8gZmFjZSA6IHtpZGVhbDogZmFjZX0pO1xuXG4gICAgICBpZiAoKGZhY2UgJiYgKGZhY2UuZXhhY3QgPT09ICd1c2VyJyB8fCBmYWNlLmV4YWN0ID09PSAnZW52aXJvbm1lbnQnIHx8XG4gICAgICAgICAgICAgICAgICAgIGZhY2UuaWRlYWwgPT09ICd1c2VyJyB8fCBmYWNlLmlkZWFsID09PSAnZW52aXJvbm1lbnQnKSkgJiZcbiAgICAgICAgICAhKG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0U3VwcG9ydGVkQ29uc3RyYWludHMgJiZcbiAgICAgICAgICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0U3VwcG9ydGVkQ29uc3RyYWludHMoKS5mYWNpbmdNb2RlKSkge1xuICAgICAgICBkZWxldGUgY29uc3RyYWludHMudmlkZW8uZmFjaW5nTW9kZTtcbiAgICAgICAgaWYgKGZhY2UuZXhhY3QgPT09ICdlbnZpcm9ubWVudCcgfHwgZmFjZS5pZGVhbCA9PT0gJ2Vudmlyb25tZW50Jykge1xuICAgICAgICAgIC8vIExvb2sgZm9yIFwiYmFja1wiIGluIGxhYmVsLCBvciB1c2UgbGFzdCBjYW0gKHR5cGljYWxseSBiYWNrIGNhbSkuXG4gICAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpXG4gICAgICAgICAgLnRoZW4oZnVuY3Rpb24oZGV2aWNlcykge1xuICAgICAgICAgICAgZGV2aWNlcyA9IGRldmljZXMuZmlsdGVyKGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGQua2luZCA9PT0gJ3ZpZGVvaW5wdXQnO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIgYmFjayA9IGRldmljZXMuZmluZChmdW5jdGlvbihkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkLmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignYmFjaycpICE9PSAtMTtcbiAgICAgICAgICAgIH0pIHx8IChkZXZpY2VzLmxlbmd0aCAmJiBkZXZpY2VzW2RldmljZXMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgaWYgKGJhY2spIHtcbiAgICAgICAgICAgICAgY29uc3RyYWludHMudmlkZW8uZGV2aWNlSWQgPSBmYWNlLmV4YWN0ID8ge2V4YWN0OiBiYWNrLmRldmljZUlkfSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZGVhbDogYmFjay5kZXZpY2VJZH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdHJhaW50cy52aWRlbyA9IGNvbnN0cmFpbnRzVG9DaHJvbWVfKGNvbnN0cmFpbnRzLnZpZGVvKTtcbiAgICAgICAgICAgIGxvZ2dpbmcoJ2Nocm9tZTogJyArIEpTT04uc3RyaW5naWZ5KGNvbnN0cmFpbnRzKSk7XG4gICAgICAgICAgICByZXR1cm4gZnVuYyhjb25zdHJhaW50cyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0cmFpbnRzLnZpZGVvID0gY29uc3RyYWludHNUb0Nocm9tZV8oY29uc3RyYWludHMudmlkZW8pO1xuICAgIH1cbiAgICBsb2dnaW5nKCdjaHJvbWU6ICcgKyBKU09OLnN0cmluZ2lmeShjb25zdHJhaW50cykpO1xuICAgIHJldHVybiBmdW5jKGNvbnN0cmFpbnRzKTtcbiAgfTtcblxuICB2YXIgc2hpbUVycm9yXyA9IGZ1bmN0aW9uKGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZToge1xuICAgICAgICBQZXJtaXNzaW9uRGVuaWVkRXJyb3I6ICdOb3RBbGxvd2VkRXJyb3InLFxuICAgICAgICBDb25zdHJhaW50Tm90U2F0aXNmaWVkRXJyb3I6ICdPdmVyY29uc3RyYWluZWRFcnJvcidcbiAgICAgIH1bZS5uYW1lXSB8fCBlLm5hbWUsXG4gICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICBjb25zdHJhaW50OiBlLmNvbnN0cmFpbnROYW1lLFxuICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lICsgKHRoaXMubWVzc2FnZSAmJiAnOiAnKSArIHRoaXMubWVzc2FnZTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIHZhciBnZXRVc2VyTWVkaWFfID0gZnVuY3Rpb24oY29uc3RyYWludHMsIG9uU3VjY2Vzcywgb25FcnJvcikge1xuICAgIHNoaW1Db25zdHJhaW50c18oY29uc3RyYWludHMsIGZ1bmN0aW9uKGMpIHtcbiAgICAgIG5hdmlnYXRvci53ZWJraXRHZXRVc2VyTWVkaWEoYywgb25TdWNjZXNzLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIG9uRXJyb3Ioc2hpbUVycm9yXyhlKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBuYXZpZ2F0b3IuZ2V0VXNlck1lZGlhID0gZ2V0VXNlck1lZGlhXztcblxuICAvLyBSZXR1cm5zIHRoZSByZXN1bHQgb2YgZ2V0VXNlck1lZGlhIGFzIGEgUHJvbWlzZS5cbiAgdmFyIGdldFVzZXJNZWRpYVByb21pc2VfID0gZnVuY3Rpb24oY29uc3RyYWludHMpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBuYXZpZ2F0b3IuZ2V0VXNlck1lZGlhKGNvbnN0cmFpbnRzLCByZXNvbHZlLCByZWplY3QpO1xuICAgIH0pO1xuICB9O1xuXG4gIGlmICghbmF2aWdhdG9yLm1lZGlhRGV2aWNlcykge1xuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMgPSB7XG4gICAgICBnZXRVc2VyTWVkaWE6IGdldFVzZXJNZWRpYVByb21pc2VfLFxuICAgICAgZW51bWVyYXRlRGV2aWNlczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7XG4gICAgICAgICAgdmFyIGtpbmRzID0ge2F1ZGlvOiAnYXVkaW9pbnB1dCcsIHZpZGVvOiAndmlkZW9pbnB1dCd9O1xuICAgICAgICAgIHJldHVybiBNZWRpYVN0cmVhbVRyYWNrLmdldFNvdXJjZXMoZnVuY3Rpb24oZGV2aWNlcykge1xuICAgICAgICAgICAgcmVzb2x2ZShkZXZpY2VzLm1hcChmdW5jdGlvbihkZXZpY2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtsYWJlbDogZGV2aWNlLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6IGtpbmRzW2RldmljZS5raW5kXSxcbiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZDogZGV2aWNlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgIGdyb3VwSWQ6ICcnfTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIEEgc2hpbSBmb3IgZ2V0VXNlck1lZGlhIG1ldGhvZCBvbiB0aGUgbWVkaWFEZXZpY2VzIG9iamVjdC5cbiAgLy8gVE9ETyhLYXB0ZW5KYW5zc29uKSByZW1vdmUgb25jZSBpbXBsZW1lbnRlZCBpbiBDaHJvbWUgc3RhYmxlLlxuICBpZiAoIW5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKSB7XG4gICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEgPSBmdW5jdGlvbihjb25zdHJhaW50cykge1xuICAgICAgcmV0dXJuIGdldFVzZXJNZWRpYVByb21pc2VfKGNvbnN0cmFpbnRzKTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIEV2ZW4gdGhvdWdoIENocm9tZSA0NSBoYXMgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcyBhbmQgYSBnZXRVc2VyTWVkaWFcbiAgICAvLyBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgUHJvbWlzZSwgaXQgZG9lcyBub3QgYWNjZXB0IHNwZWMtc3R5bGVcbiAgICAvLyBjb25zdHJhaW50cy5cbiAgICB2YXIgb3JpZ0dldFVzZXJNZWRpYSA9IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhLlxuICAgICAgICBiaW5kKG5hdmlnYXRvci5tZWRpYURldmljZXMpO1xuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhID0gZnVuY3Rpb24oY3MpIHtcbiAgICAgIHJldHVybiBzaGltQ29uc3RyYWludHNfKGNzLCBmdW5jdGlvbihjKSB7XG4gICAgICAgIHJldHVybiBvcmlnR2V0VXNlck1lZGlhKGMpLnRoZW4oZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICAgICAgaWYgKGMuYXVkaW8gJiYgIXN0cmVhbS5nZXRBdWRpb1RyYWNrcygpLmxlbmd0aCB8fFxuICAgICAgICAgICAgICBjLnZpZGVvICYmICFzdHJlYW0uZ2V0VmlkZW9UcmFja3MoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKGZ1bmN0aW9uKHRyYWNrKSB7XG4gICAgICAgICAgICAgIHRyYWNrLnN0b3AoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignJywgJ05vdEZvdW5kRXJyb3InKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHN0cmVhbTtcbiAgICAgICAgfSwgZnVuY3Rpb24oZSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChzaGltRXJyb3JfKGUpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgLy8gRHVtbXkgZGV2aWNlY2hhbmdlIGV2ZW50IG1ldGhvZHMuXG4gIC8vIFRPRE8oS2FwdGVuSmFuc3NvbikgcmVtb3ZlIG9uY2UgaW1wbGVtZW50ZWQgaW4gQ2hyb21lIHN0YWJsZS5cbiAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmFkZEV2ZW50TGlzdGVuZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24oKSB7XG4gICAgICBsb2dnaW5nKCdEdW1teSBtZWRpYURldmljZXMuYWRkRXZlbnRMaXN0ZW5lciBjYWxsZWQuJyk7XG4gICAgfTtcbiAgfVxuICBpZiAodHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMucmVtb3ZlRXZlbnRMaXN0ZW5lciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgIGxvZ2dpbmcoJ0R1bW15IG1lZGlhRGV2aWNlcy5yZW1vdmVFdmVudExpc3RlbmVyIGNhbGxlZC4nKTtcbiAgICB9O1xuICB9XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3dlYnJ0Yy1hZGFwdGVyL3NyYy9qcy9jaHJvbWUvZ2V0dXNlcm1lZGlhLmpzXG4vLyBtb2R1bGUgaWQgPSA0NjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 463 */
/***/ function(module, exports, __webpack_require__) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar SDPUtils = __webpack_require__(452);\nvar browserDetails = __webpack_require__(460).browserDetails;\n\nvar edgeShim = {\n  shimPeerConnection: function() {\n    if (window.RTCIceGatherer) {\n      // ORTC defines an RTCIceCandidate object but no constructor.\n      // Not implemented in Edge.\n      if (!window.RTCIceCandidate) {\n        window.RTCIceCandidate = function(args) {\n          return args;\n        };\n      }\n      // ORTC does not have a session description object but\n      // other browsers (i.e. Chrome) that will support both PC and ORTC\n      // in the future might have this defined already.\n      if (!window.RTCSessionDescription) {\n        window.RTCSessionDescription = function(args) {\n          return args;\n        };\n      }\n      // this adds an additional event listener to MediaStrackTrack that signals\n      // when a tracks enabled property was changed.\n      var origMSTEnabled = Object.getOwnPropertyDescriptor(\n          MediaStreamTrack.prototype, 'enabled');\n      Object.defineProperty(MediaStreamTrack.prototype, 'enabled', {\n        set: function(value) {\n          origMSTEnabled.set.call(this, value);\n          var ev = new Event('enabled');\n          ev.enabled = value;\n          this.dispatchEvent(ev);\n        }\n      });\n    }\n\n    window.RTCPeerConnection = function(config) {\n      var self = this;\n\n      var _eventTarget = document.createDocumentFragment();\n      ['addEventListener', 'removeEventListener', 'dispatchEvent']\n          .forEach(function(method) {\n            self[method] = _eventTarget[method].bind(_eventTarget);\n          });\n\n      this.onicecandidate = null;\n      this.onaddstream = null;\n      this.ontrack = null;\n      this.onremovestream = null;\n      this.onsignalingstatechange = null;\n      this.oniceconnectionstatechange = null;\n      this.onnegotiationneeded = null;\n      this.ondatachannel = null;\n\n      this.localStreams = [];\n      this.remoteStreams = [];\n      this.getLocalStreams = function() {\n        return self.localStreams;\n      };\n      this.getRemoteStreams = function() {\n        return self.remoteStreams;\n      };\n\n      this.localDescription = new RTCSessionDescription({\n        type: '',\n        sdp: ''\n      });\n      this.remoteDescription = new RTCSessionDescription({\n        type: '',\n        sdp: ''\n      });\n      this.signalingState = 'stable';\n      this.iceConnectionState = 'new';\n      this.iceGatheringState = 'new';\n\n      this.iceOptions = {\n        gatherPolicy: 'all',\n        iceServers: []\n      };\n      if (config && config.iceTransportPolicy) {\n        switch (config.iceTransportPolicy) {\n          case 'all':\n          case 'relay':\n            this.iceOptions.gatherPolicy = config.iceTransportPolicy;\n            break;\n          case 'none':\n            // FIXME: remove once implementation and spec have added this.\n            throw new TypeError('iceTransportPolicy \"none\" not supported');\n          default:\n            // don't set iceTransportPolicy.\n            break;\n        }\n      }\n      this.usingBundle = config && config.bundlePolicy === 'max-bundle';\n\n      if (config && config.iceServers) {\n        // Edge does not like\n        // 1) stun:\n        // 2) turn: that does not have all of turn:host:port?transport=udp\n        // 3) turn: with ipv6 addresses\n        var iceServers = JSON.parse(JSON.stringify(config.iceServers));\n        this.iceOptions.iceServers = iceServers.filter(function(server) {\n          if (server && server.urls) {\n            var urls = server.urls;\n            if (typeof urls === 'string') {\n              urls = [urls];\n            }\n            urls = urls.filter(function(url) {\n              return (url.indexOf('turn:') === 0 &&\n                  url.indexOf('transport=udp') !== -1 &&\n                  url.indexOf('turn:[') === -1) ||\n                  (url.indexOf('stun:') === 0 &&\n                    browserDetails.version >= 14393);\n            })[0];\n            return !!urls;\n          }\n          return false;\n        });\n      }\n      this._config = config;\n\n      // per-track iceGathers, iceTransports, dtlsTransports, rtpSenders, ...\n      // everything that is needed to describe a SDP m-line.\n      this.transceivers = [];\n\n      // since the iceGatherer is currently created in createOffer but we\n      // must not emit candidates until after setLocalDescription we buffer\n      // them in this array.\n      this._localIceCandidatesBuffer = [];\n    };\n\n    window.RTCPeerConnection.prototype._emitBufferedCandidates = function() {\n      var self = this;\n      var sections = SDPUtils.splitSections(self.localDescription.sdp);\n      // FIXME: need to apply ice candidates in a way which is async but\n      // in-order\n      this._localIceCandidatesBuffer.forEach(function(event) {\n        var end = !event.candidate || Object.keys(event.candidate).length === 0;\n        if (end) {\n          for (var j = 1; j < sections.length; j++) {\n            if (sections[j].indexOf('\\r\\na=end-of-candidates\\r\\n') === -1) {\n              sections[j] += 'a=end-of-candidates\\r\\n';\n            }\n          }\n        } else if (event.candidate.candidate.indexOf('typ endOfCandidates')\n            === -1) {\n          sections[event.candidate.sdpMLineIndex + 1] +=\n              'a=' + event.candidate.candidate + '\\r\\n';\n        }\n        self.localDescription.sdp = sections.join('');\n        self.dispatchEvent(event);\n        if (self.onicecandidate !== null) {\n          self.onicecandidate(event);\n        }\n        if (!event.candidate && self.iceGatheringState !== 'complete') {\n          var complete = self.transceivers.every(function(transceiver) {\n            return transceiver.iceGatherer &&\n                transceiver.iceGatherer.state === 'completed';\n          });\n          if (complete) {\n            self.iceGatheringState = 'complete';\n          }\n        }\n      });\n      this._localIceCandidatesBuffer = [];\n    };\n\n    window.RTCPeerConnection.prototype.getConfiguration = function() {\n      return this._config;\n    };\n\n    window.RTCPeerConnection.prototype.addStream = function(stream) {\n      // Clone is necessary for local demos mostly, attaching directly\n      // to two different senders does not work (build 10547).\n      var clonedStream = stream.clone();\n      stream.getTracks().forEach(function(track, idx) {\n        var clonedTrack = clonedStream.getTracks()[idx];\n        track.addEventListener('enabled', function(event) {\n          clonedTrack.enabled = event.enabled;\n        });\n      });\n      this.localStreams.push(clonedStream);\n      this._maybeFireNegotiationNeeded();\n    };\n\n    window.RTCPeerConnection.prototype.removeStream = function(stream) {\n      var idx = this.localStreams.indexOf(stream);\n      if (idx > -1) {\n        this.localStreams.splice(idx, 1);\n        this._maybeFireNegotiationNeeded();\n      }\n    };\n\n    window.RTCPeerConnection.prototype.getSenders = function() {\n      return this.transceivers.filter(function(transceiver) {\n        return !!transceiver.rtpSender;\n      })\n      .map(function(transceiver) {\n        return transceiver.rtpSender;\n      });\n    };\n\n    window.RTCPeerConnection.prototype.getReceivers = function() {\n      return this.transceivers.filter(function(transceiver) {\n        return !!transceiver.rtpReceiver;\n      })\n      .map(function(transceiver) {\n        return transceiver.rtpReceiver;\n      });\n    };\n\n    // Determines the intersection of local and remote capabilities.\n    window.RTCPeerConnection.prototype._getCommonCapabilities =\n        function(localCapabilities, remoteCapabilities) {\n          var commonCapabilities = {\n            codecs: [],\n            headerExtensions: [],\n            fecMechanisms: []\n          };\n          localCapabilities.codecs.forEach(function(lCodec) {\n            for (var i = 0; i < remoteCapabilities.codecs.length; i++) {\n              var rCodec = remoteCapabilities.codecs[i];\n              if (lCodec.name.toLowerCase() === rCodec.name.toLowerCase() &&\n                  lCodec.clockRate === rCodec.clockRate) {\n                // number of channels is the highest common number of channels\n                rCodec.numChannels = Math.min(lCodec.numChannels,\n                    rCodec.numChannels);\n                // push rCodec so we reply with offerer payload type\n                commonCapabilities.codecs.push(rCodec);\n\n                // determine common feedback mechanisms\n                rCodec.rtcpFeedback = rCodec.rtcpFeedback.filter(function(fb) {\n                  for (var j = 0; j < lCodec.rtcpFeedback.length; j++) {\n                    if (lCodec.rtcpFeedback[j].type === fb.type &&\n                        lCodec.rtcpFeedback[j].parameter === fb.parameter) {\n                      return true;\n                    }\n                  }\n                  return false;\n                });\n                // FIXME: also need to determine .parameters\n                //  see https://github.com/openpeer/ortc/issues/569\n                break;\n              }\n            }\n          });\n\n          localCapabilities.headerExtensions\n              .forEach(function(lHeaderExtension) {\n                for (var i = 0; i < remoteCapabilities.headerExtensions.length;\n                     i++) {\n                  var rHeaderExtension = remoteCapabilities.headerExtensions[i];\n                  if (lHeaderExtension.uri === rHeaderExtension.uri) {\n                    commonCapabilities.headerExtensions.push(rHeaderExtension);\n                    break;\n                  }\n                }\n              });\n\n          // FIXME: fecMechanisms\n          return commonCapabilities;\n        };\n\n    // Create ICE gatherer, ICE transport and DTLS transport.\n    window.RTCPeerConnection.prototype._createIceAndDtlsTransports =\n        function(mid, sdpMLineIndex) {\n          var self = this;\n          var iceGatherer = new RTCIceGatherer(self.iceOptions);\n          var iceTransport = new RTCIceTransport(iceGatherer);\n          iceGatherer.onlocalcandidate = function(evt) {\n            var event = new Event('icecandidate');\n            event.candidate = {sdpMid: mid, sdpMLineIndex: sdpMLineIndex};\n\n            var cand = evt.candidate;\n            var end = !cand || Object.keys(cand).length === 0;\n            // Edge emits an empty object for RTCIceCandidateComplete‥\n            if (end) {\n              // polyfill since RTCIceGatherer.state is not implemented in\n              // Edge 10547 yet.\n              if (iceGatherer.state === undefined) {\n                iceGatherer.state = 'completed';\n              }\n\n              // Emit a candidate with type endOfCandidates to make the samples\n              // work. Edge requires addIceCandidate with this empty candidate\n              // to start checking. The real solution is to signal\n              // end-of-candidates to the other side when getting the null\n              // candidate but some apps (like the samples) don't do that.\n              event.candidate.candidate =\n                  'candidate:1 1 udp 1 0.0.0.0 9 typ endOfCandidates';\n            } else {\n              // RTCIceCandidate doesn't have a component, needs to be added\n              cand.component = iceTransport.component === 'RTCP' ? 2 : 1;\n              event.candidate.candidate = SDPUtils.writeCandidate(cand);\n            }\n\n            // update local description.\n            var sections = SDPUtils.splitSections(self.localDescription.sdp);\n            if (event.candidate.candidate.indexOf('typ endOfCandidates')\n                === -1) {\n              sections[event.candidate.sdpMLineIndex + 1] +=\n                  'a=' + event.candidate.candidate + '\\r\\n';\n            } else {\n              sections[event.candidate.sdpMLineIndex + 1] +=\n                  'a=end-of-candidates\\r\\n';\n            }\n            self.localDescription.sdp = sections.join('');\n\n            var complete = self.transceivers.every(function(transceiver) {\n              return transceiver.iceGatherer &&\n                  transceiver.iceGatherer.state === 'completed';\n            });\n\n            // Emit candidate if localDescription is set.\n            // Also emits null candidate when all gatherers are complete.\n            switch (self.iceGatheringState) {\n              case 'new':\n                self._localIceCandidatesBuffer.push(event);\n                if (end && complete) {\n                  self._localIceCandidatesBuffer.push(\n                      new Event('icecandidate'));\n                }\n                break;\n              case 'gathering':\n                self._emitBufferedCandidates();\n                self.dispatchEvent(event);\n                if (self.onicecandidate !== null) {\n                  self.onicecandidate(event);\n                }\n                if (complete) {\n                  self.dispatchEvent(new Event('icecandidate'));\n                  if (self.onicecandidate !== null) {\n                    self.onicecandidate(new Event('icecandidate'));\n                  }\n                  self.iceGatheringState = 'complete';\n                }\n                break;\n              case 'complete':\n                // should not happen... currently!\n                break;\n              default: // no-op.\n                break;\n            }\n          };\n          iceTransport.onicestatechange = function() {\n            self._updateConnectionState();\n          };\n\n          var dtlsTransport = new RTCDtlsTransport(iceTransport);\n          dtlsTransport.ondtlsstatechange = function() {\n            self._updateConnectionState();\n          };\n          dtlsTransport.onerror = function() {\n            // onerror does not set state to failed by itself.\n            dtlsTransport.state = 'failed';\n            self._updateConnectionState();\n          };\n\n          return {\n            iceGatherer: iceGatherer,\n            iceTransport: iceTransport,\n            dtlsTransport: dtlsTransport\n          };\n        };\n\n    // Start the RTP Sender and Receiver for a transceiver.\n    window.RTCPeerConnection.prototype._transceive = function(transceiver,\n        send, recv) {\n      var params = this._getCommonCapabilities(transceiver.localCapabilities,\n          transceiver.remoteCapabilities);\n      if (send && transceiver.rtpSender) {\n        params.encodings = transceiver.sendEncodingParameters;\n        params.rtcp = {\n          cname: SDPUtils.localCName\n        };\n        if (transceiver.recvEncodingParameters.length) {\n          params.rtcp.ssrc = transceiver.recvEncodingParameters[0].ssrc;\n        }\n        transceiver.rtpSender.send(params);\n      }\n      if (recv && transceiver.rtpReceiver) {\n        // remove RTX field in Edge 14942\n        if (transceiver.kind === 'video'\n            && transceiver.recvEncodingParameters) {\n          transceiver.recvEncodingParameters.forEach(function(p) {\n            delete p.rtx;\n          });\n        }\n        params.encodings = transceiver.recvEncodingParameters;\n        params.rtcp = {\n          cname: transceiver.cname\n        };\n        if (transceiver.sendEncodingParameters.length) {\n          params.rtcp.ssrc = transceiver.sendEncodingParameters[0].ssrc;\n        }\n        transceiver.rtpReceiver.receive(params);\n      }\n    };\n\n    window.RTCPeerConnection.prototype.setLocalDescription =\n        function(description) {\n          var self = this;\n          var sections;\n          var sessionpart;\n          if (description.type === 'offer') {\n            // FIXME: What was the purpose of this empty if statement?\n            // if (!this._pendingOffer) {\n            // } else {\n            if (this._pendingOffer) {\n              // VERY limited support for SDP munging. Limited to:\n              // * changing the order of codecs\n              sections = SDPUtils.splitSections(description.sdp);\n              sessionpart = sections.shift();\n              sections.forEach(function(mediaSection, sdpMLineIndex) {\n                var caps = SDPUtils.parseRtpParameters(mediaSection);\n                self._pendingOffer[sdpMLineIndex].localCapabilities = caps;\n              });\n              this.transceivers = this._pendingOffer;\n              delete this._pendingOffer;\n            }\n          } else if (description.type === 'answer') {\n            sections = SDPUtils.splitSections(self.remoteDescription.sdp);\n            sessionpart = sections.shift();\n            var isIceLite = SDPUtils.matchPrefix(sessionpart,\n                'a=ice-lite').length > 0;\n            sections.forEach(function(mediaSection, sdpMLineIndex) {\n              var transceiver = self.transceivers[sdpMLineIndex];\n              var iceGatherer = transceiver.iceGatherer;\n              var iceTransport = transceiver.iceTransport;\n              var dtlsTransport = transceiver.dtlsTransport;\n              var localCapabilities = transceiver.localCapabilities;\n              var remoteCapabilities = transceiver.remoteCapabilities;\n\n              var rejected = mediaSection.split('\\n', 1)[0]\n                  .split(' ', 2)[1] === '0';\n\n              if (!rejected && !transceiver.isDatachannel) {\n                var remoteIceParameters = SDPUtils.getIceParameters(\n                    mediaSection, sessionpart);\n                if (isIceLite) {\n                  var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:')\n                  .map(function(cand) {\n                    return SDPUtils.parseCandidate(cand);\n                  })\n                  .filter(function(cand) {\n                    return cand.component === '1';\n                  });\n                  // ice-lite only includes host candidates in the SDP so we can\n                  // use setRemoteCandidates (which implies an\n                  // RTCIceCandidateComplete)\n                  if (cands.length) {\n                    iceTransport.setRemoteCandidates(cands);\n                  }\n                }\n                var remoteDtlsParameters = SDPUtils.getDtlsParameters(\n                    mediaSection, sessionpart);\n                if (isIceLite) {\n                  remoteDtlsParameters.role = 'server';\n                }\n\n                if (!self.usingBundle || sdpMLineIndex === 0) {\n                  iceTransport.start(iceGatherer, remoteIceParameters,\n                      isIceLite ? 'controlling' : 'controlled');\n                  dtlsTransport.start(remoteDtlsParameters);\n                }\n\n                // Calculate intersection of capabilities.\n                var params = self._getCommonCapabilities(localCapabilities,\n                    remoteCapabilities);\n\n                // Start the RTCRtpSender. The RTCRtpReceiver for this\n                // transceiver has already been started in setRemoteDescription.\n                self._transceive(transceiver,\n                    params.codecs.length > 0,\n                    false);\n              }\n            });\n          }\n\n          this.localDescription = {\n            type: description.type,\n            sdp: description.sdp\n          };\n          switch (description.type) {\n            case 'offer':\n              this._updateSignalingState('have-local-offer');\n              break;\n            case 'answer':\n              this._updateSignalingState('stable');\n              break;\n            default:\n              throw new TypeError('unsupported type \"' + description.type +\n                  '\"');\n          }\n\n          // If a success callback was provided, emit ICE candidates after it\n          // has been executed. Otherwise, emit callback after the Promise is\n          // resolved.\n          var hasCallback = arguments.length > 1 &&\n            typeof arguments[1] === 'function';\n          if (hasCallback) {\n            var cb = arguments[1];\n            window.setTimeout(function() {\n              cb();\n              if (self.iceGatheringState === 'new') {\n                self.iceGatheringState = 'gathering';\n              }\n              self._emitBufferedCandidates();\n            }, 0);\n          }\n          var p = Promise.resolve();\n          p.then(function() {\n            if (!hasCallback) {\n              if (self.iceGatheringState === 'new') {\n                self.iceGatheringState = 'gathering';\n              }\n              // Usually candidates will be emitted earlier.\n              window.setTimeout(self._emitBufferedCandidates.bind(self), 500);\n            }\n          });\n          return p;\n        };\n\n    window.RTCPeerConnection.prototype.setRemoteDescription =\n        function(description) {\n          var self = this;\n          var stream = new MediaStream();\n          var receiverList = [];\n          var sections = SDPUtils.splitSections(description.sdp);\n          var sessionpart = sections.shift();\n          var isIceLite = SDPUtils.matchPrefix(sessionpart,\n              'a=ice-lite').length > 0;\n          this.usingBundle = SDPUtils.matchPrefix(sessionpart,\n              'a=group:BUNDLE ').length > 0;\n          sections.forEach(function(mediaSection, sdpMLineIndex) {\n            var lines = SDPUtils.splitLines(mediaSection);\n            var mline = lines[0].substr(2).split(' ');\n            var kind = mline[0];\n            var rejected = mline[1] === '0';\n            var direction = SDPUtils.getDirection(mediaSection, sessionpart);\n\n            var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:');\n            if (mid.length) {\n              mid = mid[0].substr(6);\n            } else {\n              mid = SDPUtils.generateIdentifier();\n            }\n\n            // Reject datachannels which are not implemented yet.\n            if (kind === 'application' && mline[2] === 'DTLS/SCTP') {\n              self.transceivers[sdpMLineIndex] = {\n                mid: mid,\n                isDatachannel: true\n              };\n              return;\n            }\n\n            var transceiver;\n            var iceGatherer;\n            var iceTransport;\n            var dtlsTransport;\n            var rtpSender;\n            var rtpReceiver;\n            var sendEncodingParameters;\n            var recvEncodingParameters;\n            var localCapabilities;\n\n            var track;\n            // FIXME: ensure the mediaSection has rtcp-mux set.\n            var remoteCapabilities = SDPUtils.parseRtpParameters(mediaSection);\n            var remoteIceParameters;\n            var remoteDtlsParameters;\n            if (!rejected) {\n              remoteIceParameters = SDPUtils.getIceParameters(mediaSection,\n                  sessionpart);\n              remoteDtlsParameters = SDPUtils.getDtlsParameters(mediaSection,\n                  sessionpart);\n              remoteDtlsParameters.role = 'client';\n            }\n            recvEncodingParameters =\n                SDPUtils.parseRtpEncodingParameters(mediaSection);\n\n            var cname;\n            // Gets the first SSRC. Note that with RTX there might be multiple\n            // SSRCs.\n            var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n                .map(function(line) {\n                  return SDPUtils.parseSsrcMedia(line);\n                })\n                .filter(function(obj) {\n                  return obj.attribute === 'cname';\n                })[0];\n            if (remoteSsrc) {\n              cname = remoteSsrc.value;\n            }\n\n            var isComplete = SDPUtils.matchPrefix(mediaSection,\n                'a=end-of-candidates', sessionpart).length > 0;\n            var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:')\n                .map(function(cand) {\n                  return SDPUtils.parseCandidate(cand);\n                })\n                .filter(function(cand) {\n                  return cand.component === '1';\n                });\n            if (description.type === 'offer' && !rejected) {\n              var transports = self.usingBundle && sdpMLineIndex > 0 ? {\n                iceGatherer: self.transceivers[0].iceGatherer,\n                iceTransport: self.transceivers[0].iceTransport,\n                dtlsTransport: self.transceivers[0].dtlsTransport\n              } : self._createIceAndDtlsTransports(mid, sdpMLineIndex);\n\n              if (isComplete) {\n                transports.iceTransport.setRemoteCandidates(cands);\n              }\n\n              localCapabilities = RTCRtpReceiver.getCapabilities(kind);\n\n              // filter RTX until additional stuff needed for RTX is implemented\n              // in adapter.js\n              localCapabilities.codecs = localCapabilities.codecs.filter(\n                  function(codec) {\n                    return codec.name !== 'rtx';\n                  });\n\n              sendEncodingParameters = [{\n                ssrc: (2 * sdpMLineIndex + 2) * 1001\n              }];\n\n              rtpReceiver = new RTCRtpReceiver(transports.dtlsTransport, kind);\n\n              track = rtpReceiver.track;\n              receiverList.push([track, rtpReceiver]);\n              // FIXME: not correct when there are multiple streams but that is\n              // not currently supported in this shim.\n              stream.addTrack(track);\n\n              // FIXME: look at direction.\n              if (self.localStreams.length > 0 &&\n                  self.localStreams[0].getTracks().length >= sdpMLineIndex) {\n                var localTrack;\n                if (kind === 'audio') {\n                  localTrack = self.localStreams[0].getAudioTracks()[0];\n                } else if (kind === 'video') {\n                  localTrack = self.localStreams[0].getVideoTracks()[0];\n                }\n                if (localTrack) {\n                  rtpSender = new RTCRtpSender(localTrack,\n                      transports.dtlsTransport);\n                }\n              }\n\n              self.transceivers[sdpMLineIndex] = {\n                iceGatherer: transports.iceGatherer,\n                iceTransport: transports.iceTransport,\n                dtlsTransport: transports.dtlsTransport,\n                localCapabilities: localCapabilities,\n                remoteCapabilities: remoteCapabilities,\n                rtpSender: rtpSender,\n                rtpReceiver: rtpReceiver,\n                kind: kind,\n                mid: mid,\n                cname: cname,\n                sendEncodingParameters: sendEncodingParameters,\n                recvEncodingParameters: recvEncodingParameters\n              };\n              // Start the RTCRtpReceiver now. The RTPSender is started in\n              // setLocalDescription.\n              self._transceive(self.transceivers[sdpMLineIndex],\n                  false,\n                  direction === 'sendrecv' || direction === 'sendonly');\n            } else if (description.type === 'answer' && !rejected) {\n              transceiver = self.transceivers[sdpMLineIndex];\n              iceGatherer = transceiver.iceGatherer;\n              iceTransport = transceiver.iceTransport;\n              dtlsTransport = transceiver.dtlsTransport;\n              rtpSender = transceiver.rtpSender;\n              rtpReceiver = transceiver.rtpReceiver;\n              sendEncodingParameters = transceiver.sendEncodingParameters;\n              localCapabilities = transceiver.localCapabilities;\n\n              self.transceivers[sdpMLineIndex].recvEncodingParameters =\n                  recvEncodingParameters;\n              self.transceivers[sdpMLineIndex].remoteCapabilities =\n                  remoteCapabilities;\n              self.transceivers[sdpMLineIndex].cname = cname;\n\n              if ((isIceLite || isComplete) && cands.length) {\n                iceTransport.setRemoteCandidates(cands);\n              }\n              if (!self.usingBundle || sdpMLineIndex === 0) {\n                iceTransport.start(iceGatherer, remoteIceParameters,\n                    'controlling');\n                dtlsTransport.start(remoteDtlsParameters);\n              }\n\n              self._transceive(transceiver,\n                  direction === 'sendrecv' || direction === 'recvonly',\n                  direction === 'sendrecv' || direction === 'sendonly');\n\n              if (rtpReceiver &&\n                  (direction === 'sendrecv' || direction === 'sendonly')) {\n                track = rtpReceiver.track;\n                receiverList.push([track, rtpReceiver]);\n                stream.addTrack(track);\n              } else {\n                // FIXME: actually the receiver should be created later.\n                delete transceiver.rtpReceiver;\n              }\n            }\n          });\n\n          this.remoteDescription = {\n            type: description.type,\n            sdp: description.sdp\n          };\n          switch (description.type) {\n            case 'offer':\n              this._updateSignalingState('have-remote-offer');\n              break;\n            case 'answer':\n              this._updateSignalingState('stable');\n              break;\n            default:\n              throw new TypeError('unsupported type \"' + description.type +\n                  '\"');\n          }\n          if (stream.getTracks().length) {\n            self.remoteStreams.push(stream);\n            window.setTimeout(function() {\n              var event = new Event('addstream');\n              event.stream = stream;\n              self.dispatchEvent(event);\n              if (self.onaddstream !== null) {\n                window.setTimeout(function() {\n                  self.onaddstream(event);\n                }, 0);\n              }\n\n              receiverList.forEach(function(item) {\n                var track = item[0];\n                var receiver = item[1];\n                var trackEvent = new Event('track');\n                trackEvent.track = track;\n                trackEvent.receiver = receiver;\n                trackEvent.streams = [stream];\n                self.dispatchEvent(event);\n                if (self.ontrack !== null) {\n                  window.setTimeout(function() {\n                    self.ontrack(trackEvent);\n                  }, 0);\n                }\n              });\n            }, 0);\n          }\n          if (arguments.length > 1 && typeof arguments[1] === 'function') {\n            window.setTimeout(arguments[1], 0);\n          }\n          return Promise.resolve();\n        };\n\n    window.RTCPeerConnection.prototype.close = function() {\n      this.transceivers.forEach(function(transceiver) {\n        /* not yet\n        if (transceiver.iceGatherer) {\n          transceiver.iceGatherer.close();\n        }\n        */\n        if (transceiver.iceTransport) {\n          transceiver.iceTransport.stop();\n        }\n        if (transceiver.dtlsTransport) {\n          transceiver.dtlsTransport.stop();\n        }\n        if (transceiver.rtpSender) {\n          transceiver.rtpSender.stop();\n        }\n        if (transceiver.rtpReceiver) {\n          transceiver.rtpReceiver.stop();\n        }\n      });\n      // FIXME: clean up tracks, local streams, remote streams, etc\n      this._updateSignalingState('closed');\n    };\n\n    // Update the signaling state.\n    window.RTCPeerConnection.prototype._updateSignalingState =\n        function(newState) {\n          this.signalingState = newState;\n          var event = new Event('signalingstatechange');\n          this.dispatchEvent(event);\n          if (this.onsignalingstatechange !== null) {\n            this.onsignalingstatechange(event);\n          }\n        };\n\n    // Determine whether to fire the negotiationneeded event.\n    window.RTCPeerConnection.prototype._maybeFireNegotiationNeeded =\n        function() {\n          // Fire away (for now).\n          var event = new Event('negotiationneeded');\n          this.dispatchEvent(event);\n          if (this.onnegotiationneeded !== null) {\n            this.onnegotiationneeded(event);\n          }\n        };\n\n    // Update the connection state.\n    window.RTCPeerConnection.prototype._updateConnectionState = function() {\n      var self = this;\n      var newState;\n      var states = {\n        'new': 0,\n        closed: 0,\n        connecting: 0,\n        checking: 0,\n        connected: 0,\n        completed: 0,\n        failed: 0\n      };\n      this.transceivers.forEach(function(transceiver) {\n        states[transceiver.iceTransport.state]++;\n        states[transceiver.dtlsTransport.state]++;\n      });\n      // ICETransport.completed and connected are the same for this purpose.\n      states.connected += states.completed;\n\n      newState = 'new';\n      if (states.failed > 0) {\n        newState = 'failed';\n      } else if (states.connecting > 0 || states.checking > 0) {\n        newState = 'connecting';\n      } else if (states.disconnected > 0) {\n        newState = 'disconnected';\n      } else if (states.new > 0) {\n        newState = 'new';\n      } else if (states.connected > 0 || states.completed > 0) {\n        newState = 'connected';\n      }\n\n      if (newState !== self.iceConnectionState) {\n        self.iceConnectionState = newState;\n        var event = new Event('iceconnectionstatechange');\n        this.dispatchEvent(event);\n        if (this.oniceconnectionstatechange !== null) {\n          this.oniceconnectionstatechange(event);\n        }\n      }\n    };\n\n    window.RTCPeerConnection.prototype.createOffer = function() {\n      var self = this;\n      if (this._pendingOffer) {\n        throw new Error('createOffer called while there is a pending offer.');\n      }\n      var offerOptions;\n      if (arguments.length === 1 && typeof arguments[0] !== 'function') {\n        offerOptions = arguments[0];\n      } else if (arguments.length === 3) {\n        offerOptions = arguments[2];\n      }\n\n      var tracks = [];\n      var numAudioTracks = 0;\n      var numVideoTracks = 0;\n      // Default to sendrecv.\n      if (this.localStreams.length) {\n        numAudioTracks = this.localStreams[0].getAudioTracks().length;\n        numVideoTracks = this.localStreams[0].getVideoTracks().length;\n      }\n      // Determine number of audio and video tracks we need to send/recv.\n      if (offerOptions) {\n        // Reject Chrome legacy constraints.\n        if (offerOptions.mandatory || offerOptions.optional) {\n          throw new TypeError(\n              'Legacy mandatory/optional constraints not supported.');\n        }\n        if (offerOptions.offerToReceiveAudio !== undefined) {\n          numAudioTracks = offerOptions.offerToReceiveAudio;\n        }\n        if (offerOptions.offerToReceiveVideo !== undefined) {\n          numVideoTracks = offerOptions.offerToReceiveVideo;\n        }\n      }\n      if (this.localStreams.length) {\n        // Push local streams.\n        this.localStreams[0].getTracks().forEach(function(track) {\n          tracks.push({\n            kind: track.kind,\n            track: track,\n            wantReceive: track.kind === 'audio' ?\n                numAudioTracks > 0 : numVideoTracks > 0\n          });\n          if (track.kind === 'audio') {\n            numAudioTracks--;\n          } else if (track.kind === 'video') {\n            numVideoTracks--;\n          }\n        });\n      }\n      // Create M-lines for recvonly streams.\n      while (numAudioTracks > 0 || numVideoTracks > 0) {\n        if (numAudioTracks > 0) {\n          tracks.push({\n            kind: 'audio',\n            wantReceive: true\n          });\n          numAudioTracks--;\n        }\n        if (numVideoTracks > 0) {\n          tracks.push({\n            kind: 'video',\n            wantReceive: true\n          });\n          numVideoTracks--;\n        }\n      }\n\n      var sdp = SDPUtils.writeSessionBoilerplate();\n      var transceivers = [];\n      tracks.forEach(function(mline, sdpMLineIndex) {\n        // For each track, create an ice gatherer, ice transport,\n        // dtls transport, potentially rtpsender and rtpreceiver.\n        var track = mline.track;\n        var kind = mline.kind;\n        var mid = SDPUtils.generateIdentifier();\n\n        var transports = self.usingBundle && sdpMLineIndex > 0 ? {\n          iceGatherer: transceivers[0].iceGatherer,\n          iceTransport: transceivers[0].iceTransport,\n          dtlsTransport: transceivers[0].dtlsTransport\n        } : self._createIceAndDtlsTransports(mid, sdpMLineIndex);\n\n        var localCapabilities = RTCRtpSender.getCapabilities(kind);\n        // filter RTX until additional stuff needed for RTX is implemented\n        // in adapter.js\n        localCapabilities.codecs = localCapabilities.codecs.filter(\n            function(codec) {\n              return codec.name !== 'rtx';\n            });\n        localCapabilities.codecs.forEach(function(codec) {\n          // work around https://bugs.chromium.org/p/webrtc/issues/detail?id=6552\n          // by adding level-asymmetry-allowed=1\n          if (codec.name === 'H264' &&\n              codec.parameters['level-asymmetry-allowed'] === undefined) {\n            codec.parameters['level-asymmetry-allowed'] = '1';\n          }\n        });\n\n        var rtpSender;\n        var rtpReceiver;\n\n        // generate an ssrc now, to be used later in rtpSender.send\n        var sendEncodingParameters = [{\n          ssrc: (2 * sdpMLineIndex + 1) * 1001\n        }];\n        if (track) {\n          rtpSender = new RTCRtpSender(track, transports.dtlsTransport);\n        }\n\n        if (mline.wantReceive) {\n          rtpReceiver = new RTCRtpReceiver(transports.dtlsTransport, kind);\n        }\n\n        transceivers[sdpMLineIndex] = {\n          iceGatherer: transports.iceGatherer,\n          iceTransport: transports.iceTransport,\n          dtlsTransport: transports.dtlsTransport,\n          localCapabilities: localCapabilities,\n          remoteCapabilities: null,\n          rtpSender: rtpSender,\n          rtpReceiver: rtpReceiver,\n          kind: kind,\n          mid: mid,\n          sendEncodingParameters: sendEncodingParameters,\n          recvEncodingParameters: null\n        };\n      });\n      if (this.usingBundle) {\n        sdp += 'a=group:BUNDLE ' + transceivers.map(function(t) {\n          return t.mid;\n        }).join(' ') + '\\r\\n';\n      }\n      tracks.forEach(function(mline, sdpMLineIndex) {\n        var transceiver = transceivers[sdpMLineIndex];\n        sdp += SDPUtils.writeMediaSection(transceiver,\n            transceiver.localCapabilities, 'offer', self.localStreams[0]);\n      });\n\n      this._pendingOffer = transceivers;\n      var desc = new RTCSessionDescription({\n        type: 'offer',\n        sdp: sdp\n      });\n      if (arguments.length && typeof arguments[0] === 'function') {\n        window.setTimeout(arguments[0], 0, desc);\n      }\n      return Promise.resolve(desc);\n    };\n\n    window.RTCPeerConnection.prototype.createAnswer = function() {\n      var self = this;\n\n      var sdp = SDPUtils.writeSessionBoilerplate();\n      if (this.usingBundle) {\n        sdp += 'a=group:BUNDLE ' + this.transceivers.map(function(t) {\n          return t.mid;\n        }).join(' ') + '\\r\\n';\n      }\n      this.transceivers.forEach(function(transceiver) {\n        if (transceiver.isDatachannel) {\n          sdp += 'm=application 0 DTLS/SCTP 5000\\r\\n' +\n              'c=IN IP4 0.0.0.0\\r\\n' +\n              'a=mid:' + transceiver.mid + '\\r\\n';\n          return;\n        }\n        // Calculate intersection of capabilities.\n        var commonCapabilities = self._getCommonCapabilities(\n            transceiver.localCapabilities,\n            transceiver.remoteCapabilities);\n\n        sdp += SDPUtils.writeMediaSection(transceiver, commonCapabilities,\n            'answer', self.localStreams[0]);\n      });\n\n      var desc = new RTCSessionDescription({\n        type: 'answer',\n        sdp: sdp\n      });\n      if (arguments.length && typeof arguments[0] === 'function') {\n        window.setTimeout(arguments[0], 0, desc);\n      }\n      return Promise.resolve(desc);\n    };\n\n    window.RTCPeerConnection.prototype.addIceCandidate = function(candidate) {\n      if (!candidate) {\n        this.transceivers.forEach(function(transceiver) {\n          transceiver.iceTransport.addRemoteCandidate({});\n        });\n      } else {\n        var mLineIndex = candidate.sdpMLineIndex;\n        if (candidate.sdpMid) {\n          for (var i = 0; i < this.transceivers.length; i++) {\n            if (this.transceivers[i].mid === candidate.sdpMid) {\n              mLineIndex = i;\n              break;\n            }\n          }\n        }\n        var transceiver = this.transceivers[mLineIndex];\n        if (transceiver) {\n          var cand = Object.keys(candidate.candidate).length > 0 ?\n              SDPUtils.parseCandidate(candidate.candidate) : {};\n          // Ignore Chrome's invalid candidates since Edge does not like them.\n          if (cand.protocol === 'tcp' && (cand.port === 0 || cand.port === 9)) {\n            return;\n          }\n          // Ignore RTCP candidates, we assume RTCP-MUX.\n          if (cand.component !== '1') {\n            return;\n          }\n          // A dirty hack to make samples work.\n          if (cand.type === 'endOfCandidates') {\n            cand = {};\n          }\n          transceiver.iceTransport.addRemoteCandidate(cand);\n\n          // update the remoteDescription.\n          var sections = SDPUtils.splitSections(this.remoteDescription.sdp);\n          sections[mLineIndex + 1] += (cand.type ? candidate.candidate.trim()\n              : 'a=end-of-candidates') + '\\r\\n';\n          this.remoteDescription.sdp = sections.join('');\n        }\n      }\n      if (arguments.length > 1 && typeof arguments[1] === 'function') {\n        window.setTimeout(arguments[1], 0);\n      }\n      return Promise.resolve();\n    };\n\n    window.RTCPeerConnection.prototype.getStats = function() {\n      var promises = [];\n      this.transceivers.forEach(function(transceiver) {\n        ['rtpSender', 'rtpReceiver', 'iceGatherer', 'iceTransport',\n            'dtlsTransport'].forEach(function(method) {\n              if (transceiver[method]) {\n                promises.push(transceiver[method].getStats());\n              }\n            });\n      });\n      var cb = arguments.length > 1 && typeof arguments[1] === 'function' &&\n          arguments[1];\n      return new Promise(function(resolve) {\n        // shim getStats with maplike support\n        var results = new Map();\n        Promise.all(promises).then(function(res) {\n          res.forEach(function(result) {\n            Object.keys(result).forEach(function(id) {\n              results.set(id, result[id]);\n              results[id] = result[id];\n            });\n          });\n          if (cb) {\n            window.setTimeout(cb, 0, results);\n          }\n          resolve(results);\n        });\n      });\n    };\n  }\n};\n\n// Expose public methods.\nmodule.exports = {\n  shimPeerConnection: edgeShim.shimPeerConnection,\n  shimGetUserMedia: __webpack_require__(464)\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy93ZWJydGMtYWRhcHRlci9zcmMvanMvZWRnZS9lZGdlX3NoaW0uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqICBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFdlYlJUQyBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2VcbiAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2VcbiAqICB0cmVlLlxuICovXG4gLyogZXNsaW50LWVudiBub2RlICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBTRFBVdGlscyA9IHJlcXVpcmUoJ3NkcCcpO1xudmFyIGJyb3dzZXJEZXRhaWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKS5icm93c2VyRGV0YWlscztcblxudmFyIGVkZ2VTaGltID0ge1xuICBzaGltUGVlckNvbm5lY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgIGlmICh3aW5kb3cuUlRDSWNlR2F0aGVyZXIpIHtcbiAgICAgIC8vIE9SVEMgZGVmaW5lcyBhbiBSVENJY2VDYW5kaWRhdGUgb2JqZWN0IGJ1dCBubyBjb25zdHJ1Y3Rvci5cbiAgICAgIC8vIE5vdCBpbXBsZW1lbnRlZCBpbiBFZGdlLlxuICAgICAgaWYgKCF3aW5kb3cuUlRDSWNlQ2FuZGlkYXRlKSB7XG4gICAgICAgIHdpbmRvdy5SVENJY2VDYW5kaWRhdGUgPSBmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIGFyZ3M7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBPUlRDIGRvZXMgbm90IGhhdmUgYSBzZXNzaW9uIGRlc2NyaXB0aW9uIG9iamVjdCBidXRcbiAgICAgIC8vIG90aGVyIGJyb3dzZXJzIChpLmUuIENocm9tZSkgdGhhdCB3aWxsIHN1cHBvcnQgYm90aCBQQyBhbmQgT1JUQ1xuICAgICAgLy8gaW4gdGhlIGZ1dHVyZSBtaWdodCBoYXZlIHRoaXMgZGVmaW5lZCBhbHJlYWR5LlxuICAgICAgaWYgKCF3aW5kb3cuUlRDU2Vzc2lvbkRlc2NyaXB0aW9uKSB7XG4gICAgICAgIHdpbmRvdy5SVENTZXNzaW9uRGVzY3JpcHRpb24gPSBmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIGFyZ3M7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyB0aGlzIGFkZHMgYW4gYWRkaXRpb25hbCBldmVudCBsaXN0ZW5lciB0byBNZWRpYVN0cmFja1RyYWNrIHRoYXQgc2lnbmFsc1xuICAgICAgLy8gd2hlbiBhIHRyYWNrcyBlbmFibGVkIHByb3BlcnR5IHdhcyBjaGFuZ2VkLlxuICAgICAgdmFyIG9yaWdNU1RFbmFibGVkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgICBNZWRpYVN0cmVhbVRyYWNrLnByb3RvdHlwZSwgJ2VuYWJsZWQnKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShNZWRpYVN0cmVhbVRyYWNrLnByb3RvdHlwZSwgJ2VuYWJsZWQnLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICBvcmlnTVNURW5hYmxlZC5zZXQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgICAgdmFyIGV2ID0gbmV3IEV2ZW50KCdlbmFibGVkJyk7XG4gICAgICAgICAgZXYuZW5hYmxlZCA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKGNvbmZpZykge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICB2YXIgX2V2ZW50VGFyZ2V0ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgWydhZGRFdmVudExpc3RlbmVyJywgJ3JlbW92ZUV2ZW50TGlzdGVuZXInLCAnZGlzcGF0Y2hFdmVudCddXG4gICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICAgICAgICBzZWxmW21ldGhvZF0gPSBfZXZlbnRUYXJnZXRbbWV0aG9kXS5iaW5kKF9ldmVudFRhcmdldCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgIHRoaXMub25pY2VjYW5kaWRhdGUgPSBudWxsO1xuICAgICAgdGhpcy5vbmFkZHN0cmVhbSA9IG51bGw7XG4gICAgICB0aGlzLm9udHJhY2sgPSBudWxsO1xuICAgICAgdGhpcy5vbnJlbW92ZXN0cmVhbSA9IG51bGw7XG4gICAgICB0aGlzLm9uc2lnbmFsaW5nc3RhdGVjaGFuZ2UgPSBudWxsO1xuICAgICAgdGhpcy5vbmljZWNvbm5lY3Rpb25zdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICB0aGlzLm9ubmVnb3RpYXRpb25uZWVkZWQgPSBudWxsO1xuICAgICAgdGhpcy5vbmRhdGFjaGFubmVsID0gbnVsbDtcblxuICAgICAgdGhpcy5sb2NhbFN0cmVhbXMgPSBbXTtcbiAgICAgIHRoaXMucmVtb3RlU3RyZWFtcyA9IFtdO1xuICAgICAgdGhpcy5nZXRMb2NhbFN0cmVhbXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYubG9jYWxTdHJlYW1zO1xuICAgICAgfTtcbiAgICAgIHRoaXMuZ2V0UmVtb3RlU3RyZWFtcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc2VsZi5yZW1vdGVTdHJlYW1zO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5sb2NhbERlc2NyaXB0aW9uID0gbmV3IFJUQ1Nlc3Npb25EZXNjcmlwdGlvbih7XG4gICAgICAgIHR5cGU6ICcnLFxuICAgICAgICBzZHA6ICcnXG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVtb3RlRGVzY3JpcHRpb24gPSBuZXcgUlRDU2Vzc2lvbkRlc2NyaXB0aW9uKHtcbiAgICAgICAgdHlwZTogJycsXG4gICAgICAgIHNkcDogJydcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zaWduYWxpbmdTdGF0ZSA9ICdzdGFibGUnO1xuICAgICAgdGhpcy5pY2VDb25uZWN0aW9uU3RhdGUgPSAnbmV3JztcbiAgICAgIHRoaXMuaWNlR2F0aGVyaW5nU3RhdGUgPSAnbmV3JztcblxuICAgICAgdGhpcy5pY2VPcHRpb25zID0ge1xuICAgICAgICBnYXRoZXJQb2xpY3k6ICdhbGwnLFxuICAgICAgICBpY2VTZXJ2ZXJzOiBbXVxuICAgICAgfTtcbiAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLmljZVRyYW5zcG9ydFBvbGljeSkge1xuICAgICAgICBzd2l0Y2ggKGNvbmZpZy5pY2VUcmFuc3BvcnRQb2xpY3kpIHtcbiAgICAgICAgICBjYXNlICdhbGwnOlxuICAgICAgICAgIGNhc2UgJ3JlbGF5JzpcbiAgICAgICAgICAgIHRoaXMuaWNlT3B0aW9ucy5nYXRoZXJQb2xpY3kgPSBjb25maWcuaWNlVHJhbnNwb3J0UG9saWN5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgICAgICAvLyBGSVhNRTogcmVtb3ZlIG9uY2UgaW1wbGVtZW50YXRpb24gYW5kIHNwZWMgaGF2ZSBhZGRlZCB0aGlzLlxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaWNlVHJhbnNwb3J0UG9saWN5IFwibm9uZVwiIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gZG9uJ3Qgc2V0IGljZVRyYW5zcG9ydFBvbGljeS5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnVzaW5nQnVuZGxlID0gY29uZmlnICYmIGNvbmZpZy5idW5kbGVQb2xpY3kgPT09ICdtYXgtYnVuZGxlJztcblxuICAgICAgaWYgKGNvbmZpZyAmJiBjb25maWcuaWNlU2VydmVycykge1xuICAgICAgICAvLyBFZGdlIGRvZXMgbm90IGxpa2VcbiAgICAgICAgLy8gMSkgc3R1bjpcbiAgICAgICAgLy8gMikgdHVybjogdGhhdCBkb2VzIG5vdCBoYXZlIGFsbCBvZiB0dXJuOmhvc3Q6cG9ydD90cmFuc3BvcnQ9dWRwXG4gICAgICAgIC8vIDMpIHR1cm46IHdpdGggaXB2NiBhZGRyZXNzZXNcbiAgICAgICAgdmFyIGljZVNlcnZlcnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNvbmZpZy5pY2VTZXJ2ZXJzKSk7XG4gICAgICAgIHRoaXMuaWNlT3B0aW9ucy5pY2VTZXJ2ZXJzID0gaWNlU2VydmVycy5maWx0ZXIoZnVuY3Rpb24oc2VydmVyKSB7XG4gICAgICAgICAgaWYgKHNlcnZlciAmJiBzZXJ2ZXIudXJscykge1xuICAgICAgICAgICAgdmFyIHVybHMgPSBzZXJ2ZXIudXJscztcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJscyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgdXJscyA9IFt1cmxzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVybHMgPSB1cmxzLmZpbHRlcihmdW5jdGlvbih1cmwpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICh1cmwuaW5kZXhPZigndHVybjonKSA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgdXJsLmluZGV4T2YoJ3RyYW5zcG9ydD11ZHAnKSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgIHVybC5pbmRleE9mKCd0dXJuOlsnKSA9PT0gLTEpIHx8XG4gICAgICAgICAgICAgICAgICAodXJsLmluZGV4T2YoJ3N0dW46JykgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgYnJvd3NlckRldGFpbHMudmVyc2lvbiA+PSAxNDM5Myk7XG4gICAgICAgICAgICB9KVswXTtcbiAgICAgICAgICAgIHJldHVybiAhIXVybHM7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG5cbiAgICAgIC8vIHBlci10cmFjayBpY2VHYXRoZXJzLCBpY2VUcmFuc3BvcnRzLCBkdGxzVHJhbnNwb3J0cywgcnRwU2VuZGVycywgLi4uXG4gICAgICAvLyBldmVyeXRoaW5nIHRoYXQgaXMgbmVlZGVkIHRvIGRlc2NyaWJlIGEgU0RQIG0tbGluZS5cbiAgICAgIHRoaXMudHJhbnNjZWl2ZXJzID0gW107XG5cbiAgICAgIC8vIHNpbmNlIHRoZSBpY2VHYXRoZXJlciBpcyBjdXJyZW50bHkgY3JlYXRlZCBpbiBjcmVhdGVPZmZlciBidXQgd2VcbiAgICAgIC8vIG11c3Qgbm90IGVtaXQgY2FuZGlkYXRlcyB1bnRpbCBhZnRlciBzZXRMb2NhbERlc2NyaXB0aW9uIHdlIGJ1ZmZlclxuICAgICAgLy8gdGhlbSBpbiB0aGlzIGFycmF5LlxuICAgICAgdGhpcy5fbG9jYWxJY2VDYW5kaWRhdGVzQnVmZmVyID0gW107XG4gICAgfTtcblxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuX2VtaXRCdWZmZXJlZENhbmRpZGF0ZXMgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBzZWN0aW9ucyA9IFNEUFV0aWxzLnNwbGl0U2VjdGlvbnMoc2VsZi5sb2NhbERlc2NyaXB0aW9uLnNkcCk7XG4gICAgICAvLyBGSVhNRTogbmVlZCB0byBhcHBseSBpY2UgY2FuZGlkYXRlcyBpbiBhIHdheSB3aGljaCBpcyBhc3luYyBidXRcbiAgICAgIC8vIGluLW9yZGVyXG4gICAgICB0aGlzLl9sb2NhbEljZUNhbmRpZGF0ZXNCdWZmZXIuZm9yRWFjaChmdW5jdGlvbihldmVudCkge1xuICAgICAgICB2YXIgZW5kID0gIWV2ZW50LmNhbmRpZGF0ZSB8fCBPYmplY3Qua2V5cyhldmVudC5jYW5kaWRhdGUpLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgaWYgKGVuZCkge1xuICAgICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgc2VjdGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uc1tqXS5pbmRleE9mKCdcXHJcXG5hPWVuZC1vZi1jYW5kaWRhdGVzXFxyXFxuJykgPT09IC0xKSB7XG4gICAgICAgICAgICAgIHNlY3Rpb25zW2pdICs9ICdhPWVuZC1vZi1jYW5kaWRhdGVzXFxyXFxuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY2FuZGlkYXRlLmNhbmRpZGF0ZS5pbmRleE9mKCd0eXAgZW5kT2ZDYW5kaWRhdGVzJylcbiAgICAgICAgICAgID09PSAtMSkge1xuICAgICAgICAgIHNlY3Rpb25zW2V2ZW50LmNhbmRpZGF0ZS5zZHBNTGluZUluZGV4ICsgMV0gKz1cbiAgICAgICAgICAgICAgJ2E9JyArIGV2ZW50LmNhbmRpZGF0ZS5jYW5kaWRhdGUgKyAnXFxyXFxuJztcbiAgICAgICAgfVxuICAgICAgICBzZWxmLmxvY2FsRGVzY3JpcHRpb24uc2RwID0gc2VjdGlvbnMuam9pbignJyk7XG4gICAgICAgIHNlbGYuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgIGlmIChzZWxmLm9uaWNlY2FuZGlkYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgc2VsZi5vbmljZWNhbmRpZGF0ZShldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFldmVudC5jYW5kaWRhdGUgJiYgc2VsZi5pY2VHYXRoZXJpbmdTdGF0ZSAhPT0gJ2NvbXBsZXRlJykge1xuICAgICAgICAgIHZhciBjb21wbGV0ZSA9IHNlbGYudHJhbnNjZWl2ZXJzLmV2ZXJ5KGZ1bmN0aW9uKHRyYW5zY2VpdmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNjZWl2ZXIuaWNlR2F0aGVyZXIgJiZcbiAgICAgICAgICAgICAgICB0cmFuc2NlaXZlci5pY2VHYXRoZXJlci5zdGF0ZSA9PT0gJ2NvbXBsZXRlZCc7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGNvbXBsZXRlKSB7XG4gICAgICAgICAgICBzZWxmLmljZUdhdGhlcmluZ1N0YXRlID0gJ2NvbXBsZXRlJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5fbG9jYWxJY2VDYW5kaWRhdGVzQnVmZmVyID0gW107XG4gICAgfTtcblxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuZ2V0Q29uZmlndXJhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgICB9O1xuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5hZGRTdHJlYW0gPSBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICAgIC8vIENsb25lIGlzIG5lY2Vzc2FyeSBmb3IgbG9jYWwgZGVtb3MgbW9zdGx5LCBhdHRhY2hpbmcgZGlyZWN0bHlcbiAgICAgIC8vIHRvIHR3byBkaWZmZXJlbnQgc2VuZGVycyBkb2VzIG5vdCB3b3JrIChidWlsZCAxMDU0NykuXG4gICAgICB2YXIgY2xvbmVkU3RyZWFtID0gc3RyZWFtLmNsb25lKCk7XG4gICAgICBzdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaChmdW5jdGlvbih0cmFjaywgaWR4KSB7XG4gICAgICAgIHZhciBjbG9uZWRUcmFjayA9IGNsb25lZFN0cmVhbS5nZXRUcmFja3MoKVtpZHhdO1xuICAgICAgICB0cmFjay5hZGRFdmVudExpc3RlbmVyKCdlbmFibGVkJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICBjbG9uZWRUcmFjay5lbmFibGVkID0gZXZlbnQuZW5hYmxlZDtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMubG9jYWxTdHJlYW1zLnB1c2goY2xvbmVkU3RyZWFtKTtcbiAgICAgIHRoaXMuX21heWJlRmlyZU5lZ290aWF0aW9uTmVlZGVkKCk7XG4gICAgfTtcblxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUucmVtb3ZlU3RyZWFtID0gZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICB2YXIgaWR4ID0gdGhpcy5sb2NhbFN0cmVhbXMuaW5kZXhPZihzdHJlYW0pO1xuICAgICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgICAgIHRoaXMubG9jYWxTdHJlYW1zLnNwbGljZShpZHgsIDEpO1xuICAgICAgICB0aGlzLl9tYXliZUZpcmVOZWdvdGlhdGlvbk5lZWRlZCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLmdldFNlbmRlcnMgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zY2VpdmVycy5maWx0ZXIoZnVuY3Rpb24odHJhbnNjZWl2ZXIpIHtcbiAgICAgICAgcmV0dXJuICEhdHJhbnNjZWl2ZXIucnRwU2VuZGVyO1xuICAgICAgfSlcbiAgICAgIC5tYXAoZnVuY3Rpb24odHJhbnNjZWl2ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zY2VpdmVyLnJ0cFNlbmRlcjtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLmdldFJlY2VpdmVycyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNjZWl2ZXJzLmZpbHRlcihmdW5jdGlvbih0cmFuc2NlaXZlcikge1xuICAgICAgICByZXR1cm4gISF0cmFuc2NlaXZlci5ydHBSZWNlaXZlcjtcbiAgICAgIH0pXG4gICAgICAubWFwKGZ1bmN0aW9uKHRyYW5zY2VpdmVyKSB7XG4gICAgICAgIHJldHVybiB0cmFuc2NlaXZlci5ydHBSZWNlaXZlcjtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBEZXRlcm1pbmVzIHRoZSBpbnRlcnNlY3Rpb24gb2YgbG9jYWwgYW5kIHJlbW90ZSBjYXBhYmlsaXRpZXMuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5fZ2V0Q29tbW9uQ2FwYWJpbGl0aWVzID1cbiAgICAgICAgZnVuY3Rpb24obG9jYWxDYXBhYmlsaXRpZXMsIHJlbW90ZUNhcGFiaWxpdGllcykge1xuICAgICAgICAgIHZhciBjb21tb25DYXBhYmlsaXRpZXMgPSB7XG4gICAgICAgICAgICBjb2RlY3M6IFtdLFxuICAgICAgICAgICAgaGVhZGVyRXh0ZW5zaW9uczogW10sXG4gICAgICAgICAgICBmZWNNZWNoYW5pc21zOiBbXVxuICAgICAgICAgIH07XG4gICAgICAgICAgbG9jYWxDYXBhYmlsaXRpZXMuY29kZWNzLmZvckVhY2goZnVuY3Rpb24obENvZGVjKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlbW90ZUNhcGFiaWxpdGllcy5jb2RlY3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFyIHJDb2RlYyA9IHJlbW90ZUNhcGFiaWxpdGllcy5jb2RlY3NbaV07XG4gICAgICAgICAgICAgIGlmIChsQ29kZWMubmFtZS50b0xvd2VyQ2FzZSgpID09PSByQ29kZWMubmFtZS50b0xvd2VyQ2FzZSgpICYmXG4gICAgICAgICAgICAgICAgICBsQ29kZWMuY2xvY2tSYXRlID09PSByQ29kZWMuY2xvY2tSYXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGNoYW5uZWxzIGlzIHRoZSBoaWdoZXN0IGNvbW1vbiBudW1iZXIgb2YgY2hhbm5lbHNcbiAgICAgICAgICAgICAgICByQ29kZWMubnVtQ2hhbm5lbHMgPSBNYXRoLm1pbihsQ29kZWMubnVtQ2hhbm5lbHMsXG4gICAgICAgICAgICAgICAgICAgIHJDb2RlYy5udW1DaGFubmVscyk7XG4gICAgICAgICAgICAgICAgLy8gcHVzaCByQ29kZWMgc28gd2UgcmVwbHkgd2l0aCBvZmZlcmVyIHBheWxvYWQgdHlwZVxuICAgICAgICAgICAgICAgIGNvbW1vbkNhcGFiaWxpdGllcy5jb2RlY3MucHVzaChyQ29kZWMpO1xuXG4gICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIGNvbW1vbiBmZWVkYmFjayBtZWNoYW5pc21zXG4gICAgICAgICAgICAgICAgckNvZGVjLnJ0Y3BGZWVkYmFjayA9IHJDb2RlYy5ydGNwRmVlZGJhY2suZmlsdGVyKGZ1bmN0aW9uKGZiKSB7XG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxDb2RlYy5ydGNwRmVlZGJhY2subGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxDb2RlYy5ydGNwRmVlZGJhY2tbal0udHlwZSA9PT0gZmIudHlwZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbENvZGVjLnJ0Y3BGZWVkYmFja1tqXS5wYXJhbWV0ZXIgPT09IGZiLnBhcmFtZXRlcikge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gRklYTUU6IGFsc28gbmVlZCB0byBkZXRlcm1pbmUgLnBhcmFtZXRlcnNcbiAgICAgICAgICAgICAgICAvLyAgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVucGVlci9vcnRjL2lzc3Vlcy81NjlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbG9jYWxDYXBhYmlsaXRpZXMuaGVhZGVyRXh0ZW5zaW9uc1xuICAgICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbihsSGVhZGVyRXh0ZW5zaW9uKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZW1vdGVDYXBhYmlsaXRpZXMuaGVhZGVyRXh0ZW5zaW9ucy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICBpKyspIHtcbiAgICAgICAgICAgICAgICAgIHZhciBySGVhZGVyRXh0ZW5zaW9uID0gcmVtb3RlQ2FwYWJpbGl0aWVzLmhlYWRlckV4dGVuc2lvbnNbaV07XG4gICAgICAgICAgICAgICAgICBpZiAobEhlYWRlckV4dGVuc2lvbi51cmkgPT09IHJIZWFkZXJFeHRlbnNpb24udXJpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbkNhcGFiaWxpdGllcy5oZWFkZXJFeHRlbnNpb25zLnB1c2gockhlYWRlckV4dGVuc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBGSVhNRTogZmVjTWVjaGFuaXNtc1xuICAgICAgICAgIHJldHVybiBjb21tb25DYXBhYmlsaXRpZXM7XG4gICAgICAgIH07XG5cbiAgICAvLyBDcmVhdGUgSUNFIGdhdGhlcmVyLCBJQ0UgdHJhbnNwb3J0IGFuZCBEVExTIHRyYW5zcG9ydC5cbiAgICB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLl9jcmVhdGVJY2VBbmREdGxzVHJhbnNwb3J0cyA9XG4gICAgICAgIGZ1bmN0aW9uKG1pZCwgc2RwTUxpbmVJbmRleCkge1xuICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgICB2YXIgaWNlR2F0aGVyZXIgPSBuZXcgUlRDSWNlR2F0aGVyZXIoc2VsZi5pY2VPcHRpb25zKTtcbiAgICAgICAgICB2YXIgaWNlVHJhbnNwb3J0ID0gbmV3IFJUQ0ljZVRyYW5zcG9ydChpY2VHYXRoZXJlcik7XG4gICAgICAgICAgaWNlR2F0aGVyZXIub25sb2NhbGNhbmRpZGF0ZSA9IGZ1bmN0aW9uKGV2dCkge1xuICAgICAgICAgICAgdmFyIGV2ZW50ID0gbmV3IEV2ZW50KCdpY2VjYW5kaWRhdGUnKTtcbiAgICAgICAgICAgIGV2ZW50LmNhbmRpZGF0ZSA9IHtzZHBNaWQ6IG1pZCwgc2RwTUxpbmVJbmRleDogc2RwTUxpbmVJbmRleH07XG5cbiAgICAgICAgICAgIHZhciBjYW5kID0gZXZ0LmNhbmRpZGF0ZTtcbiAgICAgICAgICAgIHZhciBlbmQgPSAhY2FuZCB8fCBPYmplY3Qua2V5cyhjYW5kKS5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICAvLyBFZGdlIGVtaXRzIGFuIGVtcHR5IG9iamVjdCBmb3IgUlRDSWNlQ2FuZGlkYXRlQ29tcGxldGXigKVcbiAgICAgICAgICAgIGlmIChlbmQpIHtcbiAgICAgICAgICAgICAgLy8gcG9seWZpbGwgc2luY2UgUlRDSWNlR2F0aGVyZXIuc3RhdGUgaXMgbm90IGltcGxlbWVudGVkIGluXG4gICAgICAgICAgICAgIC8vIEVkZ2UgMTA1NDcgeWV0LlxuICAgICAgICAgICAgICBpZiAoaWNlR2F0aGVyZXIuc3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGljZUdhdGhlcmVyLnN0YXRlID0gJ2NvbXBsZXRlZCc7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBFbWl0IGEgY2FuZGlkYXRlIHdpdGggdHlwZSBlbmRPZkNhbmRpZGF0ZXMgdG8gbWFrZSB0aGUgc2FtcGxlc1xuICAgICAgICAgICAgICAvLyB3b3JrLiBFZGdlIHJlcXVpcmVzIGFkZEljZUNhbmRpZGF0ZSB3aXRoIHRoaXMgZW1wdHkgY2FuZGlkYXRlXG4gICAgICAgICAgICAgIC8vIHRvIHN0YXJ0IGNoZWNraW5nLiBUaGUgcmVhbCBzb2x1dGlvbiBpcyB0byBzaWduYWxcbiAgICAgICAgICAgICAgLy8gZW5kLW9mLWNhbmRpZGF0ZXMgdG8gdGhlIG90aGVyIHNpZGUgd2hlbiBnZXR0aW5nIHRoZSBudWxsXG4gICAgICAgICAgICAgIC8vIGNhbmRpZGF0ZSBidXQgc29tZSBhcHBzIChsaWtlIHRoZSBzYW1wbGVzKSBkb24ndCBkbyB0aGF0LlxuICAgICAgICAgICAgICBldmVudC5jYW5kaWRhdGUuY2FuZGlkYXRlID1cbiAgICAgICAgICAgICAgICAgICdjYW5kaWRhdGU6MSAxIHVkcCAxIDAuMC4wLjAgOSB0eXAgZW5kT2ZDYW5kaWRhdGVzJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFJUQ0ljZUNhbmRpZGF0ZSBkb2Vzbid0IGhhdmUgYSBjb21wb25lbnQsIG5lZWRzIHRvIGJlIGFkZGVkXG4gICAgICAgICAgICAgIGNhbmQuY29tcG9uZW50ID0gaWNlVHJhbnNwb3J0LmNvbXBvbmVudCA9PT0gJ1JUQ1AnID8gMiA6IDE7XG4gICAgICAgICAgICAgIGV2ZW50LmNhbmRpZGF0ZS5jYW5kaWRhdGUgPSBTRFBVdGlscy53cml0ZUNhbmRpZGF0ZShjYW5kKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdXBkYXRlIGxvY2FsIGRlc2NyaXB0aW9uLlxuICAgICAgICAgICAgdmFyIHNlY3Rpb25zID0gU0RQVXRpbHMuc3BsaXRTZWN0aW9ucyhzZWxmLmxvY2FsRGVzY3JpcHRpb24uc2RwKTtcbiAgICAgICAgICAgIGlmIChldmVudC5jYW5kaWRhdGUuY2FuZGlkYXRlLmluZGV4T2YoJ3R5cCBlbmRPZkNhbmRpZGF0ZXMnKVxuICAgICAgICAgICAgICAgID09PSAtMSkge1xuICAgICAgICAgICAgICBzZWN0aW9uc1tldmVudC5jYW5kaWRhdGUuc2RwTUxpbmVJbmRleCArIDFdICs9XG4gICAgICAgICAgICAgICAgICAnYT0nICsgZXZlbnQuY2FuZGlkYXRlLmNhbmRpZGF0ZSArICdcXHJcXG4nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2VjdGlvbnNbZXZlbnQuY2FuZGlkYXRlLnNkcE1MaW5lSW5kZXggKyAxXSArPVxuICAgICAgICAgICAgICAgICAgJ2E9ZW5kLW9mLWNhbmRpZGF0ZXNcXHJcXG4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZi5sb2NhbERlc2NyaXB0aW9uLnNkcCA9IHNlY3Rpb25zLmpvaW4oJycpO1xuXG4gICAgICAgICAgICB2YXIgY29tcGxldGUgPSBzZWxmLnRyYW5zY2VpdmVycy5ldmVyeShmdW5jdGlvbih0cmFuc2NlaXZlcikge1xuICAgICAgICAgICAgICByZXR1cm4gdHJhbnNjZWl2ZXIuaWNlR2F0aGVyZXIgJiZcbiAgICAgICAgICAgICAgICAgIHRyYW5zY2VpdmVyLmljZUdhdGhlcmVyLnN0YXRlID09PSAnY29tcGxldGVkJztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBFbWl0IGNhbmRpZGF0ZSBpZiBsb2NhbERlc2NyaXB0aW9uIGlzIHNldC5cbiAgICAgICAgICAgIC8vIEFsc28gZW1pdHMgbnVsbCBjYW5kaWRhdGUgd2hlbiBhbGwgZ2F0aGVyZXJzIGFyZSBjb21wbGV0ZS5cbiAgICAgICAgICAgIHN3aXRjaCAoc2VsZi5pY2VHYXRoZXJpbmdTdGF0ZSkge1xuICAgICAgICAgICAgICBjYXNlICduZXcnOlxuICAgICAgICAgICAgICAgIHNlbGYuX2xvY2FsSWNlQ2FuZGlkYXRlc0J1ZmZlci5wdXNoKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoZW5kICYmIGNvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICBzZWxmLl9sb2NhbEljZUNhbmRpZGF0ZXNCdWZmZXIucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICBuZXcgRXZlbnQoJ2ljZWNhbmRpZGF0ZScpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2dhdGhlcmluZyc6XG4gICAgICAgICAgICAgICAgc2VsZi5fZW1pdEJ1ZmZlcmVkQ2FuZGlkYXRlcygpO1xuICAgICAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYub25pY2VjYW5kaWRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIHNlbGYub25pY2VjYW5kaWRhdGUoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2ljZWNhbmRpZGF0ZScpKTtcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9uaWNlY2FuZGlkYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYub25pY2VjYW5kaWRhdGUobmV3IEV2ZW50KCdpY2VjYW5kaWRhdGUnKSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBzZWxmLmljZUdhdGhlcmluZ1N0YXRlID0gJ2NvbXBsZXRlJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2NvbXBsZXRlJzpcbiAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlbi4uLiBjdXJyZW50bHkhXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6IC8vIG5vLW9wLlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWNlVHJhbnNwb3J0Lm9uaWNlc3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYuX3VwZGF0ZUNvbm5lY3Rpb25TdGF0ZSgpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICB2YXIgZHRsc1RyYW5zcG9ydCA9IG5ldyBSVENEdGxzVHJhbnNwb3J0KGljZVRyYW5zcG9ydCk7XG4gICAgICAgICAgZHRsc1RyYW5zcG9ydC5vbmR0bHNzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5fdXBkYXRlQ29ubmVjdGlvblN0YXRlKCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBkdGxzVHJhbnNwb3J0Lm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIC8vIG9uZXJyb3IgZG9lcyBub3Qgc2V0IHN0YXRlIHRvIGZhaWxlZCBieSBpdHNlbGYuXG4gICAgICAgICAgICBkdGxzVHJhbnNwb3J0LnN0YXRlID0gJ2ZhaWxlZCc7XG4gICAgICAgICAgICBzZWxmLl91cGRhdGVDb25uZWN0aW9uU3RhdGUoKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGljZUdhdGhlcmVyOiBpY2VHYXRoZXJlcixcbiAgICAgICAgICAgIGljZVRyYW5zcG9ydDogaWNlVHJhbnNwb3J0LFxuICAgICAgICAgICAgZHRsc1RyYW5zcG9ydDogZHRsc1RyYW5zcG9ydFxuICAgICAgICAgIH07XG4gICAgICAgIH07XG5cbiAgICAvLyBTdGFydCB0aGUgUlRQIFNlbmRlciBhbmQgUmVjZWl2ZXIgZm9yIGEgdHJhbnNjZWl2ZXIuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5fdHJhbnNjZWl2ZSA9IGZ1bmN0aW9uKHRyYW5zY2VpdmVyLFxuICAgICAgICBzZW5kLCByZWN2KSB7XG4gICAgICB2YXIgcGFyYW1zID0gdGhpcy5fZ2V0Q29tbW9uQ2FwYWJpbGl0aWVzKHRyYW5zY2VpdmVyLmxvY2FsQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgIHRyYW5zY2VpdmVyLnJlbW90ZUNhcGFiaWxpdGllcyk7XG4gICAgICBpZiAoc2VuZCAmJiB0cmFuc2NlaXZlci5ydHBTZW5kZXIpIHtcbiAgICAgICAgcGFyYW1zLmVuY29kaW5ncyA9IHRyYW5zY2VpdmVyLnNlbmRFbmNvZGluZ1BhcmFtZXRlcnM7XG4gICAgICAgIHBhcmFtcy5ydGNwID0ge1xuICAgICAgICAgIGNuYW1lOiBTRFBVdGlscy5sb2NhbENOYW1lXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0cmFuc2NlaXZlci5yZWN2RW5jb2RpbmdQYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgICAgICAgIHBhcmFtcy5ydGNwLnNzcmMgPSB0cmFuc2NlaXZlci5yZWN2RW5jb2RpbmdQYXJhbWV0ZXJzWzBdLnNzcmM7XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNjZWl2ZXIucnRwU2VuZGVyLnNlbmQocGFyYW1zKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWN2ICYmIHRyYW5zY2VpdmVyLnJ0cFJlY2VpdmVyKSB7XG4gICAgICAgIC8vIHJlbW92ZSBSVFggZmllbGQgaW4gRWRnZSAxNDk0MlxuICAgICAgICBpZiAodHJhbnNjZWl2ZXIua2luZCA9PT0gJ3ZpZGVvJ1xuICAgICAgICAgICAgJiYgdHJhbnNjZWl2ZXIucmVjdkVuY29kaW5nUGFyYW1ldGVycykge1xuICAgICAgICAgIHRyYW5zY2VpdmVyLnJlY3ZFbmNvZGluZ1BhcmFtZXRlcnMuZm9yRWFjaChmdW5jdGlvbihwKSB7XG4gICAgICAgICAgICBkZWxldGUgcC5ydHg7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcGFyYW1zLmVuY29kaW5ncyA9IHRyYW5zY2VpdmVyLnJlY3ZFbmNvZGluZ1BhcmFtZXRlcnM7XG4gICAgICAgIHBhcmFtcy5ydGNwID0ge1xuICAgICAgICAgIGNuYW1lOiB0cmFuc2NlaXZlci5jbmFtZVxuICAgICAgICB9O1xuICAgICAgICBpZiAodHJhbnNjZWl2ZXIuc2VuZEVuY29kaW5nUGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICAgICAgICBwYXJhbXMucnRjcC5zc3JjID0gdHJhbnNjZWl2ZXIuc2VuZEVuY29kaW5nUGFyYW1ldGVyc1swXS5zc3JjO1xuICAgICAgICB9XG4gICAgICAgIHRyYW5zY2VpdmVyLnJ0cFJlY2VpdmVyLnJlY2VpdmUocGFyYW1zKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5zZXRMb2NhbERlc2NyaXB0aW9uID1cbiAgICAgICAgZnVuY3Rpb24oZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgdmFyIHNlY3Rpb25zO1xuICAgICAgICAgIHZhciBzZXNzaW9ucGFydDtcbiAgICAgICAgICBpZiAoZGVzY3JpcHRpb24udHlwZSA9PT0gJ29mZmVyJykge1xuICAgICAgICAgICAgLy8gRklYTUU6IFdoYXQgd2FzIHRoZSBwdXJwb3NlIG9mIHRoaXMgZW1wdHkgaWYgc3RhdGVtZW50P1xuICAgICAgICAgICAgLy8gaWYgKCF0aGlzLl9wZW5kaW5nT2ZmZXIpIHtcbiAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcGVuZGluZ09mZmVyKSB7XG4gICAgICAgICAgICAgIC8vIFZFUlkgbGltaXRlZCBzdXBwb3J0IGZvciBTRFAgbXVuZ2luZy4gTGltaXRlZCB0bzpcbiAgICAgICAgICAgICAgLy8gKiBjaGFuZ2luZyB0aGUgb3JkZXIgb2YgY29kZWNzXG4gICAgICAgICAgICAgIHNlY3Rpb25zID0gU0RQVXRpbHMuc3BsaXRTZWN0aW9ucyhkZXNjcmlwdGlvbi5zZHApO1xuICAgICAgICAgICAgICBzZXNzaW9ucGFydCA9IHNlY3Rpb25zLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHNlY3Rpb25zLmZvckVhY2goZnVuY3Rpb24obWVkaWFTZWN0aW9uLCBzZHBNTGluZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmFyIGNhcHMgPSBTRFBVdGlscy5wYXJzZVJ0cFBhcmFtZXRlcnMobWVkaWFTZWN0aW9uKTtcbiAgICAgICAgICAgICAgICBzZWxmLl9wZW5kaW5nT2ZmZXJbc2RwTUxpbmVJbmRleF0ubG9jYWxDYXBhYmlsaXRpZXMgPSBjYXBzO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGhpcy50cmFuc2NlaXZlcnMgPSB0aGlzLl9wZW5kaW5nT2ZmZXI7XG4gICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9wZW5kaW5nT2ZmZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChkZXNjcmlwdGlvbi50eXBlID09PSAnYW5zd2VyJykge1xuICAgICAgICAgICAgc2VjdGlvbnMgPSBTRFBVdGlscy5zcGxpdFNlY3Rpb25zKHNlbGYucmVtb3RlRGVzY3JpcHRpb24uc2RwKTtcbiAgICAgICAgICAgIHNlc3Npb25wYXJ0ID0gc2VjdGlvbnMuc2hpZnQoKTtcbiAgICAgICAgICAgIHZhciBpc0ljZUxpdGUgPSBTRFBVdGlscy5tYXRjaFByZWZpeChzZXNzaW9ucGFydCxcbiAgICAgICAgICAgICAgICAnYT1pY2UtbGl0ZScpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICBzZWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKG1lZGlhU2VjdGlvbiwgc2RwTUxpbmVJbmRleCkge1xuICAgICAgICAgICAgICB2YXIgdHJhbnNjZWl2ZXIgPSBzZWxmLnRyYW5zY2VpdmVyc1tzZHBNTGluZUluZGV4XTtcbiAgICAgICAgICAgICAgdmFyIGljZUdhdGhlcmVyID0gdHJhbnNjZWl2ZXIuaWNlR2F0aGVyZXI7XG4gICAgICAgICAgICAgIHZhciBpY2VUcmFuc3BvcnQgPSB0cmFuc2NlaXZlci5pY2VUcmFuc3BvcnQ7XG4gICAgICAgICAgICAgIHZhciBkdGxzVHJhbnNwb3J0ID0gdHJhbnNjZWl2ZXIuZHRsc1RyYW5zcG9ydDtcbiAgICAgICAgICAgICAgdmFyIGxvY2FsQ2FwYWJpbGl0aWVzID0gdHJhbnNjZWl2ZXIubG9jYWxDYXBhYmlsaXRpZXM7XG4gICAgICAgICAgICAgIHZhciByZW1vdGVDYXBhYmlsaXRpZXMgPSB0cmFuc2NlaXZlci5yZW1vdGVDYXBhYmlsaXRpZXM7XG5cbiAgICAgICAgICAgICAgdmFyIHJlamVjdGVkID0gbWVkaWFTZWN0aW9uLnNwbGl0KCdcXG4nLCAxKVswXVxuICAgICAgICAgICAgICAgICAgLnNwbGl0KCcgJywgMilbMV0gPT09ICcwJztcblxuICAgICAgICAgICAgICBpZiAoIXJlamVjdGVkICYmICF0cmFuc2NlaXZlci5pc0RhdGFjaGFubmVsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlbW90ZUljZVBhcmFtZXRlcnMgPSBTRFBVdGlscy5nZXRJY2VQYXJhbWV0ZXJzKFxuICAgICAgICAgICAgICAgICAgICBtZWRpYVNlY3Rpb24sIHNlc3Npb25wYXJ0KTtcbiAgICAgICAgICAgICAgICBpZiAoaXNJY2VMaXRlKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgY2FuZHMgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPWNhbmRpZGF0ZTonKVxuICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbihjYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBTRFBVdGlscy5wYXJzZUNhbmRpZGF0ZShjYW5kKTtcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKGNhbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbmQuY29tcG9uZW50ID09PSAnMSc7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIC8vIGljZS1saXRlIG9ubHkgaW5jbHVkZXMgaG9zdCBjYW5kaWRhdGVzIGluIHRoZSBTRFAgc28gd2UgY2FuXG4gICAgICAgICAgICAgICAgICAvLyB1c2Ugc2V0UmVtb3RlQ2FuZGlkYXRlcyAod2hpY2ggaW1wbGllcyBhblxuICAgICAgICAgICAgICAgICAgLy8gUlRDSWNlQ2FuZGlkYXRlQ29tcGxldGUpXG4gICAgICAgICAgICAgICAgICBpZiAoY2FuZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGljZVRyYW5zcG9ydC5zZXRSZW1vdGVDYW5kaWRhdGVzKGNhbmRzKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHJlbW90ZUR0bHNQYXJhbWV0ZXJzID0gU0RQVXRpbHMuZ2V0RHRsc1BhcmFtZXRlcnMoXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhU2VjdGlvbiwgc2Vzc2lvbnBhcnQpO1xuICAgICAgICAgICAgICAgIGlmIChpc0ljZUxpdGUpIHtcbiAgICAgICAgICAgICAgICAgIHJlbW90ZUR0bHNQYXJhbWV0ZXJzLnJvbGUgPSAnc2VydmVyJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIXNlbGYudXNpbmdCdW5kbGUgfHwgc2RwTUxpbmVJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgaWNlVHJhbnNwb3J0LnN0YXJ0KGljZUdhdGhlcmVyLCByZW1vdGVJY2VQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgIGlzSWNlTGl0ZSA/ICdjb250cm9sbGluZycgOiAnY29udHJvbGxlZCcpO1xuICAgICAgICAgICAgICAgICAgZHRsc1RyYW5zcG9ydC5zdGFydChyZW1vdGVEdGxzUGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGludGVyc2VjdGlvbiBvZiBjYXBhYmlsaXRpZXMuXG4gICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHNlbGYuX2dldENvbW1vbkNhcGFiaWxpdGllcyhsb2NhbENhcGFiaWxpdGllcyxcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlQ2FwYWJpbGl0aWVzKTtcblxuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBSVENSdHBTZW5kZXIuIFRoZSBSVENSdHBSZWNlaXZlciBmb3IgdGhpc1xuICAgICAgICAgICAgICAgIC8vIHRyYW5zY2VpdmVyIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZCBpbiBzZXRSZW1vdGVEZXNjcmlwdGlvbi5cbiAgICAgICAgICAgICAgICBzZWxmLl90cmFuc2NlaXZlKHRyYW5zY2VpdmVyLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY29kZWNzLmxlbmd0aCA+IDAsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5sb2NhbERlc2NyaXB0aW9uID0ge1xuICAgICAgICAgICAgdHlwZTogZGVzY3JpcHRpb24udHlwZSxcbiAgICAgICAgICAgIHNkcDogZGVzY3JpcHRpb24uc2RwXG4gICAgICAgICAgfTtcbiAgICAgICAgICBzd2l0Y2ggKGRlc2NyaXB0aW9uLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ29mZmVyJzpcbiAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlU2lnbmFsaW5nU3RhdGUoJ2hhdmUtbG9jYWwtb2ZmZXInKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdhbnN3ZXInOlxuICAgICAgICAgICAgICB0aGlzLl91cGRhdGVTaWduYWxpbmdTdGF0ZSgnc3RhYmxlJyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndW5zdXBwb3J0ZWQgdHlwZSBcIicgKyBkZXNjcmlwdGlvbi50eXBlICtcbiAgICAgICAgICAgICAgICAgICdcIicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIGEgc3VjY2VzcyBjYWxsYmFjayB3YXMgcHJvdmlkZWQsIGVtaXQgSUNFIGNhbmRpZGF0ZXMgYWZ0ZXIgaXRcbiAgICAgICAgICAvLyBoYXMgYmVlbiBleGVjdXRlZC4gT3RoZXJ3aXNlLCBlbWl0IGNhbGxiYWNrIGFmdGVyIHRoZSBQcm9taXNlIGlzXG4gICAgICAgICAgLy8gcmVzb2x2ZWQuXG4gICAgICAgICAgdmFyIGhhc0NhbGxiYWNrID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgICAgIHR5cGVvZiBhcmd1bWVudHNbMV0gPT09ICdmdW5jdGlvbic7XG4gICAgICAgICAgaWYgKGhhc0NhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgY2IgPSBhcmd1bWVudHNbMV07XG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgICAgICAgaWYgKHNlbGYuaWNlR2F0aGVyaW5nU3RhdGUgPT09ICduZXcnKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5pY2VHYXRoZXJpbmdTdGF0ZSA9ICdnYXRoZXJpbmcnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHNlbGYuX2VtaXRCdWZmZXJlZENhbmRpZGF0ZXMoKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgcCA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgIHAudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICghaGFzQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgaWYgKHNlbGYuaWNlR2F0aGVyaW5nU3RhdGUgPT09ICduZXcnKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5pY2VHYXRoZXJpbmdTdGF0ZSA9ICdnYXRoZXJpbmcnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFVzdWFsbHkgY2FuZGlkYXRlcyB3aWxsIGJlIGVtaXR0ZWQgZWFybGllci5cbiAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoc2VsZi5fZW1pdEJ1ZmZlcmVkQ2FuZGlkYXRlcy5iaW5kKHNlbGYpLCA1MDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBwO1xuICAgICAgICB9O1xuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5zZXRSZW1vdGVEZXNjcmlwdGlvbiA9XG4gICAgICAgIGZ1bmN0aW9uKGRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAgIHZhciBzdHJlYW0gPSBuZXcgTWVkaWFTdHJlYW0oKTtcbiAgICAgICAgICB2YXIgcmVjZWl2ZXJMaXN0ID0gW107XG4gICAgICAgICAgdmFyIHNlY3Rpb25zID0gU0RQVXRpbHMuc3BsaXRTZWN0aW9ucyhkZXNjcmlwdGlvbi5zZHApO1xuICAgICAgICAgIHZhciBzZXNzaW9ucGFydCA9IHNlY3Rpb25zLnNoaWZ0KCk7XG4gICAgICAgICAgdmFyIGlzSWNlTGl0ZSA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KHNlc3Npb25wYXJ0LFxuICAgICAgICAgICAgICAnYT1pY2UtbGl0ZScpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgdGhpcy51c2luZ0J1bmRsZSA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KHNlc3Npb25wYXJ0LFxuICAgICAgICAgICAgICAnYT1ncm91cDpCVU5ETEUgJykubGVuZ3RoID4gMDtcbiAgICAgICAgICBzZWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKG1lZGlhU2VjdGlvbiwgc2RwTUxpbmVJbmRleCkge1xuICAgICAgICAgICAgdmFyIGxpbmVzID0gU0RQVXRpbHMuc3BsaXRMaW5lcyhtZWRpYVNlY3Rpb24pO1xuICAgICAgICAgICAgdmFyIG1saW5lID0gbGluZXNbMF0uc3Vic3RyKDIpLnNwbGl0KCcgJyk7XG4gICAgICAgICAgICB2YXIga2luZCA9IG1saW5lWzBdO1xuICAgICAgICAgICAgdmFyIHJlamVjdGVkID0gbWxpbmVbMV0gPT09ICcwJztcbiAgICAgICAgICAgIHZhciBkaXJlY3Rpb24gPSBTRFBVdGlscy5nZXREaXJlY3Rpb24obWVkaWFTZWN0aW9uLCBzZXNzaW9ucGFydCk7XG5cbiAgICAgICAgICAgIHZhciBtaWQgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPW1pZDonKTtcbiAgICAgICAgICAgIGlmIChtaWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIG1pZCA9IG1pZFswXS5zdWJzdHIoNik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtaWQgPSBTRFBVdGlscy5nZW5lcmF0ZUlkZW50aWZpZXIoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVqZWN0IGRhdGFjaGFubmVscyB3aGljaCBhcmUgbm90IGltcGxlbWVudGVkIHlldC5cbiAgICAgICAgICAgIGlmIChraW5kID09PSAnYXBwbGljYXRpb24nICYmIG1saW5lWzJdID09PSAnRFRMUy9TQ1RQJykge1xuICAgICAgICAgICAgICBzZWxmLnRyYW5zY2VpdmVyc1tzZHBNTGluZUluZGV4XSA9IHtcbiAgICAgICAgICAgICAgICBtaWQ6IG1pZCxcbiAgICAgICAgICAgICAgICBpc0RhdGFjaGFubmVsOiB0cnVlXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHRyYW5zY2VpdmVyO1xuICAgICAgICAgICAgdmFyIGljZUdhdGhlcmVyO1xuICAgICAgICAgICAgdmFyIGljZVRyYW5zcG9ydDtcbiAgICAgICAgICAgIHZhciBkdGxzVHJhbnNwb3J0O1xuICAgICAgICAgICAgdmFyIHJ0cFNlbmRlcjtcbiAgICAgICAgICAgIHZhciBydHBSZWNlaXZlcjtcbiAgICAgICAgICAgIHZhciBzZW5kRW5jb2RpbmdQYXJhbWV0ZXJzO1xuICAgICAgICAgICAgdmFyIHJlY3ZFbmNvZGluZ1BhcmFtZXRlcnM7XG4gICAgICAgICAgICB2YXIgbG9jYWxDYXBhYmlsaXRpZXM7XG5cbiAgICAgICAgICAgIHZhciB0cmFjaztcbiAgICAgICAgICAgIC8vIEZJWE1FOiBlbnN1cmUgdGhlIG1lZGlhU2VjdGlvbiBoYXMgcnRjcC1tdXggc2V0LlxuICAgICAgICAgICAgdmFyIHJlbW90ZUNhcGFiaWxpdGllcyA9IFNEUFV0aWxzLnBhcnNlUnRwUGFyYW1ldGVycyhtZWRpYVNlY3Rpb24pO1xuICAgICAgICAgICAgdmFyIHJlbW90ZUljZVBhcmFtZXRlcnM7XG4gICAgICAgICAgICB2YXIgcmVtb3RlRHRsc1BhcmFtZXRlcnM7XG4gICAgICAgICAgICBpZiAoIXJlamVjdGVkKSB7XG4gICAgICAgICAgICAgIHJlbW90ZUljZVBhcmFtZXRlcnMgPSBTRFBVdGlscy5nZXRJY2VQYXJhbWV0ZXJzKG1lZGlhU2VjdGlvbixcbiAgICAgICAgICAgICAgICAgIHNlc3Npb25wYXJ0KTtcbiAgICAgICAgICAgICAgcmVtb3RlRHRsc1BhcmFtZXRlcnMgPSBTRFBVdGlscy5nZXREdGxzUGFyYW1ldGVycyhtZWRpYVNlY3Rpb24sXG4gICAgICAgICAgICAgICAgICBzZXNzaW9ucGFydCk7XG4gICAgICAgICAgICAgIHJlbW90ZUR0bHNQYXJhbWV0ZXJzLnJvbGUgPSAnY2xpZW50JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlY3ZFbmNvZGluZ1BhcmFtZXRlcnMgPVxuICAgICAgICAgICAgICAgIFNEUFV0aWxzLnBhcnNlUnRwRW5jb2RpbmdQYXJhbWV0ZXJzKG1lZGlhU2VjdGlvbik7XG5cbiAgICAgICAgICAgIHZhciBjbmFtZTtcbiAgICAgICAgICAgIC8vIEdldHMgdGhlIGZpcnN0IFNTUkMuIE5vdGUgdGhhdCB3aXRoIFJUWCB0aGVyZSBtaWdodCBiZSBtdWx0aXBsZVxuICAgICAgICAgICAgLy8gU1NSQ3MuXG4gICAgICAgICAgICB2YXIgcmVtb3RlU3NyYyA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiwgJ2E9c3NyYzonKVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIFNEUFV0aWxzLnBhcnNlU3NyY01lZGlhKGxpbmUpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbihvYmopIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBvYmouYXR0cmlidXRlID09PSAnY25hbWUnO1xuICAgICAgICAgICAgICAgIH0pWzBdO1xuICAgICAgICAgICAgaWYgKHJlbW90ZVNzcmMpIHtcbiAgICAgICAgICAgICAgY25hbWUgPSByZW1vdGVTc3JjLnZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgaXNDb21wbGV0ZSA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbixcbiAgICAgICAgICAgICAgICAnYT1lbmQtb2YtY2FuZGlkYXRlcycsIHNlc3Npb25wYXJ0KS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgdmFyIGNhbmRzID0gU0RQVXRpbHMubWF0Y2hQcmVmaXgobWVkaWFTZWN0aW9uLCAnYT1jYW5kaWRhdGU6JylcbiAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uKGNhbmQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBTRFBVdGlscy5wYXJzZUNhbmRpZGF0ZShjYW5kKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24oY2FuZCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbmQuY29tcG9uZW50ID09PSAnMSc7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24udHlwZSA9PT0gJ29mZmVyJyAmJiAhcmVqZWN0ZWQpIHtcbiAgICAgICAgICAgICAgdmFyIHRyYW5zcG9ydHMgPSBzZWxmLnVzaW5nQnVuZGxlICYmIHNkcE1MaW5lSW5kZXggPiAwID8ge1xuICAgICAgICAgICAgICAgIGljZUdhdGhlcmVyOiBzZWxmLnRyYW5zY2VpdmVyc1swXS5pY2VHYXRoZXJlcixcbiAgICAgICAgICAgICAgICBpY2VUcmFuc3BvcnQ6IHNlbGYudHJhbnNjZWl2ZXJzWzBdLmljZVRyYW5zcG9ydCxcbiAgICAgICAgICAgICAgICBkdGxzVHJhbnNwb3J0OiBzZWxmLnRyYW5zY2VpdmVyc1swXS5kdGxzVHJhbnNwb3J0XG4gICAgICAgICAgICAgIH0gOiBzZWxmLl9jcmVhdGVJY2VBbmREdGxzVHJhbnNwb3J0cyhtaWQsIHNkcE1MaW5lSW5kZXgpO1xuXG4gICAgICAgICAgICAgIGlmIChpc0NvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgdHJhbnNwb3J0cy5pY2VUcmFuc3BvcnQuc2V0UmVtb3RlQ2FuZGlkYXRlcyhjYW5kcyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBsb2NhbENhcGFiaWxpdGllcyA9IFJUQ1J0cFJlY2VpdmVyLmdldENhcGFiaWxpdGllcyhraW5kKTtcblxuICAgICAgICAgICAgICAvLyBmaWx0ZXIgUlRYIHVudGlsIGFkZGl0aW9uYWwgc3R1ZmYgbmVlZGVkIGZvciBSVFggaXMgaW1wbGVtZW50ZWRcbiAgICAgICAgICAgICAgLy8gaW4gYWRhcHRlci5qc1xuICAgICAgICAgICAgICBsb2NhbENhcGFiaWxpdGllcy5jb2RlY3MgPSBsb2NhbENhcGFiaWxpdGllcy5jb2RlY3MuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oY29kZWMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvZGVjLm5hbWUgIT09ICdydHgnO1xuICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgc2VuZEVuY29kaW5nUGFyYW1ldGVycyA9IFt7XG4gICAgICAgICAgICAgICAgc3NyYzogKDIgKiBzZHBNTGluZUluZGV4ICsgMikgKiAxMDAxXG4gICAgICAgICAgICAgIH1dO1xuXG4gICAgICAgICAgICAgIHJ0cFJlY2VpdmVyID0gbmV3IFJUQ1J0cFJlY2VpdmVyKHRyYW5zcG9ydHMuZHRsc1RyYW5zcG9ydCwga2luZCk7XG5cbiAgICAgICAgICAgICAgdHJhY2sgPSBydHBSZWNlaXZlci50cmFjaztcbiAgICAgICAgICAgICAgcmVjZWl2ZXJMaXN0LnB1c2goW3RyYWNrLCBydHBSZWNlaXZlcl0pO1xuICAgICAgICAgICAgICAvLyBGSVhNRTogbm90IGNvcnJlY3Qgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgc3RyZWFtcyBidXQgdGhhdCBpc1xuICAgICAgICAgICAgICAvLyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBpbiB0aGlzIHNoaW0uXG4gICAgICAgICAgICAgIHN0cmVhbS5hZGRUcmFjayh0cmFjayk7XG5cbiAgICAgICAgICAgICAgLy8gRklYTUU6IGxvb2sgYXQgZGlyZWN0aW9uLlxuICAgICAgICAgICAgICBpZiAoc2VsZi5sb2NhbFN0cmVhbXMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgICAgc2VsZi5sb2NhbFN0cmVhbXNbMF0uZ2V0VHJhY2tzKCkubGVuZ3RoID49IHNkcE1MaW5lSW5kZXgpIHtcbiAgICAgICAgICAgICAgICB2YXIgbG9jYWxUcmFjaztcbiAgICAgICAgICAgICAgICBpZiAoa2luZCA9PT0gJ2F1ZGlvJykge1xuICAgICAgICAgICAgICAgICAgbG9jYWxUcmFjayA9IHNlbGYubG9jYWxTdHJlYW1zWzBdLmdldEF1ZGlvVHJhY2tzKClbMF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChraW5kID09PSAndmlkZW8nKSB7XG4gICAgICAgICAgICAgICAgICBsb2NhbFRyYWNrID0gc2VsZi5sb2NhbFN0cmVhbXNbMF0uZ2V0VmlkZW9UcmFja3MoKVswXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsVHJhY2spIHtcbiAgICAgICAgICAgICAgICAgIHJ0cFNlbmRlciA9IG5ldyBSVENSdHBTZW5kZXIobG9jYWxUcmFjayxcbiAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRzLmR0bHNUcmFuc3BvcnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNlbGYudHJhbnNjZWl2ZXJzW3NkcE1MaW5lSW5kZXhdID0ge1xuICAgICAgICAgICAgICAgIGljZUdhdGhlcmVyOiB0cmFuc3BvcnRzLmljZUdhdGhlcmVyLFxuICAgICAgICAgICAgICAgIGljZVRyYW5zcG9ydDogdHJhbnNwb3J0cy5pY2VUcmFuc3BvcnQsXG4gICAgICAgICAgICAgICAgZHRsc1RyYW5zcG9ydDogdHJhbnNwb3J0cy5kdGxzVHJhbnNwb3J0LFxuICAgICAgICAgICAgICAgIGxvY2FsQ2FwYWJpbGl0aWVzOiBsb2NhbENhcGFiaWxpdGllcyxcbiAgICAgICAgICAgICAgICByZW1vdGVDYXBhYmlsaXRpZXM6IHJlbW90ZUNhcGFiaWxpdGllcyxcbiAgICAgICAgICAgICAgICBydHBTZW5kZXI6IHJ0cFNlbmRlcixcbiAgICAgICAgICAgICAgICBydHBSZWNlaXZlcjogcnRwUmVjZWl2ZXIsXG4gICAgICAgICAgICAgICAga2luZDoga2luZCxcbiAgICAgICAgICAgICAgICBtaWQ6IG1pZCxcbiAgICAgICAgICAgICAgICBjbmFtZTogY25hbWUsXG4gICAgICAgICAgICAgICAgc2VuZEVuY29kaW5nUGFyYW1ldGVyczogc2VuZEVuY29kaW5nUGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZWN2RW5jb2RpbmdQYXJhbWV0ZXJzOiByZWN2RW5jb2RpbmdQYXJhbWV0ZXJzXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBSVENSdHBSZWNlaXZlciBub3cuIFRoZSBSVFBTZW5kZXIgaXMgc3RhcnRlZCBpblxuICAgICAgICAgICAgICAvLyBzZXRMb2NhbERlc2NyaXB0aW9uLlxuICAgICAgICAgICAgICBzZWxmLl90cmFuc2NlaXZlKHNlbGYudHJhbnNjZWl2ZXJzW3NkcE1MaW5lSW5kZXhdLFxuICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09ICdzZW5kcmVjdicgfHwgZGlyZWN0aW9uID09PSAnc2VuZG9ubHknKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRpb24udHlwZSA9PT0gJ2Fuc3dlcicgJiYgIXJlamVjdGVkKSB7XG4gICAgICAgICAgICAgIHRyYW5zY2VpdmVyID0gc2VsZi50cmFuc2NlaXZlcnNbc2RwTUxpbmVJbmRleF07XG4gICAgICAgICAgICAgIGljZUdhdGhlcmVyID0gdHJhbnNjZWl2ZXIuaWNlR2F0aGVyZXI7XG4gICAgICAgICAgICAgIGljZVRyYW5zcG9ydCA9IHRyYW5zY2VpdmVyLmljZVRyYW5zcG9ydDtcbiAgICAgICAgICAgICAgZHRsc1RyYW5zcG9ydCA9IHRyYW5zY2VpdmVyLmR0bHNUcmFuc3BvcnQ7XG4gICAgICAgICAgICAgIHJ0cFNlbmRlciA9IHRyYW5zY2VpdmVyLnJ0cFNlbmRlcjtcbiAgICAgICAgICAgICAgcnRwUmVjZWl2ZXIgPSB0cmFuc2NlaXZlci5ydHBSZWNlaXZlcjtcbiAgICAgICAgICAgICAgc2VuZEVuY29kaW5nUGFyYW1ldGVycyA9IHRyYW5zY2VpdmVyLnNlbmRFbmNvZGluZ1BhcmFtZXRlcnM7XG4gICAgICAgICAgICAgIGxvY2FsQ2FwYWJpbGl0aWVzID0gdHJhbnNjZWl2ZXIubG9jYWxDYXBhYmlsaXRpZXM7XG5cbiAgICAgICAgICAgICAgc2VsZi50cmFuc2NlaXZlcnNbc2RwTUxpbmVJbmRleF0ucmVjdkVuY29kaW5nUGFyYW1ldGVycyA9XG4gICAgICAgICAgICAgICAgICByZWN2RW5jb2RpbmdQYXJhbWV0ZXJzO1xuICAgICAgICAgICAgICBzZWxmLnRyYW5zY2VpdmVyc1tzZHBNTGluZUluZGV4XS5yZW1vdGVDYXBhYmlsaXRpZXMgPVxuICAgICAgICAgICAgICAgICAgcmVtb3RlQ2FwYWJpbGl0aWVzO1xuICAgICAgICAgICAgICBzZWxmLnRyYW5zY2VpdmVyc1tzZHBNTGluZUluZGV4XS5jbmFtZSA9IGNuYW1lO1xuXG4gICAgICAgICAgICAgIGlmICgoaXNJY2VMaXRlIHx8IGlzQ29tcGxldGUpICYmIGNhbmRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGljZVRyYW5zcG9ydC5zZXRSZW1vdGVDYW5kaWRhdGVzKGNhbmRzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIXNlbGYudXNpbmdCdW5kbGUgfHwgc2RwTUxpbmVJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGljZVRyYW5zcG9ydC5zdGFydChpY2VHYXRoZXJlciwgcmVtb3RlSWNlUGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgICAgJ2NvbnRyb2xsaW5nJyk7XG4gICAgICAgICAgICAgICAgZHRsc1RyYW5zcG9ydC5zdGFydChyZW1vdGVEdGxzUGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzZWxmLl90cmFuc2NlaXZlKHRyYW5zY2VpdmVyLFxuICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID09PSAnc2VuZHJlY3YnIHx8IGRpcmVjdGlvbiA9PT0gJ3JlY3Zvbmx5JyxcbiAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9PT0gJ3NlbmRyZWN2JyB8fCBkaXJlY3Rpb24gPT09ICdzZW5kb25seScpO1xuXG4gICAgICAgICAgICAgIGlmIChydHBSZWNlaXZlciAmJlxuICAgICAgICAgICAgICAgICAgKGRpcmVjdGlvbiA9PT0gJ3NlbmRyZWN2JyB8fCBkaXJlY3Rpb24gPT09ICdzZW5kb25seScpKSB7XG4gICAgICAgICAgICAgICAgdHJhY2sgPSBydHBSZWNlaXZlci50cmFjaztcbiAgICAgICAgICAgICAgICByZWNlaXZlckxpc3QucHVzaChbdHJhY2ssIHJ0cFJlY2VpdmVyXSk7XG4gICAgICAgICAgICAgICAgc3RyZWFtLmFkZFRyYWNrKHRyYWNrKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBGSVhNRTogYWN0dWFsbHkgdGhlIHJlY2VpdmVyIHNob3VsZCBiZSBjcmVhdGVkIGxhdGVyLlxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0cmFuc2NlaXZlci5ydHBSZWNlaXZlcjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy5yZW1vdGVEZXNjcmlwdGlvbiA9IHtcbiAgICAgICAgICAgIHR5cGU6IGRlc2NyaXB0aW9uLnR5cGUsXG4gICAgICAgICAgICBzZHA6IGRlc2NyaXB0aW9uLnNkcFxuICAgICAgICAgIH07XG4gICAgICAgICAgc3dpdGNoIChkZXNjcmlwdGlvbi50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdvZmZlcic6XG4gICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVNpZ25hbGluZ1N0YXRlKCdoYXZlLXJlbW90ZS1vZmZlcicpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Fuc3dlcic6XG4gICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVNpZ25hbGluZ1N0YXRlKCdzdGFibGUnKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1bnN1cHBvcnRlZCB0eXBlIFwiJyArIGRlc2NyaXB0aW9uLnR5cGUgK1xuICAgICAgICAgICAgICAgICAgJ1wiJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdHJlYW0uZ2V0VHJhY2tzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICBzZWxmLnJlbW90ZVN0cmVhbXMucHVzaChzdHJlYW0pO1xuICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHZhciBldmVudCA9IG5ldyBFdmVudCgnYWRkc3RyZWFtJyk7XG4gICAgICAgICAgICAgIGV2ZW50LnN0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgICAgICAgc2VsZi5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgICAgaWYgKHNlbGYub25hZGRzdHJlYW0gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgIHNlbGYub25hZGRzdHJlYW0oZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmVjZWl2ZXJMaXN0LmZvckVhY2goZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgICAgICAgIHZhciB0cmFjayA9IGl0ZW1bMF07XG4gICAgICAgICAgICAgICAgdmFyIHJlY2VpdmVyID0gaXRlbVsxXTtcbiAgICAgICAgICAgICAgICB2YXIgdHJhY2tFdmVudCA9IG5ldyBFdmVudCgndHJhY2snKTtcbiAgICAgICAgICAgICAgICB0cmFja0V2ZW50LnRyYWNrID0gdHJhY2s7XG4gICAgICAgICAgICAgICAgdHJhY2tFdmVudC5yZWNlaXZlciA9IHJlY2VpdmVyO1xuICAgICAgICAgICAgICAgIHRyYWNrRXZlbnQuc3RyZWFtcyA9IFtzdHJlYW1dO1xuICAgICAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYub250cmFjayAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYub250cmFjayh0cmFja0V2ZW50KTtcbiAgICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHR5cGVvZiBhcmd1bWVudHNbMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGFyZ3VtZW50c1sxXSwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfTtcblxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMudHJhbnNjZWl2ZXJzLmZvckVhY2goZnVuY3Rpb24odHJhbnNjZWl2ZXIpIHtcbiAgICAgICAgLyogbm90IHlldFxuICAgICAgICBpZiAodHJhbnNjZWl2ZXIuaWNlR2F0aGVyZXIpIHtcbiAgICAgICAgICB0cmFuc2NlaXZlci5pY2VHYXRoZXJlci5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgICovXG4gICAgICAgIGlmICh0cmFuc2NlaXZlci5pY2VUcmFuc3BvcnQpIHtcbiAgICAgICAgICB0cmFuc2NlaXZlci5pY2VUcmFuc3BvcnQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFuc2NlaXZlci5kdGxzVHJhbnNwb3J0KSB7XG4gICAgICAgICAgdHJhbnNjZWl2ZXIuZHRsc1RyYW5zcG9ydC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYW5zY2VpdmVyLnJ0cFNlbmRlcikge1xuICAgICAgICAgIHRyYW5zY2VpdmVyLnJ0cFNlbmRlci5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYW5zY2VpdmVyLnJ0cFJlY2VpdmVyKSB7XG4gICAgICAgICAgdHJhbnNjZWl2ZXIucnRwUmVjZWl2ZXIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIEZJWE1FOiBjbGVhbiB1cCB0cmFja3MsIGxvY2FsIHN0cmVhbXMsIHJlbW90ZSBzdHJlYW1zLCBldGNcbiAgICAgIHRoaXMuX3VwZGF0ZVNpZ25hbGluZ1N0YXRlKCdjbG9zZWQnKTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHRoZSBzaWduYWxpbmcgc3RhdGUuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5fdXBkYXRlU2lnbmFsaW5nU3RhdGUgPVxuICAgICAgICBmdW5jdGlvbihuZXdTdGF0ZSkge1xuICAgICAgICAgIHRoaXMuc2lnbmFsaW5nU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgICB2YXIgZXZlbnQgPSBuZXcgRXZlbnQoJ3NpZ25hbGluZ3N0YXRlY2hhbmdlJyk7XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICBpZiAodGhpcy5vbnNpZ25hbGluZ3N0YXRlY2hhbmdlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm9uc2lnbmFsaW5nc3RhdGVjaGFuZ2UoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgIC8vIERldGVybWluZSB3aGV0aGVyIHRvIGZpcmUgdGhlIG5lZ290aWF0aW9ubmVlZGVkIGV2ZW50LlxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuX21heWJlRmlyZU5lZ290aWF0aW9uTmVlZGVkID1cbiAgICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgLy8gRmlyZSBhd2F5IChmb3Igbm93KS5cbiAgICAgICAgICB2YXIgZXZlbnQgPSBuZXcgRXZlbnQoJ25lZ290aWF0aW9ubmVlZGVkJyk7XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICBpZiAodGhpcy5vbm5lZ290aWF0aW9ubmVlZGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm9ubmVnb3RpYXRpb25uZWVkZWQoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgY29ubmVjdGlvbiBzdGF0ZS5cbiAgICB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLl91cGRhdGVDb25uZWN0aW9uU3RhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBuZXdTdGF0ZTtcbiAgICAgIHZhciBzdGF0ZXMgPSB7XG4gICAgICAgICduZXcnOiAwLFxuICAgICAgICBjbG9zZWQ6IDAsXG4gICAgICAgIGNvbm5lY3Rpbmc6IDAsXG4gICAgICAgIGNoZWNraW5nOiAwLFxuICAgICAgICBjb25uZWN0ZWQ6IDAsXG4gICAgICAgIGNvbXBsZXRlZDogMCxcbiAgICAgICAgZmFpbGVkOiAwXG4gICAgICB9O1xuICAgICAgdGhpcy50cmFuc2NlaXZlcnMuZm9yRWFjaChmdW5jdGlvbih0cmFuc2NlaXZlcikge1xuICAgICAgICBzdGF0ZXNbdHJhbnNjZWl2ZXIuaWNlVHJhbnNwb3J0LnN0YXRlXSsrO1xuICAgICAgICBzdGF0ZXNbdHJhbnNjZWl2ZXIuZHRsc1RyYW5zcG9ydC5zdGF0ZV0rKztcbiAgICAgIH0pO1xuICAgICAgLy8gSUNFVHJhbnNwb3J0LmNvbXBsZXRlZCBhbmQgY29ubmVjdGVkIGFyZSB0aGUgc2FtZSBmb3IgdGhpcyBwdXJwb3NlLlxuICAgICAgc3RhdGVzLmNvbm5lY3RlZCArPSBzdGF0ZXMuY29tcGxldGVkO1xuXG4gICAgICBuZXdTdGF0ZSA9ICduZXcnO1xuICAgICAgaWYgKHN0YXRlcy5mYWlsZWQgPiAwKSB7XG4gICAgICAgIG5ld1N0YXRlID0gJ2ZhaWxlZCc7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlcy5jb25uZWN0aW5nID4gMCB8fCBzdGF0ZXMuY2hlY2tpbmcgPiAwKSB7XG4gICAgICAgIG5ld1N0YXRlID0gJ2Nvbm5lY3RpbmcnO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZXMuZGlzY29ubmVjdGVkID4gMCkge1xuICAgICAgICBuZXdTdGF0ZSA9ICdkaXNjb25uZWN0ZWQnO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZXMubmV3ID4gMCkge1xuICAgICAgICBuZXdTdGF0ZSA9ICduZXcnO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZXMuY29ubmVjdGVkID4gMCB8fCBzdGF0ZXMuY29tcGxldGVkID4gMCkge1xuICAgICAgICBuZXdTdGF0ZSA9ICdjb25uZWN0ZWQnO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV3U3RhdGUgIT09IHNlbGYuaWNlQ29ubmVjdGlvblN0YXRlKSB7XG4gICAgICAgIHNlbGYuaWNlQ29ubmVjdGlvblN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIHZhciBldmVudCA9IG5ldyBFdmVudCgnaWNlY29ubmVjdGlvbnN0YXRlY2hhbmdlJyk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgIGlmICh0aGlzLm9uaWNlY29ubmVjdGlvbnN0YXRlY2hhbmdlICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5vbmljZWNvbm5lY3Rpb25zdGF0ZWNoYW5nZShldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVPZmZlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgaWYgKHRoaXMuX3BlbmRpbmdPZmZlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyZWF0ZU9mZmVyIGNhbGxlZCB3aGlsZSB0aGVyZSBpcyBhIHBlbmRpbmcgb2ZmZXIuJyk7XG4gICAgICB9XG4gICAgICB2YXIgb2ZmZXJPcHRpb25zO1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3VtZW50c1swXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvZmZlck9wdGlvbnMgPSBhcmd1bWVudHNbMF07XG4gICAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgb2ZmZXJPcHRpb25zID0gYXJndW1lbnRzWzJdO1xuICAgICAgfVxuXG4gICAgICB2YXIgdHJhY2tzID0gW107XG4gICAgICB2YXIgbnVtQXVkaW9UcmFja3MgPSAwO1xuICAgICAgdmFyIG51bVZpZGVvVHJhY2tzID0gMDtcbiAgICAgIC8vIERlZmF1bHQgdG8gc2VuZHJlY3YuXG4gICAgICBpZiAodGhpcy5sb2NhbFN0cmVhbXMubGVuZ3RoKSB7XG4gICAgICAgIG51bUF1ZGlvVHJhY2tzID0gdGhpcy5sb2NhbFN0cmVhbXNbMF0uZ2V0QXVkaW9UcmFja3MoKS5sZW5ndGg7XG4gICAgICAgIG51bVZpZGVvVHJhY2tzID0gdGhpcy5sb2NhbFN0cmVhbXNbMF0uZ2V0VmlkZW9UcmFja3MoKS5sZW5ndGg7XG4gICAgICB9XG4gICAgICAvLyBEZXRlcm1pbmUgbnVtYmVyIG9mIGF1ZGlvIGFuZCB2aWRlbyB0cmFja3Mgd2UgbmVlZCB0byBzZW5kL3JlY3YuXG4gICAgICBpZiAob2ZmZXJPcHRpb25zKSB7XG4gICAgICAgIC8vIFJlamVjdCBDaHJvbWUgbGVnYWN5IGNvbnN0cmFpbnRzLlxuICAgICAgICBpZiAob2ZmZXJPcHRpb25zLm1hbmRhdG9yeSB8fCBvZmZlck9wdGlvbnMub3B0aW9uYWwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAnTGVnYWN5IG1hbmRhdG9yeS9vcHRpb25hbCBjb25zdHJhaW50cyBub3Qgc3VwcG9ydGVkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvZmZlck9wdGlvbnMub2ZmZXJUb1JlY2VpdmVBdWRpbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbnVtQXVkaW9UcmFja3MgPSBvZmZlck9wdGlvbnMub2ZmZXJUb1JlY2VpdmVBdWRpbztcbiAgICAgICAgfVxuICAgICAgICBpZiAob2ZmZXJPcHRpb25zLm9mZmVyVG9SZWNlaXZlVmlkZW8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG51bVZpZGVvVHJhY2tzID0gb2ZmZXJPcHRpb25zLm9mZmVyVG9SZWNlaXZlVmlkZW87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmxvY2FsU3RyZWFtcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gUHVzaCBsb2NhbCBzdHJlYW1zLlxuICAgICAgICB0aGlzLmxvY2FsU3RyZWFtc1swXS5nZXRUcmFja3MoKS5mb3JFYWNoKGZ1bmN0aW9uKHRyYWNrKSB7XG4gICAgICAgICAgdHJhY2tzLnB1c2goe1xuICAgICAgICAgICAga2luZDogdHJhY2sua2luZCxcbiAgICAgICAgICAgIHRyYWNrOiB0cmFjayxcbiAgICAgICAgICAgIHdhbnRSZWNlaXZlOiB0cmFjay5raW5kID09PSAnYXVkaW8nID9cbiAgICAgICAgICAgICAgICBudW1BdWRpb1RyYWNrcyA+IDAgOiBudW1WaWRlb1RyYWNrcyA+IDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAodHJhY2sua2luZCA9PT0gJ2F1ZGlvJykge1xuICAgICAgICAgICAgbnVtQXVkaW9UcmFja3MtLTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLmtpbmQgPT09ICd2aWRlbycpIHtcbiAgICAgICAgICAgIG51bVZpZGVvVHJhY2tzLS07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIENyZWF0ZSBNLWxpbmVzIGZvciByZWN2b25seSBzdHJlYW1zLlxuICAgICAgd2hpbGUgKG51bUF1ZGlvVHJhY2tzID4gMCB8fCBudW1WaWRlb1RyYWNrcyA+IDApIHtcbiAgICAgICAgaWYgKG51bUF1ZGlvVHJhY2tzID4gMCkge1xuICAgICAgICAgIHRyYWNrcy5wdXNoKHtcbiAgICAgICAgICAgIGtpbmQ6ICdhdWRpbycsXG4gICAgICAgICAgICB3YW50UmVjZWl2ZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG51bUF1ZGlvVHJhY2tzLS07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG51bVZpZGVvVHJhY2tzID4gMCkge1xuICAgICAgICAgIHRyYWNrcy5wdXNoKHtcbiAgICAgICAgICAgIGtpbmQ6ICd2aWRlbycsXG4gICAgICAgICAgICB3YW50UmVjZWl2ZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG51bVZpZGVvVHJhY2tzLS07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHNkcCA9IFNEUFV0aWxzLndyaXRlU2Vzc2lvbkJvaWxlcnBsYXRlKCk7XG4gICAgICB2YXIgdHJhbnNjZWl2ZXJzID0gW107XG4gICAgICB0cmFja3MuZm9yRWFjaChmdW5jdGlvbihtbGluZSwgc2RwTUxpbmVJbmRleCkge1xuICAgICAgICAvLyBGb3IgZWFjaCB0cmFjaywgY3JlYXRlIGFuIGljZSBnYXRoZXJlciwgaWNlIHRyYW5zcG9ydCxcbiAgICAgICAgLy8gZHRscyB0cmFuc3BvcnQsIHBvdGVudGlhbGx5IHJ0cHNlbmRlciBhbmQgcnRwcmVjZWl2ZXIuXG4gICAgICAgIHZhciB0cmFjayA9IG1saW5lLnRyYWNrO1xuICAgICAgICB2YXIga2luZCA9IG1saW5lLmtpbmQ7XG4gICAgICAgIHZhciBtaWQgPSBTRFBVdGlscy5nZW5lcmF0ZUlkZW50aWZpZXIoKTtcblxuICAgICAgICB2YXIgdHJhbnNwb3J0cyA9IHNlbGYudXNpbmdCdW5kbGUgJiYgc2RwTUxpbmVJbmRleCA+IDAgPyB7XG4gICAgICAgICAgaWNlR2F0aGVyZXI6IHRyYW5zY2VpdmVyc1swXS5pY2VHYXRoZXJlcixcbiAgICAgICAgICBpY2VUcmFuc3BvcnQ6IHRyYW5zY2VpdmVyc1swXS5pY2VUcmFuc3BvcnQsXG4gICAgICAgICAgZHRsc1RyYW5zcG9ydDogdHJhbnNjZWl2ZXJzWzBdLmR0bHNUcmFuc3BvcnRcbiAgICAgICAgfSA6IHNlbGYuX2NyZWF0ZUljZUFuZER0bHNUcmFuc3BvcnRzKG1pZCwgc2RwTUxpbmVJbmRleCk7XG5cbiAgICAgICAgdmFyIGxvY2FsQ2FwYWJpbGl0aWVzID0gUlRDUnRwU2VuZGVyLmdldENhcGFiaWxpdGllcyhraW5kKTtcbiAgICAgICAgLy8gZmlsdGVyIFJUWCB1bnRpbCBhZGRpdGlvbmFsIHN0dWZmIG5lZWRlZCBmb3IgUlRYIGlzIGltcGxlbWVudGVkXG4gICAgICAgIC8vIGluIGFkYXB0ZXIuanNcbiAgICAgICAgbG9jYWxDYXBhYmlsaXRpZXMuY29kZWNzID0gbG9jYWxDYXBhYmlsaXRpZXMuY29kZWNzLmZpbHRlcihcbiAgICAgICAgICAgIGZ1bmN0aW9uKGNvZGVjKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjb2RlYy5uYW1lICE9PSAncnR4JztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBsb2NhbENhcGFiaWxpdGllcy5jb2RlY3MuZm9yRWFjaChmdW5jdGlvbihjb2RlYykge1xuICAgICAgICAgIC8vIHdvcmsgYXJvdW5kIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC93ZWJydGMvaXNzdWVzL2RldGFpbD9pZD02NTUyXG4gICAgICAgICAgLy8gYnkgYWRkaW5nIGxldmVsLWFzeW1tZXRyeS1hbGxvd2VkPTFcbiAgICAgICAgICBpZiAoY29kZWMubmFtZSA9PT0gJ0gyNjQnICYmXG4gICAgICAgICAgICAgIGNvZGVjLnBhcmFtZXRlcnNbJ2xldmVsLWFzeW1tZXRyeS1hbGxvd2VkJ10gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29kZWMucGFyYW1ldGVyc1snbGV2ZWwtYXN5bW1ldHJ5LWFsbG93ZWQnXSA9ICcxJztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBydHBTZW5kZXI7XG4gICAgICAgIHZhciBydHBSZWNlaXZlcjtcblxuICAgICAgICAvLyBnZW5lcmF0ZSBhbiBzc3JjIG5vdywgdG8gYmUgdXNlZCBsYXRlciBpbiBydHBTZW5kZXIuc2VuZFxuICAgICAgICB2YXIgc2VuZEVuY29kaW5nUGFyYW1ldGVycyA9IFt7XG4gICAgICAgICAgc3NyYzogKDIgKiBzZHBNTGluZUluZGV4ICsgMSkgKiAxMDAxXG4gICAgICAgIH1dO1xuICAgICAgICBpZiAodHJhY2spIHtcbiAgICAgICAgICBydHBTZW5kZXIgPSBuZXcgUlRDUnRwU2VuZGVyKHRyYWNrLCB0cmFuc3BvcnRzLmR0bHNUcmFuc3BvcnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1saW5lLndhbnRSZWNlaXZlKSB7XG4gICAgICAgICAgcnRwUmVjZWl2ZXIgPSBuZXcgUlRDUnRwUmVjZWl2ZXIodHJhbnNwb3J0cy5kdGxzVHJhbnNwb3J0LCBraW5kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyYW5zY2VpdmVyc1tzZHBNTGluZUluZGV4XSA9IHtcbiAgICAgICAgICBpY2VHYXRoZXJlcjogdHJhbnNwb3J0cy5pY2VHYXRoZXJlcixcbiAgICAgICAgICBpY2VUcmFuc3BvcnQ6IHRyYW5zcG9ydHMuaWNlVHJhbnNwb3J0LFxuICAgICAgICAgIGR0bHNUcmFuc3BvcnQ6IHRyYW5zcG9ydHMuZHRsc1RyYW5zcG9ydCxcbiAgICAgICAgICBsb2NhbENhcGFiaWxpdGllczogbG9jYWxDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgcmVtb3RlQ2FwYWJpbGl0aWVzOiBudWxsLFxuICAgICAgICAgIHJ0cFNlbmRlcjogcnRwU2VuZGVyLFxuICAgICAgICAgIHJ0cFJlY2VpdmVyOiBydHBSZWNlaXZlcixcbiAgICAgICAgICBraW5kOiBraW5kLFxuICAgICAgICAgIG1pZDogbWlkLFxuICAgICAgICAgIHNlbmRFbmNvZGluZ1BhcmFtZXRlcnM6IHNlbmRFbmNvZGluZ1BhcmFtZXRlcnMsXG4gICAgICAgICAgcmVjdkVuY29kaW5nUGFyYW1ldGVyczogbnVsbFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy51c2luZ0J1bmRsZSkge1xuICAgICAgICBzZHAgKz0gJ2E9Z3JvdXA6QlVORExFICcgKyB0cmFuc2NlaXZlcnMubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICByZXR1cm4gdC5taWQ7XG4gICAgICAgIH0pLmpvaW4oJyAnKSArICdcXHJcXG4nO1xuICAgICAgfVxuICAgICAgdHJhY2tzLmZvckVhY2goZnVuY3Rpb24obWxpbmUsIHNkcE1MaW5lSW5kZXgpIHtcbiAgICAgICAgdmFyIHRyYW5zY2VpdmVyID0gdHJhbnNjZWl2ZXJzW3NkcE1MaW5lSW5kZXhdO1xuICAgICAgICBzZHAgKz0gU0RQVXRpbHMud3JpdGVNZWRpYVNlY3Rpb24odHJhbnNjZWl2ZXIsXG4gICAgICAgICAgICB0cmFuc2NlaXZlci5sb2NhbENhcGFiaWxpdGllcywgJ29mZmVyJywgc2VsZi5sb2NhbFN0cmVhbXNbMF0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX3BlbmRpbmdPZmZlciA9IHRyYW5zY2VpdmVycztcbiAgICAgIHZhciBkZXNjID0gbmV3IFJUQ1Nlc3Npb25EZXNjcmlwdGlvbih7XG4gICAgICAgIHR5cGU6ICdvZmZlcicsXG4gICAgICAgIHNkcDogc2RwXG4gICAgICB9KTtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICYmIHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoYXJndW1lbnRzWzBdLCAwLCBkZXNjKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZGVzYyk7XG4gICAgfTtcblxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuY3JlYXRlQW5zd2VyID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIHZhciBzZHAgPSBTRFBVdGlscy53cml0ZVNlc3Npb25Cb2lsZXJwbGF0ZSgpO1xuICAgICAgaWYgKHRoaXMudXNpbmdCdW5kbGUpIHtcbiAgICAgICAgc2RwICs9ICdhPWdyb3VwOkJVTkRMRSAnICsgdGhpcy50cmFuc2NlaXZlcnMubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICByZXR1cm4gdC5taWQ7XG4gICAgICAgIH0pLmpvaW4oJyAnKSArICdcXHJcXG4nO1xuICAgICAgfVxuICAgICAgdGhpcy50cmFuc2NlaXZlcnMuZm9yRWFjaChmdW5jdGlvbih0cmFuc2NlaXZlcikge1xuICAgICAgICBpZiAodHJhbnNjZWl2ZXIuaXNEYXRhY2hhbm5lbCkge1xuICAgICAgICAgIHNkcCArPSAnbT1hcHBsaWNhdGlvbiAwIERUTFMvU0NUUCA1MDAwXFxyXFxuJyArXG4gICAgICAgICAgICAgICdjPUlOIElQNCAwLjAuMC4wXFxyXFxuJyArXG4gICAgICAgICAgICAgICdhPW1pZDonICsgdHJhbnNjZWl2ZXIubWlkICsgJ1xcclxcbic7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIENhbGN1bGF0ZSBpbnRlcnNlY3Rpb24gb2YgY2FwYWJpbGl0aWVzLlxuICAgICAgICB2YXIgY29tbW9uQ2FwYWJpbGl0aWVzID0gc2VsZi5fZ2V0Q29tbW9uQ2FwYWJpbGl0aWVzKFxuICAgICAgICAgICAgdHJhbnNjZWl2ZXIubG9jYWxDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICB0cmFuc2NlaXZlci5yZW1vdGVDYXBhYmlsaXRpZXMpO1xuXG4gICAgICAgIHNkcCArPSBTRFBVdGlscy53cml0ZU1lZGlhU2VjdGlvbih0cmFuc2NlaXZlciwgY29tbW9uQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgJ2Fuc3dlcicsIHNlbGYubG9jYWxTdHJlYW1zWzBdKTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgZGVzYyA9IG5ldyBSVENTZXNzaW9uRGVzY3JpcHRpb24oe1xuICAgICAgICB0eXBlOiAnYW5zd2VyJyxcbiAgICAgICAgc2RwOiBzZHBcbiAgICAgIH0pO1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggJiYgdHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3aW5kb3cuc2V0VGltZW91dChhcmd1bWVudHNbMF0sIDAsIGRlc2MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShkZXNjKTtcbiAgICB9O1xuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5hZGRJY2VDYW5kaWRhdGUgPSBmdW5jdGlvbihjYW5kaWRhdGUpIHtcbiAgICAgIGlmICghY2FuZGlkYXRlKSB7XG4gICAgICAgIHRoaXMudHJhbnNjZWl2ZXJzLmZvckVhY2goZnVuY3Rpb24odHJhbnNjZWl2ZXIpIHtcbiAgICAgICAgICB0cmFuc2NlaXZlci5pY2VUcmFuc3BvcnQuYWRkUmVtb3RlQ2FuZGlkYXRlKHt9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbUxpbmVJbmRleCA9IGNhbmRpZGF0ZS5zZHBNTGluZUluZGV4O1xuICAgICAgICBpZiAoY2FuZGlkYXRlLnNkcE1pZCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy50cmFuc2NlaXZlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zY2VpdmVyc1tpXS5taWQgPT09IGNhbmRpZGF0ZS5zZHBNaWQpIHtcbiAgICAgICAgICAgICAgbUxpbmVJbmRleCA9IGk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgdHJhbnNjZWl2ZXIgPSB0aGlzLnRyYW5zY2VpdmVyc1ttTGluZUluZGV4XTtcbiAgICAgICAgaWYgKHRyYW5zY2VpdmVyKSB7XG4gICAgICAgICAgdmFyIGNhbmQgPSBPYmplY3Qua2V5cyhjYW5kaWRhdGUuY2FuZGlkYXRlKS5sZW5ndGggPiAwID9cbiAgICAgICAgICAgICAgU0RQVXRpbHMucGFyc2VDYW5kaWRhdGUoY2FuZGlkYXRlLmNhbmRpZGF0ZSkgOiB7fTtcbiAgICAgICAgICAvLyBJZ25vcmUgQ2hyb21lJ3MgaW52YWxpZCBjYW5kaWRhdGVzIHNpbmNlIEVkZ2UgZG9lcyBub3QgbGlrZSB0aGVtLlxuICAgICAgICAgIGlmIChjYW5kLnByb3RvY29sID09PSAndGNwJyAmJiAoY2FuZC5wb3J0ID09PSAwIHx8IGNhbmQucG9ydCA9PT0gOSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSWdub3JlIFJUQ1AgY2FuZGlkYXRlcywgd2UgYXNzdW1lIFJUQ1AtTVVYLlxuICAgICAgICAgIGlmIChjYW5kLmNvbXBvbmVudCAhPT0gJzEnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEEgZGlydHkgaGFjayB0byBtYWtlIHNhbXBsZXMgd29yay5cbiAgICAgICAgICBpZiAoY2FuZC50eXBlID09PSAnZW5kT2ZDYW5kaWRhdGVzJykge1xuICAgICAgICAgICAgY2FuZCA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cmFuc2NlaXZlci5pY2VUcmFuc3BvcnQuYWRkUmVtb3RlQ2FuZGlkYXRlKGNhbmQpO1xuXG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSByZW1vdGVEZXNjcmlwdGlvbi5cbiAgICAgICAgICB2YXIgc2VjdGlvbnMgPSBTRFBVdGlscy5zcGxpdFNlY3Rpb25zKHRoaXMucmVtb3RlRGVzY3JpcHRpb24uc2RwKTtcbiAgICAgICAgICBzZWN0aW9uc1ttTGluZUluZGV4ICsgMV0gKz0gKGNhbmQudHlwZSA/IGNhbmRpZGF0ZS5jYW5kaWRhdGUudHJpbSgpXG4gICAgICAgICAgICAgIDogJ2E9ZW5kLW9mLWNhbmRpZGF0ZXMnKSArICdcXHJcXG4nO1xuICAgICAgICAgIHRoaXMucmVtb3RlRGVzY3JpcHRpb24uc2RwID0gc2VjdGlvbnMuam9pbignJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB0eXBlb2YgYXJndW1lbnRzWzFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGFyZ3VtZW50c1sxXSwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfTtcblxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuZ2V0U3RhdHMgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBwcm9taXNlcyA9IFtdO1xuICAgICAgdGhpcy50cmFuc2NlaXZlcnMuZm9yRWFjaChmdW5jdGlvbih0cmFuc2NlaXZlcikge1xuICAgICAgICBbJ3J0cFNlbmRlcicsICdydHBSZWNlaXZlcicsICdpY2VHYXRoZXJlcicsICdpY2VUcmFuc3BvcnQnLFxuICAgICAgICAgICAgJ2R0bHNUcmFuc3BvcnQnXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgICAgICAgICBpZiAodHJhbnNjZWl2ZXJbbWV0aG9kXSkge1xuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2godHJhbnNjZWl2ZXJbbWV0aG9kXS5nZXRTdGF0cygpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBjYiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHR5cGVvZiBhcmd1bWVudHNbMV0gPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgICBhcmd1bWVudHNbMV07XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSkge1xuICAgICAgICAvLyBzaGltIGdldFN0YXRzIHdpdGggbWFwbGlrZSBzdXBwb3J0XG4gICAgICAgIHZhciByZXN1bHRzID0gbmV3IE1hcCgpO1xuICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbihyZXMpIHtcbiAgICAgICAgICByZXMuZm9yRWFjaChmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHJlc3VsdCkuZm9yRWFjaChmdW5jdGlvbihpZCkge1xuICAgICAgICAgICAgICByZXN1bHRzLnNldChpZCwgcmVzdWx0W2lkXSk7XG4gICAgICAgICAgICAgIHJlc3VsdHNbaWRdID0gcmVzdWx0W2lkXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChjYikge1xuICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoY2IsIDAsIHJlc3VsdHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKHJlc3VsdHMpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn07XG5cbi8vIEV4cG9zZSBwdWJsaWMgbWV0aG9kcy5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzaGltUGVlckNvbm5lY3Rpb246IGVkZ2VTaGltLnNoaW1QZWVyQ29ubmVjdGlvbixcbiAgc2hpbUdldFVzZXJNZWRpYTogcmVxdWlyZSgnLi9nZXR1c2VybWVkaWEnKVxufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi93ZWJydGMtYWRhcHRlci9zcmMvanMvZWRnZS9lZGdlX3NoaW0uanNcbi8vIG1vZHVsZSBpZCA9IDQ2M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 464 */
/***/ function(module, exports) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\n// Expose public methods.\nmodule.exports = function() {\n  var shimError_ = function(e) {\n    return {\n      name: {PermissionDeniedError: 'NotAllowedError'}[e.name] || e.name,\n      message: e.message,\n      constraint: e.constraint,\n      toString: function() {\n        return this.name;\n      }\n    };\n  };\n\n  // getUserMedia error shim.\n  var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n      bind(navigator.mediaDevices);\n  navigator.mediaDevices.getUserMedia = function(c) {\n    return origGetUserMedia(c).catch(function(e) {\n      return Promise.reject(shimError_(e));\n    });\n  };\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDY0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy93ZWJydGMtYWRhcHRlci9zcmMvanMvZWRnZS9nZXR1c2VybWVkaWEuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqICBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFdlYlJUQyBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2VcbiAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2VcbiAqICB0cmVlLlxuICovXG4gLyogZXNsaW50LWVudiBub2RlICovXG4ndXNlIHN0cmljdCc7XG5cbi8vIEV4cG9zZSBwdWJsaWMgbWV0aG9kcy5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzaGltRXJyb3JfID0gZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiB7UGVybWlzc2lvbkRlbmllZEVycm9yOiAnTm90QWxsb3dlZEVycm9yJ31bZS5uYW1lXSB8fCBlLm5hbWUsXG4gICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICBjb25zdHJhaW50OiBlLmNvbnN0cmFpbnQsXG4gICAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICAvLyBnZXRVc2VyTWVkaWEgZXJyb3Igc2hpbS5cbiAgdmFyIG9yaWdHZXRVc2VyTWVkaWEgPSBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYS5cbiAgICAgIGJpbmQobmF2aWdhdG9yLm1lZGlhRGV2aWNlcyk7XG4gIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhID0gZnVuY3Rpb24oYykge1xuICAgIHJldHVybiBvcmlnR2V0VXNlck1lZGlhKGMpLmNhdGNoKGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChzaGltRXJyb3JfKGUpKTtcbiAgICB9KTtcbiAgfTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vd2VicnRjLWFkYXB0ZXIvc3JjL2pzL2VkZ2UvZ2V0dXNlcm1lZGlhLmpzXG4vLyBtb2R1bGUgaWQgPSA0NjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 465 */
/***/ function(module, exports, __webpack_require__) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar browserDetails = __webpack_require__(460).browserDetails;\n\nvar firefoxShim = {\n  shimOnTrack: function() {\n    if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n        window.RTCPeerConnection.prototype)) {\n      Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n        get: function() {\n          return this._ontrack;\n        },\n        set: function(f) {\n          if (this._ontrack) {\n            this.removeEventListener('track', this._ontrack);\n            this.removeEventListener('addstream', this._ontrackpoly);\n          }\n          this.addEventListener('track', this._ontrack = f);\n          this.addEventListener('addstream', this._ontrackpoly = function(e) {\n            e.stream.getTracks().forEach(function(track) {\n              var event = new Event('track');\n              event.track = track;\n              event.receiver = {track: track};\n              event.streams = [e.stream];\n              this.dispatchEvent(event);\n            }.bind(this));\n          }.bind(this));\n        }\n      });\n    }\n  },\n\n  shimSourceObject: function() {\n    // Firefox has supported mozSrcObject since FF22, unprefixed in 42.\n    if (typeof window === 'object') {\n      if (window.HTMLMediaElement &&\n        !('srcObject' in window.HTMLMediaElement.prototype)) {\n        // Shim the srcObject property, once, when HTMLMediaElement is found.\n        Object.defineProperty(window.HTMLMediaElement.prototype, 'srcObject', {\n          get: function() {\n            return this.mozSrcObject;\n          },\n          set: function(stream) {\n            this.mozSrcObject = stream;\n          }\n        });\n      }\n    }\n  },\n\n  shimPeerConnection: function() {\n    if (typeof window !== 'object' || !(window.RTCPeerConnection ||\n        window.mozRTCPeerConnection)) {\n      return; // probably media.peerconnection.enabled=false in about:config\n    }\n    // The RTCPeerConnection object.\n    if (!window.RTCPeerConnection) {\n      window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n        if (browserDetails.version < 38) {\n          // .urls is not supported in FF < 38.\n          // create RTCIceServers with a single url.\n          if (pcConfig && pcConfig.iceServers) {\n            var newIceServers = [];\n            for (var i = 0; i < pcConfig.iceServers.length; i++) {\n              var server = pcConfig.iceServers[i];\n              if (server.hasOwnProperty('urls')) {\n                for (var j = 0; j < server.urls.length; j++) {\n                  var newServer = {\n                    url: server.urls[j]\n                  };\n                  if (server.urls[j].indexOf('turn') === 0) {\n                    newServer.username = server.username;\n                    newServer.credential = server.credential;\n                  }\n                  newIceServers.push(newServer);\n                }\n              } else {\n                newIceServers.push(pcConfig.iceServers[i]);\n              }\n            }\n            pcConfig.iceServers = newIceServers;\n          }\n        }\n        return new mozRTCPeerConnection(pcConfig, pcConstraints);\n      };\n      window.RTCPeerConnection.prototype = mozRTCPeerConnection.prototype;\n\n      // wrap static methods. Currently just generateCertificate.\n      if (mozRTCPeerConnection.generateCertificate) {\n        Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n          get: function() {\n            return mozRTCPeerConnection.generateCertificate;\n          }\n        });\n      }\n\n      window.RTCSessionDescription = mozRTCSessionDescription;\n      window.RTCIceCandidate = mozRTCIceCandidate;\n    }\n\n    // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n    ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n        .forEach(function(method) {\n          var nativeMethod = RTCPeerConnection.prototype[method];\n          RTCPeerConnection.prototype[method] = function() {\n            arguments[0] = new ((method === 'addIceCandidate') ?\n                RTCIceCandidate : RTCSessionDescription)(arguments[0]);\n            return nativeMethod.apply(this, arguments);\n          };\n        });\n\n    // support for addIceCandidate(null or undefined)\n    var nativeAddIceCandidate =\n        RTCPeerConnection.prototype.addIceCandidate;\n    RTCPeerConnection.prototype.addIceCandidate = function() {\n      if (!arguments[0]) {\n        if (arguments[1]) {\n          arguments[1].apply(null);\n        }\n        return Promise.resolve();\n      }\n      return nativeAddIceCandidate.apply(this, arguments);\n    };\n\n    if (browserDetails.version < 48) {\n      // shim getStats with maplike support\n      var makeMapStats = function(stats) {\n        var map = new Map();\n        Object.keys(stats).forEach(function(key) {\n          map.set(key, stats[key]);\n          map[key] = stats[key];\n        });\n        return map;\n      };\n\n      var nativeGetStats = RTCPeerConnection.prototype.getStats;\n      RTCPeerConnection.prototype.getStats = function(selector, onSucc, onErr) {\n        return nativeGetStats.apply(this, [selector || null])\n          .then(function(stats) {\n            return makeMapStats(stats);\n          })\n          .then(onSucc, onErr);\n      };\n    }\n  }\n};\n\n// Expose public methods.\nmodule.exports = {\n  shimOnTrack: firefoxShim.shimOnTrack,\n  shimSourceObject: firefoxShim.shimSourceObject,\n  shimPeerConnection: firefoxShim.shimPeerConnection,\n  shimGetUserMedia: __webpack_require__(466)\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDY1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy93ZWJydGMtYWRhcHRlci9zcmMvanMvZmlyZWZveC9maXJlZm94X3NoaW0uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqICBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFdlYlJUQyBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2VcbiAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2VcbiAqICB0cmVlLlxuICovXG4gLyogZXNsaW50LWVudiBub2RlICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBicm93c2VyRGV0YWlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJykuYnJvd3NlckRldGFpbHM7XG5cbnZhciBmaXJlZm94U2hpbSA9IHtcbiAgc2hpbU9uVHJhY2s6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JyAmJiB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24gJiYgISgnb250cmFjaycgaW5cbiAgICAgICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZSkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLCAnb250cmFjaycsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fb250cmFjaztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbihmKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX29udHJhY2spIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHJhY2snLCB0aGlzLl9vbnRyYWNrKTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWRkc3RyZWFtJywgdGhpcy5fb250cmFja3BvbHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYWNrJywgdGhpcy5fb250cmFjayA9IGYpO1xuICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignYWRkc3RyZWFtJywgdGhpcy5fb250cmFja3BvbHkgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICBlLnN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKGZ1bmN0aW9uKHRyYWNrKSB7XG4gICAgICAgICAgICAgIHZhciBldmVudCA9IG5ldyBFdmVudCgndHJhY2snKTtcbiAgICAgICAgICAgICAgZXZlbnQudHJhY2sgPSB0cmFjaztcbiAgICAgICAgICAgICAgZXZlbnQucmVjZWl2ZXIgPSB7dHJhY2s6IHRyYWNrfTtcbiAgICAgICAgICAgICAgZXZlbnQuc3RyZWFtcyA9IFtlLnN0cmVhbV07XG4gICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBzaGltU291cmNlT2JqZWN0OiBmdW5jdGlvbigpIHtcbiAgICAvLyBGaXJlZm94IGhhcyBzdXBwb3J0ZWQgbW96U3JjT2JqZWN0IHNpbmNlIEZGMjIsIHVucHJlZml4ZWQgaW4gNDIuXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAod2luZG93LkhUTUxNZWRpYUVsZW1lbnQgJiZcbiAgICAgICAgISgnc3JjT2JqZWN0JyBpbiB3aW5kb3cuSFRNTE1lZGlhRWxlbWVudC5wcm90b3R5cGUpKSB7XG4gICAgICAgIC8vIFNoaW0gdGhlIHNyY09iamVjdCBwcm9wZXJ0eSwgb25jZSwgd2hlbiBIVE1MTWVkaWFFbGVtZW50IGlzIGZvdW5kLlxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LkhUTUxNZWRpYUVsZW1lbnQucHJvdG90eXBlLCAnc3JjT2JqZWN0Jywge1xuICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tb3pTcmNPYmplY3Q7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgICAgICAgICAgdGhpcy5tb3pTcmNPYmplY3QgPSBzdHJlYW07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgc2hpbVBlZXJDb25uZWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ29iamVjdCcgfHwgISh3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24gfHxcbiAgICAgICAgd2luZG93Lm1velJUQ1BlZXJDb25uZWN0aW9uKSkge1xuICAgICAgcmV0dXJuOyAvLyBwcm9iYWJseSBtZWRpYS5wZWVyY29ubmVjdGlvbi5lbmFibGVkPWZhbHNlIGluIGFib3V0OmNvbmZpZ1xuICAgIH1cbiAgICAvLyBUaGUgUlRDUGVlckNvbm5lY3Rpb24gb2JqZWN0LlxuICAgIGlmICghd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uKSB7XG4gICAgICB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24gPSBmdW5jdGlvbihwY0NvbmZpZywgcGNDb25zdHJhaW50cykge1xuICAgICAgICBpZiAoYnJvd3NlckRldGFpbHMudmVyc2lvbiA8IDM4KSB7XG4gICAgICAgICAgLy8gLnVybHMgaXMgbm90IHN1cHBvcnRlZCBpbiBGRiA8IDM4LlxuICAgICAgICAgIC8vIGNyZWF0ZSBSVENJY2VTZXJ2ZXJzIHdpdGggYSBzaW5nbGUgdXJsLlxuICAgICAgICAgIGlmIChwY0NvbmZpZyAmJiBwY0NvbmZpZy5pY2VTZXJ2ZXJzKSB7XG4gICAgICAgICAgICB2YXIgbmV3SWNlU2VydmVycyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwY0NvbmZpZy5pY2VTZXJ2ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBzZXJ2ZXIgPSBwY0NvbmZpZy5pY2VTZXJ2ZXJzW2ldO1xuICAgICAgICAgICAgICBpZiAoc2VydmVyLmhhc093blByb3BlcnR5KCd1cmxzJykpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNlcnZlci51cmxzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgbmV3U2VydmVyID0ge1xuICAgICAgICAgICAgICAgICAgICB1cmw6IHNlcnZlci51cmxzW2pdXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlci51cmxzW2pdLmluZGV4T2YoJ3R1cm4nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBuZXdTZXJ2ZXIudXNlcm5hbWUgPSBzZXJ2ZXIudXNlcm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIG5ld1NlcnZlci5jcmVkZW50aWFsID0gc2VydmVyLmNyZWRlbnRpYWw7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBuZXdJY2VTZXJ2ZXJzLnB1c2gobmV3U2VydmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3SWNlU2VydmVycy5wdXNoKHBjQ29uZmlnLmljZVNlcnZlcnNbaV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwY0NvbmZpZy5pY2VTZXJ2ZXJzID0gbmV3SWNlU2VydmVycztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBtb3pSVENQZWVyQ29ubmVjdGlvbihwY0NvbmZpZywgcGNDb25zdHJhaW50cyk7XG4gICAgICB9O1xuICAgICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZSA9IG1velJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZTtcblxuICAgICAgLy8gd3JhcCBzdGF0aWMgbWV0aG9kcy4gQ3VycmVudGx5IGp1c3QgZ2VuZXJhdGVDZXJ0aWZpY2F0ZS5cbiAgICAgIGlmIChtb3pSVENQZWVyQ29ubmVjdGlvbi5nZW5lcmF0ZUNlcnRpZmljYXRlKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24sICdnZW5lcmF0ZUNlcnRpZmljYXRlJywge1xuICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gbW96UlRDUGVlckNvbm5lY3Rpb24uZ2VuZXJhdGVDZXJ0aWZpY2F0ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB3aW5kb3cuUlRDU2Vzc2lvbkRlc2NyaXB0aW9uID0gbW96UlRDU2Vzc2lvbkRlc2NyaXB0aW9uO1xuICAgICAgd2luZG93LlJUQ0ljZUNhbmRpZGF0ZSA9IG1velJUQ0ljZUNhbmRpZGF0ZTtcbiAgICB9XG5cbiAgICAvLyBzaGltIGF3YXkgbmVlZCBmb3Igb2Jzb2xldGUgUlRDSWNlQ2FuZGlkYXRlL1JUQ1Nlc3Npb25EZXNjcmlwdGlvbi5cbiAgICBbJ3NldExvY2FsRGVzY3JpcHRpb24nLCAnc2V0UmVtb3RlRGVzY3JpcHRpb24nLCAnYWRkSWNlQ2FuZGlkYXRlJ11cbiAgICAgICAgLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICAgICAgdmFyIG5hdGl2ZU1ldGhvZCA9IFJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZVttZXRob2RdO1xuICAgICAgICAgIFJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBhcmd1bWVudHNbMF0gPSBuZXcgKChtZXRob2QgPT09ICdhZGRJY2VDYW5kaWRhdGUnKSA/XG4gICAgICAgICAgICAgICAgUlRDSWNlQ2FuZGlkYXRlIDogUlRDU2Vzc2lvbkRlc2NyaXB0aW9uKShhcmd1bWVudHNbMF0pO1xuICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZU1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgLy8gc3VwcG9ydCBmb3IgYWRkSWNlQ2FuZGlkYXRlKG51bGwgb3IgdW5kZWZpbmVkKVxuICAgIHZhciBuYXRpdmVBZGRJY2VDYW5kaWRhdGUgPVxuICAgICAgICBSVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuYWRkSWNlQ2FuZGlkYXRlO1xuICAgIFJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5hZGRJY2VDYW5kaWRhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghYXJndW1lbnRzWzBdKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHNbMV0pIHtcbiAgICAgICAgICBhcmd1bWVudHNbMV0uYXBwbHkobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5hdGl2ZUFkZEljZUNhbmRpZGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBpZiAoYnJvd3NlckRldGFpbHMudmVyc2lvbiA8IDQ4KSB7XG4gICAgICAvLyBzaGltIGdldFN0YXRzIHdpdGggbWFwbGlrZSBzdXBwb3J0XG4gICAgICB2YXIgbWFrZU1hcFN0YXRzID0gZnVuY3Rpb24oc3RhdHMpIHtcbiAgICAgICAgdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgT2JqZWN0LmtleXMoc3RhdHMpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgbWFwLnNldChrZXksIHN0YXRzW2tleV0pO1xuICAgICAgICAgIG1hcFtrZXldID0gc3RhdHNba2V5XTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgICB9O1xuXG4gICAgICB2YXIgbmF0aXZlR2V0U3RhdHMgPSBSVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuZ2V0U3RhdHM7XG4gICAgICBSVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuZ2V0U3RhdHMgPSBmdW5jdGlvbihzZWxlY3Rvciwgb25TdWNjLCBvbkVycikge1xuICAgICAgICByZXR1cm4gbmF0aXZlR2V0U3RhdHMuYXBwbHkodGhpcywgW3NlbGVjdG9yIHx8IG51bGxdKVxuICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHN0YXRzKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFrZU1hcFN0YXRzKHN0YXRzKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC50aGVuKG9uU3VjYywgb25FcnIpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIEV4cG9zZSBwdWJsaWMgbWV0aG9kcy5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzaGltT25UcmFjazogZmlyZWZveFNoaW0uc2hpbU9uVHJhY2ssXG4gIHNoaW1Tb3VyY2VPYmplY3Q6IGZpcmVmb3hTaGltLnNoaW1Tb3VyY2VPYmplY3QsXG4gIHNoaW1QZWVyQ29ubmVjdGlvbjogZmlyZWZveFNoaW0uc2hpbVBlZXJDb25uZWN0aW9uLFxuICBzaGltR2V0VXNlck1lZGlhOiByZXF1aXJlKCcuL2dldHVzZXJtZWRpYScpXG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3dlYnJ0Yy1hZGFwdGVyL3NyYy9qcy9maXJlZm94L2ZpcmVmb3hfc2hpbS5qc1xuLy8gbW9kdWxlIGlkID0gNDY1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 466 */
/***/ function(module, exports, __webpack_require__) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar logging = __webpack_require__(460).log;\nvar browserDetails = __webpack_require__(460).browserDetails;\n\n// Expose public methods.\nmodule.exports = function() {\n  var shimError_ = function(e) {\n    return {\n      name: {\n        SecurityError: 'NotAllowedError',\n        PermissionDeniedError: 'NotAllowedError'\n      }[e.name] || e.name,\n      message: {\n        'The operation is insecure.': 'The request is not allowed by the ' +\n        'user agent or the platform in the current context.'\n      }[e.message] || e.message,\n      constraint: e.constraint,\n      toString: function() {\n        return this.name + (this.message && ': ') + this.message;\n      }\n    };\n  };\n\n  // getUserMedia constraints shim.\n  var getUserMedia_ = function(constraints, onSuccess, onError) {\n    var constraintsToFF37_ = function(c) {\n      if (typeof c !== 'object' || c.require) {\n        return c;\n      }\n      var require = [];\n      Object.keys(c).forEach(function(key) {\n        if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n          return;\n        }\n        var r = c[key] = (typeof c[key] === 'object') ?\n            c[key] : {ideal: c[key]};\n        if (r.min !== undefined ||\n            r.max !== undefined || r.exact !== undefined) {\n          require.push(key);\n        }\n        if (r.exact !== undefined) {\n          if (typeof r.exact === 'number') {\n            r. min = r.max = r.exact;\n          } else {\n            c[key] = r.exact;\n          }\n          delete r.exact;\n        }\n        if (r.ideal !== undefined) {\n          c.advanced = c.advanced || [];\n          var oc = {};\n          if (typeof r.ideal === 'number') {\n            oc[key] = {min: r.ideal, max: r.ideal};\n          } else {\n            oc[key] = r.ideal;\n          }\n          c.advanced.push(oc);\n          delete r.ideal;\n          if (!Object.keys(r).length) {\n            delete c[key];\n          }\n        }\n      });\n      if (require.length) {\n        c.require = require;\n      }\n      return c;\n    };\n    constraints = JSON.parse(JSON.stringify(constraints));\n    if (browserDetails.version < 38) {\n      logging('spec: ' + JSON.stringify(constraints));\n      if (constraints.audio) {\n        constraints.audio = constraintsToFF37_(constraints.audio);\n      }\n      if (constraints.video) {\n        constraints.video = constraintsToFF37_(constraints.video);\n      }\n      logging('ff37: ' + JSON.stringify(constraints));\n    }\n    return navigator.mozGetUserMedia(constraints, onSuccess, function(e) {\n      onError(shimError_(e));\n    });\n  };\n\n  // Returns the result of getUserMedia as a Promise.\n  var getUserMediaPromise_ = function(constraints) {\n    return new Promise(function(resolve, reject) {\n      getUserMedia_(constraints, resolve, reject);\n    });\n  };\n\n  // Shim for mediaDevices on older versions.\n  if (!navigator.mediaDevices) {\n    navigator.mediaDevices = {getUserMedia: getUserMediaPromise_,\n      addEventListener: function() { },\n      removeEventListener: function() { }\n    };\n  }\n  navigator.mediaDevices.enumerateDevices =\n      navigator.mediaDevices.enumerateDevices || function() {\n        return new Promise(function(resolve) {\n          var infos = [\n            {kind: 'audioinput', deviceId: 'default', label: '', groupId: ''},\n            {kind: 'videoinput', deviceId: 'default', label: '', groupId: ''}\n          ];\n          resolve(infos);\n        });\n      };\n\n  if (browserDetails.version < 41) {\n    // Work around http://bugzil.la/1169665\n    var orgEnumerateDevices =\n        navigator.mediaDevices.enumerateDevices.bind(navigator.mediaDevices);\n    navigator.mediaDevices.enumerateDevices = function() {\n      return orgEnumerateDevices().then(undefined, function(e) {\n        if (e.name === 'NotFoundError') {\n          return [];\n        }\n        throw e;\n      });\n    };\n  }\n  if (browserDetails.version < 49) {\n    var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n        bind(navigator.mediaDevices);\n    navigator.mediaDevices.getUserMedia = function(c) {\n      return origGetUserMedia(c).then(function(stream) {\n        // Work around https://bugzil.la/802326\n        if (c.audio && !stream.getAudioTracks().length ||\n            c.video && !stream.getVideoTracks().length) {\n          stream.getTracks().forEach(function(track) {\n            track.stop();\n          });\n          throw new DOMException('The object can not be found here.',\n                                 'NotFoundError');\n        }\n        return stream;\n      }, function(e) {\n        return Promise.reject(shimError_(e));\n      });\n    };\n  }\n  navigator.getUserMedia = function(constraints, onSuccess, onError) {\n    if (browserDetails.version < 44) {\n      return getUserMedia_(constraints, onSuccess, onError);\n    }\n    // Replace Firefox 44+'s deprecation warning with unprefixed version.\n    console.warn('navigator.getUserMedia has been replaced by ' +\n                 'navigator.mediaDevices.getUserMedia');\n    navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n  };\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDY2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy93ZWJydGMtYWRhcHRlci9zcmMvanMvZmlyZWZveC9nZXR1c2VybWVkaWEuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqICBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFdlYlJUQyBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2VcbiAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2VcbiAqICB0cmVlLlxuICovXG4gLyogZXNsaW50LWVudiBub2RlICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBsb2dnaW5nID0gcmVxdWlyZSgnLi4vdXRpbHMnKS5sb2c7XG52YXIgYnJvd3NlckRldGFpbHMgPSByZXF1aXJlKCcuLi91dGlscycpLmJyb3dzZXJEZXRhaWxzO1xuXG4vLyBFeHBvc2UgcHVibGljIG1ldGhvZHMuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2hpbUVycm9yXyA9IGZ1bmN0aW9uKGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZToge1xuICAgICAgICBTZWN1cml0eUVycm9yOiAnTm90QWxsb3dlZEVycm9yJyxcbiAgICAgICAgUGVybWlzc2lvbkRlbmllZEVycm9yOiAnTm90QWxsb3dlZEVycm9yJ1xuICAgICAgfVtlLm5hbWVdIHx8IGUubmFtZSxcbiAgICAgIG1lc3NhZ2U6IHtcbiAgICAgICAgJ1RoZSBvcGVyYXRpb24gaXMgaW5zZWN1cmUuJzogJ1RoZSByZXF1ZXN0IGlzIG5vdCBhbGxvd2VkIGJ5IHRoZSAnICtcbiAgICAgICAgJ3VzZXIgYWdlbnQgb3IgdGhlIHBsYXRmb3JtIGluIHRoZSBjdXJyZW50IGNvbnRleHQuJ1xuICAgICAgfVtlLm1lc3NhZ2VdIHx8IGUubWVzc2FnZSxcbiAgICAgIGNvbnN0cmFpbnQ6IGUuY29uc3RyYWludCxcbiAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZSArICh0aGlzLm1lc3NhZ2UgJiYgJzogJykgKyB0aGlzLm1lc3NhZ2U7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICAvLyBnZXRVc2VyTWVkaWEgY29uc3RyYWludHMgc2hpbS5cbiAgdmFyIGdldFVzZXJNZWRpYV8gPSBmdW5jdGlvbihjb25zdHJhaW50cywgb25TdWNjZXNzLCBvbkVycm9yKSB7XG4gICAgdmFyIGNvbnN0cmFpbnRzVG9GRjM3XyA9IGZ1bmN0aW9uKGMpIHtcbiAgICAgIGlmICh0eXBlb2YgYyAhPT0gJ29iamVjdCcgfHwgYy5yZXF1aXJlKSB7XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfVxuICAgICAgdmFyIHJlcXVpcmUgPSBbXTtcbiAgICAgIE9iamVjdC5rZXlzKGMpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmIChrZXkgPT09ICdyZXF1aXJlJyB8fCBrZXkgPT09ICdhZHZhbmNlZCcgfHwga2V5ID09PSAnbWVkaWFTb3VyY2UnKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciByID0gY1trZXldID0gKHR5cGVvZiBjW2tleV0gPT09ICdvYmplY3QnKSA/XG4gICAgICAgICAgICBjW2tleV0gOiB7aWRlYWw6IGNba2V5XX07XG4gICAgICAgIGlmIChyLm1pbiAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICByLm1heCAhPT0gdW5kZWZpbmVkIHx8IHIuZXhhY3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlcXVpcmUucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLmV4YWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHIuZXhhY3QgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByLiBtaW4gPSByLm1heCA9IHIuZXhhY3Q7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNba2V5XSA9IHIuZXhhY3Q7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlbGV0ZSByLmV4YWN0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLmlkZWFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjLmFkdmFuY2VkID0gYy5hZHZhbmNlZCB8fCBbXTtcbiAgICAgICAgICB2YXIgb2MgPSB7fTtcbiAgICAgICAgICBpZiAodHlwZW9mIHIuaWRlYWwgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBvY1trZXldID0ge21pbjogci5pZGVhbCwgbWF4OiByLmlkZWFsfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2Nba2V5XSA9IHIuaWRlYWw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGMuYWR2YW5jZWQucHVzaChvYyk7XG4gICAgICAgICAgZGVsZXRlIHIuaWRlYWw7XG4gICAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhyKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChyZXF1aXJlLmxlbmd0aCkge1xuICAgICAgICBjLnJlcXVpcmUgPSByZXF1aXJlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGM7XG4gICAgfTtcbiAgICBjb25zdHJhaW50cyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoY29uc3RyYWludHMpKTtcbiAgICBpZiAoYnJvd3NlckRldGFpbHMudmVyc2lvbiA8IDM4KSB7XG4gICAgICBsb2dnaW5nKCdzcGVjOiAnICsgSlNPTi5zdHJpbmdpZnkoY29uc3RyYWludHMpKTtcbiAgICAgIGlmIChjb25zdHJhaW50cy5hdWRpbykge1xuICAgICAgICBjb25zdHJhaW50cy5hdWRpbyA9IGNvbnN0cmFpbnRzVG9GRjM3Xyhjb25zdHJhaW50cy5hdWRpbyk7XG4gICAgICB9XG4gICAgICBpZiAoY29uc3RyYWludHMudmlkZW8pIHtcbiAgICAgICAgY29uc3RyYWludHMudmlkZW8gPSBjb25zdHJhaW50c1RvRkYzN18oY29uc3RyYWludHMudmlkZW8pO1xuICAgICAgfVxuICAgICAgbG9nZ2luZygnZmYzNzogJyArIEpTT04uc3RyaW5naWZ5KGNvbnN0cmFpbnRzKSk7XG4gICAgfVxuICAgIHJldHVybiBuYXZpZ2F0b3IubW96R2V0VXNlck1lZGlhKGNvbnN0cmFpbnRzLCBvblN1Y2Nlc3MsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIG9uRXJyb3Ioc2hpbUVycm9yXyhlKSk7XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGdldFVzZXJNZWRpYSBhcyBhIFByb21pc2UuXG4gIHZhciBnZXRVc2VyTWVkaWFQcm9taXNlXyA9IGZ1bmN0aW9uKGNvbnN0cmFpbnRzKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZ2V0VXNlck1lZGlhXyhjb25zdHJhaW50cywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBTaGltIGZvciBtZWRpYURldmljZXMgb24gb2xkZXIgdmVyc2lvbnMuXG4gIGlmICghbmF2aWdhdG9yLm1lZGlhRGV2aWNlcykge1xuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMgPSB7Z2V0VXNlck1lZGlhOiBnZXRVc2VyTWVkaWFQcm9taXNlXyxcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uKCkgeyB9LFxuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24oKSB7IH1cbiAgICB9O1xuICB9XG4gIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcyA9XG4gICAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMgfHwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7XG4gICAgICAgICAgdmFyIGluZm9zID0gW1xuICAgICAgICAgICAge2tpbmQ6ICdhdWRpb2lucHV0JywgZGV2aWNlSWQ6ICdkZWZhdWx0JywgbGFiZWw6ICcnLCBncm91cElkOiAnJ30sXG4gICAgICAgICAgICB7a2luZDogJ3ZpZGVvaW5wdXQnLCBkZXZpY2VJZDogJ2RlZmF1bHQnLCBsYWJlbDogJycsIGdyb3VwSWQ6ICcnfVxuICAgICAgICAgIF07XG4gICAgICAgICAgcmVzb2x2ZShpbmZvcyk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICBpZiAoYnJvd3NlckRldGFpbHMudmVyc2lvbiA8IDQxKSB7XG4gICAgLy8gV29yayBhcm91bmQgaHR0cDovL2J1Z3ppbC5sYS8xMTY5NjY1XG4gICAgdmFyIG9yZ0VudW1lcmF0ZURldmljZXMgPVxuICAgICAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMuYmluZChuYXZpZ2F0b3IubWVkaWFEZXZpY2VzKTtcbiAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBvcmdFbnVtZXJhdGVEZXZpY2VzKCkudGhlbih1bmRlZmluZWQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgaWYgKGUubmFtZSA9PT0gJ05vdEZvdW5kRXJyb3InKSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG4gIGlmIChicm93c2VyRGV0YWlscy52ZXJzaW9uIDwgNDkpIHtcbiAgICB2YXIgb3JpZ0dldFVzZXJNZWRpYSA9IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhLlxuICAgICAgICBiaW5kKG5hdmlnYXRvci5tZWRpYURldmljZXMpO1xuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhID0gZnVuY3Rpb24oYykge1xuICAgICAgcmV0dXJuIG9yaWdHZXRVc2VyTWVkaWEoYykudGhlbihmdW5jdGlvbihzdHJlYW0pIHtcbiAgICAgICAgLy8gV29yayBhcm91bmQgaHR0cHM6Ly9idWd6aWwubGEvODAyMzI2XG4gICAgICAgIGlmIChjLmF1ZGlvICYmICFzdHJlYW0uZ2V0QXVkaW9UcmFja3MoKS5sZW5ndGggfHxcbiAgICAgICAgICAgIGMudmlkZW8gJiYgIXN0cmVhbS5nZXRWaWRlb1RyYWNrcygpLmxlbmd0aCkge1xuICAgICAgICAgIHN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKGZ1bmN0aW9uKHRyYWNrKSB7XG4gICAgICAgICAgICB0cmFjay5zdG9wKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignVGhlIG9iamVjdCBjYW4gbm90IGJlIGZvdW5kIGhlcmUuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOb3RGb3VuZEVycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cmVhbTtcbiAgICAgIH0sIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHNoaW1FcnJvcl8oZSkpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuICBuYXZpZ2F0b3IuZ2V0VXNlck1lZGlhID0gZnVuY3Rpb24oY29uc3RyYWludHMsIG9uU3VjY2Vzcywgb25FcnJvcikge1xuICAgIGlmIChicm93c2VyRGV0YWlscy52ZXJzaW9uIDwgNDQpIHtcbiAgICAgIHJldHVybiBnZXRVc2VyTWVkaWFfKGNvbnN0cmFpbnRzLCBvblN1Y2Nlc3MsIG9uRXJyb3IpO1xuICAgIH1cbiAgICAvLyBSZXBsYWNlIEZpcmVmb3ggNDQrJ3MgZGVwcmVjYXRpb24gd2FybmluZyB3aXRoIHVucHJlZml4ZWQgdmVyc2lvbi5cbiAgICBjb25zb2xlLndhcm4oJ25hdmlnYXRvci5nZXRVc2VyTWVkaWEgaGFzIGJlZW4gcmVwbGFjZWQgYnkgJyArXG4gICAgICAgICAgICAgICAgICduYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYScpO1xuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKGNvbnN0cmFpbnRzKS50aGVuKG9uU3VjY2Vzcywgb25FcnJvcik7XG4gIH07XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3dlYnJ0Yy1hZGFwdGVyL3NyYy9qcy9maXJlZm94L2dldHVzZXJtZWRpYS5qc1xuLy8gbW9kdWxlIGlkID0gNDY2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 467 */
/***/ function(module, exports) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n'use strict';\nvar safariShim = {\n  // TODO: DrAlex, should be here, double check against LayoutTests\n  // shimOnTrack: function() { },\n\n  // TODO: once the back-end for the mac port is done, add.\n  // TODO: check for webkitGTK+\n  // shimPeerConnection: function() { },\n\n  shimGetUserMedia: function() {\n    navigator.getUserMedia = navigator.webkitGetUserMedia;\n  }\n};\n\n// Expose public methods.\nmodule.exports = {\n  shimGetUserMedia: safariShim.shimGetUserMedia\n  // TODO\n  // shimOnTrack: safariShim.shimOnTrack,\n  // shimPeerConnection: safariShim.shimPeerConnection\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDY3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy93ZWJydGMtYWRhcHRlci9zcmMvanMvc2FmYXJpL3NhZmFyaV9zaGltLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiAgQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBXZWJSVEMgcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlXG4gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlXG4gKiAgdHJlZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xudmFyIHNhZmFyaVNoaW0gPSB7XG4gIC8vIFRPRE86IERyQWxleCwgc2hvdWxkIGJlIGhlcmUsIGRvdWJsZSBjaGVjayBhZ2FpbnN0IExheW91dFRlc3RzXG4gIC8vIHNoaW1PblRyYWNrOiBmdW5jdGlvbigpIHsgfSxcblxuICAvLyBUT0RPOiBvbmNlIHRoZSBiYWNrLWVuZCBmb3IgdGhlIG1hYyBwb3J0IGlzIGRvbmUsIGFkZC5cbiAgLy8gVE9ETzogY2hlY2sgZm9yIHdlYmtpdEdUSytcbiAgLy8gc2hpbVBlZXJDb25uZWN0aW9uOiBmdW5jdGlvbigpIHsgfSxcblxuICBzaGltR2V0VXNlck1lZGlhOiBmdW5jdGlvbigpIHtcbiAgICBuYXZpZ2F0b3IuZ2V0VXNlck1lZGlhID0gbmF2aWdhdG9yLndlYmtpdEdldFVzZXJNZWRpYTtcbiAgfVxufTtcblxuLy8gRXhwb3NlIHB1YmxpYyBtZXRob2RzLlxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNoaW1HZXRVc2VyTWVkaWE6IHNhZmFyaVNoaW0uc2hpbUdldFVzZXJNZWRpYVxuICAvLyBUT0RPXG4gIC8vIHNoaW1PblRyYWNrOiBzYWZhcmlTaGltLnNoaW1PblRyYWNrLFxuICAvLyBzaGltUGVlckNvbm5lY3Rpb246IHNhZmFyaVNoaW0uc2hpbVBlZXJDb25uZWN0aW9uXG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3dlYnJ0Yy1hZGFwdGVyL3NyYy9qcy9zYWZhcmkvc2FmYXJpX3NoaW0uanNcbi8vIG1vZHVsZSBpZCA9IDQ2N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 468 */
/***/ function(module, exports, __webpack_require__) {

    eval("var support = __webpack_require__(469);\n\n\nfunction GainController(stream) {\n    this.support = support.webAudio && support.mediaStream;\n\n    // set our starting value\n    this.gain = 1;\n\n    if (this.support) {\n        var context = this.context = new support.AudioContext();\n        this.microphone = context.createMediaStreamSource(stream);\n        this.gainFilter = context.createGain();\n        this.destination = context.createMediaStreamDestination();\n        this.outputStream = this.destination.stream;\n        this.microphone.connect(this.gainFilter);\n        this.gainFilter.connect(this.destination);\n        stream.addTrack(this.outputStream.getAudioTracks()[0]);\n        stream.removeTrack(stream.getAudioTracks()[0]);\n    }\n    this.stream = stream;\n}\n\n// setting\nGainController.prototype.setGain = function (val) {\n    // check for support\n    if (!this.support) return;\n    this.gainFilter.gain.value = val;\n    this.gain = val;\n};\n\nGainController.prototype.getGain = function () {\n    return this.gain;\n};\n\nGainController.prototype.off = function () {\n    return this.setGain(0);\n};\n\nGainController.prototype.on = function () {\n    this.setGain(1);\n};\n\n\nmodule.exports = GainController;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDY4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9tZWRpYXN0cmVhbS1nYWluL21lZGlhc3RyZWFtLWdhaW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHN1cHBvcnQgPSByZXF1aXJlKCd3ZWJydGNzdXBwb3J0Jyk7XG5cblxuZnVuY3Rpb24gR2FpbkNvbnRyb2xsZXIoc3RyZWFtKSB7XG4gICAgdGhpcy5zdXBwb3J0ID0gc3VwcG9ydC53ZWJBdWRpbyAmJiBzdXBwb3J0Lm1lZGlhU3RyZWFtO1xuXG4gICAgLy8gc2V0IG91ciBzdGFydGluZyB2YWx1ZVxuICAgIHRoaXMuZ2FpbiA9IDE7XG5cbiAgICBpZiAodGhpcy5zdXBwb3J0KSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5jb250ZXh0ID0gbmV3IHN1cHBvcnQuQXVkaW9Db250ZXh0KCk7XG4gICAgICAgIHRoaXMubWljcm9waG9uZSA9IGNvbnRleHQuY3JlYXRlTWVkaWFTdHJlYW1Tb3VyY2Uoc3RyZWFtKTtcbiAgICAgICAgdGhpcy5nYWluRmlsdGVyID0gY29udGV4dC5jcmVhdGVHYWluKCk7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBjb250ZXh0LmNyZWF0ZU1lZGlhU3RyZWFtRGVzdGluYXRpb24oKTtcbiAgICAgICAgdGhpcy5vdXRwdXRTdHJlYW0gPSB0aGlzLmRlc3RpbmF0aW9uLnN0cmVhbTtcbiAgICAgICAgdGhpcy5taWNyb3Bob25lLmNvbm5lY3QodGhpcy5nYWluRmlsdGVyKTtcbiAgICAgICAgdGhpcy5nYWluRmlsdGVyLmNvbm5lY3QodGhpcy5kZXN0aW5hdGlvbik7XG4gICAgICAgIHN0cmVhbS5hZGRUcmFjayh0aGlzLm91dHB1dFN0cmVhbS5nZXRBdWRpb1RyYWNrcygpWzBdKTtcbiAgICAgICAgc3RyZWFtLnJlbW92ZVRyYWNrKHN0cmVhbS5nZXRBdWRpb1RyYWNrcygpWzBdKTtcbiAgICB9XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG59XG5cbi8vIHNldHRpbmdcbkdhaW5Db250cm9sbGVyLnByb3RvdHlwZS5zZXRHYWluID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIC8vIGNoZWNrIGZvciBzdXBwb3J0XG4gICAgaWYgKCF0aGlzLnN1cHBvcnQpIHJldHVybjtcbiAgICB0aGlzLmdhaW5GaWx0ZXIuZ2Fpbi52YWx1ZSA9IHZhbDtcbiAgICB0aGlzLmdhaW4gPSB2YWw7XG59O1xuXG5HYWluQ29udHJvbGxlci5wcm90b3R5cGUuZ2V0R2FpbiA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5nYWluO1xufTtcblxuR2FpbkNvbnRyb2xsZXIucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRHYWluKDApO1xufTtcblxuR2FpbkNvbnRyb2xsZXIucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuc2V0R2FpbigxKTtcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBHYWluQ29udHJvbGxlcjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9tZWRpYXN0cmVhbS1nYWluL21lZGlhc3RyZWFtLWdhaW4uanNcbi8vIG1vZHVsZSBpZCA9IDQ2OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 469 */
/***/ function(module, exports) {

    eval("// created by @HenrikJoreteg\nvar prefix;\nvar version;\n\nif (window.mozRTCPeerConnection || navigator.mozGetUserMedia) {\n    prefix = 'moz';\n    version = parseInt(navigator.userAgent.match(/Firefox\\/([0-9]+)\\./)[1], 10);\n} else if (window.webkitRTCPeerConnection || navigator.webkitGetUserMedia) {\n    prefix = 'webkit';\n    version = navigator.userAgent.match(/Chrom(e|ium)/) && parseInt(navigator.userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./)[2], 10);\n}\n\nvar PC = window.mozRTCPeerConnection || window.webkitRTCPeerConnection;\nvar IceCandidate = window.mozRTCIceCandidate || window.RTCIceCandidate;\nvar SessionDescription = window.mozRTCSessionDescription || window.RTCSessionDescription;\nvar MediaStream = window.webkitMediaStream || window.MediaStream;\nvar screenSharing = window.location.protocol === 'https:' &&\n    ((prefix === 'webkit' && version >= 26) ||\n     (prefix === 'moz' && version >= 33))\nvar AudioContext = window.AudioContext || window.webkitAudioContext;\nvar videoEl = document.createElement('video');\nvar supportVp8 = videoEl && videoEl.canPlayType && videoEl.canPlayType('video/webm; codecs=\"vp8\", vorbis') === \"probably\";\nvar getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.msGetUserMedia || navigator.mozGetUserMedia;\n\n// export support flags and constructors.prototype && PC\nmodule.exports = {\n    prefix: prefix,\n    browserVersion: version,\n    support: !!PC && supportVp8 && !!getUserMedia,\n    // new support style\n    supportRTCPeerConnection: !!PC,\n    supportVp8: supportVp8,\n    supportGetUserMedia: !!getUserMedia,\n    supportDataChannel: !!(PC && PC.prototype && PC.prototype.createDataChannel),\n    supportWebAudio: !!(AudioContext && AudioContext.prototype.createMediaStreamSource),\n    supportMediaStream: !!(MediaStream && MediaStream.prototype.removeTrack),\n    supportScreenSharing: !!screenSharing,\n    // old deprecated style. Dont use this anymore\n    dataChannel: !!(PC && PC.prototype && PC.prototype.createDataChannel),\n    webAudio: !!(AudioContext && AudioContext.prototype.createMediaStreamSource),\n    mediaStream: !!(MediaStream && MediaStream.prototype.removeTrack),\n    screenSharing: !!screenSharing,\n    // constructors\n    AudioContext: AudioContext,\n    PeerConnection: PC,\n    SessionDescription: SessionDescription,\n    IceCandidate: IceCandidate,\n    MediaStream: MediaStream,\n    getUserMedia: getUserMedia\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDY5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9tZWRpYXN0cmVhbS1nYWluL25vZGVfbW9kdWxlcy93ZWJydGNzdXBwb3J0L2luZGV4LWJyb3dzZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gY3JlYXRlZCBieSBASGVucmlrSm9yZXRlZ1xudmFyIHByZWZpeDtcbnZhciB2ZXJzaW9uO1xuXG5pZiAod2luZG93Lm1velJUQ1BlZXJDb25uZWN0aW9uIHx8IG5hdmlnYXRvci5tb3pHZXRVc2VyTWVkaWEpIHtcbiAgICBwcmVmaXggPSAnbW96JztcbiAgICB2ZXJzaW9uID0gcGFyc2VJbnQobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvRmlyZWZveFxcLyhbMC05XSspXFwuLylbMV0sIDEwKTtcbn0gZWxzZSBpZiAod2luZG93LndlYmtpdFJUQ1BlZXJDb25uZWN0aW9uIHx8IG5hdmlnYXRvci53ZWJraXRHZXRVc2VyTWVkaWEpIHtcbiAgICBwcmVmaXggPSAnd2Via2l0JztcbiAgICB2ZXJzaW9uID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQ2hyb20oZXxpdW0pLykgJiYgcGFyc2VJbnQobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQ2hyb20oZXxpdW0pXFwvKFswLTldKylcXC4vKVsyXSwgMTApO1xufVxuXG52YXIgUEMgPSB3aW5kb3cubW96UlRDUGVlckNvbm5lY3Rpb24gfHwgd2luZG93LndlYmtpdFJUQ1BlZXJDb25uZWN0aW9uO1xudmFyIEljZUNhbmRpZGF0ZSA9IHdpbmRvdy5tb3pSVENJY2VDYW5kaWRhdGUgfHwgd2luZG93LlJUQ0ljZUNhbmRpZGF0ZTtcbnZhciBTZXNzaW9uRGVzY3JpcHRpb24gPSB3aW5kb3cubW96UlRDU2Vzc2lvbkRlc2NyaXB0aW9uIHx8IHdpbmRvdy5SVENTZXNzaW9uRGVzY3JpcHRpb247XG52YXIgTWVkaWFTdHJlYW0gPSB3aW5kb3cud2Via2l0TWVkaWFTdHJlYW0gfHwgd2luZG93Lk1lZGlhU3RyZWFtO1xudmFyIHNjcmVlblNoYXJpbmcgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonICYmXG4gICAgKChwcmVmaXggPT09ICd3ZWJraXQnICYmIHZlcnNpb24gPj0gMjYpIHx8XG4gICAgIChwcmVmaXggPT09ICdtb3onICYmIHZlcnNpb24gPj0gMzMpKVxudmFyIEF1ZGlvQ29udGV4dCA9IHdpbmRvdy5BdWRpb0NvbnRleHQgfHwgd2luZG93LndlYmtpdEF1ZGlvQ29udGV4dDtcbnZhciB2aWRlb0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbnZhciBzdXBwb3J0VnA4ID0gdmlkZW9FbCAmJiB2aWRlb0VsLmNhblBsYXlUeXBlICYmIHZpZGVvRWwuY2FuUGxheVR5cGUoJ3ZpZGVvL3dlYm07IGNvZGVjcz1cInZwOFwiLCB2b3JiaXMnKSA9PT0gXCJwcm9iYWJseVwiO1xudmFyIGdldFVzZXJNZWRpYSA9IG5hdmlnYXRvci5nZXRVc2VyTWVkaWEgfHwgbmF2aWdhdG9yLndlYmtpdEdldFVzZXJNZWRpYSB8fCBuYXZpZ2F0b3IubXNHZXRVc2VyTWVkaWEgfHwgbmF2aWdhdG9yLm1vekdldFVzZXJNZWRpYTtcblxuLy8gZXhwb3J0IHN1cHBvcnQgZmxhZ3MgYW5kIGNvbnN0cnVjdG9ycy5wcm90b3R5cGUgJiYgUENcbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIHByZWZpeDogcHJlZml4LFxuICAgIGJyb3dzZXJWZXJzaW9uOiB2ZXJzaW9uLFxuICAgIHN1cHBvcnQ6ICEhUEMgJiYgc3VwcG9ydFZwOCAmJiAhIWdldFVzZXJNZWRpYSxcbiAgICAvLyBuZXcgc3VwcG9ydCBzdHlsZVxuICAgIHN1cHBvcnRSVENQZWVyQ29ubmVjdGlvbjogISFQQyxcbiAgICBzdXBwb3J0VnA4OiBzdXBwb3J0VnA4LFxuICAgIHN1cHBvcnRHZXRVc2VyTWVkaWE6ICEhZ2V0VXNlck1lZGlhLFxuICAgIHN1cHBvcnREYXRhQ2hhbm5lbDogISEoUEMgJiYgUEMucHJvdG90eXBlICYmIFBDLnByb3RvdHlwZS5jcmVhdGVEYXRhQ2hhbm5lbCksXG4gICAgc3VwcG9ydFdlYkF1ZGlvOiAhIShBdWRpb0NvbnRleHQgJiYgQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVNZWRpYVN0cmVhbVNvdXJjZSksXG4gICAgc3VwcG9ydE1lZGlhU3RyZWFtOiAhIShNZWRpYVN0cmVhbSAmJiBNZWRpYVN0cmVhbS5wcm90b3R5cGUucmVtb3ZlVHJhY2spLFxuICAgIHN1cHBvcnRTY3JlZW5TaGFyaW5nOiAhIXNjcmVlblNoYXJpbmcsXG4gICAgLy8gb2xkIGRlcHJlY2F0ZWQgc3R5bGUuIERvbnQgdXNlIHRoaXMgYW55bW9yZVxuICAgIGRhdGFDaGFubmVsOiAhIShQQyAmJiBQQy5wcm90b3R5cGUgJiYgUEMucHJvdG90eXBlLmNyZWF0ZURhdGFDaGFubmVsKSxcbiAgICB3ZWJBdWRpbzogISEoQXVkaW9Db250ZXh0ICYmIEF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlTWVkaWFTdHJlYW1Tb3VyY2UpLFxuICAgIG1lZGlhU3RyZWFtOiAhIShNZWRpYVN0cmVhbSAmJiBNZWRpYVN0cmVhbS5wcm90b3R5cGUucmVtb3ZlVHJhY2spLFxuICAgIHNjcmVlblNoYXJpbmc6ICEhc2NyZWVuU2hhcmluZyxcbiAgICAvLyBjb25zdHJ1Y3RvcnNcbiAgICBBdWRpb0NvbnRleHQ6IEF1ZGlvQ29udGV4dCxcbiAgICBQZWVyQ29ubmVjdGlvbjogUEMsXG4gICAgU2Vzc2lvbkRlc2NyaXB0aW9uOiBTZXNzaW9uRGVzY3JpcHRpb24sXG4gICAgSWNlQ2FuZGlkYXRlOiBJY2VDYW5kaWRhdGUsXG4gICAgTWVkaWFTdHJlYW06IE1lZGlhU3RyZWFtLFxuICAgIGdldFVzZXJNZWRpYTogZ2V0VXNlck1lZGlhXG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L21lZGlhc3RyZWFtLWdhaW4vfi93ZWJydGNzdXBwb3J0L2luZGV4LWJyb3dzZXIuanNcbi8vIG1vZHVsZSBpZCA9IDQ2OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 470 */
/***/ function(module, exports, __webpack_require__) {

    eval("var util = __webpack_require__(438);\nvar webrtcSupport = __webpack_require__(441);\nvar PeerConnection = __webpack_require__(471);\nvar WildEmitter = __webpack_require__(445);\nvar FileTransfer = __webpack_require__(488);\n\n// the inband-v1 protocol is sending metadata inband in a serialized JSON object\n// followed by the actual data. Receiver closes the datachannel upon completion\nvar INBAND_FILETRANSFER_V1 = 'https://simplewebrtc.com/protocol/filetransfer#inband-v1';\n\nfunction isAllTracksEnded(stream) {\n    var isAllTracksEnded = true;\n    stream.getTracks().forEach(function (t) {\n        isAllTracksEnded = t.readyState === 'ended' && isAllTracksEnded;\n    });\n    return isAllTracksEnded;\n}\n\nfunction Peer(options) {\n    var self = this;\n\n    // call emitter constructor\n    WildEmitter.call(this);\n\n    this.id = options.id;\n    this.parent = options.parent;\n    this.type = options.type || 'video';\n    this.oneway = options.oneway || false;\n    this.sharemyscreen = options.sharemyscreen || false;\n    this.browserPrefix = options.prefix;\n    this.stream = options.stream;\n    this.enableDataChannels = options.enableDataChannels === undefined ? this.parent.config.enableDataChannels : options.enableDataChannels;\n    this.receiveMedia = options.receiveMedia || this.parent.config.receiveMedia;\n    this.channels = {};\n    this.sid = options.sid || Date.now().toString();\n    // Create an RTCPeerConnection via the polyfill\n    this.pc = new PeerConnection(this.parent.config.peerConnectionConfig, this.parent.config.peerConnectionConstraints);\n    this.pc.on('ice', this.onIceCandidate.bind(this));\n    this.pc.on('endOfCandidates', function (event) {\n        self.send('endOfCandidates', event);\n    });\n    this.pc.on('offer', function (offer) {\n        if (self.parent.config.nick) offer.nick = self.parent.config.nick;\n        self.send('offer', offer);\n    });\n    this.pc.on('answer', function (answer) {\n        if (self.parent.config.nick) answer.nick = self.parent.config.nick;\n        self.send('answer', answer);\n    });\n    this.pc.on('addStream', this.handleRemoteStreamAdded.bind(this));\n    this.pc.on('addChannel', this.handleDataChannelAdded.bind(this));\n    this.pc.on('removeStream', this.handleStreamRemoved.bind(this));\n    // Just fire negotiation needed events for now\n    // When browser re-negotiation handling seems to work\n    // we can use this as the trigger for starting the offer/answer process\n    // automatically. We'll just leave it be for now while this stabalizes.\n    this.pc.on('negotiationNeeded', this.emit.bind(this, 'negotiationNeeded'));\n    this.pc.on('iceConnectionStateChange', this.emit.bind(this, 'iceConnectionStateChange'));\n    this.pc.on('iceConnectionStateChange', function () {\n        switch (self.pc.iceConnectionState) {\n        case 'failed':\n            // currently, in chrome only the initiator goes to failed\n            // so we need to signal this to the peer\n            if (self.pc.pc.peerconnection.localDescription.type === 'offer') {\n                self.parent.emit('iceFailed', self);\n                self.send('connectivityError');\n            }\n            break;\n        }\n    });\n    this.pc.on('signalingStateChange', this.emit.bind(this, 'signalingStateChange'));\n    this.logger = this.parent.logger;\n\n    // handle screensharing/broadcast mode\n    if (options.type === 'screen') {\n        if (this.parent.localScreen && this.sharemyscreen) {\n            this.logger.log('adding local screen stream to peer connection');\n            this.pc.addStream(this.parent.localScreen);\n            this.broadcaster = options.broadcaster;\n        }\n    } else {\n        this.parent.localStreams.forEach(function (stream) {\n            self.pc.addStream(stream);\n        });\n    }\n\n    this.on('channelOpen', function (channel) {\n        if (channel.protocol === INBAND_FILETRANSFER_V1) {\n            channel.onmessage = function (event) {\n                var metadata = JSON.parse(event.data);\n                var receiver = new FileTransfer.Receiver();\n                receiver.receive(metadata, channel);\n                self.emit('fileTransfer', metadata, receiver);\n                receiver.on('receivedFile', function (file, metadata) {\n                    receiver.channel.close();\n                });\n            };\n        }\n    });\n\n    // proxy events to parent\n    this.on('*', function () {\n        self.parent.emit.apply(self.parent, arguments);\n    });\n}\n\nutil.inherits(Peer, WildEmitter);\n\nPeer.prototype.handleMessage = function (message) {\n    var self = this;\n\n    this.logger.log('getting', message.type, message);\n\n    if (message.prefix) this.browserPrefix = message.prefix;\n\n    if (message.type === 'offer') {\n        if (!this.nick) this.nick = message.payload.nick;\n        delete message.payload.nick;\n        this.pc.handleOffer(message.payload, function (err) {\n            if (err) {\n                return;\n            }\n            // auto-accept\n            self.pc.answer(function (err, sessionDescription) {\n                //self.send('answer', sessionDescription);\n            });\n        });\n    } else if (message.type === 'answer') {\n        if (!this.nick) this.nick = message.payload.nick;\n        delete message.payload.nick;\n        this.pc.handleAnswer(message.payload);\n    } else if (message.type === 'candidate') {\n        this.pc.processIce(message.payload);\n    } else if (message.type === 'connectivityError') {\n        this.parent.emit('connectivityError', self);\n    } else if (message.type === 'mute') {\n        this.parent.emit('mute', {id: message.from, name: message.payload.name});\n    } else if (message.type === 'unmute') {\n        this.parent.emit('unmute', {id: message.from, name: message.payload.name});\n    } else if (message.type === 'endOfCandidates') {\n        // Edge requires an end-of-candidates. Since only Edge will have mLines or tracks on the\n        // shim this will only be called in Edge.\n        var mLines = this.pc.pc.peerconnection.transceivers || [];\n        mLines.forEach(function (mLine) {\n            if (mLine.iceTransport) {\n                mLine.iceTransport.addRemoteCandidate({});\n            }\n        });\n    }\n};\n\n// send via signalling channel\nPeer.prototype.send = function (messageType, payload) {\n    var message = {\n        to: this.id,\n        sid: this.sid,\n        broadcaster: this.broadcaster,\n        roomType: this.type,\n        type: messageType,\n        payload: payload,\n        prefix: webrtcSupport.prefix\n    };\n    this.logger.log('sending', messageType, message);\n    this.parent.emit('message', message);\n};\n\n// send via data channel\n// returns true when message was sent and false if channel is not open\nPeer.prototype.sendDirectly = function (channel, messageType, payload) {\n    var message = {\n        type: messageType,\n        payload: payload\n    };\n    this.logger.log('sending via datachannel', channel, messageType, message);\n    var dc = this.getDataChannel(channel);\n    if (dc.readyState != 'open') return false;\n    dc.send(JSON.stringify(message));\n    return true;\n};\n\n// Internal method registering handlers for a data channel and emitting events on the peer\nPeer.prototype._observeDataChannel = function (channel) {\n    var self = this;\n    channel.onclose = this.emit.bind(this, 'channelClose', channel);\n    channel.onerror = this.emit.bind(this, 'channelError', channel);\n    channel.onmessage = function (event) {\n        self.emit('channelMessage', self, channel.label, JSON.parse(event.data), channel, event);\n    };\n    channel.onopen = this.emit.bind(this, 'channelOpen', channel);\n};\n\n// Fetch or create a data channel by the given name\nPeer.prototype.getDataChannel = function (name, opts) {\n    if (!webrtcSupport.supportDataChannel) return this.emit('error', new Error('createDataChannel not supported'));\n    var channel = this.channels[name];\n    opts || (opts = {});\n    if (channel) return channel;\n    // if we don't have one by this label, create it\n    channel = this.channels[name] = this.pc.createDataChannel(name, opts);\n    this._observeDataChannel(channel);\n    return channel;\n};\n\nPeer.prototype.onIceCandidate = function (candidate) {\n    if (this.closed) return;\n    if (candidate) {\n        var pcConfig = this.parent.config.peerConnectionConfig;\n        if (webrtcSupport.prefix === 'moz' && pcConfig && pcConfig.iceTransports &&\n                candidate.candidate && candidate.candidate.candidate &&\n                candidate.candidate.candidate.indexOf(pcConfig.iceTransports) < 0) {\n            this.logger.log('Ignoring ice candidate not matching pcConfig iceTransports type: ', pcConfig.iceTransports);\n        } else {\n            this.send('candidate', candidate);\n        }\n    } else {\n        this.logger.log(\"End of candidates.\");\n    }\n};\n\nPeer.prototype.start = function () {\n    var self = this;\n\n    // well, the webrtc api requires that we either\n    // a) create a datachannel a priori\n    // b) do a renegotiation later to add the SCTP m-line\n    // Let's do (a) first...\n    if (this.enableDataChannels) {\n        this.getDataChannel('simplewebrtc');\n    }\n\n    this.pc.offer(this.receiveMedia, function (err, sessionDescription) {\n        //self.send('offer', sessionDescription);\n    });\n};\n\nPeer.prototype.icerestart = function () {\n    var constraints = this.receiveMedia;\n    constraints.mandatory.IceRestart = true;\n    this.pc.offer(constraints, function (err, success) { });\n};\n\nPeer.prototype.end = function () {\n    if (this.closed) return;\n    this.pc.close();\n    this.handleStreamRemoved();\n};\n\nPeer.prototype.handleRemoteStreamAdded = function (event) {\n    var self = this;\n    if (this.stream) {\n        this.logger.warn('Already have a remote stream');\n    } else {\n        this.stream = event.stream;\n\n        this.stream.getTracks().forEach(function (track) {\n            track.addEventListener('ended', function () {\n                if (isAllTracksEnded(self.stream)) {\n                    self.end();\n                }\n            });\n        });\n\n        this.parent.emit('peerStreamAdded', this);\n    }\n};\n\nPeer.prototype.handleStreamRemoved = function () {\n    var peerIndex = this.parent.peers.indexOf(this);\n    if (peerIndex > -1) {\n        this.parent.peers.splice(peerIndex, 1);\n        this.closed = true;\n        this.parent.emit('peerStreamRemoved', this);\n    }\n};\n\nPeer.prototype.handleDataChannelAdded = function (channel) {\n    this.channels[channel.label] = channel;\n    this._observeDataChannel(channel);\n};\n\nPeer.prototype.sendFile = function (file) {\n    var sender = new FileTransfer.Sender();\n    var dc = this.getDataChannel('filetransfer' + (new Date()).getTime(), {\n        protocol: INBAND_FILETRANSFER_V1\n    });\n    // override onopen\n    dc.onopen = function () {\n        dc.send(JSON.stringify({\n            size: file.size,\n            name: file.name\n        }));\n        sender.send(file, dc);\n    };\n    // override onclose\n    dc.onclose = function () {\n        console.log('sender received transfer');\n        sender.emit('complete');\n    };\n    return sender;\n};\n\nmodule.exports = Peer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDcwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zaW1wbGV3ZWJydGMvcGVlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciB3ZWJydGNTdXBwb3J0ID0gcmVxdWlyZSgnd2VicnRjc3VwcG9ydCcpO1xudmFyIFBlZXJDb25uZWN0aW9uID0gcmVxdWlyZSgncnRjcGVlcmNvbm5lY3Rpb24nKTtcbnZhciBXaWxkRW1pdHRlciA9IHJlcXVpcmUoJ3dpbGRlbWl0dGVyJyk7XG52YXIgRmlsZVRyYW5zZmVyID0gcmVxdWlyZSgnZmlsZXRyYW5zZmVyJyk7XG5cbi8vIHRoZSBpbmJhbmQtdjEgcHJvdG9jb2wgaXMgc2VuZGluZyBtZXRhZGF0YSBpbmJhbmQgaW4gYSBzZXJpYWxpemVkIEpTT04gb2JqZWN0XG4vLyBmb2xsb3dlZCBieSB0aGUgYWN0dWFsIGRhdGEuIFJlY2VpdmVyIGNsb3NlcyB0aGUgZGF0YWNoYW5uZWwgdXBvbiBjb21wbGV0aW9uXG52YXIgSU5CQU5EX0ZJTEVUUkFOU0ZFUl9WMSA9ICdodHRwczovL3NpbXBsZXdlYnJ0Yy5jb20vcHJvdG9jb2wvZmlsZXRyYW5zZmVyI2luYmFuZC12MSc7XG5cbmZ1bmN0aW9uIGlzQWxsVHJhY2tzRW5kZWQoc3RyZWFtKSB7XG4gICAgdmFyIGlzQWxsVHJhY2tzRW5kZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlzQWxsVHJhY2tzRW5kZWQgPSB0LnJlYWR5U3RhdGUgPT09ICdlbmRlZCcgJiYgaXNBbGxUcmFja3NFbmRlZDtcbiAgICB9KTtcbiAgICByZXR1cm4gaXNBbGxUcmFja3NFbmRlZDtcbn1cblxuZnVuY3Rpb24gUGVlcihvcHRpb25zKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gY2FsbCBlbWl0dGVyIGNvbnN0cnVjdG9yXG4gICAgV2lsZEVtaXR0ZXIuY2FsbCh0aGlzKTtcblxuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkO1xuICAgIHRoaXMucGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG4gICAgdGhpcy50eXBlID0gb3B0aW9ucy50eXBlIHx8ICd2aWRlbyc7XG4gICAgdGhpcy5vbmV3YXkgPSBvcHRpb25zLm9uZXdheSB8fCBmYWxzZTtcbiAgICB0aGlzLnNoYXJlbXlzY3JlZW4gPSBvcHRpb25zLnNoYXJlbXlzY3JlZW4gfHwgZmFsc2U7XG4gICAgdGhpcy5icm93c2VyUHJlZml4ID0gb3B0aW9ucy5wcmVmaXg7XG4gICAgdGhpcy5zdHJlYW0gPSBvcHRpb25zLnN0cmVhbTtcbiAgICB0aGlzLmVuYWJsZURhdGFDaGFubmVscyA9IG9wdGlvbnMuZW5hYmxlRGF0YUNoYW5uZWxzID09PSB1bmRlZmluZWQgPyB0aGlzLnBhcmVudC5jb25maWcuZW5hYmxlRGF0YUNoYW5uZWxzIDogb3B0aW9ucy5lbmFibGVEYXRhQ2hhbm5lbHM7XG4gICAgdGhpcy5yZWNlaXZlTWVkaWEgPSBvcHRpb25zLnJlY2VpdmVNZWRpYSB8fCB0aGlzLnBhcmVudC5jb25maWcucmVjZWl2ZU1lZGlhO1xuICAgIHRoaXMuY2hhbm5lbHMgPSB7fTtcbiAgICB0aGlzLnNpZCA9IG9wdGlvbnMuc2lkIHx8IERhdGUubm93KCkudG9TdHJpbmcoKTtcbiAgICAvLyBDcmVhdGUgYW4gUlRDUGVlckNvbm5lY3Rpb24gdmlhIHRoZSBwb2x5ZmlsbFxuICAgIHRoaXMucGMgPSBuZXcgUGVlckNvbm5lY3Rpb24odGhpcy5wYXJlbnQuY29uZmlnLnBlZXJDb25uZWN0aW9uQ29uZmlnLCB0aGlzLnBhcmVudC5jb25maWcucGVlckNvbm5lY3Rpb25Db25zdHJhaW50cyk7XG4gICAgdGhpcy5wYy5vbignaWNlJywgdGhpcy5vbkljZUNhbmRpZGF0ZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLnBjLm9uKCdlbmRPZkNhbmRpZGF0ZXMnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgc2VsZi5zZW5kKCdlbmRPZkNhbmRpZGF0ZXMnLCBldmVudCk7XG4gICAgfSk7XG4gICAgdGhpcy5wYy5vbignb2ZmZXInLCBmdW5jdGlvbiAob2ZmZXIpIHtcbiAgICAgICAgaWYgKHNlbGYucGFyZW50LmNvbmZpZy5uaWNrKSBvZmZlci5uaWNrID0gc2VsZi5wYXJlbnQuY29uZmlnLm5pY2s7XG4gICAgICAgIHNlbGYuc2VuZCgnb2ZmZXInLCBvZmZlcik7XG4gICAgfSk7XG4gICAgdGhpcy5wYy5vbignYW5zd2VyJywgZnVuY3Rpb24gKGFuc3dlcikge1xuICAgICAgICBpZiAoc2VsZi5wYXJlbnQuY29uZmlnLm5pY2spIGFuc3dlci5uaWNrID0gc2VsZi5wYXJlbnQuY29uZmlnLm5pY2s7XG4gICAgICAgIHNlbGYuc2VuZCgnYW5zd2VyJywgYW5zd2VyKTtcbiAgICB9KTtcbiAgICB0aGlzLnBjLm9uKCdhZGRTdHJlYW0nLCB0aGlzLmhhbmRsZVJlbW90ZVN0cmVhbUFkZGVkLmJpbmQodGhpcykpO1xuICAgIHRoaXMucGMub24oJ2FkZENoYW5uZWwnLCB0aGlzLmhhbmRsZURhdGFDaGFubmVsQWRkZWQuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5wYy5vbigncmVtb3ZlU3RyZWFtJywgdGhpcy5oYW5kbGVTdHJlYW1SZW1vdmVkLmJpbmQodGhpcykpO1xuICAgIC8vIEp1c3QgZmlyZSBuZWdvdGlhdGlvbiBuZWVkZWQgZXZlbnRzIGZvciBub3dcbiAgICAvLyBXaGVuIGJyb3dzZXIgcmUtbmVnb3RpYXRpb24gaGFuZGxpbmcgc2VlbXMgdG8gd29ya1xuICAgIC8vIHdlIGNhbiB1c2UgdGhpcyBhcyB0aGUgdHJpZ2dlciBmb3Igc3RhcnRpbmcgdGhlIG9mZmVyL2Fuc3dlciBwcm9jZXNzXG4gICAgLy8gYXV0b21hdGljYWxseS4gV2UnbGwganVzdCBsZWF2ZSBpdCBiZSBmb3Igbm93IHdoaWxlIHRoaXMgc3RhYmFsaXplcy5cbiAgICB0aGlzLnBjLm9uKCduZWdvdGlhdGlvbk5lZWRlZCcsIHRoaXMuZW1pdC5iaW5kKHRoaXMsICduZWdvdGlhdGlvbk5lZWRlZCcpKTtcbiAgICB0aGlzLnBjLm9uKCdpY2VDb25uZWN0aW9uU3RhdGVDaGFuZ2UnLCB0aGlzLmVtaXQuYmluZCh0aGlzLCAnaWNlQ29ubmVjdGlvblN0YXRlQ2hhbmdlJykpO1xuICAgIHRoaXMucGMub24oJ2ljZUNvbm5lY3Rpb25TdGF0ZUNoYW5nZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc3dpdGNoIChzZWxmLnBjLmljZUNvbm5lY3Rpb25TdGF0ZSkge1xuICAgICAgICBjYXNlICdmYWlsZWQnOlxuICAgICAgICAgICAgLy8gY3VycmVudGx5LCBpbiBjaHJvbWUgb25seSB0aGUgaW5pdGlhdG9yIGdvZXMgdG8gZmFpbGVkXG4gICAgICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIHNpZ25hbCB0aGlzIHRvIHRoZSBwZWVyXG4gICAgICAgICAgICBpZiAoc2VsZi5wYy5wYy5wZWVyY29ubmVjdGlvbi5sb2NhbERlc2NyaXB0aW9uLnR5cGUgPT09ICdvZmZlcicpIHtcbiAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5lbWl0KCdpY2VGYWlsZWQnLCBzZWxmKTtcbiAgICAgICAgICAgICAgICBzZWxmLnNlbmQoJ2Nvbm5lY3Rpdml0eUVycm9yJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucGMub24oJ3NpZ25hbGluZ1N0YXRlQ2hhbmdlJywgdGhpcy5lbWl0LmJpbmQodGhpcywgJ3NpZ25hbGluZ1N0YXRlQ2hhbmdlJykpO1xuICAgIHRoaXMubG9nZ2VyID0gdGhpcy5wYXJlbnQubG9nZ2VyO1xuXG4gICAgLy8gaGFuZGxlIHNjcmVlbnNoYXJpbmcvYnJvYWRjYXN0IG1vZGVcbiAgICBpZiAob3B0aW9ucy50eXBlID09PSAnc2NyZWVuJykge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnQubG9jYWxTY3JlZW4gJiYgdGhpcy5zaGFyZW15c2NyZWVuKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coJ2FkZGluZyBsb2NhbCBzY3JlZW4gc3RyZWFtIHRvIHBlZXIgY29ubmVjdGlvbicpO1xuICAgICAgICAgICAgdGhpcy5wYy5hZGRTdHJlYW0odGhpcy5wYXJlbnQubG9jYWxTY3JlZW4pO1xuICAgICAgICAgICAgdGhpcy5icm9hZGNhc3RlciA9IG9wdGlvbnMuYnJvYWRjYXN0ZXI7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBhcmVudC5sb2NhbFN0cmVhbXMuZm9yRWFjaChmdW5jdGlvbiAoc3RyZWFtKSB7XG4gICAgICAgICAgICBzZWxmLnBjLmFkZFN0cmVhbShzdHJlYW0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLm9uKCdjaGFubmVsT3BlbicsIGZ1bmN0aW9uIChjaGFubmVsKSB7XG4gICAgICAgIGlmIChjaGFubmVsLnByb3RvY29sID09PSBJTkJBTkRfRklMRVRSQU5TRkVSX1YxKSB7XG4gICAgICAgICAgICBjaGFubmVsLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICAgICAgdmFyIHJlY2VpdmVyID0gbmV3IEZpbGVUcmFuc2Zlci5SZWNlaXZlcigpO1xuICAgICAgICAgICAgICAgIHJlY2VpdmVyLnJlY2VpdmUobWV0YWRhdGEsIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnZmlsZVRyYW5zZmVyJywgbWV0YWRhdGEsIHJlY2VpdmVyKTtcbiAgICAgICAgICAgICAgICByZWNlaXZlci5vbigncmVjZWl2ZWRGaWxlJywgZnVuY3Rpb24gKGZpbGUsIG1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyLmNoYW5uZWwuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIHByb3h5IGV2ZW50cyB0byBwYXJlbnRcbiAgICB0aGlzLm9uKCcqJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLnBhcmVudC5lbWl0LmFwcGx5KHNlbGYucGFyZW50LCBhcmd1bWVudHMpO1xuICAgIH0pO1xufVxuXG51dGlsLmluaGVyaXRzKFBlZXIsIFdpbGRFbWl0dGVyKTtcblxuUGVlci5wcm90b3R5cGUuaGFuZGxlTWVzc2FnZSA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdGhpcy5sb2dnZXIubG9nKCdnZXR0aW5nJywgbWVzc2FnZS50eXBlLCBtZXNzYWdlKTtcblxuICAgIGlmIChtZXNzYWdlLnByZWZpeCkgdGhpcy5icm93c2VyUHJlZml4ID0gbWVzc2FnZS5wcmVmaXg7XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSAnb2ZmZXInKSB7XG4gICAgICAgIGlmICghdGhpcy5uaWNrKSB0aGlzLm5pY2sgPSBtZXNzYWdlLnBheWxvYWQubmljaztcbiAgICAgICAgZGVsZXRlIG1lc3NhZ2UucGF5bG9hZC5uaWNrO1xuICAgICAgICB0aGlzLnBjLmhhbmRsZU9mZmVyKG1lc3NhZ2UucGF5bG9hZCwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGF1dG8tYWNjZXB0XG4gICAgICAgICAgICBzZWxmLnBjLmFuc3dlcihmdW5jdGlvbiAoZXJyLCBzZXNzaW9uRGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICAvL3NlbGYuc2VuZCgnYW5zd2VyJywgc2Vzc2lvbkRlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKG1lc3NhZ2UudHlwZSA9PT0gJ2Fuc3dlcicpIHtcbiAgICAgICAgaWYgKCF0aGlzLm5pY2spIHRoaXMubmljayA9IG1lc3NhZ2UucGF5bG9hZC5uaWNrO1xuICAgICAgICBkZWxldGUgbWVzc2FnZS5wYXlsb2FkLm5pY2s7XG4gICAgICAgIHRoaXMucGMuaGFuZGxlQW5zd2VyKG1lc3NhZ2UucGF5bG9hZCk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09ICdjYW5kaWRhdGUnKSB7XG4gICAgICAgIHRoaXMucGMucHJvY2Vzc0ljZShtZXNzYWdlLnBheWxvYWQpO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSAnY29ubmVjdGl2aXR5RXJyb3InKSB7XG4gICAgICAgIHRoaXMucGFyZW50LmVtaXQoJ2Nvbm5lY3Rpdml0eUVycm9yJywgc2VsZik7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09ICdtdXRlJykge1xuICAgICAgICB0aGlzLnBhcmVudC5lbWl0KCdtdXRlJywge2lkOiBtZXNzYWdlLmZyb20sIG5hbWU6IG1lc3NhZ2UucGF5bG9hZC5uYW1lfSk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09ICd1bm11dGUnKSB7XG4gICAgICAgIHRoaXMucGFyZW50LmVtaXQoJ3VubXV0ZScsIHtpZDogbWVzc2FnZS5mcm9tLCBuYW1lOiBtZXNzYWdlLnBheWxvYWQubmFtZX0pO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSAnZW5kT2ZDYW5kaWRhdGVzJykge1xuICAgICAgICAvLyBFZGdlIHJlcXVpcmVzIGFuIGVuZC1vZi1jYW5kaWRhdGVzLiBTaW5jZSBvbmx5IEVkZ2Ugd2lsbCBoYXZlIG1MaW5lcyBvciB0cmFja3Mgb24gdGhlXG4gICAgICAgIC8vIHNoaW0gdGhpcyB3aWxsIG9ubHkgYmUgY2FsbGVkIGluIEVkZ2UuXG4gICAgICAgIHZhciBtTGluZXMgPSB0aGlzLnBjLnBjLnBlZXJjb25uZWN0aW9uLnRyYW5zY2VpdmVycyB8fCBbXTtcbiAgICAgICAgbUxpbmVzLmZvckVhY2goZnVuY3Rpb24gKG1MaW5lKSB7XG4gICAgICAgICAgICBpZiAobUxpbmUuaWNlVHJhbnNwb3J0KSB7XG4gICAgICAgICAgICAgICAgbUxpbmUuaWNlVHJhbnNwb3J0LmFkZFJlbW90ZUNhbmRpZGF0ZSh7fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5cbi8vIHNlbmQgdmlhIHNpZ25hbGxpbmcgY2hhbm5lbFxuUGVlci5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uIChtZXNzYWdlVHlwZSwgcGF5bG9hZCkge1xuICAgIHZhciBtZXNzYWdlID0ge1xuICAgICAgICB0bzogdGhpcy5pZCxcbiAgICAgICAgc2lkOiB0aGlzLnNpZCxcbiAgICAgICAgYnJvYWRjYXN0ZXI6IHRoaXMuYnJvYWRjYXN0ZXIsXG4gICAgICAgIHJvb21UeXBlOiB0aGlzLnR5cGUsXG4gICAgICAgIHR5cGU6IG1lc3NhZ2VUeXBlLFxuICAgICAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgICAgICBwcmVmaXg6IHdlYnJ0Y1N1cHBvcnQucHJlZml4XG4gICAgfTtcbiAgICB0aGlzLmxvZ2dlci5sb2coJ3NlbmRpbmcnLCBtZXNzYWdlVHlwZSwgbWVzc2FnZSk7XG4gICAgdGhpcy5wYXJlbnQuZW1pdCgnbWVzc2FnZScsIG1lc3NhZ2UpO1xufTtcblxuLy8gc2VuZCB2aWEgZGF0YSBjaGFubmVsXG4vLyByZXR1cm5zIHRydWUgd2hlbiBtZXNzYWdlIHdhcyBzZW50IGFuZCBmYWxzZSBpZiBjaGFubmVsIGlzIG5vdCBvcGVuXG5QZWVyLnByb3RvdHlwZS5zZW5kRGlyZWN0bHkgPSBmdW5jdGlvbiAoY2hhbm5lbCwgbWVzc2FnZVR5cGUsIHBheWxvYWQpIHtcbiAgICB2YXIgbWVzc2FnZSA9IHtcbiAgICAgICAgdHlwZTogbWVzc2FnZVR5cGUsXG4gICAgICAgIHBheWxvYWQ6IHBheWxvYWRcbiAgICB9O1xuICAgIHRoaXMubG9nZ2VyLmxvZygnc2VuZGluZyB2aWEgZGF0YWNoYW5uZWwnLCBjaGFubmVsLCBtZXNzYWdlVHlwZSwgbWVzc2FnZSk7XG4gICAgdmFyIGRjID0gdGhpcy5nZXREYXRhQ2hhbm5lbChjaGFubmVsKTtcbiAgICBpZiAoZGMucmVhZHlTdGF0ZSAhPSAnb3BlbicpIHJldHVybiBmYWxzZTtcbiAgICBkYy5zZW5kKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIEludGVybmFsIG1ldGhvZCByZWdpc3RlcmluZyBoYW5kbGVycyBmb3IgYSBkYXRhIGNoYW5uZWwgYW5kIGVtaXR0aW5nIGV2ZW50cyBvbiB0aGUgcGVlclxuUGVlci5wcm90b3R5cGUuX29ic2VydmVEYXRhQ2hhbm5lbCA9IGZ1bmN0aW9uIChjaGFubmVsKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGNoYW5uZWwub25jbG9zZSA9IHRoaXMuZW1pdC5iaW5kKHRoaXMsICdjaGFubmVsQ2xvc2UnLCBjaGFubmVsKTtcbiAgICBjaGFubmVsLm9uZXJyb3IgPSB0aGlzLmVtaXQuYmluZCh0aGlzLCAnY2hhbm5lbEVycm9yJywgY2hhbm5lbCk7XG4gICAgY2hhbm5lbC5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgc2VsZi5lbWl0KCdjaGFubmVsTWVzc2FnZScsIHNlbGYsIGNoYW5uZWwubGFiZWwsIEpTT04ucGFyc2UoZXZlbnQuZGF0YSksIGNoYW5uZWwsIGV2ZW50KTtcbiAgICB9O1xuICAgIGNoYW5uZWwub25vcGVuID0gdGhpcy5lbWl0LmJpbmQodGhpcywgJ2NoYW5uZWxPcGVuJywgY2hhbm5lbCk7XG59O1xuXG4vLyBGZXRjaCBvciBjcmVhdGUgYSBkYXRhIGNoYW5uZWwgYnkgdGhlIGdpdmVuIG5hbWVcblBlZXIucHJvdG90eXBlLmdldERhdGFDaGFubmVsID0gZnVuY3Rpb24gKG5hbWUsIG9wdHMpIHtcbiAgICBpZiAoIXdlYnJ0Y1N1cHBvcnQuc3VwcG9ydERhdGFDaGFubmVsKSByZXR1cm4gdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignY3JlYXRlRGF0YUNoYW5uZWwgbm90IHN1cHBvcnRlZCcpKTtcbiAgICB2YXIgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHNbbmFtZV07XG4gICAgb3B0cyB8fCAob3B0cyA9IHt9KTtcbiAgICBpZiAoY2hhbm5lbCkgcmV0dXJuIGNoYW5uZWw7XG4gICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBvbmUgYnkgdGhpcyBsYWJlbCwgY3JlYXRlIGl0XG4gICAgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHNbbmFtZV0gPSB0aGlzLnBjLmNyZWF0ZURhdGFDaGFubmVsKG5hbWUsIG9wdHMpO1xuICAgIHRoaXMuX29ic2VydmVEYXRhQ2hhbm5lbChjaGFubmVsKTtcbiAgICByZXR1cm4gY2hhbm5lbDtcbn07XG5cblBlZXIucHJvdG90eXBlLm9uSWNlQ2FuZGlkYXRlID0gZnVuY3Rpb24gKGNhbmRpZGF0ZSkge1xuICAgIGlmICh0aGlzLmNsb3NlZCkgcmV0dXJuO1xuICAgIGlmIChjYW5kaWRhdGUpIHtcbiAgICAgICAgdmFyIHBjQ29uZmlnID0gdGhpcy5wYXJlbnQuY29uZmlnLnBlZXJDb25uZWN0aW9uQ29uZmlnO1xuICAgICAgICBpZiAod2VicnRjU3VwcG9ydC5wcmVmaXggPT09ICdtb3onICYmIHBjQ29uZmlnICYmIHBjQ29uZmlnLmljZVRyYW5zcG9ydHMgJiZcbiAgICAgICAgICAgICAgICBjYW5kaWRhdGUuY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5jYW5kaWRhdGUuY2FuZGlkYXRlICYmXG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlLmNhbmRpZGF0ZS5jYW5kaWRhdGUuaW5kZXhPZihwY0NvbmZpZy5pY2VUcmFuc3BvcnRzKSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZygnSWdub3JpbmcgaWNlIGNhbmRpZGF0ZSBub3QgbWF0Y2hpbmcgcGNDb25maWcgaWNlVHJhbnNwb3J0cyB0eXBlOiAnLCBwY0NvbmZpZy5pY2VUcmFuc3BvcnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZCgnY2FuZGlkYXRlJywgY2FuZGlkYXRlKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhcIkVuZCBvZiBjYW5kaWRhdGVzLlwiKTtcbiAgICB9XG59O1xuXG5QZWVyLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyB3ZWxsLCB0aGUgd2VicnRjIGFwaSByZXF1aXJlcyB0aGF0IHdlIGVpdGhlclxuICAgIC8vIGEpIGNyZWF0ZSBhIGRhdGFjaGFubmVsIGEgcHJpb3JpXG4gICAgLy8gYikgZG8gYSByZW5lZ290aWF0aW9uIGxhdGVyIHRvIGFkZCB0aGUgU0NUUCBtLWxpbmVcbiAgICAvLyBMZXQncyBkbyAoYSkgZmlyc3QuLi5cbiAgICBpZiAodGhpcy5lbmFibGVEYXRhQ2hhbm5lbHMpIHtcbiAgICAgICAgdGhpcy5nZXREYXRhQ2hhbm5lbCgnc2ltcGxld2VicnRjJyk7XG4gICAgfVxuXG4gICAgdGhpcy5wYy5vZmZlcih0aGlzLnJlY2VpdmVNZWRpYSwgZnVuY3Rpb24gKGVyciwgc2Vzc2lvbkRlc2NyaXB0aW9uKSB7XG4gICAgICAgIC8vc2VsZi5zZW5kKCdvZmZlcicsIHNlc3Npb25EZXNjcmlwdGlvbik7XG4gICAgfSk7XG59O1xuXG5QZWVyLnByb3RvdHlwZS5pY2VyZXN0YXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb25zdHJhaW50cyA9IHRoaXMucmVjZWl2ZU1lZGlhO1xuICAgIGNvbnN0cmFpbnRzLm1hbmRhdG9yeS5JY2VSZXN0YXJ0ID0gdHJ1ZTtcbiAgICB0aGlzLnBjLm9mZmVyKGNvbnN0cmFpbnRzLCBmdW5jdGlvbiAoZXJyLCBzdWNjZXNzKSB7IH0pO1xufTtcblxuUGVlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLmNsb3NlZCkgcmV0dXJuO1xuICAgIHRoaXMucGMuY2xvc2UoKTtcbiAgICB0aGlzLmhhbmRsZVN0cmVhbVJlbW92ZWQoKTtcbn07XG5cblBlZXIucHJvdG90eXBlLmhhbmRsZVJlbW90ZVN0cmVhbUFkZGVkID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmICh0aGlzLnN0cmVhbSkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdBbHJlYWR5IGhhdmUgYSByZW1vdGUgc3RyZWFtJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdHJlYW0gPSBldmVudC5zdHJlYW07XG5cbiAgICAgICAgdGhpcy5zdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaChmdW5jdGlvbiAodHJhY2spIHtcbiAgICAgICAgICAgIHRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChpc0FsbFRyYWNrc0VuZGVkKHNlbGYuc3RyZWFtKSkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmVuZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnBhcmVudC5lbWl0KCdwZWVyU3RyZWFtQWRkZWQnLCB0aGlzKTtcbiAgICB9XG59O1xuXG5QZWVyLnByb3RvdHlwZS5oYW5kbGVTdHJlYW1SZW1vdmVkID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwZWVySW5kZXggPSB0aGlzLnBhcmVudC5wZWVycy5pbmRleE9mKHRoaXMpO1xuICAgIGlmIChwZWVySW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLnBhcmVudC5wZWVycy5zcGxpY2UocGVlckluZGV4LCAxKTtcbiAgICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhcmVudC5lbWl0KCdwZWVyU3RyZWFtUmVtb3ZlZCcsIHRoaXMpO1xuICAgIH1cbn07XG5cblBlZXIucHJvdG90eXBlLmhhbmRsZURhdGFDaGFubmVsQWRkZWQgPSBmdW5jdGlvbiAoY2hhbm5lbCkge1xuICAgIHRoaXMuY2hhbm5lbHNbY2hhbm5lbC5sYWJlbF0gPSBjaGFubmVsO1xuICAgIHRoaXMuX29ic2VydmVEYXRhQ2hhbm5lbChjaGFubmVsKTtcbn07XG5cblBlZXIucHJvdG90eXBlLnNlbmRGaWxlID0gZnVuY3Rpb24gKGZpbGUpIHtcbiAgICB2YXIgc2VuZGVyID0gbmV3IEZpbGVUcmFuc2Zlci5TZW5kZXIoKTtcbiAgICB2YXIgZGMgPSB0aGlzLmdldERhdGFDaGFubmVsKCdmaWxldHJhbnNmZXInICsgKG5ldyBEYXRlKCkpLmdldFRpbWUoKSwge1xuICAgICAgICBwcm90b2NvbDogSU5CQU5EX0ZJTEVUUkFOU0ZFUl9WMVxuICAgIH0pO1xuICAgIC8vIG92ZXJyaWRlIG9ub3BlblxuICAgIGRjLm9ub3BlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGMuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBzaXplOiBmaWxlLnNpemUsXG4gICAgICAgICAgICBuYW1lOiBmaWxlLm5hbWVcbiAgICAgICAgfSkpO1xuICAgICAgICBzZW5kZXIuc2VuZChmaWxlLCBkYyk7XG4gICAgfTtcbiAgICAvLyBvdmVycmlkZSBvbmNsb3NlXG4gICAgZGMub25jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ3NlbmRlciByZWNlaXZlZCB0cmFuc2ZlcicpO1xuICAgICAgICBzZW5kZXIuZW1pdCgnY29tcGxldGUnKTtcbiAgICB9O1xuICAgIHJldHVybiBzZW5kZXI7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBlZXI7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vc2ltcGxld2VicnRjL3BlZXIuanNcbi8vIG1vZHVsZSBpZCA9IDQ3MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 471 */
/***/ function(module, exports, __webpack_require__) {

    eval("var util = __webpack_require__(438);\nvar SJJ = __webpack_require__(472);\nvar WildEmitter = __webpack_require__(445);\nvar Peerconn = __webpack_require__(477);\nvar adapter = __webpack_require__(459);\nvar cloneDeep = __webpack_require__(487);\n\nfunction PeerConnection(config, constraints) {\n    var self = this;\n    var item;\n    WildEmitter.call(this);\n\n    config = config || {};\n    config.iceServers = config.iceServers || [];\n\n    var detectedBrowser = adapter.browserDetails.browser;\n\n    // make sure this only gets enabled in Google Chrome\n    // EXPERIMENTAL FLAG, might get removed without notice\n    this.enableChromeNativeSimulcast = false;\n    if (constraints && constraints.optional &&\n            detectedBrowser === 'chrome' &&\n            navigator.appVersion.match(/Chromium\\//) === null) {\n        constraints.optional.forEach(function (constraint) {\n            if (constraint.enableChromeNativeSimulcast) {\n                self.enableChromeNativeSimulcast = true;\n            }\n        });\n    }\n\n    // EXPERIMENTAL FLAG, might get removed without notice\n    this.enableMultiStreamHacks = false;\n    if (constraints && constraints.optional &&\n            detectedBrowser === 'chrome') {\n        constraints.optional.forEach(function (constraint) {\n            if (constraint.enableMultiStreamHacks) {\n                self.enableMultiStreamHacks = true;\n            }\n        });\n    }\n    // EXPERIMENTAL FLAG, might get removed without notice\n    this.restrictBandwidth = 0;\n    if (constraints && constraints.optional) {\n        constraints.optional.forEach(function (constraint) {\n            if (constraint.andyetRestrictBandwidth) {\n                self.restrictBandwidth = constraint.andyetRestrictBandwidth;\n            }\n        });\n    }\n\n    // EXPERIMENTAL FLAG, might get removed without notice\n    // bundle up ice candidates, only works for jingle mode\n    // number > 0 is the delay to wait for additional candidates\n    // ~20ms seems good\n    this.batchIceCandidates = 0;\n    if (constraints && constraints.optional) {\n        constraints.optional.forEach(function (constraint) {\n            if (constraint.andyetBatchIce) {\n                self.batchIceCandidates = constraint.andyetBatchIce;\n            }\n        });\n    }\n    this.batchedIceCandidates = [];\n\n    // EXPERIMENTAL FLAG, might get removed without notice\n    // this attemps to strip out candidates with an already known foundation\n    // and type -- i.e. those which are gathered via the same TURN server\n    // but different transports (TURN udp, tcp and tls respectively)\n    if (constraints && constraints.optional && detectedBrowser === 'chrome') {\n        constraints.optional.forEach(function (constraint) {\n            if (constraint.andyetFasterICE) {\n                self.eliminateDuplicateCandidates = constraint.andyetFasterICE;\n            }\n        });\n    }\n    // EXPERIMENTAL FLAG, might get removed without notice\n    // when using a server such as the jitsi videobridge we don't need to signal\n    // our candidates\n    if (constraints && constraints.optional) {\n        constraints.optional.forEach(function (constraint) {\n            if (constraint.andyetDontSignalCandidates) {\n                self.dontSignalCandidates = constraint.andyetDontSignalCandidates;\n            }\n        });\n    }\n\n\n    // EXPERIMENTAL FLAG, might get removed without notice\n    this.assumeSetLocalSuccess = false;\n    if (constraints && constraints.optional) {\n        constraints.optional.forEach(function (constraint) {\n            if (constraint.andyetAssumeSetLocalSuccess) {\n                self.assumeSetLocalSuccess = constraint.andyetAssumeSetLocalSuccess;\n            }\n        });\n    }\n\n    // EXPERIMENTAL FLAG, might get removed without notice\n    // working around https://bugzilla.mozilla.org/show_bug.cgi?id=1087551\n    // pass in a timeout for this\n    if (detectedBrowser === 'firefox') {\n        if (constraints && constraints.optional) {\n            this.wtFirefox = 0;\n            constraints.optional.forEach(function (constraint) {\n                if (constraint.andyetFirefoxMakesMeSad) {\n                    self.wtFirefox = constraint.andyetFirefoxMakesMeSad;\n                    if (self.wtFirefox > 0) {\n                        self.firefoxcandidatebuffer = [];\n                    }\n                }\n            });\n        }\n    }\n\n\n    this.pc = new Peerconn(config, constraints);\n\n    this.getLocalStreams = this.pc.getLocalStreams.bind(this.pc);\n    this.getRemoteStreams = this.pc.getRemoteStreams.bind(this.pc);\n    this.addStream = this.pc.addStream.bind(this.pc);\n    this.removeStream = this.pc.removeStream.bind(this.pc);\n\n    // proxy events\n    this.pc.on('*', function () {\n        self.emit.apply(self, arguments);\n    });\n\n    // proxy some events directly\n    this.pc.onremovestream = this.emit.bind(this, 'removeStream');\n    this.pc.onaddstream = this.emit.bind(this, 'addStream');\n    this.pc.onnegotiationneeded = this.emit.bind(this, 'negotiationNeeded');\n    this.pc.oniceconnectionstatechange = this.emit.bind(this, 'iceConnectionStateChange');\n    this.pc.onsignalingstatechange = this.emit.bind(this, 'signalingStateChange');\n\n    // handle ice candidate and data channel events\n    this.pc.onicecandidate = this._onIce.bind(this);\n    this.pc.ondatachannel = this._onDataChannel.bind(this);\n\n    this.localDescription = {\n        contents: []\n    };\n    this.remoteDescription = {\n        contents: []\n    };\n\n    this.config = {\n        debug: false,\n        sid: '',\n        isInitiator: true,\n        sdpSessionID: Date.now(),\n        useJingle: false\n    };\n\n    this.iceCredentials = {\n        local: {},\n        remote: {}\n    };\n\n    // apply our config\n    for (item in config) {\n        this.config[item] = config[item];\n    }\n\n    if (this.config.debug) {\n        this.on('*', function () {\n            var logger = config.logger || console;\n            logger.log('PeerConnection event:', arguments);\n        });\n    }\n    this.hadLocalStunCandidate = false;\n    this.hadRemoteStunCandidate = false;\n    this.hadLocalRelayCandidate = false;\n    this.hadRemoteRelayCandidate = false;\n\n    this.hadLocalIPv6Candidate = false;\n    this.hadRemoteIPv6Candidate = false;\n\n    // keeping references for all our data channels\n    // so they dont get garbage collected\n    // can be removed once the following bugs have been fixed\n    // https://crbug.com/405545\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=964092\n    // to be filed for opera\n    this._remoteDataChannels = [];\n    this._localDataChannels = [];\n\n    this._candidateBuffer = [];\n}\n\nutil.inherits(PeerConnection, WildEmitter);\n\nObject.defineProperty(PeerConnection.prototype, 'signalingState', {\n    get: function () {\n        return this.pc.signalingState;\n    }\n});\nObject.defineProperty(PeerConnection.prototype, 'iceConnectionState', {\n    get: function () {\n        return this.pc.iceConnectionState;\n    }\n});\n\nPeerConnection.prototype._role = function () {\n    return this.isInitiator ? 'initiator' : 'responder';\n};\n\n// Add a stream to the peer connection object\nPeerConnection.prototype.addStream = function (stream) {\n    this.localStream = stream;\n    this.pc.addStream(stream);\n};\n\n// helper function to check if a remote candidate is a stun/relay\n// candidate or an ipv6 candidate\nPeerConnection.prototype._checkLocalCandidate = function (candidate) {\n    var cand = SJJ.toCandidateJSON(candidate);\n    if (cand.type == 'srflx') {\n        this.hadLocalStunCandidate = true;\n    } else if (cand.type == 'relay') {\n        this.hadLocalRelayCandidate = true;\n    }\n    if (cand.ip.indexOf(':') != -1) {\n        this.hadLocalIPv6Candidate = true;\n    }\n};\n\n// helper function to check if a remote candidate is a stun/relay\n// candidate or an ipv6 candidate\nPeerConnection.prototype._checkRemoteCandidate = function (candidate) {\n    var cand = SJJ.toCandidateJSON(candidate);\n    if (cand.type == 'srflx') {\n        this.hadRemoteStunCandidate = true;\n    } else if (cand.type == 'relay') {\n        this.hadRemoteRelayCandidate = true;\n    }\n    if (cand.ip.indexOf(':') != -1) {\n        this.hadRemoteIPv6Candidate = true;\n    }\n};\n\n\n// Init and add ice candidate object with correct constructor\nPeerConnection.prototype.processIce = function (update, cb) {\n    cb = cb || function () {};\n    var self = this;\n\n    // ignore any added ice candidates to avoid errors. why does the\n    // spec not do this?\n    if (this.pc.signalingState === 'closed') return cb();\n\n    if (update.contents || (update.jingle && update.jingle.contents)) {\n        var contentNames = this.remoteDescription.contents.map(function (c) { return c.name; });\n        var contents = update.contents || update.jingle.contents;\n\n        contents.forEach(function (content) {\n            var transport = content.transport || {};\n            var candidates = transport.candidates || [];\n            var mline = contentNames.indexOf(content.name);\n            var mid = content.name;\n            var remoteContent = self.remoteDescription.contents.find(function (c) {\n                return c.name === content.name;\n            });\n\n            // process candidates as a callback, in case we need to\n            // update ufrag and pwd with offer/answer\n            var processCandidates = function () {\n                candidates.forEach(\n                    function (candidate) {\n                    var iceCandidate = SJJ.toCandidateSDP(candidate) + '\\r\\n';\n                    self.pc.addIceCandidate(\n                        new RTCIceCandidate({\n                            candidate: iceCandidate,\n                            sdpMLineIndex: mline,\n                            sdpMid: mid\n                        }), function () {\n                            // well, this success callback is pretty meaningless\n                        },\n                        function (err) {\n                            self.emit('error', err);\n                        }\n                    );\n                    self._checkRemoteCandidate(iceCandidate);\n                });\n                cb();\n            };\n\n            if (self.iceCredentials.remote[content.name] && transport.ufrag &&\n                self.iceCredentials.remote[content.name].ufrag !== transport.ufrag) {\n                if (remoteContent) {\n                    remoteContent.transport.ufrag = transport.ufrag;\n                    remoteContent.transport.pwd = transport.pwd;\n                    var offer = {\n                        type: 'offer',\n                        jingle: self.remoteDescription\n                    };\n                    offer.sdp = SJJ.toSessionSDP(offer.jingle, {\n                        sid: self.config.sdpSessionID,\n                        role: self._role(),\n                        direction: 'incoming'\n                    });\n                    self.pc.setRemoteDescription(new RTCSessionDescription(offer),\n                        function () {\n                            processCandidates();\n                        },\n                        function (err) {\n                            self.emit('error', err);\n                        }\n                    );\n                } else {\n                    self.emit('error', 'ice restart failed to find matching content');\n                }\n            } else {\n                processCandidates();\n            }\n        });\n    } else {\n        // working around https://code.google.com/p/webrtc/issues/detail?id=3669\n        if (update.candidate && update.candidate.candidate.indexOf('a=') !== 0) {\n            update.candidate.candidate = 'a=' + update.candidate.candidate;\n        }\n\n        if (this.wtFirefox && this.firefoxcandidatebuffer !== null) {\n            // we cant add this yet due to https://bugzilla.mozilla.org/show_bug.cgi?id=1087551\n            if (this.pc.localDescription && this.pc.localDescription.type === 'offer') {\n                this.firefoxcandidatebuffer.push(update.candidate);\n                return cb();\n            }\n        }\n\n        self.pc.addIceCandidate(\n            new RTCIceCandidate(update.candidate),\n            function () { },\n            function (err) {\n                self.emit('error', err);\n            }\n        );\n        self._checkRemoteCandidate(update.candidate.candidate);\n        cb();\n    }\n};\n\n// Generate and emit an offer with the given constraints\nPeerConnection.prototype.offer = function (constraints, cb) {\n    var self = this;\n    var hasConstraints = arguments.length === 2;\n    var mediaConstraints = hasConstraints && constraints ? constraints : {\n            offerToReceiveAudio: 1,\n            offerToReceiveVideo: 1\n        };\n    cb = hasConstraints ? cb : constraints;\n    cb = cb || function () {};\n\n    if (this.pc.signalingState === 'closed') return cb('Already closed');\n\n    // Actually generate the offer\n    this.pc.createOffer(\n        function (offer) {\n            // does not work for jingle, but jingle.js doesn't need\n            // this hack...\n            var expandedOffer = {\n                type: 'offer',\n                sdp: offer.sdp\n            };\n            if (self.assumeSetLocalSuccess) {\n                self.emit('offer', expandedOffer);\n                cb(null, expandedOffer);\n            }\n            self._candidateBuffer = [];\n            self.pc.setLocalDescription(offer,\n                function () {\n                    var jingle;\n                    if (self.config.useJingle) {\n                        jingle = SJJ.toSessionJSON(offer.sdp, {\n                            role: self._role(),\n                            direction: 'outgoing'\n                        });\n                        jingle.sid = self.config.sid;\n                        self.localDescription = jingle;\n\n                        // Save ICE credentials\n                        jingle.contents.forEach(function (content) {\n                            var transport = content.transport || {};\n                            if (transport.ufrag) {\n                                self.iceCredentials.local[content.name] = {\n                                    ufrag: transport.ufrag,\n                                    pwd: transport.pwd\n                                };\n                            }\n                        });\n\n                        expandedOffer.jingle = jingle;\n                    }\n                    expandedOffer.sdp.split('\\r\\n').forEach(function (line) {\n                        if (line.indexOf('a=candidate:') === 0) {\n                            self._checkLocalCandidate(line);\n                        }\n                    });\n\n                    if (!self.assumeSetLocalSuccess) {\n                        self.emit('offer', expandedOffer);\n                        cb(null, expandedOffer);\n                    }\n                },\n                function (err) {\n                    self.emit('error', err);\n                    cb(err);\n                }\n            );\n        },\n        function (err) {\n            self.emit('error', err);\n            cb(err);\n        },\n        mediaConstraints\n    );\n};\n\n\n// Process an incoming offer so that ICE may proceed before deciding\n// to answer the request.\nPeerConnection.prototype.handleOffer = function (offer, cb) {\n    cb = cb || function () {};\n    var self = this;\n    offer.type = 'offer';\n    if (offer.jingle) {\n        if (this.enableChromeNativeSimulcast) {\n            offer.jingle.contents.forEach(function (content) {\n                if (content.name === 'video') {\n                    content.application.googConferenceFlag = true;\n                }\n\n            });\n        }\n        if (this.enableMultiStreamHacks) {\n            // add a mixed video stream as first stream\n            offer.jingle.contents.forEach(function (content) {\n                if (content.name === 'video') {\n                    var sources = content.application.sources || [];\n                    if (sources.length === 0 || sources[0].ssrc !== \"3735928559\") {\n                        sources.unshift({\n                            ssrc: \"3735928559\", // 0xdeadbeef\n                            parameters: [\n                                {\n                                    key: \"cname\",\n                                    value: \"deadbeef\"\n                                },\n                                {\n                                    key: \"msid\",\n                                    value: \"mixyourfecintothis please\"\n                                }\n                            ]\n                        });\n                        content.application.sources = sources;\n                    }\n                }\n            });\n        }\n        if (self.restrictBandwidth > 0) {\n            if (offer.jingle.contents.length >= 2 && offer.jingle.contents[1].name === 'video') {\n                var content = offer.jingle.contents[1];\n                var hasBw = content.application && content.application.bandwidth && content.application.bandwidth.bandwidth;\n                if (!hasBw) {\n                    offer.jingle.contents[1].application.bandwidth = { type: 'AS', bandwidth: self.restrictBandwidth.toString() };\n                    offer.sdp = SJJ.toSessionSDP(offer.jingle, {\n                        sid: self.config.sdpSessionID,\n                        role: self._role(),\n                        direction: 'outgoing'\n                    });\n                }\n            }\n        }\n        // Save ICE credentials\n        offer.jingle.contents.forEach(function (content) {\n            var transport = content.transport || {};\n            if (transport.ufrag) {\n                self.iceCredentials.remote[content.name] = {\n                    ufrag: transport.ufrag,\n                    pwd: transport.pwd\n                };\n            }\n        });\n        offer.sdp = SJJ.toSessionSDP(offer.jingle, {\n            sid: self.config.sdpSessionID,\n            role: self._role(),\n            direction: 'incoming'\n        });\n        self.remoteDescription = offer.jingle;\n    }\n    offer.sdp.split('\\r\\n').forEach(function (line) {\n        if (line.indexOf('a=candidate:') === 0) {\n            self._checkRemoteCandidate(line);\n        }\n    });\n    self.pc.setRemoteDescription(new RTCSessionDescription(offer),\n        function () {\n            cb();\n        },\n        cb\n    );\n};\n\n// Answer an offer with audio only\nPeerConnection.prototype.answerAudioOnly = function (cb) {\n    var mediaConstraints = {\n            mandatory: {\n                OfferToReceiveAudio: true,\n                OfferToReceiveVideo: false\n            }\n        };\n    this._answer(mediaConstraints, cb);\n};\n\n// Answer an offer without offering to recieve\nPeerConnection.prototype.answerBroadcastOnly = function (cb) {\n    var mediaConstraints = {\n            mandatory: {\n                OfferToReceiveAudio: false,\n                OfferToReceiveVideo: false\n            }\n        };\n    this._answer(mediaConstraints, cb);\n};\n\n// Answer an offer with given constraints default is audio/video\nPeerConnection.prototype.answer = function (constraints, cb) {\n    var hasConstraints = arguments.length === 2;\n    var callback = hasConstraints ? cb : constraints;\n    var mediaConstraints = hasConstraints && constraints ? constraints : {\n            mandatory: {\n                OfferToReceiveAudio: true,\n                OfferToReceiveVideo: true\n            }\n        };\n\n    this._answer(mediaConstraints, callback);\n};\n\n// Process an answer\nPeerConnection.prototype.handleAnswer = function (answer, cb) {\n    cb = cb || function () {};\n    var self = this;\n    if (answer.jingle) {\n        answer.sdp = SJJ.toSessionSDP(answer.jingle, {\n            sid: self.config.sdpSessionID,\n            role: self._role(),\n            direction: 'incoming'\n        });\n        self.remoteDescription = answer.jingle;\n\n        // Save ICE credentials\n        answer.jingle.contents.forEach(function (content) {\n            var transport = content.transport || {};\n            if (transport.ufrag) {\n                self.iceCredentials.remote[content.name] = {\n                    ufrag: transport.ufrag,\n                    pwd: transport.pwd\n                };\n            }\n        });\n    }\n    answer.sdp.split('\\r\\n').forEach(function (line) {\n        if (line.indexOf('a=candidate:') === 0) {\n            self._checkRemoteCandidate(line);\n        }\n    });\n    self.pc.setRemoteDescription(\n        new RTCSessionDescription(answer),\n        function () {\n            if (self.wtFirefox) {\n                window.setTimeout(function () {\n                    self.firefoxcandidatebuffer.forEach(function (candidate) {\n                        // add candidates later\n                        self.pc.addIceCandidate(\n                            new RTCIceCandidate(candidate),\n                            function () { },\n                            function (err) {\n                                self.emit('error', err);\n                            }\n                        );\n                        self._checkRemoteCandidate(candidate.candidate);\n                    });\n                    self.firefoxcandidatebuffer = null;\n                }, self.wtFirefox);\n            }\n            cb(null);\n        },\n        cb\n    );\n};\n\n// Close the peer connection\nPeerConnection.prototype.close = function () {\n    this.pc.close();\n\n    this._localDataChannels = [];\n    this._remoteDataChannels = [];\n\n    this.emit('close');\n};\n\n// Internal code sharing for various types of answer methods\nPeerConnection.prototype._answer = function (constraints, cb) {\n    cb = cb || function () {};\n    var self = this;\n    if (!this.pc.remoteDescription) {\n        // the old API is used, call handleOffer\n        throw new Error('remoteDescription not set');\n    }\n\n    if (this.pc.signalingState === 'closed') return cb('Already closed');\n\n    self.pc.createAnswer(\n        function (answer) {\n            var sim = [];\n            if (self.enableChromeNativeSimulcast) {\n                // native simulcast part 1: add another SSRC\n                answer.jingle = SJJ.toSessionJSON(answer.sdp, {\n                    role: self._role(),\n                    direction: 'outgoing'\n                });\n                if (answer.jingle.contents.length >= 2 && answer.jingle.contents[1].name === 'video') {\n                    var groups = answer.jingle.contents[1].application.sourceGroups || [];\n                    var hasSim = false;\n                    groups.forEach(function (group) {\n                        if (group.semantics == 'SIM') hasSim = true;\n                    });\n                    if (!hasSim &&\n                        answer.jingle.contents[1].application.sources.length) {\n                        var newssrc = JSON.parse(JSON.stringify(answer.jingle.contents[1].application.sources[0]));\n                        newssrc.ssrc = '' + Math.floor(Math.random() * 0xffffffff); // FIXME: look for conflicts\n                        answer.jingle.contents[1].application.sources.push(newssrc);\n\n                        sim.push(answer.jingle.contents[1].application.sources[0].ssrc);\n                        sim.push(newssrc.ssrc);\n                        groups.push({\n                            semantics: 'SIM',\n                            sources: sim\n                        });\n\n                        // also create an RTX one for the SIM one\n                        var rtxssrc = JSON.parse(JSON.stringify(newssrc));\n                        rtxssrc.ssrc = '' + Math.floor(Math.random() * 0xffffffff); // FIXME: look for conflicts\n                        answer.jingle.contents[1].application.sources.push(rtxssrc);\n                        groups.push({\n                            semantics: 'FID',\n                            sources: [newssrc.ssrc, rtxssrc.ssrc]\n                        });\n\n                        answer.jingle.contents[1].application.sourceGroups = groups;\n                        answer.sdp = SJJ.toSessionSDP(answer.jingle, {\n                            sid: self.config.sdpSessionID,\n                            role: self._role(),\n                            direction: 'outgoing'\n                        });\n                    }\n                }\n            }\n            var expandedAnswer = {\n                type: 'answer',\n                sdp: answer.sdp\n            };\n            if (self.assumeSetLocalSuccess) {\n                // not safe to do when doing simulcast mangling\n                var copy = cloneDeep(expandedAnswer);\n                self.emit('answer', copy);\n                cb(null, copy);\n            }\n            self._candidateBuffer = [];\n            self.pc.setLocalDescription(answer,\n                function () {\n                    if (self.config.useJingle) {\n                        var jingle = SJJ.toSessionJSON(answer.sdp, {\n                            role: self._role(),\n                            direction: 'outgoing'\n                        });\n                        jingle.sid = self.config.sid;\n                        self.localDescription = jingle;\n                        expandedAnswer.jingle = jingle;\n                    }\n                    if (self.enableChromeNativeSimulcast) {\n                        // native simulcast part 2:\n                        // signal multiple tracks to the receiver\n                        // for anything in the SIM group\n                        if (!expandedAnswer.jingle) {\n                            expandedAnswer.jingle = SJJ.toSessionJSON(answer.sdp, {\n                                role: self._role(),\n                                direction: 'outgoing'\n                            });\n                        }\n                        expandedAnswer.jingle.contents[1].application.sources.forEach(function (source, idx) {\n                            // the floor idx/2 is a hack that relies on a particular order\n                            // of groups, alternating between sim and rtx\n                            source.parameters = source.parameters.map(function (parameter) {\n                                if (parameter.key === 'msid') {\n                                    parameter.value += '-' + Math.floor(idx / 2);\n                                }\n                                return parameter;\n                            });\n                        });\n                        expandedAnswer.sdp = SJJ.toSessionSDP(expandedAnswer.jingle, {\n                            sid: self.sdpSessionID,\n                            role: self._role(),\n                            direction: 'outgoing'\n                        });\n                    }\n                    expandedAnswer.sdp.split('\\r\\n').forEach(function (line) {\n                        if (line.indexOf('a=candidate:') === 0) {\n                            self._checkLocalCandidate(line);\n                        }\n                    });\n                    if (!self.assumeSetLocalSuccess) {\n                        var copy = cloneDeep(expandedAnswer);\n                        self.emit('answer', copy);\n                        cb(null, copy);\n                    }\n                },\n                function (err) {\n                    self.emit('error', err);\n                    cb(err);\n                }\n            );\n        },\n        function (err) {\n            self.emit('error', err);\n            cb(err);\n        },\n        constraints\n    );\n};\n\n// Internal method for emitting ice candidates on our peer object\nPeerConnection.prototype._onIce = function (event) {\n    var self = this;\n    if (event.candidate) {\n        if (this.dontSignalCandidates) return;\n        var ice = event.candidate;\n\n        var expandedCandidate = {\n            candidate: {\n                candidate: ice.candidate,\n                sdpMid: ice.sdpMid,\n                sdpMLineIndex: ice.sdpMLineIndex\n            }\n        };\n        this._checkLocalCandidate(ice.candidate);\n\n        var cand = SJJ.toCandidateJSON(ice.candidate);\n\n        var already;\n        var idx;\n        if (this.eliminateDuplicateCandidates && cand.type === 'relay') {\n            // drop candidates with same foundation, component\n            // take local type pref into account so we don't ignore udp\n            // ones when we know about a TCP one. unlikely but...\n            already = this._candidateBuffer.filter(\n                function (c) {\n                    return c.type === 'relay';\n                }).map(function (c) {\n                    return c.foundation + ':' + c.component;\n                }\n            );\n            idx = already.indexOf(cand.foundation + ':' + cand.component);\n            // remember: local type pref of udp is 0, tcp 1, tls 2\n            if (idx > -1 && ((cand.priority >> 24) >= (already[idx].priority >> 24))) {\n                // drop it, same foundation with higher (worse) type pref\n                return;\n            }\n        }\n        if (this.config.bundlePolicy === 'max-bundle') {\n            // drop candidates which are duplicate for audio/video/data\n            // duplicate means same host/port but different sdpMid\n            already = this._candidateBuffer.filter(\n                function (c) {\n                    return cand.type === c.type;\n                }).map(function (cand) {\n                    return cand.address + ':' + cand.port;\n                }\n            );\n            idx = already.indexOf(cand.address + ':' + cand.port);\n            if (idx > -1) return;\n        }\n        // also drop rtcp candidates since we know the peer supports RTCP-MUX\n        // this is a workaround until browsers implement this natively\n        if (this.config.rtcpMuxPolicy === 'require' && cand.component === '2') {\n            return;\n        }\n        this._candidateBuffer.push(cand);\n\n        if (self.config.useJingle) {\n            if (!ice.sdpMid) { // firefox doesn't set this\n                if (self.pc.remoteDescription && self.pc.remoteDescription.type === 'offer') {\n                    // preserve name from remote\n                    ice.sdpMid = self.remoteDescription.contents[ice.sdpMLineIndex].name;\n                } else {\n                    ice.sdpMid = self.localDescription.contents[ice.sdpMLineIndex].name;\n                }\n            }\n            if (!self.iceCredentials.local[ice.sdpMid]) {\n                var jingle = SJJ.toSessionJSON(self.pc.localDescription.sdp, {\n                    role: self._role(),\n                    direction: 'outgoing'\n                });\n                jingle.contents.forEach(function (content) {\n                    var transport = content.transport || {};\n                    if (transport.ufrag) {\n                        self.iceCredentials.local[content.name] = {\n                            ufrag: transport.ufrag,\n                            pwd: transport.pwd\n                        };\n                    }\n                });\n            }\n            expandedCandidate.jingle = {\n                contents: [{\n                    name: ice.sdpMid,\n                    creator: self._role(),\n                    transport: {\n                        transportType: 'iceUdp',\n                        ufrag: self.iceCredentials.local[ice.sdpMid].ufrag,\n                        pwd: self.iceCredentials.local[ice.sdpMid].pwd,\n                        candidates: [\n                            cand\n                        ]\n                    }\n                }]\n            };\n            if (self.batchIceCandidates > 0) {\n                if (self.batchedIceCandidates.length === 0) {\n                    window.setTimeout(function () {\n                        var contents = {};\n                        self.batchedIceCandidates.forEach(function (content) {\n                            content = content.contents[0];\n                            if (!contents[content.name]) contents[content.name] = content;\n                            contents[content.name].transport.candidates.push(content.transport.candidates[0]);\n                        });\n                        var newCand = {\n                            jingle: {\n                                contents: []\n                            }\n                        };\n                        Object.keys(contents).forEach(function (name) {\n                            newCand.jingle.contents.push(contents[name]);\n                        });\n                        self.batchedIceCandidates = [];\n                        self.emit('ice', newCand);\n                    }, self.batchIceCandidates);\n                }\n                self.batchedIceCandidates.push(expandedCandidate.jingle);\n                return;\n            }\n\n        }\n        this.emit('ice', expandedCandidate);\n    } else {\n        this.emit('endOfCandidates');\n    }\n};\n\n// Internal method for processing a new data channel being added by the\n// other peer.\nPeerConnection.prototype._onDataChannel = function (event) {\n    // make sure we keep a reference so this doesn't get garbage collected\n    var channel = event.channel;\n    this._remoteDataChannels.push(channel);\n\n    this.emit('addChannel', channel);\n};\n\n// Create a data channel spec reference:\n// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCDataChannelInit\nPeerConnection.prototype.createDataChannel = function (name, opts) {\n    var channel = this.pc.createDataChannel(name, opts);\n\n    // make sure we keep a reference so this doesn't get garbage collected\n    this._localDataChannels.push(channel);\n\n    return channel;\n};\n\nPeerConnection.prototype.getStats = function (cb) {\n    this.pc.getStats(null,\n        function (res) {\n            cb(null, res);\n        },\n        function (err) {\n            cb(err);\n        }\n    );\n};\n\nmodule.exports = PeerConnection;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDcxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9ydGNwZWVyY29ubmVjdGlvbi9ydGNwZWVyY29ubmVjdGlvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBTSkogPSByZXF1aXJlKCdzZHAtamluZ2xlLWpzb24nKTtcbnZhciBXaWxkRW1pdHRlciA9IHJlcXVpcmUoJ3dpbGRlbWl0dGVyJyk7XG52YXIgUGVlcmNvbm4gPSByZXF1aXJlKCd0cmFjZWFibGVwZWVyY29ubmVjdGlvbicpO1xudmFyIGFkYXB0ZXIgPSByZXF1aXJlKCd3ZWJydGMtYWRhcHRlcicpO1xudmFyIGNsb25lRGVlcCA9IHJlcXVpcmUoJ2xvZGFzaC5jbG9uZWRlZXAnKTtcblxuZnVuY3Rpb24gUGVlckNvbm5lY3Rpb24oY29uZmlnLCBjb25zdHJhaW50cykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgaXRlbTtcbiAgICBXaWxkRW1pdHRlci5jYWxsKHRoaXMpO1xuXG4gICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICAgIGNvbmZpZy5pY2VTZXJ2ZXJzID0gY29uZmlnLmljZVNlcnZlcnMgfHwgW107XG5cbiAgICB2YXIgZGV0ZWN0ZWRCcm93c2VyID0gYWRhcHRlci5icm93c2VyRGV0YWlscy5icm93c2VyO1xuXG4gICAgLy8gbWFrZSBzdXJlIHRoaXMgb25seSBnZXRzIGVuYWJsZWQgaW4gR29vZ2xlIENocm9tZVxuICAgIC8vIEVYUEVSSU1FTlRBTCBGTEFHLCBtaWdodCBnZXQgcmVtb3ZlZCB3aXRob3V0IG5vdGljZVxuICAgIHRoaXMuZW5hYmxlQ2hyb21lTmF0aXZlU2ltdWxjYXN0ID0gZmFsc2U7XG4gICAgaWYgKGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLm9wdGlvbmFsICYmXG4gICAgICAgICAgICBkZXRlY3RlZEJyb3dzZXIgPT09ICdjaHJvbWUnICYmXG4gICAgICAgICAgICBuYXZpZ2F0b3IuYXBwVmVyc2lvbi5tYXRjaCgvQ2hyb21pdW1cXC8vKSA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdHJhaW50cy5vcHRpb25hbC5mb3JFYWNoKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgICAgICBpZiAoY29uc3RyYWludC5lbmFibGVDaHJvbWVOYXRpdmVTaW11bGNhc3QpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmVuYWJsZUNocm9tZU5hdGl2ZVNpbXVsY2FzdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEVYUEVSSU1FTlRBTCBGTEFHLCBtaWdodCBnZXQgcmVtb3ZlZCB3aXRob3V0IG5vdGljZVxuICAgIHRoaXMuZW5hYmxlTXVsdGlTdHJlYW1IYWNrcyA9IGZhbHNlO1xuICAgIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy5vcHRpb25hbCAmJlxuICAgICAgICAgICAgZGV0ZWN0ZWRCcm93c2VyID09PSAnY2hyb21lJykge1xuICAgICAgICBjb25zdHJhaW50cy5vcHRpb25hbC5mb3JFYWNoKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgICAgICBpZiAoY29uc3RyYWludC5lbmFibGVNdWx0aVN0cmVhbUhhY2tzKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5lbmFibGVNdWx0aVN0cmVhbUhhY2tzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIEVYUEVSSU1FTlRBTCBGTEFHLCBtaWdodCBnZXQgcmVtb3ZlZCB3aXRob3V0IG5vdGljZVxuICAgIHRoaXMucmVzdHJpY3RCYW5kd2lkdGggPSAwO1xuICAgIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy5vcHRpb25hbCkge1xuICAgICAgICBjb25zdHJhaW50cy5vcHRpb25hbC5mb3JFYWNoKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgICAgICBpZiAoY29uc3RyYWludC5hbmR5ZXRSZXN0cmljdEJhbmR3aWR0aCkge1xuICAgICAgICAgICAgICAgIHNlbGYucmVzdHJpY3RCYW5kd2lkdGggPSBjb25zdHJhaW50LmFuZHlldFJlc3RyaWN0QmFuZHdpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBFWFBFUklNRU5UQUwgRkxBRywgbWlnaHQgZ2V0IHJlbW92ZWQgd2l0aG91dCBub3RpY2VcbiAgICAvLyBidW5kbGUgdXAgaWNlIGNhbmRpZGF0ZXMsIG9ubHkgd29ya3MgZm9yIGppbmdsZSBtb2RlXG4gICAgLy8gbnVtYmVyID4gMCBpcyB0aGUgZGVsYXkgdG8gd2FpdCBmb3IgYWRkaXRpb25hbCBjYW5kaWRhdGVzXG4gICAgLy8gfjIwbXMgc2VlbXMgZ29vZFxuICAgIHRoaXMuYmF0Y2hJY2VDYW5kaWRhdGVzID0gMDtcbiAgICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMub3B0aW9uYWwpIHtcbiAgICAgICAgY29uc3RyYWludHMub3B0aW9uYWwuZm9yRWFjaChmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnQuYW5keWV0QmF0Y2hJY2UpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmJhdGNoSWNlQ2FuZGlkYXRlcyA9IGNvbnN0cmFpbnQuYW5keWV0QmF0Y2hJY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmJhdGNoZWRJY2VDYW5kaWRhdGVzID0gW107XG5cbiAgICAvLyBFWFBFUklNRU5UQUwgRkxBRywgbWlnaHQgZ2V0IHJlbW92ZWQgd2l0aG91dCBub3RpY2VcbiAgICAvLyB0aGlzIGF0dGVtcHMgdG8gc3RyaXAgb3V0IGNhbmRpZGF0ZXMgd2l0aCBhbiBhbHJlYWR5IGtub3duIGZvdW5kYXRpb25cbiAgICAvLyBhbmQgdHlwZSAtLSBpLmUuIHRob3NlIHdoaWNoIGFyZSBnYXRoZXJlZCB2aWEgdGhlIHNhbWUgVFVSTiBzZXJ2ZXJcbiAgICAvLyBidXQgZGlmZmVyZW50IHRyYW5zcG9ydHMgKFRVUk4gdWRwLCB0Y3AgYW5kIHRscyByZXNwZWN0aXZlbHkpXG4gICAgaWYgKGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLm9wdGlvbmFsICYmIGRldGVjdGVkQnJvd3NlciA9PT0gJ2Nocm9tZScpIHtcbiAgICAgICAgY29uc3RyYWludHMub3B0aW9uYWwuZm9yRWFjaChmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnQuYW5keWV0RmFzdGVySUNFKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5lbGltaW5hdGVEdXBsaWNhdGVDYW5kaWRhdGVzID0gY29uc3RyYWludC5hbmR5ZXRGYXN0ZXJJQ0U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBFWFBFUklNRU5UQUwgRkxBRywgbWlnaHQgZ2V0IHJlbW92ZWQgd2l0aG91dCBub3RpY2VcbiAgICAvLyB3aGVuIHVzaW5nIGEgc2VydmVyIHN1Y2ggYXMgdGhlIGppdHNpIHZpZGVvYnJpZGdlIHdlIGRvbid0IG5lZWQgdG8gc2lnbmFsXG4gICAgLy8gb3VyIGNhbmRpZGF0ZXNcbiAgICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMub3B0aW9uYWwpIHtcbiAgICAgICAgY29uc3RyYWludHMub3B0aW9uYWwuZm9yRWFjaChmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnQuYW5keWV0RG9udFNpZ25hbENhbmRpZGF0ZXMpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmRvbnRTaWduYWxDYW5kaWRhdGVzID0gY29uc3RyYWludC5hbmR5ZXREb250U2lnbmFsQ2FuZGlkYXRlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICAvLyBFWFBFUklNRU5UQUwgRkxBRywgbWlnaHQgZ2V0IHJlbW92ZWQgd2l0aG91dCBub3RpY2VcbiAgICB0aGlzLmFzc3VtZVNldExvY2FsU3VjY2VzcyA9IGZhbHNlO1xuICAgIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy5vcHRpb25hbCkge1xuICAgICAgICBjb25zdHJhaW50cy5vcHRpb25hbC5mb3JFYWNoKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgICAgICBpZiAoY29uc3RyYWludC5hbmR5ZXRBc3N1bWVTZXRMb2NhbFN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmFzc3VtZVNldExvY2FsU3VjY2VzcyA9IGNvbnN0cmFpbnQuYW5keWV0QXNzdW1lU2V0TG9jYWxTdWNjZXNzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBFWFBFUklNRU5UQUwgRkxBRywgbWlnaHQgZ2V0IHJlbW92ZWQgd2l0aG91dCBub3RpY2VcbiAgICAvLyB3b3JraW5nIGFyb3VuZCBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDg3NTUxXG4gICAgLy8gcGFzcyBpbiBhIHRpbWVvdXQgZm9yIHRoaXNcbiAgICBpZiAoZGV0ZWN0ZWRCcm93c2VyID09PSAnZmlyZWZveCcpIHtcbiAgICAgICAgaWYgKGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLm9wdGlvbmFsKSB7XG4gICAgICAgICAgICB0aGlzLnd0RmlyZWZveCA9IDA7XG4gICAgICAgICAgICBjb25zdHJhaW50cy5vcHRpb25hbC5mb3JFYWNoKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnQuYW5keWV0RmlyZWZveE1ha2VzTWVTYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi53dEZpcmVmb3ggPSBjb25zdHJhaW50LmFuZHlldEZpcmVmb3hNYWtlc01lU2FkO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi53dEZpcmVmb3ggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVmb3hjYW5kaWRhdGVidWZmZXIgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICB0aGlzLnBjID0gbmV3IFBlZXJjb25uKGNvbmZpZywgY29uc3RyYWludHMpO1xuXG4gICAgdGhpcy5nZXRMb2NhbFN0cmVhbXMgPSB0aGlzLnBjLmdldExvY2FsU3RyZWFtcy5iaW5kKHRoaXMucGMpO1xuICAgIHRoaXMuZ2V0UmVtb3RlU3RyZWFtcyA9IHRoaXMucGMuZ2V0UmVtb3RlU3RyZWFtcy5iaW5kKHRoaXMucGMpO1xuICAgIHRoaXMuYWRkU3RyZWFtID0gdGhpcy5wYy5hZGRTdHJlYW0uYmluZCh0aGlzLnBjKTtcbiAgICB0aGlzLnJlbW92ZVN0cmVhbSA9IHRoaXMucGMucmVtb3ZlU3RyZWFtLmJpbmQodGhpcy5wYyk7XG5cbiAgICAvLyBwcm94eSBldmVudHNcbiAgICB0aGlzLnBjLm9uKCcqJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLmVtaXQuYXBwbHkoc2VsZiwgYXJndW1lbnRzKTtcbiAgICB9KTtcblxuICAgIC8vIHByb3h5IHNvbWUgZXZlbnRzIGRpcmVjdGx5XG4gICAgdGhpcy5wYy5vbnJlbW92ZXN0cmVhbSA9IHRoaXMuZW1pdC5iaW5kKHRoaXMsICdyZW1vdmVTdHJlYW0nKTtcbiAgICB0aGlzLnBjLm9uYWRkc3RyZWFtID0gdGhpcy5lbWl0LmJpbmQodGhpcywgJ2FkZFN0cmVhbScpO1xuICAgIHRoaXMucGMub25uZWdvdGlhdGlvbm5lZWRlZCA9IHRoaXMuZW1pdC5iaW5kKHRoaXMsICduZWdvdGlhdGlvbk5lZWRlZCcpO1xuICAgIHRoaXMucGMub25pY2Vjb25uZWN0aW9uc3RhdGVjaGFuZ2UgPSB0aGlzLmVtaXQuYmluZCh0aGlzLCAnaWNlQ29ubmVjdGlvblN0YXRlQ2hhbmdlJyk7XG4gICAgdGhpcy5wYy5vbnNpZ25hbGluZ3N0YXRlY2hhbmdlID0gdGhpcy5lbWl0LmJpbmQodGhpcywgJ3NpZ25hbGluZ1N0YXRlQ2hhbmdlJyk7XG5cbiAgICAvLyBoYW5kbGUgaWNlIGNhbmRpZGF0ZSBhbmQgZGF0YSBjaGFubmVsIGV2ZW50c1xuICAgIHRoaXMucGMub25pY2VjYW5kaWRhdGUgPSB0aGlzLl9vbkljZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMucGMub25kYXRhY2hhbm5lbCA9IHRoaXMuX29uRGF0YUNoYW5uZWwuYmluZCh0aGlzKTtcblxuICAgIHRoaXMubG9jYWxEZXNjcmlwdGlvbiA9IHtcbiAgICAgICAgY29udGVudHM6IFtdXG4gICAgfTtcbiAgICB0aGlzLnJlbW90ZURlc2NyaXB0aW9uID0ge1xuICAgICAgICBjb250ZW50czogW11cbiAgICB9O1xuXG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICAgICAgc2lkOiAnJyxcbiAgICAgICAgaXNJbml0aWF0b3I6IHRydWUsXG4gICAgICAgIHNkcFNlc3Npb25JRDogRGF0ZS5ub3coKSxcbiAgICAgICAgdXNlSmluZ2xlOiBmYWxzZVxuICAgIH07XG5cbiAgICB0aGlzLmljZUNyZWRlbnRpYWxzID0ge1xuICAgICAgICBsb2NhbDoge30sXG4gICAgICAgIHJlbW90ZToge31cbiAgICB9O1xuXG4gICAgLy8gYXBwbHkgb3VyIGNvbmZpZ1xuICAgIGZvciAoaXRlbSBpbiBjb25maWcpIHtcbiAgICAgICAgdGhpcy5jb25maWdbaXRlbV0gPSBjb25maWdbaXRlbV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLmRlYnVnKSB7XG4gICAgICAgIHRoaXMub24oJyonLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbG9nZ2VyID0gY29uZmlnLmxvZ2dlciB8fCBjb25zb2xlO1xuICAgICAgICAgICAgbG9nZ2VyLmxvZygnUGVlckNvbm5lY3Rpb24gZXZlbnQ6JywgYXJndW1lbnRzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuaGFkTG9jYWxTdHVuQ2FuZGlkYXRlID0gZmFsc2U7XG4gICAgdGhpcy5oYWRSZW1vdGVTdHVuQ2FuZGlkYXRlID0gZmFsc2U7XG4gICAgdGhpcy5oYWRMb2NhbFJlbGF5Q2FuZGlkYXRlID0gZmFsc2U7XG4gICAgdGhpcy5oYWRSZW1vdGVSZWxheUNhbmRpZGF0ZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5oYWRMb2NhbElQdjZDYW5kaWRhdGUgPSBmYWxzZTtcbiAgICB0aGlzLmhhZFJlbW90ZUlQdjZDYW5kaWRhdGUgPSBmYWxzZTtcblxuICAgIC8vIGtlZXBpbmcgcmVmZXJlbmNlcyBmb3IgYWxsIG91ciBkYXRhIGNoYW5uZWxzXG4gICAgLy8gc28gdGhleSBkb250IGdldCBnYXJiYWdlIGNvbGxlY3RlZFxuICAgIC8vIGNhbiBiZSByZW1vdmVkIG9uY2UgdGhlIGZvbGxvd2luZyBidWdzIGhhdmUgYmVlbiBmaXhlZFxuICAgIC8vIGh0dHBzOi8vY3JidWcuY29tLzQwNTU0NVxuICAgIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTk2NDA5MlxuICAgIC8vIHRvIGJlIGZpbGVkIGZvciBvcGVyYVxuICAgIHRoaXMuX3JlbW90ZURhdGFDaGFubmVscyA9IFtdO1xuICAgIHRoaXMuX2xvY2FsRGF0YUNoYW5uZWxzID0gW107XG5cbiAgICB0aGlzLl9jYW5kaWRhdGVCdWZmZXIgPSBbXTtcbn1cblxudXRpbC5pbmhlcml0cyhQZWVyQ29ubmVjdGlvbiwgV2lsZEVtaXR0ZXIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLCAnc2lnbmFsaW5nU3RhdGUnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBjLnNpZ25hbGluZ1N0YXRlO1xuICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFBlZXJDb25uZWN0aW9uLnByb3RvdHlwZSwgJ2ljZUNvbm5lY3Rpb25TdGF0ZScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGMuaWNlQ29ubmVjdGlvblN0YXRlO1xuICAgIH1cbn0pO1xuXG5QZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuX3JvbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNJbml0aWF0b3IgPyAnaW5pdGlhdG9yJyA6ICdyZXNwb25kZXInO1xufTtcblxuLy8gQWRkIGEgc3RyZWFtIHRvIHRoZSBwZWVyIGNvbm5lY3Rpb24gb2JqZWN0XG5QZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuYWRkU3RyZWFtID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICAgIHRoaXMubG9jYWxTdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5wYy5hZGRTdHJlYW0oc3RyZWFtKTtcbn07XG5cbi8vIGhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiBhIHJlbW90ZSBjYW5kaWRhdGUgaXMgYSBzdHVuL3JlbGF5XG4vLyBjYW5kaWRhdGUgb3IgYW4gaXB2NiBjYW5kaWRhdGVcblBlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5fY2hlY2tMb2NhbENhbmRpZGF0ZSA9IGZ1bmN0aW9uIChjYW5kaWRhdGUpIHtcbiAgICB2YXIgY2FuZCA9IFNKSi50b0NhbmRpZGF0ZUpTT04oY2FuZGlkYXRlKTtcbiAgICBpZiAoY2FuZC50eXBlID09ICdzcmZseCcpIHtcbiAgICAgICAgdGhpcy5oYWRMb2NhbFN0dW5DYW5kaWRhdGUgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoY2FuZC50eXBlID09ICdyZWxheScpIHtcbiAgICAgICAgdGhpcy5oYWRMb2NhbFJlbGF5Q2FuZGlkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNhbmQuaXAuaW5kZXhPZignOicpICE9IC0xKSB7XG4gICAgICAgIHRoaXMuaGFkTG9jYWxJUHY2Q2FuZGlkYXRlID0gdHJ1ZTtcbiAgICB9XG59O1xuXG4vLyBoZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgYSByZW1vdGUgY2FuZGlkYXRlIGlzIGEgc3R1bi9yZWxheVxuLy8gY2FuZGlkYXRlIG9yIGFuIGlwdjYgY2FuZGlkYXRlXG5QZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuX2NoZWNrUmVtb3RlQ2FuZGlkYXRlID0gZnVuY3Rpb24gKGNhbmRpZGF0ZSkge1xuICAgIHZhciBjYW5kID0gU0pKLnRvQ2FuZGlkYXRlSlNPTihjYW5kaWRhdGUpO1xuICAgIGlmIChjYW5kLnR5cGUgPT0gJ3NyZmx4Jykge1xuICAgICAgICB0aGlzLmhhZFJlbW90ZVN0dW5DYW5kaWRhdGUgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoY2FuZC50eXBlID09ICdyZWxheScpIHtcbiAgICAgICAgdGhpcy5oYWRSZW1vdGVSZWxheUNhbmRpZGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChjYW5kLmlwLmluZGV4T2YoJzonKSAhPSAtMSkge1xuICAgICAgICB0aGlzLmhhZFJlbW90ZUlQdjZDYW5kaWRhdGUgPSB0cnVlO1xuICAgIH1cbn07XG5cblxuLy8gSW5pdCBhbmQgYWRkIGljZSBjYW5kaWRhdGUgb2JqZWN0IHdpdGggY29ycmVjdCBjb25zdHJ1Y3RvclxuUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLnByb2Nlc3NJY2UgPSBmdW5jdGlvbiAodXBkYXRlLCBjYikge1xuICAgIGNiID0gY2IgfHwgZnVuY3Rpb24gKCkge307XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gaWdub3JlIGFueSBhZGRlZCBpY2UgY2FuZGlkYXRlcyB0byBhdm9pZCBlcnJvcnMuIHdoeSBkb2VzIHRoZVxuICAgIC8vIHNwZWMgbm90IGRvIHRoaXM/XG4gICAgaWYgKHRoaXMucGMuc2lnbmFsaW5nU3RhdGUgPT09ICdjbG9zZWQnKSByZXR1cm4gY2IoKTtcblxuICAgIGlmICh1cGRhdGUuY29udGVudHMgfHwgKHVwZGF0ZS5qaW5nbGUgJiYgdXBkYXRlLmppbmdsZS5jb250ZW50cykpIHtcbiAgICAgICAgdmFyIGNvbnRlbnROYW1lcyA9IHRoaXMucmVtb3RlRGVzY3JpcHRpb24uY29udGVudHMubWFwKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLm5hbWU7IH0pO1xuICAgICAgICB2YXIgY29udGVudHMgPSB1cGRhdGUuY29udGVudHMgfHwgdXBkYXRlLmppbmdsZS5jb250ZW50cztcblxuICAgICAgICBjb250ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb250ZW50KSB7XG4gICAgICAgICAgICB2YXIgdHJhbnNwb3J0ID0gY29udGVudC50cmFuc3BvcnQgfHwge307XG4gICAgICAgICAgICB2YXIgY2FuZGlkYXRlcyA9IHRyYW5zcG9ydC5jYW5kaWRhdGVzIHx8IFtdO1xuICAgICAgICAgICAgdmFyIG1saW5lID0gY29udGVudE5hbWVzLmluZGV4T2YoY29udGVudC5uYW1lKTtcbiAgICAgICAgICAgIHZhciBtaWQgPSBjb250ZW50Lm5hbWU7XG4gICAgICAgICAgICB2YXIgcmVtb3RlQ29udGVudCA9IHNlbGYucmVtb3RlRGVzY3JpcHRpb24uY29udGVudHMuZmluZChmdW5jdGlvbiAoYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjLm5hbWUgPT09IGNvbnRlbnQubmFtZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBwcm9jZXNzIGNhbmRpZGF0ZXMgYXMgYSBjYWxsYmFjaywgaW4gY2FzZSB3ZSBuZWVkIHRvXG4gICAgICAgICAgICAvLyB1cGRhdGUgdWZyYWcgYW5kIHB3ZCB3aXRoIG9mZmVyL2Fuc3dlclxuICAgICAgICAgICAgdmFyIHByb2Nlc3NDYW5kaWRhdGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMuZm9yRWFjaChcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGNhbmRpZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaWNlQ2FuZGlkYXRlID0gU0pKLnRvQ2FuZGlkYXRlU0RQKGNhbmRpZGF0ZSkgKyAnXFxyXFxuJztcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYy5hZGRJY2VDYW5kaWRhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUlRDSWNlQ2FuZGlkYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGU6IGljZUNhbmRpZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZHBNTGluZUluZGV4OiBtbGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZHBNaWQ6IG1pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZWxsLCB0aGlzIHN1Y2Nlc3MgY2FsbGJhY2sgaXMgcHJldHR5IG1lYW5pbmdsZXNzXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9jaGVja1JlbW90ZUNhbmRpZGF0ZShpY2VDYW5kaWRhdGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNiKCk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoc2VsZi5pY2VDcmVkZW50aWFscy5yZW1vdGVbY29udGVudC5uYW1lXSAmJiB0cmFuc3BvcnQudWZyYWcgJiZcbiAgICAgICAgICAgICAgICBzZWxmLmljZUNyZWRlbnRpYWxzLnJlbW90ZVtjb250ZW50Lm5hbWVdLnVmcmFnICE9PSB0cmFuc3BvcnQudWZyYWcpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVtb3RlQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICByZW1vdGVDb250ZW50LnRyYW5zcG9ydC51ZnJhZyA9IHRyYW5zcG9ydC51ZnJhZztcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlQ29udGVudC50cmFuc3BvcnQucHdkID0gdHJhbnNwb3J0LnB3ZDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9mZmVyID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29mZmVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGppbmdsZTogc2VsZi5yZW1vdGVEZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBvZmZlci5zZHAgPSBTSkoudG9TZXNzaW9uU0RQKG9mZmVyLmppbmdsZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lkOiBzZWxmLmNvbmZpZy5zZHBTZXNzaW9uSUQsXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlOiBzZWxmLl9yb2xlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdpbmNvbWluZydcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGMuc2V0UmVtb3RlRGVzY3JpcHRpb24obmV3IFJUQ1Nlc3Npb25EZXNjcmlwdGlvbihvZmZlciksXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NhbmRpZGF0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsICdpY2UgcmVzdGFydCBmYWlsZWQgdG8gZmluZCBtYXRjaGluZyBjb250ZW50Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzQ2FuZGlkYXRlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyB3b3JraW5nIGFyb3VuZCBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3dlYnJ0Yy9pc3N1ZXMvZGV0YWlsP2lkPTM2NjlcbiAgICAgICAgaWYgKHVwZGF0ZS5jYW5kaWRhdGUgJiYgdXBkYXRlLmNhbmRpZGF0ZS5jYW5kaWRhdGUuaW5kZXhPZignYT0nKSAhPT0gMCkge1xuICAgICAgICAgICAgdXBkYXRlLmNhbmRpZGF0ZS5jYW5kaWRhdGUgPSAnYT0nICsgdXBkYXRlLmNhbmRpZGF0ZS5jYW5kaWRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy53dEZpcmVmb3ggJiYgdGhpcy5maXJlZm94Y2FuZGlkYXRlYnVmZmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyB3ZSBjYW50IGFkZCB0aGlzIHlldCBkdWUgdG8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTA4NzU1MVxuICAgICAgICAgICAgaWYgKHRoaXMucGMubG9jYWxEZXNjcmlwdGlvbiAmJiB0aGlzLnBjLmxvY2FsRGVzY3JpcHRpb24udHlwZSA9PT0gJ29mZmVyJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZWZveGNhbmRpZGF0ZWJ1ZmZlci5wdXNoKHVwZGF0ZS5jYW5kaWRhdGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi5wYy5hZGRJY2VDYW5kaWRhdGUoXG4gICAgICAgICAgICBuZXcgUlRDSWNlQ2FuZGlkYXRlKHVwZGF0ZS5jYW5kaWRhdGUpLFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkgeyB9LFxuICAgICAgICAgICAgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBzZWxmLl9jaGVja1JlbW90ZUNhbmRpZGF0ZSh1cGRhdGUuY2FuZGlkYXRlLmNhbmRpZGF0ZSk7XG4gICAgICAgIGNiKCk7XG4gICAgfVxufTtcblxuLy8gR2VuZXJhdGUgYW5kIGVtaXQgYW4gb2ZmZXIgd2l0aCB0aGUgZ2l2ZW4gY29uc3RyYWludHNcblBlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5vZmZlciA9IGZ1bmN0aW9uIChjb25zdHJhaW50cywgY2IpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGhhc0NvbnN0cmFpbnRzID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMjtcbiAgICB2YXIgbWVkaWFDb25zdHJhaW50cyA9IGhhc0NvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzID8gY29uc3RyYWludHMgOiB7XG4gICAgICAgICAgICBvZmZlclRvUmVjZWl2ZUF1ZGlvOiAxLFxuICAgICAgICAgICAgb2ZmZXJUb1JlY2VpdmVWaWRlbzogMVxuICAgICAgICB9O1xuICAgIGNiID0gaGFzQ29uc3RyYWludHMgPyBjYiA6IGNvbnN0cmFpbnRzO1xuICAgIGNiID0gY2IgfHwgZnVuY3Rpb24gKCkge307XG5cbiAgICBpZiAodGhpcy5wYy5zaWduYWxpbmdTdGF0ZSA9PT0gJ2Nsb3NlZCcpIHJldHVybiBjYignQWxyZWFkeSBjbG9zZWQnKTtcblxuICAgIC8vIEFjdHVhbGx5IGdlbmVyYXRlIHRoZSBvZmZlclxuICAgIHRoaXMucGMuY3JlYXRlT2ZmZXIoXG4gICAgICAgIGZ1bmN0aW9uIChvZmZlcikge1xuICAgICAgICAgICAgLy8gZG9lcyBub3Qgd29yayBmb3IgamluZ2xlLCBidXQgamluZ2xlLmpzIGRvZXNuJ3QgbmVlZFxuICAgICAgICAgICAgLy8gdGhpcyBoYWNrLi4uXG4gICAgICAgICAgICB2YXIgZXhwYW5kZWRPZmZlciA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnb2ZmZXInLFxuICAgICAgICAgICAgICAgIHNkcDogb2ZmZXIuc2RwXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHNlbGYuYXNzdW1lU2V0TG9jYWxTdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdvZmZlcicsIGV4cGFuZGVkT2ZmZXIpO1xuICAgICAgICAgICAgICAgIGNiKG51bGwsIGV4cGFuZGVkT2ZmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZi5fY2FuZGlkYXRlQnVmZmVyID0gW107XG4gICAgICAgICAgICBzZWxmLnBjLnNldExvY2FsRGVzY3JpcHRpb24ob2ZmZXIsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgamluZ2xlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb25maWcudXNlSmluZ2xlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBqaW5nbGUgPSBTSkoudG9TZXNzaW9uSlNPTihvZmZlci5zZHAsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlOiBzZWxmLl9yb2xlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAnb3V0Z29pbmcnXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGppbmdsZS5zaWQgPSBzZWxmLmNvbmZpZy5zaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvY2FsRGVzY3JpcHRpb24gPSBqaW5nbGU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgSUNFIGNyZWRlbnRpYWxzXG4gICAgICAgICAgICAgICAgICAgICAgICBqaW5nbGUuY29udGVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBjb250ZW50LnRyYW5zcG9ydCB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNwb3J0LnVmcmFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaWNlQ3JlZGVudGlhbHMubG9jYWxbY29udGVudC5uYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVmcmFnOiB0cmFuc3BvcnQudWZyYWcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd2Q6IHRyYW5zcG9ydC5wd2RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWRPZmZlci5qaW5nbGUgPSBqaW5nbGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWRPZmZlci5zZHAuc3BsaXQoJ1xcclxcbicpLmZvckVhY2goZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmluZGV4T2YoJ2E9Y2FuZGlkYXRlOicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fY2hlY2tMb2NhbENhbmRpZGF0ZShsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmFzc3VtZVNldExvY2FsU3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdvZmZlcicsIGV4cGFuZGVkT2ZmZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2IobnVsbCwgZXhwYW5kZWRPZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgICAgICAgICAgICAgIGNiKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgICAgICBjYihlcnIpO1xuICAgICAgICB9LFxuICAgICAgICBtZWRpYUNvbnN0cmFpbnRzXG4gICAgKTtcbn07XG5cblxuLy8gUHJvY2VzcyBhbiBpbmNvbWluZyBvZmZlciBzbyB0aGF0IElDRSBtYXkgcHJvY2VlZCBiZWZvcmUgZGVjaWRpbmdcbi8vIHRvIGFuc3dlciB0aGUgcmVxdWVzdC5cblBlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5oYW5kbGVPZmZlciA9IGZ1bmN0aW9uIChvZmZlciwgY2IpIHtcbiAgICBjYiA9IGNiIHx8IGZ1bmN0aW9uICgpIHt9O1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBvZmZlci50eXBlID0gJ29mZmVyJztcbiAgICBpZiAob2ZmZXIuamluZ2xlKSB7XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZUNocm9tZU5hdGl2ZVNpbXVsY2FzdCkge1xuICAgICAgICAgICAgb2ZmZXIuamluZ2xlLmNvbnRlbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudC5uYW1lID09PSAndmlkZW8nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuYXBwbGljYXRpb24uZ29vZ0NvbmZlcmVuY2VGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZU11bHRpU3RyZWFtSGFja3MpIHtcbiAgICAgICAgICAgIC8vIGFkZCBhIG1peGVkIHZpZGVvIHN0cmVhbSBhcyBmaXJzdCBzdHJlYW1cbiAgICAgICAgICAgIG9mZmVyLmppbmdsZS5jb250ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb250ZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQubmFtZSA9PT0gJ3ZpZGVvJykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc291cmNlcyA9IGNvbnRlbnQuYXBwbGljYXRpb24uc291cmNlcyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZXMubGVuZ3RoID09PSAwIHx8IHNvdXJjZXNbMF0uc3NyYyAhPT0gXCIzNzM1OTI4NTU5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXMudW5zaGlmdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NyYzogXCIzNzM1OTI4NTU5XCIsIC8vIDB4ZGVhZGJlZWZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJjbmFtZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFwiZGVhZGJlZWZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwibXNpZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFwibWl4eW91cmZlY2ludG90aGlzIHBsZWFzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuYXBwbGljYXRpb24uc291cmNlcyA9IHNvdXJjZXM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZi5yZXN0cmljdEJhbmR3aWR0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChvZmZlci5qaW5nbGUuY29udGVudHMubGVuZ3RoID49IDIgJiYgb2ZmZXIuamluZ2xlLmNvbnRlbnRzWzFdLm5hbWUgPT09ICd2aWRlbycpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IG9mZmVyLmppbmdsZS5jb250ZW50c1sxXTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzQncgPSBjb250ZW50LmFwcGxpY2F0aW9uICYmIGNvbnRlbnQuYXBwbGljYXRpb24uYmFuZHdpZHRoICYmIGNvbnRlbnQuYXBwbGljYXRpb24uYmFuZHdpZHRoLmJhbmR3aWR0aDtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0J3KSB7XG4gICAgICAgICAgICAgICAgICAgIG9mZmVyLmppbmdsZS5jb250ZW50c1sxXS5hcHBsaWNhdGlvbi5iYW5kd2lkdGggPSB7IHR5cGU6ICdBUycsIGJhbmR3aWR0aDogc2VsZi5yZXN0cmljdEJhbmR3aWR0aC50b1N0cmluZygpIH07XG4gICAgICAgICAgICAgICAgICAgIG9mZmVyLnNkcCA9IFNKSi50b1Nlc3Npb25TRFAob2ZmZXIuamluZ2xlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWQ6IHNlbGYuY29uZmlnLnNkcFNlc3Npb25JRCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU6IHNlbGYuX3JvbGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogJ291dGdvaW5nJ1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2F2ZSBJQ0UgY3JlZGVudGlhbHNcbiAgICAgICAgb2ZmZXIuamluZ2xlLmNvbnRlbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBjb250ZW50LnRyYW5zcG9ydCB8fCB7fTtcbiAgICAgICAgICAgIGlmICh0cmFuc3BvcnQudWZyYWcpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmljZUNyZWRlbnRpYWxzLnJlbW90ZVtjb250ZW50Lm5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICB1ZnJhZzogdHJhbnNwb3J0LnVmcmFnLFxuICAgICAgICAgICAgICAgICAgICBwd2Q6IHRyYW5zcG9ydC5wd2RcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgb2ZmZXIuc2RwID0gU0pKLnRvU2Vzc2lvblNEUChvZmZlci5qaW5nbGUsIHtcbiAgICAgICAgICAgIHNpZDogc2VsZi5jb25maWcuc2RwU2Vzc2lvbklELFxuICAgICAgICAgICAgcm9sZTogc2VsZi5fcm9sZSgpLFxuICAgICAgICAgICAgZGlyZWN0aW9uOiAnaW5jb21pbmcnXG4gICAgICAgIH0pO1xuICAgICAgICBzZWxmLnJlbW90ZURlc2NyaXB0aW9uID0gb2ZmZXIuamluZ2xlO1xuICAgIH1cbiAgICBvZmZlci5zZHAuc3BsaXQoJ1xcclxcbicpLmZvckVhY2goZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgICAgaWYgKGxpbmUuaW5kZXhPZignYT1jYW5kaWRhdGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHNlbGYuX2NoZWNrUmVtb3RlQ2FuZGlkYXRlKGxpbmUpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgc2VsZi5wYy5zZXRSZW1vdGVEZXNjcmlwdGlvbihuZXcgUlRDU2Vzc2lvbkRlc2NyaXB0aW9uKG9mZmVyKSxcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2JcbiAgICApO1xufTtcblxuLy8gQW5zd2VyIGFuIG9mZmVyIHdpdGggYXVkaW8gb25seVxuUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLmFuc3dlckF1ZGlvT25seSA9IGZ1bmN0aW9uIChjYikge1xuICAgIHZhciBtZWRpYUNvbnN0cmFpbnRzID0ge1xuICAgICAgICAgICAgbWFuZGF0b3J5OiB7XG4gICAgICAgICAgICAgICAgT2ZmZXJUb1JlY2VpdmVBdWRpbzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBPZmZlclRvUmVjZWl2ZVZpZGVvOiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIHRoaXMuX2Fuc3dlcihtZWRpYUNvbnN0cmFpbnRzLCBjYik7XG59O1xuXG4vLyBBbnN3ZXIgYW4gb2ZmZXIgd2l0aG91dCBvZmZlcmluZyB0byByZWNpZXZlXG5QZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuYW5zd2VyQnJvYWRjYXN0T25seSA9IGZ1bmN0aW9uIChjYikge1xuICAgIHZhciBtZWRpYUNvbnN0cmFpbnRzID0ge1xuICAgICAgICAgICAgbWFuZGF0b3J5OiB7XG4gICAgICAgICAgICAgICAgT2ZmZXJUb1JlY2VpdmVBdWRpbzogZmFsc2UsXG4gICAgICAgICAgICAgICAgT2ZmZXJUb1JlY2VpdmVWaWRlbzogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB0aGlzLl9hbnN3ZXIobWVkaWFDb25zdHJhaW50cywgY2IpO1xufTtcblxuLy8gQW5zd2VyIGFuIG9mZmVyIHdpdGggZ2l2ZW4gY29uc3RyYWludHMgZGVmYXVsdCBpcyBhdWRpby92aWRlb1xuUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLmFuc3dlciA9IGZ1bmN0aW9uIChjb25zdHJhaW50cywgY2IpIHtcbiAgICB2YXIgaGFzQ29uc3RyYWludHMgPSBhcmd1bWVudHMubGVuZ3RoID09PSAyO1xuICAgIHZhciBjYWxsYmFjayA9IGhhc0NvbnN0cmFpbnRzID8gY2IgOiBjb25zdHJhaW50cztcbiAgICB2YXIgbWVkaWFDb25zdHJhaW50cyA9IGhhc0NvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzID8gY29uc3RyYWludHMgOiB7XG4gICAgICAgICAgICBtYW5kYXRvcnk6IHtcbiAgICAgICAgICAgICAgICBPZmZlclRvUmVjZWl2ZUF1ZGlvOiB0cnVlLFxuICAgICAgICAgICAgICAgIE9mZmVyVG9SZWNlaXZlVmlkZW86IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgIHRoaXMuX2Fuc3dlcihtZWRpYUNvbnN0cmFpbnRzLCBjYWxsYmFjayk7XG59O1xuXG4vLyBQcm9jZXNzIGFuIGFuc3dlclxuUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLmhhbmRsZUFuc3dlciA9IGZ1bmN0aW9uIChhbnN3ZXIsIGNiKSB7XG4gICAgY2IgPSBjYiB8fCBmdW5jdGlvbiAoKSB7fTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKGFuc3dlci5qaW5nbGUpIHtcbiAgICAgICAgYW5zd2VyLnNkcCA9IFNKSi50b1Nlc3Npb25TRFAoYW5zd2VyLmppbmdsZSwge1xuICAgICAgICAgICAgc2lkOiBzZWxmLmNvbmZpZy5zZHBTZXNzaW9uSUQsXG4gICAgICAgICAgICByb2xlOiBzZWxmLl9yb2xlKCksXG4gICAgICAgICAgICBkaXJlY3Rpb246ICdpbmNvbWluZydcbiAgICAgICAgfSk7XG4gICAgICAgIHNlbGYucmVtb3RlRGVzY3JpcHRpb24gPSBhbnN3ZXIuamluZ2xlO1xuXG4gICAgICAgIC8vIFNhdmUgSUNFIGNyZWRlbnRpYWxzXG4gICAgICAgIGFuc3dlci5qaW5nbGUuY29udGVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29udGVudCkge1xuICAgICAgICAgICAgdmFyIHRyYW5zcG9ydCA9IGNvbnRlbnQudHJhbnNwb3J0IHx8IHt9O1xuICAgICAgICAgICAgaWYgKHRyYW5zcG9ydC51ZnJhZykge1xuICAgICAgICAgICAgICAgIHNlbGYuaWNlQ3JlZGVudGlhbHMucmVtb3RlW2NvbnRlbnQubmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIHVmcmFnOiB0cmFuc3BvcnQudWZyYWcsXG4gICAgICAgICAgICAgICAgICAgIHB3ZDogdHJhbnNwb3J0LnB3ZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhbnN3ZXIuc2RwLnNwbGl0KCdcXHJcXG4nKS5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICAgIGlmIChsaW5lLmluZGV4T2YoJ2E9Y2FuZGlkYXRlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzZWxmLl9jaGVja1JlbW90ZUNhbmRpZGF0ZShsaW5lKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHNlbGYucGMuc2V0UmVtb3RlRGVzY3JpcHRpb24oXG4gICAgICAgIG5ldyBSVENTZXNzaW9uRGVzY3JpcHRpb24oYW5zd2VyKSxcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHNlbGYud3RGaXJlZm94KSB7XG4gICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVmb3hjYW5kaWRhdGVidWZmZXIuZm9yRWFjaChmdW5jdGlvbiAoY2FuZGlkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgY2FuZGlkYXRlcyBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYy5hZGRJY2VDYW5kaWRhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJUQ0ljZUNhbmRpZGF0ZShjYW5kaWRhdGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9jaGVja1JlbW90ZUNhbmRpZGF0ZShjYW5kaWRhdGUuY2FuZGlkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZWZveGNhbmRpZGF0ZWJ1ZmZlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSwgc2VsZi53dEZpcmVmb3gpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2IobnVsbCk7XG4gICAgICAgIH0sXG4gICAgICAgIGNiXG4gICAgKTtcbn07XG5cbi8vIENsb3NlIHRoZSBwZWVyIGNvbm5lY3Rpb25cblBlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnBjLmNsb3NlKCk7XG5cbiAgICB0aGlzLl9sb2NhbERhdGFDaGFubmVscyA9IFtdO1xuICAgIHRoaXMuX3JlbW90ZURhdGFDaGFubmVscyA9IFtdO1xuXG4gICAgdGhpcy5lbWl0KCdjbG9zZScpO1xufTtcblxuLy8gSW50ZXJuYWwgY29kZSBzaGFyaW5nIGZvciB2YXJpb3VzIHR5cGVzIG9mIGFuc3dlciBtZXRob2RzXG5QZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuX2Fuc3dlciA9IGZ1bmN0aW9uIChjb25zdHJhaW50cywgY2IpIHtcbiAgICBjYiA9IGNiIHx8IGZ1bmN0aW9uICgpIHt9O1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoIXRoaXMucGMucmVtb3RlRGVzY3JpcHRpb24pIHtcbiAgICAgICAgLy8gdGhlIG9sZCBBUEkgaXMgdXNlZCwgY2FsbCBoYW5kbGVPZmZlclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlbW90ZURlc2NyaXB0aW9uIG5vdCBzZXQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wYy5zaWduYWxpbmdTdGF0ZSA9PT0gJ2Nsb3NlZCcpIHJldHVybiBjYignQWxyZWFkeSBjbG9zZWQnKTtcblxuICAgIHNlbGYucGMuY3JlYXRlQW5zd2VyKFxuICAgICAgICBmdW5jdGlvbiAoYW5zd2VyKSB7XG4gICAgICAgICAgICB2YXIgc2ltID0gW107XG4gICAgICAgICAgICBpZiAoc2VsZi5lbmFibGVDaHJvbWVOYXRpdmVTaW11bGNhc3QpIHtcbiAgICAgICAgICAgICAgICAvLyBuYXRpdmUgc2ltdWxjYXN0IHBhcnQgMTogYWRkIGFub3RoZXIgU1NSQ1xuICAgICAgICAgICAgICAgIGFuc3dlci5qaW5nbGUgPSBTSkoudG9TZXNzaW9uSlNPTihhbnN3ZXIuc2RwLCB7XG4gICAgICAgICAgICAgICAgICAgIHJvbGU6IHNlbGYuX3JvbGUoKSxcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAnb3V0Z29pbmcnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGFuc3dlci5qaW5nbGUuY29udGVudHMubGVuZ3RoID49IDIgJiYgYW5zd2VyLmppbmdsZS5jb250ZW50c1sxXS5uYW1lID09PSAndmlkZW8nKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBncm91cHMgPSBhbnN3ZXIuamluZ2xlLmNvbnRlbnRzWzFdLmFwcGxpY2F0aW9uLnNvdXJjZUdyb3VwcyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhhc1NpbSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBncm91cHMuZm9yRWFjaChmdW5jdGlvbiAoZ3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cC5zZW1hbnRpY3MgPT0gJ1NJTScpIGhhc1NpbSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1NpbSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgYW5zd2VyLmppbmdsZS5jb250ZW50c1sxXS5hcHBsaWNhdGlvbi5zb3VyY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld3NzcmMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGFuc3dlci5qaW5nbGUuY29udGVudHNbMV0uYXBwbGljYXRpb24uc291cmNlc1swXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3c3NyYy5zc3JjID0gJycgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmKTsgLy8gRklYTUU6IGxvb2sgZm9yIGNvbmZsaWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5zd2VyLmppbmdsZS5jb250ZW50c1sxXS5hcHBsaWNhdGlvbi5zb3VyY2VzLnB1c2gobmV3c3NyYyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNpbS5wdXNoKGFuc3dlci5qaW5nbGUuY29udGVudHNbMV0uYXBwbGljYXRpb24uc291cmNlc1swXS5zc3JjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpbS5wdXNoKG5ld3NzcmMuc3NyYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYW50aWNzOiAnU0lNJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzOiBzaW1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIGNyZWF0ZSBhbiBSVFggb25lIGZvciB0aGUgU0lNIG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJ0eHNzcmMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG5ld3NzcmMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ0eHNzcmMuc3NyYyA9ICcnICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMHhmZmZmZmZmZik7IC8vIEZJWE1FOiBsb29rIGZvciBjb25mbGljdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuc3dlci5qaW5nbGUuY29udGVudHNbMV0uYXBwbGljYXRpb24uc291cmNlcy5wdXNoKHJ0eHNzcmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFudGljczogJ0ZJRCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlczogW25ld3NzcmMuc3NyYywgcnR4c3NyYy5zc3JjXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGFuc3dlci5qaW5nbGUuY29udGVudHNbMV0uYXBwbGljYXRpb24uc291cmNlR3JvdXBzID0gZ3JvdXBzO1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5zd2VyLnNkcCA9IFNKSi50b1Nlc3Npb25TRFAoYW5zd2VyLmppbmdsZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZDogc2VsZi5jb25maWcuc2RwU2Vzc2lvbklELFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU6IHNlbGYuX3JvbGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdvdXRnb2luZydcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGV4cGFuZGVkQW5zd2VyID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdhbnN3ZXInLFxuICAgICAgICAgICAgICAgIHNkcDogYW5zd2VyLnNkcFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChzZWxmLmFzc3VtZVNldExvY2FsU3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIC8vIG5vdCBzYWZlIHRvIGRvIHdoZW4gZG9pbmcgc2ltdWxjYXN0IG1hbmdsaW5nXG4gICAgICAgICAgICAgICAgdmFyIGNvcHkgPSBjbG9uZURlZXAoZXhwYW5kZWRBbnN3ZXIpO1xuICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnYW5zd2VyJywgY29weSk7XG4gICAgICAgICAgICAgICAgY2IobnVsbCwgY29weSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxmLl9jYW5kaWRhdGVCdWZmZXIgPSBbXTtcbiAgICAgICAgICAgIHNlbGYucGMuc2V0TG9jYWxEZXNjcmlwdGlvbihhbnN3ZXIsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb25maWcudXNlSmluZ2xlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgamluZ2xlID0gU0pKLnRvU2Vzc2lvbkpTT04oYW5zd2VyLnNkcCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU6IHNlbGYuX3JvbGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdvdXRnb2luZydcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgamluZ2xlLnNpZCA9IHNlbGYuY29uZmlnLnNpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9jYWxEZXNjcmlwdGlvbiA9IGppbmdsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkQW5zd2VyLmppbmdsZSA9IGppbmdsZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5lbmFibGVDaHJvbWVOYXRpdmVTaW11bGNhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hdGl2ZSBzaW11bGNhc3QgcGFydCAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbmFsIG11bHRpcGxlIHRyYWNrcyB0byB0aGUgcmVjZWl2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBhbnl0aGluZyBpbiB0aGUgU0lNIGdyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4cGFuZGVkQW5zd2VyLmppbmdsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkQW5zd2VyLmppbmdsZSA9IFNKSi50b1Nlc3Npb25KU09OKGFuc3dlci5zZHAsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZTogc2VsZi5fcm9sZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdvdXRnb2luZydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkQW5zd2VyLmppbmdsZS5jb250ZW50c1sxXS5hcHBsaWNhdGlvbi5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZSwgaWR4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZsb29yIGlkeC8yIGlzIGEgaGFjayB0aGF0IHJlbGllcyBvbiBhIHBhcnRpY3VsYXIgb3JkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBncm91cHMsIGFsdGVybmF0aW5nIGJldHdlZW4gc2ltIGFuZCBydHhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UucGFyYW1ldGVycyA9IHNvdXJjZS5wYXJhbWV0ZXJzLm1hcChmdW5jdGlvbiAocGFyYW1ldGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXIua2V5ID09PSAnbXNpZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlci52YWx1ZSArPSAnLScgKyBNYXRoLmZsb29yKGlkeCAvIDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbWV0ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkQW5zd2VyLnNkcCA9IFNKSi50b1Nlc3Npb25TRFAoZXhwYW5kZWRBbnN3ZXIuamluZ2xlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkOiBzZWxmLnNkcFNlc3Npb25JRCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlOiBzZWxmLl9yb2xlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAnb3V0Z29pbmcnXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBleHBhbmRlZEFuc3dlci5zZHAuc3BsaXQoJ1xcclxcbicpLmZvckVhY2goZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmluZGV4T2YoJ2E9Y2FuZGlkYXRlOicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fY2hlY2tMb2NhbENhbmRpZGF0ZShsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5hc3N1bWVTZXRMb2NhbFN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb3B5ID0gY2xvbmVEZWVwKGV4cGFuZGVkQW5zd2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnYW5zd2VyJywgY29weSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYihudWxsLCBjb3B5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgY2IoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgIGNiKGVycik7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbnN0cmFpbnRzXG4gICAgKTtcbn07XG5cbi8vIEludGVybmFsIG1ldGhvZCBmb3IgZW1pdHRpbmcgaWNlIGNhbmRpZGF0ZXMgb24gb3VyIHBlZXIgb2JqZWN0XG5QZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuX29uSWNlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChldmVudC5jYW5kaWRhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMuZG9udFNpZ25hbENhbmRpZGF0ZXMpIHJldHVybjtcbiAgICAgICAgdmFyIGljZSA9IGV2ZW50LmNhbmRpZGF0ZTtcblxuICAgICAgICB2YXIgZXhwYW5kZWRDYW5kaWRhdGUgPSB7XG4gICAgICAgICAgICBjYW5kaWRhdGU6IHtcbiAgICAgICAgICAgICAgICBjYW5kaWRhdGU6IGljZS5jYW5kaWRhdGUsXG4gICAgICAgICAgICAgICAgc2RwTWlkOiBpY2Uuc2RwTWlkLFxuICAgICAgICAgICAgICAgIHNkcE1MaW5lSW5kZXg6IGljZS5zZHBNTGluZUluZGV4XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2NoZWNrTG9jYWxDYW5kaWRhdGUoaWNlLmNhbmRpZGF0ZSk7XG5cbiAgICAgICAgdmFyIGNhbmQgPSBTSkoudG9DYW5kaWRhdGVKU09OKGljZS5jYW5kaWRhdGUpO1xuXG4gICAgICAgIHZhciBhbHJlYWR5O1xuICAgICAgICB2YXIgaWR4O1xuICAgICAgICBpZiAodGhpcy5lbGltaW5hdGVEdXBsaWNhdGVDYW5kaWRhdGVzICYmIGNhbmQudHlwZSA9PT0gJ3JlbGF5Jykge1xuICAgICAgICAgICAgLy8gZHJvcCBjYW5kaWRhdGVzIHdpdGggc2FtZSBmb3VuZGF0aW9uLCBjb21wb25lbnRcbiAgICAgICAgICAgIC8vIHRha2UgbG9jYWwgdHlwZSBwcmVmIGludG8gYWNjb3VudCBzbyB3ZSBkb24ndCBpZ25vcmUgdWRwXG4gICAgICAgICAgICAvLyBvbmVzIHdoZW4gd2Uga25vdyBhYm91dCBhIFRDUCBvbmUuIHVubGlrZWx5IGJ1dC4uLlxuICAgICAgICAgICAgYWxyZWFkeSA9IHRoaXMuX2NhbmRpZGF0ZUJ1ZmZlci5maWx0ZXIoXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMudHlwZSA9PT0gJ3JlbGF5JztcbiAgICAgICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuZm91bmRhdGlvbiArICc6JyArIGMuY29tcG9uZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZHggPSBhbHJlYWR5LmluZGV4T2YoY2FuZC5mb3VuZGF0aW9uICsgJzonICsgY2FuZC5jb21wb25lbnQpO1xuICAgICAgICAgICAgLy8gcmVtZW1iZXI6IGxvY2FsIHR5cGUgcHJlZiBvZiB1ZHAgaXMgMCwgdGNwIDEsIHRscyAyXG4gICAgICAgICAgICBpZiAoaWR4ID4gLTEgJiYgKChjYW5kLnByaW9yaXR5ID4+IDI0KSA+PSAoYWxyZWFkeVtpZHhdLnByaW9yaXR5ID4+IDI0KSkpIHtcbiAgICAgICAgICAgICAgICAvLyBkcm9wIGl0LCBzYW1lIGZvdW5kYXRpb24gd2l0aCBoaWdoZXIgKHdvcnNlKSB0eXBlIHByZWZcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmJ1bmRsZVBvbGljeSA9PT0gJ21heC1idW5kbGUnKSB7XG4gICAgICAgICAgICAvLyBkcm9wIGNhbmRpZGF0ZXMgd2hpY2ggYXJlIGR1cGxpY2F0ZSBmb3IgYXVkaW8vdmlkZW8vZGF0YVxuICAgICAgICAgICAgLy8gZHVwbGljYXRlIG1lYW5zIHNhbWUgaG9zdC9wb3J0IGJ1dCBkaWZmZXJlbnQgc2RwTWlkXG4gICAgICAgICAgICBhbHJlYWR5ID0gdGhpcy5fY2FuZGlkYXRlQnVmZmVyLmZpbHRlcihcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoYykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FuZC50eXBlID09PSBjLnR5cGU7XG4gICAgICAgICAgICAgICAgfSkubWFwKGZ1bmN0aW9uIChjYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYW5kLmFkZHJlc3MgKyAnOicgKyBjYW5kLnBvcnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlkeCA9IGFscmVhZHkuaW5kZXhPZihjYW5kLmFkZHJlc3MgKyAnOicgKyBjYW5kLnBvcnQpO1xuICAgICAgICAgICAgaWYgKGlkeCA+IC0xKSByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gYWxzbyBkcm9wIHJ0Y3AgY2FuZGlkYXRlcyBzaW5jZSB3ZSBrbm93IHRoZSBwZWVyIHN1cHBvcnRzIFJUQ1AtTVVYXG4gICAgICAgIC8vIHRoaXMgaXMgYSB3b3JrYXJvdW5kIHVudGlsIGJyb3dzZXJzIGltcGxlbWVudCB0aGlzIG5hdGl2ZWx5XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5ydGNwTXV4UG9saWN5ID09PSAncmVxdWlyZScgJiYgY2FuZC5jb21wb25lbnQgPT09ICcyJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhbmRpZGF0ZUJ1ZmZlci5wdXNoKGNhbmQpO1xuXG4gICAgICAgIGlmIChzZWxmLmNvbmZpZy51c2VKaW5nbGUpIHtcbiAgICAgICAgICAgIGlmICghaWNlLnNkcE1pZCkgeyAvLyBmaXJlZm94IGRvZXNuJ3Qgc2V0IHRoaXNcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5wYy5yZW1vdGVEZXNjcmlwdGlvbiAmJiBzZWxmLnBjLnJlbW90ZURlc2NyaXB0aW9uLnR5cGUgPT09ICdvZmZlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJlc2VydmUgbmFtZSBmcm9tIHJlbW90ZVxuICAgICAgICAgICAgICAgICAgICBpY2Uuc2RwTWlkID0gc2VsZi5yZW1vdGVEZXNjcmlwdGlvbi5jb250ZW50c1tpY2Uuc2RwTUxpbmVJbmRleF0ubmFtZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpY2Uuc2RwTWlkID0gc2VsZi5sb2NhbERlc2NyaXB0aW9uLmNvbnRlbnRzW2ljZS5zZHBNTGluZUluZGV4XS5uYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghc2VsZi5pY2VDcmVkZW50aWFscy5sb2NhbFtpY2Uuc2RwTWlkXSkge1xuICAgICAgICAgICAgICAgIHZhciBqaW5nbGUgPSBTSkoudG9TZXNzaW9uSlNPTihzZWxmLnBjLmxvY2FsRGVzY3JpcHRpb24uc2RwLCB7XG4gICAgICAgICAgICAgICAgICAgIHJvbGU6IHNlbGYuX3JvbGUoKSxcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAnb3V0Z29pbmcnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgamluZ2xlLmNvbnRlbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRyYW5zcG9ydCA9IGNvbnRlbnQudHJhbnNwb3J0IHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNwb3J0LnVmcmFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmljZUNyZWRlbnRpYWxzLmxvY2FsW2NvbnRlbnQubmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWZyYWc6IHRyYW5zcG9ydC51ZnJhZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd2Q6IHRyYW5zcG9ydC5wd2RcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV4cGFuZGVkQ2FuZGlkYXRlLmppbmdsZSA9IHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogW3tcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogaWNlLnNkcE1pZCxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRvcjogc2VsZi5fcm9sZSgpLFxuICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydFR5cGU6ICdpY2VVZHAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdWZyYWc6IHNlbGYuaWNlQ3JlZGVudGlhbHMubG9jYWxbaWNlLnNkcE1pZF0udWZyYWcsXG4gICAgICAgICAgICAgICAgICAgICAgICBwd2Q6IHNlbGYuaWNlQ3JlZGVudGlhbHMubG9jYWxbaWNlLnNkcE1pZF0ucHdkLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHNlbGYuYmF0Y2hJY2VDYW5kaWRhdGVzID4gMCkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLmJhdGNoZWRJY2VDYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29udGVudHMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYmF0Y2hlZEljZUNhbmRpZGF0ZXMuZm9yRWFjaChmdW5jdGlvbiAoY29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LmNvbnRlbnRzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudHNbY29udGVudC5uYW1lXSkgY29udGVudHNbY29udGVudC5uYW1lXSA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNbY29udGVudC5uYW1lXS50cmFuc3BvcnQuY2FuZGlkYXRlcy5wdXNoKGNvbnRlbnQudHJhbnNwb3J0LmNhbmRpZGF0ZXNbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Q2FuZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW5nbGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHM6IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGNvbnRlbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2FuZC5qaW5nbGUuY29udGVudHMucHVzaChjb250ZW50c1tuYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYmF0Y2hlZEljZUNhbmRpZGF0ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnaWNlJywgbmV3Q2FuZCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIHNlbGYuYmF0Y2hJY2VDYW5kaWRhdGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2VsZi5iYXRjaGVkSWNlQ2FuZGlkYXRlcy5wdXNoKGV4cGFuZGVkQ2FuZGlkYXRlLmppbmdsZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KCdpY2UnLCBleHBhbmRlZENhbmRpZGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbWl0KCdlbmRPZkNhbmRpZGF0ZXMnKTtcbiAgICB9XG59O1xuXG4vLyBJbnRlcm5hbCBtZXRob2QgZm9yIHByb2Nlc3NpbmcgYSBuZXcgZGF0YSBjaGFubmVsIGJlaW5nIGFkZGVkIGJ5IHRoZVxuLy8gb3RoZXIgcGVlci5cblBlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5fb25EYXRhQ2hhbm5lbCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIG1ha2Ugc3VyZSB3ZSBrZWVwIGEgcmVmZXJlbmNlIHNvIHRoaXMgZG9lc24ndCBnZXQgZ2FyYmFnZSBjb2xsZWN0ZWRcbiAgICB2YXIgY2hhbm5lbCA9IGV2ZW50LmNoYW5uZWw7XG4gICAgdGhpcy5fcmVtb3RlRGF0YUNoYW5uZWxzLnB1c2goY2hhbm5lbCk7XG5cbiAgICB0aGlzLmVtaXQoJ2FkZENoYW5uZWwnLCBjaGFubmVsKTtcbn07XG5cbi8vIENyZWF0ZSBhIGRhdGEgY2hhbm5lbCBzcGVjIHJlZmVyZW5jZTpcbi8vIGh0dHA6Ly9kZXYudzMub3JnLzIwMTEvd2VicnRjL2VkaXRvci93ZWJydGMuaHRtbCNpZGwtZGVmLVJUQ0RhdGFDaGFubmVsSW5pdFxuUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLmNyZWF0ZURhdGFDaGFubmVsID0gZnVuY3Rpb24gKG5hbWUsIG9wdHMpIHtcbiAgICB2YXIgY2hhbm5lbCA9IHRoaXMucGMuY3JlYXRlRGF0YUNoYW5uZWwobmFtZSwgb3B0cyk7XG5cbiAgICAvLyBtYWtlIHN1cmUgd2Uga2VlcCBhIHJlZmVyZW5jZSBzbyB0aGlzIGRvZXNuJ3QgZ2V0IGdhcmJhZ2UgY29sbGVjdGVkXG4gICAgdGhpcy5fbG9jYWxEYXRhQ2hhbm5lbHMucHVzaChjaGFubmVsKTtcblxuICAgIHJldHVybiBjaGFubmVsO1xufTtcblxuUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLmdldFN0YXRzID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgdGhpcy5wYy5nZXRTdGF0cyhudWxsLFxuICAgICAgICBmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICBjYihudWxsLCByZXMpO1xuICAgICAgICB9LFxuICAgICAgICBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICBjYihlcnIpO1xuICAgICAgICB9XG4gICAgKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUGVlckNvbm5lY3Rpb247XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnRjcGVlcmNvbm5lY3Rpb24vcnRjcGVlcmNvbm5lY3Rpb24uanNcbi8vIG1vZHVsZSBpZCA9IDQ3MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 472 */
/***/ function(module, exports, __webpack_require__) {

    eval("var toSDP = __webpack_require__(473);\nvar toJSON = __webpack_require__(475);\n\n\n// Converstion from JSON to SDP\n\nexports.toIncomingSDPOffer = function (session) {\n    return toSDP.toSessionSDP(session, {\n        role: 'responder',\n        direction: 'incoming'\n    });\n};\nexports.toOutgoingSDPOffer = function (session) {\n    return toSDP.toSessionSDP(session, {\n        role: 'initiator',\n        direction: 'outgoing'\n    });\n};\nexports.toIncomingSDPAnswer = function (session) {\n    return toSDP.toSessionSDP(session, {\n        role: 'initiator',\n        direction: 'incoming'\n    });\n};\nexports.toOutgoingSDPAnswer = function (session) {\n    return toSDP.toSessionSDP(session, {\n        role: 'responder',\n        direction: 'outgoing'\n    });\n};\nexports.toIncomingMediaSDPOffer = function (media) {\n    return toSDP.toMediaSDP(media, {\n        role: 'responder',\n        direction: 'incoming'\n    });\n};\nexports.toOutgoingMediaSDPOffer = function (media) {\n    return toSDP.toMediaSDP(media, {\n        role: 'initiator',\n        direction: 'outgoing'\n    });\n};\nexports.toIncomingMediaSDPAnswer = function (media) {\n    return toSDP.toMediaSDP(media, {\n        role: 'initiator',\n        direction: 'incoming'\n    });\n};\nexports.toOutgoingMediaSDPAnswer = function (media) {\n    return toSDP.toMediaSDP(media, {\n        role: 'responder',\n        direction: 'outgoing'\n    });\n};\nexports.toCandidateSDP = toSDP.toCandidateSDP;\nexports.toMediaSDP = toSDP.toMediaSDP;\nexports.toSessionSDP = toSDP.toSessionSDP;\n\n\n// Conversion from SDP to JSON\n\nexports.toIncomingJSONOffer = function (sdp, creators) {\n    return toJSON.toSessionJSON(sdp, {\n        role: 'responder',\n        direction: 'incoming',\n        creators: creators\n    });\n};\nexports.toOutgoingJSONOffer = function (sdp, creators) {\n    return toJSON.toSessionJSON(sdp, {\n        role: 'initiator',\n        direction: 'outgoing',\n        creators: creators\n    });\n};\nexports.toIncomingJSONAnswer = function (sdp, creators) {\n    return toJSON.toSessionJSON(sdp, {\n        role: 'initiator',\n        direction: 'incoming',\n        creators: creators\n    });\n};\nexports.toOutgoingJSONAnswer = function (sdp, creators) {\n    return toJSON.toSessionJSON(sdp, {\n        role: 'responder',\n        direction: 'outgoing',\n        creators: creators\n    });\n};\nexports.toIncomingMediaJSONOffer = function (sdp, creator) {\n    return toJSON.toMediaJSON(sdp, {\n        role: 'responder',\n        direction: 'incoming',\n        creator: creator\n    });\n};\nexports.toOutgoingMediaJSONOffer = function (sdp, creator) {\n    return toJSON.toMediaJSON(sdp, {\n        role: 'initiator',\n        direction: 'outgoing',\n        creator: creator\n    });\n};\nexports.toIncomingMediaJSONAnswer = function (sdp, creator) {\n    return toJSON.toMediaJSON(sdp, {\n        role: 'initiator',\n        direction: 'incoming',\n        creator: creator\n    });\n};\nexports.toOutgoingMediaJSONAnswer = function (sdp, creator) {\n    return toJSON.toMediaJSON(sdp, {\n        role: 'responder',\n        direction: 'outgoing',\n        creator: creator\n    });\n};\nexports.toCandidateJSON = toJSON.toCandidateJSON;\nexports.toMediaJSON = toJSON.toMediaJSON;\nexports.toSessionJSON = toJSON.toSessionJSON;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDcyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zZHAtamluZ2xlLWpzb24vaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHRvU0RQID0gcmVxdWlyZSgnLi9saWIvdG9zZHAnKTtcbnZhciB0b0pTT04gPSByZXF1aXJlKCcuL2xpYi90b2pzb24nKTtcblxuXG4vLyBDb252ZXJzdGlvbiBmcm9tIEpTT04gdG8gU0RQXG5cbmV4cG9ydHMudG9JbmNvbWluZ1NEUE9mZmVyID0gZnVuY3Rpb24gKHNlc3Npb24pIHtcbiAgICByZXR1cm4gdG9TRFAudG9TZXNzaW9uU0RQKHNlc3Npb24sIHtcbiAgICAgICAgcm9sZTogJ3Jlc3BvbmRlcicsXG4gICAgICAgIGRpcmVjdGlvbjogJ2luY29taW5nJ1xuICAgIH0pO1xufTtcbmV4cG9ydHMudG9PdXRnb2luZ1NEUE9mZmVyID0gZnVuY3Rpb24gKHNlc3Npb24pIHtcbiAgICByZXR1cm4gdG9TRFAudG9TZXNzaW9uU0RQKHNlc3Npb24sIHtcbiAgICAgICAgcm9sZTogJ2luaXRpYXRvcicsXG4gICAgICAgIGRpcmVjdGlvbjogJ291dGdvaW5nJ1xuICAgIH0pO1xufTtcbmV4cG9ydHMudG9JbmNvbWluZ1NEUEFuc3dlciA9IGZ1bmN0aW9uIChzZXNzaW9uKSB7XG4gICAgcmV0dXJuIHRvU0RQLnRvU2Vzc2lvblNEUChzZXNzaW9uLCB7XG4gICAgICAgIHJvbGU6ICdpbml0aWF0b3InLFxuICAgICAgICBkaXJlY3Rpb246ICdpbmNvbWluZydcbiAgICB9KTtcbn07XG5leHBvcnRzLnRvT3V0Z29pbmdTRFBBbnN3ZXIgPSBmdW5jdGlvbiAoc2Vzc2lvbikge1xuICAgIHJldHVybiB0b1NEUC50b1Nlc3Npb25TRFAoc2Vzc2lvbiwge1xuICAgICAgICByb2xlOiAncmVzcG9uZGVyJyxcbiAgICAgICAgZGlyZWN0aW9uOiAnb3V0Z29pbmcnXG4gICAgfSk7XG59O1xuZXhwb3J0cy50b0luY29taW5nTWVkaWFTRFBPZmZlciA9IGZ1bmN0aW9uIChtZWRpYSkge1xuICAgIHJldHVybiB0b1NEUC50b01lZGlhU0RQKG1lZGlhLCB7XG4gICAgICAgIHJvbGU6ICdyZXNwb25kZXInLFxuICAgICAgICBkaXJlY3Rpb246ICdpbmNvbWluZydcbiAgICB9KTtcbn07XG5leHBvcnRzLnRvT3V0Z29pbmdNZWRpYVNEUE9mZmVyID0gZnVuY3Rpb24gKG1lZGlhKSB7XG4gICAgcmV0dXJuIHRvU0RQLnRvTWVkaWFTRFAobWVkaWEsIHtcbiAgICAgICAgcm9sZTogJ2luaXRpYXRvcicsXG4gICAgICAgIGRpcmVjdGlvbjogJ291dGdvaW5nJ1xuICAgIH0pO1xufTtcbmV4cG9ydHMudG9JbmNvbWluZ01lZGlhU0RQQW5zd2VyID0gZnVuY3Rpb24gKG1lZGlhKSB7XG4gICAgcmV0dXJuIHRvU0RQLnRvTWVkaWFTRFAobWVkaWEsIHtcbiAgICAgICAgcm9sZTogJ2luaXRpYXRvcicsXG4gICAgICAgIGRpcmVjdGlvbjogJ2luY29taW5nJ1xuICAgIH0pO1xufTtcbmV4cG9ydHMudG9PdXRnb2luZ01lZGlhU0RQQW5zd2VyID0gZnVuY3Rpb24gKG1lZGlhKSB7XG4gICAgcmV0dXJuIHRvU0RQLnRvTWVkaWFTRFAobWVkaWEsIHtcbiAgICAgICAgcm9sZTogJ3Jlc3BvbmRlcicsXG4gICAgICAgIGRpcmVjdGlvbjogJ291dGdvaW5nJ1xuICAgIH0pO1xufTtcbmV4cG9ydHMudG9DYW5kaWRhdGVTRFAgPSB0b1NEUC50b0NhbmRpZGF0ZVNEUDtcbmV4cG9ydHMudG9NZWRpYVNEUCA9IHRvU0RQLnRvTWVkaWFTRFA7XG5leHBvcnRzLnRvU2Vzc2lvblNEUCA9IHRvU0RQLnRvU2Vzc2lvblNEUDtcblxuXG4vLyBDb252ZXJzaW9uIGZyb20gU0RQIHRvIEpTT05cblxuZXhwb3J0cy50b0luY29taW5nSlNPTk9mZmVyID0gZnVuY3Rpb24gKHNkcCwgY3JlYXRvcnMpIHtcbiAgICByZXR1cm4gdG9KU09OLnRvU2Vzc2lvbkpTT04oc2RwLCB7XG4gICAgICAgIHJvbGU6ICdyZXNwb25kZXInLFxuICAgICAgICBkaXJlY3Rpb246ICdpbmNvbWluZycsXG4gICAgICAgIGNyZWF0b3JzOiBjcmVhdG9yc1xuICAgIH0pO1xufTtcbmV4cG9ydHMudG9PdXRnb2luZ0pTT05PZmZlciA9IGZ1bmN0aW9uIChzZHAsIGNyZWF0b3JzKSB7XG4gICAgcmV0dXJuIHRvSlNPTi50b1Nlc3Npb25KU09OKHNkcCwge1xuICAgICAgICByb2xlOiAnaW5pdGlhdG9yJyxcbiAgICAgICAgZGlyZWN0aW9uOiAnb3V0Z29pbmcnLFxuICAgICAgICBjcmVhdG9yczogY3JlYXRvcnNcbiAgICB9KTtcbn07XG5leHBvcnRzLnRvSW5jb21pbmdKU09OQW5zd2VyID0gZnVuY3Rpb24gKHNkcCwgY3JlYXRvcnMpIHtcbiAgICByZXR1cm4gdG9KU09OLnRvU2Vzc2lvbkpTT04oc2RwLCB7XG4gICAgICAgIHJvbGU6ICdpbml0aWF0b3InLFxuICAgICAgICBkaXJlY3Rpb246ICdpbmNvbWluZycsXG4gICAgICAgIGNyZWF0b3JzOiBjcmVhdG9yc1xuICAgIH0pO1xufTtcbmV4cG9ydHMudG9PdXRnb2luZ0pTT05BbnN3ZXIgPSBmdW5jdGlvbiAoc2RwLCBjcmVhdG9ycykge1xuICAgIHJldHVybiB0b0pTT04udG9TZXNzaW9uSlNPTihzZHAsIHtcbiAgICAgICAgcm9sZTogJ3Jlc3BvbmRlcicsXG4gICAgICAgIGRpcmVjdGlvbjogJ291dGdvaW5nJyxcbiAgICAgICAgY3JlYXRvcnM6IGNyZWF0b3JzXG4gICAgfSk7XG59O1xuZXhwb3J0cy50b0luY29taW5nTWVkaWFKU09OT2ZmZXIgPSBmdW5jdGlvbiAoc2RwLCBjcmVhdG9yKSB7XG4gICAgcmV0dXJuIHRvSlNPTi50b01lZGlhSlNPTihzZHAsIHtcbiAgICAgICAgcm9sZTogJ3Jlc3BvbmRlcicsXG4gICAgICAgIGRpcmVjdGlvbjogJ2luY29taW5nJyxcbiAgICAgICAgY3JlYXRvcjogY3JlYXRvclxuICAgIH0pO1xufTtcbmV4cG9ydHMudG9PdXRnb2luZ01lZGlhSlNPTk9mZmVyID0gZnVuY3Rpb24gKHNkcCwgY3JlYXRvcikge1xuICAgIHJldHVybiB0b0pTT04udG9NZWRpYUpTT04oc2RwLCB7XG4gICAgICAgIHJvbGU6ICdpbml0aWF0b3InLFxuICAgICAgICBkaXJlY3Rpb246ICdvdXRnb2luZycsXG4gICAgICAgIGNyZWF0b3I6IGNyZWF0b3JcbiAgICB9KTtcbn07XG5leHBvcnRzLnRvSW5jb21pbmdNZWRpYUpTT05BbnN3ZXIgPSBmdW5jdGlvbiAoc2RwLCBjcmVhdG9yKSB7XG4gICAgcmV0dXJuIHRvSlNPTi50b01lZGlhSlNPTihzZHAsIHtcbiAgICAgICAgcm9sZTogJ2luaXRpYXRvcicsXG4gICAgICAgIGRpcmVjdGlvbjogJ2luY29taW5nJyxcbiAgICAgICAgY3JlYXRvcjogY3JlYXRvclxuICAgIH0pO1xufTtcbmV4cG9ydHMudG9PdXRnb2luZ01lZGlhSlNPTkFuc3dlciA9IGZ1bmN0aW9uIChzZHAsIGNyZWF0b3IpIHtcbiAgICByZXR1cm4gdG9KU09OLnRvTWVkaWFKU09OKHNkcCwge1xuICAgICAgICByb2xlOiAncmVzcG9uZGVyJyxcbiAgICAgICAgZGlyZWN0aW9uOiAnb3V0Z29pbmcnLFxuICAgICAgICBjcmVhdG9yOiBjcmVhdG9yXG4gICAgfSk7XG59O1xuZXhwb3J0cy50b0NhbmRpZGF0ZUpTT04gPSB0b0pTT04udG9DYW5kaWRhdGVKU09OO1xuZXhwb3J0cy50b01lZGlhSlNPTiA9IHRvSlNPTi50b01lZGlhSlNPTjtcbmV4cG9ydHMudG9TZXNzaW9uSlNPTiA9IHRvSlNPTi50b1Nlc3Npb25KU09OO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3NkcC1qaW5nbGUtanNvbi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNDcyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 473 */
/***/ function(module, exports, __webpack_require__) {

    eval("var SENDERS = __webpack_require__(474);\n\n\nexports.toSessionSDP = function (session, opts) {\n    var role = opts.role || 'initiator';\n    var direction = opts.direction || 'outgoing';\n    var sid = opts.sid || session.sid || Date.now();\n    var time = opts.time || Date.now();\n\n    var sdp = [\n        'v=0',\n        'o=- ' + sid + ' ' + time + ' IN IP4 0.0.0.0',\n        's=-',\n        't=0 0'\n    ];\n\n    var contents = session.contents || [];\n    var hasSources = false;\n    contents.forEach(function (content) {\n        if (content.application.sources &&\n            content.application.sources.length) {\n            hasSources = true;\n        }\n    });\n\n    if (hasSources) {\n        sdp.push('a=msid-semantic: WMS *');\n    }\n\n    var groups = session.groups || [];\n    groups.forEach(function (group) {\n        sdp.push('a=group:' + group.semantics + ' ' + group.contents.join(' '));\n    });\n\n\n    contents.forEach(function (content) {\n        sdp.push(exports.toMediaSDP(content, opts));\n    });\n\n    return sdp.join('\\r\\n') + '\\r\\n';\n};\n\nexports.toMediaSDP = function (content, opts) {\n    var sdp = [];\n\n    var role = opts.role || 'initiator';\n    var direction = opts.direction || 'outgoing';\n\n    var desc = content.application;\n    var transport = content.transport;\n    var payloads = desc.payloads || [];\n    var fingerprints = (transport && transport.fingerprints) || [];\n\n    var mline = [];\n    if (desc.applicationType == 'datachannel') {\n        mline.push('application');\n        mline.push('1');\n        mline.push('DTLS/SCTP');\n        if (transport.sctp) {\n            transport.sctp.forEach(function (map) {\n                mline.push(map.number);\n            });\n        }\n    } else {\n        mline.push(desc.media);\n        mline.push('1');\n        if (fingerprints.length > 0) {\n            mline.push('UDP/TLS/RTP/SAVPF');\n        } else if (desc.encryption && desc.encryption.length > 0) {\n            mline.push('RTP/SAVPF');\n        } else {\n            mline.push('RTP/AVPF');\n        }\n        payloads.forEach(function (payload) {\n            mline.push(payload.id);\n        });\n    }\n\n\n    sdp.push('m=' + mline.join(' '));\n\n    sdp.push('c=IN IP4 0.0.0.0');\n    if (desc.bandwidth && desc.bandwidth.type && desc.bandwidth.bandwidth) {\n        sdp.push('b=' + desc.bandwidth.type + ':' + desc.bandwidth.bandwidth);\n    }\n    if (desc.applicationType == 'rtp') {\n        sdp.push('a=rtcp:1 IN IP4 0.0.0.0');\n    }\n\n    if (transport) {\n        if (transport.ufrag) {\n            sdp.push('a=ice-ufrag:' + transport.ufrag);\n        }\n        if (transport.pwd) {\n            sdp.push('a=ice-pwd:' + transport.pwd);\n        }\n\n        var pushedSetup = false;\n        fingerprints.forEach(function (fingerprint) {\n            sdp.push('a=fingerprint:' + fingerprint.hash + ' ' + fingerprint.value);\n            if (fingerprint.setup && !pushedSetup) {\n                sdp.push('a=setup:' + fingerprint.setup);\n            }\n        });\n\n        if (transport.sctp) {\n            transport.sctp.forEach(function (map) {\n                sdp.push('a=sctpmap:' + map.number + ' ' + map.protocol + ' ' + map.streams);\n            });\n        }\n    }\n\n    if (desc.applicationType == 'rtp') {\n        sdp.push('a=' + (SENDERS[role][direction][content.senders] || 'sendrecv'));\n    }\n    sdp.push('a=mid:' + content.name);\n\n    if (desc.sources && desc.sources.length) {\n        (desc.sources[0].parameters || []).forEach(function (param) {\n            if (param.key === 'msid') {\n                sdp.push('a=msid:' + param.value);\n            }\n        });\n    }\n\n    if (desc.mux) {\n        sdp.push('a=rtcp-mux');\n    }\n\n    var encryption = desc.encryption || [];\n    encryption.forEach(function (crypto) {\n        sdp.push('a=crypto:' + crypto.tag + ' ' + crypto.cipherSuite + ' ' + crypto.keyParams + (crypto.sessionParams ? ' ' + crypto.sessionParams : ''));\n    });\n    if (desc.googConferenceFlag) {\n        sdp.push('a=x-google-flag:conference');\n    }\n\n    payloads.forEach(function (payload) {\n        var rtpmap = 'a=rtpmap:' + payload.id + ' ' + payload.name + '/' + payload.clockrate;\n        if (payload.channels && payload.channels != '1') {\n            rtpmap += '/' + payload.channels;\n        }\n        sdp.push(rtpmap);\n\n        if (payload.parameters && payload.parameters.length) {\n            var fmtp = ['a=fmtp:' + payload.id];\n            var parameters = [];\n            payload.parameters.forEach(function (param) {\n                parameters.push((param.key ? param.key + '=' : '') + param.value);\n            });\n            fmtp.push(parameters.join(';'));\n            sdp.push(fmtp.join(' '));\n        }\n\n        if (payload.feedback) {\n            payload.feedback.forEach(function (fb) {\n                if (fb.type === 'trr-int') {\n                    sdp.push('a=rtcp-fb:' + payload.id + ' trr-int ' + (fb.value ? fb.value : '0'));\n                } else {\n                    sdp.push('a=rtcp-fb:' + payload.id + ' ' + fb.type + (fb.subtype ? ' ' + fb.subtype : ''));\n                }\n            });\n        }\n    });\n\n    if (desc.feedback) {\n        desc.feedback.forEach(function (fb) {\n            if (fb.type === 'trr-int') {\n                sdp.push('a=rtcp-fb:* trr-int ' + (fb.value ? fb.value : '0'));\n            } else {\n                sdp.push('a=rtcp-fb:* ' + fb.type + (fb.subtype ? ' ' + fb.subtype : ''));\n            }\n        });\n    }\n\n    var hdrExts = desc.headerExtensions || [];\n    hdrExts.forEach(function (hdr) {\n        sdp.push('a=extmap:' + hdr.id + (hdr.senders ? '/' + SENDERS[role][direction][hdr.senders] : '') + ' ' + hdr.uri);\n    });\n\n    var ssrcGroups = desc.sourceGroups || [];\n    ssrcGroups.forEach(function (ssrcGroup) {\n        sdp.push('a=ssrc-group:' + ssrcGroup.semantics + ' ' + ssrcGroup.sources.join(' '));\n    });\n\n    var ssrcs = desc.sources || [];\n    ssrcs.forEach(function (ssrc) {\n        for (var i = 0; i < ssrc.parameters.length; i++) {\n            var param = ssrc.parameters[i];\n            sdp.push('a=ssrc:' + (ssrc.ssrc || desc.ssrc) + ' ' + param.key + (param.value ? (':' + param.value) : ''));\n        }\n    });\n\n    var candidates = transport.candidates || [];\n    candidates.forEach(function (candidate) {\n        sdp.push(exports.toCandidateSDP(candidate));\n    });\n\n    return sdp.join('\\r\\n');\n};\n\nexports.toCandidateSDP = function (candidate) {\n    var sdp = [];\n\n    sdp.push(candidate.foundation);\n    sdp.push(candidate.component);\n    sdp.push(candidate.protocol.toUpperCase());\n    sdp.push(candidate.priority);\n    sdp.push(candidate.ip);\n    sdp.push(candidate.port);\n\n    var type = candidate.type;\n    sdp.push('typ');\n    sdp.push(type);\n    if (type === 'srflx' || type === 'prflx' || type === 'relay') {\n        if (candidate.relAddr && candidate.relPort) {\n            sdp.push('raddr');\n            sdp.push(candidate.relAddr);\n            sdp.push('rport');\n            sdp.push(candidate.relPort);\n        }\n    }\n    if (candidate.tcpType && candidate.protocol.toUpperCase() == 'TCP') {\n        sdp.push('tcptype');\n        sdp.push(candidate.tcpType);\n    }\n\n    sdp.push('generation');\n    sdp.push(candidate.generation || '0');\n\n    // FIXME: apparently this is wrong per spec\n    // but then, we need this when actually putting this into\n    // SDP so it's going to stay.\n    // decision needs to be revisited when browsers dont\n    // accept this any longer\n    return 'a=candidate:' + sdp.join(' ');\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDczLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zZHAtamluZ2xlLWpzb24vbGliL3Rvc2RwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBTRU5ERVJTID0gcmVxdWlyZSgnLi9zZW5kZXJzJyk7XG5cblxuZXhwb3J0cy50b1Nlc3Npb25TRFAgPSBmdW5jdGlvbiAoc2Vzc2lvbiwgb3B0cykge1xuICAgIHZhciByb2xlID0gb3B0cy5yb2xlIHx8ICdpbml0aWF0b3InO1xuICAgIHZhciBkaXJlY3Rpb24gPSBvcHRzLmRpcmVjdGlvbiB8fCAnb3V0Z29pbmcnO1xuICAgIHZhciBzaWQgPSBvcHRzLnNpZCB8fCBzZXNzaW9uLnNpZCB8fCBEYXRlLm5vdygpO1xuICAgIHZhciB0aW1lID0gb3B0cy50aW1lIHx8IERhdGUubm93KCk7XG5cbiAgICB2YXIgc2RwID0gW1xuICAgICAgICAndj0wJyxcbiAgICAgICAgJ289LSAnICsgc2lkICsgJyAnICsgdGltZSArICcgSU4gSVA0IDAuMC4wLjAnLFxuICAgICAgICAncz0tJyxcbiAgICAgICAgJ3Q9MCAwJ1xuICAgIF07XG5cbiAgICB2YXIgY29udGVudHMgPSBzZXNzaW9uLmNvbnRlbnRzIHx8IFtdO1xuICAgIHZhciBoYXNTb3VyY2VzID0gZmFsc2U7XG4gICAgY29udGVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29udGVudCkge1xuICAgICAgICBpZiAoY29udGVudC5hcHBsaWNhdGlvbi5zb3VyY2VzICYmXG4gICAgICAgICAgICBjb250ZW50LmFwcGxpY2F0aW9uLnNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBoYXNTb3VyY2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGhhc1NvdXJjZXMpIHtcbiAgICAgICAgc2RwLnB1c2goJ2E9bXNpZC1zZW1hbnRpYzogV01TIConKTtcbiAgICB9XG5cbiAgICB2YXIgZ3JvdXBzID0gc2Vzc2lvbi5ncm91cHMgfHwgW107XG4gICAgZ3JvdXBzLmZvckVhY2goZnVuY3Rpb24gKGdyb3VwKSB7XG4gICAgICAgIHNkcC5wdXNoKCdhPWdyb3VwOicgKyBncm91cC5zZW1hbnRpY3MgKyAnICcgKyBncm91cC5jb250ZW50cy5qb2luKCcgJykpO1xuICAgIH0pO1xuXG5cbiAgICBjb250ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb250ZW50KSB7XG4gICAgICAgIHNkcC5wdXNoKGV4cG9ydHMudG9NZWRpYVNEUChjb250ZW50LCBvcHRzKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2RwLmpvaW4oJ1xcclxcbicpICsgJ1xcclxcbic7XG59O1xuXG5leHBvcnRzLnRvTWVkaWFTRFAgPSBmdW5jdGlvbiAoY29udGVudCwgb3B0cykge1xuICAgIHZhciBzZHAgPSBbXTtcblxuICAgIHZhciByb2xlID0gb3B0cy5yb2xlIHx8ICdpbml0aWF0b3InO1xuICAgIHZhciBkaXJlY3Rpb24gPSBvcHRzLmRpcmVjdGlvbiB8fCAnb3V0Z29pbmcnO1xuXG4gICAgdmFyIGRlc2MgPSBjb250ZW50LmFwcGxpY2F0aW9uO1xuICAgIHZhciB0cmFuc3BvcnQgPSBjb250ZW50LnRyYW5zcG9ydDtcbiAgICB2YXIgcGF5bG9hZHMgPSBkZXNjLnBheWxvYWRzIHx8IFtdO1xuICAgIHZhciBmaW5nZXJwcmludHMgPSAodHJhbnNwb3J0ICYmIHRyYW5zcG9ydC5maW5nZXJwcmludHMpIHx8IFtdO1xuXG4gICAgdmFyIG1saW5lID0gW107XG4gICAgaWYgKGRlc2MuYXBwbGljYXRpb25UeXBlID09ICdkYXRhY2hhbm5lbCcpIHtcbiAgICAgICAgbWxpbmUucHVzaCgnYXBwbGljYXRpb24nKTtcbiAgICAgICAgbWxpbmUucHVzaCgnMScpO1xuICAgICAgICBtbGluZS5wdXNoKCdEVExTL1NDVFAnKTtcbiAgICAgICAgaWYgKHRyYW5zcG9ydC5zY3RwKSB7XG4gICAgICAgICAgICB0cmFuc3BvcnQuc2N0cC5mb3JFYWNoKGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgICAgICAgICBtbGluZS5wdXNoKG1hcC5udW1iZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBtbGluZS5wdXNoKGRlc2MubWVkaWEpO1xuICAgICAgICBtbGluZS5wdXNoKCcxJyk7XG4gICAgICAgIGlmIChmaW5nZXJwcmludHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbWxpbmUucHVzaCgnVURQL1RMUy9SVFAvU0FWUEYnKTtcbiAgICAgICAgfSBlbHNlIGlmIChkZXNjLmVuY3J5cHRpb24gJiYgZGVzYy5lbmNyeXB0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG1saW5lLnB1c2goJ1JUUC9TQVZQRicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWxpbmUucHVzaCgnUlRQL0FWUEYnKTtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uIChwYXlsb2FkKSB7XG4gICAgICAgICAgICBtbGluZS5wdXNoKHBheWxvYWQuaWQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIHNkcC5wdXNoKCdtPScgKyBtbGluZS5qb2luKCcgJykpO1xuXG4gICAgc2RwLnB1c2goJ2M9SU4gSVA0IDAuMC4wLjAnKTtcbiAgICBpZiAoZGVzYy5iYW5kd2lkdGggJiYgZGVzYy5iYW5kd2lkdGgudHlwZSAmJiBkZXNjLmJhbmR3aWR0aC5iYW5kd2lkdGgpIHtcbiAgICAgICAgc2RwLnB1c2goJ2I9JyArIGRlc2MuYmFuZHdpZHRoLnR5cGUgKyAnOicgKyBkZXNjLmJhbmR3aWR0aC5iYW5kd2lkdGgpO1xuICAgIH1cbiAgICBpZiAoZGVzYy5hcHBsaWNhdGlvblR5cGUgPT0gJ3J0cCcpIHtcbiAgICAgICAgc2RwLnB1c2goJ2E9cnRjcDoxIElOIElQNCAwLjAuMC4wJyk7XG4gICAgfVxuXG4gICAgaWYgKHRyYW5zcG9ydCkge1xuICAgICAgICBpZiAodHJhbnNwb3J0LnVmcmFnKSB7XG4gICAgICAgICAgICBzZHAucHVzaCgnYT1pY2UtdWZyYWc6JyArIHRyYW5zcG9ydC51ZnJhZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYW5zcG9ydC5wd2QpIHtcbiAgICAgICAgICAgIHNkcC5wdXNoKCdhPWljZS1wd2Q6JyArIHRyYW5zcG9ydC5wd2QpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHB1c2hlZFNldHVwID0gZmFsc2U7XG4gICAgICAgIGZpbmdlcnByaW50cy5mb3JFYWNoKGZ1bmN0aW9uIChmaW5nZXJwcmludCkge1xuICAgICAgICAgICAgc2RwLnB1c2goJ2E9ZmluZ2VycHJpbnQ6JyArIGZpbmdlcnByaW50Lmhhc2ggKyAnICcgKyBmaW5nZXJwcmludC52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoZmluZ2VycHJpbnQuc2V0dXAgJiYgIXB1c2hlZFNldHVwKSB7XG4gICAgICAgICAgICAgICAgc2RwLnB1c2goJ2E9c2V0dXA6JyArIGZpbmdlcnByaW50LnNldHVwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRyYW5zcG9ydC5zY3RwKSB7XG4gICAgICAgICAgICB0cmFuc3BvcnQuc2N0cC5mb3JFYWNoKGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgICAgICAgICBzZHAucHVzaCgnYT1zY3RwbWFwOicgKyBtYXAubnVtYmVyICsgJyAnICsgbWFwLnByb3RvY29sICsgJyAnICsgbWFwLnN0cmVhbXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVzYy5hcHBsaWNhdGlvblR5cGUgPT0gJ3J0cCcpIHtcbiAgICAgICAgc2RwLnB1c2goJ2E9JyArIChTRU5ERVJTW3JvbGVdW2RpcmVjdGlvbl1bY29udGVudC5zZW5kZXJzXSB8fCAnc2VuZHJlY3YnKSk7XG4gICAgfVxuICAgIHNkcC5wdXNoKCdhPW1pZDonICsgY29udGVudC5uYW1lKTtcblxuICAgIGlmIChkZXNjLnNvdXJjZXMgJiYgZGVzYy5zb3VyY2VzLmxlbmd0aCkge1xuICAgICAgICAoZGVzYy5zb3VyY2VzWzBdLnBhcmFtZXRlcnMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgICAgICBpZiAocGFyYW0ua2V5ID09PSAnbXNpZCcpIHtcbiAgICAgICAgICAgICAgICBzZHAucHVzaCgnYT1tc2lkOicgKyBwYXJhbS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChkZXNjLm11eCkge1xuICAgICAgICBzZHAucHVzaCgnYT1ydGNwLW11eCcpO1xuICAgIH1cblxuICAgIHZhciBlbmNyeXB0aW9uID0gZGVzYy5lbmNyeXB0aW9uIHx8IFtdO1xuICAgIGVuY3J5cHRpb24uZm9yRWFjaChmdW5jdGlvbiAoY3J5cHRvKSB7XG4gICAgICAgIHNkcC5wdXNoKCdhPWNyeXB0bzonICsgY3J5cHRvLnRhZyArICcgJyArIGNyeXB0by5jaXBoZXJTdWl0ZSArICcgJyArIGNyeXB0by5rZXlQYXJhbXMgKyAoY3J5cHRvLnNlc3Npb25QYXJhbXMgPyAnICcgKyBjcnlwdG8uc2Vzc2lvblBhcmFtcyA6ICcnKSk7XG4gICAgfSk7XG4gICAgaWYgKGRlc2MuZ29vZ0NvbmZlcmVuY2VGbGFnKSB7XG4gICAgICAgIHNkcC5wdXNoKCdhPXgtZ29vZ2xlLWZsYWc6Y29uZmVyZW5jZScpO1xuICAgIH1cblxuICAgIHBheWxvYWRzLmZvckVhY2goZnVuY3Rpb24gKHBheWxvYWQpIHtcbiAgICAgICAgdmFyIHJ0cG1hcCA9ICdhPXJ0cG1hcDonICsgcGF5bG9hZC5pZCArICcgJyArIHBheWxvYWQubmFtZSArICcvJyArIHBheWxvYWQuY2xvY2tyYXRlO1xuICAgICAgICBpZiAocGF5bG9hZC5jaGFubmVscyAmJiBwYXlsb2FkLmNoYW5uZWxzICE9ICcxJykge1xuICAgICAgICAgICAgcnRwbWFwICs9ICcvJyArIHBheWxvYWQuY2hhbm5lbHM7XG4gICAgICAgIH1cbiAgICAgICAgc2RwLnB1c2gocnRwbWFwKTtcblxuICAgICAgICBpZiAocGF5bG9hZC5wYXJhbWV0ZXJzICYmIHBheWxvYWQucGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBmbXRwID0gWydhPWZtdHA6JyArIHBheWxvYWQuaWRdO1xuICAgICAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSBbXTtcbiAgICAgICAgICAgIHBheWxvYWQucGFyYW1ldGVycy5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkge1xuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMucHVzaCgocGFyYW0ua2V5ID8gcGFyYW0ua2V5ICsgJz0nIDogJycpICsgcGFyYW0udmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmbXRwLnB1c2gocGFyYW1ldGVycy5qb2luKCc7JykpO1xuICAgICAgICAgICAgc2RwLnB1c2goZm10cC5qb2luKCcgJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBheWxvYWQuZmVlZGJhY2spIHtcbiAgICAgICAgICAgIHBheWxvYWQuZmVlZGJhY2suZm9yRWFjaChmdW5jdGlvbiAoZmIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmIudHlwZSA9PT0gJ3Ryci1pbnQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHNkcC5wdXNoKCdhPXJ0Y3AtZmI6JyArIHBheWxvYWQuaWQgKyAnIHRyci1pbnQgJyArIChmYi52YWx1ZSA/IGZiLnZhbHVlIDogJzAnKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2RwLnB1c2goJ2E9cnRjcC1mYjonICsgcGF5bG9hZC5pZCArICcgJyArIGZiLnR5cGUgKyAoZmIuc3VidHlwZSA/ICcgJyArIGZiLnN1YnR5cGUgOiAnJykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZGVzYy5mZWVkYmFjaykge1xuICAgICAgICBkZXNjLmZlZWRiYWNrLmZvckVhY2goZnVuY3Rpb24gKGZiKSB7XG4gICAgICAgICAgICBpZiAoZmIudHlwZSA9PT0gJ3Ryci1pbnQnKSB7XG4gICAgICAgICAgICAgICAgc2RwLnB1c2goJ2E9cnRjcC1mYjoqIHRyci1pbnQgJyArIChmYi52YWx1ZSA/IGZiLnZhbHVlIDogJzAnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNkcC5wdXNoKCdhPXJ0Y3AtZmI6KiAnICsgZmIudHlwZSArIChmYi5zdWJ0eXBlID8gJyAnICsgZmIuc3VidHlwZSA6ICcnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBoZHJFeHRzID0gZGVzYy5oZWFkZXJFeHRlbnNpb25zIHx8IFtdO1xuICAgIGhkckV4dHMuZm9yRWFjaChmdW5jdGlvbiAoaGRyKSB7XG4gICAgICAgIHNkcC5wdXNoKCdhPWV4dG1hcDonICsgaGRyLmlkICsgKGhkci5zZW5kZXJzID8gJy8nICsgU0VOREVSU1tyb2xlXVtkaXJlY3Rpb25dW2hkci5zZW5kZXJzXSA6ICcnKSArICcgJyArIGhkci51cmkpO1xuICAgIH0pO1xuXG4gICAgdmFyIHNzcmNHcm91cHMgPSBkZXNjLnNvdXJjZUdyb3VwcyB8fCBbXTtcbiAgICBzc3JjR3JvdXBzLmZvckVhY2goZnVuY3Rpb24gKHNzcmNHcm91cCkge1xuICAgICAgICBzZHAucHVzaCgnYT1zc3JjLWdyb3VwOicgKyBzc3JjR3JvdXAuc2VtYW50aWNzICsgJyAnICsgc3NyY0dyb3VwLnNvdXJjZXMuam9pbignICcpKTtcbiAgICB9KTtcblxuICAgIHZhciBzc3JjcyA9IGRlc2Muc291cmNlcyB8fCBbXTtcbiAgICBzc3Jjcy5mb3JFYWNoKGZ1bmN0aW9uIChzc3JjKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3NyYy5wYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcGFyYW0gPSBzc3JjLnBhcmFtZXRlcnNbaV07XG4gICAgICAgICAgICBzZHAucHVzaCgnYT1zc3JjOicgKyAoc3NyYy5zc3JjIHx8IGRlc2Muc3NyYykgKyAnICcgKyBwYXJhbS5rZXkgKyAocGFyYW0udmFsdWUgPyAoJzonICsgcGFyYW0udmFsdWUpIDogJycpKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIGNhbmRpZGF0ZXMgPSB0cmFuc3BvcnQuY2FuZGlkYXRlcyB8fCBbXTtcbiAgICBjYW5kaWRhdGVzLmZvckVhY2goZnVuY3Rpb24gKGNhbmRpZGF0ZSkge1xuICAgICAgICBzZHAucHVzaChleHBvcnRzLnRvQ2FuZGlkYXRlU0RQKGNhbmRpZGF0ZSkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNkcC5qb2luKCdcXHJcXG4nKTtcbn07XG5cbmV4cG9ydHMudG9DYW5kaWRhdGVTRFAgPSBmdW5jdGlvbiAoY2FuZGlkYXRlKSB7XG4gICAgdmFyIHNkcCA9IFtdO1xuXG4gICAgc2RwLnB1c2goY2FuZGlkYXRlLmZvdW5kYXRpb24pO1xuICAgIHNkcC5wdXNoKGNhbmRpZGF0ZS5jb21wb25lbnQpO1xuICAgIHNkcC5wdXNoKGNhbmRpZGF0ZS5wcm90b2NvbC50b1VwcGVyQ2FzZSgpKTtcbiAgICBzZHAucHVzaChjYW5kaWRhdGUucHJpb3JpdHkpO1xuICAgIHNkcC5wdXNoKGNhbmRpZGF0ZS5pcCk7XG4gICAgc2RwLnB1c2goY2FuZGlkYXRlLnBvcnQpO1xuXG4gICAgdmFyIHR5cGUgPSBjYW5kaWRhdGUudHlwZTtcbiAgICBzZHAucHVzaCgndHlwJyk7XG4gICAgc2RwLnB1c2godHlwZSk7XG4gICAgaWYgKHR5cGUgPT09ICdzcmZseCcgfHwgdHlwZSA9PT0gJ3ByZmx4JyB8fCB0eXBlID09PSAncmVsYXknKSB7XG4gICAgICAgIGlmIChjYW5kaWRhdGUucmVsQWRkciAmJiBjYW5kaWRhdGUucmVsUG9ydCkge1xuICAgICAgICAgICAgc2RwLnB1c2goJ3JhZGRyJyk7XG4gICAgICAgICAgICBzZHAucHVzaChjYW5kaWRhdGUucmVsQWRkcik7XG4gICAgICAgICAgICBzZHAucHVzaCgncnBvcnQnKTtcbiAgICAgICAgICAgIHNkcC5wdXNoKGNhbmRpZGF0ZS5yZWxQb3J0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2FuZGlkYXRlLnRjcFR5cGUgJiYgY2FuZGlkYXRlLnByb3RvY29sLnRvVXBwZXJDYXNlKCkgPT0gJ1RDUCcpIHtcbiAgICAgICAgc2RwLnB1c2goJ3RjcHR5cGUnKTtcbiAgICAgICAgc2RwLnB1c2goY2FuZGlkYXRlLnRjcFR5cGUpO1xuICAgIH1cblxuICAgIHNkcC5wdXNoKCdnZW5lcmF0aW9uJyk7XG4gICAgc2RwLnB1c2goY2FuZGlkYXRlLmdlbmVyYXRpb24gfHwgJzAnKTtcblxuICAgIC8vIEZJWE1FOiBhcHBhcmVudGx5IHRoaXMgaXMgd3JvbmcgcGVyIHNwZWNcbiAgICAvLyBidXQgdGhlbiwgd2UgbmVlZCB0aGlzIHdoZW4gYWN0dWFsbHkgcHV0dGluZyB0aGlzIGludG9cbiAgICAvLyBTRFAgc28gaXQncyBnb2luZyB0byBzdGF5LlxuICAgIC8vIGRlY2lzaW9uIG5lZWRzIHRvIGJlIHJldmlzaXRlZCB3aGVuIGJyb3dzZXJzIGRvbnRcbiAgICAvLyBhY2NlcHQgdGhpcyBhbnkgbG9uZ2VyXG4gICAgcmV0dXJuICdhPWNhbmRpZGF0ZTonICsgc2RwLmpvaW4oJyAnKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vc2RwLWppbmdsZS1qc29uL2xpYi90b3NkcC5qc1xuLy8gbW9kdWxlIGlkID0gNDczXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 474 */
/***/ function(module, exports) {

    eval("module.exports = {\n    initiator: {\n        incoming: {\n            initiator: 'recvonly',\n            responder: 'sendonly',\n            both: 'sendrecv',\n            none: 'inactive',\n            recvonly: 'initiator',\n            sendonly: 'responder',\n            sendrecv: 'both',\n            inactive: 'none'\n        },\n        outgoing: {\n            initiator: 'sendonly',\n            responder: 'recvonly',\n            both: 'sendrecv',\n            none: 'inactive',\n            recvonly: 'responder',\n            sendonly: 'initiator',\n            sendrecv: 'both',\n            inactive: 'none'\n        }\n    },\n    responder: {\n        incoming: {\n            initiator: 'sendonly',\n            responder: 'recvonly',\n            both: 'sendrecv',\n            none: 'inactive',\n            recvonly: 'responder',\n            sendonly: 'initiator',\n            sendrecv: 'both',\n            inactive: 'none'\n        },\n        outgoing: {\n            initiator: 'recvonly',\n            responder: 'sendonly',\n            both: 'sendrecv',\n            none: 'inactive',\n            recvonly: 'initiator',\n            sendonly: 'responder',\n            sendrecv: 'both',\n            inactive: 'none'\n        }\n    }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDc0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zZHAtamluZ2xlLWpzb24vbGliL3NlbmRlcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgaW5pdGlhdG9yOiB7XG4gICAgICAgIGluY29taW5nOiB7XG4gICAgICAgICAgICBpbml0aWF0b3I6ICdyZWN2b25seScsXG4gICAgICAgICAgICByZXNwb25kZXI6ICdzZW5kb25seScsXG4gICAgICAgICAgICBib3RoOiAnc2VuZHJlY3YnLFxuICAgICAgICAgICAgbm9uZTogJ2luYWN0aXZlJyxcbiAgICAgICAgICAgIHJlY3Zvbmx5OiAnaW5pdGlhdG9yJyxcbiAgICAgICAgICAgIHNlbmRvbmx5OiAncmVzcG9uZGVyJyxcbiAgICAgICAgICAgIHNlbmRyZWN2OiAnYm90aCcsXG4gICAgICAgICAgICBpbmFjdGl2ZTogJ25vbmUnXG4gICAgICAgIH0sXG4gICAgICAgIG91dGdvaW5nOiB7XG4gICAgICAgICAgICBpbml0aWF0b3I6ICdzZW5kb25seScsXG4gICAgICAgICAgICByZXNwb25kZXI6ICdyZWN2b25seScsXG4gICAgICAgICAgICBib3RoOiAnc2VuZHJlY3YnLFxuICAgICAgICAgICAgbm9uZTogJ2luYWN0aXZlJyxcbiAgICAgICAgICAgIHJlY3Zvbmx5OiAncmVzcG9uZGVyJyxcbiAgICAgICAgICAgIHNlbmRvbmx5OiAnaW5pdGlhdG9yJyxcbiAgICAgICAgICAgIHNlbmRyZWN2OiAnYm90aCcsXG4gICAgICAgICAgICBpbmFjdGl2ZTogJ25vbmUnXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJlc3BvbmRlcjoge1xuICAgICAgICBpbmNvbWluZzoge1xuICAgICAgICAgICAgaW5pdGlhdG9yOiAnc2VuZG9ubHknLFxuICAgICAgICAgICAgcmVzcG9uZGVyOiAncmVjdm9ubHknLFxuICAgICAgICAgICAgYm90aDogJ3NlbmRyZWN2JyxcbiAgICAgICAgICAgIG5vbmU6ICdpbmFjdGl2ZScsXG4gICAgICAgICAgICByZWN2b25seTogJ3Jlc3BvbmRlcicsXG4gICAgICAgICAgICBzZW5kb25seTogJ2luaXRpYXRvcicsXG4gICAgICAgICAgICBzZW5kcmVjdjogJ2JvdGgnLFxuICAgICAgICAgICAgaW5hY3RpdmU6ICdub25lJ1xuICAgICAgICB9LFxuICAgICAgICBvdXRnb2luZzoge1xuICAgICAgICAgICAgaW5pdGlhdG9yOiAncmVjdm9ubHknLFxuICAgICAgICAgICAgcmVzcG9uZGVyOiAnc2VuZG9ubHknLFxuICAgICAgICAgICAgYm90aDogJ3NlbmRyZWN2JyxcbiAgICAgICAgICAgIG5vbmU6ICdpbmFjdGl2ZScsXG4gICAgICAgICAgICByZWN2b25seTogJ2luaXRpYXRvcicsXG4gICAgICAgICAgICBzZW5kb25seTogJ3Jlc3BvbmRlcicsXG4gICAgICAgICAgICBzZW5kcmVjdjogJ2JvdGgnLFxuICAgICAgICAgICAgaW5hY3RpdmU6ICdub25lJ1xuICAgICAgICB9XG4gICAgfVxufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9zZHAtamluZ2xlLWpzb24vbGliL3NlbmRlcnMuanNcbi8vIG1vZHVsZSBpZCA9IDQ3NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 475 */
/***/ function(module, exports, __webpack_require__) {

    eval("var SENDERS = __webpack_require__(474);\nvar parsers = __webpack_require__(476);\nvar idCounter = Math.random();\n\n\nexports._setIdCounter = function (counter) {\n    idCounter = counter;\n};\n\nexports.toSessionJSON = function (sdp, opts) {\n    var i;\n    var creators = opts.creators || [];\n    var role = opts.role || 'initiator';\n    var direction = opts.direction || 'outgoing';\n\n\n    // Divide the SDP into session and media sections.\n    var media = sdp.split('\\r\\nm=');\n    for (i = 1; i < media.length; i++) {\n        media[i] = 'm=' + media[i];\n        if (i !== media.length - 1) {\n            media[i] += '\\r\\n';\n        }\n    }\n    var session = media.shift() + '\\r\\n';\n    var sessionLines = parsers.lines(session);\n    var parsed = {};\n\n    var contents = [];\n    for (i = 0; i < media.length; i++) {\n        contents.push(exports.toMediaJSON(media[i], session, {\n            role: role,\n            direction: direction,\n            creator: creators[i] || 'initiator'\n        }));\n    }\n    parsed.contents = contents;\n\n    var groupLines = parsers.findLines('a=group:', sessionLines);\n    if (groupLines.length) {\n        parsed.groups = parsers.groups(groupLines);\n    }\n\n    return parsed;\n};\n\nexports.toMediaJSON = function (media, session, opts) {\n    var creator = opts.creator || 'initiator';\n    var role = opts.role || 'initiator';\n    var direction = opts.direction || 'outgoing';\n\n    var lines = parsers.lines(media);\n    var sessionLines = parsers.lines(session);\n    var mline = parsers.mline(lines[0]);\n\n    var content = {\n        creator: creator,\n        name: mline.media,\n        application: {\n            applicationType: 'rtp',\n            media: mline.media,\n            payloads: [],\n            encryption: [],\n            feedback: [],\n            headerExtensions: []\n        },\n        transport: {\n            transportType: 'iceUdp',\n            candidates: [],\n            fingerprints: []\n        }\n    };\n    if (mline.media == 'application') {\n        // FIXME: the description is most likely to be independent\n        // of the SDP and should be processed by other parts of the library\n        content.application = {\n            applicationType: 'datachannel'\n        };\n        content.transport.sctp = [];\n    }\n    var desc = content.application;\n    var trans = content.transport;\n\n    // If we have a mid, use that for the content name instead.\n    var mid = parsers.findLine('a=mid:', lines);\n    if (mid) {\n        content.name = mid.substr(6);\n    }\n\n    if (parsers.findLine('a=sendrecv', lines, sessionLines)) {\n        content.senders = 'both';\n    } else if (parsers.findLine('a=sendonly', lines, sessionLines)) {\n        content.senders = SENDERS[role][direction].sendonly;\n    } else if (parsers.findLine('a=recvonly', lines, sessionLines)) {\n        content.senders = SENDERS[role][direction].recvonly;\n    } else if (parsers.findLine('a=inactive', lines, sessionLines)) {\n        content.senders = 'none';\n    }\n\n    if (desc.applicationType == 'rtp') {\n        var bandwidth = parsers.findLine('b=', lines);\n        if (bandwidth) {\n            desc.bandwidth = parsers.bandwidth(bandwidth);\n        }\n\n        var ssrc = parsers.findLine('a=ssrc:', lines);\n        if (ssrc) {\n            desc.ssrc = ssrc.substr(7).split(' ')[0];\n        }\n\n        var rtpmapLines = parsers.findLines('a=rtpmap:', lines);\n        rtpmapLines.forEach(function (line) {\n            var payload = parsers.rtpmap(line);\n            payload.parameters = [];\n            payload.feedback = [];\n\n            var fmtpLines = parsers.findLines('a=fmtp:' + payload.id, lines);\n            // There should only be one fmtp line per payload\n            fmtpLines.forEach(function (line) {\n                payload.parameters = parsers.fmtp(line);\n            });\n\n            var fbLines = parsers.findLines('a=rtcp-fb:' + payload.id, lines);\n            fbLines.forEach(function (line) {\n                payload.feedback.push(parsers.rtcpfb(line));\n            });\n\n            desc.payloads.push(payload);\n        });\n\n        var cryptoLines = parsers.findLines('a=crypto:', lines, sessionLines);\n        cryptoLines.forEach(function (line) {\n            desc.encryption.push(parsers.crypto(line));\n        });\n\n        if (parsers.findLine('a=rtcp-mux', lines)) {\n            desc.mux = true;\n        }\n\n        var fbLines = parsers.findLines('a=rtcp-fb:*', lines);\n        fbLines.forEach(function (line) {\n            desc.feedback.push(parsers.rtcpfb(line));\n        });\n\n        var extLines = parsers.findLines('a=extmap:', lines);\n        extLines.forEach(function (line) {\n            var ext = parsers.extmap(line);\n\n            ext.senders = SENDERS[role][direction][ext.senders];\n\n            desc.headerExtensions.push(ext);\n        });\n\n        var ssrcGroupLines = parsers.findLines('a=ssrc-group:', lines);\n        desc.sourceGroups = parsers.sourceGroups(ssrcGroupLines || []);\n\n        var ssrcLines = parsers.findLines('a=ssrc:', lines);\n        var sources = desc.sources = parsers.sources(ssrcLines || []);\n\n        var msidLine = parsers.findLine('a=msid:', lines);\n        if (msidLine) {\n            var msid = parsers.msid(msidLine);\n            ['msid', 'mslabel', 'label'].forEach(function (key) {\n                for (var i = 0; i < sources.length; i++) {\n                    var found = false;\n                    for (var j = 0; j < sources[i].parameters.length; j++) {\n                        if (sources[i].parameters[j].key === key) {\n                            found = true;\n                        }\n                    }\n                    if (!found) {\n                        sources[i].parameters.push({ key: key, value: msid[key] });\n                    }\n                }\n            });\n        }\n\n        if (parsers.findLine('a=x-google-flag:conference', lines, sessionLines)) {\n            desc.googConferenceFlag = true;\n        }\n    }\n\n    // transport specific attributes\n    var fingerprintLines = parsers.findLines('a=fingerprint:', lines, sessionLines);\n    var setup = parsers.findLine('a=setup:', lines, sessionLines);\n    fingerprintLines.forEach(function (line) {\n        var fp = parsers.fingerprint(line);\n        if (setup) {\n            fp.setup = setup.substr(8);\n        }\n        trans.fingerprints.push(fp);\n    });\n\n    var ufragLine = parsers.findLine('a=ice-ufrag:', lines, sessionLines);\n    var pwdLine = parsers.findLine('a=ice-pwd:', lines, sessionLines);\n    if (ufragLine && pwdLine) {\n        trans.ufrag = ufragLine.substr(12);\n        trans.pwd = pwdLine.substr(10);\n        trans.candidates = [];\n\n        var candidateLines = parsers.findLines('a=candidate:', lines, sessionLines);\n        candidateLines.forEach(function (line) {\n            trans.candidates.push(exports.toCandidateJSON(line));\n        });\n    }\n\n    if (desc.applicationType == 'datachannel') {\n        var sctpmapLines = parsers.findLines('a=sctpmap:', lines);\n        sctpmapLines.forEach(function (line) {\n            var sctp = parsers.sctpmap(line);\n            trans.sctp.push(sctp);\n        });\n    }\n\n    return content;\n};\n\nexports.toCandidateJSON = function (line) {\n    var candidate = parsers.candidate(line.split('\\r\\n')[0]);\n    candidate.id = (idCounter++).toString(36).substr(0, 12);\n    return candidate;\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDc1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zZHAtamluZ2xlLWpzb24vbGliL3RvanNvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgU0VOREVSUyA9IHJlcXVpcmUoJy4vc2VuZGVycycpO1xudmFyIHBhcnNlcnMgPSByZXF1aXJlKCcuL3BhcnNlcnMnKTtcbnZhciBpZENvdW50ZXIgPSBNYXRoLnJhbmRvbSgpO1xuXG5cbmV4cG9ydHMuX3NldElkQ291bnRlciA9IGZ1bmN0aW9uIChjb3VudGVyKSB7XG4gICAgaWRDb3VudGVyID0gY291bnRlcjtcbn07XG5cbmV4cG9ydHMudG9TZXNzaW9uSlNPTiA9IGZ1bmN0aW9uIChzZHAsIG9wdHMpIHtcbiAgICB2YXIgaTtcbiAgICB2YXIgY3JlYXRvcnMgPSBvcHRzLmNyZWF0b3JzIHx8IFtdO1xuICAgIHZhciByb2xlID0gb3B0cy5yb2xlIHx8ICdpbml0aWF0b3InO1xuICAgIHZhciBkaXJlY3Rpb24gPSBvcHRzLmRpcmVjdGlvbiB8fCAnb3V0Z29pbmcnO1xuXG5cbiAgICAvLyBEaXZpZGUgdGhlIFNEUCBpbnRvIHNlc3Npb24gYW5kIG1lZGlhIHNlY3Rpb25zLlxuICAgIHZhciBtZWRpYSA9IHNkcC5zcGxpdCgnXFxyXFxubT0nKTtcbiAgICBmb3IgKGkgPSAxOyBpIDwgbWVkaWEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbWVkaWFbaV0gPSAnbT0nICsgbWVkaWFbaV07XG4gICAgICAgIGlmIChpICE9PSBtZWRpYS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBtZWRpYVtpXSArPSAnXFxyXFxuJztcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgc2Vzc2lvbiA9IG1lZGlhLnNoaWZ0KCkgKyAnXFxyXFxuJztcbiAgICB2YXIgc2Vzc2lvbkxpbmVzID0gcGFyc2Vycy5saW5lcyhzZXNzaW9uKTtcbiAgICB2YXIgcGFyc2VkID0ge307XG5cbiAgICB2YXIgY29udGVudHMgPSBbXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbWVkaWEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29udGVudHMucHVzaChleHBvcnRzLnRvTWVkaWFKU09OKG1lZGlhW2ldLCBzZXNzaW9uLCB7XG4gICAgICAgICAgICByb2xlOiByb2xlLFxuICAgICAgICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgICAgICAgICBjcmVhdG9yOiBjcmVhdG9yc1tpXSB8fCAnaW5pdGlhdG9yJ1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHBhcnNlZC5jb250ZW50cyA9IGNvbnRlbnRzO1xuXG4gICAgdmFyIGdyb3VwTGluZXMgPSBwYXJzZXJzLmZpbmRMaW5lcygnYT1ncm91cDonLCBzZXNzaW9uTGluZXMpO1xuICAgIGlmIChncm91cExpbmVzLmxlbmd0aCkge1xuICAgICAgICBwYXJzZWQuZ3JvdXBzID0gcGFyc2Vycy5ncm91cHMoZ3JvdXBMaW5lcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlZDtcbn07XG5cbmV4cG9ydHMudG9NZWRpYUpTT04gPSBmdW5jdGlvbiAobWVkaWEsIHNlc3Npb24sIG9wdHMpIHtcbiAgICB2YXIgY3JlYXRvciA9IG9wdHMuY3JlYXRvciB8fCAnaW5pdGlhdG9yJztcbiAgICB2YXIgcm9sZSA9IG9wdHMucm9sZSB8fCAnaW5pdGlhdG9yJztcbiAgICB2YXIgZGlyZWN0aW9uID0gb3B0cy5kaXJlY3Rpb24gfHwgJ291dGdvaW5nJztcblxuICAgIHZhciBsaW5lcyA9IHBhcnNlcnMubGluZXMobWVkaWEpO1xuICAgIHZhciBzZXNzaW9uTGluZXMgPSBwYXJzZXJzLmxpbmVzKHNlc3Npb24pO1xuICAgIHZhciBtbGluZSA9IHBhcnNlcnMubWxpbmUobGluZXNbMF0pO1xuXG4gICAgdmFyIGNvbnRlbnQgPSB7XG4gICAgICAgIGNyZWF0b3I6IGNyZWF0b3IsXG4gICAgICAgIG5hbWU6IG1saW5lLm1lZGlhLFxuICAgICAgICBhcHBsaWNhdGlvbjoge1xuICAgICAgICAgICAgYXBwbGljYXRpb25UeXBlOiAncnRwJyxcbiAgICAgICAgICAgIG1lZGlhOiBtbGluZS5tZWRpYSxcbiAgICAgICAgICAgIHBheWxvYWRzOiBbXSxcbiAgICAgICAgICAgIGVuY3J5cHRpb246IFtdLFxuICAgICAgICAgICAgZmVlZGJhY2s6IFtdLFxuICAgICAgICAgICAgaGVhZGVyRXh0ZW5zaW9uczogW11cbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNwb3J0OiB7XG4gICAgICAgICAgICB0cmFuc3BvcnRUeXBlOiAnaWNlVWRwJyxcbiAgICAgICAgICAgIGNhbmRpZGF0ZXM6IFtdLFxuICAgICAgICAgICAgZmluZ2VycHJpbnRzOiBbXVxuICAgICAgICB9XG4gICAgfTtcbiAgICBpZiAobWxpbmUubWVkaWEgPT0gJ2FwcGxpY2F0aW9uJykge1xuICAgICAgICAvLyBGSVhNRTogdGhlIGRlc2NyaXB0aW9uIGlzIG1vc3QgbGlrZWx5IHRvIGJlIGluZGVwZW5kZW50XG4gICAgICAgIC8vIG9mIHRoZSBTRFAgYW5kIHNob3VsZCBiZSBwcm9jZXNzZWQgYnkgb3RoZXIgcGFydHMgb2YgdGhlIGxpYnJhcnlcbiAgICAgICAgY29udGVudC5hcHBsaWNhdGlvbiA9IHtcbiAgICAgICAgICAgIGFwcGxpY2F0aW9uVHlwZTogJ2RhdGFjaGFubmVsJ1xuICAgICAgICB9O1xuICAgICAgICBjb250ZW50LnRyYW5zcG9ydC5zY3RwID0gW107XG4gICAgfVxuICAgIHZhciBkZXNjID0gY29udGVudC5hcHBsaWNhdGlvbjtcbiAgICB2YXIgdHJhbnMgPSBjb250ZW50LnRyYW5zcG9ydDtcblxuICAgIC8vIElmIHdlIGhhdmUgYSBtaWQsIHVzZSB0aGF0IGZvciB0aGUgY29udGVudCBuYW1lIGluc3RlYWQuXG4gICAgdmFyIG1pZCA9IHBhcnNlcnMuZmluZExpbmUoJ2E9bWlkOicsIGxpbmVzKTtcbiAgICBpZiAobWlkKSB7XG4gICAgICAgIGNvbnRlbnQubmFtZSA9IG1pZC5zdWJzdHIoNik7XG4gICAgfVxuXG4gICAgaWYgKHBhcnNlcnMuZmluZExpbmUoJ2E9c2VuZHJlY3YnLCBsaW5lcywgc2Vzc2lvbkxpbmVzKSkge1xuICAgICAgICBjb250ZW50LnNlbmRlcnMgPSAnYm90aCc7XG4gICAgfSBlbHNlIGlmIChwYXJzZXJzLmZpbmRMaW5lKCdhPXNlbmRvbmx5JywgbGluZXMsIHNlc3Npb25MaW5lcykpIHtcbiAgICAgICAgY29udGVudC5zZW5kZXJzID0gU0VOREVSU1tyb2xlXVtkaXJlY3Rpb25dLnNlbmRvbmx5O1xuICAgIH0gZWxzZSBpZiAocGFyc2Vycy5maW5kTGluZSgnYT1yZWN2b25seScsIGxpbmVzLCBzZXNzaW9uTGluZXMpKSB7XG4gICAgICAgIGNvbnRlbnQuc2VuZGVycyA9IFNFTkRFUlNbcm9sZV1bZGlyZWN0aW9uXS5yZWN2b25seTtcbiAgICB9IGVsc2UgaWYgKHBhcnNlcnMuZmluZExpbmUoJ2E9aW5hY3RpdmUnLCBsaW5lcywgc2Vzc2lvbkxpbmVzKSkge1xuICAgICAgICBjb250ZW50LnNlbmRlcnMgPSAnbm9uZSc7XG4gICAgfVxuXG4gICAgaWYgKGRlc2MuYXBwbGljYXRpb25UeXBlID09ICdydHAnKSB7XG4gICAgICAgIHZhciBiYW5kd2lkdGggPSBwYXJzZXJzLmZpbmRMaW5lKCdiPScsIGxpbmVzKTtcbiAgICAgICAgaWYgKGJhbmR3aWR0aCkge1xuICAgICAgICAgICAgZGVzYy5iYW5kd2lkdGggPSBwYXJzZXJzLmJhbmR3aWR0aChiYW5kd2lkdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNzcmMgPSBwYXJzZXJzLmZpbmRMaW5lKCdhPXNzcmM6JywgbGluZXMpO1xuICAgICAgICBpZiAoc3NyYykge1xuICAgICAgICAgICAgZGVzYy5zc3JjID0gc3NyYy5zdWJzdHIoNykuc3BsaXQoJyAnKVswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBydHBtYXBMaW5lcyA9IHBhcnNlcnMuZmluZExpbmVzKCdhPXJ0cG1hcDonLCBsaW5lcyk7XG4gICAgICAgIHJ0cG1hcExpbmVzLmZvckVhY2goZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgICAgICAgIHZhciBwYXlsb2FkID0gcGFyc2Vycy5ydHBtYXAobGluZSk7XG4gICAgICAgICAgICBwYXlsb2FkLnBhcmFtZXRlcnMgPSBbXTtcbiAgICAgICAgICAgIHBheWxvYWQuZmVlZGJhY2sgPSBbXTtcblxuICAgICAgICAgICAgdmFyIGZtdHBMaW5lcyA9IHBhcnNlcnMuZmluZExpbmVzKCdhPWZtdHA6JyArIHBheWxvYWQuaWQsIGxpbmVzKTtcbiAgICAgICAgICAgIC8vIFRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSBmbXRwIGxpbmUgcGVyIHBheWxvYWRcbiAgICAgICAgICAgIGZtdHBMaW5lcy5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5wYXJhbWV0ZXJzID0gcGFyc2Vycy5mbXRwKGxpbmUpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHZhciBmYkxpbmVzID0gcGFyc2Vycy5maW5kTGluZXMoJ2E9cnRjcC1mYjonICsgcGF5bG9hZC5pZCwgbGluZXMpO1xuICAgICAgICAgICAgZmJMaW5lcy5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5mZWVkYmFjay5wdXNoKHBhcnNlcnMucnRjcGZiKGxpbmUpKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBkZXNjLnBheWxvYWRzLnB1c2gocGF5bG9hZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBjcnlwdG9MaW5lcyA9IHBhcnNlcnMuZmluZExpbmVzKCdhPWNyeXB0bzonLCBsaW5lcywgc2Vzc2lvbkxpbmVzKTtcbiAgICAgICAgY3J5cHRvTGluZXMuZm9yRWFjaChmdW5jdGlvbiAobGluZSkge1xuICAgICAgICAgICAgZGVzYy5lbmNyeXB0aW9uLnB1c2gocGFyc2Vycy5jcnlwdG8obGluZSkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocGFyc2Vycy5maW5kTGluZSgnYT1ydGNwLW11eCcsIGxpbmVzKSkge1xuICAgICAgICAgICAgZGVzYy5tdXggPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZiTGluZXMgPSBwYXJzZXJzLmZpbmRMaW5lcygnYT1ydGNwLWZiOionLCBsaW5lcyk7XG4gICAgICAgIGZiTGluZXMuZm9yRWFjaChmdW5jdGlvbiAobGluZSkge1xuICAgICAgICAgICAgZGVzYy5mZWVkYmFjay5wdXNoKHBhcnNlcnMucnRjcGZiKGxpbmUpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIGV4dExpbmVzID0gcGFyc2Vycy5maW5kTGluZXMoJ2E9ZXh0bWFwOicsIGxpbmVzKTtcbiAgICAgICAgZXh0TGluZXMuZm9yRWFjaChmdW5jdGlvbiAobGluZSkge1xuICAgICAgICAgICAgdmFyIGV4dCA9IHBhcnNlcnMuZXh0bWFwKGxpbmUpO1xuXG4gICAgICAgICAgICBleHQuc2VuZGVycyA9IFNFTkRFUlNbcm9sZV1bZGlyZWN0aW9uXVtleHQuc2VuZGVyc107XG5cbiAgICAgICAgICAgIGRlc2MuaGVhZGVyRXh0ZW5zaW9ucy5wdXNoKGV4dCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBzc3JjR3JvdXBMaW5lcyA9IHBhcnNlcnMuZmluZExpbmVzKCdhPXNzcmMtZ3JvdXA6JywgbGluZXMpO1xuICAgICAgICBkZXNjLnNvdXJjZUdyb3VwcyA9IHBhcnNlcnMuc291cmNlR3JvdXBzKHNzcmNHcm91cExpbmVzIHx8IFtdKTtcblxuICAgICAgICB2YXIgc3NyY0xpbmVzID0gcGFyc2Vycy5maW5kTGluZXMoJ2E9c3NyYzonLCBsaW5lcyk7XG4gICAgICAgIHZhciBzb3VyY2VzID0gZGVzYy5zb3VyY2VzID0gcGFyc2Vycy5zb3VyY2VzKHNzcmNMaW5lcyB8fCBbXSk7XG5cbiAgICAgICAgdmFyIG1zaWRMaW5lID0gcGFyc2Vycy5maW5kTGluZSgnYT1tc2lkOicsIGxpbmVzKTtcbiAgICAgICAgaWYgKG1zaWRMaW5lKSB7XG4gICAgICAgICAgICB2YXIgbXNpZCA9IHBhcnNlcnMubXNpZChtc2lkTGluZSk7XG4gICAgICAgICAgICBbJ21zaWQnLCAnbXNsYWJlbCcsICdsYWJlbCddLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzb3VyY2VzW2ldLnBhcmFtZXRlcnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VzW2ldLnBhcmFtZXRlcnNbal0ua2V5ID09PSBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlc1tpXS5wYXJhbWV0ZXJzLnB1c2goeyBrZXk6IGtleSwgdmFsdWU6IG1zaWRba2V5XSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnNlcnMuZmluZExpbmUoJ2E9eC1nb29nbGUtZmxhZzpjb25mZXJlbmNlJywgbGluZXMsIHNlc3Npb25MaW5lcykpIHtcbiAgICAgICAgICAgIGRlc2MuZ29vZ0NvbmZlcmVuY2VGbGFnID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHRyYW5zcG9ydCBzcGVjaWZpYyBhdHRyaWJ1dGVzXG4gICAgdmFyIGZpbmdlcnByaW50TGluZXMgPSBwYXJzZXJzLmZpbmRMaW5lcygnYT1maW5nZXJwcmludDonLCBsaW5lcywgc2Vzc2lvbkxpbmVzKTtcbiAgICB2YXIgc2V0dXAgPSBwYXJzZXJzLmZpbmRMaW5lKCdhPXNldHVwOicsIGxpbmVzLCBzZXNzaW9uTGluZXMpO1xuICAgIGZpbmdlcnByaW50TGluZXMuZm9yRWFjaChmdW5jdGlvbiAobGluZSkge1xuICAgICAgICB2YXIgZnAgPSBwYXJzZXJzLmZpbmdlcnByaW50KGxpbmUpO1xuICAgICAgICBpZiAoc2V0dXApIHtcbiAgICAgICAgICAgIGZwLnNldHVwID0gc2V0dXAuc3Vic3RyKDgpO1xuICAgICAgICB9XG4gICAgICAgIHRyYW5zLmZpbmdlcnByaW50cy5wdXNoKGZwKTtcbiAgICB9KTtcblxuICAgIHZhciB1ZnJhZ0xpbmUgPSBwYXJzZXJzLmZpbmRMaW5lKCdhPWljZS11ZnJhZzonLCBsaW5lcywgc2Vzc2lvbkxpbmVzKTtcbiAgICB2YXIgcHdkTGluZSA9IHBhcnNlcnMuZmluZExpbmUoJ2E9aWNlLXB3ZDonLCBsaW5lcywgc2Vzc2lvbkxpbmVzKTtcbiAgICBpZiAodWZyYWdMaW5lICYmIHB3ZExpbmUpIHtcbiAgICAgICAgdHJhbnMudWZyYWcgPSB1ZnJhZ0xpbmUuc3Vic3RyKDEyKTtcbiAgICAgICAgdHJhbnMucHdkID0gcHdkTGluZS5zdWJzdHIoMTApO1xuICAgICAgICB0cmFucy5jYW5kaWRhdGVzID0gW107XG5cbiAgICAgICAgdmFyIGNhbmRpZGF0ZUxpbmVzID0gcGFyc2Vycy5maW5kTGluZXMoJ2E9Y2FuZGlkYXRlOicsIGxpbmVzLCBzZXNzaW9uTGluZXMpO1xuICAgICAgICBjYW5kaWRhdGVMaW5lcy5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICAgICAgICB0cmFucy5jYW5kaWRhdGVzLnB1c2goZXhwb3J0cy50b0NhbmRpZGF0ZUpTT04obGluZSkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZGVzYy5hcHBsaWNhdGlvblR5cGUgPT0gJ2RhdGFjaGFubmVsJykge1xuICAgICAgICB2YXIgc2N0cG1hcExpbmVzID0gcGFyc2Vycy5maW5kTGluZXMoJ2E9c2N0cG1hcDonLCBsaW5lcyk7XG4gICAgICAgIHNjdHBtYXBMaW5lcy5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICAgICAgICB2YXIgc2N0cCA9IHBhcnNlcnMuc2N0cG1hcChsaW5lKTtcbiAgICAgICAgICAgIHRyYW5zLnNjdHAucHVzaChzY3RwKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG59O1xuXG5leHBvcnRzLnRvQ2FuZGlkYXRlSlNPTiA9IGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgdmFyIGNhbmRpZGF0ZSA9IHBhcnNlcnMuY2FuZGlkYXRlKGxpbmUuc3BsaXQoJ1xcclxcbicpWzBdKTtcbiAgICBjYW5kaWRhdGUuaWQgPSAoaWRDb3VudGVyKyspLnRvU3RyaW5nKDM2KS5zdWJzdHIoMCwgMTIpO1xuICAgIHJldHVybiBjYW5kaWRhdGU7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3NkcC1qaW5nbGUtanNvbi9saWIvdG9qc29uLmpzXG4vLyBtb2R1bGUgaWQgPSA0NzVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 476 */
/***/ function(module, exports) {

    eval("exports.lines = function (sdp) {\n    return sdp.split('\\r\\n').filter(function (line) {\n        return line.length > 0;\n    });\n};\n\nexports.findLine = function (prefix, mediaLines, sessionLines) {\n    var prefixLength = prefix.length;\n    for (var i = 0; i < mediaLines.length; i++) {\n        if (mediaLines[i].substr(0, prefixLength) === prefix) {\n            return mediaLines[i];\n        }\n    }\n    // Continue searching in parent session section\n    if (!sessionLines) {\n        return false;\n    }\n\n    for (var j = 0; j < sessionLines.length; j++) {\n        if (sessionLines[j].substr(0, prefixLength) === prefix) {\n            return sessionLines[j];\n        }\n    }\n\n    return false;\n};\n\nexports.findLines = function (prefix, mediaLines, sessionLines) {\n    var results = [];\n    var prefixLength = prefix.length;\n    for (var i = 0; i < mediaLines.length; i++) {\n        if (mediaLines[i].substr(0, prefixLength) === prefix) {\n            results.push(mediaLines[i]);\n        }\n    }\n    if (results.length || !sessionLines) {\n        return results;\n    }\n    for (var j = 0; j < sessionLines.length; j++) {\n        if (sessionLines[j].substr(0, prefixLength) === prefix) {\n            results.push(sessionLines[j]);\n        }\n    }\n    return results;\n};\n\nexports.mline = function (line) {\n    var parts = line.substr(2).split(' ');\n    var parsed = {\n        media: parts[0],\n        port: parts[1],\n        proto: parts[2],\n        formats: []\n    };\n    for (var i = 3; i < parts.length; i++) {\n        if (parts[i]) {\n            parsed.formats.push(parts[i]);\n        }\n    }\n    return parsed;\n};\n\nexports.rtpmap = function (line) {\n    var parts = line.substr(9).split(' ');\n    var parsed = {\n        id: parts.shift()\n    };\n\n    parts = parts[0].split('/');\n\n    parsed.name = parts[0];\n    parsed.clockrate = parts[1];\n    parsed.channels = parts.length == 3 ? parts[2] : '1';\n    return parsed;\n};\n\nexports.sctpmap = function (line) {\n    // based on -05 draft\n    var parts = line.substr(10).split(' ');\n    var parsed = {\n        number: parts.shift(),\n        protocol: parts.shift(),\n        streams: parts.shift()\n    };\n    return parsed;\n};\n\n\nexports.fmtp = function (line) {\n    var kv, key, value;\n    var parts = line.substr(line.indexOf(' ') + 1).split(';');\n    var parsed = [];\n    for (var i = 0; i < parts.length; i++) {\n        kv = parts[i].split('=');\n        key = kv[0].trim();\n        value = kv[1];\n        if (key && value) {\n            parsed.push({key: key, value: value});\n        } else if (key) {\n            parsed.push({key: '', value: key});\n        }\n    }\n    return parsed;\n};\n\nexports.crypto = function (line) {\n    var parts = line.substr(9).split(' ');\n    var parsed = {\n        tag: parts[0],\n        cipherSuite: parts[1],\n        keyParams: parts[2],\n        sessionParams: parts.slice(3).join(' ')\n    };\n    return parsed;\n};\n\nexports.fingerprint = function (line) {\n    var parts = line.substr(14).split(' ');\n    return {\n        hash: parts[0],\n        value: parts[1]\n    };\n};\n\nexports.extmap = function (line) {\n    var parts = line.substr(9).split(' ');\n    var parsed = {};\n\n    var idpart = parts.shift();\n    var sp = idpart.indexOf('/');\n    if (sp >= 0) {\n        parsed.id = idpart.substr(0, sp);\n        parsed.senders = idpart.substr(sp + 1);\n    } else {\n        parsed.id = idpart;\n        parsed.senders = 'sendrecv';\n    }\n\n    parsed.uri = parts.shift() || '';\n\n    return parsed;\n};\n\nexports.rtcpfb = function (line) {\n    var parts = line.substr(10).split(' ');\n    var parsed = {};\n    parsed.id = parts.shift();\n    parsed.type = parts.shift();\n    if (parsed.type === 'trr-int') {\n        parsed.value = parts.shift();\n    } else {\n        parsed.subtype = parts.shift() || '';\n    }\n    parsed.parameters = parts;\n    return parsed;\n};\n\nexports.candidate = function (line) {\n    var parts;\n    if (line.indexOf('a=candidate:') === 0) {\n        parts = line.substring(12).split(' ');\n    } else { // no a=candidate\n        parts = line.substring(10).split(' ');\n    }\n\n    var candidate = {\n        foundation: parts[0],\n        component: parts[1],\n        protocol: parts[2].toLowerCase(),\n        priority: parts[3],\n        ip: parts[4],\n        port: parts[5],\n        // skip parts[6] == 'typ'\n        type: parts[7],\n        generation: '0'\n    };\n\n    for (var i = 8; i < parts.length; i += 2) {\n        if (parts[i] === 'raddr') {\n            candidate.relAddr = parts[i + 1];\n        } else if (parts[i] === 'rport') {\n            candidate.relPort = parts[i + 1];\n        } else if (parts[i] === 'generation') {\n            candidate.generation = parts[i + 1];\n        } else if (parts[i] === 'tcptype') {\n            candidate.tcpType = parts[i + 1];\n        }\n    }\n\n    candidate.network = '1';\n\n    return candidate;\n};\n\nexports.sourceGroups = function (lines) {\n    var parsed = [];\n    for (var i = 0; i < lines.length; i++) {\n        var parts = lines[i].substr(13).split(' ');\n        parsed.push({\n            semantics: parts.shift(),\n            sources: parts\n        });\n    }\n    return parsed;\n};\n\nexports.sources = function (lines) {\n    // http://tools.ietf.org/html/rfc5576\n    var parsed = [];\n    var sources = {};\n    for (var i = 0; i < lines.length; i++) {\n        var parts = lines[i].substr(7).split(' ');\n        var ssrc = parts.shift();\n\n        if (!sources[ssrc]) {\n            var source = {\n                ssrc: ssrc,\n                parameters: []\n            };\n            parsed.push(source);\n\n            // Keep an index\n            sources[ssrc] = source;\n        }\n\n        parts = parts.join(' ').split(':');\n        var attribute = parts.shift();\n        var value = parts.join(':') || null;\n\n        sources[ssrc].parameters.push({\n            key: attribute,\n            value: value\n        });\n    }\n\n    return parsed;\n};\n\nexports.groups = function (lines) {\n    // http://tools.ietf.org/html/rfc5888\n    var parsed = [];\n    var parts;\n    for (var i = 0; i < lines.length; i++) {\n        parts = lines[i].substr(8).split(' ');\n        parsed.push({\n            semantics: parts.shift(),\n            contents: parts\n        });\n    }\n    return parsed;\n};\n\nexports.bandwidth = function (line) {\n    var parts = line.substr(2).split(':');\n    var parsed = {};\n    parsed.type = parts.shift();\n    parsed.bandwidth = parts.shift();\n    return parsed;\n};\n\nexports.msid = function (line) {\n    var data = line.substr(7);\n    var parts = data.split(' ');\n    return {\n        msid: data,\n        mslabel: parts[0],\n        label: parts[1]\n    };\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDc2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zZHAtamluZ2xlLWpzb24vbGliL3BhcnNlcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cy5saW5lcyA9IGZ1bmN0aW9uIChzZHApIHtcbiAgICByZXR1cm4gc2RwLnNwbGl0KCdcXHJcXG4nKS5maWx0ZXIoZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgICAgcmV0dXJuIGxpbmUubGVuZ3RoID4gMDtcbiAgICB9KTtcbn07XG5cbmV4cG9ydHMuZmluZExpbmUgPSBmdW5jdGlvbiAocHJlZml4LCBtZWRpYUxpbmVzLCBzZXNzaW9uTGluZXMpIHtcbiAgICB2YXIgcHJlZml4TGVuZ3RoID0gcHJlZml4Lmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1lZGlhTGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKG1lZGlhTGluZXNbaV0uc3Vic3RyKDAsIHByZWZpeExlbmd0aCkgPT09IHByZWZpeCkge1xuICAgICAgICAgICAgcmV0dXJuIG1lZGlhTGluZXNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQ29udGludWUgc2VhcmNoaW5nIGluIHBhcmVudCBzZXNzaW9uIHNlY3Rpb25cbiAgICBpZiAoIXNlc3Npb25MaW5lcykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZXNzaW9uTGluZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHNlc3Npb25MaW5lc1tqXS5zdWJzdHIoMCwgcHJlZml4TGVuZ3RoKSA9PT0gcHJlZml4KSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vzc2lvbkxpbmVzW2pdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuZXhwb3J0cy5maW5kTGluZXMgPSBmdW5jdGlvbiAocHJlZml4LCBtZWRpYUxpbmVzLCBzZXNzaW9uTGluZXMpIHtcbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgIHZhciBwcmVmaXhMZW5ndGggPSBwcmVmaXgubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVkaWFMaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAobWVkaWFMaW5lc1tpXS5zdWJzdHIoMCwgcHJlZml4TGVuZ3RoKSA9PT0gcHJlZml4KSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2gobWVkaWFMaW5lc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlc3VsdHMubGVuZ3RoIHx8ICFzZXNzaW9uTGluZXMpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2Vzc2lvbkxpbmVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChzZXNzaW9uTGluZXNbal0uc3Vic3RyKDAsIHByZWZpeExlbmd0aCkgPT09IHByZWZpeCkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHNlc3Npb25MaW5lc1tqXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG59O1xuXG5leHBvcnRzLm1saW5lID0gZnVuY3Rpb24gKGxpbmUpIHtcbiAgICB2YXIgcGFydHMgPSBsaW5lLnN1YnN0cigyKS5zcGxpdCgnICcpO1xuICAgIHZhciBwYXJzZWQgPSB7XG4gICAgICAgIG1lZGlhOiBwYXJ0c1swXSxcbiAgICAgICAgcG9ydDogcGFydHNbMV0sXG4gICAgICAgIHByb3RvOiBwYXJ0c1syXSxcbiAgICAgICAgZm9ybWF0czogW11cbiAgICB9O1xuICAgIGZvciAodmFyIGkgPSAzOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBhcnRzW2ldKSB7XG4gICAgICAgICAgICBwYXJzZWQuZm9ybWF0cy5wdXNoKHBhcnRzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkO1xufTtcblxuZXhwb3J0cy5ydHBtYXAgPSBmdW5jdGlvbiAobGluZSkge1xuICAgIHZhciBwYXJ0cyA9IGxpbmUuc3Vic3RyKDkpLnNwbGl0KCcgJyk7XG4gICAgdmFyIHBhcnNlZCA9IHtcbiAgICAgICAgaWQ6IHBhcnRzLnNoaWZ0KClcbiAgICB9O1xuXG4gICAgcGFydHMgPSBwYXJ0c1swXS5zcGxpdCgnLycpO1xuXG4gICAgcGFyc2VkLm5hbWUgPSBwYXJ0c1swXTtcbiAgICBwYXJzZWQuY2xvY2tyYXRlID0gcGFydHNbMV07XG4gICAgcGFyc2VkLmNoYW5uZWxzID0gcGFydHMubGVuZ3RoID09IDMgPyBwYXJ0c1syXSA6ICcxJztcbiAgICByZXR1cm4gcGFyc2VkO1xufTtcblxuZXhwb3J0cy5zY3RwbWFwID0gZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAvLyBiYXNlZCBvbiAtMDUgZHJhZnRcbiAgICB2YXIgcGFydHMgPSBsaW5lLnN1YnN0cigxMCkuc3BsaXQoJyAnKTtcbiAgICB2YXIgcGFyc2VkID0ge1xuICAgICAgICBudW1iZXI6IHBhcnRzLnNoaWZ0KCksXG4gICAgICAgIHByb3RvY29sOiBwYXJ0cy5zaGlmdCgpLFxuICAgICAgICBzdHJlYW1zOiBwYXJ0cy5zaGlmdCgpXG4gICAgfTtcbiAgICByZXR1cm4gcGFyc2VkO1xufTtcblxuXG5leHBvcnRzLmZtdHAgPSBmdW5jdGlvbiAobGluZSkge1xuICAgIHZhciBrdiwga2V5LCB2YWx1ZTtcbiAgICB2YXIgcGFydHMgPSBsaW5lLnN1YnN0cihsaW5lLmluZGV4T2YoJyAnKSArIDEpLnNwbGl0KCc7Jyk7XG4gICAgdmFyIHBhcnNlZCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAga3YgPSBwYXJ0c1tpXS5zcGxpdCgnPScpO1xuICAgICAgICBrZXkgPSBrdlswXS50cmltKCk7XG4gICAgICAgIHZhbHVlID0ga3ZbMV07XG4gICAgICAgIGlmIChrZXkgJiYgdmFsdWUpIHtcbiAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtrZXk6IGtleSwgdmFsdWU6IHZhbHVlfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5KSB7XG4gICAgICAgICAgICBwYXJzZWQucHVzaCh7a2V5OiAnJywgdmFsdWU6IGtleX0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJzZWQ7XG59O1xuXG5leHBvcnRzLmNyeXB0byA9IGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgdmFyIHBhcnRzID0gbGluZS5zdWJzdHIoOSkuc3BsaXQoJyAnKTtcbiAgICB2YXIgcGFyc2VkID0ge1xuICAgICAgICB0YWc6IHBhcnRzWzBdLFxuICAgICAgICBjaXBoZXJTdWl0ZTogcGFydHNbMV0sXG4gICAgICAgIGtleVBhcmFtczogcGFydHNbMl0sXG4gICAgICAgIHNlc3Npb25QYXJhbXM6IHBhcnRzLnNsaWNlKDMpLmpvaW4oJyAnKVxuICAgIH07XG4gICAgcmV0dXJuIHBhcnNlZDtcbn07XG5cbmV4cG9ydHMuZmluZ2VycHJpbnQgPSBmdW5jdGlvbiAobGluZSkge1xuICAgIHZhciBwYXJ0cyA9IGxpbmUuc3Vic3RyKDE0KS5zcGxpdCgnICcpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGhhc2g6IHBhcnRzWzBdLFxuICAgICAgICB2YWx1ZTogcGFydHNbMV1cbiAgICB9O1xufTtcblxuZXhwb3J0cy5leHRtYXAgPSBmdW5jdGlvbiAobGluZSkge1xuICAgIHZhciBwYXJ0cyA9IGxpbmUuc3Vic3RyKDkpLnNwbGl0KCcgJyk7XG4gICAgdmFyIHBhcnNlZCA9IHt9O1xuXG4gICAgdmFyIGlkcGFydCA9IHBhcnRzLnNoaWZ0KCk7XG4gICAgdmFyIHNwID0gaWRwYXJ0LmluZGV4T2YoJy8nKTtcbiAgICBpZiAoc3AgPj0gMCkge1xuICAgICAgICBwYXJzZWQuaWQgPSBpZHBhcnQuc3Vic3RyKDAsIHNwKTtcbiAgICAgICAgcGFyc2VkLnNlbmRlcnMgPSBpZHBhcnQuc3Vic3RyKHNwICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VkLmlkID0gaWRwYXJ0O1xuICAgICAgICBwYXJzZWQuc2VuZGVycyA9ICdzZW5kcmVjdic7XG4gICAgfVxuXG4gICAgcGFyc2VkLnVyaSA9IHBhcnRzLnNoaWZ0KCkgfHwgJyc7XG5cbiAgICByZXR1cm4gcGFyc2VkO1xufTtcblxuZXhwb3J0cy5ydGNwZmIgPSBmdW5jdGlvbiAobGluZSkge1xuICAgIHZhciBwYXJ0cyA9IGxpbmUuc3Vic3RyKDEwKS5zcGxpdCgnICcpO1xuICAgIHZhciBwYXJzZWQgPSB7fTtcbiAgICBwYXJzZWQuaWQgPSBwYXJ0cy5zaGlmdCgpO1xuICAgIHBhcnNlZC50eXBlID0gcGFydHMuc2hpZnQoKTtcbiAgICBpZiAocGFyc2VkLnR5cGUgPT09ICd0cnItaW50Jykge1xuICAgICAgICBwYXJzZWQudmFsdWUgPSBwYXJ0cy5zaGlmdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlZC5zdWJ0eXBlID0gcGFydHMuc2hpZnQoKSB8fCAnJztcbiAgICB9XG4gICAgcGFyc2VkLnBhcmFtZXRlcnMgPSBwYXJ0cztcbiAgICByZXR1cm4gcGFyc2VkO1xufTtcblxuZXhwb3J0cy5jYW5kaWRhdGUgPSBmdW5jdGlvbiAobGluZSkge1xuICAgIHZhciBwYXJ0cztcbiAgICBpZiAobGluZS5pbmRleE9mKCdhPWNhbmRpZGF0ZTonKSA9PT0gMCkge1xuICAgICAgICBwYXJ0cyA9IGxpbmUuc3Vic3RyaW5nKDEyKS5zcGxpdCgnICcpO1xuICAgIH0gZWxzZSB7IC8vIG5vIGE9Y2FuZGlkYXRlXG4gICAgICAgIHBhcnRzID0gbGluZS5zdWJzdHJpbmcoMTApLnNwbGl0KCcgJyk7XG4gICAgfVxuXG4gICAgdmFyIGNhbmRpZGF0ZSA9IHtcbiAgICAgICAgZm91bmRhdGlvbjogcGFydHNbMF0sXG4gICAgICAgIGNvbXBvbmVudDogcGFydHNbMV0sXG4gICAgICAgIHByb3RvY29sOiBwYXJ0c1syXS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICBwcmlvcml0eTogcGFydHNbM10sXG4gICAgICAgIGlwOiBwYXJ0c1s0XSxcbiAgICAgICAgcG9ydDogcGFydHNbNV0sXG4gICAgICAgIC8vIHNraXAgcGFydHNbNl0gPT0gJ3R5cCdcbiAgICAgICAgdHlwZTogcGFydHNbN10sXG4gICAgICAgIGdlbmVyYXRpb246ICcwJ1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBpID0gODsgaSA8IHBhcnRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIGlmIChwYXJ0c1tpXSA9PT0gJ3JhZGRyJykge1xuICAgICAgICAgICAgY2FuZGlkYXRlLnJlbEFkZHIgPSBwYXJ0c1tpICsgMV07XG4gICAgICAgIH0gZWxzZSBpZiAocGFydHNbaV0gPT09ICdycG9ydCcpIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZS5yZWxQb3J0ID0gcGFydHNbaSArIDFdO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcnRzW2ldID09PSAnZ2VuZXJhdGlvbicpIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZS5nZW5lcmF0aW9uID0gcGFydHNbaSArIDFdO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcnRzW2ldID09PSAndGNwdHlwZScpIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZS50Y3BUeXBlID0gcGFydHNbaSArIDFdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2FuZGlkYXRlLm5ldHdvcmsgPSAnMSc7XG5cbiAgICByZXR1cm4gY2FuZGlkYXRlO1xufTtcblxuZXhwb3J0cy5zb3VyY2VHcm91cHMgPSBmdW5jdGlvbiAobGluZXMpIHtcbiAgICB2YXIgcGFyc2VkID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcGFydHMgPSBsaW5lc1tpXS5zdWJzdHIoMTMpLnNwbGl0KCcgJyk7XG4gICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgIHNlbWFudGljczogcGFydHMuc2hpZnQoKSxcbiAgICAgICAgICAgIHNvdXJjZXM6IHBhcnRzXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkO1xufTtcblxuZXhwb3J0cy5zb3VyY2VzID0gZnVuY3Rpb24gKGxpbmVzKSB7XG4gICAgLy8gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTU3NlxuICAgIHZhciBwYXJzZWQgPSBbXTtcbiAgICB2YXIgc291cmNlcyA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHBhcnRzID0gbGluZXNbaV0uc3Vic3RyKDcpLnNwbGl0KCcgJyk7XG4gICAgICAgIHZhciBzc3JjID0gcGFydHMuc2hpZnQoKTtcblxuICAgICAgICBpZiAoIXNvdXJjZXNbc3NyY10pIHtcbiAgICAgICAgICAgIHZhciBzb3VyY2UgPSB7XG4gICAgICAgICAgICAgICAgc3NyYzogc3NyYyxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHBhcnNlZC5wdXNoKHNvdXJjZSk7XG5cbiAgICAgICAgICAgIC8vIEtlZXAgYW4gaW5kZXhcbiAgICAgICAgICAgIHNvdXJjZXNbc3NyY10gPSBzb3VyY2U7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJ0cyA9IHBhcnRzLmpvaW4oJyAnKS5zcGxpdCgnOicpO1xuICAgICAgICB2YXIgYXR0cmlidXRlID0gcGFydHMuc2hpZnQoKTtcbiAgICAgICAgdmFyIHZhbHVlID0gcGFydHMuam9pbignOicpIHx8IG51bGw7XG5cbiAgICAgICAgc291cmNlc1tzc3JjXS5wYXJhbWV0ZXJzLnB1c2goe1xuICAgICAgICAgICAga2V5OiBhdHRyaWJ1dGUsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlZDtcbn07XG5cbmV4cG9ydHMuZ3JvdXBzID0gZnVuY3Rpb24gKGxpbmVzKSB7XG4gICAgLy8gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTg4OFxuICAgIHZhciBwYXJzZWQgPSBbXTtcbiAgICB2YXIgcGFydHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwYXJ0cyA9IGxpbmVzW2ldLnN1YnN0cig4KS5zcGxpdCgnICcpO1xuICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICBzZW1hbnRpY3M6IHBhcnRzLnNoaWZ0KCksXG4gICAgICAgICAgICBjb250ZW50czogcGFydHNcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZWQ7XG59O1xuXG5leHBvcnRzLmJhbmR3aWR0aCA9IGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgdmFyIHBhcnRzID0gbGluZS5zdWJzdHIoMikuc3BsaXQoJzonKTtcbiAgICB2YXIgcGFyc2VkID0ge307XG4gICAgcGFyc2VkLnR5cGUgPSBwYXJ0cy5zaGlmdCgpO1xuICAgIHBhcnNlZC5iYW5kd2lkdGggPSBwYXJ0cy5zaGlmdCgpO1xuICAgIHJldHVybiBwYXJzZWQ7XG59O1xuXG5leHBvcnRzLm1zaWQgPSBmdW5jdGlvbiAobGluZSkge1xuICAgIHZhciBkYXRhID0gbGluZS5zdWJzdHIoNyk7XG4gICAgdmFyIHBhcnRzID0gZGF0YS5zcGxpdCgnICcpO1xuICAgIHJldHVybiB7XG4gICAgICAgIG1zaWQ6IGRhdGEsXG4gICAgICAgIG1zbGFiZWw6IHBhcnRzWzBdLFxuICAgICAgICBsYWJlbDogcGFydHNbMV1cbiAgICB9O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9zZHAtamluZ2xlLWpzb24vbGliL3BhcnNlcnMuanNcbi8vIG1vZHVsZSBpZCA9IDQ3NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 477 */
/***/ function(module, exports, __webpack_require__) {

    eval("// based on https://github.com/ESTOS/strophe.jingle/\n// adds wildemitter support\nvar util = __webpack_require__(438);\nvar adapter = __webpack_require__(478); // jshint ignore:line\nvar WildEmitter = __webpack_require__(445);\n\nfunction dumpSDP(description) {\n    return {\n        type: description.type,\n        sdp: description.sdp\n    };\n}\n\nfunction dumpStream(stream) {\n    var info = {\n        label: stream.id,\n    };\n    if (stream.getAudioTracks().length) {\n        info.audio = stream.getAudioTracks().map(function (track) {\n            return track.id;\n        });\n    }\n    if (stream.getVideoTracks().length) {\n        info.video = stream.getVideoTracks().map(function (track) {\n            return track.id;\n        });\n    }\n    return info;\n}\n\nfunction TraceablePeerConnection(config, constraints) {\n    var self = this;\n    WildEmitter.call(this);\n\n    this.peerconnection = new window.RTCPeerConnection(config, constraints);\n\n    this.trace = function (what, info) {\n        self.emit('PeerConnectionTrace', {\n            time: new Date(),\n            type: what,\n            value: info || \"\"\n        });\n    };\n\n    this.onicecandidate = null;\n    this.peerconnection.onicecandidate = function (event) {\n        self.trace('onicecandidate', event.candidate);\n        if (self.onicecandidate !== null) {\n            self.onicecandidate(event);\n        }\n    };\n    this.onaddstream = null;\n    this.peerconnection.onaddstream = function (event) {\n        self.trace('onaddstream', dumpStream(event.stream));\n        if (self.onaddstream !== null) {\n            self.onaddstream(event);\n        }\n    };\n    this.onremovestream = null;\n    this.peerconnection.onremovestream = function (event) {\n        self.trace('onremovestream', dumpStream(event.stream));\n        if (self.onremovestream !== null) {\n            self.onremovestream(event);\n        }\n    };\n    this.onsignalingstatechange = null;\n    this.peerconnection.onsignalingstatechange = function (event) {\n        self.trace('onsignalingstatechange', self.signalingState);\n        if (self.onsignalingstatechange !== null) {\n            self.onsignalingstatechange(event);\n        }\n    };\n    this.oniceconnectionstatechange = null;\n    this.peerconnection.oniceconnectionstatechange = function (event) {\n        self.trace('oniceconnectionstatechange', self.iceConnectionState);\n        if (self.oniceconnectionstatechange !== null) {\n            self.oniceconnectionstatechange(event);\n        }\n    };\n    this.onnegotiationneeded = null;\n    this.peerconnection.onnegotiationneeded = function (event) {\n        self.trace('onnegotiationneeded');\n        if (self.onnegotiationneeded !== null) {\n            self.onnegotiationneeded(event);\n        }\n    };\n    self.ondatachannel = null;\n    this.peerconnection.ondatachannel = function (event) {\n        self.trace('ondatachannel', event);\n        if (self.ondatachannel !== null) {\n            self.ondatachannel(event);\n        }\n    };\n    this.getLocalStreams = this.peerconnection.getLocalStreams.bind(this.peerconnection);\n    this.getRemoteStreams = this.peerconnection.getRemoteStreams.bind(this.peerconnection);\n}\n\nutil.inherits(TraceablePeerConnection, WildEmitter);\n\n['signalingState', 'iceConnectionState', 'localDescription', 'remoteDescription'].forEach(function (prop) {\n    Object.defineProperty(TraceablePeerConnection.prototype, prop, {\n        get: function () {\n            return this.peerconnection[prop];\n        }\n    });\n});\n\nTraceablePeerConnection.prototype.addStream = function (stream) {\n    this.trace('addStream', dumpStream(stream));\n    this.peerconnection.addStream(stream);\n};\n\nTraceablePeerConnection.prototype.removeStream = function (stream) {\n    this.trace('removeStream', dumpStream(stream));\n    this.peerconnection.removeStream(stream);\n};\n\nTraceablePeerConnection.prototype.createDataChannel = function (label, opts) {\n    this.trace('createDataChannel', label, opts);\n    return this.peerconnection.createDataChannel(label, opts);\n};\n\nTraceablePeerConnection.prototype.setLocalDescription = function (description, successCallback, failureCallback) {\n    var self = this;\n    this.trace('setLocalDescription', dumpSDP(description));\n    return this.peerconnection.setLocalDescription(\n        description\n    ).then(\n        function () {\n            self.trace('setLocalDescriptionOnSuccess');\n            if (successCallback) successCallback();\n        },\n        function (err) {\n            self.trace('setLocalDescriptionOnFailure', err);\n            if (failureCallback) failureCallback(err);\n        }\n    );\n};\n\nTraceablePeerConnection.prototype.setRemoteDescription = function (description, successCallback, failureCallback) {\n    var self = this;\n    this.trace('setRemoteDescription', dumpSDP(description));\n    return this.peerconnection.setRemoteDescription(\n        description\n    ).then(\n        function () {\n            self.trace('setRemoteDescriptionOnSuccess');\n            if (successCallback) successCallback();\n        },\n        function (err) {\n            self.trace('setRemoteDescriptionOnFailure', err);\n            if (failureCallback) failureCallback(err);\n        }\n    );\n};\n\nTraceablePeerConnection.prototype.close = function () {\n    this.trace('stop');\n    if (this.peerconnection.signalingState != 'closed') {\n        this.peerconnection.close();\n    }\n};\n\nTraceablePeerConnection.prototype.createOffer = function (successCallback, failureCallback, constraints) {\n    var self = this;\n    this.trace('createOffer', constraints);\n    return this.peerconnection.createOffer(\n        constraints\n    ).then(\n        function (offer) {\n            self.trace('createOfferOnSuccess', dumpSDP(offer));\n            if (successCallback) successCallback(offer);\n        },\n        function (err) {\n            self.trace('createOfferOnFailure', err);\n            if (failureCallback) failureCallback(err);\n        }\n    );\n};\n\nTraceablePeerConnection.prototype.createAnswer = function (successCallback, failureCallback, constraints) {\n    var self = this;\n    this.trace('createAnswer', constraints);\n    return this.peerconnection.createAnswer(\n        constraints\n    ).then(\n        function (answer) {\n            self.trace('createAnswerOnSuccess', dumpSDP(answer));\n            if (successCallback) successCallback(answer);\n        },\n        function (err) {\n            self.trace('createAnswerOnFailure', err);\n            if (failureCallback) failureCallback(err);\n        }\n    );\n};\n\nTraceablePeerConnection.prototype.addIceCandidate = function (candidate, successCallback, failureCallback) {\n    var self = this;\n    this.trace('addIceCandidate', candidate);\n    return this.peerconnection.addIceCandidate(\n        candidate\n    ).then(\n        function () {\n            //self.trace('addIceCandidateOnSuccess');\n            if (successCallback) successCallback();\n        },\n        function (err) {\n            self.trace('addIceCandidateOnFailure', err);\n            if (failureCallback) failureCallback(err);\n        }\n    );\n};\n\nTraceablePeerConnection.prototype.getStats = function () {\n    this.peerconnection.getStats.apply(this.peerconnection, arguments);\n};\n\nmodule.exports = TraceablePeerConnection;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDc3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy90cmFjZWFibGVwZWVyY29ubmVjdGlvbi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vRVNUT1Mvc3Ryb3BoZS5qaW5nbGUvXG4vLyBhZGRzIHdpbGRlbWl0dGVyIHN1cHBvcnRcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xudmFyIGFkYXB0ZXIgPSByZXF1aXJlKCd3ZWJydGMtYWRhcHRlcicpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbnZhciBXaWxkRW1pdHRlciA9IHJlcXVpcmUoJ3dpbGRlbWl0dGVyJyk7XG5cbmZ1bmN0aW9uIGR1bXBTRFAoZGVzY3JpcHRpb24pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBkZXNjcmlwdGlvbi50eXBlLFxuICAgICAgICBzZHA6IGRlc2NyaXB0aW9uLnNkcFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGR1bXBTdHJlYW0oc3RyZWFtKSB7XG4gICAgdmFyIGluZm8gPSB7XG4gICAgICAgIGxhYmVsOiBzdHJlYW0uaWQsXG4gICAgfTtcbiAgICBpZiAoc3RyZWFtLmdldEF1ZGlvVHJhY2tzKCkubGVuZ3RoKSB7XG4gICAgICAgIGluZm8uYXVkaW8gPSBzdHJlYW0uZ2V0QXVkaW9UcmFja3MoKS5tYXAoZnVuY3Rpb24gKHRyYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhY2suaWQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc3RyZWFtLmdldFZpZGVvVHJhY2tzKCkubGVuZ3RoKSB7XG4gICAgICAgIGluZm8udmlkZW8gPSBzdHJlYW0uZ2V0VmlkZW9UcmFja3MoKS5tYXAoZnVuY3Rpb24gKHRyYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhY2suaWQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gaW5mbztcbn1cblxuZnVuY3Rpb24gVHJhY2VhYmxlUGVlckNvbm5lY3Rpb24oY29uZmlnLCBjb25zdHJhaW50cykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBXaWxkRW1pdHRlci5jYWxsKHRoaXMpO1xuXG4gICAgdGhpcy5wZWVyY29ubmVjdGlvbiA9IG5ldyB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24oY29uZmlnLCBjb25zdHJhaW50cyk7XG5cbiAgICB0aGlzLnRyYWNlID0gZnVuY3Rpb24gKHdoYXQsIGluZm8pIHtcbiAgICAgICAgc2VsZi5lbWl0KCdQZWVyQ29ubmVjdGlvblRyYWNlJywge1xuICAgICAgICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIHR5cGU6IHdoYXQsXG4gICAgICAgICAgICB2YWx1ZTogaW5mbyB8fCBcIlwiXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICB0aGlzLm9uaWNlY2FuZGlkYXRlID0gbnVsbDtcbiAgICB0aGlzLnBlZXJjb25uZWN0aW9uLm9uaWNlY2FuZGlkYXRlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHNlbGYudHJhY2UoJ29uaWNlY2FuZGlkYXRlJywgZXZlbnQuY2FuZGlkYXRlKTtcbiAgICAgICAgaWYgKHNlbGYub25pY2VjYW5kaWRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHNlbGYub25pY2VjYW5kaWRhdGUoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB0aGlzLm9uYWRkc3RyZWFtID0gbnVsbDtcbiAgICB0aGlzLnBlZXJjb25uZWN0aW9uLm9uYWRkc3RyZWFtID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHNlbGYudHJhY2UoJ29uYWRkc3RyZWFtJywgZHVtcFN0cmVhbShldmVudC5zdHJlYW0pKTtcbiAgICAgICAgaWYgKHNlbGYub25hZGRzdHJlYW0gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHNlbGYub25hZGRzdHJlYW0oZXZlbnQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB0aGlzLm9ucmVtb3Zlc3RyZWFtID0gbnVsbDtcbiAgICB0aGlzLnBlZXJjb25uZWN0aW9uLm9ucmVtb3Zlc3RyZWFtID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHNlbGYudHJhY2UoJ29ucmVtb3Zlc3RyZWFtJywgZHVtcFN0cmVhbShldmVudC5zdHJlYW0pKTtcbiAgICAgICAgaWYgKHNlbGYub25yZW1vdmVzdHJlYW0gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHNlbGYub25yZW1vdmVzdHJlYW0oZXZlbnQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB0aGlzLm9uc2lnbmFsaW5nc3RhdGVjaGFuZ2UgPSBudWxsO1xuICAgIHRoaXMucGVlcmNvbm5lY3Rpb24ub25zaWduYWxpbmdzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBzZWxmLnRyYWNlKCdvbnNpZ25hbGluZ3N0YXRlY2hhbmdlJywgc2VsZi5zaWduYWxpbmdTdGF0ZSk7XG4gICAgICAgIGlmIChzZWxmLm9uc2lnbmFsaW5nc3RhdGVjaGFuZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHNlbGYub25zaWduYWxpbmdzdGF0ZWNoYW5nZShldmVudCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub25pY2Vjb25uZWN0aW9uc3RhdGVjaGFuZ2UgPSBudWxsO1xuICAgIHRoaXMucGVlcmNvbm5lY3Rpb24ub25pY2Vjb25uZWN0aW9uc3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgc2VsZi50cmFjZSgnb25pY2Vjb25uZWN0aW9uc3RhdGVjaGFuZ2UnLCBzZWxmLmljZUNvbm5lY3Rpb25TdGF0ZSk7XG4gICAgICAgIGlmIChzZWxmLm9uaWNlY29ubmVjdGlvbnN0YXRlY2hhbmdlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzZWxmLm9uaWNlY29ubmVjdGlvbnN0YXRlY2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5vbm5lZ290aWF0aW9ubmVlZGVkID0gbnVsbDtcbiAgICB0aGlzLnBlZXJjb25uZWN0aW9uLm9ubmVnb3RpYXRpb25uZWVkZWQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgc2VsZi50cmFjZSgnb25uZWdvdGlhdGlvbm5lZWRlZCcpO1xuICAgICAgICBpZiAoc2VsZi5vbm5lZ290aWF0aW9ubmVlZGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzZWxmLm9ubmVnb3RpYXRpb25uZWVkZWQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBzZWxmLm9uZGF0YWNoYW5uZWwgPSBudWxsO1xuICAgIHRoaXMucGVlcmNvbm5lY3Rpb24ub25kYXRhY2hhbm5lbCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBzZWxmLnRyYWNlKCdvbmRhdGFjaGFubmVsJywgZXZlbnQpO1xuICAgICAgICBpZiAoc2VsZi5vbmRhdGFjaGFubmVsICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzZWxmLm9uZGF0YWNoYW5uZWwoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmdldExvY2FsU3RyZWFtcyA9IHRoaXMucGVlcmNvbm5lY3Rpb24uZ2V0TG9jYWxTdHJlYW1zLmJpbmQodGhpcy5wZWVyY29ubmVjdGlvbik7XG4gICAgdGhpcy5nZXRSZW1vdGVTdHJlYW1zID0gdGhpcy5wZWVyY29ubmVjdGlvbi5nZXRSZW1vdGVTdHJlYW1zLmJpbmQodGhpcy5wZWVyY29ubmVjdGlvbik7XG59XG5cbnV0aWwuaW5oZXJpdHMoVHJhY2VhYmxlUGVlckNvbm5lY3Rpb24sIFdpbGRFbWl0dGVyKTtcblxuWydzaWduYWxpbmdTdGF0ZScsICdpY2VDb25uZWN0aW9uU3RhdGUnLCAnbG9jYWxEZXNjcmlwdGlvbicsICdyZW1vdGVEZXNjcmlwdGlvbiddLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVHJhY2VhYmxlUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLCBwcm9wLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGVlcmNvbm5lY3Rpb25bcHJvcF07XG4gICAgICAgIH1cbiAgICB9KTtcbn0pO1xuXG5UcmFjZWFibGVQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuYWRkU3RyZWFtID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICAgIHRoaXMudHJhY2UoJ2FkZFN0cmVhbScsIGR1bXBTdHJlYW0oc3RyZWFtKSk7XG4gICAgdGhpcy5wZWVyY29ubmVjdGlvbi5hZGRTdHJlYW0oc3RyZWFtKTtcbn07XG5cblRyYWNlYWJsZVBlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5yZW1vdmVTdHJlYW0gPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gICAgdGhpcy50cmFjZSgncmVtb3ZlU3RyZWFtJywgZHVtcFN0cmVhbShzdHJlYW0pKTtcbiAgICB0aGlzLnBlZXJjb25uZWN0aW9uLnJlbW92ZVN0cmVhbShzdHJlYW0pO1xufTtcblxuVHJhY2VhYmxlUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLmNyZWF0ZURhdGFDaGFubmVsID0gZnVuY3Rpb24gKGxhYmVsLCBvcHRzKSB7XG4gICAgdGhpcy50cmFjZSgnY3JlYXRlRGF0YUNoYW5uZWwnLCBsYWJlbCwgb3B0cyk7XG4gICAgcmV0dXJuIHRoaXMucGVlcmNvbm5lY3Rpb24uY3JlYXRlRGF0YUNoYW5uZWwobGFiZWwsIG9wdHMpO1xufTtcblxuVHJhY2VhYmxlUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLnNldExvY2FsRGVzY3JpcHRpb24gPSBmdW5jdGlvbiAoZGVzY3JpcHRpb24sIHN1Y2Nlc3NDYWxsYmFjaywgZmFpbHVyZUNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMudHJhY2UoJ3NldExvY2FsRGVzY3JpcHRpb24nLCBkdW1wU0RQKGRlc2NyaXB0aW9uKSk7XG4gICAgcmV0dXJuIHRoaXMucGVlcmNvbm5lY3Rpb24uc2V0TG9jYWxEZXNjcmlwdGlvbihcbiAgICAgICAgZGVzY3JpcHRpb25cbiAgICApLnRoZW4oXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNlbGYudHJhY2UoJ3NldExvY2FsRGVzY3JpcHRpb25PblN1Y2Nlc3MnKTtcbiAgICAgICAgICAgIGlmIChzdWNjZXNzQ2FsbGJhY2spIHN1Y2Nlc3NDYWxsYmFjaygpO1xuICAgICAgICB9LFxuICAgICAgICBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICBzZWxmLnRyYWNlKCdzZXRMb2NhbERlc2NyaXB0aW9uT25GYWlsdXJlJywgZXJyKTtcbiAgICAgICAgICAgIGlmIChmYWlsdXJlQ2FsbGJhY2spIGZhaWx1cmVDYWxsYmFjayhlcnIpO1xuICAgICAgICB9XG4gICAgKTtcbn07XG5cblRyYWNlYWJsZVBlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5zZXRSZW1vdGVEZXNjcmlwdGlvbiA9IGZ1bmN0aW9uIChkZXNjcmlwdGlvbiwgc3VjY2Vzc0NhbGxiYWNrLCBmYWlsdXJlQ2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy50cmFjZSgnc2V0UmVtb3RlRGVzY3JpcHRpb24nLCBkdW1wU0RQKGRlc2NyaXB0aW9uKSk7XG4gICAgcmV0dXJuIHRoaXMucGVlcmNvbm5lY3Rpb24uc2V0UmVtb3RlRGVzY3JpcHRpb24oXG4gICAgICAgIGRlc2NyaXB0aW9uXG4gICAgKS50aGVuKFxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLnRyYWNlKCdzZXRSZW1vdGVEZXNjcmlwdGlvbk9uU3VjY2VzcycpO1xuICAgICAgICAgICAgaWYgKHN1Y2Nlc3NDYWxsYmFjaykgc3VjY2Vzc0NhbGxiYWNrKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgIHNlbGYudHJhY2UoJ3NldFJlbW90ZURlc2NyaXB0aW9uT25GYWlsdXJlJywgZXJyKTtcbiAgICAgICAgICAgIGlmIChmYWlsdXJlQ2FsbGJhY2spIGZhaWx1cmVDYWxsYmFjayhlcnIpO1xuICAgICAgICB9XG4gICAgKTtcbn07XG5cblRyYWNlYWJsZVBlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnRyYWNlKCdzdG9wJyk7XG4gICAgaWYgKHRoaXMucGVlcmNvbm5lY3Rpb24uc2lnbmFsaW5nU3RhdGUgIT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgdGhpcy5wZWVyY29ubmVjdGlvbi5jbG9zZSgpO1xuICAgIH1cbn07XG5cblRyYWNlYWJsZVBlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVPZmZlciA9IGZ1bmN0aW9uIChzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjaywgY29uc3RyYWludHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy50cmFjZSgnY3JlYXRlT2ZmZXInLCBjb25zdHJhaW50cyk7XG4gICAgcmV0dXJuIHRoaXMucGVlcmNvbm5lY3Rpb24uY3JlYXRlT2ZmZXIoXG4gICAgICAgIGNvbnN0cmFpbnRzXG4gICAgKS50aGVuKFxuICAgICAgICBmdW5jdGlvbiAob2ZmZXIpIHtcbiAgICAgICAgICAgIHNlbGYudHJhY2UoJ2NyZWF0ZU9mZmVyT25TdWNjZXNzJywgZHVtcFNEUChvZmZlcikpO1xuICAgICAgICAgICAgaWYgKHN1Y2Nlc3NDYWxsYmFjaykgc3VjY2Vzc0NhbGxiYWNrKG9mZmVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgc2VsZi50cmFjZSgnY3JlYXRlT2ZmZXJPbkZhaWx1cmUnLCBlcnIpO1xuICAgICAgICAgICAgaWYgKGZhaWx1cmVDYWxsYmFjaykgZmFpbHVyZUNhbGxiYWNrKGVycik7XG4gICAgICAgIH1cbiAgICApO1xufTtcblxuVHJhY2VhYmxlUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLmNyZWF0ZUFuc3dlciA9IGZ1bmN0aW9uIChzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjaywgY29uc3RyYWludHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy50cmFjZSgnY3JlYXRlQW5zd2VyJywgY29uc3RyYWludHMpO1xuICAgIHJldHVybiB0aGlzLnBlZXJjb25uZWN0aW9uLmNyZWF0ZUFuc3dlcihcbiAgICAgICAgY29uc3RyYWludHNcbiAgICApLnRoZW4oXG4gICAgICAgIGZ1bmN0aW9uIChhbnN3ZXIpIHtcbiAgICAgICAgICAgIHNlbGYudHJhY2UoJ2NyZWF0ZUFuc3dlck9uU3VjY2VzcycsIGR1bXBTRFAoYW5zd2VyKSk7XG4gICAgICAgICAgICBpZiAoc3VjY2Vzc0NhbGxiYWNrKSBzdWNjZXNzQ2FsbGJhY2soYW5zd2VyKTtcbiAgICAgICAgfSxcbiAgICAgICAgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgc2VsZi50cmFjZSgnY3JlYXRlQW5zd2VyT25GYWlsdXJlJywgZXJyKTtcbiAgICAgICAgICAgIGlmIChmYWlsdXJlQ2FsbGJhY2spIGZhaWx1cmVDYWxsYmFjayhlcnIpO1xuICAgICAgICB9XG4gICAgKTtcbn07XG5cblRyYWNlYWJsZVBlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5hZGRJY2VDYW5kaWRhdGUgPSBmdW5jdGlvbiAoY2FuZGlkYXRlLCBzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnRyYWNlKCdhZGRJY2VDYW5kaWRhdGUnLCBjYW5kaWRhdGUpO1xuICAgIHJldHVybiB0aGlzLnBlZXJjb25uZWN0aW9uLmFkZEljZUNhbmRpZGF0ZShcbiAgICAgICAgY2FuZGlkYXRlXG4gICAgKS50aGVuKFxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvL3NlbGYudHJhY2UoJ2FkZEljZUNhbmRpZGF0ZU9uU3VjY2VzcycpO1xuICAgICAgICAgICAgaWYgKHN1Y2Nlc3NDYWxsYmFjaykgc3VjY2Vzc0NhbGxiYWNrKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgIHNlbGYudHJhY2UoJ2FkZEljZUNhbmRpZGF0ZU9uRmFpbHVyZScsIGVycik7XG4gICAgICAgICAgICBpZiAoZmFpbHVyZUNhbGxiYWNrKSBmYWlsdXJlQ2FsbGJhY2soZXJyKTtcbiAgICAgICAgfVxuICAgICk7XG59O1xuXG5UcmFjZWFibGVQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuZ2V0U3RhdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5wZWVyY29ubmVjdGlvbi5nZXRTdGF0cy5hcHBseSh0aGlzLnBlZXJjb25uZWN0aW9uLCBhcmd1bWVudHMpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBUcmFjZWFibGVQZWVyQ29ubmVjdGlvbjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi90cmFjZWFibGVwZWVyY29ubmVjdGlvbi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNDc3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 478 */
/***/ function(module, exports, __webpack_require__) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n\n'use strict';\n\n// Shimming starts here.\n(function() {\n  // Utils.\n  var logging = __webpack_require__(479).log;\n  var browserDetails = __webpack_require__(479).browserDetails;\n  // Export to the adapter global object visible in the browser.\n  module.exports.browserDetails = browserDetails;\n  module.exports.extractVersion = __webpack_require__(479).extractVersion;\n  module.exports.disableLog = __webpack_require__(479).disableLog;\n\n  // Uncomment the line below if you want logging to occur, including logging\n  // for the switch statement below. Can also be turned on in the browser via\n  // adapter.disableLog(false), but then logging from the switch statement below\n  // will not appear.\n  // require('./utils').disableLog(false);\n\n  // Browser shims.\n  var chromeShim = __webpack_require__(480) || null;\n  var edgeShim = __webpack_require__(482) || null;\n  var firefoxShim = __webpack_require__(484) || null;\n  var safariShim = __webpack_require__(486) || null;\n\n  // Shim browser if found.\n  switch (browserDetails.browser) {\n    case 'opera': // fallthrough as it uses chrome shims\n    case 'chrome':\n      if (!chromeShim || !chromeShim.shimPeerConnection) {\n        logging('Chrome shim is not included in this adapter release.');\n        return;\n      }\n      logging('adapter.js shimming chrome.');\n      // Export to the adapter global object visible in the browser.\n      module.exports.browserShim = chromeShim;\n\n      chromeShim.shimGetUserMedia();\n      chromeShim.shimMediaStream();\n      chromeShim.shimSourceObject();\n      chromeShim.shimPeerConnection();\n      chromeShim.shimOnTrack();\n      break;\n    case 'firefox':\n      if (!firefoxShim || !firefoxShim.shimPeerConnection) {\n        logging('Firefox shim is not included in this adapter release.');\n        return;\n      }\n      logging('adapter.js shimming firefox.');\n      // Export to the adapter global object visible in the browser.\n      module.exports.browserShim = firefoxShim;\n\n      firefoxShim.shimGetUserMedia();\n      firefoxShim.shimSourceObject();\n      firefoxShim.shimPeerConnection();\n      firefoxShim.shimOnTrack();\n      break;\n    case 'edge':\n      if (!edgeShim || !edgeShim.shimPeerConnection) {\n        logging('MS edge shim is not included in this adapter release.');\n        return;\n      }\n      logging('adapter.js shimming edge.');\n      // Export to the adapter global object visible in the browser.\n      module.exports.browserShim = edgeShim;\n\n      edgeShim.shimGetUserMedia();\n      edgeShim.shimPeerConnection();\n      break;\n    case 'safari':\n      if (!safariShim) {\n        logging('Safari shim is not included in this adapter release.');\n        return;\n      }\n      logging('adapter.js shimming safari.');\n      // Export to the adapter global object visible in the browser.\n      module.exports.browserShim = safariShim;\n\n      safariShim.shimGetUserMedia();\n      break;\n    default:\n      logging('Unsupported browser!');\n  }\n})();\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDc4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy90cmFjZWFibGVwZWVyY29ubmVjdGlvbi9ub2RlX21vZHVsZXMvd2VicnRjLWFkYXB0ZXIvc3JjL2pzL2FkYXB0ZXJfY29yZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogIENvcHlyaWdodCAoYykgMjAxNiBUaGUgV2ViUlRDIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZVxuICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZVxuICogIHRyZWUuXG4gKi9cbiAvKiBlc2xpbnQtZW52IG5vZGUgKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vLyBTaGltbWluZyBzdGFydHMgaGVyZS5cbihmdW5jdGlvbigpIHtcbiAgLy8gVXRpbHMuXG4gIHZhciBsb2dnaW5nID0gcmVxdWlyZSgnLi91dGlscycpLmxvZztcbiAgdmFyIGJyb3dzZXJEZXRhaWxzID0gcmVxdWlyZSgnLi91dGlscycpLmJyb3dzZXJEZXRhaWxzO1xuICAvLyBFeHBvcnQgdG8gdGhlIGFkYXB0ZXIgZ2xvYmFsIG9iamVjdCB2aXNpYmxlIGluIHRoZSBicm93c2VyLlxuICBtb2R1bGUuZXhwb3J0cy5icm93c2VyRGV0YWlscyA9IGJyb3dzZXJEZXRhaWxzO1xuICBtb2R1bGUuZXhwb3J0cy5leHRyYWN0VmVyc2lvbiA9IHJlcXVpcmUoJy4vdXRpbHMnKS5leHRyYWN0VmVyc2lvbjtcbiAgbW9kdWxlLmV4cG9ydHMuZGlzYWJsZUxvZyA9IHJlcXVpcmUoJy4vdXRpbHMnKS5kaXNhYmxlTG9nO1xuXG4gIC8vIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyBpZiB5b3Ugd2FudCBsb2dnaW5nIHRvIG9jY3VyLCBpbmNsdWRpbmcgbG9nZ2luZ1xuICAvLyBmb3IgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgYmVsb3cuIENhbiBhbHNvIGJlIHR1cm5lZCBvbiBpbiB0aGUgYnJvd3NlciB2aWFcbiAgLy8gYWRhcHRlci5kaXNhYmxlTG9nKGZhbHNlKSwgYnV0IHRoZW4gbG9nZ2luZyBmcm9tIHRoZSBzd2l0Y2ggc3RhdGVtZW50IGJlbG93XG4gIC8vIHdpbGwgbm90IGFwcGVhci5cbiAgLy8gcmVxdWlyZSgnLi91dGlscycpLmRpc2FibGVMb2coZmFsc2UpO1xuXG4gIC8vIEJyb3dzZXIgc2hpbXMuXG4gIHZhciBjaHJvbWVTaGltID0gcmVxdWlyZSgnLi9jaHJvbWUvY2hyb21lX3NoaW0nKSB8fCBudWxsO1xuICB2YXIgZWRnZVNoaW0gPSByZXF1aXJlKCcuL2VkZ2UvZWRnZV9zaGltJykgfHwgbnVsbDtcbiAgdmFyIGZpcmVmb3hTaGltID0gcmVxdWlyZSgnLi9maXJlZm94L2ZpcmVmb3hfc2hpbScpIHx8IG51bGw7XG4gIHZhciBzYWZhcmlTaGltID0gcmVxdWlyZSgnLi9zYWZhcmkvc2FmYXJpX3NoaW0nKSB8fCBudWxsO1xuXG4gIC8vIFNoaW0gYnJvd3NlciBpZiBmb3VuZC5cbiAgc3dpdGNoIChicm93c2VyRGV0YWlscy5icm93c2VyKSB7XG4gICAgY2FzZSAnb3BlcmEnOiAvLyBmYWxsdGhyb3VnaCBhcyBpdCB1c2VzIGNocm9tZSBzaGltc1xuICAgIGNhc2UgJ2Nocm9tZSc6XG4gICAgICBpZiAoIWNocm9tZVNoaW0gfHwgIWNocm9tZVNoaW0uc2hpbVBlZXJDb25uZWN0aW9uKSB7XG4gICAgICAgIGxvZ2dpbmcoJ0Nocm9tZSBzaGltIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGlzIGFkYXB0ZXIgcmVsZWFzZS4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbG9nZ2luZygnYWRhcHRlci5qcyBzaGltbWluZyBjaHJvbWUuJyk7XG4gICAgICAvLyBFeHBvcnQgdG8gdGhlIGFkYXB0ZXIgZ2xvYmFsIG9iamVjdCB2aXNpYmxlIGluIHRoZSBicm93c2VyLlxuICAgICAgbW9kdWxlLmV4cG9ydHMuYnJvd3NlclNoaW0gPSBjaHJvbWVTaGltO1xuXG4gICAgICBjaHJvbWVTaGltLnNoaW1HZXRVc2VyTWVkaWEoKTtcbiAgICAgIGNocm9tZVNoaW0uc2hpbU1lZGlhU3RyZWFtKCk7XG4gICAgICBjaHJvbWVTaGltLnNoaW1Tb3VyY2VPYmplY3QoKTtcbiAgICAgIGNocm9tZVNoaW0uc2hpbVBlZXJDb25uZWN0aW9uKCk7XG4gICAgICBjaHJvbWVTaGltLnNoaW1PblRyYWNrKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdmaXJlZm94JzpcbiAgICAgIGlmICghZmlyZWZveFNoaW0gfHwgIWZpcmVmb3hTaGltLnNoaW1QZWVyQ29ubmVjdGlvbikge1xuICAgICAgICBsb2dnaW5nKCdGaXJlZm94IHNoaW0gaXMgbm90IGluY2x1ZGVkIGluIHRoaXMgYWRhcHRlciByZWxlYXNlLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2dnaW5nKCdhZGFwdGVyLmpzIHNoaW1taW5nIGZpcmVmb3guJyk7XG4gICAgICAvLyBFeHBvcnQgdG8gdGhlIGFkYXB0ZXIgZ2xvYmFsIG9iamVjdCB2aXNpYmxlIGluIHRoZSBicm93c2VyLlxuICAgICAgbW9kdWxlLmV4cG9ydHMuYnJvd3NlclNoaW0gPSBmaXJlZm94U2hpbTtcblxuICAgICAgZmlyZWZveFNoaW0uc2hpbUdldFVzZXJNZWRpYSgpO1xuICAgICAgZmlyZWZveFNoaW0uc2hpbVNvdXJjZU9iamVjdCgpO1xuICAgICAgZmlyZWZveFNoaW0uc2hpbVBlZXJDb25uZWN0aW9uKCk7XG4gICAgICBmaXJlZm94U2hpbS5zaGltT25UcmFjaygpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZWRnZSc6XG4gICAgICBpZiAoIWVkZ2VTaGltIHx8ICFlZGdlU2hpbS5zaGltUGVlckNvbm5lY3Rpb24pIHtcbiAgICAgICAgbG9nZ2luZygnTVMgZWRnZSBzaGltIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGlzIGFkYXB0ZXIgcmVsZWFzZS4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbG9nZ2luZygnYWRhcHRlci5qcyBzaGltbWluZyBlZGdlLicpO1xuICAgICAgLy8gRXhwb3J0IHRvIHRoZSBhZGFwdGVyIGdsb2JhbCBvYmplY3QgdmlzaWJsZSBpbiB0aGUgYnJvd3Nlci5cbiAgICAgIG1vZHVsZS5leHBvcnRzLmJyb3dzZXJTaGltID0gZWRnZVNoaW07XG5cbiAgICAgIGVkZ2VTaGltLnNoaW1HZXRVc2VyTWVkaWEoKTtcbiAgICAgIGVkZ2VTaGltLnNoaW1QZWVyQ29ubmVjdGlvbigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2FmYXJpJzpcbiAgICAgIGlmICghc2FmYXJpU2hpbSkge1xuICAgICAgICBsb2dnaW5nKCdTYWZhcmkgc2hpbSBpcyBub3QgaW5jbHVkZWQgaW4gdGhpcyBhZGFwdGVyIHJlbGVhc2UuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxvZ2dpbmcoJ2FkYXB0ZXIuanMgc2hpbW1pbmcgc2FmYXJpLicpO1xuICAgICAgLy8gRXhwb3J0IHRvIHRoZSBhZGFwdGVyIGdsb2JhbCBvYmplY3QgdmlzaWJsZSBpbiB0aGUgYnJvd3Nlci5cbiAgICAgIG1vZHVsZS5leHBvcnRzLmJyb3dzZXJTaGltID0gc2FmYXJpU2hpbTtcblxuICAgICAgc2FmYXJpU2hpbS5zaGltR2V0VXNlck1lZGlhKCk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgbG9nZ2luZygnVW5zdXBwb3J0ZWQgYnJvd3NlciEnKTtcbiAgfVxufSkoKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi90cmFjZWFibGVwZWVyY29ubmVjdGlvbi9+L3dlYnJ0Yy1hZGFwdGVyL3NyYy9qcy9hZGFwdGVyX2NvcmUuanNcbi8vIG1vZHVsZSBpZCA9IDQ3OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 479 */
/***/ function(module, exports) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar logDisabled_ = true;\n\n// Utility methods.\nvar utils = {\n  disableLog: function(bool) {\n    if (typeof bool !== 'boolean') {\n      return new Error('Argument type: ' + typeof bool +\n          '. Please use a boolean.');\n    }\n    logDisabled_ = bool;\n    return (bool) ? 'adapter.js logging disabled' :\n        'adapter.js logging enabled';\n  },\n\n  log: function() {\n    if (typeof window === 'object') {\n      if (logDisabled_) {\n        return;\n      }\n      if (typeof console !== 'undefined' && typeof console.log === 'function') {\n        console.log.apply(console, arguments);\n      }\n    }\n  },\n\n  /**\n   * Extract browser version out of the provided user agent string.\n   *\n   * @param {!string} uastring userAgent string.\n   * @param {!string} expr Regular expression used as match criteria.\n   * @param {!number} pos position in the version string to be returned.\n   * @return {!number} browser version.\n   */\n  extractVersion: function(uastring, expr, pos) {\n    var match = uastring.match(expr);\n    return match && match.length >= pos && parseInt(match[pos], 10);\n  },\n\n  /**\n   * Browser detector.\n   *\n   * @return {object} result containing browser, version and minVersion\n   *     properties.\n   */\n  detectBrowser: function() {\n    // Returned result object.\n    var result = {};\n    result.browser = null;\n    result.version = null;\n    result.minVersion = null;\n\n    // Fail early if it's not a browser\n    if (typeof window === 'undefined' || !window.navigator) {\n      result.browser = 'Not a browser.';\n      return result;\n    }\n\n    // Firefox.\n    if (navigator.mozGetUserMedia) {\n      result.browser = 'firefox';\n      result.version = this.extractVersion(navigator.userAgent,\n          /Firefox\\/([0-9]+)\\./, 1);\n      result.minVersion = 31;\n\n    // all webkit-based browsers\n    } else if (navigator.webkitGetUserMedia) {\n      // Chrome, Chromium, Webview, Opera, all use the chrome shim for now\n      if (window.webkitRTCPeerConnection) {\n        result.browser = 'chrome';\n        result.version = this.extractVersion(navigator.userAgent,\n          /Chrom(e|ium)\\/([0-9]+)\\./, 2);\n        result.minVersion = 38;\n\n      // Safari or unknown webkit-based\n      // for the time being Safari has support for MediaStreams but not webRTC\n      } else {\n        // Safari UA substrings of interest for reference:\n        // - webkit version:           AppleWebKit/602.1.25 (also used in Op,Cr)\n        // - safari UI version:        Version/9.0.3 (unique to Safari)\n        // - safari UI webkit version: Safari/601.4.4 (also used in Op,Cr)\n        //\n        // if the webkit version and safari UI webkit versions are equals,\n        // ... this is a stable version.\n        //\n        // only the internal webkit version is important today to know if\n        // media streams are supported\n        //\n        if (navigator.userAgent.match(/Version\\/(\\d+).(\\d+)/)) {\n          result.browser = 'safari';\n          result.version = this.extractVersion(navigator.userAgent,\n            /AppleWebKit\\/([0-9]+)\\./, 1);\n          result.minVersion = 602;\n\n        // unknown webkit-based browser\n        } else {\n          result.browser = 'Unsupported webkit-based browser ' +\n              'with GUM support but no WebRTC support.';\n          return result;\n        }\n      }\n\n    // Edge.\n    } else if (navigator.mediaDevices &&\n        navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)) {\n      result.browser = 'edge';\n      result.version = this.extractVersion(navigator.userAgent,\n          /Edge\\/(\\d+).(\\d+)$/, 2);\n      result.minVersion = 10547;\n\n    // Default fallthrough: not supported.\n    } else {\n      result.browser = 'Not a supported browser.';\n      return result;\n    }\n\n    // Warn if version is less than minVersion.\n    if (result.version < result.minVersion) {\n      utils.log('Browser: ' + result.browser + ' Version: ' + result.version +\n          ' < minimum supported version: ' + result.minVersion +\n          '\\n some things might not work!');\n    }\n\n    return result;\n  }\n};\n\n// Export.\nmodule.exports = {\n  log: utils.log,\n  disableLog: utils.disableLog,\n  browserDetails: utils.detectBrowser(),\n  extractVersion: utils.extractVersion\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDc5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy90cmFjZWFibGVwZWVyY29ubmVjdGlvbi9ub2RlX21vZHVsZXMvd2VicnRjLWFkYXB0ZXIvc3JjL2pzL3V0aWxzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiAgQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBXZWJSVEMgcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlXG4gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlXG4gKiAgdHJlZS5cbiAqL1xuIC8qIGVzbGludC1lbnYgbm9kZSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgbG9nRGlzYWJsZWRfID0gdHJ1ZTtcblxuLy8gVXRpbGl0eSBtZXRob2RzLlxudmFyIHV0aWxzID0ge1xuICBkaXNhYmxlTG9nOiBmdW5jdGlvbihib29sKSB7XG4gICAgaWYgKHR5cGVvZiBib29sICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoJ0FyZ3VtZW50IHR5cGU6ICcgKyB0eXBlb2YgYm9vbCArXG4gICAgICAgICAgJy4gUGxlYXNlIHVzZSBhIGJvb2xlYW4uJyk7XG4gICAgfVxuICAgIGxvZ0Rpc2FibGVkXyA9IGJvb2w7XG4gICAgcmV0dXJuIChib29sKSA/ICdhZGFwdGVyLmpzIGxvZ2dpbmcgZGlzYWJsZWQnIDpcbiAgICAgICAgJ2FkYXB0ZXIuanMgbG9nZ2luZyBlbmFibGVkJztcbiAgfSxcblxuICBsb2c6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKGxvZ0Rpc2FibGVkXykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zb2xlLmxvZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogRXh0cmFjdCBicm93c2VyIHZlcnNpb24gb3V0IG9mIHRoZSBwcm92aWRlZCB1c2VyIGFnZW50IHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHshc3RyaW5nfSB1YXN0cmluZyB1c2VyQWdlbnQgc3RyaW5nLlxuICAgKiBAcGFyYW0geyFzdHJpbmd9IGV4cHIgUmVndWxhciBleHByZXNzaW9uIHVzZWQgYXMgbWF0Y2ggY3JpdGVyaWEuXG4gICAqIEBwYXJhbSB7IW51bWJlcn0gcG9zIHBvc2l0aW9uIGluIHRoZSB2ZXJzaW9uIHN0cmluZyB0byBiZSByZXR1cm5lZC5cbiAgICogQHJldHVybiB7IW51bWJlcn0gYnJvd3NlciB2ZXJzaW9uLlxuICAgKi9cbiAgZXh0cmFjdFZlcnNpb246IGZ1bmN0aW9uKHVhc3RyaW5nLCBleHByLCBwb3MpIHtcbiAgICB2YXIgbWF0Y2ggPSB1YXN0cmluZy5tYXRjaChleHByKTtcbiAgICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2gubGVuZ3RoID49IHBvcyAmJiBwYXJzZUludChtYXRjaFtwb3NdLCAxMCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEJyb3dzZXIgZGV0ZWN0b3IuXG4gICAqXG4gICAqIEByZXR1cm4ge29iamVjdH0gcmVzdWx0IGNvbnRhaW5pbmcgYnJvd3NlciwgdmVyc2lvbiBhbmQgbWluVmVyc2lvblxuICAgKiAgICAgcHJvcGVydGllcy5cbiAgICovXG4gIGRldGVjdEJyb3dzZXI6IGZ1bmN0aW9uKCkge1xuICAgIC8vIFJldHVybmVkIHJlc3VsdCBvYmplY3QuXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIHJlc3VsdC5icm93c2VyID0gbnVsbDtcbiAgICByZXN1bHQudmVyc2lvbiA9IG51bGw7XG4gICAgcmVzdWx0Lm1pblZlcnNpb24gPSBudWxsO1xuXG4gICAgLy8gRmFpbCBlYXJseSBpZiBpdCdzIG5vdCBhIGJyb3dzZXJcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIXdpbmRvdy5uYXZpZ2F0b3IpIHtcbiAgICAgIHJlc3VsdC5icm93c2VyID0gJ05vdCBhIGJyb3dzZXIuJztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gRmlyZWZveC5cbiAgICBpZiAobmF2aWdhdG9yLm1vekdldFVzZXJNZWRpYSkge1xuICAgICAgcmVzdWx0LmJyb3dzZXIgPSAnZmlyZWZveCc7XG4gICAgICByZXN1bHQudmVyc2lvbiA9IHRoaXMuZXh0cmFjdFZlcnNpb24obmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICAgICAgICAvRmlyZWZveFxcLyhbMC05XSspXFwuLywgMSk7XG4gICAgICByZXN1bHQubWluVmVyc2lvbiA9IDMxO1xuXG4gICAgLy8gYWxsIHdlYmtpdC1iYXNlZCBicm93c2Vyc1xuICAgIH0gZWxzZSBpZiAobmF2aWdhdG9yLndlYmtpdEdldFVzZXJNZWRpYSkge1xuICAgICAgLy8gQ2hyb21lLCBDaHJvbWl1bSwgV2VidmlldywgT3BlcmEsIGFsbCB1c2UgdGhlIGNocm9tZSBzaGltIGZvciBub3dcbiAgICAgIGlmICh3aW5kb3cud2Via2l0UlRDUGVlckNvbm5lY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0LmJyb3dzZXIgPSAnY2hyb21lJztcbiAgICAgICAgcmVzdWx0LnZlcnNpb24gPSB0aGlzLmV4dHJhY3RWZXJzaW9uKG5hdmlnYXRvci51c2VyQWdlbnQsXG4gICAgICAgICAgL0Nocm9tKGV8aXVtKVxcLyhbMC05XSspXFwuLywgMik7XG4gICAgICAgIHJlc3VsdC5taW5WZXJzaW9uID0gMzg7XG5cbiAgICAgIC8vIFNhZmFyaSBvciB1bmtub3duIHdlYmtpdC1iYXNlZFxuICAgICAgLy8gZm9yIHRoZSB0aW1lIGJlaW5nIFNhZmFyaSBoYXMgc3VwcG9ydCBmb3IgTWVkaWFTdHJlYW1zIGJ1dCBub3Qgd2ViUlRDXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTYWZhcmkgVUEgc3Vic3RyaW5ncyBvZiBpbnRlcmVzdCBmb3IgcmVmZXJlbmNlOlxuICAgICAgICAvLyAtIHdlYmtpdCB2ZXJzaW9uOiAgICAgICAgICAgQXBwbGVXZWJLaXQvNjAyLjEuMjUgKGFsc28gdXNlZCBpbiBPcCxDcilcbiAgICAgICAgLy8gLSBzYWZhcmkgVUkgdmVyc2lvbjogICAgICAgIFZlcnNpb24vOS4wLjMgKHVuaXF1ZSB0byBTYWZhcmkpXG4gICAgICAgIC8vIC0gc2FmYXJpIFVJIHdlYmtpdCB2ZXJzaW9uOiBTYWZhcmkvNjAxLjQuNCAoYWxzbyB1c2VkIGluIE9wLENyKVxuICAgICAgICAvL1xuICAgICAgICAvLyBpZiB0aGUgd2Via2l0IHZlcnNpb24gYW5kIHNhZmFyaSBVSSB3ZWJraXQgdmVyc2lvbnMgYXJlIGVxdWFscyxcbiAgICAgICAgLy8gLi4uIHRoaXMgaXMgYSBzdGFibGUgdmVyc2lvbi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gb25seSB0aGUgaW50ZXJuYWwgd2Via2l0IHZlcnNpb24gaXMgaW1wb3J0YW50IHRvZGF5IHRvIGtub3cgaWZcbiAgICAgICAgLy8gbWVkaWEgc3RyZWFtcyBhcmUgc3VwcG9ydGVkXG4gICAgICAgIC8vXG4gICAgICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9WZXJzaW9uXFwvKFxcZCspLihcXGQrKS8pKSB7XG4gICAgICAgICAgcmVzdWx0LmJyb3dzZXIgPSAnc2FmYXJpJztcbiAgICAgICAgICByZXN1bHQudmVyc2lvbiA9IHRoaXMuZXh0cmFjdFZlcnNpb24obmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICAgICAgICAgIC9BcHBsZVdlYktpdFxcLyhbMC05XSspXFwuLywgMSk7XG4gICAgICAgICAgcmVzdWx0Lm1pblZlcnNpb24gPSA2MDI7XG5cbiAgICAgICAgLy8gdW5rbm93biB3ZWJraXQtYmFzZWQgYnJvd3NlclxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdC5icm93c2VyID0gJ1Vuc3VwcG9ydGVkIHdlYmtpdC1iYXNlZCBicm93c2VyICcgK1xuICAgICAgICAgICAgICAnd2l0aCBHVU0gc3VwcG9ydCBidXQgbm8gV2ViUlRDIHN1cHBvcnQuJztcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAvLyBFZGdlLlxuICAgIH0gZWxzZSBpZiAobmF2aWdhdG9yLm1lZGlhRGV2aWNlcyAmJlxuICAgICAgICBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9FZGdlXFwvKFxcZCspLihcXGQrKSQvKSkge1xuICAgICAgcmVzdWx0LmJyb3dzZXIgPSAnZWRnZSc7XG4gICAgICByZXN1bHQudmVyc2lvbiA9IHRoaXMuZXh0cmFjdFZlcnNpb24obmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICAgICAgICAvRWRnZVxcLyhcXGQrKS4oXFxkKykkLywgMik7XG4gICAgICByZXN1bHQubWluVmVyc2lvbiA9IDEwNTQ3O1xuXG4gICAgLy8gRGVmYXVsdCBmYWxsdGhyb3VnaDogbm90IHN1cHBvcnRlZC5cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LmJyb3dzZXIgPSAnTm90IGEgc3VwcG9ydGVkIGJyb3dzZXIuJztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gV2FybiBpZiB2ZXJzaW9uIGlzIGxlc3MgdGhhbiBtaW5WZXJzaW9uLlxuICAgIGlmIChyZXN1bHQudmVyc2lvbiA8IHJlc3VsdC5taW5WZXJzaW9uKSB7XG4gICAgICB1dGlscy5sb2coJ0Jyb3dzZXI6ICcgKyByZXN1bHQuYnJvd3NlciArICcgVmVyc2lvbjogJyArIHJlc3VsdC52ZXJzaW9uICtcbiAgICAgICAgICAnIDwgbWluaW11bSBzdXBwb3J0ZWQgdmVyc2lvbjogJyArIHJlc3VsdC5taW5WZXJzaW9uICtcbiAgICAgICAgICAnXFxuIHNvbWUgdGhpbmdzIG1pZ2h0IG5vdCB3b3JrIScpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5cbi8vIEV4cG9ydC5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBsb2c6IHV0aWxzLmxvZyxcbiAgZGlzYWJsZUxvZzogdXRpbHMuZGlzYWJsZUxvZyxcbiAgYnJvd3NlckRldGFpbHM6IHV0aWxzLmRldGVjdEJyb3dzZXIoKSxcbiAgZXh0cmFjdFZlcnNpb246IHV0aWxzLmV4dHJhY3RWZXJzaW9uXG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3RyYWNlYWJsZXBlZXJjb25uZWN0aW9uL34vd2VicnRjLWFkYXB0ZXIvc3JjL2pzL3V0aWxzLmpzXG4vLyBtb2R1bGUgaWQgPSA0Nzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 480 */
/***/ function(module, exports, __webpack_require__) {

    eval("\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\nvar logging = __webpack_require__(479).log;\nvar browserDetails = __webpack_require__(479).browserDetails;\n\nvar chromeShim = {\n  shimMediaStream: function() {\n    window.MediaStream = window.MediaStream || window.webkitMediaStream;\n  },\n\n  shimOnTrack: function() {\n    if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n        window.RTCPeerConnection.prototype)) {\n      Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n        get: function() {\n          return this._ontrack;\n        },\n        set: function(f) {\n          var self = this;\n          if (this._ontrack) {\n            this.removeEventListener('track', this._ontrack);\n            this.removeEventListener('addstream', this._ontrackpoly);\n          }\n          this.addEventListener('track', this._ontrack = f);\n          this.addEventListener('addstream', this._ontrackpoly = function(e) {\n            // onaddstream does not fire when a track is added to an existing\n            // stream. But stream.onaddtrack is implemented so we use that.\n            e.stream.addEventListener('addtrack', function(te) {\n              var event = new Event('track');\n              event.track = te.track;\n              event.receiver = {track: te.track};\n              event.streams = [e.stream];\n              self.dispatchEvent(event);\n            });\n            e.stream.getTracks().forEach(function(track) {\n              var event = new Event('track');\n              event.track = track;\n              event.receiver = {track: track};\n              event.streams = [e.stream];\n              this.dispatchEvent(event);\n            }.bind(this));\n          }.bind(this));\n        }\n      });\n    }\n  },\n\n  shimSourceObject: function() {\n    if (typeof window === 'object') {\n      if (window.HTMLMediaElement &&\n        !('srcObject' in window.HTMLMediaElement.prototype)) {\n        // Shim the srcObject property, once, when HTMLMediaElement is found.\n        Object.defineProperty(window.HTMLMediaElement.prototype, 'srcObject', {\n          get: function() {\n            return this._srcObject;\n          },\n          set: function(stream) {\n            var self = this;\n            // Use _srcObject as a private property for this shim\n            this._srcObject = stream;\n            if (this.src) {\n              URL.revokeObjectURL(this.src);\n            }\n\n            if (!stream) {\n              this.src = '';\n              return;\n            }\n            this.src = URL.createObjectURL(stream);\n            // We need to recreate the blob url when a track is added or\n            // removed. Doing it manually since we want to avoid a recursion.\n            stream.addEventListener('addtrack', function() {\n              if (self.src) {\n                URL.revokeObjectURL(self.src);\n              }\n              self.src = URL.createObjectURL(stream);\n            });\n            stream.addEventListener('removetrack', function() {\n              if (self.src) {\n                URL.revokeObjectURL(self.src);\n              }\n              self.src = URL.createObjectURL(stream);\n            });\n          }\n        });\n      }\n    }\n  },\n\n  shimPeerConnection: function() {\n    // The RTCPeerConnection object.\n    window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n      // Translate iceTransportPolicy to iceTransports,\n      // see https://code.google.com/p/webrtc/issues/detail?id=4869\n      logging('PeerConnection');\n      if (pcConfig && pcConfig.iceTransportPolicy) {\n        pcConfig.iceTransports = pcConfig.iceTransportPolicy;\n      }\n\n      var pc = new webkitRTCPeerConnection(pcConfig, pcConstraints);\n      var origGetStats = pc.getStats.bind(pc);\n      pc.getStats = function(selector, successCallback, errorCallback) {\n        var self = this;\n        var args = arguments;\n\n        // If selector is a function then we are in the old style stats so just\n        // pass back the original getStats format to avoid breaking old users.\n        if (arguments.length > 0 && typeof selector === 'function') {\n          return origGetStats(selector, successCallback);\n        }\n\n        var fixChromeStats_ = function(response) {\n          var standardReport = {};\n          var reports = response.result();\n          reports.forEach(function(report) {\n            var standardStats = {\n              id: report.id,\n              timestamp: report.timestamp,\n              type: report.type\n            };\n            report.names().forEach(function(name) {\n              standardStats[name] = report.stat(name);\n            });\n            standardReport[standardStats.id] = standardStats;\n          });\n\n          return standardReport;\n        };\n\n        // shim getStats with maplike support\n        var makeMapStats = function(stats, legacyStats) {\n          var map = new Map(Object.keys(stats).map(function(key) {\n            return[key, stats[key]];\n          }));\n          legacyStats = legacyStats || stats;\n          Object.keys(legacyStats).forEach(function(key) {\n            map[key] = legacyStats[key];\n          });\n          return map;\n        };\n\n        if (arguments.length >= 2) {\n          var successCallbackWrapper_ = function(response) {\n            args[1](makeMapStats(fixChromeStats_(response)));\n          };\n\n          return origGetStats.apply(this, [successCallbackWrapper_,\n              arguments[0]]);\n        }\n\n        // promise-support\n        return new Promise(function(resolve, reject) {\n          if (args.length === 1 && typeof selector === 'object') {\n            origGetStats.apply(self, [\n              function(response) {\n                resolve(makeMapStats(fixChromeStats_(response)));\n              }, reject]);\n          } else {\n            // Preserve legacy chrome stats only on legacy access of stats obj\n            origGetStats.apply(self, [\n              function(response) {\n                resolve(makeMapStats(fixChromeStats_(response),\n                    response.result()));\n              }, reject]);\n          }\n        }).then(successCallback, errorCallback);\n      };\n\n      return pc;\n    };\n    window.RTCPeerConnection.prototype = webkitRTCPeerConnection.prototype;\n\n    // wrap static methods. Currently just generateCertificate.\n    if (webkitRTCPeerConnection.generateCertificate) {\n      Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n        get: function() {\n          return webkitRTCPeerConnection.generateCertificate;\n        }\n      });\n    }\n\n    ['createOffer', 'createAnswer'].forEach(function(method) {\n      var nativeMethod = webkitRTCPeerConnection.prototype[method];\n      webkitRTCPeerConnection.prototype[method] = function() {\n        var self = this;\n        if (arguments.length < 1 || (arguments.length === 1 &&\n            typeof arguments[0] === 'object')) {\n          var opts = arguments.length === 1 ? arguments[0] : undefined;\n          return new Promise(function(resolve, reject) {\n            nativeMethod.apply(self, [resolve, reject, opts]);\n          });\n        }\n        return nativeMethod.apply(this, arguments);\n      };\n    });\n\n    // add promise support -- natively available in Chrome 51\n    if (browserDetails.version < 51) {\n      ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n          .forEach(function(method) {\n            var nativeMethod = webkitRTCPeerConnection.prototype[method];\n            webkitRTCPeerConnection.prototype[method] = function() {\n              var args = arguments;\n              var self = this;\n              var promise = new Promise(function(resolve, reject) {\n                nativeMethod.apply(self, [args[0], resolve, reject]);\n              });\n              if (args.length < 2) {\n                return promise;\n              }\n              return promise.then(function() {\n                args[1].apply(null, []);\n              },\n              function(err) {\n                if (args.length >= 3) {\n                  args[2].apply(null, [err]);\n                }\n              });\n            };\n          });\n    }\n\n    // support for addIceCandidate(null)\n    var nativeAddIceCandidate =\n        RTCPeerConnection.prototype.addIceCandidate;\n    RTCPeerConnection.prototype.addIceCandidate = function() {\n      return arguments[0] === null ? Promise.resolve()\n          : nativeAddIceCandidate.apply(this, arguments);\n    };\n\n    // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n    ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n        .forEach(function(method) {\n          var nativeMethod = webkitRTCPeerConnection.prototype[method];\n          webkitRTCPeerConnection.prototype[method] = function() {\n            arguments[0] = new ((method === 'addIceCandidate') ?\n                RTCIceCandidate : RTCSessionDescription)(arguments[0]);\n            return nativeMethod.apply(this, arguments);\n          };\n        });\n  },\n\n  // Attach a media stream to an element.\n  attachMediaStream: function(element, stream) {\n    logging('DEPRECATED, attachMediaStream will soon be removed.');\n    if (browserDetails.version >= 43) {\n      element.srcObject = stream;\n    } else if (typeof element.src !== 'undefined') {\n      element.src = URL.createObjectURL(stream);\n    } else {\n      logging('Error attaching stream to element.');\n    }\n  },\n\n  reattachMediaStream: function(to, from) {\n    logging('DEPRECATED, reattachMediaStream will soon be removed.');\n    if (browserDetails.version >= 43) {\n      to.srcObject = from.srcObject;\n    } else {\n      to.src = from.src;\n    }\n  }\n};\n\n\n// Expose public methods.\nmodule.exports = {\n  shimMediaStream: chromeShim.shimMediaStream,\n  shimOnTrack: chromeShim.shimOnTrack,\n  shimSourceObject: chromeShim.shimSourceObject,\n  shimPeerConnection: chromeShim.shimPeerConnection,\n  shimGetUserMedia: __webpack_require__(481),\n  attachMediaStream: chromeShim.attachMediaStream,\n  reattachMediaStream: chromeShim.reattachMediaStream\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDgwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy90cmFjZWFibGVwZWVyY29ubmVjdGlvbi9ub2RlX21vZHVsZXMvd2VicnRjLWFkYXB0ZXIvc3JjL2pzL2Nocm9tZS9jaHJvbWVfc2hpbS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qXG4gKiAgQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBXZWJSVEMgcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlXG4gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlXG4gKiAgdHJlZS5cbiAqL1xuIC8qIGVzbGludC1lbnYgbm9kZSAqL1xuJ3VzZSBzdHJpY3QnO1xudmFyIGxvZ2dpbmcgPSByZXF1aXJlKCcuLi91dGlscy5qcycpLmxvZztcbnZhciBicm93c2VyRGV0YWlscyA9IHJlcXVpcmUoJy4uL3V0aWxzLmpzJykuYnJvd3NlckRldGFpbHM7XG5cbnZhciBjaHJvbWVTaGltID0ge1xuICBzaGltTWVkaWFTdHJlYW06IGZ1bmN0aW9uKCkge1xuICAgIHdpbmRvdy5NZWRpYVN0cmVhbSA9IHdpbmRvdy5NZWRpYVN0cmVhbSB8fCB3aW5kb3cud2Via2l0TWVkaWFTdHJlYW07XG4gIH0sXG5cbiAgc2hpbU9uVHJhY2s6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JyAmJiB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24gJiYgISgnb250cmFjaycgaW5cbiAgICAgICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZSkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLCAnb250cmFjaycsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fb250cmFjaztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbihmKSB7XG4gICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAgIGlmICh0aGlzLl9vbnRyYWNrKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYWNrJywgdGhpcy5fb250cmFjayk7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2FkZHN0cmVhbScsIHRoaXMuX29udHJhY2twb2x5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCd0cmFjaycsIHRoaXMuX29udHJhY2sgPSBmKTtcbiAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2FkZHN0cmVhbScsIHRoaXMuX29udHJhY2twb2x5ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgLy8gb25hZGRzdHJlYW0gZG9lcyBub3QgZmlyZSB3aGVuIGEgdHJhY2sgaXMgYWRkZWQgdG8gYW4gZXhpc3RpbmdcbiAgICAgICAgICAgIC8vIHN0cmVhbS4gQnV0IHN0cmVhbS5vbmFkZHRyYWNrIGlzIGltcGxlbWVudGVkIHNvIHdlIHVzZSB0aGF0LlxuICAgICAgICAgICAgZS5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignYWRkdHJhY2snLCBmdW5jdGlvbih0ZSkge1xuICAgICAgICAgICAgICB2YXIgZXZlbnQgPSBuZXcgRXZlbnQoJ3RyYWNrJyk7XG4gICAgICAgICAgICAgIGV2ZW50LnRyYWNrID0gdGUudHJhY2s7XG4gICAgICAgICAgICAgIGV2ZW50LnJlY2VpdmVyID0ge3RyYWNrOiB0ZS50cmFja307XG4gICAgICAgICAgICAgIGV2ZW50LnN0cmVhbXMgPSBbZS5zdHJlYW1dO1xuICAgICAgICAgICAgICBzZWxmLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBlLnN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKGZ1bmN0aW9uKHRyYWNrKSB7XG4gICAgICAgICAgICAgIHZhciBldmVudCA9IG5ldyBFdmVudCgndHJhY2snKTtcbiAgICAgICAgICAgICAgZXZlbnQudHJhY2sgPSB0cmFjaztcbiAgICAgICAgICAgICAgZXZlbnQucmVjZWl2ZXIgPSB7dHJhY2s6IHRyYWNrfTtcbiAgICAgICAgICAgICAgZXZlbnQuc3RyZWFtcyA9IFtlLnN0cmVhbV07XG4gICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBzaGltU291cmNlT2JqZWN0OiBmdW5jdGlvbigpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICh3aW5kb3cuSFRNTE1lZGlhRWxlbWVudCAmJlxuICAgICAgICAhKCdzcmNPYmplY3QnIGluIHdpbmRvdy5IVE1MTWVkaWFFbGVtZW50LnByb3RvdHlwZSkpIHtcbiAgICAgICAgLy8gU2hpbSB0aGUgc3JjT2JqZWN0IHByb3BlcnR5LCBvbmNlLCB3aGVuIEhUTUxNZWRpYUVsZW1lbnQgaXMgZm91bmQuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3cuSFRNTE1lZGlhRWxlbWVudC5wcm90b3R5cGUsICdzcmNPYmplY3QnLCB7XG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zcmNPYmplY3Q7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgLy8gVXNlIF9zcmNPYmplY3QgYXMgYSBwcml2YXRlIHByb3BlcnR5IGZvciB0aGlzIHNoaW1cbiAgICAgICAgICAgIHRoaXMuX3NyY09iamVjdCA9IHN0cmVhbTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNyYykge1xuICAgICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMuc3JjKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFzdHJlYW0pIHtcbiAgICAgICAgICAgICAgdGhpcy5zcmMgPSAnJztcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zcmMgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKHN0cmVhbSk7XG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZSBibG9iIHVybCB3aGVuIGEgdHJhY2sgaXMgYWRkZWQgb3JcbiAgICAgICAgICAgIC8vIHJlbW92ZWQuIERvaW5nIGl0IG1hbnVhbGx5IHNpbmNlIHdlIHdhbnQgdG8gYXZvaWQgYSByZWN1cnNpb24uXG4gICAgICAgICAgICBzdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignYWRkdHJhY2snLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKHNlbGYuc3JjKSB7XG4gICAgICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChzZWxmLnNyYyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc2VsZi5zcmMgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKHN0cmVhbSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdyZW1vdmV0cmFjaycsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoc2VsZi5zcmMpIHtcbiAgICAgICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHNlbGYuc3JjKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzZWxmLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoc3RyZWFtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHNoaW1QZWVyQ29ubmVjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgLy8gVGhlIFJUQ1BlZXJDb25uZWN0aW9uIG9iamVjdC5cbiAgICB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24gPSBmdW5jdGlvbihwY0NvbmZpZywgcGNDb25zdHJhaW50cykge1xuICAgICAgLy8gVHJhbnNsYXRlIGljZVRyYW5zcG9ydFBvbGljeSB0byBpY2VUcmFuc3BvcnRzLFxuICAgICAgLy8gc2VlIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3Avd2VicnRjL2lzc3Vlcy9kZXRhaWw/aWQ9NDg2OVxuICAgICAgbG9nZ2luZygnUGVlckNvbm5lY3Rpb24nKTtcbiAgICAgIGlmIChwY0NvbmZpZyAmJiBwY0NvbmZpZy5pY2VUcmFuc3BvcnRQb2xpY3kpIHtcbiAgICAgICAgcGNDb25maWcuaWNlVHJhbnNwb3J0cyA9IHBjQ29uZmlnLmljZVRyYW5zcG9ydFBvbGljeTtcbiAgICAgIH1cblxuICAgICAgdmFyIHBjID0gbmV3IHdlYmtpdFJUQ1BlZXJDb25uZWN0aW9uKHBjQ29uZmlnLCBwY0NvbnN0cmFpbnRzKTtcbiAgICAgIHZhciBvcmlnR2V0U3RhdHMgPSBwYy5nZXRTdGF0cy5iaW5kKHBjKTtcbiAgICAgIHBjLmdldFN0YXRzID0gZnVuY3Rpb24oc2VsZWN0b3IsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuXG4gICAgICAgIC8vIElmIHNlbGVjdG9yIGlzIGEgZnVuY3Rpb24gdGhlbiB3ZSBhcmUgaW4gdGhlIG9sZCBzdHlsZSBzdGF0cyBzbyBqdXN0XG4gICAgICAgIC8vIHBhc3MgYmFjayB0aGUgb3JpZ2luYWwgZ2V0U3RhdHMgZm9ybWF0IHRvIGF2b2lkIGJyZWFraW5nIG9sZCB1c2Vycy5cbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBvcmlnR2V0U3RhdHMoc2VsZWN0b3IsIHN1Y2Nlc3NDYWxsYmFjayk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZml4Q2hyb21lU3RhdHNfID0gZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICB2YXIgc3RhbmRhcmRSZXBvcnQgPSB7fTtcbiAgICAgICAgICB2YXIgcmVwb3J0cyA9IHJlc3BvbnNlLnJlc3VsdCgpO1xuICAgICAgICAgIHJlcG9ydHMuZm9yRWFjaChmdW5jdGlvbihyZXBvcnQpIHtcbiAgICAgICAgICAgIHZhciBzdGFuZGFyZFN0YXRzID0ge1xuICAgICAgICAgICAgICBpZDogcmVwb3J0LmlkLFxuICAgICAgICAgICAgICB0aW1lc3RhbXA6IHJlcG9ydC50aW1lc3RhbXAsXG4gICAgICAgICAgICAgIHR5cGU6IHJlcG9ydC50eXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVwb3J0Lm5hbWVzKCkuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgICAgIHN0YW5kYXJkU3RhdHNbbmFtZV0gPSByZXBvcnQuc3RhdChuYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3RhbmRhcmRSZXBvcnRbc3RhbmRhcmRTdGF0cy5pZF0gPSBzdGFuZGFyZFN0YXRzO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHN0YW5kYXJkUmVwb3J0O1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIHNoaW0gZ2V0U3RhdHMgd2l0aCBtYXBsaWtlIHN1cHBvcnRcbiAgICAgICAgdmFyIG1ha2VNYXBTdGF0cyA9IGZ1bmN0aW9uKHN0YXRzLCBsZWdhY3lTdGF0cykge1xuICAgICAgICAgIHZhciBtYXAgPSBuZXcgTWFwKE9iamVjdC5rZXlzKHN0YXRzKS5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICByZXR1cm5ba2V5LCBzdGF0c1trZXldXTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgbGVnYWN5U3RhdHMgPSBsZWdhY3lTdGF0cyB8fCBzdGF0cztcbiAgICAgICAgICBPYmplY3Qua2V5cyhsZWdhY3lTdGF0cykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgIG1hcFtrZXldID0gbGVnYWN5U3RhdHNba2V5XTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICB2YXIgc3VjY2Vzc0NhbGxiYWNrV3JhcHBlcl8gPSBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgYXJnc1sxXShtYWtlTWFwU3RhdHMoZml4Q2hyb21lU3RhdHNfKHJlc3BvbnNlKSkpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICByZXR1cm4gb3JpZ0dldFN0YXRzLmFwcGx5KHRoaXMsIFtzdWNjZXNzQ2FsbGJhY2tXcmFwcGVyXyxcbiAgICAgICAgICAgICAgYXJndW1lbnRzWzBdXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwcm9taXNlLXN1cHBvcnRcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBvcmlnR2V0U3RhdHMuYXBwbHkoc2VsZiwgW1xuICAgICAgICAgICAgICBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUobWFrZU1hcFN0YXRzKGZpeENocm9tZVN0YXRzXyhyZXNwb25zZSkpKTtcbiAgICAgICAgICAgICAgfSwgcmVqZWN0XSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFByZXNlcnZlIGxlZ2FjeSBjaHJvbWUgc3RhdHMgb25seSBvbiBsZWdhY3kgYWNjZXNzIG9mIHN0YXRzIG9ialxuICAgICAgICAgICAgb3JpZ0dldFN0YXRzLmFwcGx5KHNlbGYsIFtcbiAgICAgICAgICAgICAgZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKG1ha2VNYXBTdGF0cyhmaXhDaHJvbWVTdGF0c18ocmVzcG9uc2UpLFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5yZXN1bHQoKSkpO1xuICAgICAgICAgICAgICB9LCByZWplY3RdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLnRoZW4oc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBwYztcbiAgICB9O1xuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUgPSB3ZWJraXRSVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGU7XG5cbiAgICAvLyB3cmFwIHN0YXRpYyBtZXRob2RzLiBDdXJyZW50bHkganVzdCBnZW5lcmF0ZUNlcnRpZmljYXRlLlxuICAgIGlmICh3ZWJraXRSVENQZWVyQ29ubmVjdGlvbi5nZW5lcmF0ZUNlcnRpZmljYXRlKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLCAnZ2VuZXJhdGVDZXJ0aWZpY2F0ZScsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gd2Via2l0UlRDUGVlckNvbm5lY3Rpb24uZ2VuZXJhdGVDZXJ0aWZpY2F0ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgWydjcmVhdGVPZmZlcicsICdjcmVhdGVBbnN3ZXInXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgdmFyIG5hdGl2ZU1ldGhvZCA9IHdlYmtpdFJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZVttZXRob2RdO1xuICAgICAgd2Via2l0UlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDEgfHwgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgIHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdvYmplY3QnKSkge1xuICAgICAgICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBuYXRpdmVNZXRob2QuYXBwbHkoc2VsZiwgW3Jlc29sdmUsIHJlamVjdCwgb3B0c10pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuYXRpdmVNZXRob2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBhZGQgcHJvbWlzZSBzdXBwb3J0IC0tIG5hdGl2ZWx5IGF2YWlsYWJsZSBpbiBDaHJvbWUgNTFcbiAgICBpZiAoYnJvd3NlckRldGFpbHMudmVyc2lvbiA8IDUxKSB7XG4gICAgICBbJ3NldExvY2FsRGVzY3JpcHRpb24nLCAnc2V0UmVtb3RlRGVzY3JpcHRpb24nLCAnYWRkSWNlQ2FuZGlkYXRlJ11cbiAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgICAgICAgIHZhciBuYXRpdmVNZXRob2QgPSB3ZWJraXRSVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGVbbWV0aG9kXTtcbiAgICAgICAgICAgIHdlYmtpdFJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgbmF0aXZlTWV0aG9kLmFwcGx5KHNlbGYsIFthcmdzWzBdLCByZXNvbHZlLCByZWplY3RdKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGFyZ3NbMV0uYXBwbHkobnVsbCwgW10pO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgICAgICAgYXJnc1syXS5hcHBseShudWxsLCBbZXJyXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc3VwcG9ydCBmb3IgYWRkSWNlQ2FuZGlkYXRlKG51bGwpXG4gICAgdmFyIG5hdGl2ZUFkZEljZUNhbmRpZGF0ZSA9XG4gICAgICAgIFJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5hZGRJY2VDYW5kaWRhdGU7XG4gICAgUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLmFkZEljZUNhbmRpZGF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50c1swXSA9PT0gbnVsbCA/IFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgICAgOiBuYXRpdmVBZGRJY2VDYW5kaWRhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgLy8gc2hpbSBpbXBsaWNpdCBjcmVhdGlvbiBvZiBSVENTZXNzaW9uRGVzY3JpcHRpb24vUlRDSWNlQ2FuZGlkYXRlXG4gICAgWydzZXRMb2NhbERlc2NyaXB0aW9uJywgJ3NldFJlbW90ZURlc2NyaXB0aW9uJywgJ2FkZEljZUNhbmRpZGF0ZSddXG4gICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgICAgIHZhciBuYXRpdmVNZXRob2QgPSB3ZWJraXRSVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGVbbWV0aG9kXTtcbiAgICAgICAgICB3ZWJraXRSVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgYXJndW1lbnRzWzBdID0gbmV3ICgobWV0aG9kID09PSAnYWRkSWNlQ2FuZGlkYXRlJykgP1xuICAgICAgICAgICAgICAgIFJUQ0ljZUNhbmRpZGF0ZSA6IFJUQ1Nlc3Npb25EZXNjcmlwdGlvbikoYXJndW1lbnRzWzBdKTtcbiAgICAgICAgICAgIHJldHVybiBuYXRpdmVNZXRob2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgfSxcblxuICAvLyBBdHRhY2ggYSBtZWRpYSBzdHJlYW0gdG8gYW4gZWxlbWVudC5cbiAgYXR0YWNoTWVkaWFTdHJlYW06IGZ1bmN0aW9uKGVsZW1lbnQsIHN0cmVhbSkge1xuICAgIGxvZ2dpbmcoJ0RFUFJFQ0FURUQsIGF0dGFjaE1lZGlhU3RyZWFtIHdpbGwgc29vbiBiZSByZW1vdmVkLicpO1xuICAgIGlmIChicm93c2VyRGV0YWlscy52ZXJzaW9uID49IDQzKSB7XG4gICAgICBlbGVtZW50LnNyY09iamVjdCA9IHN0cmVhbTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50LnNyYyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGVsZW1lbnQuc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChzdHJlYW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnaW5nKCdFcnJvciBhdHRhY2hpbmcgc3RyZWFtIHRvIGVsZW1lbnQuJyk7XG4gICAgfVxuICB9LFxuXG4gIHJlYXR0YWNoTWVkaWFTdHJlYW06IGZ1bmN0aW9uKHRvLCBmcm9tKSB7XG4gICAgbG9nZ2luZygnREVQUkVDQVRFRCwgcmVhdHRhY2hNZWRpYVN0cmVhbSB3aWxsIHNvb24gYmUgcmVtb3ZlZC4nKTtcbiAgICBpZiAoYnJvd3NlckRldGFpbHMudmVyc2lvbiA+PSA0Mykge1xuICAgICAgdG8uc3JjT2JqZWN0ID0gZnJvbS5zcmNPYmplY3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRvLnNyYyA9IGZyb20uc3JjO1xuICAgIH1cbiAgfVxufTtcblxuXG4vLyBFeHBvc2UgcHVibGljIG1ldGhvZHMuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2hpbU1lZGlhU3RyZWFtOiBjaHJvbWVTaGltLnNoaW1NZWRpYVN0cmVhbSxcbiAgc2hpbU9uVHJhY2s6IGNocm9tZVNoaW0uc2hpbU9uVHJhY2ssXG4gIHNoaW1Tb3VyY2VPYmplY3Q6IGNocm9tZVNoaW0uc2hpbVNvdXJjZU9iamVjdCxcbiAgc2hpbVBlZXJDb25uZWN0aW9uOiBjaHJvbWVTaGltLnNoaW1QZWVyQ29ubmVjdGlvbixcbiAgc2hpbUdldFVzZXJNZWRpYTogcmVxdWlyZSgnLi9nZXR1c2VybWVkaWEnKSxcbiAgYXR0YWNoTWVkaWFTdHJlYW06IGNocm9tZVNoaW0uYXR0YWNoTWVkaWFTdHJlYW0sXG4gIHJlYXR0YWNoTWVkaWFTdHJlYW06IGNocm9tZVNoaW0ucmVhdHRhY2hNZWRpYVN0cmVhbVxufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi90cmFjZWFibGVwZWVyY29ubmVjdGlvbi9+L3dlYnJ0Yy1hZGFwdGVyL3NyYy9qcy9jaHJvbWUvY2hyb21lX3NoaW0uanNcbi8vIG1vZHVsZSBpZCA9IDQ4MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 481 */
/***/ function(module, exports, __webpack_require__) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\nvar logging = __webpack_require__(479).log;\n\n// Expose public methods.\nmodule.exports = function() {\n  var constraintsToChrome_ = function(c) {\n    if (typeof c !== 'object' || c.mandatory || c.optional) {\n      return c;\n    }\n    var cc = {};\n    Object.keys(c).forEach(function(key) {\n      if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n        return;\n      }\n      var r = (typeof c[key] === 'object') ? c[key] : {ideal: c[key]};\n      if (r.exact !== undefined && typeof r.exact === 'number') {\n        r.min = r.max = r.exact;\n      }\n      var oldname_ = function(prefix, name) {\n        if (prefix) {\n          return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n        }\n        return (name === 'deviceId') ? 'sourceId' : name;\n      };\n      if (r.ideal !== undefined) {\n        cc.optional = cc.optional || [];\n        var oc = {};\n        if (typeof r.ideal === 'number') {\n          oc[oldname_('min', key)] = r.ideal;\n          cc.optional.push(oc);\n          oc = {};\n          oc[oldname_('max', key)] = r.ideal;\n          cc.optional.push(oc);\n        } else {\n          oc[oldname_('', key)] = r.ideal;\n          cc.optional.push(oc);\n        }\n      }\n      if (r.exact !== undefined && typeof r.exact !== 'number') {\n        cc.mandatory = cc.mandatory || {};\n        cc.mandatory[oldname_('', key)] = r.exact;\n      } else {\n        ['min', 'max'].forEach(function(mix) {\n          if (r[mix] !== undefined) {\n            cc.mandatory = cc.mandatory || {};\n            cc.mandatory[oldname_(mix, key)] = r[mix];\n          }\n        });\n      }\n    });\n    if (c.advanced) {\n      cc.optional = (cc.optional || []).concat(c.advanced);\n    }\n    return cc;\n  };\n\n  var shimConstraints_ = function(constraints, func) {\n    constraints = JSON.parse(JSON.stringify(constraints));\n    if (constraints && constraints.audio) {\n      constraints.audio = constraintsToChrome_(constraints.audio);\n    }\n    if (constraints && typeof constraints.video === 'object') {\n      // Shim facingMode for mobile, where it defaults to \"user\".\n      var face = constraints.video.facingMode;\n      face = face && ((typeof face === 'object') ? face : {ideal: face});\n\n      if ((face && (face.exact === 'user' || face.exact === 'environment' ||\n                    face.ideal === 'user' || face.ideal === 'environment')) &&\n          !(navigator.mediaDevices.getSupportedConstraints &&\n            navigator.mediaDevices.getSupportedConstraints().facingMode)) {\n        delete constraints.video.facingMode;\n        if (face.exact === 'environment' || face.ideal === 'environment') {\n          // Look for \"back\" in label, or use last cam (typically back cam).\n          return navigator.mediaDevices.enumerateDevices()\n          .then(function(devices) {\n            devices = devices.filter(function(d) {\n              return d.kind === 'videoinput';\n            });\n            var back = devices.find(function(d) {\n              return d.label.toLowerCase().indexOf('back') !== -1;\n            }) || (devices.length && devices[devices.length - 1]);\n            if (back) {\n              constraints.video.deviceId = face.exact ? {exact: back.deviceId} :\n                                                        {ideal: back.deviceId};\n            }\n            constraints.video = constraintsToChrome_(constraints.video);\n            logging('chrome: ' + JSON.stringify(constraints));\n            return func(constraints);\n          });\n        }\n      }\n      constraints.video = constraintsToChrome_(constraints.video);\n    }\n    logging('chrome: ' + JSON.stringify(constraints));\n    return func(constraints);\n  };\n\n  var shimError_ = function(e) {\n    return {\n      name: {\n        PermissionDeniedError: 'NotAllowedError',\n        ConstraintNotSatisfiedError: 'OverconstrainedError'\n      }[e.name] || e.name,\n      message: e.message,\n      constraint: e.constraintName,\n      toString: function() {\n        return this.name + (this.message && ': ') + this.message;\n      }\n    };\n  };\n\n  var getUserMedia_ = function(constraints, onSuccess, onError) {\n    shimConstraints_(constraints, function(c) {\n      navigator.webkitGetUserMedia(c, onSuccess, function(e) {\n        onError(shimError_(e));\n      });\n    });\n  };\n\n  navigator.getUserMedia = getUserMedia_;\n\n  // Returns the result of getUserMedia as a Promise.\n  var getUserMediaPromise_ = function(constraints) {\n    return new Promise(function(resolve, reject) {\n      navigator.getUserMedia(constraints, resolve, reject);\n    });\n  };\n\n  if (!navigator.mediaDevices) {\n    navigator.mediaDevices = {\n      getUserMedia: getUserMediaPromise_,\n      enumerateDevices: function() {\n        return new Promise(function(resolve) {\n          var kinds = {audio: 'audioinput', video: 'videoinput'};\n          return MediaStreamTrack.getSources(function(devices) {\n            resolve(devices.map(function(device) {\n              return {label: device.label,\n                      kind: kinds[device.kind],\n                      deviceId: device.id,\n                      groupId: ''};\n            }));\n          });\n        });\n      }\n    };\n  }\n\n  // A shim for getUserMedia method on the mediaDevices object.\n  // TODO(KaptenJansson) remove once implemented in Chrome stable.\n  if (!navigator.mediaDevices.getUserMedia) {\n    navigator.mediaDevices.getUserMedia = function(constraints) {\n      return getUserMediaPromise_(constraints);\n    };\n  } else {\n    // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n    // function which returns a Promise, it does not accept spec-style\n    // constraints.\n    var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n        bind(navigator.mediaDevices);\n    navigator.mediaDevices.getUserMedia = function(cs) {\n      return shimConstraints_(cs, function(c) {\n        return origGetUserMedia(c).catch(function(e) {\n          return Promise.reject(shimError_(e));\n        });\n      });\n    };\n  }\n\n  // Dummy devicechange event methods.\n  // TODO(KaptenJansson) remove once implemented in Chrome stable.\n  if (typeof navigator.mediaDevices.addEventListener === 'undefined') {\n    navigator.mediaDevices.addEventListener = function() {\n      logging('Dummy mediaDevices.addEventListener called.');\n    };\n  }\n  if (typeof navigator.mediaDevices.removeEventListener === 'undefined') {\n    navigator.mediaDevices.removeEventListener = function() {\n      logging('Dummy mediaDevices.removeEventListener called.');\n    };\n  }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDgxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy90cmFjZWFibGVwZWVyY29ubmVjdGlvbi9ub2RlX21vZHVsZXMvd2VicnRjLWFkYXB0ZXIvc3JjL2pzL2Nocm9tZS9nZXR1c2VybWVkaWEuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqICBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFdlYlJUQyBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2VcbiAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2VcbiAqICB0cmVlLlxuICovXG4gLyogZXNsaW50LWVudiBub2RlICovXG4ndXNlIHN0cmljdCc7XG52YXIgbG9nZ2luZyA9IHJlcXVpcmUoJy4uL3V0aWxzLmpzJykubG9nO1xuXG4vLyBFeHBvc2UgcHVibGljIG1ldGhvZHMuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY29uc3RyYWludHNUb0Nocm9tZV8gPSBmdW5jdGlvbihjKSB7XG4gICAgaWYgKHR5cGVvZiBjICE9PSAnb2JqZWN0JyB8fCBjLm1hbmRhdG9yeSB8fCBjLm9wdGlvbmFsKSB7XG4gICAgICByZXR1cm4gYztcbiAgICB9XG4gICAgdmFyIGNjID0ge307XG4gICAgT2JqZWN0LmtleXMoYykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgIGlmIChrZXkgPT09ICdyZXF1aXJlJyB8fCBrZXkgPT09ICdhZHZhbmNlZCcgfHwga2V5ID09PSAnbWVkaWFTb3VyY2UnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciByID0gKHR5cGVvZiBjW2tleV0gPT09ICdvYmplY3QnKSA/IGNba2V5XSA6IHtpZGVhbDogY1trZXldfTtcbiAgICAgIGlmIChyLmV4YWN0ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHIuZXhhY3QgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHIubWluID0gci5tYXggPSByLmV4YWN0O1xuICAgICAgfVxuICAgICAgdmFyIG9sZG5hbWVfID0gZnVuY3Rpb24ocHJlZml4LCBuYW1lKSB7XG4gICAgICAgIGlmIChwcmVmaXgpIHtcbiAgICAgICAgICByZXR1cm4gcHJlZml4ICsgbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChuYW1lID09PSAnZGV2aWNlSWQnKSA/ICdzb3VyY2VJZCcgOiBuYW1lO1xuICAgICAgfTtcbiAgICAgIGlmIChyLmlkZWFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2Mub3B0aW9uYWwgPSBjYy5vcHRpb25hbCB8fCBbXTtcbiAgICAgICAgdmFyIG9jID0ge307XG4gICAgICAgIGlmICh0eXBlb2Ygci5pZGVhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBvY1tvbGRuYW1lXygnbWluJywga2V5KV0gPSByLmlkZWFsO1xuICAgICAgICAgIGNjLm9wdGlvbmFsLnB1c2gob2MpO1xuICAgICAgICAgIG9jID0ge307XG4gICAgICAgICAgb2Nbb2xkbmFtZV8oJ21heCcsIGtleSldID0gci5pZGVhbDtcbiAgICAgICAgICBjYy5vcHRpb25hbC5wdXNoKG9jKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvY1tvbGRuYW1lXygnJywga2V5KV0gPSByLmlkZWFsO1xuICAgICAgICAgIGNjLm9wdGlvbmFsLnB1c2gob2MpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoci5leGFjdCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiByLmV4YWN0ICE9PSAnbnVtYmVyJykge1xuICAgICAgICBjYy5tYW5kYXRvcnkgPSBjYy5tYW5kYXRvcnkgfHwge307XG4gICAgICAgIGNjLm1hbmRhdG9yeVtvbGRuYW1lXygnJywga2V5KV0gPSByLmV4YWN0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgWydtaW4nLCAnbWF4J10uZm9yRWFjaChmdW5jdGlvbihtaXgpIHtcbiAgICAgICAgICBpZiAoclttaXhdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNjLm1hbmRhdG9yeSA9IGNjLm1hbmRhdG9yeSB8fCB7fTtcbiAgICAgICAgICAgIGNjLm1hbmRhdG9yeVtvbGRuYW1lXyhtaXgsIGtleSldID0gclttaXhdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGMuYWR2YW5jZWQpIHtcbiAgICAgIGNjLm9wdGlvbmFsID0gKGNjLm9wdGlvbmFsIHx8IFtdKS5jb25jYXQoYy5hZHZhbmNlZCk7XG4gICAgfVxuICAgIHJldHVybiBjYztcbiAgfTtcblxuICB2YXIgc2hpbUNvbnN0cmFpbnRzXyA9IGZ1bmN0aW9uKGNvbnN0cmFpbnRzLCBmdW5jKSB7XG4gICAgY29uc3RyYWludHMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNvbnN0cmFpbnRzKSk7XG4gICAgaWYgKGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLmF1ZGlvKSB7XG4gICAgICBjb25zdHJhaW50cy5hdWRpbyA9IGNvbnN0cmFpbnRzVG9DaHJvbWVfKGNvbnN0cmFpbnRzLmF1ZGlvKTtcbiAgICB9XG4gICAgaWYgKGNvbnN0cmFpbnRzICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlbyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8vIFNoaW0gZmFjaW5nTW9kZSBmb3IgbW9iaWxlLCB3aGVyZSBpdCBkZWZhdWx0cyB0byBcInVzZXJcIi5cbiAgICAgIHZhciBmYWNlID0gY29uc3RyYWludHMudmlkZW8uZmFjaW5nTW9kZTtcbiAgICAgIGZhY2UgPSBmYWNlICYmICgodHlwZW9mIGZhY2UgPT09ICdvYmplY3QnKSA/IGZhY2UgOiB7aWRlYWw6IGZhY2V9KTtcblxuICAgICAgaWYgKChmYWNlICYmIChmYWNlLmV4YWN0ID09PSAndXNlcicgfHwgZmFjZS5leGFjdCA9PT0gJ2Vudmlyb25tZW50JyB8fFxuICAgICAgICAgICAgICAgICAgICBmYWNlLmlkZWFsID09PSAndXNlcicgfHwgZmFjZS5pZGVhbCA9PT0gJ2Vudmlyb25tZW50JykpICYmXG4gICAgICAgICAgIShuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFN1cHBvcnRlZENvbnN0cmFpbnRzICYmXG4gICAgICAgICAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFN1cHBvcnRlZENvbnN0cmFpbnRzKCkuZmFjaW5nTW9kZSkpIHtcbiAgICAgICAgZGVsZXRlIGNvbnN0cmFpbnRzLnZpZGVvLmZhY2luZ01vZGU7XG4gICAgICAgIGlmIChmYWNlLmV4YWN0ID09PSAnZW52aXJvbm1lbnQnIHx8IGZhY2UuaWRlYWwgPT09ICdlbnZpcm9ubWVudCcpIHtcbiAgICAgICAgICAvLyBMb29rIGZvciBcImJhY2tcIiBpbiBsYWJlbCwgb3IgdXNlIGxhc3QgY2FtICh0eXBpY2FsbHkgYmFjayBjYW0pLlxuICAgICAgICAgIHJldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKVxuICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGRldmljZXMpIHtcbiAgICAgICAgICAgIGRldmljZXMgPSBkZXZpY2VzLmZpbHRlcihmdW5jdGlvbihkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkLmtpbmQgPT09ICd2aWRlb2lucHV0JztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIGJhY2sgPSBkZXZpY2VzLmZpbmQoZnVuY3Rpb24oZCkge1xuICAgICAgICAgICAgICByZXR1cm4gZC5sYWJlbC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2JhY2snKSAhPT0gLTE7XG4gICAgICAgICAgICB9KSB8fCAoZGV2aWNlcy5sZW5ndGggJiYgZGV2aWNlc1tkZXZpY2VzLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICAgIGlmIChiYWNrKSB7XG4gICAgICAgICAgICAgIGNvbnN0cmFpbnRzLnZpZGVvLmRldmljZUlkID0gZmFjZS5leGFjdCA/IHtleGFjdDogYmFjay5kZXZpY2VJZH0gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWRlYWw6IGJhY2suZGV2aWNlSWR9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3RyYWludHMudmlkZW8gPSBjb25zdHJhaW50c1RvQ2hyb21lXyhjb25zdHJhaW50cy52aWRlbyk7XG4gICAgICAgICAgICBsb2dnaW5nKCdjaHJvbWU6ICcgKyBKU09OLnN0cmluZ2lmeShjb25zdHJhaW50cykpO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmMoY29uc3RyYWludHMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdHJhaW50cy52aWRlbyA9IGNvbnN0cmFpbnRzVG9DaHJvbWVfKGNvbnN0cmFpbnRzLnZpZGVvKTtcbiAgICB9XG4gICAgbG9nZ2luZygnY2hyb21lOiAnICsgSlNPTi5zdHJpbmdpZnkoY29uc3RyYWludHMpKTtcbiAgICByZXR1cm4gZnVuYyhjb25zdHJhaW50cyk7XG4gIH07XG5cbiAgdmFyIHNoaW1FcnJvcl8gPSBmdW5jdGlvbihlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHtcbiAgICAgICAgUGVybWlzc2lvbkRlbmllZEVycm9yOiAnTm90QWxsb3dlZEVycm9yJyxcbiAgICAgICAgQ29uc3RyYWludE5vdFNhdGlzZmllZEVycm9yOiAnT3ZlcmNvbnN0cmFpbmVkRXJyb3InXG4gICAgICB9W2UubmFtZV0gfHwgZS5uYW1lLFxuICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgY29uc3RyYWludDogZS5jb25zdHJhaW50TmFtZSxcbiAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZSArICh0aGlzLm1lc3NhZ2UgJiYgJzogJykgKyB0aGlzLm1lc3NhZ2U7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICB2YXIgZ2V0VXNlck1lZGlhXyA9IGZ1bmN0aW9uKGNvbnN0cmFpbnRzLCBvblN1Y2Nlc3MsIG9uRXJyb3IpIHtcbiAgICBzaGltQ29uc3RyYWludHNfKGNvbnN0cmFpbnRzLCBmdW5jdGlvbihjKSB7XG4gICAgICBuYXZpZ2F0b3Iud2Via2l0R2V0VXNlck1lZGlhKGMsIG9uU3VjY2VzcywgZnVuY3Rpb24oZSkge1xuICAgICAgICBvbkVycm9yKHNoaW1FcnJvcl8oZSkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgbmF2aWdhdG9yLmdldFVzZXJNZWRpYSA9IGdldFVzZXJNZWRpYV87XG5cbiAgLy8gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGdldFVzZXJNZWRpYSBhcyBhIFByb21pc2UuXG4gIHZhciBnZXRVc2VyTWVkaWFQcm9taXNlXyA9IGZ1bmN0aW9uKGNvbnN0cmFpbnRzKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgbmF2aWdhdG9yLmdldFVzZXJNZWRpYShjb25zdHJhaW50cywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICB9KTtcbiAgfTtcblxuICBpZiAoIW5hdmlnYXRvci5tZWRpYURldmljZXMpIHtcbiAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzID0ge1xuICAgICAgZ2V0VXNlck1lZGlhOiBnZXRVc2VyTWVkaWFQcm9taXNlXyxcbiAgICAgIGVudW1lcmF0ZURldmljZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSkge1xuICAgICAgICAgIHZhciBraW5kcyA9IHthdWRpbzogJ2F1ZGlvaW5wdXQnLCB2aWRlbzogJ3ZpZGVvaW5wdXQnfTtcbiAgICAgICAgICByZXR1cm4gTWVkaWFTdHJlYW1UcmFjay5nZXRTb3VyY2VzKGZ1bmN0aW9uKGRldmljZXMpIHtcbiAgICAgICAgICAgIHJlc29sdmUoZGV2aWNlcy5tYXAoZnVuY3Rpb24oZGV2aWNlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7bGFiZWw6IGRldmljZS5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICBraW5kOiBraW5kc1tkZXZpY2Uua2luZF0sXG4gICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQ6IGRldmljZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICBncm91cElkOiAnJ307XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBBIHNoaW0gZm9yIGdldFVzZXJNZWRpYSBtZXRob2Qgb24gdGhlIG1lZGlhRGV2aWNlcyBvYmplY3QuXG4gIC8vIFRPRE8oS2FwdGVuSmFuc3NvbikgcmVtb3ZlIG9uY2UgaW1wbGVtZW50ZWQgaW4gQ2hyb21lIHN0YWJsZS5cbiAgaWYgKCFuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSkge1xuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhID0gZnVuY3Rpb24oY29uc3RyYWludHMpIHtcbiAgICAgIHJldHVybiBnZXRVc2VyTWVkaWFQcm9taXNlXyhjb25zdHJhaW50cyk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBFdmVuIHRob3VnaCBDaHJvbWUgNDUgaGFzIG5hdmlnYXRvci5tZWRpYURldmljZXMgYW5kIGEgZ2V0VXNlck1lZGlhXG4gICAgLy8gZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhIFByb21pc2UsIGl0IGRvZXMgbm90IGFjY2VwdCBzcGVjLXN0eWxlXG4gICAgLy8gY29uc3RyYWludHMuXG4gICAgdmFyIG9yaWdHZXRVc2VyTWVkaWEgPSBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYS5cbiAgICAgICAgYmluZChuYXZpZ2F0b3IubWVkaWFEZXZpY2VzKTtcbiAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSA9IGZ1bmN0aW9uKGNzKSB7XG4gICAgICByZXR1cm4gc2hpbUNvbnN0cmFpbnRzXyhjcywgZnVuY3Rpb24oYykge1xuICAgICAgICByZXR1cm4gb3JpZ0dldFVzZXJNZWRpYShjKS5jYXRjaChmdW5jdGlvbihlKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHNoaW1FcnJvcl8oZSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICAvLyBEdW1teSBkZXZpY2VjaGFuZ2UgZXZlbnQgbWV0aG9kcy5cbiAgLy8gVE9ETyhLYXB0ZW5KYW5zc29uKSByZW1vdmUgb25jZSBpbXBsZW1lbnRlZCBpbiBDaHJvbWUgc3RhYmxlLlxuICBpZiAodHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgIGxvZ2dpbmcoJ0R1bW15IG1lZGlhRGV2aWNlcy5hZGRFdmVudExpc3RlbmVyIGNhbGxlZC4nKTtcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5yZW1vdmVFdmVudExpc3RlbmVyID09PSAndW5kZWZpbmVkJykge1xuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKCkge1xuICAgICAgbG9nZ2luZygnRHVtbXkgbWVkaWFEZXZpY2VzLnJlbW92ZUV2ZW50TGlzdGVuZXIgY2FsbGVkLicpO1xuICAgIH07XG4gIH1cbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdHJhY2VhYmxlcGVlcmNvbm5lY3Rpb24vfi93ZWJydGMtYWRhcHRlci9zcmMvanMvY2hyb21lL2dldHVzZXJtZWRpYS5qc1xuLy8gbW9kdWxlIGlkID0gNDgxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 482 */
/***/ function(module, exports, __webpack_require__) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar SDPUtils = __webpack_require__(452);\nvar logging = __webpack_require__(479).log;\n\nvar edgeShim = {\n  shimPeerConnection: function() {\n    if (window.RTCIceGatherer) {\n      // ORTC defines an RTCIceCandidate object but no constructor.\n      // Not implemented in Edge.\n      if (!window.RTCIceCandidate) {\n        window.RTCIceCandidate = function(args) {\n          return args;\n        };\n      }\n      // ORTC does not have a session description object but\n      // other browsers (i.e. Chrome) that will support both PC and ORTC\n      // in the future might have this defined already.\n      if (!window.RTCSessionDescription) {\n        window.RTCSessionDescription = function(args) {\n          return args;\n        };\n      }\n    }\n\n    window.RTCPeerConnection = function(config) {\n      var self = this;\n\n      var _eventTarget = document.createDocumentFragment();\n      ['addEventListener', 'removeEventListener', 'dispatchEvent']\n          .forEach(function(method) {\n            self[method] = _eventTarget[method].bind(_eventTarget);\n          });\n\n      this.onicecandidate = null;\n      this.onaddstream = null;\n      this.ontrack = null;\n      this.onremovestream = null;\n      this.onsignalingstatechange = null;\n      this.oniceconnectionstatechange = null;\n      this.onnegotiationneeded = null;\n      this.ondatachannel = null;\n\n      this.localStreams = [];\n      this.remoteStreams = [];\n      this.getLocalStreams = function() {\n        return self.localStreams;\n      };\n      this.getRemoteStreams = function() {\n        return self.remoteStreams;\n      };\n\n      this.localDescription = new RTCSessionDescription({\n        type: '',\n        sdp: ''\n      });\n      this.remoteDescription = new RTCSessionDescription({\n        type: '',\n        sdp: ''\n      });\n      this.signalingState = 'stable';\n      this.iceConnectionState = 'new';\n      this.iceGatheringState = 'new';\n\n      this.iceOptions = {\n        gatherPolicy: 'all',\n        iceServers: []\n      };\n      if (config && config.iceTransportPolicy) {\n        switch (config.iceTransportPolicy) {\n          case 'all':\n          case 'relay':\n            this.iceOptions.gatherPolicy = config.iceTransportPolicy;\n            break;\n          case 'none':\n            // FIXME: remove once implementation and spec have added this.\n            throw new TypeError('iceTransportPolicy \"none\" not supported');\n          default:\n            // don't set iceTransportPolicy.\n            break;\n        }\n      }\n      this.usingBundle = config && config.bundlePolicy === 'max-bundle';\n\n      if (config && config.iceServers) {\n        // Edge does not like\n        // 1) stun:\n        // 2) turn: that does not have all of turn:host:port?transport=udp\n        var iceServers = JSON.parse(JSON.stringify(config.iceServers));\n        this.iceOptions.iceServers = iceServers.filter(function(server) {\n          if (server && server.urls) {\n            var urls = server.urls;\n            if (typeof urls === 'string') {\n              urls = [urls];\n            }\n            urls = urls.filter(function(url) {\n              return url.indexOf('turn:') === 0 &&\n                  url.indexOf('transport=udp') !== -1;\n            })[0];\n            return !!urls;\n          }\n          return false;\n        });\n      }\n\n      // per-track iceGathers, iceTransports, dtlsTransports, rtpSenders, ...\n      // everything that is needed to describe a SDP m-line.\n      this.transceivers = [];\n\n      // since the iceGatherer is currently created in createOffer but we\n      // must not emit candidates until after setLocalDescription we buffer\n      // them in this array.\n      this._localIceCandidatesBuffer = [];\n    };\n\n    window.RTCPeerConnection.prototype._emitBufferedCandidates = function() {\n      var self = this;\n      var sections = SDPUtils.splitSections(self.localDescription.sdp);\n      // FIXME: need to apply ice candidates in a way which is async but\n      // in-order\n      this._localIceCandidatesBuffer.forEach(function(event) {\n        var end = !event.candidate || Object.keys(event.candidate).length === 0;\n        if (end) {\n          for (var j = 1; j < sections.length; j++) {\n            if (sections[j].indexOf('\\r\\na=end-of-candidates\\r\\n') === -1) {\n              sections[j] += 'a=end-of-candidates\\r\\n';\n            }\n          }\n        } else if (event.candidate.candidate.indexOf('typ endOfCandidates')\n            === -1) {\n          sections[event.candidate.sdpMLineIndex + 1] +=\n              'a=' + event.candidate.candidate + '\\r\\n';\n        }\n        self.localDescription.sdp = sections.join('');\n        self.dispatchEvent(event);\n        if (self.onicecandidate !== null) {\n          self.onicecandidate(event);\n        }\n        if (!event.candidate && self.iceGatheringState !== 'complete') {\n          var complete = self.transceivers.every(function(transceiver) {\n            return transceiver.iceGatherer &&\n                transceiver.iceGatherer.state === 'completed';\n          });\n          if (complete) {\n            self.iceGatheringState = 'complete';\n          }\n        }\n      });\n      this._localIceCandidatesBuffer = [];\n    };\n\n    window.RTCPeerConnection.prototype.addStream = function(stream) {\n      // Clone is necessary for local demos mostly, attaching directly\n      // to two different senders does not work (build 10547).\n      this.localStreams.push(stream.clone());\n      this._maybeFireNegotiationNeeded();\n    };\n\n    window.RTCPeerConnection.prototype.removeStream = function(stream) {\n      var idx = this.localStreams.indexOf(stream);\n      if (idx > -1) {\n        this.localStreams.splice(idx, 1);\n        this._maybeFireNegotiationNeeded();\n      }\n    };\n\n    window.RTCPeerConnection.prototype.getSenders = function() {\n      return this.transceivers.filter(function(transceiver) {\n        return !!transceiver.rtpSender;\n      })\n      .map(function(transceiver) {\n        return transceiver.rtpSender;\n      });\n    };\n\n    window.RTCPeerConnection.prototype.getReceivers = function() {\n      return this.transceivers.filter(function(transceiver) {\n        return !!transceiver.rtpReceiver;\n      })\n      .map(function(transceiver) {\n        return transceiver.rtpReceiver;\n      });\n    };\n\n    // Determines the intersection of local and remote capabilities.\n    window.RTCPeerConnection.prototype._getCommonCapabilities =\n        function(localCapabilities, remoteCapabilities) {\n          var commonCapabilities = {\n            codecs: [],\n            headerExtensions: [],\n            fecMechanisms: []\n          };\n          localCapabilities.codecs.forEach(function(lCodec) {\n            for (var i = 0; i < remoteCapabilities.codecs.length; i++) {\n              var rCodec = remoteCapabilities.codecs[i];\n              if (lCodec.name.toLowerCase() === rCodec.name.toLowerCase() &&\n                  lCodec.clockRate === rCodec.clockRate &&\n                  lCodec.numChannels === rCodec.numChannels) {\n                // push rCodec so we reply with offerer payload type\n                commonCapabilities.codecs.push(rCodec);\n\n                // FIXME: also need to determine intersection between\n                // .rtcpFeedback and .parameters\n                break;\n              }\n            }\n          });\n\n          localCapabilities.headerExtensions\n              .forEach(function(lHeaderExtension) {\n                for (var i = 0; i < remoteCapabilities.headerExtensions.length;\n                     i++) {\n                  var rHeaderExtension = remoteCapabilities.headerExtensions[i];\n                  if (lHeaderExtension.uri === rHeaderExtension.uri) {\n                    commonCapabilities.headerExtensions.push(rHeaderExtension);\n                    break;\n                  }\n                }\n              });\n\n          // FIXME: fecMechanisms\n          return commonCapabilities;\n        };\n\n    // Create ICE gatherer, ICE transport and DTLS transport.\n    window.RTCPeerConnection.prototype._createIceAndDtlsTransports =\n        function(mid, sdpMLineIndex) {\n          var self = this;\n          var iceGatherer = new RTCIceGatherer(self.iceOptions);\n          var iceTransport = new RTCIceTransport(iceGatherer);\n          iceGatherer.onlocalcandidate = function(evt) {\n            var event = new Event('icecandidate');\n            event.candidate = {sdpMid: mid, sdpMLineIndex: sdpMLineIndex};\n\n            var cand = evt.candidate;\n            var end = !cand || Object.keys(cand).length === 0;\n            // Edge emits an empty object for RTCIceCandidateComplete‥\n            if (end) {\n              // polyfill since RTCIceGatherer.state is not implemented in\n              // Edge 10547 yet.\n              if (iceGatherer.state === undefined) {\n                iceGatherer.state = 'completed';\n              }\n\n              // Emit a candidate with type endOfCandidates to make the samples\n              // work. Edge requires addIceCandidate with this empty candidate\n              // to start checking. The real solution is to signal\n              // end-of-candidates to the other side when getting the null\n              // candidate but some apps (like the samples) don't do that.\n              event.candidate.candidate =\n                  'candidate:1 1 udp 1 0.0.0.0 9 typ endOfCandidates';\n            } else {\n              // RTCIceCandidate doesn't have a component, needs to be added\n              cand.component = iceTransport.component === 'RTCP' ? 2 : 1;\n              event.candidate.candidate = SDPUtils.writeCandidate(cand);\n            }\n\n            // update local description.\n            var sections = SDPUtils.splitSections(self.localDescription.sdp);\n            if (event.candidate.candidate.indexOf('typ endOfCandidates')\n                === -1) {\n              sections[event.candidate.sdpMLineIndex + 1] +=\n                  'a=' + event.candidate.candidate + '\\r\\n';\n            } else {\n              sections[event.candidate.sdpMLineIndex + 1] +=\n                  'a=end-of-candidates\\r\\n';\n            }\n            self.localDescription.sdp = sections.join('');\n\n            var complete = self.transceivers.every(function(transceiver) {\n              return transceiver.iceGatherer &&\n                  transceiver.iceGatherer.state === 'completed';\n            });\n\n            // Emit candidate if localDescription is set.\n            // Also emits null candidate when all gatherers are complete.\n            switch (self.iceGatheringState) {\n              case 'new':\n                self._localIceCandidatesBuffer.push(event);\n                if (end && complete) {\n                  self._localIceCandidatesBuffer.push(\n                      new Event('icecandidate'));\n                }\n                break;\n              case 'gathering':\n                self._emitBufferedCandidates();\n                self.dispatchEvent(event);\n                if (self.onicecandidate !== null) {\n                  self.onicecandidate(event);\n                }\n                if (complete) {\n                  self.dispatchEvent(new Event('icecandidate'));\n                  if (self.onicecandidate !== null) {\n                    self.onicecandidate(new Event('icecandidate'));\n                  }\n                  self.iceGatheringState = 'complete';\n                }\n                break;\n              case 'complete':\n                // should not happen... currently!\n                break;\n              default: // no-op.\n                break;\n            }\n          };\n          iceTransport.onicestatechange = function() {\n            self._updateConnectionState();\n          };\n\n          var dtlsTransport = new RTCDtlsTransport(iceTransport);\n          dtlsTransport.ondtlsstatechange = function() {\n            self._updateConnectionState();\n          };\n          dtlsTransport.onerror = function() {\n            // onerror does not set state to failed by itself.\n            dtlsTransport.state = 'failed';\n            self._updateConnectionState();\n          };\n\n          return {\n            iceGatherer: iceGatherer,\n            iceTransport: iceTransport,\n            dtlsTransport: dtlsTransport\n          };\n        };\n\n    // Start the RTP Sender and Receiver for a transceiver.\n    window.RTCPeerConnection.prototype._transceive = function(transceiver,\n        send, recv) {\n      var params = this._getCommonCapabilities(transceiver.localCapabilities,\n          transceiver.remoteCapabilities);\n      if (send && transceiver.rtpSender) {\n        params.encodings = transceiver.sendEncodingParameters;\n        params.rtcp = {\n          cname: SDPUtils.localCName\n        };\n        if (transceiver.recvEncodingParameters.length) {\n          params.rtcp.ssrc = transceiver.recvEncodingParameters[0].ssrc;\n        }\n        transceiver.rtpSender.send(params);\n      }\n      if (recv && transceiver.rtpReceiver) {\n        params.encodings = transceiver.recvEncodingParameters;\n        params.rtcp = {\n          cname: transceiver.cname\n        };\n        if (transceiver.sendEncodingParameters.length) {\n          params.rtcp.ssrc = transceiver.sendEncodingParameters[0].ssrc;\n        }\n        transceiver.rtpReceiver.receive(params);\n      }\n    };\n\n    window.RTCPeerConnection.prototype.setLocalDescription =\n        function(description) {\n          var self = this;\n          var sections;\n          var sessionpart;\n          if (description.type === 'offer') {\n            // FIXME: What was the purpose of this empty if statement?\n            // if (!this._pendingOffer) {\n            // } else {\n            if (this._pendingOffer) {\n              // VERY limited support for SDP munging. Limited to:\n              // * changing the order of codecs\n              sections = SDPUtils.splitSections(description.sdp);\n              sessionpart = sections.shift();\n              sections.forEach(function(mediaSection, sdpMLineIndex) {\n                var caps = SDPUtils.parseRtpParameters(mediaSection);\n                self._pendingOffer[sdpMLineIndex].localCapabilities = caps;\n              });\n              this.transceivers = this._pendingOffer;\n              delete this._pendingOffer;\n            }\n          } else if (description.type === 'answer') {\n            sections = SDPUtils.splitSections(self.remoteDescription.sdp);\n            sessionpart = sections.shift();\n            var isIceLite = SDPUtils.matchPrefix(sessionpart,\n                'a=ice-lite').length > 0;\n            sections.forEach(function(mediaSection, sdpMLineIndex) {\n              var transceiver = self.transceivers[sdpMLineIndex];\n              var iceGatherer = transceiver.iceGatherer;\n              var iceTransport = transceiver.iceTransport;\n              var dtlsTransport = transceiver.dtlsTransport;\n              var localCapabilities = transceiver.localCapabilities;\n              var remoteCapabilities = transceiver.remoteCapabilities;\n              var rejected = mediaSection.split('\\n', 1)[0]\n                  .split(' ', 2)[1] === '0';\n\n              if (!rejected) {\n                var remoteIceParameters = SDPUtils.getIceParameters(\n                    mediaSection, sessionpart);\n                if (isIceLite) {\n                  var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:')\n                  .map(function(cand) {\n                    return SDPUtils.parseCandidate(cand);\n                  })\n                  .filter(function(cand) {\n                    return cand.component === '1';\n                  });\n                  // ice-lite only includes host candidates in the SDP so we can\n                  // use setRemoteCandidates (which implies an\n                  // RTCIceCandidateComplete)\n                  if (cands.length) {\n                    iceTransport.setRemoteCandidates(cands);\n                  }\n                }\n                var remoteDtlsParameters = SDPUtils.getDtlsParameters(\n                    mediaSection, sessionpart);\n                if (isIceLite) {\n                  remoteDtlsParameters.role = 'server';\n                }\n\n                if (!self.usingBundle || sdpMLineIndex === 0) {\n                  iceTransport.start(iceGatherer, remoteIceParameters,\n                      isIceLite ? 'controlling' : 'controlled');\n                  dtlsTransport.start(remoteDtlsParameters);\n                }\n\n                // Calculate intersection of capabilities.\n                var params = self._getCommonCapabilities(localCapabilities,\n                    remoteCapabilities);\n\n                // Start the RTCRtpSender. The RTCRtpReceiver for this\n                // transceiver has already been started in setRemoteDescription.\n                self._transceive(transceiver,\n                    params.codecs.length > 0,\n                    false);\n              }\n            });\n          }\n\n          this.localDescription = {\n            type: description.type,\n            sdp: description.sdp\n          };\n          switch (description.type) {\n            case 'offer':\n              this._updateSignalingState('have-local-offer');\n              break;\n            case 'answer':\n              this._updateSignalingState('stable');\n              break;\n            default:\n              throw new TypeError('unsupported type \"' + description.type +\n                  '\"');\n          }\n\n          // If a success callback was provided, emit ICE candidates after it\n          // has been executed. Otherwise, emit callback after the Promise is\n          // resolved.\n          var hasCallback = arguments.length > 1 &&\n            typeof arguments[1] === 'function';\n          if (hasCallback) {\n            var cb = arguments[1];\n            window.setTimeout(function() {\n              cb();\n              if (self.iceGatheringState === 'new') {\n                self.iceGatheringState = 'gathering';\n              }\n              self._emitBufferedCandidates();\n            }, 0);\n          }\n          var p = Promise.resolve();\n          p.then(function() {\n            if (!hasCallback) {\n              if (self.iceGatheringState === 'new') {\n                self.iceGatheringState = 'gathering';\n              }\n              // Usually candidates will be emitted earlier.\n              window.setTimeout(self._emitBufferedCandidates.bind(self), 500);\n            }\n          });\n          return p;\n        };\n\n    window.RTCPeerConnection.prototype.setRemoteDescription =\n        function(description) {\n          var self = this;\n          var stream = new MediaStream();\n          var receiverList = [];\n          var sections = SDPUtils.splitSections(description.sdp);\n          var sessionpart = sections.shift();\n          var isIceLite = SDPUtils.matchPrefix(sessionpart,\n              'a=ice-lite').length > 0;\n          this.usingBundle = SDPUtils.matchPrefix(sessionpart,\n              'a=group:BUNDLE ').length > 0;\n          sections.forEach(function(mediaSection, sdpMLineIndex) {\n            var lines = SDPUtils.splitLines(mediaSection);\n            var mline = lines[0].substr(2).split(' ');\n            var kind = mline[0];\n            var rejected = mline[1] === '0';\n            var direction = SDPUtils.getDirection(mediaSection, sessionpart);\n\n            var transceiver;\n            var iceGatherer;\n            var iceTransport;\n            var dtlsTransport;\n            var rtpSender;\n            var rtpReceiver;\n            var sendEncodingParameters;\n            var recvEncodingParameters;\n            var localCapabilities;\n\n            var track;\n            // FIXME: ensure the mediaSection has rtcp-mux set.\n            var remoteCapabilities = SDPUtils.parseRtpParameters(mediaSection);\n            var remoteIceParameters;\n            var remoteDtlsParameters;\n            if (!rejected) {\n              remoteIceParameters = SDPUtils.getIceParameters(mediaSection,\n                  sessionpart);\n              remoteDtlsParameters = SDPUtils.getDtlsParameters(mediaSection,\n                  sessionpart);\n              remoteDtlsParameters.role = 'client';\n            }\n            recvEncodingParameters =\n                SDPUtils.parseRtpEncodingParameters(mediaSection);\n\n            var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:');\n            if (mid.length) {\n              mid = mid[0].substr(6);\n            } else {\n              mid = SDPUtils.generateIdentifier();\n            }\n\n            var cname;\n            // Gets the first SSRC. Note that with RTX there might be multiple\n            // SSRCs.\n            var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n                .map(function(line) {\n                  return SDPUtils.parseSsrcMedia(line);\n                })\n                .filter(function(obj) {\n                  return obj.attribute === 'cname';\n                })[0];\n            if (remoteSsrc) {\n              cname = remoteSsrc.value;\n            }\n\n            var isComplete = SDPUtils.matchPrefix(mediaSection,\n                'a=end-of-candidates').length > 0;\n            var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:')\n                .map(function(cand) {\n                  return SDPUtils.parseCandidate(cand);\n                })\n                .filter(function(cand) {\n                  return cand.component === '1';\n                });\n            if (description.type === 'offer' && !rejected) {\n              var transports = self.usingBundle && sdpMLineIndex > 0 ? {\n                iceGatherer: self.transceivers[0].iceGatherer,\n                iceTransport: self.transceivers[0].iceTransport,\n                dtlsTransport: self.transceivers[0].dtlsTransport\n              } : self._createIceAndDtlsTransports(mid, sdpMLineIndex);\n\n              if (isComplete) {\n                transports.iceTransport.setRemoteCandidates(cands);\n              }\n\n              localCapabilities = RTCRtpReceiver.getCapabilities(kind);\n              sendEncodingParameters = [{\n                ssrc: (2 * sdpMLineIndex + 2) * 1001\n              }];\n\n              rtpReceiver = new RTCRtpReceiver(transports.dtlsTransport, kind);\n\n              track = rtpReceiver.track;\n              receiverList.push([track, rtpReceiver]);\n              // FIXME: not correct when there are multiple streams but that is\n              // not currently supported in this shim.\n              stream.addTrack(track);\n\n              // FIXME: look at direction.\n              if (self.localStreams.length > 0 &&\n                  self.localStreams[0].getTracks().length >= sdpMLineIndex) {\n                // FIXME: actually more complicated, needs to match types etc\n                var localtrack = self.localStreams[0]\n                    .getTracks()[sdpMLineIndex];\n                rtpSender = new RTCRtpSender(localtrack,\n                    transports.dtlsTransport);\n              }\n\n              self.transceivers[sdpMLineIndex] = {\n                iceGatherer: transports.iceGatherer,\n                iceTransport: transports.iceTransport,\n                dtlsTransport: transports.dtlsTransport,\n                localCapabilities: localCapabilities,\n                remoteCapabilities: remoteCapabilities,\n                rtpSender: rtpSender,\n                rtpReceiver: rtpReceiver,\n                kind: kind,\n                mid: mid,\n                cname: cname,\n                sendEncodingParameters: sendEncodingParameters,\n                recvEncodingParameters: recvEncodingParameters\n              };\n              // Start the RTCRtpReceiver now. The RTPSender is started in\n              // setLocalDescription.\n              self._transceive(self.transceivers[sdpMLineIndex],\n                  false,\n                  direction === 'sendrecv' || direction === 'sendonly');\n            } else if (description.type === 'answer' && !rejected) {\n              transceiver = self.transceivers[sdpMLineIndex];\n              iceGatherer = transceiver.iceGatherer;\n              iceTransport = transceiver.iceTransport;\n              dtlsTransport = transceiver.dtlsTransport;\n              rtpSender = transceiver.rtpSender;\n              rtpReceiver = transceiver.rtpReceiver;\n              sendEncodingParameters = transceiver.sendEncodingParameters;\n              localCapabilities = transceiver.localCapabilities;\n\n              self.transceivers[sdpMLineIndex].recvEncodingParameters =\n                  recvEncodingParameters;\n              self.transceivers[sdpMLineIndex].remoteCapabilities =\n                  remoteCapabilities;\n              self.transceivers[sdpMLineIndex].cname = cname;\n\n              if ((isIceLite || isComplete) && cands.length) {\n                iceTransport.setRemoteCandidates(cands);\n              }\n              if (!self.usingBundle || sdpMLineIndex === 0) {\n                iceTransport.start(iceGatherer, remoteIceParameters,\n                    'controlling');\n                dtlsTransport.start(remoteDtlsParameters);\n              }\n\n              self._transceive(transceiver,\n                  direction === 'sendrecv' || direction === 'recvonly',\n                  direction === 'sendrecv' || direction === 'sendonly');\n\n              if (rtpReceiver &&\n                  (direction === 'sendrecv' || direction === 'sendonly')) {\n                track = rtpReceiver.track;\n                receiverList.push([track, rtpReceiver]);\n                stream.addTrack(track);\n              } else {\n                // FIXME: actually the receiver should be created later.\n                delete transceiver.rtpReceiver;\n              }\n            }\n          });\n\n          this.remoteDescription = {\n            type: description.type,\n            sdp: description.sdp\n          };\n          switch (description.type) {\n            case 'offer':\n              this._updateSignalingState('have-remote-offer');\n              break;\n            case 'answer':\n              this._updateSignalingState('stable');\n              break;\n            default:\n              throw new TypeError('unsupported type \"' + description.type +\n                  '\"');\n          }\n          if (stream.getTracks().length) {\n            self.remoteStreams.push(stream);\n            window.setTimeout(function() {\n              var event = new Event('addstream');\n              event.stream = stream;\n              self.dispatchEvent(event);\n              if (self.onaddstream !== null) {\n                window.setTimeout(function() {\n                  self.onaddstream(event);\n                }, 0);\n              }\n\n              receiverList.forEach(function(item) {\n                var track = item[0];\n                var receiver = item[1];\n                var trackEvent = new Event('track');\n                trackEvent.track = track;\n                trackEvent.receiver = receiver;\n                trackEvent.streams = [stream];\n                self.dispatchEvent(event);\n                if (self.ontrack !== null) {\n                  window.setTimeout(function() {\n                    self.ontrack(trackEvent);\n                  }, 0);\n                }\n              });\n            }, 0);\n          }\n          if (arguments.length > 1 && typeof arguments[1] === 'function') {\n            window.setTimeout(arguments[1], 0);\n          }\n          return Promise.resolve();\n        };\n\n    window.RTCPeerConnection.prototype.close = function() {\n      this.transceivers.forEach(function(transceiver) {\n        /* not yet\n        if (transceiver.iceGatherer) {\n          transceiver.iceGatherer.close();\n        }\n        */\n        if (transceiver.iceTransport) {\n          transceiver.iceTransport.stop();\n        }\n        if (transceiver.dtlsTransport) {\n          transceiver.dtlsTransport.stop();\n        }\n        if (transceiver.rtpSender) {\n          transceiver.rtpSender.stop();\n        }\n        if (transceiver.rtpReceiver) {\n          transceiver.rtpReceiver.stop();\n        }\n      });\n      // FIXME: clean up tracks, local streams, remote streams, etc\n      this._updateSignalingState('closed');\n    };\n\n    // Update the signaling state.\n    window.RTCPeerConnection.prototype._updateSignalingState =\n        function(newState) {\n          this.signalingState = newState;\n          var event = new Event('signalingstatechange');\n          this.dispatchEvent(event);\n          if (this.onsignalingstatechange !== null) {\n            this.onsignalingstatechange(event);\n          }\n        };\n\n    // Determine whether to fire the negotiationneeded event.\n    window.RTCPeerConnection.prototype._maybeFireNegotiationNeeded =\n        function() {\n          // Fire away (for now).\n          var event = new Event('negotiationneeded');\n          this.dispatchEvent(event);\n          if (this.onnegotiationneeded !== null) {\n            this.onnegotiationneeded(event);\n          }\n        };\n\n    // Update the connection state.\n    window.RTCPeerConnection.prototype._updateConnectionState = function() {\n      var self = this;\n      var newState;\n      var states = {\n        'new': 0,\n        closed: 0,\n        connecting: 0,\n        checking: 0,\n        connected: 0,\n        completed: 0,\n        failed: 0\n      };\n      this.transceivers.forEach(function(transceiver) {\n        states[transceiver.iceTransport.state]++;\n        states[transceiver.dtlsTransport.state]++;\n      });\n      // ICETransport.completed and connected are the same for this purpose.\n      states.connected += states.completed;\n\n      newState = 'new';\n      if (states.failed > 0) {\n        newState = 'failed';\n      } else if (states.connecting > 0 || states.checking > 0) {\n        newState = 'connecting';\n      } else if (states.disconnected > 0) {\n        newState = 'disconnected';\n      } else if (states.new > 0) {\n        newState = 'new';\n      } else if (states.connected > 0 || states.completed > 0) {\n        newState = 'connected';\n      }\n\n      if (newState !== self.iceConnectionState) {\n        self.iceConnectionState = newState;\n        var event = new Event('iceconnectionstatechange');\n        this.dispatchEvent(event);\n        if (this.oniceconnectionstatechange !== null) {\n          this.oniceconnectionstatechange(event);\n        }\n      }\n    };\n\n    window.RTCPeerConnection.prototype.createOffer = function() {\n      var self = this;\n      if (this._pendingOffer) {\n        throw new Error('createOffer called while there is a pending offer.');\n      }\n      var offerOptions;\n      if (arguments.length === 1 && typeof arguments[0] !== 'function') {\n        offerOptions = arguments[0];\n      } else if (arguments.length === 3) {\n        offerOptions = arguments[2];\n      }\n\n      var tracks = [];\n      var numAudioTracks = 0;\n      var numVideoTracks = 0;\n      // Default to sendrecv.\n      if (this.localStreams.length) {\n        numAudioTracks = this.localStreams[0].getAudioTracks().length;\n        numVideoTracks = this.localStreams[0].getVideoTracks().length;\n      }\n      // Determine number of audio and video tracks we need to send/recv.\n      if (offerOptions) {\n        // Reject Chrome legacy constraints.\n        if (offerOptions.mandatory || offerOptions.optional) {\n          throw new TypeError(\n              'Legacy mandatory/optional constraints not supported.');\n        }\n        if (offerOptions.offerToReceiveAudio !== undefined) {\n          numAudioTracks = offerOptions.offerToReceiveAudio;\n        }\n        if (offerOptions.offerToReceiveVideo !== undefined) {\n          numVideoTracks = offerOptions.offerToReceiveVideo;\n        }\n      }\n      if (this.localStreams.length) {\n        // Push local streams.\n        this.localStreams[0].getTracks().forEach(function(track) {\n          tracks.push({\n            kind: track.kind,\n            track: track,\n            wantReceive: track.kind === 'audio' ?\n                numAudioTracks > 0 : numVideoTracks > 0\n          });\n          if (track.kind === 'audio') {\n            numAudioTracks--;\n          } else if (track.kind === 'video') {\n            numVideoTracks--;\n          }\n        });\n      }\n      // Create M-lines for recvonly streams.\n      while (numAudioTracks > 0 || numVideoTracks > 0) {\n        if (numAudioTracks > 0) {\n          tracks.push({\n            kind: 'audio',\n            wantReceive: true\n          });\n          numAudioTracks--;\n        }\n        if (numVideoTracks > 0) {\n          tracks.push({\n            kind: 'video',\n            wantReceive: true\n          });\n          numVideoTracks--;\n        }\n      }\n\n      var sdp = SDPUtils.writeSessionBoilerplate();\n      var transceivers = [];\n      tracks.forEach(function(mline, sdpMLineIndex) {\n        // For each track, create an ice gatherer, ice transport,\n        // dtls transport, potentially rtpsender and rtpreceiver.\n        var track = mline.track;\n        var kind = mline.kind;\n        var mid = SDPUtils.generateIdentifier();\n\n        var transports = self.usingBundle && sdpMLineIndex > 0 ? {\n          iceGatherer: transceivers[0].iceGatherer,\n          iceTransport: transceivers[0].iceTransport,\n          dtlsTransport: transceivers[0].dtlsTransport\n        } : self._createIceAndDtlsTransports(mid, sdpMLineIndex);\n\n        var localCapabilities = RTCRtpSender.getCapabilities(kind);\n        var rtpSender;\n        var rtpReceiver;\n\n        // generate an ssrc now, to be used later in rtpSender.send\n        var sendEncodingParameters = [{\n          ssrc: (2 * sdpMLineIndex + 1) * 1001\n        }];\n        if (track) {\n          rtpSender = new RTCRtpSender(track, transports.dtlsTransport);\n        }\n\n        if (mline.wantReceive) {\n          rtpReceiver = new RTCRtpReceiver(transports.dtlsTransport, kind);\n        }\n\n        transceivers[sdpMLineIndex] = {\n          iceGatherer: transports.iceGatherer,\n          iceTransport: transports.iceTransport,\n          dtlsTransport: transports.dtlsTransport,\n          localCapabilities: localCapabilities,\n          remoteCapabilities: null,\n          rtpSender: rtpSender,\n          rtpReceiver: rtpReceiver,\n          kind: kind,\n          mid: mid,\n          sendEncodingParameters: sendEncodingParameters,\n          recvEncodingParameters: null\n        };\n      });\n      if (this.usingBundle) {\n        sdp += 'a=group:BUNDLE ' + transceivers.map(function(t) {\n          return t.mid;\n        }).join(' ') + '\\r\\n';\n      }\n      tracks.forEach(function(mline, sdpMLineIndex) {\n        var transceiver = transceivers[sdpMLineIndex];\n        sdp += SDPUtils.writeMediaSection(transceiver,\n            transceiver.localCapabilities, 'offer', self.localStreams[0]);\n      });\n\n      this._pendingOffer = transceivers;\n      var desc = new RTCSessionDescription({\n        type: 'offer',\n        sdp: sdp\n      });\n      if (arguments.length && typeof arguments[0] === 'function') {\n        window.setTimeout(arguments[0], 0, desc);\n      }\n      return Promise.resolve(desc);\n    };\n\n    window.RTCPeerConnection.prototype.createAnswer = function() {\n      var self = this;\n\n      var sdp = SDPUtils.writeSessionBoilerplate();\n      if (this.usingBundle) {\n        sdp += 'a=group:BUNDLE ' + this.transceivers.map(function(t) {\n          return t.mid;\n        }).join(' ') + '\\r\\n';\n      }\n      this.transceivers.forEach(function(transceiver) {\n        // Calculate intersection of capabilities.\n        var commonCapabilities = self._getCommonCapabilities(\n            transceiver.localCapabilities,\n            transceiver.remoteCapabilities);\n\n        sdp += SDPUtils.writeMediaSection(transceiver, commonCapabilities,\n            'answer', self.localStreams[0]);\n      });\n\n      var desc = new RTCSessionDescription({\n        type: 'answer',\n        sdp: sdp\n      });\n      if (arguments.length && typeof arguments[0] === 'function') {\n        window.setTimeout(arguments[0], 0, desc);\n      }\n      return Promise.resolve(desc);\n    };\n\n    window.RTCPeerConnection.prototype.addIceCandidate = function(candidate) {\n      if (candidate === null) {\n        this.transceivers.forEach(function(transceiver) {\n          transceiver.iceTransport.addRemoteCandidate({});\n        });\n      } else {\n        var mLineIndex = candidate.sdpMLineIndex;\n        if (candidate.sdpMid) {\n          for (var i = 0; i < this.transceivers.length; i++) {\n            if (this.transceivers[i].mid === candidate.sdpMid) {\n              mLineIndex = i;\n              break;\n            }\n          }\n        }\n        var transceiver = this.transceivers[mLineIndex];\n        if (transceiver) {\n          var cand = Object.keys(candidate.candidate).length > 0 ?\n              SDPUtils.parseCandidate(candidate.candidate) : {};\n          // Ignore Chrome's invalid candidates since Edge does not like them.\n          if (cand.protocol === 'tcp' && cand.port === 0) {\n            return;\n          }\n          // Ignore RTCP candidates, we assume RTCP-MUX.\n          if (cand.component !== '1') {\n            return;\n          }\n          // A dirty hack to make samples work.\n          if (cand.type === 'endOfCandidates') {\n            cand = {};\n          }\n          transceiver.iceTransport.addRemoteCandidate(cand);\n\n          // update the remoteDescription.\n          var sections = SDPUtils.splitSections(this.remoteDescription.sdp);\n          sections[mLineIndex + 1] += (cand.type ? candidate.candidate.trim()\n              : 'a=end-of-candidates') + '\\r\\n';\n          this.remoteDescription.sdp = sections.join('');\n        }\n      }\n      if (arguments.length > 1 && typeof arguments[1] === 'function') {\n        window.setTimeout(arguments[1], 0);\n      }\n      return Promise.resolve();\n    };\n\n    window.RTCPeerConnection.prototype.getStats = function() {\n      var promises = [];\n      this.transceivers.forEach(function(transceiver) {\n        ['rtpSender', 'rtpReceiver', 'iceGatherer', 'iceTransport',\n            'dtlsTransport'].forEach(function(method) {\n              if (transceiver[method]) {\n                promises.push(transceiver[method].getStats());\n              }\n            });\n      });\n      var cb = arguments.length > 1 && typeof arguments[1] === 'function' &&\n          arguments[1];\n      return new Promise(function(resolve) {\n        // shim getStats with maplike support\n        var results = new Map();\n        Promise.all(promises).then(function(res) {\n          res.forEach(function(result) {\n            Object.keys(result).forEach(function(id) {\n              results.set(id, result[id]);\n              results[id] = result[id];\n            });\n          });\n          if (cb) {\n            window.setTimeout(cb, 0, results);\n          }\n          resolve(results);\n        });\n      });\n    };\n  },\n\n  // Attach a media stream to an element.\n  attachMediaStream: function(element, stream) {\n    logging('DEPRECATED, attachMediaStream will soon be removed.');\n    element.srcObject = stream;\n  },\n\n  reattachMediaStream: function(to, from) {\n    logging('DEPRECATED, reattachMediaStream will soon be removed.');\n    to.srcObject = from.srcObject;\n  }\n};\n\n// Expose public methods.\nmodule.exports = {\n  shimPeerConnection: edgeShim.shimPeerConnection,\n  shimGetUserMedia: __webpack_require__(483),\n  attachMediaStream: edgeShim.attachMediaStream,\n  reattachMediaStream: edgeShim.reattachMediaStream\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDgyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy90cmFjZWFibGVwZWVyY29ubmVjdGlvbi9ub2RlX21vZHVsZXMvd2VicnRjLWFkYXB0ZXIvc3JjL2pzL2VkZ2UvZWRnZV9zaGltLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiAgQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBXZWJSVEMgcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlXG4gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlXG4gKiAgdHJlZS5cbiAqL1xuIC8qIGVzbGludC1lbnYgbm9kZSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgU0RQVXRpbHMgPSByZXF1aXJlKCdzZHAnKTtcbnZhciBsb2dnaW5nID0gcmVxdWlyZSgnLi4vdXRpbHMnKS5sb2c7XG5cbnZhciBlZGdlU2hpbSA9IHtcbiAgc2hpbVBlZXJDb25uZWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICBpZiAod2luZG93LlJUQ0ljZUdhdGhlcmVyKSB7XG4gICAgICAvLyBPUlRDIGRlZmluZXMgYW4gUlRDSWNlQ2FuZGlkYXRlIG9iamVjdCBidXQgbm8gY29uc3RydWN0b3IuXG4gICAgICAvLyBOb3QgaW1wbGVtZW50ZWQgaW4gRWRnZS5cbiAgICAgIGlmICghd2luZG93LlJUQ0ljZUNhbmRpZGF0ZSkge1xuICAgICAgICB3aW5kb3cuUlRDSWNlQ2FuZGlkYXRlID0gZnVuY3Rpb24oYXJncykge1xuICAgICAgICAgIHJldHVybiBhcmdzO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8gT1JUQyBkb2VzIG5vdCBoYXZlIGEgc2Vzc2lvbiBkZXNjcmlwdGlvbiBvYmplY3QgYnV0XG4gICAgICAvLyBvdGhlciBicm93c2VycyAoaS5lLiBDaHJvbWUpIHRoYXQgd2lsbCBzdXBwb3J0IGJvdGggUEMgYW5kIE9SVENcbiAgICAgIC8vIGluIHRoZSBmdXR1cmUgbWlnaHQgaGF2ZSB0aGlzIGRlZmluZWQgYWxyZWFkeS5cbiAgICAgIGlmICghd2luZG93LlJUQ1Nlc3Npb25EZXNjcmlwdGlvbikge1xuICAgICAgICB3aW5kb3cuUlRDU2Vzc2lvbkRlc2NyaXB0aW9uID0gZnVuY3Rpb24oYXJncykge1xuICAgICAgICAgIHJldHVybiBhcmdzO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKGNvbmZpZykge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICB2YXIgX2V2ZW50VGFyZ2V0ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgWydhZGRFdmVudExpc3RlbmVyJywgJ3JlbW92ZUV2ZW50TGlzdGVuZXInLCAnZGlzcGF0Y2hFdmVudCddXG4gICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICAgICAgICBzZWxmW21ldGhvZF0gPSBfZXZlbnRUYXJnZXRbbWV0aG9kXS5iaW5kKF9ldmVudFRhcmdldCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgIHRoaXMub25pY2VjYW5kaWRhdGUgPSBudWxsO1xuICAgICAgdGhpcy5vbmFkZHN0cmVhbSA9IG51bGw7XG4gICAgICB0aGlzLm9udHJhY2sgPSBudWxsO1xuICAgICAgdGhpcy5vbnJlbW92ZXN0cmVhbSA9IG51bGw7XG4gICAgICB0aGlzLm9uc2lnbmFsaW5nc3RhdGVjaGFuZ2UgPSBudWxsO1xuICAgICAgdGhpcy5vbmljZWNvbm5lY3Rpb25zdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICB0aGlzLm9ubmVnb3RpYXRpb25uZWVkZWQgPSBudWxsO1xuICAgICAgdGhpcy5vbmRhdGFjaGFubmVsID0gbnVsbDtcblxuICAgICAgdGhpcy5sb2NhbFN0cmVhbXMgPSBbXTtcbiAgICAgIHRoaXMucmVtb3RlU3RyZWFtcyA9IFtdO1xuICAgICAgdGhpcy5nZXRMb2NhbFN0cmVhbXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYubG9jYWxTdHJlYW1zO1xuICAgICAgfTtcbiAgICAgIHRoaXMuZ2V0UmVtb3RlU3RyZWFtcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc2VsZi5yZW1vdGVTdHJlYW1zO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5sb2NhbERlc2NyaXB0aW9uID0gbmV3IFJUQ1Nlc3Npb25EZXNjcmlwdGlvbih7XG4gICAgICAgIHR5cGU6ICcnLFxuICAgICAgICBzZHA6ICcnXG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVtb3RlRGVzY3JpcHRpb24gPSBuZXcgUlRDU2Vzc2lvbkRlc2NyaXB0aW9uKHtcbiAgICAgICAgdHlwZTogJycsXG4gICAgICAgIHNkcDogJydcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zaWduYWxpbmdTdGF0ZSA9ICdzdGFibGUnO1xuICAgICAgdGhpcy5pY2VDb25uZWN0aW9uU3RhdGUgPSAnbmV3JztcbiAgICAgIHRoaXMuaWNlR2F0aGVyaW5nU3RhdGUgPSAnbmV3JztcblxuICAgICAgdGhpcy5pY2VPcHRpb25zID0ge1xuICAgICAgICBnYXRoZXJQb2xpY3k6ICdhbGwnLFxuICAgICAgICBpY2VTZXJ2ZXJzOiBbXVxuICAgICAgfTtcbiAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLmljZVRyYW5zcG9ydFBvbGljeSkge1xuICAgICAgICBzd2l0Y2ggKGNvbmZpZy5pY2VUcmFuc3BvcnRQb2xpY3kpIHtcbiAgICAgICAgICBjYXNlICdhbGwnOlxuICAgICAgICAgIGNhc2UgJ3JlbGF5JzpcbiAgICAgICAgICAgIHRoaXMuaWNlT3B0aW9ucy5nYXRoZXJQb2xpY3kgPSBjb25maWcuaWNlVHJhbnNwb3J0UG9saWN5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgICAgICAvLyBGSVhNRTogcmVtb3ZlIG9uY2UgaW1wbGVtZW50YXRpb24gYW5kIHNwZWMgaGF2ZSBhZGRlZCB0aGlzLlxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaWNlVHJhbnNwb3J0UG9saWN5IFwibm9uZVwiIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gZG9uJ3Qgc2V0IGljZVRyYW5zcG9ydFBvbGljeS5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnVzaW5nQnVuZGxlID0gY29uZmlnICYmIGNvbmZpZy5idW5kbGVQb2xpY3kgPT09ICdtYXgtYnVuZGxlJztcblxuICAgICAgaWYgKGNvbmZpZyAmJiBjb25maWcuaWNlU2VydmVycykge1xuICAgICAgICAvLyBFZGdlIGRvZXMgbm90IGxpa2VcbiAgICAgICAgLy8gMSkgc3R1bjpcbiAgICAgICAgLy8gMikgdHVybjogdGhhdCBkb2VzIG5vdCBoYXZlIGFsbCBvZiB0dXJuOmhvc3Q6cG9ydD90cmFuc3BvcnQ9dWRwXG4gICAgICAgIHZhciBpY2VTZXJ2ZXJzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjb25maWcuaWNlU2VydmVycykpO1xuICAgICAgICB0aGlzLmljZU9wdGlvbnMuaWNlU2VydmVycyA9IGljZVNlcnZlcnMuZmlsdGVyKGZ1bmN0aW9uKHNlcnZlcikge1xuICAgICAgICAgIGlmIChzZXJ2ZXIgJiYgc2VydmVyLnVybHMpIHtcbiAgICAgICAgICAgIHZhciB1cmxzID0gc2VydmVyLnVybHM7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHVybHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIHVybHMgPSBbdXJsc107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cmxzID0gdXJscy5maWx0ZXIoZnVuY3Rpb24odXJsKSB7XG4gICAgICAgICAgICAgIHJldHVybiB1cmwuaW5kZXhPZigndHVybjonKSA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgdXJsLmluZGV4T2YoJ3RyYW5zcG9ydD11ZHAnKSAhPT0gLTE7XG4gICAgICAgICAgICB9KVswXTtcbiAgICAgICAgICAgIHJldHVybiAhIXVybHM7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHBlci10cmFjayBpY2VHYXRoZXJzLCBpY2VUcmFuc3BvcnRzLCBkdGxzVHJhbnNwb3J0cywgcnRwU2VuZGVycywgLi4uXG4gICAgICAvLyBldmVyeXRoaW5nIHRoYXQgaXMgbmVlZGVkIHRvIGRlc2NyaWJlIGEgU0RQIG0tbGluZS5cbiAgICAgIHRoaXMudHJhbnNjZWl2ZXJzID0gW107XG5cbiAgICAgIC8vIHNpbmNlIHRoZSBpY2VHYXRoZXJlciBpcyBjdXJyZW50bHkgY3JlYXRlZCBpbiBjcmVhdGVPZmZlciBidXQgd2VcbiAgICAgIC8vIG11c3Qgbm90IGVtaXQgY2FuZGlkYXRlcyB1bnRpbCBhZnRlciBzZXRMb2NhbERlc2NyaXB0aW9uIHdlIGJ1ZmZlclxuICAgICAgLy8gdGhlbSBpbiB0aGlzIGFycmF5LlxuICAgICAgdGhpcy5fbG9jYWxJY2VDYW5kaWRhdGVzQnVmZmVyID0gW107XG4gICAgfTtcblxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuX2VtaXRCdWZmZXJlZENhbmRpZGF0ZXMgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBzZWN0aW9ucyA9IFNEUFV0aWxzLnNwbGl0U2VjdGlvbnMoc2VsZi5sb2NhbERlc2NyaXB0aW9uLnNkcCk7XG4gICAgICAvLyBGSVhNRTogbmVlZCB0byBhcHBseSBpY2UgY2FuZGlkYXRlcyBpbiBhIHdheSB3aGljaCBpcyBhc3luYyBidXRcbiAgICAgIC8vIGluLW9yZGVyXG4gICAgICB0aGlzLl9sb2NhbEljZUNhbmRpZGF0ZXNCdWZmZXIuZm9yRWFjaChmdW5jdGlvbihldmVudCkge1xuICAgICAgICB2YXIgZW5kID0gIWV2ZW50LmNhbmRpZGF0ZSB8fCBPYmplY3Qua2V5cyhldmVudC5jYW5kaWRhdGUpLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgaWYgKGVuZCkge1xuICAgICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgc2VjdGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uc1tqXS5pbmRleE9mKCdcXHJcXG5hPWVuZC1vZi1jYW5kaWRhdGVzXFxyXFxuJykgPT09IC0xKSB7XG4gICAgICAgICAgICAgIHNlY3Rpb25zW2pdICs9ICdhPWVuZC1vZi1jYW5kaWRhdGVzXFxyXFxuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY2FuZGlkYXRlLmNhbmRpZGF0ZS5pbmRleE9mKCd0eXAgZW5kT2ZDYW5kaWRhdGVzJylcbiAgICAgICAgICAgID09PSAtMSkge1xuICAgICAgICAgIHNlY3Rpb25zW2V2ZW50LmNhbmRpZGF0ZS5zZHBNTGluZUluZGV4ICsgMV0gKz1cbiAgICAgICAgICAgICAgJ2E9JyArIGV2ZW50LmNhbmRpZGF0ZS5jYW5kaWRhdGUgKyAnXFxyXFxuJztcbiAgICAgICAgfVxuICAgICAgICBzZWxmLmxvY2FsRGVzY3JpcHRpb24uc2RwID0gc2VjdGlvbnMuam9pbignJyk7XG4gICAgICAgIHNlbGYuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgIGlmIChzZWxmLm9uaWNlY2FuZGlkYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgc2VsZi5vbmljZWNhbmRpZGF0ZShldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFldmVudC5jYW5kaWRhdGUgJiYgc2VsZi5pY2VHYXRoZXJpbmdTdGF0ZSAhPT0gJ2NvbXBsZXRlJykge1xuICAgICAgICAgIHZhciBjb21wbGV0ZSA9IHNlbGYudHJhbnNjZWl2ZXJzLmV2ZXJ5KGZ1bmN0aW9uKHRyYW5zY2VpdmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNjZWl2ZXIuaWNlR2F0aGVyZXIgJiZcbiAgICAgICAgICAgICAgICB0cmFuc2NlaXZlci5pY2VHYXRoZXJlci5zdGF0ZSA9PT0gJ2NvbXBsZXRlZCc7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGNvbXBsZXRlKSB7XG4gICAgICAgICAgICBzZWxmLmljZUdhdGhlcmluZ1N0YXRlID0gJ2NvbXBsZXRlJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5fbG9jYWxJY2VDYW5kaWRhdGVzQnVmZmVyID0gW107XG4gICAgfTtcblxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuYWRkU3RyZWFtID0gZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICAvLyBDbG9uZSBpcyBuZWNlc3NhcnkgZm9yIGxvY2FsIGRlbW9zIG1vc3RseSwgYXR0YWNoaW5nIGRpcmVjdGx5XG4gICAgICAvLyB0byB0d28gZGlmZmVyZW50IHNlbmRlcnMgZG9lcyBub3Qgd29yayAoYnVpbGQgMTA1NDcpLlxuICAgICAgdGhpcy5sb2NhbFN0cmVhbXMucHVzaChzdHJlYW0uY2xvbmUoKSk7XG4gICAgICB0aGlzLl9tYXliZUZpcmVOZWdvdGlhdGlvbk5lZWRlZCgpO1xuICAgIH07XG5cbiAgICB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLnJlbW92ZVN0cmVhbSA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgICAgdmFyIGlkeCA9IHRoaXMubG9jYWxTdHJlYW1zLmluZGV4T2Yoc3RyZWFtKTtcbiAgICAgIGlmIChpZHggPiAtMSkge1xuICAgICAgICB0aGlzLmxvY2FsU3RyZWFtcy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgdGhpcy5fbWF5YmVGaXJlTmVnb3RpYXRpb25OZWVkZWQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5nZXRTZW5kZXJzID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2NlaXZlcnMuZmlsdGVyKGZ1bmN0aW9uKHRyYW5zY2VpdmVyKSB7XG4gICAgICAgIHJldHVybiAhIXRyYW5zY2VpdmVyLnJ0cFNlbmRlcjtcbiAgICAgIH0pXG4gICAgICAubWFwKGZ1bmN0aW9uKHRyYW5zY2VpdmVyKSB7XG4gICAgICAgIHJldHVybiB0cmFuc2NlaXZlci5ydHBTZW5kZXI7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5nZXRSZWNlaXZlcnMgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zY2VpdmVycy5maWx0ZXIoZnVuY3Rpb24odHJhbnNjZWl2ZXIpIHtcbiAgICAgICAgcmV0dXJuICEhdHJhbnNjZWl2ZXIucnRwUmVjZWl2ZXI7XG4gICAgICB9KVxuICAgICAgLm1hcChmdW5jdGlvbih0cmFuc2NlaXZlcikge1xuICAgICAgICByZXR1cm4gdHJhbnNjZWl2ZXIucnRwUmVjZWl2ZXI7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gRGV0ZXJtaW5lcyB0aGUgaW50ZXJzZWN0aW9uIG9mIGxvY2FsIGFuZCByZW1vdGUgY2FwYWJpbGl0aWVzLlxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuX2dldENvbW1vbkNhcGFiaWxpdGllcyA9XG4gICAgICAgIGZ1bmN0aW9uKGxvY2FsQ2FwYWJpbGl0aWVzLCByZW1vdGVDYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgICB2YXIgY29tbW9uQ2FwYWJpbGl0aWVzID0ge1xuICAgICAgICAgICAgY29kZWNzOiBbXSxcbiAgICAgICAgICAgIGhlYWRlckV4dGVuc2lvbnM6IFtdLFxuICAgICAgICAgICAgZmVjTWVjaGFuaXNtczogW11cbiAgICAgICAgICB9O1xuICAgICAgICAgIGxvY2FsQ2FwYWJpbGl0aWVzLmNvZGVjcy5mb3JFYWNoKGZ1bmN0aW9uKGxDb2RlYykge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZW1vdGVDYXBhYmlsaXRpZXMuY29kZWNzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciByQ29kZWMgPSByZW1vdGVDYXBhYmlsaXRpZXMuY29kZWNzW2ldO1xuICAgICAgICAgICAgICBpZiAobENvZGVjLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gckNvZGVjLm5hbWUudG9Mb3dlckNhc2UoKSAmJlxuICAgICAgICAgICAgICAgICAgbENvZGVjLmNsb2NrUmF0ZSA9PT0gckNvZGVjLmNsb2NrUmF0ZSAmJlxuICAgICAgICAgICAgICAgICAgbENvZGVjLm51bUNoYW5uZWxzID09PSByQ29kZWMubnVtQ2hhbm5lbHMpIHtcbiAgICAgICAgICAgICAgICAvLyBwdXNoIHJDb2RlYyBzbyB3ZSByZXBseSB3aXRoIG9mZmVyZXIgcGF5bG9hZCB0eXBlXG4gICAgICAgICAgICAgICAgY29tbW9uQ2FwYWJpbGl0aWVzLmNvZGVjcy5wdXNoKHJDb2RlYyk7XG5cbiAgICAgICAgICAgICAgICAvLyBGSVhNRTogYWxzbyBuZWVkIHRvIGRldGVybWluZSBpbnRlcnNlY3Rpb24gYmV0d2VlblxuICAgICAgICAgICAgICAgIC8vIC5ydGNwRmVlZGJhY2sgYW5kIC5wYXJhbWV0ZXJzXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGxvY2FsQ2FwYWJpbGl0aWVzLmhlYWRlckV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24obEhlYWRlckV4dGVuc2lvbikge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVtb3RlQ2FwYWJpbGl0aWVzLmhlYWRlckV4dGVuc2lvbnMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgaSsrKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgckhlYWRlckV4dGVuc2lvbiA9IHJlbW90ZUNhcGFiaWxpdGllcy5oZWFkZXJFeHRlbnNpb25zW2ldO1xuICAgICAgICAgICAgICAgICAgaWYgKGxIZWFkZXJFeHRlbnNpb24udXJpID09PSBySGVhZGVyRXh0ZW5zaW9uLnVyaSkge1xuICAgICAgICAgICAgICAgICAgICBjb21tb25DYXBhYmlsaXRpZXMuaGVhZGVyRXh0ZW5zaW9ucy5wdXNoKHJIZWFkZXJFeHRlbnNpb24pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRklYTUU6IGZlY01lY2hhbmlzbXNcbiAgICAgICAgICByZXR1cm4gY29tbW9uQ2FwYWJpbGl0aWVzO1xuICAgICAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIElDRSBnYXRoZXJlciwgSUNFIHRyYW5zcG9ydCBhbmQgRFRMUyB0cmFuc3BvcnQuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5fY3JlYXRlSWNlQW5kRHRsc1RyYW5zcG9ydHMgPVxuICAgICAgICBmdW5jdGlvbihtaWQsIHNkcE1MaW5lSW5kZXgpIHtcbiAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgdmFyIGljZUdhdGhlcmVyID0gbmV3IFJUQ0ljZUdhdGhlcmVyKHNlbGYuaWNlT3B0aW9ucyk7XG4gICAgICAgICAgdmFyIGljZVRyYW5zcG9ydCA9IG5ldyBSVENJY2VUcmFuc3BvcnQoaWNlR2F0aGVyZXIpO1xuICAgICAgICAgIGljZUdhdGhlcmVyLm9ubG9jYWxjYW5kaWRhdGUgPSBmdW5jdGlvbihldnQpIHtcbiAgICAgICAgICAgIHZhciBldmVudCA9IG5ldyBFdmVudCgnaWNlY2FuZGlkYXRlJyk7XG4gICAgICAgICAgICBldmVudC5jYW5kaWRhdGUgPSB7c2RwTWlkOiBtaWQsIHNkcE1MaW5lSW5kZXg6IHNkcE1MaW5lSW5kZXh9O1xuXG4gICAgICAgICAgICB2YXIgY2FuZCA9IGV2dC5jYW5kaWRhdGU7XG4gICAgICAgICAgICB2YXIgZW5kID0gIWNhbmQgfHwgT2JqZWN0LmtleXMoY2FuZCkubGVuZ3RoID09PSAwO1xuICAgICAgICAgICAgLy8gRWRnZSBlbWl0cyBhbiBlbXB0eSBvYmplY3QgZm9yIFJUQ0ljZUNhbmRpZGF0ZUNvbXBsZXRl4oClXG4gICAgICAgICAgICBpZiAoZW5kKSB7XG4gICAgICAgICAgICAgIC8vIHBvbHlmaWxsIHNpbmNlIFJUQ0ljZUdhdGhlcmVyLnN0YXRlIGlzIG5vdCBpbXBsZW1lbnRlZCBpblxuICAgICAgICAgICAgICAvLyBFZGdlIDEwNTQ3IHlldC5cbiAgICAgICAgICAgICAgaWYgKGljZUdhdGhlcmVyLnN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpY2VHYXRoZXJlci5zdGF0ZSA9ICdjb21wbGV0ZWQnO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gRW1pdCBhIGNhbmRpZGF0ZSB3aXRoIHR5cGUgZW5kT2ZDYW5kaWRhdGVzIHRvIG1ha2UgdGhlIHNhbXBsZXNcbiAgICAgICAgICAgICAgLy8gd29yay4gRWRnZSByZXF1aXJlcyBhZGRJY2VDYW5kaWRhdGUgd2l0aCB0aGlzIGVtcHR5IGNhbmRpZGF0ZVxuICAgICAgICAgICAgICAvLyB0byBzdGFydCBjaGVja2luZy4gVGhlIHJlYWwgc29sdXRpb24gaXMgdG8gc2lnbmFsXG4gICAgICAgICAgICAgIC8vIGVuZC1vZi1jYW5kaWRhdGVzIHRvIHRoZSBvdGhlciBzaWRlIHdoZW4gZ2V0dGluZyB0aGUgbnVsbFxuICAgICAgICAgICAgICAvLyBjYW5kaWRhdGUgYnV0IHNvbWUgYXBwcyAobGlrZSB0aGUgc2FtcGxlcykgZG9uJ3QgZG8gdGhhdC5cbiAgICAgICAgICAgICAgZXZlbnQuY2FuZGlkYXRlLmNhbmRpZGF0ZSA9XG4gICAgICAgICAgICAgICAgICAnY2FuZGlkYXRlOjEgMSB1ZHAgMSAwLjAuMC4wIDkgdHlwIGVuZE9mQ2FuZGlkYXRlcyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBSVENJY2VDYW5kaWRhdGUgZG9lc24ndCBoYXZlIGEgY29tcG9uZW50LCBuZWVkcyB0byBiZSBhZGRlZFxuICAgICAgICAgICAgICBjYW5kLmNvbXBvbmVudCA9IGljZVRyYW5zcG9ydC5jb21wb25lbnQgPT09ICdSVENQJyA/IDIgOiAxO1xuICAgICAgICAgICAgICBldmVudC5jYW5kaWRhdGUuY2FuZGlkYXRlID0gU0RQVXRpbHMud3JpdGVDYW5kaWRhdGUoY2FuZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSBsb2NhbCBkZXNjcmlwdGlvbi5cbiAgICAgICAgICAgIHZhciBzZWN0aW9ucyA9IFNEUFV0aWxzLnNwbGl0U2VjdGlvbnMoc2VsZi5sb2NhbERlc2NyaXB0aW9uLnNkcCk7XG4gICAgICAgICAgICBpZiAoZXZlbnQuY2FuZGlkYXRlLmNhbmRpZGF0ZS5pbmRleE9mKCd0eXAgZW5kT2ZDYW5kaWRhdGVzJylcbiAgICAgICAgICAgICAgICA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgc2VjdGlvbnNbZXZlbnQuY2FuZGlkYXRlLnNkcE1MaW5lSW5kZXggKyAxXSArPVxuICAgICAgICAgICAgICAgICAgJ2E9JyArIGV2ZW50LmNhbmRpZGF0ZS5jYW5kaWRhdGUgKyAnXFxyXFxuJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlY3Rpb25zW2V2ZW50LmNhbmRpZGF0ZS5zZHBNTGluZUluZGV4ICsgMV0gKz1cbiAgICAgICAgICAgICAgICAgICdhPWVuZC1vZi1jYW5kaWRhdGVzXFxyXFxuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGYubG9jYWxEZXNjcmlwdGlvbi5zZHAgPSBzZWN0aW9ucy5qb2luKCcnKTtcblxuICAgICAgICAgICAgdmFyIGNvbXBsZXRlID0gc2VsZi50cmFuc2NlaXZlcnMuZXZlcnkoZnVuY3Rpb24odHJhbnNjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zY2VpdmVyLmljZUdhdGhlcmVyICYmXG4gICAgICAgICAgICAgICAgICB0cmFuc2NlaXZlci5pY2VHYXRoZXJlci5zdGF0ZSA9PT0gJ2NvbXBsZXRlZCc7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gRW1pdCBjYW5kaWRhdGUgaWYgbG9jYWxEZXNjcmlwdGlvbiBpcyBzZXQuXG4gICAgICAgICAgICAvLyBBbHNvIGVtaXRzIG51bGwgY2FuZGlkYXRlIHdoZW4gYWxsIGdhdGhlcmVycyBhcmUgY29tcGxldGUuXG4gICAgICAgICAgICBzd2l0Y2ggKHNlbGYuaWNlR2F0aGVyaW5nU3RhdGUpIHtcbiAgICAgICAgICAgICAgY2FzZSAnbmV3JzpcbiAgICAgICAgICAgICAgICBzZWxmLl9sb2NhbEljZUNhbmRpZGF0ZXNCdWZmZXIucHVzaChldmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGVuZCAmJiBjb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgICAgc2VsZi5fbG9jYWxJY2VDYW5kaWRhdGVzQnVmZmVyLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgbmV3IEV2ZW50KCdpY2VjYW5kaWRhdGUnKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdnYXRoZXJpbmcnOlxuICAgICAgICAgICAgICAgIHNlbGYuX2VtaXRCdWZmZXJlZENhbmRpZGF0ZXMoKTtcbiAgICAgICAgICAgICAgICBzZWxmLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLm9uaWNlY2FuZGlkYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICBzZWxmLm9uaWNlY2FuZGlkYXRlKGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICBzZWxmLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpY2VjYW5kaWRhdGUnKSk7XG4gICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vbmljZWNhbmRpZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm9uaWNlY2FuZGlkYXRlKG5ldyBFdmVudCgnaWNlY2FuZGlkYXRlJykpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgc2VsZi5pY2VHYXRoZXJpbmdTdGF0ZSA9ICdjb21wbGV0ZSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdjb21wbGV0ZSc6XG4gICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4uLi4gY3VycmVudGx5IVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OiAvLyBuby1vcC5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGljZVRyYW5zcG9ydC5vbmljZXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZWxmLl91cGRhdGVDb25uZWN0aW9uU3RhdGUoKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdmFyIGR0bHNUcmFuc3BvcnQgPSBuZXcgUlRDRHRsc1RyYW5zcG9ydChpY2VUcmFuc3BvcnQpO1xuICAgICAgICAgIGR0bHNUcmFuc3BvcnQub25kdGxzc3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYuX3VwZGF0ZUNvbm5lY3Rpb25TdGF0ZSgpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgZHRsc1RyYW5zcG9ydC5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBvbmVycm9yIGRvZXMgbm90IHNldCBzdGF0ZSB0byBmYWlsZWQgYnkgaXRzZWxmLlxuICAgICAgICAgICAgZHRsc1RyYW5zcG9ydC5zdGF0ZSA9ICdmYWlsZWQnO1xuICAgICAgICAgICAgc2VsZi5fdXBkYXRlQ29ubmVjdGlvblN0YXRlKCk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpY2VHYXRoZXJlcjogaWNlR2F0aGVyZXIsXG4gICAgICAgICAgICBpY2VUcmFuc3BvcnQ6IGljZVRyYW5zcG9ydCxcbiAgICAgICAgICAgIGR0bHNUcmFuc3BvcnQ6IGR0bHNUcmFuc3BvcnRcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuXG4gICAgLy8gU3RhcnQgdGhlIFJUUCBTZW5kZXIgYW5kIFJlY2VpdmVyIGZvciBhIHRyYW5zY2VpdmVyLlxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuX3RyYW5zY2VpdmUgPSBmdW5jdGlvbih0cmFuc2NlaXZlcixcbiAgICAgICAgc2VuZCwgcmVjdikge1xuICAgICAgdmFyIHBhcmFtcyA9IHRoaXMuX2dldENvbW1vbkNhcGFiaWxpdGllcyh0cmFuc2NlaXZlci5sb2NhbENhcGFiaWxpdGllcyxcbiAgICAgICAgICB0cmFuc2NlaXZlci5yZW1vdGVDYXBhYmlsaXRpZXMpO1xuICAgICAgaWYgKHNlbmQgJiYgdHJhbnNjZWl2ZXIucnRwU2VuZGVyKSB7XG4gICAgICAgIHBhcmFtcy5lbmNvZGluZ3MgPSB0cmFuc2NlaXZlci5zZW5kRW5jb2RpbmdQYXJhbWV0ZXJzO1xuICAgICAgICBwYXJhbXMucnRjcCA9IHtcbiAgICAgICAgICBjbmFtZTogU0RQVXRpbHMubG9jYWxDTmFtZVxuICAgICAgICB9O1xuICAgICAgICBpZiAodHJhbnNjZWl2ZXIucmVjdkVuY29kaW5nUGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICAgICAgICBwYXJhbXMucnRjcC5zc3JjID0gdHJhbnNjZWl2ZXIucmVjdkVuY29kaW5nUGFyYW1ldGVyc1swXS5zc3JjO1xuICAgICAgICB9XG4gICAgICAgIHRyYW5zY2VpdmVyLnJ0cFNlbmRlci5zZW5kKHBhcmFtcyk7XG4gICAgICB9XG4gICAgICBpZiAocmVjdiAmJiB0cmFuc2NlaXZlci5ydHBSZWNlaXZlcikge1xuICAgICAgICBwYXJhbXMuZW5jb2RpbmdzID0gdHJhbnNjZWl2ZXIucmVjdkVuY29kaW5nUGFyYW1ldGVycztcbiAgICAgICAgcGFyYW1zLnJ0Y3AgPSB7XG4gICAgICAgICAgY25hbWU6IHRyYW5zY2VpdmVyLmNuYW1lXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0cmFuc2NlaXZlci5zZW5kRW5jb2RpbmdQYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgICAgICAgIHBhcmFtcy5ydGNwLnNzcmMgPSB0cmFuc2NlaXZlci5zZW5kRW5jb2RpbmdQYXJhbWV0ZXJzWzBdLnNzcmM7XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNjZWl2ZXIucnRwUmVjZWl2ZXIucmVjZWl2ZShwYXJhbXMpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLnNldExvY2FsRGVzY3JpcHRpb24gPVxuICAgICAgICBmdW5jdGlvbihkZXNjcmlwdGlvbikge1xuICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgICB2YXIgc2VjdGlvbnM7XG4gICAgICAgICAgdmFyIHNlc3Npb25wYXJ0O1xuICAgICAgICAgIGlmIChkZXNjcmlwdGlvbi50eXBlID09PSAnb2ZmZXInKSB7XG4gICAgICAgICAgICAvLyBGSVhNRTogV2hhdCB3YXMgdGhlIHB1cnBvc2Ugb2YgdGhpcyBlbXB0eSBpZiBzdGF0ZW1lbnQ/XG4gICAgICAgICAgICAvLyBpZiAoIXRoaXMuX3BlbmRpbmdPZmZlcikge1xuICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wZW5kaW5nT2ZmZXIpIHtcbiAgICAgICAgICAgICAgLy8gVkVSWSBsaW1pdGVkIHN1cHBvcnQgZm9yIFNEUCBtdW5naW5nLiBMaW1pdGVkIHRvOlxuICAgICAgICAgICAgICAvLyAqIGNoYW5naW5nIHRoZSBvcmRlciBvZiBjb2RlY3NcbiAgICAgICAgICAgICAgc2VjdGlvbnMgPSBTRFBVdGlscy5zcGxpdFNlY3Rpb25zKGRlc2NyaXB0aW9uLnNkcCk7XG4gICAgICAgICAgICAgIHNlc3Npb25wYXJ0ID0gc2VjdGlvbnMuc2hpZnQoKTtcbiAgICAgICAgICAgICAgc2VjdGlvbnMuZm9yRWFjaChmdW5jdGlvbihtZWRpYVNlY3Rpb24sIHNkcE1MaW5lSW5kZXgpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2FwcyA9IFNEUFV0aWxzLnBhcnNlUnRwUGFyYW1ldGVycyhtZWRpYVNlY3Rpb24pO1xuICAgICAgICAgICAgICAgIHNlbGYuX3BlbmRpbmdPZmZlcltzZHBNTGluZUluZGV4XS5sb2NhbENhcGFiaWxpdGllcyA9IGNhcHM7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLnRyYW5zY2VpdmVycyA9IHRoaXMuX3BlbmRpbmdPZmZlcjtcbiAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3BlbmRpbmdPZmZlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0aW9uLnR5cGUgPT09ICdhbnN3ZXInKSB7XG4gICAgICAgICAgICBzZWN0aW9ucyA9IFNEUFV0aWxzLnNwbGl0U2VjdGlvbnMoc2VsZi5yZW1vdGVEZXNjcmlwdGlvbi5zZHApO1xuICAgICAgICAgICAgc2Vzc2lvbnBhcnQgPSBzZWN0aW9ucy5zaGlmdCgpO1xuICAgICAgICAgICAgdmFyIGlzSWNlTGl0ZSA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KHNlc3Npb25wYXJ0LFxuICAgICAgICAgICAgICAgICdhPWljZS1saXRlJykubGVuZ3RoID4gMDtcbiAgICAgICAgICAgIHNlY3Rpb25zLmZvckVhY2goZnVuY3Rpb24obWVkaWFTZWN0aW9uLCBzZHBNTGluZUluZGV4KSB7XG4gICAgICAgICAgICAgIHZhciB0cmFuc2NlaXZlciA9IHNlbGYudHJhbnNjZWl2ZXJzW3NkcE1MaW5lSW5kZXhdO1xuICAgICAgICAgICAgICB2YXIgaWNlR2F0aGVyZXIgPSB0cmFuc2NlaXZlci5pY2VHYXRoZXJlcjtcbiAgICAgICAgICAgICAgdmFyIGljZVRyYW5zcG9ydCA9IHRyYW5zY2VpdmVyLmljZVRyYW5zcG9ydDtcbiAgICAgICAgICAgICAgdmFyIGR0bHNUcmFuc3BvcnQgPSB0cmFuc2NlaXZlci5kdGxzVHJhbnNwb3J0O1xuICAgICAgICAgICAgICB2YXIgbG9jYWxDYXBhYmlsaXRpZXMgPSB0cmFuc2NlaXZlci5sb2NhbENhcGFiaWxpdGllcztcbiAgICAgICAgICAgICAgdmFyIHJlbW90ZUNhcGFiaWxpdGllcyA9IHRyYW5zY2VpdmVyLnJlbW90ZUNhcGFiaWxpdGllcztcbiAgICAgICAgICAgICAgdmFyIHJlamVjdGVkID0gbWVkaWFTZWN0aW9uLnNwbGl0KCdcXG4nLCAxKVswXVxuICAgICAgICAgICAgICAgICAgLnNwbGl0KCcgJywgMilbMV0gPT09ICcwJztcblxuICAgICAgICAgICAgICBpZiAoIXJlamVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlbW90ZUljZVBhcmFtZXRlcnMgPSBTRFBVdGlscy5nZXRJY2VQYXJhbWV0ZXJzKFxuICAgICAgICAgICAgICAgICAgICBtZWRpYVNlY3Rpb24sIHNlc3Npb25wYXJ0KTtcbiAgICAgICAgICAgICAgICBpZiAoaXNJY2VMaXRlKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgY2FuZHMgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPWNhbmRpZGF0ZTonKVxuICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbihjYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBTRFBVdGlscy5wYXJzZUNhbmRpZGF0ZShjYW5kKTtcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKGNhbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbmQuY29tcG9uZW50ID09PSAnMSc7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIC8vIGljZS1saXRlIG9ubHkgaW5jbHVkZXMgaG9zdCBjYW5kaWRhdGVzIGluIHRoZSBTRFAgc28gd2UgY2FuXG4gICAgICAgICAgICAgICAgICAvLyB1c2Ugc2V0UmVtb3RlQ2FuZGlkYXRlcyAod2hpY2ggaW1wbGllcyBhblxuICAgICAgICAgICAgICAgICAgLy8gUlRDSWNlQ2FuZGlkYXRlQ29tcGxldGUpXG4gICAgICAgICAgICAgICAgICBpZiAoY2FuZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGljZVRyYW5zcG9ydC5zZXRSZW1vdGVDYW5kaWRhdGVzKGNhbmRzKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHJlbW90ZUR0bHNQYXJhbWV0ZXJzID0gU0RQVXRpbHMuZ2V0RHRsc1BhcmFtZXRlcnMoXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhU2VjdGlvbiwgc2Vzc2lvbnBhcnQpO1xuICAgICAgICAgICAgICAgIGlmIChpc0ljZUxpdGUpIHtcbiAgICAgICAgICAgICAgICAgIHJlbW90ZUR0bHNQYXJhbWV0ZXJzLnJvbGUgPSAnc2VydmVyJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIXNlbGYudXNpbmdCdW5kbGUgfHwgc2RwTUxpbmVJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgaWNlVHJhbnNwb3J0LnN0YXJ0KGljZUdhdGhlcmVyLCByZW1vdGVJY2VQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgIGlzSWNlTGl0ZSA/ICdjb250cm9sbGluZycgOiAnY29udHJvbGxlZCcpO1xuICAgICAgICAgICAgICAgICAgZHRsc1RyYW5zcG9ydC5zdGFydChyZW1vdGVEdGxzUGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGludGVyc2VjdGlvbiBvZiBjYXBhYmlsaXRpZXMuXG4gICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHNlbGYuX2dldENvbW1vbkNhcGFiaWxpdGllcyhsb2NhbENhcGFiaWxpdGllcyxcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlQ2FwYWJpbGl0aWVzKTtcblxuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBSVENSdHBTZW5kZXIuIFRoZSBSVENSdHBSZWNlaXZlciBmb3IgdGhpc1xuICAgICAgICAgICAgICAgIC8vIHRyYW5zY2VpdmVyIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZCBpbiBzZXRSZW1vdGVEZXNjcmlwdGlvbi5cbiAgICAgICAgICAgICAgICBzZWxmLl90cmFuc2NlaXZlKHRyYW5zY2VpdmVyLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY29kZWNzLmxlbmd0aCA+IDAsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5sb2NhbERlc2NyaXB0aW9uID0ge1xuICAgICAgICAgICAgdHlwZTogZGVzY3JpcHRpb24udHlwZSxcbiAgICAgICAgICAgIHNkcDogZGVzY3JpcHRpb24uc2RwXG4gICAgICAgICAgfTtcbiAgICAgICAgICBzd2l0Y2ggKGRlc2NyaXB0aW9uLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ29mZmVyJzpcbiAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlU2lnbmFsaW5nU3RhdGUoJ2hhdmUtbG9jYWwtb2ZmZXInKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdhbnN3ZXInOlxuICAgICAgICAgICAgICB0aGlzLl91cGRhdGVTaWduYWxpbmdTdGF0ZSgnc3RhYmxlJyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndW5zdXBwb3J0ZWQgdHlwZSBcIicgKyBkZXNjcmlwdGlvbi50eXBlICtcbiAgICAgICAgICAgICAgICAgICdcIicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIGEgc3VjY2VzcyBjYWxsYmFjayB3YXMgcHJvdmlkZWQsIGVtaXQgSUNFIGNhbmRpZGF0ZXMgYWZ0ZXIgaXRcbiAgICAgICAgICAvLyBoYXMgYmVlbiBleGVjdXRlZC4gT3RoZXJ3aXNlLCBlbWl0IGNhbGxiYWNrIGFmdGVyIHRoZSBQcm9taXNlIGlzXG4gICAgICAgICAgLy8gcmVzb2x2ZWQuXG4gICAgICAgICAgdmFyIGhhc0NhbGxiYWNrID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgICAgIHR5cGVvZiBhcmd1bWVudHNbMV0gPT09ICdmdW5jdGlvbic7XG4gICAgICAgICAgaWYgKGhhc0NhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgY2IgPSBhcmd1bWVudHNbMV07XG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgICAgICAgaWYgKHNlbGYuaWNlR2F0aGVyaW5nU3RhdGUgPT09ICduZXcnKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5pY2VHYXRoZXJpbmdTdGF0ZSA9ICdnYXRoZXJpbmcnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHNlbGYuX2VtaXRCdWZmZXJlZENhbmRpZGF0ZXMoKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgcCA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgIHAudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICghaGFzQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgaWYgKHNlbGYuaWNlR2F0aGVyaW5nU3RhdGUgPT09ICduZXcnKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5pY2VHYXRoZXJpbmdTdGF0ZSA9ICdnYXRoZXJpbmcnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFVzdWFsbHkgY2FuZGlkYXRlcyB3aWxsIGJlIGVtaXR0ZWQgZWFybGllci5cbiAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoc2VsZi5fZW1pdEJ1ZmZlcmVkQ2FuZGlkYXRlcy5iaW5kKHNlbGYpLCA1MDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBwO1xuICAgICAgICB9O1xuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5zZXRSZW1vdGVEZXNjcmlwdGlvbiA9XG4gICAgICAgIGZ1bmN0aW9uKGRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAgIHZhciBzdHJlYW0gPSBuZXcgTWVkaWFTdHJlYW0oKTtcbiAgICAgICAgICB2YXIgcmVjZWl2ZXJMaXN0ID0gW107XG4gICAgICAgICAgdmFyIHNlY3Rpb25zID0gU0RQVXRpbHMuc3BsaXRTZWN0aW9ucyhkZXNjcmlwdGlvbi5zZHApO1xuICAgICAgICAgIHZhciBzZXNzaW9ucGFydCA9IHNlY3Rpb25zLnNoaWZ0KCk7XG4gICAgICAgICAgdmFyIGlzSWNlTGl0ZSA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KHNlc3Npb25wYXJ0LFxuICAgICAgICAgICAgICAnYT1pY2UtbGl0ZScpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgdGhpcy51c2luZ0J1bmRsZSA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KHNlc3Npb25wYXJ0LFxuICAgICAgICAgICAgICAnYT1ncm91cDpCVU5ETEUgJykubGVuZ3RoID4gMDtcbiAgICAgICAgICBzZWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKG1lZGlhU2VjdGlvbiwgc2RwTUxpbmVJbmRleCkge1xuICAgICAgICAgICAgdmFyIGxpbmVzID0gU0RQVXRpbHMuc3BsaXRMaW5lcyhtZWRpYVNlY3Rpb24pO1xuICAgICAgICAgICAgdmFyIG1saW5lID0gbGluZXNbMF0uc3Vic3RyKDIpLnNwbGl0KCcgJyk7XG4gICAgICAgICAgICB2YXIga2luZCA9IG1saW5lWzBdO1xuICAgICAgICAgICAgdmFyIHJlamVjdGVkID0gbWxpbmVbMV0gPT09ICcwJztcbiAgICAgICAgICAgIHZhciBkaXJlY3Rpb24gPSBTRFBVdGlscy5nZXREaXJlY3Rpb24obWVkaWFTZWN0aW9uLCBzZXNzaW9ucGFydCk7XG5cbiAgICAgICAgICAgIHZhciB0cmFuc2NlaXZlcjtcbiAgICAgICAgICAgIHZhciBpY2VHYXRoZXJlcjtcbiAgICAgICAgICAgIHZhciBpY2VUcmFuc3BvcnQ7XG4gICAgICAgICAgICB2YXIgZHRsc1RyYW5zcG9ydDtcbiAgICAgICAgICAgIHZhciBydHBTZW5kZXI7XG4gICAgICAgICAgICB2YXIgcnRwUmVjZWl2ZXI7XG4gICAgICAgICAgICB2YXIgc2VuZEVuY29kaW5nUGFyYW1ldGVycztcbiAgICAgICAgICAgIHZhciByZWN2RW5jb2RpbmdQYXJhbWV0ZXJzO1xuICAgICAgICAgICAgdmFyIGxvY2FsQ2FwYWJpbGl0aWVzO1xuXG4gICAgICAgICAgICB2YXIgdHJhY2s7XG4gICAgICAgICAgICAvLyBGSVhNRTogZW5zdXJlIHRoZSBtZWRpYVNlY3Rpb24gaGFzIHJ0Y3AtbXV4IHNldC5cbiAgICAgICAgICAgIHZhciByZW1vdGVDYXBhYmlsaXRpZXMgPSBTRFBVdGlscy5wYXJzZVJ0cFBhcmFtZXRlcnMobWVkaWFTZWN0aW9uKTtcbiAgICAgICAgICAgIHZhciByZW1vdGVJY2VQYXJhbWV0ZXJzO1xuICAgICAgICAgICAgdmFyIHJlbW90ZUR0bHNQYXJhbWV0ZXJzO1xuICAgICAgICAgICAgaWYgKCFyZWplY3RlZCkge1xuICAgICAgICAgICAgICByZW1vdGVJY2VQYXJhbWV0ZXJzID0gU0RQVXRpbHMuZ2V0SWNlUGFyYW1ldGVycyhtZWRpYVNlY3Rpb24sXG4gICAgICAgICAgICAgICAgICBzZXNzaW9ucGFydCk7XG4gICAgICAgICAgICAgIHJlbW90ZUR0bHNQYXJhbWV0ZXJzID0gU0RQVXRpbHMuZ2V0RHRsc1BhcmFtZXRlcnMobWVkaWFTZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgc2Vzc2lvbnBhcnQpO1xuICAgICAgICAgICAgICByZW1vdGVEdGxzUGFyYW1ldGVycy5yb2xlID0gJ2NsaWVudCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWN2RW5jb2RpbmdQYXJhbWV0ZXJzID1cbiAgICAgICAgICAgICAgICBTRFBVdGlscy5wYXJzZVJ0cEVuY29kaW5nUGFyYW1ldGVycyhtZWRpYVNlY3Rpb24pO1xuXG4gICAgICAgICAgICB2YXIgbWlkID0gU0RQVXRpbHMubWF0Y2hQcmVmaXgobWVkaWFTZWN0aW9uLCAnYT1taWQ6Jyk7XG4gICAgICAgICAgICBpZiAobWlkLmxlbmd0aCkge1xuICAgICAgICAgICAgICBtaWQgPSBtaWRbMF0uc3Vic3RyKDYpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbWlkID0gU0RQVXRpbHMuZ2VuZXJhdGVJZGVudGlmaWVyKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBjbmFtZTtcbiAgICAgICAgICAgIC8vIEdldHMgdGhlIGZpcnN0IFNTUkMuIE5vdGUgdGhhdCB3aXRoIFJUWCB0aGVyZSBtaWdodCBiZSBtdWx0aXBsZVxuICAgICAgICAgICAgLy8gU1NSQ3MuXG4gICAgICAgICAgICB2YXIgcmVtb3RlU3NyYyA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiwgJ2E9c3NyYzonKVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIFNEUFV0aWxzLnBhcnNlU3NyY01lZGlhKGxpbmUpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbihvYmopIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBvYmouYXR0cmlidXRlID09PSAnY25hbWUnO1xuICAgICAgICAgICAgICAgIH0pWzBdO1xuICAgICAgICAgICAgaWYgKHJlbW90ZVNzcmMpIHtcbiAgICAgICAgICAgICAgY25hbWUgPSByZW1vdGVTc3JjLnZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgaXNDb21wbGV0ZSA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbixcbiAgICAgICAgICAgICAgICAnYT1lbmQtb2YtY2FuZGlkYXRlcycpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICB2YXIgY2FuZHMgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPWNhbmRpZGF0ZTonKVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24oY2FuZCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIFNEUFV0aWxzLnBhcnNlQ2FuZGlkYXRlKGNhbmQpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbihjYW5kKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY2FuZC5jb21wb25lbnQgPT09ICcxJztcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbi50eXBlID09PSAnb2ZmZXInICYmICFyZWplY3RlZCkge1xuICAgICAgICAgICAgICB2YXIgdHJhbnNwb3J0cyA9IHNlbGYudXNpbmdCdW5kbGUgJiYgc2RwTUxpbmVJbmRleCA+IDAgPyB7XG4gICAgICAgICAgICAgICAgaWNlR2F0aGVyZXI6IHNlbGYudHJhbnNjZWl2ZXJzWzBdLmljZUdhdGhlcmVyLFxuICAgICAgICAgICAgICAgIGljZVRyYW5zcG9ydDogc2VsZi50cmFuc2NlaXZlcnNbMF0uaWNlVHJhbnNwb3J0LFxuICAgICAgICAgICAgICAgIGR0bHNUcmFuc3BvcnQ6IHNlbGYudHJhbnNjZWl2ZXJzWzBdLmR0bHNUcmFuc3BvcnRcbiAgICAgICAgICAgICAgfSA6IHNlbGYuX2NyZWF0ZUljZUFuZER0bHNUcmFuc3BvcnRzKG1pZCwgc2RwTUxpbmVJbmRleCk7XG5cbiAgICAgICAgICAgICAgaWYgKGlzQ29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICB0cmFuc3BvcnRzLmljZVRyYW5zcG9ydC5zZXRSZW1vdGVDYW5kaWRhdGVzKGNhbmRzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGxvY2FsQ2FwYWJpbGl0aWVzID0gUlRDUnRwUmVjZWl2ZXIuZ2V0Q2FwYWJpbGl0aWVzKGtpbmQpO1xuICAgICAgICAgICAgICBzZW5kRW5jb2RpbmdQYXJhbWV0ZXJzID0gW3tcbiAgICAgICAgICAgICAgICBzc3JjOiAoMiAqIHNkcE1MaW5lSW5kZXggKyAyKSAqIDEwMDFcbiAgICAgICAgICAgICAgfV07XG5cbiAgICAgICAgICAgICAgcnRwUmVjZWl2ZXIgPSBuZXcgUlRDUnRwUmVjZWl2ZXIodHJhbnNwb3J0cy5kdGxzVHJhbnNwb3J0LCBraW5kKTtcblxuICAgICAgICAgICAgICB0cmFjayA9IHJ0cFJlY2VpdmVyLnRyYWNrO1xuICAgICAgICAgICAgICByZWNlaXZlckxpc3QucHVzaChbdHJhY2ssIHJ0cFJlY2VpdmVyXSk7XG4gICAgICAgICAgICAgIC8vIEZJWE1FOiBub3QgY29ycmVjdCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBzdHJlYW1zIGJ1dCB0aGF0IGlzXG4gICAgICAgICAgICAgIC8vIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIHRoaXMgc2hpbS5cbiAgICAgICAgICAgICAgc3RyZWFtLmFkZFRyYWNrKHRyYWNrKTtcblxuICAgICAgICAgICAgICAvLyBGSVhNRTogbG9vayBhdCBkaXJlY3Rpb24uXG4gICAgICAgICAgICAgIGlmIChzZWxmLmxvY2FsU3RyZWFtcy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICBzZWxmLmxvY2FsU3RyZWFtc1swXS5nZXRUcmFja3MoKS5sZW5ndGggPj0gc2RwTUxpbmVJbmRleCkge1xuICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBhY3R1YWxseSBtb3JlIGNvbXBsaWNhdGVkLCBuZWVkcyB0byBtYXRjaCB0eXBlcyBldGNcbiAgICAgICAgICAgICAgICB2YXIgbG9jYWx0cmFjayA9IHNlbGYubG9jYWxTdHJlYW1zWzBdXG4gICAgICAgICAgICAgICAgICAgIC5nZXRUcmFja3MoKVtzZHBNTGluZUluZGV4XTtcbiAgICAgICAgICAgICAgICBydHBTZW5kZXIgPSBuZXcgUlRDUnRwU2VuZGVyKGxvY2FsdHJhY2ssXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydHMuZHRsc1RyYW5zcG9ydCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzZWxmLnRyYW5zY2VpdmVyc1tzZHBNTGluZUluZGV4XSA9IHtcbiAgICAgICAgICAgICAgICBpY2VHYXRoZXJlcjogdHJhbnNwb3J0cy5pY2VHYXRoZXJlcixcbiAgICAgICAgICAgICAgICBpY2VUcmFuc3BvcnQ6IHRyYW5zcG9ydHMuaWNlVHJhbnNwb3J0LFxuICAgICAgICAgICAgICAgIGR0bHNUcmFuc3BvcnQ6IHRyYW5zcG9ydHMuZHRsc1RyYW5zcG9ydCxcbiAgICAgICAgICAgICAgICBsb2NhbENhcGFiaWxpdGllczogbG9jYWxDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICAgICAgcmVtb3RlQ2FwYWJpbGl0aWVzOiByZW1vdGVDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICAgICAgcnRwU2VuZGVyOiBydHBTZW5kZXIsXG4gICAgICAgICAgICAgICAgcnRwUmVjZWl2ZXI6IHJ0cFJlY2VpdmVyLFxuICAgICAgICAgICAgICAgIGtpbmQ6IGtpbmQsXG4gICAgICAgICAgICAgICAgbWlkOiBtaWQsXG4gICAgICAgICAgICAgICAgY25hbWU6IGNuYW1lLFxuICAgICAgICAgICAgICAgIHNlbmRFbmNvZGluZ1BhcmFtZXRlcnM6IHNlbmRFbmNvZGluZ1BhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVjdkVuY29kaW5nUGFyYW1ldGVyczogcmVjdkVuY29kaW5nUGFyYW1ldGVyc1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAvLyBTdGFydCB0aGUgUlRDUnRwUmVjZWl2ZXIgbm93LiBUaGUgUlRQU2VuZGVyIGlzIHN0YXJ0ZWQgaW5cbiAgICAgICAgICAgICAgLy8gc2V0TG9jYWxEZXNjcmlwdGlvbi5cbiAgICAgICAgICAgICAgc2VsZi5fdHJhbnNjZWl2ZShzZWxmLnRyYW5zY2VpdmVyc1tzZHBNTGluZUluZGV4XSxcbiAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID09PSAnc2VuZHJlY3YnIHx8IGRpcmVjdGlvbiA9PT0gJ3NlbmRvbmx5Jyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0aW9uLnR5cGUgPT09ICdhbnN3ZXInICYmICFyZWplY3RlZCkge1xuICAgICAgICAgICAgICB0cmFuc2NlaXZlciA9IHNlbGYudHJhbnNjZWl2ZXJzW3NkcE1MaW5lSW5kZXhdO1xuICAgICAgICAgICAgICBpY2VHYXRoZXJlciA9IHRyYW5zY2VpdmVyLmljZUdhdGhlcmVyO1xuICAgICAgICAgICAgICBpY2VUcmFuc3BvcnQgPSB0cmFuc2NlaXZlci5pY2VUcmFuc3BvcnQ7XG4gICAgICAgICAgICAgIGR0bHNUcmFuc3BvcnQgPSB0cmFuc2NlaXZlci5kdGxzVHJhbnNwb3J0O1xuICAgICAgICAgICAgICBydHBTZW5kZXIgPSB0cmFuc2NlaXZlci5ydHBTZW5kZXI7XG4gICAgICAgICAgICAgIHJ0cFJlY2VpdmVyID0gdHJhbnNjZWl2ZXIucnRwUmVjZWl2ZXI7XG4gICAgICAgICAgICAgIHNlbmRFbmNvZGluZ1BhcmFtZXRlcnMgPSB0cmFuc2NlaXZlci5zZW5kRW5jb2RpbmdQYXJhbWV0ZXJzO1xuICAgICAgICAgICAgICBsb2NhbENhcGFiaWxpdGllcyA9IHRyYW5zY2VpdmVyLmxvY2FsQ2FwYWJpbGl0aWVzO1xuXG4gICAgICAgICAgICAgIHNlbGYudHJhbnNjZWl2ZXJzW3NkcE1MaW5lSW5kZXhdLnJlY3ZFbmNvZGluZ1BhcmFtZXRlcnMgPVxuICAgICAgICAgICAgICAgICAgcmVjdkVuY29kaW5nUGFyYW1ldGVycztcbiAgICAgICAgICAgICAgc2VsZi50cmFuc2NlaXZlcnNbc2RwTUxpbmVJbmRleF0ucmVtb3RlQ2FwYWJpbGl0aWVzID1cbiAgICAgICAgICAgICAgICAgIHJlbW90ZUNhcGFiaWxpdGllcztcbiAgICAgICAgICAgICAgc2VsZi50cmFuc2NlaXZlcnNbc2RwTUxpbmVJbmRleF0uY25hbWUgPSBjbmFtZTtcblxuICAgICAgICAgICAgICBpZiAoKGlzSWNlTGl0ZSB8fCBpc0NvbXBsZXRlKSAmJiBjYW5kcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpY2VUcmFuc3BvcnQuc2V0UmVtb3RlQ2FuZGlkYXRlcyhjYW5kcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCFzZWxmLnVzaW5nQnVuZGxlIHx8IHNkcE1MaW5lSW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICBpY2VUcmFuc3BvcnQuc3RhcnQoaWNlR2F0aGVyZXIsIHJlbW90ZUljZVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgICAgICdjb250cm9sbGluZycpO1xuICAgICAgICAgICAgICAgIGR0bHNUcmFuc3BvcnQuc3RhcnQocmVtb3RlRHRsc1BhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgc2VsZi5fdHJhbnNjZWl2ZSh0cmFuc2NlaXZlcixcbiAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9PT0gJ3NlbmRyZWN2JyB8fCBkaXJlY3Rpb24gPT09ICdyZWN2b25seScsXG4gICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09ICdzZW5kcmVjdicgfHwgZGlyZWN0aW9uID09PSAnc2VuZG9ubHknKTtcblxuICAgICAgICAgICAgICBpZiAocnRwUmVjZWl2ZXIgJiZcbiAgICAgICAgICAgICAgICAgIChkaXJlY3Rpb24gPT09ICdzZW5kcmVjdicgfHwgZGlyZWN0aW9uID09PSAnc2VuZG9ubHknKSkge1xuICAgICAgICAgICAgICAgIHRyYWNrID0gcnRwUmVjZWl2ZXIudHJhY2s7XG4gICAgICAgICAgICAgICAgcmVjZWl2ZXJMaXN0LnB1c2goW3RyYWNrLCBydHBSZWNlaXZlcl0pO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5hZGRUcmFjayh0cmFjayk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRklYTUU6IGFjdHVhbGx5IHRoZSByZWNlaXZlciBzaG91bGQgYmUgY3JlYXRlZCBsYXRlci5cbiAgICAgICAgICAgICAgICBkZWxldGUgdHJhbnNjZWl2ZXIucnRwUmVjZWl2ZXI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRoaXMucmVtb3RlRGVzY3JpcHRpb24gPSB7XG4gICAgICAgICAgICB0eXBlOiBkZXNjcmlwdGlvbi50eXBlLFxuICAgICAgICAgICAgc2RwOiBkZXNjcmlwdGlvbi5zZHBcbiAgICAgICAgICB9O1xuICAgICAgICAgIHN3aXRjaCAoZGVzY3JpcHRpb24udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnb2ZmZXInOlxuICAgICAgICAgICAgICB0aGlzLl91cGRhdGVTaWduYWxpbmdTdGF0ZSgnaGF2ZS1yZW1vdGUtb2ZmZXInKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdhbnN3ZXInOlxuICAgICAgICAgICAgICB0aGlzLl91cGRhdGVTaWduYWxpbmdTdGF0ZSgnc3RhYmxlJyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndW5zdXBwb3J0ZWQgdHlwZSBcIicgKyBkZXNjcmlwdGlvbi50eXBlICtcbiAgICAgICAgICAgICAgICAgICdcIicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RyZWFtLmdldFRyYWNrcygpLmxlbmd0aCkge1xuICAgICAgICAgICAgc2VsZi5yZW1vdGVTdHJlYW1zLnB1c2goc3RyZWFtKTtcbiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB2YXIgZXZlbnQgPSBuZXcgRXZlbnQoJ2FkZHN0cmVhbScpO1xuICAgICAgICAgICAgICBldmVudC5zdHJlYW0gPSBzdHJlYW07XG4gICAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgICAgIGlmIChzZWxmLm9uYWRkc3RyZWFtICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICBzZWxmLm9uYWRkc3RyZWFtKGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJlY2VpdmVyTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICB2YXIgdHJhY2sgPSBpdGVtWzBdO1xuICAgICAgICAgICAgICAgIHZhciByZWNlaXZlciA9IGl0ZW1bMV07XG4gICAgICAgICAgICAgICAgdmFyIHRyYWNrRXZlbnQgPSBuZXcgRXZlbnQoJ3RyYWNrJyk7XG4gICAgICAgICAgICAgICAgdHJhY2tFdmVudC50cmFjayA9IHRyYWNrO1xuICAgICAgICAgICAgICAgIHRyYWNrRXZlbnQucmVjZWl2ZXIgPSByZWNlaXZlcjtcbiAgICAgICAgICAgICAgICB0cmFja0V2ZW50LnN0cmVhbXMgPSBbc3RyZWFtXTtcbiAgICAgICAgICAgICAgICBzZWxmLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLm9udHJhY2sgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm9udHJhY2sodHJhY2tFdmVudCk7XG4gICAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB0eXBlb2YgYXJndW1lbnRzWzFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChhcmd1bWVudHNbMV0sIDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH07XG5cbiAgICB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLnRyYW5zY2VpdmVycy5mb3JFYWNoKGZ1bmN0aW9uKHRyYW5zY2VpdmVyKSB7XG4gICAgICAgIC8qIG5vdCB5ZXRcbiAgICAgICAgaWYgKHRyYW5zY2VpdmVyLmljZUdhdGhlcmVyKSB7XG4gICAgICAgICAgdHJhbnNjZWl2ZXIuaWNlR2F0aGVyZXIuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICAqL1xuICAgICAgICBpZiAodHJhbnNjZWl2ZXIuaWNlVHJhbnNwb3J0KSB7XG4gICAgICAgICAgdHJhbnNjZWl2ZXIuaWNlVHJhbnNwb3J0LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhbnNjZWl2ZXIuZHRsc1RyYW5zcG9ydCkge1xuICAgICAgICAgIHRyYW5zY2VpdmVyLmR0bHNUcmFuc3BvcnQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFuc2NlaXZlci5ydHBTZW5kZXIpIHtcbiAgICAgICAgICB0cmFuc2NlaXZlci5ydHBTZW5kZXIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFuc2NlaXZlci5ydHBSZWNlaXZlcikge1xuICAgICAgICAgIHRyYW5zY2VpdmVyLnJ0cFJlY2VpdmVyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBGSVhNRTogY2xlYW4gdXAgdHJhY2tzLCBsb2NhbCBzdHJlYW1zLCByZW1vdGUgc3RyZWFtcywgZXRjXG4gICAgICB0aGlzLl91cGRhdGVTaWduYWxpbmdTdGF0ZSgnY2xvc2VkJyk7XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgc2lnbmFsaW5nIHN0YXRlLlxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuX3VwZGF0ZVNpZ25hbGluZ1N0YXRlID1cbiAgICAgICAgZnVuY3Rpb24obmV3U3RhdGUpIHtcbiAgICAgICAgICB0aGlzLnNpZ25hbGluZ1N0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgICAgdmFyIGV2ZW50ID0gbmV3IEV2ZW50KCdzaWduYWxpbmdzdGF0ZWNoYW5nZScpO1xuICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgaWYgKHRoaXMub25zaWduYWxpbmdzdGF0ZWNoYW5nZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5vbnNpZ25hbGluZ3N0YXRlY2hhbmdlKGV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAvLyBEZXRlcm1pbmUgd2hldGhlciB0byBmaXJlIHRoZSBuZWdvdGlhdGlvbm5lZWRlZCBldmVudC5cbiAgICB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLl9tYXliZUZpcmVOZWdvdGlhdGlvbk5lZWRlZCA9XG4gICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIEZpcmUgYXdheSAoZm9yIG5vdykuXG4gICAgICAgICAgdmFyIGV2ZW50ID0gbmV3IEV2ZW50KCduZWdvdGlhdGlvbm5lZWRlZCcpO1xuICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgaWYgKHRoaXMub25uZWdvdGlhdGlvbm5lZWRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5vbm5lZ290aWF0aW9ubmVlZGVkKGV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAvLyBVcGRhdGUgdGhlIGNvbm5lY3Rpb24gc3RhdGUuXG4gICAgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uLnByb3RvdHlwZS5fdXBkYXRlQ29ubmVjdGlvblN0YXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgbmV3U3RhdGU7XG4gICAgICB2YXIgc3RhdGVzID0ge1xuICAgICAgICAnbmV3JzogMCxcbiAgICAgICAgY2xvc2VkOiAwLFxuICAgICAgICBjb25uZWN0aW5nOiAwLFxuICAgICAgICBjaGVja2luZzogMCxcbiAgICAgICAgY29ubmVjdGVkOiAwLFxuICAgICAgICBjb21wbGV0ZWQ6IDAsXG4gICAgICAgIGZhaWxlZDogMFxuICAgICAgfTtcbiAgICAgIHRoaXMudHJhbnNjZWl2ZXJzLmZvckVhY2goZnVuY3Rpb24odHJhbnNjZWl2ZXIpIHtcbiAgICAgICAgc3RhdGVzW3RyYW5zY2VpdmVyLmljZVRyYW5zcG9ydC5zdGF0ZV0rKztcbiAgICAgICAgc3RhdGVzW3RyYW5zY2VpdmVyLmR0bHNUcmFuc3BvcnQuc3RhdGVdKys7XG4gICAgICB9KTtcbiAgICAgIC8vIElDRVRyYW5zcG9ydC5jb21wbGV0ZWQgYW5kIGNvbm5lY3RlZCBhcmUgdGhlIHNhbWUgZm9yIHRoaXMgcHVycG9zZS5cbiAgICAgIHN0YXRlcy5jb25uZWN0ZWQgKz0gc3RhdGVzLmNvbXBsZXRlZDtcblxuICAgICAgbmV3U3RhdGUgPSAnbmV3JztcbiAgICAgIGlmIChzdGF0ZXMuZmFpbGVkID4gMCkge1xuICAgICAgICBuZXdTdGF0ZSA9ICdmYWlsZWQnO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZXMuY29ubmVjdGluZyA+IDAgfHwgc3RhdGVzLmNoZWNraW5nID4gMCkge1xuICAgICAgICBuZXdTdGF0ZSA9ICdjb25uZWN0aW5nJztcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGVzLmRpc2Nvbm5lY3RlZCA+IDApIHtcbiAgICAgICAgbmV3U3RhdGUgPSAnZGlzY29ubmVjdGVkJztcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGVzLm5ldyA+IDApIHtcbiAgICAgICAgbmV3U3RhdGUgPSAnbmV3JztcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGVzLmNvbm5lY3RlZCA+IDAgfHwgc3RhdGVzLmNvbXBsZXRlZCA+IDApIHtcbiAgICAgICAgbmV3U3RhdGUgPSAnY29ubmVjdGVkJztcbiAgICAgIH1cblxuICAgICAgaWYgKG5ld1N0YXRlICE9PSBzZWxmLmljZUNvbm5lY3Rpb25TdGF0ZSkge1xuICAgICAgICBzZWxmLmljZUNvbm5lY3Rpb25TdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgICB2YXIgZXZlbnQgPSBuZXcgRXZlbnQoJ2ljZWNvbm5lY3Rpb25zdGF0ZWNoYW5nZScpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICBpZiAodGhpcy5vbmljZWNvbm5lY3Rpb25zdGF0ZWNoYW5nZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMub25pY2Vjb25uZWN0aW9uc3RhdGVjaGFuZ2UoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuY3JlYXRlT2ZmZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIGlmICh0aGlzLl9wZW5kaW5nT2ZmZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcmVhdGVPZmZlciBjYWxsZWQgd2hpbGUgdGhlcmUgaXMgYSBwZW5kaW5nIG9mZmVyLicpO1xuICAgICAgfVxuICAgICAgdmFyIG9mZmVyT3B0aW9ucztcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhcmd1bWVudHNbMF0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb2ZmZXJPcHRpb25zID0gYXJndW1lbnRzWzBdO1xuICAgICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIG9mZmVyT3B0aW9ucyA9IGFyZ3VtZW50c1syXTtcbiAgICAgIH1cblxuICAgICAgdmFyIHRyYWNrcyA9IFtdO1xuICAgICAgdmFyIG51bUF1ZGlvVHJhY2tzID0gMDtcbiAgICAgIHZhciBudW1WaWRlb1RyYWNrcyA9IDA7XG4gICAgICAvLyBEZWZhdWx0IHRvIHNlbmRyZWN2LlxuICAgICAgaWYgKHRoaXMubG9jYWxTdHJlYW1zLmxlbmd0aCkge1xuICAgICAgICBudW1BdWRpb1RyYWNrcyA9IHRoaXMubG9jYWxTdHJlYW1zWzBdLmdldEF1ZGlvVHJhY2tzKCkubGVuZ3RoO1xuICAgICAgICBudW1WaWRlb1RyYWNrcyA9IHRoaXMubG9jYWxTdHJlYW1zWzBdLmdldFZpZGVvVHJhY2tzKCkubGVuZ3RoO1xuICAgICAgfVxuICAgICAgLy8gRGV0ZXJtaW5lIG51bWJlciBvZiBhdWRpbyBhbmQgdmlkZW8gdHJhY2tzIHdlIG5lZWQgdG8gc2VuZC9yZWN2LlxuICAgICAgaWYgKG9mZmVyT3B0aW9ucykge1xuICAgICAgICAvLyBSZWplY3QgQ2hyb21lIGxlZ2FjeSBjb25zdHJhaW50cy5cbiAgICAgICAgaWYgKG9mZmVyT3B0aW9ucy5tYW5kYXRvcnkgfHwgb2ZmZXJPcHRpb25zLm9wdGlvbmFsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgJ0xlZ2FjeSBtYW5kYXRvcnkvb3B0aW9uYWwgY29uc3RyYWludHMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2ZmZXJPcHRpb25zLm9mZmVyVG9SZWNlaXZlQXVkaW8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG51bUF1ZGlvVHJhY2tzID0gb2ZmZXJPcHRpb25zLm9mZmVyVG9SZWNlaXZlQXVkaW87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9mZmVyT3B0aW9ucy5vZmZlclRvUmVjZWl2ZVZpZGVvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBudW1WaWRlb1RyYWNrcyA9IG9mZmVyT3B0aW9ucy5vZmZlclRvUmVjZWl2ZVZpZGVvO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5sb2NhbFN0cmVhbXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIFB1c2ggbG9jYWwgc3RyZWFtcy5cbiAgICAgICAgdGhpcy5sb2NhbFN0cmVhbXNbMF0uZ2V0VHJhY2tzKCkuZm9yRWFjaChmdW5jdGlvbih0cmFjaykge1xuICAgICAgICAgIHRyYWNrcy5wdXNoKHtcbiAgICAgICAgICAgIGtpbmQ6IHRyYWNrLmtpbmQsXG4gICAgICAgICAgICB0cmFjazogdHJhY2ssXG4gICAgICAgICAgICB3YW50UmVjZWl2ZTogdHJhY2sua2luZCA9PT0gJ2F1ZGlvJyA/XG4gICAgICAgICAgICAgICAgbnVtQXVkaW9UcmFja3MgPiAwIDogbnVtVmlkZW9UcmFja3MgPiAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHRyYWNrLmtpbmQgPT09ICdhdWRpbycpIHtcbiAgICAgICAgICAgIG51bUF1ZGlvVHJhY2tzLS07XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmFjay5raW5kID09PSAndmlkZW8nKSB7XG4gICAgICAgICAgICBudW1WaWRlb1RyYWNrcy0tO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBDcmVhdGUgTS1saW5lcyBmb3IgcmVjdm9ubHkgc3RyZWFtcy5cbiAgICAgIHdoaWxlIChudW1BdWRpb1RyYWNrcyA+IDAgfHwgbnVtVmlkZW9UcmFja3MgPiAwKSB7XG4gICAgICAgIGlmIChudW1BdWRpb1RyYWNrcyA+IDApIHtcbiAgICAgICAgICB0cmFja3MucHVzaCh7XG4gICAgICAgICAgICBraW5kOiAnYXVkaW8nLFxuICAgICAgICAgICAgd2FudFJlY2VpdmU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBudW1BdWRpb1RyYWNrcy0tO1xuICAgICAgICB9XG4gICAgICAgIGlmIChudW1WaWRlb1RyYWNrcyA+IDApIHtcbiAgICAgICAgICB0cmFja3MucHVzaCh7XG4gICAgICAgICAgICBraW5kOiAndmlkZW8nLFxuICAgICAgICAgICAgd2FudFJlY2VpdmU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBudW1WaWRlb1RyYWNrcy0tO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBzZHAgPSBTRFBVdGlscy53cml0ZVNlc3Npb25Cb2lsZXJwbGF0ZSgpO1xuICAgICAgdmFyIHRyYW5zY2VpdmVycyA9IFtdO1xuICAgICAgdHJhY2tzLmZvckVhY2goZnVuY3Rpb24obWxpbmUsIHNkcE1MaW5lSW5kZXgpIHtcbiAgICAgICAgLy8gRm9yIGVhY2ggdHJhY2ssIGNyZWF0ZSBhbiBpY2UgZ2F0aGVyZXIsIGljZSB0cmFuc3BvcnQsXG4gICAgICAgIC8vIGR0bHMgdHJhbnNwb3J0LCBwb3RlbnRpYWxseSBydHBzZW5kZXIgYW5kIHJ0cHJlY2VpdmVyLlxuICAgICAgICB2YXIgdHJhY2sgPSBtbGluZS50cmFjaztcbiAgICAgICAgdmFyIGtpbmQgPSBtbGluZS5raW5kO1xuICAgICAgICB2YXIgbWlkID0gU0RQVXRpbHMuZ2VuZXJhdGVJZGVudGlmaWVyKCk7XG5cbiAgICAgICAgdmFyIHRyYW5zcG9ydHMgPSBzZWxmLnVzaW5nQnVuZGxlICYmIHNkcE1MaW5lSW5kZXggPiAwID8ge1xuICAgICAgICAgIGljZUdhdGhlcmVyOiB0cmFuc2NlaXZlcnNbMF0uaWNlR2F0aGVyZXIsXG4gICAgICAgICAgaWNlVHJhbnNwb3J0OiB0cmFuc2NlaXZlcnNbMF0uaWNlVHJhbnNwb3J0LFxuICAgICAgICAgIGR0bHNUcmFuc3BvcnQ6IHRyYW5zY2VpdmVyc1swXS5kdGxzVHJhbnNwb3J0XG4gICAgICAgIH0gOiBzZWxmLl9jcmVhdGVJY2VBbmREdGxzVHJhbnNwb3J0cyhtaWQsIHNkcE1MaW5lSW5kZXgpO1xuXG4gICAgICAgIHZhciBsb2NhbENhcGFiaWxpdGllcyA9IFJUQ1J0cFNlbmRlci5nZXRDYXBhYmlsaXRpZXMoa2luZCk7XG4gICAgICAgIHZhciBydHBTZW5kZXI7XG4gICAgICAgIHZhciBydHBSZWNlaXZlcjtcblxuICAgICAgICAvLyBnZW5lcmF0ZSBhbiBzc3JjIG5vdywgdG8gYmUgdXNlZCBsYXRlciBpbiBydHBTZW5kZXIuc2VuZFxuICAgICAgICB2YXIgc2VuZEVuY29kaW5nUGFyYW1ldGVycyA9IFt7XG4gICAgICAgICAgc3NyYzogKDIgKiBzZHBNTGluZUluZGV4ICsgMSkgKiAxMDAxXG4gICAgICAgIH1dO1xuICAgICAgICBpZiAodHJhY2spIHtcbiAgICAgICAgICBydHBTZW5kZXIgPSBuZXcgUlRDUnRwU2VuZGVyKHRyYWNrLCB0cmFuc3BvcnRzLmR0bHNUcmFuc3BvcnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1saW5lLndhbnRSZWNlaXZlKSB7XG4gICAgICAgICAgcnRwUmVjZWl2ZXIgPSBuZXcgUlRDUnRwUmVjZWl2ZXIodHJhbnNwb3J0cy5kdGxzVHJhbnNwb3J0LCBraW5kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyYW5zY2VpdmVyc1tzZHBNTGluZUluZGV4XSA9IHtcbiAgICAgICAgICBpY2VHYXRoZXJlcjogdHJhbnNwb3J0cy5pY2VHYXRoZXJlcixcbiAgICAgICAgICBpY2VUcmFuc3BvcnQ6IHRyYW5zcG9ydHMuaWNlVHJhbnNwb3J0LFxuICAgICAgICAgIGR0bHNUcmFuc3BvcnQ6IHRyYW5zcG9ydHMuZHRsc1RyYW5zcG9ydCxcbiAgICAgICAgICBsb2NhbENhcGFiaWxpdGllczogbG9jYWxDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgcmVtb3RlQ2FwYWJpbGl0aWVzOiBudWxsLFxuICAgICAgICAgIHJ0cFNlbmRlcjogcnRwU2VuZGVyLFxuICAgICAgICAgIHJ0cFJlY2VpdmVyOiBydHBSZWNlaXZlcixcbiAgICAgICAgICBraW5kOiBraW5kLFxuICAgICAgICAgIG1pZDogbWlkLFxuICAgICAgICAgIHNlbmRFbmNvZGluZ1BhcmFtZXRlcnM6IHNlbmRFbmNvZGluZ1BhcmFtZXRlcnMsXG4gICAgICAgICAgcmVjdkVuY29kaW5nUGFyYW1ldGVyczogbnVsbFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy51c2luZ0J1bmRsZSkge1xuICAgICAgICBzZHAgKz0gJ2E9Z3JvdXA6QlVORExFICcgKyB0cmFuc2NlaXZlcnMubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICByZXR1cm4gdC5taWQ7XG4gICAgICAgIH0pLmpvaW4oJyAnKSArICdcXHJcXG4nO1xuICAgICAgfVxuICAgICAgdHJhY2tzLmZvckVhY2goZnVuY3Rpb24obWxpbmUsIHNkcE1MaW5lSW5kZXgpIHtcbiAgICAgICAgdmFyIHRyYW5zY2VpdmVyID0gdHJhbnNjZWl2ZXJzW3NkcE1MaW5lSW5kZXhdO1xuICAgICAgICBzZHAgKz0gU0RQVXRpbHMud3JpdGVNZWRpYVNlY3Rpb24odHJhbnNjZWl2ZXIsXG4gICAgICAgICAgICB0cmFuc2NlaXZlci5sb2NhbENhcGFiaWxpdGllcywgJ29mZmVyJywgc2VsZi5sb2NhbFN0cmVhbXNbMF0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX3BlbmRpbmdPZmZlciA9IHRyYW5zY2VpdmVycztcbiAgICAgIHZhciBkZXNjID0gbmV3IFJUQ1Nlc3Npb25EZXNjcmlwdGlvbih7XG4gICAgICAgIHR5cGU6ICdvZmZlcicsXG4gICAgICAgIHNkcDogc2RwXG4gICAgICB9KTtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICYmIHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoYXJndW1lbnRzWzBdLCAwLCBkZXNjKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZGVzYyk7XG4gICAgfTtcblxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuY3JlYXRlQW5zd2VyID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIHZhciBzZHAgPSBTRFBVdGlscy53cml0ZVNlc3Npb25Cb2lsZXJwbGF0ZSgpO1xuICAgICAgaWYgKHRoaXMudXNpbmdCdW5kbGUpIHtcbiAgICAgICAgc2RwICs9ICdhPWdyb3VwOkJVTkRMRSAnICsgdGhpcy50cmFuc2NlaXZlcnMubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICByZXR1cm4gdC5taWQ7XG4gICAgICAgIH0pLmpvaW4oJyAnKSArICdcXHJcXG4nO1xuICAgICAgfVxuICAgICAgdGhpcy50cmFuc2NlaXZlcnMuZm9yRWFjaChmdW5jdGlvbih0cmFuc2NlaXZlcikge1xuICAgICAgICAvLyBDYWxjdWxhdGUgaW50ZXJzZWN0aW9uIG9mIGNhcGFiaWxpdGllcy5cbiAgICAgICAgdmFyIGNvbW1vbkNhcGFiaWxpdGllcyA9IHNlbGYuX2dldENvbW1vbkNhcGFiaWxpdGllcyhcbiAgICAgICAgICAgIHRyYW5zY2VpdmVyLmxvY2FsQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgdHJhbnNjZWl2ZXIucmVtb3RlQ2FwYWJpbGl0aWVzKTtcblxuICAgICAgICBzZHAgKz0gU0RQVXRpbHMud3JpdGVNZWRpYVNlY3Rpb24odHJhbnNjZWl2ZXIsIGNvbW1vbkNhcGFiaWxpdGllcyxcbiAgICAgICAgICAgICdhbnN3ZXInLCBzZWxmLmxvY2FsU3RyZWFtc1swXSk7XG4gICAgICB9KTtcblxuICAgICAgdmFyIGRlc2MgPSBuZXcgUlRDU2Vzc2lvbkRlc2NyaXB0aW9uKHtcbiAgICAgICAgdHlwZTogJ2Fuc3dlcicsXG4gICAgICAgIHNkcDogc2RwXG4gICAgICB9KTtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICYmIHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoYXJndW1lbnRzWzBdLCAwLCBkZXNjKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZGVzYyk7XG4gICAgfTtcblxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuYWRkSWNlQ2FuZGlkYXRlID0gZnVuY3Rpb24oY2FuZGlkYXRlKSB7XG4gICAgICBpZiAoY2FuZGlkYXRlID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMudHJhbnNjZWl2ZXJzLmZvckVhY2goZnVuY3Rpb24odHJhbnNjZWl2ZXIpIHtcbiAgICAgICAgICB0cmFuc2NlaXZlci5pY2VUcmFuc3BvcnQuYWRkUmVtb3RlQ2FuZGlkYXRlKHt9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbUxpbmVJbmRleCA9IGNhbmRpZGF0ZS5zZHBNTGluZUluZGV4O1xuICAgICAgICBpZiAoY2FuZGlkYXRlLnNkcE1pZCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy50cmFuc2NlaXZlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zY2VpdmVyc1tpXS5taWQgPT09IGNhbmRpZGF0ZS5zZHBNaWQpIHtcbiAgICAgICAgICAgICAgbUxpbmVJbmRleCA9IGk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgdHJhbnNjZWl2ZXIgPSB0aGlzLnRyYW5zY2VpdmVyc1ttTGluZUluZGV4XTtcbiAgICAgICAgaWYgKHRyYW5zY2VpdmVyKSB7XG4gICAgICAgICAgdmFyIGNhbmQgPSBPYmplY3Qua2V5cyhjYW5kaWRhdGUuY2FuZGlkYXRlKS5sZW5ndGggPiAwID9cbiAgICAgICAgICAgICAgU0RQVXRpbHMucGFyc2VDYW5kaWRhdGUoY2FuZGlkYXRlLmNhbmRpZGF0ZSkgOiB7fTtcbiAgICAgICAgICAvLyBJZ25vcmUgQ2hyb21lJ3MgaW52YWxpZCBjYW5kaWRhdGVzIHNpbmNlIEVkZ2UgZG9lcyBub3QgbGlrZSB0aGVtLlxuICAgICAgICAgIGlmIChjYW5kLnByb3RvY29sID09PSAndGNwJyAmJiBjYW5kLnBvcnQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSWdub3JlIFJUQ1AgY2FuZGlkYXRlcywgd2UgYXNzdW1lIFJUQ1AtTVVYLlxuICAgICAgICAgIGlmIChjYW5kLmNvbXBvbmVudCAhPT0gJzEnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEEgZGlydHkgaGFjayB0byBtYWtlIHNhbXBsZXMgd29yay5cbiAgICAgICAgICBpZiAoY2FuZC50eXBlID09PSAnZW5kT2ZDYW5kaWRhdGVzJykge1xuICAgICAgICAgICAgY2FuZCA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cmFuc2NlaXZlci5pY2VUcmFuc3BvcnQuYWRkUmVtb3RlQ2FuZGlkYXRlKGNhbmQpO1xuXG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSByZW1vdGVEZXNjcmlwdGlvbi5cbiAgICAgICAgICB2YXIgc2VjdGlvbnMgPSBTRFBVdGlscy5zcGxpdFNlY3Rpb25zKHRoaXMucmVtb3RlRGVzY3JpcHRpb24uc2RwKTtcbiAgICAgICAgICBzZWN0aW9uc1ttTGluZUluZGV4ICsgMV0gKz0gKGNhbmQudHlwZSA/IGNhbmRpZGF0ZS5jYW5kaWRhdGUudHJpbSgpXG4gICAgICAgICAgICAgIDogJ2E9ZW5kLW9mLWNhbmRpZGF0ZXMnKSArICdcXHJcXG4nO1xuICAgICAgICAgIHRoaXMucmVtb3RlRGVzY3JpcHRpb24uc2RwID0gc2VjdGlvbnMuam9pbignJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB0eXBlb2YgYXJndW1lbnRzWzFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGFyZ3VtZW50c1sxXSwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfTtcblxuICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuZ2V0U3RhdHMgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBwcm9taXNlcyA9IFtdO1xuICAgICAgdGhpcy50cmFuc2NlaXZlcnMuZm9yRWFjaChmdW5jdGlvbih0cmFuc2NlaXZlcikge1xuICAgICAgICBbJ3J0cFNlbmRlcicsICdydHBSZWNlaXZlcicsICdpY2VHYXRoZXJlcicsICdpY2VUcmFuc3BvcnQnLFxuICAgICAgICAgICAgJ2R0bHNUcmFuc3BvcnQnXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgICAgICAgICBpZiAodHJhbnNjZWl2ZXJbbWV0aG9kXSkge1xuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2godHJhbnNjZWl2ZXJbbWV0aG9kXS5nZXRTdGF0cygpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBjYiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHR5cGVvZiBhcmd1bWVudHNbMV0gPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgICBhcmd1bWVudHNbMV07XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSkge1xuICAgICAgICAvLyBzaGltIGdldFN0YXRzIHdpdGggbWFwbGlrZSBzdXBwb3J0XG4gICAgICAgIHZhciByZXN1bHRzID0gbmV3IE1hcCgpO1xuICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbihyZXMpIHtcbiAgICAgICAgICByZXMuZm9yRWFjaChmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHJlc3VsdCkuZm9yRWFjaChmdW5jdGlvbihpZCkge1xuICAgICAgICAgICAgICByZXN1bHRzLnNldChpZCwgcmVzdWx0W2lkXSk7XG4gICAgICAgICAgICAgIHJlc3VsdHNbaWRdID0gcmVzdWx0W2lkXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChjYikge1xuICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoY2IsIDAsIHJlc3VsdHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKHJlc3VsdHMpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH0sXG5cbiAgLy8gQXR0YWNoIGEgbWVkaWEgc3RyZWFtIHRvIGFuIGVsZW1lbnQuXG4gIGF0dGFjaE1lZGlhU3RyZWFtOiBmdW5jdGlvbihlbGVtZW50LCBzdHJlYW0pIHtcbiAgICBsb2dnaW5nKCdERVBSRUNBVEVELCBhdHRhY2hNZWRpYVN0cmVhbSB3aWxsIHNvb24gYmUgcmVtb3ZlZC4nKTtcbiAgICBlbGVtZW50LnNyY09iamVjdCA9IHN0cmVhbTtcbiAgfSxcblxuICByZWF0dGFjaE1lZGlhU3RyZWFtOiBmdW5jdGlvbih0bywgZnJvbSkge1xuICAgIGxvZ2dpbmcoJ0RFUFJFQ0FURUQsIHJlYXR0YWNoTWVkaWFTdHJlYW0gd2lsbCBzb29uIGJlIHJlbW92ZWQuJyk7XG4gICAgdG8uc3JjT2JqZWN0ID0gZnJvbS5zcmNPYmplY3Q7XG4gIH1cbn07XG5cbi8vIEV4cG9zZSBwdWJsaWMgbWV0aG9kcy5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzaGltUGVlckNvbm5lY3Rpb246IGVkZ2VTaGltLnNoaW1QZWVyQ29ubmVjdGlvbixcbiAgc2hpbUdldFVzZXJNZWRpYTogcmVxdWlyZSgnLi9nZXR1c2VybWVkaWEnKSxcbiAgYXR0YWNoTWVkaWFTdHJlYW06IGVkZ2VTaGltLmF0dGFjaE1lZGlhU3RyZWFtLFxuICByZWF0dGFjaE1lZGlhU3RyZWFtOiBlZGdlU2hpbS5yZWF0dGFjaE1lZGlhU3RyZWFtXG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3RyYWNlYWJsZXBlZXJjb25uZWN0aW9uL34vd2VicnRjLWFkYXB0ZXIvc3JjL2pzL2VkZ2UvZWRnZV9zaGltLmpzXG4vLyBtb2R1bGUgaWQgPSA0ODJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 483 */
/***/ function(module, exports) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\n// Expose public methods.\nmodule.exports = function() {\n  var shimError_ = function(e) {\n    return {\n      name: {PermissionDeniedError: 'NotAllowedError'}[e.name] || e.name,\n      message: e.message,\n      constraint: e.constraint,\n      toString: function() {\n        return this.name;\n      }\n    };\n  };\n\n  // getUserMedia error shim.\n  var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n      bind(navigator.mediaDevices);\n  navigator.mediaDevices.getUserMedia = function(c) {\n    return origGetUserMedia(c).catch(function(e) {\n      return Promise.reject(shimError_(e));\n    });\n  };\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDgzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy90cmFjZWFibGVwZWVyY29ubmVjdGlvbi9ub2RlX21vZHVsZXMvd2VicnRjLWFkYXB0ZXIvc3JjL2pzL2VkZ2UvZ2V0dXNlcm1lZGlhLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiAgQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBXZWJSVEMgcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlXG4gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlXG4gKiAgdHJlZS5cbiAqL1xuIC8qIGVzbGludC1lbnYgbm9kZSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBFeHBvc2UgcHVibGljIG1ldGhvZHMuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2hpbUVycm9yXyA9IGZ1bmN0aW9uKGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZToge1Blcm1pc3Npb25EZW5pZWRFcnJvcjogJ05vdEFsbG93ZWRFcnJvcid9W2UubmFtZV0gfHwgZS5uYW1lLFxuICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgY29uc3RyYWludDogZS5jb25zdHJhaW50LFxuICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgLy8gZ2V0VXNlck1lZGlhIGVycm9yIHNoaW0uXG4gIHZhciBvcmlnR2V0VXNlck1lZGlhID0gbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEuXG4gICAgICBiaW5kKG5hdmlnYXRvci5tZWRpYURldmljZXMpO1xuICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSA9IGZ1bmN0aW9uKGMpIHtcbiAgICByZXR1cm4gb3JpZ0dldFVzZXJNZWRpYShjKS5jYXRjaChmdW5jdGlvbihlKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3Qoc2hpbUVycm9yXyhlKSk7XG4gICAgfSk7XG4gIH07XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3RyYWNlYWJsZXBlZXJjb25uZWN0aW9uL34vd2VicnRjLWFkYXB0ZXIvc3JjL2pzL2VkZ2UvZ2V0dXNlcm1lZGlhLmpzXG4vLyBtb2R1bGUgaWQgPSA0ODNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 484 */
/***/ function(module, exports, __webpack_require__) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar logging = __webpack_require__(479).log;\nvar browserDetails = __webpack_require__(479).browserDetails;\n\nvar firefoxShim = {\n  shimOnTrack: function() {\n    if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n        window.RTCPeerConnection.prototype)) {\n      Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n        get: function() {\n          return this._ontrack;\n        },\n        set: function(f) {\n          if (this._ontrack) {\n            this.removeEventListener('track', this._ontrack);\n            this.removeEventListener('addstream', this._ontrackpoly);\n          }\n          this.addEventListener('track', this._ontrack = f);\n          this.addEventListener('addstream', this._ontrackpoly = function(e) {\n            e.stream.getTracks().forEach(function(track) {\n              var event = new Event('track');\n              event.track = track;\n              event.receiver = {track: track};\n              event.streams = [e.stream];\n              this.dispatchEvent(event);\n            }.bind(this));\n          }.bind(this));\n        }\n      });\n    }\n  },\n\n  shimSourceObject: function() {\n    // Firefox has supported mozSrcObject since FF22, unprefixed in 42.\n    if (typeof window === 'object') {\n      if (window.HTMLMediaElement &&\n        !('srcObject' in window.HTMLMediaElement.prototype)) {\n        // Shim the srcObject property, once, when HTMLMediaElement is found.\n        Object.defineProperty(window.HTMLMediaElement.prototype, 'srcObject', {\n          get: function() {\n            return this.mozSrcObject;\n          },\n          set: function(stream) {\n            this.mozSrcObject = stream;\n          }\n        });\n      }\n    }\n  },\n\n  shimPeerConnection: function() {\n    if (typeof window !== 'object' || !(window.RTCPeerConnection ||\n        window.mozRTCPeerConnection)) {\n      return; // probably media.peerconnection.enabled=false in about:config\n    }\n    // The RTCPeerConnection object.\n    if (!window.RTCPeerConnection) {\n      window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n        if (browserDetails.version < 38) {\n          // .urls is not supported in FF < 38.\n          // create RTCIceServers with a single url.\n          if (pcConfig && pcConfig.iceServers) {\n            var newIceServers = [];\n            for (var i = 0; i < pcConfig.iceServers.length; i++) {\n              var server = pcConfig.iceServers[i];\n              if (server.hasOwnProperty('urls')) {\n                for (var j = 0; j < server.urls.length; j++) {\n                  var newServer = {\n                    url: server.urls[j]\n                  };\n                  if (server.urls[j].indexOf('turn') === 0) {\n                    newServer.username = server.username;\n                    newServer.credential = server.credential;\n                  }\n                  newIceServers.push(newServer);\n                }\n              } else {\n                newIceServers.push(pcConfig.iceServers[i]);\n              }\n            }\n            pcConfig.iceServers = newIceServers;\n          }\n        }\n        return new mozRTCPeerConnection(pcConfig, pcConstraints);\n      };\n      window.RTCPeerConnection.prototype = mozRTCPeerConnection.prototype;\n\n      // wrap static methods. Currently just generateCertificate.\n      if (mozRTCPeerConnection.generateCertificate) {\n        Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n          get: function() {\n            return mozRTCPeerConnection.generateCertificate;\n          }\n        });\n      }\n\n      window.RTCSessionDescription = mozRTCSessionDescription;\n      window.RTCIceCandidate = mozRTCIceCandidate;\n    }\n\n    // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n    ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n        .forEach(function(method) {\n          var nativeMethod = RTCPeerConnection.prototype[method];\n          RTCPeerConnection.prototype[method] = function() {\n            arguments[0] = new ((method === 'addIceCandidate') ?\n                RTCIceCandidate : RTCSessionDescription)(arguments[0]);\n            return nativeMethod.apply(this, arguments);\n          };\n        });\n\n    // support for addIceCandidate(null)\n    var nativeAddIceCandidate =\n        RTCPeerConnection.prototype.addIceCandidate;\n    RTCPeerConnection.prototype.addIceCandidate = function() {\n      return arguments[0] === null ? Promise.resolve()\n          : nativeAddIceCandidate.apply(this, arguments);\n    };\n\n    // shim getStats with maplike support\n    var makeMapStats = function(stats) {\n      var map = new Map();\n      Object.keys(stats).forEach(function(key) {\n        map.set(key, stats[key]);\n        map[key] = stats[key];\n      });\n      return map;\n    };\n\n    var nativeGetStats = RTCPeerConnection.prototype.getStats;\n    RTCPeerConnection.prototype.getStats = function(selector, onSucc, onErr) {\n      return nativeGetStats.apply(this, [selector || null])\n        .then(function(stats) {\n          return makeMapStats(stats);\n        })\n        .then(onSucc, onErr);\n    };\n  },\n\n  // Attach a media stream to an element.\n  attachMediaStream: function(element, stream) {\n    logging('DEPRECATED, attachMediaStream will soon be removed.');\n    element.srcObject = stream;\n  },\n\n  reattachMediaStream: function(to, from) {\n    logging('DEPRECATED, reattachMediaStream will soon be removed.');\n    to.srcObject = from.srcObject;\n  }\n};\n\n// Expose public methods.\nmodule.exports = {\n  shimOnTrack: firefoxShim.shimOnTrack,\n  shimSourceObject: firefoxShim.shimSourceObject,\n  shimPeerConnection: firefoxShim.shimPeerConnection,\n  shimGetUserMedia: __webpack_require__(485),\n  attachMediaStream: firefoxShim.attachMediaStream,\n  reattachMediaStream: firefoxShim.reattachMediaStream\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDg0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy90cmFjZWFibGVwZWVyY29ubmVjdGlvbi9ub2RlX21vZHVsZXMvd2VicnRjLWFkYXB0ZXIvc3JjL2pzL2ZpcmVmb3gvZmlyZWZveF9zaGltLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiAgQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBXZWJSVEMgcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlXG4gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlXG4gKiAgdHJlZS5cbiAqL1xuIC8qIGVzbGludC1lbnYgbm9kZSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgbG9nZ2luZyA9IHJlcXVpcmUoJy4uL3V0aWxzJykubG9nO1xudmFyIGJyb3dzZXJEZXRhaWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKS5icm93c2VyRGV0YWlscztcblxudmFyIGZpcmVmb3hTaGltID0ge1xuICBzaGltT25UcmFjazogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnICYmIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbiAmJiAhKCdvbnRyYWNrJyBpblxuICAgICAgICB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUsICdvbnRyYWNrJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9vbnRyYWNrO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uKGYpIHtcbiAgICAgICAgICBpZiAodGhpcy5fb250cmFjaykge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFjaycsIHRoaXMuX29udHJhY2spO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdhZGRzdHJlYW0nLCB0aGlzLl9vbnRyYWNrcG9seSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigndHJhY2snLCB0aGlzLl9vbnRyYWNrID0gZik7XG4gICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdhZGRzdHJlYW0nLCB0aGlzLl9vbnRyYWNrcG9seSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIGUuc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goZnVuY3Rpb24odHJhY2spIHtcbiAgICAgICAgICAgICAgdmFyIGV2ZW50ID0gbmV3IEV2ZW50KCd0cmFjaycpO1xuICAgICAgICAgICAgICBldmVudC50cmFjayA9IHRyYWNrO1xuICAgICAgICAgICAgICBldmVudC5yZWNlaXZlciA9IHt0cmFjazogdHJhY2t9O1xuICAgICAgICAgICAgICBldmVudC5zdHJlYW1zID0gW2Uuc3RyZWFtXTtcbiAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIHNoaW1Tb3VyY2VPYmplY3Q6IGZ1bmN0aW9uKCkge1xuICAgIC8vIEZpcmVmb3ggaGFzIHN1cHBvcnRlZCBtb3pTcmNPYmplY3Qgc2luY2UgRkYyMiwgdW5wcmVmaXhlZCBpbiA0Mi5cbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICh3aW5kb3cuSFRNTE1lZGlhRWxlbWVudCAmJlxuICAgICAgICAhKCdzcmNPYmplY3QnIGluIHdpbmRvdy5IVE1MTWVkaWFFbGVtZW50LnByb3RvdHlwZSkpIHtcbiAgICAgICAgLy8gU2hpbSB0aGUgc3JjT2JqZWN0IHByb3BlcnR5LCBvbmNlLCB3aGVuIEhUTUxNZWRpYUVsZW1lbnQgaXMgZm91bmQuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3cuSFRNTE1lZGlhRWxlbWVudC5wcm90b3R5cGUsICdzcmNPYmplY3QnLCB7XG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1velNyY09iamVjdDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldDogZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICAgICAgICB0aGlzLm1velNyY09iamVjdCA9IHN0cmVhbTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBzaGltUGVlckNvbm5lY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAnb2JqZWN0JyB8fCAhKHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbiB8fFxuICAgICAgICB3aW5kb3cubW96UlRDUGVlckNvbm5lY3Rpb24pKSB7XG4gICAgICByZXR1cm47IC8vIHByb2JhYmx5IG1lZGlhLnBlZXJjb25uZWN0aW9uLmVuYWJsZWQ9ZmFsc2UgaW4gYWJvdXQ6Y29uZmlnXG4gICAgfVxuICAgIC8vIFRoZSBSVENQZWVyQ29ubmVjdGlvbiBvYmplY3QuXG4gICAgaWYgKCF3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24pIHtcbiAgICAgIHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKHBjQ29uZmlnLCBwY0NvbnN0cmFpbnRzKSB7XG4gICAgICAgIGlmIChicm93c2VyRGV0YWlscy52ZXJzaW9uIDwgMzgpIHtcbiAgICAgICAgICAvLyAudXJscyBpcyBub3Qgc3VwcG9ydGVkIGluIEZGIDwgMzguXG4gICAgICAgICAgLy8gY3JlYXRlIFJUQ0ljZVNlcnZlcnMgd2l0aCBhIHNpbmdsZSB1cmwuXG4gICAgICAgICAgaWYgKHBjQ29uZmlnICYmIHBjQ29uZmlnLmljZVNlcnZlcnMpIHtcbiAgICAgICAgICAgIHZhciBuZXdJY2VTZXJ2ZXJzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBjQ29uZmlnLmljZVNlcnZlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFyIHNlcnZlciA9IHBjQ29uZmlnLmljZVNlcnZlcnNbaV07XG4gICAgICAgICAgICAgIGlmIChzZXJ2ZXIuaGFzT3duUHJvcGVydHkoJ3VybHMnKSkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2VydmVyLnVybHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgIHZhciBuZXdTZXJ2ZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgIHVybDogc2VydmVyLnVybHNbal1cbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICBpZiAoc2VydmVyLnVybHNbal0uaW5kZXhPZigndHVybicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1NlcnZlci51c2VybmFtZSA9IHNlcnZlci51c2VybmFtZTtcbiAgICAgICAgICAgICAgICAgICAgbmV3U2VydmVyLmNyZWRlbnRpYWwgPSBzZXJ2ZXIuY3JlZGVudGlhbDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIG5ld0ljZVNlcnZlcnMucHVzaChuZXdTZXJ2ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdJY2VTZXJ2ZXJzLnB1c2gocGNDb25maWcuaWNlU2VydmVyc1tpXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBjQ29uZmlnLmljZVNlcnZlcnMgPSBuZXdJY2VTZXJ2ZXJzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IG1velJUQ1BlZXJDb25uZWN0aW9uKHBjQ29uZmlnLCBwY0NvbnN0cmFpbnRzKTtcbiAgICAgIH07XG4gICAgICB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlID0gbW96UlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlO1xuXG4gICAgICAvLyB3cmFwIHN0YXRpYyBtZXRob2RzLiBDdXJyZW50bHkganVzdCBnZW5lcmF0ZUNlcnRpZmljYXRlLlxuICAgICAgaWYgKG1velJUQ1BlZXJDb25uZWN0aW9uLmdlbmVyYXRlQ2VydGlmaWNhdGUpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5SVENQZWVyQ29ubmVjdGlvbiwgJ2dlbmVyYXRlQ2VydGlmaWNhdGUnLCB7XG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBtb3pSVENQZWVyQ29ubmVjdGlvbi5nZW5lcmF0ZUNlcnRpZmljYXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHdpbmRvdy5SVENTZXNzaW9uRGVzY3JpcHRpb24gPSBtb3pSVENTZXNzaW9uRGVzY3JpcHRpb247XG4gICAgICB3aW5kb3cuUlRDSWNlQ2FuZGlkYXRlID0gbW96UlRDSWNlQ2FuZGlkYXRlO1xuICAgIH1cblxuICAgIC8vIHNoaW0gYXdheSBuZWVkIGZvciBvYnNvbGV0ZSBSVENJY2VDYW5kaWRhdGUvUlRDU2Vzc2lvbkRlc2NyaXB0aW9uLlxuICAgIFsnc2V0TG9jYWxEZXNjcmlwdGlvbicsICdzZXRSZW1vdGVEZXNjcmlwdGlvbicsICdhZGRJY2VDYW5kaWRhdGUnXVxuICAgICAgICAuZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgICAgICB2YXIgbmF0aXZlTWV0aG9kID0gUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlW21ldGhvZF07XG4gICAgICAgICAgUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGFyZ3VtZW50c1swXSA9IG5ldyAoKG1ldGhvZCA9PT0gJ2FkZEljZUNhbmRpZGF0ZScpID9cbiAgICAgICAgICAgICAgICBSVENJY2VDYW5kaWRhdGUgOiBSVENTZXNzaW9uRGVzY3JpcHRpb24pKGFyZ3VtZW50c1swXSk7XG4gICAgICAgICAgICByZXR1cm4gbmF0aXZlTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAvLyBzdXBwb3J0IGZvciBhZGRJY2VDYW5kaWRhdGUobnVsbClcbiAgICB2YXIgbmF0aXZlQWRkSWNlQ2FuZGlkYXRlID1cbiAgICAgICAgUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLmFkZEljZUNhbmRpZGF0ZTtcbiAgICBSVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuYWRkSWNlQ2FuZGlkYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzWzBdID09PSBudWxsID8gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICA6IG5hdGl2ZUFkZEljZUNhbmRpZGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICAvLyBzaGltIGdldFN0YXRzIHdpdGggbWFwbGlrZSBzdXBwb3J0XG4gICAgdmFyIG1ha2VNYXBTdGF0cyA9IGZ1bmN0aW9uKHN0YXRzKSB7XG4gICAgICB2YXIgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgT2JqZWN0LmtleXMoc3RhdHMpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIG1hcC5zZXQoa2V5LCBzdGF0c1trZXldKTtcbiAgICAgICAgbWFwW2tleV0gPSBzdGF0c1trZXldO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWFwO1xuICAgIH07XG5cbiAgICB2YXIgbmF0aXZlR2V0U3RhdHMgPSBSVENQZWVyQ29ubmVjdGlvbi5wcm90b3R5cGUuZ2V0U3RhdHM7XG4gICAgUlRDUGVlckNvbm5lY3Rpb24ucHJvdG90eXBlLmdldFN0YXRzID0gZnVuY3Rpb24oc2VsZWN0b3IsIG9uU3VjYywgb25FcnIpIHtcbiAgICAgIHJldHVybiBuYXRpdmVHZXRTdGF0cy5hcHBseSh0aGlzLCBbc2VsZWN0b3IgfHwgbnVsbF0pXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uKHN0YXRzKSB7XG4gICAgICAgICAgcmV0dXJuIG1ha2VNYXBTdGF0cyhzdGF0cyk7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKG9uU3VjYywgb25FcnIpO1xuICAgIH07XG4gIH0sXG5cbiAgLy8gQXR0YWNoIGEgbWVkaWEgc3RyZWFtIHRvIGFuIGVsZW1lbnQuXG4gIGF0dGFjaE1lZGlhU3RyZWFtOiBmdW5jdGlvbihlbGVtZW50LCBzdHJlYW0pIHtcbiAgICBsb2dnaW5nKCdERVBSRUNBVEVELCBhdHRhY2hNZWRpYVN0cmVhbSB3aWxsIHNvb24gYmUgcmVtb3ZlZC4nKTtcbiAgICBlbGVtZW50LnNyY09iamVjdCA9IHN0cmVhbTtcbiAgfSxcblxuICByZWF0dGFjaE1lZGlhU3RyZWFtOiBmdW5jdGlvbih0bywgZnJvbSkge1xuICAgIGxvZ2dpbmcoJ0RFUFJFQ0FURUQsIHJlYXR0YWNoTWVkaWFTdHJlYW0gd2lsbCBzb29uIGJlIHJlbW92ZWQuJyk7XG4gICAgdG8uc3JjT2JqZWN0ID0gZnJvbS5zcmNPYmplY3Q7XG4gIH1cbn07XG5cbi8vIEV4cG9zZSBwdWJsaWMgbWV0aG9kcy5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzaGltT25UcmFjazogZmlyZWZveFNoaW0uc2hpbU9uVHJhY2ssXG4gIHNoaW1Tb3VyY2VPYmplY3Q6IGZpcmVmb3hTaGltLnNoaW1Tb3VyY2VPYmplY3QsXG4gIHNoaW1QZWVyQ29ubmVjdGlvbjogZmlyZWZveFNoaW0uc2hpbVBlZXJDb25uZWN0aW9uLFxuICBzaGltR2V0VXNlck1lZGlhOiByZXF1aXJlKCcuL2dldHVzZXJtZWRpYScpLFxuICBhdHRhY2hNZWRpYVN0cmVhbTogZmlyZWZveFNoaW0uYXR0YWNoTWVkaWFTdHJlYW0sXG4gIHJlYXR0YWNoTWVkaWFTdHJlYW06IGZpcmVmb3hTaGltLnJlYXR0YWNoTWVkaWFTdHJlYW1cbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdHJhY2VhYmxlcGVlcmNvbm5lY3Rpb24vfi93ZWJydGMtYWRhcHRlci9zcmMvanMvZmlyZWZveC9maXJlZm94X3NoaW0uanNcbi8vIG1vZHVsZSBpZCA9IDQ4NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 485 */
/***/ function(module, exports, __webpack_require__) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar logging = __webpack_require__(479).log;\nvar browserDetails = __webpack_require__(479).browserDetails;\n\n// Expose public methods.\nmodule.exports = function() {\n  var shimError_ = function(e) {\n    return {\n      name: {\n        SecurityError: 'NotAllowedError',\n        PermissionDeniedError: 'NotAllowedError'\n      }[e.name] || e.name,\n      message: {\n        'The operation is insecure.': 'The request is not allowed by the ' +\n        'user agent or the platform in the current context.'\n      }[e.message] || e.message,\n      constraint: e.constraint,\n      toString: function() {\n        return this.name + (this.message && ': ') + this.message;\n      }\n    };\n  };\n\n  // getUserMedia constraints shim.\n  var getUserMedia_ = function(constraints, onSuccess, onError) {\n    var constraintsToFF37_ = function(c) {\n      if (typeof c !== 'object' || c.require) {\n        return c;\n      }\n      var require = [];\n      Object.keys(c).forEach(function(key) {\n        if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n          return;\n        }\n        var r = c[key] = (typeof c[key] === 'object') ?\n            c[key] : {ideal: c[key]};\n        if (r.min !== undefined ||\n            r.max !== undefined || r.exact !== undefined) {\n          require.push(key);\n        }\n        if (r.exact !== undefined) {\n          if (typeof r.exact === 'number') {\n            r. min = r.max = r.exact;\n          } else {\n            c[key] = r.exact;\n          }\n          delete r.exact;\n        }\n        if (r.ideal !== undefined) {\n          c.advanced = c.advanced || [];\n          var oc = {};\n          if (typeof r.ideal === 'number') {\n            oc[key] = {min: r.ideal, max: r.ideal};\n          } else {\n            oc[key] = r.ideal;\n          }\n          c.advanced.push(oc);\n          delete r.ideal;\n          if (!Object.keys(r).length) {\n            delete c[key];\n          }\n        }\n      });\n      if (require.length) {\n        c.require = require;\n      }\n      return c;\n    };\n    constraints = JSON.parse(JSON.stringify(constraints));\n    if (browserDetails.version < 38) {\n      logging('spec: ' + JSON.stringify(constraints));\n      if (constraints.audio) {\n        constraints.audio = constraintsToFF37_(constraints.audio);\n      }\n      if (constraints.video) {\n        constraints.video = constraintsToFF37_(constraints.video);\n      }\n      logging('ff37: ' + JSON.stringify(constraints));\n    }\n    return navigator.mozGetUserMedia(constraints, onSuccess, function(e) {\n      onError(shimError_(e));\n    });\n  };\n\n  // Returns the result of getUserMedia as a Promise.\n  var getUserMediaPromise_ = function(constraints) {\n    return new Promise(function(resolve, reject) {\n      getUserMedia_(constraints, resolve, reject);\n    });\n  };\n\n  // Shim for mediaDevices on older versions.\n  if (!navigator.mediaDevices) {\n    navigator.mediaDevices = {getUserMedia: getUserMediaPromise_,\n      addEventListener: function() { },\n      removeEventListener: function() { }\n    };\n  }\n  navigator.mediaDevices.enumerateDevices =\n      navigator.mediaDevices.enumerateDevices || function() {\n        return new Promise(function(resolve) {\n          var infos = [\n            {kind: 'audioinput', deviceId: 'default', label: '', groupId: ''},\n            {kind: 'videoinput', deviceId: 'default', label: '', groupId: ''}\n          ];\n          resolve(infos);\n        });\n      };\n\n  if (browserDetails.version < 41) {\n    // Work around http://bugzil.la/1169665\n    var orgEnumerateDevices =\n        navigator.mediaDevices.enumerateDevices.bind(navigator.mediaDevices);\n    navigator.mediaDevices.enumerateDevices = function() {\n      return orgEnumerateDevices().then(undefined, function(e) {\n        if (e.name === 'NotFoundError') {\n          return [];\n        }\n        throw e;\n      });\n    };\n  }\n  if (browserDetails.version < 49) {\n    var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n        bind(navigator.mediaDevices);\n    navigator.mediaDevices.getUserMedia = function(c) {\n      return origGetUserMedia(c).catch(function(e) {\n        return Promise.reject(shimError_(e));\n      });\n    };\n  }\n  navigator.getUserMedia = function(constraints, onSuccess, onError) {\n    if (browserDetails.version < 44) {\n      return getUserMedia_(constraints, onSuccess, onError);\n    }\n    // Replace Firefox 44+'s deprecation warning with unprefixed version.\n    console.warn('navigator.getUserMedia has been replaced by ' +\n                 'navigator.mediaDevices.getUserMedia');\n    navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n  };\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDg1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy90cmFjZWFibGVwZWVyY29ubmVjdGlvbi9ub2RlX21vZHVsZXMvd2VicnRjLWFkYXB0ZXIvc3JjL2pzL2ZpcmVmb3gvZ2V0dXNlcm1lZGlhLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiAgQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBXZWJSVEMgcHJvamVjdCBhdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqICBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlXG4gKiAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlXG4gKiAgdHJlZS5cbiAqL1xuIC8qIGVzbGludC1lbnYgbm9kZSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgbG9nZ2luZyA9IHJlcXVpcmUoJy4uL3V0aWxzJykubG9nO1xudmFyIGJyb3dzZXJEZXRhaWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKS5icm93c2VyRGV0YWlscztcblxuLy8gRXhwb3NlIHB1YmxpYyBtZXRob2RzLlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNoaW1FcnJvcl8gPSBmdW5jdGlvbihlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHtcbiAgICAgICAgU2VjdXJpdHlFcnJvcjogJ05vdEFsbG93ZWRFcnJvcicsXG4gICAgICAgIFBlcm1pc3Npb25EZW5pZWRFcnJvcjogJ05vdEFsbG93ZWRFcnJvcidcbiAgICAgIH1bZS5uYW1lXSB8fCBlLm5hbWUsXG4gICAgICBtZXNzYWdlOiB7XG4gICAgICAgICdUaGUgb3BlcmF0aW9uIGlzIGluc2VjdXJlLic6ICdUaGUgcmVxdWVzdCBpcyBub3QgYWxsb3dlZCBieSB0aGUgJyArXG4gICAgICAgICd1c2VyIGFnZW50IG9yIHRoZSBwbGF0Zm9ybSBpbiB0aGUgY3VycmVudCBjb250ZXh0LidcbiAgICAgIH1bZS5tZXNzYWdlXSB8fCBlLm1lc3NhZ2UsXG4gICAgICBjb25zdHJhaW50OiBlLmNvbnN0cmFpbnQsXG4gICAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWUgKyAodGhpcy5tZXNzYWdlICYmICc6ICcpICsgdGhpcy5tZXNzYWdlO1xuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgLy8gZ2V0VXNlck1lZGlhIGNvbnN0cmFpbnRzIHNoaW0uXG4gIHZhciBnZXRVc2VyTWVkaWFfID0gZnVuY3Rpb24oY29uc3RyYWludHMsIG9uU3VjY2Vzcywgb25FcnJvcikge1xuICAgIHZhciBjb25zdHJhaW50c1RvRkYzN18gPSBmdW5jdGlvbihjKSB7XG4gICAgICBpZiAodHlwZW9mIGMgIT09ICdvYmplY3QnIHx8IGMucmVxdWlyZSkge1xuICAgICAgICByZXR1cm4gYztcbiAgICAgIH1cbiAgICAgIHZhciByZXF1aXJlID0gW107XG4gICAgICBPYmplY3Qua2V5cyhjKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBpZiAoa2V5ID09PSAncmVxdWlyZScgfHwga2V5ID09PSAnYWR2YW5jZWQnIHx8IGtleSA9PT0gJ21lZGlhU291cmNlJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgciA9IGNba2V5XSA9ICh0eXBlb2YgY1trZXldID09PSAnb2JqZWN0JykgP1xuICAgICAgICAgICAgY1trZXldIDoge2lkZWFsOiBjW2tleV19O1xuICAgICAgICBpZiAoci5taW4gIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgci5tYXggIT09IHVuZGVmaW5lZCB8fCByLmV4YWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXF1aXJlLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5leGFjdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByLmV4YWN0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgci4gbWluID0gci5tYXggPSByLmV4YWN0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjW2tleV0gPSByLmV4YWN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgci5leGFjdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5pZGVhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYy5hZHZhbmNlZCA9IGMuYWR2YW5jZWQgfHwgW107XG4gICAgICAgICAgdmFyIG9jID0ge307XG4gICAgICAgICAgaWYgKHR5cGVvZiByLmlkZWFsID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgb2Nba2V5XSA9IHttaW46IHIuaWRlYWwsIG1heDogci5pZGVhbH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9jW2tleV0gPSByLmlkZWFsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjLmFkdmFuY2VkLnB1c2gob2MpO1xuICAgICAgICAgIGRlbGV0ZSByLmlkZWFsO1xuICAgICAgICAgIGlmICghT2JqZWN0LmtleXMocikubGVuZ3RoKSB7XG4gICAgICAgICAgICBkZWxldGUgY1trZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAocmVxdWlyZS5sZW5ndGgpIHtcbiAgICAgICAgYy5yZXF1aXJlID0gcmVxdWlyZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjO1xuICAgIH07XG4gICAgY29uc3RyYWludHMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNvbnN0cmFpbnRzKSk7XG4gICAgaWYgKGJyb3dzZXJEZXRhaWxzLnZlcnNpb24gPCAzOCkge1xuICAgICAgbG9nZ2luZygnc3BlYzogJyArIEpTT04uc3RyaW5naWZ5KGNvbnN0cmFpbnRzKSk7XG4gICAgICBpZiAoY29uc3RyYWludHMuYXVkaW8pIHtcbiAgICAgICAgY29uc3RyYWludHMuYXVkaW8gPSBjb25zdHJhaW50c1RvRkYzN18oY29uc3RyYWludHMuYXVkaW8pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbnN0cmFpbnRzLnZpZGVvKSB7XG4gICAgICAgIGNvbnN0cmFpbnRzLnZpZGVvID0gY29uc3RyYWludHNUb0ZGMzdfKGNvbnN0cmFpbnRzLnZpZGVvKTtcbiAgICAgIH1cbiAgICAgIGxvZ2dpbmcoJ2ZmMzc6ICcgKyBKU09OLnN0cmluZ2lmeShjb25zdHJhaW50cykpO1xuICAgIH1cbiAgICByZXR1cm4gbmF2aWdhdG9yLm1vekdldFVzZXJNZWRpYShjb25zdHJhaW50cywgb25TdWNjZXNzLCBmdW5jdGlvbihlKSB7XG4gICAgICBvbkVycm9yKHNoaW1FcnJvcl8oZSkpO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIFJldHVybnMgdGhlIHJlc3VsdCBvZiBnZXRVc2VyTWVkaWEgYXMgYSBQcm9taXNlLlxuICB2YXIgZ2V0VXNlck1lZGlhUHJvbWlzZV8gPSBmdW5jdGlvbihjb25zdHJhaW50cykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGdldFVzZXJNZWRpYV8oY29uc3RyYWludHMsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gU2hpbSBmb3IgbWVkaWFEZXZpY2VzIG9uIG9sZGVyIHZlcnNpb25zLlxuICBpZiAoIW5hdmlnYXRvci5tZWRpYURldmljZXMpIHtcbiAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzID0ge2dldFVzZXJNZWRpYTogZ2V0VXNlck1lZGlhUHJvbWlzZV8sXG4gICAgICBhZGRFdmVudExpc3RlbmVyOiBmdW5jdGlvbigpIHsgfSxcbiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uKCkgeyB9XG4gICAgfTtcbiAgfVxuICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMgPVxuICAgICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzIHx8IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSkge1xuICAgICAgICAgIHZhciBpbmZvcyA9IFtcbiAgICAgICAgICAgIHtraW5kOiAnYXVkaW9pbnB1dCcsIGRldmljZUlkOiAnZGVmYXVsdCcsIGxhYmVsOiAnJywgZ3JvdXBJZDogJyd9LFxuICAgICAgICAgICAge2tpbmQ6ICd2aWRlb2lucHV0JywgZGV2aWNlSWQ6ICdkZWZhdWx0JywgbGFiZWw6ICcnLCBncm91cElkOiAnJ31cbiAgICAgICAgICBdO1xuICAgICAgICAgIHJlc29sdmUoaW5mb3MpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgaWYgKGJyb3dzZXJEZXRhaWxzLnZlcnNpb24gPCA0MSkge1xuICAgIC8vIFdvcmsgYXJvdW5kIGh0dHA6Ly9idWd6aWwubGEvMTE2OTY2NVxuICAgIHZhciBvcmdFbnVtZXJhdGVEZXZpY2VzID1cbiAgICAgICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzLmJpbmQobmF2aWdhdG9yLm1lZGlhRGV2aWNlcyk7XG4gICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gb3JnRW51bWVyYXRlRGV2aWNlcygpLnRoZW4odW5kZWZpbmVkLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIGlmIChlLm5hbWUgPT09ICdOb3RGb3VuZEVycm9yJykge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuICBpZiAoYnJvd3NlckRldGFpbHMudmVyc2lvbiA8IDQ5KSB7XG4gICAgdmFyIG9yaWdHZXRVc2VyTWVkaWEgPSBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYS5cbiAgICAgICAgYmluZChuYXZpZ2F0b3IubWVkaWFEZXZpY2VzKTtcbiAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSA9IGZ1bmN0aW9uKGMpIHtcbiAgICAgIHJldHVybiBvcmlnR2V0VXNlck1lZGlhKGMpLmNhdGNoKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHNoaW1FcnJvcl8oZSkpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuICBuYXZpZ2F0b3IuZ2V0VXNlck1lZGlhID0gZnVuY3Rpb24oY29uc3RyYWludHMsIG9uU3VjY2Vzcywgb25FcnJvcikge1xuICAgIGlmIChicm93c2VyRGV0YWlscy52ZXJzaW9uIDwgNDQpIHtcbiAgICAgIHJldHVybiBnZXRVc2VyTWVkaWFfKGNvbnN0cmFpbnRzLCBvblN1Y2Nlc3MsIG9uRXJyb3IpO1xuICAgIH1cbiAgICAvLyBSZXBsYWNlIEZpcmVmb3ggNDQrJ3MgZGVwcmVjYXRpb24gd2FybmluZyB3aXRoIHVucHJlZml4ZWQgdmVyc2lvbi5cbiAgICBjb25zb2xlLndhcm4oJ25hdmlnYXRvci5nZXRVc2VyTWVkaWEgaGFzIGJlZW4gcmVwbGFjZWQgYnkgJyArXG4gICAgICAgICAgICAgICAgICduYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYScpO1xuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKGNvbnN0cmFpbnRzKS50aGVuKG9uU3VjY2Vzcywgb25FcnJvcik7XG4gIH07XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3RyYWNlYWJsZXBlZXJjb25uZWN0aW9uL34vd2VicnRjLWFkYXB0ZXIvc3JjL2pzL2ZpcmVmb3gvZ2V0dXNlcm1lZGlhLmpzXG4vLyBtb2R1bGUgaWQgPSA0ODVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 486 */
/***/ function(module, exports) {

    eval("/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n'use strict';\nvar safariShim = {\n  // TODO: DrAlex, should be here, double check against LayoutTests\n  // shimOnTrack: function() { },\n\n  // TODO: DrAlex\n  // attachMediaStream: function(element, stream) { },\n  // reattachMediaStream: function(to, from) { },\n\n  // TODO: once the back-end for the mac port is done, add.\n  // TODO: check for webkitGTK+\n  // shimPeerConnection: function() { },\n\n  shimGetUserMedia: function() {\n    navigator.getUserMedia = navigator.webkitGetUserMedia;\n  }\n};\n\n// Expose public methods.\nmodule.exports = {\n  shimGetUserMedia: safariShim.shimGetUserMedia\n  // TODO\n  // shimOnTrack: safariShim.shimOnTrack,\n  // shimPeerConnection: safariShim.shimPeerConnection,\n  // attachMediaStream: safariShim.attachMediaStream,\n  // reattachMediaStream: safariShim.reattachMediaStream\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDg2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy90cmFjZWFibGVwZWVyY29ubmVjdGlvbi9ub2RlX21vZHVsZXMvd2VicnRjLWFkYXB0ZXIvc3JjL2pzL3NhZmFyaS9zYWZhcmlfc2hpbS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogIENvcHlyaWdodCAoYykgMjAxNiBUaGUgV2ViUlRDIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZVxuICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZVxuICogIHRyZWUuXG4gKi9cbid1c2Ugc3RyaWN0JztcbnZhciBzYWZhcmlTaGltID0ge1xuICAvLyBUT0RPOiBEckFsZXgsIHNob3VsZCBiZSBoZXJlLCBkb3VibGUgY2hlY2sgYWdhaW5zdCBMYXlvdXRUZXN0c1xuICAvLyBzaGltT25UcmFjazogZnVuY3Rpb24oKSB7IH0sXG5cbiAgLy8gVE9ETzogRHJBbGV4XG4gIC8vIGF0dGFjaE1lZGlhU3RyZWFtOiBmdW5jdGlvbihlbGVtZW50LCBzdHJlYW0pIHsgfSxcbiAgLy8gcmVhdHRhY2hNZWRpYVN0cmVhbTogZnVuY3Rpb24odG8sIGZyb20pIHsgfSxcblxuICAvLyBUT0RPOiBvbmNlIHRoZSBiYWNrLWVuZCBmb3IgdGhlIG1hYyBwb3J0IGlzIGRvbmUsIGFkZC5cbiAgLy8gVE9ETzogY2hlY2sgZm9yIHdlYmtpdEdUSytcbiAgLy8gc2hpbVBlZXJDb25uZWN0aW9uOiBmdW5jdGlvbigpIHsgfSxcblxuICBzaGltR2V0VXNlck1lZGlhOiBmdW5jdGlvbigpIHtcbiAgICBuYXZpZ2F0b3IuZ2V0VXNlck1lZGlhID0gbmF2aWdhdG9yLndlYmtpdEdldFVzZXJNZWRpYTtcbiAgfVxufTtcblxuLy8gRXhwb3NlIHB1YmxpYyBtZXRob2RzLlxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNoaW1HZXRVc2VyTWVkaWE6IHNhZmFyaVNoaW0uc2hpbUdldFVzZXJNZWRpYVxuICAvLyBUT0RPXG4gIC8vIHNoaW1PblRyYWNrOiBzYWZhcmlTaGltLnNoaW1PblRyYWNrLFxuICAvLyBzaGltUGVlckNvbm5lY3Rpb246IHNhZmFyaVNoaW0uc2hpbVBlZXJDb25uZWN0aW9uLFxuICAvLyBhdHRhY2hNZWRpYVN0cmVhbTogc2FmYXJpU2hpbS5hdHRhY2hNZWRpYVN0cmVhbSxcbiAgLy8gcmVhdHRhY2hNZWRpYVN0cmVhbTogc2FmYXJpU2hpbS5yZWF0dGFjaE1lZGlhU3RyZWFtXG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3RyYWNlYWJsZXBlZXJjb25uZWN0aW9uL34vd2VicnRjLWFkYXB0ZXIvc3JjL2pzL3NhZmFyaS9zYWZhcmlfc2hpbS5qc1xuLy8gbW9kdWxlIGlkID0gNDg2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 487 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(global, module) {/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    promiseTag = '[object Promise]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/**\n * Adds the key-value `pair` to `map`.\n *\n * @private\n * @param {Object} map The map to modify.\n * @param {Array} pair The key-value pair to add.\n * @returns {Object} Returns `map`.\n */\nfunction addMapEntry(map, pair) {\n  // Don't return `map.set` because it's not chainable in IE 11.\n  map.set(pair[0], pair[1]);\n  return map;\n}\n\n/**\n * Adds `value` to `set`.\n *\n * @private\n * @param {Object} set The set to modify.\n * @param {*} value The value to add.\n * @returns {Object} Returns `set`.\n */\nfunction addSetEntry(set, value) {\n  // Don't return `set.add` because it's not chainable in IE 11.\n  set.add(value);\n  return set;\n}\n\n/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n  var index = -1,\n      length = array ? array.length : 0;\n\n  while (++index < length) {\n    if (iteratee(array[index], index, array) === false) {\n      break;\n    }\n  }\n  return array;\n}\n\n/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\n/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n *  the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n  var index = -1,\n      length = array ? array.length : 0;\n\n  if (initAccum && length) {\n    accumulator = array[++index];\n  }\n  while (++index < length) {\n    accumulator = iteratee(accumulator, array[index], index, array);\n  }\n  return accumulator;\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n  var index = -1,\n      result = Array(n);\n\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nfunction isHostObject(value) {\n  // Many host objects are `Object` objects that can coerce to strings\n  // despite having improperly defined `toString` methods.\n  var result = false;\n  if (value != null && typeof value.toString != 'function') {\n    try {\n      result = !!(value + '');\n    } catch (e) {}\n  }\n  return result;\n}\n\n/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n  var index = -1,\n      result = Array(map.size);\n\n  map.forEach(function(value, key) {\n    result[++index] = [key, value];\n  });\n  return result;\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = value;\n  });\n  return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n    funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n    Symbol = root.Symbol,\n    Uint8Array = root.Uint8Array,\n    getPrototype = overArg(Object.getPrototypeOf, Object),\n    objectCreate = Object.create,\n    propertyIsEnumerable = objectProto.propertyIsEnumerable,\n    splice = arrayProto.splice;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols,\n    nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n    nativeKeys = overArg(Object.keys, Object);\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView'),\n    Map = getNative(root, 'Map'),\n    Promise = getNative(root, 'Promise'),\n    Set = getNative(root, 'Set'),\n    WeakMap = getNative(root, 'WeakMap'),\n    nativeCreate = getNative(Object, 'create');\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n    mapCtorString = toSource(Map),\n    promiseCtorString = toSource(Promise),\n    setCtorString = toSource(Set),\n    weakMapCtorString = toSource(WeakMap);\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n  var index = -1,\n      length = entries ? entries.length : 0;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n  this.__data__ = nativeCreate ? nativeCreate(null) : {};\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n  return this.has(key) && delete this.__data__[key];\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n  var data = this.__data__;\n  if (nativeCreate) {\n    var result = data[key];\n    return result === HASH_UNDEFINED ? undefined : result;\n  }\n  return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n  var data = this.__data__;\n  return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n  var data = this.__data__;\n  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n  return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n  var index = -1,\n      length = entries ? entries.length : 0;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n  this.__data__ = [];\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    return false;\n  }\n  var lastIndex = data.length - 1;\n  if (index == lastIndex) {\n    data.pop();\n  } else {\n    splice.call(data, index, 1);\n  }\n  return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n  return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    data.push([key, value]);\n  } else {\n    data[index][1] = value;\n  }\n  return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n  var index = -1,\n      length = entries ? entries.length : 0;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n  this.__data__ = {\n    'hash': new Hash,\n    'map': new (Map || ListCache),\n    'string': new Hash\n  };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n  return getMapData(this, key)['delete'](key);\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n  return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n  return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n  getMapData(this, key).set(key, value);\n  return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n  this.__data__ = new ListCache(entries);\n}\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n  this.__data__ = new ListCache;\n}\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n  return this.__data__['delete'](key);\n}\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n  return this.__data__.get(key);\n}\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n  return this.__data__.has(key);\n}\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n  var cache = this.__data__;\n  if (cache instanceof ListCache) {\n    var pairs = cache.__data__;\n    if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n      pairs.push([key, value]);\n      return this;\n    }\n    cache = this.__data__ = new MapCache(pairs);\n  }\n  cache.set(key, value);\n  return this;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n  // Safari 9 makes `arguments.length` enumerable in strict mode.\n  var result = (isArray(value) || isArguments(value))\n    ? baseTimes(value.length, String)\n    : [];\n\n  var length = result.length,\n      skipIndexes = !!length;\n\n  for (var key in value) {\n    if ((inherited || hasOwnProperty.call(value, key)) &&\n        !(skipIndexes && (key == 'length' || isIndex(key, length)))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n  var objValue = object[key];\n  if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n      (value === undefined && !(key in object))) {\n    object[key] = value;\n  }\n}\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n  var length = array.length;\n  while (length--) {\n    if (eq(array[length][0], key)) {\n      return length;\n    }\n  }\n  return -1;\n}\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n  return object && copyObject(source, keys(source), object);\n}\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @param {boolean} [isFull] Specify a clone including symbols.\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, isDeep, isFull, customizer, key, object, stack) {\n  var result;\n  if (customizer) {\n    result = object ? customizer(value, key, object, stack) : customizer(value);\n  }\n  if (result !== undefined) {\n    return result;\n  }\n  if (!isObject(value)) {\n    return value;\n  }\n  var isArr = isArray(value);\n  if (isArr) {\n    result = initCloneArray(value);\n    if (!isDeep) {\n      return copyArray(value, result);\n    }\n  } else {\n    var tag = getTag(value),\n        isFunc = tag == funcTag || tag == genTag;\n\n    if (isBuffer(value)) {\n      return cloneBuffer(value, isDeep);\n    }\n    if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n      if (isHostObject(value)) {\n        return object ? value : {};\n      }\n      result = initCloneObject(isFunc ? {} : value);\n      if (!isDeep) {\n        return copySymbols(value, baseAssign(result, value));\n      }\n    } else {\n      if (!cloneableTags[tag]) {\n        return object ? value : {};\n      }\n      result = initCloneByTag(value, tag, baseClone, isDeep);\n    }\n  }\n  // Check for circular references and return its corresponding clone.\n  stack || (stack = new Stack);\n  var stacked = stack.get(value);\n  if (stacked) {\n    return stacked;\n  }\n  stack.set(value, result);\n\n  if (!isArr) {\n    var props = isFull ? getAllKeys(value) : keys(value);\n  }\n  arrayEach(props || value, function(subValue, key) {\n    if (props) {\n      key = subValue;\n      subValue = value[key];\n    }\n    // Recursively populate clone (susceptible to call stack limits).\n    assignValue(result, key, baseClone(subValue, isDeep, isFull, customizer, key, value, stack));\n  });\n  return result;\n}\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} prototype The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nfunction baseCreate(proto) {\n  return isObject(proto) ? objectCreate(proto) : {};\n}\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n  var result = keysFunc(object);\n  return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\n/**\n * The base implementation of `getTag`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  return objectToString.call(value);\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n  if (!isPrototype(object)) {\n    return nativeKeys(object);\n  }\n  var result = [];\n  for (var key in Object(object)) {\n    if (hasOwnProperty.call(object, key) && key != 'constructor') {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\n/**\n * Creates a clone of  `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n  if (isDeep) {\n    return buffer.slice();\n  }\n  var result = new buffer.constructor(buffer.length);\n  buffer.copy(result);\n  return result;\n}\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n  var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n  new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n  return result;\n}\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n  var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n  return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\n/**\n * Creates a clone of `map`.\n *\n * @private\n * @param {Object} map The map to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned map.\n */\nfunction cloneMap(map, isDeep, cloneFunc) {\n  var array = isDeep ? cloneFunc(mapToArray(map), true) : mapToArray(map);\n  return arrayReduce(array, addMapEntry, new map.constructor);\n}\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n  var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n  result.lastIndex = regexp.lastIndex;\n  return result;\n}\n\n/**\n * Creates a clone of `set`.\n *\n * @private\n * @param {Object} set The set to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned set.\n */\nfunction cloneSet(set, isDeep, cloneFunc) {\n  var array = isDeep ? cloneFunc(setToArray(set), true) : setToArray(set);\n  return arrayReduce(array, addSetEntry, new set.constructor);\n}\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n  return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n  var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n  return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\n/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n  var index = -1,\n      length = source.length;\n\n  array || (array = Array(length));\n  while (++index < length) {\n    array[index] = source[index];\n  }\n  return array;\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n  object || (object = {});\n\n  var index = -1,\n      length = props.length;\n\n  while (++index < length) {\n    var key = props[index];\n\n    var newValue = customizer\n      ? customizer(object[key], source[key], key, object, source)\n      : undefined;\n\n    assignValue(object, key, newValue === undefined ? source[key] : newValue);\n  }\n  return object;\n}\n\n/**\n * Copies own symbol properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n  return copyObject(source, getSymbols(source), object);\n}\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n  return baseGetAllKeys(object, keys, getSymbols);\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n  var data = map.__data__;\n  return isKeyable(key)\n    ? data[typeof key == 'string' ? 'string' : 'hash']\n    : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * Creates an array of the own enumerable symbol properties of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = nativeGetSymbols ? overArg(nativeGetSymbols, Object) : stubArray;\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11,\n// for data views in Edge < 14, and promises in Node.js.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n    (Map && getTag(new Map) != mapTag) ||\n    (Promise && getTag(Promise.resolve()) != promiseTag) ||\n    (Set && getTag(new Set) != setTag) ||\n    (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n  getTag = function(value) {\n    var result = objectToString.call(value),\n        Ctor = result == objectTag ? value.constructor : undefined,\n        ctorString = Ctor ? toSource(Ctor) : undefined;\n\n    if (ctorString) {\n      switch (ctorString) {\n        case dataViewCtorString: return dataViewTag;\n        case mapCtorString: return mapTag;\n        case promiseCtorString: return promiseTag;\n        case setCtorString: return setTag;\n        case weakMapCtorString: return weakMapTag;\n      }\n    }\n    return result;\n  };\n}\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n  var length = array.length,\n      result = array.constructor(length);\n\n  // Add properties assigned by `RegExp#exec`.\n  if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n    result.index = array.index;\n    result.input = array.input;\n  }\n  return result;\n}\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n  return (typeof object.constructor == 'function' && !isPrototype(object))\n    ? baseCreate(getPrototype(object))\n    : {};\n}\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, cloneFunc, isDeep) {\n  var Ctor = object.constructor;\n  switch (tag) {\n    case arrayBufferTag:\n      return cloneArrayBuffer(object);\n\n    case boolTag:\n    case dateTag:\n      return new Ctor(+object);\n\n    case dataViewTag:\n      return cloneDataView(object, isDeep);\n\n    case float32Tag: case float64Tag:\n    case int8Tag: case int16Tag: case int32Tag:\n    case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n      return cloneTypedArray(object, isDeep);\n\n    case mapTag:\n      return cloneMap(object, isDeep, cloneFunc);\n\n    case numberTag:\n    case stringTag:\n      return new Ctor(object);\n\n    case regexpTag:\n      return cloneRegExp(object);\n\n    case setTag:\n      return cloneSet(object, isDeep, cloneFunc);\n\n    case symbolTag:\n      return cloneSymbol(object);\n  }\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  length = length == null ? MAX_SAFE_INTEGER : length;\n  return !!length &&\n    (typeof value == 'number' || reIsUint.test(value)) &&\n    (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n  var type = typeof value;\n  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n    ? (value !== '__proto__')\n    : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n  var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n  return value === proto;\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to process.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n  return baseClone(value, true, true);\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n  return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n  return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n    (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n *  else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n  return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 8-9 which returns 'object' for typed array and other constructors.\n  var tag = isObject(value) ? objectToString.call(value) : '';\n  return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return !!value && typeof value == 'object';\n}\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\n/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n  return [];\n}\n\n/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n  return false;\n}\n\nmodule.exports = cloneDeep;\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(96)(module)))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDg3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2guY2xvbmVkZWVwL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogbG9kYXNoIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuXG4vKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbnZhciBMQVJHRV9BUlJBWV9TSVpFID0gMjAwO1xuXG4vKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcHJvbWlzZVRhZyA9ICdbb2JqZWN0IFByb21pc2VdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuLyoqXG4gKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAqL1xudmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGAgZmxhZ3MgZnJvbSB0aGVpciBjb2VyY2VkIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVGbGFncyA9IC9cXHcqJC87XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBob3N0IGNvbnN0cnVjdG9ycyAoU2FmYXJpKS4gKi9cbnZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG52YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4vKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBzdXBwb3J0ZWQgYnkgYF8uY2xvbmVgLiAqL1xudmFyIGNsb25lYWJsZVRhZ3MgPSB7fTtcbmNsb25lYWJsZVRhZ3NbYXJnc1RhZ10gPSBjbG9uZWFibGVUYWdzW2FycmF5VGFnXSA9XG5jbG9uZWFibGVUYWdzW2FycmF5QnVmZmVyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0YVZpZXdUYWddID1cbmNsb25lYWJsZVRhZ3NbYm9vbFRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGVUYWddID1cbmNsb25lYWJsZVRhZ3NbZmxvYXQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddID1cbmNsb25lYWJsZVRhZ3NbaW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW2ludDE2VGFnXSA9XG5jbG9uZWFibGVUYWdzW2ludDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbbWFwVGFnXSA9XG5jbG9uZWFibGVUYWdzW251bWJlclRhZ10gPSBjbG9uZWFibGVUYWdzW29iamVjdFRhZ10gPVxuY2xvbmVhYmxlVGFnc1tyZWdleHBUYWddID0gY2xvbmVhYmxlVGFnc1tzZXRUYWddID1cbmNsb25lYWJsZVRhZ3Nbc3RyaW5nVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc3ltYm9sVGFnXSA9XG5jbG9uZWFibGVUYWdzW3VpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9XG5jbG9uZWFibGVUYWdzW3VpbnQxNlRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xuY2xvbmVhYmxlVGFnc1tlcnJvclRhZ10gPSBjbG9uZWFibGVUYWdzW2Z1bmNUYWddID1cbmNsb25lYWJsZVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKlxuICogQWRkcyB0aGUga2V5LXZhbHVlIGBwYWlyYCB0byBgbWFwYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhaXIgVGhlIGtleS12YWx1ZSBwYWlyIHRvIGFkZC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG1hcGAuXG4gKi9cbmZ1bmN0aW9uIGFkZE1hcEVudHJ5KG1hcCwgcGFpcikge1xuICAvLyBEb24ndCByZXR1cm4gYG1hcC5zZXRgIGJlY2F1c2UgaXQncyBub3QgY2hhaW5hYmxlIGluIElFIDExLlxuICBtYXAuc2V0KHBhaXJbMF0sIHBhaXJbMV0pO1xuICByZXR1cm4gbWFwO1xufVxuXG4vKipcbiAqIEFkZHMgYHZhbHVlYCB0byBgc2V0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFkZC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYHNldGAuXG4gKi9cbmZ1bmN0aW9uIGFkZFNldEVudHJ5KHNldCwgdmFsdWUpIHtcbiAgLy8gRG9uJ3QgcmV0dXJuIGBzZXQuYWRkYCBiZWNhdXNlIGl0J3Mgbm90IGNoYWluYWJsZSBpbiBJRSAxMS5cbiAgc2V0LmFkZCh2YWx1ZSk7XG4gIHJldHVybiBzZXQ7XG59XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBhcnJheUVhY2goYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbi8qKlxuICogQXBwZW5kcyB0aGUgZWxlbWVudHMgb2YgYHZhbHVlc2AgdG8gYGFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFwcGVuZC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBhcnJheVB1c2goYXJyYXksIHZhbHVlcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICBvZmZzZXQgPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhcnJheVtvZmZzZXQgKyBpbmRleF0gPSB2YWx1ZXNbaW5kZXhdO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YCBhc1xuICogIHRoZSBpbml0aWFsIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBhcnJheVJlZHVjZShhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7XG5cbiAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICBhY2N1bXVsYXRvciA9IGFycmF5WysraW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYWNjdW11bGF0b3IgPSBpdGVyYXRlZShhY2N1bXVsYXRvciwgYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50aW1lc2Agd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzXG4gKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBob3N0IG9iamVjdCBpbiBJRSA8IDkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBob3N0IG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0hvc3RPYmplY3QodmFsdWUpIHtcbiAgLy8gTWFueSBob3N0IG9iamVjdHMgYXJlIGBPYmplY3RgIG9iamVjdHMgdGhhdCBjYW4gY29lcmNlIHRvIHN0cmluZ3NcbiAgLy8gZGVzcGl0ZSBoYXZpbmcgaW1wcm9wZXJseSBkZWZpbmVkIGB0b1N0cmluZ2AgbWV0aG9kcy5cbiAgdmFyIHJlc3VsdCA9IGZhbHNlO1xuICBpZiAodmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUudG9TdHJpbmcgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSAhISh2YWx1ZSArICcnKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ29udmVydHMgYG1hcGAgdG8gaXRzIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAqL1xuZnVuY3Rpb24gbWFwVG9BcnJheShtYXApIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShtYXAuc2l6ZSk7XG5cbiAgbWFwLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IFtrZXksIHZhbHVlXTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpO1xuICB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGBzZXRgIHRvIGFuIGFycmF5IG9mIGl0cyB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIHNldFRvQXJyYXkoc2V0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkoc2V0LnNpemUpO1xuXG4gIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gdmFsdWU7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZSxcbiAgICBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb3ZlcnJlYWNoaW5nIGNvcmUtanMgc2hpbXMuICovXG52YXIgY29yZUpzRGF0YSA9IHJvb3RbJ19fY29yZS1qc19zaGFyZWRfXyddO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWV0aG9kcyBtYXNxdWVyYWRpbmcgYXMgbmF0aXZlLiAqL1xudmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gIHJldHVybiB1aWQgPyAoJ1N5bWJvbChzcmMpXzEuJyArIHVpZCkgOiAnJztcbn0oKSk7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xudmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4pO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gcm9vdC5CdWZmZXIgOiB1bmRlZmluZWQsXG4gICAgU3ltYm9sID0gcm9vdC5TeW1ib2wsXG4gICAgVWludDhBcnJheSA9IHJvb3QuVWludDhBcnJheSxcbiAgICBnZXRQcm90b3R5cGUgPSBvdmVyQXJnKE9iamVjdC5nZXRQcm90b3R5cGVPZiwgT2JqZWN0KSxcbiAgICBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlLFxuICAgIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGUsXG4gICAgc3BsaWNlID0gYXJyYXlQcm90by5zcGxpY2U7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVHZXRTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxcbiAgICBuYXRpdmVJc0J1ZmZlciA9IEJ1ZmZlciA/IEJ1ZmZlci5pc0J1ZmZlciA6IHVuZGVmaW5lZCxcbiAgICBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIERhdGFWaWV3ID0gZ2V0TmF0aXZlKHJvb3QsICdEYXRhVmlldycpLFxuICAgIE1hcCA9IGdldE5hdGl2ZShyb290LCAnTWFwJyksXG4gICAgUHJvbWlzZSA9IGdldE5hdGl2ZShyb290LCAnUHJvbWlzZScpLFxuICAgIFNldCA9IGdldE5hdGl2ZShyb290LCAnU2V0JyksXG4gICAgV2Vha01hcCA9IGdldE5hdGl2ZShyb290LCAnV2Vha01hcCcpLFxuICAgIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1hcHMsIHNldHMsIGFuZCB3ZWFrbWFwcy4gKi9cbnZhciBkYXRhVmlld0N0b3JTdHJpbmcgPSB0b1NvdXJjZShEYXRhVmlldyksXG4gICAgbWFwQ3RvclN0cmluZyA9IHRvU291cmNlKE1hcCksXG4gICAgcHJvbWlzZUN0b3JTdHJpbmcgPSB0b1NvdXJjZShQcm9taXNlKSxcbiAgICBzZXRDdG9yU3RyaW5nID0gdG9Tb3VyY2UoU2V0KSxcbiAgICB3ZWFrTWFwQ3RvclN0cmluZyA9IHRvU291cmNlKFdlYWtNYXApO1xuXG4vKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi9cbnZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgc3ltYm9sVmFsdWVPZiA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udmFsdWVPZiA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgaGFzaCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIEhhc2goZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPyBlbnRyaWVzLmxlbmd0aCA6IDA7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBoYXNoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIEhhc2hcbiAqL1xuZnVuY3Rpb24gaGFzaENsZWFyKCkge1xuICB0aGlzLl9fZGF0YV9fID0gbmF0aXZlQ3JlYXRlID8gbmF0aXZlQ3JlYXRlKG51bGwpIDoge307XG59XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBoYXNoIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNoRGVsZXRlKGtleSkge1xuICByZXR1cm4gdGhpcy5oYXMoa2V5KSAmJiBkZWxldGUgdGhpcy5fX2RhdGFfX1trZXldO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGhhc2ggdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gaGFzaEdldChrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICBpZiAobmF0aXZlQ3JlYXRlKSB7XG4gICAgdmFyIHJlc3VsdCA9IGRhdGFba2V5XTtcbiAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgfVxuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpID8gZGF0YVtrZXldIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGhhc2ggdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IGRhdGFba2V5XSAhPT0gdW5kZWZpbmVkIDogaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIGhhc2ggYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBoYXNoIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBoYXNoU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICBkYXRhW2tleV0gPSAobmF0aXZlQ3JlYXRlICYmIHZhbHVlID09PSB1bmRlZmluZWQpID8gSEFTSF9VTkRFRklORUQgOiB2YWx1ZTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBIYXNoYC5cbkhhc2gucHJvdG90eXBlLmNsZWFyID0gaGFzaENsZWFyO1xuSGFzaC5wcm90b3R5cGVbJ2RlbGV0ZSddID0gaGFzaERlbGV0ZTtcbkhhc2gucHJvdG90eXBlLmdldCA9IGhhc2hHZXQ7XG5IYXNoLnByb3RvdHlwZS5oYXMgPSBoYXNoSGFzO1xuSGFzaC5wcm90b3R5cGUuc2V0ID0gaGFzaFNldDtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGxpc3QgY2FjaGUgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPyBlbnRyaWVzLmxlbmd0aCA6IDA7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IFtdO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGFzdEluZGV4ID0gZGF0YS5sZW5ndGggLSAxO1xuICBpZiAoaW5kZXggPT0gbGFzdEluZGV4KSB7XG4gICAgZGF0YS5wb3AoKTtcbiAgfSBlbHNlIHtcbiAgICBzcGxpY2UuY2FsbChkYXRhLCBpbmRleCwgMSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUdldChrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICByZXR1cm4gaW5kZXggPCAwID8gdW5kZWZpbmVkIDogZGF0YVtpbmRleF1bMV07XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KSB7XG4gIHJldHVybiBhc3NvY0luZGV4T2YodGhpcy5fX2RhdGFfXywga2V5KSA+IC0xO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIGxpc3QgY2FjaGUgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9IGVsc2Uge1xuICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBMaXN0Q2FjaGVgLlxuTGlzdENhY2hlLnByb3RvdHlwZS5jbGVhciA9IGxpc3RDYWNoZUNsZWFyO1xuTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG5MaXN0Q2FjaGUucHJvdG90eXBlLmdldCA9IGxpc3RDYWNoZUdldDtcbkxpc3RDYWNoZS5wcm90b3R5cGUuaGFzID0gbGlzdENhY2hlSGFzO1xuTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hcCBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBNYXBDYWNoZShlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA/IGVudHJpZXMubGVuZ3RoIDogMDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIG1hcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCkge1xuICB0aGlzLl9fZGF0YV9fID0ge1xuICAgICdoYXNoJzogbmV3IEhhc2gsXG4gICAgJ21hcCc6IG5ldyAoTWFwIHx8IExpc3RDYWNoZSksXG4gICAgJ3N0cmluZyc6IG5ldyBIYXNoXG4gIH07XG59XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIG1hcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZURlbGV0ZShrZXkpIHtcbiAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KVsnZGVsZXRlJ10oa2V5KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIG1hcCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmhhcyhrZXkpO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLnNldChrZXksIHZhbHVlKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBNYXBDYWNoZWAuXG5NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBtYXBDYWNoZUNsZWFyO1xuTWFwQ2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IG1hcENhY2hlRGVsZXRlO1xuTWFwQ2FjaGUucHJvdG90eXBlLmdldCA9IG1hcENhY2hlR2V0O1xuTWFwQ2FjaGUucHJvdG90eXBlLmhhcyA9IG1hcENhY2hlSGFzO1xuTWFwQ2FjaGUucHJvdG90eXBlLnNldCA9IG1hcENhY2hlU2V0O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzdGFjayBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTdGFjayhlbnRyaWVzKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlKGVudHJpZXMpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIHN0YWNrLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIFN0YWNrXG4gKi9cbmZ1bmN0aW9uIHN0YWNrQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBzdGFjay5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzdGFja0RlbGV0ZShrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX19kYXRhX19bJ2RlbGV0ZSddKGtleSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc3RhY2sgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrR2V0KGtleSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQoa2V5KTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBzdGFjayB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrSGFzKGtleSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBzdGFjayBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBzdGFjayBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gc3RhY2tTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgY2FjaGUgPSB0aGlzLl9fZGF0YV9fO1xuICBpZiAoY2FjaGUgaW5zdGFuY2VvZiBMaXN0Q2FjaGUpIHtcbiAgICB2YXIgcGFpcnMgPSBjYWNoZS5fX2RhdGFfXztcbiAgICBpZiAoIU1hcCB8fCAocGFpcnMubGVuZ3RoIDwgTEFSR0VfQVJSQVlfU0laRSAtIDEpKSB7XG4gICAgICBwYWlycy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2FjaGUgPSB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlKHBhaXJzKTtcbiAgfVxuICBjYWNoZS5zZXQoa2V5LCB2YWx1ZSk7XG4gIHJldHVybiB0aGlzO1xufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgU3RhY2tgLlxuU3RhY2sucHJvdG90eXBlLmNsZWFyID0gc3RhY2tDbGVhcjtcblN0YWNrLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBzdGFja0RlbGV0ZTtcblN0YWNrLnByb3RvdHlwZS5nZXQgPSBzdGFja0dldDtcblN0YWNrLnByb3RvdHlwZS5oYXMgPSBzdGFja0hhcztcblN0YWNrLnByb3RvdHlwZS5zZXQgPSBzdGFja1NldDtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSBpbmhlcml0ZWQgU3BlY2lmeSByZXR1cm5pbmcgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSwgaW5oZXJpdGVkKSB7XG4gIC8vIFNhZmFyaSA4LjEgbWFrZXMgYGFyZ3VtZW50cy5jYWxsZWVgIGVudW1lcmFibGUgaW4gc3RyaWN0IG1vZGUuXG4gIC8vIFNhZmFyaSA5IG1ha2VzIGBhcmd1bWVudHMubGVuZ3RoYCBlbnVtZXJhYmxlIGluIHN0cmljdCBtb2RlLlxuICB2YXIgcmVzdWx0ID0gKGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSlcbiAgICA/IGJhc2VUaW1lcyh2YWx1ZS5sZW5ndGgsIFN0cmluZylcbiAgICA6IFtdO1xuXG4gIHZhciBsZW5ndGggPSByZXN1bHQubGVuZ3RoLFxuICAgICAgc2tpcEluZGV4ZXMgPSAhIWxlbmd0aDtcblxuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSAmJlxuICAgICAgICAhKHNraXBJbmRleGVzICYmIChrZXkgPT0gJ2xlbmd0aCcgfHwgaXNJbmRleChrZXksIGxlbmd0aCkpKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBc3NpZ25zIGB2YWx1ZWAgdG8gYGtleWAgb2YgYG9iamVjdGAgaWYgdGhlIGV4aXN0aW5nIHZhbHVlIGlzIG5vdCBlcXVpdmFsZW50XG4gKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgaWYgKCEoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgZXEob2JqVmFsdWUsIHZhbHVlKSkgfHxcbiAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBga2V5YCBpcyBmb3VuZCBpbiBgYXJyYXlgIG9mIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IGtleSBUaGUga2V5IHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBhc3NvY0luZGV4T2YoYXJyYXksIGtleSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5KSkge1xuICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnbihvYmplY3QsIHNvdXJjZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xvbmVgIGFuZCBgXy5jbG9uZURlZXBgIHdoaWNoIHRyYWNrc1xuICogdHJhdmVyc2VkIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRnVsbF0gU3BlY2lmeSBhIGNsb25lIGluY2x1ZGluZyBzeW1ib2xzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSBUaGUga2V5IG9mIGB2YWx1ZWAuXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIHBhcmVudCBvYmplY3Qgb2YgYHZhbHVlYC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBhbmQgdGhlaXIgY2xvbmUgY291bnRlcnBhcnRzLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUNsb25lKHZhbHVlLCBpc0RlZXAsIGlzRnVsbCwgY3VzdG9taXplciwga2V5LCBvYmplY3QsIHN0YWNrKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChjdXN0b21pemVyKSB7XG4gICAgcmVzdWx0ID0gb2JqZWN0ID8gY3VzdG9taXplcih2YWx1ZSwga2V5LCBvYmplY3QsIHN0YWNrKSA6IGN1c3RvbWl6ZXIodmFsdWUpO1xuICB9XG4gIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSk7XG4gIGlmIChpc0Fycikge1xuICAgIHJlc3VsdCA9IGluaXRDbG9uZUFycmF5KHZhbHVlKTtcbiAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgcmV0dXJuIGNvcHlBcnJheSh2YWx1ZSwgcmVzdWx0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSksXG4gICAgICAgIGlzRnVuYyA9IHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWc7XG5cbiAgICBpZiAoaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY2xvbmVCdWZmZXIodmFsdWUsIGlzRGVlcCk7XG4gICAgfVxuICAgIGlmICh0YWcgPT0gb2JqZWN0VGFnIHx8IHRhZyA9PSBhcmdzVGFnIHx8IChpc0Z1bmMgJiYgIW9iamVjdCkpIHtcbiAgICAgIGlmIChpc0hvc3RPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBvYmplY3QgPyB2YWx1ZSA6IHt9O1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gaW5pdENsb25lT2JqZWN0KGlzRnVuYyA/IHt9IDogdmFsdWUpO1xuICAgICAgaWYgKCFpc0RlZXApIHtcbiAgICAgICAgcmV0dXJuIGNvcHlTeW1ib2xzKHZhbHVlLCBiYXNlQXNzaWduKHJlc3VsdCwgdmFsdWUpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFjbG9uZWFibGVUYWdzW3RhZ10pIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdCA/IHZhbHVlIDoge307XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBpbml0Q2xvbmVCeVRhZyh2YWx1ZSwgdGFnLCBiYXNlQ2xvbmUsIGlzRGVlcCk7XG4gICAgfVxuICB9XG4gIC8vIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm4gaXRzIGNvcnJlc3BvbmRpbmcgY2xvbmUuXG4gIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KHZhbHVlKTtcbiAgaWYgKHN0YWNrZWQpIHtcbiAgICByZXR1cm4gc3RhY2tlZDtcbiAgfVxuICBzdGFjay5zZXQodmFsdWUsIHJlc3VsdCk7XG5cbiAgaWYgKCFpc0Fycikge1xuICAgIHZhciBwcm9wcyA9IGlzRnVsbCA/IGdldEFsbEtleXModmFsdWUpIDoga2V5cyh2YWx1ZSk7XG4gIH1cbiAgYXJyYXlFYWNoKHByb3BzIHx8IHZhbHVlLCBmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgaWYgKHByb3BzKSB7XG4gICAgICBrZXkgPSBzdWJWYWx1ZTtcbiAgICAgIHN1YlZhbHVlID0gdmFsdWVba2V5XTtcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgcG9wdWxhdGUgY2xvbmUgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICBhc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBpc0RlZXAsIGlzRnVsbCwgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY3JlYXRlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGFzc2lnbmluZ1xuICogcHJvcGVydGllcyB0byB0aGUgY3JlYXRlZCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGUgVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBiYXNlQ3JlYXRlKHByb3RvKSB7XG4gIHJldHVybiBpc09iamVjdChwcm90bykgPyBvYmplY3RDcmVhdGUocHJvdG8pIDoge307XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldEFsbEtleXNgIGFuZCBgZ2V0QWxsS2V5c0luYCB3aGljaCB1c2VzXG4gKiBga2V5c0Z1bmNgIGFuZCBgc3ltYm9sc0Z1bmNgIHRvIGdldCB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmRcbiAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzeW1ib2xzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzRnVuYywgc3ltYm9sc0Z1bmMpIHtcbiAgdmFyIHJlc3VsdCA9IGtleXNGdW5jKG9iamVjdCk7XG4gIHJldHVybiBpc0FycmF5KG9iamVjdCkgPyByZXN1bHQgOiBhcnJheVB1c2gocmVzdWx0LCBzeW1ib2xzRnVuYyhvYmplY3QpKTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkgfHwgaXNNYXNrZWQodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwYXR0ZXJuID0gKGlzRnVuY3Rpb24odmFsdWUpIHx8IGlzSG9zdE9iamVjdCh2YWx1ZSkpID8gcmVJc05hdGl2ZSA6IHJlSXNIb3N0Q3RvcjtcbiAgcmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpO1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNgIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KSB7XG4gIGlmICghaXNQcm90b3R5cGUob2JqZWN0KSkge1xuICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYga2V5ICE9ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mICBgYnVmZmVyYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZmZlciBUaGUgYnVmZmVyIHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIGNsb25lQnVmZmVyKGJ1ZmZlciwgaXNEZWVwKSB7XG4gIGlmIChpc0RlZXApIHtcbiAgICByZXR1cm4gYnVmZmVyLnNsaWNlKCk7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IG5ldyBidWZmZXIuY29uc3RydWN0b3IoYnVmZmVyLmxlbmd0aCk7XG4gIGJ1ZmZlci5jb3B5KHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGBhcnJheUJ1ZmZlcmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7QXJyYXlCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBhcnJheSBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyBhcnJheUJ1ZmZlci5jb25zdHJ1Y3RvcihhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgbmV3IFVpbnQ4QXJyYXkocmVzdWx0KS5zZXQobmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGRhdGFWaWV3YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFWaWV3IFRoZSBkYXRhIHZpZXcgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIGRhdGEgdmlldy5cbiAqL1xuZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldywgaXNEZWVwKSB7XG4gIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKGRhdGFWaWV3LmJ1ZmZlcikgOiBkYXRhVmlldy5idWZmZXI7XG4gIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYG1hcGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBjbG9uZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNsb25lRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2xvbmUgdmFsdWVzLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBtYXAuXG4gKi9cbmZ1bmN0aW9uIGNsb25lTWFwKG1hcCwgaXNEZWVwLCBjbG9uZUZ1bmMpIHtcbiAgdmFyIGFycmF5ID0gaXNEZWVwID8gY2xvbmVGdW5jKG1hcFRvQXJyYXkobWFwKSwgdHJ1ZSkgOiBtYXBUb0FycmF5KG1hcCk7XG4gIHJldHVybiBhcnJheVJlZHVjZShhcnJheSwgYWRkTWFwRW50cnksIG5ldyBtYXAuY29uc3RydWN0b3IpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgcmVnZXhwYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHJlZ2V4cCBUaGUgcmVnZXhwIHRvIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHJlZ2V4cC5cbiAqL1xuZnVuY3Rpb24gY2xvbmVSZWdFeHAocmVnZXhwKSB7XG4gIHZhciByZXN1bHQgPSBuZXcgcmVnZXhwLmNvbnN0cnVjdG9yKHJlZ2V4cC5zb3VyY2UsIHJlRmxhZ3MuZXhlYyhyZWdleHApKTtcbiAgcmVzdWx0Lmxhc3RJbmRleCA9IHJlZ2V4cC5sYXN0SW5kZXg7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGBzZXRgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjbG9uZUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNsb25lIHZhbHVlcy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgc2V0LlxuICovXG5mdW5jdGlvbiBjbG9uZVNldChzZXQsIGlzRGVlcCwgY2xvbmVGdW5jKSB7XG4gIHZhciBhcnJheSA9IGlzRGVlcCA/IGNsb25lRnVuYyhzZXRUb0FycmF5KHNldCksIHRydWUpIDogc2V0VG9BcnJheShzZXQpO1xuICByZXR1cm4gYXJyYXlSZWR1Y2UoYXJyYXksIGFkZFNldEVudHJ5LCBuZXcgc2V0LmNvbnN0cnVjdG9yKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGBzeW1ib2xgIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN5bWJvbCBUaGUgc3ltYm9sIG9iamVjdCB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBzeW1ib2wgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBjbG9uZVN5bWJvbChzeW1ib2wpIHtcbiAgcmV0dXJuIHN5bWJvbFZhbHVlT2YgPyBPYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpIDoge307XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGB0eXBlZEFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHR5cGVkQXJyYXkgVGhlIHR5cGVkIGFycmF5IHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCB0eXBlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2xvbmVUeXBlZEFycmF5KHR5cGVkQXJyYXksIGlzRGVlcCkge1xuICB2YXIgYnVmZmVyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcih0eXBlZEFycmF5LmJ1ZmZlcikgOiB0eXBlZEFycmF5LmJ1ZmZlcjtcbiAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlciwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7XG59XG5cbi8qKlxuICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgYHNvdXJjZWAgdG8gYGFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyBmcm9tLlxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuXG4gIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGFycmF5W2luZGV4XSA9IHNvdXJjZVtpbmRleF07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG4vKipcbiAqIENvcGllcyBwcm9wZXJ0aWVzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20uXG4gKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMgdG8gY29weS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyB0by5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvcGllZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBjb3B5T2JqZWN0KHNvdXJjZSwgcHJvcHMsIG9iamVjdCwgY3VzdG9taXplcikge1xuICBvYmplY3QgfHwgKG9iamVjdCA9IHt9KTtcblxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBrZXkgPSBwcm9wc1tpbmRleF07XG5cbiAgICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgICA/IGN1c3RvbWl6ZXIob2JqZWN0W2tleV0sIHNvdXJjZVtrZXldLCBrZXksIG9iamVjdCwgc291cmNlKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUgPT09IHVuZGVmaW5lZCA/IHNvdXJjZVtrZXldIDogbmV3VmFsdWUpO1xuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cbi8qKlxuICogQ29waWVzIG93biBzeW1ib2wgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weVN5bWJvbHMoc291cmNlLCBvYmplY3QpIHtcbiAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsS2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5cywgZ2V0U3ltYm9scyk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHJlZmVyZW5jZSBrZXkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGdldE1hcERhdGEobWFwLCBrZXkpIHtcbiAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gIHJldHVybiBpc0tleWFibGUoa2V5KVxuICAgID8gZGF0YVt0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8gJ3N0cmluZycgOiAnaGFzaCddXG4gICAgOiBkYXRhLm1hcDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBuYXRpdmUgZnVuY3Rpb24gYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBpZiBpdCdzIG5hdGl2ZSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCwga2V5KSB7XG4gIHZhciB2YWx1ZSA9IGdldFZhbHVlKG9iamVjdCwga2V5KTtcbiAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzeW1ib2wgcHJvcGVydGllcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICovXG52YXIgZ2V0U3ltYm9scyA9IG5hdGl2ZUdldFN5bWJvbHMgPyBvdmVyQXJnKG5hdGl2ZUdldFN5bWJvbHMsIE9iamVjdCkgOiBzdHViQXJyYXk7XG5cbi8qKlxuICogR2V0cyB0aGUgYHRvU3RyaW5nVGFnYCBvZiBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbnZhciBnZXRUYWcgPSBiYXNlR2V0VGFnO1xuXG4vLyBGYWxsYmFjayBmb3IgZGF0YSB2aWV3cywgbWFwcywgc2V0cywgYW5kIHdlYWsgbWFwcyBpbiBJRSAxMSxcbi8vIGZvciBkYXRhIHZpZXdzIGluIEVkZ2UgPCAxNCwgYW5kIHByb21pc2VzIGluIE5vZGUuanMuXG5pZiAoKERhdGFWaWV3ICYmIGdldFRhZyhuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWcpIHx8XG4gICAgKE1hcCAmJiBnZXRUYWcobmV3IE1hcCkgIT0gbWFwVGFnKSB8fFxuICAgIChQcm9taXNlICYmIGdldFRhZyhQcm9taXNlLnJlc29sdmUoKSkgIT0gcHJvbWlzZVRhZykgfHxcbiAgICAoU2V0ICYmIGdldFRhZyhuZXcgU2V0KSAhPSBzZXRUYWcpIHx8XG4gICAgKFdlYWtNYXAgJiYgZ2V0VGFnKG5ldyBXZWFrTWFwKSAhPSB3ZWFrTWFwVGFnKSkge1xuICBnZXRUYWcgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciByZXN1bHQgPSBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSxcbiAgICAgICAgQ3RvciA9IHJlc3VsdCA9PSBvYmplY3RUYWcgPyB2YWx1ZS5jb25zdHJ1Y3RvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgY3RvclN0cmluZyA9IEN0b3IgPyB0b1NvdXJjZShDdG9yKSA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChjdG9yU3RyaW5nKSB7XG4gICAgICBzd2l0Y2ggKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgY2FzZSBkYXRhVmlld0N0b3JTdHJpbmc6IHJldHVybiBkYXRhVmlld1RhZztcbiAgICAgICAgY2FzZSBtYXBDdG9yU3RyaW5nOiByZXR1cm4gbWFwVGFnO1xuICAgICAgICBjYXNlIHByb21pc2VDdG9yU3RyaW5nOiByZXR1cm4gcHJvbWlzZVRhZztcbiAgICAgICAgY2FzZSBzZXRDdG9yU3RyaW5nOiByZXR1cm4gc2V0VGFnO1xuICAgICAgICBjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOiByZXR1cm4gd2Vha01hcFRhZztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyBhbiBhcnJheSBjbG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNsb25lLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAqL1xuZnVuY3Rpb24gaW5pdENsb25lQXJyYXkoYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7XG5cbiAgLy8gQWRkIHByb3BlcnRpZXMgYXNzaWduZWQgYnkgYFJlZ0V4cCNleGVjYC5cbiAgaWYgKGxlbmd0aCAmJiB0eXBlb2YgYXJyYXlbMF0gPT0gJ3N0cmluZycgJiYgaGFzT3duUHJvcGVydHkuY2FsbChhcnJheSwgJ2luZGV4JykpIHtcbiAgICByZXN1bHQuaW5kZXggPSBhcnJheS5pbmRleDtcbiAgICByZXN1bHQuaW5wdXQgPSBhcnJheS5pbnB1dDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3QpIHtcbiAgcmV0dXJuICh0eXBlb2Ygb2JqZWN0LmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgIWlzUHJvdG90eXBlKG9iamVjdCkpXG4gICAgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKVxuICAgIDoge307XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lIGJhc2VkIG9uIGl0cyBgdG9TdHJpbmdUYWdgLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY2xvbmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE51bWJlcmAsIGBSZWdFeHBgLCBvciBgU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2xvbmVGdW5jIFRoZSBmdW5jdGlvbiB0byBjbG9uZSB2YWx1ZXMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwgdGFnLCBjbG9uZUZ1bmMsIGlzRGVlcCkge1xuICB2YXIgQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgcmV0dXJuIGNsb25lQXJyYXlCdWZmZXIob2JqZWN0KTtcblxuICAgIGNhc2UgYm9vbFRhZzpcbiAgICBjYXNlIGRhdGVUYWc6XG4gICAgICByZXR1cm4gbmV3IEN0b3IoK29iamVjdCk7XG5cbiAgICBjYXNlIGRhdGFWaWV3VGFnOlxuICAgICAgcmV0dXJuIGNsb25lRGF0YVZpZXcob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgY2FzZSBmbG9hdDMyVGFnOiBjYXNlIGZsb2F0NjRUYWc6XG4gICAgY2FzZSBpbnQ4VGFnOiBjYXNlIGludDE2VGFnOiBjYXNlIGludDMyVGFnOlxuICAgIGNhc2UgdWludDhUYWc6IGNhc2UgdWludDhDbGFtcGVkVGFnOiBjYXNlIHVpbnQxNlRhZzogY2FzZSB1aW50MzJUYWc6XG4gICAgICByZXR1cm4gY2xvbmVUeXBlZEFycmF5KG9iamVjdCwgaXNEZWVwKTtcblxuICAgIGNhc2UgbWFwVGFnOlxuICAgICAgcmV0dXJuIGNsb25lTWFwKG9iamVjdCwgaXNEZWVwLCBjbG9uZUZ1bmMpO1xuXG4gICAgY2FzZSBudW1iZXJUYWc6XG4gICAgY2FzZSBzdHJpbmdUYWc6XG4gICAgICByZXR1cm4gbmV3IEN0b3Iob2JqZWN0KTtcblxuICAgIGNhc2UgcmVnZXhwVGFnOlxuICAgICAgcmV0dXJuIGNsb25lUmVnRXhwKG9iamVjdCk7XG5cbiAgICBjYXNlIHNldFRhZzpcbiAgICAgIHJldHVybiBjbG9uZVNldChvYmplY3QsIGlzRGVlcCwgY2xvbmVGdW5jKTtcblxuICAgIGNhc2Ugc3ltYm9sVGFnOlxuICAgICAgcmV0dXJuIGNsb25lU3ltYm9sKG9iamVjdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9TUFYX1NBRkVfSU5URUdFUl0gVGhlIHVwcGVyIGJvdW5kcyBvZiBhIHZhbGlkIGluZGV4LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHtcbiAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoO1xuICByZXR1cm4gISFsZW5ndGggJiZcbiAgICAodHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8IHJlSXNVaW50LnRlc3QodmFsdWUpKSAmJlxuICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICh0eXBlID09ICdzdHJpbmcnIHx8IHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJylcbiAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpXG4gICAgOiAodmFsdWUgPT09IG51bGwpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGl0cyBzb3VyY2UgbWFza2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHtcbiAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYSBwcm90b3R5cGUgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvdG90eXBlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzUHJvdG90eXBlKHZhbHVlKSB7XG4gIHZhciBDdG9yID0gdmFsdWUgJiYgdmFsdWUuY29uc3RydWN0b3IsXG4gICAgICBwcm90byA9ICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IucHJvdG90eXBlKSB8fCBvYmplY3RQcm90bztcblxuICByZXR1cm4gdmFsdWUgPT09IHByb3RvO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZWAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgY2xvbmVzIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAxLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJlY3Vyc2l2ZWx5IGNsb25lLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICogQHNlZSBfLmNsb25lXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICpcbiAqIHZhciBkZWVwID0gXy5jbG9uZURlZXAob2JqZWN0cyk7XG4gKiBjb25zb2xlLmxvZyhkZWVwWzBdID09PSBvYmplY3RzWzBdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGNsb25lRGVlcCh2YWx1ZSkge1xuICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCB0cnVlLCB0cnVlKTtcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICpcbiAqIF8uZXEob2JqZWN0LCBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEob2JqZWN0LCBvdGhlcik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoJ2EnLCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEoJ2EnLCBPYmplY3QoJ2EnKSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoTmFOLCBOYU4pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBlcSh2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG4gIC8vIFNhZmFyaSA4LjEgbWFrZXMgYGFyZ3VtZW50cy5jYWxsZWVgIGVudW1lcmFibGUgaW4gc3RyaWN0IG1vZGUuXG4gIHJldHVybiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgKCFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgfHwgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gYXJnc1RhZyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheSgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWFsIHRvIGAwYCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzQXJyYXlMaWtlYCBleGNlcHQgdGhhdCBpdCBhbHNvIGNoZWNrcyBpZiBgdmFsdWVgXG4gKiBpcyBhbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNBcnJheUxpa2UodmFsdWUpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4zLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNCdWZmZXIobmV3IEJ1ZmZlcigyKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0J1ZmZlcihuZXcgVWludDhBcnJheSgyKSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNCdWZmZXIgPSBuYXRpdmVJc0J1ZmZlciB8fCBzdHViRmFsc2U7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOC05IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5IGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBpc09iamVjdCh2YWx1ZSkgPyBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNMZW5ndGgoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aChJbmZpbml0eSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy4gU2VlIHRoZVxuICogW0VTIHNwZWNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICogZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXMobmV3IEZvbyk7XG4gKiAvLyA9PiBbJ2EnLCAnYiddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogXy5rZXlzKCdoaScpO1xuICogLy8gPT4gWycwJywgJzEnXVxuICovXG5mdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0KSA6IGJhc2VLZXlzKG9iamVjdCk7XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgYXJyYXlzID0gXy50aW1lcygyLCBfLnN0dWJBcnJheSk7XG4gKlxuICogY29uc29sZS5sb2coYXJyYXlzKTtcbiAqIC8vID0+IFtbXSwgW11dXG4gKlxuICogY29uc29sZS5sb2coYXJyYXlzWzBdID09PSBhcnJheXNbMV0pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gc3R1YkFycmF5KCkge1xuICByZXR1cm4gW107XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50aW1lcygyLCBfLnN0dWJGYWxzZSk7XG4gKiAvLyA9PiBbZmFsc2UsIGZhbHNlXVxuICovXG5mdW5jdGlvbiBzdHViRmFsc2UoKSB7XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZURlZXA7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoLmNsb25lZGVlcC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNDg3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 488 */
/***/ function(module, exports, __webpack_require__) {

    eval("var WildEmitter = __webpack_require__(445);\nvar util = __webpack_require__(438);\n\nfunction Sender(opts) {\n    WildEmitter.call(this);\n    var options = opts || {};\n    this.config = {\n        chunksize: 16384,\n        pacing: 0\n    };\n    // set our config from options\n    var item;\n    for (item in options) {\n        this.config[item] = options[item];\n    }\n\n    this.file = null;\n    this.channel = null;\n}\nutil.inherits(Sender, WildEmitter);\n\nSender.prototype.send = function (file, channel) {\n    var self = this;\n    this.file = file;\n    this.channel = channel;\n    var sliceFile = function(offset) {\n        var reader = new window.FileReader();\n        reader.onload = (function() {\n            return function(e) {\n                self.channel.send(e.target.result);\n                self.emit('progress', offset, file.size, e.target.result);\n                if (file.size > offset + e.target.result.byteLength) {\n                    window.setTimeout(sliceFile, self.config.pacing, offset + self.config.chunksize);\n                } else {\n                    self.emit('progress', file.size, file.size, null);\n                    self.emit('sentFile');\n                }\n            };\n        })(file);\n        var slice = file.slice(offset, offset + self.config.chunksize);\n        reader.readAsArrayBuffer(slice);\n    };\n    window.setTimeout(sliceFile, 0, 0);\n};\n\nfunction Receiver() {\n    WildEmitter.call(this);\n\n    this.receiveBuffer = [];\n    this.received = 0;\n    this.metadata = {};\n    this.channel = null;\n}\nutil.inherits(Receiver, WildEmitter);\n\nReceiver.prototype.receive = function (metadata, channel) {\n    var self = this;\n\n    if (metadata) {\n        this.metadata = metadata;\n    }\n    this.channel = channel;\n    // chrome only supports arraybuffers and those make it easier to calc the hash\n    channel.binaryType = 'arraybuffer';\n    this.channel.onmessage = function (event) {\n        var len = event.data.byteLength;\n        self.received += len;\n        self.receiveBuffer.push(event.data);\n\n        self.emit('progress', self.received, self.metadata.size, event.data);\n        if (self.received === self.metadata.size) {\n            self.emit('receivedFile', new window.Blob(self.receiveBuffer), self.metadata);\n            self.receiveBuffer = []; // discard receivebuffer\n        } else if (self.received > self.metadata.size) {\n            // FIXME\n            console.error('received more than expected, discarding...');\n            self.receiveBuffer = []; // just discard...\n\n        }\n    };\n};\n\nmodule.exports = {};\nmodule.exports.support = typeof window !== 'undefined' && window && window.File && window.FileReader && window.Blob;\nmodule.exports.Sender = Sender;\nmodule.exports.Receiver = Receiver;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDg4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9maWxldHJhbnNmZXIvZmlsZXRyYW5zZmVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBXaWxkRW1pdHRlciA9IHJlcXVpcmUoJ3dpbGRlbWl0dGVyJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuZnVuY3Rpb24gU2VuZGVyKG9wdHMpIHtcbiAgICBXaWxkRW1pdHRlci5jYWxsKHRoaXMpO1xuICAgIHZhciBvcHRpb25zID0gb3B0cyB8fCB7fTtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgICAgY2h1bmtzaXplOiAxNjM4NCxcbiAgICAgICAgcGFjaW5nOiAwXG4gICAgfTtcbiAgICAvLyBzZXQgb3VyIGNvbmZpZyBmcm9tIG9wdGlvbnNcbiAgICB2YXIgaXRlbTtcbiAgICBmb3IgKGl0ZW0gaW4gb3B0aW9ucykge1xuICAgICAgICB0aGlzLmNvbmZpZ1tpdGVtXSA9IG9wdGlvbnNbaXRlbV07XG4gICAgfVxuXG4gICAgdGhpcy5maWxlID0gbnVsbDtcbiAgICB0aGlzLmNoYW5uZWwgPSBudWxsO1xufVxudXRpbC5pbmhlcml0cyhTZW5kZXIsIFdpbGRFbWl0dGVyKTtcblxuU2VuZGVyLnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24gKGZpbGUsIGNoYW5uZWwpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5maWxlID0gZmlsZTtcbiAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsO1xuICAgIHZhciBzbGljZUZpbGUgPSBmdW5jdGlvbihvZmZzZXQpIHtcbiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyB3aW5kb3cuRmlsZVJlYWRlcigpO1xuICAgICAgICByZWFkZXIub25sb2FkID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmNoYW5uZWwuc2VuZChlLnRhcmdldC5yZXN1bHQpO1xuICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgncHJvZ3Jlc3MnLCBvZmZzZXQsIGZpbGUuc2l6ZSwgZS50YXJnZXQucmVzdWx0KTtcbiAgICAgICAgICAgICAgICBpZiAoZmlsZS5zaXplID4gb2Zmc2V0ICsgZS50YXJnZXQucmVzdWx0LmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoc2xpY2VGaWxlLCBzZWxmLmNvbmZpZy5wYWNpbmcsIG9mZnNldCArIHNlbGYuY29uZmlnLmNodW5rc2l6ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdwcm9ncmVzcycsIGZpbGUuc2l6ZSwgZmlsZS5zaXplLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdzZW50RmlsZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKGZpbGUpO1xuICAgICAgICB2YXIgc2xpY2UgPSBmaWxlLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgc2VsZi5jb25maWcuY2h1bmtzaXplKTtcbiAgICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKHNsaWNlKTtcbiAgICB9O1xuICAgIHdpbmRvdy5zZXRUaW1lb3V0KHNsaWNlRmlsZSwgMCwgMCk7XG59O1xuXG5mdW5jdGlvbiBSZWNlaXZlcigpIHtcbiAgICBXaWxkRW1pdHRlci5jYWxsKHRoaXMpO1xuXG4gICAgdGhpcy5yZWNlaXZlQnVmZmVyID0gW107XG4gICAgdGhpcy5yZWNlaXZlZCA9IDA7XG4gICAgdGhpcy5tZXRhZGF0YSA9IHt9O1xuICAgIHRoaXMuY2hhbm5lbCA9IG51bGw7XG59XG51dGlsLmluaGVyaXRzKFJlY2VpdmVyLCBXaWxkRW1pdHRlcik7XG5cblJlY2VpdmVyLnByb3RvdHlwZS5yZWNlaXZlID0gZnVuY3Rpb24gKG1ldGFkYXRhLCBjaGFubmVsKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgaWYgKG1ldGFkYXRhKSB7XG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICB9XG4gICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDtcbiAgICAvLyBjaHJvbWUgb25seSBzdXBwb3J0cyBhcnJheWJ1ZmZlcnMgYW5kIHRob3NlIG1ha2UgaXQgZWFzaWVyIHRvIGNhbGMgdGhlIGhhc2hcbiAgICBjaGFubmVsLmJpbmFyeVR5cGUgPSAnYXJyYXlidWZmZXInO1xuICAgIHRoaXMuY2hhbm5lbC5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIGxlbiA9IGV2ZW50LmRhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgc2VsZi5yZWNlaXZlZCArPSBsZW47XG4gICAgICAgIHNlbGYucmVjZWl2ZUJ1ZmZlci5wdXNoKGV2ZW50LmRhdGEpO1xuXG4gICAgICAgIHNlbGYuZW1pdCgncHJvZ3Jlc3MnLCBzZWxmLnJlY2VpdmVkLCBzZWxmLm1ldGFkYXRhLnNpemUsIGV2ZW50LmRhdGEpO1xuICAgICAgICBpZiAoc2VsZi5yZWNlaXZlZCA9PT0gc2VsZi5tZXRhZGF0YS5zaXplKSB7XG4gICAgICAgICAgICBzZWxmLmVtaXQoJ3JlY2VpdmVkRmlsZScsIG5ldyB3aW5kb3cuQmxvYihzZWxmLnJlY2VpdmVCdWZmZXIpLCBzZWxmLm1ldGFkYXRhKTtcbiAgICAgICAgICAgIHNlbGYucmVjZWl2ZUJ1ZmZlciA9IFtdOyAvLyBkaXNjYXJkIHJlY2VpdmVidWZmZXJcbiAgICAgICAgfSBlbHNlIGlmIChzZWxmLnJlY2VpdmVkID4gc2VsZi5tZXRhZGF0YS5zaXplKSB7XG4gICAgICAgICAgICAvLyBGSVhNRVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcigncmVjZWl2ZWQgbW9yZSB0aGFuIGV4cGVjdGVkLCBkaXNjYXJkaW5nLi4uJyk7XG4gICAgICAgICAgICBzZWxmLnJlY2VpdmVCdWZmZXIgPSBbXTsgLy8ganVzdCBkaXNjYXJkLi4uXG5cbiAgICAgICAgfVxuICAgIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHt9O1xubW9kdWxlLmV4cG9ydHMuc3VwcG9ydCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdyAmJiB3aW5kb3cuRmlsZSAmJiB3aW5kb3cuRmlsZVJlYWRlciAmJiB3aW5kb3cuQmxvYjtcbm1vZHVsZS5leHBvcnRzLlNlbmRlciA9IFNlbmRlcjtcbm1vZHVsZS5leHBvcnRzLlJlY2VpdmVyID0gUmVjZWl2ZXI7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZmlsZXRyYW5zZmVyL2ZpbGV0cmFuc2Zlci5qc1xuLy8gbW9kdWxlIGlkID0gNDg4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 489 */
/***/ function(module, exports, __webpack_require__) {

    eval("var adapter = __webpack_require__(459);\nmodule.exports = function (stream, el, options) {\n    var item;\n    var URL = window.URL;\n    var element = el;\n    var opts = {\n        autoplay: true,\n        mirror: false,\n        muted: false,\n        audio: false,\n        disableContextMenu: false\n    };\n\n    if (options) {\n        for (item in options) {\n            opts[item] = options[item];\n        }\n    }\n\n    if (!element) {\n        element = document.createElement(opts.audio ? 'audio' : 'video');\n    } else if (element.tagName.toLowerCase() === 'audio') {\n        opts.audio = true;\n    }\n\n    if (opts.disableContextMenu) {\n        element.oncontextmenu = function (e) {\n            e.preventDefault();\n        };\n    }\n\n    if (opts.autoplay) element.autoplay = 'autoplay';\n    if (opts.muted) element.muted = true;\n    if (!opts.audio && opts.mirror) {\n        ['', 'moz', 'webkit', 'o', 'ms'].forEach(function (prefix) {\n            var styleName = prefix ? prefix + 'Transform' : 'transform';\n            element.style[styleName] = 'scaleX(-1)';\n        });\n    }\n\n    element.srcObject = stream;\n    return element;\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDg5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9hdHRhY2htZWRpYXN0cmVhbS9hdHRhY2htZWRpYXN0cmVhbS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYWRhcHRlciA9IHJlcXVpcmUoJ3dlYnJ0Yy1hZGFwdGVyJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdHJlYW0sIGVsLCBvcHRpb25zKSB7XG4gICAgdmFyIGl0ZW07XG4gICAgdmFyIFVSTCA9IHdpbmRvdy5VUkw7XG4gICAgdmFyIGVsZW1lbnQgPSBlbDtcbiAgICB2YXIgb3B0cyA9IHtcbiAgICAgICAgYXV0b3BsYXk6IHRydWUsXG4gICAgICAgIG1pcnJvcjogZmFsc2UsXG4gICAgICAgIG11dGVkOiBmYWxzZSxcbiAgICAgICAgYXVkaW86IGZhbHNlLFxuICAgICAgICBkaXNhYmxlQ29udGV4dE1lbnU6IGZhbHNlXG4gICAgfTtcblxuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgIGZvciAoaXRlbSBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRzW2l0ZW1dID0gb3B0aW9uc1tpdGVtXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChvcHRzLmF1ZGlvID8gJ2F1ZGlvJyA6ICd2aWRlbycpO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdhdWRpbycpIHtcbiAgICAgICAgb3B0cy5hdWRpbyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZGlzYWJsZUNvbnRleHRNZW51KSB7XG4gICAgICAgIGVsZW1lbnQub25jb250ZXh0bWVudSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuYXV0b3BsYXkpIGVsZW1lbnQuYXV0b3BsYXkgPSAnYXV0b3BsYXknO1xuICAgIGlmIChvcHRzLm11dGVkKSBlbGVtZW50Lm11dGVkID0gdHJ1ZTtcbiAgICBpZiAoIW9wdHMuYXVkaW8gJiYgb3B0cy5taXJyb3IpIHtcbiAgICAgICAgWycnLCAnbW96JywgJ3dlYmtpdCcsICdvJywgJ21zJ10uZm9yRWFjaChmdW5jdGlvbiAocHJlZml4KSB7XG4gICAgICAgICAgICB2YXIgc3R5bGVOYW1lID0gcHJlZml4ID8gcHJlZml4ICsgJ1RyYW5zZm9ybScgOiAndHJhbnNmb3JtJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGVbc3R5bGVOYW1lXSA9ICdzY2FsZVgoLTEpJztcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZWxlbWVudC5zcmNPYmplY3QgPSBzdHJlYW07XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2F0dGFjaG1lZGlhc3RyZWFtL2F0dGFjaG1lZGlhc3RyZWFtLmpzXG4vLyBtb2R1bGUgaWQgPSA0ODlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 490 */
/***/ function(module, exports, __webpack_require__) {

    eval("var io = __webpack_require__(491);\n\nfunction SocketIoConnection(config) {\n    this.connection = io.connect(config.url, config.socketio);\n}\n\nSocketIoConnection.prototype.on = function (ev, fn) {\n    this.connection.on(ev, fn);\n};\n\nSocketIoConnection.prototype.emit = function () {\n    this.connection.emit.apply(this.connection, arguments);\n};\n\nSocketIoConnection.prototype.getSessionid = function () {\n    return this.connection.id;\n};\n\nSocketIoConnection.prototype.disconnect = function () {\n    return this.connection.disconnect();\n};\n\nmodule.exports = SocketIoConnection;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDkwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zaW1wbGV3ZWJydGMvc29ja2V0aW9jb25uZWN0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpbyA9IHJlcXVpcmUoJ3NvY2tldC5pby1jbGllbnQnKTtcblxuZnVuY3Rpb24gU29ja2V0SW9Db25uZWN0aW9uKGNvbmZpZykge1xuICAgIHRoaXMuY29ubmVjdGlvbiA9IGlvLmNvbm5lY3QoY29uZmlnLnVybCwgY29uZmlnLnNvY2tldGlvKTtcbn1cblxuU29ja2V0SW9Db25uZWN0aW9uLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIChldiwgZm4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24ub24oZXYsIGZuKTtcbn07XG5cblNvY2tldElvQ29ubmVjdGlvbi5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdC5hcHBseSh0aGlzLmNvbm5lY3Rpb24sIGFyZ3VtZW50cyk7XG59O1xuXG5Tb2NrZXRJb0Nvbm5lY3Rpb24ucHJvdG90eXBlLmdldFNlc3Npb25pZCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uLmlkO1xufTtcblxuU29ja2V0SW9Db25uZWN0aW9uLnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBTb2NrZXRJb0Nvbm5lY3Rpb247XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vc2ltcGxld2VicnRjL3NvY2tldGlvY29ubmVjdGlvbi5qc1xuLy8gbW9kdWxlIGlkID0gNDkwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 491 */
/***/ function(module, exports, __webpack_require__) {

    eval("\nmodule.exports = __webpack_require__(492);\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDkxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tY2xpZW50L2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi8nKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9zb2NrZXQuaW8tY2xpZW50L2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA0OTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 492 */
/***/ function(module, exports, __webpack_require__) {

    eval("\n/**\n * Module dependencies.\n */\n\nvar url = __webpack_require__(493);\nvar parser = __webpack_require__(496);\nvar Manager = __webpack_require__(504);\nvar debug = __webpack_require__(495)('socket.io-client');\n\n/**\n * Module exports.\n */\n\nmodule.exports = exports = lookup;\n\n/**\n * Managers cache.\n */\n\nvar cache = exports.managers = {};\n\n/**\n * Looks up an existing `Manager` for multiplexing.\n * If the user summons:\n *\n *   `io('http://localhost/a');`\n *   `io('http://localhost/b');`\n *\n * We reuse the existing instance based on same scheme/port/host,\n * and we initialize sockets for each namespace.\n *\n * @api public\n */\n\nfunction lookup(uri, opts) {\n  if (typeof uri == 'object') {\n    opts = uri;\n    uri = undefined;\n  }\n\n  opts = opts || {};\n\n  var parsed = url(uri);\n  var source = parsed.source;\n  var id = parsed.id;\n  var io;\n\n  if (opts.forceNew || opts['force new connection'] || false === opts.multiplex) {\n    debug('ignoring socket cache for %s', source);\n    io = Manager(source, opts);\n  } else {\n    if (!cache[id]) {\n      debug('new io instance for %s', source);\n      cache[id] = Manager(source, opts);\n    }\n    io = cache[id];\n  }\n\n  return io.socket(parsed.path);\n}\n\n/**\n * Protocol version.\n *\n * @api public\n */\n\nexports.protocol = parser.protocol;\n\n/**\n * `connect`.\n *\n * @param {String} uri\n * @api public\n */\n\nexports.connect = lookup;\n\n/**\n * Expose constructors for standalone build.\n *\n * @api public\n */\n\nexports.Manager = __webpack_require__(504);\nexports.Socket = __webpack_require__(535);\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDkyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tY2xpZW50L2xpYi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgdXJsID0gcmVxdWlyZSgnLi91cmwnKTtcbnZhciBwYXJzZXIgPSByZXF1aXJlKCdzb2NrZXQuaW8tcGFyc2VyJyk7XG52YXIgTWFuYWdlciA9IHJlcXVpcmUoJy4vbWFuYWdlcicpO1xudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnc29ja2V0LmlvLWNsaWVudCcpO1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGxvb2t1cDtcblxuLyoqXG4gKiBNYW5hZ2VycyBjYWNoZS5cbiAqL1xuXG52YXIgY2FjaGUgPSBleHBvcnRzLm1hbmFnZXJzID0ge307XG5cbi8qKlxuICogTG9va3MgdXAgYW4gZXhpc3RpbmcgYE1hbmFnZXJgIGZvciBtdWx0aXBsZXhpbmcuXG4gKiBJZiB0aGUgdXNlciBzdW1tb25zOlxuICpcbiAqICAgYGlvKCdodHRwOi8vbG9jYWxob3N0L2EnKTtgXG4gKiAgIGBpbygnaHR0cDovL2xvY2FsaG9zdC9iJyk7YFxuICpcbiAqIFdlIHJldXNlIHRoZSBleGlzdGluZyBpbnN0YW5jZSBiYXNlZCBvbiBzYW1lIHNjaGVtZS9wb3J0L2hvc3QsXG4gKiBhbmQgd2UgaW5pdGlhbGl6ZSBzb2NrZXRzIGZvciBlYWNoIG5hbWVzcGFjZS5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGxvb2t1cCh1cmksIG9wdHMpIHtcbiAgaWYgKHR5cGVvZiB1cmkgPT0gJ29iamVjdCcpIHtcbiAgICBvcHRzID0gdXJpO1xuICAgIHVyaSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gIHZhciBwYXJzZWQgPSB1cmwodXJpKTtcbiAgdmFyIHNvdXJjZSA9IHBhcnNlZC5zb3VyY2U7XG4gIHZhciBpZCA9IHBhcnNlZC5pZDtcbiAgdmFyIGlvO1xuXG4gIGlmIChvcHRzLmZvcmNlTmV3IHx8IG9wdHNbJ2ZvcmNlIG5ldyBjb25uZWN0aW9uJ10gfHwgZmFsc2UgPT09IG9wdHMubXVsdGlwbGV4KSB7XG4gICAgZGVidWcoJ2lnbm9yaW5nIHNvY2tldCBjYWNoZSBmb3IgJXMnLCBzb3VyY2UpO1xuICAgIGlvID0gTWFuYWdlcihzb3VyY2UsIG9wdHMpO1xuICB9IGVsc2Uge1xuICAgIGlmICghY2FjaGVbaWRdKSB7XG4gICAgICBkZWJ1ZygnbmV3IGlvIGluc3RhbmNlIGZvciAlcycsIHNvdXJjZSk7XG4gICAgICBjYWNoZVtpZF0gPSBNYW5hZ2VyKHNvdXJjZSwgb3B0cyk7XG4gICAgfVxuICAgIGlvID0gY2FjaGVbaWRdO1xuICB9XG5cbiAgcmV0dXJuIGlvLnNvY2tldChwYXJzZWQucGF0aCk7XG59XG5cbi8qKlxuICogUHJvdG9jb2wgdmVyc2lvbi5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMucHJvdG9jb2wgPSBwYXJzZXIucHJvdG9jb2w7XG5cbi8qKlxuICogYGNvbm5lY3RgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmlcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5jb25uZWN0ID0gbG9va3VwO1xuXG4vKipcbiAqIEV4cG9zZSBjb25zdHJ1Y3RvcnMgZm9yIHN0YW5kYWxvbmUgYnVpbGQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLk1hbmFnZXIgPSByZXF1aXJlKCcuL21hbmFnZXInKTtcbmV4cG9ydHMuU29ja2V0ID0gcmVxdWlyZSgnLi9zb2NrZXQnKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9zb2NrZXQuaW8tY2xpZW50L2xpYi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNDkyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 493 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(global) {\n/**\n * Module dependencies.\n */\n\nvar parseuri = __webpack_require__(494);\nvar debug = __webpack_require__(495)('socket.io-client:url');\n\n/**\n * Module exports.\n */\n\nmodule.exports = url;\n\n/**\n * URL parser.\n *\n * @param {String} url\n * @param {Object} An object meant to mimic window.location.\n *                 Defaults to window.location.\n * @api public\n */\n\nfunction url(uri, loc){\n  var obj = uri;\n\n  // default to window.location\n  var loc = loc || global.location;\n  if (null == uri) uri = loc.protocol + '//' + loc.host;\n\n  // relative path support\n  if ('string' == typeof uri) {\n    if ('/' == uri.charAt(0)) {\n      if ('/' == uri.charAt(1)) {\n        uri = loc.protocol + uri;\n      } else {\n        uri = loc.hostname + uri;\n      }\n    }\n\n    if (!/^(https?|wss?):\\/\\//.test(uri)) {\n      debug('protocol-less url %s', uri);\n      if ('undefined' != typeof loc) {\n        uri = loc.protocol + '//' + uri;\n      } else {\n        uri = 'https://' + uri;\n      }\n    }\n\n    // parse\n    debug('parse %s', uri);\n    obj = parseuri(uri);\n  }\n\n  // make sure we treat `localhost:80` and `localhost` equally\n  if (!obj.port) {\n    if (/^(http|ws)$/.test(obj.protocol)) {\n      obj.port = '80';\n    }\n    else if (/^(http|ws)s$/.test(obj.protocol)) {\n      obj.port = '443';\n    }\n  }\n\n  obj.path = obj.path || '/';\n\n  // define unique id\n  obj.id = obj.protocol + '://' + obj.host + ':' + obj.port;\n  // define href\n  obj.href = obj.protocol + '://' + obj.host + (loc && loc.port == obj.port ? '' : (':' + obj.port));\n\n  return obj;\n}\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDkzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tY2xpZW50L2xpYi91cmwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIHBhcnNldXJpID0gcmVxdWlyZSgncGFyc2V1cmknKTtcbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ3NvY2tldC5pby1jbGllbnQ6dXJsJyk7XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSB1cmw7XG5cbi8qKlxuICogVVJMIHBhcnNlci5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge09iamVjdH0gQW4gb2JqZWN0IG1lYW50IHRvIG1pbWljIHdpbmRvdy5sb2NhdGlvbi5cbiAqICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byB3aW5kb3cubG9jYXRpb24uXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHVybCh1cmksIGxvYyl7XG4gIHZhciBvYmogPSB1cmk7XG5cbiAgLy8gZGVmYXVsdCB0byB3aW5kb3cubG9jYXRpb25cbiAgdmFyIGxvYyA9IGxvYyB8fCBnbG9iYWwubG9jYXRpb247XG4gIGlmIChudWxsID09IHVyaSkgdXJpID0gbG9jLnByb3RvY29sICsgJy8vJyArIGxvYy5ob3N0O1xuXG4gIC8vIHJlbGF0aXZlIHBhdGggc3VwcG9ydFxuICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIHVyaSkge1xuICAgIGlmICgnLycgPT0gdXJpLmNoYXJBdCgwKSkge1xuICAgICAgaWYgKCcvJyA9PSB1cmkuY2hhckF0KDEpKSB7XG4gICAgICAgIHVyaSA9IGxvYy5wcm90b2NvbCArIHVyaTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVyaSA9IGxvYy5ob3N0bmFtZSArIHVyaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIS9eKGh0dHBzP3x3c3M/KTpcXC9cXC8vLnRlc3QodXJpKSkge1xuICAgICAgZGVidWcoJ3Byb3RvY29sLWxlc3MgdXJsICVzJywgdXJpKTtcbiAgICAgIGlmICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgbG9jKSB7XG4gICAgICAgIHVyaSA9IGxvYy5wcm90b2NvbCArICcvLycgKyB1cmk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cmkgPSAnaHR0cHM6Ly8nICsgdXJpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHBhcnNlXG4gICAgZGVidWcoJ3BhcnNlICVzJywgdXJpKTtcbiAgICBvYmogPSBwYXJzZXVyaSh1cmkpO1xuICB9XG5cbiAgLy8gbWFrZSBzdXJlIHdlIHRyZWF0IGBsb2NhbGhvc3Q6ODBgIGFuZCBgbG9jYWxob3N0YCBlcXVhbGx5XG4gIGlmICghb2JqLnBvcnQpIHtcbiAgICBpZiAoL14oaHR0cHx3cykkLy50ZXN0KG9iai5wcm90b2NvbCkpIHtcbiAgICAgIG9iai5wb3J0ID0gJzgwJztcbiAgICB9XG4gICAgZWxzZSBpZiAoL14oaHR0cHx3cylzJC8udGVzdChvYmoucHJvdG9jb2wpKSB7XG4gICAgICBvYmoucG9ydCA9ICc0NDMnO1xuICAgIH1cbiAgfVxuXG4gIG9iai5wYXRoID0gb2JqLnBhdGggfHwgJy8nO1xuXG4gIC8vIGRlZmluZSB1bmlxdWUgaWRcbiAgb2JqLmlkID0gb2JqLnByb3RvY29sICsgJzovLycgKyBvYmouaG9zdCArICc6JyArIG9iai5wb3J0O1xuICAvLyBkZWZpbmUgaHJlZlxuICBvYmouaHJlZiA9IG9iai5wcm90b2NvbCArICc6Ly8nICsgb2JqLmhvc3QgKyAobG9jICYmIGxvYy5wb3J0ID09IG9iai5wb3J0ID8gJycgOiAoJzonICsgb2JqLnBvcnQpKTtcblxuICByZXR1cm4gb2JqO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3NvY2tldC5pby1jbGllbnQvbGliL3VybC5qc1xuLy8gbW9kdWxlIGlkID0gNDkzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 494 */
/***/ function(module, exports) {

    eval("/**\n * Parses an URI\n *\n * @author Steven Levithan <stevenlevithan.com> (MIT license)\n * @api private\n */\n\nvar re = /^(?:(?![^:@]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\n\nvar parts = [\n    'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host'\n  , 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'\n];\n\nmodule.exports = function parseuri(str) {\n  var m = re.exec(str || '')\n    , uri = {}\n    , i = 14;\n\n  while (i--) {\n    uri[parts[i]] = m[i] || '';\n  }\n\n  return uri;\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDk0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9wYXJzZXVyaS9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBhcnNlcyBhbiBVUklcbiAqXG4gKiBAYXV0aG9yIFN0ZXZlbiBMZXZpdGhhbiA8c3RldmVubGV2aXRoYW4uY29tPiAoTUlUIGxpY2Vuc2UpXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG52YXIgcmUgPSAvXig/Oig/IVteOkBdKzpbXjpAXFwvXSpAKShodHRwfGh0dHBzfHdzfHdzcyk6XFwvXFwvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPygoPzpbYS1mMC05XXswLDR9Oil7Miw3fVthLWYwLTldezAsNH18W146XFwvPyNdKikoPzo6KFxcZCopKT8pKCgoXFwvKD86W14/I10oPyFbXj8jXFwvXSpcXC5bXj8jXFwvLl0rKD86Wz8jXXwkKSkpKlxcLz8pPyhbXj8jXFwvXSopKSg/OlxcPyhbXiNdKikpPyg/OiMoLiopKT8pLztcblxudmFyIHBhcnRzID0gW1xuICAgICdzb3VyY2UnLCAncHJvdG9jb2wnLCAnYXV0aG9yaXR5JywgJ3VzZXJJbmZvJywgJ3VzZXInLCAncGFzc3dvcmQnLCAnaG9zdCdcbiAgLCAncG9ydCcsICdyZWxhdGl2ZScsICdwYXRoJywgJ2RpcmVjdG9yeScsICdmaWxlJywgJ3F1ZXJ5JywgJ2FuY2hvcidcbl07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFyc2V1cmkoc3RyKSB7XG4gIHZhciBtID0gcmUuZXhlYyhzdHIgfHwgJycpXG4gICAgLCB1cmkgPSB7fVxuICAgICwgaSA9IDE0O1xuXG4gIHdoaWxlIChpLS0pIHtcbiAgICB1cmlbcGFydHNbaV1dID0gbVtpXSB8fCAnJztcbiAgfVxuXG4gIHJldHVybiB1cmk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3BhcnNldXJpL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA0OTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 495 */
/***/ function(module, exports) {

    eval("\n/**\n * Expose `debug()` as the module.\n */\n\nmodule.exports = debug;\n\n/**\n * Create a debugger with the given `name`.\n *\n * @param {String} name\n * @return {Type}\n * @api public\n */\n\nfunction debug(name) {\n  if (!debug.enabled(name)) return function(){};\n\n  return function(fmt){\n    fmt = coerce(fmt);\n\n    var curr = new Date;\n    var ms = curr - (debug[name] || curr);\n    debug[name] = curr;\n\n    fmt = name\n      + ' '\n      + fmt\n      + ' +' + debug.humanize(ms);\n\n    // This hackery is required for IE8\n    // where `console.log` doesn't have 'apply'\n    window.console\n      && console.log\n      && Function.prototype.apply.call(console.log, console, arguments);\n  }\n}\n\n/**\n * The currently active debug mode names.\n */\n\ndebug.names = [];\ndebug.skips = [];\n\n/**\n * Enables a debug mode by name. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} name\n * @api public\n */\n\ndebug.enable = function(name) {\n  try {\n    localStorage.debug = name;\n  } catch(e){}\n\n  var split = (name || '').split(/[\\s,]+/)\n    , len = split.length;\n\n  for (var i = 0; i < len; i++) {\n    name = split[i].replace('*', '.*?');\n    if (name[0] === '-') {\n      debug.skips.push(new RegExp('^' + name.substr(1) + '$'));\n    }\n    else {\n      debug.names.push(new RegExp('^' + name + '$'));\n    }\n  }\n};\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\ndebug.disable = function(){\n  debug.enable('');\n};\n\n/**\n * Humanize the given `ms`.\n *\n * @param {Number} m\n * @return {String}\n * @api private\n */\n\ndebug.humanize = function(ms) {\n  var sec = 1000\n    , min = 60 * 1000\n    , hour = 60 * min;\n\n  if (ms >= hour) return (ms / hour).toFixed(1) + 'h';\n  if (ms >= min) return (ms / min).toFixed(1) + 'm';\n  if (ms >= sec) return (ms / sec | 0) + 's';\n  return ms + 'ms';\n};\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\ndebug.enabled = function(name) {\n  for (var i = 0, len = debug.skips.length; i < len; i++) {\n    if (debug.skips[i].test(name)) {\n      return false;\n    }\n  }\n  for (var i = 0, len = debug.names.length; i < len; i++) {\n    if (debug.names[i].test(name)) {\n      return true;\n    }\n  }\n  return false;\n};\n\n/**\n * Coerce `val`.\n */\n\nfunction coerce(val) {\n  if (val instanceof Error) return val.stack || val.message;\n  return val;\n}\n\n// persist\n\ntry {\n  if (window.localStorage) debug.enable(localStorage.debug);\n} catch(e){}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDk1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tY2xpZW50L25vZGVfbW9kdWxlcy9kZWJ1Zy9kZWJ1Zy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZGVidWc7XG5cbi8qKlxuICogQ3JlYXRlIGEgZGVidWdnZXIgd2l0aCB0aGUgZ2l2ZW4gYG5hbWVgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtUeXBlfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkZWJ1ZyhuYW1lKSB7XG4gIGlmICghZGVidWcuZW5hYmxlZChuYW1lKSkgcmV0dXJuIGZ1bmN0aW9uKCl7fTtcblxuICByZXR1cm4gZnVuY3Rpb24oZm10KXtcbiAgICBmbXQgPSBjb2VyY2UoZm10KTtcblxuICAgIHZhciBjdXJyID0gbmV3IERhdGU7XG4gICAgdmFyIG1zID0gY3VyciAtIChkZWJ1Z1tuYW1lXSB8fCBjdXJyKTtcbiAgICBkZWJ1Z1tuYW1lXSA9IGN1cnI7XG5cbiAgICBmbXQgPSBuYW1lXG4gICAgICArICcgJ1xuICAgICAgKyBmbXRcbiAgICAgICsgJyArJyArIGRlYnVnLmh1bWFuaXplKG1zKTtcblxuICAgIC8vIFRoaXMgaGFja2VyeSBpcyByZXF1aXJlZCBmb3IgSUU4XG4gICAgLy8gd2hlcmUgYGNvbnNvbGUubG9nYCBkb2Vzbid0IGhhdmUgJ2FwcGx5J1xuICAgIHdpbmRvdy5jb25zb2xlXG4gICAgICAmJiBjb25zb2xlLmxvZ1xuICAgICAgJiYgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZS5sb2csIGNvbnNvbGUsIGFyZ3VtZW50cyk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgY3VycmVudGx5IGFjdGl2ZSBkZWJ1ZyBtb2RlIG5hbWVzLlxuICovXG5cbmRlYnVnLm5hbWVzID0gW107XG5kZWJ1Zy5za2lwcyA9IFtdO1xuXG4vKipcbiAqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWUuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcbiAqIHNlcGFyYXRlZCBieSBhIGNvbG9uIGFuZCB3aWxkY2FyZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZGVidWcuZW5hYmxlID0gZnVuY3Rpb24obmFtZSkge1xuICB0cnkge1xuICAgIGxvY2FsU3RvcmFnZS5kZWJ1ZyA9IG5hbWU7XG4gIH0gY2F0Y2goZSl7fVxuXG4gIHZhciBzcGxpdCA9IChuYW1lIHx8ICcnKS5zcGxpdCgvW1xccyxdKy8pXG4gICAgLCBsZW4gPSBzcGxpdC5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIG5hbWUgPSBzcGxpdFtpXS5yZXBsYWNlKCcqJywgJy4qPycpO1xuICAgIGlmIChuYW1lWzBdID09PSAnLScpIHtcbiAgICAgIGRlYnVnLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lLnN1YnN0cigxKSArICckJykpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGRlYnVnLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lICsgJyQnKSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIERpc2FibGUgZGVidWcgb3V0cHV0LlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZGVidWcuZGlzYWJsZSA9IGZ1bmN0aW9uKCl7XG4gIGRlYnVnLmVuYWJsZSgnJyk7XG59O1xuXG4vKipcbiAqIEh1bWFuaXplIHRoZSBnaXZlbiBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5kZWJ1Zy5odW1hbml6ZSA9IGZ1bmN0aW9uKG1zKSB7XG4gIHZhciBzZWMgPSAxMDAwXG4gICAgLCBtaW4gPSA2MCAqIDEwMDBcbiAgICAsIGhvdXIgPSA2MCAqIG1pbjtcblxuICBpZiAobXMgPj0gaG91cikgcmV0dXJuIChtcyAvIGhvdXIpLnRvRml4ZWQoMSkgKyAnaCc7XG4gIGlmIChtcyA+PSBtaW4pIHJldHVybiAobXMgLyBtaW4pLnRvRml4ZWQoMSkgKyAnbSc7XG4gIGlmIChtcyA+PSBzZWMpIHJldHVybiAobXMgLyBzZWMgfCAwKSArICdzJztcbiAgcmV0dXJuIG1zICsgJ21zJztcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5kZWJ1Zy5lbmFibGVkID0gZnVuY3Rpb24obmFtZSkge1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gZGVidWcuc2tpcHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoZGVidWcuc2tpcHNbaV0udGVzdChuYW1lKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gZGVidWcubmFtZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoZGVidWcubmFtZXNbaV0udGVzdChuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogQ29lcmNlIGB2YWxgLlxuICovXG5cbmZ1bmN0aW9uIGNvZXJjZSh2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gdmFsLnN0YWNrIHx8IHZhbC5tZXNzYWdlO1xuICByZXR1cm4gdmFsO1xufVxuXG4vLyBwZXJzaXN0XG5cbnRyeSB7XG4gIGlmICh3aW5kb3cubG9jYWxTdG9yYWdlKSBkZWJ1Zy5lbmFibGUobG9jYWxTdG9yYWdlLmRlYnVnKTtcbn0gY2F0Y2goZSl7fVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3NvY2tldC5pby1jbGllbnQvfi9kZWJ1Zy9kZWJ1Zy5qc1xuLy8gbW9kdWxlIGlkID0gNDk1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 496 */
/***/ function(module, exports, __webpack_require__) {

    eval("\n/**\n * Module dependencies.\n */\n\nvar debug = __webpack_require__(497)('socket.io-parser');\nvar json = __webpack_require__(498);\nvar isArray = __webpack_require__(500);\nvar Emitter = __webpack_require__(501);\nvar binary = __webpack_require__(502);\nvar isBuf = __webpack_require__(503);\n\n/**\n * Protocol version.\n *\n * @api public\n */\n\nexports.protocol = 4;\n\n/**\n * Packet types.\n *\n * @api public\n */\n\nexports.types = [\n  'CONNECT',\n  'DISCONNECT',\n  'EVENT',\n  'BINARY_EVENT',\n  'ACK',\n  'BINARY_ACK',\n  'ERROR'\n];\n\n/**\n * Packet type `connect`.\n *\n * @api public\n */\n\nexports.CONNECT = 0;\n\n/**\n * Packet type `disconnect`.\n *\n * @api public\n */\n\nexports.DISCONNECT = 1;\n\n/**\n * Packet type `event`.\n *\n * @api public\n */\n\nexports.EVENT = 2;\n\n/**\n * Packet type `ack`.\n *\n * @api public\n */\n\nexports.ACK = 3;\n\n/**\n * Packet type `error`.\n *\n * @api public\n */\n\nexports.ERROR = 4;\n\n/**\n * Packet type 'binary event'\n *\n * @api public\n */\n\nexports.BINARY_EVENT = 5;\n\n/**\n * Packet type `binary ack`. For acks with binary arguments.\n *\n * @api public\n */\n\nexports.BINARY_ACK = 6;\n\n/**\n * Encoder constructor.\n *\n * @api public\n */\n\nexports.Encoder = Encoder;\n\n/**\n * Decoder constructor.\n *\n * @api public\n */\n\nexports.Decoder = Decoder;\n\n/**\n * A socket.io Encoder instance\n *\n * @api public\n */\n\nfunction Encoder() {}\n\n/**\n * Encode a packet as a single string if non-binary, or as a\n * buffer sequence, depending on packet type.\n *\n * @param {Object} obj - packet object\n * @param {Function} callback - function to handle encodings (likely engine.write)\n * @return Calls callback with Array of encodings\n * @api public\n */\n\nEncoder.prototype.encode = function(obj, callback){\n  debug('encoding packet %j', obj);\n\n  if (exports.BINARY_EVENT == obj.type || exports.BINARY_ACK == obj.type) {\n    encodeAsBinary(obj, callback);\n  }\n  else {\n    var encoding = encodeAsString(obj);\n    callback([encoding]);\n  }\n};\n\n/**\n * Encode packet as string.\n *\n * @param {Object} packet\n * @return {String} encoded\n * @api private\n */\n\nfunction encodeAsString(obj) {\n  var str = '';\n  var nsp = false;\n\n  // first is type\n  str += obj.type;\n\n  // attachments if we have them\n  if (exports.BINARY_EVENT == obj.type || exports.BINARY_ACK == obj.type) {\n    str += obj.attachments;\n    str += '-';\n  }\n\n  // if we have a namespace other than `/`\n  // we append it followed by a comma `,`\n  if (obj.nsp && '/' != obj.nsp) {\n    nsp = true;\n    str += obj.nsp;\n  }\n\n  // immediately followed by the id\n  if (null != obj.id) {\n    if (nsp) {\n      str += ',';\n      nsp = false;\n    }\n    str += obj.id;\n  }\n\n  // json data\n  if (null != obj.data) {\n    if (nsp) str += ',';\n    str += json.stringify(obj.data);\n  }\n\n  debug('encoded %j as %s', obj, str);\n  return str;\n}\n\n/**\n * Encode packet as 'buffer sequence' by removing blobs, and\n * deconstructing packet into object with placeholders and\n * a list of buffers.\n *\n * @param {Object} packet\n * @return {Buffer} encoded\n * @api private\n */\n\nfunction encodeAsBinary(obj, callback) {\n\n  function writeEncoding(bloblessData) {\n    var deconstruction = binary.deconstructPacket(bloblessData);\n    var pack = encodeAsString(deconstruction.packet);\n    var buffers = deconstruction.buffers;\n\n    buffers.unshift(pack); // add packet info to beginning of data list\n    callback(buffers); // write all the buffers\n  }\n\n  binary.removeBlobs(obj, writeEncoding);\n}\n\n/**\n * A socket.io Decoder instance\n *\n * @return {Object} decoder\n * @api public\n */\n\nfunction Decoder() {\n  this.reconstructor = null;\n}\n\n/**\n * Mix in `Emitter` with Decoder.\n */\n\nEmitter(Decoder.prototype);\n\n/**\n * Decodes an ecoded packet string into packet JSON.\n *\n * @param {String} obj - encoded packet\n * @return {Object} packet\n * @api public\n */\n\nDecoder.prototype.add = function(obj) {\n  var packet;\n  if ('string' == typeof obj) {\n    packet = decodeString(obj);\n    if (exports.BINARY_EVENT == packet.type || exports.BINARY_ACK == packet.type) { // binary packet's json\n      this.reconstructor = new BinaryReconstructor(packet);\n\n      // no attachments, labeled binary but no binary data to follow\n      if (this.reconstructor.reconPack.attachments === 0) {\n        this.emit('decoded', packet);\n      }\n    } else { // non-binary full packet\n      this.emit('decoded', packet);\n    }\n  }\n  else if (isBuf(obj) || obj.base64) { // raw binary data\n    if (!this.reconstructor) {\n      throw new Error('got binary data when not reconstructing a packet');\n    } else {\n      packet = this.reconstructor.takeBinaryData(obj);\n      if (packet) { // received final buffer\n        this.reconstructor = null;\n        this.emit('decoded', packet);\n      }\n    }\n  }\n  else {\n    throw new Error('Unknown type: ' + obj);\n  }\n};\n\n/**\n * Decode a packet String (JSON data)\n *\n * @param {String} str\n * @return {Object} packet\n * @api private\n */\n\nfunction decodeString(str) {\n  var p = {};\n  var i = 0;\n\n  // look up type\n  p.type = Number(str.charAt(0));\n  if (null == exports.types[p.type]) return error();\n\n  // look up attachments if type binary\n  if (exports.BINARY_EVENT == p.type || exports.BINARY_ACK == p.type) {\n    var buf = '';\n    while (str.charAt(++i) != '-') {\n      buf += str.charAt(i);\n      if (i == str.length) break;\n    }\n    if (buf != Number(buf) || str.charAt(i) != '-') {\n      throw new Error('Illegal attachments');\n    }\n    p.attachments = Number(buf);\n  }\n\n  // look up namespace (if any)\n  if ('/' == str.charAt(i + 1)) {\n    p.nsp = '';\n    while (++i) {\n      var c = str.charAt(i);\n      if (',' == c) break;\n      p.nsp += c;\n      if (i == str.length) break;\n    }\n  } else {\n    p.nsp = '/';\n  }\n\n  // look up id\n  var next = str.charAt(i + 1);\n  if ('' !== next && Number(next) == next) {\n    p.id = '';\n    while (++i) {\n      var c = str.charAt(i);\n      if (null == c || Number(c) != c) {\n        --i;\n        break;\n      }\n      p.id += str.charAt(i);\n      if (i == str.length) break;\n    }\n    p.id = Number(p.id);\n  }\n\n  // look up json data\n  if (str.charAt(++i)) {\n    try {\n      p.data = json.parse(str.substr(i));\n    } catch(e){\n      return error();\n    }\n  }\n\n  debug('decoded %s as %j', str, p);\n  return p;\n}\n\n/**\n * Deallocates a parser's resources\n *\n * @api public\n */\n\nDecoder.prototype.destroy = function() {\n  if (this.reconstructor) {\n    this.reconstructor.finishedReconstruction();\n  }\n};\n\n/**\n * A manager of a binary event's 'buffer sequence'. Should\n * be constructed whenever a packet of type BINARY_EVENT is\n * decoded.\n *\n * @param {Object} packet\n * @return {BinaryReconstructor} initialized reconstructor\n * @api private\n */\n\nfunction BinaryReconstructor(packet) {\n  this.reconPack = packet;\n  this.buffers = [];\n}\n\n/**\n * Method to be called when binary data received from connection\n * after a BINARY_EVENT packet.\n *\n * @param {Buffer | ArrayBuffer} binData - the raw binary data received\n * @return {null | Object} returns null if more binary data is expected or\n *   a reconstructed packet object if all buffers have been received.\n * @api private\n */\n\nBinaryReconstructor.prototype.takeBinaryData = function(binData) {\n  this.buffers.push(binData);\n  if (this.buffers.length == this.reconPack.attachments) { // done with buffer list\n    var packet = binary.reconstructPacket(this.reconPack, this.buffers);\n    this.finishedReconstruction();\n    return packet;\n  }\n  return null;\n};\n\n/**\n * Cleans up binary packet reconstruction variables.\n *\n * @api private\n */\n\nBinaryReconstructor.prototype.finishedReconstruction = function() {\n  this.reconPack = null;\n  this.buffers = [];\n};\n\nfunction error(data){\n  return {\n    type: exports.ERROR,\n    data: 'parser error'\n  };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDk2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tcGFyc2VyL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ3NvY2tldC5pby1wYXJzZXInKTtcbnZhciBqc29uID0gcmVxdWlyZSgnanNvbjMnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpO1xudmFyIEVtaXR0ZXIgPSByZXF1aXJlKCdjb21wb25lbnQtZW1pdHRlcicpO1xudmFyIGJpbmFyeSA9IHJlcXVpcmUoJy4vYmluYXJ5Jyk7XG52YXIgaXNCdWYgPSByZXF1aXJlKCcuL2lzLWJ1ZmZlcicpO1xuXG4vKipcbiAqIFByb3RvY29sIHZlcnNpb24uXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLnByb3RvY29sID0gNDtcblxuLyoqXG4gKiBQYWNrZXQgdHlwZXMuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLnR5cGVzID0gW1xuICAnQ09OTkVDVCcsXG4gICdESVNDT05ORUNUJyxcbiAgJ0VWRU5UJyxcbiAgJ0JJTkFSWV9FVkVOVCcsXG4gICdBQ0snLFxuICAnQklOQVJZX0FDSycsXG4gICdFUlJPUidcbl07XG5cbi8qKlxuICogUGFja2V0IHR5cGUgYGNvbm5lY3RgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5DT05ORUNUID0gMDtcblxuLyoqXG4gKiBQYWNrZXQgdHlwZSBgZGlzY29ubmVjdGAuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLkRJU0NPTk5FQ1QgPSAxO1xuXG4vKipcbiAqIFBhY2tldCB0eXBlIGBldmVudGAuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLkVWRU5UID0gMjtcblxuLyoqXG4gKiBQYWNrZXQgdHlwZSBgYWNrYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMuQUNLID0gMztcblxuLyoqXG4gKiBQYWNrZXQgdHlwZSBgZXJyb3JgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5FUlJPUiA9IDQ7XG5cbi8qKlxuICogUGFja2V0IHR5cGUgJ2JpbmFyeSBldmVudCdcbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMuQklOQVJZX0VWRU5UID0gNTtcblxuLyoqXG4gKiBQYWNrZXQgdHlwZSBgYmluYXJ5IGFja2AuIEZvciBhY2tzIHdpdGggYmluYXJ5IGFyZ3VtZW50cy5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMuQklOQVJZX0FDSyA9IDY7XG5cbi8qKlxuICogRW5jb2RlciBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMuRW5jb2RlciA9IEVuY29kZXI7XG5cbi8qKlxuICogRGVjb2RlciBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMuRGVjb2RlciA9IERlY29kZXI7XG5cbi8qKlxuICogQSBzb2NrZXQuaW8gRW5jb2RlciBpbnN0YW5jZVxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gRW5jb2RlcigpIHt9XG5cbi8qKlxuICogRW5jb2RlIGEgcGFja2V0IGFzIGEgc2luZ2xlIHN0cmluZyBpZiBub24tYmluYXJ5LCBvciBhcyBhXG4gKiBidWZmZXIgc2VxdWVuY2UsIGRlcGVuZGluZyBvbiBwYWNrZXQgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gcGFja2V0IG9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSBmdW5jdGlvbiB0byBoYW5kbGUgZW5jb2RpbmdzIChsaWtlbHkgZW5naW5lLndyaXRlKVxuICogQHJldHVybiBDYWxscyBjYWxsYmFjayB3aXRoIEFycmF5IG9mIGVuY29kaW5nc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5FbmNvZGVyLnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbihvYmosIGNhbGxiYWNrKXtcbiAgZGVidWcoJ2VuY29kaW5nIHBhY2tldCAlaicsIG9iaik7XG5cbiAgaWYgKGV4cG9ydHMuQklOQVJZX0VWRU5UID09IG9iai50eXBlIHx8IGV4cG9ydHMuQklOQVJZX0FDSyA9PSBvYmoudHlwZSkge1xuICAgIGVuY29kZUFzQmluYXJ5KG9iaiwgY2FsbGJhY2spO1xuICB9XG4gIGVsc2Uge1xuICAgIHZhciBlbmNvZGluZyA9IGVuY29kZUFzU3RyaW5nKG9iaik7XG4gICAgY2FsbGJhY2soW2VuY29kaW5nXSk7XG4gIH1cbn07XG5cbi8qKlxuICogRW5jb2RlIHBhY2tldCBhcyBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhY2tldFxuICogQHJldHVybiB7U3RyaW5nfSBlbmNvZGVkXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBlbmNvZGVBc1N0cmluZyhvYmopIHtcbiAgdmFyIHN0ciA9ICcnO1xuICB2YXIgbnNwID0gZmFsc2U7XG5cbiAgLy8gZmlyc3QgaXMgdHlwZVxuICBzdHIgKz0gb2JqLnR5cGU7XG5cbiAgLy8gYXR0YWNobWVudHMgaWYgd2UgaGF2ZSB0aGVtXG4gIGlmIChleHBvcnRzLkJJTkFSWV9FVkVOVCA9PSBvYmoudHlwZSB8fCBleHBvcnRzLkJJTkFSWV9BQ0sgPT0gb2JqLnR5cGUpIHtcbiAgICBzdHIgKz0gb2JqLmF0dGFjaG1lbnRzO1xuICAgIHN0ciArPSAnLSc7XG4gIH1cblxuICAvLyBpZiB3ZSBoYXZlIGEgbmFtZXNwYWNlIG90aGVyIHRoYW4gYC9gXG4gIC8vIHdlIGFwcGVuZCBpdCBmb2xsb3dlZCBieSBhIGNvbW1hIGAsYFxuICBpZiAob2JqLm5zcCAmJiAnLycgIT0gb2JqLm5zcCkge1xuICAgIG5zcCA9IHRydWU7XG4gICAgc3RyICs9IG9iai5uc3A7XG4gIH1cblxuICAvLyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB0aGUgaWRcbiAgaWYgKG51bGwgIT0gb2JqLmlkKSB7XG4gICAgaWYgKG5zcCkge1xuICAgICAgc3RyICs9ICcsJztcbiAgICAgIG5zcCA9IGZhbHNlO1xuICAgIH1cbiAgICBzdHIgKz0gb2JqLmlkO1xuICB9XG5cbiAgLy8ganNvbiBkYXRhXG4gIGlmIChudWxsICE9IG9iai5kYXRhKSB7XG4gICAgaWYgKG5zcCkgc3RyICs9ICcsJztcbiAgICBzdHIgKz0ganNvbi5zdHJpbmdpZnkob2JqLmRhdGEpO1xuICB9XG5cbiAgZGVidWcoJ2VuY29kZWQgJWogYXMgJXMnLCBvYmosIHN0cik7XG4gIHJldHVybiBzdHI7XG59XG5cbi8qKlxuICogRW5jb2RlIHBhY2tldCBhcyAnYnVmZmVyIHNlcXVlbmNlJyBieSByZW1vdmluZyBibG9icywgYW5kXG4gKiBkZWNvbnN0cnVjdGluZyBwYWNrZXQgaW50byBvYmplY3Qgd2l0aCBwbGFjZWhvbGRlcnMgYW5kXG4gKiBhIGxpc3Qgb2YgYnVmZmVycy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFja2V0XG4gKiBAcmV0dXJuIHtCdWZmZXJ9IGVuY29kZWRcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGVuY29kZUFzQmluYXJ5KG9iaiwgY2FsbGJhY2spIHtcblxuICBmdW5jdGlvbiB3cml0ZUVuY29kaW5nKGJsb2JsZXNzRGF0YSkge1xuICAgIHZhciBkZWNvbnN0cnVjdGlvbiA9IGJpbmFyeS5kZWNvbnN0cnVjdFBhY2tldChibG9ibGVzc0RhdGEpO1xuICAgIHZhciBwYWNrID0gZW5jb2RlQXNTdHJpbmcoZGVjb25zdHJ1Y3Rpb24ucGFja2V0KTtcbiAgICB2YXIgYnVmZmVycyA9IGRlY29uc3RydWN0aW9uLmJ1ZmZlcnM7XG5cbiAgICBidWZmZXJzLnVuc2hpZnQocGFjayk7IC8vIGFkZCBwYWNrZXQgaW5mbyB0byBiZWdpbm5pbmcgb2YgZGF0YSBsaXN0XG4gICAgY2FsbGJhY2soYnVmZmVycyk7IC8vIHdyaXRlIGFsbCB0aGUgYnVmZmVyc1xuICB9XG5cbiAgYmluYXJ5LnJlbW92ZUJsb2JzKG9iaiwgd3JpdGVFbmNvZGluZyk7XG59XG5cbi8qKlxuICogQSBzb2NrZXQuaW8gRGVjb2RlciBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm4ge09iamVjdH0gZGVjb2RlclxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBEZWNvZGVyKCkge1xuICB0aGlzLnJlY29uc3RydWN0b3IgPSBudWxsO1xufVxuXG4vKipcbiAqIE1peCBpbiBgRW1pdHRlcmAgd2l0aCBEZWNvZGVyLlxuICovXG5cbkVtaXR0ZXIoRGVjb2Rlci5wcm90b3R5cGUpO1xuXG4vKipcbiAqIERlY29kZXMgYW4gZWNvZGVkIHBhY2tldCBzdHJpbmcgaW50byBwYWNrZXQgSlNPTi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gb2JqIC0gZW5jb2RlZCBwYWNrZXRcbiAqIEByZXR1cm4ge09iamVjdH0gcGFja2V0XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkRlY29kZXIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKG9iaikge1xuICB2YXIgcGFja2V0O1xuICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIG9iaikge1xuICAgIHBhY2tldCA9IGRlY29kZVN0cmluZyhvYmopO1xuICAgIGlmIChleHBvcnRzLkJJTkFSWV9FVkVOVCA9PSBwYWNrZXQudHlwZSB8fCBleHBvcnRzLkJJTkFSWV9BQ0sgPT0gcGFja2V0LnR5cGUpIHsgLy8gYmluYXJ5IHBhY2tldCdzIGpzb25cbiAgICAgIHRoaXMucmVjb25zdHJ1Y3RvciA9IG5ldyBCaW5hcnlSZWNvbnN0cnVjdG9yKHBhY2tldCk7XG5cbiAgICAgIC8vIG5vIGF0dGFjaG1lbnRzLCBsYWJlbGVkIGJpbmFyeSBidXQgbm8gYmluYXJ5IGRhdGEgdG8gZm9sbG93XG4gICAgICBpZiAodGhpcy5yZWNvbnN0cnVjdG9yLnJlY29uUGFjay5hdHRhY2htZW50cyA9PT0gMCkge1xuICAgICAgICB0aGlzLmVtaXQoJ2RlY29kZWQnLCBwYWNrZXQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIG5vbi1iaW5hcnkgZnVsbCBwYWNrZXRcbiAgICAgIHRoaXMuZW1pdCgnZGVjb2RlZCcsIHBhY2tldCk7XG4gICAgfVxuICB9XG4gIGVsc2UgaWYgKGlzQnVmKG9iaikgfHwgb2JqLmJhc2U2NCkgeyAvLyByYXcgYmluYXJ5IGRhdGFcbiAgICBpZiAoIXRoaXMucmVjb25zdHJ1Y3Rvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdnb3QgYmluYXJ5IGRhdGEgd2hlbiBub3QgcmVjb25zdHJ1Y3RpbmcgYSBwYWNrZXQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFja2V0ID0gdGhpcy5yZWNvbnN0cnVjdG9yLnRha2VCaW5hcnlEYXRhKG9iaik7XG4gICAgICBpZiAocGFja2V0KSB7IC8vIHJlY2VpdmVkIGZpbmFsIGJ1ZmZlclxuICAgICAgICB0aGlzLnJlY29uc3RydWN0b3IgPSBudWxsO1xuICAgICAgICB0aGlzLmVtaXQoJ2RlY29kZWQnLCBwYWNrZXQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gdHlwZTogJyArIG9iaik7XG4gIH1cbn07XG5cbi8qKlxuICogRGVjb2RlIGEgcGFja2V0IFN0cmluZyAoSlNPTiBkYXRhKVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge09iamVjdH0gcGFja2V0XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBkZWNvZGVTdHJpbmcoc3RyKSB7XG4gIHZhciBwID0ge307XG4gIHZhciBpID0gMDtcblxuICAvLyBsb29rIHVwIHR5cGVcbiAgcC50eXBlID0gTnVtYmVyKHN0ci5jaGFyQXQoMCkpO1xuICBpZiAobnVsbCA9PSBleHBvcnRzLnR5cGVzW3AudHlwZV0pIHJldHVybiBlcnJvcigpO1xuXG4gIC8vIGxvb2sgdXAgYXR0YWNobWVudHMgaWYgdHlwZSBiaW5hcnlcbiAgaWYgKGV4cG9ydHMuQklOQVJZX0VWRU5UID09IHAudHlwZSB8fCBleHBvcnRzLkJJTkFSWV9BQ0sgPT0gcC50eXBlKSB7XG4gICAgdmFyIGJ1ZiA9ICcnO1xuICAgIHdoaWxlIChzdHIuY2hhckF0KCsraSkgIT0gJy0nKSB7XG4gICAgICBidWYgKz0gc3RyLmNoYXJBdChpKTtcbiAgICAgIGlmIChpID09IHN0ci5sZW5ndGgpIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoYnVmICE9IE51bWJlcihidWYpIHx8IHN0ci5jaGFyQXQoaSkgIT0gJy0nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgYXR0YWNobWVudHMnKTtcbiAgICB9XG4gICAgcC5hdHRhY2htZW50cyA9IE51bWJlcihidWYpO1xuICB9XG5cbiAgLy8gbG9vayB1cCBuYW1lc3BhY2UgKGlmIGFueSlcbiAgaWYgKCcvJyA9PSBzdHIuY2hhckF0KGkgKyAxKSkge1xuICAgIHAubnNwID0gJyc7XG4gICAgd2hpbGUgKCsraSkge1xuICAgICAgdmFyIGMgPSBzdHIuY2hhckF0KGkpO1xuICAgICAgaWYgKCcsJyA9PSBjKSBicmVhaztcbiAgICAgIHAubnNwICs9IGM7XG4gICAgICBpZiAoaSA9PSBzdHIubGVuZ3RoKSBicmVhaztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcC5uc3AgPSAnLyc7XG4gIH1cblxuICAvLyBsb29rIHVwIGlkXG4gIHZhciBuZXh0ID0gc3RyLmNoYXJBdChpICsgMSk7XG4gIGlmICgnJyAhPT0gbmV4dCAmJiBOdW1iZXIobmV4dCkgPT0gbmV4dCkge1xuICAgIHAuaWQgPSAnJztcbiAgICB3aGlsZSAoKytpKSB7XG4gICAgICB2YXIgYyA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICBpZiAobnVsbCA9PSBjIHx8IE51bWJlcihjKSAhPSBjKSB7XG4gICAgICAgIC0taTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBwLmlkICs9IHN0ci5jaGFyQXQoaSk7XG4gICAgICBpZiAoaSA9PSBzdHIubGVuZ3RoKSBicmVhaztcbiAgICB9XG4gICAgcC5pZCA9IE51bWJlcihwLmlkKTtcbiAgfVxuXG4gIC8vIGxvb2sgdXAganNvbiBkYXRhXG4gIGlmIChzdHIuY2hhckF0KCsraSkpIHtcbiAgICB0cnkge1xuICAgICAgcC5kYXRhID0ganNvbi5wYXJzZShzdHIuc3Vic3RyKGkpKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgcmV0dXJuIGVycm9yKCk7XG4gICAgfVxuICB9XG5cbiAgZGVidWcoJ2RlY29kZWQgJXMgYXMgJWonLCBzdHIsIHApO1xuICByZXR1cm4gcDtcbn1cblxuLyoqXG4gKiBEZWFsbG9jYXRlcyBhIHBhcnNlcidzIHJlc291cmNlc1xuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRGVjb2Rlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5yZWNvbnN0cnVjdG9yKSB7XG4gICAgdGhpcy5yZWNvbnN0cnVjdG9yLmZpbmlzaGVkUmVjb25zdHJ1Y3Rpb24oKTtcbiAgfVxufTtcblxuLyoqXG4gKiBBIG1hbmFnZXIgb2YgYSBiaW5hcnkgZXZlbnQncyAnYnVmZmVyIHNlcXVlbmNlJy4gU2hvdWxkXG4gKiBiZSBjb25zdHJ1Y3RlZCB3aGVuZXZlciBhIHBhY2tldCBvZiB0eXBlIEJJTkFSWV9FVkVOVCBpc1xuICogZGVjb2RlZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFja2V0XG4gKiBAcmV0dXJuIHtCaW5hcnlSZWNvbnN0cnVjdG9yfSBpbml0aWFsaXplZCByZWNvbnN0cnVjdG9yXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBCaW5hcnlSZWNvbnN0cnVjdG9yKHBhY2tldCkge1xuICB0aGlzLnJlY29uUGFjayA9IHBhY2tldDtcbiAgdGhpcy5idWZmZXJzID0gW107XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIGJlIGNhbGxlZCB3aGVuIGJpbmFyeSBkYXRhIHJlY2VpdmVkIGZyb20gY29ubmVjdGlvblxuICogYWZ0ZXIgYSBCSU5BUllfRVZFTlQgcGFja2V0LlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyIHwgQXJyYXlCdWZmZXJ9IGJpbkRhdGEgLSB0aGUgcmF3IGJpbmFyeSBkYXRhIHJlY2VpdmVkXG4gKiBAcmV0dXJuIHtudWxsIHwgT2JqZWN0fSByZXR1cm5zIG51bGwgaWYgbW9yZSBiaW5hcnkgZGF0YSBpcyBleHBlY3RlZCBvclxuICogICBhIHJlY29uc3RydWN0ZWQgcGFja2V0IG9iamVjdCBpZiBhbGwgYnVmZmVycyBoYXZlIGJlZW4gcmVjZWl2ZWQuXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5CaW5hcnlSZWNvbnN0cnVjdG9yLnByb3RvdHlwZS50YWtlQmluYXJ5RGF0YSA9IGZ1bmN0aW9uKGJpbkRhdGEpIHtcbiAgdGhpcy5idWZmZXJzLnB1c2goYmluRGF0YSk7XG4gIGlmICh0aGlzLmJ1ZmZlcnMubGVuZ3RoID09IHRoaXMucmVjb25QYWNrLmF0dGFjaG1lbnRzKSB7IC8vIGRvbmUgd2l0aCBidWZmZXIgbGlzdFxuICAgIHZhciBwYWNrZXQgPSBiaW5hcnkucmVjb25zdHJ1Y3RQYWNrZXQodGhpcy5yZWNvblBhY2ssIHRoaXMuYnVmZmVycyk7XG4gICAgdGhpcy5maW5pc2hlZFJlY29uc3RydWN0aW9uKCk7XG4gICAgcmV0dXJuIHBhY2tldDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogQ2xlYW5zIHVwIGJpbmFyeSBwYWNrZXQgcmVjb25zdHJ1Y3Rpb24gdmFyaWFibGVzLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkJpbmFyeVJlY29uc3RydWN0b3IucHJvdG90eXBlLmZpbmlzaGVkUmVjb25zdHJ1Y3Rpb24gPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5yZWNvblBhY2sgPSBudWxsO1xuICB0aGlzLmJ1ZmZlcnMgPSBbXTtcbn07XG5cbmZ1bmN0aW9uIGVycm9yKGRhdGEpe1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGV4cG9ydHMuRVJST1IsXG4gICAgZGF0YTogJ3BhcnNlciBlcnJvcidcbiAgfTtcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9zb2NrZXQuaW8tcGFyc2VyL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA0OTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 497 */
/***/ function(module, exports) {

    eval("\n/**\n * Expose `debug()` as the module.\n */\n\nmodule.exports = debug;\n\n/**\n * Create a debugger with the given `name`.\n *\n * @param {String} name\n * @return {Type}\n * @api public\n */\n\nfunction debug(name) {\n  if (!debug.enabled(name)) return function(){};\n\n  return function(fmt){\n    fmt = coerce(fmt);\n\n    var curr = new Date;\n    var ms = curr - (debug[name] || curr);\n    debug[name] = curr;\n\n    fmt = name\n      + ' '\n      + fmt\n      + ' +' + debug.humanize(ms);\n\n    // This hackery is required for IE8\n    // where `console.log` doesn't have 'apply'\n    window.console\n      && console.log\n      && Function.prototype.apply.call(console.log, console, arguments);\n  }\n}\n\n/**\n * The currently active debug mode names.\n */\n\ndebug.names = [];\ndebug.skips = [];\n\n/**\n * Enables a debug mode by name. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} name\n * @api public\n */\n\ndebug.enable = function(name) {\n  try {\n    localStorage.debug = name;\n  } catch(e){}\n\n  var split = (name || '').split(/[\\s,]+/)\n    , len = split.length;\n\n  for (var i = 0; i < len; i++) {\n    name = split[i].replace('*', '.*?');\n    if (name[0] === '-') {\n      debug.skips.push(new RegExp('^' + name.substr(1) + '$'));\n    }\n    else {\n      debug.names.push(new RegExp('^' + name + '$'));\n    }\n  }\n};\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\ndebug.disable = function(){\n  debug.enable('');\n};\n\n/**\n * Humanize the given `ms`.\n *\n * @param {Number} m\n * @return {String}\n * @api private\n */\n\ndebug.humanize = function(ms) {\n  var sec = 1000\n    , min = 60 * 1000\n    , hour = 60 * min;\n\n  if (ms >= hour) return (ms / hour).toFixed(1) + 'h';\n  if (ms >= min) return (ms / min).toFixed(1) + 'm';\n  if (ms >= sec) return (ms / sec | 0) + 's';\n  return ms + 'ms';\n};\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\ndebug.enabled = function(name) {\n  for (var i = 0, len = debug.skips.length; i < len; i++) {\n    if (debug.skips[i].test(name)) {\n      return false;\n    }\n  }\n  for (var i = 0, len = debug.names.length; i < len; i++) {\n    if (debug.names[i].test(name)) {\n      return true;\n    }\n  }\n  return false;\n};\n\n/**\n * Coerce `val`.\n */\n\nfunction coerce(val) {\n  if (val instanceof Error) return val.stack || val.message;\n  return val;\n}\n\n// persist\n\ntry {\n  if (window.localStorage) debug.enable(localStorage.debug);\n} catch(e){}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDk3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tcGFyc2VyL25vZGVfbW9kdWxlcy9kZWJ1Zy9kZWJ1Zy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZGVidWc7XG5cbi8qKlxuICogQ3JlYXRlIGEgZGVidWdnZXIgd2l0aCB0aGUgZ2l2ZW4gYG5hbWVgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtUeXBlfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkZWJ1ZyhuYW1lKSB7XG4gIGlmICghZGVidWcuZW5hYmxlZChuYW1lKSkgcmV0dXJuIGZ1bmN0aW9uKCl7fTtcblxuICByZXR1cm4gZnVuY3Rpb24oZm10KXtcbiAgICBmbXQgPSBjb2VyY2UoZm10KTtcblxuICAgIHZhciBjdXJyID0gbmV3IERhdGU7XG4gICAgdmFyIG1zID0gY3VyciAtIChkZWJ1Z1tuYW1lXSB8fCBjdXJyKTtcbiAgICBkZWJ1Z1tuYW1lXSA9IGN1cnI7XG5cbiAgICBmbXQgPSBuYW1lXG4gICAgICArICcgJ1xuICAgICAgKyBmbXRcbiAgICAgICsgJyArJyArIGRlYnVnLmh1bWFuaXplKG1zKTtcblxuICAgIC8vIFRoaXMgaGFja2VyeSBpcyByZXF1aXJlZCBmb3IgSUU4XG4gICAgLy8gd2hlcmUgYGNvbnNvbGUubG9nYCBkb2Vzbid0IGhhdmUgJ2FwcGx5J1xuICAgIHdpbmRvdy5jb25zb2xlXG4gICAgICAmJiBjb25zb2xlLmxvZ1xuICAgICAgJiYgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZS5sb2csIGNvbnNvbGUsIGFyZ3VtZW50cyk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgY3VycmVudGx5IGFjdGl2ZSBkZWJ1ZyBtb2RlIG5hbWVzLlxuICovXG5cbmRlYnVnLm5hbWVzID0gW107XG5kZWJ1Zy5za2lwcyA9IFtdO1xuXG4vKipcbiAqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWUuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcbiAqIHNlcGFyYXRlZCBieSBhIGNvbG9uIGFuZCB3aWxkY2FyZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZGVidWcuZW5hYmxlID0gZnVuY3Rpb24obmFtZSkge1xuICB0cnkge1xuICAgIGxvY2FsU3RvcmFnZS5kZWJ1ZyA9IG5hbWU7XG4gIH0gY2F0Y2goZSl7fVxuXG4gIHZhciBzcGxpdCA9IChuYW1lIHx8ICcnKS5zcGxpdCgvW1xccyxdKy8pXG4gICAgLCBsZW4gPSBzcGxpdC5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIG5hbWUgPSBzcGxpdFtpXS5yZXBsYWNlKCcqJywgJy4qPycpO1xuICAgIGlmIChuYW1lWzBdID09PSAnLScpIHtcbiAgICAgIGRlYnVnLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lLnN1YnN0cigxKSArICckJykpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGRlYnVnLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lICsgJyQnKSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIERpc2FibGUgZGVidWcgb3V0cHV0LlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZGVidWcuZGlzYWJsZSA9IGZ1bmN0aW9uKCl7XG4gIGRlYnVnLmVuYWJsZSgnJyk7XG59O1xuXG4vKipcbiAqIEh1bWFuaXplIHRoZSBnaXZlbiBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5kZWJ1Zy5odW1hbml6ZSA9IGZ1bmN0aW9uKG1zKSB7XG4gIHZhciBzZWMgPSAxMDAwXG4gICAgLCBtaW4gPSA2MCAqIDEwMDBcbiAgICAsIGhvdXIgPSA2MCAqIG1pbjtcblxuICBpZiAobXMgPj0gaG91cikgcmV0dXJuIChtcyAvIGhvdXIpLnRvRml4ZWQoMSkgKyAnaCc7XG4gIGlmIChtcyA+PSBtaW4pIHJldHVybiAobXMgLyBtaW4pLnRvRml4ZWQoMSkgKyAnbSc7XG4gIGlmIChtcyA+PSBzZWMpIHJldHVybiAobXMgLyBzZWMgfCAwKSArICdzJztcbiAgcmV0dXJuIG1zICsgJ21zJztcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5kZWJ1Zy5lbmFibGVkID0gZnVuY3Rpb24obmFtZSkge1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gZGVidWcuc2tpcHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoZGVidWcuc2tpcHNbaV0udGVzdChuYW1lKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gZGVidWcubmFtZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoZGVidWcubmFtZXNbaV0udGVzdChuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogQ29lcmNlIGB2YWxgLlxuICovXG5cbmZ1bmN0aW9uIGNvZXJjZSh2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gdmFsLnN0YWNrIHx8IHZhbC5tZXNzYWdlO1xuICByZXR1cm4gdmFsO1xufVxuXG4vLyBwZXJzaXN0XG5cbnRyeSB7XG4gIGlmICh3aW5kb3cubG9jYWxTdG9yYWdlKSBkZWJ1Zy5lbmFibGUobG9jYWxTdG9yYWdlLmRlYnVnKTtcbn0gY2F0Y2goZSl7fVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3NvY2tldC5pby1wYXJzZXIvfi9kZWJ1Zy9kZWJ1Zy5qc1xuLy8gbW9kdWxlIGlkID0gNDk3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 498 */
/***/ function(module, exports, __webpack_require__) {

    eval("var __WEBPACK_AMD_DEFINE_RESULT__;/*! JSON v3.2.6 | http://bestiejs.github.io/json3 | Copyright 2012-2013, Kit Cambridge | http://kit.mit-license.org */\n;(function (window) {\n  // Convenience aliases.\n  var getClass = {}.toString, isProperty, forEach, undef;\n\n  // Detect the `define` function exposed by asynchronous module loaders. The\n  // strict `define` check is necessary for compatibility with `r.js`.\n  var isLoader = \"function\" === \"function\" && __webpack_require__(499);\n\n  // Detect native implementations.\n  var nativeJSON = typeof JSON == \"object\" && JSON;\n\n  // Set up the JSON 3 namespace, preferring the CommonJS `exports` object if\n  // available.\n  var JSON3 = typeof exports == \"object\" && exports && !exports.nodeType && exports;\n\n  if (JSON3 && nativeJSON) {\n    // Explicitly delegate to the native `stringify` and `parse`\n    // implementations in CommonJS environments.\n    JSON3.stringify = nativeJSON.stringify;\n    JSON3.parse = nativeJSON.parse;\n  } else {\n    // Export for web browsers, JavaScript engines, and asynchronous module\n    // loaders, using the global `JSON` object if available.\n    JSON3 = window.JSON = nativeJSON || {};\n  }\n\n  // Test the `Date#getUTC*` methods. Based on work by @Yaffle.\n  var isExtended = new Date(-3509827334573292);\n  try {\n    // The `getUTCFullYear`, `Month`, and `Date` methods return nonsensical\n    // results for certain dates in Opera >= 10.53.\n    isExtended = isExtended.getUTCFullYear() == -109252 && isExtended.getUTCMonth() === 0 && isExtended.getUTCDate() === 1 &&\n      // Safari < 2.0.2 stores the internal millisecond time value correctly,\n      // but clips the values returned by the date methods to the range of\n      // signed 32-bit integers ([-2 ** 31, 2 ** 31 - 1]).\n      isExtended.getUTCHours() == 10 && isExtended.getUTCMinutes() == 37 && isExtended.getUTCSeconds() == 6 && isExtended.getUTCMilliseconds() == 708;\n  } catch (exception) {}\n\n  // Internal: Determines whether the native `JSON.stringify` and `parse`\n  // implementations are spec-compliant. Based on work by Ken Snyder.\n  function has(name) {\n    if (has[name] !== undef) {\n      // Return cached feature test result.\n      return has[name];\n    }\n\n    var isSupported;\n    if (name == \"bug-string-char-index\") {\n      // IE <= 7 doesn't support accessing string characters using square\n      // bracket notation. IE 8 only supports this for primitives.\n      isSupported = \"a\"[0] != \"a\";\n    } else if (name == \"json\") {\n      // Indicates whether both `JSON.stringify` and `JSON.parse` are\n      // supported.\n      isSupported = has(\"json-stringify\") && has(\"json-parse\");\n    } else {\n      var value, serialized = '{\"a\":[1,true,false,null,\"\\\\u0000\\\\b\\\\n\\\\f\\\\r\\\\t\"]}';\n      // Test `JSON.stringify`.\n      if (name == \"json-stringify\") {\n        var stringify = JSON3.stringify, stringifySupported = typeof stringify == \"function\" && isExtended;\n        if (stringifySupported) {\n          // A test function object with a custom `toJSON` method.\n          (value = function () {\n            return 1;\n          }).toJSON = value;\n          try {\n            stringifySupported =\n              // Firefox 3.1b1 and b2 serialize string, number, and boolean\n              // primitives as object literals.\n              stringify(0) === \"0\" &&\n              // FF 3.1b1, b2, and JSON 2 serialize wrapped primitives as object\n              // literals.\n              stringify(new Number()) === \"0\" &&\n              stringify(new String()) == '\"\"' &&\n              // FF 3.1b1, 2 throw an error if the value is `null`, `undefined`, or\n              // does not define a canonical JSON representation (this applies to\n              // objects with `toJSON` properties as well, *unless* they are nested\n              // within an object or array).\n              stringify(getClass) === undef &&\n              // IE 8 serializes `undefined` as `\"undefined\"`. Safari <= 5.1.7 and\n              // FF 3.1b3 pass this test.\n              stringify(undef) === undef &&\n              // Safari <= 5.1.7 and FF 3.1b3 throw `Error`s and `TypeError`s,\n              // respectively, if the value is omitted entirely.\n              stringify() === undef &&\n              // FF 3.1b1, 2 throw an error if the given value is not a number,\n              // string, array, object, Boolean, or `null` literal. This applies to\n              // objects with custom `toJSON` methods as well, unless they are nested\n              // inside object or array literals. YUI 3.0.0b1 ignores custom `toJSON`\n              // methods entirely.\n              stringify(value) === \"1\" &&\n              stringify([value]) == \"[1]\" &&\n              // Prototype <= 1.6.1 serializes `[undefined]` as `\"[]\"` instead of\n              // `\"[null]\"`.\n              stringify([undef]) == \"[null]\" &&\n              // YUI 3.0.0b1 fails to serialize `null` literals.\n              stringify(null) == \"null\" &&\n              // FF 3.1b1, 2 halts serialization if an array contains a function:\n              // `[1, true, getClass, 1]` serializes as \"[1,true,],\". FF 3.1b3\n              // elides non-JSON values from objects and arrays, unless they\n              // define custom `toJSON` methods.\n              stringify([undef, getClass, null]) == \"[null,null,null]\" &&\n              // Simple serialization test. FF 3.1b1 uses Unicode escape sequences\n              // where character escape codes are expected (e.g., `\\b` => `\\u0008`).\n              stringify({ \"a\": [value, true, false, null, \"\\x00\\b\\n\\f\\r\\t\"] }) == serialized &&\n              // FF 3.1b1 and b2 ignore the `filter` and `width` arguments.\n              stringify(null, value) === \"1\" &&\n              stringify([1, 2], null, 1) == \"[\\n 1,\\n 2\\n]\" &&\n              // JSON 2, Prototype <= 1.7, and older WebKit builds incorrectly\n              // serialize extended years.\n              stringify(new Date(-8.64e15)) == '\"-271821-04-20T00:00:00.000Z\"' &&\n              // The milliseconds are optional in ES 5, but required in 5.1.\n              stringify(new Date(8.64e15)) == '\"+275760-09-13T00:00:00.000Z\"' &&\n              // Firefox <= 11.0 incorrectly serializes years prior to 0 as negative\n              // four-digit years instead of six-digit years. Credits: @Yaffle.\n              stringify(new Date(-621987552e5)) == '\"-000001-01-01T00:00:00.000Z\"' &&\n              // Safari <= 5.1.5 and Opera >= 10.53 incorrectly serialize millisecond\n              // values less than 1000. Credits: @Yaffle.\n              stringify(new Date(-1)) == '\"1969-12-31T23:59:59.999Z\"';\n          } catch (exception) {\n            stringifySupported = false;\n          }\n        }\n        isSupported = stringifySupported;\n      }\n      // Test `JSON.parse`.\n      if (name == \"json-parse\") {\n        var parse = JSON3.parse;\n        if (typeof parse == \"function\") {\n          try {\n            // FF 3.1b1, b2 will throw an exception if a bare literal is provided.\n            // Conforming implementations should also coerce the initial argument to\n            // a string prior to parsing.\n            if (parse(\"0\") === 0 && !parse(false)) {\n              // Simple parsing test.\n              value = parse(serialized);\n              var parseSupported = value[\"a\"].length == 5 && value[\"a\"][0] === 1;\n              if (parseSupported) {\n                try {\n                  // Safari <= 5.1.2 and FF 3.1b1 allow unescaped tabs in strings.\n                  parseSupported = !parse('\"\\t\"');\n                } catch (exception) {}\n                if (parseSupported) {\n                  try {\n                    // FF 4.0 and 4.0.1 allow leading `+` signs and leading\n                    // decimal points. FF 4.0, 4.0.1, and IE 9-10 also allow\n                    // certain octal literals.\n                    parseSupported = parse(\"01\") !== 1;\n                  } catch (exception) {}\n                }\n                if (parseSupported) {\n                  try {\n                    // FF 4.0, 4.0.1, and Rhino 1.7R3-R4 allow trailing decimal\n                    // points. These environments, along with FF 3.1b1 and 2,\n                    // also allow trailing commas in JSON objects and arrays.\n                    parseSupported = parse(\"1.\") !== 1;\n                  } catch (exception) {}\n                }\n              }\n            }\n          } catch (exception) {\n            parseSupported = false;\n          }\n        }\n        isSupported = parseSupported;\n      }\n    }\n    return has[name] = !!isSupported;\n  }\n\n  if (!has(\"json\")) {\n    // Common `[[Class]]` name aliases.\n    var functionClass = \"[object Function]\";\n    var dateClass = \"[object Date]\";\n    var numberClass = \"[object Number]\";\n    var stringClass = \"[object String]\";\n    var arrayClass = \"[object Array]\";\n    var booleanClass = \"[object Boolean]\";\n\n    // Detect incomplete support for accessing string characters by index.\n    var charIndexBuggy = has(\"bug-string-char-index\");\n\n    // Define additional utility methods if the `Date` methods are buggy.\n    if (!isExtended) {\n      var floor = Math.floor;\n      // A mapping between the months of the year and the number of days between\n      // January 1st and the first of the respective month.\n      var Months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];\n      // Internal: Calculates the number of days between the Unix epoch and the\n      // first day of the given month.\n      var getDay = function (year, month) {\n        return Months[month] + 365 * (year - 1970) + floor((year - 1969 + (month = +(month > 1))) / 4) - floor((year - 1901 + month) / 100) + floor((year - 1601 + month) / 400);\n      };\n    }\n\n    // Internal: Determines if a property is a direct property of the given\n    // object. Delegates to the native `Object#hasOwnProperty` method.\n    if (!(isProperty = {}.hasOwnProperty)) {\n      isProperty = function (property) {\n        var members = {}, constructor;\n        if ((members.__proto__ = null, members.__proto__ = {\n          // The *proto* property cannot be set multiple times in recent\n          // versions of Firefox and SeaMonkey.\n          \"toString\": 1\n        }, members).toString != getClass) {\n          // Safari <= 2.0.3 doesn't implement `Object#hasOwnProperty`, but\n          // supports the mutable *proto* property.\n          isProperty = function (property) {\n            // Capture and break the object's prototype chain (see section 8.6.2\n            // of the ES 5.1 spec). The parenthesized expression prevents an\n            // unsafe transformation by the Closure Compiler.\n            var original = this.__proto__, result = property in (this.__proto__ = null, this);\n            // Restore the original prototype chain.\n            this.__proto__ = original;\n            return result;\n          };\n        } else {\n          // Capture a reference to the top-level `Object` constructor.\n          constructor = members.constructor;\n          // Use the `constructor` property to simulate `Object#hasOwnProperty` in\n          // other environments.\n          isProperty = function (property) {\n            var parent = (this.constructor || constructor).prototype;\n            return property in this && !(property in parent && this[property] === parent[property]);\n          };\n        }\n        members = null;\n        return isProperty.call(this, property);\n      };\n    }\n\n    // Internal: A set of primitive types used by `isHostType`.\n    var PrimitiveTypes = {\n      'boolean': 1,\n      'number': 1,\n      'string': 1,\n      'undefined': 1\n    };\n\n    // Internal: Determines if the given object `property` value is a\n    // non-primitive.\n    var isHostType = function (object, property) {\n      var type = typeof object[property];\n      return type == 'object' ? !!object[property] : !PrimitiveTypes[type];\n    };\n\n    // Internal: Normalizes the `for...in` iteration algorithm across\n    // environments. Each enumerated key is yielded to a `callback` function.\n    forEach = function (object, callback) {\n      var size = 0, Properties, members, property;\n\n      // Tests for bugs in the current environment's `for...in` algorithm. The\n      // `valueOf` property inherits the non-enumerable flag from\n      // `Object.prototype` in older versions of IE, Netscape, and Mozilla.\n      (Properties = function () {\n        this.valueOf = 0;\n      }).prototype.valueOf = 0;\n\n      // Iterate over a new instance of the `Properties` class.\n      members = new Properties();\n      for (property in members) {\n        // Ignore all properties inherited from `Object.prototype`.\n        if (isProperty.call(members, property)) {\n          size++;\n        }\n      }\n      Properties = members = null;\n\n      // Normalize the iteration algorithm.\n      if (!size) {\n        // A list of non-enumerable properties inherited from `Object.prototype`.\n        members = [\"valueOf\", \"toString\", \"toLocaleString\", \"propertyIsEnumerable\", \"isPrototypeOf\", \"hasOwnProperty\", \"constructor\"];\n        // IE <= 8, Mozilla 1.0, and Netscape 6.2 ignore shadowed non-enumerable\n        // properties.\n        forEach = function (object, callback) {\n          var isFunction = getClass.call(object) == functionClass, property, length;\n          var hasProperty = !isFunction && typeof object.constructor != 'function' && isHostType(object, 'hasOwnProperty') ? object.hasOwnProperty : isProperty;\n          for (property in object) {\n            // Gecko <= 1.0 enumerates the `prototype` property of functions under\n            // certain conditions; IE does not.\n            if (!(isFunction && property == \"prototype\") && hasProperty.call(object, property)) {\n              callback(property);\n            }\n          }\n          // Manually invoke the callback for each non-enumerable property.\n          for (length = members.length; property = members[--length]; hasProperty.call(object, property) && callback(property));\n        };\n      } else if (size == 2) {\n        // Safari <= 2.0.4 enumerates shadowed properties twice.\n        forEach = function (object, callback) {\n          // Create a set of iterated properties.\n          var members = {}, isFunction = getClass.call(object) == functionClass, property;\n          for (property in object) {\n            // Store each property name to prevent double enumeration. The\n            // `prototype` property of functions is not enumerated due to cross-\n            // environment inconsistencies.\n            if (!(isFunction && property == \"prototype\") && !isProperty.call(members, property) && (members[property] = 1) && isProperty.call(object, property)) {\n              callback(property);\n            }\n          }\n        };\n      } else {\n        // No bugs detected; use the standard `for...in` algorithm.\n        forEach = function (object, callback) {\n          var isFunction = getClass.call(object) == functionClass, property, isConstructor;\n          for (property in object) {\n            if (!(isFunction && property == \"prototype\") && isProperty.call(object, property) && !(isConstructor = property === \"constructor\")) {\n              callback(property);\n            }\n          }\n          // Manually invoke the callback for the `constructor` property due to\n          // cross-environment inconsistencies.\n          if (isConstructor || isProperty.call(object, (property = \"constructor\"))) {\n            callback(property);\n          }\n        };\n      }\n      return forEach(object, callback);\n    };\n\n    // Public: Serializes a JavaScript `value` as a JSON string. The optional\n    // `filter` argument may specify either a function that alters how object and\n    // array members are serialized, or an array of strings and numbers that\n    // indicates which properties should be serialized. The optional `width`\n    // argument may be either a string or number that specifies the indentation\n    // level of the output.\n    if (!has(\"json-stringify\")) {\n      // Internal: A map of control characters and their escaped equivalents.\n      var Escapes = {\n        92: \"\\\\\\\\\",\n        34: '\\\\\"',\n        8: \"\\\\b\",\n        12: \"\\\\f\",\n        10: \"\\\\n\",\n        13: \"\\\\r\",\n        9: \"\\\\t\"\n      };\n\n      // Internal: Converts `value` into a zero-padded string such that its\n      // length is at least equal to `width`. The `width` must be <= 6.\n      var leadingZeroes = \"000000\";\n      var toPaddedString = function (width, value) {\n        // The `|| 0` expression is necessary to work around a bug in\n        // Opera <= 7.54u2 where `0 == -0`, but `String(-0) !== \"0\"`.\n        return (leadingZeroes + (value || 0)).slice(-width);\n      };\n\n      // Internal: Double-quotes a string `value`, replacing all ASCII control\n      // characters (characters with code unit values between 0 and 31) with\n      // their escaped equivalents. This is an implementation of the\n      // `Quote(value)` operation defined in ES 5.1 section 15.12.3.\n      var unicodePrefix = \"\\\\u00\";\n      var quote = function (value) {\n        var result = '\"', index = 0, length = value.length, isLarge = length > 10 && charIndexBuggy, symbols;\n        if (isLarge) {\n          symbols = value.split(\"\");\n        }\n        for (; index < length; index++) {\n          var charCode = value.charCodeAt(index);\n          // If the character is a control character, append its Unicode or\n          // shorthand escape sequence; otherwise, append the character as-is.\n          switch (charCode) {\n            case 8: case 9: case 10: case 12: case 13: case 34: case 92:\n              result += Escapes[charCode];\n              break;\n            default:\n              if (charCode < 32) {\n                result += unicodePrefix + toPaddedString(2, charCode.toString(16));\n                break;\n              }\n              result += isLarge ? symbols[index] : charIndexBuggy ? value.charAt(index) : value[index];\n          }\n        }\n        return result + '\"';\n      };\n\n      // Internal: Recursively serializes an object. Implements the\n      // `Str(key, holder)`, `JO(value)`, and `JA(value)` operations.\n      var serialize = function (property, object, callback, properties, whitespace, indentation, stack) {\n        var value, className, year, month, date, time, hours, minutes, seconds, milliseconds, results, element, index, length, prefix, result;\n        try {\n          // Necessary for host object support.\n          value = object[property];\n        } catch (exception) {}\n        if (typeof value == \"object\" && value) {\n          className = getClass.call(value);\n          if (className == dateClass && !isProperty.call(value, \"toJSON\")) {\n            if (value > -1 / 0 && value < 1 / 0) {\n              // Dates are serialized according to the `Date#toJSON` method\n              // specified in ES 5.1 section 15.9.5.44. See section 15.9.1.15\n              // for the ISO 8601 date time string format.\n              if (getDay) {\n                // Manually compute the year, month, date, hours, minutes,\n                // seconds, and milliseconds if the `getUTC*` methods are\n                // buggy. Adapted from @Yaffle's `date-shim` project.\n                date = floor(value / 864e5);\n                for (year = floor(date / 365.2425) + 1970 - 1; getDay(year + 1, 0) <= date; year++);\n                for (month = floor((date - getDay(year, 0)) / 30.42); getDay(year, month + 1) <= date; month++);\n                date = 1 + date - getDay(year, month);\n                // The `time` value specifies the time within the day (see ES\n                // 5.1 section 15.9.1.2). The formula `(A % B + B) % B` is used\n                // to compute `A modulo B`, as the `%` operator does not\n                // correspond to the `modulo` operation for negative numbers.\n                time = (value % 864e5 + 864e5) % 864e5;\n                // The hours, minutes, seconds, and milliseconds are obtained by\n                // decomposing the time within the day. See section 15.9.1.10.\n                hours = floor(time / 36e5) % 24;\n                minutes = floor(time / 6e4) % 60;\n                seconds = floor(time / 1e3) % 60;\n                milliseconds = time % 1e3;\n              } else {\n                year = value.getUTCFullYear();\n                month = value.getUTCMonth();\n                date = value.getUTCDate();\n                hours = value.getUTCHours();\n                minutes = value.getUTCMinutes();\n                seconds = value.getUTCSeconds();\n                milliseconds = value.getUTCMilliseconds();\n              }\n              // Serialize extended years correctly.\n              value = (year <= 0 || year >= 1e4 ? (year < 0 ? \"-\" : \"+\") + toPaddedString(6, year < 0 ? -year : year) : toPaddedString(4, year)) +\n                \"-\" + toPaddedString(2, month + 1) + \"-\" + toPaddedString(2, date) +\n                // Months, dates, hours, minutes, and seconds should have two\n                // digits; milliseconds should have three.\n                \"T\" + toPaddedString(2, hours) + \":\" + toPaddedString(2, minutes) + \":\" + toPaddedString(2, seconds) +\n                // Milliseconds are optional in ES 5.0, but required in 5.1.\n                \".\" + toPaddedString(3, milliseconds) + \"Z\";\n            } else {\n              value = null;\n            }\n          } else if (typeof value.toJSON == \"function\" && ((className != numberClass && className != stringClass && className != arrayClass) || isProperty.call(value, \"toJSON\"))) {\n            // Prototype <= 1.6.1 adds non-standard `toJSON` methods to the\n            // `Number`, `String`, `Date`, and `Array` prototypes. JSON 3\n            // ignores all `toJSON` methods on these objects unless they are\n            // defined directly on an instance.\n            value = value.toJSON(property);\n          }\n        }\n        if (callback) {\n          // If a replacement function was provided, call it to obtain the value\n          // for serialization.\n          value = callback.call(object, property, value);\n        }\n        if (value === null) {\n          return \"null\";\n        }\n        className = getClass.call(value);\n        if (className == booleanClass) {\n          // Booleans are represented literally.\n          return \"\" + value;\n        } else if (className == numberClass) {\n          // JSON numbers must be finite. `Infinity` and `NaN` are serialized as\n          // `\"null\"`.\n          return value > -1 / 0 && value < 1 / 0 ? \"\" + value : \"null\";\n        } else if (className == stringClass) {\n          // Strings are double-quoted and escaped.\n          return quote(\"\" + value);\n        }\n        // Recursively serialize objects and arrays.\n        if (typeof value == \"object\") {\n          // Check for cyclic structures. This is a linear search; performance\n          // is inversely proportional to the number of unique nested objects.\n          for (length = stack.length; length--;) {\n            if (stack[length] === value) {\n              // Cyclic structures cannot be serialized by `JSON.stringify`.\n              throw TypeError();\n            }\n          }\n          // Add the object to the stack of traversed objects.\n          stack.push(value);\n          results = [];\n          // Save the current indentation level and indent one additional level.\n          prefix = indentation;\n          indentation += whitespace;\n          if (className == arrayClass) {\n            // Recursively serialize array elements.\n            for (index = 0, length = value.length; index < length; index++) {\n              element = serialize(index, value, callback, properties, whitespace, indentation, stack);\n              results.push(element === undef ? \"null\" : element);\n            }\n            result = results.length ? (whitespace ? \"[\\n\" + indentation + results.join(\",\\n\" + indentation) + \"\\n\" + prefix + \"]\" : (\"[\" + results.join(\",\") + \"]\")) : \"[]\";\n          } else {\n            // Recursively serialize object members. Members are selected from\n            // either a user-specified list of property names, or the object\n            // itself.\n            forEach(properties || value, function (property) {\n              var element = serialize(property, value, callback, properties, whitespace, indentation, stack);\n              if (element !== undef) {\n                // According to ES 5.1 section 15.12.3: \"If `gap` {whitespace}\n                // is not the empty string, let `member` {quote(property) + \":\"}\n                // be the concatenation of `member` and the `space` character.\"\n                // The \"`space` character\" refers to the literal space\n                // character, not the `space` {width} argument provided to\n                // `JSON.stringify`.\n                results.push(quote(property) + \":\" + (whitespace ? \" \" : \"\") + element);\n              }\n            });\n            result = results.length ? (whitespace ? \"{\\n\" + indentation + results.join(\",\\n\" + indentation) + \"\\n\" + prefix + \"}\" : (\"{\" + results.join(\",\") + \"}\")) : \"{}\";\n          }\n          // Remove the object from the traversed object stack.\n          stack.pop();\n          return result;\n        }\n      };\n\n      // Public: `JSON.stringify`. See ES 5.1 section 15.12.3.\n      JSON3.stringify = function (source, filter, width) {\n        var whitespace, callback, properties, className;\n        if (typeof filter == \"function\" || typeof filter == \"object\" && filter) {\n          if ((className = getClass.call(filter)) == functionClass) {\n            callback = filter;\n          } else if (className == arrayClass) {\n            // Convert the property names array into a makeshift set.\n            properties = {};\n            for (var index = 0, length = filter.length, value; index < length; value = filter[index++], ((className = getClass.call(value)), className == stringClass || className == numberClass) && (properties[value] = 1));\n          }\n        }\n        if (width) {\n          if ((className = getClass.call(width)) == numberClass) {\n            // Convert the `width` to an integer and create a string containing\n            // `width` number of space characters.\n            if ((width -= width % 1) > 0) {\n              for (whitespace = \"\", width > 10 && (width = 10); whitespace.length < width; whitespace += \" \");\n            }\n          } else if (className == stringClass) {\n            whitespace = width.length <= 10 ? width : width.slice(0, 10);\n          }\n        }\n        // Opera <= 7.54u2 discards the values associated with empty string keys\n        // (`\"\"`) only if they are used directly within an object member list\n        // (e.g., `!(\"\" in { \"\": 1})`).\n        return serialize(\"\", (value = {}, value[\"\"] = source, value), callback, properties, whitespace, \"\", []);\n      };\n    }\n\n    // Public: Parses a JSON source string.\n    if (!has(\"json-parse\")) {\n      var fromCharCode = String.fromCharCode;\n\n      // Internal: A map of escaped control characters and their unescaped\n      // equivalents.\n      var Unescapes = {\n        92: \"\\\\\",\n        34: '\"',\n        47: \"/\",\n        98: \"\\b\",\n        116: \"\\t\",\n        110: \"\\n\",\n        102: \"\\f\",\n        114: \"\\r\"\n      };\n\n      // Internal: Stores the parser state.\n      var Index, Source;\n\n      // Internal: Resets the parser state and throws a `SyntaxError`.\n      var abort = function() {\n        Index = Source = null;\n        throw SyntaxError();\n      };\n\n      // Internal: Returns the next token, or `\"$\"` if the parser has reached\n      // the end of the source string. A token may be a string, number, `null`\n      // literal, or Boolean literal.\n      var lex = function () {\n        var source = Source, length = source.length, value, begin, position, isSigned, charCode;\n        while (Index < length) {\n          charCode = source.charCodeAt(Index);\n          switch (charCode) {\n            case 9: case 10: case 13: case 32:\n              // Skip whitespace tokens, including tabs, carriage returns, line\n              // feeds, and space characters.\n              Index++;\n              break;\n            case 123: case 125: case 91: case 93: case 58: case 44:\n              // Parse a punctuator token (`{`, `}`, `[`, `]`, `:`, or `,`) at\n              // the current position.\n              value = charIndexBuggy ? source.charAt(Index) : source[Index];\n              Index++;\n              return value;\n            case 34:\n              // `\"` delimits a JSON string; advance to the next character and\n              // begin parsing the string. String tokens are prefixed with the\n              // sentinel `@` character to distinguish them from punctuators and\n              // end-of-string tokens.\n              for (value = \"@\", Index++; Index < length;) {\n                charCode = source.charCodeAt(Index);\n                if (charCode < 32) {\n                  // Unescaped ASCII control characters (those with a code unit\n                  // less than the space character) are not permitted.\n                  abort();\n                } else if (charCode == 92) {\n                  // A reverse solidus (`\\`) marks the beginning of an escaped\n                  // control character (including `\"`, `\\`, and `/`) or Unicode\n                  // escape sequence.\n                  charCode = source.charCodeAt(++Index);\n                  switch (charCode) {\n                    case 92: case 34: case 47: case 98: case 116: case 110: case 102: case 114:\n                      // Revive escaped control characters.\n                      value += Unescapes[charCode];\n                      Index++;\n                      break;\n                    case 117:\n                      // `\\u` marks the beginning of a Unicode escape sequence.\n                      // Advance to the first character and validate the\n                      // four-digit code point.\n                      begin = ++Index;\n                      for (position = Index + 4; Index < position; Index++) {\n                        charCode = source.charCodeAt(Index);\n                        // A valid sequence comprises four hexdigits (case-\n                        // insensitive) that form a single hexadecimal value.\n                        if (!(charCode >= 48 && charCode <= 57 || charCode >= 97 && charCode <= 102 || charCode >= 65 && charCode <= 70)) {\n                          // Invalid Unicode escape sequence.\n                          abort();\n                        }\n                      }\n                      // Revive the escaped character.\n                      value += fromCharCode(\"0x\" + source.slice(begin, Index));\n                      break;\n                    default:\n                      // Invalid escape sequence.\n                      abort();\n                  }\n                } else {\n                  if (charCode == 34) {\n                    // An unescaped double-quote character marks the end of the\n                    // string.\n                    break;\n                  }\n                  charCode = source.charCodeAt(Index);\n                  begin = Index;\n                  // Optimize for the common case where a string is valid.\n                  while (charCode >= 32 && charCode != 92 && charCode != 34) {\n                    charCode = source.charCodeAt(++Index);\n                  }\n                  // Append the string as-is.\n                  value += source.slice(begin, Index);\n                }\n              }\n              if (source.charCodeAt(Index) == 34) {\n                // Advance to the next character and return the revived string.\n                Index++;\n                return value;\n              }\n              // Unterminated string.\n              abort();\n            default:\n              // Parse numbers and literals.\n              begin = Index;\n              // Advance past the negative sign, if one is specified.\n              if (charCode == 45) {\n                isSigned = true;\n                charCode = source.charCodeAt(++Index);\n              }\n              // Parse an integer or floating-point value.\n              if (charCode >= 48 && charCode <= 57) {\n                // Leading zeroes are interpreted as octal literals.\n                if (charCode == 48 && ((charCode = source.charCodeAt(Index + 1)), charCode >= 48 && charCode <= 57)) {\n                  // Illegal octal literal.\n                  abort();\n                }\n                isSigned = false;\n                // Parse the integer component.\n                for (; Index < length && ((charCode = source.charCodeAt(Index)), charCode >= 48 && charCode <= 57); Index++);\n                // Floats cannot contain a leading decimal point; however, this\n                // case is already accounted for by the parser.\n                if (source.charCodeAt(Index) == 46) {\n                  position = ++Index;\n                  // Parse the decimal component.\n                  for (; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++);\n                  if (position == Index) {\n                    // Illegal trailing decimal.\n                    abort();\n                  }\n                  Index = position;\n                }\n                // Parse exponents. The `e` denoting the exponent is\n                // case-insensitive.\n                charCode = source.charCodeAt(Index);\n                if (charCode == 101 || charCode == 69) {\n                  charCode = source.charCodeAt(++Index);\n                  // Skip past the sign following the exponent, if one is\n                  // specified.\n                  if (charCode == 43 || charCode == 45) {\n                    Index++;\n                  }\n                  // Parse the exponential component.\n                  for (position = Index; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++);\n                  if (position == Index) {\n                    // Illegal empty exponent.\n                    abort();\n                  }\n                  Index = position;\n                }\n                // Coerce the parsed value to a JavaScript number.\n                return +source.slice(begin, Index);\n              }\n              // A negative sign may only precede numbers.\n              if (isSigned) {\n                abort();\n              }\n              // `true`, `false`, and `null` literals.\n              if (source.slice(Index, Index + 4) == \"true\") {\n                Index += 4;\n                return true;\n              } else if (source.slice(Index, Index + 5) == \"false\") {\n                Index += 5;\n                return false;\n              } else if (source.slice(Index, Index + 4) == \"null\") {\n                Index += 4;\n                return null;\n              }\n              // Unrecognized token.\n              abort();\n          }\n        }\n        // Return the sentinel `$` character if the parser has reached the end\n        // of the source string.\n        return \"$\";\n      };\n\n      // Internal: Parses a JSON `value` token.\n      var get = function (value) {\n        var results, hasMembers;\n        if (value == \"$\") {\n          // Unexpected end of input.\n          abort();\n        }\n        if (typeof value == \"string\") {\n          if ((charIndexBuggy ? value.charAt(0) : value[0]) == \"@\") {\n            // Remove the sentinel `@` character.\n            return value.slice(1);\n          }\n          // Parse object and array literals.\n          if (value == \"[\") {\n            // Parses a JSON array, returning a new JavaScript array.\n            results = [];\n            for (;; hasMembers || (hasMembers = true)) {\n              value = lex();\n              // A closing square bracket marks the end of the array literal.\n              if (value == \"]\") {\n                break;\n              }\n              // If the array literal contains elements, the current token\n              // should be a comma separating the previous element from the\n              // next.\n              if (hasMembers) {\n                if (value == \",\") {\n                  value = lex();\n                  if (value == \"]\") {\n                    // Unexpected trailing `,` in array literal.\n                    abort();\n                  }\n                } else {\n                  // A `,` must separate each array element.\n                  abort();\n                }\n              }\n              // Elisions and leading commas are not permitted.\n              if (value == \",\") {\n                abort();\n              }\n              results.push(get(value));\n            }\n            return results;\n          } else if (value == \"{\") {\n            // Parses a JSON object, returning a new JavaScript object.\n            results = {};\n            for (;; hasMembers || (hasMembers = true)) {\n              value = lex();\n              // A closing curly brace marks the end of the object literal.\n              if (value == \"}\") {\n                break;\n              }\n              // If the object literal contains members, the current token\n              // should be a comma separator.\n              if (hasMembers) {\n                if (value == \",\") {\n                  value = lex();\n                  if (value == \"}\") {\n                    // Unexpected trailing `,` in object literal.\n                    abort();\n                  }\n                } else {\n                  // A `,` must separate each object member.\n                  abort();\n                }\n              }\n              // Leading commas are not permitted, object property names must be\n              // double-quoted strings, and a `:` must separate each property\n              // name and value.\n              if (value == \",\" || typeof value != \"string\" || (charIndexBuggy ? value.charAt(0) : value[0]) != \"@\" || lex() != \":\") {\n                abort();\n              }\n              results[value.slice(1)] = get(lex());\n            }\n            return results;\n          }\n          // Unexpected token encountered.\n          abort();\n        }\n        return value;\n      };\n\n      // Internal: Updates a traversed object member.\n      var update = function(source, property, callback) {\n        var element = walk(source, property, callback);\n        if (element === undef) {\n          delete source[property];\n        } else {\n          source[property] = element;\n        }\n      };\n\n      // Internal: Recursively traverses a parsed JSON object, invoking the\n      // `callback` function for each value. This is an implementation of the\n      // `Walk(holder, name)` operation defined in ES 5.1 section 15.12.2.\n      var walk = function (source, property, callback) {\n        var value = source[property], length;\n        if (typeof value == \"object\" && value) {\n          // `forEach` can't be used to traverse an array in Opera <= 8.54\n          // because its `Object#hasOwnProperty` implementation returns `false`\n          // for array indices (e.g., `![1, 2, 3].hasOwnProperty(\"0\")`).\n          if (getClass.call(value) == arrayClass) {\n            for (length = value.length; length--;) {\n              update(value, length, callback);\n            }\n          } else {\n            forEach(value, function (property) {\n              update(value, property, callback);\n            });\n          }\n        }\n        return callback.call(source, property, value);\n      };\n\n      // Public: `JSON.parse`. See ES 5.1 section 15.12.2.\n      JSON3.parse = function (source, callback) {\n        var result, value;\n        Index = 0;\n        Source = \"\" + source;\n        result = get(lex());\n        // If a JSON string contains multiple tokens, it is invalid.\n        if (lex() != \"$\") {\n          abort();\n        }\n        // Reset the parser state.\n        Index = Source = null;\n        return callback && getClass.call(callback) == functionClass ? walk((value = {}, value[\"\"] = result, value), \"\", callback) : result;\n      };\n    }\n  }\n\n  // Export for asynchronous module loaders.\n  if (isLoader) {\n    !(__WEBPACK_AMD_DEFINE_RESULT__ = function () {\n      return JSON3;\n    }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  }\n}(this));\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDk4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9qc29uMy9saWIvanNvbjMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohIEpTT04gdjMuMi42IHwgaHR0cDovL2Jlc3RpZWpzLmdpdGh1Yi5pby9qc29uMyB8IENvcHlyaWdodCAyMDEyLTIwMTMsIEtpdCBDYW1icmlkZ2UgfCBodHRwOi8va2l0Lm1pdC1saWNlbnNlLm9yZyAqL1xuOyhmdW5jdGlvbiAod2luZG93KSB7XG4gIC8vIENvbnZlbmllbmNlIGFsaWFzZXMuXG4gIHZhciBnZXRDbGFzcyA9IHt9LnRvU3RyaW5nLCBpc1Byb3BlcnR5LCBmb3JFYWNoLCB1bmRlZjtcblxuICAvLyBEZXRlY3QgdGhlIGBkZWZpbmVgIGZ1bmN0aW9uIGV4cG9zZWQgYnkgYXN5bmNocm9ub3VzIG1vZHVsZSBsb2FkZXJzLiBUaGVcbiAgLy8gc3RyaWN0IGBkZWZpbmVgIGNoZWNrIGlzIG5lY2Vzc2FyeSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGByLmpzYC5cbiAgdmFyIGlzTG9hZGVyID0gdHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQ7XG5cbiAgLy8gRGV0ZWN0IG5hdGl2ZSBpbXBsZW1lbnRhdGlvbnMuXG4gIHZhciBuYXRpdmVKU09OID0gdHlwZW9mIEpTT04gPT0gXCJvYmplY3RcIiAmJiBKU09OO1xuXG4gIC8vIFNldCB1cCB0aGUgSlNPTiAzIG5hbWVzcGFjZSwgcHJlZmVycmluZyB0aGUgQ29tbW9uSlMgYGV4cG9ydHNgIG9iamVjdCBpZlxuICAvLyBhdmFpbGFibGUuXG4gIHZhciBKU09OMyA9IHR5cGVvZiBleHBvcnRzID09IFwib2JqZWN0XCIgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4gIGlmIChKU09OMyAmJiBuYXRpdmVKU09OKSB7XG4gICAgLy8gRXhwbGljaXRseSBkZWxlZ2F0ZSB0byB0aGUgbmF0aXZlIGBzdHJpbmdpZnlgIGFuZCBgcGFyc2VgXG4gICAgLy8gaW1wbGVtZW50YXRpb25zIGluIENvbW1vbkpTIGVudmlyb25tZW50cy5cbiAgICBKU09OMy5zdHJpbmdpZnkgPSBuYXRpdmVKU09OLnN0cmluZ2lmeTtcbiAgICBKU09OMy5wYXJzZSA9IG5hdGl2ZUpTT04ucGFyc2U7XG4gIH0gZWxzZSB7XG4gICAgLy8gRXhwb3J0IGZvciB3ZWIgYnJvd3NlcnMsIEphdmFTY3JpcHQgZW5naW5lcywgYW5kIGFzeW5jaHJvbm91cyBtb2R1bGVcbiAgICAvLyBsb2FkZXJzLCB1c2luZyB0aGUgZ2xvYmFsIGBKU09OYCBvYmplY3QgaWYgYXZhaWxhYmxlLlxuICAgIEpTT04zID0gd2luZG93LkpTT04gPSBuYXRpdmVKU09OIHx8IHt9O1xuICB9XG5cbiAgLy8gVGVzdCB0aGUgYERhdGUjZ2V0VVRDKmAgbWV0aG9kcy4gQmFzZWQgb24gd29yayBieSBAWWFmZmxlLlxuICB2YXIgaXNFeHRlbmRlZCA9IG5ldyBEYXRlKC0zNTA5ODI3MzM0NTczMjkyKTtcbiAgdHJ5IHtcbiAgICAvLyBUaGUgYGdldFVUQ0Z1bGxZZWFyYCwgYE1vbnRoYCwgYW5kIGBEYXRlYCBtZXRob2RzIHJldHVybiBub25zZW5zaWNhbFxuICAgIC8vIHJlc3VsdHMgZm9yIGNlcnRhaW4gZGF0ZXMgaW4gT3BlcmEgPj0gMTAuNTMuXG4gICAgaXNFeHRlbmRlZCA9IGlzRXh0ZW5kZWQuZ2V0VVRDRnVsbFllYXIoKSA9PSAtMTA5MjUyICYmIGlzRXh0ZW5kZWQuZ2V0VVRDTW9udGgoKSA9PT0gMCAmJiBpc0V4dGVuZGVkLmdldFVUQ0RhdGUoKSA9PT0gMSAmJlxuICAgICAgLy8gU2FmYXJpIDwgMi4wLjIgc3RvcmVzIHRoZSBpbnRlcm5hbCBtaWxsaXNlY29uZCB0aW1lIHZhbHVlIGNvcnJlY3RseSxcbiAgICAgIC8vIGJ1dCBjbGlwcyB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBkYXRlIG1ldGhvZHMgdG8gdGhlIHJhbmdlIG9mXG4gICAgICAvLyBzaWduZWQgMzItYml0IGludGVnZXJzIChbLTIgKiogMzEsIDIgKiogMzEgLSAxXSkuXG4gICAgICBpc0V4dGVuZGVkLmdldFVUQ0hvdXJzKCkgPT0gMTAgJiYgaXNFeHRlbmRlZC5nZXRVVENNaW51dGVzKCkgPT0gMzcgJiYgaXNFeHRlbmRlZC5nZXRVVENTZWNvbmRzKCkgPT0gNiAmJiBpc0V4dGVuZGVkLmdldFVUQ01pbGxpc2Vjb25kcygpID09IDcwODtcbiAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7fVxuXG4gIC8vIEludGVybmFsOiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5hdGl2ZSBgSlNPTi5zdHJpbmdpZnlgIGFuZCBgcGFyc2VgXG4gIC8vIGltcGxlbWVudGF0aW9ucyBhcmUgc3BlYy1jb21wbGlhbnQuIEJhc2VkIG9uIHdvcmsgYnkgS2VuIFNueWRlci5cbiAgZnVuY3Rpb24gaGFzKG5hbWUpIHtcbiAgICBpZiAoaGFzW25hbWVdICE9PSB1bmRlZikge1xuICAgICAgLy8gUmV0dXJuIGNhY2hlZCBmZWF0dXJlIHRlc3QgcmVzdWx0LlxuICAgICAgcmV0dXJuIGhhc1tuYW1lXTtcbiAgICB9XG5cbiAgICB2YXIgaXNTdXBwb3J0ZWQ7XG4gICAgaWYgKG5hbWUgPT0gXCJidWctc3RyaW5nLWNoYXItaW5kZXhcIikge1xuICAgICAgLy8gSUUgPD0gNyBkb2Vzbid0IHN1cHBvcnQgYWNjZXNzaW5nIHN0cmluZyBjaGFyYWN0ZXJzIHVzaW5nIHNxdWFyZVxuICAgICAgLy8gYnJhY2tldCBub3RhdGlvbi4gSUUgOCBvbmx5IHN1cHBvcnRzIHRoaXMgZm9yIHByaW1pdGl2ZXMuXG4gICAgICBpc1N1cHBvcnRlZCA9IFwiYVwiWzBdICE9IFwiYVwiO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PSBcImpzb25cIikge1xuICAgICAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgYm90aCBgSlNPTi5zdHJpbmdpZnlgIGFuZCBgSlNPTi5wYXJzZWAgYXJlXG4gICAgICAvLyBzdXBwb3J0ZWQuXG4gICAgICBpc1N1cHBvcnRlZCA9IGhhcyhcImpzb24tc3RyaW5naWZ5XCIpICYmIGhhcyhcImpzb24tcGFyc2VcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB2YWx1ZSwgc2VyaWFsaXplZCA9ICd7XCJhXCI6WzEsdHJ1ZSxmYWxzZSxudWxsLFwiXFxcXHUwMDAwXFxcXGJcXFxcblxcXFxmXFxcXHJcXFxcdFwiXX0nO1xuICAgICAgLy8gVGVzdCBgSlNPTi5zdHJpbmdpZnlgLlxuICAgICAgaWYgKG5hbWUgPT0gXCJqc29uLXN0cmluZ2lmeVwiKSB7XG4gICAgICAgIHZhciBzdHJpbmdpZnkgPSBKU09OMy5zdHJpbmdpZnksIHN0cmluZ2lmeVN1cHBvcnRlZCA9IHR5cGVvZiBzdHJpbmdpZnkgPT0gXCJmdW5jdGlvblwiICYmIGlzRXh0ZW5kZWQ7XG4gICAgICAgIGlmIChzdHJpbmdpZnlTdXBwb3J0ZWQpIHtcbiAgICAgICAgICAvLyBBIHRlc3QgZnVuY3Rpb24gb2JqZWN0IHdpdGggYSBjdXN0b20gYHRvSlNPTmAgbWV0aG9kLlxuICAgICAgICAgICh2YWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgIH0pLnRvSlNPTiA9IHZhbHVlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzdHJpbmdpZnlTdXBwb3J0ZWQgPVxuICAgICAgICAgICAgICAvLyBGaXJlZm94IDMuMWIxIGFuZCBiMiBzZXJpYWxpemUgc3RyaW5nLCBudW1iZXIsIGFuZCBib29sZWFuXG4gICAgICAgICAgICAgIC8vIHByaW1pdGl2ZXMgYXMgb2JqZWN0IGxpdGVyYWxzLlxuICAgICAgICAgICAgICBzdHJpbmdpZnkoMCkgPT09IFwiMFwiICYmXG4gICAgICAgICAgICAgIC8vIEZGIDMuMWIxLCBiMiwgYW5kIEpTT04gMiBzZXJpYWxpemUgd3JhcHBlZCBwcmltaXRpdmVzIGFzIG9iamVjdFxuICAgICAgICAgICAgICAvLyBsaXRlcmFscy5cbiAgICAgICAgICAgICAgc3RyaW5naWZ5KG5ldyBOdW1iZXIoKSkgPT09IFwiMFwiICYmXG4gICAgICAgICAgICAgIHN0cmluZ2lmeShuZXcgU3RyaW5nKCkpID09ICdcIlwiJyAmJlxuICAgICAgICAgICAgICAvLyBGRiAzLjFiMSwgMiB0aHJvdyBhbiBlcnJvciBpZiB0aGUgdmFsdWUgaXMgYG51bGxgLCBgdW5kZWZpbmVkYCwgb3JcbiAgICAgICAgICAgICAgLy8gZG9lcyBub3QgZGVmaW5lIGEgY2Fub25pY2FsIEpTT04gcmVwcmVzZW50YXRpb24gKHRoaXMgYXBwbGllcyB0b1xuICAgICAgICAgICAgICAvLyBvYmplY3RzIHdpdGggYHRvSlNPTmAgcHJvcGVydGllcyBhcyB3ZWxsLCAqdW5sZXNzKiB0aGV5IGFyZSBuZXN0ZWRcbiAgICAgICAgICAgICAgLy8gd2l0aGluIGFuIG9iamVjdCBvciBhcnJheSkuXG4gICAgICAgICAgICAgIHN0cmluZ2lmeShnZXRDbGFzcykgPT09IHVuZGVmICYmXG4gICAgICAgICAgICAgIC8vIElFIDggc2VyaWFsaXplcyBgdW5kZWZpbmVkYCBhcyBgXCJ1bmRlZmluZWRcImAuIFNhZmFyaSA8PSA1LjEuNyBhbmRcbiAgICAgICAgICAgICAgLy8gRkYgMy4xYjMgcGFzcyB0aGlzIHRlc3QuXG4gICAgICAgICAgICAgIHN0cmluZ2lmeSh1bmRlZikgPT09IHVuZGVmICYmXG4gICAgICAgICAgICAgIC8vIFNhZmFyaSA8PSA1LjEuNyBhbmQgRkYgMy4xYjMgdGhyb3cgYEVycm9yYHMgYW5kIGBUeXBlRXJyb3JgcyxcbiAgICAgICAgICAgICAgLy8gcmVzcGVjdGl2ZWx5LCBpZiB0aGUgdmFsdWUgaXMgb21pdHRlZCBlbnRpcmVseS5cbiAgICAgICAgICAgICAgc3RyaW5naWZ5KCkgPT09IHVuZGVmICYmXG4gICAgICAgICAgICAgIC8vIEZGIDMuMWIxLCAyIHRocm93IGFuIGVycm9yIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBub3QgYSBudW1iZXIsXG4gICAgICAgICAgICAgIC8vIHN0cmluZywgYXJyYXksIG9iamVjdCwgQm9vbGVhbiwgb3IgYG51bGxgIGxpdGVyYWwuIFRoaXMgYXBwbGllcyB0b1xuICAgICAgICAgICAgICAvLyBvYmplY3RzIHdpdGggY3VzdG9tIGB0b0pTT05gIG1ldGhvZHMgYXMgd2VsbCwgdW5sZXNzIHRoZXkgYXJlIG5lc3RlZFxuICAgICAgICAgICAgICAvLyBpbnNpZGUgb2JqZWN0IG9yIGFycmF5IGxpdGVyYWxzLiBZVUkgMy4wLjBiMSBpZ25vcmVzIGN1c3RvbSBgdG9KU09OYFxuICAgICAgICAgICAgICAvLyBtZXRob2RzIGVudGlyZWx5LlxuICAgICAgICAgICAgICBzdHJpbmdpZnkodmFsdWUpID09PSBcIjFcIiAmJlxuICAgICAgICAgICAgICBzdHJpbmdpZnkoW3ZhbHVlXSkgPT0gXCJbMV1cIiAmJlxuICAgICAgICAgICAgICAvLyBQcm90b3R5cGUgPD0gMS42LjEgc2VyaWFsaXplcyBgW3VuZGVmaW5lZF1gIGFzIGBcIltdXCJgIGluc3RlYWQgb2ZcbiAgICAgICAgICAgICAgLy8gYFwiW251bGxdXCJgLlxuICAgICAgICAgICAgICBzdHJpbmdpZnkoW3VuZGVmXSkgPT0gXCJbbnVsbF1cIiAmJlxuICAgICAgICAgICAgICAvLyBZVUkgMy4wLjBiMSBmYWlscyB0byBzZXJpYWxpemUgYG51bGxgIGxpdGVyYWxzLlxuICAgICAgICAgICAgICBzdHJpbmdpZnkobnVsbCkgPT0gXCJudWxsXCIgJiZcbiAgICAgICAgICAgICAgLy8gRkYgMy4xYjEsIDIgaGFsdHMgc2VyaWFsaXphdGlvbiBpZiBhbiBhcnJheSBjb250YWlucyBhIGZ1bmN0aW9uOlxuICAgICAgICAgICAgICAvLyBgWzEsIHRydWUsIGdldENsYXNzLCAxXWAgc2VyaWFsaXplcyBhcyBcIlsxLHRydWUsXSxcIi4gRkYgMy4xYjNcbiAgICAgICAgICAgICAgLy8gZWxpZGVzIG5vbi1KU09OIHZhbHVlcyBmcm9tIG9iamVjdHMgYW5kIGFycmF5cywgdW5sZXNzIHRoZXlcbiAgICAgICAgICAgICAgLy8gZGVmaW5lIGN1c3RvbSBgdG9KU09OYCBtZXRob2RzLlxuICAgICAgICAgICAgICBzdHJpbmdpZnkoW3VuZGVmLCBnZXRDbGFzcywgbnVsbF0pID09IFwiW251bGwsbnVsbCxudWxsXVwiICYmXG4gICAgICAgICAgICAgIC8vIFNpbXBsZSBzZXJpYWxpemF0aW9uIHRlc3QuIEZGIDMuMWIxIHVzZXMgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzXG4gICAgICAgICAgICAgIC8vIHdoZXJlIGNoYXJhY3RlciBlc2NhcGUgY29kZXMgYXJlIGV4cGVjdGVkIChlLmcuLCBgXFxiYCA9PiBgXFx1MDAwOGApLlxuICAgICAgICAgICAgICBzdHJpbmdpZnkoeyBcImFcIjogW3ZhbHVlLCB0cnVlLCBmYWxzZSwgbnVsbCwgXCJcXHgwMFxcYlxcblxcZlxcclxcdFwiXSB9KSA9PSBzZXJpYWxpemVkICYmXG4gICAgICAgICAgICAgIC8vIEZGIDMuMWIxIGFuZCBiMiBpZ25vcmUgdGhlIGBmaWx0ZXJgIGFuZCBgd2lkdGhgIGFyZ3VtZW50cy5cbiAgICAgICAgICAgICAgc3RyaW5naWZ5KG51bGwsIHZhbHVlKSA9PT0gXCIxXCIgJiZcbiAgICAgICAgICAgICAgc3RyaW5naWZ5KFsxLCAyXSwgbnVsbCwgMSkgPT0gXCJbXFxuIDEsXFxuIDJcXG5dXCIgJiZcbiAgICAgICAgICAgICAgLy8gSlNPTiAyLCBQcm90b3R5cGUgPD0gMS43LCBhbmQgb2xkZXIgV2ViS2l0IGJ1aWxkcyBpbmNvcnJlY3RseVxuICAgICAgICAgICAgICAvLyBzZXJpYWxpemUgZXh0ZW5kZWQgeWVhcnMuXG4gICAgICAgICAgICAgIHN0cmluZ2lmeShuZXcgRGF0ZSgtOC42NGUxNSkpID09ICdcIi0yNzE4MjEtMDQtMjBUMDA6MDA6MDAuMDAwWlwiJyAmJlxuICAgICAgICAgICAgICAvLyBUaGUgbWlsbGlzZWNvbmRzIGFyZSBvcHRpb25hbCBpbiBFUyA1LCBidXQgcmVxdWlyZWQgaW4gNS4xLlxuICAgICAgICAgICAgICBzdHJpbmdpZnkobmV3IERhdGUoOC42NGUxNSkpID09ICdcIisyNzU3NjAtMDktMTNUMDA6MDA6MDAuMDAwWlwiJyAmJlxuICAgICAgICAgICAgICAvLyBGaXJlZm94IDw9IDExLjAgaW5jb3JyZWN0bHkgc2VyaWFsaXplcyB5ZWFycyBwcmlvciB0byAwIGFzIG5lZ2F0aXZlXG4gICAgICAgICAgICAgIC8vIGZvdXItZGlnaXQgeWVhcnMgaW5zdGVhZCBvZiBzaXgtZGlnaXQgeWVhcnMuIENyZWRpdHM6IEBZYWZmbGUuXG4gICAgICAgICAgICAgIHN0cmluZ2lmeShuZXcgRGF0ZSgtNjIxOTg3NTUyZTUpKSA9PSAnXCItMDAwMDAxLTAxLTAxVDAwOjAwOjAwLjAwMFpcIicgJiZcbiAgICAgICAgICAgICAgLy8gU2FmYXJpIDw9IDUuMS41IGFuZCBPcGVyYSA+PSAxMC41MyBpbmNvcnJlY3RseSBzZXJpYWxpemUgbWlsbGlzZWNvbmRcbiAgICAgICAgICAgICAgLy8gdmFsdWVzIGxlc3MgdGhhbiAxMDAwLiBDcmVkaXRzOiBAWWFmZmxlLlxuICAgICAgICAgICAgICBzdHJpbmdpZnkobmV3IERhdGUoLTEpKSA9PSAnXCIxOTY5LTEyLTMxVDIzOjU5OjU5Ljk5OVpcIic7XG4gICAgICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICBzdHJpbmdpZnlTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaXNTdXBwb3J0ZWQgPSBzdHJpbmdpZnlTdXBwb3J0ZWQ7XG4gICAgICB9XG4gICAgICAvLyBUZXN0IGBKU09OLnBhcnNlYC5cbiAgICAgIGlmIChuYW1lID09IFwianNvbi1wYXJzZVwiKSB7XG4gICAgICAgIHZhciBwYXJzZSA9IEpTT04zLnBhcnNlO1xuICAgICAgICBpZiAodHlwZW9mIHBhcnNlID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBGRiAzLjFiMSwgYjIgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgYSBiYXJlIGxpdGVyYWwgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAvLyBDb25mb3JtaW5nIGltcGxlbWVudGF0aW9ucyBzaG91bGQgYWxzbyBjb2VyY2UgdGhlIGluaXRpYWwgYXJndW1lbnQgdG9cbiAgICAgICAgICAgIC8vIGEgc3RyaW5nIHByaW9yIHRvIHBhcnNpbmcuXG4gICAgICAgICAgICBpZiAocGFyc2UoXCIwXCIpID09PSAwICYmICFwYXJzZShmYWxzZSkpIHtcbiAgICAgICAgICAgICAgLy8gU2ltcGxlIHBhcnNpbmcgdGVzdC5cbiAgICAgICAgICAgICAgdmFsdWUgPSBwYXJzZShzZXJpYWxpemVkKTtcbiAgICAgICAgICAgICAgdmFyIHBhcnNlU3VwcG9ydGVkID0gdmFsdWVbXCJhXCJdLmxlbmd0aCA9PSA1ICYmIHZhbHVlW1wiYVwiXVswXSA9PT0gMTtcbiAgICAgICAgICAgICAgaWYgKHBhcnNlU3VwcG9ydGVkKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIC8vIFNhZmFyaSA8PSA1LjEuMiBhbmQgRkYgMy4xYjEgYWxsb3cgdW5lc2NhcGVkIHRhYnMgaW4gc3RyaW5ncy5cbiAgICAgICAgICAgICAgICAgIHBhcnNlU3VwcG9ydGVkID0gIXBhcnNlKCdcIlxcdFwiJyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7fVxuICAgICAgICAgICAgICAgIGlmIChwYXJzZVN1cHBvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRkYgNC4wIGFuZCA0LjAuMSBhbGxvdyBsZWFkaW5nIGArYCBzaWducyBhbmQgbGVhZGluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBkZWNpbWFsIHBvaW50cy4gRkYgNC4wLCA0LjAuMSwgYW5kIElFIDktMTAgYWxzbyBhbGxvd1xuICAgICAgICAgICAgICAgICAgICAvLyBjZXJ0YWluIG9jdGFsIGxpdGVyYWxzLlxuICAgICAgICAgICAgICAgICAgICBwYXJzZVN1cHBvcnRlZCA9IHBhcnNlKFwiMDFcIikgIT09IDE7XG4gICAgICAgICAgICAgICAgICB9IGNhdGNoIChleGNlcHRpb24pIHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXJzZVN1cHBvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRkYgNC4wLCA0LjAuMSwgYW5kIFJoaW5vIDEuN1IzLVI0IGFsbG93IHRyYWlsaW5nIGRlY2ltYWxcbiAgICAgICAgICAgICAgICAgICAgLy8gcG9pbnRzLiBUaGVzZSBlbnZpcm9ubWVudHMsIGFsb25nIHdpdGggRkYgMy4xYjEgYW5kIDIsXG4gICAgICAgICAgICAgICAgICAgIC8vIGFsc28gYWxsb3cgdHJhaWxpbmcgY29tbWFzIGluIEpTT04gb2JqZWN0cyBhbmQgYXJyYXlzLlxuICAgICAgICAgICAgICAgICAgICBwYXJzZVN1cHBvcnRlZCA9IHBhcnNlKFwiMS5cIikgIT09IDE7XG4gICAgICAgICAgICAgICAgICB9IGNhdGNoIChleGNlcHRpb24pIHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICBwYXJzZVN1cHBvcnRlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpc1N1cHBvcnRlZCA9IHBhcnNlU3VwcG9ydGVkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFzW25hbWVdID0gISFpc1N1cHBvcnRlZDtcbiAgfVxuXG4gIGlmICghaGFzKFwianNvblwiKSkge1xuICAgIC8vIENvbW1vbiBgW1tDbGFzc11dYCBuYW1lIGFsaWFzZXMuXG4gICAgdmFyIGZ1bmN0aW9uQ2xhc3MgPSBcIltvYmplY3QgRnVuY3Rpb25dXCI7XG4gICAgdmFyIGRhdGVDbGFzcyA9IFwiW29iamVjdCBEYXRlXVwiO1xuICAgIHZhciBudW1iZXJDbGFzcyA9IFwiW29iamVjdCBOdW1iZXJdXCI7XG4gICAgdmFyIHN0cmluZ0NsYXNzID0gXCJbb2JqZWN0IFN0cmluZ11cIjtcbiAgICB2YXIgYXJyYXlDbGFzcyA9IFwiW29iamVjdCBBcnJheV1cIjtcbiAgICB2YXIgYm9vbGVhbkNsYXNzID0gXCJbb2JqZWN0IEJvb2xlYW5dXCI7XG5cbiAgICAvLyBEZXRlY3QgaW5jb21wbGV0ZSBzdXBwb3J0IGZvciBhY2Nlc3Npbmcgc3RyaW5nIGNoYXJhY3RlcnMgYnkgaW5kZXguXG4gICAgdmFyIGNoYXJJbmRleEJ1Z2d5ID0gaGFzKFwiYnVnLXN0cmluZy1jaGFyLWluZGV4XCIpO1xuXG4gICAgLy8gRGVmaW5lIGFkZGl0aW9uYWwgdXRpbGl0eSBtZXRob2RzIGlmIHRoZSBgRGF0ZWAgbWV0aG9kcyBhcmUgYnVnZ3kuXG4gICAgaWYgKCFpc0V4dGVuZGVkKSB7XG4gICAgICB2YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuICAgICAgLy8gQSBtYXBwaW5nIGJldHdlZW4gdGhlIG1vbnRocyBvZiB0aGUgeWVhciBhbmQgdGhlIG51bWJlciBvZiBkYXlzIGJldHdlZW5cbiAgICAgIC8vIEphbnVhcnkgMXN0IGFuZCB0aGUgZmlyc3Qgb2YgdGhlIHJlc3BlY3RpdmUgbW9udGguXG4gICAgICB2YXIgTW9udGhzID0gWzAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0XTtcbiAgICAgIC8vIEludGVybmFsOiBDYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIHRoZSBVbml4IGVwb2NoIGFuZCB0aGVcbiAgICAgIC8vIGZpcnN0IGRheSBvZiB0aGUgZ2l2ZW4gbW9udGguXG4gICAgICB2YXIgZ2V0RGF5ID0gZnVuY3Rpb24gKHllYXIsIG1vbnRoKSB7XG4gICAgICAgIHJldHVybiBNb250aHNbbW9udGhdICsgMzY1ICogKHllYXIgLSAxOTcwKSArIGZsb29yKCh5ZWFyIC0gMTk2OSArIChtb250aCA9ICsobW9udGggPiAxKSkpIC8gNCkgLSBmbG9vcigoeWVhciAtIDE5MDEgKyBtb250aCkgLyAxMDApICsgZmxvb3IoKHllYXIgLSAxNjAxICsgbW9udGgpIC8gNDAwKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSW50ZXJuYWw6IERldGVybWluZXMgaWYgYSBwcm9wZXJ0eSBpcyBhIGRpcmVjdCBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW5cbiAgICAvLyBvYmplY3QuIERlbGVnYXRlcyB0byB0aGUgbmF0aXZlIGBPYmplY3QjaGFzT3duUHJvcGVydHlgIG1ldGhvZC5cbiAgICBpZiAoIShpc1Byb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHkpKSB7XG4gICAgICBpc1Byb3BlcnR5ID0gZnVuY3Rpb24gKHByb3BlcnR5KSB7XG4gICAgICAgIHZhciBtZW1iZXJzID0ge30sIGNvbnN0cnVjdG9yO1xuICAgICAgICBpZiAoKG1lbWJlcnMuX19wcm90b19fID0gbnVsbCwgbWVtYmVycy5fX3Byb3RvX18gPSB7XG4gICAgICAgICAgLy8gVGhlICpwcm90byogcHJvcGVydHkgY2Fubm90IGJlIHNldCBtdWx0aXBsZSB0aW1lcyBpbiByZWNlbnRcbiAgICAgICAgICAvLyB2ZXJzaW9ucyBvZiBGaXJlZm94IGFuZCBTZWFNb25rZXkuXG4gICAgICAgICAgXCJ0b1N0cmluZ1wiOiAxXG4gICAgICAgIH0sIG1lbWJlcnMpLnRvU3RyaW5nICE9IGdldENsYXNzKSB7XG4gICAgICAgICAgLy8gU2FmYXJpIDw9IDIuMC4zIGRvZXNuJ3QgaW1wbGVtZW50IGBPYmplY3QjaGFzT3duUHJvcGVydHlgLCBidXRcbiAgICAgICAgICAvLyBzdXBwb3J0cyB0aGUgbXV0YWJsZSAqcHJvdG8qIHByb3BlcnR5LlxuICAgICAgICAgIGlzUHJvcGVydHkgPSBmdW5jdGlvbiAocHJvcGVydHkpIHtcbiAgICAgICAgICAgIC8vIENhcHR1cmUgYW5kIGJyZWFrIHRoZSBvYmplY3QncyBwcm90b3R5cGUgY2hhaW4gKHNlZSBzZWN0aW9uIDguNi4yXG4gICAgICAgICAgICAvLyBvZiB0aGUgRVMgNS4xIHNwZWMpLiBUaGUgcGFyZW50aGVzaXplZCBleHByZXNzaW9uIHByZXZlbnRzIGFuXG4gICAgICAgICAgICAvLyB1bnNhZmUgdHJhbnNmb3JtYXRpb24gYnkgdGhlIENsb3N1cmUgQ29tcGlsZXIuXG4gICAgICAgICAgICB2YXIgb3JpZ2luYWwgPSB0aGlzLl9fcHJvdG9fXywgcmVzdWx0ID0gcHJvcGVydHkgaW4gKHRoaXMuX19wcm90b19fID0gbnVsbCwgdGhpcyk7XG4gICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBwcm90b3R5cGUgY2hhaW4uXG4gICAgICAgICAgICB0aGlzLl9fcHJvdG9fXyA9IG9yaWdpbmFsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENhcHR1cmUgYSByZWZlcmVuY2UgdG8gdGhlIHRvcC1sZXZlbCBgT2JqZWN0YCBjb25zdHJ1Y3Rvci5cbiAgICAgICAgICBjb25zdHJ1Y3RvciA9IG1lbWJlcnMuY29uc3RydWN0b3I7XG4gICAgICAgICAgLy8gVXNlIHRoZSBgY29uc3RydWN0b3JgIHByb3BlcnR5IHRvIHNpbXVsYXRlIGBPYmplY3QjaGFzT3duUHJvcGVydHlgIGluXG4gICAgICAgICAgLy8gb3RoZXIgZW52aXJvbm1lbnRzLlxuICAgICAgICAgIGlzUHJvcGVydHkgPSBmdW5jdGlvbiAocHJvcGVydHkpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSAodGhpcy5jb25zdHJ1Y3RvciB8fCBjb25zdHJ1Y3RvcikucHJvdG90eXBlO1xuICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5IGluIHRoaXMgJiYgIShwcm9wZXJ0eSBpbiBwYXJlbnQgJiYgdGhpc1twcm9wZXJ0eV0gPT09IHBhcmVudFtwcm9wZXJ0eV0pO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgbWVtYmVycyA9IG51bGw7XG4gICAgICAgIHJldHVybiBpc1Byb3BlcnR5LmNhbGwodGhpcywgcHJvcGVydHkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJbnRlcm5hbDogQSBzZXQgb2YgcHJpbWl0aXZlIHR5cGVzIHVzZWQgYnkgYGlzSG9zdFR5cGVgLlxuICAgIHZhciBQcmltaXRpdmVUeXBlcyA9IHtcbiAgICAgICdib29sZWFuJzogMSxcbiAgICAgICdudW1iZXInOiAxLFxuICAgICAgJ3N0cmluZyc6IDEsXG4gICAgICAndW5kZWZpbmVkJzogMVxuICAgIH07XG5cbiAgICAvLyBJbnRlcm5hbDogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGBwcm9wZXJ0eWAgdmFsdWUgaXMgYVxuICAgIC8vIG5vbi1wcmltaXRpdmUuXG4gICAgdmFyIGlzSG9zdFR5cGUgPSBmdW5jdGlvbiAob2JqZWN0LCBwcm9wZXJ0eSkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2Ygb2JqZWN0W3Byb3BlcnR5XTtcbiAgICAgIHJldHVybiB0eXBlID09ICdvYmplY3QnID8gISFvYmplY3RbcHJvcGVydHldIDogIVByaW1pdGl2ZVR5cGVzW3R5cGVdO1xuICAgIH07XG5cbiAgICAvLyBJbnRlcm5hbDogTm9ybWFsaXplcyB0aGUgYGZvci4uLmluYCBpdGVyYXRpb24gYWxnb3JpdGhtIGFjcm9zc1xuICAgIC8vIGVudmlyb25tZW50cy4gRWFjaCBlbnVtZXJhdGVkIGtleSBpcyB5aWVsZGVkIHRvIGEgYGNhbGxiYWNrYCBmdW5jdGlvbi5cbiAgICBmb3JFYWNoID0gZnVuY3Rpb24gKG9iamVjdCwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBzaXplID0gMCwgUHJvcGVydGllcywgbWVtYmVycywgcHJvcGVydHk7XG5cbiAgICAgIC8vIFRlc3RzIGZvciBidWdzIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50J3MgYGZvci4uLmluYCBhbGdvcml0aG0uIFRoZVxuICAgICAgLy8gYHZhbHVlT2ZgIHByb3BlcnR5IGluaGVyaXRzIHRoZSBub24tZW51bWVyYWJsZSBmbGFnIGZyb21cbiAgICAgIC8vIGBPYmplY3QucHJvdG90eXBlYCBpbiBvbGRlciB2ZXJzaW9ucyBvZiBJRSwgTmV0c2NhcGUsIGFuZCBNb3ppbGxhLlxuICAgICAgKFByb3BlcnRpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudmFsdWVPZiA9IDA7XG4gICAgICB9KS5wcm90b3R5cGUudmFsdWVPZiA9IDA7XG5cbiAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgYFByb3BlcnRpZXNgIGNsYXNzLlxuICAgICAgbWVtYmVycyA9IG5ldyBQcm9wZXJ0aWVzKCk7XG4gICAgICBmb3IgKHByb3BlcnR5IGluIG1lbWJlcnMpIHtcbiAgICAgICAgLy8gSWdub3JlIGFsbCBwcm9wZXJ0aWVzIGluaGVyaXRlZCBmcm9tIGBPYmplY3QucHJvdG90eXBlYC5cbiAgICAgICAgaWYgKGlzUHJvcGVydHkuY2FsbChtZW1iZXJzLCBwcm9wZXJ0eSkpIHtcbiAgICAgICAgICBzaXplKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFByb3BlcnRpZXMgPSBtZW1iZXJzID0gbnVsbDtcblxuICAgICAgLy8gTm9ybWFsaXplIHRoZSBpdGVyYXRpb24gYWxnb3JpdGhtLlxuICAgICAgaWYgKCFzaXplKSB7XG4gICAgICAgIC8vIEEgbGlzdCBvZiBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGluaGVyaXRlZCBmcm9tIGBPYmplY3QucHJvdG90eXBlYC5cbiAgICAgICAgbWVtYmVycyA9IFtcInZhbHVlT2ZcIiwgXCJ0b1N0cmluZ1wiLCBcInRvTG9jYWxlU3RyaW5nXCIsIFwicHJvcGVydHlJc0VudW1lcmFibGVcIiwgXCJpc1Byb3RvdHlwZU9mXCIsIFwiaGFzT3duUHJvcGVydHlcIiwgXCJjb25zdHJ1Y3RvclwiXTtcbiAgICAgICAgLy8gSUUgPD0gOCwgTW96aWxsYSAxLjAsIGFuZCBOZXRzY2FwZSA2LjIgaWdub3JlIHNoYWRvd2VkIG5vbi1lbnVtZXJhYmxlXG4gICAgICAgIC8vIHByb3BlcnRpZXMuXG4gICAgICAgIGZvckVhY2ggPSBmdW5jdGlvbiAob2JqZWN0LCBjYWxsYmFjaykge1xuICAgICAgICAgIHZhciBpc0Z1bmN0aW9uID0gZ2V0Q2xhc3MuY2FsbChvYmplY3QpID09IGZ1bmN0aW9uQ2xhc3MsIHByb3BlcnR5LCBsZW5ndGg7XG4gICAgICAgICAgdmFyIGhhc1Byb3BlcnR5ID0gIWlzRnVuY3Rpb24gJiYgdHlwZW9mIG9iamVjdC5jb25zdHJ1Y3RvciAhPSAnZnVuY3Rpb24nICYmIGlzSG9zdFR5cGUob2JqZWN0LCAnaGFzT3duUHJvcGVydHknKSA/IG9iamVjdC5oYXNPd25Qcm9wZXJ0eSA6IGlzUHJvcGVydHk7XG4gICAgICAgICAgZm9yIChwcm9wZXJ0eSBpbiBvYmplY3QpIHtcbiAgICAgICAgICAgIC8vIEdlY2tvIDw9IDEuMCBlbnVtZXJhdGVzIHRoZSBgcHJvdG90eXBlYCBwcm9wZXJ0eSBvZiBmdW5jdGlvbnMgdW5kZXJcbiAgICAgICAgICAgIC8vIGNlcnRhaW4gY29uZGl0aW9uczsgSUUgZG9lcyBub3QuXG4gICAgICAgICAgICBpZiAoIShpc0Z1bmN0aW9uICYmIHByb3BlcnR5ID09IFwicHJvdG90eXBlXCIpICYmIGhhc1Byb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2socHJvcGVydHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBNYW51YWxseSBpbnZva2UgdGhlIGNhbGxiYWNrIGZvciBlYWNoIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5LlxuICAgICAgICAgIGZvciAobGVuZ3RoID0gbWVtYmVycy5sZW5ndGg7IHByb3BlcnR5ID0gbWVtYmVyc1stLWxlbmd0aF07IGhhc1Byb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSkgJiYgY2FsbGJhY2socHJvcGVydHkpKTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoc2l6ZSA9PSAyKSB7XG4gICAgICAgIC8vIFNhZmFyaSA8PSAyLjAuNCBlbnVtZXJhdGVzIHNoYWRvd2VkIHByb3BlcnRpZXMgdHdpY2UuXG4gICAgICAgIGZvckVhY2ggPSBmdW5jdGlvbiAob2JqZWN0LCBjYWxsYmFjaykge1xuICAgICAgICAgIC8vIENyZWF0ZSBhIHNldCBvZiBpdGVyYXRlZCBwcm9wZXJ0aWVzLlxuICAgICAgICAgIHZhciBtZW1iZXJzID0ge30sIGlzRnVuY3Rpb24gPSBnZXRDbGFzcy5jYWxsKG9iamVjdCkgPT0gZnVuY3Rpb25DbGFzcywgcHJvcGVydHk7XG4gICAgICAgICAgZm9yIChwcm9wZXJ0eSBpbiBvYmplY3QpIHtcbiAgICAgICAgICAgIC8vIFN0b3JlIGVhY2ggcHJvcGVydHkgbmFtZSB0byBwcmV2ZW50IGRvdWJsZSBlbnVtZXJhdGlvbi4gVGhlXG4gICAgICAgICAgICAvLyBgcHJvdG90eXBlYCBwcm9wZXJ0eSBvZiBmdW5jdGlvbnMgaXMgbm90IGVudW1lcmF0ZWQgZHVlIHRvIGNyb3NzLVxuICAgICAgICAgICAgLy8gZW52aXJvbm1lbnQgaW5jb25zaXN0ZW5jaWVzLlxuICAgICAgICAgICAgaWYgKCEoaXNGdW5jdGlvbiAmJiBwcm9wZXJ0eSA9PSBcInByb3RvdHlwZVwiKSAmJiAhaXNQcm9wZXJ0eS5jYWxsKG1lbWJlcnMsIHByb3BlcnR5KSAmJiAobWVtYmVyc1twcm9wZXJ0eV0gPSAxKSAmJiBpc1Byb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2socHJvcGVydHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vIGJ1Z3MgZGV0ZWN0ZWQ7IHVzZSB0aGUgc3RhbmRhcmQgYGZvci4uLmluYCBhbGdvcml0aG0uXG4gICAgICAgIGZvckVhY2ggPSBmdW5jdGlvbiAob2JqZWN0LCBjYWxsYmFjaykge1xuICAgICAgICAgIHZhciBpc0Z1bmN0aW9uID0gZ2V0Q2xhc3MuY2FsbChvYmplY3QpID09IGZ1bmN0aW9uQ2xhc3MsIHByb3BlcnR5LCBpc0NvbnN0cnVjdG9yO1xuICAgICAgICAgIGZvciAocHJvcGVydHkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoIShpc0Z1bmN0aW9uICYmIHByb3BlcnR5ID09IFwicHJvdG90eXBlXCIpICYmIGlzUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KSAmJiAhKGlzQ29uc3RydWN0b3IgPSBwcm9wZXJ0eSA9PT0gXCJjb25zdHJ1Y3RvclwiKSkge1xuICAgICAgICAgICAgICBjYWxsYmFjayhwcm9wZXJ0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIE1hbnVhbGx5IGludm9rZSB0aGUgY2FsbGJhY2sgZm9yIHRoZSBgY29uc3RydWN0b3JgIHByb3BlcnR5IGR1ZSB0b1xuICAgICAgICAgIC8vIGNyb3NzLWVudmlyb25tZW50IGluY29uc2lzdGVuY2llcy5cbiAgICAgICAgICBpZiAoaXNDb25zdHJ1Y3RvciB8fCBpc1Byb3BlcnR5LmNhbGwob2JqZWN0LCAocHJvcGVydHkgPSBcImNvbnN0cnVjdG9yXCIpKSkge1xuICAgICAgICAgICAgY2FsbGJhY2socHJvcGVydHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmb3JFYWNoKG9iamVjdCwgY2FsbGJhY2spO1xuICAgIH07XG5cbiAgICAvLyBQdWJsaWM6IFNlcmlhbGl6ZXMgYSBKYXZhU2NyaXB0IGB2YWx1ZWAgYXMgYSBKU09OIHN0cmluZy4gVGhlIG9wdGlvbmFsXG4gICAgLy8gYGZpbHRlcmAgYXJndW1lbnQgbWF5IHNwZWNpZnkgZWl0aGVyIGEgZnVuY3Rpb24gdGhhdCBhbHRlcnMgaG93IG9iamVjdCBhbmRcbiAgICAvLyBhcnJheSBtZW1iZXJzIGFyZSBzZXJpYWxpemVkLCBvciBhbiBhcnJheSBvZiBzdHJpbmdzIGFuZCBudW1iZXJzIHRoYXRcbiAgICAvLyBpbmRpY2F0ZXMgd2hpY2ggcHJvcGVydGllcyBzaG91bGQgYmUgc2VyaWFsaXplZC4gVGhlIG9wdGlvbmFsIGB3aWR0aGBcbiAgICAvLyBhcmd1bWVudCBtYXkgYmUgZWl0aGVyIGEgc3RyaW5nIG9yIG51bWJlciB0aGF0IHNwZWNpZmllcyB0aGUgaW5kZW50YXRpb25cbiAgICAvLyBsZXZlbCBvZiB0aGUgb3V0cHV0LlxuICAgIGlmICghaGFzKFwianNvbi1zdHJpbmdpZnlcIikpIHtcbiAgICAgIC8vIEludGVybmFsOiBBIG1hcCBvZiBjb250cm9sIGNoYXJhY3RlcnMgYW5kIHRoZWlyIGVzY2FwZWQgZXF1aXZhbGVudHMuXG4gICAgICB2YXIgRXNjYXBlcyA9IHtcbiAgICAgICAgOTI6IFwiXFxcXFxcXFxcIixcbiAgICAgICAgMzQ6ICdcXFxcXCInLFxuICAgICAgICA4OiBcIlxcXFxiXCIsXG4gICAgICAgIDEyOiBcIlxcXFxmXCIsXG4gICAgICAgIDEwOiBcIlxcXFxuXCIsXG4gICAgICAgIDEzOiBcIlxcXFxyXCIsXG4gICAgICAgIDk6IFwiXFxcXHRcIlxuICAgICAgfTtcblxuICAgICAgLy8gSW50ZXJuYWw6IENvbnZlcnRzIGB2YWx1ZWAgaW50byBhIHplcm8tcGFkZGVkIHN0cmluZyBzdWNoIHRoYXQgaXRzXG4gICAgICAvLyBsZW5ndGggaXMgYXQgbGVhc3QgZXF1YWwgdG8gYHdpZHRoYC4gVGhlIGB3aWR0aGAgbXVzdCBiZSA8PSA2LlxuICAgICAgdmFyIGxlYWRpbmdaZXJvZXMgPSBcIjAwMDAwMFwiO1xuICAgICAgdmFyIHRvUGFkZGVkU3RyaW5nID0gZnVuY3Rpb24gKHdpZHRoLCB2YWx1ZSkge1xuICAgICAgICAvLyBUaGUgYHx8IDBgIGV4cHJlc3Npb24gaXMgbmVjZXNzYXJ5IHRvIHdvcmsgYXJvdW5kIGEgYnVnIGluXG4gICAgICAgIC8vIE9wZXJhIDw9IDcuNTR1MiB3aGVyZSBgMCA9PSAtMGAsIGJ1dCBgU3RyaW5nKC0wKSAhPT0gXCIwXCJgLlxuICAgICAgICByZXR1cm4gKGxlYWRpbmdaZXJvZXMgKyAodmFsdWUgfHwgMCkpLnNsaWNlKC13aWR0aCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBJbnRlcm5hbDogRG91YmxlLXF1b3RlcyBhIHN0cmluZyBgdmFsdWVgLCByZXBsYWNpbmcgYWxsIEFTQ0lJIGNvbnRyb2xcbiAgICAgIC8vIGNoYXJhY3RlcnMgKGNoYXJhY3RlcnMgd2l0aCBjb2RlIHVuaXQgdmFsdWVzIGJldHdlZW4gMCBhbmQgMzEpIHdpdGhcbiAgICAgIC8vIHRoZWlyIGVzY2FwZWQgZXF1aXZhbGVudHMuIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlXG4gICAgICAvLyBgUXVvdGUodmFsdWUpYCBvcGVyYXRpb24gZGVmaW5lZCBpbiBFUyA1LjEgc2VjdGlvbiAxNS4xMi4zLlxuICAgICAgdmFyIHVuaWNvZGVQcmVmaXggPSBcIlxcXFx1MDBcIjtcbiAgICAgIHZhciBxdW90ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gJ1wiJywgaW5kZXggPSAwLCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgsIGlzTGFyZ2UgPSBsZW5ndGggPiAxMCAmJiBjaGFySW5kZXhCdWdneSwgc3ltYm9scztcbiAgICAgICAgaWYgKGlzTGFyZ2UpIHtcbiAgICAgICAgICBzeW1ib2xzID0gdmFsdWUuc3BsaXQoXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgdmFyIGNoYXJDb2RlID0gdmFsdWUuY2hhckNvZGVBdChpbmRleCk7XG4gICAgICAgICAgLy8gSWYgdGhlIGNoYXJhY3RlciBpcyBhIGNvbnRyb2wgY2hhcmFjdGVyLCBhcHBlbmQgaXRzIFVuaWNvZGUgb3JcbiAgICAgICAgICAvLyBzaG9ydGhhbmQgZXNjYXBlIHNlcXVlbmNlOyBvdGhlcndpc2UsIGFwcGVuZCB0aGUgY2hhcmFjdGVyIGFzLWlzLlxuICAgICAgICAgIHN3aXRjaCAoY2hhckNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgODogY2FzZSA5OiBjYXNlIDEwOiBjYXNlIDEyOiBjYXNlIDEzOiBjYXNlIDM0OiBjYXNlIDkyOlxuICAgICAgICAgICAgICByZXN1bHQgKz0gRXNjYXBlc1tjaGFyQ29kZV07XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgaWYgKGNoYXJDb2RlIDwgMzIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gdW5pY29kZVByZWZpeCArIHRvUGFkZGVkU3RyaW5nKDIsIGNoYXJDb2RlLnRvU3RyaW5nKDE2KSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVzdWx0ICs9IGlzTGFyZ2UgPyBzeW1ib2xzW2luZGV4XSA6IGNoYXJJbmRleEJ1Z2d5ID8gdmFsdWUuY2hhckF0KGluZGV4KSA6IHZhbHVlW2luZGV4XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdCArICdcIic7XG4gICAgICB9O1xuXG4gICAgICAvLyBJbnRlcm5hbDogUmVjdXJzaXZlbHkgc2VyaWFsaXplcyBhbiBvYmplY3QuIEltcGxlbWVudHMgdGhlXG4gICAgICAvLyBgU3RyKGtleSwgaG9sZGVyKWAsIGBKTyh2YWx1ZSlgLCBhbmQgYEpBKHZhbHVlKWAgb3BlcmF0aW9ucy5cbiAgICAgIHZhciBzZXJpYWxpemUgPSBmdW5jdGlvbiAocHJvcGVydHksIG9iamVjdCwgY2FsbGJhY2ssIHByb3BlcnRpZXMsIHdoaXRlc3BhY2UsIGluZGVudGF0aW9uLCBzdGFjaykge1xuICAgICAgICB2YXIgdmFsdWUsIGNsYXNzTmFtZSwgeWVhciwgbW9udGgsIGRhdGUsIHRpbWUsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXNlY29uZHMsIHJlc3VsdHMsIGVsZW1lbnQsIGluZGV4LCBsZW5ndGgsIHByZWZpeCwgcmVzdWx0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIE5lY2Vzc2FyeSBmb3IgaG9zdCBvYmplY3Qgc3VwcG9ydC5cbiAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtwcm9wZXJ0eV07XG4gICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikge31cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmIHZhbHVlKSB7XG4gICAgICAgICAgY2xhc3NOYW1lID0gZ2V0Q2xhc3MuY2FsbCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBkYXRlQ2xhc3MgJiYgIWlzUHJvcGVydHkuY2FsbCh2YWx1ZSwgXCJ0b0pTT05cIikpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA+IC0xIC8gMCAmJiB2YWx1ZSA8IDEgLyAwKSB7XG4gICAgICAgICAgICAgIC8vIERhdGVzIGFyZSBzZXJpYWxpemVkIGFjY29yZGluZyB0byB0aGUgYERhdGUjdG9KU09OYCBtZXRob2RcbiAgICAgICAgICAgICAgLy8gc3BlY2lmaWVkIGluIEVTIDUuMSBzZWN0aW9uIDE1LjkuNS40NC4gU2VlIHNlY3Rpb24gMTUuOS4xLjE1XG4gICAgICAgICAgICAgIC8vIGZvciB0aGUgSVNPIDg2MDEgZGF0ZSB0aW1lIHN0cmluZyBmb3JtYXQuXG4gICAgICAgICAgICAgIGlmIChnZXREYXkpIHtcbiAgICAgICAgICAgICAgICAvLyBNYW51YWxseSBjb21wdXRlIHRoZSB5ZWFyLCBtb250aCwgZGF0ZSwgaG91cnMsIG1pbnV0ZXMsXG4gICAgICAgICAgICAgICAgLy8gc2Vjb25kcywgYW5kIG1pbGxpc2Vjb25kcyBpZiB0aGUgYGdldFVUQypgIG1ldGhvZHMgYXJlXG4gICAgICAgICAgICAgICAgLy8gYnVnZ3kuIEFkYXB0ZWQgZnJvbSBAWWFmZmxlJ3MgYGRhdGUtc2hpbWAgcHJvamVjdC5cbiAgICAgICAgICAgICAgICBkYXRlID0gZmxvb3IodmFsdWUgLyA4NjRlNSk7XG4gICAgICAgICAgICAgICAgZm9yICh5ZWFyID0gZmxvb3IoZGF0ZSAvIDM2NS4yNDI1KSArIDE5NzAgLSAxOyBnZXREYXkoeWVhciArIDEsIDApIDw9IGRhdGU7IHllYXIrKyk7XG4gICAgICAgICAgICAgICAgZm9yIChtb250aCA9IGZsb29yKChkYXRlIC0gZ2V0RGF5KHllYXIsIDApKSAvIDMwLjQyKTsgZ2V0RGF5KHllYXIsIG1vbnRoICsgMSkgPD0gZGF0ZTsgbW9udGgrKyk7XG4gICAgICAgICAgICAgICAgZGF0ZSA9IDEgKyBkYXRlIC0gZ2V0RGF5KHllYXIsIG1vbnRoKTtcbiAgICAgICAgICAgICAgICAvLyBUaGUgYHRpbWVgIHZhbHVlIHNwZWNpZmllcyB0aGUgdGltZSB3aXRoaW4gdGhlIGRheSAoc2VlIEVTXG4gICAgICAgICAgICAgICAgLy8gNS4xIHNlY3Rpb24gMTUuOS4xLjIpLiBUaGUgZm9ybXVsYSBgKEEgJSBCICsgQikgJSBCYCBpcyB1c2VkXG4gICAgICAgICAgICAgICAgLy8gdG8gY29tcHV0ZSBgQSBtb2R1bG8gQmAsIGFzIHRoZSBgJWAgb3BlcmF0b3IgZG9lcyBub3RcbiAgICAgICAgICAgICAgICAvLyBjb3JyZXNwb25kIHRvIHRoZSBgbW9kdWxvYCBvcGVyYXRpb24gZm9yIG5lZ2F0aXZlIG51bWJlcnMuXG4gICAgICAgICAgICAgICAgdGltZSA9ICh2YWx1ZSAlIDg2NGU1ICsgODY0ZTUpICUgODY0ZTU7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgbWlsbGlzZWNvbmRzIGFyZSBvYnRhaW5lZCBieVxuICAgICAgICAgICAgICAgIC8vIGRlY29tcG9zaW5nIHRoZSB0aW1lIHdpdGhpbiB0aGUgZGF5LiBTZWUgc2VjdGlvbiAxNS45LjEuMTAuXG4gICAgICAgICAgICAgICAgaG91cnMgPSBmbG9vcih0aW1lIC8gMzZlNSkgJSAyNDtcbiAgICAgICAgICAgICAgICBtaW51dGVzID0gZmxvb3IodGltZSAvIDZlNCkgJSA2MDtcbiAgICAgICAgICAgICAgICBzZWNvbmRzID0gZmxvb3IodGltZSAvIDFlMykgJSA2MDtcbiAgICAgICAgICAgICAgICBtaWxsaXNlY29uZHMgPSB0aW1lICUgMWUzO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHllYXIgPSB2YWx1ZS5nZXRVVENGdWxsWWVhcigpO1xuICAgICAgICAgICAgICAgIG1vbnRoID0gdmFsdWUuZ2V0VVRDTW9udGgoKTtcbiAgICAgICAgICAgICAgICBkYXRlID0gdmFsdWUuZ2V0VVRDRGF0ZSgpO1xuICAgICAgICAgICAgICAgIGhvdXJzID0gdmFsdWUuZ2V0VVRDSG91cnMoKTtcbiAgICAgICAgICAgICAgICBtaW51dGVzID0gdmFsdWUuZ2V0VVRDTWludXRlcygpO1xuICAgICAgICAgICAgICAgIHNlY29uZHMgPSB2YWx1ZS5nZXRVVENTZWNvbmRzKCk7XG4gICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzID0gdmFsdWUuZ2V0VVRDTWlsbGlzZWNvbmRzKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gU2VyaWFsaXplIGV4dGVuZGVkIHllYXJzIGNvcnJlY3RseS5cbiAgICAgICAgICAgICAgdmFsdWUgPSAoeWVhciA8PSAwIHx8IHllYXIgPj0gMWU0ID8gKHllYXIgPCAwID8gXCItXCIgOiBcIitcIikgKyB0b1BhZGRlZFN0cmluZyg2LCB5ZWFyIDwgMCA/IC15ZWFyIDogeWVhcikgOiB0b1BhZGRlZFN0cmluZyg0LCB5ZWFyKSkgK1xuICAgICAgICAgICAgICAgIFwiLVwiICsgdG9QYWRkZWRTdHJpbmcoMiwgbW9udGggKyAxKSArIFwiLVwiICsgdG9QYWRkZWRTdHJpbmcoMiwgZGF0ZSkgK1xuICAgICAgICAgICAgICAgIC8vIE1vbnRocywgZGF0ZXMsIGhvdXJzLCBtaW51dGVzLCBhbmQgc2Vjb25kcyBzaG91bGQgaGF2ZSB0d29cbiAgICAgICAgICAgICAgICAvLyBkaWdpdHM7IG1pbGxpc2Vjb25kcyBzaG91bGQgaGF2ZSB0aHJlZS5cbiAgICAgICAgICAgICAgICBcIlRcIiArIHRvUGFkZGVkU3RyaW5nKDIsIGhvdXJzKSArIFwiOlwiICsgdG9QYWRkZWRTdHJpbmcoMiwgbWludXRlcykgKyBcIjpcIiArIHRvUGFkZGVkU3RyaW5nKDIsIHNlY29uZHMpICtcbiAgICAgICAgICAgICAgICAvLyBNaWxsaXNlY29uZHMgYXJlIG9wdGlvbmFsIGluIEVTIDUuMCwgYnV0IHJlcXVpcmVkIGluIDUuMS5cbiAgICAgICAgICAgICAgICBcIi5cIiArIHRvUGFkZGVkU3RyaW5nKDMsIG1pbGxpc2Vjb25kcykgKyBcIlpcIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZS50b0pTT04gPT0gXCJmdW5jdGlvblwiICYmICgoY2xhc3NOYW1lICE9IG51bWJlckNsYXNzICYmIGNsYXNzTmFtZSAhPSBzdHJpbmdDbGFzcyAmJiBjbGFzc05hbWUgIT0gYXJyYXlDbGFzcykgfHwgaXNQcm9wZXJ0eS5jYWxsKHZhbHVlLCBcInRvSlNPTlwiKSkpIHtcbiAgICAgICAgICAgIC8vIFByb3RvdHlwZSA8PSAxLjYuMSBhZGRzIG5vbi1zdGFuZGFyZCBgdG9KU09OYCBtZXRob2RzIHRvIHRoZVxuICAgICAgICAgICAgLy8gYE51bWJlcmAsIGBTdHJpbmdgLCBgRGF0ZWAsIGFuZCBgQXJyYXlgIHByb3RvdHlwZXMuIEpTT04gM1xuICAgICAgICAgICAgLy8gaWdub3JlcyBhbGwgYHRvSlNPTmAgbWV0aG9kcyBvbiB0aGVzZSBvYmplY3RzIHVubGVzcyB0aGV5IGFyZVxuICAgICAgICAgICAgLy8gZGVmaW5lZCBkaXJlY3RseSBvbiBhbiBpbnN0YW5jZS5cbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9KU09OKHByb3BlcnR5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgLy8gSWYgYSByZXBsYWNlbWVudCBmdW5jdGlvbiB3YXMgcHJvdmlkZWQsIGNhbGwgaXQgdG8gb2J0YWluIHRoZSB2YWx1ZVxuICAgICAgICAgIC8vIGZvciBzZXJpYWxpemF0aW9uLlxuICAgICAgICAgIHZhbHVlID0gY2FsbGJhY2suY2FsbChvYmplY3QsIHByb3BlcnR5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIFwibnVsbFwiO1xuICAgICAgICB9XG4gICAgICAgIGNsYXNzTmFtZSA9IGdldENsYXNzLmNhbGwodmFsdWUpO1xuICAgICAgICBpZiAoY2xhc3NOYW1lID09IGJvb2xlYW5DbGFzcykge1xuICAgICAgICAgIC8vIEJvb2xlYW5zIGFyZSByZXByZXNlbnRlZCBsaXRlcmFsbHkuXG4gICAgICAgICAgcmV0dXJuIFwiXCIgKyB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChjbGFzc05hbWUgPT0gbnVtYmVyQ2xhc3MpIHtcbiAgICAgICAgICAvLyBKU09OIG51bWJlcnMgbXVzdCBiZSBmaW5pdGUuIGBJbmZpbml0eWAgYW5kIGBOYU5gIGFyZSBzZXJpYWxpemVkIGFzXG4gICAgICAgICAgLy8gYFwibnVsbFwiYC5cbiAgICAgICAgICByZXR1cm4gdmFsdWUgPiAtMSAvIDAgJiYgdmFsdWUgPCAxIC8gMCA/IFwiXCIgKyB2YWx1ZSA6IFwibnVsbFwiO1xuICAgICAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZSA9PSBzdHJpbmdDbGFzcykge1xuICAgICAgICAgIC8vIFN0cmluZ3MgYXJlIGRvdWJsZS1xdW90ZWQgYW5kIGVzY2FwZWQuXG4gICAgICAgICAgcmV0dXJuIHF1b3RlKFwiXCIgKyB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgc2VyaWFsaXplIG9iamVjdHMgYW5kIGFycmF5cy5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgZm9yIGN5Y2xpYyBzdHJ1Y3R1cmVzLiBUaGlzIGlzIGEgbGluZWFyIHNlYXJjaDsgcGVyZm9ybWFuY2VcbiAgICAgICAgICAvLyBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgdW5pcXVlIG5lc3RlZCBvYmplY3RzLlxuICAgICAgICAgIGZvciAobGVuZ3RoID0gc3RhY2subGVuZ3RoOyBsZW5ndGgtLTspIHtcbiAgICAgICAgICAgIGlmIChzdGFja1tsZW5ndGhdID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAvLyBDeWNsaWMgc3RydWN0dXJlcyBjYW5ub3QgYmUgc2VyaWFsaXplZCBieSBgSlNPTi5zdHJpbmdpZnlgLlxuICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQWRkIHRoZSBvYmplY3QgdG8gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCBvYmplY3RzLlxuICAgICAgICAgIHN0YWNrLnB1c2godmFsdWUpO1xuICAgICAgICAgIHJlc3VsdHMgPSBbXTtcbiAgICAgICAgICAvLyBTYXZlIHRoZSBjdXJyZW50IGluZGVudGF0aW9uIGxldmVsIGFuZCBpbmRlbnQgb25lIGFkZGl0aW9uYWwgbGV2ZWwuXG4gICAgICAgICAgcHJlZml4ID0gaW5kZW50YXRpb247XG4gICAgICAgICAgaW5kZW50YXRpb24gKz0gd2hpdGVzcGFjZTtcbiAgICAgICAgICBpZiAoY2xhc3NOYW1lID09IGFycmF5Q2xhc3MpIHtcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHNlcmlhbGl6ZSBhcnJheSBlbGVtZW50cy5cbiAgICAgICAgICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQgPSBzZXJpYWxpemUoaW5kZXgsIHZhbHVlLCBjYWxsYmFjaywgcHJvcGVydGllcywgd2hpdGVzcGFjZSwgaW5kZW50YXRpb24sIHN0YWNrKTtcbiAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKGVsZW1lbnQgPT09IHVuZGVmID8gXCJudWxsXCIgOiBlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdHMubGVuZ3RoID8gKHdoaXRlc3BhY2UgPyBcIltcXG5cIiArIGluZGVudGF0aW9uICsgcmVzdWx0cy5qb2luKFwiLFxcblwiICsgaW5kZW50YXRpb24pICsgXCJcXG5cIiArIHByZWZpeCArIFwiXVwiIDogKFwiW1wiICsgcmVzdWx0cy5qb2luKFwiLFwiKSArIFwiXVwiKSkgOiBcIltdXCI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHNlcmlhbGl6ZSBvYmplY3QgbWVtYmVycy4gTWVtYmVycyBhcmUgc2VsZWN0ZWQgZnJvbVxuICAgICAgICAgICAgLy8gZWl0aGVyIGEgdXNlci1zcGVjaWZpZWQgbGlzdCBvZiBwcm9wZXJ0eSBuYW1lcywgb3IgdGhlIG9iamVjdFxuICAgICAgICAgICAgLy8gaXRzZWxmLlxuICAgICAgICAgICAgZm9yRWFjaChwcm9wZXJ0aWVzIHx8IHZhbHVlLCBmdW5jdGlvbiAocHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBzZXJpYWxpemUocHJvcGVydHksIHZhbHVlLCBjYWxsYmFjaywgcHJvcGVydGllcywgd2hpdGVzcGFjZSwgaW5kZW50YXRpb24sIHN0YWNrKTtcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT09IHVuZGVmKSB7XG4gICAgICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIEVTIDUuMSBzZWN0aW9uIDE1LjEyLjM6IFwiSWYgYGdhcGAge3doaXRlc3BhY2V9XG4gICAgICAgICAgICAgICAgLy8gaXMgbm90IHRoZSBlbXB0eSBzdHJpbmcsIGxldCBgbWVtYmVyYCB7cXVvdGUocHJvcGVydHkpICsgXCI6XCJ9XG4gICAgICAgICAgICAgICAgLy8gYmUgdGhlIGNvbmNhdGVuYXRpb24gb2YgYG1lbWJlcmAgYW5kIHRoZSBgc3BhY2VgIGNoYXJhY3Rlci5cIlxuICAgICAgICAgICAgICAgIC8vIFRoZSBcImBzcGFjZWAgY2hhcmFjdGVyXCIgcmVmZXJzIHRvIHRoZSBsaXRlcmFsIHNwYWNlXG4gICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVyLCBub3QgdGhlIGBzcGFjZWAge3dpZHRofSBhcmd1bWVudCBwcm92aWRlZCB0b1xuICAgICAgICAgICAgICAgIC8vIGBKU09OLnN0cmluZ2lmeWAuXG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHF1b3RlKHByb3BlcnR5KSArIFwiOlwiICsgKHdoaXRlc3BhY2UgPyBcIiBcIiA6IFwiXCIpICsgZWxlbWVudCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0cy5sZW5ndGggPyAod2hpdGVzcGFjZSA/IFwie1xcblwiICsgaW5kZW50YXRpb24gKyByZXN1bHRzLmpvaW4oXCIsXFxuXCIgKyBpbmRlbnRhdGlvbikgKyBcIlxcblwiICsgcHJlZml4ICsgXCJ9XCIgOiAoXCJ7XCIgKyByZXN1bHRzLmpvaW4oXCIsXCIpICsgXCJ9XCIpKSA6IFwie31cIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUmVtb3ZlIHRoZSBvYmplY3QgZnJvbSB0aGUgdHJhdmVyc2VkIG9iamVjdCBzdGFjay5cbiAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBQdWJsaWM6IGBKU09OLnN0cmluZ2lmeWAuIFNlZSBFUyA1LjEgc2VjdGlvbiAxNS4xMi4zLlxuICAgICAgSlNPTjMuc3RyaW5naWZ5ID0gZnVuY3Rpb24gKHNvdXJjZSwgZmlsdGVyLCB3aWR0aCkge1xuICAgICAgICB2YXIgd2hpdGVzcGFjZSwgY2FsbGJhY2ssIHByb3BlcnRpZXMsIGNsYXNzTmFtZTtcbiAgICAgICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiBmaWx0ZXIgPT0gXCJvYmplY3RcIiAmJiBmaWx0ZXIpIHtcbiAgICAgICAgICBpZiAoKGNsYXNzTmFtZSA9IGdldENsYXNzLmNhbGwoZmlsdGVyKSkgPT0gZnVuY3Rpb25DbGFzcykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBmaWx0ZXI7XG4gICAgICAgICAgfSBlbHNlIGlmIChjbGFzc05hbWUgPT0gYXJyYXlDbGFzcykge1xuICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgcHJvcGVydHkgbmFtZXMgYXJyYXkgaW50byBhIG1ha2VzaGlmdCBzZXQuXG4gICAgICAgICAgICBwcm9wZXJ0aWVzID0ge307XG4gICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IDAsIGxlbmd0aCA9IGZpbHRlci5sZW5ndGgsIHZhbHVlOyBpbmRleCA8IGxlbmd0aDsgdmFsdWUgPSBmaWx0ZXJbaW5kZXgrK10sICgoY2xhc3NOYW1lID0gZ2V0Q2xhc3MuY2FsbCh2YWx1ZSkpLCBjbGFzc05hbWUgPT0gc3RyaW5nQ2xhc3MgfHwgY2xhc3NOYW1lID09IG51bWJlckNsYXNzKSAmJiAocHJvcGVydGllc1t2YWx1ZV0gPSAxKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh3aWR0aCkge1xuICAgICAgICAgIGlmICgoY2xhc3NOYW1lID0gZ2V0Q2xhc3MuY2FsbCh3aWR0aCkpID09IG51bWJlckNsYXNzKSB7XG4gICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSBgd2lkdGhgIHRvIGFuIGludGVnZXIgYW5kIGNyZWF0ZSBhIHN0cmluZyBjb250YWluaW5nXG4gICAgICAgICAgICAvLyBgd2lkdGhgIG51bWJlciBvZiBzcGFjZSBjaGFyYWN0ZXJzLlxuICAgICAgICAgICAgaWYgKCh3aWR0aCAtPSB3aWR0aCAlIDEpID4gMCkge1xuICAgICAgICAgICAgICBmb3IgKHdoaXRlc3BhY2UgPSBcIlwiLCB3aWR0aCA+IDEwICYmICh3aWR0aCA9IDEwKTsgd2hpdGVzcGFjZS5sZW5ndGggPCB3aWR0aDsgd2hpdGVzcGFjZSArPSBcIiBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChjbGFzc05hbWUgPT0gc3RyaW5nQ2xhc3MpIHtcbiAgICAgICAgICAgIHdoaXRlc3BhY2UgPSB3aWR0aC5sZW5ndGggPD0gMTAgPyB3aWR0aCA6IHdpZHRoLnNsaWNlKDAsIDEwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3BlcmEgPD0gNy41NHUyIGRpc2NhcmRzIHRoZSB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGVtcHR5IHN0cmluZyBrZXlzXG4gICAgICAgIC8vIChgXCJcImApIG9ubHkgaWYgdGhleSBhcmUgdXNlZCBkaXJlY3RseSB3aXRoaW4gYW4gb2JqZWN0IG1lbWJlciBsaXN0XG4gICAgICAgIC8vIChlLmcuLCBgIShcIlwiIGluIHsgXCJcIjogMX0pYCkuXG4gICAgICAgIHJldHVybiBzZXJpYWxpemUoXCJcIiwgKHZhbHVlID0ge30sIHZhbHVlW1wiXCJdID0gc291cmNlLCB2YWx1ZSksIGNhbGxiYWNrLCBwcm9wZXJ0aWVzLCB3aGl0ZXNwYWNlLCBcIlwiLCBbXSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFB1YmxpYzogUGFyc2VzIGEgSlNPTiBzb3VyY2Ugc3RyaW5nLlxuICAgIGlmICghaGFzKFwianNvbi1wYXJzZVwiKSkge1xuICAgICAgdmFyIGZyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG5cbiAgICAgIC8vIEludGVybmFsOiBBIG1hcCBvZiBlc2NhcGVkIGNvbnRyb2wgY2hhcmFjdGVycyBhbmQgdGhlaXIgdW5lc2NhcGVkXG4gICAgICAvLyBlcXVpdmFsZW50cy5cbiAgICAgIHZhciBVbmVzY2FwZXMgPSB7XG4gICAgICAgIDkyOiBcIlxcXFxcIixcbiAgICAgICAgMzQ6ICdcIicsXG4gICAgICAgIDQ3OiBcIi9cIixcbiAgICAgICAgOTg6IFwiXFxiXCIsXG4gICAgICAgIDExNjogXCJcXHRcIixcbiAgICAgICAgMTEwOiBcIlxcblwiLFxuICAgICAgICAxMDI6IFwiXFxmXCIsXG4gICAgICAgIDExNDogXCJcXHJcIlxuICAgICAgfTtcblxuICAgICAgLy8gSW50ZXJuYWw6IFN0b3JlcyB0aGUgcGFyc2VyIHN0YXRlLlxuICAgICAgdmFyIEluZGV4LCBTb3VyY2U7XG5cbiAgICAgIC8vIEludGVybmFsOiBSZXNldHMgdGhlIHBhcnNlciBzdGF0ZSBhbmQgdGhyb3dzIGEgYFN5bnRheEVycm9yYC5cbiAgICAgIHZhciBhYm9ydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBJbmRleCA9IFNvdXJjZSA9IG51bGw7XG4gICAgICAgIHRocm93IFN5bnRheEVycm9yKCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBJbnRlcm5hbDogUmV0dXJucyB0aGUgbmV4dCB0b2tlbiwgb3IgYFwiJFwiYCBpZiB0aGUgcGFyc2VyIGhhcyByZWFjaGVkXG4gICAgICAvLyB0aGUgZW5kIG9mIHRoZSBzb3VyY2Ugc3RyaW5nLiBBIHRva2VuIG1heSBiZSBhIHN0cmluZywgbnVtYmVyLCBgbnVsbGBcbiAgICAgIC8vIGxpdGVyYWwsIG9yIEJvb2xlYW4gbGl0ZXJhbC5cbiAgICAgIHZhciBsZXggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBTb3VyY2UsIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgsIHZhbHVlLCBiZWdpbiwgcG9zaXRpb24sIGlzU2lnbmVkLCBjaGFyQ29kZTtcbiAgICAgICAgd2hpbGUgKEluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgY2hhckNvZGUgPSBzb3VyY2UuY2hhckNvZGVBdChJbmRleCk7XG4gICAgICAgICAgc3dpdGNoIChjaGFyQ29kZSkge1xuICAgICAgICAgICAgY2FzZSA5OiBjYXNlIDEwOiBjYXNlIDEzOiBjYXNlIDMyOlxuICAgICAgICAgICAgICAvLyBTa2lwIHdoaXRlc3BhY2UgdG9rZW5zLCBpbmNsdWRpbmcgdGFicywgY2FycmlhZ2UgcmV0dXJucywgbGluZVxuICAgICAgICAgICAgICAvLyBmZWVkcywgYW5kIHNwYWNlIGNoYXJhY3RlcnMuXG4gICAgICAgICAgICAgIEluZGV4Kys7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxMjM6IGNhc2UgMTI1OiBjYXNlIDkxOiBjYXNlIDkzOiBjYXNlIDU4OiBjYXNlIDQ0OlxuICAgICAgICAgICAgICAvLyBQYXJzZSBhIHB1bmN0dWF0b3IgdG9rZW4gKGB7YCwgYH1gLCBgW2AsIGBdYCwgYDpgLCBvciBgLGApIGF0XG4gICAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IHBvc2l0aW9uLlxuICAgICAgICAgICAgICB2YWx1ZSA9IGNoYXJJbmRleEJ1Z2d5ID8gc291cmNlLmNoYXJBdChJbmRleCkgOiBzb3VyY2VbSW5kZXhdO1xuICAgICAgICAgICAgICBJbmRleCsrO1xuICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICBjYXNlIDM0OlxuICAgICAgICAgICAgICAvLyBgXCJgIGRlbGltaXRzIGEgSlNPTiBzdHJpbmc7IGFkdmFuY2UgdG8gdGhlIG5leHQgY2hhcmFjdGVyIGFuZFxuICAgICAgICAgICAgICAvLyBiZWdpbiBwYXJzaW5nIHRoZSBzdHJpbmcuIFN0cmluZyB0b2tlbnMgYXJlIHByZWZpeGVkIHdpdGggdGhlXG4gICAgICAgICAgICAgIC8vIHNlbnRpbmVsIGBAYCBjaGFyYWN0ZXIgdG8gZGlzdGluZ3Vpc2ggdGhlbSBmcm9tIHB1bmN0dWF0b3JzIGFuZFxuICAgICAgICAgICAgICAvLyBlbmQtb2Ytc3RyaW5nIHRva2Vucy5cbiAgICAgICAgICAgICAgZm9yICh2YWx1ZSA9IFwiQFwiLCBJbmRleCsrOyBJbmRleCA8IGxlbmd0aDspIHtcbiAgICAgICAgICAgICAgICBjaGFyQ29kZSA9IHNvdXJjZS5jaGFyQ29kZUF0KEluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAoY2hhckNvZGUgPCAzMikge1xuICAgICAgICAgICAgICAgICAgLy8gVW5lc2NhcGVkIEFTQ0lJIGNvbnRyb2wgY2hhcmFjdGVycyAodGhvc2Ugd2l0aCBhIGNvZGUgdW5pdFxuICAgICAgICAgICAgICAgICAgLy8gbGVzcyB0aGFuIHRoZSBzcGFjZSBjaGFyYWN0ZXIpIGFyZSBub3QgcGVybWl0dGVkLlxuICAgICAgICAgICAgICAgICAgYWJvcnQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXJDb2RlID09IDkyKSB7XG4gICAgICAgICAgICAgICAgICAvLyBBIHJldmVyc2Ugc29saWR1cyAoYFxcYCkgbWFya3MgdGhlIGJlZ2lubmluZyBvZiBhbiBlc2NhcGVkXG4gICAgICAgICAgICAgICAgICAvLyBjb250cm9sIGNoYXJhY3RlciAoaW5jbHVkaW5nIGBcImAsIGBcXGAsIGFuZCBgL2ApIG9yIFVuaWNvZGVcbiAgICAgICAgICAgICAgICAgIC8vIGVzY2FwZSBzZXF1ZW5jZS5cbiAgICAgICAgICAgICAgICAgIGNoYXJDb2RlID0gc291cmNlLmNoYXJDb2RlQXQoKytJbmRleCk7XG4gICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoYXJDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTI6IGNhc2UgMzQ6IGNhc2UgNDc6IGNhc2UgOTg6IGNhc2UgMTE2OiBjYXNlIDExMDogY2FzZSAxMDI6IGNhc2UgMTE0OlxuICAgICAgICAgICAgICAgICAgICAgIC8vIFJldml2ZSBlc2NhcGVkIGNvbnRyb2wgY2hhcmFjdGVycy5cbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSBVbmVzY2FwZXNbY2hhckNvZGVdO1xuICAgICAgICAgICAgICAgICAgICAgIEluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTE3OlxuICAgICAgICAgICAgICAgICAgICAgIC8vIGBcXHVgIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgYSBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZS5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBBZHZhbmNlIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYW5kIHZhbGlkYXRlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdXItZGlnaXQgY29kZSBwb2ludC5cbiAgICAgICAgICAgICAgICAgICAgICBiZWdpbiA9ICsrSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChwb3NpdGlvbiA9IEluZGV4ICsgNDsgSW5kZXggPCBwb3NpdGlvbjsgSW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhckNvZGUgPSBzb3VyY2UuY2hhckNvZGVBdChJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHZhbGlkIHNlcXVlbmNlIGNvbXByaXNlcyBmb3VyIGhleGRpZ2l0cyAoY2FzZS1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2Vuc2l0aXZlKSB0aGF0IGZvcm0gYSBzaW5nbGUgaGV4YWRlY2ltYWwgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShjaGFyQ29kZSA+PSA0OCAmJiBjaGFyQ29kZSA8PSA1NyB8fCBjaGFyQ29kZSA+PSA5NyAmJiBjaGFyQ29kZSA8PSAxMDIgfHwgY2hhckNvZGUgPj0gNjUgJiYgY2hhckNvZGUgPD0gNzApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludmFsaWQgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFJldml2ZSB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gZnJvbUNoYXJDb2RlKFwiMHhcIiArIHNvdXJjZS5zbGljZShiZWdpbiwgSW5kZXgpKTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZS5cbiAgICAgICAgICAgICAgICAgICAgICBhYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpZiAoY2hhckNvZGUgPT0gMzQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQW4gdW5lc2NhcGVkIGRvdWJsZS1xdW90ZSBjaGFyYWN0ZXIgbWFya3MgdGhlIGVuZCBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RyaW5nLlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNoYXJDb2RlID0gc291cmNlLmNoYXJDb2RlQXQoSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgYmVnaW4gPSBJbmRleDtcbiAgICAgICAgICAgICAgICAgIC8vIE9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgYSBzdHJpbmcgaXMgdmFsaWQuXG4gICAgICAgICAgICAgICAgICB3aGlsZSAoY2hhckNvZGUgPj0gMzIgJiYgY2hhckNvZGUgIT0gOTIgJiYgY2hhckNvZGUgIT0gMzQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhckNvZGUgPSBzb3VyY2UuY2hhckNvZGVBdCgrK0luZGV4KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZCB0aGUgc3RyaW5nIGFzLWlzLlxuICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gc291cmNlLnNsaWNlKGJlZ2luLCBJbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzb3VyY2UuY2hhckNvZGVBdChJbmRleCkgPT0gMzQpIHtcbiAgICAgICAgICAgICAgICAvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IGNoYXJhY3RlciBhbmQgcmV0dXJuIHRoZSByZXZpdmVkIHN0cmluZy5cbiAgICAgICAgICAgICAgICBJbmRleCsrO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBVbnRlcm1pbmF0ZWQgc3RyaW5nLlxuICAgICAgICAgICAgICBhYm9ydCgpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgLy8gUGFyc2UgbnVtYmVycyBhbmQgbGl0ZXJhbHMuXG4gICAgICAgICAgICAgIGJlZ2luID0gSW5kZXg7XG4gICAgICAgICAgICAgIC8vIEFkdmFuY2UgcGFzdCB0aGUgbmVnYXRpdmUgc2lnbiwgaWYgb25lIGlzIHNwZWNpZmllZC5cbiAgICAgICAgICAgICAgaWYgKGNoYXJDb2RlID09IDQ1KSB7XG4gICAgICAgICAgICAgICAgaXNTaWduZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNoYXJDb2RlID0gc291cmNlLmNoYXJDb2RlQXQoKytJbmRleCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gUGFyc2UgYW4gaW50ZWdlciBvciBmbG9hdGluZy1wb2ludCB2YWx1ZS5cbiAgICAgICAgICAgICAgaWYgKGNoYXJDb2RlID49IDQ4ICYmIGNoYXJDb2RlIDw9IDU3KSB7XG4gICAgICAgICAgICAgICAgLy8gTGVhZGluZyB6ZXJvZXMgYXJlIGludGVycHJldGVkIGFzIG9jdGFsIGxpdGVyYWxzLlxuICAgICAgICAgICAgICAgIGlmIChjaGFyQ29kZSA9PSA0OCAmJiAoKGNoYXJDb2RlID0gc291cmNlLmNoYXJDb2RlQXQoSW5kZXggKyAxKSksIGNoYXJDb2RlID49IDQ4ICYmIGNoYXJDb2RlIDw9IDU3KSkge1xuICAgICAgICAgICAgICAgICAgLy8gSWxsZWdhbCBvY3RhbCBsaXRlcmFsLlxuICAgICAgICAgICAgICAgICAgYWJvcnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaXNTaWduZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAvLyBQYXJzZSB0aGUgaW50ZWdlciBjb21wb25lbnQuXG4gICAgICAgICAgICAgICAgZm9yICg7IEluZGV4IDwgbGVuZ3RoICYmICgoY2hhckNvZGUgPSBzb3VyY2UuY2hhckNvZGVBdChJbmRleCkpLCBjaGFyQ29kZSA+PSA0OCAmJiBjaGFyQ29kZSA8PSA1Nyk7IEluZGV4KyspO1xuICAgICAgICAgICAgICAgIC8vIEZsb2F0cyBjYW5ub3QgY29udGFpbiBhIGxlYWRpbmcgZGVjaW1hbCBwb2ludDsgaG93ZXZlciwgdGhpc1xuICAgICAgICAgICAgICAgIC8vIGNhc2UgaXMgYWxyZWFkeSBhY2NvdW50ZWQgZm9yIGJ5IHRoZSBwYXJzZXIuXG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5jaGFyQ29kZUF0KEluZGV4KSA9PSA0Nikge1xuICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSArK0luZGV4O1xuICAgICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGRlY2ltYWwgY29tcG9uZW50LlxuICAgICAgICAgICAgICAgICAgZm9yICg7IHBvc2l0aW9uIDwgbGVuZ3RoICYmICgoY2hhckNvZGUgPSBzb3VyY2UuY2hhckNvZGVBdChwb3NpdGlvbikpLCBjaGFyQ29kZSA+PSA0OCAmJiBjaGFyQ29kZSA8PSA1Nyk7IHBvc2l0aW9uKyspO1xuICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09IEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElsbGVnYWwgdHJhaWxpbmcgZGVjaW1hbC5cbiAgICAgICAgICAgICAgICAgICAgYWJvcnQoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEluZGV4ID0gcG9zaXRpb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFBhcnNlIGV4cG9uZW50cy4gVGhlIGBlYCBkZW5vdGluZyB0aGUgZXhwb25lbnQgaXNcbiAgICAgICAgICAgICAgICAvLyBjYXNlLWluc2Vuc2l0aXZlLlxuICAgICAgICAgICAgICAgIGNoYXJDb2RlID0gc291cmNlLmNoYXJDb2RlQXQoSW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmIChjaGFyQ29kZSA9PSAxMDEgfHwgY2hhckNvZGUgPT0gNjkpIHtcbiAgICAgICAgICAgICAgICAgIGNoYXJDb2RlID0gc291cmNlLmNoYXJDb2RlQXQoKytJbmRleCk7XG4gICAgICAgICAgICAgICAgICAvLyBTa2lwIHBhc3QgdGhlIHNpZ24gZm9sbG93aW5nIHRoZSBleHBvbmVudCwgaWYgb25lIGlzXG4gICAgICAgICAgICAgICAgICAvLyBzcGVjaWZpZWQuXG4gICAgICAgICAgICAgICAgICBpZiAoY2hhckNvZGUgPT0gNDMgfHwgY2hhckNvZGUgPT0gNDUpIHtcbiAgICAgICAgICAgICAgICAgICAgSW5kZXgrKztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBleHBvbmVudGlhbCBjb21wb25lbnQuXG4gICAgICAgICAgICAgICAgICBmb3IgKHBvc2l0aW9uID0gSW5kZXg7IHBvc2l0aW9uIDwgbGVuZ3RoICYmICgoY2hhckNvZGUgPSBzb3VyY2UuY2hhckNvZGVBdChwb3NpdGlvbikpLCBjaGFyQ29kZSA+PSA0OCAmJiBjaGFyQ29kZSA8PSA1Nyk7IHBvc2l0aW9uKyspO1xuICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09IEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElsbGVnYWwgZW1wdHkgZXhwb25lbnQuXG4gICAgICAgICAgICAgICAgICAgIGFib3J0KCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBJbmRleCA9IHBvc2l0aW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBDb2VyY2UgdGhlIHBhcnNlZCB2YWx1ZSB0byBhIEphdmFTY3JpcHQgbnVtYmVyLlxuICAgICAgICAgICAgICAgIHJldHVybiArc291cmNlLnNsaWNlKGJlZ2luLCBJbmRleCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gQSBuZWdhdGl2ZSBzaWduIG1heSBvbmx5IHByZWNlZGUgbnVtYmVycy5cbiAgICAgICAgICAgICAgaWYgKGlzU2lnbmVkKSB7XG4gICAgICAgICAgICAgICAgYWJvcnQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBgdHJ1ZWAsIGBmYWxzZWAsIGFuZCBgbnVsbGAgbGl0ZXJhbHMuXG4gICAgICAgICAgICAgIGlmIChzb3VyY2Uuc2xpY2UoSW5kZXgsIEluZGV4ICsgNCkgPT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgICAgICBJbmRleCArPSA0O1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZS5zbGljZShJbmRleCwgSW5kZXggKyA1KSA9PSBcImZhbHNlXCIpIHtcbiAgICAgICAgICAgICAgICBJbmRleCArPSA1O1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2Uuc2xpY2UoSW5kZXgsIEluZGV4ICsgNCkgPT0gXCJudWxsXCIpIHtcbiAgICAgICAgICAgICAgICBJbmRleCArPSA0O1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFVucmVjb2duaXplZCB0b2tlbi5cbiAgICAgICAgICAgICAgYWJvcnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmV0dXJuIHRoZSBzZW50aW5lbCBgJGAgY2hhcmFjdGVyIGlmIHRoZSBwYXJzZXIgaGFzIHJlYWNoZWQgdGhlIGVuZFxuICAgICAgICAvLyBvZiB0aGUgc291cmNlIHN0cmluZy5cbiAgICAgICAgcmV0dXJuIFwiJFwiO1xuICAgICAgfTtcblxuICAgICAgLy8gSW50ZXJuYWw6IFBhcnNlcyBhIEpTT04gYHZhbHVlYCB0b2tlbi5cbiAgICAgIHZhciBnZXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdHMsIGhhc01lbWJlcnM7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBcIiRcIikge1xuICAgICAgICAgIC8vIFVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0LlxuICAgICAgICAgIGFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgaWYgKChjaGFySW5kZXhCdWdneSA/IHZhbHVlLmNoYXJBdCgwKSA6IHZhbHVlWzBdKSA9PSBcIkBcIikge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBzZW50aW5lbCBgQGAgY2hhcmFjdGVyLlxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnNsaWNlKDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBQYXJzZSBvYmplY3QgYW5kIGFycmF5IGxpdGVyYWxzLlxuICAgICAgICAgIGlmICh2YWx1ZSA9PSBcIltcIikge1xuICAgICAgICAgICAgLy8gUGFyc2VzIGEgSlNPTiBhcnJheSwgcmV0dXJuaW5nIGEgbmV3IEphdmFTY3JpcHQgYXJyYXkuXG4gICAgICAgICAgICByZXN1bHRzID0gW107XG4gICAgICAgICAgICBmb3IgKDs7IGhhc01lbWJlcnMgfHwgKGhhc01lbWJlcnMgPSB0cnVlKSkge1xuICAgICAgICAgICAgICB2YWx1ZSA9IGxleCgpO1xuICAgICAgICAgICAgICAvLyBBIGNsb3Npbmcgc3F1YXJlIGJyYWNrZXQgbWFya3MgdGhlIGVuZCBvZiB0aGUgYXJyYXkgbGl0ZXJhbC5cbiAgICAgICAgICAgICAgaWYgKHZhbHVlID09IFwiXVwiKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gSWYgdGhlIGFycmF5IGxpdGVyYWwgY29udGFpbnMgZWxlbWVudHMsIHRoZSBjdXJyZW50IHRva2VuXG4gICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBhIGNvbW1hIHNlcGFyYXRpbmcgdGhlIHByZXZpb3VzIGVsZW1lbnQgZnJvbSB0aGVcbiAgICAgICAgICAgICAgLy8gbmV4dC5cbiAgICAgICAgICAgICAgaWYgKGhhc01lbWJlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gXCIsXCIpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gbGV4KCk7XG4gICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gXCJdXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVW5leHBlY3RlZCB0cmFpbGluZyBgLGAgaW4gYXJyYXkgbGl0ZXJhbC5cbiAgICAgICAgICAgICAgICAgICAgYWJvcnQoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gQSBgLGAgbXVzdCBzZXBhcmF0ZSBlYWNoIGFycmF5IGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgICBhYm9ydCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBFbGlzaW9ucyBhbmQgbGVhZGluZyBjb21tYXMgYXJlIG5vdCBwZXJtaXR0ZWQuXG4gICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcIixcIikge1xuICAgICAgICAgICAgICAgIGFib3J0KCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKGdldCh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBcIntcIikge1xuICAgICAgICAgICAgLy8gUGFyc2VzIGEgSlNPTiBvYmplY3QsIHJldHVybmluZyBhIG5ldyBKYXZhU2NyaXB0IG9iamVjdC5cbiAgICAgICAgICAgIHJlc3VsdHMgPSB7fTtcbiAgICAgICAgICAgIGZvciAoOzsgaGFzTWVtYmVycyB8fCAoaGFzTWVtYmVycyA9IHRydWUpKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gbGV4KCk7XG4gICAgICAgICAgICAgIC8vIEEgY2xvc2luZyBjdXJseSBicmFjZSBtYXJrcyB0aGUgZW5kIG9mIHRoZSBvYmplY3QgbGl0ZXJhbC5cbiAgICAgICAgICAgICAgaWYgKHZhbHVlID09IFwifVwiKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gSWYgdGhlIG9iamVjdCBsaXRlcmFsIGNvbnRhaW5zIG1lbWJlcnMsIHRoZSBjdXJyZW50IHRva2VuXG4gICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBhIGNvbW1hIHNlcGFyYXRvci5cbiAgICAgICAgICAgICAgaWYgKGhhc01lbWJlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gXCIsXCIpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gbGV4KCk7XG4gICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gXCJ9XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVW5leHBlY3RlZCB0cmFpbGluZyBgLGAgaW4gb2JqZWN0IGxpdGVyYWwuXG4gICAgICAgICAgICAgICAgICAgIGFib3J0KCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIEEgYCxgIG11c3Qgc2VwYXJhdGUgZWFjaCBvYmplY3QgbWVtYmVyLlxuICAgICAgICAgICAgICAgICAgYWJvcnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gTGVhZGluZyBjb21tYXMgYXJlIG5vdCBwZXJtaXR0ZWQsIG9iamVjdCBwcm9wZXJ0eSBuYW1lcyBtdXN0IGJlXG4gICAgICAgICAgICAgIC8vIGRvdWJsZS1xdW90ZWQgc3RyaW5ncywgYW5kIGEgYDpgIG11c3Qgc2VwYXJhdGUgZWFjaCBwcm9wZXJ0eVxuICAgICAgICAgICAgICAvLyBuYW1lIGFuZCB2YWx1ZS5cbiAgICAgICAgICAgICAgaWYgKHZhbHVlID09IFwiLFwiIHx8IHR5cGVvZiB2YWx1ZSAhPSBcInN0cmluZ1wiIHx8IChjaGFySW5kZXhCdWdneSA/IHZhbHVlLmNoYXJBdCgwKSA6IHZhbHVlWzBdKSAhPSBcIkBcIiB8fCBsZXgoKSAhPSBcIjpcIikge1xuICAgICAgICAgICAgICAgIGFib3J0KCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVzdWx0c1t2YWx1ZS5zbGljZSgxKV0gPSBnZXQobGV4KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFVuZXhwZWN0ZWQgdG9rZW4gZW5jb3VudGVyZWQuXG4gICAgICAgICAgYWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9O1xuXG4gICAgICAvLyBJbnRlcm5hbDogVXBkYXRlcyBhIHRyYXZlcnNlZCBvYmplY3QgbWVtYmVyLlxuICAgICAgdmFyIHVwZGF0ZSA9IGZ1bmN0aW9uKHNvdXJjZSwgcHJvcGVydHksIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBlbGVtZW50ID0gd2Fsayhzb3VyY2UsIHByb3BlcnR5LCBjYWxsYmFjayk7XG4gICAgICAgIGlmIChlbGVtZW50ID09PSB1bmRlZikge1xuICAgICAgICAgIGRlbGV0ZSBzb3VyY2VbcHJvcGVydHldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNvdXJjZVtwcm9wZXJ0eV0gPSBlbGVtZW50O1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBJbnRlcm5hbDogUmVjdXJzaXZlbHkgdHJhdmVyc2VzIGEgcGFyc2VkIEpTT04gb2JqZWN0LCBpbnZva2luZyB0aGVcbiAgICAgIC8vIGBjYWxsYmFja2AgZnVuY3Rpb24gZm9yIGVhY2ggdmFsdWUuIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlXG4gICAgICAvLyBgV2Fsayhob2xkZXIsIG5hbWUpYCBvcGVyYXRpb24gZGVmaW5lZCBpbiBFUyA1LjEgc2VjdGlvbiAxNS4xMi4yLlxuICAgICAgdmFyIHdhbGsgPSBmdW5jdGlvbiAoc291cmNlLCBwcm9wZXJ0eSwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHZhbHVlID0gc291cmNlW3Byb3BlcnR5XSwgbGVuZ3RoO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIgJiYgdmFsdWUpIHtcbiAgICAgICAgICAvLyBgZm9yRWFjaGAgY2FuJ3QgYmUgdXNlZCB0byB0cmF2ZXJzZSBhbiBhcnJheSBpbiBPcGVyYSA8PSA4LjU0XG4gICAgICAgICAgLy8gYmVjYXVzZSBpdHMgYE9iamVjdCNoYXNPd25Qcm9wZXJ0eWAgaW1wbGVtZW50YXRpb24gcmV0dXJucyBgZmFsc2VgXG4gICAgICAgICAgLy8gZm9yIGFycmF5IGluZGljZXMgKGUuZy4sIGAhWzEsIDIsIDNdLmhhc093blByb3BlcnR5KFwiMFwiKWApLlxuICAgICAgICAgIGlmIChnZXRDbGFzcy5jYWxsKHZhbHVlKSA9PSBhcnJheUNsYXNzKSB7XG4gICAgICAgICAgICBmb3IgKGxlbmd0aCA9IHZhbHVlLmxlbmd0aDsgbGVuZ3RoLS07KSB7XG4gICAgICAgICAgICAgIHVwZGF0ZSh2YWx1ZSwgbGVuZ3RoLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvckVhY2godmFsdWUsIGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICAgICAgICAgICAgICB1cGRhdGUodmFsdWUsIHByb3BlcnR5LCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwoc291cmNlLCBwcm9wZXJ0eSwgdmFsdWUpO1xuICAgICAgfTtcblxuICAgICAgLy8gUHVibGljOiBgSlNPTi5wYXJzZWAuIFNlZSBFUyA1LjEgc2VjdGlvbiAxNS4xMi4yLlxuICAgICAgSlNPTjMucGFyc2UgPSBmdW5jdGlvbiAoc291cmNlLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgcmVzdWx0LCB2YWx1ZTtcbiAgICAgICAgSW5kZXggPSAwO1xuICAgICAgICBTb3VyY2UgPSBcIlwiICsgc291cmNlO1xuICAgICAgICByZXN1bHQgPSBnZXQobGV4KCkpO1xuICAgICAgICAvLyBJZiBhIEpTT04gc3RyaW5nIGNvbnRhaW5zIG11bHRpcGxlIHRva2VucywgaXQgaXMgaW52YWxpZC5cbiAgICAgICAgaWYgKGxleCgpICE9IFwiJFwiKSB7XG4gICAgICAgICAgYWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXNldCB0aGUgcGFyc2VyIHN0YXRlLlxuICAgICAgICBJbmRleCA9IFNvdXJjZSA9IG51bGw7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayAmJiBnZXRDbGFzcy5jYWxsKGNhbGxiYWNrKSA9PSBmdW5jdGlvbkNsYXNzID8gd2FsaygodmFsdWUgPSB7fSwgdmFsdWVbXCJcIl0gPSByZXN1bHQsIHZhbHVlKSwgXCJcIiwgY2FsbGJhY2spIDogcmVzdWx0O1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBFeHBvcnQgZm9yIGFzeW5jaHJvbm91cyBtb2R1bGUgbG9hZGVycy5cbiAgaWYgKGlzTG9hZGVyKSB7XG4gICAgZGVmaW5lKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBKU09OMztcbiAgICB9KTtcbiAgfVxufSh0aGlzKSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vanNvbjMvbGliL2pzb24zLmpzXG4vLyBtb2R1bGUgaWQgPSA0OThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 499 */
/***/ function(module, exports) {

    eval("/* WEBPACK VAR INJECTION */(function(__webpack_amd_options__) {module.exports = __webpack_amd_options__;\r\n\n/* WEBPACK VAR INJECTION */}.call(exports, {}))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDk5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy93ZWJwYWNrL2J1aWxkaW4vYW1kLW9wdGlvbnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfYW1kX29wdGlvbnNfXztcclxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gKHdlYnBhY2spL2J1aWxkaW4vYW1kLW9wdGlvbnMuanNcbi8vIG1vZHVsZSBpZCA9IDQ5OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 500 */
/***/ function(module, exports) {

    eval("module.exports = Array.isArray || function (arr) {\n  return Object.prototype.toString.call(arr) == '[object Array]';\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTAwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tcGFyc2VyL25vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9zb2NrZXQuaW8tcGFyc2VyL34vaXNhcnJheS9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 501 */
/***/ function(module, exports) {

    eval("\n/**\n * Expose `Emitter`.\n */\n\nmodule.exports = Emitter;\n\n/**\n * Initialize a new `Emitter`.\n *\n * @api public\n */\n\nfunction Emitter(obj) {\n  if (obj) return mixin(obj);\n};\n\n/**\n * Mixin the emitter properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction mixin(obj) {\n  for (var key in Emitter.prototype) {\n    obj[key] = Emitter.prototype[key];\n  }\n  return obj;\n}\n\n/**\n * Listen on the given `event` with `fn`.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.on =\nEmitter.prototype.addEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n  (this._callbacks[event] = this._callbacks[event] || [])\n    .push(fn);\n  return this;\n};\n\n/**\n * Adds an `event` listener that will be invoked a single\n * time then automatically removed.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.once = function(event, fn){\n  var self = this;\n  this._callbacks = this._callbacks || {};\n\n  function on() {\n    self.off(event, on);\n    fn.apply(this, arguments);\n  }\n\n  on.fn = fn;\n  this.on(event, on);\n  return this;\n};\n\n/**\n * Remove the given callback for `event` or all\n * registered callbacks.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.off =\nEmitter.prototype.removeListener =\nEmitter.prototype.removeAllListeners =\nEmitter.prototype.removeEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n\n  // all\n  if (0 == arguments.length) {\n    this._callbacks = {};\n    return this;\n  }\n\n  // specific event\n  var callbacks = this._callbacks[event];\n  if (!callbacks) return this;\n\n  // remove all handlers\n  if (1 == arguments.length) {\n    delete this._callbacks[event];\n    return this;\n  }\n\n  // remove specific handler\n  var cb;\n  for (var i = 0; i < callbacks.length; i++) {\n    cb = callbacks[i];\n    if (cb === fn || cb.fn === fn) {\n      callbacks.splice(i, 1);\n      break;\n    }\n  }\n  return this;\n};\n\n/**\n * Emit `event` with the given args.\n *\n * @param {String} event\n * @param {Mixed} ...\n * @return {Emitter}\n */\n\nEmitter.prototype.emit = function(event){\n  this._callbacks = this._callbacks || {};\n  var args = [].slice.call(arguments, 1)\n    , callbacks = this._callbacks[event];\n\n  if (callbacks) {\n    callbacks = callbacks.slice(0);\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\n      callbacks[i].apply(this, args);\n    }\n  }\n\n  return this;\n};\n\n/**\n * Return array of callbacks for `event`.\n *\n * @param {String} event\n * @return {Array}\n * @api public\n */\n\nEmitter.prototype.listeners = function(event){\n  this._callbacks = this._callbacks || {};\n  return this._callbacks[event] || [];\n};\n\n/**\n * Check if this emitter has `event` handlers.\n *\n * @param {String} event\n * @return {Boolean}\n * @api public\n */\n\nEmitter.prototype.hasListeners = function(event){\n  return !! this.listeners(event).length;\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTAxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9jb21wb25lbnQtZW1pdHRlci9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogRXhwb3NlIGBFbWl0dGVyYC5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVtaXR0ZXI7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgRW1pdHRlcmAuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBFbWl0dGVyKG9iaikge1xuICBpZiAob2JqKSByZXR1cm4gbWl4aW4ob2JqKTtcbn07XG5cbi8qKlxuICogTWl4aW4gdGhlIGVtaXR0ZXIgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBtaXhpbihvYmopIHtcbiAgZm9yICh2YXIga2V5IGluIEVtaXR0ZXIucHJvdG90eXBlKSB7XG4gICAgb2JqW2tleV0gPSBFbWl0dGVyLnByb3RvdHlwZVtrZXldO1xuICB9XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogTGlzdGVuIG9uIHRoZSBnaXZlbiBgZXZlbnRgIHdpdGggYGZuYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5FbWl0dGVyLnByb3RvdHlwZS5vbiA9XG5FbWl0dGVyLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnQsIGZuKXtcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xuICAodGhpcy5fY2FsbGJhY2tzW2V2ZW50XSA9IHRoaXMuX2NhbGxiYWNrc1tldmVudF0gfHwgW10pXG4gICAgLnB1c2goZm4pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWRkcyBhbiBgZXZlbnRgIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBpbnZva2VkIGEgc2luZ2xlXG4gKiB0aW1lIHRoZW4gYXV0b21hdGljYWxseSByZW1vdmVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbihldmVudCwgZm4pe1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcblxuICBmdW5jdGlvbiBvbigpIHtcbiAgICBzZWxmLm9mZihldmVudCwgb24pO1xuICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBvbi5mbiA9IGZuO1xuICB0aGlzLm9uKGV2ZW50LCBvbik7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgdGhlIGdpdmVuIGNhbGxiYWNrIGZvciBgZXZlbnRgIG9yIGFsbFxuICogcmVnaXN0ZXJlZCBjYWxsYmFja3MuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7RW1pdHRlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUub2ZmID1cbkVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID1cbkVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9XG5FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnQsIGZuKXtcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xuXG4gIC8vIGFsbFxuICBpZiAoMCA9PSBhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgdGhpcy5fY2FsbGJhY2tzID0ge307XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBzcGVjaWZpYyBldmVudFxuICB2YXIgY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzW2V2ZW50XTtcbiAgaWYgKCFjYWxsYmFja3MpIHJldHVybiB0aGlzO1xuXG4gIC8vIHJlbW92ZSBhbGwgaGFuZGxlcnNcbiAgaWYgKDEgPT0gYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGRlbGV0ZSB0aGlzLl9jYWxsYmFja3NbZXZlbnRdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gcmVtb3ZlIHNwZWNpZmljIGhhbmRsZXJcbiAgdmFyIGNiO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuICAgIGNiID0gY2FsbGJhY2tzW2ldO1xuICAgIGlmIChjYiA9PT0gZm4gfHwgY2IuZm4gPT09IGZuKSB7XG4gICAgICBjYWxsYmFja3Muc3BsaWNlKGksIDEpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBFbWl0IGBldmVudGAgd2l0aCB0aGUgZ2l2ZW4gYXJncy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAqIEBwYXJhbSB7TWl4ZWR9IC4uLlxuICogQHJldHVybiB7RW1pdHRlcn1cbiAqL1xuXG5FbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24oZXZlbnQpe1xuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XG4gIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpXG4gICAgLCBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3NbZXZlbnRdO1xuXG4gIGlmIChjYWxsYmFja3MpIHtcbiAgICBjYWxsYmFja3MgPSBjYWxsYmFja3Muc2xpY2UoMCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgY2FsbGJhY2tzW2ldLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gYXJyYXkgb2YgY2FsbGJhY2tzIGZvciBgZXZlbnRgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uKGV2ZW50KXtcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xuICByZXR1cm4gdGhpcy5fY2FsbGJhY2tzW2V2ZW50XSB8fCBbXTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhpcyBlbWl0dGVyIGhhcyBgZXZlbnRgIGhhbmRsZXJzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUuaGFzTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnQpe1xuICByZXR1cm4gISEgdGhpcy5saXN0ZW5lcnMoZXZlbnQpLmxlbmd0aDtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29tcG9uZW50LWVtaXR0ZXIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDUwMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 502 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(global) {/*global Blob,File*/\n\n/**\n * Module requirements\n */\n\nvar isArray = __webpack_require__(500);\nvar isBuf = __webpack_require__(503);\n\n/**\n * Replaces every Buffer | ArrayBuffer in packet with a numbered placeholder.\n * Anything with blobs or files should be fed through removeBlobs before coming\n * here.\n *\n * @param {Object} packet - socket.io event packet\n * @return {Object} with deconstructed packet and list of buffers\n * @api public\n */\n\nexports.deconstructPacket = function(packet){\n  var buffers = [];\n  var packetData = packet.data;\n\n  function _deconstructPacket(data) {\n    if (!data) return data;\n\n    if (isBuf(data)) {\n      var placeholder = { _placeholder: true, num: buffers.length };\n      buffers.push(data);\n      return placeholder;\n    } else if (isArray(data)) {\n      var newData = new Array(data.length);\n      for (var i = 0; i < data.length; i++) {\n        newData[i] = _deconstructPacket(data[i]);\n      }\n      return newData;\n    } else if ('object' == typeof data && !(data instanceof Date)) {\n      var newData = {};\n      for (var key in data) {\n        newData[key] = _deconstructPacket(data[key]);\n      }\n      return newData;\n    }\n    return data;\n  }\n\n  var pack = packet;\n  pack.data = _deconstructPacket(packetData);\n  pack.attachments = buffers.length; // number of binary 'attachments'\n  return {packet: pack, buffers: buffers};\n};\n\n/**\n * Reconstructs a binary packet from its placeholder packet and buffers\n *\n * @param {Object} packet - event packet with placeholders\n * @param {Array} buffers - binary buffers to put in placeholder positions\n * @return {Object} reconstructed packet\n * @api public\n */\n\nexports.reconstructPacket = function(packet, buffers) {\n  var curPlaceHolder = 0;\n\n  function _reconstructPacket(data) {\n    if (data && data._placeholder) {\n      var buf = buffers[data.num]; // appropriate buffer (should be natural order anyway)\n      return buf;\n    } else if (isArray(data)) {\n      for (var i = 0; i < data.length; i++) {\n        data[i] = _reconstructPacket(data[i]);\n      }\n      return data;\n    } else if (data && 'object' == typeof data) {\n      for (var key in data) {\n        data[key] = _reconstructPacket(data[key]);\n      }\n      return data;\n    }\n    return data;\n  }\n\n  packet.data = _reconstructPacket(packet.data);\n  packet.attachments = undefined; // no longer useful\n  return packet;\n};\n\n/**\n * Asynchronously removes Blobs or Files from data via\n * FileReader's readAsArrayBuffer method. Used before encoding\n * data as msgpack. Calls callback with the blobless data.\n *\n * @param {Object} data\n * @param {Function} callback\n * @api private\n */\n\nexports.removeBlobs = function(data, callback) {\n  function _removeBlobs(obj, curKey, containingObject) {\n    if (!obj) return obj;\n\n    // convert any blob\n    if ((global.Blob && obj instanceof Blob) ||\n        (global.File && obj instanceof File)) {\n      pendingBlobs++;\n\n      // async filereader\n      var fileReader = new FileReader();\n      fileReader.onload = function() { // this.result == arraybuffer\n        if (containingObject) {\n          containingObject[curKey] = this.result;\n        }\n        else {\n          bloblessData = this.result;\n        }\n\n        // if nothing pending its callback time\n        if(! --pendingBlobs) {\n          callback(bloblessData);\n        }\n      };\n\n      fileReader.readAsArrayBuffer(obj); // blob -> arraybuffer\n    } else if (isArray(obj)) { // handle array\n      for (var i = 0; i < obj.length; i++) {\n        _removeBlobs(obj[i], i, obj);\n      }\n    } else if (obj && 'object' == typeof obj && !isBuf(obj)) { // and object\n      for (var key in obj) {\n        _removeBlobs(obj[key], key, obj);\n      }\n    }\n  }\n\n  var pendingBlobs = 0;\n  var bloblessData = data;\n  _removeBlobs(bloblessData);\n  if (!pendingBlobs) {\n    callback(bloblessData);\n  }\n};\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTAyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tcGFyc2VyL2JpbmFyeS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKmdsb2JhbCBCbG9iLEZpbGUqL1xuXG4vKipcbiAqIE1vZHVsZSByZXF1aXJlbWVudHNcbiAqL1xuXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKTtcbnZhciBpc0J1ZiA9IHJlcXVpcmUoJy4vaXMtYnVmZmVyJyk7XG5cbi8qKlxuICogUmVwbGFjZXMgZXZlcnkgQnVmZmVyIHwgQXJyYXlCdWZmZXIgaW4gcGFja2V0IHdpdGggYSBudW1iZXJlZCBwbGFjZWhvbGRlci5cbiAqIEFueXRoaW5nIHdpdGggYmxvYnMgb3IgZmlsZXMgc2hvdWxkIGJlIGZlZCB0aHJvdWdoIHJlbW92ZUJsb2JzIGJlZm9yZSBjb21pbmdcbiAqIGhlcmUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhY2tldCAtIHNvY2tldC5pbyBldmVudCBwYWNrZXRcbiAqIEByZXR1cm4ge09iamVjdH0gd2l0aCBkZWNvbnN0cnVjdGVkIHBhY2tldCBhbmQgbGlzdCBvZiBidWZmZXJzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMuZGVjb25zdHJ1Y3RQYWNrZXQgPSBmdW5jdGlvbihwYWNrZXQpe1xuICB2YXIgYnVmZmVycyA9IFtdO1xuICB2YXIgcGFja2V0RGF0YSA9IHBhY2tldC5kYXRhO1xuXG4gIGZ1bmN0aW9uIF9kZWNvbnN0cnVjdFBhY2tldChkYXRhKSB7XG4gICAgaWYgKCFkYXRhKSByZXR1cm4gZGF0YTtcblxuICAgIGlmIChpc0J1ZihkYXRhKSkge1xuICAgICAgdmFyIHBsYWNlaG9sZGVyID0geyBfcGxhY2Vob2xkZXI6IHRydWUsIG51bTogYnVmZmVycy5sZW5ndGggfTtcbiAgICAgIGJ1ZmZlcnMucHVzaChkYXRhKTtcbiAgICAgIHJldHVybiBwbGFjZWhvbGRlcjtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHZhciBuZXdEYXRhID0gbmV3IEFycmF5KGRhdGEubGVuZ3RoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICBuZXdEYXRhW2ldID0gX2RlY29uc3RydWN0UGFja2V0KGRhdGFbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ld0RhdGE7XG4gICAgfSBlbHNlIGlmICgnb2JqZWN0JyA9PSB0eXBlb2YgZGF0YSAmJiAhKGRhdGEgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgdmFyIG5ld0RhdGEgPSB7fTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhKSB7XG4gICAgICAgIG5ld0RhdGFba2V5XSA9IF9kZWNvbnN0cnVjdFBhY2tldChkYXRhW2tleV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ld0RhdGE7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgdmFyIHBhY2sgPSBwYWNrZXQ7XG4gIHBhY2suZGF0YSA9IF9kZWNvbnN0cnVjdFBhY2tldChwYWNrZXREYXRhKTtcbiAgcGFjay5hdHRhY2htZW50cyA9IGJ1ZmZlcnMubGVuZ3RoOyAvLyBudW1iZXIgb2YgYmluYXJ5ICdhdHRhY2htZW50cydcbiAgcmV0dXJuIHtwYWNrZXQ6IHBhY2ssIGJ1ZmZlcnM6IGJ1ZmZlcnN9O1xufTtcblxuLyoqXG4gKiBSZWNvbnN0cnVjdHMgYSBiaW5hcnkgcGFja2V0IGZyb20gaXRzIHBsYWNlaG9sZGVyIHBhY2tldCBhbmQgYnVmZmVyc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYWNrZXQgLSBldmVudCBwYWNrZXQgd2l0aCBwbGFjZWhvbGRlcnNcbiAqIEBwYXJhbSB7QXJyYXl9IGJ1ZmZlcnMgLSBiaW5hcnkgYnVmZmVycyB0byBwdXQgaW4gcGxhY2Vob2xkZXIgcG9zaXRpb25zXG4gKiBAcmV0dXJuIHtPYmplY3R9IHJlY29uc3RydWN0ZWQgcGFja2V0XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMucmVjb25zdHJ1Y3RQYWNrZXQgPSBmdW5jdGlvbihwYWNrZXQsIGJ1ZmZlcnMpIHtcbiAgdmFyIGN1clBsYWNlSG9sZGVyID0gMDtcblxuICBmdW5jdGlvbiBfcmVjb25zdHJ1Y3RQYWNrZXQoZGF0YSkge1xuICAgIGlmIChkYXRhICYmIGRhdGEuX3BsYWNlaG9sZGVyKSB7XG4gICAgICB2YXIgYnVmID0gYnVmZmVyc1tkYXRhLm51bV07IC8vIGFwcHJvcHJpYXRlIGJ1ZmZlciAoc2hvdWxkIGJlIG5hdHVyYWwgb3JkZXIgYW55d2F5KVxuICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICBkYXRhW2ldID0gX3JlY29uc3RydWN0UGFja2V0KGRhdGFbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBlbHNlIGlmIChkYXRhICYmICdvYmplY3QnID09IHR5cGVvZiBkYXRhKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xuICAgICAgICBkYXRhW2tleV0gPSBfcmVjb25zdHJ1Y3RQYWNrZXQoZGF0YVtrZXldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHBhY2tldC5kYXRhID0gX3JlY29uc3RydWN0UGFja2V0KHBhY2tldC5kYXRhKTtcbiAgcGFja2V0LmF0dGFjaG1lbnRzID0gdW5kZWZpbmVkOyAvLyBubyBsb25nZXIgdXNlZnVsXG4gIHJldHVybiBwYWNrZXQ7XG59O1xuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IHJlbW92ZXMgQmxvYnMgb3IgRmlsZXMgZnJvbSBkYXRhIHZpYVxuICogRmlsZVJlYWRlcidzIHJlYWRBc0FycmF5QnVmZmVyIG1ldGhvZC4gVXNlZCBiZWZvcmUgZW5jb2RpbmdcbiAqIGRhdGEgYXMgbXNncGFjay4gQ2FsbHMgY2FsbGJhY2sgd2l0aCB0aGUgYmxvYmxlc3MgZGF0YS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMucmVtb3ZlQmxvYnMgPSBmdW5jdGlvbihkYXRhLCBjYWxsYmFjaykge1xuICBmdW5jdGlvbiBfcmVtb3ZlQmxvYnMob2JqLCBjdXJLZXksIGNvbnRhaW5pbmdPYmplY3QpIHtcbiAgICBpZiAoIW9iaikgcmV0dXJuIG9iajtcblxuICAgIC8vIGNvbnZlcnQgYW55IGJsb2JcbiAgICBpZiAoKGdsb2JhbC5CbG9iICYmIG9iaiBpbnN0YW5jZW9mIEJsb2IpIHx8XG4gICAgICAgIChnbG9iYWwuRmlsZSAmJiBvYmogaW5zdGFuY2VvZiBGaWxlKSkge1xuICAgICAgcGVuZGluZ0Jsb2JzKys7XG5cbiAgICAgIC8vIGFzeW5jIGZpbGVyZWFkZXJcbiAgICAgIHZhciBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gZnVuY3Rpb24oKSB7IC8vIHRoaXMucmVzdWx0ID09IGFycmF5YnVmZmVyXG4gICAgICAgIGlmIChjb250YWluaW5nT2JqZWN0KSB7XG4gICAgICAgICAgY29udGFpbmluZ09iamVjdFtjdXJLZXldID0gdGhpcy5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgYmxvYmxlc3NEYXRhID0gdGhpcy5yZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBub3RoaW5nIHBlbmRpbmcgaXRzIGNhbGxiYWNrIHRpbWVcbiAgICAgICAgaWYoISAtLXBlbmRpbmdCbG9icykge1xuICAgICAgICAgIGNhbGxiYWNrKGJsb2JsZXNzRGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGZpbGVSZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIob2JqKTsgLy8gYmxvYiAtPiBhcnJheWJ1ZmZlclxuICAgIH0gZWxzZSBpZiAoaXNBcnJheShvYmopKSB7IC8vIGhhbmRsZSBhcnJheVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgX3JlbW92ZUJsb2JzKG9ialtpXSwgaSwgb2JqKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9iaiAmJiAnb2JqZWN0JyA9PSB0eXBlb2Ygb2JqICYmICFpc0J1ZihvYmopKSB7IC8vIGFuZCBvYmplY3RcbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgICAgX3JlbW92ZUJsb2JzKG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHBlbmRpbmdCbG9icyA9IDA7XG4gIHZhciBibG9ibGVzc0RhdGEgPSBkYXRhO1xuICBfcmVtb3ZlQmxvYnMoYmxvYmxlc3NEYXRhKTtcbiAgaWYgKCFwZW5kaW5nQmxvYnMpIHtcbiAgICBjYWxsYmFjayhibG9ibGVzc0RhdGEpO1xuICB9XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3NvY2tldC5pby1wYXJzZXIvYmluYXJ5LmpzXG4vLyBtb2R1bGUgaWQgPSA1MDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 503 */
/***/ function(module, exports) {

    eval("/* WEBPACK VAR INJECTION */(function(global) {\nmodule.exports = isBuf;\n\n/**\n * Returns true if obj is a buffer or an arraybuffer.\n *\n * @api private\n */\n\nfunction isBuf(obj) {\n  return (global.Buffer && global.Buffer.isBuffer(obj)) ||\n         (global.ArrayBuffer && obj instanceof ArrayBuffer);\n}\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTAzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tcGFyc2VyL2lzLWJ1ZmZlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbm1vZHVsZS5leHBvcnRzID0gaXNCdWY7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIG9iaiBpcyBhIGJ1ZmZlciBvciBhbiBhcnJheWJ1ZmZlci5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc0J1ZihvYmopIHtcbiAgcmV0dXJuIChnbG9iYWwuQnVmZmVyICYmIGdsb2JhbC5CdWZmZXIuaXNCdWZmZXIob2JqKSkgfHxcbiAgICAgICAgIChnbG9iYWwuQXJyYXlCdWZmZXIgJiYgb2JqIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3NvY2tldC5pby1wYXJzZXIvaXMtYnVmZmVyLmpzXG4vLyBtb2R1bGUgaWQgPSA1MDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 504 */
/***/ function(module, exports, __webpack_require__) {

    eval("\n/**\n * Module dependencies.\n */\n\nvar url = __webpack_require__(493);\nvar eio = __webpack_require__(505);\nvar Socket = __webpack_require__(535);\nvar Emitter = __webpack_require__(501);\nvar parser = __webpack_require__(496);\nvar on = __webpack_require__(537);\nvar bind = __webpack_require__(538);\nvar object = __webpack_require__(539);\nvar debug = __webpack_require__(495)('socket.io-client:manager');\nvar indexOf = __webpack_require__(532);\nvar Backoff = __webpack_require__(540);\n\n/**\n * Module exports\n */\n\nmodule.exports = Manager;\n\n/**\n * `Manager` constructor.\n *\n * @param {String} engine instance or engine uri/opts\n * @param {Object} options\n * @api public\n */\n\nfunction Manager(uri, opts){\n  if (!(this instanceof Manager)) return new Manager(uri, opts);\n  if (uri && ('object' == typeof uri)) {\n    opts = uri;\n    uri = undefined;\n  }\n  opts = opts || {};\n\n  opts.path = opts.path || '/socket.io';\n  this.nsps = {};\n  this.subs = [];\n  this.opts = opts;\n  this.reconnection(opts.reconnection !== false);\n  this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);\n  this.reconnectionDelay(opts.reconnectionDelay || 1000);\n  this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);\n  this.randomizationFactor(opts.randomizationFactor || 0.5);\n  this.backoff = new Backoff({\n    min: this.reconnectionDelay(),\n    max: this.reconnectionDelayMax(),\n    jitter: this.randomizationFactor()\n  });\n  this.timeout(null == opts.timeout ? 20000 : opts.timeout);\n  this.readyState = 'closed';\n  this.uri = uri;\n  this.connected = [];\n  this.encoding = false;\n  this.packetBuffer = [];\n  this.encoder = new parser.Encoder();\n  this.decoder = new parser.Decoder();\n  this.autoConnect = opts.autoConnect !== false;\n  if (this.autoConnect) this.open();\n}\n\n/**\n * Propagate given event to sockets and emit on `this`\n *\n * @api private\n */\n\nManager.prototype.emitAll = function() {\n  this.emit.apply(this, arguments);\n  for (var nsp in this.nsps) {\n    this.nsps[nsp].emit.apply(this.nsps[nsp], arguments);\n  }\n};\n\n/**\n * Update `socket.id` of all sockets\n *\n * @api private\n */\n\nManager.prototype.updateSocketIds = function(){\n  for (var nsp in this.nsps) {\n    this.nsps[nsp].id = this.engine.id;\n  }\n};\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Manager.prototype);\n\n/**\n * Sets the `reconnection` config.\n *\n * @param {Boolean} true/false if it should automatically reconnect\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnection = function(v){\n  if (!arguments.length) return this._reconnection;\n  this._reconnection = !!v;\n  return this;\n};\n\n/**\n * Sets the reconnection attempts config.\n *\n * @param {Number} max reconnection attempts before giving up\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnectionAttempts = function(v){\n  if (!arguments.length) return this._reconnectionAttempts;\n  this._reconnectionAttempts = v;\n  return this;\n};\n\n/**\n * Sets the delay between reconnections.\n *\n * @param {Number} delay\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnectionDelay = function(v){\n  if (!arguments.length) return this._reconnectionDelay;\n  this._reconnectionDelay = v;\n  this.backoff && this.backoff.setMin(v);\n  return this;\n};\n\nManager.prototype.randomizationFactor = function(v){\n  if (!arguments.length) return this._randomizationFactor;\n  this._randomizationFactor = v;\n  this.backoff && this.backoff.setJitter(v);\n  return this;\n};\n\n/**\n * Sets the maximum delay between reconnections.\n *\n * @param {Number} delay\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnectionDelayMax = function(v){\n  if (!arguments.length) return this._reconnectionDelayMax;\n  this._reconnectionDelayMax = v;\n  this.backoff && this.backoff.setMax(v);\n  return this;\n};\n\n/**\n * Sets the connection timeout. `false` to disable\n *\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.timeout = function(v){\n  if (!arguments.length) return this._timeout;\n  this._timeout = v;\n  return this;\n};\n\n/**\n * Starts trying to reconnect if reconnection is enabled and we have not\n * started reconnecting yet\n *\n * @api private\n */\n\nManager.prototype.maybeReconnectOnOpen = function() {\n  // Only try to reconnect if it's the first time we're connecting\n  if (!this.reconnecting && this._reconnection && this.backoff.attempts === 0) {\n    // keeps reconnection from firing twice for the same reconnection loop\n    this.reconnect();\n  }\n};\n\n\n/**\n * Sets the current transport `socket`.\n *\n * @param {Function} optional, callback\n * @return {Manager} self\n * @api public\n */\n\nManager.prototype.open =\nManager.prototype.connect = function(fn){\n  debug('readyState %s', this.readyState);\n  if (~this.readyState.indexOf('open')) return this;\n\n  debug('opening %s', this.uri);\n  this.engine = eio(this.uri, this.opts);\n  var socket = this.engine;\n  var self = this;\n  this.readyState = 'opening';\n  this.skipReconnect = false;\n\n  // emit `open`\n  var openSub = on(socket, 'open', function() {\n    self.onopen();\n    fn && fn();\n  });\n\n  // emit `connect_error`\n  var errorSub = on(socket, 'error', function(data){\n    debug('connect_error');\n    self.cleanup();\n    self.readyState = 'closed';\n    self.emitAll('connect_error', data);\n    if (fn) {\n      var err = new Error('Connection error');\n      err.data = data;\n      fn(err);\n    } else {\n      // Only do this if there is no fn to handle the error\n      self.maybeReconnectOnOpen();\n    }\n  });\n\n  // emit `connect_timeout`\n  if (false !== this._timeout) {\n    var timeout = this._timeout;\n    debug('connect attempt will timeout after %d', timeout);\n\n    // set timer\n    var timer = setTimeout(function(){\n      debug('connect attempt timed out after %d', timeout);\n      openSub.destroy();\n      socket.close();\n      socket.emit('error', 'timeout');\n      self.emitAll('connect_timeout', timeout);\n    }, timeout);\n\n    this.subs.push({\n      destroy: function(){\n        clearTimeout(timer);\n      }\n    });\n  }\n\n  this.subs.push(openSub);\n  this.subs.push(errorSub);\n\n  return this;\n};\n\n/**\n * Called upon transport open.\n *\n * @api private\n */\n\nManager.prototype.onopen = function(){\n  debug('open');\n\n  // clear old subs\n  this.cleanup();\n\n  // mark as open\n  this.readyState = 'open';\n  this.emit('open');\n\n  // add new subs\n  var socket = this.engine;\n  this.subs.push(on(socket, 'data', bind(this, 'ondata')));\n  this.subs.push(on(this.decoder, 'decoded', bind(this, 'ondecoded')));\n  this.subs.push(on(socket, 'error', bind(this, 'onerror')));\n  this.subs.push(on(socket, 'close', bind(this, 'onclose')));\n};\n\n/**\n * Called with data.\n *\n * @api private\n */\n\nManager.prototype.ondata = function(data){\n  this.decoder.add(data);\n};\n\n/**\n * Called when parser fully decodes a packet.\n *\n * @api private\n */\n\nManager.prototype.ondecoded = function(packet) {\n  this.emit('packet', packet);\n};\n\n/**\n * Called upon socket error.\n *\n * @api private\n */\n\nManager.prototype.onerror = function(err){\n  debug('error', err);\n  this.emitAll('error', err);\n};\n\n/**\n * Creates a new socket for the given `nsp`.\n *\n * @return {Socket}\n * @api public\n */\n\nManager.prototype.socket = function(nsp){\n  var socket = this.nsps[nsp];\n  if (!socket) {\n    socket = new Socket(this, nsp);\n    this.nsps[nsp] = socket;\n    var self = this;\n    socket.on('connect', function(){\n      socket.id = self.engine.id;\n      if (!~indexOf(self.connected, socket)) {\n        self.connected.push(socket);\n      }\n    });\n  }\n  return socket;\n};\n\n/**\n * Called upon a socket close.\n *\n * @param {Socket} socket\n */\n\nManager.prototype.destroy = function(socket){\n  var index = indexOf(this.connected, socket);\n  if (~index) this.connected.splice(index, 1);\n  if (this.connected.length) return;\n\n  this.close();\n};\n\n/**\n * Writes a packet.\n *\n * @param {Object} packet\n * @api private\n */\n\nManager.prototype.packet = function(packet){\n  debug('writing packet %j', packet);\n  var self = this;\n\n  if (!self.encoding) {\n    // encode, then write to engine with result\n    self.encoding = true;\n    this.encoder.encode(packet, function(encodedPackets) {\n      for (var i = 0; i < encodedPackets.length; i++) {\n        self.engine.write(encodedPackets[i]);\n      }\n      self.encoding = false;\n      self.processPacketQueue();\n    });\n  } else { // add packet to the queue\n    self.packetBuffer.push(packet);\n  }\n};\n\n/**\n * If packet buffer is non-empty, begins encoding the\n * next packet in line.\n *\n * @api private\n */\n\nManager.prototype.processPacketQueue = function() {\n  if (this.packetBuffer.length > 0 && !this.encoding) {\n    var pack = this.packetBuffer.shift();\n    this.packet(pack);\n  }\n};\n\n/**\n * Clean up transport subscriptions and packet buffer.\n *\n * @api private\n */\n\nManager.prototype.cleanup = function(){\n  var sub;\n  while (sub = this.subs.shift()) sub.destroy();\n\n  this.packetBuffer = [];\n  this.encoding = false;\n\n  this.decoder.destroy();\n};\n\n/**\n * Close the current socket.\n *\n * @api private\n */\n\nManager.prototype.close =\nManager.prototype.disconnect = function(){\n  this.skipReconnect = true;\n  this.backoff.reset();\n  this.readyState = 'closed';\n  this.engine && this.engine.close();\n};\n\n/**\n * Called upon engine close.\n *\n * @api private\n */\n\nManager.prototype.onclose = function(reason){\n  debug('close');\n  this.cleanup();\n  this.backoff.reset();\n  this.readyState = 'closed';\n  this.emit('close', reason);\n  if (this._reconnection && !this.skipReconnect) {\n    this.reconnect();\n  }\n};\n\n/**\n * Attempt a reconnection.\n *\n * @api private\n */\n\nManager.prototype.reconnect = function(){\n  if (this.reconnecting || this.skipReconnect) return this;\n\n  var self = this;\n\n  if (this.backoff.attempts >= this._reconnectionAttempts) {\n    debug('reconnect failed');\n    this.backoff.reset();\n    this.emitAll('reconnect_failed');\n    this.reconnecting = false;\n  } else {\n    var delay = this.backoff.duration();\n    debug('will wait %dms before reconnect attempt', delay);\n\n    this.reconnecting = true;\n    var timer = setTimeout(function(){\n      if (self.skipReconnect) return;\n\n      debug('attempting reconnect');\n      self.emitAll('reconnect_attempt', self.backoff.attempts);\n      self.emitAll('reconnecting', self.backoff.attempts);\n\n      // check again for the case socket closed in above events\n      if (self.skipReconnect) return;\n\n      self.open(function(err){\n        if (err) {\n          debug('reconnect attempt error');\n          self.reconnecting = false;\n          self.reconnect();\n          self.emitAll('reconnect_error', err.data);\n        } else {\n          debug('reconnect success');\n          self.onreconnect();\n        }\n      });\n    }, delay);\n\n    this.subs.push({\n      destroy: function(){\n        clearTimeout(timer);\n      }\n    });\n  }\n};\n\n/**\n * Called upon successful reconnect.\n *\n * @api private\n */\n\nManager.prototype.onreconnect = function(){\n  var attempt = this.backoff.attempts;\n  this.reconnecting = false;\n  this.backoff.reset();\n  this.updateSocketIds();\n  this.emitAll('reconnect', attempt);\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTA0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tY2xpZW50L2xpYi9tYW5hZ2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciB1cmwgPSByZXF1aXJlKCcuL3VybCcpO1xudmFyIGVpbyA9IHJlcXVpcmUoJ2VuZ2luZS5pby1jbGllbnQnKTtcbnZhciBTb2NrZXQgPSByZXF1aXJlKCcuL3NvY2tldCcpO1xudmFyIEVtaXR0ZXIgPSByZXF1aXJlKCdjb21wb25lbnQtZW1pdHRlcicpO1xudmFyIHBhcnNlciA9IHJlcXVpcmUoJ3NvY2tldC5pby1wYXJzZXInKTtcbnZhciBvbiA9IHJlcXVpcmUoJy4vb24nKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnY29tcG9uZW50LWJpbmQnKTtcbnZhciBvYmplY3QgPSByZXF1aXJlKCdvYmplY3QtY29tcG9uZW50Jyk7XG52YXIgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdzb2NrZXQuaW8tY2xpZW50Om1hbmFnZXInKTtcbnZhciBpbmRleE9mID0gcmVxdWlyZSgnaW5kZXhvZicpO1xudmFyIEJhY2tvZmYgPSByZXF1aXJlKCdiYWNrbzInKTtcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0c1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gTWFuYWdlcjtcblxuLyoqXG4gKiBgTWFuYWdlcmAgY29uc3RydWN0b3IuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGVuZ2luZSBpbnN0YW5jZSBvciBlbmdpbmUgdXJpL29wdHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIE1hbmFnZXIodXJpLCBvcHRzKXtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE1hbmFnZXIpKSByZXR1cm4gbmV3IE1hbmFnZXIodXJpLCBvcHRzKTtcbiAgaWYgKHVyaSAmJiAoJ29iamVjdCcgPT0gdHlwZW9mIHVyaSkpIHtcbiAgICBvcHRzID0gdXJpO1xuICAgIHVyaSA9IHVuZGVmaW5lZDtcbiAgfVxuICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICBvcHRzLnBhdGggPSBvcHRzLnBhdGggfHwgJy9zb2NrZXQuaW8nO1xuICB0aGlzLm5zcHMgPSB7fTtcbiAgdGhpcy5zdWJzID0gW107XG4gIHRoaXMub3B0cyA9IG9wdHM7XG4gIHRoaXMucmVjb25uZWN0aW9uKG9wdHMucmVjb25uZWN0aW9uICE9PSBmYWxzZSk7XG4gIHRoaXMucmVjb25uZWN0aW9uQXR0ZW1wdHMob3B0cy5yZWNvbm5lY3Rpb25BdHRlbXB0cyB8fCBJbmZpbml0eSk7XG4gIHRoaXMucmVjb25uZWN0aW9uRGVsYXkob3B0cy5yZWNvbm5lY3Rpb25EZWxheSB8fCAxMDAwKTtcbiAgdGhpcy5yZWNvbm5lY3Rpb25EZWxheU1heChvcHRzLnJlY29ubmVjdGlvbkRlbGF5TWF4IHx8IDUwMDApO1xuICB0aGlzLnJhbmRvbWl6YXRpb25GYWN0b3Iob3B0cy5yYW5kb21pemF0aW9uRmFjdG9yIHx8IDAuNSk7XG4gIHRoaXMuYmFja29mZiA9IG5ldyBCYWNrb2ZmKHtcbiAgICBtaW46IHRoaXMucmVjb25uZWN0aW9uRGVsYXkoKSxcbiAgICBtYXg6IHRoaXMucmVjb25uZWN0aW9uRGVsYXlNYXgoKSxcbiAgICBqaXR0ZXI6IHRoaXMucmFuZG9taXphdGlvbkZhY3RvcigpXG4gIH0pO1xuICB0aGlzLnRpbWVvdXQobnVsbCA9PSBvcHRzLnRpbWVvdXQgPyAyMDAwMCA6IG9wdHMudGltZW91dCk7XG4gIHRoaXMucmVhZHlTdGF0ZSA9ICdjbG9zZWQnO1xuICB0aGlzLnVyaSA9IHVyaTtcbiAgdGhpcy5jb25uZWN0ZWQgPSBbXTtcbiAgdGhpcy5lbmNvZGluZyA9IGZhbHNlO1xuICB0aGlzLnBhY2tldEJ1ZmZlciA9IFtdO1xuICB0aGlzLmVuY29kZXIgPSBuZXcgcGFyc2VyLkVuY29kZXIoKTtcbiAgdGhpcy5kZWNvZGVyID0gbmV3IHBhcnNlci5EZWNvZGVyKCk7XG4gIHRoaXMuYXV0b0Nvbm5lY3QgPSBvcHRzLmF1dG9Db25uZWN0ICE9PSBmYWxzZTtcbiAgaWYgKHRoaXMuYXV0b0Nvbm5lY3QpIHRoaXMub3BlbigpO1xufVxuXG4vKipcbiAqIFByb3BhZ2F0ZSBnaXZlbiBldmVudCB0byBzb2NrZXRzIGFuZCBlbWl0IG9uIGB0aGlzYFxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbk1hbmFnZXIucHJvdG90eXBlLmVtaXRBbGwgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5lbWl0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIGZvciAodmFyIG5zcCBpbiB0aGlzLm5zcHMpIHtcbiAgICB0aGlzLm5zcHNbbnNwXS5lbWl0LmFwcGx5KHRoaXMubnNwc1tuc3BdLCBhcmd1bWVudHMpO1xuICB9XG59O1xuXG4vKipcbiAqIFVwZGF0ZSBgc29ja2V0LmlkYCBvZiBhbGwgc29ja2V0c1xuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbk1hbmFnZXIucHJvdG90eXBlLnVwZGF0ZVNvY2tldElkcyA9IGZ1bmN0aW9uKCl7XG4gIGZvciAodmFyIG5zcCBpbiB0aGlzLm5zcHMpIHtcbiAgICB0aGlzLm5zcHNbbnNwXS5pZCA9IHRoaXMuZW5naW5lLmlkO1xuICB9XG59O1xuXG4vKipcbiAqIE1peCBpbiBgRW1pdHRlcmAuXG4gKi9cblxuRW1pdHRlcihNYW5hZ2VyLnByb3RvdHlwZSk7XG5cbi8qKlxuICogU2V0cyB0aGUgYHJlY29ubmVjdGlvbmAgY29uZmlnLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gdHJ1ZS9mYWxzZSBpZiBpdCBzaG91bGQgYXV0b21hdGljYWxseSByZWNvbm5lY3RcbiAqIEByZXR1cm4ge01hbmFnZXJ9IHNlbGYgb3IgdmFsdWVcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuTWFuYWdlci5wcm90b3R5cGUucmVjb25uZWN0aW9uID0gZnVuY3Rpb24odil7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRoaXMuX3JlY29ubmVjdGlvbjtcbiAgdGhpcy5fcmVjb25uZWN0aW9uID0gISF2O1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgcmVjb25uZWN0aW9uIGF0dGVtcHRzIGNvbmZpZy5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbWF4IHJlY29ubmVjdGlvbiBhdHRlbXB0cyBiZWZvcmUgZ2l2aW5nIHVwXG4gKiBAcmV0dXJuIHtNYW5hZ2VyfSBzZWxmIG9yIHZhbHVlXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbk1hbmFnZXIucHJvdG90eXBlLnJlY29ubmVjdGlvbkF0dGVtcHRzID0gZnVuY3Rpb24odil7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRoaXMuX3JlY29ubmVjdGlvbkF0dGVtcHRzO1xuICB0aGlzLl9yZWNvbm5lY3Rpb25BdHRlbXB0cyA9IHY7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBkZWxheSBiZXR3ZWVuIHJlY29ubmVjdGlvbnMuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGRlbGF5XG4gKiBAcmV0dXJuIHtNYW5hZ2VyfSBzZWxmIG9yIHZhbHVlXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbk1hbmFnZXIucHJvdG90eXBlLnJlY29ubmVjdGlvbkRlbGF5ID0gZnVuY3Rpb24odil7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRoaXMuX3JlY29ubmVjdGlvbkRlbGF5O1xuICB0aGlzLl9yZWNvbm5lY3Rpb25EZWxheSA9IHY7XG4gIHRoaXMuYmFja29mZiAmJiB0aGlzLmJhY2tvZmYuc2V0TWluKHYpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbk1hbmFnZXIucHJvdG90eXBlLnJhbmRvbWl6YXRpb25GYWN0b3IgPSBmdW5jdGlvbih2KXtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGhpcy5fcmFuZG9taXphdGlvbkZhY3RvcjtcbiAgdGhpcy5fcmFuZG9taXphdGlvbkZhY3RvciA9IHY7XG4gIHRoaXMuYmFja29mZiAmJiB0aGlzLmJhY2tvZmYuc2V0Sml0dGVyKHYpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgbWF4aW11bSBkZWxheSBiZXR3ZWVuIHJlY29ubmVjdGlvbnMuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGRlbGF5XG4gKiBAcmV0dXJuIHtNYW5hZ2VyfSBzZWxmIG9yIHZhbHVlXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbk1hbmFnZXIucHJvdG90eXBlLnJlY29ubmVjdGlvbkRlbGF5TWF4ID0gZnVuY3Rpb24odil7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRoaXMuX3JlY29ubmVjdGlvbkRlbGF5TWF4O1xuICB0aGlzLl9yZWNvbm5lY3Rpb25EZWxheU1heCA9IHY7XG4gIHRoaXMuYmFja29mZiAmJiB0aGlzLmJhY2tvZmYuc2V0TWF4KHYpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgY29ubmVjdGlvbiB0aW1lb3V0LiBgZmFsc2VgIHRvIGRpc2FibGVcbiAqXG4gKiBAcmV0dXJuIHtNYW5hZ2VyfSBzZWxmIG9yIHZhbHVlXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbk1hbmFnZXIucHJvdG90eXBlLnRpbWVvdXQgPSBmdW5jdGlvbih2KXtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGhpcy5fdGltZW91dDtcbiAgdGhpcy5fdGltZW91dCA9IHY7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTdGFydHMgdHJ5aW5nIHRvIHJlY29ubmVjdCBpZiByZWNvbm5lY3Rpb24gaXMgZW5hYmxlZCBhbmQgd2UgaGF2ZSBub3RcbiAqIHN0YXJ0ZWQgcmVjb25uZWN0aW5nIHlldFxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbk1hbmFnZXIucHJvdG90eXBlLm1heWJlUmVjb25uZWN0T25PcGVuID0gZnVuY3Rpb24oKSB7XG4gIC8vIE9ubHkgdHJ5IHRvIHJlY29ubmVjdCBpZiBpdCdzIHRoZSBmaXJzdCB0aW1lIHdlJ3JlIGNvbm5lY3RpbmdcbiAgaWYgKCF0aGlzLnJlY29ubmVjdGluZyAmJiB0aGlzLl9yZWNvbm5lY3Rpb24gJiYgdGhpcy5iYWNrb2ZmLmF0dGVtcHRzID09PSAwKSB7XG4gICAgLy8ga2VlcHMgcmVjb25uZWN0aW9uIGZyb20gZmlyaW5nIHR3aWNlIGZvciB0aGUgc2FtZSByZWNvbm5lY3Rpb24gbG9vcFxuICAgIHRoaXMucmVjb25uZWN0KCk7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBTZXRzIHRoZSBjdXJyZW50IHRyYW5zcG9ydCBgc29ja2V0YC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25hbCwgY2FsbGJhY2tcbiAqIEByZXR1cm4ge01hbmFnZXJ9IHNlbGZcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuTWFuYWdlci5wcm90b3R5cGUub3BlbiA9XG5NYW5hZ2VyLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24oZm4pe1xuICBkZWJ1ZygncmVhZHlTdGF0ZSAlcycsIHRoaXMucmVhZHlTdGF0ZSk7XG4gIGlmICh+dGhpcy5yZWFkeVN0YXRlLmluZGV4T2YoJ29wZW4nKSkgcmV0dXJuIHRoaXM7XG5cbiAgZGVidWcoJ29wZW5pbmcgJXMnLCB0aGlzLnVyaSk7XG4gIHRoaXMuZW5naW5lID0gZWlvKHRoaXMudXJpLCB0aGlzLm9wdHMpO1xuICB2YXIgc29ja2V0ID0gdGhpcy5lbmdpbmU7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy5yZWFkeVN0YXRlID0gJ29wZW5pbmcnO1xuICB0aGlzLnNraXBSZWNvbm5lY3QgPSBmYWxzZTtcblxuICAvLyBlbWl0IGBvcGVuYFxuICB2YXIgb3BlblN1YiA9IG9uKHNvY2tldCwgJ29wZW4nLCBmdW5jdGlvbigpIHtcbiAgICBzZWxmLm9ub3BlbigpO1xuICAgIGZuICYmIGZuKCk7XG4gIH0pO1xuXG4gIC8vIGVtaXQgYGNvbm5lY3RfZXJyb3JgXG4gIHZhciBlcnJvclN1YiA9IG9uKHNvY2tldCwgJ2Vycm9yJywgZnVuY3Rpb24oZGF0YSl7XG4gICAgZGVidWcoJ2Nvbm5lY3RfZXJyb3InKTtcbiAgICBzZWxmLmNsZWFudXAoKTtcbiAgICBzZWxmLnJlYWR5U3RhdGUgPSAnY2xvc2VkJztcbiAgICBzZWxmLmVtaXRBbGwoJ2Nvbm5lY3RfZXJyb3InLCBkYXRhKTtcbiAgICBpZiAoZm4pIHtcbiAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gZXJyb3InKTtcbiAgICAgIGVyci5kYXRhID0gZGF0YTtcbiAgICAgIGZuKGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE9ubHkgZG8gdGhpcyBpZiB0aGVyZSBpcyBubyBmbiB0byBoYW5kbGUgdGhlIGVycm9yXG4gICAgICBzZWxmLm1heWJlUmVjb25uZWN0T25PcGVuKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBlbWl0IGBjb25uZWN0X3RpbWVvdXRgXG4gIGlmIChmYWxzZSAhPT0gdGhpcy5fdGltZW91dCkge1xuICAgIHZhciB0aW1lb3V0ID0gdGhpcy5fdGltZW91dDtcbiAgICBkZWJ1ZygnY29ubmVjdCBhdHRlbXB0IHdpbGwgdGltZW91dCBhZnRlciAlZCcsIHRpbWVvdXQpO1xuXG4gICAgLy8gc2V0IHRpbWVyXG4gICAgdmFyIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgZGVidWcoJ2Nvbm5lY3QgYXR0ZW1wdCB0aW1lZCBvdXQgYWZ0ZXIgJWQnLCB0aW1lb3V0KTtcbiAgICAgIG9wZW5TdWIuZGVzdHJveSgpO1xuICAgICAgc29ja2V0LmNsb3NlKCk7XG4gICAgICBzb2NrZXQuZW1pdCgnZXJyb3InLCAndGltZW91dCcpO1xuICAgICAgc2VsZi5lbWl0QWxsKCdjb25uZWN0X3RpbWVvdXQnLCB0aW1lb3V0KTtcbiAgICB9LCB0aW1lb3V0KTtcblxuICAgIHRoaXMuc3Vicy5wdXNoKHtcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCl7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB0aGlzLnN1YnMucHVzaChvcGVuU3ViKTtcbiAgdGhpcy5zdWJzLnB1c2goZXJyb3JTdWIpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDYWxsZWQgdXBvbiB0cmFuc3BvcnQgb3Blbi5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5NYW5hZ2VyLnByb3RvdHlwZS5vbm9wZW4gPSBmdW5jdGlvbigpe1xuICBkZWJ1Zygnb3BlbicpO1xuXG4gIC8vIGNsZWFyIG9sZCBzdWJzXG4gIHRoaXMuY2xlYW51cCgpO1xuXG4gIC8vIG1hcmsgYXMgb3BlblxuICB0aGlzLnJlYWR5U3RhdGUgPSAnb3Blbic7XG4gIHRoaXMuZW1pdCgnb3BlbicpO1xuXG4gIC8vIGFkZCBuZXcgc3Vic1xuICB2YXIgc29ja2V0ID0gdGhpcy5lbmdpbmU7XG4gIHRoaXMuc3Vicy5wdXNoKG9uKHNvY2tldCwgJ2RhdGEnLCBiaW5kKHRoaXMsICdvbmRhdGEnKSkpO1xuICB0aGlzLnN1YnMucHVzaChvbih0aGlzLmRlY29kZXIsICdkZWNvZGVkJywgYmluZCh0aGlzLCAnb25kZWNvZGVkJykpKTtcbiAgdGhpcy5zdWJzLnB1c2gob24oc29ja2V0LCAnZXJyb3InLCBiaW5kKHRoaXMsICdvbmVycm9yJykpKTtcbiAgdGhpcy5zdWJzLnB1c2gob24oc29ja2V0LCAnY2xvc2UnLCBiaW5kKHRoaXMsICdvbmNsb3NlJykpKTtcbn07XG5cbi8qKlxuICogQ2FsbGVkIHdpdGggZGF0YS5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5NYW5hZ2VyLnByb3RvdHlwZS5vbmRhdGEgPSBmdW5jdGlvbihkYXRhKXtcbiAgdGhpcy5kZWNvZGVyLmFkZChkYXRhKTtcbn07XG5cbi8qKlxuICogQ2FsbGVkIHdoZW4gcGFyc2VyIGZ1bGx5IGRlY29kZXMgYSBwYWNrZXQuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuTWFuYWdlci5wcm90b3R5cGUub25kZWNvZGVkID0gZnVuY3Rpb24ocGFja2V0KSB7XG4gIHRoaXMuZW1pdCgncGFja2V0JywgcGFja2V0KTtcbn07XG5cbi8qKlxuICogQ2FsbGVkIHVwb24gc29ja2V0IGVycm9yLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbk1hbmFnZXIucHJvdG90eXBlLm9uZXJyb3IgPSBmdW5jdGlvbihlcnIpe1xuICBkZWJ1ZygnZXJyb3InLCBlcnIpO1xuICB0aGlzLmVtaXRBbGwoJ2Vycm9yJywgZXJyKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBzb2NrZXQgZm9yIHRoZSBnaXZlbiBgbnNwYC5cbiAqXG4gKiBAcmV0dXJuIHtTb2NrZXR9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbk1hbmFnZXIucHJvdG90eXBlLnNvY2tldCA9IGZ1bmN0aW9uKG5zcCl7XG4gIHZhciBzb2NrZXQgPSB0aGlzLm5zcHNbbnNwXTtcbiAgaWYgKCFzb2NrZXQpIHtcbiAgICBzb2NrZXQgPSBuZXcgU29ja2V0KHRoaXMsIG5zcCk7XG4gICAgdGhpcy5uc3BzW25zcF0gPSBzb2NrZXQ7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHNvY2tldC5vbignY29ubmVjdCcsIGZ1bmN0aW9uKCl7XG4gICAgICBzb2NrZXQuaWQgPSBzZWxmLmVuZ2luZS5pZDtcbiAgICAgIGlmICghfmluZGV4T2Yoc2VsZi5jb25uZWN0ZWQsIHNvY2tldCkpIHtcbiAgICAgICAgc2VsZi5jb25uZWN0ZWQucHVzaChzb2NrZXQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBzb2NrZXQ7XG59O1xuXG4vKipcbiAqIENhbGxlZCB1cG9uIGEgc29ja2V0IGNsb3NlLlxuICpcbiAqIEBwYXJhbSB7U29ja2V0fSBzb2NrZXRcbiAqL1xuXG5NYW5hZ2VyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oc29ja2V0KXtcbiAgdmFyIGluZGV4ID0gaW5kZXhPZih0aGlzLmNvbm5lY3RlZCwgc29ja2V0KTtcbiAgaWYgKH5pbmRleCkgdGhpcy5jb25uZWN0ZWQuc3BsaWNlKGluZGV4LCAxKTtcbiAgaWYgKHRoaXMuY29ubmVjdGVkLmxlbmd0aCkgcmV0dXJuO1xuXG4gIHRoaXMuY2xvc2UoKTtcbn07XG5cbi8qKlxuICogV3JpdGVzIGEgcGFja2V0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYWNrZXRcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbk1hbmFnZXIucHJvdG90eXBlLnBhY2tldCA9IGZ1bmN0aW9uKHBhY2tldCl7XG4gIGRlYnVnKCd3cml0aW5nIHBhY2tldCAlaicsIHBhY2tldCk7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICBpZiAoIXNlbGYuZW5jb2RpbmcpIHtcbiAgICAvLyBlbmNvZGUsIHRoZW4gd3JpdGUgdG8gZW5naW5lIHdpdGggcmVzdWx0XG4gICAgc2VsZi5lbmNvZGluZyA9IHRydWU7XG4gICAgdGhpcy5lbmNvZGVyLmVuY29kZShwYWNrZXQsIGZ1bmN0aW9uKGVuY29kZWRQYWNrZXRzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuY29kZWRQYWNrZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNlbGYuZW5naW5lLndyaXRlKGVuY29kZWRQYWNrZXRzW2ldKTtcbiAgICAgIH1cbiAgICAgIHNlbGYuZW5jb2RpbmcgPSBmYWxzZTtcbiAgICAgIHNlbGYucHJvY2Vzc1BhY2tldFF1ZXVlKCk7XG4gICAgfSk7XG4gIH0gZWxzZSB7IC8vIGFkZCBwYWNrZXQgdG8gdGhlIHF1ZXVlXG4gICAgc2VsZi5wYWNrZXRCdWZmZXIucHVzaChwYWNrZXQpO1xuICB9XG59O1xuXG4vKipcbiAqIElmIHBhY2tldCBidWZmZXIgaXMgbm9uLWVtcHR5LCBiZWdpbnMgZW5jb2RpbmcgdGhlXG4gKiBuZXh0IHBhY2tldCBpbiBsaW5lLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbk1hbmFnZXIucHJvdG90eXBlLnByb2Nlc3NQYWNrZXRRdWV1ZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5wYWNrZXRCdWZmZXIubGVuZ3RoID4gMCAmJiAhdGhpcy5lbmNvZGluZykge1xuICAgIHZhciBwYWNrID0gdGhpcy5wYWNrZXRCdWZmZXIuc2hpZnQoKTtcbiAgICB0aGlzLnBhY2tldChwYWNrKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDbGVhbiB1cCB0cmFuc3BvcnQgc3Vic2NyaXB0aW9ucyBhbmQgcGFja2V0IGJ1ZmZlci5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5NYW5hZ2VyLnByb3RvdHlwZS5jbGVhbnVwID0gZnVuY3Rpb24oKXtcbiAgdmFyIHN1YjtcbiAgd2hpbGUgKHN1YiA9IHRoaXMuc3Vicy5zaGlmdCgpKSBzdWIuZGVzdHJveSgpO1xuXG4gIHRoaXMucGFja2V0QnVmZmVyID0gW107XG4gIHRoaXMuZW5jb2RpbmcgPSBmYWxzZTtcblxuICB0aGlzLmRlY29kZXIuZGVzdHJveSgpO1xufTtcblxuLyoqXG4gKiBDbG9zZSB0aGUgY3VycmVudCBzb2NrZXQuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuTWFuYWdlci5wcm90b3R5cGUuY2xvc2UgPVxuTWFuYWdlci5wcm90b3R5cGUuZGlzY29ubmVjdCA9IGZ1bmN0aW9uKCl7XG4gIHRoaXMuc2tpcFJlY29ubmVjdCA9IHRydWU7XG4gIHRoaXMuYmFja29mZi5yZXNldCgpO1xuICB0aGlzLnJlYWR5U3RhdGUgPSAnY2xvc2VkJztcbiAgdGhpcy5lbmdpbmUgJiYgdGhpcy5lbmdpbmUuY2xvc2UoKTtcbn07XG5cbi8qKlxuICogQ2FsbGVkIHVwb24gZW5naW5lIGNsb3NlLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbk1hbmFnZXIucHJvdG90eXBlLm9uY2xvc2UgPSBmdW5jdGlvbihyZWFzb24pe1xuICBkZWJ1ZygnY2xvc2UnKTtcbiAgdGhpcy5jbGVhbnVwKCk7XG4gIHRoaXMuYmFja29mZi5yZXNldCgpO1xuICB0aGlzLnJlYWR5U3RhdGUgPSAnY2xvc2VkJztcbiAgdGhpcy5lbWl0KCdjbG9zZScsIHJlYXNvbik7XG4gIGlmICh0aGlzLl9yZWNvbm5lY3Rpb24gJiYgIXRoaXMuc2tpcFJlY29ubmVjdCkge1xuICAgIHRoaXMucmVjb25uZWN0KCk7XG4gIH1cbn07XG5cbi8qKlxuICogQXR0ZW1wdCBhIHJlY29ubmVjdGlvbi5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5NYW5hZ2VyLnByb3RvdHlwZS5yZWNvbm5lY3QgPSBmdW5jdGlvbigpe1xuICBpZiAodGhpcy5yZWNvbm5lY3RpbmcgfHwgdGhpcy5za2lwUmVjb25uZWN0KSByZXR1cm4gdGhpcztcblxuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgaWYgKHRoaXMuYmFja29mZi5hdHRlbXB0cyA+PSB0aGlzLl9yZWNvbm5lY3Rpb25BdHRlbXB0cykge1xuICAgIGRlYnVnKCdyZWNvbm5lY3QgZmFpbGVkJyk7XG4gICAgdGhpcy5iYWNrb2ZmLnJlc2V0KCk7XG4gICAgdGhpcy5lbWl0QWxsKCdyZWNvbm5lY3RfZmFpbGVkJyk7XG4gICAgdGhpcy5yZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZGVsYXkgPSB0aGlzLmJhY2tvZmYuZHVyYXRpb24oKTtcbiAgICBkZWJ1Zygnd2lsbCB3YWl0ICVkbXMgYmVmb3JlIHJlY29ubmVjdCBhdHRlbXB0JywgZGVsYXkpO1xuXG4gICAgdGhpcy5yZWNvbm5lY3RpbmcgPSB0cnVlO1xuICAgIHZhciB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgIGlmIChzZWxmLnNraXBSZWNvbm5lY3QpIHJldHVybjtcblxuICAgICAgZGVidWcoJ2F0dGVtcHRpbmcgcmVjb25uZWN0Jyk7XG4gICAgICBzZWxmLmVtaXRBbGwoJ3JlY29ubmVjdF9hdHRlbXB0Jywgc2VsZi5iYWNrb2ZmLmF0dGVtcHRzKTtcbiAgICAgIHNlbGYuZW1pdEFsbCgncmVjb25uZWN0aW5nJywgc2VsZi5iYWNrb2ZmLmF0dGVtcHRzKTtcblxuICAgICAgLy8gY2hlY2sgYWdhaW4gZm9yIHRoZSBjYXNlIHNvY2tldCBjbG9zZWQgaW4gYWJvdmUgZXZlbnRzXG4gICAgICBpZiAoc2VsZi5za2lwUmVjb25uZWN0KSByZXR1cm47XG5cbiAgICAgIHNlbGYub3BlbihmdW5jdGlvbihlcnIpe1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgZGVidWcoJ3JlY29ubmVjdCBhdHRlbXB0IGVycm9yJyk7XG4gICAgICAgICAgc2VsZi5yZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgICBzZWxmLnJlY29ubmVjdCgpO1xuICAgICAgICAgIHNlbGYuZW1pdEFsbCgncmVjb25uZWN0X2Vycm9yJywgZXJyLmRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlYnVnKCdyZWNvbm5lY3Qgc3VjY2VzcycpO1xuICAgICAgICAgIHNlbGYub25yZWNvbm5lY3QoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgZGVsYXkpO1xuXG4gICAgdGhpcy5zdWJzLnB1c2goe1xuICAgICAgZGVzdHJveTogZnVuY3Rpb24oKXtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufTtcblxuLyoqXG4gKiBDYWxsZWQgdXBvbiBzdWNjZXNzZnVsIHJlY29ubmVjdC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5NYW5hZ2VyLnByb3RvdHlwZS5vbnJlY29ubmVjdCA9IGZ1bmN0aW9uKCl7XG4gIHZhciBhdHRlbXB0ID0gdGhpcy5iYWNrb2ZmLmF0dGVtcHRzO1xuICB0aGlzLnJlY29ubmVjdGluZyA9IGZhbHNlO1xuICB0aGlzLmJhY2tvZmYucmVzZXQoKTtcbiAgdGhpcy51cGRhdGVTb2NrZXRJZHMoKTtcbiAgdGhpcy5lbWl0QWxsKCdyZWNvbm5lY3QnLCBhdHRlbXB0KTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vc29ja2V0LmlvLWNsaWVudC9saWIvbWFuYWdlci5qc1xuLy8gbW9kdWxlIGlkID0gNTA0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 505 */
/***/ function(module, exports, __webpack_require__) {

    eval("\nmodule.exports =  __webpack_require__(506);\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTA1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlxubW9kdWxlLmV4cG9ydHMgPSAgcmVxdWlyZSgnLi9saWIvJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZW5naW5lLmlvLWNsaWVudC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTA1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 506 */
/***/ function(module, exports, __webpack_require__) {

    eval("\nmodule.exports = __webpack_require__(507);\n\n/**\n * Exports parser\n *\n * @api public\n *\n */\nmodule.exports.parser = __webpack_require__(515);\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTA2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2xpYi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9zb2NrZXQnKTtcblxuLyoqXG4gKiBFeHBvcnRzIHBhcnNlclxuICpcbiAqIEBhcGkgcHVibGljXG4gKlxuICovXG5tb2R1bGUuZXhwb3J0cy5wYXJzZXIgPSByZXF1aXJlKCdlbmdpbmUuaW8tcGFyc2VyJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZW5naW5lLmlvLWNsaWVudC9saWIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDUwNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 507 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(global) {/**\n * Module dependencies.\n */\n\nvar transports = __webpack_require__(508);\nvar Emitter = __webpack_require__(501);\nvar debug = __webpack_require__(526)('engine.io-client:socket');\nvar index = __webpack_require__(532);\nvar parser = __webpack_require__(515);\nvar parseuri = __webpack_require__(533);\nvar parsejson = __webpack_require__(534);\nvar parseqs = __webpack_require__(524);\n\n/**\n * Module exports.\n */\n\nmodule.exports = Socket;\n\n/**\n * Noop function.\n *\n * @api private\n */\n\nfunction noop(){}\n\n/**\n * Socket constructor.\n *\n * @param {String|Object} uri or options\n * @param {Object} options\n * @api public\n */\n\nfunction Socket(uri, opts){\n  if (!(this instanceof Socket)) return new Socket(uri, opts);\n\n  opts = opts || {};\n\n  if (uri && 'object' == typeof uri) {\n    opts = uri;\n    uri = null;\n  }\n\n  if (uri) {\n    uri = parseuri(uri);\n    opts.host = uri.host;\n    opts.secure = uri.protocol == 'https' || uri.protocol == 'wss';\n    opts.port = uri.port;\n    if (uri.query) opts.query = uri.query;\n  }\n\n  this.secure = null != opts.secure ? opts.secure :\n    (global.location && 'https:' == location.protocol);\n\n  if (opts.host) {\n    var pieces = opts.host.split(':');\n    opts.hostname = pieces.shift();\n    if (pieces.length) {\n      opts.port = pieces.pop();\n    } else if (!opts.port) {\n      // if no port is specified manually, use the protocol default\n      opts.port = this.secure ? '443' : '80';\n    }\n  }\n\n  this.agent = opts.agent || false;\n  this.hostname = opts.hostname ||\n    (global.location ? location.hostname : 'localhost');\n  this.port = opts.port || (global.location && location.port ?\n       location.port :\n       (this.secure ? 443 : 80));\n  this.query = opts.query || {};\n  if ('string' == typeof this.query) this.query = parseqs.decode(this.query);\n  this.upgrade = false !== opts.upgrade;\n  this.path = (opts.path || '/engine.io').replace(/\\/$/, '') + '/';\n  this.forceJSONP = !!opts.forceJSONP;\n  this.jsonp = false !== opts.jsonp;\n  this.forceBase64 = !!opts.forceBase64;\n  this.enablesXDR = !!opts.enablesXDR;\n  this.timestampParam = opts.timestampParam || 't';\n  this.timestampRequests = opts.timestampRequests;\n  this.transports = opts.transports || ['polling', 'websocket'];\n  this.readyState = '';\n  this.writeBuffer = [];\n  this.callbackBuffer = [];\n  this.policyPort = opts.policyPort || 843;\n  this.rememberUpgrade = opts.rememberUpgrade || false;\n  this.binaryType = null;\n  this.onlyBinaryUpgrades = opts.onlyBinaryUpgrades;\n\n  // SSL options for Node.js client\n  this.pfx = opts.pfx || null;\n  this.key = opts.key || null;\n  this.passphrase = opts.passphrase || null;\n  this.cert = opts.cert || null;\n  this.ca = opts.ca || null;\n  this.ciphers = opts.ciphers || null;\n  this.rejectUnauthorized = opts.rejectUnauthorized || null;\n\n  this.open();\n}\n\nSocket.priorWebsocketSuccess = false;\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Socket.prototype);\n\n/**\n * Protocol version.\n *\n * @api public\n */\n\nSocket.protocol = parser.protocol; // this is an int\n\n/**\n * Expose deps for legacy compatibility\n * and standalone browser access.\n */\n\nSocket.Socket = Socket;\nSocket.Transport = __webpack_require__(514);\nSocket.transports = __webpack_require__(508);\nSocket.parser = __webpack_require__(515);\n\n/**\n * Creates transport of the given type.\n *\n * @param {String} transport name\n * @return {Transport}\n * @api private\n */\n\nSocket.prototype.createTransport = function (name) {\n  debug('creating transport \"%s\"', name);\n  var query = clone(this.query);\n\n  // append engine.io protocol identifier\n  query.EIO = parser.protocol;\n\n  // transport name\n  query.transport = name;\n\n  // session id if we already have one\n  if (this.id) query.sid = this.id;\n\n  var transport = new transports[name]({\n    agent: this.agent,\n    hostname: this.hostname,\n    port: this.port,\n    secure: this.secure,\n    path: this.path,\n    query: query,\n    forceJSONP: this.forceJSONP,\n    jsonp: this.jsonp,\n    forceBase64: this.forceBase64,\n    enablesXDR: this.enablesXDR,\n    timestampRequests: this.timestampRequests,\n    timestampParam: this.timestampParam,\n    policyPort: this.policyPort,\n    socket: this,\n    pfx: this.pfx,\n    key: this.key,\n    passphrase: this.passphrase,\n    cert: this.cert,\n    ca: this.ca,\n    ciphers: this.ciphers,\n    rejectUnauthorized: this.rejectUnauthorized\n  });\n\n  return transport;\n};\n\nfunction clone (obj) {\n  var o = {};\n  for (var i in obj) {\n    if (obj.hasOwnProperty(i)) {\n      o[i] = obj[i];\n    }\n  }\n  return o;\n}\n\n/**\n * Initializes transport to use and starts probe.\n *\n * @api private\n */\nSocket.prototype.open = function () {\n  var transport;\n  if (this.rememberUpgrade && Socket.priorWebsocketSuccess && this.transports.indexOf('websocket') != -1) {\n    transport = 'websocket';\n  } else if (0 == this.transports.length) {\n    // Emit error on next tick so it can be listened to\n    var self = this;\n    setTimeout(function() {\n      self.emit('error', 'No transports available');\n    }, 0);\n    return;\n  } else {\n    transport = this.transports[0];\n  }\n  this.readyState = 'opening';\n\n  // Retry with the next transport if the transport is disabled (jsonp: false)\n  var transport;\n  try {\n    transport = this.createTransport(transport);\n  } catch (e) {\n    this.transports.shift();\n    this.open();\n    return;\n  }\n\n  transport.open();\n  this.setTransport(transport);\n};\n\n/**\n * Sets the current transport. Disables the existing one (if any).\n *\n * @api private\n */\n\nSocket.prototype.setTransport = function(transport){\n  debug('setting transport %s', transport.name);\n  var self = this;\n\n  if (this.transport) {\n    debug('clearing existing transport %s', this.transport.name);\n    this.transport.removeAllListeners();\n  }\n\n  // set up transport\n  this.transport = transport;\n\n  // set up transport listeners\n  transport\n  .on('drain', function(){\n    self.onDrain();\n  })\n  .on('packet', function(packet){\n    self.onPacket(packet);\n  })\n  .on('error', function(e){\n    self.onError(e);\n  })\n  .on('close', function(){\n    self.onClose('transport close');\n  });\n};\n\n/**\n * Probes a transport.\n *\n * @param {String} transport name\n * @api private\n */\n\nSocket.prototype.probe = function (name) {\n  debug('probing transport \"%s\"', name);\n  var transport = this.createTransport(name, { probe: 1 })\n    , failed = false\n    , self = this;\n\n  Socket.priorWebsocketSuccess = false;\n\n  function onTransportOpen(){\n    if (self.onlyBinaryUpgrades) {\n      var upgradeLosesBinary = !this.supportsBinary && self.transport.supportsBinary;\n      failed = failed || upgradeLosesBinary;\n    }\n    if (failed) return;\n\n    debug('probe transport \"%s\" opened', name);\n    transport.send([{ type: 'ping', data: 'probe' }]);\n    transport.once('packet', function (msg) {\n      if (failed) return;\n      if ('pong' == msg.type && 'probe' == msg.data) {\n        debug('probe transport \"%s\" pong', name);\n        self.upgrading = true;\n        self.emit('upgrading', transport);\n        if (!transport) return;\n        Socket.priorWebsocketSuccess = 'websocket' == transport.name;\n\n        debug('pausing current transport \"%s\"', self.transport.name);\n        self.transport.pause(function () {\n          if (failed) return;\n          if ('closed' == self.readyState) return;\n          debug('changing transport and sending upgrade packet');\n\n          cleanup();\n\n          self.setTransport(transport);\n          transport.send([{ type: 'upgrade' }]);\n          self.emit('upgrade', transport);\n          transport = null;\n          self.upgrading = false;\n          self.flush();\n        });\n      } else {\n        debug('probe transport \"%s\" failed', name);\n        var err = new Error('probe error');\n        err.transport = transport.name;\n        self.emit('upgradeError', err);\n      }\n    });\n  }\n\n  function freezeTransport() {\n    if (failed) return;\n\n    // Any callback called by transport should be ignored since now\n    failed = true;\n\n    cleanup();\n\n    transport.close();\n    transport = null;\n  }\n\n  //Handle any error that happens while probing\n  function onerror(err) {\n    var error = new Error('probe error: ' + err);\n    error.transport = transport.name;\n\n    freezeTransport();\n\n    debug('probe transport \"%s\" failed because of error: %s', name, err);\n\n    self.emit('upgradeError', error);\n  }\n\n  function onTransportClose(){\n    onerror(\"transport closed\");\n  }\n\n  //When the socket is closed while we're probing\n  function onclose(){\n    onerror(\"socket closed\");\n  }\n\n  //When the socket is upgraded while we're probing\n  function onupgrade(to){\n    if (transport && to.name != transport.name) {\n      debug('\"%s\" works - aborting \"%s\"', to.name, transport.name);\n      freezeTransport();\n    }\n  }\n\n  //Remove all listeners on the transport and on self\n  function cleanup(){\n    transport.removeListener('open', onTransportOpen);\n    transport.removeListener('error', onerror);\n    transport.removeListener('close', onTransportClose);\n    self.removeListener('close', onclose);\n    self.removeListener('upgrading', onupgrade);\n  }\n\n  transport.once('open', onTransportOpen);\n  transport.once('error', onerror);\n  transport.once('close', onTransportClose);\n\n  this.once('close', onclose);\n  this.once('upgrading', onupgrade);\n\n  transport.open();\n\n};\n\n/**\n * Called when connection is deemed open.\n *\n * @api public\n */\n\nSocket.prototype.onOpen = function () {\n  debug('socket open');\n  this.readyState = 'open';\n  Socket.priorWebsocketSuccess = 'websocket' == this.transport.name;\n  this.emit('open');\n  this.flush();\n\n  // we check for `readyState` in case an `open`\n  // listener already closed the socket\n  if ('open' == this.readyState && this.upgrade && this.transport.pause) {\n    debug('starting upgrade probes');\n    for (var i = 0, l = this.upgrades.length; i < l; i++) {\n      this.probe(this.upgrades[i]);\n    }\n  }\n};\n\n/**\n * Handles a packet.\n *\n * @api private\n */\n\nSocket.prototype.onPacket = function (packet) {\n  if ('opening' == this.readyState || 'open' == this.readyState) {\n    debug('socket receive: type \"%s\", data \"%s\"', packet.type, packet.data);\n\n    this.emit('packet', packet);\n\n    // Socket is live - any packet counts\n    this.emit('heartbeat');\n\n    switch (packet.type) {\n      case 'open':\n        this.onHandshake(parsejson(packet.data));\n        break;\n\n      case 'pong':\n        this.setPing();\n        break;\n\n      case 'error':\n        var err = new Error('server error');\n        err.code = packet.data;\n        this.emit('error', err);\n        break;\n\n      case 'message':\n        this.emit('data', packet.data);\n        this.emit('message', packet.data);\n        break;\n    }\n  } else {\n    debug('packet received with socket readyState \"%s\"', this.readyState);\n  }\n};\n\n/**\n * Called upon handshake completion.\n *\n * @param {Object} handshake obj\n * @api private\n */\n\nSocket.prototype.onHandshake = function (data) {\n  this.emit('handshake', data);\n  this.id = data.sid;\n  this.transport.query.sid = data.sid;\n  this.upgrades = this.filterUpgrades(data.upgrades);\n  this.pingInterval = data.pingInterval;\n  this.pingTimeout = data.pingTimeout;\n  this.onOpen();\n  // In case open handler closes socket\n  if  ('closed' == this.readyState) return;\n  this.setPing();\n\n  // Prolong liveness of socket on heartbeat\n  this.removeListener('heartbeat', this.onHeartbeat);\n  this.on('heartbeat', this.onHeartbeat);\n};\n\n/**\n * Resets ping timeout.\n *\n * @api private\n */\n\nSocket.prototype.onHeartbeat = function (timeout) {\n  clearTimeout(this.pingTimeoutTimer);\n  var self = this;\n  self.pingTimeoutTimer = setTimeout(function () {\n    if ('closed' == self.readyState) return;\n    self.onClose('ping timeout');\n  }, timeout || (self.pingInterval + self.pingTimeout));\n};\n\n/**\n * Pings server every `this.pingInterval` and expects response\n * within `this.pingTimeout` or closes connection.\n *\n * @api private\n */\n\nSocket.prototype.setPing = function () {\n  var self = this;\n  clearTimeout(self.pingIntervalTimer);\n  self.pingIntervalTimer = setTimeout(function () {\n    debug('writing ping packet - expecting pong within %sms', self.pingTimeout);\n    self.ping();\n    self.onHeartbeat(self.pingTimeout);\n  }, self.pingInterval);\n};\n\n/**\n* Sends a ping packet.\n*\n* @api public\n*/\n\nSocket.prototype.ping = function () {\n  this.sendPacket('ping');\n};\n\n/**\n * Called on `drain` event\n *\n * @api private\n */\n\nSocket.prototype.onDrain = function() {\n  for (var i = 0; i < this.prevBufferLen; i++) {\n    if (this.callbackBuffer[i]) {\n      this.callbackBuffer[i]();\n    }\n  }\n\n  this.writeBuffer.splice(0, this.prevBufferLen);\n  this.callbackBuffer.splice(0, this.prevBufferLen);\n\n  // setting prevBufferLen = 0 is very important\n  // for example, when upgrading, upgrade packet is sent over,\n  // and a nonzero prevBufferLen could cause problems on `drain`\n  this.prevBufferLen = 0;\n\n  if (this.writeBuffer.length == 0) {\n    this.emit('drain');\n  } else {\n    this.flush();\n  }\n};\n\n/**\n * Flush write buffers.\n *\n * @api private\n */\n\nSocket.prototype.flush = function () {\n  if ('closed' != this.readyState && this.transport.writable &&\n    !this.upgrading && this.writeBuffer.length) {\n    debug('flushing %d packets in socket', this.writeBuffer.length);\n    this.transport.send(this.writeBuffer);\n    // keep track of current length of writeBuffer\n    // splice writeBuffer and callbackBuffer on `drain`\n    this.prevBufferLen = this.writeBuffer.length;\n    this.emit('flush');\n  }\n};\n\n/**\n * Sends a message.\n *\n * @param {String} message.\n * @param {Function} callback function.\n * @return {Socket} for chaining.\n * @api public\n */\n\nSocket.prototype.write =\nSocket.prototype.send = function (msg, fn) {\n  this.sendPacket('message', msg, fn);\n  return this;\n};\n\n/**\n * Sends a packet.\n *\n * @param {String} packet type.\n * @param {String} data.\n * @param {Function} callback function.\n * @api private\n */\n\nSocket.prototype.sendPacket = function (type, data, fn) {\n  if ('closing' == this.readyState || 'closed' == this.readyState) {\n    return;\n  }\n\n  var packet = { type: type, data: data };\n  this.emit('packetCreate', packet);\n  this.writeBuffer.push(packet);\n  this.callbackBuffer.push(fn);\n  this.flush();\n};\n\n/**\n * Closes the connection.\n *\n * @api private\n */\n\nSocket.prototype.close = function () {\n  if ('opening' == this.readyState || 'open' == this.readyState) {\n    this.readyState = 'closing';\n\n    var self = this;\n\n    function close() {\n      self.onClose('forced close');\n      debug('socket closing - telling transport to close');\n      self.transport.close();\n    }\n\n    function cleanupAndClose() {\n      self.removeListener('upgrade', cleanupAndClose);\n      self.removeListener('upgradeError', cleanupAndClose);\n      close();\n    }\n\n    function waitForUpgrade() {\n      // wait for upgrade to finish since we can't send packets while pausing a transport\n      self.once('upgrade', cleanupAndClose);\n      self.once('upgradeError', cleanupAndClose);\n    }\n\n    if (this.writeBuffer.length) {\n      this.once('drain', function() {\n        if (this.upgrading) {\n          waitForUpgrade();\n        } else {\n          close();\n        }\n      });\n    } else if (this.upgrading) {\n      waitForUpgrade();\n    } else {\n      close();\n    }\n  }\n\n  return this;\n};\n\n/**\n * Called upon transport error\n *\n * @api private\n */\n\nSocket.prototype.onError = function (err) {\n  debug('socket error %j', err);\n  Socket.priorWebsocketSuccess = false;\n  this.emit('error', err);\n  this.onClose('transport error', err);\n};\n\n/**\n * Called upon transport close.\n *\n * @api private\n */\n\nSocket.prototype.onClose = function (reason, desc) {\n  if ('opening' == this.readyState || 'open' == this.readyState || 'closing' == this.readyState) {\n    debug('socket close with reason: \"%s\"', reason);\n    var self = this;\n\n    // clear timers\n    clearTimeout(this.pingIntervalTimer);\n    clearTimeout(this.pingTimeoutTimer);\n\n    // clean buffers in next tick, so developers can still\n    // grab the buffers on `close` event\n    setTimeout(function() {\n      self.writeBuffer = [];\n      self.callbackBuffer = [];\n      self.prevBufferLen = 0;\n    }, 0);\n\n    // stop event from firing again for transport\n    this.transport.removeAllListeners('close');\n\n    // ensure transport won't stay open\n    this.transport.close();\n\n    // ignore further transport communication\n    this.transport.removeAllListeners();\n\n    // set ready state\n    this.readyState = 'closed';\n\n    // clear session id\n    this.id = null;\n\n    // emit close event\n    this.emit('close', reason, desc);\n  }\n};\n\n/**\n * Filters upgrades, returning only those matching client transports.\n *\n * @param {Array} server upgrades\n * @api private\n *\n */\n\nSocket.prototype.filterUpgrades = function (upgrades) {\n  var filteredUpgrades = [];\n  for (var i = 0, j = upgrades.length; i<j; i++) {\n    if (~index(this.transports, upgrades[i])) filteredUpgrades.push(upgrades[i]);\n  }\n  return filteredUpgrades;\n};\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTA3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2xpYi9zb2NrZXQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciB0cmFuc3BvcnRzID0gcmVxdWlyZSgnLi90cmFuc3BvcnRzJyk7XG52YXIgRW1pdHRlciA9IHJlcXVpcmUoJ2NvbXBvbmVudC1lbWl0dGVyJyk7XG52YXIgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdlbmdpbmUuaW8tY2xpZW50OnNvY2tldCcpO1xudmFyIGluZGV4ID0gcmVxdWlyZSgnaW5kZXhvZicpO1xudmFyIHBhcnNlciA9IHJlcXVpcmUoJ2VuZ2luZS5pby1wYXJzZXInKTtcbnZhciBwYXJzZXVyaSA9IHJlcXVpcmUoJ3BhcnNldXJpJyk7XG52YXIgcGFyc2Vqc29uID0gcmVxdWlyZSgncGFyc2Vqc29uJyk7XG52YXIgcGFyc2VxcyA9IHJlcXVpcmUoJ3BhcnNlcXMnKTtcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNvY2tldDtcblxuLyoqXG4gKiBOb29wIGZ1bmN0aW9uLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIG5vb3AoKXt9XG5cbi8qKlxuICogU29ja2V0IGNvbnN0cnVjdG9yLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gdXJpIG9yIG9wdGlvbnNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIFNvY2tldCh1cmksIG9wdHMpe1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU29ja2V0KSkgcmV0dXJuIG5ldyBTb2NrZXQodXJpLCBvcHRzKTtcblxuICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICBpZiAodXJpICYmICdvYmplY3QnID09IHR5cGVvZiB1cmkpIHtcbiAgICBvcHRzID0gdXJpO1xuICAgIHVyaSA9IG51bGw7XG4gIH1cblxuICBpZiAodXJpKSB7XG4gICAgdXJpID0gcGFyc2V1cmkodXJpKTtcbiAgICBvcHRzLmhvc3QgPSB1cmkuaG9zdDtcbiAgICBvcHRzLnNlY3VyZSA9IHVyaS5wcm90b2NvbCA9PSAnaHR0cHMnIHx8IHVyaS5wcm90b2NvbCA9PSAnd3NzJztcbiAgICBvcHRzLnBvcnQgPSB1cmkucG9ydDtcbiAgICBpZiAodXJpLnF1ZXJ5KSBvcHRzLnF1ZXJ5ID0gdXJpLnF1ZXJ5O1xuICB9XG5cbiAgdGhpcy5zZWN1cmUgPSBudWxsICE9IG9wdHMuc2VjdXJlID8gb3B0cy5zZWN1cmUgOlxuICAgIChnbG9iYWwubG9jYXRpb24gJiYgJ2h0dHBzOicgPT0gbG9jYXRpb24ucHJvdG9jb2wpO1xuXG4gIGlmIChvcHRzLmhvc3QpIHtcbiAgICB2YXIgcGllY2VzID0gb3B0cy5ob3N0LnNwbGl0KCc6Jyk7XG4gICAgb3B0cy5ob3N0bmFtZSA9IHBpZWNlcy5zaGlmdCgpO1xuICAgIGlmIChwaWVjZXMubGVuZ3RoKSB7XG4gICAgICBvcHRzLnBvcnQgPSBwaWVjZXMucG9wKCk7XG4gICAgfSBlbHNlIGlmICghb3B0cy5wb3J0KSB7XG4gICAgICAvLyBpZiBubyBwb3J0IGlzIHNwZWNpZmllZCBtYW51YWxseSwgdXNlIHRoZSBwcm90b2NvbCBkZWZhdWx0XG4gICAgICBvcHRzLnBvcnQgPSB0aGlzLnNlY3VyZSA/ICc0NDMnIDogJzgwJztcbiAgICB9XG4gIH1cblxuICB0aGlzLmFnZW50ID0gb3B0cy5hZ2VudCB8fCBmYWxzZTtcbiAgdGhpcy5ob3N0bmFtZSA9IG9wdHMuaG9zdG5hbWUgfHxcbiAgICAoZ2xvYmFsLmxvY2F0aW9uID8gbG9jYXRpb24uaG9zdG5hbWUgOiAnbG9jYWxob3N0Jyk7XG4gIHRoaXMucG9ydCA9IG9wdHMucG9ydCB8fCAoZ2xvYmFsLmxvY2F0aW9uICYmIGxvY2F0aW9uLnBvcnQgP1xuICAgICAgIGxvY2F0aW9uLnBvcnQgOlxuICAgICAgICh0aGlzLnNlY3VyZSA/IDQ0MyA6IDgwKSk7XG4gIHRoaXMucXVlcnkgPSBvcHRzLnF1ZXJ5IHx8IHt9O1xuICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIHRoaXMucXVlcnkpIHRoaXMucXVlcnkgPSBwYXJzZXFzLmRlY29kZSh0aGlzLnF1ZXJ5KTtcbiAgdGhpcy51cGdyYWRlID0gZmFsc2UgIT09IG9wdHMudXBncmFkZTtcbiAgdGhpcy5wYXRoID0gKG9wdHMucGF0aCB8fCAnL2VuZ2luZS5pbycpLnJlcGxhY2UoL1xcLyQvLCAnJykgKyAnLyc7XG4gIHRoaXMuZm9yY2VKU09OUCA9ICEhb3B0cy5mb3JjZUpTT05QO1xuICB0aGlzLmpzb25wID0gZmFsc2UgIT09IG9wdHMuanNvbnA7XG4gIHRoaXMuZm9yY2VCYXNlNjQgPSAhIW9wdHMuZm9yY2VCYXNlNjQ7XG4gIHRoaXMuZW5hYmxlc1hEUiA9ICEhb3B0cy5lbmFibGVzWERSO1xuICB0aGlzLnRpbWVzdGFtcFBhcmFtID0gb3B0cy50aW1lc3RhbXBQYXJhbSB8fCAndCc7XG4gIHRoaXMudGltZXN0YW1wUmVxdWVzdHMgPSBvcHRzLnRpbWVzdGFtcFJlcXVlc3RzO1xuICB0aGlzLnRyYW5zcG9ydHMgPSBvcHRzLnRyYW5zcG9ydHMgfHwgWydwb2xsaW5nJywgJ3dlYnNvY2tldCddO1xuICB0aGlzLnJlYWR5U3RhdGUgPSAnJztcbiAgdGhpcy53cml0ZUJ1ZmZlciA9IFtdO1xuICB0aGlzLmNhbGxiYWNrQnVmZmVyID0gW107XG4gIHRoaXMucG9saWN5UG9ydCA9IG9wdHMucG9saWN5UG9ydCB8fCA4NDM7XG4gIHRoaXMucmVtZW1iZXJVcGdyYWRlID0gb3B0cy5yZW1lbWJlclVwZ3JhZGUgfHwgZmFsc2U7XG4gIHRoaXMuYmluYXJ5VHlwZSA9IG51bGw7XG4gIHRoaXMub25seUJpbmFyeVVwZ3JhZGVzID0gb3B0cy5vbmx5QmluYXJ5VXBncmFkZXM7XG5cbiAgLy8gU1NMIG9wdGlvbnMgZm9yIE5vZGUuanMgY2xpZW50XG4gIHRoaXMucGZ4ID0gb3B0cy5wZnggfHwgbnVsbDtcbiAgdGhpcy5rZXkgPSBvcHRzLmtleSB8fCBudWxsO1xuICB0aGlzLnBhc3NwaHJhc2UgPSBvcHRzLnBhc3NwaHJhc2UgfHwgbnVsbDtcbiAgdGhpcy5jZXJ0ID0gb3B0cy5jZXJ0IHx8IG51bGw7XG4gIHRoaXMuY2EgPSBvcHRzLmNhIHx8IG51bGw7XG4gIHRoaXMuY2lwaGVycyA9IG9wdHMuY2lwaGVycyB8fCBudWxsO1xuICB0aGlzLnJlamVjdFVuYXV0aG9yaXplZCA9IG9wdHMucmVqZWN0VW5hdXRob3JpemVkIHx8IG51bGw7XG5cbiAgdGhpcy5vcGVuKCk7XG59XG5cblNvY2tldC5wcmlvcldlYnNvY2tldFN1Y2Nlc3MgPSBmYWxzZTtcblxuLyoqXG4gKiBNaXggaW4gYEVtaXR0ZXJgLlxuICovXG5cbkVtaXR0ZXIoU29ja2V0LnByb3RvdHlwZSk7XG5cbi8qKlxuICogUHJvdG9jb2wgdmVyc2lvbi5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblNvY2tldC5wcm90b2NvbCA9IHBhcnNlci5wcm90b2NvbDsgLy8gdGhpcyBpcyBhbiBpbnRcblxuLyoqXG4gKiBFeHBvc2UgZGVwcyBmb3IgbGVnYWN5IGNvbXBhdGliaWxpdHlcbiAqIGFuZCBzdGFuZGFsb25lIGJyb3dzZXIgYWNjZXNzLlxuICovXG5cblNvY2tldC5Tb2NrZXQgPSBTb2NrZXQ7XG5Tb2NrZXQuVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi90cmFuc3BvcnQnKTtcblNvY2tldC50cmFuc3BvcnRzID0gcmVxdWlyZSgnLi90cmFuc3BvcnRzJyk7XG5Tb2NrZXQucGFyc2VyID0gcmVxdWlyZSgnZW5naW5lLmlvLXBhcnNlcicpO1xuXG4vKipcbiAqIENyZWF0ZXMgdHJhbnNwb3J0IG9mIHRoZSBnaXZlbiB0eXBlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0cmFuc3BvcnQgbmFtZVxuICogQHJldHVybiB7VHJhbnNwb3J0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU29ja2V0LnByb3RvdHlwZS5jcmVhdGVUcmFuc3BvcnQgPSBmdW5jdGlvbiAobmFtZSkge1xuICBkZWJ1ZygnY3JlYXRpbmcgdHJhbnNwb3J0IFwiJXNcIicsIG5hbWUpO1xuICB2YXIgcXVlcnkgPSBjbG9uZSh0aGlzLnF1ZXJ5KTtcblxuICAvLyBhcHBlbmQgZW5naW5lLmlvIHByb3RvY29sIGlkZW50aWZpZXJcbiAgcXVlcnkuRUlPID0gcGFyc2VyLnByb3RvY29sO1xuXG4gIC8vIHRyYW5zcG9ydCBuYW1lXG4gIHF1ZXJ5LnRyYW5zcG9ydCA9IG5hbWU7XG5cbiAgLy8gc2Vzc2lvbiBpZCBpZiB3ZSBhbHJlYWR5IGhhdmUgb25lXG4gIGlmICh0aGlzLmlkKSBxdWVyeS5zaWQgPSB0aGlzLmlkO1xuXG4gIHZhciB0cmFuc3BvcnQgPSBuZXcgdHJhbnNwb3J0c1tuYW1lXSh7XG4gICAgYWdlbnQ6IHRoaXMuYWdlbnQsXG4gICAgaG9zdG5hbWU6IHRoaXMuaG9zdG5hbWUsXG4gICAgcG9ydDogdGhpcy5wb3J0LFxuICAgIHNlY3VyZTogdGhpcy5zZWN1cmUsXG4gICAgcGF0aDogdGhpcy5wYXRoLFxuICAgIHF1ZXJ5OiBxdWVyeSxcbiAgICBmb3JjZUpTT05QOiB0aGlzLmZvcmNlSlNPTlAsXG4gICAganNvbnA6IHRoaXMuanNvbnAsXG4gICAgZm9yY2VCYXNlNjQ6IHRoaXMuZm9yY2VCYXNlNjQsXG4gICAgZW5hYmxlc1hEUjogdGhpcy5lbmFibGVzWERSLFxuICAgIHRpbWVzdGFtcFJlcXVlc3RzOiB0aGlzLnRpbWVzdGFtcFJlcXVlc3RzLFxuICAgIHRpbWVzdGFtcFBhcmFtOiB0aGlzLnRpbWVzdGFtcFBhcmFtLFxuICAgIHBvbGljeVBvcnQ6IHRoaXMucG9saWN5UG9ydCxcbiAgICBzb2NrZXQ6IHRoaXMsXG4gICAgcGZ4OiB0aGlzLnBmeCxcbiAgICBrZXk6IHRoaXMua2V5LFxuICAgIHBhc3NwaHJhc2U6IHRoaXMucGFzc3BocmFzZSxcbiAgICBjZXJ0OiB0aGlzLmNlcnQsXG4gICAgY2E6IHRoaXMuY2EsXG4gICAgY2lwaGVyczogdGhpcy5jaXBoZXJzLFxuICAgIHJlamVjdFVuYXV0aG9yaXplZDogdGhpcy5yZWplY3RVbmF1dGhvcml6ZWRcbiAgfSk7XG5cbiAgcmV0dXJuIHRyYW5zcG9ydDtcbn07XG5cbmZ1bmN0aW9uIGNsb25lIChvYmopIHtcbiAgdmFyIG8gPSB7fTtcbiAgZm9yICh2YXIgaSBpbiBvYmopIHtcbiAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICBvW2ldID0gb2JqW2ldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbztcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyB0cmFuc3BvcnQgdG8gdXNlIGFuZCBzdGFydHMgcHJvYmUuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblNvY2tldC5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRyYW5zcG9ydDtcbiAgaWYgKHRoaXMucmVtZW1iZXJVcGdyYWRlICYmIFNvY2tldC5wcmlvcldlYnNvY2tldFN1Y2Nlc3MgJiYgdGhpcy50cmFuc3BvcnRzLmluZGV4T2YoJ3dlYnNvY2tldCcpICE9IC0xKSB7XG4gICAgdHJhbnNwb3J0ID0gJ3dlYnNvY2tldCc7XG4gIH0gZWxzZSBpZiAoMCA9PSB0aGlzLnRyYW5zcG9ydHMubGVuZ3RoKSB7XG4gICAgLy8gRW1pdCBlcnJvciBvbiBuZXh0IHRpY2sgc28gaXQgY2FuIGJlIGxpc3RlbmVkIHRvXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgJ05vIHRyYW5zcG9ydHMgYXZhaWxhYmxlJyk7XG4gICAgfSwgMCk7XG4gICAgcmV0dXJuO1xuICB9IGVsc2Uge1xuICAgIHRyYW5zcG9ydCA9IHRoaXMudHJhbnNwb3J0c1swXTtcbiAgfVxuICB0aGlzLnJlYWR5U3RhdGUgPSAnb3BlbmluZyc7XG5cbiAgLy8gUmV0cnkgd2l0aCB0aGUgbmV4dCB0cmFuc3BvcnQgaWYgdGhlIHRyYW5zcG9ydCBpcyBkaXNhYmxlZCAoanNvbnA6IGZhbHNlKVxuICB2YXIgdHJhbnNwb3J0O1xuICB0cnkge1xuICAgIHRyYW5zcG9ydCA9IHRoaXMuY3JlYXRlVHJhbnNwb3J0KHRyYW5zcG9ydCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aGlzLnRyYW5zcG9ydHMuc2hpZnQoKTtcbiAgICB0aGlzLm9wZW4oKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cmFuc3BvcnQub3BlbigpO1xuICB0aGlzLnNldFRyYW5zcG9ydCh0cmFuc3BvcnQpO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBjdXJyZW50IHRyYW5zcG9ydC4gRGlzYWJsZXMgdGhlIGV4aXN0aW5nIG9uZSAoaWYgYW55KS5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Tb2NrZXQucHJvdG90eXBlLnNldFRyYW5zcG9ydCA9IGZ1bmN0aW9uKHRyYW5zcG9ydCl7XG4gIGRlYnVnKCdzZXR0aW5nIHRyYW5zcG9ydCAlcycsIHRyYW5zcG9ydC5uYW1lKTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIGlmICh0aGlzLnRyYW5zcG9ydCkge1xuICAgIGRlYnVnKCdjbGVhcmluZyBleGlzdGluZyB0cmFuc3BvcnQgJXMnLCB0aGlzLnRyYW5zcG9ydC5uYW1lKTtcbiAgICB0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8vIHNldCB1cCB0cmFuc3BvcnRcbiAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG5cbiAgLy8gc2V0IHVwIHRyYW5zcG9ydCBsaXN0ZW5lcnNcbiAgdHJhbnNwb3J0XG4gIC5vbignZHJhaW4nLCBmdW5jdGlvbigpe1xuICAgIHNlbGYub25EcmFpbigpO1xuICB9KVxuICAub24oJ3BhY2tldCcsIGZ1bmN0aW9uKHBhY2tldCl7XG4gICAgc2VsZi5vblBhY2tldChwYWNrZXQpO1xuICB9KVxuICAub24oJ2Vycm9yJywgZnVuY3Rpb24oZSl7XG4gICAgc2VsZi5vbkVycm9yKGUpO1xuICB9KVxuICAub24oJ2Nsb3NlJywgZnVuY3Rpb24oKXtcbiAgICBzZWxmLm9uQ2xvc2UoJ3RyYW5zcG9ydCBjbG9zZScpO1xuICB9KTtcbn07XG5cbi8qKlxuICogUHJvYmVzIGEgdHJhbnNwb3J0LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0cmFuc3BvcnQgbmFtZVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU29ja2V0LnByb3RvdHlwZS5wcm9iZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGRlYnVnKCdwcm9iaW5nIHRyYW5zcG9ydCBcIiVzXCInLCBuYW1lKTtcbiAgdmFyIHRyYW5zcG9ydCA9IHRoaXMuY3JlYXRlVHJhbnNwb3J0KG5hbWUsIHsgcHJvYmU6IDEgfSlcbiAgICAsIGZhaWxlZCA9IGZhbHNlXG4gICAgLCBzZWxmID0gdGhpcztcblxuICBTb2NrZXQucHJpb3JXZWJzb2NrZXRTdWNjZXNzID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gb25UcmFuc3BvcnRPcGVuKCl7XG4gICAgaWYgKHNlbGYub25seUJpbmFyeVVwZ3JhZGVzKSB7XG4gICAgICB2YXIgdXBncmFkZUxvc2VzQmluYXJ5ID0gIXRoaXMuc3VwcG9ydHNCaW5hcnkgJiYgc2VsZi50cmFuc3BvcnQuc3VwcG9ydHNCaW5hcnk7XG4gICAgICBmYWlsZWQgPSBmYWlsZWQgfHwgdXBncmFkZUxvc2VzQmluYXJ5O1xuICAgIH1cbiAgICBpZiAoZmFpbGVkKSByZXR1cm47XG5cbiAgICBkZWJ1ZygncHJvYmUgdHJhbnNwb3J0IFwiJXNcIiBvcGVuZWQnLCBuYW1lKTtcbiAgICB0cmFuc3BvcnQuc2VuZChbeyB0eXBlOiAncGluZycsIGRhdGE6ICdwcm9iZScgfV0pO1xuICAgIHRyYW5zcG9ydC5vbmNlKCdwYWNrZXQnLCBmdW5jdGlvbiAobXNnKSB7XG4gICAgICBpZiAoZmFpbGVkKSByZXR1cm47XG4gICAgICBpZiAoJ3BvbmcnID09IG1zZy50eXBlICYmICdwcm9iZScgPT0gbXNnLmRhdGEpIHtcbiAgICAgICAgZGVidWcoJ3Byb2JlIHRyYW5zcG9ydCBcIiVzXCIgcG9uZycsIG5hbWUpO1xuICAgICAgICBzZWxmLnVwZ3JhZGluZyA9IHRydWU7XG4gICAgICAgIHNlbGYuZW1pdCgndXBncmFkaW5nJywgdHJhbnNwb3J0KTtcbiAgICAgICAgaWYgKCF0cmFuc3BvcnQpIHJldHVybjtcbiAgICAgICAgU29ja2V0LnByaW9yV2Vic29ja2V0U3VjY2VzcyA9ICd3ZWJzb2NrZXQnID09IHRyYW5zcG9ydC5uYW1lO1xuXG4gICAgICAgIGRlYnVnKCdwYXVzaW5nIGN1cnJlbnQgdHJhbnNwb3J0IFwiJXNcIicsIHNlbGYudHJhbnNwb3J0Lm5hbWUpO1xuICAgICAgICBzZWxmLnRyYW5zcG9ydC5wYXVzZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGZhaWxlZCkgcmV0dXJuO1xuICAgICAgICAgIGlmICgnY2xvc2VkJyA9PSBzZWxmLnJlYWR5U3RhdGUpIHJldHVybjtcbiAgICAgICAgICBkZWJ1ZygnY2hhbmdpbmcgdHJhbnNwb3J0IGFuZCBzZW5kaW5nIHVwZ3JhZGUgcGFja2V0Jyk7XG5cbiAgICAgICAgICBjbGVhbnVwKCk7XG5cbiAgICAgICAgICBzZWxmLnNldFRyYW5zcG9ydCh0cmFuc3BvcnQpO1xuICAgICAgICAgIHRyYW5zcG9ydC5zZW5kKFt7IHR5cGU6ICd1cGdyYWRlJyB9XSk7XG4gICAgICAgICAgc2VsZi5lbWl0KCd1cGdyYWRlJywgdHJhbnNwb3J0KTtcbiAgICAgICAgICB0cmFuc3BvcnQgPSBudWxsO1xuICAgICAgICAgIHNlbGYudXBncmFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgc2VsZi5mbHVzaCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlYnVnKCdwcm9iZSB0cmFuc3BvcnQgXCIlc1wiIGZhaWxlZCcsIG5hbWUpO1xuICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdwcm9iZSBlcnJvcicpO1xuICAgICAgICBlcnIudHJhbnNwb3J0ID0gdHJhbnNwb3J0Lm5hbWU7XG4gICAgICAgIHNlbGYuZW1pdCgndXBncmFkZUVycm9yJywgZXJyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZyZWV6ZVRyYW5zcG9ydCgpIHtcbiAgICBpZiAoZmFpbGVkKSByZXR1cm47XG5cbiAgICAvLyBBbnkgY2FsbGJhY2sgY2FsbGVkIGJ5IHRyYW5zcG9ydCBzaG91bGQgYmUgaWdub3JlZCBzaW5jZSBub3dcbiAgICBmYWlsZWQgPSB0cnVlO1xuXG4gICAgY2xlYW51cCgpO1xuXG4gICAgdHJhbnNwb3J0LmNsb3NlKCk7XG4gICAgdHJhbnNwb3J0ID0gbnVsbDtcbiAgfVxuXG4gIC8vSGFuZGxlIGFueSBlcnJvciB0aGF0IGhhcHBlbnMgd2hpbGUgcHJvYmluZ1xuICBmdW5jdGlvbiBvbmVycm9yKGVycikge1xuICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcigncHJvYmUgZXJyb3I6ICcgKyBlcnIpO1xuICAgIGVycm9yLnRyYW5zcG9ydCA9IHRyYW5zcG9ydC5uYW1lO1xuXG4gICAgZnJlZXplVHJhbnNwb3J0KCk7XG5cbiAgICBkZWJ1ZygncHJvYmUgdHJhbnNwb3J0IFwiJXNcIiBmYWlsZWQgYmVjYXVzZSBvZiBlcnJvcjogJXMnLCBuYW1lLCBlcnIpO1xuXG4gICAgc2VsZi5lbWl0KCd1cGdyYWRlRXJyb3InLCBlcnJvcik7XG4gIH1cblxuICBmdW5jdGlvbiBvblRyYW5zcG9ydENsb3NlKCl7XG4gICAgb25lcnJvcihcInRyYW5zcG9ydCBjbG9zZWRcIik7XG4gIH1cblxuICAvL1doZW4gdGhlIHNvY2tldCBpcyBjbG9zZWQgd2hpbGUgd2UncmUgcHJvYmluZ1xuICBmdW5jdGlvbiBvbmNsb3NlKCl7XG4gICAgb25lcnJvcihcInNvY2tldCBjbG9zZWRcIik7XG4gIH1cblxuICAvL1doZW4gdGhlIHNvY2tldCBpcyB1cGdyYWRlZCB3aGlsZSB3ZSdyZSBwcm9iaW5nXG4gIGZ1bmN0aW9uIG9udXBncmFkZSh0byl7XG4gICAgaWYgKHRyYW5zcG9ydCAmJiB0by5uYW1lICE9IHRyYW5zcG9ydC5uYW1lKSB7XG4gICAgICBkZWJ1ZygnXCIlc1wiIHdvcmtzIC0gYWJvcnRpbmcgXCIlc1wiJywgdG8ubmFtZSwgdHJhbnNwb3J0Lm5hbWUpO1xuICAgICAgZnJlZXplVHJhbnNwb3J0KCk7XG4gICAgfVxuICB9XG5cbiAgLy9SZW1vdmUgYWxsIGxpc3RlbmVycyBvbiB0aGUgdHJhbnNwb3J0IGFuZCBvbiBzZWxmXG4gIGZ1bmN0aW9uIGNsZWFudXAoKXtcbiAgICB0cmFuc3BvcnQucmVtb3ZlTGlzdGVuZXIoJ29wZW4nLCBvblRyYW5zcG9ydE9wZW4pO1xuICAgIHRyYW5zcG9ydC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICB0cmFuc3BvcnQucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25UcmFuc3BvcnRDbG9zZSk7XG4gICAgc2VsZi5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBzZWxmLnJlbW92ZUxpc3RlbmVyKCd1cGdyYWRpbmcnLCBvbnVwZ3JhZGUpO1xuICB9XG5cbiAgdHJhbnNwb3J0Lm9uY2UoJ29wZW4nLCBvblRyYW5zcG9ydE9wZW4pO1xuICB0cmFuc3BvcnQub25jZSgnZXJyb3InLCBvbmVycm9yKTtcbiAgdHJhbnNwb3J0Lm9uY2UoJ2Nsb3NlJywgb25UcmFuc3BvcnRDbG9zZSk7XG5cbiAgdGhpcy5vbmNlKCdjbG9zZScsIG9uY2xvc2UpO1xuICB0aGlzLm9uY2UoJ3VwZ3JhZGluZycsIG9udXBncmFkZSk7XG5cbiAgdHJhbnNwb3J0Lm9wZW4oKTtcblxufTtcblxuLyoqXG4gKiBDYWxsZWQgd2hlbiBjb25uZWN0aW9uIGlzIGRlZW1lZCBvcGVuLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuU29ja2V0LnByb3RvdHlwZS5vbk9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gIGRlYnVnKCdzb2NrZXQgb3BlbicpO1xuICB0aGlzLnJlYWR5U3RhdGUgPSAnb3Blbic7XG4gIFNvY2tldC5wcmlvcldlYnNvY2tldFN1Y2Nlc3MgPSAnd2Vic29ja2V0JyA9PSB0aGlzLnRyYW5zcG9ydC5uYW1lO1xuICB0aGlzLmVtaXQoJ29wZW4nKTtcbiAgdGhpcy5mbHVzaCgpO1xuXG4gIC8vIHdlIGNoZWNrIGZvciBgcmVhZHlTdGF0ZWAgaW4gY2FzZSBhbiBgb3BlbmBcbiAgLy8gbGlzdGVuZXIgYWxyZWFkeSBjbG9zZWQgdGhlIHNvY2tldFxuICBpZiAoJ29wZW4nID09IHRoaXMucmVhZHlTdGF0ZSAmJiB0aGlzLnVwZ3JhZGUgJiYgdGhpcy50cmFuc3BvcnQucGF1c2UpIHtcbiAgICBkZWJ1Zygnc3RhcnRpbmcgdXBncmFkZSBwcm9iZXMnKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMudXBncmFkZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB0aGlzLnByb2JlKHRoaXMudXBncmFkZXNbaV0pO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBIYW5kbGVzIGEgcGFja2V0LlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNvY2tldC5wcm90b3R5cGUub25QYWNrZXQgPSBmdW5jdGlvbiAocGFja2V0KSB7XG4gIGlmICgnb3BlbmluZycgPT0gdGhpcy5yZWFkeVN0YXRlIHx8ICdvcGVuJyA9PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICBkZWJ1Zygnc29ja2V0IHJlY2VpdmU6IHR5cGUgXCIlc1wiLCBkYXRhIFwiJXNcIicsIHBhY2tldC50eXBlLCBwYWNrZXQuZGF0YSk7XG5cbiAgICB0aGlzLmVtaXQoJ3BhY2tldCcsIHBhY2tldCk7XG5cbiAgICAvLyBTb2NrZXQgaXMgbGl2ZSAtIGFueSBwYWNrZXQgY291bnRzXG4gICAgdGhpcy5lbWl0KCdoZWFydGJlYXQnKTtcblxuICAgIHN3aXRjaCAocGFja2V0LnR5cGUpIHtcbiAgICAgIGNhc2UgJ29wZW4nOlxuICAgICAgICB0aGlzLm9uSGFuZHNoYWtlKHBhcnNlanNvbihwYWNrZXQuZGF0YSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncG9uZyc6XG4gICAgICAgIHRoaXMuc2V0UGluZygpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdzZXJ2ZXIgZXJyb3InKTtcbiAgICAgICAgZXJyLmNvZGUgPSBwYWNrZXQuZGF0YTtcbiAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdtZXNzYWdlJzpcbiAgICAgICAgdGhpcy5lbWl0KCdkYXRhJywgcGFja2V0LmRhdGEpO1xuICAgICAgICB0aGlzLmVtaXQoJ21lc3NhZ2UnLCBwYWNrZXQuZGF0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWJ1ZygncGFja2V0IHJlY2VpdmVkIHdpdGggc29ja2V0IHJlYWR5U3RhdGUgXCIlc1wiJywgdGhpcy5yZWFkeVN0YXRlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDYWxsZWQgdXBvbiBoYW5kc2hha2UgY29tcGxldGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaGFuZHNoYWtlIG9ialxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU29ja2V0LnByb3RvdHlwZS5vbkhhbmRzaGFrZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHRoaXMuZW1pdCgnaGFuZHNoYWtlJywgZGF0YSk7XG4gIHRoaXMuaWQgPSBkYXRhLnNpZDtcbiAgdGhpcy50cmFuc3BvcnQucXVlcnkuc2lkID0gZGF0YS5zaWQ7XG4gIHRoaXMudXBncmFkZXMgPSB0aGlzLmZpbHRlclVwZ3JhZGVzKGRhdGEudXBncmFkZXMpO1xuICB0aGlzLnBpbmdJbnRlcnZhbCA9IGRhdGEucGluZ0ludGVydmFsO1xuICB0aGlzLnBpbmdUaW1lb3V0ID0gZGF0YS5waW5nVGltZW91dDtcbiAgdGhpcy5vbk9wZW4oKTtcbiAgLy8gSW4gY2FzZSBvcGVuIGhhbmRsZXIgY2xvc2VzIHNvY2tldFxuICBpZiAgKCdjbG9zZWQnID09IHRoaXMucmVhZHlTdGF0ZSkgcmV0dXJuO1xuICB0aGlzLnNldFBpbmcoKTtcblxuICAvLyBQcm9sb25nIGxpdmVuZXNzIG9mIHNvY2tldCBvbiBoZWFydGJlYXRcbiAgdGhpcy5yZW1vdmVMaXN0ZW5lcignaGVhcnRiZWF0JywgdGhpcy5vbkhlYXJ0YmVhdCk7XG4gIHRoaXMub24oJ2hlYXJ0YmVhdCcsIHRoaXMub25IZWFydGJlYXQpO1xufTtcblxuLyoqXG4gKiBSZXNldHMgcGluZyB0aW1lb3V0LlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNvY2tldC5wcm90b3R5cGUub25IZWFydGJlYXQgPSBmdW5jdGlvbiAodGltZW91dCkge1xuICBjbGVhclRpbWVvdXQodGhpcy5waW5nVGltZW91dFRpbWVyKTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLnBpbmdUaW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoJ2Nsb3NlZCcgPT0gc2VsZi5yZWFkeVN0YXRlKSByZXR1cm47XG4gICAgc2VsZi5vbkNsb3NlKCdwaW5nIHRpbWVvdXQnKTtcbiAgfSwgdGltZW91dCB8fCAoc2VsZi5waW5nSW50ZXJ2YWwgKyBzZWxmLnBpbmdUaW1lb3V0KSk7XG59O1xuXG4vKipcbiAqIFBpbmdzIHNlcnZlciBldmVyeSBgdGhpcy5waW5nSW50ZXJ2YWxgIGFuZCBleHBlY3RzIHJlc3BvbnNlXG4gKiB3aXRoaW4gYHRoaXMucGluZ1RpbWVvdXRgIG9yIGNsb3NlcyBjb25uZWN0aW9uLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNvY2tldC5wcm90b3R5cGUuc2V0UGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBjbGVhclRpbWVvdXQoc2VsZi5waW5nSW50ZXJ2YWxUaW1lcik7XG4gIHNlbGYucGluZ0ludGVydmFsVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBkZWJ1Zygnd3JpdGluZyBwaW5nIHBhY2tldCAtIGV4cGVjdGluZyBwb25nIHdpdGhpbiAlc21zJywgc2VsZi5waW5nVGltZW91dCk7XG4gICAgc2VsZi5waW5nKCk7XG4gICAgc2VsZi5vbkhlYXJ0YmVhdChzZWxmLnBpbmdUaW1lb3V0KTtcbiAgfSwgc2VsZi5waW5nSW50ZXJ2YWwpO1xufTtcblxuLyoqXG4qIFNlbmRzIGEgcGluZyBwYWNrZXQuXG4qXG4qIEBhcGkgcHVibGljXG4qL1xuXG5Tb2NrZXQucHJvdG90eXBlLnBpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc2VuZFBhY2tldCgncGluZycpO1xufTtcblxuLyoqXG4gKiBDYWxsZWQgb24gYGRyYWluYCBldmVudFxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNvY2tldC5wcm90b3R5cGUub25EcmFpbiA9IGZ1bmN0aW9uKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucHJldkJ1ZmZlckxlbjsgaSsrKSB7XG4gICAgaWYgKHRoaXMuY2FsbGJhY2tCdWZmZXJbaV0pIHtcbiAgICAgIHRoaXMuY2FsbGJhY2tCdWZmZXJbaV0oKTtcbiAgICB9XG4gIH1cblxuICB0aGlzLndyaXRlQnVmZmVyLnNwbGljZSgwLCB0aGlzLnByZXZCdWZmZXJMZW4pO1xuICB0aGlzLmNhbGxiYWNrQnVmZmVyLnNwbGljZSgwLCB0aGlzLnByZXZCdWZmZXJMZW4pO1xuXG4gIC8vIHNldHRpbmcgcHJldkJ1ZmZlckxlbiA9IDAgaXMgdmVyeSBpbXBvcnRhbnRcbiAgLy8gZm9yIGV4YW1wbGUsIHdoZW4gdXBncmFkaW5nLCB1cGdyYWRlIHBhY2tldCBpcyBzZW50IG92ZXIsXG4gIC8vIGFuZCBhIG5vbnplcm8gcHJldkJ1ZmZlckxlbiBjb3VsZCBjYXVzZSBwcm9ibGVtcyBvbiBgZHJhaW5gXG4gIHRoaXMucHJldkJ1ZmZlckxlbiA9IDA7XG5cbiAgaWYgKHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoID09IDApIHtcbiAgICB0aGlzLmVtaXQoJ2RyYWluJyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5mbHVzaCgpO1xuICB9XG59O1xuXG4vKipcbiAqIEZsdXNoIHdyaXRlIGJ1ZmZlcnMuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU29ja2V0LnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCdjbG9zZWQnICE9IHRoaXMucmVhZHlTdGF0ZSAmJiB0aGlzLnRyYW5zcG9ydC53cml0YWJsZSAmJlxuICAgICF0aGlzLnVwZ3JhZGluZyAmJiB0aGlzLndyaXRlQnVmZmVyLmxlbmd0aCkge1xuICAgIGRlYnVnKCdmbHVzaGluZyAlZCBwYWNrZXRzIGluIHNvY2tldCcsIHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoKTtcbiAgICB0aGlzLnRyYW5zcG9ydC5zZW5kKHRoaXMud3JpdGVCdWZmZXIpO1xuICAgIC8vIGtlZXAgdHJhY2sgb2YgY3VycmVudCBsZW5ndGggb2Ygd3JpdGVCdWZmZXJcbiAgICAvLyBzcGxpY2Ugd3JpdGVCdWZmZXIgYW5kIGNhbGxiYWNrQnVmZmVyIG9uIGBkcmFpbmBcbiAgICB0aGlzLnByZXZCdWZmZXJMZW4gPSB0aGlzLndyaXRlQnVmZmVyLmxlbmd0aDtcbiAgICB0aGlzLmVtaXQoJ2ZsdXNoJyk7XG4gIH1cbn07XG5cbi8qKlxuICogU2VuZHMgYSBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtTb2NrZXR9IGZvciBjaGFpbmluZy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuU29ja2V0LnByb3RvdHlwZS53cml0ZSA9XG5Tb2NrZXQucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbiAobXNnLCBmbikge1xuICB0aGlzLnNlbmRQYWNrZXQoJ21lc3NhZ2UnLCBtc2csIGZuKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNlbmRzIGEgcGFja2V0LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYWNrZXQgdHlwZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24uXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Tb2NrZXQucHJvdG90eXBlLnNlbmRQYWNrZXQgPSBmdW5jdGlvbiAodHlwZSwgZGF0YSwgZm4pIHtcbiAgaWYgKCdjbG9zaW5nJyA9PSB0aGlzLnJlYWR5U3RhdGUgfHwgJ2Nsb3NlZCcgPT0gdGhpcy5yZWFkeVN0YXRlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBhY2tldCA9IHsgdHlwZTogdHlwZSwgZGF0YTogZGF0YSB9O1xuICB0aGlzLmVtaXQoJ3BhY2tldENyZWF0ZScsIHBhY2tldCk7XG4gIHRoaXMud3JpdGVCdWZmZXIucHVzaChwYWNrZXQpO1xuICB0aGlzLmNhbGxiYWNrQnVmZmVyLnB1c2goZm4pO1xuICB0aGlzLmZsdXNoKCk7XG59O1xuXG4vKipcbiAqIENsb3NlcyB0aGUgY29ubmVjdGlvbi5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Tb2NrZXQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKCkge1xuICBpZiAoJ29wZW5pbmcnID09IHRoaXMucmVhZHlTdGF0ZSB8fCAnb3BlbicgPT0gdGhpcy5yZWFkeVN0YXRlKSB7XG4gICAgdGhpcy5yZWFkeVN0YXRlID0gJ2Nsb3NpbmcnO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgZnVuY3Rpb24gY2xvc2UoKSB7XG4gICAgICBzZWxmLm9uQ2xvc2UoJ2ZvcmNlZCBjbG9zZScpO1xuICAgICAgZGVidWcoJ3NvY2tldCBjbG9zaW5nIC0gdGVsbGluZyB0cmFuc3BvcnQgdG8gY2xvc2UnKTtcbiAgICAgIHNlbGYudHJhbnNwb3J0LmNsb3NlKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYW51cEFuZENsb3NlKCkge1xuICAgICAgc2VsZi5yZW1vdmVMaXN0ZW5lcigndXBncmFkZScsIGNsZWFudXBBbmRDbG9zZSk7XG4gICAgICBzZWxmLnJlbW92ZUxpc3RlbmVyKCd1cGdyYWRlRXJyb3InLCBjbGVhbnVwQW5kQ2xvc2UpO1xuICAgICAgY2xvc2UoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3YWl0Rm9yVXBncmFkZSgpIHtcbiAgICAgIC8vIHdhaXQgZm9yIHVwZ3JhZGUgdG8gZmluaXNoIHNpbmNlIHdlIGNhbid0IHNlbmQgcGFja2V0cyB3aGlsZSBwYXVzaW5nIGEgdHJhbnNwb3J0XG4gICAgICBzZWxmLm9uY2UoJ3VwZ3JhZGUnLCBjbGVhbnVwQW5kQ2xvc2UpO1xuICAgICAgc2VsZi5vbmNlKCd1cGdyYWRlRXJyb3InLCBjbGVhbnVwQW5kQ2xvc2UpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLndyaXRlQnVmZmVyLmxlbmd0aCkge1xuICAgICAgdGhpcy5vbmNlKCdkcmFpbicsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy51cGdyYWRpbmcpIHtcbiAgICAgICAgICB3YWl0Rm9yVXBncmFkZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy51cGdyYWRpbmcpIHtcbiAgICAgIHdhaXRGb3JVcGdyYWRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENhbGxlZCB1cG9uIHRyYW5zcG9ydCBlcnJvclxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNvY2tldC5wcm90b3R5cGUub25FcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgZGVidWcoJ3NvY2tldCBlcnJvciAlaicsIGVycik7XG4gIFNvY2tldC5wcmlvcldlYnNvY2tldFN1Y2Nlc3MgPSBmYWxzZTtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gIHRoaXMub25DbG9zZSgndHJhbnNwb3J0IGVycm9yJywgZXJyKTtcbn07XG5cbi8qKlxuICogQ2FsbGVkIHVwb24gdHJhbnNwb3J0IGNsb3NlLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNvY2tldC5wcm90b3R5cGUub25DbG9zZSA9IGZ1bmN0aW9uIChyZWFzb24sIGRlc2MpIHtcbiAgaWYgKCdvcGVuaW5nJyA9PSB0aGlzLnJlYWR5U3RhdGUgfHwgJ29wZW4nID09IHRoaXMucmVhZHlTdGF0ZSB8fCAnY2xvc2luZycgPT0gdGhpcy5yZWFkeVN0YXRlKSB7XG4gICAgZGVidWcoJ3NvY2tldCBjbG9zZSB3aXRoIHJlYXNvbjogXCIlc1wiJywgcmVhc29uKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBjbGVhciB0aW1lcnNcbiAgICBjbGVhclRpbWVvdXQodGhpcy5waW5nSW50ZXJ2YWxUaW1lcik7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMucGluZ1RpbWVvdXRUaW1lcik7XG5cbiAgICAvLyBjbGVhbiBidWZmZXJzIGluIG5leHQgdGljaywgc28gZGV2ZWxvcGVycyBjYW4gc3RpbGxcbiAgICAvLyBncmFiIHRoZSBidWZmZXJzIG9uIGBjbG9zZWAgZXZlbnRcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi53cml0ZUJ1ZmZlciA9IFtdO1xuICAgICAgc2VsZi5jYWxsYmFja0J1ZmZlciA9IFtdO1xuICAgICAgc2VsZi5wcmV2QnVmZmVyTGVuID0gMDtcbiAgICB9LCAwKTtcblxuICAgIC8vIHN0b3AgZXZlbnQgZnJvbSBmaXJpbmcgYWdhaW4gZm9yIHRyYW5zcG9ydFxuICAgIHRoaXMudHJhbnNwb3J0LnJlbW92ZUFsbExpc3RlbmVycygnY2xvc2UnKTtcblxuICAgIC8vIGVuc3VyZSB0cmFuc3BvcnQgd29uJ3Qgc3RheSBvcGVuXG4gICAgdGhpcy50cmFuc3BvcnQuY2xvc2UoKTtcblxuICAgIC8vIGlnbm9yZSBmdXJ0aGVyIHRyYW5zcG9ydCBjb21tdW5pY2F0aW9uXG4gICAgdGhpcy50cmFuc3BvcnQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG5cbiAgICAvLyBzZXQgcmVhZHkgc3RhdGVcbiAgICB0aGlzLnJlYWR5U3RhdGUgPSAnY2xvc2VkJztcblxuICAgIC8vIGNsZWFyIHNlc3Npb24gaWRcbiAgICB0aGlzLmlkID0gbnVsbDtcblxuICAgIC8vIGVtaXQgY2xvc2UgZXZlbnRcbiAgICB0aGlzLmVtaXQoJ2Nsb3NlJywgcmVhc29uLCBkZXNjKTtcbiAgfVxufTtcblxuLyoqXG4gKiBGaWx0ZXJzIHVwZ3JhZGVzLCByZXR1cm5pbmcgb25seSB0aG9zZSBtYXRjaGluZyBjbGllbnQgdHJhbnNwb3J0cy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBzZXJ2ZXIgdXBncmFkZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICpcbiAqL1xuXG5Tb2NrZXQucHJvdG90eXBlLmZpbHRlclVwZ3JhZGVzID0gZnVuY3Rpb24gKHVwZ3JhZGVzKSB7XG4gIHZhciBmaWx0ZXJlZFVwZ3JhZGVzID0gW107XG4gIGZvciAodmFyIGkgPSAwLCBqID0gdXBncmFkZXMubGVuZ3RoOyBpPGo7IGkrKykge1xuICAgIGlmICh+aW5kZXgodGhpcy50cmFuc3BvcnRzLCB1cGdyYWRlc1tpXSkpIGZpbHRlcmVkVXBncmFkZXMucHVzaCh1cGdyYWRlc1tpXSk7XG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkVXBncmFkZXM7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2VuZ2luZS5pby1jbGllbnQvbGliL3NvY2tldC5qc1xuLy8gbW9kdWxlIGlkID0gNTA3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 508 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(global) {/**\n * Module dependencies\n */\n\nvar XMLHttpRequest = __webpack_require__(509);\nvar XHR = __webpack_require__(512);\nvar JSONP = __webpack_require__(529);\nvar websocket = __webpack_require__(530);\n\n/**\n * Export transports.\n */\n\nexports.polling = polling;\nexports.websocket = websocket;\n\n/**\n * Polling transport polymorphic constructor.\n * Decides on xhr vs jsonp based on feature detection.\n *\n * @api private\n */\n\nfunction polling(opts){\n  var xhr;\n  var xd = false;\n  var xs = false;\n  var jsonp = false !== opts.jsonp;\n\n  if (global.location) {\n    var isSSL = 'https:' == location.protocol;\n    var port = location.port;\n\n    // some user agents have empty `location.port`\n    if (!port) {\n      port = isSSL ? 443 : 80;\n    }\n\n    xd = opts.hostname != location.hostname || port != opts.port;\n    xs = opts.secure != isSSL;\n  }\n\n  opts.xdomain = xd;\n  opts.xscheme = xs;\n  xhr = new XMLHttpRequest(opts);\n\n  if ('open' in xhr && !opts.forceJSONP) {\n    return new XHR(opts);\n  } else {\n    if (!jsonp) throw new Error('JSONP disabled');\n    return new JSONP(opts);\n  }\n}\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTA4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2xpYi90cmFuc3BvcnRzL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llc1xuICovXG5cbnZhciBYTUxIdHRwUmVxdWVzdCA9IHJlcXVpcmUoJ3htbGh0dHByZXF1ZXN0Jyk7XG52YXIgWEhSID0gcmVxdWlyZSgnLi9wb2xsaW5nLXhocicpO1xudmFyIEpTT05QID0gcmVxdWlyZSgnLi9wb2xsaW5nLWpzb25wJyk7XG52YXIgd2Vic29ja2V0ID0gcmVxdWlyZSgnLi93ZWJzb2NrZXQnKTtcblxuLyoqXG4gKiBFeHBvcnQgdHJhbnNwb3J0cy5cbiAqL1xuXG5leHBvcnRzLnBvbGxpbmcgPSBwb2xsaW5nO1xuZXhwb3J0cy53ZWJzb2NrZXQgPSB3ZWJzb2NrZXQ7XG5cbi8qKlxuICogUG9sbGluZyB0cmFuc3BvcnQgcG9seW1vcnBoaWMgY29uc3RydWN0b3IuXG4gKiBEZWNpZGVzIG9uIHhociB2cyBqc29ucCBiYXNlZCBvbiBmZWF0dXJlIGRldGVjdGlvbi5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwb2xsaW5nKG9wdHMpe1xuICB2YXIgeGhyO1xuICB2YXIgeGQgPSBmYWxzZTtcbiAgdmFyIHhzID0gZmFsc2U7XG4gIHZhciBqc29ucCA9IGZhbHNlICE9PSBvcHRzLmpzb25wO1xuXG4gIGlmIChnbG9iYWwubG9jYXRpb24pIHtcbiAgICB2YXIgaXNTU0wgPSAnaHR0cHM6JyA9PSBsb2NhdGlvbi5wcm90b2NvbDtcbiAgICB2YXIgcG9ydCA9IGxvY2F0aW9uLnBvcnQ7XG5cbiAgICAvLyBzb21lIHVzZXIgYWdlbnRzIGhhdmUgZW1wdHkgYGxvY2F0aW9uLnBvcnRgXG4gICAgaWYgKCFwb3J0KSB7XG4gICAgICBwb3J0ID0gaXNTU0wgPyA0NDMgOiA4MDtcbiAgICB9XG5cbiAgICB4ZCA9IG9wdHMuaG9zdG5hbWUgIT0gbG9jYXRpb24uaG9zdG5hbWUgfHwgcG9ydCAhPSBvcHRzLnBvcnQ7XG4gICAgeHMgPSBvcHRzLnNlY3VyZSAhPSBpc1NTTDtcbiAgfVxuXG4gIG9wdHMueGRvbWFpbiA9IHhkO1xuICBvcHRzLnhzY2hlbWUgPSB4cztcbiAgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KG9wdHMpO1xuXG4gIGlmICgnb3BlbicgaW4geGhyICYmICFvcHRzLmZvcmNlSlNPTlApIHtcbiAgICByZXR1cm4gbmV3IFhIUihvcHRzKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWpzb25wKSB0aHJvdyBuZXcgRXJyb3IoJ0pTT05QIGRpc2FibGVkJyk7XG4gICAgcmV0dXJuIG5ldyBKU09OUChvcHRzKTtcbiAgfVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2VuZ2luZS5pby1jbGllbnQvbGliL3RyYW5zcG9ydHMvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDUwOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 509 */
/***/ function(module, exports, __webpack_require__) {

    eval("// browser shim for xmlhttprequest module\nvar hasCORS = __webpack_require__(510);\n\nmodule.exports = function(opts) {\n  var xdomain = opts.xdomain;\n\n  // scheme must be same when usign XDomainRequest\n  // http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx\n  var xscheme = opts.xscheme;\n\n  // XDomainRequest has a flow of not sending cookie, therefore it should be disabled as a default.\n  // https://github.com/Automattic/engine.io-client/pull/217\n  var enablesXDR = opts.enablesXDR;\n\n  // XMLHttpRequest can be disabled on IE\n  try {\n    if ('undefined' != typeof XMLHttpRequest && (!xdomain || hasCORS)) {\n      return new XMLHttpRequest();\n    }\n  } catch (e) { }\n\n  // Use XDomainRequest for IE8 if enablesXDR is true\n  // because loading bar keeps flashing when using jsonp-polling\n  // https://github.com/yujiosaka/socke.io-ie8-loading-example\n  try {\n    if ('undefined' != typeof XDomainRequest && !xscheme && enablesXDR) {\n      return new XDomainRequest();\n    }\n  } catch (e) { }\n\n  if (!xdomain) {\n    try {\n      return new ActiveXObject('Microsoft.XMLHTTP');\n    } catch(e) { }\n  }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTA5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2xpYi94bWxodHRwcmVxdWVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBicm93c2VyIHNoaW0gZm9yIHhtbGh0dHByZXF1ZXN0IG1vZHVsZVxudmFyIGhhc0NPUlMgPSByZXF1aXJlKCdoYXMtY29ycycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9wdHMpIHtcbiAgdmFyIHhkb21haW4gPSBvcHRzLnhkb21haW47XG5cbiAgLy8gc2NoZW1lIG11c3QgYmUgc2FtZSB3aGVuIHVzaWduIFhEb21haW5SZXF1ZXN0XG4gIC8vIGh0dHA6Ly9ibG9ncy5tc2RuLmNvbS9iL2llaW50ZXJuYWxzL2FyY2hpdmUvMjAxMC8wNS8xMy94ZG9tYWlucmVxdWVzdC1yZXN0cmljdGlvbnMtbGltaXRhdGlvbnMtYW5kLXdvcmthcm91bmRzLmFzcHhcbiAgdmFyIHhzY2hlbWUgPSBvcHRzLnhzY2hlbWU7XG5cbiAgLy8gWERvbWFpblJlcXVlc3QgaGFzIGEgZmxvdyBvZiBub3Qgc2VuZGluZyBjb29raWUsIHRoZXJlZm9yZSBpdCBzaG91bGQgYmUgZGlzYWJsZWQgYXMgYSBkZWZhdWx0LlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vQXV0b21hdHRpYy9lbmdpbmUuaW8tY2xpZW50L3B1bGwvMjE3XG4gIHZhciBlbmFibGVzWERSID0gb3B0cy5lbmFibGVzWERSO1xuXG4gIC8vIFhNTEh0dHBSZXF1ZXN0IGNhbiBiZSBkaXNhYmxlZCBvbiBJRVxuICB0cnkge1xuICAgIGlmICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgWE1MSHR0cFJlcXVlc3QgJiYgKCF4ZG9tYWluIHx8IGhhc0NPUlMpKSB7XG4gICAgICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7IH1cblxuICAvLyBVc2UgWERvbWFpblJlcXVlc3QgZm9yIElFOCBpZiBlbmFibGVzWERSIGlzIHRydWVcbiAgLy8gYmVjYXVzZSBsb2FkaW5nIGJhciBrZWVwcyBmbGFzaGluZyB3aGVuIHVzaW5nIGpzb25wLXBvbGxpbmdcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3l1amlvc2FrYS9zb2NrZS5pby1pZTgtbG9hZGluZy1leGFtcGxlXG4gIHRyeSB7XG4gICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBYRG9tYWluUmVxdWVzdCAmJiAheHNjaGVtZSAmJiBlbmFibGVzWERSKSB7XG4gICAgICByZXR1cm4gbmV3IFhEb21haW5SZXF1ZXN0KCk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7IH1cblxuICBpZiAoIXhkb21haW4pIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MSFRUUCcpO1xuICAgIH0gY2F0Y2goZSkgeyB9XG4gIH1cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9lbmdpbmUuaW8tY2xpZW50L2xpYi94bWxodHRwcmVxdWVzdC5qc1xuLy8gbW9kdWxlIGlkID0gNTA5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 510 */
/***/ function(module, exports, __webpack_require__) {

    eval("\n/**\n * Module dependencies.\n */\n\nvar global = __webpack_require__(511);\n\n/**\n * Module exports.\n *\n * Logic borrowed from Modernizr:\n *\n *   - https://github.com/Modernizr/Modernizr/blob/master/feature-detects/cors.js\n */\n\ntry {\n  module.exports = 'XMLHttpRequest' in global &&\n    'withCredentials' in new global.XMLHttpRequest();\n} catch (err) {\n  // if XMLHttp support is disabled in IE then it will throw\n  // when trying to create\n  module.exports = false;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTEwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9oYXMtY29ycy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnZ2xvYmFsJyk7XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKlxuICogTG9naWMgYm9ycm93ZWQgZnJvbSBNb2Rlcm5penI6XG4gKlxuICogICAtIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2Rlcm5penIvTW9kZXJuaXpyL2Jsb2IvbWFzdGVyL2ZlYXR1cmUtZGV0ZWN0cy9jb3JzLmpzXG4gKi9cblxudHJ5IHtcbiAgbW9kdWxlLmV4cG9ydHMgPSAnWE1MSHR0cFJlcXVlc3QnIGluIGdsb2JhbCAmJlxuICAgICd3aXRoQ3JlZGVudGlhbHMnIGluIG5ldyBnbG9iYWwuWE1MSHR0cFJlcXVlc3QoKTtcbn0gY2F0Y2ggKGVycikge1xuICAvLyBpZiBYTUxIdHRwIHN1cHBvcnQgaXMgZGlzYWJsZWQgaW4gSUUgdGhlbiBpdCB3aWxsIHRocm93XG4gIC8vIHdoZW4gdHJ5aW5nIHRvIGNyZWF0ZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZhbHNlO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2hhcy1jb3JzL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA1MTBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 511 */
/***/ function(module, exports) {

    eval("\n/**\n * Returns `this`. Execute this without a \"context\" (i.e. without it being\n * attached to an object of the left-hand side), and `this` points to the\n * \"global\" scope of the current JS execution.\n */\n\nmodule.exports = (function () { return this; })();\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTExLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9nbG9iYWwvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIFJldHVybnMgYHRoaXNgLiBFeGVjdXRlIHRoaXMgd2l0aG91dCBhIFwiY29udGV4dFwiIChpLmUuIHdpdGhvdXQgaXQgYmVpbmdcbiAqIGF0dGFjaGVkIHRvIGFuIG9iamVjdCBvZiB0aGUgbGVmdC1oYW5kIHNpZGUpLCBhbmQgYHRoaXNgIHBvaW50cyB0byB0aGVcbiAqIFwiZ2xvYmFsXCIgc2NvcGUgb2YgdGhlIGN1cnJlbnQgSlMgZXhlY3V0aW9uLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0pKCk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZ2xvYmFsL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA1MTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 512 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(global) {/**\n * Module requirements.\n */\n\nvar XMLHttpRequest = __webpack_require__(509);\nvar Polling = __webpack_require__(513);\nvar Emitter = __webpack_require__(501);\nvar inherit = __webpack_require__(525);\nvar debug = __webpack_require__(526)('engine.io-client:polling-xhr');\n\n/**\n * Module exports.\n */\n\nmodule.exports = XHR;\nmodule.exports.Request = Request;\n\n/**\n * Empty function\n */\n\nfunction empty(){}\n\n/**\n * XHR Polling constructor.\n *\n * @param {Object} opts\n * @api public\n */\n\nfunction XHR(opts){\n  Polling.call(this, opts);\n\n  if (global.location) {\n    var isSSL = 'https:' == location.protocol;\n    var port = location.port;\n\n    // some user agents have empty `location.port`\n    if (!port) {\n      port = isSSL ? 443 : 80;\n    }\n\n    this.xd = opts.hostname != global.location.hostname ||\n      port != opts.port;\n    this.xs = opts.secure != isSSL;\n  }\n}\n\n/**\n * Inherits from Polling.\n */\n\ninherit(XHR, Polling);\n\n/**\n * XHR supports binary\n */\n\nXHR.prototype.supportsBinary = true;\n\n/**\n * Creates a request.\n *\n * @param {String} method\n * @api private\n */\n\nXHR.prototype.request = function(opts){\n  opts = opts || {};\n  opts.uri = this.uri();\n  opts.xd = this.xd;\n  opts.xs = this.xs;\n  opts.agent = this.agent || false;\n  opts.supportsBinary = this.supportsBinary;\n  opts.enablesXDR = this.enablesXDR;\n\n  // SSL options for Node.js client\n  opts.pfx = this.pfx;\n  opts.key = this.key;\n  opts.passphrase = this.passphrase;\n  opts.cert = this.cert;\n  opts.ca = this.ca;\n  opts.ciphers = this.ciphers;\n  opts.rejectUnauthorized = this.rejectUnauthorized;\n\n  return new Request(opts);\n};\n\n/**\n * Sends data.\n *\n * @param {String} data to send.\n * @param {Function} called upon flush.\n * @api private\n */\n\nXHR.prototype.doWrite = function(data, fn){\n  var isBinary = typeof data !== 'string' && data !== undefined;\n  var req = this.request({ method: 'POST', data: data, isBinary: isBinary });\n  var self = this;\n  req.on('success', fn);\n  req.on('error', function(err){\n    self.onError('xhr post error', err);\n  });\n  this.sendXhr = req;\n};\n\n/**\n * Starts a poll cycle.\n *\n * @api private\n */\n\nXHR.prototype.doPoll = function(){\n  debug('xhr poll');\n  var req = this.request();\n  var self = this;\n  req.on('data', function(data){\n    self.onData(data);\n  });\n  req.on('error', function(err){\n    self.onError('xhr poll error', err);\n  });\n  this.pollXhr = req;\n};\n\n/**\n * Request constructor\n *\n * @param {Object} options\n * @api public\n */\n\nfunction Request(opts){\n  this.method = opts.method || 'GET';\n  this.uri = opts.uri;\n  this.xd = !!opts.xd;\n  this.xs = !!opts.xs;\n  this.async = false !== opts.async;\n  this.data = undefined != opts.data ? opts.data : null;\n  this.agent = opts.agent;\n  this.isBinary = opts.isBinary;\n  this.supportsBinary = opts.supportsBinary;\n  this.enablesXDR = opts.enablesXDR;\n\n  // SSL options for Node.js client\n  this.pfx = opts.pfx;\n  this.key = opts.key;\n  this.passphrase = opts.passphrase;\n  this.cert = opts.cert;\n  this.ca = opts.ca;\n  this.ciphers = opts.ciphers;\n  this.rejectUnauthorized = opts.rejectUnauthorized;\n\n  this.create();\n}\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Request.prototype);\n\n/**\n * Creates the XHR object and sends the request.\n *\n * @api private\n */\n\nRequest.prototype.create = function(){\n  var opts = { agent: this.agent, xdomain: this.xd, xscheme: this.xs, enablesXDR: this.enablesXDR };\n\n  // SSL options for Node.js client\n  opts.pfx = this.pfx;\n  opts.key = this.key;\n  opts.passphrase = this.passphrase;\n  opts.cert = this.cert;\n  opts.ca = this.ca;\n  opts.ciphers = this.ciphers;\n  opts.rejectUnauthorized = this.rejectUnauthorized;\n\n  var xhr = this.xhr = new XMLHttpRequest(opts);\n  var self = this;\n\n  try {\n    debug('xhr open %s: %s', this.method, this.uri);\n    xhr.open(this.method, this.uri, this.async);\n    if (this.supportsBinary) {\n      // This has to be done after open because Firefox is stupid\n      // http://stackoverflow.com/questions/13216903/get-binary-data-with-xmlhttprequest-in-a-firefox-extension\n      xhr.responseType = 'arraybuffer';\n    }\n\n    if ('POST' == this.method) {\n      try {\n        if (this.isBinary) {\n          xhr.setRequestHeader('Content-type', 'application/octet-stream');\n        } else {\n          xhr.setRequestHeader('Content-type', 'text/plain;charset=UTF-8');\n        }\n      } catch (e) {}\n    }\n\n    // ie6 check\n    if ('withCredentials' in xhr) {\n      xhr.withCredentials = true;\n    }\n\n    if (this.hasXDR()) {\n      xhr.onload = function(){\n        self.onLoad();\n      };\n      xhr.onerror = function(){\n        self.onError(xhr.responseText);\n      };\n    } else {\n      xhr.onreadystatechange = function(){\n        if (4 != xhr.readyState) return;\n        if (200 == xhr.status || 1223 == xhr.status) {\n          self.onLoad();\n        } else {\n          // make sure the `error` event handler that's user-set\n          // does not throw in the same tick and gets caught here\n          setTimeout(function(){\n            self.onError(xhr.status);\n          }, 0);\n        }\n      };\n    }\n\n    debug('xhr data %s', this.data);\n    xhr.send(this.data);\n  } catch (e) {\n    // Need to defer since .create() is called directly fhrom the constructor\n    // and thus the 'error' event can only be only bound *after* this exception\n    // occurs.  Therefore, also, we cannot throw here at all.\n    setTimeout(function() {\n      self.onError(e);\n    }, 0);\n    return;\n  }\n\n  if (global.document) {\n    this.index = Request.requestsCount++;\n    Request.requests[this.index] = this;\n  }\n};\n\n/**\n * Called upon successful response.\n *\n * @api private\n */\n\nRequest.prototype.onSuccess = function(){\n  this.emit('success');\n  this.cleanup();\n};\n\n/**\n * Called if we have data.\n *\n * @api private\n */\n\nRequest.prototype.onData = function(data){\n  this.emit('data', data);\n  this.onSuccess();\n};\n\n/**\n * Called upon error.\n *\n * @api private\n */\n\nRequest.prototype.onError = function(err){\n  this.emit('error', err);\n  this.cleanup(true);\n};\n\n/**\n * Cleans up house.\n *\n * @api private\n */\n\nRequest.prototype.cleanup = function(fromError){\n  if ('undefined' == typeof this.xhr || null === this.xhr) {\n    return;\n  }\n  // xmlhttprequest\n  if (this.hasXDR()) {\n    this.xhr.onload = this.xhr.onerror = empty;\n  } else {\n    this.xhr.onreadystatechange = empty;\n  }\n\n  if (fromError) {\n    try {\n      this.xhr.abort();\n    } catch(e) {}\n  }\n\n  if (global.document) {\n    delete Request.requests[this.index];\n  }\n\n  this.xhr = null;\n};\n\n/**\n * Called upon load.\n *\n * @api private\n */\n\nRequest.prototype.onLoad = function(){\n  var data;\n  try {\n    var contentType;\n    try {\n      contentType = this.xhr.getResponseHeader('Content-Type').split(';')[0];\n    } catch (e) {}\n    if (contentType === 'application/octet-stream') {\n      data = this.xhr.response;\n    } else {\n      if (!this.supportsBinary) {\n        data = this.xhr.responseText;\n      } else {\n        data = 'ok';\n      }\n    }\n  } catch (e) {\n    this.onError(e);\n  }\n  if (null != data) {\n    this.onData(data);\n  }\n};\n\n/**\n * Check if it has XDomainRequest.\n *\n * @api private\n */\n\nRequest.prototype.hasXDR = function(){\n  return 'undefined' !== typeof global.XDomainRequest && !this.xs && this.enablesXDR;\n};\n\n/**\n * Aborts the request.\n *\n * @api public\n */\n\nRequest.prototype.abort = function(){\n  this.cleanup();\n};\n\n/**\n * Aborts pending requests when unloading the window. This is needed to prevent\n * memory leaks (e.g. when using IE) and to ensure that no spurious error is\n * emitted.\n */\n\nif (global.document) {\n  Request.requestsCount = 0;\n  Request.requests = {};\n  if (global.attachEvent) {\n    global.attachEvent('onunload', unloadHandler);\n  } else if (global.addEventListener) {\n    global.addEventListener('beforeunload', unloadHandler, false);\n  }\n}\n\nfunction unloadHandler() {\n  for (var i in Request.requests) {\n    if (Request.requests.hasOwnProperty(i)) {\n      Request.requests[i].abort();\n    }\n  }\n}\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTEyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2xpYi90cmFuc3BvcnRzL3BvbGxpbmcteGhyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTW9kdWxlIHJlcXVpcmVtZW50cy5cbiAqL1xuXG52YXIgWE1MSHR0cFJlcXVlc3QgPSByZXF1aXJlKCd4bWxodHRwcmVxdWVzdCcpO1xudmFyIFBvbGxpbmcgPSByZXF1aXJlKCcuL3BvbGxpbmcnKTtcbnZhciBFbWl0dGVyID0gcmVxdWlyZSgnY29tcG9uZW50LWVtaXR0ZXInKTtcbnZhciBpbmhlcml0ID0gcmVxdWlyZSgnY29tcG9uZW50LWluaGVyaXQnKTtcbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ2VuZ2luZS5pby1jbGllbnQ6cG9sbGluZy14aHInKTtcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFhIUjtcbm1vZHVsZS5leHBvcnRzLlJlcXVlc3QgPSBSZXF1ZXN0O1xuXG4vKipcbiAqIEVtcHR5IGZ1bmN0aW9uXG4gKi9cblxuZnVuY3Rpb24gZW1wdHkoKXt9XG5cbi8qKlxuICogWEhSIFBvbGxpbmcgY29uc3RydWN0b3IuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gWEhSKG9wdHMpe1xuICBQb2xsaW5nLmNhbGwodGhpcywgb3B0cyk7XG5cbiAgaWYgKGdsb2JhbC5sb2NhdGlvbikge1xuICAgIHZhciBpc1NTTCA9ICdodHRwczonID09IGxvY2F0aW9uLnByb3RvY29sO1xuICAgIHZhciBwb3J0ID0gbG9jYXRpb24ucG9ydDtcblxuICAgIC8vIHNvbWUgdXNlciBhZ2VudHMgaGF2ZSBlbXB0eSBgbG9jYXRpb24ucG9ydGBcbiAgICBpZiAoIXBvcnQpIHtcbiAgICAgIHBvcnQgPSBpc1NTTCA/IDQ0MyA6IDgwO1xuICAgIH1cblxuICAgIHRoaXMueGQgPSBvcHRzLmhvc3RuYW1lICE9IGdsb2JhbC5sb2NhdGlvbi5ob3N0bmFtZSB8fFxuICAgICAgcG9ydCAhPSBvcHRzLnBvcnQ7XG4gICAgdGhpcy54cyA9IG9wdHMuc2VjdXJlICE9IGlzU1NMO1xuICB9XG59XG5cbi8qKlxuICogSW5oZXJpdHMgZnJvbSBQb2xsaW5nLlxuICovXG5cbmluaGVyaXQoWEhSLCBQb2xsaW5nKTtcblxuLyoqXG4gKiBYSFIgc3VwcG9ydHMgYmluYXJ5XG4gKi9cblxuWEhSLnByb3RvdHlwZS5zdXBwb3J0c0JpbmFyeSA9IHRydWU7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZFxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuWEhSLnByb3RvdHlwZS5yZXF1ZXN0ID0gZnVuY3Rpb24ob3B0cyl7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuICBvcHRzLnVyaSA9IHRoaXMudXJpKCk7XG4gIG9wdHMueGQgPSB0aGlzLnhkO1xuICBvcHRzLnhzID0gdGhpcy54cztcbiAgb3B0cy5hZ2VudCA9IHRoaXMuYWdlbnQgfHwgZmFsc2U7XG4gIG9wdHMuc3VwcG9ydHNCaW5hcnkgPSB0aGlzLnN1cHBvcnRzQmluYXJ5O1xuICBvcHRzLmVuYWJsZXNYRFIgPSB0aGlzLmVuYWJsZXNYRFI7XG5cbiAgLy8gU1NMIG9wdGlvbnMgZm9yIE5vZGUuanMgY2xpZW50XG4gIG9wdHMucGZ4ID0gdGhpcy5wZng7XG4gIG9wdHMua2V5ID0gdGhpcy5rZXk7XG4gIG9wdHMucGFzc3BocmFzZSA9IHRoaXMucGFzc3BocmFzZTtcbiAgb3B0cy5jZXJ0ID0gdGhpcy5jZXJ0O1xuICBvcHRzLmNhID0gdGhpcy5jYTtcbiAgb3B0cy5jaXBoZXJzID0gdGhpcy5jaXBoZXJzO1xuICBvcHRzLnJlamVjdFVuYXV0aG9yaXplZCA9IHRoaXMucmVqZWN0VW5hdXRob3JpemVkO1xuXG4gIHJldHVybiBuZXcgUmVxdWVzdChvcHRzKTtcbn07XG5cbi8qKlxuICogU2VuZHMgZGF0YS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZGF0YSB0byBzZW5kLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGVkIHVwb24gZmx1c2guXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5YSFIucHJvdG90eXBlLmRvV3JpdGUgPSBmdW5jdGlvbihkYXRhLCBmbil7XG4gIHZhciBpc0JpbmFyeSA9IHR5cGVvZiBkYXRhICE9PSAnc3RyaW5nJyAmJiBkYXRhICE9PSB1bmRlZmluZWQ7XG4gIHZhciByZXEgPSB0aGlzLnJlcXVlc3QoeyBtZXRob2Q6ICdQT1NUJywgZGF0YTogZGF0YSwgaXNCaW5hcnk6IGlzQmluYXJ5IH0pO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHJlcS5vbignc3VjY2VzcycsIGZuKTtcbiAgcmVxLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycil7XG4gICAgc2VsZi5vbkVycm9yKCd4aHIgcG9zdCBlcnJvcicsIGVycik7XG4gIH0pO1xuICB0aGlzLnNlbmRYaHIgPSByZXE7XG59O1xuXG4vKipcbiAqIFN0YXJ0cyBhIHBvbGwgY3ljbGUuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuWEhSLnByb3RvdHlwZS5kb1BvbGwgPSBmdW5jdGlvbigpe1xuICBkZWJ1ZygneGhyIHBvbGwnKTtcbiAgdmFyIHJlcSA9IHRoaXMucmVxdWVzdCgpO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHJlcS5vbignZGF0YScsIGZ1bmN0aW9uKGRhdGEpe1xuICAgIHNlbGYub25EYXRhKGRhdGEpO1xuICB9KTtcbiAgcmVxLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycil7XG4gICAgc2VsZi5vbkVycm9yKCd4aHIgcG9sbCBlcnJvcicsIGVycik7XG4gIH0pO1xuICB0aGlzLnBvbGxYaHIgPSByZXE7XG59O1xuXG4vKipcbiAqIFJlcXVlc3QgY29uc3RydWN0b3JcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBSZXF1ZXN0KG9wdHMpe1xuICB0aGlzLm1ldGhvZCA9IG9wdHMubWV0aG9kIHx8ICdHRVQnO1xuICB0aGlzLnVyaSA9IG9wdHMudXJpO1xuICB0aGlzLnhkID0gISFvcHRzLnhkO1xuICB0aGlzLnhzID0gISFvcHRzLnhzO1xuICB0aGlzLmFzeW5jID0gZmFsc2UgIT09IG9wdHMuYXN5bmM7XG4gIHRoaXMuZGF0YSA9IHVuZGVmaW5lZCAhPSBvcHRzLmRhdGEgPyBvcHRzLmRhdGEgOiBudWxsO1xuICB0aGlzLmFnZW50ID0gb3B0cy5hZ2VudDtcbiAgdGhpcy5pc0JpbmFyeSA9IG9wdHMuaXNCaW5hcnk7XG4gIHRoaXMuc3VwcG9ydHNCaW5hcnkgPSBvcHRzLnN1cHBvcnRzQmluYXJ5O1xuICB0aGlzLmVuYWJsZXNYRFIgPSBvcHRzLmVuYWJsZXNYRFI7XG5cbiAgLy8gU1NMIG9wdGlvbnMgZm9yIE5vZGUuanMgY2xpZW50XG4gIHRoaXMucGZ4ID0gb3B0cy5wZng7XG4gIHRoaXMua2V5ID0gb3B0cy5rZXk7XG4gIHRoaXMucGFzc3BocmFzZSA9IG9wdHMucGFzc3BocmFzZTtcbiAgdGhpcy5jZXJ0ID0gb3B0cy5jZXJ0O1xuICB0aGlzLmNhID0gb3B0cy5jYTtcbiAgdGhpcy5jaXBoZXJzID0gb3B0cy5jaXBoZXJzO1xuICB0aGlzLnJlamVjdFVuYXV0aG9yaXplZCA9IG9wdHMucmVqZWN0VW5hdXRob3JpemVkO1xuXG4gIHRoaXMuY3JlYXRlKCk7XG59XG5cbi8qKlxuICogTWl4IGluIGBFbWl0dGVyYC5cbiAqL1xuXG5FbWl0dGVyKFJlcXVlc3QucHJvdG90eXBlKTtcblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBYSFIgb2JqZWN0IGFuZCBzZW5kcyB0aGUgcmVxdWVzdC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbigpe1xuICB2YXIgb3B0cyA9IHsgYWdlbnQ6IHRoaXMuYWdlbnQsIHhkb21haW46IHRoaXMueGQsIHhzY2hlbWU6IHRoaXMueHMsIGVuYWJsZXNYRFI6IHRoaXMuZW5hYmxlc1hEUiB9O1xuXG4gIC8vIFNTTCBvcHRpb25zIGZvciBOb2RlLmpzIGNsaWVudFxuICBvcHRzLnBmeCA9IHRoaXMucGZ4O1xuICBvcHRzLmtleSA9IHRoaXMua2V5O1xuICBvcHRzLnBhc3NwaHJhc2UgPSB0aGlzLnBhc3NwaHJhc2U7XG4gIG9wdHMuY2VydCA9IHRoaXMuY2VydDtcbiAgb3B0cy5jYSA9IHRoaXMuY2E7XG4gIG9wdHMuY2lwaGVycyA9IHRoaXMuY2lwaGVycztcbiAgb3B0cy5yZWplY3RVbmF1dGhvcml6ZWQgPSB0aGlzLnJlamVjdFVuYXV0aG9yaXplZDtcblxuICB2YXIgeGhyID0gdGhpcy54aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3Qob3B0cyk7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICB0cnkge1xuICAgIGRlYnVnKCd4aHIgb3BlbiAlczogJXMnLCB0aGlzLm1ldGhvZCwgdGhpcy51cmkpO1xuICAgIHhoci5vcGVuKHRoaXMubWV0aG9kLCB0aGlzLnVyaSwgdGhpcy5hc3luYyk7XG4gICAgaWYgKHRoaXMuc3VwcG9ydHNCaW5hcnkpIHtcbiAgICAgIC8vIFRoaXMgaGFzIHRvIGJlIGRvbmUgYWZ0ZXIgb3BlbiBiZWNhdXNlIEZpcmVmb3ggaXMgc3R1cGlkXG4gICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEzMjE2OTAzL2dldC1iaW5hcnktZGF0YS13aXRoLXhtbGh0dHByZXF1ZXN0LWluLWEtZmlyZWZveC1leHRlbnNpb25cbiAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInO1xuICAgIH1cblxuICAgIGlmICgnUE9TVCcgPT0gdGhpcy5tZXRob2QpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aGlzLmlzQmluYXJ5KSB7XG4gICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC10eXBlJywgJ3RleHQvcGxhaW47Y2hhcnNldD1VVEYtOCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH1cblxuICAgIC8vIGllNiBjaGVja1xuICAgIGlmICgnd2l0aENyZWRlbnRpYWxzJyBpbiB4aHIpIHtcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc1hEUigpKSB7XG4gICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKXtcbiAgICAgICAgc2VsZi5vbkxvYWQoKTtcbiAgICAgIH07XG4gICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIHNlbGYub25FcnJvcih4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpe1xuICAgICAgICBpZiAoNCAhPSB4aHIucmVhZHlTdGF0ZSkgcmV0dXJuO1xuICAgICAgICBpZiAoMjAwID09IHhoci5zdGF0dXMgfHwgMTIyMyA9PSB4aHIuc3RhdHVzKSB7XG4gICAgICAgICAgc2VsZi5vbkxvYWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGBlcnJvcmAgZXZlbnQgaGFuZGxlciB0aGF0J3MgdXNlci1zZXRcbiAgICAgICAgICAvLyBkb2VzIG5vdCB0aHJvdyBpbiB0aGUgc2FtZSB0aWNrIGFuZCBnZXRzIGNhdWdodCBoZXJlXG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgICAgICAgc2VsZi5vbkVycm9yKHhoci5zdGF0dXMpO1xuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIGRlYnVnKCd4aHIgZGF0YSAlcycsIHRoaXMuZGF0YSk7XG4gICAgeGhyLnNlbmQodGhpcy5kYXRhKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIE5lZWQgdG8gZGVmZXIgc2luY2UgLmNyZWF0ZSgpIGlzIGNhbGxlZCBkaXJlY3RseSBmaHJvbSB0aGUgY29uc3RydWN0b3JcbiAgICAvLyBhbmQgdGh1cyB0aGUgJ2Vycm9yJyBldmVudCBjYW4gb25seSBiZSBvbmx5IGJvdW5kICphZnRlciogdGhpcyBleGNlcHRpb25cbiAgICAvLyBvY2N1cnMuICBUaGVyZWZvcmUsIGFsc28sIHdlIGNhbm5vdCB0aHJvdyBoZXJlIGF0IGFsbC5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vbkVycm9yKGUpO1xuICAgIH0sIDApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChnbG9iYWwuZG9jdW1lbnQpIHtcbiAgICB0aGlzLmluZGV4ID0gUmVxdWVzdC5yZXF1ZXN0c0NvdW50Kys7XG4gICAgUmVxdWVzdC5yZXF1ZXN0c1t0aGlzLmluZGV4XSA9IHRoaXM7XG4gIH1cbn07XG5cbi8qKlxuICogQ2FsbGVkIHVwb24gc3VjY2Vzc2Z1bCByZXNwb25zZS5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5vblN1Y2Nlc3MgPSBmdW5jdGlvbigpe1xuICB0aGlzLmVtaXQoJ3N1Y2Nlc3MnKTtcbiAgdGhpcy5jbGVhbnVwKCk7XG59O1xuXG4vKipcbiAqIENhbGxlZCBpZiB3ZSBoYXZlIGRhdGEuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUub25EYXRhID0gZnVuY3Rpb24oZGF0YSl7XG4gIHRoaXMuZW1pdCgnZGF0YScsIGRhdGEpO1xuICB0aGlzLm9uU3VjY2VzcygpO1xufTtcblxuLyoqXG4gKiBDYWxsZWQgdXBvbiBlcnJvci5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24oZXJyKXtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gIHRoaXMuY2xlYW51cCh0cnVlKTtcbn07XG5cbi8qKlxuICogQ2xlYW5zIHVwIGhvdXNlLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNsZWFudXAgPSBmdW5jdGlvbihmcm9tRXJyb3Ipe1xuICBpZiAoJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIHRoaXMueGhyIHx8IG51bGwgPT09IHRoaXMueGhyKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIHhtbGh0dHByZXF1ZXN0XG4gIGlmICh0aGlzLmhhc1hEUigpKSB7XG4gICAgdGhpcy54aHIub25sb2FkID0gdGhpcy54aHIub25lcnJvciA9IGVtcHR5O1xuICB9IGVsc2Uge1xuICAgIHRoaXMueGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGVtcHR5O1xuICB9XG5cbiAgaWYgKGZyb21FcnJvcikge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnhoci5hYm9ydCgpO1xuICAgIH0gY2F0Y2goZSkge31cbiAgfVxuXG4gIGlmIChnbG9iYWwuZG9jdW1lbnQpIHtcbiAgICBkZWxldGUgUmVxdWVzdC5yZXF1ZXN0c1t0aGlzLmluZGV4XTtcbiAgfVxuXG4gIHRoaXMueGhyID0gbnVsbDtcbn07XG5cbi8qKlxuICogQ2FsbGVkIHVwb24gbG9hZC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5vbkxvYWQgPSBmdW5jdGlvbigpe1xuICB2YXIgZGF0YTtcbiAgdHJ5IHtcbiAgICB2YXIgY29udGVudFR5cGU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnRlbnRUeXBlID0gdGhpcy54aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0NvbnRlbnQtVHlwZScpLnNwbGl0KCc7JylbMF07XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICBpZiAoY29udGVudFR5cGUgPT09ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKSB7XG4gICAgICBkYXRhID0gdGhpcy54aHIucmVzcG9uc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghdGhpcy5zdXBwb3J0c0JpbmFyeSkge1xuICAgICAgICBkYXRhID0gdGhpcy54aHIucmVzcG9uc2VUZXh0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YSA9ICdvayc7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgdGhpcy5vbkVycm9yKGUpO1xuICB9XG4gIGlmIChudWxsICE9IGRhdGEpIHtcbiAgICB0aGlzLm9uRGF0YShkYXRhKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGVjayBpZiBpdCBoYXMgWERvbWFpblJlcXVlc3QuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuaGFzWERSID0gZnVuY3Rpb24oKXtcbiAgcmV0dXJuICd1bmRlZmluZWQnICE9PSB0eXBlb2YgZ2xvYmFsLlhEb21haW5SZXF1ZXN0ICYmICF0aGlzLnhzICYmIHRoaXMuZW5hYmxlc1hEUjtcbn07XG5cbi8qKlxuICogQWJvcnRzIHRoZSByZXF1ZXN0LlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuYWJvcnQgPSBmdW5jdGlvbigpe1xuICB0aGlzLmNsZWFudXAoKTtcbn07XG5cbi8qKlxuICogQWJvcnRzIHBlbmRpbmcgcmVxdWVzdHMgd2hlbiB1bmxvYWRpbmcgdGhlIHdpbmRvdy4gVGhpcyBpcyBuZWVkZWQgdG8gcHJldmVudFxuICogbWVtb3J5IGxlYWtzIChlLmcuIHdoZW4gdXNpbmcgSUUpIGFuZCB0byBlbnN1cmUgdGhhdCBubyBzcHVyaW91cyBlcnJvciBpc1xuICogZW1pdHRlZC5cbiAqL1xuXG5pZiAoZ2xvYmFsLmRvY3VtZW50KSB7XG4gIFJlcXVlc3QucmVxdWVzdHNDb3VudCA9IDA7XG4gIFJlcXVlc3QucmVxdWVzdHMgPSB7fTtcbiAgaWYgKGdsb2JhbC5hdHRhY2hFdmVudCkge1xuICAgIGdsb2JhbC5hdHRhY2hFdmVudCgnb251bmxvYWQnLCB1bmxvYWRIYW5kbGVyKTtcbiAgfSBlbHNlIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCB1bmxvYWRIYW5kbGVyLCBmYWxzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5sb2FkSGFuZGxlcigpIHtcbiAgZm9yICh2YXIgaSBpbiBSZXF1ZXN0LnJlcXVlc3RzKSB7XG4gICAgaWYgKFJlcXVlc3QucmVxdWVzdHMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgIFJlcXVlc3QucmVxdWVzdHNbaV0uYWJvcnQoKTtcbiAgICB9XG4gIH1cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9lbmdpbmUuaW8tY2xpZW50L2xpYi90cmFuc3BvcnRzL3BvbGxpbmcteGhyLmpzXG4vLyBtb2R1bGUgaWQgPSA1MTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 513 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Module dependencies.\n */\n\nvar Transport = __webpack_require__(514);\nvar parseqs = __webpack_require__(524);\nvar parser = __webpack_require__(515);\nvar inherit = __webpack_require__(525);\nvar debug = __webpack_require__(526)('engine.io-client:polling');\n\n/**\n * Module exports.\n */\n\nmodule.exports = Polling;\n\n/**\n * Is XHR2 supported?\n */\n\nvar hasXHR2 = (function() {\n  var XMLHttpRequest = __webpack_require__(509);\n  var xhr = new XMLHttpRequest({ xdomain: false });\n  return null != xhr.responseType;\n})();\n\n/**\n * Polling interface.\n *\n * @param {Object} opts\n * @api private\n */\n\nfunction Polling(opts){\n  var forceBase64 = (opts && opts.forceBase64);\n  if (!hasXHR2 || forceBase64) {\n    this.supportsBinary = false;\n  }\n  Transport.call(this, opts);\n}\n\n/**\n * Inherits from Transport.\n */\n\ninherit(Polling, Transport);\n\n/**\n * Transport name.\n */\n\nPolling.prototype.name = 'polling';\n\n/**\n * Opens the socket (triggers polling). We write a PING message to determine\n * when the transport is open.\n *\n * @api private\n */\n\nPolling.prototype.doOpen = function(){\n  this.poll();\n};\n\n/**\n * Pauses polling.\n *\n * @param {Function} callback upon buffers are flushed and transport is paused\n * @api private\n */\n\nPolling.prototype.pause = function(onPause){\n  var pending = 0;\n  var self = this;\n\n  this.readyState = 'pausing';\n\n  function pause(){\n    debug('paused');\n    self.readyState = 'paused';\n    onPause();\n  }\n\n  if (this.polling || !this.writable) {\n    var total = 0;\n\n    if (this.polling) {\n      debug('we are currently polling - waiting to pause');\n      total++;\n      this.once('pollComplete', function(){\n        debug('pre-pause polling complete');\n        --total || pause();\n      });\n    }\n\n    if (!this.writable) {\n      debug('we are currently writing - waiting to pause');\n      total++;\n      this.once('drain', function(){\n        debug('pre-pause writing complete');\n        --total || pause();\n      });\n    }\n  } else {\n    pause();\n  }\n};\n\n/**\n * Starts polling cycle.\n *\n * @api public\n */\n\nPolling.prototype.poll = function(){\n  debug('polling');\n  this.polling = true;\n  this.doPoll();\n  this.emit('poll');\n};\n\n/**\n * Overloads onData to detect payloads.\n *\n * @api private\n */\n\nPolling.prototype.onData = function(data){\n  var self = this;\n  debug('polling got data %s', data);\n  var callback = function(packet, index, total) {\n    // if its the first message we consider the transport open\n    if ('opening' == self.readyState) {\n      self.onOpen();\n    }\n\n    // if its a close packet, we close the ongoing requests\n    if ('close' == packet.type) {\n      self.onClose();\n      return false;\n    }\n\n    // otherwise bypass onData and handle the message\n    self.onPacket(packet);\n  };\n\n  // decode payload\n  parser.decodePayload(data, this.socket.binaryType, callback);\n\n  // if an event did not trigger closing\n  if ('closed' != this.readyState) {\n    // if we got data we're not polling\n    this.polling = false;\n    this.emit('pollComplete');\n\n    if ('open' == this.readyState) {\n      this.poll();\n    } else {\n      debug('ignoring poll - transport state \"%s\"', this.readyState);\n    }\n  }\n};\n\n/**\n * For polling, send a close packet.\n *\n * @api private\n */\n\nPolling.prototype.doClose = function(){\n  var self = this;\n\n  function close(){\n    debug('writing close packet');\n    self.write([{ type: 'close' }]);\n  }\n\n  if ('open' == this.readyState) {\n    debug('transport open - closing');\n    close();\n  } else {\n    // in case we're trying to close while\n    // handshaking is in progress (GH-164)\n    debug('transport not open - deferring close');\n    this.once('open', close);\n  }\n};\n\n/**\n * Writes a packets payload.\n *\n * @param {Array} data packets\n * @param {Function} drain callback\n * @api private\n */\n\nPolling.prototype.write = function(packets){\n  var self = this;\n  this.writable = false;\n  var callbackfn = function() {\n    self.writable = true;\n    self.emit('drain');\n  };\n\n  var self = this;\n  parser.encodePayload(packets, this.supportsBinary, function(data) {\n    self.doWrite(data, callbackfn);\n  });\n};\n\n/**\n * Generates uri for connection.\n *\n * @api private\n */\n\nPolling.prototype.uri = function(){\n  var query = this.query || {};\n  var schema = this.secure ? 'https' : 'http';\n  var port = '';\n\n  // cache busting is forced\n  if (false !== this.timestampRequests) {\n    query[this.timestampParam] = +new Date + '-' + Transport.timestamps++;\n  }\n\n  if (!this.supportsBinary && !query.sid) {\n    query.b64 = 1;\n  }\n\n  query = parseqs.encode(query);\n\n  // avoid port if default for schema\n  if (this.port && (('https' == schema && this.port != 443) ||\n     ('http' == schema && this.port != 80))) {\n    port = ':' + this.port;\n  }\n\n  // prepend ? to query\n  if (query.length) {\n    query = '?' + query;\n  }\n\n  return schema + '://' + this.hostname + port + this.path + query;\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTEzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2xpYi90cmFuc3BvcnRzL3BvbGxpbmcuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciBUcmFuc3BvcnQgPSByZXF1aXJlKCcuLi90cmFuc3BvcnQnKTtcbnZhciBwYXJzZXFzID0gcmVxdWlyZSgncGFyc2VxcycpO1xudmFyIHBhcnNlciA9IHJlcXVpcmUoJ2VuZ2luZS5pby1wYXJzZXInKTtcbnZhciBpbmhlcml0ID0gcmVxdWlyZSgnY29tcG9uZW50LWluaGVyaXQnKTtcbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ2VuZ2luZS5pby1jbGllbnQ6cG9sbGluZycpO1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gUG9sbGluZztcblxuLyoqXG4gKiBJcyBYSFIyIHN1cHBvcnRlZD9cbiAqL1xuXG52YXIgaGFzWEhSMiA9IChmdW5jdGlvbigpIHtcbiAgdmFyIFhNTEh0dHBSZXF1ZXN0ID0gcmVxdWlyZSgneG1saHR0cHJlcXVlc3QnKTtcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCh7IHhkb21haW46IGZhbHNlIH0pO1xuICByZXR1cm4gbnVsbCAhPSB4aHIucmVzcG9uc2VUeXBlO1xufSkoKTtcblxuLyoqXG4gKiBQb2xsaW5nIGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gUG9sbGluZyhvcHRzKXtcbiAgdmFyIGZvcmNlQmFzZTY0ID0gKG9wdHMgJiYgb3B0cy5mb3JjZUJhc2U2NCk7XG4gIGlmICghaGFzWEhSMiB8fCBmb3JjZUJhc2U2NCkge1xuICAgIHRoaXMuc3VwcG9ydHNCaW5hcnkgPSBmYWxzZTtcbiAgfVxuICBUcmFuc3BvcnQuY2FsbCh0aGlzLCBvcHRzKTtcbn1cblxuLyoqXG4gKiBJbmhlcml0cyBmcm9tIFRyYW5zcG9ydC5cbiAqL1xuXG5pbmhlcml0KFBvbGxpbmcsIFRyYW5zcG9ydCk7XG5cbi8qKlxuICogVHJhbnNwb3J0IG5hbWUuXG4gKi9cblxuUG9sbGluZy5wcm90b3R5cGUubmFtZSA9ICdwb2xsaW5nJztcblxuLyoqXG4gKiBPcGVucyB0aGUgc29ja2V0ICh0cmlnZ2VycyBwb2xsaW5nKS4gV2Ugd3JpdGUgYSBQSU5HIG1lc3NhZ2UgdG8gZGV0ZXJtaW5lXG4gKiB3aGVuIHRoZSB0cmFuc3BvcnQgaXMgb3Blbi5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Qb2xsaW5nLnByb3RvdHlwZS5kb09wZW4gPSBmdW5jdGlvbigpe1xuICB0aGlzLnBvbGwoKTtcbn07XG5cbi8qKlxuICogUGF1c2VzIHBvbGxpbmcuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgdXBvbiBidWZmZXJzIGFyZSBmbHVzaGVkIGFuZCB0cmFuc3BvcnQgaXMgcGF1c2VkXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Qb2xsaW5nLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKG9uUGF1c2Upe1xuICB2YXIgcGVuZGluZyA9IDA7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICB0aGlzLnJlYWR5U3RhdGUgPSAncGF1c2luZyc7XG5cbiAgZnVuY3Rpb24gcGF1c2UoKXtcbiAgICBkZWJ1ZygncGF1c2VkJyk7XG4gICAgc2VsZi5yZWFkeVN0YXRlID0gJ3BhdXNlZCc7XG4gICAgb25QYXVzZSgpO1xuICB9XG5cbiAgaWYgKHRoaXMucG9sbGluZyB8fCAhdGhpcy53cml0YWJsZSkge1xuICAgIHZhciB0b3RhbCA9IDA7XG5cbiAgICBpZiAodGhpcy5wb2xsaW5nKSB7XG4gICAgICBkZWJ1Zygnd2UgYXJlIGN1cnJlbnRseSBwb2xsaW5nIC0gd2FpdGluZyB0byBwYXVzZScpO1xuICAgICAgdG90YWwrKztcbiAgICAgIHRoaXMub25jZSgncG9sbENvbXBsZXRlJywgZnVuY3Rpb24oKXtcbiAgICAgICAgZGVidWcoJ3ByZS1wYXVzZSBwb2xsaW5nIGNvbXBsZXRlJyk7XG4gICAgICAgIC0tdG90YWwgfHwgcGF1c2UoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghdGhpcy53cml0YWJsZSkge1xuICAgICAgZGVidWcoJ3dlIGFyZSBjdXJyZW50bHkgd3JpdGluZyAtIHdhaXRpbmcgdG8gcGF1c2UnKTtcbiAgICAgIHRvdGFsKys7XG4gICAgICB0aGlzLm9uY2UoJ2RyYWluJywgZnVuY3Rpb24oKXtcbiAgICAgICAgZGVidWcoJ3ByZS1wYXVzZSB3cml0aW5nIGNvbXBsZXRlJyk7XG4gICAgICAgIC0tdG90YWwgfHwgcGF1c2UoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBwYXVzZSgpO1xuICB9XG59O1xuXG4vKipcbiAqIFN0YXJ0cyBwb2xsaW5nIGN5Y2xlLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUG9sbGluZy5wcm90b3R5cGUucG9sbCA9IGZ1bmN0aW9uKCl7XG4gIGRlYnVnKCdwb2xsaW5nJyk7XG4gIHRoaXMucG9sbGluZyA9IHRydWU7XG4gIHRoaXMuZG9Qb2xsKCk7XG4gIHRoaXMuZW1pdCgncG9sbCcpO1xufTtcblxuLyoqXG4gKiBPdmVybG9hZHMgb25EYXRhIHRvIGRldGVjdCBwYXlsb2Fkcy5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Qb2xsaW5nLnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbihkYXRhKXtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBkZWJ1ZygncG9sbGluZyBnb3QgZGF0YSAlcycsIGRhdGEpO1xuICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbihwYWNrZXQsIGluZGV4LCB0b3RhbCkge1xuICAgIC8vIGlmIGl0cyB0aGUgZmlyc3QgbWVzc2FnZSB3ZSBjb25zaWRlciB0aGUgdHJhbnNwb3J0IG9wZW5cbiAgICBpZiAoJ29wZW5pbmcnID09IHNlbGYucmVhZHlTdGF0ZSkge1xuICAgICAgc2VsZi5vbk9wZW4oKTtcbiAgICB9XG5cbiAgICAvLyBpZiBpdHMgYSBjbG9zZSBwYWNrZXQsIHdlIGNsb3NlIHRoZSBvbmdvaW5nIHJlcXVlc3RzXG4gICAgaWYgKCdjbG9zZScgPT0gcGFja2V0LnR5cGUpIHtcbiAgICAgIHNlbGYub25DbG9zZSgpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIG90aGVyd2lzZSBieXBhc3Mgb25EYXRhIGFuZCBoYW5kbGUgdGhlIG1lc3NhZ2VcbiAgICBzZWxmLm9uUGFja2V0KHBhY2tldCk7XG4gIH07XG5cbiAgLy8gZGVjb2RlIHBheWxvYWRcbiAgcGFyc2VyLmRlY29kZVBheWxvYWQoZGF0YSwgdGhpcy5zb2NrZXQuYmluYXJ5VHlwZSwgY2FsbGJhY2spO1xuXG4gIC8vIGlmIGFuIGV2ZW50IGRpZCBub3QgdHJpZ2dlciBjbG9zaW5nXG4gIGlmICgnY2xvc2VkJyAhPSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICAvLyBpZiB3ZSBnb3QgZGF0YSB3ZSdyZSBub3QgcG9sbGluZ1xuICAgIHRoaXMucG9sbGluZyA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdCgncG9sbENvbXBsZXRlJyk7XG5cbiAgICBpZiAoJ29wZW4nID09IHRoaXMucmVhZHlTdGF0ZSkge1xuICAgICAgdGhpcy5wb2xsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnKCdpZ25vcmluZyBwb2xsIC0gdHJhbnNwb3J0IHN0YXRlIFwiJXNcIicsIHRoaXMucmVhZHlTdGF0ZSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEZvciBwb2xsaW5nLCBzZW5kIGEgY2xvc2UgcGFja2V0LlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblBvbGxpbmcucHJvdG90eXBlLmRvQ2xvc2UgPSBmdW5jdGlvbigpe1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgZnVuY3Rpb24gY2xvc2UoKXtcbiAgICBkZWJ1Zygnd3JpdGluZyBjbG9zZSBwYWNrZXQnKTtcbiAgICBzZWxmLndyaXRlKFt7IHR5cGU6ICdjbG9zZScgfV0pO1xuICB9XG5cbiAgaWYgKCdvcGVuJyA9PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICBkZWJ1ZygndHJhbnNwb3J0IG9wZW4gLSBjbG9zaW5nJyk7XG4gICAgY2xvc2UoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpbiBjYXNlIHdlJ3JlIHRyeWluZyB0byBjbG9zZSB3aGlsZVxuICAgIC8vIGhhbmRzaGFraW5nIGlzIGluIHByb2dyZXNzIChHSC0xNjQpXG4gICAgZGVidWcoJ3RyYW5zcG9ydCBub3Qgb3BlbiAtIGRlZmVycmluZyBjbG9zZScpO1xuICAgIHRoaXMub25jZSgnb3BlbicsIGNsb3NlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBXcml0ZXMgYSBwYWNrZXRzIHBheWxvYWQuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gZGF0YSBwYWNrZXRzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBkcmFpbiBjYWxsYmFja1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUG9sbGluZy5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihwYWNrZXRzKXtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gIHZhciBjYWxsYmFja2ZuID0gZnVuY3Rpb24oKSB7XG4gICAgc2VsZi53cml0YWJsZSA9IHRydWU7XG4gICAgc2VsZi5lbWl0KCdkcmFpbicpO1xuICB9O1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgcGFyc2VyLmVuY29kZVBheWxvYWQocGFja2V0cywgdGhpcy5zdXBwb3J0c0JpbmFyeSwgZnVuY3Rpb24oZGF0YSkge1xuICAgIHNlbGYuZG9Xcml0ZShkYXRhLCBjYWxsYmFja2ZuKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyB1cmkgZm9yIGNvbm5lY3Rpb24uXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUG9sbGluZy5wcm90b3R5cGUudXJpID0gZnVuY3Rpb24oKXtcbiAgdmFyIHF1ZXJ5ID0gdGhpcy5xdWVyeSB8fCB7fTtcbiAgdmFyIHNjaGVtYSA9IHRoaXMuc2VjdXJlID8gJ2h0dHBzJyA6ICdodHRwJztcbiAgdmFyIHBvcnQgPSAnJztcblxuICAvLyBjYWNoZSBidXN0aW5nIGlzIGZvcmNlZFxuICBpZiAoZmFsc2UgIT09IHRoaXMudGltZXN0YW1wUmVxdWVzdHMpIHtcbiAgICBxdWVyeVt0aGlzLnRpbWVzdGFtcFBhcmFtXSA9ICtuZXcgRGF0ZSArICctJyArIFRyYW5zcG9ydC50aW1lc3RhbXBzKys7XG4gIH1cblxuICBpZiAoIXRoaXMuc3VwcG9ydHNCaW5hcnkgJiYgIXF1ZXJ5LnNpZCkge1xuICAgIHF1ZXJ5LmI2NCA9IDE7XG4gIH1cblxuICBxdWVyeSA9IHBhcnNlcXMuZW5jb2RlKHF1ZXJ5KTtcblxuICAvLyBhdm9pZCBwb3J0IGlmIGRlZmF1bHQgZm9yIHNjaGVtYVxuICBpZiAodGhpcy5wb3J0ICYmICgoJ2h0dHBzJyA9PSBzY2hlbWEgJiYgdGhpcy5wb3J0ICE9IDQ0MykgfHxcbiAgICAgKCdodHRwJyA9PSBzY2hlbWEgJiYgdGhpcy5wb3J0ICE9IDgwKSkpIHtcbiAgICBwb3J0ID0gJzonICsgdGhpcy5wb3J0O1xuICB9XG5cbiAgLy8gcHJlcGVuZCA/IHRvIHF1ZXJ5XG4gIGlmIChxdWVyeS5sZW5ndGgpIHtcbiAgICBxdWVyeSA9ICc/JyArIHF1ZXJ5O1xuICB9XG5cbiAgcmV0dXJuIHNjaGVtYSArICc6Ly8nICsgdGhpcy5ob3N0bmFtZSArIHBvcnQgKyB0aGlzLnBhdGggKyBxdWVyeTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZW5naW5lLmlvLWNsaWVudC9saWIvdHJhbnNwb3J0cy9wb2xsaW5nLmpzXG4vLyBtb2R1bGUgaWQgPSA1MTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 514 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Module dependencies.\n */\n\nvar parser = __webpack_require__(515);\nvar Emitter = __webpack_require__(501);\n\n/**\n * Module exports.\n */\n\nmodule.exports = Transport;\n\n/**\n * Transport abstract constructor.\n *\n * @param {Object} options.\n * @api private\n */\n\nfunction Transport (opts) {\n  this.path = opts.path;\n  this.hostname = opts.hostname;\n  this.port = opts.port;\n  this.secure = opts.secure;\n  this.query = opts.query;\n  this.timestampParam = opts.timestampParam;\n  this.timestampRequests = opts.timestampRequests;\n  this.readyState = '';\n  this.agent = opts.agent || false;\n  this.socket = opts.socket;\n  this.enablesXDR = opts.enablesXDR;\n\n  // SSL options for Node.js client\n  this.pfx = opts.pfx;\n  this.key = opts.key;\n  this.passphrase = opts.passphrase;\n  this.cert = opts.cert;\n  this.ca = opts.ca;\n  this.ciphers = opts.ciphers;\n  this.rejectUnauthorized = opts.rejectUnauthorized;\n}\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Transport.prototype);\n\n/**\n * A counter used to prevent collisions in the timestamps used\n * for cache busting.\n */\n\nTransport.timestamps = 0;\n\n/**\n * Emits an error.\n *\n * @param {String} str\n * @return {Transport} for chaining\n * @api public\n */\n\nTransport.prototype.onError = function (msg, desc) {\n  var err = new Error(msg);\n  err.type = 'TransportError';\n  err.description = desc;\n  this.emit('error', err);\n  return this;\n};\n\n/**\n * Opens the transport.\n *\n * @api public\n */\n\nTransport.prototype.open = function () {\n  if ('closed' == this.readyState || '' == this.readyState) {\n    this.readyState = 'opening';\n    this.doOpen();\n  }\n\n  return this;\n};\n\n/**\n * Closes the transport.\n *\n * @api private\n */\n\nTransport.prototype.close = function () {\n  if ('opening' == this.readyState || 'open' == this.readyState) {\n    this.doClose();\n    this.onClose();\n  }\n\n  return this;\n};\n\n/**\n * Sends multiple packets.\n *\n * @param {Array} packets\n * @api private\n */\n\nTransport.prototype.send = function(packets){\n  if ('open' == this.readyState) {\n    this.write(packets);\n  } else {\n    throw new Error('Transport not open');\n  }\n};\n\n/**\n * Called upon open\n *\n * @api private\n */\n\nTransport.prototype.onOpen = function () {\n  this.readyState = 'open';\n  this.writable = true;\n  this.emit('open');\n};\n\n/**\n * Called with data.\n *\n * @param {String} data\n * @api private\n */\n\nTransport.prototype.onData = function(data){\n  var packet = parser.decodePacket(data, this.socket.binaryType);\n  this.onPacket(packet);\n};\n\n/**\n * Called with a decoded packet.\n */\n\nTransport.prototype.onPacket = function (packet) {\n  this.emit('packet', packet);\n};\n\n/**\n * Called upon close.\n *\n * @api private\n */\n\nTransport.prototype.onClose = function () {\n  this.readyState = 'closed';\n  this.emit('close');\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTE0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2xpYi90cmFuc3BvcnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciBwYXJzZXIgPSByZXF1aXJlKCdlbmdpbmUuaW8tcGFyc2VyJyk7XG52YXIgRW1pdHRlciA9IHJlcXVpcmUoJ2NvbXBvbmVudC1lbWl0dGVyJyk7XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc3BvcnQ7XG5cbi8qKlxuICogVHJhbnNwb3J0IGFic3RyYWN0IGNvbnN0cnVjdG9yLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gVHJhbnNwb3J0IChvcHRzKSB7XG4gIHRoaXMucGF0aCA9IG9wdHMucGF0aDtcbiAgdGhpcy5ob3N0bmFtZSA9IG9wdHMuaG9zdG5hbWU7XG4gIHRoaXMucG9ydCA9IG9wdHMucG9ydDtcbiAgdGhpcy5zZWN1cmUgPSBvcHRzLnNlY3VyZTtcbiAgdGhpcy5xdWVyeSA9IG9wdHMucXVlcnk7XG4gIHRoaXMudGltZXN0YW1wUGFyYW0gPSBvcHRzLnRpbWVzdGFtcFBhcmFtO1xuICB0aGlzLnRpbWVzdGFtcFJlcXVlc3RzID0gb3B0cy50aW1lc3RhbXBSZXF1ZXN0cztcbiAgdGhpcy5yZWFkeVN0YXRlID0gJyc7XG4gIHRoaXMuYWdlbnQgPSBvcHRzLmFnZW50IHx8IGZhbHNlO1xuICB0aGlzLnNvY2tldCA9IG9wdHMuc29ja2V0O1xuICB0aGlzLmVuYWJsZXNYRFIgPSBvcHRzLmVuYWJsZXNYRFI7XG5cbiAgLy8gU1NMIG9wdGlvbnMgZm9yIE5vZGUuanMgY2xpZW50XG4gIHRoaXMucGZ4ID0gb3B0cy5wZng7XG4gIHRoaXMua2V5ID0gb3B0cy5rZXk7XG4gIHRoaXMucGFzc3BocmFzZSA9IG9wdHMucGFzc3BocmFzZTtcbiAgdGhpcy5jZXJ0ID0gb3B0cy5jZXJ0O1xuICB0aGlzLmNhID0gb3B0cy5jYTtcbiAgdGhpcy5jaXBoZXJzID0gb3B0cy5jaXBoZXJzO1xuICB0aGlzLnJlamVjdFVuYXV0aG9yaXplZCA9IG9wdHMucmVqZWN0VW5hdXRob3JpemVkO1xufVxuXG4vKipcbiAqIE1peCBpbiBgRW1pdHRlcmAuXG4gKi9cblxuRW1pdHRlcihUcmFuc3BvcnQucHJvdG90eXBlKTtcblxuLyoqXG4gKiBBIGNvdW50ZXIgdXNlZCB0byBwcmV2ZW50IGNvbGxpc2lvbnMgaW4gdGhlIHRpbWVzdGFtcHMgdXNlZFxuICogZm9yIGNhY2hlIGJ1c3RpbmcuXG4gKi9cblxuVHJhbnNwb3J0LnRpbWVzdGFtcHMgPSAwO1xuXG4vKipcbiAqIEVtaXRzIGFuIGVycm9yLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge1RyYW5zcG9ydH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblRyYW5zcG9ydC5wcm90b3R5cGUub25FcnJvciA9IGZ1bmN0aW9uIChtc2csIGRlc2MpIHtcbiAgdmFyIGVyciA9IG5ldyBFcnJvcihtc2cpO1xuICBlcnIudHlwZSA9ICdUcmFuc3BvcnRFcnJvcic7XG4gIGVyci5kZXNjcmlwdGlvbiA9IGRlc2M7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogT3BlbnMgdGhlIHRyYW5zcG9ydC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblRyYW5zcG9ydC5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCdjbG9zZWQnID09IHRoaXMucmVhZHlTdGF0ZSB8fCAnJyA9PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICB0aGlzLnJlYWR5U3RhdGUgPSAnb3BlbmluZyc7XG4gICAgdGhpcy5kb09wZW4oKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDbG9zZXMgdGhlIHRyYW5zcG9ydC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5UcmFuc3BvcnQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKCkge1xuICBpZiAoJ29wZW5pbmcnID09IHRoaXMucmVhZHlTdGF0ZSB8fCAnb3BlbicgPT0gdGhpcy5yZWFkeVN0YXRlKSB7XG4gICAgdGhpcy5kb0Nsb3NlKCk7XG4gICAgdGhpcy5vbkNsb3NlKCk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2VuZHMgbXVsdGlwbGUgcGFja2V0cy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBwYWNrZXRzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5UcmFuc3BvcnQucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbihwYWNrZXRzKXtcbiAgaWYgKCdvcGVuJyA9PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICB0aGlzLndyaXRlKHBhY2tldHMpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNwb3J0IG5vdCBvcGVuJyk7XG4gIH1cbn07XG5cbi8qKlxuICogQ2FsbGVkIHVwb24gb3BlblxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblRyYW5zcG9ydC5wcm90b3R5cGUub25PcGVuID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLnJlYWR5U3RhdGUgPSAnb3Blbic7XG4gIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuICB0aGlzLmVtaXQoJ29wZW4nKTtcbn07XG5cbi8qKlxuICogQ2FsbGVkIHdpdGggZGF0YS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZGF0YVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuVHJhbnNwb3J0LnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbihkYXRhKXtcbiAgdmFyIHBhY2tldCA9IHBhcnNlci5kZWNvZGVQYWNrZXQoZGF0YSwgdGhpcy5zb2NrZXQuYmluYXJ5VHlwZSk7XG4gIHRoaXMub25QYWNrZXQocGFja2V0KTtcbn07XG5cbi8qKlxuICogQ2FsbGVkIHdpdGggYSBkZWNvZGVkIHBhY2tldC5cbiAqL1xuXG5UcmFuc3BvcnQucHJvdG90eXBlLm9uUGFja2V0ID0gZnVuY3Rpb24gKHBhY2tldCkge1xuICB0aGlzLmVtaXQoJ3BhY2tldCcsIHBhY2tldCk7XG59O1xuXG4vKipcbiAqIENhbGxlZCB1cG9uIGNsb3NlLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblRyYW5zcG9ydC5wcm90b3R5cGUub25DbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5yZWFkeVN0YXRlID0gJ2Nsb3NlZCc7XG4gIHRoaXMuZW1pdCgnY2xvc2UnKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZW5naW5lLmlvLWNsaWVudC9saWIvdHJhbnNwb3J0LmpzXG4vLyBtb2R1bGUgaWQgPSA1MTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 515 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(global) {/**\n * Module dependencies.\n */\n\nvar keys = __webpack_require__(516);\nvar hasBinary = __webpack_require__(517);\nvar sliceBuffer = __webpack_require__(519);\nvar base64encoder = __webpack_require__(520);\nvar after = __webpack_require__(521);\nvar utf8 = __webpack_require__(522);\n\n/**\n * Check if we are running an android browser. That requires us to use\n * ArrayBuffer with polling transports...\n *\n * http://ghinda.net/jpeg-blob-ajax-android/\n */\n\nvar isAndroid = navigator.userAgent.match(/Android/i);\n\n/**\n * Check if we are running in PhantomJS.\n * Uploading a Blob with PhantomJS does not work correctly, as reported here:\n * https://github.com/ariya/phantomjs/issues/11395\n * @type boolean\n */\nvar isPhantomJS = /PhantomJS/i.test(navigator.userAgent);\n\n/**\n * When true, avoids using Blobs to encode payloads.\n * @type boolean\n */\nvar dontSendBlobs = isAndroid || isPhantomJS;\n\n/**\n * Current protocol version.\n */\n\nexports.protocol = 3;\n\n/**\n * Packet types.\n */\n\nvar packets = exports.packets = {\n    open:     0    // non-ws\n  , close:    1    // non-ws\n  , ping:     2\n  , pong:     3\n  , message:  4\n  , upgrade:  5\n  , noop:     6\n};\n\nvar packetslist = keys(packets);\n\n/**\n * Premade error packet.\n */\n\nvar err = { type: 'error', data: 'parser error' };\n\n/**\n * Create a blob api even for blob builder when vendor prefixes exist\n */\n\nvar Blob = __webpack_require__(523);\n\n/**\n * Encodes a packet.\n *\n *     <packet type id> [ <data> ]\n *\n * Example:\n *\n *     5hello world\n *     3\n *     4\n *\n * Binary is encoded in an identical principle\n *\n * @api private\n */\n\nexports.encodePacket = function (packet, supportsBinary, utf8encode, callback) {\n  if ('function' == typeof supportsBinary) {\n    callback = supportsBinary;\n    supportsBinary = false;\n  }\n\n  if ('function' == typeof utf8encode) {\n    callback = utf8encode;\n    utf8encode = null;\n  }\n\n  var data = (packet.data === undefined)\n    ? undefined\n    : packet.data.buffer || packet.data;\n\n  if (global.ArrayBuffer && data instanceof ArrayBuffer) {\n    return encodeArrayBuffer(packet, supportsBinary, callback);\n  } else if (Blob && data instanceof global.Blob) {\n    return encodeBlob(packet, supportsBinary, callback);\n  }\n\n  // might be an object with { base64: true, data: dataAsBase64String }\n  if (data && data.base64) {\n    return encodeBase64Object(packet, callback);\n  }\n\n  // Sending data as a utf-8 string\n  var encoded = packets[packet.type];\n\n  // data fragment is optional\n  if (undefined !== packet.data) {\n    encoded += utf8encode ? utf8.encode(String(packet.data)) : String(packet.data);\n  }\n\n  return callback('' + encoded);\n\n};\n\nfunction encodeBase64Object(packet, callback) {\n  // packet data is an object { base64: true, data: dataAsBase64String }\n  var message = 'b' + exports.packets[packet.type] + packet.data.data;\n  return callback(message);\n}\n\n/**\n * Encode packet helpers for binary types\n */\n\nfunction encodeArrayBuffer(packet, supportsBinary, callback) {\n  if (!supportsBinary) {\n    return exports.encodeBase64Packet(packet, callback);\n  }\n\n  var data = packet.data;\n  var contentArray = new Uint8Array(data);\n  var resultBuffer = new Uint8Array(1 + data.byteLength);\n\n  resultBuffer[0] = packets[packet.type];\n  for (var i = 0; i < contentArray.length; i++) {\n    resultBuffer[i+1] = contentArray[i];\n  }\n\n  return callback(resultBuffer.buffer);\n}\n\nfunction encodeBlobAsArrayBuffer(packet, supportsBinary, callback) {\n  if (!supportsBinary) {\n    return exports.encodeBase64Packet(packet, callback);\n  }\n\n  var fr = new FileReader();\n  fr.onload = function() {\n    packet.data = fr.result;\n    exports.encodePacket(packet, supportsBinary, true, callback);\n  };\n  return fr.readAsArrayBuffer(packet.data);\n}\n\nfunction encodeBlob(packet, supportsBinary, callback) {\n  if (!supportsBinary) {\n    return exports.encodeBase64Packet(packet, callback);\n  }\n\n  if (dontSendBlobs) {\n    return encodeBlobAsArrayBuffer(packet, supportsBinary, callback);\n  }\n\n  var length = new Uint8Array(1);\n  length[0] = packets[packet.type];\n  var blob = new Blob([length.buffer, packet.data]);\n\n  return callback(blob);\n}\n\n/**\n * Encodes a packet with binary data in a base64 string\n *\n * @param {Object} packet, has `type` and `data`\n * @return {String} base64 encoded message\n */\n\nexports.encodeBase64Packet = function(packet, callback) {\n  var message = 'b' + exports.packets[packet.type];\n  if (Blob && packet.data instanceof Blob) {\n    var fr = new FileReader();\n    fr.onload = function() {\n      var b64 = fr.result.split(',')[1];\n      callback(message + b64);\n    };\n    return fr.readAsDataURL(packet.data);\n  }\n\n  var b64data;\n  try {\n    b64data = String.fromCharCode.apply(null, new Uint8Array(packet.data));\n  } catch (e) {\n    // iPhone Safari doesn't let you apply with typed arrays\n    var typed = new Uint8Array(packet.data);\n    var basic = new Array(typed.length);\n    for (var i = 0; i < typed.length; i++) {\n      basic[i] = typed[i];\n    }\n    b64data = String.fromCharCode.apply(null, basic);\n  }\n  message += global.btoa(b64data);\n  return callback(message);\n};\n\n/**\n * Decodes a packet. Changes format to Blob if requested.\n *\n * @return {Object} with `type` and `data` (if any)\n * @api private\n */\n\nexports.decodePacket = function (data, binaryType, utf8decode) {\n  // String data\n  if (typeof data == 'string' || data === undefined) {\n    if (data.charAt(0) == 'b') {\n      return exports.decodeBase64Packet(data.substr(1), binaryType);\n    }\n\n    if (utf8decode) {\n      try {\n        data = utf8.decode(data);\n      } catch (e) {\n        return err;\n      }\n    }\n    var type = data.charAt(0);\n\n    if (Number(type) != type || !packetslist[type]) {\n      return err;\n    }\n\n    if (data.length > 1) {\n      return { type: packetslist[type], data: data.substring(1) };\n    } else {\n      return { type: packetslist[type] };\n    }\n  }\n\n  var asArray = new Uint8Array(data);\n  var type = asArray[0];\n  var rest = sliceBuffer(data, 1);\n  if (Blob && binaryType === 'blob') {\n    rest = new Blob([rest]);\n  }\n  return { type: packetslist[type], data: rest };\n};\n\n/**\n * Decodes a packet encoded in a base64 string\n *\n * @param {String} base64 encoded message\n * @return {Object} with `type` and `data` (if any)\n */\n\nexports.decodeBase64Packet = function(msg, binaryType) {\n  var type = packetslist[msg.charAt(0)];\n  if (!global.ArrayBuffer) {\n    return { type: type, data: { base64: true, data: msg.substr(1) } };\n  }\n\n  var data = base64encoder.decode(msg.substr(1));\n\n  if (binaryType === 'blob' && Blob) {\n    data = new Blob([data]);\n  }\n\n  return { type: type, data: data };\n};\n\n/**\n * Encodes multiple messages (payload).\n *\n *     <length>:data\n *\n * Example:\n *\n *     11:hello world2:hi\n *\n * If any contents are binary, they will be encoded as base64 strings. Base64\n * encoded strings are marked with a b before the length specifier\n *\n * @param {Array} packets\n * @api private\n */\n\nexports.encodePayload = function (packets, supportsBinary, callback) {\n  if (typeof supportsBinary == 'function') {\n    callback = supportsBinary;\n    supportsBinary = null;\n  }\n\n  var isBinary = hasBinary(packets);\n\n  if (supportsBinary && isBinary) {\n    if (Blob && !dontSendBlobs) {\n      return exports.encodePayloadAsBlob(packets, callback);\n    }\n\n    return exports.encodePayloadAsArrayBuffer(packets, callback);\n  }\n\n  if (!packets.length) {\n    return callback('0:');\n  }\n\n  function setLengthHeader(message) {\n    return message.length + ':' + message;\n  }\n\n  function encodeOne(packet, doneCallback) {\n    exports.encodePacket(packet, !isBinary ? false : supportsBinary, true, function(message) {\n      doneCallback(null, setLengthHeader(message));\n    });\n  }\n\n  map(packets, encodeOne, function(err, results) {\n    return callback(results.join(''));\n  });\n};\n\n/**\n * Async array map using after\n */\n\nfunction map(ary, each, done) {\n  var result = new Array(ary.length);\n  var next = after(ary.length, done);\n\n  var eachWithIndex = function(i, el, cb) {\n    each(el, function(error, msg) {\n      result[i] = msg;\n      cb(error, result);\n    });\n  };\n\n  for (var i = 0; i < ary.length; i++) {\n    eachWithIndex(i, ary[i], next);\n  }\n}\n\n/*\n * Decodes data when a payload is maybe expected. Possible binary contents are\n * decoded from their base64 representation\n *\n * @param {String} data, callback method\n * @api public\n */\n\nexports.decodePayload = function (data, binaryType, callback) {\n  if (typeof data != 'string') {\n    return exports.decodePayloadAsBinary(data, binaryType, callback);\n  }\n\n  if (typeof binaryType === 'function') {\n    callback = binaryType;\n    binaryType = null;\n  }\n\n  var packet;\n  if (data == '') {\n    // parser error - ignoring payload\n    return callback(err, 0, 1);\n  }\n\n  var length = ''\n    , n, msg;\n\n  for (var i = 0, l = data.length; i < l; i++) {\n    var chr = data.charAt(i);\n\n    if (':' != chr) {\n      length += chr;\n    } else {\n      if ('' == length || (length != (n = Number(length)))) {\n        // parser error - ignoring payload\n        return callback(err, 0, 1);\n      }\n\n      msg = data.substr(i + 1, n);\n\n      if (length != msg.length) {\n        // parser error - ignoring payload\n        return callback(err, 0, 1);\n      }\n\n      if (msg.length) {\n        packet = exports.decodePacket(msg, binaryType, true);\n\n        if (err.type == packet.type && err.data == packet.data) {\n          // parser error in individual packet - ignoring payload\n          return callback(err, 0, 1);\n        }\n\n        var ret = callback(packet, i + n, l);\n        if (false === ret) return;\n      }\n\n      // advance cursor\n      i += n;\n      length = '';\n    }\n  }\n\n  if (length != '') {\n    // parser error - ignoring payload\n    return callback(err, 0, 1);\n  }\n\n};\n\n/**\n * Encodes multiple messages (payload) as binary.\n *\n * <1 = binary, 0 = string><number from 0-9><number from 0-9>[...]<number\n * 255><data>\n *\n * Example:\n * 1 3 255 1 2 3, if the binary contents are interpreted as 8 bit integers\n *\n * @param {Array} packets\n * @return {ArrayBuffer} encoded payload\n * @api private\n */\n\nexports.encodePayloadAsArrayBuffer = function(packets, callback) {\n  if (!packets.length) {\n    return callback(new ArrayBuffer(0));\n  }\n\n  function encodeOne(packet, doneCallback) {\n    exports.encodePacket(packet, true, true, function(data) {\n      return doneCallback(null, data);\n    });\n  }\n\n  map(packets, encodeOne, function(err, encodedPackets) {\n    var totalLength = encodedPackets.reduce(function(acc, p) {\n      var len;\n      if (typeof p === 'string'){\n        len = p.length;\n      } else {\n        len = p.byteLength;\n      }\n      return acc + len.toString().length + len + 2; // string/binary identifier + separator = 2\n    }, 0);\n\n    var resultArray = new Uint8Array(totalLength);\n\n    var bufferIndex = 0;\n    encodedPackets.forEach(function(p) {\n      var isString = typeof p === 'string';\n      var ab = p;\n      if (isString) {\n        var view = new Uint8Array(p.length);\n        for (var i = 0; i < p.length; i++) {\n          view[i] = p.charCodeAt(i);\n        }\n        ab = view.buffer;\n      }\n\n      if (isString) { // not true binary\n        resultArray[bufferIndex++] = 0;\n      } else { // true binary\n        resultArray[bufferIndex++] = 1;\n      }\n\n      var lenStr = ab.byteLength.toString();\n      for (var i = 0; i < lenStr.length; i++) {\n        resultArray[bufferIndex++] = parseInt(lenStr[i]);\n      }\n      resultArray[bufferIndex++] = 255;\n\n      var view = new Uint8Array(ab);\n      for (var i = 0; i < view.length; i++) {\n        resultArray[bufferIndex++] = view[i];\n      }\n    });\n\n    return callback(resultArray.buffer);\n  });\n};\n\n/**\n * Encode as Blob\n */\n\nexports.encodePayloadAsBlob = function(packets, callback) {\n  function encodeOne(packet, doneCallback) {\n    exports.encodePacket(packet, true, true, function(encoded) {\n      var binaryIdentifier = new Uint8Array(1);\n      binaryIdentifier[0] = 1;\n      if (typeof encoded === 'string') {\n        var view = new Uint8Array(encoded.length);\n        for (var i = 0; i < encoded.length; i++) {\n          view[i] = encoded.charCodeAt(i);\n        }\n        encoded = view.buffer;\n        binaryIdentifier[0] = 0;\n      }\n\n      var len = (encoded instanceof ArrayBuffer)\n        ? encoded.byteLength\n        : encoded.size;\n\n      var lenStr = len.toString();\n      var lengthAry = new Uint8Array(lenStr.length + 1);\n      for (var i = 0; i < lenStr.length; i++) {\n        lengthAry[i] = parseInt(lenStr[i]);\n      }\n      lengthAry[lenStr.length] = 255;\n\n      if (Blob) {\n        var blob = new Blob([binaryIdentifier.buffer, lengthAry.buffer, encoded]);\n        doneCallback(null, blob);\n      }\n    });\n  }\n\n  map(packets, encodeOne, function(err, results) {\n    return callback(new Blob(results));\n  });\n};\n\n/*\n * Decodes data when a payload is maybe expected. Strings are decoded by\n * interpreting each byte as a key code for entries marked to start with 0. See\n * description of encodePayloadAsBinary\n *\n * @param {ArrayBuffer} data, callback method\n * @api public\n */\n\nexports.decodePayloadAsBinary = function (data, binaryType, callback) {\n  if (typeof binaryType === 'function') {\n    callback = binaryType;\n    binaryType = null;\n  }\n\n  var bufferTail = data;\n  var buffers = [];\n\n  var numberTooLong = false;\n  while (bufferTail.byteLength > 0) {\n    var tailArray = new Uint8Array(bufferTail);\n    var isString = tailArray[0] === 0;\n    var msgLength = '';\n\n    for (var i = 1; ; i++) {\n      if (tailArray[i] == 255) break;\n\n      if (msgLength.length > 310) {\n        numberTooLong = true;\n        break;\n      }\n\n      msgLength += tailArray[i];\n    }\n\n    if(numberTooLong) return callback(err, 0, 1);\n\n    bufferTail = sliceBuffer(bufferTail, 2 + msgLength.length);\n    msgLength = parseInt(msgLength);\n\n    var msg = sliceBuffer(bufferTail, 0, msgLength);\n    if (isString) {\n      try {\n        msg = String.fromCharCode.apply(null, new Uint8Array(msg));\n      } catch (e) {\n        // iPhone Safari doesn't let you apply to typed arrays\n        var typed = new Uint8Array(msg);\n        msg = '';\n        for (var i = 0; i < typed.length; i++) {\n          msg += String.fromCharCode(typed[i]);\n        }\n      }\n    }\n\n    buffers.push(msg);\n    bufferTail = sliceBuffer(bufferTail, msgLength);\n  }\n\n  var total = buffers.length;\n  buffers.forEach(function(buffer, i) {\n    callback(exports.decodePacket(buffer, binaryType, true), i, total);\n  });\n};\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTE1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tcGFyc2VyL2xpYi9icm93c2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xudmFyIGhhc0JpbmFyeSA9IHJlcXVpcmUoJ2hhcy1iaW5hcnknKTtcbnZhciBzbGljZUJ1ZmZlciA9IHJlcXVpcmUoJ2FycmF5YnVmZmVyLnNsaWNlJyk7XG52YXIgYmFzZTY0ZW5jb2RlciA9IHJlcXVpcmUoJ2Jhc2U2NC1hcnJheWJ1ZmZlcicpO1xudmFyIGFmdGVyID0gcmVxdWlyZSgnYWZ0ZXInKTtcbnZhciB1dGY4ID0gcmVxdWlyZSgndXRmOCcpO1xuXG4vKipcbiAqIENoZWNrIGlmIHdlIGFyZSBydW5uaW5nIGFuIGFuZHJvaWQgYnJvd3Nlci4gVGhhdCByZXF1aXJlcyB1cyB0byB1c2VcbiAqIEFycmF5QnVmZmVyIHdpdGggcG9sbGluZyB0cmFuc3BvcnRzLi4uXG4gKlxuICogaHR0cDovL2doaW5kYS5uZXQvanBlZy1ibG9iLWFqYXgtYW5kcm9pZC9cbiAqL1xuXG52YXIgaXNBbmRyb2lkID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKTtcblxuLyoqXG4gKiBDaGVjayBpZiB3ZSBhcmUgcnVubmluZyBpbiBQaGFudG9tSlMuXG4gKiBVcGxvYWRpbmcgYSBCbG9iIHdpdGggUGhhbnRvbUpTIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5LCBhcyByZXBvcnRlZCBoZXJlOlxuICogaHR0cHM6Ly9naXRodWIuY29tL2FyaXlhL3BoYW50b21qcy9pc3N1ZXMvMTEzOTVcbiAqIEB0eXBlIGJvb2xlYW5cbiAqL1xudmFyIGlzUGhhbnRvbUpTID0gL1BoYW50b21KUy9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cbi8qKlxuICogV2hlbiB0cnVlLCBhdm9pZHMgdXNpbmcgQmxvYnMgdG8gZW5jb2RlIHBheWxvYWRzLlxuICogQHR5cGUgYm9vbGVhblxuICovXG52YXIgZG9udFNlbmRCbG9icyA9IGlzQW5kcm9pZCB8fCBpc1BoYW50b21KUztcblxuLyoqXG4gKiBDdXJyZW50IHByb3RvY29sIHZlcnNpb24uXG4gKi9cblxuZXhwb3J0cy5wcm90b2NvbCA9IDM7XG5cbi8qKlxuICogUGFja2V0IHR5cGVzLlxuICovXG5cbnZhciBwYWNrZXRzID0gZXhwb3J0cy5wYWNrZXRzID0ge1xuICAgIG9wZW46ICAgICAwICAgIC8vIG5vbi13c1xuICAsIGNsb3NlOiAgICAxICAgIC8vIG5vbi13c1xuICAsIHBpbmc6ICAgICAyXG4gICwgcG9uZzogICAgIDNcbiAgLCBtZXNzYWdlOiAgNFxuICAsIHVwZ3JhZGU6ICA1XG4gICwgbm9vcDogICAgIDZcbn07XG5cbnZhciBwYWNrZXRzbGlzdCA9IGtleXMocGFja2V0cyk7XG5cbi8qKlxuICogUHJlbWFkZSBlcnJvciBwYWNrZXQuXG4gKi9cblxudmFyIGVyciA9IHsgdHlwZTogJ2Vycm9yJywgZGF0YTogJ3BhcnNlciBlcnJvcicgfTtcblxuLyoqXG4gKiBDcmVhdGUgYSBibG9iIGFwaSBldmVuIGZvciBibG9iIGJ1aWxkZXIgd2hlbiB2ZW5kb3IgcHJlZml4ZXMgZXhpc3RcbiAqL1xuXG52YXIgQmxvYiA9IHJlcXVpcmUoJ2Jsb2InKTtcblxuLyoqXG4gKiBFbmNvZGVzIGEgcGFja2V0LlxuICpcbiAqICAgICA8cGFja2V0IHR5cGUgaWQ+IFsgPGRhdGE+IF1cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqICAgICA1aGVsbG8gd29ybGRcbiAqICAgICAzXG4gKiAgICAgNFxuICpcbiAqIEJpbmFyeSBpcyBlbmNvZGVkIGluIGFuIGlkZW50aWNhbCBwcmluY2lwbGVcbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLmVuY29kZVBhY2tldCA9IGZ1bmN0aW9uIChwYWNrZXQsIHN1cHBvcnRzQmluYXJ5LCB1dGY4ZW5jb2RlLCBjYWxsYmFjaykge1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2Ygc3VwcG9ydHNCaW5hcnkpIHtcbiAgICBjYWxsYmFjayA9IHN1cHBvcnRzQmluYXJ5O1xuICAgIHN1cHBvcnRzQmluYXJ5ID0gZmFsc2U7XG4gIH1cblxuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdXRmOGVuY29kZSkge1xuICAgIGNhbGxiYWNrID0gdXRmOGVuY29kZTtcbiAgICB1dGY4ZW5jb2RlID0gbnVsbDtcbiAgfVxuXG4gIHZhciBkYXRhID0gKHBhY2tldC5kYXRhID09PSB1bmRlZmluZWQpXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHBhY2tldC5kYXRhLmJ1ZmZlciB8fCBwYWNrZXQuZGF0YTtcblxuICBpZiAoZ2xvYmFsLkFycmF5QnVmZmVyICYmIGRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBlbmNvZGVBcnJheUJ1ZmZlcihwYWNrZXQsIHN1cHBvcnRzQmluYXJ5LCBjYWxsYmFjayk7XG4gIH0gZWxzZSBpZiAoQmxvYiAmJiBkYXRhIGluc3RhbmNlb2YgZ2xvYmFsLkJsb2IpIHtcbiAgICByZXR1cm4gZW5jb2RlQmxvYihwYWNrZXQsIHN1cHBvcnRzQmluYXJ5LCBjYWxsYmFjayk7XG4gIH1cblxuICAvLyBtaWdodCBiZSBhbiBvYmplY3Qgd2l0aCB7IGJhc2U2NDogdHJ1ZSwgZGF0YTogZGF0YUFzQmFzZTY0U3RyaW5nIH1cbiAgaWYgKGRhdGEgJiYgZGF0YS5iYXNlNjQpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTY0T2JqZWN0KHBhY2tldCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLy8gU2VuZGluZyBkYXRhIGFzIGEgdXRmLTggc3RyaW5nXG4gIHZhciBlbmNvZGVkID0gcGFja2V0c1twYWNrZXQudHlwZV07XG5cbiAgLy8gZGF0YSBmcmFnbWVudCBpcyBvcHRpb25hbFxuICBpZiAodW5kZWZpbmVkICE9PSBwYWNrZXQuZGF0YSkge1xuICAgIGVuY29kZWQgKz0gdXRmOGVuY29kZSA/IHV0ZjguZW5jb2RlKFN0cmluZyhwYWNrZXQuZGF0YSkpIDogU3RyaW5nKHBhY2tldC5kYXRhKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsYmFjaygnJyArIGVuY29kZWQpO1xuXG59O1xuXG5mdW5jdGlvbiBlbmNvZGVCYXNlNjRPYmplY3QocGFja2V0LCBjYWxsYmFjaykge1xuICAvLyBwYWNrZXQgZGF0YSBpcyBhbiBvYmplY3QgeyBiYXNlNjQ6IHRydWUsIGRhdGE6IGRhdGFBc0Jhc2U2NFN0cmluZyB9XG4gIHZhciBtZXNzYWdlID0gJ2InICsgZXhwb3J0cy5wYWNrZXRzW3BhY2tldC50eXBlXSArIHBhY2tldC5kYXRhLmRhdGE7XG4gIHJldHVybiBjYWxsYmFjayhtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBFbmNvZGUgcGFja2V0IGhlbHBlcnMgZm9yIGJpbmFyeSB0eXBlc1xuICovXG5cbmZ1bmN0aW9uIGVuY29kZUFycmF5QnVmZmVyKHBhY2tldCwgc3VwcG9ydHNCaW5hcnksIGNhbGxiYWNrKSB7XG4gIGlmICghc3VwcG9ydHNCaW5hcnkpIHtcbiAgICByZXR1cm4gZXhwb3J0cy5lbmNvZGVCYXNlNjRQYWNrZXQocGFja2V0LCBjYWxsYmFjayk7XG4gIH1cblxuICB2YXIgZGF0YSA9IHBhY2tldC5kYXRhO1xuICB2YXIgY29udGVudEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gIHZhciByZXN1bHRCdWZmZXIgPSBuZXcgVWludDhBcnJheSgxICsgZGF0YS5ieXRlTGVuZ3RoKTtcblxuICByZXN1bHRCdWZmZXJbMF0gPSBwYWNrZXRzW3BhY2tldC50eXBlXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZW50QXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHRCdWZmZXJbaSsxXSA9IGNvbnRlbnRBcnJheVtpXTtcbiAgfVxuXG4gIHJldHVybiBjYWxsYmFjayhyZXN1bHRCdWZmZXIuYnVmZmVyKTtcbn1cblxuZnVuY3Rpb24gZW5jb2RlQmxvYkFzQXJyYXlCdWZmZXIocGFja2V0LCBzdXBwb3J0c0JpbmFyeSwgY2FsbGJhY2spIHtcbiAgaWYgKCFzdXBwb3J0c0JpbmFyeSkge1xuICAgIHJldHVybiBleHBvcnRzLmVuY29kZUJhc2U2NFBhY2tldChwYWNrZXQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHZhciBmciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gIGZyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgIHBhY2tldC5kYXRhID0gZnIucmVzdWx0O1xuICAgIGV4cG9ydHMuZW5jb2RlUGFja2V0KHBhY2tldCwgc3VwcG9ydHNCaW5hcnksIHRydWUsIGNhbGxiYWNrKTtcbiAgfTtcbiAgcmV0dXJuIGZyLnJlYWRBc0FycmF5QnVmZmVyKHBhY2tldC5kYXRhKTtcbn1cblxuZnVuY3Rpb24gZW5jb2RlQmxvYihwYWNrZXQsIHN1cHBvcnRzQmluYXJ5LCBjYWxsYmFjaykge1xuICBpZiAoIXN1cHBvcnRzQmluYXJ5KSB7XG4gICAgcmV0dXJuIGV4cG9ydHMuZW5jb2RlQmFzZTY0UGFja2V0KHBhY2tldCwgY2FsbGJhY2spO1xuICB9XG5cbiAgaWYgKGRvbnRTZW5kQmxvYnMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmxvYkFzQXJyYXlCdWZmZXIocGFja2V0LCBzdXBwb3J0c0JpbmFyeSwgY2FsbGJhY2spO1xuICB9XG5cbiAgdmFyIGxlbmd0aCA9IG5ldyBVaW50OEFycmF5KDEpO1xuICBsZW5ndGhbMF0gPSBwYWNrZXRzW3BhY2tldC50eXBlXTtcbiAgdmFyIGJsb2IgPSBuZXcgQmxvYihbbGVuZ3RoLmJ1ZmZlciwgcGFja2V0LmRhdGFdKTtcblxuICByZXR1cm4gY2FsbGJhY2soYmxvYik7XG59XG5cbi8qKlxuICogRW5jb2RlcyBhIHBhY2tldCB3aXRoIGJpbmFyeSBkYXRhIGluIGEgYmFzZTY0IHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYWNrZXQsIGhhcyBgdHlwZWAgYW5kIGBkYXRhYFxuICogQHJldHVybiB7U3RyaW5nfSBiYXNlNjQgZW5jb2RlZCBtZXNzYWdlXG4gKi9cblxuZXhwb3J0cy5lbmNvZGVCYXNlNjRQYWNrZXQgPSBmdW5jdGlvbihwYWNrZXQsIGNhbGxiYWNrKSB7XG4gIHZhciBtZXNzYWdlID0gJ2InICsgZXhwb3J0cy5wYWNrZXRzW3BhY2tldC50eXBlXTtcbiAgaWYgKEJsb2IgJiYgcGFja2V0LmRhdGEgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgdmFyIGZyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICBmci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBiNjQgPSBmci5yZXN1bHQuc3BsaXQoJywnKVsxXTtcbiAgICAgIGNhbGxiYWNrKG1lc3NhZ2UgKyBiNjQpO1xuICAgIH07XG4gICAgcmV0dXJuIGZyLnJlYWRBc0RhdGFVUkwocGFja2V0LmRhdGEpO1xuICB9XG5cbiAgdmFyIGI2NGRhdGE7XG4gIHRyeSB7XG4gICAgYjY0ZGF0YSA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkocGFja2V0LmRhdGEpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGlQaG9uZSBTYWZhcmkgZG9lc24ndCBsZXQgeW91IGFwcGx5IHdpdGggdHlwZWQgYXJyYXlzXG4gICAgdmFyIHR5cGVkID0gbmV3IFVpbnQ4QXJyYXkocGFja2V0LmRhdGEpO1xuICAgIHZhciBiYXNpYyA9IG5ldyBBcnJheSh0eXBlZC5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHlwZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGJhc2ljW2ldID0gdHlwZWRbaV07XG4gICAgfVxuICAgIGI2NGRhdGEgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGJhc2ljKTtcbiAgfVxuICBtZXNzYWdlICs9IGdsb2JhbC5idG9hKGI2NGRhdGEpO1xuICByZXR1cm4gY2FsbGJhY2sobWVzc2FnZSk7XG59O1xuXG4vKipcbiAqIERlY29kZXMgYSBwYWNrZXQuIENoYW5nZXMgZm9ybWF0IHRvIEJsb2IgaWYgcmVxdWVzdGVkLlxuICpcbiAqIEByZXR1cm4ge09iamVjdH0gd2l0aCBgdHlwZWAgYW5kIGBkYXRhYCAoaWYgYW55KVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5kZWNvZGVQYWNrZXQgPSBmdW5jdGlvbiAoZGF0YSwgYmluYXJ5VHlwZSwgdXRmOGRlY29kZSkge1xuICAvLyBTdHJpbmcgZGF0YVxuICBpZiAodHlwZW9mIGRhdGEgPT0gJ3N0cmluZycgfHwgZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGRhdGEuY2hhckF0KDApID09ICdiJykge1xuICAgICAgcmV0dXJuIGV4cG9ydHMuZGVjb2RlQmFzZTY0UGFja2V0KGRhdGEuc3Vic3RyKDEpLCBiaW5hcnlUeXBlKTtcbiAgICB9XG5cbiAgICBpZiAodXRmOGRlY29kZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGF0YSA9IHV0ZjguZGVjb2RlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZXJyO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgdHlwZSA9IGRhdGEuY2hhckF0KDApO1xuXG4gICAgaWYgKE51bWJlcih0eXBlKSAhPSB0eXBlIHx8ICFwYWNrZXRzbGlzdFt0eXBlXSkge1xuICAgICAgcmV0dXJuIGVycjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5sZW5ndGggPiAxKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBwYWNrZXRzbGlzdFt0eXBlXSwgZGF0YTogZGF0YS5zdWJzdHJpbmcoMSkgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHsgdHlwZTogcGFja2V0c2xpc3RbdHlwZV0gfTtcbiAgICB9XG4gIH1cblxuICB2YXIgYXNBcnJheSA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xuICB2YXIgdHlwZSA9IGFzQXJyYXlbMF07XG4gIHZhciByZXN0ID0gc2xpY2VCdWZmZXIoZGF0YSwgMSk7XG4gIGlmIChCbG9iICYmIGJpbmFyeVR5cGUgPT09ICdibG9iJykge1xuICAgIHJlc3QgPSBuZXcgQmxvYihbcmVzdF0pO1xuICB9XG4gIHJldHVybiB7IHR5cGU6IHBhY2tldHNsaXN0W3R5cGVdLCBkYXRhOiByZXN0IH07XG59O1xuXG4vKipcbiAqIERlY29kZXMgYSBwYWNrZXQgZW5jb2RlZCBpbiBhIGJhc2U2NCBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYmFzZTY0IGVuY29kZWQgbWVzc2FnZVxuICogQHJldHVybiB7T2JqZWN0fSB3aXRoIGB0eXBlYCBhbmQgYGRhdGFgIChpZiBhbnkpXG4gKi9cblxuZXhwb3J0cy5kZWNvZGVCYXNlNjRQYWNrZXQgPSBmdW5jdGlvbihtc2csIGJpbmFyeVR5cGUpIHtcbiAgdmFyIHR5cGUgPSBwYWNrZXRzbGlzdFttc2cuY2hhckF0KDApXTtcbiAgaWYgKCFnbG9iYWwuQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4geyB0eXBlOiB0eXBlLCBkYXRhOiB7IGJhc2U2NDogdHJ1ZSwgZGF0YTogbXNnLnN1YnN0cigxKSB9IH07XG4gIH1cblxuICB2YXIgZGF0YSA9IGJhc2U2NGVuY29kZXIuZGVjb2RlKG1zZy5zdWJzdHIoMSkpO1xuXG4gIGlmIChiaW5hcnlUeXBlID09PSAnYmxvYicgJiYgQmxvYikge1xuICAgIGRhdGEgPSBuZXcgQmxvYihbZGF0YV0pO1xuICB9XG5cbiAgcmV0dXJuIHsgdHlwZTogdHlwZSwgZGF0YTogZGF0YSB9O1xufTtcblxuLyoqXG4gKiBFbmNvZGVzIG11bHRpcGxlIG1lc3NhZ2VzIChwYXlsb2FkKS5cbiAqXG4gKiAgICAgPGxlbmd0aD46ZGF0YVxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogICAgIDExOmhlbGxvIHdvcmxkMjpoaVxuICpcbiAqIElmIGFueSBjb250ZW50cyBhcmUgYmluYXJ5LCB0aGV5IHdpbGwgYmUgZW5jb2RlZCBhcyBiYXNlNjQgc3RyaW5ncy4gQmFzZTY0XG4gKiBlbmNvZGVkIHN0cmluZ3MgYXJlIG1hcmtlZCB3aXRoIGEgYiBiZWZvcmUgdGhlIGxlbmd0aCBzcGVjaWZpZXJcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBwYWNrZXRzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLmVuY29kZVBheWxvYWQgPSBmdW5jdGlvbiAocGFja2V0cywgc3VwcG9ydHNCaW5hcnksIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygc3VwcG9ydHNCaW5hcnkgPT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gc3VwcG9ydHNCaW5hcnk7XG4gICAgc3VwcG9ydHNCaW5hcnkgPSBudWxsO1xuICB9XG5cbiAgdmFyIGlzQmluYXJ5ID0gaGFzQmluYXJ5KHBhY2tldHMpO1xuXG4gIGlmIChzdXBwb3J0c0JpbmFyeSAmJiBpc0JpbmFyeSkge1xuICAgIGlmIChCbG9iICYmICFkb250U2VuZEJsb2JzKSB7XG4gICAgICByZXR1cm4gZXhwb3J0cy5lbmNvZGVQYXlsb2FkQXNCbG9iKHBhY2tldHMsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXhwb3J0cy5lbmNvZGVQYXlsb2FkQXNBcnJheUJ1ZmZlcihwYWNrZXRzLCBjYWxsYmFjayk7XG4gIH1cblxuICBpZiAoIXBhY2tldHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKCcwOicpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0TGVuZ3RoSGVhZGVyKG1lc3NhZ2UpIHtcbiAgICByZXR1cm4gbWVzc2FnZS5sZW5ndGggKyAnOicgKyBtZXNzYWdlO1xuICB9XG5cbiAgZnVuY3Rpb24gZW5jb2RlT25lKHBhY2tldCwgZG9uZUNhbGxiYWNrKSB7XG4gICAgZXhwb3J0cy5lbmNvZGVQYWNrZXQocGFja2V0LCAhaXNCaW5hcnkgPyBmYWxzZSA6IHN1cHBvcnRzQmluYXJ5LCB0cnVlLCBmdW5jdGlvbihtZXNzYWdlKSB7XG4gICAgICBkb25lQ2FsbGJhY2sobnVsbCwgc2V0TGVuZ3RoSGVhZGVyKG1lc3NhZ2UpKTtcbiAgICB9KTtcbiAgfVxuXG4gIG1hcChwYWNrZXRzLCBlbmNvZGVPbmUsIGZ1bmN0aW9uKGVyciwgcmVzdWx0cykge1xuICAgIHJldHVybiBjYWxsYmFjayhyZXN1bHRzLmpvaW4oJycpKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIEFzeW5jIGFycmF5IG1hcCB1c2luZyBhZnRlclxuICovXG5cbmZ1bmN0aW9uIG1hcChhcnksIGVhY2gsIGRvbmUpIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheShhcnkubGVuZ3RoKTtcbiAgdmFyIG5leHQgPSBhZnRlcihhcnkubGVuZ3RoLCBkb25lKTtcblxuICB2YXIgZWFjaFdpdGhJbmRleCA9IGZ1bmN0aW9uKGksIGVsLCBjYikge1xuICAgIGVhY2goZWwsIGZ1bmN0aW9uKGVycm9yLCBtc2cpIHtcbiAgICAgIHJlc3VsdFtpXSA9IG1zZztcbiAgICAgIGNiKGVycm9yLCByZXN1bHQpO1xuICAgIH0pO1xuICB9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJ5Lmxlbmd0aDsgaSsrKSB7XG4gICAgZWFjaFdpdGhJbmRleChpLCBhcnlbaV0sIG5leHQpO1xuICB9XG59XG5cbi8qXG4gKiBEZWNvZGVzIGRhdGEgd2hlbiBhIHBheWxvYWQgaXMgbWF5YmUgZXhwZWN0ZWQuIFBvc3NpYmxlIGJpbmFyeSBjb250ZW50cyBhcmVcbiAqIGRlY29kZWQgZnJvbSB0aGVpciBiYXNlNjQgcmVwcmVzZW50YXRpb25cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZGF0YSwgY2FsbGJhY2sgbWV0aG9kXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMuZGVjb2RlUGF5bG9hZCA9IGZ1bmN0aW9uIChkYXRhLCBiaW5hcnlUeXBlLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIGRhdGEgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZXhwb3J0cy5kZWNvZGVQYXlsb2FkQXNCaW5hcnkoZGF0YSwgYmluYXJ5VHlwZSwgY2FsbGJhY2spO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBiaW5hcnlUeXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBiaW5hcnlUeXBlO1xuICAgIGJpbmFyeVR5cGUgPSBudWxsO1xuICB9XG5cbiAgdmFyIHBhY2tldDtcbiAgaWYgKGRhdGEgPT0gJycpIHtcbiAgICAvLyBwYXJzZXIgZXJyb3IgLSBpZ25vcmluZyBwYXlsb2FkXG4gICAgcmV0dXJuIGNhbGxiYWNrKGVyciwgMCwgMSk7XG4gIH1cblxuICB2YXIgbGVuZ3RoID0gJydcbiAgICAsIG4sIG1zZztcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IGRhdGEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIGNociA9IGRhdGEuY2hhckF0KGkpO1xuXG4gICAgaWYgKCc6JyAhPSBjaHIpIHtcbiAgICAgIGxlbmd0aCArPSBjaHI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgnJyA9PSBsZW5ndGggfHwgKGxlbmd0aCAhPSAobiA9IE51bWJlcihsZW5ndGgpKSkpIHtcbiAgICAgICAgLy8gcGFyc2VyIGVycm9yIC0gaWdub3JpbmcgcGF5bG9hZFxuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyLCAwLCAxKTtcbiAgICAgIH1cblxuICAgICAgbXNnID0gZGF0YS5zdWJzdHIoaSArIDEsIG4pO1xuXG4gICAgICBpZiAobGVuZ3RoICE9IG1zZy5sZW5ndGgpIHtcbiAgICAgICAgLy8gcGFyc2VyIGVycm9yIC0gaWdub3JpbmcgcGF5bG9hZFxuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyLCAwLCAxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1zZy5sZW5ndGgpIHtcbiAgICAgICAgcGFja2V0ID0gZXhwb3J0cy5kZWNvZGVQYWNrZXQobXNnLCBiaW5hcnlUeXBlLCB0cnVlKTtcblxuICAgICAgICBpZiAoZXJyLnR5cGUgPT0gcGFja2V0LnR5cGUgJiYgZXJyLmRhdGEgPT0gcGFja2V0LmRhdGEpIHtcbiAgICAgICAgICAvLyBwYXJzZXIgZXJyb3IgaW4gaW5kaXZpZHVhbCBwYWNrZXQgLSBpZ25vcmluZyBwYXlsb2FkXG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVyciwgMCwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcmV0ID0gY2FsbGJhY2socGFja2V0LCBpICsgbiwgbCk7XG4gICAgICAgIGlmIChmYWxzZSA9PT0gcmV0KSByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGFkdmFuY2UgY3Vyc29yXG4gICAgICBpICs9IG47XG4gICAgICBsZW5ndGggPSAnJztcbiAgICB9XG4gIH1cblxuICBpZiAobGVuZ3RoICE9ICcnKSB7XG4gICAgLy8gcGFyc2VyIGVycm9yIC0gaWdub3JpbmcgcGF5bG9hZFxuICAgIHJldHVybiBjYWxsYmFjayhlcnIsIDAsIDEpO1xuICB9XG5cbn07XG5cbi8qKlxuICogRW5jb2RlcyBtdWx0aXBsZSBtZXNzYWdlcyAocGF5bG9hZCkgYXMgYmluYXJ5LlxuICpcbiAqIDwxID0gYmluYXJ5LCAwID0gc3RyaW5nPjxudW1iZXIgZnJvbSAwLTk+PG51bWJlciBmcm9tIDAtOT5bLi4uXTxudW1iZXJcbiAqIDI1NT48ZGF0YT5cbiAqXG4gKiBFeGFtcGxlOlxuICogMSAzIDI1NSAxIDIgMywgaWYgdGhlIGJpbmFyeSBjb250ZW50cyBhcmUgaW50ZXJwcmV0ZWQgYXMgOCBiaXQgaW50ZWdlcnNcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBwYWNrZXRzXG4gKiBAcmV0dXJuIHtBcnJheUJ1ZmZlcn0gZW5jb2RlZCBwYXlsb2FkXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLmVuY29kZVBheWxvYWRBc0FycmF5QnVmZmVyID0gZnVuY3Rpb24ocGFja2V0cywgY2FsbGJhY2spIHtcbiAgaWYgKCFwYWNrZXRzLmxlbmd0aCkge1xuICAgIHJldHVybiBjYWxsYmFjayhuZXcgQXJyYXlCdWZmZXIoMCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZW5jb2RlT25lKHBhY2tldCwgZG9uZUNhbGxiYWNrKSB7XG4gICAgZXhwb3J0cy5lbmNvZGVQYWNrZXQocGFja2V0LCB0cnVlLCB0cnVlLCBmdW5jdGlvbihkYXRhKSB7XG4gICAgICByZXR1cm4gZG9uZUNhbGxiYWNrKG51bGwsIGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgbWFwKHBhY2tldHMsIGVuY29kZU9uZSwgZnVuY3Rpb24oZXJyLCBlbmNvZGVkUGFja2V0cykge1xuICAgIHZhciB0b3RhbExlbmd0aCA9IGVuY29kZWRQYWNrZXRzLnJlZHVjZShmdW5jdGlvbihhY2MsIHApIHtcbiAgICAgIHZhciBsZW47XG4gICAgICBpZiAodHlwZW9mIHAgPT09ICdzdHJpbmcnKXtcbiAgICAgICAgbGVuID0gcC5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZW4gPSBwLmJ5dGVMZW5ndGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjICsgbGVuLnRvU3RyaW5nKCkubGVuZ3RoICsgbGVuICsgMjsgLy8gc3RyaW5nL2JpbmFyeSBpZGVudGlmaWVyICsgc2VwYXJhdG9yID0gMlxuICAgIH0sIDApO1xuXG4gICAgdmFyIHJlc3VsdEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkodG90YWxMZW5ndGgpO1xuXG4gICAgdmFyIGJ1ZmZlckluZGV4ID0gMDtcbiAgICBlbmNvZGVkUGFja2V0cy5mb3JFYWNoKGZ1bmN0aW9uKHApIHtcbiAgICAgIHZhciBpc1N0cmluZyA9IHR5cGVvZiBwID09PSAnc3RyaW5nJztcbiAgICAgIHZhciBhYiA9IHA7XG4gICAgICBpZiAoaXNTdHJpbmcpIHtcbiAgICAgICAgdmFyIHZpZXcgPSBuZXcgVWludDhBcnJheShwLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZpZXdbaV0gPSBwLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIH1cbiAgICAgICAgYWIgPSB2aWV3LmJ1ZmZlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzU3RyaW5nKSB7IC8vIG5vdCB0cnVlIGJpbmFyeVxuICAgICAgICByZXN1bHRBcnJheVtidWZmZXJJbmRleCsrXSA9IDA7XG4gICAgICB9IGVsc2UgeyAvLyB0cnVlIGJpbmFyeVxuICAgICAgICByZXN1bHRBcnJheVtidWZmZXJJbmRleCsrXSA9IDE7XG4gICAgICB9XG5cbiAgICAgIHZhciBsZW5TdHIgPSBhYi5ieXRlTGVuZ3RoLnRvU3RyaW5nKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlblN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHRBcnJheVtidWZmZXJJbmRleCsrXSA9IHBhcnNlSW50KGxlblN0cltpXSk7XG4gICAgICB9XG4gICAgICByZXN1bHRBcnJheVtidWZmZXJJbmRleCsrXSA9IDI1NTtcblxuICAgICAgdmFyIHZpZXcgPSBuZXcgVWludDhBcnJheShhYik7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpZXcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0QXJyYXlbYnVmZmVySW5kZXgrK10gPSB2aWV3W2ldO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKHJlc3VsdEFycmF5LmJ1ZmZlcik7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBFbmNvZGUgYXMgQmxvYlxuICovXG5cbmV4cG9ydHMuZW5jb2RlUGF5bG9hZEFzQmxvYiA9IGZ1bmN0aW9uKHBhY2tldHMsIGNhbGxiYWNrKSB7XG4gIGZ1bmN0aW9uIGVuY29kZU9uZShwYWNrZXQsIGRvbmVDYWxsYmFjaykge1xuICAgIGV4cG9ydHMuZW5jb2RlUGFja2V0KHBhY2tldCwgdHJ1ZSwgdHJ1ZSwgZnVuY3Rpb24oZW5jb2RlZCkge1xuICAgICAgdmFyIGJpbmFyeUlkZW50aWZpZXIgPSBuZXcgVWludDhBcnJheSgxKTtcbiAgICAgIGJpbmFyeUlkZW50aWZpZXJbMF0gPSAxO1xuICAgICAgaWYgKHR5cGVvZiBlbmNvZGVkID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGVuY29kZWQubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbmNvZGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmlld1tpXSA9IGVuY29kZWQuY2hhckNvZGVBdChpKTtcbiAgICAgICAgfVxuICAgICAgICBlbmNvZGVkID0gdmlldy5idWZmZXI7XG4gICAgICAgIGJpbmFyeUlkZW50aWZpZXJbMF0gPSAwO1xuICAgICAgfVxuXG4gICAgICB2YXIgbGVuID0gKGVuY29kZWQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcilcbiAgICAgICAgPyBlbmNvZGVkLmJ5dGVMZW5ndGhcbiAgICAgICAgOiBlbmNvZGVkLnNpemU7XG5cbiAgICAgIHZhciBsZW5TdHIgPSBsZW4udG9TdHJpbmcoKTtcbiAgICAgIHZhciBsZW5ndGhBcnkgPSBuZXcgVWludDhBcnJheShsZW5TdHIubGVuZ3RoICsgMSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlblN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZW5ndGhBcnlbaV0gPSBwYXJzZUludChsZW5TdHJbaV0pO1xuICAgICAgfVxuICAgICAgbGVuZ3RoQXJ5W2xlblN0ci5sZW5ndGhdID0gMjU1O1xuXG4gICAgICBpZiAoQmxvYikge1xuICAgICAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtiaW5hcnlJZGVudGlmaWVyLmJ1ZmZlciwgbGVuZ3RoQXJ5LmJ1ZmZlciwgZW5jb2RlZF0pO1xuICAgICAgICBkb25lQ2FsbGJhY2sobnVsbCwgYmxvYik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBtYXAocGFja2V0cywgZW5jb2RlT25lLCBmdW5jdGlvbihlcnIsIHJlc3VsdHMpIHtcbiAgICByZXR1cm4gY2FsbGJhY2sobmV3IEJsb2IocmVzdWx0cykpO1xuICB9KTtcbn07XG5cbi8qXG4gKiBEZWNvZGVzIGRhdGEgd2hlbiBhIHBheWxvYWQgaXMgbWF5YmUgZXhwZWN0ZWQuIFN0cmluZ3MgYXJlIGRlY29kZWQgYnlcbiAqIGludGVycHJldGluZyBlYWNoIGJ5dGUgYXMgYSBrZXkgY29kZSBmb3IgZW50cmllcyBtYXJrZWQgdG8gc3RhcnQgd2l0aCAwLiBTZWVcbiAqIGRlc2NyaXB0aW9uIG9mIGVuY29kZVBheWxvYWRBc0JpbmFyeVxuICpcbiAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGRhdGEsIGNhbGxiYWNrIG1ldGhvZFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLmRlY29kZVBheWxvYWRBc0JpbmFyeSA9IGZ1bmN0aW9uIChkYXRhLCBiaW5hcnlUeXBlLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIGJpbmFyeVR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IGJpbmFyeVR5cGU7XG4gICAgYmluYXJ5VHlwZSA9IG51bGw7XG4gIH1cblxuICB2YXIgYnVmZmVyVGFpbCA9IGRhdGE7XG4gIHZhciBidWZmZXJzID0gW107XG5cbiAgdmFyIG51bWJlclRvb0xvbmcgPSBmYWxzZTtcbiAgd2hpbGUgKGJ1ZmZlclRhaWwuYnl0ZUxlbmd0aCA+IDApIHtcbiAgICB2YXIgdGFpbEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyVGFpbCk7XG4gICAgdmFyIGlzU3RyaW5nID0gdGFpbEFycmF5WzBdID09PSAwO1xuICAgIHZhciBtc2dMZW5ndGggPSAnJztcblxuICAgIGZvciAodmFyIGkgPSAxOyA7IGkrKykge1xuICAgICAgaWYgKHRhaWxBcnJheVtpXSA9PSAyNTUpIGJyZWFrO1xuXG4gICAgICBpZiAobXNnTGVuZ3RoLmxlbmd0aCA+IDMxMCkge1xuICAgICAgICBudW1iZXJUb29Mb25nID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIG1zZ0xlbmd0aCArPSB0YWlsQXJyYXlbaV07XG4gICAgfVxuXG4gICAgaWYobnVtYmVyVG9vTG9uZykgcmV0dXJuIGNhbGxiYWNrKGVyciwgMCwgMSk7XG5cbiAgICBidWZmZXJUYWlsID0gc2xpY2VCdWZmZXIoYnVmZmVyVGFpbCwgMiArIG1zZ0xlbmd0aC5sZW5ndGgpO1xuICAgIG1zZ0xlbmd0aCA9IHBhcnNlSW50KG1zZ0xlbmd0aCk7XG5cbiAgICB2YXIgbXNnID0gc2xpY2VCdWZmZXIoYnVmZmVyVGFpbCwgMCwgbXNnTGVuZ3RoKTtcbiAgICBpZiAoaXNTdHJpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG1zZyA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkobXNnKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGlQaG9uZSBTYWZhcmkgZG9lc24ndCBsZXQgeW91IGFwcGx5IHRvIHR5cGVkIGFycmF5c1xuICAgICAgICB2YXIgdHlwZWQgPSBuZXcgVWludDhBcnJheShtc2cpO1xuICAgICAgICBtc2cgPSAnJztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIG1zZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHR5cGVkW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGJ1ZmZlcnMucHVzaChtc2cpO1xuICAgIGJ1ZmZlclRhaWwgPSBzbGljZUJ1ZmZlcihidWZmZXJUYWlsLCBtc2dMZW5ndGgpO1xuICB9XG5cbiAgdmFyIHRvdGFsID0gYnVmZmVycy5sZW5ndGg7XG4gIGJ1ZmZlcnMuZm9yRWFjaChmdW5jdGlvbihidWZmZXIsIGkpIHtcbiAgICBjYWxsYmFjayhleHBvcnRzLmRlY29kZVBhY2tldChidWZmZXIsIGJpbmFyeVR5cGUsIHRydWUpLCBpLCB0b3RhbCk7XG4gIH0pO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9lbmdpbmUuaW8tcGFyc2VyL2xpYi9icm93c2VyLmpzXG4vLyBtb2R1bGUgaWQgPSA1MTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 516 */
/***/ function(module, exports) {

    eval("\n/**\n * Gets the keys for an object.\n *\n * @return {Array} keys\n * @api private\n */\n\nmodule.exports = Object.keys || function keys (obj){\n  var arr = [];\n  var has = Object.prototype.hasOwnProperty;\n\n  for (var i in obj) {\n    if (has.call(obj, i)) {\n      arr.push(i);\n    }\n  }\n  return arr;\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTE2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tcGFyc2VyL2xpYi9rZXlzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBHZXRzIHRoZSBrZXlzIGZvciBhbiBvYmplY3QuXG4gKlxuICogQHJldHVybiB7QXJyYXl9IGtleXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyAob2JqKXtcbiAgdmFyIGFyciA9IFtdO1xuICB2YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgIGlmIChoYXMuY2FsbChvYmosIGkpKSB7XG4gICAgICBhcnIucHVzaChpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFycjtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZW5naW5lLmlvLXBhcnNlci9saWIva2V5cy5qc1xuLy8gbW9kdWxlIGlkID0gNTE2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 517 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(global) {\n/*\n * Module requirements.\n */\n\nvar isArray = __webpack_require__(518);\n\n/**\n * Module exports.\n */\n\nmodule.exports = hasBinary;\n\n/**\n * Checks for binary data.\n *\n * Right now only Buffer and ArrayBuffer are supported..\n *\n * @param {Object} anything\n * @api public\n */\n\nfunction hasBinary(data) {\n\n  function _hasBinary(obj) {\n    if (!obj) return false;\n\n    if ( (global.Buffer && global.Buffer.isBuffer(obj)) ||\n         (global.ArrayBuffer && obj instanceof ArrayBuffer) ||\n         (global.Blob && obj instanceof Blob) ||\n         (global.File && obj instanceof File)\n        ) {\n      return true;\n    }\n\n    if (isArray(obj)) {\n      for (var i = 0; i < obj.length; i++) {\n          if (_hasBinary(obj[i])) {\n              return true;\n          }\n      }\n    } else if (obj && 'object' == typeof obj) {\n      if (obj.toJSON) {\n        obj = obj.toJSON();\n      }\n\n      for (var key in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, key) && _hasBinary(obj[key])) {\n          return true;\n        }\n      }\n    }\n\n    return false;\n  }\n\n  return _hasBinary(data);\n}\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTE3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9oYXMtYmluYXJ5L2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlxuLypcbiAqIE1vZHVsZSByZXF1aXJlbWVudHMuXG4gKi9cblxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5Jyk7XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNCaW5hcnk7XG5cbi8qKlxuICogQ2hlY2tzIGZvciBiaW5hcnkgZGF0YS5cbiAqXG4gKiBSaWdodCBub3cgb25seSBCdWZmZXIgYW5kIEFycmF5QnVmZmVyIGFyZSBzdXBwb3J0ZWQuLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhbnl0aGluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBoYXNCaW5hcnkoZGF0YSkge1xuXG4gIGZ1bmN0aW9uIF9oYXNCaW5hcnkob2JqKSB7XG4gICAgaWYgKCFvYmopIHJldHVybiBmYWxzZTtcblxuICAgIGlmICggKGdsb2JhbC5CdWZmZXIgJiYgZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlcihvYmopKSB8fFxuICAgICAgICAgKGdsb2JhbC5BcnJheUJ1ZmZlciAmJiBvYmogaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgfHxcbiAgICAgICAgIChnbG9iYWwuQmxvYiAmJiBvYmogaW5zdGFuY2VvZiBCbG9iKSB8fFxuICAgICAgICAgKGdsb2JhbC5GaWxlICYmIG9iaiBpbnN0YW5jZW9mIEZpbGUpXG4gICAgICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoX2hhc0JpbmFyeShvYmpbaV0pKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9iaiAmJiAnb2JqZWN0JyA9PSB0eXBlb2Ygb2JqKSB7XG4gICAgICBpZiAob2JqLnRvSlNPTikge1xuICAgICAgICBvYmogPSBvYmoudG9KU09OKCk7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkgJiYgX2hhc0JpbmFyeShvYmpba2V5XSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBfaGFzQmluYXJ5KGRhdGEpO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2hhcy1iaW5hcnkvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDUxN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 518 */
/***/ function(module, exports) {

    eval("module.exports = Array.isArray || function (arr) {\n  return Object.prototype.toString.call(arr) == '[object Array]';\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTE4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9oYXMtYmluYXJ5L25vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9oYXMtYmluYXJ5L34vaXNhcnJheS9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTE4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 519 */
/***/ function(module, exports) {

    eval("/**\n * An abstraction for slicing an arraybuffer even when\n * ArrayBuffer.prototype.slice is not supported\n *\n * @api public\n */\n\nmodule.exports = function(arraybuffer, start, end) {\n  var bytes = arraybuffer.byteLength;\n  start = start || 0;\n  end = end || bytes;\n\n  if (arraybuffer.slice) { return arraybuffer.slice(start, end); }\n\n  if (start < 0) { start += bytes; }\n  if (end < 0) { end += bytes; }\n  if (end > bytes) { end = bytes; }\n\n  if (start >= bytes || start >= end || bytes === 0) {\n    return new ArrayBuffer(0);\n  }\n\n  var abv = new Uint8Array(arraybuffer);\n  var result = new Uint8Array(end - start);\n  for (var i = start, ii = 0; i < end; i++, ii++) {\n    result[ii] = abv[i];\n  }\n  return result.buffer;\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTE5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9hcnJheWJ1ZmZlci5zbGljZS9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFuIGFic3RyYWN0aW9uIGZvciBzbGljaW5nIGFuIGFycmF5YnVmZmVyIGV2ZW4gd2hlblxuICogQXJyYXlCdWZmZXIucHJvdG90eXBlLnNsaWNlIGlzIG5vdCBzdXBwb3J0ZWRcbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYXJyYXlidWZmZXIsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYXJyYXlidWZmZXIuYnl0ZUxlbmd0aDtcbiAgc3RhcnQgPSBzdGFydCB8fCAwO1xuICBlbmQgPSBlbmQgfHwgYnl0ZXM7XG5cbiAgaWYgKGFycmF5YnVmZmVyLnNsaWNlKSB7IHJldHVybiBhcnJheWJ1ZmZlci5zbGljZShzdGFydCwgZW5kKTsgfVxuXG4gIGlmIChzdGFydCA8IDApIHsgc3RhcnQgKz0gYnl0ZXM7IH1cbiAgaWYgKGVuZCA8IDApIHsgZW5kICs9IGJ5dGVzOyB9XG4gIGlmIChlbmQgPiBieXRlcykgeyBlbmQgPSBieXRlczsgfVxuXG4gIGlmIChzdGFydCA+PSBieXRlcyB8fCBzdGFydCA+PSBlbmQgfHwgYnl0ZXMgPT09IDApIHtcbiAgICByZXR1cm4gbmV3IEFycmF5QnVmZmVyKDApO1xuICB9XG5cbiAgdmFyIGFidiA9IG5ldyBVaW50OEFycmF5KGFycmF5YnVmZmVyKTtcbiAgdmFyIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGVuZCAtIHN0YXJ0KTtcbiAgZm9yICh2YXIgaSA9IHN0YXJ0LCBpaSA9IDA7IGkgPCBlbmQ7IGkrKywgaWkrKykge1xuICAgIHJlc3VsdFtpaV0gPSBhYnZbaV07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5idWZmZXI7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2FycmF5YnVmZmVyLnNsaWNlL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA1MTlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 520 */
/***/ function(module, exports) {

    eval("/*\n * base64-arraybuffer\n * https://github.com/niklasvh/base64-arraybuffer\n *\n * Copyright (c) 2012 Niklas von Hertzen\n * Licensed under the MIT license.\n */\n(function(chars){\n  \"use strict\";\n\n  exports.encode = function(arraybuffer) {\n    var bytes = new Uint8Array(arraybuffer),\n    i, len = bytes.length, base64 = \"\";\n\n    for (i = 0; i < len; i+=3) {\n      base64 += chars[bytes[i] >> 2];\n      base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n      base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n      base64 += chars[bytes[i + 2] & 63];\n    }\n\n    if ((len % 3) === 2) {\n      base64 = base64.substring(0, base64.length - 1) + \"=\";\n    } else if (len % 3 === 1) {\n      base64 = base64.substring(0, base64.length - 2) + \"==\";\n    }\n\n    return base64;\n  };\n\n  exports.decode =  function(base64) {\n    var bufferLength = base64.length * 0.75,\n    len = base64.length, i, p = 0,\n    encoded1, encoded2, encoded3, encoded4;\n\n    if (base64[base64.length - 1] === \"=\") {\n      bufferLength--;\n      if (base64[base64.length - 2] === \"=\") {\n        bufferLength--;\n      }\n    }\n\n    var arraybuffer = new ArrayBuffer(bufferLength),\n    bytes = new Uint8Array(arraybuffer);\n\n    for (i = 0; i < len; i+=4) {\n      encoded1 = chars.indexOf(base64[i]);\n      encoded2 = chars.indexOf(base64[i+1]);\n      encoded3 = chars.indexOf(base64[i+2]);\n      encoded4 = chars.indexOf(base64[i+3]);\n\n      bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n      bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n      bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n    }\n\n    return arraybuffer;\n  };\n})(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\");\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTIwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9iYXNlNjQtYXJyYXlidWZmZXIvbGliL2Jhc2U2NC1hcnJheWJ1ZmZlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogYmFzZTY0LWFycmF5YnVmZmVyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbmlrbGFzdmgvYmFzZTY0LWFycmF5YnVmZmVyXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEyIE5pa2xhcyB2b24gSGVydHplblxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICovXG4oZnVuY3Rpb24oY2hhcnMpe1xuICBcInVzZSBzdHJpY3RcIjtcblxuICBleHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uKGFycmF5YnVmZmVyKSB7XG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpLFxuICAgIGksIGxlbiA9IGJ5dGVzLmxlbmd0aCwgYmFzZTY0ID0gXCJcIjtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrPTMpIHtcbiAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpXSA+PiAyXTtcbiAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2ldICYgMykgPDwgNCkgfCAoYnl0ZXNbaSArIDFdID4+IDQpXTtcbiAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2kgKyAxXSAmIDE1KSA8PCAyKSB8IChieXRlc1tpICsgMl0gPj4gNildO1xuICAgICAgYmFzZTY0ICs9IGNoYXJzW2J5dGVzW2kgKyAyXSAmIDYzXTtcbiAgICB9XG5cbiAgICBpZiAoKGxlbiAlIDMpID09PSAyKSB7XG4gICAgICBiYXNlNjQgPSBiYXNlNjQuc3Vic3RyaW5nKDAsIGJhc2U2NC5sZW5ndGggLSAxKSArIFwiPVwiO1xuICAgIH0gZWxzZSBpZiAobGVuICUgMyA9PT0gMSkge1xuICAgICAgYmFzZTY0ID0gYmFzZTY0LnN1YnN0cmluZygwLCBiYXNlNjQubGVuZ3RoIC0gMikgKyBcIj09XCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2U2NDtcbiAgfTtcblxuICBleHBvcnRzLmRlY29kZSA9ICBmdW5jdGlvbihiYXNlNjQpIHtcbiAgICB2YXIgYnVmZmVyTGVuZ3RoID0gYmFzZTY0Lmxlbmd0aCAqIDAuNzUsXG4gICAgbGVuID0gYmFzZTY0Lmxlbmd0aCwgaSwgcCA9IDAsXG4gICAgZW5jb2RlZDEsIGVuY29kZWQyLCBlbmNvZGVkMywgZW5jb2RlZDQ7XG5cbiAgICBpZiAoYmFzZTY0W2Jhc2U2NC5sZW5ndGggLSAxXSA9PT0gXCI9XCIpIHtcbiAgICAgIGJ1ZmZlckxlbmd0aC0tO1xuICAgICAgaWYgKGJhc2U2NFtiYXNlNjQubGVuZ3RoIC0gMl0gPT09IFwiPVwiKSB7XG4gICAgICAgIGJ1ZmZlckxlbmd0aC0tO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBhcnJheWJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihidWZmZXJMZW5ndGgpLFxuICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSs9NCkge1xuICAgICAgZW5jb2RlZDEgPSBjaGFycy5pbmRleE9mKGJhc2U2NFtpXSk7XG4gICAgICBlbmNvZGVkMiA9IGNoYXJzLmluZGV4T2YoYmFzZTY0W2krMV0pO1xuICAgICAgZW5jb2RlZDMgPSBjaGFycy5pbmRleE9mKGJhc2U2NFtpKzJdKTtcbiAgICAgIGVuY29kZWQ0ID0gY2hhcnMuaW5kZXhPZihiYXNlNjRbaSszXSk7XG5cbiAgICAgIGJ5dGVzW3ArK10gPSAoZW5jb2RlZDEgPDwgMikgfCAoZW5jb2RlZDIgPj4gNCk7XG4gICAgICBieXRlc1twKytdID0gKChlbmNvZGVkMiAmIDE1KSA8PCA0KSB8IChlbmNvZGVkMyA+PiAyKTtcbiAgICAgIGJ5dGVzW3ArK10gPSAoKGVuY29kZWQzICYgMykgPDwgNikgfCAoZW5jb2RlZDQgJiA2Myk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycmF5YnVmZmVyO1xuICB9O1xufSkoXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCIpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Jhc2U2NC1hcnJheWJ1ZmZlci9saWIvYmFzZTY0LWFycmF5YnVmZmVyLmpzXG4vLyBtb2R1bGUgaWQgPSA1MjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 521 */
/***/ function(module, exports) {

    eval("module.exports = after\n\nfunction after(count, callback, err_cb) {\n    var bail = false\n    err_cb = err_cb || noop\n    proxy.count = count\n\n    return (count === 0) ? callback() : proxy\n\n    function proxy(err, result) {\n        if (proxy.count <= 0) {\n            throw new Error('after called too many times')\n        }\n        --proxy.count\n\n        // after first error, rest are passed to err_cb\n        if (err) {\n            bail = true\n            callback(err)\n            // future error callbacks will go to error handler\n            callback = err_cb\n        } else if (proxy.count === 0 && !bail) {\n            callback(null, result)\n        }\n    }\n}\n\nfunction noop() {}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTIxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9hZnRlci9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGFmdGVyXG5cbmZ1bmN0aW9uIGFmdGVyKGNvdW50LCBjYWxsYmFjaywgZXJyX2NiKSB7XG4gICAgdmFyIGJhaWwgPSBmYWxzZVxuICAgIGVycl9jYiA9IGVycl9jYiB8fCBub29wXG4gICAgcHJveHkuY291bnQgPSBjb3VudFxuXG4gICAgcmV0dXJuIChjb3VudCA9PT0gMCkgPyBjYWxsYmFjaygpIDogcHJveHlcblxuICAgIGZ1bmN0aW9uIHByb3h5KGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGlmIChwcm94eS5jb3VudCA8PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FmdGVyIGNhbGxlZCB0b28gbWFueSB0aW1lcycpXG4gICAgICAgIH1cbiAgICAgICAgLS1wcm94eS5jb3VudFxuXG4gICAgICAgIC8vIGFmdGVyIGZpcnN0IGVycm9yLCByZXN0IGFyZSBwYXNzZWQgdG8gZXJyX2NiXG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIGJhaWwgPSB0cnVlXG4gICAgICAgICAgICBjYWxsYmFjayhlcnIpXG4gICAgICAgICAgICAvLyBmdXR1cmUgZXJyb3IgY2FsbGJhY2tzIHdpbGwgZ28gdG8gZXJyb3IgaGFuZGxlclxuICAgICAgICAgICAgY2FsbGJhY2sgPSBlcnJfY2JcbiAgICAgICAgfSBlbHNlIGlmIChwcm94eS5jb3VudCA9PT0gMCAmJiAhYmFpbCkge1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KVxuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBub29wKCkge31cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9hZnRlci9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTIxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 522 */
/***/ function(module, exports, __webpack_require__) {

    eval("var __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(module, global) {/*! https://mths.be/utf8js v2.0.0 by @mathias */\n;(function(root) {\n\n\t// Detect free variables `exports`\n\tvar freeExports = typeof exports == 'object' && exports;\n\n\t// Detect free variable `module`\n\tvar freeModule = typeof module == 'object' && module &&\n\t\tmodule.exports == freeExports && module;\n\n\t// Detect free variable `global`, from Node.js or Browserified code,\n\t// and use it as `root`\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {\n\t\troot = freeGlobal;\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\tvar stringFromCharCode = String.fromCharCode;\n\n\t// Taken from https://mths.be/punycode\n\tfunction ucs2decode(string) {\n\t\tvar output = [];\n\t\tvar counter = 0;\n\t\tvar length = string.length;\n\t\tvar value;\n\t\tvar extra;\n\t\twhile (counter < length) {\n\t\t\tvalue = string.charCodeAt(counter++);\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t\t// high surrogate, and there is a next character\n\t\t\t\textra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t\t} else {\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\t\toutput.push(value);\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t// Taken from https://mths.be/punycode\n\tfunction ucs2encode(array) {\n\t\tvar length = array.length;\n\t\tvar index = -1;\n\t\tvar value;\n\t\tvar output = '';\n\t\twhile (++index < length) {\n\t\t\tvalue = array[index];\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tvalue -= 0x10000;\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t\t}\n\t\t\toutput += stringFromCharCode(value);\n\t\t}\n\t\treturn output;\n\t}\n\n\tfunction checkScalarValue(codePoint) {\n\t\tif (codePoint >= 0xD800 && codePoint <= 0xDFFF) {\n\t\t\tthrow Error(\n\t\t\t\t'Lone surrogate U+' + codePoint.toString(16).toUpperCase() +\n\t\t\t\t' is not a scalar value'\n\t\t\t);\n\t\t}\n\t}\n\t/*--------------------------------------------------------------------------*/\n\n\tfunction createByte(codePoint, shift) {\n\t\treturn stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80);\n\t}\n\n\tfunction encodeCodePoint(codePoint) {\n\t\tif ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence\n\t\t\treturn stringFromCharCode(codePoint);\n\t\t}\n\t\tvar symbol = '';\n\t\tif ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence\n\t\t\tsymbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0);\n\t\t}\n\t\telse if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence\n\t\t\tcheckScalarValue(codePoint);\n\t\t\tsymbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0);\n\t\t\tsymbol += createByte(codePoint, 6);\n\t\t}\n\t\telse if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence\n\t\t\tsymbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0);\n\t\t\tsymbol += createByte(codePoint, 12);\n\t\t\tsymbol += createByte(codePoint, 6);\n\t\t}\n\t\tsymbol += stringFromCharCode((codePoint & 0x3F) | 0x80);\n\t\treturn symbol;\n\t}\n\n\tfunction utf8encode(string) {\n\t\tvar codePoints = ucs2decode(string);\n\t\tvar length = codePoints.length;\n\t\tvar index = -1;\n\t\tvar codePoint;\n\t\tvar byteString = '';\n\t\twhile (++index < length) {\n\t\t\tcodePoint = codePoints[index];\n\t\t\tbyteString += encodeCodePoint(codePoint);\n\t\t}\n\t\treturn byteString;\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\tfunction readContinuationByte() {\n\t\tif (byteIndex >= byteCount) {\n\t\t\tthrow Error('Invalid byte index');\n\t\t}\n\n\t\tvar continuationByte = byteArray[byteIndex] & 0xFF;\n\t\tbyteIndex++;\n\n\t\tif ((continuationByte & 0xC0) == 0x80) {\n\t\t\treturn continuationByte & 0x3F;\n\t\t}\n\n\t\t// If we end up here, it’s not a continuation byte\n\t\tthrow Error('Invalid continuation byte');\n\t}\n\n\tfunction decodeSymbol() {\n\t\tvar byte1;\n\t\tvar byte2;\n\t\tvar byte3;\n\t\tvar byte4;\n\t\tvar codePoint;\n\n\t\tif (byteIndex > byteCount) {\n\t\t\tthrow Error('Invalid byte index');\n\t\t}\n\n\t\tif (byteIndex == byteCount) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Read first byte\n\t\tbyte1 = byteArray[byteIndex] & 0xFF;\n\t\tbyteIndex++;\n\n\t\t// 1-byte sequence (no continuation bytes)\n\t\tif ((byte1 & 0x80) == 0) {\n\t\t\treturn byte1;\n\t\t}\n\n\t\t// 2-byte sequence\n\t\tif ((byte1 & 0xE0) == 0xC0) {\n\t\t\tvar byte2 = readContinuationByte();\n\t\t\tcodePoint = ((byte1 & 0x1F) << 6) | byte2;\n\t\t\tif (codePoint >= 0x80) {\n\t\t\t\treturn codePoint;\n\t\t\t} else {\n\t\t\t\tthrow Error('Invalid continuation byte');\n\t\t\t}\n\t\t}\n\n\t\t// 3-byte sequence (may include unpaired surrogates)\n\t\tif ((byte1 & 0xF0) == 0xE0) {\n\t\t\tbyte2 = readContinuationByte();\n\t\t\tbyte3 = readContinuationByte();\n\t\t\tcodePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3;\n\t\t\tif (codePoint >= 0x0800) {\n\t\t\t\tcheckScalarValue(codePoint);\n\t\t\t\treturn codePoint;\n\t\t\t} else {\n\t\t\t\tthrow Error('Invalid continuation byte');\n\t\t\t}\n\t\t}\n\n\t\t// 4-byte sequence\n\t\tif ((byte1 & 0xF8) == 0xF0) {\n\t\t\tbyte2 = readContinuationByte();\n\t\t\tbyte3 = readContinuationByte();\n\t\t\tbyte4 = readContinuationByte();\n\t\t\tcodePoint = ((byte1 & 0x0F) << 0x12) | (byte2 << 0x0C) |\n\t\t\t\t(byte3 << 0x06) | byte4;\n\t\t\tif (codePoint >= 0x010000 && codePoint <= 0x10FFFF) {\n\t\t\t\treturn codePoint;\n\t\t\t}\n\t\t}\n\n\t\tthrow Error('Invalid UTF-8 detected');\n\t}\n\n\tvar byteArray;\n\tvar byteCount;\n\tvar byteIndex;\n\tfunction utf8decode(byteString) {\n\t\tbyteArray = ucs2decode(byteString);\n\t\tbyteCount = byteArray.length;\n\t\tbyteIndex = 0;\n\t\tvar codePoints = [];\n\t\tvar tmp;\n\t\twhile ((tmp = decodeSymbol()) !== false) {\n\t\t\tcodePoints.push(tmp);\n\t\t}\n\t\treturn ucs2encode(codePoints);\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\tvar utf8 = {\n\t\t'version': '2.0.0',\n\t\t'encode': utf8encode,\n\t\t'decode': utf8decode\n\t};\n\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttrue\n\t) {\n\t\t!(__WEBPACK_AMD_DEFINE_RESULT__ = function() {\n\t\t\treturn utf8;\n\t\t}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t}\telse if (freeExports && !freeExports.nodeType) {\n\t\tif (freeModule) { // in Node.js or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = utf8;\n\t\t} else { // in Narwhal or RingoJS v0.7.0-\n\t\t\tvar object = {};\n\t\t\tvar hasOwnProperty = object.hasOwnProperty;\n\t\t\tfor (var key in utf8) {\n\t\t\t\thasOwnProperty.call(utf8, key) && (freeExports[key] = utf8[key]);\n\t\t\t}\n\t\t}\n\t} else { // in Rhino or a web browser\n\t\troot.utf8 = utf8;\n\t}\n\n}(this));\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(96)(module), (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTIyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy91dGY4L3V0ZjguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohIGh0dHBzOi8vbXRocy5iZS91dGY4anMgdjIuMC4wIGJ5IEBtYXRoaWFzICovXG47KGZ1bmN0aW9uKHJvb3QpIHtcblxuXHQvLyBEZXRlY3QgZnJlZSB2YXJpYWJsZXMgYGV4cG9ydHNgXG5cdHZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHM7XG5cblx0Ly8gRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWBcblx0dmFyIGZyZWVNb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJlxuXHRcdG1vZHVsZS5leHBvcnRzID09IGZyZWVFeHBvcnRzICYmIG1vZHVsZTtcblxuXHQvLyBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCwgZnJvbSBOb2RlLmpzIG9yIEJyb3dzZXJpZmllZCBjb2RlLFxuXHQvLyBhbmQgdXNlIGl0IGFzIGByb290YFxuXHR2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsO1xuXHRpZiAoZnJlZUdsb2JhbC5nbG9iYWwgPT09IGZyZWVHbG9iYWwgfHwgZnJlZUdsb2JhbC53aW5kb3cgPT09IGZyZWVHbG9iYWwpIHtcblx0XHRyb290ID0gZnJlZUdsb2JhbDtcblx0fVxuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdHZhciBzdHJpbmdGcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xuXG5cdC8vIFRha2VuIGZyb20gaHR0cHM6Ly9tdGhzLmJlL3B1bnljb2RlXG5cdGZ1bmN0aW9uIHVjczJkZWNvZGUoc3RyaW5nKSB7XG5cdFx0dmFyIG91dHB1dCA9IFtdO1xuXHRcdHZhciBjb3VudGVyID0gMDtcblx0XHR2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcblx0XHR2YXIgdmFsdWU7XG5cdFx0dmFyIGV4dHJhO1xuXHRcdHdoaWxlIChjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHR2YWx1ZSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGhpZ2ggc3Vycm9nYXRlLCBhbmQgdGhlcmUgaXMgYSBuZXh0IGNoYXJhY3RlclxuXHRcdFx0XHRleHRyYSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRcdGlmICgoZXh0cmEgJiAweEZDMDApID09IDB4REMwMCkgeyAvLyBsb3cgc3Vycm9nYXRlXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2goKCh2YWx1ZSAmIDB4M0ZGKSA8PCAxMCkgKyAoZXh0cmEgJiAweDNGRikgKyAweDEwMDAwKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB1bm1hdGNoZWQgc3Vycm9nYXRlOyBvbmx5IGFwcGVuZCB0aGlzIGNvZGUgdW5pdCwgaW4gY2FzZSB0aGUgbmV4dFxuXHRcdFx0XHRcdC8vIGNvZGUgdW5pdCBpcyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXJyb2dhdGUgcGFpclxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdFx0XHRjb3VudGVyLS07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dDtcblx0fVxuXG5cdC8vIFRha2VuIGZyb20gaHR0cHM6Ly9tdGhzLmJlL3B1bnljb2RlXG5cdGZ1bmN0aW9uIHVjczJlbmNvZGUoYXJyYXkpIHtcblx0XHR2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXHRcdHZhciBpbmRleCA9IC0xO1xuXHRcdHZhciB2YWx1ZTtcblx0XHR2YXIgb3V0cHV0ID0gJyc7XG5cdFx0d2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcblx0XHRcdHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuXHRcdFx0aWYgKHZhbHVlID4gMHhGRkZGKSB7XG5cdFx0XHRcdHZhbHVlIC09IDB4MTAwMDA7XG5cdFx0XHRcdG91dHB1dCArPSBzdHJpbmdGcm9tQ2hhckNvZGUodmFsdWUgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApO1xuXHRcdFx0XHR2YWx1ZSA9IDB4REMwMCB8IHZhbHVlICYgMHgzRkY7XG5cdFx0XHR9XG5cdFx0XHRvdXRwdXQgKz0gc3RyaW5nRnJvbUNoYXJDb2RlKHZhbHVlKTtcblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dDtcblx0fVxuXG5cdGZ1bmN0aW9uIGNoZWNrU2NhbGFyVmFsdWUoY29kZVBvaW50KSB7XG5cdFx0aWYgKGNvZGVQb2ludCA+PSAweEQ4MDAgJiYgY29kZVBvaW50IDw9IDB4REZGRikge1xuXHRcdFx0dGhyb3cgRXJyb3IoXG5cdFx0XHRcdCdMb25lIHN1cnJvZ2F0ZSBVKycgKyBjb2RlUG9pbnQudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkgK1xuXHRcdFx0XHQnIGlzIG5vdCBhIHNjYWxhciB2YWx1ZSdcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdGZ1bmN0aW9uIGNyZWF0ZUJ5dGUoY29kZVBvaW50LCBzaGlmdCkge1xuXHRcdHJldHVybiBzdHJpbmdGcm9tQ2hhckNvZGUoKChjb2RlUG9pbnQgPj4gc2hpZnQpICYgMHgzRikgfCAweDgwKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGVuY29kZUNvZGVQb2ludChjb2RlUG9pbnQpIHtcblx0XHRpZiAoKGNvZGVQb2ludCAmIDB4RkZGRkZGODApID09IDApIHsgLy8gMS1ieXRlIHNlcXVlbmNlXG5cdFx0XHRyZXR1cm4gc3RyaW5nRnJvbUNoYXJDb2RlKGNvZGVQb2ludCk7XG5cdFx0fVxuXHRcdHZhciBzeW1ib2wgPSAnJztcblx0XHRpZiAoKGNvZGVQb2ludCAmIDB4RkZGRkY4MDApID09IDApIHsgLy8gMi1ieXRlIHNlcXVlbmNlXG5cdFx0XHRzeW1ib2wgPSBzdHJpbmdGcm9tQ2hhckNvZGUoKChjb2RlUG9pbnQgPj4gNikgJiAweDFGKSB8IDB4QzApO1xuXHRcdH1cblx0XHRlbHNlIGlmICgoY29kZVBvaW50ICYgMHhGRkZGMDAwMCkgPT0gMCkgeyAvLyAzLWJ5dGUgc2VxdWVuY2Vcblx0XHRcdGNoZWNrU2NhbGFyVmFsdWUoY29kZVBvaW50KTtcblx0XHRcdHN5bWJvbCA9IHN0cmluZ0Zyb21DaGFyQ29kZSgoKGNvZGVQb2ludCA+PiAxMikgJiAweDBGKSB8IDB4RTApO1xuXHRcdFx0c3ltYm9sICs9IGNyZWF0ZUJ5dGUoY29kZVBvaW50LCA2KTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoKGNvZGVQb2ludCAmIDB4RkZFMDAwMDApID09IDApIHsgLy8gNC1ieXRlIHNlcXVlbmNlXG5cdFx0XHRzeW1ib2wgPSBzdHJpbmdGcm9tQ2hhckNvZGUoKChjb2RlUG9pbnQgPj4gMTgpICYgMHgwNykgfCAweEYwKTtcblx0XHRcdHN5bWJvbCArPSBjcmVhdGVCeXRlKGNvZGVQb2ludCwgMTIpO1xuXHRcdFx0c3ltYm9sICs9IGNyZWF0ZUJ5dGUoY29kZVBvaW50LCA2KTtcblx0XHR9XG5cdFx0c3ltYm9sICs9IHN0cmluZ0Zyb21DaGFyQ29kZSgoY29kZVBvaW50ICYgMHgzRikgfCAweDgwKTtcblx0XHRyZXR1cm4gc3ltYm9sO1xuXHR9XG5cblx0ZnVuY3Rpb24gdXRmOGVuY29kZShzdHJpbmcpIHtcblx0XHR2YXIgY29kZVBvaW50cyA9IHVjczJkZWNvZGUoc3RyaW5nKTtcblx0XHR2YXIgbGVuZ3RoID0gY29kZVBvaW50cy5sZW5ndGg7XG5cdFx0dmFyIGluZGV4ID0gLTE7XG5cdFx0dmFyIGNvZGVQb2ludDtcblx0XHR2YXIgYnl0ZVN0cmluZyA9ICcnO1xuXHRcdHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG5cdFx0XHRjb2RlUG9pbnQgPSBjb2RlUG9pbnRzW2luZGV4XTtcblx0XHRcdGJ5dGVTdHJpbmcgKz0gZW5jb2RlQ29kZVBvaW50KGNvZGVQb2ludCk7XG5cdFx0fVxuXHRcdHJldHVybiBieXRlU3RyaW5nO1xuXHR9XG5cblx0LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cblx0ZnVuY3Rpb24gcmVhZENvbnRpbnVhdGlvbkJ5dGUoKSB7XG5cdFx0aWYgKGJ5dGVJbmRleCA+PSBieXRlQ291bnQpIHtcblx0XHRcdHRocm93IEVycm9yKCdJbnZhbGlkIGJ5dGUgaW5kZXgnKTtcblx0XHR9XG5cblx0XHR2YXIgY29udGludWF0aW9uQnl0ZSA9IGJ5dGVBcnJheVtieXRlSW5kZXhdICYgMHhGRjtcblx0XHRieXRlSW5kZXgrKztcblxuXHRcdGlmICgoY29udGludWF0aW9uQnl0ZSAmIDB4QzApID09IDB4ODApIHtcblx0XHRcdHJldHVybiBjb250aW51YXRpb25CeXRlICYgMHgzRjtcblx0XHR9XG5cblx0XHQvLyBJZiB3ZSBlbmQgdXAgaGVyZSwgaXTigJlzIG5vdCBhIGNvbnRpbnVhdGlvbiBieXRlXG5cdFx0dGhyb3cgRXJyb3IoJ0ludmFsaWQgY29udGludWF0aW9uIGJ5dGUnKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGRlY29kZVN5bWJvbCgpIHtcblx0XHR2YXIgYnl0ZTE7XG5cdFx0dmFyIGJ5dGUyO1xuXHRcdHZhciBieXRlMztcblx0XHR2YXIgYnl0ZTQ7XG5cdFx0dmFyIGNvZGVQb2ludDtcblxuXHRcdGlmIChieXRlSW5kZXggPiBieXRlQ291bnQpIHtcblx0XHRcdHRocm93IEVycm9yKCdJbnZhbGlkIGJ5dGUgaW5kZXgnKTtcblx0XHR9XG5cblx0XHRpZiAoYnl0ZUluZGV4ID09IGJ5dGVDb3VudCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIFJlYWQgZmlyc3QgYnl0ZVxuXHRcdGJ5dGUxID0gYnl0ZUFycmF5W2J5dGVJbmRleF0gJiAweEZGO1xuXHRcdGJ5dGVJbmRleCsrO1xuXG5cdFx0Ly8gMS1ieXRlIHNlcXVlbmNlIChubyBjb250aW51YXRpb24gYnl0ZXMpXG5cdFx0aWYgKChieXRlMSAmIDB4ODApID09IDApIHtcblx0XHRcdHJldHVybiBieXRlMTtcblx0XHR9XG5cblx0XHQvLyAyLWJ5dGUgc2VxdWVuY2Vcblx0XHRpZiAoKGJ5dGUxICYgMHhFMCkgPT0gMHhDMCkge1xuXHRcdFx0dmFyIGJ5dGUyID0gcmVhZENvbnRpbnVhdGlvbkJ5dGUoKTtcblx0XHRcdGNvZGVQb2ludCA9ICgoYnl0ZTEgJiAweDFGKSA8PCA2KSB8IGJ5dGUyO1xuXHRcdFx0aWYgKGNvZGVQb2ludCA+PSAweDgwKSB7XG5cdFx0XHRcdHJldHVybiBjb2RlUG9pbnQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aHJvdyBFcnJvcignSW52YWxpZCBjb250aW51YXRpb24gYnl0ZScpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIDMtYnl0ZSBzZXF1ZW5jZSAobWF5IGluY2x1ZGUgdW5wYWlyZWQgc3Vycm9nYXRlcylcblx0XHRpZiAoKGJ5dGUxICYgMHhGMCkgPT0gMHhFMCkge1xuXHRcdFx0Ynl0ZTIgPSByZWFkQ29udGludWF0aW9uQnl0ZSgpO1xuXHRcdFx0Ynl0ZTMgPSByZWFkQ29udGludWF0aW9uQnl0ZSgpO1xuXHRcdFx0Y29kZVBvaW50ID0gKChieXRlMSAmIDB4MEYpIDw8IDEyKSB8IChieXRlMiA8PCA2KSB8IGJ5dGUzO1xuXHRcdFx0aWYgKGNvZGVQb2ludCA+PSAweDA4MDApIHtcblx0XHRcdFx0Y2hlY2tTY2FsYXJWYWx1ZShjb2RlUG9pbnQpO1xuXHRcdFx0XHRyZXR1cm4gY29kZVBvaW50O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgRXJyb3IoJ0ludmFsaWQgY29udGludWF0aW9uIGJ5dGUnKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyA0LWJ5dGUgc2VxdWVuY2Vcblx0XHRpZiAoKGJ5dGUxICYgMHhGOCkgPT0gMHhGMCkge1xuXHRcdFx0Ynl0ZTIgPSByZWFkQ29udGludWF0aW9uQnl0ZSgpO1xuXHRcdFx0Ynl0ZTMgPSByZWFkQ29udGludWF0aW9uQnl0ZSgpO1xuXHRcdFx0Ynl0ZTQgPSByZWFkQ29udGludWF0aW9uQnl0ZSgpO1xuXHRcdFx0Y29kZVBvaW50ID0gKChieXRlMSAmIDB4MEYpIDw8IDB4MTIpIHwgKGJ5dGUyIDw8IDB4MEMpIHxcblx0XHRcdFx0KGJ5dGUzIDw8IDB4MDYpIHwgYnl0ZTQ7XG5cdFx0XHRpZiAoY29kZVBvaW50ID49IDB4MDEwMDAwICYmIGNvZGVQb2ludCA8PSAweDEwRkZGRikge1xuXHRcdFx0XHRyZXR1cm4gY29kZVBvaW50O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRocm93IEVycm9yKCdJbnZhbGlkIFVURi04IGRldGVjdGVkJyk7XG5cdH1cblxuXHR2YXIgYnl0ZUFycmF5O1xuXHR2YXIgYnl0ZUNvdW50O1xuXHR2YXIgYnl0ZUluZGV4O1xuXHRmdW5jdGlvbiB1dGY4ZGVjb2RlKGJ5dGVTdHJpbmcpIHtcblx0XHRieXRlQXJyYXkgPSB1Y3MyZGVjb2RlKGJ5dGVTdHJpbmcpO1xuXHRcdGJ5dGVDb3VudCA9IGJ5dGVBcnJheS5sZW5ndGg7XG5cdFx0Ynl0ZUluZGV4ID0gMDtcblx0XHR2YXIgY29kZVBvaW50cyA9IFtdO1xuXHRcdHZhciB0bXA7XG5cdFx0d2hpbGUgKCh0bXAgPSBkZWNvZGVTeW1ib2woKSkgIT09IGZhbHNlKSB7XG5cdFx0XHRjb2RlUG9pbnRzLnB1c2godG1wKTtcblx0XHR9XG5cdFx0cmV0dXJuIHVjczJlbmNvZGUoY29kZVBvaW50cyk7XG5cdH1cblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHR2YXIgdXRmOCA9IHtcblx0XHQndmVyc2lvbic6ICcyLjAuMCcsXG5cdFx0J2VuY29kZSc6IHV0ZjhlbmNvZGUsXG5cdFx0J2RlY29kZSc6IHV0ZjhkZWNvZGVcblx0fTtcblxuXHQvLyBTb21lIEFNRCBidWlsZCBvcHRpbWl6ZXJzLCBsaWtlIHIuanMsIGNoZWNrIGZvciBzcGVjaWZpYyBjb25kaXRpb24gcGF0dGVybnNcblx0Ly8gbGlrZSB0aGUgZm9sbG93aW5nOlxuXHRpZiAoXG5cdFx0dHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIGRlZmluZS5hbWQgPT0gJ29iamVjdCcgJiZcblx0XHRkZWZpbmUuYW1kXG5cdCkge1xuXHRcdGRlZmluZShmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB1dGY4O1xuXHRcdH0pO1xuXHR9XHRlbHNlIGlmIChmcmVlRXhwb3J0cyAmJiAhZnJlZUV4cG9ydHMubm9kZVR5cGUpIHtcblx0XHRpZiAoZnJlZU1vZHVsZSkgeyAvLyBpbiBOb2RlLmpzIG9yIFJpbmdvSlMgdjAuOC4wK1xuXHRcdFx0ZnJlZU1vZHVsZS5leHBvcnRzID0gdXRmODtcblx0XHR9IGVsc2UgeyAvLyBpbiBOYXJ3aGFsIG9yIFJpbmdvSlMgdjAuNy4wLVxuXHRcdFx0dmFyIG9iamVjdCA9IHt9O1xuXHRcdFx0dmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0Lmhhc093blByb3BlcnR5O1xuXHRcdFx0Zm9yICh2YXIga2V5IGluIHV0ZjgpIHtcblx0XHRcdFx0aGFzT3duUHJvcGVydHkuY2FsbCh1dGY4LCBrZXkpICYmIChmcmVlRXhwb3J0c1trZXldID0gdXRmOFtrZXldKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSB7IC8vIGluIFJoaW5vIG9yIGEgd2ViIGJyb3dzZXJcblx0XHRyb290LnV0ZjggPSB1dGY4O1xuXHR9XG5cbn0odGhpcykpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3V0ZjgvdXRmOC5qc1xuLy8gbW9kdWxlIGlkID0gNTIyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 523 */
/***/ function(module, exports) {

    eval("/* WEBPACK VAR INJECTION */(function(global) {/**\n * Create a blob builder even when vendor prefixes exist\n */\n\nvar BlobBuilder = global.BlobBuilder\n  || global.WebKitBlobBuilder\n  || global.MSBlobBuilder\n  || global.MozBlobBuilder;\n\n/**\n * Check if Blob constructor is supported\n */\n\nvar blobSupported = (function() {\n  try {\n    var a = new Blob(['hi']);\n    return a.size === 2;\n  } catch(e) {\n    return false;\n  }\n})();\n\n/**\n * Check if Blob constructor supports ArrayBufferViews\n * Fails in Safari 6, so we need to map to ArrayBuffers there.\n */\n\nvar blobSupportsArrayBufferView = blobSupported && (function() {\n  try {\n    var b = new Blob([new Uint8Array([1,2])]);\n    return b.size === 2;\n  } catch(e) {\n    return false;\n  }\n})();\n\n/**\n * Check if BlobBuilder is supported\n */\n\nvar blobBuilderSupported = BlobBuilder\n  && BlobBuilder.prototype.append\n  && BlobBuilder.prototype.getBlob;\n\n/**\n * Helper function that maps ArrayBufferViews to ArrayBuffers\n * Used by BlobBuilder constructor and old browsers that didn't\n * support it in the Blob constructor.\n */\n\nfunction mapArrayBufferViews(ary) {\n  for (var i = 0; i < ary.length; i++) {\n    var chunk = ary[i];\n    if (chunk.buffer instanceof ArrayBuffer) {\n      var buf = chunk.buffer;\n\n      // if this is a subarray, make a copy so we only\n      // include the subarray region from the underlying buffer\n      if (chunk.byteLength !== buf.byteLength) {\n        var copy = new Uint8Array(chunk.byteLength);\n        copy.set(new Uint8Array(buf, chunk.byteOffset, chunk.byteLength));\n        buf = copy.buffer;\n      }\n\n      ary[i] = buf;\n    }\n  }\n}\n\nfunction BlobBuilderConstructor(ary, options) {\n  options = options || {};\n\n  var bb = new BlobBuilder();\n  mapArrayBufferViews(ary);\n\n  for (var i = 0; i < ary.length; i++) {\n    bb.append(ary[i]);\n  }\n\n  return (options.type) ? bb.getBlob(options.type) : bb.getBlob();\n};\n\nfunction BlobConstructor(ary, options) {\n  mapArrayBufferViews(ary);\n  return new Blob(ary, options || {});\n};\n\nmodule.exports = (function() {\n  if (blobSupported) {\n    return blobSupportsArrayBufferView ? global.Blob : BlobConstructor;\n  } else if (blobBuilderSupported) {\n    return BlobBuilderConstructor;\n  } else {\n    return undefined;\n  }\n})();\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTIzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9ibG9iL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ3JlYXRlIGEgYmxvYiBidWlsZGVyIGV2ZW4gd2hlbiB2ZW5kb3IgcHJlZml4ZXMgZXhpc3RcbiAqL1xuXG52YXIgQmxvYkJ1aWxkZXIgPSBnbG9iYWwuQmxvYkJ1aWxkZXJcbiAgfHwgZ2xvYmFsLldlYktpdEJsb2JCdWlsZGVyXG4gIHx8IGdsb2JhbC5NU0Jsb2JCdWlsZGVyXG4gIHx8IGdsb2JhbC5Nb3pCbG9iQnVpbGRlcjtcblxuLyoqXG4gKiBDaGVjayBpZiBCbG9iIGNvbnN0cnVjdG9yIGlzIHN1cHBvcnRlZFxuICovXG5cbnZhciBibG9iU3VwcG9ydGVkID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIHZhciBhID0gbmV3IEJsb2IoWydoaSddKTtcbiAgICByZXR1cm4gYS5zaXplID09PSAyO1xuICB9IGNhdGNoKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn0pKCk7XG5cbi8qKlxuICogQ2hlY2sgaWYgQmxvYiBjb25zdHJ1Y3RvciBzdXBwb3J0cyBBcnJheUJ1ZmZlclZpZXdzXG4gKiBGYWlscyBpbiBTYWZhcmkgNiwgc28gd2UgbmVlZCB0byBtYXAgdG8gQXJyYXlCdWZmZXJzIHRoZXJlLlxuICovXG5cbnZhciBibG9iU3VwcG9ydHNBcnJheUJ1ZmZlclZpZXcgPSBibG9iU3VwcG9ydGVkICYmIChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICB2YXIgYiA9IG5ldyBCbG9iKFtuZXcgVWludDhBcnJheShbMSwyXSldKTtcbiAgICByZXR1cm4gYi5zaXplID09PSAyO1xuICB9IGNhdGNoKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn0pKCk7XG5cbi8qKlxuICogQ2hlY2sgaWYgQmxvYkJ1aWxkZXIgaXMgc3VwcG9ydGVkXG4gKi9cblxudmFyIGJsb2JCdWlsZGVyU3VwcG9ydGVkID0gQmxvYkJ1aWxkZXJcbiAgJiYgQmxvYkJ1aWxkZXIucHJvdG90eXBlLmFwcGVuZFxuICAmJiBCbG9iQnVpbGRlci5wcm90b3R5cGUuZ2V0QmxvYjtcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCBtYXBzIEFycmF5QnVmZmVyVmlld3MgdG8gQXJyYXlCdWZmZXJzXG4gKiBVc2VkIGJ5IEJsb2JCdWlsZGVyIGNvbnN0cnVjdG9yIGFuZCBvbGQgYnJvd3NlcnMgdGhhdCBkaWRuJ3RcbiAqIHN1cHBvcnQgaXQgaW4gdGhlIEJsb2IgY29uc3RydWN0b3IuXG4gKi9cblxuZnVuY3Rpb24gbWFwQXJyYXlCdWZmZXJWaWV3cyhhcnkpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnkubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY2h1bmsgPSBhcnlbaV07XG4gICAgaWYgKGNodW5rLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICB2YXIgYnVmID0gY2h1bmsuYnVmZmVyO1xuXG4gICAgICAvLyBpZiB0aGlzIGlzIGEgc3ViYXJyYXksIG1ha2UgYSBjb3B5IHNvIHdlIG9ubHlcbiAgICAgIC8vIGluY2x1ZGUgdGhlIHN1YmFycmF5IHJlZ2lvbiBmcm9tIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlclxuICAgICAgaWYgKGNodW5rLmJ5dGVMZW5ndGggIT09IGJ1Zi5ieXRlTGVuZ3RoKSB7XG4gICAgICAgIHZhciBjb3B5ID0gbmV3IFVpbnQ4QXJyYXkoY2h1bmsuYnl0ZUxlbmd0aCk7XG4gICAgICAgIGNvcHkuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZiwgY2h1bmsuYnl0ZU9mZnNldCwgY2h1bmsuYnl0ZUxlbmd0aCkpO1xuICAgICAgICBidWYgPSBjb3B5LmJ1ZmZlcjtcbiAgICAgIH1cblxuICAgICAgYXJ5W2ldID0gYnVmO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBCbG9iQnVpbGRlckNvbnN0cnVjdG9yKGFyeSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICB2YXIgYmIgPSBuZXcgQmxvYkJ1aWxkZXIoKTtcbiAgbWFwQXJyYXlCdWZmZXJWaWV3cyhhcnkpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJ5Lmxlbmd0aDsgaSsrKSB7XG4gICAgYmIuYXBwZW5kKGFyeVtpXSk7XG4gIH1cblxuICByZXR1cm4gKG9wdGlvbnMudHlwZSkgPyBiYi5nZXRCbG9iKG9wdGlvbnMudHlwZSkgOiBiYi5nZXRCbG9iKCk7XG59O1xuXG5mdW5jdGlvbiBCbG9iQ29uc3RydWN0b3IoYXJ5LCBvcHRpb25zKSB7XG4gIG1hcEFycmF5QnVmZmVyVmlld3MoYXJ5KTtcbiAgcmV0dXJuIG5ldyBCbG9iKGFyeSwgb3B0aW9ucyB8fCB7fSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgaWYgKGJsb2JTdXBwb3J0ZWQpIHtcbiAgICByZXR1cm4gYmxvYlN1cHBvcnRzQXJyYXlCdWZmZXJWaWV3ID8gZ2xvYmFsLkJsb2IgOiBCbG9iQ29uc3RydWN0b3I7XG4gIH0gZWxzZSBpZiAoYmxvYkJ1aWxkZXJTdXBwb3J0ZWQpIHtcbiAgICByZXR1cm4gQmxvYkJ1aWxkZXJDb25zdHJ1Y3RvcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59KSgpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Jsb2IvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDUyM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 524 */
/***/ function(module, exports) {

    eval("/**\n * Compiles a querystring\n * Returns string representation of the object\n *\n * @param {Object}\n * @api private\n */\n\nexports.encode = function (obj) {\n  var str = '';\n\n  for (var i in obj) {\n    if (obj.hasOwnProperty(i)) {\n      if (str.length) str += '&';\n      str += encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]);\n    }\n  }\n\n  return str;\n};\n\n/**\n * Parses a simple querystring into an object\n *\n * @param {String} qs\n * @api private\n */\n\nexports.decode = function(qs){\n  var qry = {};\n  var pairs = qs.split('&');\n  for (var i = 0, l = pairs.length; i < l; i++) {\n    var pair = pairs[i].split('=');\n    qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n  }\n  return qry;\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9wYXJzZXFzL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tcGlsZXMgYSBxdWVyeXN0cmluZ1xuICogUmV0dXJucyBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBzdHIgPSAnJztcblxuICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgIGlmIChzdHIubGVuZ3RoKSBzdHIgKz0gJyYnO1xuICAgICAgc3RyICs9IGVuY29kZVVSSUNvbXBvbmVudChpKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChvYmpbaV0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdHI7XG59O1xuXG4vKipcbiAqIFBhcnNlcyBhIHNpbXBsZSBxdWVyeXN0cmluZyBpbnRvIGFuIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBxc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbihxcyl7XG4gIHZhciBxcnkgPSB7fTtcbiAgdmFyIHBhaXJzID0gcXMuc3BsaXQoJyYnKTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYWlycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICB2YXIgcGFpciA9IHBhaXJzW2ldLnNwbGl0KCc9Jyk7XG4gICAgcXJ5W2RlY29kZVVSSUNvbXBvbmVudChwYWlyWzBdKV0gPSBkZWNvZGVVUklDb21wb25lbnQocGFpclsxXSk7XG4gIH1cbiAgcmV0dXJuIHFyeTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcGFyc2Vxcy9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTI0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 525 */
/***/ function(module, exports) {

    eval("\nmodule.exports = function(a, b){\n  var fn = function(){};\n  fn.prototype = b.prototype;\n  a.prototype = new fn;\n  a.prototype.constructor = a;\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9jb21wb25lbnQtaW5oZXJpdC9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYSwgYil7XG4gIHZhciBmbiA9IGZ1bmN0aW9uKCl7fTtcbiAgZm4ucHJvdG90eXBlID0gYi5wcm90b3R5cGU7XG4gIGEucHJvdG90eXBlID0gbmV3IGZuO1xuICBhLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGE7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb21wb25lbnQtaW5oZXJpdC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTI1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 526 */
/***/ function(module, exports, __webpack_require__) {

    eval("\n/**\n * This is the web browser implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = __webpack_require__(527);\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\n\n/**\n * Colors.\n */\n\nexports.colors = [\n  'lightseagreen',\n  'forestgreen',\n  'goldenrod',\n  'dodgerblue',\n  'darkorchid',\n  'crimson'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\nfunction useColors() {\n  // is webkit? http://stackoverflow.com/a/16459606/376773\n  return ('WebkitAppearance' in document.documentElement.style) ||\n    // is firebug? http://stackoverflow.com/a/398120/376773\n    (window.console && (console.firebug || (console.exception && console.table))) ||\n    // is firefox >= v31?\n    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n    (navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31);\n}\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nexports.formatters.j = function(v) {\n  return JSON.stringify(v);\n};\n\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs() {\n  var args = arguments;\n  var useColors = this.useColors;\n\n  args[0] = (useColors ? '%c' : '')\n    + this.namespace\n    + (useColors ? ' %c' : ' ')\n    + args[0]\n    + (useColors ? '%c ' : ' ')\n    + '+' + exports.humanize(this.diff);\n\n  if (!useColors) return args;\n\n  var c = 'color: ' + this.color;\n  args = [args[0], c, 'color: inherit'].concat(Array.prototype.slice.call(args, 1));\n\n  // the final \"%c\" is somewhat tricky, because there could be other\n  // arguments passed either before or after the %c, so we need to\n  // figure out the correct index to insert the CSS into\n  var index = 0;\n  var lastC = 0;\n  args[0].replace(/%[a-z%]/g, function(match) {\n    if ('%%' === match) return;\n    index++;\n    if ('%c' === match) {\n      // we only are interested in the *last* %c\n      // (the user may have provided their own)\n      lastC = index;\n    }\n  });\n\n  args.splice(lastC, 0, c);\n  return args;\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\nfunction log() {\n  // This hackery is required for IE8,\n  // where the `console.log` function doesn't have 'apply'\n  return 'object' == typeof console\n    && 'function' == typeof console.log\n    && Function.prototype.apply.call(console.log, console, arguments);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n  try {\n    if (null == namespaces) {\n      localStorage.removeItem('debug');\n    } else {\n      localStorage.debug = namespaces;\n    }\n  } catch(e) {}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n  var r;\n  try {\n    r = localStorage.debug;\n  } catch(e) {}\n  return r;\n}\n\n/**\n * Enable namespaces listed in `localStorage.debug` initially.\n */\n\nexports.enable(load());\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L25vZGVfbW9kdWxlcy9kZWJ1Zy9icm93c2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBUaGlzIGlzIHRoZSB3ZWIgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKlxuICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZGVidWcnKTtcbmV4cG9ydHMubG9nID0gbG9nO1xuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gW1xuICAnbGlnaHRzZWFncmVlbicsXG4gICdmb3Jlc3RncmVlbicsXG4gICdnb2xkZW5yb2QnLFxuICAnZG9kZ2VyYmx1ZScsXG4gICdkYXJrb3JjaGlkJyxcbiAgJ2NyaW1zb24nXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcbiAgLy8gaXMgd2Via2l0PyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNjQ1OTYwNi8zNzY3NzNcbiAgcmV0dXJuICgnV2Via2l0QXBwZWFyYW5jZScgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlKSB8fFxuICAgIC8vIGlzIGZpcmVidWc/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM5ODEyMC8zNzY3NzNcbiAgICAod2luZG93LmNvbnNvbGUgJiYgKGNvbnNvbGUuZmlyZWJ1ZyB8fCAoY29uc29sZS5leGNlcHRpb24gJiYgY29uc29sZS50YWJsZSkpKSB8fFxuICAgIC8vIGlzIGZpcmVmb3ggPj0gdjMxP1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvVG9vbHMvV2ViX0NvbnNvbGUjU3R5bGluZ19tZXNzYWdlc1xuICAgIChuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSk7XG59XG5cbi8qKlxuICogTWFwICVqIHRvIGBKU09OLnN0cmluZ2lmeSgpYCwgc2luY2Ugbm8gV2ViIEluc3BlY3RvcnMgZG8gdGhhdCBieSBkZWZhdWx0LlxuICovXG5cbmV4cG9ydHMuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24odikge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG59O1xuXG5cbi8qKlxuICogQ29sb3JpemUgbG9nIGFyZ3VtZW50cyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncygpIHtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciB1c2VDb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcblxuICBhcmdzWzBdID0gKHVzZUNvbG9ycyA/ICclYycgOiAnJylcbiAgICArIHRoaXMubmFtZXNwYWNlXG4gICAgKyAodXNlQ29sb3JzID8gJyAlYycgOiAnICcpXG4gICAgKyBhcmdzWzBdXG4gICAgKyAodXNlQ29sb3JzID8gJyVjICcgOiAnICcpXG4gICAgKyAnKycgKyBleHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZik7XG5cbiAgaWYgKCF1c2VDb2xvcnMpIHJldHVybiBhcmdzO1xuXG4gIHZhciBjID0gJ2NvbG9yOiAnICsgdGhpcy5jb2xvcjtcbiAgYXJncyA9IFthcmdzWzBdLCBjLCAnY29sb3I6IGluaGVyaXQnXS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncywgMSkpO1xuXG4gIC8vIHRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG4gIC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cbiAgLy8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsYXN0QyA9IDA7XG4gIGFyZ3NbMF0ucmVwbGFjZSgvJVthLXolXS9nLCBmdW5jdGlvbihtYXRjaCkge1xuICAgIGlmICgnJSUnID09PSBtYXRjaCkgcmV0dXJuO1xuICAgIGluZGV4Kys7XG4gICAgaWYgKCclYycgPT09IG1hdGNoKSB7XG4gICAgICAvLyB3ZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcbiAgICAgIC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG4gICAgICBsYXN0QyA9IGluZGV4O1xuICAgIH1cbiAgfSk7XG5cbiAgYXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xuICByZXR1cm4gYXJncztcbn1cblxuLyoqXG4gKiBJbnZva2VzIGBjb25zb2xlLmxvZygpYCB3aGVuIGF2YWlsYWJsZS5cbiAqIE5vLW9wIHdoZW4gYGNvbnNvbGUubG9nYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBsb2coKSB7XG4gIC8vIFRoaXMgaGFja2VyeSBpcyByZXF1aXJlZCBmb3IgSUU4LFxuICAvLyB3aGVyZSB0aGUgYGNvbnNvbGUubG9nYCBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgJ2FwcGx5J1xuICByZXR1cm4gJ29iamVjdCcgPT0gdHlwZW9mIGNvbnNvbGVcbiAgICAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBjb25zb2xlLmxvZ1xuICAgICYmIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGUubG9nLCBjb25zb2xlLCBhcmd1bWVudHMpO1xufVxuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcbiAgdHJ5IHtcbiAgICBpZiAobnVsbCA9PSBuYW1lc3BhY2VzKSB7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnZGVidWcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9jYWxTdG9yYWdlLmRlYnVnID0gbmFtZXNwYWNlcztcbiAgICB9XG4gIH0gY2F0Y2goZSkge31cbn1cblxuLyoqXG4gKiBMb2FkIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybnMgdGhlIHByZXZpb3VzbHkgcGVyc2lzdGVkIGRlYnVnIG1vZGVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2FkKCkge1xuICB2YXIgcjtcbiAgdHJ5IHtcbiAgICByID0gbG9jYWxTdG9yYWdlLmRlYnVnO1xuICB9IGNhdGNoKGUpIHt9XG4gIHJldHVybiByO1xufVxuXG4vKipcbiAqIEVuYWJsZSBuYW1lc3BhY2VzIGxpc3RlZCBpbiBgbG9jYWxTdG9yYWdlLmRlYnVnYCBpbml0aWFsbHkuXG4gKi9cblxuZXhwb3J0cy5lbmFibGUobG9hZCgpKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9lbmdpbmUuaW8tY2xpZW50L34vZGVidWcvYnJvd3Nlci5qc1xuLy8gbW9kdWxlIGlkID0gNTI2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 527 */
/***/ function(module, exports, __webpack_require__) {

    eval("\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = debug;\nexports.coerce = coerce;\nexports.disable = disable;\nexports.enable = enable;\nexports.enabled = enabled;\nexports.humanize = __webpack_require__(528);\n\n/**\n * The currently active debug mode names, and names to skip.\n */\n\nexports.names = [];\nexports.skips = [];\n\n/**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lowercased letter, i.e. \"n\".\n */\n\nexports.formatters = {};\n\n/**\n * Previously assigned color.\n */\n\nvar prevColor = 0;\n\n/**\n * Previous log timestamp.\n */\n\nvar prevTime;\n\n/**\n * Select a color.\n *\n * @return {Number}\n * @api private\n */\n\nfunction selectColor() {\n  return exports.colors[prevColor++ % exports.colors.length];\n}\n\n/**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\nfunction debug(namespace) {\n\n  // define the `disabled` version\n  function disabled() {\n  }\n  disabled.enabled = false;\n\n  // define the `enabled` version\n  function enabled() {\n\n    var self = enabled;\n\n    // set `diff` timestamp\n    var curr = +new Date();\n    var ms = curr - (prevTime || curr);\n    self.diff = ms;\n    self.prev = prevTime;\n    self.curr = curr;\n    prevTime = curr;\n\n    // add the `color` if not set\n    if (null == self.useColors) self.useColors = exports.useColors();\n    if (null == self.color && self.useColors) self.color = selectColor();\n\n    var args = Array.prototype.slice.call(arguments);\n\n    args[0] = exports.coerce(args[0]);\n\n    if ('string' !== typeof args[0]) {\n      // anything else let's inspect with %o\n      args = ['%o'].concat(args);\n    }\n\n    // apply any `formatters` transformations\n    var index = 0;\n    args[0] = args[0].replace(/%([a-z%])/g, function(match, format) {\n      // if we encounter an escaped % then don't increase the array index\n      if (match === '%%') return match;\n      index++;\n      var formatter = exports.formatters[format];\n      if ('function' === typeof formatter) {\n        var val = args[index];\n        match = formatter.call(self, val);\n\n        // now we need to remove `args[index]` since it's inlined in the `format`\n        args.splice(index, 1);\n        index--;\n      }\n      return match;\n    });\n\n    if ('function' === typeof exports.formatArgs) {\n      args = exports.formatArgs.apply(self, args);\n    }\n    var logFn = enabled.log || exports.log || console.log.bind(console);\n    logFn.apply(self, args);\n  }\n  enabled.enabled = true;\n\n  var fn = exports.enabled(namespace) ? enabled : disabled;\n\n  fn.namespace = namespace;\n\n  return fn;\n}\n\n/**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\nfunction enable(namespaces) {\n  exports.save(namespaces);\n\n  var split = (namespaces || '').split(/[\\s,]+/);\n  var len = split.length;\n\n  for (var i = 0; i < len; i++) {\n    if (!split[i]) continue; // ignore empty strings\n    namespaces = split[i].replace(/\\*/g, '.*?');\n    if (namespaces[0] === '-') {\n      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n    } else {\n      exports.names.push(new RegExp('^' + namespaces + '$'));\n    }\n  }\n}\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\nfunction disable() {\n  exports.enable('');\n}\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\nfunction enabled(name) {\n  var i, len;\n  for (i = 0, len = exports.skips.length; i < len; i++) {\n    if (exports.skips[i].test(name)) {\n      return false;\n    }\n  }\n  for (i = 0, len = exports.names.length; i < len; i++) {\n    if (exports.names[i].test(name)) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\nfunction coerce(val) {\n  if (val instanceof Error) return val.stack || val.message;\n  return val;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L25vZGVfbW9kdWxlcy9kZWJ1Zy9kZWJ1Zy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogVGhpcyBpcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIHRoZSBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlclxuICogaW1wbGVtZW50YXRpb25zIG9mIGBkZWJ1ZygpYC5cbiAqXG4gKiBFeHBvc2UgYGRlYnVnKClgIGFzIHRoZSBtb2R1bGUuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZGVidWc7XG5leHBvcnRzLmNvZXJjZSA9IGNvZXJjZTtcbmV4cG9ydHMuZGlzYWJsZSA9IGRpc2FibGU7XG5leHBvcnRzLmVuYWJsZSA9IGVuYWJsZTtcbmV4cG9ydHMuZW5hYmxlZCA9IGVuYWJsZWQ7XG5leHBvcnRzLmh1bWFuaXplID0gcmVxdWlyZSgnbXMnKTtcblxuLyoqXG4gKiBUaGUgY3VycmVudGx5IGFjdGl2ZSBkZWJ1ZyBtb2RlIG5hbWVzLCBhbmQgbmFtZXMgdG8gc2tpcC5cbiAqL1xuXG5leHBvcnRzLm5hbWVzID0gW107XG5leHBvcnRzLnNraXBzID0gW107XG5cbi8qKlxuICogTWFwIG9mIHNwZWNpYWwgXCIlblwiIGhhbmRsaW5nIGZ1bmN0aW9ucywgZm9yIHRoZSBkZWJ1ZyBcImZvcm1hdFwiIGFyZ3VtZW50LlxuICpcbiAqIFZhbGlkIGtleSBuYW1lcyBhcmUgYSBzaW5nbGUsIGxvd2VyY2FzZWQgbGV0dGVyLCBpLmUuIFwiblwiLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0dGVycyA9IHt9O1xuXG4vKipcbiAqIFByZXZpb3VzbHkgYXNzaWduZWQgY29sb3IuXG4gKi9cblxudmFyIHByZXZDb2xvciA9IDA7XG5cbi8qKlxuICogUHJldmlvdXMgbG9nIHRpbWVzdGFtcC5cbiAqL1xuXG52YXIgcHJldlRpbWU7XG5cbi8qKlxuICogU2VsZWN0IGEgY29sb3IuXG4gKlxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2VsZWN0Q29sb3IoKSB7XG4gIHJldHVybiBleHBvcnRzLmNvbG9yc1twcmV2Q29sb3IrKyAlIGV4cG9ydHMuY29sb3JzLmxlbmd0aF07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZGVidWdnZXIgd2l0aCB0aGUgZ2l2ZW4gYG5hbWVzcGFjZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGRlYnVnKG5hbWVzcGFjZSkge1xuXG4gIC8vIGRlZmluZSB0aGUgYGRpc2FibGVkYCB2ZXJzaW9uXG4gIGZ1bmN0aW9uIGRpc2FibGVkKCkge1xuICB9XG4gIGRpc2FibGVkLmVuYWJsZWQgPSBmYWxzZTtcblxuICAvLyBkZWZpbmUgdGhlIGBlbmFibGVkYCB2ZXJzaW9uXG4gIGZ1bmN0aW9uIGVuYWJsZWQoKSB7XG5cbiAgICB2YXIgc2VsZiA9IGVuYWJsZWQ7XG5cbiAgICAvLyBzZXQgYGRpZmZgIHRpbWVzdGFtcFxuICAgIHZhciBjdXJyID0gK25ldyBEYXRlKCk7XG4gICAgdmFyIG1zID0gY3VyciAtIChwcmV2VGltZSB8fCBjdXJyKTtcbiAgICBzZWxmLmRpZmYgPSBtcztcbiAgICBzZWxmLnByZXYgPSBwcmV2VGltZTtcbiAgICBzZWxmLmN1cnIgPSBjdXJyO1xuICAgIHByZXZUaW1lID0gY3VycjtcblxuICAgIC8vIGFkZCB0aGUgYGNvbG9yYCBpZiBub3Qgc2V0XG4gICAgaWYgKG51bGwgPT0gc2VsZi51c2VDb2xvcnMpIHNlbGYudXNlQ29sb3JzID0gZXhwb3J0cy51c2VDb2xvcnMoKTtcbiAgICBpZiAobnVsbCA9PSBzZWxmLmNvbG9yICYmIHNlbGYudXNlQ29sb3JzKSBzZWxmLmNvbG9yID0gc2VsZWN0Q29sb3IoKTtcblxuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblxuICAgIGFyZ3NbMF0gPSBleHBvcnRzLmNvZXJjZShhcmdzWzBdKTtcblxuICAgIGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGFyZ3NbMF0pIHtcbiAgICAgIC8vIGFueXRoaW5nIGVsc2UgbGV0J3MgaW5zcGVjdCB3aXRoICVvXG4gICAgICBhcmdzID0gWyclbyddLmNvbmNhdChhcmdzKTtcbiAgICB9XG5cbiAgICAvLyBhcHBseSBhbnkgYGZvcm1hdHRlcnNgIHRyYW5zZm9ybWF0aW9uc1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgYXJnc1swXSA9IGFyZ3NbMF0ucmVwbGFjZSgvJShbYS16JV0pL2csIGZ1bmN0aW9uKG1hdGNoLCBmb3JtYXQpIHtcbiAgICAgIC8vIGlmIHdlIGVuY291bnRlciBhbiBlc2NhcGVkICUgdGhlbiBkb24ndCBpbmNyZWFzZSB0aGUgYXJyYXkgaW5kZXhcbiAgICAgIGlmIChtYXRjaCA9PT0gJyUlJykgcmV0dXJuIG1hdGNoO1xuICAgICAgaW5kZXgrKztcbiAgICAgIHZhciBmb3JtYXR0ZXIgPSBleHBvcnRzLmZvcm1hdHRlcnNbZm9ybWF0XTtcbiAgICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgZm9ybWF0dGVyKSB7XG4gICAgICAgIHZhciB2YWwgPSBhcmdzW2luZGV4XTtcbiAgICAgICAgbWF0Y2ggPSBmb3JtYXR0ZXIuY2FsbChzZWxmLCB2YWwpO1xuXG4gICAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIHJlbW92ZSBgYXJnc1tpbmRleF1gIHNpbmNlIGl0J3MgaW5saW5lZCBpbiB0aGUgYGZvcm1hdGBcbiAgICAgICAgYXJncy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBpbmRleC0tO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH0pO1xuXG4gICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBleHBvcnRzLmZvcm1hdEFyZ3MpIHtcbiAgICAgIGFyZ3MgPSBleHBvcnRzLmZvcm1hdEFyZ3MuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgfVxuICAgIHZhciBsb2dGbiA9IGVuYWJsZWQubG9nIHx8IGV4cG9ydHMubG9nIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7XG4gICAgbG9nRm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gIH1cbiAgZW5hYmxlZC5lbmFibGVkID0gdHJ1ZTtcblxuICB2YXIgZm4gPSBleHBvcnRzLmVuYWJsZWQobmFtZXNwYWNlKSA/IGVuYWJsZWQgOiBkaXNhYmxlZDtcblxuICBmbi5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG5cbiAgcmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcbiAqIHNlcGFyYXRlZCBieSBhIGNvbG9uIGFuZCB3aWxkY2FyZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZW5hYmxlKG5hbWVzcGFjZXMpIHtcbiAgZXhwb3J0cy5zYXZlKG5hbWVzcGFjZXMpO1xuXG4gIHZhciBzcGxpdCA9IChuYW1lc3BhY2VzIHx8ICcnKS5zcGxpdCgvW1xccyxdKy8pO1xuICB2YXIgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoIXNwbGl0W2ldKSBjb250aW51ZTsgLy8gaWdub3JlIGVtcHR5IHN0cmluZ3NcbiAgICBuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcbiAgICBpZiAobmFtZXNwYWNlc1swXSA9PT0gJy0nKSB7XG4gICAgICBleHBvcnRzLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzLnN1YnN0cigxKSArICckJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRzLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzICsgJyQnKSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGlzYWJsZSBkZWJ1ZyBvdXRwdXQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkaXNhYmxlKCkge1xuICBleHBvcnRzLmVuYWJsZSgnJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBlbmFibGVkKG5hbWUpIHtcbiAgdmFyIGksIGxlbjtcbiAgZm9yIChpID0gMCwgbGVuID0gZXhwb3J0cy5za2lwcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChleHBvcnRzLnNraXBzW2ldLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgZm9yIChpID0gMCwgbGVuID0gZXhwb3J0cy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChleHBvcnRzLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ29lcmNlIGB2YWxgLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuICogQHJldHVybiB7TWl4ZWR9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb2VyY2UodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcbiAgcmV0dXJuIHZhbDtcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9lbmdpbmUuaW8tY2xpZW50L34vZGVidWcvZGVidWcuanNcbi8vIG1vZHVsZSBpZCA9IDUyN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 528 */
/***/ function(module, exports) {

    eval("/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n *  - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} options\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options){\n  options = options || {};\n  if ('string' == typeof val) return parse(val);\n  return options.long\n    ? long(val)\n    : short(val);\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n  var match = /^((?:\\d+)?\\.?\\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i.exec(str);\n  if (!match) return;\n  var n = parseFloat(match[1]);\n  var type = (match[2] || 'ms').toLowerCase();\n  switch (type) {\n    case 'years':\n    case 'year':\n    case 'y':\n      return n * y;\n    case 'days':\n    case 'day':\n    case 'd':\n      return n * d;\n    case 'hours':\n    case 'hour':\n    case 'h':\n      return n * h;\n    case 'minutes':\n    case 'minute':\n    case 'm':\n      return n * m;\n    case 'seconds':\n    case 'second':\n    case 's':\n      return n * s;\n    case 'ms':\n      return n;\n  }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction short(ms) {\n  if (ms >= d) return Math.round(ms / d) + 'd';\n  if (ms >= h) return Math.round(ms / h) + 'h';\n  if (ms >= m) return Math.round(ms / m) + 'm';\n  if (ms >= s) return Math.round(ms / s) + 's';\n  return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction long(ms) {\n  return plural(ms, d, 'day')\n    || plural(ms, h, 'hour')\n    || plural(ms, m, 'minute')\n    || plural(ms, s, 'second')\n    || ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, n, name) {\n  if (ms < n) return;\n  if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name;\n  return Math.ceil(ms / n) + ' ' + name + 's';\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L25vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEhlbHBlcnMuXG4gKi9cblxudmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHkgPSBkICogMzY1LjI1O1xuXG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odmFsLCBvcHRpb25zKXtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgdmFsKSByZXR1cm4gcGFyc2UodmFsKTtcbiAgcmV0dXJuIG9wdGlvbnMubG9uZ1xuICAgID8gbG9uZyh2YWwpXG4gICAgOiBzaG9ydCh2YWwpO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gIHZhciBtYXRjaCA9IC9eKCg/OlxcZCspP1xcLj9cXGQrKSAqKG1zfHNlY29uZHM/fHN8bWludXRlcz98bXxob3Vycz98aHxkYXlzP3xkfHllYXJzP3x5KT8kL2kuZXhlYyhzdHIpO1xuICBpZiAoIW1hdGNoKSByZXR1cm47XG4gIHZhciBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3llYXJzJzpcbiAgICBjYXNlICd5ZWFyJzpcbiAgICBjYXNlICd5JzpcbiAgICAgIHJldHVybiBuICogeTtcbiAgICBjYXNlICdkYXlzJzpcbiAgICBjYXNlICdkYXknOlxuICAgIGNhc2UgJ2QnOlxuICAgICAgcmV0dXJuIG4gKiBkO1xuICAgIGNhc2UgJ2hvdXJzJzpcbiAgICBjYXNlICdob3VyJzpcbiAgICBjYXNlICdoJzpcbiAgICAgIHJldHVybiBuICogaDtcbiAgICBjYXNlICdtaW51dGVzJzpcbiAgICBjYXNlICdtaW51dGUnOlxuICAgIGNhc2UgJ20nOlxuICAgICAgcmV0dXJuIG4gKiBtO1xuICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgY2FzZSAncyc6XG4gICAgICByZXR1cm4gbiAqIHM7XG4gICAgY2FzZSAnbXMnOlxuICAgICAgcmV0dXJuIG47XG4gIH1cbn1cblxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzaG9ydChtcykge1xuICBpZiAobXMgPj0gZCkgcmV0dXJuIE1hdGgucm91bmQobXMgLyBkKSArICdkJztcbiAgaWYgKG1zID49IGgpIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG4gIGlmIChtcyA+PSBtKSByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuICBpZiAobXMgPj0gcykgcmV0dXJuIE1hdGgucm91bmQobXMgLyBzKSArICdzJztcbiAgcmV0dXJuIG1zICsgJ21zJztcbn1cblxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvbmcobXMpIHtcbiAgcmV0dXJuIHBsdXJhbChtcywgZCwgJ2RheScpXG4gICAgfHwgcGx1cmFsKG1zLCBoLCAnaG91cicpXG4gICAgfHwgcGx1cmFsKG1zLCBtLCAnbWludXRlJylcbiAgICB8fCBwbHVyYWwobXMsIHMsICdzZWNvbmQnKVxuICAgIHx8IG1zICsgJyBtcyc7XG59XG5cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi9cblxuZnVuY3Rpb24gcGx1cmFsKG1zLCBuLCBuYW1lKSB7XG4gIGlmIChtcyA8IG4pIHJldHVybjtcbiAgaWYgKG1zIDwgbiAqIDEuNSkgcmV0dXJuIE1hdGguZmxvb3IobXMgLyBuKSArICcgJyArIG5hbWU7XG4gIHJldHVybiBNYXRoLmNlaWwobXMgLyBuKSArICcgJyArIG5hbWUgKyAncyc7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZW5naW5lLmlvLWNsaWVudC9+L21zL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA1Mjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 529 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(global) {\n/**\n * Module requirements.\n */\n\nvar Polling = __webpack_require__(513);\nvar inherit = __webpack_require__(525);\n\n/**\n * Module exports.\n */\n\nmodule.exports = JSONPPolling;\n\n/**\n * Cached regular expressions.\n */\n\nvar rNewline = /\\n/g;\nvar rEscapedNewline = /\\\\n/g;\n\n/**\n * Global JSONP callbacks.\n */\n\nvar callbacks;\n\n/**\n * Callbacks count.\n */\n\nvar index = 0;\n\n/**\n * Noop.\n */\n\nfunction empty () { }\n\n/**\n * JSONP Polling constructor.\n *\n * @param {Object} opts.\n * @api public\n */\n\nfunction JSONPPolling (opts) {\n  Polling.call(this, opts);\n\n  this.query = this.query || {};\n\n  // define global callbacks array if not present\n  // we do this here (lazily) to avoid unneeded global pollution\n  if (!callbacks) {\n    // we need to consider multiple engines in the same page\n    if (!global.___eio) global.___eio = [];\n    callbacks = global.___eio;\n  }\n\n  // callback identifier\n  this.index = callbacks.length;\n\n  // add callback to jsonp global\n  var self = this;\n  callbacks.push(function (msg) {\n    self.onData(msg);\n  });\n\n  // append to query string\n  this.query.j = this.index;\n\n  // prevent spurious errors from being emitted when the window is unloaded\n  if (global.document && global.addEventListener) {\n    global.addEventListener('beforeunload', function () {\n      if (self.script) self.script.onerror = empty;\n    }, false);\n  }\n}\n\n/**\n * Inherits from Polling.\n */\n\ninherit(JSONPPolling, Polling);\n\n/*\n * JSONP only supports binary as base64 encoded strings\n */\n\nJSONPPolling.prototype.supportsBinary = false;\n\n/**\n * Closes the socket.\n *\n * @api private\n */\n\nJSONPPolling.prototype.doClose = function () {\n  if (this.script) {\n    this.script.parentNode.removeChild(this.script);\n    this.script = null;\n  }\n\n  if (this.form) {\n    this.form.parentNode.removeChild(this.form);\n    this.form = null;\n    this.iframe = null;\n  }\n\n  Polling.prototype.doClose.call(this);\n};\n\n/**\n * Starts a poll cycle.\n *\n * @api private\n */\n\nJSONPPolling.prototype.doPoll = function () {\n  var self = this;\n  var script = document.createElement('script');\n\n  if (this.script) {\n    this.script.parentNode.removeChild(this.script);\n    this.script = null;\n  }\n\n  script.async = true;\n  script.src = this.uri();\n  script.onerror = function(e){\n    self.onError('jsonp poll error',e);\n  };\n\n  var insertAt = document.getElementsByTagName('script')[0];\n  insertAt.parentNode.insertBefore(script, insertAt);\n  this.script = script;\n\n  var isUAgecko = 'undefined' != typeof navigator && /gecko/i.test(navigator.userAgent);\n  \n  if (isUAgecko) {\n    setTimeout(function () {\n      var iframe = document.createElement('iframe');\n      document.body.appendChild(iframe);\n      document.body.removeChild(iframe);\n    }, 100);\n  }\n};\n\n/**\n * Writes with a hidden iframe.\n *\n * @param {String} data to send\n * @param {Function} called upon flush.\n * @api private\n */\n\nJSONPPolling.prototype.doWrite = function (data, fn) {\n  var self = this;\n\n  if (!this.form) {\n    var form = document.createElement('form');\n    var area = document.createElement('textarea');\n    var id = this.iframeId = 'eio_iframe_' + this.index;\n    var iframe;\n\n    form.className = 'socketio';\n    form.style.position = 'absolute';\n    form.style.top = '-1000px';\n    form.style.left = '-1000px';\n    form.target = id;\n    form.method = 'POST';\n    form.setAttribute('accept-charset', 'utf-8');\n    area.name = 'd';\n    form.appendChild(area);\n    document.body.appendChild(form);\n\n    this.form = form;\n    this.area = area;\n  }\n\n  this.form.action = this.uri();\n\n  function complete () {\n    initIframe();\n    fn();\n  }\n\n  function initIframe () {\n    if (self.iframe) {\n      try {\n        self.form.removeChild(self.iframe);\n      } catch (e) {\n        self.onError('jsonp polling iframe removal error', e);\n      }\n    }\n\n    try {\n      // ie6 dynamic iframes with target=\"\" support (thanks Chris Lambacher)\n      var html = '<iframe src=\"javascript:0\" name=\"'+ self.iframeId +'\">';\n      iframe = document.createElement(html);\n    } catch (e) {\n      iframe = document.createElement('iframe');\n      iframe.name = self.iframeId;\n      iframe.src = 'javascript:0';\n    }\n\n    iframe.id = self.iframeId;\n\n    self.form.appendChild(iframe);\n    self.iframe = iframe;\n  }\n\n  initIframe();\n\n  // escape \\n to prevent it from being converted into \\r\\n by some UAs\n  // double escaping is required for escaped new lines because unescaping of new lines can be done safely on server-side\n  data = data.replace(rEscapedNewline, '\\\\\\n');\n  this.area.value = data.replace(rNewline, '\\\\n');\n\n  try {\n    this.form.submit();\n  } catch(e) {}\n\n  if (this.iframe.attachEvent) {\n    this.iframe.onreadystatechange = function(){\n      if (self.iframe.readyState == 'complete') {\n        complete();\n      }\n    };\n  } else {\n    this.iframe.onload = complete;\n  }\n};\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2xpYi90cmFuc3BvcnRzL3BvbGxpbmctanNvbnAuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIE1vZHVsZSByZXF1aXJlbWVudHMuXG4gKi9cblxudmFyIFBvbGxpbmcgPSByZXF1aXJlKCcuL3BvbGxpbmcnKTtcbnZhciBpbmhlcml0ID0gcmVxdWlyZSgnY29tcG9uZW50LWluaGVyaXQnKTtcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IEpTT05QUG9sbGluZztcblxuLyoqXG4gKiBDYWNoZWQgcmVndWxhciBleHByZXNzaW9ucy5cbiAqL1xuXG52YXIgck5ld2xpbmUgPSAvXFxuL2c7XG52YXIgckVzY2FwZWROZXdsaW5lID0gL1xcXFxuL2c7XG5cbi8qKlxuICogR2xvYmFsIEpTT05QIGNhbGxiYWNrcy5cbiAqL1xuXG52YXIgY2FsbGJhY2tzO1xuXG4vKipcbiAqIENhbGxiYWNrcyBjb3VudC5cbiAqL1xuXG52YXIgaW5kZXggPSAwO1xuXG4vKipcbiAqIE5vb3AuXG4gKi9cblxuZnVuY3Rpb24gZW1wdHkgKCkgeyB9XG5cbi8qKlxuICogSlNPTlAgUG9sbGluZyBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gSlNPTlBQb2xsaW5nIChvcHRzKSB7XG4gIFBvbGxpbmcuY2FsbCh0aGlzLCBvcHRzKTtcblxuICB0aGlzLnF1ZXJ5ID0gdGhpcy5xdWVyeSB8fCB7fTtcblxuICAvLyBkZWZpbmUgZ2xvYmFsIGNhbGxiYWNrcyBhcnJheSBpZiBub3QgcHJlc2VudFxuICAvLyB3ZSBkbyB0aGlzIGhlcmUgKGxhemlseSkgdG8gYXZvaWQgdW5uZWVkZWQgZ2xvYmFsIHBvbGx1dGlvblxuICBpZiAoIWNhbGxiYWNrcykge1xuICAgIC8vIHdlIG5lZWQgdG8gY29uc2lkZXIgbXVsdGlwbGUgZW5naW5lcyBpbiB0aGUgc2FtZSBwYWdlXG4gICAgaWYgKCFnbG9iYWwuX19fZWlvKSBnbG9iYWwuX19fZWlvID0gW107XG4gICAgY2FsbGJhY2tzID0gZ2xvYmFsLl9fX2VpbztcbiAgfVxuXG4gIC8vIGNhbGxiYWNrIGlkZW50aWZpZXJcbiAgdGhpcy5pbmRleCA9IGNhbGxiYWNrcy5sZW5ndGg7XG5cbiAgLy8gYWRkIGNhbGxiYWNrIHRvIGpzb25wIGdsb2JhbFxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGNhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uIChtc2cpIHtcbiAgICBzZWxmLm9uRGF0YShtc2cpO1xuICB9KTtcblxuICAvLyBhcHBlbmQgdG8gcXVlcnkgc3RyaW5nXG4gIHRoaXMucXVlcnkuaiA9IHRoaXMuaW5kZXg7XG5cbiAgLy8gcHJldmVudCBzcHVyaW91cyBlcnJvcnMgZnJvbSBiZWluZyBlbWl0dGVkIHdoZW4gdGhlIHdpbmRvdyBpcyB1bmxvYWRlZFxuICBpZiAoZ2xvYmFsLmRvY3VtZW50ICYmIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChzZWxmLnNjcmlwdCkgc2VsZi5zY3JpcHQub25lcnJvciA9IGVtcHR5O1xuICAgIH0sIGZhbHNlKTtcbiAgfVxufVxuXG4vKipcbiAqIEluaGVyaXRzIGZyb20gUG9sbGluZy5cbiAqL1xuXG5pbmhlcml0KEpTT05QUG9sbGluZywgUG9sbGluZyk7XG5cbi8qXG4gKiBKU09OUCBvbmx5IHN1cHBvcnRzIGJpbmFyeSBhcyBiYXNlNjQgZW5jb2RlZCBzdHJpbmdzXG4gKi9cblxuSlNPTlBQb2xsaW5nLnByb3RvdHlwZS5zdXBwb3J0c0JpbmFyeSA9IGZhbHNlO1xuXG4vKipcbiAqIENsb3NlcyB0aGUgc29ja2V0LlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkpTT05QUG9sbGluZy5wcm90b3R5cGUuZG9DbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuc2NyaXB0KSB7XG4gICAgdGhpcy5zY3JpcHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnNjcmlwdCk7XG4gICAgdGhpcy5zY3JpcHQgPSBudWxsO1xuICB9XG5cbiAgaWYgKHRoaXMuZm9ybSkge1xuICAgIHRoaXMuZm9ybS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZm9ybSk7XG4gICAgdGhpcy5mb3JtID0gbnVsbDtcbiAgICB0aGlzLmlmcmFtZSA9IG51bGw7XG4gIH1cblxuICBQb2xsaW5nLnByb3RvdHlwZS5kb0Nsb3NlLmNhbGwodGhpcyk7XG59O1xuXG4vKipcbiAqIFN0YXJ0cyBhIHBvbGwgY3ljbGUuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuSlNPTlBQb2xsaW5nLnByb3RvdHlwZS5kb1BvbGwgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuXG4gIGlmICh0aGlzLnNjcmlwdCkge1xuICAgIHRoaXMuc2NyaXB0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zY3JpcHQpO1xuICAgIHRoaXMuc2NyaXB0ID0gbnVsbDtcbiAgfVxuXG4gIHNjcmlwdC5hc3luYyA9IHRydWU7XG4gIHNjcmlwdC5zcmMgPSB0aGlzLnVyaSgpO1xuICBzY3JpcHQub25lcnJvciA9IGZ1bmN0aW9uKGUpe1xuICAgIHNlbGYub25FcnJvcignanNvbnAgcG9sbCBlcnJvcicsZSk7XG4gIH07XG5cbiAgdmFyIGluc2VydEF0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdO1xuICBpbnNlcnRBdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzY3JpcHQsIGluc2VydEF0KTtcbiAgdGhpcy5zY3JpcHQgPSBzY3JpcHQ7XG5cbiAgdmFyIGlzVUFnZWNrbyA9ICd1bmRlZmluZWQnICE9IHR5cGVvZiBuYXZpZ2F0b3IgJiYgL2dlY2tvL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgXG4gIGlmIChpc1VBZ2Vja28pIHtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgICB9LCAxMDApO1xuICB9XG59O1xuXG4vKipcbiAqIFdyaXRlcyB3aXRoIGEgaGlkZGVuIGlmcmFtZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZGF0YSB0byBzZW5kXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsZWQgdXBvbiBmbHVzaC5cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkpTT05QUG9sbGluZy5wcm90b3R5cGUuZG9Xcml0ZSA9IGZ1bmN0aW9uIChkYXRhLCBmbikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgaWYgKCF0aGlzLmZvcm0pIHtcbiAgICB2YXIgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTtcbiAgICB2YXIgYXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG4gICAgdmFyIGlkID0gdGhpcy5pZnJhbWVJZCA9ICdlaW9faWZyYW1lXycgKyB0aGlzLmluZGV4O1xuICAgIHZhciBpZnJhbWU7XG5cbiAgICBmb3JtLmNsYXNzTmFtZSA9ICdzb2NrZXRpbyc7XG4gICAgZm9ybS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgZm9ybS5zdHlsZS50b3AgPSAnLTEwMDBweCc7XG4gICAgZm9ybS5zdHlsZS5sZWZ0ID0gJy0xMDAwcHgnO1xuICAgIGZvcm0udGFyZ2V0ID0gaWQ7XG4gICAgZm9ybS5tZXRob2QgPSAnUE9TVCc7XG4gICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ2FjY2VwdC1jaGFyc2V0JywgJ3V0Zi04Jyk7XG4gICAgYXJlYS5uYW1lID0gJ2QnO1xuICAgIGZvcm0uYXBwZW5kQ2hpbGQoYXJlYSk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmb3JtKTtcblxuICAgIHRoaXMuZm9ybSA9IGZvcm07XG4gICAgdGhpcy5hcmVhID0gYXJlYTtcbiAgfVxuXG4gIHRoaXMuZm9ybS5hY3Rpb24gPSB0aGlzLnVyaSgpO1xuXG4gIGZ1bmN0aW9uIGNvbXBsZXRlICgpIHtcbiAgICBpbml0SWZyYW1lKCk7XG4gICAgZm4oKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRJZnJhbWUgKCkge1xuICAgIGlmIChzZWxmLmlmcmFtZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2VsZi5mb3JtLnJlbW92ZUNoaWxkKHNlbGYuaWZyYW1lKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2VsZi5vbkVycm9yKCdqc29ucCBwb2xsaW5nIGlmcmFtZSByZW1vdmFsIGVycm9yJywgZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGllNiBkeW5hbWljIGlmcmFtZXMgd2l0aCB0YXJnZXQ9XCJcIiBzdXBwb3J0ICh0aGFua3MgQ2hyaXMgTGFtYmFjaGVyKVxuICAgICAgdmFyIGh0bWwgPSAnPGlmcmFtZSBzcmM9XCJqYXZhc2NyaXB0OjBcIiBuYW1lPVwiJysgc2VsZi5pZnJhbWVJZCArJ1wiPic7XG4gICAgICBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGh0bWwpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgaWZyYW1lLm5hbWUgPSBzZWxmLmlmcmFtZUlkO1xuICAgICAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0OjAnO1xuICAgIH1cblxuICAgIGlmcmFtZS5pZCA9IHNlbGYuaWZyYW1lSWQ7XG5cbiAgICBzZWxmLmZvcm0uYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgICBzZWxmLmlmcmFtZSA9IGlmcmFtZTtcbiAgfVxuXG4gIGluaXRJZnJhbWUoKTtcblxuICAvLyBlc2NhcGUgXFxuIHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyBjb252ZXJ0ZWQgaW50byBcXHJcXG4gYnkgc29tZSBVQXNcbiAgLy8gZG91YmxlIGVzY2FwaW5nIGlzIHJlcXVpcmVkIGZvciBlc2NhcGVkIG5ldyBsaW5lcyBiZWNhdXNlIHVuZXNjYXBpbmcgb2YgbmV3IGxpbmVzIGNhbiBiZSBkb25lIHNhZmVseSBvbiBzZXJ2ZXItc2lkZVxuICBkYXRhID0gZGF0YS5yZXBsYWNlKHJFc2NhcGVkTmV3bGluZSwgJ1xcXFxcXG4nKTtcbiAgdGhpcy5hcmVhLnZhbHVlID0gZGF0YS5yZXBsYWNlKHJOZXdsaW5lLCAnXFxcXG4nKTtcblxuICB0cnkge1xuICAgIHRoaXMuZm9ybS5zdWJtaXQoKTtcbiAgfSBjYXRjaChlKSB7fVxuXG4gIGlmICh0aGlzLmlmcmFtZS5hdHRhY2hFdmVudCkge1xuICAgIHRoaXMuaWZyYW1lLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCl7XG4gICAgICBpZiAoc2VsZi5pZnJhbWUucmVhZHlTdGF0ZSA9PSAnY29tcGxldGUnKSB7XG4gICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmlmcmFtZS5vbmxvYWQgPSBjb21wbGV0ZTtcbiAgfVxufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9lbmdpbmUuaW8tY2xpZW50L2xpYi90cmFuc3BvcnRzL3BvbGxpbmctanNvbnAuanNcbi8vIG1vZHVsZSBpZCA9IDUyOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 530 */
/***/ function(module, exports, __webpack_require__) {

    eval("/**\n * Module dependencies.\n */\n\nvar Transport = __webpack_require__(514);\nvar parser = __webpack_require__(515);\nvar parseqs = __webpack_require__(524);\nvar inherit = __webpack_require__(525);\nvar debug = __webpack_require__(526)('engine.io-client:websocket');\n\n/**\n * `ws` exposes a WebSocket-compatible interface in\n * Node, or the `WebSocket` or `MozWebSocket` globals\n * in the browser.\n */\n\nvar WebSocket = __webpack_require__(531);\n\n/**\n * Module exports.\n */\n\nmodule.exports = WS;\n\n/**\n * WebSocket transport constructor.\n *\n * @api {Object} connection options\n * @api public\n */\n\nfunction WS(opts){\n  var forceBase64 = (opts && opts.forceBase64);\n  if (forceBase64) {\n    this.supportsBinary = false;\n  }\n  Transport.call(this, opts);\n}\n\n/**\n * Inherits from Transport.\n */\n\ninherit(WS, Transport);\n\n/**\n * Transport name.\n *\n * @api public\n */\n\nWS.prototype.name = 'websocket';\n\n/*\n * WebSockets support binary\n */\n\nWS.prototype.supportsBinary = true;\n\n/**\n * Opens socket.\n *\n * @api private\n */\n\nWS.prototype.doOpen = function(){\n  if (!this.check()) {\n    // let probe timeout\n    return;\n  }\n\n  var self = this;\n  var uri = this.uri();\n  var protocols = void(0);\n  var opts = { agent: this.agent };\n\n  // SSL options for Node.js client\n  opts.pfx = this.pfx;\n  opts.key = this.key;\n  opts.passphrase = this.passphrase;\n  opts.cert = this.cert;\n  opts.ca = this.ca;\n  opts.ciphers = this.ciphers;\n  opts.rejectUnauthorized = this.rejectUnauthorized;\n\n  this.ws = new WebSocket(uri, protocols, opts);\n\n  if (this.ws.binaryType === undefined) {\n    this.supportsBinary = false;\n  }\n\n  this.ws.binaryType = 'arraybuffer';\n  this.addEventListeners();\n};\n\n/**\n * Adds event listeners to the socket\n *\n * @api private\n */\n\nWS.prototype.addEventListeners = function(){\n  var self = this;\n\n  this.ws.onopen = function(){\n    self.onOpen();\n  };\n  this.ws.onclose = function(){\n    self.onClose();\n  };\n  this.ws.onmessage = function(ev){\n    self.onData(ev.data);\n  };\n  this.ws.onerror = function(e){\n    self.onError('websocket error', e);\n  };\n};\n\n/**\n * Override `onData` to use a timer on iOS.\n * See: https://gist.github.com/mloughran/2052006\n *\n * @api private\n */\n\nif ('undefined' != typeof navigator\n  && /iPad|iPhone|iPod/i.test(navigator.userAgent)) {\n  WS.prototype.onData = function(data){\n    var self = this;\n    setTimeout(function(){\n      Transport.prototype.onData.call(self, data);\n    }, 0);\n  };\n}\n\n/**\n * Writes data to socket.\n *\n * @param {Array} array of packets.\n * @api private\n */\n\nWS.prototype.write = function(packets){\n  var self = this;\n  this.writable = false;\n  // encodePacket efficient as it uses WS framing\n  // no need for encodePayload\n  for (var i = 0, l = packets.length; i < l; i++) {\n    parser.encodePacket(packets[i], this.supportsBinary, function(data) {\n      //Sometimes the websocket has already been closed but the browser didn't\n      //have a chance of informing us about it yet, in that case send will\n      //throw an error\n      try {\n        self.ws.send(data);\n      } catch (e){\n        debug('websocket closed before onclose event');\n      }\n    });\n  }\n\n  function ondrain() {\n    self.writable = true;\n    self.emit('drain');\n  }\n  // fake drain\n  // defer to next tick to allow Socket to clear writeBuffer\n  setTimeout(ondrain, 0);\n};\n\n/**\n * Called upon close\n *\n * @api private\n */\n\nWS.prototype.onClose = function(){\n  Transport.prototype.onClose.call(this);\n};\n\n/**\n * Closes socket.\n *\n * @api private\n */\n\nWS.prototype.doClose = function(){\n  if (typeof this.ws !== 'undefined') {\n    this.ws.close();\n  }\n};\n\n/**\n * Generates uri for connection.\n *\n * @api private\n */\n\nWS.prototype.uri = function(){\n  var query = this.query || {};\n  var schema = this.secure ? 'wss' : 'ws';\n  var port = '';\n\n  // avoid port if default for schema\n  if (this.port && (('wss' == schema && this.port != 443)\n    || ('ws' == schema && this.port != 80))) {\n    port = ':' + this.port;\n  }\n\n  // append timestamp to URI\n  if (this.timestampRequests) {\n    query[this.timestampParam] = +new Date;\n  }\n\n  // communicate binary support capabilities\n  if (!this.supportsBinary) {\n    query.b64 = 1;\n  }\n\n  query = parseqs.encode(query);\n\n  // prepend ? to query\n  if (query.length) {\n    query = '?' + query;\n  }\n\n  return schema + '://' + this.hostname + port + this.path + query;\n};\n\n/**\n * Feature detection for WebSocket.\n *\n * @return {Boolean} whether this transport is available.\n * @api public\n */\n\nWS.prototype.check = function(){\n  return !!WebSocket && !('__initialize' in WebSocket && this.name === WS.prototype.name);\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTMwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2xpYi90cmFuc3BvcnRzL3dlYnNvY2tldC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4uL3RyYW5zcG9ydCcpO1xudmFyIHBhcnNlciA9IHJlcXVpcmUoJ2VuZ2luZS5pby1wYXJzZXInKTtcbnZhciBwYXJzZXFzID0gcmVxdWlyZSgncGFyc2VxcycpO1xudmFyIGluaGVyaXQgPSByZXF1aXJlKCdjb21wb25lbnQtaW5oZXJpdCcpO1xudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnZW5naW5lLmlvLWNsaWVudDp3ZWJzb2NrZXQnKTtcblxuLyoqXG4gKiBgd3NgIGV4cG9zZXMgYSBXZWJTb2NrZXQtY29tcGF0aWJsZSBpbnRlcmZhY2UgaW5cbiAqIE5vZGUsIG9yIHRoZSBgV2ViU29ja2V0YCBvciBgTW96V2ViU29ja2V0YCBnbG9iYWxzXG4gKiBpbiB0aGUgYnJvd3Nlci5cbiAqL1xuXG52YXIgV2ViU29ja2V0ID0gcmVxdWlyZSgnd3MnKTtcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdTO1xuXG4vKipcbiAqIFdlYlNvY2tldCB0cmFuc3BvcnQgY29uc3RydWN0b3IuXG4gKlxuICogQGFwaSB7T2JqZWN0fSBjb25uZWN0aW9uIG9wdGlvbnNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gV1Mob3B0cyl7XG4gIHZhciBmb3JjZUJhc2U2NCA9IChvcHRzICYmIG9wdHMuZm9yY2VCYXNlNjQpO1xuICBpZiAoZm9yY2VCYXNlNjQpIHtcbiAgICB0aGlzLnN1cHBvcnRzQmluYXJ5ID0gZmFsc2U7XG4gIH1cbiAgVHJhbnNwb3J0LmNhbGwodGhpcywgb3B0cyk7XG59XG5cbi8qKlxuICogSW5oZXJpdHMgZnJvbSBUcmFuc3BvcnQuXG4gKi9cblxuaW5oZXJpdChXUywgVHJhbnNwb3J0KTtcblxuLyoqXG4gKiBUcmFuc3BvcnQgbmFtZS5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbldTLnByb3RvdHlwZS5uYW1lID0gJ3dlYnNvY2tldCc7XG5cbi8qXG4gKiBXZWJTb2NrZXRzIHN1cHBvcnQgYmluYXJ5XG4gKi9cblxuV1MucHJvdG90eXBlLnN1cHBvcnRzQmluYXJ5ID0gdHJ1ZTtcblxuLyoqXG4gKiBPcGVucyBzb2NrZXQuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuV1MucHJvdG90eXBlLmRvT3BlbiA9IGZ1bmN0aW9uKCl7XG4gIGlmICghdGhpcy5jaGVjaygpKSB7XG4gICAgLy8gbGV0IHByb2JlIHRpbWVvdXRcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB1cmkgPSB0aGlzLnVyaSgpO1xuICB2YXIgcHJvdG9jb2xzID0gdm9pZCgwKTtcbiAgdmFyIG9wdHMgPSB7IGFnZW50OiB0aGlzLmFnZW50IH07XG5cbiAgLy8gU1NMIG9wdGlvbnMgZm9yIE5vZGUuanMgY2xpZW50XG4gIG9wdHMucGZ4ID0gdGhpcy5wZng7XG4gIG9wdHMua2V5ID0gdGhpcy5rZXk7XG4gIG9wdHMucGFzc3BocmFzZSA9IHRoaXMucGFzc3BocmFzZTtcbiAgb3B0cy5jZXJ0ID0gdGhpcy5jZXJ0O1xuICBvcHRzLmNhID0gdGhpcy5jYTtcbiAgb3B0cy5jaXBoZXJzID0gdGhpcy5jaXBoZXJzO1xuICBvcHRzLnJlamVjdFVuYXV0aG9yaXplZCA9IHRoaXMucmVqZWN0VW5hdXRob3JpemVkO1xuXG4gIHRoaXMud3MgPSBuZXcgV2ViU29ja2V0KHVyaSwgcHJvdG9jb2xzLCBvcHRzKTtcblxuICBpZiAodGhpcy53cy5iaW5hcnlUeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnN1cHBvcnRzQmluYXJ5ID0gZmFsc2U7XG4gIH1cblxuICB0aGlzLndzLmJpbmFyeVR5cGUgPSAnYXJyYXlidWZmZXInO1xuICB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCk7XG59O1xuXG4vKipcbiAqIEFkZHMgZXZlbnQgbGlzdGVuZXJzIHRvIHRoZSBzb2NrZXRcbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5XUy5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lcnMgPSBmdW5jdGlvbigpe1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgdGhpcy53cy5vbm9wZW4gPSBmdW5jdGlvbigpe1xuICAgIHNlbGYub25PcGVuKCk7XG4gIH07XG4gIHRoaXMud3Mub25jbG9zZSA9IGZ1bmN0aW9uKCl7XG4gICAgc2VsZi5vbkNsb3NlKCk7XG4gIH07XG4gIHRoaXMud3Mub25tZXNzYWdlID0gZnVuY3Rpb24oZXYpe1xuICAgIHNlbGYub25EYXRhKGV2LmRhdGEpO1xuICB9O1xuICB0aGlzLndzLm9uZXJyb3IgPSBmdW5jdGlvbihlKXtcbiAgICBzZWxmLm9uRXJyb3IoJ3dlYnNvY2tldCBlcnJvcicsIGUpO1xuICB9O1xufTtcblxuLyoqXG4gKiBPdmVycmlkZSBgb25EYXRhYCB0byB1c2UgYSB0aW1lciBvbiBpT1MuXG4gKiBTZWU6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL21sb3VnaHJhbi8yMDUyMDA2XG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBuYXZpZ2F0b3JcbiAgJiYgL2lQYWR8aVBob25lfGlQb2QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG4gIFdTLnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbihkYXRhKXtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgVHJhbnNwb3J0LnByb3RvdHlwZS5vbkRhdGEuY2FsbChzZWxmLCBkYXRhKTtcbiAgICB9LCAwKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBXcml0ZXMgZGF0YSB0byBzb2NrZXQuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgb2YgcGFja2V0cy5cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbldTLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKHBhY2tldHMpe1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcbiAgLy8gZW5jb2RlUGFja2V0IGVmZmljaWVudCBhcyBpdCB1c2VzIFdTIGZyYW1pbmdcbiAgLy8gbm8gbmVlZCBmb3IgZW5jb2RlUGF5bG9hZFxuICBmb3IgKHZhciBpID0gMCwgbCA9IHBhY2tldHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgcGFyc2VyLmVuY29kZVBhY2tldChwYWNrZXRzW2ldLCB0aGlzLnN1cHBvcnRzQmluYXJ5LCBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAvL1NvbWV0aW1lcyB0aGUgd2Vic29ja2V0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkIGJ1dCB0aGUgYnJvd3NlciBkaWRuJ3RcbiAgICAgIC8vaGF2ZSBhIGNoYW5jZSBvZiBpbmZvcm1pbmcgdXMgYWJvdXQgaXQgeWV0LCBpbiB0aGF0IGNhc2Ugc2VuZCB3aWxsXG4gICAgICAvL3Rocm93IGFuIGVycm9yXG4gICAgICB0cnkge1xuICAgICAgICBzZWxmLndzLnNlbmQoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgZGVidWcoJ3dlYnNvY2tldCBjbG9zZWQgYmVmb3JlIG9uY2xvc2UgZXZlbnQnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZHJhaW4oKSB7XG4gICAgc2VsZi53cml0YWJsZSA9IHRydWU7XG4gICAgc2VsZi5lbWl0KCdkcmFpbicpO1xuICB9XG4gIC8vIGZha2UgZHJhaW5cbiAgLy8gZGVmZXIgdG8gbmV4dCB0aWNrIHRvIGFsbG93IFNvY2tldCB0byBjbGVhciB3cml0ZUJ1ZmZlclxuICBzZXRUaW1lb3V0KG9uZHJhaW4sIDApO1xufTtcblxuLyoqXG4gKiBDYWxsZWQgdXBvbiBjbG9zZVxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbldTLnByb3RvdHlwZS5vbkNsb3NlID0gZnVuY3Rpb24oKXtcbiAgVHJhbnNwb3J0LnByb3RvdHlwZS5vbkNsb3NlLmNhbGwodGhpcyk7XG59O1xuXG4vKipcbiAqIENsb3NlcyBzb2NrZXQuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuV1MucHJvdG90eXBlLmRvQ2xvc2UgPSBmdW5jdGlvbigpe1xuICBpZiAodHlwZW9mIHRoaXMud3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhpcy53cy5jbG9zZSgpO1xuICB9XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyB1cmkgZm9yIGNvbm5lY3Rpb24uXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuV1MucHJvdG90eXBlLnVyaSA9IGZ1bmN0aW9uKCl7XG4gIHZhciBxdWVyeSA9IHRoaXMucXVlcnkgfHwge307XG4gIHZhciBzY2hlbWEgPSB0aGlzLnNlY3VyZSA/ICd3c3MnIDogJ3dzJztcbiAgdmFyIHBvcnQgPSAnJztcblxuICAvLyBhdm9pZCBwb3J0IGlmIGRlZmF1bHQgZm9yIHNjaGVtYVxuICBpZiAodGhpcy5wb3J0ICYmICgoJ3dzcycgPT0gc2NoZW1hICYmIHRoaXMucG9ydCAhPSA0NDMpXG4gICAgfHwgKCd3cycgPT0gc2NoZW1hICYmIHRoaXMucG9ydCAhPSA4MCkpKSB7XG4gICAgcG9ydCA9ICc6JyArIHRoaXMucG9ydDtcbiAgfVxuXG4gIC8vIGFwcGVuZCB0aW1lc3RhbXAgdG8gVVJJXG4gIGlmICh0aGlzLnRpbWVzdGFtcFJlcXVlc3RzKSB7XG4gICAgcXVlcnlbdGhpcy50aW1lc3RhbXBQYXJhbV0gPSArbmV3IERhdGU7XG4gIH1cblxuICAvLyBjb21tdW5pY2F0ZSBiaW5hcnkgc3VwcG9ydCBjYXBhYmlsaXRpZXNcbiAgaWYgKCF0aGlzLnN1cHBvcnRzQmluYXJ5KSB7XG4gICAgcXVlcnkuYjY0ID0gMTtcbiAgfVxuXG4gIHF1ZXJ5ID0gcGFyc2Vxcy5lbmNvZGUocXVlcnkpO1xuXG4gIC8vIHByZXBlbmQgPyB0byBxdWVyeVxuICBpZiAocXVlcnkubGVuZ3RoKSB7XG4gICAgcXVlcnkgPSAnPycgKyBxdWVyeTtcbiAgfVxuXG4gIHJldHVybiBzY2hlbWEgKyAnOi8vJyArIHRoaXMuaG9zdG5hbWUgKyBwb3J0ICsgdGhpcy5wYXRoICsgcXVlcnk7XG59O1xuXG4vKipcbiAqIEZlYXR1cmUgZGV0ZWN0aW9uIGZvciBXZWJTb2NrZXQuXG4gKlxuICogQHJldHVybiB7Qm9vbGVhbn0gd2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBhdmFpbGFibGUuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbldTLnByb3RvdHlwZS5jaGVjayA9IGZ1bmN0aW9uKCl7XG4gIHJldHVybiAhIVdlYlNvY2tldCAmJiAhKCdfX2luaXRpYWxpemUnIGluIFdlYlNvY2tldCAmJiB0aGlzLm5hbWUgPT09IFdTLnByb3RvdHlwZS5uYW1lKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZW5naW5lLmlvLWNsaWVudC9saWIvdHJhbnNwb3J0cy93ZWJzb2NrZXQuanNcbi8vIG1vZHVsZSBpZCA9IDUzMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 531 */
/***/ function(module, exports) {

    eval("\n/**\n * Module dependencies.\n */\n\nvar global = (function() { return this; })();\n\n/**\n * WebSocket constructor.\n */\n\nvar WebSocket = global.WebSocket || global.MozWebSocket;\n\n/**\n * Module exports.\n */\n\nmodule.exports = WebSocket ? ws : null;\n\n/**\n * WebSocket constructor.\n *\n * The third `opts` options object gets ignored in web browsers, since it's\n * non-standard, and throws a TypeError if passed to the constructor.\n * See: https://github.com/einaros/ws/issues/227\n *\n * @param {String} uri\n * @param {Array} protocols (optional)\n * @param {Object) opts (optional)\n * @api public\n */\n\nfunction ws(uri, protocols, opts) {\n  var instance;\n  if (protocols) {\n    instance = new WebSocket(uri, protocols);\n  } else {\n    instance = new WebSocket(uri);\n  }\n  return instance;\n}\n\nif (WebSocket) ws.prototype = WebSocket.prototype;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTMxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy93cy9saWIvYnJvd3Nlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgZ2xvYmFsID0gKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSkoKTtcblxuLyoqXG4gKiBXZWJTb2NrZXQgY29uc3RydWN0b3IuXG4gKi9cblxudmFyIFdlYlNvY2tldCA9IGdsb2JhbC5XZWJTb2NrZXQgfHwgZ2xvYmFsLk1veldlYlNvY2tldDtcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdlYlNvY2tldCA/IHdzIDogbnVsbDtcblxuLyoqXG4gKiBXZWJTb2NrZXQgY29uc3RydWN0b3IuXG4gKlxuICogVGhlIHRoaXJkIGBvcHRzYCBvcHRpb25zIG9iamVjdCBnZXRzIGlnbm9yZWQgaW4gd2ViIGJyb3dzZXJzLCBzaW5jZSBpdCdzXG4gKiBub24tc3RhbmRhcmQsIGFuZCB0aHJvd3MgYSBUeXBlRXJyb3IgaWYgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAqIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2VpbmFyb3Mvd3MvaXNzdWVzLzIyN1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmlcbiAqIEBwYXJhbSB7QXJyYXl9IHByb3RvY29scyAob3B0aW9uYWwpXG4gKiBAcGFyYW0ge09iamVjdCkgb3B0cyAob3B0aW9uYWwpXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHdzKHVyaSwgcHJvdG9jb2xzLCBvcHRzKSB7XG4gIHZhciBpbnN0YW5jZTtcbiAgaWYgKHByb3RvY29scykge1xuICAgIGluc3RhbmNlID0gbmV3IFdlYlNvY2tldCh1cmksIHByb3RvY29scyk7XG4gIH0gZWxzZSB7XG4gICAgaW5zdGFuY2UgPSBuZXcgV2ViU29ja2V0KHVyaSk7XG4gIH1cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG5pZiAoV2ViU29ja2V0KSB3cy5wcm90b3R5cGUgPSBXZWJTb2NrZXQucHJvdG90eXBlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3dzL2xpYi9icm93c2VyLmpzXG4vLyBtb2R1bGUgaWQgPSA1MzFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 532 */
/***/ function(module, exports) {

    eval("\nvar indexOf = [].indexOf;\n\nmodule.exports = function(arr, obj){\n  if (indexOf) return arr.indexOf(obj);\n  for (var i = 0; i < arr.length; ++i) {\n    if (arr[i] === obj) return i;\n  }\n  return -1;\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTMyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9pbmRleG9mL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlxudmFyIGluZGV4T2YgPSBbXS5pbmRleE9mO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGFyciwgb2JqKXtcbiAgaWYgKGluZGV4T2YpIHJldHVybiBhcnIuaW5kZXhPZihvYmopO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgIGlmIChhcnJbaV0gPT09IG9iaikgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vaW5kZXhvZi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTMyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 533 */
/***/ function(module, exports) {

    eval("/**\n * Parses an URI\n *\n * @author Steven Levithan <stevenlevithan.com> (MIT license)\n * @api private\n */\n\nvar re = /^(?:(?![^:@]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\n\nvar parts = [\n    'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'\n];\n\nmodule.exports = function parseuri(str) {\n    var src = str,\n        b = str.indexOf('['),\n        e = str.indexOf(']');\n\n    if (b != -1 && e != -1) {\n        str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);\n    }\n\n    var m = re.exec(str || ''),\n        uri = {},\n        i = 14;\n\n    while (i--) {\n        uri[parts[i]] = m[i] || '';\n    }\n\n    if (b != -1 && e != -1) {\n        uri.source = src;\n        uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');\n        uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');\n        uri.ipv6uri = true;\n    }\n\n    return uri;\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTMzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L25vZGVfbW9kdWxlcy9wYXJzZXVyaS9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBhcnNlcyBhbiBVUklcbiAqXG4gKiBAYXV0aG9yIFN0ZXZlbiBMZXZpdGhhbiA8c3RldmVubGV2aXRoYW4uY29tPiAoTUlUIGxpY2Vuc2UpXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG52YXIgcmUgPSAvXig/Oig/IVteOkBdKzpbXjpAXFwvXSpAKShodHRwfGh0dHBzfHdzfHdzcyk6XFwvXFwvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPygoPzpbYS1mMC05XXswLDR9Oil7Miw3fVthLWYwLTldezAsNH18W146XFwvPyNdKikoPzo6KFxcZCopKT8pKCgoXFwvKD86W14/I10oPyFbXj8jXFwvXSpcXC5bXj8jXFwvLl0rKD86Wz8jXXwkKSkpKlxcLz8pPyhbXj8jXFwvXSopKSg/OlxcPyhbXiNdKikpPyg/OiMoLiopKT8pLztcblxudmFyIHBhcnRzID0gW1xuICAgICdzb3VyY2UnLCAncHJvdG9jb2wnLCAnYXV0aG9yaXR5JywgJ3VzZXJJbmZvJywgJ3VzZXInLCAncGFzc3dvcmQnLCAnaG9zdCcsICdwb3J0JywgJ3JlbGF0aXZlJywgJ3BhdGgnLCAnZGlyZWN0b3J5JywgJ2ZpbGUnLCAncXVlcnknLCAnYW5jaG9yJ1xuXTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYXJzZXVyaShzdHIpIHtcbiAgICB2YXIgc3JjID0gc3RyLFxuICAgICAgICBiID0gc3RyLmluZGV4T2YoJ1snKSxcbiAgICAgICAgZSA9IHN0ci5pbmRleE9mKCddJyk7XG5cbiAgICBpZiAoYiAhPSAtMSAmJiBlICE9IC0xKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgYikgKyBzdHIuc3Vic3RyaW5nKGIsIGUpLnJlcGxhY2UoLzovZywgJzsnKSArIHN0ci5zdWJzdHJpbmcoZSwgc3RyLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgdmFyIG0gPSByZS5leGVjKHN0ciB8fCAnJyksXG4gICAgICAgIHVyaSA9IHt9LFxuICAgICAgICBpID0gMTQ7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIHVyaVtwYXJ0c1tpXV0gPSBtW2ldIHx8ICcnO1xuICAgIH1cblxuICAgIGlmIChiICE9IC0xICYmIGUgIT0gLTEpIHtcbiAgICAgICAgdXJpLnNvdXJjZSA9IHNyYztcbiAgICAgICAgdXJpLmhvc3QgPSB1cmkuaG9zdC5zdWJzdHJpbmcoMSwgdXJpLmhvc3QubGVuZ3RoIC0gMSkucmVwbGFjZSgvOy9nLCAnOicpO1xuICAgICAgICB1cmkuYXV0aG9yaXR5ID0gdXJpLmF1dGhvcml0eS5yZXBsYWNlKCdbJywgJycpLnJlcGxhY2UoJ10nLCAnJykucmVwbGFjZSgvOy9nLCAnOicpO1xuICAgICAgICB1cmkuaXB2NnVyaSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVyaTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZW5naW5lLmlvLWNsaWVudC9+L3BhcnNldXJpL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA1MzNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 534 */
/***/ function(module, exports) {

    eval("/* WEBPACK VAR INJECTION */(function(global) {/**\n * JSON parse.\n *\n * @see Based on jQuery#parseJSON (MIT) and JSON2\n * @api private\n */\n\nvar rvalidchars = /^[\\],:{}\\s]*$/;\nvar rvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g;\nvar rvalidtokens = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g;\nvar rvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g;\nvar rtrimLeft = /^\\s+/;\nvar rtrimRight = /\\s+$/;\n\nmodule.exports = function parsejson(data) {\n  if ('string' != typeof data || !data) {\n    return null;\n  }\n\n  data = data.replace(rtrimLeft, '').replace(rtrimRight, '');\n\n  // Attempt to parse using the native JSON parser first\n  if (global.JSON && JSON.parse) {\n    return JSON.parse(data);\n  }\n\n  if (rvalidchars.test(data.replace(rvalidescape, '@')\n      .replace(rvalidtokens, ']')\n      .replace(rvalidbraces, ''))) {\n    return (new Function('return ' + data))();\n  }\n};\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTM0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9wYXJzZWpzb24vaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBKU09OIHBhcnNlLlxuICpcbiAqIEBzZWUgQmFzZWQgb24galF1ZXJ5I3BhcnNlSlNPTiAoTUlUKSBhbmQgSlNPTjJcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbnZhciBydmFsaWRjaGFycyA9IC9eW1xcXSw6e31cXHNdKiQvO1xudmFyIHJ2YWxpZGVzY2FwZSA9IC9cXFxcKD86W1wiXFxcXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2c7XG52YXIgcnZhbGlkdG9rZW5zID0gL1wiW15cIlxcXFxcXG5cXHJdKlwifHRydWV8ZmFsc2V8bnVsbHwtP1xcZCsoPzpcXC5cXGQqKT8oPzpbZUVdWytcXC1dP1xcZCspPy9nO1xudmFyIHJ2YWxpZGJyYWNlcyA9IC8oPzpefDp8LCkoPzpcXHMqXFxbKSsvZztcbnZhciBydHJpbUxlZnQgPSAvXlxccysvO1xudmFyIHJ0cmltUmlnaHQgPSAvXFxzKyQvO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhcnNlanNvbihkYXRhKSB7XG4gIGlmICgnc3RyaW5nJyAhPSB0eXBlb2YgZGF0YSB8fCAhZGF0YSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZGF0YSA9IGRhdGEucmVwbGFjZShydHJpbUxlZnQsICcnKS5yZXBsYWNlKHJ0cmltUmlnaHQsICcnKTtcblxuICAvLyBBdHRlbXB0IHRvIHBhcnNlIHVzaW5nIHRoZSBuYXRpdmUgSlNPTiBwYXJzZXIgZmlyc3RcbiAgaWYgKGdsb2JhbC5KU09OICYmIEpTT04ucGFyc2UpIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcbiAgfVxuXG4gIGlmIChydmFsaWRjaGFycy50ZXN0KGRhdGEucmVwbGFjZShydmFsaWRlc2NhcGUsICdAJylcbiAgICAgIC5yZXBsYWNlKHJ2YWxpZHRva2VucywgJ10nKVxuICAgICAgLnJlcGxhY2UocnZhbGlkYnJhY2VzLCAnJykpKSB7XG4gICAgcmV0dXJuIChuZXcgRnVuY3Rpb24oJ3JldHVybiAnICsgZGF0YSkpKCk7XG4gIH1cbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3BhcnNlanNvbi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTM0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 535 */
/***/ function(module, exports, __webpack_require__) {

    eval("\n/**\n * Module dependencies.\n */\n\nvar parser = __webpack_require__(496);\nvar Emitter = __webpack_require__(501);\nvar toArray = __webpack_require__(536);\nvar on = __webpack_require__(537);\nvar bind = __webpack_require__(538);\nvar debug = __webpack_require__(495)('socket.io-client:socket');\nvar hasBin = __webpack_require__(517);\n\n/**\n * Module exports.\n */\n\nmodule.exports = exports = Socket;\n\n/**\n * Internal events (blacklisted).\n * These events can't be emitted by the user.\n *\n * @api private\n */\n\nvar events = {\n  connect: 1,\n  connect_error: 1,\n  connect_timeout: 1,\n  disconnect: 1,\n  error: 1,\n  reconnect: 1,\n  reconnect_attempt: 1,\n  reconnect_failed: 1,\n  reconnect_error: 1,\n  reconnecting: 1\n};\n\n/**\n * Shortcut to `Emitter#emit`.\n */\n\nvar emit = Emitter.prototype.emit;\n\n/**\n * `Socket` constructor.\n *\n * @api public\n */\n\nfunction Socket(io, nsp){\n  this.io = io;\n  this.nsp = nsp;\n  this.json = this; // compat\n  this.ids = 0;\n  this.acks = {};\n  if (this.io.autoConnect) this.open();\n  this.receiveBuffer = [];\n  this.sendBuffer = [];\n  this.connected = false;\n  this.disconnected = true;\n}\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Socket.prototype);\n\n/**\n * Subscribe to open, close and packet events\n *\n * @api private\n */\n\nSocket.prototype.subEvents = function() {\n  if (this.subs) return;\n\n  var io = this.io;\n  this.subs = [\n    on(io, 'open', bind(this, 'onopen')),\n    on(io, 'packet', bind(this, 'onpacket')),\n    on(io, 'close', bind(this, 'onclose'))\n  ];\n};\n\n/**\n * \"Opens\" the socket.\n *\n * @api public\n */\n\nSocket.prototype.open =\nSocket.prototype.connect = function(){\n  if (this.connected) return this;\n\n  this.subEvents();\n  this.io.open(); // ensure open\n  if ('open' == this.io.readyState) this.onopen();\n  return this;\n};\n\n/**\n * Sends a `message` event.\n *\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.send = function(){\n  var args = toArray(arguments);\n  args.unshift('message');\n  this.emit.apply(this, args);\n  return this;\n};\n\n/**\n * Override `emit`.\n * If the event is in `events`, it's emitted normally.\n *\n * @param {String} event name\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.emit = function(ev){\n  if (events.hasOwnProperty(ev)) {\n    emit.apply(this, arguments);\n    return this;\n  }\n\n  var args = toArray(arguments);\n  var parserType = parser.EVENT; // default\n  if (hasBin(args)) { parserType = parser.BINARY_EVENT; } // binary\n  var packet = { type: parserType, data: args };\n\n  // event ack callback\n  if ('function' == typeof args[args.length - 1]) {\n    debug('emitting packet with ack id %d', this.ids);\n    this.acks[this.ids] = args.pop();\n    packet.id = this.ids++;\n  }\n\n  if (this.connected) {\n    this.packet(packet);\n  } else {\n    this.sendBuffer.push(packet);\n  }\n\n  return this;\n};\n\n/**\n * Sends a packet.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.packet = function(packet){\n  packet.nsp = this.nsp;\n  this.io.packet(packet);\n};\n\n/**\n * Called upon engine `open`.\n *\n * @api private\n */\n\nSocket.prototype.onopen = function(){\n  debug('transport is open - connecting');\n\n  // write connect packet if necessary\n  if ('/' != this.nsp) {\n    this.packet({ type: parser.CONNECT });\n  }\n};\n\n/**\n * Called upon engine `close`.\n *\n * @param {String} reason\n * @api private\n */\n\nSocket.prototype.onclose = function(reason){\n  debug('close (%s)', reason);\n  this.connected = false;\n  this.disconnected = true;\n  delete this.id;\n  this.emit('disconnect', reason);\n};\n\n/**\n * Called with socket packet.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.onpacket = function(packet){\n  if (packet.nsp != this.nsp) return;\n\n  switch (packet.type) {\n    case parser.CONNECT:\n      this.onconnect();\n      break;\n\n    case parser.EVENT:\n      this.onevent(packet);\n      break;\n\n    case parser.BINARY_EVENT:\n      this.onevent(packet);\n      break;\n\n    case parser.ACK:\n      this.onack(packet);\n      break;\n\n    case parser.BINARY_ACK:\n      this.onack(packet);\n      break;\n\n    case parser.DISCONNECT:\n      this.ondisconnect();\n      break;\n\n    case parser.ERROR:\n      this.emit('error', packet.data);\n      break;\n  }\n};\n\n/**\n * Called upon a server event.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.onevent = function(packet){\n  var args = packet.data || [];\n  debug('emitting event %j', args);\n\n  if (null != packet.id) {\n    debug('attaching ack callback to event');\n    args.push(this.ack(packet.id));\n  }\n\n  if (this.connected) {\n    emit.apply(this, args);\n  } else {\n    this.receiveBuffer.push(args);\n  }\n};\n\n/**\n * Produces an ack callback to emit with an event.\n *\n * @api private\n */\n\nSocket.prototype.ack = function(id){\n  var self = this;\n  var sent = false;\n  return function(){\n    // prevent double callbacks\n    if (sent) return;\n    sent = true;\n    var args = toArray(arguments);\n    debug('sending ack %j', args);\n\n    var type = hasBin(args) ? parser.BINARY_ACK : parser.ACK;\n    self.packet({\n      type: type,\n      id: id,\n      data: args\n    });\n  };\n};\n\n/**\n * Called upon a server acknowlegement.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.onack = function(packet){\n  debug('calling ack %s with %j', packet.id, packet.data);\n  var fn = this.acks[packet.id];\n  fn.apply(this, packet.data);\n  delete this.acks[packet.id];\n};\n\n/**\n * Called upon server connect.\n *\n * @api private\n */\n\nSocket.prototype.onconnect = function(){\n  this.connected = true;\n  this.disconnected = false;\n  this.emit('connect');\n  this.emitBuffered();\n};\n\n/**\n * Emit buffered events (received and emitted).\n *\n * @api private\n */\n\nSocket.prototype.emitBuffered = function(){\n  var i;\n  for (i = 0; i < this.receiveBuffer.length; i++) {\n    emit.apply(this, this.receiveBuffer[i]);\n  }\n  this.receiveBuffer = [];\n\n  for (i = 0; i < this.sendBuffer.length; i++) {\n    this.packet(this.sendBuffer[i]);\n  }\n  this.sendBuffer = [];\n};\n\n/**\n * Called upon server disconnect.\n *\n * @api private\n */\n\nSocket.prototype.ondisconnect = function(){\n  debug('server disconnect (%s)', this.nsp);\n  this.destroy();\n  this.onclose('io server disconnect');\n};\n\n/**\n * Called upon forced client/server side disconnections,\n * this method ensures the manager stops tracking us and\n * that reconnections don't get triggered for this.\n *\n * @api private.\n */\n\nSocket.prototype.destroy = function(){\n  if (this.subs) {\n    // clean subscriptions to avoid reconnections\n    for (var i = 0; i < this.subs.length; i++) {\n      this.subs[i].destroy();\n    }\n    this.subs = null;\n  }\n\n  this.io.destroy(this);\n};\n\n/**\n * Disconnects the socket manually.\n *\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.close =\nSocket.prototype.disconnect = function(){\n  if (this.connected) {\n    debug('performing disconnect (%s)', this.nsp);\n    this.packet({ type: parser.DISCONNECT });\n  }\n\n  // remove socket from pool\n  this.destroy();\n\n  if (this.connected) {\n    // fire events\n    this.onclose('io client disconnect');\n  }\n  return this;\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTM1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tY2xpZW50L2xpYi9zb2NrZXQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIHBhcnNlciA9IHJlcXVpcmUoJ3NvY2tldC5pby1wYXJzZXInKTtcbnZhciBFbWl0dGVyID0gcmVxdWlyZSgnY29tcG9uZW50LWVtaXR0ZXInKTtcbnZhciB0b0FycmF5ID0gcmVxdWlyZSgndG8tYXJyYXknKTtcbnZhciBvbiA9IHJlcXVpcmUoJy4vb24nKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnY29tcG9uZW50LWJpbmQnKTtcbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ3NvY2tldC5pby1jbGllbnQ6c29ja2V0Jyk7XG52YXIgaGFzQmluID0gcmVxdWlyZSgnaGFzLWJpbmFyeScpO1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IFNvY2tldDtcblxuLyoqXG4gKiBJbnRlcm5hbCBldmVudHMgKGJsYWNrbGlzdGVkKS5cbiAqIFRoZXNlIGV2ZW50cyBjYW4ndCBiZSBlbWl0dGVkIGJ5IHRoZSB1c2VyLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbnZhciBldmVudHMgPSB7XG4gIGNvbm5lY3Q6IDEsXG4gIGNvbm5lY3RfZXJyb3I6IDEsXG4gIGNvbm5lY3RfdGltZW91dDogMSxcbiAgZGlzY29ubmVjdDogMSxcbiAgZXJyb3I6IDEsXG4gIHJlY29ubmVjdDogMSxcbiAgcmVjb25uZWN0X2F0dGVtcHQ6IDEsXG4gIHJlY29ubmVjdF9mYWlsZWQ6IDEsXG4gIHJlY29ubmVjdF9lcnJvcjogMSxcbiAgcmVjb25uZWN0aW5nOiAxXG59O1xuXG4vKipcbiAqIFNob3J0Y3V0IHRvIGBFbWl0dGVyI2VtaXRgLlxuICovXG5cbnZhciBlbWl0ID0gRW1pdHRlci5wcm90b3R5cGUuZW1pdDtcblxuLyoqXG4gKiBgU29ja2V0YCBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIFNvY2tldChpbywgbnNwKXtcbiAgdGhpcy5pbyA9IGlvO1xuICB0aGlzLm5zcCA9IG5zcDtcbiAgdGhpcy5qc29uID0gdGhpczsgLy8gY29tcGF0XG4gIHRoaXMuaWRzID0gMDtcbiAgdGhpcy5hY2tzID0ge307XG4gIGlmICh0aGlzLmlvLmF1dG9Db25uZWN0KSB0aGlzLm9wZW4oKTtcbiAgdGhpcy5yZWNlaXZlQnVmZmVyID0gW107XG4gIHRoaXMuc2VuZEJ1ZmZlciA9IFtdO1xuICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICB0aGlzLmRpc2Nvbm5lY3RlZCA9IHRydWU7XG59XG5cbi8qKlxuICogTWl4IGluIGBFbWl0dGVyYC5cbiAqL1xuXG5FbWl0dGVyKFNvY2tldC5wcm90b3R5cGUpO1xuXG4vKipcbiAqIFN1YnNjcmliZSB0byBvcGVuLCBjbG9zZSBhbmQgcGFja2V0IGV2ZW50c1xuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNvY2tldC5wcm90b3R5cGUuc3ViRXZlbnRzID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnN1YnMpIHJldHVybjtcblxuICB2YXIgaW8gPSB0aGlzLmlvO1xuICB0aGlzLnN1YnMgPSBbXG4gICAgb24oaW8sICdvcGVuJywgYmluZCh0aGlzLCAnb25vcGVuJykpLFxuICAgIG9uKGlvLCAncGFja2V0JywgYmluZCh0aGlzLCAnb25wYWNrZXQnKSksXG4gICAgb24oaW8sICdjbG9zZScsIGJpbmQodGhpcywgJ29uY2xvc2UnKSlcbiAgXTtcbn07XG5cbi8qKlxuICogXCJPcGVuc1wiIHRoZSBzb2NrZXQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Tb2NrZXQucHJvdG90eXBlLm9wZW4gPVxuU29ja2V0LnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24oKXtcbiAgaWYgKHRoaXMuY29ubmVjdGVkKSByZXR1cm4gdGhpcztcblxuICB0aGlzLnN1YkV2ZW50cygpO1xuICB0aGlzLmlvLm9wZW4oKTsgLy8gZW5zdXJlIG9wZW5cbiAgaWYgKCdvcGVuJyA9PSB0aGlzLmlvLnJlYWR5U3RhdGUpIHRoaXMub25vcGVuKCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZW5kcyBhIGBtZXNzYWdlYCBldmVudC5cbiAqXG4gKiBAcmV0dXJuIHtTb2NrZXR9IHNlbGZcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuU29ja2V0LnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24oKXtcbiAgdmFyIGFyZ3MgPSB0b0FycmF5KGFyZ3VtZW50cyk7XG4gIGFyZ3MudW5zaGlmdCgnbWVzc2FnZScpO1xuICB0aGlzLmVtaXQuYXBwbHkodGhpcywgYXJncyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBPdmVycmlkZSBgZW1pdGAuXG4gKiBJZiB0aGUgZXZlbnQgaXMgaW4gYGV2ZW50c2AsIGl0J3MgZW1pdHRlZCBub3JtYWxseS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnQgbmFtZVxuICogQHJldHVybiB7U29ja2V0fSBzZWxmXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblNvY2tldC5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uKGV2KXtcbiAgaWYgKGV2ZW50cy5oYXNPd25Qcm9wZXJ0eShldikpIHtcbiAgICBlbWl0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB2YXIgYXJncyA9IHRvQXJyYXkoYXJndW1lbnRzKTtcbiAgdmFyIHBhcnNlclR5cGUgPSBwYXJzZXIuRVZFTlQ7IC8vIGRlZmF1bHRcbiAgaWYgKGhhc0JpbihhcmdzKSkgeyBwYXJzZXJUeXBlID0gcGFyc2VyLkJJTkFSWV9FVkVOVDsgfSAvLyBiaW5hcnlcbiAgdmFyIHBhY2tldCA9IHsgdHlwZTogcGFyc2VyVHlwZSwgZGF0YTogYXJncyB9O1xuXG4gIC8vIGV2ZW50IGFjayBjYWxsYmFja1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdKSB7XG4gICAgZGVidWcoJ2VtaXR0aW5nIHBhY2tldCB3aXRoIGFjayBpZCAlZCcsIHRoaXMuaWRzKTtcbiAgICB0aGlzLmFja3NbdGhpcy5pZHNdID0gYXJncy5wb3AoKTtcbiAgICBwYWNrZXQuaWQgPSB0aGlzLmlkcysrO1xuICB9XG5cbiAgaWYgKHRoaXMuY29ubmVjdGVkKSB7XG4gICAgdGhpcy5wYWNrZXQocGFja2V0KTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnNlbmRCdWZmZXIucHVzaChwYWNrZXQpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNlbmRzIGEgcGFja2V0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYWNrZXRcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNvY2tldC5wcm90b3R5cGUucGFja2V0ID0gZnVuY3Rpb24ocGFja2V0KXtcbiAgcGFja2V0Lm5zcCA9IHRoaXMubnNwO1xuICB0aGlzLmlvLnBhY2tldChwYWNrZXQpO1xufTtcblxuLyoqXG4gKiBDYWxsZWQgdXBvbiBlbmdpbmUgYG9wZW5gLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNvY2tldC5wcm90b3R5cGUub25vcGVuID0gZnVuY3Rpb24oKXtcbiAgZGVidWcoJ3RyYW5zcG9ydCBpcyBvcGVuIC0gY29ubmVjdGluZycpO1xuXG4gIC8vIHdyaXRlIGNvbm5lY3QgcGFja2V0IGlmIG5lY2Vzc2FyeVxuICBpZiAoJy8nICE9IHRoaXMubnNwKSB7XG4gICAgdGhpcy5wYWNrZXQoeyB0eXBlOiBwYXJzZXIuQ09OTkVDVCB9KTtcbiAgfVxufTtcblxuLyoqXG4gKiBDYWxsZWQgdXBvbiBlbmdpbmUgYGNsb3NlYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcmVhc29uXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Tb2NrZXQucHJvdG90eXBlLm9uY2xvc2UgPSBmdW5jdGlvbihyZWFzb24pe1xuICBkZWJ1ZygnY2xvc2UgKCVzKScsIHJlYXNvbik7XG4gIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gIHRoaXMuZGlzY29ubmVjdGVkID0gdHJ1ZTtcbiAgZGVsZXRlIHRoaXMuaWQ7XG4gIHRoaXMuZW1pdCgnZGlzY29ubmVjdCcsIHJlYXNvbik7XG59O1xuXG4vKipcbiAqIENhbGxlZCB3aXRoIHNvY2tldCBwYWNrZXQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhY2tldFxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU29ja2V0LnByb3RvdHlwZS5vbnBhY2tldCA9IGZ1bmN0aW9uKHBhY2tldCl7XG4gIGlmIChwYWNrZXQubnNwICE9IHRoaXMubnNwKSByZXR1cm47XG5cbiAgc3dpdGNoIChwYWNrZXQudHlwZSkge1xuICAgIGNhc2UgcGFyc2VyLkNPTk5FQ1Q6XG4gICAgICB0aGlzLm9uY29ubmVjdCgpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIHBhcnNlci5FVkVOVDpcbiAgICAgIHRoaXMub25ldmVudChwYWNrZXQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIHBhcnNlci5CSU5BUllfRVZFTlQ6XG4gICAgICB0aGlzLm9uZXZlbnQocGFja2V0KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBwYXJzZXIuQUNLOlxuICAgICAgdGhpcy5vbmFjayhwYWNrZXQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIHBhcnNlci5CSU5BUllfQUNLOlxuICAgICAgdGhpcy5vbmFjayhwYWNrZXQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIHBhcnNlci5ESVNDT05ORUNUOlxuICAgICAgdGhpcy5vbmRpc2Nvbm5lY3QoKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBwYXJzZXIuRVJST1I6XG4gICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgcGFja2V0LmRhdGEpO1xuICAgICAgYnJlYWs7XG4gIH1cbn07XG5cbi8qKlxuICogQ2FsbGVkIHVwb24gYSBzZXJ2ZXIgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhY2tldFxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU29ja2V0LnByb3RvdHlwZS5vbmV2ZW50ID0gZnVuY3Rpb24ocGFja2V0KXtcbiAgdmFyIGFyZ3MgPSBwYWNrZXQuZGF0YSB8fCBbXTtcbiAgZGVidWcoJ2VtaXR0aW5nIGV2ZW50ICVqJywgYXJncyk7XG5cbiAgaWYgKG51bGwgIT0gcGFja2V0LmlkKSB7XG4gICAgZGVidWcoJ2F0dGFjaGluZyBhY2sgY2FsbGJhY2sgdG8gZXZlbnQnKTtcbiAgICBhcmdzLnB1c2godGhpcy5hY2socGFja2V0LmlkKSk7XG4gIH1cblxuICBpZiAodGhpcy5jb25uZWN0ZWQpIHtcbiAgICBlbWl0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMucmVjZWl2ZUJ1ZmZlci5wdXNoKGFyZ3MpO1xuICB9XG59O1xuXG4vKipcbiAqIFByb2R1Y2VzIGFuIGFjayBjYWxsYmFjayB0byBlbWl0IHdpdGggYW4gZXZlbnQuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU29ja2V0LnByb3RvdHlwZS5hY2sgPSBmdW5jdGlvbihpZCl7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHNlbnQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCl7XG4gICAgLy8gcHJldmVudCBkb3VibGUgY2FsbGJhY2tzXG4gICAgaWYgKHNlbnQpIHJldHVybjtcbiAgICBzZW50ID0gdHJ1ZTtcbiAgICB2YXIgYXJncyA9IHRvQXJyYXkoYXJndW1lbnRzKTtcbiAgICBkZWJ1Zygnc2VuZGluZyBhY2sgJWonLCBhcmdzKTtcblxuICAgIHZhciB0eXBlID0gaGFzQmluKGFyZ3MpID8gcGFyc2VyLkJJTkFSWV9BQ0sgOiBwYXJzZXIuQUNLO1xuICAgIHNlbGYucGFja2V0KHtcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBpZDogaWQsXG4gICAgICBkYXRhOiBhcmdzXG4gICAgfSk7XG4gIH07XG59O1xuXG4vKipcbiAqIENhbGxlZCB1cG9uIGEgc2VydmVyIGFja25vd2xlZ2VtZW50LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYWNrZXRcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNvY2tldC5wcm90b3R5cGUub25hY2sgPSBmdW5jdGlvbihwYWNrZXQpe1xuICBkZWJ1ZygnY2FsbGluZyBhY2sgJXMgd2l0aCAlaicsIHBhY2tldC5pZCwgcGFja2V0LmRhdGEpO1xuICB2YXIgZm4gPSB0aGlzLmFja3NbcGFja2V0LmlkXTtcbiAgZm4uYXBwbHkodGhpcywgcGFja2V0LmRhdGEpO1xuICBkZWxldGUgdGhpcy5hY2tzW3BhY2tldC5pZF07XG59O1xuXG4vKipcbiAqIENhbGxlZCB1cG9uIHNlcnZlciBjb25uZWN0LlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNvY2tldC5wcm90b3R5cGUub25jb25uZWN0ID0gZnVuY3Rpb24oKXtcbiAgdGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuICB0aGlzLmRpc2Nvbm5lY3RlZCA9IGZhbHNlO1xuICB0aGlzLmVtaXQoJ2Nvbm5lY3QnKTtcbiAgdGhpcy5lbWl0QnVmZmVyZWQoKTtcbn07XG5cbi8qKlxuICogRW1pdCBidWZmZXJlZCBldmVudHMgKHJlY2VpdmVkIGFuZCBlbWl0dGVkKS5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Tb2NrZXQucHJvdG90eXBlLmVtaXRCdWZmZXJlZCA9IGZ1bmN0aW9uKCl7XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5yZWNlaXZlQnVmZmVyLmxlbmd0aDsgaSsrKSB7XG4gICAgZW1pdC5hcHBseSh0aGlzLCB0aGlzLnJlY2VpdmVCdWZmZXJbaV0pO1xuICB9XG4gIHRoaXMucmVjZWl2ZUJ1ZmZlciA9IFtdO1xuXG4gIGZvciAoaSA9IDA7IGkgPCB0aGlzLnNlbmRCdWZmZXIubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLnBhY2tldCh0aGlzLnNlbmRCdWZmZXJbaV0pO1xuICB9XG4gIHRoaXMuc2VuZEJ1ZmZlciA9IFtdO1xufTtcblxuLyoqXG4gKiBDYWxsZWQgdXBvbiBzZXJ2ZXIgZGlzY29ubmVjdC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Tb2NrZXQucHJvdG90eXBlLm9uZGlzY29ubmVjdCA9IGZ1bmN0aW9uKCl7XG4gIGRlYnVnKCdzZXJ2ZXIgZGlzY29ubmVjdCAoJXMpJywgdGhpcy5uc3ApO1xuICB0aGlzLmRlc3Ryb3koKTtcbiAgdGhpcy5vbmNsb3NlKCdpbyBzZXJ2ZXIgZGlzY29ubmVjdCcpO1xufTtcblxuLyoqXG4gKiBDYWxsZWQgdXBvbiBmb3JjZWQgY2xpZW50L3NlcnZlciBzaWRlIGRpc2Nvbm5lY3Rpb25zLFxuICogdGhpcyBtZXRob2QgZW5zdXJlcyB0aGUgbWFuYWdlciBzdG9wcyB0cmFja2luZyB1cyBhbmRcbiAqIHRoYXQgcmVjb25uZWN0aW9ucyBkb24ndCBnZXQgdHJpZ2dlcmVkIGZvciB0aGlzLlxuICpcbiAqIEBhcGkgcHJpdmF0ZS5cbiAqL1xuXG5Tb2NrZXQucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpe1xuICBpZiAodGhpcy5zdWJzKSB7XG4gICAgLy8gY2xlYW4gc3Vic2NyaXB0aW9ucyB0byBhdm9pZCByZWNvbm5lY3Rpb25zXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc3Vic1tpXS5kZXN0cm95KCk7XG4gICAgfVxuICAgIHRoaXMuc3VicyA9IG51bGw7XG4gIH1cblxuICB0aGlzLmlvLmRlc3Ryb3kodGhpcyk7XG59O1xuXG4vKipcbiAqIERpc2Nvbm5lY3RzIHRoZSBzb2NrZXQgbWFudWFsbHkuXG4gKlxuICogQHJldHVybiB7U29ja2V0fSBzZWxmXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblNvY2tldC5wcm90b3R5cGUuY2xvc2UgPVxuU29ja2V0LnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24oKXtcbiAgaWYgKHRoaXMuY29ubmVjdGVkKSB7XG4gICAgZGVidWcoJ3BlcmZvcm1pbmcgZGlzY29ubmVjdCAoJXMpJywgdGhpcy5uc3ApO1xuICAgIHRoaXMucGFja2V0KHsgdHlwZTogcGFyc2VyLkRJU0NPTk5FQ1QgfSk7XG4gIH1cblxuICAvLyByZW1vdmUgc29ja2V0IGZyb20gcG9vbFxuICB0aGlzLmRlc3Ryb3koKTtcblxuICBpZiAodGhpcy5jb25uZWN0ZWQpIHtcbiAgICAvLyBmaXJlIGV2ZW50c1xuICAgIHRoaXMub25jbG9zZSgnaW8gY2xpZW50IGRpc2Nvbm5lY3QnKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vc29ja2V0LmlvLWNsaWVudC9saWIvc29ja2V0LmpzXG4vLyBtb2R1bGUgaWQgPSA1MzVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 536 */
/***/ function(module, exports) {

    eval("module.exports = toArray\n\nfunction toArray(list, index) {\n    var array = []\n\n    index = index || 0\n\n    for (var i = index || 0; i < list.length; i++) {\n        array[i - index] = list[i]\n    }\n\n    return array\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTM2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy90by1hcnJheS9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHRvQXJyYXlcblxuZnVuY3Rpb24gdG9BcnJheShsaXN0LCBpbmRleCkge1xuICAgIHZhciBhcnJheSA9IFtdXG5cbiAgICBpbmRleCA9IGluZGV4IHx8IDBcblxuICAgIGZvciAodmFyIGkgPSBpbmRleCB8fCAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBhcnJheVtpIC0gaW5kZXhdID0gbGlzdFtpXVxuICAgIH1cblxuICAgIHJldHVybiBhcnJheVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3RvLWFycmF5L2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA1MzZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 537 */
/***/ function(module, exports) {

    eval("\n/**\n * Module exports.\n */\n\nmodule.exports = on;\n\n/**\n * Helper for subscriptions.\n *\n * @param {Object|EventEmitter} obj with `Emitter` mixin or `EventEmitter`\n * @param {String} event name\n * @param {Function} callback\n * @api public\n */\n\nfunction on(obj, ev, fn) {\n  obj.on(ev, fn);\n  return {\n    destroy: function(){\n      obj.removeListener(ev, fn);\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTM3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tY2xpZW50L2xpYi9vbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBvbjtcblxuLyoqXG4gKiBIZWxwZXIgZm9yIHN1YnNjcmlwdGlvbnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R8RXZlbnRFbWl0dGVyfSBvYmogd2l0aCBgRW1pdHRlcmAgbWl4aW4gb3IgYEV2ZW50RW1pdHRlcmBcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudCBuYW1lXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBvbihvYmosIGV2LCBmbikge1xuICBvYmoub24oZXYsIGZuKTtcbiAgcmV0dXJuIHtcbiAgICBkZXN0cm95OiBmdW5jdGlvbigpe1xuICAgICAgb2JqLnJlbW92ZUxpc3RlbmVyKGV2LCBmbik7XG4gICAgfVxuICB9O1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3NvY2tldC5pby1jbGllbnQvbGliL29uLmpzXG4vLyBtb2R1bGUgaWQgPSA1Mzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 538 */
/***/ function(module, exports) {

    eval("/**\n * Slice reference.\n */\n\nvar slice = [].slice;\n\n/**\n * Bind `obj` to `fn`.\n *\n * @param {Object} obj\n * @param {Function|String} fn or string\n * @return {Function}\n * @api public\n */\n\nmodule.exports = function(obj, fn){\n  if ('string' == typeof fn) fn = obj[fn];\n  if ('function' != typeof fn) throw new Error('bind() requires a function');\n  var args = slice.call(arguments, 2);\n  return function(){\n    return fn.apply(obj, args.concat(slice.call(arguments)));\n  }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTM4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9jb21wb25lbnQtYmluZC9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNsaWNlIHJlZmVyZW5jZS5cbiAqL1xuXG52YXIgc2xpY2UgPSBbXS5zbGljZTtcblxuLyoqXG4gKiBCaW5kIGBvYmpgIHRvIGBmbmAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IGZuIG9yIHN0cmluZ1xuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqLCBmbil7XG4gIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZm4pIGZuID0gb2JqW2ZuXTtcbiAgaWYgKCdmdW5jdGlvbicgIT0gdHlwZW9mIGZuKSB0aHJvdyBuZXcgRXJyb3IoJ2JpbmQoKSByZXF1aXJlcyBhIGZ1bmN0aW9uJyk7XG4gIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICByZXR1cm4gZnVuY3Rpb24oKXtcbiAgICByZXR1cm4gZm4uYXBwbHkob2JqLCBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpKTtcbiAgfVxufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb21wb25lbnQtYmluZC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTM4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 539 */
/***/ function(module, exports) {

    eval("\n/**\n * HOP ref.\n */\n\nvar has = Object.prototype.hasOwnProperty;\n\n/**\n * Return own keys in `obj`.\n *\n * @param {Object} obj\n * @return {Array}\n * @api public\n */\n\nexports.keys = Object.keys || function(obj){\n  var keys = [];\n  for (var key in obj) {\n    if (has.call(obj, key)) {\n      keys.push(key);\n    }\n  }\n  return keys;\n};\n\n/**\n * Return own values in `obj`.\n *\n * @param {Object} obj\n * @return {Array}\n * @api public\n */\n\nexports.values = function(obj){\n  var vals = [];\n  for (var key in obj) {\n    if (has.call(obj, key)) {\n      vals.push(obj[key]);\n    }\n  }\n  return vals;\n};\n\n/**\n * Merge `b` into `a`.\n *\n * @param {Object} a\n * @param {Object} b\n * @return {Object} a\n * @api public\n */\n\nexports.merge = function(a, b){\n  for (var key in b) {\n    if (has.call(b, key)) {\n      a[key] = b[key];\n    }\n  }\n  return a;\n};\n\n/**\n * Return length of `obj`.\n *\n * @param {Object} obj\n * @return {Number}\n * @api public\n */\n\nexports.length = function(obj){\n  return exports.keys(obj).length;\n};\n\n/**\n * Check if `obj` is empty.\n *\n * @param {Object} obj\n * @return {Boolean}\n * @api public\n */\n\nexports.isEmpty = function(obj){\n  return 0 == exports.length(obj);\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTM5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9vYmplY3QtY29tcG9uZW50L2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBIT1AgcmVmLlxuICovXG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFJldHVybiBvd24ga2V5cyBpbiBgb2JqYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5rZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ob2JqKXtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChoYXMuY2FsbChvYmosIGtleSkpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ga2V5cztcbn07XG5cbi8qKlxuICogUmV0dXJuIG93biB2YWx1ZXMgaW4gYG9iamAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMudmFsdWVzID0gZnVuY3Rpb24ob2JqKXtcbiAgdmFyIHZhbHMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChoYXMuY2FsbChvYmosIGtleSkpIHtcbiAgICAgIHZhbHMucHVzaChvYmpba2V5XSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWxzO1xufTtcblxuLyoqXG4gKiBNZXJnZSBgYmAgaW50byBgYWAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFcbiAqIEBwYXJhbSB7T2JqZWN0fSBiXG4gKiBAcmV0dXJuIHtPYmplY3R9IGFcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5tZXJnZSA9IGZ1bmN0aW9uKGEsIGIpe1xuICBmb3IgKHZhciBrZXkgaW4gYikge1xuICAgIGlmIChoYXMuY2FsbChiLCBrZXkpKSB7XG4gICAgICBhW2tleV0gPSBiW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBhO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gbGVuZ3RoIG9mIGBvYmpgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5sZW5ndGggPSBmdW5jdGlvbihvYmope1xuICByZXR1cm4gZXhwb3J0cy5rZXlzKG9iaikubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBgb2JqYCBpcyBlbXB0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLmlzRW1wdHkgPSBmdW5jdGlvbihvYmope1xuICByZXR1cm4gMCA9PSBleHBvcnRzLmxlbmd0aChvYmopO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vb2JqZWN0LWNvbXBvbmVudC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTM5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 540 */
/***/ function(module, exports) {

    eval("\n/**\n * Expose `Backoff`.\n */\n\nmodule.exports = Backoff;\n\n/**\n * Initialize backoff timer with `opts`.\n *\n * - `min` initial timeout in milliseconds [100]\n * - `max` max timeout [10000]\n * - `jitter` [0]\n * - `factor` [2]\n *\n * @param {Object} opts\n * @api public\n */\n\nfunction Backoff(opts) {\n  opts = opts || {};\n  this.ms = opts.min || 100;\n  this.max = opts.max || 10000;\n  this.factor = opts.factor || 2;\n  this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0;\n  this.attempts = 0;\n}\n\n/**\n * Return the backoff duration.\n *\n * @return {Number}\n * @api public\n */\n\nBackoff.prototype.duration = function(){\n  var ms = this.ms * Math.pow(this.factor, this.attempts++);\n  if (this.jitter) {\n    var rand =  Math.random();\n    var deviation = Math.floor(rand * this.jitter * ms);\n    ms = (Math.floor(rand * 10) & 1) == 0  ? ms - deviation : ms + deviation;\n  }\n  return Math.min(ms, this.max) | 0;\n};\n\n/**\n * Reset the number of attempts.\n *\n * @api public\n */\n\nBackoff.prototype.reset = function(){\n  this.attempts = 0;\n};\n\n/**\n * Set the minimum duration\n *\n * @api public\n */\n\nBackoff.prototype.setMin = function(min){\n  this.ms = min;\n};\n\n/**\n * Set the maximum duration\n *\n * @api public\n */\n\nBackoff.prototype.setMax = function(max){\n  this.max = max;\n};\n\n/**\n * Set the jitter\n *\n * @api public\n */\n\nBackoff.prototype.setJitter = function(jitter){\n  this.jitter = jitter;\n};\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9iYWNrbzIvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEV4cG9zZSBgQmFja29mZmAuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrb2ZmO1xuXG4vKipcbiAqIEluaXRpYWxpemUgYmFja29mZiB0aW1lciB3aXRoIGBvcHRzYC5cbiAqXG4gKiAtIGBtaW5gIGluaXRpYWwgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgWzEwMF1cbiAqIC0gYG1heGAgbWF4IHRpbWVvdXQgWzEwMDAwXVxuICogLSBgaml0dGVyYCBbMF1cbiAqIC0gYGZhY3RvcmAgWzJdXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gQmFja29mZihvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuICB0aGlzLm1zID0gb3B0cy5taW4gfHwgMTAwO1xuICB0aGlzLm1heCA9IG9wdHMubWF4IHx8IDEwMDAwO1xuICB0aGlzLmZhY3RvciA9IG9wdHMuZmFjdG9yIHx8IDI7XG4gIHRoaXMuaml0dGVyID0gb3B0cy5qaXR0ZXIgPiAwICYmIG9wdHMuaml0dGVyIDw9IDEgPyBvcHRzLmppdHRlciA6IDA7XG4gIHRoaXMuYXR0ZW1wdHMgPSAwO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgYmFja29mZiBkdXJhdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkJhY2tvZmYucHJvdG90eXBlLmR1cmF0aW9uID0gZnVuY3Rpb24oKXtcbiAgdmFyIG1zID0gdGhpcy5tcyAqIE1hdGgucG93KHRoaXMuZmFjdG9yLCB0aGlzLmF0dGVtcHRzKyspO1xuICBpZiAodGhpcy5qaXR0ZXIpIHtcbiAgICB2YXIgcmFuZCA9ICBNYXRoLnJhbmRvbSgpO1xuICAgIHZhciBkZXZpYXRpb24gPSBNYXRoLmZsb29yKHJhbmQgKiB0aGlzLmppdHRlciAqIG1zKTtcbiAgICBtcyA9IChNYXRoLmZsb29yKHJhbmQgKiAxMCkgJiAxKSA9PSAwICA/IG1zIC0gZGV2aWF0aW9uIDogbXMgKyBkZXZpYXRpb247XG4gIH1cbiAgcmV0dXJuIE1hdGgubWluKG1zLCB0aGlzLm1heCkgfCAwO1xufTtcblxuLyoqXG4gKiBSZXNldCB0aGUgbnVtYmVyIG9mIGF0dGVtcHRzLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQmFja29mZi5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpe1xuICB0aGlzLmF0dGVtcHRzID0gMDtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBtaW5pbXVtIGR1cmF0aW9uXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5CYWNrb2ZmLnByb3RvdHlwZS5zZXRNaW4gPSBmdW5jdGlvbihtaW4pe1xuICB0aGlzLm1zID0gbWluO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIG1heGltdW0gZHVyYXRpb25cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkJhY2tvZmYucHJvdG90eXBlLnNldE1heCA9IGZ1bmN0aW9uKG1heCl7XG4gIHRoaXMubWF4ID0gbWF4O1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGppdHRlclxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQmFja29mZi5wcm90b3R5cGUuc2V0Sml0dGVyID0gZnVuY3Rpb24oaml0dGVyKXtcbiAgdGhpcy5qaXR0ZXIgPSBqaXR0ZXI7XG59O1xuXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmFja28yL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA1NDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 541 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });exports.Room = exports.VideoView = exports.ChatView = exports.ExploreMaps = undefined;\n\nvar _ExploreMaps = __webpack_require__(542);var _ExploreMaps2 = _interopRequireDefault(_ExploreMaps);\nvar _ChatView = __webpack_require__(550);var _ChatView2 = _interopRequireDefault(_ChatView);\nvar _VideoView = __webpack_require__(558);var _VideoView2 = _interopRequireDefault(_VideoView);\nvar _Room = __webpack_require__(559);var _Room2 = _interopRequireDefault(_Room);\nvar _events = __webpack_require__(560);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}\n\nvar Views = {\n  init: function init(serverData) {\n    $(document).on(_events.JUNTO_UPDATED, function () {return _ExploreMaps2.default.render();});\n    _ChatView2.default.init([serverData['sounds/MM_sounds.mp3'], serverData['sounds/MM_sounds.ogg']]);\n  },\n  ExploreMaps: _ExploreMaps2.default,\n  ChatView: _ChatView2.default,\n  VideoView: _VideoView2.default,\n  Room: _Room2.default }; /* global $ */exports.\n\n\nExploreMaps = _ExploreMaps2.default;exports.ChatView = _ChatView2.default;exports.VideoView = _VideoView2.default;exports.Room = _Room2.default;exports.default =\nViews;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQxLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvVmlld3MvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsICQgKi9cblxuaW1wb3J0IEV4cGxvcmVNYXBzIGZyb20gJy4vRXhwbG9yZU1hcHMnXG5pbXBvcnQgQ2hhdFZpZXcgZnJvbSAnLi9DaGF0VmlldydcbmltcG9ydCBWaWRlb1ZpZXcgZnJvbSAnLi9WaWRlb1ZpZXcnXG5pbXBvcnQgUm9vbSBmcm9tICcuL1Jvb20nXG5pbXBvcnQgeyBKVU5UT19VUERBVEVEIH0gZnJvbSAnLi4vUmVhbHRpbWUvZXZlbnRzJ1xuXG5jb25zdCBWaWV3cyA9IHtcbiAgaW5pdDogKHNlcnZlckRhdGEpID0+IHtcbiAgICAkKGRvY3VtZW50KS5vbihKVU5UT19VUERBVEVELCAoKSA9PiBFeHBsb3JlTWFwcy5yZW5kZXIoKSlcbiAgICBDaGF0Vmlldy5pbml0KFtzZXJ2ZXJEYXRhWydzb3VuZHMvTU1fc291bmRzLm1wMyddLCBzZXJ2ZXJEYXRhWydzb3VuZHMvTU1fc291bmRzLm9nZyddXSlcbiAgfSxcbiAgRXhwbG9yZU1hcHMsXG4gIENoYXRWaWV3LFxuICBWaWRlb1ZpZXcsXG4gIFJvb21cbn1cblxuZXhwb3J0IHsgRXhwbG9yZU1hcHMsIENoYXRWaWV3LCBWaWRlb1ZpZXcsIFJvb20gfVxuZXhwb3J0IGRlZmF1bHQgVmlld3NcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBmcm9udGVuZC9zcmMvTWV0YW1hcHMvVmlld3MvaW5kZXguanMiXSwibWFwcGluZ3MiOiI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 542 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });\n\nvar _react = __webpack_require__(174);var _react2 = _interopRequireDefault(_react);\nvar _reactDom = __webpack_require__(205);var _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _DataModel = __webpack_require__(149);var _DataModel2 = _interopRequireDefault(_DataModel);\nvar _GlobalUI = __webpack_require__(362);var _GlobalUI2 = _interopRequireDefault(_GlobalUI);\nvar _Realtime = __webpack_require__(435);var _Realtime2 = _interopRequireDefault(_Realtime);\nvar _Loading = __webpack_require__(368);var _Loading2 = _interopRequireDefault(_Loading);\nvar _Maps = __webpack_require__(543);var _Maps2 = _interopRequireDefault(_Maps);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} // TODO ensure this isn't a double import\n/* global $ */\nvar ExploreMaps = {\n  pending: false,\n  mapper: null,\n  setCollection: function setCollection(collection) {\n    var self = ExploreMaps;\n\n    if (self.collection) {\n      self.collection.off('add', self.render);\n      self.collection.off('successOnFetch', self.handleSuccess);\n      self.collection.off('errorOnFetch', self.handleError);\n    }\n    self.collection = collection;\n    self.collection.on('add', self.render);\n    self.collection.on('successOnFetch', self.handleSuccess);\n    self.collection.on('errorOnFetch', self.handleError);\n  },\n  render: function render(cb) {\n    var self = ExploreMaps;\n\n    if (!self.collection) return;\n\n    var exploreObj = {\n      currentUser: _Active2.default.Mapper,\n      section: self.collection.id,\n      maps: self.collection,\n      juntoState: _Realtime2.default.juntoState,\n      moreToLoad: self.collection.page !== 'loadedAll',\n      user: self.collection.id === 'mapper' ? self.mapper : null,\n      loadMore: self.loadMore,\n      pending: self.pending,\n      onStar: function onStar(map) {\n        $.post('/maps/' + map.id + '/star');\n        map.set('star_count', map.get('star_count') + 1);\n        if (_DataModel2.default.Stars) _DataModel2.default.Stars.push({ user_id: _Active2.default.Mapper.id, map_id: map.id });\n        _DataModel2.default.Maps.Starred.add(map);\n        _GlobalUI2.default.notifyUser('Map is now starred');\n        self.render();\n      },\n      onRequest: function onRequest(map) {\n        $.post({\n          url: '/maps/' + map.id + '/access_request' });\n\n        _GlobalUI2.default.notifyUser('You will be notified by email if request accepted');\n      } };\n\n    _reactDom2.default.render(\n    _react2.default.createElement(_Maps2.default, exploreObj),\n    document.getElementById('explore')).\n    resize();\n\n    if (cb) cb();\n    _Loading2.default.hide();\n  },\n  loadMore: function loadMore() {\n    var self = ExploreMaps;\n    if (self.collection.page !== 'loadedAll') {\n      self.collection.getMaps();\n      self.pending = true;\n    }\n    self.render();\n  },\n  handleSuccess: function handleSuccess(cb) {\n    var self = ExploreMaps;\n    self.pending = false;\n    if (self.collection && self.collection.id === 'mapper') {\n      self.fetchUserThenRender(cb);\n    } else {\n      self.render(cb);\n      _Loading2.default.hide();\n    }\n  },\n  handleError: function handleError() {\n    console.log('error loading maps!'); // TODO\n    _Loading2.default.hide();\n  },\n  fetchUserThenRender: function fetchUserThenRender(cb) {\n    var self = ExploreMaps;\n\n    if (self.mapper && self.mapper.id === self.collection.mapperId) {\n      self.render(cb);\n      return _Loading2.default.hide();\n    }\n\n    // first load the mapper object and then call the render function\n    $.ajax({\n      url: '/users/' + self.collection.mapperId + '/details.json',\n      success: function success(response) {\n        self.mapper = response;\n        self.render(cb);\n        _Loading2.default.hide();\n      },\n      error: function error() {\n        self.render(cb);\n        _Loading2.default.hide();\n      } });\n\n  } };exports.default =\n\n\nExploreMaps;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQyLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvVmlld3MvRXhwbG9yZU1hcHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsICQgKi9cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbScgLy8gVE9ETyBlbnN1cmUgdGhpcyBpc24ndCBhIGRvdWJsZSBpbXBvcnRcblxuaW1wb3J0IEFjdGl2ZSBmcm9tICcuLi9BY3RpdmUnXG5pbXBvcnQgRGF0YU1vZGVsIGZyb20gJy4uL0RhdGFNb2RlbCdcbmltcG9ydCBHbG9iYWxVSSBmcm9tICcuLi9HbG9iYWxVSSdcbmltcG9ydCBSZWFsdGltZSBmcm9tICcuLi9SZWFsdGltZSdcbmltcG9ydCBMb2FkaW5nIGZyb20gJy4uL0xvYWRpbmcnXG5pbXBvcnQgTWFwcyBmcm9tICcuLi8uLi9jb21wb25lbnRzL01hcHMnXG5cbmNvbnN0IEV4cGxvcmVNYXBzID0ge1xuICBwZW5kaW5nOiBmYWxzZSxcbiAgbWFwcGVyOiBudWxsLFxuICBzZXRDb2xsZWN0aW9uOiBmdW5jdGlvbihjb2xsZWN0aW9uKSB7XG4gICAgdmFyIHNlbGYgPSBFeHBsb3JlTWFwc1xuXG4gICAgaWYgKHNlbGYuY29sbGVjdGlvbikge1xuICAgICAgc2VsZi5jb2xsZWN0aW9uLm9mZignYWRkJywgc2VsZi5yZW5kZXIpXG4gICAgICBzZWxmLmNvbGxlY3Rpb24ub2ZmKCdzdWNjZXNzT25GZXRjaCcsIHNlbGYuaGFuZGxlU3VjY2VzcylcbiAgICAgIHNlbGYuY29sbGVjdGlvbi5vZmYoJ2Vycm9yT25GZXRjaCcsIHNlbGYuaGFuZGxlRXJyb3IpXG4gICAgfVxuICAgIHNlbGYuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb25cbiAgICBzZWxmLmNvbGxlY3Rpb24ub24oJ2FkZCcsIHNlbGYucmVuZGVyKVxuICAgIHNlbGYuY29sbGVjdGlvbi5vbignc3VjY2Vzc09uRmV0Y2gnLCBzZWxmLmhhbmRsZVN1Y2Nlc3MpXG4gICAgc2VsZi5jb2xsZWN0aW9uLm9uKCdlcnJvck9uRmV0Y2gnLCBzZWxmLmhhbmRsZUVycm9yKVxuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uKGNiKSB7XG4gICAgdmFyIHNlbGYgPSBFeHBsb3JlTWFwc1xuXG4gICAgaWYgKCFzZWxmLmNvbGxlY3Rpb24pIHJldHVyblxuXG4gICAgdmFyIGV4cGxvcmVPYmogPSB7XG4gICAgICBjdXJyZW50VXNlcjogQWN0aXZlLk1hcHBlcixcbiAgICAgIHNlY3Rpb246IHNlbGYuY29sbGVjdGlvbi5pZCxcbiAgICAgIG1hcHM6IHNlbGYuY29sbGVjdGlvbixcbiAgICAgIGp1bnRvU3RhdGU6IFJlYWx0aW1lLmp1bnRvU3RhdGUsXG4gICAgICBtb3JlVG9Mb2FkOiBzZWxmLmNvbGxlY3Rpb24ucGFnZSAhPT0gJ2xvYWRlZEFsbCcsXG4gICAgICB1c2VyOiBzZWxmLmNvbGxlY3Rpb24uaWQgPT09ICdtYXBwZXInID8gc2VsZi5tYXBwZXIgOiBudWxsLFxuICAgICAgbG9hZE1vcmU6IHNlbGYubG9hZE1vcmUsXG4gICAgICBwZW5kaW5nOiBzZWxmLnBlbmRpbmcsXG4gICAgICBvblN0YXI6IGZ1bmN0aW9uKG1hcCkge1xuICAgICAgICAkLnBvc3QoJy9tYXBzLycgKyBtYXAuaWQgKyAnL3N0YXInKVxuICAgICAgICBtYXAuc2V0KCdzdGFyX2NvdW50JywgbWFwLmdldCgnc3Rhcl9jb3VudCcpICsgMSlcbiAgICAgICAgaWYgKERhdGFNb2RlbC5TdGFycykgRGF0YU1vZGVsLlN0YXJzLnB1c2goeyB1c2VyX2lkOiBBY3RpdmUuTWFwcGVyLmlkLCBtYXBfaWQ6IG1hcC5pZCB9KVxuICAgICAgICBEYXRhTW9kZWwuTWFwcy5TdGFycmVkLmFkZChtYXApXG4gICAgICAgIEdsb2JhbFVJLm5vdGlmeVVzZXIoJ01hcCBpcyBub3cgc3RhcnJlZCcpXG4gICAgICAgIHNlbGYucmVuZGVyKClcbiAgICAgIH0sXG4gICAgICBvblJlcXVlc3Q6IGZ1bmN0aW9uKG1hcCkge1xuICAgICAgICAkLnBvc3Qoe1xuICAgICAgICAgIHVybDogYC9tYXBzLyR7bWFwLmlkfS9hY2Nlc3NfcmVxdWVzdGBcbiAgICAgICAgfSlcbiAgICAgICAgR2xvYmFsVUkubm90aWZ5VXNlcignWW91IHdpbGwgYmUgbm90aWZpZWQgYnkgZW1haWwgaWYgcmVxdWVzdCBhY2NlcHRlZCcpXG4gICAgICB9XG4gICAgfVxuICAgIFJlYWN0RE9NLnJlbmRlcihcbiAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTWFwcywgZXhwbG9yZU9iaiksXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwbG9yZScpXG4gICAgKS5yZXNpemUoKVxuXG4gICAgaWYgKGNiKSBjYigpXG4gICAgTG9hZGluZy5oaWRlKClcbiAgfSxcbiAgbG9hZE1vcmU6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gRXhwbG9yZU1hcHNcbiAgICBpZiAoc2VsZi5jb2xsZWN0aW9uLnBhZ2UgIT09ICdsb2FkZWRBbGwnKSB7XG4gICAgICBzZWxmLmNvbGxlY3Rpb24uZ2V0TWFwcygpXG4gICAgICBzZWxmLnBlbmRpbmcgPSB0cnVlXG4gICAgfVxuICAgIHNlbGYucmVuZGVyKClcbiAgfSxcbiAgaGFuZGxlU3VjY2VzczogZnVuY3Rpb24oY2IpIHtcbiAgICB2YXIgc2VsZiA9IEV4cGxvcmVNYXBzXG4gICAgc2VsZi5wZW5kaW5nID0gZmFsc2VcbiAgICBpZiAoc2VsZi5jb2xsZWN0aW9uICYmIHNlbGYuY29sbGVjdGlvbi5pZCA9PT0gJ21hcHBlcicpIHtcbiAgICAgIHNlbGYuZmV0Y2hVc2VyVGhlblJlbmRlcihjYilcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5yZW5kZXIoY2IpXG4gICAgICBMb2FkaW5nLmhpZGUoKVxuICAgIH1cbiAgfSxcbiAgaGFuZGxlRXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgIGNvbnNvbGUubG9nKCdlcnJvciBsb2FkaW5nIG1hcHMhJykgLy8gVE9ET1xuICAgIExvYWRpbmcuaGlkZSgpXG4gIH0sXG4gIGZldGNoVXNlclRoZW5SZW5kZXI6IGZ1bmN0aW9uKGNiKSB7XG4gICAgdmFyIHNlbGYgPSBFeHBsb3JlTWFwc1xuXG4gICAgaWYgKHNlbGYubWFwcGVyICYmIHNlbGYubWFwcGVyLmlkID09PSBzZWxmLmNvbGxlY3Rpb24ubWFwcGVySWQpIHtcbiAgICAgIHNlbGYucmVuZGVyKGNiKVxuICAgICAgcmV0dXJuIExvYWRpbmcuaGlkZSgpXG4gICAgfVxuXG4gICAgLy8gZmlyc3QgbG9hZCB0aGUgbWFwcGVyIG9iamVjdCBhbmQgdGhlbiBjYWxsIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAkLmFqYXgoe1xuICAgICAgdXJsOiAnL3VzZXJzLycgKyBzZWxmLmNvbGxlY3Rpb24ubWFwcGVySWQgKyAnL2RldGFpbHMuanNvbicsXG4gICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICBzZWxmLm1hcHBlciA9IHJlc3BvbnNlXG4gICAgICAgIHNlbGYucmVuZGVyKGNiKVxuICAgICAgICBMb2FkaW5nLmhpZGUoKVxuICAgICAgfSxcbiAgICAgIGVycm9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5yZW5kZXIoY2IpXG4gICAgICAgIExvYWRpbmcuaGlkZSgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFeHBsb3JlTWFwc1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9WaWV3cy9FeHBsb3JlTWFwcy5qcyJdLCJtYXBwaW5ncyI6Ijs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFWQTtBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 543 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _throttle2 = __webpack_require__(544);var _throttle3 = _interopRequireDefault(_throttle2);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__(174);var _react2 = _interopRequireDefault(_react);\n\nvar _Header = __webpack_require__(547);var _Header2 = _interopRequireDefault(_Header);\nvar _MapperCard = __webpack_require__(548);var _MapperCard2 = _interopRequireDefault(_MapperCard);\nvar _MapCard = __webpack_require__(549);var _MapCard2 = _interopRequireDefault(_MapCard);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;}\n\n// 220 wide + 16 padding on both sides\nvar MAP_WIDTH = 252;\nvar MOBILE_VIEW_BREAKPOINT = 504;\nvar MOBILE_VIEW_PADDING = 40;\nvar MAX_COLUMNS = 4;var\n\nMaps = function (_Component) {_inherits(Maps, _Component);\n\n  function Maps(props) {_classCallCheck(this, Maps);var _this = _possibleConstructorReturn(this, (Maps.__proto__ || Object.getPrototypeOf(Maps)).call(this,\n    props));_this.\n\n\n\n\n\n\n\n\n\n\n\n\n\n    resize = function () {var _this$props =\n      _this.props,maps = _this$props.maps,user = _this$props.user,currentUser = _this$props.currentUser;\n      var numCards = maps.length + (user || currentUser ? 1 : 0);\n      var mapSpaces = Math.floor(document.body.clientWidth / MAP_WIDTH);\n      var mapsWidth = document.body.clientWidth <= MOBILE_VIEW_BREAKPOINT ?\n      document.body.clientWidth - MOBILE_VIEW_PADDING :\n      Math.min(MAX_COLUMNS, Math.min(numCards, mapSpaces)) * MAP_WIDTH;\n      _this.setState({ mapsWidth: mapsWidth });\n    };_this.\n\n    scroll = function () {var _this$props2 =\n      _this.props,loadMore = _this$props2.loadMore,moreToLoad = _this$props2.moreToLoad,pending = _this$props2.pending;var\n      maps = _this.refs.maps;\n      if (moreToLoad && !pending && maps.scrollTop + maps.offsetHeight > maps.scrollHeight - 300) {\n        loadMore();\n      }\n    };_this.\n\n    render = function () {var _this$props3 =\n      _this.props,maps = _this$props3.maps,currentUser = _this$props3.currentUser,juntoState = _this$props3.juntoState,pending = _this$props3.pending,section = _this$props3.section,user = _this$props3.user,onStar = _this$props3.onStar,onRequest = _this$props3.onRequest;\n      var style = { width: _this.state.mapsWidth + 'px' };\n      var mobile = document && document.body.clientWidth <= MOBILE_VIEW_BREAKPOINT;\n\n      return (\n        _react2.default.createElement('div', null,\n          _react2.default.createElement('div', { id: 'exploreMaps', ref: 'maps' },\n            _react2.default.createElement('div', { style: style },\n              user ? _react2.default.createElement(_MapperCard2.default, { user: user }) : null,\n              currentUser && !user && !(pending && maps.length === 0) ? _react2.default.createElement('div', { className: 'map newMap' }, _react2.default.createElement('a', { href: '/maps/new' }, _react2.default.createElement('div', { className: 'newMapImage' }), _react2.default.createElement('span', null, 'Create new map...'))) : null,\n              maps.models.map(function (map) {return _react2.default.createElement(_MapCard2.default, { key: map.id, map: map, mobile: mobile, juntoState: juntoState, currentUser: currentUser, onStar: onStar, onRequest: onRequest });}),\n              _react2.default.createElement('div', { className: 'clearfloat' }))),\n\n\n          _react2.default.createElement(_Header2.default, { signedIn: !!currentUser,\n            section: section,\n            user: user })));\n\n\n\n    };_this.state = { mapsWidth: 0 };return _this;}_createClass(Maps, [{ key: 'componentDidMount', value: function componentDidMount() {window && window.addEventListener('resize', this.resize);this.refs.maps.addEventListener('scroll', (0, _throttle3.default)(this.scroll, 500, { leading: true, trailing: false }));this.resize();} }, { key: 'componentWillUnmount', value: function componentWillUnmount() {window && window.removeEventListener('resize', this.resize);} }]);return Maps;}(_react.Component);\n\n\nMaps.propTypes = {\n  section: _react.PropTypes.string.isRequired,\n  maps: _react.PropTypes.object.isRequired,\n  juntoState: _react.PropTypes.object.isRequired,\n  moreToLoad: _react.PropTypes.bool.isRequired,\n  user: _react.PropTypes.object,\n  currentUser: _react.PropTypes.object,\n  loadMore: _react.PropTypes.func,\n  pending: _react.PropTypes.bool.isRequired,\n  onStar: _react.PropTypes.func.isRequired,\n  onRequest: _react.PropTypes.func.isRequired };exports.default =\n\n\nMaps;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQzLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvY29tcG9uZW50cy9NYXBzL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQsIFByb3BUeXBlcyB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdGhyb3R0bGUgfSBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgSGVhZGVyIGZyb20gJy4vSGVhZGVyJ1xuaW1wb3J0IE1hcHBlckNhcmQgZnJvbSAnLi9NYXBwZXJDYXJkJ1xuaW1wb3J0IE1hcENhcmQgZnJvbSAnLi9NYXBDYXJkJ1xuXG4vLyAyMjAgd2lkZSArIDE2IHBhZGRpbmcgb24gYm90aCBzaWRlc1xuY29uc3QgTUFQX1dJRFRIID0gMjUyXG5jb25zdCBNT0JJTEVfVklFV19CUkVBS1BPSU5UID0gNTA0XG5jb25zdCBNT0JJTEVfVklFV19QQURESU5HID0gNDBcbmNvbnN0IE1BWF9DT0xVTU5TID0gNFxuXG5jbGFzcyBNYXBzIGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuICAgIHRoaXMuc3RhdGUgPSB7IG1hcHNXaWR0aDogMCB9XG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB3aW5kb3cgJiYgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucmVzaXplKVxuICAgIHRoaXMucmVmcy5tYXBzLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRocm90dGxlKHRoaXMuc2Nyb2xsLCA1MDAsIHsgbGVhZGluZzogdHJ1ZSwgdHJhaWxpbmc6IGZhbHNlIH0pKVxuICAgIHRoaXMucmVzaXplKClcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHdpbmRvdyAmJiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5yZXNpemUpXG4gIH1cblxuICByZXNpemUgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBtYXBzLCB1c2VyLCBjdXJyZW50VXNlciB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IG51bUNhcmRzID0gbWFwcy5sZW5ndGggKyAodXNlciB8fCBjdXJyZW50VXNlciA/IDEgOiAwKVxuICAgIGNvbnN0IG1hcFNwYWNlcyA9IE1hdGguZmxvb3IoZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCAvIE1BUF9XSURUSClcbiAgICBjb25zdCBtYXBzV2lkdGggPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIDw9IE1PQklMRV9WSUVXX0JSRUFLUE9JTlRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCAtIE1PQklMRV9WSUVXX1BBRERJTkdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogTWF0aC5taW4oTUFYX0NPTFVNTlMsIE1hdGgubWluKG51bUNhcmRzLCBtYXBTcGFjZXMpKSAqIE1BUF9XSURUSFxuICAgIHRoaXMuc2V0U3RhdGUoeyBtYXBzV2lkdGggfSlcbiAgfVxuXG4gIHNjcm9sbCA9ICgpID0+IHtcbiAgICBjb25zdCB7IGxvYWRNb3JlLCBtb3JlVG9Mb2FkLCBwZW5kaW5nIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgeyBtYXBzIH0gPSB0aGlzLnJlZnNcbiAgICBpZiAobW9yZVRvTG9hZCAmJiAhcGVuZGluZyAmJiBtYXBzLnNjcm9sbFRvcCArIG1hcHMub2Zmc2V0SGVpZ2h0ID4gbWFwcy5zY3JvbGxIZWlnaHQgLSAzMDApIHtcbiAgICAgIGxvYWRNb3JlKClcbiAgICB9XG4gIH1cblxuICByZW5kZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBtYXBzLCBjdXJyZW50VXNlciwganVudG9TdGF0ZSwgcGVuZGluZywgc2VjdGlvbiwgdXNlciwgb25TdGFyLCBvblJlcXVlc3QgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCBzdHlsZSA9IHsgd2lkdGg6IHRoaXMuc3RhdGUubWFwc1dpZHRoICsgJ3B4JyB9XG4gICAgY29uc3QgbW9iaWxlID0gZG9jdW1lbnQgJiYgZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCA8PSBNT0JJTEVfVklFV19CUkVBS1BPSU5UXG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdj5cbiAgICAgICAgPGRpdiBpZD0nZXhwbG9yZU1hcHMnIHJlZj0nbWFwcyc+XG4gICAgICAgICAgPGRpdiBzdHlsZT17IHN0eWxlIH0+XG4gICAgICAgICAgICB7IHVzZXIgPyA8TWFwcGVyQ2FyZCB1c2VyPXsgdXNlciB9IC8+IDogbnVsbCB9XG4gICAgICAgICAgICB7IGN1cnJlbnRVc2VyICYmICF1c2VyICYmICEocGVuZGluZyAmJiBtYXBzLmxlbmd0aCA9PT0gMCkgPyA8ZGl2IGNsYXNzTmFtZT1cIm1hcCBuZXdNYXBcIj48YSBocmVmPVwiL21hcHMvbmV3XCI+PGRpdiBjbGFzc05hbWU9XCJuZXdNYXBJbWFnZVwiPjwvZGl2PjxzcGFuPkNyZWF0ZSBuZXcgbWFwLi4uPC9zcGFuPjwvYT48L2Rpdj4gOiBudWxsIH1cbiAgICAgICAgICAgIHsgbWFwcy5tb2RlbHMubWFwKG1hcCA9PiA8TWFwQ2FyZCBrZXk9eyBtYXAuaWQgfSBtYXA9eyBtYXAgfSBtb2JpbGU9eyBtb2JpbGUgfSBqdW50b1N0YXRlPXsganVudG9TdGF0ZSB9IGN1cnJlbnRVc2VyPXsgY3VycmVudFVzZXIgfSBvblN0YXI9eyBvblN0YXIgfSBvblJlcXVlc3Q9eyBvblJlcXVlc3QgfSAvPikgfVxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NsZWFyZmxvYXQnPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPEhlYWRlciBzaWduZWRJbj17ICEhY3VycmVudFVzZXIgfVxuICAgICAgICAgIHNlY3Rpb249eyBzZWN0aW9uIH1cbiAgICAgICAgICB1c2VyPXsgdXNlciB9XG4gICAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxufVxuXG5NYXBzLnByb3BUeXBlcyA9IHtcbiAgc2VjdGlvbjogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBtYXBzOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIGp1bnRvU3RhdGU6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgbW9yZVRvTG9hZDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgdXNlcjogUHJvcFR5cGVzLm9iamVjdCxcbiAgY3VycmVudFVzZXI6IFByb3BUeXBlcy5vYmplY3QsXG4gIGxvYWRNb3JlOiBQcm9wVHlwZXMuZnVuYyxcbiAgcGVuZGluZzogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgb25TdGFyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBvblJlcXVlc3Q6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbn1cblxuZXhwb3J0IGRlZmF1bHQgTWFwc1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9jb21wb25lbnRzL01hcHMvaW5kZXguanMiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 544 */
/***/ function(module, exports, __webpack_require__) {

    eval("var debounce = __webpack_require__(545),\n    isObject = __webpack_require__(18);\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n *  Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n  var leading = true,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  if (isObject(options)) {\n    leading = 'leading' in options ? !!options.leading : leading;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n  return debounce(func, wait, {\n    'leading': leading,\n    'maxWait': wait,\n    'trailing': trailing\n  });\n}\n\nmodule.exports = throttle;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvdGhyb3R0bGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRlYm91bmNlID0gcmVxdWlyZSgnLi9kZWJvdW5jZScpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xuXG4vKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKipcbiAqIENyZWF0ZXMgYSB0aHJvdHRsZWQgZnVuY3Rpb24gdGhhdCBvbmx5IGludm9rZXMgYGZ1bmNgIGF0IG1vc3Qgb25jZSBwZXJcbiAqIGV2ZXJ5IGB3YWl0YCBtaWxsaXNlY29uZHMuIFRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgXG4gKiBtZXRob2QgdG8gY2FuY2VsIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvXG4gKiBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS4gUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2BcbiAqIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZSBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGBcbiAqIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZCB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGVcbiAqIHRocm90dGxlZCBmdW5jdGlvbi4gU3Vic2VxdWVudCBjYWxscyB0byB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uIHJldHVybiB0aGVcbiAqIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgaW52b2NhdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIHRocm90dGxlZCBmdW5jdGlvblxuICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICpcbiAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICpcbiAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy50aHJvdHRsZWAgYW5kIGBfLmRlYm91bmNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHRocm90dGxlLlxuICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHRocm90dGxlIGludm9jYXRpb25zIHRvLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9dHJ1ZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHRocm90dGxlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQXZvaWQgZXhjZXNzaXZlbHkgdXBkYXRpbmcgdGhlIHBvc2l0aW9uIHdoaWxlIHNjcm9sbGluZy5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdzY3JvbGwnLCBfLnRocm90dGxlKHVwZGF0ZVBvc2l0aW9uLCAxMDApKTtcbiAqXG4gKiAvLyBJbnZva2UgYHJlbmV3VG9rZW5gIHdoZW4gdGhlIGNsaWNrIGV2ZW50IGlzIGZpcmVkLCBidXQgbm90IG1vcmUgdGhhbiBvbmNlIGV2ZXJ5IDUgbWludXRlcy5cbiAqIHZhciB0aHJvdHRsZWQgPSBfLnRocm90dGxlKHJlbmV3VG9rZW4sIDMwMDAwMCwgeyAndHJhaWxpbmcnOiBmYWxzZSB9KTtcbiAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCB0aHJvdHRsZWQpO1xuICpcbiAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgdGhyb3R0bGVkIGludm9jYXRpb24uXG4gKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCB0aHJvdHRsZWQuY2FuY2VsKTtcbiAqL1xuZnVuY3Rpb24gdGhyb3R0bGUoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICB2YXIgbGVhZGluZyA9IHRydWUsXG4gICAgICB0cmFpbGluZyA9IHRydWU7XG5cbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgbGVhZGluZyA9ICdsZWFkaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLmxlYWRpbmcgOiBsZWFkaW5nO1xuICAgIHRyYWlsaW5nID0gJ3RyYWlsaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7XG4gIH1cbiAgcmV0dXJuIGRlYm91bmNlKGZ1bmMsIHdhaXQsIHtcbiAgICAnbGVhZGluZyc6IGxlYWRpbmcsXG4gICAgJ21heFdhaXQnOiB3YWl0LFxuICAgICd0cmFpbGluZyc6IHRyYWlsaW5nXG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRocm90dGxlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC90aHJvdHRsZS5qc1xuLy8gbW9kdWxlIGlkID0gNTQ0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 545 */
/***/ function(module, exports, __webpack_require__) {

    eval("var isObject = __webpack_require__(18),\n    now = __webpack_require__(546),\n    toNumber = __webpack_require__(17);\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n    nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n *  Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n *  The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n *   'leading': true,\n *   'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n  var lastArgs,\n      lastThis,\n      maxWait,\n      result,\n      timerId,\n      lastCallTime,\n      lastInvokeTime = 0,\n      leading = false,\n      maxing = false,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  wait = toNumber(wait) || 0;\n  if (isObject(options)) {\n    leading = !!options.leading;\n    maxing = 'maxWait' in options;\n    maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n\n  function invokeFunc(time) {\n    var args = lastArgs,\n        thisArg = lastThis;\n\n    lastArgs = lastThis = undefined;\n    lastInvokeTime = time;\n    result = func.apply(thisArg, args);\n    return result;\n  }\n\n  function leadingEdge(time) {\n    // Reset any `maxWait` timer.\n    lastInvokeTime = time;\n    // Start the timer for the trailing edge.\n    timerId = setTimeout(timerExpired, wait);\n    // Invoke the leading edge.\n    return leading ? invokeFunc(time) : result;\n  }\n\n  function remainingWait(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime,\n        result = wait - timeSinceLastCall;\n\n    return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n  }\n\n  function shouldInvoke(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime;\n\n    // Either this is the first call, activity has stopped and we're at the\n    // trailing edge, the system time has gone backwards and we're treating\n    // it as the trailing edge, or we've hit the `maxWait` limit.\n    return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n      (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n  }\n\n  function timerExpired() {\n    var time = now();\n    if (shouldInvoke(time)) {\n      return trailingEdge(time);\n    }\n    // Restart the timer.\n    timerId = setTimeout(timerExpired, remainingWait(time));\n  }\n\n  function trailingEdge(time) {\n    timerId = undefined;\n\n    // Only invoke if we have `lastArgs` which means `func` has been\n    // debounced at least once.\n    if (trailing && lastArgs) {\n      return invokeFunc(time);\n    }\n    lastArgs = lastThis = undefined;\n    return result;\n  }\n\n  function cancel() {\n    if (timerId !== undefined) {\n      clearTimeout(timerId);\n    }\n    lastInvokeTime = 0;\n    lastArgs = lastCallTime = lastThis = timerId = undefined;\n  }\n\n  function flush() {\n    return timerId === undefined ? result : trailingEdge(now());\n  }\n\n  function debounced() {\n    var time = now(),\n        isInvoking = shouldInvoke(time);\n\n    lastArgs = arguments;\n    lastThis = this;\n    lastCallTime = time;\n\n    if (isInvoking) {\n      if (timerId === undefined) {\n        return leadingEdge(lastCallTime);\n      }\n      if (maxing) {\n        // Handle invocations in a tight loop.\n        timerId = setTimeout(timerExpired, wait);\n        return invokeFunc(lastCallTime);\n      }\n    }\n    if (timerId === undefined) {\n      timerId = setTimeout(timerExpired, wait);\n    }\n    return result;\n  }\n  debounced.cancel = cancel;\n  debounced.flush = flush;\n  return debounced;\n}\n\nmodule.exports = debounce;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvZGVib3VuY2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIG5vdyA9IHJlcXVpcmUoJy4vbm93JyksXG4gICAgdG9OdW1iZXIgPSByZXF1aXJlKCcuL3RvTnVtYmVyJyk7XG5cbi8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcbiAqIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHdhc1xuICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG4gKiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYCBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGVcbiAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcbiAqIGNhbGxzIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgXG4gKiBpbnZvY2F0aW9uLlxuICpcbiAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gKlxuICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gKlxuICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3Jlc2l6ZScsIF8uZGVib3VuY2UoY2FsY3VsYXRlTGF5b3V0LCAxNTApKTtcbiAqXG4gKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cbiAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmRlYm91bmNlKHNlbmRNYWlsLCAzMDAsIHtcbiAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICogICAndHJhaWxpbmcnOiBmYWxzZVxuICogfSkpO1xuICpcbiAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG4gKiB2YXIgZGVib3VuY2VkID0gXy5kZWJvdW5jZShiYXRjaExvZywgMjUwLCB7ICdtYXhXYWl0JzogMTAwMCB9KTtcbiAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxhc3RBcmdzLFxuICAgICAgbGFzdFRoaXMsXG4gICAgICBtYXhXYWl0LFxuICAgICAgcmVzdWx0LFxuICAgICAgdGltZXJJZCxcbiAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcbiAgICAgIGxlYWRpbmcgPSBmYWxzZSxcbiAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHdhaXQgPSB0b051bWJlcih3YWl0KSB8fCAwO1xuICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG4gICAgbWF4aW5nID0gJ21heFdhaXQnIGluIG9wdGlvbnM7XG4gICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcbiAgICAgICAgdGhpc0FyZyA9IGxhc3RUaGlzO1xuXG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gbGVhZGluZ0VkZ2UodGltZSkge1xuICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIC8vIFN0YXJ0IHRoZSB0aW1lciBmb3IgdGhlIHRyYWlsaW5nIGVkZ2UuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cbiAgICByZXR1cm4gbGVhZGluZyA/IGludm9rZUZ1bmModGltZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICByZXN1bHQgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICByZXR1cm4gbWF4aW5nID8gbmF0aXZlTWluKHJlc3VsdCwgbWF4V2FpdCAtIHRpbWVTaW5jZUxhc3RJbnZva2UpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lO1xuXG4gICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwsIGFjdGl2aXR5IGhhcyBzdG9wcGVkIGFuZCB3ZSdyZSBhdCB0aGVcbiAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgIC8vIGl0IGFzIHRoZSB0cmFpbGluZyBlZGdlLCBvciB3ZSd2ZSBoaXQgdGhlIGBtYXhXYWl0YCBsaW1pdC5cbiAgICByZXR1cm4gKGxhc3RDYWxsVGltZSA9PT0gdW5kZWZpbmVkIHx8ICh0aW1lU2luY2VMYXN0Q2FsbCA+PSB3YWl0KSB8fFxuICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHtcbiAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7XG4gICAgfVxuICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkge1xuICAgIHRpbWVySWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgLy8gZGVib3VuY2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7XG4gICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICB9XG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICB9XG4gICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3coKSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKSxcbiAgICAgICAgaXNJbnZva2luZyA9IHNob3VsZEludm9rZSh0aW1lKTtcblxuICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lO1xuXG4gICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgICBpZiAobWF4aW5nKSB7XG4gICAgICAgIC8vIEhhbmRsZSBpbnZvY2F0aW9ucyBpbiBhIHRpZ2h0IGxvb3AuXG4gICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgIHJldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcbiAgZGVib3VuY2VkLmZsdXNoID0gZmx1c2g7XG4gIHJldHVybiBkZWJvdW5jZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGVib3VuY2U7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL2RlYm91bmNlLmpzXG4vLyBtb2R1bGUgaWQgPSA1NDVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 546 */
/***/ function(module, exports, __webpack_require__) {

    eval("var root = __webpack_require__(22);\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n *   console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n  return root.Date.now();\n};\n\nmodule.exports = now;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvbm93LmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKipcbiAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IERhdGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICogfSwgXy5ub3coKSk7XG4gKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuICovXG52YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiByb290LkRhdGUubm93KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5vdztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvbm93LmpzXG4vLyBtb2R1bGUgaWQgPSA1NDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 547 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _omit2 = __webpack_require__(371);var _omit3 = _interopRequireDefault(_omit2);var _extends = Object.assign || function (target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i];for (var key in source) {if (Object.prototype.hasOwnProperty.call(source, key)) {target[key] = source[key];}}}return target;};var _react = __webpack_require__(174);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;}\n\n\nvar MapLink = function MapLink(props) {var\n  show = props.show,text = props.text,href = props.href,linkClass = props.linkClass;\n  var otherProps = (0, _omit3.default)(props, ['show', 'text', 'href', 'linkClass']);\n  if (!show) {\n    return null;\n  }\n\n  return (\n    _react2.default.createElement('a', _extends({}, otherProps, { href: href, className: linkClass }),\n      _react2.default.createElement('div', { className: 'exploreMapsIcon' }),\n      text));\n\n\n};var\n\nHeader = function (_Component) {_inherits(Header, _Component);function Header() {var _ref;var _temp, _this, _ret;_classCallCheck(this, Header);for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {args[_key] = arguments[_key];}return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Header.__proto__ || Object.getPrototypeOf(Header)).call.apply(_ref, [this].concat(args))), _this), _this.\n    render = function () {var _this$props =\n      _this.props,signedIn = _this$props.signedIn,section = _this$props.section;\n\n      var activeClass = function activeClass(title) {\n        var forClass = 'exploreMapsButton';\n        forClass += ' ' + title + 'Maps';\n        if (title === 'my' && section === 'mine' ||\n        title === section) forClass += ' active';\n        return forClass;\n      };\n\n      var explore = section === 'mine' || section === 'active' || section === 'starred' || section === 'shared' || section === 'featured';\n      var mapper = section === 'mapper';\n\n      return (\n        _react2.default.createElement('div', { id: 'exploreMapsHeader' },\n          _react2.default.createElement('div', { className: 'exploreMapsBar exploreElement' },\n            _react2.default.createElement('div', { className: 'exploreMapsMenu' },\n              _react2.default.createElement('div', { className: 'exploreMapsCenter' },\n                _react2.default.createElement(MapLink, { show: explore,\n                  href: signedIn ? '/' : '/explore/active',\n                  linkClass: activeClass('active'),\n                  'data-router': 'true',\n                  text: 'All Maps' }),\n\n                _react2.default.createElement(MapLink, { show: signedIn && explore,\n                  href: '/explore/mine',\n                  linkClass: activeClass('my'),\n                  'data-router': 'true',\n                  text: 'My Maps' }),\n\n                _react2.default.createElement(MapLink, { show: signedIn && explore,\n                  href: '/explore/shared',\n                  linkClass: activeClass('shared'),\n                  'data-router': 'true',\n                  text: 'Shared With Me' }),\n\n                _react2.default.createElement(MapLink, { show: signedIn && explore,\n                  href: '/explore/starred',\n                  linkClass: activeClass('starred'),\n                  'data-router': 'true',\n                  text: 'Starred By Me' }),\n\n                _react2.default.createElement(MapLink, { show: !signedIn && explore,\n                  href: '/explore/featured',\n                  linkClass: activeClass('featured'),\n                  'data-router': 'true',\n                  text: 'Featured Maps' }),\n\n\n                mapper ?\n                _react2.default.createElement('div', { className: 'exploreMapsButton active mapperButton' },\n                  _react2.default.createElement('img', { className: 'exploreMapperImage', width: '24', height: '24', src: _this.props.user.image }),\n                  _react2.default.createElement('div', { className: 'exploreMapperName' }, _this.props.user.name, '’s Maps'),\n                  _react2.default.createElement('div', { className: 'clearfloat' })) :\n\n                null)))));\n\n\n\n\n\n    }, _temp), _possibleConstructorReturn(_this, _ret);}return Header;}(_react.Component);\n\n\nHeader.propTypes = {\n  signedIn: _react.PropTypes.bool.isRequired,\n  section: _react.PropTypes.string.isRequired,\n  user: _react.PropTypes.object };exports.default =\n\n\nHeader;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ3LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvY29tcG9uZW50cy9NYXBzL0hlYWRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50LCBQcm9wVHlwZXMgfSBmcm9tICdyZWFjdCdcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCdcblxuY29uc3QgTWFwTGluayA9IHByb3BzID0+IHtcbiAgY29uc3QgeyBzaG93LCB0ZXh0LCBocmVmLCBsaW5rQ2xhc3MgfSA9IHByb3BzXG4gIGNvbnN0IG90aGVyUHJvcHMgPSBfLm9taXQocHJvcHMsIFsnc2hvdycsICd0ZXh0JywgJ2hyZWYnLCAnbGlua0NsYXNzJ10pXG4gIGlmICghc2hvdykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxhIHsgLi4ub3RoZXJQcm9wcyB9IGhyZWY9e2hyZWZ9IGNsYXNzTmFtZT17bGlua0NsYXNzfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZXhwbG9yZU1hcHNJY29uXCI+PC9kaXY+XG4gICAgICB7dGV4dH1cbiAgICA8L2E+XG4gIClcbn1cblxuY2xhc3MgSGVhZGVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgcmVuZGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgc2lnbmVkSW4sIHNlY3Rpb24gfSA9IHRoaXMucHJvcHNcblxuICAgIGNvbnN0IGFjdGl2ZUNsYXNzID0gKHRpdGxlKSA9PiB7XG4gICAgICBsZXQgZm9yQ2xhc3MgPSAnZXhwbG9yZU1hcHNCdXR0b24nXG4gICAgICBmb3JDbGFzcyArPSAnICcgKyB0aXRsZSArICdNYXBzJ1xuICAgICAgaWYgKHRpdGxlID09PSAnbXknICYmIHNlY3Rpb24gPT09ICdtaW5lJyB8fFxuICAgICAgICAgIHRpdGxlID09PSBzZWN0aW9uKSBmb3JDbGFzcyArPSAnIGFjdGl2ZSdcbiAgICAgIHJldHVybiBmb3JDbGFzc1xuICAgIH1cblxuICAgIGNvbnN0IGV4cGxvcmUgPSBzZWN0aW9uID09PSAnbWluZScgfHwgc2VjdGlvbiA9PT0gJ2FjdGl2ZScgfHwgc2VjdGlvbiA9PT0gJ3N0YXJyZWQnIHx8IHNlY3Rpb24gPT09ICdzaGFyZWQnIHx8IHNlY3Rpb24gPT09ICdmZWF0dXJlZCdcbiAgICBjb25zdCBtYXBwZXIgPSBzZWN0aW9uID09PSAnbWFwcGVyJ1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgaWQ9XCJleHBsb3JlTWFwc0hlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImV4cGxvcmVNYXBzQmFyIGV4cGxvcmVFbGVtZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJleHBsb3JlTWFwc01lbnVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZXhwbG9yZU1hcHNDZW50ZXJcIj5cbiAgICAgICAgICAgICAgPE1hcExpbmsgc2hvdz17ZXhwbG9yZX1cbiAgICAgICAgICAgICAgICBocmVmPXtzaWduZWRJbiA/ICcvJyA6ICcvZXhwbG9yZS9hY3RpdmUnfVxuICAgICAgICAgICAgICAgIGxpbmtDbGFzcz17YWN0aXZlQ2xhc3MoJ2FjdGl2ZScpfVxuICAgICAgICAgICAgICAgIGRhdGEtcm91dGVyPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgdGV4dD1cIkFsbCBNYXBzXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPE1hcExpbmsgc2hvdz17c2lnbmVkSW4gJiYgZXhwbG9yZX1cbiAgICAgICAgICAgICAgICBocmVmPVwiL2V4cGxvcmUvbWluZVwiXG4gICAgICAgICAgICAgICAgbGlua0NsYXNzPXthY3RpdmVDbGFzcygnbXknKX1cbiAgICAgICAgICAgICAgICBkYXRhLXJvdXRlcj1cInRydWVcIlxuICAgICAgICAgICAgICAgIHRleHQ9XCJNeSBNYXBzXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPE1hcExpbmsgc2hvdz17c2lnbmVkSW4gJiYgZXhwbG9yZX1cbiAgICAgICAgICAgICAgICBocmVmPVwiL2V4cGxvcmUvc2hhcmVkXCJcbiAgICAgICAgICAgICAgICBsaW5rQ2xhc3M9e2FjdGl2ZUNsYXNzKCdzaGFyZWQnKX1cbiAgICAgICAgICAgICAgICBkYXRhLXJvdXRlcj1cInRydWVcIlxuICAgICAgICAgICAgICAgIHRleHQ9XCJTaGFyZWQgV2l0aCBNZVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxNYXBMaW5rIHNob3c9e3NpZ25lZEluICYmIGV4cGxvcmV9XG4gICAgICAgICAgICAgICAgaHJlZj1cIi9leHBsb3JlL3N0YXJyZWRcIlxuICAgICAgICAgICAgICAgIGxpbmtDbGFzcz17YWN0aXZlQ2xhc3MoJ3N0YXJyZWQnKX1cbiAgICAgICAgICAgICAgICBkYXRhLXJvdXRlcj1cInRydWVcIlxuICAgICAgICAgICAgICAgIHRleHQ9XCJTdGFycmVkIEJ5IE1lXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPE1hcExpbmsgc2hvdz17IXNpZ25lZEluICYmIGV4cGxvcmV9XG4gICAgICAgICAgICAgICAgaHJlZj1cIi9leHBsb3JlL2ZlYXR1cmVkXCJcbiAgICAgICAgICAgICAgICBsaW5rQ2xhc3M9e2FjdGl2ZUNsYXNzKCdmZWF0dXJlZCcpfVxuICAgICAgICAgICAgICAgIGRhdGEtcm91dGVyPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgdGV4dD1cIkZlYXR1cmVkIE1hcHNcIlxuICAgICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICAgIHttYXBwZXIgPyAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2V4cGxvcmVNYXBzQnV0dG9uIGFjdGl2ZSBtYXBwZXJCdXR0b24nPlxuICAgICAgICAgICAgICAgICAgPGltZyBjbGFzc05hbWU9J2V4cGxvcmVNYXBwZXJJbWFnZScgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyBzcmM9e3RoaXMucHJvcHMudXNlci5pbWFnZX0gLz5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdleHBsb3JlTWFwcGVyTmFtZSc+e3RoaXMucHJvcHMudXNlci5uYW1lfSZyc3F1bztzIE1hcHM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjbGVhcmZsb2F0Jz48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKSA6IG51bGwgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG59XG5cbkhlYWRlci5wcm9wVHlwZXMgPSB7XG4gIHNpZ25lZEluOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICBzZWN0aW9uOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIHVzZXI6IFByb3BUeXBlcy5vYmplY3Rcbn1cblxuZXhwb3J0IGRlZmF1bHQgSGVhZGVyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvTWFwcy9IZWFkZXIuanMiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 548 */
/***/ function(module, exports, __webpack_require__) {

    eval("\"use strict\";Object.defineProperty(exports, \"__esModule\", { value: true });var _react = __webpack_require__(174);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\n\nMapperCard = function (_Component) {_inherits(MapperCard, _Component);function MapperCard() {var _ref;var _temp, _this, _ret;_classCallCheck(this, MapperCard);for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {args[_key] = arguments[_key];}return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = MapperCard.__proto__ || Object.getPrototypeOf(MapperCard)).call.apply(_ref, [this].concat(args))), _this), _this.\n    render = function () {var\n      user = _this.props.user;\n\n      return (\n        _react2.default.createElement(\"div\", { className: \"mapper\" },\n          _react2.default.createElement(\"div\", { className: \"mapperCard\" },\n            _react2.default.createElement(\"div\", { className: \"mapperImage\" },\n              _react2.default.createElement(\"img\", { src: user.image, width: \"96\", height: \"96\" })),\n\n            _react2.default.createElement(\"div\", { className: \"mapperName\", title: user.name },\n              user.name),\n\n            _react2.default.createElement(\"div\", { className: \"mapperInfo\" },\n              _react2.default.createElement(\"div\", { className: \"mapperCreatedAt\" }, \"Mapper since: \", user.created_at),\n              _react2.default.createElement(\"div\", { className: \"mapperGeneration\" }, \"Generation: \", user.generation)),\n\n            _react2.default.createElement(\"div\", { className: \"mapperMetadata\" },\n              _react2.default.createElement(\"div\", { className: \"metadataSection metadataMaps\" }, _react2.default.createElement(\"div\", null, user.numMaps), \"maps\"),\n              _react2.default.createElement(\"div\", { className: \"metadataSection metadataTopics\" }, _react2.default.createElement(\"div\", null, user.numTopics), \"topics\"),\n              _react2.default.createElement(\"div\", { className: \"metadataSection metadataSynapses\" }, _react2.default.createElement(\"div\", null, user.numSynapses), \"synapses\"),\n              _react2.default.createElement(\"div\", { className: \"clearfloat\" })))));\n\n\n\n\n    }, _temp), _possibleConstructorReturn(_this, _ret);}return MapperCard;}(_react.Component);\n\n\nMapperCard.propTypes = {\n  user: _react.PropTypes.object.isRequired };exports.default =\n\n\nMapperCard;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ4LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvY29tcG9uZW50cy9NYXBzL01hcHBlckNhcmQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCwgUHJvcFR5cGVzIH0gZnJvbSAncmVhY3QnXG5cbmNsYXNzIE1hcHBlckNhcmQgZXh0ZW5kcyBDb21wb25lbnQge1xuICByZW5kZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgeyB1c2VyIH0gPSB0aGlzLnByb3BzXG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYXBwZXJDYXJkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYXBwZXJJbWFnZVwiPlxuICAgICAgICAgICAgPGltZyBzcmM9eyB1c2VyLmltYWdlIH0gd2lkdGg9XCI5NlwiIGhlaWdodD1cIjk2XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1hcHBlck5hbWVcIiB0aXRsZT17IHVzZXIubmFtZSB9PlxuICAgICAgICAgICAgeyB1c2VyLm5hbWUgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWFwcGVySW5mb1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYXBwZXJDcmVhdGVkQXRcIj5NYXBwZXIgc2luY2U6IHsgdXNlci5jcmVhdGVkX2F0IH08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWFwcGVyR2VuZXJhdGlvblwiPkdlbmVyYXRpb246IHsgdXNlci5nZW5lcmF0aW9uIH08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1hcHBlck1ldGFkYXRhXCI+XG4gICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXRhZGF0YVNlY3Rpb24gbWV0YWRhdGFNYXBzXCI+PGRpdj57IHVzZXIubnVtTWFwcyB9PC9kaXY+bWFwczwvZGl2PlxuICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWV0YWRhdGFTZWN0aW9uIG1ldGFkYXRhVG9waWNzXCI+PGRpdj57IHVzZXIubnVtVG9waWNzIH08L2Rpdj50b3BpY3M8L2Rpdj5cbiAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1ldGFkYXRhU2VjdGlvbiBtZXRhZGF0YVN5bmFwc2VzXCI+PGRpdj57IHVzZXIubnVtU3luYXBzZXMgfTwvZGl2PnN5bmFwc2VzPC9kaXY+XG4gICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjbGVhcmZsb2F0XCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG59XG5cbk1hcHBlckNhcmQucHJvcFR5cGVzID0ge1xuICB1c2VyOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWRcbn1cblxuZXhwb3J0IGRlZmF1bHQgTWFwcGVyQ2FyZFxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9jb21wb25lbnRzL01hcHMvTWFwcGVyQ2FyZC5qcyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 549 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _values2 = __webpack_require__(151);var _values3 = _interopRequireDefault(_values2);var _find2 = __webpack_require__(28);var _find3 = _interopRequireDefault(_find2);var _react = __webpack_require__(174);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;}\n\n\nvar IN_CONVERSATION = 1; // shared with /realtime/reducer.js\n\nvar MapperList = function MapperList(props) {\n  return _react2.default.createElement('ul', { className: 'mapperList' },\n    _react2.default.createElement('li', { className: 'live' }, 'LIVE'),\n    props.mappers.map(function (mapper) {return _react2.default.createElement('li', { key: mapper.id }, _react2.default.createElement('img', { src: mapper.avatar }), _react2.default.createElement('span', null, mapper.username));}));\n\n};var\n\nMenu = function (_Component) {_inherits(Menu, _Component);\n\n  function Menu(props) {_classCallCheck(this, Menu);var _this = _possibleConstructorReturn(this, (Menu.__proto__ || Object.getPrototypeOf(Menu)).call(this,\n    props));_this.\n\n\n\n    toggle = function () {\n      _this.setState({ open: !_this.state.open });\n      return true;\n    };_this.\n\n    render = function () {var _this$props =\n      _this.props,currentUser = _this$props.currentUser,map = _this$props.map,onStar = _this$props.onStar,onRequest = _this$props.onRequest;\n      var style = { display: _this.state.open ? 'block' : 'none' };\n\n      return _react2.default.createElement('div', { className: 'dropdownMenu' },\n        _react2.default.createElement('div', { className: 'menuToggle', onClick: _this.toggle },\n          _react2.default.createElement('div', { className: 'circle' }),\n          _react2.default.createElement('div', { className: 'circle' }),\n          _react2.default.createElement('div', { className: 'circle' })),\n\n        _react2.default.createElement('ul', { className: 'menuItems', style: style },\n          _react2.default.createElement('li', { className: 'star', onClick: function onClick() {_this.toggle() && onStar(map);} }, 'Star Map'),\n          !map.authorizeToEdit(currentUser) && _react2.default.createElement('li', { className: 'request', onClick: function onClick() {_this.toggle() && onRequest(map);} }, 'Request Access')));\n\n\n    };_this.state = { open: false };return _this;}return Menu;}(_react.Component);\n\nMenu.propTypes = {\n  currentUser: _react.PropTypes.object.isRequired,\n  map: _react.PropTypes.object.isRequired,\n  onStar: _react.PropTypes.func.isRequired,\n  onRequest: _react.PropTypes.func.isRequired };\n\n\nvar Metadata = function Metadata(props) {var\n  map = props.map;\n  return _react2.default.createElement('div', null,\n    _react2.default.createElement('div', { className: 'metadataSection numTopics' },\n      _react2.default.createElement('div', { className: 'numTopicsIcon' }),\n      map.get('topic_count'), _react2.default.createElement('br', null),\n      map.get('topic_count') === 1 ? 'topic' : 'topics'),\n\n    _react2.default.createElement('div', { className: 'metadataSection numStars' },\n      _react2.default.createElement('div', { className: 'numStarsIcon' }),\n      map.get('star_count'), _react2.default.createElement('br', null),\n      map.get('star_count') === 1 ? 'star' : 'stars'),\n\n    _react2.default.createElement('div', { className: 'metadataSection numSynapses' },\n      _react2.default.createElement('div', { className: 'numSynapsesIcon' }),\n      map.get('synapse_count'), _react2.default.createElement('br', null),\n      map.get('synapse_count') === 1 ? 'synapse' : 'synapses'),\n\n    _react2.default.createElement('div', { className: 'metadataSection numContributors' },\n      _react2.default.createElement('div', { className: 'numContributorsIcon' }),\n      map.get('contributor_count'), _react2.default.createElement('br', null),\n      map.get('contributor_count') === 1 ? 'contributor' : 'contributors'),\n\n    _react2.default.createElement('div', { className: 'clearfloat' }));\n\n};\n\nvar checkAndWrapInA = function checkAndWrapInA(shouldWrap, classString, mapId, element) {\n  if (shouldWrap) return _react2.default.createElement('a', { className: classString, href: '/maps/' + mapId, 'data-router': 'true' }, element);else\n  return element;\n};var\n\nMapCard = function (_Component2) {_inherits(MapCard, _Component2);function MapCard() {var _ref;var _temp, _this2, _ret;_classCallCheck(this, MapCard);for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {args[_key] = arguments[_key];}return _ret = (_temp = (_this2 = _possibleConstructorReturn(this, (_ref = MapCard.__proto__ || Object.getPrototypeOf(MapCard)).call.apply(_ref, [this].concat(args))), _this2), _this2.\n    render = function () {var _this2$props =\n      _this2.props,map = _this2$props.map,mobile = _this2$props.mobile,juntoState = _this2$props.juntoState,currentUser = _this2$props.currentUser,onRequest = _this2$props.onRequest,onStar = _this2$props.onStar;\n\n      var hasMap = juntoState.liveMaps[map.id];\n      var hasConversation = hasMap && (0, _find3.default)((0, _values3.default)(hasMap), function (v) {return v === IN_CONVERSATION;});\n      var hasMapper = hasMap && !hasConversation;\n      var mapperList = hasMap && Object.keys(hasMap).map(function (id) {return juntoState.connectedPeople[id];});\n\n      var n = map.get('name');\n      var d = map.get('desc');\n\n      var maxNameLength = 32;\n      var maxDescLength = 180;\n      var truncatedName = n ? n.length > maxNameLength ? n.substring(0, maxNameLength) + '...' : n : '';\n      var truncatedDesc = d ? d.length > maxDescLength ? d.substring(0, maxDescLength) + '...' : d : '';\n      var editPermission = map.authorizeToEdit(currentUser) ? 'canEdit' : 'cannotEdit';\n\n      return (\n        _react2.default.createElement('div', { className: 'map', id: map.id },\n          checkAndWrapInA(mobile, '', map.id,\n          _react2.default.createElement('div', { className: 'permission ' + editPermission },\n            _react2.default.createElement('div', { className: 'mapCard' },\n              _react2.default.createElement('div', { className: 'mainContent' },\n                !mobile && _react2.default.createElement('div', { className: 'mapScreenshot' },\n                  _react2.default.createElement('img', { src: map.get('screenshot_url') })),\n\n                _react2.default.createElement('div', { className: 'title', title: map.get('name') },\n                  _react2.default.createElement('div', { className: 'innerTitle' }, truncatedName)),\n\n                mobile && hasMapper && _react2.default.createElement('div', { className: 'mobileHasMapper' }, _react2.default.createElement(MapperList, { mappers: mapperList })),\n                mobile && hasConversation && _react2.default.createElement('div', { className: 'mobileHasConversation' }, _react2.default.createElement(MapperList, { mappers: mapperList })),\n                mobile && d && _react2.default.createElement('div', { className: 'desc' }, d),\n                mobile && _react2.default.createElement('div', { className: 'mobileMetadata' }, _react2.default.createElement(Metadata, { map: map })),\n                _react2.default.createElement('div', { className: 'creatorAndPerm ' + (map.authorizeToEdit(currentUser) ? '' : 'cardHasViewOnly') },\n                  _react2.default.createElement('img', { className: 'creatorImage', src: map.get('user_image') }),\n                  _react2.default.createElement('span', { className: 'creatorName' }, map.get('user_name')),\n                  !map.authorizeToEdit(currentUser) && _react2.default.createElement('div', { className: 'cardViewOnly' }, 'View Only'))),\n\n\n              !mobile && checkAndWrapInA(true, 'mapMetadata', map.id,\n              _react2.default.createElement('div', null,\n                _react2.default.createElement(Metadata, { map: map }),\n                _react2.default.createElement('div', { className: 'scroll' },\n                  _react2.default.createElement('div', { className: 'desc' },\n                    truncatedDesc,\n                    _react2.default.createElement('div', { className: 'clearfloat' }))))),\n\n\n\n              !mobile && hasMapper && _react2.default.createElement('div', { className: 'mapHasMapper' }, _react2.default.createElement(MapperList, { mappers: mapperList })),\n              !mobile && hasConversation && _react2.default.createElement('div', { className: 'mapHasConversation' }, _react2.default.createElement(MapperList, { mappers: mapperList })),\n              !mobile && currentUser && _react2.default.createElement(Menu, { currentUser: currentUser, map: map, onStar: onStar, onRequest: onRequest }))))));\n\n\n\n\n    }, _temp), _possibleConstructorReturn(_this2, _ret);}return MapCard;}(_react.Component);\n\n\nMapCard.propTypes = {\n  map: _react.PropTypes.object.isRequired,\n  mobile: _react.PropTypes.bool.isRequired,\n  juntoState: _react.PropTypes.object,\n  currentUser: _react.PropTypes.object,\n  onStar: _react.PropTypes.func.isRequired,\n  onRequest: _react.PropTypes.func.isRequired };exports.default =\n\n\nMapCard;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ5LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvY29tcG9uZW50cy9NYXBzL01hcENhcmQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCwgUHJvcFR5cGVzIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBmaW5kLCB2YWx1ZXMgfSBmcm9tICdsb2Rhc2gnXG5cbmNvbnN0IElOX0NPTlZFUlNBVElPTiA9IDEgLy8gc2hhcmVkIHdpdGggL3JlYWx0aW1lL3JlZHVjZXIuanNcblxuY29uc3QgTWFwcGVyTGlzdCA9IChwcm9wcykgPT4ge1xuICByZXR1cm4gPHVsIGNsYXNzTmFtZT0nbWFwcGVyTGlzdCc+XG4gICAgPGxpIGNsYXNzTmFtZT0nbGl2ZSc+TElWRTwvbGk+XG4gICAgeyBwcm9wcy5tYXBwZXJzLm1hcChtYXBwZXIgPT4gPGxpIGtleT17IG1hcHBlci5pZCB9ID48aW1nIHNyYz17IG1hcHBlci5hdmF0YXIgfSAvPjxzcGFuPnsgbWFwcGVyLnVzZXJuYW1lIH08L3NwYW4+PC9saT4pIH1cbiAgPC91bD5cbn1cblxuY2xhc3MgTWVudSBleHRlbmRzIENvbXBvbmVudCB7XG5cbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcbiAgICB0aGlzLnN0YXRlID0geyBvcGVuOiBmYWxzZSB9XG4gIH1cblxuICB0b2dnbGUgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW46ICF0aGlzLnN0YXRlLm9wZW4gfSlcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcmVuZGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgY3VycmVudFVzZXIsIG1hcCwgb25TdGFyLCBvblJlcXVlc3QgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCBzdHlsZSA9IHsgZGlzcGxheTogdGhpcy5zdGF0ZS5vcGVuID8gJ2Jsb2NrJyA6ICdub25lJyB9XG5cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9J2Ryb3Bkb3duTWVudSc+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT0nbWVudVRvZ2dsZScgb25DbGljaz17IHRoaXMudG9nZ2xlIH0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjaXJjbGUnPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY2lyY2xlJz48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NpcmNsZSc+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDx1bCBjbGFzc05hbWU9J21lbnVJdGVtcycgc3R5bGU9eyBzdHlsZSB9PlxuICAgICAgICA8bGkgY2xhc3NOYW1lPSdzdGFyJyBvbkNsaWNrPXsgKCkgPT4geyB0aGlzLnRvZ2dsZSgpICYmIG9uU3RhcihtYXApIH19PlN0YXIgTWFwPC9saT5cbiAgICAgICAgeyAhbWFwLmF1dGhvcml6ZVRvRWRpdChjdXJyZW50VXNlcikgJiYgPGxpIGNsYXNzTmFtZT0ncmVxdWVzdCcgb25DbGljaz17ICgpID0+IHsgdGhpcy50b2dnbGUoKSAmJiBvblJlcXVlc3QobWFwKSB9fT5SZXF1ZXN0IEFjY2VzczwvbGk+IH1cbiAgICAgIDwvdWw+XG4gICAgPC9kaXY+XG4gIH1cbn1cbk1lbnUucHJvcFR5cGVzID0ge1xuICBjdXJyZW50VXNlcjogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICBtYXA6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgb25TdGFyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBvblJlcXVlc3Q6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbn1cblxuY29uc3QgTWV0YWRhdGEgPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBtYXAgfSA9IHByb3BzXG4gIHJldHVybiAoPGRpdj5cbiAgICA8ZGl2IGNsYXNzTmFtZT1cIm1ldGFkYXRhU2VjdGlvbiBudW1Ub3BpY3NcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibnVtVG9waWNzSWNvblwiPjwvZGl2PlxuICAgICAgeyBtYXAuZ2V0KCd0b3BpY19jb3VudCcpIH08YnIvPlxuICAgICAgeyBtYXAuZ2V0KCd0b3BpY19jb3VudCcpID09PSAxID8gJ3RvcGljJyA6ICd0b3BpY3MnIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzTmFtZT1cIm1ldGFkYXRhU2VjdGlvbiBudW1TdGFyc1wiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJudW1TdGFyc0ljb25cIj48L2Rpdj5cbiAgICAgIHsgbWFwLmdldCgnc3Rhcl9jb3VudCcpIH08YnIvPlxuICAgICAgeyBtYXAuZ2V0KCdzdGFyX2NvdW50JykgPT09IDEgPyAnc3RhcicgOiAnc3RhcnMnIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzTmFtZT1cIm1ldGFkYXRhU2VjdGlvbiBudW1TeW5hcHNlc1wiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJudW1TeW5hcHNlc0ljb25cIj48L2Rpdj5cbiAgICAgIHsgbWFwLmdldCgnc3luYXBzZV9jb3VudCcpIH08YnIvPlxuICAgICAgeyBtYXAuZ2V0KCdzeW5hcHNlX2NvdW50JykgPT09IDEgPyAnc3luYXBzZScgOiAnc3luYXBzZXMnIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzTmFtZT1cIm1ldGFkYXRhU2VjdGlvbiBudW1Db250cmlidXRvcnNcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibnVtQ29udHJpYnV0b3JzSWNvblwiPjwvZGl2PlxuICAgICAgeyBtYXAuZ2V0KCdjb250cmlidXRvcl9jb3VudCcpIH08YnIvPlxuICAgICAgeyBtYXAuZ2V0KCdjb250cmlidXRvcl9jb3VudCcpID09PSAxID8gJ2NvbnRyaWJ1dG9yJyA6ICdjb250cmlidXRvcnMnIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzTmFtZT1cImNsZWFyZmxvYXRcIj48L2Rpdj5cbiAgPC9kaXY+KVxufVxuXG5jb25zdCBjaGVja0FuZFdyYXBJbkEgPSAoc2hvdWxkV3JhcCwgY2xhc3NTdHJpbmcsIG1hcElkLCBlbGVtZW50KSA9PiB7XG4gIGlmIChzaG91bGRXcmFwKSByZXR1cm4gPGEgY2xhc3NOYW1lPXsgY2xhc3NTdHJpbmcgfSBocmVmPXsgYC9tYXBzLyR7bWFwSWR9YCB9IGRhdGEtcm91dGVyPVwidHJ1ZVwiPnsgZWxlbWVudCB9PC9hPlxuICBlbHNlIHJldHVybiBlbGVtZW50XG59XG5cbmNsYXNzIE1hcENhcmQgZXh0ZW5kcyBDb21wb25lbnQge1xuICByZW5kZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBtYXAsIG1vYmlsZSwganVudG9TdGF0ZSwgY3VycmVudFVzZXIsIG9uUmVxdWVzdCwgb25TdGFyIH0gPSB0aGlzLnByb3BzXG5cbiAgICBjb25zdCBoYXNNYXAgPSBqdW50b1N0YXRlLmxpdmVNYXBzW21hcC5pZF1cbiAgICBjb25zdCBoYXNDb252ZXJzYXRpb24gPSBoYXNNYXAgJiYgZmluZCh2YWx1ZXMoaGFzTWFwKSwgdiA9PiB2ID09PSBJTl9DT05WRVJTQVRJT04pXG4gICAgY29uc3QgaGFzTWFwcGVyID0gaGFzTWFwICYmICFoYXNDb252ZXJzYXRpb25cbiAgICBjb25zdCBtYXBwZXJMaXN0ID0gaGFzTWFwICYmIE9iamVjdC5rZXlzKGhhc01hcCkubWFwKGlkID0+IGp1bnRvU3RhdGUuY29ubmVjdGVkUGVvcGxlW2lkXSlcblxuICAgIGNvbnN0IG4gPSBtYXAuZ2V0KCduYW1lJylcbiAgICBjb25zdCBkID0gbWFwLmdldCgnZGVzYycpXG5cbiAgICBjb25zdCBtYXhOYW1lTGVuZ3RoID0gMzJcbiAgICBjb25zdCBtYXhEZXNjTGVuZ3RoID0gMTgwXG4gICAgY29uc3QgdHJ1bmNhdGVkTmFtZSA9IG4gPyAobi5sZW5ndGggPiBtYXhOYW1lTGVuZ3RoID8gbi5zdWJzdHJpbmcoMCwgbWF4TmFtZUxlbmd0aCkgKyAnLi4uJyA6IG4pIDogJydcbiAgICBjb25zdCB0cnVuY2F0ZWREZXNjID0gZCA/IChkLmxlbmd0aCA+IG1heERlc2NMZW5ndGggPyBkLnN1YnN0cmluZygwLCBtYXhEZXNjTGVuZ3RoKSArICcuLi4nIDogZCkgOiAnJ1xuICAgIGNvbnN0IGVkaXRQZXJtaXNzaW9uID0gbWFwLmF1dGhvcml6ZVRvRWRpdChjdXJyZW50VXNlcikgPyAnY2FuRWRpdCcgOiAnY2Fubm90RWRpdCdcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1hcFwiIGlkPXsgbWFwLmlkIH0+XG4gICAgICAgIHsgY2hlY2tBbmRXcmFwSW5BKG1vYmlsZSwgJycsIG1hcC5pZCxcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9eyAncGVybWlzc2lvbiAnICsgZWRpdFBlcm1pc3Npb24gfT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nbWFwQ2FyZCc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nbWFpbkNvbnRlbnQnPlxuICAgICAgICAgICAgICB7ICFtb2JpbGUgJiYgPGRpdiBjbGFzc05hbWU9J21hcFNjcmVlbnNob3QnPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPXsgbWFwLmdldCgnc2NyZWVuc2hvdF91cmwnKSB9IC8+XG4gICAgICAgICAgICAgIDwvZGl2PiB9XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSd0aXRsZScgdGl0bGU9eyBtYXAuZ2V0KCduYW1lJykgfT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0naW5uZXJUaXRsZSc+eyB0cnVuY2F0ZWROYW1lIH08L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIHsgbW9iaWxlICYmIGhhc01hcHBlciAmJiA8ZGl2IGNsYXNzTmFtZT0nbW9iaWxlSGFzTWFwcGVyJz48TWFwcGVyTGlzdCBtYXBwZXJzPXsgbWFwcGVyTGlzdCB9IC8+PC9kaXY+IH1cbiAgICAgICAgICAgICAgeyBtb2JpbGUgJiYgaGFzQ29udmVyc2F0aW9uICYmIDxkaXYgY2xhc3NOYW1lPSdtb2JpbGVIYXNDb252ZXJzYXRpb24nPjxNYXBwZXJMaXN0IG1hcHBlcnM9eyBtYXBwZXJMaXN0IH0gLz48L2Rpdj4gfVxuICAgICAgICAgICAgICB7IG1vYmlsZSAmJiBkICYmIDxkaXYgY2xhc3NOYW1lPVwiZGVzY1wiPnsgZCB9PC9kaXY+IH1cbiAgICAgICAgICAgICAgeyBtb2JpbGUgJiYgPGRpdiBjbGFzc05hbWU9J21vYmlsZU1ldGFkYXRhJz48TWV0YWRhdGEgbWFwPXsgbWFwIH0gLz48L2Rpdj4gfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YGNyZWF0b3JBbmRQZXJtICR7bWFwLmF1dGhvcml6ZVRvRWRpdChjdXJyZW50VXNlcikgPyAnJyA6ICdjYXJkSGFzVmlld09ubHknfWB9PlxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPSdjcmVhdG9ySW1hZ2UnIHNyYz17IG1hcC5nZXQoJ3VzZXJfaW1hZ2UnKSB9IC8+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdjcmVhdG9yTmFtZSc+eyBtYXAuZ2V0KCd1c2VyX25hbWUnKSB9PC9zcGFuPlxuICAgICAgICAgICAgICAgIHsgIW1hcC5hdXRob3JpemVUb0VkaXQoY3VycmVudFVzZXIpICYmIDxkaXYgY2xhc3NOYW1lPSdjYXJkVmlld09ubHknPlZpZXcgT25seTwvZGl2PiB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7ICFtb2JpbGUgJiYgY2hlY2tBbmRXcmFwSW5BKHRydWUsICdtYXBNZXRhZGF0YScsIG1hcC5pZCxcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxNZXRhZGF0YSBtYXA9eyBtYXAgfSAvPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNjcm9sbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGVzY1wiPlxuICAgICAgICAgICAgICAgICAgeyB0cnVuY2F0ZWREZXNjIH1cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY2xlYXJmbG9hdFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PikgfVxuICAgICAgICAgICAgeyAhbW9iaWxlICYmIGhhc01hcHBlciAmJiA8ZGl2IGNsYXNzTmFtZT0nbWFwSGFzTWFwcGVyJz48TWFwcGVyTGlzdCBtYXBwZXJzPXsgbWFwcGVyTGlzdCB9IC8+PC9kaXY+IH1cbiAgICAgICAgICAgIHsgIW1vYmlsZSAmJiBoYXNDb252ZXJzYXRpb24gJiYgPGRpdiBjbGFzc05hbWU9J21hcEhhc0NvbnZlcnNhdGlvbic+PE1hcHBlckxpc3QgbWFwcGVycz17IG1hcHBlckxpc3QgfSAvPjwvZGl2PiB9XG4gICAgICAgICAgICB7ICFtb2JpbGUgJiYgY3VycmVudFVzZXIgJiYgPE1lbnUgY3VycmVudFVzZXI9eyBjdXJyZW50VXNlciB9IG1hcD17IG1hcCB9IG9uU3Rhcj0geyBvblN0YXIgfSBvblJlcXVlc3Q9eyBvblJlcXVlc3QgfSAvPiB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PikgfVxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG59XG5cbk1hcENhcmQucHJvcFR5cGVzID0ge1xuICBtYXA6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgbW9iaWxlOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICBqdW50b1N0YXRlOiBQcm9wVHlwZXMub2JqZWN0LFxuICBjdXJyZW50VXNlcjogUHJvcFR5cGVzLm9iamVjdCxcbiAgb25TdGFyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBvblJlcXVlc3Q6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbn1cblxuZXhwb3J0IGRlZmF1bHQgTWFwQ2FyZFxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9jb21wb25lbnRzL01hcHMvTWFwQ2FyZC5qcyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 550 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });\n\nvar _backbone = __webpack_require__(1);var _backbone2 = _interopRequireDefault(_backbone);\nvar _howler = __webpack_require__(551);\nvar _react = __webpack_require__(174);var _react2 = _interopRequireDefault(_react);\nvar _reactDom = __webpack_require__(205);var _reactDom2 = _interopRequireDefault(_reactDom);\n\n\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _DataModel = __webpack_require__(149);var _DataModel2 = _interopRequireDefault(_DataModel);\nvar _Realtime = __webpack_require__(435);var _Realtime2 = _interopRequireDefault(_Realtime);\nvar _MapChat = __webpack_require__(552);var _MapChat2 = _interopRequireDefault(_MapChat);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} // TODO is this line good or bad\n// Backbone.$ = window.$\n/* global $ */var ChatView = {\n  isOpen: false,\n  messages: new _backbone2.default.Collection(),\n  conversationLive: false,\n  isParticipating: false,\n  mapChat: null,\n  domId: 'chat-box-wrapper',\n  init: function init(urls) {\n    var self = ChatView;\n    self.sound = new _howler.Howl({\n      src: urls,\n      sprite: {\n        joinmap: [0, 561],\n        leavemap: [1000, 592],\n        receivechat: [2000, 318],\n        sendchat: [3000, 296],\n        sessioninvite: [4000, 5393, true] } });\n\n\n  },\n  setNewMap: function setNewMap() {\n    var self = ChatView;\n    self.conversationLive = false;\n    self.isParticipating = false;\n    self.alertSound = true; // whether to play sounds on arrival of new messages or not\n    self.cursorsShowing = true;\n    self.videosShowing = true;\n    self.participants = new _backbone2.default.Collection();\n    self.render();\n  },\n  show: function show() {\n    $('#' + ChatView.domId).show();\n  },\n  hide: function hide() {\n    $('#' + ChatView.domId).hide();\n  },\n  render: function render() {\n    if (!_Active2.default.Map) return;\n    var self = ChatView;\n    self.mapChat = _reactDom2.default.render(_react2.default.createElement(_MapChat2.default, {\n      conversationLive: self.conversationLive,\n      isParticipating: self.isParticipating,\n      onOpen: self.onOpen,\n      onClose: self.onClose,\n      leaveCall: _Realtime2.default.leaveCall,\n      joinCall: _Realtime2.default.joinCall,\n      inviteACall: _Realtime2.default.inviteACall,\n      inviteToJoin: _Realtime2.default.inviteToJoin,\n      participants: self.participants.models.map(function (p) {return p.attributes;}),\n      messages: self.messages.models.map(function (m) {return m.attributes;}),\n      videoToggleClick: self.videoToggleClick,\n      cursorToggleClick: self.cursorToggleClick,\n      soundToggleClick: self.soundToggleClick,\n      inputBlur: self.inputBlur,\n      inputFocus: self.inputFocus,\n      handleInputMessage: self.handleInputMessage }),\n    document.getElementById(ChatView.domId));\n  },\n  onOpen: function onOpen() {\n    $(document).trigger(ChatView.events.openTray);\n  },\n  onClose: function onClose() {\n    $(document).trigger(ChatView.events.closeTray);\n  },\n  addParticipant: function addParticipant(participant) {\n    ChatView.participants.add(participant);\n    ChatView.render();\n  },\n  removeParticipant: function removeParticipant(participant) {\n    ChatView.participants.remove(participant);\n    ChatView.render();\n  },\n  leaveConversation: function leaveConversation() {\n    ChatView.isParticipating = false;\n    ChatView.render();\n  },\n  mapperJoinedCall: function mapperJoinedCall(id) {\n    var mapper = ChatView.participants.findWhere({ id: id });\n    mapper && mapper.set('isParticipating', true);\n    ChatView.render();\n  },\n  mapperLeftCall: function mapperLeftCall(id) {\n    var mapper = ChatView.participants.findWhere({ id: id });\n    mapper && mapper.set('isParticipating', false);\n    ChatView.render();\n  },\n  invitationPending: function invitationPending(id) {\n    var mapper = ChatView.participants.findWhere({ id: id });\n    mapper && mapper.set('isPending', true);\n    ChatView.render();\n  },\n  invitationAnswered: function invitationAnswered(id) {\n    var mapper = ChatView.participants.findWhere({ id: id });\n    mapper && mapper.set('isPending', false);\n    ChatView.render();\n  },\n  conversationInProgress: function conversationInProgress(participating) {\n    ChatView.conversationLive = true;\n    ChatView.isParticipating = participating;\n    ChatView.render();\n  },\n  conversationEnded: function conversationEnded() {\n    ChatView.conversationLive = false;\n    ChatView.isParticipating = false;\n    ChatView.participants.forEach(function (p) {return p.set({ isParticipating: false, isPending: false });});\n    ChatView.render();\n  },\n  close: function close() {\n    ChatView.mapChat && ChatView.mapChat.close();\n  },\n  open: function open() {\n    ChatView.mapChat && ChatView.mapChat.open();\n  },\n  videoToggleClick: function videoToggleClick() {\n    ChatView.videosShowing = !ChatView.videosShowing;\n    $(document).trigger(ChatView.videosShowing ? ChatView.events.videosOn : ChatView.events.videosOff);\n  },\n  cursorToggleClick: function cursorToggleClick() {\n    ChatView.cursorsShowing = !ChatView.cursorsShowing;\n    $(document).trigger(ChatView.cursorsShowing ? ChatView.events.cursorsOn : ChatView.events.cursorsOff);\n  },\n  soundToggleClick: function soundToggleClick() {\n    ChatView.alertSound = !ChatView.alertSound;\n  },\n  inputFocus: function inputFocus() {\n    $(document).trigger(ChatView.events.inputFocus);\n  },\n  inputBlur: function inputBlur() {\n    $(document).trigger(ChatView.events.inputBlur);\n  },\n  addMessage: function addMessage(message, isInitial, wasMe) {\n    var self = ChatView;\n    if (!isInitial) self.mapChat.newMessage();\n    if (!wasMe && !isInitial && self.alertSound) self.sound.play('receivechat');\n    self.messages.add(message);\n    self.render();\n    if (!isInitial) self.mapChat.scroll();\n  },\n  sendChatMessage: function sendChatMessage(message) {\n    var self = ChatView;\n    if (ChatView.alertSound) ChatView.sound.play('sendchat');\n    var m = new _DataModel2.default.Message({\n      message: message.message,\n      resource_id: _Active2.default.Map.id,\n      resource_type: 'Map' });\n\n    m.save(null, {\n      success: function success(model, response) {\n        self.addMessages(new _DataModel2.default.MessageCollection(model), false, true);\n      },\n      error: function error(model, response) {\n        console.log('error!', response);\n      } });\n\n  },\n  handleInputMessage: function handleInputMessage(text) {\n    ChatView.sendChatMessage({ message: text });\n  },\n  // they should be instantiated as backbone models before they get\n  // passed to this function\n  addMessages: function addMessages(messages, isInitial, wasMe) {\n    messages.models.forEach(function (m) {return ChatView.addMessage(m, isInitial, wasMe);});\n  },\n  reset: function reset() {\n    ChatView.mapChat && ChatView.mapChat.reset();\n    ChatView.participants && ChatView.participants.reset();\n    ChatView.messages && ChatView.messages.reset();\n    ChatView.render();\n  } };\n\n\n// ChatView.prototype.scrollMessages = function(duration) {\n//   duration = duration || 0\n\n//   this.$messages.animate({\n//     scrollTop: this.$messages[0].scrollHeight\n//   }, duration)\n// }\n\n/**\n * @class\n * @static\n */\nChatView.events = {\n  openTray: 'ChatView:openTray',\n  closeTray: 'ChatView:closeTray',\n  inputFocus: 'ChatView:inputFocus',\n  inputBlur: 'ChatView:inputBlur',\n  cursorsOff: 'ChatView:cursorsOff',\n  cursorsOn: 'ChatView:cursorsOn',\n  videosOff: 'ChatView:videosOff',\n  videosOn: 'ChatView:videosOn' };exports.default =\n\n\nChatView;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTUwLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvVmlld3MvQ2hhdFZpZXcuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsICQgKi9cblxuaW1wb3J0IEJhY2tib25lIGZyb20gJ2JhY2tib25lJ1xuaW1wb3J0IHsgSG93bCB9IGZyb20gJ2hvd2xlcidcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nXG4vLyBUT0RPIGlzIHRoaXMgbGluZSBnb29kIG9yIGJhZFxuLy8gQmFja2JvbmUuJCA9IHdpbmRvdy4kXG5cbmltcG9ydCBBY3RpdmUgZnJvbSAnLi4vQWN0aXZlJ1xuaW1wb3J0IERhdGFNb2RlbCBmcm9tICcuLi9EYXRhTW9kZWwnXG5pbXBvcnQgUmVhbHRpbWUgZnJvbSAnLi4vUmVhbHRpbWUnXG5pbXBvcnQgTWFwQ2hhdCBmcm9tICcuLi8uLi9jb21wb25lbnRzL01hcENoYXQnXG5cbmNvbnN0IENoYXRWaWV3ID0ge1xuICBpc09wZW46IGZhbHNlLFxuICBtZXNzYWdlczogbmV3IEJhY2tib25lLkNvbGxlY3Rpb24oKSxcbiAgY29udmVyc2F0aW9uTGl2ZTogZmFsc2UsXG4gIGlzUGFydGljaXBhdGluZzogZmFsc2UsXG4gIG1hcENoYXQ6IG51bGwsXG4gIGRvbUlkOiAnY2hhdC1ib3gtd3JhcHBlcicsXG4gIGluaXQ6IGZ1bmN0aW9uKHVybHMpIHtcbiAgICBjb25zdCBzZWxmID0gQ2hhdFZpZXdcbiAgICBzZWxmLnNvdW5kID0gbmV3IEhvd2woe1xuICAgICAgc3JjOiB1cmxzLFxuICAgICAgc3ByaXRlOiB7XG4gICAgICAgIGpvaW5tYXA6IFswLCA1NjFdLFxuICAgICAgICBsZWF2ZW1hcDogWzEwMDAsIDU5Ml0sXG4gICAgICAgIHJlY2VpdmVjaGF0OiBbMjAwMCwgMzE4XSxcbiAgICAgICAgc2VuZGNoYXQ6IFszMDAwLCAyOTZdLFxuICAgICAgICBzZXNzaW9uaW52aXRlOiBbNDAwMCwgNTM5MywgdHJ1ZV1cbiAgICAgIH1cbiAgICB9KVxuICB9LFxuICBzZXROZXdNYXA6IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHNlbGYgPSBDaGF0Vmlld1xuICAgIHNlbGYuY29udmVyc2F0aW9uTGl2ZSA9IGZhbHNlXG4gICAgc2VsZi5pc1BhcnRpY2lwYXRpbmcgPSBmYWxzZVxuICAgIHNlbGYuYWxlcnRTb3VuZCA9IHRydWUgLy8gd2hldGhlciB0byBwbGF5IHNvdW5kcyBvbiBhcnJpdmFsIG9mIG5ldyBtZXNzYWdlcyBvciBub3RcbiAgICBzZWxmLmN1cnNvcnNTaG93aW5nID0gdHJ1ZVxuICAgIHNlbGYudmlkZW9zU2hvd2luZyA9IHRydWVcbiAgICBzZWxmLnBhcnRpY2lwYW50cyA9IG5ldyBCYWNrYm9uZS5Db2xsZWN0aW9uKClcbiAgICBzZWxmLnJlbmRlcigpXG4gIH0sXG4gIHNob3c6ICgpID0+IHtcbiAgICAkKCcjJyArIENoYXRWaWV3LmRvbUlkKS5zaG93KClcbiAgfSxcbiAgaGlkZTogKCkgPT4ge1xuICAgICQoJyMnICsgQ2hhdFZpZXcuZG9tSWQpLmhpZGUoKVxuICB9LFxuICByZW5kZXI6ICgpID0+IHtcbiAgICBpZiAoIUFjdGl2ZS5NYXApIHJldHVyblxuICAgIGNvbnN0IHNlbGYgPSBDaGF0Vmlld1xuICAgIHNlbGYubWFwQ2hhdCA9IFJlYWN0RE9NLnJlbmRlcihSZWFjdC5jcmVhdGVFbGVtZW50KE1hcENoYXQsIHtcbiAgICAgIGNvbnZlcnNhdGlvbkxpdmU6IHNlbGYuY29udmVyc2F0aW9uTGl2ZSxcbiAgICAgIGlzUGFydGljaXBhdGluZzogc2VsZi5pc1BhcnRpY2lwYXRpbmcsXG4gICAgICBvbk9wZW46IHNlbGYub25PcGVuLFxuICAgICAgb25DbG9zZTogc2VsZi5vbkNsb3NlLFxuICAgICAgbGVhdmVDYWxsOiBSZWFsdGltZS5sZWF2ZUNhbGwsXG4gICAgICBqb2luQ2FsbDogUmVhbHRpbWUuam9pbkNhbGwsXG4gICAgICBpbnZpdGVBQ2FsbDogUmVhbHRpbWUuaW52aXRlQUNhbGwsXG4gICAgICBpbnZpdGVUb0pvaW46IFJlYWx0aW1lLmludml0ZVRvSm9pbixcbiAgICAgIHBhcnRpY2lwYW50czogc2VsZi5wYXJ0aWNpcGFudHMubW9kZWxzLm1hcChwID0+IHAuYXR0cmlidXRlcyksXG4gICAgICBtZXNzYWdlczogc2VsZi5tZXNzYWdlcy5tb2RlbHMubWFwKG0gPT4gbS5hdHRyaWJ1dGVzKSxcbiAgICAgIHZpZGVvVG9nZ2xlQ2xpY2s6IHNlbGYudmlkZW9Ub2dnbGVDbGljayxcbiAgICAgIGN1cnNvclRvZ2dsZUNsaWNrOiBzZWxmLmN1cnNvclRvZ2dsZUNsaWNrLFxuICAgICAgc291bmRUb2dnbGVDbGljazogc2VsZi5zb3VuZFRvZ2dsZUNsaWNrLFxuICAgICAgaW5wdXRCbHVyOiBzZWxmLmlucHV0Qmx1cixcbiAgICAgIGlucHV0Rm9jdXM6IHNlbGYuaW5wdXRGb2N1cyxcbiAgICAgIGhhbmRsZUlucHV0TWVzc2FnZTogc2VsZi5oYW5kbGVJbnB1dE1lc3NhZ2VcbiAgICB9KSwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoQ2hhdFZpZXcuZG9tSWQpKVxuICB9LFxuICBvbk9wZW46ICgpID0+IHtcbiAgICAkKGRvY3VtZW50KS50cmlnZ2VyKENoYXRWaWV3LmV2ZW50cy5vcGVuVHJheSlcbiAgfSxcbiAgb25DbG9zZTogKCkgPT4ge1xuICAgICQoZG9jdW1lbnQpLnRyaWdnZXIoQ2hhdFZpZXcuZXZlbnRzLmNsb3NlVHJheSlcbiAgfSxcbiAgYWRkUGFydGljaXBhbnQ6IHBhcnRpY2lwYW50ID0+IHtcbiAgICBDaGF0Vmlldy5wYXJ0aWNpcGFudHMuYWRkKHBhcnRpY2lwYW50KVxuICAgIENoYXRWaWV3LnJlbmRlcigpXG4gIH0sXG4gIHJlbW92ZVBhcnRpY2lwYW50OiBwYXJ0aWNpcGFudCA9PiB7XG4gICAgQ2hhdFZpZXcucGFydGljaXBhbnRzLnJlbW92ZShwYXJ0aWNpcGFudClcbiAgICBDaGF0Vmlldy5yZW5kZXIoKVxuICB9LFxuICBsZWF2ZUNvbnZlcnNhdGlvbjogKCkgPT4ge1xuICAgIENoYXRWaWV3LmlzUGFydGljaXBhdGluZyA9IGZhbHNlXG4gICAgQ2hhdFZpZXcucmVuZGVyKClcbiAgfSxcbiAgbWFwcGVySm9pbmVkQ2FsbDogaWQgPT4ge1xuICAgIGNvbnN0IG1hcHBlciA9IENoYXRWaWV3LnBhcnRpY2lwYW50cy5maW5kV2hlcmUoe2lkfSlcbiAgICBtYXBwZXIgJiYgbWFwcGVyLnNldCgnaXNQYXJ0aWNpcGF0aW5nJywgdHJ1ZSlcbiAgICBDaGF0Vmlldy5yZW5kZXIoKVxuICB9LFxuICBtYXBwZXJMZWZ0Q2FsbDogaWQgPT4ge1xuICAgIGNvbnN0IG1hcHBlciA9IENoYXRWaWV3LnBhcnRpY2lwYW50cy5maW5kV2hlcmUoe2lkfSlcbiAgICBtYXBwZXIgJiYgbWFwcGVyLnNldCgnaXNQYXJ0aWNpcGF0aW5nJywgZmFsc2UpXG4gICAgQ2hhdFZpZXcucmVuZGVyKClcbiAgfSxcbiAgaW52aXRhdGlvblBlbmRpbmc6IGlkID0+IHtcbiAgICBjb25zdCBtYXBwZXIgPSBDaGF0Vmlldy5wYXJ0aWNpcGFudHMuZmluZFdoZXJlKHtpZH0pXG4gICAgbWFwcGVyICYmIG1hcHBlci5zZXQoJ2lzUGVuZGluZycsIHRydWUpXG4gICAgQ2hhdFZpZXcucmVuZGVyKClcbiAgfSxcbiAgaW52aXRhdGlvbkFuc3dlcmVkOiBpZCA9PiB7XG4gICAgY29uc3QgbWFwcGVyID0gQ2hhdFZpZXcucGFydGljaXBhbnRzLmZpbmRXaGVyZSh7aWR9KVxuICAgIG1hcHBlciAmJiBtYXBwZXIuc2V0KCdpc1BlbmRpbmcnLCBmYWxzZSlcbiAgICBDaGF0Vmlldy5yZW5kZXIoKVxuICB9LFxuICBjb252ZXJzYXRpb25JblByb2dyZXNzOiBwYXJ0aWNpcGF0aW5nID0+IHtcbiAgICBDaGF0Vmlldy5jb252ZXJzYXRpb25MaXZlID0gdHJ1ZVxuICAgIENoYXRWaWV3LmlzUGFydGljaXBhdGluZyA9IHBhcnRpY2lwYXRpbmdcbiAgICBDaGF0Vmlldy5yZW5kZXIoKVxuICB9LFxuICBjb252ZXJzYXRpb25FbmRlZDogKCkgPT4ge1xuICAgIENoYXRWaWV3LmNvbnZlcnNhdGlvbkxpdmUgPSBmYWxzZVxuICAgIENoYXRWaWV3LmlzUGFydGljaXBhdGluZyA9IGZhbHNlXG4gICAgQ2hhdFZpZXcucGFydGljaXBhbnRzLmZvckVhY2gocCA9PiBwLnNldCh7aXNQYXJ0aWNpcGF0aW5nOiBmYWxzZSwgaXNQZW5kaW5nOiBmYWxzZX0pKVxuICAgIENoYXRWaWV3LnJlbmRlcigpXG4gIH0sXG4gIGNsb3NlOiAoKSA9PiB7XG4gICAgQ2hhdFZpZXcubWFwQ2hhdCAmJiBDaGF0Vmlldy5tYXBDaGF0LmNsb3NlKClcbiAgfSxcbiAgb3BlbjogKCkgPT4ge1xuICAgIENoYXRWaWV3Lm1hcENoYXQgJiYgQ2hhdFZpZXcubWFwQ2hhdC5vcGVuKClcbiAgfSxcbiAgdmlkZW9Ub2dnbGVDbGljazogZnVuY3Rpb24oKSB7XG4gICAgQ2hhdFZpZXcudmlkZW9zU2hvd2luZyA9ICFDaGF0Vmlldy52aWRlb3NTaG93aW5nXG4gICAgJChkb2N1bWVudCkudHJpZ2dlcihDaGF0Vmlldy52aWRlb3NTaG93aW5nID8gQ2hhdFZpZXcuZXZlbnRzLnZpZGVvc09uIDogQ2hhdFZpZXcuZXZlbnRzLnZpZGVvc09mZilcbiAgfSxcbiAgY3Vyc29yVG9nZ2xlQ2xpY2s6IGZ1bmN0aW9uKCkge1xuICAgIENoYXRWaWV3LmN1cnNvcnNTaG93aW5nID0gIUNoYXRWaWV3LmN1cnNvcnNTaG93aW5nXG4gICAgJChkb2N1bWVudCkudHJpZ2dlcihDaGF0Vmlldy5jdXJzb3JzU2hvd2luZyA/IENoYXRWaWV3LmV2ZW50cy5jdXJzb3JzT24gOiBDaGF0Vmlldy5ldmVudHMuY3Vyc29yc09mZilcbiAgfSxcbiAgc291bmRUb2dnbGVDbGljazogZnVuY3Rpb24oKSB7XG4gICAgQ2hhdFZpZXcuYWxlcnRTb3VuZCA9ICFDaGF0Vmlldy5hbGVydFNvdW5kXG4gIH0sXG4gIGlucHV0Rm9jdXM6ICgpID0+IHtcbiAgICAkKGRvY3VtZW50KS50cmlnZ2VyKENoYXRWaWV3LmV2ZW50cy5pbnB1dEZvY3VzKVxuICB9LFxuICBpbnB1dEJsdXI6ICgpID0+IHtcbiAgICAkKGRvY3VtZW50KS50cmlnZ2VyKENoYXRWaWV3LmV2ZW50cy5pbnB1dEJsdXIpXG4gIH0sXG4gIGFkZE1lc3NhZ2U6IChtZXNzYWdlLCBpc0luaXRpYWwsIHdhc01lKSA9PiB7XG4gICAgY29uc3Qgc2VsZiA9IENoYXRWaWV3XG4gICAgaWYgKCFpc0luaXRpYWwpIHNlbGYubWFwQ2hhdC5uZXdNZXNzYWdlKClcbiAgICBpZiAoIXdhc01lICYmICFpc0luaXRpYWwgJiYgc2VsZi5hbGVydFNvdW5kKSBzZWxmLnNvdW5kLnBsYXkoJ3JlY2VpdmVjaGF0JylcbiAgICBzZWxmLm1lc3NhZ2VzLmFkZChtZXNzYWdlKVxuICAgIHNlbGYucmVuZGVyKClcbiAgICBpZiAoIWlzSW5pdGlhbCkgc2VsZi5tYXBDaGF0LnNjcm9sbCgpXG4gIH0sXG4gIHNlbmRDaGF0TWVzc2FnZTogbWVzc2FnZSA9PiB7XG4gICAgdmFyIHNlbGYgPSBDaGF0Vmlld1xuICAgIGlmIChDaGF0Vmlldy5hbGVydFNvdW5kKSBDaGF0Vmlldy5zb3VuZC5wbGF5KCdzZW5kY2hhdCcpXG4gICAgdmFyIG0gPSBuZXcgRGF0YU1vZGVsLk1lc3NhZ2Uoe1xuICAgICAgbWVzc2FnZTogbWVzc2FnZS5tZXNzYWdlLFxuICAgICAgcmVzb3VyY2VfaWQ6IEFjdGl2ZS5NYXAuaWQsXG4gICAgICByZXNvdXJjZV90eXBlOiAnTWFwJ1xuICAgIH0pXG4gICAgbS5zYXZlKG51bGwsIHtcbiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKG1vZGVsLCByZXNwb25zZSkge1xuICAgICAgICBzZWxmLmFkZE1lc3NhZ2VzKG5ldyBEYXRhTW9kZWwuTWVzc2FnZUNvbGxlY3Rpb24obW9kZWwpLCBmYWxzZSwgdHJ1ZSlcbiAgICAgIH0sXG4gICAgICBlcnJvcjogZnVuY3Rpb24obW9kZWwsIHJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciEnLCByZXNwb25zZSlcbiAgICAgIH1cbiAgICB9KVxuICB9LFxuICBoYW5kbGVJbnB1dE1lc3NhZ2U6IHRleHQgPT4ge1xuICAgIENoYXRWaWV3LnNlbmRDaGF0TWVzc2FnZSh7bWVzc2FnZTogdGV4dH0pXG4gIH0sXG4gIC8vIHRoZXkgc2hvdWxkIGJlIGluc3RhbnRpYXRlZCBhcyBiYWNrYm9uZSBtb2RlbHMgYmVmb3JlIHRoZXkgZ2V0XG4gIC8vIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uXG4gIGFkZE1lc3NhZ2VzOiAobWVzc2FnZXMsIGlzSW5pdGlhbCwgd2FzTWUpID0+IHtcbiAgICBtZXNzYWdlcy5tb2RlbHMuZm9yRWFjaChtID0+IENoYXRWaWV3LmFkZE1lc3NhZ2UobSwgaXNJbml0aWFsLCB3YXNNZSkpXG4gIH0sXG4gIHJlc2V0OiAoKSA9PiB7XG4gICAgQ2hhdFZpZXcubWFwQ2hhdCAmJiBDaGF0Vmlldy5tYXBDaGF0LnJlc2V0KClcbiAgICBDaGF0Vmlldy5wYXJ0aWNpcGFudHMgJiYgQ2hhdFZpZXcucGFydGljaXBhbnRzLnJlc2V0KClcbiAgICBDaGF0Vmlldy5tZXNzYWdlcyAmJiBDaGF0Vmlldy5tZXNzYWdlcy5yZXNldCgpXG4gICAgQ2hhdFZpZXcucmVuZGVyKClcbiAgfVxufVxuXG4vLyBDaGF0Vmlldy5wcm90b3R5cGUuc2Nyb2xsTWVzc2FnZXMgPSBmdW5jdGlvbihkdXJhdGlvbikge1xuLy8gICBkdXJhdGlvbiA9IGR1cmF0aW9uIHx8IDBcblxuLy8gICB0aGlzLiRtZXNzYWdlcy5hbmltYXRlKHtcbi8vICAgICBzY3JvbGxUb3A6IHRoaXMuJG1lc3NhZ2VzWzBdLnNjcm9sbEhlaWdodFxuLy8gICB9LCBkdXJhdGlvbilcbi8vIH1cblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBzdGF0aWNcbiAqL1xuQ2hhdFZpZXcuZXZlbnRzID0ge1xuICBvcGVuVHJheTogJ0NoYXRWaWV3Om9wZW5UcmF5JyxcbiAgY2xvc2VUcmF5OiAnQ2hhdFZpZXc6Y2xvc2VUcmF5JyxcbiAgaW5wdXRGb2N1czogJ0NoYXRWaWV3OmlucHV0Rm9jdXMnLFxuICBpbnB1dEJsdXI6ICdDaGF0VmlldzppbnB1dEJsdXInLFxuICBjdXJzb3JzT2ZmOiAnQ2hhdFZpZXc6Y3Vyc29yc09mZicsXG4gIGN1cnNvcnNPbjogJ0NoYXRWaWV3OmN1cnNvcnNPbicsXG4gIHZpZGVvc09mZjogJ0NoYXRWaWV3OnZpZGVvc09mZicsXG4gIHZpZGVvc09uOiAnQ2hhdFZpZXc6dmlkZW9zT24nXG59XG5cbmV4cG9ydCBkZWZhdWx0IENoYXRWaWV3XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL01ldGFtYXBzL1ZpZXdzL0NoYXRWaWV3LmpzIl0sIm1hcHBpbmdzIjoiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQVBBO0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 551 */
/***/ function(module, exports, __webpack_require__) {

    eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(global) {/*!\n *  howler.js v2.0.2\n *  howlerjs.com\n *\n *  (c) 2013-2016, James Simpson of GoldFire Studios\n *  goldfirestudios.com\n *\n *  MIT License\n */\n\n(function() {\n\n  'use strict';\n\n  /** Global Methods **/\n  /***************************************************************************/\n\n  /**\n   * Create the global controller. All contained methods and properties apply\n   * to all sounds that are currently playing or will be in the future.\n   */\n  var HowlerGlobal = function() {\n    this.init();\n  };\n  HowlerGlobal.prototype = {\n    /**\n     * Initialize the global Howler object.\n     * @return {Howler}\n     */\n    init: function() {\n      var self = this || Howler;\n\n      // Internal properties.\n      self._codecs = {};\n      self._howls = [];\n      self._muted = false;\n      self._volume = 1;\n      self._canPlayEvent = 'canplaythrough';\n      self._navigator = (typeof window !== 'undefined' && window.navigator) ? window.navigator : null;\n\n      // Public properties.\n      self.masterGain = null;\n      self.noAudio = false;\n      self.usingWebAudio = true;\n      self.autoSuspend = true;\n      self.ctx = null;\n\n      // Set to false to disable the auto iOS enabler.\n      self.mobileAutoEnable = true;\n\n      // Setup the various state values for global tracking.\n      self._setup();\n\n      return self;\n    },\n\n    /**\n     * Get/set the global volume for all sounds.\n     * @param  {Float} vol Volume from 0.0 to 1.0.\n     * @return {Howler/Float}     Returns self or current volume.\n     */\n    volume: function(vol) {\n      var self = this || Howler;\n      vol = parseFloat(vol);\n\n      // If we don't have an AudioContext created yet, run the setup.\n      if (!self.ctx) {\n        setupAudioContext();\n      }\n\n      if (typeof vol !== 'undefined' && vol >= 0 && vol <= 1) {\n        self._volume = vol;\n\n        // Don't update any of the nodes if we are muted.\n        if (self._muted) {\n          return self;\n        }\n\n        // When using Web Audio, we just need to adjust the master gain.\n        if (self.usingWebAudio) {\n          self.masterGain.gain.value = vol;\n        }\n\n        // Loop through and change volume for all HTML5 audio nodes.\n        for (var i=0; i<self._howls.length; i++) {\n          if (!self._howls[i]._webAudio) {\n            // Get all of the sounds in this Howl group.\n            var ids = self._howls[i]._getSoundIds();\n\n            // Loop through all sounds and change the volumes.\n            for (var j=0; j<ids.length; j++) {\n              var sound = self._howls[i]._soundById(ids[j]);\n\n              if (sound && sound._node) {\n                sound._node.volume = sound._volume * vol;\n              }\n            }\n          }\n        }\n\n        return self;\n      }\n\n      return self._volume;\n    },\n\n    /**\n     * Handle muting and unmuting globally.\n     * @param  {Boolean} muted Is muted or not.\n     */\n    mute: function(muted) {\n      var self = this || Howler;\n\n      // If we don't have an AudioContext created yet, run the setup.\n      if (!self.ctx) {\n        setupAudioContext();\n      }\n\n      self._muted = muted;\n\n      // With Web Audio, we just need to mute the master gain.\n      if (self.usingWebAudio) {\n        self.masterGain.gain.value = muted ? 0 : self._volume;\n      }\n\n      // Loop through and mute all HTML5 Audio nodes.\n      for (var i=0; i<self._howls.length; i++) {\n        if (!self._howls[i]._webAudio) {\n          // Get all of the sounds in this Howl group.\n          var ids = self._howls[i]._getSoundIds();\n\n          // Loop through all sounds and mark the audio node as muted.\n          for (var j=0; j<ids.length; j++) {\n            var sound = self._howls[i]._soundById(ids[j]);\n\n            if (sound && sound._node) {\n              sound._node.muted = (muted) ? true : sound._muted;\n            }\n          }\n        }\n      }\n\n      return self;\n    },\n\n    /**\n     * Unload and destroy all currently loaded Howl objects.\n     * @return {Howler}\n     */\n    unload: function() {\n      var self = this || Howler;\n\n      for (var i=self._howls.length-1; i>=0; i--) {\n        self._howls[i].unload();\n      }\n\n      // Create a new AudioContext to make sure it is fully reset.\n      if (self.usingWebAudio && self.ctx && typeof self.ctx.close !== 'undefined') {\n        self.ctx.close();\n        self.ctx = null;\n        setupAudioContext();\n      }\n\n      return self;\n    },\n\n    /**\n     * Check for codec support of specific extension.\n     * @param  {String} ext Audio file extention.\n     * @return {Boolean}\n     */\n    codecs: function(ext) {\n      return (this || Howler)._codecs[ext.replace(/^x-/, '')];\n    },\n\n    /**\n     * Setup various state values for global tracking.\n     * @return {Howler}\n     */\n    _setup: function() {\n      var self = this || Howler;\n\n      // Keeps track of the suspend/resume state of the AudioContext.\n      self.state = self.ctx ? self.ctx.state || 'running' : 'running';\n\n      // Automatically begin the 30-second suspend process\n      self._autoSuspend();\n\n      // Check if audio is available.\n      if (!self.usingWebAudio) {\n        // No audio is available on this system if noAudio is set to true.\n        if (typeof Audio !== 'undefined') {\n          try {\n            var test = new Audio();\n\n            // Check if the canplaythrough event is available.\n            if (typeof test.oncanplaythrough === 'undefined') {\n              self._canPlayEvent = 'canplay';\n            }\n          } catch(e) {\n            self.noAudio = true;\n          }\n        } else {\n          self.noAudio = true;\n        }\n      }\n\n      // Test to make sure audio isn't disabled in Internet Explorer.\n      try {\n        var test = new Audio();\n        if (test.muted) {\n          self.noAudio = true;\n        }\n      } catch (e) {}\n\n      // Check for supported codecs.\n      if (!self.noAudio) {\n        self._setupCodecs();\n      }\n\n      return self;\n    },\n\n    /**\n     * Check for browser support for various codecs and cache the results.\n     * @return {Howler}\n     */\n    _setupCodecs: function() {\n      var self = this || Howler;\n      var audioTest = null;\n\n      // Must wrap in a try/catch because IE11 in server mode throws an error.\n      try {\n        audioTest = (typeof Audio !== 'undefined') ? new Audio() : null;\n      } catch (err) {\n        return self;\n      }\n\n      if (!audioTest || typeof audioTest.canPlayType !== 'function') {\n        return self;\n      }\n\n      var mpegTest = audioTest.canPlayType('audio/mpeg;').replace(/^no$/, '');\n\n      // Opera version <33 has mixed MP3 support, so we need to check for and block it.\n      var checkOpera = self._navigator && self._navigator.userAgent.match(/OPR\\/([0-6].)/g);\n      var isOldOpera = (checkOpera && parseInt(checkOpera[0].split('/')[1], 10) < 33);\n\n      self._codecs = {\n        mp3: !!(!isOldOpera && (mpegTest || audioTest.canPlayType('audio/mp3;').replace(/^no$/, ''))),\n        mpeg: !!mpegTest,\n        opus: !!audioTest.canPlayType('audio/ogg; codecs=\"opus\"').replace(/^no$/, ''),\n        ogg: !!audioTest.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, ''),\n        oga: !!audioTest.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, ''),\n        wav: !!audioTest.canPlayType('audio/wav; codecs=\"1\"').replace(/^no$/, ''),\n        aac: !!audioTest.canPlayType('audio/aac;').replace(/^no$/, ''),\n        caf: !!audioTest.canPlayType('audio/x-caf;').replace(/^no$/, ''),\n        m4a: !!(audioTest.canPlayType('audio/x-m4a;') || audioTest.canPlayType('audio/m4a;') || audioTest.canPlayType('audio/aac;')).replace(/^no$/, ''),\n        mp4: !!(audioTest.canPlayType('audio/x-mp4;') || audioTest.canPlayType('audio/mp4;') || audioTest.canPlayType('audio/aac;')).replace(/^no$/, ''),\n        weba: !!audioTest.canPlayType('audio/webm; codecs=\"vorbis\"').replace(/^no$/, ''),\n        webm: !!audioTest.canPlayType('audio/webm; codecs=\"vorbis\"').replace(/^no$/, ''),\n        dolby: !!audioTest.canPlayType('audio/mp4; codecs=\"ec-3\"').replace(/^no$/, ''),\n        flac: !!(audioTest.canPlayType('audio/x-flac;') || audioTest.canPlayType('audio/flac;')).replace(/^no$/, '')\n      };\n\n      return self;\n    },\n\n    /**\n     * Mobile browsers will only allow audio to be played after a user interaction.\n     * Attempt to automatically unlock audio on the first user interaction.\n     * Concept from: http://paulbakaus.com/tutorials/html5/web-audio-on-ios/\n     * @return {Howler}\n     */\n    _enableMobileAudio: function() {\n      var self = this || Howler;\n\n      // Only run this on mobile devices if audio isn't already eanbled.\n      var isMobile = /iPhone|iPad|iPod|Android|BlackBerry|BB10|Silk|Mobi/i.test(self._navigator && self._navigator.userAgent);\n      var isTouch = !!(('ontouchend' in window) || (self._navigator && self._navigator.maxTouchPoints > 0) || (self._navigator && self._navigator.msMaxTouchPoints > 0));\n      if (self._mobileEnabled || !self.ctx || (!isMobile && !isTouch)) {\n        return;\n      }\n\n      self._mobileEnabled = false;\n\n      // Some mobile devices/platforms have distortion issues when opening/closing tabs and/or web views.\n      // Bugs in the browser (especially Mobile Safari) can cause the sampleRate to change from 44100 to 48000.\n      // By calling Howler.unload(), we create a new AudioContext with the correct sampleRate.\n      if (!self._mobileUnloaded && self.ctx.sampleRate !== 44100) {\n        self._mobileUnloaded = true;\n        self.unload();\n      }\n\n      // Scratch buffer for enabling iOS to dispose of web audio buffers correctly, as per:\n      // http://stackoverflow.com/questions/24119684\n      self._scratchBuffer = self.ctx.createBuffer(1, 1, 22050);\n\n      // Call this method on touch start to create and play a buffer,\n      // then check if the audio actually played to determine if\n      // audio has now been unlocked on iOS, Android, etc.\n      var unlock = function() {\n        // Create an empty buffer.\n        var source = self.ctx.createBufferSource();\n        source.buffer = self._scratchBuffer;\n        source.connect(self.ctx.destination);\n\n        // Play the empty buffer.\n        if (typeof source.start === 'undefined') {\n          source.noteOn(0);\n        } else {\n          source.start(0);\n        }\n\n        // Setup a timeout to check that we are unlocked on the next event loop.\n        source.onended = function() {\n          source.disconnect(0);\n\n          // Update the unlocked state and prevent this check from happening again.\n          self._mobileEnabled = true;\n          self.mobileAutoEnable = false;\n\n          // Remove the touch start listener.\n          document.removeEventListener('touchend', unlock, true);\n        };\n      };\n\n      // Setup a touch start listener to attempt an unlock in.\n      document.addEventListener('touchend', unlock, true);\n\n      return self;\n    },\n\n    /**\n     * Automatically suspend the Web Audio AudioContext after no sound has played for 30 seconds.\n     * This saves processing/energy and fixes various browser-specific bugs with audio getting stuck.\n     * @return {Howler}\n     */\n    _autoSuspend: function() {\n      var self = this;\n\n      if (!self.autoSuspend || !self.ctx || typeof self.ctx.suspend === 'undefined' || !Howler.usingWebAudio) {\n        return;\n      }\n\n      // Check if any sounds are playing.\n      for (var i=0; i<self._howls.length; i++) {\n        if (self._howls[i]._webAudio) {\n          for (var j=0; j<self._howls[i]._sounds.length; j++) {\n            if (!self._howls[i]._sounds[j]._paused) {\n              return self;\n            }\n          }\n        }\n      }\n\n      if (self._suspendTimer) {\n        clearTimeout(self._suspendTimer);\n      }\n\n      // If no sound has played after 30 seconds, suspend the context.\n      self._suspendTimer = setTimeout(function() {\n        if (!self.autoSuspend) {\n          return;\n        }\n\n        self._suspendTimer = null;\n        self.state = 'suspending';\n        self.ctx.suspend().then(function() {\n          self.state = 'suspended';\n\n          if (self._resumeAfterSuspend) {\n            delete self._resumeAfterSuspend;\n            self._autoResume();\n          }\n        });\n      }, 30000);\n\n      return self;\n    },\n\n    /**\n     * Automatically resume the Web Audio AudioContext when a new sound is played.\n     * @return {Howler}\n     */\n    _autoResume: function() {\n      var self = this;\n\n      if (!self.ctx || typeof self.ctx.resume === 'undefined' || !Howler.usingWebAudio) {\n        return;\n      }\n\n      if (self.state === 'running' && self._suspendTimer) {\n        clearTimeout(self._suspendTimer);\n        self._suspendTimer = null;\n      } else if (self.state === 'suspended') {\n        self.state = 'resuming';\n        self.ctx.resume().then(function() {\n          self.state = 'running';\n\n          // Emit to all Howls that the audio has resumed.\n          for (var i=0; i<self._howls.length; i++) {\n            self._howls[i]._emit('resume');\n          }\n        });\n\n        if (self._suspendTimer) {\n          clearTimeout(self._suspendTimer);\n          self._suspendTimer = null;\n        }\n      } else if (self.state === 'suspending') {\n        self._resumeAfterSuspend = true;\n      }\n\n      return self;\n    }\n  };\n\n  // Setup the global audio controller.\n  var Howler = new HowlerGlobal();\n\n  /** Group Methods **/\n  /***************************************************************************/\n\n  /**\n   * Create an audio group controller.\n   * @param {Object} o Passed in properties for this group.\n   */\n  var Howl = function(o) {\n    var self = this;\n\n    // Throw an error if no source is provided.\n    if (!o.src || o.src.length === 0) {\n      console.error('An array of source files must be passed with any new Howl.');\n      return;\n    }\n\n    self.init(o);\n  };\n  Howl.prototype = {\n    /**\n     * Initialize a new Howl group object.\n     * @param  {Object} o Passed in properties for this group.\n     * @return {Howl}\n     */\n    init: function(o) {\n      var self = this;\n\n      // If we don't have an AudioContext created yet, run the setup.\n      if (!Howler.ctx) {\n        setupAudioContext();\n      }\n\n      // Setup user-defined default properties.\n      self._autoplay = o.autoplay || false;\n      self._format = (typeof o.format !== 'string') ? o.format : [o.format];\n      self._html5 = o.html5 || false;\n      self._muted = o.mute || false;\n      self._loop = o.loop || false;\n      self._pool = o.pool || 5;\n      self._preload = (typeof o.preload === 'boolean') ? o.preload : true;\n      self._rate = o.rate || 1;\n      self._sprite = o.sprite || {};\n      self._src = (typeof o.src !== 'string') ? o.src : [o.src];\n      self._volume = o.volume !== undefined ? o.volume : 1;\n\n      // Setup all other default properties.\n      self._duration = 0;\n      self._state = 'unloaded';\n      self._sounds = [];\n      self._endTimers = {};\n      self._queue = [];\n\n      // Setup event listeners.\n      self._onend = o.onend ? [{fn: o.onend}] : [];\n      self._onfade = o.onfade ? [{fn: o.onfade}] : [];\n      self._onload = o.onload ? [{fn: o.onload}] : [];\n      self._onloaderror = o.onloaderror ? [{fn: o.onloaderror}] : [];\n      self._onpause = o.onpause ? [{fn: o.onpause}] : [];\n      self._onplay = o.onplay ? [{fn: o.onplay}] : [];\n      self._onstop = o.onstop ? [{fn: o.onstop}] : [];\n      self._onmute = o.onmute ? [{fn: o.onmute}] : [];\n      self._onvolume = o.onvolume ? [{fn: o.onvolume}] : [];\n      self._onrate = o.onrate ? [{fn: o.onrate}] : [];\n      self._onseek = o.onseek ? [{fn: o.onseek}] : [];\n      self._onresume = [];\n\n      // Web Audio or HTML5 Audio?\n      self._webAudio = Howler.usingWebAudio && !self._html5;\n\n      // Automatically try to enable audio on iOS.\n      if (typeof Howler.ctx !== 'undefined' && Howler.ctx && Howler.mobileAutoEnable) {\n        Howler._enableMobileAudio();\n      }\n\n      // Keep track of this Howl group in the global controller.\n      Howler._howls.push(self);\n\n      // If they selected autoplay, add a play event to the load queue.\n      if (self._autoplay) {\n        self._queue.push({\n          event: 'play',\n          action: function() {\n            self.play();\n          }\n        });\n      }\n\n      // Load the source file unless otherwise specified.\n      if (self._preload) {\n        self.load();\n      }\n\n      return self;\n    },\n\n    /**\n     * Load the audio file.\n     * @return {Howler}\n     */\n    load: function() {\n      var self = this;\n      var url = null;\n\n      // If no audio is available, quit immediately.\n      if (Howler.noAudio) {\n        self._emit('loaderror', null, 'No audio support.');\n        return;\n      }\n\n      // Make sure our source is in an array.\n      if (typeof self._src === 'string') {\n        self._src = [self._src];\n      }\n\n      // Loop through the sources and pick the first one that is compatible.\n      for (var i=0; i<self._src.length; i++) {\n        var ext, str;\n\n        if (self._format && self._format[i]) {\n          // If an extension was specified, use that instead.\n          ext = self._format[i];\n        } else {\n          // Make sure the source is a string.\n          str = self._src[i];\n          if (typeof str !== 'string') {\n            self._emit('loaderror', null, 'Non-string found in selected audio sources - ignoring.');\n            continue;\n          }\n\n          // Extract the file extension from the URL or base64 data URI.\n          ext = /^data:audio\\/([^;,]+);/i.exec(str);\n          if (!ext) {\n            ext = /\\.([^.]+)$/.exec(str.split('?', 1)[0]);\n          }\n\n          if (ext) {\n            ext = ext[1].toLowerCase();\n          }\n        }\n\n        // Check if this extension is available.\n        if (Howler.codecs(ext)) {\n          url = self._src[i];\n          break;\n        }\n      }\n\n      if (!url) {\n        self._emit('loaderror', null, 'No codec support for selected audio sources.');\n        return;\n      }\n\n      self._src = url;\n      self._state = 'loading';\n\n      // If the hosting page is HTTPS and the source isn't,\n      // drop down to HTML5 Audio to avoid Mixed Content errors.\n      if (window.location.protocol === 'https:' && url.slice(0, 5) === 'http:') {\n        self._html5 = true;\n        self._webAudio = false;\n      }\n\n      // Create a new sound object and add it to the pool.\n      new Sound(self);\n\n      // Load and decode the audio data for playback.\n      if (self._webAudio) {\n        loadBuffer(self);\n      }\n\n      return self;\n    },\n\n    /**\n     * Play a sound or resume previous playback.\n     * @param  {String/Number} sprite   Sprite name for sprite playback or sound id to continue previous.\n     * @param  {Boolean} internal Internal Use: true prevents event firing.\n     * @return {Number}          Sound ID.\n     */\n    play: function(sprite, internal) {\n      var self = this;\n      var id = null;\n\n      // Determine if a sprite, sound id or nothing was passed\n      if (typeof sprite === 'number') {\n        id = sprite;\n        sprite = null;\n      } else if (typeof sprite === 'string' && self._state === 'loaded' && !self._sprite[sprite]) {\n        // If the passed sprite doesn't exist, do nothing.\n        return null;\n      } else if (typeof sprite === 'undefined') {\n        // Use the default sound sprite (plays the full audio length).\n        sprite = '__default';\n\n        // Check if there is a single paused sound that isn't ended.\n        // If there is, play that sound. If not, continue as usual.\n        var num = 0;\n        for (var i=0; i<self._sounds.length; i++) {\n          if (self._sounds[i]._paused && !self._sounds[i]._ended) {\n            num++;\n            id = self._sounds[i]._id;\n          }\n        }\n\n        if (num === 1) {\n          sprite = null;\n        } else {\n          id = null;\n        }\n      }\n\n      // Get the selected node, or get one from the pool.\n      var sound = id ? self._soundById(id) : self._inactiveSound();\n\n      // If the sound doesn't exist, do nothing.\n      if (!sound) {\n        return null;\n      }\n\n      // Select the sprite definition.\n      if (id && !sprite) {\n        sprite = sound._sprite || '__default';\n      }\n\n      // If we have no sprite and the sound hasn't loaded, we must wait\n      // for the sound to load to get our audio's duration.\n      if (self._state !== 'loaded' && !self._sprite[sprite]) {\n        self._queue.push({\n          event: 'play',\n          action: function() {\n            self.play(self._soundById(sound._id) ? sound._id : undefined);\n          }\n        });\n\n        return sound._id;\n      }\n\n      // Don't play the sound if an id was passed and it is already playing.\n      if (id && !sound._paused) {\n        // Trigger the play event, in order to keep iterating through queue.\n        if (!internal) {\n          setTimeout(function() {\n            self._emit('play', sound._id);\n          }, 0);\n        }\n\n        return sound._id;\n      }\n\n      // Make sure the AudioContext isn't suspended, and resume it if it is.\n      if (self._webAudio) {\n        Howler._autoResume();\n      }\n\n      // Determine how long to play for and where to start playing.\n      var seek = Math.max(0, sound._seek > 0 ? sound._seek : self._sprite[sprite][0] / 1000);\n      var duration = Math.max(0, ((self._sprite[sprite][0] + self._sprite[sprite][1]) / 1000) - seek);\n      var timeout = (duration * 1000) / Math.abs(sound._rate);\n\n      // Update the parameters of the sound\n      sound._paused = false;\n      sound._ended = false;\n      sound._sprite = sprite;\n      sound._seek = seek;\n      sound._start = self._sprite[sprite][0] / 1000;\n      sound._stop = (self._sprite[sprite][0] + self._sprite[sprite][1]) / 1000;\n      sound._loop = !!(sound._loop || self._sprite[sprite][2]);\n\n      // Begin the actual playback.\n      var node = sound._node;\n      if (self._webAudio) {\n        // Fire this when the sound is ready to play to begin Web Audio playback.\n        var playWebAudio = function() {\n          self._refreshBuffer(sound);\n\n          // Setup the playback params.\n          var vol = (sound._muted || self._muted) ? 0 : sound._volume;\n          node.gain.setValueAtTime(vol, Howler.ctx.currentTime);\n          sound._playStart = Howler.ctx.currentTime;\n\n          // Play the sound using the supported method.\n          if (typeof node.bufferSource.start === 'undefined') {\n            sound._loop ? node.bufferSource.noteGrainOn(0, seek, 86400) : node.bufferSource.noteGrainOn(0, seek, duration);\n          } else {\n            sound._loop ? node.bufferSource.start(0, seek, 86400) : node.bufferSource.start(0, seek, duration);\n          }\n\n          // Start a new timer if none is present.\n          if (timeout !== Infinity) {\n            self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n          }\n\n          if (!internal) {\n            setTimeout(function() {\n              self._emit('play', sound._id);\n            }, 0);\n          }\n        };\n\n        var isRunning = (Howler.state === 'running');\n        if (self._state === 'loaded' && isRunning) {\n          playWebAudio();\n        } else {\n          // Wait for the audio to load and then begin playback.\n          self.once(isRunning ? 'load' : 'resume', playWebAudio, isRunning ? sound._id : null);\n\n          // Cancel the end timer.\n          self._clearTimer(sound._id);\n        }\n      } else {\n        // Fire this when the sound is ready to play to begin HTML5 Audio playback.\n        var playHtml5 = function() {\n          node.currentTime = seek;\n          node.muted = sound._muted || self._muted || Howler._muted || node.muted;\n          node.volume = sound._volume * Howler.volume();\n          node.playbackRate = sound._rate;\n\n          setTimeout(function() {\n            node.play();\n\n            // Setup the new end timer.\n            if (timeout !== Infinity) {\n              self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n            }\n\n            if (!internal) {\n              self._emit('play', sound._id);\n            }\n          }, 0);\n        };\n\n        // Play immediately if ready, or wait for the 'canplaythrough'e vent.\n        var loadedNoReadyState = (self._state === 'loaded' && (window && window.ejecta || !node.readyState && Howler._navigator.isCocoonJS));\n        if (node.readyState === 4 || loadedNoReadyState) {\n          playHtml5();\n        } else {\n          var listener = function() {\n            // Begin playback.\n            playHtml5();\n\n            // Clear this listener.\n            node.removeEventListener(Howler._canPlayEvent, listener, false);\n          };\n          node.addEventListener(Howler._canPlayEvent, listener, false);\n\n          // Cancel the end timer.\n          self._clearTimer(sound._id);\n        }\n      }\n\n      return sound._id;\n    },\n\n    /**\n     * Pause playback and save current position.\n     * @param  {Number} id The sound ID (empty to pause all in group).\n     * @return {Howl}\n     */\n    pause: function(id) {\n      var self = this;\n\n      // If the sound hasn't loaded, add it to the load queue to pause when capable.\n      if (self._state !== 'loaded') {\n        self._queue.push({\n          event: 'pause',\n          action: function() {\n            self.pause(id);\n          }\n        });\n\n        return self;\n      }\n\n      // If no id is passed, get all ID's to be paused.\n      var ids = self._getSoundIds(id);\n\n      for (var i=0; i<ids.length; i++) {\n        // Clear the end timer.\n        self._clearTimer(ids[i]);\n\n        // Get the sound.\n        var sound = self._soundById(ids[i]);\n\n        if (sound && !sound._paused) {\n          // Reset the seek position.\n          sound._seek = self.seek(ids[i]);\n          sound._rateSeek = 0;\n          sound._paused = true;\n\n          // Stop currently running fades.\n          self._stopFade(ids[i]);\n\n          if (sound._node) {\n            if (self._webAudio) {\n              // make sure the sound has been created\n              if (!sound._node.bufferSource) {\n                return self;\n              }\n\n              if (typeof sound._node.bufferSource.stop === 'undefined') {\n                sound._node.bufferSource.noteOff(0);\n              } else {\n                sound._node.bufferSource.stop(0);\n              }\n\n              // Clean up the buffer source.\n              self._cleanBuffer(sound._node);\n            } else if (!isNaN(sound._node.duration) || sound._node.duration === Infinity) {\n              sound._node.pause();\n            }\n          }\n        }\n\n        // Fire the pause event, unless `true` is passed as the 2nd argument.\n        if (!arguments[1]) {\n          self._emit('pause', sound ? sound._id : null);\n        }\n      }\n\n      return self;\n    },\n\n    /**\n     * Stop playback and reset to start.\n     * @param  {Number} id The sound ID (empty to stop all in group).\n     * @param  {Boolean} internal Internal Use: true prevents event firing.\n     * @return {Howl}\n     */\n    stop: function(id, internal) {\n      var self = this;\n\n      // If the sound hasn't loaded, add it to the load queue to stop when capable.\n      if (self._state !== 'loaded') {\n        self._queue.push({\n          event: 'stop',\n          action: function() {\n            self.stop(id);\n          }\n        });\n\n        return self;\n      }\n\n      // If no id is passed, get all ID's to be stopped.\n      var ids = self._getSoundIds(id);\n\n      for (var i=0; i<ids.length; i++) {\n        // Clear the end timer.\n        self._clearTimer(ids[i]);\n\n        // Get the sound.\n        var sound = self._soundById(ids[i]);\n\n        if (sound) {\n          // Reset the seek position.\n          sound._seek = sound._start || 0;\n          sound._rateSeek = 0;\n          sound._paused = true;\n          sound._ended = true;\n\n          // Stop currently running fades.\n          self._stopFade(ids[i]);\n\n          if (sound._node) {\n            if (self._webAudio) {\n              // make sure the sound has been created\n              if (!sound._node.bufferSource) {\n                if (!internal) {\n                  self._emit('stop', sound._id);\n                }\n\n                return self;\n              }\n\n              if (typeof sound._node.bufferSource.stop === 'undefined') {\n                sound._node.bufferSource.noteOff(0);\n              } else {\n                sound._node.bufferSource.stop(0);\n              }\n\n              // Clean up the buffer source.\n              self._cleanBuffer(sound._node);\n            } else if (!isNaN(sound._node.duration) || sound._node.duration === Infinity) {\n              sound._node.currentTime = sound._start || 0;\n              sound._node.pause();\n            }\n          }\n        }\n\n        if (sound && !internal) {\n          self._emit('stop', sound._id);\n        }\n      }\n\n      return self;\n    },\n\n    /**\n     * Mute/unmute a single sound or all sounds in this Howl group.\n     * @param  {Boolean} muted Set to true to mute and false to unmute.\n     * @param  {Number} id    The sound ID to update (omit to mute/unmute all).\n     * @return {Howl}\n     */\n    mute: function(muted, id) {\n      var self = this;\n\n      // If the sound hasn't loaded, add it to the load queue to mute when capable.\n      if (self._state !== 'loaded') {\n        self._queue.push({\n          event: 'mute',\n          action: function() {\n            self.mute(muted, id);\n          }\n        });\n\n        return self;\n      }\n\n      // If applying mute/unmute to all sounds, update the group's value.\n      if (typeof id === 'undefined') {\n        if (typeof muted === 'boolean') {\n          self._muted = muted;\n        } else {\n          return self._muted;\n        }\n      }\n\n      // If no id is passed, get all ID's to be muted.\n      var ids = self._getSoundIds(id);\n\n      for (var i=0; i<ids.length; i++) {\n        // Get the sound.\n        var sound = self._soundById(ids[i]);\n\n        if (sound) {\n          sound._muted = muted;\n\n          if (self._webAudio && sound._node) {\n            sound._node.gain.setValueAtTime(muted ? 0 : sound._volume, Howler.ctx.currentTime);\n          } else if (sound._node) {\n            sound._node.muted = Howler._muted ? true : muted;\n          }\n\n          self._emit('mute', sound._id);\n        }\n      }\n\n      return self;\n    },\n\n    /**\n     * Get/set the volume of this sound or of the Howl group. This method can optionally take 0, 1 or 2 arguments.\n     *   volume() -> Returns the group's volume value.\n     *   volume(id) -> Returns the sound id's current volume.\n     *   volume(vol) -> Sets the volume of all sounds in this Howl group.\n     *   volume(vol, id) -> Sets the volume of passed sound id.\n     * @return {Howl/Number} Returns self or current volume.\n     */\n    volume: function() {\n      var self = this;\n      var args = arguments;\n      var vol, id;\n\n      // Determine the values based on arguments.\n      if (args.length === 0) {\n        // Return the value of the groups' volume.\n        return self._volume;\n      } else if (args.length === 1 || args.length === 2 && typeof args[1] === 'undefined') {\n        // First check if this is an ID, and if not, assume it is a new volume.\n        var ids = self._getSoundIds();\n        var index = ids.indexOf(args[0]);\n        if (index >= 0) {\n          id = parseInt(args[0], 10);\n        } else {\n          vol = parseFloat(args[0]);\n        }\n      } else if (args.length >= 2) {\n        vol = parseFloat(args[0]);\n        id = parseInt(args[1], 10);\n      }\n\n      // Update the volume or return the current volume.\n      var sound;\n      if (typeof vol !== 'undefined' && vol >= 0 && vol <= 1) {\n        // If the sound hasn't loaded, add it to the load queue to change volume when capable.\n        if (self._state !== 'loaded') {\n          self._queue.push({\n            event: 'volume',\n            action: function() {\n              self.volume.apply(self, args);\n            }\n          });\n\n          return self;\n        }\n\n        // Set the group volume.\n        if (typeof id === 'undefined') {\n          self._volume = vol;\n        }\n\n        // Update one or all volumes.\n        id = self._getSoundIds(id);\n        for (var i=0; i<id.length; i++) {\n          // Get the sound.\n          sound = self._soundById(id[i]);\n\n          if (sound) {\n            sound._volume = vol;\n\n            // Stop currently running fades.\n            if (!args[2]) {\n              self._stopFade(id[i]);\n            }\n\n            if (self._webAudio && sound._node && !sound._muted) {\n              sound._node.gain.setValueAtTime(vol, Howler.ctx.currentTime);\n            } else if (sound._node && !sound._muted) {\n              sound._node.volume = vol * Howler.volume();\n            }\n\n            self._emit('volume', sound._id);\n          }\n        }\n      } else {\n        sound = id ? self._soundById(id) : self._sounds[0];\n        return sound ? sound._volume : 0;\n      }\n\n      return self;\n    },\n\n    /**\n     * Fade a currently playing sound between two volumes (if no id is passsed, all sounds will fade).\n     * @param  {Number} from The value to fade from (0.0 to 1.0).\n     * @param  {Number} to   The volume to fade to (0.0 to 1.0).\n     * @param  {Number} len  Time in milliseconds to fade.\n     * @param  {Number} id   The sound id (omit to fade all sounds).\n     * @return {Howl}\n     */\n    fade: function(from, to, len, id) {\n      var self = this;\n      var diff = Math.abs(from - to);\n      var dir = from > to ? 'out' : 'in';\n      var steps = diff / 0.01;\n      var stepLen = (steps > 0) ? len / steps : len;\n\n      // Since browsers clamp timeouts to 4ms, we need to clamp our steps to that too.\n      if (stepLen < 4) {\n        steps = Math.ceil(steps / (4 / stepLen));\n        stepLen = 4;\n      }\n\n      // If the sound hasn't loaded, add it to the load queue to fade when capable.\n      if (self._state !== 'loaded') {\n        self._queue.push({\n          event: 'fade',\n          action: function() {\n            self.fade(from, to, len, id);\n          }\n        });\n\n        return self;\n      }\n\n      // Set the volume to the start position.\n      self.volume(from, id);\n\n      // Fade the volume of one or all sounds.\n      var ids = self._getSoundIds(id);\n      for (var i=0; i<ids.length; i++) {\n        // Get the sound.\n        var sound = self._soundById(ids[i]);\n\n        // Create a linear fade or fall back to timeouts with HTML5 Audio.\n        if (sound) {\n          // Stop the previous fade if no sprite is being used (otherwise, volume handles this).\n          if (!id) {\n            self._stopFade(ids[i]);\n          }\n\n          // If we are using Web Audio, let the native methods do the actual fade.\n          if (self._webAudio && !sound._muted) {\n            var currentTime = Howler.ctx.currentTime;\n            var end = currentTime + (len / 1000);\n            sound._volume = from;\n            sound._node.gain.setValueAtTime(from, currentTime);\n            sound._node.gain.linearRampToValueAtTime(to, end);\n          }\n\n          var vol = from;\n          sound._interval = setInterval(function(soundId, sound) {\n            // Update the volume amount, but only if the volume should change.\n            if (steps > 0) {\n              vol += (dir === 'in' ? 0.01 : -0.01);\n            }\n\n            // Make sure the volume is in the right bounds.\n            vol = Math.max(0, vol);\n            vol = Math.min(1, vol);\n\n            // Round to within 2 decimal points.\n            vol = Math.round(vol * 100) / 100;\n\n            // Change the volume.\n            if (self._webAudio) {\n              if (typeof id === 'undefined') {\n                self._volume = vol;\n              }\n\n              sound._volume = vol;\n            } else {\n              self.volume(vol, soundId, true);\n            }\n\n            // When the fade is complete, stop it and fire event.\n            if (vol === to) {\n              clearInterval(sound._interval);\n              sound._interval = null;\n              self.volume(vol, soundId);\n              self._emit('fade', soundId);\n            }\n          }.bind(self, ids[i], sound), stepLen);\n        }\n      }\n\n      return self;\n    },\n\n    /**\n     * Internal method that stops the currently playing fade when\n     * a new fade starts, volume is changed or the sound is stopped.\n     * @param  {Number} id The sound id.\n     * @return {Howl}\n     */\n    _stopFade: function(id) {\n      var self = this;\n      var sound = self._soundById(id);\n\n      if (sound && sound._interval) {\n        if (self._webAudio) {\n          sound._node.gain.cancelScheduledValues(Howler.ctx.currentTime);\n        }\n\n        clearInterval(sound._interval);\n        sound._interval = null;\n        self._emit('fade', id);\n      }\n\n      return self;\n    },\n\n    /**\n     * Get/set the loop parameter on a sound. This method can optionally take 0, 1 or 2 arguments.\n     *   loop() -> Returns the group's loop value.\n     *   loop(id) -> Returns the sound id's loop value.\n     *   loop(loop) -> Sets the loop value for all sounds in this Howl group.\n     *   loop(loop, id) -> Sets the loop value of passed sound id.\n     * @return {Howl/Boolean} Returns self or current loop value.\n     */\n    loop: function() {\n      var self = this;\n      var args = arguments;\n      var loop, id, sound;\n\n      // Determine the values for loop and id.\n      if (args.length === 0) {\n        // Return the grou's loop value.\n        return self._loop;\n      } else if (args.length === 1) {\n        if (typeof args[0] === 'boolean') {\n          loop = args[0];\n          self._loop = loop;\n        } else {\n          // Return this sound's loop value.\n          sound = self._soundById(parseInt(args[0], 10));\n          return sound ? sound._loop : false;\n        }\n      } else if (args.length === 2) {\n        loop = args[0];\n        id = parseInt(args[1], 10);\n      }\n\n      // If no id is passed, get all ID's to be looped.\n      var ids = self._getSoundIds(id);\n      for (var i=0; i<ids.length; i++) {\n        sound = self._soundById(ids[i]);\n\n        if (sound) {\n          sound._loop = loop;\n          if (self._webAudio && sound._node && sound._node.bufferSource) {\n            sound._node.bufferSource.loop = loop;\n            if (loop) {\n              sound._node.bufferSource.loopStart = sound._start || 0;\n              sound._node.bufferSource.loopEnd = sound._stop;\n            }\n          }\n        }\n      }\n\n      return self;\n    },\n\n    /**\n     * Get/set the playback rate of a sound. This method can optionally take 0, 1 or 2 arguments.\n     *   rate() -> Returns the first sound node's current playback rate.\n     *   rate(id) -> Returns the sound id's current playback rate.\n     *   rate(rate) -> Sets the playback rate of all sounds in this Howl group.\n     *   rate(rate, id) -> Sets the playback rate of passed sound id.\n     * @return {Howl/Number} Returns self or the current playback rate.\n     */\n    rate: function() {\n      var self = this;\n      var args = arguments;\n      var rate, id;\n\n      // Determine the values based on arguments.\n      if (args.length === 0) {\n        // We will simply return the current rate of the first node.\n        id = self._sounds[0]._id;\n      } else if (args.length === 1) {\n        // First check if this is an ID, and if not, assume it is a new rate value.\n        var ids = self._getSoundIds();\n        var index = ids.indexOf(args[0]);\n        if (index >= 0) {\n          id = parseInt(args[0], 10);\n        } else {\n          rate = parseFloat(args[0]);\n        }\n      } else if (args.length === 2) {\n        rate = parseFloat(args[0]);\n        id = parseInt(args[1], 10);\n      }\n\n      // Update the playback rate or return the current value.\n      var sound;\n      if (typeof rate === 'number') {\n        // If the sound hasn't loaded, add it to the load queue to change playback rate when capable.\n        if (self._state !== 'loaded') {\n          self._queue.push({\n            event: 'rate',\n            action: function() {\n              self.rate.apply(self, args);\n            }\n          });\n\n          return self;\n        }\n\n        // Set the group rate.\n        if (typeof id === 'undefined') {\n          self._rate = rate;\n        }\n\n        // Update one or all volumes.\n        id = self._getSoundIds(id);\n        for (var i=0; i<id.length; i++) {\n          // Get the sound.\n          sound = self._soundById(id[i]);\n\n          if (sound) {\n            // Keep track of our position when the rate changed and update the playback\n            // start position so we can properly adjust the seek position for time elapsed.\n            sound._rateSeek = self.seek(id[i]);\n            sound._playStart = self._webAudio ? Howler.ctx.currentTime : sound._playStart;\n            sound._rate = rate;\n\n            // Change the playback rate.\n            if (self._webAudio && sound._node && sound._node.bufferSource) {\n              sound._node.bufferSource.playbackRate.value = rate;\n            } else if (sound._node) {\n              sound._node.playbackRate = rate;\n            }\n\n            // Reset the timers.\n            var seek = self.seek(id[i]);\n            var duration = ((self._sprite[sound._sprite][0] + self._sprite[sound._sprite][1]) / 1000) - seek;\n            var timeout = (duration * 1000) / Math.abs(sound._rate);\n\n            // Start a new end timer if sound is already playing.\n            if (self._endTimers[id[i]] || !sound._paused) {\n              self._clearTimer(id[i]);\n              self._endTimers[id[i]] = setTimeout(self._ended.bind(self, sound), timeout);\n            }\n\n            self._emit('rate', sound._id);\n          }\n        }\n      } else {\n        sound = self._soundById(id);\n        return sound ? sound._rate : self._rate;\n      }\n\n      return self;\n    },\n\n    /**\n     * Get/set the seek position of a sound. This method can optionally take 0, 1 or 2 arguments.\n     *   seek() -> Returns the first sound node's current seek position.\n     *   seek(id) -> Returns the sound id's current seek position.\n     *   seek(seek) -> Sets the seek position of the first sound node.\n     *   seek(seek, id) -> Sets the seek position of passed sound id.\n     * @return {Howl/Number} Returns self or the current seek position.\n     */\n    seek: function() {\n      var self = this;\n      var args = arguments;\n      var seek, id;\n\n      // Determine the values based on arguments.\n      if (args.length === 0) {\n        // We will simply return the current position of the first node.\n        id = self._sounds[0]._id;\n      } else if (args.length === 1) {\n        // First check if this is an ID, and if not, assume it is a new seek position.\n        var ids = self._getSoundIds();\n        var index = ids.indexOf(args[0]);\n        if (index >= 0) {\n          id = parseInt(args[0], 10);\n        } else {\n          id = self._sounds[0]._id;\n          seek = parseFloat(args[0]);\n        }\n      } else if (args.length === 2) {\n        seek = parseFloat(args[0]);\n        id = parseInt(args[1], 10);\n      }\n\n      // If there is no ID, bail out.\n      if (typeof id === 'undefined') {\n        return self;\n      }\n\n      // If the sound hasn't loaded, add it to the load queue to seek when capable.\n      if (self._state !== 'loaded') {\n        self._queue.push({\n          event: 'seek',\n          action: function() {\n            self.seek.apply(self, args);\n          }\n        });\n\n        return self;\n      }\n\n      // Get the sound.\n      var sound = self._soundById(id);\n\n      if (sound) {\n        if (typeof seek === 'number' && seek >= 0) {\n          // Pause the sound and update position for restarting playback.\n          var playing = self.playing(id);\n          if (playing) {\n            self.pause(id, true);\n          }\n\n          // Move the position of the track and cancel timer.\n          sound._seek = seek;\n          sound._ended = false;\n          self._clearTimer(id);\n\n          // Restart the playback if the sound was playing.\n          if (playing) {\n            self.play(id, true);\n          }\n\n          // Update the seek position for HTML5 Audio.\n          if (!self._webAudio && sound._node) {\n            sound._node.currentTime = seek;\n          }\n\n          self._emit('seek', id);\n        } else {\n          if (self._webAudio) {\n            var realTime = self.playing(id) ? Howler.ctx.currentTime - sound._playStart : 0;\n            var rateSeek = sound._rateSeek ? sound._rateSeek - sound._seek : 0;\n            return sound._seek + (rateSeek + realTime * Math.abs(sound._rate));\n          } else {\n            return sound._node.currentTime;\n          }\n        }\n      }\n\n      return self;\n    },\n\n    /**\n     * Check if a specific sound is currently playing or not (if id is provided), or check if at least one of the sounds in the group is playing or not.\n     * @param  {Number}  id The sound id to check. If none is passed, the whole sound group is checked.\n     * @return {Boolean} True if playing and false if not.\n     */\n    playing: function(id) {\n      var self = this;\n\n      // Check the passed sound ID (if any).\n      if (typeof id === 'number') {\n        var sound = self._soundById(id);\n        return sound ? !sound._paused : false;\n      }\n\n      // Otherwise, loop through all sounds and check if any are playing.\n      for (var i=0; i<self._sounds.length; i++) {\n        if (!self._sounds[i]._paused) {\n          return true;\n        }\n      }\n\n      return false;\n    },\n\n    /**\n     * Get the duration of this sound. Passing a sound id will return the sprite duration.\n     * @param  {Number} id The sound id to check. If none is passed, return full source duration.\n     * @return {Number} Audio duration in seconds.\n     */\n    duration: function(id) {\n      var self = this;\n      var duration = self._duration;\n\n      // If we pass an ID, get the sound and return the sprite length.\n      var sound = self._soundById(id);\n      if (sound) {\n        duration = self._sprite[sound._sprite][1] / 1000;\n      }\n\n      return duration;\n    },\n\n    /**\n     * Returns the current loaded state of this Howl.\n     * @return {String} 'unloaded', 'loading', 'loaded'\n     */\n    state: function() {\n      return this._state;\n    },\n\n    /**\n     * Unload and destroy the current Howl object.\n     * This will immediately stop all sound instances attached to this group.\n     */\n    unload: function() {\n      var self = this;\n\n      // Stop playing any active sounds.\n      var sounds = self._sounds;\n      for (var i=0; i<sounds.length; i++) {\n        // Stop the sound if it is currently playing.\n        if (!sounds[i]._paused) {\n          self.stop(sounds[i]._id);\n          self._emit('end', sounds[i]._id);\n        }\n\n        // Remove the source or disconnect.\n        if (!self._webAudio) {\n          // Set the source to 0-second silence to stop any downloading.\n          sounds[i]._node.src = 'data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQAAAAA=';\n\n          // Remove any event listeners.\n          sounds[i]._node.removeEventListener('error', sounds[i]._errorFn, false);\n          sounds[i]._node.removeEventListener(Howler._canPlayEvent, sounds[i]._loadFn, false);\n        }\n\n        // Empty out all of the nodes.\n        delete sounds[i]._node;\n\n        // Make sure all timers are cleared out.\n        self._clearTimer(sounds[i]._id);\n\n        // Remove the references in the global Howler object.\n        var index = Howler._howls.indexOf(self);\n        if (index >= 0) {\n          Howler._howls.splice(index, 1);\n        }\n      }\n\n      // Delete this sound from the cache (if no other Howl is using it).\n      var remCache = true;\n      for (i=0; i<Howler._howls.length; i++) {\n        if (Howler._howls[i]._src === self._src) {\n          remCache = false;\n          break;\n        }\n      }\n\n      if (cache && remCache) {\n        delete cache[self._src];\n      }\n\n      // Clear global errors.\n      Howler.noAudio = false;\n\n      // Clear out `self`.\n      self._state = 'unloaded';\n      self._sounds = [];\n      self = null;\n\n      return null;\n    },\n\n    /**\n     * Listen to a custom event.\n     * @param  {String}   event Event name.\n     * @param  {Function} fn    Listener to call.\n     * @param  {Number}   id    (optional) Only listen to events for this sound.\n     * @param  {Number}   once  (INTERNAL) Marks event to fire only once.\n     * @return {Howl}\n     */\n    on: function(event, fn, id, once) {\n      var self = this;\n      var events = self['_on' + event];\n\n      if (typeof fn === 'function') {\n        events.push(once ? {id: id, fn: fn, once: once} : {id: id, fn: fn});\n      }\n\n      return self;\n    },\n\n    /**\n     * Remove a custom event. Call without parameters to remove all events.\n     * @param  {String}   event Event name.\n     * @param  {Function} fn    Listener to remove. Leave empty to remove all.\n     * @param  {Number}   id    (optional) Only remove events for this sound.\n     * @return {Howl}\n     */\n    off: function(event, fn, id) {\n      var self = this;\n      var events = self['_on' + event];\n      var i = 0;\n\n      if (fn) {\n        // Loop through event store and remove the passed function.\n        for (i=0; i<events.length; i++) {\n          if (fn === events[i].fn && id === events[i].id) {\n            events.splice(i, 1);\n            break;\n          }\n        }\n      } else if (event) {\n        // Clear out all events of this type.\n        self['_on' + event] = [];\n      } else {\n        // Clear out all events of every type.\n        var keys = Object.keys(self);\n        for (i=0; i<keys.length; i++) {\n          if ((keys[i].indexOf('_on') === 0) && Array.isArray(self[keys[i]])) {\n            self[keys[i]] = [];\n          }\n        }\n      }\n\n      return self;\n    },\n\n    /**\n     * Listen to a custom event and remove it once fired.\n     * @param  {String}   event Event name.\n     * @param  {Function} fn    Listener to call.\n     * @param  {Number}   id    (optional) Only listen to events for this sound.\n     * @return {Howl}\n     */\n    once: function(event, fn, id) {\n      var self = this;\n\n      // Setup the event listener.\n      self.on(event, fn, id, 1);\n\n      return self;\n    },\n\n    /**\n     * Emit all events of a specific type and pass the sound id.\n     * @param  {String} event Event name.\n     * @param  {Number} id    Sound ID.\n     * @param  {Number} msg   Message to go with event.\n     * @return {Howl}\n     */\n    _emit: function(event, id, msg) {\n      var self = this;\n      var events = self['_on' + event];\n\n      // Loop through event store and fire all functions.\n      for (var i=events.length-1; i>=0; i--) {\n        if (!events[i].id || events[i].id === id || event === 'load') {\n          setTimeout(function(fn) {\n            fn.call(this, id, msg);\n          }.bind(self, events[i].fn), 0);\n\n          // If this event was setup with `once`, remove it.\n          if (events[i].once) {\n            self.off(event, events[i].fn, events[i].id);\n          }\n        }\n      }\n\n      return self;\n    },\n\n    /**\n     * Queue of actions initiated before the sound has loaded.\n     * These will be called in sequence, with the next only firing\n     * after the previous has finished executing (even if async like play).\n     * @return {Howl}\n     */\n    _loadQueue: function() {\n      var self = this;\n\n      if (self._queue.length > 0) {\n        var task = self._queue[0];\n\n        // don't move onto the next task until this one is done\n        self.once(task.event, function() {\n          self._queue.shift();\n          self._loadQueue();\n        });\n\n        task.action();\n      }\n\n      return self;\n    },\n\n    /**\n     * Fired when playback ends at the end of the duration.\n     * @param  {Sound} sound The sound object to work with.\n     * @return {Howl}\n     */\n    _ended: function(sound) {\n      var self = this;\n      var sprite = sound._sprite;\n\n      // Should this sound loop?\n      var loop = !!(sound._loop || self._sprite[sprite][2]);\n\n      // Fire the ended event.\n      self._emit('end', sound._id);\n\n      // Restart the playback for HTML5 Audio loop.\n      if (!self._webAudio && loop) {\n        self.stop(sound._id, true).play(sound._id);\n      }\n\n      // Restart this timer if on a Web Audio loop.\n      if (self._webAudio && loop) {\n        self._emit('play', sound._id);\n        sound._seek = sound._start || 0;\n        sound._rateSeek = 0;\n        sound._playStart = Howler.ctx.currentTime;\n\n        var timeout = ((sound._stop - sound._start) * 1000) / Math.abs(sound._rate);\n        self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n      }\n\n      // Mark the node as paused.\n      if (self._webAudio && !loop) {\n        sound._paused = true;\n        sound._ended = true;\n        sound._seek = sound._start || 0;\n        sound._rateSeek = 0;\n        self._clearTimer(sound._id);\n\n        // Clean up the buffer source.\n        self._cleanBuffer(sound._node);\n\n        // Attempt to auto-suspend AudioContext if no sounds are still playing.\n        Howler._autoSuspend();\n      }\n\n      // When using a sprite, end the track.\n      if (!self._webAudio && !loop) {\n        self.stop(sound._id);\n      }\n\n      return self;\n    },\n\n    /**\n     * Clear the end timer for a sound playback.\n     * @param  {Number} id The sound ID.\n     * @return {Howl}\n     */\n    _clearTimer: function(id) {\n      var self = this;\n\n      if (self._endTimers[id]) {\n        clearTimeout(self._endTimers[id]);\n        delete self._endTimers[id];\n      }\n\n      return self;\n    },\n\n    /**\n     * Return the sound identified by this ID, or return null.\n     * @param  {Number} id Sound ID\n     * @return {Object}    Sound object or null.\n     */\n    _soundById: function(id) {\n      var self = this;\n\n      // Loop through all sounds and find the one with this ID.\n      for (var i=0; i<self._sounds.length; i++) {\n        if (id === self._sounds[i]._id) {\n          return self._sounds[i];\n        }\n      }\n\n      return null;\n    },\n\n    /**\n     * Return an inactive sound from the pool or create a new one.\n     * @return {Sound} Sound playback object.\n     */\n    _inactiveSound: function() {\n      var self = this;\n\n      self._drain();\n\n      // Find the first inactive node to recycle.\n      for (var i=0; i<self._sounds.length; i++) {\n        if (self._sounds[i]._ended) {\n          return self._sounds[i].reset();\n        }\n      }\n\n      // If no inactive node was found, create a new one.\n      return new Sound(self);\n    },\n\n    /**\n     * Drain excess inactive sounds from the pool.\n     */\n    _drain: function() {\n      var self = this;\n      var limit = self._pool;\n      var cnt = 0;\n      var i = 0;\n\n      // If there are less sounds than the max pool size, we are done.\n      if (self._sounds.length < limit) {\n        return;\n      }\n\n      // Count the number of inactive sounds.\n      for (i=0; i<self._sounds.length; i++) {\n        if (self._sounds[i]._ended) {\n          cnt++;\n        }\n      }\n\n      // Remove excess inactive sounds, going in reverse order.\n      for (i=self._sounds.length - 1; i>=0; i--) {\n        if (cnt <= limit) {\n          return;\n        }\n\n        if (self._sounds[i]._ended) {\n          // Disconnect the audio source when using Web Audio.\n          if (self._webAudio && self._sounds[i]._node) {\n            self._sounds[i]._node.disconnect(0);\n          }\n\n          // Remove sounds until we have the pool size.\n          self._sounds.splice(i, 1);\n          cnt--;\n        }\n      }\n    },\n\n    /**\n     * Get all ID's from the sounds pool.\n     * @param  {Number} id Only return one ID if one is passed.\n     * @return {Array}    Array of IDs.\n     */\n    _getSoundIds: function(id) {\n      var self = this;\n\n      if (typeof id === 'undefined') {\n        var ids = [];\n        for (var i=0; i<self._sounds.length; i++) {\n          ids.push(self._sounds[i]._id);\n        }\n\n        return ids;\n      } else {\n        return [id];\n      }\n    },\n\n    /**\n     * Load the sound back into the buffer source.\n     * @param  {Sound} sound The sound object to work with.\n     * @return {Howl}\n     */\n    _refreshBuffer: function(sound) {\n      var self = this;\n\n      // Setup the buffer source for playback.\n      sound._node.bufferSource = Howler.ctx.createBufferSource();\n      sound._node.bufferSource.buffer = cache[self._src];\n\n      // Connect to the correct node.\n      if (sound._panner) {\n        sound._node.bufferSource.connect(sound._panner);\n      } else {\n        sound._node.bufferSource.connect(sound._node);\n      }\n\n      // Setup looping and playback rate.\n      sound._node.bufferSource.loop = sound._loop;\n      if (sound._loop) {\n        sound._node.bufferSource.loopStart = sound._start || 0;\n        sound._node.bufferSource.loopEnd = sound._stop;\n      }\n      sound._node.bufferSource.playbackRate.value = sound._rate;\n\n      return self;\n    },\n\n    /**\n     * Prevent memory leaks by cleaning up the buffer source after playback.\n     * @param  {Object} node Sound's audio node containing the buffer source.\n     * @return {Howl}\n     */\n    _cleanBuffer: function(node) {\n      var self = this;\n\n      if (self._scratchBuffer) {\n        node.bufferSource.onended = null;\n        node.bufferSource.disconnect(0);\n        try { node.bufferSource.buffer = self._scratchBuffer; } catch(e) {}\n      }\n      node.bufferSource = null;\n\n      return self;\n    }\n  };\n\n  /** Single Sound Methods **/\n  /***************************************************************************/\n\n  /**\n   * Setup the sound object, which each node attached to a Howl group is contained in.\n   * @param {Object} howl The Howl parent group.\n   */\n  var Sound = function(howl) {\n    this._parent = howl;\n    this.init();\n  };\n  Sound.prototype = {\n    /**\n     * Initialize a new Sound object.\n     * @return {Sound}\n     */\n    init: function() {\n      var self = this;\n      var parent = self._parent;\n\n      // Setup the default parameters.\n      self._muted = parent._muted;\n      self._loop = parent._loop;\n      self._volume = parent._volume;\n      self._muted = parent._muted;\n      self._rate = parent._rate;\n      self._seek = 0;\n      self._paused = true;\n      self._ended = true;\n      self._sprite = '__default';\n\n      // Generate a unique ID for this sound.\n      self._id = Math.round(Date.now() * Math.random());\n\n      // Add itself to the parent's pool.\n      parent._sounds.push(self);\n\n      // Create the new node.\n      self.create();\n\n      return self;\n    },\n\n    /**\n     * Create and setup a new sound object, whether HTML5 Audio or Web Audio.\n     * @return {Sound}\n     */\n    create: function() {\n      var self = this;\n      var parent = self._parent;\n      var volume = (Howler._muted || self._muted || self._parent._muted) ? 0 : self._volume;\n\n      if (parent._webAudio) {\n        // Create the gain node for controlling volume (the source will connect to this).\n        self._node = (typeof Howler.ctx.createGain === 'undefined') ? Howler.ctx.createGainNode() : Howler.ctx.createGain();\n        self._node.gain.setValueAtTime(volume, Howler.ctx.currentTime);\n        self._node.paused = true;\n        self._node.connect(Howler.masterGain);\n      } else {\n        self._node = new Audio();\n\n        // Listen for errors (http://dev.w3.org/html5/spec-author-view/spec.html#mediaerror).\n        self._errorFn = self._errorListener.bind(self);\n        self._node.addEventListener('error', self._errorFn, false);\n\n        // Listen for 'canplaythrough' event to let us know the sound is ready.\n        self._loadFn = self._loadListener.bind(self);\n        self._node.addEventListener(Howler._canPlayEvent, self._loadFn, false);\n\n        // Setup the new audio node.\n        self._node.src = parent._src;\n        self._node.preload = 'auto';\n        self._node.volume = volume * Howler.volume();\n\n        // Begin loading the source.\n        self._node.load();\n      }\n\n      return self;\n    },\n\n    /**\n     * Reset the parameters of this sound to the original state (for recycle).\n     * @return {Sound}\n     */\n    reset: function() {\n      var self = this;\n      var parent = self._parent;\n\n      // Reset all of the parameters of this sound.\n      self._muted = parent._muted;\n      self._loop = parent._loop;\n      self._volume = parent._volume;\n      self._muted = parent._muted;\n      self._rate = parent._rate;\n      self._seek = 0;\n      self._rateSeek = 0;\n      self._paused = true;\n      self._ended = true;\n      self._sprite = '__default';\n\n      // Generate a new ID so that it isn't confused with the previous sound.\n      self._id = Math.round(Date.now() * Math.random());\n\n      return self;\n    },\n\n    /**\n     * HTML5 Audio error listener callback.\n     */\n    _errorListener: function() {\n      var self = this;\n\n      // Fire an error event and pass back the code.\n      self._parent._emit('loaderror', self._id, self._node.error ? self._node.error.code : 0);\n\n      // Clear the event listener.\n      self._node.removeEventListener('error', self._errorListener, false);\n    },\n\n    /**\n     * HTML5 Audio canplaythrough listener callback.\n     */\n    _loadListener: function() {\n      var self = this;\n      var parent = self._parent;\n\n      // Round up the duration to account for the lower precision in HTML5 Audio.\n      parent._duration = Math.ceil(self._node.duration * 10) / 10;\n\n      // Setup a sprite if none is defined.\n      if (Object.keys(parent._sprite).length === 0) {\n        parent._sprite = {__default: [0, parent._duration * 1000]};\n      }\n\n      if (parent._state !== 'loaded') {\n        parent._state = 'loaded';\n        parent._emit('load');\n        parent._loadQueue();\n      }\n\n      // Clear the event listener.\n      self._node.removeEventListener(Howler._canPlayEvent, self._loadFn, false);\n    }\n  };\n\n  /** Helper Methods **/\n  /***************************************************************************/\n\n  var cache = {};\n\n  /**\n   * Buffer a sound from URL, Data URI or cache and decode to audio source (Web Audio API).\n   * @param  {Howl} self\n   */\n  var loadBuffer = function(self) {\n    var url = self._src;\n\n    // Check if the buffer has already been cached and use it instead.\n    if (cache[url]) {\n      // Set the duration from the cache.\n      self._duration = cache[url].duration;\n\n      // Load the sound into this Howl.\n      loadSound(self);\n\n      return;\n    }\n\n    if (/^data:[^;]+;base64,/.test(url)) {\n      // Decode the base64 data URI without XHR, since some browsers don't support it.\n      var data = atob(url.split(',')[1]);\n      var dataView = new Uint8Array(data.length);\n      for (var i=0; i<data.length; ++i) {\n        dataView[i] = data.charCodeAt(i);\n      }\n\n      decodeAudioData(dataView.buffer, self);\n    } else {\n      // Load the buffer from the URL.\n      var xhr = new XMLHttpRequest();\n      xhr.open('GET', url, true);\n      xhr.responseType = 'arraybuffer';\n      xhr.onload = function() {\n        // Make sure we get a successful response back.\n        var code = (xhr.status + '')[0];\n        if (code !== '0' && code !== '2' && code !== '3') {\n          self._emit('loaderror', null, 'Failed loading audio file with status: ' + xhr.status + '.');\n          return;\n        }\n\n        decodeAudioData(xhr.response, self);\n      };\n      xhr.onerror = function() {\n        // If there is an error, switch to HTML5 Audio.\n        if (self._webAudio) {\n          self._html5 = true;\n          self._webAudio = false;\n          self._sounds = [];\n          delete cache[url];\n          self.load();\n        }\n      };\n      safeXhrSend(xhr);\n    }\n  };\n\n  /**\n   * Send the XHR request wrapped in a try/catch.\n   * @param  {Object} xhr XHR to send.\n   */\n  var safeXhrSend = function(xhr) {\n    try {\n      xhr.send();\n    } catch (e) {\n      xhr.onerror();\n    }\n  };\n\n  /**\n   * Decode audio data from an array buffer.\n   * @param  {ArrayBuffer} arraybuffer The audio data.\n   * @param  {Howl}        self\n   */\n  var decodeAudioData = function(arraybuffer, self) {\n    // Decode the buffer into an audio source.\n    Howler.ctx.decodeAudioData(arraybuffer, function(buffer) {\n      if (buffer && self._sounds.length > 0) {\n        cache[self._src] = buffer;\n        loadSound(self, buffer);\n      }\n    }, function() {\n      self._emit('loaderror', null, 'Decoding audio data failed.');\n    });\n  };\n\n  /**\n   * Sound is now loaded, so finish setting everything up and fire the loaded event.\n   * @param  {Howl} self\n   * @param  {Object} buffer The decoded buffer sound source.\n   */\n  var loadSound = function(self, buffer) {\n    // Set the duration.\n    if (buffer && !self._duration) {\n      self._duration = buffer.duration;\n    }\n\n    // Setup a sprite if none is defined.\n    if (Object.keys(self._sprite).length === 0) {\n      self._sprite = {__default: [0, self._duration * 1000]};\n    }\n\n    // Fire the loaded event.\n    if (self._state !== 'loaded') {\n      self._state = 'loaded';\n      self._emit('load');\n      self._loadQueue();\n    }\n  };\n\n  /**\n   * Setup the audio context when available, or switch to HTML5 Audio mode.\n   */\n  var setupAudioContext = function() {\n    // Check if we are using Web Audio and setup the AudioContext if we are.\n    try {\n      if (typeof AudioContext !== 'undefined') {\n        Howler.ctx = new AudioContext();\n      } else if (typeof webkitAudioContext !== 'undefined') {\n        Howler.ctx = new webkitAudioContext();\n      } else {\n        Howler.usingWebAudio = false;\n      }\n    } catch(e) {\n      Howler.usingWebAudio = false;\n    }\n\n    // Check if a webview is being used on iOS8 or earlier (rather than the browser).\n    // If it is, disable Web Audio as it causes crashing.\n    var iOS = (/iP(hone|od|ad)/.test(Howler._navigator && Howler._navigator.platform));\n    var appVersion = Howler._navigator && Howler._navigator.appVersion.match(/OS (\\d+)_(\\d+)_?(\\d+)?/);\n    var version = appVersion ? parseInt(appVersion[1], 10) : null;\n    if (iOS && version && version < 9) {\n      var safari = /safari/.test(Howler._navigator && Howler._navigator.userAgent.toLowerCase());\n      if (Howler._navigator && Howler._navigator.standalone && !safari || Howler._navigator && !Howler._navigator.standalone && !safari) {\n        Howler.usingWebAudio = false;\n      }\n    }\n\n    // Create and expose the master GainNode when using Web Audio (useful for plugins or advanced usage).\n    if (Howler.usingWebAudio) {\n      Howler.masterGain = (typeof Howler.ctx.createGain === 'undefined') ? Howler.ctx.createGainNode() : Howler.ctx.createGain();\n      Howler.masterGain.gain.value = 1;\n      Howler.masterGain.connect(Howler.ctx.destination);\n    }\n\n    // Re-run the setup on Howler.\n    Howler._setup();\n  };\n\n  // Add support for AMD (Asynchronous Module Definition) libraries such as require.js.\n  if (true) {\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function() {\n      return {\n        Howler: Howler,\n        Howl: Howl\n      };\n    }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  }\n\n  // Add support for CommonJS libraries such as browserify.\n  if (true) {\n    exports.Howler = Howler;\n    exports.Howl = Howl;\n  }\n\n  // Define globally in case AMD is not available or unused.\n  if (typeof window !== 'undefined') {\n    window.HowlerGlobal = HowlerGlobal;\n    window.Howler = Howler;\n    window.Howl = Howl;\n    window.Sound = Sound;\n  } else if (typeof global !== 'undefined') { // Add to global in Node.js (for testing, etc).\n    global.HowlerGlobal = HowlerGlobal;\n    global.Howler = Howler;\n    global.Howl = Howl;\n    global.Sound = Sound;\n  }\n})();\n\n\n/*!\n *  Spatial Plugin - Adds support for stereo and 3D audio where Web Audio is supported.\n *  \n *  howler.js v2.0.2\n *  howlerjs.com\n *\n *  (c) 2013-2016, James Simpson of GoldFire Studios\n *  goldfirestudios.com\n *\n *  MIT License\n */\n\n(function() {\n\n  'use strict';\n\n  // Setup default properties.\n  HowlerGlobal.prototype._pos = [0, 0, 0];\n  HowlerGlobal.prototype._orientation = [0, 0, -1, 0, 1, 0];\n  \n  /** Global Methods **/\n  /***************************************************************************/\n\n  /**\n   * Helper method to update the stereo panning position of all current Howls.\n   * Future Howls will not use this value unless explicitly set.\n   * @param  {Number} pan A value of -1.0 is all the way left and 1.0 is all the way right.\n   * @return {Howler/Number}     Self or current stereo panning value.\n   */\n  HowlerGlobal.prototype.stereo = function(pan) {\n    var self = this;\n\n    // Stop right here if not using Web Audio.\n    if (!self.ctx || !self.ctx.listener) {\n      return self;\n    }\n\n    // Loop through all Howls and update their stereo panning.\n    for (var i=self._howls.length-1; i>=0; i--) {\n      self._howls[i].stereo(pan);\n    }\n\n    return self;\n  };\n\n  /**\n   * Get/set the position of the listener in 3D cartesian space. Sounds using\n   * 3D position will be relative to the listener's position.\n   * @param  {Number} x The x-position of the listener.\n   * @param  {Number} y The y-position of the listener.\n   * @param  {Number} z The z-position of the listener.\n   * @return {Howler/Array}   Self or current listener position.\n   */\n  HowlerGlobal.prototype.pos = function(x, y, z) {\n    var self = this;\n\n    // Stop right here if not using Web Audio.\n    if (!self.ctx || !self.ctx.listener) {\n      return self;\n    }\n\n    // Set the defaults for optional 'y' & 'z'.\n    y = (typeof y !== 'number') ? self._pos[1] : y;\n    z = (typeof z !== 'number') ? self._pos[2] : z;\n\n    if (typeof x === 'number') {\n      self._pos = [x, y, z];\n      self.ctx.listener.setPosition(self._pos[0], self._pos[1], self._pos[2]);\n    } else {\n      return self._pos;\n    }\n\n    return self;\n  };\n\n  /**\n   * Get/set the direction the listener is pointing in the 3D cartesian space.\n   * A front and up vector must be provided. The front is the direction the\n   * face of the listener is pointing, and up is the direction the top of the\n   * listener is pointing. Thus, these values are expected to be at right angles\n   * from each other.\n   * @param  {Number} x   The x-orientation of the listener.\n   * @param  {Number} y   The y-orientation of the listener.\n   * @param  {Number} z   The z-orientation of the listener.\n   * @param  {Number} xUp The x-orientation of the top of the listener.\n   * @param  {Number} yUp The y-orientation of the top of the listener.\n   * @param  {Number} zUp The z-orientation of the top of the listener.\n   * @return {Howler/Array}     Returns self or the current orientation vectors.\n   */\n  HowlerGlobal.prototype.orientation = function(x, y, z, xUp, yUp, zUp) {\n    var self = this;\n\n    // Stop right here if not using Web Audio.\n    if (!self.ctx || !self.ctx.listener) {\n      return self;\n    }\n\n    // Set the defaults for optional 'y' & 'z'.\n    var or = self._orientation;\n    y = (typeof y !== 'number') ? or[1] : y;\n    z = (typeof z !== 'number') ? or[2] : z;\n    xUp = (typeof xUp !== 'number') ? or[3] : xUp;\n    yUp = (typeof yUp !== 'number') ? or[4] : yUp;\n    zUp = (typeof zUp !== 'number') ? or[5] : zUp;\n\n    if (typeof x === 'number') {\n      self._orientation = [x, y, z, xUp, yUp, zUp];\n      self.ctx.listener.setOrientation(x, y, z, xUp, yUp, zUp);\n    } else {\n      return or;\n    }\n\n    return self;\n  };\n\n  /** Group Methods **/\n  /***************************************************************************/\n\n  /**\n   * Add new properties to the core init.\n   * @param  {Function} _super Core init method.\n   * @return {Howl}\n   */\n  Howl.prototype.init = (function(_super) {\n    return function(o) {\n      var self = this;\n\n      // Setup user-defined default properties.\n      self._orientation = o.orientation || [1, 0, 0];\n      self._stereo = o.stereo || null;\n      self._pos = o.pos || null;\n      self._pannerAttr = {\n        coneInnerAngle: typeof o.coneInnerAngle !== 'undefined' ? o.coneInnerAngle : 360,\n        coneOuterAngle: typeof o.coneOuterAngle !== 'undefined' ? o.coneOuterAngle : 360,\n        coneOuterGain: typeof o.coneOuterGain !== 'undefined' ? o.coneOuterGain : 0,\n        distanceModel: typeof o.distanceModel !== 'undefined' ? o.distanceModel : 'inverse',\n        maxDistance: typeof o.maxDistance !== 'undefined' ? o.maxDistance : 10000,\n        panningModel: typeof o.panningModel !== 'undefined' ? o.panningModel : 'HRTF',\n        refDistance: typeof o.refDistance !== 'undefined' ? o.refDistance : 1,\n        rolloffFactor: typeof o.rolloffFactor !== 'undefined' ? o.rolloffFactor : 1\n      };\n\n      // Setup event listeners.\n      self._onstereo = o.onstereo ? [{fn: o.onstereo}] : [];\n      self._onpos = o.onpos ? [{fn: o.onpos}] : [];\n      self._onorientation = o.onorientation ? [{fn: o.onorientation}] : [];\n\n      // Complete initilization with howler.js core's init function.\n      return _super.call(this, o);\n    };\n  })(Howl.prototype.init);\n\n  /**\n   * Get/set the stereo panning of the audio source for this sound or all in the group.\n   * @param  {Number} pan  A value of -1.0 is all the way left and 1.0 is all the way right.\n   * @param  {Number} id (optional) The sound ID. If none is passed, all in group will be updated.\n   * @return {Howl/Number}    Returns self or the current stereo panning value.\n   */\n  Howl.prototype.stereo = function(pan, id) {\n    var self = this;\n\n    // Stop right here if not using Web Audio.\n    if (!self._webAudio) {\n      return self;\n    }\n\n    // If the sound hasn't loaded, add it to the load queue to change stereo pan when capable.\n    if (self._state !== 'loaded') {\n      self._queue.push({\n        event: 'stereo',\n        action: function() {\n          self.stereo(pan, id);\n        }\n      });\n\n      return self;\n    }\n\n    // Check for PannerStereoNode support and fallback to PannerNode if it doesn't exist.\n    var pannerType = (typeof Howler.ctx.createStereoPanner === 'undefined') ? 'spatial' : 'stereo';\n\n    // Setup the group's stereo panning if no ID is passed.\n    if (typeof id === 'undefined') {\n      // Return the group's stereo panning if no parameters are passed.\n      if (typeof pan === 'number') {\n        self._stereo = pan;\n        self._pos = [pan, 0, 0];\n      } else {\n        return self._stereo;\n      }\n    }\n\n    // Change the streo panning of one or all sounds in group.\n    var ids = self._getSoundIds(id);\n    for (var i=0; i<ids.length; i++) {\n      // Get the sound.\n      var sound = self._soundById(ids[i]);\n\n      if (sound) {\n        if (typeof pan === 'number') {\n          sound._stereo = pan;\n          sound._pos = [pan, 0, 0];\n\n          if (sound._node) {\n            // If we are falling back, make sure the panningModel is equalpower.\n            sound._pannerAttr.panningModel = 'equalpower';\n\n            // Check if there is a panner setup and create a new one if not.\n            if (!sound._panner || !sound._panner.pan) {\n              setupPanner(sound, pannerType);\n            }\n\n            if (pannerType === 'spatial') {\n              sound._panner.setPosition(pan, 0, 0);\n            } else {\n              sound._panner.pan.value = pan;\n            }\n          }\n\n          self._emit('stereo', sound._id);\n        } else {\n          return sound._stereo;\n        }\n      }\n    }\n\n    return self;\n  };\n\n  /**\n   * Get/set the 3D spatial position of the audio source for this sound or\n   * all in the group. The most common usage is to set the 'x' position for\n   * left/right panning. Setting any value higher than 1.0 will begin to\n   * decrease the volume of the sound as it moves further away.\n   * @param  {Number} x  The x-position of the audio from -1000.0 to 1000.0.\n   * @param  {Number} y  The y-position of the audio from -1000.0 to 1000.0.\n   * @param  {Number} z  The z-position of the audio from -1000.0 to 1000.0.\n   * @param  {Number} id (optional) The sound ID. If none is passed, all in group will be updated.\n   * @return {Howl/Array}    Returns self or the current 3D spatial position: [x, y, z].\n   */\n  Howl.prototype.pos = function(x, y, z, id) {\n    var self = this;\n\n    // Stop right here if not using Web Audio.\n    if (!self._webAudio) {\n      return self;\n    }\n\n    // If the sound hasn't loaded, add it to the load queue to change position when capable.\n    if (self._state !== 'loaded') {\n      self._queue.push({\n        event: 'pos',\n        action: function() {\n          self.pos(x, y, z, id);\n        }\n      });\n\n      return self;\n    }\n\n    // Set the defaults for optional 'y' & 'z'.\n    y = (typeof y !== 'number') ? 0 : y;\n    z = (typeof z !== 'number') ? -0.5 : z;\n\n    // Setup the group's spatial position if no ID is passed.\n    if (typeof id === 'undefined') {\n      // Return the group's spatial position if no parameters are passed.\n      if (typeof x === 'number') {\n        self._pos = [x, y, z];\n      } else {\n        return self._pos;\n      }\n    }\n\n    // Change the spatial position of one or all sounds in group.\n    var ids = self._getSoundIds(id);\n    for (var i=0; i<ids.length; i++) {\n      // Get the sound.\n      var sound = self._soundById(ids[i]);\n\n      if (sound) {\n        if (typeof x === 'number') {\n          sound._pos = [x, y, z];\n\n          if (sound._node) {\n            // Check if there is a panner setup and create a new one if not.\n            if (!sound._panner || sound._panner.pan) {\n              setupPanner(sound, 'spatial');\n            }\n\n            sound._panner.setPosition(x, y, z);\n          }\n\n          self._emit('pos', sound._id);\n        } else {\n          return sound._pos;\n        }\n      }\n    }\n\n    return self;\n  };\n\n  /**\n   * Get/set the direction the audio source is pointing in the 3D cartesian coordinate\n   * space. Depending on how direction the sound is, based on the `cone` attributes,\n   * a sound pointing away from the listener can be quiet or silent.\n   * @param  {Number} x  The x-orientation of the source.\n   * @param  {Number} y  The y-orientation of the source.\n   * @param  {Number} z  The z-orientation of the source.\n   * @param  {Number} id (optional) The sound ID. If none is passed, all in group will be updated.\n   * @return {Howl/Array}    Returns self or the current 3D spatial orientation: [x, y, z].\n   */\n  Howl.prototype.orientation = function(x, y, z, id) {\n    var self = this;\n\n    // Stop right here if not using Web Audio.\n    if (!self._webAudio) {\n      return self;\n    }\n\n    // If the sound hasn't loaded, add it to the load queue to change orientation when capable.\n    if (self._state !== 'loaded') {\n      self._queue.push({\n        event: 'orientation',\n        action: function() {\n          self.orientation(x, y, z, id);\n        }\n      });\n\n      return self;\n    }\n\n    // Set the defaults for optional 'y' & 'z'.\n    y = (typeof y !== 'number') ? self._orientation[1] : y;\n    z = (typeof z !== 'number') ? self._orientation[2] : z;\n\n    // Setup the group's spatial orientation if no ID is passed.\n    if (typeof id === 'undefined') {\n      // Return the group's spatial orientation if no parameters are passed.\n      if (typeof x === 'number') {\n        self._orientation = [x, y, z];\n      } else {\n        return self._orientation;\n      }\n    }\n\n    // Change the spatial orientation of one or all sounds in group.\n    var ids = self._getSoundIds(id);\n    for (var i=0; i<ids.length; i++) {\n      // Get the sound.\n      var sound = self._soundById(ids[i]);\n\n      if (sound) {\n        if (typeof x === 'number') {\n          sound._orientation = [x, y, z];\n\n          if (sound._node) {\n            // Check if there is a panner setup and create a new one if not.\n            if (!sound._panner) {\n              // Make sure we have a position to setup the node with.\n              if (!sound._pos) {\n                sound._pos = self._pos || [0, 0, -0.5];\n              }\n\n              setupPanner(sound, 'spatial');\n            }\n\n            sound._panner.setOrientation(x, y, z);\n          }\n\n          self._emit('orientation', sound._id);\n        } else {\n          return sound._orientation;\n        }\n      }\n    }\n\n    return self;\n  };\n\n  /**\n   * Get/set the panner node's attributes for a sound or group of sounds.\n   * This method can optionall take 0, 1 or 2 arguments.\n   *   pannerAttr() -> Returns the group's values.\n   *   pannerAttr(id) -> Returns the sound id's values.\n   *   pannerAttr(o) -> Set's the values of all sounds in this Howl group.\n   *   pannerAttr(o, id) -> Set's the values of passed sound id.\n   *\n   *   Attributes:\n   *     coneInnerAngle - (360 by default) There will be no volume reduction inside this angle.\n   *     coneOuterAngle - (360 by default) The volume will be reduced to a constant value of\n   *                      `coneOuterGain` outside this angle.\n   *     coneOuterGain - (0 by default) The amount of volume reduction outside of `coneOuterAngle`.\n   *     distanceModel - ('inverse' by default) Determines algorithm to use to reduce volume as audio moves\n   *                      away from listener. Can be `linear`, `inverse` or `exponential`.\n   *     maxDistance - (10000 by default) Volume won't reduce between source/listener beyond this distance.\n   *     panningModel - ('HRTF' by default) Determines which spatialization algorithm is used to position audio.\n   *                     Can be `HRTF` or `equalpower`.\n   *     refDistance - (1 by default) A reference distance for reducing volume as the source\n   *                    moves away from the listener.\n   *     rolloffFactor - (1 by default) How quickly the volume reduces as source moves from listener.\n   * \n   * @return {Howl/Object} Returns self or current panner attributes.\n   */\n  Howl.prototype.pannerAttr = function() {\n    var self = this;\n    var args = arguments;\n    var o, id, sound;\n\n    // Stop right here if not using Web Audio.\n    if (!self._webAudio) {\n      return self;\n    }\n\n    // Determine the values based on arguments.\n    if (args.length === 0) {\n      // Return the group's panner attribute values.\n      return self._pannerAttr;\n    } else if (args.length === 1) {\n      if (typeof args[0] === 'object') {\n        o = args[0];\n\n        // Set the grou's panner attribute values.\n        if (typeof id === 'undefined') {\n          self._pannerAttr = {\n            coneInnerAngle: typeof o.coneInnerAngle !== 'undefined' ? o.coneInnerAngle : self._coneInnerAngle,\n            coneOuterAngle: typeof o.coneOuterAngle !== 'undefined' ? o.coneOuterAngle : self._coneOuterAngle,\n            coneOuterGain: typeof o.coneOuterGain !== 'undefined' ? o.coneOuterGain : self._coneOuterGain,\n            distanceModel: typeof o.distanceModel !== 'undefined' ? o.distanceModel : self._distanceModel,\n            maxDistance: typeof o.maxDistance !== 'undefined' ? o.maxDistance : self._maxDistance,\n            panningModel: typeof o.panningModel !== 'undefined' ? o.panningModel : self._panningModel,\n            refDistance: typeof o.refDistance !== 'undefined' ? o.refDistance : self._refDistance,\n            rolloffFactor: typeof o.rolloffFactor !== 'undefined' ? o.rolloffFactor : self._rolloffFactor\n          };\n        }\n      } else {\n        // Return this sound's panner attribute values.\n        sound = self._soundById(parseInt(args[0], 10));\n        return sound ? sound._pannerAttr : self._pannerAttr;\n      }\n    } else if (args.length === 2) {\n      o = args[0];\n      id = parseInt(args[1], 10);\n    }\n\n    // Update the values of the specified sounds.\n    var ids = self._getSoundIds(id);\n    for (var i=0; i<ids.length; i++) {\n      sound = self._soundById(ids[i]);\n\n      if (sound) {\n        // Merge the new values into the sound.\n        var pa = sound._pannerAttr;\n        pa = {\n          coneInnerAngle: typeof o.coneInnerAngle !== 'undefined' ? o.coneInnerAngle : pa.coneInnerAngle,\n          coneOuterAngle: typeof o.coneOuterAngle !== 'undefined' ? o.coneOuterAngle : pa.coneOuterAngle,\n          coneOuterGain: typeof o.coneOuterGain !== 'undefined' ? o.coneOuterGain : pa.coneOuterGain,\n          distanceModel: typeof o.distanceModel !== 'undefined' ? o.distanceModel : pa.distanceModel,\n          maxDistance: typeof o.maxDistance !== 'undefined' ? o.maxDistance : pa.maxDistance,\n          panningModel: typeof o.panningModel !== 'undefined' ? o.panningModel : pa.panningModel,\n          refDistance: typeof o.refDistance !== 'undefined' ? o.refDistance : pa.refDistance,\n          rolloffFactor: typeof o.rolloffFactor !== 'undefined' ? o.rolloffFactor : pa.rolloffFactor\n        };\n\n        // Update the panner values or create a new panner if none exists.\n        var panner = sound._panner;\n        if (panner) {\n          panner.coneInnerAngle = pa.coneInnerAngle;\n          panner.coneOuterAngle = pa.coneOuterAngle;\n          panner.coneOuterGain = pa.coneOuterGain;\n          panner.distanceModel = pa.distanceModel;\n          panner.maxDistance = pa.maxDistance;\n          panner.panningModel = pa.panningModel;\n          panner.refDistance = pa.refDistance;\n          panner.rolloffFactor = pa.rolloffFactor;\n        } else {\n          // Make sure we have a position to setup the node with.\n          if (!sound._pos) {\n            sound._pos = self._pos || [0, 0, -0.5];\n          }\n\n          // Create a new panner node.\n          setupPanner(sound, 'spatial');\n        }\n      }\n    }\n\n    return self;\n  };\n\n  /** Single Sound Methods **/\n  /***************************************************************************/\n\n  /**\n   * Add new properties to the core Sound init.\n   * @param  {Function} _super Core Sound init method.\n   * @return {Sound}\n   */\n  Sound.prototype.init = (function(_super) {\n    return function() {\n      var self = this;\n      var parent = self._parent;\n\n      // Setup user-defined default properties.\n      self._orientation = parent._orientation;\n      self._stereo = parent._stereo;\n      self._pos = parent._pos;\n      self._pannerAttr = parent._pannerAttr;\n\n      // Complete initilization with howler.js core Sound's init function.\n      _super.call(this);\n\n      // If a stereo or position was specified, set it up.\n      if (self._stereo) {\n        parent.stereo(self._stereo);\n      } else if (self._pos) {\n        parent.pos(self._pos[0], self._pos[1], self._pos[2], self._id);\n      }\n    };\n  })(Sound.prototype.init);\n\n  /**\n   * Override the Sound.reset method to clean up properties from the spatial plugin.\n   * @param  {Function} _super Sound reset method.\n   * @return {Sound}\n   */\n  Sound.prototype.reset = (function(_super) {\n    return function() {\n      var self = this;\n      var parent = self._parent;\n\n      // Reset all spatial plugin properties on this sound.\n      self._orientation = parent._orientation;\n      self._pos = parent._pos;\n      self._pannerAttr = parent._pannerAttr;\n\n      // Complete resetting of the sound.\n      return _super.call(this);\n    };\n  })(Sound.prototype.reset);\n\n  /** Helper Methods **/\n  /***************************************************************************/\n\n  /**\n   * Create a new panner node and save it on the sound.\n   * @param  {Sound} sound Specific sound to setup panning on.\n   * @param {String} type Type of panner to create: 'stereo' or 'spatial'.\n   */\n  var setupPanner = function(sound, type) {\n    type = type || 'spatial';\n\n    // Create the new panner node.\n    if (type === 'spatial') {\n      sound._panner = Howler.ctx.createPanner();\n      sound._panner.coneInnerAngle = sound._pannerAttr.coneInnerAngle;\n      sound._panner.coneOuterAngle = sound._pannerAttr.coneOuterAngle;\n      sound._panner.coneOuterGain = sound._pannerAttr.coneOuterGain;\n      sound._panner.distanceModel = sound._pannerAttr.distanceModel;\n      sound._panner.maxDistance = sound._pannerAttr.maxDistance;\n      sound._panner.panningModel = sound._pannerAttr.panningModel;\n      sound._panner.refDistance = sound._pannerAttr.refDistance;\n      sound._panner.rolloffFactor = sound._pannerAttr.rolloffFactor;\n      sound._panner.setPosition(sound._pos[0], sound._pos[1], sound._pos[2]);\n      sound._panner.setOrientation(sound._orientation[0], sound._orientation[1], sound._orientation[2]);\n    } else {\n      sound._panner = Howler.ctx.createStereoPanner();\n      sound._panner.pan.value = sound._stereo;\n    }\n\n    sound._panner.connect(sound._node);\n\n    // Update the connections.\n    if (!sound._paused) {\n      sound._parent.pause(sound._id, true).play(sound._id);\n    }\n  };\n})();\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTUxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9ob3dsZXIvZGlzdC9ob3dsZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiAgaG93bGVyLmpzIHYyLjAuMlxuICogIGhvd2xlcmpzLmNvbVxuICpcbiAqICAoYykgMjAxMy0yMDE2LCBKYW1lcyBTaW1wc29uIG9mIEdvbGRGaXJlIFN0dWRpb3NcbiAqICBnb2xkZmlyZXN0dWRpb3MuY29tXG4gKlxuICogIE1JVCBMaWNlbnNlXG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuXG4gICd1c2Ugc3RyaWN0JztcblxuICAvKiogR2xvYmFsIE1ldGhvZHMgKiovXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgZ2xvYmFsIGNvbnRyb2xsZXIuIEFsbCBjb250YWluZWQgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBhcHBseVxuICAgKiB0byBhbGwgc291bmRzIHRoYXQgYXJlIGN1cnJlbnRseSBwbGF5aW5nIG9yIHdpbGwgYmUgaW4gdGhlIGZ1dHVyZS5cbiAgICovXG4gIHZhciBIb3dsZXJHbG9iYWwgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmluaXQoKTtcbiAgfTtcbiAgSG93bGVyR2xvYmFsLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSBnbG9iYWwgSG93bGVyIG9iamVjdC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsZXJ9XG4gICAgICovXG4gICAgaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuXG4gICAgICAvLyBJbnRlcm5hbCBwcm9wZXJ0aWVzLlxuICAgICAgc2VsZi5fY29kZWNzID0ge307XG4gICAgICBzZWxmLl9ob3dscyA9IFtdO1xuICAgICAgc2VsZi5fbXV0ZWQgPSBmYWxzZTtcbiAgICAgIHNlbGYuX3ZvbHVtZSA9IDE7XG4gICAgICBzZWxmLl9jYW5QbGF5RXZlbnQgPSAnY2FucGxheXRocm91Z2gnO1xuICAgICAgc2VsZi5fbmF2aWdhdG9yID0gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5uYXZpZ2F0b3IpID8gd2luZG93Lm5hdmlnYXRvciA6IG51bGw7XG5cbiAgICAgIC8vIFB1YmxpYyBwcm9wZXJ0aWVzLlxuICAgICAgc2VsZi5tYXN0ZXJHYWluID0gbnVsbDtcbiAgICAgIHNlbGYubm9BdWRpbyA9IGZhbHNlO1xuICAgICAgc2VsZi51c2luZ1dlYkF1ZGlvID0gdHJ1ZTtcbiAgICAgIHNlbGYuYXV0b1N1c3BlbmQgPSB0cnVlO1xuICAgICAgc2VsZi5jdHggPSBudWxsO1xuXG4gICAgICAvLyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSB0aGUgYXV0byBpT1MgZW5hYmxlci5cbiAgICAgIHNlbGYubW9iaWxlQXV0b0VuYWJsZSA9IHRydWU7XG5cbiAgICAgIC8vIFNldHVwIHRoZSB2YXJpb3VzIHN0YXRlIHZhbHVlcyBmb3IgZ2xvYmFsIHRyYWNraW5nLlxuICAgICAgc2VsZi5fc2V0dXAoKTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldC9zZXQgdGhlIGdsb2JhbCB2b2x1bWUgZm9yIGFsbCBzb3VuZHMuXG4gICAgICogQHBhcmFtICB7RmxvYXR9IHZvbCBWb2x1bWUgZnJvbSAwLjAgdG8gMS4wLlxuICAgICAqIEByZXR1cm4ge0hvd2xlci9GbG9hdH0gICAgIFJldHVybnMgc2VsZiBvciBjdXJyZW50IHZvbHVtZS5cbiAgICAgKi9cbiAgICB2b2x1bWU6IGZ1bmN0aW9uKHZvbCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcbiAgICAgIHZvbCA9IHBhcnNlRmxvYXQodm9sKTtcblxuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbiBBdWRpb0NvbnRleHQgY3JlYXRlZCB5ZXQsIHJ1biB0aGUgc2V0dXAuXG4gICAgICBpZiAoIXNlbGYuY3R4KSB7XG4gICAgICAgIHNldHVwQXVkaW9Db250ZXh0KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygdm9sICE9PSAndW5kZWZpbmVkJyAmJiB2b2wgPj0gMCAmJiB2b2wgPD0gMSkge1xuICAgICAgICBzZWxmLl92b2x1bWUgPSB2b2w7XG5cbiAgICAgICAgLy8gRG9uJ3QgdXBkYXRlIGFueSBvZiB0aGUgbm9kZXMgaWYgd2UgYXJlIG11dGVkLlxuICAgICAgICBpZiAoc2VsZi5fbXV0ZWQpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdoZW4gdXNpbmcgV2ViIEF1ZGlvLCB3ZSBqdXN0IG5lZWQgdG8gYWRqdXN0IHRoZSBtYXN0ZXIgZ2Fpbi5cbiAgICAgICAgaWYgKHNlbGYudXNpbmdXZWJBdWRpbykge1xuICAgICAgICAgIHNlbGYubWFzdGVyR2Fpbi5nYWluLnZhbHVlID0gdm9sO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFuZCBjaGFuZ2Ugdm9sdW1lIGZvciBhbGwgSFRNTDUgYXVkaW8gbm9kZXMuXG4gICAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9ob3dscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghc2VsZi5faG93bHNbaV0uX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgICAvLyBHZXQgYWxsIG9mIHRoZSBzb3VuZHMgaW4gdGhpcyBIb3dsIGdyb3VwLlxuICAgICAgICAgICAgdmFyIGlkcyA9IHNlbGYuX2hvd2xzW2ldLl9nZXRTb3VuZElkcygpO1xuXG4gICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHNvdW5kcyBhbmQgY2hhbmdlIHRoZSB2b2x1bWVzLlxuICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqPGlkcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICB2YXIgc291bmQgPSBzZWxmLl9ob3dsc1tpXS5fc291bmRCeUlkKGlkc1tqXSk7XG5cbiAgICAgICAgICAgICAgaWYgKHNvdW5kICYmIHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICAgICAgc291bmQuX25vZGUudm9sdW1lID0gc291bmQuX3ZvbHVtZSAqIHZvbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZi5fdm9sdW1lO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgbXV0aW5nIGFuZCB1bm11dGluZyBnbG9iYWxseS5cbiAgICAgKiBAcGFyYW0gIHtCb29sZWFufSBtdXRlZCBJcyBtdXRlZCBvciBub3QuXG4gICAgICovXG4gICAgbXV0ZTogZnVuY3Rpb24obXV0ZWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyB8fCBIb3dsZXI7XG5cbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW4gQXVkaW9Db250ZXh0IGNyZWF0ZWQgeWV0LCBydW4gdGhlIHNldHVwLlxuICAgICAgaWYgKCFzZWxmLmN0eCkge1xuICAgICAgICBzZXR1cEF1ZGlvQ29udGV4dCgpO1xuICAgICAgfVxuXG4gICAgICBzZWxmLl9tdXRlZCA9IG11dGVkO1xuXG4gICAgICAvLyBXaXRoIFdlYiBBdWRpbywgd2UganVzdCBuZWVkIHRvIG11dGUgdGhlIG1hc3RlciBnYWluLlxuICAgICAgaWYgKHNlbGYudXNpbmdXZWJBdWRpbykge1xuICAgICAgICBzZWxmLm1hc3RlckdhaW4uZ2Fpbi52YWx1ZSA9IG11dGVkID8gMCA6IHNlbGYuX3ZvbHVtZTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIGFuZCBtdXRlIGFsbCBIVE1MNSBBdWRpbyBub2Rlcy5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9ob3dscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIXNlbGYuX2hvd2xzW2ldLl93ZWJBdWRpbykge1xuICAgICAgICAgIC8vIEdldCBhbGwgb2YgdGhlIHNvdW5kcyBpbiB0aGlzIEhvd2wgZ3JvdXAuXG4gICAgICAgICAgdmFyIGlkcyA9IHNlbGYuX2hvd2xzW2ldLl9nZXRTb3VuZElkcygpO1xuXG4gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBzb3VuZHMgYW5kIG1hcmsgdGhlIGF1ZGlvIG5vZGUgYXMgbXV0ZWQuXG4gICAgICAgICAgZm9yICh2YXIgaj0wOyBqPGlkcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5faG93bHNbaV0uX3NvdW5kQnlJZChpZHNbal0pO1xuXG4gICAgICAgICAgICBpZiAoc291bmQgJiYgc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUubXV0ZWQgPSAobXV0ZWQpID8gdHJ1ZSA6IHNvdW5kLl9tdXRlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVubG9hZCBhbmQgZGVzdHJveSBhbGwgY3VycmVudGx5IGxvYWRlZCBIb3dsIG9iamVjdHMuXG4gICAgICogQHJldHVybiB7SG93bGVyfVxuICAgICAqL1xuICAgIHVubG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuXG4gICAgICBmb3IgKHZhciBpPXNlbGYuX2hvd2xzLmxlbmd0aC0xOyBpPj0wOyBpLS0pIHtcbiAgICAgICAgc2VsZi5faG93bHNbaV0udW5sb2FkKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBBdWRpb0NvbnRleHQgdG8gbWFrZSBzdXJlIGl0IGlzIGZ1bGx5IHJlc2V0LlxuICAgICAgaWYgKHNlbGYudXNpbmdXZWJBdWRpbyAmJiBzZWxmLmN0eCAmJiB0eXBlb2Ygc2VsZi5jdHguY2xvc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNlbGYuY3R4LmNsb3NlKCk7XG4gICAgICAgIHNlbGYuY3R4ID0gbnVsbDtcbiAgICAgICAgc2V0dXBBdWRpb0NvbnRleHQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGZvciBjb2RlYyBzdXBwb3J0IG9mIHNwZWNpZmljIGV4dGVuc2lvbi5cbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9IGV4dCBBdWRpbyBmaWxlIGV4dGVudGlvbi5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGNvZGVjczogZnVuY3Rpb24oZXh0KSB7XG4gICAgICByZXR1cm4gKHRoaXMgfHwgSG93bGVyKS5fY29kZWNzW2V4dC5yZXBsYWNlKC9eeC0vLCAnJyldO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXR1cCB2YXJpb3VzIHN0YXRlIHZhbHVlcyBmb3IgZ2xvYmFsIHRyYWNraW5nLlxuICAgICAqIEByZXR1cm4ge0hvd2xlcn1cbiAgICAgKi9cbiAgICBfc2V0dXA6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcblxuICAgICAgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIHN1c3BlbmQvcmVzdW1lIHN0YXRlIG9mIHRoZSBBdWRpb0NvbnRleHQuXG4gICAgICBzZWxmLnN0YXRlID0gc2VsZi5jdHggPyBzZWxmLmN0eC5zdGF0ZSB8fCAncnVubmluZycgOiAncnVubmluZyc7XG5cbiAgICAgIC8vIEF1dG9tYXRpY2FsbHkgYmVnaW4gdGhlIDMwLXNlY29uZCBzdXNwZW5kIHByb2Nlc3NcbiAgICAgIHNlbGYuX2F1dG9TdXNwZW5kKCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGF1ZGlvIGlzIGF2YWlsYWJsZS5cbiAgICAgIGlmICghc2VsZi51c2luZ1dlYkF1ZGlvKSB7XG4gICAgICAgIC8vIE5vIGF1ZGlvIGlzIGF2YWlsYWJsZSBvbiB0aGlzIHN5c3RlbSBpZiBub0F1ZGlvIGlzIHNldCB0byB0cnVlLlxuICAgICAgICBpZiAodHlwZW9mIEF1ZGlvICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgdGVzdCA9IG5ldyBBdWRpbygpO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgY2FucGxheXRocm91Z2ggZXZlbnQgaXMgYXZhaWxhYmxlLlxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZXN0Lm9uY2FucGxheXRocm91Z2ggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHNlbGYuX2NhblBsYXlFdmVudCA9ICdjYW5wbGF5JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgIHNlbGYubm9BdWRpbyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGYubm9BdWRpbyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGVzdCB0byBtYWtlIHN1cmUgYXVkaW8gaXNuJ3QgZGlzYWJsZWQgaW4gSW50ZXJuZXQgRXhwbG9yZXIuXG4gICAgICB0cnkge1xuICAgICAgICB2YXIgdGVzdCA9IG5ldyBBdWRpbygpO1xuICAgICAgICBpZiAodGVzdC5tdXRlZCkge1xuICAgICAgICAgIHNlbGYubm9BdWRpbyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgIC8vIENoZWNrIGZvciBzdXBwb3J0ZWQgY29kZWNzLlxuICAgICAgaWYgKCFzZWxmLm5vQXVkaW8pIHtcbiAgICAgICAgc2VsZi5fc2V0dXBDb2RlY3MoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGZvciBicm93c2VyIHN1cHBvcnQgZm9yIHZhcmlvdXMgY29kZWNzIGFuZCBjYWNoZSB0aGUgcmVzdWx0cy5cbiAgICAgKiBAcmV0dXJuIHtIb3dsZXJ9XG4gICAgICovXG4gICAgX3NldHVwQ29kZWNzOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyB8fCBIb3dsZXI7XG4gICAgICB2YXIgYXVkaW9UZXN0ID0gbnVsbDtcblxuICAgICAgLy8gTXVzdCB3cmFwIGluIGEgdHJ5L2NhdGNoIGJlY2F1c2UgSUUxMSBpbiBzZXJ2ZXIgbW9kZSB0aHJvd3MgYW4gZXJyb3IuXG4gICAgICB0cnkge1xuICAgICAgICBhdWRpb1Rlc3QgPSAodHlwZW9mIEF1ZGlvICE9PSAndW5kZWZpbmVkJykgPyBuZXcgQXVkaW8oKSA6IG51bGw7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIGlmICghYXVkaW9UZXN0IHx8IHR5cGVvZiBhdWRpb1Rlc3QuY2FuUGxheVR5cGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIHZhciBtcGVnVGVzdCA9IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vbXBlZzsnKS5yZXBsYWNlKC9ebm8kLywgJycpO1xuXG4gICAgICAvLyBPcGVyYSB2ZXJzaW9uIDwzMyBoYXMgbWl4ZWQgTVAzIHN1cHBvcnQsIHNvIHdlIG5lZWQgdG8gY2hlY2sgZm9yIGFuZCBibG9jayBpdC5cbiAgICAgIHZhciBjaGVja09wZXJhID0gc2VsZi5fbmF2aWdhdG9yICYmIHNlbGYuX25hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09QUlxcLyhbMC02XS4pL2cpO1xuICAgICAgdmFyIGlzT2xkT3BlcmEgPSAoY2hlY2tPcGVyYSAmJiBwYXJzZUludChjaGVja09wZXJhWzBdLnNwbGl0KCcvJylbMV0sIDEwKSA8IDMzKTtcblxuICAgICAgc2VsZi5fY29kZWNzID0ge1xuICAgICAgICBtcDM6ICEhKCFpc09sZE9wZXJhICYmIChtcGVnVGVzdCB8fCBhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL21wMzsnKS5yZXBsYWNlKC9ebm8kLywgJycpKSksXG4gICAgICAgIG1wZWc6ICEhbXBlZ1Rlc3QsXG4gICAgICAgIG9wdXM6ICEhYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9vZ2c7IGNvZGVjcz1cIm9wdXNcIicpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIG9nZzogISFhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL29nZzsgY29kZWNzPVwidm9yYmlzXCInKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBvZ2E6ICEhYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9vZ2c7IGNvZGVjcz1cInZvcmJpc1wiJykucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgd2F2OiAhIWF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vd2F2OyBjb2RlY3M9XCIxXCInKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBhYWM6ICEhYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9hYWM7JykucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgY2FmOiAhIWF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8veC1jYWY7JykucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgbTRhOiAhIShhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL3gtbTRhOycpIHx8IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vbTRhOycpIHx8IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vYWFjOycpKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBtcDQ6ICEhKGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8veC1tcDQ7JykgfHwgYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9tcDQ7JykgfHwgYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9hYWM7JykpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIHdlYmE6ICEhYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby93ZWJtOyBjb2RlY3M9XCJ2b3JiaXNcIicpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIHdlYm06ICEhYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby93ZWJtOyBjb2RlY3M9XCJ2b3JiaXNcIicpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIGRvbGJ5OiAhIWF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vbXA0OyBjb2RlY3M9XCJlYy0zXCInKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBmbGFjOiAhIShhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL3gtZmxhYzsnKSB8fCBhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL2ZsYWM7JykpLnJlcGxhY2UoL15ubyQvLCAnJylcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNb2JpbGUgYnJvd3NlcnMgd2lsbCBvbmx5IGFsbG93IGF1ZGlvIHRvIGJlIHBsYXllZCBhZnRlciBhIHVzZXIgaW50ZXJhY3Rpb24uXG4gICAgICogQXR0ZW1wdCB0byBhdXRvbWF0aWNhbGx5IHVubG9jayBhdWRpbyBvbiB0aGUgZmlyc3QgdXNlciBpbnRlcmFjdGlvbi5cbiAgICAgKiBDb25jZXB0IGZyb206IGh0dHA6Ly9wYXVsYmFrYXVzLmNvbS90dXRvcmlhbHMvaHRtbDUvd2ViLWF1ZGlvLW9uLWlvcy9cbiAgICAgKiBAcmV0dXJuIHtIb3dsZXJ9XG4gICAgICovXG4gICAgX2VuYWJsZU1vYmlsZUF1ZGlvOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyB8fCBIb3dsZXI7XG5cbiAgICAgIC8vIE9ubHkgcnVuIHRoaXMgb24gbW9iaWxlIGRldmljZXMgaWYgYXVkaW8gaXNuJ3QgYWxyZWFkeSBlYW5ibGVkLlxuICAgICAgdmFyIGlzTW9iaWxlID0gL2lQaG9uZXxpUGFkfGlQb2R8QW5kcm9pZHxCbGFja0JlcnJ5fEJCMTB8U2lsa3xNb2JpL2kudGVzdChzZWxmLl9uYXZpZ2F0b3IgJiYgc2VsZi5fbmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgICB2YXIgaXNUb3VjaCA9ICEhKCgnb250b3VjaGVuZCcgaW4gd2luZG93KSB8fCAoc2VsZi5fbmF2aWdhdG9yICYmIHNlbGYuX25hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDApIHx8IChzZWxmLl9uYXZpZ2F0b3IgJiYgc2VsZi5fbmF2aWdhdG9yLm1zTWF4VG91Y2hQb2ludHMgPiAwKSk7XG4gICAgICBpZiAoc2VsZi5fbW9iaWxlRW5hYmxlZCB8fCAhc2VsZi5jdHggfHwgKCFpc01vYmlsZSAmJiAhaXNUb3VjaCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZWxmLl9tb2JpbGVFbmFibGVkID0gZmFsc2U7XG5cbiAgICAgIC8vIFNvbWUgbW9iaWxlIGRldmljZXMvcGxhdGZvcm1zIGhhdmUgZGlzdG9ydGlvbiBpc3N1ZXMgd2hlbiBvcGVuaW5nL2Nsb3NpbmcgdGFicyBhbmQvb3Igd2ViIHZpZXdzLlxuICAgICAgLy8gQnVncyBpbiB0aGUgYnJvd3NlciAoZXNwZWNpYWxseSBNb2JpbGUgU2FmYXJpKSBjYW4gY2F1c2UgdGhlIHNhbXBsZVJhdGUgdG8gY2hhbmdlIGZyb20gNDQxMDAgdG8gNDgwMDAuXG4gICAgICAvLyBCeSBjYWxsaW5nIEhvd2xlci51bmxvYWQoKSwgd2UgY3JlYXRlIGEgbmV3IEF1ZGlvQ29udGV4dCB3aXRoIHRoZSBjb3JyZWN0IHNhbXBsZVJhdGUuXG4gICAgICBpZiAoIXNlbGYuX21vYmlsZVVubG9hZGVkICYmIHNlbGYuY3R4LnNhbXBsZVJhdGUgIT09IDQ0MTAwKSB7XG4gICAgICAgIHNlbGYuX21vYmlsZVVubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgc2VsZi51bmxvYWQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2NyYXRjaCBidWZmZXIgZm9yIGVuYWJsaW5nIGlPUyB0byBkaXNwb3NlIG9mIHdlYiBhdWRpbyBidWZmZXJzIGNvcnJlY3RseSwgYXMgcGVyOlxuICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNDExOTY4NFxuICAgICAgc2VsZi5fc2NyYXRjaEJ1ZmZlciA9IHNlbGYuY3R4LmNyZWF0ZUJ1ZmZlcigxLCAxLCAyMjA1MCk7XG5cbiAgICAgIC8vIENhbGwgdGhpcyBtZXRob2Qgb24gdG91Y2ggc3RhcnQgdG8gY3JlYXRlIGFuZCBwbGF5IGEgYnVmZmVyLFxuICAgICAgLy8gdGhlbiBjaGVjayBpZiB0aGUgYXVkaW8gYWN0dWFsbHkgcGxheWVkIHRvIGRldGVybWluZSBpZlxuICAgICAgLy8gYXVkaW8gaGFzIG5vdyBiZWVuIHVubG9ja2VkIG9uIGlPUywgQW5kcm9pZCwgZXRjLlxuICAgICAgdmFyIHVubG9jayA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBDcmVhdGUgYW4gZW1wdHkgYnVmZmVyLlxuICAgICAgICB2YXIgc291cmNlID0gc2VsZi5jdHguY3JlYXRlQnVmZmVyU291cmNlKCk7XG4gICAgICAgIHNvdXJjZS5idWZmZXIgPSBzZWxmLl9zY3JhdGNoQnVmZmVyO1xuICAgICAgICBzb3VyY2UuY29ubmVjdChzZWxmLmN0eC5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgLy8gUGxheSB0aGUgZW1wdHkgYnVmZmVyLlxuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZS5zdGFydCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBzb3VyY2Uubm90ZU9uKDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNvdXJjZS5zdGFydCgwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldHVwIGEgdGltZW91dCB0byBjaGVjayB0aGF0IHdlIGFyZSB1bmxvY2tlZCBvbiB0aGUgbmV4dCBldmVudCBsb29wLlxuICAgICAgICBzb3VyY2Uub25lbmRlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNvdXJjZS5kaXNjb25uZWN0KDApO1xuXG4gICAgICAgICAgLy8gVXBkYXRlIHRoZSB1bmxvY2tlZCBzdGF0ZSBhbmQgcHJldmVudCB0aGlzIGNoZWNrIGZyb20gaGFwcGVuaW5nIGFnYWluLlxuICAgICAgICAgIHNlbGYuX21vYmlsZUVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHNlbGYubW9iaWxlQXV0b0VuYWJsZSA9IGZhbHNlO1xuXG4gICAgICAgICAgLy8gUmVtb3ZlIHRoZSB0b3VjaCBzdGFydCBsaXN0ZW5lci5cbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHVubG9jaywgdHJ1ZSk7XG4gICAgICAgIH07XG4gICAgICB9O1xuXG4gICAgICAvLyBTZXR1cCBhIHRvdWNoIHN0YXJ0IGxpc3RlbmVyIHRvIGF0dGVtcHQgYW4gdW5sb2NrIGluLlxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB1bmxvY2ssIHRydWUpO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQXV0b21hdGljYWxseSBzdXNwZW5kIHRoZSBXZWIgQXVkaW8gQXVkaW9Db250ZXh0IGFmdGVyIG5vIHNvdW5kIGhhcyBwbGF5ZWQgZm9yIDMwIHNlY29uZHMuXG4gICAgICogVGhpcyBzYXZlcyBwcm9jZXNzaW5nL2VuZXJneSBhbmQgZml4ZXMgdmFyaW91cyBicm93c2VyLXNwZWNpZmljIGJ1Z3Mgd2l0aCBhdWRpbyBnZXR0aW5nIHN0dWNrLlxuICAgICAqIEByZXR1cm4ge0hvd2xlcn1cbiAgICAgKi9cbiAgICBfYXV0b1N1c3BlbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICBpZiAoIXNlbGYuYXV0b1N1c3BlbmQgfHwgIXNlbGYuY3R4IHx8IHR5cGVvZiBzZWxmLmN0eC5zdXNwZW5kID09PSAndW5kZWZpbmVkJyB8fCAhSG93bGVyLnVzaW5nV2ViQXVkaW8pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBhbnkgc291bmRzIGFyZSBwbGF5aW5nLlxuICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX2hvd2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzZWxmLl9ob3dsc1tpXS5fd2ViQXVkaW8pIHtcbiAgICAgICAgICBmb3IgKHZhciBqPTA7IGo8c2VsZi5faG93bHNbaV0uX3NvdW5kcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKCFzZWxmLl9ob3dsc1tpXS5fc291bmRzW2pdLl9wYXVzZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxmLl9zdXNwZW5kVGltZXIpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHNlbGYuX3N1c3BlbmRUaW1lcik7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIHNvdW5kIGhhcyBwbGF5ZWQgYWZ0ZXIgMzAgc2Vjb25kcywgc3VzcGVuZCB0aGUgY29udGV4dC5cbiAgICAgIHNlbGYuX3N1c3BlbmRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghc2VsZi5hdXRvU3VzcGVuZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYuX3N1c3BlbmRUaW1lciA9IG51bGw7XG4gICAgICAgIHNlbGYuc3RhdGUgPSAnc3VzcGVuZGluZyc7XG4gICAgICAgIHNlbGYuY3R4LnN1c3BlbmQoKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNlbGYuc3RhdGUgPSAnc3VzcGVuZGVkJztcblxuICAgICAgICAgIGlmIChzZWxmLl9yZXN1bWVBZnRlclN1c3BlbmQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBzZWxmLl9yZXN1bWVBZnRlclN1c3BlbmQ7XG4gICAgICAgICAgICBzZWxmLl9hdXRvUmVzdW1lKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sIDMwMDAwKTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEF1dG9tYXRpY2FsbHkgcmVzdW1lIHRoZSBXZWIgQXVkaW8gQXVkaW9Db250ZXh0IHdoZW4gYSBuZXcgc291bmQgaXMgcGxheWVkLlxuICAgICAqIEByZXR1cm4ge0hvd2xlcn1cbiAgICAgKi9cbiAgICBfYXV0b1Jlc3VtZTogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIGlmICghc2VsZi5jdHggfHwgdHlwZW9mIHNlbGYuY3R4LnJlc3VtZSA9PT0gJ3VuZGVmaW5lZCcgfHwgIUhvd2xlci51c2luZ1dlYkF1ZGlvKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGYuc3RhdGUgPT09ICdydW5uaW5nJyAmJiBzZWxmLl9zdXNwZW5kVGltZXIpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHNlbGYuX3N1c3BlbmRUaW1lcik7XG4gICAgICAgIHNlbGYuX3N1c3BlbmRUaW1lciA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHNlbGYuc3RhdGUgPT09ICdzdXNwZW5kZWQnKSB7XG4gICAgICAgIHNlbGYuc3RhdGUgPSAncmVzdW1pbmcnO1xuICAgICAgICBzZWxmLmN0eC5yZXN1bWUoKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNlbGYuc3RhdGUgPSAncnVubmluZyc7XG5cbiAgICAgICAgICAvLyBFbWl0IHRvIGFsbCBIb3dscyB0aGF0IHRoZSBhdWRpbyBoYXMgcmVzdW1lZC5cbiAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5faG93bHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHNlbGYuX2hvd2xzW2ldLl9lbWl0KCdyZXN1bWUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChzZWxmLl9zdXNwZW5kVGltZXIpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoc2VsZi5fc3VzcGVuZFRpbWVyKTtcbiAgICAgICAgICBzZWxmLl9zdXNwZW5kVGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNlbGYuc3RhdGUgPT09ICdzdXNwZW5kaW5nJykge1xuICAgICAgICBzZWxmLl9yZXN1bWVBZnRlclN1c3BlbmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG4gIH07XG5cbiAgLy8gU2V0dXAgdGhlIGdsb2JhbCBhdWRpbyBjb250cm9sbGVyLlxuICB2YXIgSG93bGVyID0gbmV3IEhvd2xlckdsb2JhbCgpO1xuXG4gIC8qKiBHcm91cCBNZXRob2RzICoqL1xuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gYXVkaW8gZ3JvdXAgY29udHJvbGxlci5cbiAgICogQHBhcmFtIHtPYmplY3R9IG8gUGFzc2VkIGluIHByb3BlcnRpZXMgZm9yIHRoaXMgZ3JvdXAuXG4gICAqL1xuICB2YXIgSG93bCA9IGZ1bmN0aW9uKG8pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBUaHJvdyBhbiBlcnJvciBpZiBubyBzb3VyY2UgaXMgcHJvdmlkZWQuXG4gICAgaWYgKCFvLnNyYyB8fCBvLnNyYy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0FuIGFycmF5IG9mIHNvdXJjZSBmaWxlcyBtdXN0IGJlIHBhc3NlZCB3aXRoIGFueSBuZXcgSG93bC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZWxmLmluaXQobyk7XG4gIH07XG4gIEhvd2wucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgYSBuZXcgSG93bCBncm91cCBvYmplY3QuXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBvIFBhc3NlZCBpbiBwcm9wZXJ0aWVzIGZvciB0aGlzIGdyb3VwLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgaW5pdDogZnVuY3Rpb24obykge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFuIEF1ZGlvQ29udGV4dCBjcmVhdGVkIHlldCwgcnVuIHRoZSBzZXR1cC5cbiAgICAgIGlmICghSG93bGVyLmN0eCkge1xuICAgICAgICBzZXR1cEF1ZGlvQ29udGV4dCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXR1cCB1c2VyLWRlZmluZWQgZGVmYXVsdCBwcm9wZXJ0aWVzLlxuICAgICAgc2VsZi5fYXV0b3BsYXkgPSBvLmF1dG9wbGF5IHx8IGZhbHNlO1xuICAgICAgc2VsZi5fZm9ybWF0ID0gKHR5cGVvZiBvLmZvcm1hdCAhPT0gJ3N0cmluZycpID8gby5mb3JtYXQgOiBbby5mb3JtYXRdO1xuICAgICAgc2VsZi5faHRtbDUgPSBvLmh0bWw1IHx8IGZhbHNlO1xuICAgICAgc2VsZi5fbXV0ZWQgPSBvLm11dGUgfHwgZmFsc2U7XG4gICAgICBzZWxmLl9sb29wID0gby5sb29wIHx8IGZhbHNlO1xuICAgICAgc2VsZi5fcG9vbCA9IG8ucG9vbCB8fCA1O1xuICAgICAgc2VsZi5fcHJlbG9hZCA9ICh0eXBlb2Ygby5wcmVsb2FkID09PSAnYm9vbGVhbicpID8gby5wcmVsb2FkIDogdHJ1ZTtcbiAgICAgIHNlbGYuX3JhdGUgPSBvLnJhdGUgfHwgMTtcbiAgICAgIHNlbGYuX3Nwcml0ZSA9IG8uc3ByaXRlIHx8IHt9O1xuICAgICAgc2VsZi5fc3JjID0gKHR5cGVvZiBvLnNyYyAhPT0gJ3N0cmluZycpID8gby5zcmMgOiBbby5zcmNdO1xuICAgICAgc2VsZi5fdm9sdW1lID0gby52b2x1bWUgIT09IHVuZGVmaW5lZCA/IG8udm9sdW1lIDogMTtcblxuICAgICAgLy8gU2V0dXAgYWxsIG90aGVyIGRlZmF1bHQgcHJvcGVydGllcy5cbiAgICAgIHNlbGYuX2R1cmF0aW9uID0gMDtcbiAgICAgIHNlbGYuX3N0YXRlID0gJ3VubG9hZGVkJztcbiAgICAgIHNlbGYuX3NvdW5kcyA9IFtdO1xuICAgICAgc2VsZi5fZW5kVGltZXJzID0ge307XG4gICAgICBzZWxmLl9xdWV1ZSA9IFtdO1xuXG4gICAgICAvLyBTZXR1cCBldmVudCBsaXN0ZW5lcnMuXG4gICAgICBzZWxmLl9vbmVuZCA9IG8ub25lbmQgPyBbe2ZuOiBvLm9uZW5kfV0gOiBbXTtcbiAgICAgIHNlbGYuX29uZmFkZSA9IG8ub25mYWRlID8gW3tmbjogby5vbmZhZGV9XSA6IFtdO1xuICAgICAgc2VsZi5fb25sb2FkID0gby5vbmxvYWQgPyBbe2ZuOiBvLm9ubG9hZH1dIDogW107XG4gICAgICBzZWxmLl9vbmxvYWRlcnJvciA9IG8ub25sb2FkZXJyb3IgPyBbe2ZuOiBvLm9ubG9hZGVycm9yfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ucGF1c2UgPSBvLm9ucGF1c2UgPyBbe2ZuOiBvLm9ucGF1c2V9XSA6IFtdO1xuICAgICAgc2VsZi5fb25wbGF5ID0gby5vbnBsYXkgPyBbe2ZuOiBvLm9ucGxheX1dIDogW107XG4gICAgICBzZWxmLl9vbnN0b3AgPSBvLm9uc3RvcCA/IFt7Zm46IG8ub25zdG9wfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ubXV0ZSA9IG8ub25tdXRlID8gW3tmbjogby5vbm11dGV9XSA6IFtdO1xuICAgICAgc2VsZi5fb252b2x1bWUgPSBvLm9udm9sdW1lID8gW3tmbjogby5vbnZvbHVtZX1dIDogW107XG4gICAgICBzZWxmLl9vbnJhdGUgPSBvLm9ucmF0ZSA/IFt7Zm46IG8ub25yYXRlfV0gOiBbXTtcbiAgICAgIHNlbGYuX29uc2VlayA9IG8ub25zZWVrID8gW3tmbjogby5vbnNlZWt9XSA6IFtdO1xuICAgICAgc2VsZi5fb25yZXN1bWUgPSBbXTtcblxuICAgICAgLy8gV2ViIEF1ZGlvIG9yIEhUTUw1IEF1ZGlvP1xuICAgICAgc2VsZi5fd2ViQXVkaW8gPSBIb3dsZXIudXNpbmdXZWJBdWRpbyAmJiAhc2VsZi5faHRtbDU7XG5cbiAgICAgIC8vIEF1dG9tYXRpY2FsbHkgdHJ5IHRvIGVuYWJsZSBhdWRpbyBvbiBpT1MuXG4gICAgICBpZiAodHlwZW9mIEhvd2xlci5jdHggIT09ICd1bmRlZmluZWQnICYmIEhvd2xlci5jdHggJiYgSG93bGVyLm1vYmlsZUF1dG9FbmFibGUpIHtcbiAgICAgICAgSG93bGVyLl9lbmFibGVNb2JpbGVBdWRpbygpO1xuICAgICAgfVxuXG4gICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoaXMgSG93bCBncm91cCBpbiB0aGUgZ2xvYmFsIGNvbnRyb2xsZXIuXG4gICAgICBIb3dsZXIuX2hvd2xzLnB1c2goc2VsZik7XG5cbiAgICAgIC8vIElmIHRoZXkgc2VsZWN0ZWQgYXV0b3BsYXksIGFkZCBhIHBsYXkgZXZlbnQgdG8gdGhlIGxvYWQgcXVldWUuXG4gICAgICBpZiAoc2VsZi5fYXV0b3BsYXkpIHtcbiAgICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgICAgZXZlbnQ6ICdwbGF5JyxcbiAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5wbGF5KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9hZCB0aGUgc291cmNlIGZpbGUgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuXG4gICAgICBpZiAoc2VsZi5fcHJlbG9hZCkge1xuICAgICAgICBzZWxmLmxvYWQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIExvYWQgdGhlIGF1ZGlvIGZpbGUuXG4gICAgICogQHJldHVybiB7SG93bGVyfVxuICAgICAqL1xuICAgIGxvYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHVybCA9IG51bGw7XG5cbiAgICAgIC8vIElmIG5vIGF1ZGlvIGlzIGF2YWlsYWJsZSwgcXVpdCBpbW1lZGlhdGVseS5cbiAgICAgIGlmIChIb3dsZXIubm9BdWRpbykge1xuICAgICAgICBzZWxmLl9lbWl0KCdsb2FkZXJyb3InLCBudWxsLCAnTm8gYXVkaW8gc3VwcG9ydC4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBNYWtlIHN1cmUgb3VyIHNvdXJjZSBpcyBpbiBhbiBhcnJheS5cbiAgICAgIGlmICh0eXBlb2Ygc2VsZi5fc3JjID09PSAnc3RyaW5nJykge1xuICAgICAgICBzZWxmLl9zcmMgPSBbc2VsZi5fc3JjXTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBzb3VyY2VzIGFuZCBwaWNrIHRoZSBmaXJzdCBvbmUgdGhhdCBpcyBjb21wYXRpYmxlLlxuICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX3NyYy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZXh0LCBzdHI7XG5cbiAgICAgICAgaWYgKHNlbGYuX2Zvcm1hdCAmJiBzZWxmLl9mb3JtYXRbaV0pIHtcbiAgICAgICAgICAvLyBJZiBhbiBleHRlbnNpb24gd2FzIHNwZWNpZmllZCwgdXNlIHRoYXQgaW5zdGVhZC5cbiAgICAgICAgICBleHQgPSBzZWxmLl9mb3JtYXRbaV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBzb3VyY2UgaXMgYSBzdHJpbmcuXG4gICAgICAgICAgc3RyID0gc2VsZi5fc3JjW2ldO1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgc2VsZi5fZW1pdCgnbG9hZGVycm9yJywgbnVsbCwgJ05vbi1zdHJpbmcgZm91bmQgaW4gc2VsZWN0ZWQgYXVkaW8gc291cmNlcyAtIGlnbm9yaW5nLicpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRXh0cmFjdCB0aGUgZmlsZSBleHRlbnNpb24gZnJvbSB0aGUgVVJMIG9yIGJhc2U2NCBkYXRhIFVSSS5cbiAgICAgICAgICBleHQgPSAvXmRhdGE6YXVkaW9cXC8oW147LF0rKTsvaS5leGVjKHN0cik7XG4gICAgICAgICAgaWYgKCFleHQpIHtcbiAgICAgICAgICAgIGV4dCA9IC9cXC4oW14uXSspJC8uZXhlYyhzdHIuc3BsaXQoJz8nLCAxKVswXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGV4dCkge1xuICAgICAgICAgICAgZXh0ID0gZXh0WzFdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBleHRlbnNpb24gaXMgYXZhaWxhYmxlLlxuICAgICAgICBpZiAoSG93bGVyLmNvZGVjcyhleHQpKSB7XG4gICAgICAgICAgdXJsID0gc2VsZi5fc3JjW2ldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdXJsKSB7XG4gICAgICAgIHNlbGYuX2VtaXQoJ2xvYWRlcnJvcicsIG51bGwsICdObyBjb2RlYyBzdXBwb3J0IGZvciBzZWxlY3RlZCBhdWRpbyBzb3VyY2VzLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNlbGYuX3NyYyA9IHVybDtcbiAgICAgIHNlbGYuX3N0YXRlID0gJ2xvYWRpbmcnO1xuXG4gICAgICAvLyBJZiB0aGUgaG9zdGluZyBwYWdlIGlzIEhUVFBTIGFuZCB0aGUgc291cmNlIGlzbid0LFxuICAgICAgLy8gZHJvcCBkb3duIHRvIEhUTUw1IEF1ZGlvIHRvIGF2b2lkIE1peGVkIENvbnRlbnQgZXJyb3JzLlxuICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgJiYgdXJsLnNsaWNlKDAsIDUpID09PSAnaHR0cDonKSB7XG4gICAgICAgIHNlbGYuX2h0bWw1ID0gdHJ1ZTtcbiAgICAgICAgc2VsZi5fd2ViQXVkaW8gPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IHNvdW5kIG9iamVjdCBhbmQgYWRkIGl0IHRvIHRoZSBwb29sLlxuICAgICAgbmV3IFNvdW5kKHNlbGYpO1xuXG4gICAgICAvLyBMb2FkIGFuZCBkZWNvZGUgdGhlIGF1ZGlvIGRhdGEgZm9yIHBsYXliYWNrLlxuICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgIGxvYWRCdWZmZXIoc2VsZik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQbGF5IGEgc291bmQgb3IgcmVzdW1lIHByZXZpb3VzIHBsYXliYWNrLlxuICAgICAqIEBwYXJhbSAge1N0cmluZy9OdW1iZXJ9IHNwcml0ZSAgIFNwcml0ZSBuYW1lIGZvciBzcHJpdGUgcGxheWJhY2sgb3Igc291bmQgaWQgdG8gY29udGludWUgcHJldmlvdXMuXG4gICAgICogQHBhcmFtICB7Qm9vbGVhbn0gaW50ZXJuYWwgSW50ZXJuYWwgVXNlOiB0cnVlIHByZXZlbnRzIGV2ZW50IGZpcmluZy5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgICAgIFNvdW5kIElELlxuICAgICAqL1xuICAgIHBsYXk6IGZ1bmN0aW9uKHNwcml0ZSwgaW50ZXJuYWwpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBpZCA9IG51bGw7XG5cbiAgICAgIC8vIERldGVybWluZSBpZiBhIHNwcml0ZSwgc291bmQgaWQgb3Igbm90aGluZyB3YXMgcGFzc2VkXG4gICAgICBpZiAodHlwZW9mIHNwcml0ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWQgPSBzcHJpdGU7XG4gICAgICAgIHNwcml0ZSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcHJpdGUgPT09ICdzdHJpbmcnICYmIHNlbGYuX3N0YXRlID09PSAnbG9hZGVkJyAmJiAhc2VsZi5fc3ByaXRlW3Nwcml0ZV0pIHtcbiAgICAgICAgLy8gSWYgdGhlIHBhc3NlZCBzcHJpdGUgZG9lc24ndCBleGlzdCwgZG8gbm90aGluZy5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcHJpdGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBzb3VuZCBzcHJpdGUgKHBsYXlzIHRoZSBmdWxsIGF1ZGlvIGxlbmd0aCkuXG4gICAgICAgIHNwcml0ZSA9ICdfX2RlZmF1bHQnO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgc2luZ2xlIHBhdXNlZCBzb3VuZCB0aGF0IGlzbid0IGVuZGVkLlxuICAgICAgICAvLyBJZiB0aGVyZSBpcywgcGxheSB0aGF0IHNvdW5kLiBJZiBub3QsIGNvbnRpbnVlIGFzIHVzdWFsLlxuICAgICAgICB2YXIgbnVtID0gMDtcbiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX3NvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChzZWxmLl9zb3VuZHNbaV0uX3BhdXNlZCAmJiAhc2VsZi5fc291bmRzW2ldLl9lbmRlZCkge1xuICAgICAgICAgICAgbnVtKys7XG4gICAgICAgICAgICBpZCA9IHNlbGYuX3NvdW5kc1tpXS5faWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG51bSA9PT0gMSkge1xuICAgICAgICAgIHNwcml0ZSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCB0aGUgc2VsZWN0ZWQgbm9kZSwgb3IgZ2V0IG9uZSBmcm9tIHRoZSBwb29sLlxuICAgICAgdmFyIHNvdW5kID0gaWQgPyBzZWxmLl9zb3VuZEJ5SWQoaWQpIDogc2VsZi5faW5hY3RpdmVTb3VuZCgpO1xuXG4gICAgICAvLyBJZiB0aGUgc291bmQgZG9lc24ndCBleGlzdCwgZG8gbm90aGluZy5cbiAgICAgIGlmICghc291bmQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIFNlbGVjdCB0aGUgc3ByaXRlIGRlZmluaXRpb24uXG4gICAgICBpZiAoaWQgJiYgIXNwcml0ZSkge1xuICAgICAgICBzcHJpdGUgPSBzb3VuZC5fc3ByaXRlIHx8ICdfX2RlZmF1bHQnO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB3ZSBoYXZlIG5vIHNwcml0ZSBhbmQgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIHdlIG11c3Qgd2FpdFxuICAgICAgLy8gZm9yIHRoZSBzb3VuZCB0byBsb2FkIHRvIGdldCBvdXIgYXVkaW8ncyBkdXJhdGlvbi5cbiAgICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcgJiYgIXNlbGYuX3Nwcml0ZVtzcHJpdGVdKSB7XG4gICAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICAgIGV2ZW50OiAncGxheScsXG4gICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYucGxheShzZWxmLl9zb3VuZEJ5SWQoc291bmQuX2lkKSA/IHNvdW5kLl9pZCA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gc291bmQuX2lkO1xuICAgICAgfVxuXG4gICAgICAvLyBEb24ndCBwbGF5IHRoZSBzb3VuZCBpZiBhbiBpZCB3YXMgcGFzc2VkIGFuZCBpdCBpcyBhbHJlYWR5IHBsYXlpbmcuXG4gICAgICBpZiAoaWQgJiYgIXNvdW5kLl9wYXVzZWQpIHtcbiAgICAgICAgLy8gVHJpZ2dlciB0aGUgcGxheSBldmVudCwgaW4gb3JkZXIgdG8ga2VlcCBpdGVyYXRpbmcgdGhyb3VnaCBxdWV1ZS5cbiAgICAgICAgaWYgKCFpbnRlcm5hbCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZWxmLl9lbWl0KCdwbGF5Jywgc291bmQuX2lkKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzb3VuZC5faWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgQXVkaW9Db250ZXh0IGlzbid0IHN1c3BlbmRlZCwgYW5kIHJlc3VtZSBpdCBpZiBpdCBpcy5cbiAgICAgIGlmIChzZWxmLl93ZWJBdWRpbykge1xuICAgICAgICBIb3dsZXIuX2F1dG9SZXN1bWUoKTtcbiAgICAgIH1cblxuICAgICAgLy8gRGV0ZXJtaW5lIGhvdyBsb25nIHRvIHBsYXkgZm9yIGFuZCB3aGVyZSB0byBzdGFydCBwbGF5aW5nLlxuICAgICAgdmFyIHNlZWsgPSBNYXRoLm1heCgwLCBzb3VuZC5fc2VlayA+IDAgPyBzb3VuZC5fc2VlayA6IHNlbGYuX3Nwcml0ZVtzcHJpdGVdWzBdIC8gMTAwMCk7XG4gICAgICB2YXIgZHVyYXRpb24gPSBNYXRoLm1heCgwLCAoKHNlbGYuX3Nwcml0ZVtzcHJpdGVdWzBdICsgc2VsZi5fc3ByaXRlW3Nwcml0ZV1bMV0pIC8gMTAwMCkgLSBzZWVrKTtcbiAgICAgIHZhciB0aW1lb3V0ID0gKGR1cmF0aW9uICogMTAwMCkgLyBNYXRoLmFicyhzb3VuZC5fcmF0ZSk7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgcGFyYW1ldGVycyBvZiB0aGUgc291bmRcbiAgICAgIHNvdW5kLl9wYXVzZWQgPSBmYWxzZTtcbiAgICAgIHNvdW5kLl9lbmRlZCA9IGZhbHNlO1xuICAgICAgc291bmQuX3Nwcml0ZSA9IHNwcml0ZTtcbiAgICAgIHNvdW5kLl9zZWVrID0gc2VlaztcbiAgICAgIHNvdW5kLl9zdGFydCA9IHNlbGYuX3Nwcml0ZVtzcHJpdGVdWzBdIC8gMTAwMDtcbiAgICAgIHNvdW5kLl9zdG9wID0gKHNlbGYuX3Nwcml0ZVtzcHJpdGVdWzBdICsgc2VsZi5fc3ByaXRlW3Nwcml0ZV1bMV0pIC8gMTAwMDtcbiAgICAgIHNvdW5kLl9sb29wID0gISEoc291bmQuX2xvb3AgfHwgc2VsZi5fc3ByaXRlW3Nwcml0ZV1bMl0pO1xuXG4gICAgICAvLyBCZWdpbiB0aGUgYWN0dWFsIHBsYXliYWNrLlxuICAgICAgdmFyIG5vZGUgPSBzb3VuZC5fbm9kZTtcbiAgICAgIGlmIChzZWxmLl93ZWJBdWRpbykge1xuICAgICAgICAvLyBGaXJlIHRoaXMgd2hlbiB0aGUgc291bmQgaXMgcmVhZHkgdG8gcGxheSB0byBiZWdpbiBXZWIgQXVkaW8gcGxheWJhY2suXG4gICAgICAgIHZhciBwbGF5V2ViQXVkaW8gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICBzZWxmLl9yZWZyZXNoQnVmZmVyKHNvdW5kKTtcblxuICAgICAgICAgIC8vIFNldHVwIHRoZSBwbGF5YmFjayBwYXJhbXMuXG4gICAgICAgICAgdmFyIHZvbCA9IChzb3VuZC5fbXV0ZWQgfHwgc2VsZi5fbXV0ZWQpID8gMCA6IHNvdW5kLl92b2x1bWU7XG4gICAgICAgICAgbm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKHZvbCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgc291bmQuX3BsYXlTdGFydCA9IEhvd2xlci5jdHguY3VycmVudFRpbWU7XG5cbiAgICAgICAgICAvLyBQbGF5IHRoZSBzb3VuZCB1c2luZyB0aGUgc3VwcG9ydGVkIG1ldGhvZC5cbiAgICAgICAgICBpZiAodHlwZW9mIG5vZGUuYnVmZmVyU291cmNlLnN0YXJ0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgc291bmQuX2xvb3AgPyBub2RlLmJ1ZmZlclNvdXJjZS5ub3RlR3JhaW5PbigwLCBzZWVrLCA4NjQwMCkgOiBub2RlLmJ1ZmZlclNvdXJjZS5ub3RlR3JhaW5PbigwLCBzZWVrLCBkdXJhdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNvdW5kLl9sb29wID8gbm9kZS5idWZmZXJTb3VyY2Uuc3RhcnQoMCwgc2VlaywgODY0MDApIDogbm9kZS5idWZmZXJTb3VyY2Uuc3RhcnQoMCwgc2VlaywgZHVyYXRpb24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFN0YXJ0IGEgbmV3IHRpbWVyIGlmIG5vbmUgaXMgcHJlc2VudC5cbiAgICAgICAgICBpZiAodGltZW91dCAhPT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHNlbGYuX2VuZFRpbWVyc1tzb3VuZC5faWRdID0gc2V0VGltZW91dChzZWxmLl9lbmRlZC5iaW5kKHNlbGYsIHNvdW5kKSwgdGltZW91dCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFpbnRlcm5hbCkge1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgc2VsZi5fZW1pdCgncGxheScsIHNvdW5kLl9pZCk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGlzUnVubmluZyA9IChIb3dsZXIuc3RhdGUgPT09ICdydW5uaW5nJyk7XG4gICAgICAgIGlmIChzZWxmLl9zdGF0ZSA9PT0gJ2xvYWRlZCcgJiYgaXNSdW5uaW5nKSB7XG4gICAgICAgICAgcGxheVdlYkF1ZGlvKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGF1ZGlvIHRvIGxvYWQgYW5kIHRoZW4gYmVnaW4gcGxheWJhY2suXG4gICAgICAgICAgc2VsZi5vbmNlKGlzUnVubmluZyA/ICdsb2FkJyA6ICdyZXN1bWUnLCBwbGF5V2ViQXVkaW8sIGlzUnVubmluZyA/IHNvdW5kLl9pZCA6IG51bGwpO1xuXG4gICAgICAgICAgLy8gQ2FuY2VsIHRoZSBlbmQgdGltZXIuXG4gICAgICAgICAgc2VsZi5fY2xlYXJUaW1lcihzb3VuZC5faWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGaXJlIHRoaXMgd2hlbiB0aGUgc291bmQgaXMgcmVhZHkgdG8gcGxheSB0byBiZWdpbiBIVE1MNSBBdWRpbyBwbGF5YmFjay5cbiAgICAgICAgdmFyIHBsYXlIdG1sNSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIG5vZGUuY3VycmVudFRpbWUgPSBzZWVrO1xuICAgICAgICAgIG5vZGUubXV0ZWQgPSBzb3VuZC5fbXV0ZWQgfHwgc2VsZi5fbXV0ZWQgfHwgSG93bGVyLl9tdXRlZCB8fCBub2RlLm11dGVkO1xuICAgICAgICAgIG5vZGUudm9sdW1lID0gc291bmQuX3ZvbHVtZSAqIEhvd2xlci52b2x1bWUoKTtcbiAgICAgICAgICBub2RlLnBsYXliYWNrUmF0ZSA9IHNvdW5kLl9yYXRlO1xuXG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIG5vZGUucGxheSgpO1xuXG4gICAgICAgICAgICAvLyBTZXR1cCB0aGUgbmV3IGVuZCB0aW1lci5cbiAgICAgICAgICAgIGlmICh0aW1lb3V0ICE9PSBJbmZpbml0eSkge1xuICAgICAgICAgICAgICBzZWxmLl9lbmRUaW1lcnNbc291bmQuX2lkXSA9IHNldFRpbWVvdXQoc2VsZi5fZW5kZWQuYmluZChzZWxmLCBzb3VuZCksIHRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWludGVybmFsKSB7XG4gICAgICAgICAgICAgIHNlbGYuX2VtaXQoJ3BsYXknLCBzb3VuZC5faWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFBsYXkgaW1tZWRpYXRlbHkgaWYgcmVhZHksIG9yIHdhaXQgZm9yIHRoZSAnY2FucGxheXRocm91Z2gnZSB2ZW50LlxuICAgICAgICB2YXIgbG9hZGVkTm9SZWFkeVN0YXRlID0gKHNlbGYuX3N0YXRlID09PSAnbG9hZGVkJyAmJiAod2luZG93ICYmIHdpbmRvdy5lamVjdGEgfHwgIW5vZGUucmVhZHlTdGF0ZSAmJiBIb3dsZXIuX25hdmlnYXRvci5pc0NvY29vbkpTKSk7XG4gICAgICAgIGlmIChub2RlLnJlYWR5U3RhdGUgPT09IDQgfHwgbG9hZGVkTm9SZWFkeVN0YXRlKSB7XG4gICAgICAgICAgcGxheUh0bWw1KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBCZWdpbiBwbGF5YmFjay5cbiAgICAgICAgICAgIHBsYXlIdG1sNSgpO1xuXG4gICAgICAgICAgICAvLyBDbGVhciB0aGlzIGxpc3RlbmVyLlxuICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEhvd2xlci5fY2FuUGxheUV2ZW50LCBsaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKEhvd2xlci5fY2FuUGxheUV2ZW50LCBsaXN0ZW5lciwgZmFsc2UpO1xuXG4gICAgICAgICAgLy8gQ2FuY2VsIHRoZSBlbmQgdGltZXIuXG4gICAgICAgICAgc2VsZi5fY2xlYXJUaW1lcihzb3VuZC5faWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzb3VuZC5faWQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFBhdXNlIHBsYXliYWNrIGFuZCBzYXZlIGN1cnJlbnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCBUaGUgc291bmQgSUQgKGVtcHR5IHRvIHBhdXNlIGFsbCBpbiBncm91cCkuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBwYXVzZTogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBwYXVzZSB3aGVuIGNhcGFibGUuXG4gICAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICAgIGV2ZW50OiAncGF1c2UnLFxuICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZWxmLnBhdXNlKGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyBpZCBpcyBwYXNzZWQsIGdldCBhbGwgSUQncyB0byBiZSBwYXVzZWQuXG4gICAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuXG4gICAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIENsZWFyIHRoZSBlbmQgdGltZXIuXG4gICAgICAgIHNlbGYuX2NsZWFyVGltZXIoaWRzW2ldKTtcblxuICAgICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWRzW2ldKTtcblxuICAgICAgICBpZiAoc291bmQgJiYgIXNvdW5kLl9wYXVzZWQpIHtcbiAgICAgICAgICAvLyBSZXNldCB0aGUgc2VlayBwb3NpdGlvbi5cbiAgICAgICAgICBzb3VuZC5fc2VlayA9IHNlbGYuc2VlayhpZHNbaV0pO1xuICAgICAgICAgIHNvdW5kLl9yYXRlU2VlayA9IDA7XG4gICAgICAgICAgc291bmQuX3BhdXNlZCA9IHRydWU7XG5cbiAgICAgICAgICAvLyBTdG9wIGN1cnJlbnRseSBydW5uaW5nIGZhZGVzLlxuICAgICAgICAgIHNlbGYuX3N0b3BGYWRlKGlkc1tpXSk7XG5cbiAgICAgICAgICBpZiAoc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbykge1xuICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHNvdW5kIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICAgICAgICAgICAgaWYgKCFzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICh0eXBlb2Ygc291bmQuX25vZGUuYnVmZmVyU291cmNlLnN0b3AgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLm5vdGVPZmYoMCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLnN0b3AoMCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgYnVmZmVyIHNvdXJjZS5cbiAgICAgICAgICAgICAgc2VsZi5fY2xlYW5CdWZmZXIoc291bmQuX25vZGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghaXNOYU4oc291bmQuX25vZGUuZHVyYXRpb24pIHx8IHNvdW5kLl9ub2RlLmR1cmF0aW9uID09PSBJbmZpbml0eSkge1xuICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5wYXVzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpcmUgdGhlIHBhdXNlIGV2ZW50LCB1bmxlc3MgYHRydWVgIGlzIHBhc3NlZCBhcyB0aGUgMm5kIGFyZ3VtZW50LlxuICAgICAgICBpZiAoIWFyZ3VtZW50c1sxXSkge1xuICAgICAgICAgIHNlbGYuX2VtaXQoJ3BhdXNlJywgc291bmQgPyBzb3VuZC5faWQgOiBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3RvcCBwbGF5YmFjayBhbmQgcmVzZXQgdG8gc3RhcnQuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCBUaGUgc291bmQgSUQgKGVtcHR5IHRvIHN0b3AgYWxsIGluIGdyb3VwKS5cbiAgICAgKiBAcGFyYW0gIHtCb29sZWFufSBpbnRlcm5hbCBJbnRlcm5hbCBVc2U6IHRydWUgcHJldmVudHMgZXZlbnQgZmlyaW5nLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgc3RvcDogZnVuY3Rpb24oaWQsIGludGVybmFsKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gc3RvcCB3aGVuIGNhcGFibGUuXG4gICAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICAgIGV2ZW50OiAnc3RvcCcsXG4gICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYuc3RvcChpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gaWQgaXMgcGFzc2VkLCBnZXQgYWxsIElEJ3MgdG8gYmUgc3RvcHBlZC5cbiAgICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGVuZCB0aW1lci5cbiAgICAgICAgc2VsZi5fY2xlYXJUaW1lcihpZHNbaV0pO1xuXG4gICAgICAgIC8vIEdldCB0aGUgc291bmQuXG4gICAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICAgIC8vIFJlc2V0IHRoZSBzZWVrIHBvc2l0aW9uLlxuICAgICAgICAgIHNvdW5kLl9zZWVrID0gc291bmQuX3N0YXJ0IHx8IDA7XG4gICAgICAgICAgc291bmQuX3JhdGVTZWVrID0gMDtcbiAgICAgICAgICBzb3VuZC5fcGF1c2VkID0gdHJ1ZTtcbiAgICAgICAgICBzb3VuZC5fZW5kZWQgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gU3RvcCBjdXJyZW50bHkgcnVubmluZyBmYWRlcy5cbiAgICAgICAgICBzZWxmLl9zdG9wRmFkZShpZHNbaV0pO1xuXG4gICAgICAgICAgaWYgKHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBzb3VuZCBoYXMgYmVlbiBjcmVhdGVkXG4gICAgICAgICAgICAgIGlmICghc291bmQuX25vZGUuYnVmZmVyU291cmNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbnRlcm5hbCkge1xuICAgICAgICAgICAgICAgICAgc2VsZi5fZW1pdCgnc3RvcCcsIHNvdW5kLl9pZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAodHlwZW9mIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5zdG9wID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5ub3RlT2ZmKDApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5zdG9wKDApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIGJ1ZmZlciBzb3VyY2UuXG4gICAgICAgICAgICAgIHNlbGYuX2NsZWFuQnVmZmVyKHNvdW5kLl9ub2RlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzTmFOKHNvdW5kLl9ub2RlLmR1cmF0aW9uKSB8fCBzb3VuZC5fbm9kZS5kdXJhdGlvbiA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUuY3VycmVudFRpbWUgPSBzb3VuZC5fc3RhcnQgfHwgMDtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUucGF1c2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc291bmQgJiYgIWludGVybmFsKSB7XG4gICAgICAgICAgc2VsZi5fZW1pdCgnc3RvcCcsIHNvdW5kLl9pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE11dGUvdW5tdXRlIGEgc2luZ2xlIHNvdW5kIG9yIGFsbCBzb3VuZHMgaW4gdGhpcyBIb3dsIGdyb3VwLlxuICAgICAqIEBwYXJhbSAge0Jvb2xlYW59IG11dGVkIFNldCB0byB0cnVlIHRvIG11dGUgYW5kIGZhbHNlIHRvIHVubXV0ZS5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkICAgIFRoZSBzb3VuZCBJRCB0byB1cGRhdGUgKG9taXQgdG8gbXV0ZS91bm11dGUgYWxsKS5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIG11dGU6IGZ1bmN0aW9uKG11dGVkLCBpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBJZiB0aGUgc291bmQgaGFzbid0IGxvYWRlZCwgYWRkIGl0IHRvIHRoZSBsb2FkIHF1ZXVlIHRvIG11dGUgd2hlbiBjYXBhYmxlLlxuICAgICAgaWYgKHNlbGYuX3N0YXRlICE9PSAnbG9hZGVkJykge1xuICAgICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgICBldmVudDogJ211dGUnLFxuICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZWxmLm11dGUobXV0ZWQsIGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBhcHBseWluZyBtdXRlL3VubXV0ZSB0byBhbGwgc291bmRzLCB1cGRhdGUgdGhlIGdyb3VwJ3MgdmFsdWUuXG4gICAgICBpZiAodHlwZW9mIGlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAodHlwZW9mIG11dGVkID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBzZWxmLl9tdXRlZCA9IG11dGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzZWxmLl9tdXRlZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyBpZCBpcyBwYXNzZWQsIGdldCBhbGwgSUQncyB0byBiZSBtdXRlZC5cbiAgICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkc1tpXSk7XG5cbiAgICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgICAgc291bmQuX211dGVkID0gbXV0ZWQ7XG5cbiAgICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8gJiYgc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgIHNvdW5kLl9ub2RlLmdhaW4uc2V0VmFsdWVBdFRpbWUobXV0ZWQgPyAwIDogc291bmQuX3ZvbHVtZSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgc291bmQuX25vZGUubXV0ZWQgPSBIb3dsZXIuX211dGVkID8gdHJ1ZSA6IG11dGVkO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlbGYuX2VtaXQoJ211dGUnLCBzb3VuZC5faWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQvc2V0IHRoZSB2b2x1bWUgb2YgdGhpcyBzb3VuZCBvciBvZiB0aGUgSG93bCBncm91cC4gVGhpcyBtZXRob2QgY2FuIG9wdGlvbmFsbHkgdGFrZSAwLCAxIG9yIDIgYXJndW1lbnRzLlxuICAgICAqICAgdm9sdW1lKCkgLT4gUmV0dXJucyB0aGUgZ3JvdXAncyB2b2x1bWUgdmFsdWUuXG4gICAgICogICB2b2x1bWUoaWQpIC0+IFJldHVybnMgdGhlIHNvdW5kIGlkJ3MgY3VycmVudCB2b2x1bWUuXG4gICAgICogICB2b2x1bWUodm9sKSAtPiBTZXRzIHRoZSB2b2x1bWUgb2YgYWxsIHNvdW5kcyBpbiB0aGlzIEhvd2wgZ3JvdXAuXG4gICAgICogICB2b2x1bWUodm9sLCBpZCkgLT4gU2V0cyB0aGUgdm9sdW1lIG9mIHBhc3NlZCBzb3VuZCBpZC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsL051bWJlcn0gUmV0dXJucyBzZWxmIG9yIGN1cnJlbnQgdm9sdW1lLlxuICAgICAqL1xuICAgIHZvbHVtZTogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIHZhciB2b2wsIGlkO1xuXG4gICAgICAvLyBEZXRlcm1pbmUgdGhlIHZhbHVlcyBiYXNlZCBvbiBhcmd1bWVudHMuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZ3JvdXBzJyB2b2x1bWUuXG4gICAgICAgIHJldHVybiBzZWxmLl92b2x1bWU7XG4gICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxIHx8IGFyZ3MubGVuZ3RoID09PSAyICYmIHR5cGVvZiBhcmdzWzFdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGlzIGlzIGFuIElELCBhbmQgaWYgbm90LCBhc3N1bWUgaXQgaXMgYSBuZXcgdm9sdW1lLlxuICAgICAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoKTtcbiAgICAgICAgdmFyIGluZGV4ID0gaWRzLmluZGV4T2YoYXJnc1swXSk7XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgaWQgPSBwYXJzZUludChhcmdzWzBdLCAxMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdm9sID0gcGFyc2VGbG9hdChhcmdzWzBdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHZvbCA9IHBhcnNlRmxvYXQoYXJnc1swXSk7XG4gICAgICAgIGlkID0gcGFyc2VJbnQoYXJnc1sxXSwgMTApO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgdGhlIHZvbHVtZSBvciByZXR1cm4gdGhlIGN1cnJlbnQgdm9sdW1lLlxuICAgICAgdmFyIHNvdW5kO1xuICAgICAgaWYgKHR5cGVvZiB2b2wgIT09ICd1bmRlZmluZWQnICYmIHZvbCA+PSAwICYmIHZvbCA8PSAxKSB7XG4gICAgICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gY2hhbmdlIHZvbHVtZSB3aGVuIGNhcGFibGUuXG4gICAgICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgIGV2ZW50OiAndm9sdW1lJyxcbiAgICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHNlbGYudm9sdW1lLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIGdyb3VwIHZvbHVtZS5cbiAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBzZWxmLl92b2x1bWUgPSB2b2w7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgb25lIG9yIGFsbCB2b2x1bWVzLlxuICAgICAgICBpZCA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcbiAgICAgICAgZm9yICh2YXIgaT0wOyBpPGlkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgICAgICBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZFtpXSk7XG5cbiAgICAgICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgICAgIHNvdW5kLl92b2x1bWUgPSB2b2w7XG5cbiAgICAgICAgICAgIC8vIFN0b3AgY3VycmVudGx5IHJ1bm5pbmcgZmFkZXMuXG4gICAgICAgICAgICBpZiAoIWFyZ3NbMl0pIHtcbiAgICAgICAgICAgICAgc2VsZi5fc3RvcEZhZGUoaWRbaV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8gJiYgc291bmQuX25vZGUgJiYgIXNvdW5kLl9tdXRlZCkge1xuICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKHZvbCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdW5kLl9ub2RlICYmICFzb3VuZC5fbXV0ZWQpIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUudm9sdW1lID0gdm9sICogSG93bGVyLnZvbHVtZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWxmLl9lbWl0KCd2b2x1bWUnLCBzb3VuZC5faWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc291bmQgPSBpZCA/IHNlbGYuX3NvdW5kQnlJZChpZCkgOiBzZWxmLl9zb3VuZHNbMF07XG4gICAgICAgIHJldHVybiBzb3VuZCA/IHNvdW5kLl92b2x1bWUgOiAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmFkZSBhIGN1cnJlbnRseSBwbGF5aW5nIHNvdW5kIGJldHdlZW4gdHdvIHZvbHVtZXMgKGlmIG5vIGlkIGlzIHBhc3NzZWQsIGFsbCBzb3VuZHMgd2lsbCBmYWRlKS5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGZyb20gVGhlIHZhbHVlIHRvIGZhZGUgZnJvbSAoMC4wIHRvIDEuMCkuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSB0byAgIFRoZSB2b2x1bWUgdG8gZmFkZSB0byAoMC4wIHRvIDEuMCkuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBsZW4gIFRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGZhZGUuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCAgIFRoZSBzb3VuZCBpZCAob21pdCB0byBmYWRlIGFsbCBzb3VuZHMpLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgZmFkZTogZnVuY3Rpb24oZnJvbSwgdG8sIGxlbiwgaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBkaWZmID0gTWF0aC5hYnMoZnJvbSAtIHRvKTtcbiAgICAgIHZhciBkaXIgPSBmcm9tID4gdG8gPyAnb3V0JyA6ICdpbic7XG4gICAgICB2YXIgc3RlcHMgPSBkaWZmIC8gMC4wMTtcbiAgICAgIHZhciBzdGVwTGVuID0gKHN0ZXBzID4gMCkgPyBsZW4gLyBzdGVwcyA6IGxlbjtcblxuICAgICAgLy8gU2luY2UgYnJvd3NlcnMgY2xhbXAgdGltZW91dHMgdG8gNG1zLCB3ZSBuZWVkIHRvIGNsYW1wIG91ciBzdGVwcyB0byB0aGF0IHRvby5cbiAgICAgIGlmIChzdGVwTGVuIDwgNCkge1xuICAgICAgICBzdGVwcyA9IE1hdGguY2VpbChzdGVwcyAvICg0IC8gc3RlcExlbikpO1xuICAgICAgICBzdGVwTGVuID0gNDtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBmYWRlIHdoZW4gY2FwYWJsZS5cbiAgICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgICAgZXZlbnQ6ICdmYWRlJyxcbiAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5mYWRlKGZyb20sIHRvLCBsZW4sIGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIHZvbHVtZSB0byB0aGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICBzZWxmLnZvbHVtZShmcm9tLCBpZCk7XG5cbiAgICAgIC8vIEZhZGUgdGhlIHZvbHVtZSBvZiBvbmUgb3IgYWxsIHNvdW5kcy5cbiAgICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG4gICAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIEdldCB0aGUgc291bmQuXG4gICAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIGxpbmVhciBmYWRlIG9yIGZhbGwgYmFjayB0byB0aW1lb3V0cyB3aXRoIEhUTUw1IEF1ZGlvLlxuICAgICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgICAvLyBTdG9wIHRoZSBwcmV2aW91cyBmYWRlIGlmIG5vIHNwcml0ZSBpcyBiZWluZyB1c2VkIChvdGhlcndpc2UsIHZvbHVtZSBoYW5kbGVzIHRoaXMpLlxuICAgICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgIHNlbGYuX3N0b3BGYWRlKGlkc1tpXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgd2UgYXJlIHVzaW5nIFdlYiBBdWRpbywgbGV0IHRoZSBuYXRpdmUgbWV0aG9kcyBkbyB0aGUgYWN0dWFsIGZhZGUuXG4gICAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvICYmICFzb3VuZC5fbXV0ZWQpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50VGltZSA9IEhvd2xlci5jdHguY3VycmVudFRpbWU7XG4gICAgICAgICAgICB2YXIgZW5kID0gY3VycmVudFRpbWUgKyAobGVuIC8gMTAwMCk7XG4gICAgICAgICAgICBzb3VuZC5fdm9sdW1lID0gZnJvbTtcbiAgICAgICAgICAgIHNvdW5kLl9ub2RlLmdhaW4uc2V0VmFsdWVBdFRpbWUoZnJvbSwgY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgc291bmQuX25vZGUuZ2Fpbi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSh0bywgZW5kKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgdm9sID0gZnJvbTtcbiAgICAgICAgICBzb3VuZC5faW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbihzb3VuZElkLCBzb3VuZCkge1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB2b2x1bWUgYW1vdW50LCBidXQgb25seSBpZiB0aGUgdm9sdW1lIHNob3VsZCBjaGFuZ2UuXG4gICAgICAgICAgICBpZiAoc3RlcHMgPiAwKSB7XG4gICAgICAgICAgICAgIHZvbCArPSAoZGlyID09PSAnaW4nID8gMC4wMSA6IC0wLjAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB2b2x1bWUgaXMgaW4gdGhlIHJpZ2h0IGJvdW5kcy5cbiAgICAgICAgICAgIHZvbCA9IE1hdGgubWF4KDAsIHZvbCk7XG4gICAgICAgICAgICB2b2wgPSBNYXRoLm1pbigxLCB2b2wpO1xuXG4gICAgICAgICAgICAvLyBSb3VuZCB0byB3aXRoaW4gMiBkZWNpbWFsIHBvaW50cy5cbiAgICAgICAgICAgIHZvbCA9IE1hdGgucm91bmQodm9sICogMTAwKSAvIDEwMDtcblxuICAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSB2b2x1bWUuXG4gICAgICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBzZWxmLl92b2x1bWUgPSB2b2w7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzb3VuZC5fdm9sdW1lID0gdm9sO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2VsZi52b2x1bWUodm9sLCBzb3VuZElkLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gV2hlbiB0aGUgZmFkZSBpcyBjb21wbGV0ZSwgc3RvcCBpdCBhbmQgZmlyZSBldmVudC5cbiAgICAgICAgICAgIGlmICh2b2wgPT09IHRvKSB7XG4gICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoc291bmQuX2ludGVydmFsKTtcbiAgICAgICAgICAgICAgc291bmQuX2ludGVydmFsID0gbnVsbDtcbiAgICAgICAgICAgICAgc2VsZi52b2x1bWUodm9sLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgc2VsZi5fZW1pdCgnZmFkZScsIHNvdW5kSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0uYmluZChzZWxmLCBpZHNbaV0sIHNvdW5kKSwgc3RlcExlbik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEludGVybmFsIG1ldGhvZCB0aGF0IHN0b3BzIHRoZSBjdXJyZW50bHkgcGxheWluZyBmYWRlIHdoZW5cbiAgICAgKiBhIG5ldyBmYWRlIHN0YXJ0cywgdm9sdW1lIGlzIGNoYW5nZWQgb3IgdGhlIHNvdW5kIGlzIHN0b3BwZWQuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCBUaGUgc291bmQgaWQuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBfc3RvcEZhZGU6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWQpO1xuXG4gICAgICBpZiAoc291bmQgJiYgc291bmQuX2ludGVydmFsKSB7XG4gICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbykge1xuICAgICAgICAgIHNvdW5kLl9ub2RlLmdhaW4uY2FuY2VsU2NoZWR1bGVkVmFsdWVzKEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2xlYXJJbnRlcnZhbChzb3VuZC5faW50ZXJ2YWwpO1xuICAgICAgICBzb3VuZC5faW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICBzZWxmLl9lbWl0KCdmYWRlJywgaWQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0L3NldCB0aGUgbG9vcCBwYXJhbWV0ZXIgb24gYSBzb3VuZC4gVGhpcyBtZXRob2QgY2FuIG9wdGlvbmFsbHkgdGFrZSAwLCAxIG9yIDIgYXJndW1lbnRzLlxuICAgICAqICAgbG9vcCgpIC0+IFJldHVybnMgdGhlIGdyb3VwJ3MgbG9vcCB2YWx1ZS5cbiAgICAgKiAgIGxvb3AoaWQpIC0+IFJldHVybnMgdGhlIHNvdW5kIGlkJ3MgbG9vcCB2YWx1ZS5cbiAgICAgKiAgIGxvb3AobG9vcCkgLT4gU2V0cyB0aGUgbG9vcCB2YWx1ZSBmb3IgYWxsIHNvdW5kcyBpbiB0aGlzIEhvd2wgZ3JvdXAuXG4gICAgICogICBsb29wKGxvb3AsIGlkKSAtPiBTZXRzIHRoZSBsb29wIHZhbHVlIG9mIHBhc3NlZCBzb3VuZCBpZC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsL0Jvb2xlYW59IFJldHVybnMgc2VsZiBvciBjdXJyZW50IGxvb3AgdmFsdWUuXG4gICAgICovXG4gICAgbG9vcDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIHZhciBsb29wLCBpZCwgc291bmQ7XG5cbiAgICAgIC8vIERldGVybWluZSB0aGUgdmFsdWVzIGZvciBsb29wIGFuZCBpZC5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBSZXR1cm4gdGhlIGdyb3UncyBsb29wIHZhbHVlLlxuICAgICAgICByZXR1cm4gc2VsZi5fbG9vcDtcbiAgICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBsb29wID0gYXJnc1swXTtcbiAgICAgICAgICBzZWxmLl9sb29wID0gbG9vcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBSZXR1cm4gdGhpcyBzb3VuZCdzIGxvb3AgdmFsdWUuXG4gICAgICAgICAgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQocGFyc2VJbnQoYXJnc1swXSwgMTApKTtcbiAgICAgICAgICByZXR1cm4gc291bmQgPyBzb3VuZC5fbG9vcCA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGxvb3AgPSBhcmdzWzBdO1xuICAgICAgICBpZCA9IHBhcnNlSW50KGFyZ3NbMV0sIDEwKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gaWQgaXMgcGFzc2VkLCBnZXQgYWxsIElEJ3MgdG8gYmUgbG9vcGVkLlxuICAgICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcbiAgICAgIGZvciAodmFyIGk9MDsgaTxpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWRzW2ldKTtcblxuICAgICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgICBzb3VuZC5fbG9vcCA9IGxvb3A7XG4gICAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvICYmIHNvdW5kLl9ub2RlICYmIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZSkge1xuICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLmxvb3AgPSBsb29wO1xuICAgICAgICAgICAgaWYgKGxvb3ApIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLmxvb3BTdGFydCA9IHNvdW5kLl9zdGFydCB8fCAwO1xuICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UubG9vcEVuZCA9IHNvdW5kLl9zdG9wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0L3NldCB0aGUgcGxheWJhY2sgcmF0ZSBvZiBhIHNvdW5kLiBUaGlzIG1ldGhvZCBjYW4gb3B0aW9uYWxseSB0YWtlIDAsIDEgb3IgMiBhcmd1bWVudHMuXG4gICAgICogICByYXRlKCkgLT4gUmV0dXJucyB0aGUgZmlyc3Qgc291bmQgbm9kZSdzIGN1cnJlbnQgcGxheWJhY2sgcmF0ZS5cbiAgICAgKiAgIHJhdGUoaWQpIC0+IFJldHVybnMgdGhlIHNvdW5kIGlkJ3MgY3VycmVudCBwbGF5YmFjayByYXRlLlxuICAgICAqICAgcmF0ZShyYXRlKSAtPiBTZXRzIHRoZSBwbGF5YmFjayByYXRlIG9mIGFsbCBzb3VuZHMgaW4gdGhpcyBIb3dsIGdyb3VwLlxuICAgICAqICAgcmF0ZShyYXRlLCBpZCkgLT4gU2V0cyB0aGUgcGxheWJhY2sgcmF0ZSBvZiBwYXNzZWQgc291bmQgaWQuXG4gICAgICogQHJldHVybiB7SG93bC9OdW1iZXJ9IFJldHVybnMgc2VsZiBvciB0aGUgY3VycmVudCBwbGF5YmFjayByYXRlLlxuICAgICAqL1xuICAgIHJhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICB2YXIgcmF0ZSwgaWQ7XG5cbiAgICAgIC8vIERldGVybWluZSB0aGUgdmFsdWVzIGJhc2VkIG9uIGFyZ3VtZW50cy5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBXZSB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnQgcmF0ZSBvZiB0aGUgZmlyc3Qgbm9kZS5cbiAgICAgICAgaWQgPSBzZWxmLl9zb3VuZHNbMF0uX2lkO1xuICAgICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGlzIGlzIGFuIElELCBhbmQgaWYgbm90LCBhc3N1bWUgaXQgaXMgYSBuZXcgcmF0ZSB2YWx1ZS5cbiAgICAgICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKCk7XG4gICAgICAgIHZhciBpbmRleCA9IGlkcy5pbmRleE9mKGFyZ3NbMF0pO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgIGlkID0gcGFyc2VJbnQoYXJnc1swXSwgMTApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJhdGUgPSBwYXJzZUZsb2F0KGFyZ3NbMF0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHJhdGUgPSBwYXJzZUZsb2F0KGFyZ3NbMF0pO1xuICAgICAgICBpZCA9IHBhcnNlSW50KGFyZ3NbMV0sIDEwKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHRoZSBwbGF5YmFjayByYXRlIG9yIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZS5cbiAgICAgIHZhciBzb3VuZDtcbiAgICAgIGlmICh0eXBlb2YgcmF0ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBjaGFuZ2UgcGxheWJhY2sgcmF0ZSB3aGVuIGNhcGFibGUuXG4gICAgICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgIGV2ZW50OiAncmF0ZScsXG4gICAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBzZWxmLnJhdGUuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgZ3JvdXAgcmF0ZS5cbiAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBzZWxmLl9yYXRlID0gcmF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBvbmUgb3IgYWxsIHZvbHVtZXMuXG4gICAgICAgIGlkID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuICAgICAgICBmb3IgKHZhciBpPTA7IGk8aWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgICAgIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkW2ldKTtcblxuICAgICAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICAgICAgLy8gS2VlcCB0cmFjayBvZiBvdXIgcG9zaXRpb24gd2hlbiB0aGUgcmF0ZSBjaGFuZ2VkIGFuZCB1cGRhdGUgdGhlIHBsYXliYWNrXG4gICAgICAgICAgICAvLyBzdGFydCBwb3NpdGlvbiBzbyB3ZSBjYW4gcHJvcGVybHkgYWRqdXN0IHRoZSBzZWVrIHBvc2l0aW9uIGZvciB0aW1lIGVsYXBzZWQuXG4gICAgICAgICAgICBzb3VuZC5fcmF0ZVNlZWsgPSBzZWxmLnNlZWsoaWRbaV0pO1xuICAgICAgICAgICAgc291bmQuX3BsYXlTdGFydCA9IHNlbGYuX3dlYkF1ZGlvID8gSG93bGVyLmN0eC5jdXJyZW50VGltZSA6IHNvdW5kLl9wbGF5U3RhcnQ7XG4gICAgICAgICAgICBzb3VuZC5fcmF0ZSA9IHJhdGU7XG5cbiAgICAgICAgICAgIC8vIENoYW5nZSB0aGUgcGxheWJhY2sgcmF0ZS5cbiAgICAgICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbyAmJiBzb3VuZC5fbm9kZSAmJiBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UpIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLnBsYXliYWNrUmF0ZS52YWx1ZSA9IHJhdGU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9ub2RlLnBsYXliYWNrUmF0ZSA9IHJhdGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlc2V0IHRoZSB0aW1lcnMuXG4gICAgICAgICAgICB2YXIgc2VlayA9IHNlbGYuc2VlayhpZFtpXSk7XG4gICAgICAgICAgICB2YXIgZHVyYXRpb24gPSAoKHNlbGYuX3Nwcml0ZVtzb3VuZC5fc3ByaXRlXVswXSArIHNlbGYuX3Nwcml0ZVtzb3VuZC5fc3ByaXRlXVsxXSkgLyAxMDAwKSAtIHNlZWs7XG4gICAgICAgICAgICB2YXIgdGltZW91dCA9IChkdXJhdGlvbiAqIDEwMDApIC8gTWF0aC5hYnMoc291bmQuX3JhdGUpO1xuXG4gICAgICAgICAgICAvLyBTdGFydCBhIG5ldyBlbmQgdGltZXIgaWYgc291bmQgaXMgYWxyZWFkeSBwbGF5aW5nLlxuICAgICAgICAgICAgaWYgKHNlbGYuX2VuZFRpbWVyc1tpZFtpXV0gfHwgIXNvdW5kLl9wYXVzZWQpIHtcbiAgICAgICAgICAgICAgc2VsZi5fY2xlYXJUaW1lcihpZFtpXSk7XG4gICAgICAgICAgICAgIHNlbGYuX2VuZFRpbWVyc1tpZFtpXV0gPSBzZXRUaW1lb3V0KHNlbGYuX2VuZGVkLmJpbmQoc2VsZiwgc291bmQpLCB0aW1lb3V0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VsZi5fZW1pdCgncmF0ZScsIHNvdW5kLl9pZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZCk7XG4gICAgICAgIHJldHVybiBzb3VuZCA/IHNvdW5kLl9yYXRlIDogc2VsZi5fcmF0ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldC9zZXQgdGhlIHNlZWsgcG9zaXRpb24gb2YgYSBzb3VuZC4gVGhpcyBtZXRob2QgY2FuIG9wdGlvbmFsbHkgdGFrZSAwLCAxIG9yIDIgYXJndW1lbnRzLlxuICAgICAqICAgc2VlaygpIC0+IFJldHVybnMgdGhlIGZpcnN0IHNvdW5kIG5vZGUncyBjdXJyZW50IHNlZWsgcG9zaXRpb24uXG4gICAgICogICBzZWVrKGlkKSAtPiBSZXR1cm5zIHRoZSBzb3VuZCBpZCdzIGN1cnJlbnQgc2VlayBwb3NpdGlvbi5cbiAgICAgKiAgIHNlZWsoc2VlaykgLT4gU2V0cyB0aGUgc2VlayBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgc291bmQgbm9kZS5cbiAgICAgKiAgIHNlZWsoc2VlaywgaWQpIC0+IFNldHMgdGhlIHNlZWsgcG9zaXRpb24gb2YgcGFzc2VkIHNvdW5kIGlkLlxuICAgICAqIEByZXR1cm4ge0hvd2wvTnVtYmVyfSBSZXR1cm5zIHNlbGYgb3IgdGhlIGN1cnJlbnQgc2VlayBwb3NpdGlvbi5cbiAgICAgKi9cbiAgICBzZWVrOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgdmFyIHNlZWssIGlkO1xuXG4gICAgICAvLyBEZXRlcm1pbmUgdGhlIHZhbHVlcyBiYXNlZCBvbiBhcmd1bWVudHMuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gV2Ugd2lsbCBzaW1wbHkgcmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBub2RlLlxuICAgICAgICBpZCA9IHNlbGYuX3NvdW5kc1swXS5faWQ7XG4gICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoaXMgaXMgYW4gSUQsIGFuZCBpZiBub3QsIGFzc3VtZSBpdCBpcyBhIG5ldyBzZWVrIHBvc2l0aW9uLlxuICAgICAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoKTtcbiAgICAgICAgdmFyIGluZGV4ID0gaWRzLmluZGV4T2YoYXJnc1swXSk7XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgaWQgPSBwYXJzZUludChhcmdzWzBdLCAxMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWQgPSBzZWxmLl9zb3VuZHNbMF0uX2lkO1xuICAgICAgICAgIHNlZWsgPSBwYXJzZUZsb2F0KGFyZ3NbMF0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHNlZWsgPSBwYXJzZUZsb2F0KGFyZ3NbMF0pO1xuICAgICAgICBpZCA9IHBhcnNlSW50KGFyZ3NbMV0sIDEwKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gSUQsIGJhaWwgb3V0LlxuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gc2VlayB3aGVuIGNhcGFibGUuXG4gICAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICAgIGV2ZW50OiAnc2VlaycsXG4gICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYuc2Vlay5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkKTtcblxuICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2VlayA9PT0gJ251bWJlcicgJiYgc2VlayA+PSAwKSB7XG4gICAgICAgICAgLy8gUGF1c2UgdGhlIHNvdW5kIGFuZCB1cGRhdGUgcG9zaXRpb24gZm9yIHJlc3RhcnRpbmcgcGxheWJhY2suXG4gICAgICAgICAgdmFyIHBsYXlpbmcgPSBzZWxmLnBsYXlpbmcoaWQpO1xuICAgICAgICAgIGlmIChwbGF5aW5nKSB7XG4gICAgICAgICAgICBzZWxmLnBhdXNlKGlkLCB0cnVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBNb3ZlIHRoZSBwb3NpdGlvbiBvZiB0aGUgdHJhY2sgYW5kIGNhbmNlbCB0aW1lci5cbiAgICAgICAgICBzb3VuZC5fc2VlayA9IHNlZWs7XG4gICAgICAgICAgc291bmQuX2VuZGVkID0gZmFsc2U7XG4gICAgICAgICAgc2VsZi5fY2xlYXJUaW1lcihpZCk7XG5cbiAgICAgICAgICAvLyBSZXN0YXJ0IHRoZSBwbGF5YmFjayBpZiB0aGUgc291bmQgd2FzIHBsYXlpbmcuXG4gICAgICAgICAgaWYgKHBsYXlpbmcpIHtcbiAgICAgICAgICAgIHNlbGYucGxheShpZCwgdHJ1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXBkYXRlIHRoZSBzZWVrIHBvc2l0aW9uIGZvciBIVE1MNSBBdWRpby5cbiAgICAgICAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvICYmIHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICBzb3VuZC5fbm9kZS5jdXJyZW50VGltZSA9IHNlZWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5fZW1pdCgnc2VlaycsIGlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgICAgIHZhciByZWFsVGltZSA9IHNlbGYucGxheWluZyhpZCkgPyBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lIC0gc291bmQuX3BsYXlTdGFydCA6IDA7XG4gICAgICAgICAgICB2YXIgcmF0ZVNlZWsgPSBzb3VuZC5fcmF0ZVNlZWsgPyBzb3VuZC5fcmF0ZVNlZWsgLSBzb3VuZC5fc2VlayA6IDA7XG4gICAgICAgICAgICByZXR1cm4gc291bmQuX3NlZWsgKyAocmF0ZVNlZWsgKyByZWFsVGltZSAqIE1hdGguYWJzKHNvdW5kLl9yYXRlKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VuZC5fbm9kZS5jdXJyZW50VGltZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgc3BlY2lmaWMgc291bmQgaXMgY3VycmVudGx5IHBsYXlpbmcgb3Igbm90IChpZiBpZCBpcyBwcm92aWRlZCksIG9yIGNoZWNrIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgc291bmRzIGluIHRoZSBncm91cCBpcyBwbGF5aW5nIG9yIG5vdC5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9ICBpZCBUaGUgc291bmQgaWQgdG8gY2hlY2suIElmIG5vbmUgaXMgcGFzc2VkLCB0aGUgd2hvbGUgc291bmQgZ3JvdXAgaXMgY2hlY2tlZC5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHBsYXlpbmcgYW5kIGZhbHNlIGlmIG5vdC5cbiAgICAgKi9cbiAgICBwbGF5aW5nOiBmdW5jdGlvbihpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBDaGVjayB0aGUgcGFzc2VkIHNvdW5kIElEIChpZiBhbnkpLlxuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkKTtcbiAgICAgICAgcmV0dXJuIHNvdW5kID8gIXNvdW5kLl9wYXVzZWQgOiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gT3RoZXJ3aXNlLCBsb29wIHRocm91Z2ggYWxsIHNvdW5kcyBhbmQgY2hlY2sgaWYgYW55IGFyZSBwbGF5aW5nLlxuICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX3NvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIXNlbGYuX3NvdW5kc1tpXS5fcGF1c2VkKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGR1cmF0aW9uIG9mIHRoaXMgc291bmQuIFBhc3NpbmcgYSBzb3VuZCBpZCB3aWxsIHJldHVybiB0aGUgc3ByaXRlIGR1cmF0aW9uLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgVGhlIHNvdW5kIGlkIHRvIGNoZWNrLiBJZiBub25lIGlzIHBhc3NlZCwgcmV0dXJuIGZ1bGwgc291cmNlIGR1cmF0aW9uLlxuICAgICAqIEByZXR1cm4ge051bWJlcn0gQXVkaW8gZHVyYXRpb24gaW4gc2Vjb25kcy5cbiAgICAgKi9cbiAgICBkdXJhdGlvbjogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBkdXJhdGlvbiA9IHNlbGYuX2R1cmF0aW9uO1xuXG4gICAgICAvLyBJZiB3ZSBwYXNzIGFuIElELCBnZXQgdGhlIHNvdW5kIGFuZCByZXR1cm4gdGhlIHNwcml0ZSBsZW5ndGguXG4gICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWQpO1xuICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgIGR1cmF0aW9uID0gc2VsZi5fc3ByaXRlW3NvdW5kLl9zcHJpdGVdWzFdIC8gMTAwMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGR1cmF0aW9uO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxvYWRlZCBzdGF0ZSBvZiB0aGlzIEhvd2wuXG4gICAgICogQHJldHVybiB7U3RyaW5nfSAndW5sb2FkZWQnLCAnbG9hZGluZycsICdsb2FkZWQnXG4gICAgICovXG4gICAgc3RhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVbmxvYWQgYW5kIGRlc3Ryb3kgdGhlIGN1cnJlbnQgSG93bCBvYmplY3QuXG4gICAgICogVGhpcyB3aWxsIGltbWVkaWF0ZWx5IHN0b3AgYWxsIHNvdW5kIGluc3RhbmNlcyBhdHRhY2hlZCB0byB0aGlzIGdyb3VwLlxuICAgICAqL1xuICAgIHVubG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIFN0b3AgcGxheWluZyBhbnkgYWN0aXZlIHNvdW5kcy5cbiAgICAgIHZhciBzb3VuZHMgPSBzZWxmLl9zb3VuZHM7XG4gICAgICBmb3IgKHZhciBpPTA7IGk8c291bmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIFN0b3AgdGhlIHNvdW5kIGlmIGl0IGlzIGN1cnJlbnRseSBwbGF5aW5nLlxuICAgICAgICBpZiAoIXNvdW5kc1tpXS5fcGF1c2VkKSB7XG4gICAgICAgICAgc2VsZi5zdG9wKHNvdW5kc1tpXS5faWQpO1xuICAgICAgICAgIHNlbGYuX2VtaXQoJ2VuZCcsIHNvdW5kc1tpXS5faWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBzb3VyY2Ugb3IgZGlzY29ubmVjdC5cbiAgICAgICAgaWYgKCFzZWxmLl93ZWJBdWRpbykge1xuICAgICAgICAgIC8vIFNldCB0aGUgc291cmNlIHRvIDAtc2Vjb25kIHNpbGVuY2UgdG8gc3RvcCBhbnkgZG93bmxvYWRpbmcuXG4gICAgICAgICAgc291bmRzW2ldLl9ub2RlLnNyYyA9ICdkYXRhOmF1ZGlvL3dhdjtiYXNlNjQsVWtsR1JpUUFBQUJYUVZaRlptMTBJQkFBQUFBQkFBRUFSS3dBQUloWUFRQUNBQkFBWkdGMFlRQUFBQUE9JztcblxuICAgICAgICAgIC8vIFJlbW92ZSBhbnkgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgICAgIHNvdW5kc1tpXS5fbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIHNvdW5kc1tpXS5fZXJyb3JGbiwgZmFsc2UpO1xuICAgICAgICAgIHNvdW5kc1tpXS5fbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEhvd2xlci5fY2FuUGxheUV2ZW50LCBzb3VuZHNbaV0uX2xvYWRGbiwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1wdHkgb3V0IGFsbCBvZiB0aGUgbm9kZXMuXG4gICAgICAgIGRlbGV0ZSBzb3VuZHNbaV0uX25vZGU7XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIGFsbCB0aW1lcnMgYXJlIGNsZWFyZWQgb3V0LlxuICAgICAgICBzZWxmLl9jbGVhclRpbWVyKHNvdW5kc1tpXS5faWQpO1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgcmVmZXJlbmNlcyBpbiB0aGUgZ2xvYmFsIEhvd2xlciBvYmplY3QuXG4gICAgICAgIHZhciBpbmRleCA9IEhvd2xlci5faG93bHMuaW5kZXhPZihzZWxmKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBIb3dsZXIuX2hvd2xzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRGVsZXRlIHRoaXMgc291bmQgZnJvbSB0aGUgY2FjaGUgKGlmIG5vIG90aGVyIEhvd2wgaXMgdXNpbmcgaXQpLlxuICAgICAgdmFyIHJlbUNhY2hlID0gdHJ1ZTtcbiAgICAgIGZvciAoaT0wOyBpPEhvd2xlci5faG93bHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKEhvd2xlci5faG93bHNbaV0uX3NyYyA9PT0gc2VsZi5fc3JjKSB7XG4gICAgICAgICAgcmVtQ2FjaGUgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2FjaGUgJiYgcmVtQ2FjaGUpIHtcbiAgICAgICAgZGVsZXRlIGNhY2hlW3NlbGYuX3NyY107XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFyIGdsb2JhbCBlcnJvcnMuXG4gICAgICBIb3dsZXIubm9BdWRpbyA9IGZhbHNlO1xuXG4gICAgICAvLyBDbGVhciBvdXQgYHNlbGZgLlxuICAgICAgc2VsZi5fc3RhdGUgPSAndW5sb2FkZWQnO1xuICAgICAgc2VsZi5fc291bmRzID0gW107XG4gICAgICBzZWxmID0gbnVsbDtcblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIExpc3RlbiB0byBhIGN1c3RvbSBldmVudC5cbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgZXZlbnQgRXZlbnQgbmFtZS5cbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gZm4gICAgTGlzdGVuZXIgdG8gY2FsbC5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9ICAgaWQgICAgKG9wdGlvbmFsKSBPbmx5IGxpc3RlbiB0byBldmVudHMgZm9yIHRoaXMgc291bmQuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSAgIG9uY2UgIChJTlRFUk5BTCkgTWFya3MgZXZlbnQgdG8gZmlyZSBvbmx5IG9uY2UuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBvbjogZnVuY3Rpb24oZXZlbnQsIGZuLCBpZCwgb25jZSkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGV2ZW50cyA9IHNlbGZbJ19vbicgKyBldmVudF07XG5cbiAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXZlbnRzLnB1c2gob25jZSA/IHtpZDogaWQsIGZuOiBmbiwgb25jZTogb25jZX0gOiB7aWQ6IGlkLCBmbjogZm59KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGN1c3RvbSBldmVudC4gQ2FsbCB3aXRob3V0IHBhcmFtZXRlcnMgdG8gcmVtb3ZlIGFsbCBldmVudHMuXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgIGV2ZW50IEV2ZW50IG5hbWUuXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IGZuICAgIExpc3RlbmVyIHRvIHJlbW92ZS4gTGVhdmUgZW1wdHkgdG8gcmVtb3ZlIGFsbC5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9ICAgaWQgICAgKG9wdGlvbmFsKSBPbmx5IHJlbW92ZSBldmVudHMgZm9yIHRoaXMgc291bmQuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBvZmY6IGZ1bmN0aW9uKGV2ZW50LCBmbiwgaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBldmVudHMgPSBzZWxmWydfb24nICsgZXZlbnRdO1xuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICBpZiAoZm4pIHtcbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGV2ZW50IHN0b3JlIGFuZCByZW1vdmUgdGhlIHBhc3NlZCBmdW5jdGlvbi5cbiAgICAgICAgZm9yIChpPTA7IGk8ZXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGZuID09PSBldmVudHNbaV0uZm4gJiYgaWQgPT09IGV2ZW50c1tpXS5pZCkge1xuICAgICAgICAgICAgZXZlbnRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChldmVudCkge1xuICAgICAgICAvLyBDbGVhciBvdXQgYWxsIGV2ZW50cyBvZiB0aGlzIHR5cGUuXG4gICAgICAgIHNlbGZbJ19vbicgKyBldmVudF0gPSBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENsZWFyIG91dCBhbGwgZXZlbnRzIG9mIGV2ZXJ5IHR5cGUuXG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoc2VsZik7XG4gICAgICAgIGZvciAoaT0wOyBpPGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoKGtleXNbaV0uaW5kZXhPZignX29uJykgPT09IDApICYmIEFycmF5LmlzQXJyYXkoc2VsZltrZXlzW2ldXSkpIHtcbiAgICAgICAgICAgIHNlbGZba2V5c1tpXV0gPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIExpc3RlbiB0byBhIGN1c3RvbSBldmVudCBhbmQgcmVtb3ZlIGl0IG9uY2UgZmlyZWQuXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgIGV2ZW50IEV2ZW50IG5hbWUuXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IGZuICAgIExpc3RlbmVyIHRvIGNhbGwuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSAgIGlkICAgIChvcHRpb25hbCkgT25seSBsaXN0ZW4gdG8gZXZlbnRzIGZvciB0aGlzIHNvdW5kLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgb25jZTogZnVuY3Rpb24oZXZlbnQsIGZuLCBpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBTZXR1cCB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAgICBzZWxmLm9uKGV2ZW50LCBmbiwgaWQsIDEpO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRW1pdCBhbGwgZXZlbnRzIG9mIGEgc3BlY2lmaWMgdHlwZSBhbmQgcGFzcyB0aGUgc291bmQgaWQuXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSBldmVudCBFdmVudCBuYW1lLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgICAgU291bmQgSUQuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBtc2cgICBNZXNzYWdlIHRvIGdvIHdpdGggZXZlbnQuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBfZW1pdDogZnVuY3Rpb24oZXZlbnQsIGlkLCBtc2cpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBldmVudHMgPSBzZWxmWydfb24nICsgZXZlbnRdO1xuXG4gICAgICAvLyBMb29wIHRocm91Z2ggZXZlbnQgc3RvcmUgYW5kIGZpcmUgYWxsIGZ1bmN0aW9ucy5cbiAgICAgIGZvciAodmFyIGk9ZXZlbnRzLmxlbmd0aC0xOyBpPj0wOyBpLS0pIHtcbiAgICAgICAgaWYgKCFldmVudHNbaV0uaWQgfHwgZXZlbnRzW2ldLmlkID09PSBpZCB8fCBldmVudCA9PT0gJ2xvYWQnKSB7XG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbihmbikge1xuICAgICAgICAgICAgZm4uY2FsbCh0aGlzLCBpZCwgbXNnKTtcbiAgICAgICAgICB9LmJpbmQoc2VsZiwgZXZlbnRzW2ldLmZuKSwgMCk7XG5cbiAgICAgICAgICAvLyBJZiB0aGlzIGV2ZW50IHdhcyBzZXR1cCB3aXRoIGBvbmNlYCwgcmVtb3ZlIGl0LlxuICAgICAgICAgIGlmIChldmVudHNbaV0ub25jZSkge1xuICAgICAgICAgICAgc2VsZi5vZmYoZXZlbnQsIGV2ZW50c1tpXS5mbiwgZXZlbnRzW2ldLmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFF1ZXVlIG9mIGFjdGlvbnMgaW5pdGlhdGVkIGJlZm9yZSB0aGUgc291bmQgaGFzIGxvYWRlZC5cbiAgICAgKiBUaGVzZSB3aWxsIGJlIGNhbGxlZCBpbiBzZXF1ZW5jZSwgd2l0aCB0aGUgbmV4dCBvbmx5IGZpcmluZ1xuICAgICAqIGFmdGVyIHRoZSBwcmV2aW91cyBoYXMgZmluaXNoZWQgZXhlY3V0aW5nIChldmVuIGlmIGFzeW5jIGxpa2UgcGxheSkuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBfbG9hZFF1ZXVlOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgaWYgKHNlbGYuX3F1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIHRhc2sgPSBzZWxmLl9xdWV1ZVswXTtcblxuICAgICAgICAvLyBkb24ndCBtb3ZlIG9udG8gdGhlIG5leHQgdGFzayB1bnRpbCB0aGlzIG9uZSBpcyBkb25lXG4gICAgICAgIHNlbGYub25jZSh0YXNrLmV2ZW50LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBzZWxmLl9xdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgIHNlbGYuX2xvYWRRdWV1ZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0YXNrLmFjdGlvbigpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBwbGF5YmFjayBlbmRzIGF0IHRoZSBlbmQgb2YgdGhlIGR1cmF0aW9uLlxuICAgICAqIEBwYXJhbSAge1NvdW5kfSBzb3VuZCBUaGUgc291bmQgb2JqZWN0IHRvIHdvcmsgd2l0aC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIF9lbmRlZDogZnVuY3Rpb24oc291bmQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBzcHJpdGUgPSBzb3VuZC5fc3ByaXRlO1xuXG4gICAgICAvLyBTaG91bGQgdGhpcyBzb3VuZCBsb29wP1xuICAgICAgdmFyIGxvb3AgPSAhIShzb3VuZC5fbG9vcCB8fCBzZWxmLl9zcHJpdGVbc3ByaXRlXVsyXSk7XG5cbiAgICAgIC8vIEZpcmUgdGhlIGVuZGVkIGV2ZW50LlxuICAgICAgc2VsZi5fZW1pdCgnZW5kJywgc291bmQuX2lkKTtcblxuICAgICAgLy8gUmVzdGFydCB0aGUgcGxheWJhY2sgZm9yIEhUTUw1IEF1ZGlvIGxvb3AuXG4gICAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvICYmIGxvb3ApIHtcbiAgICAgICAgc2VsZi5zdG9wKHNvdW5kLl9pZCwgdHJ1ZSkucGxheShzb3VuZC5faWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXN0YXJ0IHRoaXMgdGltZXIgaWYgb24gYSBXZWIgQXVkaW8gbG9vcC5cbiAgICAgIGlmIChzZWxmLl93ZWJBdWRpbyAmJiBsb29wKSB7XG4gICAgICAgIHNlbGYuX2VtaXQoJ3BsYXknLCBzb3VuZC5faWQpO1xuICAgICAgICBzb3VuZC5fc2VlayA9IHNvdW5kLl9zdGFydCB8fCAwO1xuICAgICAgICBzb3VuZC5fcmF0ZVNlZWsgPSAwO1xuICAgICAgICBzb3VuZC5fcGxheVN0YXJ0ID0gSG93bGVyLmN0eC5jdXJyZW50VGltZTtcblxuICAgICAgICB2YXIgdGltZW91dCA9ICgoc291bmQuX3N0b3AgLSBzb3VuZC5fc3RhcnQpICogMTAwMCkgLyBNYXRoLmFicyhzb3VuZC5fcmF0ZSk7XG4gICAgICAgIHNlbGYuX2VuZFRpbWVyc1tzb3VuZC5faWRdID0gc2V0VGltZW91dChzZWxmLl9lbmRlZC5iaW5kKHNlbGYsIHNvdW5kKSwgdGltZW91dCk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1hcmsgdGhlIG5vZGUgYXMgcGF1c2VkLlxuICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvICYmICFsb29wKSB7XG4gICAgICAgIHNvdW5kLl9wYXVzZWQgPSB0cnVlO1xuICAgICAgICBzb3VuZC5fZW5kZWQgPSB0cnVlO1xuICAgICAgICBzb3VuZC5fc2VlayA9IHNvdW5kLl9zdGFydCB8fCAwO1xuICAgICAgICBzb3VuZC5fcmF0ZVNlZWsgPSAwO1xuICAgICAgICBzZWxmLl9jbGVhclRpbWVyKHNvdW5kLl9pZCk7XG5cbiAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIGJ1ZmZlciBzb3VyY2UuXG4gICAgICAgIHNlbGYuX2NsZWFuQnVmZmVyKHNvdW5kLl9ub2RlKTtcblxuICAgICAgICAvLyBBdHRlbXB0IHRvIGF1dG8tc3VzcGVuZCBBdWRpb0NvbnRleHQgaWYgbm8gc291bmRzIGFyZSBzdGlsbCBwbGF5aW5nLlxuICAgICAgICBIb3dsZXIuX2F1dG9TdXNwZW5kKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdoZW4gdXNpbmcgYSBzcHJpdGUsIGVuZCB0aGUgdHJhY2suXG4gICAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvICYmICFsb29wKSB7XG4gICAgICAgIHNlbGYuc3RvcChzb3VuZC5faWQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgdGhlIGVuZCB0aW1lciBmb3IgYSBzb3VuZCBwbGF5YmFjay5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkIFRoZSBzb3VuZCBJRC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIF9jbGVhclRpbWVyOiBmdW5jdGlvbihpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICBpZiAoc2VsZi5fZW5kVGltZXJzW2lkXSkge1xuICAgICAgICBjbGVhclRpbWVvdXQoc2VsZi5fZW5kVGltZXJzW2lkXSk7XG4gICAgICAgIGRlbGV0ZSBzZWxmLl9lbmRUaW1lcnNbaWRdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBzb3VuZCBpZGVudGlmaWVkIGJ5IHRoaXMgSUQsIG9yIHJldHVybiBudWxsLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgU291bmQgSURcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9ICAgIFNvdW5kIG9iamVjdCBvciBudWxsLlxuICAgICAqL1xuICAgIF9zb3VuZEJ5SWQ6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgc291bmRzIGFuZCBmaW5kIHRoZSBvbmUgd2l0aCB0aGlzIElELlxuICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX3NvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaWQgPT09IHNlbGYuX3NvdW5kc1tpXS5faWQpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5fc291bmRzW2ldO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYW4gaW5hY3RpdmUgc291bmQgZnJvbSB0aGUgcG9vbCBvciBjcmVhdGUgYSBuZXcgb25lLlxuICAgICAqIEByZXR1cm4ge1NvdW5kfSBTb3VuZCBwbGF5YmFjayBvYmplY3QuXG4gICAgICovXG4gICAgX2luYWN0aXZlU291bmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICBzZWxmLl9kcmFpbigpO1xuXG4gICAgICAvLyBGaW5kIHRoZSBmaXJzdCBpbmFjdGl2ZSBub2RlIHRvIHJlY3ljbGUuXG4gICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5fc291bmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzZWxmLl9zb3VuZHNbaV0uX2VuZGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuX3NvdW5kc1tpXS5yZXNldCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIGluYWN0aXZlIG5vZGUgd2FzIGZvdW5kLCBjcmVhdGUgYSBuZXcgb25lLlxuICAgICAgcmV0dXJuIG5ldyBTb3VuZChzZWxmKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRHJhaW4gZXhjZXNzIGluYWN0aXZlIHNvdW5kcyBmcm9tIHRoZSBwb29sLlxuICAgICAqL1xuICAgIF9kcmFpbjogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgbGltaXQgPSBzZWxmLl9wb29sO1xuICAgICAgdmFyIGNudCA9IDA7XG4gICAgICB2YXIgaSA9IDA7XG5cbiAgICAgIC8vIElmIHRoZXJlIGFyZSBsZXNzIHNvdW5kcyB0aGFuIHRoZSBtYXggcG9vbCBzaXplLCB3ZSBhcmUgZG9uZS5cbiAgICAgIGlmIChzZWxmLl9zb3VuZHMubGVuZ3RoIDwgbGltaXQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGluYWN0aXZlIHNvdW5kcy5cbiAgICAgIGZvciAoaT0wOyBpPHNlbGYuX3NvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2VsZi5fc291bmRzW2ldLl9lbmRlZCkge1xuICAgICAgICAgIGNudCsrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSBleGNlc3MgaW5hY3RpdmUgc291bmRzLCBnb2luZyBpbiByZXZlcnNlIG9yZGVyLlxuICAgICAgZm9yIChpPXNlbGYuX3NvdW5kcy5sZW5ndGggLSAxOyBpPj0wOyBpLS0pIHtcbiAgICAgICAgaWYgKGNudCA8PSBsaW1pdCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxmLl9zb3VuZHNbaV0uX2VuZGVkKSB7XG4gICAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgYXVkaW8gc291cmNlIHdoZW4gdXNpbmcgV2ViIEF1ZGlvLlxuICAgICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbyAmJiBzZWxmLl9zb3VuZHNbaV0uX25vZGUpIHtcbiAgICAgICAgICAgIHNlbGYuX3NvdW5kc1tpXS5fbm9kZS5kaXNjb25uZWN0KDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlbW92ZSBzb3VuZHMgdW50aWwgd2UgaGF2ZSB0aGUgcG9vbCBzaXplLlxuICAgICAgICAgIHNlbGYuX3NvdW5kcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgY250LS07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBJRCdzIGZyb20gdGhlIHNvdW5kcyBwb29sLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgT25seSByZXR1cm4gb25lIElEIGlmIG9uZSBpcyBwYXNzZWQuXG4gICAgICogQHJldHVybiB7QXJyYXl9ICAgIEFycmF5IG9mIElEcy5cbiAgICAgKi9cbiAgICBfZ2V0U291bmRJZHM6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIGlmICh0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBpZHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX3NvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlkcy5wdXNoKHNlbGYuX3NvdW5kc1tpXS5faWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGlkcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbaWRdO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMb2FkIHRoZSBzb3VuZCBiYWNrIGludG8gdGhlIGJ1ZmZlciBzb3VyY2UuXG4gICAgICogQHBhcmFtICB7U291bmR9IHNvdW5kIFRoZSBzb3VuZCBvYmplY3QgdG8gd29yayB3aXRoLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgX3JlZnJlc2hCdWZmZXI6IGZ1bmN0aW9uKHNvdW5kKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIFNldHVwIHRoZSBidWZmZXIgc291cmNlIGZvciBwbGF5YmFjay5cbiAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZSA9IEhvd2xlci5jdHguY3JlYXRlQnVmZmVyU291cmNlKCk7XG4gICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UuYnVmZmVyID0gY2FjaGVbc2VsZi5fc3JjXTtcblxuICAgICAgLy8gQ29ubmVjdCB0byB0aGUgY29ycmVjdCBub2RlLlxuICAgICAgaWYgKHNvdW5kLl9wYW5uZXIpIHtcbiAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLmNvbm5lY3Qoc291bmQuX3Bhbm5lcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UuY29ubmVjdChzb3VuZC5fbm9kZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldHVwIGxvb3BpbmcgYW5kIHBsYXliYWNrIHJhdGUuXG4gICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UubG9vcCA9IHNvdW5kLl9sb29wO1xuICAgICAgaWYgKHNvdW5kLl9sb29wKSB7XG4gICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5sb29wU3RhcnQgPSBzb3VuZC5fc3RhcnQgfHwgMDtcbiAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLmxvb3BFbmQgPSBzb3VuZC5fc3RvcDtcbiAgICAgIH1cbiAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5wbGF5YmFja1JhdGUudmFsdWUgPSBzb3VuZC5fcmF0ZTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFByZXZlbnQgbWVtb3J5IGxlYWtzIGJ5IGNsZWFuaW5nIHVwIHRoZSBidWZmZXIgc291cmNlIGFmdGVyIHBsYXliYWNrLlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gbm9kZSBTb3VuZCdzIGF1ZGlvIG5vZGUgY29udGFpbmluZyB0aGUgYnVmZmVyIHNvdXJjZS5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIF9jbGVhbkJ1ZmZlcjogZnVuY3Rpb24obm9kZSkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICBpZiAoc2VsZi5fc2NyYXRjaEJ1ZmZlcikge1xuICAgICAgICBub2RlLmJ1ZmZlclNvdXJjZS5vbmVuZGVkID0gbnVsbDtcbiAgICAgICAgbm9kZS5idWZmZXJTb3VyY2UuZGlzY29ubmVjdCgwKTtcbiAgICAgICAgdHJ5IHsgbm9kZS5idWZmZXJTb3VyY2UuYnVmZmVyID0gc2VsZi5fc2NyYXRjaEJ1ZmZlcjsgfSBjYXRjaChlKSB7fVxuICAgICAgfVxuICAgICAgbm9kZS5idWZmZXJTb3VyY2UgPSBudWxsO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG4gIH07XG5cbiAgLyoqIFNpbmdsZSBTb3VuZCBNZXRob2RzICoqL1xuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBTZXR1cCB0aGUgc291bmQgb2JqZWN0LCB3aGljaCBlYWNoIG5vZGUgYXR0YWNoZWQgdG8gYSBIb3dsIGdyb3VwIGlzIGNvbnRhaW5lZCBpbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IGhvd2wgVGhlIEhvd2wgcGFyZW50IGdyb3VwLlxuICAgKi9cbiAgdmFyIFNvdW5kID0gZnVuY3Rpb24oaG93bCkge1xuICAgIHRoaXMuX3BhcmVudCA9IGhvd2w7XG4gICAgdGhpcy5pbml0KCk7XG4gIH07XG4gIFNvdW5kLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIGEgbmV3IFNvdW5kIG9iamVjdC5cbiAgICAgKiBAcmV0dXJuIHtTb3VuZH1cbiAgICAgKi9cbiAgICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBwYXJlbnQgPSBzZWxmLl9wYXJlbnQ7XG5cbiAgICAgIC8vIFNldHVwIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMuXG4gICAgICBzZWxmLl9tdXRlZCA9IHBhcmVudC5fbXV0ZWQ7XG4gICAgICBzZWxmLl9sb29wID0gcGFyZW50Ll9sb29wO1xuICAgICAgc2VsZi5fdm9sdW1lID0gcGFyZW50Ll92b2x1bWU7XG4gICAgICBzZWxmLl9tdXRlZCA9IHBhcmVudC5fbXV0ZWQ7XG4gICAgICBzZWxmLl9yYXRlID0gcGFyZW50Ll9yYXRlO1xuICAgICAgc2VsZi5fc2VlayA9IDA7XG4gICAgICBzZWxmLl9wYXVzZWQgPSB0cnVlO1xuICAgICAgc2VsZi5fZW5kZWQgPSB0cnVlO1xuICAgICAgc2VsZi5fc3ByaXRlID0gJ19fZGVmYXVsdCc7XG5cbiAgICAgIC8vIEdlbmVyYXRlIGEgdW5pcXVlIElEIGZvciB0aGlzIHNvdW5kLlxuICAgICAgc2VsZi5faWQgPSBNYXRoLnJvdW5kKERhdGUubm93KCkgKiBNYXRoLnJhbmRvbSgpKTtcblxuICAgICAgLy8gQWRkIGl0c2VsZiB0byB0aGUgcGFyZW50J3MgcG9vbC5cbiAgICAgIHBhcmVudC5fc291bmRzLnB1c2goc2VsZik7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IG5vZGUuXG4gICAgICBzZWxmLmNyZWF0ZSgpO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuZCBzZXR1cCBhIG5ldyBzb3VuZCBvYmplY3QsIHdoZXRoZXIgSFRNTDUgQXVkaW8gb3IgV2ViIEF1ZGlvLlxuICAgICAqIEByZXR1cm4ge1NvdW5kfVxuICAgICAqL1xuICAgIGNyZWF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgcGFyZW50ID0gc2VsZi5fcGFyZW50O1xuICAgICAgdmFyIHZvbHVtZSA9IChIb3dsZXIuX211dGVkIHx8IHNlbGYuX211dGVkIHx8IHNlbGYuX3BhcmVudC5fbXV0ZWQpID8gMCA6IHNlbGYuX3ZvbHVtZTtcblxuICAgICAgaWYgKHBhcmVudC5fd2ViQXVkaW8pIHtcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBnYWluIG5vZGUgZm9yIGNvbnRyb2xsaW5nIHZvbHVtZSAodGhlIHNvdXJjZSB3aWxsIGNvbm5lY3QgdG8gdGhpcykuXG4gICAgICAgIHNlbGYuX25vZGUgPSAodHlwZW9mIEhvd2xlci5jdHguY3JlYXRlR2FpbiA9PT0gJ3VuZGVmaW5lZCcpID8gSG93bGVyLmN0eC5jcmVhdGVHYWluTm9kZSgpIDogSG93bGVyLmN0eC5jcmVhdGVHYWluKCk7XG4gICAgICAgIHNlbGYuX25vZGUuZ2Fpbi5zZXRWYWx1ZUF0VGltZSh2b2x1bWUsIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICBzZWxmLl9ub2RlLnBhdXNlZCA9IHRydWU7XG4gICAgICAgIHNlbGYuX25vZGUuY29ubmVjdChIb3dsZXIubWFzdGVyR2Fpbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLl9ub2RlID0gbmV3IEF1ZGlvKCk7XG5cbiAgICAgICAgLy8gTGlzdGVuIGZvciBlcnJvcnMgKGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3NwZWMtYXV0aG9yLXZpZXcvc3BlYy5odG1sI21lZGlhZXJyb3IpLlxuICAgICAgICBzZWxmLl9lcnJvckZuID0gc2VsZi5fZXJyb3JMaXN0ZW5lci5iaW5kKHNlbGYpO1xuICAgICAgICBzZWxmLl9ub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgc2VsZi5fZXJyb3JGbiwgZmFsc2UpO1xuXG4gICAgICAgIC8vIExpc3RlbiBmb3IgJ2NhbnBsYXl0aHJvdWdoJyBldmVudCB0byBsZXQgdXMga25vdyB0aGUgc291bmQgaXMgcmVhZHkuXG4gICAgICAgIHNlbGYuX2xvYWRGbiA9IHNlbGYuX2xvYWRMaXN0ZW5lci5iaW5kKHNlbGYpO1xuICAgICAgICBzZWxmLl9ub2RlLmFkZEV2ZW50TGlzdGVuZXIoSG93bGVyLl9jYW5QbGF5RXZlbnQsIHNlbGYuX2xvYWRGbiwgZmFsc2UpO1xuXG4gICAgICAgIC8vIFNldHVwIHRoZSBuZXcgYXVkaW8gbm9kZS5cbiAgICAgICAgc2VsZi5fbm9kZS5zcmMgPSBwYXJlbnQuX3NyYztcbiAgICAgICAgc2VsZi5fbm9kZS5wcmVsb2FkID0gJ2F1dG8nO1xuICAgICAgICBzZWxmLl9ub2RlLnZvbHVtZSA9IHZvbHVtZSAqIEhvd2xlci52b2x1bWUoKTtcblxuICAgICAgICAvLyBCZWdpbiBsb2FkaW5nIHRoZSBzb3VyY2UuXG4gICAgICAgIHNlbGYuX25vZGUubG9hZCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVzZXQgdGhlIHBhcmFtZXRlcnMgb2YgdGhpcyBzb3VuZCB0byB0aGUgb3JpZ2luYWwgc3RhdGUgKGZvciByZWN5Y2xlKS5cbiAgICAgKiBAcmV0dXJuIHtTb3VuZH1cbiAgICAgKi9cbiAgICByZXNldDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgcGFyZW50ID0gc2VsZi5fcGFyZW50O1xuXG4gICAgICAvLyBSZXNldCBhbGwgb2YgdGhlIHBhcmFtZXRlcnMgb2YgdGhpcyBzb3VuZC5cbiAgICAgIHNlbGYuX211dGVkID0gcGFyZW50Ll9tdXRlZDtcbiAgICAgIHNlbGYuX2xvb3AgPSBwYXJlbnQuX2xvb3A7XG4gICAgICBzZWxmLl92b2x1bWUgPSBwYXJlbnQuX3ZvbHVtZTtcbiAgICAgIHNlbGYuX211dGVkID0gcGFyZW50Ll9tdXRlZDtcbiAgICAgIHNlbGYuX3JhdGUgPSBwYXJlbnQuX3JhdGU7XG4gICAgICBzZWxmLl9zZWVrID0gMDtcbiAgICAgIHNlbGYuX3JhdGVTZWVrID0gMDtcbiAgICAgIHNlbGYuX3BhdXNlZCA9IHRydWU7XG4gICAgICBzZWxmLl9lbmRlZCA9IHRydWU7XG4gICAgICBzZWxmLl9zcHJpdGUgPSAnX19kZWZhdWx0JztcblxuICAgICAgLy8gR2VuZXJhdGUgYSBuZXcgSUQgc28gdGhhdCBpdCBpc24ndCBjb25mdXNlZCB3aXRoIHRoZSBwcmV2aW91cyBzb3VuZC5cbiAgICAgIHNlbGYuX2lkID0gTWF0aC5yb3VuZChEYXRlLm5vdygpICogTWF0aC5yYW5kb20oKSk7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBIVE1MNSBBdWRpbyBlcnJvciBsaXN0ZW5lciBjYWxsYmFjay5cbiAgICAgKi9cbiAgICBfZXJyb3JMaXN0ZW5lcjogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIEZpcmUgYW4gZXJyb3IgZXZlbnQgYW5kIHBhc3MgYmFjayB0aGUgY29kZS5cbiAgICAgIHNlbGYuX3BhcmVudC5fZW1pdCgnbG9hZGVycm9yJywgc2VsZi5faWQsIHNlbGYuX25vZGUuZXJyb3IgPyBzZWxmLl9ub2RlLmVycm9yLmNvZGUgOiAwKTtcblxuICAgICAgLy8gQ2xlYXIgdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgc2VsZi5fbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIHNlbGYuX2Vycm9yTGlzdGVuZXIsIGZhbHNlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSFRNTDUgQXVkaW8gY2FucGxheXRocm91Z2ggbGlzdGVuZXIgY2FsbGJhY2suXG4gICAgICovXG4gICAgX2xvYWRMaXN0ZW5lcjogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgcGFyZW50ID0gc2VsZi5fcGFyZW50O1xuXG4gICAgICAvLyBSb3VuZCB1cCB0aGUgZHVyYXRpb24gdG8gYWNjb3VudCBmb3IgdGhlIGxvd2VyIHByZWNpc2lvbiBpbiBIVE1MNSBBdWRpby5cbiAgICAgIHBhcmVudC5fZHVyYXRpb24gPSBNYXRoLmNlaWwoc2VsZi5fbm9kZS5kdXJhdGlvbiAqIDEwKSAvIDEwO1xuXG4gICAgICAvLyBTZXR1cCBhIHNwcml0ZSBpZiBub25lIGlzIGRlZmluZWQuXG4gICAgICBpZiAoT2JqZWN0LmtleXMocGFyZW50Ll9zcHJpdGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBwYXJlbnQuX3Nwcml0ZSA9IHtfX2RlZmF1bHQ6IFswLCBwYXJlbnQuX2R1cmF0aW9uICogMTAwMF19O1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Ll9zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgICAgcGFyZW50Ll9zdGF0ZSA9ICdsb2FkZWQnO1xuICAgICAgICBwYXJlbnQuX2VtaXQoJ2xvYWQnKTtcbiAgICAgICAgcGFyZW50Ll9sb2FkUXVldWUoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgc2VsZi5fbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEhvd2xlci5fY2FuUGxheUV2ZW50LCBzZWxmLl9sb2FkRm4sIGZhbHNlKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqIEhlbHBlciBNZXRob2RzICoqL1xuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHZhciBjYWNoZSA9IHt9O1xuXG4gIC8qKlxuICAgKiBCdWZmZXIgYSBzb3VuZCBmcm9tIFVSTCwgRGF0YSBVUkkgb3IgY2FjaGUgYW5kIGRlY29kZSB0byBhdWRpbyBzb3VyY2UgKFdlYiBBdWRpbyBBUEkpLlxuICAgKiBAcGFyYW0gIHtIb3dsfSBzZWxmXG4gICAqL1xuICB2YXIgbG9hZEJ1ZmZlciA9IGZ1bmN0aW9uKHNlbGYpIHtcbiAgICB2YXIgdXJsID0gc2VsZi5fc3JjO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIGNhY2hlZCBhbmQgdXNlIGl0IGluc3RlYWQuXG4gICAgaWYgKGNhY2hlW3VybF0pIHtcbiAgICAgIC8vIFNldCB0aGUgZHVyYXRpb24gZnJvbSB0aGUgY2FjaGUuXG4gICAgICBzZWxmLl9kdXJhdGlvbiA9IGNhY2hlW3VybF0uZHVyYXRpb247XG5cbiAgICAgIC8vIExvYWQgdGhlIHNvdW5kIGludG8gdGhpcyBIb3dsLlxuICAgICAgbG9hZFNvdW5kKHNlbGYpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKC9eZGF0YTpbXjtdKztiYXNlNjQsLy50ZXN0KHVybCkpIHtcbiAgICAgIC8vIERlY29kZSB0aGUgYmFzZTY0IGRhdGEgVVJJIHdpdGhvdXQgWEhSLCBzaW5jZSBzb21lIGJyb3dzZXJzIGRvbid0IHN1cHBvcnQgaXQuXG4gICAgICB2YXIgZGF0YSA9IGF0b2IodXJsLnNwbGl0KCcsJylbMV0pO1xuICAgICAgdmFyIGRhdGFWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5sZW5ndGgpO1xuICAgICAgZm9yICh2YXIgaT0wOyBpPGRhdGEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgZGF0YVZpZXdbaV0gPSBkYXRhLmNoYXJDb2RlQXQoaSk7XG4gICAgICB9XG5cbiAgICAgIGRlY29kZUF1ZGlvRGF0YShkYXRhVmlldy5idWZmZXIsIHNlbGYpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMb2FkIHRoZSBidWZmZXIgZnJvbSB0aGUgVVJMLlxuICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7XG4gICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGdldCBhIHN1Y2Nlc3NmdWwgcmVzcG9uc2UgYmFjay5cbiAgICAgICAgdmFyIGNvZGUgPSAoeGhyLnN0YXR1cyArICcnKVswXTtcbiAgICAgICAgaWYgKGNvZGUgIT09ICcwJyAmJiBjb2RlICE9PSAnMicgJiYgY29kZSAhPT0gJzMnKSB7XG4gICAgICAgICAgc2VsZi5fZW1pdCgnbG9hZGVycm9yJywgbnVsbCwgJ0ZhaWxlZCBsb2FkaW5nIGF1ZGlvIGZpbGUgd2l0aCBzdGF0dXM6ICcgKyB4aHIuc3RhdHVzICsgJy4nKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBkZWNvZGVBdWRpb0RhdGEoeGhyLnJlc3BvbnNlLCBzZWxmKTtcbiAgICAgIH07XG4gICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciwgc3dpdGNoIHRvIEhUTUw1IEF1ZGlvLlxuICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgICBzZWxmLl9odG1sNSA9IHRydWU7XG4gICAgICAgICAgc2VsZi5fd2ViQXVkaW8gPSBmYWxzZTtcbiAgICAgICAgICBzZWxmLl9zb3VuZHMgPSBbXTtcbiAgICAgICAgICBkZWxldGUgY2FjaGVbdXJsXTtcbiAgICAgICAgICBzZWxmLmxvYWQoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHNhZmVYaHJTZW5kKHhocik7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBTZW5kIHRoZSBYSFIgcmVxdWVzdCB3cmFwcGVkIGluIGEgdHJ5L2NhdGNoLlxuICAgKiBAcGFyYW0gIHtPYmplY3R9IHhociBYSFIgdG8gc2VuZC5cbiAgICovXG4gIHZhciBzYWZlWGhyU2VuZCA9IGZ1bmN0aW9uKHhocikge1xuICAgIHRyeSB7XG4gICAgICB4aHIuc2VuZCgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHhoci5vbmVycm9yKCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBEZWNvZGUgYXVkaW8gZGF0YSBmcm9tIGFuIGFycmF5IGJ1ZmZlci5cbiAgICogQHBhcmFtICB7QXJyYXlCdWZmZXJ9IGFycmF5YnVmZmVyIFRoZSBhdWRpbyBkYXRhLlxuICAgKiBAcGFyYW0gIHtIb3dsfSAgICAgICAgc2VsZlxuICAgKi9cbiAgdmFyIGRlY29kZUF1ZGlvRGF0YSA9IGZ1bmN0aW9uKGFycmF5YnVmZmVyLCBzZWxmKSB7XG4gICAgLy8gRGVjb2RlIHRoZSBidWZmZXIgaW50byBhbiBhdWRpbyBzb3VyY2UuXG4gICAgSG93bGVyLmN0eC5kZWNvZGVBdWRpb0RhdGEoYXJyYXlidWZmZXIsIGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAgICAgaWYgKGJ1ZmZlciAmJiBzZWxmLl9zb3VuZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjYWNoZVtzZWxmLl9zcmNdID0gYnVmZmVyO1xuICAgICAgICBsb2FkU291bmQoc2VsZiwgYnVmZmVyKTtcbiAgICAgIH1cbiAgICB9LCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuX2VtaXQoJ2xvYWRlcnJvcicsIG51bGwsICdEZWNvZGluZyBhdWRpbyBkYXRhIGZhaWxlZC4nKTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogU291bmQgaXMgbm93IGxvYWRlZCwgc28gZmluaXNoIHNldHRpbmcgZXZlcnl0aGluZyB1cCBhbmQgZmlyZSB0aGUgbG9hZGVkIGV2ZW50LlxuICAgKiBAcGFyYW0gIHtIb3dsfSBzZWxmXG4gICAqIEBwYXJhbSAge09iamVjdH0gYnVmZmVyIFRoZSBkZWNvZGVkIGJ1ZmZlciBzb3VuZCBzb3VyY2UuXG4gICAqL1xuICB2YXIgbG9hZFNvdW5kID0gZnVuY3Rpb24oc2VsZiwgYnVmZmVyKSB7XG4gICAgLy8gU2V0IHRoZSBkdXJhdGlvbi5cbiAgICBpZiAoYnVmZmVyICYmICFzZWxmLl9kdXJhdGlvbikge1xuICAgICAgc2VsZi5fZHVyYXRpb24gPSBidWZmZXIuZHVyYXRpb247XG4gICAgfVxuXG4gICAgLy8gU2V0dXAgYSBzcHJpdGUgaWYgbm9uZSBpcyBkZWZpbmVkLlxuICAgIGlmIChPYmplY3Qua2V5cyhzZWxmLl9zcHJpdGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2VsZi5fc3ByaXRlID0ge19fZGVmYXVsdDogWzAsIHNlbGYuX2R1cmF0aW9uICogMTAwMF19O1xuICAgIH1cblxuICAgIC8vIEZpcmUgdGhlIGxvYWRlZCBldmVudC5cbiAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICBzZWxmLl9zdGF0ZSA9ICdsb2FkZWQnO1xuICAgICAgc2VsZi5fZW1pdCgnbG9hZCcpO1xuICAgICAgc2VsZi5fbG9hZFF1ZXVlKCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBTZXR1cCB0aGUgYXVkaW8gY29udGV4dCB3aGVuIGF2YWlsYWJsZSwgb3Igc3dpdGNoIHRvIEhUTUw1IEF1ZGlvIG1vZGUuXG4gICAqL1xuICB2YXIgc2V0dXBBdWRpb0NvbnRleHQgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBhcmUgdXNpbmcgV2ViIEF1ZGlvIGFuZCBzZXR1cCB0aGUgQXVkaW9Db250ZXh0IGlmIHdlIGFyZS5cbiAgICB0cnkge1xuICAgICAgaWYgKHR5cGVvZiBBdWRpb0NvbnRleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIEhvd2xlci5jdHggPSBuZXcgQXVkaW9Db250ZXh0KCk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB3ZWJraXRBdWRpb0NvbnRleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIEhvd2xlci5jdHggPSBuZXcgd2Via2l0QXVkaW9Db250ZXh0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBIb3dsZXIudXNpbmdXZWJBdWRpbyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2goZSkge1xuICAgICAgSG93bGVyLnVzaW5nV2ViQXVkaW8gPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBhIHdlYnZpZXcgaXMgYmVpbmcgdXNlZCBvbiBpT1M4IG9yIGVhcmxpZXIgKHJhdGhlciB0aGFuIHRoZSBicm93c2VyKS5cbiAgICAvLyBJZiBpdCBpcywgZGlzYWJsZSBXZWIgQXVkaW8gYXMgaXQgY2F1c2VzIGNyYXNoaW5nLlxuICAgIHZhciBpT1MgPSAoL2lQKGhvbmV8b2R8YWQpLy50ZXN0KEhvd2xlci5fbmF2aWdhdG9yICYmIEhvd2xlci5fbmF2aWdhdG9yLnBsYXRmb3JtKSk7XG4gICAgdmFyIGFwcFZlcnNpb24gPSBIb3dsZXIuX25hdmlnYXRvciAmJiBIb3dsZXIuX25hdmlnYXRvci5hcHBWZXJzaW9uLm1hdGNoKC9PUyAoXFxkKylfKFxcZCspXz8oXFxkKyk/Lyk7XG4gICAgdmFyIHZlcnNpb24gPSBhcHBWZXJzaW9uID8gcGFyc2VJbnQoYXBwVmVyc2lvblsxXSwgMTApIDogbnVsbDtcbiAgICBpZiAoaU9TICYmIHZlcnNpb24gJiYgdmVyc2lvbiA8IDkpIHtcbiAgICAgIHZhciBzYWZhcmkgPSAvc2FmYXJpLy50ZXN0KEhvd2xlci5fbmF2aWdhdG9yICYmIEhvd2xlci5fbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIGlmIChIb3dsZXIuX25hdmlnYXRvciAmJiBIb3dsZXIuX25hdmlnYXRvci5zdGFuZGFsb25lICYmICFzYWZhcmkgfHwgSG93bGVyLl9uYXZpZ2F0b3IgJiYgIUhvd2xlci5fbmF2aWdhdG9yLnN0YW5kYWxvbmUgJiYgIXNhZmFyaSkge1xuICAgICAgICBIb3dsZXIudXNpbmdXZWJBdWRpbyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhbmQgZXhwb3NlIHRoZSBtYXN0ZXIgR2Fpbk5vZGUgd2hlbiB1c2luZyBXZWIgQXVkaW8gKHVzZWZ1bCBmb3IgcGx1Z2lucyBvciBhZHZhbmNlZCB1c2FnZSkuXG4gICAgaWYgKEhvd2xlci51c2luZ1dlYkF1ZGlvKSB7XG4gICAgICBIb3dsZXIubWFzdGVyR2FpbiA9ICh0eXBlb2YgSG93bGVyLmN0eC5jcmVhdGVHYWluID09PSAndW5kZWZpbmVkJykgPyBIb3dsZXIuY3R4LmNyZWF0ZUdhaW5Ob2RlKCkgOiBIb3dsZXIuY3R4LmNyZWF0ZUdhaW4oKTtcbiAgICAgIEhvd2xlci5tYXN0ZXJHYWluLmdhaW4udmFsdWUgPSAxO1xuICAgICAgSG93bGVyLm1hc3RlckdhaW4uY29ubmVjdChIb3dsZXIuY3R4LmRlc3RpbmF0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBSZS1ydW4gdGhlIHNldHVwIG9uIEhvd2xlci5cbiAgICBIb3dsZXIuX3NldHVwKCk7XG4gIH07XG5cbiAgLy8gQWRkIHN1cHBvcnQgZm9yIEFNRCAoQXN5bmNocm9ub3VzIE1vZHVsZSBEZWZpbml0aW9uKSBsaWJyYXJpZXMgc3VjaCBhcyByZXF1aXJlLmpzLlxuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKFtdLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIEhvd2xlcjogSG93bGVyLFxuICAgICAgICBIb3dsOiBIb3dsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLy8gQWRkIHN1cHBvcnQgZm9yIENvbW1vbkpTIGxpYnJhcmllcyBzdWNoIGFzIGJyb3dzZXJpZnkuXG4gIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBleHBvcnRzLkhvd2xlciA9IEhvd2xlcjtcbiAgICBleHBvcnRzLkhvd2wgPSBIb3dsO1xuICB9XG5cbiAgLy8gRGVmaW5lIGdsb2JhbGx5IGluIGNhc2UgQU1EIGlzIG5vdCBhdmFpbGFibGUgb3IgdW51c2VkLlxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB3aW5kb3cuSG93bGVyR2xvYmFsID0gSG93bGVyR2xvYmFsO1xuICAgIHdpbmRvdy5Ib3dsZXIgPSBIb3dsZXI7XG4gICAgd2luZG93Lkhvd2wgPSBIb3dsO1xuICAgIHdpbmRvdy5Tb3VuZCA9IFNvdW5kO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7IC8vIEFkZCB0byBnbG9iYWwgaW4gTm9kZS5qcyAoZm9yIHRlc3RpbmcsIGV0YykuXG4gICAgZ2xvYmFsLkhvd2xlckdsb2JhbCA9IEhvd2xlckdsb2JhbDtcbiAgICBnbG9iYWwuSG93bGVyID0gSG93bGVyO1xuICAgIGdsb2JhbC5Ib3dsID0gSG93bDtcbiAgICBnbG9iYWwuU291bmQgPSBTb3VuZDtcbiAgfVxufSkoKTtcblxuXG4vKiFcbiAqICBTcGF0aWFsIFBsdWdpbiAtIEFkZHMgc3VwcG9ydCBmb3Igc3RlcmVvIGFuZCAzRCBhdWRpbyB3aGVyZSBXZWIgQXVkaW8gaXMgc3VwcG9ydGVkLlxuICogIFxuICogIGhvd2xlci5qcyB2Mi4wLjJcbiAqICBob3dsZXJqcy5jb21cbiAqXG4gKiAgKGMpIDIwMTMtMjAxNiwgSmFtZXMgU2ltcHNvbiBvZiBHb2xkRmlyZSBTdHVkaW9zXG4gKiAgZ29sZGZpcmVzdHVkaW9zLmNvbVxuICpcbiAqICBNSVQgTGljZW5zZVxuICovXG5cbihmdW5jdGlvbigpIHtcblxuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gU2V0dXAgZGVmYXVsdCBwcm9wZXJ0aWVzLlxuICBIb3dsZXJHbG9iYWwucHJvdG90eXBlLl9wb3MgPSBbMCwgMCwgMF07XG4gIEhvd2xlckdsb2JhbC5wcm90b3R5cGUuX29yaWVudGF0aW9uID0gWzAsIDAsIC0xLCAwLCAxLCAwXTtcbiAgXG4gIC8qKiBHbG9iYWwgTWV0aG9kcyAqKi9cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byB1cGRhdGUgdGhlIHN0ZXJlbyBwYW5uaW5nIHBvc2l0aW9uIG9mIGFsbCBjdXJyZW50IEhvd2xzLlxuICAgKiBGdXR1cmUgSG93bHMgd2lsbCBub3QgdXNlIHRoaXMgdmFsdWUgdW5sZXNzIGV4cGxpY2l0bHkgc2V0LlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHBhbiBBIHZhbHVlIG9mIC0xLjAgaXMgYWxsIHRoZSB3YXkgbGVmdCBhbmQgMS4wIGlzIGFsbCB0aGUgd2F5IHJpZ2h0LlxuICAgKiBAcmV0dXJuIHtIb3dsZXIvTnVtYmVyfSAgICAgU2VsZiBvciBjdXJyZW50IHN0ZXJlbyBwYW5uaW5nIHZhbHVlLlxuICAgKi9cbiAgSG93bGVyR2xvYmFsLnByb3RvdHlwZS5zdGVyZW8gPSBmdW5jdGlvbihwYW4pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBTdG9wIHJpZ2h0IGhlcmUgaWYgbm90IHVzaW5nIFdlYiBBdWRpby5cbiAgICBpZiAoIXNlbGYuY3R4IHx8ICFzZWxmLmN0eC5saXN0ZW5lcikge1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBIb3dscyBhbmQgdXBkYXRlIHRoZWlyIHN0ZXJlbyBwYW5uaW5nLlxuICAgIGZvciAodmFyIGk9c2VsZi5faG93bHMubGVuZ3RoLTE7IGk+PTA7IGktLSkge1xuICAgICAgc2VsZi5faG93bHNbaV0uc3RlcmVvKHBhbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldC9zZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBsaXN0ZW5lciBpbiAzRCBjYXJ0ZXNpYW4gc3BhY2UuIFNvdW5kcyB1c2luZ1xuICAgKiAzRCBwb3NpdGlvbiB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBsaXN0ZW5lcidzIHBvc2l0aW9uLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHggVGhlIHgtcG9zaXRpb24gb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHkgVGhlIHktcG9zaXRpb24gb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHogVGhlIHotcG9zaXRpb24gb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcmV0dXJuIHtIb3dsZXIvQXJyYXl9ICAgU2VsZiBvciBjdXJyZW50IGxpc3RlbmVyIHBvc2l0aW9uLlxuICAgKi9cbiAgSG93bGVyR2xvYmFsLnByb3RvdHlwZS5wb3MgPSBmdW5jdGlvbih4LCB5LCB6KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gU3RvcCByaWdodCBoZXJlIGlmIG5vdCB1c2luZyBXZWIgQXVkaW8uXG4gICAgaWYgKCFzZWxmLmN0eCB8fCAhc2VsZi5jdHgubGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgZGVmYXVsdHMgZm9yIG9wdGlvbmFsICd5JyAmICd6Jy5cbiAgICB5ID0gKHR5cGVvZiB5ICE9PSAnbnVtYmVyJykgPyBzZWxmLl9wb3NbMV0gOiB5O1xuICAgIHogPSAodHlwZW9mIHogIT09ICdudW1iZXInKSA/IHNlbGYuX3Bvc1syXSA6IHo7XG5cbiAgICBpZiAodHlwZW9mIHggPT09ICdudW1iZXInKSB7XG4gICAgICBzZWxmLl9wb3MgPSBbeCwgeSwgel07XG4gICAgICBzZWxmLmN0eC5saXN0ZW5lci5zZXRQb3NpdGlvbihzZWxmLl9wb3NbMF0sIHNlbGYuX3Bvc1sxXSwgc2VsZi5fcG9zWzJdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNlbGYuX3BvcztcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZjtcbiAgfTtcblxuICAvKipcbiAgICogR2V0L3NldCB0aGUgZGlyZWN0aW9uIHRoZSBsaXN0ZW5lciBpcyBwb2ludGluZyBpbiB0aGUgM0QgY2FydGVzaWFuIHNwYWNlLlxuICAgKiBBIGZyb250IGFuZCB1cCB2ZWN0b3IgbXVzdCBiZSBwcm92aWRlZC4gVGhlIGZyb250IGlzIHRoZSBkaXJlY3Rpb24gdGhlXG4gICAqIGZhY2Ugb2YgdGhlIGxpc3RlbmVyIGlzIHBvaW50aW5nLCBhbmQgdXAgaXMgdGhlIGRpcmVjdGlvbiB0aGUgdG9wIG9mIHRoZVxuICAgKiBsaXN0ZW5lciBpcyBwb2ludGluZy4gVGh1cywgdGhlc2UgdmFsdWVzIGFyZSBleHBlY3RlZCB0byBiZSBhdCByaWdodCBhbmdsZXNcbiAgICogZnJvbSBlYWNoIG90aGVyLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHggICBUaGUgeC1vcmllbnRhdGlvbiBvZiB0aGUgbGlzdGVuZXIuXG4gICAqIEBwYXJhbSAge051bWJlcn0geSAgIFRoZSB5LW9yaWVudGF0aW9uIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB6ICAgVGhlIHotb3JpZW50YXRpb24gb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHhVcCBUaGUgeC1vcmllbnRhdGlvbiBvZiB0aGUgdG9wIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB5VXAgVGhlIHktb3JpZW50YXRpb24gb2YgdGhlIHRvcCBvZiB0aGUgbGlzdGVuZXIuXG4gICAqIEBwYXJhbSAge051bWJlcn0gelVwIFRoZSB6LW9yaWVudGF0aW9uIG9mIHRoZSB0b3Agb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcmV0dXJuIHtIb3dsZXIvQXJyYXl9ICAgICBSZXR1cm5zIHNlbGYgb3IgdGhlIGN1cnJlbnQgb3JpZW50YXRpb24gdmVjdG9ycy5cbiAgICovXG4gIEhvd2xlckdsb2JhbC5wcm90b3R5cGUub3JpZW50YXRpb24gPSBmdW5jdGlvbih4LCB5LCB6LCB4VXAsIHlVcCwgelVwKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gU3RvcCByaWdodCBoZXJlIGlmIG5vdCB1c2luZyBXZWIgQXVkaW8uXG4gICAgaWYgKCFzZWxmLmN0eCB8fCAhc2VsZi5jdHgubGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgZGVmYXVsdHMgZm9yIG9wdGlvbmFsICd5JyAmICd6Jy5cbiAgICB2YXIgb3IgPSBzZWxmLl9vcmllbnRhdGlvbjtcbiAgICB5ID0gKHR5cGVvZiB5ICE9PSAnbnVtYmVyJykgPyBvclsxXSA6IHk7XG4gICAgeiA9ICh0eXBlb2YgeiAhPT0gJ251bWJlcicpID8gb3JbMl0gOiB6O1xuICAgIHhVcCA9ICh0eXBlb2YgeFVwICE9PSAnbnVtYmVyJykgPyBvclszXSA6IHhVcDtcbiAgICB5VXAgPSAodHlwZW9mIHlVcCAhPT0gJ251bWJlcicpID8gb3JbNF0gOiB5VXA7XG4gICAgelVwID0gKHR5cGVvZiB6VXAgIT09ICdudW1iZXInKSA/IG9yWzVdIDogelVwO1xuXG4gICAgaWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJykge1xuICAgICAgc2VsZi5fb3JpZW50YXRpb24gPSBbeCwgeSwgeiwgeFVwLCB5VXAsIHpVcF07XG4gICAgICBzZWxmLmN0eC5saXN0ZW5lci5zZXRPcmllbnRhdGlvbih4LCB5LCB6LCB4VXAsIHlVcCwgelVwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9yO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIC8qKiBHcm91cCBNZXRob2RzICoqL1xuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBBZGQgbmV3IHByb3BlcnRpZXMgdG8gdGhlIGNvcmUgaW5pdC5cbiAgICogQHBhcmFtICB7RnVuY3Rpb259IF9zdXBlciBDb3JlIGluaXQgbWV0aG9kLlxuICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgKi9cbiAgSG93bC5wcm90b3R5cGUuaW5pdCA9IChmdW5jdGlvbihfc3VwZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24obykge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBTZXR1cCB1c2VyLWRlZmluZWQgZGVmYXVsdCBwcm9wZXJ0aWVzLlxuICAgICAgc2VsZi5fb3JpZW50YXRpb24gPSBvLm9yaWVudGF0aW9uIHx8IFsxLCAwLCAwXTtcbiAgICAgIHNlbGYuX3N0ZXJlbyA9IG8uc3RlcmVvIHx8IG51bGw7XG4gICAgICBzZWxmLl9wb3MgPSBvLnBvcyB8fCBudWxsO1xuICAgICAgc2VsZi5fcGFubmVyQXR0ciA9IHtcbiAgICAgICAgY29uZUlubmVyQW5nbGU6IHR5cGVvZiBvLmNvbmVJbm5lckFuZ2xlICE9PSAndW5kZWZpbmVkJyA/IG8uY29uZUlubmVyQW5nbGUgOiAzNjAsXG4gICAgICAgIGNvbmVPdXRlckFuZ2xlOiB0eXBlb2Ygby5jb25lT3V0ZXJBbmdsZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLmNvbmVPdXRlckFuZ2xlIDogMzYwLFxuICAgICAgICBjb25lT3V0ZXJHYWluOiB0eXBlb2Ygby5jb25lT3V0ZXJHYWluICE9PSAndW5kZWZpbmVkJyA/IG8uY29uZU91dGVyR2FpbiA6IDAsXG4gICAgICAgIGRpc3RhbmNlTW9kZWw6IHR5cGVvZiBvLmRpc3RhbmNlTW9kZWwgIT09ICd1bmRlZmluZWQnID8gby5kaXN0YW5jZU1vZGVsIDogJ2ludmVyc2UnLFxuICAgICAgICBtYXhEaXN0YW5jZTogdHlwZW9mIG8ubWF4RGlzdGFuY2UgIT09ICd1bmRlZmluZWQnID8gby5tYXhEaXN0YW5jZSA6IDEwMDAwLFxuICAgICAgICBwYW5uaW5nTW9kZWw6IHR5cGVvZiBvLnBhbm5pbmdNb2RlbCAhPT0gJ3VuZGVmaW5lZCcgPyBvLnBhbm5pbmdNb2RlbCA6ICdIUlRGJyxcbiAgICAgICAgcmVmRGlzdGFuY2U6IHR5cGVvZiBvLnJlZkRpc3RhbmNlICE9PSAndW5kZWZpbmVkJyA/IG8ucmVmRGlzdGFuY2UgOiAxLFxuICAgICAgICByb2xsb2ZmRmFjdG9yOiB0eXBlb2Ygby5yb2xsb2ZmRmFjdG9yICE9PSAndW5kZWZpbmVkJyA/IG8ucm9sbG9mZkZhY3RvciA6IDFcbiAgICAgIH07XG5cbiAgICAgIC8vIFNldHVwIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgIHNlbGYuX29uc3RlcmVvID0gby5vbnN0ZXJlbyA/IFt7Zm46IG8ub25zdGVyZW99XSA6IFtdO1xuICAgICAgc2VsZi5fb25wb3MgPSBvLm9ucG9zID8gW3tmbjogby5vbnBvc31dIDogW107XG4gICAgICBzZWxmLl9vbm9yaWVudGF0aW9uID0gby5vbm9yaWVudGF0aW9uID8gW3tmbjogby5vbm9yaWVudGF0aW9ufV0gOiBbXTtcblxuICAgICAgLy8gQ29tcGxldGUgaW5pdGlsaXphdGlvbiB3aXRoIGhvd2xlci5qcyBjb3JlJ3MgaW5pdCBmdW5jdGlvbi5cbiAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBvKTtcbiAgICB9O1xuICB9KShIb3dsLnByb3RvdHlwZS5pbml0KTtcblxuICAvKipcbiAgICogR2V0L3NldCB0aGUgc3RlcmVvIHBhbm5pbmcgb2YgdGhlIGF1ZGlvIHNvdXJjZSBmb3IgdGhpcyBzb3VuZCBvciBhbGwgaW4gdGhlIGdyb3VwLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHBhbiAgQSB2YWx1ZSBvZiAtMS4wIGlzIGFsbCB0aGUgd2F5IGxlZnQgYW5kIDEuMCBpcyBhbGwgdGhlIHdheSByaWdodC5cbiAgICogQHBhcmFtICB7TnVtYmVyfSBpZCAob3B0aW9uYWwpIFRoZSBzb3VuZCBJRC4gSWYgbm9uZSBpcyBwYXNzZWQsIGFsbCBpbiBncm91cCB3aWxsIGJlIHVwZGF0ZWQuXG4gICAqIEByZXR1cm4ge0hvd2wvTnVtYmVyfSAgICBSZXR1cm5zIHNlbGYgb3IgdGhlIGN1cnJlbnQgc3RlcmVvIHBhbm5pbmcgdmFsdWUuXG4gICAqL1xuICBIb3dsLnByb3RvdHlwZS5zdGVyZW8gPSBmdW5jdGlvbihwYW4sIGlkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gU3RvcCByaWdodCBoZXJlIGlmIG5vdCB1c2luZyBXZWIgQXVkaW8uXG4gICAgaWYgKCFzZWxmLl93ZWJBdWRpbykge1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBjaGFuZ2Ugc3RlcmVvIHBhbiB3aGVuIGNhcGFibGUuXG4gICAgaWYgKHNlbGYuX3N0YXRlICE9PSAnbG9hZGVkJykge1xuICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgIGV2ZW50OiAnc3RlcmVvJyxcbiAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBzZWxmLnN0ZXJlbyhwYW4sIGlkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBQYW5uZXJTdGVyZW9Ob2RlIHN1cHBvcnQgYW5kIGZhbGxiYWNrIHRvIFBhbm5lck5vZGUgaWYgaXQgZG9lc24ndCBleGlzdC5cbiAgICB2YXIgcGFubmVyVHlwZSA9ICh0eXBlb2YgSG93bGVyLmN0eC5jcmVhdGVTdGVyZW9QYW5uZXIgPT09ICd1bmRlZmluZWQnKSA/ICdzcGF0aWFsJyA6ICdzdGVyZW8nO1xuXG4gICAgLy8gU2V0dXAgdGhlIGdyb3VwJ3Mgc3RlcmVvIHBhbm5pbmcgaWYgbm8gSUQgaXMgcGFzc2VkLlxuICAgIGlmICh0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBSZXR1cm4gdGhlIGdyb3VwJ3Mgc3RlcmVvIHBhbm5pbmcgaWYgbm8gcGFyYW1ldGVycyBhcmUgcGFzc2VkLlxuICAgICAgaWYgKHR5cGVvZiBwYW4gPT09ICdudW1iZXInKSB7XG4gICAgICAgIHNlbGYuX3N0ZXJlbyA9IHBhbjtcbiAgICAgICAgc2VsZi5fcG9zID0gW3BhbiwgMCwgMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc2VsZi5fc3RlcmVvO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoYW5nZSB0aGUgc3RyZW8gcGFubmluZyBvZiBvbmUgb3IgYWxsIHNvdW5kcyBpbiBncm91cC5cbiAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuICAgIGZvciAodmFyIGk9MDsgaTxpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIEdldCB0aGUgc291bmQuXG4gICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWRzW2ldKTtcblxuICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcGFuID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHNvdW5kLl9zdGVyZW8gPSBwYW47XG4gICAgICAgICAgc291bmQuX3BvcyA9IFtwYW4sIDAsIDBdO1xuXG4gICAgICAgICAgaWYgKHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBhcmUgZmFsbGluZyBiYWNrLCBtYWtlIHN1cmUgdGhlIHBhbm5pbmdNb2RlbCBpcyBlcXVhbHBvd2VyLlxuICAgICAgICAgICAgc291bmQuX3Bhbm5lckF0dHIucGFubmluZ01vZGVsID0gJ2VxdWFscG93ZXInO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIHBhbm5lciBzZXR1cCBhbmQgY3JlYXRlIGEgbmV3IG9uZSBpZiBub3QuXG4gICAgICAgICAgICBpZiAoIXNvdW5kLl9wYW5uZXIgfHwgIXNvdW5kLl9wYW5uZXIucGFuKSB7XG4gICAgICAgICAgICAgIHNldHVwUGFubmVyKHNvdW5kLCBwYW5uZXJUeXBlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBhbm5lclR5cGUgPT09ICdzcGF0aWFsJykge1xuICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLnNldFBvc2l0aW9uKHBhbiwgMCwgMCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLnBhbi52YWx1ZSA9IHBhbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWxmLl9lbWl0KCdzdGVyZW8nLCBzb3VuZC5faWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzb3VuZC5fc3RlcmVvO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldC9zZXQgdGhlIDNEIHNwYXRpYWwgcG9zaXRpb24gb2YgdGhlIGF1ZGlvIHNvdXJjZSBmb3IgdGhpcyBzb3VuZCBvclxuICAgKiBhbGwgaW4gdGhlIGdyb3VwLiBUaGUgbW9zdCBjb21tb24gdXNhZ2UgaXMgdG8gc2V0IHRoZSAneCcgcG9zaXRpb24gZm9yXG4gICAqIGxlZnQvcmlnaHQgcGFubmluZy4gU2V0dGluZyBhbnkgdmFsdWUgaGlnaGVyIHRoYW4gMS4wIHdpbGwgYmVnaW4gdG9cbiAgICogZGVjcmVhc2UgdGhlIHZvbHVtZSBvZiB0aGUgc291bmQgYXMgaXQgbW92ZXMgZnVydGhlciBhd2F5LlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHggIFRoZSB4LXBvc2l0aW9uIG9mIHRoZSBhdWRpbyBmcm9tIC0xMDAwLjAgdG8gMTAwMC4wLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHkgIFRoZSB5LXBvc2l0aW9uIG9mIHRoZSBhdWRpbyBmcm9tIC0xMDAwLjAgdG8gMTAwMC4wLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHogIFRoZSB6LXBvc2l0aW9uIG9mIHRoZSBhdWRpbyBmcm9tIC0xMDAwLjAgdG8gMTAwMC4wLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkIChvcHRpb25hbCkgVGhlIHNvdW5kIElELiBJZiBub25lIGlzIHBhc3NlZCwgYWxsIGluIGdyb3VwIHdpbGwgYmUgdXBkYXRlZC5cbiAgICogQHJldHVybiB7SG93bC9BcnJheX0gICAgUmV0dXJucyBzZWxmIG9yIHRoZSBjdXJyZW50IDNEIHNwYXRpYWwgcG9zaXRpb246IFt4LCB5LCB6XS5cbiAgICovXG4gIEhvd2wucHJvdG90eXBlLnBvcyA9IGZ1bmN0aW9uKHgsIHksIHosIGlkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gU3RvcCByaWdodCBoZXJlIGlmIG5vdCB1c2luZyBXZWIgQXVkaW8uXG4gICAgaWYgKCFzZWxmLl93ZWJBdWRpbykge1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBjaGFuZ2UgcG9zaXRpb24gd2hlbiBjYXBhYmxlLlxuICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICBldmVudDogJ3BvcycsXG4gICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc2VsZi5wb3MoeCwgeSwgeiwgaWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBkZWZhdWx0cyBmb3Igb3B0aW9uYWwgJ3knICYgJ3onLlxuICAgIHkgPSAodHlwZW9mIHkgIT09ICdudW1iZXInKSA/IDAgOiB5O1xuICAgIHogPSAodHlwZW9mIHogIT09ICdudW1iZXInKSA/IC0wLjUgOiB6O1xuXG4gICAgLy8gU2V0dXAgdGhlIGdyb3VwJ3Mgc3BhdGlhbCBwb3NpdGlvbiBpZiBubyBJRCBpcyBwYXNzZWQuXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIFJldHVybiB0aGUgZ3JvdXAncyBzcGF0aWFsIHBvc2l0aW9uIGlmIG5vIHBhcmFtZXRlcnMgYXJlIHBhc3NlZC5cbiAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2VsZi5fcG9zID0gW3gsIHksIHpdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuX3BvcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGFuZ2UgdGhlIHNwYXRpYWwgcG9zaXRpb24gb2Ygb25lIG9yIGFsbCBzb3VuZHMgaW4gZ3JvdXAuXG4gICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcbiAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkc1tpXSk7XG5cbiAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICBpZiAodHlwZW9mIHggPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgc291bmQuX3BvcyA9IFt4LCB5LCB6XTtcblxuICAgICAgICAgIGlmIChzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBwYW5uZXIgc2V0dXAgYW5kIGNyZWF0ZSBhIG5ldyBvbmUgaWYgbm90LlxuICAgICAgICAgICAgaWYgKCFzb3VuZC5fcGFubmVyIHx8IHNvdW5kLl9wYW5uZXIucGFuKSB7XG4gICAgICAgICAgICAgIHNldHVwUGFubmVyKHNvdW5kLCAnc3BhdGlhbCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzb3VuZC5fcGFubmVyLnNldFBvc2l0aW9uKHgsIHksIHopO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlbGYuX2VtaXQoJ3BvcycsIHNvdW5kLl9pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHNvdW5kLl9wb3M7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZjtcbiAgfTtcblxuICAvKipcbiAgICogR2V0L3NldCB0aGUgZGlyZWN0aW9uIHRoZSBhdWRpbyBzb3VyY2UgaXMgcG9pbnRpbmcgaW4gdGhlIDNEIGNhcnRlc2lhbiBjb29yZGluYXRlXG4gICAqIHNwYWNlLiBEZXBlbmRpbmcgb24gaG93IGRpcmVjdGlvbiB0aGUgc291bmQgaXMsIGJhc2VkIG9uIHRoZSBgY29uZWAgYXR0cmlidXRlcyxcbiAgICogYSBzb3VuZCBwb2ludGluZyBhd2F5IGZyb20gdGhlIGxpc3RlbmVyIGNhbiBiZSBxdWlldCBvciBzaWxlbnQuXG4gICAqIEBwYXJhbSAge051bWJlcn0geCAgVGhlIHgtb3JpZW50YXRpb24gb2YgdGhlIHNvdXJjZS5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB5ICBUaGUgeS1vcmllbnRhdGlvbiBvZiB0aGUgc291cmNlLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHogIFRoZSB6LW9yaWVudGF0aW9uIG9mIHRoZSBzb3VyY2UuXG4gICAqIEBwYXJhbSAge051bWJlcn0gaWQgKG9wdGlvbmFsKSBUaGUgc291bmQgSUQuIElmIG5vbmUgaXMgcGFzc2VkLCBhbGwgaW4gZ3JvdXAgd2lsbCBiZSB1cGRhdGVkLlxuICAgKiBAcmV0dXJuIHtIb3dsL0FycmF5fSAgICBSZXR1cm5zIHNlbGYgb3IgdGhlIGN1cnJlbnQgM0Qgc3BhdGlhbCBvcmllbnRhdGlvbjogW3gsIHksIHpdLlxuICAgKi9cbiAgSG93bC5wcm90b3R5cGUub3JpZW50YXRpb24gPSBmdW5jdGlvbih4LCB5LCB6LCBpZCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIC8vIFN0b3AgcmlnaHQgaGVyZSBpZiBub3QgdXNpbmcgV2ViIEF1ZGlvLlxuICAgIGlmICghc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gY2hhbmdlIG9yaWVudGF0aW9uIHdoZW4gY2FwYWJsZS5cbiAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgZXZlbnQ6ICdvcmllbnRhdGlvbicsXG4gICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc2VsZi5vcmllbnRhdGlvbih4LCB5LCB6LCBpZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGhlIGRlZmF1bHRzIGZvciBvcHRpb25hbCAneScgJiAneicuXG4gICAgeSA9ICh0eXBlb2YgeSAhPT0gJ251bWJlcicpID8gc2VsZi5fb3JpZW50YXRpb25bMV0gOiB5O1xuICAgIHogPSAodHlwZW9mIHogIT09ICdudW1iZXInKSA/IHNlbGYuX29yaWVudGF0aW9uWzJdIDogejtcblxuICAgIC8vIFNldHVwIHRoZSBncm91cCdzIHNwYXRpYWwgb3JpZW50YXRpb24gaWYgbm8gSUQgaXMgcGFzc2VkLlxuICAgIGlmICh0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBSZXR1cm4gdGhlIGdyb3VwJ3Mgc3BhdGlhbCBvcmllbnRhdGlvbiBpZiBubyBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQuXG4gICAgICBpZiAodHlwZW9mIHggPT09ICdudW1iZXInKSB7XG4gICAgICAgIHNlbGYuX29yaWVudGF0aW9uID0gW3gsIHksIHpdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuX29yaWVudGF0aW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoYW5nZSB0aGUgc3BhdGlhbCBvcmllbnRhdGlvbiBvZiBvbmUgb3IgYWxsIHNvdW5kcyBpbiBncm91cC5cbiAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuICAgIGZvciAodmFyIGk9MDsgaTxpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIEdldCB0aGUgc291bmQuXG4gICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWRzW2ldKTtcblxuICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBzb3VuZC5fb3JpZW50YXRpb24gPSBbeCwgeSwgel07XG5cbiAgICAgICAgICBpZiAoc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgcGFubmVyIHNldHVwIGFuZCBjcmVhdGUgYSBuZXcgb25lIGlmIG5vdC5cbiAgICAgICAgICAgIGlmICghc291bmQuX3Bhbm5lcikge1xuICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIHBvc2l0aW9uIHRvIHNldHVwIHRoZSBub2RlIHdpdGguXG4gICAgICAgICAgICAgIGlmICghc291bmQuX3Bvcykge1xuICAgICAgICAgICAgICAgIHNvdW5kLl9wb3MgPSBzZWxmLl9wb3MgfHwgWzAsIDAsIC0wLjVdO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgc2V0dXBQYW5uZXIoc291bmQsICdzcGF0aWFsJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIuc2V0T3JpZW50YXRpb24oeCwgeSwgeik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5fZW1pdCgnb3JpZW50YXRpb24nLCBzb3VuZC5faWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzb3VuZC5fb3JpZW50YXRpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZjtcbiAgfTtcblxuICAvKipcbiAgICogR2V0L3NldCB0aGUgcGFubmVyIG5vZGUncyBhdHRyaWJ1dGVzIGZvciBhIHNvdW5kIG9yIGdyb3VwIG9mIHNvdW5kcy5cbiAgICogVGhpcyBtZXRob2QgY2FuIG9wdGlvbmFsbCB0YWtlIDAsIDEgb3IgMiBhcmd1bWVudHMuXG4gICAqICAgcGFubmVyQXR0cigpIC0+IFJldHVybnMgdGhlIGdyb3VwJ3MgdmFsdWVzLlxuICAgKiAgIHBhbm5lckF0dHIoaWQpIC0+IFJldHVybnMgdGhlIHNvdW5kIGlkJ3MgdmFsdWVzLlxuICAgKiAgIHBhbm5lckF0dHIobykgLT4gU2V0J3MgdGhlIHZhbHVlcyBvZiBhbGwgc291bmRzIGluIHRoaXMgSG93bCBncm91cC5cbiAgICogICBwYW5uZXJBdHRyKG8sIGlkKSAtPiBTZXQncyB0aGUgdmFsdWVzIG9mIHBhc3NlZCBzb3VuZCBpZC5cbiAgICpcbiAgICogICBBdHRyaWJ1dGVzOlxuICAgKiAgICAgY29uZUlubmVyQW5nbGUgLSAoMzYwIGJ5IGRlZmF1bHQpIFRoZXJlIHdpbGwgYmUgbm8gdm9sdW1lIHJlZHVjdGlvbiBpbnNpZGUgdGhpcyBhbmdsZS5cbiAgICogICAgIGNvbmVPdXRlckFuZ2xlIC0gKDM2MCBieSBkZWZhdWx0KSBUaGUgdm9sdW1lIHdpbGwgYmUgcmVkdWNlZCB0byBhIGNvbnN0YW50IHZhbHVlIG9mXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGBjb25lT3V0ZXJHYWluYCBvdXRzaWRlIHRoaXMgYW5nbGUuXG4gICAqICAgICBjb25lT3V0ZXJHYWluIC0gKDAgYnkgZGVmYXVsdCkgVGhlIGFtb3VudCBvZiB2b2x1bWUgcmVkdWN0aW9uIG91dHNpZGUgb2YgYGNvbmVPdXRlckFuZ2xlYC5cbiAgICogICAgIGRpc3RhbmNlTW9kZWwgLSAoJ2ludmVyc2UnIGJ5IGRlZmF1bHQpIERldGVybWluZXMgYWxnb3JpdGhtIHRvIHVzZSB0byByZWR1Y2Ugdm9sdW1lIGFzIGF1ZGlvIG1vdmVzXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGF3YXkgZnJvbSBsaXN0ZW5lci4gQ2FuIGJlIGBsaW5lYXJgLCBgaW52ZXJzZWAgb3IgYGV4cG9uZW50aWFsYC5cbiAgICogICAgIG1heERpc3RhbmNlIC0gKDEwMDAwIGJ5IGRlZmF1bHQpIFZvbHVtZSB3b24ndCByZWR1Y2UgYmV0d2VlbiBzb3VyY2UvbGlzdGVuZXIgYmV5b25kIHRoaXMgZGlzdGFuY2UuXG4gICAqICAgICBwYW5uaW5nTW9kZWwgLSAoJ0hSVEYnIGJ5IGRlZmF1bHQpIERldGVybWluZXMgd2hpY2ggc3BhdGlhbGl6YXRpb24gYWxnb3JpdGhtIGlzIHVzZWQgdG8gcG9zaXRpb24gYXVkaW8uXG4gICAqICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIGBIUlRGYCBvciBgZXF1YWxwb3dlcmAuXG4gICAqICAgICByZWZEaXN0YW5jZSAtICgxIGJ5IGRlZmF1bHQpIEEgcmVmZXJlbmNlIGRpc3RhbmNlIGZvciByZWR1Y2luZyB2b2x1bWUgYXMgdGhlIHNvdXJjZVxuICAgKiAgICAgICAgICAgICAgICAgICAgbW92ZXMgYXdheSBmcm9tIHRoZSBsaXN0ZW5lci5cbiAgICogICAgIHJvbGxvZmZGYWN0b3IgLSAoMSBieSBkZWZhdWx0KSBIb3cgcXVpY2tseSB0aGUgdm9sdW1lIHJlZHVjZXMgYXMgc291cmNlIG1vdmVzIGZyb20gbGlzdGVuZXIuXG4gICAqIFxuICAgKiBAcmV0dXJuIHtIb3dsL09iamVjdH0gUmV0dXJucyBzZWxmIG9yIGN1cnJlbnQgcGFubmVyIGF0dHJpYnV0ZXMuXG4gICAqL1xuICBIb3dsLnByb3RvdHlwZS5wYW5uZXJBdHRyID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHZhciBvLCBpZCwgc291bmQ7XG5cbiAgICAvLyBTdG9wIHJpZ2h0IGhlcmUgaWYgbm90IHVzaW5nIFdlYiBBdWRpby5cbiAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIHZhbHVlcyBiYXNlZCBvbiBhcmd1bWVudHMuXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBSZXR1cm4gdGhlIGdyb3VwJ3MgcGFubmVyIGF0dHJpYnV0ZSB2YWx1ZXMuXG4gICAgICByZXR1cm4gc2VsZi5fcGFubmVyQXR0cjtcbiAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG8gPSBhcmdzWzBdO1xuXG4gICAgICAgIC8vIFNldCB0aGUgZ3JvdSdzIHBhbm5lciBhdHRyaWJ1dGUgdmFsdWVzLlxuICAgICAgICBpZiAodHlwZW9mIGlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHNlbGYuX3Bhbm5lckF0dHIgPSB7XG4gICAgICAgICAgICBjb25lSW5uZXJBbmdsZTogdHlwZW9mIG8uY29uZUlubmVyQW5nbGUgIT09ICd1bmRlZmluZWQnID8gby5jb25lSW5uZXJBbmdsZSA6IHNlbGYuX2NvbmVJbm5lckFuZ2xlLFxuICAgICAgICAgICAgY29uZU91dGVyQW5nbGU6IHR5cGVvZiBvLmNvbmVPdXRlckFuZ2xlICE9PSAndW5kZWZpbmVkJyA/IG8uY29uZU91dGVyQW5nbGUgOiBzZWxmLl9jb25lT3V0ZXJBbmdsZSxcbiAgICAgICAgICAgIGNvbmVPdXRlckdhaW46IHR5cGVvZiBvLmNvbmVPdXRlckdhaW4gIT09ICd1bmRlZmluZWQnID8gby5jb25lT3V0ZXJHYWluIDogc2VsZi5fY29uZU91dGVyR2FpbixcbiAgICAgICAgICAgIGRpc3RhbmNlTW9kZWw6IHR5cGVvZiBvLmRpc3RhbmNlTW9kZWwgIT09ICd1bmRlZmluZWQnID8gby5kaXN0YW5jZU1vZGVsIDogc2VsZi5fZGlzdGFuY2VNb2RlbCxcbiAgICAgICAgICAgIG1heERpc3RhbmNlOiB0eXBlb2Ygby5tYXhEaXN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLm1heERpc3RhbmNlIDogc2VsZi5fbWF4RGlzdGFuY2UsXG4gICAgICAgICAgICBwYW5uaW5nTW9kZWw6IHR5cGVvZiBvLnBhbm5pbmdNb2RlbCAhPT0gJ3VuZGVmaW5lZCcgPyBvLnBhbm5pbmdNb2RlbCA6IHNlbGYuX3Bhbm5pbmdNb2RlbCxcbiAgICAgICAgICAgIHJlZkRpc3RhbmNlOiB0eXBlb2Ygby5yZWZEaXN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLnJlZkRpc3RhbmNlIDogc2VsZi5fcmVmRGlzdGFuY2UsXG4gICAgICAgICAgICByb2xsb2ZmRmFjdG9yOiB0eXBlb2Ygby5yb2xsb2ZmRmFjdG9yICE9PSAndW5kZWZpbmVkJyA/IG8ucm9sbG9mZkZhY3RvciA6IHNlbGYuX3JvbGxvZmZGYWN0b3JcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZXR1cm4gdGhpcyBzb3VuZCdzIHBhbm5lciBhdHRyaWJ1dGUgdmFsdWVzLlxuICAgICAgICBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChwYXJzZUludChhcmdzWzBdLCAxMCkpO1xuICAgICAgICByZXR1cm4gc291bmQgPyBzb3VuZC5fcGFubmVyQXR0ciA6IHNlbGYuX3Bhbm5lckF0dHI7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgbyA9IGFyZ3NbMF07XG4gICAgICBpZCA9IHBhcnNlSW50KGFyZ3NbMV0sIDEwKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIHZhbHVlcyBvZiB0aGUgc3BlY2lmaWVkIHNvdW5kcy5cbiAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuICAgIGZvciAodmFyIGk9MDsgaTxpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkc1tpXSk7XG5cbiAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICAvLyBNZXJnZSB0aGUgbmV3IHZhbHVlcyBpbnRvIHRoZSBzb3VuZC5cbiAgICAgICAgdmFyIHBhID0gc291bmQuX3Bhbm5lckF0dHI7XG4gICAgICAgIHBhID0ge1xuICAgICAgICAgIGNvbmVJbm5lckFuZ2xlOiB0eXBlb2Ygby5jb25lSW5uZXJBbmdsZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLmNvbmVJbm5lckFuZ2xlIDogcGEuY29uZUlubmVyQW5nbGUsXG4gICAgICAgICAgY29uZU91dGVyQW5nbGU6IHR5cGVvZiBvLmNvbmVPdXRlckFuZ2xlICE9PSAndW5kZWZpbmVkJyA/IG8uY29uZU91dGVyQW5nbGUgOiBwYS5jb25lT3V0ZXJBbmdsZSxcbiAgICAgICAgICBjb25lT3V0ZXJHYWluOiB0eXBlb2Ygby5jb25lT3V0ZXJHYWluICE9PSAndW5kZWZpbmVkJyA/IG8uY29uZU91dGVyR2FpbiA6IHBhLmNvbmVPdXRlckdhaW4sXG4gICAgICAgICAgZGlzdGFuY2VNb2RlbDogdHlwZW9mIG8uZGlzdGFuY2VNb2RlbCAhPT0gJ3VuZGVmaW5lZCcgPyBvLmRpc3RhbmNlTW9kZWwgOiBwYS5kaXN0YW5jZU1vZGVsLFxuICAgICAgICAgIG1heERpc3RhbmNlOiB0eXBlb2Ygby5tYXhEaXN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLm1heERpc3RhbmNlIDogcGEubWF4RGlzdGFuY2UsXG4gICAgICAgICAgcGFubmluZ01vZGVsOiB0eXBlb2Ygby5wYW5uaW5nTW9kZWwgIT09ICd1bmRlZmluZWQnID8gby5wYW5uaW5nTW9kZWwgOiBwYS5wYW5uaW5nTW9kZWwsXG4gICAgICAgICAgcmVmRGlzdGFuY2U6IHR5cGVvZiBvLnJlZkRpc3RhbmNlICE9PSAndW5kZWZpbmVkJyA/IG8ucmVmRGlzdGFuY2UgOiBwYS5yZWZEaXN0YW5jZSxcbiAgICAgICAgICByb2xsb2ZmRmFjdG9yOiB0eXBlb2Ygby5yb2xsb2ZmRmFjdG9yICE9PSAndW5kZWZpbmVkJyA/IG8ucm9sbG9mZkZhY3RvciA6IHBhLnJvbGxvZmZGYWN0b3JcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBVcGRhdGUgdGhlIHBhbm5lciB2YWx1ZXMgb3IgY3JlYXRlIGEgbmV3IHBhbm5lciBpZiBub25lIGV4aXN0cy5cbiAgICAgICAgdmFyIHBhbm5lciA9IHNvdW5kLl9wYW5uZXI7XG4gICAgICAgIGlmIChwYW5uZXIpIHtcbiAgICAgICAgICBwYW5uZXIuY29uZUlubmVyQW5nbGUgPSBwYS5jb25lSW5uZXJBbmdsZTtcbiAgICAgICAgICBwYW5uZXIuY29uZU91dGVyQW5nbGUgPSBwYS5jb25lT3V0ZXJBbmdsZTtcbiAgICAgICAgICBwYW5uZXIuY29uZU91dGVyR2FpbiA9IHBhLmNvbmVPdXRlckdhaW47XG4gICAgICAgICAgcGFubmVyLmRpc3RhbmNlTW9kZWwgPSBwYS5kaXN0YW5jZU1vZGVsO1xuICAgICAgICAgIHBhbm5lci5tYXhEaXN0YW5jZSA9IHBhLm1heERpc3RhbmNlO1xuICAgICAgICAgIHBhbm5lci5wYW5uaW5nTW9kZWwgPSBwYS5wYW5uaW5nTW9kZWw7XG4gICAgICAgICAgcGFubmVyLnJlZkRpc3RhbmNlID0gcGEucmVmRGlzdGFuY2U7XG4gICAgICAgICAgcGFubmVyLnJvbGxvZmZGYWN0b3IgPSBwYS5yb2xsb2ZmRmFjdG9yO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgcG9zaXRpb24gdG8gc2V0dXAgdGhlIG5vZGUgd2l0aC5cbiAgICAgICAgICBpZiAoIXNvdW5kLl9wb3MpIHtcbiAgICAgICAgICAgIHNvdW5kLl9wb3MgPSBzZWxmLl9wb3MgfHwgWzAsIDAsIC0wLjVdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwYW5uZXIgbm9kZS5cbiAgICAgICAgICBzZXR1cFBhbm5lcihzb3VuZCwgJ3NwYXRpYWwnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIC8qKiBTaW5nbGUgU291bmQgTWV0aG9kcyAqKi9cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAvKipcbiAgICogQWRkIG5ldyBwcm9wZXJ0aWVzIHRvIHRoZSBjb3JlIFNvdW5kIGluaXQuXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBfc3VwZXIgQ29yZSBTb3VuZCBpbml0IG1ldGhvZC5cbiAgICogQHJldHVybiB7U291bmR9XG4gICAqL1xuICBTb3VuZC5wcm90b3R5cGUuaW5pdCA9IChmdW5jdGlvbihfc3VwZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgcGFyZW50ID0gc2VsZi5fcGFyZW50O1xuXG4gICAgICAvLyBTZXR1cCB1c2VyLWRlZmluZWQgZGVmYXVsdCBwcm9wZXJ0aWVzLlxuICAgICAgc2VsZi5fb3JpZW50YXRpb24gPSBwYXJlbnQuX29yaWVudGF0aW9uO1xuICAgICAgc2VsZi5fc3RlcmVvID0gcGFyZW50Ll9zdGVyZW87XG4gICAgICBzZWxmLl9wb3MgPSBwYXJlbnQuX3BvcztcbiAgICAgIHNlbGYuX3Bhbm5lckF0dHIgPSBwYXJlbnQuX3Bhbm5lckF0dHI7XG5cbiAgICAgIC8vIENvbXBsZXRlIGluaXRpbGl6YXRpb24gd2l0aCBob3dsZXIuanMgY29yZSBTb3VuZCdzIGluaXQgZnVuY3Rpb24uXG4gICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcblxuICAgICAgLy8gSWYgYSBzdGVyZW8gb3IgcG9zaXRpb24gd2FzIHNwZWNpZmllZCwgc2V0IGl0IHVwLlxuICAgICAgaWYgKHNlbGYuX3N0ZXJlbykge1xuICAgICAgICBwYXJlbnQuc3RlcmVvKHNlbGYuX3N0ZXJlbyk7XG4gICAgICB9IGVsc2UgaWYgKHNlbGYuX3Bvcykge1xuICAgICAgICBwYXJlbnQucG9zKHNlbGYuX3Bvc1swXSwgc2VsZi5fcG9zWzFdLCBzZWxmLl9wb3NbMl0sIHNlbGYuX2lkKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KShTb3VuZC5wcm90b3R5cGUuaW5pdCk7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBTb3VuZC5yZXNldCBtZXRob2QgdG8gY2xlYW4gdXAgcHJvcGVydGllcyBmcm9tIHRoZSBzcGF0aWFsIHBsdWdpbi5cbiAgICogQHBhcmFtICB7RnVuY3Rpb259IF9zdXBlciBTb3VuZCByZXNldCBtZXRob2QuXG4gICAqIEByZXR1cm4ge1NvdW5kfVxuICAgKi9cbiAgU291bmQucHJvdG90eXBlLnJlc2V0ID0gKGZ1bmN0aW9uKF9zdXBlcikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBwYXJlbnQgPSBzZWxmLl9wYXJlbnQ7XG5cbiAgICAgIC8vIFJlc2V0IGFsbCBzcGF0aWFsIHBsdWdpbiBwcm9wZXJ0aWVzIG9uIHRoaXMgc291bmQuXG4gICAgICBzZWxmLl9vcmllbnRhdGlvbiA9IHBhcmVudC5fb3JpZW50YXRpb247XG4gICAgICBzZWxmLl9wb3MgPSBwYXJlbnQuX3BvcztcbiAgICAgIHNlbGYuX3Bhbm5lckF0dHIgPSBwYXJlbnQuX3Bhbm5lckF0dHI7XG5cbiAgICAgIC8vIENvbXBsZXRlIHJlc2V0dGluZyBvZiB0aGUgc291bmQuXG4gICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgfTtcbiAgfSkoU291bmQucHJvdG90eXBlLnJlc2V0KTtcblxuICAvKiogSGVscGVyIE1ldGhvZHMgKiovXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwYW5uZXIgbm9kZSBhbmQgc2F2ZSBpdCBvbiB0aGUgc291bmQuXG4gICAqIEBwYXJhbSAge1NvdW5kfSBzb3VuZCBTcGVjaWZpYyBzb3VuZCB0byBzZXR1cCBwYW5uaW5nIG9uLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUeXBlIG9mIHBhbm5lciB0byBjcmVhdGU6ICdzdGVyZW8nIG9yICdzcGF0aWFsJy5cbiAgICovXG4gIHZhciBzZXR1cFBhbm5lciA9IGZ1bmN0aW9uKHNvdW5kLCB0eXBlKSB7XG4gICAgdHlwZSA9IHR5cGUgfHwgJ3NwYXRpYWwnO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBuZXcgcGFubmVyIG5vZGUuXG4gICAgaWYgKHR5cGUgPT09ICdzcGF0aWFsJykge1xuICAgICAgc291bmQuX3Bhbm5lciA9IEhvd2xlci5jdHguY3JlYXRlUGFubmVyKCk7XG4gICAgICBzb3VuZC5fcGFubmVyLmNvbmVJbm5lckFuZ2xlID0gc291bmQuX3Bhbm5lckF0dHIuY29uZUlubmVyQW5nbGU7XG4gICAgICBzb3VuZC5fcGFubmVyLmNvbmVPdXRlckFuZ2xlID0gc291bmQuX3Bhbm5lckF0dHIuY29uZU91dGVyQW5nbGU7XG4gICAgICBzb3VuZC5fcGFubmVyLmNvbmVPdXRlckdhaW4gPSBzb3VuZC5fcGFubmVyQXR0ci5jb25lT3V0ZXJHYWluO1xuICAgICAgc291bmQuX3Bhbm5lci5kaXN0YW5jZU1vZGVsID0gc291bmQuX3Bhbm5lckF0dHIuZGlzdGFuY2VNb2RlbDtcbiAgICAgIHNvdW5kLl9wYW5uZXIubWF4RGlzdGFuY2UgPSBzb3VuZC5fcGFubmVyQXR0ci5tYXhEaXN0YW5jZTtcbiAgICAgIHNvdW5kLl9wYW5uZXIucGFubmluZ01vZGVsID0gc291bmQuX3Bhbm5lckF0dHIucGFubmluZ01vZGVsO1xuICAgICAgc291bmQuX3Bhbm5lci5yZWZEaXN0YW5jZSA9IHNvdW5kLl9wYW5uZXJBdHRyLnJlZkRpc3RhbmNlO1xuICAgICAgc291bmQuX3Bhbm5lci5yb2xsb2ZmRmFjdG9yID0gc291bmQuX3Bhbm5lckF0dHIucm9sbG9mZkZhY3RvcjtcbiAgICAgIHNvdW5kLl9wYW5uZXIuc2V0UG9zaXRpb24oc291bmQuX3Bvc1swXSwgc291bmQuX3Bvc1sxXSwgc291bmQuX3Bvc1syXSk7XG4gICAgICBzb3VuZC5fcGFubmVyLnNldE9yaWVudGF0aW9uKHNvdW5kLl9vcmllbnRhdGlvblswXSwgc291bmQuX29yaWVudGF0aW9uWzFdLCBzb3VuZC5fb3JpZW50YXRpb25bMl0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3VuZC5fcGFubmVyID0gSG93bGVyLmN0eC5jcmVhdGVTdGVyZW9QYW5uZXIoKTtcbiAgICAgIHNvdW5kLl9wYW5uZXIucGFuLnZhbHVlID0gc291bmQuX3N0ZXJlbztcbiAgICB9XG5cbiAgICBzb3VuZC5fcGFubmVyLmNvbm5lY3Qoc291bmQuX25vZGUpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBjb25uZWN0aW9ucy5cbiAgICBpZiAoIXNvdW5kLl9wYXVzZWQpIHtcbiAgICAgIHNvdW5kLl9wYXJlbnQucGF1c2Uoc291bmQuX2lkLCB0cnVlKS5wbGF5KHNvdW5kLl9pZCk7XG4gICAgfVxuICB9O1xufSkoKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9ob3dsZXIvZGlzdC9ob3dsZXIuanNcbi8vIG1vZHVsZSBpZCA9IDU1MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 552 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _extends = Object.assign || function (target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i];for (var key in source) {if (Object.prototype.hasOwnProperty.call(source, key)) {target[key] = source[key];}}}return target;};var _react = __webpack_require__(174);var _react2 = _interopRequireDefault(_react);\nvar _Unread = __webpack_require__(553);var _Unread2 = _interopRequireDefault(_Unread);\nvar _Participant = __webpack_require__(554);var _Participant2 = _interopRequireDefault(_Participant);\nvar _Message = __webpack_require__(555);var _Message2 = _interopRequireDefault(_Message);\nvar _NewMessage = __webpack_require__(557);var _NewMessage2 = _interopRequireDefault(_NewMessage);\nvar _Util = __webpack_require__(410);var _Util2 = _interopRequireDefault(_Util);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;}\n\nfunction makeList(messages) {\n  var currentHeader = void 0;\n  return messages ? messages.map(function (m) {\n    var heading = false;\n    if (!currentHeader) {\n      heading = true;\n      currentHeader = m;\n    } else {\n      // not same user or time diff of greater than 3 minutes\n      heading = m.user_id !== currentHeader.user_id || Math.floor(Math.abs(new Date(currentHeader.created_at) - new Date(m.created_at)) / 60000) > 3;\n      currentHeader = heading ? m : currentHeader;\n    }\n    return _react2.default.createElement(_Message2.default, _extends({}, m, { key: m.id, heading: heading }));\n  }) : null;\n}var\n\nMapChat = function (_Component) {_inherits(MapChat, _Component);\n  function MapChat(props) {_classCallCheck(this, MapChat);var _this = _possibleConstructorReturn(this, (MapChat.__proto__ || Object.getPrototypeOf(MapChat)).call(this,\n    props));_this.\n\n\n\n\n\n\n\n\n\n\n\n    reset = function () {\n      _this.setState({\n        unreadMessages: 0,\n        open: false,\n        messageText: '',\n        alertSound: true, // whether to play sounds on arrival of new messages or not\n        cursorsShowing: true,\n        videosShowing: true });\n\n    };_this.\n\n    close = function () {\n      _this.setState({ open: false });\n      _this.props.onClose();\n      _this.messageInput.blur();\n    };_this.\n\n    open = function () {\n      _this.scroll();\n      _this.setState({ open: true, unreadMessages: 0 });\n      _this.props.onOpen();\n      _this.messageInput.focus();\n    };_this.\n\n    newMessage = function () {\n      if (!_this.state.open) _this.setState({ unreadMessages: _this.state.unreadMessages + 1 });\n    };_this.\n\n    scroll = function () {\n      _this.messagesDiv.scrollTop = _this.messagesDiv.scrollHeight;\n    };_this.\n\n    toggleDrawer = function () {\n      if (_this.state.open) _this.close();else\n      if (!_this.state.open) _this.open();\n    };_this.\n\n    toggleAlertSound = function () {\n      _this.setState({ alertSound: !_this.state.alertSound });\n      _this.props.soundToggleClick();\n    };_this.\n\n    toggleCursorsShowing = function () {\n      _this.setState({ cursorsShowing: !_this.state.cursorsShowing });\n      _this.props.cursorToggleClick();\n    };_this.\n\n    toggleVideosShowing = function () {\n      _this.setState({ videosShowing: !_this.state.videosShowing });\n      _this.props.videoToggleClick();\n    };_this.\n\n    handleChange = function (key) {return function (e) {\n        _this.setState(_defineProperty({},\n        key, e.target.value));\n\n      };};_this.\n\n    handleTextareaKeyUp = function (e) {\n      if (e.which === 13) {\n        e.preventDefault();\n        var text = _Util2.default.removeEmoji(_this.state.messageText);\n        _this.props.handleInputMessage(text);\n        _this.setState({ messageText: '' });\n      }\n    };_this.\n\n    focusMessageInput = function () {\n      if (!_this.messageInput) return;\n      _this.messageInput.focus();\n    };_this.\n\n    render = function () {\n      var rightOffset = _this.state.open ? '0' : '-300px';var _this$props =\n      _this.props,conversationLive = _this$props.conversationLive,isParticipating = _this$props.isParticipating,participants = _this$props.participants,messages = _this$props.messages,inviteACall = _this$props.inviteACall,inviteToJoin = _this$props.inviteToJoin;var _this$state =\n      _this.state,videosShowing = _this$state.videosShowing,cursorsShowing = _this$state.cursorsShowing,alertSound = _this$state.alertSound,unreadMessages = _this$state.unreadMessages;\n      return (\n        _react2.default.createElement('div', { className: 'chat-box',\n            style: { right: rightOffset } },\n\n          _react2.default.createElement('div', { className: 'junto-header' }, 'PARTICIPANTS',\n\n            _react2.default.createElement('div', { onClick: _this.toggleVideosShowing, className: 'video-toggle ' + (videosShowing ? '' : 'active') }),\n            _react2.default.createElement('div', { onClick: _this.toggleCursorsShowing, className: 'cursor-toggle ' + (cursorsShowing ? '' : 'active') })),\n\n          _react2.default.createElement('div', { className: 'participants' },\n            conversationLive && _react2.default.createElement('div', { className: 'conversation-live' }, 'LIVE',\n\n              isParticipating && _react2.default.createElement('span', { className: 'call-action leave', onClick: _this.props.leaveCall }, 'LEAVE'),\n\n\n              !isParticipating && _react2.default.createElement('span', { className: 'call-action join', onClick: _this.props.joinCall }, 'JOIN')),\n\n\n\n            participants.map(function (participant) {return _react2.default.createElement(_Participant2.default, _extends({\n                key: participant.id },\n              participant, {\n                inviteACall: inviteACall,\n                inviteToJoin: inviteToJoin,\n                conversationLive: conversationLive,\n                mapperIsLive: isParticipating }));})),\n\n\n          _react2.default.createElement('div', { className: 'chat-header' }, 'CHAT',\n\n            _react2.default.createElement('div', { onClick: _this.toggleAlertSound, className: 'sound-toggle ' + (alertSound ? '' : 'active') })),\n\n          _react2.default.createElement('div', { className: 'chat-button ' + (conversationLive ? 'active' : ''), onClick: _this.toggleDrawer },\n            _react2.default.createElement('div', { className: 'tooltips' }, 'Chat'),\n            _react2.default.createElement(_Unread2.default, { count: unreadMessages })),\n\n          _react2.default.createElement('div', { className: 'chat-messages', ref: function ref(div) {_this.messagesDiv = div;} },\n            makeList(messages)),\n\n          _react2.default.createElement(_NewMessage2.default, { messageText: _this.state.messageText,\n            focusMessageInput: _this.focusMessageInput,\n            handleChange: _this.handleChange('messageText'),\n            textAreaProps: {\n              className: 'chat-input',\n              ref: function ref(textarea) {_this.messageInput = textarea;},\n              placeholder: 'Send a message...',\n              onKeyUp: _this.handleTextareaKeyUp,\n              onFocus: _this.props.inputFocus,\n              onBlur: _this.props.inputBlur } })));\n\n\n\n\n    };_this.state = { unreadMessages: 0, open: false, messageText: '', alertSound: true, // whether to play sounds on arrival of new messages or not\n      cursorsShowing: true, videosShowing: true };return _this;}return MapChat;}(_react.Component);\n\nMapChat.propTypes = {\n  conversationLive: _react.PropTypes.bool,\n  isParticipating: _react.PropTypes.bool,\n  onOpen: _react.PropTypes.func,\n  onClose: _react.PropTypes.func,\n  leaveCall: _react.PropTypes.func,\n  joinCall: _react.PropTypes.func,\n  inviteACall: _react.PropTypes.func,\n  inviteToJoin: _react.PropTypes.func,\n  videoToggleClick: _react.PropTypes.func,\n  cursorToggleClick: _react.PropTypes.func,\n  soundToggleClick: _react.PropTypes.func,\n  participants: _react.PropTypes.arrayOf(_react.PropTypes.shape({\n    color: _react.PropTypes.string, // css color\n    id: _react.PropTypes.number,\n    image: _react.PropTypes.string, // image url\n    self: _react.PropTypes.bool,\n    username: _react.PropTypes.string,\n    isParticipating: _react.PropTypes.bool,\n    isPending: _react.PropTypes.bool })) };exports.default =\n\n\n\nMapChat;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTUyLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvY29tcG9uZW50cy9NYXBDaGF0L2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBQcm9wVHlwZXMsIENvbXBvbmVudCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IFVucmVhZCBmcm9tICcuL1VucmVhZCdcbmltcG9ydCBQYXJ0aWNpcGFudCBmcm9tICcuL1BhcnRpY2lwYW50J1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSAnLi9NZXNzYWdlJ1xuaW1wb3J0IE5ld01lc3NhZ2UgZnJvbSAnLi9OZXdNZXNzYWdlJ1xuaW1wb3J0IFV0aWwgZnJvbSAnLi4vLi4vTWV0YW1hcHMvVXRpbCdcblxuZnVuY3Rpb24gbWFrZUxpc3QobWVzc2FnZXMpIHtcbiAgbGV0IGN1cnJlbnRIZWFkZXJcbiAgcmV0dXJuIG1lc3NhZ2VzID8gbWVzc2FnZXMubWFwKG0gPT4ge1xuICAgIGxldCBoZWFkaW5nID0gZmFsc2VcbiAgICBpZiAoIWN1cnJlbnRIZWFkZXIpIHtcbiAgICAgIGhlYWRpbmcgPSB0cnVlXG4gICAgICBjdXJyZW50SGVhZGVyID0gbVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBub3Qgc2FtZSB1c2VyIG9yIHRpbWUgZGlmZiBvZiBncmVhdGVyIHRoYW4gMyBtaW51dGVzXG4gICAgICBoZWFkaW5nID0gbS51c2VyX2lkICE9PSBjdXJyZW50SGVhZGVyLnVzZXJfaWQgfHwgTWF0aC5mbG9vcihNYXRoLmFicyhuZXcgRGF0ZShjdXJyZW50SGVhZGVyLmNyZWF0ZWRfYXQpIC0gbmV3IERhdGUobS5jcmVhdGVkX2F0KSkgLyA2MDAwMCkgPiAzXG4gICAgICBjdXJyZW50SGVhZGVyID0gaGVhZGluZyA/IG0gOiBjdXJyZW50SGVhZGVyXG4gICAgfVxuICAgIHJldHVybiA8TWVzc2FnZSB7Li4ubX0ga2V5PXttLmlkfSBoZWFkaW5nPXtoZWFkaW5nfS8+XG4gIH0pIDogbnVsbFxufVxuXG5jbGFzcyBNYXBDaGF0IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICB1bnJlYWRNZXNzYWdlczogMCxcbiAgICAgIG9wZW46IGZhbHNlLFxuICAgICAgbWVzc2FnZVRleHQ6ICcnLFxuICAgICAgYWxlcnRTb3VuZDogdHJ1ZSwgLy8gd2hldGhlciB0byBwbGF5IHNvdW5kcyBvbiBhcnJpdmFsIG9mIG5ldyBtZXNzYWdlcyBvciBub3RcbiAgICAgIGN1cnNvcnNTaG93aW5nOiB0cnVlLFxuICAgICAgdmlkZW9zU2hvd2luZzogdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIHJlc2V0ID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgdW5yZWFkTWVzc2FnZXM6IDAsXG4gICAgICBvcGVuOiBmYWxzZSxcbiAgICAgIG1lc3NhZ2VUZXh0OiAnJyxcbiAgICAgIGFsZXJ0U291bmQ6IHRydWUsIC8vIHdoZXRoZXIgdG8gcGxheSBzb3VuZHMgb24gYXJyaXZhbCBvZiBuZXcgbWVzc2FnZXMgb3Igbm90XG4gICAgICBjdXJzb3JzU2hvd2luZzogdHJ1ZSxcbiAgICAgIHZpZGVvc1Nob3dpbmc6IHRydWVcbiAgICB9KVxuICB9XG5cbiAgY2xvc2UgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7b3BlbjogZmFsc2V9KVxuICAgIHRoaXMucHJvcHMub25DbG9zZSgpXG4gICAgdGhpcy5tZXNzYWdlSW5wdXQuYmx1cigpXG4gIH1cblxuICBvcGVuID0gKCkgPT4ge1xuICAgIHRoaXMuc2Nyb2xsKClcbiAgICB0aGlzLnNldFN0YXRlKHtvcGVuOiB0cnVlLCB1bnJlYWRNZXNzYWdlczogMH0pXG4gICAgdGhpcy5wcm9wcy5vbk9wZW4oKVxuICAgIHRoaXMubWVzc2FnZUlucHV0LmZvY3VzKClcbiAgfVxuXG4gIG5ld01lc3NhZ2UgPSAoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnN0YXRlLm9wZW4pIHRoaXMuc2V0U3RhdGUoe3VucmVhZE1lc3NhZ2VzOiB0aGlzLnN0YXRlLnVucmVhZE1lc3NhZ2VzICsgMX0pXG4gIH1cblxuICBzY3JvbGwgPSAoKSA9PiB7XG4gICAgdGhpcy5tZXNzYWdlc0Rpdi5zY3JvbGxUb3AgPSB0aGlzLm1lc3NhZ2VzRGl2LnNjcm9sbEhlaWdodFxuICB9XG5cbiAgdG9nZ2xlRHJhd2VyID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLm9wZW4pIHRoaXMuY2xvc2UoKVxuICAgIGVsc2UgaWYgKCF0aGlzLnN0YXRlLm9wZW4pIHRoaXMub3BlbigpXG4gIH1cblxuICB0b2dnbGVBbGVydFNvdW5kID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe2FsZXJ0U291bmQ6ICF0aGlzLnN0YXRlLmFsZXJ0U291bmR9KVxuICAgIHRoaXMucHJvcHMuc291bmRUb2dnbGVDbGljaygpXG4gIH1cblxuICB0b2dnbGVDdXJzb3JzU2hvd2luZyA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtjdXJzb3JzU2hvd2luZzogIXRoaXMuc3RhdGUuY3Vyc29yc1Nob3dpbmd9KVxuICAgIHRoaXMucHJvcHMuY3Vyc29yVG9nZ2xlQ2xpY2soKVxuICB9XG5cbiAgdG9nZ2xlVmlkZW9zU2hvd2luZyA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHt2aWRlb3NTaG93aW5nOiAhdGhpcy5zdGF0ZS52aWRlb3NTaG93aW5nfSlcbiAgICB0aGlzLnByb3BzLnZpZGVvVG9nZ2xlQ2xpY2soKVxuICB9XG5cbiAgaGFuZGxlQ2hhbmdlID0ga2V5ID0+IGUgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgW2tleV06IGUudGFyZ2V0LnZhbHVlXG4gICAgfSlcbiAgfVxuXG4gIGhhbmRsZVRleHRhcmVhS2V5VXAgPSBlID0+IHtcbiAgICBpZiAoZS53aGljaCA9PT0gMTMpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgY29uc3QgdGV4dCA9IFV0aWwucmVtb3ZlRW1vamkodGhpcy5zdGF0ZS5tZXNzYWdlVGV4dClcbiAgICAgIHRoaXMucHJvcHMuaGFuZGxlSW5wdXRNZXNzYWdlKHRleHQpXG4gICAgICB0aGlzLnNldFN0YXRlKHsgbWVzc2FnZVRleHQ6ICcnIH0pXG4gICAgfVxuICB9XG5cbiAgZm9jdXNNZXNzYWdlSW5wdXQgPSAoKSA9PiB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2VJbnB1dCkgcmV0dXJuXG4gICAgdGhpcy5tZXNzYWdlSW5wdXQuZm9jdXMoKVxuICB9XG5cbiAgcmVuZGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHJpZ2h0T2Zmc2V0ID0gdGhpcy5zdGF0ZS5vcGVuID8gJzAnIDogJy0zMDBweCdcbiAgICBjb25zdCB7IGNvbnZlcnNhdGlvbkxpdmUsIGlzUGFydGljaXBhdGluZywgcGFydGljaXBhbnRzLCBtZXNzYWdlcywgaW52aXRlQUNhbGwsIGludml0ZVRvSm9pbiB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHsgdmlkZW9zU2hvd2luZywgY3Vyc29yc1Nob3dpbmcsIGFsZXJ0U291bmQsIHVucmVhZE1lc3NhZ2VzIH0gPSB0aGlzLnN0YXRlXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY2hhdC1ib3hcIlxuICAgICAgICBzdHlsZT17eyByaWdodDogcmlnaHRPZmZzZXQgfX1cbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJqdW50by1oZWFkZXJcIj5cbiAgICAgICAgICBQQVJUSUNJUEFOVFNcbiAgICAgICAgICA8ZGl2IG9uQ2xpY2s9e3RoaXMudG9nZ2xlVmlkZW9zU2hvd2luZ30gY2xhc3NOYW1lPXtgdmlkZW8tdG9nZ2xlICR7dmlkZW9zU2hvd2luZyA/ICcnIDogJ2FjdGl2ZSd9YH0gLz5cbiAgICAgICAgICA8ZGl2IG9uQ2xpY2s9e3RoaXMudG9nZ2xlQ3Vyc29yc1Nob3dpbmd9IGNsYXNzTmFtZT17YGN1cnNvci10b2dnbGUgJHtjdXJzb3JzU2hvd2luZyA/ICcnIDogJ2FjdGl2ZSd9YH0gLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFydGljaXBhbnRzXCI+XG4gICAgICAgICAge2NvbnZlcnNhdGlvbkxpdmUgJiYgPGRpdiBjbGFzc05hbWU9XCJjb252ZXJzYXRpb24tbGl2ZVwiPlxuICAgICAgICAgICAgTElWRVxuICAgICAgICAgICAge2lzUGFydGljaXBhdGluZyAmJiA8c3BhbiBjbGFzc05hbWU9XCJjYWxsLWFjdGlvbiBsZWF2ZVwiIG9uQ2xpY2s9e3RoaXMucHJvcHMubGVhdmVDYWxsfT5cbiAgICAgICAgICAgICAgTEVBVkVcbiAgICAgICAgICAgIDwvc3Bhbj59XG4gICAgICAgICAgICB7IWlzUGFydGljaXBhdGluZyAmJiA8c3BhbiBjbGFzc05hbWU9XCJjYWxsLWFjdGlvbiBqb2luXCIgb25DbGljaz17dGhpcy5wcm9wcy5qb2luQ2FsbH0+XG4gICAgICAgICAgICAgIEpPSU5cbiAgICAgICAgICAgIDwvc3Bhbj59XG4gICAgICAgICAgPC9kaXY+fVxuICAgICAgICAgIHtwYXJ0aWNpcGFudHMubWFwKHBhcnRpY2lwYW50ID0+IDxQYXJ0aWNpcGFudFxuICAgICAgICAgICAga2V5PXtwYXJ0aWNpcGFudC5pZH1cbiAgICAgICAgICAgIHsuLi5wYXJ0aWNpcGFudH1cbiAgICAgICAgICAgIGludml0ZUFDYWxsPXtpbnZpdGVBQ2FsbH1cbiAgICAgICAgICAgIGludml0ZVRvSm9pbj17aW52aXRlVG9Kb2lufVxuICAgICAgICAgICAgY29udmVyc2F0aW9uTGl2ZT17Y29udmVyc2F0aW9uTGl2ZX1cbiAgICAgICAgICAgIG1hcHBlcklzTGl2ZT17aXNQYXJ0aWNpcGF0aW5nfS8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY2hhdC1oZWFkZXJcIj5cbiAgICAgICAgICBDSEFUXG4gICAgICAgICAgPGRpdiBvbkNsaWNrPXt0aGlzLnRvZ2dsZUFsZXJ0U291bmR9IGNsYXNzTmFtZT17YHNvdW5kLXRvZ2dsZSAke2FsZXJ0U291bmQgPyAnJyA6ICdhY3RpdmUnfWB9PjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e2BjaGF0LWJ1dHRvbiAke2NvbnZlcnNhdGlvbkxpdmUgPyAnYWN0aXZlJyA6ICcnfWB9IG9uQ2xpY2s9e3RoaXMudG9nZ2xlRHJhd2VyfT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRvb2x0aXBzXCI+Q2hhdDwvZGl2PlxuICAgICAgICAgIDxVbnJlYWQgY291bnQ9e3VucmVhZE1lc3NhZ2VzfSAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjaGF0LW1lc3NhZ2VzXCIgcmVmPXtkaXYgPT4geyB0aGlzLm1lc3NhZ2VzRGl2ID0gZGl2IH19PlxuICAgICAgICAgIHttYWtlTGlzdChtZXNzYWdlcyl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8TmV3TWVzc2FnZSBtZXNzYWdlVGV4dD17dGhpcy5zdGF0ZS5tZXNzYWdlVGV4dH1cbiAgICAgICAgICBmb2N1c01lc3NhZ2VJbnB1dD17dGhpcy5mb2N1c01lc3NhZ2VJbnB1dH1cbiAgICAgICAgICBoYW5kbGVDaGFuZ2U9e3RoaXMuaGFuZGxlQ2hhbmdlKCdtZXNzYWdlVGV4dCcpfVxuICAgICAgICAgIHRleHRBcmVhUHJvcHM9e3tcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ2NoYXQtaW5wdXQnLFxuICAgICAgICAgICAgcmVmOiB0ZXh0YXJlYSA9PiB7IHRoaXMubWVzc2FnZUlucHV0ID0gdGV4dGFyZWEgfSxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnU2VuZCBhIG1lc3NhZ2UuLi4nLFxuICAgICAgICAgICAgb25LZXlVcDogdGhpcy5oYW5kbGVUZXh0YXJlYUtleVVwLFxuICAgICAgICAgICAgb25Gb2N1czogdGhpcy5wcm9wcy5pbnB1dEZvY3VzLFxuICAgICAgICAgICAgb25CbHVyOiB0aGlzLnByb3BzLmlucHV0Qmx1clxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cbn1cblxuTWFwQ2hhdC5wcm9wVHlwZXMgPSB7XG4gIGNvbnZlcnNhdGlvbkxpdmU6IFByb3BUeXBlcy5ib29sLFxuICBpc1BhcnRpY2lwYXRpbmc6IFByb3BUeXBlcy5ib29sLFxuICBvbk9wZW46IFByb3BUeXBlcy5mdW5jLFxuICBvbkNsb3NlOiBQcm9wVHlwZXMuZnVuYyxcbiAgbGVhdmVDYWxsOiBQcm9wVHlwZXMuZnVuYyxcbiAgam9pbkNhbGw6IFByb3BUeXBlcy5mdW5jLFxuICBpbnZpdGVBQ2FsbDogUHJvcFR5cGVzLmZ1bmMsXG4gIGludml0ZVRvSm9pbjogUHJvcFR5cGVzLmZ1bmMsXG4gIHZpZGVvVG9nZ2xlQ2xpY2s6IFByb3BUeXBlcy5mdW5jLFxuICBjdXJzb3JUb2dnbGVDbGljazogUHJvcFR5cGVzLmZ1bmMsXG4gIHNvdW5kVG9nZ2xlQ2xpY2s6IFByb3BUeXBlcy5mdW5jLFxuICBwYXJ0aWNpcGFudHM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zaGFwZSh7XG4gICAgY29sb3I6IFByb3BUeXBlcy5zdHJpbmcsIC8vIGNzcyBjb2xvclxuICAgIGlkOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIGltYWdlOiBQcm9wVHlwZXMuc3RyaW5nLCAvLyBpbWFnZSB1cmxcbiAgICBzZWxmOiBQcm9wVHlwZXMuYm9vbCxcbiAgICB1c2VybmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBpc1BhcnRpY2lwYXRpbmc6IFByb3BUeXBlcy5ib29sLFxuICAgIGlzUGVuZGluZzogUHJvcFR5cGVzLmJvb2xcbiAgfSkpXG59XG5cbmV4cG9ydCBkZWZhdWx0IE1hcENoYXRcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBmcm9udGVuZC9zcmMvY29tcG9uZW50cy9NYXBDaGF0L2luZGV4LmpzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdElBO0FBQ0E7QUF3SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 553 */
/***/ function(module, exports, __webpack_require__) {

    eval("\"use strict\";Object.defineProperty(exports, \"__esModule\", { value: true });var _react = __webpack_require__(174);var _react2 = _interopRequireDefault(_react);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}\n\nvar Unread = function Unread(props) {\n  return props.count ? _react2.default.createElement(\"div\", { className: \"chat-unread\" }, props.count) : null;\n};exports.default =\n\nUnread;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTUzLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvY29tcG9uZW50cy9NYXBDaGF0L1VucmVhZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5cbmNvbnN0IFVucmVhZCA9IHByb3BzID0+IHtcbiAgcmV0dXJuIHByb3BzLmNvdW50ID8gPGRpdiBjbGFzc05hbWU9XCJjaGF0LXVucmVhZFwiPntwcm9wcy5jb3VudH08L2Rpdj4gOiBudWxsXG59XG5cbmV4cG9ydCBkZWZhdWx0IFVucmVhZFxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9jb21wb25lbnRzL01hcENoYXQvVW5yZWFkLmpzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 554 */
/***/ function(module, exports, __webpack_require__) {

    eval("'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__(174);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\n\nParticipant = function (_Component) {_inherits(Participant, _Component);function Participant() {_classCallCheck(this, Participant);return _possibleConstructorReturn(this, (Participant.__proto__ || Object.getPrototypeOf(Participant)).apply(this, arguments));}_createClass(Participant, [{ key: 'render', value: function render()\n    {var _this2 = this;var _props =\n      this.props,conversationLive = _props.conversationLive,mapperIsLive = _props.mapperIsLive,isParticipating = _props.isParticipating,isPending = _props.isPending,id = _props.id,self = _props.self,image = _props.image,username = _props.username,color = _props.color;\n      return (\n        _react2.default.createElement('div', { className: 'participant participant-' + id + ' ' + (self ? 'is-self' : '') },\n          _react2.default.createElement('div', { className: 'chat-participant-image' },\n            _react2.default.createElement('img', { src: image, style: { border: '2px solid ' + color } })),\n\n          _react2.default.createElement('div', { className: 'chat-participant-name' },\n            username, ' ', self ? '(me)' : ''),\n\n          !self && !conversationLive && _react2.default.createElement('button', {\n            className: 'button chat-participant-invite-call ' + (isPending ? 'pending' : ''),\n            onClick: function onClick() {return !isPending && _this2.props.inviteACall(id);} // Realtime.inviteACall(id)\n          }),\n          !self && mapperIsLive && !isParticipating && _react2.default.createElement('button', {\n            className: 'button chat-participant-invite-join ' + (isPending ? 'pending' : ''),\n            onClick: function onClick() {return !isPending && _this2.props.inviteToJoin(id);} // Realtime.inviteToJoin(id)\n          }),\n          isParticipating && _react2.default.createElement('span', { className: 'chat-participant-participating' },\n            _react2.default.createElement('div', { className: 'green-dot' })),\n\n          _react2.default.createElement('div', { className: 'clearfloat' })));\n\n\n    } }]);return Participant;}(_react.Component);\n\n\nParticipant.propTypes = {\n  conversationLive: _react.PropTypes.bool,\n  mapperIsLive: _react.PropTypes.bool,\n  isParticipating: _react.PropTypes.bool,\n  isPending: _react.PropTypes.bool,\n  color: _react.PropTypes.string, // css color\n  id: _react.PropTypes.number,\n  image: _react.PropTypes.string, // image url\n  self: _react.PropTypes.bool,\n  username: _react.PropTypes.string,\n  inviteACall: _react.PropTypes.func,\n  inviteToJoin: _react.PropTypes.func };exports.default =\n\n\nParticipant;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU0LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvY29tcG9uZW50cy9NYXBDaGF0L1BhcnRpY2lwYW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBQcm9wVHlwZXMsIENvbXBvbmVudCB9IGZyb20gJ3JlYWN0J1xuXG5jbGFzcyBQYXJ0aWNpcGFudCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IGNvbnZlcnNhdGlvbkxpdmUsIG1hcHBlcklzTGl2ZSwgaXNQYXJ0aWNpcGF0aW5nLCBpc1BlbmRpbmcsIGlkLCBzZWxmLCBpbWFnZSwgdXNlcm5hbWUsIGNvbG9yIH0gPSB0aGlzLnByb3BzXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtgcGFydGljaXBhbnQgcGFydGljaXBhbnQtJHtpZH0gJHtzZWxmID8gJ2lzLXNlbGYnIDogJyd9YH0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY2hhdC1wYXJ0aWNpcGFudC1pbWFnZVwiPlxuICAgICAgICAgIDxpbWcgc3JjPXtpbWFnZX0gc3R5bGU9e3sgYm9yZGVyOiBgMnB4IHNvbGlkICR7Y29sb3J9YCB9fSAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjaGF0LXBhcnRpY2lwYW50LW5hbWVcIj5cbiAgICAgICAgICB7dXNlcm5hbWV9IHtzZWxmID8gJyhtZSknIDogJyd9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7IXNlbGYgJiYgIWNvbnZlcnNhdGlvbkxpdmUgJiYgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzTmFtZT17YGJ1dHRvbiBjaGF0LXBhcnRpY2lwYW50LWludml0ZS1jYWxsICR7aXNQZW5kaW5nID8gJ3BlbmRpbmcnIDogJyd9YH1cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiAhaXNQZW5kaW5nICYmIHRoaXMucHJvcHMuaW52aXRlQUNhbGwoaWQpfSAvLyBSZWFsdGltZS5pbnZpdGVBQ2FsbChpZClcbiAgICAgICAgLz59XG4gICAgICAgIHshc2VsZiAmJiBtYXBwZXJJc0xpdmUgJiYgIWlzUGFydGljaXBhdGluZyAmJiA8YnV0dG9uXG4gICAgICAgICAgY2xhc3NOYW1lPXtgYnV0dG9uIGNoYXQtcGFydGljaXBhbnQtaW52aXRlLWpvaW4gJHtpc1BlbmRpbmcgPyAncGVuZGluZycgOiAnJ31gfVxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+ICFpc1BlbmRpbmcgJiYgdGhpcy5wcm9wcy5pbnZpdGVUb0pvaW4oaWQpfSAvLyBSZWFsdGltZS5pbnZpdGVUb0pvaW4oaWQpXG4gICAgICAgIC8+fVxuICAgICAgICB7aXNQYXJ0aWNpcGF0aW5nICYmIDxzcGFuIGNsYXNzTmFtZT1cImNoYXQtcGFydGljaXBhbnQtcGFydGljaXBhdGluZ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JlZW4tZG90XCI+PC9kaXY+XG4gICAgICAgIDwvc3Bhbj59XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY2xlYXJmbG9hdFwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG59XG5cblBhcnRpY2lwYW50LnByb3BUeXBlcyA9IHtcbiAgY29udmVyc2F0aW9uTGl2ZTogUHJvcFR5cGVzLmJvb2wsXG4gIG1hcHBlcklzTGl2ZTogUHJvcFR5cGVzLmJvb2wsXG4gIGlzUGFydGljaXBhdGluZzogUHJvcFR5cGVzLmJvb2wsXG4gIGlzUGVuZGluZzogUHJvcFR5cGVzLmJvb2wsXG4gIGNvbG9yOiBQcm9wVHlwZXMuc3RyaW5nLCAvLyBjc3MgY29sb3JcbiAgaWQ6IFByb3BUeXBlcy5udW1iZXIsXG4gIGltYWdlOiBQcm9wVHlwZXMuc3RyaW5nLCAvLyBpbWFnZSB1cmxcbiAgc2VsZjogUHJvcFR5cGVzLmJvb2wsXG4gIHVzZXJuYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBpbnZpdGVBQ2FsbDogUHJvcFR5cGVzLmZ1bmMsXG4gIGludml0ZVRvSm9pbjogUHJvcFR5cGVzLmZ1bmNcbn1cblxuZXhwb3J0IGRlZmF1bHQgUGFydGljaXBhbnRcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBmcm9udGVuZC9zcmMvY29tcG9uZW50cy9NYXBDaGF0L1BhcnRpY2lwYW50LmpzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 555 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _react = __webpack_require__(174);var _react2 = _interopRequireDefault(_react);\nvar _autolinker = __webpack_require__(556);var _autolinker2 = _interopRequireDefault(_autolinker);\nvar _Util = __webpack_require__(410);var _Util2 = _interopRequireDefault(_Util);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}\n\nvar linker = new _autolinker2.default({ newWindow: true, truncate: 50, email: false, phone: false });\n\nfunction addZero(i) {\n  if (i < 10) {\n    i = '0' + i;\n  }\n  return i;\n}\n\nfunction formatDate(createdAt) {\n  var date = new Date(createdAt);\n  var formatted = date.getMonth() + 1 + '/' + date.getDate();\n  formatted += ' ' + addZero(date.getHours()) + ':' + addZero(date.getMinutes());\n  return formatted;\n}\n\nvar Message = function Message(props) {var\n  userImage = props.user_image,userName = props.user_name,message = props.message,createdAt = props.created_at,heading = props.heading;\n  var messageHtml = { __html: linker.link(_Util2.default.addEmoji(message, { emoticons: false })) };\n\n  return (\n    _react2.default.createElement('div', { className: 'chat-message' },\n      _react2.default.createElement('div', { className: 'chat-message-user' },\n        heading && _react2.default.createElement('img', { src: userImage })),\n\n      heading && _react2.default.createElement('div', { className: 'chat-message-meta' },\n        _react2.default.createElement('span', { className: 'chat-message-username' }, userName), ' ',\n        _react2.default.createElement('span', { className: 'chat-message-time' }, formatDate(createdAt))),\n\n      _react2.default.createElement('div', { className: 'chat-message-text', dangerouslySetInnerHTML: messageHtml }),\n      _react2.default.createElement('div', { className: 'clearfloat' })));\n\n\n};exports.default =\n\nMessage;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU1LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvY29tcG9uZW50cy9NYXBDaGF0L01lc3NhZ2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IEF1dG9saW5rZXIgZnJvbSAnYXV0b2xpbmtlcidcbmltcG9ydCBVdGlsIGZyb20gJy4uLy4uL01ldGFtYXBzL1V0aWwnXG5cbmNvbnN0IGxpbmtlciA9IG5ldyBBdXRvbGlua2VyKHsgbmV3V2luZG93OiB0cnVlLCB0cnVuY2F0ZTogNTAsIGVtYWlsOiBmYWxzZSwgcGhvbmU6IGZhbHNlIH0pXG5cbmZ1bmN0aW9uIGFkZFplcm8oaSkge1xuICBpZiAoaSA8IDEwKSB7XG4gICAgaSA9ICcwJyArIGlcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBmb3JtYXREYXRlKGNyZWF0ZWRBdCkge1xuICBsZXQgZGF0ZSA9IG5ldyBEYXRlKGNyZWF0ZWRBdClcbiAgbGV0IGZvcm1hdHRlZCA9IChkYXRlLmdldE1vbnRoKCkgKyAxKSArICcvJyArIGRhdGUuZ2V0RGF0ZSgpXG4gIGZvcm1hdHRlZCArPSAnICcgKyBhZGRaZXJvKGRhdGUuZ2V0SG91cnMoKSkgKyAnOicgKyBhZGRaZXJvKGRhdGUuZ2V0TWludXRlcygpKVxuICByZXR1cm4gZm9ybWF0dGVkXG59XG5cbmNvbnN0IE1lc3NhZ2UgPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHsgdXNlcl9pbWFnZTogdXNlckltYWdlLCB1c2VyX25hbWU6IHVzZXJOYW1lLCBtZXNzYWdlLCBjcmVhdGVkX2F0OiBjcmVhdGVkQXQsIGhlYWRpbmcgfSA9IHByb3BzXG4gIGNvbnN0IG1lc3NhZ2VIdG1sID0ge19faHRtbDogbGlua2VyLmxpbmsoVXRpbC5hZGRFbW9qaShtZXNzYWdlLCB7IGVtb3RpY29uczogZmFsc2UgfSkpfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJjaGF0LW1lc3NhZ2VcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY2hhdC1tZXNzYWdlLXVzZXJcIj5cbiAgICAgICAge2hlYWRpbmcgJiYgPGltZyBzcmM9e3VzZXJJbWFnZX0gLz59XG4gICAgICA8L2Rpdj5cbiAgICAgIHtoZWFkaW5nICYmIDxkaXYgY2xhc3NOYW1lPVwiY2hhdC1tZXNzYWdlLW1ldGFcIj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdjaGF0LW1lc3NhZ2UtdXNlcm5hbWUnPnt1c2VyTmFtZX08L3NwYW4+Jm5ic3A7XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT0nY2hhdC1tZXNzYWdlLXRpbWUnPntmb3JtYXREYXRlKGNyZWF0ZWRBdCl9PC9zcGFuPlxuICAgICAgPC9kaXY+fVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjaGF0LW1lc3NhZ2UtdGV4dFwiIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXttZXNzYWdlSHRtbH0+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNsZWFyZmxvYXRcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBNZXNzYWdlXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvTWFwQ2hhdC9NZXNzYWdlLmpzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 556 */
/***/ function(module, exports, __webpack_require__) {

    eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * Autolinker.js\n * 1.4.0\n *\n * Copyright(c) 2016 Gregory Jacobs <greg@greg-jacobs.com>\n * MIT License\n *\n * https://github.com/gregjacobs/Autolinker.js\n */\n;(function(root, factory) {\n  if (true) {\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else if (typeof exports === 'object') {\n    module.exports = factory();\n  } else {\n    root.Autolinker = factory();\n  }\n}(this, function() {\n/**\n * @class Autolinker\n * @extends Object\n *\n * Utility class used to process a given string of text, and wrap the matches in\n * the appropriate anchor (&lt;a&gt;) tags to turn them into links.\n *\n * Any of the configuration options may be provided in an Object (map) provided\n * to the Autolinker constructor, which will configure how the {@link #link link()}\n * method will process the links.\n *\n * For example:\n *\n *     var autolinker = new Autolinker( {\n *         newWindow : false,\n *         truncate  : 30\n *     } );\n *\n *     var html = autolinker.link( \"Joe went to www.yahoo.com\" );\n *     // produces: 'Joe went to <a href=\"http://www.yahoo.com\">yahoo.com</a>'\n *\n *\n * The {@link #static-link static link()} method may also be used to inline\n * options into a single call, which may be more convenient for one-off uses.\n * For example:\n *\n *     var html = Autolinker.link( \"Joe went to www.yahoo.com\", {\n *         newWindow : false,\n *         truncate  : 30\n *     } );\n *     // produces: 'Joe went to <a href=\"http://www.yahoo.com\">yahoo.com</a>'\n *\n *\n * ## Custom Replacements of Links\n *\n * If the configuration options do not provide enough flexibility, a {@link #replaceFn}\n * may be provided to fully customize the output of Autolinker. This function is\n * called once for each URL/Email/Phone#/Hashtag/Mention (Twitter, Instagram)\n * match that is encountered.\n *\n * For example:\n *\n *     var input = \"...\";  // string with URLs, Email Addresses, Phone #s, Hashtags, and Mentions (Twitter, Instagram)\n *\n *     var linkedText = Autolinker.link( input, {\n *         replaceFn : function( match ) {\n *             console.log( \"href = \", match.getAnchorHref() );\n *             console.log( \"text = \", match.getAnchorText() );\n *\n *             switch( match.getType() ) {\n *                 case 'url' :\n *                     console.log( \"url: \", match.getUrl() );\n *\n *                     if( match.getUrl().indexOf( 'mysite.com' ) === -1 ) {\n *                         var tag = match.buildTag();  // returns an `Autolinker.HtmlTag` instance, which provides mutator methods for easy changes\n *                         tag.setAttr( 'rel', 'nofollow' );\n *                         tag.addClass( 'external-link' );\n *\n *                         return tag;\n *\n *                     } else {\n *                         return true;  // let Autolinker perform its normal anchor tag replacement\n *                     }\n *\n *                 case 'email' :\n *                     var email = match.getEmail();\n *                     console.log( \"email: \", email );\n *\n *                     if( email === \"my@own.address\" ) {\n *                         return false;  // don't auto-link this particular email address; leave as-is\n *                     } else {\n *                         return;  // no return value will have Autolinker perform its normal anchor tag replacement (same as returning `true`)\n *                     }\n *\n *                 case 'phone' :\n *                     var phoneNumber = match.getPhoneNumber();\n *                     console.log( phoneNumber );\n *\n *                     return '<a href=\"http://newplace.to.link.phone.numbers.to/\">' + phoneNumber + '</a>';\n *\n *                 case 'hashtag' :\n *                     var hashtag = match.getHashtag();\n *                     console.log( hashtag );\n *\n *                     return '<a href=\"http://newplace.to.link.hashtag.handles.to/\">' + hashtag + '</a>';\n *\n *                 case 'mention' :\n *                     var mention = match.getMention();\n *                     console.log( mention );\n *\n *                     return '<a href=\"http://newplace.to.link.mention.to/\">' + mention + '</a>';\n *             }\n *         }\n *     } );\n *\n *\n * The function may return the following values:\n *\n * - `true` (Boolean): Allow Autolinker to replace the match as it normally\n *   would.\n * - `false` (Boolean): Do not replace the current match at all - leave as-is.\n * - Any String: If a string is returned from the function, the string will be\n *   used directly as the replacement HTML for the match.\n * - An {@link Autolinker.HtmlTag} instance, which can be used to build/modify\n *   an HTML tag before writing out its HTML text.\n *\n * @constructor\n * @param {Object} [cfg] The configuration options for the Autolinker instance,\n *   specified in an Object (map).\n */\nvar Autolinker = function( cfg ) {\n\tcfg = cfg || {};\n\n\tthis.version = Autolinker.version;\n\n\tthis.urls = this.normalizeUrlsCfg( cfg.urls );\n\tthis.email = typeof cfg.email === 'boolean' ? cfg.email : true;\n\tthis.phone = typeof cfg.phone === 'boolean' ? cfg.phone : true;\n\tthis.hashtag = cfg.hashtag || false;\n\tthis.mention = cfg.mention || false;\n\tthis.newWindow = typeof cfg.newWindow === 'boolean' ? cfg.newWindow : true;\n\tthis.stripPrefix = this.normalizeStripPrefixCfg( cfg.stripPrefix );\n\tthis.stripTrailingSlash = typeof cfg.stripTrailingSlash === 'boolean' ? cfg.stripTrailingSlash : true;\n\n\t// Validate the value of the `mention` cfg\n\tvar mention = this.mention;\n\tif( mention !== false && mention !== 'twitter' && mention !== 'instagram' ) {\n\t\tthrow new Error( \"invalid `mention` cfg - see docs\" );\n\t}\n\n\t// Validate the value of the `hashtag` cfg\n\tvar hashtag = this.hashtag;\n\tif( hashtag !== false && hashtag !== 'twitter' && hashtag !== 'facebook' && hashtag !== 'instagram' ) {\n\t\tthrow new Error( \"invalid `hashtag` cfg - see docs\" );\n\t}\n\n\tthis.truncate = this.normalizeTruncateCfg( cfg.truncate );\n\tthis.className = cfg.className || '';\n\tthis.replaceFn = cfg.replaceFn || null;\n\tthis.context = cfg.context || this;\n\n\tthis.htmlParser = null;\n\tthis.matchers = null;\n\tthis.tagBuilder = null;\n};\n\n\n\n/**\n * Automatically links URLs, Email addresses, Phone Numbers, Twitter handles,\n * Hashtags, and Mentions found in the given chunk of HTML. Does not link URLs\n * found within HTML tags.\n *\n * For instance, if given the text: `You should go to http://www.yahoo.com`,\n * then the result will be `You should go to &lt;a href=\"http://www.yahoo.com\"&gt;http://www.yahoo.com&lt;/a&gt;`\n *\n * Example:\n *\n *     var linkedText = Autolinker.link( \"Go to google.com\", { newWindow: false } );\n *     // Produces: \"Go to <a href=\"http://google.com\">google.com</a>\"\n *\n * @static\n * @param {String} textOrHtml The HTML or text to find matches within (depending\n *   on if the {@link #urls}, {@link #email}, {@link #phone}, {@link #mention},\n *   {@link #hashtag}, and {@link #mention} options are enabled).\n * @param {Object} [options] Any of the configuration options for the Autolinker\n *   class, specified in an Object (map). See the class description for an\n *   example call.\n * @return {String} The HTML text, with matches automatically linked.\n */\nAutolinker.link = function( textOrHtml, options ) {\n\tvar autolinker = new Autolinker( options );\n\treturn autolinker.link( textOrHtml );\n};\n\n\n\n/**\n * Parses the input `textOrHtml` looking for URLs, email addresses, phone\n * numbers, username handles, and hashtags (depending on the configuration\n * of the Autolinker instance), and returns an array of {@link Autolinker.match.Match}\n * objects describing those matches (without making any replacements).\n *\n * Note that if parsing multiple pieces of text, it is slightly more efficient\n * to create an Autolinker instance, and use the instance-level {@link #parse}\n * method.\n *\n * Example:\n *\n *     var matches = Autolinker.parse( \"Hello google.com, I am asdf@asdf.com\", {\n *         urls: true,\n *         email: true\n *     } );\n *\n *     console.log( matches.length );           // 2\n *     console.log( matches[ 0 ].getType() );   // 'url'\n *     console.log( matches[ 0 ].getUrl() );    // 'google.com'\n *     console.log( matches[ 1 ].getType() );   // 'email'\n *     console.log( matches[ 1 ].getEmail() );  // 'asdf@asdf.com'\n *\n * @static\n * @param {String} textOrHtml The HTML or text to find matches within\n *   (depending on if the {@link #urls}, {@link #email}, {@link #phone},\n *   {@link #hashtag}, and {@link #mention} options are enabled).\n * @param {Object} [options] Any of the configuration options for the Autolinker\n *   class, specified in an Object (map). See the class description for an\n *   example call.\n * @return {Autolinker.match.Match[]} The array of Matches found in the\n *   given input `textOrHtml`.\n */\nAutolinker.parse = function( textOrHtml, options ) {\n\tvar autolinker = new Autolinker( options );\n\treturn autolinker.parse( textOrHtml );\n};\n\n\n/**\n * @static\n * @property {String} version (readonly)\n *\n * The Autolinker version number in the form major.minor.patch\n *\n * Ex: 0.25.1\n */\nAutolinker.version = '1.4.0';\n\n\nAutolinker.prototype = {\n\tconstructor : Autolinker,  // fix constructor property\n\n\t/**\n\t * @cfg {Boolean/Object} [urls]\n\t *\n\t * `true` if URLs should be automatically linked, `false` if they should not\n\t * be. Defaults to `true`.\n\t *\n\t * Examples:\n\t *\n\t *     urls: true\n\t *\n\t *     // or\n\t *\n\t *     urls: {\n\t *         schemeMatches : true,\n\t *         wwwMatches    : true,\n\t *         tldMatches    : true\n\t *     }\n\t *\n\t * As shown above, this option also accepts an Object form with 3 properties\n\t * to allow for more customization of what exactly gets linked. All default\n\t * to `true`:\n\t *\n\t * @cfg {Boolean} [urls.schemeMatches] `true` to match URLs found prefixed\n\t *   with a scheme, i.e. `http://google.com`, or `other+scheme://google.com`,\n\t *   `false` to prevent these types of matches.\n\t * @cfg {Boolean} [urls.wwwMatches] `true` to match urls found prefixed with\n\t *   `'www.'`, i.e. `www.google.com`. `false` to prevent these types of\n\t *   matches. Note that if the URL had a prefixed scheme, and\n\t *   `schemeMatches` is true, it will still be linked.\n\t * @cfg {Boolean} [urls.tldMatches] `true` to match URLs with known top\n\t *   level domains (.com, .net, etc.) that are not prefixed with a scheme or\n\t *   `'www.'`. This option attempts to match anything that looks like a URL\n\t *   in the given text. Ex: `google.com`, `asdf.org/?page=1`, etc. `false`\n\t *   to prevent these types of matches.\n\t */\n\n\t/**\n\t * @cfg {Boolean} [email=true]\n\t *\n\t * `true` if email addresses should be automatically linked, `false` if they\n\t * should not be.\n\t */\n\n\t/**\n\t * @cfg {Boolean} [phone=true]\n\t *\n\t * `true` if Phone numbers (\"(555)555-5555\") should be automatically linked,\n\t * `false` if they should not be.\n\t */\n\n\t/**\n\t * @cfg {Boolean/String} [hashtag=false]\n\t *\n\t * A string for the service name to have hashtags (ex: \"#myHashtag\")\n\t * auto-linked to. The currently-supported values are:\n\t *\n\t * - 'twitter'\n\t * - 'facebook'\n\t * - 'instagram'\n\t *\n\t * Pass `false` to skip auto-linking of hashtags.\n\t */\n\n\t/**\n\t * @cfg {String/Boolean} [mention=false]\n\t *\n\t * A string for the service name to have mentions (ex: \"@myuser\")\n\t * auto-linked to. The currently supported values are:\n\t *\n\t * - 'twitter'\n\t * - 'instagram'\n\t *\n\t * Defaults to `false` to skip auto-linking of mentions.\n\t */\n\n\t/**\n\t * @cfg {Boolean} [newWindow=true]\n\t *\n\t * `true` if the links should open in a new window, `false` otherwise.\n\t */\n\n\t/**\n\t * @cfg {Boolean/Object} [stripPrefix]\n\t *\n\t * `true` if 'http://' (or 'https://') and/or the 'www.' should be stripped\n\t * from the beginning of URL links' text, `false` otherwise. Defaults to\n\t * `true`.\n\t *\n\t * Examples:\n\t *\n\t *     stripPrefix: true\n\t *\n\t *     // or\n\t *\n\t *     stripPrefix: {\n\t *         scheme : true,\n\t *         www    : true\n\t *     }\n\t *\n\t * As shown above, this option also accepts an Object form with 2 properties\n\t * to allow for more customization of what exactly is prevented from being\n\t * displayed. Both default to `true`:\n\t *\n\t * @cfg {Boolean} [stripPrefix.scheme] `true` to prevent the scheme part of\n\t *   a URL match from being displayed to the user. Example:\n\t *   `'http://google.com'` will be displayed as `'google.com'`. `false` to\n\t *   not strip the scheme. NOTE: Only an `'http://'` or `'https://'` scheme\n\t *   will be removed, so as not to remove a potentially dangerous scheme\n\t *   (such as `'file://'` or `'javascript:'`)\n\t * @cfg {Boolean} [stripPrefix.www] www (Boolean): `true` to prevent the\n\t *   `'www.'` part of a URL match from being displayed to the user. Ex:\n\t *   `'www.google.com'` will be displayed as `'google.com'`. `false` to not\n\t *   strip the `'www'`.\n\t */\n\n\t/**\n\t * @cfg {Boolean} [stripTrailingSlash=true]\n\t *\n\t * `true` to remove the trailing slash from URL matches, `false` to keep\n\t *  the trailing slash.\n\t *\n\t *  Example when `true`: `http://google.com/` will be displayed as\n\t *  `http://google.com`.\n\t */\n\n\t/**\n\t * @cfg {Number/Object} [truncate=0]\n\t *\n\t * ## Number Form\n\t *\n\t * A number for how many characters matched text should be truncated to\n\t * inside the text of a link. If the matched text is over this number of\n\t * characters, it will be truncated to this length by adding a two period\n\t * ellipsis ('..') to the end of the string.\n\t *\n\t * For example: A url like 'http://www.yahoo.com/some/long/path/to/a/file'\n\t * truncated to 25 characters might look something like this:\n\t * 'yahoo.com/some/long/pat..'\n\t *\n\t * Example Usage:\n\t *\n\t *     truncate: 25\n\t *\n\t *\n\t *  Defaults to `0` for \"no truncation.\"\n\t *\n\t *\n\t * ## Object Form\n\t *\n\t * An Object may also be provided with two properties: `length` (Number) and\n\t * `location` (String). `location` may be one of the following: 'end'\n\t * (default), 'middle', or 'smart'.\n\t *\n\t * Example Usage:\n\t *\n\t *     truncate: { length: 25, location: 'middle' }\n\t *\n\t * @cfg {Number} [truncate.length=0] How many characters to allow before\n\t *   truncation will occur. Defaults to `0` for \"no truncation.\"\n\t * @cfg {\"end\"/\"middle\"/\"smart\"} [truncate.location=\"end\"]\n\t *\n\t * - 'end' (default): will truncate up to the number of characters, and then\n\t *   add an ellipsis at the end. Ex: 'yahoo.com/some/long/pat..'\n\t * - 'middle': will truncate and add the ellipsis in the middle. Ex:\n\t *   'yahoo.com/s..th/to/a/file'\n\t * - 'smart': for URLs where the algorithm attempts to strip out unnecessary\n\t *   parts first (such as the 'www.', then URL scheme, hash, etc.),\n\t *   attempting to make the URL human-readable before looking for a good\n\t *   point to insert the ellipsis if it is still too long. Ex:\n\t *   'yahoo.com/some..to/a/file'. For more details, see\n\t *   {@link Autolinker.truncate.TruncateSmart}.\n\t */\n\n\t/**\n\t * @cfg {String} className\n\t *\n\t * A CSS class name to add to the generated links. This class will be added\n\t * to all links, as well as this class plus match suffixes for styling\n\t * url/email/phone/hashtag/mention links differently.\n\t *\n\t * For example, if this config is provided as \"myLink\", then:\n\t *\n\t * - URL links will have the CSS classes: \"myLink myLink-url\"\n\t * - Email links will have the CSS classes: \"myLink myLink-email\", and\n\t * - Phone links will have the CSS classes: \"myLink myLink-phone\"\n\t * - Hashtag links will have the CSS classes: \"myLink myLink-hashtag\"\n\t * - Mention links will have the CSS classes: \"myLink myLink-mention myLink-[type]\"\n\t *   where [type] is either \"instagram\" or \"twitter\"\n\t */\n\n\t/**\n\t * @cfg {Function} replaceFn\n\t *\n\t * A function to individually process each match found in the input string.\n\t *\n\t * See the class's description for usage.\n\t *\n\t * The `replaceFn` can be called with a different context object (`this`\n\t * reference) using the {@link #context} cfg.\n\t *\n\t * This function is called with the following parameter:\n\t *\n\t * @cfg {Autolinker.match.Match} replaceFn.match The Match instance which\n\t *   can be used to retrieve information about the match that the `replaceFn`\n\t *   is currently processing. See {@link Autolinker.match.Match} subclasses\n\t *   for details.\n\t */\n\n\t/**\n\t * @cfg {Object} context\n\t *\n\t * The context object (`this` reference) to call the `replaceFn` with.\n\t *\n\t * Defaults to this Autolinker instance.\n\t */\n\n\n\t/**\n\t * @property {String} version (readonly)\n\t *\n\t * The Autolinker version number in the form major.minor.patch\n\t *\n\t * Ex: 0.25.1\n\t */\n\n\t/**\n\t * @private\n\t * @property {Autolinker.htmlParser.HtmlParser} htmlParser\n\t *\n\t * The HtmlParser instance used to skip over HTML tags, while finding text\n\t * nodes to process. This is lazily instantiated in the {@link #getHtmlParser}\n\t * method.\n\t */\n\n\t/**\n\t * @private\n\t * @property {Autolinker.matcher.Matcher[]} matchers\n\t *\n\t * The {@link Autolinker.matcher.Matcher} instances for this Autolinker\n\t * instance.\n\t *\n\t * This is lazily created in {@link #getMatchers}.\n\t */\n\n\t/**\n\t * @private\n\t * @property {Autolinker.AnchorTagBuilder} tagBuilder\n\t *\n\t * The AnchorTagBuilder instance used to build match replacement anchor tags.\n\t * Note: this is lazily instantiated in the {@link #getTagBuilder} method.\n\t */\n\n\n\t/**\n\t * Normalizes the {@link #urls} config into an Object with 3 properties:\n\t * `schemeMatches`, `wwwMatches`, and `tldMatches`, all Booleans.\n\t *\n\t * See {@link #urls} config for details.\n\t *\n\t * @private\n\t * @param {Boolean/Object} urls\n\t * @return {Object}\n\t */\n\tnormalizeUrlsCfg : function( urls ) {\n\t\tif( urls == null ) urls = true;  // default to `true`\n\n\t\tif( typeof urls === 'boolean' ) {\n\t\t\treturn { schemeMatches: urls, wwwMatches: urls, tldMatches: urls };\n\n\t\t} else {  // object form\n\t\t\treturn {\n\t\t\t\tschemeMatches : typeof urls.schemeMatches === 'boolean' ? urls.schemeMatches : true,\n\t\t\t\twwwMatches    : typeof urls.wwwMatches === 'boolean'    ? urls.wwwMatches    : true,\n\t\t\t\ttldMatches    : typeof urls.tldMatches === 'boolean'    ? urls.tldMatches    : true\n\t\t\t};\n\t\t}\n\t},\n\n\n\t/**\n\t * Normalizes the {@link #stripPrefix} config into an Object with 2\n\t * properties: `scheme`, and `www` - both Booleans.\n\t *\n\t * See {@link #stripPrefix} config for details.\n\t *\n\t * @private\n\t * @param {Boolean/Object} stripPrefix\n\t * @return {Object}\n\t */\n\tnormalizeStripPrefixCfg : function( stripPrefix ) {\n\t\tif( stripPrefix == null ) stripPrefix = true;  // default to `true`\n\n\t\tif( typeof stripPrefix === 'boolean' ) {\n\t\t\treturn { scheme: stripPrefix, www: stripPrefix };\n\n\t\t} else {  // object form\n\t\t\treturn {\n\t\t\t\tscheme : typeof stripPrefix.scheme === 'boolean' ? stripPrefix.scheme : true,\n\t\t\t\twww    : typeof stripPrefix.www === 'boolean'    ? stripPrefix.www    : true\n\t\t\t};\n\t\t}\n\t},\n\n\n\t/**\n\t * Normalizes the {@link #truncate} config into an Object with 2 properties:\n\t * `length` (Number), and `location` (String).\n\t *\n\t * See {@link #truncate} config for details.\n\t *\n\t * @private\n\t * @param {Number/Object} truncate\n\t * @return {Object}\n\t */\n\tnormalizeTruncateCfg : function( truncate ) {\n\t\tif( typeof truncate === 'number' ) {\n\t\t\treturn { length: truncate, location: 'end' };\n\n\t\t} else {  // object, or undefined/null\n\t\t\treturn Autolinker.Util.defaults( truncate || {}, {\n\t\t\t\tlength   : Number.POSITIVE_INFINITY,\n\t\t\t\tlocation : 'end'\n\t\t\t} );\n\t\t}\n\t},\n\n\n\t/**\n\t * Parses the input `textOrHtml` looking for URLs, email addresses, phone\n\t * numbers, username handles, and hashtags (depending on the configuration\n\t * of the Autolinker instance), and returns an array of {@link Autolinker.match.Match}\n\t * objects describing those matches (without making any replacements).\n\t *\n\t * This method is used by the {@link #link} method, but can also be used to\n\t * simply do parsing of the input in order to discover what kinds of links\n\t * there are and how many.\n\t *\n\t * Example usage:\n\t *\n\t *     var autolinker = new Autolinker( {\n\t *         urls: true,\n\t *         email: true\n\t *     } );\n\t *\n\t *     var matches = autolinker.parse( \"Hello google.com, I am asdf@asdf.com\" );\n\t *\n\t *     console.log( matches.length );           // 2\n\t *     console.log( matches[ 0 ].getType() );   // 'url'\n\t *     console.log( matches[ 0 ].getUrl() );    // 'google.com'\n\t *     console.log( matches[ 1 ].getType() );   // 'email'\n\t *     console.log( matches[ 1 ].getEmail() );  // 'asdf@asdf.com'\n\t *\n\t * @param {String} textOrHtml The HTML or text to find matches within\n\t *   (depending on if the {@link #urls}, {@link #email}, {@link #phone},\n\t *   {@link #hashtag}, and {@link #mention} options are enabled).\n\t * @return {Autolinker.match.Match[]} The array of Matches found in the\n\t *   given input `textOrHtml`.\n\t */\n\tparse : function( textOrHtml ) {\n\t\tvar htmlParser = this.getHtmlParser(),\n\t\t    htmlNodes = htmlParser.parse( textOrHtml ),\n\t\t    anchorTagStackCount = 0,  // used to only process text around anchor tags, and any inner text/html they may have;\n\t\t    matches = [];\n\n\t\t// Find all matches within the `textOrHtml` (but not matches that are\n\t\t// already nested within <a> tags)\n\t\tfor( var i = 0, len = htmlNodes.length; i < len; i++ ) {\n\t\t\tvar node = htmlNodes[ i ],\n\t\t\t    nodeType = node.getType();\n\n\t\t\tif( nodeType === 'element' && node.getTagName() === 'a' ) {  // Process HTML anchor element nodes in the input `textOrHtml` to find out when we're within an <a> tag\n\t\t\t\tif( !node.isClosing() ) {  // it's the start <a> tag\n\t\t\t\t\tanchorTagStackCount++;\n\t\t\t\t} else {  // it's the end </a> tag\n\t\t\t\t\tanchorTagStackCount = Math.max( anchorTagStackCount - 1, 0 );  // attempt to handle extraneous </a> tags by making sure the stack count never goes below 0\n\t\t\t\t}\n\n\t\t\t} else if( nodeType === 'text' && anchorTagStackCount === 0 ) {  // Process text nodes that are not within an <a> tag\n\t\t\t\tvar textNodeMatches = this.parseText( node.getText(), node.getOffset() );\n\n\t\t\t\tmatches.push.apply( matches, textNodeMatches );\n\t\t\t}\n\t\t}\n\n\n\t\t// After we have found all matches, remove subsequent matches that\n\t\t// overlap with a previous match. This can happen for instance with URLs,\n\t\t// where the url 'google.com/#link' would match '#link' as a hashtag.\n\t\tmatches = this.compactMatches( matches );\n\n\t\t// And finally, remove matches for match types that have been turned\n\t\t// off. We needed to have all match types turned on initially so that\n\t\t// things like hashtags could be filtered out if they were really just\n\t\t// part of a URL match (for instance, as a named anchor).\n\t\tmatches = this.removeUnwantedMatches( matches );\n\n\t\treturn matches;\n\t},\n\n\n\t/**\n\t * After we have found all matches, we need to remove subsequent matches\n\t * that overlap with a previous match. This can happen for instance with\n\t * URLs, where the url 'google.com/#link' would match '#link' as a hashtag.\n\t *\n\t * @private\n\t * @param {Autolinker.match.Match[]} matches\n\t * @return {Autolinker.match.Match[]}\n\t */\n\tcompactMatches : function( matches ) {\n\t\t// First, the matches need to be sorted in order of offset\n\t\tmatches.sort( function( a, b ) { return a.getOffset() - b.getOffset(); } );\n\n\t\tfor( var i = 0; i < matches.length - 1; i++ ) {\n\t\t\tvar match = matches[ i ],\n\t\t\t    endIdx = match.getOffset() + match.getMatchedText().length;\n\n\t\t\t// Remove subsequent matches that overlap with the current match\n\t\t\twhile( i + 1 < matches.length && matches[ i + 1 ].getOffset() <= endIdx ) {\n\t\t\t\tmatches.splice( i + 1, 1 );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\n\t/**\n\t * Removes matches for matchers that were turned off in the options. For\n\t * example, if {@link #hashtag hashtags} were not to be matched, we'll\n\t * remove them from the `matches` array here.\n\t *\n\t * @private\n\t * @param {Autolinker.match.Match[]} matches The array of matches to remove\n\t *   the unwanted matches from. Note: this array is mutated for the\n\t *   removals.\n\t * @return {Autolinker.match.Match[]} The mutated input `matches` array.\n\t */\n\tremoveUnwantedMatches : function( matches ) {\n\t\tvar remove = Autolinker.Util.remove;\n\n\t\tif( !this.hashtag ) remove( matches, function( match ) { return match.getType() === 'hashtag'; } );\n\t\tif( !this.email )   remove( matches, function( match ) { return match.getType() === 'email'; } );\n\t\tif( !this.phone )   remove( matches, function( match ) { return match.getType() === 'phone'; } );\n\t\tif( !this.mention ) remove( matches, function( match ) { return match.getType() === 'mention'; } );\n\t\tif( !this.urls.schemeMatches ) {\n\t\t\tremove( matches, function( m ) { return m.getType() === 'url' && m.getUrlMatchType() === 'scheme'; } );\n\t\t}\n\t\tif( !this.urls.wwwMatches ) {\n\t\t\tremove( matches, function( m ) { return m.getType() === 'url' && m.getUrlMatchType() === 'www'; } );\n\t\t}\n\t\tif( !this.urls.tldMatches ) {\n\t\t\tremove( matches, function( m ) { return m.getType() === 'url' && m.getUrlMatchType() === 'tld'; } );\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\n\t/**\n\t * Parses the input `text` looking for URLs, email addresses, phone\n\t * numbers, username handles, and hashtags (depending on the configuration\n\t * of the Autolinker instance), and returns an array of {@link Autolinker.match.Match}\n\t * objects describing those matches.\n\t *\n\t * This method processes a **non-HTML string**, and is used to parse and\n\t * match within the text nodes of an HTML string. This method is used\n\t * internally by {@link #parse}.\n\t *\n\t * @private\n\t * @param {String} text The text to find matches within (depending on if the\n\t *   {@link #urls}, {@link #email}, {@link #phone},\n\t *   {@link #hashtag}, and {@link #mention} options are enabled). This must be a non-HTML string.\n\t * @param {Number} [offset=0] The offset of the text node within the\n\t *   original string. This is used when parsing with the {@link #parse}\n\t *   method to generate correct offsets within the {@link Autolinker.match.Match}\n\t *   instances, but may be omitted if calling this method publicly.\n\t * @return {Autolinker.match.Match[]} The array of Matches found in the\n\t *   given input `text`.\n\t */\n\tparseText : function( text, offset ) {\n\t\toffset = offset || 0;\n\t\tvar matchers = this.getMatchers(),\n\t\t    matches = [];\n\n\t\tfor( var i = 0, numMatchers = matchers.length; i < numMatchers; i++ ) {\n\t\t\tvar textMatches = matchers[ i ].parseMatches( text );\n\n\t\t\t// Correct the offset of each of the matches. They are originally\n\t\t\t// the offset of the match within the provided text node, but we\n\t\t\t// need to correct them to be relative to the original HTML input\n\t\t\t// string (i.e. the one provided to #parse).\n\t\t\tfor( var j = 0, numTextMatches = textMatches.length; j < numTextMatches; j++ ) {\n\t\t\t\ttextMatches[ j ].setOffset( offset + textMatches[ j ].getOffset() );\n\t\t\t}\n\n\t\t\tmatches.push.apply( matches, textMatches );\n\t\t}\n\t\treturn matches;\n\t},\n\n\n\t/**\n\t * Automatically links URLs, Email addresses, Phone numbers, Hashtags,\n\t * and Mentions (Twitter, Instagram) found in the given chunk of HTML. Does not link\n\t * URLs found within HTML tags.\n\t *\n\t * For instance, if given the text: `You should go to http://www.yahoo.com`,\n\t * then the result will be `You should go to\n\t * &lt;a href=\"http://www.yahoo.com\"&gt;http://www.yahoo.com&lt;/a&gt;`\n\t *\n\t * This method finds the text around any HTML elements in the input\n\t * `textOrHtml`, which will be the text that is processed. Any original HTML\n\t * elements will be left as-is, as well as the text that is already wrapped\n\t * in anchor (&lt;a&gt;) tags.\n\t *\n\t * @param {String} textOrHtml The HTML or text to autolink matches within\n\t *   (depending on if the {@link #urls}, {@link #email}, {@link #phone}, {@link #hashtag}, and {@link #mention} options are enabled).\n\t * @return {String} The HTML, with matches automatically linked.\n\t */\n\tlink : function( textOrHtml ) {\n\t\tif( !textOrHtml ) { return \"\"; }  // handle `null` and `undefined`\n\n\t\tvar matches = this.parse( textOrHtml ),\n\t\t\tnewHtml = [],\n\t\t\tlastIndex = 0;\n\n\t\tfor( var i = 0, len = matches.length; i < len; i++ ) {\n\t\t\tvar match = matches[ i ];\n\n\t\t\tnewHtml.push( textOrHtml.substring( lastIndex, match.getOffset() ) );\n\t\t\tnewHtml.push( this.createMatchReturnVal( match ) );\n\n\t\t\tlastIndex = match.getOffset() + match.getMatchedText().length;\n\t\t}\n\t\tnewHtml.push( textOrHtml.substring( lastIndex ) );  // handle the text after the last match\n\n\t\treturn newHtml.join( '' );\n\t},\n\n\n\t/**\n\t * Creates the return string value for a given match in the input string.\n\t *\n\t * This method handles the {@link #replaceFn}, if one was provided.\n\t *\n\t * @private\n\t * @param {Autolinker.match.Match} match The Match object that represents\n\t *   the match.\n\t * @return {String} The string that the `match` should be replaced with.\n\t *   This is usually the anchor tag string, but may be the `matchStr` itself\n\t *   if the match is not to be replaced.\n\t */\n\tcreateMatchReturnVal : function( match ) {\n\t\t// Handle a custom `replaceFn` being provided\n\t\tvar replaceFnResult;\n\t\tif( this.replaceFn ) {\n\t\t\treplaceFnResult = this.replaceFn.call( this.context, match );  // Autolinker instance is the context\n\t\t}\n\n\t\tif( typeof replaceFnResult === 'string' ) {\n\t\t\treturn replaceFnResult;  // `replaceFn` returned a string, use that\n\n\t\t} else if( replaceFnResult === false ) {\n\t\t\treturn match.getMatchedText();  // no replacement for the match\n\n\t\t} else if( replaceFnResult instanceof Autolinker.HtmlTag ) {\n\t\t\treturn replaceFnResult.toAnchorString();\n\n\t\t} else {  // replaceFnResult === true, or no/unknown return value from function\n\t\t\t// Perform Autolinker's default anchor tag generation\n\t\t\tvar anchorTag = match.buildTag();  // returns an Autolinker.HtmlTag instance\n\n\t\t\treturn anchorTag.toAnchorString();\n\t\t}\n\t},\n\n\n\t/**\n\t * Lazily instantiates and returns the {@link #htmlParser} instance for this\n\t * Autolinker instance.\n\t *\n\t * @protected\n\t * @return {Autolinker.htmlParser.HtmlParser}\n\t */\n\tgetHtmlParser : function() {\n\t\tvar htmlParser = this.htmlParser;\n\n\t\tif( !htmlParser ) {\n\t\t\thtmlParser = this.htmlParser = new Autolinker.htmlParser.HtmlParser();\n\t\t}\n\n\t\treturn htmlParser;\n\t},\n\n\n\t/**\n\t * Lazily instantiates and returns the {@link Autolinker.matcher.Matcher}\n\t * instances for this Autolinker instance.\n\t *\n\t * @protected\n\t * @return {Autolinker.matcher.Matcher[]}\n\t */\n\tgetMatchers : function() {\n\t\tif( !this.matchers ) {\n\t\t\tvar matchersNs = Autolinker.matcher,\n\t\t\t    tagBuilder = this.getTagBuilder();\n\n\t\t\tvar matchers = [\n\t\t\t\tnew matchersNs.Hashtag( { tagBuilder: tagBuilder, serviceName: this.hashtag } ),\n\t\t\t\tnew matchersNs.Email( { tagBuilder: tagBuilder } ),\n\t\t\t\tnew matchersNs.Phone( { tagBuilder: tagBuilder } ),\n\t\t\t\tnew matchersNs.Mention( { tagBuilder: tagBuilder, serviceName: this.mention } ),\n\t\t\t\tnew matchersNs.Url( { tagBuilder: tagBuilder, stripPrefix: this.stripPrefix, stripTrailingSlash: this.stripTrailingSlash } )\n\t\t\t];\n\n\t\t\treturn ( this.matchers = matchers );\n\n\t\t} else {\n\t\t\treturn this.matchers;\n\t\t}\n\t},\n\n\n\t/**\n\t * Returns the {@link #tagBuilder} instance for this Autolinker instance, lazily instantiating it\n\t * if it does not yet exist.\n\t *\n\t * This method may be used in a {@link #replaceFn} to generate the {@link Autolinker.HtmlTag HtmlTag} instance that\n\t * Autolinker would normally generate, and then allow for modifications before returning it. For example:\n\t *\n\t *     var html = Autolinker.link( \"Test google.com\", {\n\t *         replaceFn : function( match ) {\n\t *             var tag = match.buildTag();  // returns an {@link Autolinker.HtmlTag} instance\n\t *             tag.setAttr( 'rel', 'nofollow' );\n\t *\n\t *             return tag;\n\t *         }\n\t *     } );\n\t *\n\t *     // generated html:\n\t *     //   Test <a href=\"http://google.com\" target=\"_blank\" rel=\"nofollow\">google.com</a>\n\t *\n\t * @return {Autolinker.AnchorTagBuilder}\n\t */\n\tgetTagBuilder : function() {\n\t\tvar tagBuilder = this.tagBuilder;\n\n\t\tif( !tagBuilder ) {\n\t\t\ttagBuilder = this.tagBuilder = new Autolinker.AnchorTagBuilder( {\n\t\t\t\tnewWindow   : this.newWindow,\n\t\t\t\ttruncate    : this.truncate,\n\t\t\t\tclassName   : this.className\n\t\t\t} );\n\t\t}\n\n\t\treturn tagBuilder;\n\t}\n\n};\n\n\n// Autolinker Namespaces\n\nAutolinker.match = {};\nAutolinker.matcher = {};\nAutolinker.htmlParser = {};\nAutolinker.truncate = {};\n\n/*global Autolinker */\n/*jshint eqnull:true, boss:true */\n/**\n * @class Autolinker.Util\n * @singleton\n *\n * A few utility methods for Autolinker.\n */\nAutolinker.Util = {\n\n\t/**\n\t * @property {Function} abstractMethod\n\t *\n\t * A function object which represents an abstract method.\n\t */\n\tabstractMethod : function() { throw \"abstract\"; },\n\n\n\t/**\n\t * @private\n\t * @property {RegExp} trimRegex\n\t *\n\t * The regular expression used to trim the leading and trailing whitespace\n\t * from a string.\n\t */\n\ttrimRegex : /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\n\t/**\n\t * Assigns (shallow copies) the properties of `src` onto `dest`.\n\t *\n\t * @param {Object} dest The destination object.\n\t * @param {Object} src The source object.\n\t * @return {Object} The destination object (`dest`)\n\t */\n\tassign : function( dest, src ) {\n\t\tfor( var prop in src ) {\n\t\t\tif( src.hasOwnProperty( prop ) ) {\n\t\t\t\tdest[ prop ] = src[ prop ];\n\t\t\t}\n\t\t}\n\n\t\treturn dest;\n\t},\n\n\n\t/**\n\t * Assigns (shallow copies) the properties of `src` onto `dest`, if the\n\t * corresponding property on `dest` === `undefined`.\n\t *\n\t * @param {Object} dest The destination object.\n\t * @param {Object} src The source object.\n\t * @return {Object} The destination object (`dest`)\n\t */\n\tdefaults : function( dest, src ) {\n\t\tfor( var prop in src ) {\n\t\t\tif( src.hasOwnProperty( prop ) && dest[ prop ] === undefined ) {\n\t\t\t\tdest[ prop ] = src[ prop ];\n\t\t\t}\n\t\t}\n\n\t\treturn dest;\n\t},\n\n\n\t/**\n\t * Extends `superclass` to create a new subclass, adding the `protoProps` to the new subclass's prototype.\n\t *\n\t * @param {Function} superclass The constructor function for the superclass.\n\t * @param {Object} protoProps The methods/properties to add to the subclass's prototype. This may contain the\n\t *   special property `constructor`, which will be used as the new subclass's constructor function.\n\t * @return {Function} The new subclass function.\n\t */\n\textend : function( superclass, protoProps ) {\n\t\tvar superclassProto = superclass.prototype;\n\n\t\tvar F = function() {};\n\t\tF.prototype = superclassProto;\n\n\t\tvar subclass;\n\t\tif( protoProps.hasOwnProperty( 'constructor' ) ) {\n\t\t\tsubclass = protoProps.constructor;\n\t\t} else {\n\t\t\tsubclass = function() { superclassProto.constructor.apply( this, arguments ); };\n\t\t}\n\n\t\tvar subclassProto = subclass.prototype = new F();  // set up prototype chain\n\t\tsubclassProto.constructor = subclass;  // fix constructor property\n\t\tsubclassProto.superclass = superclassProto;\n\n\t\tdelete protoProps.constructor;  // don't re-assign constructor property to the prototype, since a new function may have been created (`subclass`), which is now already there\n\t\tAutolinker.Util.assign( subclassProto, protoProps );\n\n\t\treturn subclass;\n\t},\n\n\n\t/**\n\t * Truncates the `str` at `len - ellipsisChars.length`, and adds the `ellipsisChars` to the\n\t * end of the string (by default, two periods: '..'). If the `str` length does not exceed\n\t * `len`, the string will be returned unchanged.\n\t *\n\t * @param {String} str The string to truncate and add an ellipsis to.\n\t * @param {Number} truncateLen The length to truncate the string at.\n\t * @param {String} [ellipsisChars=...] The ellipsis character(s) to add to the end of `str`\n\t *   when truncated. Defaults to '...'\n\t */\n\tellipsis : function( str, truncateLen, ellipsisChars ) {\n\t\tvar ellipsisLength;\n\n\t\tif( str.length > truncateLen ) {\n\t\t\tif(ellipsisChars == null) {\n\t\t\t  ellipsisChars = '&hellip;';\n\t\t\t  ellipsisLength = 3;\n\t\t\t} else {\n\t\t\t  ellipsisLength = ellipsisChars.length;\n\t\t\t}\n\n\t\t\tstr = str.substring( 0, truncateLen - ellipsisLength ) + ellipsisChars;\n\t\t}\n\t\treturn str;\n\t},\n\n\n\t/**\n\t * Supports `Array.prototype.indexOf()` functionality for old IE (IE8 and below).\n\t *\n\t * @param {Array} arr The array to find an element of.\n\t * @param {*} element The element to find in the array, and return the index of.\n\t * @return {Number} The index of the `element`, or -1 if it was not found.\n\t */\n\tindexOf : function( arr, element ) {\n\t\tif( Array.prototype.indexOf ) {\n\t\t\treturn arr.indexOf( element );\n\n\t\t} else {\n\t\t\tfor( var i = 0, len = arr.length; i < len; i++ ) {\n\t\t\t\tif( arr[ i ] === element ) return i;\n\t\t\t}\n\t\t\treturn -1;\n\t\t}\n\t},\n\n\n\t/**\n\t * Removes array elements based on a filtering function. Mutates the input\n\t * array.\n\t *\n\t * Using this instead of the ES5 Array.prototype.filter() function, to allow\n\t * Autolinker compatibility with IE8, and also to prevent creating many new\n\t * arrays in memory for filtering.\n\t *\n\t * @param {Array} arr The array to remove elements from. This array is\n\t *   mutated.\n\t * @param {Function} fn A function which should return `true` to\n\t *   remove an element.\n\t * @return {Array} The mutated input `arr`.\n\t */\n\tremove : function( arr, fn ) {\n\t\tfor( var i = arr.length - 1; i >= 0; i-- ) {\n\t\t\tif( fn( arr[ i ] ) === true ) {\n\t\t\t\tarr.splice( i, 1 );\n\t\t\t}\n\t\t}\n\t},\n\n\n\t/**\n\t * Performs the functionality of what modern browsers do when `String.prototype.split()` is called\n\t * with a regular expression that contains capturing parenthesis.\n\t *\n\t * For example:\n\t *\n\t *     // Modern browsers:\n\t *     \"a,b,c\".split( /(,)/ );  // --> [ 'a', ',', 'b', ',', 'c' ]\n\t *\n\t *     // Old IE (including IE8):\n\t *     \"a,b,c\".split( /(,)/ );  // --> [ 'a', 'b', 'c' ]\n\t *\n\t * This method emulates the functionality of modern browsers for the old IE case.\n\t *\n\t * @param {String} str The string to split.\n\t * @param {RegExp} splitRegex The regular expression to split the input `str` on. The splitting\n\t *   character(s) will be spliced into the array, as in the \"modern browsers\" example in the\n\t *   description of this method.\n\t *   Note #1: the supplied regular expression **must** have the 'g' flag specified.\n\t *   Note #2: for simplicity's sake, the regular expression does not need\n\t *   to contain capturing parenthesis - it will be assumed that any match has them.\n\t * @return {String[]} The split array of strings, with the splitting character(s) included.\n\t */\n\tsplitAndCapture : function( str, splitRegex ) {\n\t\tif( !splitRegex.global ) throw new Error( \"`splitRegex` must have the 'g' flag set\" );\n\n\t\tvar result = [],\n\t\t    lastIdx = 0,\n\t\t    match;\n\n\t\twhile( match = splitRegex.exec( str ) ) {\n\t\t\tresult.push( str.substring( lastIdx, match.index ) );\n\t\t\tresult.push( match[ 0 ] );  // push the splitting char(s)\n\n\t\t\tlastIdx = match.index + match[ 0 ].length;\n\t\t}\n\t\tresult.push( str.substring( lastIdx ) );\n\n\t\treturn result;\n\t},\n\n\n\t/**\n\t * Trims the leading and trailing whitespace from a string.\n\t *\n\t * @param {String} str The string to trim.\n\t * @return {String}\n\t */\n\ttrim : function( str ) {\n\t\treturn str.replace( this.trimRegex, '' );\n\t}\n\n};\n\n/*global Autolinker */\n/*jshint boss:true */\n/**\n * @class Autolinker.HtmlTag\n * @extends Object\n *\n * Represents an HTML tag, which can be used to easily build/modify HTML tags programmatically.\n *\n * Autolinker uses this abstraction to create HTML tags, and then write them out as strings. You may also use\n * this class in your code, especially within a {@link Autolinker#replaceFn replaceFn}.\n *\n * ## Examples\n *\n * Example instantiation:\n *\n *     var tag = new Autolinker.HtmlTag( {\n *         tagName : 'a',\n *         attrs   : { 'href': 'http://google.com', 'class': 'external-link' },\n *         innerHtml : 'Google'\n *     } );\n *\n *     tag.toAnchorString();  // <a href=\"http://google.com\" class=\"external-link\">Google</a>\n *\n *     // Individual accessor methods\n *     tag.getTagName();                 // 'a'\n *     tag.getAttr( 'href' );            // 'http://google.com'\n *     tag.hasClass( 'external-link' );  // true\n *\n *\n * Using mutator methods (which may be used in combination with instantiation config properties):\n *\n *     var tag = new Autolinker.HtmlTag();\n *     tag.setTagName( 'a' );\n *     tag.setAttr( 'href', 'http://google.com' );\n *     tag.addClass( 'external-link' );\n *     tag.setInnerHtml( 'Google' );\n *\n *     tag.getTagName();                 // 'a'\n *     tag.getAttr( 'href' );            // 'http://google.com'\n *     tag.hasClass( 'external-link' );  // true\n *\n *     tag.toAnchorString();  // <a href=\"http://google.com\" class=\"external-link\">Google</a>\n *\n *\n * ## Example use within a {@link Autolinker#replaceFn replaceFn}\n *\n *     var html = Autolinker.link( \"Test google.com\", {\n *         replaceFn : function( match ) {\n *             var tag = match.buildTag();  // returns an {@link Autolinker.HtmlTag} instance, configured with the Match's href and anchor text\n *             tag.setAttr( 'rel', 'nofollow' );\n *\n *             return tag;\n *         }\n *     } );\n *\n *     // generated html:\n *     //   Test <a href=\"http://google.com\" target=\"_blank\" rel=\"nofollow\">google.com</a>\n *\n *\n * ## Example use with a new tag for the replacement\n *\n *     var html = Autolinker.link( \"Test google.com\", {\n *         replaceFn : function( match ) {\n *             var tag = new Autolinker.HtmlTag( {\n *                 tagName : 'button',\n *                 attrs   : { 'title': 'Load URL: ' + match.getAnchorHref() },\n *                 innerHtml : 'Load URL: ' + match.getAnchorText()\n *             } );\n *\n *             return tag;\n *         }\n *     } );\n *\n *     // generated html:\n *     //   Test <button title=\"Load URL: http://google.com\">Load URL: google.com</button>\n */\nAutolinker.HtmlTag = Autolinker.Util.extend( Object, {\n\n\t/**\n\t * @cfg {String} tagName\n\t *\n\t * The tag name. Ex: 'a', 'button', etc.\n\t *\n\t * Not required at instantiation time, but should be set using {@link #setTagName} before {@link #toAnchorString}\n\t * is executed.\n\t */\n\n\t/**\n\t * @cfg {Object.<String, String>} attrs\n\t *\n\t * An key/value Object (map) of attributes to create the tag with. The keys are the attribute names, and the\n\t * values are the attribute values.\n\t */\n\n\t/**\n\t * @cfg {String} innerHtml\n\t *\n\t * The inner HTML for the tag.\n\t *\n\t * Note the camel case name on `innerHtml`. Acronyms are camelCased in this utility (such as not to run into the acronym\n\t * naming inconsistency that the DOM developers created with `XMLHttpRequest`). You may alternatively use {@link #innerHTML}\n\t * if you prefer, but this one is recommended.\n\t */\n\n\t/**\n\t * @cfg {String} innerHTML\n\t *\n\t * Alias of {@link #innerHtml}, accepted for consistency with the browser DOM api, but prefer the camelCased version\n\t * for acronym names.\n\t */\n\n\n\t/**\n\t * @protected\n\t * @property {RegExp} whitespaceRegex\n\t *\n\t * Regular expression used to match whitespace in a string of CSS classes.\n\t */\n\twhitespaceRegex : /\\s+/,\n\n\n\t/**\n\t * @constructor\n\t * @param {Object} [cfg] The configuration properties for this class, in an Object (map)\n\t */\n\tconstructor : function( cfg ) {\n\t\tAutolinker.Util.assign( this, cfg );\n\n\t\tthis.innerHtml = this.innerHtml || this.innerHTML;  // accept either the camelCased form or the fully capitalized acronym\n\t},\n\n\n\t/**\n\t * Sets the tag name that will be used to generate the tag with.\n\t *\n\t * @param {String} tagName\n\t * @return {Autolinker.HtmlTag} This HtmlTag instance, so that method calls may be chained.\n\t */\n\tsetTagName : function( tagName ) {\n\t\tthis.tagName = tagName;\n\t\treturn this;\n\t},\n\n\n\t/**\n\t * Retrieves the tag name.\n\t *\n\t * @return {String}\n\t */\n\tgetTagName : function() {\n\t\treturn this.tagName || \"\";\n\t},\n\n\n\t/**\n\t * Sets an attribute on the HtmlTag.\n\t *\n\t * @param {String} attrName The attribute name to set.\n\t * @param {String} attrValue The attribute value to set.\n\t * @return {Autolinker.HtmlTag} This HtmlTag instance, so that method calls may be chained.\n\t */\n\tsetAttr : function( attrName, attrValue ) {\n\t\tvar tagAttrs = this.getAttrs();\n\t\ttagAttrs[ attrName ] = attrValue;\n\n\t\treturn this;\n\t},\n\n\n\t/**\n\t * Retrieves an attribute from the HtmlTag. If the attribute does not exist, returns `undefined`.\n\t *\n\t * @param {String} attrName The attribute name to retrieve.\n\t * @return {String} The attribute's value, or `undefined` if it does not exist on the HtmlTag.\n\t */\n\tgetAttr : function( attrName ) {\n\t\treturn this.getAttrs()[ attrName ];\n\t},\n\n\n\t/**\n\t * Sets one or more attributes on the HtmlTag.\n\t *\n\t * @param {Object.<String, String>} attrs A key/value Object (map) of the attributes to set.\n\t * @return {Autolinker.HtmlTag} This HtmlTag instance, so that method calls may be chained.\n\t */\n\tsetAttrs : function( attrs ) {\n\t\tvar tagAttrs = this.getAttrs();\n\t\tAutolinker.Util.assign( tagAttrs, attrs );\n\n\t\treturn this;\n\t},\n\n\n\t/**\n\t * Retrieves the attributes Object (map) for the HtmlTag.\n\t *\n\t * @return {Object.<String, String>} A key/value object of the attributes for the HtmlTag.\n\t */\n\tgetAttrs : function() {\n\t\treturn this.attrs || ( this.attrs = {} );\n\t},\n\n\n\t/**\n\t * Sets the provided `cssClass`, overwriting any current CSS classes on the HtmlTag.\n\t *\n\t * @param {String} cssClass One or more space-separated CSS classes to set (overwrite).\n\t * @return {Autolinker.HtmlTag} This HtmlTag instance, so that method calls may be chained.\n\t */\n\tsetClass : function( cssClass ) {\n\t\treturn this.setAttr( 'class', cssClass );\n\t},\n\n\n\t/**\n\t * Convenience method to add one or more CSS classes to the HtmlTag. Will not add duplicate CSS classes.\n\t *\n\t * @param {String} cssClass One or more space-separated CSS classes to add.\n\t * @return {Autolinker.HtmlTag} This HtmlTag instance, so that method calls may be chained.\n\t */\n\taddClass : function( cssClass ) {\n\t\tvar classAttr = this.getClass(),\n\t\t    whitespaceRegex = this.whitespaceRegex,\n\t\t    indexOf = Autolinker.Util.indexOf,  // to support IE8 and below\n\t\t    classes = ( !classAttr ) ? [] : classAttr.split( whitespaceRegex ),\n\t\t    newClasses = cssClass.split( whitespaceRegex ),\n\t\t    newClass;\n\n\t\twhile( newClass = newClasses.shift() ) {\n\t\t\tif( indexOf( classes, newClass ) === -1 ) {\n\t\t\t\tclasses.push( newClass );\n\t\t\t}\n\t\t}\n\n\t\tthis.getAttrs()[ 'class' ] = classes.join( \" \" );\n\t\treturn this;\n\t},\n\n\n\t/**\n\t * Convenience method to remove one or more CSS classes from the HtmlTag.\n\t *\n\t * @param {String} cssClass One or more space-separated CSS classes to remove.\n\t * @return {Autolinker.HtmlTag} This HtmlTag instance, so that method calls may be chained.\n\t */\n\tremoveClass : function( cssClass ) {\n\t\tvar classAttr = this.getClass(),\n\t\t    whitespaceRegex = this.whitespaceRegex,\n\t\t    indexOf = Autolinker.Util.indexOf,  // to support IE8 and below\n\t\t    classes = ( !classAttr ) ? [] : classAttr.split( whitespaceRegex ),\n\t\t    removeClasses = cssClass.split( whitespaceRegex ),\n\t\t    removeClass;\n\n\t\twhile( classes.length && ( removeClass = removeClasses.shift() ) ) {\n\t\t\tvar idx = indexOf( classes, removeClass );\n\t\t\tif( idx !== -1 ) {\n\t\t\t\tclasses.splice( idx, 1 );\n\t\t\t}\n\t\t}\n\n\t\tthis.getAttrs()[ 'class' ] = classes.join( \" \" );\n\t\treturn this;\n\t},\n\n\n\t/**\n\t * Convenience method to retrieve the CSS class(es) for the HtmlTag, which will each be separated by spaces when\n\t * there are multiple.\n\t *\n\t * @return {String}\n\t */\n\tgetClass : function() {\n\t\treturn this.getAttrs()[ 'class' ] || \"\";\n\t},\n\n\n\t/**\n\t * Convenience method to check if the tag has a CSS class or not.\n\t *\n\t * @param {String} cssClass The CSS class to check for.\n\t * @return {Boolean} `true` if the HtmlTag has the CSS class, `false` otherwise.\n\t */\n\thasClass : function( cssClass ) {\n\t\treturn ( ' ' + this.getClass() + ' ' ).indexOf( ' ' + cssClass + ' ' ) !== -1;\n\t},\n\n\n\t/**\n\t * Sets the inner HTML for the tag.\n\t *\n\t * @param {String} html The inner HTML to set.\n\t * @return {Autolinker.HtmlTag} This HtmlTag instance, so that method calls may be chained.\n\t */\n\tsetInnerHtml : function( html ) {\n\t\tthis.innerHtml = html;\n\n\t\treturn this;\n\t},\n\n\n\t/**\n\t * Retrieves the inner HTML for the tag.\n\t *\n\t * @return {String}\n\t */\n\tgetInnerHtml : function() {\n\t\treturn this.innerHtml || \"\";\n\t},\n\n\n\t/**\n\t * Override of superclass method used to generate the HTML string for the tag.\n\t *\n\t * @return {String}\n\t */\n\ttoAnchorString : function() {\n\t\tvar tagName = this.getTagName(),\n\t\t    attrsStr = this.buildAttrsStr();\n\n\t\tattrsStr = ( attrsStr ) ? ' ' + attrsStr : '';  // prepend a space if there are actually attributes\n\n\t\treturn [ '<', tagName, attrsStr, '>', this.getInnerHtml(), '</', tagName, '>' ].join( \"\" );\n\t},\n\n\n\t/**\n\t * Support method for {@link #toAnchorString}, returns the string space-separated key=\"value\" pairs, used to populate\n\t * the stringified HtmlTag.\n\t *\n\t * @protected\n\t * @return {String} Example return: `attr1=\"value1\" attr2=\"value2\"`\n\t */\n\tbuildAttrsStr : function() {\n\t\tif( !this.attrs ) return \"\";  // no `attrs` Object (map) has been set, return empty string\n\n\t\tvar attrs = this.getAttrs(),\n\t\t    attrsArr = [];\n\n\t\tfor( var prop in attrs ) {\n\t\t\tif( attrs.hasOwnProperty( prop ) ) {\n\t\t\t\tattrsArr.push( prop + '=\"' + attrs[ prop ] + '\"' );\n\t\t\t}\n\t\t}\n\t\treturn attrsArr.join( \" \" );\n\t}\n\n} );\n\n/*global Autolinker */\n/**\n * @class Autolinker.RegexLib\n * @singleton\n *\n * Builds and stores a library of the common regular expressions used by the\n * Autolinker utility.\n *\n * Other regular expressions may exist ad-hoc, but these are generally the\n * regular expressions that are shared between source files.\n */\nAutolinker.RegexLib = (function() {\n\n\t/**\n\t * The string form of a regular expression that would match all of the\n\t * alphabetic (\"letter\") chars in the unicode character set when placed in a\n\t * RegExp character class (`[]`). This includes all international alphabetic\n\t * characters.\n\t *\n\t * These would be the characters matched by unicode regex engines `\\p{L}`\n\t * escape (\"all letters\").\n\t *\n\t * Taken from the XRegExp library: http://xregexp.com/\n\t * Specifically: http://xregexp.com/v/3.0.0/unicode-categories.js\n\t *\n\t * @private\n\t * @type {String}\n\t */\n\tvar alphaCharsStr = 'A-Za-z\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AD\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC';\n\n\t/**\n\t * The string form of a regular expression that would match all of the\n\t * decimal number chars in the unicode character set when placed in a RegExp\n\t * character class (`[]`).\n\t *\n\t * These would be the characters matched by unicode regex engines `\\p{Nd}`\n\t * escape (\"all decimal numbers\")\n\t *\n\t * Taken from the XRegExp library: http://xregexp.com/\n\t * Specifically: http://xregexp.com/v/3.0.0/unicode-categories.js\n\t *\n\t * @private\n\t * @type {String}\n\t */\n\tvar decimalNumbersStr = '0-9\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19';\n\n\n\t// See documentation below\n\tvar alphaNumericCharsStr = alphaCharsStr + decimalNumbersStr;\n\n\n\t// See documentation below\n\tvar domainNameRegex = new RegExp( '[' + alphaNumericCharsStr + '.\\\\-]*[' + alphaNumericCharsStr + '\\\\-]' );\n\n\n\t// See documentation below\n\tvar tldRegex = /(?:travelersinsurance|sandvikcoromant|kerryproperties|cancerresearch|weatherchannel|kerrylogistics|spreadbetting|international|wolterskluwer|lifeinsurance|construction|pamperedchef|scholarships|versicherung|bridgestone|creditunion|kerryhotels|investments|productions|blackfriday|enterprises|lamborghini|photography|motorcycles|williamhill|playstation|contractors|barclaycard|accountants|redumbrella|engineering|management|telefonica|protection|consulting|tatamotors|creditcard|vlaanderen|schaeffler|associates|properties|foundation|republican|bnpparibas|boehringer|eurovision|extraspace|industries|immobilien|university|technology|volkswagen|healthcare|restaurant|cuisinella|vistaprint|apartments|accountant|travelers|homedepot|institute|vacations|furniture|fresenius|insurance|christmas|bloomberg|solutions|barcelona|firestone|financial|kuokgroup|fairwinds|community|passagens|goldpoint|equipment|lifestyle|yodobashi|aquarelle|marketing|analytics|education|amsterdam|statefarm|melbourne|allfinanz|directory|microsoft|stockholm|montblanc|accenture|lancaster|landrover|everbank|istanbul|graphics|grainger|ipiranga|softbank|attorney|pharmacy|saarland|catering|airforce|yokohama|mortgage|frontier|mutuelle|stcgroup|memorial|pictures|football|symantec|cipriani|ventures|telecity|cityeats|verisign|flsmidth|boutique|cleaning|firmdale|clinique|clothing|redstone|infiniti|deloitte|feedback|services|broadway|plumbing|commbank|training|barclays|exchange|computer|brussels|software|delivery|barefoot|builders|business|bargains|engineer|holdings|download|security|helsinki|lighting|movistar|discount|hdfcbank|supplies|marriott|property|diamonds|capetown|partners|democrat|jpmorgan|bradesco|budapest|rexroth|zuerich|shriram|academy|science|support|youtube|singles|surgery|alibaba|statoil|dentist|schwarz|android|cruises|cricket|digital|markets|starhub|systems|courses|coupons|netbank|country|domains|corsica|network|neustar|realtor|lincoln|limited|schmidt|yamaxun|cooking|contact|auction|spiegel|liaison|leclerc|latrobe|lasalle|abogado|compare|lanxess|exposed|express|company|cologne|college|avianca|lacaixa|fashion|recipes|ferrero|komatsu|storage|wanggou|clubmed|sandvik|fishing|fitness|bauhaus|kitchen|flights|florist|flowers|watches|weather|temasek|samsung|bentley|forsale|channel|theater|frogans|theatre|okinawa|website|tickets|jewelry|gallery|tiffany|iselect|shiksha|brother|organic|wedding|genting|toshiba|origins|philips|hyundai|hotmail|hoteles|hosting|rentals|windows|cartier|bugatti|holiday|careers|whoswho|hitachi|panerai|caravan|reviews|guitars|capital|trading|hamburg|hangout|finance|stream|family|abbott|health|review|travel|report|hermes|hiphop|gratis|career|toyota|hockey|dating|repair|google|social|soccer|reisen|global|otsuka|giving|unicom|casino|photos|center|broker|rocher|orange|bostik|garden|insure|ryukyu|bharti|safety|physio|sakura|oracle|online|jaguar|gallup|piaget|tienda|futbol|pictet|joburg|webcam|berlin|office|juegos|kaufen|chanel|chrome|xihuan|church|tennis|circle|kinder|flickr|bayern|claims|clinic|viajes|nowruz|xperia|norton|yachts|studio|coffee|camera|sanofi|nissan|author|expert|events|comsec|lawyer|tattoo|viking|estate|villas|condos|realty|yandex|energy|emerck|virgin|vision|durban|living|school|coupon|london|taobao|natura|taipei|nagoya|luxury|walter|aramco|sydney|madrid|credit|maison|makeup|schule|market|anquan|direct|design|swatch|suzuki|alsace|vuelos|dental|alipay|voyage|shouji|voting|airtel|mutual|degree|supply|agency|museum|mobily|dealer|monash|select|mormon|active|moscow|racing|datsun|quebec|nissay|rodeo|email|gifts|works|photo|chloe|edeka|cheap|earth|vista|tushu|koeln|glass|shoes|globo|tunes|gmail|nokia|space|kyoto|black|ricoh|seven|lamer|sener|epson|cisco|praxi|trust|citic|crown|shell|lease|green|legal|lexus|ninja|tatar|gripe|nikon|group|video|wales|autos|gucci|party|nexus|guide|linde|adult|parts|amica|lixil|boats|azure|loans|locus|cymru|lotte|lotto|stada|click|poker|quest|dabur|lupin|nadex|paris|faith|dance|canon|place|gives|trade|skype|rocks|mango|cloud|boots|smile|final|swiss|homes|honda|media|horse|cards|deals|watch|bosch|house|pizza|miami|osaka|tours|total|xerox|coach|sucks|style|delta|toray|iinet|tools|money|codes|beats|tokyo|salon|archi|movie|baidu|study|actor|yahoo|store|apple|world|forex|today|bible|tmall|tirol|irish|tires|forum|reise|vegas|vodka|sharp|omega|weber|jetzt|audio|promo|build|bingo|chase|gallo|drive|dubai|rehab|press|solar|sale|beer|bbva|bank|band|auto|sapo|sarl|saxo|audi|asia|arte|arpa|army|yoga|ally|zara|scor|scot|sexy|seat|zero|seek|aero|adac|zone|aarp|maif|meet|meme|menu|surf|mini|mobi|mtpc|porn|desi|star|ltda|name|talk|navy|love|loan|live|link|news|limo|like|spot|life|nico|lidl|lgbt|land|taxi|team|tech|kred|kpmg|sony|song|kiwi|kddi|jprs|jobs|sohu|java|itau|tips|info|immo|icbc|hsbc|town|host|page|toys|here|help|pars|haus|guru|guge|tube|goog|golf|gold|sncf|gmbh|gift|ggee|gent|gbiz|game|vana|pics|fund|ford|ping|pink|fish|film|fast|farm|play|fans|fail|plus|skin|pohl|fage|moda|post|erni|dvag|prod|doha|prof|docs|viva|diet|luxe|site|dell|sina|dclk|show|qpon|date|vote|cyou|voto|read|coop|cool|wang|club|city|chat|cern|cash|reit|rent|casa|cars|care|camp|rest|call|cafe|weir|wien|rich|wiki|buzz|wine|book|bond|room|work|rsvp|shia|ruhr|blue|bing|shaw|bike|safe|xbox|best|pwc|mtn|lds|aig|boo|fyi|nra|nrw|ntt|car|gal|obi|zip|aeg|vin|how|one|ong|onl|dad|ooo|bet|esq|org|htc|bar|uol|ibm|ovh|gdn|ice|icu|uno|gea|ifm|bot|top|wtf|lol|day|pet|eus|wtc|ubs|tvs|aco|ing|ltd|ink|tab|abb|afl|cat|int|pid|pin|bid|cba|gle|com|cbn|ads|man|wed|ceb|gmo|sky|ist|gmx|tui|mba|fan|ski|iwc|app|pro|med|ceo|jcb|jcp|goo|dev|men|aaa|meo|pub|jlc|bom|jll|gop|jmp|mil|got|gov|win|jot|mma|joy|trv|red|cfa|cfd|bio|moe|moi|mom|ren|biz|aws|xin|bbc|dnp|buy|kfh|mov|thd|xyz|fit|kia|rio|rip|kim|dog|vet|nyc|bcg|mtr|bcn|bms|bmw|run|bzh|rwe|tel|stc|axa|kpn|fly|krd|cab|bnl|foo|crs|eat|tci|sap|srl|nec|sas|net|cal|sbs|sfr|sca|scb|csc|edu|new|xxx|hiv|fox|wme|ngo|nhk|vip|sex|frl|lat|yun|law|you|tax|soy|sew|om|ac|hu|se|sc|sg|sh|sb|sa|rw|ru|rs|ro|re|qa|py|si|pw|pt|ps|sj|sk|pr|pn|pm|pl|sl|sm|pk|sn|ph|so|pg|pf|pe|pa|zw|nz|nu|nr|np|no|nl|ni|ng|nf|sr|ne|st|nc|na|mz|my|mx|mw|mv|mu|mt|ms|mr|mq|mp|mo|su|mn|mm|ml|mk|mh|mg|me|sv|md|mc|sx|sy|ma|ly|lv|sz|lu|lt|ls|lr|lk|li|lc|lb|la|tc|kz|td|ky|kw|kr|kp|kn|km|ki|kh|tf|tg|th|kg|ke|jp|jo|jm|je|it|is|ir|tj|tk|tl|tm|iq|tn|to|io|in|im|il|ie|ad|sd|ht|hr|hn|hm|tr|hk|gy|gw|gu|gt|gs|gr|gq|tt|gp|gn|gm|gl|tv|gi|tw|tz|ua|gh|ug|uk|gg|gf|ge|gd|us|uy|uz|va|gb|ga|vc|ve|fr|fo|fm|fk|fj|vg|vi|fi|eu|et|es|er|eg|ee|ec|dz|do|dm|dk|vn|dj|de|cz|cy|cx|cw|vu|cv|cu|cr|co|cn|cm|cl|ck|ci|ch|cg|cf|cd|cc|ca|wf|bz|by|bw|bv|bt|bs|br|bo|bn|bm|bj|bi|ws|bh|bg|bf|be|bd|bb|ba|az|ax|aw|au|at|as|ye|ar|aq|ao|am|al|yt|ai|za|ag|af|ae|zm|id)\\b/;\n\n\n\treturn {\n\n\t\t/**\n\t\t * The string form of a regular expression that would match all of the\n\t\t * letters and decimal number chars in the unicode character set when placed\n\t\t * in a RegExp character class (`[]`).\n\t\t *\n\t\t * These would be the characters matched by unicode regex engines `[\\p{L}\\p{Nd}]`\n\t\t * escape (\"all letters and decimal numbers\")\n\t\t *\n\t\t * @property {String} alphaNumericCharsStr\n\t\t */\n\t\talphaNumericCharsStr : alphaNumericCharsStr,\n\n\t\t/**\n\t\t * A regular expression to match domain names of a URL or email address.\n\t\t * Ex: 'google', 'yahoo', 'some-other-company', etc.\n\t\t *\n\t\t * @property {RegExp} domainNameRegex\n\t\t */\n\t\tdomainNameRegex : domainNameRegex,\n\n\t\t/**\n\t\t * A regular expression to match top level domains (TLDs) for a URL or\n\t\t * email address. Ex: 'com', 'org', 'net', etc.\n\t\t *\n\t\t * @property {RegExp} tldRegex\n\t\t */\n\t\ttldRegex : tldRegex\n\n\t};\n\n\n}() );\n/*global Autolinker */\n/*jshint sub:true */\n/**\n * @protected\n * @class Autolinker.AnchorTagBuilder\n * @extends Object\n *\n * Builds anchor (&lt;a&gt;) tags for the Autolinker utility when a match is\n * found.\n *\n * Normally this class is instantiated, configured, and used internally by an\n * {@link Autolinker} instance, but may actually be used indirectly in a\n * {@link Autolinker#replaceFn replaceFn} to create {@link Autolinker.HtmlTag HtmlTag}\n * instances which may be modified before returning from the\n * {@link Autolinker#replaceFn replaceFn}. For example:\n *\n *     var html = Autolinker.link( \"Test google.com\", {\n *         replaceFn : function( match ) {\n *             var tag = match.buildTag();  // returns an {@link Autolinker.HtmlTag} instance\n *             tag.setAttr( 'rel', 'nofollow' );\n *\n *             return tag;\n *         }\n *     } );\n *\n *     // generated html:\n *     //   Test <a href=\"http://google.com\" target=\"_blank\" rel=\"nofollow\">google.com</a>\n */\nAutolinker.AnchorTagBuilder = Autolinker.Util.extend( Object, {\n\n\t/**\n\t * @cfg {Boolean} newWindow\n\t * @inheritdoc Autolinker#newWindow\n\t */\n\n\t/**\n\t * @cfg {Object} truncate\n\t * @inheritdoc Autolinker#truncate\n\t */\n\n\t/**\n\t * @cfg {String} className\n\t * @inheritdoc Autolinker#className\n\t */\n\n\n\t/**\n\t * @constructor\n\t * @param {Object} [cfg] The configuration options for the AnchorTagBuilder instance, specified in an Object (map).\n\t */\n\tconstructor : function( cfg ) {\n\t\tcfg = cfg || {};\n\n\t\tthis.newWindow = cfg.newWindow;\n\t\tthis.truncate = cfg.truncate;\n\t\tthis.className = cfg.className;\n\t},\n\n\n\t/**\n\t * Generates the actual anchor (&lt;a&gt;) tag to use in place of the\n\t * matched text, via its `match` object.\n\t *\n\t * @param {Autolinker.match.Match} match The Match instance to generate an\n\t *   anchor tag from.\n\t * @return {Autolinker.HtmlTag} The HtmlTag instance for the anchor tag.\n\t */\n\tbuild : function( match ) {\n\t\treturn new Autolinker.HtmlTag( {\n\t\t\ttagName   : 'a',\n\t\t\tattrs     : this.createAttrs( match ),\n\t\t\tinnerHtml : this.processAnchorText( match.getAnchorText() )\n\t\t} );\n\t},\n\n\n\t/**\n\t * Creates the Object (map) of the HTML attributes for the anchor (&lt;a&gt;)\n\t *   tag being generated.\n\t *\n\t * @protected\n\t * @param {Autolinker.match.Match} match The Match instance to generate an\n\t *   anchor tag from.\n\t * @return {Object} A key/value Object (map) of the anchor tag's attributes.\n\t */\n\tcreateAttrs : function( match ) {\n\t\tvar attrs = {\n\t\t\t'href' : match.getAnchorHref()  // we'll always have the `href` attribute\n\t\t};\n\n\t\tvar cssClass = this.createCssClass( match );\n\t\tif( cssClass ) {\n\t\t\tattrs[ 'class' ] = cssClass;\n\t\t}\n\t\tif( this.newWindow ) {\n\t\t\tattrs[ 'target' ] = \"_blank\";\n\t\t\tattrs[ 'rel' ] = \"noopener noreferrer\";\n\t\t}\n\n\t\tif( this.truncate ) {\n\t\t\tif( this.truncate.length && this.truncate.length < match.getAnchorText().length ) {\n\t\t\t\tattrs[ 'title' ] = match.getAnchorHref();\n\t\t\t}\n\t\t}\n\n\t\treturn attrs;\n\t},\n\n\n\t/**\n\t * Creates the CSS class that will be used for a given anchor tag, based on\n\t * the `matchType` and the {@link #className} config.\n\t *\n\t * Example returns:\n\t *\n\t * - \"\"                                      // no {@link #className}\n\t * - \"myLink myLink-url\"                     // url match\n\t * - \"myLink myLink-email\"                   // email match\n\t * - \"myLink myLink-phone\"                   // phone match\n\t * - \"myLink myLink-hashtag\"                 // hashtag match\n\t * - \"myLink myLink-mention myLink-twitter\"  // mention match with Twitter service\n\t *\n\t * @private\n\t * @param {Autolinker.match.Match} match The Match instance to generate an\n\t *   anchor tag from.\n\t * @return {String} The CSS class string for the link. Example return:\n\t *   \"myLink myLink-url\". If no {@link #className} was configured, returns\n\t *   an empty string.\n\t */\n\tcreateCssClass : function( match ) {\n\t\tvar className = this.className;\n\n\t\tif( !className ) {\n\t\t\treturn \"\";\n\n\t\t} else {\n\t\t\tvar returnClasses = [ className ],\n\t\t\t\tcssClassSuffixes = match.getCssClassSuffixes();\n\n\t\t\tfor( var i = 0, len = cssClassSuffixes.length; i < len; i++ ) {\n\t\t\t\treturnClasses.push( className + '-' + cssClassSuffixes[ i ] );\n\t\t\t}\n\t\t\treturn returnClasses.join( ' ' );\n\t\t}\n\t},\n\n\n\t/**\n\t * Processes the `anchorText` by truncating the text according to the\n\t * {@link #truncate} config.\n\t *\n\t * @private\n\t * @param {String} anchorText The anchor tag's text (i.e. what will be\n\t *   displayed).\n\t * @return {String} The processed `anchorText`.\n\t */\n\tprocessAnchorText : function( anchorText ) {\n\t\tanchorText = this.doTruncate( anchorText );\n\n\t\treturn anchorText;\n\t},\n\n\n\t/**\n\t * Performs the truncation of the `anchorText` based on the {@link #truncate}\n\t * option. If the `anchorText` is longer than the length specified by the\n\t * {@link #truncate} option, the truncation is performed based on the\n\t * `location` property. See {@link #truncate} for details.\n\t *\n\t * @private\n\t * @param {String} anchorText The anchor tag's text (i.e. what will be\n\t *   displayed).\n\t * @return {String} The truncated anchor text.\n\t */\n\tdoTruncate : function( anchorText ) {\n\t\tvar truncate = this.truncate;\n\t\tif( !truncate || !truncate.length ) return anchorText;\n\n\t\tvar truncateLength = truncate.length,\n\t\t\ttruncateLocation = truncate.location;\n\n\t\tif( truncateLocation === 'smart' ) {\n\t\t\treturn Autolinker.truncate.TruncateSmart( anchorText, truncateLength );\n\n\t\t} else if( truncateLocation === 'middle' ) {\n\t\t\treturn Autolinker.truncate.TruncateMiddle( anchorText, truncateLength );\n\n\t\t} else {\n\t\t\treturn Autolinker.truncate.TruncateEnd( anchorText, truncateLength );\n\t\t}\n\t}\n\n} );\n\n/*global Autolinker */\n/**\n * @class Autolinker.htmlParser.HtmlParser\n * @extends Object\n *\n * An HTML parser implementation which simply walks an HTML string and returns an array of\n * {@link Autolinker.htmlParser.HtmlNode HtmlNodes} that represent the basic HTML structure of the input string.\n *\n * Autolinker uses this to only link URLs/emails/mentions within text nodes, effectively ignoring / \"walking\n * around\" HTML tags.\n */\nAutolinker.htmlParser.HtmlParser = Autolinker.Util.extend( Object, {\n\n\t/**\n\t * @private\n\t * @property {RegExp} htmlRegex\n\t *\n\t * The regular expression used to pull out HTML tags from a string. Handles namespaced HTML tags and\n\t * attribute names, as specified by http://www.w3.org/TR/html-markup/syntax.html.\n\t *\n\t * Capturing groups:\n\t *\n\t * 1. The \"!DOCTYPE\" tag name, if a tag is a &lt;!DOCTYPE&gt; tag.\n\t * 2. If it is an end tag, this group will have the '/'.\n\t * 3. If it is a comment tag, this group will hold the comment text (i.e.\n\t *    the text inside the `&lt;!--` and `--&gt;`.\n\t * 4. The tag name for a tag without attributes (other than the &lt;!DOCTYPE&gt; tag)\n\t * 5. The tag name for a tag with attributes (other than the &lt;!DOCTYPE&gt; tag)\n\t */\n\thtmlRegex : (function() {\n\t\tvar commentTagRegex = /!--([\\s\\S]+?)--/,\n\t\t    tagNameRegex = /[0-9a-zA-Z][0-9a-zA-Z:]*/,\n\t\t    attrNameRegex = /[^\\s\"'>\\/=\\x00-\\x1F\\x7F]+/,   // the unicode range accounts for excluding control chars, and the delete char\n\t\t    attrValueRegex = /(?:\"[^\"]*?\"|'[^']*?'|[^'\"=<>`\\s]+)/, // double quoted, single quoted, or unquoted attribute values\n\t\t    nameEqualsValueRegex = attrNameRegex.source + '(?:\\\\s*=\\\\s*' + attrValueRegex.source + ')?';  // optional '=[value]'\n\n\t\treturn new RegExp( [\n\t\t\t// for <!DOCTYPE> tag. Ex: <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">)\n\t\t\t'(?:',\n\t\t\t\t'<(!DOCTYPE)',  // *** Capturing Group 1 - If it's a doctype tag\n\n\t\t\t\t\t// Zero or more attributes following the tag name\n\t\t\t\t\t'(?:',\n\t\t\t\t\t\t'\\\\s+',  // one or more whitespace chars before an attribute\n\n\t\t\t\t\t\t// Either:\n\t\t\t\t\t\t// A. attr=\"value\", or\n\t\t\t\t\t\t// B. \"value\" alone (To cover example doctype tag: <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">)\n\t\t\t\t\t\t'(?:', nameEqualsValueRegex, '|', attrValueRegex.source + ')',\n\t\t\t\t\t')*',\n\t\t\t\t'>',\n\t\t\t')',\n\n\t\t\t'|',\n\n\t\t\t// All other HTML tags (i.e. tags that are not <!DOCTYPE>)\n\t\t\t'(?:',\n\t\t\t\t'<(/)?',  // Beginning of a tag or comment. Either '<' for a start tag, or '</' for an end tag.\n\t\t\t\t          // *** Capturing Group 2: The slash or an empty string. Slash ('/') for end tag, empty string for start or self-closing tag.\n\n\t\t\t\t\t'(?:',\n\t\t\t\t\t\tcommentTagRegex.source,  // *** Capturing Group 3 - A Comment Tag's Text\n\n\t\t\t\t\t\t'|',\n\n\t\t\t\t\t\t// Handle tag without attributes.\n\t\t\t\t\t\t// Doing this separately from a tag that has attributes\n\t\t\t\t\t\t// to fix a regex time complexity issue seen with the\n\t\t\t\t\t\t// example in https://github.com/gregjacobs/Autolinker.js/issues/172\n\t\t\t\t\t\t'(?:',\n\t\t\t\t\t\t\t// *** Capturing Group 4 - The tag name for a tag without attributes\n\t\t\t\t\t\t\t'(' + tagNameRegex.source + ')',\n\n\t\t\t\t\t\t\t'\\\\s*/?',  // any trailing spaces and optional '/' before the closing '>'\n\t\t\t\t\t\t')',\n\n\t\t\t\t\t\t'|',\n\n\t\t\t\t\t\t// Handle tag with attributes\n\t\t\t\t\t\t// Doing this separately from a tag with no attributes\n\t\t\t\t\t\t// to fix a regex time complexity issue seen with the\n\t\t\t\t\t\t// example in https://github.com/gregjacobs/Autolinker.js/issues/172\n\t\t\t\t\t\t'(?:',\n\t\t\t\t\t\t\t// *** Capturing Group 5 - The tag name for a tag with attributes\n\t\t\t\t\t\t\t'(' + tagNameRegex.source + ')',\n\n\t\t\t\t\t\t\t'\\\\s+',  // must have at least one space after the tag name to prevent ReDoS issue (issue #172)\n\n\t\t\t\t\t\t\t// Zero or more attributes following the tag name\n\t\t\t\t\t\t\t'(?:',\n\t\t\t\t\t\t\t\t'(?:\\\\s+|\\\\b)',        // any number of whitespace chars before an attribute. NOTE: Using \\s* here throws Chrome into an infinite loop for some reason, so using \\s+|\\b instead\n\t\t\t\t\t\t\t\tnameEqualsValueRegex,  // attr=\"value\" (with optional =\"value\" part)\n\t\t\t\t\t\t\t')*',\n\n\t\t\t\t\t\t\t'\\\\s*/?',  // any trailing spaces and optional '/' before the closing '>'\n\t\t\t\t\t\t')',\n\t\t\t\t\t')',\n\t\t\t\t'>',\n\t\t\t')'\n\t\t].join( \"\" ), 'gi' );\n\t} )(),\n\n\t/**\n\t * @private\n\t * @property {RegExp} htmlCharacterEntitiesRegex\n\t *\n\t * The regular expression that matches common HTML character entities.\n\t *\n\t * Ignoring &amp; as it could be part of a query string -- handling it separately.\n\t */\n\thtmlCharacterEntitiesRegex: /(&nbsp;|&#160;|&lt;|&#60;|&gt;|&#62;|&quot;|&#34;|&#39;)/gi,\n\n\n\t/**\n\t * Parses an HTML string and returns a simple array of {@link Autolinker.htmlParser.HtmlNode HtmlNodes}\n\t * to represent the HTML structure of the input string.\n\t *\n\t * @param {String} html The HTML to parse.\n\t * @return {Autolinker.htmlParser.HtmlNode[]}\n\t */\n\tparse : function( html ) {\n\t\tvar htmlRegex = this.htmlRegex,\n\t\t    currentResult,\n\t\t    lastIndex = 0,\n\t\t    textAndEntityNodes,\n\t\t    nodes = [];  // will be the result of the method\n\n\t\twhile( ( currentResult = htmlRegex.exec( html ) ) !== null ) {\n\t\t\tvar tagText = currentResult[ 0 ],\n\t\t\t    commentText = currentResult[ 3 ], // if we've matched a comment\n\t\t\t    tagName = currentResult[ 1 ] || currentResult[ 4 ] || currentResult[ 5 ],  // The <!DOCTYPE> tag (ex: \"!DOCTYPE\"), or another tag (ex: \"a\" or \"img\")\n\t\t\t    isClosingTag = !!currentResult[ 2 ],\n\t\t\t    offset = currentResult.index,\n\t\t\t    inBetweenTagsText = html.substring( lastIndex, offset );\n\n\t\t\t// Push TextNodes and EntityNodes for any text found between tags\n\t\t\tif( inBetweenTagsText ) {\n\t\t\t\ttextAndEntityNodes = this.parseTextAndEntityNodes( lastIndex, inBetweenTagsText );\n\t\t\t\tnodes.push.apply( nodes, textAndEntityNodes );\n\t\t\t}\n\n\t\t\t// Push the CommentNode or ElementNode\n\t\t\tif( commentText ) {\n\t\t\t\tnodes.push( this.createCommentNode( offset, tagText, commentText ) );\n\t\t\t} else {\n\t\t\t\tnodes.push( this.createElementNode( offset, tagText, tagName, isClosingTag ) );\n\t\t\t}\n\n\t\t\tlastIndex = offset + tagText.length;\n\t\t}\n\n\t\t// Process any remaining text after the last HTML element. Will process all of the text if there were no HTML elements.\n\t\tif( lastIndex < html.length ) {\n\t\t\tvar text = html.substring( lastIndex );\n\n\t\t\t// Push TextNodes and EntityNodes for any text found between tags\n\t\t\tif( text ) {\n\t\t\t\ttextAndEntityNodes = this.parseTextAndEntityNodes( lastIndex, text );\n\n\t\t\t\t// Note: the following 3 lines were previously:\n\t\t\t\t//   nodes.push.apply( nodes, textAndEntityNodes );\n\t\t\t\t// but this was causing a \"Maximum Call Stack Size Exceeded\"\n\t\t\t\t// error on inputs with a large number of html entities.\n\t\t\t\ttextAndEntityNodes.forEach( function( node ) {\n\t\t\t\t\tnodes.push( node );\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\treturn nodes;\n\t},\n\n\n\t/**\n\t * Parses text and HTML entity nodes from a given string. The input string\n\t * should not have any HTML tags (elements) within it.\n\t *\n\t * @private\n\t * @param {Number} offset The offset of the text node match within the\n\t *   original HTML string.\n\t * @param {String} text The string of text to parse. This is from an HTML\n\t *   text node.\n\t * @return {Autolinker.htmlParser.HtmlNode[]} An array of HtmlNodes to\n\t *   represent the {@link Autolinker.htmlParser.TextNode TextNodes} and\n\t *   {@link Autolinker.htmlParser.EntityNode EntityNodes} found.\n\t */\n\tparseTextAndEntityNodes : function( offset, text ) {\n\t\tvar nodes = [],\n\t\t    textAndEntityTokens = Autolinker.Util.splitAndCapture( text, this.htmlCharacterEntitiesRegex );  // split at HTML entities, but include the HTML entities in the results array\n\n\t\t// Every even numbered token is a TextNode, and every odd numbered token is an EntityNode\n\t\t// For example: an input `text` of \"Test &quot;this&quot; today\" would turn into the\n\t\t//   `textAndEntityTokens`: [ 'Test ', '&quot;', 'this', '&quot;', ' today' ]\n\t\tfor( var i = 0, len = textAndEntityTokens.length; i < len; i += 2 ) {\n\t\t\tvar textToken = textAndEntityTokens[ i ],\n\t\t\t    entityToken = textAndEntityTokens[ i + 1 ];\n\n\t\t\tif( textToken ) {\n\t\t\t\tnodes.push( this.createTextNode( offset, textToken ) );\n\t\t\t\toffset += textToken.length;\n\t\t\t}\n\t\t\tif( entityToken ) {\n\t\t\t\tnodes.push( this.createEntityNode( offset, entityToken ) );\n\t\t\t\toffset += entityToken.length;\n\t\t\t}\n\t\t}\n\t\treturn nodes;\n\t},\n\n\n\t/**\n\t * Factory method to create an {@link Autolinker.htmlParser.CommentNode CommentNode}.\n\t *\n\t * @private\n\t * @param {Number} offset The offset of the match within the original HTML\n\t *   string.\n\t * @param {String} tagText The full text of the tag (comment) that was\n\t *   matched, including its &lt;!-- and --&gt;.\n\t * @param {String} commentText The full text of the comment that was matched.\n\t */\n\tcreateCommentNode : function( offset, tagText, commentText ) {\n\t\treturn new Autolinker.htmlParser.CommentNode( {\n\t\t\toffset : offset,\n\t\t\ttext   : tagText,\n\t\t\tcomment: Autolinker.Util.trim( commentText )\n\t\t} );\n\t},\n\n\n\t/**\n\t * Factory method to create an {@link Autolinker.htmlParser.ElementNode ElementNode}.\n\t *\n\t * @private\n\t * @param {Number} offset The offset of the match within the original HTML\n\t *   string.\n\t * @param {String} tagText The full text of the tag (element) that was\n\t *   matched, including its attributes.\n\t * @param {String} tagName The name of the tag. Ex: An &lt;img&gt; tag would\n\t *   be passed to this method as \"img\".\n\t * @param {Boolean} isClosingTag `true` if it's a closing tag, false\n\t *   otherwise.\n\t * @return {Autolinker.htmlParser.ElementNode}\n\t */\n\tcreateElementNode : function( offset, tagText, tagName, isClosingTag ) {\n\t\treturn new Autolinker.htmlParser.ElementNode( {\n\t\t\toffset  : offset,\n\t\t\ttext    : tagText,\n\t\t\ttagName : tagName.toLowerCase(),\n\t\t\tclosing : isClosingTag\n\t\t} );\n\t},\n\n\n\t/**\n\t * Factory method to create a {@link Autolinker.htmlParser.EntityNode EntityNode}.\n\t *\n\t * @private\n\t * @param {Number} offset The offset of the match within the original HTML\n\t *   string.\n\t * @param {String} text The text that was matched for the HTML entity (such\n\t *   as '&amp;nbsp;').\n\t * @return {Autolinker.htmlParser.EntityNode}\n\t */\n\tcreateEntityNode : function( offset, text ) {\n\t\treturn new Autolinker.htmlParser.EntityNode( { offset: offset, text: text } );\n\t},\n\n\n\t/**\n\t * Factory method to create a {@link Autolinker.htmlParser.TextNode TextNode}.\n\t *\n\t * @private\n\t * @param {Number} offset The offset of the match within the original HTML\n\t *   string.\n\t * @param {String} text The text that was matched.\n\t * @return {Autolinker.htmlParser.TextNode}\n\t */\n\tcreateTextNode : function( offset, text ) {\n\t\treturn new Autolinker.htmlParser.TextNode( { offset: offset, text: text } );\n\t}\n\n} );\n\n/*global Autolinker */\n/**\n * @abstract\n * @class Autolinker.htmlParser.HtmlNode\n *\n * Represents an HTML node found in an input string. An HTML node is one of the\n * following:\n *\n * 1. An {@link Autolinker.htmlParser.ElementNode ElementNode}, which represents\n *    HTML tags.\n * 2. A {@link Autolinker.htmlParser.CommentNode CommentNode}, which represents\n *    HTML comments.\n * 3. A {@link Autolinker.htmlParser.TextNode TextNode}, which represents text\n *    outside or within HTML tags.\n * 4. A {@link Autolinker.htmlParser.EntityNode EntityNode}, which represents\n *    one of the known HTML entities that Autolinker looks for. This includes\n *    common ones such as &amp;quot; and &amp;nbsp;\n */\nAutolinker.htmlParser.HtmlNode = Autolinker.Util.extend( Object, {\n\n\t/**\n\t * @cfg {Number} offset (required)\n\t *\n\t * The offset of the HTML node in the original text that was parsed.\n\t */\n\toffset : undefined,\n\n\t/**\n\t * @cfg {String} text (required)\n\t *\n\t * The text that was matched for the HtmlNode.\n\t *\n\t * - In the case of an {@link Autolinker.htmlParser.ElementNode ElementNode},\n\t *   this will be the tag's text.\n\t * - In the case of an {@link Autolinker.htmlParser.CommentNode CommentNode},\n\t *   this will be the comment's text.\n\t * - In the case of a {@link Autolinker.htmlParser.TextNode TextNode}, this\n\t *   will be the text itself.\n\t * - In the case of a {@link Autolinker.htmlParser.EntityNode EntityNode},\n\t *   this will be the text of the HTML entity.\n\t */\n\ttext : undefined,\n\n\n\t/**\n\t * @constructor\n\t * @param {Object} cfg The configuration properties for the Match instance,\n\t * specified in an Object (map).\n\t */\n\tconstructor : function( cfg ) {\n\t\tAutolinker.Util.assign( this, cfg );\n\n\t\tif( this.offset == null ) throw new Error( '`offset` cfg required' );\n\t\tif( this.text == null ) throw new Error( '`text` cfg required' );\n\t},\n\n\n\t/**\n\t * Returns a string name for the type of node that this class represents.\n\t *\n\t * @abstract\n\t * @return {String}\n\t */\n\tgetType : Autolinker.Util.abstractMethod,\n\n\n\t/**\n\t * Retrieves the {@link #offset} of the HtmlNode. This is the offset of the\n\t * HTML node in the original string that was parsed.\n\t *\n\t * @return {Number}\n\t */\n\tgetOffset : function() {\n\t\treturn this.offset;\n\t},\n\n\n\t/**\n\t * Retrieves the {@link #text} for the HtmlNode.\n\t *\n\t * @return {String}\n\t */\n\tgetText : function() {\n\t\treturn this.text;\n\t}\n\n} );\n/*global Autolinker */\n/**\n * @class Autolinker.htmlParser.CommentNode\n * @extends Autolinker.htmlParser.HtmlNode\n *\n * Represents an HTML comment node that has been parsed by the\n * {@link Autolinker.htmlParser.HtmlParser}.\n *\n * See this class's superclass ({@link Autolinker.htmlParser.HtmlNode}) for more\n * details.\n */\nAutolinker.htmlParser.CommentNode = Autolinker.Util.extend( Autolinker.htmlParser.HtmlNode, {\n\n\t/**\n\t * @cfg {String} comment (required)\n\t *\n\t * The text inside the comment tag. This text is stripped of any leading or\n\t * trailing whitespace.\n\t */\n\tcomment : '',\n\n\n\t/**\n\t * Returns a string name for the type of node that this class represents.\n\t *\n\t * @return {String}\n\t */\n\tgetType : function() {\n\t\treturn 'comment';\n\t},\n\n\n\t/**\n\t * Returns the comment inside the comment tag.\n\t *\n\t * @return {String}\n\t */\n\tgetComment : function() {\n\t\treturn this.comment;\n\t}\n\n} );\n/*global Autolinker */\n/**\n * @class Autolinker.htmlParser.ElementNode\n * @extends Autolinker.htmlParser.HtmlNode\n *\n * Represents an HTML element node that has been parsed by the {@link Autolinker.htmlParser.HtmlParser}.\n *\n * See this class's superclass ({@link Autolinker.htmlParser.HtmlNode}) for more\n * details.\n */\nAutolinker.htmlParser.ElementNode = Autolinker.Util.extend( Autolinker.htmlParser.HtmlNode, {\n\n\t/**\n\t * @cfg {String} tagName (required)\n\t *\n\t * The name of the tag that was matched.\n\t */\n\ttagName : '',\n\n\t/**\n\t * @cfg {Boolean} closing (required)\n\t *\n\t * `true` if the element (tag) is a closing tag, `false` if its an opening\n\t * tag.\n\t */\n\tclosing : false,\n\n\n\t/**\n\t * Returns a string name for the type of node that this class represents.\n\t *\n\t * @return {String}\n\t */\n\tgetType : function() {\n\t\treturn 'element';\n\t},\n\n\n\t/**\n\t * Returns the HTML element's (tag's) name. Ex: for an &lt;img&gt; tag,\n\t * returns \"img\".\n\t *\n\t * @return {String}\n\t */\n\tgetTagName : function() {\n\t\treturn this.tagName;\n\t},\n\n\n\t/**\n\t * Determines if the HTML element (tag) is a closing tag. Ex: &lt;div&gt;\n\t * returns `false`, while &lt;/div&gt; returns `true`.\n\t *\n\t * @return {Boolean}\n\t */\n\tisClosing : function() {\n\t\treturn this.closing;\n\t}\n\n} );\n/*global Autolinker */\n/**\n * @class Autolinker.htmlParser.EntityNode\n * @extends Autolinker.htmlParser.HtmlNode\n *\n * Represents a known HTML entity node that has been parsed by the {@link Autolinker.htmlParser.HtmlParser}.\n * Ex: '&amp;nbsp;', or '&amp#160;' (which will be retrievable from the {@link #getText}\n * method.\n *\n * Note that this class will only be returned from the HtmlParser for the set of\n * checked HTML entity nodes  defined by the {@link Autolinker.htmlParser.HtmlParser#htmlCharacterEntitiesRegex}.\n *\n * See this class's superclass ({@link Autolinker.htmlParser.HtmlNode}) for more\n * details.\n */\nAutolinker.htmlParser.EntityNode = Autolinker.Util.extend( Autolinker.htmlParser.HtmlNode, {\n\n\t/**\n\t * Returns a string name for the type of node that this class represents.\n\t *\n\t * @return {String}\n\t */\n\tgetType : function() {\n\t\treturn 'entity';\n\t}\n\n} );\n/*global Autolinker */\n/**\n * @class Autolinker.htmlParser.TextNode\n * @extends Autolinker.htmlParser.HtmlNode\n *\n * Represents a text node that has been parsed by the {@link Autolinker.htmlParser.HtmlParser}.\n *\n * See this class's superclass ({@link Autolinker.htmlParser.HtmlNode}) for more\n * details.\n */\nAutolinker.htmlParser.TextNode = Autolinker.Util.extend( Autolinker.htmlParser.HtmlNode, {\n\n\t/**\n\t * Returns a string name for the type of node that this class represents.\n\t *\n\t * @return {String}\n\t */\n\tgetType : function() {\n\t\treturn 'text';\n\t}\n\n} );\n/*global Autolinker */\n/**\n * @abstract\n * @class Autolinker.match.Match\n *\n * Represents a match found in an input string which should be Autolinked. A Match object is what is provided in a\n * {@link Autolinker#replaceFn replaceFn}, and may be used to query for details about the match.\n *\n * For example:\n *\n *     var input = \"...\";  // string with URLs, Email Addresses, and Mentions (Twitter, Instagram)\n *\n *     var linkedText = Autolinker.link( input, {\n *         replaceFn : function( match ) {\n *             console.log( \"href = \", match.getAnchorHref() );\n *             console.log( \"text = \", match.getAnchorText() );\n *\n *             switch( match.getType() ) {\n *                 case 'url' :\n *                     console.log( \"url: \", match.getUrl() );\n *\n *                 case 'email' :\n *                     console.log( \"email: \", match.getEmail() );\n *\n *                 case 'mention' :\n *                     console.log( \"mention: \", match.getMention() );\n *             }\n *         }\n *     } );\n *\n * See the {@link Autolinker} class for more details on using the {@link Autolinker#replaceFn replaceFn}.\n */\nAutolinker.match.Match = Autolinker.Util.extend( Object, {\n\n\t/**\n\t * @cfg {Autolinker.AnchorTagBuilder} tagBuilder (required)\n\t *\n\t * Reference to the AnchorTagBuilder instance to use to generate an anchor\n\t * tag for the Match.\n\t */\n\n\t/**\n\t * @cfg {String} matchedText (required)\n\t *\n\t * The original text that was matched by the {@link Autolinker.matcher.Matcher}.\n\t */\n\n\t/**\n\t * @cfg {Number} offset (required)\n\t *\n\t * The offset of where the match was made in the input string.\n\t */\n\n\n\t/**\n\t * @constructor\n\t * @param {Object} cfg The configuration properties for the Match\n\t *   instance, specified in an Object (map).\n\t */\n\tconstructor : function( cfg ) {\n\t\tif( cfg.tagBuilder == null ) throw new Error( '`tagBuilder` cfg required' );\n\t\tif( cfg.matchedText == null ) throw new Error( '`matchedText` cfg required' );\n\t\tif( cfg.offset == null ) throw new Error( '`offset` cfg required' );\n\n\t\tthis.tagBuilder = cfg.tagBuilder;\n\t\tthis.matchedText = cfg.matchedText;\n\t\tthis.offset = cfg.offset;\n\t},\n\n\n\t/**\n\t * Returns a string name for the type of match that this class represents.\n\t *\n\t * @abstract\n\t * @return {String}\n\t */\n\tgetType : Autolinker.Util.abstractMethod,\n\n\n\t/**\n\t * Returns the original text that was matched.\n\t *\n\t * @return {String}\n\t */\n\tgetMatchedText : function() {\n\t\treturn this.matchedText;\n\t},\n\n\n\t/**\n\t * Sets the {@link #offset} of where the match was made in the input string.\n\t *\n\t * A {@link Autolinker.matcher.Matcher} will be fed only HTML text nodes,\n\t * and will therefore set an original offset that is relative to the HTML\n\t * text node itself. However, we want this offset to be relative to the full\n\t * HTML input string, and thus if using {@link Autolinker#parse} (rather\n\t * than calling a {@link Autolinker.matcher.Matcher} directly), then this\n\t * offset is corrected after the Matcher itself has done its job.\n\t *\n\t * @param {Number} offset\n\t */\n\tsetOffset : function( offset ) {\n\t\tthis.offset = offset;\n\t},\n\n\n\t/**\n\t * Returns the offset of where the match was made in the input string. This\n\t * is the 0-based index of the match.\n\t *\n\t * @return {Number}\n\t */\n\tgetOffset : function() {\n\t\treturn this.offset;\n\t},\n\n\n\t/**\n\t * Returns the anchor href that should be generated for the match.\n\t *\n\t * @abstract\n\t * @return {String}\n\t */\n\tgetAnchorHref : Autolinker.Util.abstractMethod,\n\n\n\t/**\n\t * Returns the anchor text that should be generated for the match.\n\t *\n\t * @abstract\n\t * @return {String}\n\t */\n\tgetAnchorText : Autolinker.Util.abstractMethod,\n\n\n\t/**\n\t * Returns the CSS class suffix(es) for this match.\n\t *\n\t * A CSS class suffix is appended to the {@link Autolinker#className} in\n\t * the {@link Autolinker.AnchorTagBuilder} when a match is translated into\n\t * an anchor tag.\n\t *\n\t * For example, if {@link Autolinker#className} was configured as 'myLink',\n\t * and this method returns `[ 'url' ]`, the final class name of the element\n\t * will become: 'myLink myLink-url'.\n\t *\n\t * The match may provide multiple CSS class suffixes to be appended to the\n\t * {@link Autolinker#className} in order to facilitate better styling\n\t * options for different match criteria. See {@link Autolinker.match.Mention}\n\t * for an example.\n\t *\n\t * By default, this method returns a single array with the match's\n\t * {@link #getType type} name, but may be overridden by subclasses.\n\t *\n\t * @return {String[]}\n\t */\n\tgetCssClassSuffixes : function() {\n\t\treturn [ this.getType() ];\n\t},\n\n\n\t/**\n\t * Builds and returns an {@link Autolinker.HtmlTag} instance based on the\n\t * Match.\n\t *\n\t * This can be used to easily generate anchor tags from matches, and either\n\t * return their HTML string, or modify them before doing so.\n\t *\n\t * Example Usage:\n\t *\n\t *     var tag = match.buildTag();\n\t *     tag.addClass( 'cordova-link' );\n\t *     tag.setAttr( 'target', '_system' );\n\t *\n\t *     tag.toAnchorString();  // <a href=\"http://google.com\" class=\"cordova-link\" target=\"_system\">Google</a>\n\t */\n\tbuildTag : function() {\n\t\treturn this.tagBuilder.build( this );\n\t}\n\n} );\n\n/*global Autolinker */\n/**\n * @class Autolinker.match.Email\n * @extends Autolinker.match.Match\n *\n * Represents a Email match found in an input string which should be Autolinked.\n *\n * See this class's superclass ({@link Autolinker.match.Match}) for more details.\n */\nAutolinker.match.Email = Autolinker.Util.extend( Autolinker.match.Match, {\n\n\t/**\n\t * @cfg {String} email (required)\n\t *\n\t * The email address that was matched.\n\t */\n\n\n\t/**\n\t * @constructor\n\t * @param {Object} cfg The configuration properties for the Match\n\t *   instance, specified in an Object (map).\n\t */\n\tconstructor : function( cfg ) {\n\t\tAutolinker.match.Match.prototype.constructor.call( this, cfg );\n\n\t\tif( !cfg.email ) throw new Error( '`email` cfg required' );\n\n\t\tthis.email = cfg.email;\n\t},\n\n\n\t/**\n\t * Returns a string name for the type of match that this class represents.\n\t *\n\t * @return {String}\n\t */\n\tgetType : function() {\n\t\treturn 'email';\n\t},\n\n\n\t/**\n\t * Returns the email address that was matched.\n\t *\n\t * @return {String}\n\t */\n\tgetEmail : function() {\n\t\treturn this.email;\n\t},\n\n\n\t/**\n\t * Returns the anchor href that should be generated for the match.\n\t *\n\t * @return {String}\n\t */\n\tgetAnchorHref : function() {\n\t\treturn 'mailto:' + this.email;\n\t},\n\n\n\t/**\n\t * Returns the anchor text that should be generated for the match.\n\t *\n\t * @return {String}\n\t */\n\tgetAnchorText : function() {\n\t\treturn this.email;\n\t}\n\n} );\n/*global Autolinker */\n/**\n * @class Autolinker.match.Hashtag\n * @extends Autolinker.match.Match\n *\n * Represents a Hashtag match found in an input string which should be\n * Autolinked.\n *\n * See this class's superclass ({@link Autolinker.match.Match}) for more\n * details.\n */\nAutolinker.match.Hashtag = Autolinker.Util.extend( Autolinker.match.Match, {\n\n\t/**\n\t * @cfg {String} serviceName\n\t *\n\t * The service to point hashtag matches to. See {@link Autolinker#hashtag}\n\t * for available values.\n\t */\n\n\t/**\n\t * @cfg {String} hashtag (required)\n\t *\n\t * The Hashtag that was matched, without the '#'.\n\t */\n\n\n\t/**\n\t * @constructor\n\t * @param {Object} cfg The configuration properties for the Match\n\t *   instance, specified in an Object (map).\n\t */\n\tconstructor : function( cfg ) {\n\t\tAutolinker.match.Match.prototype.constructor.call( this, cfg );\n\n\t\t// TODO: if( !serviceName ) throw new Error( '`serviceName` cfg required' );\n\t\tif( !cfg.hashtag ) throw new Error( '`hashtag` cfg required' );\n\n\t\tthis.serviceName = cfg.serviceName;\n\t\tthis.hashtag = cfg.hashtag;\n\t},\n\n\n\t/**\n\t * Returns the type of match that this class represents.\n\t *\n\t * @return {String}\n\t */\n\tgetType : function() {\n\t\treturn 'hashtag';\n\t},\n\n\n\t/**\n\t * Returns the configured {@link #serviceName} to point the Hashtag to.\n\t * Ex: 'facebook', 'twitter'.\n\t *\n\t * @return {String}\n\t */\n\tgetServiceName : function() {\n\t\treturn this.serviceName;\n\t},\n\n\n\t/**\n\t * Returns the matched hashtag, without the '#' character.\n\t *\n\t * @return {String}\n\t */\n\tgetHashtag : function() {\n\t\treturn this.hashtag;\n\t},\n\n\n\t/**\n\t * Returns the anchor href that should be generated for the match.\n\t *\n\t * @return {String}\n\t */\n\tgetAnchorHref : function() {\n\t\tvar serviceName = this.serviceName,\n\t\t    hashtag = this.hashtag;\n\n\t\tswitch( serviceName ) {\n\t\t\tcase 'twitter' :\n\t\t\t\treturn 'https://twitter.com/hashtag/' + hashtag;\n\t\t\tcase 'facebook' :\n\t\t\t\treturn 'https://www.facebook.com/hashtag/' + hashtag;\n\t\t\tcase 'instagram' :\n\t\t\t\treturn 'https://instagram.com/explore/tags/' + hashtag;\n\n\t\t\tdefault :  // Shouldn't happen because Autolinker's constructor should block any invalid values, but just in case.\n\t\t\t\tthrow new Error( 'Unknown service name to point hashtag to: ', serviceName );\n\t\t}\n\t},\n\n\n\t/**\n\t * Returns the anchor text that should be generated for the match.\n\t *\n\t * @return {String}\n\t */\n\tgetAnchorText : function() {\n\t\treturn '#' + this.hashtag;\n\t}\n\n} );\n\n/*global Autolinker */\n/**\n * @class Autolinker.match.Phone\n * @extends Autolinker.match.Match\n *\n * Represents a Phone number match found in an input string which should be\n * Autolinked.\n *\n * See this class's superclass ({@link Autolinker.match.Match}) for more\n * details.\n */\nAutolinker.match.Phone = Autolinker.Util.extend( Autolinker.match.Match, {\n\n\t/**\n\t * @protected\n\t * @property {String} number (required)\n\t *\n\t * The phone number that was matched, without any delimiter characters.\n\t *\n\t * Note: This is a string to allow for prefixed 0's.\n\t */\n\n\t/**\n\t * @protected\n\t * @property  {Boolean} plusSign (required)\n\t *\n\t * `true` if the matched phone number started with a '+' sign. We'll include\n\t * it in the `tel:` URL if so, as this is needed for international numbers.\n\t *\n\t * Ex: '+1 (123) 456 7879'\n\t */\n\n\n\t/**\n\t * @constructor\n\t * @param {Object} cfg The configuration properties for the Match\n\t *   instance, specified in an Object (map).\n\t */\n\tconstructor : function( cfg ) {\n\t\tAutolinker.match.Match.prototype.constructor.call( this, cfg );\n\n\t\tif( !cfg.number ) throw new Error( '`number` cfg required' );\n\t\tif( cfg.plusSign == null ) throw new Error( '`plusSign` cfg required' );\n\n\t\tthis.number = cfg.number;\n\t\tthis.plusSign = cfg.plusSign;\n\t},\n\n\n\t/**\n\t * Returns a string name for the type of match that this class represents.\n\t *\n\t * @return {String}\n\t */\n\tgetType : function() {\n\t\treturn 'phone';\n\t},\n\n\n\t/**\n\t * Returns the phone number that was matched as a string, without any\n\t * delimiter characters.\n\t *\n\t * Note: This is a string to allow for prefixed 0's.\n\t *\n\t * @return {String}\n\t */\n\tgetNumber: function() {\n\t\treturn this.number;\n\t},\n\n\n\t/**\n\t * Returns the anchor href that should be generated for the match.\n\t *\n\t * @return {String}\n\t */\n\tgetAnchorHref : function() {\n\t\treturn 'tel:' + ( this.plusSign ? '+' : '' ) + this.number;\n\t},\n\n\n\t/**\n\t * Returns the anchor text that should be generated for the match.\n\t *\n\t * @return {String}\n\t */\n\tgetAnchorText : function() {\n\t\treturn this.matchedText;\n\t}\n\n} );\n\n/*global Autolinker */\n/**\n * @class Autolinker.match.Mention\n * @extends Autolinker.match.Match\n *\n * Represents a Mention match found in an input string which should be Autolinked.\n *\n * See this class's superclass ({@link Autolinker.match.Match}) for more details.\n */\nAutolinker.match.Mention = Autolinker.Util.extend( Autolinker.match.Match, {\n\n\t/**\n\t * @cfg {String} serviceName\n\t *\n\t * The service to point mention matches to. See {@link Autolinker#mention}\n\t * for available values.\n\t */\n\n\t/**\n\t * @cfg {String} mention (required)\n\t *\n\t * The Mention that was matched, without the '@' character.\n\t */\n\n\n\t/**\n\t * @constructor\n\t * @param {Object} cfg The configuration properties for the Match\n\t *   instance, specified in an Object (map).\n\t */\n\tconstructor : function( cfg ) {\n\t\tAutolinker.match.Match.prototype.constructor.call( this, cfg );\n\n\t\tif( !cfg.serviceName ) throw new Error( '`serviceName` cfg required' );\n\t\tif( !cfg.mention ) throw new Error( '`mention` cfg required' );\n\n\t\tthis.mention = cfg.mention;\n\t\tthis.serviceName = cfg.serviceName;\n\t},\n\n\n\t/**\n\t * Returns the type of match that this class represents.\n\t *\n\t * @return {String}\n\t */\n\tgetType : function() {\n\t\treturn 'mention';\n\t},\n\n\n\t/**\n\t * Returns the mention, without the '@' character.\n\t *\n\t * @return {String}\n\t */\n\tgetMention : function() {\n\t\treturn this.mention;\n\t},\n\n\n\t/**\n\t * Returns the configured {@link #serviceName} to point the mention to.\n\t * Ex: 'instagram', 'twitter'.\n\t *\n\t * @return {String}\n\t */\n\tgetServiceName : function() {\n\t\treturn this.serviceName;\n\t},\n\n\n\t/**\n\t * Returns the anchor href that should be generated for the match.\n\t *\n\t * @return {String}\n\t */\n\tgetAnchorHref : function() {\n\t\tswitch( this.serviceName ) {\n\t\t\tcase 'twitter' :\n\t\t\t\treturn 'https://twitter.com/' + this.mention;\n\t\t\tcase 'instagram' :\n\t\t\t\treturn 'https://instagram.com/' + this.mention;\n\n\t\t\tdefault :  // Shouldn't happen because Autolinker's constructor should block any invalid values, but just in case.\n\t\t\t\tthrow new Error( 'Unknown service name to point mention to: ', this.serviceName );\n\t\t}\n\t},\n\n\n\t/**\n\t * Returns the anchor text that should be generated for the match.\n\t *\n\t * @return {String}\n\t */\n\tgetAnchorText : function() {\n\t\treturn '@' + this.mention;\n\t},\n\n\n\t/**\n\t * Returns the CSS class suffixes that should be used on a tag built with\n\t * the match. See {@link Autolinker.match.Match#getCssClassSuffixes} for\n\t * details.\n\t *\n\t * @return {String[]}\n\t */\n\tgetCssClassSuffixes : function() {\n\t\tvar cssClassSuffixes = Autolinker.match.Match.prototype.getCssClassSuffixes.call( this ),\n\t\t    serviceName = this.getServiceName();\n\n\t\tif( serviceName ) {\n\t\t\tcssClassSuffixes.push( serviceName );\n\t\t}\n\t\treturn cssClassSuffixes;\n\t}\n\n} );\n\n/*global Autolinker */\n/**\n * @class Autolinker.match.Url\n * @extends Autolinker.match.Match\n *\n * Represents a Url match found in an input string which should be Autolinked.\n *\n * See this class's superclass ({@link Autolinker.match.Match}) for more details.\n */\nAutolinker.match.Url = Autolinker.Util.extend( Autolinker.match.Match, {\n\n\t/**\n\t * @cfg {String} url (required)\n\t *\n\t * The url that was matched.\n\t */\n\n\t/**\n\t * @cfg {\"scheme\"/\"www\"/\"tld\"} urlMatchType (required)\n\t *\n\t * The type of URL match that this class represents. This helps to determine\n\t * if the match was made in the original text with a prefixed scheme (ex:\n\t * 'http://www.google.com'), a prefixed 'www' (ex: 'www.google.com'), or\n\t * was matched by a known top-level domain (ex: 'google.com').\n\t */\n\n\t/**\n\t * @cfg {Boolean} protocolUrlMatch (required)\n\t *\n\t * `true` if the URL is a match which already has a protocol (i.e.\n\t * 'http://'), `false` if the match was from a 'www' or known TLD match.\n\t */\n\n\t/**\n\t * @cfg {Boolean} protocolRelativeMatch (required)\n\t *\n\t * `true` if the URL is a protocol-relative match. A protocol-relative match\n\t * is a URL that starts with '//', and will be either http:// or https://\n\t * based on the protocol that the site is loaded under.\n\t */\n\n\t/**\n\t * @cfg {Object} stripPrefix (required)\n\t *\n\t * The Object form of {@link Autolinker#cfg-stripPrefix}.\n\t */\n\n\t/**\n\t * @cfg {Boolean} stripTrailingSlash (required)\n\t * @inheritdoc Autolinker#cfg-stripTrailingSlash\n\t */\n\n\n\t/**\n\t * @constructor\n\t * @param {Object} cfg The configuration properties for the Match\n\t *   instance, specified in an Object (map).\n\t */\n\tconstructor : function( cfg ) {\n\t\tAutolinker.match.Match.prototype.constructor.call( this, cfg );\n\n\t\tif( cfg.urlMatchType !== 'scheme' && cfg.urlMatchType !== 'www' && cfg.urlMatchType !== 'tld' ) throw new Error( '`urlMatchType` cfg must be one of: \"scheme\", \"www\", or \"tld\"' );\n\t\tif( !cfg.url ) throw new Error( '`url` cfg required' );\n\t\tif( cfg.protocolUrlMatch == null ) throw new Error( '`protocolUrlMatch` cfg required' );\n\t\tif( cfg.protocolRelativeMatch == null ) throw new Error( '`protocolRelativeMatch` cfg required' );\n\t\tif( cfg.stripPrefix == null ) throw new Error( '`stripPrefix` cfg required' );\n\t\tif( cfg.stripTrailingSlash == null ) throw new Error( '`stripTrailingSlash` cfg required' );\n\n\t\tthis.urlMatchType = cfg.urlMatchType;\n\t\tthis.url = cfg.url;\n\t\tthis.protocolUrlMatch = cfg.protocolUrlMatch;\n\t\tthis.protocolRelativeMatch = cfg.protocolRelativeMatch;\n\t\tthis.stripPrefix = cfg.stripPrefix;\n\t\tthis.stripTrailingSlash = cfg.stripTrailingSlash;\n\t},\n\n\n\t/**\n\t * @private\n\t * @property {RegExp} schemePrefixRegex\n\t *\n\t * A regular expression used to remove the 'http://' or 'https://' from\n\t * URLs.\n\t */\n\tschemePrefixRegex: /^(https?:\\/\\/)?/i,\n\n\t/**\n\t * @private\n\t * @property {RegExp} wwwPrefixRegex\n\t *\n\t * A regular expression used to remove the 'www.' from URLs.\n\t */\n\twwwPrefixRegex: /^(https?:\\/\\/)?(www\\.)?/i,\n\n\t/**\n\t * @private\n\t * @property {RegExp} protocolRelativeRegex\n\t *\n\t * The regular expression used to remove the protocol-relative '//' from the {@link #url} string, for purposes\n\t * of {@link #getAnchorText}. A protocol-relative URL is, for example, \"//yahoo.com\"\n\t */\n\tprotocolRelativeRegex : /^\\/\\//,\n\n\t/**\n\t * @private\n\t * @property {Boolean} protocolPrepended\n\t *\n\t * Will be set to `true` if the 'http://' protocol has been prepended to the {@link #url} (because the\n\t * {@link #url} did not have a protocol)\n\t */\n\tprotocolPrepended : false,\n\n\n\t/**\n\t * Returns a string name for the type of match that this class represents.\n\t *\n\t * @return {String}\n\t */\n\tgetType : function() {\n\t\treturn 'url';\n\t},\n\n\n\t/**\n\t * Returns a string name for the type of URL match that this class\n\t * represents.\n\t *\n\t * This helps to determine if the match was made in the original text with a\n\t * prefixed scheme (ex: 'http://www.google.com'), a prefixed 'www' (ex:\n\t * 'www.google.com'), or was matched by a known top-level domain (ex:\n\t * 'google.com').\n\t *\n\t * @return {\"scheme\"/\"www\"/\"tld\"}\n\t */\n\tgetUrlMatchType : function() {\n\t\treturn this.urlMatchType;\n\t},\n\n\n\t/**\n\t * Returns the url that was matched, assuming the protocol to be 'http://' if the original\n\t * match was missing a protocol.\n\t *\n\t * @return {String}\n\t */\n\tgetUrl : function() {\n\t\tvar url = this.url;\n\n\t\t// if the url string doesn't begin with a protocol, assume 'http://'\n\t\tif( !this.protocolRelativeMatch && !this.protocolUrlMatch && !this.protocolPrepended ) {\n\t\t\turl = this.url = 'http://' + url;\n\n\t\t\tthis.protocolPrepended = true;\n\t\t}\n\n\t\treturn url;\n\t},\n\n\n\t/**\n\t * Returns the anchor href that should be generated for the match.\n\t *\n\t * @return {String}\n\t */\n\tgetAnchorHref : function() {\n\t\tvar url = this.getUrl();\n\n\t\treturn url.replace( /&amp;/g, '&' );  // any &amp;'s in the URL should be converted back to '&' if they were displayed as &amp; in the source html\n\t},\n\n\n\t/**\n\t * Returns the anchor text that should be generated for the match.\n\t *\n\t * @return {String}\n\t */\n\tgetAnchorText : function() {\n\t\tvar anchorText = this.getMatchedText();\n\n\t\tif( this.protocolRelativeMatch ) {\n\t\t\t// Strip off any protocol-relative '//' from the anchor text\n\t\t\tanchorText = this.stripProtocolRelativePrefix( anchorText );\n\t\t}\n\t\tif( this.stripPrefix.scheme ) {\n\t\t\tanchorText = this.stripSchemePrefix( anchorText );\n\t\t}\n\t\tif( this.stripPrefix.www ) {\n\t\t\tanchorText = this.stripWwwPrefix( anchorText );\n\t\t}\n\t\tif( this.stripTrailingSlash ) {\n\t\t\tanchorText = this.removeTrailingSlash( anchorText );  // remove trailing slash, if there is one\n\t\t}\n\n\t\treturn anchorText;\n\t},\n\n\n\t// ---------------------------------------\n\n\t// Utility Functionality\n\n\t/**\n\t * Strips the scheme prefix (such as \"http://\" or \"https://\") from the given\n\t * `url`.\n\t *\n\t * @private\n\t * @param {String} url The text of the anchor that is being generated, for\n\t *   which to strip off the url scheme.\n\t * @return {String} The `url`, with the scheme stripped.\n\t */\n\tstripSchemePrefix : function( url ) {\n\t\treturn url.replace( this.schemePrefixRegex, '' );\n\t},\n\n\n\t/**\n\t * Strips the 'www' prefix from the given `url`.\n\t *\n\t * @private\n\t * @param {String} url The text of the anchor that is being generated, for\n\t *   which to strip off the 'www' if it exists.\n\t * @return {String} The `url`, with the 'www' stripped.\n\t */\n\tstripWwwPrefix : function( url ) {\n\t\treturn url.replace( this.wwwPrefixRegex, '$1' );  // leave any scheme ($1), it one exists\n\t},\n\n\n\t/**\n\t * Strips any protocol-relative '//' from the anchor text.\n\t *\n\t * @private\n\t * @param {String} text The text of the anchor that is being generated, for which to strip off the\n\t *   protocol-relative prefix (such as stripping off \"//\")\n\t * @return {String} The `anchorText`, with the protocol-relative prefix stripped.\n\t */\n\tstripProtocolRelativePrefix : function( text ) {\n\t\treturn text.replace( this.protocolRelativeRegex, '' );\n\t},\n\n\n\t/**\n\t * Removes any trailing slash from the given `anchorText`, in preparation for the text to be displayed.\n\t *\n\t * @private\n\t * @param {String} anchorText The text of the anchor that is being generated, for which to remove any trailing\n\t *   slash ('/') that may exist.\n\t * @return {String} The `anchorText`, with the trailing slash removed.\n\t */\n\tremoveTrailingSlash : function( anchorText ) {\n\t\tif( anchorText.charAt( anchorText.length - 1 ) === '/' ) {\n\t\t\tanchorText = anchorText.slice( 0, -1 );\n\t\t}\n\t\treturn anchorText;\n\t}\n\n} );\n/*global Autolinker */\n/**\n * @abstract\n * @class Autolinker.matcher.Matcher\n *\n * An abstract class and interface for individual matchers to find matches in\n * an input string with linkified versions of them.\n *\n * Note that Matchers do not take HTML into account - they must be fed the text\n * nodes of any HTML string, which is handled by {@link Autolinker#parse}.\n */\nAutolinker.matcher.Matcher = Autolinker.Util.extend( Object, {\n\n\t/**\n\t * @cfg {Autolinker.AnchorTagBuilder} tagBuilder (required)\n\t *\n\t * Reference to the AnchorTagBuilder instance to use to generate HTML tags\n\t * for {@link Autolinker.match.Match Matches}.\n\t */\n\n\n\t/**\n\t * @constructor\n\t * @param {Object} cfg The configuration properties for the Matcher\n\t *   instance, specified in an Object (map).\n\t */\n\tconstructor : function( cfg ) {\n\t\tif( !cfg.tagBuilder ) throw new Error( '`tagBuilder` cfg required' );\n\n\t\tthis.tagBuilder = cfg.tagBuilder;\n\t},\n\n\n\t/**\n\t * Parses the input `text` and returns the array of {@link Autolinker.match.Match Matches}\n\t * for the matcher.\n\t *\n\t * @abstract\n\t * @param {String} text The text to scan and replace matches in.\n\t * @return {Autolinker.match.Match[]}\n\t */\n\tparseMatches : Autolinker.Util.abstractMethod\n\n} );\n/*global Autolinker */\n/**\n * @class Autolinker.matcher.Email\n * @extends Autolinker.matcher.Matcher\n *\n * Matcher to find email matches in an input string.\n *\n * See this class's superclass ({@link Autolinker.matcher.Matcher}) for more details.\n */\nAutolinker.matcher.Email = Autolinker.Util.extend( Autolinker.matcher.Matcher, {\n\n\t/**\n\t * The regular expression to match email addresses. Example match:\n\t *\n\t *     person@place.com\n\t *\n\t * @private\n\t * @property {RegExp} matcherRegex\n\t */\n\tmatcherRegex : (function() {\n\t\tvar alphaNumericChars = Autolinker.RegexLib.alphaNumericCharsStr,\n\t\t    emailRegex = new RegExp( '[' + alphaNumericChars + '\\\\-_\\';:&=+$.,]+@' ),  // something@ for email addresses (a.k.a. local-part)\n\t\t\tdomainNameRegex = Autolinker.RegexLib.domainNameRegex,\n\t\t\ttldRegex = Autolinker.RegexLib.tldRegex;  // match our known top level domains (TLDs)\n\n\t\treturn new RegExp( [\n\t\t\temailRegex.source,\n\t\t\tdomainNameRegex.source,\n\t\t\t'\\\\.', tldRegex.source   // '.com', '.net', etc\n\t\t].join( \"\" ), 'gi' );\n\t} )(),\n\n\n\t/**\n\t * @inheritdoc\n\t */\n\tparseMatches : function( text ) {\n\t\tvar matcherRegex = this.matcherRegex,\n\t\t    tagBuilder = this.tagBuilder,\n\t\t    matches = [],\n\t\t    match;\n\n\t\twhile( ( match = matcherRegex.exec( text ) ) !== null ) {\n\t\t\tvar matchedText = match[ 0 ];\n\n\t\t\tmatches.push( new Autolinker.match.Email( {\n\t\t\t\ttagBuilder  : tagBuilder,\n\t\t\t\tmatchedText : matchedText,\n\t\t\t\toffset      : match.index,\n\t\t\t\temail       : matchedText\n\t\t\t} ) );\n\t\t}\n\n\t\treturn matches;\n\t}\n\n} );\n/*global Autolinker */\n/**\n * @class Autolinker.matcher.Hashtag\n * @extends Autolinker.matcher.Matcher\n *\n * Matcher to find Hashtag matches in an input string.\n */\nAutolinker.matcher.Hashtag = Autolinker.Util.extend( Autolinker.matcher.Matcher, {\n\n\t/**\n\t * @cfg {String} serviceName\n\t *\n\t * The service to point hashtag matches to. See {@link Autolinker#hashtag}\n\t * for available values.\n\t */\n\n\n\t/**\n\t * The regular expression to match Hashtags. Example match:\n\t *\n\t *     #asdf\n\t *\n\t * @private\n\t * @property {RegExp} matcherRegex\n\t */\n\tmatcherRegex : new RegExp( '#[_' + Autolinker.RegexLib.alphaNumericCharsStr + ']{1,139}', 'g' ),\n\n\t/**\n\t * The regular expression to use to check the character before a username match to\n\t * make sure we didn't accidentally match an email address.\n\t *\n\t * For example, the string \"asdf@asdf.com\" should not match \"@asdf\" as a username.\n\t *\n\t * @private\n\t * @property {RegExp} nonWordCharRegex\n\t */\n\tnonWordCharRegex : new RegExp( '[^' + Autolinker.RegexLib.alphaNumericCharsStr + ']' ),\n\n\n\t/**\n\t * @constructor\n\t * @param {Object} cfg The configuration properties for the Match instance,\n\t *   specified in an Object (map).\n\t */\n\tconstructor : function( cfg ) {\n\t\tAutolinker.matcher.Matcher.prototype.constructor.call( this, cfg );\n\n\t\tthis.serviceName = cfg.serviceName;\n\t},\n\n\n\t/**\n\t * @inheritdoc\n\t */\n\tparseMatches : function( text ) {\n\t\tvar matcherRegex = this.matcherRegex,\n\t\t    nonWordCharRegex = this.nonWordCharRegex,\n\t\t    serviceName = this.serviceName,\n\t\t    tagBuilder = this.tagBuilder,\n\t\t    matches = [],\n\t\t    match;\n\n\t\twhile( ( match = matcherRegex.exec( text ) ) !== null ) {\n\t\t\tvar offset = match.index,\n\t\t\t    prevChar = text.charAt( offset - 1 );\n\n\t\t\t// If we found the match at the beginning of the string, or we found the match\n\t\t\t// and there is a whitespace char in front of it (meaning it is not a '#' char\n\t\t\t// in the middle of a word), then it is a hashtag match.\n\t\t\tif( offset === 0 || nonWordCharRegex.test( prevChar ) ) {\n\t\t\t\tvar matchedText = match[ 0 ],\n\t\t\t\t    hashtag = match[ 0 ].slice( 1 );  // strip off the '#' character at the beginning\n\n\t\t\t\tmatches.push( new Autolinker.match.Hashtag( {\n\t\t\t\t\ttagBuilder  : tagBuilder,\n\t\t\t\t\tmatchedText : matchedText,\n\t\t\t\t\toffset      : offset,\n\t\t\t\t\tserviceName : serviceName,\n\t\t\t\t\thashtag     : hashtag\n\t\t\t\t} ) );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t}\n\n} );\n/*global Autolinker */\n/**\n * @class Autolinker.matcher.Phone\n * @extends Autolinker.matcher.Matcher\n *\n * Matcher to find Phone number matches in an input string.\n *\n * See this class's superclass ({@link Autolinker.matcher.Matcher}) for more\n * details.\n */\nAutolinker.matcher.Phone = Autolinker.Util.extend( Autolinker.matcher.Matcher, {\n\n\t/**\n\t * The regular expression to match Phone numbers. Example match:\n\t *\n\t *     (123) 456-7890\n\t *\n\t * This regular expression has the following capturing groups:\n\t *\n\t * 1. The prefixed '+' sign, if there is one.\n\t *\n\t * @private\n\t * @property {RegExp} matcherRegex\n\t */\n\tmatcherRegex : /(?:(\\+)?\\d{1,3}[-\\040.])?\\(?\\d{3}\\)?[-\\040.]?\\d{3}[-\\040.]\\d{4}/g,  // ex: (123) 456-7890, 123 456 7890, 123-456-7890, etc.\n\n\t/**\n\t * @inheritdoc\n\t */\n\tparseMatches : function( text ) {\n\t\tvar matcherRegex = this.matcherRegex,\n\t\t    tagBuilder = this.tagBuilder,\n\t\t    matches = [],\n\t\t    match;\n\n\t\twhile( ( match = matcherRegex.exec( text ) ) !== null ) {\n\t\t\t// Remove non-numeric values from phone number string\n\t\t\tvar matchedText = match[ 0 ],\n\t\t\t    cleanNumber = matchedText.replace( /\\D/g, '' ),  // strip out non-digit characters\n\t\t\t    plusSign = !!match[ 1 ];  // match[ 1 ] is the prefixed plus sign, if there is one\n\n\t\t\tmatches.push( new Autolinker.match.Phone( {\n\t\t\t\ttagBuilder  : tagBuilder,\n\t\t\t\tmatchedText : matchedText,\n\t\t\t\toffset      : match.index,\n\t\t\t\tnumber      : cleanNumber,\n\t\t\t\tplusSign    : plusSign\n\t\t\t} ) );\n\t\t}\n\n\t\treturn matches;\n\t}\n\n} );\n/*global Autolinker */\n/**\n * @class Autolinker.matcher.Mention\n * @extends Autolinker.matcher.Matcher\n *\n * Matcher to find/replace username matches in an input string.\n */\nAutolinker.matcher.Mention = Autolinker.Util.extend( Autolinker.matcher.Matcher, {\n\n\t/**\n\t * Hash of regular expression to match username handles. Example match:\n\t *\n\t *     @asdf\n\t *\n\t * @private\n\t * @property {Object} matcherRegexes\n\t */\n\tmatcherRegexes : {\n\t\t\"twitter\": new RegExp( '@[_' + Autolinker.RegexLib.alphaNumericCharsStr + ']{1,20}', 'g' ),\n\t\t\"instagram\": new RegExp( '@[_.' + Autolinker.RegexLib.alphaNumericCharsStr + ']{1,50}', 'g' )\n\t},\n\n\t/**\n\t * The regular expression to use to check the character before a username match to\n\t * make sure we didn't accidentally match an email address.\n\t *\n\t * For example, the string \"asdf@asdf.com\" should not match \"@asdf\" as a username.\n\t *\n\t * @private\n\t * @property {RegExp} nonWordCharRegex\n\t */\n\tnonWordCharRegex : new RegExp( '[^' + Autolinker.RegexLib.alphaNumericCharsStr + ']' ),\n\n\n\t/**\n\t * @constructor\n\t * @param {Object} cfg The configuration properties for the Match instance,\n\t *   specified in an Object (map).\n\t */\n\tconstructor : function( cfg ) {\n\t\tAutolinker.matcher.Matcher.prototype.constructor.call( this, cfg );\n\n\t\tthis.serviceName = cfg.serviceName;\n\t},\n\n\n\t/**\n\t * @inheritdoc\n\t */\n\tparseMatches : function( text ) {\n\t\tvar matcherRegex = this.matcherRegexes[this.serviceName],\n\t\t    nonWordCharRegex = this.nonWordCharRegex,\n\t\t    serviceName = this.serviceName,\n\t\t    tagBuilder = this.tagBuilder,\n\t\t    matches = [],\n\t\t    match;\n\n\t\tif (!matcherRegex) {\n\t\t\treturn matches;\n\t\t}\n\n\t\twhile( ( match = matcherRegex.exec( text ) ) !== null ) {\n\t\t\tvar offset = match.index,\n\t\t\t    prevChar = text.charAt( offset - 1 );\n\n\t\t\t// If we found the match at the beginning of the string, or we found the match\n\t\t\t// and there is a whitespace char in front of it (meaning it is not an email\n\t\t\t// address), then it is a username match.\n\t\t\tif( offset === 0 || nonWordCharRegex.test( prevChar ) ) {\n\t\t\t\tvar matchedText = match[ 0 ].replace(/\\.+$/g, ''), // strip off trailing .\n\t\t\t\t    mention = matchedText.slice( 1 );  // strip off the '@' character at the beginning\n\n\t\t\t\tmatches.push( new Autolinker.match.Mention( {\n\t\t\t\t\ttagBuilder    : tagBuilder,\n\t\t\t\t\tmatchedText   : matchedText,\n\t\t\t\t\toffset        : offset,\n\t\t\t\t\tserviceName   : serviceName,\n\t\t\t\t\tmention       : mention\n\t\t\t\t} ) );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t}\n\n} );\n\n/*global Autolinker */\n/**\n * @class Autolinker.matcher.Url\n * @extends Autolinker.matcher.Matcher\n *\n * Matcher to find URL matches in an input string.\n *\n * See this class's superclass ({@link Autolinker.matcher.Matcher}) for more details.\n */\nAutolinker.matcher.Url = Autolinker.Util.extend( Autolinker.matcher.Matcher, {\n\n\t/**\n\t * @cfg {Object} stripPrefix (required)\n\t *\n\t * The Object form of {@link Autolinker#cfg-stripPrefix}.\n\t */\n\n\t/**\n\t * @cfg {Boolean} stripTrailingSlash (required)\n\t * @inheritdoc Autolinker#stripTrailingSlash\n\t */\n\n\n\t/**\n\t * @private\n\t * @property {RegExp} matcherRegex\n\t *\n\t * The regular expression to match URLs with an optional scheme, port\n\t * number, path, query string, and hash anchor.\n\t *\n\t * Example matches:\n\t *\n\t *     http://google.com\n\t *     www.google.com\n\t *     google.com/path/to/file?q1=1&q2=2#myAnchor\n\t *\n\t *\n\t * This regular expression will have the following capturing groups:\n\t *\n\t * 1.  Group that matches a scheme-prefixed URL (i.e. 'http://google.com').\n\t *     This is used to match scheme URLs with just a single word, such as\n\t *     'http://localhost', where we won't double check that the domain name\n\t *     has at least one dot ('.') in it.\n\t * 2.  Group that matches a 'www.' prefixed URL. This is only matched if the\n\t *     'www.' text was not prefixed by a scheme (i.e.: not prefixed by\n\t *     'http://', 'ftp:', etc.)\n\t * 3.  A protocol-relative ('//') match for the case of a 'www.' prefixed\n\t *     URL. Will be an empty string if it is not a protocol-relative match.\n\t *     We need to know the character before the '//' in order to determine\n\t *     if it is a valid match or the // was in a string we don't want to\n\t *     auto-link.\n\t * 4.  Group that matches a known TLD (top level domain), when a scheme\n\t *     or 'www.'-prefixed domain is not matched.\n\t * 5.  A protocol-relative ('//') match for the case of a known TLD prefixed\n\t *     URL. Will be an empty string if it is not a protocol-relative match.\n\t *     See #3 for more info.\n\t */\n\tmatcherRegex : (function() {\n\t\tvar schemeRegex = /(?:[A-Za-z][-.+A-Za-z0-9]*:(?![A-Za-z][-.+A-Za-z0-9]*:\\/\\/)(?!\\d+\\/?)(?:\\/\\/)?)/,  // match protocol, allow in format \"http://\" or \"mailto:\". However, do not match the first part of something like 'link:http://www.google.com' (i.e. don't match \"link:\"). Also, make sure we don't interpret 'google.com:8000' as if 'google.com' was a protocol here (i.e. ignore a trailing port number in this regex)\n\t\t    wwwRegex = /(?:www\\.)/,                  // starting with 'www.'\n\t\t    domainNameRegex = Autolinker.RegexLib.domainNameRegex,\n\t\t    tldRegex = Autolinker.RegexLib.tldRegex,  // match our known top level domains (TLDs)\n\t\t    alphaNumericCharsStr = Autolinker.RegexLib.alphaNumericCharsStr,\n\n\t\t    // Allow optional path, query string, and hash anchor, not ending in the following characters: \"?!:,.;\"\n\t\t    // http://blog.codinghorror.com/the-problem-with-urls/\n\t\t    urlSuffixRegex = new RegExp( '[' + alphaNumericCharsStr + '\\\\-+&@#/%=~_()|\\'$*\\\\[\\\\]?!:,.;\\u2713]*[' + alphaNumericCharsStr + '\\\\-+&@#/%=~_()|\\'$*\\\\[\\\\]\\u2713]' );\n\n\t\treturn new RegExp( [\n\t\t\t'(?:', // parens to cover match for scheme (optional), and domain\n\t\t\t\t'(',  // *** Capturing group $1, for a scheme-prefixed url (ex: http://google.com)\n\t\t\t\t\tschemeRegex.source,\n\t\t\t\t\tdomainNameRegex.source,\n\t\t\t\t')',\n\n\t\t\t\t'|',\n\n\t\t\t\t'(',  // *** Capturing group $2, for a 'www.' prefixed url (ex: www.google.com)\n\t\t\t\t\t'(//)?',  // *** Capturing group $3 for an optional protocol-relative URL. Must be at the beginning of the string or start with a non-word character (handled later)\n\t\t\t\t\twwwRegex.source,\n\t\t\t\t\tdomainNameRegex.source,\n\t\t\t\t')',\n\n\t\t\t\t'|',\n\n\t\t\t\t'(',  // *** Capturing group $4, for known a TLD url (ex: google.com)\n\t\t\t\t\t'(//)?',  // *** Capturing group $5 for an optional protocol-relative URL. Must be at the beginning of the string or start with a non-word character (handled later)\n\t\t\t\t\tdomainNameRegex.source + '\\\\.',\n\t\t\t\t\ttldRegex.source,\n\t\t\t\t')',\n\t\t\t')',\n\n\t\t\t'(?:' + urlSuffixRegex.source + ')?'  // match for path, query string, and/or hash anchor - optional\n\t\t].join( \"\" ), 'gi' );\n\t} )(),\n\n\n\t/**\n\t * A regular expression to use to check the character before a protocol-relative\n\t * URL match. We don't want to match a protocol-relative URL if it is part\n\t * of another word.\n\t *\n\t * For example, we want to match something like \"Go to: //google.com\",\n\t * but we don't want to match something like \"abc//google.com\"\n\t *\n\t * This regular expression is used to test the character before the '//'.\n\t *\n\t * @private\n\t * @type {RegExp} wordCharRegExp\n\t */\n\twordCharRegExp : /\\w/,\n\n\n\t/**\n\t * The regular expression to match opening parenthesis in a URL match.\n\t *\n\t * This is to determine if we have unbalanced parenthesis in the URL, and to\n\t * drop the final parenthesis that was matched if so.\n\t *\n\t * Ex: The text \"(check out: wikipedia.com/something_(disambiguation))\"\n\t * should only autolink the inner \"wikipedia.com/something_(disambiguation)\"\n\t * part, so if we find that we have unbalanced parenthesis, we will drop the\n\t * last one for the match.\n\t *\n\t * @private\n\t * @property {RegExp}\n\t */\n\topenParensRe : /\\(/g,\n\n\t/**\n\t * The regular expression to match closing parenthesis in a URL match. See\n\t * {@link #openParensRe} for more information.\n\t *\n\t * @private\n\t * @property {RegExp}\n\t */\n\tcloseParensRe : /\\)/g,\n\n\n\t/**\n\t * @constructor\n\t * @param {Object} cfg The configuration properties for the Match instance,\n\t *   specified in an Object (map).\n\t */\n\tconstructor : function( cfg ) {\n\t\tAutolinker.matcher.Matcher.prototype.constructor.call( this, cfg );\n\n\t\tif( cfg.stripPrefix == null ) throw new Error( '`stripPrefix` cfg required' );\n\t\tif( cfg.stripTrailingSlash == null ) throw new Error( '`stripTrailingSlash` cfg required' );\n\n\t\tthis.stripPrefix = cfg.stripPrefix;\n\t\tthis.stripTrailingSlash = cfg.stripTrailingSlash;\n\t},\n\n\n\t/**\n\t * @inheritdoc\n\t */\n\tparseMatches : function( text ) {\n\t\tvar matcherRegex = this.matcherRegex,\n\t\t    stripPrefix = this.stripPrefix,\n\t\t    stripTrailingSlash = this.stripTrailingSlash,\n\t\t    tagBuilder = this.tagBuilder,\n\t\t    matches = [],\n\t\t    match;\n\n\t\twhile( ( match = matcherRegex.exec( text ) ) !== null ) {\n\t\t\tvar matchStr = match[ 0 ],\n\t\t\t    schemeUrlMatch = match[ 1 ],\n\t\t\t    wwwUrlMatch = match[ 2 ],\n\t\t\t    wwwProtocolRelativeMatch = match[ 3 ],\n\t\t\t    //tldUrlMatch = match[ 4 ],  -- not needed at the moment\n\t\t\t    tldProtocolRelativeMatch = match[ 5 ],\n\t\t\t    offset = match.index,\n\t\t\t    protocolRelativeMatch = wwwProtocolRelativeMatch || tldProtocolRelativeMatch,\n\t\t\t\tprevChar = text.charAt( offset - 1 );\n\n\t\t\tif( !Autolinker.matcher.UrlMatchValidator.isValid( matchStr, schemeUrlMatch ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If the match is preceded by an '@' character, then it is either\n\t\t\t// an email address or a username. Skip these types of matches.\n\t\t\tif( offset > 0 && prevChar === '@' ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If it's a protocol-relative '//' match, but the character before the '//'\n\t\t\t// was a word character (i.e. a letter/number), then we found the '//' in the\n\t\t\t// middle of another word (such as \"asdf//asdf.com\"). In this case, skip the\n\t\t\t// match.\n\t\t\tif( offset > 0 && protocolRelativeMatch && this.wordCharRegExp.test( prevChar ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Handle a closing parenthesis at the end of the match, and exclude\n\t\t\t// it if there is not a matching open parenthesis in the match\n\t\t\t// itself.\n\t\t\tif( this.matchHasUnbalancedClosingParen( matchStr ) ) {\n\t\t\t\tmatchStr = matchStr.substr( 0, matchStr.length - 1 );  // remove the trailing \")\"\n\t\t\t} else {\n\t\t\t\t// Handle an invalid character after the TLD\n\t\t\t\tvar pos = this.matchHasInvalidCharAfterTld( matchStr, schemeUrlMatch );\n\t\t\t\tif( pos > -1 ) {\n\t\t\t\t\tmatchStr = matchStr.substr( 0, pos ); // remove the trailing invalid chars\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar urlMatchType = schemeUrlMatch ? 'scheme' : ( wwwUrlMatch ? 'www' : 'tld' ),\n\t\t\t    protocolUrlMatch = !!schemeUrlMatch;\n\n\t\t\tmatches.push( new Autolinker.match.Url( {\n\t\t\t\ttagBuilder            : tagBuilder,\n\t\t\t\tmatchedText           : matchStr,\n\t\t\t\toffset                : offset,\n\t\t\t\turlMatchType          : urlMatchType,\n\t\t\t\turl                   : matchStr,\n\t\t\t\tprotocolUrlMatch      : protocolUrlMatch,\n\t\t\t\tprotocolRelativeMatch : !!protocolRelativeMatch,\n\t\t\t\tstripPrefix           : stripPrefix,\n\t\t\t\tstripTrailingSlash    : stripTrailingSlash\n\t\t\t} ) );\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\n\t/**\n\t * Determines if a match found has an unmatched closing parenthesis. If so,\n\t * this parenthesis will be removed from the match itself, and appended\n\t * after the generated anchor tag.\n\t *\n\t * A match may have an extra closing parenthesis at the end of the match\n\t * because the regular expression must include parenthesis for URLs such as\n\t * \"wikipedia.com/something_(disambiguation)\", which should be auto-linked.\n\t *\n\t * However, an extra parenthesis *will* be included when the URL itself is\n\t * wrapped in parenthesis, such as in the case of \"(wikipedia.com/something_(disambiguation))\".\n\t * In this case, the last closing parenthesis should *not* be part of the\n\t * URL itself, and this method will return `true`.\n\t *\n\t * @private\n\t * @param {String} matchStr The full match string from the {@link #matcherRegex}.\n\t * @return {Boolean} `true` if there is an unbalanced closing parenthesis at\n\t *   the end of the `matchStr`, `false` otherwise.\n\t */\n\tmatchHasUnbalancedClosingParen : function( matchStr ) {\n\t\tvar lastChar = matchStr.charAt( matchStr.length - 1 );\n\n\t\tif( lastChar === ')' ) {\n\t\t\tvar openParensMatch = matchStr.match( this.openParensRe ),\n\t\t\t    closeParensMatch = matchStr.match( this.closeParensRe ),\n\t\t\t    numOpenParens = ( openParensMatch && openParensMatch.length ) || 0,\n\t\t\t    numCloseParens = ( closeParensMatch && closeParensMatch.length ) || 0;\n\n\t\t\tif( numOpenParens < numCloseParens ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\n\t/**\n\t * Determine if there's an invalid character after the TLD in a URL. Valid\n\t * characters after TLD are ':/?#'. Exclude scheme matched URLs from this\n\t * check.\n\t *\n\t * @private\n\t * @param {String} urlMatch The matched URL, if there was one. Will be an\n\t *   empty string if the match is not a URL match.\n\t * @param {String} schemeUrlMatch The match URL string for a scheme\n\t *   match. Ex: 'http://yahoo.com'. This is used to match something like\n\t *   'http://localhost', where we won't double check that the domain name\n\t *   has at least one '.' in it.\n\t * @return {Number} the position where the invalid character was found. If\n\t *   no such character was found, returns -1\n\t */\n\tmatchHasInvalidCharAfterTld : function( urlMatch, schemeUrlMatch ) {\n\t\tif( !urlMatch ) {\n\t\t\treturn -1;\n\t\t}\n\n\t\tvar offset = 0;\n\t\tif ( schemeUrlMatch ) {\n\t\t\toffset = urlMatch.indexOf(':');\n\t\t\turlMatch = urlMatch.slice(offset);\n\t\t}\n\n\t\tvar re = /^((.?\\/\\/)?[A-Za-z0-9\\u00C0-\\u017F\\.\\-]*[A-Za-z0-9\\u00C0-\\u017F\\-]\\.[A-Za-z]+)/;\n\t\tvar res = re.exec( urlMatch );\n\t\tif ( res === null ) {\n\t\t\treturn -1;\n\t\t}\n\n\t\toffset += res[1].length;\n\t\turlMatch = urlMatch.slice(res[1].length);\n\t\tif (/^[^.A-Za-z0-9:\\/?#]/.test(urlMatch)) {\n\t\t\treturn offset;\n\t\t}\n\n\t\treturn -1;\n\t}\n\n} );\n\n/*global Autolinker */\n/*jshint scripturl:true */\n/**\n * @private\n * @class Autolinker.matcher.UrlMatchValidator\n * @singleton\n *\n * Used by Autolinker to filter out false URL positives from the\n * {@link Autolinker.matcher.Url UrlMatcher}.\n *\n * Due to the limitations of regular expressions (including the missing feature\n * of look-behinds in JS regular expressions), we cannot always determine the\n * validity of a given match. This class applies a bit of additional logic to\n * filter out any false positives that have been matched by the\n * {@link Autolinker.matcher.Url UrlMatcher}.\n */\nAutolinker.matcher.UrlMatchValidator = {\n\n\t/**\n\t * Regex to test for a full protocol, with the two trailing slashes. Ex: 'http://'\n\t *\n\t * @private\n\t * @property {RegExp} hasFullProtocolRegex\n\t */\n\thasFullProtocolRegex : /^[A-Za-z][-.+A-Za-z0-9]*:\\/\\//,\n\n\t/**\n\t * Regex to find the URI scheme, such as 'mailto:'.\n\t *\n\t * This is used to filter out 'javascript:' and 'vbscript:' schemes.\n\t *\n\t * @private\n\t * @property {RegExp} uriSchemeRegex\n\t */\n\turiSchemeRegex : /^[A-Za-z][-.+A-Za-z0-9]*:/,\n\n\t/**\n\t * Regex to determine if at least one word char exists after the protocol (i.e. after the ':')\n\t *\n\t * @private\n\t * @property {RegExp} hasWordCharAfterProtocolRegex\n\t */\n\thasWordCharAfterProtocolRegex : /:[^\\s]*?[A-Za-z\\u00C0-\\u017F]/,\n\n\t/**\n\t * Regex to determine if the string is a valid IP address\n\t *\n\t * @private\n\t * @property {RegExp} ipRegex\n\t */\n\tipRegex: /[0-9][0-9]?[0-9]?\\.[0-9][0-9]?[0-9]?\\.[0-9][0-9]?[0-9]?\\.[0-9][0-9]?[0-9]?(:[0-9]*)?\\/?$/,\n\n\t/**\n\t * Determines if a given URL match found by the {@link Autolinker.matcher.Url UrlMatcher}\n\t * is valid. Will return `false` for:\n\t *\n\t * 1) URL matches which do not have at least have one period ('.') in the\n\t *    domain name (effectively skipping over matches like \"abc:def\").\n\t *    However, URL matches with a protocol will be allowed (ex: 'http://localhost')\n\t * 2) URL matches which do not have at least one word character in the\n\t *    domain name (effectively skipping over matches like \"git:1.0\").\n\t * 3) A protocol-relative url match (a URL beginning with '//') whose\n\t *    previous character is a word character (effectively skipping over\n\t *    strings like \"abc//google.com\")\n\t *\n\t * Otherwise, returns `true`.\n\t *\n\t * @param {String} urlMatch The matched URL, if there was one. Will be an\n\t *   empty string if the match is not a URL match.\n\t * @param {String} protocolUrlMatch The match URL string for a protocol\n\t *   match. Ex: 'http://yahoo.com'. This is used to match something like\n\t *   'http://localhost', where we won't double check that the domain name\n\t *   has at least one '.' in it.\n\t * @return {Boolean} `true` if the match given is valid and should be\n\t *   processed, or `false` if the match is invalid and/or should just not be\n\t *   processed.\n\t */\n\tisValid : function( urlMatch, protocolUrlMatch ) {\n\t\tif(\n\t\t\t( protocolUrlMatch && !this.isValidUriScheme( protocolUrlMatch ) ) ||\n\t\t\tthis.urlMatchDoesNotHaveProtocolOrDot( urlMatch, protocolUrlMatch ) ||    // At least one period ('.') must exist in the URL match for us to consider it an actual URL, *unless* it was a full protocol match (like 'http://localhost')\n\t\t\t(this.urlMatchDoesNotHaveAtLeastOneWordChar( urlMatch, protocolUrlMatch ) && // At least one letter character must exist in the domain name after a protocol match. Ex: skip over something like \"git:1.0\"\n\t\t\t   !this.isValidIpAddress( urlMatch )) || // Except if it's an IP address\n\t\t\tthis.containsMultipleDots( urlMatch )\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t},\n\n\n\tisValidIpAddress : function ( uriSchemeMatch ) {\n\t\tvar newRegex = new RegExp(this.hasFullProtocolRegex.source + this.ipRegex.source);\n\t\tvar uriScheme = uriSchemeMatch.match( newRegex );\n\n\t\treturn uriScheme !== null;\n\t},\n\n\tcontainsMultipleDots : function ( urlMatch ) {\n\t\treturn urlMatch.indexOf(\"..\") > -1;\n\t},\n\n\t/**\n\t * Determines if the URI scheme is a valid scheme to be autolinked. Returns\n\t * `false` if the scheme is 'javascript:' or 'vbscript:'\n\t *\n\t * @private\n\t * @param {String} uriSchemeMatch The match URL string for a full URI scheme\n\t *   match. Ex: 'http://yahoo.com' or 'mailto:a@a.com'.\n\t * @return {Boolean} `true` if the scheme is a valid one, `false` otherwise.\n\t */\n\tisValidUriScheme : function( uriSchemeMatch ) {\n\t\tvar uriScheme = uriSchemeMatch.match( this.uriSchemeRegex )[ 0 ].toLowerCase();\n\n\t\treturn ( uriScheme !== 'javascript:' && uriScheme !== 'vbscript:' );\n\t},\n\n\n\t/**\n\t * Determines if a URL match does not have either:\n\t *\n\t * a) a full protocol (i.e. 'http://'), or\n\t * b) at least one dot ('.') in the domain name (for a non-full-protocol\n\t *    match).\n\t *\n\t * Either situation is considered an invalid URL (ex: 'git:d' does not have\n\t * either the '://' part, or at least one dot in the domain name. If the\n\t * match was 'git:abc.com', we would consider this valid.)\n\t *\n\t * @private\n\t * @param {String} urlMatch The matched URL, if there was one. Will be an\n\t *   empty string if the match is not a URL match.\n\t * @param {String} protocolUrlMatch The match URL string for a protocol\n\t *   match. Ex: 'http://yahoo.com'. This is used to match something like\n\t *   'http://localhost', where we won't double check that the domain name\n\t *   has at least one '.' in it.\n\t * @return {Boolean} `true` if the URL match does not have a full protocol,\n\t *   or at least one dot ('.') in a non-full-protocol match.\n\t */\n\turlMatchDoesNotHaveProtocolOrDot : function( urlMatch, protocolUrlMatch ) {\n\t\treturn ( !!urlMatch && ( !protocolUrlMatch || !this.hasFullProtocolRegex.test( protocolUrlMatch ) ) && urlMatch.indexOf( '.' ) === -1 );\n\t},\n\n\n\t/**\n\t * Determines if a URL match does not have at least one word character after\n\t * the protocol (i.e. in the domain name).\n\t *\n\t * At least one letter character must exist in the domain name after a\n\t * protocol match. Ex: skip over something like \"git:1.0\"\n\t *\n\t * @private\n\t * @param {String} urlMatch The matched URL, if there was one. Will be an\n\t *   empty string if the match is not a URL match.\n\t * @param {String} protocolUrlMatch The match URL string for a protocol\n\t *   match. Ex: 'http://yahoo.com'. This is used to know whether or not we\n\t *   have a protocol in the URL string, in order to check for a word\n\t *   character after the protocol separator (':').\n\t * @return {Boolean} `true` if the URL match does not have at least one word\n\t *   character in it after the protocol, `false` otherwise.\n\t */\n\turlMatchDoesNotHaveAtLeastOneWordChar : function( urlMatch, protocolUrlMatch ) {\n\t\tif( urlMatch && protocolUrlMatch ) {\n\t\t\treturn !this.hasWordCharAfterProtocolRegex.test( urlMatch );\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n};\n\n/*global Autolinker */\n/**\n * A truncation feature where the ellipsis will be placed at the end of the URL.\n *\n * @param {String} anchorText\n * @param {Number} truncateLen The maximum length of the truncated output URL string.\n * @param {String} ellipsisChars The characters to place within the url, e.g. \"..\".\n * @return {String} The truncated URL.\n */\nAutolinker.truncate.TruncateEnd = function(anchorText, truncateLen, ellipsisChars){\n\treturn Autolinker.Util.ellipsis( anchorText, truncateLen, ellipsisChars );\n};\n\n/*global Autolinker */\n/**\n * Date: 2015-10-05\n * Author: Kasper Søfren <soefritz@gmail.com> (https://github.com/kafoso)\n *\n * A truncation feature, where the ellipsis will be placed in the dead-center of the URL.\n *\n * @param {String} url             A URL.\n * @param {Number} truncateLen     The maximum length of the truncated output URL string.\n * @param {String} ellipsisChars   The characters to place within the url, e.g. \"..\".\n * @return {String} The truncated URL.\n */\nAutolinker.truncate.TruncateMiddle = function(url, truncateLen, ellipsisChars){\n  if (url.length <= truncateLen) {\n    return url;\n  }\n\n  var ellipsisLengthBeforeParsing;\n  var ellipsisLength;\n\n  if(ellipsisChars == null) {\n    ellipsisChars = '&hellip;';\n    ellipsisLengthBeforeParsing = 8;\n    ellipsisLength = 3;\n  } else {\n    ellipsisLengthBeforeParsing = ellipsisChars.length;\n    ellipsisLength = ellipsisChars.length;\n  }\n\n  var availableLength = truncateLen - ellipsisLength;\n  var end = \"\";\n  if (availableLength > 0) {\n    end = url.substr((-1)*Math.floor(availableLength/2));\n  }\n  return (url.substr(0, Math.ceil(availableLength/2)) + ellipsisChars + end).substr(0, availableLength + ellipsisLengthBeforeParsing);\n};\n\n/*global Autolinker */\n/**\n * Date: 2015-10-05\n * Author: Kasper Søfren <soefritz@gmail.com> (https://github.com/kafoso)\n *\n * A truncation feature, where the ellipsis will be placed at a section within\n * the URL making it still somewhat human readable.\n *\n * @param {String} url\t\t\t\t\t\t A URL.\n * @param {Number} truncateLen\t\t The maximum length of the truncated output URL string.\n * @param {String} ellipsisChars\t The characters to place within the url, e.g. \"...\".\n * @return {String} The truncated URL.\n */\nAutolinker.truncate.TruncateSmart = function(url, truncateLen, ellipsisChars){\n\n\tvar ellipsisLengthBeforeParsing;\n\tvar ellipsisLength;\n\n\tif(ellipsisChars == null) {\n\t\tellipsisChars = '&hellip;';\n\t\tellipsisLength = 3;\n\t\tellipsisLengthBeforeParsing = 8;\n\t} else {\n\t\tellipsisLength = ellipsisChars.length;\n\t\tellipsisLengthBeforeParsing = ellipsisChars.length;\n\t}\n\n\tvar parse_url = function(url){ // Functionality inspired by PHP function of same name\n\t\tvar urlObj = {};\n\t\tvar urlSub = url;\n\t\tvar match = urlSub.match(/^([a-z]+):\\/\\//i);\n\t\tif (match) {\n\t\t\turlObj.scheme = match[1];\n\t\t\turlSub = urlSub.substr(match[0].length);\n\t\t}\n\t\tmatch = urlSub.match(/^(.*?)(?=(\\?|#|\\/|$))/i);\n\t\tif (match) {\n\t\t\turlObj.host = match[1];\n\t\t\turlSub = urlSub.substr(match[0].length);\n\t\t}\n\t\tmatch = urlSub.match(/^\\/(.*?)(?=(\\?|#|$))/i);\n\t\tif (match) {\n\t\t\turlObj.path = match[1];\n\t\t\turlSub = urlSub.substr(match[0].length);\n\t\t}\n\t\tmatch = urlSub.match(/^\\?(.*?)(?=(#|$))/i);\n\t\tif (match) {\n\t\t\turlObj.query = match[1];\n\t\t\turlSub = urlSub.substr(match[0].length);\n\t\t}\n\t\tmatch = urlSub.match(/^#(.*?)$/i);\n\t\tif (match) {\n\t\t\turlObj.fragment = match[1];\n\t\t\t//urlSub = urlSub.substr(match[0].length);  -- not used. Uncomment if adding another block.\n\t\t}\n\t\treturn urlObj;\n\t};\n\n\tvar buildUrl = function(urlObj){\n\t\tvar url = \"\";\n\t\tif (urlObj.scheme && urlObj.host) {\n\t\t\turl += urlObj.scheme + \"://\";\n\t\t}\n\t\tif (urlObj.host) {\n\t\t\turl += urlObj.host;\n\t\t}\n\t\tif (urlObj.path) {\n\t\t\turl += \"/\" + urlObj.path;\n\t\t}\n\t\tif (urlObj.query) {\n\t\t\turl += \"?\" + urlObj.query;\n\t\t}\n\t\tif (urlObj.fragment) {\n\t\t\turl += \"#\" + urlObj.fragment;\n\t\t}\n\t\treturn url;\n\t};\n\n\tvar buildSegment = function(segment, remainingAvailableLength){\n\t\tvar remainingAvailableLengthHalf = remainingAvailableLength/ 2,\n\t\t\t\tstartOffset = Math.ceil(remainingAvailableLengthHalf),\n\t\t\t\tendOffset = (-1)*Math.floor(remainingAvailableLengthHalf),\n\t\t\t\tend = \"\";\n\t\tif (endOffset < 0) {\n\t\t\tend = segment.substr(endOffset);\n\t\t}\n\t\treturn segment.substr(0, startOffset) + ellipsisChars + end;\n\t};\n\tif (url.length <= truncateLen) {\n\t\treturn url;\n\t}\n\tvar availableLength = truncateLen - ellipsisLength;\n\tvar urlObj = parse_url(url);\n\t// Clean up the URL\n\tif (urlObj.query) {\n\t\tvar matchQuery = urlObj.query.match(/^(.*?)(?=(\\?|\\#))(.*?)$/i);\n\t\tif (matchQuery) {\n\t\t\t// Malformed URL; two or more \"?\". Removed any content behind the 2nd.\n\t\t\turlObj.query = urlObj.query.substr(0, matchQuery[1].length);\n\t\t\turl = buildUrl(urlObj);\n\t\t}\n\t}\n\tif (url.length <= truncateLen) {\n\t\treturn url;\n\t}\n\tif (urlObj.host) {\n\t\turlObj.host = urlObj.host.replace(/^www\\./, \"\");\n\t\turl = buildUrl(urlObj);\n\t}\n\tif (url.length <= truncateLen) {\n\t\treturn url;\n\t}\n\t// Process and build the URL\n\tvar str = \"\";\n\tif (urlObj.host) {\n\t\tstr += urlObj.host;\n\t}\n\tif (str.length >= availableLength) {\n\t\tif (urlObj.host.length == truncateLen) {\n\t\t\treturn (urlObj.host.substr(0, (truncateLen - ellipsisLength)) + ellipsisChars).substr(0, availableLength + ellipsisLengthBeforeParsing);\n\t\t}\n\t\treturn buildSegment(str, availableLength).substr(0, availableLength + ellipsisLengthBeforeParsing);\n\t}\n\tvar pathAndQuery = \"\";\n\tif (urlObj.path) {\n\t\tpathAndQuery += \"/\" + urlObj.path;\n\t}\n\tif (urlObj.query) {\n\t\tpathAndQuery += \"?\" + urlObj.query;\n\t}\n\tif (pathAndQuery) {\n\t\tif ((str+pathAndQuery).length >= availableLength) {\n\t\t\tif ((str+pathAndQuery).length == truncateLen) {\n\t\t\t\treturn (str + pathAndQuery).substr(0, truncateLen);\n\t\t\t}\n\t\t\tvar remainingAvailableLength = availableLength - str.length;\n\t\t\treturn (str + buildSegment(pathAndQuery, remainingAvailableLength)).substr(0, availableLength + ellipsisLengthBeforeParsing);\n\t\t} else {\n\t\t\tstr += pathAndQuery;\n\t\t}\n\t}\n\tif (urlObj.fragment) {\n\t\tvar fragment = \"#\"+urlObj.fragment;\n\t\tif ((str+fragment).length >= availableLength) {\n\t\t\tif ((str+fragment).length == truncateLen) {\n\t\t\t\treturn (str + fragment).substr(0, truncateLen);\n\t\t\t}\n\t\t\tvar remainingAvailableLength2 = availableLength - str.length;\n\t\t\treturn (str + buildSegment(fragment, remainingAvailableLength2)).substr(0, availableLength + ellipsisLengthBeforeParsing);\n\t\t} else {\n\t\t\tstr += fragment;\n\t\t}\n\t}\n\tif (urlObj.scheme && urlObj.host) {\n\t\tvar scheme = urlObj.scheme + \"://\";\n\t\tif ((str+scheme).length < availableLength) {\n\t\t\treturn (scheme + str).substr(0, truncateLen);\n\t\t}\n\t}\n\tif (str.length <= truncateLen) {\n\t\treturn str;\n\t}\n\tvar end = \"\";\n\tif (availableLength > 0) {\n\t\tend = str.substr((-1)*Math.floor(availableLength/2));\n\t}\n\treturn (str.substr(0, Math.ceil(availableLength/2)) + ellipsisChars + end).substr(0, availableLength + ellipsisLengthBeforeParsing);\n};\n\nreturn Autolinker;\n}));\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9hdXRvbGlua2VyL2Rpc3QvQXV0b2xpbmtlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEF1dG9saW5rZXIuanNcbiAqIDEuNC4wXG4gKlxuICogQ29weXJpZ2h0KGMpIDIwMTYgR3JlZ29yeSBKYWNvYnMgPGdyZWdAZ3JlZy1qYWNvYnMuY29tPlxuICogTUlUIExpY2Vuc2VcbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZ3JlZ2phY29icy9BdXRvbGlua2VyLmpzXG4gKi9cbjsoZnVuY3Rpb24ocm9vdCwgZmFjdG9yeSkge1xuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKFtdLCBmYWN0b3J5KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgfSBlbHNlIHtcbiAgICByb290LkF1dG9saW5rZXIgPSBmYWN0b3J5KCk7XG4gIH1cbn0odGhpcywgZnVuY3Rpb24oKSB7XG4vKipcbiAqIEBjbGFzcyBBdXRvbGlua2VyXG4gKiBAZXh0ZW5kcyBPYmplY3RcbiAqXG4gKiBVdGlsaXR5IGNsYXNzIHVzZWQgdG8gcHJvY2VzcyBhIGdpdmVuIHN0cmluZyBvZiB0ZXh0LCBhbmQgd3JhcCB0aGUgbWF0Y2hlcyBpblxuICogdGhlIGFwcHJvcHJpYXRlIGFuY2hvciAoJmx0O2EmZ3Q7KSB0YWdzIHRvIHR1cm4gdGhlbSBpbnRvIGxpbmtzLlxuICpcbiAqIEFueSBvZiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIG1heSBiZSBwcm92aWRlZCBpbiBhbiBPYmplY3QgKG1hcCkgcHJvdmlkZWRcbiAqIHRvIHRoZSBBdXRvbGlua2VyIGNvbnN0cnVjdG9yLCB3aGljaCB3aWxsIGNvbmZpZ3VyZSBob3cgdGhlIHtAbGluayAjbGluayBsaW5rKCl9XG4gKiBtZXRob2Qgd2lsbCBwcm9jZXNzIHRoZSBsaW5rcy5cbiAqXG4gKiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgdmFyIGF1dG9saW5rZXIgPSBuZXcgQXV0b2xpbmtlcigge1xuICogICAgICAgICBuZXdXaW5kb3cgOiBmYWxzZSxcbiAqICAgICAgICAgdHJ1bmNhdGUgIDogMzBcbiAqICAgICB9ICk7XG4gKlxuICogICAgIHZhciBodG1sID0gYXV0b2xpbmtlci5saW5rKCBcIkpvZSB3ZW50IHRvIHd3dy55YWhvby5jb21cIiApO1xuICogICAgIC8vIHByb2R1Y2VzOiAnSm9lIHdlbnQgdG8gPGEgaHJlZj1cImh0dHA6Ly93d3cueWFob28uY29tXCI+eWFob28uY29tPC9hPidcbiAqXG4gKlxuICogVGhlIHtAbGluayAjc3RhdGljLWxpbmsgc3RhdGljIGxpbmsoKX0gbWV0aG9kIG1heSBhbHNvIGJlIHVzZWQgdG8gaW5saW5lXG4gKiBvcHRpb25zIGludG8gYSBzaW5nbGUgY2FsbCwgd2hpY2ggbWF5IGJlIG1vcmUgY29udmVuaWVudCBmb3Igb25lLW9mZiB1c2VzLlxuICogRm9yIGV4YW1wbGU6XG4gKlxuICogICAgIHZhciBodG1sID0gQXV0b2xpbmtlci5saW5rKCBcIkpvZSB3ZW50IHRvIHd3dy55YWhvby5jb21cIiwge1xuICogICAgICAgICBuZXdXaW5kb3cgOiBmYWxzZSxcbiAqICAgICAgICAgdHJ1bmNhdGUgIDogMzBcbiAqICAgICB9ICk7XG4gKiAgICAgLy8gcHJvZHVjZXM6ICdKb2Ugd2VudCB0byA8YSBocmVmPVwiaHR0cDovL3d3dy55YWhvby5jb21cIj55YWhvby5jb208L2E+J1xuICpcbiAqXG4gKiAjIyBDdXN0b20gUmVwbGFjZW1lbnRzIG9mIExpbmtzXG4gKlxuICogSWYgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBkbyBub3QgcHJvdmlkZSBlbm91Z2ggZmxleGliaWxpdHksIGEge0BsaW5rICNyZXBsYWNlRm59XG4gKiBtYXkgYmUgcHJvdmlkZWQgdG8gZnVsbHkgY3VzdG9taXplIHRoZSBvdXRwdXQgb2YgQXV0b2xpbmtlci4gVGhpcyBmdW5jdGlvbiBpc1xuICogY2FsbGVkIG9uY2UgZm9yIGVhY2ggVVJML0VtYWlsL1Bob25lIy9IYXNodGFnL01lbnRpb24gKFR3aXR0ZXIsIEluc3RhZ3JhbSlcbiAqIG1hdGNoIHRoYXQgaXMgZW5jb3VudGVyZWQuXG4gKlxuICogRm9yIGV4YW1wbGU6XG4gKlxuICogICAgIHZhciBpbnB1dCA9IFwiLi4uXCI7ICAvLyBzdHJpbmcgd2l0aCBVUkxzLCBFbWFpbCBBZGRyZXNzZXMsIFBob25lICNzLCBIYXNodGFncywgYW5kIE1lbnRpb25zIChUd2l0dGVyLCBJbnN0YWdyYW0pXG4gKlxuICogICAgIHZhciBsaW5rZWRUZXh0ID0gQXV0b2xpbmtlci5saW5rKCBpbnB1dCwge1xuICogICAgICAgICByZXBsYWNlRm4gOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG4gKiAgICAgICAgICAgICBjb25zb2xlLmxvZyggXCJocmVmID0gXCIsIG1hdGNoLmdldEFuY2hvckhyZWYoKSApO1xuICogICAgICAgICAgICAgY29uc29sZS5sb2coIFwidGV4dCA9IFwiLCBtYXRjaC5nZXRBbmNob3JUZXh0KCkgKTtcbiAqXG4gKiAgICAgICAgICAgICBzd2l0Y2goIG1hdGNoLmdldFR5cGUoKSApIHtcbiAqICAgICAgICAgICAgICAgICBjYXNlICd1cmwnIDpcbiAqICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIFwidXJsOiBcIiwgbWF0Y2guZ2V0VXJsKCkgKTtcbiAqXG4gKiAgICAgICAgICAgICAgICAgICAgIGlmKCBtYXRjaC5nZXRVcmwoKS5pbmRleE9mKCAnbXlzaXRlLmNvbScgKSA9PT0gLTEgKSB7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFnID0gbWF0Y2guYnVpbGRUYWcoKTsgIC8vIHJldHVybnMgYW4gYEF1dG9saW5rZXIuSHRtbFRhZ2AgaW5zdGFuY2UsIHdoaWNoIHByb3ZpZGVzIG11dGF0b3IgbWV0aG9kcyBmb3IgZWFzeSBjaGFuZ2VzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICB0YWcuc2V0QXR0ciggJ3JlbCcsICdub2ZvbGxvdycgKTtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5hZGRDbGFzcyggJ2V4dGVybmFsLWxpbmsnICk7XG4gKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAqXG4gKiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIGxldCBBdXRvbGlua2VyIHBlcmZvcm0gaXRzIG5vcm1hbCBhbmNob3IgdGFnIHJlcGxhY2VtZW50XG4gKiAgICAgICAgICAgICAgICAgICAgIH1cbiAqXG4gKiAgICAgICAgICAgICAgICAgY2FzZSAnZW1haWwnIDpcbiAqICAgICAgICAgICAgICAgICAgICAgdmFyIGVtYWlsID0gbWF0Y2guZ2V0RW1haWwoKTtcbiAqICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIFwiZW1haWw6IFwiLCBlbWFpbCApO1xuICpcbiAqICAgICAgICAgICAgICAgICAgICAgaWYoIGVtYWlsID09PSBcIm15QG93bi5hZGRyZXNzXCIgKSB7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBkb24ndCBhdXRvLWxpbmsgdGhpcyBwYXJ0aWN1bGFyIGVtYWlsIGFkZHJlc3M7IGxlYXZlIGFzLWlzXG4gKiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47ICAvLyBubyByZXR1cm4gdmFsdWUgd2lsbCBoYXZlIEF1dG9saW5rZXIgcGVyZm9ybSBpdHMgbm9ybWFsIGFuY2hvciB0YWcgcmVwbGFjZW1lbnQgKHNhbWUgYXMgcmV0dXJuaW5nIGB0cnVlYClcbiAqICAgICAgICAgICAgICAgICAgICAgfVxuICpcbiAqICAgICAgICAgICAgICAgICBjYXNlICdwaG9uZScgOlxuICogICAgICAgICAgICAgICAgICAgICB2YXIgcGhvbmVOdW1iZXIgPSBtYXRjaC5nZXRQaG9uZU51bWJlcigpO1xuICogICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyggcGhvbmVOdW1iZXIgKTtcbiAqXG4gKiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnPGEgaHJlZj1cImh0dHA6Ly9uZXdwbGFjZS50by5saW5rLnBob25lLm51bWJlcnMudG8vXCI+JyArIHBob25lTnVtYmVyICsgJzwvYT4nO1xuICpcbiAqICAgICAgICAgICAgICAgICBjYXNlICdoYXNodGFnJyA6XG4gKiAgICAgICAgICAgICAgICAgICAgIHZhciBoYXNodGFnID0gbWF0Y2guZ2V0SGFzaHRhZygpO1xuICogICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyggaGFzaHRhZyApO1xuICpcbiAqICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc8YSBocmVmPVwiaHR0cDovL25ld3BsYWNlLnRvLmxpbmsuaGFzaHRhZy5oYW5kbGVzLnRvL1wiPicgKyBoYXNodGFnICsgJzwvYT4nO1xuICpcbiAqICAgICAgICAgICAgICAgICBjYXNlICdtZW50aW9uJyA6XG4gKiAgICAgICAgICAgICAgICAgICAgIHZhciBtZW50aW9uID0gbWF0Y2guZ2V0TWVudGlvbigpO1xuICogICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyggbWVudGlvbiApO1xuICpcbiAqICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc8YSBocmVmPVwiaHR0cDovL25ld3BsYWNlLnRvLmxpbmsubWVudGlvbi50by9cIj4nICsgbWVudGlvbiArICc8L2E+JztcbiAqICAgICAgICAgICAgIH1cbiAqICAgICAgICAgfVxuICogICAgIH0gKTtcbiAqXG4gKlxuICogVGhlIGZ1bmN0aW9uIG1heSByZXR1cm4gdGhlIGZvbGxvd2luZyB2YWx1ZXM6XG4gKlxuICogLSBgdHJ1ZWAgKEJvb2xlYW4pOiBBbGxvdyBBdXRvbGlua2VyIHRvIHJlcGxhY2UgdGhlIG1hdGNoIGFzIGl0IG5vcm1hbGx5XG4gKiAgIHdvdWxkLlxuICogLSBgZmFsc2VgIChCb29sZWFuKTogRG8gbm90IHJlcGxhY2UgdGhlIGN1cnJlbnQgbWF0Y2ggYXQgYWxsIC0gbGVhdmUgYXMtaXMuXG4gKiAtIEFueSBTdHJpbmc6IElmIGEgc3RyaW5nIGlzIHJldHVybmVkIGZyb20gdGhlIGZ1bmN0aW9uLCB0aGUgc3RyaW5nIHdpbGwgYmVcbiAqICAgdXNlZCBkaXJlY3RseSBhcyB0aGUgcmVwbGFjZW1lbnQgSFRNTCBmb3IgdGhlIG1hdGNoLlxuICogLSBBbiB7QGxpbmsgQXV0b2xpbmtlci5IdG1sVGFnfSBpbnN0YW5jZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYnVpbGQvbW9kaWZ5XG4gKiAgIGFuIEhUTUwgdGFnIGJlZm9yZSB3cml0aW5nIG91dCBpdHMgSFRNTCB0ZXh0LlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtPYmplY3R9IFtjZmddIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvbGlua2VyIGluc3RhbmNlLFxuICogICBzcGVjaWZpZWQgaW4gYW4gT2JqZWN0IChtYXApLlxuICovXG52YXIgQXV0b2xpbmtlciA9IGZ1bmN0aW9uKCBjZmcgKSB7XG5cdGNmZyA9IGNmZyB8fCB7fTtcblxuXHR0aGlzLnZlcnNpb24gPSBBdXRvbGlua2VyLnZlcnNpb247XG5cblx0dGhpcy51cmxzID0gdGhpcy5ub3JtYWxpemVVcmxzQ2ZnKCBjZmcudXJscyApO1xuXHR0aGlzLmVtYWlsID0gdHlwZW9mIGNmZy5lbWFpbCA9PT0gJ2Jvb2xlYW4nID8gY2ZnLmVtYWlsIDogdHJ1ZTtcblx0dGhpcy5waG9uZSA9IHR5cGVvZiBjZmcucGhvbmUgPT09ICdib29sZWFuJyA/IGNmZy5waG9uZSA6IHRydWU7XG5cdHRoaXMuaGFzaHRhZyA9IGNmZy5oYXNodGFnIHx8IGZhbHNlO1xuXHR0aGlzLm1lbnRpb24gPSBjZmcubWVudGlvbiB8fCBmYWxzZTtcblx0dGhpcy5uZXdXaW5kb3cgPSB0eXBlb2YgY2ZnLm5ld1dpbmRvdyA9PT0gJ2Jvb2xlYW4nID8gY2ZnLm5ld1dpbmRvdyA6IHRydWU7XG5cdHRoaXMuc3RyaXBQcmVmaXggPSB0aGlzLm5vcm1hbGl6ZVN0cmlwUHJlZml4Q2ZnKCBjZmcuc3RyaXBQcmVmaXggKTtcblx0dGhpcy5zdHJpcFRyYWlsaW5nU2xhc2ggPSB0eXBlb2YgY2ZnLnN0cmlwVHJhaWxpbmdTbGFzaCA9PT0gJ2Jvb2xlYW4nID8gY2ZnLnN0cmlwVHJhaWxpbmdTbGFzaCA6IHRydWU7XG5cblx0Ly8gVmFsaWRhdGUgdGhlIHZhbHVlIG9mIHRoZSBgbWVudGlvbmAgY2ZnXG5cdHZhciBtZW50aW9uID0gdGhpcy5tZW50aW9uO1xuXHRpZiggbWVudGlvbiAhPT0gZmFsc2UgJiYgbWVudGlvbiAhPT0gJ3R3aXR0ZXInICYmIG1lbnRpb24gIT09ICdpbnN0YWdyYW0nICkge1xuXHRcdHRocm93IG5ldyBFcnJvciggXCJpbnZhbGlkIGBtZW50aW9uYCBjZmcgLSBzZWUgZG9jc1wiICk7XG5cdH1cblxuXHQvLyBWYWxpZGF0ZSB0aGUgdmFsdWUgb2YgdGhlIGBoYXNodGFnYCBjZmdcblx0dmFyIGhhc2h0YWcgPSB0aGlzLmhhc2h0YWc7XG5cdGlmKCBoYXNodGFnICE9PSBmYWxzZSAmJiBoYXNodGFnICE9PSAndHdpdHRlcicgJiYgaGFzaHRhZyAhPT0gJ2ZhY2Vib29rJyAmJiBoYXNodGFnICE9PSAnaW5zdGFncmFtJyApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoIFwiaW52YWxpZCBgaGFzaHRhZ2AgY2ZnIC0gc2VlIGRvY3NcIiApO1xuXHR9XG5cblx0dGhpcy50cnVuY2F0ZSA9IHRoaXMubm9ybWFsaXplVHJ1bmNhdGVDZmcoIGNmZy50cnVuY2F0ZSApO1xuXHR0aGlzLmNsYXNzTmFtZSA9IGNmZy5jbGFzc05hbWUgfHwgJyc7XG5cdHRoaXMucmVwbGFjZUZuID0gY2ZnLnJlcGxhY2VGbiB8fCBudWxsO1xuXHR0aGlzLmNvbnRleHQgPSBjZmcuY29udGV4dCB8fCB0aGlzO1xuXG5cdHRoaXMuaHRtbFBhcnNlciA9IG51bGw7XG5cdHRoaXMubWF0Y2hlcnMgPSBudWxsO1xuXHR0aGlzLnRhZ0J1aWxkZXIgPSBudWxsO1xufTtcblxuXG5cbi8qKlxuICogQXV0b21hdGljYWxseSBsaW5rcyBVUkxzLCBFbWFpbCBhZGRyZXNzZXMsIFBob25lIE51bWJlcnMsIFR3aXR0ZXIgaGFuZGxlcyxcbiAqIEhhc2h0YWdzLCBhbmQgTWVudGlvbnMgZm91bmQgaW4gdGhlIGdpdmVuIGNodW5rIG9mIEhUTUwuIERvZXMgbm90IGxpbmsgVVJMc1xuICogZm91bmQgd2l0aGluIEhUTUwgdGFncy5cbiAqXG4gKiBGb3IgaW5zdGFuY2UsIGlmIGdpdmVuIHRoZSB0ZXh0OiBgWW91IHNob3VsZCBnbyB0byBodHRwOi8vd3d3LnlhaG9vLmNvbWAsXG4gKiB0aGVuIHRoZSByZXN1bHQgd2lsbCBiZSBgWW91IHNob3VsZCBnbyB0byAmbHQ7YSBocmVmPVwiaHR0cDovL3d3dy55YWhvby5jb21cIiZndDtodHRwOi8vd3d3LnlhaG9vLmNvbSZsdDsvYSZndDtgXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiAgICAgdmFyIGxpbmtlZFRleHQgPSBBdXRvbGlua2VyLmxpbmsoIFwiR28gdG8gZ29vZ2xlLmNvbVwiLCB7IG5ld1dpbmRvdzogZmFsc2UgfSApO1xuICogICAgIC8vIFByb2R1Y2VzOiBcIkdvIHRvIDxhIGhyZWY9XCJodHRwOi8vZ29vZ2xlLmNvbVwiPmdvb2dsZS5jb208L2E+XCJcbiAqXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge1N0cmluZ30gdGV4dE9ySHRtbCBUaGUgSFRNTCBvciB0ZXh0IHRvIGZpbmQgbWF0Y2hlcyB3aXRoaW4gKGRlcGVuZGluZ1xuICogICBvbiBpZiB0aGUge0BsaW5rICN1cmxzfSwge0BsaW5rICNlbWFpbH0sIHtAbGluayAjcGhvbmV9LCB7QGxpbmsgI21lbnRpb259LFxuICogICB7QGxpbmsgI2hhc2h0YWd9LCBhbmQge0BsaW5rICNtZW50aW9ufSBvcHRpb25zIGFyZSBlbmFibGVkKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gQW55IG9mIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvbGlua2VyXG4gKiAgIGNsYXNzLCBzcGVjaWZpZWQgaW4gYW4gT2JqZWN0IChtYXApLiBTZWUgdGhlIGNsYXNzIGRlc2NyaXB0aW9uIGZvciBhblxuICogICBleGFtcGxlIGNhbGwuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBIVE1MIHRleHQsIHdpdGggbWF0Y2hlcyBhdXRvbWF0aWNhbGx5IGxpbmtlZC5cbiAqL1xuQXV0b2xpbmtlci5saW5rID0gZnVuY3Rpb24oIHRleHRPckh0bWwsIG9wdGlvbnMgKSB7XG5cdHZhciBhdXRvbGlua2VyID0gbmV3IEF1dG9saW5rZXIoIG9wdGlvbnMgKTtcblx0cmV0dXJuIGF1dG9saW5rZXIubGluayggdGV4dE9ySHRtbCApO1xufTtcblxuXG5cbi8qKlxuICogUGFyc2VzIHRoZSBpbnB1dCBgdGV4dE9ySHRtbGAgbG9va2luZyBmb3IgVVJMcywgZW1haWwgYWRkcmVzc2VzLCBwaG9uZVxuICogbnVtYmVycywgdXNlcm5hbWUgaGFuZGxlcywgYW5kIGhhc2h0YWdzIChkZXBlbmRpbmcgb24gdGhlIGNvbmZpZ3VyYXRpb25cbiAqIG9mIHRoZSBBdXRvbGlua2VyIGluc3RhbmNlKSwgYW5kIHJldHVybnMgYW4gYXJyYXkgb2Yge0BsaW5rIEF1dG9saW5rZXIubWF0Y2guTWF0Y2h9XG4gKiBvYmplY3RzIGRlc2NyaWJpbmcgdGhvc2UgbWF0Y2hlcyAod2l0aG91dCBtYWtpbmcgYW55IHJlcGxhY2VtZW50cykuXG4gKlxuICogTm90ZSB0aGF0IGlmIHBhcnNpbmcgbXVsdGlwbGUgcGllY2VzIG9mIHRleHQsIGl0IGlzIHNsaWdodGx5IG1vcmUgZWZmaWNpZW50XG4gKiB0byBjcmVhdGUgYW4gQXV0b2xpbmtlciBpbnN0YW5jZSwgYW5kIHVzZSB0aGUgaW5zdGFuY2UtbGV2ZWwge0BsaW5rICNwYXJzZX1cbiAqIG1ldGhvZC5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqICAgICB2YXIgbWF0Y2hlcyA9IEF1dG9saW5rZXIucGFyc2UoIFwiSGVsbG8gZ29vZ2xlLmNvbSwgSSBhbSBhc2RmQGFzZGYuY29tXCIsIHtcbiAqICAgICAgICAgdXJsczogdHJ1ZSxcbiAqICAgICAgICAgZW1haWw6IHRydWVcbiAqICAgICB9ICk7XG4gKlxuICogICAgIGNvbnNvbGUubG9nKCBtYXRjaGVzLmxlbmd0aCApOyAgICAgICAgICAgLy8gMlxuICogICAgIGNvbnNvbGUubG9nKCBtYXRjaGVzWyAwIF0uZ2V0VHlwZSgpICk7ICAgLy8gJ3VybCdcbiAqICAgICBjb25zb2xlLmxvZyggbWF0Y2hlc1sgMCBdLmdldFVybCgpICk7ICAgIC8vICdnb29nbGUuY29tJ1xuICogICAgIGNvbnNvbGUubG9nKCBtYXRjaGVzWyAxIF0uZ2V0VHlwZSgpICk7ICAgLy8gJ2VtYWlsJ1xuICogICAgIGNvbnNvbGUubG9nKCBtYXRjaGVzWyAxIF0uZ2V0RW1haWwoKSApOyAgLy8gJ2FzZGZAYXNkZi5jb20nXG4gKlxuICogQHN0YXRpY1xuICogQHBhcmFtIHtTdHJpbmd9IHRleHRPckh0bWwgVGhlIEhUTUwgb3IgdGV4dCB0byBmaW5kIG1hdGNoZXMgd2l0aGluXG4gKiAgIChkZXBlbmRpbmcgb24gaWYgdGhlIHtAbGluayAjdXJsc30sIHtAbGluayAjZW1haWx9LCB7QGxpbmsgI3Bob25lfSxcbiAqICAge0BsaW5rICNoYXNodGFnfSwgYW5kIHtAbGluayAjbWVudGlvbn0gb3B0aW9ucyBhcmUgZW5hYmxlZCkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIEFueSBvZiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgQXV0b2xpbmtlclxuICogICBjbGFzcywgc3BlY2lmaWVkIGluIGFuIE9iamVjdCAobWFwKS4gU2VlIHRoZSBjbGFzcyBkZXNjcmlwdGlvbiBmb3IgYW5cbiAqICAgZXhhbXBsZSBjYWxsLlxuICogQHJldHVybiB7QXV0b2xpbmtlci5tYXRjaC5NYXRjaFtdfSBUaGUgYXJyYXkgb2YgTWF0Y2hlcyBmb3VuZCBpbiB0aGVcbiAqICAgZ2l2ZW4gaW5wdXQgYHRleHRPckh0bWxgLlxuICovXG5BdXRvbGlua2VyLnBhcnNlID0gZnVuY3Rpb24oIHRleHRPckh0bWwsIG9wdGlvbnMgKSB7XG5cdHZhciBhdXRvbGlua2VyID0gbmV3IEF1dG9saW5rZXIoIG9wdGlvbnMgKTtcblx0cmV0dXJuIGF1dG9saW5rZXIucGFyc2UoIHRleHRPckh0bWwgKTtcbn07XG5cblxuLyoqXG4gKiBAc3RhdGljXG4gKiBAcHJvcGVydHkge1N0cmluZ30gdmVyc2lvbiAocmVhZG9ubHkpXG4gKlxuICogVGhlIEF1dG9saW5rZXIgdmVyc2lvbiBudW1iZXIgaW4gdGhlIGZvcm0gbWFqb3IubWlub3IucGF0Y2hcbiAqXG4gKiBFeDogMC4yNS4xXG4gKi9cbkF1dG9saW5rZXIudmVyc2lvbiA9ICcxLjQuMCc7XG5cblxuQXV0b2xpbmtlci5wcm90b3R5cGUgPSB7XG5cdGNvbnN0cnVjdG9yIDogQXV0b2xpbmtlciwgIC8vIGZpeCBjb25zdHJ1Y3RvciBwcm9wZXJ0eVxuXG5cdC8qKlxuXHQgKiBAY2ZnIHtCb29sZWFuL09iamVjdH0gW3VybHNdXG5cdCAqXG5cdCAqIGB0cnVlYCBpZiBVUkxzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGxpbmtlZCwgYGZhbHNlYCBpZiB0aGV5IHNob3VsZCBub3Rcblx0ICogYmUuIERlZmF1bHRzIHRvIGB0cnVlYC5cblx0ICpcblx0ICogRXhhbXBsZXM6XG5cdCAqXG5cdCAqICAgICB1cmxzOiB0cnVlXG5cdCAqXG5cdCAqICAgICAvLyBvclxuXHQgKlxuXHQgKiAgICAgdXJsczoge1xuXHQgKiAgICAgICAgIHNjaGVtZU1hdGNoZXMgOiB0cnVlLFxuXHQgKiAgICAgICAgIHd3d01hdGNoZXMgICAgOiB0cnVlLFxuXHQgKiAgICAgICAgIHRsZE1hdGNoZXMgICAgOiB0cnVlXG5cdCAqICAgICB9XG5cdCAqXG5cdCAqIEFzIHNob3duIGFib3ZlLCB0aGlzIG9wdGlvbiBhbHNvIGFjY2VwdHMgYW4gT2JqZWN0IGZvcm0gd2l0aCAzIHByb3BlcnRpZXNcblx0ICogdG8gYWxsb3cgZm9yIG1vcmUgY3VzdG9taXphdGlvbiBvZiB3aGF0IGV4YWN0bHkgZ2V0cyBsaW5rZWQuIEFsbCBkZWZhdWx0XG5cdCAqIHRvIGB0cnVlYDpcblx0ICpcblx0ICogQGNmZyB7Qm9vbGVhbn0gW3VybHMuc2NoZW1lTWF0Y2hlc10gYHRydWVgIHRvIG1hdGNoIFVSTHMgZm91bmQgcHJlZml4ZWRcblx0ICogICB3aXRoIGEgc2NoZW1lLCBpLmUuIGBodHRwOi8vZ29vZ2xlLmNvbWAsIG9yIGBvdGhlcitzY2hlbWU6Ly9nb29nbGUuY29tYCxcblx0ICogICBgZmFsc2VgIHRvIHByZXZlbnQgdGhlc2UgdHlwZXMgb2YgbWF0Y2hlcy5cblx0ICogQGNmZyB7Qm9vbGVhbn0gW3VybHMud3d3TWF0Y2hlc10gYHRydWVgIHRvIG1hdGNoIHVybHMgZm91bmQgcHJlZml4ZWQgd2l0aFxuXHQgKiAgIGAnd3d3LidgLCBpLmUuIGB3d3cuZ29vZ2xlLmNvbWAuIGBmYWxzZWAgdG8gcHJldmVudCB0aGVzZSB0eXBlcyBvZlxuXHQgKiAgIG1hdGNoZXMuIE5vdGUgdGhhdCBpZiB0aGUgVVJMIGhhZCBhIHByZWZpeGVkIHNjaGVtZSwgYW5kXG5cdCAqICAgYHNjaGVtZU1hdGNoZXNgIGlzIHRydWUsIGl0IHdpbGwgc3RpbGwgYmUgbGlua2VkLlxuXHQgKiBAY2ZnIHtCb29sZWFufSBbdXJscy50bGRNYXRjaGVzXSBgdHJ1ZWAgdG8gbWF0Y2ggVVJMcyB3aXRoIGtub3duIHRvcFxuXHQgKiAgIGxldmVsIGRvbWFpbnMgKC5jb20sIC5uZXQsIGV0Yy4pIHRoYXQgYXJlIG5vdCBwcmVmaXhlZCB3aXRoIGEgc2NoZW1lIG9yXG5cdCAqICAgYCd3d3cuJ2AuIFRoaXMgb3B0aW9uIGF0dGVtcHRzIHRvIG1hdGNoIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIFVSTFxuXHQgKiAgIGluIHRoZSBnaXZlbiB0ZXh0LiBFeDogYGdvb2dsZS5jb21gLCBgYXNkZi5vcmcvP3BhZ2U9MWAsIGV0Yy4gYGZhbHNlYFxuXHQgKiAgIHRvIHByZXZlbnQgdGhlc2UgdHlwZXMgb2YgbWF0Y2hlcy5cblx0ICovXG5cblx0LyoqXG5cdCAqIEBjZmcge0Jvb2xlYW59IFtlbWFpbD10cnVlXVxuXHQgKlxuXHQgKiBgdHJ1ZWAgaWYgZW1haWwgYWRkcmVzc2VzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGxpbmtlZCwgYGZhbHNlYCBpZiB0aGV5XG5cdCAqIHNob3VsZCBub3QgYmUuXG5cdCAqL1xuXG5cdC8qKlxuXHQgKiBAY2ZnIHtCb29sZWFufSBbcGhvbmU9dHJ1ZV1cblx0ICpcblx0ICogYHRydWVgIGlmIFBob25lIG51bWJlcnMgKFwiKDU1NSk1NTUtNTU1NVwiKSBzaG91bGQgYmUgYXV0b21hdGljYWxseSBsaW5rZWQsXG5cdCAqIGBmYWxzZWAgaWYgdGhleSBzaG91bGQgbm90IGJlLlxuXHQgKi9cblxuXHQvKipcblx0ICogQGNmZyB7Qm9vbGVhbi9TdHJpbmd9IFtoYXNodGFnPWZhbHNlXVxuXHQgKlxuXHQgKiBBIHN0cmluZyBmb3IgdGhlIHNlcnZpY2UgbmFtZSB0byBoYXZlIGhhc2h0YWdzIChleDogXCIjbXlIYXNodGFnXCIpXG5cdCAqIGF1dG8tbGlua2VkIHRvLiBUaGUgY3VycmVudGx5LXN1cHBvcnRlZCB2YWx1ZXMgYXJlOlxuXHQgKlxuXHQgKiAtICd0d2l0dGVyJ1xuXHQgKiAtICdmYWNlYm9vaydcblx0ICogLSAnaW5zdGFncmFtJ1xuXHQgKlxuXHQgKiBQYXNzIGBmYWxzZWAgdG8gc2tpcCBhdXRvLWxpbmtpbmcgb2YgaGFzaHRhZ3MuXG5cdCAqL1xuXG5cdC8qKlxuXHQgKiBAY2ZnIHtTdHJpbmcvQm9vbGVhbn0gW21lbnRpb249ZmFsc2VdXG5cdCAqXG5cdCAqIEEgc3RyaW5nIGZvciB0aGUgc2VydmljZSBuYW1lIHRvIGhhdmUgbWVudGlvbnMgKGV4OiBcIkBteXVzZXJcIilcblx0ICogYXV0by1saW5rZWQgdG8uIFRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBhcmU6XG5cdCAqXG5cdCAqIC0gJ3R3aXR0ZXInXG5cdCAqIC0gJ2luc3RhZ3JhbSdcblx0ICpcblx0ICogRGVmYXVsdHMgdG8gYGZhbHNlYCB0byBza2lwIGF1dG8tbGlua2luZyBvZiBtZW50aW9ucy5cblx0ICovXG5cblx0LyoqXG5cdCAqIEBjZmcge0Jvb2xlYW59IFtuZXdXaW5kb3c9dHJ1ZV1cblx0ICpcblx0ICogYHRydWVgIGlmIHRoZSBsaW5rcyBzaG91bGQgb3BlbiBpbiBhIG5ldyB3aW5kb3csIGBmYWxzZWAgb3RoZXJ3aXNlLlxuXHQgKi9cblxuXHQvKipcblx0ICogQGNmZyB7Qm9vbGVhbi9PYmplY3R9IFtzdHJpcFByZWZpeF1cblx0ICpcblx0ICogYHRydWVgIGlmICdodHRwOi8vJyAob3IgJ2h0dHBzOi8vJykgYW5kL29yIHRoZSAnd3d3Licgc2hvdWxkIGJlIHN0cmlwcGVkXG5cdCAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiBVUkwgbGlua3MnIHRleHQsIGBmYWxzZWAgb3RoZXJ3aXNlLiBEZWZhdWx0cyB0b1xuXHQgKiBgdHJ1ZWAuXG5cdCAqXG5cdCAqIEV4YW1wbGVzOlxuXHQgKlxuXHQgKiAgICAgc3RyaXBQcmVmaXg6IHRydWVcblx0ICpcblx0ICogICAgIC8vIG9yXG5cdCAqXG5cdCAqICAgICBzdHJpcFByZWZpeDoge1xuXHQgKiAgICAgICAgIHNjaGVtZSA6IHRydWUsXG5cdCAqICAgICAgICAgd3d3ICAgIDogdHJ1ZVxuXHQgKiAgICAgfVxuXHQgKlxuXHQgKiBBcyBzaG93biBhYm92ZSwgdGhpcyBvcHRpb24gYWxzbyBhY2NlcHRzIGFuIE9iamVjdCBmb3JtIHdpdGggMiBwcm9wZXJ0aWVzXG5cdCAqIHRvIGFsbG93IGZvciBtb3JlIGN1c3RvbWl6YXRpb24gb2Ygd2hhdCBleGFjdGx5IGlzIHByZXZlbnRlZCBmcm9tIGJlaW5nXG5cdCAqIGRpc3BsYXllZC4gQm90aCBkZWZhdWx0IHRvIGB0cnVlYDpcblx0ICpcblx0ICogQGNmZyB7Qm9vbGVhbn0gW3N0cmlwUHJlZml4LnNjaGVtZV0gYHRydWVgIHRvIHByZXZlbnQgdGhlIHNjaGVtZSBwYXJ0IG9mXG5cdCAqICAgYSBVUkwgbWF0Y2ggZnJvbSBiZWluZyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuIEV4YW1wbGU6XG5cdCAqICAgYCdodHRwOi8vZ29vZ2xlLmNvbSdgIHdpbGwgYmUgZGlzcGxheWVkIGFzIGAnZ29vZ2xlLmNvbSdgLiBgZmFsc2VgIHRvXG5cdCAqICAgbm90IHN0cmlwIHRoZSBzY2hlbWUuIE5PVEU6IE9ubHkgYW4gYCdodHRwOi8vJ2Agb3IgYCdodHRwczovLydgIHNjaGVtZVxuXHQgKiAgIHdpbGwgYmUgcmVtb3ZlZCwgc28gYXMgbm90IHRvIHJlbW92ZSBhIHBvdGVudGlhbGx5IGRhbmdlcm91cyBzY2hlbWVcblx0ICogICAoc3VjaCBhcyBgJ2ZpbGU6Ly8nYCBvciBgJ2phdmFzY3JpcHQ6J2ApXG5cdCAqIEBjZmcge0Jvb2xlYW59IFtzdHJpcFByZWZpeC53d3ddIHd3dyAoQm9vbGVhbik6IGB0cnVlYCB0byBwcmV2ZW50IHRoZVxuXHQgKiAgIGAnd3d3LidgIHBhcnQgb2YgYSBVUkwgbWF0Y2ggZnJvbSBiZWluZyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuIEV4OlxuXHQgKiAgIGAnd3d3Lmdvb2dsZS5jb20nYCB3aWxsIGJlIGRpc3BsYXllZCBhcyBgJ2dvb2dsZS5jb20nYC4gYGZhbHNlYCB0byBub3Rcblx0ICogICBzdHJpcCB0aGUgYCd3d3cnYC5cblx0ICovXG5cblx0LyoqXG5cdCAqIEBjZmcge0Jvb2xlYW59IFtzdHJpcFRyYWlsaW5nU2xhc2g9dHJ1ZV1cblx0ICpcblx0ICogYHRydWVgIHRvIHJlbW92ZSB0aGUgdHJhaWxpbmcgc2xhc2ggZnJvbSBVUkwgbWF0Y2hlcywgYGZhbHNlYCB0byBrZWVwXG5cdCAqICB0aGUgdHJhaWxpbmcgc2xhc2guXG5cdCAqXG5cdCAqICBFeGFtcGxlIHdoZW4gYHRydWVgOiBgaHR0cDovL2dvb2dsZS5jb20vYCB3aWxsIGJlIGRpc3BsYXllZCBhc1xuXHQgKiAgYGh0dHA6Ly9nb29nbGUuY29tYC5cblx0ICovXG5cblx0LyoqXG5cdCAqIEBjZmcge051bWJlci9PYmplY3R9IFt0cnVuY2F0ZT0wXVxuXHQgKlxuXHQgKiAjIyBOdW1iZXIgRm9ybVxuXHQgKlxuXHQgKiBBIG51bWJlciBmb3IgaG93IG1hbnkgY2hhcmFjdGVycyBtYXRjaGVkIHRleHQgc2hvdWxkIGJlIHRydW5jYXRlZCB0b1xuXHQgKiBpbnNpZGUgdGhlIHRleHQgb2YgYSBsaW5rLiBJZiB0aGUgbWF0Y2hlZCB0ZXh0IGlzIG92ZXIgdGhpcyBudW1iZXIgb2Zcblx0ICogY2hhcmFjdGVycywgaXQgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gdGhpcyBsZW5ndGggYnkgYWRkaW5nIGEgdHdvIHBlcmlvZFxuXHQgKiBlbGxpcHNpcyAoJy4uJykgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nLlxuXHQgKlxuXHQgKiBGb3IgZXhhbXBsZTogQSB1cmwgbGlrZSAnaHR0cDovL3d3dy55YWhvby5jb20vc29tZS9sb25nL3BhdGgvdG8vYS9maWxlJ1xuXHQgKiB0cnVuY2F0ZWQgdG8gMjUgY2hhcmFjdGVycyBtaWdodCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6XG5cdCAqICd5YWhvby5jb20vc29tZS9sb25nL3BhdC4uJ1xuXHQgKlxuXHQgKiBFeGFtcGxlIFVzYWdlOlxuXHQgKlxuXHQgKiAgICAgdHJ1bmNhdGU6IDI1XG5cdCAqXG5cdCAqXG5cdCAqICBEZWZhdWx0cyB0byBgMGAgZm9yIFwibm8gdHJ1bmNhdGlvbi5cIlxuXHQgKlxuXHQgKlxuXHQgKiAjIyBPYmplY3QgRm9ybVxuXHQgKlxuXHQgKiBBbiBPYmplY3QgbWF5IGFsc28gYmUgcHJvdmlkZWQgd2l0aCB0d28gcHJvcGVydGllczogYGxlbmd0aGAgKE51bWJlcikgYW5kXG5cdCAqIGBsb2NhdGlvbmAgKFN0cmluZykuIGBsb2NhdGlvbmAgbWF5IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOiAnZW5kJ1xuXHQgKiAoZGVmYXVsdCksICdtaWRkbGUnLCBvciAnc21hcnQnLlxuXHQgKlxuXHQgKiBFeGFtcGxlIFVzYWdlOlxuXHQgKlxuXHQgKiAgICAgdHJ1bmNhdGU6IHsgbGVuZ3RoOiAyNSwgbG9jYXRpb246ICdtaWRkbGUnIH1cblx0ICpcblx0ICogQGNmZyB7TnVtYmVyfSBbdHJ1bmNhdGUubGVuZ3RoPTBdIEhvdyBtYW55IGNoYXJhY3RlcnMgdG8gYWxsb3cgYmVmb3JlXG5cdCAqICAgdHJ1bmNhdGlvbiB3aWxsIG9jY3VyLiBEZWZhdWx0cyB0byBgMGAgZm9yIFwibm8gdHJ1bmNhdGlvbi5cIlxuXHQgKiBAY2ZnIHtcImVuZFwiL1wibWlkZGxlXCIvXCJzbWFydFwifSBbdHJ1bmNhdGUubG9jYXRpb249XCJlbmRcIl1cblx0ICpcblx0ICogLSAnZW5kJyAoZGVmYXVsdCk6IHdpbGwgdHJ1bmNhdGUgdXAgdG8gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzLCBhbmQgdGhlblxuXHQgKiAgIGFkZCBhbiBlbGxpcHNpcyBhdCB0aGUgZW5kLiBFeDogJ3lhaG9vLmNvbS9zb21lL2xvbmcvcGF0Li4nXG5cdCAqIC0gJ21pZGRsZSc6IHdpbGwgdHJ1bmNhdGUgYW5kIGFkZCB0aGUgZWxsaXBzaXMgaW4gdGhlIG1pZGRsZS4gRXg6XG5cdCAqICAgJ3lhaG9vLmNvbS9zLi50aC90by9hL2ZpbGUnXG5cdCAqIC0gJ3NtYXJ0JzogZm9yIFVSTHMgd2hlcmUgdGhlIGFsZ29yaXRobSBhdHRlbXB0cyB0byBzdHJpcCBvdXQgdW5uZWNlc3Nhcnlcblx0ICogICBwYXJ0cyBmaXJzdCAoc3VjaCBhcyB0aGUgJ3d3dy4nLCB0aGVuIFVSTCBzY2hlbWUsIGhhc2gsIGV0Yy4pLFxuXHQgKiAgIGF0dGVtcHRpbmcgdG8gbWFrZSB0aGUgVVJMIGh1bWFuLXJlYWRhYmxlIGJlZm9yZSBsb29raW5nIGZvciBhIGdvb2Rcblx0ICogICBwb2ludCB0byBpbnNlcnQgdGhlIGVsbGlwc2lzIGlmIGl0IGlzIHN0aWxsIHRvbyBsb25nLiBFeDpcblx0ICogICAneWFob28uY29tL3NvbWUuLnRvL2EvZmlsZScuIEZvciBtb3JlIGRldGFpbHMsIHNlZVxuXHQgKiAgIHtAbGluayBBdXRvbGlua2VyLnRydW5jYXRlLlRydW5jYXRlU21hcnR9LlxuXHQgKi9cblxuXHQvKipcblx0ICogQGNmZyB7U3RyaW5nfSBjbGFzc05hbWVcblx0ICpcblx0ICogQSBDU1MgY2xhc3MgbmFtZSB0byBhZGQgdG8gdGhlIGdlbmVyYXRlZCBsaW5rcy4gVGhpcyBjbGFzcyB3aWxsIGJlIGFkZGVkXG5cdCAqIHRvIGFsbCBsaW5rcywgYXMgd2VsbCBhcyB0aGlzIGNsYXNzIHBsdXMgbWF0Y2ggc3VmZml4ZXMgZm9yIHN0eWxpbmdcblx0ICogdXJsL2VtYWlsL3Bob25lL2hhc2h0YWcvbWVudGlvbiBsaW5rcyBkaWZmZXJlbnRseS5cblx0ICpcblx0ICogRm9yIGV4YW1wbGUsIGlmIHRoaXMgY29uZmlnIGlzIHByb3ZpZGVkIGFzIFwibXlMaW5rXCIsIHRoZW46XG5cdCAqXG5cdCAqIC0gVVJMIGxpbmtzIHdpbGwgaGF2ZSB0aGUgQ1NTIGNsYXNzZXM6IFwibXlMaW5rIG15TGluay11cmxcIlxuXHQgKiAtIEVtYWlsIGxpbmtzIHdpbGwgaGF2ZSB0aGUgQ1NTIGNsYXNzZXM6IFwibXlMaW5rIG15TGluay1lbWFpbFwiLCBhbmRcblx0ICogLSBQaG9uZSBsaW5rcyB3aWxsIGhhdmUgdGhlIENTUyBjbGFzc2VzOiBcIm15TGluayBteUxpbmstcGhvbmVcIlxuXHQgKiAtIEhhc2h0YWcgbGlua3Mgd2lsbCBoYXZlIHRoZSBDU1MgY2xhc3NlczogXCJteUxpbmsgbXlMaW5rLWhhc2h0YWdcIlxuXHQgKiAtIE1lbnRpb24gbGlua3Mgd2lsbCBoYXZlIHRoZSBDU1MgY2xhc3NlczogXCJteUxpbmsgbXlMaW5rLW1lbnRpb24gbXlMaW5rLVt0eXBlXVwiXG5cdCAqICAgd2hlcmUgW3R5cGVdIGlzIGVpdGhlciBcImluc3RhZ3JhbVwiIG9yIFwidHdpdHRlclwiXG5cdCAqL1xuXG5cdC8qKlxuXHQgKiBAY2ZnIHtGdW5jdGlvbn0gcmVwbGFjZUZuXG5cdCAqXG5cdCAqIEEgZnVuY3Rpb24gdG8gaW5kaXZpZHVhbGx5IHByb2Nlc3MgZWFjaCBtYXRjaCBmb3VuZCBpbiB0aGUgaW5wdXQgc3RyaW5nLlxuXHQgKlxuXHQgKiBTZWUgdGhlIGNsYXNzJ3MgZGVzY3JpcHRpb24gZm9yIHVzYWdlLlxuXHQgKlxuXHQgKiBUaGUgYHJlcGxhY2VGbmAgY2FuIGJlIGNhbGxlZCB3aXRoIGEgZGlmZmVyZW50IGNvbnRleHQgb2JqZWN0IChgdGhpc2Bcblx0ICogcmVmZXJlbmNlKSB1c2luZyB0aGUge0BsaW5rICNjb250ZXh0fSBjZmcuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXI6XG5cdCAqXG5cdCAqIEBjZmcge0F1dG9saW5rZXIubWF0Y2guTWF0Y2h9IHJlcGxhY2VGbi5tYXRjaCBUaGUgTWF0Y2ggaW5zdGFuY2Ugd2hpY2hcblx0ICogICBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWF0Y2ggdGhhdCB0aGUgYHJlcGxhY2VGbmBcblx0ICogICBpcyBjdXJyZW50bHkgcHJvY2Vzc2luZy4gU2VlIHtAbGluayBBdXRvbGlua2VyLm1hdGNoLk1hdGNofSBzdWJjbGFzc2VzXG5cdCAqICAgZm9yIGRldGFpbHMuXG5cdCAqL1xuXG5cdC8qKlxuXHQgKiBAY2ZnIHtPYmplY3R9IGNvbnRleHRcblx0ICpcblx0ICogVGhlIGNvbnRleHQgb2JqZWN0IChgdGhpc2AgcmVmZXJlbmNlKSB0byBjYWxsIHRoZSBgcmVwbGFjZUZuYCB3aXRoLlxuXHQgKlxuXHQgKiBEZWZhdWx0cyB0byB0aGlzIEF1dG9saW5rZXIgaW5zdGFuY2UuXG5cdCAqL1xuXG5cblx0LyoqXG5cdCAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB2ZXJzaW9uIChyZWFkb25seSlcblx0ICpcblx0ICogVGhlIEF1dG9saW5rZXIgdmVyc2lvbiBudW1iZXIgaW4gdGhlIGZvcm0gbWFqb3IubWlub3IucGF0Y2hcblx0ICpcblx0ICogRXg6IDAuMjUuMVxuXHQgKi9cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogQHByb3BlcnR5IHtBdXRvbGlua2VyLmh0bWxQYXJzZXIuSHRtbFBhcnNlcn0gaHRtbFBhcnNlclxuXHQgKlxuXHQgKiBUaGUgSHRtbFBhcnNlciBpbnN0YW5jZSB1c2VkIHRvIHNraXAgb3ZlciBIVE1MIHRhZ3MsIHdoaWxlIGZpbmRpbmcgdGV4dFxuXHQgKiBub2RlcyB0byBwcm9jZXNzLiBUaGlzIGlzIGxhemlseSBpbnN0YW50aWF0ZWQgaW4gdGhlIHtAbGluayAjZ2V0SHRtbFBhcnNlcn1cblx0ICogbWV0aG9kLlxuXHQgKi9cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogQHByb3BlcnR5IHtBdXRvbGlua2VyLm1hdGNoZXIuTWF0Y2hlcltdfSBtYXRjaGVyc1xuXHQgKlxuXHQgKiBUaGUge0BsaW5rIEF1dG9saW5rZXIubWF0Y2hlci5NYXRjaGVyfSBpbnN0YW5jZXMgZm9yIHRoaXMgQXV0b2xpbmtlclxuXHQgKiBpbnN0YW5jZS5cblx0ICpcblx0ICogVGhpcyBpcyBsYXppbHkgY3JlYXRlZCBpbiB7QGxpbmsgI2dldE1hdGNoZXJzfS5cblx0ICovXG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwcm9wZXJ0eSB7QXV0b2xpbmtlci5BbmNob3JUYWdCdWlsZGVyfSB0YWdCdWlsZGVyXG5cdCAqXG5cdCAqIFRoZSBBbmNob3JUYWdCdWlsZGVyIGluc3RhbmNlIHVzZWQgdG8gYnVpbGQgbWF0Y2ggcmVwbGFjZW1lbnQgYW5jaG9yIHRhZ3MuXG5cdCAqIE5vdGU6IHRoaXMgaXMgbGF6aWx5IGluc3RhbnRpYXRlZCBpbiB0aGUge0BsaW5rICNnZXRUYWdCdWlsZGVyfSBtZXRob2QuXG5cdCAqL1xuXG5cblx0LyoqXG5cdCAqIE5vcm1hbGl6ZXMgdGhlIHtAbGluayAjdXJsc30gY29uZmlnIGludG8gYW4gT2JqZWN0IHdpdGggMyBwcm9wZXJ0aWVzOlxuXHQgKiBgc2NoZW1lTWF0Y2hlc2AsIGB3d3dNYXRjaGVzYCwgYW5kIGB0bGRNYXRjaGVzYCwgYWxsIEJvb2xlYW5zLlxuXHQgKlxuXHQgKiBTZWUge0BsaW5rICN1cmxzfSBjb25maWcgZm9yIGRldGFpbHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbi9PYmplY3R9IHVybHNcblx0ICogQHJldHVybiB7T2JqZWN0fVxuXHQgKi9cblx0bm9ybWFsaXplVXJsc0NmZyA6IGZ1bmN0aW9uKCB1cmxzICkge1xuXHRcdGlmKCB1cmxzID09IG51bGwgKSB1cmxzID0gdHJ1ZTsgIC8vIGRlZmF1bHQgdG8gYHRydWVgXG5cblx0XHRpZiggdHlwZW9mIHVybHMgPT09ICdib29sZWFuJyApIHtcblx0XHRcdHJldHVybiB7IHNjaGVtZU1hdGNoZXM6IHVybHMsIHd3d01hdGNoZXM6IHVybHMsIHRsZE1hdGNoZXM6IHVybHMgfTtcblxuXHRcdH0gZWxzZSB7ICAvLyBvYmplY3QgZm9ybVxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0c2NoZW1lTWF0Y2hlcyA6IHR5cGVvZiB1cmxzLnNjaGVtZU1hdGNoZXMgPT09ICdib29sZWFuJyA/IHVybHMuc2NoZW1lTWF0Y2hlcyA6IHRydWUsXG5cdFx0XHRcdHd3d01hdGNoZXMgICAgOiB0eXBlb2YgdXJscy53d3dNYXRjaGVzID09PSAnYm9vbGVhbicgICAgPyB1cmxzLnd3d01hdGNoZXMgICAgOiB0cnVlLFxuXHRcdFx0XHR0bGRNYXRjaGVzICAgIDogdHlwZW9mIHVybHMudGxkTWF0Y2hlcyA9PT0gJ2Jvb2xlYW4nICAgID8gdXJscy50bGRNYXRjaGVzICAgIDogdHJ1ZVxuXHRcdFx0fTtcblx0XHR9XG5cdH0sXG5cblxuXHQvKipcblx0ICogTm9ybWFsaXplcyB0aGUge0BsaW5rICNzdHJpcFByZWZpeH0gY29uZmlnIGludG8gYW4gT2JqZWN0IHdpdGggMlxuXHQgKiBwcm9wZXJ0aWVzOiBgc2NoZW1lYCwgYW5kIGB3d3dgIC0gYm90aCBCb29sZWFucy5cblx0ICpcblx0ICogU2VlIHtAbGluayAjc3RyaXBQcmVmaXh9IGNvbmZpZyBmb3IgZGV0YWlscy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtCb29sZWFuL09iamVjdH0gc3RyaXBQcmVmaXhcblx0ICogQHJldHVybiB7T2JqZWN0fVxuXHQgKi9cblx0bm9ybWFsaXplU3RyaXBQcmVmaXhDZmcgOiBmdW5jdGlvbiggc3RyaXBQcmVmaXggKSB7XG5cdFx0aWYoIHN0cmlwUHJlZml4ID09IG51bGwgKSBzdHJpcFByZWZpeCA9IHRydWU7ICAvLyBkZWZhdWx0IHRvIGB0cnVlYFxuXG5cdFx0aWYoIHR5cGVvZiBzdHJpcFByZWZpeCA9PT0gJ2Jvb2xlYW4nICkge1xuXHRcdFx0cmV0dXJuIHsgc2NoZW1lOiBzdHJpcFByZWZpeCwgd3d3OiBzdHJpcFByZWZpeCB9O1xuXG5cdFx0fSBlbHNlIHsgIC8vIG9iamVjdCBmb3JtXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzY2hlbWUgOiB0eXBlb2Ygc3RyaXBQcmVmaXguc2NoZW1lID09PSAnYm9vbGVhbicgPyBzdHJpcFByZWZpeC5zY2hlbWUgOiB0cnVlLFxuXHRcdFx0XHR3d3cgICAgOiB0eXBlb2Ygc3RyaXBQcmVmaXgud3d3ID09PSAnYm9vbGVhbicgICAgPyBzdHJpcFByZWZpeC53d3cgICAgOiB0cnVlXG5cdFx0XHR9O1xuXHRcdH1cblx0fSxcblxuXG5cdC8qKlxuXHQgKiBOb3JtYWxpemVzIHRoZSB7QGxpbmsgI3RydW5jYXRlfSBjb25maWcgaW50byBhbiBPYmplY3Qgd2l0aCAyIHByb3BlcnRpZXM6XG5cdCAqIGBsZW5ndGhgIChOdW1iZXIpLCBhbmQgYGxvY2F0aW9uYCAoU3RyaW5nKS5cblx0ICpcblx0ICogU2VlIHtAbGluayAjdHJ1bmNhdGV9IGNvbmZpZyBmb3IgZGV0YWlscy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXIvT2JqZWN0fSB0cnVuY2F0ZVxuXHQgKiBAcmV0dXJuIHtPYmplY3R9XG5cdCAqL1xuXHRub3JtYWxpemVUcnVuY2F0ZUNmZyA6IGZ1bmN0aW9uKCB0cnVuY2F0ZSApIHtcblx0XHRpZiggdHlwZW9mIHRydW5jYXRlID09PSAnbnVtYmVyJyApIHtcblx0XHRcdHJldHVybiB7IGxlbmd0aDogdHJ1bmNhdGUsIGxvY2F0aW9uOiAnZW5kJyB9O1xuXG5cdFx0fSBlbHNlIHsgIC8vIG9iamVjdCwgb3IgdW5kZWZpbmVkL251bGxcblx0XHRcdHJldHVybiBBdXRvbGlua2VyLlV0aWwuZGVmYXVsdHMoIHRydW5jYXRlIHx8IHt9LCB7XG5cdFx0XHRcdGxlbmd0aCAgIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuXHRcdFx0XHRsb2NhdGlvbiA6ICdlbmQnXG5cdFx0XHR9ICk7XG5cdFx0fVxuXHR9LFxuXG5cblx0LyoqXG5cdCAqIFBhcnNlcyB0aGUgaW5wdXQgYHRleHRPckh0bWxgIGxvb2tpbmcgZm9yIFVSTHMsIGVtYWlsIGFkZHJlc3NlcywgcGhvbmVcblx0ICogbnVtYmVycywgdXNlcm5hbWUgaGFuZGxlcywgYW5kIGhhc2h0YWdzIChkZXBlbmRpbmcgb24gdGhlIGNvbmZpZ3VyYXRpb25cblx0ICogb2YgdGhlIEF1dG9saW5rZXIgaW5zdGFuY2UpLCBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB7QGxpbmsgQXV0b2xpbmtlci5tYXRjaC5NYXRjaH1cblx0ICogb2JqZWN0cyBkZXNjcmliaW5nIHRob3NlIG1hdGNoZXMgKHdpdGhvdXQgbWFraW5nIGFueSByZXBsYWNlbWVudHMpLlxuXHQgKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSB7QGxpbmsgI2xpbmt9IG1ldGhvZCwgYnV0IGNhbiBhbHNvIGJlIHVzZWQgdG9cblx0ICogc2ltcGx5IGRvIHBhcnNpbmcgb2YgdGhlIGlucHV0IGluIG9yZGVyIHRvIGRpc2NvdmVyIHdoYXQga2luZHMgb2YgbGlua3Ncblx0ICogdGhlcmUgYXJlIGFuZCBob3cgbWFueS5cblx0ICpcblx0ICogRXhhbXBsZSB1c2FnZTpcblx0ICpcblx0ICogICAgIHZhciBhdXRvbGlua2VyID0gbmV3IEF1dG9saW5rZXIoIHtcblx0ICogICAgICAgICB1cmxzOiB0cnVlLFxuXHQgKiAgICAgICAgIGVtYWlsOiB0cnVlXG5cdCAqICAgICB9ICk7XG5cdCAqXG5cdCAqICAgICB2YXIgbWF0Y2hlcyA9IGF1dG9saW5rZXIucGFyc2UoIFwiSGVsbG8gZ29vZ2xlLmNvbSwgSSBhbSBhc2RmQGFzZGYuY29tXCIgKTtcblx0ICpcblx0ICogICAgIGNvbnNvbGUubG9nKCBtYXRjaGVzLmxlbmd0aCApOyAgICAgICAgICAgLy8gMlxuXHQgKiAgICAgY29uc29sZS5sb2coIG1hdGNoZXNbIDAgXS5nZXRUeXBlKCkgKTsgICAvLyAndXJsJ1xuXHQgKiAgICAgY29uc29sZS5sb2coIG1hdGNoZXNbIDAgXS5nZXRVcmwoKSApOyAgICAvLyAnZ29vZ2xlLmNvbSdcblx0ICogICAgIGNvbnNvbGUubG9nKCBtYXRjaGVzWyAxIF0uZ2V0VHlwZSgpICk7ICAgLy8gJ2VtYWlsJ1xuXHQgKiAgICAgY29uc29sZS5sb2coIG1hdGNoZXNbIDEgXS5nZXRFbWFpbCgpICk7ICAvLyAnYXNkZkBhc2RmLmNvbSdcblx0ICpcblx0ICogQHBhcmFtIHtTdHJpbmd9IHRleHRPckh0bWwgVGhlIEhUTUwgb3IgdGV4dCB0byBmaW5kIG1hdGNoZXMgd2l0aGluXG5cdCAqICAgKGRlcGVuZGluZyBvbiBpZiB0aGUge0BsaW5rICN1cmxzfSwge0BsaW5rICNlbWFpbH0sIHtAbGluayAjcGhvbmV9LFxuXHQgKiAgIHtAbGluayAjaGFzaHRhZ30sIGFuZCB7QGxpbmsgI21lbnRpb259IG9wdGlvbnMgYXJlIGVuYWJsZWQpLlxuXHQgKiBAcmV0dXJuIHtBdXRvbGlua2VyLm1hdGNoLk1hdGNoW119IFRoZSBhcnJheSBvZiBNYXRjaGVzIGZvdW5kIGluIHRoZVxuXHQgKiAgIGdpdmVuIGlucHV0IGB0ZXh0T3JIdG1sYC5cblx0ICovXG5cdHBhcnNlIDogZnVuY3Rpb24oIHRleHRPckh0bWwgKSB7XG5cdFx0dmFyIGh0bWxQYXJzZXIgPSB0aGlzLmdldEh0bWxQYXJzZXIoKSxcblx0XHQgICAgaHRtbE5vZGVzID0gaHRtbFBhcnNlci5wYXJzZSggdGV4dE9ySHRtbCApLFxuXHRcdCAgICBhbmNob3JUYWdTdGFja0NvdW50ID0gMCwgIC8vIHVzZWQgdG8gb25seSBwcm9jZXNzIHRleHQgYXJvdW5kIGFuY2hvciB0YWdzLCBhbmQgYW55IGlubmVyIHRleHQvaHRtbCB0aGV5IG1heSBoYXZlO1xuXHRcdCAgICBtYXRjaGVzID0gW107XG5cblx0XHQvLyBGaW5kIGFsbCBtYXRjaGVzIHdpdGhpbiB0aGUgYHRleHRPckh0bWxgIChidXQgbm90IG1hdGNoZXMgdGhhdCBhcmVcblx0XHQvLyBhbHJlYWR5IG5lc3RlZCB3aXRoaW4gPGE+IHRhZ3MpXG5cdFx0Zm9yKCB2YXIgaSA9IDAsIGxlbiA9IGh0bWxOb2Rlcy5sZW5ndGg7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdHZhciBub2RlID0gaHRtbE5vZGVzWyBpIF0sXG5cdFx0XHQgICAgbm9kZVR5cGUgPSBub2RlLmdldFR5cGUoKTtcblxuXHRcdFx0aWYoIG5vZGVUeXBlID09PSAnZWxlbWVudCcgJiYgbm9kZS5nZXRUYWdOYW1lKCkgPT09ICdhJyApIHsgIC8vIFByb2Nlc3MgSFRNTCBhbmNob3IgZWxlbWVudCBub2RlcyBpbiB0aGUgaW5wdXQgYHRleHRPckh0bWxgIHRvIGZpbmQgb3V0IHdoZW4gd2UncmUgd2l0aGluIGFuIDxhPiB0YWdcblx0XHRcdFx0aWYoICFub2RlLmlzQ2xvc2luZygpICkgeyAgLy8gaXQncyB0aGUgc3RhcnQgPGE+IHRhZ1xuXHRcdFx0XHRcdGFuY2hvclRhZ1N0YWNrQ291bnQrKztcblx0XHRcdFx0fSBlbHNlIHsgIC8vIGl0J3MgdGhlIGVuZCA8L2E+IHRhZ1xuXHRcdFx0XHRcdGFuY2hvclRhZ1N0YWNrQ291bnQgPSBNYXRoLm1heCggYW5jaG9yVGFnU3RhY2tDb3VudCAtIDEsIDAgKTsgIC8vIGF0dGVtcHQgdG8gaGFuZGxlIGV4dHJhbmVvdXMgPC9hPiB0YWdzIGJ5IG1ha2luZyBzdXJlIHRoZSBzdGFjayBjb3VudCBuZXZlciBnb2VzIGJlbG93IDBcblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYoIG5vZGVUeXBlID09PSAndGV4dCcgJiYgYW5jaG9yVGFnU3RhY2tDb3VudCA9PT0gMCApIHsgIC8vIFByb2Nlc3MgdGV4dCBub2RlcyB0aGF0IGFyZSBub3Qgd2l0aGluIGFuIDxhPiB0YWdcblx0XHRcdFx0dmFyIHRleHROb2RlTWF0Y2hlcyA9IHRoaXMucGFyc2VUZXh0KCBub2RlLmdldFRleHQoKSwgbm9kZS5nZXRPZmZzZXQoKSApO1xuXG5cdFx0XHRcdG1hdGNoZXMucHVzaC5hcHBseSggbWF0Y2hlcywgdGV4dE5vZGVNYXRjaGVzICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cblx0XHQvLyBBZnRlciB3ZSBoYXZlIGZvdW5kIGFsbCBtYXRjaGVzLCByZW1vdmUgc3Vic2VxdWVudCBtYXRjaGVzIHRoYXRcblx0XHQvLyBvdmVybGFwIHdpdGggYSBwcmV2aW91cyBtYXRjaC4gVGhpcyBjYW4gaGFwcGVuIGZvciBpbnN0YW5jZSB3aXRoIFVSTHMsXG5cdFx0Ly8gd2hlcmUgdGhlIHVybCAnZ29vZ2xlLmNvbS8jbGluaycgd291bGQgbWF0Y2ggJyNsaW5rJyBhcyBhIGhhc2h0YWcuXG5cdFx0bWF0Y2hlcyA9IHRoaXMuY29tcGFjdE1hdGNoZXMoIG1hdGNoZXMgKTtcblxuXHRcdC8vIEFuZCBmaW5hbGx5LCByZW1vdmUgbWF0Y2hlcyBmb3IgbWF0Y2ggdHlwZXMgdGhhdCBoYXZlIGJlZW4gdHVybmVkXG5cdFx0Ly8gb2ZmLiBXZSBuZWVkZWQgdG8gaGF2ZSBhbGwgbWF0Y2ggdHlwZXMgdHVybmVkIG9uIGluaXRpYWxseSBzbyB0aGF0XG5cdFx0Ly8gdGhpbmdzIGxpa2UgaGFzaHRhZ3MgY291bGQgYmUgZmlsdGVyZWQgb3V0IGlmIHRoZXkgd2VyZSByZWFsbHkganVzdFxuXHRcdC8vIHBhcnQgb2YgYSBVUkwgbWF0Y2ggKGZvciBpbnN0YW5jZSwgYXMgYSBuYW1lZCBhbmNob3IpLlxuXHRcdG1hdGNoZXMgPSB0aGlzLnJlbW92ZVVud2FudGVkTWF0Y2hlcyggbWF0Y2hlcyApO1xuXG5cdFx0cmV0dXJuIG1hdGNoZXM7XG5cdH0sXG5cblxuXHQvKipcblx0ICogQWZ0ZXIgd2UgaGF2ZSBmb3VuZCBhbGwgbWF0Y2hlcywgd2UgbmVlZCB0byByZW1vdmUgc3Vic2VxdWVudCBtYXRjaGVzXG5cdCAqIHRoYXQgb3ZlcmxhcCB3aXRoIGEgcHJldmlvdXMgbWF0Y2guIFRoaXMgY2FuIGhhcHBlbiBmb3IgaW5zdGFuY2Ugd2l0aFxuXHQgKiBVUkxzLCB3aGVyZSB0aGUgdXJsICdnb29nbGUuY29tLyNsaW5rJyB3b3VsZCBtYXRjaCAnI2xpbmsnIGFzIGEgaGFzaHRhZy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtBdXRvbGlua2VyLm1hdGNoLk1hdGNoW119IG1hdGNoZXNcblx0ICogQHJldHVybiB7QXV0b2xpbmtlci5tYXRjaC5NYXRjaFtdfVxuXHQgKi9cblx0Y29tcGFjdE1hdGNoZXMgOiBmdW5jdGlvbiggbWF0Y2hlcyApIHtcblx0XHQvLyBGaXJzdCwgdGhlIG1hdGNoZXMgbmVlZCB0byBiZSBzb3J0ZWQgaW4gb3JkZXIgb2Ygb2Zmc2V0XG5cdFx0bWF0Y2hlcy5zb3J0KCBmdW5jdGlvbiggYSwgYiApIHsgcmV0dXJuIGEuZ2V0T2Zmc2V0KCkgLSBiLmdldE9mZnNldCgpOyB9ICk7XG5cblx0XHRmb3IoIHZhciBpID0gMDsgaSA8IG1hdGNoZXMubGVuZ3RoIC0gMTsgaSsrICkge1xuXHRcdFx0dmFyIG1hdGNoID0gbWF0Y2hlc1sgaSBdLFxuXHRcdFx0ICAgIGVuZElkeCA9IG1hdGNoLmdldE9mZnNldCgpICsgbWF0Y2guZ2V0TWF0Y2hlZFRleHQoKS5sZW5ndGg7XG5cblx0XHRcdC8vIFJlbW92ZSBzdWJzZXF1ZW50IG1hdGNoZXMgdGhhdCBvdmVybGFwIHdpdGggdGhlIGN1cnJlbnQgbWF0Y2hcblx0XHRcdHdoaWxlKCBpICsgMSA8IG1hdGNoZXMubGVuZ3RoICYmIG1hdGNoZXNbIGkgKyAxIF0uZ2V0T2Zmc2V0KCkgPD0gZW5kSWR4ICkge1xuXHRcdFx0XHRtYXRjaGVzLnNwbGljZSggaSArIDEsIDEgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0Y2hlcztcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIG1hdGNoZXMgZm9yIG1hdGNoZXJzIHRoYXQgd2VyZSB0dXJuZWQgb2ZmIGluIHRoZSBvcHRpb25zLiBGb3Jcblx0ICogZXhhbXBsZSwgaWYge0BsaW5rICNoYXNodGFnIGhhc2h0YWdzfSB3ZXJlIG5vdCB0byBiZSBtYXRjaGVkLCB3ZSdsbFxuXHQgKiByZW1vdmUgdGhlbSBmcm9tIHRoZSBgbWF0Y2hlc2AgYXJyYXkgaGVyZS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtBdXRvbGlua2VyLm1hdGNoLk1hdGNoW119IG1hdGNoZXMgVGhlIGFycmF5IG9mIG1hdGNoZXMgdG8gcmVtb3ZlXG5cdCAqICAgdGhlIHVud2FudGVkIG1hdGNoZXMgZnJvbS4gTm90ZTogdGhpcyBhcnJheSBpcyBtdXRhdGVkIGZvciB0aGVcblx0ICogICByZW1vdmFscy5cblx0ICogQHJldHVybiB7QXV0b2xpbmtlci5tYXRjaC5NYXRjaFtdfSBUaGUgbXV0YXRlZCBpbnB1dCBgbWF0Y2hlc2AgYXJyYXkuXG5cdCAqL1xuXHRyZW1vdmVVbndhbnRlZE1hdGNoZXMgOiBmdW5jdGlvbiggbWF0Y2hlcyApIHtcblx0XHR2YXIgcmVtb3ZlID0gQXV0b2xpbmtlci5VdGlsLnJlbW92ZTtcblxuXHRcdGlmKCAhdGhpcy5oYXNodGFnICkgcmVtb3ZlKCBtYXRjaGVzLCBmdW5jdGlvbiggbWF0Y2ggKSB7IHJldHVybiBtYXRjaC5nZXRUeXBlKCkgPT09ICdoYXNodGFnJzsgfSApO1xuXHRcdGlmKCAhdGhpcy5lbWFpbCApICAgcmVtb3ZlKCBtYXRjaGVzLCBmdW5jdGlvbiggbWF0Y2ggKSB7IHJldHVybiBtYXRjaC5nZXRUeXBlKCkgPT09ICdlbWFpbCc7IH0gKTtcblx0XHRpZiggIXRoaXMucGhvbmUgKSAgIHJlbW92ZSggbWF0Y2hlcywgZnVuY3Rpb24oIG1hdGNoICkgeyByZXR1cm4gbWF0Y2guZ2V0VHlwZSgpID09PSAncGhvbmUnOyB9ICk7XG5cdFx0aWYoICF0aGlzLm1lbnRpb24gKSByZW1vdmUoIG1hdGNoZXMsIGZ1bmN0aW9uKCBtYXRjaCApIHsgcmV0dXJuIG1hdGNoLmdldFR5cGUoKSA9PT0gJ21lbnRpb24nOyB9ICk7XG5cdFx0aWYoICF0aGlzLnVybHMuc2NoZW1lTWF0Y2hlcyApIHtcblx0XHRcdHJlbW92ZSggbWF0Y2hlcywgZnVuY3Rpb24oIG0gKSB7IHJldHVybiBtLmdldFR5cGUoKSA9PT0gJ3VybCcgJiYgbS5nZXRVcmxNYXRjaFR5cGUoKSA9PT0gJ3NjaGVtZSc7IH0gKTtcblx0XHR9XG5cdFx0aWYoICF0aGlzLnVybHMud3d3TWF0Y2hlcyApIHtcblx0XHRcdHJlbW92ZSggbWF0Y2hlcywgZnVuY3Rpb24oIG0gKSB7IHJldHVybiBtLmdldFR5cGUoKSA9PT0gJ3VybCcgJiYgbS5nZXRVcmxNYXRjaFR5cGUoKSA9PT0gJ3d3dyc7IH0gKTtcblx0XHR9XG5cdFx0aWYoICF0aGlzLnVybHMudGxkTWF0Y2hlcyApIHtcblx0XHRcdHJlbW92ZSggbWF0Y2hlcywgZnVuY3Rpb24oIG0gKSB7IHJldHVybiBtLmdldFR5cGUoKSA9PT0gJ3VybCcgJiYgbS5nZXRVcmxNYXRjaFR5cGUoKSA9PT0gJ3RsZCc7IH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0Y2hlcztcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBQYXJzZXMgdGhlIGlucHV0IGB0ZXh0YCBsb29raW5nIGZvciBVUkxzLCBlbWFpbCBhZGRyZXNzZXMsIHBob25lXG5cdCAqIG51bWJlcnMsIHVzZXJuYW1lIGhhbmRsZXMsIGFuZCBoYXNodGFncyAoZGVwZW5kaW5nIG9uIHRoZSBjb25maWd1cmF0aW9uXG5cdCAqIG9mIHRoZSBBdXRvbGlua2VyIGluc3RhbmNlKSwgYW5kIHJldHVybnMgYW4gYXJyYXkgb2Yge0BsaW5rIEF1dG9saW5rZXIubWF0Y2guTWF0Y2h9XG5cdCAqIG9iamVjdHMgZGVzY3JpYmluZyB0aG9zZSBtYXRjaGVzLlxuXHQgKlxuXHQgKiBUaGlzIG1ldGhvZCBwcm9jZXNzZXMgYSAqKm5vbi1IVE1MIHN0cmluZyoqLCBhbmQgaXMgdXNlZCB0byBwYXJzZSBhbmRcblx0ICogbWF0Y2ggd2l0aGluIHRoZSB0ZXh0IG5vZGVzIG9mIGFuIEhUTUwgc3RyaW5nLiBUaGlzIG1ldGhvZCBpcyB1c2VkXG5cdCAqIGludGVybmFsbHkgYnkge0BsaW5rICNwYXJzZX0uXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IHRvIGZpbmQgbWF0Y2hlcyB3aXRoaW4gKGRlcGVuZGluZyBvbiBpZiB0aGVcblx0ICogICB7QGxpbmsgI3VybHN9LCB7QGxpbmsgI2VtYWlsfSwge0BsaW5rICNwaG9uZX0sXG5cdCAqICAge0BsaW5rICNoYXNodGFnfSwgYW5kIHtAbGluayAjbWVudGlvbn0gb3B0aW9ucyBhcmUgZW5hYmxlZCkuIFRoaXMgbXVzdCBiZSBhIG5vbi1IVE1MIHN0cmluZy5cblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvZmZzZXQ9MF0gVGhlIG9mZnNldCBvZiB0aGUgdGV4dCBub2RlIHdpdGhpbiB0aGVcblx0ICogICBvcmlnaW5hbCBzdHJpbmcuIFRoaXMgaXMgdXNlZCB3aGVuIHBhcnNpbmcgd2l0aCB0aGUge0BsaW5rICNwYXJzZX1cblx0ICogICBtZXRob2QgdG8gZ2VuZXJhdGUgY29ycmVjdCBvZmZzZXRzIHdpdGhpbiB0aGUge0BsaW5rIEF1dG9saW5rZXIubWF0Y2guTWF0Y2h9XG5cdCAqICAgaW5zdGFuY2VzLCBidXQgbWF5IGJlIG9taXR0ZWQgaWYgY2FsbGluZyB0aGlzIG1ldGhvZCBwdWJsaWNseS5cblx0ICogQHJldHVybiB7QXV0b2xpbmtlci5tYXRjaC5NYXRjaFtdfSBUaGUgYXJyYXkgb2YgTWF0Y2hlcyBmb3VuZCBpbiB0aGVcblx0ICogICBnaXZlbiBpbnB1dCBgdGV4dGAuXG5cdCAqL1xuXHRwYXJzZVRleHQgOiBmdW5jdGlvbiggdGV4dCwgb2Zmc2V0ICkge1xuXHRcdG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXHRcdHZhciBtYXRjaGVycyA9IHRoaXMuZ2V0TWF0Y2hlcnMoKSxcblx0XHQgICAgbWF0Y2hlcyA9IFtdO1xuXG5cdFx0Zm9yKCB2YXIgaSA9IDAsIG51bU1hdGNoZXJzID0gbWF0Y2hlcnMubGVuZ3RoOyBpIDwgbnVtTWF0Y2hlcnM7IGkrKyApIHtcblx0XHRcdHZhciB0ZXh0TWF0Y2hlcyA9IG1hdGNoZXJzWyBpIF0ucGFyc2VNYXRjaGVzKCB0ZXh0ICk7XG5cblx0XHRcdC8vIENvcnJlY3QgdGhlIG9mZnNldCBvZiBlYWNoIG9mIHRoZSBtYXRjaGVzLiBUaGV5IGFyZSBvcmlnaW5hbGx5XG5cdFx0XHQvLyB0aGUgb2Zmc2V0IG9mIHRoZSBtYXRjaCB3aXRoaW4gdGhlIHByb3ZpZGVkIHRleHQgbm9kZSwgYnV0IHdlXG5cdFx0XHQvLyBuZWVkIHRvIGNvcnJlY3QgdGhlbSB0byBiZSByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwgSFRNTCBpbnB1dFxuXHRcdFx0Ly8gc3RyaW5nIChpLmUuIHRoZSBvbmUgcHJvdmlkZWQgdG8gI3BhcnNlKS5cblx0XHRcdGZvciggdmFyIGogPSAwLCBudW1UZXh0TWF0Y2hlcyA9IHRleHRNYXRjaGVzLmxlbmd0aDsgaiA8IG51bVRleHRNYXRjaGVzOyBqKysgKSB7XG5cdFx0XHRcdHRleHRNYXRjaGVzWyBqIF0uc2V0T2Zmc2V0KCBvZmZzZXQgKyB0ZXh0TWF0Y2hlc1sgaiBdLmdldE9mZnNldCgpICk7XG5cdFx0XHR9XG5cblx0XHRcdG1hdGNoZXMucHVzaC5hcHBseSggbWF0Y2hlcywgdGV4dE1hdGNoZXMgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG1hdGNoZXM7XG5cdH0sXG5cblxuXHQvKipcblx0ICogQXV0b21hdGljYWxseSBsaW5rcyBVUkxzLCBFbWFpbCBhZGRyZXNzZXMsIFBob25lIG51bWJlcnMsIEhhc2h0YWdzLFxuXHQgKiBhbmQgTWVudGlvbnMgKFR3aXR0ZXIsIEluc3RhZ3JhbSkgZm91bmQgaW4gdGhlIGdpdmVuIGNodW5rIG9mIEhUTUwuIERvZXMgbm90IGxpbmtcblx0ICogVVJMcyBmb3VuZCB3aXRoaW4gSFRNTCB0YWdzLlxuXHQgKlxuXHQgKiBGb3IgaW5zdGFuY2UsIGlmIGdpdmVuIHRoZSB0ZXh0OiBgWW91IHNob3VsZCBnbyB0byBodHRwOi8vd3d3LnlhaG9vLmNvbWAsXG5cdCAqIHRoZW4gdGhlIHJlc3VsdCB3aWxsIGJlIGBZb3Ugc2hvdWxkIGdvIHRvXG5cdCAqICZsdDthIGhyZWY9XCJodHRwOi8vd3d3LnlhaG9vLmNvbVwiJmd0O2h0dHA6Ly93d3cueWFob28uY29tJmx0Oy9hJmd0O2Bcblx0ICpcblx0ICogVGhpcyBtZXRob2QgZmluZHMgdGhlIHRleHQgYXJvdW5kIGFueSBIVE1MIGVsZW1lbnRzIGluIHRoZSBpbnB1dFxuXHQgKiBgdGV4dE9ySHRtbGAsIHdoaWNoIHdpbGwgYmUgdGhlIHRleHQgdGhhdCBpcyBwcm9jZXNzZWQuIEFueSBvcmlnaW5hbCBIVE1MXG5cdCAqIGVsZW1lbnRzIHdpbGwgYmUgbGVmdCBhcy1pcywgYXMgd2VsbCBhcyB0aGUgdGV4dCB0aGF0IGlzIGFscmVhZHkgd3JhcHBlZFxuXHQgKiBpbiBhbmNob3IgKCZsdDthJmd0OykgdGFncy5cblx0ICpcblx0ICogQHBhcmFtIHtTdHJpbmd9IHRleHRPckh0bWwgVGhlIEhUTUwgb3IgdGV4dCB0byBhdXRvbGluayBtYXRjaGVzIHdpdGhpblxuXHQgKiAgIChkZXBlbmRpbmcgb24gaWYgdGhlIHtAbGluayAjdXJsc30sIHtAbGluayAjZW1haWx9LCB7QGxpbmsgI3Bob25lfSwge0BsaW5rICNoYXNodGFnfSwgYW5kIHtAbGluayAjbWVudGlvbn0gb3B0aW9ucyBhcmUgZW5hYmxlZCkuXG5cdCAqIEByZXR1cm4ge1N0cmluZ30gVGhlIEhUTUwsIHdpdGggbWF0Y2hlcyBhdXRvbWF0aWNhbGx5IGxpbmtlZC5cblx0ICovXG5cdGxpbmsgOiBmdW5jdGlvbiggdGV4dE9ySHRtbCApIHtcblx0XHRpZiggIXRleHRPckh0bWwgKSB7IHJldHVybiBcIlwiOyB9ICAvLyBoYW5kbGUgYG51bGxgIGFuZCBgdW5kZWZpbmVkYFxuXG5cdFx0dmFyIG1hdGNoZXMgPSB0aGlzLnBhcnNlKCB0ZXh0T3JIdG1sICksXG5cdFx0XHRuZXdIdG1sID0gW10sXG5cdFx0XHRsYXN0SW5kZXggPSAwO1xuXG5cdFx0Zm9yKCB2YXIgaSA9IDAsIGxlbiA9IG1hdGNoZXMubGVuZ3RoOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHR2YXIgbWF0Y2ggPSBtYXRjaGVzWyBpIF07XG5cblx0XHRcdG5ld0h0bWwucHVzaCggdGV4dE9ySHRtbC5zdWJzdHJpbmcoIGxhc3RJbmRleCwgbWF0Y2guZ2V0T2Zmc2V0KCkgKSApO1xuXHRcdFx0bmV3SHRtbC5wdXNoKCB0aGlzLmNyZWF0ZU1hdGNoUmV0dXJuVmFsKCBtYXRjaCApICk7XG5cblx0XHRcdGxhc3RJbmRleCA9IG1hdGNoLmdldE9mZnNldCgpICsgbWF0Y2guZ2V0TWF0Y2hlZFRleHQoKS5sZW5ndGg7XG5cdFx0fVxuXHRcdG5ld0h0bWwucHVzaCggdGV4dE9ySHRtbC5zdWJzdHJpbmcoIGxhc3RJbmRleCApICk7ICAvLyBoYW5kbGUgdGhlIHRleHQgYWZ0ZXIgdGhlIGxhc3QgbWF0Y2hcblxuXHRcdHJldHVybiBuZXdIdG1sLmpvaW4oICcnICk7XG5cdH0sXG5cblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgcmV0dXJuIHN0cmluZyB2YWx1ZSBmb3IgYSBnaXZlbiBtYXRjaCBpbiB0aGUgaW5wdXQgc3RyaW5nLlxuXHQgKlxuXHQgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIHRoZSB7QGxpbmsgI3JlcGxhY2VGbn0sIGlmIG9uZSB3YXMgcHJvdmlkZWQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7QXV0b2xpbmtlci5tYXRjaC5NYXRjaH0gbWF0Y2ggVGhlIE1hdGNoIG9iamVjdCB0aGF0IHJlcHJlc2VudHNcblx0ICogICB0aGUgbWF0Y2guXG5cdCAqIEByZXR1cm4ge1N0cmluZ30gVGhlIHN0cmluZyB0aGF0IHRoZSBgbWF0Y2hgIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoLlxuXHQgKiAgIFRoaXMgaXMgdXN1YWxseSB0aGUgYW5jaG9yIHRhZyBzdHJpbmcsIGJ1dCBtYXkgYmUgdGhlIGBtYXRjaFN0cmAgaXRzZWxmXG5cdCAqICAgaWYgdGhlIG1hdGNoIGlzIG5vdCB0byBiZSByZXBsYWNlZC5cblx0ICovXG5cdGNyZWF0ZU1hdGNoUmV0dXJuVmFsIDogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdC8vIEhhbmRsZSBhIGN1c3RvbSBgcmVwbGFjZUZuYCBiZWluZyBwcm92aWRlZFxuXHRcdHZhciByZXBsYWNlRm5SZXN1bHQ7XG5cdFx0aWYoIHRoaXMucmVwbGFjZUZuICkge1xuXHRcdFx0cmVwbGFjZUZuUmVzdWx0ID0gdGhpcy5yZXBsYWNlRm4uY2FsbCggdGhpcy5jb250ZXh0LCBtYXRjaCApOyAgLy8gQXV0b2xpbmtlciBpbnN0YW5jZSBpcyB0aGUgY29udGV4dFxuXHRcdH1cblxuXHRcdGlmKCB0eXBlb2YgcmVwbGFjZUZuUmVzdWx0ID09PSAnc3RyaW5nJyApIHtcblx0XHRcdHJldHVybiByZXBsYWNlRm5SZXN1bHQ7ICAvLyBgcmVwbGFjZUZuYCByZXR1cm5lZCBhIHN0cmluZywgdXNlIHRoYXRcblxuXHRcdH0gZWxzZSBpZiggcmVwbGFjZUZuUmVzdWx0ID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybiBtYXRjaC5nZXRNYXRjaGVkVGV4dCgpOyAgLy8gbm8gcmVwbGFjZW1lbnQgZm9yIHRoZSBtYXRjaFxuXG5cdFx0fSBlbHNlIGlmKCByZXBsYWNlRm5SZXN1bHQgaW5zdGFuY2VvZiBBdXRvbGlua2VyLkh0bWxUYWcgKSB7XG5cdFx0XHRyZXR1cm4gcmVwbGFjZUZuUmVzdWx0LnRvQW5jaG9yU3RyaW5nKCk7XG5cblx0XHR9IGVsc2UgeyAgLy8gcmVwbGFjZUZuUmVzdWx0ID09PSB0cnVlLCBvciBuby91bmtub3duIHJldHVybiB2YWx1ZSBmcm9tIGZ1bmN0aW9uXG5cdFx0XHQvLyBQZXJmb3JtIEF1dG9saW5rZXIncyBkZWZhdWx0IGFuY2hvciB0YWcgZ2VuZXJhdGlvblxuXHRcdFx0dmFyIGFuY2hvclRhZyA9IG1hdGNoLmJ1aWxkVGFnKCk7ICAvLyByZXR1cm5zIGFuIEF1dG9saW5rZXIuSHRtbFRhZyBpbnN0YW5jZVxuXG5cdFx0XHRyZXR1cm4gYW5jaG9yVGFnLnRvQW5jaG9yU3RyaW5nKCk7XG5cdFx0fVxuXHR9LFxuXG5cblx0LyoqXG5cdCAqIExhemlseSBpbnN0YW50aWF0ZXMgYW5kIHJldHVybnMgdGhlIHtAbGluayAjaHRtbFBhcnNlcn0gaW5zdGFuY2UgZm9yIHRoaXNcblx0ICogQXV0b2xpbmtlciBpbnN0YW5jZS5cblx0ICpcblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcmV0dXJuIHtBdXRvbGlua2VyLmh0bWxQYXJzZXIuSHRtbFBhcnNlcn1cblx0ICovXG5cdGdldEh0bWxQYXJzZXIgOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaHRtbFBhcnNlciA9IHRoaXMuaHRtbFBhcnNlcjtcblxuXHRcdGlmKCAhaHRtbFBhcnNlciApIHtcblx0XHRcdGh0bWxQYXJzZXIgPSB0aGlzLmh0bWxQYXJzZXIgPSBuZXcgQXV0b2xpbmtlci5odG1sUGFyc2VyLkh0bWxQYXJzZXIoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaHRtbFBhcnNlcjtcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBMYXppbHkgaW5zdGFudGlhdGVzIGFuZCByZXR1cm5zIHRoZSB7QGxpbmsgQXV0b2xpbmtlci5tYXRjaGVyLk1hdGNoZXJ9XG5cdCAqIGluc3RhbmNlcyBmb3IgdGhpcyBBdXRvbGlua2VyIGluc3RhbmNlLlxuXHQgKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEByZXR1cm4ge0F1dG9saW5rZXIubWF0Y2hlci5NYXRjaGVyW119XG5cdCAqL1xuXHRnZXRNYXRjaGVycyA6IGZ1bmN0aW9uKCkge1xuXHRcdGlmKCAhdGhpcy5tYXRjaGVycyApIHtcblx0XHRcdHZhciBtYXRjaGVyc05zID0gQXV0b2xpbmtlci5tYXRjaGVyLFxuXHRcdFx0ICAgIHRhZ0J1aWxkZXIgPSB0aGlzLmdldFRhZ0J1aWxkZXIoKTtcblxuXHRcdFx0dmFyIG1hdGNoZXJzID0gW1xuXHRcdFx0XHRuZXcgbWF0Y2hlcnNOcy5IYXNodGFnKCB7IHRhZ0J1aWxkZXI6IHRhZ0J1aWxkZXIsIHNlcnZpY2VOYW1lOiB0aGlzLmhhc2h0YWcgfSApLFxuXHRcdFx0XHRuZXcgbWF0Y2hlcnNOcy5FbWFpbCggeyB0YWdCdWlsZGVyOiB0YWdCdWlsZGVyIH0gKSxcblx0XHRcdFx0bmV3IG1hdGNoZXJzTnMuUGhvbmUoIHsgdGFnQnVpbGRlcjogdGFnQnVpbGRlciB9ICksXG5cdFx0XHRcdG5ldyBtYXRjaGVyc05zLk1lbnRpb24oIHsgdGFnQnVpbGRlcjogdGFnQnVpbGRlciwgc2VydmljZU5hbWU6IHRoaXMubWVudGlvbiB9ICksXG5cdFx0XHRcdG5ldyBtYXRjaGVyc05zLlVybCggeyB0YWdCdWlsZGVyOiB0YWdCdWlsZGVyLCBzdHJpcFByZWZpeDogdGhpcy5zdHJpcFByZWZpeCwgc3RyaXBUcmFpbGluZ1NsYXNoOiB0aGlzLnN0cmlwVHJhaWxpbmdTbGFzaCB9IClcblx0XHRcdF07XG5cblx0XHRcdHJldHVybiAoIHRoaXMubWF0Y2hlcnMgPSBtYXRjaGVycyApO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLm1hdGNoZXJzO1xuXHRcdH1cblx0fSxcblxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB7QGxpbmsgI3RhZ0J1aWxkZXJ9IGluc3RhbmNlIGZvciB0aGlzIEF1dG9saW5rZXIgaW5zdGFuY2UsIGxhemlseSBpbnN0YW50aWF0aW5nIGl0XG5cdCAqIGlmIGl0IGRvZXMgbm90IHlldCBleGlzdC5cblx0ICpcblx0ICogVGhpcyBtZXRob2QgbWF5IGJlIHVzZWQgaW4gYSB7QGxpbmsgI3JlcGxhY2VGbn0gdG8gZ2VuZXJhdGUgdGhlIHtAbGluayBBdXRvbGlua2VyLkh0bWxUYWcgSHRtbFRhZ30gaW5zdGFuY2UgdGhhdFxuXHQgKiBBdXRvbGlua2VyIHdvdWxkIG5vcm1hbGx5IGdlbmVyYXRlLCBhbmQgdGhlbiBhbGxvdyBmb3IgbW9kaWZpY2F0aW9ucyBiZWZvcmUgcmV0dXJuaW5nIGl0LiBGb3IgZXhhbXBsZTpcblx0ICpcblx0ICogICAgIHZhciBodG1sID0gQXV0b2xpbmtlci5saW5rKCBcIlRlc3QgZ29vZ2xlLmNvbVwiLCB7XG5cdCAqICAgICAgICAgcmVwbGFjZUZuIDogZnVuY3Rpb24oIG1hdGNoICkge1xuXHQgKiAgICAgICAgICAgICB2YXIgdGFnID0gbWF0Y2guYnVpbGRUYWcoKTsgIC8vIHJldHVybnMgYW4ge0BsaW5rIEF1dG9saW5rZXIuSHRtbFRhZ30gaW5zdGFuY2Vcblx0ICogICAgICAgICAgICAgdGFnLnNldEF0dHIoICdyZWwnLCAnbm9mb2xsb3cnICk7XG5cdCAqXG5cdCAqICAgICAgICAgICAgIHJldHVybiB0YWc7XG5cdCAqICAgICAgICAgfVxuXHQgKiAgICAgfSApO1xuXHQgKlxuXHQgKiAgICAgLy8gZ2VuZXJhdGVkIGh0bWw6XG5cdCAqICAgICAvLyAgIFRlc3QgPGEgaHJlZj1cImh0dHA6Ly9nb29nbGUuY29tXCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9mb2xsb3dcIj5nb29nbGUuY29tPC9hPlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtBdXRvbGlua2VyLkFuY2hvclRhZ0J1aWxkZXJ9XG5cdCAqL1xuXHRnZXRUYWdCdWlsZGVyIDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHRhZ0J1aWxkZXIgPSB0aGlzLnRhZ0J1aWxkZXI7XG5cblx0XHRpZiggIXRhZ0J1aWxkZXIgKSB7XG5cdFx0XHR0YWdCdWlsZGVyID0gdGhpcy50YWdCdWlsZGVyID0gbmV3IEF1dG9saW5rZXIuQW5jaG9yVGFnQnVpbGRlcigge1xuXHRcdFx0XHRuZXdXaW5kb3cgICA6IHRoaXMubmV3V2luZG93LFxuXHRcdFx0XHR0cnVuY2F0ZSAgICA6IHRoaXMudHJ1bmNhdGUsXG5cdFx0XHRcdGNsYXNzTmFtZSAgIDogdGhpcy5jbGFzc05hbWVcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGFnQnVpbGRlcjtcblx0fVxuXG59O1xuXG5cbi8vIEF1dG9saW5rZXIgTmFtZXNwYWNlc1xuXG5BdXRvbGlua2VyLm1hdGNoID0ge307XG5BdXRvbGlua2VyLm1hdGNoZXIgPSB7fTtcbkF1dG9saW5rZXIuaHRtbFBhcnNlciA9IHt9O1xuQXV0b2xpbmtlci50cnVuY2F0ZSA9IHt9O1xuXG4vKmdsb2JhbCBBdXRvbGlua2VyICovXG4vKmpzaGludCBlcW51bGw6dHJ1ZSwgYm9zczp0cnVlICovXG4vKipcbiAqIEBjbGFzcyBBdXRvbGlua2VyLlV0aWxcbiAqIEBzaW5nbGV0b25cbiAqXG4gKiBBIGZldyB1dGlsaXR5IG1ldGhvZHMgZm9yIEF1dG9saW5rZXIuXG4gKi9cbkF1dG9saW5rZXIuVXRpbCA9IHtcblxuXHQvKipcblx0ICogQHByb3BlcnR5IHtGdW5jdGlvbn0gYWJzdHJhY3RNZXRob2Rcblx0ICpcblx0ICogQSBmdW5jdGlvbiBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBtZXRob2QuXG5cdCAqL1xuXHRhYnN0cmFjdE1ldGhvZCA6IGZ1bmN0aW9uKCkgeyB0aHJvdyBcImFic3RyYWN0XCI7IH0sXG5cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogQHByb3BlcnR5IHtSZWdFeHB9IHRyaW1SZWdleFxuXHQgKlxuXHQgKiBUaGUgcmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gdHJpbSB0aGUgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZVxuXHQgKiBmcm9tIGEgc3RyaW5nLlxuXHQgKi9cblx0dHJpbVJlZ2V4IDogL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nLFxuXG5cblx0LyoqXG5cdCAqIEFzc2lnbnMgKHNoYWxsb3cgY29waWVzKSB0aGUgcHJvcGVydGllcyBvZiBgc3JjYCBvbnRvIGBkZXN0YC5cblx0ICpcblx0ICogQHBhcmFtIHtPYmplY3R9IGRlc3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cblx0ICogQHBhcmFtIHtPYmplY3R9IHNyYyBUaGUgc291cmNlIG9iamVjdC5cblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgZGVzdGluYXRpb24gb2JqZWN0IChgZGVzdGApXG5cdCAqL1xuXHRhc3NpZ24gOiBmdW5jdGlvbiggZGVzdCwgc3JjICkge1xuXHRcdGZvciggdmFyIHByb3AgaW4gc3JjICkge1xuXHRcdFx0aWYoIHNyYy5oYXNPd25Qcm9wZXJ0eSggcHJvcCApICkge1xuXHRcdFx0XHRkZXN0WyBwcm9wIF0gPSBzcmNbIHByb3AgXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZGVzdDtcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBBc3NpZ25zIChzaGFsbG93IGNvcGllcykgdGhlIHByb3BlcnRpZXMgb2YgYHNyY2Agb250byBgZGVzdGAsIGlmIHRoZVxuXHQgKiBjb3JyZXNwb25kaW5nIHByb3BlcnR5IG9uIGBkZXN0YCA9PT0gYHVuZGVmaW5lZGAuXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkZXN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBzcmMgVGhlIHNvdXJjZSBvYmplY3QuXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIGRlc3RpbmF0aW9uIG9iamVjdCAoYGRlc3RgKVxuXHQgKi9cblx0ZGVmYXVsdHMgOiBmdW5jdGlvbiggZGVzdCwgc3JjICkge1xuXHRcdGZvciggdmFyIHByb3AgaW4gc3JjICkge1xuXHRcdFx0aWYoIHNyYy5oYXNPd25Qcm9wZXJ0eSggcHJvcCApICYmIGRlc3RbIHByb3AgXSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRkZXN0WyBwcm9wIF0gPSBzcmNbIHByb3AgXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZGVzdDtcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBFeHRlbmRzIGBzdXBlcmNsYXNzYCB0byBjcmVhdGUgYSBuZXcgc3ViY2xhc3MsIGFkZGluZyB0aGUgYHByb3RvUHJvcHNgIHRvIHRoZSBuZXcgc3ViY2xhc3MncyBwcm90b3R5cGUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IHN1cGVyY2xhc3MgVGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciB0aGUgc3VwZXJjbGFzcy5cblx0ICogQHBhcmFtIHtPYmplY3R9IHByb3RvUHJvcHMgVGhlIG1ldGhvZHMvcHJvcGVydGllcyB0byBhZGQgdG8gdGhlIHN1YmNsYXNzJ3MgcHJvdG90eXBlLiBUaGlzIG1heSBjb250YWluIHRoZVxuXHQgKiAgIHNwZWNpYWwgcHJvcGVydHkgYGNvbnN0cnVjdG9yYCwgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHRoZSBuZXcgc3ViY2xhc3MncyBjb25zdHJ1Y3RvciBmdW5jdGlvbi5cblx0ICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBuZXcgc3ViY2xhc3MgZnVuY3Rpb24uXG5cdCAqL1xuXHRleHRlbmQgOiBmdW5jdGlvbiggc3VwZXJjbGFzcywgcHJvdG9Qcm9wcyApIHtcblx0XHR2YXIgc3VwZXJjbGFzc1Byb3RvID0gc3VwZXJjbGFzcy5wcm90b3R5cGU7XG5cblx0XHR2YXIgRiA9IGZ1bmN0aW9uKCkge307XG5cdFx0Ri5wcm90b3R5cGUgPSBzdXBlcmNsYXNzUHJvdG87XG5cblx0XHR2YXIgc3ViY2xhc3M7XG5cdFx0aWYoIHByb3RvUHJvcHMuaGFzT3duUHJvcGVydHkoICdjb25zdHJ1Y3RvcicgKSApIHtcblx0XHRcdHN1YmNsYXNzID0gcHJvdG9Qcm9wcy5jb25zdHJ1Y3Rvcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3ViY2xhc3MgPSBmdW5jdGlvbigpIHsgc3VwZXJjbGFzc1Byb3RvLmNvbnN0cnVjdG9yLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsgfTtcblx0XHR9XG5cblx0XHR2YXIgc3ViY2xhc3NQcm90byA9IHN1YmNsYXNzLnByb3RvdHlwZSA9IG5ldyBGKCk7ICAvLyBzZXQgdXAgcHJvdG90eXBlIGNoYWluXG5cdFx0c3ViY2xhc3NQcm90by5jb25zdHJ1Y3RvciA9IHN1YmNsYXNzOyAgLy8gZml4IGNvbnN0cnVjdG9yIHByb3BlcnR5XG5cdFx0c3ViY2xhc3NQcm90by5zdXBlcmNsYXNzID0gc3VwZXJjbGFzc1Byb3RvO1xuXG5cdFx0ZGVsZXRlIHByb3RvUHJvcHMuY29uc3RydWN0b3I7ICAvLyBkb24ndCByZS1hc3NpZ24gY29uc3RydWN0b3IgcHJvcGVydHkgdG8gdGhlIHByb3RvdHlwZSwgc2luY2UgYSBuZXcgZnVuY3Rpb24gbWF5IGhhdmUgYmVlbiBjcmVhdGVkIChgc3ViY2xhc3NgKSwgd2hpY2ggaXMgbm93IGFscmVhZHkgdGhlcmVcblx0XHRBdXRvbGlua2VyLlV0aWwuYXNzaWduKCBzdWJjbGFzc1Byb3RvLCBwcm90b1Byb3BzICk7XG5cblx0XHRyZXR1cm4gc3ViY2xhc3M7XG5cdH0sXG5cblxuXHQvKipcblx0ICogVHJ1bmNhdGVzIHRoZSBgc3RyYCBhdCBgbGVuIC0gZWxsaXBzaXNDaGFycy5sZW5ndGhgLCBhbmQgYWRkcyB0aGUgYGVsbGlwc2lzQ2hhcnNgIHRvIHRoZVxuXHQgKiBlbmQgb2YgdGhlIHN0cmluZyAoYnkgZGVmYXVsdCwgdHdvIHBlcmlvZHM6ICcuLicpLiBJZiB0aGUgYHN0cmAgbGVuZ3RoIGRvZXMgbm90IGV4Y2VlZFxuXHQgKiBgbGVuYCwgdGhlIHN0cmluZyB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC5cblx0ICpcblx0ICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIHRydW5jYXRlIGFuZCBhZGQgYW4gZWxsaXBzaXMgdG8uXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB0cnVuY2F0ZUxlbiBUaGUgbGVuZ3RoIHRvIHRydW5jYXRlIHRoZSBzdHJpbmcgYXQuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBbZWxsaXBzaXNDaGFycz0uLi5dIFRoZSBlbGxpcHNpcyBjaGFyYWN0ZXIocykgdG8gYWRkIHRvIHRoZSBlbmQgb2YgYHN0cmBcblx0ICogICB3aGVuIHRydW5jYXRlZC4gRGVmYXVsdHMgdG8gJy4uLidcblx0ICovXG5cdGVsbGlwc2lzIDogZnVuY3Rpb24oIHN0ciwgdHJ1bmNhdGVMZW4sIGVsbGlwc2lzQ2hhcnMgKSB7XG5cdFx0dmFyIGVsbGlwc2lzTGVuZ3RoO1xuXG5cdFx0aWYoIHN0ci5sZW5ndGggPiB0cnVuY2F0ZUxlbiApIHtcblx0XHRcdGlmKGVsbGlwc2lzQ2hhcnMgPT0gbnVsbCkge1xuXHRcdFx0ICBlbGxpcHNpc0NoYXJzID0gJyZoZWxsaXA7Jztcblx0XHRcdCAgZWxsaXBzaXNMZW5ndGggPSAzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdCAgZWxsaXBzaXNMZW5ndGggPSBlbGxpcHNpc0NoYXJzLmxlbmd0aDtcblx0XHRcdH1cblxuXHRcdFx0c3RyID0gc3RyLnN1YnN0cmluZyggMCwgdHJ1bmNhdGVMZW4gLSBlbGxpcHNpc0xlbmd0aCApICsgZWxsaXBzaXNDaGFycztcblx0XHR9XG5cdFx0cmV0dXJuIHN0cjtcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBTdXBwb3J0cyBgQXJyYXkucHJvdG90eXBlLmluZGV4T2YoKWAgZnVuY3Rpb25hbGl0eSBmb3Igb2xkIElFIChJRTggYW5kIGJlbG93KS5cblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gYXJyIFRoZSBhcnJheSB0byBmaW5kIGFuIGVsZW1lbnQgb2YuXG5cdCAqIEBwYXJhbSB7Kn0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBmaW5kIGluIHRoZSBhcnJheSwgYW5kIHJldHVybiB0aGUgaW5kZXggb2YuXG5cdCAqIEByZXR1cm4ge051bWJlcn0gVGhlIGluZGV4IG9mIHRoZSBgZWxlbWVudGAsIG9yIC0xIGlmIGl0IHdhcyBub3QgZm91bmQuXG5cdCAqL1xuXHRpbmRleE9mIDogZnVuY3Rpb24oIGFyciwgZWxlbWVudCApIHtcblx0XHRpZiggQXJyYXkucHJvdG90eXBlLmluZGV4T2YgKSB7XG5cdFx0XHRyZXR1cm4gYXJyLmluZGV4T2YoIGVsZW1lbnQgKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IoIHZhciBpID0gMCwgbGVuID0gYXJyLmxlbmd0aDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRpZiggYXJyWyBpIF0gPT09IGVsZW1lbnQgKSByZXR1cm4gaTtcblx0XHRcdH1cblx0XHRcdHJldHVybiAtMTtcblx0XHR9XG5cdH0sXG5cblxuXHQvKipcblx0ICogUmVtb3ZlcyBhcnJheSBlbGVtZW50cyBiYXNlZCBvbiBhIGZpbHRlcmluZyBmdW5jdGlvbi4gTXV0YXRlcyB0aGUgaW5wdXRcblx0ICogYXJyYXkuXG5cdCAqXG5cdCAqIFVzaW5nIHRoaXMgaW5zdGVhZCBvZiB0aGUgRVM1IEFycmF5LnByb3RvdHlwZS5maWx0ZXIoKSBmdW5jdGlvbiwgdG8gYWxsb3dcblx0ICogQXV0b2xpbmtlciBjb21wYXRpYmlsaXR5IHdpdGggSUU4LCBhbmQgYWxzbyB0byBwcmV2ZW50IGNyZWF0aW5nIG1hbnkgbmV3XG5cdCAqIGFycmF5cyBpbiBtZW1vcnkgZm9yIGZpbHRlcmluZy5cblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gYXJyIFRoZSBhcnJheSB0byByZW1vdmUgZWxlbWVudHMgZnJvbS4gVGhpcyBhcnJheSBpc1xuXHQgKiAgIG11dGF0ZWQuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEEgZnVuY3Rpb24gd2hpY2ggc2hvdWxkIHJldHVybiBgdHJ1ZWAgdG9cblx0ICogICByZW1vdmUgYW4gZWxlbWVudC5cblx0ICogQHJldHVybiB7QXJyYXl9IFRoZSBtdXRhdGVkIGlucHV0IGBhcnJgLlxuXHQgKi9cblx0cmVtb3ZlIDogZnVuY3Rpb24oIGFyciwgZm4gKSB7XG5cdFx0Zm9yKCB2YXIgaSA9IGFyci5sZW5ndGggLSAxOyBpID49IDA7IGktLSApIHtcblx0XHRcdGlmKCBmbiggYXJyWyBpIF0gKSA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0YXJyLnNwbGljZSggaSwgMSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXG5cdC8qKlxuXHQgKiBQZXJmb3JtcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB3aGF0IG1vZGVybiBicm93c2VycyBkbyB3aGVuIGBTdHJpbmcucHJvdG90eXBlLnNwbGl0KClgIGlzIGNhbGxlZFxuXHQgKiB3aXRoIGEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgY29udGFpbnMgY2FwdHVyaW5nIHBhcmVudGhlc2lzLlxuXHQgKlxuXHQgKiBGb3IgZXhhbXBsZTpcblx0ICpcblx0ICogICAgIC8vIE1vZGVybiBicm93c2Vyczpcblx0ICogICAgIFwiYSxiLGNcIi5zcGxpdCggLygsKS8gKTsgIC8vIC0tPiBbICdhJywgJywnLCAnYicsICcsJywgJ2MnIF1cblx0ICpcblx0ICogICAgIC8vIE9sZCBJRSAoaW5jbHVkaW5nIElFOCk6XG5cdCAqICAgICBcImEsYixjXCIuc3BsaXQoIC8oLCkvICk7ICAvLyAtLT4gWyAnYScsICdiJywgJ2MnIF1cblx0ICpcblx0ICogVGhpcyBtZXRob2QgZW11bGF0ZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgbW9kZXJuIGJyb3dzZXJzIGZvciB0aGUgb2xkIElFIGNhc2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byBzcGxpdC5cblx0ICogQHBhcmFtIHtSZWdFeHB9IHNwbGl0UmVnZXggVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzcGxpdCB0aGUgaW5wdXQgYHN0cmAgb24uIFRoZSBzcGxpdHRpbmdcblx0ICogICBjaGFyYWN0ZXIocykgd2lsbCBiZSBzcGxpY2VkIGludG8gdGhlIGFycmF5LCBhcyBpbiB0aGUgXCJtb2Rlcm4gYnJvd3NlcnNcIiBleGFtcGxlIGluIHRoZVxuXHQgKiAgIGRlc2NyaXB0aW9uIG9mIHRoaXMgbWV0aG9kLlxuXHQgKiAgIE5vdGUgIzE6IHRoZSBzdXBwbGllZCByZWd1bGFyIGV4cHJlc3Npb24gKiptdXN0KiogaGF2ZSB0aGUgJ2cnIGZsYWcgc3BlY2lmaWVkLlxuXHQgKiAgIE5vdGUgIzI6IGZvciBzaW1wbGljaXR5J3Mgc2FrZSwgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBkb2VzIG5vdCBuZWVkXG5cdCAqICAgdG8gY29udGFpbiBjYXB0dXJpbmcgcGFyZW50aGVzaXMgLSBpdCB3aWxsIGJlIGFzc3VtZWQgdGhhdCBhbnkgbWF0Y2ggaGFzIHRoZW0uXG5cdCAqIEByZXR1cm4ge1N0cmluZ1tdfSBUaGUgc3BsaXQgYXJyYXkgb2Ygc3RyaW5ncywgd2l0aCB0aGUgc3BsaXR0aW5nIGNoYXJhY3RlcihzKSBpbmNsdWRlZC5cblx0ICovXG5cdHNwbGl0QW5kQ2FwdHVyZSA6IGZ1bmN0aW9uKCBzdHIsIHNwbGl0UmVnZXggKSB7XG5cdFx0aWYoICFzcGxpdFJlZ2V4Lmdsb2JhbCApIHRocm93IG5ldyBFcnJvciggXCJgc3BsaXRSZWdleGAgbXVzdCBoYXZlIHRoZSAnZycgZmxhZyBzZXRcIiApO1xuXG5cdFx0dmFyIHJlc3VsdCA9IFtdLFxuXHRcdCAgICBsYXN0SWR4ID0gMCxcblx0XHQgICAgbWF0Y2g7XG5cblx0XHR3aGlsZSggbWF0Y2ggPSBzcGxpdFJlZ2V4LmV4ZWMoIHN0ciApICkge1xuXHRcdFx0cmVzdWx0LnB1c2goIHN0ci5zdWJzdHJpbmcoIGxhc3RJZHgsIG1hdGNoLmluZGV4ICkgKTtcblx0XHRcdHJlc3VsdC5wdXNoKCBtYXRjaFsgMCBdICk7ICAvLyBwdXNoIHRoZSBzcGxpdHRpbmcgY2hhcihzKVxuXG5cdFx0XHRsYXN0SWR4ID0gbWF0Y2guaW5kZXggKyBtYXRjaFsgMCBdLmxlbmd0aDtcblx0XHR9XG5cdFx0cmVzdWx0LnB1c2goIHN0ci5zdWJzdHJpbmcoIGxhc3RJZHggKSApO1xuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBUcmltcyB0aGUgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIGEgc3RyaW5nLlxuXHQgKlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gdHJpbS5cblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0dHJpbSA6IGZ1bmN0aW9uKCBzdHIgKSB7XG5cdFx0cmV0dXJuIHN0ci5yZXBsYWNlKCB0aGlzLnRyaW1SZWdleCwgJycgKTtcblx0fVxuXG59O1xuXG4vKmdsb2JhbCBBdXRvbGlua2VyICovXG4vKmpzaGludCBib3NzOnRydWUgKi9cbi8qKlxuICogQGNsYXNzIEF1dG9saW5rZXIuSHRtbFRhZ1xuICogQGV4dGVuZHMgT2JqZWN0XG4gKlxuICogUmVwcmVzZW50cyBhbiBIVE1MIHRhZywgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZWFzaWx5IGJ1aWxkL21vZGlmeSBIVE1MIHRhZ3MgcHJvZ3JhbW1hdGljYWxseS5cbiAqXG4gKiBBdXRvbGlua2VyIHVzZXMgdGhpcyBhYnN0cmFjdGlvbiB0byBjcmVhdGUgSFRNTCB0YWdzLCBhbmQgdGhlbiB3cml0ZSB0aGVtIG91dCBhcyBzdHJpbmdzLiBZb3UgbWF5IGFsc28gdXNlXG4gKiB0aGlzIGNsYXNzIGluIHlvdXIgY29kZSwgZXNwZWNpYWxseSB3aXRoaW4gYSB7QGxpbmsgQXV0b2xpbmtlciNyZXBsYWNlRm4gcmVwbGFjZUZufS5cbiAqXG4gKiAjIyBFeGFtcGxlc1xuICpcbiAqIEV4YW1wbGUgaW5zdGFudGlhdGlvbjpcbiAqXG4gKiAgICAgdmFyIHRhZyA9IG5ldyBBdXRvbGlua2VyLkh0bWxUYWcoIHtcbiAqICAgICAgICAgdGFnTmFtZSA6ICdhJyxcbiAqICAgICAgICAgYXR0cnMgICA6IHsgJ2hyZWYnOiAnaHR0cDovL2dvb2dsZS5jb20nLCAnY2xhc3MnOiAnZXh0ZXJuYWwtbGluaycgfSxcbiAqICAgICAgICAgaW5uZXJIdG1sIDogJ0dvb2dsZSdcbiAqICAgICB9ICk7XG4gKlxuICogICAgIHRhZy50b0FuY2hvclN0cmluZygpOyAgLy8gPGEgaHJlZj1cImh0dHA6Ly9nb29nbGUuY29tXCIgY2xhc3M9XCJleHRlcm5hbC1saW5rXCI+R29vZ2xlPC9hPlxuICpcbiAqICAgICAvLyBJbmRpdmlkdWFsIGFjY2Vzc29yIG1ldGhvZHNcbiAqICAgICB0YWcuZ2V0VGFnTmFtZSgpOyAgICAgICAgICAgICAgICAgLy8gJ2EnXG4gKiAgICAgdGFnLmdldEF0dHIoICdocmVmJyApOyAgICAgICAgICAgIC8vICdodHRwOi8vZ29vZ2xlLmNvbSdcbiAqICAgICB0YWcuaGFzQ2xhc3MoICdleHRlcm5hbC1saW5rJyApOyAgLy8gdHJ1ZVxuICpcbiAqXG4gKiBVc2luZyBtdXRhdG9yIG1ldGhvZHMgKHdoaWNoIG1heSBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggaW5zdGFudGlhdGlvbiBjb25maWcgcHJvcGVydGllcyk6XG4gKlxuICogICAgIHZhciB0YWcgPSBuZXcgQXV0b2xpbmtlci5IdG1sVGFnKCk7XG4gKiAgICAgdGFnLnNldFRhZ05hbWUoICdhJyApO1xuICogICAgIHRhZy5zZXRBdHRyKCAnaHJlZicsICdodHRwOi8vZ29vZ2xlLmNvbScgKTtcbiAqICAgICB0YWcuYWRkQ2xhc3MoICdleHRlcm5hbC1saW5rJyApO1xuICogICAgIHRhZy5zZXRJbm5lckh0bWwoICdHb29nbGUnICk7XG4gKlxuICogICAgIHRhZy5nZXRUYWdOYW1lKCk7ICAgICAgICAgICAgICAgICAvLyAnYSdcbiAqICAgICB0YWcuZ2V0QXR0ciggJ2hyZWYnICk7ICAgICAgICAgICAgLy8gJ2h0dHA6Ly9nb29nbGUuY29tJ1xuICogICAgIHRhZy5oYXNDbGFzcyggJ2V4dGVybmFsLWxpbmsnICk7ICAvLyB0cnVlXG4gKlxuICogICAgIHRhZy50b0FuY2hvclN0cmluZygpOyAgLy8gPGEgaHJlZj1cImh0dHA6Ly9nb29nbGUuY29tXCIgY2xhc3M9XCJleHRlcm5hbC1saW5rXCI+R29vZ2xlPC9hPlxuICpcbiAqXG4gKiAjIyBFeGFtcGxlIHVzZSB3aXRoaW4gYSB7QGxpbmsgQXV0b2xpbmtlciNyZXBsYWNlRm4gcmVwbGFjZUZufVxuICpcbiAqICAgICB2YXIgaHRtbCA9IEF1dG9saW5rZXIubGluayggXCJUZXN0IGdvb2dsZS5jb21cIiwge1xuICogICAgICAgICByZXBsYWNlRm4gOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG4gKiAgICAgICAgICAgICB2YXIgdGFnID0gbWF0Y2guYnVpbGRUYWcoKTsgIC8vIHJldHVybnMgYW4ge0BsaW5rIEF1dG9saW5rZXIuSHRtbFRhZ30gaW5zdGFuY2UsIGNvbmZpZ3VyZWQgd2l0aCB0aGUgTWF0Y2gncyBocmVmIGFuZCBhbmNob3IgdGV4dFxuICogICAgICAgICAgICAgdGFnLnNldEF0dHIoICdyZWwnLCAnbm9mb2xsb3cnICk7XG4gKlxuICogICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAqICAgICAgICAgfVxuICogICAgIH0gKTtcbiAqXG4gKiAgICAgLy8gZ2VuZXJhdGVkIGh0bWw6XG4gKiAgICAgLy8gICBUZXN0IDxhIGhyZWY9XCJodHRwOi8vZ29vZ2xlLmNvbVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vZm9sbG93XCI+Z29vZ2xlLmNvbTwvYT5cbiAqXG4gKlxuICogIyMgRXhhbXBsZSB1c2Ugd2l0aCBhIG5ldyB0YWcgZm9yIHRoZSByZXBsYWNlbWVudFxuICpcbiAqICAgICB2YXIgaHRtbCA9IEF1dG9saW5rZXIubGluayggXCJUZXN0IGdvb2dsZS5jb21cIiwge1xuICogICAgICAgICByZXBsYWNlRm4gOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG4gKiAgICAgICAgICAgICB2YXIgdGFnID0gbmV3IEF1dG9saW5rZXIuSHRtbFRhZygge1xuICogICAgICAgICAgICAgICAgIHRhZ05hbWUgOiAnYnV0dG9uJyxcbiAqICAgICAgICAgICAgICAgICBhdHRycyAgIDogeyAndGl0bGUnOiAnTG9hZCBVUkw6ICcgKyBtYXRjaC5nZXRBbmNob3JIcmVmKCkgfSxcbiAqICAgICAgICAgICAgICAgICBpbm5lckh0bWwgOiAnTG9hZCBVUkw6ICcgKyBtYXRjaC5nZXRBbmNob3JUZXh0KClcbiAqICAgICAgICAgICAgIH0gKTtcbiAqXG4gKiAgICAgICAgICAgICByZXR1cm4gdGFnO1xuICogICAgICAgICB9XG4gKiAgICAgfSApO1xuICpcbiAqICAgICAvLyBnZW5lcmF0ZWQgaHRtbDpcbiAqICAgICAvLyAgIFRlc3QgPGJ1dHRvbiB0aXRsZT1cIkxvYWQgVVJMOiBodHRwOi8vZ29vZ2xlLmNvbVwiPkxvYWQgVVJMOiBnb29nbGUuY29tPC9idXR0b24+XG4gKi9cbkF1dG9saW5rZXIuSHRtbFRhZyA9IEF1dG9saW5rZXIuVXRpbC5leHRlbmQoIE9iamVjdCwge1xuXG5cdC8qKlxuXHQgKiBAY2ZnIHtTdHJpbmd9IHRhZ05hbWVcblx0ICpcblx0ICogVGhlIHRhZyBuYW1lLiBFeDogJ2EnLCAnYnV0dG9uJywgZXRjLlxuXHQgKlxuXHQgKiBOb3QgcmVxdWlyZWQgYXQgaW5zdGFudGlhdGlvbiB0aW1lLCBidXQgc2hvdWxkIGJlIHNldCB1c2luZyB7QGxpbmsgI3NldFRhZ05hbWV9IGJlZm9yZSB7QGxpbmsgI3RvQW5jaG9yU3RyaW5nfVxuXHQgKiBpcyBleGVjdXRlZC5cblx0ICovXG5cblx0LyoqXG5cdCAqIEBjZmcge09iamVjdC48U3RyaW5nLCBTdHJpbmc+fSBhdHRyc1xuXHQgKlxuXHQgKiBBbiBrZXkvdmFsdWUgT2JqZWN0IChtYXApIG9mIGF0dHJpYnV0ZXMgdG8gY3JlYXRlIHRoZSB0YWcgd2l0aC4gVGhlIGtleXMgYXJlIHRoZSBhdHRyaWJ1dGUgbmFtZXMsIGFuZCB0aGVcblx0ICogdmFsdWVzIGFyZSB0aGUgYXR0cmlidXRlIHZhbHVlcy5cblx0ICovXG5cblx0LyoqXG5cdCAqIEBjZmcge1N0cmluZ30gaW5uZXJIdG1sXG5cdCAqXG5cdCAqIFRoZSBpbm5lciBIVE1MIGZvciB0aGUgdGFnLlxuXHQgKlxuXHQgKiBOb3RlIHRoZSBjYW1lbCBjYXNlIG5hbWUgb24gYGlubmVySHRtbGAuIEFjcm9ueW1zIGFyZSBjYW1lbENhc2VkIGluIHRoaXMgdXRpbGl0eSAoc3VjaCBhcyBub3QgdG8gcnVuIGludG8gdGhlIGFjcm9ueW1cblx0ICogbmFtaW5nIGluY29uc2lzdGVuY3kgdGhhdCB0aGUgRE9NIGRldmVsb3BlcnMgY3JlYXRlZCB3aXRoIGBYTUxIdHRwUmVxdWVzdGApLiBZb3UgbWF5IGFsdGVybmF0aXZlbHkgdXNlIHtAbGluayAjaW5uZXJIVE1MfVxuXHQgKiBpZiB5b3UgcHJlZmVyLCBidXQgdGhpcyBvbmUgaXMgcmVjb21tZW5kZWQuXG5cdCAqL1xuXG5cdC8qKlxuXHQgKiBAY2ZnIHtTdHJpbmd9IGlubmVySFRNTFxuXHQgKlxuXHQgKiBBbGlhcyBvZiB7QGxpbmsgI2lubmVySHRtbH0sIGFjY2VwdGVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBicm93c2VyIERPTSBhcGksIGJ1dCBwcmVmZXIgdGhlIGNhbWVsQ2FzZWQgdmVyc2lvblxuXHQgKiBmb3IgYWNyb255bSBuYW1lcy5cblx0ICovXG5cblxuXHQvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcHJvcGVydHkge1JlZ0V4cH0gd2hpdGVzcGFjZVJlZ2V4XG5cdCAqXG5cdCAqIFJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIG1hdGNoIHdoaXRlc3BhY2UgaW4gYSBzdHJpbmcgb2YgQ1NTIGNsYXNzZXMuXG5cdCAqL1xuXHR3aGl0ZXNwYWNlUmVnZXggOiAvXFxzKy8sXG5cblxuXHQvKipcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbY2ZnXSBUaGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGlzIGNsYXNzLCBpbiBhbiBPYmplY3QgKG1hcClcblx0ICovXG5cdGNvbnN0cnVjdG9yIDogZnVuY3Rpb24oIGNmZyApIHtcblx0XHRBdXRvbGlua2VyLlV0aWwuYXNzaWduKCB0aGlzLCBjZmcgKTtcblxuXHRcdHRoaXMuaW5uZXJIdG1sID0gdGhpcy5pbm5lckh0bWwgfHwgdGhpcy5pbm5lckhUTUw7ICAvLyBhY2NlcHQgZWl0aGVyIHRoZSBjYW1lbENhc2VkIGZvcm0gb3IgdGhlIGZ1bGx5IGNhcGl0YWxpemVkIGFjcm9ueW1cblx0fSxcblxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSB0YWcgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdGFnIHdpdGguXG5cdCAqXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0YWdOYW1lXG5cdCAqIEByZXR1cm4ge0F1dG9saW5rZXIuSHRtbFRhZ30gVGhpcyBIdG1sVGFnIGluc3RhbmNlLCBzbyB0aGF0IG1ldGhvZCBjYWxscyBtYXkgYmUgY2hhaW5lZC5cblx0ICovXG5cdHNldFRhZ05hbWUgOiBmdW5jdGlvbiggdGFnTmFtZSApIHtcblx0XHR0aGlzLnRhZ05hbWUgPSB0YWdOYW1lO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgdGFnIG5hbWUuXG5cdCAqXG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICovXG5cdGdldFRhZ05hbWUgOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy50YWdOYW1lIHx8IFwiXCI7XG5cdH0sXG5cblxuXHQvKipcblx0ICogU2V0cyBhbiBhdHRyaWJ1dGUgb24gdGhlIEh0bWxUYWcuXG5cdCAqXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBhdHRyTmFtZSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gc2V0LlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gYXR0clZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gc2V0LlxuXHQgKiBAcmV0dXJuIHtBdXRvbGlua2VyLkh0bWxUYWd9IFRoaXMgSHRtbFRhZyBpbnN0YW5jZSwgc28gdGhhdCBtZXRob2QgY2FsbHMgbWF5IGJlIGNoYWluZWQuXG5cdCAqL1xuXHRzZXRBdHRyIDogZnVuY3Rpb24oIGF0dHJOYW1lLCBhdHRyVmFsdWUgKSB7XG5cdFx0dmFyIHRhZ0F0dHJzID0gdGhpcy5nZXRBdHRycygpO1xuXHRcdHRhZ0F0dHJzWyBhdHRyTmFtZSBdID0gYXR0clZhbHVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblxuXHQvKipcblx0ICogUmV0cmlldmVzIGFuIGF0dHJpYnV0ZSBmcm9tIHRoZSBIdG1sVGFnLiBJZiB0aGUgYXR0cmlidXRlIGRvZXMgbm90IGV4aXN0LCByZXR1cm5zIGB1bmRlZmluZWRgLlxuXHQgKlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gYXR0ck5hbWUgVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBhdHRyaWJ1dGUncyB2YWx1ZSwgb3IgYHVuZGVmaW5lZGAgaWYgaXQgZG9lcyBub3QgZXhpc3Qgb24gdGhlIEh0bWxUYWcuXG5cdCAqL1xuXHRnZXRBdHRyIDogZnVuY3Rpb24oIGF0dHJOYW1lICkge1xuXHRcdHJldHVybiB0aGlzLmdldEF0dHJzKClbIGF0dHJOYW1lIF07XG5cdH0sXG5cblxuXHQvKipcblx0ICogU2V0cyBvbmUgb3IgbW9yZSBhdHRyaWJ1dGVzIG9uIHRoZSBIdG1sVGFnLlxuXHQgKlxuXHQgKiBAcGFyYW0ge09iamVjdC48U3RyaW5nLCBTdHJpbmc+fSBhdHRycyBBIGtleS92YWx1ZSBPYmplY3QgKG1hcCkgb2YgdGhlIGF0dHJpYnV0ZXMgdG8gc2V0LlxuXHQgKiBAcmV0dXJuIHtBdXRvbGlua2VyLkh0bWxUYWd9IFRoaXMgSHRtbFRhZyBpbnN0YW5jZSwgc28gdGhhdCBtZXRob2QgY2FsbHMgbWF5IGJlIGNoYWluZWQuXG5cdCAqL1xuXHRzZXRBdHRycyA6IGZ1bmN0aW9uKCBhdHRycyApIHtcblx0XHR2YXIgdGFnQXR0cnMgPSB0aGlzLmdldEF0dHJzKCk7XG5cdFx0QXV0b2xpbmtlci5VdGlsLmFzc2lnbiggdGFnQXR0cnMsIGF0dHJzICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGF0dHJpYnV0ZXMgT2JqZWN0IChtYXApIGZvciB0aGUgSHRtbFRhZy5cblx0ICpcblx0ICogQHJldHVybiB7T2JqZWN0LjxTdHJpbmcsIFN0cmluZz59IEEga2V5L3ZhbHVlIG9iamVjdCBvZiB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIEh0bWxUYWcuXG5cdCAqL1xuXHRnZXRBdHRycyA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmF0dHJzIHx8ICggdGhpcy5hdHRycyA9IHt9ICk7XG5cdH0sXG5cblxuXHQvKipcblx0ICogU2V0cyB0aGUgcHJvdmlkZWQgYGNzc0NsYXNzYCwgb3ZlcndyaXRpbmcgYW55IGN1cnJlbnQgQ1NTIGNsYXNzZXMgb24gdGhlIEh0bWxUYWcuXG5cdCAqXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBjc3NDbGFzcyBPbmUgb3IgbW9yZSBzcGFjZS1zZXBhcmF0ZWQgQ1NTIGNsYXNzZXMgdG8gc2V0IChvdmVyd3JpdGUpLlxuXHQgKiBAcmV0dXJuIHtBdXRvbGlua2VyLkh0bWxUYWd9IFRoaXMgSHRtbFRhZyBpbnN0YW5jZSwgc28gdGhhdCBtZXRob2QgY2FsbHMgbWF5IGJlIGNoYWluZWQuXG5cdCAqL1xuXHRzZXRDbGFzcyA6IGZ1bmN0aW9uKCBjc3NDbGFzcyApIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRBdHRyKCAnY2xhc3MnLCBjc3NDbGFzcyApO1xuXHR9LFxuXG5cblx0LyoqXG5cdCAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBhZGQgb25lIG9yIG1vcmUgQ1NTIGNsYXNzZXMgdG8gdGhlIEh0bWxUYWcuIFdpbGwgbm90IGFkZCBkdXBsaWNhdGUgQ1NTIGNsYXNzZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBjc3NDbGFzcyBPbmUgb3IgbW9yZSBzcGFjZS1zZXBhcmF0ZWQgQ1NTIGNsYXNzZXMgdG8gYWRkLlxuXHQgKiBAcmV0dXJuIHtBdXRvbGlua2VyLkh0bWxUYWd9IFRoaXMgSHRtbFRhZyBpbnN0YW5jZSwgc28gdGhhdCBtZXRob2QgY2FsbHMgbWF5IGJlIGNoYWluZWQuXG5cdCAqL1xuXHRhZGRDbGFzcyA6IGZ1bmN0aW9uKCBjc3NDbGFzcyApIHtcblx0XHR2YXIgY2xhc3NBdHRyID0gdGhpcy5nZXRDbGFzcygpLFxuXHRcdCAgICB3aGl0ZXNwYWNlUmVnZXggPSB0aGlzLndoaXRlc3BhY2VSZWdleCxcblx0XHQgICAgaW5kZXhPZiA9IEF1dG9saW5rZXIuVXRpbC5pbmRleE9mLCAgLy8gdG8gc3VwcG9ydCBJRTggYW5kIGJlbG93XG5cdFx0ICAgIGNsYXNzZXMgPSAoICFjbGFzc0F0dHIgKSA/IFtdIDogY2xhc3NBdHRyLnNwbGl0KCB3aGl0ZXNwYWNlUmVnZXggKSxcblx0XHQgICAgbmV3Q2xhc3NlcyA9IGNzc0NsYXNzLnNwbGl0KCB3aGl0ZXNwYWNlUmVnZXggKSxcblx0XHQgICAgbmV3Q2xhc3M7XG5cblx0XHR3aGlsZSggbmV3Q2xhc3MgPSBuZXdDbGFzc2VzLnNoaWZ0KCkgKSB7XG5cdFx0XHRpZiggaW5kZXhPZiggY2xhc3NlcywgbmV3Q2xhc3MgKSA9PT0gLTEgKSB7XG5cdFx0XHRcdGNsYXNzZXMucHVzaCggbmV3Q2xhc3MgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmdldEF0dHJzKClbICdjbGFzcycgXSA9IGNsYXNzZXMuam9pbiggXCIgXCIgKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcmVtb3ZlIG9uZSBvciBtb3JlIENTUyBjbGFzc2VzIGZyb20gdGhlIEh0bWxUYWcuXG5cdCAqXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBjc3NDbGFzcyBPbmUgb3IgbW9yZSBzcGFjZS1zZXBhcmF0ZWQgQ1NTIGNsYXNzZXMgdG8gcmVtb3ZlLlxuXHQgKiBAcmV0dXJuIHtBdXRvbGlua2VyLkh0bWxUYWd9IFRoaXMgSHRtbFRhZyBpbnN0YW5jZSwgc28gdGhhdCBtZXRob2QgY2FsbHMgbWF5IGJlIGNoYWluZWQuXG5cdCAqL1xuXHRyZW1vdmVDbGFzcyA6IGZ1bmN0aW9uKCBjc3NDbGFzcyApIHtcblx0XHR2YXIgY2xhc3NBdHRyID0gdGhpcy5nZXRDbGFzcygpLFxuXHRcdCAgICB3aGl0ZXNwYWNlUmVnZXggPSB0aGlzLndoaXRlc3BhY2VSZWdleCxcblx0XHQgICAgaW5kZXhPZiA9IEF1dG9saW5rZXIuVXRpbC5pbmRleE9mLCAgLy8gdG8gc3VwcG9ydCBJRTggYW5kIGJlbG93XG5cdFx0ICAgIGNsYXNzZXMgPSAoICFjbGFzc0F0dHIgKSA/IFtdIDogY2xhc3NBdHRyLnNwbGl0KCB3aGl0ZXNwYWNlUmVnZXggKSxcblx0XHQgICAgcmVtb3ZlQ2xhc3NlcyA9IGNzc0NsYXNzLnNwbGl0KCB3aGl0ZXNwYWNlUmVnZXggKSxcblx0XHQgICAgcmVtb3ZlQ2xhc3M7XG5cblx0XHR3aGlsZSggY2xhc3Nlcy5sZW5ndGggJiYgKCByZW1vdmVDbGFzcyA9IHJlbW92ZUNsYXNzZXMuc2hpZnQoKSApICkge1xuXHRcdFx0dmFyIGlkeCA9IGluZGV4T2YoIGNsYXNzZXMsIHJlbW92ZUNsYXNzICk7XG5cdFx0XHRpZiggaWR4ICE9PSAtMSApIHtcblx0XHRcdFx0Y2xhc3Nlcy5zcGxpY2UoIGlkeCwgMSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuZ2V0QXR0cnMoKVsgJ2NsYXNzJyBdID0gY2xhc3Nlcy5qb2luKCBcIiBcIiApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cblx0LyoqXG5cdCAqIENvbnZlbmllbmNlIG1ldGhvZCB0byByZXRyaWV2ZSB0aGUgQ1NTIGNsYXNzKGVzKSBmb3IgdGhlIEh0bWxUYWcsIHdoaWNoIHdpbGwgZWFjaCBiZSBzZXBhcmF0ZWQgYnkgc3BhY2VzIHdoZW5cblx0ICogdGhlcmUgYXJlIG11bHRpcGxlLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqL1xuXHRnZXRDbGFzcyA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmdldEF0dHJzKClbICdjbGFzcycgXSB8fCBcIlwiO1xuXHR9LFxuXG5cblx0LyoqXG5cdCAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBjaGVjayBpZiB0aGUgdGFnIGhhcyBhIENTUyBjbGFzcyBvciBub3QuXG5cdCAqXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBjc3NDbGFzcyBUaGUgQ1NTIGNsYXNzIHRvIGNoZWNrIGZvci5cblx0ICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBIdG1sVGFnIGhhcyB0aGUgQ1NTIGNsYXNzLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdGhhc0NsYXNzIDogZnVuY3Rpb24oIGNzc0NsYXNzICkge1xuXHRcdHJldHVybiAoICcgJyArIHRoaXMuZ2V0Q2xhc3MoKSArICcgJyApLmluZGV4T2YoICcgJyArIGNzc0NsYXNzICsgJyAnICkgIT09IC0xO1xuXHR9LFxuXG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGlubmVyIEhUTUwgZm9yIHRoZSB0YWcuXG5cdCAqXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBodG1sIFRoZSBpbm5lciBIVE1MIHRvIHNldC5cblx0ICogQHJldHVybiB7QXV0b2xpbmtlci5IdG1sVGFnfSBUaGlzIEh0bWxUYWcgaW5zdGFuY2UsIHNvIHRoYXQgbWV0aG9kIGNhbGxzIG1heSBiZSBjaGFpbmVkLlxuXHQgKi9cblx0c2V0SW5uZXJIdG1sIDogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0dGhpcy5pbm5lckh0bWwgPSBodG1sO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBpbm5lciBIVE1MIGZvciB0aGUgdGFnLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqL1xuXHRnZXRJbm5lckh0bWwgOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5pbm5lckh0bWwgfHwgXCJcIjtcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBPdmVycmlkZSBvZiBzdXBlcmNsYXNzIG1ldGhvZCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBIVE1MIHN0cmluZyBmb3IgdGhlIHRhZy5cblx0ICpcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0dG9BbmNob3JTdHJpbmcgOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdGFnTmFtZSA9IHRoaXMuZ2V0VGFnTmFtZSgpLFxuXHRcdCAgICBhdHRyc1N0ciA9IHRoaXMuYnVpbGRBdHRyc1N0cigpO1xuXG5cdFx0YXR0cnNTdHIgPSAoIGF0dHJzU3RyICkgPyAnICcgKyBhdHRyc1N0ciA6ICcnOyAgLy8gcHJlcGVuZCBhIHNwYWNlIGlmIHRoZXJlIGFyZSBhY3R1YWxseSBhdHRyaWJ1dGVzXG5cblx0XHRyZXR1cm4gWyAnPCcsIHRhZ05hbWUsIGF0dHJzU3RyLCAnPicsIHRoaXMuZ2V0SW5uZXJIdG1sKCksICc8LycsIHRhZ05hbWUsICc+JyBdLmpvaW4oIFwiXCIgKTtcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBTdXBwb3J0IG1ldGhvZCBmb3Ige0BsaW5rICN0b0FuY2hvclN0cmluZ30sIHJldHVybnMgdGhlIHN0cmluZyBzcGFjZS1zZXBhcmF0ZWQga2V5PVwidmFsdWVcIiBwYWlycywgdXNlZCB0byBwb3B1bGF0ZVxuXHQgKiB0aGUgc3RyaW5naWZpZWQgSHRtbFRhZy5cblx0ICpcblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IEV4YW1wbGUgcmV0dXJuOiBgYXR0cjE9XCJ2YWx1ZTFcIiBhdHRyMj1cInZhbHVlMlwiYFxuXHQgKi9cblx0YnVpbGRBdHRyc1N0ciA6IGZ1bmN0aW9uKCkge1xuXHRcdGlmKCAhdGhpcy5hdHRycyApIHJldHVybiBcIlwiOyAgLy8gbm8gYGF0dHJzYCBPYmplY3QgKG1hcCkgaGFzIGJlZW4gc2V0LCByZXR1cm4gZW1wdHkgc3RyaW5nXG5cblx0XHR2YXIgYXR0cnMgPSB0aGlzLmdldEF0dHJzKCksXG5cdFx0ICAgIGF0dHJzQXJyID0gW107XG5cblx0XHRmb3IoIHZhciBwcm9wIGluIGF0dHJzICkge1xuXHRcdFx0aWYoIGF0dHJzLmhhc093blByb3BlcnR5KCBwcm9wICkgKSB7XG5cdFx0XHRcdGF0dHJzQXJyLnB1c2goIHByb3AgKyAnPVwiJyArIGF0dHJzWyBwcm9wIF0gKyAnXCInICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBhdHRyc0Fyci5qb2luKCBcIiBcIiApO1xuXHR9XG5cbn0gKTtcblxuLypnbG9iYWwgQXV0b2xpbmtlciAqL1xuLyoqXG4gKiBAY2xhc3MgQXV0b2xpbmtlci5SZWdleExpYlxuICogQHNpbmdsZXRvblxuICpcbiAqIEJ1aWxkcyBhbmQgc3RvcmVzIGEgbGlicmFyeSBvZiB0aGUgY29tbW9uIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdXNlZCBieSB0aGVcbiAqIEF1dG9saW5rZXIgdXRpbGl0eS5cbiAqXG4gKiBPdGhlciByZWd1bGFyIGV4cHJlc3Npb25zIG1heSBleGlzdCBhZC1ob2MsIGJ1dCB0aGVzZSBhcmUgZ2VuZXJhbGx5IHRoZVxuICogcmVndWxhciBleHByZXNzaW9ucyB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiBzb3VyY2UgZmlsZXMuXG4gKi9cbkF1dG9saW5rZXIuUmVnZXhMaWIgPSAoZnVuY3Rpb24oKSB7XG5cblx0LyoqXG5cdCAqIFRoZSBzdHJpbmcgZm9ybSBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IHdvdWxkIG1hdGNoIGFsbCBvZiB0aGVcblx0ICogYWxwaGFiZXRpYyAoXCJsZXR0ZXJcIikgY2hhcnMgaW4gdGhlIHVuaWNvZGUgY2hhcmFjdGVyIHNldCB3aGVuIHBsYWNlZCBpbiBhXG5cdCAqIFJlZ0V4cCBjaGFyYWN0ZXIgY2xhc3MgKGBbXWApLiBUaGlzIGluY2x1ZGVzIGFsbCBpbnRlcm5hdGlvbmFsIGFscGhhYmV0aWNcblx0ICogY2hhcmFjdGVycy5cblx0ICpcblx0ICogVGhlc2Ugd291bGQgYmUgdGhlIGNoYXJhY3RlcnMgbWF0Y2hlZCBieSB1bmljb2RlIHJlZ2V4IGVuZ2luZXMgYFxccHtMfWBcblx0ICogZXNjYXBlIChcImFsbCBsZXR0ZXJzXCIpLlxuXHQgKlxuXHQgKiBUYWtlbiBmcm9tIHRoZSBYUmVnRXhwIGxpYnJhcnk6IGh0dHA6Ly94cmVnZXhwLmNvbS9cblx0ICogU3BlY2lmaWNhbGx5OiBodHRwOi8veHJlZ2V4cC5jb20vdi8zLjAuMC91bmljb2RlLWNhdGVnb3JpZXMuanNcblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHR5cGUge1N0cmluZ31cblx0ICovXG5cdHZhciBhbHBoYUNoYXJzU3RyID0gJ0EtWmEtelxcXFx4QUFcXFxceEI1XFxcXHhCQVxcXFx4QzAtXFxcXHhENlxcXFx4RDgtXFxcXHhGNlxcXFx4RjgtXFx1MDJDMVxcdTAyQzYtXFx1MDJEMVxcdTAyRTAtXFx1MDJFNFxcdTAyRUNcXHUwMkVFXFx1MDM3MC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdBLVxcdTAzN0RcXHUwMzdGXFx1MDM4NlxcdTAzODgtXFx1MDM4QVxcdTAzOENcXHUwMzhFLVxcdTAzQTFcXHUwM0EzLVxcdTAzRjVcXHUwM0Y3LVxcdTA0ODFcXHUwNDhBLVxcdTA1MkZcXHUwNTMxLVxcdTA1NTZcXHUwNTU5XFx1MDU2MS1cXHUwNTg3XFx1MDVEMC1cXHUwNUVBXFx1MDVGMC1cXHUwNUYyXFx1MDYyMC1cXHUwNjRBXFx1MDY2RVxcdTA2NkZcXHUwNjcxLVxcdTA2RDNcXHUwNkQ1XFx1MDZFNVxcdTA2RTZcXHUwNkVFXFx1MDZFRlxcdTA2RkEtXFx1MDZGQ1xcdTA2RkZcXHUwNzEwXFx1MDcxMi1cXHUwNzJGXFx1MDc0RC1cXHUwN0E1XFx1MDdCMVxcdTA3Q0EtXFx1MDdFQVxcdTA3RjRcXHUwN0Y1XFx1MDdGQVxcdTA4MDAtXFx1MDgxNVxcdTA4MUFcXHUwODI0XFx1MDgyOFxcdTA4NDAtXFx1MDg1OFxcdTA4QTAtXFx1MDhCNFxcdTA5MDQtXFx1MDkzOVxcdTA5M0RcXHUwOTUwXFx1MDk1OC1cXHUwOTYxXFx1MDk3MS1cXHUwOTgwXFx1MDk4NS1cXHUwOThDXFx1MDk4RlxcdTA5OTBcXHUwOTkzLVxcdTA5QThcXHUwOUFBLVxcdTA5QjBcXHUwOUIyXFx1MDlCNi1cXHUwOUI5XFx1MDlCRFxcdTA5Q0VcXHUwOURDXFx1MDlERFxcdTA5REYtXFx1MDlFMVxcdTA5RjBcXHUwOUYxXFx1MEEwNS1cXHUwQTBBXFx1MEEwRlxcdTBBMTBcXHUwQTEzLVxcdTBBMjhcXHUwQTJBLVxcdTBBMzBcXHUwQTMyXFx1MEEzM1xcdTBBMzVcXHUwQTM2XFx1MEEzOFxcdTBBMzlcXHUwQTU5LVxcdTBBNUNcXHUwQTVFXFx1MEE3Mi1cXHUwQTc0XFx1MEE4NS1cXHUwQThEXFx1MEE4Ri1cXHUwQTkxXFx1MEE5My1cXHUwQUE4XFx1MEFBQS1cXHUwQUIwXFx1MEFCMlxcdTBBQjNcXHUwQUI1LVxcdTBBQjlcXHUwQUJEXFx1MEFEMFxcdTBBRTBcXHUwQUUxXFx1MEFGOVxcdTBCMDUtXFx1MEIwQ1xcdTBCMEZcXHUwQjEwXFx1MEIxMy1cXHUwQjI4XFx1MEIyQS1cXHUwQjMwXFx1MEIzMlxcdTBCMzNcXHUwQjM1LVxcdTBCMzlcXHUwQjNEXFx1MEI1Q1xcdTBCNURcXHUwQjVGLVxcdTBCNjFcXHUwQjcxXFx1MEI4M1xcdTBCODUtXFx1MEI4QVxcdTBCOEUtXFx1MEI5MFxcdTBCOTItXFx1MEI5NVxcdTBCOTlcXHUwQjlBXFx1MEI5Q1xcdTBCOUVcXHUwQjlGXFx1MEJBM1xcdTBCQTRcXHUwQkE4LVxcdTBCQUFcXHUwQkFFLVxcdTBCQjlcXHUwQkQwXFx1MEMwNS1cXHUwQzBDXFx1MEMwRS1cXHUwQzEwXFx1MEMxMi1cXHUwQzI4XFx1MEMyQS1cXHUwQzM5XFx1MEMzRFxcdTBDNTgtXFx1MEM1QVxcdTBDNjBcXHUwQzYxXFx1MEM4NS1cXHUwQzhDXFx1MEM4RS1cXHUwQzkwXFx1MEM5Mi1cXHUwQ0E4XFx1MENBQS1cXHUwQ0IzXFx1MENCNS1cXHUwQ0I5XFx1MENCRFxcdTBDREVcXHUwQ0UwXFx1MENFMVxcdTBDRjFcXHUwQ0YyXFx1MEQwNS1cXHUwRDBDXFx1MEQwRS1cXHUwRDEwXFx1MEQxMi1cXHUwRDNBXFx1MEQzRFxcdTBENEVcXHUwRDVGLVxcdTBENjFcXHUwRDdBLVxcdTBEN0ZcXHUwRDg1LVxcdTBEOTZcXHUwRDlBLVxcdTBEQjFcXHUwREIzLVxcdTBEQkJcXHUwREJEXFx1MERDMC1cXHUwREM2XFx1MEUwMS1cXHUwRTMwXFx1MEUzMlxcdTBFMzNcXHUwRTQwLVxcdTBFNDZcXHUwRTgxXFx1MEU4MlxcdTBFODRcXHUwRTg3XFx1MEU4OFxcdTBFOEFcXHUwRThEXFx1MEU5NC1cXHUwRTk3XFx1MEU5OS1cXHUwRTlGXFx1MEVBMS1cXHUwRUEzXFx1MEVBNVxcdTBFQTdcXHUwRUFBXFx1MEVBQlxcdTBFQUQtXFx1MEVCMFxcdTBFQjJcXHUwRUIzXFx1MEVCRFxcdTBFQzAtXFx1MEVDNFxcdTBFQzZcXHUwRURDLVxcdTBFREZcXHUwRjAwXFx1MEY0MC1cXHUwRjQ3XFx1MEY0OS1cXHUwRjZDXFx1MEY4OC1cXHUwRjhDXFx1MTAwMC1cXHUxMDJBXFx1MTAzRlxcdTEwNTAtXFx1MTA1NVxcdTEwNUEtXFx1MTA1RFxcdTEwNjFcXHUxMDY1XFx1MTA2NlxcdTEwNkUtXFx1MTA3MFxcdTEwNzUtXFx1MTA4MVxcdTEwOEVcXHUxMEEwLVxcdTEwQzVcXHUxMEM3XFx1MTBDRFxcdTEwRDAtXFx1MTBGQVxcdTEwRkMtXFx1MTI0OFxcdTEyNEEtXFx1MTI0RFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVBLVxcdTEyNURcXHUxMjYwLVxcdTEyODhcXHUxMjhBLVxcdTEyOERcXHUxMjkwLVxcdTEyQjBcXHUxMkIyLVxcdTEyQjVcXHUxMkI4LVxcdTEyQkVcXHUxMkMwXFx1MTJDMi1cXHUxMkM1XFx1MTJDOC1cXHUxMkQ2XFx1MTJEOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVBXFx1MTM4MC1cXHUxMzhGXFx1MTNBMC1cXHUxM0Y1XFx1MTNGOC1cXHUxM0ZEXFx1MTQwMS1cXHUxNjZDXFx1MTY2Ri1cXHUxNjdGXFx1MTY4MS1cXHUxNjlBXFx1MTZBMC1cXHUxNkVBXFx1MTZGMS1cXHUxNkY4XFx1MTcwMC1cXHUxNzBDXFx1MTcwRS1cXHUxNzExXFx1MTcyMC1cXHUxNzMxXFx1MTc0MC1cXHUxNzUxXFx1MTc2MC1cXHUxNzZDXFx1MTc2RS1cXHUxNzcwXFx1MTc4MC1cXHUxN0IzXFx1MTdEN1xcdTE3RENcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4QThcXHUxOEFBXFx1MThCMC1cXHUxOEY1XFx1MTkwMC1cXHUxOTFFXFx1MTk1MC1cXHUxOTZEXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOUFCXFx1MTlCMC1cXHUxOUM5XFx1MUEwMC1cXHUxQTE2XFx1MUEyMC1cXHUxQTU0XFx1MUFBN1xcdTFCMDUtXFx1MUIzM1xcdTFCNDUtXFx1MUI0QlxcdTFCODMtXFx1MUJBMFxcdTFCQUVcXHUxQkFGXFx1MUJCQS1cXHUxQkU1XFx1MUMwMC1cXHUxQzIzXFx1MUM0RC1cXHUxQzRGXFx1MUM1QS1cXHUxQzdEXFx1MUNFOS1cXHUxQ0VDXFx1MUNFRS1cXHUxQ0YxXFx1MUNGNVxcdTFDRjZcXHUxRDAwLVxcdTFEQkZcXHUxRTAwLVxcdTFGMTVcXHUxRjE4LVxcdTFGMURcXHUxRjIwLVxcdTFGNDVcXHUxRjQ4LVxcdTFGNERcXHUxRjUwLVxcdTFGNTdcXHUxRjU5XFx1MUY1QlxcdTFGNURcXHUxRjVGLVxcdTFGN0RcXHUxRjgwLVxcdTFGQjRcXHUxRkI2LVxcdTFGQkNcXHUxRkJFXFx1MUZDMi1cXHUxRkM0XFx1MUZDNi1cXHUxRkNDXFx1MUZEMC1cXHUxRkQzXFx1MUZENi1cXHUxRkRCXFx1MUZFMC1cXHUxRkVDXFx1MUZGMi1cXHUxRkY0XFx1MUZGNi1cXHUxRkZDXFx1MjA3MVxcdTIwN0ZcXHUyMDkwLVxcdTIwOUNcXHUyMTAyXFx1MjEwN1xcdTIxMEEtXFx1MjExM1xcdTIxMTVcXHUyMTE5LVxcdTIxMURcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJBLVxcdTIxMkRcXHUyMTJGLVxcdTIxMzlcXHUyMTNDLVxcdTIxM0ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRFXFx1MjE4M1xcdTIxODRcXHUyQzAwLVxcdTJDMkVcXHUyQzMwLVxcdTJDNUVcXHUyQzYwLVxcdTJDRTRcXHUyQ0VCLVxcdTJDRUVcXHUyQ0YyXFx1MkNGM1xcdTJEMDAtXFx1MkQyNVxcdTJEMjdcXHUyRDJEXFx1MkQzMC1cXHUyRDY3XFx1MkQ2RlxcdTJEODAtXFx1MkQ5NlxcdTJEQTAtXFx1MkRBNlxcdTJEQTgtXFx1MkRBRVxcdTJEQjAtXFx1MkRCNlxcdTJEQjgtXFx1MkRCRVxcdTJEQzAtXFx1MkRDNlxcdTJEQzgtXFx1MkRDRVxcdTJERDAtXFx1MkRENlxcdTJERDgtXFx1MkRERVxcdTJFMkZcXHUzMDA1XFx1MzAwNlxcdTMwMzEtXFx1MzAzNVxcdTMwM0JcXHUzMDNDXFx1MzA0MS1cXHUzMDk2XFx1MzA5RC1cXHUzMDlGXFx1MzBBMS1cXHUzMEZBXFx1MzBGQy1cXHUzMEZGXFx1MzEwNS1cXHUzMTJEXFx1MzEzMS1cXHUzMThFXFx1MzFBMC1cXHUzMUJBXFx1MzFGMC1cXHUzMUZGXFx1MzQwMC1cXHU0REI1XFx1NEUwMC1cXHU5RkQ1XFx1QTAwMC1cXHVBNDhDXFx1QTREMC1cXHVBNEZEXFx1QTUwMC1cXHVBNjBDXFx1QTYxMC1cXHVBNjFGXFx1QTYyQVxcdUE2MkJcXHVBNjQwLVxcdUE2NkVcXHVBNjdGLVxcdUE2OURcXHVBNkEwLVxcdUE2RTVcXHVBNzE3LVxcdUE3MUZcXHVBNzIyLVxcdUE3ODhcXHVBNzhCLVxcdUE3QURcXHVBN0IwLVxcdUE3QjdcXHVBN0Y3LVxcdUE4MDFcXHVBODAzLVxcdUE4MDVcXHVBODA3LVxcdUE4MEFcXHVBODBDLVxcdUE4MjJcXHVBODQwLVxcdUE4NzNcXHVBODgyLVxcdUE4QjNcXHVBOEYyLVxcdUE4RjdcXHVBOEZCXFx1QThGRFxcdUE5MEEtXFx1QTkyNVxcdUE5MzAtXFx1QTk0NlxcdUE5NjAtXFx1QTk3Q1xcdUE5ODQtXFx1QTlCMlxcdUE5Q0ZcXHVBOUUwLVxcdUE5RTRcXHVBOUU2LVxcdUE5RUZcXHVBOUZBLVxcdUE5RkVcXHVBQTAwLVxcdUFBMjhcXHVBQTQwLVxcdUFBNDJcXHVBQTQ0LVxcdUFBNEJcXHVBQTYwLVxcdUFBNzZcXHVBQTdBXFx1QUE3RS1cXHVBQUFGXFx1QUFCMVxcdUFBQjVcXHVBQUI2XFx1QUFCOS1cXHVBQUJEXFx1QUFDMFxcdUFBQzJcXHVBQURCLVxcdUFBRERcXHVBQUUwLVxcdUFBRUFcXHVBQUYyLVxcdUFBRjRcXHVBQjAxLVxcdUFCMDZcXHVBQjA5LVxcdUFCMEVcXHVBQjExLVxcdUFCMTZcXHVBQjIwLVxcdUFCMjZcXHVBQjI4LVxcdUFCMkVcXHVBQjMwLVxcdUFCNUFcXHVBQjVDLVxcdUFCNjVcXHVBQjcwLVxcdUFCRTJcXHVBQzAwLVxcdUQ3QTNcXHVEN0IwLVxcdUQ3QzZcXHVEN0NCLVxcdUQ3RkJcXHVGOTAwLVxcdUZBNkRcXHVGQTcwLVxcdUZBRDlcXHVGQjAwLVxcdUZCMDZcXHVGQjEzLVxcdUZCMTdcXHVGQjFEXFx1RkIxRi1cXHVGQjI4XFx1RkIyQS1cXHVGQjM2XFx1RkIzOC1cXHVGQjNDXFx1RkIzRVxcdUZCNDBcXHVGQjQxXFx1RkI0M1xcdUZCNDRcXHVGQjQ2LVxcdUZCQjFcXHVGQkQzLVxcdUZEM0RcXHVGRDUwLVxcdUZEOEZcXHVGRDkyLVxcdUZEQzdcXHVGREYwLVxcdUZERkJcXHVGRTcwLVxcdUZFNzRcXHVGRTc2LVxcdUZFRkNcXHVGRjIxLVxcdUZGM0FcXHVGRjQxLVxcdUZGNUFcXHVGRjY2LVxcdUZGQkVcXHVGRkMyLVxcdUZGQzdcXHVGRkNBLVxcdUZGQ0ZcXHVGRkQyLVxcdUZGRDdcXHVGRkRBLVxcdUZGREMnO1xuXG5cdC8qKlxuXHQgKiBUaGUgc3RyaW5nIGZvcm0gb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCB3b3VsZCBtYXRjaCBhbGwgb2YgdGhlXG5cdCAqIGRlY2ltYWwgbnVtYmVyIGNoYXJzIGluIHRoZSB1bmljb2RlIGNoYXJhY3RlciBzZXQgd2hlbiBwbGFjZWQgaW4gYSBSZWdFeHBcblx0ICogY2hhcmFjdGVyIGNsYXNzIChgW11gKS5cblx0ICpcblx0ICogVGhlc2Ugd291bGQgYmUgdGhlIGNoYXJhY3RlcnMgbWF0Y2hlZCBieSB1bmljb2RlIHJlZ2V4IGVuZ2luZXMgYFxccHtOZH1gXG5cdCAqIGVzY2FwZSAoXCJhbGwgZGVjaW1hbCBudW1iZXJzXCIpXG5cdCAqXG5cdCAqIFRha2VuIGZyb20gdGhlIFhSZWdFeHAgbGlicmFyeTogaHR0cDovL3hyZWdleHAuY29tL1xuXHQgKiBTcGVjaWZpY2FsbHk6IGh0dHA6Ly94cmVnZXhwLmNvbS92LzMuMC4wL3VuaWNvZGUtY2F0ZWdvcmllcy5qc1xuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdHlwZSB7U3RyaW5nfVxuXHQgKi9cblx0dmFyIGRlY2ltYWxOdW1iZXJzU3RyID0gJzAtOVxcdTA2NjAtXFx1MDY2OVxcdTA2RjAtXFx1MDZGOVxcdTA3QzAtXFx1MDdDOVxcdTA5NjYtXFx1MDk2RlxcdTA5RTYtXFx1MDlFRlxcdTBBNjYtXFx1MEE2RlxcdTBBRTYtXFx1MEFFRlxcdTBCNjYtXFx1MEI2RlxcdTBCRTYtXFx1MEJFRlxcdTBDNjYtXFx1MEM2RlxcdTBDRTYtXFx1MENFRlxcdTBENjYtXFx1MEQ2RlxcdTBERTYtXFx1MERFRlxcdTBFNTAtXFx1MEU1OVxcdTBFRDAtXFx1MEVEOVxcdTBGMjAtXFx1MEYyOVxcdTEwNDAtXFx1MTA0OVxcdTEwOTAtXFx1MTA5OVxcdTE3RTAtXFx1MTdFOVxcdTE4MTAtXFx1MTgxOVxcdTE5NDYtXFx1MTk0RlxcdTE5RDAtXFx1MTlEOVxcdTFBODAtXFx1MUE4OVxcdTFBOTAtXFx1MUE5OVxcdTFCNTAtXFx1MUI1OVxcdTFCQjAtXFx1MUJCOVxcdTFDNDAtXFx1MUM0OVxcdTFDNTAtXFx1MUM1OVxcdUE2MjAtXFx1QTYyOVxcdUE4RDAtXFx1QThEOVxcdUE5MDAtXFx1QTkwOVxcdUE5RDAtXFx1QTlEOVxcdUE5RjAtXFx1QTlGOVxcdUFBNTAtXFx1QUE1OVxcdUFCRjAtXFx1QUJGOVxcdUZGMTAtXFx1RkYxOSc7XG5cblxuXHQvLyBTZWUgZG9jdW1lbnRhdGlvbiBiZWxvd1xuXHR2YXIgYWxwaGFOdW1lcmljQ2hhcnNTdHIgPSBhbHBoYUNoYXJzU3RyICsgZGVjaW1hbE51bWJlcnNTdHI7XG5cblxuXHQvLyBTZWUgZG9jdW1lbnRhdGlvbiBiZWxvd1xuXHR2YXIgZG9tYWluTmFtZVJlZ2V4ID0gbmV3IFJlZ0V4cCggJ1snICsgYWxwaGFOdW1lcmljQ2hhcnNTdHIgKyAnLlxcXFwtXSpbJyArIGFscGhhTnVtZXJpY0NoYXJzU3RyICsgJ1xcXFwtXScgKTtcblxuXG5cdC8vIFNlZSBkb2N1bWVudGF0aW9uIGJlbG93XG5cdHZhciB0bGRSZWdleCA9IC8oPzp0cmF2ZWxlcnNpbnN1cmFuY2V8c2FuZHZpa2Nvcm9tYW50fGtlcnJ5cHJvcGVydGllc3xjYW5jZXJyZXNlYXJjaHx3ZWF0aGVyY2hhbm5lbHxrZXJyeWxvZ2lzdGljc3xzcHJlYWRiZXR0aW5nfGludGVybmF0aW9uYWx8d29sdGVyc2tsdXdlcnxsaWZlaW5zdXJhbmNlfGNvbnN0cnVjdGlvbnxwYW1wZXJlZGNoZWZ8c2Nob2xhcnNoaXBzfHZlcnNpY2hlcnVuZ3xicmlkZ2VzdG9uZXxjcmVkaXR1bmlvbnxrZXJyeWhvdGVsc3xpbnZlc3RtZW50c3xwcm9kdWN0aW9uc3xibGFja2ZyaWRheXxlbnRlcnByaXNlc3xsYW1ib3JnaGluaXxwaG90b2dyYXBoeXxtb3RvcmN5Y2xlc3x3aWxsaWFtaGlsbHxwbGF5c3RhdGlvbnxjb250cmFjdG9yc3xiYXJjbGF5Y2FyZHxhY2NvdW50YW50c3xyZWR1bWJyZWxsYXxlbmdpbmVlcmluZ3xtYW5hZ2VtZW50fHRlbGVmb25pY2F8cHJvdGVjdGlvbnxjb25zdWx0aW5nfHRhdGFtb3RvcnN8Y3JlZGl0Y2FyZHx2bGFhbmRlcmVufHNjaGFlZmZsZXJ8YXNzb2NpYXRlc3xwcm9wZXJ0aWVzfGZvdW5kYXRpb258cmVwdWJsaWNhbnxibnBwYXJpYmFzfGJvZWhyaW5nZXJ8ZXVyb3Zpc2lvbnxleHRyYXNwYWNlfGluZHVzdHJpZXN8aW1tb2JpbGllbnx1bml2ZXJzaXR5fHRlY2hub2xvZ3l8dm9sa3N3YWdlbnxoZWFsdGhjYXJlfHJlc3RhdXJhbnR8Y3Vpc2luZWxsYXx2aXN0YXByaW50fGFwYXJ0bWVudHN8YWNjb3VudGFudHx0cmF2ZWxlcnN8aG9tZWRlcG90fGluc3RpdHV0ZXx2YWNhdGlvbnN8ZnVybml0dXJlfGZyZXNlbml1c3xpbnN1cmFuY2V8Y2hyaXN0bWFzfGJsb29tYmVyZ3xzb2x1dGlvbnN8YmFyY2Vsb25hfGZpcmVzdG9uZXxmaW5hbmNpYWx8a3Vva2dyb3VwfGZhaXJ3aW5kc3xjb21tdW5pdHl8cGFzc2FnZW5zfGdvbGRwb2ludHxlcXVpcG1lbnR8bGlmZXN0eWxlfHlvZG9iYXNoaXxhcXVhcmVsbGV8bWFya2V0aW5nfGFuYWx5dGljc3xlZHVjYXRpb258YW1zdGVyZGFtfHN0YXRlZmFybXxtZWxib3VybmV8YWxsZmluYW56fGRpcmVjdG9yeXxtaWNyb3NvZnR8c3RvY2tob2xtfG1vbnRibGFuY3xhY2NlbnR1cmV8bGFuY2FzdGVyfGxhbmRyb3ZlcnxldmVyYmFua3xpc3RhbmJ1bHxncmFwaGljc3xncmFpbmdlcnxpcGlyYW5nYXxzb2Z0YmFua3xhdHRvcm5leXxwaGFybWFjeXxzYWFybGFuZHxjYXRlcmluZ3xhaXJmb3JjZXx5b2tvaGFtYXxtb3J0Z2FnZXxmcm9udGllcnxtdXR1ZWxsZXxzdGNncm91cHxtZW1vcmlhbHxwaWN0dXJlc3xmb290YmFsbHxzeW1hbnRlY3xjaXByaWFuaXx2ZW50dXJlc3x0ZWxlY2l0eXxjaXR5ZWF0c3x2ZXJpc2lnbnxmbHNtaWR0aHxib3V0aXF1ZXxjbGVhbmluZ3xmaXJtZGFsZXxjbGluaXF1ZXxjbG90aGluZ3xyZWRzdG9uZXxpbmZpbml0aXxkZWxvaXR0ZXxmZWVkYmFja3xzZXJ2aWNlc3xicm9hZHdheXxwbHVtYmluZ3xjb21tYmFua3x0cmFpbmluZ3xiYXJjbGF5c3xleGNoYW5nZXxjb21wdXRlcnxicnVzc2Vsc3xzb2Z0d2FyZXxkZWxpdmVyeXxiYXJlZm9vdHxidWlsZGVyc3xidXNpbmVzc3xiYXJnYWluc3xlbmdpbmVlcnxob2xkaW5nc3xkb3dubG9hZHxzZWN1cml0eXxoZWxzaW5raXxsaWdodGluZ3xtb3Zpc3RhcnxkaXNjb3VudHxoZGZjYmFua3xzdXBwbGllc3xtYXJyaW90dHxwcm9wZXJ0eXxkaWFtb25kc3xjYXBldG93bnxwYXJ0bmVyc3xkZW1vY3JhdHxqcG1vcmdhbnxicmFkZXNjb3xidWRhcGVzdHxyZXhyb3RofHp1ZXJpY2h8c2hyaXJhbXxhY2FkZW15fHNjaWVuY2V8c3VwcG9ydHx5b3V0dWJlfHNpbmdsZXN8c3VyZ2VyeXxhbGliYWJhfHN0YXRvaWx8ZGVudGlzdHxzY2h3YXJ6fGFuZHJvaWR8Y3J1aXNlc3xjcmlja2V0fGRpZ2l0YWx8bWFya2V0c3xzdGFyaHVifHN5c3RlbXN8Y291cnNlc3xjb3Vwb25zfG5ldGJhbmt8Y291bnRyeXxkb21haW5zfGNvcnNpY2F8bmV0d29ya3xuZXVzdGFyfHJlYWx0b3J8bGluY29sbnxsaW1pdGVkfHNjaG1pZHR8eWFtYXh1bnxjb29raW5nfGNvbnRhY3R8YXVjdGlvbnxzcGllZ2VsfGxpYWlzb258bGVjbGVyY3xsYXRyb2JlfGxhc2FsbGV8YWJvZ2Fkb3xjb21wYXJlfGxhbnhlc3N8ZXhwb3NlZHxleHByZXNzfGNvbXBhbnl8Y29sb2duZXxjb2xsZWdlfGF2aWFuY2F8bGFjYWl4YXxmYXNoaW9ufHJlY2lwZXN8ZmVycmVyb3xrb21hdHN1fHN0b3JhZ2V8d2FuZ2dvdXxjbHVibWVkfHNhbmR2aWt8ZmlzaGluZ3xmaXRuZXNzfGJhdWhhdXN8a2l0Y2hlbnxmbGlnaHRzfGZsb3Jpc3R8Zmxvd2Vyc3x3YXRjaGVzfHdlYXRoZXJ8dGVtYXNla3xzYW1zdW5nfGJlbnRsZXl8Zm9yc2FsZXxjaGFubmVsfHRoZWF0ZXJ8ZnJvZ2Fuc3x0aGVhdHJlfG9raW5hd2F8d2Vic2l0ZXx0aWNrZXRzfGpld2Vscnl8Z2FsbGVyeXx0aWZmYW55fGlzZWxlY3R8c2hpa3NoYXxicm90aGVyfG9yZ2FuaWN8d2VkZGluZ3xnZW50aW5nfHRvc2hpYmF8b3JpZ2luc3xwaGlsaXBzfGh5dW5kYWl8aG90bWFpbHxob3RlbGVzfGhvc3Rpbmd8cmVudGFsc3x3aW5kb3dzfGNhcnRpZXJ8YnVnYXR0aXxob2xpZGF5fGNhcmVlcnN8d2hvc3dob3xoaXRhY2hpfHBhbmVyYWl8Y2FyYXZhbnxyZXZpZXdzfGd1aXRhcnN8Y2FwaXRhbHx0cmFkaW5nfGhhbWJ1cmd8aGFuZ291dHxmaW5hbmNlfHN0cmVhbXxmYW1pbHl8YWJib3R0fGhlYWx0aHxyZXZpZXd8dHJhdmVsfHJlcG9ydHxoZXJtZXN8aGlwaG9wfGdyYXRpc3xjYXJlZXJ8dG95b3RhfGhvY2tleXxkYXRpbmd8cmVwYWlyfGdvb2dsZXxzb2NpYWx8c29jY2VyfHJlaXNlbnxnbG9iYWx8b3RzdWthfGdpdmluZ3x1bmljb218Y2FzaW5vfHBob3Rvc3xjZW50ZXJ8YnJva2VyfHJvY2hlcnxvcmFuZ2V8Ym9zdGlrfGdhcmRlbnxpbnN1cmV8cnl1a3l1fGJoYXJ0aXxzYWZldHl8cGh5c2lvfHNha3VyYXxvcmFjbGV8b25saW5lfGphZ3VhcnxnYWxsdXB8cGlhZ2V0fHRpZW5kYXxmdXRib2x8cGljdGV0fGpvYnVyZ3x3ZWJjYW18YmVybGlufG9mZmljZXxqdWVnb3N8a2F1ZmVufGNoYW5lbHxjaHJvbWV8eGlodWFufGNodXJjaHx0ZW5uaXN8Y2lyY2xlfGtpbmRlcnxmbGlja3J8YmF5ZXJufGNsYWltc3xjbGluaWN8dmlhamVzfG5vd3J1enx4cGVyaWF8bm9ydG9ufHlhY2h0c3xzdHVkaW98Y29mZmVlfGNhbWVyYXxzYW5vZml8bmlzc2FufGF1dGhvcnxleHBlcnR8ZXZlbnRzfGNvbXNlY3xsYXd5ZXJ8dGF0dG9vfHZpa2luZ3xlc3RhdGV8dmlsbGFzfGNvbmRvc3xyZWFsdHl8eWFuZGV4fGVuZXJneXxlbWVyY2t8dmlyZ2lufHZpc2lvbnxkdXJiYW58bGl2aW5nfHNjaG9vbHxjb3Vwb258bG9uZG9ufHRhb2Jhb3xuYXR1cmF8dGFpcGVpfG5hZ295YXxsdXh1cnl8d2FsdGVyfGFyYW1jb3xzeWRuZXl8bWFkcmlkfGNyZWRpdHxtYWlzb258bWFrZXVwfHNjaHVsZXxtYXJrZXR8YW5xdWFufGRpcmVjdHxkZXNpZ258c3dhdGNofHN1enVraXxhbHNhY2V8dnVlbG9zfGRlbnRhbHxhbGlwYXl8dm95YWdlfHNob3VqaXx2b3Rpbmd8YWlydGVsfG11dHVhbHxkZWdyZWV8c3VwcGx5fGFnZW5jeXxtdXNldW18bW9iaWx5fGRlYWxlcnxtb25hc2h8c2VsZWN0fG1vcm1vbnxhY3RpdmV8bW9zY293fHJhY2luZ3xkYXRzdW58cXVlYmVjfG5pc3NheXxyb2Rlb3xlbWFpbHxnaWZ0c3x3b3Jrc3xwaG90b3xjaGxvZXxlZGVrYXxjaGVhcHxlYXJ0aHx2aXN0YXx0dXNodXxrb2VsbnxnbGFzc3xzaG9lc3xnbG9ib3x0dW5lc3xnbWFpbHxub2tpYXxzcGFjZXxreW90b3xibGFja3xyaWNvaHxzZXZlbnxsYW1lcnxzZW5lcnxlcHNvbnxjaXNjb3xwcmF4aXx0cnVzdHxjaXRpY3xjcm93bnxzaGVsbHxsZWFzZXxncmVlbnxsZWdhbHxsZXh1c3xuaW5qYXx0YXRhcnxncmlwZXxuaWtvbnxncm91cHx2aWRlb3x3YWxlc3xhdXRvc3xndWNjaXxwYXJ0eXxuZXh1c3xndWlkZXxsaW5kZXxhZHVsdHxwYXJ0c3xhbWljYXxsaXhpbHxib2F0c3xhenVyZXxsb2Fuc3xsb2N1c3xjeW1ydXxsb3R0ZXxsb3R0b3xzdGFkYXxjbGlja3xwb2tlcnxxdWVzdHxkYWJ1cnxsdXBpbnxuYWRleHxwYXJpc3xmYWl0aHxkYW5jZXxjYW5vbnxwbGFjZXxnaXZlc3x0cmFkZXxza3lwZXxyb2Nrc3xtYW5nb3xjbG91ZHxib290c3xzbWlsZXxmaW5hbHxzd2lzc3xob21lc3xob25kYXxtZWRpYXxob3JzZXxjYXJkc3xkZWFsc3x3YXRjaHxib3NjaHxob3VzZXxwaXp6YXxtaWFtaXxvc2FrYXx0b3Vyc3x0b3RhbHx4ZXJveHxjb2FjaHxzdWNrc3xzdHlsZXxkZWx0YXx0b3JheXxpaW5ldHx0b29sc3xtb25leXxjb2Rlc3xiZWF0c3x0b2t5b3xzYWxvbnxhcmNoaXxtb3ZpZXxiYWlkdXxzdHVkeXxhY3Rvcnx5YWhvb3xzdG9yZXxhcHBsZXx3b3JsZHxmb3JleHx0b2RheXxiaWJsZXx0bWFsbHx0aXJvbHxpcmlzaHx0aXJlc3xmb3J1bXxyZWlzZXx2ZWdhc3x2b2RrYXxzaGFycHxvbWVnYXx3ZWJlcnxqZXR6dHxhdWRpb3xwcm9tb3xidWlsZHxiaW5nb3xjaGFzZXxnYWxsb3xkcml2ZXxkdWJhaXxyZWhhYnxwcmVzc3xzb2xhcnxzYWxlfGJlZXJ8YmJ2YXxiYW5rfGJhbmR8YXV0b3xzYXBvfHNhcmx8c2F4b3xhdWRpfGFzaWF8YXJ0ZXxhcnBhfGFybXl8eW9nYXxhbGx5fHphcmF8c2NvcnxzY290fHNleHl8c2VhdHx6ZXJvfHNlZWt8YWVyb3xhZGFjfHpvbmV8YWFycHxtYWlmfG1lZXR8bWVtZXxtZW51fHN1cmZ8bWluaXxtb2JpfG10cGN8cG9ybnxkZXNpfHN0YXJ8bHRkYXxuYW1lfHRhbGt8bmF2eXxsb3ZlfGxvYW58bGl2ZXxsaW5rfG5ld3N8bGltb3xsaWtlfHNwb3R8bGlmZXxuaWNvfGxpZGx8bGdidHxsYW5kfHRheGl8dGVhbXx0ZWNofGtyZWR8a3BtZ3xzb255fHNvbmd8a2l3aXxrZGRpfGpwcnN8am9ic3xzb2h1fGphdmF8aXRhdXx0aXBzfGluZm98aW1tb3xpY2JjfGhzYmN8dG93bnxob3N0fHBhZ2V8dG95c3xoZXJlfGhlbHB8cGFyc3xoYXVzfGd1cnV8Z3VnZXx0dWJlfGdvb2d8Z29sZnxnb2xkfHNuY2Z8Z21iaHxnaWZ0fGdnZWV8Z2VudHxnYml6fGdhbWV8dmFuYXxwaWNzfGZ1bmR8Zm9yZHxwaW5nfHBpbmt8ZmlzaHxmaWxtfGZhc3R8ZmFybXxwbGF5fGZhbnN8ZmFpbHxwbHVzfHNraW58cG9obHxmYWdlfG1vZGF8cG9zdHxlcm5pfGR2YWd8cHJvZHxkb2hhfHByb2Z8ZG9jc3x2aXZhfGRpZXR8bHV4ZXxzaXRlfGRlbGx8c2luYXxkY2xrfHNob3d8cXBvbnxkYXRlfHZvdGV8Y3lvdXx2b3RvfHJlYWR8Y29vcHxjb29sfHdhbmd8Y2x1YnxjaXR5fGNoYXR8Y2VybnxjYXNofHJlaXR8cmVudHxjYXNhfGNhcnN8Y2FyZXxjYW1wfHJlc3R8Y2FsbHxjYWZlfHdlaXJ8d2llbnxyaWNofHdpa2l8YnV6enx3aW5lfGJvb2t8Ym9uZHxyb29tfHdvcmt8cnN2cHxzaGlhfHJ1aHJ8Ymx1ZXxiaW5nfHNoYXd8YmlrZXxzYWZlfHhib3h8YmVzdHxwd2N8bXRufGxkc3xhaWd8Ym9vfGZ5aXxucmF8bnJ3fG50dHxjYXJ8Z2FsfG9iaXx6aXB8YWVnfHZpbnxob3d8b25lfG9uZ3xvbmx8ZGFkfG9vb3xiZXR8ZXNxfG9yZ3xodGN8YmFyfHVvbHxpYm18b3ZofGdkbnxpY2V8aWN1fHVub3xnZWF8aWZtfGJvdHx0b3B8d3RmfGxvbHxkYXl8cGV0fGV1c3x3dGN8dWJzfHR2c3xhY298aW5nfGx0ZHxpbmt8dGFifGFiYnxhZmx8Y2F0fGludHxwaWR8cGlufGJpZHxjYmF8Z2xlfGNvbXxjYm58YWRzfG1hbnx3ZWR8Y2VifGdtb3xza3l8aXN0fGdteHx0dWl8bWJhfGZhbnxza2l8aXdjfGFwcHxwcm98bWVkfGNlb3xqY2J8amNwfGdvb3xkZXZ8bWVufGFhYXxtZW98cHVifGpsY3xib218amxsfGdvcHxqbXB8bWlsfGdvdHxnb3Z8d2lufGpvdHxtbWF8am95fHRydnxyZWR8Y2ZhfGNmZHxiaW98bW9lfG1vaXxtb218cmVufGJpenxhd3N8eGlufGJiY3xkbnB8YnV5fGtmaHxtb3Z8dGhkfHh5enxmaXR8a2lhfHJpb3xyaXB8a2ltfGRvZ3x2ZXR8bnljfGJjZ3xtdHJ8YmNufGJtc3xibXd8cnVufGJ6aHxyd2V8dGVsfHN0Y3xheGF8a3BufGZseXxrcmR8Y2FifGJubHxmb298Y3JzfGVhdHx0Y2l8c2FwfHNybHxuZWN8c2FzfG5ldHxjYWx8c2JzfHNmcnxzY2F8c2NifGNzY3xlZHV8bmV3fHh4eHxoaXZ8Zm94fHdtZXxuZ298bmhrfHZpcHxzZXh8ZnJsfGxhdHx5dW58bGF3fHlvdXx0YXh8c295fHNld3xvbXxhY3xodXxzZXxzY3xzZ3xzaHxzYnxzYXxyd3xydXxyc3xyb3xyZXxxYXxweXxzaXxwd3xwdHxwc3xzanxza3xwcnxwbnxwbXxwbHxzbHxzbXxwa3xzbnxwaHxzb3xwZ3xwZnxwZXxwYXx6d3xuenxudXxucnxucHxub3xubHxuaXxuZ3xuZnxzcnxuZXxzdHxuY3xuYXxtenxteXxteHxtd3xtdnxtdXxtdHxtc3xtcnxtcXxtcHxtb3xzdXxtbnxtbXxtbHxta3xtaHxtZ3xtZXxzdnxtZHxtY3xzeHxzeXxtYXxseXxsdnxzenxsdXxsdHxsc3xscnxsa3xsaXxsY3xsYnxsYXx0Y3xrenx0ZHxreXxrd3xrcnxrcHxrbnxrbXxraXxraHx0Znx0Z3x0aHxrZ3xrZXxqcHxqb3xqbXxqZXxpdHxpc3xpcnx0anx0a3x0bHx0bXxpcXx0bnx0b3xpb3xpbnxpbXxpbHxpZXxhZHxzZHxodHxocnxobnxobXx0cnxoa3xneXxnd3xndXxndHxnc3xncnxncXx0dHxncHxnbnxnbXxnbHx0dnxnaXx0d3x0enx1YXxnaHx1Z3x1a3xnZ3xnZnxnZXxnZHx1c3x1eXx1enx2YXxnYnxnYXx2Y3x2ZXxmcnxmb3xmbXxma3xmanx2Z3x2aXxmaXxldXxldHxlc3xlcnxlZ3xlZXxlY3xkenxkb3xkbXxka3x2bnxkanxkZXxjenxjeXxjeHxjd3x2dXxjdnxjdXxjcnxjb3xjbnxjbXxjbHxja3xjaXxjaHxjZ3xjZnxjZHxjY3xjYXx3ZnxienxieXxid3xidnxidHxic3xicnxib3xibnxibXxianxiaXx3c3xiaHxiZ3xiZnxiZXxiZHxiYnxiYXxhenxheHxhd3xhdXxhdHxhc3x5ZXxhcnxhcXxhb3xhbXxhbHx5dHxhaXx6YXxhZ3xhZnxhZXx6bXxpZClcXGIvO1xuXG5cblx0cmV0dXJuIHtcblxuXHRcdC8qKlxuXHRcdCAqIFRoZSBzdHJpbmcgZm9ybSBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IHdvdWxkIG1hdGNoIGFsbCBvZiB0aGVcblx0XHQgKiBsZXR0ZXJzIGFuZCBkZWNpbWFsIG51bWJlciBjaGFycyBpbiB0aGUgdW5pY29kZSBjaGFyYWN0ZXIgc2V0IHdoZW4gcGxhY2VkXG5cdFx0ICogaW4gYSBSZWdFeHAgY2hhcmFjdGVyIGNsYXNzIChgW11gKS5cblx0XHQgKlxuXHRcdCAqIFRoZXNlIHdvdWxkIGJlIHRoZSBjaGFyYWN0ZXJzIG1hdGNoZWQgYnkgdW5pY29kZSByZWdleCBlbmdpbmVzIGBbXFxwe0x9XFxwe05kfV1gXG5cdFx0ICogZXNjYXBlIChcImFsbCBsZXR0ZXJzIGFuZCBkZWNpbWFsIG51bWJlcnNcIilcblx0XHQgKlxuXHRcdCAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBhbHBoYU51bWVyaWNDaGFyc1N0clxuXHRcdCAqL1xuXHRcdGFscGhhTnVtZXJpY0NoYXJzU3RyIDogYWxwaGFOdW1lcmljQ2hhcnNTdHIsXG5cblx0XHQvKipcblx0XHQgKiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCBkb21haW4gbmFtZXMgb2YgYSBVUkwgb3IgZW1haWwgYWRkcmVzcy5cblx0XHQgKiBFeDogJ2dvb2dsZScsICd5YWhvbycsICdzb21lLW90aGVyLWNvbXBhbnknLCBldGMuXG5cdFx0ICpcblx0XHQgKiBAcHJvcGVydHkge1JlZ0V4cH0gZG9tYWluTmFtZVJlZ2V4XG5cdFx0ICovXG5cdFx0ZG9tYWluTmFtZVJlZ2V4IDogZG9tYWluTmFtZVJlZ2V4LFxuXG5cdFx0LyoqXG5cdFx0ICogQSByZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggdG9wIGxldmVsIGRvbWFpbnMgKFRMRHMpIGZvciBhIFVSTCBvclxuXHRcdCAqIGVtYWlsIGFkZHJlc3MuIEV4OiAnY29tJywgJ29yZycsICduZXQnLCBldGMuXG5cdFx0ICpcblx0XHQgKiBAcHJvcGVydHkge1JlZ0V4cH0gdGxkUmVnZXhcblx0XHQgKi9cblx0XHR0bGRSZWdleCA6IHRsZFJlZ2V4XG5cblx0fTtcblxuXG59KCkgKTtcbi8qZ2xvYmFsIEF1dG9saW5rZXIgKi9cbi8qanNoaW50IHN1Yjp0cnVlICovXG4vKipcbiAqIEBwcm90ZWN0ZWRcbiAqIEBjbGFzcyBBdXRvbGlua2VyLkFuY2hvclRhZ0J1aWxkZXJcbiAqIEBleHRlbmRzIE9iamVjdFxuICpcbiAqIEJ1aWxkcyBhbmNob3IgKCZsdDthJmd0OykgdGFncyBmb3IgdGhlIEF1dG9saW5rZXIgdXRpbGl0eSB3aGVuIGEgbWF0Y2ggaXNcbiAqIGZvdW5kLlxuICpcbiAqIE5vcm1hbGx5IHRoaXMgY2xhc3MgaXMgaW5zdGFudGlhdGVkLCBjb25maWd1cmVkLCBhbmQgdXNlZCBpbnRlcm5hbGx5IGJ5IGFuXG4gKiB7QGxpbmsgQXV0b2xpbmtlcn0gaW5zdGFuY2UsIGJ1dCBtYXkgYWN0dWFsbHkgYmUgdXNlZCBpbmRpcmVjdGx5IGluIGFcbiAqIHtAbGluayBBdXRvbGlua2VyI3JlcGxhY2VGbiByZXBsYWNlRm59IHRvIGNyZWF0ZSB7QGxpbmsgQXV0b2xpbmtlci5IdG1sVGFnIEh0bWxUYWd9XG4gKiBpbnN0YW5jZXMgd2hpY2ggbWF5IGJlIG1vZGlmaWVkIGJlZm9yZSByZXR1cm5pbmcgZnJvbSB0aGVcbiAqIHtAbGluayBBdXRvbGlua2VyI3JlcGxhY2VGbiByZXBsYWNlRm59LiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgdmFyIGh0bWwgPSBBdXRvbGlua2VyLmxpbmsoIFwiVGVzdCBnb29nbGUuY29tXCIsIHtcbiAqICAgICAgICAgcmVwbGFjZUZuIDogZnVuY3Rpb24oIG1hdGNoICkge1xuICogICAgICAgICAgICAgdmFyIHRhZyA9IG1hdGNoLmJ1aWxkVGFnKCk7ICAvLyByZXR1cm5zIGFuIHtAbGluayBBdXRvbGlua2VyLkh0bWxUYWd9IGluc3RhbmNlXG4gKiAgICAgICAgICAgICB0YWcuc2V0QXR0ciggJ3JlbCcsICdub2ZvbGxvdycgKTtcbiAqXG4gKiAgICAgICAgICAgICByZXR1cm4gdGFnO1xuICogICAgICAgICB9XG4gKiAgICAgfSApO1xuICpcbiAqICAgICAvLyBnZW5lcmF0ZWQgaHRtbDpcbiAqICAgICAvLyAgIFRlc3QgPGEgaHJlZj1cImh0dHA6Ly9nb29nbGUuY29tXCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9mb2xsb3dcIj5nb29nbGUuY29tPC9hPlxuICovXG5BdXRvbGlua2VyLkFuY2hvclRhZ0J1aWxkZXIgPSBBdXRvbGlua2VyLlV0aWwuZXh0ZW5kKCBPYmplY3QsIHtcblxuXHQvKipcblx0ICogQGNmZyB7Qm9vbGVhbn0gbmV3V2luZG93XG5cdCAqIEBpbmhlcml0ZG9jIEF1dG9saW5rZXIjbmV3V2luZG93XG5cdCAqL1xuXG5cdC8qKlxuXHQgKiBAY2ZnIHtPYmplY3R9IHRydW5jYXRlXG5cdCAqIEBpbmhlcml0ZG9jIEF1dG9saW5rZXIjdHJ1bmNhdGVcblx0ICovXG5cblx0LyoqXG5cdCAqIEBjZmcge1N0cmluZ30gY2xhc3NOYW1lXG5cdCAqIEBpbmhlcml0ZG9jIEF1dG9saW5rZXIjY2xhc3NOYW1lXG5cdCAqL1xuXG5cblx0LyoqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW2NmZ10gVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEFuY2hvclRhZ0J1aWxkZXIgaW5zdGFuY2UsIHNwZWNpZmllZCBpbiBhbiBPYmplY3QgKG1hcCkuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvciA6IGZ1bmN0aW9uKCBjZmcgKSB7XG5cdFx0Y2ZnID0gY2ZnIHx8IHt9O1xuXG5cdFx0dGhpcy5uZXdXaW5kb3cgPSBjZmcubmV3V2luZG93O1xuXHRcdHRoaXMudHJ1bmNhdGUgPSBjZmcudHJ1bmNhdGU7XG5cdFx0dGhpcy5jbGFzc05hbWUgPSBjZmcuY2xhc3NOYW1lO1xuXHR9LFxuXG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyB0aGUgYWN0dWFsIGFuY2hvciAoJmx0O2EmZ3Q7KSB0YWcgdG8gdXNlIGluIHBsYWNlIG9mIHRoZVxuXHQgKiBtYXRjaGVkIHRleHQsIHZpYSBpdHMgYG1hdGNoYCBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSB7QXV0b2xpbmtlci5tYXRjaC5NYXRjaH0gbWF0Y2ggVGhlIE1hdGNoIGluc3RhbmNlIHRvIGdlbmVyYXRlIGFuXG5cdCAqICAgYW5jaG9yIHRhZyBmcm9tLlxuXHQgKiBAcmV0dXJuIHtBdXRvbGlua2VyLkh0bWxUYWd9IFRoZSBIdG1sVGFnIGluc3RhbmNlIGZvciB0aGUgYW5jaG9yIHRhZy5cblx0ICovXG5cdGJ1aWxkIDogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdHJldHVybiBuZXcgQXV0b2xpbmtlci5IdG1sVGFnKCB7XG5cdFx0XHR0YWdOYW1lICAgOiAnYScsXG5cdFx0XHRhdHRycyAgICAgOiB0aGlzLmNyZWF0ZUF0dHJzKCBtYXRjaCApLFxuXHRcdFx0aW5uZXJIdG1sIDogdGhpcy5wcm9jZXNzQW5jaG9yVGV4dCggbWF0Y2guZ2V0QW5jaG9yVGV4dCgpIClcblx0XHR9ICk7XG5cdH0sXG5cblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgT2JqZWN0IChtYXApIG9mIHRoZSBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSBhbmNob3IgKCZsdDthJmd0Oylcblx0ICogICB0YWcgYmVpbmcgZ2VuZXJhdGVkLlxuXHQgKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBwYXJhbSB7QXV0b2xpbmtlci5tYXRjaC5NYXRjaH0gbWF0Y2ggVGhlIE1hdGNoIGluc3RhbmNlIHRvIGdlbmVyYXRlIGFuXG5cdCAqICAgYW5jaG9yIHRhZyBmcm9tLlxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IEEga2V5L3ZhbHVlIE9iamVjdCAobWFwKSBvZiB0aGUgYW5jaG9yIHRhZydzIGF0dHJpYnV0ZXMuXG5cdCAqL1xuXHRjcmVhdGVBdHRycyA6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHR2YXIgYXR0cnMgPSB7XG5cdFx0XHQnaHJlZicgOiBtYXRjaC5nZXRBbmNob3JIcmVmKCkgIC8vIHdlJ2xsIGFsd2F5cyBoYXZlIHRoZSBgaHJlZmAgYXR0cmlidXRlXG5cdFx0fTtcblxuXHRcdHZhciBjc3NDbGFzcyA9IHRoaXMuY3JlYXRlQ3NzQ2xhc3MoIG1hdGNoICk7XG5cdFx0aWYoIGNzc0NsYXNzICkge1xuXHRcdFx0YXR0cnNbICdjbGFzcycgXSA9IGNzc0NsYXNzO1xuXHRcdH1cblx0XHRpZiggdGhpcy5uZXdXaW5kb3cgKSB7XG5cdFx0XHRhdHRyc1sgJ3RhcmdldCcgXSA9IFwiX2JsYW5rXCI7XG5cdFx0XHRhdHRyc1sgJ3JlbCcgXSA9IFwibm9vcGVuZXIgbm9yZWZlcnJlclwiO1xuXHRcdH1cblxuXHRcdGlmKCB0aGlzLnRydW5jYXRlICkge1xuXHRcdFx0aWYoIHRoaXMudHJ1bmNhdGUubGVuZ3RoICYmIHRoaXMudHJ1bmNhdGUubGVuZ3RoIDwgbWF0Y2guZ2V0QW5jaG9yVGV4dCgpLmxlbmd0aCApIHtcblx0XHRcdFx0YXR0cnNbICd0aXRsZScgXSA9IG1hdGNoLmdldEFuY2hvckhyZWYoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gYXR0cnM7XG5cdH0sXG5cblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgQ1NTIGNsYXNzIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBhIGdpdmVuIGFuY2hvciB0YWcsIGJhc2VkIG9uXG5cdCAqIHRoZSBgbWF0Y2hUeXBlYCBhbmQgdGhlIHtAbGluayAjY2xhc3NOYW1lfSBjb25maWcuXG5cdCAqXG5cdCAqIEV4YW1wbGUgcmV0dXJuczpcblx0ICpcblx0ICogLSBcIlwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyB7QGxpbmsgI2NsYXNzTmFtZX1cblx0ICogLSBcIm15TGluayBteUxpbmstdXJsXCIgICAgICAgICAgICAgICAgICAgICAvLyB1cmwgbWF0Y2hcblx0ICogLSBcIm15TGluayBteUxpbmstZW1haWxcIiAgICAgICAgICAgICAgICAgICAvLyBlbWFpbCBtYXRjaFxuXHQgKiAtIFwibXlMaW5rIG15TGluay1waG9uZVwiICAgICAgICAgICAgICAgICAgIC8vIHBob25lIG1hdGNoXG5cdCAqIC0gXCJteUxpbmsgbXlMaW5rLWhhc2h0YWdcIiAgICAgICAgICAgICAgICAgLy8gaGFzaHRhZyBtYXRjaFxuXHQgKiAtIFwibXlMaW5rIG15TGluay1tZW50aW9uIG15TGluay10d2l0dGVyXCIgIC8vIG1lbnRpb24gbWF0Y2ggd2l0aCBUd2l0dGVyIHNlcnZpY2Vcblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtBdXRvbGlua2VyLm1hdGNoLk1hdGNofSBtYXRjaCBUaGUgTWF0Y2ggaW5zdGFuY2UgdG8gZ2VuZXJhdGUgYW5cblx0ICogICBhbmNob3IgdGFnIGZyb20uXG5cdCAqIEByZXR1cm4ge1N0cmluZ30gVGhlIENTUyBjbGFzcyBzdHJpbmcgZm9yIHRoZSBsaW5rLiBFeGFtcGxlIHJldHVybjpcblx0ICogICBcIm15TGluayBteUxpbmstdXJsXCIuIElmIG5vIHtAbGluayAjY2xhc3NOYW1lfSB3YXMgY29uZmlndXJlZCwgcmV0dXJuc1xuXHQgKiAgIGFuIGVtcHR5IHN0cmluZy5cblx0ICovXG5cdGNyZWF0ZUNzc0NsYXNzIDogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdHZhciBjbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZTtcblxuXHRcdGlmKCAhY2xhc3NOYW1lICkge1xuXHRcdFx0cmV0dXJuIFwiXCI7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIHJldHVybkNsYXNzZXMgPSBbIGNsYXNzTmFtZSBdLFxuXHRcdFx0XHRjc3NDbGFzc1N1ZmZpeGVzID0gbWF0Y2guZ2V0Q3NzQ2xhc3NTdWZmaXhlcygpO1xuXG5cdFx0XHRmb3IoIHZhciBpID0gMCwgbGVuID0gY3NzQ2xhc3NTdWZmaXhlcy5sZW5ndGg7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0cmV0dXJuQ2xhc3Nlcy5wdXNoKCBjbGFzc05hbWUgKyAnLScgKyBjc3NDbGFzc1N1ZmZpeGVzWyBpIF0gKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXR1cm5DbGFzc2VzLmpvaW4oICcgJyApO1xuXHRcdH1cblx0fSxcblxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzZXMgdGhlIGBhbmNob3JUZXh0YCBieSB0cnVuY2F0aW5nIHRoZSB0ZXh0IGFjY29yZGluZyB0byB0aGVcblx0ICoge0BsaW5rICN0cnVuY2F0ZX0gY29uZmlnLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gYW5jaG9yVGV4dCBUaGUgYW5jaG9yIHRhZydzIHRleHQgKGkuZS4gd2hhdCB3aWxsIGJlXG5cdCAqICAgZGlzcGxheWVkKS5cblx0ICogQHJldHVybiB7U3RyaW5nfSBUaGUgcHJvY2Vzc2VkIGBhbmNob3JUZXh0YC5cblx0ICovXG5cdHByb2Nlc3NBbmNob3JUZXh0IDogZnVuY3Rpb24oIGFuY2hvclRleHQgKSB7XG5cdFx0YW5jaG9yVGV4dCA9IHRoaXMuZG9UcnVuY2F0ZSggYW5jaG9yVGV4dCApO1xuXG5cdFx0cmV0dXJuIGFuY2hvclRleHQ7XG5cdH0sXG5cblxuXHQvKipcblx0ICogUGVyZm9ybXMgdGhlIHRydW5jYXRpb24gb2YgdGhlIGBhbmNob3JUZXh0YCBiYXNlZCBvbiB0aGUge0BsaW5rICN0cnVuY2F0ZX1cblx0ICogb3B0aW9uLiBJZiB0aGUgYGFuY2hvclRleHRgIGlzIGxvbmdlciB0aGFuIHRoZSBsZW5ndGggc3BlY2lmaWVkIGJ5IHRoZVxuXHQgKiB7QGxpbmsgI3RydW5jYXRlfSBvcHRpb24sIHRoZSB0cnVuY2F0aW9uIGlzIHBlcmZvcm1lZCBiYXNlZCBvbiB0aGVcblx0ICogYGxvY2F0aW9uYCBwcm9wZXJ0eS4gU2VlIHtAbGluayAjdHJ1bmNhdGV9IGZvciBkZXRhaWxzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gYW5jaG9yVGV4dCBUaGUgYW5jaG9yIHRhZydzIHRleHQgKGkuZS4gd2hhdCB3aWxsIGJlXG5cdCAqICAgZGlzcGxheWVkKS5cblx0ICogQHJldHVybiB7U3RyaW5nfSBUaGUgdHJ1bmNhdGVkIGFuY2hvciB0ZXh0LlxuXHQgKi9cblx0ZG9UcnVuY2F0ZSA6IGZ1bmN0aW9uKCBhbmNob3JUZXh0ICkge1xuXHRcdHZhciB0cnVuY2F0ZSA9IHRoaXMudHJ1bmNhdGU7XG5cdFx0aWYoICF0cnVuY2F0ZSB8fCAhdHJ1bmNhdGUubGVuZ3RoICkgcmV0dXJuIGFuY2hvclRleHQ7XG5cblx0XHR2YXIgdHJ1bmNhdGVMZW5ndGggPSB0cnVuY2F0ZS5sZW5ndGgsXG5cdFx0XHR0cnVuY2F0ZUxvY2F0aW9uID0gdHJ1bmNhdGUubG9jYXRpb247XG5cblx0XHRpZiggdHJ1bmNhdGVMb2NhdGlvbiA9PT0gJ3NtYXJ0JyApIHtcblx0XHRcdHJldHVybiBBdXRvbGlua2VyLnRydW5jYXRlLlRydW5jYXRlU21hcnQoIGFuY2hvclRleHQsIHRydW5jYXRlTGVuZ3RoICk7XG5cblx0XHR9IGVsc2UgaWYoIHRydW5jYXRlTG9jYXRpb24gPT09ICdtaWRkbGUnICkge1xuXHRcdFx0cmV0dXJuIEF1dG9saW5rZXIudHJ1bmNhdGUuVHJ1bmNhdGVNaWRkbGUoIGFuY2hvclRleHQsIHRydW5jYXRlTGVuZ3RoICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIEF1dG9saW5rZXIudHJ1bmNhdGUuVHJ1bmNhdGVFbmQoIGFuY2hvclRleHQsIHRydW5jYXRlTGVuZ3RoICk7XG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLypnbG9iYWwgQXV0b2xpbmtlciAqL1xuLyoqXG4gKiBAY2xhc3MgQXV0b2xpbmtlci5odG1sUGFyc2VyLkh0bWxQYXJzZXJcbiAqIEBleHRlbmRzIE9iamVjdFxuICpcbiAqIEFuIEhUTUwgcGFyc2VyIGltcGxlbWVudGF0aW9uIHdoaWNoIHNpbXBseSB3YWxrcyBhbiBIVE1MIHN0cmluZyBhbmQgcmV0dXJucyBhbiBhcnJheSBvZlxuICoge0BsaW5rIEF1dG9saW5rZXIuaHRtbFBhcnNlci5IdG1sTm9kZSBIdG1sTm9kZXN9IHRoYXQgcmVwcmVzZW50IHRoZSBiYXNpYyBIVE1MIHN0cnVjdHVyZSBvZiB0aGUgaW5wdXQgc3RyaW5nLlxuICpcbiAqIEF1dG9saW5rZXIgdXNlcyB0aGlzIHRvIG9ubHkgbGluayBVUkxzL2VtYWlscy9tZW50aW9ucyB3aXRoaW4gdGV4dCBub2RlcywgZWZmZWN0aXZlbHkgaWdub3JpbmcgLyBcIndhbGtpbmdcbiAqIGFyb3VuZFwiIEhUTUwgdGFncy5cbiAqL1xuQXV0b2xpbmtlci5odG1sUGFyc2VyLkh0bWxQYXJzZXIgPSBBdXRvbGlua2VyLlV0aWwuZXh0ZW5kKCBPYmplY3QsIHtcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogQHByb3BlcnR5IHtSZWdFeHB9IGh0bWxSZWdleFxuXHQgKlxuXHQgKiBUaGUgcmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gcHVsbCBvdXQgSFRNTCB0YWdzIGZyb20gYSBzdHJpbmcuIEhhbmRsZXMgbmFtZXNwYWNlZCBIVE1MIHRhZ3MgYW5kXG5cdCAqIGF0dHJpYnV0ZSBuYW1lcywgYXMgc3BlY2lmaWVkIGJ5IGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWwtbWFya3VwL3N5bnRheC5odG1sLlxuXHQgKlxuXHQgKiBDYXB0dXJpbmcgZ3JvdXBzOlxuXHQgKlxuXHQgKiAxLiBUaGUgXCIhRE9DVFlQRVwiIHRhZyBuYW1lLCBpZiBhIHRhZyBpcyBhICZsdDshRE9DVFlQRSZndDsgdGFnLlxuXHQgKiAyLiBJZiBpdCBpcyBhbiBlbmQgdGFnLCB0aGlzIGdyb3VwIHdpbGwgaGF2ZSB0aGUgJy8nLlxuXHQgKiAzLiBJZiBpdCBpcyBhIGNvbW1lbnQgdGFnLCB0aGlzIGdyb3VwIHdpbGwgaG9sZCB0aGUgY29tbWVudCB0ZXh0IChpLmUuXG5cdCAqICAgIHRoZSB0ZXh0IGluc2lkZSB0aGUgYCZsdDshLS1gIGFuZCBgLS0mZ3Q7YC5cblx0ICogNC4gVGhlIHRhZyBuYW1lIGZvciBhIHRhZyB3aXRob3V0IGF0dHJpYnV0ZXMgKG90aGVyIHRoYW4gdGhlICZsdDshRE9DVFlQRSZndDsgdGFnKVxuXHQgKiA1LiBUaGUgdGFnIG5hbWUgZm9yIGEgdGFnIHdpdGggYXR0cmlidXRlcyAob3RoZXIgdGhhbiB0aGUgJmx0OyFET0NUWVBFJmd0OyB0YWcpXG5cdCAqL1xuXHRodG1sUmVnZXggOiAoZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGNvbW1lbnRUYWdSZWdleCA9IC8hLS0oW1xcc1xcU10rPyktLS8sXG5cdFx0ICAgIHRhZ05hbWVSZWdleCA9IC9bMC05YS16QS1aXVswLTlhLXpBLVo6XSovLFxuXHRcdCAgICBhdHRyTmFtZVJlZ2V4ID0gL1teXFxzXCInPlxcLz1cXHgwMC1cXHgxRlxceDdGXSsvLCAgIC8vIHRoZSB1bmljb2RlIHJhbmdlIGFjY291bnRzIGZvciBleGNsdWRpbmcgY29udHJvbCBjaGFycywgYW5kIHRoZSBkZWxldGUgY2hhclxuXHRcdCAgICBhdHRyVmFsdWVSZWdleCA9IC8oPzpcIlteXCJdKj9cInwnW14nXSo/J3xbXidcIj08PmBcXHNdKykvLCAvLyBkb3VibGUgcXVvdGVkLCBzaW5nbGUgcXVvdGVkLCBvciB1bnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWVzXG5cdFx0ICAgIG5hbWVFcXVhbHNWYWx1ZVJlZ2V4ID0gYXR0ck5hbWVSZWdleC5zb3VyY2UgKyAnKD86XFxcXHMqPVxcXFxzKicgKyBhdHRyVmFsdWVSZWdleC5zb3VyY2UgKyAnKT8nOyAgLy8gb3B0aW9uYWwgJz1bdmFsdWVdJ1xuXG5cdFx0cmV0dXJuIG5ldyBSZWdFeHAoIFtcblx0XHRcdC8vIGZvciA8IURPQ1RZUEU+IHRhZy4gRXg6IDwhRE9DVFlQRSBodG1sIFBVQkxJQyBcIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOXCIgXCJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkXCI+KVxuXHRcdFx0Jyg/OicsXG5cdFx0XHRcdCc8KCFET0NUWVBFKScsICAvLyAqKiogQ2FwdHVyaW5nIEdyb3VwIDEgLSBJZiBpdCdzIGEgZG9jdHlwZSB0YWdcblxuXHRcdFx0XHRcdC8vIFplcm8gb3IgbW9yZSBhdHRyaWJ1dGVzIGZvbGxvd2luZyB0aGUgdGFnIG5hbWVcblx0XHRcdFx0XHQnKD86Jyxcblx0XHRcdFx0XHRcdCdcXFxccysnLCAgLy8gb25lIG9yIG1vcmUgd2hpdGVzcGFjZSBjaGFycyBiZWZvcmUgYW4gYXR0cmlidXRlXG5cblx0XHRcdFx0XHRcdC8vIEVpdGhlcjpcblx0XHRcdFx0XHRcdC8vIEEuIGF0dHI9XCJ2YWx1ZVwiLCBvclxuXHRcdFx0XHRcdFx0Ly8gQi4gXCJ2YWx1ZVwiIGFsb25lIChUbyBjb3ZlciBleGFtcGxlIGRvY3R5cGUgdGFnOiA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgXCItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTlwiIFwiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZFwiPilcblx0XHRcdFx0XHRcdCcoPzonLCBuYW1lRXF1YWxzVmFsdWVSZWdleCwgJ3wnLCBhdHRyVmFsdWVSZWdleC5zb3VyY2UgKyAnKScsXG5cdFx0XHRcdFx0JykqJyxcblx0XHRcdFx0Jz4nLFxuXHRcdFx0JyknLFxuXG5cdFx0XHQnfCcsXG5cblx0XHRcdC8vIEFsbCBvdGhlciBIVE1MIHRhZ3MgKGkuZS4gdGFncyB0aGF0IGFyZSBub3QgPCFET0NUWVBFPilcblx0XHRcdCcoPzonLFxuXHRcdFx0XHQnPCgvKT8nLCAgLy8gQmVnaW5uaW5nIG9mIGEgdGFnIG9yIGNvbW1lbnQuIEVpdGhlciAnPCcgZm9yIGEgc3RhcnQgdGFnLCBvciAnPC8nIGZvciBhbiBlbmQgdGFnLlxuXHRcdFx0XHQgICAgICAgICAgLy8gKioqIENhcHR1cmluZyBHcm91cCAyOiBUaGUgc2xhc2ggb3IgYW4gZW1wdHkgc3RyaW5nLiBTbGFzaCAoJy8nKSBmb3IgZW5kIHRhZywgZW1wdHkgc3RyaW5nIGZvciBzdGFydCBvciBzZWxmLWNsb3NpbmcgdGFnLlxuXG5cdFx0XHRcdFx0Jyg/OicsXG5cdFx0XHRcdFx0XHRjb21tZW50VGFnUmVnZXguc291cmNlLCAgLy8gKioqIENhcHR1cmluZyBHcm91cCAzIC0gQSBDb21tZW50IFRhZydzIFRleHRcblxuXHRcdFx0XHRcdFx0J3wnLFxuXG5cdFx0XHRcdFx0XHQvLyBIYW5kbGUgdGFnIHdpdGhvdXQgYXR0cmlidXRlcy5cblx0XHRcdFx0XHRcdC8vIERvaW5nIHRoaXMgc2VwYXJhdGVseSBmcm9tIGEgdGFnIHRoYXQgaGFzIGF0dHJpYnV0ZXNcblx0XHRcdFx0XHRcdC8vIHRvIGZpeCBhIHJlZ2V4IHRpbWUgY29tcGxleGl0eSBpc3N1ZSBzZWVuIHdpdGggdGhlXG5cdFx0XHRcdFx0XHQvLyBleGFtcGxlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9ncmVnamFjb2JzL0F1dG9saW5rZXIuanMvaXNzdWVzLzE3MlxuXHRcdFx0XHRcdFx0Jyg/OicsXG5cdFx0XHRcdFx0XHRcdC8vICoqKiBDYXB0dXJpbmcgR3JvdXAgNCAtIFRoZSB0YWcgbmFtZSBmb3IgYSB0YWcgd2l0aG91dCBhdHRyaWJ1dGVzXG5cdFx0XHRcdFx0XHRcdCcoJyArIHRhZ05hbWVSZWdleC5zb3VyY2UgKyAnKScsXG5cblx0XHRcdFx0XHRcdFx0J1xcXFxzKi8/JywgIC8vIGFueSB0cmFpbGluZyBzcGFjZXMgYW5kIG9wdGlvbmFsICcvJyBiZWZvcmUgdGhlIGNsb3NpbmcgJz4nXG5cdFx0XHRcdFx0XHQnKScsXG5cblx0XHRcdFx0XHRcdCd8JyxcblxuXHRcdFx0XHRcdFx0Ly8gSGFuZGxlIHRhZyB3aXRoIGF0dHJpYnV0ZXNcblx0XHRcdFx0XHRcdC8vIERvaW5nIHRoaXMgc2VwYXJhdGVseSBmcm9tIGEgdGFnIHdpdGggbm8gYXR0cmlidXRlc1xuXHRcdFx0XHRcdFx0Ly8gdG8gZml4IGEgcmVnZXggdGltZSBjb21wbGV4aXR5IGlzc3VlIHNlZW4gd2l0aCB0aGVcblx0XHRcdFx0XHRcdC8vIGV4YW1wbGUgaW4gaHR0cHM6Ly9naXRodWIuY29tL2dyZWdqYWNvYnMvQXV0b2xpbmtlci5qcy9pc3N1ZXMvMTcyXG5cdFx0XHRcdFx0XHQnKD86Jyxcblx0XHRcdFx0XHRcdFx0Ly8gKioqIENhcHR1cmluZyBHcm91cCA1IC0gVGhlIHRhZyBuYW1lIGZvciBhIHRhZyB3aXRoIGF0dHJpYnV0ZXNcblx0XHRcdFx0XHRcdFx0JygnICsgdGFnTmFtZVJlZ2V4LnNvdXJjZSArICcpJyxcblxuXHRcdFx0XHRcdFx0XHQnXFxcXHMrJywgIC8vIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc3BhY2UgYWZ0ZXIgdGhlIHRhZyBuYW1lIHRvIHByZXZlbnQgUmVEb1MgaXNzdWUgKGlzc3VlICMxNzIpXG5cblx0XHRcdFx0XHRcdFx0Ly8gWmVybyBvciBtb3JlIGF0dHJpYnV0ZXMgZm9sbG93aW5nIHRoZSB0YWcgbmFtZVxuXHRcdFx0XHRcdFx0XHQnKD86Jyxcblx0XHRcdFx0XHRcdFx0XHQnKD86XFxcXHMrfFxcXFxiKScsICAgICAgICAvLyBhbnkgbnVtYmVyIG9mIHdoaXRlc3BhY2UgY2hhcnMgYmVmb3JlIGFuIGF0dHJpYnV0ZS4gTk9URTogVXNpbmcgXFxzKiBoZXJlIHRocm93cyBDaHJvbWUgaW50byBhbiBpbmZpbml0ZSBsb29wIGZvciBzb21lIHJlYXNvbiwgc28gdXNpbmcgXFxzK3xcXGIgaW5zdGVhZFxuXHRcdFx0XHRcdFx0XHRcdG5hbWVFcXVhbHNWYWx1ZVJlZ2V4LCAgLy8gYXR0cj1cInZhbHVlXCIgKHdpdGggb3B0aW9uYWwgPVwidmFsdWVcIiBwYXJ0KVxuXHRcdFx0XHRcdFx0XHQnKSonLFxuXG5cdFx0XHRcdFx0XHRcdCdcXFxccyovPycsICAvLyBhbnkgdHJhaWxpbmcgc3BhY2VzIGFuZCBvcHRpb25hbCAnLycgYmVmb3JlIHRoZSBjbG9zaW5nICc+J1xuXHRcdFx0XHRcdFx0JyknLFxuXHRcdFx0XHRcdCcpJyxcblx0XHRcdFx0Jz4nLFxuXHRcdFx0JyknXG5cdFx0XS5qb2luKCBcIlwiICksICdnaScgKTtcblx0fSApKCksXG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwcm9wZXJ0eSB7UmVnRXhwfSBodG1sQ2hhcmFjdGVyRW50aXRpZXNSZWdleFxuXHQgKlxuXHQgKiBUaGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyBjb21tb24gSFRNTCBjaGFyYWN0ZXIgZW50aXRpZXMuXG5cdCAqXG5cdCAqIElnbm9yaW5nICZhbXA7IGFzIGl0IGNvdWxkIGJlIHBhcnQgb2YgYSBxdWVyeSBzdHJpbmcgLS0gaGFuZGxpbmcgaXQgc2VwYXJhdGVseS5cblx0ICovXG5cdGh0bWxDaGFyYWN0ZXJFbnRpdGllc1JlZ2V4OiAvKCZuYnNwO3wmIzE2MDt8Jmx0O3wmIzYwO3wmZ3Q7fCYjNjI7fCZxdW90O3wmIzM0O3wmIzM5OykvZ2ksXG5cblxuXHQvKipcblx0ICogUGFyc2VzIGFuIEhUTUwgc3RyaW5nIGFuZCByZXR1cm5zIGEgc2ltcGxlIGFycmF5IG9mIHtAbGluayBBdXRvbGlua2VyLmh0bWxQYXJzZXIuSHRtbE5vZGUgSHRtbE5vZGVzfVxuXHQgKiB0byByZXByZXNlbnQgdGhlIEhUTUwgc3RydWN0dXJlIG9mIHRoZSBpbnB1dCBzdHJpbmcuXG5cdCAqXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBodG1sIFRoZSBIVE1MIHRvIHBhcnNlLlxuXHQgKiBAcmV0dXJuIHtBdXRvbGlua2VyLmh0bWxQYXJzZXIuSHRtbE5vZGVbXX1cblx0ICovXG5cdHBhcnNlIDogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0dmFyIGh0bWxSZWdleCA9IHRoaXMuaHRtbFJlZ2V4LFxuXHRcdCAgICBjdXJyZW50UmVzdWx0LFxuXHRcdCAgICBsYXN0SW5kZXggPSAwLFxuXHRcdCAgICB0ZXh0QW5kRW50aXR5Tm9kZXMsXG5cdFx0ICAgIG5vZGVzID0gW107ICAvLyB3aWxsIGJlIHRoZSByZXN1bHQgb2YgdGhlIG1ldGhvZFxuXG5cdFx0d2hpbGUoICggY3VycmVudFJlc3VsdCA9IGh0bWxSZWdleC5leGVjKCBodG1sICkgKSAhPT0gbnVsbCApIHtcblx0XHRcdHZhciB0YWdUZXh0ID0gY3VycmVudFJlc3VsdFsgMCBdLFxuXHRcdFx0ICAgIGNvbW1lbnRUZXh0ID0gY3VycmVudFJlc3VsdFsgMyBdLCAvLyBpZiB3ZSd2ZSBtYXRjaGVkIGEgY29tbWVudFxuXHRcdFx0ICAgIHRhZ05hbWUgPSBjdXJyZW50UmVzdWx0WyAxIF0gfHwgY3VycmVudFJlc3VsdFsgNCBdIHx8IGN1cnJlbnRSZXN1bHRbIDUgXSwgIC8vIFRoZSA8IURPQ1RZUEU+IHRhZyAoZXg6IFwiIURPQ1RZUEVcIiksIG9yIGFub3RoZXIgdGFnIChleDogXCJhXCIgb3IgXCJpbWdcIilcblx0XHRcdCAgICBpc0Nsb3NpbmdUYWcgPSAhIWN1cnJlbnRSZXN1bHRbIDIgXSxcblx0XHRcdCAgICBvZmZzZXQgPSBjdXJyZW50UmVzdWx0LmluZGV4LFxuXHRcdFx0ICAgIGluQmV0d2VlblRhZ3NUZXh0ID0gaHRtbC5zdWJzdHJpbmcoIGxhc3RJbmRleCwgb2Zmc2V0ICk7XG5cblx0XHRcdC8vIFB1c2ggVGV4dE5vZGVzIGFuZCBFbnRpdHlOb2RlcyBmb3IgYW55IHRleHQgZm91bmQgYmV0d2VlbiB0YWdzXG5cdFx0XHRpZiggaW5CZXR3ZWVuVGFnc1RleHQgKSB7XG5cdFx0XHRcdHRleHRBbmRFbnRpdHlOb2RlcyA9IHRoaXMucGFyc2VUZXh0QW5kRW50aXR5Tm9kZXMoIGxhc3RJbmRleCwgaW5CZXR3ZWVuVGFnc1RleHQgKTtcblx0XHRcdFx0bm9kZXMucHVzaC5hcHBseSggbm9kZXMsIHRleHRBbmRFbnRpdHlOb2RlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBQdXNoIHRoZSBDb21tZW50Tm9kZSBvciBFbGVtZW50Tm9kZVxuXHRcdFx0aWYoIGNvbW1lbnRUZXh0ICkge1xuXHRcdFx0XHRub2Rlcy5wdXNoKCB0aGlzLmNyZWF0ZUNvbW1lbnROb2RlKCBvZmZzZXQsIHRhZ1RleHQsIGNvbW1lbnRUZXh0ICkgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG5vZGVzLnB1c2goIHRoaXMuY3JlYXRlRWxlbWVudE5vZGUoIG9mZnNldCwgdGFnVGV4dCwgdGFnTmFtZSwgaXNDbG9zaW5nVGFnICkgKTtcblx0XHRcdH1cblxuXHRcdFx0bGFzdEluZGV4ID0gb2Zmc2V0ICsgdGFnVGV4dC5sZW5ndGg7XG5cdFx0fVxuXG5cdFx0Ly8gUHJvY2VzcyBhbnkgcmVtYWluaW5nIHRleHQgYWZ0ZXIgdGhlIGxhc3QgSFRNTCBlbGVtZW50LiBXaWxsIHByb2Nlc3MgYWxsIG9mIHRoZSB0ZXh0IGlmIHRoZXJlIHdlcmUgbm8gSFRNTCBlbGVtZW50cy5cblx0XHRpZiggbGFzdEluZGV4IDwgaHRtbC5sZW5ndGggKSB7XG5cdFx0XHR2YXIgdGV4dCA9IGh0bWwuc3Vic3RyaW5nKCBsYXN0SW5kZXggKTtcblxuXHRcdFx0Ly8gUHVzaCBUZXh0Tm9kZXMgYW5kIEVudGl0eU5vZGVzIGZvciBhbnkgdGV4dCBmb3VuZCBiZXR3ZWVuIHRhZ3Ncblx0XHRcdGlmKCB0ZXh0ICkge1xuXHRcdFx0XHR0ZXh0QW5kRW50aXR5Tm9kZXMgPSB0aGlzLnBhcnNlVGV4dEFuZEVudGl0eU5vZGVzKCBsYXN0SW5kZXgsIHRleHQgKTtcblxuXHRcdFx0XHQvLyBOb3RlOiB0aGUgZm9sbG93aW5nIDMgbGluZXMgd2VyZSBwcmV2aW91c2x5OlxuXHRcdFx0XHQvLyAgIG5vZGVzLnB1c2guYXBwbHkoIG5vZGVzLCB0ZXh0QW5kRW50aXR5Tm9kZXMgKTtcblx0XHRcdFx0Ly8gYnV0IHRoaXMgd2FzIGNhdXNpbmcgYSBcIk1heGltdW0gQ2FsbCBTdGFjayBTaXplIEV4Y2VlZGVkXCJcblx0XHRcdFx0Ly8gZXJyb3Igb24gaW5wdXRzIHdpdGggYSBsYXJnZSBudW1iZXIgb2YgaHRtbCBlbnRpdGllcy5cblx0XHRcdFx0dGV4dEFuZEVudGl0eU5vZGVzLmZvckVhY2goIGZ1bmN0aW9uKCBub2RlICkge1xuXHRcdFx0XHRcdG5vZGVzLnB1c2goIG5vZGUgKTtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBub2Rlcztcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBQYXJzZXMgdGV4dCBhbmQgSFRNTCBlbnRpdHkgbm9kZXMgZnJvbSBhIGdpdmVuIHN0cmluZy4gVGhlIGlucHV0IHN0cmluZ1xuXHQgKiBzaG91bGQgbm90IGhhdmUgYW55IEhUTUwgdGFncyAoZWxlbWVudHMpIHdpdGhpbiBpdC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBUaGUgb2Zmc2V0IG9mIHRoZSB0ZXh0IG5vZGUgbWF0Y2ggd2l0aGluIHRoZVxuXHQgKiAgIG9yaWdpbmFsIEhUTUwgc3RyaW5nLlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgc3RyaW5nIG9mIHRleHQgdG8gcGFyc2UuIFRoaXMgaXMgZnJvbSBhbiBIVE1MXG5cdCAqICAgdGV4dCBub2RlLlxuXHQgKiBAcmV0dXJuIHtBdXRvbGlua2VyLmh0bWxQYXJzZXIuSHRtbE5vZGVbXX0gQW4gYXJyYXkgb2YgSHRtbE5vZGVzIHRvXG5cdCAqICAgcmVwcmVzZW50IHRoZSB7QGxpbmsgQXV0b2xpbmtlci5odG1sUGFyc2VyLlRleHROb2RlIFRleHROb2Rlc30gYW5kXG5cdCAqICAge0BsaW5rIEF1dG9saW5rZXIuaHRtbFBhcnNlci5FbnRpdHlOb2RlIEVudGl0eU5vZGVzfSBmb3VuZC5cblx0ICovXG5cdHBhcnNlVGV4dEFuZEVudGl0eU5vZGVzIDogZnVuY3Rpb24oIG9mZnNldCwgdGV4dCApIHtcblx0XHR2YXIgbm9kZXMgPSBbXSxcblx0XHQgICAgdGV4dEFuZEVudGl0eVRva2VucyA9IEF1dG9saW5rZXIuVXRpbC5zcGxpdEFuZENhcHR1cmUoIHRleHQsIHRoaXMuaHRtbENoYXJhY3RlckVudGl0aWVzUmVnZXggKTsgIC8vIHNwbGl0IGF0IEhUTUwgZW50aXRpZXMsIGJ1dCBpbmNsdWRlIHRoZSBIVE1MIGVudGl0aWVzIGluIHRoZSByZXN1bHRzIGFycmF5XG5cblx0XHQvLyBFdmVyeSBldmVuIG51bWJlcmVkIHRva2VuIGlzIGEgVGV4dE5vZGUsIGFuZCBldmVyeSBvZGQgbnVtYmVyZWQgdG9rZW4gaXMgYW4gRW50aXR5Tm9kZVxuXHRcdC8vIEZvciBleGFtcGxlOiBhbiBpbnB1dCBgdGV4dGAgb2YgXCJUZXN0ICZxdW90O3RoaXMmcXVvdDsgdG9kYXlcIiB3b3VsZCB0dXJuIGludG8gdGhlXG5cdFx0Ly8gICBgdGV4dEFuZEVudGl0eVRva2Vuc2A6IFsgJ1Rlc3QgJywgJyZxdW90OycsICd0aGlzJywgJyZxdW90OycsICcgdG9kYXknIF1cblx0XHRmb3IoIHZhciBpID0gMCwgbGVuID0gdGV4dEFuZEVudGl0eVRva2Vucy5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMiApIHtcblx0XHRcdHZhciB0ZXh0VG9rZW4gPSB0ZXh0QW5kRW50aXR5VG9rZW5zWyBpIF0sXG5cdFx0XHQgICAgZW50aXR5VG9rZW4gPSB0ZXh0QW5kRW50aXR5VG9rZW5zWyBpICsgMSBdO1xuXG5cdFx0XHRpZiggdGV4dFRva2VuICkge1xuXHRcdFx0XHRub2Rlcy5wdXNoKCB0aGlzLmNyZWF0ZVRleHROb2RlKCBvZmZzZXQsIHRleHRUb2tlbiApICk7XG5cdFx0XHRcdG9mZnNldCArPSB0ZXh0VG9rZW4ubGVuZ3RoO1xuXHRcdFx0fVxuXHRcdFx0aWYoIGVudGl0eVRva2VuICkge1xuXHRcdFx0XHRub2Rlcy5wdXNoKCB0aGlzLmNyZWF0ZUVudGl0eU5vZGUoIG9mZnNldCwgZW50aXR5VG9rZW4gKSApO1xuXHRcdFx0XHRvZmZzZXQgKz0gZW50aXR5VG9rZW4ubGVuZ3RoO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbm9kZXM7XG5cdH0sXG5cblxuXHQvKipcblx0ICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGFuIHtAbGluayBBdXRvbGlua2VyLmh0bWxQYXJzZXIuQ29tbWVudE5vZGUgQ29tbWVudE5vZGV9LlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IFRoZSBvZmZzZXQgb2YgdGhlIG1hdGNoIHdpdGhpbiB0aGUgb3JpZ2luYWwgSFRNTFxuXHQgKiAgIHN0cmluZy5cblx0ICogQHBhcmFtIHtTdHJpbmd9IHRhZ1RleHQgVGhlIGZ1bGwgdGV4dCBvZiB0aGUgdGFnIChjb21tZW50KSB0aGF0IHdhc1xuXHQgKiAgIG1hdGNoZWQsIGluY2x1ZGluZyBpdHMgJmx0OyEtLSBhbmQgLS0mZ3Q7LlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gY29tbWVudFRleHQgVGhlIGZ1bGwgdGV4dCBvZiB0aGUgY29tbWVudCB0aGF0IHdhcyBtYXRjaGVkLlxuXHQgKi9cblx0Y3JlYXRlQ29tbWVudE5vZGUgOiBmdW5jdGlvbiggb2Zmc2V0LCB0YWdUZXh0LCBjb21tZW50VGV4dCApIHtcblx0XHRyZXR1cm4gbmV3IEF1dG9saW5rZXIuaHRtbFBhcnNlci5Db21tZW50Tm9kZSgge1xuXHRcdFx0b2Zmc2V0IDogb2Zmc2V0LFxuXHRcdFx0dGV4dCAgIDogdGFnVGV4dCxcblx0XHRcdGNvbW1lbnQ6IEF1dG9saW5rZXIuVXRpbC50cmltKCBjb21tZW50VGV4dCApXG5cdFx0fSApO1xuXHR9LFxuXG5cblx0LyoqXG5cdCAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhbiB7QGxpbmsgQXV0b2xpbmtlci5odG1sUGFyc2VyLkVsZW1lbnROb2RlIEVsZW1lbnROb2RlfS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBUaGUgb2Zmc2V0IG9mIHRoZSBtYXRjaCB3aXRoaW4gdGhlIG9yaWdpbmFsIEhUTUxcblx0ICogICBzdHJpbmcuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0YWdUZXh0IFRoZSBmdWxsIHRleHQgb2YgdGhlIHRhZyAoZWxlbWVudCkgdGhhdCB3YXNcblx0ICogICBtYXRjaGVkLCBpbmNsdWRpbmcgaXRzIGF0dHJpYnV0ZXMuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0YWdOYW1lIFRoZSBuYW1lIG9mIHRoZSB0YWcuIEV4OiBBbiAmbHQ7aW1nJmd0OyB0YWcgd291bGRcblx0ICogICBiZSBwYXNzZWQgdG8gdGhpcyBtZXRob2QgYXMgXCJpbWdcIi5cblx0ICogQHBhcmFtIHtCb29sZWFufSBpc0Nsb3NpbmdUYWcgYHRydWVgIGlmIGl0J3MgYSBjbG9zaW5nIHRhZywgZmFsc2Vcblx0ICogICBvdGhlcndpc2UuXG5cdCAqIEByZXR1cm4ge0F1dG9saW5rZXIuaHRtbFBhcnNlci5FbGVtZW50Tm9kZX1cblx0ICovXG5cdGNyZWF0ZUVsZW1lbnROb2RlIDogZnVuY3Rpb24oIG9mZnNldCwgdGFnVGV4dCwgdGFnTmFtZSwgaXNDbG9zaW5nVGFnICkge1xuXHRcdHJldHVybiBuZXcgQXV0b2xpbmtlci5odG1sUGFyc2VyLkVsZW1lbnROb2RlKCB7XG5cdFx0XHRvZmZzZXQgIDogb2Zmc2V0LFxuXHRcdFx0dGV4dCAgICA6IHRhZ1RleHQsXG5cdFx0XHR0YWdOYW1lIDogdGFnTmFtZS50b0xvd2VyQ2FzZSgpLFxuXHRcdFx0Y2xvc2luZyA6IGlzQ2xvc2luZ1RhZ1xuXHRcdH0gKTtcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSB7QGxpbmsgQXV0b2xpbmtlci5odG1sUGFyc2VyLkVudGl0eU5vZGUgRW50aXR5Tm9kZX0uXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgVGhlIG9mZnNldCBvZiB0aGUgbWF0Y2ggd2l0aGluIHRoZSBvcmlnaW5hbCBIVE1MXG5cdCAqICAgc3RyaW5nLlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgdGV4dCB0aGF0IHdhcyBtYXRjaGVkIGZvciB0aGUgSFRNTCBlbnRpdHkgKHN1Y2hcblx0ICogICBhcyAnJmFtcDtuYnNwOycpLlxuXHQgKiBAcmV0dXJuIHtBdXRvbGlua2VyLmh0bWxQYXJzZXIuRW50aXR5Tm9kZX1cblx0ICovXG5cdGNyZWF0ZUVudGl0eU5vZGUgOiBmdW5jdGlvbiggb2Zmc2V0LCB0ZXh0ICkge1xuXHRcdHJldHVybiBuZXcgQXV0b2xpbmtlci5odG1sUGFyc2VyLkVudGl0eU5vZGUoIHsgb2Zmc2V0OiBvZmZzZXQsIHRleHQ6IHRleHQgfSApO1xuXHR9LFxuXG5cblx0LyoqXG5cdCAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIHtAbGluayBBdXRvbGlua2VyLmh0bWxQYXJzZXIuVGV4dE5vZGUgVGV4dE5vZGV9LlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IFRoZSBvZmZzZXQgb2YgdGhlIG1hdGNoIHdpdGhpbiB0aGUgb3JpZ2luYWwgSFRNTFxuXHQgKiAgIHN0cmluZy5cblx0ICogQHBhcmFtIHtTdHJpbmd9IHRleHQgVGhlIHRleHQgdGhhdCB3YXMgbWF0Y2hlZC5cblx0ICogQHJldHVybiB7QXV0b2xpbmtlci5odG1sUGFyc2VyLlRleHROb2RlfVxuXHQgKi9cblx0Y3JlYXRlVGV4dE5vZGUgOiBmdW5jdGlvbiggb2Zmc2V0LCB0ZXh0ICkge1xuXHRcdHJldHVybiBuZXcgQXV0b2xpbmtlci5odG1sUGFyc2VyLlRleHROb2RlKCB7IG9mZnNldDogb2Zmc2V0LCB0ZXh0OiB0ZXh0IH0gKTtcblx0fVxuXG59ICk7XG5cbi8qZ2xvYmFsIEF1dG9saW5rZXIgKi9cbi8qKlxuICogQGFic3RyYWN0XG4gKiBAY2xhc3MgQXV0b2xpbmtlci5odG1sUGFyc2VyLkh0bWxOb2RlXG4gKlxuICogUmVwcmVzZW50cyBhbiBIVE1MIG5vZGUgZm91bmQgaW4gYW4gaW5wdXQgc3RyaW5nLiBBbiBIVE1MIG5vZGUgaXMgb25lIG9mIHRoZVxuICogZm9sbG93aW5nOlxuICpcbiAqIDEuIEFuIHtAbGluayBBdXRvbGlua2VyLmh0bWxQYXJzZXIuRWxlbWVudE5vZGUgRWxlbWVudE5vZGV9LCB3aGljaCByZXByZXNlbnRzXG4gKiAgICBIVE1MIHRhZ3MuXG4gKiAyLiBBIHtAbGluayBBdXRvbGlua2VyLmh0bWxQYXJzZXIuQ29tbWVudE5vZGUgQ29tbWVudE5vZGV9LCB3aGljaCByZXByZXNlbnRzXG4gKiAgICBIVE1MIGNvbW1lbnRzLlxuICogMy4gQSB7QGxpbmsgQXV0b2xpbmtlci5odG1sUGFyc2VyLlRleHROb2RlIFRleHROb2RlfSwgd2hpY2ggcmVwcmVzZW50cyB0ZXh0XG4gKiAgICBvdXRzaWRlIG9yIHdpdGhpbiBIVE1MIHRhZ3MuXG4gKiA0LiBBIHtAbGluayBBdXRvbGlua2VyLmh0bWxQYXJzZXIuRW50aXR5Tm9kZSBFbnRpdHlOb2RlfSwgd2hpY2ggcmVwcmVzZW50c1xuICogICAgb25lIG9mIHRoZSBrbm93biBIVE1MIGVudGl0aWVzIHRoYXQgQXV0b2xpbmtlciBsb29rcyBmb3IuIFRoaXMgaW5jbHVkZXNcbiAqICAgIGNvbW1vbiBvbmVzIHN1Y2ggYXMgJmFtcDtxdW90OyBhbmQgJmFtcDtuYnNwO1xuICovXG5BdXRvbGlua2VyLmh0bWxQYXJzZXIuSHRtbE5vZGUgPSBBdXRvbGlua2VyLlV0aWwuZXh0ZW5kKCBPYmplY3QsIHtcblxuXHQvKipcblx0ICogQGNmZyB7TnVtYmVyfSBvZmZzZXQgKHJlcXVpcmVkKVxuXHQgKlxuXHQgKiBUaGUgb2Zmc2V0IG9mIHRoZSBIVE1MIG5vZGUgaW4gdGhlIG9yaWdpbmFsIHRleHQgdGhhdCB3YXMgcGFyc2VkLlxuXHQgKi9cblx0b2Zmc2V0IDogdW5kZWZpbmVkLFxuXG5cdC8qKlxuXHQgKiBAY2ZnIHtTdHJpbmd9IHRleHQgKHJlcXVpcmVkKVxuXHQgKlxuXHQgKiBUaGUgdGV4dCB0aGF0IHdhcyBtYXRjaGVkIGZvciB0aGUgSHRtbE5vZGUuXG5cdCAqXG5cdCAqIC0gSW4gdGhlIGNhc2Ugb2YgYW4ge0BsaW5rIEF1dG9saW5rZXIuaHRtbFBhcnNlci5FbGVtZW50Tm9kZSBFbGVtZW50Tm9kZX0sXG5cdCAqICAgdGhpcyB3aWxsIGJlIHRoZSB0YWcncyB0ZXh0LlxuXHQgKiAtIEluIHRoZSBjYXNlIG9mIGFuIHtAbGluayBBdXRvbGlua2VyLmh0bWxQYXJzZXIuQ29tbWVudE5vZGUgQ29tbWVudE5vZGV9LFxuXHQgKiAgIHRoaXMgd2lsbCBiZSB0aGUgY29tbWVudCdzIHRleHQuXG5cdCAqIC0gSW4gdGhlIGNhc2Ugb2YgYSB7QGxpbmsgQXV0b2xpbmtlci5odG1sUGFyc2VyLlRleHROb2RlIFRleHROb2RlfSwgdGhpc1xuXHQgKiAgIHdpbGwgYmUgdGhlIHRleHQgaXRzZWxmLlxuXHQgKiAtIEluIHRoZSBjYXNlIG9mIGEge0BsaW5rIEF1dG9saW5rZXIuaHRtbFBhcnNlci5FbnRpdHlOb2RlIEVudGl0eU5vZGV9LFxuXHQgKiAgIHRoaXMgd2lsbCBiZSB0aGUgdGV4dCBvZiB0aGUgSFRNTCBlbnRpdHkuXG5cdCAqL1xuXHR0ZXh0IDogdW5kZWZpbmVkLFxuXG5cblx0LyoqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAcGFyYW0ge09iamVjdH0gY2ZnIFRoZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIHRoZSBNYXRjaCBpbnN0YW5jZSxcblx0ICogc3BlY2lmaWVkIGluIGFuIE9iamVjdCAobWFwKS5cblx0ICovXG5cdGNvbnN0cnVjdG9yIDogZnVuY3Rpb24oIGNmZyApIHtcblx0XHRBdXRvbGlua2VyLlV0aWwuYXNzaWduKCB0aGlzLCBjZmcgKTtcblxuXHRcdGlmKCB0aGlzLm9mZnNldCA9PSBudWxsICkgdGhyb3cgbmV3IEVycm9yKCAnYG9mZnNldGAgY2ZnIHJlcXVpcmVkJyApO1xuXHRcdGlmKCB0aGlzLnRleHQgPT0gbnVsbCApIHRocm93IG5ldyBFcnJvciggJ2B0ZXh0YCBjZmcgcmVxdWlyZWQnICk7XG5cdH0sXG5cblxuXHQvKipcblx0ICogUmV0dXJucyBhIHN0cmluZyBuYW1lIGZvciB0aGUgdHlwZSBvZiBub2RlIHRoYXQgdGhpcyBjbGFzcyByZXByZXNlbnRzLlxuXHQgKlxuXHQgKiBAYWJzdHJhY3Rcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0VHlwZSA6IEF1dG9saW5rZXIuVXRpbC5hYnN0cmFjdE1ldGhvZCxcblxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHtAbGluayAjb2Zmc2V0fSBvZiB0aGUgSHRtbE5vZGUuIFRoaXMgaXMgdGhlIG9mZnNldCBvZiB0aGVcblx0ICogSFRNTCBub2RlIGluIHRoZSBvcmlnaW5hbCBzdHJpbmcgdGhhdCB3YXMgcGFyc2VkLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtOdW1iZXJ9XG5cdCAqL1xuXHRnZXRPZmZzZXQgOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5vZmZzZXQ7XG5cdH0sXG5cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSB7QGxpbmsgI3RleHR9IGZvciB0aGUgSHRtbE5vZGUuXG5cdCAqXG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICovXG5cdGdldFRleHQgOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy50ZXh0O1xuXHR9XG5cbn0gKTtcbi8qZ2xvYmFsIEF1dG9saW5rZXIgKi9cbi8qKlxuICogQGNsYXNzIEF1dG9saW5rZXIuaHRtbFBhcnNlci5Db21tZW50Tm9kZVxuICogQGV4dGVuZHMgQXV0b2xpbmtlci5odG1sUGFyc2VyLkh0bWxOb2RlXG4gKlxuICogUmVwcmVzZW50cyBhbiBIVE1MIGNvbW1lbnQgbm9kZSB0aGF0IGhhcyBiZWVuIHBhcnNlZCBieSB0aGVcbiAqIHtAbGluayBBdXRvbGlua2VyLmh0bWxQYXJzZXIuSHRtbFBhcnNlcn0uXG4gKlxuICogU2VlIHRoaXMgY2xhc3MncyBzdXBlcmNsYXNzICh7QGxpbmsgQXV0b2xpbmtlci5odG1sUGFyc2VyLkh0bWxOb2RlfSkgZm9yIG1vcmVcbiAqIGRldGFpbHMuXG4gKi9cbkF1dG9saW5rZXIuaHRtbFBhcnNlci5Db21tZW50Tm9kZSA9IEF1dG9saW5rZXIuVXRpbC5leHRlbmQoIEF1dG9saW5rZXIuaHRtbFBhcnNlci5IdG1sTm9kZSwge1xuXG5cdC8qKlxuXHQgKiBAY2ZnIHtTdHJpbmd9IGNvbW1lbnQgKHJlcXVpcmVkKVxuXHQgKlxuXHQgKiBUaGUgdGV4dCBpbnNpZGUgdGhlIGNvbW1lbnQgdGFnLiBUaGlzIHRleHQgaXMgc3RyaXBwZWQgb2YgYW55IGxlYWRpbmcgb3Jcblx0ICogdHJhaWxpbmcgd2hpdGVzcGFjZS5cblx0ICovXG5cdGNvbW1lbnQgOiAnJyxcblxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgc3RyaW5nIG5hbWUgZm9yIHRoZSB0eXBlIG9mIG5vZGUgdGhhdCB0aGlzIGNsYXNzIHJlcHJlc2VudHMuXG5cdCAqXG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICovXG5cdGdldFR5cGUgOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gJ2NvbW1lbnQnO1xuXHR9LFxuXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGNvbW1lbnQgaW5zaWRlIHRoZSBjb21tZW50IHRhZy5cblx0ICpcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0Q29tbWVudCA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmNvbW1lbnQ7XG5cdH1cblxufSApO1xuLypnbG9iYWwgQXV0b2xpbmtlciAqL1xuLyoqXG4gKiBAY2xhc3MgQXV0b2xpbmtlci5odG1sUGFyc2VyLkVsZW1lbnROb2RlXG4gKiBAZXh0ZW5kcyBBdXRvbGlua2VyLmh0bWxQYXJzZXIuSHRtbE5vZGVcbiAqXG4gKiBSZXByZXNlbnRzIGFuIEhUTUwgZWxlbWVudCBub2RlIHRoYXQgaGFzIGJlZW4gcGFyc2VkIGJ5IHRoZSB7QGxpbmsgQXV0b2xpbmtlci5odG1sUGFyc2VyLkh0bWxQYXJzZXJ9LlxuICpcbiAqIFNlZSB0aGlzIGNsYXNzJ3Mgc3VwZXJjbGFzcyAoe0BsaW5rIEF1dG9saW5rZXIuaHRtbFBhcnNlci5IdG1sTm9kZX0pIGZvciBtb3JlXG4gKiBkZXRhaWxzLlxuICovXG5BdXRvbGlua2VyLmh0bWxQYXJzZXIuRWxlbWVudE5vZGUgPSBBdXRvbGlua2VyLlV0aWwuZXh0ZW5kKCBBdXRvbGlua2VyLmh0bWxQYXJzZXIuSHRtbE5vZGUsIHtcblxuXHQvKipcblx0ICogQGNmZyB7U3RyaW5nfSB0YWdOYW1lIChyZXF1aXJlZClcblx0ICpcblx0ICogVGhlIG5hbWUgb2YgdGhlIHRhZyB0aGF0IHdhcyBtYXRjaGVkLlxuXHQgKi9cblx0dGFnTmFtZSA6ICcnLFxuXG5cdC8qKlxuXHQgKiBAY2ZnIHtCb29sZWFufSBjbG9zaW5nIChyZXF1aXJlZClcblx0ICpcblx0ICogYHRydWVgIGlmIHRoZSBlbGVtZW50ICh0YWcpIGlzIGEgY2xvc2luZyB0YWcsIGBmYWxzZWAgaWYgaXRzIGFuIG9wZW5pbmdcblx0ICogdGFnLlxuXHQgKi9cblx0Y2xvc2luZyA6IGZhbHNlLFxuXG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBzdHJpbmcgbmFtZSBmb3IgdGhlIHR5cGUgb2Ygbm9kZSB0aGF0IHRoaXMgY2xhc3MgcmVwcmVzZW50cy5cblx0ICpcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0VHlwZSA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiAnZWxlbWVudCc7XG5cdH0sXG5cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgSFRNTCBlbGVtZW50J3MgKHRhZydzKSBuYW1lLiBFeDogZm9yIGFuICZsdDtpbWcmZ3Q7IHRhZyxcblx0ICogcmV0dXJucyBcImltZ1wiLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqL1xuXHRnZXRUYWdOYW1lIDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMudGFnTmFtZTtcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIGlmIHRoZSBIVE1MIGVsZW1lbnQgKHRhZykgaXMgYSBjbG9zaW5nIHRhZy4gRXg6ICZsdDtkaXYmZ3Q7XG5cdCAqIHJldHVybnMgYGZhbHNlYCwgd2hpbGUgJmx0Oy9kaXYmZ3Q7IHJldHVybnMgYHRydWVgLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHQgKi9cblx0aXNDbG9zaW5nIDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuY2xvc2luZztcblx0fVxuXG59ICk7XG4vKmdsb2JhbCBBdXRvbGlua2VyICovXG4vKipcbiAqIEBjbGFzcyBBdXRvbGlua2VyLmh0bWxQYXJzZXIuRW50aXR5Tm9kZVxuICogQGV4dGVuZHMgQXV0b2xpbmtlci5odG1sUGFyc2VyLkh0bWxOb2RlXG4gKlxuICogUmVwcmVzZW50cyBhIGtub3duIEhUTUwgZW50aXR5IG5vZGUgdGhhdCBoYXMgYmVlbiBwYXJzZWQgYnkgdGhlIHtAbGluayBBdXRvbGlua2VyLmh0bWxQYXJzZXIuSHRtbFBhcnNlcn0uXG4gKiBFeDogJyZhbXA7bmJzcDsnLCBvciAnJmFtcCMxNjA7JyAod2hpY2ggd2lsbCBiZSByZXRyaWV2YWJsZSBmcm9tIHRoZSB7QGxpbmsgI2dldFRleHR9XG4gKiBtZXRob2QuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgY2xhc3Mgd2lsbCBvbmx5IGJlIHJldHVybmVkIGZyb20gdGhlIEh0bWxQYXJzZXIgZm9yIHRoZSBzZXQgb2ZcbiAqIGNoZWNrZWQgSFRNTCBlbnRpdHkgbm9kZXMgIGRlZmluZWQgYnkgdGhlIHtAbGluayBBdXRvbGlua2VyLmh0bWxQYXJzZXIuSHRtbFBhcnNlciNodG1sQ2hhcmFjdGVyRW50aXRpZXNSZWdleH0uXG4gKlxuICogU2VlIHRoaXMgY2xhc3MncyBzdXBlcmNsYXNzICh7QGxpbmsgQXV0b2xpbmtlci5odG1sUGFyc2VyLkh0bWxOb2RlfSkgZm9yIG1vcmVcbiAqIGRldGFpbHMuXG4gKi9cbkF1dG9saW5rZXIuaHRtbFBhcnNlci5FbnRpdHlOb2RlID0gQXV0b2xpbmtlci5VdGlsLmV4dGVuZCggQXV0b2xpbmtlci5odG1sUGFyc2VyLkh0bWxOb2RlLCB7XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBzdHJpbmcgbmFtZSBmb3IgdGhlIHR5cGUgb2Ygbm9kZSB0aGF0IHRoaXMgY2xhc3MgcmVwcmVzZW50cy5cblx0ICpcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0VHlwZSA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiAnZW50aXR5Jztcblx0fVxuXG59ICk7XG4vKmdsb2JhbCBBdXRvbGlua2VyICovXG4vKipcbiAqIEBjbGFzcyBBdXRvbGlua2VyLmh0bWxQYXJzZXIuVGV4dE5vZGVcbiAqIEBleHRlbmRzIEF1dG9saW5rZXIuaHRtbFBhcnNlci5IdG1sTm9kZVxuICpcbiAqIFJlcHJlc2VudHMgYSB0ZXh0IG5vZGUgdGhhdCBoYXMgYmVlbiBwYXJzZWQgYnkgdGhlIHtAbGluayBBdXRvbGlua2VyLmh0bWxQYXJzZXIuSHRtbFBhcnNlcn0uXG4gKlxuICogU2VlIHRoaXMgY2xhc3MncyBzdXBlcmNsYXNzICh7QGxpbmsgQXV0b2xpbmtlci5odG1sUGFyc2VyLkh0bWxOb2RlfSkgZm9yIG1vcmVcbiAqIGRldGFpbHMuXG4gKi9cbkF1dG9saW5rZXIuaHRtbFBhcnNlci5UZXh0Tm9kZSA9IEF1dG9saW5rZXIuVXRpbC5leHRlbmQoIEF1dG9saW5rZXIuaHRtbFBhcnNlci5IdG1sTm9kZSwge1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgc3RyaW5nIG5hbWUgZm9yIHRoZSB0eXBlIG9mIG5vZGUgdGhhdCB0aGlzIGNsYXNzIHJlcHJlc2VudHMuXG5cdCAqXG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICovXG5cdGdldFR5cGUgOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gJ3RleHQnO1xuXHR9XG5cbn0gKTtcbi8qZ2xvYmFsIEF1dG9saW5rZXIgKi9cbi8qKlxuICogQGFic3RyYWN0XG4gKiBAY2xhc3MgQXV0b2xpbmtlci5tYXRjaC5NYXRjaFxuICpcbiAqIFJlcHJlc2VudHMgYSBtYXRjaCBmb3VuZCBpbiBhbiBpbnB1dCBzdHJpbmcgd2hpY2ggc2hvdWxkIGJlIEF1dG9saW5rZWQuIEEgTWF0Y2ggb2JqZWN0IGlzIHdoYXQgaXMgcHJvdmlkZWQgaW4gYVxuICoge0BsaW5rIEF1dG9saW5rZXIjcmVwbGFjZUZuIHJlcGxhY2VGbn0sIGFuZCBtYXkgYmUgdXNlZCB0byBxdWVyeSBmb3IgZGV0YWlscyBhYm91dCB0aGUgbWF0Y2guXG4gKlxuICogRm9yIGV4YW1wbGU6XG4gKlxuICogICAgIHZhciBpbnB1dCA9IFwiLi4uXCI7ICAvLyBzdHJpbmcgd2l0aCBVUkxzLCBFbWFpbCBBZGRyZXNzZXMsIGFuZCBNZW50aW9ucyAoVHdpdHRlciwgSW5zdGFncmFtKVxuICpcbiAqICAgICB2YXIgbGlua2VkVGV4dCA9IEF1dG9saW5rZXIubGluayggaW5wdXQsIHtcbiAqICAgICAgICAgcmVwbGFjZUZuIDogZnVuY3Rpb24oIG1hdGNoICkge1xuICogICAgICAgICAgICAgY29uc29sZS5sb2coIFwiaHJlZiA9IFwiLCBtYXRjaC5nZXRBbmNob3JIcmVmKCkgKTtcbiAqICAgICAgICAgICAgIGNvbnNvbGUubG9nKCBcInRleHQgPSBcIiwgbWF0Y2guZ2V0QW5jaG9yVGV4dCgpICk7XG4gKlxuICogICAgICAgICAgICAgc3dpdGNoKCBtYXRjaC5nZXRUeXBlKCkgKSB7XG4gKiAgICAgICAgICAgICAgICAgY2FzZSAndXJsJyA6XG4gKiAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCBcInVybDogXCIsIG1hdGNoLmdldFVybCgpICk7XG4gKlxuICogICAgICAgICAgICAgICAgIGNhc2UgJ2VtYWlsJyA6XG4gKiAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCBcImVtYWlsOiBcIiwgbWF0Y2guZ2V0RW1haWwoKSApO1xuICpcbiAqICAgICAgICAgICAgICAgICBjYXNlICdtZW50aW9uJyA6XG4gKiAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCBcIm1lbnRpb246IFwiLCBtYXRjaC5nZXRNZW50aW9uKCkgKTtcbiAqICAgICAgICAgICAgIH1cbiAqICAgICAgICAgfVxuICogICAgIH0gKTtcbiAqXG4gKiBTZWUgdGhlIHtAbGluayBBdXRvbGlua2VyfSBjbGFzcyBmb3IgbW9yZSBkZXRhaWxzIG9uIHVzaW5nIHRoZSB7QGxpbmsgQXV0b2xpbmtlciNyZXBsYWNlRm4gcmVwbGFjZUZufS5cbiAqL1xuQXV0b2xpbmtlci5tYXRjaC5NYXRjaCA9IEF1dG9saW5rZXIuVXRpbC5leHRlbmQoIE9iamVjdCwge1xuXG5cdC8qKlxuXHQgKiBAY2ZnIHtBdXRvbGlua2VyLkFuY2hvclRhZ0J1aWxkZXJ9IHRhZ0J1aWxkZXIgKHJlcXVpcmVkKVxuXHQgKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIEFuY2hvclRhZ0J1aWxkZXIgaW5zdGFuY2UgdG8gdXNlIHRvIGdlbmVyYXRlIGFuIGFuY2hvclxuXHQgKiB0YWcgZm9yIHRoZSBNYXRjaC5cblx0ICovXG5cblx0LyoqXG5cdCAqIEBjZmcge1N0cmluZ30gbWF0Y2hlZFRleHQgKHJlcXVpcmVkKVxuXHQgKlxuXHQgKiBUaGUgb3JpZ2luYWwgdGV4dCB0aGF0IHdhcyBtYXRjaGVkIGJ5IHRoZSB7QGxpbmsgQXV0b2xpbmtlci5tYXRjaGVyLk1hdGNoZXJ9LlxuXHQgKi9cblxuXHQvKipcblx0ICogQGNmZyB7TnVtYmVyfSBvZmZzZXQgKHJlcXVpcmVkKVxuXHQgKlxuXHQgKiBUaGUgb2Zmc2V0IG9mIHdoZXJlIHRoZSBtYXRjaCB3YXMgbWFkZSBpbiB0aGUgaW5wdXQgc3RyaW5nLlxuXHQgKi9cblxuXG5cdC8qKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICogQHBhcmFtIHtPYmplY3R9IGNmZyBUaGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgTWF0Y2hcblx0ICogICBpbnN0YW5jZSwgc3BlY2lmaWVkIGluIGFuIE9iamVjdCAobWFwKS5cblx0ICovXG5cdGNvbnN0cnVjdG9yIDogZnVuY3Rpb24oIGNmZyApIHtcblx0XHRpZiggY2ZnLnRhZ0J1aWxkZXIgPT0gbnVsbCApIHRocm93IG5ldyBFcnJvciggJ2B0YWdCdWlsZGVyYCBjZmcgcmVxdWlyZWQnICk7XG5cdFx0aWYoIGNmZy5tYXRjaGVkVGV4dCA9PSBudWxsICkgdGhyb3cgbmV3IEVycm9yKCAnYG1hdGNoZWRUZXh0YCBjZmcgcmVxdWlyZWQnICk7XG5cdFx0aWYoIGNmZy5vZmZzZXQgPT0gbnVsbCApIHRocm93IG5ldyBFcnJvciggJ2BvZmZzZXRgIGNmZyByZXF1aXJlZCcgKTtcblxuXHRcdHRoaXMudGFnQnVpbGRlciA9IGNmZy50YWdCdWlsZGVyO1xuXHRcdHRoaXMubWF0Y2hlZFRleHQgPSBjZmcubWF0Y2hlZFRleHQ7XG5cdFx0dGhpcy5vZmZzZXQgPSBjZmcub2Zmc2V0O1xuXHR9LFxuXG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBzdHJpbmcgbmFtZSBmb3IgdGhlIHR5cGUgb2YgbWF0Y2ggdGhhdCB0aGlzIGNsYXNzIHJlcHJlc2VudHMuXG5cdCAqXG5cdCAqIEBhYnN0cmFjdFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqL1xuXHRnZXRUeXBlIDogQXV0b2xpbmtlci5VdGlsLmFic3RyYWN0TWV0aG9kLFxuXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHRleHQgdGhhdCB3YXMgbWF0Y2hlZC5cblx0ICpcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0TWF0Y2hlZFRleHQgOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXRjaGVkVGV4dDtcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSB7QGxpbmsgI29mZnNldH0gb2Ygd2hlcmUgdGhlIG1hdGNoIHdhcyBtYWRlIGluIHRoZSBpbnB1dCBzdHJpbmcuXG5cdCAqXG5cdCAqIEEge0BsaW5rIEF1dG9saW5rZXIubWF0Y2hlci5NYXRjaGVyfSB3aWxsIGJlIGZlZCBvbmx5IEhUTUwgdGV4dCBub2Rlcyxcblx0ICogYW5kIHdpbGwgdGhlcmVmb3JlIHNldCBhbiBvcmlnaW5hbCBvZmZzZXQgdGhhdCBpcyByZWxhdGl2ZSB0byB0aGUgSFRNTFxuXHQgKiB0ZXh0IG5vZGUgaXRzZWxmLiBIb3dldmVyLCB3ZSB3YW50IHRoaXMgb2Zmc2V0IHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBmdWxsXG5cdCAqIEhUTUwgaW5wdXQgc3RyaW5nLCBhbmQgdGh1cyBpZiB1c2luZyB7QGxpbmsgQXV0b2xpbmtlciNwYXJzZX0gKHJhdGhlclxuXHQgKiB0aGFuIGNhbGxpbmcgYSB7QGxpbmsgQXV0b2xpbmtlci5tYXRjaGVyLk1hdGNoZXJ9IGRpcmVjdGx5KSwgdGhlbiB0aGlzXG5cdCAqIG9mZnNldCBpcyBjb3JyZWN0ZWQgYWZ0ZXIgdGhlIE1hdGNoZXIgaXRzZWxmIGhhcyBkb25lIGl0cyBqb2IuXG5cdCAqXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXRcblx0ICovXG5cdHNldE9mZnNldCA6IGZ1bmN0aW9uKCBvZmZzZXQgKSB7XG5cdFx0dGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG5cdH0sXG5cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHdoZXJlIHRoZSBtYXRjaCB3YXMgbWFkZSBpbiB0aGUgaW5wdXQgc3RyaW5nLiBUaGlzXG5cdCAqIGlzIHRoZSAwLWJhc2VkIGluZGV4IG9mIHRoZSBtYXRjaC5cblx0ICpcblx0ICogQHJldHVybiB7TnVtYmVyfVxuXHQgKi9cblx0Z2V0T2Zmc2V0IDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMub2Zmc2V0O1xuXHR9LFxuXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGFuY2hvciBocmVmIHRoYXQgc2hvdWxkIGJlIGdlbmVyYXRlZCBmb3IgdGhlIG1hdGNoLlxuXHQgKlxuXHQgKiBAYWJzdHJhY3Rcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0QW5jaG9ySHJlZiA6IEF1dG9saW5rZXIuVXRpbC5hYnN0cmFjdE1ldGhvZCxcblxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBhbmNob3IgdGV4dCB0aGF0IHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoZSBtYXRjaC5cblx0ICpcblx0ICogQGFic3RyYWN0XG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICovXG5cdGdldEFuY2hvclRleHQgOiBBdXRvbGlua2VyLlV0aWwuYWJzdHJhY3RNZXRob2QsXG5cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgQ1NTIGNsYXNzIHN1ZmZpeChlcykgZm9yIHRoaXMgbWF0Y2guXG5cdCAqXG5cdCAqIEEgQ1NTIGNsYXNzIHN1ZmZpeCBpcyBhcHBlbmRlZCB0byB0aGUge0BsaW5rIEF1dG9saW5rZXIjY2xhc3NOYW1lfSBpblxuXHQgKiB0aGUge0BsaW5rIEF1dG9saW5rZXIuQW5jaG9yVGFnQnVpbGRlcn0gd2hlbiBhIG1hdGNoIGlzIHRyYW5zbGF0ZWQgaW50b1xuXHQgKiBhbiBhbmNob3IgdGFnLlxuXHQgKlxuXHQgKiBGb3IgZXhhbXBsZSwgaWYge0BsaW5rIEF1dG9saW5rZXIjY2xhc3NOYW1lfSB3YXMgY29uZmlndXJlZCBhcyAnbXlMaW5rJyxcblx0ICogYW5kIHRoaXMgbWV0aG9kIHJldHVybnMgYFsgJ3VybCcgXWAsIHRoZSBmaW5hbCBjbGFzcyBuYW1lIG9mIHRoZSBlbGVtZW50XG5cdCAqIHdpbGwgYmVjb21lOiAnbXlMaW5rIG15TGluay11cmwnLlxuXHQgKlxuXHQgKiBUaGUgbWF0Y2ggbWF5IHByb3ZpZGUgbXVsdGlwbGUgQ1NTIGNsYXNzIHN1ZmZpeGVzIHRvIGJlIGFwcGVuZGVkIHRvIHRoZVxuXHQgKiB7QGxpbmsgQXV0b2xpbmtlciNjbGFzc05hbWV9IGluIG9yZGVyIHRvIGZhY2lsaXRhdGUgYmV0dGVyIHN0eWxpbmdcblx0ICogb3B0aW9ucyBmb3IgZGlmZmVyZW50IG1hdGNoIGNyaXRlcmlhLiBTZWUge0BsaW5rIEF1dG9saW5rZXIubWF0Y2guTWVudGlvbn1cblx0ICogZm9yIGFuIGV4YW1wbGUuXG5cdCAqXG5cdCAqIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBzaW5nbGUgYXJyYXkgd2l0aCB0aGUgbWF0Y2gnc1xuXHQgKiB7QGxpbmsgI2dldFR5cGUgdHlwZX0gbmFtZSwgYnV0IG1heSBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuXG5cdCAqXG5cdCAqIEByZXR1cm4ge1N0cmluZ1tdfVxuXHQgKi9cblx0Z2V0Q3NzQ2xhc3NTdWZmaXhlcyA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBbIHRoaXMuZ2V0VHlwZSgpIF07XG5cdH0sXG5cblxuXHQvKipcblx0ICogQnVpbGRzIGFuZCByZXR1cm5zIGFuIHtAbGluayBBdXRvbGlua2VyLkh0bWxUYWd9IGluc3RhbmNlIGJhc2VkIG9uIHRoZVxuXHQgKiBNYXRjaC5cblx0ICpcblx0ICogVGhpcyBjYW4gYmUgdXNlZCB0byBlYXNpbHkgZ2VuZXJhdGUgYW5jaG9yIHRhZ3MgZnJvbSBtYXRjaGVzLCBhbmQgZWl0aGVyXG5cdCAqIHJldHVybiB0aGVpciBIVE1MIHN0cmluZywgb3IgbW9kaWZ5IHRoZW0gYmVmb3JlIGRvaW5nIHNvLlxuXHQgKlxuXHQgKiBFeGFtcGxlIFVzYWdlOlxuXHQgKlxuXHQgKiAgICAgdmFyIHRhZyA9IG1hdGNoLmJ1aWxkVGFnKCk7XG5cdCAqICAgICB0YWcuYWRkQ2xhc3MoICdjb3Jkb3ZhLWxpbmsnICk7XG5cdCAqICAgICB0YWcuc2V0QXR0ciggJ3RhcmdldCcsICdfc3lzdGVtJyApO1xuXHQgKlxuXHQgKiAgICAgdGFnLnRvQW5jaG9yU3RyaW5nKCk7ICAvLyA8YSBocmVmPVwiaHR0cDovL2dvb2dsZS5jb21cIiBjbGFzcz1cImNvcmRvdmEtbGlua1wiIHRhcmdldD1cIl9zeXN0ZW1cIj5Hb29nbGU8L2E+XG5cdCAqL1xuXHRidWlsZFRhZyA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnRhZ0J1aWxkZXIuYnVpbGQoIHRoaXMgKTtcblx0fVxuXG59ICk7XG5cbi8qZ2xvYmFsIEF1dG9saW5rZXIgKi9cbi8qKlxuICogQGNsYXNzIEF1dG9saW5rZXIubWF0Y2guRW1haWxcbiAqIEBleHRlbmRzIEF1dG9saW5rZXIubWF0Y2guTWF0Y2hcbiAqXG4gKiBSZXByZXNlbnRzIGEgRW1haWwgbWF0Y2ggZm91bmQgaW4gYW4gaW5wdXQgc3RyaW5nIHdoaWNoIHNob3VsZCBiZSBBdXRvbGlua2VkLlxuICpcbiAqIFNlZSB0aGlzIGNsYXNzJ3Mgc3VwZXJjbGFzcyAoe0BsaW5rIEF1dG9saW5rZXIubWF0Y2guTWF0Y2h9KSBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5BdXRvbGlua2VyLm1hdGNoLkVtYWlsID0gQXV0b2xpbmtlci5VdGlsLmV4dGVuZCggQXV0b2xpbmtlci5tYXRjaC5NYXRjaCwge1xuXG5cdC8qKlxuXHQgKiBAY2ZnIHtTdHJpbmd9IGVtYWlsIChyZXF1aXJlZClcblx0ICpcblx0ICogVGhlIGVtYWlsIGFkZHJlc3MgdGhhdCB3YXMgbWF0Y2hlZC5cblx0ICovXG5cblxuXHQvKipcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgVGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIE1hdGNoXG5cdCAqICAgaW5zdGFuY2UsIHNwZWNpZmllZCBpbiBhbiBPYmplY3QgKG1hcCkuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvciA6IGZ1bmN0aW9uKCBjZmcgKSB7XG5cdFx0QXV0b2xpbmtlci5tYXRjaC5NYXRjaC5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCggdGhpcywgY2ZnICk7XG5cblx0XHRpZiggIWNmZy5lbWFpbCApIHRocm93IG5ldyBFcnJvciggJ2BlbWFpbGAgY2ZnIHJlcXVpcmVkJyApO1xuXG5cdFx0dGhpcy5lbWFpbCA9IGNmZy5lbWFpbDtcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgc3RyaW5nIG5hbWUgZm9yIHRoZSB0eXBlIG9mIG1hdGNoIHRoYXQgdGhpcyBjbGFzcyByZXByZXNlbnRzLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqL1xuXHRnZXRUeXBlIDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuICdlbWFpbCc7XG5cdH0sXG5cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgZW1haWwgYWRkcmVzcyB0aGF0IHdhcyBtYXRjaGVkLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqL1xuXHRnZXRFbWFpbCA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmVtYWlsO1xuXHR9LFxuXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGFuY2hvciBocmVmIHRoYXQgc2hvdWxkIGJlIGdlbmVyYXRlZCBmb3IgdGhlIG1hdGNoLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqL1xuXHRnZXRBbmNob3JIcmVmIDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuICdtYWlsdG86JyArIHRoaXMuZW1haWw7XG5cdH0sXG5cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgYW5jaG9yIHRleHQgdGhhdCBzaG91bGQgYmUgZ2VuZXJhdGVkIGZvciB0aGUgbWF0Y2guXG5cdCAqXG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICovXG5cdGdldEFuY2hvclRleHQgOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lbWFpbDtcblx0fVxuXG59ICk7XG4vKmdsb2JhbCBBdXRvbGlua2VyICovXG4vKipcbiAqIEBjbGFzcyBBdXRvbGlua2VyLm1hdGNoLkhhc2h0YWdcbiAqIEBleHRlbmRzIEF1dG9saW5rZXIubWF0Y2guTWF0Y2hcbiAqXG4gKiBSZXByZXNlbnRzIGEgSGFzaHRhZyBtYXRjaCBmb3VuZCBpbiBhbiBpbnB1dCBzdHJpbmcgd2hpY2ggc2hvdWxkIGJlXG4gKiBBdXRvbGlua2VkLlxuICpcbiAqIFNlZSB0aGlzIGNsYXNzJ3Mgc3VwZXJjbGFzcyAoe0BsaW5rIEF1dG9saW5rZXIubWF0Y2guTWF0Y2h9KSBmb3IgbW9yZVxuICogZGV0YWlscy5cbiAqL1xuQXV0b2xpbmtlci5tYXRjaC5IYXNodGFnID0gQXV0b2xpbmtlci5VdGlsLmV4dGVuZCggQXV0b2xpbmtlci5tYXRjaC5NYXRjaCwge1xuXG5cdC8qKlxuXHQgKiBAY2ZnIHtTdHJpbmd9IHNlcnZpY2VOYW1lXG5cdCAqXG5cdCAqIFRoZSBzZXJ2aWNlIHRvIHBvaW50IGhhc2h0YWcgbWF0Y2hlcyB0by4gU2VlIHtAbGluayBBdXRvbGlua2VyI2hhc2h0YWd9XG5cdCAqIGZvciBhdmFpbGFibGUgdmFsdWVzLlxuXHQgKi9cblxuXHQvKipcblx0ICogQGNmZyB7U3RyaW5nfSBoYXNodGFnIChyZXF1aXJlZClcblx0ICpcblx0ICogVGhlIEhhc2h0YWcgdGhhdCB3YXMgbWF0Y2hlZCwgd2l0aG91dCB0aGUgJyMnLlxuXHQgKi9cblxuXG5cdC8qKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICogQHBhcmFtIHtPYmplY3R9IGNmZyBUaGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgTWF0Y2hcblx0ICogICBpbnN0YW5jZSwgc3BlY2lmaWVkIGluIGFuIE9iamVjdCAobWFwKS5cblx0ICovXG5cdGNvbnN0cnVjdG9yIDogZnVuY3Rpb24oIGNmZyApIHtcblx0XHRBdXRvbGlua2VyLm1hdGNoLk1hdGNoLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKCB0aGlzLCBjZmcgKTtcblxuXHRcdC8vIFRPRE86IGlmKCAhc2VydmljZU5hbWUgKSB0aHJvdyBuZXcgRXJyb3IoICdgc2VydmljZU5hbWVgIGNmZyByZXF1aXJlZCcgKTtcblx0XHRpZiggIWNmZy5oYXNodGFnICkgdGhyb3cgbmV3IEVycm9yKCAnYGhhc2h0YWdgIGNmZyByZXF1aXJlZCcgKTtcblxuXHRcdHRoaXMuc2VydmljZU5hbWUgPSBjZmcuc2VydmljZU5hbWU7XG5cdFx0dGhpcy5oYXNodGFnID0gY2ZnLmhhc2h0YWc7XG5cdH0sXG5cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgdHlwZSBvZiBtYXRjaCB0aGF0IHRoaXMgY2xhc3MgcmVwcmVzZW50cy5cblx0ICpcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0VHlwZSA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiAnaGFzaHRhZyc7XG5cdH0sXG5cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgY29uZmlndXJlZCB7QGxpbmsgI3NlcnZpY2VOYW1lfSB0byBwb2ludCB0aGUgSGFzaHRhZyB0by5cblx0ICogRXg6ICdmYWNlYm9vaycsICd0d2l0dGVyJy5cblx0ICpcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0U2VydmljZU5hbWUgOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXJ2aWNlTmFtZTtcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBtYXRjaGVkIGhhc2h0YWcsIHdpdGhvdXQgdGhlICcjJyBjaGFyYWN0ZXIuXG5cdCAqXG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICovXG5cdGdldEhhc2h0YWcgOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5oYXNodGFnO1xuXHR9LFxuXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGFuY2hvciBocmVmIHRoYXQgc2hvdWxkIGJlIGdlbmVyYXRlZCBmb3IgdGhlIG1hdGNoLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqL1xuXHRnZXRBbmNob3JIcmVmIDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHNlcnZpY2VOYW1lID0gdGhpcy5zZXJ2aWNlTmFtZSxcblx0XHQgICAgaGFzaHRhZyA9IHRoaXMuaGFzaHRhZztcblxuXHRcdHN3aXRjaCggc2VydmljZU5hbWUgKSB7XG5cdFx0XHRjYXNlICd0d2l0dGVyJyA6XG5cdFx0XHRcdHJldHVybiAnaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnLycgKyBoYXNodGFnO1xuXHRcdFx0Y2FzZSAnZmFjZWJvb2snIDpcblx0XHRcdFx0cmV0dXJuICdodHRwczovL3d3dy5mYWNlYm9vay5jb20vaGFzaHRhZy8nICsgaGFzaHRhZztcblx0XHRcdGNhc2UgJ2luc3RhZ3JhbScgOlxuXHRcdFx0XHRyZXR1cm4gJ2h0dHBzOi8vaW5zdGFncmFtLmNvbS9leHBsb3JlL3RhZ3MvJyArIGhhc2h0YWc7XG5cblx0XHRcdGRlZmF1bHQgOiAgLy8gU2hvdWxkbid0IGhhcHBlbiBiZWNhdXNlIEF1dG9saW5rZXIncyBjb25zdHJ1Y3RvciBzaG91bGQgYmxvY2sgYW55IGludmFsaWQgdmFsdWVzLCBidXQganVzdCBpbiBjYXNlLlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdVbmtub3duIHNlcnZpY2UgbmFtZSB0byBwb2ludCBoYXNodGFnIHRvOiAnLCBzZXJ2aWNlTmFtZSApO1xuXHRcdH1cblx0fSxcblxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBhbmNob3IgdGV4dCB0aGF0IHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoZSBtYXRjaC5cblx0ICpcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0QW5jaG9yVGV4dCA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiAnIycgKyB0aGlzLmhhc2h0YWc7XG5cdH1cblxufSApO1xuXG4vKmdsb2JhbCBBdXRvbGlua2VyICovXG4vKipcbiAqIEBjbGFzcyBBdXRvbGlua2VyLm1hdGNoLlBob25lXG4gKiBAZXh0ZW5kcyBBdXRvbGlua2VyLm1hdGNoLk1hdGNoXG4gKlxuICogUmVwcmVzZW50cyBhIFBob25lIG51bWJlciBtYXRjaCBmb3VuZCBpbiBhbiBpbnB1dCBzdHJpbmcgd2hpY2ggc2hvdWxkIGJlXG4gKiBBdXRvbGlua2VkLlxuICpcbiAqIFNlZSB0aGlzIGNsYXNzJ3Mgc3VwZXJjbGFzcyAoe0BsaW5rIEF1dG9saW5rZXIubWF0Y2guTWF0Y2h9KSBmb3IgbW9yZVxuICogZGV0YWlscy5cbiAqL1xuQXV0b2xpbmtlci5tYXRjaC5QaG9uZSA9IEF1dG9saW5rZXIuVXRpbC5leHRlbmQoIEF1dG9saW5rZXIubWF0Y2guTWF0Y2gsIHtcblxuXHQvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcHJvcGVydHkge1N0cmluZ30gbnVtYmVyIChyZXF1aXJlZClcblx0ICpcblx0ICogVGhlIHBob25lIG51bWJlciB0aGF0IHdhcyBtYXRjaGVkLCB3aXRob3V0IGFueSBkZWxpbWl0ZXIgY2hhcmFjdGVycy5cblx0ICpcblx0ICogTm90ZTogVGhpcyBpcyBhIHN0cmluZyB0byBhbGxvdyBmb3IgcHJlZml4ZWQgMCdzLlxuXHQgKi9cblxuXHQvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcHJvcGVydHkgIHtCb29sZWFufSBwbHVzU2lnbiAocmVxdWlyZWQpXG5cdCAqXG5cdCAqIGB0cnVlYCBpZiB0aGUgbWF0Y2hlZCBwaG9uZSBudW1iZXIgc3RhcnRlZCB3aXRoIGEgJysnIHNpZ24uIFdlJ2xsIGluY2x1ZGVcblx0ICogaXQgaW4gdGhlIGB0ZWw6YCBVUkwgaWYgc28sIGFzIHRoaXMgaXMgbmVlZGVkIGZvciBpbnRlcm5hdGlvbmFsIG51bWJlcnMuXG5cdCAqXG5cdCAqIEV4OiAnKzEgKDEyMykgNDU2IDc4NzknXG5cdCAqL1xuXG5cblx0LyoqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAcGFyYW0ge09iamVjdH0gY2ZnIFRoZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIHRoZSBNYXRjaFxuXHQgKiAgIGluc3RhbmNlLCBzcGVjaWZpZWQgaW4gYW4gT2JqZWN0IChtYXApLlxuXHQgKi9cblx0Y29uc3RydWN0b3IgOiBmdW5jdGlvbiggY2ZnICkge1xuXHRcdEF1dG9saW5rZXIubWF0Y2guTWF0Y2gucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwoIHRoaXMsIGNmZyApO1xuXG5cdFx0aWYoICFjZmcubnVtYmVyICkgdGhyb3cgbmV3IEVycm9yKCAnYG51bWJlcmAgY2ZnIHJlcXVpcmVkJyApO1xuXHRcdGlmKCBjZmcucGx1c1NpZ24gPT0gbnVsbCApIHRocm93IG5ldyBFcnJvciggJ2BwbHVzU2lnbmAgY2ZnIHJlcXVpcmVkJyApO1xuXG5cdFx0dGhpcy5udW1iZXIgPSBjZmcubnVtYmVyO1xuXHRcdHRoaXMucGx1c1NpZ24gPSBjZmcucGx1c1NpZ247XG5cdH0sXG5cblxuXHQvKipcblx0ICogUmV0dXJucyBhIHN0cmluZyBuYW1lIGZvciB0aGUgdHlwZSBvZiBtYXRjaCB0aGF0IHRoaXMgY2xhc3MgcmVwcmVzZW50cy5cblx0ICpcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0VHlwZSA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiAncGhvbmUnO1xuXHR9LFxuXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHBob25lIG51bWJlciB0aGF0IHdhcyBtYXRjaGVkIGFzIGEgc3RyaW5nLCB3aXRob3V0IGFueVxuXHQgKiBkZWxpbWl0ZXIgY2hhcmFjdGVycy5cblx0ICpcblx0ICogTm90ZTogVGhpcyBpcyBhIHN0cmluZyB0byBhbGxvdyBmb3IgcHJlZml4ZWQgMCdzLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqL1xuXHRnZXROdW1iZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm51bWJlcjtcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBhbmNob3IgaHJlZiB0aGF0IHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoZSBtYXRjaC5cblx0ICpcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0QW5jaG9ySHJlZiA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiAndGVsOicgKyAoIHRoaXMucGx1c1NpZ24gPyAnKycgOiAnJyApICsgdGhpcy5udW1iZXI7XG5cdH0sXG5cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgYW5jaG9yIHRleHQgdGhhdCBzaG91bGQgYmUgZ2VuZXJhdGVkIGZvciB0aGUgbWF0Y2guXG5cdCAqXG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICovXG5cdGdldEFuY2hvclRleHQgOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXRjaGVkVGV4dDtcblx0fVxuXG59ICk7XG5cbi8qZ2xvYmFsIEF1dG9saW5rZXIgKi9cbi8qKlxuICogQGNsYXNzIEF1dG9saW5rZXIubWF0Y2guTWVudGlvblxuICogQGV4dGVuZHMgQXV0b2xpbmtlci5tYXRjaC5NYXRjaFxuICpcbiAqIFJlcHJlc2VudHMgYSBNZW50aW9uIG1hdGNoIGZvdW5kIGluIGFuIGlucHV0IHN0cmluZyB3aGljaCBzaG91bGQgYmUgQXV0b2xpbmtlZC5cbiAqXG4gKiBTZWUgdGhpcyBjbGFzcydzIHN1cGVyY2xhc3MgKHtAbGluayBBdXRvbGlua2VyLm1hdGNoLk1hdGNofSkgZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuQXV0b2xpbmtlci5tYXRjaC5NZW50aW9uID0gQXV0b2xpbmtlci5VdGlsLmV4dGVuZCggQXV0b2xpbmtlci5tYXRjaC5NYXRjaCwge1xuXG5cdC8qKlxuXHQgKiBAY2ZnIHtTdHJpbmd9IHNlcnZpY2VOYW1lXG5cdCAqXG5cdCAqIFRoZSBzZXJ2aWNlIHRvIHBvaW50IG1lbnRpb24gbWF0Y2hlcyB0by4gU2VlIHtAbGluayBBdXRvbGlua2VyI21lbnRpb259XG5cdCAqIGZvciBhdmFpbGFibGUgdmFsdWVzLlxuXHQgKi9cblxuXHQvKipcblx0ICogQGNmZyB7U3RyaW5nfSBtZW50aW9uIChyZXF1aXJlZClcblx0ICpcblx0ICogVGhlIE1lbnRpb24gdGhhdCB3YXMgbWF0Y2hlZCwgd2l0aG91dCB0aGUgJ0AnIGNoYXJhY3Rlci5cblx0ICovXG5cblxuXHQvKipcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgVGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIE1hdGNoXG5cdCAqICAgaW5zdGFuY2UsIHNwZWNpZmllZCBpbiBhbiBPYmplY3QgKG1hcCkuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvciA6IGZ1bmN0aW9uKCBjZmcgKSB7XG5cdFx0QXV0b2xpbmtlci5tYXRjaC5NYXRjaC5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCggdGhpcywgY2ZnICk7XG5cblx0XHRpZiggIWNmZy5zZXJ2aWNlTmFtZSApIHRocm93IG5ldyBFcnJvciggJ2BzZXJ2aWNlTmFtZWAgY2ZnIHJlcXVpcmVkJyApO1xuXHRcdGlmKCAhY2ZnLm1lbnRpb24gKSB0aHJvdyBuZXcgRXJyb3IoICdgbWVudGlvbmAgY2ZnIHJlcXVpcmVkJyApO1xuXG5cdFx0dGhpcy5tZW50aW9uID0gY2ZnLm1lbnRpb247XG5cdFx0dGhpcy5zZXJ2aWNlTmFtZSA9IGNmZy5zZXJ2aWNlTmFtZTtcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIG1hdGNoIHRoYXQgdGhpcyBjbGFzcyByZXByZXNlbnRzLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqL1xuXHRnZXRUeXBlIDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuICdtZW50aW9uJztcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBtZW50aW9uLCB3aXRob3V0IHRoZSAnQCcgY2hhcmFjdGVyLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqL1xuXHRnZXRNZW50aW9uIDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWVudGlvbjtcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBjb25maWd1cmVkIHtAbGluayAjc2VydmljZU5hbWV9IHRvIHBvaW50IHRoZSBtZW50aW9uIHRvLlxuXHQgKiBFeDogJ2luc3RhZ3JhbScsICd0d2l0dGVyJy5cblx0ICpcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0U2VydmljZU5hbWUgOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXJ2aWNlTmFtZTtcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBhbmNob3IgaHJlZiB0aGF0IHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoZSBtYXRjaC5cblx0ICpcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0QW5jaG9ySHJlZiA6IGZ1bmN0aW9uKCkge1xuXHRcdHN3aXRjaCggdGhpcy5zZXJ2aWNlTmFtZSApIHtcblx0XHRcdGNhc2UgJ3R3aXR0ZXInIDpcblx0XHRcdFx0cmV0dXJuICdodHRwczovL3R3aXR0ZXIuY29tLycgKyB0aGlzLm1lbnRpb247XG5cdFx0XHRjYXNlICdpbnN0YWdyYW0nIDpcblx0XHRcdFx0cmV0dXJuICdodHRwczovL2luc3RhZ3JhbS5jb20vJyArIHRoaXMubWVudGlvbjtcblxuXHRcdFx0ZGVmYXVsdCA6ICAvLyBTaG91bGRuJ3QgaGFwcGVuIGJlY2F1c2UgQXV0b2xpbmtlcidzIGNvbnN0cnVjdG9yIHNob3VsZCBibG9jayBhbnkgaW52YWxpZCB2YWx1ZXMsIGJ1dCBqdXN0IGluIGNhc2UuXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ1Vua25vd24gc2VydmljZSBuYW1lIHRvIHBvaW50IG1lbnRpb24gdG86ICcsIHRoaXMuc2VydmljZU5hbWUgKTtcblx0XHR9XG5cdH0sXG5cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgYW5jaG9yIHRleHQgdGhhdCBzaG91bGQgYmUgZ2VuZXJhdGVkIGZvciB0aGUgbWF0Y2guXG5cdCAqXG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICovXG5cdGdldEFuY2hvclRleHQgOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gJ0AnICsgdGhpcy5tZW50aW9uO1xuXHR9LFxuXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIENTUyBjbGFzcyBzdWZmaXhlcyB0aGF0IHNob3VsZCBiZSB1c2VkIG9uIGEgdGFnIGJ1aWx0IHdpdGhcblx0ICogdGhlIG1hdGNoLiBTZWUge0BsaW5rIEF1dG9saW5rZXIubWF0Y2guTWF0Y2gjZ2V0Q3NzQ2xhc3NTdWZmaXhlc30gZm9yXG5cdCAqIGRldGFpbHMuXG5cdCAqXG5cdCAqIEByZXR1cm4ge1N0cmluZ1tdfVxuXHQgKi9cblx0Z2V0Q3NzQ2xhc3NTdWZmaXhlcyA6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBjc3NDbGFzc1N1ZmZpeGVzID0gQXV0b2xpbmtlci5tYXRjaC5NYXRjaC5wcm90b3R5cGUuZ2V0Q3NzQ2xhc3NTdWZmaXhlcy5jYWxsKCB0aGlzICksXG5cdFx0ICAgIHNlcnZpY2VOYW1lID0gdGhpcy5nZXRTZXJ2aWNlTmFtZSgpO1xuXG5cdFx0aWYoIHNlcnZpY2VOYW1lICkge1xuXHRcdFx0Y3NzQ2xhc3NTdWZmaXhlcy5wdXNoKCBzZXJ2aWNlTmFtZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gY3NzQ2xhc3NTdWZmaXhlcztcblx0fVxuXG59ICk7XG5cbi8qZ2xvYmFsIEF1dG9saW5rZXIgKi9cbi8qKlxuICogQGNsYXNzIEF1dG9saW5rZXIubWF0Y2guVXJsXG4gKiBAZXh0ZW5kcyBBdXRvbGlua2VyLm1hdGNoLk1hdGNoXG4gKlxuICogUmVwcmVzZW50cyBhIFVybCBtYXRjaCBmb3VuZCBpbiBhbiBpbnB1dCBzdHJpbmcgd2hpY2ggc2hvdWxkIGJlIEF1dG9saW5rZWQuXG4gKlxuICogU2VlIHRoaXMgY2xhc3MncyBzdXBlcmNsYXNzICh7QGxpbmsgQXV0b2xpbmtlci5tYXRjaC5NYXRjaH0pIGZvciBtb3JlIGRldGFpbHMuXG4gKi9cbkF1dG9saW5rZXIubWF0Y2guVXJsID0gQXV0b2xpbmtlci5VdGlsLmV4dGVuZCggQXV0b2xpbmtlci5tYXRjaC5NYXRjaCwge1xuXG5cdC8qKlxuXHQgKiBAY2ZnIHtTdHJpbmd9IHVybCAocmVxdWlyZWQpXG5cdCAqXG5cdCAqIFRoZSB1cmwgdGhhdCB3YXMgbWF0Y2hlZC5cblx0ICovXG5cblx0LyoqXG5cdCAqIEBjZmcge1wic2NoZW1lXCIvXCJ3d3dcIi9cInRsZFwifSB1cmxNYXRjaFR5cGUgKHJlcXVpcmVkKVxuXHQgKlxuXHQgKiBUaGUgdHlwZSBvZiBVUkwgbWF0Y2ggdGhhdCB0aGlzIGNsYXNzIHJlcHJlc2VudHMuIFRoaXMgaGVscHMgdG8gZGV0ZXJtaW5lXG5cdCAqIGlmIHRoZSBtYXRjaCB3YXMgbWFkZSBpbiB0aGUgb3JpZ2luYWwgdGV4dCB3aXRoIGEgcHJlZml4ZWQgc2NoZW1lIChleDpcblx0ICogJ2h0dHA6Ly93d3cuZ29vZ2xlLmNvbScpLCBhIHByZWZpeGVkICd3d3cnIChleDogJ3d3dy5nb29nbGUuY29tJyksIG9yXG5cdCAqIHdhcyBtYXRjaGVkIGJ5IGEga25vd24gdG9wLWxldmVsIGRvbWFpbiAoZXg6ICdnb29nbGUuY29tJykuXG5cdCAqL1xuXG5cdC8qKlxuXHQgKiBAY2ZnIHtCb29sZWFufSBwcm90b2NvbFVybE1hdGNoIChyZXF1aXJlZClcblx0ICpcblx0ICogYHRydWVgIGlmIHRoZSBVUkwgaXMgYSBtYXRjaCB3aGljaCBhbHJlYWR5IGhhcyBhIHByb3RvY29sIChpLmUuXG5cdCAqICdodHRwOi8vJyksIGBmYWxzZWAgaWYgdGhlIG1hdGNoIHdhcyBmcm9tIGEgJ3d3dycgb3Iga25vd24gVExEIG1hdGNoLlxuXHQgKi9cblxuXHQvKipcblx0ICogQGNmZyB7Qm9vbGVhbn0gcHJvdG9jb2xSZWxhdGl2ZU1hdGNoIChyZXF1aXJlZClcblx0ICpcblx0ICogYHRydWVgIGlmIHRoZSBVUkwgaXMgYSBwcm90b2NvbC1yZWxhdGl2ZSBtYXRjaC4gQSBwcm90b2NvbC1yZWxhdGl2ZSBtYXRjaFxuXHQgKiBpcyBhIFVSTCB0aGF0IHN0YXJ0cyB3aXRoICcvLycsIGFuZCB3aWxsIGJlIGVpdGhlciBodHRwOi8vIG9yIGh0dHBzOi8vXG5cdCAqIGJhc2VkIG9uIHRoZSBwcm90b2NvbCB0aGF0IHRoZSBzaXRlIGlzIGxvYWRlZCB1bmRlci5cblx0ICovXG5cblx0LyoqXG5cdCAqIEBjZmcge09iamVjdH0gc3RyaXBQcmVmaXggKHJlcXVpcmVkKVxuXHQgKlxuXHQgKiBUaGUgT2JqZWN0IGZvcm0gb2Yge0BsaW5rIEF1dG9saW5rZXIjY2ZnLXN0cmlwUHJlZml4fS5cblx0ICovXG5cblx0LyoqXG5cdCAqIEBjZmcge0Jvb2xlYW59IHN0cmlwVHJhaWxpbmdTbGFzaCAocmVxdWlyZWQpXG5cdCAqIEBpbmhlcml0ZG9jIEF1dG9saW5rZXIjY2ZnLXN0cmlwVHJhaWxpbmdTbGFzaFxuXHQgKi9cblxuXG5cdC8qKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICogQHBhcmFtIHtPYmplY3R9IGNmZyBUaGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgTWF0Y2hcblx0ICogICBpbnN0YW5jZSwgc3BlY2lmaWVkIGluIGFuIE9iamVjdCAobWFwKS5cblx0ICovXG5cdGNvbnN0cnVjdG9yIDogZnVuY3Rpb24oIGNmZyApIHtcblx0XHRBdXRvbGlua2VyLm1hdGNoLk1hdGNoLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKCB0aGlzLCBjZmcgKTtcblxuXHRcdGlmKCBjZmcudXJsTWF0Y2hUeXBlICE9PSAnc2NoZW1lJyAmJiBjZmcudXJsTWF0Y2hUeXBlICE9PSAnd3d3JyAmJiBjZmcudXJsTWF0Y2hUeXBlICE9PSAndGxkJyApIHRocm93IG5ldyBFcnJvciggJ2B1cmxNYXRjaFR5cGVgIGNmZyBtdXN0IGJlIG9uZSBvZjogXCJzY2hlbWVcIiwgXCJ3d3dcIiwgb3IgXCJ0bGRcIicgKTtcblx0XHRpZiggIWNmZy51cmwgKSB0aHJvdyBuZXcgRXJyb3IoICdgdXJsYCBjZmcgcmVxdWlyZWQnICk7XG5cdFx0aWYoIGNmZy5wcm90b2NvbFVybE1hdGNoID09IG51bGwgKSB0aHJvdyBuZXcgRXJyb3IoICdgcHJvdG9jb2xVcmxNYXRjaGAgY2ZnIHJlcXVpcmVkJyApO1xuXHRcdGlmKCBjZmcucHJvdG9jb2xSZWxhdGl2ZU1hdGNoID09IG51bGwgKSB0aHJvdyBuZXcgRXJyb3IoICdgcHJvdG9jb2xSZWxhdGl2ZU1hdGNoYCBjZmcgcmVxdWlyZWQnICk7XG5cdFx0aWYoIGNmZy5zdHJpcFByZWZpeCA9PSBudWxsICkgdGhyb3cgbmV3IEVycm9yKCAnYHN0cmlwUHJlZml4YCBjZmcgcmVxdWlyZWQnICk7XG5cdFx0aWYoIGNmZy5zdHJpcFRyYWlsaW5nU2xhc2ggPT0gbnVsbCApIHRocm93IG5ldyBFcnJvciggJ2BzdHJpcFRyYWlsaW5nU2xhc2hgIGNmZyByZXF1aXJlZCcgKTtcblxuXHRcdHRoaXMudXJsTWF0Y2hUeXBlID0gY2ZnLnVybE1hdGNoVHlwZTtcblx0XHR0aGlzLnVybCA9IGNmZy51cmw7XG5cdFx0dGhpcy5wcm90b2NvbFVybE1hdGNoID0gY2ZnLnByb3RvY29sVXJsTWF0Y2g7XG5cdFx0dGhpcy5wcm90b2NvbFJlbGF0aXZlTWF0Y2ggPSBjZmcucHJvdG9jb2xSZWxhdGl2ZU1hdGNoO1xuXHRcdHRoaXMuc3RyaXBQcmVmaXggPSBjZmcuc3RyaXBQcmVmaXg7XG5cdFx0dGhpcy5zdHJpcFRyYWlsaW5nU2xhc2ggPSBjZmcuc3RyaXBUcmFpbGluZ1NsYXNoO1xuXHR9LFxuXG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwcm9wZXJ0eSB7UmVnRXhwfSBzY2hlbWVQcmVmaXhSZWdleFxuXHQgKlxuXHQgKiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIHJlbW92ZSB0aGUgJ2h0dHA6Ly8nIG9yICdodHRwczovLycgZnJvbVxuXHQgKiBVUkxzLlxuXHQgKi9cblx0c2NoZW1lUHJlZml4UmVnZXg6IC9eKGh0dHBzPzpcXC9cXC8pPy9pLFxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcHJvcGVydHkge1JlZ0V4cH0gd3d3UHJlZml4UmVnZXhcblx0ICpcblx0ICogQSByZWd1bGFyIGV4cHJlc3Npb24gdXNlZCB0byByZW1vdmUgdGhlICd3d3cuJyBmcm9tIFVSTHMuXG5cdCAqL1xuXHR3d3dQcmVmaXhSZWdleDogL14oaHR0cHM/OlxcL1xcLyk/KHd3d1xcLik/L2ksXG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwcm9wZXJ0eSB7UmVnRXhwfSBwcm90b2NvbFJlbGF0aXZlUmVnZXhcblx0ICpcblx0ICogVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIHJlbW92ZSB0aGUgcHJvdG9jb2wtcmVsYXRpdmUgJy8vJyBmcm9tIHRoZSB7QGxpbmsgI3VybH0gc3RyaW5nLCBmb3IgcHVycG9zZXNcblx0ICogb2Yge0BsaW5rICNnZXRBbmNob3JUZXh0fS4gQSBwcm90b2NvbC1yZWxhdGl2ZSBVUkwgaXMsIGZvciBleGFtcGxlLCBcIi8veWFob28uY29tXCJcblx0ICovXG5cdHByb3RvY29sUmVsYXRpdmVSZWdleCA6IC9eXFwvXFwvLyxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogQHByb3BlcnR5IHtCb29sZWFufSBwcm90b2NvbFByZXBlbmRlZFxuXHQgKlxuXHQgKiBXaWxsIGJlIHNldCB0byBgdHJ1ZWAgaWYgdGhlICdodHRwOi8vJyBwcm90b2NvbCBoYXMgYmVlbiBwcmVwZW5kZWQgdG8gdGhlIHtAbGluayAjdXJsfSAoYmVjYXVzZSB0aGVcblx0ICoge0BsaW5rICN1cmx9IGRpZCBub3QgaGF2ZSBhIHByb3RvY29sKVxuXHQgKi9cblx0cHJvdG9jb2xQcmVwZW5kZWQgOiBmYWxzZSxcblxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgc3RyaW5nIG5hbWUgZm9yIHRoZSB0eXBlIG9mIG1hdGNoIHRoYXQgdGhpcyBjbGFzcyByZXByZXNlbnRzLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqL1xuXHRnZXRUeXBlIDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuICd1cmwnO1xuXHR9LFxuXG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBzdHJpbmcgbmFtZSBmb3IgdGhlIHR5cGUgb2YgVVJMIG1hdGNoIHRoYXQgdGhpcyBjbGFzc1xuXHQgKiByZXByZXNlbnRzLlxuXHQgKlxuXHQgKiBUaGlzIGhlbHBzIHRvIGRldGVybWluZSBpZiB0aGUgbWF0Y2ggd2FzIG1hZGUgaW4gdGhlIG9yaWdpbmFsIHRleHQgd2l0aCBhXG5cdCAqIHByZWZpeGVkIHNjaGVtZSAoZXg6ICdodHRwOi8vd3d3Lmdvb2dsZS5jb20nKSwgYSBwcmVmaXhlZCAnd3d3JyAoZXg6XG5cdCAqICd3d3cuZ29vZ2xlLmNvbScpLCBvciB3YXMgbWF0Y2hlZCBieSBhIGtub3duIHRvcC1sZXZlbCBkb21haW4gKGV4OlxuXHQgKiAnZ29vZ2xlLmNvbScpLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtcInNjaGVtZVwiL1wid3d3XCIvXCJ0bGRcIn1cblx0ICovXG5cdGdldFVybE1hdGNoVHlwZSA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnVybE1hdGNoVHlwZTtcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB1cmwgdGhhdCB3YXMgbWF0Y2hlZCwgYXNzdW1pbmcgdGhlIHByb3RvY29sIHRvIGJlICdodHRwOi8vJyBpZiB0aGUgb3JpZ2luYWxcblx0ICogbWF0Y2ggd2FzIG1pc3NpbmcgYSBwcm90b2NvbC5cblx0ICpcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0VXJsIDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHVybCA9IHRoaXMudXJsO1xuXG5cdFx0Ly8gaWYgdGhlIHVybCBzdHJpbmcgZG9lc24ndCBiZWdpbiB3aXRoIGEgcHJvdG9jb2wsIGFzc3VtZSAnaHR0cDovLydcblx0XHRpZiggIXRoaXMucHJvdG9jb2xSZWxhdGl2ZU1hdGNoICYmICF0aGlzLnByb3RvY29sVXJsTWF0Y2ggJiYgIXRoaXMucHJvdG9jb2xQcmVwZW5kZWQgKSB7XG5cdFx0XHR1cmwgPSB0aGlzLnVybCA9ICdodHRwOi8vJyArIHVybDtcblxuXHRcdFx0dGhpcy5wcm90b2NvbFByZXBlbmRlZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVybDtcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBhbmNob3IgaHJlZiB0aGF0IHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoZSBtYXRjaC5cblx0ICpcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0QW5jaG9ySHJlZiA6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB1cmwgPSB0aGlzLmdldFVybCgpO1xuXG5cdFx0cmV0dXJuIHVybC5yZXBsYWNlKCAvJmFtcDsvZywgJyYnICk7ICAvLyBhbnkgJmFtcDsncyBpbiB0aGUgVVJMIHNob3VsZCBiZSBjb252ZXJ0ZWQgYmFjayB0byAnJicgaWYgdGhleSB3ZXJlIGRpc3BsYXllZCBhcyAmYW1wOyBpbiB0aGUgc291cmNlIGh0bWxcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBhbmNob3IgdGV4dCB0aGF0IHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoZSBtYXRjaC5cblx0ICpcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0QW5jaG9yVGV4dCA6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBhbmNob3JUZXh0ID0gdGhpcy5nZXRNYXRjaGVkVGV4dCgpO1xuXG5cdFx0aWYoIHRoaXMucHJvdG9jb2xSZWxhdGl2ZU1hdGNoICkge1xuXHRcdFx0Ly8gU3RyaXAgb2ZmIGFueSBwcm90b2NvbC1yZWxhdGl2ZSAnLy8nIGZyb20gdGhlIGFuY2hvciB0ZXh0XG5cdFx0XHRhbmNob3JUZXh0ID0gdGhpcy5zdHJpcFByb3RvY29sUmVsYXRpdmVQcmVmaXgoIGFuY2hvclRleHQgKTtcblx0XHR9XG5cdFx0aWYoIHRoaXMuc3RyaXBQcmVmaXguc2NoZW1lICkge1xuXHRcdFx0YW5jaG9yVGV4dCA9IHRoaXMuc3RyaXBTY2hlbWVQcmVmaXgoIGFuY2hvclRleHQgKTtcblx0XHR9XG5cdFx0aWYoIHRoaXMuc3RyaXBQcmVmaXgud3d3ICkge1xuXHRcdFx0YW5jaG9yVGV4dCA9IHRoaXMuc3RyaXBXd3dQcmVmaXgoIGFuY2hvclRleHQgKTtcblx0XHR9XG5cdFx0aWYoIHRoaXMuc3RyaXBUcmFpbGluZ1NsYXNoICkge1xuXHRcdFx0YW5jaG9yVGV4dCA9IHRoaXMucmVtb3ZlVHJhaWxpbmdTbGFzaCggYW5jaG9yVGV4dCApOyAgLy8gcmVtb3ZlIHRyYWlsaW5nIHNsYXNoLCBpZiB0aGVyZSBpcyBvbmVcblx0XHR9XG5cblx0XHRyZXR1cm4gYW5jaG9yVGV4dDtcblx0fSxcblxuXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdC8vIFV0aWxpdHkgRnVuY3Rpb25hbGl0eVxuXG5cdC8qKlxuXHQgKiBTdHJpcHMgdGhlIHNjaGVtZSBwcmVmaXggKHN1Y2ggYXMgXCJodHRwOi8vXCIgb3IgXCJodHRwczovL1wiKSBmcm9tIHRoZSBnaXZlblxuXHQgKiBgdXJsYC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IHVybCBUaGUgdGV4dCBvZiB0aGUgYW5jaG9yIHRoYXQgaXMgYmVpbmcgZ2VuZXJhdGVkLCBmb3Jcblx0ICogICB3aGljaCB0byBzdHJpcCBvZmYgdGhlIHVybCBzY2hlbWUuXG5cdCAqIEByZXR1cm4ge1N0cmluZ30gVGhlIGB1cmxgLCB3aXRoIHRoZSBzY2hlbWUgc3RyaXBwZWQuXG5cdCAqL1xuXHRzdHJpcFNjaGVtZVByZWZpeCA6IGZ1bmN0aW9uKCB1cmwgKSB7XG5cdFx0cmV0dXJuIHVybC5yZXBsYWNlKCB0aGlzLnNjaGVtZVByZWZpeFJlZ2V4LCAnJyApO1xuXHR9LFxuXG5cblx0LyoqXG5cdCAqIFN0cmlwcyB0aGUgJ3d3dycgcHJlZml4IGZyb20gdGhlIGdpdmVuIGB1cmxgLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdXJsIFRoZSB0ZXh0IG9mIHRoZSBhbmNob3IgdGhhdCBpcyBiZWluZyBnZW5lcmF0ZWQsIGZvclxuXHQgKiAgIHdoaWNoIHRvIHN0cmlwIG9mZiB0aGUgJ3d3dycgaWYgaXQgZXhpc3RzLlxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBgdXJsYCwgd2l0aCB0aGUgJ3d3dycgc3RyaXBwZWQuXG5cdCAqL1xuXHRzdHJpcFd3d1ByZWZpeCA6IGZ1bmN0aW9uKCB1cmwgKSB7XG5cdFx0cmV0dXJuIHVybC5yZXBsYWNlKCB0aGlzLnd3d1ByZWZpeFJlZ2V4LCAnJDEnICk7ICAvLyBsZWF2ZSBhbnkgc2NoZW1lICgkMSksIGl0IG9uZSBleGlzdHNcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBTdHJpcHMgYW55IHByb3RvY29sLXJlbGF0aXZlICcvLycgZnJvbSB0aGUgYW5jaG9yIHRleHQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IG9mIHRoZSBhbmNob3IgdGhhdCBpcyBiZWluZyBnZW5lcmF0ZWQsIGZvciB3aGljaCB0byBzdHJpcCBvZmYgdGhlXG5cdCAqICAgcHJvdG9jb2wtcmVsYXRpdmUgcHJlZml4IChzdWNoIGFzIHN0cmlwcGluZyBvZmYgXCIvL1wiKVxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBgYW5jaG9yVGV4dGAsIHdpdGggdGhlIHByb3RvY29sLXJlbGF0aXZlIHByZWZpeCBzdHJpcHBlZC5cblx0ICovXG5cdHN0cmlwUHJvdG9jb2xSZWxhdGl2ZVByZWZpeCA6IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdHJldHVybiB0ZXh0LnJlcGxhY2UoIHRoaXMucHJvdG9jb2xSZWxhdGl2ZVJlZ2V4LCAnJyApO1xuXHR9LFxuXG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYW55IHRyYWlsaW5nIHNsYXNoIGZyb20gdGhlIGdpdmVuIGBhbmNob3JUZXh0YCwgaW4gcHJlcGFyYXRpb24gZm9yIHRoZSB0ZXh0IHRvIGJlIGRpc3BsYXllZC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGFuY2hvclRleHQgVGhlIHRleHQgb2YgdGhlIGFuY2hvciB0aGF0IGlzIGJlaW5nIGdlbmVyYXRlZCwgZm9yIHdoaWNoIHRvIHJlbW92ZSBhbnkgdHJhaWxpbmdcblx0ICogICBzbGFzaCAoJy8nKSB0aGF0IG1heSBleGlzdC5cblx0ICogQHJldHVybiB7U3RyaW5nfSBUaGUgYGFuY2hvclRleHRgLCB3aXRoIHRoZSB0cmFpbGluZyBzbGFzaCByZW1vdmVkLlxuXHQgKi9cblx0cmVtb3ZlVHJhaWxpbmdTbGFzaCA6IGZ1bmN0aW9uKCBhbmNob3JUZXh0ICkge1xuXHRcdGlmKCBhbmNob3JUZXh0LmNoYXJBdCggYW5jaG9yVGV4dC5sZW5ndGggLSAxICkgPT09ICcvJyApIHtcblx0XHRcdGFuY2hvclRleHQgPSBhbmNob3JUZXh0LnNsaWNlKCAwLCAtMSApO1xuXHRcdH1cblx0XHRyZXR1cm4gYW5jaG9yVGV4dDtcblx0fVxuXG59ICk7XG4vKmdsb2JhbCBBdXRvbGlua2VyICovXG4vKipcbiAqIEBhYnN0cmFjdFxuICogQGNsYXNzIEF1dG9saW5rZXIubWF0Y2hlci5NYXRjaGVyXG4gKlxuICogQW4gYWJzdHJhY3QgY2xhc3MgYW5kIGludGVyZmFjZSBmb3IgaW5kaXZpZHVhbCBtYXRjaGVycyB0byBmaW5kIG1hdGNoZXMgaW5cbiAqIGFuIGlucHV0IHN0cmluZyB3aXRoIGxpbmtpZmllZCB2ZXJzaW9ucyBvZiB0aGVtLlxuICpcbiAqIE5vdGUgdGhhdCBNYXRjaGVycyBkbyBub3QgdGFrZSBIVE1MIGludG8gYWNjb3VudCAtIHRoZXkgbXVzdCBiZSBmZWQgdGhlIHRleHRcbiAqIG5vZGVzIG9mIGFueSBIVE1MIHN0cmluZywgd2hpY2ggaXMgaGFuZGxlZCBieSB7QGxpbmsgQXV0b2xpbmtlciNwYXJzZX0uXG4gKi9cbkF1dG9saW5rZXIubWF0Y2hlci5NYXRjaGVyID0gQXV0b2xpbmtlci5VdGlsLmV4dGVuZCggT2JqZWN0LCB7XG5cblx0LyoqXG5cdCAqIEBjZmcge0F1dG9saW5rZXIuQW5jaG9yVGFnQnVpbGRlcn0gdGFnQnVpbGRlciAocmVxdWlyZWQpXG5cdCAqXG5cdCAqIFJlZmVyZW5jZSB0byB0aGUgQW5jaG9yVGFnQnVpbGRlciBpbnN0YW5jZSB0byB1c2UgdG8gZ2VuZXJhdGUgSFRNTCB0YWdzXG5cdCAqIGZvciB7QGxpbmsgQXV0b2xpbmtlci5tYXRjaC5NYXRjaCBNYXRjaGVzfS5cblx0ICovXG5cblxuXHQvKipcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgVGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIE1hdGNoZXJcblx0ICogICBpbnN0YW5jZSwgc3BlY2lmaWVkIGluIGFuIE9iamVjdCAobWFwKS5cblx0ICovXG5cdGNvbnN0cnVjdG9yIDogZnVuY3Rpb24oIGNmZyApIHtcblx0XHRpZiggIWNmZy50YWdCdWlsZGVyICkgdGhyb3cgbmV3IEVycm9yKCAnYHRhZ0J1aWxkZXJgIGNmZyByZXF1aXJlZCcgKTtcblxuXHRcdHRoaXMudGFnQnVpbGRlciA9IGNmZy50YWdCdWlsZGVyO1xuXHR9LFxuXG5cblx0LyoqXG5cdCAqIFBhcnNlcyB0aGUgaW5wdXQgYHRleHRgIGFuZCByZXR1cm5zIHRoZSBhcnJheSBvZiB7QGxpbmsgQXV0b2xpbmtlci5tYXRjaC5NYXRjaCBNYXRjaGVzfVxuXHQgKiBmb3IgdGhlIG1hdGNoZXIuXG5cdCAqXG5cdCAqIEBhYnN0cmFjdFxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgdGV4dCB0byBzY2FuIGFuZCByZXBsYWNlIG1hdGNoZXMgaW4uXG5cdCAqIEByZXR1cm4ge0F1dG9saW5rZXIubWF0Y2guTWF0Y2hbXX1cblx0ICovXG5cdHBhcnNlTWF0Y2hlcyA6IEF1dG9saW5rZXIuVXRpbC5hYnN0cmFjdE1ldGhvZFxuXG59ICk7XG4vKmdsb2JhbCBBdXRvbGlua2VyICovXG4vKipcbiAqIEBjbGFzcyBBdXRvbGlua2VyLm1hdGNoZXIuRW1haWxcbiAqIEBleHRlbmRzIEF1dG9saW5rZXIubWF0Y2hlci5NYXRjaGVyXG4gKlxuICogTWF0Y2hlciB0byBmaW5kIGVtYWlsIG1hdGNoZXMgaW4gYW4gaW5wdXQgc3RyaW5nLlxuICpcbiAqIFNlZSB0aGlzIGNsYXNzJ3Mgc3VwZXJjbGFzcyAoe0BsaW5rIEF1dG9saW5rZXIubWF0Y2hlci5NYXRjaGVyfSkgZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuQXV0b2xpbmtlci5tYXRjaGVyLkVtYWlsID0gQXV0b2xpbmtlci5VdGlsLmV4dGVuZCggQXV0b2xpbmtlci5tYXRjaGVyLk1hdGNoZXIsIHtcblxuXHQvKipcblx0ICogVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCBlbWFpbCBhZGRyZXNzZXMuIEV4YW1wbGUgbWF0Y2g6XG5cdCAqXG5cdCAqICAgICBwZXJzb25AcGxhY2UuY29tXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwcm9wZXJ0eSB7UmVnRXhwfSBtYXRjaGVyUmVnZXhcblx0ICovXG5cdG1hdGNoZXJSZWdleCA6IChmdW5jdGlvbigpIHtcblx0XHR2YXIgYWxwaGFOdW1lcmljQ2hhcnMgPSBBdXRvbGlua2VyLlJlZ2V4TGliLmFscGhhTnVtZXJpY0NoYXJzU3RyLFxuXHRcdCAgICBlbWFpbFJlZ2V4ID0gbmV3IFJlZ0V4cCggJ1snICsgYWxwaGFOdW1lcmljQ2hhcnMgKyAnXFxcXC1fXFwnOzomPSskLixdK0AnICksICAvLyBzb21ldGhpbmdAIGZvciBlbWFpbCBhZGRyZXNzZXMgKGEuay5hLiBsb2NhbC1wYXJ0KVxuXHRcdFx0ZG9tYWluTmFtZVJlZ2V4ID0gQXV0b2xpbmtlci5SZWdleExpYi5kb21haW5OYW1lUmVnZXgsXG5cdFx0XHR0bGRSZWdleCA9IEF1dG9saW5rZXIuUmVnZXhMaWIudGxkUmVnZXg7ICAvLyBtYXRjaCBvdXIga25vd24gdG9wIGxldmVsIGRvbWFpbnMgKFRMRHMpXG5cblx0XHRyZXR1cm4gbmV3IFJlZ0V4cCggW1xuXHRcdFx0ZW1haWxSZWdleC5zb3VyY2UsXG5cdFx0XHRkb21haW5OYW1lUmVnZXguc291cmNlLFxuXHRcdFx0J1xcXFwuJywgdGxkUmVnZXguc291cmNlICAgLy8gJy5jb20nLCAnLm5ldCcsIGV0Y1xuXHRcdF0uam9pbiggXCJcIiApLCAnZ2knICk7XG5cdH0gKSgpLFxuXG5cblx0LyoqXG5cdCAqIEBpbmhlcml0ZG9jXG5cdCAqL1xuXHRwYXJzZU1hdGNoZXMgOiBmdW5jdGlvbiggdGV4dCApIHtcblx0XHR2YXIgbWF0Y2hlclJlZ2V4ID0gdGhpcy5tYXRjaGVyUmVnZXgsXG5cdFx0ICAgIHRhZ0J1aWxkZXIgPSB0aGlzLnRhZ0J1aWxkZXIsXG5cdFx0ICAgIG1hdGNoZXMgPSBbXSxcblx0XHQgICAgbWF0Y2g7XG5cblx0XHR3aGlsZSggKCBtYXRjaCA9IG1hdGNoZXJSZWdleC5leGVjKCB0ZXh0ICkgKSAhPT0gbnVsbCApIHtcblx0XHRcdHZhciBtYXRjaGVkVGV4dCA9IG1hdGNoWyAwIF07XG5cblx0XHRcdG1hdGNoZXMucHVzaCggbmV3IEF1dG9saW5rZXIubWF0Y2guRW1haWwoIHtcblx0XHRcdFx0dGFnQnVpbGRlciAgOiB0YWdCdWlsZGVyLFxuXHRcdFx0XHRtYXRjaGVkVGV4dCA6IG1hdGNoZWRUZXh0LFxuXHRcdFx0XHRvZmZzZXQgICAgICA6IG1hdGNoLmluZGV4LFxuXHRcdFx0XHRlbWFpbCAgICAgICA6IG1hdGNoZWRUZXh0XG5cdFx0XHR9ICkgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0Y2hlcztcblx0fVxuXG59ICk7XG4vKmdsb2JhbCBBdXRvbGlua2VyICovXG4vKipcbiAqIEBjbGFzcyBBdXRvbGlua2VyLm1hdGNoZXIuSGFzaHRhZ1xuICogQGV4dGVuZHMgQXV0b2xpbmtlci5tYXRjaGVyLk1hdGNoZXJcbiAqXG4gKiBNYXRjaGVyIHRvIGZpbmQgSGFzaHRhZyBtYXRjaGVzIGluIGFuIGlucHV0IHN0cmluZy5cbiAqL1xuQXV0b2xpbmtlci5tYXRjaGVyLkhhc2h0YWcgPSBBdXRvbGlua2VyLlV0aWwuZXh0ZW5kKCBBdXRvbGlua2VyLm1hdGNoZXIuTWF0Y2hlciwge1xuXG5cdC8qKlxuXHQgKiBAY2ZnIHtTdHJpbmd9IHNlcnZpY2VOYW1lXG5cdCAqXG5cdCAqIFRoZSBzZXJ2aWNlIHRvIHBvaW50IGhhc2h0YWcgbWF0Y2hlcyB0by4gU2VlIHtAbGluayBBdXRvbGlua2VyI2hhc2h0YWd9XG5cdCAqIGZvciBhdmFpbGFibGUgdmFsdWVzLlxuXHQgKi9cblxuXG5cdC8qKlxuXHQgKiBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIEhhc2h0YWdzLiBFeGFtcGxlIG1hdGNoOlxuXHQgKlxuXHQgKiAgICAgI2FzZGZcblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHByb3BlcnR5IHtSZWdFeHB9IG1hdGNoZXJSZWdleFxuXHQgKi9cblx0bWF0Y2hlclJlZ2V4IDogbmV3IFJlZ0V4cCggJyNbXycgKyBBdXRvbGlua2VyLlJlZ2V4TGliLmFscGhhTnVtZXJpY0NoYXJzU3RyICsgJ117MSwxMzl9JywgJ2cnICksXG5cblx0LyoqXG5cdCAqIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gdXNlIHRvIGNoZWNrIHRoZSBjaGFyYWN0ZXIgYmVmb3JlIGEgdXNlcm5hbWUgbWF0Y2ggdG9cblx0ICogbWFrZSBzdXJlIHdlIGRpZG4ndCBhY2NpZGVudGFsbHkgbWF0Y2ggYW4gZW1haWwgYWRkcmVzcy5cblx0ICpcblx0ICogRm9yIGV4YW1wbGUsIHRoZSBzdHJpbmcgXCJhc2RmQGFzZGYuY29tXCIgc2hvdWxkIG5vdCBtYXRjaCBcIkBhc2RmXCIgYXMgYSB1c2VybmFtZS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHByb3BlcnR5IHtSZWdFeHB9IG5vbldvcmRDaGFyUmVnZXhcblx0ICovXG5cdG5vbldvcmRDaGFyUmVnZXggOiBuZXcgUmVnRXhwKCAnW14nICsgQXV0b2xpbmtlci5SZWdleExpYi5hbHBoYU51bWVyaWNDaGFyc1N0ciArICddJyApLFxuXG5cblx0LyoqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAcGFyYW0ge09iamVjdH0gY2ZnIFRoZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIHRoZSBNYXRjaCBpbnN0YW5jZSxcblx0ICogICBzcGVjaWZpZWQgaW4gYW4gT2JqZWN0IChtYXApLlxuXHQgKi9cblx0Y29uc3RydWN0b3IgOiBmdW5jdGlvbiggY2ZnICkge1xuXHRcdEF1dG9saW5rZXIubWF0Y2hlci5NYXRjaGVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKCB0aGlzLCBjZmcgKTtcblxuXHRcdHRoaXMuc2VydmljZU5hbWUgPSBjZmcuc2VydmljZU5hbWU7XG5cdH0sXG5cblxuXHQvKipcblx0ICogQGluaGVyaXRkb2Ncblx0ICovXG5cdHBhcnNlTWF0Y2hlcyA6IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdHZhciBtYXRjaGVyUmVnZXggPSB0aGlzLm1hdGNoZXJSZWdleCxcblx0XHQgICAgbm9uV29yZENoYXJSZWdleCA9IHRoaXMubm9uV29yZENoYXJSZWdleCxcblx0XHQgICAgc2VydmljZU5hbWUgPSB0aGlzLnNlcnZpY2VOYW1lLFxuXHRcdCAgICB0YWdCdWlsZGVyID0gdGhpcy50YWdCdWlsZGVyLFxuXHRcdCAgICBtYXRjaGVzID0gW10sXG5cdFx0ICAgIG1hdGNoO1xuXG5cdFx0d2hpbGUoICggbWF0Y2ggPSBtYXRjaGVyUmVnZXguZXhlYyggdGV4dCApICkgIT09IG51bGwgKSB7XG5cdFx0XHR2YXIgb2Zmc2V0ID0gbWF0Y2guaW5kZXgsXG5cdFx0XHQgICAgcHJldkNoYXIgPSB0ZXh0LmNoYXJBdCggb2Zmc2V0IC0gMSApO1xuXG5cdFx0XHQvLyBJZiB3ZSBmb3VuZCB0aGUgbWF0Y2ggYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLCBvciB3ZSBmb3VuZCB0aGUgbWF0Y2hcblx0XHRcdC8vIGFuZCB0aGVyZSBpcyBhIHdoaXRlc3BhY2UgY2hhciBpbiBmcm9udCBvZiBpdCAobWVhbmluZyBpdCBpcyBub3QgYSAnIycgY2hhclxuXHRcdFx0Ly8gaW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQpLCB0aGVuIGl0IGlzIGEgaGFzaHRhZyBtYXRjaC5cblx0XHRcdGlmKCBvZmZzZXQgPT09IDAgfHwgbm9uV29yZENoYXJSZWdleC50ZXN0KCBwcmV2Q2hhciApICkge1xuXHRcdFx0XHR2YXIgbWF0Y2hlZFRleHQgPSBtYXRjaFsgMCBdLFxuXHRcdFx0XHQgICAgaGFzaHRhZyA9IG1hdGNoWyAwIF0uc2xpY2UoIDEgKTsgIC8vIHN0cmlwIG9mZiB0aGUgJyMnIGNoYXJhY3RlciBhdCB0aGUgYmVnaW5uaW5nXG5cblx0XHRcdFx0bWF0Y2hlcy5wdXNoKCBuZXcgQXV0b2xpbmtlci5tYXRjaC5IYXNodGFnKCB7XG5cdFx0XHRcdFx0dGFnQnVpbGRlciAgOiB0YWdCdWlsZGVyLFxuXHRcdFx0XHRcdG1hdGNoZWRUZXh0IDogbWF0Y2hlZFRleHQsXG5cdFx0XHRcdFx0b2Zmc2V0ICAgICAgOiBvZmZzZXQsXG5cdFx0XHRcdFx0c2VydmljZU5hbWUgOiBzZXJ2aWNlTmFtZSxcblx0XHRcdFx0XHRoYXNodGFnICAgICA6IGhhc2h0YWdcblx0XHRcdFx0fSApICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hdGNoZXM7XG5cdH1cblxufSApO1xuLypnbG9iYWwgQXV0b2xpbmtlciAqL1xuLyoqXG4gKiBAY2xhc3MgQXV0b2xpbmtlci5tYXRjaGVyLlBob25lXG4gKiBAZXh0ZW5kcyBBdXRvbGlua2VyLm1hdGNoZXIuTWF0Y2hlclxuICpcbiAqIE1hdGNoZXIgdG8gZmluZCBQaG9uZSBudW1iZXIgbWF0Y2hlcyBpbiBhbiBpbnB1dCBzdHJpbmcuXG4gKlxuICogU2VlIHRoaXMgY2xhc3MncyBzdXBlcmNsYXNzICh7QGxpbmsgQXV0b2xpbmtlci5tYXRjaGVyLk1hdGNoZXJ9KSBmb3IgbW9yZVxuICogZGV0YWlscy5cbiAqL1xuQXV0b2xpbmtlci5tYXRjaGVyLlBob25lID0gQXV0b2xpbmtlci5VdGlsLmV4dGVuZCggQXV0b2xpbmtlci5tYXRjaGVyLk1hdGNoZXIsIHtcblxuXHQvKipcblx0ICogVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCBQaG9uZSBudW1iZXJzLiBFeGFtcGxlIG1hdGNoOlxuXHQgKlxuXHQgKiAgICAgKDEyMykgNDU2LTc4OTBcblx0ICpcblx0ICogVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gaGFzIHRoZSBmb2xsb3dpbmcgY2FwdHVyaW5nIGdyb3Vwczpcblx0ICpcblx0ICogMS4gVGhlIHByZWZpeGVkICcrJyBzaWduLCBpZiB0aGVyZSBpcyBvbmUuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwcm9wZXJ0eSB7UmVnRXhwfSBtYXRjaGVyUmVnZXhcblx0ICovXG5cdG1hdGNoZXJSZWdleCA6IC8oPzooXFwrKT9cXGR7MSwzfVstXFwwNDAuXSk/XFwoP1xcZHszfVxcKT9bLVxcMDQwLl0/XFxkezN9Wy1cXDA0MC5dXFxkezR9L2csICAvLyBleDogKDEyMykgNDU2LTc4OTAsIDEyMyA0NTYgNzg5MCwgMTIzLTQ1Ni03ODkwLCBldGMuXG5cblx0LyoqXG5cdCAqIEBpbmhlcml0ZG9jXG5cdCAqL1xuXHRwYXJzZU1hdGNoZXMgOiBmdW5jdGlvbiggdGV4dCApIHtcblx0XHR2YXIgbWF0Y2hlclJlZ2V4ID0gdGhpcy5tYXRjaGVyUmVnZXgsXG5cdFx0ICAgIHRhZ0J1aWxkZXIgPSB0aGlzLnRhZ0J1aWxkZXIsXG5cdFx0ICAgIG1hdGNoZXMgPSBbXSxcblx0XHQgICAgbWF0Y2g7XG5cblx0XHR3aGlsZSggKCBtYXRjaCA9IG1hdGNoZXJSZWdleC5leGVjKCB0ZXh0ICkgKSAhPT0gbnVsbCApIHtcblx0XHRcdC8vIFJlbW92ZSBub24tbnVtZXJpYyB2YWx1ZXMgZnJvbSBwaG9uZSBudW1iZXIgc3RyaW5nXG5cdFx0XHR2YXIgbWF0Y2hlZFRleHQgPSBtYXRjaFsgMCBdLFxuXHRcdFx0ICAgIGNsZWFuTnVtYmVyID0gbWF0Y2hlZFRleHQucmVwbGFjZSggL1xcRC9nLCAnJyApLCAgLy8gc3RyaXAgb3V0IG5vbi1kaWdpdCBjaGFyYWN0ZXJzXG5cdFx0XHQgICAgcGx1c1NpZ24gPSAhIW1hdGNoWyAxIF07ICAvLyBtYXRjaFsgMSBdIGlzIHRoZSBwcmVmaXhlZCBwbHVzIHNpZ24sIGlmIHRoZXJlIGlzIG9uZVxuXG5cdFx0XHRtYXRjaGVzLnB1c2goIG5ldyBBdXRvbGlua2VyLm1hdGNoLlBob25lKCB7XG5cdFx0XHRcdHRhZ0J1aWxkZXIgIDogdGFnQnVpbGRlcixcblx0XHRcdFx0bWF0Y2hlZFRleHQgOiBtYXRjaGVkVGV4dCxcblx0XHRcdFx0b2Zmc2V0ICAgICAgOiBtYXRjaC5pbmRleCxcblx0XHRcdFx0bnVtYmVyICAgICAgOiBjbGVhbk51bWJlcixcblx0XHRcdFx0cGx1c1NpZ24gICAgOiBwbHVzU2lnblxuXHRcdFx0fSApICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hdGNoZXM7XG5cdH1cblxufSApO1xuLypnbG9iYWwgQXV0b2xpbmtlciAqL1xuLyoqXG4gKiBAY2xhc3MgQXV0b2xpbmtlci5tYXRjaGVyLk1lbnRpb25cbiAqIEBleHRlbmRzIEF1dG9saW5rZXIubWF0Y2hlci5NYXRjaGVyXG4gKlxuICogTWF0Y2hlciB0byBmaW5kL3JlcGxhY2UgdXNlcm5hbWUgbWF0Y2hlcyBpbiBhbiBpbnB1dCBzdHJpbmcuXG4gKi9cbkF1dG9saW5rZXIubWF0Y2hlci5NZW50aW9uID0gQXV0b2xpbmtlci5VdGlsLmV4dGVuZCggQXV0b2xpbmtlci5tYXRjaGVyLk1hdGNoZXIsIHtcblxuXHQvKipcblx0ICogSGFzaCBvZiByZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggdXNlcm5hbWUgaGFuZGxlcy4gRXhhbXBsZSBtYXRjaDpcblx0ICpcblx0ICogICAgIEBhc2RmXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBtYXRjaGVyUmVnZXhlc1xuXHQgKi9cblx0bWF0Y2hlclJlZ2V4ZXMgOiB7XG5cdFx0XCJ0d2l0dGVyXCI6IG5ldyBSZWdFeHAoICdAW18nICsgQXV0b2xpbmtlci5SZWdleExpYi5hbHBoYU51bWVyaWNDaGFyc1N0ciArICddezEsMjB9JywgJ2cnICksXG5cdFx0XCJpbnN0YWdyYW1cIjogbmV3IFJlZ0V4cCggJ0BbXy4nICsgQXV0b2xpbmtlci5SZWdleExpYi5hbHBoYU51bWVyaWNDaGFyc1N0ciArICddezEsNTB9JywgJ2cnIClcblx0fSxcblxuXHQvKipcblx0ICogVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byB1c2UgdG8gY2hlY2sgdGhlIGNoYXJhY3RlciBiZWZvcmUgYSB1c2VybmFtZSBtYXRjaCB0b1xuXHQgKiBtYWtlIHN1cmUgd2UgZGlkbid0IGFjY2lkZW50YWxseSBtYXRjaCBhbiBlbWFpbCBhZGRyZXNzLlxuXHQgKlxuXHQgKiBGb3IgZXhhbXBsZSwgdGhlIHN0cmluZyBcImFzZGZAYXNkZi5jb21cIiBzaG91bGQgbm90IG1hdGNoIFwiQGFzZGZcIiBhcyBhIHVzZXJuYW1lLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcHJvcGVydHkge1JlZ0V4cH0gbm9uV29yZENoYXJSZWdleFxuXHQgKi9cblx0bm9uV29yZENoYXJSZWdleCA6IG5ldyBSZWdFeHAoICdbXicgKyBBdXRvbGlua2VyLlJlZ2V4TGliLmFscGhhTnVtZXJpY0NoYXJzU3RyICsgJ10nICksXG5cblxuXHQvKipcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgVGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIE1hdGNoIGluc3RhbmNlLFxuXHQgKiAgIHNwZWNpZmllZCBpbiBhbiBPYmplY3QgKG1hcCkuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvciA6IGZ1bmN0aW9uKCBjZmcgKSB7XG5cdFx0QXV0b2xpbmtlci5tYXRjaGVyLk1hdGNoZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwoIHRoaXMsIGNmZyApO1xuXG5cdFx0dGhpcy5zZXJ2aWNlTmFtZSA9IGNmZy5zZXJ2aWNlTmFtZTtcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBAaW5oZXJpdGRvY1xuXHQgKi9cblx0cGFyc2VNYXRjaGVzIDogZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0dmFyIG1hdGNoZXJSZWdleCA9IHRoaXMubWF0Y2hlclJlZ2V4ZXNbdGhpcy5zZXJ2aWNlTmFtZV0sXG5cdFx0ICAgIG5vbldvcmRDaGFyUmVnZXggPSB0aGlzLm5vbldvcmRDaGFyUmVnZXgsXG5cdFx0ICAgIHNlcnZpY2VOYW1lID0gdGhpcy5zZXJ2aWNlTmFtZSxcblx0XHQgICAgdGFnQnVpbGRlciA9IHRoaXMudGFnQnVpbGRlcixcblx0XHQgICAgbWF0Y2hlcyA9IFtdLFxuXHRcdCAgICBtYXRjaDtcblxuXHRcdGlmICghbWF0Y2hlclJlZ2V4KSB7XG5cdFx0XHRyZXR1cm4gbWF0Y2hlcztcblx0XHR9XG5cblx0XHR3aGlsZSggKCBtYXRjaCA9IG1hdGNoZXJSZWdleC5leGVjKCB0ZXh0ICkgKSAhPT0gbnVsbCApIHtcblx0XHRcdHZhciBvZmZzZXQgPSBtYXRjaC5pbmRleCxcblx0XHRcdCAgICBwcmV2Q2hhciA9IHRleHQuY2hhckF0KCBvZmZzZXQgLSAxICk7XG5cblx0XHRcdC8vIElmIHdlIGZvdW5kIHRoZSBtYXRjaCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcsIG9yIHdlIGZvdW5kIHRoZSBtYXRjaFxuXHRcdFx0Ly8gYW5kIHRoZXJlIGlzIGEgd2hpdGVzcGFjZSBjaGFyIGluIGZyb250IG9mIGl0IChtZWFuaW5nIGl0IGlzIG5vdCBhbiBlbWFpbFxuXHRcdFx0Ly8gYWRkcmVzcyksIHRoZW4gaXQgaXMgYSB1c2VybmFtZSBtYXRjaC5cblx0XHRcdGlmKCBvZmZzZXQgPT09IDAgfHwgbm9uV29yZENoYXJSZWdleC50ZXN0KCBwcmV2Q2hhciApICkge1xuXHRcdFx0XHR2YXIgbWF0Y2hlZFRleHQgPSBtYXRjaFsgMCBdLnJlcGxhY2UoL1xcLiskL2csICcnKSwgLy8gc3RyaXAgb2ZmIHRyYWlsaW5nIC5cblx0XHRcdFx0ICAgIG1lbnRpb24gPSBtYXRjaGVkVGV4dC5zbGljZSggMSApOyAgLy8gc3RyaXAgb2ZmIHRoZSAnQCcgY2hhcmFjdGVyIGF0IHRoZSBiZWdpbm5pbmdcblxuXHRcdFx0XHRtYXRjaGVzLnB1c2goIG5ldyBBdXRvbGlua2VyLm1hdGNoLk1lbnRpb24oIHtcblx0XHRcdFx0XHR0YWdCdWlsZGVyICAgIDogdGFnQnVpbGRlcixcblx0XHRcdFx0XHRtYXRjaGVkVGV4dCAgIDogbWF0Y2hlZFRleHQsXG5cdFx0XHRcdFx0b2Zmc2V0ICAgICAgICA6IG9mZnNldCxcblx0XHRcdFx0XHRzZXJ2aWNlTmFtZSAgIDogc2VydmljZU5hbWUsXG5cdFx0XHRcdFx0bWVudGlvbiAgICAgICA6IG1lbnRpb25cblx0XHRcdFx0fSApICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hdGNoZXM7XG5cdH1cblxufSApO1xuXG4vKmdsb2JhbCBBdXRvbGlua2VyICovXG4vKipcbiAqIEBjbGFzcyBBdXRvbGlua2VyLm1hdGNoZXIuVXJsXG4gKiBAZXh0ZW5kcyBBdXRvbGlua2VyLm1hdGNoZXIuTWF0Y2hlclxuICpcbiAqIE1hdGNoZXIgdG8gZmluZCBVUkwgbWF0Y2hlcyBpbiBhbiBpbnB1dCBzdHJpbmcuXG4gKlxuICogU2VlIHRoaXMgY2xhc3MncyBzdXBlcmNsYXNzICh7QGxpbmsgQXV0b2xpbmtlci5tYXRjaGVyLk1hdGNoZXJ9KSBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5BdXRvbGlua2VyLm1hdGNoZXIuVXJsID0gQXV0b2xpbmtlci5VdGlsLmV4dGVuZCggQXV0b2xpbmtlci5tYXRjaGVyLk1hdGNoZXIsIHtcblxuXHQvKipcblx0ICogQGNmZyB7T2JqZWN0fSBzdHJpcFByZWZpeCAocmVxdWlyZWQpXG5cdCAqXG5cdCAqIFRoZSBPYmplY3QgZm9ybSBvZiB7QGxpbmsgQXV0b2xpbmtlciNjZmctc3RyaXBQcmVmaXh9LlxuXHQgKi9cblxuXHQvKipcblx0ICogQGNmZyB7Qm9vbGVhbn0gc3RyaXBUcmFpbGluZ1NsYXNoIChyZXF1aXJlZClcblx0ICogQGluaGVyaXRkb2MgQXV0b2xpbmtlciNzdHJpcFRyYWlsaW5nU2xhc2hcblx0ICovXG5cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogQHByb3BlcnR5IHtSZWdFeHB9IG1hdGNoZXJSZWdleFxuXHQgKlxuXHQgKiBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIFVSTHMgd2l0aCBhbiBvcHRpb25hbCBzY2hlbWUsIHBvcnRcblx0ICogbnVtYmVyLCBwYXRoLCBxdWVyeSBzdHJpbmcsIGFuZCBoYXNoIGFuY2hvci5cblx0ICpcblx0ICogRXhhbXBsZSBtYXRjaGVzOlxuXHQgKlxuXHQgKiAgICAgaHR0cDovL2dvb2dsZS5jb21cblx0ICogICAgIHd3dy5nb29nbGUuY29tXG5cdCAqICAgICBnb29nbGUuY29tL3BhdGgvdG8vZmlsZT9xMT0xJnEyPTIjbXlBbmNob3Jcblx0ICpcblx0ICpcblx0ICogVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gd2lsbCBoYXZlIHRoZSBmb2xsb3dpbmcgY2FwdHVyaW5nIGdyb3Vwczpcblx0ICpcblx0ICogMS4gIEdyb3VwIHRoYXQgbWF0Y2hlcyBhIHNjaGVtZS1wcmVmaXhlZCBVUkwgKGkuZS4gJ2h0dHA6Ly9nb29nbGUuY29tJykuXG5cdCAqICAgICBUaGlzIGlzIHVzZWQgdG8gbWF0Y2ggc2NoZW1lIFVSTHMgd2l0aCBqdXN0IGEgc2luZ2xlIHdvcmQsIHN1Y2ggYXNcblx0ICogICAgICdodHRwOi8vbG9jYWxob3N0Jywgd2hlcmUgd2Ugd29uJ3QgZG91YmxlIGNoZWNrIHRoYXQgdGhlIGRvbWFpbiBuYW1lXG5cdCAqICAgICBoYXMgYXQgbGVhc3Qgb25lIGRvdCAoJy4nKSBpbiBpdC5cblx0ICogMi4gIEdyb3VwIHRoYXQgbWF0Y2hlcyBhICd3d3cuJyBwcmVmaXhlZCBVUkwuIFRoaXMgaXMgb25seSBtYXRjaGVkIGlmIHRoZVxuXHQgKiAgICAgJ3d3dy4nIHRleHQgd2FzIG5vdCBwcmVmaXhlZCBieSBhIHNjaGVtZSAoaS5lLjogbm90IHByZWZpeGVkIGJ5XG5cdCAqICAgICAnaHR0cDovLycsICdmdHA6JywgZXRjLilcblx0ICogMy4gIEEgcHJvdG9jb2wtcmVsYXRpdmUgKCcvLycpIG1hdGNoIGZvciB0aGUgY2FzZSBvZiBhICd3d3cuJyBwcmVmaXhlZFxuXHQgKiAgICAgVVJMLiBXaWxsIGJlIGFuIGVtcHR5IHN0cmluZyBpZiBpdCBpcyBub3QgYSBwcm90b2NvbC1yZWxhdGl2ZSBtYXRjaC5cblx0ICogICAgIFdlIG5lZWQgdG8ga25vdyB0aGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgJy8vJyBpbiBvcmRlciB0byBkZXRlcm1pbmVcblx0ICogICAgIGlmIGl0IGlzIGEgdmFsaWQgbWF0Y2ggb3IgdGhlIC8vIHdhcyBpbiBhIHN0cmluZyB3ZSBkb24ndCB3YW50IHRvXG5cdCAqICAgICBhdXRvLWxpbmsuXG5cdCAqIDQuICBHcm91cCB0aGF0IG1hdGNoZXMgYSBrbm93biBUTEQgKHRvcCBsZXZlbCBkb21haW4pLCB3aGVuIGEgc2NoZW1lXG5cdCAqICAgICBvciAnd3d3LictcHJlZml4ZWQgZG9tYWluIGlzIG5vdCBtYXRjaGVkLlxuXHQgKiA1LiAgQSBwcm90b2NvbC1yZWxhdGl2ZSAoJy8vJykgbWF0Y2ggZm9yIHRoZSBjYXNlIG9mIGEga25vd24gVExEIHByZWZpeGVkXG5cdCAqICAgICBVUkwuIFdpbGwgYmUgYW4gZW1wdHkgc3RyaW5nIGlmIGl0IGlzIG5vdCBhIHByb3RvY29sLXJlbGF0aXZlIG1hdGNoLlxuXHQgKiAgICAgU2VlICMzIGZvciBtb3JlIGluZm8uXG5cdCAqL1xuXHRtYXRjaGVyUmVnZXggOiAoZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHNjaGVtZVJlZ2V4ID0gLyg/OltBLVphLXpdWy0uK0EtWmEtejAtOV0qOig/IVtBLVphLXpdWy0uK0EtWmEtejAtOV0qOlxcL1xcLykoPyFcXGQrXFwvPykoPzpcXC9cXC8pPykvLCAgLy8gbWF0Y2ggcHJvdG9jb2wsIGFsbG93IGluIGZvcm1hdCBcImh0dHA6Ly9cIiBvciBcIm1haWx0bzpcIi4gSG93ZXZlciwgZG8gbm90IG1hdGNoIHRoZSBmaXJzdCBwYXJ0IG9mIHNvbWV0aGluZyBsaWtlICdsaW5rOmh0dHA6Ly93d3cuZ29vZ2xlLmNvbScgKGkuZS4gZG9uJ3QgbWF0Y2ggXCJsaW5rOlwiKS4gQWxzbywgbWFrZSBzdXJlIHdlIGRvbid0IGludGVycHJldCAnZ29vZ2xlLmNvbTo4MDAwJyBhcyBpZiAnZ29vZ2xlLmNvbScgd2FzIGEgcHJvdG9jb2wgaGVyZSAoaS5lLiBpZ25vcmUgYSB0cmFpbGluZyBwb3J0IG51bWJlciBpbiB0aGlzIHJlZ2V4KVxuXHRcdCAgICB3d3dSZWdleCA9IC8oPzp3d3dcXC4pLywgICAgICAgICAgICAgICAgICAvLyBzdGFydGluZyB3aXRoICd3d3cuJ1xuXHRcdCAgICBkb21haW5OYW1lUmVnZXggPSBBdXRvbGlua2VyLlJlZ2V4TGliLmRvbWFpbk5hbWVSZWdleCxcblx0XHQgICAgdGxkUmVnZXggPSBBdXRvbGlua2VyLlJlZ2V4TGliLnRsZFJlZ2V4LCAgLy8gbWF0Y2ggb3VyIGtub3duIHRvcCBsZXZlbCBkb21haW5zIChUTERzKVxuXHRcdCAgICBhbHBoYU51bWVyaWNDaGFyc1N0ciA9IEF1dG9saW5rZXIuUmVnZXhMaWIuYWxwaGFOdW1lcmljQ2hhcnNTdHIsXG5cblx0XHQgICAgLy8gQWxsb3cgb3B0aW9uYWwgcGF0aCwgcXVlcnkgc3RyaW5nLCBhbmQgaGFzaCBhbmNob3IsIG5vdCBlbmRpbmcgaW4gdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzOiBcIj8hOiwuO1wiXG5cdFx0ICAgIC8vIGh0dHA6Ly9ibG9nLmNvZGluZ2hvcnJvci5jb20vdGhlLXByb2JsZW0td2l0aC11cmxzL1xuXHRcdCAgICB1cmxTdWZmaXhSZWdleCA9IG5ldyBSZWdFeHAoICdbJyArIGFscGhhTnVtZXJpY0NoYXJzU3RyICsgJ1xcXFwtKyZAIy8lPX5fKCl8XFwnJCpcXFxcW1xcXFxdPyE6LC47XFx1MjcxM10qWycgKyBhbHBoYU51bWVyaWNDaGFyc1N0ciArICdcXFxcLSsmQCMvJT1+XygpfFxcJyQqXFxcXFtcXFxcXVxcdTI3MTNdJyApO1xuXG5cdFx0cmV0dXJuIG5ldyBSZWdFeHAoIFtcblx0XHRcdCcoPzonLCAvLyBwYXJlbnMgdG8gY292ZXIgbWF0Y2ggZm9yIHNjaGVtZSAob3B0aW9uYWwpLCBhbmQgZG9tYWluXG5cdFx0XHRcdCcoJywgIC8vICoqKiBDYXB0dXJpbmcgZ3JvdXAgJDEsIGZvciBhIHNjaGVtZS1wcmVmaXhlZCB1cmwgKGV4OiBodHRwOi8vZ29vZ2xlLmNvbSlcblx0XHRcdFx0XHRzY2hlbWVSZWdleC5zb3VyY2UsXG5cdFx0XHRcdFx0ZG9tYWluTmFtZVJlZ2V4LnNvdXJjZSxcblx0XHRcdFx0JyknLFxuXG5cdFx0XHRcdCd8JyxcblxuXHRcdFx0XHQnKCcsICAvLyAqKiogQ2FwdHVyaW5nIGdyb3VwICQyLCBmb3IgYSAnd3d3LicgcHJlZml4ZWQgdXJsIChleDogd3d3Lmdvb2dsZS5jb20pXG5cdFx0XHRcdFx0JygvLyk/JywgIC8vICoqKiBDYXB0dXJpbmcgZ3JvdXAgJDMgZm9yIGFuIG9wdGlvbmFsIHByb3RvY29sLXJlbGF0aXZlIFVSTC4gTXVzdCBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcgb3Igc3RhcnQgd2l0aCBhIG5vbi13b3JkIGNoYXJhY3RlciAoaGFuZGxlZCBsYXRlcilcblx0XHRcdFx0XHR3d3dSZWdleC5zb3VyY2UsXG5cdFx0XHRcdFx0ZG9tYWluTmFtZVJlZ2V4LnNvdXJjZSxcblx0XHRcdFx0JyknLFxuXG5cdFx0XHRcdCd8JyxcblxuXHRcdFx0XHQnKCcsICAvLyAqKiogQ2FwdHVyaW5nIGdyb3VwICQ0LCBmb3Iga25vd24gYSBUTEQgdXJsIChleDogZ29vZ2xlLmNvbSlcblx0XHRcdFx0XHQnKC8vKT8nLCAgLy8gKioqIENhcHR1cmluZyBncm91cCAkNSBmb3IgYW4gb3B0aW9uYWwgcHJvdG9jb2wtcmVsYXRpdmUgVVJMLiBNdXN0IGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZyBvciBzdGFydCB3aXRoIGEgbm9uLXdvcmQgY2hhcmFjdGVyIChoYW5kbGVkIGxhdGVyKVxuXHRcdFx0XHRcdGRvbWFpbk5hbWVSZWdleC5zb3VyY2UgKyAnXFxcXC4nLFxuXHRcdFx0XHRcdHRsZFJlZ2V4LnNvdXJjZSxcblx0XHRcdFx0JyknLFxuXHRcdFx0JyknLFxuXG5cdFx0XHQnKD86JyArIHVybFN1ZmZpeFJlZ2V4LnNvdXJjZSArICcpPycgIC8vIG1hdGNoIGZvciBwYXRoLCBxdWVyeSBzdHJpbmcsIGFuZC9vciBoYXNoIGFuY2hvciAtIG9wdGlvbmFsXG5cdFx0XS5qb2luKCBcIlwiICksICdnaScgKTtcblx0fSApKCksXG5cblxuXHQvKipcblx0ICogQSByZWd1bGFyIGV4cHJlc3Npb24gdG8gdXNlIHRvIGNoZWNrIHRoZSBjaGFyYWN0ZXIgYmVmb3JlIGEgcHJvdG9jb2wtcmVsYXRpdmVcblx0ICogVVJMIG1hdGNoLiBXZSBkb24ndCB3YW50IHRvIG1hdGNoIGEgcHJvdG9jb2wtcmVsYXRpdmUgVVJMIGlmIGl0IGlzIHBhcnRcblx0ICogb2YgYW5vdGhlciB3b3JkLlxuXHQgKlxuXHQgKiBGb3IgZXhhbXBsZSwgd2Ugd2FudCB0byBtYXRjaCBzb21ldGhpbmcgbGlrZSBcIkdvIHRvOiAvL2dvb2dsZS5jb21cIixcblx0ICogYnV0IHdlIGRvbid0IHdhbnQgdG8gbWF0Y2ggc29tZXRoaW5nIGxpa2UgXCJhYmMvL2dvb2dsZS5jb21cIlxuXHQgKlxuXHQgKiBUaGlzIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyB1c2VkIHRvIHRlc3QgdGhlIGNoYXJhY3RlciBiZWZvcmUgdGhlICcvLycuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB0eXBlIHtSZWdFeHB9IHdvcmRDaGFyUmVnRXhwXG5cdCAqL1xuXHR3b3JkQ2hhclJlZ0V4cCA6IC9cXHcvLFxuXG5cblx0LyoqXG5cdCAqIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggb3BlbmluZyBwYXJlbnRoZXNpcyBpbiBhIFVSTCBtYXRjaC5cblx0ICpcblx0ICogVGhpcyBpcyB0byBkZXRlcm1pbmUgaWYgd2UgaGF2ZSB1bmJhbGFuY2VkIHBhcmVudGhlc2lzIGluIHRoZSBVUkwsIGFuZCB0b1xuXHQgKiBkcm9wIHRoZSBmaW5hbCBwYXJlbnRoZXNpcyB0aGF0IHdhcyBtYXRjaGVkIGlmIHNvLlxuXHQgKlxuXHQgKiBFeDogVGhlIHRleHQgXCIoY2hlY2sgb3V0OiB3aWtpcGVkaWEuY29tL3NvbWV0aGluZ18oZGlzYW1iaWd1YXRpb24pKVwiXG5cdCAqIHNob3VsZCBvbmx5IGF1dG9saW5rIHRoZSBpbm5lciBcIndpa2lwZWRpYS5jb20vc29tZXRoaW5nXyhkaXNhbWJpZ3VhdGlvbilcIlxuXHQgKiBwYXJ0LCBzbyBpZiB3ZSBmaW5kIHRoYXQgd2UgaGF2ZSB1bmJhbGFuY2VkIHBhcmVudGhlc2lzLCB3ZSB3aWxsIGRyb3AgdGhlXG5cdCAqIGxhc3Qgb25lIGZvciB0aGUgbWF0Y2guXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwcm9wZXJ0eSB7UmVnRXhwfVxuXHQgKi9cblx0b3BlblBhcmVuc1JlIDogL1xcKC9nLFxuXG5cdC8qKlxuXHQgKiBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIGNsb3NpbmcgcGFyZW50aGVzaXMgaW4gYSBVUkwgbWF0Y2guIFNlZVxuXHQgKiB7QGxpbmsgI29wZW5QYXJlbnNSZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwcm9wZXJ0eSB7UmVnRXhwfVxuXHQgKi9cblx0Y2xvc2VQYXJlbnNSZSA6IC9cXCkvZyxcblxuXG5cdC8qKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICogQHBhcmFtIHtPYmplY3R9IGNmZyBUaGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgTWF0Y2ggaW5zdGFuY2UsXG5cdCAqICAgc3BlY2lmaWVkIGluIGFuIE9iamVjdCAobWFwKS5cblx0ICovXG5cdGNvbnN0cnVjdG9yIDogZnVuY3Rpb24oIGNmZyApIHtcblx0XHRBdXRvbGlua2VyLm1hdGNoZXIuTWF0Y2hlci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCggdGhpcywgY2ZnICk7XG5cblx0XHRpZiggY2ZnLnN0cmlwUHJlZml4ID09IG51bGwgKSB0aHJvdyBuZXcgRXJyb3IoICdgc3RyaXBQcmVmaXhgIGNmZyByZXF1aXJlZCcgKTtcblx0XHRpZiggY2ZnLnN0cmlwVHJhaWxpbmdTbGFzaCA9PSBudWxsICkgdGhyb3cgbmV3IEVycm9yKCAnYHN0cmlwVHJhaWxpbmdTbGFzaGAgY2ZnIHJlcXVpcmVkJyApO1xuXG5cdFx0dGhpcy5zdHJpcFByZWZpeCA9IGNmZy5zdHJpcFByZWZpeDtcblx0XHR0aGlzLnN0cmlwVHJhaWxpbmdTbGFzaCA9IGNmZy5zdHJpcFRyYWlsaW5nU2xhc2g7XG5cdH0sXG5cblxuXHQvKipcblx0ICogQGluaGVyaXRkb2Ncblx0ICovXG5cdHBhcnNlTWF0Y2hlcyA6IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdHZhciBtYXRjaGVyUmVnZXggPSB0aGlzLm1hdGNoZXJSZWdleCxcblx0XHQgICAgc3RyaXBQcmVmaXggPSB0aGlzLnN0cmlwUHJlZml4LFxuXHRcdCAgICBzdHJpcFRyYWlsaW5nU2xhc2ggPSB0aGlzLnN0cmlwVHJhaWxpbmdTbGFzaCxcblx0XHQgICAgdGFnQnVpbGRlciA9IHRoaXMudGFnQnVpbGRlcixcblx0XHQgICAgbWF0Y2hlcyA9IFtdLFxuXHRcdCAgICBtYXRjaDtcblxuXHRcdHdoaWxlKCAoIG1hdGNoID0gbWF0Y2hlclJlZ2V4LmV4ZWMoIHRleHQgKSApICE9PSBudWxsICkge1xuXHRcdFx0dmFyIG1hdGNoU3RyID0gbWF0Y2hbIDAgXSxcblx0XHRcdCAgICBzY2hlbWVVcmxNYXRjaCA9IG1hdGNoWyAxIF0sXG5cdFx0XHQgICAgd3d3VXJsTWF0Y2ggPSBtYXRjaFsgMiBdLFxuXHRcdFx0ICAgIHd3d1Byb3RvY29sUmVsYXRpdmVNYXRjaCA9IG1hdGNoWyAzIF0sXG5cdFx0XHQgICAgLy90bGRVcmxNYXRjaCA9IG1hdGNoWyA0IF0sICAtLSBub3QgbmVlZGVkIGF0IHRoZSBtb21lbnRcblx0XHRcdCAgICB0bGRQcm90b2NvbFJlbGF0aXZlTWF0Y2ggPSBtYXRjaFsgNSBdLFxuXHRcdFx0ICAgIG9mZnNldCA9IG1hdGNoLmluZGV4LFxuXHRcdFx0ICAgIHByb3RvY29sUmVsYXRpdmVNYXRjaCA9IHd3d1Byb3RvY29sUmVsYXRpdmVNYXRjaCB8fCB0bGRQcm90b2NvbFJlbGF0aXZlTWF0Y2gsXG5cdFx0XHRcdHByZXZDaGFyID0gdGV4dC5jaGFyQXQoIG9mZnNldCAtIDEgKTtcblxuXHRcdFx0aWYoICFBdXRvbGlua2VyLm1hdGNoZXIuVXJsTWF0Y2hWYWxpZGF0b3IuaXNWYWxpZCggbWF0Y2hTdHIsIHNjaGVtZVVybE1hdGNoICkgKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGUgbWF0Y2ggaXMgcHJlY2VkZWQgYnkgYW4gJ0AnIGNoYXJhY3RlciwgdGhlbiBpdCBpcyBlaXRoZXJcblx0XHRcdC8vIGFuIGVtYWlsIGFkZHJlc3Mgb3IgYSB1c2VybmFtZS4gU2tpcCB0aGVzZSB0eXBlcyBvZiBtYXRjaGVzLlxuXHRcdFx0aWYoIG9mZnNldCA+IDAgJiYgcHJldkNoYXIgPT09ICdAJyApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGl0J3MgYSBwcm90b2NvbC1yZWxhdGl2ZSAnLy8nIG1hdGNoLCBidXQgdGhlIGNoYXJhY3RlciBiZWZvcmUgdGhlICcvLydcblx0XHRcdC8vIHdhcyBhIHdvcmQgY2hhcmFjdGVyIChpLmUuIGEgbGV0dGVyL251bWJlciksIHRoZW4gd2UgZm91bmQgdGhlICcvLycgaW4gdGhlXG5cdFx0XHQvLyBtaWRkbGUgb2YgYW5vdGhlciB3b3JkIChzdWNoIGFzIFwiYXNkZi8vYXNkZi5jb21cIikuIEluIHRoaXMgY2FzZSwgc2tpcCB0aGVcblx0XHRcdC8vIG1hdGNoLlxuXHRcdFx0aWYoIG9mZnNldCA+IDAgJiYgcHJvdG9jb2xSZWxhdGl2ZU1hdGNoICYmIHRoaXMud29yZENoYXJSZWdFeHAudGVzdCggcHJldkNoYXIgKSApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEhhbmRsZSBhIGNsb3NpbmcgcGFyZW50aGVzaXMgYXQgdGhlIGVuZCBvZiB0aGUgbWF0Y2gsIGFuZCBleGNsdWRlXG5cdFx0XHQvLyBpdCBpZiB0aGVyZSBpcyBub3QgYSBtYXRjaGluZyBvcGVuIHBhcmVudGhlc2lzIGluIHRoZSBtYXRjaFxuXHRcdFx0Ly8gaXRzZWxmLlxuXHRcdFx0aWYoIHRoaXMubWF0Y2hIYXNVbmJhbGFuY2VkQ2xvc2luZ1BhcmVuKCBtYXRjaFN0ciApICkge1xuXHRcdFx0XHRtYXRjaFN0ciA9IG1hdGNoU3RyLnN1YnN0ciggMCwgbWF0Y2hTdHIubGVuZ3RoIC0gMSApOyAgLy8gcmVtb3ZlIHRoZSB0cmFpbGluZyBcIilcIlxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gSGFuZGxlIGFuIGludmFsaWQgY2hhcmFjdGVyIGFmdGVyIHRoZSBUTERcblx0XHRcdFx0dmFyIHBvcyA9IHRoaXMubWF0Y2hIYXNJbnZhbGlkQ2hhckFmdGVyVGxkKCBtYXRjaFN0ciwgc2NoZW1lVXJsTWF0Y2ggKTtcblx0XHRcdFx0aWYoIHBvcyA+IC0xICkge1xuXHRcdFx0XHRcdG1hdGNoU3RyID0gbWF0Y2hTdHIuc3Vic3RyKCAwLCBwb3MgKTsgLy8gcmVtb3ZlIHRoZSB0cmFpbGluZyBpbnZhbGlkIGNoYXJzXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dmFyIHVybE1hdGNoVHlwZSA9IHNjaGVtZVVybE1hdGNoID8gJ3NjaGVtZScgOiAoIHd3d1VybE1hdGNoID8gJ3d3dycgOiAndGxkJyApLFxuXHRcdFx0ICAgIHByb3RvY29sVXJsTWF0Y2ggPSAhIXNjaGVtZVVybE1hdGNoO1xuXG5cdFx0XHRtYXRjaGVzLnB1c2goIG5ldyBBdXRvbGlua2VyLm1hdGNoLlVybCgge1xuXHRcdFx0XHR0YWdCdWlsZGVyICAgICAgICAgICAgOiB0YWdCdWlsZGVyLFxuXHRcdFx0XHRtYXRjaGVkVGV4dCAgICAgICAgICAgOiBtYXRjaFN0cixcblx0XHRcdFx0b2Zmc2V0ICAgICAgICAgICAgICAgIDogb2Zmc2V0LFxuXHRcdFx0XHR1cmxNYXRjaFR5cGUgICAgICAgICAgOiB1cmxNYXRjaFR5cGUsXG5cdFx0XHRcdHVybCAgICAgICAgICAgICAgICAgICA6IG1hdGNoU3RyLFxuXHRcdFx0XHRwcm90b2NvbFVybE1hdGNoICAgICAgOiBwcm90b2NvbFVybE1hdGNoLFxuXHRcdFx0XHRwcm90b2NvbFJlbGF0aXZlTWF0Y2ggOiAhIXByb3RvY29sUmVsYXRpdmVNYXRjaCxcblx0XHRcdFx0c3RyaXBQcmVmaXggICAgICAgICAgIDogc3RyaXBQcmVmaXgsXG5cdFx0XHRcdHN0cmlwVHJhaWxpbmdTbGFzaCAgICA6IHN0cmlwVHJhaWxpbmdTbGFzaFxuXHRcdFx0fSApICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hdGNoZXM7XG5cdH0sXG5cblxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyBpZiBhIG1hdGNoIGZvdW5kIGhhcyBhbiB1bm1hdGNoZWQgY2xvc2luZyBwYXJlbnRoZXNpcy4gSWYgc28sXG5cdCAqIHRoaXMgcGFyZW50aGVzaXMgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIG1hdGNoIGl0c2VsZiwgYW5kIGFwcGVuZGVkXG5cdCAqIGFmdGVyIHRoZSBnZW5lcmF0ZWQgYW5jaG9yIHRhZy5cblx0ICpcblx0ICogQSBtYXRjaCBtYXkgaGF2ZSBhbiBleHRyYSBjbG9zaW5nIHBhcmVudGhlc2lzIGF0IHRoZSBlbmQgb2YgdGhlIG1hdGNoXG5cdCAqIGJlY2F1c2UgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBtdXN0IGluY2x1ZGUgcGFyZW50aGVzaXMgZm9yIFVSTHMgc3VjaCBhc1xuXHQgKiBcIndpa2lwZWRpYS5jb20vc29tZXRoaW5nXyhkaXNhbWJpZ3VhdGlvbilcIiwgd2hpY2ggc2hvdWxkIGJlIGF1dG8tbGlua2VkLlxuXHQgKlxuXHQgKiBIb3dldmVyLCBhbiBleHRyYSBwYXJlbnRoZXNpcyAqd2lsbCogYmUgaW5jbHVkZWQgd2hlbiB0aGUgVVJMIGl0c2VsZiBpc1xuXHQgKiB3cmFwcGVkIGluIHBhcmVudGhlc2lzLCBzdWNoIGFzIGluIHRoZSBjYXNlIG9mIFwiKHdpa2lwZWRpYS5jb20vc29tZXRoaW5nXyhkaXNhbWJpZ3VhdGlvbikpXCIuXG5cdCAqIEluIHRoaXMgY2FzZSwgdGhlIGxhc3QgY2xvc2luZyBwYXJlbnRoZXNpcyBzaG91bGQgKm5vdCogYmUgcGFydCBvZiB0aGVcblx0ICogVVJMIGl0c2VsZiwgYW5kIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGB0cnVlYC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IG1hdGNoU3RyIFRoZSBmdWxsIG1hdGNoIHN0cmluZyBmcm9tIHRoZSB7QGxpbmsgI21hdGNoZXJSZWdleH0uXG5cdCAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGVyZSBpcyBhbiB1bmJhbGFuY2VkIGNsb3NpbmcgcGFyZW50aGVzaXMgYXRcblx0ICogICB0aGUgZW5kIG9mIHRoZSBgbWF0Y2hTdHJgLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdG1hdGNoSGFzVW5iYWxhbmNlZENsb3NpbmdQYXJlbiA6IGZ1bmN0aW9uKCBtYXRjaFN0ciApIHtcblx0XHR2YXIgbGFzdENoYXIgPSBtYXRjaFN0ci5jaGFyQXQoIG1hdGNoU3RyLmxlbmd0aCAtIDEgKTtcblxuXHRcdGlmKCBsYXN0Q2hhciA9PT0gJyknICkge1xuXHRcdFx0dmFyIG9wZW5QYXJlbnNNYXRjaCA9IG1hdGNoU3RyLm1hdGNoKCB0aGlzLm9wZW5QYXJlbnNSZSApLFxuXHRcdFx0ICAgIGNsb3NlUGFyZW5zTWF0Y2ggPSBtYXRjaFN0ci5tYXRjaCggdGhpcy5jbG9zZVBhcmVuc1JlICksXG5cdFx0XHQgICAgbnVtT3BlblBhcmVucyA9ICggb3BlblBhcmVuc01hdGNoICYmIG9wZW5QYXJlbnNNYXRjaC5sZW5ndGggKSB8fCAwLFxuXHRcdFx0ICAgIG51bUNsb3NlUGFyZW5zID0gKCBjbG9zZVBhcmVuc01hdGNoICYmIGNsb3NlUGFyZW5zTWF0Y2gubGVuZ3RoICkgfHwgMDtcblxuXHRcdFx0aWYoIG51bU9wZW5QYXJlbnMgPCBudW1DbG9zZVBhcmVucyApIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cblx0LyoqXG5cdCAqIERldGVybWluZSBpZiB0aGVyZSdzIGFuIGludmFsaWQgY2hhcmFjdGVyIGFmdGVyIHRoZSBUTEQgaW4gYSBVUkwuIFZhbGlkXG5cdCAqIGNoYXJhY3RlcnMgYWZ0ZXIgVExEIGFyZSAnOi8/IycuIEV4Y2x1ZGUgc2NoZW1lIG1hdGNoZWQgVVJMcyBmcm9tIHRoaXNcblx0ICogY2hlY2suXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB1cmxNYXRjaCBUaGUgbWF0Y2hlZCBVUkwsIGlmIHRoZXJlIHdhcyBvbmUuIFdpbGwgYmUgYW5cblx0ICogICBlbXB0eSBzdHJpbmcgaWYgdGhlIG1hdGNoIGlzIG5vdCBhIFVSTCBtYXRjaC5cblx0ICogQHBhcmFtIHtTdHJpbmd9IHNjaGVtZVVybE1hdGNoIFRoZSBtYXRjaCBVUkwgc3RyaW5nIGZvciBhIHNjaGVtZVxuXHQgKiAgIG1hdGNoLiBFeDogJ2h0dHA6Ly95YWhvby5jb20nLiBUaGlzIGlzIHVzZWQgdG8gbWF0Y2ggc29tZXRoaW5nIGxpa2Vcblx0ICogICAnaHR0cDovL2xvY2FsaG9zdCcsIHdoZXJlIHdlIHdvbid0IGRvdWJsZSBjaGVjayB0aGF0IHRoZSBkb21haW4gbmFtZVxuXHQgKiAgIGhhcyBhdCBsZWFzdCBvbmUgJy4nIGluIGl0LlxuXHQgKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgaW52YWxpZCBjaGFyYWN0ZXIgd2FzIGZvdW5kLiBJZlxuXHQgKiAgIG5vIHN1Y2ggY2hhcmFjdGVyIHdhcyBmb3VuZCwgcmV0dXJucyAtMVxuXHQgKi9cblx0bWF0Y2hIYXNJbnZhbGlkQ2hhckFmdGVyVGxkIDogZnVuY3Rpb24oIHVybE1hdGNoLCBzY2hlbWVVcmxNYXRjaCApIHtcblx0XHRpZiggIXVybE1hdGNoICkge1xuXHRcdFx0cmV0dXJuIC0xO1xuXHRcdH1cblxuXHRcdHZhciBvZmZzZXQgPSAwO1xuXHRcdGlmICggc2NoZW1lVXJsTWF0Y2ggKSB7XG5cdFx0XHRvZmZzZXQgPSB1cmxNYXRjaC5pbmRleE9mKCc6Jyk7XG5cdFx0XHR1cmxNYXRjaCA9IHVybE1hdGNoLnNsaWNlKG9mZnNldCk7XG5cdFx0fVxuXG5cdFx0dmFyIHJlID0gL14oKC4/XFwvXFwvKT9bQS1aYS16MC05XFx1MDBDMC1cXHUwMTdGXFwuXFwtXSpbQS1aYS16MC05XFx1MDBDMC1cXHUwMTdGXFwtXVxcLltBLVphLXpdKykvO1xuXHRcdHZhciByZXMgPSByZS5leGVjKCB1cmxNYXRjaCApO1xuXHRcdGlmICggcmVzID09PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIC0xO1xuXHRcdH1cblxuXHRcdG9mZnNldCArPSByZXNbMV0ubGVuZ3RoO1xuXHRcdHVybE1hdGNoID0gdXJsTWF0Y2guc2xpY2UocmVzWzFdLmxlbmd0aCk7XG5cdFx0aWYgKC9eW14uQS1aYS16MC05OlxcLz8jXS8udGVzdCh1cmxNYXRjaCkpIHtcblx0XHRcdHJldHVybiBvZmZzZXQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIC0xO1xuXHR9XG5cbn0gKTtcblxuLypnbG9iYWwgQXV0b2xpbmtlciAqL1xuLypqc2hpbnQgc2NyaXB0dXJsOnRydWUgKi9cbi8qKlxuICogQHByaXZhdGVcbiAqIEBjbGFzcyBBdXRvbGlua2VyLm1hdGNoZXIuVXJsTWF0Y2hWYWxpZGF0b3JcbiAqIEBzaW5nbGV0b25cbiAqXG4gKiBVc2VkIGJ5IEF1dG9saW5rZXIgdG8gZmlsdGVyIG91dCBmYWxzZSBVUkwgcG9zaXRpdmVzIGZyb20gdGhlXG4gKiB7QGxpbmsgQXV0b2xpbmtlci5tYXRjaGVyLlVybCBVcmxNYXRjaGVyfS5cbiAqXG4gKiBEdWUgdG8gdGhlIGxpbWl0YXRpb25zIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgKGluY2x1ZGluZyB0aGUgbWlzc2luZyBmZWF0dXJlXG4gKiBvZiBsb29rLWJlaGluZHMgaW4gSlMgcmVndWxhciBleHByZXNzaW9ucyksIHdlIGNhbm5vdCBhbHdheXMgZGV0ZXJtaW5lIHRoZVxuICogdmFsaWRpdHkgb2YgYSBnaXZlbiBtYXRjaC4gVGhpcyBjbGFzcyBhcHBsaWVzIGEgYml0IG9mIGFkZGl0aW9uYWwgbG9naWMgdG9cbiAqIGZpbHRlciBvdXQgYW55IGZhbHNlIHBvc2l0aXZlcyB0aGF0IGhhdmUgYmVlbiBtYXRjaGVkIGJ5IHRoZVxuICoge0BsaW5rIEF1dG9saW5rZXIubWF0Y2hlci5VcmwgVXJsTWF0Y2hlcn0uXG4gKi9cbkF1dG9saW5rZXIubWF0Y2hlci5VcmxNYXRjaFZhbGlkYXRvciA9IHtcblxuXHQvKipcblx0ICogUmVnZXggdG8gdGVzdCBmb3IgYSBmdWxsIHByb3RvY29sLCB3aXRoIHRoZSB0d28gdHJhaWxpbmcgc2xhc2hlcy4gRXg6ICdodHRwOi8vJ1xuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcHJvcGVydHkge1JlZ0V4cH0gaGFzRnVsbFByb3RvY29sUmVnZXhcblx0ICovXG5cdGhhc0Z1bGxQcm90b2NvbFJlZ2V4IDogL15bQS1aYS16XVstLitBLVphLXowLTldKjpcXC9cXC8vLFxuXG5cdC8qKlxuXHQgKiBSZWdleCB0byBmaW5kIHRoZSBVUkkgc2NoZW1lLCBzdWNoIGFzICdtYWlsdG86Jy5cblx0ICpcblx0ICogVGhpcyBpcyB1c2VkIHRvIGZpbHRlciBvdXQgJ2phdmFzY3JpcHQ6JyBhbmQgJ3Zic2NyaXB0Oicgc2NoZW1lcy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHByb3BlcnR5IHtSZWdFeHB9IHVyaVNjaGVtZVJlZ2V4XG5cdCAqL1xuXHR1cmlTY2hlbWVSZWdleCA6IC9eW0EtWmEtel1bLS4rQS1aYS16MC05XSo6LyxcblxuXHQvKipcblx0ICogUmVnZXggdG8gZGV0ZXJtaW5lIGlmIGF0IGxlYXN0IG9uZSB3b3JkIGNoYXIgZXhpc3RzIGFmdGVyIHRoZSBwcm90b2NvbCAoaS5lLiBhZnRlciB0aGUgJzonKVxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcHJvcGVydHkge1JlZ0V4cH0gaGFzV29yZENoYXJBZnRlclByb3RvY29sUmVnZXhcblx0ICovXG5cdGhhc1dvcmRDaGFyQWZ0ZXJQcm90b2NvbFJlZ2V4IDogLzpbXlxcc10qP1tBLVphLXpcXHUwMEMwLVxcdTAxN0ZdLyxcblxuXHQvKipcblx0ICogUmVnZXggdG8gZGV0ZXJtaW5lIGlmIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBJUCBhZGRyZXNzXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwcm9wZXJ0eSB7UmVnRXhwfSBpcFJlZ2V4XG5cdCAqL1xuXHRpcFJlZ2V4OiAvWzAtOV1bMC05XT9bMC05XT9cXC5bMC05XVswLTldP1swLTldP1xcLlswLTldWzAtOV0/WzAtOV0/XFwuWzAtOV1bMC05XT9bMC05XT8oOlswLTldKik/XFwvPyQvLFxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gVVJMIG1hdGNoIGZvdW5kIGJ5IHRoZSB7QGxpbmsgQXV0b2xpbmtlci5tYXRjaGVyLlVybCBVcmxNYXRjaGVyfVxuXHQgKiBpcyB2YWxpZC4gV2lsbCByZXR1cm4gYGZhbHNlYCBmb3I6XG5cdCAqXG5cdCAqIDEpIFVSTCBtYXRjaGVzIHdoaWNoIGRvIG5vdCBoYXZlIGF0IGxlYXN0IGhhdmUgb25lIHBlcmlvZCAoJy4nKSBpbiB0aGVcblx0ICogICAgZG9tYWluIG5hbWUgKGVmZmVjdGl2ZWx5IHNraXBwaW5nIG92ZXIgbWF0Y2hlcyBsaWtlIFwiYWJjOmRlZlwiKS5cblx0ICogICAgSG93ZXZlciwgVVJMIG1hdGNoZXMgd2l0aCBhIHByb3RvY29sIHdpbGwgYmUgYWxsb3dlZCAoZXg6ICdodHRwOi8vbG9jYWxob3N0Jylcblx0ICogMikgVVJMIG1hdGNoZXMgd2hpY2ggZG8gbm90IGhhdmUgYXQgbGVhc3Qgb25lIHdvcmQgY2hhcmFjdGVyIGluIHRoZVxuXHQgKiAgICBkb21haW4gbmFtZSAoZWZmZWN0aXZlbHkgc2tpcHBpbmcgb3ZlciBtYXRjaGVzIGxpa2UgXCJnaXQ6MS4wXCIpLlxuXHQgKiAzKSBBIHByb3RvY29sLXJlbGF0aXZlIHVybCBtYXRjaCAoYSBVUkwgYmVnaW5uaW5nIHdpdGggJy8vJykgd2hvc2Vcblx0ICogICAgcHJldmlvdXMgY2hhcmFjdGVyIGlzIGEgd29yZCBjaGFyYWN0ZXIgKGVmZmVjdGl2ZWx5IHNraXBwaW5nIG92ZXJcblx0ICogICAgc3RyaW5ncyBsaWtlIFwiYWJjLy9nb29nbGUuY29tXCIpXG5cdCAqXG5cdCAqIE90aGVyd2lzZSwgcmV0dXJucyBgdHJ1ZWAuXG5cdCAqXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB1cmxNYXRjaCBUaGUgbWF0Y2hlZCBVUkwsIGlmIHRoZXJlIHdhcyBvbmUuIFdpbGwgYmUgYW5cblx0ICogICBlbXB0eSBzdHJpbmcgaWYgdGhlIG1hdGNoIGlzIG5vdCBhIFVSTCBtYXRjaC5cblx0ICogQHBhcmFtIHtTdHJpbmd9IHByb3RvY29sVXJsTWF0Y2ggVGhlIG1hdGNoIFVSTCBzdHJpbmcgZm9yIGEgcHJvdG9jb2xcblx0ICogICBtYXRjaC4gRXg6ICdodHRwOi8veWFob28uY29tJy4gVGhpcyBpcyB1c2VkIHRvIG1hdGNoIHNvbWV0aGluZyBsaWtlXG5cdCAqICAgJ2h0dHA6Ly9sb2NhbGhvc3QnLCB3aGVyZSB3ZSB3b24ndCBkb3VibGUgY2hlY2sgdGhhdCB0aGUgZG9tYWluIG5hbWVcblx0ICogICBoYXMgYXQgbGVhc3Qgb25lICcuJyBpbiBpdC5cblx0ICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBtYXRjaCBnaXZlbiBpcyB2YWxpZCBhbmQgc2hvdWxkIGJlXG5cdCAqICAgcHJvY2Vzc2VkLCBvciBgZmFsc2VgIGlmIHRoZSBtYXRjaCBpcyBpbnZhbGlkIGFuZC9vciBzaG91bGQganVzdCBub3QgYmVcblx0ICogICBwcm9jZXNzZWQuXG5cdCAqL1xuXHRpc1ZhbGlkIDogZnVuY3Rpb24oIHVybE1hdGNoLCBwcm90b2NvbFVybE1hdGNoICkge1xuXHRcdGlmKFxuXHRcdFx0KCBwcm90b2NvbFVybE1hdGNoICYmICF0aGlzLmlzVmFsaWRVcmlTY2hlbWUoIHByb3RvY29sVXJsTWF0Y2ggKSApIHx8XG5cdFx0XHR0aGlzLnVybE1hdGNoRG9lc05vdEhhdmVQcm90b2NvbE9yRG90KCB1cmxNYXRjaCwgcHJvdG9jb2xVcmxNYXRjaCApIHx8ICAgIC8vIEF0IGxlYXN0IG9uZSBwZXJpb2QgKCcuJykgbXVzdCBleGlzdCBpbiB0aGUgVVJMIG1hdGNoIGZvciB1cyB0byBjb25zaWRlciBpdCBhbiBhY3R1YWwgVVJMLCAqdW5sZXNzKiBpdCB3YXMgYSBmdWxsIHByb3RvY29sIG1hdGNoIChsaWtlICdodHRwOi8vbG9jYWxob3N0Jylcblx0XHRcdCh0aGlzLnVybE1hdGNoRG9lc05vdEhhdmVBdExlYXN0T25lV29yZENoYXIoIHVybE1hdGNoLCBwcm90b2NvbFVybE1hdGNoICkgJiYgLy8gQXQgbGVhc3Qgb25lIGxldHRlciBjaGFyYWN0ZXIgbXVzdCBleGlzdCBpbiB0aGUgZG9tYWluIG5hbWUgYWZ0ZXIgYSBwcm90b2NvbCBtYXRjaC4gRXg6IHNraXAgb3ZlciBzb21ldGhpbmcgbGlrZSBcImdpdDoxLjBcIlxuXHRcdFx0ICAgIXRoaXMuaXNWYWxpZElwQWRkcmVzcyggdXJsTWF0Y2ggKSkgfHwgLy8gRXhjZXB0IGlmIGl0J3MgYW4gSVAgYWRkcmVzc1xuXHRcdFx0dGhpcy5jb250YWluc011bHRpcGxlRG90cyggdXJsTWF0Y2ggKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cblx0aXNWYWxpZElwQWRkcmVzcyA6IGZ1bmN0aW9uICggdXJpU2NoZW1lTWF0Y2ggKSB7XG5cdFx0dmFyIG5ld1JlZ2V4ID0gbmV3IFJlZ0V4cCh0aGlzLmhhc0Z1bGxQcm90b2NvbFJlZ2V4LnNvdXJjZSArIHRoaXMuaXBSZWdleC5zb3VyY2UpO1xuXHRcdHZhciB1cmlTY2hlbWUgPSB1cmlTY2hlbWVNYXRjaC5tYXRjaCggbmV3UmVnZXggKTtcblxuXHRcdHJldHVybiB1cmlTY2hlbWUgIT09IG51bGw7XG5cdH0sXG5cblx0Y29udGFpbnNNdWx0aXBsZURvdHMgOiBmdW5jdGlvbiAoIHVybE1hdGNoICkge1xuXHRcdHJldHVybiB1cmxNYXRjaC5pbmRleE9mKFwiLi5cIikgPiAtMTtcblx0fSxcblxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyBpZiB0aGUgVVJJIHNjaGVtZSBpcyBhIHZhbGlkIHNjaGVtZSB0byBiZSBhdXRvbGlua2VkLiBSZXR1cm5zXG5cdCAqIGBmYWxzZWAgaWYgdGhlIHNjaGVtZSBpcyAnamF2YXNjcmlwdDonIG9yICd2YnNjcmlwdDonXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB1cmlTY2hlbWVNYXRjaCBUaGUgbWF0Y2ggVVJMIHN0cmluZyBmb3IgYSBmdWxsIFVSSSBzY2hlbWVcblx0ICogICBtYXRjaC4gRXg6ICdodHRwOi8veWFob28uY29tJyBvciAnbWFpbHRvOmFAYS5jb20nLlxuXHQgKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIHNjaGVtZSBpcyBhIHZhbGlkIG9uZSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRpc1ZhbGlkVXJpU2NoZW1lIDogZnVuY3Rpb24oIHVyaVNjaGVtZU1hdGNoICkge1xuXHRcdHZhciB1cmlTY2hlbWUgPSB1cmlTY2hlbWVNYXRjaC5tYXRjaCggdGhpcy51cmlTY2hlbWVSZWdleCApWyAwIF0udG9Mb3dlckNhc2UoKTtcblxuXHRcdHJldHVybiAoIHVyaVNjaGVtZSAhPT0gJ2phdmFzY3JpcHQ6JyAmJiB1cmlTY2hlbWUgIT09ICd2YnNjcmlwdDonICk7XG5cdH0sXG5cblxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyBpZiBhIFVSTCBtYXRjaCBkb2VzIG5vdCBoYXZlIGVpdGhlcjpcblx0ICpcblx0ICogYSkgYSBmdWxsIHByb3RvY29sIChpLmUuICdodHRwOi8vJyksIG9yXG5cdCAqIGIpIGF0IGxlYXN0IG9uZSBkb3QgKCcuJykgaW4gdGhlIGRvbWFpbiBuYW1lIChmb3IgYSBub24tZnVsbC1wcm90b2NvbFxuXHQgKiAgICBtYXRjaCkuXG5cdCAqXG5cdCAqIEVpdGhlciBzaXR1YXRpb24gaXMgY29uc2lkZXJlZCBhbiBpbnZhbGlkIFVSTCAoZXg6ICdnaXQ6ZCcgZG9lcyBub3QgaGF2ZVxuXHQgKiBlaXRoZXIgdGhlICc6Ly8nIHBhcnQsIG9yIGF0IGxlYXN0IG9uZSBkb3QgaW4gdGhlIGRvbWFpbiBuYW1lLiBJZiB0aGVcblx0ICogbWF0Y2ggd2FzICdnaXQ6YWJjLmNvbScsIHdlIHdvdWxkIGNvbnNpZGVyIHRoaXMgdmFsaWQuKVxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdXJsTWF0Y2ggVGhlIG1hdGNoZWQgVVJMLCBpZiB0aGVyZSB3YXMgb25lLiBXaWxsIGJlIGFuXG5cdCAqICAgZW1wdHkgc3RyaW5nIGlmIHRoZSBtYXRjaCBpcyBub3QgYSBVUkwgbWF0Y2guXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBwcm90b2NvbFVybE1hdGNoIFRoZSBtYXRjaCBVUkwgc3RyaW5nIGZvciBhIHByb3RvY29sXG5cdCAqICAgbWF0Y2guIEV4OiAnaHR0cDovL3lhaG9vLmNvbScuIFRoaXMgaXMgdXNlZCB0byBtYXRjaCBzb21ldGhpbmcgbGlrZVxuXHQgKiAgICdodHRwOi8vbG9jYWxob3N0Jywgd2hlcmUgd2Ugd29uJ3QgZG91YmxlIGNoZWNrIHRoYXQgdGhlIGRvbWFpbiBuYW1lXG5cdCAqICAgaGFzIGF0IGxlYXN0IG9uZSAnLicgaW4gaXQuXG5cdCAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgVVJMIG1hdGNoIGRvZXMgbm90IGhhdmUgYSBmdWxsIHByb3RvY29sLFxuXHQgKiAgIG9yIGF0IGxlYXN0IG9uZSBkb3QgKCcuJykgaW4gYSBub24tZnVsbC1wcm90b2NvbCBtYXRjaC5cblx0ICovXG5cdHVybE1hdGNoRG9lc05vdEhhdmVQcm90b2NvbE9yRG90IDogZnVuY3Rpb24oIHVybE1hdGNoLCBwcm90b2NvbFVybE1hdGNoICkge1xuXHRcdHJldHVybiAoICEhdXJsTWF0Y2ggJiYgKCAhcHJvdG9jb2xVcmxNYXRjaCB8fCAhdGhpcy5oYXNGdWxsUHJvdG9jb2xSZWdleC50ZXN0KCBwcm90b2NvbFVybE1hdGNoICkgKSAmJiB1cmxNYXRjaC5pbmRleE9mKCAnLicgKSA9PT0gLTEgKTtcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIGlmIGEgVVJMIG1hdGNoIGRvZXMgbm90IGhhdmUgYXQgbGVhc3Qgb25lIHdvcmQgY2hhcmFjdGVyIGFmdGVyXG5cdCAqIHRoZSBwcm90b2NvbCAoaS5lLiBpbiB0aGUgZG9tYWluIG5hbWUpLlxuXHQgKlxuXHQgKiBBdCBsZWFzdCBvbmUgbGV0dGVyIGNoYXJhY3RlciBtdXN0IGV4aXN0IGluIHRoZSBkb21haW4gbmFtZSBhZnRlciBhXG5cdCAqIHByb3RvY29sIG1hdGNoLiBFeDogc2tpcCBvdmVyIHNvbWV0aGluZyBsaWtlIFwiZ2l0OjEuMFwiXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB1cmxNYXRjaCBUaGUgbWF0Y2hlZCBVUkwsIGlmIHRoZXJlIHdhcyBvbmUuIFdpbGwgYmUgYW5cblx0ICogICBlbXB0eSBzdHJpbmcgaWYgdGhlIG1hdGNoIGlzIG5vdCBhIFVSTCBtYXRjaC5cblx0ICogQHBhcmFtIHtTdHJpbmd9IHByb3RvY29sVXJsTWF0Y2ggVGhlIG1hdGNoIFVSTCBzdHJpbmcgZm9yIGEgcHJvdG9jb2xcblx0ICogICBtYXRjaC4gRXg6ICdodHRwOi8veWFob28uY29tJy4gVGhpcyBpcyB1c2VkIHRvIGtub3cgd2hldGhlciBvciBub3Qgd2Vcblx0ICogICBoYXZlIGEgcHJvdG9jb2wgaW4gdGhlIFVSTCBzdHJpbmcsIGluIG9yZGVyIHRvIGNoZWNrIGZvciBhIHdvcmRcblx0ICogICBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIHByb3RvY29sIHNlcGFyYXRvciAoJzonKS5cblx0ICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBVUkwgbWF0Y2ggZG9lcyBub3QgaGF2ZSBhdCBsZWFzdCBvbmUgd29yZFxuXHQgKiAgIGNoYXJhY3RlciBpbiBpdCBhZnRlciB0aGUgcHJvdG9jb2wsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuXHQgKi9cblx0dXJsTWF0Y2hEb2VzTm90SGF2ZUF0TGVhc3RPbmVXb3JkQ2hhciA6IGZ1bmN0aW9uKCB1cmxNYXRjaCwgcHJvdG9jb2xVcmxNYXRjaCApIHtcblx0XHRpZiggdXJsTWF0Y2ggJiYgcHJvdG9jb2xVcmxNYXRjaCApIHtcblx0XHRcdHJldHVybiAhdGhpcy5oYXNXb3JkQ2hhckFmdGVyUHJvdG9jb2xSZWdleC50ZXN0KCB1cmxNYXRjaCApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cbn07XG5cbi8qZ2xvYmFsIEF1dG9saW5rZXIgKi9cbi8qKlxuICogQSB0cnVuY2F0aW9uIGZlYXR1cmUgd2hlcmUgdGhlIGVsbGlwc2lzIHdpbGwgYmUgcGxhY2VkIGF0IHRoZSBlbmQgb2YgdGhlIFVSTC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYW5jaG9yVGV4dFxuICogQHBhcmFtIHtOdW1iZXJ9IHRydW5jYXRlTGVuIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgdHJ1bmNhdGVkIG91dHB1dCBVUkwgc3RyaW5nLlxuICogQHBhcmFtIHtTdHJpbmd9IGVsbGlwc2lzQ2hhcnMgVGhlIGNoYXJhY3RlcnMgdG8gcGxhY2Ugd2l0aGluIHRoZSB1cmwsIGUuZy4gXCIuLlwiLlxuICogQHJldHVybiB7U3RyaW5nfSBUaGUgdHJ1bmNhdGVkIFVSTC5cbiAqL1xuQXV0b2xpbmtlci50cnVuY2F0ZS5UcnVuY2F0ZUVuZCA9IGZ1bmN0aW9uKGFuY2hvclRleHQsIHRydW5jYXRlTGVuLCBlbGxpcHNpc0NoYXJzKXtcblx0cmV0dXJuIEF1dG9saW5rZXIuVXRpbC5lbGxpcHNpcyggYW5jaG9yVGV4dCwgdHJ1bmNhdGVMZW4sIGVsbGlwc2lzQ2hhcnMgKTtcbn07XG5cbi8qZ2xvYmFsIEF1dG9saW5rZXIgKi9cbi8qKlxuICogRGF0ZTogMjAxNS0xMC0wNVxuICogQXV0aG9yOiBLYXNwZXIgU8O4ZnJlbiA8c29lZnJpdHpAZ21haWwuY29tPiAoaHR0cHM6Ly9naXRodWIuY29tL2thZm9zbylcbiAqXG4gKiBBIHRydW5jYXRpb24gZmVhdHVyZSwgd2hlcmUgdGhlIGVsbGlwc2lzIHdpbGwgYmUgcGxhY2VkIGluIHRoZSBkZWFkLWNlbnRlciBvZiB0aGUgVVJMLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgICAgICAgICAgICAgQSBVUkwuXG4gKiBAcGFyYW0ge051bWJlcn0gdHJ1bmNhdGVMZW4gICAgIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgdHJ1bmNhdGVkIG91dHB1dCBVUkwgc3RyaW5nLlxuICogQHBhcmFtIHtTdHJpbmd9IGVsbGlwc2lzQ2hhcnMgICBUaGUgY2hhcmFjdGVycyB0byBwbGFjZSB3aXRoaW4gdGhlIHVybCwgZS5nLiBcIi4uXCIuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSB0cnVuY2F0ZWQgVVJMLlxuICovXG5BdXRvbGlua2VyLnRydW5jYXRlLlRydW5jYXRlTWlkZGxlID0gZnVuY3Rpb24odXJsLCB0cnVuY2F0ZUxlbiwgZWxsaXBzaXNDaGFycyl7XG4gIGlmICh1cmwubGVuZ3RoIDw9IHRydW5jYXRlTGVuKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIHZhciBlbGxpcHNpc0xlbmd0aEJlZm9yZVBhcnNpbmc7XG4gIHZhciBlbGxpcHNpc0xlbmd0aDtcblxuICBpZihlbGxpcHNpc0NoYXJzID09IG51bGwpIHtcbiAgICBlbGxpcHNpc0NoYXJzID0gJyZoZWxsaXA7JztcbiAgICBlbGxpcHNpc0xlbmd0aEJlZm9yZVBhcnNpbmcgPSA4O1xuICAgIGVsbGlwc2lzTGVuZ3RoID0gMztcbiAgfSBlbHNlIHtcbiAgICBlbGxpcHNpc0xlbmd0aEJlZm9yZVBhcnNpbmcgPSBlbGxpcHNpc0NoYXJzLmxlbmd0aDtcbiAgICBlbGxpcHNpc0xlbmd0aCA9IGVsbGlwc2lzQ2hhcnMubGVuZ3RoO1xuICB9XG5cbiAgdmFyIGF2YWlsYWJsZUxlbmd0aCA9IHRydW5jYXRlTGVuIC0gZWxsaXBzaXNMZW5ndGg7XG4gIHZhciBlbmQgPSBcIlwiO1xuICBpZiAoYXZhaWxhYmxlTGVuZ3RoID4gMCkge1xuICAgIGVuZCA9IHVybC5zdWJzdHIoKC0xKSpNYXRoLmZsb29yKGF2YWlsYWJsZUxlbmd0aC8yKSk7XG4gIH1cbiAgcmV0dXJuICh1cmwuc3Vic3RyKDAsIE1hdGguY2VpbChhdmFpbGFibGVMZW5ndGgvMikpICsgZWxsaXBzaXNDaGFycyArIGVuZCkuc3Vic3RyKDAsIGF2YWlsYWJsZUxlbmd0aCArIGVsbGlwc2lzTGVuZ3RoQmVmb3JlUGFyc2luZyk7XG59O1xuXG4vKmdsb2JhbCBBdXRvbGlua2VyICovXG4vKipcbiAqIERhdGU6IDIwMTUtMTAtMDVcbiAqIEF1dGhvcjogS2FzcGVyIFPDuGZyZW4gPHNvZWZyaXR6QGdtYWlsLmNvbT4gKGh0dHBzOi8vZ2l0aHViLmNvbS9rYWZvc28pXG4gKlxuICogQSB0cnVuY2F0aW9uIGZlYXR1cmUsIHdoZXJlIHRoZSBlbGxpcHNpcyB3aWxsIGJlIHBsYWNlZCBhdCBhIHNlY3Rpb24gd2l0aGluXG4gKiB0aGUgVVJMIG1ha2luZyBpdCBzdGlsbCBzb21ld2hhdCBodW1hbiByZWFkYWJsZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXHRcdFx0XHRcdFx0IEEgVVJMLlxuICogQHBhcmFtIHtOdW1iZXJ9IHRydW5jYXRlTGVuXHRcdCBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHRydW5jYXRlZCBvdXRwdXQgVVJMIHN0cmluZy5cbiAqIEBwYXJhbSB7U3RyaW5nfSBlbGxpcHNpc0NoYXJzXHQgVGhlIGNoYXJhY3RlcnMgdG8gcGxhY2Ugd2l0aGluIHRoZSB1cmwsIGUuZy4gXCIuLi5cIi5cbiAqIEByZXR1cm4ge1N0cmluZ30gVGhlIHRydW5jYXRlZCBVUkwuXG4gKi9cbkF1dG9saW5rZXIudHJ1bmNhdGUuVHJ1bmNhdGVTbWFydCA9IGZ1bmN0aW9uKHVybCwgdHJ1bmNhdGVMZW4sIGVsbGlwc2lzQ2hhcnMpe1xuXG5cdHZhciBlbGxpcHNpc0xlbmd0aEJlZm9yZVBhcnNpbmc7XG5cdHZhciBlbGxpcHNpc0xlbmd0aDtcblxuXHRpZihlbGxpcHNpc0NoYXJzID09IG51bGwpIHtcblx0XHRlbGxpcHNpc0NoYXJzID0gJyZoZWxsaXA7Jztcblx0XHRlbGxpcHNpc0xlbmd0aCA9IDM7XG5cdFx0ZWxsaXBzaXNMZW5ndGhCZWZvcmVQYXJzaW5nID0gODtcblx0fSBlbHNlIHtcblx0XHRlbGxpcHNpc0xlbmd0aCA9IGVsbGlwc2lzQ2hhcnMubGVuZ3RoO1xuXHRcdGVsbGlwc2lzTGVuZ3RoQmVmb3JlUGFyc2luZyA9IGVsbGlwc2lzQ2hhcnMubGVuZ3RoO1xuXHR9XG5cblx0dmFyIHBhcnNlX3VybCA9IGZ1bmN0aW9uKHVybCl7IC8vIEZ1bmN0aW9uYWxpdHkgaW5zcGlyZWQgYnkgUEhQIGZ1bmN0aW9uIG9mIHNhbWUgbmFtZVxuXHRcdHZhciB1cmxPYmogPSB7fTtcblx0XHR2YXIgdXJsU3ViID0gdXJsO1xuXHRcdHZhciBtYXRjaCA9IHVybFN1Yi5tYXRjaCgvXihbYS16XSspOlxcL1xcLy9pKTtcblx0XHRpZiAobWF0Y2gpIHtcblx0XHRcdHVybE9iai5zY2hlbWUgPSBtYXRjaFsxXTtcblx0XHRcdHVybFN1YiA9IHVybFN1Yi5zdWJzdHIobWF0Y2hbMF0ubGVuZ3RoKTtcblx0XHR9XG5cdFx0bWF0Y2ggPSB1cmxTdWIubWF0Y2goL14oLio/KSg/PShcXD98I3xcXC98JCkpL2kpO1xuXHRcdGlmIChtYXRjaCkge1xuXHRcdFx0dXJsT2JqLmhvc3QgPSBtYXRjaFsxXTtcblx0XHRcdHVybFN1YiA9IHVybFN1Yi5zdWJzdHIobWF0Y2hbMF0ubGVuZ3RoKTtcblx0XHR9XG5cdFx0bWF0Y2ggPSB1cmxTdWIubWF0Y2goL15cXC8oLio/KSg/PShcXD98I3wkKSkvaSk7XG5cdFx0aWYgKG1hdGNoKSB7XG5cdFx0XHR1cmxPYmoucGF0aCA9IG1hdGNoWzFdO1xuXHRcdFx0dXJsU3ViID0gdXJsU3ViLnN1YnN0cihtYXRjaFswXS5sZW5ndGgpO1xuXHRcdH1cblx0XHRtYXRjaCA9IHVybFN1Yi5tYXRjaCgvXlxcPyguKj8pKD89KCN8JCkpL2kpO1xuXHRcdGlmIChtYXRjaCkge1xuXHRcdFx0dXJsT2JqLnF1ZXJ5ID0gbWF0Y2hbMV07XG5cdFx0XHR1cmxTdWIgPSB1cmxTdWIuc3Vic3RyKG1hdGNoWzBdLmxlbmd0aCk7XG5cdFx0fVxuXHRcdG1hdGNoID0gdXJsU3ViLm1hdGNoKC9eIyguKj8pJC9pKTtcblx0XHRpZiAobWF0Y2gpIHtcblx0XHRcdHVybE9iai5mcmFnbWVudCA9IG1hdGNoWzFdO1xuXHRcdFx0Ly91cmxTdWIgPSB1cmxTdWIuc3Vic3RyKG1hdGNoWzBdLmxlbmd0aCk7ICAtLSBub3QgdXNlZC4gVW5jb21tZW50IGlmIGFkZGluZyBhbm90aGVyIGJsb2NrLlxuXHRcdH1cblx0XHRyZXR1cm4gdXJsT2JqO1xuXHR9O1xuXG5cdHZhciBidWlsZFVybCA9IGZ1bmN0aW9uKHVybE9iail7XG5cdFx0dmFyIHVybCA9IFwiXCI7XG5cdFx0aWYgKHVybE9iai5zY2hlbWUgJiYgdXJsT2JqLmhvc3QpIHtcblx0XHRcdHVybCArPSB1cmxPYmouc2NoZW1lICsgXCI6Ly9cIjtcblx0XHR9XG5cdFx0aWYgKHVybE9iai5ob3N0KSB7XG5cdFx0XHR1cmwgKz0gdXJsT2JqLmhvc3Q7XG5cdFx0fVxuXHRcdGlmICh1cmxPYmoucGF0aCkge1xuXHRcdFx0dXJsICs9IFwiL1wiICsgdXJsT2JqLnBhdGg7XG5cdFx0fVxuXHRcdGlmICh1cmxPYmoucXVlcnkpIHtcblx0XHRcdHVybCArPSBcIj9cIiArIHVybE9iai5xdWVyeTtcblx0XHR9XG5cdFx0aWYgKHVybE9iai5mcmFnbWVudCkge1xuXHRcdFx0dXJsICs9IFwiI1wiICsgdXJsT2JqLmZyYWdtZW50O1xuXHRcdH1cblx0XHRyZXR1cm4gdXJsO1xuXHR9O1xuXG5cdHZhciBidWlsZFNlZ21lbnQgPSBmdW5jdGlvbihzZWdtZW50LCByZW1haW5pbmdBdmFpbGFibGVMZW5ndGgpe1xuXHRcdHZhciByZW1haW5pbmdBdmFpbGFibGVMZW5ndGhIYWxmID0gcmVtYWluaW5nQXZhaWxhYmxlTGVuZ3RoLyAyLFxuXHRcdFx0XHRzdGFydE9mZnNldCA9IE1hdGguY2VpbChyZW1haW5pbmdBdmFpbGFibGVMZW5ndGhIYWxmKSxcblx0XHRcdFx0ZW5kT2Zmc2V0ID0gKC0xKSpNYXRoLmZsb29yKHJlbWFpbmluZ0F2YWlsYWJsZUxlbmd0aEhhbGYpLFxuXHRcdFx0XHRlbmQgPSBcIlwiO1xuXHRcdGlmIChlbmRPZmZzZXQgPCAwKSB7XG5cdFx0XHRlbmQgPSBzZWdtZW50LnN1YnN0cihlbmRPZmZzZXQpO1xuXHRcdH1cblx0XHRyZXR1cm4gc2VnbWVudC5zdWJzdHIoMCwgc3RhcnRPZmZzZXQpICsgZWxsaXBzaXNDaGFycyArIGVuZDtcblx0fTtcblx0aWYgKHVybC5sZW5ndGggPD0gdHJ1bmNhdGVMZW4pIHtcblx0XHRyZXR1cm4gdXJsO1xuXHR9XG5cdHZhciBhdmFpbGFibGVMZW5ndGggPSB0cnVuY2F0ZUxlbiAtIGVsbGlwc2lzTGVuZ3RoO1xuXHR2YXIgdXJsT2JqID0gcGFyc2VfdXJsKHVybCk7XG5cdC8vIENsZWFuIHVwIHRoZSBVUkxcblx0aWYgKHVybE9iai5xdWVyeSkge1xuXHRcdHZhciBtYXRjaFF1ZXJ5ID0gdXJsT2JqLnF1ZXJ5Lm1hdGNoKC9eKC4qPykoPz0oXFw/fFxcIykpKC4qPykkL2kpO1xuXHRcdGlmIChtYXRjaFF1ZXJ5KSB7XG5cdFx0XHQvLyBNYWxmb3JtZWQgVVJMOyB0d28gb3IgbW9yZSBcIj9cIi4gUmVtb3ZlZCBhbnkgY29udGVudCBiZWhpbmQgdGhlIDJuZC5cblx0XHRcdHVybE9iai5xdWVyeSA9IHVybE9iai5xdWVyeS5zdWJzdHIoMCwgbWF0Y2hRdWVyeVsxXS5sZW5ndGgpO1xuXHRcdFx0dXJsID0gYnVpbGRVcmwodXJsT2JqKTtcblx0XHR9XG5cdH1cblx0aWYgKHVybC5sZW5ndGggPD0gdHJ1bmNhdGVMZW4pIHtcblx0XHRyZXR1cm4gdXJsO1xuXHR9XG5cdGlmICh1cmxPYmouaG9zdCkge1xuXHRcdHVybE9iai5ob3N0ID0gdXJsT2JqLmhvc3QucmVwbGFjZSgvXnd3d1xcLi8sIFwiXCIpO1xuXHRcdHVybCA9IGJ1aWxkVXJsKHVybE9iaik7XG5cdH1cblx0aWYgKHVybC5sZW5ndGggPD0gdHJ1bmNhdGVMZW4pIHtcblx0XHRyZXR1cm4gdXJsO1xuXHR9XG5cdC8vIFByb2Nlc3MgYW5kIGJ1aWxkIHRoZSBVUkxcblx0dmFyIHN0ciA9IFwiXCI7XG5cdGlmICh1cmxPYmouaG9zdCkge1xuXHRcdHN0ciArPSB1cmxPYmouaG9zdDtcblx0fVxuXHRpZiAoc3RyLmxlbmd0aCA+PSBhdmFpbGFibGVMZW5ndGgpIHtcblx0XHRpZiAodXJsT2JqLmhvc3QubGVuZ3RoID09IHRydW5jYXRlTGVuKSB7XG5cdFx0XHRyZXR1cm4gKHVybE9iai5ob3N0LnN1YnN0cigwLCAodHJ1bmNhdGVMZW4gLSBlbGxpcHNpc0xlbmd0aCkpICsgZWxsaXBzaXNDaGFycykuc3Vic3RyKDAsIGF2YWlsYWJsZUxlbmd0aCArIGVsbGlwc2lzTGVuZ3RoQmVmb3JlUGFyc2luZyk7XG5cdFx0fVxuXHRcdHJldHVybiBidWlsZFNlZ21lbnQoc3RyLCBhdmFpbGFibGVMZW5ndGgpLnN1YnN0cigwLCBhdmFpbGFibGVMZW5ndGggKyBlbGxpcHNpc0xlbmd0aEJlZm9yZVBhcnNpbmcpO1xuXHR9XG5cdHZhciBwYXRoQW5kUXVlcnkgPSBcIlwiO1xuXHRpZiAodXJsT2JqLnBhdGgpIHtcblx0XHRwYXRoQW5kUXVlcnkgKz0gXCIvXCIgKyB1cmxPYmoucGF0aDtcblx0fVxuXHRpZiAodXJsT2JqLnF1ZXJ5KSB7XG5cdFx0cGF0aEFuZFF1ZXJ5ICs9IFwiP1wiICsgdXJsT2JqLnF1ZXJ5O1xuXHR9XG5cdGlmIChwYXRoQW5kUXVlcnkpIHtcblx0XHRpZiAoKHN0citwYXRoQW5kUXVlcnkpLmxlbmd0aCA+PSBhdmFpbGFibGVMZW5ndGgpIHtcblx0XHRcdGlmICgoc3RyK3BhdGhBbmRRdWVyeSkubGVuZ3RoID09IHRydW5jYXRlTGVuKSB7XG5cdFx0XHRcdHJldHVybiAoc3RyICsgcGF0aEFuZFF1ZXJ5KS5zdWJzdHIoMCwgdHJ1bmNhdGVMZW4pO1xuXHRcdFx0fVxuXHRcdFx0dmFyIHJlbWFpbmluZ0F2YWlsYWJsZUxlbmd0aCA9IGF2YWlsYWJsZUxlbmd0aCAtIHN0ci5sZW5ndGg7XG5cdFx0XHRyZXR1cm4gKHN0ciArIGJ1aWxkU2VnbWVudChwYXRoQW5kUXVlcnksIHJlbWFpbmluZ0F2YWlsYWJsZUxlbmd0aCkpLnN1YnN0cigwLCBhdmFpbGFibGVMZW5ndGggKyBlbGxpcHNpc0xlbmd0aEJlZm9yZVBhcnNpbmcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzdHIgKz0gcGF0aEFuZFF1ZXJ5O1xuXHRcdH1cblx0fVxuXHRpZiAodXJsT2JqLmZyYWdtZW50KSB7XG5cdFx0dmFyIGZyYWdtZW50ID0gXCIjXCIrdXJsT2JqLmZyYWdtZW50O1xuXHRcdGlmICgoc3RyK2ZyYWdtZW50KS5sZW5ndGggPj0gYXZhaWxhYmxlTGVuZ3RoKSB7XG5cdFx0XHRpZiAoKHN0citmcmFnbWVudCkubGVuZ3RoID09IHRydW5jYXRlTGVuKSB7XG5cdFx0XHRcdHJldHVybiAoc3RyICsgZnJhZ21lbnQpLnN1YnN0cigwLCB0cnVuY2F0ZUxlbik7XG5cdFx0XHR9XG5cdFx0XHR2YXIgcmVtYWluaW5nQXZhaWxhYmxlTGVuZ3RoMiA9IGF2YWlsYWJsZUxlbmd0aCAtIHN0ci5sZW5ndGg7XG5cdFx0XHRyZXR1cm4gKHN0ciArIGJ1aWxkU2VnbWVudChmcmFnbWVudCwgcmVtYWluaW5nQXZhaWxhYmxlTGVuZ3RoMikpLnN1YnN0cigwLCBhdmFpbGFibGVMZW5ndGggKyBlbGxpcHNpc0xlbmd0aEJlZm9yZVBhcnNpbmcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzdHIgKz0gZnJhZ21lbnQ7XG5cdFx0fVxuXHR9XG5cdGlmICh1cmxPYmouc2NoZW1lICYmIHVybE9iai5ob3N0KSB7XG5cdFx0dmFyIHNjaGVtZSA9IHVybE9iai5zY2hlbWUgKyBcIjovL1wiO1xuXHRcdGlmICgoc3RyK3NjaGVtZSkubGVuZ3RoIDwgYXZhaWxhYmxlTGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gKHNjaGVtZSArIHN0cikuc3Vic3RyKDAsIHRydW5jYXRlTGVuKTtcblx0XHR9XG5cdH1cblx0aWYgKHN0ci5sZW5ndGggPD0gdHJ1bmNhdGVMZW4pIHtcblx0XHRyZXR1cm4gc3RyO1xuXHR9XG5cdHZhciBlbmQgPSBcIlwiO1xuXHRpZiAoYXZhaWxhYmxlTGVuZ3RoID4gMCkge1xuXHRcdGVuZCA9IHN0ci5zdWJzdHIoKC0xKSpNYXRoLmZsb29yKGF2YWlsYWJsZUxlbmd0aC8yKSk7XG5cdH1cblx0cmV0dXJuIChzdHIuc3Vic3RyKDAsIE1hdGguY2VpbChhdmFpbGFibGVMZW5ndGgvMikpICsgZWxsaXBzaXNDaGFycyArIGVuZCkuc3Vic3RyKDAsIGF2YWlsYWJsZUxlbmd0aCArIGVsbGlwc2lzTGVuZ3RoQmVmb3JlUGFyc2luZyk7XG59O1xuXG5yZXR1cm4gQXV0b2xpbmtlcjtcbn0pKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9hdXRvbGlua2VyL2Rpc3QvQXV0b2xpbmtlci5qc1xuLy8gbW9kdWxlIGlkID0gNTU2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 557 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _extends = Object.assign || function (target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i];for (var key in source) {if (Object.prototype.hasOwnProperty.call(source, key)) {target[key] = source[key];}}}return target;};var _react = __webpack_require__(174);var _react2 = _interopRequireDefault(_react);\nvar _emojiMart = __webpack_require__(433);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\n\nNewMessage = function (_Component) {_inherits(NewMessage, _Component);\n  function NewMessage(props) {_classCallCheck(this, NewMessage);var _this = _possibleConstructorReturn(this, (NewMessage.__proto__ || Object.getPrototypeOf(NewMessage)).call(this,\n    props));_this.\n\n\n\n\n\n\n    toggleEmojiPicker = function () {\n      _this.setState({ showEmojiPicker: !_this.state.showEmojiPicker });\n    };_this.\n\n    handleClick = function (emoji, event) {var\n      messageText = _this.props.messageText;\n      _this.props.handleChange({ target: {\n          value: messageText + emoji.colons } });\n\n\n      _this.setState({ showEmojiPicker: false });\n      _this.props.focusMessageInput();\n    };_this.\n\n    render = function () {\n      return (\n        _react2.default.createElement('div', { className: 'new-message-area' },\n          _react2.default.createElement(_emojiMart.Picker, { set: 'emojione',\n            onClick: _this.handleClick,\n            style: {\n              display: _this.state.showEmojiPicker ? 'block' : 'none',\n              maxWidth: '100%' },\n\n            emoji: 'upside_down_face',\n            title: 'Emoji' }),\n\n          _react2.default.createElement('div', { className: 'extra-message-options' },\n            _react2.default.createElement('span', { className: 'emoji-picker-button', onClick: _this.toggleEmojiPicker }, _react2.default.createElement(_emojiMart.Emoji, { size: 24, emoji: 'upside_down_face' }))),\n\n          _react2.default.createElement('textarea', _extends({ value: _this.props.messageText,\n            onChange: _this.props.handleChange },\n          _this.props.textAreaProps))));\n\n\n\n    };_this.state = { showEmojiPicker: false };return _this;}return NewMessage;}(_react.Component);\n\n\nNewMessage.propTypes = {\n  messageText: _react.PropTypes.string,\n  handleChange: _react.PropTypes.func,\n  focusMessageInput: _react.PropTypes.func,\n  textAreaProps: _react.PropTypes.shape({\n    className: _react.PropTypes.string,\n    ref: _react.PropTypes.func,\n    placeholder: _react.PropTypes.string,\n    onKeyUp: _react.PropTypes.func,\n    onFocus: _react.PropTypes.func,\n    onBlur: _react.PropTypes.func }) };exports.default =\n\n\n\nNewMessage;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU3LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvY29tcG9uZW50cy9NYXBDaGF0L05ld01lc3NhZ2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IFByb3BUeXBlcywgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBFbW9qaSwgUGlja2VyIH0gZnJvbSAnZW1vamktbWFydCdcblxuY2xhc3MgTmV3TWVzc2FnZSBleHRlbmRzIENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgc2hvd0Vtb2ppUGlja2VyOiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZUVtb2ppUGlja2VyID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBzaG93RW1vamlQaWNrZXI6ICF0aGlzLnN0YXRlLnNob3dFbW9qaVBpY2tlciB9KVxuICB9XG5cbiAgaGFuZGxlQ2xpY2sgPSAoZW1vamksIGV2ZW50KSA9PiB7XG4gICAgY29uc3QgeyBtZXNzYWdlVGV4dCB9ID0gdGhpcy5wcm9wc1xuICAgIHRoaXMucHJvcHMuaGFuZGxlQ2hhbmdlKHsgdGFyZ2V0OiB7XG4gICAgICB2YWx1ZTogbWVzc2FnZVRleHQgKyBlbW9qaS5jb2xvbnNcbiAgICB9fSlcblxuICAgIHRoaXMuc2V0U3RhdGUoeyBzaG93RW1vamlQaWNrZXI6IGZhbHNlIH0pXG4gICAgdGhpcy5wcm9wcy5mb2N1c01lc3NhZ2VJbnB1dCgpXG4gIH1cblxuICByZW5kZXIgPSAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibmV3LW1lc3NhZ2UtYXJlYVwiPlxuICAgICAgICA8UGlja2VyIHNldD1cImVtb2ppb25lXCJcbiAgICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZUNsaWNrfVxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBkaXNwbGF5OiB0aGlzLnN0YXRlLnNob3dFbW9qaVBpY2tlciA/ICdibG9jaycgOiAnbm9uZScsXG4gICAgICAgICAgICBtYXhXaWR0aDogJzEwMCUnXG4gICAgICAgICAgfX1cbiAgICAgICAgICBlbW9qaT1cInVwc2lkZV9kb3duX2ZhY2VcIlxuICAgICAgICAgIHRpdGxlPVwiRW1vamlcIlxuICAgICAgICAvPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImV4dHJhLW1lc3NhZ2Utb3B0aW9uc1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImVtb2ppLXBpY2tlci1idXR0b25cIiBvbkNsaWNrPXt0aGlzLnRvZ2dsZUVtb2ppUGlja2VyfT48RW1vamkgc2l6ZT17MjR9IGVtb2ppPVwidXBzaWRlX2Rvd25fZmFjZVwiIC8+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHRleHRhcmVhIHZhbHVlPXt0aGlzLnByb3BzLm1lc3NhZ2VUZXh0fVxuICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLnByb3BzLmhhbmRsZUNoYW5nZX1cbiAgICAgICAgICB7Li4udGhpcy5wcm9wcy50ZXh0QXJlYVByb3BzfVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG59XG5cbk5ld01lc3NhZ2UucHJvcFR5cGVzID0ge1xuICBtZXNzYWdlVGV4dDogUHJvcFR5cGVzLnN0cmluZyxcbiAgaGFuZGxlQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgZm9jdXNNZXNzYWdlSW5wdXQ6IFByb3BUeXBlcy5mdW5jLFxuICB0ZXh0QXJlYVByb3BzOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICByZWY6IFByb3BUeXBlcy5mdW5jLFxuICAgIHBsYWNlaG9sZGVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIG9uS2V5VXA6IFByb3BUeXBlcy5mdW5jLFxuICAgIG9uRm9jdXM6IFByb3BUeXBlcy5mdW5jLFxuICAgIG9uQmx1cjogUHJvcFR5cGVzLmZ1bmNcbiAgfSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgTmV3TWVzc2FnZVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9jb21wb25lbnRzL01hcENoYXQvTmV3TWVzc2FnZS5qcyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 558 */
/***/ function(module, exports) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true }); /* global $ */\n\nvar Private = {\n  addControls: function addControls() {\n    var self = this;\n\n    this.$audioControl = $('<div class=\"video-audio\"></div>');\n    this.$videoControl = $('<div class=\"video-video\"></div>');\n\n    this.$audioControl.on('click', function () {\n      Handlers.audioControlClick.call(self);\n    });\n\n    this.$videoControl.on('click', function () {\n      Handlers.videoControlClick.call(self);\n    });\n\n    this.$container.append(this.$audioControl);\n    this.$container.append(this.$videoControl);\n  },\n  cancelClick: function cancelClick() {\n    this.mouseIsDown = false;\n\n    if (this.hasMoved) {\n\n    }\n\n    $(document).trigger(VideoView.events.dragEnd);\n  } };\n\n\nvar Handlers = {\n  mousedown: function mousedown(event) {\n    this.mouseIsDown = true;\n    this.hasMoved = false;\n    this.mouseMoveStart = {\n      x: event.pageX,\n      y: event.pageY };\n\n    this.posStart = {\n      x: parseInt(this.$container.css('left'), '10'),\n      y: parseInt(this.$container.css('top'), '10') };\n\n\n    $(document).trigger(VideoView.events.mousedown);\n  },\n  mouseup: function mouseup(event) {\n    $(document).trigger(VideoView.events.mouseup, [this]);\n\n    var storedTime = this.lastClick;\n    var now = Date.now();\n    this.lastClick = now;\n\n    if (now - storedTime < this.config.DOUBLE_CLICK_TOLERANCE) {\n      $(document).trigger(VideoView.events.doubleClick, [this]);\n    }\n  },\n  mousemove: function mousemove(event) {\n    var\n    diffX,\n    diffY,\n    newX,\n    newY;\n\n    if (this.$parent && this.mouseIsDown) {\n      this.manuallyPositioned = true;\n      this.hasMoved = true;\n      diffX = event.pageX - this.mouseMoveStart.x;\n      diffY = this.mouseMoveStart.y - event.pageY;\n      newX = this.posStart.x + diffX;\n      newY = this.posStart.y - diffY;\n      this.$container.css({\n        top: newY,\n        left: newX });\n\n    }\n  },\n  audioControlClick: function audioControlClick() {\n    if (this.audioStatus) {\n      this.audioOff();\n    } else {\n      this.audioOn();\n    }\n    $(document).trigger(VideoView.events.audioControlClick, [this]);\n  },\n  videoControlClick: function videoControlClick() {\n    if (this.videoStatus) {\n      this.videoOff();\n    } else {\n      this.videoOn();\n    }\n    $(document).trigger(VideoView.events.videoControlClick, [this]);\n  } };\n\n\nvar VideoView = function VideoView(video, $parent, id, isMyself, config) {\n  var self = this;\n\n  this.$parent = $parent; // mapView\n\n  this.video = video;\n  this.id = id;\n\n  this.config = config;\n\n  this.mouseIsDown = false;\n  this.mouseDownOffset = { x: 0, y: 0 };\n  this.lastClick = null;\n  this.hasMoved = false;\n\n  this.audioStatus = true;\n  this.videoStatus = true;\n\n  this.$container = $('<div></div>');\n  this.$container.addClass('collaborator-video' + (isMyself ? ' my-video' : ''));\n  this.$container.attr('id', 'container_' + id);\n\n  var $vidContainer = $('<div></div>');\n  $vidContainer.addClass('video-cutoff');\n  $vidContainer.append(this.video);\n\n  this.avatar = config.avatar;\n  this.$avatar = $('<img draggable=\"false\" class=\"collaborator-video-avatar\" src=\"' + config.avatar + '\" width=\"150\" height=\"150\" />');\n  $vidContainer.append(this.$avatar);\n\n  this.$container.append($vidContainer);\n\n  this.$container.on('mousedown', function (event) {\n    Handlers.mousedown.call(self, event);\n  });\n\n  if (isMyself) {\n    Private.addControls.call(this);\n  }\n\n  // suppress contextmenu\n  this.video.oncontextmenu = function () {return false;};\n\n  if (this.$parent) this.setParent(this.$parent);\n};\n\nVideoView.prototype.setParent = function ($parent) {\n  var self = this;\n  this.$parent = $parent;\n  this.$parent.off('.video' + this.id);\n  this.$parent.on('mouseup.video' + this.id, function (event) {\n    Handlers.mouseup.call(self, event);\n    Private.cancelClick.call(self);\n  });\n  this.$parent.on('mousemove.video' + this.id, function (event) {\n    Handlers.mousemove.call(self, event);\n  });\n};\n\nVideoView.prototype.setAvatar = function (src) {\n  this.$avatar.attr('src', src);\n  this.avatar = src;\n};\n\nVideoView.prototype.remove = function () {\n  this.$container.off();\n  if (this.$parent) this.$parent.off('.video' + this.id);\n  this.$container.remove();\n};\n\nVideoView.prototype.videoOff = function () {\n  this.$videoControl.addClass('active');\n  this.$avatar.show();\n  this.videoStatus = false;\n};\n\nVideoView.prototype.videoOn = function () {\n  this.$videoControl.removeClass('active');\n  this.$avatar.hide();\n  this.videoStatus = true;\n};\n\nVideoView.prototype.audioOff = function () {\n  this.$audioControl.addClass('active');\n  this.audioStatus = false;\n};\n\nVideoView.prototype.audioOn = function () {\n  this.$audioControl.removeClass('active');\n  this.audioStatus = true;\n};\n\n/**\n    * @class\n    * @static\n    */\nVideoView.events = {\n  mousedown: 'VideoView:mousedown',\n  mouseup: 'VideoView:mouseup',\n  doubleClick: 'VideoView:doubleClick',\n  dragEnd: 'VideoView:dragEnd',\n  audioControlClick: 'VideoView:audioControlClick',\n  videoControlClick: 'VideoView:videoControlClick' };exports.default =\n\n\nVideoView;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU4LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvVmlld3MvVmlkZW9WaWV3LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGdsb2JhbCAkICovXG5cbnZhciBQcml2YXRlID0ge1xuICBhZGRDb250cm9sczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgICB0aGlzLiRhdWRpb0NvbnRyb2wgPSAkKCc8ZGl2IGNsYXNzPVwidmlkZW8tYXVkaW9cIj48L2Rpdj4nKVxuICAgIHRoaXMuJHZpZGVvQ29udHJvbCA9ICQoJzxkaXYgY2xhc3M9XCJ2aWRlby12aWRlb1wiPjwvZGl2PicpXG5cbiAgICB0aGlzLiRhdWRpb0NvbnRyb2wub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gICAgICBIYW5kbGVycy5hdWRpb0NvbnRyb2xDbGljay5jYWxsKHNlbGYpXG4gICAgfSlcblxuICAgIHRoaXMuJHZpZGVvQ29udHJvbC5vbignY2xpY2snLCBmdW5jdGlvbigpIHtcbiAgICAgIEhhbmRsZXJzLnZpZGVvQ29udHJvbENsaWNrLmNhbGwoc2VsZilcbiAgICB9KVxuXG4gICAgdGhpcy4kY29udGFpbmVyLmFwcGVuZCh0aGlzLiRhdWRpb0NvbnRyb2wpXG4gICAgdGhpcy4kY29udGFpbmVyLmFwcGVuZCh0aGlzLiR2aWRlb0NvbnRyb2wpXG4gIH0sXG4gIGNhbmNlbENsaWNrOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLm1vdXNlSXNEb3duID0gZmFsc2VcblxuICAgIGlmICh0aGlzLmhhc01vdmVkKSB7XG5cbiAgICB9XG5cbiAgICAkKGRvY3VtZW50KS50cmlnZ2VyKFZpZGVvVmlldy5ldmVudHMuZHJhZ0VuZClcbiAgfVxufVxuXG52YXIgSGFuZGxlcnMgPSB7XG4gIG1vdXNlZG93bjogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICB0aGlzLm1vdXNlSXNEb3duID0gdHJ1ZVxuICAgIHRoaXMuaGFzTW92ZWQgPSBmYWxzZVxuICAgIHRoaXMubW91c2VNb3ZlU3RhcnQgPSB7XG4gICAgICB4OiBldmVudC5wYWdlWCxcbiAgICAgIHk6IGV2ZW50LnBhZ2VZXG4gICAgfVxuICAgIHRoaXMucG9zU3RhcnQgPSB7XG4gICAgICB4OiBwYXJzZUludCh0aGlzLiRjb250YWluZXIuY3NzKCdsZWZ0JyksICcxMCcpLFxuICAgICAgeTogcGFyc2VJbnQodGhpcy4kY29udGFpbmVyLmNzcygndG9wJyksICcxMCcpXG4gICAgfVxuXG4gICAgJChkb2N1bWVudCkudHJpZ2dlcihWaWRlb1ZpZXcuZXZlbnRzLm1vdXNlZG93bilcbiAgfSxcbiAgbW91c2V1cDogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAkKGRvY3VtZW50KS50cmlnZ2VyKFZpZGVvVmlldy5ldmVudHMubW91c2V1cCwgW3RoaXNdKVxuXG4gICAgdmFyIHN0b3JlZFRpbWUgPSB0aGlzLmxhc3RDbGlja1xuICAgIHZhciBub3cgPSBEYXRlLm5vdygpXG4gICAgdGhpcy5sYXN0Q2xpY2sgPSBub3dcblxuICAgIGlmIChub3cgLSBzdG9yZWRUaW1lIDwgdGhpcy5jb25maWcuRE9VQkxFX0NMSUNLX1RPTEVSQU5DRSkge1xuICAgICAgJChkb2N1bWVudCkudHJpZ2dlcihWaWRlb1ZpZXcuZXZlbnRzLmRvdWJsZUNsaWNrLCBbdGhpc10pXG4gICAgfVxuICB9LFxuICBtb3VzZW1vdmU6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyXG4gICAgICBkaWZmWCxcbiAgICAgIGRpZmZZLFxuICAgICAgbmV3WCxcbiAgICAgIG5ld1lcblxuICAgIGlmICh0aGlzLiRwYXJlbnQgJiYgdGhpcy5tb3VzZUlzRG93bikge1xuICAgICAgdGhpcy5tYW51YWxseVBvc2l0aW9uZWQgPSB0cnVlXG4gICAgICB0aGlzLmhhc01vdmVkID0gdHJ1ZVxuICAgICAgZGlmZlggPSBldmVudC5wYWdlWCAtIHRoaXMubW91c2VNb3ZlU3RhcnQueFxuICAgICAgZGlmZlkgPSB0aGlzLm1vdXNlTW92ZVN0YXJ0LnkgLSBldmVudC5wYWdlWVxuICAgICAgbmV3WCA9IHRoaXMucG9zU3RhcnQueCArIGRpZmZYXG4gICAgICBuZXdZID0gdGhpcy5wb3NTdGFydC55IC0gZGlmZllcbiAgICAgIHRoaXMuJGNvbnRhaW5lci5jc3Moe1xuICAgICAgICB0b3A6IG5ld1ksXG4gICAgICAgIGxlZnQ6IG5ld1hcbiAgICAgIH0pXG4gICAgfVxuICB9LFxuICBhdWRpb0NvbnRyb2xDbGljazogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuYXVkaW9TdGF0dXMpIHtcbiAgICAgIHRoaXMuYXVkaW9PZmYoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmF1ZGlvT24oKVxuICAgIH1cbiAgICAkKGRvY3VtZW50KS50cmlnZ2VyKFZpZGVvVmlldy5ldmVudHMuYXVkaW9Db250cm9sQ2xpY2ssIFt0aGlzXSlcbiAgfSxcbiAgdmlkZW9Db250cm9sQ2xpY2s6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLnZpZGVvU3RhdHVzKSB7XG4gICAgICB0aGlzLnZpZGVvT2ZmKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52aWRlb09uKClcbiAgICB9XG4gICAgJChkb2N1bWVudCkudHJpZ2dlcihWaWRlb1ZpZXcuZXZlbnRzLnZpZGVvQ29udHJvbENsaWNrLCBbdGhpc10pXG4gIH1cbn1cblxudmFyIFZpZGVvVmlldyA9IGZ1bmN0aW9uKHZpZGVvLCAkcGFyZW50LCBpZCwgaXNNeXNlbGYsIGNvbmZpZykge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICB0aGlzLiRwYXJlbnQgPSAkcGFyZW50IC8vIG1hcFZpZXdcblxuICB0aGlzLnZpZGVvID0gdmlkZW9cbiAgdGhpcy5pZCA9IGlkXG5cbiAgdGhpcy5jb25maWcgPSBjb25maWdcblxuICB0aGlzLm1vdXNlSXNEb3duID0gZmFsc2VcbiAgdGhpcy5tb3VzZURvd25PZmZzZXQgPSB7IHg6IDAsIHk6IDAgfVxuICB0aGlzLmxhc3RDbGljayA9IG51bGxcbiAgdGhpcy5oYXNNb3ZlZCA9IGZhbHNlXG5cbiAgdGhpcy5hdWRpb1N0YXR1cyA9IHRydWVcbiAgdGhpcy52aWRlb1N0YXR1cyA9IHRydWVcblxuICB0aGlzLiRjb250YWluZXIgPSAkKCc8ZGl2PjwvZGl2PicpXG4gIHRoaXMuJGNvbnRhaW5lci5hZGRDbGFzcygnY29sbGFib3JhdG9yLXZpZGVvJyArIChpc015c2VsZiA/ICcgbXktdmlkZW8nIDogJycpKVxuICB0aGlzLiRjb250YWluZXIuYXR0cignaWQnLCAnY29udGFpbmVyXycgKyBpZClcblxuICB2YXIgJHZpZENvbnRhaW5lciA9ICQoJzxkaXY+PC9kaXY+JylcbiAgJHZpZENvbnRhaW5lci5hZGRDbGFzcygndmlkZW8tY3V0b2ZmJylcbiAgJHZpZENvbnRhaW5lci5hcHBlbmQodGhpcy52aWRlbylcblxuICB0aGlzLmF2YXRhciA9IGNvbmZpZy5hdmF0YXJcbiAgdGhpcy4kYXZhdGFyID0gJCgnPGltZyBkcmFnZ2FibGU9XCJmYWxzZVwiIGNsYXNzPVwiY29sbGFib3JhdG9yLXZpZGVvLWF2YXRhclwiIHNyYz1cIicgKyBjb25maWcuYXZhdGFyICsgJ1wiIHdpZHRoPVwiMTUwXCIgaGVpZ2h0PVwiMTUwXCIgLz4nKVxuICAkdmlkQ29udGFpbmVyLmFwcGVuZCh0aGlzLiRhdmF0YXIpXG5cbiAgdGhpcy4kY29udGFpbmVyLmFwcGVuZCgkdmlkQ29udGFpbmVyKVxuXG4gIHRoaXMuJGNvbnRhaW5lci5vbignbW91c2Vkb3duJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBIYW5kbGVycy5tb3VzZWRvd24uY2FsbChzZWxmLCBldmVudClcbiAgfSlcblxuICBpZiAoaXNNeXNlbGYpIHtcbiAgICBQcml2YXRlLmFkZENvbnRyb2xzLmNhbGwodGhpcylcbiAgfVxuXG4gICAgLy8gc3VwcHJlc3MgY29udGV4dG1lbnVcbiAgdGhpcy52aWRlby5vbmNvbnRleHRtZW51ID0gZnVuY3Rpb24oKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgaWYgKHRoaXMuJHBhcmVudCkgdGhpcy5zZXRQYXJlbnQodGhpcy4kcGFyZW50KVxufVxuXG5WaWRlb1ZpZXcucHJvdG90eXBlLnNldFBhcmVudCA9IGZ1bmN0aW9uKCRwYXJlbnQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHRoaXMuJHBhcmVudCA9ICRwYXJlbnRcbiAgdGhpcy4kcGFyZW50Lm9mZignLnZpZGVvJyArIHRoaXMuaWQpXG4gIHRoaXMuJHBhcmVudC5vbignbW91c2V1cC52aWRlbycgKyB0aGlzLmlkLCBmdW5jdGlvbihldmVudCkge1xuICAgIEhhbmRsZXJzLm1vdXNldXAuY2FsbChzZWxmLCBldmVudClcbiAgICBQcml2YXRlLmNhbmNlbENsaWNrLmNhbGwoc2VsZilcbiAgfSlcbiAgdGhpcy4kcGFyZW50Lm9uKCdtb3VzZW1vdmUudmlkZW8nICsgdGhpcy5pZCwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBIYW5kbGVycy5tb3VzZW1vdmUuY2FsbChzZWxmLCBldmVudClcbiAgfSlcbn1cblxuVmlkZW9WaWV3LnByb3RvdHlwZS5zZXRBdmF0YXIgPSBmdW5jdGlvbihzcmMpIHtcbiAgdGhpcy4kYXZhdGFyLmF0dHIoJ3NyYycsIHNyYylcbiAgdGhpcy5hdmF0YXIgPSBzcmNcbn1cblxuVmlkZW9WaWV3LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy4kY29udGFpbmVyLm9mZigpXG4gIGlmICh0aGlzLiRwYXJlbnQpIHRoaXMuJHBhcmVudC5vZmYoJy52aWRlbycgKyB0aGlzLmlkKVxuICB0aGlzLiRjb250YWluZXIucmVtb3ZlKClcbn1cblxuVmlkZW9WaWV3LnByb3RvdHlwZS52aWRlb09mZiA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLiR2aWRlb0NvbnRyb2wuYWRkQ2xhc3MoJ2FjdGl2ZScpXG4gIHRoaXMuJGF2YXRhci5zaG93KClcbiAgdGhpcy52aWRlb1N0YXR1cyA9IGZhbHNlXG59XG5cblZpZGVvVmlldy5wcm90b3R5cGUudmlkZW9PbiA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLiR2aWRlb0NvbnRyb2wucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpXG4gIHRoaXMuJGF2YXRhci5oaWRlKClcbiAgdGhpcy52aWRlb1N0YXR1cyA9IHRydWVcbn1cblxuVmlkZW9WaWV3LnByb3RvdHlwZS5hdWRpb09mZiA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLiRhdWRpb0NvbnRyb2wuYWRkQ2xhc3MoJ2FjdGl2ZScpXG4gIHRoaXMuYXVkaW9TdGF0dXMgPSBmYWxzZVxufVxuXG5WaWRlb1ZpZXcucHJvdG90eXBlLmF1ZGlvT24gPSBmdW5jdGlvbigpIHtcbiAgdGhpcy4kYXVkaW9Db250cm9sLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxuICB0aGlzLmF1ZGlvU3RhdHVzID0gdHJ1ZVxufVxuXG4vKipcbiAqIEBjbGFzc1xuICogQHN0YXRpY1xuICovXG5WaWRlb1ZpZXcuZXZlbnRzID0ge1xuICBtb3VzZWRvd246ICdWaWRlb1ZpZXc6bW91c2Vkb3duJyxcbiAgbW91c2V1cDogJ1ZpZGVvVmlldzptb3VzZXVwJyxcbiAgZG91YmxlQ2xpY2s6ICdWaWRlb1ZpZXc6ZG91YmxlQ2xpY2snLFxuICBkcmFnRW5kOiAnVmlkZW9WaWV3OmRyYWdFbmQnLFxuICBhdWRpb0NvbnRyb2xDbGljazogJ1ZpZGVvVmlldzphdWRpb0NvbnRyb2xDbGljaycsXG4gIHZpZGVvQ29udHJvbENsaWNrOiAnVmlkZW9WaWV3OnZpZGVvQ29udHJvbENsaWNrJ1xufVxuXG5leHBvcnQgZGVmYXVsdCBWaWRlb1ZpZXdcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBmcm9udGVuZC9zcmMvTWV0YW1hcHMvVmlld3MvVmlkZW9WaWV3LmpzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 559 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });\n\nvar _attachmediastream = __webpack_require__(489);var _attachmediastream2 = _interopRequireDefault(_attachmediastream);\n\nvar _Realtime = __webpack_require__(435);var _Realtime2 = _interopRequireDefault(_Realtime);\nvar _VideoView = __webpack_require__(558);var _VideoView2 = _interopRequireDefault(_VideoView);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}\n\nvar Room = function Room() {var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  this.isActiveRoom = false;\n  this.socket = opts.socket;\n  this.webrtc = opts.webrtc;\n  this.room = opts.room;\n  this.config = opts.config;\n  this.$myVideo = opts.$video;\n  this.myVideo = opts.myVideoView;\n  this.videos = {};\n  this.init();\n}; /* global $ */\n\nRoom.prototype.join = function (cb) {\n  this.isActiveRoom = true;\n  this.webrtc.joinRoom(this.room, cb);\n};\n\nRoom.prototype.leaveVideoOnly = function () {\n  for (var id in this.videos) {\n    this.removeVideo(id);\n  }\n  this.isActiveRoom = false;\n  this.webrtc.leaveRoom();\n  this.webrtc.stopLocalVideo();\n};\n\nRoom.prototype.leave = function () {\n  for (var id in this.videos) {\n    this.removeVideo(id);\n  }\n  this.isActiveRoom = false;\n  this.webrtc.leaveRoom();\n  this.webrtc.stopLocalVideo();\n};\n\nRoom.prototype.init = function () {\n  var self = this;\n\n  $(document).on(_VideoView2.default.events.audioControlClick, function (event, videoView) {\n    if (!videoView.audioStatus) self.webrtc.mute();else\n    if (videoView.audioStatus) self.webrtc.unmute();\n  });\n  $(document).on(_VideoView2.default.events.videoControlClick, function (event, videoView) {\n    if (!videoView.videoStatus) self.webrtc.pauseVideo();else\n    if (videoView.videoStatus) self.webrtc.resumeVideo();\n  });\n\n  this.webrtc.webrtc.off('peerStreamAdded');\n  this.webrtc.webrtc.off('peerStreamRemoved');\n  this.webrtc.on('peerStreamAdded', function (peer) {\n    var mapper = _Realtime2.default.mappersOnMap[peer.nick];\n    peer.avatar = mapper.image;\n    peer.username = mapper.name;\n    if (self.isActiveRoom) {\n      self.addVideo(peer);\n    }\n  });\n\n  this.webrtc.on('peerStreamRemoved', function (peer) {\n    if (self.isActiveRoom) {\n      self.removeVideo(peer);\n    }\n  });\n\n  this.webrtc.on('mute', function (data) {\n    var v = self.videos[data.id];\n    if (!v) return;\n\n    if (data.name === 'audio') {\n      v.audioStatus = false;\n    } else if (data.name === 'video') {\n      v.videoStatus = false;\n      v.$avatar.show();\n    }\n    if (!v.audioStatus && !v.videoStatus) v.$container.hide();\n  });\n  this.webrtc.on('unmute', function (data) {\n    var v = self.videos[data.id];\n    if (!v) return;\n\n    if (data.name === 'audio') {\n      v.audioStatus = true;\n    } else if (data.name === 'video') {\n      v.videoStatus = true;\n      v.$avatar.hide();\n    }\n    v.$container.show();\n  });\n};\n\nRoom.prototype.videoAdded = function (callback) {\n  this._videoAdded = callback;\n};\n\nRoom.prototype.addVideo = function (peer) {\n  var id = this.webrtc.getDomId(peer);\n  var video = (0, _attachmediastream2.default)(peer.stream);\n\n  var v = new _VideoView2.default(video, null, id, false, { DOUBLE_CLICK_TOLERANCE: 200, avatar: peer.avatar, username: peer.username });\n\n  this.videos[peer.id] = v;\n  if (this._videoAdded) this._videoAdded(v, peer.nick);\n};\n\nRoom.prototype.removeVideo = function (peer) {\n  var id = typeof peer === 'string' ? peer : peer.id;\n  if (this.videos[id]) {\n    this.videos[id].remove();\n    delete this.videos[id];\n  }\n};exports.default =\n\nRoom;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU5LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvVmlld3MvUm9vbS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBnbG9iYWwgJCAqL1xuXG5pbXBvcnQgYXR0YWNoTWVkaWFTdHJlYW0gZnJvbSAnYXR0YWNobWVkaWFzdHJlYW0nXG5cbmltcG9ydCBSZWFsdGltZSBmcm9tICcuLi9SZWFsdGltZSdcbmltcG9ydCBWaWRlb1ZpZXcgZnJvbSAnLi9WaWRlb1ZpZXcnXG5cbmNvbnN0IFJvb20gPSBmdW5jdGlvbihvcHRzID0ge30pIHtcbiAgdGhpcy5pc0FjdGl2ZVJvb20gPSBmYWxzZVxuICB0aGlzLnNvY2tldCA9IG9wdHMuc29ja2V0XG4gIHRoaXMud2VicnRjID0gb3B0cy53ZWJydGNcbiAgdGhpcy5yb29tID0gb3B0cy5yb29tXG4gIHRoaXMuY29uZmlnID0gb3B0cy5jb25maWdcbiAgdGhpcy4kbXlWaWRlbyA9IG9wdHMuJHZpZGVvXG4gIHRoaXMubXlWaWRlbyA9IG9wdHMubXlWaWRlb1ZpZXdcbiAgdGhpcy52aWRlb3MgPSB7fVxuICB0aGlzLmluaXQoKVxufVxuXG5Sb29tLnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24oY2IpIHtcbiAgdGhpcy5pc0FjdGl2ZVJvb20gPSB0cnVlXG4gIHRoaXMud2VicnRjLmpvaW5Sb29tKHRoaXMucm9vbSwgY2IpXG59XG5cblJvb20ucHJvdG90eXBlLmxlYXZlVmlkZW9Pbmx5ID0gZnVuY3Rpb24oKSB7XG4gIGZvciAodmFyIGlkIGluIHRoaXMudmlkZW9zKSB7XG4gICAgdGhpcy5yZW1vdmVWaWRlbyhpZClcbiAgfVxuICB0aGlzLmlzQWN0aXZlUm9vbSA9IGZhbHNlXG4gIHRoaXMud2VicnRjLmxlYXZlUm9vbSgpXG4gIHRoaXMud2VicnRjLnN0b3BMb2NhbFZpZGVvKClcbn1cblxuUm9vbS5wcm90b3R5cGUubGVhdmUgPSBmdW5jdGlvbigpIHtcbiAgZm9yICh2YXIgaWQgaW4gdGhpcy52aWRlb3MpIHtcbiAgICB0aGlzLnJlbW92ZVZpZGVvKGlkKVxuICB9XG4gIHRoaXMuaXNBY3RpdmVSb29tID0gZmFsc2VcbiAgdGhpcy53ZWJydGMubGVhdmVSb29tKClcbiAgdGhpcy53ZWJydGMuc3RvcExvY2FsVmlkZW8oKVxufVxuXG5Sb29tLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuXG4gICQoZG9jdW1lbnQpLm9uKFZpZGVvVmlldy5ldmVudHMuYXVkaW9Db250cm9sQ2xpY2ssIGZ1bmN0aW9uKGV2ZW50LCB2aWRlb1ZpZXcpIHtcbiAgICBpZiAoIXZpZGVvVmlldy5hdWRpb1N0YXR1cykgc2VsZi53ZWJydGMubXV0ZSgpXG4gICAgZWxzZSBpZiAodmlkZW9WaWV3LmF1ZGlvU3RhdHVzKSBzZWxmLndlYnJ0Yy51bm11dGUoKVxuICB9KVxuICAkKGRvY3VtZW50KS5vbihWaWRlb1ZpZXcuZXZlbnRzLnZpZGVvQ29udHJvbENsaWNrLCBmdW5jdGlvbihldmVudCwgdmlkZW9WaWV3KSB7XG4gICAgaWYgKCF2aWRlb1ZpZXcudmlkZW9TdGF0dXMpIHNlbGYud2VicnRjLnBhdXNlVmlkZW8oKVxuICAgIGVsc2UgaWYgKHZpZGVvVmlldy52aWRlb1N0YXR1cykgc2VsZi53ZWJydGMucmVzdW1lVmlkZW8oKVxuICB9KVxuXG4gIHRoaXMud2VicnRjLndlYnJ0Yy5vZmYoJ3BlZXJTdHJlYW1BZGRlZCcpXG4gIHRoaXMud2VicnRjLndlYnJ0Yy5vZmYoJ3BlZXJTdHJlYW1SZW1vdmVkJylcbiAgdGhpcy53ZWJydGMub24oJ3BlZXJTdHJlYW1BZGRlZCcsIGZ1bmN0aW9uKHBlZXIpIHtcbiAgICB2YXIgbWFwcGVyID0gUmVhbHRpbWUubWFwcGVyc09uTWFwW3BlZXIubmlja11cbiAgICBwZWVyLmF2YXRhciA9IG1hcHBlci5pbWFnZVxuICAgIHBlZXIudXNlcm5hbWUgPSBtYXBwZXIubmFtZVxuICAgIGlmIChzZWxmLmlzQWN0aXZlUm9vbSkge1xuICAgICAgc2VsZi5hZGRWaWRlbyhwZWVyKVxuICAgIH1cbiAgfSlcblxuICB0aGlzLndlYnJ0Yy5vbigncGVlclN0cmVhbVJlbW92ZWQnLCBmdW5jdGlvbihwZWVyKSB7XG4gICAgaWYgKHNlbGYuaXNBY3RpdmVSb29tKSB7XG4gICAgICBzZWxmLnJlbW92ZVZpZGVvKHBlZXIpXG4gICAgfVxuICB9KVxuXG4gIHRoaXMud2VicnRjLm9uKCdtdXRlJywgZnVuY3Rpb24oZGF0YSkge1xuICAgIHZhciB2ID0gc2VsZi52aWRlb3NbZGF0YS5pZF1cbiAgICBpZiAoIXYpIHJldHVyblxuXG4gICAgaWYgKGRhdGEubmFtZSA9PT0gJ2F1ZGlvJykge1xuICAgICAgdi5hdWRpb1N0YXR1cyA9IGZhbHNlXG4gICAgfSBlbHNlIGlmIChkYXRhLm5hbWUgPT09ICd2aWRlbycpIHtcbiAgICAgIHYudmlkZW9TdGF0dXMgPSBmYWxzZVxuICAgICAgdi4kYXZhdGFyLnNob3coKVxuICAgIH1cbiAgICBpZiAoIXYuYXVkaW9TdGF0dXMgJiYgIXYudmlkZW9TdGF0dXMpIHYuJGNvbnRhaW5lci5oaWRlKClcbiAgfSlcbiAgdGhpcy53ZWJydGMub24oJ3VubXV0ZScsIGZ1bmN0aW9uKGRhdGEpIHtcbiAgICBjb25zdCB2ID0gc2VsZi52aWRlb3NbZGF0YS5pZF1cbiAgICBpZiAoIXYpIHJldHVyblxuXG4gICAgaWYgKGRhdGEubmFtZSA9PT0gJ2F1ZGlvJykge1xuICAgICAgdi5hdWRpb1N0YXR1cyA9IHRydWVcbiAgICB9IGVsc2UgaWYgKGRhdGEubmFtZSA9PT0gJ3ZpZGVvJykge1xuICAgICAgdi52aWRlb1N0YXR1cyA9IHRydWVcbiAgICAgIHYuJGF2YXRhci5oaWRlKClcbiAgICB9XG4gICAgdi4kY29udGFpbmVyLnNob3coKVxuICB9KVxufVxuXG5Sb29tLnByb3RvdHlwZS52aWRlb0FkZGVkID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgdGhpcy5fdmlkZW9BZGRlZCA9IGNhbGxiYWNrXG59XG5cblJvb20ucHJvdG90eXBlLmFkZFZpZGVvID0gZnVuY3Rpb24ocGVlcikge1xuICBjb25zdCBpZCA9IHRoaXMud2VicnRjLmdldERvbUlkKHBlZXIpXG4gIGNvbnN0IHZpZGVvID0gYXR0YWNoTWVkaWFTdHJlYW0ocGVlci5zdHJlYW0pXG5cbiAgY29uc3QgdiA9IG5ldyBWaWRlb1ZpZXcodmlkZW8sIG51bGwsIGlkLCBmYWxzZSwgeyBET1VCTEVfQ0xJQ0tfVE9MRVJBTkNFOiAyMDAsIGF2YXRhcjogcGVlci5hdmF0YXIsIHVzZXJuYW1lOiBwZWVyLnVzZXJuYW1lIH0pXG5cbiAgdGhpcy52aWRlb3NbcGVlci5pZF0gPSB2XG4gIGlmICh0aGlzLl92aWRlb0FkZGVkKSB0aGlzLl92aWRlb0FkZGVkKHYsIHBlZXIubmljaylcbn1cblxuUm9vbS5wcm90b3R5cGUucmVtb3ZlVmlkZW8gPSBmdW5jdGlvbihwZWVyKSB7XG4gIHZhciBpZCA9IHR5cGVvZiBwZWVyID09PSAnc3RyaW5nJyA/IHBlZXIgOiBwZWVyLmlkXG4gIGlmICh0aGlzLnZpZGVvc1tpZF0pIHtcbiAgICB0aGlzLnZpZGVvc1tpZF0ucmVtb3ZlKClcbiAgICBkZWxldGUgdGhpcy52aWRlb3NbaWRdXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUm9vbVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9WaWV3cy9Sb29tLmpzIl0sIm1hcHBpbmdzIjoiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 560 */
/***/ function(module, exports) {

    eval("'use strict'; /* EVENTS SENDABLE */\nmodule.exports = {\n  JOIN_MAP: 'JOIN_MAP',\n  CHECK_FOR_CALL: 'CHECK_FOR_CALL',\n  LEAVE_MAP: 'LEAVE_MAP',\n  ACCEPT_CALL: 'ACCEPT_CALL',\n  DENY_CALL: 'DENY_CALL',\n  DENY_INVITE: 'DENY_INVITE',\n  INVITE_TO_JOIN: 'INVITE_TO_JOIN',\n  INVITE_A_CALL: 'INVITE_A_CALL',\n  JOIN_CALL: 'JOIN_CALL',\n  LEAVE_CALL: 'LEAVE_CALL',\n  SEND_MAPPER_INFO: 'SEND_MAPPER_INFO',\n  SEND_COORDS: 'SEND_COORDS',\n  DRAG_TOPIC: 'DRAG_TOPIC',\n\n  /* EVENTS RECEIVABLE FROM NODE SERVER */\n  JUNTO_UPDATED: 'JUNTO_UPDATED',\n  INVITED_TO_CALL: 'INVITED_TO_CALL',\n  INVITED_TO_JOIN: 'INVITED_TO_JOIN',\n  CALL_ACCEPTED: 'CALL_ACCEPTED',\n  CALL_DENIED: 'CALL_DENIED',\n  INVITE_DENIED: 'INVITE_DENIED',\n  CALL_IN_PROGRESS: 'CALL_IN_PROGRESS',\n  CALL_STARTED: 'CALL_STARTED',\n  MAPPER_JOINED_CALL: 'MAPPER_JOINED_CALL',\n  MAPPER_LEFT_CALL: 'MAPPER_LEFT_CALL',\n  MAPPER_LIST_UPDATED: 'MAPPER_LIST_UPDATED',\n  NEW_MAPPER: 'NEW_MAPPER',\n  LOST_MAPPER: 'LOST_MAPPER',\n  TOPIC_DRAGGED: 'TOPIC_DRAGGED',\n  PEER_COORDS_UPDATED: 'PEER_COORDS_UPDATED' };//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYwLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvUmVhbHRpbWUvZXZlbnRzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIEVWRU5UUyBTRU5EQUJMRSAqL1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEpPSU5fTUFQOiAnSk9JTl9NQVAnLFxuICBDSEVDS19GT1JfQ0FMTDogJ0NIRUNLX0ZPUl9DQUxMJyxcbiAgTEVBVkVfTUFQOiAnTEVBVkVfTUFQJyxcbiAgQUNDRVBUX0NBTEw6ICdBQ0NFUFRfQ0FMTCcsXG4gIERFTllfQ0FMTDogJ0RFTllfQ0FMTCcsXG4gIERFTllfSU5WSVRFOiAnREVOWV9JTlZJVEUnLFxuICBJTlZJVEVfVE9fSk9JTjogJ0lOVklURV9UT19KT0lOJyxcbiAgSU5WSVRFX0FfQ0FMTDogJ0lOVklURV9BX0NBTEwnLFxuICBKT0lOX0NBTEw6ICdKT0lOX0NBTEwnLFxuICBMRUFWRV9DQUxMOiAnTEVBVkVfQ0FMTCcsXG4gIFNFTkRfTUFQUEVSX0lORk86ICdTRU5EX01BUFBFUl9JTkZPJyxcbiAgU0VORF9DT09SRFM6ICdTRU5EX0NPT1JEUycsXG4gIERSQUdfVE9QSUM6ICdEUkFHX1RPUElDJyxcblxuICAvKiBFVkVOVFMgUkVDRUlWQUJMRSBGUk9NIE5PREUgU0VSVkVSICovXG4gIEpVTlRPX1VQREFURUQ6ICdKVU5UT19VUERBVEVEJyxcbiAgSU5WSVRFRF9UT19DQUxMOiAnSU5WSVRFRF9UT19DQUxMJyxcbiAgSU5WSVRFRF9UT19KT0lOOiAnSU5WSVRFRF9UT19KT0lOJyxcbiAgQ0FMTF9BQ0NFUFRFRDogJ0NBTExfQUNDRVBURUQnLFxuICBDQUxMX0RFTklFRDogJ0NBTExfREVOSUVEJyxcbiAgSU5WSVRFX0RFTklFRDogJ0lOVklURV9ERU5JRUQnLFxuICBDQUxMX0lOX1BST0dSRVNTOiAnQ0FMTF9JTl9QUk9HUkVTUycsXG4gIENBTExfU1RBUlRFRDogJ0NBTExfU1RBUlRFRCcsXG4gIE1BUFBFUl9KT0lORURfQ0FMTDogJ01BUFBFUl9KT0lORURfQ0FMTCcsXG4gIE1BUFBFUl9MRUZUX0NBTEw6ICdNQVBQRVJfTEVGVF9DQUxMJyxcbiAgTUFQUEVSX0xJU1RfVVBEQVRFRDogJ01BUFBFUl9MSVNUX1VQREFURUQnLFxuICBORVdfTUFQUEVSOiAnTkVXX01BUFBFUicsXG4gIExPU1RfTUFQUEVSOiAnTE9TVF9NQVBQRVInLFxuICBUT1BJQ19EUkFHR0VEOiAnVE9QSUNfRFJBR0dFRCcsXG4gIFBFRVJfQ09PUkRTX1VQREFURUQ6ICdQRUVSX0NPT1JEU19VUERBVEVEJ1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9SZWFsdGltZS9ldmVudHMuanMiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 561 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _each2 = __webpack_require__(137);var _each3 = _interopRequireDefault(_each2);var _map2 = __webpack_require__(146);var _map3 = _interopRequireDefault(_map2);var _uniq2 = __webpack_require__(562);var _uniq3 = _interopRequireDefault(_uniq2);var _indexOf2 = __webpack_require__(10);var _indexOf3 = _interopRequireDefault(_indexOf2);var _find2 = __webpack_require__(28);var _find3 = _interopRequireDefault(_find2);\n\n\n\nvar _JIT = __webpack_require__(170);var _JIT2 = _interopRequireDefault(_JIT);\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _DataModel = __webpack_require__(149);var _DataModel2 = _interopRequireDefault(_DataModel);\nvar _Engine = __webpack_require__(150);var _Engine2 = _interopRequireDefault(_Engine);\nvar _JIT3 = __webpack_require__(355);var _JIT4 = _interopRequireDefault(_JIT3);\nvar _Loading = __webpack_require__(368);var _Loading2 = _interopRequireDefault(_Loading);\nvar _Router = __webpack_require__(367);var _Router2 = _interopRequireDefault(_Router);\nvar _TopicCard = __webpack_require__(566);var _TopicCard2 = _interopRequireDefault(_TopicCard);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} /* global $ */\n\nvar Visualize = {\n  mGraph: null, // a reference to the graph object.\n  cameraPosition: null, // stores the camera position when using a 3D visualization\n  type: 'ForceDirected', // the type of graph we're building, could be \"RGraph\", \"ForceDirected\", or \"ForceDirected3D\"\n  loadLater: false, // indicates whether there is JSON that should be loaded right in the offset, or whether to wait till the first topic is created\n  touchDragNode: null,\n  init: function init(serverData) {\n    var self = Visualize;\n\n    if (serverData.VisualizeType) self.type = serverData.VisualizeType;\n\n    // disable awkward dragging of the canvas element that would sometimes happen\n    $('#infovis-canvas').on('dragstart', function (event) {\n      event.preventDefault();\n    });\n\n    // prevent touch events on the canvas from default behaviour\n    $('#infovis-canvas').bind('touchstart', function (event) {\n      event.preventDefault();\n      self.mGraph.events.touched = true;\n    });\n\n    // prevent touch events on the canvas from default behaviour\n    $('#infovis-canvas').bind('touchmove', function (event) {\n      // JIT.touchPanZoomHandler(event)\n    });\n\n    // prevent touch events on the canvas from default behaviour\n    $('#infovis-canvas').bind('touchend touchcancel', function (event) {\n      if (!self.mGraph.events.touchMoved && !Visualize.touchDragNode) _TopicCard2.default.hideCurrentCard();\n      self.mGraph.events.touched = self.mGraph.events.touchMoved = false;\n      Visualize.touchDragNode = false;\n    });\n  },\n  computePositions: function computePositions() {\n    var self = Visualize;\n\n    if (self.type === 'RGraph') {(function () {\n        var i = void 0;\n        var l = void 0;\n\n        self.mGraph.graph.eachNode(function (n) {\n          var topic = _DataModel2.default.Topics.get(n.id);\n          topic.set({ node: n }, { silent: true });\n          topic.updateNode();\n\n          n.eachAdjacency(function (edge) {\n            if (!edge.getData('init')) {\n              edge.setData('init', true);\n\n              l = edge.getData('synapseIDs').length;\n              for (i = 0; i < l; i++) {\n                var synapse = _DataModel2.default.Synapses.get(edge.getData('synapseIDs')[i]);\n                synapse.set({ edge: edge }, { silent: true });\n                synapse.updateEdge();\n              }\n            }\n          });\n\n          var pos = n.getPos();\n          pos.setc(-200, -200);\n        });\n        self.mGraph.compute('end');})();\n    } else if (self.type === 'ForceDirected') {\n      self.mGraph.graph.eachNode(function (n) {\n        var topic = _DataModel2.default.Topics.get(n.id);\n        topic.set({ node: n }, { silent: true });\n        topic.updateNode();\n        var mapping = topic.getMapping();\n\n        n.eachAdjacency(function (edge) {\n          if (!edge.getData('init')) {\n            edge.setData('init', true);\n\n            var l = edge.getData('synapseIDs').length;\n            for (var i = 0; i < l; i++) {\n              var synapse = _DataModel2.default.Synapses.get(edge.getData('synapseIDs')[i]);\n              synapse.set({ edge: edge }, { silent: true });\n              synapse.updateEdge();\n            }\n          }\n        });\n\n        //const startPos = new $jit.Complex(0, 0)\n        var endPos = new _JIT2.default.Complex(0, 0);\n        //n.setPos(startPos, 'start')\n        //n.setPos(endPos, 'end')\n        n.setPos(endPos, 'current');\n        n.setPos(endPos, 'end');\n        n.setData('dim', 1, 'start');\n        n.setData('dim', 25, 'end');\n      });\n    } else if (self.type === 'ForceDirected3D') {\n      self.mGraph.compute();\n    }\n  },\n  /**\n      * render does the heavy lifting of creating the engine that renders the graph with the properties we desire\n      *\n      */\n  render: function render() {\n    var self = Visualize;\n\n    if (self.type === 'RGraph') {\n      // clear the previous canvas from #infovis\n      $('#infovis').empty();\n\n      var RGraphSettings = $.extend(true, {}, _JIT4.default.ForceDirected.graphSettings);\n\n      _JIT2.default.RGraph.Plot.NodeTypes.implement(_JIT4.default.ForceDirected.nodeSettings);\n      _JIT2.default.RGraph.Plot.EdgeTypes.implement(_JIT4.default.ForceDirected.edgeSettings);\n\n      RGraphSettings.width = $(document).width();\n      RGraphSettings.height = $(document).height();\n      RGraphSettings.background = _JIT4.default.RGraph.background;\n      RGraphSettings.levelDistance = _JIT4.default.RGraph.levelDistance;\n\n      self.mGraph = new _JIT2.default.RGraph(RGraphSettings);\n    } else if (self.type === 'ForceDirected') {\n      // clear the previous canvas from #infovis\n      $('#infovis').empty();\n\n      var FDSettings = $.extend(true, {}, _JIT4.default.ForceDirected.graphSettings);\n\n      _JIT2.default.ForceDirected.Plot.NodeTypes.implement(_JIT4.default.ForceDirected.nodeSettings);\n      _JIT2.default.ForceDirected.Plot.EdgeTypes.implement(_JIT4.default.ForceDirected.edgeSettings);\n\n      FDSettings.width = $('body').width();\n      FDSettings.height = $('body').height();\n\n      self.mGraph = new _JIT2.default.ForceDirected(FDSettings);\n    } else if (self.type === 'ForceDirected3D' && !self.mGraph) {\n      // clear the previous canvas from #infovis\n      $('#infovis').empty();\n\n      // init ForceDirected3D\n      self.mGraph = new _JIT2.default.ForceDirected3D(_JIT4.default.ForceDirected3D.graphSettings);\n      self.cameraPosition = self.mGraph.canvas.canvases[0].camera.position;\n    } else {\n      self.mGraph.graph.empty();\n    }\n\n    function runAnimation() {\n      _Loading2.default.hide();\n      $('#new_topic').show();\n      $('#topic_name').focus();\n      // load JSON data, if it's not empty\n      if (!self.loadLater) {\n        // load JSON data.\n        var rootIndex = 0;\n        if (_Active2.default.Topic) {\n          var node = (0, _find3.default)(_JIT4.default.vizData, function (node) {\n            return node.id === _Active2.default.Topic.id;\n          });\n          rootIndex = (0, _indexOf3.default)(_JIT4.default.vizData, node);\n        }\n        self.mGraph.loadJSON(_JIT4.default.vizData, rootIndex);\n        // compute positions and plot.\n        self.computePositions();\n        self.mGraph.busy = true;\n        if (self.type === 'RGraph') {\n          self.mGraph.fx.animate(_JIT4.default.RGraph.animate);\n        } else if (self.type === 'ForceDirected') {\n          self.mGraph.plot();\n          _Engine2.default.run(true);\n        } else if (self.type === 'ForceDirected3D') {\n          self.mGraph.animate(_JIT4.default.ForceDirected.animateFDLayout);\n        }\n      }\n    }\n    // hold until all the needed metacode images are loaded\n    // hold for a maximum of 80 passes, or 4 seconds of waiting time\n    var tries = 0;\n    function hold() {\n      var unique = (0, _uniq3.default)(_DataModel2.default.Topics.models, function (metacode) {return metacode.get('metacode_id');});\n      var requiredMetacodes = (0, _map3.default)(unique, function (metacode) {return metacode.get('metacode_id');});\n      var loadedCount = 0;\n\n      (0, _each3.default)(requiredMetacodes, function (metacodeId) {\n        var metacode = _DataModel2.default.Metacodes.get(metacodeId);\n        var img = metacode ? metacode.get('image') : false;\n\n        if (img && (img.complete || typeof img.naturalWidth !== 'undefined' && img.naturalWidth !== 0)) {\n          loadedCount += 1;\n        }\n      });\n\n      if (loadedCount === requiredMetacodes.length || tries > 80) {\n        runAnimation();\n      } else {\n        setTimeout(function () {tries++;hold();}, 50);\n      }\n    }\n    hold();\n\n    // update the url now that the map is ready\n    clearTimeout(_Router2.default.timeoutId);\n    _Router2.default.timeoutId = setTimeout(function () {\n      var m = _Active2.default.Map;\n      var t = _Active2.default.Topic;\n\n      if (m && window.location.pathname === '/maps/' + m.id + '/conversation') return;\n\n      if (m && window.location.pathname !== '/maps/' + m.id) {\n        _Router2.default.navigateAndTrack('/maps/' + m.id);\n      } else if (t && window.location.pathname !== '/topics/' + t.id) {\n        _Router2.default.navigateAndTrack('/topics/' + t.id);\n      }\n    }, 800);\n  },\n  clearVisualization: function clearVisualization() {\n    Visualize.mGraph.graph.empty();\n    Visualize.mGraph.plot();\n    _JIT4.default.centerMap(Visualize.mGraph.canvas);\n    $('#infovis').empty();\n  } };exports.default =\n\n\nVisualize;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYxLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvVmlzdWFsaXplLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGdsb2JhbCAkICovXG5cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCdcblxuaW1wb3J0ICRqaXQgZnJvbSAnLi4vcGF0Y2hlZC9KSVQnXG5cbmltcG9ydCBBY3RpdmUgZnJvbSAnLi9BY3RpdmUnXG5pbXBvcnQgRGF0YU1vZGVsIGZyb20gJy4vRGF0YU1vZGVsJ1xuaW1wb3J0IEVuZ2luZSBmcm9tICcuL0VuZ2luZSdcbmltcG9ydCBKSVQgZnJvbSAnLi9KSVQnXG5pbXBvcnQgTG9hZGluZyBmcm9tICcuL0xvYWRpbmcnXG5pbXBvcnQgUm91dGVyIGZyb20gJy4vUm91dGVyJ1xuaW1wb3J0IFRvcGljQ2FyZCBmcm9tICcuL1RvcGljQ2FyZCdcblxuY29uc3QgVmlzdWFsaXplID0ge1xuICBtR3JhcGg6IG51bGwsIC8vIGEgcmVmZXJlbmNlIHRvIHRoZSBncmFwaCBvYmplY3QuXG4gIGNhbWVyYVBvc2l0aW9uOiBudWxsLCAvLyBzdG9yZXMgdGhlIGNhbWVyYSBwb3NpdGlvbiB3aGVuIHVzaW5nIGEgM0QgdmlzdWFsaXphdGlvblxuICB0eXBlOiAnRm9yY2VEaXJlY3RlZCcsIC8vIHRoZSB0eXBlIG9mIGdyYXBoIHdlJ3JlIGJ1aWxkaW5nLCBjb3VsZCBiZSBcIlJHcmFwaFwiLCBcIkZvcmNlRGlyZWN0ZWRcIiwgb3IgXCJGb3JjZURpcmVjdGVkM0RcIlxuICBsb2FkTGF0ZXI6IGZhbHNlLCAvLyBpbmRpY2F0ZXMgd2hldGhlciB0aGVyZSBpcyBKU09OIHRoYXQgc2hvdWxkIGJlIGxvYWRlZCByaWdodCBpbiB0aGUgb2Zmc2V0LCBvciB3aGV0aGVyIHRvIHdhaXQgdGlsbCB0aGUgZmlyc3QgdG9waWMgaXMgY3JlYXRlZFxuICB0b3VjaERyYWdOb2RlOiBudWxsLFxuICBpbml0OiBmdW5jdGlvbihzZXJ2ZXJEYXRhKSB7XG4gICAgdmFyIHNlbGYgPSBWaXN1YWxpemVcblxuICAgIGlmIChzZXJ2ZXJEYXRhLlZpc3VhbGl6ZVR5cGUpIHNlbGYudHlwZSA9IHNlcnZlckRhdGEuVmlzdWFsaXplVHlwZVxuXG4gICAgLy8gZGlzYWJsZSBhd2t3YXJkIGRyYWdnaW5nIG9mIHRoZSBjYW52YXMgZWxlbWVudCB0aGF0IHdvdWxkIHNvbWV0aW1lcyBoYXBwZW5cbiAgICAkKCcjaW5mb3Zpcy1jYW52YXMnKS5vbignZHJhZ3N0YXJ0JywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICB9KVxuXG4gICAgLy8gcHJldmVudCB0b3VjaCBldmVudHMgb24gdGhlIGNhbnZhcyBmcm9tIGRlZmF1bHQgYmVoYXZpb3VyXG4gICAgJCgnI2luZm92aXMtY2FudmFzJykuYmluZCgndG91Y2hzdGFydCcsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBzZWxmLm1HcmFwaC5ldmVudHMudG91Y2hlZCA9IHRydWVcbiAgICB9KVxuXG4gICAgLy8gcHJldmVudCB0b3VjaCBldmVudHMgb24gdGhlIGNhbnZhcyBmcm9tIGRlZmF1bHQgYmVoYXZpb3VyXG4gICAgJCgnI2luZm92aXMtY2FudmFzJykuYmluZCgndG91Y2htb3ZlJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIC8vIEpJVC50b3VjaFBhblpvb21IYW5kbGVyKGV2ZW50KVxuICAgIH0pXG5cbiAgICAvLyBwcmV2ZW50IHRvdWNoIGV2ZW50cyBvbiB0aGUgY2FudmFzIGZyb20gZGVmYXVsdCBiZWhhdmlvdXJcbiAgICAkKCcjaW5mb3Zpcy1jYW52YXMnKS5iaW5kKCd0b3VjaGVuZCB0b3VjaGNhbmNlbCcsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoIXNlbGYubUdyYXBoLmV2ZW50cy50b3VjaE1vdmVkICYmICFWaXN1YWxpemUudG91Y2hEcmFnTm9kZSkgVG9waWNDYXJkLmhpZGVDdXJyZW50Q2FyZCgpXG4gICAgICBzZWxmLm1HcmFwaC5ldmVudHMudG91Y2hlZCA9IHNlbGYubUdyYXBoLmV2ZW50cy50b3VjaE1vdmVkID0gZmFsc2VcbiAgICAgIFZpc3VhbGl6ZS50b3VjaERyYWdOb2RlID0gZmFsc2VcbiAgICB9KVxuICB9LFxuICBjb21wdXRlUG9zaXRpb25zOiBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBzZWxmID0gVmlzdWFsaXplXG5cbiAgICBpZiAoc2VsZi50eXBlID09PSAnUkdyYXBoJykge1xuICAgICAgbGV0IGlcbiAgICAgIGxldCBsXG5cbiAgICAgIHNlbGYubUdyYXBoLmdyYXBoLmVhY2hOb2RlKGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgY29uc3QgdG9waWMgPSBEYXRhTW9kZWwuVG9waWNzLmdldChuLmlkKVxuICAgICAgICB0b3BpYy5zZXQoeyBub2RlOiBuIH0sIHsgc2lsZW50OiB0cnVlIH0pXG4gICAgICAgIHRvcGljLnVwZGF0ZU5vZGUoKVxuXG4gICAgICAgIG4uZWFjaEFkamFjZW5jeShmdW5jdGlvbihlZGdlKSB7XG4gICAgICAgICAgaWYgKCFlZGdlLmdldERhdGEoJ2luaXQnKSkge1xuICAgICAgICAgICAgZWRnZS5zZXREYXRhKCdpbml0JywgdHJ1ZSlcblxuICAgICAgICAgICAgbCA9IGVkZ2UuZ2V0RGF0YSgnc3luYXBzZUlEcycpLmxlbmd0aFxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICBjb25zdCBzeW5hcHNlID0gRGF0YU1vZGVsLlN5bmFwc2VzLmdldChlZGdlLmdldERhdGEoJ3N5bmFwc2VJRHMnKVtpXSlcbiAgICAgICAgICAgICAgc3luYXBzZS5zZXQoeyBlZGdlOiBlZGdlIH0sIHsgc2lsZW50OiB0cnVlIH0pXG4gICAgICAgICAgICAgIHN5bmFwc2UudXBkYXRlRWRnZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHZhciBwb3MgPSBuLmdldFBvcygpXG4gICAgICAgIHBvcy5zZXRjKC0yMDAsIC0yMDApXG4gICAgICB9KVxuICAgICAgc2VsZi5tR3JhcGguY29tcHV0ZSgnZW5kJylcbiAgICB9IGVsc2UgaWYgKHNlbGYudHlwZSA9PT0gJ0ZvcmNlRGlyZWN0ZWQnKSB7XG4gICAgICBzZWxmLm1HcmFwaC5ncmFwaC5lYWNoTm9kZShmdW5jdGlvbihuKSB7XG4gICAgICAgIGNvbnN0IHRvcGljID0gRGF0YU1vZGVsLlRvcGljcy5nZXQobi5pZClcbiAgICAgICAgdG9waWMuc2V0KHsgbm9kZTogbiB9LCB7IHNpbGVudDogdHJ1ZSB9KVxuICAgICAgICB0b3BpYy51cGRhdGVOb2RlKClcbiAgICAgICAgY29uc3QgbWFwcGluZyA9IHRvcGljLmdldE1hcHBpbmcoKVxuXG4gICAgICAgIG4uZWFjaEFkamFjZW5jeShmdW5jdGlvbihlZGdlKSB7XG4gICAgICAgICAgaWYgKCFlZGdlLmdldERhdGEoJ2luaXQnKSkge1xuICAgICAgICAgICAgZWRnZS5zZXREYXRhKCdpbml0JywgdHJ1ZSlcblxuICAgICAgICAgICAgY29uc3QgbCA9IGVkZ2UuZ2V0RGF0YSgnc3luYXBzZUlEcycpLmxlbmd0aFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3luYXBzZSA9IERhdGFNb2RlbC5TeW5hcHNlcy5nZXQoZWRnZS5nZXREYXRhKCdzeW5hcHNlSURzJylbaV0pXG4gICAgICAgICAgICAgIHN5bmFwc2Uuc2V0KHsgZWRnZTogZWRnZSB9LCB7IHNpbGVudDogdHJ1ZSB9KVxuICAgICAgICAgICAgICBzeW5hcHNlLnVwZGF0ZUVkZ2UoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICAvL2NvbnN0IHN0YXJ0UG9zID0gbmV3ICRqaXQuQ29tcGxleCgwLCAwKVxuICAgICAgICBjb25zdCBlbmRQb3MgPSBuZXcgJGppdC5Db21wbGV4KDAsIDApXG4gICAgICAgIC8vbi5zZXRQb3Moc3RhcnRQb3MsICdzdGFydCcpXG4gICAgICAgIC8vbi5zZXRQb3MoZW5kUG9zLCAnZW5kJylcbiAgICAgICAgbi5zZXRQb3MoZW5kUG9zLCAnY3VycmVudCcpXG4gICAgICAgIG4uc2V0UG9zKGVuZFBvcywgJ2VuZCcpXG4gICAgICAgIG4uc2V0RGF0YSgnZGltJywgMSwgJ3N0YXJ0JylcbiAgICAgICAgbi5zZXREYXRhKCdkaW0nLCAyNSwgJ2VuZCcpXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAoc2VsZi50eXBlID09PSAnRm9yY2VEaXJlY3RlZDNEJykge1xuICAgICAgc2VsZi5tR3JhcGguY29tcHV0ZSgpXG4gICAgfVxuICB9LFxuICAvKipcbiAgICogcmVuZGVyIGRvZXMgdGhlIGhlYXZ5IGxpZnRpbmcgb2YgY3JlYXRpbmcgdGhlIGVuZ2luZSB0aGF0IHJlbmRlcnMgdGhlIGdyYXBoIHdpdGggdGhlIHByb3BlcnRpZXMgd2UgZGVzaXJlXG4gICAqXG4gICAqL1xuICByZW5kZXI6IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHNlbGYgPSBWaXN1YWxpemVcblxuICAgIGlmIChzZWxmLnR5cGUgPT09ICdSR3JhcGgnKSB7XG4gICAgICAvLyBjbGVhciB0aGUgcHJldmlvdXMgY2FudmFzIGZyb20gI2luZm92aXNcbiAgICAgICQoJyNpbmZvdmlzJykuZW1wdHkoKVxuXG4gICAgICBjb25zdCBSR3JhcGhTZXR0aW5ncyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBKSVQuRm9yY2VEaXJlY3RlZC5ncmFwaFNldHRpbmdzKVxuXG4gICAgICAkaml0LlJHcmFwaC5QbG90Lk5vZGVUeXBlcy5pbXBsZW1lbnQoSklULkZvcmNlRGlyZWN0ZWQubm9kZVNldHRpbmdzKVxuICAgICAgJGppdC5SR3JhcGguUGxvdC5FZGdlVHlwZXMuaW1wbGVtZW50KEpJVC5Gb3JjZURpcmVjdGVkLmVkZ2VTZXR0aW5ncylcblxuICAgICAgUkdyYXBoU2V0dGluZ3Mud2lkdGggPSAkKGRvY3VtZW50KS53aWR0aCgpXG4gICAgICBSR3JhcGhTZXR0aW5ncy5oZWlnaHQgPSAkKGRvY3VtZW50KS5oZWlnaHQoKVxuICAgICAgUkdyYXBoU2V0dGluZ3MuYmFja2dyb3VuZCA9IEpJVC5SR3JhcGguYmFja2dyb3VuZFxuICAgICAgUkdyYXBoU2V0dGluZ3MubGV2ZWxEaXN0YW5jZSA9IEpJVC5SR3JhcGgubGV2ZWxEaXN0YW5jZVxuXG4gICAgICBzZWxmLm1HcmFwaCA9IG5ldyAkaml0LlJHcmFwaChSR3JhcGhTZXR0aW5ncylcbiAgICB9IGVsc2UgaWYgKHNlbGYudHlwZSA9PT0gJ0ZvcmNlRGlyZWN0ZWQnKSB7XG4gICAgICAvLyBjbGVhciB0aGUgcHJldmlvdXMgY2FudmFzIGZyb20gI2luZm92aXNcbiAgICAgICQoJyNpbmZvdmlzJykuZW1wdHkoKVxuXG4gICAgICBjb25zdCBGRFNldHRpbmdzID0gJC5leHRlbmQodHJ1ZSwge30sIEpJVC5Gb3JjZURpcmVjdGVkLmdyYXBoU2V0dGluZ3MpXG5cbiAgICAgICRqaXQuRm9yY2VEaXJlY3RlZC5QbG90Lk5vZGVUeXBlcy5pbXBsZW1lbnQoSklULkZvcmNlRGlyZWN0ZWQubm9kZVNldHRpbmdzKVxuICAgICAgJGppdC5Gb3JjZURpcmVjdGVkLlBsb3QuRWRnZVR5cGVzLmltcGxlbWVudChKSVQuRm9yY2VEaXJlY3RlZC5lZGdlU2V0dGluZ3MpXG5cbiAgICAgIEZEU2V0dGluZ3Mud2lkdGggPSAkKCdib2R5Jykud2lkdGgoKVxuICAgICAgRkRTZXR0aW5ncy5oZWlnaHQgPSAkKCdib2R5JykuaGVpZ2h0KClcblxuICAgICAgc2VsZi5tR3JhcGggPSBuZXcgJGppdC5Gb3JjZURpcmVjdGVkKEZEU2V0dGluZ3MpXG4gICAgfSBlbHNlIGlmIChzZWxmLnR5cGUgPT09ICdGb3JjZURpcmVjdGVkM0QnICYmICFzZWxmLm1HcmFwaCkge1xuICAgICAgLy8gY2xlYXIgdGhlIHByZXZpb3VzIGNhbnZhcyBmcm9tICNpbmZvdmlzXG4gICAgICAkKCcjaW5mb3ZpcycpLmVtcHR5KClcblxuICAgICAgLy8gaW5pdCBGb3JjZURpcmVjdGVkM0RcbiAgICAgIHNlbGYubUdyYXBoID0gbmV3ICRqaXQuRm9yY2VEaXJlY3RlZDNEKEpJVC5Gb3JjZURpcmVjdGVkM0QuZ3JhcGhTZXR0aW5ncylcbiAgICAgIHNlbGYuY2FtZXJhUG9zaXRpb24gPSBzZWxmLm1HcmFwaC5jYW52YXMuY2FudmFzZXNbMF0uY2FtZXJhLnBvc2l0aW9uXG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYubUdyYXBoLmdyYXBoLmVtcHR5KClcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW5BbmltYXRpb24oKSB7XG4gICAgICBMb2FkaW5nLmhpZGUoKVxuICAgICAgJCgnI25ld190b3BpYycpLnNob3coKVxuICAgICAgJCgnI3RvcGljX25hbWUnKS5mb2N1cygpXG4gICAgICAvLyBsb2FkIEpTT04gZGF0YSwgaWYgaXQncyBub3QgZW1wdHlcbiAgICAgIGlmICghc2VsZi5sb2FkTGF0ZXIpIHtcbiAgICAgICAgLy8gbG9hZCBKU09OIGRhdGEuXG4gICAgICAgIHZhciByb290SW5kZXggPSAwXG4gICAgICAgIGlmIChBY3RpdmUuVG9waWMpIHtcbiAgICAgICAgICB2YXIgbm9kZSA9IF8uZmluZChKSVQudml6RGF0YSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUuaWQgPT09IEFjdGl2ZS5Ub3BpYy5pZFxuICAgICAgICAgIH0pXG4gICAgICAgICAgcm9vdEluZGV4ID0gXy5pbmRleE9mKEpJVC52aXpEYXRhLCBub2RlKVxuICAgICAgICB9XG4gICAgICAgIHNlbGYubUdyYXBoLmxvYWRKU09OKEpJVC52aXpEYXRhLCByb290SW5kZXgpXG4gICAgICAgIC8vIGNvbXB1dGUgcG9zaXRpb25zIGFuZCBwbG90LlxuICAgICAgICBzZWxmLmNvbXB1dGVQb3NpdGlvbnMoKVxuICAgICAgICBzZWxmLm1HcmFwaC5idXN5ID0gdHJ1ZVxuICAgICAgICBpZiAoc2VsZi50eXBlID09PSAnUkdyYXBoJykge1xuICAgICAgICAgIHNlbGYubUdyYXBoLmZ4LmFuaW1hdGUoSklULlJHcmFwaC5hbmltYXRlKVxuICAgICAgICB9IGVsc2UgaWYgKHNlbGYudHlwZSA9PT0gJ0ZvcmNlRGlyZWN0ZWQnKSB7XG4gICAgICAgICAgc2VsZi5tR3JhcGgucGxvdCgpXG4gICAgICAgICAgRW5naW5lLnJ1bih0cnVlKVxuICAgICAgICB9IGVsc2UgaWYgKHNlbGYudHlwZSA9PT0gJ0ZvcmNlRGlyZWN0ZWQzRCcpIHtcbiAgICAgICAgICBzZWxmLm1HcmFwaC5hbmltYXRlKEpJVC5Gb3JjZURpcmVjdGVkLmFuaW1hdGVGRExheW91dClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBob2xkIHVudGlsIGFsbCB0aGUgbmVlZGVkIG1ldGFjb2RlIGltYWdlcyBhcmUgbG9hZGVkXG4gICAgLy8gaG9sZCBmb3IgYSBtYXhpbXVtIG9mIDgwIHBhc3Nlcywgb3IgNCBzZWNvbmRzIG9mIHdhaXRpbmcgdGltZVxuICAgIHZhciB0cmllcyA9IDBcbiAgICBmdW5jdGlvbiBob2xkKCkge1xuICAgICAgY29uc3QgdW5pcXVlID0gXy51bmlxKERhdGFNb2RlbC5Ub3BpY3MubW9kZWxzLCBmdW5jdGlvbihtZXRhY29kZSkgeyByZXR1cm4gbWV0YWNvZGUuZ2V0KCdtZXRhY29kZV9pZCcpIH0pXG4gICAgICBjb25zdCByZXF1aXJlZE1ldGFjb2RlcyA9IF8ubWFwKHVuaXF1ZSwgZnVuY3Rpb24obWV0YWNvZGUpIHsgcmV0dXJuIG1ldGFjb2RlLmdldCgnbWV0YWNvZGVfaWQnKSB9KVxuICAgICAgbGV0IGxvYWRlZENvdW50ID0gMFxuXG4gICAgICBfLmVhY2gocmVxdWlyZWRNZXRhY29kZXMsIGZ1bmN0aW9uKG1ldGFjb2RlSWQpIHtcbiAgICAgICAgY29uc3QgbWV0YWNvZGUgPSBEYXRhTW9kZWwuTWV0YWNvZGVzLmdldChtZXRhY29kZUlkKVxuICAgICAgICBjb25zdCBpbWcgPSBtZXRhY29kZSA/IG1ldGFjb2RlLmdldCgnaW1hZ2UnKSA6IGZhbHNlXG5cbiAgICAgICAgaWYgKGltZyAmJiAoaW1nLmNvbXBsZXRlIHx8ICh0eXBlb2YgaW1nLm5hdHVyYWxXaWR0aCAhPT0gJ3VuZGVmaW5lZCcgJiYgaW1nLm5hdHVyYWxXaWR0aCAhPT0gMCkpKSB7XG4gICAgICAgICAgbG9hZGVkQ291bnQgKz0gMVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBpZiAobG9hZGVkQ291bnQgPT09IHJlcXVpcmVkTWV0YWNvZGVzLmxlbmd0aCB8fCB0cmllcyA+IDgwKSB7XG4gICAgICAgIHJ1bkFuaW1hdGlvbigpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0cmllcysrOyBob2xkKCkgfSwgNTApXG4gICAgICB9XG4gICAgfVxuICAgIGhvbGQoKVxuXG4gICAgLy8gdXBkYXRlIHRoZSB1cmwgbm93IHRoYXQgdGhlIG1hcCBpcyByZWFkeVxuICAgIGNsZWFyVGltZW91dChSb3V0ZXIudGltZW91dElkKVxuICAgIFJvdXRlci50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG0gPSBBY3RpdmUuTWFwXG4gICAgICB2YXIgdCA9IEFjdGl2ZS5Ub3BpY1xuICAgICAgXG4gICAgICBpZiAobSAmJiB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgPT09ICcvbWFwcy8nICsgbS5pZCArICcvY29udmVyc2F0aW9uJykgcmV0dXJuXG5cbiAgICAgIGlmIChtICYmIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSAhPT0gJy9tYXBzLycgKyBtLmlkKSB7XG4gICAgICAgIFJvdXRlci5uYXZpZ2F0ZUFuZFRyYWNrKCcvbWFwcy8nICsgbS5pZClcbiAgICAgIH0gZWxzZSBpZiAodCAmJiB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgIT09ICcvdG9waWNzLycgKyB0LmlkKSB7XG4gICAgICAgIFJvdXRlci5uYXZpZ2F0ZUFuZFRyYWNrKCcvdG9waWNzLycgKyB0LmlkKVxuICAgICAgfVxuICAgIH0sIDgwMClcbiAgfSxcbiAgY2xlYXJWaXN1YWxpemF0aW9uOiBmdW5jdGlvbigpIHtcbiAgICBWaXN1YWxpemUubUdyYXBoLmdyYXBoLmVtcHR5KClcbiAgICBWaXN1YWxpemUubUdyYXBoLnBsb3QoKVxuICAgIEpJVC5jZW50ZXJNYXAoVmlzdWFsaXplLm1HcmFwaC5jYW52YXMpXG4gICAgJCgnI2luZm92aXMnKS5lbXB0eSgpXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVmlzdWFsaXplXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL01ldGFtYXBzL1Zpc3VhbGl6ZS5qcyJdLCJtYXBwaW5ncyI6Ijs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 562 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseUniq = __webpack_require__(563);\n\n/**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\nfunction uniq(array) {\n  return (array && array.length) ? baseUniq(array) : [];\n}\n\nmodule.exports = uniq;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvdW5pcS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZVVuaXEgPSByZXF1aXJlKCcuL19iYXNlVW5pcScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBkdXBsaWNhdGUtZnJlZSB2ZXJzaW9uIG9mIGFuIGFycmF5LCB1c2luZ1xuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucywgaW4gd2hpY2ggb25seSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBlYWNoIGVsZW1lbnRcbiAqIGlzIGtlcHQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXJcbiAqIGluIHRoZSBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udW5pcShbMiwgMSwgMl0pO1xuICogLy8gPT4gWzIsIDFdXG4gKi9cbmZ1bmN0aW9uIHVuaXEoYXJyYXkpIHtcbiAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZVVuaXEoYXJyYXkpIDogW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdW5pcTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvdW5pcS5qc1xuLy8gbW9kdWxlIGlkID0gNTYyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 563 */
/***/ function(module, exports, __webpack_require__) {

    eval("var SetCache = __webpack_require__(73),\n    arrayIncludes = __webpack_require__(359),\n    arrayIncludesWith = __webpack_require__(360),\n    cacheHas = __webpack_require__(77),\n    createSet = __webpack_require__(564),\n    setToArray = __webpack_require__(81);\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n  var index = -1,\n      includes = arrayIncludes,\n      length = array.length,\n      isCommon = true,\n      result = [],\n      seen = result;\n\n  if (comparator) {\n    isCommon = false;\n    includes = arrayIncludesWith;\n  }\n  else if (length >= LARGE_ARRAY_SIZE) {\n    var set = iteratee ? null : createSet(array);\n    if (set) {\n      return setToArray(set);\n    }\n    isCommon = false;\n    includes = cacheHas;\n    seen = new SetCache;\n  }\n  else {\n    seen = iteratee ? [] : result;\n  }\n  outer:\n  while (++index < length) {\n    var value = array[index],\n        computed = iteratee ? iteratee(value) : value;\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (isCommon && computed === computed) {\n      var seenIndex = seen.length;\n      while (seenIndex--) {\n        if (seen[seenIndex] === computed) {\n          continue outer;\n        }\n      }\n      if (iteratee) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n    else if (!includes(seen, computed, comparator)) {\n      if (seen !== result) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseUniq;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VVbmlxLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBTZXRDYWNoZSA9IHJlcXVpcmUoJy4vX1NldENhY2hlJyksXG4gICAgYXJyYXlJbmNsdWRlcyA9IHJlcXVpcmUoJy4vX2FycmF5SW5jbHVkZXMnKSxcbiAgICBhcnJheUluY2x1ZGVzV2l0aCA9IHJlcXVpcmUoJy4vX2FycmF5SW5jbHVkZXNXaXRoJyksXG4gICAgY2FjaGVIYXMgPSByZXF1aXJlKCcuL19jYWNoZUhhcycpLFxuICAgIGNyZWF0ZVNldCA9IHJlcXVpcmUoJy4vX2NyZWF0ZVNldCcpLFxuICAgIHNldFRvQXJyYXkgPSByZXF1aXJlKCcuL19zZXRUb0FycmF5Jyk7XG5cbi8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xudmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5pcUJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VVbmlxKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIGlzQ29tbW9uID0gdHJ1ZSxcbiAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgc2VlbiA9IHJlc3VsdDtcblxuICBpZiAoY29tcGFyYXRvcikge1xuICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiAgfVxuICBlbHNlIGlmIChsZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkge1xuICAgIHZhciBzZXQgPSBpdGVyYXRlZSA/IG51bGwgOiBjcmVhdGVTZXQoYXJyYXkpO1xuICAgIGlmIChzZXQpIHtcbiAgICAgIHJldHVybiBzZXRUb0FycmF5KHNldCk7XG4gICAgfVxuICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICBzZWVuID0gbmV3IFNldENhY2hlO1xuICB9XG4gIGVsc2Uge1xuICAgIHNlZW4gPSBpdGVyYXRlZSA/IFtdIDogcmVzdWx0O1xuICB9XG4gIG91dGVyOlxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgaWYgKGlzQ29tbW9uICYmIGNvbXB1dGVkID09PSBjb21wdXRlZCkge1xuICAgICAgdmFyIHNlZW5JbmRleCA9IHNlZW4ubGVuZ3RoO1xuICAgICAgd2hpbGUgKHNlZW5JbmRleC0tKSB7XG4gICAgICAgIGlmIChzZWVuW3NlZW5JbmRleF0gPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIGlmICghaW5jbHVkZXMoc2VlbiwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKSB7XG4gICAgICBpZiAoc2VlbiAhPT0gcmVzdWx0KSB7XG4gICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVVuaXE7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL19iYXNlVW5pcS5qc1xuLy8gbW9kdWxlIGlkID0gNTYzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 564 */
/***/ function(module, exports, __webpack_require__) {

    eval("var Set = __webpack_require__(112),\n    noop = __webpack_require__(565),\n    setToArray = __webpack_require__(81);\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n  return new Set(values);\n};\n\nmodule.exports = createSet;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZVNldC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgU2V0ID0gcmVxdWlyZSgnLi9fU2V0JyksXG4gICAgbm9vcCA9IHJlcXVpcmUoJy4vbm9vcCcpLFxuICAgIHNldFRvQXJyYXkgPSByZXF1aXJlKCcuL19zZXRUb0FycmF5Jyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNldCBvYmplY3Qgb2YgYHZhbHVlc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFkZCB0byB0aGUgc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IHNldC5cbiAqL1xudmFyIGNyZWF0ZVNldCA9ICEoU2V0ICYmICgxIC8gc2V0VG9BcnJheShuZXcgU2V0KFssLTBdKSlbMV0pID09IElORklOSVRZKSA/IG5vb3AgOiBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgcmV0dXJuIG5ldyBTZXQodmFsdWVzKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlU2V0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fY3JlYXRlU2V0LmpzXG4vLyBtb2R1bGUgaWQgPSA1NjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 565 */
/***/ function(module, exports) {

    eval("/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n  // No operation performed.\n}\n\nmodule.exports = noop;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvbm9vcC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBleGFtcGxlXG4gKlxuICogXy50aW1lcygyLCBfLm5vb3ApO1xuICogLy8gPT4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXVxuICovXG5mdW5jdGlvbiBub29wKCkge1xuICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkLlxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5vb3A7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbG9kYXNoL25vb3AuanNcbi8vIG1vZHVsZSBpZCA9IDU2NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 566 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _DataModel = __webpack_require__(149);var _DataModel2 = _interopRequireDefault(_DataModel);\nvar _GlobalUI = __webpack_require__(362);var _GlobalUI2 = _interopRequireDefault(_GlobalUI);\nvar _Mapper = __webpack_require__(434);var _Mapper2 = _interopRequireDefault(_Mapper);\nvar _Router = __webpack_require__(367);var _Router2 = _interopRequireDefault(_Router);\nvar _Util = __webpack_require__(410);var _Util2 = _interopRequireDefault(_Util);\nvar _Visualize = __webpack_require__(561);var _Visualize2 = _interopRequireDefault(_Visualize);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}\n\nvar TopicCard = {\n  openTopicCard: null, // stores the topic that's currently open\n  authorizedToEdit: false, // stores boolean for edit permission for open topic card\n  RAILS_ENV: undefined,\n  init: function init(serverData) {\n    var self = TopicCard;\n\n    if (serverData.RAILS_ENV) {\n      self.RAILS_ENV = serverData.RAILS_ENV;\n    } else {\n      console.error('RAILS_ENV is not defined! See TopicCard.js init function.');\n    }\n\n    // initialize best_in_place editing\n    $('.authenticated div.permission.canEdit .best_in_place').best_in_place();\n\n    TopicCard.generateShowcardHTML = Hogan.compile($('#topicCardTemplate').html());\n\n    // initialize topic card draggability and resizability\n    $('.showcard').draggable({\n      handle: '.metacodeImage',\n      stop: function stop() {\n        $(this).height('auto');\n      } });\n\n\n    embedly('on', 'card.rendered', self.embedlyCardRendered);\n  },\n  /**\n      * Will open the Topic Card for the node that it's passed\n      * @param {$jit.Graph.Node} node\n      */\n  showCard: function showCard(node, opts) {\n    var self = TopicCard;\n    if (!opts) opts = {};\n    var topic = node.getData('topic');\n\n    self.openTopicCard = topic;\n    self.authorizedToEdit = topic.authorizeToEdit(_Active2.default.Mapper);\n    // populate the card that's about to show with the right topics data\n    self.populateShowCard(topic);\n    return $('.showcard').fadeIn('fast', function () {\n      if (opts.complete) {\n        opts.complete();\n      }\n    });\n  },\n  hideCard: function hideCard() {\n    var self = TopicCard;\n\n    $('.showcard').fadeOut('fast');\n    self.openTopicCard = null;\n    self.authorizedToEdit = false;\n  },\n  embedlyCardRendered: function embedlyCardRendered(iframe) {\n    $('#embedlyLinkLoader').hide();\n\n    // means that the embedly call returned 404 not found\n    if ($('#embedlyLink')[0]) {\n      $('#embedlyLink').css('display', 'block').fadeIn('fast');\n      $('.embeds').addClass('nonEmbedlyLink');\n    }\n\n    $('.CardOnGraph').addClass('hasAttachment');\n  },\n  showLinkRemover: function showLinkRemover() {\n    if (TopicCard.authorizedToEdit && $('#linkremove').length === 0) {\n      $('.embeds').append('<div id=\"linkremove\"></div>');\n      $('#linkremove').click(TopicCard.removeLink);\n    }\n  },\n  removeLink: function removeLink() {\n    var self = TopicCard;\n    self.openTopicCard.save({\n      link: null });\n\n    $('.embeds').empty().removeClass('nonEmbedlyLink');\n    $('#addLinkInput input').val('');\n    $('.attachments').removeClass('hidden');\n    $('.CardOnGraph').removeClass('hasAttachment');\n  },\n  showLinkLoader: function showLinkLoader() {\n    var loader = new CanvasLoader('embedlyLinkLoader');\n    loader.setColor('#4fb5c0'); // default is '#000000'\n    loader.setDiameter(28); // default is 40\n    loader.setDensity(41); // default is 40\n    loader.setRange(0.9); // default is 1.3\n    loader.show(); // Hidden by default\n  },\n  showLink: function showLink(topic) {\n    var e = embedly('card', document.getElementById('embedlyLink'));\n    if (!e && TopicCard.RAILS_ENV !== 'development') {\n      TopicCard.handleInvalidLink();\n    } else if (!e) {\n      $('#embedlyLink').attr('target', '_blank').html(topic.get('link')).show();\n      $('#embedlyLinkLoader').hide();\n    }\n  },\n  bindShowCardListeners: function bindShowCardListeners(topic) {\n    var self = TopicCard;\n    var showCard = document.getElementById('showcard');\n\n    var authorized = self.authorizedToEdit;\n\n    // get mapper image\n    var setMapperImage = function setMapperImage(mapper) {\n      $('.contributorIcon').attr('src', mapper.get('image'));\n    };\n    _Mapper2.default.get(topic.get('user_id'), setMapperImage);\n\n    // starting embed.ly\n    var resetFunc = function resetFunc() {\n      $('#addLinkInput input').val('');\n      $('#addLinkInput input').focus();\n    };\n    var inputEmbedFunc = function inputEmbedFunc(event) {\n      var element = this;\n      setTimeout(function () {\n        var text = $(element).val();\n        if (event.type === 'paste' || event.type === 'keyup' && event.which === 13) {\n          // TODO evaluate converting this to '//' no matter what (infer protocol)\n          if (text.slice(0, 7) !== 'http://' &&\n          text.slice(0, 8) !== 'https://' &&\n          text.slice(0, 2) !== '//') {\n            text = '//' + text;\n          }\n          topic.save({\n            link: text });\n\n          var embedlyEl = $('<a/>', {\n            id: 'embedlyLink',\n            'data-card-description': '0',\n            href: text }).\n          html(text);\n          $('.attachments').addClass('hidden');\n          $('.embeds').append(embedlyEl);\n          $('.embeds').append('<div id=\"embedlyLinkLoader\"></div>');\n\n          self.showLinkLoader();\n          self.showLink(topic);\n        }\n      }, 100);\n    };\n    $('#addLinkReset').click(resetFunc);\n    $('#addLinkInput input').bind('paste keyup', inputEmbedFunc);\n\n    // initialize the link card, if there is a link\n    if (topic.get('link') && topic.get('link') !== '') {\n      self.showLinkLoader();\n      self.showLink(topic);\n      self.showLinkRemover();\n    }\n\n    var selectingMetacode = false;\n    // attach the listener that shows the metacode title when you hover over the image\n    $('.showcard .metacodeImage').mouseenter(function () {\n      $('.showcard .icon').css('z-index', '4');\n      $('.showcard .metacodeTitle').show();\n    });\n    $('.showcard .linkItem.icon').mouseleave(function () {\n      if (!selectingMetacode) {\n        $('.showcard .metacodeTitle').hide();\n        $('.showcard .icon').css('z-index', '1');\n      }\n    });\n\n    var metacodeLiClick = function metacodeLiClick() {\n      selectingMetacode = false;\n      var metacodeId = parseInt($(this).attr('data-id'));\n      var metacode = _DataModel2.default.Metacodes.get(metacodeId);\n      $('.CardOnGraph').find('.metacodeTitle').html(metacode.get('name')).\n      append('<div class=\"expandMetacodeSelect\"></div>').\n      attr('class', 'metacodeTitle mbg' + metacode.id);\n      $('.CardOnGraph').find('.metacodeImage').css('background-image', 'url(' + metacode.get('icon') + ')');\n      topic.save({\n        metacode_id: metacode.id });\n\n      _Visualize2.default.mGraph.plot();\n      $('.metacodeSelect').hide().removeClass('onRightEdge onBottomEdge');\n      $('.metacodeTitle').hide();\n      $('.showcard .icon').css('z-index', '1');\n    };\n\n    var openMetacodeSelect = function openMetacodeSelect(event) {\n      var TOPICCARD_WIDTH = 300;\n      var METACODESELECT_WIDTH = 404;\n      var MAX_METACODELIST_HEIGHT = 270;\n\n      if (!selectingMetacode) {\n        selectingMetacode = true;\n\n        // this is to make sure the metacode\n        // select is accessible onscreen, when opened\n        // while topic card is close to the right\n        // edge of the screen\n        var windowWidth = $(window).width();\n        var showcardLeft = parseInt($('.showcard').css('left'));\n        var distanceFromEdge = windowWidth - (showcardLeft + TOPICCARD_WIDTH);\n        if (distanceFromEdge < METACODESELECT_WIDTH) {\n          $('.metacodeSelect').addClass('onRightEdge');\n        }\n\n        // this is to make sure the metacode\n        // select is accessible onscreen, when opened\n        // while topic card is close to the bottom\n        // edge of the screen\n        var windowHeight = $(window).height();\n        var showcardTop = parseInt($('.showcard').css('top'));\n        var topicTitleHeight = $('.showcard .title').height() + parseInt($('.showcard .title').css('padding-top')) + parseInt($('.showcard .title').css('padding-bottom'));\n        var distanceFromBottom = windowHeight - (showcardTop + topicTitleHeight);\n        if (distanceFromBottom < MAX_METACODELIST_HEIGHT) {\n          $('.metacodeSelect').addClass('onBottomEdge');\n        }\n\n        $('.metacodeSelect').show();\n        event.stopPropagation();\n      }\n    };\n\n    var hideMetacodeSelect = function hideMetacodeSelect() {\n      selectingMetacode = false;\n      $('.metacodeSelect').hide().removeClass('onRightEdge onBottomEdge');\n      $('.metacodeTitle').hide();\n      $('.showcard .icon').css('z-index', '1');\n    };\n\n    if (authorized) {\n      $('.showcard .metacodeTitle').click(openMetacodeSelect);\n      $('.showcard').click(hideMetacodeSelect);\n      $('.metacodeSelect > ul > li').click(function (event) {\n        event.stopPropagation();\n      });\n      $('.metacodeSelect li li').click(metacodeLiClick);\n\n      var bipName = $(showCard).find('.best_in_place_name');\n      bipName.bind('best_in_place:activate', function () {\n        var $el = bipName.find('textarea');\n        var el = $el[0];\n\n        $el.attr('maxlength', '140');\n\n        $('.showcard .title').append('<div class=\"nameCounter forTopic\"></div>');\n\n        var callback = function callback(data) {\n          $('.nameCounter.forTopic').html(data.all + '/140');\n        };\n        Countable.live(el, callback);\n      });\n      bipName.bind('best_in_place:deactivate', function () {\n        $('.nameCounter.forTopic').remove();\n      });\n      bipName.keypress(function (e) {\n        var ENTER = 13;\n        if (e.which === ENTER) {// enter\n          $(this).data('bestInPlaceEditor').update();\n        }\n      });\n\n      // bind best_in_place ajax callbacks\n      bipName.bind('ajax:success', function () {\n        var name = _Util2.default.decodeEntities($(this).html());\n        topic.set('name', name);\n        topic.trigger('saved');\n      });\n\n      // this is for all subsequent renders after in-place editing the desc field\n      var bipDesc = $(showCard).find('.best_in_place_desc');\n      bipDesc.bind('ajax:success', function () {\n        var desc = $(this).html() === $(this).data('bip-nil') ?\n        '' :\n        $(this).text();\n        topic.set('desc', desc);\n        $(this).data('bip-value', desc);\n        this.innerHTML = _Util2.default.mdToHTML(desc);\n        topic.trigger('saved');\n      });\n      bipDesc.keypress(function (e) {\n        // allow typing Enter with Shift+Enter\n        var ENTER = 13;\n        if (e.shiftKey === false && e.which === ENTER) {\n          $(this).data('bestInPlaceEditor').update();\n        }\n      });\n    }\n\n    var permissionLiClick = function permissionLiClick(event) {\n      selectingPermission = false;\n      var permission = $(this).attr('class');\n      topic.save({\n        permission: permission,\n        defer_to_map_id: null });\n\n      $('.showcard .mapPerm').removeClass('co pu pr minimize').addClass(permission.substring(0, 2));\n      $('.showcard .permissionSelect').remove();\n      event.stopPropagation();\n    };\n\n    var openPermissionSelect = function openPermissionSelect(event) {\n      if (!selectingPermission) {\n        selectingPermission = true;\n        $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow\n        if ($(this).hasClass('co')) {\n          $(this).append('<ul class=\"permissionSelect\"><li class=\"public\"></li><li class=\"private\"></li></ul>');\n        } else if ($(this).hasClass('pu')) {\n          $(this).append('<ul class=\"permissionSelect\"><li class=\"commons\"></li><li class=\"private\"></li></ul>');\n        } else if ($(this).hasClass('pr')) {\n          $(this).append('<ul class=\"permissionSelect\"><li class=\"commons\"></li><li class=\"public\"></li></ul>');\n        }\n        $('.showcard .permissionSelect li').click(permissionLiClick);\n        event.stopPropagation();\n      }\n    };\n\n    var hidePermissionSelect = function hidePermissionSelect() {\n      selectingPermission = false;\n      $('.showcard .yourTopic .mapPerm').removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow\n      $('.showcard .permissionSelect').remove();\n    };\n    // ability to change permission\n    var selectingPermission = false;\n    if (topic.authorizePermissionChange(_Active2.default.Mapper)) {\n      $('.showcard .yourTopic .mapPerm').click(openPermissionSelect);\n      $('.showcard').click(hidePermissionSelect);\n    }\n\n    $('.links .mapCount').unbind().click(function (event) {\n      $('.mapCount .tip').toggle();\n      $('.showcard .hoverTip').toggleClass('hide');\n      event.stopPropagation();\n    });\n    $('.mapCount .tip').unbind().click(function (event) {\n      event.stopPropagation();\n    });\n    $('.showcard').unbind('.hideTip').bind('click.hideTip', function () {\n      $('.mapCount .tip').hide();\n      $('.showcard .hoverTip').removeClass('hide');\n    });\n\n    $('.mapCount .tip li a').click(_Router2.default.intercept);\n\n    var originalText = $('.showMore').html();\n    $('.mapCount .tip .showMore').unbind().toggle(\n    function (event) {\n      $('.extraText').toggleClass('hideExtra');\n      $('.showMore').html('Show less...');\n    },\n    function (event) {\n      $('.extraText').toggleClass('hideExtra');\n      $('.showMore').html(originalText);\n    });\n\n    $('.mapCount .tip showMore').unbind().click(function (event) {\n      event.stopPropagation();\n    });\n  },\n  handleInvalidLink: function handleInvalidLink() {\n    var self = TopicCard;\n\n    self.removeLink();\n    _GlobalUI2.default.notifyUser('Invalid link');\n  },\n  populateShowCard: function populateShowCard(topic) {\n    var self = TopicCard;\n\n    var showCard = document.getElementById('showcard');\n\n    $(showCard).find('.permission').remove();\n\n    var topicForTemplate = self.buildObject(topic);\n    var html = self.generateShowcardHTML.render(topicForTemplate);\n\n    if (topic.authorizeToEdit(_Active2.default.Mapper)) {\n      var perm = document.createElement('div');\n\n      var string = 'permission canEdit';\n      if (topic.authorizePermissionChange(_Active2.default.Mapper)) string += ' yourTopic';\n      perm.className = string;\n      perm.innerHTML = html;\n      showCard.appendChild(perm);\n    } else {\n      var _perm = document.createElement('div');\n      _perm.className = 'permission cannotEdit';\n      _perm.innerHTML = html;\n      showCard.appendChild(_perm);\n    }\n\n    TopicCard.bindShowCardListeners(topic);\n  },\n  generateShowcardHTML: null, // will be initialized into a Hogan template within init function\n  // generateShowcardHTML\n  buildObject: function buildObject(topic) {\n    var nodeValues = {};\n\n    var authorized = topic.authorizeToEdit(_Active2.default.Mapper);\n\n    if (!authorized) {\n    } else {\n    }\n\n    nodeValues.attachmentsHidden = '';\n    if (topic.get('link') && topic.get('link') !== '') {\n      nodeValues.embeds = '<a href=\"' + topic.get('link') + '\" id=\"embedlyLink\" target=\"_blank\" data-card-description=\"0\">';\n      nodeValues.embeds += topic.get('link');\n      nodeValues.embeds += '</a><div id=\"embedlyLinkLoader\"></div>';\n      nodeValues.attachmentsHidden = 'hidden';\n      nodeValues.hasAttachment = 'hasAttachment';\n    } else {\n      nodeValues.embeds = '';\n      nodeValues.hasAttachment = '';\n    }\n\n    if (authorized) {\n      nodeValues.attachments = '<div class=\"addLink\"><div id=\"addLinkIcon\"></div>';\n      nodeValues.attachments += '<div id=\"addLinkInput\"><input placeholder=\"Enter or paste a link\"></input>';\n      nodeValues.attachments += '<div id=\"addLinkReset\"></div></div></div>';\n    } else {\n      nodeValues.attachmentsHidden = 'hidden';\n      nodeValues.attachments = '';\n    }\n\n    var inmapsAr = topic.get('inmaps') || [];\n    var inmapsLinks = topic.get('inmapsLinks') || [];\n    nodeValues.inmaps = '';\n    if (inmapsAr.length < 6) {\n      for (var i = 0; i < inmapsAr.length; i++) {\n        var url = '/maps/' + inmapsLinks[i];\n        nodeValues.inmaps += '<li><a href=\"' + url + '\">' + inmapsAr[i] + '</a></li>';\n      }\n    } else {\n      for (var _i = 0; _i < 5; _i++) {\n        var _url = '/maps/' + inmapsLinks[_i];\n        nodeValues.inmaps += '<li><a href=\"' + _url + '\">' + inmapsAr[_i] + '</a></li>';\n      }\n      var extra = inmapsAr.length - 5;\n      nodeValues.inmaps += '<li><span class=\"showMore\">See ' + extra + ' more...</span></li>';\n      for (var _i2 = 5; _i2 < inmapsAr.length; _i2++) {\n        var _url2 = '/maps/' + inmapsLinks[_i2];\n        nodeValues.inmaps += '<li class=\"hideExtra extraText\"><a href=\"' + _url2 + '\">' + inmapsAr[_i2] + '</a></li>';\n      }\n    }\n    nodeValues.permission = topic.get('permission');\n    nodeValues.mk_permission = topic.get('permission').substring(0, 2);\n    nodeValues.map_count = topic.get('map_count').toString();\n    nodeValues.synapse_count = topic.get('synapse_count').toString();\n    nodeValues.id = topic.isNew() ? topic.cid : topic.id;\n    nodeValues.metacode = topic.getMetacode().get('name');\n    nodeValues.metacode_class = 'mbg' + topic.get('metacode_id');\n    nodeValues.imgsrc = topic.getMetacode().get('icon');\n    nodeValues.name = topic.get('name');\n    nodeValues.userid = topic.get('user_id');\n    nodeValues.username = topic.get('user_name');\n    nodeValues.date = topic.getDate();\n    // the code for this is stored in /views/main/_metacodeOptions.html.erb\n    nodeValues.metacode_select = $('#metacodeOptions').html();\n    nodeValues.desc_nil = 'Click to add description...';\n    nodeValues.desc_markdown = topic.get('desc') === '' && authorized ?\n    nodeValues.desc_nil :\n    topic.get('desc');\n    nodeValues.desc_html = _Util2.default.mdToHTML(nodeValues.desc_markdown);\n    return nodeValues;\n  } }; /* global $, CanvasLoader, Countable, Hogan, embedly */exports.default =\n\n\nTopicCard;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY2LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvVG9waWNDYXJkLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGdsb2JhbCAkLCBDYW52YXNMb2FkZXIsIENvdW50YWJsZSwgSG9nYW4sIGVtYmVkbHkgKi9cblxuaW1wb3J0IEFjdGl2ZSBmcm9tICcuL0FjdGl2ZSdcbmltcG9ydCBEYXRhTW9kZWwgZnJvbSAnLi9EYXRhTW9kZWwnXG5pbXBvcnQgR2xvYmFsVUkgZnJvbSAnLi9HbG9iYWxVSSdcbmltcG9ydCBNYXBwZXIgZnJvbSAnLi9NYXBwZXInXG5pbXBvcnQgUm91dGVyIGZyb20gJy4vUm91dGVyJ1xuaW1wb3J0IFV0aWwgZnJvbSAnLi9VdGlsJ1xuaW1wb3J0IFZpc3VhbGl6ZSBmcm9tICcuL1Zpc3VhbGl6ZSdcblxuY29uc3QgVG9waWNDYXJkID0ge1xuICBvcGVuVG9waWNDYXJkOiBudWxsLCAvLyBzdG9yZXMgdGhlIHRvcGljIHRoYXQncyBjdXJyZW50bHkgb3BlblxuICBhdXRob3JpemVkVG9FZGl0OiBmYWxzZSwgLy8gc3RvcmVzIGJvb2xlYW4gZm9yIGVkaXQgcGVybWlzc2lvbiBmb3Igb3BlbiB0b3BpYyBjYXJkXG4gIFJBSUxTX0VOVjogdW5kZWZpbmVkLFxuICBpbml0OiBmdW5jdGlvbihzZXJ2ZXJEYXRhKSB7XG4gICAgdmFyIHNlbGYgPSBUb3BpY0NhcmRcblxuICAgIGlmIChzZXJ2ZXJEYXRhLlJBSUxTX0VOVikge1xuICAgICAgc2VsZi5SQUlMU19FTlYgPSBzZXJ2ZXJEYXRhLlJBSUxTX0VOVlxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdSQUlMU19FTlYgaXMgbm90IGRlZmluZWQhIFNlZSBUb3BpY0NhcmQuanMgaW5pdCBmdW5jdGlvbi4nKVxuICAgIH1cblxuICAgIC8vIGluaXRpYWxpemUgYmVzdF9pbl9wbGFjZSBlZGl0aW5nXG4gICAgJCgnLmF1dGhlbnRpY2F0ZWQgZGl2LnBlcm1pc3Npb24uY2FuRWRpdCAuYmVzdF9pbl9wbGFjZScpLmJlc3RfaW5fcGxhY2UoKVxuXG4gICAgVG9waWNDYXJkLmdlbmVyYXRlU2hvd2NhcmRIVE1MID0gSG9nYW4uY29tcGlsZSgkKCcjdG9waWNDYXJkVGVtcGxhdGUnKS5odG1sKCkpXG5cbiAgICAvLyBpbml0aWFsaXplIHRvcGljIGNhcmQgZHJhZ2dhYmlsaXR5IGFuZCByZXNpemFiaWxpdHlcbiAgICAkKCcuc2hvd2NhcmQnKS5kcmFnZ2FibGUoe1xuICAgICAgaGFuZGxlOiAnLm1ldGFjb2RlSW1hZ2UnLFxuICAgICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICAgICQodGhpcykuaGVpZ2h0KCdhdXRvJylcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgZW1iZWRseSgnb24nLCAnY2FyZC5yZW5kZXJlZCcsIHNlbGYuZW1iZWRseUNhcmRSZW5kZXJlZClcbiAgfSxcbiAgLyoqXG4gICAqIFdpbGwgb3BlbiB0aGUgVG9waWMgQ2FyZCBmb3IgdGhlIG5vZGUgdGhhdCBpdCdzIHBhc3NlZFxuICAgKiBAcGFyYW0geyRqaXQuR3JhcGguTm9kZX0gbm9kZVxuICAgKi9cbiAgc2hvd0NhcmQ6IGZ1bmN0aW9uKG5vZGUsIG9wdHMpIHtcbiAgICB2YXIgc2VsZiA9IFRvcGljQ2FyZFxuICAgIGlmICghb3B0cykgb3B0cyA9IHt9XG4gICAgdmFyIHRvcGljID0gbm9kZS5nZXREYXRhKCd0b3BpYycpXG5cbiAgICBzZWxmLm9wZW5Ub3BpY0NhcmQgPSB0b3BpY1xuICAgIHNlbGYuYXV0aG9yaXplZFRvRWRpdCA9IHRvcGljLmF1dGhvcml6ZVRvRWRpdChBY3RpdmUuTWFwcGVyKVxuICAgIC8vIHBvcHVsYXRlIHRoZSBjYXJkIHRoYXQncyBhYm91dCB0byBzaG93IHdpdGggdGhlIHJpZ2h0IHRvcGljcyBkYXRhXG4gICAgc2VsZi5wb3B1bGF0ZVNob3dDYXJkKHRvcGljKVxuICAgIHJldHVybiAkKCcuc2hvd2NhcmQnKS5mYWRlSW4oJ2Zhc3QnLCBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChvcHRzLmNvbXBsZXRlKSB7XG4gICAgICAgIG9wdHMuY29tcGxldGUoKVxuICAgICAgfVxuICAgIH0pXG4gIH0sXG4gIGhpZGVDYXJkOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IFRvcGljQ2FyZFxuXG4gICAgJCgnLnNob3djYXJkJykuZmFkZU91dCgnZmFzdCcpXG4gICAgc2VsZi5vcGVuVG9waWNDYXJkID0gbnVsbFxuICAgIHNlbGYuYXV0aG9yaXplZFRvRWRpdCA9IGZhbHNlXG4gIH0sXG4gIGVtYmVkbHlDYXJkUmVuZGVyZWQ6IGZ1bmN0aW9uKGlmcmFtZSkge1xuICAgICQoJyNlbWJlZGx5TGlua0xvYWRlcicpLmhpZGUoKVxuXG4gICAgLy8gbWVhbnMgdGhhdCB0aGUgZW1iZWRseSBjYWxsIHJldHVybmVkIDQwNCBub3QgZm91bmRcbiAgICBpZiAoJCgnI2VtYmVkbHlMaW5rJylbMF0pIHtcbiAgICAgICQoJyNlbWJlZGx5TGluaycpLmNzcygnZGlzcGxheScsICdibG9jaycpLmZhZGVJbignZmFzdCcpXG4gICAgICAkKCcuZW1iZWRzJykuYWRkQ2xhc3MoJ25vbkVtYmVkbHlMaW5rJylcbiAgICB9XG5cbiAgICAkKCcuQ2FyZE9uR3JhcGgnKS5hZGRDbGFzcygnaGFzQXR0YWNobWVudCcpXG4gIH0sXG4gIHNob3dMaW5rUmVtb3ZlcjogZnVuY3Rpb24oKSB7XG4gICAgaWYgKFRvcGljQ2FyZC5hdXRob3JpemVkVG9FZGl0ICYmICQoJyNsaW5rcmVtb3ZlJykubGVuZ3RoID09PSAwKSB7XG4gICAgICAkKCcuZW1iZWRzJykuYXBwZW5kKCc8ZGl2IGlkPVwibGlua3JlbW92ZVwiPjwvZGl2PicpXG4gICAgICAkKCcjbGlua3JlbW92ZScpLmNsaWNrKFRvcGljQ2FyZC5yZW1vdmVMaW5rKVxuICAgIH1cbiAgfSxcbiAgcmVtb3ZlTGluazogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSBUb3BpY0NhcmRcbiAgICBzZWxmLm9wZW5Ub3BpY0NhcmQuc2F2ZSh7XG4gICAgICBsaW5rOiBudWxsXG4gICAgfSlcbiAgICAkKCcuZW1iZWRzJykuZW1wdHkoKS5yZW1vdmVDbGFzcygnbm9uRW1iZWRseUxpbmsnKVxuICAgICQoJyNhZGRMaW5rSW5wdXQgaW5wdXQnKS52YWwoJycpXG4gICAgJCgnLmF0dGFjaG1lbnRzJykucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpXG4gICAgJCgnLkNhcmRPbkdyYXBoJykucmVtb3ZlQ2xhc3MoJ2hhc0F0dGFjaG1lbnQnKVxuICB9LFxuICBzaG93TGlua0xvYWRlcjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxvYWRlciA9IG5ldyBDYW52YXNMb2FkZXIoJ2VtYmVkbHlMaW5rTG9hZGVyJylcbiAgICBsb2FkZXIuc2V0Q29sb3IoJyM0ZmI1YzAnKSAvLyBkZWZhdWx0IGlzICcjMDAwMDAwJ1xuICAgIGxvYWRlci5zZXREaWFtZXRlcigyOCkgLy8gZGVmYXVsdCBpcyA0MFxuICAgIGxvYWRlci5zZXREZW5zaXR5KDQxKSAvLyBkZWZhdWx0IGlzIDQwXG4gICAgbG9hZGVyLnNldFJhbmdlKDAuOSkgLy8gZGVmYXVsdCBpcyAxLjNcbiAgICBsb2FkZXIuc2hvdygpIC8vIEhpZGRlbiBieSBkZWZhdWx0XG4gIH0sXG4gIHNob3dMaW5rOiBmdW5jdGlvbih0b3BpYykge1xuICAgIHZhciBlID0gZW1iZWRseSgnY2FyZCcsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWJlZGx5TGluaycpKVxuICAgIGlmICghZSAmJiBUb3BpY0NhcmQuUkFJTFNfRU5WICE9PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICBUb3BpY0NhcmQuaGFuZGxlSW52YWxpZExpbmsoKVxuICAgIH0gZWxzZSBpZiAoIWUpIHtcbiAgICAgICQoJyNlbWJlZGx5TGluaycpLmF0dHIoJ3RhcmdldCcsICdfYmxhbmsnKS5odG1sKHRvcGljLmdldCgnbGluaycpKS5zaG93KClcbiAgICAgICQoJyNlbWJlZGx5TGlua0xvYWRlcicpLmhpZGUoKVxuICAgIH1cbiAgfSxcbiAgYmluZFNob3dDYXJkTGlzdGVuZXJzOiBmdW5jdGlvbih0b3BpYykge1xuICAgIHZhciBzZWxmID0gVG9waWNDYXJkXG4gICAgdmFyIHNob3dDYXJkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nob3djYXJkJylcblxuICAgIHZhciBhdXRob3JpemVkID0gc2VsZi5hdXRob3JpemVkVG9FZGl0XG5cbiAgICAvLyBnZXQgbWFwcGVyIGltYWdlXG4gICAgdmFyIHNldE1hcHBlckltYWdlID0gZnVuY3Rpb24obWFwcGVyKSB7XG4gICAgICAkKCcuY29udHJpYnV0b3JJY29uJykuYXR0cignc3JjJywgbWFwcGVyLmdldCgnaW1hZ2UnKSlcbiAgICB9XG4gICAgTWFwcGVyLmdldCh0b3BpYy5nZXQoJ3VzZXJfaWQnKSwgc2V0TWFwcGVySW1hZ2UpXG5cbiAgICAvLyBzdGFydGluZyBlbWJlZC5seVxuICAgIHZhciByZXNldEZ1bmMgPSBmdW5jdGlvbigpIHtcbiAgICAgICQoJyNhZGRMaW5rSW5wdXQgaW5wdXQnKS52YWwoJycpXG4gICAgICAkKCcjYWRkTGlua0lucHV0IGlucHV0JykuZm9jdXMoKVxuICAgIH1cbiAgICB2YXIgaW5wdXRFbWJlZEZ1bmMgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdGV4dCA9ICQoZWxlbWVudCkudmFsKClcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdwYXN0ZScgfHwgKGV2ZW50LnR5cGUgPT09ICdrZXl1cCcgJiYgZXZlbnQud2hpY2ggPT09IDEzKSkge1xuICAgICAgICAgIC8vIFRPRE8gZXZhbHVhdGUgY29udmVydGluZyB0aGlzIHRvICcvLycgbm8gbWF0dGVyIHdoYXQgKGluZmVyIHByb3RvY29sKVxuICAgICAgICAgIGlmICh0ZXh0LnNsaWNlKDAsIDcpICE9PSAnaHR0cDovLycgJiZcbiAgICAgICAgICAgIHRleHQuc2xpY2UoMCwgOCkgIT09ICdodHRwczovLycgJiZcbiAgICAgICAgICAgIHRleHQuc2xpY2UoMCwgMikgIT09ICcvLycpIHtcbiAgICAgICAgICAgIHRleHQgPSAnLy8nICsgdGV4dFxuICAgICAgICAgIH1cbiAgICAgICAgICB0b3BpYy5zYXZlKHtcbiAgICAgICAgICAgIGxpbms6IHRleHRcbiAgICAgICAgICB9KVxuICAgICAgICAgIHZhciBlbWJlZGx5RWwgPSAkKCc8YS8+Jywge1xuICAgICAgICAgICAgaWQ6ICdlbWJlZGx5TGluaycsXG4gICAgICAgICAgICAnZGF0YS1jYXJkLWRlc2NyaXB0aW9uJzogJzAnLFxuICAgICAgICAgICAgaHJlZjogdGV4dFxuICAgICAgICAgIH0pLmh0bWwodGV4dClcbiAgICAgICAgICAkKCcuYXR0YWNobWVudHMnKS5hZGRDbGFzcygnaGlkZGVuJylcbiAgICAgICAgICAkKCcuZW1iZWRzJykuYXBwZW5kKGVtYmVkbHlFbClcbiAgICAgICAgICAkKCcuZW1iZWRzJykuYXBwZW5kKCc8ZGl2IGlkPVwiZW1iZWRseUxpbmtMb2FkZXJcIj48L2Rpdj4nKVxuXG4gICAgICAgICAgc2VsZi5zaG93TGlua0xvYWRlcigpXG4gICAgICAgICAgc2VsZi5zaG93TGluayh0b3BpYylcbiAgICAgICAgfVxuICAgICAgfSwgMTAwKVxuICAgIH1cbiAgICAkKCcjYWRkTGlua1Jlc2V0JykuY2xpY2socmVzZXRGdW5jKVxuICAgICQoJyNhZGRMaW5rSW5wdXQgaW5wdXQnKS5iaW5kKCdwYXN0ZSBrZXl1cCcsIGlucHV0RW1iZWRGdW5jKVxuXG4gICAgLy8gaW5pdGlhbGl6ZSB0aGUgbGluayBjYXJkLCBpZiB0aGVyZSBpcyBhIGxpbmtcbiAgICBpZiAodG9waWMuZ2V0KCdsaW5rJykgJiYgdG9waWMuZ2V0KCdsaW5rJykgIT09ICcnKSB7XG4gICAgICBzZWxmLnNob3dMaW5rTG9hZGVyKClcbiAgICAgIHNlbGYuc2hvd0xpbmsodG9waWMpXG4gICAgICBzZWxmLnNob3dMaW5rUmVtb3ZlcigpXG4gICAgfVxuXG4gICAgdmFyIHNlbGVjdGluZ01ldGFjb2RlID0gZmFsc2VcbiAgICAvLyBhdHRhY2ggdGhlIGxpc3RlbmVyIHRoYXQgc2hvd3MgdGhlIG1ldGFjb2RlIHRpdGxlIHdoZW4geW91IGhvdmVyIG92ZXIgdGhlIGltYWdlXG4gICAgJCgnLnNob3djYXJkIC5tZXRhY29kZUltYWdlJykubW91c2VlbnRlcihmdW5jdGlvbigpIHtcbiAgICAgICQoJy5zaG93Y2FyZCAuaWNvbicpLmNzcygnei1pbmRleCcsICc0JylcbiAgICAgICQoJy5zaG93Y2FyZCAubWV0YWNvZGVUaXRsZScpLnNob3coKVxuICAgIH0pXG4gICAgJCgnLnNob3djYXJkIC5saW5rSXRlbS5pY29uJykubW91c2VsZWF2ZShmdW5jdGlvbigpIHtcbiAgICAgIGlmICghc2VsZWN0aW5nTWV0YWNvZGUpIHtcbiAgICAgICAgJCgnLnNob3djYXJkIC5tZXRhY29kZVRpdGxlJykuaGlkZSgpXG4gICAgICAgICQoJy5zaG93Y2FyZCAuaWNvbicpLmNzcygnei1pbmRleCcsICcxJylcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdmFyIG1ldGFjb2RlTGlDbGljayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZWN0aW5nTWV0YWNvZGUgPSBmYWxzZVxuICAgICAgdmFyIG1ldGFjb2RlSWQgPSBwYXJzZUludCgkKHRoaXMpLmF0dHIoJ2RhdGEtaWQnKSlcbiAgICAgIHZhciBtZXRhY29kZSA9IERhdGFNb2RlbC5NZXRhY29kZXMuZ2V0KG1ldGFjb2RlSWQpXG4gICAgICAkKCcuQ2FyZE9uR3JhcGgnKS5maW5kKCcubWV0YWNvZGVUaXRsZScpLmh0bWwobWV0YWNvZGUuZ2V0KCduYW1lJykpXG4gICAgICAgIC5hcHBlbmQoJzxkaXYgY2xhc3M9XCJleHBhbmRNZXRhY29kZVNlbGVjdFwiPjwvZGl2PicpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdtZXRhY29kZVRpdGxlIG1iZycgKyBtZXRhY29kZS5pZClcbiAgICAgICQoJy5DYXJkT25HcmFwaCcpLmZpbmQoJy5tZXRhY29kZUltYWdlJykuY3NzKCdiYWNrZ3JvdW5kLWltYWdlJywgJ3VybCgnICsgbWV0YWNvZGUuZ2V0KCdpY29uJykgKyAnKScpXG4gICAgICB0b3BpYy5zYXZlKHtcbiAgICAgICAgbWV0YWNvZGVfaWQ6IG1ldGFjb2RlLmlkXG4gICAgICB9KVxuICAgICAgVmlzdWFsaXplLm1HcmFwaC5wbG90KClcbiAgICAgICQoJy5tZXRhY29kZVNlbGVjdCcpLmhpZGUoKS5yZW1vdmVDbGFzcygnb25SaWdodEVkZ2Ugb25Cb3R0b21FZGdlJylcbiAgICAgICQoJy5tZXRhY29kZVRpdGxlJykuaGlkZSgpXG4gICAgICAkKCcuc2hvd2NhcmQgLmljb24nKS5jc3MoJ3otaW5kZXgnLCAnMScpXG4gICAgfVxuXG4gICAgdmFyIG9wZW5NZXRhY29kZVNlbGVjdCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICB2YXIgVE9QSUNDQVJEX1dJRFRIID0gMzAwXG4gICAgICB2YXIgTUVUQUNPREVTRUxFQ1RfV0lEVEggPSA0MDRcbiAgICAgIHZhciBNQVhfTUVUQUNPREVMSVNUX0hFSUdIVCA9IDI3MFxuXG4gICAgICBpZiAoIXNlbGVjdGluZ01ldGFjb2RlKSB7XG4gICAgICAgIHNlbGVjdGluZ01ldGFjb2RlID0gdHJ1ZVxuXG4gICAgICAgIC8vIHRoaXMgaXMgdG8gbWFrZSBzdXJlIHRoZSBtZXRhY29kZVxuICAgICAgICAvLyBzZWxlY3QgaXMgYWNjZXNzaWJsZSBvbnNjcmVlbiwgd2hlbiBvcGVuZWRcbiAgICAgICAgLy8gd2hpbGUgdG9waWMgY2FyZCBpcyBjbG9zZSB0byB0aGUgcmlnaHRcbiAgICAgICAgLy8gZWRnZSBvZiB0aGUgc2NyZWVuXG4gICAgICAgIHZhciB3aW5kb3dXaWR0aCA9ICQod2luZG93KS53aWR0aCgpXG4gICAgICAgIHZhciBzaG93Y2FyZExlZnQgPSBwYXJzZUludCgkKCcuc2hvd2NhcmQnKS5jc3MoJ2xlZnQnKSlcbiAgICAgICAgdmFyIGRpc3RhbmNlRnJvbUVkZ2UgPSB3aW5kb3dXaWR0aCAtIChzaG93Y2FyZExlZnQgKyBUT1BJQ0NBUkRfV0lEVEgpXG4gICAgICAgIGlmIChkaXN0YW5jZUZyb21FZGdlIDwgTUVUQUNPREVTRUxFQ1RfV0lEVEgpIHtcbiAgICAgICAgICAkKCcubWV0YWNvZGVTZWxlY3QnKS5hZGRDbGFzcygnb25SaWdodEVkZ2UnKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGhpcyBpcyB0byBtYWtlIHN1cmUgdGhlIG1ldGFjb2RlXG4gICAgICAgIC8vIHNlbGVjdCBpcyBhY2Nlc3NpYmxlIG9uc2NyZWVuLCB3aGVuIG9wZW5lZFxuICAgICAgICAvLyB3aGlsZSB0b3BpYyBjYXJkIGlzIGNsb3NlIHRvIHRoZSBib3R0b21cbiAgICAgICAgLy8gZWRnZSBvZiB0aGUgc2NyZWVuXG4gICAgICAgIHZhciB3aW5kb3dIZWlnaHQgPSAkKHdpbmRvdykuaGVpZ2h0KClcbiAgICAgICAgdmFyIHNob3djYXJkVG9wID0gcGFyc2VJbnQoJCgnLnNob3djYXJkJykuY3NzKCd0b3AnKSlcbiAgICAgICAgdmFyIHRvcGljVGl0bGVIZWlnaHQgPSAkKCcuc2hvd2NhcmQgLnRpdGxlJykuaGVpZ2h0KCkgKyBwYXJzZUludCgkKCcuc2hvd2NhcmQgLnRpdGxlJykuY3NzKCdwYWRkaW5nLXRvcCcpKSArIHBhcnNlSW50KCQoJy5zaG93Y2FyZCAudGl0bGUnKS5jc3MoJ3BhZGRpbmctYm90dG9tJykpXG4gICAgICAgIHZhciBkaXN0YW5jZUZyb21Cb3R0b20gPSB3aW5kb3dIZWlnaHQgLSAoc2hvd2NhcmRUb3AgKyB0b3BpY1RpdGxlSGVpZ2h0KVxuICAgICAgICBpZiAoZGlzdGFuY2VGcm9tQm90dG9tIDwgTUFYX01FVEFDT0RFTElTVF9IRUlHSFQpIHtcbiAgICAgICAgICAkKCcubWV0YWNvZGVTZWxlY3QnKS5hZGRDbGFzcygnb25Cb3R0b21FZGdlJylcbiAgICAgICAgfVxuXG4gICAgICAgICQoJy5tZXRhY29kZVNlbGVjdCcpLnNob3coKVxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBoaWRlTWV0YWNvZGVTZWxlY3QgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGVjdGluZ01ldGFjb2RlID0gZmFsc2VcbiAgICAgICQoJy5tZXRhY29kZVNlbGVjdCcpLmhpZGUoKS5yZW1vdmVDbGFzcygnb25SaWdodEVkZ2Ugb25Cb3R0b21FZGdlJylcbiAgICAgICQoJy5tZXRhY29kZVRpdGxlJykuaGlkZSgpXG4gICAgICAkKCcuc2hvd2NhcmQgLmljb24nKS5jc3MoJ3otaW5kZXgnLCAnMScpXG4gICAgfVxuXG4gICAgaWYgKGF1dGhvcml6ZWQpIHtcbiAgICAgICQoJy5zaG93Y2FyZCAubWV0YWNvZGVUaXRsZScpLmNsaWNrKG9wZW5NZXRhY29kZVNlbGVjdClcbiAgICAgICQoJy5zaG93Y2FyZCcpLmNsaWNrKGhpZGVNZXRhY29kZVNlbGVjdClcbiAgICAgICQoJy5tZXRhY29kZVNlbGVjdCA+IHVsID4gbGknKS5jbGljayhmdW5jdGlvbihldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgfSlcbiAgICAgICQoJy5tZXRhY29kZVNlbGVjdCBsaSBsaScpLmNsaWNrKG1ldGFjb2RlTGlDbGljaylcblxuICAgICAgdmFyIGJpcE5hbWUgPSAkKHNob3dDYXJkKS5maW5kKCcuYmVzdF9pbl9wbGFjZV9uYW1lJylcbiAgICAgIGJpcE5hbWUuYmluZCgnYmVzdF9pbl9wbGFjZTphY3RpdmF0ZScsIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgJGVsID0gYmlwTmFtZS5maW5kKCd0ZXh0YXJlYScpXG4gICAgICAgIHZhciBlbCA9ICRlbFswXVxuXG4gICAgICAgICRlbC5hdHRyKCdtYXhsZW5ndGgnLCAnMTQwJylcblxuICAgICAgICAkKCcuc2hvd2NhcmQgLnRpdGxlJykuYXBwZW5kKCc8ZGl2IGNsYXNzPVwibmFtZUNvdW50ZXIgZm9yVG9waWNcIj48L2Rpdj4nKVxuXG4gICAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAkKCcubmFtZUNvdW50ZXIuZm9yVG9waWMnKS5odG1sKGRhdGEuYWxsICsgJy8xNDAnKVxuICAgICAgICB9XG4gICAgICAgIENvdW50YWJsZS5saXZlKGVsLCBjYWxsYmFjaylcbiAgICAgIH0pXG4gICAgICBiaXBOYW1lLmJpbmQoJ2Jlc3RfaW5fcGxhY2U6ZGVhY3RpdmF0ZScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAkKCcubmFtZUNvdW50ZXIuZm9yVG9waWMnKS5yZW1vdmUoKVxuICAgICAgfSlcbiAgICAgIGJpcE5hbWUua2V5cHJlc3MoZnVuY3Rpb24oZSkge1xuICAgICAgICBjb25zdCBFTlRFUiA9IDEzXG4gICAgICAgIGlmIChlLndoaWNoID09PSBFTlRFUikgeyAvLyBlbnRlclxuICAgICAgICAgICQodGhpcykuZGF0YSgnYmVzdEluUGxhY2VFZGl0b3InKS51cGRhdGUoKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBiaW5kIGJlc3RfaW5fcGxhY2UgYWpheCBjYWxsYmFja3NcbiAgICAgIGJpcE5hbWUuYmluZCgnYWpheDpzdWNjZXNzJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBuYW1lID0gVXRpbC5kZWNvZGVFbnRpdGllcygkKHRoaXMpLmh0bWwoKSlcbiAgICAgICAgdG9waWMuc2V0KCduYW1lJywgbmFtZSlcbiAgICAgICAgdG9waWMudHJpZ2dlcignc2F2ZWQnKVxuICAgICAgfSlcblxuICAgICAgLy8gdGhpcyBpcyBmb3IgYWxsIHN1YnNlcXVlbnQgcmVuZGVycyBhZnRlciBpbi1wbGFjZSBlZGl0aW5nIHRoZSBkZXNjIGZpZWxkXG4gICAgICBjb25zdCBiaXBEZXNjID0gJChzaG93Q2FyZCkuZmluZCgnLmJlc3RfaW5fcGxhY2VfZGVzYycpXG4gICAgICBiaXBEZXNjLmJpbmQoJ2FqYXg6c3VjY2VzcycsIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZGVzYyA9ICQodGhpcykuaHRtbCgpID09PSAkKHRoaXMpLmRhdGEoJ2JpcC1uaWwnKVxuICAgICAgICAgID8gJydcbiAgICAgICAgICA6ICQodGhpcykudGV4dCgpXG4gICAgICAgIHRvcGljLnNldCgnZGVzYycsIGRlc2MpXG4gICAgICAgICQodGhpcykuZGF0YSgnYmlwLXZhbHVlJywgZGVzYylcbiAgICAgICAgdGhpcy5pbm5lckhUTUwgPSBVdGlsLm1kVG9IVE1MKGRlc2MpXG4gICAgICAgIHRvcGljLnRyaWdnZXIoJ3NhdmVkJylcbiAgICAgIH0pXG4gICAgICBiaXBEZXNjLmtleXByZXNzKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgLy8gYWxsb3cgdHlwaW5nIEVudGVyIHdpdGggU2hpZnQrRW50ZXJcbiAgICAgICAgY29uc3QgRU5URVIgPSAxM1xuICAgICAgICBpZiAoZS5zaGlmdEtleSA9PT0gZmFsc2UgJiYgZS53aGljaCA9PT0gRU5URVIpIHtcbiAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2Jlc3RJblBsYWNlRWRpdG9yJykudXBkYXRlKClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICB2YXIgcGVybWlzc2lvbkxpQ2xpY2sgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgc2VsZWN0aW5nUGVybWlzc2lvbiA9IGZhbHNlXG4gICAgICB2YXIgcGVybWlzc2lvbiA9ICQodGhpcykuYXR0cignY2xhc3MnKVxuICAgICAgdG9waWMuc2F2ZSh7XG4gICAgICAgIHBlcm1pc3Npb246IHBlcm1pc3Npb24sXG4gICAgICAgIGRlZmVyX3RvX21hcF9pZDogbnVsbFxuICAgICAgfSlcbiAgICAgICQoJy5zaG93Y2FyZCAubWFwUGVybScpLnJlbW92ZUNsYXNzKCdjbyBwdSBwciBtaW5pbWl6ZScpLmFkZENsYXNzKHBlcm1pc3Npb24uc3Vic3RyaW5nKDAsIDIpKVxuICAgICAgJCgnLnNob3djYXJkIC5wZXJtaXNzaW9uU2VsZWN0JykucmVtb3ZlKClcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgfVxuXG4gICAgdmFyIG9wZW5QZXJtaXNzaW9uU2VsZWN0ID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGlmICghc2VsZWN0aW5nUGVybWlzc2lvbikge1xuICAgICAgICBzZWxlY3RpbmdQZXJtaXNzaW9uID0gdHJ1ZVxuICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdtaW5pbWl6ZScpIC8vIHRoaXMgbGluZSBmbGlwcyB0aGUgZHJvcCBkb3duIGFycm93IHRvIGEgcHVsbCB1cCBhcnJvd1xuICAgICAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnY28nKSkge1xuICAgICAgICAgICQodGhpcykuYXBwZW5kKCc8dWwgY2xhc3M9XCJwZXJtaXNzaW9uU2VsZWN0XCI+PGxpIGNsYXNzPVwicHVibGljXCI+PC9saT48bGkgY2xhc3M9XCJwcml2YXRlXCI+PC9saT48L3VsPicpXG4gICAgICAgIH0gZWxzZSBpZiAoJCh0aGlzKS5oYXNDbGFzcygncHUnKSkge1xuICAgICAgICAgICQodGhpcykuYXBwZW5kKCc8dWwgY2xhc3M9XCJwZXJtaXNzaW9uU2VsZWN0XCI+PGxpIGNsYXNzPVwiY29tbW9uc1wiPjwvbGk+PGxpIGNsYXNzPVwicHJpdmF0ZVwiPjwvbGk+PC91bD4nKVxuICAgICAgICB9IGVsc2UgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ3ByJykpIHtcbiAgICAgICAgICAkKHRoaXMpLmFwcGVuZCgnPHVsIGNsYXNzPVwicGVybWlzc2lvblNlbGVjdFwiPjxsaSBjbGFzcz1cImNvbW1vbnNcIj48L2xpPjxsaSBjbGFzcz1cInB1YmxpY1wiPjwvbGk+PC91bD4nKVxuICAgICAgICB9XG4gICAgICAgICQoJy5zaG93Y2FyZCAucGVybWlzc2lvblNlbGVjdCBsaScpLmNsaWNrKHBlcm1pc3Npb25MaUNsaWNrKVxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBoaWRlUGVybWlzc2lvblNlbGVjdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZWN0aW5nUGVybWlzc2lvbiA9IGZhbHNlXG4gICAgICAkKCcuc2hvd2NhcmQgLnlvdXJUb3BpYyAubWFwUGVybScpLnJlbW92ZUNsYXNzKCdtaW5pbWl6ZScpIC8vIHRoaXMgbGluZSBmbGlwcyB0aGUgcHVsbCB1cCBhcnJvdyB0byBhIGRyb3AgZG93biBhcnJvd1xuICAgICAgJCgnLnNob3djYXJkIC5wZXJtaXNzaW9uU2VsZWN0JykucmVtb3ZlKClcbiAgICB9XG4gICAgLy8gYWJpbGl0eSB0byBjaGFuZ2UgcGVybWlzc2lvblxuICAgIHZhciBzZWxlY3RpbmdQZXJtaXNzaW9uID0gZmFsc2VcbiAgICBpZiAodG9waWMuYXV0aG9yaXplUGVybWlzc2lvbkNoYW5nZShBY3RpdmUuTWFwcGVyKSkge1xuICAgICAgJCgnLnNob3djYXJkIC55b3VyVG9waWMgLm1hcFBlcm0nKS5jbGljayhvcGVuUGVybWlzc2lvblNlbGVjdClcbiAgICAgICQoJy5zaG93Y2FyZCcpLmNsaWNrKGhpZGVQZXJtaXNzaW9uU2VsZWN0KVxuICAgIH1cblxuICAgICQoJy5saW5rcyAubWFwQ291bnQnKS51bmJpbmQoKS5jbGljayhmdW5jdGlvbihldmVudCkge1xuICAgICAgJCgnLm1hcENvdW50IC50aXAnKS50b2dnbGUoKVxuICAgICAgJCgnLnNob3djYXJkIC5ob3ZlclRpcCcpLnRvZ2dsZUNsYXNzKCdoaWRlJylcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgfSlcbiAgICAkKCcubWFwQ291bnQgLnRpcCcpLnVuYmluZCgpLmNsaWNrKGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgIH0pXG4gICAgJCgnLnNob3djYXJkJykudW5iaW5kKCcuaGlkZVRpcCcpLmJpbmQoJ2NsaWNrLmhpZGVUaXAnLCBmdW5jdGlvbigpIHtcbiAgICAgICQoJy5tYXBDb3VudCAudGlwJykuaGlkZSgpXG4gICAgICAkKCcuc2hvd2NhcmQgLmhvdmVyVGlwJykucmVtb3ZlQ2xhc3MoJ2hpZGUnKVxuICAgIH0pXG5cbiAgICAkKCcubWFwQ291bnQgLnRpcCBsaSBhJykuY2xpY2soUm91dGVyLmludGVyY2VwdClcblxuICAgIHZhciBvcmlnaW5hbFRleHQgPSAkKCcuc2hvd01vcmUnKS5odG1sKClcbiAgICAkKCcubWFwQ291bnQgLnRpcCAuc2hvd01vcmUnKS51bmJpbmQoKS50b2dnbGUoXG4gICAgICBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAkKCcuZXh0cmFUZXh0JykudG9nZ2xlQ2xhc3MoJ2hpZGVFeHRyYScpXG4gICAgICAgICQoJy5zaG93TW9yZScpLmh0bWwoJ1Nob3cgbGVzcy4uLicpXG4gICAgICB9LFxuICAgICAgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgJCgnLmV4dHJhVGV4dCcpLnRvZ2dsZUNsYXNzKCdoaWRlRXh0cmEnKVxuICAgICAgICAkKCcuc2hvd01vcmUnKS5odG1sKG9yaWdpbmFsVGV4dClcbiAgICAgIH0pXG5cbiAgICAkKCcubWFwQ291bnQgLnRpcCBzaG93TW9yZScpLnVuYmluZCgpLmNsaWNrKGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgIH0pXG4gIH0sXG4gIGhhbmRsZUludmFsaWRMaW5rOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IFRvcGljQ2FyZFxuXG4gICAgc2VsZi5yZW1vdmVMaW5rKClcbiAgICBHbG9iYWxVSS5ub3RpZnlVc2VyKCdJbnZhbGlkIGxpbmsnKVxuICB9LFxuICBwb3B1bGF0ZVNob3dDYXJkOiBmdW5jdGlvbih0b3BpYykge1xuICAgIHZhciBzZWxmID0gVG9waWNDYXJkXG5cbiAgICB2YXIgc2hvd0NhcmQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hvd2NhcmQnKVxuXG4gICAgJChzaG93Q2FyZCkuZmluZCgnLnBlcm1pc3Npb24nKS5yZW1vdmUoKVxuXG4gICAgdmFyIHRvcGljRm9yVGVtcGxhdGUgPSBzZWxmLmJ1aWxkT2JqZWN0KHRvcGljKVxuICAgIHZhciBodG1sID0gc2VsZi5nZW5lcmF0ZVNob3djYXJkSFRNTC5yZW5kZXIodG9waWNGb3JUZW1wbGF0ZSlcblxuICAgIGlmICh0b3BpYy5hdXRob3JpemVUb0VkaXQoQWN0aXZlLk1hcHBlcikpIHtcbiAgICAgIGxldCBwZXJtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcblxuICAgICAgdmFyIHN0cmluZyA9ICdwZXJtaXNzaW9uIGNhbkVkaXQnXG4gICAgICBpZiAodG9waWMuYXV0aG9yaXplUGVybWlzc2lvbkNoYW5nZShBY3RpdmUuTWFwcGVyKSkgc3RyaW5nICs9ICcgeW91clRvcGljJ1xuICAgICAgcGVybS5jbGFzc05hbWUgPSBzdHJpbmdcbiAgICAgIHBlcm0uaW5uZXJIVE1MID0gaHRtbFxuICAgICAgc2hvd0NhcmQuYXBwZW5kQ2hpbGQocGVybSlcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHBlcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgICAgcGVybS5jbGFzc05hbWUgPSAncGVybWlzc2lvbiBjYW5ub3RFZGl0J1xuICAgICAgcGVybS5pbm5lckhUTUwgPSBodG1sXG4gICAgICBzaG93Q2FyZC5hcHBlbmRDaGlsZChwZXJtKVxuICAgIH1cblxuICAgIFRvcGljQ2FyZC5iaW5kU2hvd0NhcmRMaXN0ZW5lcnModG9waWMpXG4gIH0sXG4gIGdlbmVyYXRlU2hvd2NhcmRIVE1MOiBudWxsLCAvLyB3aWxsIGJlIGluaXRpYWxpemVkIGludG8gYSBIb2dhbiB0ZW1wbGF0ZSB3aXRoaW4gaW5pdCBmdW5jdGlvblxuICAvLyBnZW5lcmF0ZVNob3djYXJkSFRNTFxuICBidWlsZE9iamVjdDogZnVuY3Rpb24odG9waWMpIHtcbiAgICB2YXIgbm9kZVZhbHVlcyA9IHt9XG5cbiAgICB2YXIgYXV0aG9yaXplZCA9IHRvcGljLmF1dGhvcml6ZVRvRWRpdChBY3RpdmUuTWFwcGVyKVxuXG4gICAgaWYgKCFhdXRob3JpemVkKSB7XG4gICAgfSBlbHNlIHtcbiAgICB9XG5cbiAgICBub2RlVmFsdWVzLmF0dGFjaG1lbnRzSGlkZGVuID0gJydcbiAgICBpZiAodG9waWMuZ2V0KCdsaW5rJykgJiYgdG9waWMuZ2V0KCdsaW5rJykgIT09ICcnKSB7XG4gICAgICBub2RlVmFsdWVzLmVtYmVkcyA9ICc8YSBocmVmPVwiJyArIHRvcGljLmdldCgnbGluaycpICsgJ1wiIGlkPVwiZW1iZWRseUxpbmtcIiB0YXJnZXQ9XCJfYmxhbmtcIiBkYXRhLWNhcmQtZGVzY3JpcHRpb249XCIwXCI+J1xuICAgICAgbm9kZVZhbHVlcy5lbWJlZHMgKz0gdG9waWMuZ2V0KCdsaW5rJylcbiAgICAgIG5vZGVWYWx1ZXMuZW1iZWRzICs9ICc8L2E+PGRpdiBpZD1cImVtYmVkbHlMaW5rTG9hZGVyXCI+PC9kaXY+J1xuICAgICAgbm9kZVZhbHVlcy5hdHRhY2htZW50c0hpZGRlbiA9ICdoaWRkZW4nXG4gICAgICBub2RlVmFsdWVzLmhhc0F0dGFjaG1lbnQgPSAnaGFzQXR0YWNobWVudCdcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZVZhbHVlcy5lbWJlZHMgPSAnJ1xuICAgICAgbm9kZVZhbHVlcy5oYXNBdHRhY2htZW50ID0gJydcbiAgICB9XG5cbiAgICBpZiAoYXV0aG9yaXplZCkge1xuICAgICAgbm9kZVZhbHVlcy5hdHRhY2htZW50cyA9ICc8ZGl2IGNsYXNzPVwiYWRkTGlua1wiPjxkaXYgaWQ9XCJhZGRMaW5rSWNvblwiPjwvZGl2PidcbiAgICAgIG5vZGVWYWx1ZXMuYXR0YWNobWVudHMgKz0gJzxkaXYgaWQ9XCJhZGRMaW5rSW5wdXRcIj48aW5wdXQgcGxhY2Vob2xkZXI9XCJFbnRlciBvciBwYXN0ZSBhIGxpbmtcIj48L2lucHV0PidcbiAgICAgIG5vZGVWYWx1ZXMuYXR0YWNobWVudHMgKz0gJzxkaXYgaWQ9XCJhZGRMaW5rUmVzZXRcIj48L2Rpdj48L2Rpdj48L2Rpdj4nXG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGVWYWx1ZXMuYXR0YWNobWVudHNIaWRkZW4gPSAnaGlkZGVuJ1xuICAgICAgbm9kZVZhbHVlcy5hdHRhY2htZW50cyA9ICcnXG4gICAgfVxuXG4gICAgdmFyIGlubWFwc0FyID0gdG9waWMuZ2V0KCdpbm1hcHMnKSB8fCBbXVxuICAgIHZhciBpbm1hcHNMaW5rcyA9IHRvcGljLmdldCgnaW5tYXBzTGlua3MnKSB8fCBbXVxuICAgIG5vZGVWYWx1ZXMuaW5tYXBzID0gJydcbiAgICBpZiAoaW5tYXBzQXIubGVuZ3RoIDwgNikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbm1hcHNBci5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCB1cmwgPSAnL21hcHMvJyArIGlubWFwc0xpbmtzW2ldXG4gICAgICAgIG5vZGVWYWx1ZXMuaW5tYXBzICs9ICc8bGk+PGEgaHJlZj1cIicgKyB1cmwgKyAnXCI+JyArIGlubWFwc0FyW2ldICsgJzwvYT48L2xpPidcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1OyBpKyspIHtcbiAgICAgICAgY29uc3QgdXJsID0gJy9tYXBzLycgKyBpbm1hcHNMaW5rc1tpXVxuICAgICAgICBub2RlVmFsdWVzLmlubWFwcyArPSAnPGxpPjxhIGhyZWY9XCInICsgdXJsICsgJ1wiPicgKyBpbm1hcHNBcltpXSArICc8L2E+PC9saT4nXG4gICAgICB9XG4gICAgICBjb25zdCBleHRyYSA9IGlubWFwc0FyLmxlbmd0aCAtIDVcbiAgICAgIG5vZGVWYWx1ZXMuaW5tYXBzICs9ICc8bGk+PHNwYW4gY2xhc3M9XCJzaG93TW9yZVwiPlNlZSAnICsgZXh0cmEgKyAnIG1vcmUuLi48L3NwYW4+PC9saT4nXG4gICAgICBmb3IgKGxldCBpID0gNTsgaSA8IGlubWFwc0FyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHVybCA9ICcvbWFwcy8nICsgaW5tYXBzTGlua3NbaV1cbiAgICAgICAgbm9kZVZhbHVlcy5pbm1hcHMgKz0gJzxsaSBjbGFzcz1cImhpZGVFeHRyYSBleHRyYVRleHRcIj48YSBocmVmPVwiJyArIHVybCArICdcIj4nICsgaW5tYXBzQXJbaV0gKyAnPC9hPjwvbGk+J1xuICAgICAgfVxuICAgIH1cbiAgICBub2RlVmFsdWVzLnBlcm1pc3Npb24gPSB0b3BpYy5nZXQoJ3Blcm1pc3Npb24nKVxuICAgIG5vZGVWYWx1ZXMubWtfcGVybWlzc2lvbiA9IHRvcGljLmdldCgncGVybWlzc2lvbicpLnN1YnN0cmluZygwLCAyKVxuICAgIG5vZGVWYWx1ZXMubWFwX2NvdW50ID0gdG9waWMuZ2V0KCdtYXBfY291bnQnKS50b1N0cmluZygpXG4gICAgbm9kZVZhbHVlcy5zeW5hcHNlX2NvdW50ID0gdG9waWMuZ2V0KCdzeW5hcHNlX2NvdW50JykudG9TdHJpbmcoKVxuICAgIG5vZGVWYWx1ZXMuaWQgPSB0b3BpYy5pc05ldygpID8gdG9waWMuY2lkIDogdG9waWMuaWRcbiAgICBub2RlVmFsdWVzLm1ldGFjb2RlID0gdG9waWMuZ2V0TWV0YWNvZGUoKS5nZXQoJ25hbWUnKVxuICAgIG5vZGVWYWx1ZXMubWV0YWNvZGVfY2xhc3MgPSAnbWJnJyArIHRvcGljLmdldCgnbWV0YWNvZGVfaWQnKVxuICAgIG5vZGVWYWx1ZXMuaW1nc3JjID0gdG9waWMuZ2V0TWV0YWNvZGUoKS5nZXQoJ2ljb24nKVxuICAgIG5vZGVWYWx1ZXMubmFtZSA9IHRvcGljLmdldCgnbmFtZScpXG4gICAgbm9kZVZhbHVlcy51c2VyaWQgPSB0b3BpYy5nZXQoJ3VzZXJfaWQnKVxuICAgIG5vZGVWYWx1ZXMudXNlcm5hbWUgPSB0b3BpYy5nZXQoJ3VzZXJfbmFtZScpXG4gICAgbm9kZVZhbHVlcy5kYXRlID0gdG9waWMuZ2V0RGF0ZSgpXG4gICAgLy8gdGhlIGNvZGUgZm9yIHRoaXMgaXMgc3RvcmVkIGluIC92aWV3cy9tYWluL19tZXRhY29kZU9wdGlvbnMuaHRtbC5lcmJcbiAgICBub2RlVmFsdWVzLm1ldGFjb2RlX3NlbGVjdCA9ICQoJyNtZXRhY29kZU9wdGlvbnMnKS5odG1sKClcbiAgICBub2RlVmFsdWVzLmRlc2NfbmlsID0gJ0NsaWNrIHRvIGFkZCBkZXNjcmlwdGlvbi4uLidcbiAgICBub2RlVmFsdWVzLmRlc2NfbWFya2Rvd24gPSAodG9waWMuZ2V0KCdkZXNjJykgPT09ICcnICYmIGF1dGhvcml6ZWQpXG4gICAgID8gbm9kZVZhbHVlcy5kZXNjX25pbFxuICAgICA6IHRvcGljLmdldCgnZGVzYycpXG4gICAgbm9kZVZhbHVlcy5kZXNjX2h0bWwgPSBVdGlsLm1kVG9IVE1MKG5vZGVWYWx1ZXMuZGVzY19tYXJrZG93bilcbiAgICByZXR1cm4gbm9kZVZhbHVlc1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRvcGljQ2FyZFxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9Ub3BpY0NhcmQuanMiXSwibWFwcGluZ3MiOiI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 567 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });exports.callStarted = exports.callInProgress = exports.mapperLeftCall = exports.mapperJoinedCall = exports.invitedToJoin = exports.invitedToCall = exports.inviteDenied = exports.callDenied = exports.callAccepted = exports.newMapper = exports.mapperListUpdated = exports.lostMapper = exports.peerCoordsUpdated = exports.topicDragged = exports.juntoUpdated = undefined;\n\n\n\n\n\nvar _events = __webpack_require__(560);\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _Views = __webpack_require__(541);\nvar _DataModel = __webpack_require__(149);var _DataModel2 = _interopRequireDefault(_DataModel);\nvar _GlobalUI = __webpack_require__(362);var _GlobalUI2 = _interopRequireDefault(_GlobalUI);\nvar _Util = __webpack_require__(410);var _Util2 = _interopRequireDefault(_Util);\nvar _Visualize = __webpack_require__(561);var _Visualize2 = _interopRequireDefault(_Visualize);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}\n\nvar juntoUpdated = exports.juntoUpdated = function juntoUpdated(self) {return function (state) {\n    self.juntoState = state;\n    $(document).trigger(_events.JUNTO_UPDATED);\n  };};\n\n/* All the following events are received through the nodejs realtime server\n           and are done this way because they are transient data, not persisted to the server */ /* global $ */ /*\n                                                                                                                everthing in this file happens as a result of websocket events\n                                                                                                                */var topicDragged = exports.topicDragged = function topicDragged(self) {return function (positions) {var topic;\n    var node;\n\n    if (_Active2.default.Map) {\n      for (var key in positions) {\n        topic = _DataModel2.default.Topics.get(key);\n        if (topic) node = topic.get('node');\n        if (node) node.pos.setc(positions[key].x, positions[key].y);\n      } // for\n      _Visualize2.default.mGraph.plot();\n    }\n  };};\n\nvar peerCoordsUpdated = exports.peerCoordsUpdated = function peerCoordsUpdated(self) {return function (data) {\n    if (!self.mappersOnMap[data.userid]) return;\n    self.mappersOnMap[data.userid].coords = { x: data.usercoords.x, y: data.usercoords.y };\n    self.positionPeerIcon(data.userid);\n  };};\n\nvar lostMapper = exports.lostMapper = function lostMapper(self) {return function (data) {\n    // data.userid\n    // data.username\n    delete self.mappersOnMap[data.userid];\n    _Views.ChatView.sound.play('leavemap');\n    // $('#mapper' + data.userid).remove()\n    $('#compass' + data.userid).remove();\n    _Views.ChatView.removeParticipant(_Views.ChatView.participants.findWhere({ id: data.userid }));\n\n    _GlobalUI2.default.notifyUser(data.username + ' just left the map');\n\n    if (self.inConversation && self.countOthersInConversation() === 0 ||\n    !self.inConversation && self.countOthersInConversation() === 1) {\n      self.callEnded();\n    }\n  };};\n\nvar mapperListUpdated = exports.mapperListUpdated = function mapperListUpdated(self) {return function (data) {\n    // data.userid\n    // data.username\n    // data.avatar\n\n    self.mappersOnMap[data.userid] = {\n      id: data.userid,\n      name: data.username,\n      username: data.username,\n      image: data.avatar,\n      color: _Util2.default.getPastelColor(),\n      inConversation: data.userinconversation,\n      coords: {\n        x: 0,\n        y: 0 } };\n\n\n\n    if (data.userid !== _Active2.default.Mapper.id) {\n      _Views.ChatView.addParticipant(self.mappersOnMap[data.userid]);\n      if (data.userinconversation) _Views.ChatView.mapperJoinedCall(data.userid);\n\n      // create a div for the collaborators compass\n      self.createCompass(data.username, data.userid, data.avatar, self.mappersOnMap[data.userid].color);\n    }\n  };};\n\nvar newMapper = exports.newMapper = function newMapper(self) {return function (data) {\n    // data.userid\n    // data.username\n    // data.avatar\n    // data.coords\n    var firstOtherPerson = Object.keys(self.mappersOnMap).length === 0;\n\n    self.mappersOnMap[data.userid] = {\n      id: data.userid,\n      name: data.username,\n      username: data.username,\n      image: data.avatar,\n      color: _Util2.default.getPastelColor(),\n      coords: {\n        x: 0,\n        y: 0 } };\n\n\n\n    // create an item for them in the realtime box\n    if (data.userid !== _Active2.default.Mapper.id) {\n      _Views.ChatView.sound.play('joinmap');\n      _Views.ChatView.addParticipant(self.mappersOnMap[data.userid]);\n\n      // create a div for the collaborators compass\n      self.createCompass(data.username, data.userid, data.avatar, self.mappersOnMap[data.userid].color);\n\n      var notifyMessage = data.username + ' just joined the map';\n      if (firstOtherPerson) {\n        notifyMessage += ' <button type=\"button\" class=\"toast-button button\">Suggest A Video Call</button>';\n      }\n      _GlobalUI2.default.notifyUser(notifyMessage);\n      $('#toast button').click(function (e) {return self.inviteACall(data.userid);});\n      self.sendMapperInfo(data.userid);\n    }\n  };};\n\nvar callAccepted = exports.callAccepted = function callAccepted(self) {return function (userid) {\n    // const username = self.mappersOnMap[userid].name\n    _GlobalUI2.default.notifyUser('Conversation starting...');\n    self.joinCall();\n    _Views.ChatView.invitationAnswered(userid);\n  };};\n\nvar callDenied = exports.callDenied = function callDenied(self) {return function (userid) {\n    var username = self.mappersOnMap[userid].name;\n    _GlobalUI2.default.notifyUser(username + \" didn't accept your invitation\");\n    _Views.ChatView.invitationAnswered(userid);\n  };};\n\nvar inviteDenied = exports.inviteDenied = function inviteDenied(self) {return function (userid) {\n    var username = self.mappersOnMap[userid].name;\n    _GlobalUI2.default.notifyUser(username + \" didn't accept your invitation\");\n    _Views.ChatView.invitationAnswered(userid);\n  };};\n\nvar invitedToCall = exports.invitedToCall = function invitedToCall(self) {return function (inviter) {\n    _Views.ChatView.sound.stop(self.soundId);\n    self.soundId = _Views.ChatView.sound.play('sessioninvite');\n\n    var username = self.mappersOnMap[inviter].name;\n    var notifyText = '<img src=\"' + self['junto_spinner_darkgrey.gif'] + '\" style=\"display: inline-block; margin-top: -12px; margin-bottom: -6px; vertical-align: top;\" />';\n    notifyText += username + ' is inviting you to a conversation. Join live?';\n    notifyText += ' <button type=\"button\" class=\"toast-button button yes\">Yes</button>';\n    notifyText += ' <button type=\"button\" class=\"toast-button button btn-no no\">No</button>';\n    _GlobalUI2.default.notifyUser(notifyText, { leaveOpen: true });\n    $('#toast button.yes').click(function (e) {return self.acceptCall(inviter);});\n    $('#toast button.no').click(function (e) {return self.denyCall(inviter);});\n  };};\n\nvar invitedToJoin = exports.invitedToJoin = function invitedToJoin(self) {return function (inviter) {\n    _Views.ChatView.sound.stop(self.soundId);\n    self.soundId = _Views.ChatView.sound.play('sessioninvite');\n\n    var username = self.mappersOnMap[inviter].name;\n    var notifyText = username + ' is inviting you to the conversation. Join?';\n    notifyText += ' <button type=\"button\" class=\"toast-button button yes\">Yes</button>';\n    notifyText += ' <button type=\"button\" class=\"toast-button button btn-no no\">No</button>';\n    _GlobalUI2.default.notifyUser(notifyText, { leaveOpen: true });\n    $('#toast button.yes').click(function (e) {return self.joinCall();});\n    $('#toast button.no').click(function (e) {return self.denyInvite(inviter);});\n  };};\n\nvar mapperJoinedCall = exports.mapperJoinedCall = function mapperJoinedCall(self) {return function (id) {\n    var mapper = self.mappersOnMap[id];\n    if (mapper) {\n      if (self.inConversation) {\n        var username = mapper.name;\n        var notifyText = username + ' joined the call';\n        _GlobalUI2.default.notifyUser(notifyText);\n      }\n      mapper.inConversation = true;\n      _Views.ChatView.mapperJoinedCall(id);\n    }\n  };};\n\nvar mapperLeftCall = exports.mapperLeftCall = function mapperLeftCall(self) {return function (id) {\n    var mapper = self.mappersOnMap[id];\n    if (mapper) {\n      if (self.inConversation) {\n        var username = mapper.name;\n        var notifyText = username + ' left the call';\n        _GlobalUI2.default.notifyUser(notifyText);\n      }\n      mapper.inConversation = false;\n      _Views.ChatView.mapperLeftCall(id);\n      if (self.inConversation && self.countOthersInConversation() === 0 ||\n      !self.inConversation && self.countOthersInConversation() === 1) {\n        self.callEnded();\n      }\n    }\n  };};\n\nvar callInProgress = exports.callInProgress = function callInProgress(self) {return function () {\n    var notifyText = \"There's a conversation happening, want to join?\";\n    notifyText += ' <button type=\"button\" class=\"toast-button button yes\">Yes</button>';\n    notifyText += ' <button type=\"button\" class=\"toast-button button btn-no no\">No</button>';\n    _GlobalUI2.default.notifyUser(notifyText, { leaveOpen: true });\n    $('#toast button.yes').click(function (e) {return self.joinCall();});\n    $('#toast button.no').click(function (e) {return _GlobalUI2.default.clearNotify();});\n    _Views.ChatView.conversationInProgress();\n  };};\n\nvar callStarted = exports.callStarted = function callStarted(self) {return function () {\n    if (self.inConversation) return;\n    var notifyText = \"There's a conversation starting, want to join?\";\n    notifyText += ' <button type=\"button\" class=\"toast-button button\">Yes</button>';\n    notifyText += ' <button type=\"button\" class=\"toast-button button btn-no\">No</button>';\n    _GlobalUI2.default.notifyUser(notifyText, { leaveOpen: true });\n    $('#toast button.yes').click(function (e) {return self.joinCall();});\n    $('#toast button.no').click(function (e) {return _GlobalUI2.default.clearNotify();});\n    _Views.ChatView.conversationInProgress();\n  };};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY3LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvUmVhbHRpbWUvcmVjZWl2YWJsZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBnbG9iYWwgJCAqL1xuXG4vKlxuZXZlcnRoaW5nIGluIHRoaXMgZmlsZSBoYXBwZW5zIGFzIGEgcmVzdWx0IG9mIHdlYnNvY2tldCBldmVudHNcbiovXG5cbmltcG9ydCB7IEpVTlRPX1VQREFURUQgfSBmcm9tICcuL2V2ZW50cydcblxuaW1wb3J0IEFjdGl2ZSBmcm9tICcuLi9BY3RpdmUnXG5pbXBvcnQgeyBDaGF0VmlldyB9IGZyb20gJy4uL1ZpZXdzJ1xuaW1wb3J0IERhdGFNb2RlbCBmcm9tICcuLi9EYXRhTW9kZWwnXG5pbXBvcnQgR2xvYmFsVUkgZnJvbSAnLi4vR2xvYmFsVUknXG5pbXBvcnQgVXRpbCBmcm9tICcuLi9VdGlsJ1xuaW1wb3J0IFZpc3VhbGl6ZSBmcm9tICcuLi9WaXN1YWxpemUnXG5cbmV4cG9ydCBjb25zdCBqdW50b1VwZGF0ZWQgPSBzZWxmID0+IHN0YXRlID0+IHtcbiAgc2VsZi5qdW50b1N0YXRlID0gc3RhdGVcbiAgJChkb2N1bWVudCkudHJpZ2dlcihKVU5UT19VUERBVEVEKVxufVxuXG4vKiBBbGwgdGhlIGZvbGxvd2luZyBldmVudHMgYXJlIHJlY2VpdmVkIHRocm91Z2ggdGhlIG5vZGVqcyByZWFsdGltZSBzZXJ2ZXJcbiAgICBhbmQgYXJlIGRvbmUgdGhpcyB3YXkgYmVjYXVzZSB0aGV5IGFyZSB0cmFuc2llbnQgZGF0YSwgbm90IHBlcnNpc3RlZCB0byB0aGUgc2VydmVyICovXG5leHBvcnQgY29uc3QgdG9waWNEcmFnZ2VkID0gc2VsZiA9PiBwb3NpdGlvbnMgPT4ge1xuICB2YXIgdG9waWNcbiAgdmFyIG5vZGVcblxuICBpZiAoQWN0aXZlLk1hcCkge1xuICAgIGZvciAodmFyIGtleSBpbiBwb3NpdGlvbnMpIHtcbiAgICAgIHRvcGljID0gRGF0YU1vZGVsLlRvcGljcy5nZXQoa2V5KVxuICAgICAgaWYgKHRvcGljKSBub2RlID0gdG9waWMuZ2V0KCdub2RlJylcbiAgICAgIGlmIChub2RlKSBub2RlLnBvcy5zZXRjKHBvc2l0aW9uc1trZXldLngsIHBvc2l0aW9uc1trZXldLnkpXG4gICAgfSAvLyBmb3JcbiAgICBWaXN1YWxpemUubUdyYXBoLnBsb3QoKVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwZWVyQ29vcmRzVXBkYXRlZCA9IHNlbGYgPT4gZGF0YSA9PiB7XG4gIGlmICghc2VsZi5tYXBwZXJzT25NYXBbZGF0YS51c2VyaWRdKSByZXR1cm5cbiAgc2VsZi5tYXBwZXJzT25NYXBbZGF0YS51c2VyaWRdLmNvb3JkcyA9IHt4OiBkYXRhLnVzZXJjb29yZHMueCwgeTogZGF0YS51c2VyY29vcmRzLnl9XG4gIHNlbGYucG9zaXRpb25QZWVySWNvbihkYXRhLnVzZXJpZClcbn1cblxuZXhwb3J0IGNvbnN0IGxvc3RNYXBwZXIgPSBzZWxmID0+IGRhdGEgPT4ge1xuICAvLyBkYXRhLnVzZXJpZFxuICAvLyBkYXRhLnVzZXJuYW1lXG4gIGRlbGV0ZSBzZWxmLm1hcHBlcnNPbk1hcFtkYXRhLnVzZXJpZF1cbiAgQ2hhdFZpZXcuc291bmQucGxheSgnbGVhdmVtYXAnKVxuICAvLyAkKCcjbWFwcGVyJyArIGRhdGEudXNlcmlkKS5yZW1vdmUoKVxuICAkKCcjY29tcGFzcycgKyBkYXRhLnVzZXJpZCkucmVtb3ZlKClcbiAgQ2hhdFZpZXcucmVtb3ZlUGFydGljaXBhbnQoQ2hhdFZpZXcucGFydGljaXBhbnRzLmZpbmRXaGVyZSh7aWQ6IGRhdGEudXNlcmlkfSkpXG5cbiAgR2xvYmFsVUkubm90aWZ5VXNlcihkYXRhLnVzZXJuYW1lICsgJyBqdXN0IGxlZnQgdGhlIG1hcCcpXG5cbiAgaWYgKChzZWxmLmluQ29udmVyc2F0aW9uICYmIHNlbGYuY291bnRPdGhlcnNJbkNvbnZlcnNhdGlvbigpID09PSAwKSB8fFxuICAgICghc2VsZi5pbkNvbnZlcnNhdGlvbiAmJiBzZWxmLmNvdW50T3RoZXJzSW5Db252ZXJzYXRpb24oKSA9PT0gMSkpIHtcbiAgICBzZWxmLmNhbGxFbmRlZCgpXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG1hcHBlckxpc3RVcGRhdGVkID0gc2VsZiA9PiBkYXRhID0+IHtcbiAgLy8gZGF0YS51c2VyaWRcbiAgLy8gZGF0YS51c2VybmFtZVxuICAvLyBkYXRhLmF2YXRhclxuXG4gIHNlbGYubWFwcGVyc09uTWFwW2RhdGEudXNlcmlkXSA9IHtcbiAgICBpZDogZGF0YS51c2VyaWQsXG4gICAgbmFtZTogZGF0YS51c2VybmFtZSxcbiAgICB1c2VybmFtZTogZGF0YS51c2VybmFtZSxcbiAgICBpbWFnZTogZGF0YS5hdmF0YXIsXG4gICAgY29sb3I6IFV0aWwuZ2V0UGFzdGVsQ29sb3IoKSxcbiAgICBpbkNvbnZlcnNhdGlvbjogZGF0YS51c2VyaW5jb252ZXJzYXRpb24sXG4gICAgY29vcmRzOiB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH1cbiAgfVxuXG4gIGlmIChkYXRhLnVzZXJpZCAhPT0gQWN0aXZlLk1hcHBlci5pZCkge1xuICAgIENoYXRWaWV3LmFkZFBhcnRpY2lwYW50KHNlbGYubWFwcGVyc09uTWFwW2RhdGEudXNlcmlkXSlcbiAgICBpZiAoZGF0YS51c2VyaW5jb252ZXJzYXRpb24pIENoYXRWaWV3Lm1hcHBlckpvaW5lZENhbGwoZGF0YS51c2VyaWQpXG5cbiAgICAvLyBjcmVhdGUgYSBkaXYgZm9yIHRoZSBjb2xsYWJvcmF0b3JzIGNvbXBhc3NcbiAgICBzZWxmLmNyZWF0ZUNvbXBhc3MoZGF0YS51c2VybmFtZSwgZGF0YS51c2VyaWQsIGRhdGEuYXZhdGFyLCBzZWxmLm1hcHBlcnNPbk1hcFtkYXRhLnVzZXJpZF0uY29sb3IpXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5ld01hcHBlciA9IHNlbGYgPT4gZGF0YSA9PiB7XG4gIC8vIGRhdGEudXNlcmlkXG4gIC8vIGRhdGEudXNlcm5hbWVcbiAgLy8gZGF0YS5hdmF0YXJcbiAgLy8gZGF0YS5jb29yZHNcbiAgdmFyIGZpcnN0T3RoZXJQZXJzb24gPSBPYmplY3Qua2V5cyhzZWxmLm1hcHBlcnNPbk1hcCkubGVuZ3RoID09PSAwXG5cbiAgc2VsZi5tYXBwZXJzT25NYXBbZGF0YS51c2VyaWRdID0ge1xuICAgIGlkOiBkYXRhLnVzZXJpZCxcbiAgICBuYW1lOiBkYXRhLnVzZXJuYW1lLFxuICAgIHVzZXJuYW1lOiBkYXRhLnVzZXJuYW1lLFxuICAgIGltYWdlOiBkYXRhLmF2YXRhcixcbiAgICBjb2xvcjogVXRpbC5nZXRQYXN0ZWxDb2xvcigpLFxuICAgIGNvb3Jkczoge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9XG4gIH1cblxuICAvLyBjcmVhdGUgYW4gaXRlbSBmb3IgdGhlbSBpbiB0aGUgcmVhbHRpbWUgYm94XG4gIGlmIChkYXRhLnVzZXJpZCAhPT0gQWN0aXZlLk1hcHBlci5pZCkge1xuICAgIENoYXRWaWV3LnNvdW5kLnBsYXkoJ2pvaW5tYXAnKVxuICAgIENoYXRWaWV3LmFkZFBhcnRpY2lwYW50KHNlbGYubWFwcGVyc09uTWFwW2RhdGEudXNlcmlkXSlcblxuICAgIC8vIGNyZWF0ZSBhIGRpdiBmb3IgdGhlIGNvbGxhYm9yYXRvcnMgY29tcGFzc1xuICAgIHNlbGYuY3JlYXRlQ29tcGFzcyhkYXRhLnVzZXJuYW1lLCBkYXRhLnVzZXJpZCwgZGF0YS5hdmF0YXIsIHNlbGYubWFwcGVyc09uTWFwW2RhdGEudXNlcmlkXS5jb2xvcilcblxuICAgIHZhciBub3RpZnlNZXNzYWdlID0gZGF0YS51c2VybmFtZSArICcganVzdCBqb2luZWQgdGhlIG1hcCdcbiAgICBpZiAoZmlyc3RPdGhlclBlcnNvbikge1xuICAgICAgbm90aWZ5TWVzc2FnZSArPSAnIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidG9hc3QtYnV0dG9uIGJ1dHRvblwiPlN1Z2dlc3QgQSBWaWRlbyBDYWxsPC9idXR0b24+J1xuICAgIH1cbiAgICBHbG9iYWxVSS5ub3RpZnlVc2VyKG5vdGlmeU1lc3NhZ2UpXG4gICAgJCgnI3RvYXN0IGJ1dHRvbicpLmNsaWNrKGUgPT4gc2VsZi5pbnZpdGVBQ2FsbChkYXRhLnVzZXJpZCkpXG4gICAgc2VsZi5zZW5kTWFwcGVySW5mbyhkYXRhLnVzZXJpZClcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY2FsbEFjY2VwdGVkID0gc2VsZiA9PiB1c2VyaWQgPT4ge1xuICAvLyBjb25zdCB1c2VybmFtZSA9IHNlbGYubWFwcGVyc09uTWFwW3VzZXJpZF0ubmFtZVxuICBHbG9iYWxVSS5ub3RpZnlVc2VyKCdDb252ZXJzYXRpb24gc3RhcnRpbmcuLi4nKVxuICBzZWxmLmpvaW5DYWxsKClcbiAgQ2hhdFZpZXcuaW52aXRhdGlvbkFuc3dlcmVkKHVzZXJpZClcbn1cblxuZXhwb3J0IGNvbnN0IGNhbGxEZW5pZWQgPSBzZWxmID0+IHVzZXJpZCA9PiB7XG4gIHZhciB1c2VybmFtZSA9IHNlbGYubWFwcGVyc09uTWFwW3VzZXJpZF0ubmFtZVxuICBHbG9iYWxVSS5ub3RpZnlVc2VyKHVzZXJuYW1lICsgXCIgZGlkbid0IGFjY2VwdCB5b3VyIGludml0YXRpb25cIilcbiAgQ2hhdFZpZXcuaW52aXRhdGlvbkFuc3dlcmVkKHVzZXJpZClcbn1cblxuZXhwb3J0IGNvbnN0IGludml0ZURlbmllZCA9IHNlbGYgPT4gdXNlcmlkID0+IHtcbiAgdmFyIHVzZXJuYW1lID0gc2VsZi5tYXBwZXJzT25NYXBbdXNlcmlkXS5uYW1lXG4gIEdsb2JhbFVJLm5vdGlmeVVzZXIodXNlcm5hbWUgKyBcIiBkaWRuJ3QgYWNjZXB0IHlvdXIgaW52aXRhdGlvblwiKVxuICBDaGF0Vmlldy5pbnZpdGF0aW9uQW5zd2VyZWQodXNlcmlkKVxufVxuXG5leHBvcnQgY29uc3QgaW52aXRlZFRvQ2FsbCA9IHNlbGYgPT4gaW52aXRlciA9PiB7XG4gIENoYXRWaWV3LnNvdW5kLnN0b3Aoc2VsZi5zb3VuZElkKVxuICBzZWxmLnNvdW5kSWQgPSBDaGF0Vmlldy5zb3VuZC5wbGF5KCdzZXNzaW9uaW52aXRlJylcblxuICB2YXIgdXNlcm5hbWUgPSBzZWxmLm1hcHBlcnNPbk1hcFtpbnZpdGVyXS5uYW1lXG4gIHZhciBub3RpZnlUZXh0ID0gJzxpbWcgc3JjPVwiJyArIHNlbGZbJ2p1bnRvX3NwaW5uZXJfZGFya2dyZXkuZ2lmJ10gKyAnXCIgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1hcmdpbi10b3A6IC0xMnB4OyBtYXJnaW4tYm90dG9tOiAtNnB4OyB2ZXJ0aWNhbC1hbGlnbjogdG9wO1wiIC8+J1xuICBub3RpZnlUZXh0ICs9IHVzZXJuYW1lICsgJyBpcyBpbnZpdGluZyB5b3UgdG8gYSBjb252ZXJzYXRpb24uIEpvaW4gbGl2ZT8nXG4gIG5vdGlmeVRleHQgKz0gJyA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRvYXN0LWJ1dHRvbiBidXR0b24geWVzXCI+WWVzPC9idXR0b24+J1xuICBub3RpZnlUZXh0ICs9ICcgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ0b2FzdC1idXR0b24gYnV0dG9uIGJ0bi1ubyBub1wiPk5vPC9idXR0b24+J1xuICBHbG9iYWxVSS5ub3RpZnlVc2VyKG5vdGlmeVRleHQsIHsgbGVhdmVPcGVuOiB0cnVlIH0pXG4gICQoJyN0b2FzdCBidXR0b24ueWVzJykuY2xpY2soZSA9PiBzZWxmLmFjY2VwdENhbGwoaW52aXRlcikpXG4gICQoJyN0b2FzdCBidXR0b24ubm8nKS5jbGljayhlID0+IHNlbGYuZGVueUNhbGwoaW52aXRlcikpXG59XG5cbmV4cG9ydCBjb25zdCBpbnZpdGVkVG9Kb2luID0gc2VsZiA9PiBpbnZpdGVyID0+IHtcbiAgQ2hhdFZpZXcuc291bmQuc3RvcChzZWxmLnNvdW5kSWQpXG4gIHNlbGYuc291bmRJZCA9IENoYXRWaWV3LnNvdW5kLnBsYXkoJ3Nlc3Npb25pbnZpdGUnKVxuXG4gIHZhciB1c2VybmFtZSA9IHNlbGYubWFwcGVyc09uTWFwW2ludml0ZXJdLm5hbWVcbiAgdmFyIG5vdGlmeVRleHQgPSB1c2VybmFtZSArICcgaXMgaW52aXRpbmcgeW91IHRvIHRoZSBjb252ZXJzYXRpb24uIEpvaW4/J1xuICBub3RpZnlUZXh0ICs9ICcgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ0b2FzdC1idXR0b24gYnV0dG9uIHllc1wiPlllczwvYnV0dG9uPidcbiAgbm90aWZ5VGV4dCArPSAnIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidG9hc3QtYnV0dG9uIGJ1dHRvbiBidG4tbm8gbm9cIj5ObzwvYnV0dG9uPidcbiAgR2xvYmFsVUkubm90aWZ5VXNlcihub3RpZnlUZXh0LCB7IGxlYXZlT3BlbjogdHJ1ZSB9KVxuICAkKCcjdG9hc3QgYnV0dG9uLnllcycpLmNsaWNrKGUgPT4gc2VsZi5qb2luQ2FsbCgpKVxuICAkKCcjdG9hc3QgYnV0dG9uLm5vJykuY2xpY2soZSA9PiBzZWxmLmRlbnlJbnZpdGUoaW52aXRlcikpXG59XG5cbmV4cG9ydCBjb25zdCBtYXBwZXJKb2luZWRDYWxsID0gc2VsZiA9PiBpZCA9PiB7XG4gIHZhciBtYXBwZXIgPSBzZWxmLm1hcHBlcnNPbk1hcFtpZF1cbiAgaWYgKG1hcHBlcikge1xuICAgIGlmIChzZWxmLmluQ29udmVyc2F0aW9uKSB7XG4gICAgICB2YXIgdXNlcm5hbWUgPSBtYXBwZXIubmFtZVxuICAgICAgdmFyIG5vdGlmeVRleHQgPSB1c2VybmFtZSArICcgam9pbmVkIHRoZSBjYWxsJ1xuICAgICAgR2xvYmFsVUkubm90aWZ5VXNlcihub3RpZnlUZXh0KVxuICAgIH1cbiAgICBtYXBwZXIuaW5Db252ZXJzYXRpb24gPSB0cnVlXG4gICAgQ2hhdFZpZXcubWFwcGVySm9pbmVkQ2FsbChpZClcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbWFwcGVyTGVmdENhbGwgPSBzZWxmID0+IGlkID0+IHtcbiAgdmFyIG1hcHBlciA9IHNlbGYubWFwcGVyc09uTWFwW2lkXVxuICBpZiAobWFwcGVyKSB7XG4gICAgaWYgKHNlbGYuaW5Db252ZXJzYXRpb24pIHtcbiAgICAgIHZhciB1c2VybmFtZSA9IG1hcHBlci5uYW1lXG4gICAgICB2YXIgbm90aWZ5VGV4dCA9IHVzZXJuYW1lICsgJyBsZWZ0IHRoZSBjYWxsJ1xuICAgICAgR2xvYmFsVUkubm90aWZ5VXNlcihub3RpZnlUZXh0KVxuICAgIH1cbiAgICBtYXBwZXIuaW5Db252ZXJzYXRpb24gPSBmYWxzZVxuICAgIENoYXRWaWV3Lm1hcHBlckxlZnRDYWxsKGlkKVxuICAgIGlmICgoc2VsZi5pbkNvbnZlcnNhdGlvbiAmJiBzZWxmLmNvdW50T3RoZXJzSW5Db252ZXJzYXRpb24oKSA9PT0gMCkgfHxcbiAgICAgICghc2VsZi5pbkNvbnZlcnNhdGlvbiAmJiBzZWxmLmNvdW50T3RoZXJzSW5Db252ZXJzYXRpb24oKSA9PT0gMSkpIHtcbiAgICAgIHNlbGYuY2FsbEVuZGVkKClcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNhbGxJblByb2dyZXNzID0gc2VsZiA9PiAoKSA9PiB7XG4gIHZhciBub3RpZnlUZXh0ID0gXCJUaGVyZSdzIGEgY29udmVyc2F0aW9uIGhhcHBlbmluZywgd2FudCB0byBqb2luP1wiXG4gIG5vdGlmeVRleHQgKz0gJyA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRvYXN0LWJ1dHRvbiBidXR0b24geWVzXCI+WWVzPC9idXR0b24+J1xuICBub3RpZnlUZXh0ICs9ICcgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ0b2FzdC1idXR0b24gYnV0dG9uIGJ0bi1ubyBub1wiPk5vPC9idXR0b24+J1xuICBHbG9iYWxVSS5ub3RpZnlVc2VyKG5vdGlmeVRleHQsIHsgbGVhdmVPcGVuOiB0cnVlIH0pXG4gICQoJyN0b2FzdCBidXR0b24ueWVzJykuY2xpY2soZSA9PiBzZWxmLmpvaW5DYWxsKCkpXG4gICQoJyN0b2FzdCBidXR0b24ubm8nKS5jbGljayhlID0+IEdsb2JhbFVJLmNsZWFyTm90aWZ5KCkpXG4gIENoYXRWaWV3LmNvbnZlcnNhdGlvbkluUHJvZ3Jlc3MoKVxufVxuXG5leHBvcnQgY29uc3QgY2FsbFN0YXJ0ZWQgPSBzZWxmID0+ICgpID0+IHtcbiAgaWYgKHNlbGYuaW5Db252ZXJzYXRpb24pIHJldHVyblxuICB2YXIgbm90aWZ5VGV4dCA9IFwiVGhlcmUncyBhIGNvbnZlcnNhdGlvbiBzdGFydGluZywgd2FudCB0byBqb2luP1wiXG4gIG5vdGlmeVRleHQgKz0gJyA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRvYXN0LWJ1dHRvbiBidXR0b25cIj5ZZXM8L2J1dHRvbj4nXG4gIG5vdGlmeVRleHQgKz0gJyA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRvYXN0LWJ1dHRvbiBidXR0b24gYnRuLW5vXCI+Tm88L2J1dHRvbj4nXG4gIEdsb2JhbFVJLm5vdGlmeVVzZXIobm90aWZ5VGV4dCwgeyBsZWF2ZU9wZW46IHRydWUgfSlcbiAgJCgnI3RvYXN0IGJ1dHRvbi55ZXMnKS5jbGljayhlID0+IHNlbGYuam9pbkNhbGwoKSlcbiAgJCgnI3RvYXN0IGJ1dHRvbi5ubycpLmNsaWNrKGUgPT4gR2xvYmFsVUkuY2xlYXJOb3RpZnkoKSlcbiAgQ2hhdFZpZXcuY29udmVyc2F0aW9uSW5Qcm9ncmVzcygpXG59XG5cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBmcm9udGVuZC9zcmMvTWV0YW1hcHMvUmVhbHRpbWUvcmVjZWl2YWJsZS5qcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBcEJBOztBQXNCQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 568 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });exports.dragTopic = exports.sendCoords = exports.inviteToJoin = exports.inviteACall = exports.denyInvite = exports.denyCall = exports.acceptCall = exports.leaveCall = exports.joinCall = exports.sendMapperInfo = exports.checkForCall = exports.leaveMap = exports.joinMap = undefined;\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _Views = __webpack_require__(541);\nvar _GlobalUI = __webpack_require__(362);var _GlobalUI2 = _interopRequireDefault(_GlobalUI);\n\nvar _events = __webpack_require__(560);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} /* global $ */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar joinMap = exports.joinMap = function joinMap(self) {return function () {\n    self.socket.emit(_events.JOIN_MAP, {\n      userid: _Active2.default.Mapper.id,\n      username: _Active2.default.Mapper.get('name'),\n      avatar: _Active2.default.Mapper.get('image'),\n      mapid: _Active2.default.Map.id,\n      map: _Active2.default.Map.attributes });\n\n  };};\n\nvar leaveMap = exports.leaveMap = function leaveMap(self) {return function () {\n    self.socket.emit(_events.LEAVE_MAP);\n  };};\n\nvar checkForCall = exports.checkForCall = function checkForCall(self) {return function () {\n    self.socket.emit(_events.CHECK_FOR_CALL, { room: self.room.room, mapid: _Active2.default.Map.id });\n  };};\n\nvar sendMapperInfo = exports.sendMapperInfo = function sendMapperInfo(self) {return function (userid) {\n    // send this new mapper back your details, and the awareness that you've loaded the map\n    var update = {\n      userToNotify: userid,\n      username: _Active2.default.Mapper.get('name'),\n      avatar: _Active2.default.Mapper.get('image'),\n      userid: _Active2.default.Mapper.id,\n      userinconversation: self.inConversation,\n      mapid: _Active2.default.Map.id };\n\n    self.socket.emit(_events.SEND_MAPPER_INFO, update);\n  };};\n\nvar joinCall = exports.joinCall = function joinCall(self) {return function () {\n    self.webrtc.off('readyToCall');\n    self.webrtc.once('readyToCall', function () {\n      self.videoInitialized = true;\n      self.readyToCall = true;\n      self.localVideo.view.manuallyPositioned = false;\n      self.positionVideos();\n      self.localVideo.view.$container.show();\n      if (self.localVideo) {\n        $('#wrapper').append(self.localVideo.view.$container);\n      }\n      self.room.join();\n      _Views.ChatView.conversationInProgress(true);\n    });\n    self.inConversation = true;\n    self.socket.emit(_events.JOIN_CALL, {\n      mapid: _Active2.default.Map.id,\n      id: _Active2.default.Mapper.id });\n\n    self.webrtc.startLocalVideo();\n    _GlobalUI2.default.clearNotify();\n    _Views.ChatView.mapperJoinedCall(_Active2.default.Mapper.id);\n  };};\n\nvar leaveCall = exports.leaveCall = function leaveCall(self) {return function () {\n    self.socket.emit(_events.LEAVE_CALL, {\n      mapid: _Active2.default.Map.id,\n      id: _Active2.default.Mapper.id });\n\n\n    _Views.ChatView.mapperLeftCall(_Active2.default.Mapper.id);\n    _Views.ChatView.leaveConversation(); // the conversation will carry on without you\n    self.room.leaveVideoOnly();\n    self.inConversation = false;\n    self.localVideo.view.$container.hide();\n\n    // if there's only two people in the room, and we're leaving\n    // we should shut down the call locally\n    if (self.countOthersInConversation() === 1) {\n      self.callEnded();\n    }\n  };};\n\nvar acceptCall = exports.acceptCall = function acceptCall(self) {return function (userid) {\n    _Views.ChatView.sound.stop(self.soundId);\n    self.socket.emit(_events.ACCEPT_CALL, {\n      mapid: _Active2.default.Map.id,\n      invited: _Active2.default.Mapper.id,\n      inviter: userid });\n\n    $.post('/maps/' + _Active2.default.Map.id + '/events/conversation');\n    self.joinCall();\n    _GlobalUI2.default.clearNotify();\n  };};\n\nvar denyCall = exports.denyCall = function denyCall(self) {return function (userid) {\n    _Views.ChatView.sound.stop(self.soundId);\n    self.socket.emit(_events.DENY_CALL, {\n      mapid: _Active2.default.Map.id,\n      invited: _Active2.default.Mapper.id,\n      inviter: userid });\n\n    _GlobalUI2.default.clearNotify();\n  };};\n\nvar denyInvite = exports.denyInvite = function denyInvite(self) {return function (userid) {\n    _Views.ChatView.sound.stop(self.soundId);\n    self.socket.emit(_events.DENY_INVITE, {\n      mapid: _Active2.default.Map.id,\n      invited: _Active2.default.Mapper.id,\n      inviter: userid });\n\n    _GlobalUI2.default.clearNotify();\n  };};\n\nvar inviteACall = exports.inviteACall = function inviteACall(self) {return function (userid) {\n    self.socket.emit(_events.INVITE_A_CALL, {\n      mapid: _Active2.default.Map.id,\n      inviter: _Active2.default.Mapper.id,\n      invited: userid });\n\n    _Views.ChatView.invitationPending(userid);\n    _GlobalUI2.default.clearNotify();\n  };};\n\nvar inviteToJoin = exports.inviteToJoin = function inviteToJoin(self) {return function (userid) {\n    self.socket.emit(_events.INVITE_TO_JOIN, {\n      mapid: _Active2.default.Map.id,\n      inviter: _Active2.default.Mapper.id,\n      invited: userid });\n\n    _Views.ChatView.invitationPending(userid);\n  };};\n\nvar sendCoords = exports.sendCoords = function sendCoords(self) {return function (coords) {\n    var map = _Active2.default.Map;\n    var mapper = _Active2.default.Mapper;\n    if (map && map.authorizeToEdit(mapper)) {\n      var update = {\n        usercoords: coords,\n        userid: _Active2.default.Mapper.id,\n        mapid: _Active2.default.Map.id };\n\n      self.socket.emit(_events.SEND_COORDS, update);\n    }\n  };};\n\nvar dragTopic = exports.dragTopic = function dragTopic(self) {return function (positions) {\n    if (_Active2.default.Map) {\n      positions.mapid = _Active2.default.Map.id;\n      self.socket.emit(_events.DRAG_TOPIC, positions);\n    }\n  };};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY4LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvUmVhbHRpbWUvc2VuZGFibGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsICQgKi9cblxuaW1wb3J0IEFjdGl2ZSBmcm9tICcuLi9BY3RpdmUnXG5pbXBvcnQgeyBDaGF0VmlldyB9IGZyb20gJy4uL1ZpZXdzJ1xuaW1wb3J0IEdsb2JhbFVJIGZyb20gJy4uL0dsb2JhbFVJJ1xuXG5pbXBvcnQge1xuICBKT0lOX01BUCxcbiAgTEVBVkVfTUFQLFxuICBDSEVDS19GT1JfQ0FMTCxcbiAgQUNDRVBUX0NBTEwsXG4gIERFTllfQ0FMTCxcbiAgREVOWV9JTlZJVEUsXG4gIElOVklURV9UT19KT0lOLFxuICBJTlZJVEVfQV9DQUxMLFxuICBKT0lOX0NBTEwsXG4gIExFQVZFX0NBTEwsXG4gIFNFTkRfTUFQUEVSX0lORk8sXG4gIFNFTkRfQ09PUkRTLFxuICBEUkFHX1RPUElDXG59IGZyb20gJy4vZXZlbnRzJ1xuXG5leHBvcnQgY29uc3Qgam9pbk1hcCA9IHNlbGYgPT4gKCkgPT4ge1xuICBzZWxmLnNvY2tldC5lbWl0KEpPSU5fTUFQLCB7XG4gICAgdXNlcmlkOiBBY3RpdmUuTWFwcGVyLmlkLFxuICAgIHVzZXJuYW1lOiBBY3RpdmUuTWFwcGVyLmdldCgnbmFtZScpLFxuICAgIGF2YXRhcjogQWN0aXZlLk1hcHBlci5nZXQoJ2ltYWdlJyksXG4gICAgbWFwaWQ6IEFjdGl2ZS5NYXAuaWQsXG4gICAgbWFwOiBBY3RpdmUuTWFwLmF0dHJpYnV0ZXNcbiAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IGxlYXZlTWFwID0gc2VsZiA9PiAoKSA9PiB7XG4gIHNlbGYuc29ja2V0LmVtaXQoTEVBVkVfTUFQKVxufVxuXG5leHBvcnQgY29uc3QgY2hlY2tGb3JDYWxsID0gc2VsZiA9PiAoKSA9PiB7XG4gIHNlbGYuc29ja2V0LmVtaXQoQ0hFQ0tfRk9SX0NBTEwsIHsgcm9vbTogc2VsZi5yb29tLnJvb20sIG1hcGlkOiBBY3RpdmUuTWFwLmlkIH0pXG59XG5cbmV4cG9ydCBjb25zdCBzZW5kTWFwcGVySW5mbyA9IHNlbGYgPT4gdXNlcmlkID0+IHtcbiAgLy8gc2VuZCB0aGlzIG5ldyBtYXBwZXIgYmFjayB5b3VyIGRldGFpbHMsIGFuZCB0aGUgYXdhcmVuZXNzIHRoYXQgeW91J3ZlIGxvYWRlZCB0aGUgbWFwXG4gIHZhciB1cGRhdGUgPSB7XG4gICAgdXNlclRvTm90aWZ5OiB1c2VyaWQsXG4gICAgdXNlcm5hbWU6IEFjdGl2ZS5NYXBwZXIuZ2V0KCduYW1lJyksXG4gICAgYXZhdGFyOiBBY3RpdmUuTWFwcGVyLmdldCgnaW1hZ2UnKSxcbiAgICB1c2VyaWQ6IEFjdGl2ZS5NYXBwZXIuaWQsXG4gICAgdXNlcmluY29udmVyc2F0aW9uOiBzZWxmLmluQ29udmVyc2F0aW9uLFxuICAgIG1hcGlkOiBBY3RpdmUuTWFwLmlkXG4gIH1cbiAgc2VsZi5zb2NrZXQuZW1pdChTRU5EX01BUFBFUl9JTkZPLCB1cGRhdGUpXG59XG5cbmV4cG9ydCBjb25zdCBqb2luQ2FsbCA9IHNlbGYgPT4gKCkgPT4ge1xuICBzZWxmLndlYnJ0Yy5vZmYoJ3JlYWR5VG9DYWxsJylcbiAgc2VsZi53ZWJydGMub25jZSgncmVhZHlUb0NhbGwnLCBmdW5jdGlvbigpIHtcbiAgICBzZWxmLnZpZGVvSW5pdGlhbGl6ZWQgPSB0cnVlXG4gICAgc2VsZi5yZWFkeVRvQ2FsbCA9IHRydWVcbiAgICBzZWxmLmxvY2FsVmlkZW8udmlldy5tYW51YWxseVBvc2l0aW9uZWQgPSBmYWxzZVxuICAgIHNlbGYucG9zaXRpb25WaWRlb3MoKVxuICAgIHNlbGYubG9jYWxWaWRlby52aWV3LiRjb250YWluZXIuc2hvdygpXG4gICAgaWYgKHNlbGYubG9jYWxWaWRlbykge1xuICAgICAgJCgnI3dyYXBwZXInKS5hcHBlbmQoc2VsZi5sb2NhbFZpZGVvLnZpZXcuJGNvbnRhaW5lcilcbiAgICB9XG4gICAgc2VsZi5yb29tLmpvaW4oKVxuICAgIENoYXRWaWV3LmNvbnZlcnNhdGlvbkluUHJvZ3Jlc3ModHJ1ZSlcbiAgfSlcbiAgc2VsZi5pbkNvbnZlcnNhdGlvbiA9IHRydWVcbiAgc2VsZi5zb2NrZXQuZW1pdChKT0lOX0NBTEwsIHtcbiAgICBtYXBpZDogQWN0aXZlLk1hcC5pZCxcbiAgICBpZDogQWN0aXZlLk1hcHBlci5pZFxuICB9KVxuICBzZWxmLndlYnJ0Yy5zdGFydExvY2FsVmlkZW8oKVxuICBHbG9iYWxVSS5jbGVhck5vdGlmeSgpXG4gIENoYXRWaWV3Lm1hcHBlckpvaW5lZENhbGwoQWN0aXZlLk1hcHBlci5pZClcbn1cblxuZXhwb3J0IGNvbnN0IGxlYXZlQ2FsbCA9IHNlbGYgPT4gKCkgPT4ge1xuICBzZWxmLnNvY2tldC5lbWl0KExFQVZFX0NBTEwsIHtcbiAgICBtYXBpZDogQWN0aXZlLk1hcC5pZCxcbiAgICBpZDogQWN0aXZlLk1hcHBlci5pZFxuICB9KVxuXG4gIENoYXRWaWV3Lm1hcHBlckxlZnRDYWxsKEFjdGl2ZS5NYXBwZXIuaWQpXG4gIENoYXRWaWV3LmxlYXZlQ29udmVyc2F0aW9uKCkgLy8gdGhlIGNvbnZlcnNhdGlvbiB3aWxsIGNhcnJ5IG9uIHdpdGhvdXQgeW91XG4gIHNlbGYucm9vbS5sZWF2ZVZpZGVvT25seSgpXG4gIHNlbGYuaW5Db252ZXJzYXRpb24gPSBmYWxzZVxuICBzZWxmLmxvY2FsVmlkZW8udmlldy4kY29udGFpbmVyLmhpZGUoKVxuXG4gIC8vIGlmIHRoZXJlJ3Mgb25seSB0d28gcGVvcGxlIGluIHRoZSByb29tLCBhbmQgd2UncmUgbGVhdmluZ1xuICAvLyB3ZSBzaG91bGQgc2h1dCBkb3duIHRoZSBjYWxsIGxvY2FsbHlcbiAgaWYgKHNlbGYuY291bnRPdGhlcnNJbkNvbnZlcnNhdGlvbigpID09PSAxKSB7XG4gICAgc2VsZi5jYWxsRW5kZWQoKVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBhY2NlcHRDYWxsID0gc2VsZiA9PiB1c2VyaWQgPT4ge1xuICBDaGF0Vmlldy5zb3VuZC5zdG9wKHNlbGYuc291bmRJZClcbiAgc2VsZi5zb2NrZXQuZW1pdChBQ0NFUFRfQ0FMTCwge1xuICAgIG1hcGlkOiBBY3RpdmUuTWFwLmlkLFxuICAgIGludml0ZWQ6IEFjdGl2ZS5NYXBwZXIuaWQsXG4gICAgaW52aXRlcjogdXNlcmlkXG4gIH0pXG4gICQucG9zdCgnL21hcHMvJyArIEFjdGl2ZS5NYXAuaWQgKyAnL2V2ZW50cy9jb252ZXJzYXRpb24nKVxuICBzZWxmLmpvaW5DYWxsKClcbiAgR2xvYmFsVUkuY2xlYXJOb3RpZnkoKVxufVxuXG5leHBvcnQgY29uc3QgZGVueUNhbGwgPSBzZWxmID0+IHVzZXJpZCA9PiB7XG4gIENoYXRWaWV3LnNvdW5kLnN0b3Aoc2VsZi5zb3VuZElkKVxuICBzZWxmLnNvY2tldC5lbWl0KERFTllfQ0FMTCwge1xuICAgIG1hcGlkOiBBY3RpdmUuTWFwLmlkLFxuICAgIGludml0ZWQ6IEFjdGl2ZS5NYXBwZXIuaWQsXG4gICAgaW52aXRlcjogdXNlcmlkXG4gIH0pXG4gIEdsb2JhbFVJLmNsZWFyTm90aWZ5KClcbn1cblxuZXhwb3J0IGNvbnN0IGRlbnlJbnZpdGUgPSBzZWxmID0+IHVzZXJpZCA9PiB7XG4gIENoYXRWaWV3LnNvdW5kLnN0b3Aoc2VsZi5zb3VuZElkKVxuICBzZWxmLnNvY2tldC5lbWl0KERFTllfSU5WSVRFLCB7XG4gICAgbWFwaWQ6IEFjdGl2ZS5NYXAuaWQsXG4gICAgaW52aXRlZDogQWN0aXZlLk1hcHBlci5pZCxcbiAgICBpbnZpdGVyOiB1c2VyaWRcbiAgfSlcbiAgR2xvYmFsVUkuY2xlYXJOb3RpZnkoKVxufVxuXG5leHBvcnQgY29uc3QgaW52aXRlQUNhbGwgPSBzZWxmID0+IHVzZXJpZCA9PiB7XG4gIHNlbGYuc29ja2V0LmVtaXQoSU5WSVRFX0FfQ0FMTCwge1xuICAgIG1hcGlkOiBBY3RpdmUuTWFwLmlkLFxuICAgIGludml0ZXI6IEFjdGl2ZS5NYXBwZXIuaWQsXG4gICAgaW52aXRlZDogdXNlcmlkXG4gIH0pXG4gIENoYXRWaWV3Lmludml0YXRpb25QZW5kaW5nKHVzZXJpZClcbiAgR2xvYmFsVUkuY2xlYXJOb3RpZnkoKVxufVxuXG5leHBvcnQgY29uc3QgaW52aXRlVG9Kb2luID0gc2VsZiA9PiB1c2VyaWQgPT4ge1xuICBzZWxmLnNvY2tldC5lbWl0KElOVklURV9UT19KT0lOLCB7XG4gICAgbWFwaWQ6IEFjdGl2ZS5NYXAuaWQsXG4gICAgaW52aXRlcjogQWN0aXZlLk1hcHBlci5pZCxcbiAgICBpbnZpdGVkOiB1c2VyaWRcbiAgfSlcbiAgQ2hhdFZpZXcuaW52aXRhdGlvblBlbmRpbmcodXNlcmlkKVxufVxuXG5leHBvcnQgY29uc3Qgc2VuZENvb3JkcyA9IHNlbGYgPT4gY29vcmRzID0+IHtcbiAgdmFyIG1hcCA9IEFjdGl2ZS5NYXBcbiAgdmFyIG1hcHBlciA9IEFjdGl2ZS5NYXBwZXJcbiAgaWYgKG1hcCAmJiBtYXAuYXV0aG9yaXplVG9FZGl0KG1hcHBlcikpIHtcbiAgICB2YXIgdXBkYXRlID0ge1xuICAgICAgdXNlcmNvb3JkczogY29vcmRzLFxuICAgICAgdXNlcmlkOiBBY3RpdmUuTWFwcGVyLmlkLFxuICAgICAgbWFwaWQ6IEFjdGl2ZS5NYXAuaWRcbiAgICB9XG4gICAgc2VsZi5zb2NrZXQuZW1pdChTRU5EX0NPT1JEUywgdXBkYXRlKVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkcmFnVG9waWMgPSBzZWxmID0+IHBvc2l0aW9ucyA9PiB7XG4gIGlmIChBY3RpdmUuTWFwKSB7XG4gICAgcG9zaXRpb25zLm1hcGlkID0gQWN0aXZlLk1hcC5pZFxuICAgIHNlbGYuc29ja2V0LmVtaXQoRFJBR19UT1BJQywgcG9zaXRpb25zKVxuICB9XG59XG5cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBmcm9udGVuZC9zcmMvTWV0YW1hcHMvUmVhbHRpbWUvc2VuZGFibGUuanMiXSwibWFwcGluZ3MiOiI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 569 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _Control = __webpack_require__(27);var _Control2 = _interopRequireDefault(_Control);\nvar _Mapper = __webpack_require__(434);var _Mapper2 = _interopRequireDefault(_Mapper);\nvar _Visualize = __webpack_require__(561);var _Visualize2 = _interopRequireDefault(_Visualize);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} /* global $ */\n\nvar SynapseCard = {\n  openSynapseCard: null,\n  showCard: function showCard(edge, e) {\n    var self = SynapseCard;\n\n    // reset so we don't interfere with other edges, but first, save its x and y\n    var myX = $('#edit_synapse').css('left');\n    var myY = $('#edit_synapse').css('top');\n    $('#edit_synapse').remove();\n\n    // so label is missing while editing\n    _Control2.default.deselectEdge(edge);\n\n    var index = edge.getData('displayIndex') ? edge.getData('displayIndex') : 0;\n    var synapse = edge.getData('synapses')[index]; // for now, just get the first synapse\n\n    // create the wrapper around the form elements, including permissions\n    // classes to make best_in_place happy\n    var editDiv = document.createElement('div');\n    editDiv.innerHTML = '<div id=\"editSynUpperBar\"></div><div id=\"editSynLowerBar\"></div>';\n    editDiv.setAttribute('id', 'edit_synapse');\n    if (synapse.authorizeToEdit(_Active2.default.Mapper)) {\n      editDiv.className = 'permission canEdit';\n      editDiv.className += synapse.authorizePermissionChange(_Active2.default.Mapper) ? ' yourEdge' : '';\n    } else {\n      editDiv.className = 'permission cannotEdit';\n    }\n    $('#wrapper').append(editDiv);\n\n    self.populateShowCard(edge, synapse);\n\n    // drop it in the right spot, activate it\n    $('#edit_synapse').css('position', 'absolute');\n    if (e) {\n      $('#edit_synapse').css('left', e.clientX);\n      $('#edit_synapse').css('top', e.clientY);\n    } else {\n      $('#edit_synapse').css('left', myX);\n      $('#edit_synapse').css('top', myY);\n    }\n    // $('#edit_synapse_name').click() //required in case name is empty\n    // $('#edit_synapse_name input').focus()\n    $('#edit_synapse').show();\n\n    self.openSynapseCard = edge;\n  },\n\n  hideCard: function hideCard() {\n    $('#edit_synapse').remove();\n    SynapseCard.openSynapseCard = null;\n  },\n\n  populateShowCard: function populateShowCard(edge, synapse) {\n    var self = SynapseCard;\n\n    self.add_synapse_count(edge);\n    self.add_desc_form(synapse);\n    self.add_drop_down(edge, synapse);\n    self.add_user_info(synapse);\n    self.add_perms_form(synapse);\n    self.add_direction_form(synapse);\n  },\n  add_synapse_count: function add_synapse_count(edge) {\n    var count = edge.getData('synapses').length;\n\n    $('#editSynUpperBar').append('<div id=\"synapseCardCount\">' + count + '</div>');\n  },\n  add_desc_form: function add_desc_form(synapse) {\n    var dataNil = 'Click to add description.';\n\n    // TODO make it so that this would work even in sandbox mode,\n    // currently with Best_in_place it won't\n\n    // desc editing form\n    $('#editSynUpperBar').append('<div id=\"edit_synapse_desc\"></div>');\n    $('#edit_synapse_desc').attr('class', 'best_in_place best_in_place_desc');\n    $('#edit_synapse_desc').attr('data-bip-object', 'synapse');\n    $('#edit_synapse_desc').attr('data-bip-attribute', 'desc');\n    $('#edit_synapse_desc').attr('data-bip-type', 'textarea');\n    $('#edit_synapse_desc').attr('data-bip-nil', dataNil);\n    $('#edit_synapse_desc').attr('data-bip-url', '/synapses/' + synapse.id);\n    $('#edit_synapse_desc').attr('data-bip-value', synapse.get('desc'));\n    $('#edit_synapse_desc').html(synapse.get('desc'));\n\n    // if edge data is blank or just whitespace, populate it with dataNil\n    if ($('#edit_synapse_desc').html().trim() === '') {\n      if (synapse.authorizeToEdit(_Active2.default.Mapper)) {\n        $('#edit_synapse_desc').html(dataNil);\n      } else {\n        $('#edit_synapse_desc').html('(no description)');\n      }\n    }\n\n    $('#edit_synapse_desc').keypress(function (e) {\n      var ENTER = 13;\n      if (e.which === ENTER) {\n        $(this).data('bestInPlaceEditor').update();\n      }\n    });\n    $('#edit_synapse_desc').bind('ajax:success', function () {\n      var desc = $(this).html();\n      if (desc === dataNil) {\n        synapse.set('desc', '');\n      } else {\n        synapse.set('desc', desc);\n      }\n      synapse.trigger('saved');\n      _Control2.default.selectEdge(synapse.get('edge'));\n      _Visualize2.default.mGraph.plot();\n    });\n  },\n  add_drop_down: function add_drop_down(edge, synapse) {\n    var list, i, synapses, l, desc;\n\n    synapses = edge.getData('synapses');\n    l = synapses.length;\n\n    if (l > 1) {\n      // append the element that you click to show dropdown select\n      $('#editSynUpperBar').append('<div id=\"dropdownSynapses\"></div>');\n      $('#dropdownSynapses').click(function (e) {\n        e.preventDefault();\n        e.stopPropagation(); // stop it from immediately closing it again\n        $('#switchSynapseList').toggle();\n      });\n      // hide the dropdown again if you click anywhere else on the synapse card\n      $('#edit_synapse').click(function () {\n        $('#switchSynapseList').hide();\n      });\n\n      // generate the list of other synapses\n      list = '<ul id=\"switchSynapseList\">';\n      for (i = 0; i < l; i++) {\n        if (synapses[i] !== synapse) {// don't add the current one to the list\n          desc = synapses[i].get('desc');\n          desc = desc === '' || desc === null ? '(no description)' : desc;\n          list += '<li data-synapse-index=\"' + i + '\">' + desc + '</li>';\n        }\n      }\n      list += '</ul>';\n      // add the list of the other synapses\n      $('#editSynLowerBar').append(list);\n\n      // attach click listeners to list items that\n      // will cause it to switch the displayed synapse\n      // when you click it\n      $('#switchSynapseList li').click(function (e) {\n        e.stopPropagation();\n        var index = parseInt($(this).attr('data-synapse-index'));\n        edge.setData('displayIndex', index);\n        _Visualize2.default.mGraph.plot();\n        SynapseCard.showCard(edge, false);\n      });\n    }\n  },\n  add_user_info: function add_user_info(synapse) {\n    var u = '<div id=\"edgeUser\" class=\"hoverForTip\">';\n    u += '<a href=\"/explore/mapper/' + synapse.get('user_id') + '\"> <img src=\"\" width=\"24\" height=\"24\" /></a>';\n    u += '<div class=\"tip\">' + synapse.get('user_name') + '</div></div>';\n    $('#editSynLowerBar').append(u);\n\n    // get mapper image\n    var setMapperImage = function setMapperImage(mapper) {\n      $('#edgeUser img').attr('src', mapper.get('image'));\n    };\n    _Mapper2.default.get(synapse.get('user_id'), setMapperImage);\n  },\n\n  add_perms_form: function add_perms_form(synapse) {\n    // permissions - if owner, also allow permission editing\n    $('#editSynLowerBar').append('<div class=\"mapPerm ' + synapse.get('permission').substring(0, 2) + '\"></div>');\n\n    // ability to change permission\n    var selectingPermission = false;\n    var permissionLiClick = function permissionLiClick(event) {\n      selectingPermission = false;\n      var permission = $(this).attr('class');\n      synapse.save({\n        permission: permission,\n        defer_to_map_id: null });\n\n      $('#edit_synapse .mapPerm').removeClass('co pu pr minimize').addClass(permission.substring(0, 2));\n      $('#edit_synapse .permissionSelect').remove();\n      event.stopPropagation();\n    };\n\n    var openPermissionSelect = function openPermissionSelect(event) {\n      if (!selectingPermission) {\n        selectingPermission = true;\n        $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow\n        if ($(this).hasClass('co')) {\n          $(this).append('<ul class=\"permissionSelect\"><li class=\"public\"></li><li class=\"private\"></li></ul>');\n        } else if ($(this).hasClass('pu')) {\n          $(this).append('<ul class=\"permissionSelect\"><li class=\"commons\"></li><li class=\"private\"></li></ul>');\n        } else if ($(this).hasClass('pr')) {\n          $(this).append('<ul class=\"permissionSelect\"><li class=\"commons\"></li><li class=\"public\"></li></ul>');\n        }\n        $('#edit_synapse .permissionSelect li').click(permissionLiClick);\n        event.stopPropagation();\n      }\n    };\n\n    var hidePermissionSelect = function hidePermissionSelect() {\n      selectingPermission = false;\n      $('#edit_synapse.yourEdge .mapPerm').removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow\n      $('#edit_synapse .permissionSelect').remove();\n    };\n\n    if (synapse.authorizePermissionChange(_Active2.default.Mapper)) {\n      $('#edit_synapse.yourEdge .mapPerm').click(openPermissionSelect);\n      $('#edit_synapse').click(hidePermissionSelect);\n    }\n  }, // add_perms_form\n\n  add_direction_form: function add_direction_form(synapse) {\n    // directionality checkboxes\n    $('#editSynLowerBar').append('<div id=\"edit_synapse_left\"></div>');\n    $('#editSynLowerBar').append('<div id=\"edit_synapse_right\"></div>');\n\n    var edge = synapse.get('edge');\n\n    // determine which node is to the left and the right\n    // if directly in a line, top is left\n    var left = void 0;\n    var right = void 0;\n    if (edge.nodeFrom.pos.x < edge.nodeTo.pos.x ||\n    edge.nodeFrom.pos.x === edge.nodeTo.pos.x &&\n    edge.nodeFrom.pos.y < edge.nodeTo.pos.y) {\n      left = edge.nodeTo.getData('topic');\n      right = edge.nodeFrom.getData('topic');\n    } else {\n      left = edge.nodeFrom.getData('topic');\n      right = edge.nodeTo.getData('topic');\n    }\n\n    /*\n       * One node is actually on the left onscreen. Call it left, & the other right.\n       * If category is from-to, and that node is first, check the 'right' checkbox.\n       * Else check the 'left' checkbox since the arrow is incoming.\n       */\n\n    var directionCat = synapse.get('category'); // both, none, from-to\n    if (directionCat === 'from-to') {\n      var fromTo = [synapse.get('topic1_id'), synapse.get('topic2_id')];\n      if (fromTo[0] === left.id) {\n        // check left checkbox\n        $('#edit_synapse_left').addClass('checked');\n      } else {\n        // check right checkbox\n        $('#edit_synapse_right').addClass('checked');\n      }\n    } else if (directionCat === 'both') {\n      // check both checkboxes\n      $('#edit_synapse_left').addClass('checked');\n      $('#edit_synapse_right').addClass('checked');\n    }\n\n    if (synapse.authorizeToEdit(_Active2.default.Mapper)) {\n      $('#edit_synapse_left, #edit_synapse_right').click(function () {\n        $(this).toggleClass('checked');\n\n        var leftChecked = $('#edit_synapse_left').is('.checked');\n        var rightChecked = $('#edit_synapse_right').is('.checked');\n\n        var dir = synapse.getDirection();\n        var dirCat = 'none';\n        if (leftChecked && rightChecked) {\n          dirCat = 'both';\n        } else if (!leftChecked && rightChecked) {\n          dirCat = 'from-to';\n          dir = [right.id, left.id];\n        } else if (leftChecked && !rightChecked) {\n          dirCat = 'from-to';\n          dir = [left.id, right.id];\n        }\n\n        synapse.save({\n          category: dirCat,\n          topic1_id: dir[0],\n          topic2_id: dir[1] });\n\n        _Visualize2.default.mGraph.plot();\n      });\n    } // if\n  } // add_direction_form\n};exports.default =\n\nSynapseCard;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY5LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvU3luYXBzZUNhcmQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsICQgKi9cbmltcG9ydCBBY3RpdmUgZnJvbSAnLi9BY3RpdmUnXG5pbXBvcnQgQ29udHJvbCBmcm9tICcuL0NvbnRyb2wnXG5pbXBvcnQgTWFwcGVyIGZyb20gJy4vTWFwcGVyJ1xuaW1wb3J0IFZpc3VhbGl6ZSBmcm9tICcuL1Zpc3VhbGl6ZSdcblxuY29uc3QgU3luYXBzZUNhcmQgPSB7XG4gIG9wZW5TeW5hcHNlQ2FyZDogbnVsbCxcbiAgc2hvd0NhcmQ6IGZ1bmN0aW9uKGVkZ2UsIGUpIHtcbiAgICB2YXIgc2VsZiA9IFN5bmFwc2VDYXJkXG5cbiAgICAvLyByZXNldCBzbyB3ZSBkb24ndCBpbnRlcmZlcmUgd2l0aCBvdGhlciBlZGdlcywgYnV0IGZpcnN0LCBzYXZlIGl0cyB4IGFuZCB5XG4gICAgdmFyIG15WCA9ICQoJyNlZGl0X3N5bmFwc2UnKS5jc3MoJ2xlZnQnKVxuICAgIHZhciBteVkgPSAkKCcjZWRpdF9zeW5hcHNlJykuY3NzKCd0b3AnKVxuICAgICQoJyNlZGl0X3N5bmFwc2UnKS5yZW1vdmUoKVxuXG4gICAgLy8gc28gbGFiZWwgaXMgbWlzc2luZyB3aGlsZSBlZGl0aW5nXG4gICAgQ29udHJvbC5kZXNlbGVjdEVkZ2UoZWRnZSlcblxuICAgIHZhciBpbmRleCA9IGVkZ2UuZ2V0RGF0YSgnZGlzcGxheUluZGV4JykgPyBlZGdlLmdldERhdGEoJ2Rpc3BsYXlJbmRleCcpIDogMFxuICAgIHZhciBzeW5hcHNlID0gZWRnZS5nZXREYXRhKCdzeW5hcHNlcycpW2luZGV4XSAvLyBmb3Igbm93LCBqdXN0IGdldCB0aGUgZmlyc3Qgc3luYXBzZVxuXG4gICAgLy8gY3JlYXRlIHRoZSB3cmFwcGVyIGFyb3VuZCB0aGUgZm9ybSBlbGVtZW50cywgaW5jbHVkaW5nIHBlcm1pc3Npb25zXG4gICAgLy8gY2xhc3NlcyB0byBtYWtlIGJlc3RfaW5fcGxhY2UgaGFwcHlcbiAgICB2YXIgZWRpdERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgZWRpdERpdi5pbm5lckhUTUwgPSAnPGRpdiBpZD1cImVkaXRTeW5VcHBlckJhclwiPjwvZGl2PjxkaXYgaWQ9XCJlZGl0U3luTG93ZXJCYXJcIj48L2Rpdj4nXG4gICAgZWRpdERpdi5zZXRBdHRyaWJ1dGUoJ2lkJywgJ2VkaXRfc3luYXBzZScpXG4gICAgaWYgKHN5bmFwc2UuYXV0aG9yaXplVG9FZGl0KEFjdGl2ZS5NYXBwZXIpKSB7XG4gICAgICBlZGl0RGl2LmNsYXNzTmFtZSA9ICdwZXJtaXNzaW9uIGNhbkVkaXQnXG4gICAgICBlZGl0RGl2LmNsYXNzTmFtZSArPSBzeW5hcHNlLmF1dGhvcml6ZVBlcm1pc3Npb25DaGFuZ2UoQWN0aXZlLk1hcHBlcikgPyAnIHlvdXJFZGdlJyA6ICcnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVkaXREaXYuY2xhc3NOYW1lID0gJ3Blcm1pc3Npb24gY2Fubm90RWRpdCdcbiAgICB9XG4gICAgJCgnI3dyYXBwZXInKS5hcHBlbmQoZWRpdERpdilcblxuICAgIHNlbGYucG9wdWxhdGVTaG93Q2FyZChlZGdlLCBzeW5hcHNlKVxuXG4gICAgLy8gZHJvcCBpdCBpbiB0aGUgcmlnaHQgc3BvdCwgYWN0aXZhdGUgaXRcbiAgICAkKCcjZWRpdF9zeW5hcHNlJykuY3NzKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXG4gICAgaWYgKGUpIHtcbiAgICAgICQoJyNlZGl0X3N5bmFwc2UnKS5jc3MoJ2xlZnQnLCBlLmNsaWVudFgpXG4gICAgICAkKCcjZWRpdF9zeW5hcHNlJykuY3NzKCd0b3AnLCBlLmNsaWVudFkpXG4gICAgfSBlbHNlIHtcbiAgICAgICQoJyNlZGl0X3N5bmFwc2UnKS5jc3MoJ2xlZnQnLCBteVgpXG4gICAgICAkKCcjZWRpdF9zeW5hcHNlJykuY3NzKCd0b3AnLCBteVkpXG4gICAgfVxuICAgIC8vICQoJyNlZGl0X3N5bmFwc2VfbmFtZScpLmNsaWNrKCkgLy9yZXF1aXJlZCBpbiBjYXNlIG5hbWUgaXMgZW1wdHlcbiAgICAvLyAkKCcjZWRpdF9zeW5hcHNlX25hbWUgaW5wdXQnKS5mb2N1cygpXG4gICAgJCgnI2VkaXRfc3luYXBzZScpLnNob3coKVxuXG4gICAgc2VsZi5vcGVuU3luYXBzZUNhcmQgPSBlZGdlXG4gIH0sXG5cbiAgaGlkZUNhcmQ6IGZ1bmN0aW9uKCkge1xuICAgICQoJyNlZGl0X3N5bmFwc2UnKS5yZW1vdmUoKVxuICAgIFN5bmFwc2VDYXJkLm9wZW5TeW5hcHNlQ2FyZCA9IG51bGxcbiAgfSxcblxuICBwb3B1bGF0ZVNob3dDYXJkOiBmdW5jdGlvbihlZGdlLCBzeW5hcHNlKSB7XG4gICAgdmFyIHNlbGYgPSBTeW5hcHNlQ2FyZFxuXG4gICAgc2VsZi5hZGRfc3luYXBzZV9jb3VudChlZGdlKVxuICAgIHNlbGYuYWRkX2Rlc2NfZm9ybShzeW5hcHNlKVxuICAgIHNlbGYuYWRkX2Ryb3BfZG93bihlZGdlLCBzeW5hcHNlKVxuICAgIHNlbGYuYWRkX3VzZXJfaW5mbyhzeW5hcHNlKVxuICAgIHNlbGYuYWRkX3Blcm1zX2Zvcm0oc3luYXBzZSlcbiAgICBzZWxmLmFkZF9kaXJlY3Rpb25fZm9ybShzeW5hcHNlKVxuICB9LFxuICBhZGRfc3luYXBzZV9jb3VudDogZnVuY3Rpb24oZWRnZSkge1xuICAgIHZhciBjb3VudCA9IGVkZ2UuZ2V0RGF0YSgnc3luYXBzZXMnKS5sZW5ndGhcblxuICAgICQoJyNlZGl0U3luVXBwZXJCYXInKS5hcHBlbmQoJzxkaXYgaWQ9XCJzeW5hcHNlQ2FyZENvdW50XCI+JyArIGNvdW50ICsgJzwvZGl2PicpXG4gIH0sXG4gIGFkZF9kZXNjX2Zvcm06IGZ1bmN0aW9uKHN5bmFwc2UpIHtcbiAgICB2YXIgZGF0YU5pbCA9ICdDbGljayB0byBhZGQgZGVzY3JpcHRpb24uJ1xuXG4gICAgLy8gVE9ETyBtYWtlIGl0IHNvIHRoYXQgdGhpcyB3b3VsZCB3b3JrIGV2ZW4gaW4gc2FuZGJveCBtb2RlLFxuICAgIC8vIGN1cnJlbnRseSB3aXRoIEJlc3RfaW5fcGxhY2UgaXQgd29uJ3RcblxuICAgIC8vIGRlc2MgZWRpdGluZyBmb3JtXG4gICAgJCgnI2VkaXRTeW5VcHBlckJhcicpLmFwcGVuZCgnPGRpdiBpZD1cImVkaXRfc3luYXBzZV9kZXNjXCI+PC9kaXY+JylcbiAgICAkKCcjZWRpdF9zeW5hcHNlX2Rlc2MnKS5hdHRyKCdjbGFzcycsICdiZXN0X2luX3BsYWNlIGJlc3RfaW5fcGxhY2VfZGVzYycpXG4gICAgJCgnI2VkaXRfc3luYXBzZV9kZXNjJykuYXR0cignZGF0YS1iaXAtb2JqZWN0JywgJ3N5bmFwc2UnKVxuICAgICQoJyNlZGl0X3N5bmFwc2VfZGVzYycpLmF0dHIoJ2RhdGEtYmlwLWF0dHJpYnV0ZScsICdkZXNjJylcbiAgICAkKCcjZWRpdF9zeW5hcHNlX2Rlc2MnKS5hdHRyKCdkYXRhLWJpcC10eXBlJywgJ3RleHRhcmVhJylcbiAgICAkKCcjZWRpdF9zeW5hcHNlX2Rlc2MnKS5hdHRyKCdkYXRhLWJpcC1uaWwnLCBkYXRhTmlsKVxuICAgICQoJyNlZGl0X3N5bmFwc2VfZGVzYycpLmF0dHIoJ2RhdGEtYmlwLXVybCcsICcvc3luYXBzZXMvJyArIHN5bmFwc2UuaWQpXG4gICAgJCgnI2VkaXRfc3luYXBzZV9kZXNjJykuYXR0cignZGF0YS1iaXAtdmFsdWUnLCBzeW5hcHNlLmdldCgnZGVzYycpKVxuICAgICQoJyNlZGl0X3N5bmFwc2VfZGVzYycpLmh0bWwoc3luYXBzZS5nZXQoJ2Rlc2MnKSlcblxuICAgIC8vIGlmIGVkZ2UgZGF0YSBpcyBibGFuayBvciBqdXN0IHdoaXRlc3BhY2UsIHBvcHVsYXRlIGl0IHdpdGggZGF0YU5pbFxuICAgIGlmICgkKCcjZWRpdF9zeW5hcHNlX2Rlc2MnKS5odG1sKCkudHJpbSgpID09PSAnJykge1xuICAgICAgaWYgKHN5bmFwc2UuYXV0aG9yaXplVG9FZGl0KEFjdGl2ZS5NYXBwZXIpKSB7XG4gICAgICAgICQoJyNlZGl0X3N5bmFwc2VfZGVzYycpLmh0bWwoZGF0YU5pbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQoJyNlZGl0X3N5bmFwc2VfZGVzYycpLmh0bWwoJyhubyBkZXNjcmlwdGlvbiknKVxuICAgICAgfVxuICAgIH1cblxuICAgICQoJyNlZGl0X3N5bmFwc2VfZGVzYycpLmtleXByZXNzKGZ1bmN0aW9uKGUpIHtcbiAgICAgIGNvbnN0IEVOVEVSID0gMTNcbiAgICAgIGlmIChlLndoaWNoID09PSBFTlRFUikge1xuICAgICAgICAkKHRoaXMpLmRhdGEoJ2Jlc3RJblBsYWNlRWRpdG9yJykudXBkYXRlKClcbiAgICAgIH1cbiAgICB9KVxuICAgICQoJyNlZGl0X3N5bmFwc2VfZGVzYycpLmJpbmQoJ2FqYXg6c3VjY2VzcycsIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGRlc2MgPSAkKHRoaXMpLmh0bWwoKVxuICAgICAgaWYgKGRlc2MgPT09IGRhdGFOaWwpIHtcbiAgICAgICAgc3luYXBzZS5zZXQoJ2Rlc2MnLCAnJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN5bmFwc2Uuc2V0KCdkZXNjJywgZGVzYylcbiAgICAgIH1cbiAgICAgIHN5bmFwc2UudHJpZ2dlcignc2F2ZWQnKVxuICAgICAgQ29udHJvbC5zZWxlY3RFZGdlKHN5bmFwc2UuZ2V0KCdlZGdlJykpXG4gICAgICBWaXN1YWxpemUubUdyYXBoLnBsb3QoKVxuICAgIH0pXG4gIH0sXG4gIGFkZF9kcm9wX2Rvd246IGZ1bmN0aW9uKGVkZ2UsIHN5bmFwc2UpIHtcbiAgICB2YXIgbGlzdCwgaSwgc3luYXBzZXMsIGwsIGRlc2NcblxuICAgIHN5bmFwc2VzID0gZWRnZS5nZXREYXRhKCdzeW5hcHNlcycpXG4gICAgbCA9IHN5bmFwc2VzLmxlbmd0aFxuXG4gICAgaWYgKGwgPiAxKSB7XG4gICAgICAvLyBhcHBlbmQgdGhlIGVsZW1lbnQgdGhhdCB5b3UgY2xpY2sgdG8gc2hvdyBkcm9wZG93biBzZWxlY3RcbiAgICAgICQoJyNlZGl0U3luVXBwZXJCYXInKS5hcHBlbmQoJzxkaXYgaWQ9XCJkcm9wZG93blN5bmFwc2VzXCI+PC9kaXY+JylcbiAgICAgICQoJyNkcm9wZG93blN5bmFwc2VzJykuY2xpY2soZnVuY3Rpb24oZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKSAvLyBzdG9wIGl0IGZyb20gaW1tZWRpYXRlbHkgY2xvc2luZyBpdCBhZ2FpblxuICAgICAgICAkKCcjc3dpdGNoU3luYXBzZUxpc3QnKS50b2dnbGUoKVxuICAgICAgfSlcbiAgICAgIC8vIGhpZGUgdGhlIGRyb3Bkb3duIGFnYWluIGlmIHlvdSBjbGljayBhbnl3aGVyZSBlbHNlIG9uIHRoZSBzeW5hcHNlIGNhcmRcbiAgICAgICQoJyNlZGl0X3N5bmFwc2UnKS5jbGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgJCgnI3N3aXRjaFN5bmFwc2VMaXN0JykuaGlkZSgpXG4gICAgICB9KVxuXG4gICAgICAvLyBnZW5lcmF0ZSB0aGUgbGlzdCBvZiBvdGhlciBzeW5hcHNlc1xuICAgICAgbGlzdCA9ICc8dWwgaWQ9XCJzd2l0Y2hTeW5hcHNlTGlzdFwiPidcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKHN5bmFwc2VzW2ldICE9PSBzeW5hcHNlKSB7IC8vIGRvbid0IGFkZCB0aGUgY3VycmVudCBvbmUgdG8gdGhlIGxpc3RcbiAgICAgICAgICBkZXNjID0gc3luYXBzZXNbaV0uZ2V0KCdkZXNjJylcbiAgICAgICAgICBkZXNjID0gZGVzYyA9PT0gJycgfHwgZGVzYyA9PT0gbnVsbCA/ICcobm8gZGVzY3JpcHRpb24pJyA6IGRlc2NcbiAgICAgICAgICBsaXN0ICs9ICc8bGkgZGF0YS1zeW5hcHNlLWluZGV4PVwiJyArIGkgKyAnXCI+JyArIGRlc2MgKyAnPC9saT4nXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxpc3QgKz0gJzwvdWw+J1xuICAgICAgLy8gYWRkIHRoZSBsaXN0IG9mIHRoZSBvdGhlciBzeW5hcHNlc1xuICAgICAgJCgnI2VkaXRTeW5Mb3dlckJhcicpLmFwcGVuZChsaXN0KVxuXG4gICAgICAvLyBhdHRhY2ggY2xpY2sgbGlzdGVuZXJzIHRvIGxpc3QgaXRlbXMgdGhhdFxuICAgICAgLy8gd2lsbCBjYXVzZSBpdCB0byBzd2l0Y2ggdGhlIGRpc3BsYXllZCBzeW5hcHNlXG4gICAgICAvLyB3aGVuIHlvdSBjbGljayBpdFxuICAgICAgJCgnI3N3aXRjaFN5bmFwc2VMaXN0IGxpJykuY2xpY2soZnVuY3Rpb24oZSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgIHZhciBpbmRleCA9IHBhcnNlSW50KCQodGhpcykuYXR0cignZGF0YS1zeW5hcHNlLWluZGV4JykpXG4gICAgICAgIGVkZ2Uuc2V0RGF0YSgnZGlzcGxheUluZGV4JywgaW5kZXgpXG4gICAgICAgIFZpc3VhbGl6ZS5tR3JhcGgucGxvdCgpXG4gICAgICAgIFN5bmFwc2VDYXJkLnNob3dDYXJkKGVkZ2UsIGZhbHNlKVxuICAgICAgfSlcbiAgICB9XG4gIH0sXG4gIGFkZF91c2VyX2luZm86IGZ1bmN0aW9uKHN5bmFwc2UpIHtcbiAgICB2YXIgdSA9ICc8ZGl2IGlkPVwiZWRnZVVzZXJcIiBjbGFzcz1cImhvdmVyRm9yVGlwXCI+J1xuICAgIHUgKz0gJzxhIGhyZWY9XCIvZXhwbG9yZS9tYXBwZXIvJyArIHN5bmFwc2UuZ2V0KCd1c2VyX2lkJykgKyAnXCI+IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgLz48L2E+J1xuICAgIHUgKz0gJzxkaXYgY2xhc3M9XCJ0aXBcIj4nICsgc3luYXBzZS5nZXQoJ3VzZXJfbmFtZScpICsgJzwvZGl2PjwvZGl2PidcbiAgICAkKCcjZWRpdFN5bkxvd2VyQmFyJykuYXBwZW5kKHUpXG5cbiAgICAvLyBnZXQgbWFwcGVyIGltYWdlXG4gICAgdmFyIHNldE1hcHBlckltYWdlID0gZnVuY3Rpb24obWFwcGVyKSB7XG4gICAgICAkKCcjZWRnZVVzZXIgaW1nJykuYXR0cignc3JjJywgbWFwcGVyLmdldCgnaW1hZ2UnKSlcbiAgICB9XG4gICAgTWFwcGVyLmdldChzeW5hcHNlLmdldCgndXNlcl9pZCcpLCBzZXRNYXBwZXJJbWFnZSlcbiAgfSxcblxuICBhZGRfcGVybXNfZm9ybTogZnVuY3Rpb24oc3luYXBzZSkge1xuICAgIC8vIHBlcm1pc3Npb25zIC0gaWYgb3duZXIsIGFsc28gYWxsb3cgcGVybWlzc2lvbiBlZGl0aW5nXG4gICAgJCgnI2VkaXRTeW5Mb3dlckJhcicpLmFwcGVuZCgnPGRpdiBjbGFzcz1cIm1hcFBlcm0gJyArIHN5bmFwc2UuZ2V0KCdwZXJtaXNzaW9uJykuc3Vic3RyaW5nKDAsIDIpICsgJ1wiPjwvZGl2PicpXG5cbiAgICAvLyBhYmlsaXR5IHRvIGNoYW5nZSBwZXJtaXNzaW9uXG4gICAgdmFyIHNlbGVjdGluZ1Blcm1pc3Npb24gPSBmYWxzZVxuICAgIHZhciBwZXJtaXNzaW9uTGlDbGljayA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBzZWxlY3RpbmdQZXJtaXNzaW9uID0gZmFsc2VcbiAgICAgIHZhciBwZXJtaXNzaW9uID0gJCh0aGlzKS5hdHRyKCdjbGFzcycpXG4gICAgICBzeW5hcHNlLnNhdmUoe1xuICAgICAgICBwZXJtaXNzaW9uOiBwZXJtaXNzaW9uLFxuICAgICAgICBkZWZlcl90b19tYXBfaWQ6IG51bGxcbiAgICAgIH0pXG4gICAgICAkKCcjZWRpdF9zeW5hcHNlIC5tYXBQZXJtJykucmVtb3ZlQ2xhc3MoJ2NvIHB1IHByIG1pbmltaXplJykuYWRkQ2xhc3MocGVybWlzc2lvbi5zdWJzdHJpbmcoMCwgMikpXG4gICAgICAkKCcjZWRpdF9zeW5hcHNlIC5wZXJtaXNzaW9uU2VsZWN0JykucmVtb3ZlKClcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgfVxuXG4gICAgdmFyIG9wZW5QZXJtaXNzaW9uU2VsZWN0ID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGlmICghc2VsZWN0aW5nUGVybWlzc2lvbikge1xuICAgICAgICBzZWxlY3RpbmdQZXJtaXNzaW9uID0gdHJ1ZVxuICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdtaW5pbWl6ZScpIC8vIHRoaXMgbGluZSBmbGlwcyB0aGUgZHJvcCBkb3duIGFycm93IHRvIGEgcHVsbCB1cCBhcnJvd1xuICAgICAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnY28nKSkge1xuICAgICAgICAgICQodGhpcykuYXBwZW5kKCc8dWwgY2xhc3M9XCJwZXJtaXNzaW9uU2VsZWN0XCI+PGxpIGNsYXNzPVwicHVibGljXCI+PC9saT48bGkgY2xhc3M9XCJwcml2YXRlXCI+PC9saT48L3VsPicpXG4gICAgICAgIH0gZWxzZSBpZiAoJCh0aGlzKS5oYXNDbGFzcygncHUnKSkge1xuICAgICAgICAgICQodGhpcykuYXBwZW5kKCc8dWwgY2xhc3M9XCJwZXJtaXNzaW9uU2VsZWN0XCI+PGxpIGNsYXNzPVwiY29tbW9uc1wiPjwvbGk+PGxpIGNsYXNzPVwicHJpdmF0ZVwiPjwvbGk+PC91bD4nKVxuICAgICAgICB9IGVsc2UgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ3ByJykpIHtcbiAgICAgICAgICAkKHRoaXMpLmFwcGVuZCgnPHVsIGNsYXNzPVwicGVybWlzc2lvblNlbGVjdFwiPjxsaSBjbGFzcz1cImNvbW1vbnNcIj48L2xpPjxsaSBjbGFzcz1cInB1YmxpY1wiPjwvbGk+PC91bD4nKVxuICAgICAgICB9XG4gICAgICAgICQoJyNlZGl0X3N5bmFwc2UgLnBlcm1pc3Npb25TZWxlY3QgbGknKS5jbGljayhwZXJtaXNzaW9uTGlDbGljaylcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaGlkZVBlcm1pc3Npb25TZWxlY3QgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGVjdGluZ1Blcm1pc3Npb24gPSBmYWxzZVxuICAgICAgJCgnI2VkaXRfc3luYXBzZS55b3VyRWRnZSAubWFwUGVybScpLnJlbW92ZUNsYXNzKCdtaW5pbWl6ZScpIC8vIHRoaXMgbGluZSBmbGlwcyB0aGUgcHVsbCB1cCBhcnJvdyB0byBhIGRyb3AgZG93biBhcnJvd1xuICAgICAgJCgnI2VkaXRfc3luYXBzZSAucGVybWlzc2lvblNlbGVjdCcpLnJlbW92ZSgpXG4gICAgfVxuXG4gICAgaWYgKHN5bmFwc2UuYXV0aG9yaXplUGVybWlzc2lvbkNoYW5nZShBY3RpdmUuTWFwcGVyKSkge1xuICAgICAgJCgnI2VkaXRfc3luYXBzZS55b3VyRWRnZSAubWFwUGVybScpLmNsaWNrKG9wZW5QZXJtaXNzaW9uU2VsZWN0KVxuICAgICAgJCgnI2VkaXRfc3luYXBzZScpLmNsaWNrKGhpZGVQZXJtaXNzaW9uU2VsZWN0KVxuICAgIH1cbiAgfSwgLy8gYWRkX3Blcm1zX2Zvcm1cblxuICBhZGRfZGlyZWN0aW9uX2Zvcm06IGZ1bmN0aW9uKHN5bmFwc2UpIHtcbiAgICAvLyBkaXJlY3Rpb25hbGl0eSBjaGVja2JveGVzXG4gICAgJCgnI2VkaXRTeW5Mb3dlckJhcicpLmFwcGVuZCgnPGRpdiBpZD1cImVkaXRfc3luYXBzZV9sZWZ0XCI+PC9kaXY+JylcbiAgICAkKCcjZWRpdFN5bkxvd2VyQmFyJykuYXBwZW5kKCc8ZGl2IGlkPVwiZWRpdF9zeW5hcHNlX3JpZ2h0XCI+PC9kaXY+JylcblxuICAgIHZhciBlZGdlID0gc3luYXBzZS5nZXQoJ2VkZ2UnKVxuXG4gICAgLy8gZGV0ZXJtaW5lIHdoaWNoIG5vZGUgaXMgdG8gdGhlIGxlZnQgYW5kIHRoZSByaWdodFxuICAgIC8vIGlmIGRpcmVjdGx5IGluIGEgbGluZSwgdG9wIGlzIGxlZnRcbiAgICBsZXQgbGVmdFxuICAgIGxldCByaWdodFxuICAgIGlmIChlZGdlLm5vZGVGcm9tLnBvcy54IDwgZWRnZS5ub2RlVG8ucG9zLnggfHxcbiAgICAgIGVkZ2Uubm9kZUZyb20ucG9zLnggPT09IGVkZ2Uubm9kZVRvLnBvcy54ICYmXG4gICAgICBlZGdlLm5vZGVGcm9tLnBvcy55IDwgZWRnZS5ub2RlVG8ucG9zLnkpIHtcbiAgICAgIGxlZnQgPSBlZGdlLm5vZGVUby5nZXREYXRhKCd0b3BpYycpXG4gICAgICByaWdodCA9IGVkZ2Uubm9kZUZyb20uZ2V0RGF0YSgndG9waWMnKVxuICAgIH0gZWxzZSB7XG4gICAgICBsZWZ0ID0gZWRnZS5ub2RlRnJvbS5nZXREYXRhKCd0b3BpYycpXG4gICAgICByaWdodCA9IGVkZ2Uubm9kZVRvLmdldERhdGEoJ3RvcGljJylcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIE9uZSBub2RlIGlzIGFjdHVhbGx5IG9uIHRoZSBsZWZ0IG9uc2NyZWVuLiBDYWxsIGl0IGxlZnQsICYgdGhlIG90aGVyIHJpZ2h0LlxuICAgICAqIElmIGNhdGVnb3J5IGlzIGZyb20tdG8sIGFuZCB0aGF0IG5vZGUgaXMgZmlyc3QsIGNoZWNrIHRoZSAncmlnaHQnIGNoZWNrYm94LlxuICAgICAqIEVsc2UgY2hlY2sgdGhlICdsZWZ0JyBjaGVja2JveCBzaW5jZSB0aGUgYXJyb3cgaXMgaW5jb21pbmcuXG4gICAgICovXG5cbiAgICB2YXIgZGlyZWN0aW9uQ2F0ID0gc3luYXBzZS5nZXQoJ2NhdGVnb3J5JykgLy8gYm90aCwgbm9uZSwgZnJvbS10b1xuICAgIGlmIChkaXJlY3Rpb25DYXQgPT09ICdmcm9tLXRvJykge1xuICAgICAgdmFyIGZyb21UbyA9IFtzeW5hcHNlLmdldCgndG9waWMxX2lkJyksIHN5bmFwc2UuZ2V0KCd0b3BpYzJfaWQnKV1cbiAgICAgIGlmIChmcm9tVG9bMF0gPT09IGxlZnQuaWQpIHtcbiAgICAgICAgLy8gY2hlY2sgbGVmdCBjaGVja2JveFxuICAgICAgICAkKCcjZWRpdF9zeW5hcHNlX2xlZnQnKS5hZGRDbGFzcygnY2hlY2tlZCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjaGVjayByaWdodCBjaGVja2JveFxuICAgICAgICAkKCcjZWRpdF9zeW5hcHNlX3JpZ2h0JykuYWRkQ2xhc3MoJ2NoZWNrZWQnKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uQ2F0ID09PSAnYm90aCcpIHtcbiAgICAgIC8vIGNoZWNrIGJvdGggY2hlY2tib3hlc1xuICAgICAgJCgnI2VkaXRfc3luYXBzZV9sZWZ0JykuYWRkQ2xhc3MoJ2NoZWNrZWQnKVxuICAgICAgJCgnI2VkaXRfc3luYXBzZV9yaWdodCcpLmFkZENsYXNzKCdjaGVja2VkJylcbiAgICB9XG5cbiAgICBpZiAoc3luYXBzZS5hdXRob3JpemVUb0VkaXQoQWN0aXZlLk1hcHBlcikpIHtcbiAgICAgICQoJyNlZGl0X3N5bmFwc2VfbGVmdCwgI2VkaXRfc3luYXBzZV9yaWdodCcpLmNsaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgICAkKHRoaXMpLnRvZ2dsZUNsYXNzKCdjaGVja2VkJylcblxuICAgICAgICB2YXIgbGVmdENoZWNrZWQgPSAkKCcjZWRpdF9zeW5hcHNlX2xlZnQnKS5pcygnLmNoZWNrZWQnKVxuICAgICAgICB2YXIgcmlnaHRDaGVja2VkID0gJCgnI2VkaXRfc3luYXBzZV9yaWdodCcpLmlzKCcuY2hlY2tlZCcpXG5cbiAgICAgICAgdmFyIGRpciA9IHN5bmFwc2UuZ2V0RGlyZWN0aW9uKClcbiAgICAgICAgdmFyIGRpckNhdCA9ICdub25lJ1xuICAgICAgICBpZiAobGVmdENoZWNrZWQgJiYgcmlnaHRDaGVja2VkKSB7XG4gICAgICAgICAgZGlyQ2F0ID0gJ2JvdGgnXG4gICAgICAgIH0gZWxzZSBpZiAoIWxlZnRDaGVja2VkICYmIHJpZ2h0Q2hlY2tlZCkge1xuICAgICAgICAgIGRpckNhdCA9ICdmcm9tLXRvJ1xuICAgICAgICAgIGRpciA9IFtyaWdodC5pZCwgbGVmdC5pZF1cbiAgICAgICAgfSBlbHNlIGlmIChsZWZ0Q2hlY2tlZCAmJiAhcmlnaHRDaGVja2VkKSB7XG4gICAgICAgICAgZGlyQ2F0ID0gJ2Zyb20tdG8nXG4gICAgICAgICAgZGlyID0gW2xlZnQuaWQsIHJpZ2h0LmlkXVxuICAgICAgICB9XG5cbiAgICAgICAgc3luYXBzZS5zYXZlKHtcbiAgICAgICAgICBjYXRlZ29yeTogZGlyQ2F0LFxuICAgICAgICAgIHRvcGljMV9pZDogZGlyWzBdLFxuICAgICAgICAgIHRvcGljMl9pZDogZGlyWzFdXG4gICAgICAgIH0pXG4gICAgICAgIFZpc3VhbGl6ZS5tR3JhcGgucGxvdCgpXG4gICAgICB9KVxuICAgIH0gLy8gaWZcbiAgfSAvLyBhZGRfZGlyZWN0aW9uX2Zvcm1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU3luYXBzZUNhcmRcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBmcm9udGVuZC9zcmMvTWV0YW1hcHMvU3luYXBzZUNhcmQuanMiXSwibWFwcGluZ3MiOiI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTVSQTtBQUNBO0FBOFJBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 570 */
/***/ function(module, exports) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true }); /* global $ */\n\nvar CheatSheet = {\n  init: function init() {\n    // tab the cheatsheet\n    $('#cheatSheet').tabs();\n    $('#quickReference').tabs().addClass('ui-tabs-vertical ui-helper-clearfix');\n    $('#quickReference .ui-tabs-nav li').removeClass('ui-corner-top').addClass('ui-corner-left');\n\n    // // id = the id of a vimeo video\n    // var switchVideo = function(element, id) {\n    //   $('.tutorialItem').removeClass('active')\n    //   $(element).addClass('active')\n    //   $('#tutorialVideo').attr('src', '//player.vimeo.com/video/' + id)\n    // }\n\n    // $('#gettingStarted').click(function() {\n    //   switchVideo(this,'88334167')\n    // })\n    // $('#upYourSkillz').click(function() {\n    //   switchVideo(this,'100118167')\n    // })\n    // $('#advancedMapping').click(function() {\n    //   switchVideo(this,'88334167')\n    // })\n  } };exports.default =\n\n\nCheatSheet;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTcwLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvTWFwL0NoZWF0U2hlZXQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsICQgKi9cblxuY29uc3QgQ2hlYXRTaGVldCA9IHtcbiAgaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgLy8gdGFiIHRoZSBjaGVhdHNoZWV0XG4gICAgJCgnI2NoZWF0U2hlZXQnKS50YWJzKClcbiAgICAkKCcjcXVpY2tSZWZlcmVuY2UnKS50YWJzKCkuYWRkQ2xhc3MoJ3VpLXRhYnMtdmVydGljYWwgdWktaGVscGVyLWNsZWFyZml4JylcbiAgICAkKCcjcXVpY2tSZWZlcmVuY2UgLnVpLXRhYnMtbmF2IGxpJykucmVtb3ZlQ2xhc3MoJ3VpLWNvcm5lci10b3AnKS5hZGRDbGFzcygndWktY29ybmVyLWxlZnQnKVxuXG4gICAgLy8gLy8gaWQgPSB0aGUgaWQgb2YgYSB2aW1lbyB2aWRlb1xuICAgIC8vIHZhciBzd2l0Y2hWaWRlbyA9IGZ1bmN0aW9uKGVsZW1lbnQsIGlkKSB7XG4gICAgLy8gICAkKCcudHV0b3JpYWxJdGVtJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpXG4gICAgLy8gICAkKGVsZW1lbnQpLmFkZENsYXNzKCdhY3RpdmUnKVxuICAgIC8vICAgJCgnI3R1dG9yaWFsVmlkZW8nKS5hdHRyKCdzcmMnLCAnLy9wbGF5ZXIudmltZW8uY29tL3ZpZGVvLycgKyBpZClcbiAgICAvLyB9XG5cbiAgICAvLyAkKCcjZ2V0dGluZ1N0YXJ0ZWQnKS5jbGljayhmdW5jdGlvbigpIHtcbiAgICAvLyAgIHN3aXRjaFZpZGVvKHRoaXMsJzg4MzM0MTY3JylcbiAgICAvLyB9KVxuICAgIC8vICQoJyN1cFlvdXJTa2lsbHonKS5jbGljayhmdW5jdGlvbigpIHtcbiAgICAvLyAgIHN3aXRjaFZpZGVvKHRoaXMsJzEwMDExODE2NycpXG4gICAgLy8gfSlcbiAgICAvLyAkKCcjYWR2YW5jZWRNYXBwaW5nJykuY2xpY2soZnVuY3Rpb24oKSB7XG4gICAgLy8gICBzd2l0Y2hWaWRlbyh0aGlzLCc4ODMzNDE2NycpXG4gICAgLy8gfSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDaGVhdFNoZWV0XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL01ldGFtYXBzL01hcC9DaGVhdFNoZWV0LmpzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 571 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });\n\nvar _JIT = __webpack_require__(170);var _JIT2 = _interopRequireDefault(_JIT);\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _AutoLayout = __webpack_require__(8);var _AutoLayout2 = _interopRequireDefault(_AutoLayout);\nvar _Create = __webpack_require__(173);var _Create2 = _interopRequireDefault(_Create);\nvar _DataModel = __webpack_require__(149);var _DataModel2 = _interopRequireDefault(_DataModel);\nvar _Engine = __webpack_require__(150);var _Engine2 = _interopRequireDefault(_Engine);\nvar _Filter = __webpack_require__(356);var _Filter2 = _interopRequireDefault(_Filter);\nvar _GlobalUI = __webpack_require__(362);var _GlobalUI2 = _interopRequireDefault(_GlobalUI);\nvar _JIT3 = __webpack_require__(355);var _JIT4 = _interopRequireDefault(_JIT3);\nvar _Map = __webpack_require__(369);var _Map2 = _interopRequireDefault(_Map);\nvar _Mouse = __webpack_require__(352);var _Mouse2 = _interopRequireDefault(_Mouse);\nvar _Router = __webpack_require__(367);var _Router2 = _interopRequireDefault(_Router);\nvar _Selected = __webpack_require__(353);var _Selected2 = _interopRequireDefault(_Selected);\nvar _Settings = __webpack_require__(572);var _Settings2 = _interopRequireDefault(_Settings);\nvar _Synapse = __webpack_require__(354);var _Synapse2 = _interopRequireDefault(_Synapse);\nvar _SynapseCard = __webpack_require__(569);var _SynapseCard2 = _interopRequireDefault(_SynapseCard);\nvar _TopicCard = __webpack_require__(566);var _TopicCard2 = _interopRequireDefault(_TopicCard);\nvar _Util = __webpack_require__(410);var _Util2 = _interopRequireDefault(_Util);\nvar _Visualize = __webpack_require__(561);var _Visualize2 = _interopRequireDefault(_Visualize);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}\n\nvar noOp = function noOp() {}; /* global $ */\n\nvar Topic = {\n  // this function is to retrieve a topic JSON object from the database\n  // @param id = the id of the topic to retrieve\n  get: function get(id) {var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noOp;\n    // if the desired topic is not yet in the local topic repository, fetch it\n    if (_DataModel2.default.Topics.get(id) === undefined) {\n      $.ajax({\n        url: '/topics/' + id + '.json',\n        success: function success(data) {\n          _DataModel2.default.Topics.add(data);\n          callback(_DataModel2.default.Topics.get(id));\n        } });\n\n    } else callback(_DataModel2.default.Topics.get(id));\n  },\n  launch: function launch(id) {\n    var start = function start(data) {\n      _Active2.default.Topic = new _DataModel2.default.Topic(data.topic);\n      _DataModel2.default.Creators = new _DataModel2.default.MapperCollection(data.creators);\n      _DataModel2.default.Topics = new _DataModel2.default.TopicCollection([data.topic].concat(data.relatives));\n      _DataModel2.default.Synapses = new _DataModel2.default.SynapseCollection(data.synapses);\n      _DataModel2.default.attachCollectionEvents();\n\n      document.title = _Active2.default.Topic.get('name') + ' | Metamaps';\n\n      // set filter mapper H3 text\n      $('#filter_by_mapper h3').html('CREATORS');\n\n      // build and render the visualization\n      _Visualize2.default.type = 'RGraph';\n      _JIT4.default.prepareVizData();\n\n      // update filters\n      _Filter2.default.reset();\n\n      // reset selected arrays\n      _Selected2.default.reset();\n\n      // these three update the actual filter box with the right list items\n      _Filter2.default.checkMetacodes();\n      _Filter2.default.checkSynapses();\n      _Filter2.default.checkMappers();\n\n      // for mobile\n      $('#header_content').html(_Active2.default.Topic.get('name'));\n    };\n\n    $.ajax({\n      url: '/topics/' + id + '/network.json',\n      success: start });\n\n  },\n  end: function end() {\n    if (_Active2.default.Topic) {\n      $('.rightclickmenu').remove();\n      _TopicCard2.default.hideCard();\n      _SynapseCard2.default.hideCard();\n      _Filter2.default.close();\n    }\n  },\n  centerOn: function centerOn(nodeid, callback) {\n    // don't clash with fetchRelatives\n    if (!_Visualize2.default.mGraph.busy) {\n      _Visualize2.default.mGraph.onClick(nodeid, {\n        hideLabels: false,\n        duration: 1000,\n        onComplete: function onComplete() {\n          if (callback) callback();\n        } });\n\n      _Router2.default.navigate('/topics/' + nodeid);\n      _Active2.default.Topic = _DataModel2.default.Topics.get(nodeid);\n    }\n  },\n  fetchRelatives: function fetchRelatives(nodes, metacodeId) {\n    var self = this;\n\n    var node = $.isArray(nodes) ? nodes[0] : nodes;\n\n    var topics = _DataModel2.default.Topics.map(function (t) {return t.id;});\n    var topicsString = topics.join();\n\n    var creators = _DataModel2.default.Creators.map(function (t) {return t.id;});\n    var creatorsString = creators.join();\n\n    var topic = node.getData('topic');\n\n    var _successCallback;\n    _successCallback = function successCallback(data) {\n      if (_Visualize2.default.mGraph.busy) {\n        // don't clash with centerOn\n        window.setTimeout(function () {_successCallback(data);}, 100);\n        return;\n      }\n      if (data.creators.length > 0) _DataModel2.default.Creators.add(data.creators);\n      if (data.topics.length > 0) _DataModel2.default.Topics.add(data.topics);\n      if (data.synapses.length > 0) _DataModel2.default.Synapses.add(data.synapses);\n\n      var topicColl = new _DataModel2.default.TopicCollection(data.topics);\n      topicColl.add(topic);\n      var synapseColl = new _DataModel2.default.SynapseCollection(data.synapses);\n\n      var graph = _JIT4.default.convertModelsToJIT(topicColl, synapseColl)[0];\n      _Visualize2.default.mGraph.op.sum(graph, {\n        type: 'fade',\n        duration: 500,\n        hideLabels: false });\n\n\n      var i, l, t, s;\n\n      _Visualize2.default.mGraph.graph.eachNode(function (n) {\n        t = _DataModel2.default.Topics.get(n.id);\n        t.set({ node: n }, { silent: true });\n        t.updateNode();\n\n        n.eachAdjacency(function (edge) {\n          if (!edge.getData('init')) {\n            edge.setData('init', true);\n\n            l = edge.getData('synapseIDs').length;\n            for (i = 0; i < l; i++) {\n              s = _DataModel2.default.Synapses.get(edge.getData('synapseIDs')[i]);\n              s.set({ edge: edge }, { silent: true });\n              s.updateEdge();\n            }\n          }\n        });\n      });\n      if ($.isArray(nodes) && nodes.length > 1) {\n        self.fetchRelatives(nodes.slice(1), metacodeId);\n      }\n    };\n\n    var paramsString = metacodeId ? 'metacode=' + metacodeId + '&' : '';\n    paramsString += 'network=' + topicsString + '&creators=' + creatorsString;\n\n    $.ajax({\n      type: 'GET',\n      url: '/topics/' + topic.id + '/relatives.json?' + paramsString,\n      success: _successCallback,\n      error: function error() {} });\n\n  },\n\n  renderTopic: function renderTopic(mapping, topic, fromRemote) {\n    var nodeOnViz = void 0;\n    var newnode = topic.createNode();\n    var createSynapse = !!_Create2.default.newSynapse.focusNode && !fromRemote;\n    var connectToId = createSynapse ? _Create2.default.newSynapse.focusNode.getData('topic').id : null;\n    if (!$.isEmptyObject(_Visualize2.default.mGraph.graph.nodes)) {\n      _Visualize2.default.mGraph.graph.addNode(newnode);\n    } else {\n      _Visualize2.default.mGraph.loadJSON(newnode);\n    }\n    nodeOnViz = _Visualize2.default.mGraph.graph.getNode(newnode.id);\n    topic.set('node', nodeOnViz, { silent: true });\n    topic.updateNode(); // links the topic and the mapping to the node\n    nodeOnViz.setData('dim', 1, 'start');\n    nodeOnViz.setData('dim', 25, 'end');\n    nodeOnViz.setPos(new _JIT2.default.Complex(mapping.get('xloc'), mapping.get('yloc')), 'current');\n    nodeOnViz.setPos(new _JIT2.default.Complex(mapping.get('xloc'), mapping.get('yloc')), 'start');\n    nodeOnViz.setPos(new _JIT2.default.Complex(mapping.get('xloc'), mapping.get('yloc')), 'end');\n    _Visualize2.default.mGraph.fx.plotNode(nodeOnViz, _Visualize2.default.mGraph.canvas);\n    _Visualize2.default.mGraph.fx.animate({\n      modes: ['node-property:dim'],\n      duration: 200 });\n\n    if (!fromRemote && topic.isNew()) {\n      topic.save(null, {\n        success: function success(topicModel) {\n          _Active2.default.Map && mapping.save({ mappable_id: topicModel.id });\n          createSynapse && _Synapse2.default.createSynapseLocally(connectToId, topicModel.id);\n        } });\n\n    } else if (!fromRemote && !topic.isNew()) {\n      _Active2.default.Map && mapping.save();\n      createSynapse && _Synapse2.default.createSynapseLocally(connectToId, topic.id);\n    }\n  },\n  createTopicLocally: function createTopicLocally() {\n    var self = Topic;\n    if (_Create2.default.newTopic.name === '') {\n      _GlobalUI2.default.notifyUser('Please enter a topic title...');\n      return;\n    }\n    $(document).trigger(_Map2.default.events.editedByActiveMapper);\n    var metacode = _DataModel2.default.Metacodes.get(_Create2.default.newTopic.metacode);\n    var topic = new _DataModel2.default.Topic({\n      name: _Create2.default.newTopic.name,\n      metacode_id: metacode.id,\n      defer_to_map_id: _Active2.default.Map.id });\n\n    _DataModel2.default.Topics.add(topic);\n    var mapping = new _DataModel2.default.Mapping({\n      xloc: _Mouse2.default.newNodeCoords.x,\n      yloc: _Mouse2.default.newNodeCoords.y,\n      mappable_id: topic.cid,\n      mappable_type: 'Topic' });\n\n    _DataModel2.default.Mappings.add(mapping);\n    // these can't happen until the new topic values are retrieved\n    _Create2.default.newTopic.reset();\n    self.renderTopic(mapping, topic);\n    _Engine2.default.setFocusNode(topic.get('node'), false, true);\n  },\n  getTopicFromAutocomplete: function getTopicFromAutocomplete(id) {\n    var self = Topic;\n    $(document).trigger(_Map2.default.events.editedByActiveMapper);\n    _Create2.default.newTopic.reset();\n    self.get(id, function (topic) {\n      var mapping = new _DataModel2.default.Mapping({\n        xloc: _Mouse2.default.newNodeCoords.x,\n        yloc: _Mouse2.default.newNodeCoords.y,\n        mappable_type: 'Topic',\n        mappable_id: topic.id });\n\n      _DataModel2.default.Mappings.add(mapping);\n      self.renderTopic(mapping, topic);\n      _Engine2.default.setFocusNode(topic.get('node'), false, true);\n    });\n  },\n  getMapFromAutocomplete: function getMapFromAutocomplete(data) {\n    var self = Topic;\n    $(document).trigger(_Map2.default.events.editedByActiveMapper);\n    var metacode = _DataModel2.default.Metacodes.findWhere({ name: 'Metamap' });\n    var topic = new _DataModel2.default.Topic({\n      name: data.name,\n      metacode_id: metacode.id,\n      defer_to_map_id: _Active2.default.Map.id,\n      link: window.location.origin + '/maps/' + data.id });\n\n    _DataModel2.default.Topics.add(topic);\n    var mapping = new _DataModel2.default.Mapping({\n      xloc: _Mouse2.default.newNodeCoords.x,\n      yloc: _Mouse2.default.newNodeCoords.y,\n      mappable_id: topic.cid,\n      mappable_type: 'Topic' });\n\n    _DataModel2.default.Mappings.add(mapping);\n    _Create2.default.newTopic.reset();\n    self.renderTopic(mapping, topic);\n    _Engine2.default.setFocusNode(topic.get('node'), false, true);\n  },\n  getTopicFromSearch: function getTopicFromSearch(event, id) {\n    var self = Topic;\n    $(document).trigger(_Map2.default.events.editedByActiveMapper);\n    self.get(id, function (topic) {\n      var nextCoords = _AutoLayout2.default.getNextCoord({ mappings: _DataModel2.default.Mappings });\n      var mapping = new _DataModel2.default.Mapping({\n        xloc: nextCoords.x,\n        yloc: nextCoords.y,\n        mappable_type: 'Topic',\n        mappable_id: topic.id });\n\n      _DataModel2.default.Mappings.add(mapping);\n      self.renderTopic(mapping, topic);\n      _Engine2.default.runLayout();\n      _GlobalUI2.default.notifyUser('Topic was added to your map');\n    });\n    event.stopPropagation();\n    event.preventDefault();\n    return false;\n  } };exports.default =\n\n\nTopic;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTcxLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvVG9waWMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsICQgKi9cblxuaW1wb3J0ICRqaXQgZnJvbSAnLi4vcGF0Y2hlZC9KSVQnXG5cbmltcG9ydCBBY3RpdmUgZnJvbSAnLi9BY3RpdmUnXG5pbXBvcnQgQXV0b0xheW91dCBmcm9tICcuL0F1dG9MYXlvdXQnXG5pbXBvcnQgQ3JlYXRlIGZyb20gJy4vQ3JlYXRlJ1xuaW1wb3J0IERhdGFNb2RlbCBmcm9tICcuL0RhdGFNb2RlbCdcbmltcG9ydCBFbmdpbmUgZnJvbSAnLi9FbmdpbmUnXG5pbXBvcnQgRmlsdGVyIGZyb20gJy4vRmlsdGVyJ1xuaW1wb3J0IEdsb2JhbFVJIGZyb20gJy4vR2xvYmFsVUknXG5pbXBvcnQgSklUIGZyb20gJy4vSklUJ1xuaW1wb3J0IE1hcCBmcm9tICcuL01hcCdcbmltcG9ydCBNb3VzZSBmcm9tICcuL01vdXNlJ1xuaW1wb3J0IFJvdXRlciBmcm9tICcuL1JvdXRlcidcbmltcG9ydCBTZWxlY3RlZCBmcm9tICcuL1NlbGVjdGVkJ1xuaW1wb3J0IFNldHRpbmdzIGZyb20gJy4vU2V0dGluZ3MnXG5pbXBvcnQgU3luYXBzZSBmcm9tICcuL1N5bmFwc2UnXG5pbXBvcnQgU3luYXBzZUNhcmQgZnJvbSAnLi9TeW5hcHNlQ2FyZCdcbmltcG9ydCBUb3BpY0NhcmQgZnJvbSAnLi9Ub3BpY0NhcmQnXG5pbXBvcnQgVXRpbCBmcm9tICcuL1V0aWwnXG5pbXBvcnQgVmlzdWFsaXplIGZyb20gJy4vVmlzdWFsaXplJ1xuXG5jb25zdCBub09wID0gKCkgPT4ge31cblxuY29uc3QgVG9waWMgPSB7XG4gIC8vIHRoaXMgZnVuY3Rpb24gaXMgdG8gcmV0cmlldmUgYSB0b3BpYyBKU09OIG9iamVjdCBmcm9tIHRoZSBkYXRhYmFzZVxuICAvLyBAcGFyYW0gaWQgPSB0aGUgaWQgb2YgdGhlIHRvcGljIHRvIHJldHJpZXZlXG4gIGdldDogZnVuY3Rpb24oaWQsIGNhbGxiYWNrID0gbm9PcCkge1xuICAgIC8vIGlmIHRoZSBkZXNpcmVkIHRvcGljIGlzIG5vdCB5ZXQgaW4gdGhlIGxvY2FsIHRvcGljIHJlcG9zaXRvcnksIGZldGNoIGl0XG4gICAgaWYgKERhdGFNb2RlbC5Ub3BpY3MuZ2V0KGlkKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAkLmFqYXgoe1xuICAgICAgICB1cmw6ICcvdG9waWNzLycgKyBpZCArICcuanNvbicsXG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICBEYXRhTW9kZWwuVG9waWNzLmFkZChkYXRhKVxuICAgICAgICAgIGNhbGxiYWNrKERhdGFNb2RlbC5Ub3BpY3MuZ2V0KGlkKSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGVsc2UgY2FsbGJhY2soRGF0YU1vZGVsLlRvcGljcy5nZXQoaWQpKVxuICB9LFxuICBsYXVuY2g6IGZ1bmN0aW9uKGlkKSB7XG4gICAgdmFyIHN0YXJ0ID0gZnVuY3Rpb24oZGF0YSkge1xuICAgICAgQWN0aXZlLlRvcGljID0gbmV3IERhdGFNb2RlbC5Ub3BpYyhkYXRhLnRvcGljKVxuICAgICAgRGF0YU1vZGVsLkNyZWF0b3JzID0gbmV3IERhdGFNb2RlbC5NYXBwZXJDb2xsZWN0aW9uKGRhdGEuY3JlYXRvcnMpXG4gICAgICBEYXRhTW9kZWwuVG9waWNzID0gbmV3IERhdGFNb2RlbC5Ub3BpY0NvbGxlY3Rpb24oW2RhdGEudG9waWNdLmNvbmNhdChkYXRhLnJlbGF0aXZlcykpXG4gICAgICBEYXRhTW9kZWwuU3luYXBzZXMgPSBuZXcgRGF0YU1vZGVsLlN5bmFwc2VDb2xsZWN0aW9uKGRhdGEuc3luYXBzZXMpXG4gICAgICBEYXRhTW9kZWwuYXR0YWNoQ29sbGVjdGlvbkV2ZW50cygpXG5cbiAgICAgIGRvY3VtZW50LnRpdGxlID0gQWN0aXZlLlRvcGljLmdldCgnbmFtZScpICsgJyB8IE1ldGFtYXBzJ1xuXG4gICAgICAvLyBzZXQgZmlsdGVyIG1hcHBlciBIMyB0ZXh0XG4gICAgICAkKCcjZmlsdGVyX2J5X21hcHBlciBoMycpLmh0bWwoJ0NSRUFUT1JTJylcblxuICAgICAgLy8gYnVpbGQgYW5kIHJlbmRlciB0aGUgdmlzdWFsaXphdGlvblxuICAgICAgVmlzdWFsaXplLnR5cGUgPSAnUkdyYXBoJ1xuICAgICAgSklULnByZXBhcmVWaXpEYXRhKClcblxuICAgICAgLy8gdXBkYXRlIGZpbHRlcnNcbiAgICAgIEZpbHRlci5yZXNldCgpXG5cbiAgICAgIC8vIHJlc2V0IHNlbGVjdGVkIGFycmF5c1xuICAgICAgU2VsZWN0ZWQucmVzZXQoKVxuXG4gICAgICAvLyB0aGVzZSB0aHJlZSB1cGRhdGUgdGhlIGFjdHVhbCBmaWx0ZXIgYm94IHdpdGggdGhlIHJpZ2h0IGxpc3QgaXRlbXNcbiAgICAgIEZpbHRlci5jaGVja01ldGFjb2RlcygpXG4gICAgICBGaWx0ZXIuY2hlY2tTeW5hcHNlcygpXG4gICAgICBGaWx0ZXIuY2hlY2tNYXBwZXJzKClcblxuICAgICAgLy8gZm9yIG1vYmlsZVxuICAgICAgJCgnI2hlYWRlcl9jb250ZW50JykuaHRtbChBY3RpdmUuVG9waWMuZ2V0KCduYW1lJykpXG4gICAgfVxuXG4gICAgJC5hamF4KHtcbiAgICAgIHVybDogJy90b3BpY3MvJyArIGlkICsgJy9uZXR3b3JrLmpzb24nLFxuICAgICAgc3VjY2Vzczogc3RhcnRcbiAgICB9KVxuICB9LFxuICBlbmQ6IGZ1bmN0aW9uKCkge1xuICAgIGlmIChBY3RpdmUuVG9waWMpIHtcbiAgICAgICQoJy5yaWdodGNsaWNrbWVudScpLnJlbW92ZSgpXG4gICAgICBUb3BpY0NhcmQuaGlkZUNhcmQoKVxuICAgICAgU3luYXBzZUNhcmQuaGlkZUNhcmQoKVxuICAgICAgRmlsdGVyLmNsb3NlKClcbiAgICB9XG4gIH0sXG4gIGNlbnRlck9uOiBmdW5jdGlvbihub2RlaWQsIGNhbGxiYWNrKSB7XG4gICAgLy8gZG9uJ3QgY2xhc2ggd2l0aCBmZXRjaFJlbGF0aXZlc1xuICAgIGlmICghVmlzdWFsaXplLm1HcmFwaC5idXN5KSB7XG4gICAgICBWaXN1YWxpemUubUdyYXBoLm9uQ2xpY2sobm9kZWlkLCB7XG4gICAgICAgIGhpZGVMYWJlbHM6IGZhbHNlLFxuICAgICAgICBkdXJhdGlvbjogMTAwMCxcbiAgICAgICAgb25Db21wbGV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBSb3V0ZXIubmF2aWdhdGUoJy90b3BpY3MvJyArIG5vZGVpZClcbiAgICAgIEFjdGl2ZS5Ub3BpYyA9IERhdGFNb2RlbC5Ub3BpY3MuZ2V0KG5vZGVpZClcbiAgICB9XG4gIH0sXG4gIGZldGNoUmVsYXRpdmVzOiBmdW5jdGlvbihub2RlcywgbWV0YWNvZGVJZCkge1xuICAgIHZhciBzZWxmID0gdGhpc1xuXG4gICAgdmFyIG5vZGUgPSAkLmlzQXJyYXkobm9kZXMpID8gbm9kZXNbMF0gOiBub2Rlc1xuXG4gICAgdmFyIHRvcGljcyA9IERhdGFNb2RlbC5Ub3BpY3MubWFwKGZ1bmN0aW9uKHQpIHsgcmV0dXJuIHQuaWQgfSlcbiAgICB2YXIgdG9waWNzU3RyaW5nID0gdG9waWNzLmpvaW4oKVxuXG4gICAgdmFyIGNyZWF0b3JzID0gRGF0YU1vZGVsLkNyZWF0b3JzLm1hcChmdW5jdGlvbih0KSB7IHJldHVybiB0LmlkIH0pXG4gICAgdmFyIGNyZWF0b3JzU3RyaW5nID0gY3JlYXRvcnMuam9pbigpXG5cbiAgICB2YXIgdG9waWMgPSBub2RlLmdldERhdGEoJ3RvcGljJylcblxuICAgIHZhciBzdWNjZXNzQ2FsbGJhY2tcbiAgICBzdWNjZXNzQ2FsbGJhY2sgPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgICBpZiAoVmlzdWFsaXplLm1HcmFwaC5idXN5KSB7XG4gICAgICAgIC8vIGRvbid0IGNsYXNoIHdpdGggY2VudGVyT25cbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHN1Y2Nlc3NDYWxsYmFjayhkYXRhKSB9LCAxMDApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGRhdGEuY3JlYXRvcnMubGVuZ3RoID4gMCkgRGF0YU1vZGVsLkNyZWF0b3JzLmFkZChkYXRhLmNyZWF0b3JzKVxuICAgICAgaWYgKGRhdGEudG9waWNzLmxlbmd0aCA+IDApIERhdGFNb2RlbC5Ub3BpY3MuYWRkKGRhdGEudG9waWNzKVxuICAgICAgaWYgKGRhdGEuc3luYXBzZXMubGVuZ3RoID4gMCkgRGF0YU1vZGVsLlN5bmFwc2VzLmFkZChkYXRhLnN5bmFwc2VzKVxuXG4gICAgICB2YXIgdG9waWNDb2xsID0gbmV3IERhdGFNb2RlbC5Ub3BpY0NvbGxlY3Rpb24oZGF0YS50b3BpY3MpXG4gICAgICB0b3BpY0NvbGwuYWRkKHRvcGljKVxuICAgICAgdmFyIHN5bmFwc2VDb2xsID0gbmV3IERhdGFNb2RlbC5TeW5hcHNlQ29sbGVjdGlvbihkYXRhLnN5bmFwc2VzKVxuXG4gICAgICB2YXIgZ3JhcGggPSBKSVQuY29udmVydE1vZGVsc1RvSklUKHRvcGljQ29sbCwgc3luYXBzZUNvbGwpWzBdXG4gICAgICBWaXN1YWxpemUubUdyYXBoLm9wLnN1bShncmFwaCwge1xuICAgICAgICB0eXBlOiAnZmFkZScsXG4gICAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICAgIGhpZGVMYWJlbHM6IGZhbHNlXG4gICAgICB9KVxuXG4gICAgICB2YXIgaSwgbCwgdCwgc1xuXG4gICAgICBWaXN1YWxpemUubUdyYXBoLmdyYXBoLmVhY2hOb2RlKGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgdCA9IERhdGFNb2RlbC5Ub3BpY3MuZ2V0KG4uaWQpXG4gICAgICAgIHQuc2V0KHsgbm9kZTogbiB9LCB7IHNpbGVudDogdHJ1ZSB9KVxuICAgICAgICB0LnVwZGF0ZU5vZGUoKVxuXG4gICAgICAgIG4uZWFjaEFkamFjZW5jeShmdW5jdGlvbihlZGdlKSB7XG4gICAgICAgICAgaWYgKCFlZGdlLmdldERhdGEoJ2luaXQnKSkge1xuICAgICAgICAgICAgZWRnZS5zZXREYXRhKCdpbml0JywgdHJ1ZSlcblxuICAgICAgICAgICAgbCA9IGVkZ2UuZ2V0RGF0YSgnc3luYXBzZUlEcycpLmxlbmd0aFxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICBzID0gRGF0YU1vZGVsLlN5bmFwc2VzLmdldChlZGdlLmdldERhdGEoJ3N5bmFwc2VJRHMnKVtpXSlcbiAgICAgICAgICAgICAgcy5zZXQoeyBlZGdlOiBlZGdlIH0sIHsgc2lsZW50OiB0cnVlIH0pXG4gICAgICAgICAgICAgIHMudXBkYXRlRWRnZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICAgIGlmICgkLmlzQXJyYXkobm9kZXMpICYmIG5vZGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgc2VsZi5mZXRjaFJlbGF0aXZlcyhub2Rlcy5zbGljZSgxKSwgbWV0YWNvZGVJZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgcGFyYW1zU3RyaW5nID0gbWV0YWNvZGVJZCA/ICdtZXRhY29kZT0nICsgbWV0YWNvZGVJZCArICcmJyA6ICcnXG4gICAgcGFyYW1zU3RyaW5nICs9ICduZXR3b3JrPScgKyB0b3BpY3NTdHJpbmcgKyAnJmNyZWF0b3JzPScgKyBjcmVhdG9yc1N0cmluZ1xuXG4gICAgJC5hamF4KHtcbiAgICAgIHR5cGU6ICdHRVQnLFxuICAgICAgdXJsOiAnL3RvcGljcy8nICsgdG9waWMuaWQgKyAnL3JlbGF0aXZlcy5qc29uPycgKyBwYXJhbXNTdHJpbmcsXG4gICAgICBzdWNjZXNzOiBzdWNjZXNzQ2FsbGJhY2ssXG4gICAgICBlcnJvcjogZnVuY3Rpb24oKSB7fVxuICAgIH0pXG4gIH0sXG5cbiAgcmVuZGVyVG9waWM6IGZ1bmN0aW9uKG1hcHBpbmcsIHRvcGljLCBmcm9tUmVtb3RlKSB7XG4gICAgbGV0IG5vZGVPblZpelxuICAgIGNvbnN0IG5ld25vZGUgPSB0b3BpYy5jcmVhdGVOb2RlKClcbiAgICBjb25zdCBjcmVhdGVTeW5hcHNlID0gISFDcmVhdGUubmV3U3luYXBzZS5mb2N1c05vZGUgJiYgIWZyb21SZW1vdGVcbiAgICBjb25zdCBjb25uZWN0VG9JZCA9IGNyZWF0ZVN5bmFwc2UgPyBDcmVhdGUubmV3U3luYXBzZS5mb2N1c05vZGUuZ2V0RGF0YSgndG9waWMnKS5pZCA6IG51bGxcbiAgICBpZiAoISQuaXNFbXB0eU9iamVjdChWaXN1YWxpemUubUdyYXBoLmdyYXBoLm5vZGVzKSkge1xuICAgICAgVmlzdWFsaXplLm1HcmFwaC5ncmFwaC5hZGROb2RlKG5ld25vZGUpXG4gICAgfSBlbHNlIHtcbiAgICAgIFZpc3VhbGl6ZS5tR3JhcGgubG9hZEpTT04obmV3bm9kZSlcbiAgICB9XG4gICAgbm9kZU9uVml6ID0gVmlzdWFsaXplLm1HcmFwaC5ncmFwaC5nZXROb2RlKG5ld25vZGUuaWQpXG4gICAgdG9waWMuc2V0KCdub2RlJywgbm9kZU9uVml6LCB7c2lsZW50OiB0cnVlfSlcbiAgICB0b3BpYy51cGRhdGVOb2RlKCkgLy8gbGlua3MgdGhlIHRvcGljIGFuZCB0aGUgbWFwcGluZyB0byB0aGUgbm9kZVxuICAgIG5vZGVPblZpei5zZXREYXRhKCdkaW0nLCAxLCAnc3RhcnQnKVxuICAgIG5vZGVPblZpei5zZXREYXRhKCdkaW0nLCAyNSwgJ2VuZCcpXG4gICAgbm9kZU9uVml6LnNldFBvcyhuZXcgJGppdC5Db21wbGV4KG1hcHBpbmcuZ2V0KCd4bG9jJyksIG1hcHBpbmcuZ2V0KCd5bG9jJykpLCAnY3VycmVudCcpXG4gICAgbm9kZU9uVml6LnNldFBvcyhuZXcgJGppdC5Db21wbGV4KG1hcHBpbmcuZ2V0KCd4bG9jJyksIG1hcHBpbmcuZ2V0KCd5bG9jJykpLCAnc3RhcnQnKVxuICAgIG5vZGVPblZpei5zZXRQb3MobmV3ICRqaXQuQ29tcGxleChtYXBwaW5nLmdldCgneGxvYycpLCBtYXBwaW5nLmdldCgneWxvYycpKSwgJ2VuZCcpXG4gICAgVmlzdWFsaXplLm1HcmFwaC5meC5wbG90Tm9kZShub2RlT25WaXosIFZpc3VhbGl6ZS5tR3JhcGguY2FudmFzKVxuICAgIFZpc3VhbGl6ZS5tR3JhcGguZnguYW5pbWF0ZSh7XG4gICAgICBtb2RlczogWydub2RlLXByb3BlcnR5OmRpbSddLFxuICAgICAgZHVyYXRpb246IDIwMFxuICAgIH0pXG4gICAgaWYgKCFmcm9tUmVtb3RlICYmIHRvcGljLmlzTmV3KCkpIHtcbiAgICAgIHRvcGljLnNhdmUobnVsbCwge1xuICAgICAgICBzdWNjZXNzOiB0b3BpY01vZGVsID0+IHtcbiAgICAgICAgICBBY3RpdmUuTWFwICYmIG1hcHBpbmcuc2F2ZSh7IG1hcHBhYmxlX2lkOiB0b3BpY01vZGVsLmlkIH0pXG4gICAgICAgICAgY3JlYXRlU3luYXBzZSAmJiBTeW5hcHNlLmNyZWF0ZVN5bmFwc2VMb2NhbGx5KGNvbm5lY3RUb0lkLCB0b3BpY01vZGVsLmlkKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAoIWZyb21SZW1vdGUgJiYgIXRvcGljLmlzTmV3KCkpIHtcbiAgICAgIEFjdGl2ZS5NYXAgJiYgbWFwcGluZy5zYXZlKClcbiAgICAgIGNyZWF0ZVN5bmFwc2UgJiYgU3luYXBzZS5jcmVhdGVTeW5hcHNlTG9jYWxseShjb25uZWN0VG9JZCwgdG9waWMuaWQpXG4gICAgfVxuICB9LFxuICBjcmVhdGVUb3BpY0xvY2FsbHk6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gVG9waWNcbiAgICBpZiAoQ3JlYXRlLm5ld1RvcGljLm5hbWUgPT09ICcnKSB7XG4gICAgICBHbG9iYWxVSS5ub3RpZnlVc2VyKCdQbGVhc2UgZW50ZXIgYSB0b3BpYyB0aXRsZS4uLicpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgJChkb2N1bWVudCkudHJpZ2dlcihNYXAuZXZlbnRzLmVkaXRlZEJ5QWN0aXZlTWFwcGVyKVxuICAgIHZhciBtZXRhY29kZSA9IERhdGFNb2RlbC5NZXRhY29kZXMuZ2V0KENyZWF0ZS5uZXdUb3BpYy5tZXRhY29kZSlcbiAgICB2YXIgdG9waWMgPSBuZXcgRGF0YU1vZGVsLlRvcGljKHtcbiAgICAgIG5hbWU6IENyZWF0ZS5uZXdUb3BpYy5uYW1lLFxuICAgICAgbWV0YWNvZGVfaWQ6IG1ldGFjb2RlLmlkLFxuICAgICAgZGVmZXJfdG9fbWFwX2lkOiBBY3RpdmUuTWFwLmlkXG4gICAgfSlcbiAgICBEYXRhTW9kZWwuVG9waWNzLmFkZCh0b3BpYylcbiAgICB2YXIgbWFwcGluZyA9IG5ldyBEYXRhTW9kZWwuTWFwcGluZyh7XG4gICAgICB4bG9jOiBNb3VzZS5uZXdOb2RlQ29vcmRzLngsXG4gICAgICB5bG9jOiBNb3VzZS5uZXdOb2RlQ29vcmRzLnksXG4gICAgICBtYXBwYWJsZV9pZDogdG9waWMuY2lkLFxuICAgICAgbWFwcGFibGVfdHlwZTogJ1RvcGljJ1xuICAgIH0pXG4gICAgRGF0YU1vZGVsLk1hcHBpbmdzLmFkZChtYXBwaW5nKVxuICAgIC8vIHRoZXNlIGNhbid0IGhhcHBlbiB1bnRpbCB0aGUgbmV3IHRvcGljIHZhbHVlcyBhcmUgcmV0cmlldmVkXG4gICAgQ3JlYXRlLm5ld1RvcGljLnJlc2V0KClcbiAgICBzZWxmLnJlbmRlclRvcGljKG1hcHBpbmcsIHRvcGljKVxuICAgIEVuZ2luZS5zZXRGb2N1c05vZGUodG9waWMuZ2V0KCdub2RlJyksIGZhbHNlLCB0cnVlKVxuICB9LFxuICBnZXRUb3BpY0Zyb21BdXRvY29tcGxldGU6IGZ1bmN0aW9uKGlkKSB7XG4gICAgdmFyIHNlbGYgPSBUb3BpY1xuICAgICQoZG9jdW1lbnQpLnRyaWdnZXIoTWFwLmV2ZW50cy5lZGl0ZWRCeUFjdGl2ZU1hcHBlcilcbiAgICBDcmVhdGUubmV3VG9waWMucmVzZXQoKVxuICAgIHNlbGYuZ2V0KGlkLCAodG9waWMpID0+IHtcbiAgICAgIHZhciBtYXBwaW5nID0gbmV3IERhdGFNb2RlbC5NYXBwaW5nKHtcbiAgICAgICAgeGxvYzogTW91c2UubmV3Tm9kZUNvb3Jkcy54LCBcbiAgICAgICAgeWxvYzogTW91c2UubmV3Tm9kZUNvb3Jkcy55LFxuICAgICAgICBtYXBwYWJsZV90eXBlOiAnVG9waWMnLFxuICAgICAgICBtYXBwYWJsZV9pZDogdG9waWMuaWRcbiAgICAgIH0pXG4gICAgICBEYXRhTW9kZWwuTWFwcGluZ3MuYWRkKG1hcHBpbmcpXG4gICAgICBzZWxmLnJlbmRlclRvcGljKG1hcHBpbmcsIHRvcGljKVxuICAgICAgRW5naW5lLnNldEZvY3VzTm9kZSh0b3BpYy5nZXQoJ25vZGUnKSwgZmFsc2UsIHRydWUpXG4gICAgfSlcbiAgfSxcbiAgZ2V0TWFwRnJvbUF1dG9jb21wbGV0ZTogZnVuY3Rpb24oZGF0YSkge1xuICAgIHZhciBzZWxmID0gVG9waWNcbiAgICAkKGRvY3VtZW50KS50cmlnZ2VyKE1hcC5ldmVudHMuZWRpdGVkQnlBY3RpdmVNYXBwZXIpXG4gICAgdmFyIG1ldGFjb2RlID0gRGF0YU1vZGVsLk1ldGFjb2Rlcy5maW5kV2hlcmUoeyBuYW1lOiAnTWV0YW1hcCcgfSlcbiAgICB2YXIgdG9waWMgPSBuZXcgRGF0YU1vZGVsLlRvcGljKHtcbiAgICAgIG5hbWU6IGRhdGEubmFtZSxcbiAgICAgIG1ldGFjb2RlX2lkOiBtZXRhY29kZS5pZCxcbiAgICAgIGRlZmVyX3RvX21hcF9pZDogQWN0aXZlLk1hcC5pZCxcbiAgICAgIGxpbms6IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyAnL21hcHMvJyArIGRhdGEuaWRcbiAgICB9KVxuICAgIERhdGFNb2RlbC5Ub3BpY3MuYWRkKHRvcGljKVxuICAgIHZhciBtYXBwaW5nID0gbmV3IERhdGFNb2RlbC5NYXBwaW5nKHtcbiAgICAgIHhsb2M6IE1vdXNlLm5ld05vZGVDb29yZHMueCwgXG4gICAgICB5bG9jOiBNb3VzZS5uZXdOb2RlQ29vcmRzLnksXG4gICAgICBtYXBwYWJsZV9pZDogdG9waWMuY2lkLFxuICAgICAgbWFwcGFibGVfdHlwZTogJ1RvcGljJ1xuICAgIH0pXG4gICAgRGF0YU1vZGVsLk1hcHBpbmdzLmFkZChtYXBwaW5nKVxuICAgIENyZWF0ZS5uZXdUb3BpYy5yZXNldCgpXG4gICAgc2VsZi5yZW5kZXJUb3BpYyhtYXBwaW5nLCB0b3BpYylcbiAgICBFbmdpbmUuc2V0Rm9jdXNOb2RlKHRvcGljLmdldCgnbm9kZScpLCBmYWxzZSwgdHJ1ZSlcbiAgfSxcbiAgZ2V0VG9waWNGcm9tU2VhcmNoOiBmdW5jdGlvbihldmVudCwgaWQpIHtcbiAgICB2YXIgc2VsZiA9IFRvcGljXG4gICAgJChkb2N1bWVudCkudHJpZ2dlcihNYXAuZXZlbnRzLmVkaXRlZEJ5QWN0aXZlTWFwcGVyKVxuICAgIHNlbGYuZ2V0KGlkLCAodG9waWMpID0+IHtcbiAgICAgIHZhciBuZXh0Q29vcmRzID0gQXV0b0xheW91dC5nZXROZXh0Q29vcmQoeyBtYXBwaW5nczogRGF0YU1vZGVsLk1hcHBpbmdzIH0pXG4gICAgICB2YXIgbWFwcGluZyA9IG5ldyBEYXRhTW9kZWwuTWFwcGluZyh7XG4gICAgICAgIHhsb2M6IG5leHRDb29yZHMueCxcbiAgICAgICAgeWxvYzogbmV4dENvb3Jkcy55LFxuICAgICAgICBtYXBwYWJsZV90eXBlOiAnVG9waWMnLFxuICAgICAgICBtYXBwYWJsZV9pZDogdG9waWMuaWRcbiAgICAgIH0pXG4gICAgICBEYXRhTW9kZWwuTWFwcGluZ3MuYWRkKG1hcHBpbmcpXG4gICAgICBzZWxmLnJlbmRlclRvcGljKG1hcHBpbmcsIHRvcGljKVxuICAgICAgRW5naW5lLnJ1bkxheW91dCgpXG4gICAgICBHbG9iYWxVSS5ub3RpZnlVc2VyKCdUb3BpYyB3YXMgYWRkZWQgdG8geW91ciBtYXAnKVxuICAgIH0pXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVG9waWNcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBmcm9udGVuZC9zcmMvTWV0YW1hcHMvVG9waWMuanMiXSwibWFwcGluZ3MiOiI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 572 */
/***/ function(module, exports) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var Settings = {\n  embed: false, // indicates that the app is on a page that is optimized for embedding in iFrames on other web pages\n  sandbox: false, // puts the app into a mode (when true) where it only creates data locally, and isn't writing it to the database\n  colors: {\n    background: '#344A58',\n    synapses: {\n      normal: '#888888',\n      hover: '#888888',\n      selected: '#FFFFFF' },\n\n    topics: {\n      selected: '#FFFFFF' },\n\n    labels: {\n      background: '#18202E',\n      text: '#DDD' } } };exports.default =\n\n\n\n\nSettings;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTcyLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvU2V0dGluZ3MuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgU2V0dGluZ3MgPSB7XG4gIGVtYmVkOiBmYWxzZSwgLy8gaW5kaWNhdGVzIHRoYXQgdGhlIGFwcCBpcyBvbiBhIHBhZ2UgdGhhdCBpcyBvcHRpbWl6ZWQgZm9yIGVtYmVkZGluZyBpbiBpRnJhbWVzIG9uIG90aGVyIHdlYiBwYWdlc1xuICBzYW5kYm94OiBmYWxzZSwgLy8gcHV0cyB0aGUgYXBwIGludG8gYSBtb2RlICh3aGVuIHRydWUpIHdoZXJlIGl0IG9ubHkgY3JlYXRlcyBkYXRhIGxvY2FsbHksIGFuZCBpc24ndCB3cml0aW5nIGl0IHRvIHRoZSBkYXRhYmFzZVxuICBjb2xvcnM6IHtcbiAgICBiYWNrZ3JvdW5kOiAnIzM0NEE1OCcsXG4gICAgc3luYXBzZXM6IHtcbiAgICAgIG5vcm1hbDogJyM4ODg4ODgnLFxuICAgICAgaG92ZXI6ICcjODg4ODg4JyxcbiAgICAgIHNlbGVjdGVkOiAnI0ZGRkZGRidcbiAgICB9LFxuICAgIHRvcGljczoge1xuICAgICAgc2VsZWN0ZWQ6ICcjRkZGRkZGJ1xuICAgIH0sXG4gICAgbGFiZWxzOiB7XG4gICAgICBiYWNrZ3JvdW5kOiAnIzE4MjAyRScsXG4gICAgICB0ZXh0OiAnI0RERCdcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2V0dGluZ3NcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBmcm9udGVuZC9zcmMvTWV0YW1hcHMvU2V0dGluZ3MuanMiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 573 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _templateObject = _taggedTemplateLiteral(['\\n      <div id=\"mapCreatedSuccess\">\\n        <h6>SUCCESS!</h6>\\n        Your map has been created. Do you want to:\\n        <a id=\"mapGo\" href=\"/maps/', '\">Go to your new map</a>\\n        <span>OR</span>\\n        <a id=\"mapStay\" href=\"#\">Stay on this ', '</a>\\n      </div>\\n    '], ['\\n      <div id=\"mapCreatedSuccess\">\\n        <h6>SUCCESS!</h6>\\n        Your map has been created. Do you want to:\\n        <a id=\"mapGo\" href=\"/maps/', '\">Go to your new map</a>\\n        <span>OR</span>\\n        <a id=\"mapStay\" href=\"#\">Stay on this ', '</a>\\n      </div>\\n    ']);\n\nvar _outdent = __webpack_require__(148);var _outdent2 = _interopRequireDefault(_outdent);\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _DataModel = __webpack_require__(149);var _DataModel2 = _interopRequireDefault(_DataModel);\nvar _Map = __webpack_require__(370);var _Map2 = _interopRequireDefault(_Map);\nvar _index = __webpack_require__(362);var _index2 = _interopRequireDefault(_index);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}function _taggedTemplateLiteral(strings, raw) {return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } }));} /* global $ */\n\nvar CreateMap = {\n  newMap: null,\n  emptyMapForm: '',\n  emptyForkMapForm: '',\n  topicsToMap: [],\n  synapsesToMap: [],\n  init: function init() {\n    var self = CreateMap;\n\n    self.newMap = new _Map2.default({ permission: 'commons' });\n\n    self.bindFormEvents();\n\n    self.emptyMapForm = $('#new_map').html();\n  },\n  bindFormEvents: function bindFormEvents() {\n    var self = CreateMap;\n\n    $('.new_map input, .new_map div').unbind('keypress').bind('keypress', function (event) {\n      if (event.keyCode === 13) self.submit();\n    });\n\n    $('.new_map button.cancel').unbind().bind('click', function (event) {\n      event.preventDefault();\n      _index2.default.closeLightbox();\n    });\n    $('.new_map button.submitMap').unbind().bind('click', self.submit);\n\n    // bind permission changer events on the createMap form\n    $('.permIcon').unbind().bind('click', self.switchPermission);\n  },\n  closeSuccess: function closeSuccess() {\n    $('#mapCreatedSuccess').fadeOut(300, function () {\n      $(this).remove();\n    });\n  },\n  switchPermission: function switchPermission() {\n    var self = CreateMap;\n\n    self.newMap.set('permission', $(this).attr('data-permission'));\n    $(this).siblings('.permIcon').find('.mapPermIcon').removeClass('selected');\n    $(this).find('.mapPermIcon').addClass('selected');\n\n    var permText = $(this).find('.tip').html();\n    $(this).parents('.new_map').find('.permText').html(permText);\n  },\n  submit: function submit(event) {\n    if (event) event.preventDefault();\n\n    var self = CreateMap;\n\n    if (_index2.default.lightbox === 'forkmap') {\n      self.newMap.set('topicsToMap', self.topicsToMap);\n      self.newMap.set('synapsesToMap', self.synapsesToMap);\n      self.newMap.set('source_id', _Active2.default.Map.id);\n    }\n\n    var formId = _index2.default.lightbox === 'forkmap' ? '#fork_map' : '#new_map';\n    var $form = $(formId);\n\n    self.newMap.set('name', $form.find('#map_name').val());\n    self.newMap.set('desc', $form.find('#map_desc').val());\n\n    if (self.newMap.get('name').length === 0) {\n      self.throwMapNameError();\n      return;\n    }\n\n    self.newMap.save(null, {\n      success: self.success\n      // TODO add error message\n    });\n\n    _index2.default.closeLightbox();\n    _index2.default.notifyUser('Working...');\n  },\n  throwMapNameError: function throwMapNameError() {\n    var formId = _index2.default.lightbox === 'forkmap' ? '#fork_map' : '#new_map';\n    var $form = $(formId);\n\n    var message = $(\"<div class='feedback_message'>Please enter a map name...</div>\");\n\n    $form.find('#map_name').after(message);\n    setTimeout(function () {\n      message.fadeOut('fast', function () {\n        message.remove();\n      });\n    }, 5000);\n  },\n  success: function success(model) {\n    // push the new map onto the collection of 'my maps'\n    _DataModel2.default.Maps.Mine.add(model);\n\n    _index2.default.clearNotify();\n    $('#wrapper').append((0, _outdent2.default)(_templateObject,\n\n\n\n    model.id,\n\n    _Active2.default.Map ? 'map' : 'page'));\n\n\n    $('#mapGo').click(function (e) {return _index2.default.CreateMap.closeSuccess();});\n    $('#mapStay').click(function (e) {\n      _index2.default.CreateMap.closeSuccess();\n      return false;\n    });\n  },\n  reset: function reset(id) {\n    var self = CreateMap;\n\n    var form = $('#' + id);\n\n    if (id === 'fork_map') {\n      self.topicsToMap = [];\n      self.synapsesToMap = [];\n      form.html(self.emptyForkMapForm);\n    } else {\n      form.html(self.emptyMapForm);\n    }\n\n    self.bindFormEvents();\n    self.newMap = new _DataModel2.default.Map({ permission: 'commons' });\n\n    return false;\n  } };exports.default =\n\n\nCreateMap;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTczLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvR2xvYmFsVUkvQ3JlYXRlTWFwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGdsb2JhbCAkICovXG5cbmltcG9ydCBvdXRkZW50IGZyb20gJ291dGRlbnQnXG5cbmltcG9ydCBBY3RpdmUgZnJvbSAnLi4vQWN0aXZlJ1xuaW1wb3J0IERhdGFNb2RlbCBmcm9tICcuLi9EYXRhTW9kZWwnXG5pbXBvcnQgRGF0YU1vZGVsTWFwIGZyb20gJy4uL0RhdGFNb2RlbC9NYXAnXG5pbXBvcnQgR2xvYmFsVUkgZnJvbSAnLi9pbmRleCdcblxuY29uc3QgQ3JlYXRlTWFwID0ge1xuICBuZXdNYXA6IG51bGwsXG4gIGVtcHR5TWFwRm9ybTogJycsXG4gIGVtcHR5Rm9ya01hcEZvcm06ICcnLFxuICB0b3BpY3NUb01hcDogW10sXG4gIHN5bmFwc2VzVG9NYXA6IFtdLFxuICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IENyZWF0ZU1hcFxuXG4gICAgc2VsZi5uZXdNYXAgPSBuZXcgRGF0YU1vZGVsTWFwKHsgcGVybWlzc2lvbjogJ2NvbW1vbnMnIH0pXG5cbiAgICBzZWxmLmJpbmRGb3JtRXZlbnRzKClcblxuICAgIHNlbGYuZW1wdHlNYXBGb3JtID0gJCgnI25ld19tYXAnKS5odG1sKClcbiAgfSxcbiAgYmluZEZvcm1FdmVudHM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gQ3JlYXRlTWFwXG5cbiAgICAkKCcubmV3X21hcCBpbnB1dCwgLm5ld19tYXAgZGl2JykudW5iaW5kKCdrZXlwcmVzcycpLmJpbmQoJ2tleXByZXNzJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSAxMykgc2VsZi5zdWJtaXQoKVxuICAgIH0pXG5cbiAgICAkKCcubmV3X21hcCBidXR0b24uY2FuY2VsJykudW5iaW5kKCkuYmluZCgnY2xpY2snLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgR2xvYmFsVUkuY2xvc2VMaWdodGJveCgpXG4gICAgfSlcbiAgICAkKCcubmV3X21hcCBidXR0b24uc3VibWl0TWFwJykudW5iaW5kKCkuYmluZCgnY2xpY2snLCBzZWxmLnN1Ym1pdClcblxuICAgIC8vIGJpbmQgcGVybWlzc2lvbiBjaGFuZ2VyIGV2ZW50cyBvbiB0aGUgY3JlYXRlTWFwIGZvcm1cbiAgICAkKCcucGVybUljb24nKS51bmJpbmQoKS5iaW5kKCdjbGljaycsIHNlbGYuc3dpdGNoUGVybWlzc2lvbilcbiAgfSxcbiAgY2xvc2VTdWNjZXNzOiBmdW5jdGlvbigpIHtcbiAgICAkKCcjbWFwQ3JlYXRlZFN1Y2Nlc3MnKS5mYWRlT3V0KDMwMCwgZnVuY3Rpb24oKSB7XG4gICAgICAkKHRoaXMpLnJlbW92ZSgpXG4gICAgfSlcbiAgfSxcbiAgc3dpdGNoUGVybWlzc2lvbjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSBDcmVhdGVNYXBcblxuICAgIHNlbGYubmV3TWFwLnNldCgncGVybWlzc2lvbicsICQodGhpcykuYXR0cignZGF0YS1wZXJtaXNzaW9uJykpXG4gICAgJCh0aGlzKS5zaWJsaW5ncygnLnBlcm1JY29uJykuZmluZCgnLm1hcFBlcm1JY29uJykucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJylcbiAgICAkKHRoaXMpLmZpbmQoJy5tYXBQZXJtSWNvbicpLmFkZENsYXNzKCdzZWxlY3RlZCcpXG5cbiAgICB2YXIgcGVybVRleHQgPSAkKHRoaXMpLmZpbmQoJy50aXAnKS5odG1sKClcbiAgICAkKHRoaXMpLnBhcmVudHMoJy5uZXdfbWFwJykuZmluZCgnLnBlcm1UZXh0JykuaHRtbChwZXJtVGV4dClcbiAgfSxcbiAgc3VibWl0OiBmdW5jdGlvbihldmVudCkge1xuICAgIGlmIChldmVudCkgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgdmFyIHNlbGYgPSBDcmVhdGVNYXBcblxuICAgIGlmIChHbG9iYWxVSS5saWdodGJveCA9PT0gJ2ZvcmttYXAnKSB7XG4gICAgICBzZWxmLm5ld01hcC5zZXQoJ3RvcGljc1RvTWFwJywgc2VsZi50b3BpY3NUb01hcClcbiAgICAgIHNlbGYubmV3TWFwLnNldCgnc3luYXBzZXNUb01hcCcsIHNlbGYuc3luYXBzZXNUb01hcClcbiAgICAgIHNlbGYubmV3TWFwLnNldCgnc291cmNlX2lkJywgQWN0aXZlLk1hcC5pZClcbiAgICB9XG5cbiAgICB2YXIgZm9ybUlkID0gR2xvYmFsVUkubGlnaHRib3ggPT09ICdmb3JrbWFwJyA/ICcjZm9ya19tYXAnIDogJyNuZXdfbWFwJ1xuICAgIHZhciAkZm9ybSA9ICQoZm9ybUlkKVxuXG4gICAgc2VsZi5uZXdNYXAuc2V0KCduYW1lJywgJGZvcm0uZmluZCgnI21hcF9uYW1lJykudmFsKCkpXG4gICAgc2VsZi5uZXdNYXAuc2V0KCdkZXNjJywgJGZvcm0uZmluZCgnI21hcF9kZXNjJykudmFsKCkpXG5cbiAgICBpZiAoc2VsZi5uZXdNYXAuZ2V0KCduYW1lJykubGVuZ3RoID09PSAwKSB7XG4gICAgICBzZWxmLnRocm93TWFwTmFtZUVycm9yKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNlbGYubmV3TWFwLnNhdmUobnVsbCwge1xuICAgICAgc3VjY2Vzczogc2VsZi5zdWNjZXNzXG4gICAgLy8gVE9ETyBhZGQgZXJyb3IgbWVzc2FnZVxuICAgIH0pXG5cbiAgICBHbG9iYWxVSS5jbG9zZUxpZ2h0Ym94KClcbiAgICBHbG9iYWxVSS5ub3RpZnlVc2VyKCdXb3JraW5nLi4uJylcbiAgfSxcbiAgdGhyb3dNYXBOYW1lRXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBmb3JtSWQgPSBHbG9iYWxVSS5saWdodGJveCA9PT0gJ2ZvcmttYXAnID8gJyNmb3JrX21hcCcgOiAnI25ld19tYXAnXG4gICAgdmFyICRmb3JtID0gJChmb3JtSWQpXG5cbiAgICB2YXIgbWVzc2FnZSA9ICQoXCI8ZGl2IGNsYXNzPSdmZWVkYmFja19tZXNzYWdlJz5QbGVhc2UgZW50ZXIgYSBtYXAgbmFtZS4uLjwvZGl2PlwiKVxuXG4gICAgJGZvcm0uZmluZCgnI21hcF9uYW1lJykuYWZ0ZXIobWVzc2FnZSlcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgbWVzc2FnZS5mYWRlT3V0KCdmYXN0JywgZnVuY3Rpb24oKSB7XG4gICAgICAgIG1lc3NhZ2UucmVtb3ZlKClcbiAgICAgIH0pXG4gICAgfSwgNTAwMClcbiAgfSxcbiAgc3VjY2VzczogZnVuY3Rpb24obW9kZWwpIHtcbiAgICAvLyBwdXNoIHRoZSBuZXcgbWFwIG9udG8gdGhlIGNvbGxlY3Rpb24gb2YgJ215IG1hcHMnXG4gICAgRGF0YU1vZGVsLk1hcHMuTWluZS5hZGQobW9kZWwpXG5cbiAgICBHbG9iYWxVSS5jbGVhck5vdGlmeSgpXG4gICAgJCgnI3dyYXBwZXInKS5hcHBlbmQob3V0ZGVudGBcbiAgICAgIDxkaXYgaWQ9XCJtYXBDcmVhdGVkU3VjY2Vzc1wiPlxuICAgICAgICA8aDY+U1VDQ0VTUyE8L2g2PlxuICAgICAgICBZb3VyIG1hcCBoYXMgYmVlbiBjcmVhdGVkLiBEbyB5b3Ugd2FudCB0bzpcbiAgICAgICAgPGEgaWQ9XCJtYXBHb1wiIGhyZWY9XCIvbWFwcy8ke21vZGVsLmlkfVwiPkdvIHRvIHlvdXIgbmV3IG1hcDwvYT5cbiAgICAgICAgPHNwYW4+T1I8L3NwYW4+XG4gICAgICAgIDxhIGlkPVwibWFwU3RheVwiIGhyZWY9XCIjXCI+U3RheSBvbiB0aGlzICR7QWN0aXZlLk1hcCA/ICdtYXAnIDogJ3BhZ2UnfTwvYT5cbiAgICAgIDwvZGl2PlxuICAgIGApXG4gICAgJCgnI21hcEdvJykuY2xpY2soZSA9PiBHbG9iYWxVSS5DcmVhdGVNYXAuY2xvc2VTdWNjZXNzKCkpXG4gICAgJCgnI21hcFN0YXknKS5jbGljayhlID0+IHtcbiAgICAgIEdsb2JhbFVJLkNyZWF0ZU1hcC5jbG9zZVN1Y2Nlc3MoKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSlcbiAgfSxcbiAgcmVzZXQ6IGZ1bmN0aW9uKGlkKSB7XG4gICAgdmFyIHNlbGYgPSBDcmVhdGVNYXBcblxuICAgIHZhciBmb3JtID0gJCgnIycgKyBpZClcblxuICAgIGlmIChpZCA9PT0gJ2ZvcmtfbWFwJykge1xuICAgICAgc2VsZi50b3BpY3NUb01hcCA9IFtdXG4gICAgICBzZWxmLnN5bmFwc2VzVG9NYXAgPSBbXVxuICAgICAgZm9ybS5odG1sKHNlbGYuZW1wdHlGb3JrTWFwRm9ybSlcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybS5odG1sKHNlbGYuZW1wdHlNYXBGb3JtKVxuICAgIH1cblxuICAgIHNlbGYuYmluZEZvcm1FdmVudHMoKVxuICAgIHNlbGYubmV3TWFwID0gbmV3IERhdGFNb2RlbC5NYXAoeyBwZXJtaXNzaW9uOiAnY29tbW9ucycgfSlcblxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENyZWF0ZU1hcFxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9HbG9iYWxVSS9DcmVhdGVNYXAuanMiXSwibWFwcGluZ3MiOiI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 574 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });\n\nvar _Filter = __webpack_require__(356);var _Filter2 = _interopRequireDefault(_Filter);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}\n\nvar Account = {\n  isOpen: false,\n  changing: false,\n  init: function init() {\n    var self = Account;\n\n    $('.sidebarAccountIcon').click(self.toggleBox);\n    $('.sidebarAccountBox').click(function (event) {\n      event.stopPropagation();\n    });\n    $('body').click(self.close);\n  },\n  toggleBox: function toggleBox(event) {\n    var self = Account;\n\n    if (self.isOpen) self.close();else\n    self.open();\n\n    event.stopPropagation();\n  },\n  open: function open() {\n    var self = Account;\n\n    _Filter2.default.close();\n    $('.sidebarAccountIcon .tooltipsUnder').addClass('hide');\n\n    if (!self.isOpen && !self.changing) {\n      self.changing = true;\n      $('.sidebarAccountBox').fadeIn(200, function () {\n        self.changing = false;\n        self.isOpen = true;\n        $('.sidebarAccountBox #user_email').focus();\n      });\n    }\n  },\n  close: function close() {\n    var self = Account;\n\n    $('.sidebarAccountIcon .tooltipsUnder').removeClass('hide');\n    if (!self.changing) {\n      self.changing = true;\n      $('.sidebarAccountBox #user_email').blur();\n      $('.sidebarAccountBox').fadeOut(200, function () {\n        self.changing = false;\n        self.isOpen = false;\n      });\n    }\n  } }; /* global $ */exports.default =\n\n\nAccount;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTc0LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvR2xvYmFsVUkvQWNjb3VudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBnbG9iYWwgJCAqL1xuXG5pbXBvcnQgRmlsdGVyIGZyb20gJy4uL0ZpbHRlcidcblxuY29uc3QgQWNjb3VudCA9IHtcbiAgaXNPcGVuOiBmYWxzZSxcbiAgY2hhbmdpbmc6IGZhbHNlLFxuICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IEFjY291bnRcblxuICAgICQoJy5zaWRlYmFyQWNjb3VudEljb24nKS5jbGljayhzZWxmLnRvZ2dsZUJveClcbiAgICAkKCcuc2lkZWJhckFjY291bnRCb3gnKS5jbGljayhmdW5jdGlvbihldmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICB9KVxuICAgICQoJ2JvZHknKS5jbGljayhzZWxmLmNsb3NlKVxuICB9LFxuICB0b2dnbGVCb3g6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIHNlbGYgPSBBY2NvdW50XG5cbiAgICBpZiAoc2VsZi5pc09wZW4pIHNlbGYuY2xvc2UoKVxuICAgIGVsc2Ugc2VsZi5vcGVuKClcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gIH0sXG4gIG9wZW46IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gQWNjb3VudFxuXG4gICAgRmlsdGVyLmNsb3NlKClcbiAgICAkKCcuc2lkZWJhckFjY291bnRJY29uIC50b29sdGlwc1VuZGVyJykuYWRkQ2xhc3MoJ2hpZGUnKVxuXG4gICAgaWYgKCFzZWxmLmlzT3BlbiAmJiAhc2VsZi5jaGFuZ2luZykge1xuICAgICAgc2VsZi5jaGFuZ2luZyA9IHRydWVcbiAgICAgICQoJy5zaWRlYmFyQWNjb3VudEJveCcpLmZhZGVJbigyMDAsIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLmNoYW5naW5nID0gZmFsc2VcbiAgICAgICAgc2VsZi5pc09wZW4gPSB0cnVlXG4gICAgICAgICQoJy5zaWRlYmFyQWNjb3VudEJveCAjdXNlcl9lbWFpbCcpLmZvY3VzKClcbiAgICAgIH0pXG4gICAgfVxuICB9LFxuICBjbG9zZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSBBY2NvdW50XG5cbiAgICAkKCcuc2lkZWJhckFjY291bnRJY29uIC50b29sdGlwc1VuZGVyJykucmVtb3ZlQ2xhc3MoJ2hpZGUnKVxuICAgIGlmICghc2VsZi5jaGFuZ2luZykge1xuICAgICAgc2VsZi5jaGFuZ2luZyA9IHRydWVcbiAgICAgICQoJy5zaWRlYmFyQWNjb3VudEJveCAjdXNlcl9lbWFpbCcpLmJsdXIoKVxuICAgICAgJCgnLnNpZGViYXJBY2NvdW50Qm94JykuZmFkZU91dCgyMDAsIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLmNoYW5naW5nID0gZmFsc2VcbiAgICAgICAgc2VsZi5pc09wZW4gPSBmYWxzZVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQWNjb3VudFxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9HbG9iYWxVSS9BY2NvdW50LmpzIl0sIm1hcHBpbmdzIjoiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 575 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _templateObject = _taggedTemplateLiteral(['\\n      <div class=\"lightboxContent\" id=\"import-dialog-lightbox\">\\n        <div class=\"importDialogWrapper\" />\\n      </div>\\n    '], ['\\n      <div class=\"lightboxContent\" id=\"import-dialog-lightbox\">\\n        <div class=\"importDialogWrapper\" />\\n      </div>\\n    ']);\n\nvar _react = __webpack_require__(174);var _react2 = _interopRequireDefault(_react);\nvar _reactDom = __webpack_require__(205);var _reactDom2 = _interopRequireDefault(_reactDom);\nvar _outdent = __webpack_require__(148);var _outdent2 = _interopRequireDefault(_outdent);\n\nvar _ImportDialogBox = __webpack_require__(576);var _ImportDialogBox2 = _interopRequireDefault(_ImportDialogBox);\n\nvar _PasteInput = __webpack_require__(578);var _PasteInput2 = _interopRequireDefault(_PasteInput);\nvar _Map = __webpack_require__(369);var _Map2 = _interopRequireDefault(_Map);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}function _taggedTemplateLiteral(strings, raw) {return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } }));} /* global $ */\n\nvar ImportDialog = {\n  openLightbox: null,\n  closeLightbox: null,\n\n  init: function init(serverData, openLightbox, closeLightbox) {\n    var self = ImportDialog;\n    self.openLightbox = openLightbox;\n    self.closeLightbox = closeLightbox;\n\n    $('#lightbox_content').append($((0, _outdent2.default)(_templateObject)));\n\n\n\n\n    _reactDom2.default.render(_react2.default.createElement(_ImportDialogBox2.default, {\n      onFileAdded: _PasteInput2.default.handleFile,\n      exampleImageUrl: serverData['import-example.png'],\n      downloadScreenshot: ImportDialog.downloadScreenshot }),\n    $('.importDialogWrapper').get(0));\n  },\n  show: function show() {\n    ImportDialog.openLightbox('import-dialog');\n  },\n  hide: function hide() {\n    ImportDialog.closeLightbox();\n  },\n  downloadScreenshot: function downloadScreenshot() {\n    ImportDialog.hide();\n    _Map2.default.offerScreenshotDownload();\n  } };exports.default =\n\n\nImportDialog;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTc1LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvR2xvYmFsVUkvSW1wb3J0RGlhbG9nLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGdsb2JhbCAkICovXG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nXG5pbXBvcnQgb3V0ZGVudCBmcm9tICdvdXRkZW50J1xuXG5pbXBvcnQgSW1wb3J0RGlhbG9nQm94IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvSW1wb3J0RGlhbG9nQm94J1xuXG5pbXBvcnQgUGFzdGVJbnB1dCBmcm9tICcuLi9QYXN0ZUlucHV0J1xuaW1wb3J0IE1hcCBmcm9tICcuLi9NYXAnXG5cbmNvbnN0IEltcG9ydERpYWxvZyA9IHtcbiAgb3BlbkxpZ2h0Ym94OiBudWxsLFxuICBjbG9zZUxpZ2h0Ym94OiBudWxsLFxuXG4gIGluaXQ6IGZ1bmN0aW9uKHNlcnZlckRhdGEsIG9wZW5MaWdodGJveCwgY2xvc2VMaWdodGJveCkge1xuICAgIGNvbnN0IHNlbGYgPSBJbXBvcnREaWFsb2dcbiAgICBzZWxmLm9wZW5MaWdodGJveCA9IG9wZW5MaWdodGJveFxuICAgIHNlbGYuY2xvc2VMaWdodGJveCA9IGNsb3NlTGlnaHRib3hcblxuICAgICQoJyNsaWdodGJveF9jb250ZW50JykuYXBwZW5kKCQob3V0ZGVudGBcbiAgICAgIDxkaXYgY2xhc3M9XCJsaWdodGJveENvbnRlbnRcIiBpZD1cImltcG9ydC1kaWFsb2ctbGlnaHRib3hcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImltcG9ydERpYWxvZ1dyYXBwZXJcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgYCkpXG4gICAgUmVhY3RET00ucmVuZGVyKFJlYWN0LmNyZWF0ZUVsZW1lbnQoSW1wb3J0RGlhbG9nQm94LCB7XG4gICAgICBvbkZpbGVBZGRlZDogUGFzdGVJbnB1dC5oYW5kbGVGaWxlLFxuICAgICAgZXhhbXBsZUltYWdlVXJsOiBzZXJ2ZXJEYXRhWydpbXBvcnQtZXhhbXBsZS5wbmcnXSxcbiAgICAgIGRvd25sb2FkU2NyZWVuc2hvdDogSW1wb3J0RGlhbG9nLmRvd25sb2FkU2NyZWVuc2hvdFxuICAgIH0pLCAkKCcuaW1wb3J0RGlhbG9nV3JhcHBlcicpLmdldCgwKSlcbiAgfSxcbiAgc2hvdzogZnVuY3Rpb24oKSB7XG4gICAgSW1wb3J0RGlhbG9nLm9wZW5MaWdodGJveCgnaW1wb3J0LWRpYWxvZycpXG4gIH0sXG4gIGhpZGU6IGZ1bmN0aW9uKCkge1xuICAgIEltcG9ydERpYWxvZy5jbG9zZUxpZ2h0Ym94KClcbiAgfSxcbiAgZG93bmxvYWRTY3JlZW5zaG90OiBmdW5jdGlvbigpIHtcbiAgICBJbXBvcnREaWFsb2cuaGlkZSgpXG4gICAgTWFwLm9mZmVyU2NyZWVuc2hvdERvd25sb2FkKClcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbXBvcnREaWFsb2dcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBmcm9udGVuZC9zcmMvTWV0YW1hcHMvR2xvYmFsVUkvSW1wb3J0RGlhbG9nLmpzIl0sIm1hcHBpbmdzIjoiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 576 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _react = __webpack_require__(174);var _react2 = _interopRequireDefault(_react);\nvar _reactDropzone = __webpack_require__(577);var _reactDropzone2 = _interopRequireDefault(_reactDropzone);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\n\nImportDialogBox = function (_Component) {_inherits(ImportDialogBox, _Component);\n  function ImportDialogBox(props) {_classCallCheck(this, ImportDialogBox);var _this = _possibleConstructorReturn(this, (ImportDialogBox.__proto__ || Object.getPrototypeOf(ImportDialogBox)).call(this,\n    props));_this.\n\n\n\n\n\n    handleExport = function (format) {return function () {\n        window.open(window.location.pathname + '/export.' + format, '_blank');\n      };};_this.\n\n    handleFile = function (files, e) {\n      _this.props.onFileAdded(files[0]);\n    };_this.\n\n    render = function () {\n      return (\n        _react2.default.createElement('div', { className: 'import-dialog' },\n          _react2.default.createElement('h3', null, 'EXPORT'),\n          _react2.default.createElement('div', { className: 'import-blue-button', onClick: _this.handleExport('csv') }, 'Export as CSV'),\n\n\n          _react2.default.createElement('div', { className: 'import-blue-button', onClick: _this.handleExport('json') }, 'Export as JSON'),\n\n\n          _react2.default.createElement('div', { className: 'import-blue-button', onClick: _this.props.downloadScreenshot }, 'Download screenshot'),\n\n\n          _react2.default.createElement('h3', null, 'IMPORT'),\n          _react2.default.createElement('p', null, 'To upload a file, drop it here:'),\n          _react2.default.createElement(_reactDropzone2.default, { onDropAccepted: _this.handleFile,\n              className: 'fileupload' }, 'Drop files here!'),\n\n\n\n          _react2.default.createElement('p', null, 'See ', _react2.default.createElement('a', { href: 'https://docs.metamaps.cc/importing_and_exporting_data.html' }, 'docs.metamaps.cc'), ' for instructions.')));\n\n\n    };_this.state = {};return _this;}return ImportDialogBox;}(_react.Component);\n\n\nImportDialogBox.propTypes = {\n  onFileAdded: _react.PropTypes.func,\n  exampleImageUrl: _react.PropTypes.string,\n  downloadScreenshot: _react.PropTypes.func };exports.default =\n\n\nImportDialogBox;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTc2LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvY29tcG9uZW50cy9JbXBvcnREaWFsb2dCb3guanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IFByb3BUeXBlcywgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgRHJvcHpvbmUgZnJvbSAncmVhY3QtZHJvcHpvbmUnXG5cbmNsYXNzIEltcG9ydERpYWxvZ0JveCBleHRlbmRzIENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUV4cG9ydCA9IGZvcm1hdCA9PiAoKSA9PiB7XG4gICAgd2luZG93Lm9wZW4oYCR7d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lfS9leHBvcnQuJHtmb3JtYXR9YCwgJ19ibGFuaycpXG4gIH1cblxuICBoYW5kbGVGaWxlID0gKGZpbGVzLCBlKSA9PiB7XG4gICAgdGhpcy5wcm9wcy5vbkZpbGVBZGRlZChmaWxlc1swXSlcbiAgfVxuXG4gIHJlbmRlciA9ICgpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbXBvcnQtZGlhbG9nXCI+XG4gICAgICAgIDxoMz5FWFBPUlQ8L2gzPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImltcG9ydC1ibHVlLWJ1dHRvblwiIG9uQ2xpY2s9e3RoaXMuaGFuZGxlRXhwb3J0KCdjc3YnKX0+XG4gICAgICAgICAgRXhwb3J0IGFzIENTVlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbXBvcnQtYmx1ZS1idXR0b25cIiBvbkNsaWNrPXt0aGlzLmhhbmRsZUV4cG9ydCgnanNvbicpfT5cbiAgICAgICAgICBFeHBvcnQgYXMgSlNPTlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbXBvcnQtYmx1ZS1idXR0b25cIiBvbkNsaWNrPXt0aGlzLnByb3BzLmRvd25sb2FkU2NyZWVuc2hvdH0+XG4gICAgICAgICAgRG93bmxvYWQgc2NyZWVuc2hvdFxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGgzPklNUE9SVDwvaDM+XG4gICAgICAgIDxwPlRvIHVwbG9hZCBhIGZpbGUsIGRyb3AgaXQgaGVyZTo8L3A+XG4gICAgICAgIDxEcm9wem9uZSBvbkRyb3BBY2NlcHRlZD17dGhpcy5oYW5kbGVGaWxlfVxuICAgICAgICAgIGNsYXNzTmFtZT1cImZpbGV1cGxvYWRcIlxuICAgICAgICA+XG4gICAgICAgICAgRHJvcCBmaWxlcyBoZXJlIVxuICAgICAgICA8L0Ryb3B6b25lPlxuICAgICAgICA8cD5TZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5tZXRhbWFwcy5jYy9pbXBvcnRpbmdfYW5kX2V4cG9ydGluZ19kYXRhLmh0bWxcIj5kb2NzLm1ldGFtYXBzLmNjPC9hPiBmb3IgaW5zdHJ1Y3Rpb25zLjwvcD5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxufVxuXG5JbXBvcnREaWFsb2dCb3gucHJvcFR5cGVzID0ge1xuICBvbkZpbGVBZGRlZDogUHJvcFR5cGVzLmZ1bmMsXG4gIGV4YW1wbGVJbWFnZVVybDogUHJvcFR5cGVzLnN0cmluZyxcbiAgZG93bmxvYWRTY3JlZW5zaG90OiBQcm9wVHlwZXMuZnVuY1xufVxuXG5leHBvcnQgZGVmYXVsdCBJbXBvcnREaWFsb2dCb3hcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBmcm9udGVuZC9zcmMvY29tcG9uZW50cy9JbXBvcnREaWFsb2dCb3guanMiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 577 */
/***/ function(module, exports, __webpack_require__) {

    eval("(function webpackUniversalModuleDefinition(root, factory) {\n\tif(true)\n\t\tmodule.exports = factory(__webpack_require__(174));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"react\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Dropzone\"] = factory(require(\"react\"));\n\telse\n\t\troot[\"Dropzone\"] = factory(root[\"react\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_1__) {\nreturn /******/ (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/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\t\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\t\n\tvar _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\t\n\tvar _react = __webpack_require__(1);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _attrAccept = __webpack_require__(2);\n\t\n\tvar _attrAccept2 = _interopRequireDefault(_attrAccept);\n\t\n\tvar _getDataTransferItems = __webpack_require__(3);\n\t\n\tvar _getDataTransferItems2 = _interopRequireDefault(_getDataTransferItems);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _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\t\n\tfunction _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; } /* eslint prefer-template: 0 */\n\t\n\t\n\tvar supportMultiple = typeof document !== 'undefined' && document && document.createElement ? 'multiple' in document.createElement('input') : true;\n\t\n\tvar Dropzone = function (_React$Component) {\n\t  _inherits(Dropzone, _React$Component);\n\t\n\t  function Dropzone(props, context) {\n\t    _classCallCheck(this, Dropzone);\n\t\n\t    var _this = _possibleConstructorReturn(this, (Dropzone.__proto__ || Object.getPrototypeOf(Dropzone)).call(this, props, context));\n\t\n\t    _this.onClick = _this.onClick.bind(_this);\n\t    _this.onDragStart = _this.onDragStart.bind(_this);\n\t    _this.onDragEnter = _this.onDragEnter.bind(_this);\n\t    _this.onDragLeave = _this.onDragLeave.bind(_this);\n\t    _this.onDragOver = _this.onDragOver.bind(_this);\n\t    _this.onDrop = _this.onDrop.bind(_this);\n\t    _this.onFileDialogCancel = _this.onFileDialogCancel.bind(_this);\n\t    _this.fileAccepted = _this.fileAccepted.bind(_this);\n\t    _this.isFileDialogActive = false;\n\t    _this.state = {\n\t      isDragActive: false\n\t    };\n\t    return _this;\n\t  }\n\t\n\t  _createClass(Dropzone, [{\n\t    key: 'componentDidMount',\n\t    value: function componentDidMount() {\n\t      this.enterCounter = 0;\n\t      // Tried implementing addEventListener, but didn't work out\n\t      document.body.onfocus = this.onFileDialogCancel;\n\t    }\n\t  }, {\n\t    key: 'componentWillUnmount',\n\t    value: function componentWillUnmount() {\n\t      // Can be replaced with removeEventListener, if addEventListener works\n\t      document.body.onfocus = null;\n\t    }\n\t  }, {\n\t    key: 'onDragStart',\n\t    value: function onDragStart(e) {\n\t      if (this.props.onDragStart) {\n\t        this.props.onDragStart.call(this, e);\n\t      }\n\t    }\n\t  }, {\n\t    key: 'onDragEnter',\n\t    value: function onDragEnter(e) {\n\t      e.preventDefault();\n\t\n\t      // Count the dropzone and any children that are entered.\n\t      ++this.enterCounter;\n\t\n\t      var allFilesAccepted = this.allFilesAccepted((0, _getDataTransferItems2.default)(e, this.props.multiple));\n\t\n\t      this.setState({\n\t        isDragActive: allFilesAccepted,\n\t        isDragReject: !allFilesAccepted\n\t      });\n\t\n\t      if (this.props.onDragEnter) {\n\t        this.props.onDragEnter.call(this, e);\n\t      }\n\t    }\n\t  }, {\n\t    key: 'onDragOver',\n\t    value: function onDragOver(e) {\n\t      // eslint-disable-line class-methods-use-this\n\t      e.preventDefault();\n\t      e.stopPropagation();\n\t      try {\n\t        e.dataTransfer.dropEffect = 'copy'; // eslint-disable-line no-param-reassign\n\t      } catch (err) {\n\t        // continue regardless of error\n\t      }\n\t\n\t      if (this.props.onDragOver) {\n\t        this.props.onDragOver.call(this, e);\n\t      }\n\t      return false;\n\t    }\n\t  }, {\n\t    key: 'onDragLeave',\n\t    value: function onDragLeave(e) {\n\t      e.preventDefault();\n\t\n\t      // Only deactivate once the dropzone and all children was left.\n\t      if (--this.enterCounter > 0) {\n\t        return;\n\t      }\n\t\n\t      this.setState({\n\t        isDragActive: false,\n\t        isDragReject: false\n\t      });\n\t\n\t      if (this.props.onDragLeave) {\n\t        this.props.onDragLeave.call(this, e);\n\t      }\n\t    }\n\t  }, {\n\t    key: 'onDrop',\n\t    value: function onDrop(e) {\n\t      var _this2 = this;\n\t\n\t      var _props = this.props,\n\t          onDrop = _props.onDrop,\n\t          onDropAccepted = _props.onDropAccepted,\n\t          onDropRejected = _props.onDropRejected,\n\t          multiple = _props.multiple,\n\t          disablePreview = _props.disablePreview;\n\t\n\t      var fileList = (0, _getDataTransferItems2.default)(e, multiple);\n\t      var acceptedFiles = [];\n\t      var rejectedFiles = [];\n\t\n\t      // Stop default browser behavior\n\t      e.preventDefault();\n\t\n\t      // Reset the counter along with the drag on a drop.\n\t      this.enterCounter = 0;\n\t      this.isFileDialogActive = false;\n\t\n\t      fileList.forEach(function (file) {\n\t        if (!disablePreview) {\n\t          file.preview = window.URL.createObjectURL(file); // eslint-disable-line no-param-reassign\n\t        }\n\t\n\t        if (_this2.fileAccepted(file) && _this2.fileMatchSize(file)) {\n\t          acceptedFiles.push(file);\n\t        } else {\n\t          rejectedFiles.push(file);\n\t        }\n\t      });\n\t\n\t      if (onDrop) {\n\t        onDrop.call(this, acceptedFiles, rejectedFiles, e);\n\t      }\n\t\n\t      if (rejectedFiles.length > 0 && onDropRejected) {\n\t        onDropRejected.call(this, rejectedFiles, e);\n\t      }\n\t\n\t      if (acceptedFiles.length > 0 && onDropAccepted) {\n\t        onDropAccepted.call(this, acceptedFiles, e);\n\t      }\n\t\n\t      // Reset drag state\n\t      this.setState({\n\t        isDragActive: false,\n\t        isDragReject: false\n\t      });\n\t    }\n\t  }, {\n\t    key: 'onClick',\n\t    value: function onClick(e) {\n\t      e.stopPropagation();\n\t      var _props2 = this.props,\n\t          onClick = _props2.onClick,\n\t          disableClick = _props2.disableClick;\n\t\n\t      if (!disableClick) {\n\t        this.open();\n\t        if (onClick) {\n\t          onClick.call(this, e);\n\t        }\n\t      }\n\t    }\n\t  }, {\n\t    key: 'onFileDialogCancel',\n\t    value: function onFileDialogCancel() {\n\t      // timeout will not recognize context of this method\n\t      var onFileDialogCancel = this.props.onFileDialogCancel;\n\t      var fileInputEl = this.fileInputEl;\n\t      var isFileDialogActive = this.isFileDialogActive;\n\t      // execute the timeout only if the onFileDialogCancel is defined and FileDialog\n\t      // is opened in the browser\n\t\n\t      if (onFileDialogCancel && isFileDialogActive) {\n\t        setTimeout(function () {\n\t          // Returns an object as FileList\n\t          var FileList = fileInputEl.files;\n\t          if (!FileList.length) {\n\t            isFileDialogActive = false;\n\t            onFileDialogCancel();\n\t          }\n\t        }, 300);\n\t      }\n\t    }\n\t  }, {\n\t    key: 'fileAccepted',\n\t    value: function fileAccepted(file) {\n\t      return (0, _attrAccept2.default)(file, this.props.accept);\n\t    }\n\t  }, {\n\t    key: 'fileMatchSize',\n\t    value: function fileMatchSize(file) {\n\t      return file.size <= this.props.maxSize && file.size >= this.props.minSize;\n\t    }\n\t  }, {\n\t    key: 'allFilesAccepted',\n\t    value: function allFilesAccepted(files) {\n\t      return files.every(this.fileAccepted);\n\t    }\n\t  }, {\n\t    key: 'open',\n\t    value: function open() {\n\t      this.isFileDialogActive = true;\n\t      this.fileInputEl.value = null;\n\t      this.fileInputEl.click();\n\t    }\n\t  }, {\n\t    key: 'render',\n\t    value: function render() {\n\t      var _this3 = this;\n\t\n\t      var _props3 = this.props,\n\t          accept = _props3.accept,\n\t          activeClassName = _props3.activeClassName,\n\t          inputProps = _props3.inputProps,\n\t          multiple = _props3.multiple,\n\t          name = _props3.name,\n\t          rejectClassName = _props3.rejectClassName,\n\t          rest = _objectWithoutProperties(_props3, ['accept', 'activeClassName', 'inputProps', 'multiple', 'name', 'rejectClassName']);\n\t\n\t      var activeStyle = rest.activeStyle,\n\t          className = rest.className,\n\t          rejectStyle = rest.rejectStyle,\n\t          style = rest.style,\n\t          props = _objectWithoutProperties(rest, ['activeStyle', 'className', 'rejectStyle', 'style']);\n\t\n\t      var _state = this.state,\n\t          isDragActive = _state.isDragActive,\n\t          isDragReject = _state.isDragReject;\n\t\n\t\n\t      className = className || '';\n\t\n\t      if (isDragActive && activeClassName) {\n\t        className += ' ' + activeClassName;\n\t      }\n\t      if (isDragReject && rejectClassName) {\n\t        className += ' ' + rejectClassName;\n\t      }\n\t\n\t      if (!className && !style && !activeStyle && !rejectStyle) {\n\t        style = {\n\t          width: 200,\n\t          height: 200,\n\t          borderWidth: 2,\n\t          borderColor: '#666',\n\t          borderStyle: 'dashed',\n\t          borderRadius: 5\n\t        };\n\t        activeStyle = {\n\t          borderStyle: 'solid',\n\t          backgroundColor: '#eee'\n\t        };\n\t        rejectStyle = {\n\t          borderStyle: 'solid',\n\t          backgroundColor: '#ffdddd'\n\t        };\n\t      }\n\t\n\t      var appliedStyle = void 0;\n\t      if (activeStyle && isDragActive) {\n\t        appliedStyle = _extends({}, style, activeStyle);\n\t      } else if (rejectStyle && isDragReject) {\n\t        appliedStyle = _extends({}, style, rejectStyle);\n\t      } else {\n\t        appliedStyle = _extends({}, style);\n\t      }\n\t\n\t      var inputAttributes = {\n\t        accept: accept,\n\t        type: 'file',\n\t        style: { display: 'none' },\n\t        multiple: supportMultiple && multiple,\n\t        ref: function ref(el) {\n\t          return _this3.fileInputEl = el;\n\t        }, // eslint-disable-line\n\t        onChange: this.onDrop\n\t      };\n\t\n\t      if (name && name.length) {\n\t        inputAttributes.name = name;\n\t      }\n\t\n\t      // Remove custom properties before passing them to the wrapper div element\n\t      var customProps = ['acceptedFiles', 'disablePreview', 'disableClick', 'onDropAccepted', 'onDropRejected', 'onFileDialogCancel', 'maxSize', 'minSize'];\n\t      var divProps = _extends({}, props);\n\t      customProps.forEach(function (prop) {\n\t        return delete divProps[prop];\n\t      });\n\t\n\t      return _react2.default.createElement(\n\t        'div',\n\t        _extends({\n\t          className: className,\n\t          style: appliedStyle\n\t        }, divProps /* expand user provided props first so event handlers are never overridden */, {\n\t          onClick: this.onClick,\n\t          onDragStart: this.onDragStart,\n\t          onDragEnter: this.onDragEnter,\n\t          onDragOver: this.onDragOver,\n\t          onDragLeave: this.onDragLeave,\n\t          onDrop: this.onDrop\n\t        }),\n\t        this.props.children,\n\t        _react2.default.createElement('input', _extends({}, inputProps /* expand user provided inputProps first so inputAttributes override them */, inputAttributes))\n\t      );\n\t    }\n\t  }]);\n\t\n\t  return Dropzone;\n\t}(_react2.default.Component);\n\t\n\tDropzone.defaultProps = {\n\t  disablePreview: false,\n\t  disableClick: false,\n\t  multiple: true,\n\t  maxSize: Infinity,\n\t  minSize: 0\n\t};\n\t\n\tDropzone.propTypes = {\n\t  onClick: _react2.default.PropTypes.func,\n\t  onDrop: _react2.default.PropTypes.func,\n\t  onDropAccepted: _react2.default.PropTypes.func,\n\t  onDropRejected: _react2.default.PropTypes.func,\n\t  onDragStart: _react2.default.PropTypes.func,\n\t  onDragEnter: _react2.default.PropTypes.func,\n\t  onDragOver: _react2.default.PropTypes.func,\n\t  onDragLeave: _react2.default.PropTypes.func,\n\t\n\t  children: _react2.default.PropTypes.node, // Contents of the dropzone\n\t  style: _react2.default.PropTypes.object, // CSS styles to apply\n\t  activeStyle: _react2.default.PropTypes.object, // CSS styles to apply when drop will be accepted\n\t  rejectStyle: _react2.default.PropTypes.object, // CSS styles to apply when drop will be rejected\n\t  className: _react2.default.PropTypes.string, // Optional className\n\t  activeClassName: _react2.default.PropTypes.string, // className for accepted state\n\t  rejectClassName: _react2.default.PropTypes.string, // className for rejected state\n\t\n\t  disablePreview: _react2.default.PropTypes.bool, // Enable/disable preview generation\n\t  disableClick: _react2.default.PropTypes.bool, // Disallow clicking on the dropzone container to open file dialog\n\t  onFileDialogCancel: _react2.default.PropTypes.func, // Provide a callback on clicking the cancel button of the file dialog\n\t\n\t  inputProps: _react2.default.PropTypes.object, // Pass additional attributes to the <input type=\"file\"/> tag\n\t  multiple: _react2.default.PropTypes.bool, // Allow dropping multiple files\n\t  accept: _react2.default.PropTypes.string, // Allow specific types of files. See https://github.com/okonet/attr-accept for more information\n\t  name: _react2.default.PropTypes.string, // name attribute for the input tag\n\t  maxSize: _react2.default.PropTypes.number,\n\t  minSize: _react2.default.PropTypes.number\n\t};\n\t\n\texports.default = Dropzone;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 1 */\n/***/ function(module, exports) {\n\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_1__;\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\tmodule.exports=function(t){function n(e){if(r[e])return r[e].exports;var o=r[e]={exports:{},id:e,loaded:!1};return t[e].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}var r={};return n.m=t,n.c=r,n.p=\"\",n(0)}([function(t,n,r){\"use strict\";n.__esModule=!0,r(8),r(9),n[\"default\"]=function(t,n){if(t&&n){var r=function(){var r=Array.isArray(n)?n:n.split(\",\"),e=t.name||\"\",o=t.type||\"\",i=o.replace(/\\/.*$/,\"\");return{v:r.some(function(t){var n=t.trim();return\".\"===n.charAt(0)?e.toLowerCase().endsWith(n.toLowerCase()):/\\/\\*$/.test(n)?i===n.replace(/\\/.*$/,\"\"):o===n})}}();if(\"object\"==typeof r)return r.v}return!0},t.exports=n[\"default\"]},function(t,n){var r=t.exports={version:\"1.2.2\"};\"number\"==typeof __e&&(__e=r)},function(t,n){var r=t.exports=\"undefined\"!=typeof window&&window.Math==Math?window:\"undefined\"!=typeof self&&self.Math==Math?self:Function(\"return this\")();\"number\"==typeof __g&&(__g=r)},function(t,n,r){var e=r(2),o=r(1),i=r(4),u=r(19),c=\"prototype\",f=function(t,n){return function(){return t.apply(n,arguments)}},s=function(t,n,r){var a,p,l,y,d=t&s.G,h=t&s.P,v=d?e:t&s.S?e[n]||(e[n]={}):(e[n]||{})[c],x=d?o:o[n]||(o[n]={});d&&(r=n);for(a in r)p=!(t&s.F)&&v&&a in v,l=(p?v:r)[a],y=t&s.B&&p?f(l,e):h&&\"function\"==typeof l?f(Function.call,l):l,v&&!p&&u(v,a,l),x[a]!=l&&i(x,a,y),h&&((x[c]||(x[c]={}))[a]=l)};e.core=o,s.F=1,s.G=2,s.S=4,s.P=8,s.B=16,s.W=32,t.exports=s},function(t,n,r){var e=r(5),o=r(18);t.exports=r(22)?function(t,n,r){return e.setDesc(t,n,o(1,r))}:function(t,n,r){return t[n]=r,t}},function(t,n){var r=Object;t.exports={create:r.create,getProto:r.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:r.getOwnPropertyDescriptor,setDesc:r.defineProperty,setDescs:r.defineProperties,getKeys:r.keys,getNames:r.getOwnPropertyNames,getSymbols:r.getOwnPropertySymbols,each:[].forEach}},function(t,n){var r=0,e=Math.random();t.exports=function(t){return\"Symbol(\".concat(void 0===t?\"\":t,\")_\",(++r+e).toString(36))}},function(t,n,r){var e=r(20)(\"wks\"),o=r(2).Symbol;t.exports=function(t){return e[t]||(e[t]=o&&o[t]||(o||r(6))(\"Symbol.\"+t))}},function(t,n,r){r(26),t.exports=r(1).Array.some},function(t,n,r){r(25),t.exports=r(1).String.endsWith},function(t,n){t.exports=function(t){if(\"function\"!=typeof t)throw TypeError(t+\" is not a function!\");return t}},function(t,n){var r={}.toString;t.exports=function(t){return r.call(t).slice(8,-1)}},function(t,n,r){var e=r(10);t.exports=function(t,n,r){if(e(t),void 0===n)return t;switch(r){case 1:return function(r){return t.call(n,r)};case 2:return function(r,e){return t.call(n,r,e)};case 3:return function(r,e,o){return t.call(n,r,e,o)}}return function(){return t.apply(n,arguments)}}},function(t,n){t.exports=function(t){if(void 0==t)throw TypeError(\"Can't call method on  \"+t);return t}},function(t,n,r){t.exports=function(t){var n=/./;try{\"/./\"[t](n)}catch(e){try{return n[r(7)(\"match\")]=!1,!\"/./\"[t](n)}catch(o){}}return!0}},function(t,n){t.exports=function(t){try{return!!t()}catch(n){return!0}}},function(t,n){t.exports=function(t){return\"object\"==typeof t?null!==t:\"function\"==typeof t}},function(t,n,r){var e=r(16),o=r(11),i=r(7)(\"match\");t.exports=function(t){var n;return e(t)&&(void 0!==(n=t[i])?!!n:\"RegExp\"==o(t))}},function(t,n){t.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},function(t,n,r){var e=r(2),o=r(4),i=r(6)(\"src\"),u=\"toString\",c=Function[u],f=(\"\"+c).split(u);r(1).inspectSource=function(t){return c.call(t)},(t.exports=function(t,n,r,u){\"function\"==typeof r&&(o(r,i,t[n]?\"\"+t[n]:f.join(String(n))),\"name\"in r||(r.name=n)),t===e?t[n]=r:(u||delete t[n],o(t,n,r))})(Function.prototype,u,function(){return\"function\"==typeof this&&this[i]||c.call(this)})},function(t,n,r){var e=r(2),o=\"__core-js_shared__\",i=e[o]||(e[o]={});t.exports=function(t){return i[t]||(i[t]={})}},function(t,n,r){var e=r(17),o=r(13);t.exports=function(t,n,r){if(e(n))throw TypeError(\"String#\"+r+\" doesn't accept regex!\");return String(o(t))}},function(t,n,r){t.exports=!r(15)(function(){return 7!=Object.defineProperty({},\"a\",{get:function(){return 7}}).a})},function(t,n){var r=Math.ceil,e=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?e:r)(t)}},function(t,n,r){var e=r(23),o=Math.min;t.exports=function(t){return t>0?o(e(t),9007199254740991):0}},function(t,n,r){\"use strict\";var e=r(3),o=r(24),i=r(21),u=\"endsWith\",c=\"\"[u];e(e.P+e.F*r(14)(u),\"String\",{endsWith:function(t){var n=i(this,t,u),r=arguments,e=r.length>1?r[1]:void 0,f=o(n.length),s=void 0===e?f:Math.min(o(e),f),a=String(t);return c?c.call(n,a,s):n.slice(s-a.length,s)===a}})},function(t,n,r){var e=r(5),o=r(3),i=r(1).Array||Array,u={},c=function(t,n){e.each.call(t.split(\",\"),function(t){void 0==n&&t in i?u[t]=i[t]:t in[]&&(u[t]=r(12)(Function.call,[][t],n))})};c(\"pop,reverse,shift,keys,values,entries\",1),c(\"indexOf,every,some,forEach,map,filter,find,findIndex,includes\",3),c(\"join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill\"),o(o.S,\"Array\",u)}]);\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\texports.default = getDataTransferFiles;\n\tfunction getDataTransferFiles(event) {\n\t  var isMultipleAllowed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\t\n\t  var dataTransferItemsList = [];\n\t  if (event.dataTransfer) {\n\t    var dt = event.dataTransfer;\n\t    if (dt.files && dt.files.length) {\n\t      dataTransferItemsList = dt.files;\n\t    } else if (dt.items && dt.items.length) {\n\t      // During the drag even the dataTransfer.files is null\n\t      // but Chrome implements some drag store, which is accesible via dataTransfer.items\n\t      dataTransferItemsList = dt.items;\n\t    }\n\t  } else if (event.target && event.target.files) {\n\t    dataTransferItemsList = event.target.files;\n\t  }\n\t\n\t  if (dataTransferItemsList.length > 0) {\n\t    dataTransferItemsList = isMultipleAllowed ? dataTransferItemsList : [dataTransferItemsList[0]];\n\t  }\n\t\n\t  // Convert from DataTransferItemsList to the native Array\n\t  return Array.prototype.slice.call(dataTransferItemsList);\n\t}\n\tmodule.exports = exports[\"default\"];\n\n/***/ }\n/******/ ])\n});\n;\n//# sourceMappingURL=index.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTc3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFjdC1kcm9wem9uZS9kaXN0L2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcInJlYWN0XCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtcInJlYWN0XCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkRyb3B6b25lXCJdID0gZmFjdG9yeShyZXF1aXJlKFwicmVhY3RcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkRyb3B6b25lXCJdID0gZmFjdG9yeShyb290W1wicmVhY3RcIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8xX18pIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fSxcbi8qKioqKiovIFx0XHRcdGlkOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGxvYWRlZDogZmFsc2Vcbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cdFxuXHR2YXIgX3JlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXHRcblx0dmFyIF9hdHRyQWNjZXB0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblx0XG5cdHZhciBfYXR0ckFjY2VwdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hdHRyQWNjZXB0KTtcblx0XG5cdHZhciBfZ2V0RGF0YVRyYW5zZmVySXRlbXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXHRcblx0dmFyIF9nZXREYXRhVHJhbnNmZXJJdGVtczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXREYXRhVHJhbnNmZXJJdGVtcyk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0ZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXHRcblx0ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblx0XG5cdGZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXHRcblx0ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9IC8qIGVzbGludCBwcmVmZXItdGVtcGxhdGU6IDAgKi9cblx0XG5cdFxuXHR2YXIgc3VwcG9ydE11bHRpcGxlID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudCAmJiBkb2N1bWVudC5jcmVhdGVFbGVtZW50ID8gJ211bHRpcGxlJyBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpIDogdHJ1ZTtcblx0XG5cdHZhciBEcm9wem9uZSA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG5cdCAgX2luaGVyaXRzKERyb3B6b25lLCBfUmVhY3QkQ29tcG9uZW50KTtcblx0XG5cdCAgZnVuY3Rpb24gRHJvcHpvbmUocHJvcHMsIGNvbnRleHQpIHtcblx0ICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBEcm9wem9uZSk7XG5cdFxuXHQgICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKERyb3B6b25lLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRHJvcHpvbmUpKS5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cdFxuXHQgICAgX3RoaXMub25DbGljayA9IF90aGlzLm9uQ2xpY2suYmluZChfdGhpcyk7XG5cdCAgICBfdGhpcy5vbkRyYWdTdGFydCA9IF90aGlzLm9uRHJhZ1N0YXJ0LmJpbmQoX3RoaXMpO1xuXHQgICAgX3RoaXMub25EcmFnRW50ZXIgPSBfdGhpcy5vbkRyYWdFbnRlci5iaW5kKF90aGlzKTtcblx0ICAgIF90aGlzLm9uRHJhZ0xlYXZlID0gX3RoaXMub25EcmFnTGVhdmUuYmluZChfdGhpcyk7XG5cdCAgICBfdGhpcy5vbkRyYWdPdmVyID0gX3RoaXMub25EcmFnT3Zlci5iaW5kKF90aGlzKTtcblx0ICAgIF90aGlzLm9uRHJvcCA9IF90aGlzLm9uRHJvcC5iaW5kKF90aGlzKTtcblx0ICAgIF90aGlzLm9uRmlsZURpYWxvZ0NhbmNlbCA9IF90aGlzLm9uRmlsZURpYWxvZ0NhbmNlbC5iaW5kKF90aGlzKTtcblx0ICAgIF90aGlzLmZpbGVBY2NlcHRlZCA9IF90aGlzLmZpbGVBY2NlcHRlZC5iaW5kKF90aGlzKTtcblx0ICAgIF90aGlzLmlzRmlsZURpYWxvZ0FjdGl2ZSA9IGZhbHNlO1xuXHQgICAgX3RoaXMuc3RhdGUgPSB7XG5cdCAgICAgIGlzRHJhZ0FjdGl2ZTogZmFsc2Vcblx0ICAgIH07XG5cdCAgICByZXR1cm4gX3RoaXM7XG5cdCAgfVxuXHRcblx0ICBfY3JlYXRlQ2xhc3MoRHJvcHpvbmUsIFt7XG5cdCAgICBrZXk6ICdjb21wb25lbnREaWRNb3VudCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG5cdCAgICAgIHRoaXMuZW50ZXJDb3VudGVyID0gMDtcblx0ICAgICAgLy8gVHJpZWQgaW1wbGVtZW50aW5nIGFkZEV2ZW50TGlzdGVuZXIsIGJ1dCBkaWRuJ3Qgd29yayBvdXRcblx0ICAgICAgZG9jdW1lbnQuYm9keS5vbmZvY3VzID0gdGhpcy5vbkZpbGVEaWFsb2dDYW5jZWw7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnY29tcG9uZW50V2lsbFVubW91bnQnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuXHQgICAgICAvLyBDYW4gYmUgcmVwbGFjZWQgd2l0aCByZW1vdmVFdmVudExpc3RlbmVyLCBpZiBhZGRFdmVudExpc3RlbmVyIHdvcmtzXG5cdCAgICAgIGRvY3VtZW50LmJvZHkub25mb2N1cyA9IG51bGw7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnb25EcmFnU3RhcnQnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIG9uRHJhZ1N0YXJ0KGUpIHtcblx0ICAgICAgaWYgKHRoaXMucHJvcHMub25EcmFnU3RhcnQpIHtcblx0ICAgICAgICB0aGlzLnByb3BzLm9uRHJhZ1N0YXJ0LmNhbGwodGhpcywgZSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdvbkRyYWdFbnRlcicsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gb25EcmFnRW50ZXIoZSkge1xuXHQgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cdFxuXHQgICAgICAvLyBDb3VudCB0aGUgZHJvcHpvbmUgYW5kIGFueSBjaGlsZHJlbiB0aGF0IGFyZSBlbnRlcmVkLlxuXHQgICAgICArK3RoaXMuZW50ZXJDb3VudGVyO1xuXHRcblx0ICAgICAgdmFyIGFsbEZpbGVzQWNjZXB0ZWQgPSB0aGlzLmFsbEZpbGVzQWNjZXB0ZWQoKDAsIF9nZXREYXRhVHJhbnNmZXJJdGVtczIuZGVmYXVsdCkoZSwgdGhpcy5wcm9wcy5tdWx0aXBsZSkpO1xuXHRcblx0ICAgICAgdGhpcy5zZXRTdGF0ZSh7XG5cdCAgICAgICAgaXNEcmFnQWN0aXZlOiBhbGxGaWxlc0FjY2VwdGVkLFxuXHQgICAgICAgIGlzRHJhZ1JlamVjdDogIWFsbEZpbGVzQWNjZXB0ZWRcblx0ICAgICAgfSk7XG5cdFxuXHQgICAgICBpZiAodGhpcy5wcm9wcy5vbkRyYWdFbnRlcikge1xuXHQgICAgICAgIHRoaXMucHJvcHMub25EcmFnRW50ZXIuY2FsbCh0aGlzLCBlKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29uRHJhZ092ZXInLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIG9uRHJhZ092ZXIoZSkge1xuXHQgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcblx0ICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICB0cnkge1xuXHQgICAgICAgIGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblx0ICAgICAgfSBjYXRjaCAoZXJyKSB7XG5cdCAgICAgICAgLy8gY29udGludWUgcmVnYXJkbGVzcyBvZiBlcnJvclxuXHQgICAgICB9XG5cdFxuXHQgICAgICBpZiAodGhpcy5wcm9wcy5vbkRyYWdPdmVyKSB7XG5cdCAgICAgICAgdGhpcy5wcm9wcy5vbkRyYWdPdmVyLmNhbGwodGhpcywgZSk7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29uRHJhZ0xlYXZlJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvbkRyYWdMZWF2ZShlKSB7XG5cdCAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblx0XG5cdCAgICAgIC8vIE9ubHkgZGVhY3RpdmF0ZSBvbmNlIHRoZSBkcm9wem9uZSBhbmQgYWxsIGNoaWxkcmVuIHdhcyBsZWZ0LlxuXHQgICAgICBpZiAoLS10aGlzLmVudGVyQ291bnRlciA+IDApIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHRoaXMuc2V0U3RhdGUoe1xuXHQgICAgICAgIGlzRHJhZ0FjdGl2ZTogZmFsc2UsXG5cdCAgICAgICAgaXNEcmFnUmVqZWN0OiBmYWxzZVxuXHQgICAgICB9KTtcblx0XG5cdCAgICAgIGlmICh0aGlzLnByb3BzLm9uRHJhZ0xlYXZlKSB7XG5cdCAgICAgICAgdGhpcy5wcm9wcy5vbkRyYWdMZWF2ZS5jYWxsKHRoaXMsIGUpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnb25Ecm9wJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvbkRyb3AoZSkge1xuXHQgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblx0XG5cdCAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuXHQgICAgICAgICAgb25Ecm9wID0gX3Byb3BzLm9uRHJvcCxcblx0ICAgICAgICAgIG9uRHJvcEFjY2VwdGVkID0gX3Byb3BzLm9uRHJvcEFjY2VwdGVkLFxuXHQgICAgICAgICAgb25Ecm9wUmVqZWN0ZWQgPSBfcHJvcHMub25Ecm9wUmVqZWN0ZWQsXG5cdCAgICAgICAgICBtdWx0aXBsZSA9IF9wcm9wcy5tdWx0aXBsZSxcblx0ICAgICAgICAgIGRpc2FibGVQcmV2aWV3ID0gX3Byb3BzLmRpc2FibGVQcmV2aWV3O1xuXHRcblx0ICAgICAgdmFyIGZpbGVMaXN0ID0gKDAsIF9nZXREYXRhVHJhbnNmZXJJdGVtczIuZGVmYXVsdCkoZSwgbXVsdGlwbGUpO1xuXHQgICAgICB2YXIgYWNjZXB0ZWRGaWxlcyA9IFtdO1xuXHQgICAgICB2YXIgcmVqZWN0ZWRGaWxlcyA9IFtdO1xuXHRcblx0ICAgICAgLy8gU3RvcCBkZWZhdWx0IGJyb3dzZXIgYmVoYXZpb3Jcblx0ICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcblx0ICAgICAgLy8gUmVzZXQgdGhlIGNvdW50ZXIgYWxvbmcgd2l0aCB0aGUgZHJhZyBvbiBhIGRyb3AuXG5cdCAgICAgIHRoaXMuZW50ZXJDb3VudGVyID0gMDtcblx0ICAgICAgdGhpcy5pc0ZpbGVEaWFsb2dBY3RpdmUgPSBmYWxzZTtcblx0XG5cdCAgICAgIGZpbGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGZpbGUpIHtcblx0ICAgICAgICBpZiAoIWRpc2FibGVQcmV2aWV3KSB7XG5cdCAgICAgICAgICBmaWxlLnByZXZpZXcgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgaWYgKF90aGlzMi5maWxlQWNjZXB0ZWQoZmlsZSkgJiYgX3RoaXMyLmZpbGVNYXRjaFNpemUoZmlsZSkpIHtcblx0ICAgICAgICAgIGFjY2VwdGVkRmlsZXMucHVzaChmaWxlKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgcmVqZWN0ZWRGaWxlcy5wdXNoKGZpbGUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSk7XG5cdFxuXHQgICAgICBpZiAob25Ecm9wKSB7XG5cdCAgICAgICAgb25Ecm9wLmNhbGwodGhpcywgYWNjZXB0ZWRGaWxlcywgcmVqZWN0ZWRGaWxlcywgZSk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGlmIChyZWplY3RlZEZpbGVzLmxlbmd0aCA+IDAgJiYgb25Ecm9wUmVqZWN0ZWQpIHtcblx0ICAgICAgICBvbkRyb3BSZWplY3RlZC5jYWxsKHRoaXMsIHJlamVjdGVkRmlsZXMsIGUpO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBpZiAoYWNjZXB0ZWRGaWxlcy5sZW5ndGggPiAwICYmIG9uRHJvcEFjY2VwdGVkKSB7XG5cdCAgICAgICAgb25Ecm9wQWNjZXB0ZWQuY2FsbCh0aGlzLCBhY2NlcHRlZEZpbGVzLCBlKTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgLy8gUmVzZXQgZHJhZyBzdGF0ZVxuXHQgICAgICB0aGlzLnNldFN0YXRlKHtcblx0ICAgICAgICBpc0RyYWdBY3RpdmU6IGZhbHNlLFxuXHQgICAgICAgIGlzRHJhZ1JlamVjdDogZmFsc2Vcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnb25DbGljaycsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gb25DbGljayhlKSB7XG5cdCAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdCAgICAgIHZhciBfcHJvcHMyID0gdGhpcy5wcm9wcyxcblx0ICAgICAgICAgIG9uQ2xpY2sgPSBfcHJvcHMyLm9uQ2xpY2ssXG5cdCAgICAgICAgICBkaXNhYmxlQ2xpY2sgPSBfcHJvcHMyLmRpc2FibGVDbGljaztcblx0XG5cdCAgICAgIGlmICghZGlzYWJsZUNsaWNrKSB7XG5cdCAgICAgICAgdGhpcy5vcGVuKCk7XG5cdCAgICAgICAgaWYgKG9uQ2xpY2spIHtcblx0ICAgICAgICAgIG9uQ2xpY2suY2FsbCh0aGlzLCBlKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdvbkZpbGVEaWFsb2dDYW5jZWwnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIG9uRmlsZURpYWxvZ0NhbmNlbCgpIHtcblx0ICAgICAgLy8gdGltZW91dCB3aWxsIG5vdCByZWNvZ25pemUgY29udGV4dCBvZiB0aGlzIG1ldGhvZFxuXHQgICAgICB2YXIgb25GaWxlRGlhbG9nQ2FuY2VsID0gdGhpcy5wcm9wcy5vbkZpbGVEaWFsb2dDYW5jZWw7XG5cdCAgICAgIHZhciBmaWxlSW5wdXRFbCA9IHRoaXMuZmlsZUlucHV0RWw7XG5cdCAgICAgIHZhciBpc0ZpbGVEaWFsb2dBY3RpdmUgPSB0aGlzLmlzRmlsZURpYWxvZ0FjdGl2ZTtcblx0ICAgICAgLy8gZXhlY3V0ZSB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBvbkZpbGVEaWFsb2dDYW5jZWwgaXMgZGVmaW5lZCBhbmQgRmlsZURpYWxvZ1xuXHQgICAgICAvLyBpcyBvcGVuZWQgaW4gdGhlIGJyb3dzZXJcblx0XG5cdCAgICAgIGlmIChvbkZpbGVEaWFsb2dDYW5jZWwgJiYgaXNGaWxlRGlhbG9nQWN0aXZlKSB7XG5cdCAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAvLyBSZXR1cm5zIGFuIG9iamVjdCBhcyBGaWxlTGlzdFxuXHQgICAgICAgICAgdmFyIEZpbGVMaXN0ID0gZmlsZUlucHV0RWwuZmlsZXM7XG5cdCAgICAgICAgICBpZiAoIUZpbGVMaXN0Lmxlbmd0aCkge1xuXHQgICAgICAgICAgICBpc0ZpbGVEaWFsb2dBY3RpdmUgPSBmYWxzZTtcblx0ICAgICAgICAgICAgb25GaWxlRGlhbG9nQ2FuY2VsKCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSwgMzAwKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2ZpbGVBY2NlcHRlZCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZmlsZUFjY2VwdGVkKGZpbGUpIHtcblx0ICAgICAgcmV0dXJuICgwLCBfYXR0ckFjY2VwdDIuZGVmYXVsdCkoZmlsZSwgdGhpcy5wcm9wcy5hY2NlcHQpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2ZpbGVNYXRjaFNpemUnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGZpbGVNYXRjaFNpemUoZmlsZSkge1xuXHQgICAgICByZXR1cm4gZmlsZS5zaXplIDw9IHRoaXMucHJvcHMubWF4U2l6ZSAmJiBmaWxlLnNpemUgPj0gdGhpcy5wcm9wcy5taW5TaXplO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2FsbEZpbGVzQWNjZXB0ZWQnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGFsbEZpbGVzQWNjZXB0ZWQoZmlsZXMpIHtcblx0ICAgICAgcmV0dXJuIGZpbGVzLmV2ZXJ5KHRoaXMuZmlsZUFjY2VwdGVkKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdvcGVuJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvcGVuKCkge1xuXHQgICAgICB0aGlzLmlzRmlsZURpYWxvZ0FjdGl2ZSA9IHRydWU7XG5cdCAgICAgIHRoaXMuZmlsZUlucHV0RWwudmFsdWUgPSBudWxsO1xuXHQgICAgICB0aGlzLmZpbGVJbnB1dEVsLmNsaWNrKCk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAncmVuZGVyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdCAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXHRcblx0ICAgICAgdmFyIF9wcm9wczMgPSB0aGlzLnByb3BzLFxuXHQgICAgICAgICAgYWNjZXB0ID0gX3Byb3BzMy5hY2NlcHQsXG5cdCAgICAgICAgICBhY3RpdmVDbGFzc05hbWUgPSBfcHJvcHMzLmFjdGl2ZUNsYXNzTmFtZSxcblx0ICAgICAgICAgIGlucHV0UHJvcHMgPSBfcHJvcHMzLmlucHV0UHJvcHMsXG5cdCAgICAgICAgICBtdWx0aXBsZSA9IF9wcm9wczMubXVsdGlwbGUsXG5cdCAgICAgICAgICBuYW1lID0gX3Byb3BzMy5uYW1lLFxuXHQgICAgICAgICAgcmVqZWN0Q2xhc3NOYW1lID0gX3Byb3BzMy5yZWplY3RDbGFzc05hbWUsXG5cdCAgICAgICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9wcm9wczMsIFsnYWNjZXB0JywgJ2FjdGl2ZUNsYXNzTmFtZScsICdpbnB1dFByb3BzJywgJ211bHRpcGxlJywgJ25hbWUnLCAncmVqZWN0Q2xhc3NOYW1lJ10pO1xuXHRcblx0ICAgICAgdmFyIGFjdGl2ZVN0eWxlID0gcmVzdC5hY3RpdmVTdHlsZSxcblx0ICAgICAgICAgIGNsYXNzTmFtZSA9IHJlc3QuY2xhc3NOYW1lLFxuXHQgICAgICAgICAgcmVqZWN0U3R5bGUgPSByZXN0LnJlamVjdFN0eWxlLFxuXHQgICAgICAgICAgc3R5bGUgPSByZXN0LnN0eWxlLFxuXHQgICAgICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocmVzdCwgWydhY3RpdmVTdHlsZScsICdjbGFzc05hbWUnLCAncmVqZWN0U3R5bGUnLCAnc3R5bGUnXSk7XG5cdFxuXHQgICAgICB2YXIgX3N0YXRlID0gdGhpcy5zdGF0ZSxcblx0ICAgICAgICAgIGlzRHJhZ0FjdGl2ZSA9IF9zdGF0ZS5pc0RyYWdBY3RpdmUsXG5cdCAgICAgICAgICBpc0RyYWdSZWplY3QgPSBfc3RhdGUuaXNEcmFnUmVqZWN0O1xuXHRcblx0XG5cdCAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZSB8fCAnJztcblx0XG5cdCAgICAgIGlmIChpc0RyYWdBY3RpdmUgJiYgYWN0aXZlQ2xhc3NOYW1lKSB7XG5cdCAgICAgICAgY2xhc3NOYW1lICs9ICcgJyArIGFjdGl2ZUNsYXNzTmFtZTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoaXNEcmFnUmVqZWN0ICYmIHJlamVjdENsYXNzTmFtZSkge1xuXHQgICAgICAgIGNsYXNzTmFtZSArPSAnICcgKyByZWplY3RDbGFzc05hbWU7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGlmICghY2xhc3NOYW1lICYmICFzdHlsZSAmJiAhYWN0aXZlU3R5bGUgJiYgIXJlamVjdFN0eWxlKSB7XG5cdCAgICAgICAgc3R5bGUgPSB7XG5cdCAgICAgICAgICB3aWR0aDogMjAwLFxuXHQgICAgICAgICAgaGVpZ2h0OiAyMDAsXG5cdCAgICAgICAgICBib3JkZXJXaWR0aDogMixcblx0ICAgICAgICAgIGJvcmRlckNvbG9yOiAnIzY2NicsXG5cdCAgICAgICAgICBib3JkZXJTdHlsZTogJ2Rhc2hlZCcsXG5cdCAgICAgICAgICBib3JkZXJSYWRpdXM6IDVcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGFjdGl2ZVN0eWxlID0ge1xuXHQgICAgICAgICAgYm9yZGVyU3R5bGU6ICdzb2xpZCcsXG5cdCAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZWVlJ1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgcmVqZWN0U3R5bGUgPSB7XG5cdCAgICAgICAgICBib3JkZXJTdHlsZTogJ3NvbGlkJyxcblx0ICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyNmZmRkZGQnXG5cdCAgICAgICAgfTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgdmFyIGFwcGxpZWRTdHlsZSA9IHZvaWQgMDtcblx0ICAgICAgaWYgKGFjdGl2ZVN0eWxlICYmIGlzRHJhZ0FjdGl2ZSkge1xuXHQgICAgICAgIGFwcGxpZWRTdHlsZSA9IF9leHRlbmRzKHt9LCBzdHlsZSwgYWN0aXZlU3R5bGUpO1xuXHQgICAgICB9IGVsc2UgaWYgKHJlamVjdFN0eWxlICYmIGlzRHJhZ1JlamVjdCkge1xuXHQgICAgICAgIGFwcGxpZWRTdHlsZSA9IF9leHRlbmRzKHt9LCBzdHlsZSwgcmVqZWN0U3R5bGUpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGFwcGxpZWRTdHlsZSA9IF9leHRlbmRzKHt9LCBzdHlsZSk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHZhciBpbnB1dEF0dHJpYnV0ZXMgPSB7XG5cdCAgICAgICAgYWNjZXB0OiBhY2NlcHQsXG5cdCAgICAgICAgdHlwZTogJ2ZpbGUnLFxuXHQgICAgICAgIHN0eWxlOiB7IGRpc3BsYXk6ICdub25lJyB9LFxuXHQgICAgICAgIG11bHRpcGxlOiBzdXBwb3J0TXVsdGlwbGUgJiYgbXVsdGlwbGUsXG5cdCAgICAgICAgcmVmOiBmdW5jdGlvbiByZWYoZWwpIHtcblx0ICAgICAgICAgIHJldHVybiBfdGhpczMuZmlsZUlucHV0RWwgPSBlbDtcblx0ICAgICAgICB9LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cdCAgICAgICAgb25DaGFuZ2U6IHRoaXMub25Ecm9wXG5cdCAgICAgIH07XG5cdFxuXHQgICAgICBpZiAobmFtZSAmJiBuYW1lLmxlbmd0aCkge1xuXHQgICAgICAgIGlucHV0QXR0cmlidXRlcy5uYW1lID0gbmFtZTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgLy8gUmVtb3ZlIGN1c3RvbSBwcm9wZXJ0aWVzIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlIHdyYXBwZXIgZGl2IGVsZW1lbnRcblx0ICAgICAgdmFyIGN1c3RvbVByb3BzID0gWydhY2NlcHRlZEZpbGVzJywgJ2Rpc2FibGVQcmV2aWV3JywgJ2Rpc2FibGVDbGljaycsICdvbkRyb3BBY2NlcHRlZCcsICdvbkRyb3BSZWplY3RlZCcsICdvbkZpbGVEaWFsb2dDYW5jZWwnLCAnbWF4U2l6ZScsICdtaW5TaXplJ107XG5cdCAgICAgIHZhciBkaXZQcm9wcyA9IF9leHRlbmRzKHt9LCBwcm9wcyk7XG5cdCAgICAgIGN1c3RvbVByb3BzLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcblx0ICAgICAgICByZXR1cm4gZGVsZXRlIGRpdlByb3BzW3Byb3BdO1xuXHQgICAgICB9KTtcblx0XG5cdCAgICAgIHJldHVybiBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcblx0ICAgICAgICAnZGl2Jyxcblx0ICAgICAgICBfZXh0ZW5kcyh7XG5cdCAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcblx0ICAgICAgICAgIHN0eWxlOiBhcHBsaWVkU3R5bGVcblx0ICAgICAgICB9LCBkaXZQcm9wcyAvKiBleHBhbmQgdXNlciBwcm92aWRlZCBwcm9wcyBmaXJzdCBzbyBldmVudCBoYW5kbGVycyBhcmUgbmV2ZXIgb3ZlcnJpZGRlbiAqLywge1xuXHQgICAgICAgICAgb25DbGljazogdGhpcy5vbkNsaWNrLFxuXHQgICAgICAgICAgb25EcmFnU3RhcnQ6IHRoaXMub25EcmFnU3RhcnQsXG5cdCAgICAgICAgICBvbkRyYWdFbnRlcjogdGhpcy5vbkRyYWdFbnRlcixcblx0ICAgICAgICAgIG9uRHJhZ092ZXI6IHRoaXMub25EcmFnT3Zlcixcblx0ICAgICAgICAgIG9uRHJhZ0xlYXZlOiB0aGlzLm9uRHJhZ0xlYXZlLFxuXHQgICAgICAgICAgb25Ecm9wOiB0aGlzLm9uRHJvcFxuXHQgICAgICAgIH0pLFxuXHQgICAgICAgIHRoaXMucHJvcHMuY2hpbGRyZW4sXG5cdCAgICAgICAgX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JywgX2V4dGVuZHMoe30sIGlucHV0UHJvcHMgLyogZXhwYW5kIHVzZXIgcHJvdmlkZWQgaW5wdXRQcm9wcyBmaXJzdCBzbyBpbnB1dEF0dHJpYnV0ZXMgb3ZlcnJpZGUgdGhlbSAqLywgaW5wdXRBdHRyaWJ1dGVzKSlcblx0ICAgICAgKTtcblx0ICAgIH1cblx0ICB9XSk7XG5cdFxuXHQgIHJldHVybiBEcm9wem9uZTtcblx0fShfcmVhY3QyLmRlZmF1bHQuQ29tcG9uZW50KTtcblx0XG5cdERyb3B6b25lLmRlZmF1bHRQcm9wcyA9IHtcblx0ICBkaXNhYmxlUHJldmlldzogZmFsc2UsXG5cdCAgZGlzYWJsZUNsaWNrOiBmYWxzZSxcblx0ICBtdWx0aXBsZTogdHJ1ZSxcblx0ICBtYXhTaXplOiBJbmZpbml0eSxcblx0ICBtaW5TaXplOiAwXG5cdH07XG5cdFxuXHREcm9wem9uZS5wcm9wVHlwZXMgPSB7XG5cdCAgb25DbGljazogX3JlYWN0Mi5kZWZhdWx0LlByb3BUeXBlcy5mdW5jLFxuXHQgIG9uRHJvcDogX3JlYWN0Mi5kZWZhdWx0LlByb3BUeXBlcy5mdW5jLFxuXHQgIG9uRHJvcEFjY2VwdGVkOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLmZ1bmMsXG5cdCAgb25Ecm9wUmVqZWN0ZWQ6IF9yZWFjdDIuZGVmYXVsdC5Qcm9wVHlwZXMuZnVuYyxcblx0ICBvbkRyYWdTdGFydDogX3JlYWN0Mi5kZWZhdWx0LlByb3BUeXBlcy5mdW5jLFxuXHQgIG9uRHJhZ0VudGVyOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLmZ1bmMsXG5cdCAgb25EcmFnT3ZlcjogX3JlYWN0Mi5kZWZhdWx0LlByb3BUeXBlcy5mdW5jLFxuXHQgIG9uRHJhZ0xlYXZlOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLmZ1bmMsXG5cdFxuXHQgIGNoaWxkcmVuOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLm5vZGUsIC8vIENvbnRlbnRzIG9mIHRoZSBkcm9wem9uZVxuXHQgIHN0eWxlOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLm9iamVjdCwgLy8gQ1NTIHN0eWxlcyB0byBhcHBseVxuXHQgIGFjdGl2ZVN0eWxlOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLm9iamVjdCwgLy8gQ1NTIHN0eWxlcyB0byBhcHBseSB3aGVuIGRyb3Agd2lsbCBiZSBhY2NlcHRlZFxuXHQgIHJlamVjdFN0eWxlOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLm9iamVjdCwgLy8gQ1NTIHN0eWxlcyB0byBhcHBseSB3aGVuIGRyb3Agd2lsbCBiZSByZWplY3RlZFxuXHQgIGNsYXNzTmFtZTogX3JlYWN0Mi5kZWZhdWx0LlByb3BUeXBlcy5zdHJpbmcsIC8vIE9wdGlvbmFsIGNsYXNzTmFtZVxuXHQgIGFjdGl2ZUNsYXNzTmFtZTogX3JlYWN0Mi5kZWZhdWx0LlByb3BUeXBlcy5zdHJpbmcsIC8vIGNsYXNzTmFtZSBmb3IgYWNjZXB0ZWQgc3RhdGVcblx0ICByZWplY3RDbGFzc05hbWU6IF9yZWFjdDIuZGVmYXVsdC5Qcm9wVHlwZXMuc3RyaW5nLCAvLyBjbGFzc05hbWUgZm9yIHJlamVjdGVkIHN0YXRlXG5cdFxuXHQgIGRpc2FibGVQcmV2aWV3OiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLmJvb2wsIC8vIEVuYWJsZS9kaXNhYmxlIHByZXZpZXcgZ2VuZXJhdGlvblxuXHQgIGRpc2FibGVDbGljazogX3JlYWN0Mi5kZWZhdWx0LlByb3BUeXBlcy5ib29sLCAvLyBEaXNhbGxvdyBjbGlja2luZyBvbiB0aGUgZHJvcHpvbmUgY29udGFpbmVyIHRvIG9wZW4gZmlsZSBkaWFsb2dcblx0ICBvbkZpbGVEaWFsb2dDYW5jZWw6IF9yZWFjdDIuZGVmYXVsdC5Qcm9wVHlwZXMuZnVuYywgLy8gUHJvdmlkZSBhIGNhbGxiYWNrIG9uIGNsaWNraW5nIHRoZSBjYW5jZWwgYnV0dG9uIG9mIHRoZSBmaWxlIGRpYWxvZ1xuXHRcblx0ICBpbnB1dFByb3BzOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLm9iamVjdCwgLy8gUGFzcyBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgdG8gdGhlIDxpbnB1dCB0eXBlPVwiZmlsZVwiLz4gdGFnXG5cdCAgbXVsdGlwbGU6IF9yZWFjdDIuZGVmYXVsdC5Qcm9wVHlwZXMuYm9vbCwgLy8gQWxsb3cgZHJvcHBpbmcgbXVsdGlwbGUgZmlsZXNcblx0ICBhY2NlcHQ6IF9yZWFjdDIuZGVmYXVsdC5Qcm9wVHlwZXMuc3RyaW5nLCAvLyBBbGxvdyBzcGVjaWZpYyB0eXBlcyBvZiBmaWxlcy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9va29uZXQvYXR0ci1hY2NlcHQgZm9yIG1vcmUgaW5mb3JtYXRpb25cblx0ICBuYW1lOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLnN0cmluZywgLy8gbmFtZSBhdHRyaWJ1dGUgZm9yIHRoZSBpbnB1dCB0YWdcblx0ICBtYXhTaXplOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLm51bWJlcixcblx0ICBtaW5TaXplOiBfcmVhY3QyLmRlZmF1bHQuUHJvcFR5cGVzLm51bWJlclxuXHR9O1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0gRHJvcHpvbmU7XG5cdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9LFxuLyogMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzFfXztcblxuLyoqKi8gfSxcbi8qIDIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4oZSl7aWYocltlXSlyZXR1cm4gcltlXS5leHBvcnRzO3ZhciBvPXJbZV09e2V4cG9ydHM6e30saWQ6ZSxsb2FkZWQ6ITF9O3JldHVybiB0W2VdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubG9hZGVkPSEwLG8uZXhwb3J0c312YXIgcj17fTtyZXR1cm4gbi5tPXQsbi5jPXIsbi5wPVwiXCIsbigwKX0oW2Z1bmN0aW9uKHQsbixyKXtcInVzZSBzdHJpY3RcIjtuLl9fZXNNb2R1bGU9ITAscig4KSxyKDkpLG5bXCJkZWZhdWx0XCJdPWZ1bmN0aW9uKHQsbil7aWYodCYmbil7dmFyIHI9ZnVuY3Rpb24oKXt2YXIgcj1BcnJheS5pc0FycmF5KG4pP246bi5zcGxpdChcIixcIiksZT10Lm5hbWV8fFwiXCIsbz10LnR5cGV8fFwiXCIsaT1vLnJlcGxhY2UoL1xcLy4qJC8sXCJcIik7cmV0dXJue3Y6ci5zb21lKGZ1bmN0aW9uKHQpe3ZhciBuPXQudHJpbSgpO3JldHVyblwiLlwiPT09bi5jaGFyQXQoMCk/ZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKG4udG9Mb3dlckNhc2UoKSk6L1xcL1xcKiQvLnRlc3Qobik/aT09PW4ucmVwbGFjZSgvXFwvLiokLyxcIlwiKTpvPT09bn0pfX0oKTtpZihcIm9iamVjdFwiPT10eXBlb2YgcilyZXR1cm4gci52fXJldHVybiEwfSx0LmV4cG9ydHM9bltcImRlZmF1bHRcIl19LGZ1bmN0aW9uKHQsbil7dmFyIHI9dC5leHBvcnRzPXt2ZXJzaW9uOlwiMS4yLjJcIn07XCJudW1iZXJcIj09dHlwZW9mIF9fZSYmKF9fZT1yKX0sZnVuY3Rpb24odCxuKXt2YXIgcj10LmV4cG9ydHM9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Lk1hdGg9PU1hdGg/d2luZG93OlwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmJiZzZWxmLk1hdGg9PU1hdGg/c2VsZjpGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XCJudW1iZXJcIj09dHlwZW9mIF9fZyYmKF9fZz1yKX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMiksbz1yKDEpLGk9cig0KSx1PXIoMTkpLGM9XCJwcm90b3R5cGVcIixmPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkobixhcmd1bWVudHMpfX0scz1mdW5jdGlvbih0LG4scil7dmFyIGEscCxsLHksZD10JnMuRyxoPXQmcy5QLHY9ZD9lOnQmcy5TP2Vbbl18fChlW25dPXt9KTooZVtuXXx8e30pW2NdLHg9ZD9vOm9bbl18fChvW25dPXt9KTtkJiYocj1uKTtmb3IoYSBpbiByKXA9ISh0JnMuRikmJnYmJmEgaW4gdixsPShwP3Y6cilbYV0seT10JnMuQiYmcD9mKGwsZSk6aCYmXCJmdW5jdGlvblwiPT10eXBlb2YgbD9mKEZ1bmN0aW9uLmNhbGwsbCk6bCx2JiYhcCYmdSh2LGEsbCkseFthXSE9bCYmaSh4LGEseSksaCYmKCh4W2NdfHwoeFtjXT17fSkpW2FdPWwpfTtlLmNvcmU9byxzLkY9MSxzLkc9MixzLlM9NCxzLlA9OCxzLkI9MTYscy5XPTMyLHQuZXhwb3J0cz1zfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cig1KSxvPXIoMTgpO3QuZXhwb3J0cz1yKDIyKT9mdW5jdGlvbih0LG4scil7cmV0dXJuIGUuc2V0RGVzYyh0LG4sbygxLHIpKX06ZnVuY3Rpb24odCxuLHIpe3JldHVybiB0W25dPXIsdH19LGZ1bmN0aW9uKHQsbil7dmFyIHI9T2JqZWN0O3QuZXhwb3J0cz17Y3JlYXRlOnIuY3JlYXRlLGdldFByb3RvOnIuZ2V0UHJvdG90eXBlT2YsaXNFbnVtOnt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLGdldERlc2M6ci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Isc2V0RGVzYzpyLmRlZmluZVByb3BlcnR5LHNldERlc2NzOnIuZGVmaW5lUHJvcGVydGllcyxnZXRLZXlzOnIua2V5cyxnZXROYW1lczpyLmdldE93blByb3BlcnR5TmFtZXMsZ2V0U3ltYm9sczpyLmdldE93blByb3BlcnR5U3ltYm9scyxlYWNoOltdLmZvckVhY2h9fSxmdW5jdGlvbih0LG4pe3ZhciByPTAsZT1NYXRoLnJhbmRvbSgpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm5cIlN5bWJvbChcIi5jb25jYXQodm9pZCAwPT09dD9cIlwiOnQsXCIpX1wiLCgrK3IrZSkudG9TdHJpbmcoMzYpKX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDIwKShcIndrc1wiKSxvPXIoMikuU3ltYm9sO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZVt0XXx8KGVbdF09byYmb1t0XXx8KG98fHIoNikpKFwiU3ltYm9sLlwiK3QpKX19LGZ1bmN0aW9uKHQsbixyKXtyKDI2KSx0LmV4cG9ydHM9cigxKS5BcnJheS5zb21lfSxmdW5jdGlvbih0LG4scil7cigyNSksdC5leHBvcnRzPXIoMSkuU3RyaW5nLmVuZHNXaXRofSxmdW5jdGlvbih0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiB0KXRocm93IFR5cGVFcnJvcih0K1wiIGlzIG5vdCBhIGZ1bmN0aW9uIVwiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsbil7dmFyIHI9e30udG9TdHJpbmc7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiByLmNhbGwodCkuc2xpY2UoOCwtMSl9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigxMCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsbixyKXtpZihlKHQpLHZvaWQgMD09PW4pcmV0dXJuIHQ7c3dpdGNoKHIpe2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQuY2FsbChuLHIpfTtjYXNlIDI6cmV0dXJuIGZ1bmN0aW9uKHIsZSl7cmV0dXJuIHQuY2FsbChuLHIsZSl9O2Nhc2UgMzpyZXR1cm4gZnVuY3Rpb24ocixlLG8pe3JldHVybiB0LmNhbGwobixyLGUsbyl9fXJldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KG4sYXJndW1lbnRzKX19fSxmdW5jdGlvbih0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZih2b2lkIDA9PXQpdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiK3QpO3JldHVybiB0fX0sZnVuY3Rpb24odCxuLHIpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgbj0vLi87dHJ5e1wiLy4vXCJbdF0obil9Y2F0Y2goZSl7dHJ5e3JldHVybiBuW3IoNykoXCJtYXRjaFwiKV09ITEsIVwiLy4vXCJbdF0obil9Y2F0Y2gobyl7fX1yZXR1cm4hMH19LGZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4hIXQoKX1jYXRjaChuKXtyZXR1cm4hMH19fSxmdW5jdGlvbih0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm5cIm9iamVjdFwiPT10eXBlb2YgdD9udWxsIT09dDpcImZ1bmN0aW9uXCI9PXR5cGVvZiB0fX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMTYpLG89cigxMSksaT1yKDcpKFwibWF0Y2hcIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBuO3JldHVybiBlKHQpJiYodm9pZCAwIT09KG49dFtpXSk/ISFuOlwiUmVnRXhwXCI9PW8odCkpfX0sZnVuY3Rpb24odCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxuKXtyZXR1cm57ZW51bWVyYWJsZTohKDEmdCksY29uZmlndXJhYmxlOiEoMiZ0KSx3cml0YWJsZTohKDQmdCksdmFsdWU6bn19fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigyKSxvPXIoNCksaT1yKDYpKFwic3JjXCIpLHU9XCJ0b1N0cmluZ1wiLGM9RnVuY3Rpb25bdV0sZj0oXCJcIitjKS5zcGxpdCh1KTtyKDEpLmluc3BlY3RTb3VyY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGMuY2FsbCh0KX0sKHQuZXhwb3J0cz1mdW5jdGlvbih0LG4scix1KXtcImZ1bmN0aW9uXCI9PXR5cGVvZiByJiYobyhyLGksdFtuXT9cIlwiK3Rbbl06Zi5qb2luKFN0cmluZyhuKSkpLFwibmFtZVwiaW4gcnx8KHIubmFtZT1uKSksdD09PWU/dFtuXT1yOih1fHxkZWxldGUgdFtuXSxvKHQsbixyKSl9KShGdW5jdGlvbi5wcm90b3R5cGUsdSxmdW5jdGlvbigpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMmJnRoaXNbaV18fGMuY2FsbCh0aGlzKX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigyKSxvPVwiX19jb3JlLWpzX3NoYXJlZF9fXCIsaT1lW29dfHwoZVtvXT17fSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpW3RdfHwoaVt0XT17fSl9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigxNyksbz1yKDEzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxuLHIpe2lmKGUobikpdGhyb3cgVHlwZUVycm9yKFwiU3RyaW5nI1wiK3IrXCIgZG9lc24ndCBhY2NlcHQgcmVnZXghXCIpO3JldHVybiBTdHJpbmcobyh0KSl9fSxmdW5jdGlvbih0LG4scil7dC5leHBvcnRzPSFyKDE1KShmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sXCJhXCIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KX0sZnVuY3Rpb24odCxuKXt2YXIgcj1NYXRoLmNlaWwsZT1NYXRoLmZsb29yO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaXNOYU4odD0rdCk/MDoodD4wP2U6cikodCl9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigyMyksbz1NYXRoLm1pbjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+MD9vKGUodCksOTAwNzE5OTI1NDc0MDk5MSk6MH19LGZ1bmN0aW9uKHQsbixyKXtcInVzZSBzdHJpY3RcIjt2YXIgZT1yKDMpLG89cigyNCksaT1yKDIxKSx1PVwiZW5kc1dpdGhcIixjPVwiXCJbdV07ZShlLlArZS5GKnIoMTQpKHUpLFwiU3RyaW5nXCIse2VuZHNXaXRoOmZ1bmN0aW9uKHQpe3ZhciBuPWkodGhpcyx0LHUpLHI9YXJndW1lbnRzLGU9ci5sZW5ndGg+MT9yWzFdOnZvaWQgMCxmPW8obi5sZW5ndGgpLHM9dm9pZCAwPT09ZT9mOk1hdGgubWluKG8oZSksZiksYT1TdHJpbmcodCk7cmV0dXJuIGM/Yy5jYWxsKG4sYSxzKTpuLnNsaWNlKHMtYS5sZW5ndGgscyk9PT1hfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cig1KSxvPXIoMyksaT1yKDEpLkFycmF5fHxBcnJheSx1PXt9LGM9ZnVuY3Rpb24odCxuKXtlLmVhY2guY2FsbCh0LnNwbGl0KFwiLFwiKSxmdW5jdGlvbih0KXt2b2lkIDA9PW4mJnQgaW4gaT91W3RdPWlbdF06dCBpbltdJiYodVt0XT1yKDEyKShGdW5jdGlvbi5jYWxsLFtdW3RdLG4pKX0pfTtjKFwicG9wLHJldmVyc2Usc2hpZnQsa2V5cyx2YWx1ZXMsZW50cmllc1wiLDEpLGMoXCJpbmRleE9mLGV2ZXJ5LHNvbWUsZm9yRWFjaCxtYXAsZmlsdGVyLGZpbmQsZmluZEluZGV4LGluY2x1ZGVzXCIsMyksYyhcImpvaW4sc2xpY2UsY29uY2F0LHB1c2gsc3BsaWNlLHVuc2hpZnQsc29ydCxsYXN0SW5kZXhPZixyZWR1Y2UscmVkdWNlUmlnaHQsY29weVdpdGhpbixmaWxsXCIpLG8oby5TLFwiQXJyYXlcIix1KX1dKTtcblxuLyoqKi8gfSxcbi8qIDMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdGV4cG9ydHMuZGVmYXVsdCA9IGdldERhdGFUcmFuc2ZlckZpbGVzO1xuXHRmdW5jdGlvbiBnZXREYXRhVHJhbnNmZXJGaWxlcyhldmVudCkge1xuXHQgIHZhciBpc011bHRpcGxlQWxsb3dlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcblx0XG5cdCAgdmFyIGRhdGFUcmFuc2Zlckl0ZW1zTGlzdCA9IFtdO1xuXHQgIGlmIChldmVudC5kYXRhVHJhbnNmZXIpIHtcblx0ICAgIHZhciBkdCA9IGV2ZW50LmRhdGFUcmFuc2Zlcjtcblx0ICAgIGlmIChkdC5maWxlcyAmJiBkdC5maWxlcy5sZW5ndGgpIHtcblx0ICAgICAgZGF0YVRyYW5zZmVySXRlbXNMaXN0ID0gZHQuZmlsZXM7XG5cdCAgICB9IGVsc2UgaWYgKGR0Lml0ZW1zICYmIGR0Lml0ZW1zLmxlbmd0aCkge1xuXHQgICAgICAvLyBEdXJpbmcgdGhlIGRyYWcgZXZlbiB0aGUgZGF0YVRyYW5zZmVyLmZpbGVzIGlzIG51bGxcblx0ICAgICAgLy8gYnV0IENocm9tZSBpbXBsZW1lbnRzIHNvbWUgZHJhZyBzdG9yZSwgd2hpY2ggaXMgYWNjZXNpYmxlIHZpYSBkYXRhVHJhbnNmZXIuaXRlbXNcblx0ICAgICAgZGF0YVRyYW5zZmVySXRlbXNMaXN0ID0gZHQuaXRlbXM7XG5cdCAgICB9XG5cdCAgfSBlbHNlIGlmIChldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LmZpbGVzKSB7XG5cdCAgICBkYXRhVHJhbnNmZXJJdGVtc0xpc3QgPSBldmVudC50YXJnZXQuZmlsZXM7XG5cdCAgfVxuXHRcblx0ICBpZiAoZGF0YVRyYW5zZmVySXRlbXNMaXN0Lmxlbmd0aCA+IDApIHtcblx0ICAgIGRhdGFUcmFuc2Zlckl0ZW1zTGlzdCA9IGlzTXVsdGlwbGVBbGxvd2VkID8gZGF0YVRyYW5zZmVySXRlbXNMaXN0IDogW2RhdGFUcmFuc2Zlckl0ZW1zTGlzdFswXV07XG5cdCAgfVxuXHRcblx0ICAvLyBDb252ZXJ0IGZyb20gRGF0YVRyYW5zZmVySXRlbXNMaXN0IHRvIHRoZSBuYXRpdmUgQXJyYXlcblx0ICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZGF0YVRyYW5zZmVySXRlbXNMaXN0KTtcblx0fVxuXHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuXG4vKioqLyB9XG4vKioqKioqLyBdKVxufSk7XG47XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhY3QtZHJvcHpvbmUvZGlzdC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTc3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 578 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });\n\nvar _Import = __webpack_require__(579);var _Import2 = _interopRequireDefault(_Import);\nvar _Util = __webpack_require__(410);var _Util2 = _interopRequireDefault(_Util);\nvar _Visualize = __webpack_require__(561);var _Visualize2 = _interopRequireDefault(_Visualize);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}\n\nvar PasteInput = {\n  // thanks to https://github.com/kevva/url-regex\n  // eslint-disable-next-line no-useless-escape\n  URL_REGEX: new RegExp('^(?:(?:(?:[a-z]+:)?//)|www.)(?:S+(?::S*)?@)?(?:localhost|(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|(?:(?:[a-z¡-￿0-9]-*)*[a-z¡-￿0-9]+)(?:.(?:[a-z¡-￿0-9]-*)*[a-z¡-￿0-9]+)*(?:.(?:[a-z¡-￿]{2,})).?)(?::d{2,5})?(?:[/?#][^s\"]*)?$'),\n\n  init: function init() {\n    var self = PasteInput;\n\n    // intercept dragged files\n    // see http://stackoverflow.com/questions/6756583\n    window.addEventListener('dragover', function (e) {\n      e = e || window.event;\n      e.preventDefault();\n    }, false);\n    window.addEventListener('drop', function (e) {\n      e = e || window.event;\n      e.preventDefault();\n      var coords = _Util2.default.pixelsToCoords(_Visualize2.default.mGraph, { x: e.clientX, y: e.clientY });\n      if (e.dataTransfer.files.length > 0) {\n        self.handleFile(e.dataTransfer.files[0], coords);\n      }\n      // OMG import bookmarks 😍\n      if (e.dataTransfer.items && e.dataTransfer.items.length > 0) {\n        e.dataTransfer.items[0].getAsString(function (text) {\n          if (text.match(self.URL_REGEX)) {\n            self.handle(text, coords);\n          }\n        });\n      }\n    }, false);\n\n    // allow pasting onto canvas (but don't break existing inputs/textareas)\n    $('body').bind('paste', function (e) {\n      if (e.target.tagName === 'INPUT') return;\n      if (e.target.tagName === 'TEXTAREA') return;\n\n      var text = e.originalEvent.clipboardData.getData('text/plain').trim();\n      self.handle(text);\n    });\n  },\n\n  handleFile: function handleFile(file) {var coords = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n    var self = PasteInput;\n    var fileReader = new window.FileReader();\n    fileReader.readAsText(file);\n    fileReader.onload = function (e) {\n      var text = e.currentTarget.result;\n      if (text.substring(0, 5) === '<?xml') {\n        // assume this is a macOS .webloc link\n        text = text.replace(/[\\s\\S]*<string>(.*)<\\/string>[\\s\\S]*/m, '$1');\n      }\n      self.handle(text, coords);\n    };\n  },\n\n  handle: function handle(text) {var coords = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var self = PasteInput;\n\n    if (text.match(self.URL_REGEX)) {\n      _Import2.default.handleURL(text, coords);\n    } else if (text[0] === '{') {\n      _Import2.default.handleJSON(text);\n    } else if (text.match(/\\t/)) {\n      _Import2.default.handleTSV(text);\n    } else {\n      // just try to see if CSV works\n      _Import2.default.handleCSV(text);\n    }\n  } }; /* global $ */exports.default =\n\n\nPasteInput;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTc4LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvUGFzdGVJbnB1dC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBnbG9iYWwgJCAqL1xuXG5pbXBvcnQgSW1wb3J0IGZyb20gJy4vSW1wb3J0J1xuaW1wb3J0IFV0aWwgZnJvbSAnLi9VdGlsJ1xuaW1wb3J0IFZpc3VhbGl6ZSBmcm9tICcuL1Zpc3VhbGl6ZSdcblxuY29uc3QgUGFzdGVJbnB1dCA9IHtcbiAgLy8gdGhhbmtzIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9rZXZ2YS91cmwtcmVnZXhcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gIFVSTF9SRUdFWDogbmV3IFJlZ0V4cCgnXig/Oig/Oig/OlthLXpdKzopPy8vKXx3d3dcXC4pKD86XFxTKyg/OjpcXFMqKT9AKT8oPzpsb2NhbGhvc3R8KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKSg/OlxcLig/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSkpezN9fCg/Oig/OlthLXpcXHUwMGExLVxcdWZmZmYwLTldLSopKlthLXpcXHUwMGExLVxcdWZmZmYwLTldKykoPzpcXC4oPzpbYS16XFx1MDBhMS1cXHVmZmZmMC05XS0qKSpbYS16XFx1MDBhMS1cXHVmZmZmMC05XSspKig/OlxcLig/OlthLXpcXHUwMGExLVxcdWZmZmZdezIsfSkpXFwuPykoPzo6XFxkezIsNX0pPyg/OlsvPyNdW15cXHNcIl0qKT8kJyksXG5cbiAgaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSBQYXN0ZUlucHV0XG5cbiAgICAvLyBpbnRlcmNlcHQgZHJhZ2dlZCBmaWxlc1xuICAgIC8vIHNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzY3NTY1ODNcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCBmdW5jdGlvbihlKSB7XG4gICAgICBlID0gZSB8fCB3aW5kb3cuZXZlbnRcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIH0sIGZhbHNlKVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgZnVuY3Rpb24oZSkge1xuICAgICAgZSA9IGUgfHwgd2luZG93LmV2ZW50XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIHZhciBjb29yZHMgPSBVdGlsLnBpeGVsc1RvQ29vcmRzKFZpc3VhbGl6ZS5tR3JhcGgsIHsgeDogZS5jbGllbnRYLCB5OiBlLmNsaWVudFkgfSlcbiAgICAgIGlmIChlLmRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNlbGYuaGFuZGxlRmlsZShlLmRhdGFUcmFuc2Zlci5maWxlc1swXSwgY29vcmRzKVxuICAgICAgfVxuICAgICAgLy8gT01HIGltcG9ydCBib29rbWFya3Mg8J+YjVxuICAgICAgaWYgKGUuZGF0YVRyYW5zZmVyLml0ZW1zICYmIGUuZGF0YVRyYW5zZmVyLml0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZS5kYXRhVHJhbnNmZXIuaXRlbXNbMF0uZ2V0QXNTdHJpbmcoZnVuY3Rpb24odGV4dCkge1xuICAgICAgICAgIGlmICh0ZXh0Lm1hdGNoKHNlbGYuVVJMX1JFR0VYKSkge1xuICAgICAgICAgICAgc2VsZi5oYW5kbGUodGV4dCwgY29vcmRzKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9LCBmYWxzZSlcblxuICAgIC8vIGFsbG93IHBhc3Rpbmcgb250byBjYW52YXMgKGJ1dCBkb24ndCBicmVhayBleGlzdGluZyBpbnB1dHMvdGV4dGFyZWFzKVxuICAgICQoJ2JvZHknKS5iaW5kKCdwYXN0ZScsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIGlmIChlLnRhcmdldC50YWdOYW1lID09PSAnSU5QVVQnKSByZXR1cm5cbiAgICAgIGlmIChlLnRhcmdldC50YWdOYW1lID09PSAnVEVYVEFSRUEnKSByZXR1cm5cblxuICAgICAgdmFyIHRleHQgPSBlLm9yaWdpbmFsRXZlbnQuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L3BsYWluJykudHJpbSgpXG4gICAgICBzZWxmLmhhbmRsZSh0ZXh0KVxuICAgIH0pXG4gIH0sXG5cbiAgaGFuZGxlRmlsZTogKGZpbGUsIGNvb3JkcyA9IG51bGwpID0+IHtcbiAgICB2YXIgc2VsZiA9IFBhc3RlSW5wdXRcbiAgICB2YXIgZmlsZVJlYWRlciA9IG5ldyB3aW5kb3cuRmlsZVJlYWRlcigpXG4gICAgZmlsZVJlYWRlci5yZWFkQXNUZXh0KGZpbGUpXG4gICAgZmlsZVJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbihlKSB7XG4gICAgICB2YXIgdGV4dCA9IGUuY3VycmVudFRhcmdldC5yZXN1bHRcbiAgICAgIGlmICh0ZXh0LnN1YnN0cmluZygwLCA1KSA9PT0gJzw/eG1sJykge1xuICAgICAgICAvLyBhc3N1bWUgdGhpcyBpcyBhIG1hY09TIC53ZWJsb2MgbGlua1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9bXFxzXFxTXSo8c3RyaW5nPiguKik8XFwvc3RyaW5nPltcXHNcXFNdKi9tLCAnJDEnKVxuICAgICAgfVxuICAgICAgc2VsZi5oYW5kbGUodGV4dCwgY29vcmRzKVxuICAgIH1cbiAgfSxcblxuICBoYW5kbGU6IGZ1bmN0aW9uKHRleHQsIGNvb3JkcyA9IHt9KSB7XG4gICAgdmFyIHNlbGYgPSBQYXN0ZUlucHV0XG5cbiAgICBpZiAodGV4dC5tYXRjaChzZWxmLlVSTF9SRUdFWCkpIHtcbiAgICAgIEltcG9ydC5oYW5kbGVVUkwodGV4dCwgY29vcmRzKVxuICAgIH0gZWxzZSBpZiAodGV4dFswXSA9PT0gJ3snKSB7XG4gICAgICBJbXBvcnQuaGFuZGxlSlNPTih0ZXh0KVxuICAgIH0gZWxzZSBpZiAodGV4dC5tYXRjaCgvXFx0LykpIHtcbiAgICAgIEltcG9ydC5oYW5kbGVUU1YodGV4dClcbiAgICB9IGVsc2Uge1xuICAgICAgLy8ganVzdCB0cnkgdG8gc2VlIGlmIENTViB3b3Jrc1xuICAgICAgSW1wb3J0LmhhbmRsZUNTVih0ZXh0KVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQYXN0ZUlucHV0XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL01ldGFtYXBzL1Bhc3RlSW5wdXQuanMiXSwibWFwcGluZ3MiOiI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 579 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _transform2 = __webpack_require__(580);var _transform3 = _interopRequireDefault(_transform2);\n\nvar _csvParse = __webpack_require__(581);var _csvParse2 = _interopRequireDefault(_csvParse);\n\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _AutoLayout = __webpack_require__(8);var _AutoLayout2 = _interopRequireDefault(_AutoLayout);\nvar _DataModel = __webpack_require__(149);var _DataModel2 = _interopRequireDefault(_DataModel);\nvar _GlobalUI = __webpack_require__(362);var _GlobalUI2 = _interopRequireDefault(_GlobalUI);\nvar _Map = __webpack_require__(369);var _Map2 = _interopRequireDefault(_Map);\nvar _Synapse = __webpack_require__(354);var _Synapse2 = _interopRequireDefault(_Synapse);\nvar _Topic = __webpack_require__(571);var _Topic2 = _interopRequireDefault(_Topic);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} /* global $ */\n\nvar Import = {\n  // note that user is not imported\n  topicWhitelist: [\n  'id', 'name', 'metacode', 'x', 'y', 'description', 'link', 'permission'],\n\n  synapseWhitelist: [\n  'topic1', 'topic2', 'category', 'direction', 'desc', 'description', 'permission'],\n\n  cidMappings: {}, // to be filled by importId => cid mappings\n\n  handleTSV: function handleTSV(text) {\n    var results = Import.parseTabbedString(text);\n    Import.handle(results);\n  },\n\n  handleCSV: function handleCSV(text) {var parserOpts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var self = Import;\n\n    var topicsRegex = /(\"?Topics\"?)([\\s\\S]*)/mi;\n    var synapsesRegex = /(\"?Synapses\"?)([\\s\\S]*)/mi;\n    var topicsText = text.match(topicsRegex) || '';\n    if (topicsText) topicsText = topicsText[2].replace(synapsesRegex, '');\n    var synapsesText = text.match(synapsesRegex) || '';\n    if (synapsesText) synapsesText = synapsesText[2].replace(topicsRegex, '');\n\n    // merge default options and extra options passed in parserOpts argument\n    var csvParserOptions = Object.assign({\n      columns: true, // get headers\n      relax_column_count: true,\n      skip_empty_lines: true },\n    parserOpts);\n\n    var topicsPromise = $.Deferred();\n    (0, _csvParse2.default)(topicsText, csvParserOptions, function (err, data) {\n      if (err) {\n        console.warn(err);\n        return topicsPromise.resolve([]);\n      }\n      topicsPromise.resolve(data);\n    });\n\n    var synapsesPromise = $.Deferred();\n    (0, _csvParse2.default)(synapsesText, csvParserOptions, function (err, data) {\n      if (err) {\n        console.warn(err);\n        return synapsesPromise.resolve([]);\n      }\n      synapsesPromise.resolve(data);\n    });\n\n    $.when(topicsPromise, synapsesPromise).done(function (topics, synapses) {\n      self.handle({ topics: topics, synapses: synapses });\n    });\n  },\n\n  handleJSON: function handleJSON(text) {\n    var results = JSON.parse(text);\n    Import.handle(results);\n  },\n\n  handle: function handle(results) {\n    var self = Import;\n    var topics = results.topics.map(function (topic) {return self.normalizeKeys(topic);});\n    var synapses = results.synapses.map(function (synapse) {return self.normalizeKeys(synapse);});\n\n    if (topics.length > 0 || synapses.length > 0) {\n      if (window.confirm('Are you sure you want to create ' + topics.length +\n      ' new topics and ' + synapses.length + ' new synapses?')) {\n        self.importTopics(topics);\n        // window.setTimeout(() => self.importSynapses(synapses), 5000)\n        self.importSynapses(synapses);\n      } // if\n    } // if\n  },\n\n  parseTabbedString: function parseTabbedString(text) {\n    var self = Import;\n\n    // determine line ending and split lines\n    var delim = '\\n';\n    if (text.indexOf('\\r\\n') !== -1) {\n      delim = '\\r\\n';\n    } else if (text.indexOf('\\r') !== -1) {\n      delim = '\\r';\n    } // if\n\n    var STATES = {\n      ABORT: -1,\n      UNKNOWN: 0,\n      TOPICS_NEED_HEADERS: 1,\n      SYNAPSES_NEED_HEADERS: 2,\n      TOPICS: 3,\n      SYNAPSES: 4 };\n\n\n    // state & lines determine parser behaviour\n    var state = STATES.UNKNOWN;\n    var lines = text.split(delim);\n    var results = { topics: [], synapses: [] };\n    var topicHeaders = [];\n    var synapseHeaders = [];\n\n    lines.forEach(function (lineRaw, index) {\n      var line = lineRaw.split('\\t');\n      var noblanks = line.filter(function (elt) {\n        return elt !== '';\n      });\n      switch (state) {\n        case STATES.UNKNOWN:\n          if (noblanks.length === 0) {\n            state = STATES.UNKNOWN;\n            break;\n          } else if (noblanks.length === 1 && self.simplify(line[0]) === 'topics') {\n            state = STATES.TOPICS_NEED_HEADERS;\n            break;\n          } else if (noblanks.length === 1 && self.simplify(line[0]) === 'synapses') {\n            state = STATES.SYNAPSES_NEED_HEADERS;\n            break;\n          }\n          state = STATES.TOPICS_NEED_HEADERS;\n        // FALL THROUGH - if we're not sure what to do, pretend\n        // we're on the TOPICS_NEED_HEADERS state and parse some headers\n\n        case STATES.TOPICS_NEED_HEADERS: // eslint-disable-line no-fallthrough\n          if (noblanks.length < 2) {\n            self.abort('Not enough topic headers on line ' + index);\n            state = STATES.ABORT;\n          }\n          topicHeaders = line.map(function (header, index) {\n            return self.normalizeKey(header);\n          });\n          state = STATES.TOPICS;\n          break;\n\n        case STATES.SYNAPSES_NEED_HEADERS:\n          if (noblanks.length < 2) {\n            self.abort('Not enough synapse headers on line ' + index);\n            state = STATES.ABORT;\n          }\n          synapseHeaders = line.map(function (header, index) {\n            return self.normalizeKey(header);\n          });\n          state = STATES.SYNAPSES;\n          break;\n\n        case STATES.TOPICS:\n          if (noblanks.length === 0) {\n            state = STATES.UNKNOWN;\n          } else if (noblanks.length === 1 && line[0].toLowerCase() === 'topics') {\n            state = STATES.TOPICS_NEED_HEADERS;\n          } else if (noblanks.length === 1 && line[0].toLowerCase() === 'synapses') {\n            state = STATES.SYNAPSES_NEED_HEADERS;\n          } else {\n            var topic = {};\n            line.forEach(function (field, index) {\n              var header = topicHeaders[index];\n              if (self.topicWhitelist.indexOf(header) === -1) return;\n              topic[header] = field;\n              if (['id', 'x', 'y'].indexOf(header) !== -1) {\n                topic[header] = parseInt(topic[header]);\n              } // if\n            });\n            results.topics.push(topic);\n          }\n          break;\n\n        case STATES.SYNAPSES:\n          if (noblanks.length === 0) {\n            state = STATES.UNKNOWN;\n          } else if (noblanks.length === 1 && line[0].toLowerCase() === 'topics') {\n            state = STATES.TOPICS_NEED_HEADERS;\n          } else if (noblanks.length === 1 && line[0].toLowerCase() === 'synapses') {\n            state = STATES.SYNAPSES_NEED_HEADERS;\n          } else {\n            var synapse = {};\n            line.forEach(function (field, index) {\n              var header = synapseHeaders[index];\n              if (self.synapseWhitelist.indexOf(header) === -1) return;\n              synapse[header] = field;\n              if (['id', 'topic1', 'topic2'].indexOf(header) !== -1) {\n                synapse[header] = parseInt(synapse[header]);\n              } // if\n            });\n            results.synapses.push(synapse);\n          }\n          break;\n        case STATES.ABORT:\n        // FALL THROUGH\n        default: // eslint-disable-line no-fallthrough\n          self.abort('Invalid state while parsing import data. Check code.');\n          state = STATES.ABORT;}\n\n    });\n\n    if (state === STATES.ABORT) {\n      return false;\n    } else {\n      return results;\n    }\n  },\n\n  importTopics: function importTopics(parsedTopics) {\n    var self = Import;\n\n    parsedTopics.forEach(function (topic) {\n      var coords = { x: topic.x, y: topic.y };\n      if (!coords.x || !coords.y) {\n        coords = _AutoLayout2.default.getNextCoord({ mappings: _DataModel2.default.Mappings });\n      }\n\n      if (!topic.name && topic.link ||\n      topic.name && topic.link && !topic.metacode) {\n        self.handleURL(topic.link, {\n          coords: coords,\n          name: topic.name,\n          permission: topic.permission,\n          importId: topic.id });\n\n        return; // \"continue\"\n      }\n\n      self.createTopicWithParameters(\n      topic.name, topic.metacode, topic.permission,\n      topic.desc, topic.link, coords.x, coords.y, topic.id);\n\n    });\n  },\n\n  importSynapses: function importSynapses(parsedSynapses) {\n    var self = Import;\n\n    parsedSynapses.forEach(function (synapse) {\n      // only createSynapseWithParameters once both topics are persisted\n      // if there isn't a cidMapping, check by topic name instead\n      var topic1 = _DataModel2.default.Topics.get(self.cidMappings[synapse.topic1]);\n      if (!topic1) topic1 = _DataModel2.default.Topics.findWhere({ name: synapse.topic1 });\n      var topic2 = _DataModel2.default.Topics.get(self.cidMappings[synapse.topic2]);\n      if (!topic2) topic2 = _DataModel2.default.Topics.findWhere({ name: synapse.topic2 });\n\n      if (!topic1 || !topic2) {\n        console.error(\"One of the two topics doesn't exist!\");\n        console.error(synapse);\n        return; // next\n      }\n\n      var topic1Promise = $.Deferred();\n      if (topic1.id) {\n        topic1Promise.resolve();\n      } else {\n        topic1.on('sync', function () {return topic1Promise.resolve();});\n      }\n      var topic2Promise = $.Deferred();\n      if (topic2.id) {\n        topic2Promise.resolve();\n      } else {\n        topic2.on('sync', function () {return topic2Promise.resolve();});\n      }\n      $.when(topic1Promise, topic2Promise).done(function () {\n        self.createSynapseWithParameters(\n        synapse.desc, synapse.category, synapse.permission,\n        topic1, topic2);\n\n      });\n    });\n  },\n\n  createTopicWithParameters: function createTopicWithParameters(name, metacodeName, permission, desc,\n  link, xloc, yloc, importId) {var opts = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : {};\n    var self = Import;\n    $(document).trigger(_Map2.default.events.editedByActiveMapper);\n    var metacode = _DataModel2.default.Metacodes.where({ name: metacodeName })[0] || null;\n    if (metacode === null) {\n      metacode = _DataModel2.default.Metacodes.where({ name: 'Wildcard' })[0];\n      console.warn(\"Couldn't find metacode \" + metacodeName + ' so used Wildcard instead.');\n    }\n\n    var topicPermision = permission || _Active2.default.Map.get('permission');\n    var deferToMapId = permission === topicPermision ? _Active2.default.Map.get('id') : null;\n    var topic = new _DataModel2.default.Topic({\n      name: name,\n      metacode_id: metacode.id,\n      permission: topicPermision,\n      defer_to_map_id: deferToMapId,\n      desc: desc || '',\n      link: link || '' });\n\n    _DataModel2.default.Topics.add(topic);\n\n    if (importId !== null && importId !== undefined) {\n      self.cidMappings[importId] = topic.cid;\n    }\n\n    var mapping = new _DataModel2.default.Mapping({\n      xloc: xloc,\n      yloc: yloc,\n      mappable_id: topic.cid,\n      mappable_type: 'Topic' });\n\n    _DataModel2.default.Mappings.add(mapping);\n\n    // this function also includes the creation of the topic in the database\n    _Topic2.default.renderTopic(mapping, topic, true, true, {\n      success: opts.success });\n\n\n    _GlobalUI2.default.hideDiv('#instructions');\n  },\n\n  createSynapseWithParameters: function createSynapseWithParameters(desc, category, permission,\n  topic1, topic2) {\n    var node1 = topic1.get('node');\n    var node2 = topic2.get('node');\n\n    if (!topic1.id || !topic2.id) {\n      console.error('missing topic id when creating synapse');\n      return;\n    } // if\n\n    var synapse = new _DataModel2.default.Synapse({\n      desc: desc || '',\n      category: category || 'from-to',\n      permission: permission,\n      topic1_id: topic1.id,\n      topic2_id: topic2.id });\n\n    _DataModel2.default.Synapses.add(synapse);\n\n    var mapping = new _DataModel2.default.Mapping({\n      mappable_type: 'Synapse',\n      mappable_id: synapse.cid });\n\n    _DataModel2.default.Mappings.add(mapping);\n\n    _Synapse2.default.renderSynapse(mapping, synapse, node1, node2, true);\n  },\n\n  handleURL: function handleURL(url) {var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var coords = opts.coords;\n    if (!coords || coords.x === undefined || coords.y === undefined) {\n      coords = _AutoLayout2.default.getNextCoord({ mappings: _DataModel2.default.Mappings });\n    }\n\n    var name = opts.name || 'Link';\n    var metacode = opts.metacode || 'Reference';\n    var importId = opts.importId || null; // don't store a cidMapping\n    var permission = opts.permission || null; // use default\n    var desc = opts.desc || url;\n\n    Import.createTopicWithParameters(\n    name,\n    metacode,\n    permission,\n    desc,\n    url,\n    coords.x,\n    coords.y,\n    importId,\n    {\n      success: function success(topic) {\n        if (topic.get('name') !== 'Link') return;\n        $.get('/hacks/load_url_title', {\n          url: url },\n        function success(data, textStatus) {\n          if (typeof data === 'string' && data.trim() === '') return;\n          var selector = '#showcard #topic_' + topic.get('id') + ' .best_in_place';\n          if ($(selector).find('form').length > 0) {\n            $(selector).find('textarea, input').val(data.title);\n          } else {\n            $(selector).html(data.title);\n          }\n          topic.set('name', data.title);\n          topic.save();\n        });\n      } });\n\n\n  },\n\n  /*\n      * helper functions\n      */\n\n  abort: function abort(message) {\n    console.error(message);\n  },\n\n  // TODO investigate replacing with es6 (?) trim()\n  simplify: function simplify(string) {\n    return string.\n    replace(/(^\\s*|\\s*$)/g, '').\n    toLowerCase();\n  },\n\n  normalizeKey: function normalizeKey(key) {\n    var newKey = key.toLowerCase();\n    newKey = newKey.replace(/\\s/g, ''); // remove whitespace\n    if (newKey === 'url') newKey = 'link';\n    if (newKey === 'title') newKey = 'name';\n    if (newKey === 'label') newKey = 'desc';\n    if (newKey === 'description') newKey = 'desc';\n    if (newKey === 'direction') newKey = 'category';\n    return newKey;\n  },\n\n  // thanks to http://stackoverflow.com/a/25290114/5332286\n  normalizeKeys: function normalizeKeys(obj) {\n    return (0, _transform3.default)(obj, function (result, val, key) {\n      var newKey = Import.normalizeKey(key);\n      result[newKey] = val;\n    });\n  } };exports.default =\n\n\nImport;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTc5LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvSW1wb3J0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGdsb2JhbCAkICovXG5cbmltcG9ydCBwYXJzZSBmcm9tICdjc3YtcGFyc2UnXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnXG5cbmltcG9ydCBBY3RpdmUgZnJvbSAnLi9BY3RpdmUnXG5pbXBvcnQgQXV0b0xheW91dCBmcm9tICcuL0F1dG9MYXlvdXQnXG5pbXBvcnQgRGF0YU1vZGVsIGZyb20gJy4vRGF0YU1vZGVsJ1xuaW1wb3J0IEdsb2JhbFVJIGZyb20gJy4vR2xvYmFsVUknXG5pbXBvcnQgTWFwIGZyb20gJy4vTWFwJ1xuaW1wb3J0IFN5bmFwc2UgZnJvbSAnLi9TeW5hcHNlJ1xuaW1wb3J0IFRvcGljIGZyb20gJy4vVG9waWMnXG5cbmNvbnN0IEltcG9ydCA9IHtcbiAgLy8gbm90ZSB0aGF0IHVzZXIgaXMgbm90IGltcG9ydGVkXG4gIHRvcGljV2hpdGVsaXN0OiBbXG4gICAgJ2lkJywgJ25hbWUnLCAnbWV0YWNvZGUnLCAneCcsICd5JywgJ2Rlc2NyaXB0aW9uJywgJ2xpbmsnLCAncGVybWlzc2lvbidcbiAgXSxcbiAgc3luYXBzZVdoaXRlbGlzdDogW1xuICAgICd0b3BpYzEnLCAndG9waWMyJywgJ2NhdGVnb3J5JywgJ2RpcmVjdGlvbicsICdkZXNjJywgJ2Rlc2NyaXB0aW9uJywgJ3Blcm1pc3Npb24nXG4gIF0sXG4gIGNpZE1hcHBpbmdzOiB7fSwgLy8gdG8gYmUgZmlsbGVkIGJ5IGltcG9ydElkID0+IGNpZCBtYXBwaW5nc1xuXG4gIGhhbmRsZVRTVjogZnVuY3Rpb24odGV4dCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBJbXBvcnQucGFyc2VUYWJiZWRTdHJpbmcodGV4dClcbiAgICBJbXBvcnQuaGFuZGxlKHJlc3VsdHMpXG4gIH0sXG5cbiAgaGFuZGxlQ1NWOiBmdW5jdGlvbih0ZXh0LCBwYXJzZXJPcHRzID0ge30pIHtcbiAgICBjb25zdCBzZWxmID0gSW1wb3J0XG5cbiAgICBjb25zdCB0b3BpY3NSZWdleCA9IC8oXCI/VG9waWNzXCI/KShbXFxzXFxTXSopL21pXG4gICAgY29uc3Qgc3luYXBzZXNSZWdleCA9IC8oXCI/U3luYXBzZXNcIj8pKFtcXHNcXFNdKikvbWlcbiAgICBsZXQgdG9waWNzVGV4dCA9IHRleHQubWF0Y2godG9waWNzUmVnZXgpIHx8ICcnXG4gICAgaWYgKHRvcGljc1RleHQpIHRvcGljc1RleHQgPSB0b3BpY3NUZXh0WzJdLnJlcGxhY2Uoc3luYXBzZXNSZWdleCwgJycpXG4gICAgbGV0IHN5bmFwc2VzVGV4dCA9IHRleHQubWF0Y2goc3luYXBzZXNSZWdleCkgfHwgJydcbiAgICBpZiAoc3luYXBzZXNUZXh0KSBzeW5hcHNlc1RleHQgPSBzeW5hcHNlc1RleHRbMl0ucmVwbGFjZSh0b3BpY3NSZWdleCwgJycpXG5cbiAgICAvLyBtZXJnZSBkZWZhdWx0IG9wdGlvbnMgYW5kIGV4dHJhIG9wdGlvbnMgcGFzc2VkIGluIHBhcnNlck9wdHMgYXJndW1lbnRcbiAgICBjb25zdCBjc3ZQYXJzZXJPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBjb2x1bW5zOiB0cnVlLCAvLyBnZXQgaGVhZGVyc1xuICAgICAgcmVsYXhfY29sdW1uX2NvdW50OiB0cnVlLFxuICAgICAgc2tpcF9lbXB0eV9saW5lczogdHJ1ZVxuICAgIH0sIHBhcnNlck9wdHMpXG5cbiAgICBjb25zdCB0b3BpY3NQcm9taXNlID0gJC5EZWZlcnJlZCgpXG4gICAgcGFyc2UodG9waWNzVGV4dCwgY3N2UGFyc2VyT3B0aW9ucywgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oZXJyKVxuICAgICAgICByZXR1cm4gdG9waWNzUHJvbWlzZS5yZXNvbHZlKFtdKVxuICAgICAgfVxuICAgICAgdG9waWNzUHJvbWlzZS5yZXNvbHZlKGRhdGEpXG4gICAgfSlcblxuICAgIGNvbnN0IHN5bmFwc2VzUHJvbWlzZSA9ICQuRGVmZXJyZWQoKVxuICAgIHBhcnNlKHN5bmFwc2VzVGV4dCwgY3N2UGFyc2VyT3B0aW9ucywgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oZXJyKVxuICAgICAgICByZXR1cm4gc3luYXBzZXNQcm9taXNlLnJlc29sdmUoW10pXG4gICAgICB9XG4gICAgICBzeW5hcHNlc1Byb21pc2UucmVzb2x2ZShkYXRhKVxuICAgIH0pXG5cbiAgICAkLndoZW4odG9waWNzUHJvbWlzZSwgc3luYXBzZXNQcm9taXNlKS5kb25lKCh0b3BpY3MsIHN5bmFwc2VzKSA9PiB7XG4gICAgICBzZWxmLmhhbmRsZSh7IHRvcGljcywgc3luYXBzZXMgfSlcbiAgICB9KVxuICB9LFxuXG4gIGhhbmRsZUpTT046IGZ1bmN0aW9uKHRleHQpIHtcbiAgICBjb25zdCByZXN1bHRzID0gSlNPTi5wYXJzZSh0ZXh0KVxuICAgIEltcG9ydC5oYW5kbGUocmVzdWx0cylcbiAgfSxcblxuICBoYW5kbGU6IGZ1bmN0aW9uKHJlc3VsdHMpIHtcbiAgICB2YXIgc2VsZiA9IEltcG9ydFxuICAgIHZhciB0b3BpY3MgPSByZXN1bHRzLnRvcGljcy5tYXAodG9waWMgPT4gc2VsZi5ub3JtYWxpemVLZXlzKHRvcGljKSlcbiAgICB2YXIgc3luYXBzZXMgPSByZXN1bHRzLnN5bmFwc2VzLm1hcChzeW5hcHNlID0+IHNlbGYubm9ybWFsaXplS2V5cyhzeW5hcHNlKSlcblxuICAgIGlmICh0b3BpY3MubGVuZ3RoID4gMCB8fCBzeW5hcHNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAod2luZG93LmNvbmZpcm0oJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjcmVhdGUgJyArIHRvcGljcy5sZW5ndGggK1xuICAgICAgICAgICcgbmV3IHRvcGljcyBhbmQgJyArIHN5bmFwc2VzLmxlbmd0aCArICcgbmV3IHN5bmFwc2VzPycpKSB7XG4gICAgICAgIHNlbGYuaW1wb3J0VG9waWNzKHRvcGljcylcbiAgICAgICAgLy8gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gc2VsZi5pbXBvcnRTeW5hcHNlcyhzeW5hcHNlcyksIDUwMDApXG4gICAgICAgIHNlbGYuaW1wb3J0U3luYXBzZXMoc3luYXBzZXMpXG4gICAgICB9IC8vIGlmXG4gICAgfSAvLyBpZlxuICB9LFxuXG4gIHBhcnNlVGFiYmVkU3RyaW5nOiBmdW5jdGlvbih0ZXh0KSB7XG4gICAgdmFyIHNlbGYgPSBJbXBvcnRcblxuICAgIC8vIGRldGVybWluZSBsaW5lIGVuZGluZyBhbmQgc3BsaXQgbGluZXNcbiAgICB2YXIgZGVsaW0gPSAnXFxuJ1xuICAgIGlmICh0ZXh0LmluZGV4T2YoJ1xcclxcbicpICE9PSAtMSkge1xuICAgICAgZGVsaW0gPSAnXFxyXFxuJ1xuICAgIH0gZWxzZSBpZiAodGV4dC5pbmRleE9mKCdcXHInKSAhPT0gLTEpIHtcbiAgICAgIGRlbGltID0gJ1xccidcbiAgICB9IC8vIGlmXG5cbiAgICB2YXIgU1RBVEVTID0ge1xuICAgICAgQUJPUlQ6IC0xLFxuICAgICAgVU5LTk9XTjogMCxcbiAgICAgIFRPUElDU19ORUVEX0hFQURFUlM6IDEsXG4gICAgICBTWU5BUFNFU19ORUVEX0hFQURFUlM6IDIsXG4gICAgICBUT1BJQ1M6IDMsXG4gICAgICBTWU5BUFNFUzogNFxuICAgIH1cblxuICAgIC8vIHN0YXRlICYgbGluZXMgZGV0ZXJtaW5lIHBhcnNlciBiZWhhdmlvdXJcbiAgICB2YXIgc3RhdGUgPSBTVEFURVMuVU5LTk9XTlxuICAgIHZhciBsaW5lcyA9IHRleHQuc3BsaXQoZGVsaW0pXG4gICAgdmFyIHJlc3VsdHMgPSB7IHRvcGljczogW10sIHN5bmFwc2VzOiBbXSB9XG4gICAgdmFyIHRvcGljSGVhZGVycyA9IFtdXG4gICAgdmFyIHN5bmFwc2VIZWFkZXJzID0gW11cblxuICAgIGxpbmVzLmZvckVhY2goZnVuY3Rpb24obGluZVJhdywgaW5kZXgpIHtcbiAgICAgIGNvbnN0IGxpbmUgPSBsaW5lUmF3LnNwbGl0KCdcXHQnKVxuICAgICAgdmFyIG5vYmxhbmtzID0gbGluZS5maWx0ZXIoZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgIHJldHVybiBlbHQgIT09ICcnXG4gICAgICB9KVxuICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICBjYXNlIFNUQVRFUy5VTktOT1dOOlxuICAgICAgICAgIGlmIChub2JsYW5rcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHN0YXRlID0gU1RBVEVTLlVOS05PV05cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfSBlbHNlIGlmIChub2JsYW5rcy5sZW5ndGggPT09IDEgJiYgc2VsZi5zaW1wbGlmeShsaW5lWzBdKSA9PT0gJ3RvcGljcycpIHtcbiAgICAgICAgICAgIHN0YXRlID0gU1RBVEVTLlRPUElDU19ORUVEX0hFQURFUlNcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfSBlbHNlIGlmIChub2JsYW5rcy5sZW5ndGggPT09IDEgJiYgc2VsZi5zaW1wbGlmeShsaW5lWzBdKSA9PT0gJ3N5bmFwc2VzJykge1xuICAgICAgICAgICAgc3RhdGUgPSBTVEFURVMuU1lOQVBTRVNfTkVFRF9IRUFERVJTXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGF0ZSA9IFNUQVRFUy5UT1BJQ1NfTkVFRF9IRUFERVJTXG4gICAgICAgICAgLy8gRkFMTCBUSFJPVUdIIC0gaWYgd2UncmUgbm90IHN1cmUgd2hhdCB0byBkbywgcHJldGVuZFxuICAgICAgICAgIC8vIHdlJ3JlIG9uIHRoZSBUT1BJQ1NfTkVFRF9IRUFERVJTIHN0YXRlIGFuZCBwYXJzZSBzb21lIGhlYWRlcnNcblxuICAgICAgICBjYXNlIFNUQVRFUy5UT1BJQ1NfTkVFRF9IRUFERVJTOiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgICAgICAgaWYgKG5vYmxhbmtzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHNlbGYuYWJvcnQoJ05vdCBlbm91Z2ggdG9waWMgaGVhZGVycyBvbiBsaW5lICcgKyBpbmRleClcbiAgICAgICAgICAgIHN0YXRlID0gU1RBVEVTLkFCT1JUXG4gICAgICAgICAgfVxuICAgICAgICAgIHRvcGljSGVhZGVycyA9IGxpbmUubWFwKGZ1bmN0aW9uKGhlYWRlciwgaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLm5vcm1hbGl6ZUtleShoZWFkZXIpXG4gICAgICAgICAgfSlcbiAgICAgICAgICBzdGF0ZSA9IFNUQVRFUy5UT1BJQ1NcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgU1RBVEVTLlNZTkFQU0VTX05FRURfSEVBREVSUzpcbiAgICAgICAgICBpZiAobm9ibGFua3MubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgc2VsZi5hYm9ydCgnTm90IGVub3VnaCBzeW5hcHNlIGhlYWRlcnMgb24gbGluZSAnICsgaW5kZXgpXG4gICAgICAgICAgICBzdGF0ZSA9IFNUQVRFUy5BQk9SVFxuICAgICAgICAgIH1cbiAgICAgICAgICBzeW5hcHNlSGVhZGVycyA9IGxpbmUubWFwKGZ1bmN0aW9uKGhlYWRlciwgaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLm5vcm1hbGl6ZUtleShoZWFkZXIpXG4gICAgICAgICAgfSlcbiAgICAgICAgICBzdGF0ZSA9IFNUQVRFUy5TWU5BUFNFU1xuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBTVEFURVMuVE9QSUNTOlxuICAgICAgICAgIGlmIChub2JsYW5rcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHN0YXRlID0gU1RBVEVTLlVOS05PV05cbiAgICAgICAgICB9IGVsc2UgaWYgKG5vYmxhbmtzLmxlbmd0aCA9PT0gMSAmJiBsaW5lWzBdLnRvTG93ZXJDYXNlKCkgPT09ICd0b3BpY3MnKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IFNUQVRFUy5UT1BJQ1NfTkVFRF9IRUFERVJTXG4gICAgICAgICAgfSBlbHNlIGlmIChub2JsYW5rcy5sZW5ndGggPT09IDEgJiYgbGluZVswXS50b0xvd2VyQ2FzZSgpID09PSAnc3luYXBzZXMnKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IFNUQVRFUy5TWU5BUFNFU19ORUVEX0hFQURFUlNcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHRvcGljID0ge31cbiAgICAgICAgICAgIGxpbmUuZm9yRWFjaChmdW5jdGlvbihmaWVsZCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgdmFyIGhlYWRlciA9IHRvcGljSGVhZGVyc1tpbmRleF1cbiAgICAgICAgICAgICAgaWYgKHNlbGYudG9waWNXaGl0ZWxpc3QuaW5kZXhPZihoZWFkZXIpID09PSAtMSkgcmV0dXJuXG4gICAgICAgICAgICAgIHRvcGljW2hlYWRlcl0gPSBmaWVsZFxuICAgICAgICAgICAgICBpZiAoWydpZCcsICd4JywgJ3knXS5pbmRleE9mKGhlYWRlcikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdG9waWNbaGVhZGVyXSA9IHBhcnNlSW50KHRvcGljW2hlYWRlcl0pXG4gICAgICAgICAgICAgIH0gLy8gaWZcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXN1bHRzLnRvcGljcy5wdXNoKHRvcGljKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgU1RBVEVTLlNZTkFQU0VTOlxuICAgICAgICAgIGlmIChub2JsYW5rcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHN0YXRlID0gU1RBVEVTLlVOS05PV05cbiAgICAgICAgICB9IGVsc2UgaWYgKG5vYmxhbmtzLmxlbmd0aCA9PT0gMSAmJiBsaW5lWzBdLnRvTG93ZXJDYXNlKCkgPT09ICd0b3BpY3MnKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IFNUQVRFUy5UT1BJQ1NfTkVFRF9IRUFERVJTXG4gICAgICAgICAgfSBlbHNlIGlmIChub2JsYW5rcy5sZW5ndGggPT09IDEgJiYgbGluZVswXS50b0xvd2VyQ2FzZSgpID09PSAnc3luYXBzZXMnKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IFNUQVRFUy5TWU5BUFNFU19ORUVEX0hFQURFUlNcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHN5bmFwc2UgPSB7fVxuICAgICAgICAgICAgbGluZS5mb3JFYWNoKGZ1bmN0aW9uKGZpZWxkLCBpbmRleCkge1xuICAgICAgICAgICAgICB2YXIgaGVhZGVyID0gc3luYXBzZUhlYWRlcnNbaW5kZXhdXG4gICAgICAgICAgICAgIGlmIChzZWxmLnN5bmFwc2VXaGl0ZWxpc3QuaW5kZXhPZihoZWFkZXIpID09PSAtMSkgcmV0dXJuXG4gICAgICAgICAgICAgIHN5bmFwc2VbaGVhZGVyXSA9IGZpZWxkXG4gICAgICAgICAgICAgIGlmIChbJ2lkJywgJ3RvcGljMScsICd0b3BpYzInXS5pbmRleE9mKGhlYWRlcikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgc3luYXBzZVtoZWFkZXJdID0gcGFyc2VJbnQoc3luYXBzZVtoZWFkZXJdKVxuICAgICAgICAgICAgICB9IC8vIGlmXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmVzdWx0cy5zeW5hcHNlcy5wdXNoKHN5bmFwc2UpXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgU1RBVEVTLkFCT1JUOlxuICAgICAgICAgIC8vIEZBTEwgVEhST1VHSFxuICAgICAgICBkZWZhdWx0OiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgICAgICAgc2VsZi5hYm9ydCgnSW52YWxpZCBzdGF0ZSB3aGlsZSBwYXJzaW5nIGltcG9ydCBkYXRhLiBDaGVjayBjb2RlLicpXG4gICAgICAgICAgc3RhdGUgPSBTVEFURVMuQUJPUlRcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKHN0YXRlID09PSBTVEFURVMuQUJPUlQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzdWx0c1xuICAgIH1cbiAgfSxcblxuICBpbXBvcnRUb3BpY3M6IGZ1bmN0aW9uKHBhcnNlZFRvcGljcykge1xuICAgIHZhciBzZWxmID0gSW1wb3J0XG5cbiAgICBwYXJzZWRUb3BpY3MuZm9yRWFjaCh0b3BpYyA9PiB7XG4gICAgICBsZXQgY29vcmRzID0geyB4OiB0b3BpYy54LCB5OiB0b3BpYy55IH1cbiAgICAgIGlmICghY29vcmRzLnggfHwgIWNvb3Jkcy55KSB7XG4gICAgICAgIGNvb3JkcyA9IEF1dG9MYXlvdXQuZ2V0TmV4dENvb3JkKHsgbWFwcGluZ3M6IERhdGFNb2RlbC5NYXBwaW5ncyB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoIXRvcGljLm5hbWUgJiYgdG9waWMubGluayB8fFxuICAgICAgICAgIHRvcGljLm5hbWUgJiYgdG9waWMubGluayAmJiAhdG9waWMubWV0YWNvZGUpIHtcbiAgICAgICAgc2VsZi5oYW5kbGVVUkwodG9waWMubGluaywge1xuICAgICAgICAgIGNvb3JkcyxcbiAgICAgICAgICBuYW1lOiB0b3BpYy5uYW1lLFxuICAgICAgICAgIHBlcm1pc3Npb246IHRvcGljLnBlcm1pc3Npb24sXG4gICAgICAgICAgaW1wb3J0SWQ6IHRvcGljLmlkXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiAvLyBcImNvbnRpbnVlXCJcbiAgICAgIH1cblxuICAgICAgc2VsZi5jcmVhdGVUb3BpY1dpdGhQYXJhbWV0ZXJzKFxuICAgICAgICB0b3BpYy5uYW1lLCB0b3BpYy5tZXRhY29kZSwgdG9waWMucGVybWlzc2lvbixcbiAgICAgICAgdG9waWMuZGVzYywgdG9waWMubGluaywgY29vcmRzLngsIGNvb3Jkcy55LCB0b3BpYy5pZFxuICAgICAgKVxuICAgIH0pXG4gIH0sXG5cbiAgaW1wb3J0U3luYXBzZXM6IGZ1bmN0aW9uKHBhcnNlZFN5bmFwc2VzKSB7XG4gICAgdmFyIHNlbGYgPSBJbXBvcnRcblxuICAgIHBhcnNlZFN5bmFwc2VzLmZvckVhY2goZnVuY3Rpb24oc3luYXBzZSkge1xuICAgICAgLy8gb25seSBjcmVhdGVTeW5hcHNlV2l0aFBhcmFtZXRlcnMgb25jZSBib3RoIHRvcGljcyBhcmUgcGVyc2lzdGVkXG4gICAgICAvLyBpZiB0aGVyZSBpc24ndCBhIGNpZE1hcHBpbmcsIGNoZWNrIGJ5IHRvcGljIG5hbWUgaW5zdGVhZFxuICAgICAgdmFyIHRvcGljMSA9IERhdGFNb2RlbC5Ub3BpY3MuZ2V0KHNlbGYuY2lkTWFwcGluZ3Nbc3luYXBzZS50b3BpYzFdKVxuICAgICAgaWYgKCF0b3BpYzEpIHRvcGljMSA9IERhdGFNb2RlbC5Ub3BpY3MuZmluZFdoZXJlKHsgbmFtZTogc3luYXBzZS50b3BpYzEgfSlcbiAgICAgIHZhciB0b3BpYzIgPSBEYXRhTW9kZWwuVG9waWNzLmdldChzZWxmLmNpZE1hcHBpbmdzW3N5bmFwc2UudG9waWMyXSlcbiAgICAgIGlmICghdG9waWMyKSB0b3BpYzIgPSBEYXRhTW9kZWwuVG9waWNzLmZpbmRXaGVyZSh7IG5hbWU6IHN5bmFwc2UudG9waWMyIH0pXG5cbiAgICAgIGlmICghdG9waWMxIHx8ICF0b3BpYzIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIk9uZSBvZiB0aGUgdHdvIHRvcGljcyBkb2Vzbid0IGV4aXN0IVwiKVxuICAgICAgICBjb25zb2xlLmVycm9yKHN5bmFwc2UpXG4gICAgICAgIHJldHVybiAvLyBuZXh0XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRvcGljMVByb21pc2UgPSAkLkRlZmVycmVkKClcbiAgICAgIGlmICh0b3BpYzEuaWQpIHtcbiAgICAgICAgdG9waWMxUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvcGljMS5vbignc3luYycsICgpID0+IHRvcGljMVByb21pc2UucmVzb2x2ZSgpKVxuICAgICAgfVxuICAgICAgY29uc3QgdG9waWMyUHJvbWlzZSA9ICQuRGVmZXJyZWQoKVxuICAgICAgaWYgKHRvcGljMi5pZCkge1xuICAgICAgICB0b3BpYzJQcm9taXNlLnJlc29sdmUoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG9waWMyLm9uKCdzeW5jJywgKCkgPT4gdG9waWMyUHJvbWlzZS5yZXNvbHZlKCkpXG4gICAgICB9XG4gICAgICAkLndoZW4odG9waWMxUHJvbWlzZSwgdG9waWMyUHJvbWlzZSkuZG9uZSgoKSA9PiB7XG4gICAgICAgIHNlbGYuY3JlYXRlU3luYXBzZVdpdGhQYXJhbWV0ZXJzKFxuICAgICAgICAgIHN5bmFwc2UuZGVzYywgc3luYXBzZS5jYXRlZ29yeSwgc3luYXBzZS5wZXJtaXNzaW9uLFxuICAgICAgICAgIHRvcGljMSwgdG9waWMyXG4gICAgICAgIClcbiAgICAgIH0pXG4gICAgfSlcbiAgfSxcblxuICBjcmVhdGVUb3BpY1dpdGhQYXJhbWV0ZXJzOiBmdW5jdGlvbihuYW1lLCBtZXRhY29kZU5hbWUsIHBlcm1pc3Npb24sIGRlc2MsXG4gICAgbGluaywgeGxvYywgeWxvYywgaW1wb3J0SWQsIG9wdHMgPSB7fSkge1xuICAgIHZhciBzZWxmID0gSW1wb3J0XG4gICAgJChkb2N1bWVudCkudHJpZ2dlcihNYXAuZXZlbnRzLmVkaXRlZEJ5QWN0aXZlTWFwcGVyKVxuICAgIHZhciBtZXRhY29kZSA9IERhdGFNb2RlbC5NZXRhY29kZXMud2hlcmUoe25hbWU6IG1ldGFjb2RlTmFtZX0pWzBdIHx8IG51bGxcbiAgICBpZiAobWV0YWNvZGUgPT09IG51bGwpIHtcbiAgICAgIG1ldGFjb2RlID0gRGF0YU1vZGVsLk1ldGFjb2Rlcy53aGVyZSh7IG5hbWU6ICdXaWxkY2FyZCcgfSlbMF1cbiAgICAgIGNvbnNvbGUud2FybihcIkNvdWxkbid0IGZpbmQgbWV0YWNvZGUgXCIgKyBtZXRhY29kZU5hbWUgKyAnIHNvIHVzZWQgV2lsZGNhcmQgaW5zdGVhZC4nKVxuICAgIH1cblxuICAgIGNvbnN0IHRvcGljUGVybWlzaW9uID0gcGVybWlzc2lvbiB8fCBBY3RpdmUuTWFwLmdldCgncGVybWlzc2lvbicpXG4gICAgdmFyIGRlZmVyVG9NYXBJZCA9IHBlcm1pc3Npb24gPT09IHRvcGljUGVybWlzaW9uID8gQWN0aXZlLk1hcC5nZXQoJ2lkJykgOiBudWxsXG4gICAgdmFyIHRvcGljID0gbmV3IERhdGFNb2RlbC5Ub3BpYyh7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgbWV0YWNvZGVfaWQ6IG1ldGFjb2RlLmlkLFxuICAgICAgcGVybWlzc2lvbjogdG9waWNQZXJtaXNpb24sXG4gICAgICBkZWZlcl90b19tYXBfaWQ6IGRlZmVyVG9NYXBJZCxcbiAgICAgIGRlc2M6IGRlc2MgfHwgJycsXG4gICAgICBsaW5rOiBsaW5rIHx8ICcnXG4gICAgfSlcbiAgICBEYXRhTW9kZWwuVG9waWNzLmFkZCh0b3BpYylcblxuICAgIGlmIChpbXBvcnRJZCAhPT0gbnVsbCAmJiBpbXBvcnRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZWxmLmNpZE1hcHBpbmdzW2ltcG9ydElkXSA9IHRvcGljLmNpZFxuICAgIH1cblxuICAgIHZhciBtYXBwaW5nID0gbmV3IERhdGFNb2RlbC5NYXBwaW5nKHtcbiAgICAgIHhsb2M6IHhsb2MsXG4gICAgICB5bG9jOiB5bG9jLFxuICAgICAgbWFwcGFibGVfaWQ6IHRvcGljLmNpZCxcbiAgICAgIG1hcHBhYmxlX3R5cGU6ICdUb3BpYydcbiAgICB9KVxuICAgIERhdGFNb2RlbC5NYXBwaW5ncy5hZGQobWFwcGluZylcblxuICAgIC8vIHRoaXMgZnVuY3Rpb24gYWxzbyBpbmNsdWRlcyB0aGUgY3JlYXRpb24gb2YgdGhlIHRvcGljIGluIHRoZSBkYXRhYmFzZVxuICAgIFRvcGljLnJlbmRlclRvcGljKG1hcHBpbmcsIHRvcGljLCB0cnVlLCB0cnVlLCB7XG4gICAgICBzdWNjZXNzOiBvcHRzLnN1Y2Nlc3NcbiAgICB9KVxuXG4gICAgR2xvYmFsVUkuaGlkZURpdignI2luc3RydWN0aW9ucycpXG4gIH0sXG5cbiAgY3JlYXRlU3luYXBzZVdpdGhQYXJhbWV0ZXJzOiBmdW5jdGlvbihkZXNjLCBjYXRlZ29yeSwgcGVybWlzc2lvbixcbiAgICB0b3BpYzEsIHRvcGljMikge1xuICAgIHZhciBub2RlMSA9IHRvcGljMS5nZXQoJ25vZGUnKVxuICAgIHZhciBub2RlMiA9IHRvcGljMi5nZXQoJ25vZGUnKVxuXG4gICAgaWYgKCF0b3BpYzEuaWQgfHwgIXRvcGljMi5pZCkge1xuICAgICAgY29uc29sZS5lcnJvcignbWlzc2luZyB0b3BpYyBpZCB3aGVuIGNyZWF0aW5nIHN5bmFwc2UnKVxuICAgICAgcmV0dXJuXG4gICAgfSAvLyBpZlxuXG4gICAgdmFyIHN5bmFwc2UgPSBuZXcgRGF0YU1vZGVsLlN5bmFwc2Uoe1xuICAgICAgZGVzYzogZGVzYyB8fCAnJyxcbiAgICAgIGNhdGVnb3J5OiBjYXRlZ29yeSB8fCAnZnJvbS10bycsXG4gICAgICBwZXJtaXNzaW9uOiBwZXJtaXNzaW9uLFxuICAgICAgdG9waWMxX2lkOiB0b3BpYzEuaWQsXG4gICAgICB0b3BpYzJfaWQ6IHRvcGljMi5pZFxuICAgIH0pXG4gICAgRGF0YU1vZGVsLlN5bmFwc2VzLmFkZChzeW5hcHNlKVxuXG4gICAgdmFyIG1hcHBpbmcgPSBuZXcgRGF0YU1vZGVsLk1hcHBpbmcoe1xuICAgICAgbWFwcGFibGVfdHlwZTogJ1N5bmFwc2UnLFxuICAgICAgbWFwcGFibGVfaWQ6IHN5bmFwc2UuY2lkXG4gICAgfSlcbiAgICBEYXRhTW9kZWwuTWFwcGluZ3MuYWRkKG1hcHBpbmcpXG5cbiAgICBTeW5hcHNlLnJlbmRlclN5bmFwc2UobWFwcGluZywgc3luYXBzZSwgbm9kZTEsIG5vZGUyLCB0cnVlKVxuICB9LFxuXG4gIGhhbmRsZVVSTDogZnVuY3Rpb24odXJsLCBvcHRzID0ge30pIHtcbiAgICBsZXQgY29vcmRzID0gb3B0cy5jb29yZHNcbiAgICBpZiAoIWNvb3JkcyB8fCBjb29yZHMueCA9PT0gdW5kZWZpbmVkIHx8IGNvb3Jkcy55ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvb3JkcyA9IEF1dG9MYXlvdXQuZ2V0TmV4dENvb3JkKHsgbWFwcGluZ3M6IERhdGFNb2RlbC5NYXBwaW5ncyB9KVxuICAgIH1cblxuICAgIGNvbnN0IG5hbWUgPSBvcHRzLm5hbWUgfHwgJ0xpbmsnXG4gICAgY29uc3QgbWV0YWNvZGUgPSBvcHRzLm1ldGFjb2RlIHx8ICdSZWZlcmVuY2UnXG4gICAgY29uc3QgaW1wb3J0SWQgPSBvcHRzLmltcG9ydElkIHx8IG51bGwgLy8gZG9uJ3Qgc3RvcmUgYSBjaWRNYXBwaW5nXG4gICAgY29uc3QgcGVybWlzc2lvbiA9IG9wdHMucGVybWlzc2lvbiB8fCBudWxsIC8vIHVzZSBkZWZhdWx0XG4gICAgY29uc3QgZGVzYyA9IG9wdHMuZGVzYyB8fCB1cmxcblxuICAgIEltcG9ydC5jcmVhdGVUb3BpY1dpdGhQYXJhbWV0ZXJzKFxuICAgICAgbmFtZSxcbiAgICAgIG1ldGFjb2RlLFxuICAgICAgcGVybWlzc2lvbixcbiAgICAgIGRlc2MsXG4gICAgICB1cmwsXG4gICAgICBjb29yZHMueCxcbiAgICAgIGNvb3Jkcy55LFxuICAgICAgaW1wb3J0SWQsXG4gICAgICB7XG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHRvcGljKSB7XG4gICAgICAgICAgaWYgKHRvcGljLmdldCgnbmFtZScpICE9PSAnTGluaycpIHJldHVyblxuICAgICAgICAgICQuZ2V0KCcvaGFja3MvbG9hZF91cmxfdGl0bGUnLCB7XG4gICAgICAgICAgICB1cmxcbiAgICAgICAgICB9LCBmdW5jdGlvbiBzdWNjZXNzKGRhdGEsIHRleHRTdGF0dXMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycgJiYgZGF0YS50cmltKCkgPT09ICcnKSByZXR1cm5cbiAgICAgICAgICAgIHZhciBzZWxlY3RvciA9ICcjc2hvd2NhcmQgI3RvcGljXycgKyB0b3BpYy5nZXQoJ2lkJykgKyAnIC5iZXN0X2luX3BsYWNlJ1xuICAgICAgICAgICAgaWYgKCQoc2VsZWN0b3IpLmZpbmQoJ2Zvcm0nKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICQoc2VsZWN0b3IpLmZpbmQoJ3RleHRhcmVhLCBpbnB1dCcpLnZhbChkYXRhLnRpdGxlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgJChzZWxlY3RvcikuaHRtbChkYXRhLnRpdGxlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9waWMuc2V0KCduYW1lJywgZGF0YS50aXRsZSlcbiAgICAgICAgICAgIHRvcGljLnNhdmUoKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApXG4gIH0sXG5cbiAgLypcbiAgICogaGVscGVyIGZ1bmN0aW9uc1xuICAgKi9cblxuICBhYm9ydDogZnVuY3Rpb24obWVzc2FnZSkge1xuICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSlcbiAgfSxcblxuICAvLyBUT0RPIGludmVzdGlnYXRlIHJlcGxhY2luZyB3aXRoIGVzNiAoPykgdHJpbSgpXG4gIHNpbXBsaWZ5OiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nXG4gICAgICAucmVwbGFjZSgvKF5cXHMqfFxccyokKS9nLCAnJylcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gIH0sXG5cbiAgbm9ybWFsaXplS2V5OiBmdW5jdGlvbihrZXkpIHtcbiAgICBsZXQgbmV3S2V5ID0ga2V5LnRvTG93ZXJDYXNlKClcbiAgICBuZXdLZXkgPSBuZXdLZXkucmVwbGFjZSgvXFxzL2csICcnKSAvLyByZW1vdmUgd2hpdGVzcGFjZVxuICAgIGlmIChuZXdLZXkgPT09ICd1cmwnKSBuZXdLZXkgPSAnbGluaydcbiAgICBpZiAobmV3S2V5ID09PSAndGl0bGUnKSBuZXdLZXkgPSAnbmFtZSdcbiAgICBpZiAobmV3S2V5ID09PSAnbGFiZWwnKSBuZXdLZXkgPSAnZGVzYydcbiAgICBpZiAobmV3S2V5ID09PSAnZGVzY3JpcHRpb24nKSBuZXdLZXkgPSAnZGVzYydcbiAgICBpZiAobmV3S2V5ID09PSAnZGlyZWN0aW9uJykgbmV3S2V5ID0gJ2NhdGVnb3J5J1xuICAgIHJldHVybiBuZXdLZXlcbiAgfSxcblxuICAvLyB0aGFua3MgdG8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjUyOTAxMTQvNTMzMjI4NlxuICBub3JtYWxpemVLZXlzOiBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gXy50cmFuc2Zvcm0ob2JqLCAocmVzdWx0LCB2YWwsIGtleSkgPT4ge1xuICAgICAgY29uc3QgbmV3S2V5ID0gSW1wb3J0Lm5vcm1hbGl6ZUtleShrZXkpXG4gICAgICByZXN1bHRbbmV3S2V5XSA9IHZhbFxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW1wb3J0XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL01ldGFtYXBzL0ltcG9ydC5qcyJdLCJtYXBwaW5ncyI6Ijs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 580 */
/***/ function(module, exports, __webpack_require__) {

    eval("var arrayEach = __webpack_require__(139),\n    baseCreate = __webpack_require__(401),\n    baseForOwn = __webpack_require__(141),\n    baseIteratee = __webpack_require__(30),\n    getPrototype = __webpack_require__(386),\n    isArray = __webpack_require__(86),\n    isBuffer = __webpack_require__(95),\n    isFunction = __webpack_require__(50),\n    isObject = __webpack_require__(18),\n    isTypedArray = __webpack_require__(99);\n\n/**\n * An alternative to `_.reduce`; this method transforms `object` to a new\n * `accumulator` object which is the result of running each of its own\n * enumerable string keyed properties thru `iteratee`, with each invocation\n * potentially mutating the `accumulator` object. If `accumulator` is not\n * provided, a new object with the same `[[Prototype]]` will be used. The\n * iteratee is invoked with four arguments: (accumulator, value, key, object).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The custom accumulator value.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * _.transform([2, 3, 4], function(result, n) {\n *   result.push(n *= n);\n *   return n % 2 == 0;\n * }, []);\n * // => [4, 9]\n *\n * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n *   (result[value] || (result[value] = [])).push(key);\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] }\n */\nfunction transform(object, iteratee, accumulator) {\n  var isArr = isArray(object),\n      isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n  iteratee = baseIteratee(iteratee, 4);\n  if (accumulator == null) {\n    var Ctor = object && object.constructor;\n    if (isArrLike) {\n      accumulator = isArr ? new Ctor : [];\n    }\n    else if (isObject(object)) {\n      accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n    }\n    else {\n      accumulator = {};\n    }\n  }\n  (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n    return iteratee(accumulator, value, index, object);\n  });\n  return accumulator;\n}\n\nmodule.exports = transform;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTgwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvdHJhbnNmb3JtLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheUVhY2ggPSByZXF1aXJlKCcuL19hcnJheUVhY2gnKSxcbiAgICBiYXNlQ3JlYXRlID0gcmVxdWlyZSgnLi9fYmFzZUNyZWF0ZScpLFxuICAgIGJhc2VGb3JPd24gPSByZXF1aXJlKCcuL19iYXNlRm9yT3duJyksXG4gICAgYmFzZUl0ZXJhdGVlID0gcmVxdWlyZSgnLi9fYmFzZUl0ZXJhdGVlJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpO1xuXG4vKipcbiAqIEFuIGFsdGVybmF0aXZlIHRvIGBfLnJlZHVjZWA7IHRoaXMgbWV0aG9kIHRyYW5zZm9ybXMgYG9iamVjdGAgdG8gYSBuZXdcbiAqIGBhY2N1bXVsYXRvcmAgb2JqZWN0IHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgcnVubmluZyBlYWNoIG9mIGl0cyBvd25cbiAqIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgdGhydSBgaXRlcmF0ZWVgLCB3aXRoIGVhY2ggaW52b2NhdGlvblxuICogcG90ZW50aWFsbHkgbXV0YXRpbmcgdGhlIGBhY2N1bXVsYXRvcmAgb2JqZWN0LiBJZiBgYWNjdW11bGF0b3JgIGlzIG5vdFxuICogcHJvdmlkZWQsIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBzYW1lIGBbW1Byb3RvdHlwZV1dYCB3aWxsIGJlIHVzZWQuIFRoZVxuICogaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOiAoYWNjdW11bGF0b3IsIHZhbHVlLCBrZXksIG9iamVjdCkuXG4gKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAxLjMuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBjdXN0b20gYWNjdW11bGF0b3IgdmFsdWUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udHJhbnNmb3JtKFsyLCAzLCA0XSwgZnVuY3Rpb24ocmVzdWx0LCBuKSB7XG4gKiAgIHJlc3VsdC5wdXNoKG4gKj0gbik7XG4gKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICogfSwgW10pO1xuICogLy8gPT4gWzQsIDldXG4gKlxuICogXy50cmFuc2Zvcm0oeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICogICAocmVzdWx0W3ZhbHVlXSB8fCAocmVzdWx0W3ZhbHVlXSA9IFtdKSkucHVzaChrZXkpO1xuICogfSwge30pO1xuICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfVxuICovXG5mdW5jdGlvbiB0cmFuc2Zvcm0ob2JqZWN0LCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgdmFyIGlzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgaXNBcnJMaWtlID0gaXNBcnIgfHwgaXNCdWZmZXIob2JqZWN0KSB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KTtcblxuICBpdGVyYXRlZSA9IGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgNCk7XG4gIGlmIChhY2N1bXVsYXRvciA9PSBudWxsKSB7XG4gICAgdmFyIEN0b3IgPSBvYmplY3QgJiYgb2JqZWN0LmNvbnN0cnVjdG9yO1xuICAgIGlmIChpc0Fyckxpa2UpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaXNBcnIgPyBuZXcgQ3RvciA6IFtdO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc09iamVjdChvYmplY3QpKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGlzRnVuY3Rpb24oQ3RvcikgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKSA6IHt9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGFjY3VtdWxhdG9yID0ge307XG4gICAgfVxuICB9XG4gIChpc0Fyckxpa2UgPyBhcnJheUVhY2ggOiBiYXNlRm9yT3duKShvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gICAgcmV0dXJuIGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIG9iamVjdCk7XG4gIH0pO1xuICByZXR1cm4gYWNjdW11bGF0b3I7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdHJhbnNmb3JtO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC90cmFuc2Zvcm0uanNcbi8vIG1vZHVsZSBpZCA9IDU4MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 581 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(Buffer, process) {// Generated by CoffeeScript 1.10.0\nvar Parser, StringDecoder, stream, util;\n\nstream = __webpack_require__(586);\n\nutil = __webpack_require__(438);\n\nStringDecoder = __webpack_require__(600).StringDecoder;\n\nmodule.exports = function() {\n  var callback, called, chunks, data, options, parser;\n  if (arguments.length === 3) {\n    data = arguments[0];\n    options = arguments[1];\n    callback = arguments[2];\n    if (typeof callback !== 'function') {\n      throw Error(\"Invalid callback argument: \" + (JSON.stringify(callback)));\n    }\n    if (!(typeof data === 'string' || Buffer.isBuffer(arguments[0]))) {\n      return callback(Error(\"Invalid data argument: \" + (JSON.stringify(data))));\n    }\n  } else if (arguments.length === 2) {\n    if (typeof arguments[0] === 'string' || Buffer.isBuffer(arguments[0])) {\n      data = arguments[0];\n    } else {\n      options = arguments[0];\n    }\n    if (typeof arguments[1] === 'function') {\n      callback = arguments[1];\n    } else {\n      options = arguments[1];\n    }\n  } else if (arguments.length === 1) {\n    if (typeof arguments[0] === 'function') {\n      callback = arguments[0];\n    } else {\n      options = arguments[0];\n    }\n  }\n  if (options == null) {\n    options = {};\n  }\n  parser = new Parser(options);\n  if (data != null) {\n    process.nextTick(function() {\n      parser.write(data);\n      return parser.end();\n    });\n  }\n  if (callback) {\n    called = false;\n    chunks = options.objname ? {} : [];\n    parser.on('readable', function() {\n      var chunk, results;\n      results = [];\n      while (chunk = parser.read()) {\n        if (options.objname) {\n          results.push(chunks[chunk[0]] = chunk[1]);\n        } else {\n          results.push(chunks.push(chunk));\n        }\n      }\n      return results;\n    });\n    parser.on('error', function(err) {\n      called = true;\n      return callback(err);\n    });\n    parser.on('end', function() {\n      if (!called) {\n        return callback(null, chunks);\n      }\n    });\n  }\n  return parser;\n};\n\nParser = function(options) {\n  var base, base1, base10, base11, base12, base13, base14, base15, base16, base2, base3, base4, base5, base6, base7, base8, base9, k, v;\n  if (options == null) {\n    options = {};\n  }\n  options.objectMode = true;\n  this.options = {};\n  for (k in options) {\n    v = options[k];\n    this.options[k] = v;\n  }\n  stream.Transform.call(this, this.options);\n  if ((base = this.options).rowDelimiter == null) {\n    base.rowDelimiter = null;\n  }\n  if (typeof this.options.rowDelimiter === \"string\") {\n    this.options.rowDelimiter = [this.options.rowDelimiter];\n  }\n  if ((base1 = this.options).delimiter == null) {\n    base1.delimiter = ',';\n  }\n  if ((base2 = this.options).quote == null) {\n    base2.quote = '\"';\n  }\n  if ((base3 = this.options).escape == null) {\n    base3.escape = '\"';\n  }\n  if ((base4 = this.options).columns == null) {\n    base4.columns = null;\n  }\n  if ((base5 = this.options).comment == null) {\n    base5.comment = '';\n  }\n  if ((base6 = this.options).objname == null) {\n    base6.objname = false;\n  }\n  if ((base7 = this.options).trim == null) {\n    base7.trim = false;\n  }\n  if ((base8 = this.options).ltrim == null) {\n    base8.ltrim = false;\n  }\n  if ((base9 = this.options).rtrim == null) {\n    base9.rtrim = false;\n  }\n  if ((base10 = this.options).auto_parse == null) {\n    base10.auto_parse = false;\n  }\n  if ((base11 = this.options).auto_parse_date == null) {\n    base11.auto_parse_date = false;\n  }\n  if ((base12 = this.options).relax == null) {\n    base12.relax = false;\n  }\n  if ((base13 = this.options).relax_column_count == null) {\n    base13.relax_column_count = false;\n  }\n  if ((base14 = this.options).skip_empty_lines == null) {\n    base14.skip_empty_lines = false;\n  }\n  if ((base15 = this.options).max_limit_on_data_read == null) {\n    base15.max_limit_on_data_read = 128000;\n  }\n  if ((base16 = this.options).skip_lines_with_empty_values == null) {\n    base16.skip_lines_with_empty_values = false;\n  }\n  this.lines = 0;\n  this.count = 0;\n  this.skipped_line_count = 0;\n  this.empty_line_count = 0;\n  this.is_int = /^(\\-|\\+)?([1-9]+[0-9]*)$/;\n  this.is_float = function(value) {\n    return (value - parseFloat(value) + 1) >= 0;\n  };\n  this.decoder = new StringDecoder();\n  this.buf = '';\n  this.quoting = false;\n  this.commenting = false;\n  this.field = '';\n  this.nextChar = null;\n  this.closingQuote = 0;\n  this.line = [];\n  this.chunks = [];\n  this.rawBuf = '';\n  this.rowDelimiter = null;\n  return this;\n};\n\nutil.inherits(Parser, stream.Transform);\n\nmodule.exports.Parser = Parser;\n\nParser.prototype._transform = function(chunk, encoding, callback) {\n  var err, error;\n  if (chunk instanceof Buffer) {\n    chunk = this.decoder.write(chunk);\n  }\n  try {\n    this.__write(chunk, false);\n    return callback();\n  } catch (error) {\n    err = error;\n    return this.emit('error', err);\n  }\n};\n\nParser.prototype._flush = function(callback) {\n  var err, error;\n  try {\n    this.__write(this.decoder.end(), true);\n    if (this.quoting) {\n      this.emit('error', new Error(\"Quoted field not terminated at line \" + (this.lines + 1)));\n      return;\n    }\n    if (this.line.length > 0) {\n      this.__push(this.line);\n    }\n    return callback();\n  } catch (error) {\n    err = error;\n    return this.emit('error', err);\n  }\n};\n\nParser.prototype.__push = function(line) {\n  var field, i, j, len, lineAsColumns, rawBuf;\n  if (this.options.skip_lines_with_empty_values && line.join('').trim() === '') {\n    return;\n  }\n  if (this.options.columns === true) {\n    this.options.columns = line;\n    rawBuf = '';\n    return;\n  } else if (typeof this.options.columns === 'function') {\n    this.options.columns = this.options.columns(line);\n    rawBuf = '';\n    return;\n  }\n  if (!this.line_length && line.length > 0) {\n    this.line_length = this.options.columns ? this.options.columns.length : line.length;\n  }\n  if (line.length === 1 && line[0] === '') {\n    this.empty_line_count++;\n  } else if (line.length !== this.line_length) {\n    if (this.options.relax_column_count) {\n      this.skipped_line_count++;\n    } else if (this.options.columns != null) {\n      throw Error(\"Number of columns on line \" + this.lines + \" does not match header\");\n    } else {\n      throw Error(\"Number of columns is inconsistent on line \" + this.lines);\n    }\n  } else {\n    this.count++;\n  }\n  if (this.options.columns != null) {\n    lineAsColumns = {};\n    for (i = j = 0, len = line.length; j < len; i = ++j) {\n      field = line[i];\n      if (this.options.columns[i] === false) {\n        continue;\n      }\n      lineAsColumns[this.options.columns[i]] = field;\n    }\n    if (this.options.objname) {\n      line = [lineAsColumns[this.options.objname], lineAsColumns];\n    } else {\n      line = lineAsColumns;\n    }\n  }\n  if (this.options.raw) {\n    this.push({\n      raw: this.rawBuf,\n      row: line\n    });\n    return this.rawBuf = '';\n  } else {\n    return this.push(line);\n  }\n};\n\nParser.prototype.__write = function(chars, end) {\n  var areNextCharsDelimiter, areNextCharsRowDelimiters, auto_parse, char, escapeIsQuote, i, isDelimiter, isEscape, isNextCharAComment, isQuote, isRowDelimiter, is_float, is_int, is_rem_buf_rowDelimiter, is_rem_buf_rowDelimiter_following_closing_quote, l, ltrim, match_chars_with_row_delimiters, matched, nextCharPos, ref, ref1, ref2, remainingBuffer, results, rowDelimiter, rtrim, rtrimed, wasCommenting;\n  is_int = (function(_this) {\n    return function(value) {\n      if (typeof _this.is_int === 'function') {\n        return _this.is_int(value);\n      } else {\n        return _this.is_int.test(value);\n      }\n    };\n  })(this);\n  is_float = (function(_this) {\n    return function(value) {\n      if (typeof _this.is_float === 'function') {\n        return _this.is_float(value);\n      } else {\n        return _this.is_float.test(value);\n      }\n    };\n  })(this);\n  auto_parse = (function(_this) {\n    return function(value) {\n      var m;\n      if (_this.options.auto_parse && is_int(value)) {\n        value = parseInt(value);\n      } else if (_this.options.auto_parse && is_float(value)) {\n        value = parseFloat(value);\n      } else if (_this.options.auto_parse && _this.options.auto_parse_date) {\n        m = Date.parse(value);\n        if (!isNaN(m)) {\n          value = new Date(m);\n        }\n      }\n      return value;\n    };\n  })(this);\n  is_rem_buf_rowDelimiter = (function(_this) {\n    return function(remainingBuffer, remainingBufferLength) {\n      var j, len, ref, rowDelimiter, rowDelimiterMatched;\n      rowDelimiterMatched = false;\n      if (_this.rowDelimiter != null) {\n        if (remainingBufferLength < _this.rowDelimiter.length && _this.rowDelimiter.substr(0, remainingBufferLength) === remainingBuffer) {\n          rowDelimiterMatched = true;\n        }\n      } else if (_this.options.rowDelimiter != null) {\n        ref = _this.options.rowDelimiter;\n        for (j = 0, len = ref.length; j < len; j++) {\n          rowDelimiter = ref[j];\n          if (remainingBufferLength < rowDelimiter.length && rowDelimiter.substr(0, remainingBufferLength) === remainingBuffer) {\n            rowDelimiterMatched = true;\n            break;\n          }\n        }\n      }\n      return rowDelimiterMatched;\n    };\n  })(this);\n  is_rem_buf_rowDelimiter_following_closing_quote = (function(_this) {\n    return function(remainingBuffer, remainingBufferLength) {\n      var j, len, ref, rowDelimiter, rowDelimiterFollowingClosingQuoteMatched;\n      rowDelimiterFollowingClosingQuoteMatched = false;\n      if (_this.rowDelimiter != null) {\n        if (_this.quoting && remainingBufferLength < (_this.options.quote.length + _this.rowDelimiter.length) && (_this.options.quote + _this.rowDelimiter).substr(0, remainingBufferLength) === remainingBuffer) {\n          rowDelimiterFollowingClosingQuoteMatched = true;\n        }\n      } else if (_this.options.rowDelimiter != null) {\n        ref = _this.options.rowDelimiter;\n        for (j = 0, len = ref.length; j < len; j++) {\n          rowDelimiter = ref[j];\n          if (_this.quoting && remainingBufferLength < (_this.options.quote.length + rowDelimiter.length) && (_this.options.quote + rowDelimiter).substr(0, remainingBufferLength) === remainingBuffer) {\n            rowDelimiterFollowingClosingQuoteMatched = true;\n            break;\n          }\n        }\n      }\n      return rowDelimiterFollowingClosingQuoteMatched;\n    };\n  })(this);\n  match_chars_with_row_delimiters = (function(_this) {\n    return function(chars, index) {\n      var j, len, matchedRowDelimiter, ref, rowDelimiter;\n      matchedRowDelimiter = null;\n      if (_this.rowDelimiter != null) {\n        if (chars.substr(index, _this.rowDelimiter.length) === _this.rowDelimiter) {\n          matchedRowDelimiter = _this.rowDelimiter;\n        }\n      } else if (_this.options.rowDelimiter != null) {\n        ref = _this.options.rowDelimiter;\n        for (j = 0, len = ref.length; j < len; j++) {\n          rowDelimiter = ref[j];\n          if (chars.substr(index, rowDelimiter.length) === rowDelimiter) {\n            matchedRowDelimiter = rowDelimiter;\n            break;\n          }\n        }\n      }\n      if (matchedRowDelimiter != null) {\n        return {\n          rowDelimiter: matchedRowDelimiter,\n          matched: true\n        };\n      } else {\n        return {\n          rowDelimiter: matchedRowDelimiter,\n          matched: false\n        };\n      }\n    };\n  })(this);\n  ltrim = this.options.trim || this.options.ltrim;\n  rtrim = this.options.trim || this.options.rtrim;\n  chars = this.buf + chars;\n  l = chars.length;\n  i = 0;\n  if (this.lines === 0 && 0xFEFF === chars.charCodeAt(0)) {\n    i++;\n  }\n  while (i < l) {\n    if (!end) {\n      remainingBuffer = chars.substr(i, l - i);\n      if ((!this.commenting && l - i < this.options.comment.length && this.options.comment.substr(0, l - i) === remainingBuffer) || is_rem_buf_rowDelimiter(remainingBuffer, l - i) || is_rem_buf_rowDelimiter_following_closing_quote(remainingBuffer, l - i) || (l - i <= this.options.delimiter.length && this.options.delimiter.substr(0, l - i) === remainingBuffer) || (l - i <= this.options.escape.length && this.options.escape.substr(0, l - i) === remainingBuffer)) {\n        break;\n      }\n    }\n    char = this.nextChar ? this.nextChar : chars.charAt(i);\n    this.nextChar = l > i + 1 ? chars.charAt(i + 1) : '';\n    if (this.options.raw) {\n      this.rawBuf += char;\n    }\n    if (!(((ref = this.options.rowDelimiter) != null ? ref.length : void 0) > 0)) {\n      if ((!this.quoting) && (char === '\\n' || char === '\\r')) {\n        rowDelimiter = char;\n        nextCharPos = i + 1;\n      } else if (this.nextChar === '\\n' || this.nextChar === '\\r') {\n        rowDelimiter = this.nextChar;\n        nextCharPos = i + 2;\n        if (this.raw) {\n          rawBuf += this.nextChar;\n        }\n      }\n      if (rowDelimiter) {\n        if (rowDelimiter === '\\r' && chars.charAt(nextCharPos) === '\\n') {\n          rowDelimiter += '\\n';\n        }\n        this.rowDelimiter = rowDelimiter;\n      }\n    }\n    if (!this.commenting && char === this.options.escape) {\n      escapeIsQuote = this.options.escape === this.options.quote;\n      isEscape = this.nextChar === this.options.escape;\n      isQuote = this.nextChar === this.options.quote;\n      if (!(escapeIsQuote && !this.field && !this.quoting) && (isEscape || isQuote)) {\n        i++;\n        char = this.nextChar;\n        this.nextChar = chars.charAt(i + 1);\n        this.field += char;\n        if (this.options.raw) {\n          this.rawBuf += char;\n        }\n        i++;\n        continue;\n      }\n    }\n    if (!this.commenting && char === this.options.quote) {\n      if (this.quoting) {\n        ref1 = match_chars_with_row_delimiters(chars, i + 1), matched = ref1.matched, rowDelimiter = ref1.rowDelimiter;\n        areNextCharsRowDelimiters = matched;\n        areNextCharsDelimiter = chars.substr(i + 1, this.options.delimiter.length) === this.options.delimiter;\n        isNextCharAComment = this.nextChar === this.options.comment;\n        if (this.nextChar && !areNextCharsRowDelimiters && !areNextCharsDelimiter && !isNextCharAComment) {\n          if (this.options.relax) {\n            this.quoting = false;\n            this.field = \"\" + this.options.quote + this.field;\n          } else {\n            throw Error(\"Invalid closing quote at line \" + (this.lines + 1) + \"; found \" + (JSON.stringify(this.nextChar)) + \" instead of delimiter \" + (JSON.stringify(this.options.delimiter)));\n          }\n        } else {\n          this.quoting = false;\n          this.closingQuote = this.options.quote.length;\n          i++;\n          if (end && i === l) {\n            this.line.push(auto_parse(this.field));\n            this.field = '';\n          }\n          continue;\n        }\n      } else if (!this.field) {\n        this.quoting = true;\n        i++;\n        continue;\n      } else if (this.field && !this.options.relax) {\n        throw Error(\"Invalid opening quote at line \" + (this.lines + 1));\n      }\n    }\n    ref2 = match_chars_with_row_delimiters(chars, i), matched = ref2.matched, rowDelimiter = ref2.rowDelimiter;\n    isRowDelimiter = matched;\n    if (isRowDelimiter || (end && i === l - 1)) {\n      this.lines++;\n    }\n    wasCommenting = false;\n    if (!this.commenting && !this.quoting && this.options.comment && chars.substr(i, this.options.comment.length) === this.options.comment) {\n      this.commenting = true;\n    } else if (this.commenting && isRowDelimiter) {\n      wasCommenting = true;\n      this.commenting = false;\n    }\n    isDelimiter = chars.substr(i, this.options.delimiter.length) === this.options.delimiter;\n    if (!this.commenting && !this.quoting && (isDelimiter || isRowDelimiter)) {\n      if (isRowDelimiter && this.line.length === 0 && this.field === '') {\n        if (wasCommenting || this.options.skip_empty_lines) {\n          if (rowDelimiter != null) {\n            i += rowDelimiter.length;\n          }\n          this.nextChar = chars.charAt(i);\n          continue;\n        }\n      }\n      if (rtrim) {\n        if (!this.closingQuote) {\n          this.field = this.field.trimRight();\n        }\n      }\n      this.line.push(auto_parse(this.field));\n      this.closingQuote = 0;\n      this.field = '';\n      if (isDelimiter) {\n        i += this.options.delimiter.length;\n        this.nextChar = chars.charAt(i);\n        if (end && !this.nextChar) {\n          isRowDelimiter = true;\n          this.line.push('');\n        }\n      }\n      if (isRowDelimiter) {\n        this.__push(this.line);\n        this.line = [];\n        if (rowDelimiter != null) {\n          i += rowDelimiter.length;\n        }\n        this.nextChar = chars.charAt(i);\n        continue;\n      }\n    } else if (!this.commenting && !this.quoting && (char === ' ' || char === '\\t')) {\n      if (!(ltrim && !this.field)) {\n        this.field += char;\n      }\n      if (end && i + 1 === l) {\n        if (this.options.trim || this.options.rtrim) {\n          this.field = this.field.trimRight();\n        }\n      }\n      i++;\n    } else if (!this.commenting) {\n      this.field += char;\n      i++;\n    } else {\n      i++;\n    }\n    if (!this.commenting && this.field.length > this.options.max_limit_on_data_read) {\n      throw Error(\"Delimiter not found in the file \" + (JSON.stringify(this.options.delimiter)));\n    }\n    if (!this.commenting && this.line.length > this.options.max_limit_on_data_read) {\n      throw Error(\"Row delimiter not found in the file \" + (JSON.stringify(this.options.rowDelimiter)));\n    }\n  }\n  if (end) {\n    rtrimed = false;\n    if (rtrim && !this.closingQuote && !isDelimiter) {\n      this.field = this.field.trimRight();\n      rtrimed = true;\n    }\n    if (this.field !== '' || rtrimed) {\n      if (!(this.field === '' && this.options.skip_empty_lines)) {\n        this.line.push(auto_parse(this.field));\n      }\n      this.field = '';\n    }\n    if (this.field.length > this.options.max_limit_on_data_read) {\n      throw Error(\"Delimiter not found in the file \" + (JSON.stringify(this.options.delimiter)));\n    }\n    if (l === 0) {\n      this.lines++;\n    }\n    if (this.line.length > this.options.max_limit_on_data_read) {\n      throw Error(\"Row delimiter not found in the file \" + (JSON.stringify(this.options.rowDelimiter)));\n    }\n  }\n  this.buf = '';\n  results = [];\n  while (i < l) {\n    this.buf += chars.charAt(i);\n    results.push(i++);\n  }\n  return results;\n};\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(582).Buffer, __webpack_require__(200)))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTgxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9jc3YtcGFyc2UvbGliL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMC4wXG52YXIgUGFyc2VyLCBTdHJpbmdEZWNvZGVyLCBzdHJlYW0sIHV0aWw7XG5cbnN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuXG51dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG5TdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXInKS5TdHJpbmdEZWNvZGVyO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FsbGJhY2ssIGNhbGxlZCwgY2h1bmtzLCBkYXRhLCBvcHRpb25zLCBwYXJzZXI7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgZGF0YSA9IGFyZ3VtZW50c1swXTtcbiAgICBvcHRpb25zID0gYXJndW1lbnRzWzFdO1xuICAgIGNhbGxiYWNrID0gYXJndW1lbnRzWzJdO1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IEVycm9yKFwiSW52YWxpZCBjYWxsYmFjayBhcmd1bWVudDogXCIgKyAoSlNPTi5zdHJpbmdpZnkoY2FsbGJhY2spKSk7XG4gICAgfVxuICAgIGlmICghKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyB8fCBCdWZmZXIuaXNCdWZmZXIoYXJndW1lbnRzWzBdKSkpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhFcnJvcihcIkludmFsaWQgZGF0YSBhcmd1bWVudDogXCIgKyAoSlNPTi5zdHJpbmdpZnkoZGF0YSkpKSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ3N0cmluZycgfHwgQnVmZmVyLmlzQnVmZmVyKGFyZ3VtZW50c1swXSkpIHtcbiAgICAgIGRhdGEgPSBhcmd1bWVudHNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMgPSBhcmd1bWVudHNbMF07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IGFyZ3VtZW50c1sxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IGFyZ3VtZW50c1sxXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IGFyZ3VtZW50c1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IGFyZ3VtZW50c1swXTtcbiAgICB9XG4gIH1cbiAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBwYXJzZXIgPSBuZXcgUGFyc2VyKG9wdGlvbnMpO1xuICBpZiAoZGF0YSAhPSBudWxsKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgIHBhcnNlci53cml0ZShkYXRhKTtcbiAgICAgIHJldHVybiBwYXJzZXIuZW5kKCk7XG4gICAgfSk7XG4gIH1cbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgY2FsbGVkID0gZmFsc2U7XG4gICAgY2h1bmtzID0gb3B0aW9ucy5vYmpuYW1lID8ge30gOiBbXTtcbiAgICBwYXJzZXIub24oJ3JlYWRhYmxlJywgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgY2h1bmssIHJlc3VsdHM7XG4gICAgICByZXN1bHRzID0gW107XG4gICAgICB3aGlsZSAoY2h1bmsgPSBwYXJzZXIucmVhZCgpKSB7XG4gICAgICAgIGlmIChvcHRpb25zLm9iam5hbWUpIHtcbiAgICAgICAgICByZXN1bHRzLnB1c2goY2h1bmtzW2NodW5rWzBdXSA9IGNodW5rWzFdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRzLnB1c2goY2h1bmtzLnB1c2goY2h1bmspKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfSk7XG4gICAgcGFyc2VyLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikge1xuICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH0pO1xuICAgIHBhcnNlci5vbignZW5kJywgZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgY2h1bmtzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcGFyc2VyO1xufTtcblxuUGFyc2VyID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICB2YXIgYmFzZSwgYmFzZTEsIGJhc2UxMCwgYmFzZTExLCBiYXNlMTIsIGJhc2UxMywgYmFzZTE0LCBiYXNlMTUsIGJhc2UxNiwgYmFzZTIsIGJhc2UzLCBiYXNlNCwgYmFzZTUsIGJhc2U2LCBiYXNlNywgYmFzZTgsIGJhc2U5LCBrLCB2O1xuICBpZiAob3B0aW9ucyA9PSBudWxsKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIG9wdGlvbnMub2JqZWN0TW9kZSA9IHRydWU7XG4gIHRoaXMub3B0aW9ucyA9IHt9O1xuICBmb3IgKGsgaW4gb3B0aW9ucykge1xuICAgIHYgPSBvcHRpb25zW2tdO1xuICAgIHRoaXMub3B0aW9uc1trXSA9IHY7XG4gIH1cbiAgc3RyZWFtLlRyYW5zZm9ybS5jYWxsKHRoaXMsIHRoaXMub3B0aW9ucyk7XG4gIGlmICgoYmFzZSA9IHRoaXMub3B0aW9ucykucm93RGVsaW1pdGVyID09IG51bGwpIHtcbiAgICBiYXNlLnJvd0RlbGltaXRlciA9IG51bGw7XG4gIH1cbiAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMucm93RGVsaW1pdGVyID09PSBcInN0cmluZ1wiKSB7XG4gICAgdGhpcy5vcHRpb25zLnJvd0RlbGltaXRlciA9IFt0aGlzLm9wdGlvbnMucm93RGVsaW1pdGVyXTtcbiAgfVxuICBpZiAoKGJhc2UxID0gdGhpcy5vcHRpb25zKS5kZWxpbWl0ZXIgPT0gbnVsbCkge1xuICAgIGJhc2UxLmRlbGltaXRlciA9ICcsJztcbiAgfVxuICBpZiAoKGJhc2UyID0gdGhpcy5vcHRpb25zKS5xdW90ZSA9PSBudWxsKSB7XG4gICAgYmFzZTIucXVvdGUgPSAnXCInO1xuICB9XG4gIGlmICgoYmFzZTMgPSB0aGlzLm9wdGlvbnMpLmVzY2FwZSA9PSBudWxsKSB7XG4gICAgYmFzZTMuZXNjYXBlID0gJ1wiJztcbiAgfVxuICBpZiAoKGJhc2U0ID0gdGhpcy5vcHRpb25zKS5jb2x1bW5zID09IG51bGwpIHtcbiAgICBiYXNlNC5jb2x1bW5zID0gbnVsbDtcbiAgfVxuICBpZiAoKGJhc2U1ID0gdGhpcy5vcHRpb25zKS5jb21tZW50ID09IG51bGwpIHtcbiAgICBiYXNlNS5jb21tZW50ID0gJyc7XG4gIH1cbiAgaWYgKChiYXNlNiA9IHRoaXMub3B0aW9ucykub2JqbmFtZSA9PSBudWxsKSB7XG4gICAgYmFzZTYub2JqbmFtZSA9IGZhbHNlO1xuICB9XG4gIGlmICgoYmFzZTcgPSB0aGlzLm9wdGlvbnMpLnRyaW0gPT0gbnVsbCkge1xuICAgIGJhc2U3LnRyaW0gPSBmYWxzZTtcbiAgfVxuICBpZiAoKGJhc2U4ID0gdGhpcy5vcHRpb25zKS5sdHJpbSA9PSBudWxsKSB7XG4gICAgYmFzZTgubHRyaW0gPSBmYWxzZTtcbiAgfVxuICBpZiAoKGJhc2U5ID0gdGhpcy5vcHRpb25zKS5ydHJpbSA9PSBudWxsKSB7XG4gICAgYmFzZTkucnRyaW0gPSBmYWxzZTtcbiAgfVxuICBpZiAoKGJhc2UxMCA9IHRoaXMub3B0aW9ucykuYXV0b19wYXJzZSA9PSBudWxsKSB7XG4gICAgYmFzZTEwLmF1dG9fcGFyc2UgPSBmYWxzZTtcbiAgfVxuICBpZiAoKGJhc2UxMSA9IHRoaXMub3B0aW9ucykuYXV0b19wYXJzZV9kYXRlID09IG51bGwpIHtcbiAgICBiYXNlMTEuYXV0b19wYXJzZV9kYXRlID0gZmFsc2U7XG4gIH1cbiAgaWYgKChiYXNlMTIgPSB0aGlzLm9wdGlvbnMpLnJlbGF4ID09IG51bGwpIHtcbiAgICBiYXNlMTIucmVsYXggPSBmYWxzZTtcbiAgfVxuICBpZiAoKGJhc2UxMyA9IHRoaXMub3B0aW9ucykucmVsYXhfY29sdW1uX2NvdW50ID09IG51bGwpIHtcbiAgICBiYXNlMTMucmVsYXhfY29sdW1uX2NvdW50ID0gZmFsc2U7XG4gIH1cbiAgaWYgKChiYXNlMTQgPSB0aGlzLm9wdGlvbnMpLnNraXBfZW1wdHlfbGluZXMgPT0gbnVsbCkge1xuICAgIGJhc2UxNC5za2lwX2VtcHR5X2xpbmVzID0gZmFsc2U7XG4gIH1cbiAgaWYgKChiYXNlMTUgPSB0aGlzLm9wdGlvbnMpLm1heF9saW1pdF9vbl9kYXRhX3JlYWQgPT0gbnVsbCkge1xuICAgIGJhc2UxNS5tYXhfbGltaXRfb25fZGF0YV9yZWFkID0gMTI4MDAwO1xuICB9XG4gIGlmICgoYmFzZTE2ID0gdGhpcy5vcHRpb25zKS5za2lwX2xpbmVzX3dpdGhfZW1wdHlfdmFsdWVzID09IG51bGwpIHtcbiAgICBiYXNlMTYuc2tpcF9saW5lc193aXRoX2VtcHR5X3ZhbHVlcyA9IGZhbHNlO1xuICB9XG4gIHRoaXMubGluZXMgPSAwO1xuICB0aGlzLmNvdW50ID0gMDtcbiAgdGhpcy5za2lwcGVkX2xpbmVfY291bnQgPSAwO1xuICB0aGlzLmVtcHR5X2xpbmVfY291bnQgPSAwO1xuICB0aGlzLmlzX2ludCA9IC9eKFxcLXxcXCspPyhbMS05XStbMC05XSopJC87XG4gIHRoaXMuaXNfZmxvYXQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiAodmFsdWUgLSBwYXJzZUZsb2F0KHZhbHVlKSArIDEpID49IDA7XG4gIH07XG4gIHRoaXMuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKCk7XG4gIHRoaXMuYnVmID0gJyc7XG4gIHRoaXMucXVvdGluZyA9IGZhbHNlO1xuICB0aGlzLmNvbW1lbnRpbmcgPSBmYWxzZTtcbiAgdGhpcy5maWVsZCA9ICcnO1xuICB0aGlzLm5leHRDaGFyID0gbnVsbDtcbiAgdGhpcy5jbG9zaW5nUXVvdGUgPSAwO1xuICB0aGlzLmxpbmUgPSBbXTtcbiAgdGhpcy5jaHVua3MgPSBbXTtcbiAgdGhpcy5yYXdCdWYgPSAnJztcbiAgdGhpcy5yb3dEZWxpbWl0ZXIgPSBudWxsO1xuICByZXR1cm4gdGhpcztcbn07XG5cbnV0aWwuaW5oZXJpdHMoUGFyc2VyLCBzdHJlYW0uVHJhbnNmb3JtKTtcblxubW9kdWxlLmV4cG9ydHMuUGFyc2VyID0gUGFyc2VyO1xuXG5QYXJzZXIucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gIHZhciBlcnIsIGVycm9yO1xuICBpZiAoY2h1bmsgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICBjaHVuayA9IHRoaXMuZGVjb2Rlci53cml0ZShjaHVuayk7XG4gIH1cbiAgdHJ5IHtcbiAgICB0aGlzLl9fd3JpdGUoY2h1bmssIGZhbHNlKTtcbiAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBlcnIgPSBlcnJvcjtcbiAgICByZXR1cm4gdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gIH1cbn07XG5cblBhcnNlci5wcm90b3R5cGUuX2ZsdXNoID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgdmFyIGVyciwgZXJyb3I7XG4gIHRyeSB7XG4gICAgdGhpcy5fX3dyaXRlKHRoaXMuZGVjb2Rlci5lbmQoKSwgdHJ1ZSk7XG4gICAgaWYgKHRoaXMucXVvdGluZykge1xuICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcihcIlF1b3RlZCBmaWVsZCBub3QgdGVybWluYXRlZCBhdCBsaW5lIFwiICsgKHRoaXMubGluZXMgKyAxKSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5saW5lLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX19wdXNoKHRoaXMubGluZSk7XG4gICAgfVxuICAgIHJldHVybiBjYWxsYmFjaygpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGVyciA9IGVycm9yO1xuICAgIHJldHVybiB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgfVxufTtcblxuUGFyc2VyLnByb3RvdHlwZS5fX3B1c2ggPSBmdW5jdGlvbihsaW5lKSB7XG4gIHZhciBmaWVsZCwgaSwgaiwgbGVuLCBsaW5lQXNDb2x1bW5zLCByYXdCdWY7XG4gIGlmICh0aGlzLm9wdGlvbnMuc2tpcF9saW5lc193aXRoX2VtcHR5X3ZhbHVlcyAmJiBsaW5lLmpvaW4oJycpLnRyaW0oKSA9PT0gJycpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHRoaXMub3B0aW9ucy5jb2x1bW5zID09PSB0cnVlKSB7XG4gICAgdGhpcy5vcHRpb25zLmNvbHVtbnMgPSBsaW5lO1xuICAgIHJhd0J1ZiA9ICcnO1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmNvbHVtbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0aGlzLm9wdGlvbnMuY29sdW1ucyA9IHRoaXMub3B0aW9ucy5jb2x1bW5zKGxpbmUpO1xuICAgIHJhd0J1ZiA9ICcnO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIXRoaXMubGluZV9sZW5ndGggJiYgbGluZS5sZW5ndGggPiAwKSB7XG4gICAgdGhpcy5saW5lX2xlbmd0aCA9IHRoaXMub3B0aW9ucy5jb2x1bW5zID8gdGhpcy5vcHRpb25zLmNvbHVtbnMubGVuZ3RoIDogbGluZS5sZW5ndGg7XG4gIH1cbiAgaWYgKGxpbmUubGVuZ3RoID09PSAxICYmIGxpbmVbMF0gPT09ICcnKSB7XG4gICAgdGhpcy5lbXB0eV9saW5lX2NvdW50Kys7XG4gIH0gZWxzZSBpZiAobGluZS5sZW5ndGggIT09IHRoaXMubGluZV9sZW5ndGgpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnJlbGF4X2NvbHVtbl9jb3VudCkge1xuICAgICAgdGhpcy5za2lwcGVkX2xpbmVfY291bnQrKztcbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5jb2x1bW5zICE9IG51bGwpIHtcbiAgICAgIHRocm93IEVycm9yKFwiTnVtYmVyIG9mIGNvbHVtbnMgb24gbGluZSBcIiArIHRoaXMubGluZXMgKyBcIiBkb2VzIG5vdCBtYXRjaCBoZWFkZXJcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IEVycm9yKFwiTnVtYmVyIG9mIGNvbHVtbnMgaXMgaW5jb25zaXN0ZW50IG9uIGxpbmUgXCIgKyB0aGlzLmxpbmVzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5jb3VudCsrO1xuICB9XG4gIGlmICh0aGlzLm9wdGlvbnMuY29sdW1ucyAhPSBudWxsKSB7XG4gICAgbGluZUFzQ29sdW1ucyA9IHt9O1xuICAgIGZvciAoaSA9IGogPSAwLCBsZW4gPSBsaW5lLmxlbmd0aDsgaiA8IGxlbjsgaSA9ICsraikge1xuICAgICAgZmllbGQgPSBsaW5lW2ldO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb2x1bW5zW2ldID09PSBmYWxzZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxpbmVBc0NvbHVtbnNbdGhpcy5vcHRpb25zLmNvbHVtbnNbaV1dID0gZmllbGQ7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMub2JqbmFtZSkge1xuICAgICAgbGluZSA9IFtsaW5lQXNDb2x1bW5zW3RoaXMub3B0aW9ucy5vYmpuYW1lXSwgbGluZUFzQ29sdW1uc107XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmUgPSBsaW5lQXNDb2x1bW5zO1xuICAgIH1cbiAgfVxuICBpZiAodGhpcy5vcHRpb25zLnJhdykge1xuICAgIHRoaXMucHVzaCh7XG4gICAgICByYXc6IHRoaXMucmF3QnVmLFxuICAgICAgcm93OiBsaW5lXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMucmF3QnVmID0gJyc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMucHVzaChsaW5lKTtcbiAgfVxufTtcblxuUGFyc2VyLnByb3RvdHlwZS5fX3dyaXRlID0gZnVuY3Rpb24oY2hhcnMsIGVuZCkge1xuICB2YXIgYXJlTmV4dENoYXJzRGVsaW1pdGVyLCBhcmVOZXh0Q2hhcnNSb3dEZWxpbWl0ZXJzLCBhdXRvX3BhcnNlLCBjaGFyLCBlc2NhcGVJc1F1b3RlLCBpLCBpc0RlbGltaXRlciwgaXNFc2NhcGUsIGlzTmV4dENoYXJBQ29tbWVudCwgaXNRdW90ZSwgaXNSb3dEZWxpbWl0ZXIsIGlzX2Zsb2F0LCBpc19pbnQsIGlzX3JlbV9idWZfcm93RGVsaW1pdGVyLCBpc19yZW1fYnVmX3Jvd0RlbGltaXRlcl9mb2xsb3dpbmdfY2xvc2luZ19xdW90ZSwgbCwgbHRyaW0sIG1hdGNoX2NoYXJzX3dpdGhfcm93X2RlbGltaXRlcnMsIG1hdGNoZWQsIG5leHRDaGFyUG9zLCByZWYsIHJlZjEsIHJlZjIsIHJlbWFpbmluZ0J1ZmZlciwgcmVzdWx0cywgcm93RGVsaW1pdGVyLCBydHJpbSwgcnRyaW1lZCwgd2FzQ29tbWVudGluZztcbiAgaXNfaW50ID0gKGZ1bmN0aW9uKF90aGlzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIF90aGlzLmlzX2ludCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gX3RoaXMuaXNfaW50KHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5pc19pbnQudGVzdCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfSkodGhpcyk7XG4gIGlzX2Zsb2F0ID0gKGZ1bmN0aW9uKF90aGlzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIF90aGlzLmlzX2Zsb2F0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5pc19mbG9hdCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gX3RoaXMuaXNfZmxvYXQudGVzdCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfSkodGhpcyk7XG4gIGF1dG9fcGFyc2UgPSAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBtO1xuICAgICAgaWYgKF90aGlzLm9wdGlvbnMuYXV0b19wYXJzZSAmJiBpc19pbnQodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gcGFyc2VJbnQodmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChfdGhpcy5vcHRpb25zLmF1dG9fcGFyc2UgJiYgaXNfZmxvYXQodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKF90aGlzLm9wdGlvbnMuYXV0b19wYXJzZSAmJiBfdGhpcy5vcHRpb25zLmF1dG9fcGFyc2VfZGF0ZSkge1xuICAgICAgICBtID0gRGF0ZS5wYXJzZSh2YWx1ZSk7XG4gICAgICAgIGlmICghaXNOYU4obSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKG0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgfSkodGhpcyk7XG4gIGlzX3JlbV9idWZfcm93RGVsaW1pdGVyID0gKGZ1bmN0aW9uKF90aGlzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHJlbWFpbmluZ0J1ZmZlciwgcmVtYWluaW5nQnVmZmVyTGVuZ3RoKSB7XG4gICAgICB2YXIgaiwgbGVuLCByZWYsIHJvd0RlbGltaXRlciwgcm93RGVsaW1pdGVyTWF0Y2hlZDtcbiAgICAgIHJvd0RlbGltaXRlck1hdGNoZWQgPSBmYWxzZTtcbiAgICAgIGlmIChfdGhpcy5yb3dEZWxpbWl0ZXIgIT0gbnVsbCkge1xuICAgICAgICBpZiAocmVtYWluaW5nQnVmZmVyTGVuZ3RoIDwgX3RoaXMucm93RGVsaW1pdGVyLmxlbmd0aCAmJiBfdGhpcy5yb3dEZWxpbWl0ZXIuc3Vic3RyKDAsIHJlbWFpbmluZ0J1ZmZlckxlbmd0aCkgPT09IHJlbWFpbmluZ0J1ZmZlcikge1xuICAgICAgICAgIHJvd0RlbGltaXRlck1hdGNoZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKF90aGlzLm9wdGlvbnMucm93RGVsaW1pdGVyICE9IG51bGwpIHtcbiAgICAgICAgcmVmID0gX3RoaXMub3B0aW9ucy5yb3dEZWxpbWl0ZXI7XG4gICAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykge1xuICAgICAgICAgIHJvd0RlbGltaXRlciA9IHJlZltqXTtcbiAgICAgICAgICBpZiAocmVtYWluaW5nQnVmZmVyTGVuZ3RoIDwgcm93RGVsaW1pdGVyLmxlbmd0aCAmJiByb3dEZWxpbWl0ZXIuc3Vic3RyKDAsIHJlbWFpbmluZ0J1ZmZlckxlbmd0aCkgPT09IHJlbWFpbmluZ0J1ZmZlcikge1xuICAgICAgICAgICAgcm93RGVsaW1pdGVyTWF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByb3dEZWxpbWl0ZXJNYXRjaGVkO1xuICAgIH07XG4gIH0pKHRoaXMpO1xuICBpc19yZW1fYnVmX3Jvd0RlbGltaXRlcl9mb2xsb3dpbmdfY2xvc2luZ19xdW90ZSA9IChmdW5jdGlvbihfdGhpcykge1xuICAgIHJldHVybiBmdW5jdGlvbihyZW1haW5pbmdCdWZmZXIsIHJlbWFpbmluZ0J1ZmZlckxlbmd0aCkge1xuICAgICAgdmFyIGosIGxlbiwgcmVmLCByb3dEZWxpbWl0ZXIsIHJvd0RlbGltaXRlckZvbGxvd2luZ0Nsb3NpbmdRdW90ZU1hdGNoZWQ7XG4gICAgICByb3dEZWxpbWl0ZXJGb2xsb3dpbmdDbG9zaW5nUXVvdGVNYXRjaGVkID0gZmFsc2U7XG4gICAgICBpZiAoX3RoaXMucm93RGVsaW1pdGVyICE9IG51bGwpIHtcbiAgICAgICAgaWYgKF90aGlzLnF1b3RpbmcgJiYgcmVtYWluaW5nQnVmZmVyTGVuZ3RoIDwgKF90aGlzLm9wdGlvbnMucXVvdGUubGVuZ3RoICsgX3RoaXMucm93RGVsaW1pdGVyLmxlbmd0aCkgJiYgKF90aGlzLm9wdGlvbnMucXVvdGUgKyBfdGhpcy5yb3dEZWxpbWl0ZXIpLnN1YnN0cigwLCByZW1haW5pbmdCdWZmZXJMZW5ndGgpID09PSByZW1haW5pbmdCdWZmZXIpIHtcbiAgICAgICAgICByb3dEZWxpbWl0ZXJGb2xsb3dpbmdDbG9zaW5nUXVvdGVNYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChfdGhpcy5vcHRpb25zLnJvd0RlbGltaXRlciAhPSBudWxsKSB7XG4gICAgICAgIHJlZiA9IF90aGlzLm9wdGlvbnMucm93RGVsaW1pdGVyO1xuICAgICAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgICByb3dEZWxpbWl0ZXIgPSByZWZbal07XG4gICAgICAgICAgaWYgKF90aGlzLnF1b3RpbmcgJiYgcmVtYWluaW5nQnVmZmVyTGVuZ3RoIDwgKF90aGlzLm9wdGlvbnMucXVvdGUubGVuZ3RoICsgcm93RGVsaW1pdGVyLmxlbmd0aCkgJiYgKF90aGlzLm9wdGlvbnMucXVvdGUgKyByb3dEZWxpbWl0ZXIpLnN1YnN0cigwLCByZW1haW5pbmdCdWZmZXJMZW5ndGgpID09PSByZW1haW5pbmdCdWZmZXIpIHtcbiAgICAgICAgICAgIHJvd0RlbGltaXRlckZvbGxvd2luZ0Nsb3NpbmdRdW90ZU1hdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcm93RGVsaW1pdGVyRm9sbG93aW5nQ2xvc2luZ1F1b3RlTWF0Y2hlZDtcbiAgICB9O1xuICB9KSh0aGlzKTtcbiAgbWF0Y2hfY2hhcnNfd2l0aF9yb3dfZGVsaW1pdGVycyA9IChmdW5jdGlvbihfdGhpcykge1xuICAgIHJldHVybiBmdW5jdGlvbihjaGFycywgaW5kZXgpIHtcbiAgICAgIHZhciBqLCBsZW4sIG1hdGNoZWRSb3dEZWxpbWl0ZXIsIHJlZiwgcm93RGVsaW1pdGVyO1xuICAgICAgbWF0Y2hlZFJvd0RlbGltaXRlciA9IG51bGw7XG4gICAgICBpZiAoX3RoaXMucm93RGVsaW1pdGVyICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGNoYXJzLnN1YnN0cihpbmRleCwgX3RoaXMucm93RGVsaW1pdGVyLmxlbmd0aCkgPT09IF90aGlzLnJvd0RlbGltaXRlcikge1xuICAgICAgICAgIG1hdGNoZWRSb3dEZWxpbWl0ZXIgPSBfdGhpcy5yb3dEZWxpbWl0ZXI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoX3RoaXMub3B0aW9ucy5yb3dEZWxpbWl0ZXIgIT0gbnVsbCkge1xuICAgICAgICByZWYgPSBfdGhpcy5vcHRpb25zLnJvd0RlbGltaXRlcjtcbiAgICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgICAgcm93RGVsaW1pdGVyID0gcmVmW2pdO1xuICAgICAgICAgIGlmIChjaGFycy5zdWJzdHIoaW5kZXgsIHJvd0RlbGltaXRlci5sZW5ndGgpID09PSByb3dEZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgIG1hdGNoZWRSb3dEZWxpbWl0ZXIgPSByb3dEZWxpbWl0ZXI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtYXRjaGVkUm93RGVsaW1pdGVyICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByb3dEZWxpbWl0ZXI6IG1hdGNoZWRSb3dEZWxpbWl0ZXIsXG4gICAgICAgICAgbWF0Y2hlZDogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByb3dEZWxpbWl0ZXI6IG1hdGNoZWRSb3dEZWxpbWl0ZXIsXG4gICAgICAgICAgbWF0Y2hlZDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICB9KSh0aGlzKTtcbiAgbHRyaW0gPSB0aGlzLm9wdGlvbnMudHJpbSB8fCB0aGlzLm9wdGlvbnMubHRyaW07XG4gIHJ0cmltID0gdGhpcy5vcHRpb25zLnRyaW0gfHwgdGhpcy5vcHRpb25zLnJ0cmltO1xuICBjaGFycyA9IHRoaXMuYnVmICsgY2hhcnM7XG4gIGwgPSBjaGFycy5sZW5ndGg7XG4gIGkgPSAwO1xuICBpZiAodGhpcy5saW5lcyA9PT0gMCAmJiAweEZFRkYgPT09IGNoYXJzLmNoYXJDb2RlQXQoMCkpIHtcbiAgICBpKys7XG4gIH1cbiAgd2hpbGUgKGkgPCBsKSB7XG4gICAgaWYgKCFlbmQpIHtcbiAgICAgIHJlbWFpbmluZ0J1ZmZlciA9IGNoYXJzLnN1YnN0cihpLCBsIC0gaSk7XG4gICAgICBpZiAoKCF0aGlzLmNvbW1lbnRpbmcgJiYgbCAtIGkgPCB0aGlzLm9wdGlvbnMuY29tbWVudC5sZW5ndGggJiYgdGhpcy5vcHRpb25zLmNvbW1lbnQuc3Vic3RyKDAsIGwgLSBpKSA9PT0gcmVtYWluaW5nQnVmZmVyKSB8fCBpc19yZW1fYnVmX3Jvd0RlbGltaXRlcihyZW1haW5pbmdCdWZmZXIsIGwgLSBpKSB8fCBpc19yZW1fYnVmX3Jvd0RlbGltaXRlcl9mb2xsb3dpbmdfY2xvc2luZ19xdW90ZShyZW1haW5pbmdCdWZmZXIsIGwgLSBpKSB8fCAobCAtIGkgPD0gdGhpcy5vcHRpb25zLmRlbGltaXRlci5sZW5ndGggJiYgdGhpcy5vcHRpb25zLmRlbGltaXRlci5zdWJzdHIoMCwgbCAtIGkpID09PSByZW1haW5pbmdCdWZmZXIpIHx8IChsIC0gaSA8PSB0aGlzLm9wdGlvbnMuZXNjYXBlLmxlbmd0aCAmJiB0aGlzLm9wdGlvbnMuZXNjYXBlLnN1YnN0cigwLCBsIC0gaSkgPT09IHJlbWFpbmluZ0J1ZmZlcikpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGNoYXIgPSB0aGlzLm5leHRDaGFyID8gdGhpcy5uZXh0Q2hhciA6IGNoYXJzLmNoYXJBdChpKTtcbiAgICB0aGlzLm5leHRDaGFyID0gbCA+IGkgKyAxID8gY2hhcnMuY2hhckF0KGkgKyAxKSA6ICcnO1xuICAgIGlmICh0aGlzLm9wdGlvbnMucmF3KSB7XG4gICAgICB0aGlzLnJhd0J1ZiArPSBjaGFyO1xuICAgIH1cbiAgICBpZiAoISgoKHJlZiA9IHRoaXMub3B0aW9ucy5yb3dEZWxpbWl0ZXIpICE9IG51bGwgPyByZWYubGVuZ3RoIDogdm9pZCAwKSA+IDApKSB7XG4gICAgICBpZiAoKCF0aGlzLnF1b3RpbmcpICYmIChjaGFyID09PSAnXFxuJyB8fCBjaGFyID09PSAnXFxyJykpIHtcbiAgICAgICAgcm93RGVsaW1pdGVyID0gY2hhcjtcbiAgICAgICAgbmV4dENoYXJQb3MgPSBpICsgMTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5uZXh0Q2hhciA9PT0gJ1xcbicgfHwgdGhpcy5uZXh0Q2hhciA9PT0gJ1xccicpIHtcbiAgICAgICAgcm93RGVsaW1pdGVyID0gdGhpcy5uZXh0Q2hhcjtcbiAgICAgICAgbmV4dENoYXJQb3MgPSBpICsgMjtcbiAgICAgICAgaWYgKHRoaXMucmF3KSB7XG4gICAgICAgICAgcmF3QnVmICs9IHRoaXMubmV4dENoYXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChyb3dEZWxpbWl0ZXIpIHtcbiAgICAgICAgaWYgKHJvd0RlbGltaXRlciA9PT0gJ1xccicgJiYgY2hhcnMuY2hhckF0KG5leHRDaGFyUG9zKSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICByb3dEZWxpbWl0ZXIgKz0gJ1xcbic7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb3dEZWxpbWl0ZXIgPSByb3dEZWxpbWl0ZXI7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGhpcy5jb21tZW50aW5nICYmIGNoYXIgPT09IHRoaXMub3B0aW9ucy5lc2NhcGUpIHtcbiAgICAgIGVzY2FwZUlzUXVvdGUgPSB0aGlzLm9wdGlvbnMuZXNjYXBlID09PSB0aGlzLm9wdGlvbnMucXVvdGU7XG4gICAgICBpc0VzY2FwZSA9IHRoaXMubmV4dENoYXIgPT09IHRoaXMub3B0aW9ucy5lc2NhcGU7XG4gICAgICBpc1F1b3RlID0gdGhpcy5uZXh0Q2hhciA9PT0gdGhpcy5vcHRpb25zLnF1b3RlO1xuICAgICAgaWYgKCEoZXNjYXBlSXNRdW90ZSAmJiAhdGhpcy5maWVsZCAmJiAhdGhpcy5xdW90aW5nKSAmJiAoaXNFc2NhcGUgfHwgaXNRdW90ZSkpIHtcbiAgICAgICAgaSsrO1xuICAgICAgICBjaGFyID0gdGhpcy5uZXh0Q2hhcjtcbiAgICAgICAgdGhpcy5uZXh0Q2hhciA9IGNoYXJzLmNoYXJBdChpICsgMSk7XG4gICAgICAgIHRoaXMuZmllbGQgKz0gY2hhcjtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYXcpIHtcbiAgICAgICAgICB0aGlzLnJhd0J1ZiArPSBjaGFyO1xuICAgICAgICB9XG4gICAgICAgIGkrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGhpcy5jb21tZW50aW5nICYmIGNoYXIgPT09IHRoaXMub3B0aW9ucy5xdW90ZSkge1xuICAgICAgaWYgKHRoaXMucXVvdGluZykge1xuICAgICAgICByZWYxID0gbWF0Y2hfY2hhcnNfd2l0aF9yb3dfZGVsaW1pdGVycyhjaGFycywgaSArIDEpLCBtYXRjaGVkID0gcmVmMS5tYXRjaGVkLCByb3dEZWxpbWl0ZXIgPSByZWYxLnJvd0RlbGltaXRlcjtcbiAgICAgICAgYXJlTmV4dENoYXJzUm93RGVsaW1pdGVycyA9IG1hdGNoZWQ7XG4gICAgICAgIGFyZU5leHRDaGFyc0RlbGltaXRlciA9IGNoYXJzLnN1YnN0cihpICsgMSwgdGhpcy5vcHRpb25zLmRlbGltaXRlci5sZW5ndGgpID09PSB0aGlzLm9wdGlvbnMuZGVsaW1pdGVyO1xuICAgICAgICBpc05leHRDaGFyQUNvbW1lbnQgPSB0aGlzLm5leHRDaGFyID09PSB0aGlzLm9wdGlvbnMuY29tbWVudDtcbiAgICAgICAgaWYgKHRoaXMubmV4dENoYXIgJiYgIWFyZU5leHRDaGFyc1Jvd0RlbGltaXRlcnMgJiYgIWFyZU5leHRDaGFyc0RlbGltaXRlciAmJiAhaXNOZXh0Q2hhckFDb21tZW50KSB7XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWxheCkge1xuICAgICAgICAgICAgdGhpcy5xdW90aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmZpZWxkID0gXCJcIiArIHRoaXMub3B0aW9ucy5xdW90ZSArIHRoaXMuZmllbGQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKFwiSW52YWxpZCBjbG9zaW5nIHF1b3RlIGF0IGxpbmUgXCIgKyAodGhpcy5saW5lcyArIDEpICsgXCI7IGZvdW5kIFwiICsgKEpTT04uc3RyaW5naWZ5KHRoaXMubmV4dENoYXIpKSArIFwiIGluc3RlYWQgb2YgZGVsaW1pdGVyIFwiICsgKEpTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucy5kZWxpbWl0ZXIpKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucXVvdGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuY2xvc2luZ1F1b3RlID0gdGhpcy5vcHRpb25zLnF1b3RlLmxlbmd0aDtcbiAgICAgICAgICBpKys7XG4gICAgICAgICAgaWYgKGVuZCAmJiBpID09PSBsKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmUucHVzaChhdXRvX3BhcnNlKHRoaXMuZmllbGQpKTtcbiAgICAgICAgICAgIHRoaXMuZmllbGQgPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZmllbGQpIHtcbiAgICAgICAgdGhpcy5xdW90aW5nID0gdHJ1ZTtcbiAgICAgICAgaSsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5maWVsZCAmJiAhdGhpcy5vcHRpb25zLnJlbGF4KSB7XG4gICAgICAgIHRocm93IEVycm9yKFwiSW52YWxpZCBvcGVuaW5nIHF1b3RlIGF0IGxpbmUgXCIgKyAodGhpcy5saW5lcyArIDEpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVmMiA9IG1hdGNoX2NoYXJzX3dpdGhfcm93X2RlbGltaXRlcnMoY2hhcnMsIGkpLCBtYXRjaGVkID0gcmVmMi5tYXRjaGVkLCByb3dEZWxpbWl0ZXIgPSByZWYyLnJvd0RlbGltaXRlcjtcbiAgICBpc1Jvd0RlbGltaXRlciA9IG1hdGNoZWQ7XG4gICAgaWYgKGlzUm93RGVsaW1pdGVyIHx8IChlbmQgJiYgaSA9PT0gbCAtIDEpKSB7XG4gICAgICB0aGlzLmxpbmVzKys7XG4gICAgfVxuICAgIHdhc0NvbW1lbnRpbmcgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuY29tbWVudGluZyAmJiAhdGhpcy5xdW90aW5nICYmIHRoaXMub3B0aW9ucy5jb21tZW50ICYmIGNoYXJzLnN1YnN0cihpLCB0aGlzLm9wdGlvbnMuY29tbWVudC5sZW5ndGgpID09PSB0aGlzLm9wdGlvbnMuY29tbWVudCkge1xuICAgICAgdGhpcy5jb21tZW50aW5nID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29tbWVudGluZyAmJiBpc1Jvd0RlbGltaXRlcikge1xuICAgICAgd2FzQ29tbWVudGluZyA9IHRydWU7XG4gICAgICB0aGlzLmNvbW1lbnRpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgaXNEZWxpbWl0ZXIgPSBjaGFycy5zdWJzdHIoaSwgdGhpcy5vcHRpb25zLmRlbGltaXRlci5sZW5ndGgpID09PSB0aGlzLm9wdGlvbnMuZGVsaW1pdGVyO1xuICAgIGlmICghdGhpcy5jb21tZW50aW5nICYmICF0aGlzLnF1b3RpbmcgJiYgKGlzRGVsaW1pdGVyIHx8IGlzUm93RGVsaW1pdGVyKSkge1xuICAgICAgaWYgKGlzUm93RGVsaW1pdGVyICYmIHRoaXMubGluZS5sZW5ndGggPT09IDAgJiYgdGhpcy5maWVsZCA9PT0gJycpIHtcbiAgICAgICAgaWYgKHdhc0NvbW1lbnRpbmcgfHwgdGhpcy5vcHRpb25zLnNraXBfZW1wdHlfbGluZXMpIHtcbiAgICAgICAgICBpZiAocm93RGVsaW1pdGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgIGkgKz0gcm93RGVsaW1pdGVyLmxlbmd0aDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5uZXh0Q2hhciA9IGNoYXJzLmNoYXJBdChpKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJ0cmltKSB7XG4gICAgICAgIGlmICghdGhpcy5jbG9zaW5nUXVvdGUpIHtcbiAgICAgICAgICB0aGlzLmZpZWxkID0gdGhpcy5maWVsZC50cmltUmlnaHQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5saW5lLnB1c2goYXV0b19wYXJzZSh0aGlzLmZpZWxkKSk7XG4gICAgICB0aGlzLmNsb3NpbmdRdW90ZSA9IDA7XG4gICAgICB0aGlzLmZpZWxkID0gJyc7XG4gICAgICBpZiAoaXNEZWxpbWl0ZXIpIHtcbiAgICAgICAgaSArPSB0aGlzLm9wdGlvbnMuZGVsaW1pdGVyLmxlbmd0aDtcbiAgICAgICAgdGhpcy5uZXh0Q2hhciA9IGNoYXJzLmNoYXJBdChpKTtcbiAgICAgICAgaWYgKGVuZCAmJiAhdGhpcy5uZXh0Q2hhcikge1xuICAgICAgICAgIGlzUm93RGVsaW1pdGVyID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmxpbmUucHVzaCgnJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc1Jvd0RlbGltaXRlcikge1xuICAgICAgICB0aGlzLl9fcHVzaCh0aGlzLmxpbmUpO1xuICAgICAgICB0aGlzLmxpbmUgPSBbXTtcbiAgICAgICAgaWYgKHJvd0RlbGltaXRlciAhPSBudWxsKSB7XG4gICAgICAgICAgaSArPSByb3dEZWxpbWl0ZXIubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmV4dENoYXIgPSBjaGFycy5jaGFyQXQoaSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXRoaXMuY29tbWVudGluZyAmJiAhdGhpcy5xdW90aW5nICYmIChjaGFyID09PSAnICcgfHwgY2hhciA9PT0gJ1xcdCcpKSB7XG4gICAgICBpZiAoIShsdHJpbSAmJiAhdGhpcy5maWVsZCkpIHtcbiAgICAgICAgdGhpcy5maWVsZCArPSBjaGFyO1xuICAgICAgfVxuICAgICAgaWYgKGVuZCAmJiBpICsgMSA9PT0gbCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRyaW0gfHwgdGhpcy5vcHRpb25zLnJ0cmltKSB7XG4gICAgICAgICAgdGhpcy5maWVsZCA9IHRoaXMuZmllbGQudHJpbVJpZ2h0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmNvbW1lbnRpbmcpIHtcbiAgICAgIHRoaXMuZmllbGQgKz0gY2hhcjtcbiAgICAgIGkrKztcbiAgICB9IGVsc2Uge1xuICAgICAgaSsrO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY29tbWVudGluZyAmJiB0aGlzLmZpZWxkLmxlbmd0aCA+IHRoaXMub3B0aW9ucy5tYXhfbGltaXRfb25fZGF0YV9yZWFkKSB7XG4gICAgICB0aHJvdyBFcnJvcihcIkRlbGltaXRlciBub3QgZm91bmQgaW4gdGhlIGZpbGUgXCIgKyAoSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zLmRlbGltaXRlcikpKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNvbW1lbnRpbmcgJiYgdGhpcy5saW5lLmxlbmd0aCA+IHRoaXMub3B0aW9ucy5tYXhfbGltaXRfb25fZGF0YV9yZWFkKSB7XG4gICAgICB0aHJvdyBFcnJvcihcIlJvdyBkZWxpbWl0ZXIgbm90IGZvdW5kIGluIHRoZSBmaWxlIFwiICsgKEpTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucy5yb3dEZWxpbWl0ZXIpKSk7XG4gICAgfVxuICB9XG4gIGlmIChlbmQpIHtcbiAgICBydHJpbWVkID0gZmFsc2U7XG4gICAgaWYgKHJ0cmltICYmICF0aGlzLmNsb3NpbmdRdW90ZSAmJiAhaXNEZWxpbWl0ZXIpIHtcbiAgICAgIHRoaXMuZmllbGQgPSB0aGlzLmZpZWxkLnRyaW1SaWdodCgpO1xuICAgICAgcnRyaW1lZCA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLmZpZWxkICE9PSAnJyB8fCBydHJpbWVkKSB7XG4gICAgICBpZiAoISh0aGlzLmZpZWxkID09PSAnJyAmJiB0aGlzLm9wdGlvbnMuc2tpcF9lbXB0eV9saW5lcykpIHtcbiAgICAgICAgdGhpcy5saW5lLnB1c2goYXV0b19wYXJzZSh0aGlzLmZpZWxkKSk7XG4gICAgICB9XG4gICAgICB0aGlzLmZpZWxkID0gJyc7XG4gICAgfVxuICAgIGlmICh0aGlzLmZpZWxkLmxlbmd0aCA+IHRoaXMub3B0aW9ucy5tYXhfbGltaXRfb25fZGF0YV9yZWFkKSB7XG4gICAgICB0aHJvdyBFcnJvcihcIkRlbGltaXRlciBub3QgZm91bmQgaW4gdGhlIGZpbGUgXCIgKyAoSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zLmRlbGltaXRlcikpKTtcbiAgICB9XG4gICAgaWYgKGwgPT09IDApIHtcbiAgICAgIHRoaXMubGluZXMrKztcbiAgICB9XG4gICAgaWYgKHRoaXMubGluZS5sZW5ndGggPiB0aGlzLm9wdGlvbnMubWF4X2xpbWl0X29uX2RhdGFfcmVhZCkge1xuICAgICAgdGhyb3cgRXJyb3IoXCJSb3cgZGVsaW1pdGVyIG5vdCBmb3VuZCBpbiB0aGUgZmlsZSBcIiArIChKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnMucm93RGVsaW1pdGVyKSkpO1xuICAgIH1cbiAgfVxuICB0aGlzLmJ1ZiA9ICcnO1xuICByZXN1bHRzID0gW107XG4gIHdoaWxlIChpIDwgbCkge1xuICAgIHRoaXMuYnVmICs9IGNoYXJzLmNoYXJBdChpKTtcbiAgICByZXN1bHRzLnB1c2goaSsrKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0cztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY3N2LXBhcnNlL2xpYi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTgxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 582 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(global) {/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n * @license  MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = __webpack_require__(583)\nvar ieee754 = __webpack_require__(584)\nvar isArray = __webpack_require__(585)\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n *     incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n  ? global.TYPED_ARRAY_SUPPORT\n  : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n  try {\n    var arr = new Uint8Array(1)\n    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n    return arr.foo() === 42 && // typed array instances can be augmented\n        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n  } catch (e) {\n    return false\n  }\n}\n\nfunction kMaxLength () {\n  return Buffer.TYPED_ARRAY_SUPPORT\n    ? 0x7fffffff\n    : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n  if (kMaxLength() < length) {\n    throw new RangeError('Invalid typed array length')\n  }\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = new Uint8Array(length)\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    if (that === null) {\n      that = new Buffer(length)\n    }\n    that.length = length\n  }\n\n  return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n  if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n    return new Buffer(arg, encodingOrOffset, length)\n  }\n\n  // Common case.\n  if (typeof arg === 'number') {\n    if (typeof encodingOrOffset === 'string') {\n      throw new Error(\n        'If encoding is specified then the first argument must be a string'\n      )\n    }\n    return allocUnsafe(this, arg)\n  }\n  return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n  arr.__proto__ = Buffer.prototype\n  return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n  if (typeof value === 'number') {\n    throw new TypeError('\"value\" argument must not be a number')\n  }\n\n  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n    return fromArrayBuffer(that, value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'string') {\n    return fromString(that, value, encodingOrOffset)\n  }\n\n  return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n  return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n  Buffer.prototype.__proto__ = Uint8Array.prototype\n  Buffer.__proto__ = Uint8Array\n  if (typeof Symbol !== 'undefined' && Symbol.species &&\n      Buffer[Symbol.species] === Buffer) {\n    // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n    Object.defineProperty(Buffer, Symbol.species, {\n      value: null,\n      configurable: true\n    })\n  }\n}\n\nfunction assertSize (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be a number')\n  } else if (size < 0) {\n    throw new RangeError('\"size\" argument must not be negative')\n  }\n}\n\nfunction alloc (that, size, fill, encoding) {\n  assertSize(size)\n  if (size <= 0) {\n    return createBuffer(that, size)\n  }\n  if (fill !== undefined) {\n    // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpretted as a start offset.\n    return typeof encoding === 'string'\n      ? createBuffer(that, size).fill(fill, encoding)\n      : createBuffer(that, size).fill(fill)\n  }\n  return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n  return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n  assertSize(size)\n  that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) {\n    for (var i = 0; i < size; ++i) {\n      that[i] = 0\n    }\n  }\n  return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n  return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n  return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('\"encoding\" must be a valid string encoding')\n  }\n\n  var length = byteLength(string, encoding) | 0\n  that = createBuffer(that, length)\n\n  var actual = that.write(string, encoding)\n\n  if (actual !== length) {\n    // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    that = that.slice(0, actual)\n  }\n\n  return that\n}\n\nfunction fromArrayLike (that, array) {\n  var length = array.length < 0 ? 0 : checked(array.length) | 0\n  that = createBuffer(that, length)\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n  array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n  if (byteOffset < 0 || array.byteLength < byteOffset) {\n    throw new RangeError('\\'offset\\' is out of bounds')\n  }\n\n  if (array.byteLength < byteOffset + (length || 0)) {\n    throw new RangeError('\\'length\\' is out of bounds')\n  }\n\n  if (byteOffset === undefined && length === undefined) {\n    array = new Uint8Array(array)\n  } else if (length === undefined) {\n    array = new Uint8Array(array, byteOffset)\n  } else {\n    array = new Uint8Array(array, byteOffset, length)\n  }\n\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = array\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    that = fromArrayLike(that, array)\n  }\n  return that\n}\n\nfunction fromObject (that, obj) {\n  if (Buffer.isBuffer(obj)) {\n    var len = checked(obj.length) | 0\n    that = createBuffer(that, len)\n\n    if (that.length === 0) {\n      return that\n    }\n\n    obj.copy(that, 0, 0, len)\n    return that\n  }\n\n  if (obj) {\n    if ((typeof ArrayBuffer !== 'undefined' &&\n        obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n      if (typeof obj.length !== 'number' || isnan(obj.length)) {\n        return createBuffer(that, 0)\n      }\n      return fromArrayLike(that, obj)\n    }\n\n    if (obj.type === 'Buffer' && isArray(obj.data)) {\n      return fromArrayLike(that, obj.data)\n    }\n  }\n\n  throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < kMaxLength()` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= kMaxLength()) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + kMaxLength().toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (length) {\n  if (+length != length) { // eslint-disable-line eqeqeq\n    length = 0\n  }\n  return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError('Arguments must be Buffers')\n  }\n\n  if (a === b) return 0\n\n  var x = a.length\n  var y = b.length\n\n  for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i]\n      y = b[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'latin1':\n    case 'binary':\n    case 'base64':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!isArray(list)) {\n    throw new TypeError('\"list\" argument must be an Array of Buffers')\n  }\n\n  if (list.length === 0) {\n    return Buffer.alloc(0)\n  }\n\n  var i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; ++i) {\n      length += list[i].length\n    }\n  }\n\n  var buffer = Buffer.allocUnsafe(length)\n  var pos = 0\n  for (i = 0; i < list.length; ++i) {\n    var buf = list[i]\n    if (!Buffer.isBuffer(buf)) {\n      throw new TypeError('\"list\" argument must be an Array of Buffers')\n    }\n    buf.copy(buffer, pos)\n    pos += buf.length\n  }\n  return buffer\n}\n\nfunction byteLength (string, encoding) {\n  if (Buffer.isBuffer(string)) {\n    return string.length\n  }\n  if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n      (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n    return string.byteLength\n  }\n  if (typeof string !== 'string') {\n    string = '' + string\n  }\n\n  var len = string.length\n  if (len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'latin1':\n      case 'binary':\n        return len\n      case 'utf8':\n      case 'utf-8':\n      case undefined:\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) return utf8ToBytes(string).length // assume utf8\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n  var loweredCase = false\n\n  // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n  // property of a typed array.\n\n  // This behaves neither like String nor Uint8Array in that we set start/end\n  // to their upper/lower bounds if the value passed is out of range.\n  // undefined is handled specially as per ECMA-262 6th Edition,\n  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n  if (start === undefined || start < 0) {\n    start = 0\n  }\n  // Return early if start > this.length. Done here to prevent potential uint32\n  // coercion fail below.\n  if (start > this.length) {\n    return ''\n  }\n\n  if (end === undefined || end > this.length) {\n    end = this.length\n  }\n\n  if (end <= 0) {\n    return ''\n  }\n\n  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n  end >>>= 0\n  start >>>= 0\n\n  if (end <= start) {\n    return ''\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Slice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n  var i = b[n]\n  b[n] = b[m]\n  b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n  var len = this.length\n  if (len % 2 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 16-bits')\n  }\n  for (var i = 0; i < len; i += 2) {\n    swap(this, i, i + 1)\n  }\n  return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n  var len = this.length\n  if (len % 4 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 32-bits')\n  }\n  for (var i = 0; i < len; i += 4) {\n    swap(this, i, i + 3)\n    swap(this, i + 1, i + 2)\n  }\n  return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n  var len = this.length\n  if (len % 8 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 64-bits')\n  }\n  for (var i = 0; i < len; i += 8) {\n    swap(this, i, i + 7)\n    swap(this, i + 1, i + 6)\n    swap(this, i + 2, i + 5)\n    swap(this, i + 3, i + 4)\n  }\n  return this\n}\n\nBuffer.prototype.toString = function toString () {\n  var length = this.length | 0\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  var str = ''\n  var max = exports.INSPECT_MAX_BYTES\n  if (this.length > 0) {\n    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n    if (this.length > max) str += ' ... '\n  }\n  return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n  if (!Buffer.isBuffer(target)) {\n    throw new TypeError('Argument must be a Buffer')\n  }\n\n  if (start === undefined) {\n    start = 0\n  }\n  if (end === undefined) {\n    end = target ? target.length : 0\n  }\n  if (thisStart === undefined) {\n    thisStart = 0\n  }\n  if (thisEnd === undefined) {\n    thisEnd = this.length\n  }\n\n  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n    throw new RangeError('out of range index')\n  }\n\n  if (thisStart >= thisEnd && start >= end) {\n    return 0\n  }\n  if (thisStart >= thisEnd) {\n    return -1\n  }\n  if (start >= end) {\n    return 1\n  }\n\n  start >>>= 0\n  end >>>= 0\n  thisStart >>>= 0\n  thisEnd >>>= 0\n\n  if (this === target) return 0\n\n  var x = thisEnd - thisStart\n  var y = end - start\n  var len = Math.min(x, y)\n\n  var thisCopy = this.slice(thisStart, thisEnd)\n  var targetCopy = target.slice(start, end)\n\n  for (var i = 0; i < len; ++i) {\n    if (thisCopy[i] !== targetCopy[i]) {\n      x = thisCopy[i]\n      y = targetCopy[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n  // Empty buffer means no match\n  if (buffer.length === 0) return -1\n\n  // Normalize byteOffset\n  if (typeof byteOffset === 'string') {\n    encoding = byteOffset\n    byteOffset = 0\n  } else if (byteOffset > 0x7fffffff) {\n    byteOffset = 0x7fffffff\n  } else if (byteOffset < -0x80000000) {\n    byteOffset = -0x80000000\n  }\n  byteOffset = +byteOffset  // Coerce to Number.\n  if (isNaN(byteOffset)) {\n    // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : (buffer.length - 1)\n  }\n\n  // Normalize byteOffset: negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n  if (byteOffset >= buffer.length) {\n    if (dir) return -1\n    else byteOffset = buffer.length - 1\n  } else if (byteOffset < 0) {\n    if (dir) byteOffset = 0\n    else return -1\n  }\n\n  // Normalize val\n  if (typeof val === 'string') {\n    val = Buffer.from(val, encoding)\n  }\n\n  // Finally, search either indexOf (if dir is true) or lastIndexOf\n  if (Buffer.isBuffer(val)) {\n    // Special case: looking for empty string/buffer always fails\n    if (val.length === 0) {\n      return -1\n    }\n    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n  } else if (typeof val === 'number') {\n    val = val & 0xFF // Search for a byte value [0-255]\n    if (Buffer.TYPED_ARRAY_SUPPORT &&\n        typeof Uint8Array.prototype.indexOf === 'function') {\n      if (dir) {\n        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n      } else {\n        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n      }\n    }\n    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n  var indexSize = 1\n  var arrLength = arr.length\n  var valLength = val.length\n\n  if (encoding !== undefined) {\n    encoding = String(encoding).toLowerCase()\n    if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n        encoding === 'utf16le' || encoding === 'utf-16le') {\n      if (arr.length < 2 || val.length < 2) {\n        return -1\n      }\n      indexSize = 2\n      arrLength /= 2\n      valLength /= 2\n      byteOffset /= 2\n    }\n  }\n\n  function read (buf, i) {\n    if (indexSize === 1) {\n      return buf[i]\n    } else {\n      return buf.readUInt16BE(i * indexSize)\n    }\n  }\n\n  var i\n  if (dir) {\n    var foundIndex = -1\n    for (i = byteOffset; i < arrLength; i++) {\n      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n      } else {\n        if (foundIndex !== -1) i -= i - foundIndex\n        foundIndex = -1\n      }\n    }\n  } else {\n    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n    for (i = byteOffset; i >= 0; i--) {\n      var found = true\n      for (var j = 0; j < valLength; j++) {\n        if (read(arr, i + j) !== read(val, j)) {\n          found = false\n          break\n        }\n      }\n      if (found) return i\n    }\n  }\n\n  return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n  return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  var remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  // must be an even number of digits\n  var strLen = string.length\n  if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  for (var i = 0; i < length; ++i) {\n    var parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (isNaN(parsed)) return i\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n  return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset | 0\n    if (isFinite(length)) {\n      length = length | 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  // legacy write(string, encoding, offset, length) - remove in v0.13\n  } else {\n    throw new Error(\n      'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n    )\n  }\n\n  var remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('Attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n        return asciiWrite(this, string, offset, length)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Write(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  var res = []\n\n  var i = start\n  while (i < end) {\n    var firstByte = buf[i]\n    var codePoint = null\n    var bytesPerSequence = (firstByte > 0xEF) ? 4\n      : (firstByte > 0xDF) ? 3\n      : (firstByte > 0xBF) ? 2\n      : 1\n\n    if (i + bytesPerSequence <= end) {\n      var secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  var len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  var res = ''\n  var i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  var len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  var out = ''\n  for (var i = start; i < end; ++i) {\n    out += toHex(buf[i])\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  var bytes = buf.slice(start, end)\n  var res = ''\n  for (var i = 0; i < bytes.length; i += 2) {\n    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  var len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  var newBuf\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    newBuf = this.subarray(start, end)\n    newBuf.__proto__ = Buffer.prototype\n  } else {\n    var sliceLen = end - start\n    newBuf = new Buffer(sliceLen, undefined)\n    for (var i = 0; i < sliceLen; ++i) {\n      newBuf[i] = this[i + start]\n    }\n  }\n\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  var val = this[offset + --byteLength]\n  var mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var i = byteLength\n  var mul = 1\n  var val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var mul = 1\n  var i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n      (littleEndian ? i : 1 - i) * 8\n  }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffffffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n  }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset + 3] = (value >>> 24)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 1] = (value >>> 8)\n    this[offset] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = 0\n  var mul = 1\n  var sub = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  var sub = 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 3] = (value >>> 24)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n  if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  var len = end - start\n  var i\n\n  if (this === target && start < targetStart && targetStart < end) {\n    // descending copy from end\n    for (i = len - 1; i >= 0; --i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n    // ascending copy from start\n    for (i = 0; i < len; ++i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else {\n    Uint8Array.prototype.set.call(\n      target,\n      this.subarray(start, start + len),\n      targetStart\n    )\n  }\n\n  return len\n}\n\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n  // Handle string cases:\n  if (typeof val === 'string') {\n    if (typeof start === 'string') {\n      encoding = start\n      start = 0\n      end = this.length\n    } else if (typeof end === 'string') {\n      encoding = end\n      end = this.length\n    }\n    if (val.length === 1) {\n      var code = val.charCodeAt(0)\n      if (code < 256) {\n        val = code\n      }\n    }\n    if (encoding !== undefined && typeof encoding !== 'string') {\n      throw new TypeError('encoding must be a string')\n    }\n    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n      throw new TypeError('Unknown encoding: ' + encoding)\n    }\n  } else if (typeof val === 'number') {\n    val = val & 255\n  }\n\n  // Invalid ranges are not set to a default, so can range check early.\n  if (start < 0 || this.length < start || this.length < end) {\n    throw new RangeError('Out of range index')\n  }\n\n  if (end <= start) {\n    return this\n  }\n\n  start = start >>> 0\n  end = end === undefined ? this.length : end >>> 0\n\n  if (!val) val = 0\n\n  var i\n  if (typeof val === 'number') {\n    for (i = start; i < end; ++i) {\n      this[i] = val\n    }\n  } else {\n    var bytes = Buffer.isBuffer(val)\n      ? val\n      : utf8ToBytes(new Buffer(val, encoding).toString())\n    var len = bytes.length\n    for (i = 0; i < end - start; ++i) {\n      this[i + start] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction stringtrim (str) {\n  if (str.trim) return str.trim()\n  return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n  if (n < 16) return '0' + n.toString(16)\n  return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  var codePoint\n  var length = string.length\n  var leadSurrogate = null\n  var bytes = []\n\n  for (var i = 0; i < length; ++i) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  var c, hi, lo\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  for (var i = 0; i < length; ++i) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\nfunction isnan (val) {\n  return val !== val // eslint-disable-line no-self-compare\n}\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTgyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy93ZWJwYWNrL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCdiYXNlNjQtanMnKVxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbi8qXG4gKiBFeHBvcnQga01heExlbmd0aCBhZnRlciB0eXBlZCBhcnJheSBzdXBwb3J0IGlzIGRldGVybWluZWQuXG4gKi9cbmV4cG9ydHMua01heExlbmd0aCA9IGtNYXhMZW5ndGgoKVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgYXJyLl9fcHJvdG9fXyA9IHtfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLCBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH19XG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDIgJiYgLy8gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWRcbiAgICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBjaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgICAgICAgYXJyLnN1YmFycmF5KDEsIDEpLmJ5dGVMZW5ndGggPT09IDAgLy8gaWUxMCBoYXMgYnJva2VuIGBzdWJhcnJheWBcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGggKCkge1xuICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgICA/IDB4N2ZmZmZmZmZcbiAgICA6IDB4M2ZmZmZmZmZcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKGtNYXhMZW5ndGgoKSA8IGxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpXG4gIH1cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgaWYgKHRoYXQgPT09IG51bGwpIHtcbiAgICAgIHRoYXQgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgICB9XG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZydcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHRoaXMsIGFyZylcbiAgfVxuICByZXR1cm4gZnJvbSh0aGlzLCBhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbi8vIFRPRE86IExlZ2FjeSwgbm90IG5lZWRlZCBhbnltb3JlLiBSZW1vdmUgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLlxuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gKGFycikge1xuICBhcnIuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIGZyb20gKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbShudWxsLCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5pZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgJiZcbiAgICAgIEJ1ZmZlcltTeW1ib2wuc3BlY2llc10gPT09IEJ1ZmZlcikge1xuICAgIC8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKG51bGwsIHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAodGhhdCwgc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgdGhhdCA9IHRoYXQuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBhcnJheS5ieXRlTGVuZ3RoIC8vIHRoaXMgdGhyb3dzIGlmIGBhcnJheWAgaXMgbm90IGEgdmFsaWQgQXJyYXlCdWZmZXJcblxuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnb2Zmc2V0XFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdsZW5ndGhcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IGFycmF5XG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbilcblxuICAgIGlmICh0aGF0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoYXRcbiAgICB9XG5cbiAgICBvYmouY29weSh0aGF0LCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIHRoYXRcbiAgfVxuXG4gIGlmIChvYmopIHtcbiAgICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fCAnbGVuZ3RoJyBpbiBvYmopIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgaXNuYW4ob2JqLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCAwKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKVxuICAgIH1cblxuICAgIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iai5kYXRhKVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4nKVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwga01heExlbmd0aCgpYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH1cbiAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBzdHJpbmcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZ1xuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCBhbmQgYGlzLWJ1ZmZlcmAgKGluIFNhZmFyaSA1LTcpIHRvIGRldGVjdFxuLy8gQnVmZmVyIGluc3RhbmNlcy5cbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKGlzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiZcbiAgICAgICAgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChzdHJMZW4gJSAyICE9PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZlxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gICAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydFxuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyArK2kpIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG4gIHZhciBpXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDAgfHwgIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gYXNjZW5kaW5nIGNvcHkgZnJvbSBzdGFydFxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApXG4gICAgICBpZiAoY29kZSA8IDI1Nikge1xuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBpc25hbiAodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IHZhbCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gKHdlYnBhY2spL34vYnVmZmVyL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA1ODJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 583 */
/***/ function(module, exports) {

    eval("'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction placeHoldersCount (b64) {\n  var len = b64.length\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // the number of equal signs (place holders)\n  // if there are two placeholders, than the two characters before it\n  // represent one byte\n  // if there is only one, then the three characters before it represent 2 bytes\n  // this is just a cheap hack to not do indexOf twice\n  return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0\n}\n\nfunction byteLength (b64) {\n  // base64 is 4/3 + up to two characters of the original data\n  return b64.length * 3 / 4 - placeHoldersCount(b64)\n}\n\nfunction toByteArray (b64) {\n  var i, j, l, tmp, placeHolders, arr\n  var len = b64.length\n  placeHolders = placeHoldersCount(b64)\n\n  arr = new Arr(len * 3 / 4 - placeHolders)\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  l = placeHolders > 0 ? len - 4 : len\n\n  var L = 0\n\n  for (i = 0, j = 0; i < l; i += 4, j += 3) {\n    tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]\n    arr[L++] = (tmp >> 16) & 0xFF\n    arr[L++] = (tmp >> 8) & 0xFF\n    arr[L++] = tmp & 0xFF\n  }\n\n  if (placeHolders === 2) {\n    tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[L++] = tmp & 0xFF\n  } else if (placeHolders === 1) {\n    tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[L++] = (tmp >> 8) & 0xFF\n    arr[L++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var output = ''\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    output += lookup[tmp >> 2]\n    output += lookup[(tmp << 4) & 0x3F]\n    output += '=='\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + (uint8[len - 1])\n    output += lookup[tmp >> 10]\n    output += lookup[(tmp >> 4) & 0x3F]\n    output += lookup[(tmp << 2) & 0x3F]\n    output += '='\n  }\n\n  parts.push(output)\n\n  return parts.join('')\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTgzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy93ZWJwYWNrL25vZGVfbW9kdWxlcy9iYXNlNjQtanMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydHMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcbmV4cG9ydHMudG9CeXRlQXJyYXkgPSB0b0J5dGVBcnJheVxuZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gZnJvbUJ5dGVBcnJheVxuXG52YXIgbG9va3VwID0gW11cbnZhciByZXZMb29rdXAgPSBbXVxudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheVxuXG52YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgbG9va3VwW2ldID0gY29kZVtpXVxuICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGlcbn1cblxucmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyXG5yZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjNcblxuZnVuY3Rpb24gcGxhY2VIb2xkZXJzQ291bnQgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKVxuICB9XG5cbiAgLy8gdGhlIG51bWJlciBvZiBlcXVhbCBzaWducyAocGxhY2UgaG9sZGVycylcbiAgLy8gaWYgdGhlcmUgYXJlIHR3byBwbGFjZWhvbGRlcnMsIHRoYW4gdGhlIHR3byBjaGFyYWN0ZXJzIGJlZm9yZSBpdFxuICAvLyByZXByZXNlbnQgb25lIGJ5dGVcbiAgLy8gaWYgdGhlcmUgaXMgb25seSBvbmUsIHRoZW4gdGhlIHRocmVlIGNoYXJhY3RlcnMgYmVmb3JlIGl0IHJlcHJlc2VudCAyIGJ5dGVzXG4gIC8vIHRoaXMgaXMganVzdCBhIGNoZWFwIGhhY2sgdG8gbm90IGRvIGluZGV4T2YgdHdpY2VcbiAgcmV0dXJuIGI2NFtsZW4gLSAyXSA9PT0gJz0nID8gMiA6IGI2NFtsZW4gLSAxXSA9PT0gJz0nID8gMSA6IDBcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoYjY0KSB7XG4gIC8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuICByZXR1cm4gYjY0Lmxlbmd0aCAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzQ291bnQoYjY0KVxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciBpLCBqLCBsLCB0bXAsIHBsYWNlSG9sZGVycywgYXJyXG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG4gIHBsYWNlSG9sZGVycyA9IHBsYWNlSG9sZGVyc0NvdW50KGI2NClcblxuICBhcnIgPSBuZXcgQXJyKGxlbiAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzKVxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgbCA9IHBsYWNlSG9sZGVycyA+IDAgPyBsZW4gLSA0IDogbGVuXG5cbiAgdmFyIEwgPSAwXG5cbiAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBsOyBpICs9IDQsIGogKz0gMykge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltMKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVycyA9PT0gMikge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICsgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICsgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gKyBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID0gKHVpbnQ4W2ldIDw8IDE2KSArICh1aW50OFtpICsgMV0gPDwgOCkgKyAodWludDhbaSArIDJdKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgb3V0cHV0ID0gJydcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDJdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gJz09J1xuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyAodWludDhbbGVuIC0gMV0pXG4gICAgb3V0cHV0ICs9IGxvb2t1cFt0bXAgPj4gMTBdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXVxuICAgIG91dHB1dCArPSAnPSdcbiAgfVxuXG4gIHBhcnRzLnB1c2gob3V0cHV0KVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gKHdlYnBhY2spL34vYmFzZTY0LWpzL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA1ODNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 584 */
/***/ function(module, exports) {

    eval("exports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = nBytes * 8 - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = nBytes * 8 - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = (value * c - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTg0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IGUgKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKHZhbHVlICogYyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2llZWU3NTQvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDU4NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 585 */
/***/ function(module, exports) {

    eval("var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTg1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2lzYXJyYXkvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDU4NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 586 */
/***/ function(module, exports, __webpack_require__) {

    eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nmodule.exports = Stream;\n\nvar EE = __webpack_require__(587).EventEmitter;\nvar inherits = __webpack_require__(440);\n\ninherits(Stream, EE);\nStream.Readable = __webpack_require__(588);\nStream.Writable = __webpack_require__(603);\nStream.Duplex = __webpack_require__(604);\nStream.Transform = __webpack_require__(605);\nStream.PassThrough = __webpack_require__(606);\n\n// Backwards-compat with node 0.4.x\nStream.Stream = Stream;\n\n\n\n// old-style streams.  Note that the pipe method (the only relevant\n// part of this class) is overridden in the Readable class.\n\nfunction Stream() {\n  EE.call(this);\n}\n\nStream.prototype.pipe = function(dest, options) {\n  var source = this;\n\n  function ondata(chunk) {\n    if (dest.writable) {\n      if (false === dest.write(chunk) && source.pause) {\n        source.pause();\n      }\n    }\n  }\n\n  source.on('data', ondata);\n\n  function ondrain() {\n    if (source.readable && source.resume) {\n      source.resume();\n    }\n  }\n\n  dest.on('drain', ondrain);\n\n  // If the 'end' option is not supplied, dest.end() will be called when\n  // source gets the 'end' or 'close' events.  Only dest.end() once.\n  if (!dest._isStdio && (!options || options.end !== false)) {\n    source.on('end', onend);\n    source.on('close', onclose);\n  }\n\n  var didOnEnd = false;\n  function onend() {\n    if (didOnEnd) return;\n    didOnEnd = true;\n\n    dest.end();\n  }\n\n\n  function onclose() {\n    if (didOnEnd) return;\n    didOnEnd = true;\n\n    if (typeof dest.destroy === 'function') dest.destroy();\n  }\n\n  // don't leave dangling pipes when there are errors.\n  function onerror(er) {\n    cleanup();\n    if (EE.listenerCount(this, 'error') === 0) {\n      throw er; // Unhandled stream error in pipe.\n    }\n  }\n\n  source.on('error', onerror);\n  dest.on('error', onerror);\n\n  // remove all the event listeners that were added.\n  function cleanup() {\n    source.removeListener('data', ondata);\n    dest.removeListener('drain', ondrain);\n\n    source.removeListener('end', onend);\n    source.removeListener('close', onclose);\n\n    source.removeListener('error', onerror);\n    dest.removeListener('error', onerror);\n\n    source.removeListener('end', cleanup);\n    source.removeListener('close', cleanup);\n\n    dest.removeListener('close', cleanup);\n  }\n\n  source.on('end', cleanup);\n  source.on('close', cleanup);\n\n  dest.on('close', cleanup);\n\n  dest.emit('pipe', source);\n\n  // Allow for unix-like usage: A.pipe(B).pipe(C)\n  return dest;\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTg2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxubW9kdWxlLmV4cG9ydHMgPSBTdHJlYW07XG5cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmluaGVyaXRzKFN0cmVhbSwgRUUpO1xuU3RyZWFtLlJlYWRhYmxlID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL3JlYWRhYmxlLmpzJyk7XG5TdHJlYW0uV3JpdGFibGUgPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0vd3JpdGFibGUuanMnKTtcblN0cmVhbS5EdXBsZXggPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0vZHVwbGV4LmpzJyk7XG5TdHJlYW0uVHJhbnNmb3JtID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL3RyYW5zZm9ybS5qcycpO1xuU3RyZWFtLlBhc3NUaHJvdWdoID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL3Bhc3N0aHJvdWdoLmpzJyk7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuNC54XG5TdHJlYW0uU3RyZWFtID0gU3RyZWFtO1xuXG5cblxuLy8gb2xkLXN0eWxlIHN0cmVhbXMuICBOb3RlIHRoYXQgdGhlIHBpcGUgbWV0aG9kICh0aGUgb25seSByZWxldmFudFxuLy8gcGFydCBvZiB0aGlzIGNsYXNzKSBpcyBvdmVycmlkZGVuIGluIHRoZSBSZWFkYWJsZSBjbGFzcy5cblxuZnVuY3Rpb24gU3RyZWFtKCkge1xuICBFRS5jYWxsKHRoaXMpO1xufVxuXG5TdHJlYW0ucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbihkZXN0LCBvcHRpb25zKSB7XG4gIHZhciBzb3VyY2UgPSB0aGlzO1xuXG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGlmIChkZXN0LndyaXRhYmxlKSB7XG4gICAgICBpZiAoZmFsc2UgPT09IGRlc3Qud3JpdGUoY2h1bmspICYmIHNvdXJjZS5wYXVzZSkge1xuICAgICAgICBzb3VyY2UucGF1c2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzb3VyY2Uub24oJ2RhdGEnLCBvbmRhdGEpO1xuXG4gIGZ1bmN0aW9uIG9uZHJhaW4oKSB7XG4gICAgaWYgKHNvdXJjZS5yZWFkYWJsZSAmJiBzb3VyY2UucmVzdW1lKSB7XG4gICAgICBzb3VyY2UucmVzdW1lKCk7XG4gICAgfVxuICB9XG5cbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICAvLyBJZiB0aGUgJ2VuZCcgb3B0aW9uIGlzIG5vdCBzdXBwbGllZCwgZGVzdC5lbmQoKSB3aWxsIGJlIGNhbGxlZCB3aGVuXG4gIC8vIHNvdXJjZSBnZXRzIHRoZSAnZW5kJyBvciAnY2xvc2UnIGV2ZW50cy4gIE9ubHkgZGVzdC5lbmQoKSBvbmNlLlxuICBpZiAoIWRlc3QuX2lzU3RkaW8gJiYgKCFvcHRpb25zIHx8IG9wdGlvbnMuZW5kICE9PSBmYWxzZSkpIHtcbiAgICBzb3VyY2Uub24oJ2VuZCcsIG9uZW5kKTtcbiAgICBzb3VyY2Uub24oJ2Nsb3NlJywgb25jbG9zZSk7XG4gIH1cblxuICB2YXIgZGlkT25FbmQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm47XG4gICAgZGlkT25FbmQgPSB0cnVlO1xuXG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBpZiAoZGlkT25FbmQpIHJldHVybjtcbiAgICBkaWRPbkVuZCA9IHRydWU7XG5cbiAgICBpZiAodHlwZW9mIGRlc3QuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgZGVzdC5kZXN0cm95KCk7XG4gIH1cblxuICAvLyBkb24ndCBsZWF2ZSBkYW5nbGluZyBwaXBlcyB3aGVuIHRoZXJlIGFyZSBlcnJvcnMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBjbGVhbnVwKCk7XG4gICAgaWYgKEVFLmxpc3RlbmVyQ291bnQodGhpcywgJ2Vycm9yJykgPT09IDApIHtcbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgc3RyZWFtIGVycm9yIGluIHBpcGUuXG4gICAgfVxuICB9XG5cbiAgc291cmNlLm9uKCdlcnJvcicsIG9uZXJyb3IpO1xuICBkZXN0Lm9uKCdlcnJvcicsIG9uZXJyb3IpO1xuXG4gIC8vIHJlbW92ZSBhbGwgdGhlIGV2ZW50IGxpc3RlbmVycyB0aGF0IHdlcmUgYWRkZWQuXG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG5cbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBjbGVhbnVwKTtcblxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgY2xlYW51cCk7XG4gIH1cblxuICBzb3VyY2Uub24oJ2VuZCcsIGNsZWFudXApO1xuICBzb3VyY2Uub24oJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgZGVzdC5vbignY2xvc2UnLCBjbGVhbnVwKTtcblxuICBkZXN0LmVtaXQoJ3BpcGUnLCBzb3VyY2UpO1xuXG4gIC8vIEFsbG93IGZvciB1bml4LWxpa2UgdXNhZ2U6IEEucGlwZShCKS5waXBlKEMpXG4gIHJldHVybiBkZXN0O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9zdHJlYW0tYnJvd3NlcmlmeS9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTg2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 587 */
/***/ function(module, exports) {

    eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n  this._events = this._events || {};\n  this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n  if (!isNumber(n) || n < 0 || isNaN(n))\n    throw TypeError('n must be a positive number');\n  this._maxListeners = n;\n  return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n  var er, handler, len, args, i, listeners;\n\n  if (!this._events)\n    this._events = {};\n\n  // If there is no 'error' event listener then throw.\n  if (type === 'error') {\n    if (!this._events.error ||\n        (isObject(this._events.error) && !this._events.error.length)) {\n      er = arguments[1];\n      if (er instanceof Error) {\n        throw er; // Unhandled 'error' event\n      } else {\n        // At least give some kind of context to the user\n        var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n        err.context = er;\n        throw err;\n      }\n    }\n  }\n\n  handler = this._events[type];\n\n  if (isUndefined(handler))\n    return false;\n\n  if (isFunction(handler)) {\n    switch (arguments.length) {\n      // fast cases\n      case 1:\n        handler.call(this);\n        break;\n      case 2:\n        handler.call(this, arguments[1]);\n        break;\n      case 3:\n        handler.call(this, arguments[1], arguments[2]);\n        break;\n      // slower\n      default:\n        args = Array.prototype.slice.call(arguments, 1);\n        handler.apply(this, args);\n    }\n  } else if (isObject(handler)) {\n    args = Array.prototype.slice.call(arguments, 1);\n    listeners = handler.slice();\n    len = listeners.length;\n    for (i = 0; i < len; i++)\n      listeners[i].apply(this, args);\n  }\n\n  return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n  var m;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events)\n    this._events = {};\n\n  // To avoid recursion in the case that type === \"newListener\"! Before\n  // adding it to the listeners, first emit \"newListener\".\n  if (this._events.newListener)\n    this.emit('newListener', type,\n              isFunction(listener.listener) ?\n              listener.listener : listener);\n\n  if (!this._events[type])\n    // Optimize the case of one listener. Don't need the extra array object.\n    this._events[type] = listener;\n  else if (isObject(this._events[type]))\n    // If we've already got an array, just append.\n    this._events[type].push(listener);\n  else\n    // Adding the second element, need to change to array.\n    this._events[type] = [this._events[type], listener];\n\n  // Check for listener leak\n  if (isObject(this._events[type]) && !this._events[type].warned) {\n    if (!isUndefined(this._maxListeners)) {\n      m = this._maxListeners;\n    } else {\n      m = EventEmitter.defaultMaxListeners;\n    }\n\n    if (m && m > 0 && this._events[type].length > m) {\n      this._events[type].warned = true;\n      console.error('(node) warning: possible EventEmitter memory ' +\n                    'leak detected. %d listeners added. ' +\n                    'Use emitter.setMaxListeners() to increase limit.',\n                    this._events[type].length);\n      if (typeof console.trace === 'function') {\n        // not supported in IE 10\n        console.trace();\n      }\n    }\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  var fired = false;\n\n  function g() {\n    this.removeListener(type, g);\n\n    if (!fired) {\n      fired = true;\n      listener.apply(this, arguments);\n    }\n  }\n\n  g.listener = listener;\n  this.on(type, g);\n\n  return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n  var list, position, length, i;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events || !this._events[type])\n    return this;\n\n  list = this._events[type];\n  length = list.length;\n  position = -1;\n\n  if (list === listener ||\n      (isFunction(list.listener) && list.listener === listener)) {\n    delete this._events[type];\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n\n  } else if (isObject(list)) {\n    for (i = length; i-- > 0;) {\n      if (list[i] === listener ||\n          (list[i].listener && list[i].listener === listener)) {\n        position = i;\n        break;\n      }\n    }\n\n    if (position < 0)\n      return this;\n\n    if (list.length === 1) {\n      list.length = 0;\n      delete this._events[type];\n    } else {\n      list.splice(position, 1);\n    }\n\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n  var key, listeners;\n\n  if (!this._events)\n    return this;\n\n  // not listening for removeListener, no need to emit\n  if (!this._events.removeListener) {\n    if (arguments.length === 0)\n      this._events = {};\n    else if (this._events[type])\n      delete this._events[type];\n    return this;\n  }\n\n  // emit removeListener for all listeners on all events\n  if (arguments.length === 0) {\n    for (key in this._events) {\n      if (key === 'removeListener') continue;\n      this.removeAllListeners(key);\n    }\n    this.removeAllListeners('removeListener');\n    this._events = {};\n    return this;\n  }\n\n  listeners = this._events[type];\n\n  if (isFunction(listeners)) {\n    this.removeListener(type, listeners);\n  } else if (listeners) {\n    // LIFO order\n    while (listeners.length)\n      this.removeListener(type, listeners[listeners.length - 1]);\n  }\n  delete this._events[type];\n\n  return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n  var ret;\n  if (!this._events || !this._events[type])\n    ret = [];\n  else if (isFunction(this._events[type]))\n    ret = [this._events[type]];\n  else\n    ret = this._events[type].slice();\n  return ret;\n};\n\nEventEmitter.prototype.listenerCount = function(type) {\n  if (this._events) {\n    var evlistener = this._events[type];\n\n    if (isFunction(evlistener))\n      return 1;\n    else if (evlistener)\n      return evlistener.length;\n  }\n  return 0;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTg3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9ldmVudHMvZXZlbnRzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxuRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24obikge1xuICBpZiAoIWlzTnVtYmVyKG4pIHx8IG4gPCAwIHx8IGlzTmFOKG4pKVxuICAgIHRocm93IFR5cGVFcnJvcignbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgZXIsIGhhbmRsZXIsIGxlbiwgYXJncywgaSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKHR5cGUgPT09ICdlcnJvcicpIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50cy5lcnJvciB8fFxuICAgICAgICAoaXNPYmplY3QodGhpcy5fZXZlbnRzLmVycm9yKSAmJiAhdGhpcy5fZXZlbnRzLmVycm9yLmxlbmd0aCkpIHtcbiAgICAgIGVyID0gYXJndW1lbnRzWzFdO1xuICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCBcImVycm9yXCIgZXZlbnQuICgnICsgZXIgKyAnKScpO1xuICAgICAgICBlcnIuY29udGV4dCA9IGVyO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNVbmRlZmluZWQoaGFuZGxlcikpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGhhbmRsZXIpKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAvLyBmYXN0IGNhc2VzXG4gICAgICBjYXNlIDE6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBzbG93ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICBoYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdChoYW5kbGVyKSkge1xuICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIGxpc3RlbmVycyA9IGhhbmRsZXIuc2xpY2UoKTtcbiAgICBsZW4gPSBsaXN0ZW5lcnMubGVuZ3RoO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgIGxpc3RlbmVyc1tpXS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBtO1xuXG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcblxuICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gIGlmICh0aGlzLl9ldmVudHMubmV3TGlzdGVuZXIpXG4gICAgdGhpcy5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgIGlzRnVuY3Rpb24obGlzdGVuZXIubGlzdGVuZXIpID9cbiAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gIGVsc2UgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkpXG4gICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcbiAgZWxzZVxuICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IFt0aGlzLl9ldmVudHNbdHlwZV0sIGxpc3RlbmVyXTtcblxuICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICBpZiAoaXNPYmplY3QodGhpcy5fZXZlbnRzW3R5cGVdKSAmJiAhdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCkge1xuICAgIGlmICghaXNVbmRlZmluZWQodGhpcy5fbWF4TGlzdGVuZXJzKSkge1xuICAgICAgbSA9IHRoaXMuX21heExpc3RlbmVycztcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICAgIH1cblxuICAgIGlmIChtICYmIG0gPiAwICYmIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGggPiBtKSB7XG4gICAgICB0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJyhub2RlKSB3YXJuaW5nOiBwb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5ICcgK1xuICAgICAgICAgICAgICAgICAgICAnbGVhayBkZXRlY3RlZC4gJWQgbGlzdGVuZXJzIGFkZGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1VzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0LicsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGgpO1xuICAgICAgaWYgKHR5cGVvZiBjb25zb2xlLnRyYWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIG5vdCBzdXBwb3J0ZWQgaW4gSUUgMTBcbiAgICAgICAgY29uc29sZS50cmFjZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICB2YXIgZmlyZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBnKCkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgZyk7XG5cbiAgICBpZiAoIWZpcmVkKSB7XG4gICAgICBmaXJlZCA9IHRydWU7XG4gICAgICBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIGcubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgdGhpcy5vbih0eXBlLCBnKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZmYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIGxpc3QsIHBvc2l0aW9uLCBsZW5ndGgsIGk7XG5cbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgbGlzdCA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgbGVuZ3RoID0gbGlzdC5sZW5ndGg7XG4gIHBvc2l0aW9uID0gLTE7XG5cbiAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8XG4gICAgICAoaXNGdW5jdGlvbihsaXN0Lmxpc3RlbmVyKSAmJiBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIGlmICh0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuXG4gIH0gZWxzZSBpZiAoaXNPYmplY3QobGlzdCkpIHtcbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSA+IDA7KSB7XG4gICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHxcbiAgICAgICAgICAobGlzdFtpXS5saXN0ZW5lciAmJiBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpc3Quc3BsaWNlKHBvc2l0aW9uLCAxKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciBrZXksIGxpc3RlbmVycztcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gIGlmICghdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICBlbHNlIGlmICh0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgZm9yIChrZXkgaW4gdGhpcy5fZXZlbnRzKSB7XG4gICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGxpc3RlbmVycykpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gIH0gZWxzZSBpZiAobGlzdGVuZXJzKSB7XG4gICAgLy8gTElGTyBvcmRlclxuICAgIHdoaWxlIChsaXN0ZW5lcnMubGVuZ3RoKVxuICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbbGlzdGVuZXJzLmxlbmd0aCAtIDFdKTtcbiAgfVxuICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciByZXQ7XG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0ID0gW107XG4gIGVsc2UgaWYgKGlzRnVuY3Rpb24odGhpcy5fZXZlbnRzW3R5cGVdKSlcbiAgICByZXQgPSBbdGhpcy5fZXZlbnRzW3R5cGVdXTtcbiAgZWxzZVxuICAgIHJldCA9IHRoaXMuX2V2ZW50c1t0eXBlXS5zbGljZSgpO1xuICByZXR1cm4gcmV0O1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24odHlwZSkge1xuICBpZiAodGhpcy5fZXZlbnRzKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgICBpZiAoaXNGdW5jdGlvbihldmxpc3RlbmVyKSlcbiAgICAgIHJldHVybiAxO1xuICAgIGVsc2UgaWYgKGV2bGlzdGVuZXIpXG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIDA7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbn07XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9ldmVudHMvZXZlbnRzLmpzXG4vLyBtb2R1bGUgaWQgPSA1ODdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 588 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(process) {var Stream = (function (){\n  try {\n    return __webpack_require__(586); // hack to fix a circular dependency issue when used with browserify\n  } catch(_){}\n}());\nexports = module.exports = __webpack_require__(589);\nexports.Stream = Stream || exports;\nexports.Readable = exports;\nexports.Writable = __webpack_require__(598);\nexports.Duplex = __webpack_require__(597);\nexports.Transform = __webpack_require__(601);\nexports.PassThrough = __webpack_require__(602);\n\nif (!process.browser && process.env.READABLE_STREAM === 'disable' && Stream) {\n  module.exports = Stream;\n}\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(200)))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTg4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIFN0cmVhbSA9IChmdW5jdGlvbiAoKXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVxdWlyZSgnc3QnICsgJ3JlYW0nKTsgLy8gaGFjayB0byBmaXggYSBjaXJjdWxhciBkZXBlbmRlbmN5IGlzc3VlIHdoZW4gdXNlZCB3aXRoIGJyb3dzZXJpZnlcbiAgfSBjYXRjaChfKXt9XG59KCkpO1xuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcycpO1xuZXhwb3J0cy5TdHJlYW0gPSBTdHJlYW0gfHwgZXhwb3J0cztcbmV4cG9ydHMuUmVhZGFibGUgPSBleHBvcnRzO1xuZXhwb3J0cy5Xcml0YWJsZSA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fd3JpdGFibGUuanMnKTtcbmV4cG9ydHMuRHVwbGV4ID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9kdXBsZXguanMnKTtcbmV4cG9ydHMuVHJhbnNmb3JtID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMnKTtcbmV4cG9ydHMuUGFzc1Rocm91Z2ggPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzJyk7XG5cbmlmICghcHJvY2Vzcy5icm93c2VyICYmIHByb2Nlc3MuZW52LlJFQURBQkxFX1NUUkVBTSA9PT0gJ2Rpc2FibGUnICYmIFN0cmVhbSkge1xuICBtb2R1bGUuZXhwb3J0cyA9IFN0cmVhbTtcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUuanNcbi8vIG1vZHVsZSBpZCA9IDU4OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 589 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(process) {'use strict';\n\nmodule.exports = Readable;\n\n/*<replacement>*/\nvar processNextTick = __webpack_require__(590);\n/*</replacement>*/\n\n/*<replacement>*/\nvar isArray = __webpack_require__(585);\n/*</replacement>*/\n\n/*<replacement>*/\nvar Duplex;\n/*</replacement>*/\n\nReadable.ReadableState = ReadableState;\n\n/*<replacement>*/\nvar EE = __webpack_require__(587).EventEmitter;\n\nvar EElistenerCount = function (emitter, type) {\n  return emitter.listeners(type).length;\n};\n/*</replacement>*/\n\n/*<replacement>*/\nvar Stream;\n(function () {\n  try {\n    Stream = __webpack_require__(586);\n  } catch (_) {} finally {\n    if (!Stream) Stream = __webpack_require__(587).EventEmitter;\n  }\n})();\n/*</replacement>*/\n\nvar Buffer = __webpack_require__(591).Buffer;\n/*<replacement>*/\nvar bufferShim = __webpack_require__(593);\n/*</replacement>*/\n\n/*<replacement>*/\nvar util = __webpack_require__(594);\nutil.inherits = __webpack_require__(440);\n/*</replacement>*/\n\n/*<replacement>*/\nvar debugUtil = __webpack_require__(595);\nvar debug = void 0;\nif (debugUtil && debugUtil.debuglog) {\n  debug = debugUtil.debuglog('stream');\n} else {\n  debug = function () {};\n}\n/*</replacement>*/\n\nvar BufferList = __webpack_require__(596);\nvar StringDecoder;\n\nutil.inherits(Readable, Stream);\n\nfunction prependListener(emitter, event, fn) {\n  // Sadly this is not cacheable as some libraries bundle their own\n  // event emitter implementation with them.\n  if (typeof emitter.prependListener === 'function') {\n    return emitter.prependListener(event, fn);\n  } else {\n    // This is a hack to make sure that our error handler is attached before any\n    // userland ones.  NEVER DO THIS. This is here only because this code needs\n    // to continue to work with older versions of Node.js that do not include\n    // the prependListener() method. The goal is to eventually remove this hack.\n    if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];\n  }\n}\n\nfunction ReadableState(options, stream) {\n  Duplex = Duplex || __webpack_require__(597);\n\n  options = options || {};\n\n  // object stream flag. Used to make read(n) ignore n and to\n  // make all the buffer merging and length checks go away\n  this.objectMode = !!options.objectMode;\n\n  if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode;\n\n  // the point at which it stops calling _read() to fill the buffer\n  // Note: 0 is a valid value, means \"don't call _read preemptively ever\"\n  var hwm = options.highWaterMark;\n  var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n  this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;\n\n  // cast to ints.\n  this.highWaterMark = ~ ~this.highWaterMark;\n\n  // A linked list is used to store data chunks instead of an array because the\n  // linked list can remove elements from the beginning faster than\n  // array.shift()\n  this.buffer = new BufferList();\n  this.length = 0;\n  this.pipes = null;\n  this.pipesCount = 0;\n  this.flowing = null;\n  this.ended = false;\n  this.endEmitted = false;\n  this.reading = false;\n\n  // a flag to be able to tell if the onwrite cb is called immediately,\n  // or on a later tick.  We set this to true at first, because any\n  // actions that shouldn't happen until \"later\" should generally also\n  // not happen before the first write call.\n  this.sync = true;\n\n  // whenever we return null, then we set a flag to say\n  // that we're awaiting a 'readable' event emission.\n  this.needReadable = false;\n  this.emittedReadable = false;\n  this.readableListening = false;\n  this.resumeScheduled = false;\n\n  // Crypto is kind of old and crusty.  Historically, its default string\n  // encoding is 'binary' so we have to make this configurable.\n  // Everything else in the universe uses 'utf8', though.\n  this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n  // when piping, we only care about 'readable' events that happen\n  // after read()ing all the bytes and not getting any pushback.\n  this.ranOut = false;\n\n  // the number of writers that are awaiting a drain event in .pipe()s\n  this.awaitDrain = 0;\n\n  // if true, a maybeReadMore has been scheduled\n  this.readingMore = false;\n\n  this.decoder = null;\n  this.encoding = null;\n  if (options.encoding) {\n    if (!StringDecoder) StringDecoder = __webpack_require__(600).StringDecoder;\n    this.decoder = new StringDecoder(options.encoding);\n    this.encoding = options.encoding;\n  }\n}\n\nfunction Readable(options) {\n  Duplex = Duplex || __webpack_require__(597);\n\n  if (!(this instanceof Readable)) return new Readable(options);\n\n  this._readableState = new ReadableState(options, this);\n\n  // legacy\n  this.readable = true;\n\n  if (options && typeof options.read === 'function') this._read = options.read;\n\n  Stream.call(this);\n}\n\n// Manually shove something into the read() buffer.\n// This returns true if the highWaterMark has not been hit yet,\n// similar to how Writable.write() returns true if you should\n// write() some more.\nReadable.prototype.push = function (chunk, encoding) {\n  var state = this._readableState;\n\n  if (!state.objectMode && typeof chunk === 'string') {\n    encoding = encoding || state.defaultEncoding;\n    if (encoding !== state.encoding) {\n      chunk = bufferShim.from(chunk, encoding);\n      encoding = '';\n    }\n  }\n\n  return readableAddChunk(this, state, chunk, encoding, false);\n};\n\n// Unshift should *always* be something directly out of read()\nReadable.prototype.unshift = function (chunk) {\n  var state = this._readableState;\n  return readableAddChunk(this, state, chunk, '', true);\n};\n\nReadable.prototype.isPaused = function () {\n  return this._readableState.flowing === false;\n};\n\nfunction readableAddChunk(stream, state, chunk, encoding, addToFront) {\n  var er = chunkInvalid(state, chunk);\n  if (er) {\n    stream.emit('error', er);\n  } else if (chunk === null) {\n    state.reading = false;\n    onEofChunk(stream, state);\n  } else if (state.objectMode || chunk && chunk.length > 0) {\n    if (state.ended && !addToFront) {\n      var e = new Error('stream.push() after EOF');\n      stream.emit('error', e);\n    } else if (state.endEmitted && addToFront) {\n      var _e = new Error('stream.unshift() after end event');\n      stream.emit('error', _e);\n    } else {\n      var skipAdd;\n      if (state.decoder && !addToFront && !encoding) {\n        chunk = state.decoder.write(chunk);\n        skipAdd = !state.objectMode && chunk.length === 0;\n      }\n\n      if (!addToFront) state.reading = false;\n\n      // Don't add to the buffer if we've decoded to an empty string chunk and\n      // we're not in object mode\n      if (!skipAdd) {\n        // if we want the data now, just emit it.\n        if (state.flowing && state.length === 0 && !state.sync) {\n          stream.emit('data', chunk);\n          stream.read(0);\n        } else {\n          // update the buffer info.\n          state.length += state.objectMode ? 1 : chunk.length;\n          if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);\n\n          if (state.needReadable) emitReadable(stream);\n        }\n      }\n\n      maybeReadMore(stream, state);\n    }\n  } else if (!addToFront) {\n    state.reading = false;\n  }\n\n  return needMoreData(state);\n}\n\n// if it's past the high water mark, we can push in some more.\n// Also, if we have no data yet, we can stand some\n// more bytes.  This is to work around cases where hwm=0,\n// such as the repl.  Also, if the push() triggered a\n// readable event, and the user called read(largeNumber) such that\n// needReadable was set, then we ought to push more, so that another\n// 'readable' event will be triggered.\nfunction needMoreData(state) {\n  return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);\n}\n\n// backwards compatibility.\nReadable.prototype.setEncoding = function (enc) {\n  if (!StringDecoder) StringDecoder = __webpack_require__(600).StringDecoder;\n  this._readableState.decoder = new StringDecoder(enc);\n  this._readableState.encoding = enc;\n  return this;\n};\n\n// Don't raise the hwm > 8MB\nvar MAX_HWM = 0x800000;\nfunction computeNewHighWaterMark(n) {\n  if (n >= MAX_HWM) {\n    n = MAX_HWM;\n  } else {\n    // Get the next highest power of 2 to prevent increasing hwm excessively in\n    // tiny amounts\n    n--;\n    n |= n >>> 1;\n    n |= n >>> 2;\n    n |= n >>> 4;\n    n |= n >>> 8;\n    n |= n >>> 16;\n    n++;\n  }\n  return n;\n}\n\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction howMuchToRead(n, state) {\n  if (n <= 0 || state.length === 0 && state.ended) return 0;\n  if (state.objectMode) return 1;\n  if (n !== n) {\n    // Only flow one buffer at a time\n    if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;\n  }\n  // If we're asking for more than the current hwm, then raise the hwm.\n  if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);\n  if (n <= state.length) return n;\n  // Don't have enough\n  if (!state.ended) {\n    state.needReadable = true;\n    return 0;\n  }\n  return state.length;\n}\n\n// you can override either this method, or the async _read(n) below.\nReadable.prototype.read = function (n) {\n  debug('read', n);\n  n = parseInt(n, 10);\n  var state = this._readableState;\n  var nOrig = n;\n\n  if (n !== 0) state.emittedReadable = false;\n\n  // if we're doing read(0) to trigger a readable event, but we\n  // already have a bunch of data in the buffer, then just trigger\n  // the 'readable' event and move on.\n  if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {\n    debug('read: emitReadable', state.length, state.ended);\n    if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);\n    return null;\n  }\n\n  n = howMuchToRead(n, state);\n\n  // if we've ended, and we're now clear, then finish it up.\n  if (n === 0 && state.ended) {\n    if (state.length === 0) endReadable(this);\n    return null;\n  }\n\n  // All the actual chunk generation logic needs to be\n  // *below* the call to _read.  The reason is that in certain\n  // synthetic stream cases, such as passthrough streams, _read\n  // may be a completely synchronous operation which may change\n  // the state of the read buffer, providing enough data when\n  // before there was *not* enough.\n  //\n  // So, the steps are:\n  // 1. Figure out what the state of things will be after we do\n  // a read from the buffer.\n  //\n  // 2. If that resulting state will trigger a _read, then call _read.\n  // Note that this may be asynchronous, or synchronous.  Yes, it is\n  // deeply ugly to write APIs this way, but that still doesn't mean\n  // that the Readable class should behave improperly, as streams are\n  // designed to be sync/async agnostic.\n  // Take note if the _read call is sync or async (ie, if the read call\n  // has returned yet), so that we know whether or not it's safe to emit\n  // 'readable' etc.\n  //\n  // 3. Actually pull the requested chunks out of the buffer and return.\n\n  // if we need a readable event, then we need to do some reading.\n  var doRead = state.needReadable;\n  debug('need readable', doRead);\n\n  // if we currently have less than the highWaterMark, then also read some\n  if (state.length === 0 || state.length - n < state.highWaterMark) {\n    doRead = true;\n    debug('length less than watermark', doRead);\n  }\n\n  // however, if we've ended, then there's no point, and if we're already\n  // reading, then it's unnecessary.\n  if (state.ended || state.reading) {\n    doRead = false;\n    debug('reading or ended', doRead);\n  } else if (doRead) {\n    debug('do read');\n    state.reading = true;\n    state.sync = true;\n    // if the length is currently zero, then we *need* a readable event.\n    if (state.length === 0) state.needReadable = true;\n    // call internal read method\n    this._read(state.highWaterMark);\n    state.sync = false;\n    // If _read pushed data synchronously, then `reading` will be false,\n    // and we need to re-evaluate how much data we can return to the user.\n    if (!state.reading) n = howMuchToRead(nOrig, state);\n  }\n\n  var ret;\n  if (n > 0) ret = fromList(n, state);else ret = null;\n\n  if (ret === null) {\n    state.needReadable = true;\n    n = 0;\n  } else {\n    state.length -= n;\n  }\n\n  if (state.length === 0) {\n    // If we have nothing in the buffer, then we want to know\n    // as soon as we *do* get something into the buffer.\n    if (!state.ended) state.needReadable = true;\n\n    // If we tried to read() past the EOF, then emit end on the next tick.\n    if (nOrig !== n && state.ended) endReadable(this);\n  }\n\n  if (ret !== null) this.emit('data', ret);\n\n  return ret;\n};\n\nfunction chunkInvalid(state, chunk) {\n  var er = null;\n  if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) {\n    er = new TypeError('Invalid non-string/buffer chunk');\n  }\n  return er;\n}\n\nfunction onEofChunk(stream, state) {\n  if (state.ended) return;\n  if (state.decoder) {\n    var chunk = state.decoder.end();\n    if (chunk && chunk.length) {\n      state.buffer.push(chunk);\n      state.length += state.objectMode ? 1 : chunk.length;\n    }\n  }\n  state.ended = true;\n\n  // emit 'readable' now to make sure it gets picked up.\n  emitReadable(stream);\n}\n\n// Don't emit readable right away in sync mode, because this can trigger\n// another read() call => stack overflow.  This way, it might trigger\n// a nextTick recursion warning, but that's not so bad.\nfunction emitReadable(stream) {\n  var state = stream._readableState;\n  state.needReadable = false;\n  if (!state.emittedReadable) {\n    debug('emitReadable', state.flowing);\n    state.emittedReadable = true;\n    if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream);\n  }\n}\n\nfunction emitReadable_(stream) {\n  debug('emit readable');\n  stream.emit('readable');\n  flow(stream);\n}\n\n// at this point, the user has presumably seen the 'readable' event,\n// and called read() to consume some data.  that may have triggered\n// in turn another _read(n) call, in which case reading = true if\n// it's in progress.\n// However, if we're not ended, or reading, and the length < hwm,\n// then go ahead and try to read some more preemptively.\nfunction maybeReadMore(stream, state) {\n  if (!state.readingMore) {\n    state.readingMore = true;\n    processNextTick(maybeReadMore_, stream, state);\n  }\n}\n\nfunction maybeReadMore_(stream, state) {\n  var len = state.length;\n  while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {\n    debug('maybeReadMore read 0');\n    stream.read(0);\n    if (len === state.length)\n      // didn't get any data, stop spinning.\n      break;else len = state.length;\n  }\n  state.readingMore = false;\n}\n\n// abstract method.  to be overridden in specific implementation classes.\n// call cb(er, data) where data is <= n in length.\n// for virtual (non-string, non-buffer) streams, \"length\" is somewhat\n// arbitrary, and perhaps not very meaningful.\nReadable.prototype._read = function (n) {\n  this.emit('error', new Error('_read() is not implemented'));\n};\n\nReadable.prototype.pipe = function (dest, pipeOpts) {\n  var src = this;\n  var state = this._readableState;\n\n  switch (state.pipesCount) {\n    case 0:\n      state.pipes = dest;\n      break;\n    case 1:\n      state.pipes = [state.pipes, dest];\n      break;\n    default:\n      state.pipes.push(dest);\n      break;\n  }\n  state.pipesCount += 1;\n  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);\n\n  var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;\n\n  var endFn = doEnd ? onend : cleanup;\n  if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn);\n\n  dest.on('unpipe', onunpipe);\n  function onunpipe(readable) {\n    debug('onunpipe');\n    if (readable === src) {\n      cleanup();\n    }\n  }\n\n  function onend() {\n    debug('onend');\n    dest.end();\n  }\n\n  // when the dest drains, it reduces the awaitDrain counter\n  // on the source.  This would be more elegant with a .once()\n  // handler in flow(), but adding and removing repeatedly is\n  // too slow.\n  var ondrain = pipeOnDrain(src);\n  dest.on('drain', ondrain);\n\n  var cleanedUp = false;\n  function cleanup() {\n    debug('cleanup');\n    // cleanup event handlers once the pipe is broken\n    dest.removeListener('close', onclose);\n    dest.removeListener('finish', onfinish);\n    dest.removeListener('drain', ondrain);\n    dest.removeListener('error', onerror);\n    dest.removeListener('unpipe', onunpipe);\n    src.removeListener('end', onend);\n    src.removeListener('end', cleanup);\n    src.removeListener('data', ondata);\n\n    cleanedUp = true;\n\n    // if the reader is waiting for a drain event from this\n    // specific writer, then it would cause it to never start\n    // flowing again.\n    // So, if this is awaiting a drain, then we just call it now.\n    // If we don't know, then assume that we are waiting for one.\n    if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();\n  }\n\n  // If the user pushes more data while we're writing to dest then we'll end up\n  // in ondata again. However, we only want to increase awaitDrain once because\n  // dest will only emit one 'drain' event for the multiple writes.\n  // => Introduce a guard on increasing awaitDrain.\n  var increasedAwaitDrain = false;\n  src.on('data', ondata);\n  function ondata(chunk) {\n    debug('ondata');\n    increasedAwaitDrain = false;\n    var ret = dest.write(chunk);\n    if (false === ret && !increasedAwaitDrain) {\n      // If the user unpiped during `dest.write()`, it is possible\n      // to get stuck in a permanently paused state if that write\n      // also returned false.\n      // => Check whether `dest` is still a piping destination.\n      if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {\n        debug('false write response, pause', src._readableState.awaitDrain);\n        src._readableState.awaitDrain++;\n        increasedAwaitDrain = true;\n      }\n      src.pause();\n    }\n  }\n\n  // if the dest has an error, then stop piping into it.\n  // however, don't suppress the throwing behavior for this.\n  function onerror(er) {\n    debug('onerror', er);\n    unpipe();\n    dest.removeListener('error', onerror);\n    if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);\n  }\n\n  // Make sure our error handler is attached before userland ones.\n  prependListener(dest, 'error', onerror);\n\n  // Both close and finish should trigger unpipe, but only once.\n  function onclose() {\n    dest.removeListener('finish', onfinish);\n    unpipe();\n  }\n  dest.once('close', onclose);\n  function onfinish() {\n    debug('onfinish');\n    dest.removeListener('close', onclose);\n    unpipe();\n  }\n  dest.once('finish', onfinish);\n\n  function unpipe() {\n    debug('unpipe');\n    src.unpipe(dest);\n  }\n\n  // tell the dest that it's being piped to\n  dest.emit('pipe', src);\n\n  // start the flow if it hasn't been started already.\n  if (!state.flowing) {\n    debug('pipe resume');\n    src.resume();\n  }\n\n  return dest;\n};\n\nfunction pipeOnDrain(src) {\n  return function () {\n    var state = src._readableState;\n    debug('pipeOnDrain', state.awaitDrain);\n    if (state.awaitDrain) state.awaitDrain--;\n    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {\n      state.flowing = true;\n      flow(src);\n    }\n  };\n}\n\nReadable.prototype.unpipe = function (dest) {\n  var state = this._readableState;\n\n  // if we're not piping anywhere, then do nothing.\n  if (state.pipesCount === 0) return this;\n\n  // just one destination.  most common case.\n  if (state.pipesCount === 1) {\n    // passed in one, but it's not the right one.\n    if (dest && dest !== state.pipes) return this;\n\n    if (!dest) dest = state.pipes;\n\n    // got a match.\n    state.pipes = null;\n    state.pipesCount = 0;\n    state.flowing = false;\n    if (dest) dest.emit('unpipe', this);\n    return this;\n  }\n\n  // slow case. multiple pipe destinations.\n\n  if (!dest) {\n    // remove all.\n    var dests = state.pipes;\n    var len = state.pipesCount;\n    state.pipes = null;\n    state.pipesCount = 0;\n    state.flowing = false;\n\n    for (var i = 0; i < len; i++) {\n      dests[i].emit('unpipe', this);\n    }return this;\n  }\n\n  // try to find the right one.\n  var index = indexOf(state.pipes, dest);\n  if (index === -1) return this;\n\n  state.pipes.splice(index, 1);\n  state.pipesCount -= 1;\n  if (state.pipesCount === 1) state.pipes = state.pipes[0];\n\n  dest.emit('unpipe', this);\n\n  return this;\n};\n\n// set up data events if they are asked for\n// Ensure readable listeners eventually get something\nReadable.prototype.on = function (ev, fn) {\n  var res = Stream.prototype.on.call(this, ev, fn);\n\n  if (ev === 'data') {\n    // Start flowing on next tick if stream isn't explicitly paused\n    if (this._readableState.flowing !== false) this.resume();\n  } else if (ev === 'readable') {\n    var state = this._readableState;\n    if (!state.endEmitted && !state.readableListening) {\n      state.readableListening = state.needReadable = true;\n      state.emittedReadable = false;\n      if (!state.reading) {\n        processNextTick(nReadingNextTick, this);\n      } else if (state.length) {\n        emitReadable(this, state);\n      }\n    }\n  }\n\n  return res;\n};\nReadable.prototype.addListener = Readable.prototype.on;\n\nfunction nReadingNextTick(self) {\n  debug('readable nexttick read 0');\n  self.read(0);\n}\n\n// pause() and resume() are remnants of the legacy readable stream API\n// If the user uses them, then switch into old mode.\nReadable.prototype.resume = function () {\n  var state = this._readableState;\n  if (!state.flowing) {\n    debug('resume');\n    state.flowing = true;\n    resume(this, state);\n  }\n  return this;\n};\n\nfunction resume(stream, state) {\n  if (!state.resumeScheduled) {\n    state.resumeScheduled = true;\n    processNextTick(resume_, stream, state);\n  }\n}\n\nfunction resume_(stream, state) {\n  if (!state.reading) {\n    debug('resume read 0');\n    stream.read(0);\n  }\n\n  state.resumeScheduled = false;\n  state.awaitDrain = 0;\n  stream.emit('resume');\n  flow(stream);\n  if (state.flowing && !state.reading) stream.read(0);\n}\n\nReadable.prototype.pause = function () {\n  debug('call pause flowing=%j', this._readableState.flowing);\n  if (false !== this._readableState.flowing) {\n    debug('pause');\n    this._readableState.flowing = false;\n    this.emit('pause');\n  }\n  return this;\n};\n\nfunction flow(stream) {\n  var state = stream._readableState;\n  debug('flow', state.flowing);\n  while (state.flowing && stream.read() !== null) {}\n}\n\n// wrap an old-style stream as the async data source.\n// This is *not* part of the readable stream interface.\n// It is an ugly unfortunate mess of history.\nReadable.prototype.wrap = function (stream) {\n  var state = this._readableState;\n  var paused = false;\n\n  var self = this;\n  stream.on('end', function () {\n    debug('wrapped end');\n    if (state.decoder && !state.ended) {\n      var chunk = state.decoder.end();\n      if (chunk && chunk.length) self.push(chunk);\n    }\n\n    self.push(null);\n  });\n\n  stream.on('data', function (chunk) {\n    debug('wrapped data');\n    if (state.decoder) chunk = state.decoder.write(chunk);\n\n    // don't skip over falsy values in objectMode\n    if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;\n\n    var ret = self.push(chunk);\n    if (!ret) {\n      paused = true;\n      stream.pause();\n    }\n  });\n\n  // proxy all the other methods.\n  // important when wrapping filters and duplexes.\n  for (var i in stream) {\n    if (this[i] === undefined && typeof stream[i] === 'function') {\n      this[i] = function (method) {\n        return function () {\n          return stream[method].apply(stream, arguments);\n        };\n      }(i);\n    }\n  }\n\n  // proxy certain important events.\n  var events = ['error', 'close', 'destroy', 'pause', 'resume'];\n  forEach(events, function (ev) {\n    stream.on(ev, self.emit.bind(self, ev));\n  });\n\n  // when we try to consume some more bytes, simply unpause the\n  // underlying stream.\n  self._read = function (n) {\n    debug('wrapped _read', n);\n    if (paused) {\n      paused = false;\n      stream.resume();\n    }\n  };\n\n  return self;\n};\n\n// exposed for testing purposes only.\nReadable._fromList = fromList;\n\n// Pluck off n bytes from an array of buffers.\n// Length is the combined lengths of all the buffers in the list.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromList(n, state) {\n  // nothing buffered\n  if (state.length === 0) return null;\n\n  var ret;\n  if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {\n    // read it all, truncate the list\n    if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);\n    state.buffer.clear();\n  } else {\n    // read part of list\n    ret = fromListPartial(n, state.buffer, state.decoder);\n  }\n\n  return ret;\n}\n\n// Extracts only enough buffered data to satisfy the amount requested.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromListPartial(n, list, hasStrings) {\n  var ret;\n  if (n < list.head.data.length) {\n    // slice is the same for buffers and strings\n    ret = list.head.data.slice(0, n);\n    list.head.data = list.head.data.slice(n);\n  } else if (n === list.head.data.length) {\n    // first chunk is a perfect match\n    ret = list.shift();\n  } else {\n    // result spans more than one buffer\n    ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);\n  }\n  return ret;\n}\n\n// Copies a specified amount of characters from the list of buffered data\n// chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBufferString(n, list) {\n  var p = list.head;\n  var c = 1;\n  var ret = p.data;\n  n -= ret.length;\n  while (p = p.next) {\n    var str = p.data;\n    var nb = n > str.length ? str.length : n;\n    if (nb === str.length) ret += str;else ret += str.slice(0, n);\n    n -= nb;\n    if (n === 0) {\n      if (nb === str.length) {\n        ++c;\n        if (p.next) list.head = p.next;else list.head = list.tail = null;\n      } else {\n        list.head = p;\n        p.data = str.slice(nb);\n      }\n      break;\n    }\n    ++c;\n  }\n  list.length -= c;\n  return ret;\n}\n\n// Copies a specified amount of bytes from the list of buffered data chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBuffer(n, list) {\n  var ret = bufferShim.allocUnsafe(n);\n  var p = list.head;\n  var c = 1;\n  p.data.copy(ret);\n  n -= p.data.length;\n  while (p = p.next) {\n    var buf = p.data;\n    var nb = n > buf.length ? buf.length : n;\n    buf.copy(ret, ret.length - n, 0, nb);\n    n -= nb;\n    if (n === 0) {\n      if (nb === buf.length) {\n        ++c;\n        if (p.next) list.head = p.next;else list.head = list.tail = null;\n      } else {\n        list.head = p;\n        p.data = buf.slice(nb);\n      }\n      break;\n    }\n    ++c;\n  }\n  list.length -= c;\n  return ret;\n}\n\nfunction endReadable(stream) {\n  var state = stream._readableState;\n\n  // If we get here before consuming all the bytes, then that is a\n  // bug in node.  Should never happen.\n  if (state.length > 0) throw new Error('\"endReadable()\" called on non-empty stream');\n\n  if (!state.endEmitted) {\n    state.ended = true;\n    processNextTick(endReadableNT, state, stream);\n  }\n}\n\nfunction endReadableNT(state, stream) {\n  // Check that we didn't get one last unshift.\n  if (!state.endEmitted && state.length === 0) {\n    state.endEmitted = true;\n    stream.readable = false;\n    stream.emit('end');\n  }\n}\n\nfunction forEach(xs, f) {\n  for (var i = 0, l = xs.length; i < l; i++) {\n    f(xs[i], i);\n  }\n}\n\nfunction indexOf(xs, x) {\n  for (var i = 0, l = xs.length; i < l; i++) {\n    if (xs[i] === x) return i;\n  }\n  return -1;\n}\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(200)))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTg5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcmVhZGFibGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWRhYmxlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHByb2Nlc3NOZXh0VGljayA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRHVwbGV4O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblJlYWRhYmxlLlJlYWRhYmxlU3RhdGUgPSBSZWFkYWJsZVN0YXRlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuXG52YXIgRUVsaXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aDtcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW07XG4oZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIFN0cmVhbSA9IHJlcXVpcmUoJ3N0JyArICdyZWFtJyk7XG4gIH0gY2F0Y2ggKF8pIHt9IGZpbmFsbHkge1xuICAgIGlmICghU3RyZWFtKSBTdHJlYW0gPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG4gIH1cbn0pKCk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPHJlcGxhY2VtZW50PiovXG52YXIgYnVmZmVyU2hpbSA9IHJlcXVpcmUoJ2J1ZmZlci1zaGltcycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBkZWJ1Z1V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgZGVidWcgPSB2b2lkIDA7XG5pZiAoZGVidWdVdGlsICYmIGRlYnVnVXRpbC5kZWJ1Z2xvZykge1xuICBkZWJ1ZyA9IGRlYnVnVXRpbC5kZWJ1Z2xvZygnc3RyZWFtJyk7XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXJMaXN0ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL0J1ZmZlckxpc3QnKTtcbnZhciBTdHJpbmdEZWNvZGVyO1xuXG51dGlsLmluaGVyaXRzKFJlYWRhYmxlLCBTdHJlYW0pO1xuXG5mdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuKSB7XG4gIC8vIFNhZGx5IHRoaXMgaXMgbm90IGNhY2hlYWJsZSBhcyBzb21lIGxpYnJhcmllcyBidW5kbGUgdGhlaXIgb3duXG4gIC8vIGV2ZW50IGVtaXR0ZXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGVtLlxuICBpZiAodHlwZW9mIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyKGV2ZW50LCBmbik7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgb3VyIGVycm9yIGhhbmRsZXIgaXMgYXR0YWNoZWQgYmVmb3JlIGFueVxuICAgIC8vIHVzZXJsYW5kIG9uZXMuICBORVZFUiBETyBUSElTLiBUaGlzIGlzIGhlcmUgb25seSBiZWNhdXNlIHRoaXMgY29kZSBuZWVkc1xuICAgIC8vIHRvIGNvbnRpbnVlIHRvIHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBOb2RlLmpzIHRoYXQgZG8gbm90IGluY2x1ZGVcbiAgICAvLyB0aGUgcHJlcGVuZExpc3RlbmVyKCkgbWV0aG9kLiBUaGUgZ29hbCBpcyB0byBldmVudHVhbGx5IHJlbW92ZSB0aGlzIGhhY2suXG4gICAgaWYgKCFlbWl0dGVyLl9ldmVudHMgfHwgIWVtaXR0ZXIuX2V2ZW50c1tldmVudF0pIGVtaXR0ZXIub24oZXZlbnQsIGZuKTtlbHNlIGlmIChpc0FycmF5KGVtaXR0ZXIuX2V2ZW50c1tldmVudF0pKSBlbWl0dGVyLl9ldmVudHNbZXZlbnRdLnVuc2hpZnQoZm4pO2Vsc2UgZW1pdHRlci5fZXZlbnRzW2V2ZW50XSA9IFtmbiwgZW1pdHRlci5fZXZlbnRzW2V2ZW50XV07XG4gIH1cbn1cblxuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheVxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfiB+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIC8vIEEgbGlua2VkIGxpc3QgaXMgdXNlZCB0byBzdG9yZSBkYXRhIGNodW5rcyBpbnN0ZWFkIG9mIGFuIGFycmF5IGJlY2F1c2UgdGhlXG4gIC8vIGxpbmtlZCBsaXN0IGNhbiByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgYmVnaW5uaW5nIGZhc3RlciB0aGFuXG4gIC8vIGFycmF5LnNoaWZ0KClcbiAgdGhpcy5idWZmZXIgPSBuZXcgQnVmZmVyTGlzdCgpO1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucGlwZXMgPSBudWxsO1xuICB0aGlzLnBpcGVzQ291bnQgPSAwO1xuICB0aGlzLmZsb3dpbmcgPSBudWxsO1xuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIHRoaXMuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYWRpbmcgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyB3aGVuZXZlciB3ZSByZXR1cm4gbnVsbCwgdGhlbiB3ZSBzZXQgYSBmbGFnIHRvIHNheVxuICAvLyB0aGF0IHdlJ3JlIGF3YWl0aW5nIGEgJ3JlYWRhYmxlJyBldmVudCBlbWlzc2lvbi5cbiAgdGhpcy5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5yZWFkYWJsZUxpc3RlbmluZyA9IGZhbHNlO1xuICB0aGlzLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIHdoZW4gcGlwaW5nLCB3ZSBvbmx5IGNhcmUgYWJvdXQgJ3JlYWRhYmxlJyBldmVudHMgdGhhdCBoYXBwZW5cbiAgLy8gYWZ0ZXIgcmVhZCgpaW5nIGFsbCB0aGUgYnl0ZXMgYW5kIG5vdCBnZXR0aW5nIGFueSBwdXNoYmFjay5cbiAgdGhpcy5yYW5PdXQgPSBmYWxzZTtcblxuICAvLyB0aGUgbnVtYmVyIG9mIHdyaXRlcnMgdGhhdCBhcmUgYXdhaXRpbmcgYSBkcmFpbiBldmVudCBpbiAucGlwZSgpc1xuICB0aGlzLmF3YWl0RHJhaW4gPSAwO1xuXG4gIC8vIGlmIHRydWUsIGEgbWF5YmVSZWFkTW9yZSBoYXMgYmVlbiBzY2hlZHVsZWRcbiAgdGhpcy5yZWFkaW5nTW9yZSA9IGZhbHNlO1xuXG4gIHRoaXMuZGVjb2RlciA9IG51bGw7XG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsO1xuICBpZiAob3B0aW9ucy5lbmNvZGluZykge1xuICAgIGlmICghU3RyaW5nRGVjb2RlcikgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyLycpLlN0cmluZ0RlY29kZXI7XG4gICAgdGhpcy5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIob3B0aW9ucy5lbmNvZGluZyk7XG4gICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuZW5jb2Rpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gUmVhZGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5yZWFkID09PSAnZnVuY3Rpb24nKSB0aGlzLl9yZWFkID0gb3B0aW9ucy5yZWFkO1xuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuICAgIGlmIChlbmNvZGluZyAhPT0gc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgIGNodW5rID0gYnVmZmVyU2hpbS5mcm9tKGNodW5rLCBlbmNvZGluZyk7XG4gICAgICBlbmNvZGluZyA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGZhbHNlKTtcbn07XG5cbi8vIFVuc2hpZnQgc2hvdWxkICphbHdheXMqIGJlIHNvbWV0aGluZyBkaXJlY3RseSBvdXQgb2YgcmVhZCgpXG5SZWFkYWJsZS5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssICcnLCB0cnVlKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiByZWFkYWJsZUFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgYWRkVG9Gcm9udCkge1xuICB2YXIgZXIgPSBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKTtcbiAgaWYgKGVyKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9IGVsc2UgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSk7XG4gIH0gZWxzZSBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCBjaHVuayAmJiBjaHVuay5sZW5ndGggPiAwKSB7XG4gICAgaWYgKHN0YXRlLmVuZGVkICYmICFhZGRUb0Zyb250KSB7XG4gICAgICB2YXIgZSA9IG5ldyBFcnJvcignc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnKTtcbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGUpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuZW5kRW1pdHRlZCAmJiBhZGRUb0Zyb250KSB7XG4gICAgICB2YXIgX2UgPSBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Jyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBfZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBza2lwQWRkO1xuICAgICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIWFkZFRvRnJvbnQgJiYgIWVuY29kaW5nKSB7XG4gICAgICAgIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG4gICAgICAgIHNraXBBZGQgPSAhc3RhdGUub2JqZWN0TW9kZSAmJiBjaHVuay5sZW5ndGggPT09IDA7XG4gICAgICB9XG5cbiAgICAgIGlmICghYWRkVG9Gcm9udCkgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuXG4gICAgICAvLyBEb24ndCBhZGQgdG8gdGhlIGJ1ZmZlciBpZiB3ZSd2ZSBkZWNvZGVkIHRvIGFuIGVtcHR5IHN0cmluZyBjaHVuayBhbmRcbiAgICAgIC8vIHdlJ3JlIG5vdCBpbiBvYmplY3QgbW9kZVxuICAgICAgaWYgKCFza2lwQWRkKSB7XG4gICAgICAgIC8vIGlmIHdlIHdhbnQgdGhlIGRhdGEgbm93LCBqdXN0IGVtaXQgaXQuXG4gICAgICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuc3luYykge1xuICAgICAgICAgIHN0cmVhbS5lbWl0KCdkYXRhJywgY2h1bmspO1xuICAgICAgICAgIHN0cmVhbS5yZWFkKDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYnVmZmVyIGluZm8uXG4gICAgICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgICAgICAgIGlmIChhZGRUb0Zyb250KSBzdGF0ZS5idWZmZXIudW5zaGlmdChjaHVuayk7ZWxzZSBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG5cbiAgICAgICAgICBpZiAoc3RhdGUubmVlZFJlYWRhYmxlKSBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghYWRkVG9Gcm9udCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBuZWVkTW9yZURhdGEoc3RhdGUpO1xufVxuXG4vLyBpZiBpdCdzIHBhc3QgdGhlIGhpZ2ggd2F0ZXIgbWFyaywgd2UgY2FuIHB1c2ggaW4gc29tZSBtb3JlLlxuLy8gQWxzbywgaWYgd2UgaGF2ZSBubyBkYXRhIHlldCwgd2UgY2FuIHN0YW5kIHNvbWVcbi8vIG1vcmUgYnl0ZXMuICBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGNhc2VzIHdoZXJlIGh3bT0wLFxuLy8gc3VjaCBhcyB0aGUgcmVwbC4gIEFsc28sIGlmIHRoZSBwdXNoKCkgdHJpZ2dlcmVkIGFcbi8vIHJlYWRhYmxlIGV2ZW50LCBhbmQgdGhlIHVzZXIgY2FsbGVkIHJlYWQobGFyZ2VOdW1iZXIpIHN1Y2ggdGhhdFxuLy8gbmVlZFJlYWRhYmxlIHdhcyBzZXQsIHRoZW4gd2Ugb3VnaHQgdG8gcHVzaCBtb3JlLCBzbyB0aGF0IGFub3RoZXJcbi8vICdyZWFkYWJsZScgZXZlbnQgd2lsbCBiZSB0cmlnZ2VyZWQuXG5mdW5jdGlvbiBuZWVkTW9yZURhdGEoc3RhdGUpIHtcbiAgcmV0dXJuICFzdGF0ZS5lbmRlZCAmJiAoc3RhdGUubmVlZFJlYWRhYmxlIHx8IHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgc3RhdGUubGVuZ3RoID09PSAwKTtcbn1cblxuLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG5SZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2RpbmcgPSBmdW5jdGlvbiAoZW5jKSB7XG4gIGlmICghU3RyaW5nRGVjb2RlcikgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyLycpLlN0cmluZ0RlY29kZXI7XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKGVuYyk7XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2RpbmcgPSBlbmM7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gRG9uJ3QgcmFpc2UgdGhlIGh3bSA+IDhNQlxudmFyIE1BWF9IV00gPSAweDgwMDAwMDtcbmZ1bmN0aW9uIGNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pIHtcbiAgaWYgKG4gPj0gTUFYX0hXTSkge1xuICAgIG4gPSBNQVhfSFdNO1xuICB9IGVsc2Uge1xuICAgIC8vIEdldCB0aGUgbmV4dCBoaWdoZXN0IHBvd2VyIG9mIDIgdG8gcHJldmVudCBpbmNyZWFzaW5nIGh3bSBleGNlc3NpdmVseSBpblxuICAgIC8vIHRpbnkgYW1vdW50c1xuICAgIG4tLTtcbiAgICBuIHw9IG4gPj4+IDE7XG4gICAgbiB8PSBuID4+PiAyO1xuICAgIG4gfD0gbiA+Pj4gNDtcbiAgICBuIHw9IG4gPj4+IDg7XG4gICAgbiB8PSBuID4+PiAxNjtcbiAgICBuKys7XG4gIH1cbiAgcmV0dXJuIG47XG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSkge1xuICBpZiAobiA8PSAwIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgcmV0dXJuIDA7XG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKSByZXR1cm4gMTtcbiAgaWYgKG4gIT09IG4pIHtcbiAgICAvLyBPbmx5IGZsb3cgb25lIGJ1ZmZlciBhdCBhIHRpbWVcbiAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGgpIHJldHVybiBzdGF0ZS5idWZmZXIuaGVhZC5kYXRhLmxlbmd0aDtlbHNlIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gIH1cbiAgLy8gSWYgd2UncmUgYXNraW5nIGZvciBtb3JlIHRoYW4gdGhlIGN1cnJlbnQgaHdtLCB0aGVuIHJhaXNlIHRoZSBod20uXG4gIGlmIChuID4gc3RhdGUuaGlnaFdhdGVyTWFyaykgc3RhdGUuaGlnaFdhdGVyTWFyayA9IGNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pO1xuICBpZiAobiA8PSBzdGF0ZS5sZW5ndGgpIHJldHVybiBuO1xuICAvLyBEb24ndCBoYXZlIGVub3VnaFxuICBpZiAoIXN0YXRlLmVuZGVkKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gc3RhdGUubGVuZ3RoO1xufVxuXG4vLyB5b3UgY2FuIG92ZXJyaWRlIGVpdGhlciB0aGlzIG1ldGhvZCwgb3IgdGhlIGFzeW5jIF9yZWFkKG4pIGJlbG93LlxuUmVhZGFibGUucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAobikge1xuICBkZWJ1ZygncmVhZCcsIG4pO1xuICBuID0gcGFyc2VJbnQobiwgMTApO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgbk9yaWcgPSBuO1xuXG4gIGlmIChuICE9PSAwKSBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcblxuICAvLyBpZiB3ZSdyZSBkb2luZyByZWFkKDApIHRvIHRyaWdnZXIgYSByZWFkYWJsZSBldmVudCwgYnV0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhIGJ1bmNoIG9mIGRhdGEgaW4gdGhlIGJ1ZmZlciwgdGhlbiBqdXN0IHRyaWdnZXJcbiAgLy8gdGhlICdyZWFkYWJsZScgZXZlbnQgYW5kIG1vdmUgb24uXG4gIGlmIChuID09PSAwICYmIHN0YXRlLm5lZWRSZWFkYWJsZSAmJiAoc3RhdGUubGVuZ3RoID49IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgc3RhdGUuZW5kZWQpKSB7XG4gICAgZGVidWcoJ3JlYWQ6IGVtaXRSZWFkYWJsZScsIHN0YXRlLmxlbmd0aCwgc3RhdGUuZW5kZWQpO1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO2Vsc2UgZW1pdFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbiA9IGhvd011Y2hUb1JlYWQobiwgc3RhdGUpO1xuXG4gIC8vIGlmIHdlJ3ZlIGVuZGVkLCBhbmQgd2UncmUgbm93IGNsZWFyLCB0aGVuIGZpbmlzaCBpdCB1cC5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUuZW5kZWQpIHtcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSBlbmRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIEFsbCB0aGUgYWN0dWFsIGNodW5rIGdlbmVyYXRpb24gbG9naWMgbmVlZHMgdG8gYmVcbiAgLy8gKmJlbG93KiB0aGUgY2FsbCB0byBfcmVhZC4gIFRoZSByZWFzb24gaXMgdGhhdCBpbiBjZXJ0YWluXG4gIC8vIHN5bnRoZXRpYyBzdHJlYW0gY2FzZXMsIHN1Y2ggYXMgcGFzc3Rocm91Z2ggc3RyZWFtcywgX3JlYWRcbiAgLy8gbWF5IGJlIGEgY29tcGxldGVseSBzeW5jaHJvbm91cyBvcGVyYXRpb24gd2hpY2ggbWF5IGNoYW5nZVxuICAvLyB0aGUgc3RhdGUgb2YgdGhlIHJlYWQgYnVmZmVyLCBwcm92aWRpbmcgZW5vdWdoIGRhdGEgd2hlblxuICAvLyBiZWZvcmUgdGhlcmUgd2FzICpub3QqIGVub3VnaC5cbiAgLy9cbiAgLy8gU28sIHRoZSBzdGVwcyBhcmU6XG4gIC8vIDEuIEZpZ3VyZSBvdXQgd2hhdCB0aGUgc3RhdGUgb2YgdGhpbmdzIHdpbGwgYmUgYWZ0ZXIgd2UgZG9cbiAgLy8gYSByZWFkIGZyb20gdGhlIGJ1ZmZlci5cbiAgLy9cbiAgLy8gMi4gSWYgdGhhdCByZXN1bHRpbmcgc3RhdGUgd2lsbCB0cmlnZ2VyIGEgX3JlYWQsIHRoZW4gY2FsbCBfcmVhZC5cbiAgLy8gTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGFzeW5jaHJvbm91cywgb3Igc3luY2hyb25vdXMuICBZZXMsIGl0IGlzXG4gIC8vIGRlZXBseSB1Z2x5IHRvIHdyaXRlIEFQSXMgdGhpcyB3YXksIGJ1dCB0aGF0IHN0aWxsIGRvZXNuJ3QgbWVhblxuICAvLyB0aGF0IHRoZSBSZWFkYWJsZSBjbGFzcyBzaG91bGQgYmVoYXZlIGltcHJvcGVybHksIGFzIHN0cmVhbXMgYXJlXG4gIC8vIGRlc2lnbmVkIHRvIGJlIHN5bmMvYXN5bmMgYWdub3N0aWMuXG4gIC8vIFRha2Ugbm90ZSBpZiB0aGUgX3JlYWQgY2FsbCBpcyBzeW5jIG9yIGFzeW5jIChpZSwgaWYgdGhlIHJlYWQgY2FsbFxuICAvLyBoYXMgcmV0dXJuZWQgeWV0KSwgc28gdGhhdCB3ZSBrbm93IHdoZXRoZXIgb3Igbm90IGl0J3Mgc2FmZSB0byBlbWl0XG4gIC8vICdyZWFkYWJsZScgZXRjLlxuICAvL1xuICAvLyAzLiBBY3R1YWxseSBwdWxsIHRoZSByZXF1ZXN0ZWQgY2h1bmtzIG91dCBvZiB0aGUgYnVmZmVyIGFuZCByZXR1cm4uXG5cbiAgLy8gaWYgd2UgbmVlZCBhIHJlYWRhYmxlIGV2ZW50LCB0aGVuIHdlIG5lZWQgdG8gZG8gc29tZSByZWFkaW5nLlxuICB2YXIgZG9SZWFkID0gc3RhdGUubmVlZFJlYWRhYmxlO1xuICBkZWJ1ZygnbmVlZCByZWFkYWJsZScsIGRvUmVhZCk7XG5cbiAgLy8gaWYgd2UgY3VycmVudGx5IGhhdmUgbGVzcyB0aGFuIHRoZSBoaWdoV2F0ZXJNYXJrLCB0aGVuIGFsc28gcmVhZCBzb21lXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgfHwgc3RhdGUubGVuZ3RoIC0gbiA8IHN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICBkb1JlYWQgPSB0cnVlO1xuICAgIGRlYnVnKCdsZW5ndGggbGVzcyB0aGFuIHdhdGVybWFyaycsIGRvUmVhZCk7XG4gIH1cblxuICAvLyBob3dldmVyLCBpZiB3ZSd2ZSBlbmRlZCwgdGhlbiB0aGVyZSdzIG5vIHBvaW50LCBhbmQgaWYgd2UncmUgYWxyZWFkeVxuICAvLyByZWFkaW5nLCB0aGVuIGl0J3MgdW5uZWNlc3NhcnkuXG4gIGlmIChzdGF0ZS5lbmRlZCB8fCBzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZG9SZWFkID0gZmFsc2U7XG4gICAgZGVidWcoJ3JlYWRpbmcgb3IgZW5kZWQnLCBkb1JlYWQpO1xuICB9IGVsc2UgaWYgKGRvUmVhZCkge1xuICAgIGRlYnVnKCdkbyByZWFkJyk7XG4gICAgc3RhdGUucmVhZGluZyA9IHRydWU7XG4gICAgc3RhdGUuc3luYyA9IHRydWU7XG4gICAgLy8gaWYgdGhlIGxlbmd0aCBpcyBjdXJyZW50bHkgemVybywgdGhlbiB3ZSAqbmVlZCogYSByZWFkYWJsZSBldmVudC5cbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIC8vIGNhbGwgaW50ZXJuYWwgcmVhZCBtZXRob2RcbiAgICB0aGlzLl9yZWFkKHN0YXRlLmhpZ2hXYXRlck1hcmspO1xuICAgIHN0YXRlLnN5bmMgPSBmYWxzZTtcbiAgICAvLyBJZiBfcmVhZCBwdXNoZWQgZGF0YSBzeW5jaHJvbm91c2x5LCB0aGVuIGByZWFkaW5nYCB3aWxsIGJlIGZhbHNlLFxuICAgIC8vIGFuZCB3ZSBuZWVkIHRvIHJlLWV2YWx1YXRlIGhvdyBtdWNoIGRhdGEgd2UgY2FuIHJldHVybiB0byB0aGUgdXNlci5cbiAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIG4gPSBob3dNdWNoVG9SZWFkKG5PcmlnLCBzdGF0ZSk7XG4gIH1cblxuICB2YXIgcmV0O1xuICBpZiAobiA+IDApIHJldCA9IGZyb21MaXN0KG4sIHN0YXRlKTtlbHNlIHJldCA9IG51bGw7XG5cbiAgaWYgKHJldCA9PT0gbnVsbCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgbiA9IDA7XG4gIH0gZWxzZSB7XG4gICAgc3RhdGUubGVuZ3RoIC09IG47XG4gIH1cblxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBub3RoaW5nIGluIHRoZSBidWZmZXIsIHRoZW4gd2Ugd2FudCB0byBrbm93XG4gICAgLy8gYXMgc29vbiBhcyB3ZSAqZG8qIGdldCBzb21ldGhpbmcgaW50byB0aGUgYnVmZmVyLlxuICAgIGlmICghc3RhdGUuZW5kZWQpIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG5cbiAgICAvLyBJZiB3ZSB0cmllZCB0byByZWFkKCkgcGFzdCB0aGUgRU9GLCB0aGVuIGVtaXQgZW5kIG9uIHRoZSBuZXh0IHRpY2suXG4gICAgaWYgKG5PcmlnICE9PSBuICYmIHN0YXRlLmVuZGVkKSBlbmRSZWFkYWJsZSh0aGlzKTtcbiAgfVxuXG4gIGlmIChyZXQgIT09IG51bGwpIHRoaXMuZW1pdCgnZGF0YScsIHJldCk7XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbmZ1bmN0aW9uIGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspIHtcbiAgdmFyIGVyID0gbnVsbDtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoY2h1bmspICYmIHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICB9XG4gIHJldHVybiBlcjtcbn1cblxuZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5lbmRlZCkgcmV0dXJuO1xuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG5cbiAgLy8gZW1pdCAncmVhZGFibGUnIG5vdyB0byBtYWtlIHN1cmUgaXQgZ2V0cyBwaWNrZWQgdXAuXG4gIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xufVxuXG4vLyBEb24ndCBlbWl0IHJlYWRhYmxlIHJpZ2h0IGF3YXkgaW4gc3luYyBtb2RlLCBiZWNhdXNlIHRoaXMgY2FuIHRyaWdnZXJcbi8vIGFub3RoZXIgcmVhZCgpIGNhbGwgPT4gc3RhY2sgb3ZlcmZsb3cuICBUaGlzIHdheSwgaXQgbWlnaHQgdHJpZ2dlclxuLy8gYSBuZXh0VGljayByZWN1cnNpb24gd2FybmluZywgYnV0IHRoYXQncyBub3Qgc28gYmFkLlxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHN0YXRlLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICBpZiAoIXN0YXRlLmVtaXR0ZWRSZWFkYWJsZSkge1xuICAgIGRlYnVnKCdlbWl0UmVhZGFibGUnLCBzdGF0ZS5mbG93aW5nKTtcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlO1xuICAgIGlmIChzdGF0ZS5zeW5jKSBwcm9jZXNzTmV4dFRpY2soZW1pdFJlYWRhYmxlXywgc3RyZWFtKTtlbHNlIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGVfKHN0cmVhbSkge1xuICBkZWJ1ZygnZW1pdCByZWFkYWJsZScpO1xuICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKTtcbiAgZmxvdyhzdHJlYW0pO1xufVxuXG4vLyBhdCB0aGlzIHBvaW50LCB0aGUgdXNlciBoYXMgcHJlc3VtYWJseSBzZWVuIHRoZSAncmVhZGFibGUnIGV2ZW50LFxuLy8gYW5kIGNhbGxlZCByZWFkKCkgdG8gY29uc3VtZSBzb21lIGRhdGEuICB0aGF0IG1heSBoYXZlIHRyaWdnZXJlZFxuLy8gaW4gdHVybiBhbm90aGVyIF9yZWFkKG4pIGNhbGwsIGluIHdoaWNoIGNhc2UgcmVhZGluZyA9IHRydWUgaWZcbi8vIGl0J3MgaW4gcHJvZ3Jlc3MuXG4vLyBIb3dldmVyLCBpZiB3ZSdyZSBub3QgZW5kZWQsIG9yIHJlYWRpbmcsIGFuZCB0aGUgbGVuZ3RoIDwgaHdtLFxuLy8gdGhlbiBnbyBhaGVhZCBhbmQgdHJ5IHRvIHJlYWQgc29tZSBtb3JlIHByZWVtcHRpdmVseS5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnJlYWRpbmdNb3JlKSB7XG4gICAgc3RhdGUucmVhZGluZ01vcmUgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhtYXliZVJlYWRNb3JlXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB3aGlsZSAoIXN0YXRlLnJlYWRpbmcgJiYgIXN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLmVuZGVkICYmIHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICBkZWJ1ZygnbWF5YmVSZWFkTW9yZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICBpZiAobGVuID09PSBzdGF0ZS5sZW5ndGgpXG4gICAgICAvLyBkaWRuJ3QgZ2V0IGFueSBkYXRhLCBzdG9wIHNwaW5uaW5nLlxuICAgICAgYnJlYWs7ZWxzZSBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIH1cbiAgc3RhdGUucmVhZGluZ01vcmUgPSBmYWxzZTtcbn1cblxuLy8gYWJzdHJhY3QgbWV0aG9kLiAgdG8gYmUgb3ZlcnJpZGRlbiBpbiBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gY2FsbCBjYihlciwgZGF0YSkgd2hlcmUgZGF0YSBpcyA8PSBuIGluIGxlbmd0aC5cbi8vIGZvciB2aXJ0dWFsIChub24tc3RyaW5nLCBub24tYnVmZmVyKSBzdHJlYW1zLCBcImxlbmd0aFwiIGlzIHNvbWV3aGF0XG4vLyBhcmJpdHJhcnksIGFuZCBwZXJoYXBzIG5vdCB2ZXJ5IG1lYW5pbmdmdWwuXG5SZWFkYWJsZS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdfcmVhZCgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuXG4gIHZhciBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnI7XG5cbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IGNsZWFudXA7XG4gIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBwcm9jZXNzTmV4dFRpY2soZW5kRm4pO2Vsc2Ugc3JjLm9uY2UoJ2VuZCcsIGVuZEZuKTtcblxuICBkZXN0Lm9uKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gIGZ1bmN0aW9uIG9udW5waXBlKHJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ29udW5waXBlJyk7XG4gICAgaWYgKHJlYWRhYmxlID09PSBzcmMpIHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKTtcbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cbiAgLy8gd2hlbiB0aGUgZGVzdCBkcmFpbnMsIGl0IHJlZHVjZXMgdGhlIGF3YWl0RHJhaW4gY291bnRlclxuICAvLyBvbiB0aGUgc291cmNlLiAgVGhpcyB3b3VsZCBiZSBtb3JlIGVsZWdhbnQgd2l0aCBhIC5vbmNlKClcbiAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgLy8gdG9vIHNsb3cuXG4gIHZhciBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjKTtcbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICB2YXIgY2xlYW5lZFVwID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgZGVidWcoJ2NsZWFudXAnKTtcbiAgICAvLyBjbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG5cbiAgICBjbGVhbmVkVXAgPSB0cnVlO1xuXG4gICAgLy8gaWYgdGhlIHJlYWRlciBpcyB3YWl0aW5nIGZvciBhIGRyYWluIGV2ZW50IGZyb20gdGhpc1xuICAgIC8vIHNwZWNpZmljIHdyaXRlciwgdGhlbiBpdCB3b3VsZCBjYXVzZSBpdCB0byBuZXZlciBzdGFydFxuICAgIC8vIGZsb3dpbmcgYWdhaW4uXG4gICAgLy8gU28sIGlmIHRoaXMgaXMgYXdhaXRpbmcgYSBkcmFpbiwgdGhlbiB3ZSBqdXN0IGNhbGwgaXQgbm93LlxuICAgIC8vIElmIHdlIGRvbid0IGtub3csIHRoZW4gYXNzdW1lIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG9uZS5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiAmJiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKSBvbmRyYWluKCk7XG4gIH1cblxuICAvLyBJZiB0aGUgdXNlciBwdXNoZXMgbW9yZSBkYXRhIHdoaWxlIHdlJ3JlIHdyaXRpbmcgdG8gZGVzdCB0aGVuIHdlJ2xsIGVuZCB1cFxuICAvLyBpbiBvbmRhdGEgYWdhaW4uIEhvd2V2ZXIsIHdlIG9ubHkgd2FudCB0byBpbmNyZWFzZSBhd2FpdERyYWluIG9uY2UgYmVjYXVzZVxuICAvLyBkZXN0IHdpbGwgb25seSBlbWl0IG9uZSAnZHJhaW4nIGV2ZW50IGZvciB0aGUgbXVsdGlwbGUgd3JpdGVzLlxuICAvLyA9PiBJbnRyb2R1Y2UgYSBndWFyZCBvbiBpbmNyZWFzaW5nIGF3YWl0RHJhaW4uXG4gIHZhciBpbmNyZWFzZWRBd2FpdERyYWluID0gZmFsc2U7XG4gIHNyYy5vbignZGF0YScsIG9uZGF0YSk7XG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGRlYnVnKCdvbmRhdGEnKTtcbiAgICBpbmNyZWFzZWRBd2FpdERyYWluID0gZmFsc2U7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGlmIChmYWxzZSA9PT0gcmV0ICYmICFpbmNyZWFzZWRBd2FpdERyYWluKSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAgIC8vIHRvIGdldCBzdHVjayBpbiBhIHBlcm1hbmVudGx5IHBhdXNlZCBzdGF0ZSBpZiB0aGF0IHdyaXRlXG4gICAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgICAgLy8gPT4gQ2hlY2sgd2hldGhlciBgZGVzdGAgaXMgc3RpbGwgYSBwaXBpbmcgZGVzdGluYXRpb24uXG4gICAgICBpZiAoKHN0YXRlLnBpcGVzQ291bnQgPT09IDEgJiYgc3RhdGUucGlwZXMgPT09IGRlc3QgfHwgc3RhdGUucGlwZXNDb3VudCA+IDEgJiYgaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCkgIT09IC0xKSAmJiAhY2xlYW5lZFVwKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICAgIGluY3JlYXNlZEF3YWl0RHJhaW4gPSB0cnVlO1xuICAgICAgfVxuICAgICAgc3JjLnBhdXNlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIGRlc3QgaGFzIGFuIGVycm9yLCB0aGVuIHN0b3AgcGlwaW5nIGludG8gaXQuXG4gIC8vIGhvd2V2ZXIsIGRvbid0IHN1cHByZXNzIHRoZSB0aHJvd2luZyBiZWhhdmlvciBmb3IgdGhpcy5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGRlYnVnKCdvbmVycm9yJywgZXIpO1xuICAgIHVucGlwZSgpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgaWYgKEVFbGlzdGVuZXJDb3VudChkZXN0LCAnZXJyb3InKSA9PT0gMCkgZGVzdC5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgdXNlcmxhbmQgb25lcy5cbiAgcHJlcGVuZExpc3RlbmVyKGRlc3QsICdlcnJvcicsIG9uZXJyb3IpO1xuXG4gIC8vIEJvdGggY2xvc2UgYW5kIGZpbmlzaCBzaG91bGQgdHJpZ2dlciB1bnBpcGUsIGJ1dCBvbmx5IG9uY2UuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKTtcbiAgZnVuY3Rpb24gb25maW5pc2goKSB7XG4gICAgZGVidWcoJ29uZmluaXNoJyk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblxuICBmdW5jdGlvbiB1bnBpcGUoKSB7XG4gICAgZGVidWcoJ3VucGlwZScpO1xuICAgIHNyYy51bnBpcGUoZGVzdCk7XG4gIH1cblxuICAvLyB0ZWxsIHRoZSBkZXN0IHRoYXQgaXQncyBiZWluZyBwaXBlZCB0b1xuICBkZXN0LmVtaXQoJ3BpcGUnLCBzcmMpO1xuXG4gIC8vIHN0YXJ0IHRoZSBmbG93IGlmIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BpcGUgcmVzdW1lJyk7XG4gICAgc3JjLnJlc3VtZSgpO1xuICB9XG5cbiAgcmV0dXJuIGRlc3Q7XG59O1xuXG5mdW5jdGlvbiBwaXBlT25EcmFpbihzcmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhdGUgPSBzcmMuX3JlYWRhYmxlU3RhdGU7XG4gICAgZGVidWcoJ3BpcGVPbkRyYWluJywgc3RhdGUuYXdhaXREcmFpbik7XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4pIHN0YXRlLmF3YWl0RHJhaW4tLTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiA9PT0gMCAmJiBFRWxpc3RlbmVyQ291bnQoc3JjLCAnZGF0YScpKSB7XG4gICAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICAgIGZsb3coc3JjKTtcbiAgICB9XG4gIH07XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS51bnBpcGUgPSBmdW5jdGlvbiAoZGVzdCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIC8vIGlmIHdlJ3JlIG5vdCBwaXBpbmcgYW55d2hlcmUsIHRoZW4gZG8gbm90aGluZy5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDApIHJldHVybiB0aGlzO1xuXG4gIC8vIGp1c3Qgb25lIGRlc3RpbmF0aW9uLiAgbW9zdCBjb21tb24gY2FzZS5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHtcbiAgICAvLyBwYXNzZWQgaW4gb25lLCBidXQgaXQncyBub3QgdGhlIHJpZ2h0IG9uZS5cbiAgICBpZiAoZGVzdCAmJiBkZXN0ICE9PSBzdGF0ZS5waXBlcykgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAoIWRlc3QpIGRlc3QgPSBzdGF0ZS5waXBlcztcblxuICAgIC8vIGdvdCBhIG1hdGNoLlxuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgaWYgKGRlc3QpIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBzbG93IGNhc2UuIG11bHRpcGxlIHBpcGUgZGVzdGluYXRpb25zLlxuXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgdmFyIGRlc3RzID0gc3RhdGUucGlwZXM7XG4gICAgdmFyIGxlbiA9IHN0YXRlLnBpcGVzQ291bnQ7XG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RzW2ldLmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIH1yZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpbmRleCA9IGluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gdGhpcztcblxuICBzdGF0ZS5waXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuXG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBzZXQgdXAgZGF0YSBldmVudHMgaWYgdGhleSBhcmUgYXNrZWQgZm9yXG4vLyBFbnN1cmUgcmVhZGFibGUgbGlzdGVuZXJzIGV2ZW50dWFsbHkgZ2V0IHNvbWV0aGluZ1xuUmVhZGFibGUucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgaWYgKGV2ID09PSAnZGF0YScpIHtcbiAgICAvLyBTdGFydCBmbG93aW5nIG9uIG5leHQgdGljayBpZiBzdHJlYW0gaXNuJ3QgZXhwbGljaXRseSBwYXVzZWRcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nICE9PSBmYWxzZSkgdGhpcy5yZXN1bWUoKTtcbiAgfSBlbHNlIGlmIChldiA9PT0gJ3JlYWRhYmxlJykge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmICFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgcHJvY2Vzc05leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMsIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IFJlYWRhYmxlLnByb3RvdHlwZS5vbjtcblxuZnVuY3Rpb24gblJlYWRpbmdOZXh0VGljayhzZWxmKSB7XG4gIGRlYnVnKCdyZWFkYWJsZSBuZXh0dGljayByZWFkIDAnKTtcbiAgc2VsZi5yZWFkKDApO1xufVxuXG4vLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJyk7XG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RhdGUuYXdhaXREcmFpbiA9IDA7XG4gIHN0cmVhbS5lbWl0KCdyZXN1bWUnKTtcbiAgZmxvdyhzdHJlYW0pO1xuICBpZiAoc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUucmVhZGluZykgc3RyZWFtLnJlYWQoMCk7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyk7XG4gIGlmIChmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BhdXNlJyk7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZmxvdyhzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZmxvdycsIHN0YXRlLmZsb3dpbmcpO1xuICB3aGlsZSAoc3RhdGUuZmxvd2luZyAmJiBzdHJlYW0ucmVhZCgpICE9PSBudWxsKSB7fVxufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHBhdXNlZCA9IGZhbHNlO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgc2VsZi5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBzZWxmLnB1c2gobnVsbCk7XG4gIH0pO1xuXG4gIHN0cmVhbS5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgIGRlYnVnKCd3cmFwcGVkIGRhdGEnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcblxuICAgIC8vIGRvbid0IHNraXAgb3ZlciBmYWxzeSB2YWx1ZXMgaW4gb2JqZWN0TW9kZVxuICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlICYmIChjaHVuayA9PT0gbnVsbCB8fCBjaHVuayA9PT0gdW5kZWZpbmVkKSkgcmV0dXJuO2Vsc2UgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkpIHJldHVybjtcblxuICAgIHZhciByZXQgPSBzZWxmLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIHZhciBldmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG4gIGZvckVhY2goZXZlbnRzLCBmdW5jdGlvbiAoZXYpIHtcbiAgICBzdHJlYW0ub24oZXYsIHNlbGYuZW1pdC5iaW5kKHNlbGYsIGV2KSk7XG4gIH0pO1xuXG4gIC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG4gIHNlbGYuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzZWxmO1xufTtcblxuLy8gZXhwb3NlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuUmVhZGFibGUuX2Zyb21MaXN0ID0gZnJvbUxpc3Q7XG5cbi8vIFBsdWNrIG9mZiBuIGJ5dGVzIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVycy5cbi8vIExlbmd0aCBpcyB0aGUgY29tYmluZWQgbGVuZ3RocyBvZiBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGxpc3QuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGZyb21MaXN0KG4sIHN0YXRlKSB7XG4gIC8vIG5vdGhpbmcgYnVmZmVyZWRcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgdmFyIHJldDtcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldCA9IHN0YXRlLmJ1ZmZlci5zaGlmdCgpO2Vsc2UgaWYgKCFuIHx8IG4gPj0gc3RhdGUubGVuZ3RoKSB7XG4gICAgLy8gcmVhZCBpdCBhbGwsIHRydW5jYXRlIHRoZSBsaXN0XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpIHJldCA9IHN0YXRlLmJ1ZmZlci5qb2luKCcnKTtlbHNlIGlmIChzdGF0ZS5idWZmZXIubGVuZ3RoID09PSAxKSByZXQgPSBzdGF0ZS5idWZmZXIuaGVhZC5kYXRhO2Vsc2UgcmV0ID0gc3RhdGUuYnVmZmVyLmNvbmNhdChzdGF0ZS5sZW5ndGgpO1xuICAgIHN0YXRlLmJ1ZmZlci5jbGVhcigpO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlYWQgcGFydCBvZiBsaXN0XG4gICAgcmV0ID0gZnJvbUxpc3RQYXJ0aWFsKG4sIHN0YXRlLmJ1ZmZlciwgc3RhdGUuZGVjb2Rlcik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG4vLyBFeHRyYWN0cyBvbmx5IGVub3VnaCBidWZmZXJlZCBkYXRhIHRvIHNhdGlzZnkgdGhlIGFtb3VudCByZXF1ZXN0ZWQuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGZyb21MaXN0UGFydGlhbChuLCBsaXN0LCBoYXNTdHJpbmdzKSB7XG4gIHZhciByZXQ7XG4gIGlmIChuIDwgbGlzdC5oZWFkLmRhdGEubGVuZ3RoKSB7XG4gICAgLy8gc2xpY2UgaXMgdGhlIHNhbWUgZm9yIGJ1ZmZlcnMgYW5kIHN0cmluZ3NcbiAgICByZXQgPSBsaXN0LmhlYWQuZGF0YS5zbGljZSgwLCBuKTtcbiAgICBsaXN0LmhlYWQuZGF0YSA9IGxpc3QuaGVhZC5kYXRhLnNsaWNlKG4pO1xuICB9IGVsc2UgaWYgKG4gPT09IGxpc3QuaGVhZC5kYXRhLmxlbmd0aCkge1xuICAgIC8vIGZpcnN0IGNodW5rIGlzIGEgcGVyZmVjdCBtYXRjaFxuICAgIHJldCA9IGxpc3Quc2hpZnQoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZXN1bHQgc3BhbnMgbW9yZSB0aGFuIG9uZSBidWZmZXJcbiAgICByZXQgPSBoYXNTdHJpbmdzID8gY29weUZyb21CdWZmZXJTdHJpbmcobiwgbGlzdCkgOiBjb3B5RnJvbUJ1ZmZlcihuLCBsaXN0KTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vLyBDb3BpZXMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGlzdCBvZiBidWZmZXJlZCBkYXRhXG4vLyBjaHVua3MuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGNvcHlGcm9tQnVmZmVyU3RyaW5nKG4sIGxpc3QpIHtcbiAgdmFyIHAgPSBsaXN0LmhlYWQ7XG4gIHZhciBjID0gMTtcbiAgdmFyIHJldCA9IHAuZGF0YTtcbiAgbiAtPSByZXQubGVuZ3RoO1xuICB3aGlsZSAocCA9IHAubmV4dCkge1xuICAgIHZhciBzdHIgPSBwLmRhdGE7XG4gICAgdmFyIG5iID0gbiA+IHN0ci5sZW5ndGggPyBzdHIubGVuZ3RoIDogbjtcbiAgICBpZiAobmIgPT09IHN0ci5sZW5ndGgpIHJldCArPSBzdHI7ZWxzZSByZXQgKz0gc3RyLnNsaWNlKDAsIG4pO1xuICAgIG4gLT0gbmI7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGlmIChuYiA9PT0gc3RyLmxlbmd0aCkge1xuICAgICAgICArK2M7XG4gICAgICAgIGlmIChwLm5leHQpIGxpc3QuaGVhZCA9IHAubmV4dDtlbHNlIGxpc3QuaGVhZCA9IGxpc3QudGFpbCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0LmhlYWQgPSBwO1xuICAgICAgICBwLmRhdGEgPSBzdHIuc2xpY2UobmIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgICsrYztcbiAgfVxuICBsaXN0Lmxlbmd0aCAtPSBjO1xuICByZXR1cm4gcmV0O1xufVxuXG4vLyBDb3BpZXMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIGJ5dGVzIGZyb20gdGhlIGxpc3Qgb2YgYnVmZmVyZWQgZGF0YSBjaHVua3MuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGNvcHlGcm9tQnVmZmVyKG4sIGxpc3QpIHtcbiAgdmFyIHJldCA9IGJ1ZmZlclNoaW0uYWxsb2NVbnNhZmUobik7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHAuZGF0YS5jb3B5KHJldCk7XG4gIG4gLT0gcC5kYXRhLmxlbmd0aDtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgYnVmID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBidWYubGVuZ3RoID8gYnVmLmxlbmd0aCA6IG47XG4gICAgYnVmLmNvcHkocmV0LCByZXQubGVuZ3RoIC0gbiwgMCwgbmIpO1xuICAgIG4gLT0gbmI7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGlmIChuYiA9PT0gYnVmLmxlbmd0aCkge1xuICAgICAgICArK2M7XG4gICAgICAgIGlmIChwLm5leHQpIGxpc3QuaGVhZCA9IHAubmV4dDtlbHNlIGxpc3QuaGVhZCA9IGxpc3QudGFpbCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0LmhlYWQgPSBwO1xuICAgICAgICBwLmRhdGEgPSBidWYuc2xpY2UobmIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgICsrYztcbiAgfVxuICBsaXN0Lmxlbmd0aCAtPSBjO1xuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuXG4gIC8vIElmIHdlIGdldCBoZXJlIGJlZm9yZSBjb25zdW1pbmcgYWxsIHRoZSBieXRlcywgdGhlbiB0aGF0IGlzIGFcbiAgLy8gYnVnIGluIG5vZGUuICBTaG91bGQgbmV2ZXIgaGFwcGVuLlxuICBpZiAoc3RhdGUubGVuZ3RoID4gMCkgdGhyb3cgbmV3IEVycm9yKCdcImVuZFJlYWRhYmxlKClcIiBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO1xuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCkge1xuICAgIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2soZW5kUmVhZGFibGVOVCwgc3RhdGUsIHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGVOVChzdGF0ZSwgc3RyZWFtKSB7XG4gIC8vIENoZWNrIHRoYXQgd2UgZGlkbid0IGdldCBvbmUgbGFzdCB1bnNoaWZ0LlxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2VuZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvckVhY2goeHMsIGYpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmKHhzW2ldLCBpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbmRleE9mKHhzLCB4KSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKHhzW2ldID09PSB4KSByZXR1cm4gaTtcbiAgfVxuICByZXR1cm4gLTE7XG59XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qc1xuLy8gbW9kdWxlIGlkID0gNTg5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 590 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(process) {'use strict';\n\nif (!process.version ||\n    process.version.indexOf('v0.') === 0 ||\n    process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {\n  module.exports = nextTick;\n} else {\n  module.exports = process.nextTick;\n}\n\nfunction nextTick(fn, arg1, arg2, arg3) {\n  if (typeof fn !== 'function') {\n    throw new TypeError('\"callback\" argument must be a function');\n  }\n  var len = arguments.length;\n  var args, i;\n  switch (len) {\n  case 0:\n  case 1:\n    return process.nextTick(fn);\n  case 2:\n    return process.nextTick(function afterTickOne() {\n      fn.call(null, arg1);\n    });\n  case 3:\n    return process.nextTick(function afterTickTwo() {\n      fn.call(null, arg1, arg2);\n    });\n  case 4:\n    return process.nextTick(function afterTickThree() {\n      fn.call(null, arg1, arg2, arg3);\n    });\n  default:\n    args = new Array(len - 1);\n    i = 0;\n    while (i < args.length) {\n      args[i++] = arguments[i];\n    }\n    return process.nextTick(function afterTick() {\n      fn.apply(null, args);\n    });\n  }\n}\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(200)))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTkwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9wcm9jZXNzLW5leHRpY2stYXJncy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmlmICghcHJvY2Vzcy52ZXJzaW9uIHx8XG4gICAgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YwLicpID09PSAwIHx8XG4gICAgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YxLicpID09PSAwICYmIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MS44LicpICE9PSAwKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gbmV4dFRpY2s7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHByb2Nlc3MubmV4dFRpY2s7XG59XG5cbmZ1bmN0aW9uIG5leHRUaWNrKGZuLCBhcmcxLCBhcmcyLCBhcmczKSB7XG4gIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImNhbGxiYWNrXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cbiAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBhcmdzLCBpO1xuICBzd2l0Y2ggKGxlbikge1xuICBjYXNlIDA6XG4gIGNhc2UgMTpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmbik7XG4gIGNhc2UgMjpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tPbmUoKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEpO1xuICAgIH0pO1xuICBjYXNlIDM6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrVHdvKCkge1xuICAgICAgZm4uY2FsbChudWxsLCBhcmcxLCBhcmcyKTtcbiAgICB9KTtcbiAgY2FzZSA0OlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja1RocmVlKCkge1xuICAgICAgZm4uY2FsbChudWxsLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICB9KTtcbiAgZGVmYXVsdDpcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiAtIDEpO1xuICAgIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgYXJncy5sZW5ndGgpIHtcbiAgICAgIGFyZ3NbaSsrXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrKCkge1xuICAgICAgZm4uYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfSk7XG4gIH1cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9wcm9jZXNzLW5leHRpY2stYXJncy9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTkwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 591 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(Buffer, global) {/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n * @license  MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = __webpack_require__(592)\nvar ieee754 = __webpack_require__(584)\nvar isArray = __webpack_require__(585)\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\nBuffer.poolSize = 8192 // not used by this implementation\n\nvar rootParent = {}\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n *   - Safari 5-7 lacks support for changing the `Object.prototype.constructor` property\n *     on objects.\n *\n *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n *     incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n  ? global.TYPED_ARRAY_SUPPORT\n  : typedArraySupport()\n\nfunction typedArraySupport () {\n  function Bar () {}\n  try {\n    var arr = new Uint8Array(1)\n    arr.foo = function () { return 42 }\n    arr.constructor = Bar\n    return arr.foo() === 42 && // typed array instances can be augmented\n        arr.constructor === Bar && // constructor can be set\n        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n  } catch (e) {\n    return false\n  }\n}\n\nfunction kMaxLength () {\n  return Buffer.TYPED_ARRAY_SUPPORT\n    ? 0x7fffffff\n    : 0x3fffffff\n}\n\n/**\n * Class: Buffer\n * =============\n *\n * The Buffer constructor returns instances of `Uint8Array` that are augmented\n * with function properties for all the node `Buffer` API functions. We use\n * `Uint8Array` so that square bracket notation works as expected -- it returns\n * a single octet.\n *\n * By augmenting the instances, we can avoid modifying the `Uint8Array`\n * prototype.\n */\nfunction Buffer (arg) {\n  if (!(this instanceof Buffer)) {\n    // Avoid going through an ArgumentsAdaptorTrampoline in the common case.\n    if (arguments.length > 1) return new Buffer(arg, arguments[1])\n    return new Buffer(arg)\n  }\n\n  if (!Buffer.TYPED_ARRAY_SUPPORT) {\n    this.length = 0\n    this.parent = undefined\n  }\n\n  // Common case.\n  if (typeof arg === 'number') {\n    return fromNumber(this, arg)\n  }\n\n  // Slightly less common case.\n  if (typeof arg === 'string') {\n    return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8')\n  }\n\n  // Unusual.\n  return fromObject(this, arg)\n}\n\nfunction fromNumber (that, length) {\n  that = allocate(that, length < 0 ? 0 : checked(length) | 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) {\n    for (var i = 0; i < length; i++) {\n      that[i] = 0\n    }\n  }\n  return that\n}\n\nfunction fromString (that, string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8'\n\n  // Assumption: byteLength() return value is always < kMaxLength.\n  var length = byteLength(string, encoding) | 0\n  that = allocate(that, length)\n\n  that.write(string, encoding)\n  return that\n}\n\nfunction fromObject (that, object) {\n  if (Buffer.isBuffer(object)) return fromBuffer(that, object)\n\n  if (isArray(object)) return fromArray(that, object)\n\n  if (object == null) {\n    throw new TypeError('must start with number, buffer, array or string')\n  }\n\n  if (typeof ArrayBuffer !== 'undefined') {\n    if (object.buffer instanceof ArrayBuffer) {\n      return fromTypedArray(that, object)\n    }\n    if (object instanceof ArrayBuffer) {\n      return fromArrayBuffer(that, object)\n    }\n  }\n\n  if (object.length) return fromArrayLike(that, object)\n\n  return fromJsonObject(that, object)\n}\n\nfunction fromBuffer (that, buffer) {\n  var length = checked(buffer.length) | 0\n  that = allocate(that, length)\n  buffer.copy(that, 0, 0, length)\n  return that\n}\n\nfunction fromArray (that, array) {\n  var length = checked(array.length) | 0\n  that = allocate(that, length)\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\n// Duplicate of fromArray() to keep fromArray() monomorphic.\nfunction fromTypedArray (that, array) {\n  var length = checked(array.length) | 0\n  that = allocate(that, length)\n  // Truncating the elements is probably not what people expect from typed\n  // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior\n  // of the old Buffer constructor.\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\nfunction fromArrayBuffer (that, array) {\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    array.byteLength\n    that = Buffer._augment(new Uint8Array(array))\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    that = fromTypedArray(that, new Uint8Array(array))\n  }\n  return that\n}\n\nfunction fromArrayLike (that, array) {\n  var length = checked(array.length) | 0\n  that = allocate(that, length)\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\n// Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object.\n// Returns a zero-length buffer for inputs that don't conform to the spec.\nfunction fromJsonObject (that, object) {\n  var array\n  var length = 0\n\n  if (object.type === 'Buffer' && isArray(object.data)) {\n    array = object.data\n    length = checked(array.length) | 0\n  }\n  that = allocate(that, length)\n\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n  Buffer.prototype.__proto__ = Uint8Array.prototype\n  Buffer.__proto__ = Uint8Array\n} else {\n  // pre-set for values that may exist in the future\n  Buffer.prototype.length = undefined\n  Buffer.prototype.parent = undefined\n}\n\nfunction allocate (that, length) {\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = Buffer._augment(new Uint8Array(length))\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    that.length = length\n    that._isBuffer = true\n  }\n\n  var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1\n  if (fromPool) that.parent = rootParent\n\n  return that\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < kMaxLength` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= kMaxLength()) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + kMaxLength().toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (subject, encoding) {\n  if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding)\n\n  var buf = new Buffer(subject, encoding)\n  delete buf.parent\n  return buf\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError('Arguments must be Buffers')\n  }\n\n  if (a === b) return 0\n\n  var x = a.length\n  var y = b.length\n\n  var i = 0\n  var len = Math.min(x, y)\n  while (i < len) {\n    if (a[i] !== b[i]) break\n\n    ++i\n  }\n\n  if (i !== len) {\n    x = a[i]\n    y = b[i]\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'binary':\n    case 'base64':\n    case 'raw':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.')\n\n  if (list.length === 0) {\n    return new Buffer(0)\n  }\n\n  var i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; i++) {\n      length += list[i].length\n    }\n  }\n\n  var buf = new Buffer(length)\n  var pos = 0\n  for (i = 0; i < list.length; i++) {\n    var item = list[i]\n    item.copy(buf, pos)\n    pos += item.length\n  }\n  return buf\n}\n\nfunction byteLength (string, encoding) {\n  if (typeof string !== 'string') string = '' + string\n\n  var len = string.length\n  if (len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'binary':\n      // Deprecated\n      case 'raw':\n      case 'raws':\n        return len\n      case 'utf8':\n      case 'utf-8':\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) return utf8ToBytes(string).length // assume utf8\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n  var loweredCase = false\n\n  start = start | 0\n  end = end === undefined || end === Infinity ? this.length : end | 0\n\n  if (!encoding) encoding = 'utf8'\n  if (start < 0) start = 0\n  if (end > this.length) end = this.length\n  if (end <= start) return ''\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'binary':\n        return binarySlice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toString = function toString () {\n  var length = this.length | 0\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  var str = ''\n  var max = exports.INSPECT_MAX_BYTES\n  if (this.length > 0) {\n    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n    if (this.length > max) str += ' ... '\n  }\n  return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return 0\n  return Buffer.compare(this, b)\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset) {\n  if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff\n  else if (byteOffset < -0x80000000) byteOffset = -0x80000000\n  byteOffset >>= 0\n\n  if (this.length === 0) return -1\n  if (byteOffset >= this.length) return -1\n\n  // Negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0)\n\n  if (typeof val === 'string') {\n    if (val.length === 0) return -1 // special case: looking for empty string always fails\n    return String.prototype.indexOf.call(this, val, byteOffset)\n  }\n  if (Buffer.isBuffer(val)) {\n    return arrayIndexOf(this, val, byteOffset)\n  }\n  if (typeof val === 'number') {\n    if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') {\n      return Uint8Array.prototype.indexOf.call(this, val, byteOffset)\n    }\n    return arrayIndexOf(this, [ val ], byteOffset)\n  }\n\n  function arrayIndexOf (arr, val, byteOffset) {\n    var foundIndex = -1\n    for (var i = 0; byteOffset + i < arr.length; i++) {\n      if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex\n      } else {\n        foundIndex = -1\n      }\n    }\n    return -1\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\n// `get` is deprecated\nBuffer.prototype.get = function get (offset) {\n  console.log('.get() is deprecated. Access using array indexes instead.')\n  return this.readUInt8(offset)\n}\n\n// `set` is deprecated\nBuffer.prototype.set = function set (v, offset) {\n  console.log('.set() is deprecated. Access using array indexes instead.')\n  return this.writeUInt8(v, offset)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  var remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  // must be an even number of digits\n  var strLen = string.length\n  if (strLen % 2 !== 0) throw new Error('Invalid hex string')\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  for (var i = 0; i < length; i++) {\n    var parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (isNaN(parsed)) throw new Error('Invalid hex string')\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction binaryWrite (buf, string, offset, length) {\n  return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset | 0\n    if (isFinite(length)) {\n      length = length | 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  // legacy write(string, encoding, offset, length) - remove in v0.13\n  } else {\n    var swap = encoding\n    encoding = offset\n    offset = length | 0\n    length = swap\n  }\n\n  var remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n        return asciiWrite(this, string, offset, length)\n\n      case 'binary':\n        return binaryWrite(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  var res = []\n\n  var i = start\n  while (i < end) {\n    var firstByte = buf[i]\n    var codePoint = null\n    var bytesPerSequence = (firstByte > 0xEF) ? 4\n      : (firstByte > 0xDF) ? 3\n      : (firstByte > 0xBF) ? 2\n      : 1\n\n    if (i + bytesPerSequence <= end) {\n      var secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  var len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  var res = ''\n  var i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; i++) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction binarySlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; i++) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  var len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  var out = ''\n  for (var i = start; i < end; i++) {\n    out += toHex(buf[i])\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  var bytes = buf.slice(start, end)\n  var res = ''\n  for (var i = 0; i < bytes.length; i += 2) {\n    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  var len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  var newBuf\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    newBuf = Buffer._augment(this.subarray(start, end))\n  } else {\n    var sliceLen = end - start\n    newBuf = new Buffer(sliceLen, undefined)\n    for (var i = 0; i < sliceLen; i++) {\n      newBuf[i] = this[i + start]\n    }\n  }\n\n  if (newBuf.length) newBuf.parent = this.parent || this\n\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  var val = this[offset + --byteLength]\n  var mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var i = byteLength\n  var mul = 1\n  var val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('value is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)\n\n  var mul = 1\n  var i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)\n\n  var i = byteLength - 1\n  var mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) {\n    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n      (littleEndian ? i : 1 - i) * 8\n  }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffffffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) {\n    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n  }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset + 3] = (value >>> 24)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 1] = (value >>> 8)\n    this[offset] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = 0\n  var mul = 1\n  var sub = value < 0 ? 1 : 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  var sub = value < 0 ? 1 : 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 3] = (value >>> 24)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (value > max || value < min) throw new RangeError('value is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('index out of range')\n  if (offset < 0) throw new RangeError('index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  var len = end - start\n  var i\n\n  if (this === target && start < targetStart && targetStart < end) {\n    // descending copy from end\n    for (i = len - 1; i >= 0; i--) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n    // ascending copy from start\n    for (i = 0; i < len; i++) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else {\n    target._set(this.subarray(start, start + len), targetStart)\n  }\n\n  return len\n}\n\n// fill(value, start=0, end=buffer.length)\nBuffer.prototype.fill = function fill (value, start, end) {\n  if (!value) value = 0\n  if (!start) start = 0\n  if (!end) end = this.length\n\n  if (end < start) throw new RangeError('end < start')\n\n  // Fill 0 bytes; we're done\n  if (end === start) return\n  if (this.length === 0) return\n\n  if (start < 0 || start >= this.length) throw new RangeError('start out of bounds')\n  if (end < 0 || end > this.length) throw new RangeError('end out of bounds')\n\n  var i\n  if (typeof value === 'number') {\n    for (i = start; i < end; i++) {\n      this[i] = value\n    }\n  } else {\n    var bytes = utf8ToBytes(value.toString())\n    var len = bytes.length\n    for (i = start; i < end; i++) {\n      this[i] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n/**\n * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.\n * Added in Node 0.12. Only available in browsers that support ArrayBuffer.\n */\nBuffer.prototype.toArrayBuffer = function toArrayBuffer () {\n  if (typeof Uint8Array !== 'undefined') {\n    if (Buffer.TYPED_ARRAY_SUPPORT) {\n      return (new Buffer(this)).buffer\n    } else {\n      var buf = new Uint8Array(this.length)\n      for (var i = 0, len = buf.length; i < len; i += 1) {\n        buf[i] = this[i]\n      }\n      return buf.buffer\n    }\n  } else {\n    throw new TypeError('Buffer.toArrayBuffer not supported in this browser')\n  }\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar BP = Buffer.prototype\n\n/**\n * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods\n */\nBuffer._augment = function _augment (arr) {\n  arr.constructor = Buffer\n  arr._isBuffer = true\n\n  // save reference to original Uint8Array set method before overwriting\n  arr._set = arr.set\n\n  // deprecated\n  arr.get = BP.get\n  arr.set = BP.set\n\n  arr.write = BP.write\n  arr.toString = BP.toString\n  arr.toLocaleString = BP.toString\n  arr.toJSON = BP.toJSON\n  arr.equals = BP.equals\n  arr.compare = BP.compare\n  arr.indexOf = BP.indexOf\n  arr.copy = BP.copy\n  arr.slice = BP.slice\n  arr.readUIntLE = BP.readUIntLE\n  arr.readUIntBE = BP.readUIntBE\n  arr.readUInt8 = BP.readUInt8\n  arr.readUInt16LE = BP.readUInt16LE\n  arr.readUInt16BE = BP.readUInt16BE\n  arr.readUInt32LE = BP.readUInt32LE\n  arr.readUInt32BE = BP.readUInt32BE\n  arr.readIntLE = BP.readIntLE\n  arr.readIntBE = BP.readIntBE\n  arr.readInt8 = BP.readInt8\n  arr.readInt16LE = BP.readInt16LE\n  arr.readInt16BE = BP.readInt16BE\n  arr.readInt32LE = BP.readInt32LE\n  arr.readInt32BE = BP.readInt32BE\n  arr.readFloatLE = BP.readFloatLE\n  arr.readFloatBE = BP.readFloatBE\n  arr.readDoubleLE = BP.readDoubleLE\n  arr.readDoubleBE = BP.readDoubleBE\n  arr.writeUInt8 = BP.writeUInt8\n  arr.writeUIntLE = BP.writeUIntLE\n  arr.writeUIntBE = BP.writeUIntBE\n  arr.writeUInt16LE = BP.writeUInt16LE\n  arr.writeUInt16BE = BP.writeUInt16BE\n  arr.writeUInt32LE = BP.writeUInt32LE\n  arr.writeUInt32BE = BP.writeUInt32BE\n  arr.writeIntLE = BP.writeIntLE\n  arr.writeIntBE = BP.writeIntBE\n  arr.writeInt8 = BP.writeInt8\n  arr.writeInt16LE = BP.writeInt16LE\n  arr.writeInt16BE = BP.writeInt16BE\n  arr.writeInt32LE = BP.writeInt32LE\n  arr.writeInt32BE = BP.writeInt32BE\n  arr.writeFloatLE = BP.writeFloatLE\n  arr.writeFloatBE = BP.writeFloatBE\n  arr.writeDoubleLE = BP.writeDoubleLE\n  arr.writeDoubleBE = BP.writeDoubleBE\n  arr.fill = BP.fill\n  arr.inspect = BP.inspect\n  arr.toArrayBuffer = BP.toArrayBuffer\n\n  return arr\n}\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction stringtrim (str) {\n  if (str.trim) return str.trim()\n  return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n  if (n < 16) return '0' + n.toString(16)\n  return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  var codePoint\n  var length = string.length\n  var leadSurrogate = null\n  var bytes = []\n\n  for (var i = 0; i < length; i++) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; i++) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  var c, hi, lo\n  var byteArray = []\n  for (var i = 0; i < str.length; i++) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  for (var i = 0; i < length; i++) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(582).Buffer, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTkxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCdiYXNlNjQtanMnKVxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG52YXIgcm9vdFBhcmVudCA9IHt9XG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIER1ZSB0byB2YXJpb3VzIGJyb3dzZXIgYnVncywgc29tZXRpbWVzIHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkIGV2ZW5cbiAqIHdoZW4gdGhlIGJyb3dzZXIgc3VwcG9ydHMgdHlwZWQgYXJyYXlzLlxuICpcbiAqIE5vdGU6XG4gKlxuICogICAtIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcyxcbiAqICAgICBTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOC5cbiAqXG4gKiAgIC0gU2FmYXJpIDUtNyBsYWNrcyBzdXBwb3J0IGZvciBjaGFuZ2luZyB0aGUgYE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3JgIHByb3BlcnR5XG4gKiAgICAgb24gb2JqZWN0cy5cbiAqXG4gKiAgIC0gQ2hyb21lIDktMTAgaXMgbWlzc2luZyB0aGUgYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbi5cbiAqXG4gKiAgIC0gSUUxMCBoYXMgYSBicm9rZW4gYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFycmF5cyBvZlxuICogICAgIGluY29ycmVjdCBsZW5ndGggaW4gc29tZSBzaXR1YXRpb25zLlxuXG4gKiBXZSBkZXRlY3QgdGhlc2UgYnVnZ3kgYnJvd3NlcnMgYW5kIHNldCBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgIHRvIGBmYWxzZWAgc28gdGhleVxuICogZ2V0IHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIHNsb3dlciBidXQgYmVoYXZlcyBjb3JyZWN0bHkuXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlQgIT09IHVuZGVmaW5lZFxuICA/IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gIDogdHlwZWRBcnJheVN1cHBvcnQoKVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIGZ1bmN0aW9uIEJhciAoKSB7fVxuICB0cnkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAgIGFyci5mb28gPSBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9XG4gICAgYXJyLmNvbnN0cnVjdG9yID0gQmFyXG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDIgJiYgLy8gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWRcbiAgICAgICAgYXJyLmNvbnN0cnVjdG9yID09PSBCYXIgJiYgLy8gY29uc3RydWN0b3IgY2FuIGJlIHNldFxuICAgICAgICB0eXBlb2YgYXJyLnN1YmFycmF5ID09PSAnZnVuY3Rpb24nICYmIC8vIGNocm9tZSA5LTEwIGxhY2sgYHN1YmFycmF5YFxuICAgICAgICBhcnIuc3ViYXJyYXkoMSwgMSkuYnl0ZUxlbmd0aCA9PT0gMCAvLyBpZTEwIGhhcyBicm9rZW4gYHN1YmFycmF5YFxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24ga01heExlbmd0aCAoKSB7XG4gIHJldHVybiBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVFxuICAgID8gMHg3ZmZmZmZmZlxuICAgIDogMHgzZmZmZmZmZlxufVxuXG4vKipcbiAqIENsYXNzOiBCdWZmZXJcbiAqID09PT09PT09PT09PT1cbiAqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGFyZSBhdWdtZW50ZWRcbiAqIHdpdGggZnVuY3Rpb24gcHJvcGVydGllcyBmb3IgYWxsIHRoZSBub2RlIGBCdWZmZXJgIEFQSSBmdW5jdGlvbnMuIFdlIHVzZVxuICogYFVpbnQ4QXJyYXlgIHNvIHRoYXQgc3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXQgcmV0dXJuc1xuICogYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogQnkgYXVnbWVudGluZyB0aGUgaW5zdGFuY2VzLCB3ZSBjYW4gYXZvaWQgbW9kaWZ5aW5nIHRoZSBgVWludDhBcnJheWBcbiAqIHByb3RvdHlwZS5cbiAqL1xuZnVuY3Rpb24gQnVmZmVyIChhcmcpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICAvLyBBdm9pZCBnb2luZyB0aHJvdWdoIGFuIEFyZ3VtZW50c0FkYXB0b3JUcmFtcG9saW5lIGluIHRoZSBjb21tb24gY2FzZS5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHJldHVybiBuZXcgQnVmZmVyKGFyZywgYXJndW1lbnRzWzFdKVxuICAgIHJldHVybiBuZXcgQnVmZmVyKGFyZylcbiAgfVxuXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzLmxlbmd0aCA9IDBcbiAgICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBmcm9tTnVtYmVyKHRoaXMsIGFyZylcbiAgfVxuXG4gIC8vIFNsaWdodGx5IGxlc3MgY29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHRoaXMsIGFyZywgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiAndXRmOCcpXG4gIH1cblxuICAvLyBVbnVzdWFsLlxuICByZXR1cm4gZnJvbU9iamVjdCh0aGlzLCBhcmcpXG59XG5cbmZ1bmN0aW9uIGZyb21OdW1iZXIgKHRoYXQsIGxlbmd0aCkge1xuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGxlbmd0aCkgfCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAodGhhdCwgc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgLy8gQXNzdW1wdGlvbjogYnl0ZUxlbmd0aCgpIHJldHVybiB2YWx1ZSBpcyBhbHdheXMgPCBrTWF4TGVuZ3RoLlxuICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcblxuICB0aGF0LndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iamVjdCkge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iamVjdCkpIHJldHVybiBmcm9tQnVmZmVyKHRoYXQsIG9iamVjdClcblxuICBpZiAoaXNBcnJheShvYmplY3QpKSByZXR1cm4gZnJvbUFycmF5KHRoYXQsIG9iamVjdClcblxuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtdXN0IHN0YXJ0IHdpdGggbnVtYmVyLCBidWZmZXIsIGFycmF5IG9yIHN0cmluZycpXG4gIH1cblxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmIChvYmplY3QuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIHJldHVybiBmcm9tVHlwZWRBcnJheSh0aGF0LCBvYmplY3QpXG4gICAgfVxuICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih0aGF0LCBvYmplY3QpXG4gICAgfVxuICB9XG5cbiAgaWYgKG9iamVjdC5sZW5ndGgpIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iamVjdClcblxuICByZXR1cm4gZnJvbUpzb25PYmplY3QodGhhdCwgb2JqZWN0KVxufVxuXG5mdW5jdGlvbiBmcm9tQnVmZmVyICh0aGF0LCBidWZmZXIpIHtcbiAgdmFyIGxlbmd0aCA9IGNoZWNrZWQoYnVmZmVyLmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG4gIGJ1ZmZlci5jb3B5KHRoYXQsIDAsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5ICh0aGF0LCBhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLy8gRHVwbGljYXRlIG9mIGZyb21BcnJheSgpIHRvIGtlZXAgZnJvbUFycmF5KCkgbW9ub21vcnBoaWMuXG5mdW5jdGlvbiBmcm9tVHlwZWRBcnJheSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcbiAgLy8gVHJ1bmNhdGluZyB0aGUgZWxlbWVudHMgaXMgcHJvYmFibHkgbm90IHdoYXQgcGVvcGxlIGV4cGVjdCBmcm9tIHR5cGVkXG4gIC8vIGFycmF5cyB3aXRoIEJZVEVTX1BFUl9FTEVNRU5UID4gMSBidXQgaXQncyBjb21wYXRpYmxlIHdpdGggdGhlIGJlaGF2aW9yXG4gIC8vIG9mIHRoZSBvbGQgQnVmZmVyIGNvbnN0cnVjdG9yLlxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyICh0aGF0LCBhcnJheSkge1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICBhcnJheS5ieXRlTGVuZ3RoXG4gICAgdGhhdCA9IEJ1ZmZlci5fYXVnbWVudChuZXcgVWludDhBcnJheShhcnJheSkpXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tVHlwZWRBcnJheSh0aGF0LCBuZXcgVWludDhBcnJheShhcnJheSkpXG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbi8vIERlc2VyaWFsaXplIHsgdHlwZTogJ0J1ZmZlcicsIGRhdGE6IFsxLDIsMywuLi5dIH0gaW50byBhIEJ1ZmZlciBvYmplY3QuXG4vLyBSZXR1cm5zIGEgemVyby1sZW5ndGggYnVmZmVyIGZvciBpbnB1dHMgdGhhdCBkb24ndCBjb25mb3JtIHRvIHRoZSBzcGVjLlxuZnVuY3Rpb24gZnJvbUpzb25PYmplY3QgKHRoYXQsIG9iamVjdCkge1xuICB2YXIgYXJyYXlcbiAgdmFyIGxlbmd0aCA9IDBcblxuICBpZiAob2JqZWN0LnR5cGUgPT09ICdCdWZmZXInICYmIGlzQXJyYXkob2JqZWN0LmRhdGEpKSB7XG4gICAgYXJyYXkgPSBvYmplY3QuZGF0YVxuICAgIGxlbmd0aCA9IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgfVxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5pZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxufSBlbHNlIHtcbiAgLy8gcHJlLXNldCBmb3IgdmFsdWVzIHRoYXQgbWF5IGV4aXN0IGluIHRoZSBmdXR1cmVcbiAgQnVmZmVyLnByb3RvdHlwZS5sZW5ndGggPSB1bmRlZmluZWRcbiAgQnVmZmVyLnByb3RvdHlwZS5wYXJlbnQgPSB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gYWxsb2NhdGUgKHRoYXQsIGxlbmd0aCkge1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gQnVmZmVyLl9hdWdtZW50KG5ldyBVaW50OEFycmF5KGxlbmd0aCkpXG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQubGVuZ3RoID0gbGVuZ3RoXG4gICAgdGhhdC5faXNCdWZmZXIgPSB0cnVlXG4gIH1cblxuICB2YXIgZnJvbVBvb2wgPSBsZW5ndGggIT09IDAgJiYgbGVuZ3RoIDw9IEJ1ZmZlci5wb29sU2l6ZSA+Pj4gMVxuICBpZiAoZnJvbVBvb2wpIHRoYXQucGFyZW50ID0gcm9vdFBhcmVudFxuXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBrTWF4TGVuZ3RoYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAoc3ViamVjdCwgZW5jb2RpbmcpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNsb3dCdWZmZXIpKSByZXR1cm4gbmV3IFNsb3dCdWZmZXIoc3ViamVjdCwgZW5jb2RpbmcpXG5cbiAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoc3ViamVjdCwgZW5jb2RpbmcpXG4gIGRlbGV0ZSBidWYucGFyZW50XG4gIHJldHVybiBidWZcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuICEhKGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlcilcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIHZhciB4ID0gYS5sZW5ndGhcbiAgdmFyIHkgPSBiLmxlbmd0aFxuXG4gIHZhciBpID0gMFxuICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSlcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkgYnJlYWtcblxuICAgICsraVxuICB9XG5cbiAgaWYgKGkgIT09IGxlbikge1xuICAgIHggPSBhW2ldXG4gICAgeSA9IGJbaV1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAncmF3JzpcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghaXNBcnJheShsaXN0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcignbGlzdCBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMuJylcblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcigwKVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldXG4gICAgaXRlbS5jb3B5KGJ1ZiwgcG9zKVxuICAgIHBvcyArPSBpdGVtLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHN0cmluZyA9ICcnICsgc3RyaW5nXG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAvLyBEZXByZWNhdGVkXG4gICAgICBjYXNlICdyYXcnOlxuICAgICAgY2FzZSAncmF3cyc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgc3RhcnQgPSBzdGFydCB8IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID09PSBJbmZpbml0eSA/IHRoaXMubGVuZ3RoIDogZW5kIHwgMFxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG4gIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmIChlbmQgPD0gc3RhcnQpIHJldHVybiAnJ1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGJpbmFyeVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gMFxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYilcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0KSB7XG4gIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmZcbiAgZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDBcbiAgYnl0ZU9mZnNldCA+Pj0gMFxuXG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG4gIGlmIChieXRlT2Zmc2V0ID49IHRoaXMubGVuZ3RoKSByZXR1cm4gLTFcblxuICAvLyBOZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IE1hdGgubWF4KHRoaXMubGVuZ3RoICsgYnl0ZU9mZnNldCwgMClcblxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xIC8vIHNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nIGFsd2F5cyBmYWlsc1xuICAgIHJldHVybiBTdHJpbmcucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0aGlzLCB2YWwsIGJ5dGVPZmZzZXQpXG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQpXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwodGhpcywgdmFsLCBieXRlT2Zmc2V0KVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKHRoaXMsIFsgdmFsIF0sIGJ5dGVPZmZzZXQpXG4gIH1cblxuICBmdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0KSB7XG4gICAgdmFyIGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAodmFyIGkgPSAwOyBieXRlT2Zmc2V0ICsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycltieXRlT2Zmc2V0ICsgaV0gPT09IHZhbFtmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleF0pIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWwubGVuZ3RoKSByZXR1cm4gYnl0ZU9mZnNldCArIGZvdW5kSW5kZXhcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTFcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbi8vIGBnZXRgIGlzIGRlcHJlY2F0ZWRcbkJ1ZmZlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChvZmZzZXQpIHtcbiAgY29uc29sZS5sb2coJy5nZXQoKSBpcyBkZXByZWNhdGVkLiBBY2Nlc3MgdXNpbmcgYXJyYXkgaW5kZXhlcyBpbnN0ZWFkLicpXG4gIHJldHVybiB0aGlzLnJlYWRVSW50OChvZmZzZXQpXG59XG5cbi8vIGBzZXRgIGlzIGRlcHJlY2F0ZWRcbkJ1ZmZlci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gc2V0ICh2LCBvZmZzZXQpIHtcbiAgY29uc29sZS5sb2coJy5zZXQoKSBpcyBkZXByZWNhdGVkLiBBY2Nlc3MgdXNpbmcgYXJyYXkgaW5kZXhlcyBpbnN0ZWFkLicpXG4gIHJldHVybiB0aGlzLndyaXRlVUludDgodiwgb2Zmc2V0KVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChzdHJMZW4gJSAyICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKGlzTmFOKHBhcnNlZCkpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJylcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBwYXJzZWRcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiB1dGY4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBhc2NpaVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJpbmFyeVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgMFxuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICB9XG4gIC8vIGxlZ2FjeSB3cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aCkgLSByZW1vdmUgaW4gdjAuMTNcbiAgfSBlbHNlIHtcbiAgICB2YXIgc3dhcCA9IGVuY29kaW5nXG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBvZmZzZXQgPSBsZW5ndGggfCAwXG4gICAgbGVuZ3RoID0gc3dhcFxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBiaW5hcnlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGJpbmFyeVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZlxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSBCdWZmZXIuX2F1Z21lbnQodGhpcy5zdWJhcnJheShzdGFydCwgZW5kKSlcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydFxuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyBpKyspIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfVxuXG4gIGlmIChuZXdCdWYubGVuZ3RoKSBuZXdCdWYucGFyZW50ID0gdGhpcy5wYXJlbnQgfHwgdGhpc1xuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignYnVmZmVyIG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCd2YWx1ZSBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdpbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSwgMClcblxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSwgMClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MTYgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgMik7IGkgPCBqOyBpKyspIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgJiAoMHhmZiA8PCAoOCAqIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpKSkpID4+PlxuICAgICAgKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkgKiA4XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MzIgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDQpOyBpIDwgajsgaSsrKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlID4+PiAobGl0dGxlRW5kaWFuID8gaSA6IDMgLSBpKSAqIDgpICYgMHhmZlxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IDBcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IHZhbHVlIDwgMCA/IDEgOiAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gdmFsdWUgPCAwID8gMSA6IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndmFsdWUgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdpbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnRcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuICB2YXIgaVxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIGFzY2VuZGluZyBjb3B5IGZyb20gc3RhcnRcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRhcmdldC5fc2V0KHRoaXMuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgbGVuKSwgdGFyZ2V0U3RhcnQpXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIGZpbGwodmFsdWUsIHN0YXJ0PTAsIGVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCF2YWx1ZSkgdmFsdWUgPSAwXG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCkgZW5kID0gdGhpcy5sZW5ndGhcblxuICBpZiAoZW5kIDwgc3RhcnQpIHRocm93IG5ldyBSYW5nZUVycm9yKCdlbmQgPCBzdGFydCcpXG5cbiAgLy8gRmlsbCAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm5cbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignZW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIHZhciBpXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgdGhpc1tpXSA9IHZhbHVlXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IHV0ZjhUb0J5dGVzKHZhbHVlLnRvU3RyaW5nKCkpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgIHRoaXNbaV0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBgQXJyYXlCdWZmZXJgIHdpdGggdGhlICpjb3BpZWQqIG1lbW9yeSBvZiB0aGUgYnVmZmVyIGluc3RhbmNlLlxuICogQWRkZWQgaW4gTm9kZSAwLjEyLiBPbmx5IGF2YWlsYWJsZSBpbiBicm93c2VycyB0aGF0IHN1cHBvcnQgQXJyYXlCdWZmZXIuXG4gKi9cbkJ1ZmZlci5wcm90b3R5cGUudG9BcnJheUJ1ZmZlciA9IGZ1bmN0aW9uIHRvQXJyYXlCdWZmZXIgKCkge1xuICBpZiAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgICByZXR1cm4gKG5ldyBCdWZmZXIodGhpcykpLmJ1ZmZlclxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5sZW5ndGgpXG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnVmLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIGJ1ZltpXSA9IHRoaXNbaV1cbiAgICAgIH1cbiAgICAgIHJldHVybiBidWYuYnVmZmVyXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0J1ZmZlci50b0FycmF5QnVmZmVyIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyJylcbiAgfVxufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBCUCA9IEJ1ZmZlci5wcm90b3R5cGVcblxuLyoqXG4gKiBBdWdtZW50IGEgVWludDhBcnJheSAqaW5zdGFuY2UqIChub3QgdGhlIFVpbnQ4QXJyYXkgY2xhc3MhKSB3aXRoIEJ1ZmZlciBtZXRob2RzXG4gKi9cbkJ1ZmZlci5fYXVnbWVudCA9IGZ1bmN0aW9uIF9hdWdtZW50IChhcnIpIHtcbiAgYXJyLmNvbnN0cnVjdG9yID0gQnVmZmVyXG4gIGFyci5faXNCdWZmZXIgPSB0cnVlXG5cbiAgLy8gc2F2ZSByZWZlcmVuY2UgdG8gb3JpZ2luYWwgVWludDhBcnJheSBzZXQgbWV0aG9kIGJlZm9yZSBvdmVyd3JpdGluZ1xuICBhcnIuX3NldCA9IGFyci5zZXRcblxuICAvLyBkZXByZWNhdGVkXG4gIGFyci5nZXQgPSBCUC5nZXRcbiAgYXJyLnNldCA9IEJQLnNldFxuXG4gIGFyci53cml0ZSA9IEJQLndyaXRlXG4gIGFyci50b1N0cmluZyA9IEJQLnRvU3RyaW5nXG4gIGFyci50b0xvY2FsZVN0cmluZyA9IEJQLnRvU3RyaW5nXG4gIGFyci50b0pTT04gPSBCUC50b0pTT05cbiAgYXJyLmVxdWFscyA9IEJQLmVxdWFsc1xuICBhcnIuY29tcGFyZSA9IEJQLmNvbXBhcmVcbiAgYXJyLmluZGV4T2YgPSBCUC5pbmRleE9mXG4gIGFyci5jb3B5ID0gQlAuY29weVxuICBhcnIuc2xpY2UgPSBCUC5zbGljZVxuICBhcnIucmVhZFVJbnRMRSA9IEJQLnJlYWRVSW50TEVcbiAgYXJyLnJlYWRVSW50QkUgPSBCUC5yZWFkVUludEJFXG4gIGFyci5yZWFkVUludDggPSBCUC5yZWFkVUludDhcbiAgYXJyLnJlYWRVSW50MTZMRSA9IEJQLnJlYWRVSW50MTZMRVxuICBhcnIucmVhZFVJbnQxNkJFID0gQlAucmVhZFVJbnQxNkJFXG4gIGFyci5yZWFkVUludDMyTEUgPSBCUC5yZWFkVUludDMyTEVcbiAgYXJyLnJlYWRVSW50MzJCRSA9IEJQLnJlYWRVSW50MzJCRVxuICBhcnIucmVhZEludExFID0gQlAucmVhZEludExFXG4gIGFyci5yZWFkSW50QkUgPSBCUC5yZWFkSW50QkVcbiAgYXJyLnJlYWRJbnQ4ID0gQlAucmVhZEludDhcbiAgYXJyLnJlYWRJbnQxNkxFID0gQlAucmVhZEludDE2TEVcbiAgYXJyLnJlYWRJbnQxNkJFID0gQlAucmVhZEludDE2QkVcbiAgYXJyLnJlYWRJbnQzMkxFID0gQlAucmVhZEludDMyTEVcbiAgYXJyLnJlYWRJbnQzMkJFID0gQlAucmVhZEludDMyQkVcbiAgYXJyLnJlYWRGbG9hdExFID0gQlAucmVhZEZsb2F0TEVcbiAgYXJyLnJlYWRGbG9hdEJFID0gQlAucmVhZEZsb2F0QkVcbiAgYXJyLnJlYWREb3VibGVMRSA9IEJQLnJlYWREb3VibGVMRVxuICBhcnIucmVhZERvdWJsZUJFID0gQlAucmVhZERvdWJsZUJFXG4gIGFyci53cml0ZVVJbnQ4ID0gQlAud3JpdGVVSW50OFxuICBhcnIud3JpdGVVSW50TEUgPSBCUC53cml0ZVVJbnRMRVxuICBhcnIud3JpdGVVSW50QkUgPSBCUC53cml0ZVVJbnRCRVxuICBhcnIud3JpdGVVSW50MTZMRSA9IEJQLndyaXRlVUludDE2TEVcbiAgYXJyLndyaXRlVUludDE2QkUgPSBCUC53cml0ZVVJbnQxNkJFXG4gIGFyci53cml0ZVVJbnQzMkxFID0gQlAud3JpdGVVSW50MzJMRVxuICBhcnIud3JpdGVVSW50MzJCRSA9IEJQLndyaXRlVUludDMyQkVcbiAgYXJyLndyaXRlSW50TEUgPSBCUC53cml0ZUludExFXG4gIGFyci53cml0ZUludEJFID0gQlAud3JpdGVJbnRCRVxuICBhcnIud3JpdGVJbnQ4ID0gQlAud3JpdGVJbnQ4XG4gIGFyci53cml0ZUludDE2TEUgPSBCUC53cml0ZUludDE2TEVcbiAgYXJyLndyaXRlSW50MTZCRSA9IEJQLndyaXRlSW50MTZCRVxuICBhcnIud3JpdGVJbnQzMkxFID0gQlAud3JpdGVJbnQzMkxFXG4gIGFyci53cml0ZUludDMyQkUgPSBCUC53cml0ZUludDMyQkVcbiAgYXJyLndyaXRlRmxvYXRMRSA9IEJQLndyaXRlRmxvYXRMRVxuICBhcnIud3JpdGVGbG9hdEJFID0gQlAud3JpdGVGbG9hdEJFXG4gIGFyci53cml0ZURvdWJsZUxFID0gQlAud3JpdGVEb3VibGVMRVxuICBhcnIud3JpdGVEb3VibGVCRSA9IEJQLndyaXRlRG91YmxlQkVcbiAgYXJyLmZpbGwgPSBCUC5maWxsXG4gIGFyci5pbnNwZWN0ID0gQlAuaW5zcGVjdFxuICBhcnIudG9BcnJheUJ1ZmZlciA9IEJQLnRvQXJyYXlCdWZmZXJcblxuICByZXR1cm4gYXJyXG59XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2J1ZmZlci9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTkxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 592 */
/***/ function(module, exports, __webpack_require__) {

    eval("var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n;(function (exports) {\n\t'use strict';\n\n  var Arr = (typeof Uint8Array !== 'undefined')\n    ? Uint8Array\n    : Array\n\n\tvar PLUS   = '+'.charCodeAt(0)\n\tvar SLASH  = '/'.charCodeAt(0)\n\tvar NUMBER = '0'.charCodeAt(0)\n\tvar LOWER  = 'a'.charCodeAt(0)\n\tvar UPPER  = 'A'.charCodeAt(0)\n\tvar PLUS_URL_SAFE = '-'.charCodeAt(0)\n\tvar SLASH_URL_SAFE = '_'.charCodeAt(0)\n\n\tfunction decode (elt) {\n\t\tvar code = elt.charCodeAt(0)\n\t\tif (code === PLUS ||\n\t\t    code === PLUS_URL_SAFE)\n\t\t\treturn 62 // '+'\n\t\tif (code === SLASH ||\n\t\t    code === SLASH_URL_SAFE)\n\t\t\treturn 63 // '/'\n\t\tif (code < NUMBER)\n\t\t\treturn -1 //no match\n\t\tif (code < NUMBER + 10)\n\t\t\treturn code - NUMBER + 26 + 26\n\t\tif (code < UPPER + 26)\n\t\t\treturn code - UPPER\n\t\tif (code < LOWER + 26)\n\t\t\treturn code - LOWER + 26\n\t}\n\n\tfunction b64ToByteArray (b64) {\n\t\tvar i, j, l, tmp, placeHolders, arr\n\n\t\tif (b64.length % 4 > 0) {\n\t\t\tthrow new Error('Invalid string. Length must be a multiple of 4')\n\t\t}\n\n\t\t// the number of equal signs (place holders)\n\t\t// if there are two placeholders, than the two characters before it\n\t\t// represent one byte\n\t\t// if there is only one, then the three characters before it represent 2 bytes\n\t\t// this is just a cheap hack to not do indexOf twice\n\t\tvar len = b64.length\n\t\tplaceHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0\n\n\t\t// base64 is 4/3 + up to two characters of the original data\n\t\tarr = new Arr(b64.length * 3 / 4 - placeHolders)\n\n\t\t// if there are placeholders, only get up to the last complete 4 chars\n\t\tl = placeHolders > 0 ? b64.length - 4 : b64.length\n\n\t\tvar L = 0\n\n\t\tfunction push (v) {\n\t\t\tarr[L++] = v\n\t\t}\n\n\t\tfor (i = 0, j = 0; i < l; i += 4, j += 3) {\n\t\t\ttmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))\n\t\t\tpush((tmp & 0xFF0000) >> 16)\n\t\t\tpush((tmp & 0xFF00) >> 8)\n\t\t\tpush(tmp & 0xFF)\n\t\t}\n\n\t\tif (placeHolders === 2) {\n\t\t\ttmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)\n\t\t\tpush(tmp & 0xFF)\n\t\t} else if (placeHolders === 1) {\n\t\t\ttmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)\n\t\t\tpush((tmp >> 8) & 0xFF)\n\t\t\tpush(tmp & 0xFF)\n\t\t}\n\n\t\treturn arr\n\t}\n\n\tfunction uint8ToBase64 (uint8) {\n\t\tvar i,\n\t\t\textraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes\n\t\t\toutput = \"\",\n\t\t\ttemp, length\n\n\t\tfunction encode (num) {\n\t\t\treturn lookup.charAt(num)\n\t\t}\n\n\t\tfunction tripletToBase64 (num) {\n\t\t\treturn encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)\n\t\t}\n\n\t\t// go through the array every three bytes, we'll deal with trailing stuff later\n\t\tfor (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {\n\t\t\ttemp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])\n\t\t\toutput += tripletToBase64(temp)\n\t\t}\n\n\t\t// pad the end with zeros, but make sure to not forget the extra bytes\n\t\tswitch (extraBytes) {\n\t\t\tcase 1:\n\t\t\t\ttemp = uint8[uint8.length - 1]\n\t\t\t\toutput += encode(temp >> 2)\n\t\t\t\toutput += encode((temp << 4) & 0x3F)\n\t\t\t\toutput += '=='\n\t\t\t\tbreak\n\t\t\tcase 2:\n\t\t\t\ttemp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])\n\t\t\t\toutput += encode(temp >> 10)\n\t\t\t\toutput += encode((temp >> 4) & 0x3F)\n\t\t\t\toutput += encode((temp << 2) & 0x3F)\n\t\t\t\toutput += '='\n\t\t\t\tbreak\n\t\t}\n\n\t\treturn output\n\t}\n\n\texports.toByteArray = b64ToByteArray\n\texports.fromByteArray = uint8ToBase64\n}( false ? (this.base64js = {}) : exports))\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTkyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9iYXNlNjQtanMvbGliL2I2NC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgbG9va3VwID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuXG47KGZ1bmN0aW9uIChleHBvcnRzKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuICB2YXIgQXJyID0gKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJylcbiAgICA/IFVpbnQ4QXJyYXlcbiAgICA6IEFycmF5XG5cblx0dmFyIFBMVVMgICA9ICcrJy5jaGFyQ29kZUF0KDApXG5cdHZhciBTTEFTSCAgPSAnLycuY2hhckNvZGVBdCgwKVxuXHR2YXIgTlVNQkVSID0gJzAnLmNoYXJDb2RlQXQoMClcblx0dmFyIExPV0VSICA9ICdhJy5jaGFyQ29kZUF0KDApXG5cdHZhciBVUFBFUiAgPSAnQScuY2hhckNvZGVBdCgwKVxuXHR2YXIgUExVU19VUkxfU0FGRSA9ICctJy5jaGFyQ29kZUF0KDApXG5cdHZhciBTTEFTSF9VUkxfU0FGRSA9ICdfJy5jaGFyQ29kZUF0KDApXG5cblx0ZnVuY3Rpb24gZGVjb2RlIChlbHQpIHtcblx0XHR2YXIgY29kZSA9IGVsdC5jaGFyQ29kZUF0KDApXG5cdFx0aWYgKGNvZGUgPT09IFBMVVMgfHxcblx0XHQgICAgY29kZSA9PT0gUExVU19VUkxfU0FGRSlcblx0XHRcdHJldHVybiA2MiAvLyAnKydcblx0XHRpZiAoY29kZSA9PT0gU0xBU0ggfHxcblx0XHQgICAgY29kZSA9PT0gU0xBU0hfVVJMX1NBRkUpXG5cdFx0XHRyZXR1cm4gNjMgLy8gJy8nXG5cdFx0aWYgKGNvZGUgPCBOVU1CRVIpXG5cdFx0XHRyZXR1cm4gLTEgLy9ubyBtYXRjaFxuXHRcdGlmIChjb2RlIDwgTlVNQkVSICsgMTApXG5cdFx0XHRyZXR1cm4gY29kZSAtIE5VTUJFUiArIDI2ICsgMjZcblx0XHRpZiAoY29kZSA8IFVQUEVSICsgMjYpXG5cdFx0XHRyZXR1cm4gY29kZSAtIFVQUEVSXG5cdFx0aWYgKGNvZGUgPCBMT1dFUiArIDI2KVxuXHRcdFx0cmV0dXJuIGNvZGUgLSBMT1dFUiArIDI2XG5cdH1cblxuXHRmdW5jdGlvbiBiNjRUb0J5dGVBcnJheSAoYjY0KSB7XG5cdFx0dmFyIGksIGosIGwsIHRtcCwgcGxhY2VIb2xkZXJzLCBhcnJcblxuXHRcdGlmIChiNjQubGVuZ3RoICUgNCA+IDApIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG5cdFx0fVxuXG5cdFx0Ly8gdGhlIG51bWJlciBvZiBlcXVhbCBzaWducyAocGxhY2UgaG9sZGVycylcblx0XHQvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG5cdFx0Ly8gcmVwcmVzZW50IG9uZSBieXRlXG5cdFx0Ly8gaWYgdGhlcmUgaXMgb25seSBvbmUsIHRoZW4gdGhlIHRocmVlIGNoYXJhY3RlcnMgYmVmb3JlIGl0IHJlcHJlc2VudCAyIGJ5dGVzXG5cdFx0Ly8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuXHRcdHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cdFx0cGxhY2VIb2xkZXJzID0gJz0nID09PSBiNjQuY2hhckF0KGxlbiAtIDIpID8gMiA6ICc9JyA9PT0gYjY0LmNoYXJBdChsZW4gLSAxKSA/IDEgOiAwXG5cblx0XHQvLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcblx0XHRhcnIgPSBuZXcgQXJyKGI2NC5sZW5ndGggKiAzIC8gNCAtIHBsYWNlSG9sZGVycylcblxuXHRcdC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcblx0XHRsID0gcGxhY2VIb2xkZXJzID4gMCA/IGI2NC5sZW5ndGggLSA0IDogYjY0Lmxlbmd0aFxuXG5cdFx0dmFyIEwgPSAwXG5cblx0XHRmdW5jdGlvbiBwdXNoICh2KSB7XG5cdFx0XHRhcnJbTCsrXSA9IHZcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGw7IGkgKz0gNCwgaiArPSAzKSB7XG5cdFx0XHR0bXAgPSAoZGVjb2RlKGI2NC5jaGFyQXQoaSkpIDw8IDE4KSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpIDw8IDEyKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMikpIDw8IDYpIHwgZGVjb2RlKGI2NC5jaGFyQXQoaSArIDMpKVxuXHRcdFx0cHVzaCgodG1wICYgMHhGRjAwMDApID4+IDE2KVxuXHRcdFx0cHVzaCgodG1wICYgMHhGRjAwKSA+PiA4KVxuXHRcdFx0cHVzaCh0bXAgJiAweEZGKVxuXHRcdH1cblxuXHRcdGlmIChwbGFjZUhvbGRlcnMgPT09IDIpIHtcblx0XHRcdHRtcCA9IChkZWNvZGUoYjY0LmNoYXJBdChpKSkgPDwgMikgfCAoZGVjb2RlKGI2NC5jaGFyQXQoaSArIDEpKSA+PiA0KVxuXHRcdFx0cHVzaCh0bXAgJiAweEZGKVxuXHRcdH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG5cdFx0XHR0bXAgPSAoZGVjb2RlKGI2NC5jaGFyQXQoaSkpIDw8IDEwKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpIDw8IDQpIHwgKGRlY29kZShiNjQuY2hhckF0KGkgKyAyKSkgPj4gMilcblx0XHRcdHB1c2goKHRtcCA+PiA4KSAmIDB4RkYpXG5cdFx0XHRwdXNoKHRtcCAmIDB4RkYpXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFyclxuXHR9XG5cblx0ZnVuY3Rpb24gdWludDhUb0Jhc2U2NCAodWludDgpIHtcblx0XHR2YXIgaSxcblx0XHRcdGV4dHJhQnl0ZXMgPSB1aW50OC5sZW5ndGggJSAzLCAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuXHRcdFx0b3V0cHV0ID0gXCJcIixcblx0XHRcdHRlbXAsIGxlbmd0aFxuXG5cdFx0ZnVuY3Rpb24gZW5jb2RlIChudW0pIHtcblx0XHRcdHJldHVybiBsb29rdXAuY2hhckF0KG51bSlcblx0XHR9XG5cblx0XHRmdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuXHRcdFx0cmV0dXJuIGVuY29kZShudW0gPj4gMTggJiAweDNGKSArIGVuY29kZShudW0gPj4gMTIgJiAweDNGKSArIGVuY29kZShudW0gPj4gNiAmIDB4M0YpICsgZW5jb2RlKG51bSAmIDB4M0YpXG5cdFx0fVxuXG5cdFx0Ly8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuXHRcdGZvciAoaSA9IDAsIGxlbmd0aCA9IHVpbnQ4Lmxlbmd0aCAtIGV4dHJhQnl0ZXM7IGkgPCBsZW5ndGg7IGkgKz0gMykge1xuXHRcdFx0dGVtcCA9ICh1aW50OFtpXSA8PCAxNikgKyAodWludDhbaSArIDFdIDw8IDgpICsgKHVpbnQ4W2kgKyAyXSlcblx0XHRcdG91dHB1dCArPSB0cmlwbGV0VG9CYXNlNjQodGVtcClcblx0XHR9XG5cblx0XHQvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG5cdFx0c3dpdGNoIChleHRyYUJ5dGVzKSB7XG5cdFx0XHRjYXNlIDE6XG5cdFx0XHRcdHRlbXAgPSB1aW50OFt1aW50OC5sZW5ndGggLSAxXVxuXHRcdFx0XHRvdXRwdXQgKz0gZW5jb2RlKHRlbXAgPj4gMilcblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSgodGVtcCA8PCA0KSAmIDB4M0YpXG5cdFx0XHRcdG91dHB1dCArPSAnPT0nXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHRjYXNlIDI6XG5cdFx0XHRcdHRlbXAgPSAodWludDhbdWludDgubGVuZ3RoIC0gMl0gPDwgOCkgKyAodWludDhbdWludDgubGVuZ3RoIC0gMV0pXG5cdFx0XHRcdG91dHB1dCArPSBlbmNvZGUodGVtcCA+PiAxMClcblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSgodGVtcCA+PiA0KSAmIDB4M0YpXG5cdFx0XHRcdG91dHB1dCArPSBlbmNvZGUoKHRlbXAgPDwgMikgJiAweDNGKVxuXHRcdFx0XHRvdXRwdXQgKz0gJz0nXG5cdFx0XHRcdGJyZWFrXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG91dHB1dFxuXHR9XG5cblx0ZXhwb3J0cy50b0J5dGVBcnJheSA9IGI2NFRvQnl0ZUFycmF5XG5cdGV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IHVpbnQ4VG9CYXNlNjRcbn0odHlwZW9mIGV4cG9ydHMgPT09ICd1bmRlZmluZWQnID8gKHRoaXMuYmFzZTY0anMgPSB7fSkgOiBleHBvcnRzKSlcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iYXNlNjQtanMvbGliL2I2NC5qc1xuLy8gbW9kdWxlIGlkID0gNTkyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 593 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\nvar buffer = __webpack_require__(591);\nvar Buffer = buffer.Buffer;\nvar SlowBuffer = buffer.SlowBuffer;\nvar MAX_LEN = buffer.kMaxLength || 2147483647;\nexports.alloc = function alloc(size, fill, encoding) {\n  if (typeof Buffer.alloc === 'function') {\n    return Buffer.alloc(size, fill, encoding);\n  }\n  if (typeof encoding === 'number') {\n    throw new TypeError('encoding must not be number');\n  }\n  if (typeof size !== 'number') {\n    throw new TypeError('size must be a number');\n  }\n  if (size > MAX_LEN) {\n    throw new RangeError('size is too large');\n  }\n  var enc = encoding;\n  var _fill = fill;\n  if (_fill === undefined) {\n    enc = undefined;\n    _fill = 0;\n  }\n  var buf = new Buffer(size);\n  if (typeof _fill === 'string') {\n    var fillBuf = new Buffer(_fill, enc);\n    var flen = fillBuf.length;\n    var i = -1;\n    while (++i < size) {\n      buf[i] = fillBuf[i % flen];\n    }\n  } else {\n    buf.fill(_fill);\n  }\n  return buf;\n}\nexports.allocUnsafe = function allocUnsafe(size) {\n  if (typeof Buffer.allocUnsafe === 'function') {\n    return Buffer.allocUnsafe(size);\n  }\n  if (typeof size !== 'number') {\n    throw new TypeError('size must be a number');\n  }\n  if (size > MAX_LEN) {\n    throw new RangeError('size is too large');\n  }\n  return new Buffer(size);\n}\nexports.from = function from(value, encodingOrOffset, length) {\n  if (typeof Buffer.from === 'function' && (!global.Uint8Array || Uint8Array.from !== Buffer.from)) {\n    return Buffer.from(value, encodingOrOffset, length);\n  }\n  if (typeof value === 'number') {\n    throw new TypeError('\"value\" argument must not be a number');\n  }\n  if (typeof value === 'string') {\n    return new Buffer(value, encodingOrOffset);\n  }\n  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n    var offset = encodingOrOffset;\n    if (arguments.length === 1) {\n      return new Buffer(value);\n    }\n    if (typeof offset === 'undefined') {\n      offset = 0;\n    }\n    var len = length;\n    if (typeof len === 'undefined') {\n      len = value.byteLength - offset;\n    }\n    if (offset >= value.byteLength) {\n      throw new RangeError('\\'offset\\' is out of bounds');\n    }\n    if (len > value.byteLength - offset) {\n      throw new RangeError('\\'length\\' is out of bounds');\n    }\n    return new Buffer(value.slice(offset, offset + len));\n  }\n  if (Buffer.isBuffer(value)) {\n    var out = new Buffer(value.length);\n    value.copy(out, 0, 0, value.length);\n    return out;\n  }\n  if (value) {\n    if (Array.isArray(value) || (typeof ArrayBuffer !== 'undefined' && value.buffer instanceof ArrayBuffer) || 'length' in value) {\n      return new Buffer(value);\n    }\n    if (value.type === 'Buffer' && Array.isArray(value.data)) {\n      return new Buffer(value.data);\n    }\n  }\n\n  throw new TypeError('First argument must be a string, Buffer, ' + 'ArrayBuffer, Array, or array-like object.');\n}\nexports.allocUnsafeSlow = function allocUnsafeSlow(size) {\n  if (typeof Buffer.allocUnsafeSlow === 'function') {\n    return Buffer.allocUnsafeSlow(size);\n  }\n  if (typeof size !== 'number') {\n    throw new TypeError('size must be a number');\n  }\n  if (size >= MAX_LEN) {\n    throw new RangeError('size is too large');\n  }\n  return new SlowBuffer(size);\n}\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTkzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9idWZmZXItc2hpbXMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJyk7XG52YXIgQnVmZmVyID0gYnVmZmVyLkJ1ZmZlcjtcbnZhciBTbG93QnVmZmVyID0gYnVmZmVyLlNsb3dCdWZmZXI7XG52YXIgTUFYX0xFTiA9IGJ1ZmZlci5rTWF4TGVuZ3RoIHx8IDIxNDc0ODM2NDc7XG5leHBvcnRzLmFsbG9jID0gZnVuY3Rpb24gYWxsb2Moc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBCdWZmZXIuYWxsb2MgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKHNpemUsIGZpbGwsIGVuY29kaW5nKTtcbiAgfVxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3Qgbm90IGJlIG51bWJlcicpO1xuICB9XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzaXplIG11c3QgYmUgYSBudW1iZXInKTtcbiAgfVxuICBpZiAoc2l6ZSA+IE1BWF9MRU4pIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc2l6ZSBpcyB0b28gbGFyZ2UnKTtcbiAgfVxuICB2YXIgZW5jID0gZW5jb2Rpbmc7XG4gIHZhciBfZmlsbCA9IGZpbGw7XG4gIGlmIChfZmlsbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jID0gdW5kZWZpbmVkO1xuICAgIF9maWxsID0gMDtcbiAgfVxuICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihzaXplKTtcbiAgaWYgKHR5cGVvZiBfZmlsbCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgZmlsbEJ1ZiA9IG5ldyBCdWZmZXIoX2ZpbGwsIGVuYyk7XG4gICAgdmFyIGZsZW4gPSBmaWxsQnVmLmxlbmd0aDtcbiAgICB2YXIgaSA9IC0xO1xuICAgIHdoaWxlICgrK2kgPCBzaXplKSB7XG4gICAgICBidWZbaV0gPSBmaWxsQnVmW2kgJSBmbGVuXTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYnVmLmZpbGwoX2ZpbGwpO1xuICB9XG4gIHJldHVybiBidWY7XG59XG5leHBvcnRzLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gYWxsb2NVbnNhZmUoc2l6ZSkge1xuICBpZiAodHlwZW9mIEJ1ZmZlci5hbGxvY1Vuc2FmZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2NVbnNhZmUoc2l6ZSk7XG4gIH1cbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NpemUgbXVzdCBiZSBhIG51bWJlcicpO1xuICB9XG4gIGlmIChzaXplID4gTUFYX0xFTikge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdzaXplIGlzIHRvbyBsYXJnZScpO1xuICB9XG4gIHJldHVybiBuZXcgQnVmZmVyKHNpemUpO1xufVxuZXhwb3J0cy5mcm9tID0gZnVuY3Rpb24gZnJvbSh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgQnVmZmVyLmZyb20gPT09ICdmdW5jdGlvbicgJiYgKCFnbG9iYWwuVWludDhBcnJheSB8fCBVaW50OEFycmF5LmZyb20gIT09IEJ1ZmZlci5mcm9tKSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpO1xuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICB2YXIgb2Zmc2V0ID0gZW5jb2RpbmdPck9mZnNldDtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIG5ldyBCdWZmZXIodmFsdWUpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG9mZnNldCA9IDA7XG4gICAgfVxuICAgIHZhciBsZW4gPSBsZW5ndGg7XG4gICAgaWYgKHR5cGVvZiBsZW4gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsZW4gPSB2YWx1ZS5ieXRlTGVuZ3RoIC0gb2Zmc2V0O1xuICAgIH1cbiAgICBpZiAob2Zmc2V0ID49IHZhbHVlLmJ5dGVMZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdvZmZzZXRcXCcgaXMgb3V0IG9mIGJvdW5kcycpO1xuICAgIH1cbiAgICBpZiAobGVuID4gdmFsdWUuYnl0ZUxlbmd0aCAtIG9mZnNldCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ2xlbmd0aFxcJyBpcyBvdXQgb2YgYm91bmRzJyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQnVmZmVyKHZhbHVlLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgbGVuKSk7XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICB2YXIgb3V0ID0gbmV3IEJ1ZmZlcih2YWx1ZS5sZW5ndGgpO1xuICAgIHZhbHVlLmNvcHkob3V0LCAwLCAwLCB2YWx1ZS5sZW5ndGgpO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cbiAgaWYgKHZhbHVlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpIHx8ICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fCAnbGVuZ3RoJyBpbiB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG5ldyBCdWZmZXIodmFsdWUpO1xuICAgIH1cbiAgICBpZiAodmFsdWUudHlwZSA9PT0gJ0J1ZmZlcicgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZS5kYXRhKSkge1xuICAgICAgcmV0dXJuIG5ldyBCdWZmZXIodmFsdWUuZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCAnICsgJ0FycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuJyk7XG59XG5leHBvcnRzLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIGFsbG9jVW5zYWZlU2xvdyhzaXplKSB7XG4gIGlmICh0eXBlb2YgQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KHNpemUpO1xuICB9XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzaXplIG11c3QgYmUgYSBudW1iZXInKTtcbiAgfVxuICBpZiAoc2l6ZSA+PSBNQVhfTEVOKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NpemUgaXMgdG9vIGxhcmdlJyk7XG4gIH1cbiAgcmV0dXJuIG5ldyBTbG93QnVmZmVyKHNpemUpO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2J1ZmZlci1zaGltcy9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTkzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 594 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(Buffer) {// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\n\nfunction isArray(arg) {\n  if (Array.isArray) {\n    return Array.isArray(arg);\n  }\n  return objectToString(arg) === '[object Array]';\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n  return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n  return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n  return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n  return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n  return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n  return objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n  return objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n  return (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n  return arg === null ||\n         typeof arg === 'boolean' ||\n         typeof arg === 'number' ||\n         typeof arg === 'string' ||\n         typeof arg === 'symbol' ||  // ES6 symbol\n         typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = Buffer.isBuffer;\n\nfunction objectToString(o) {\n  return Object.prototype.toString.call(o);\n}\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(582).Buffer))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTk0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9jb3JlLXV0aWwtaXMvbGliL3V0aWwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5cbmZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJnKTtcbiAgfVxuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcoYXJnKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn1cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbCA9IGlzTnVsbDtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQgPSBpc051bGxPclVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmV4cG9ydHMuaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IEJ1ZmZlci5pc0J1ZmZlcjtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtdXRpbC1pcy9saWIvdXRpbC5qc1xuLy8gbW9kdWxlIGlkID0gNTk0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 595 */
/***/ function(module, exports) {

    eval("/* (ignored) *///# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTk1LmpzIiwic291cmNlcyI6WyJpZ25vcmVkIC9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIgdXRpbCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiAoaWdub3JlZCkgKi9cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyB1dGlsIChpZ25vcmVkKVxuLy8gbW9kdWxlIGlkID0gNTk1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 596 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';\n\nvar Buffer = __webpack_require__(591).Buffer;\n/*<replacement>*/\nvar bufferShim = __webpack_require__(593);\n/*</replacement>*/\n\nmodule.exports = BufferList;\n\nfunction BufferList() {\n  this.head = null;\n  this.tail = null;\n  this.length = 0;\n}\n\nBufferList.prototype.push = function (v) {\n  var entry = { data: v, next: null };\n  if (this.length > 0) this.tail.next = entry;else this.head = entry;\n  this.tail = entry;\n  ++this.length;\n};\n\nBufferList.prototype.unshift = function (v) {\n  var entry = { data: v, next: this.head };\n  if (this.length === 0) this.tail = entry;\n  this.head = entry;\n  ++this.length;\n};\n\nBufferList.prototype.shift = function () {\n  if (this.length === 0) return;\n  var ret = this.head.data;\n  if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;\n  --this.length;\n  return ret;\n};\n\nBufferList.prototype.clear = function () {\n  this.head = this.tail = null;\n  this.length = 0;\n};\n\nBufferList.prototype.join = function (s) {\n  if (this.length === 0) return '';\n  var p = this.head;\n  var ret = '' + p.data;\n  while (p = p.next) {\n    ret += s + p.data;\n  }return ret;\n};\n\nBufferList.prototype.concat = function (n) {\n  if (this.length === 0) return bufferShim.alloc(0);\n  if (this.length === 1) return this.head.data;\n  var ret = bufferShim.allocUnsafe(n >>> 0);\n  var p = this.head;\n  var i = 0;\n  while (p) {\n    p.data.copy(ret, i);\n    i += p.data.length;\n    p = p.next;\n  }\n  return ret;\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTk2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvQnVmZmVyTGlzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGJ1ZmZlclNoaW0gPSByZXF1aXJlKCdidWZmZXItc2hpbXMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJ1ZmZlckxpc3Q7XG5cbmZ1bmN0aW9uIEJ1ZmZlckxpc3QoKSB7XG4gIHRoaXMuaGVhZCA9IG51bGw7XG4gIHRoaXMudGFpbCA9IG51bGw7XG4gIHRoaXMubGVuZ3RoID0gMDtcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uICh2KSB7XG4gIHZhciBlbnRyeSA9IHsgZGF0YTogdiwgbmV4dDogbnVsbCB9O1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB0aGlzLnRhaWwubmV4dCA9IGVudHJ5O2Vsc2UgdGhpcy5oZWFkID0gZW50cnk7XG4gIHRoaXMudGFpbCA9IGVudHJ5O1xuICArK3RoaXMubGVuZ3RoO1xufTtcblxuQnVmZmVyTGlzdC5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uICh2KSB7XG4gIHZhciBlbnRyeSA9IHsgZGF0YTogdiwgbmV4dDogdGhpcy5oZWFkIH07XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgdGhpcy50YWlsID0gZW50cnk7XG4gIHRoaXMuaGVhZCA9IGVudHJ5O1xuICArK3RoaXMubGVuZ3RoO1xufTtcblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuc2hpZnQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICB2YXIgcmV0ID0gdGhpcy5oZWFkLmRhdGE7XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtlbHNlIHRoaXMuaGVhZCA9IHRoaXMuaGVhZC5uZXh0O1xuICAtLXRoaXMubGVuZ3RoO1xuICByZXR1cm4gcmV0O1xufTtcblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7XG4gIHRoaXMubGVuZ3RoID0gMDtcbn07XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiAocykge1xuICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gIHZhciByZXQgPSAnJyArIHAuZGF0YTtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICByZXQgKz0gcyArIHAuZGF0YTtcbiAgfXJldHVybiByZXQ7XG59O1xuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiAobikge1xuICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiBidWZmZXJTaGltLmFsbG9jKDApO1xuICBpZiAodGhpcy5sZW5ndGggPT09IDEpIHJldHVybiB0aGlzLmhlYWQuZGF0YTtcbiAgdmFyIHJldCA9IGJ1ZmZlclNoaW0uYWxsb2NVbnNhZmUobiA+Pj4gMCk7XG4gIHZhciBwID0gdGhpcy5oZWFkO1xuICB2YXIgaSA9IDA7XG4gIHdoaWxlIChwKSB7XG4gICAgcC5kYXRhLmNvcHkocmV0LCBpKTtcbiAgICBpICs9IHAuZGF0YS5sZW5ndGg7XG4gICAgcCA9IHAubmV4dDtcbiAgfVxuICByZXR1cm4gcmV0O1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL0J1ZmZlckxpc3QuanNcbi8vIG1vZHVsZSBpZCA9IDU5NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 597 */
/***/ function(module, exports, __webpack_require__) {

    eval("// a duplex stream is just a stream that is both readable and writable.\n// Since JS doesn't have multiple prototypal inheritance, this class\n// prototypally inherits from Readable, and then parasitically from\n// Writable.\n\n'use strict';\n\n/*<replacement>*/\n\nvar objectKeys = Object.keys || function (obj) {\n  var keys = [];\n  for (var key in obj) {\n    keys.push(key);\n  }return keys;\n};\n/*</replacement>*/\n\nmodule.exports = Duplex;\n\n/*<replacement>*/\nvar processNextTick = __webpack_require__(590);\n/*</replacement>*/\n\n/*<replacement>*/\nvar util = __webpack_require__(594);\nutil.inherits = __webpack_require__(440);\n/*</replacement>*/\n\nvar Readable = __webpack_require__(589);\nvar Writable = __webpack_require__(598);\n\nutil.inherits(Duplex, Readable);\n\nvar keys = objectKeys(Writable.prototype);\nfor (var v = 0; v < keys.length; v++) {\n  var method = keys[v];\n  if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];\n}\n\nfunction Duplex(options) {\n  if (!(this instanceof Duplex)) return new Duplex(options);\n\n  Readable.call(this, options);\n  Writable.call(this, options);\n\n  if (options && options.readable === false) this.readable = false;\n\n  if (options && options.writable === false) this.writable = false;\n\n  this.allowHalfOpen = true;\n  if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;\n\n  this.once('end', onend);\n}\n\n// the no-half-open enforcer\nfunction onend() {\n  // if we allow half-open state, or if the writable side ended,\n  // then we're ok.\n  if (this.allowHalfOpen || this._writableState.ended) return;\n\n  // no more data can be written.\n  // But allow more writes to happen in this tick.\n  processNextTick(onEndNT, this);\n}\n\nfunction onEndNT(self) {\n  self.end();\n}\n\nfunction forEach(xs, f) {\n  for (var i = 0, l = xs.length; i < l; i++) {\n    f(xs[i], i);\n  }\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTk3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGEgZHVwbGV4IHN0cmVhbSBpcyBqdXN0IGEgc3RyZWFtIHRoYXQgaXMgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUuXG4vLyBTaW5jZSBKUyBkb2Vzbid0IGhhdmUgbXVsdGlwbGUgcHJvdG90eXBhbCBpbmhlcml0YW5jZSwgdGhpcyBjbGFzc1xuLy8gcHJvdG90eXBhbGx5IGluaGVyaXRzIGZyb20gUmVhZGFibGUsIGFuZCB0aGVuIHBhcmFzaXRpY2FsbHkgZnJvbVxuLy8gV3JpdGFibGUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfXJldHVybiBrZXlzO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IER1cGxleDtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBwcm9jZXNzTmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFJlYWRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3JlYWRhYmxlJyk7XG52YXIgV3JpdGFibGUgPSByZXF1aXJlKCcuL19zdHJlYW1fd3JpdGFibGUnKTtcblxudXRpbC5pbmhlcml0cyhEdXBsZXgsIFJlYWRhYmxlKTtcblxudmFyIGtleXMgPSBvYmplY3RLZXlzKFdyaXRhYmxlLnByb3RvdHlwZSk7XG5mb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgdmFyIG1ldGhvZCA9IGtleXNbdl07XG4gIGlmICghRHVwbGV4LnByb3RvdHlwZVttZXRob2RdKSBEdXBsZXgucHJvdG90eXBlW21ldGhvZF0gPSBXcml0YWJsZS5wcm90b3R5cGVbbWV0aG9kXTtcbn1cblxuZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgRHVwbGV4KG9wdGlvbnMpO1xuXG4gIFJlYWRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIFdyaXRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZWFkYWJsZSA9PT0gZmFsc2UpIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLndyaXRhYmxlID09PSBmYWxzZSkgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuXG4gIHRoaXMuYWxsb3dIYWxmT3BlbiA9IHRydWU7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UpIHRoaXMuYWxsb3dIYWxmT3BlbiA9IGZhbHNlO1xuXG4gIHRoaXMub25jZSgnZW5kJywgb25lbmQpO1xufVxuXG4vLyB0aGUgbm8taGFsZi1vcGVuIGVuZm9yY2VyXG5mdW5jdGlvbiBvbmVuZCgpIHtcbiAgLy8gaWYgd2UgYWxsb3cgaGFsZi1vcGVuIHN0YXRlLCBvciBpZiB0aGUgd3JpdGFibGUgc2lkZSBlbmRlZCxcbiAgLy8gdGhlbiB3ZSdyZSBvay5cbiAgaWYgKHRoaXMuYWxsb3dIYWxmT3BlbiB8fCB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm47XG5cbiAgLy8gbm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuLlxuICAvLyBCdXQgYWxsb3cgbW9yZSB3cml0ZXMgdG8gaGFwcGVuIGluIHRoaXMgdGljay5cbiAgcHJvY2Vzc05leHRUaWNrKG9uRW5kTlQsIHRoaXMpO1xufVxuXG5mdW5jdGlvbiBvbkVuZE5UKHNlbGYpIHtcbiAgc2VsZi5lbmQoKTtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaCh4cywgZikge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGYoeHNbaV0sIGkpO1xuICB9XG59XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9kdXBsZXguanNcbi8vIG1vZHVsZSBpZCA9IDU5N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 598 */
/***/ function(module, exports, __webpack_require__) {

    eval("/* WEBPACK VAR INJECTION */(function(process, setImmediate) {// A bit simpler than readable streams.\n// Implement an async ._write(chunk, encoding, cb), and it'll handle all\n// the drain event emission and buffering.\n\n'use strict';\n\nmodule.exports = Writable;\n\n/*<replacement>*/\nvar processNextTick = __webpack_require__(590);\n/*</replacement>*/\n\n/*<replacement>*/\nvar asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick;\n/*</replacement>*/\n\n/*<replacement>*/\nvar Duplex;\n/*</replacement>*/\n\nWritable.WritableState = WritableState;\n\n/*<replacement>*/\nvar util = __webpack_require__(594);\nutil.inherits = __webpack_require__(440);\n/*</replacement>*/\n\n/*<replacement>*/\nvar internalUtil = {\n  deprecate: __webpack_require__(599)\n};\n/*</replacement>*/\n\n/*<replacement>*/\nvar Stream;\n(function () {\n  try {\n    Stream = __webpack_require__(586);\n  } catch (_) {} finally {\n    if (!Stream) Stream = __webpack_require__(587).EventEmitter;\n  }\n})();\n/*</replacement>*/\n\nvar Buffer = __webpack_require__(591).Buffer;\n/*<replacement>*/\nvar bufferShim = __webpack_require__(593);\n/*</replacement>*/\n\nutil.inherits(Writable, Stream);\n\nfunction nop() {}\n\nfunction WriteReq(chunk, encoding, cb) {\n  this.chunk = chunk;\n  this.encoding = encoding;\n  this.callback = cb;\n  this.next = null;\n}\n\nfunction WritableState(options, stream) {\n  Duplex = Duplex || __webpack_require__(597);\n\n  options = options || {};\n\n  // object stream flag to indicate whether or not this stream\n  // contains buffers or objects.\n  this.objectMode = !!options.objectMode;\n\n  if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode;\n\n  // the point at which write() starts returning false\n  // Note: 0 is a valid value, means that we always return false if\n  // the entire buffer is not flushed immediately on write()\n  var hwm = options.highWaterMark;\n  var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n  this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;\n\n  // cast to ints.\n  this.highWaterMark = ~ ~this.highWaterMark;\n\n  // drain event flag.\n  this.needDrain = false;\n  // at the start of calling end()\n  this.ending = false;\n  // when end() has been called, and returned\n  this.ended = false;\n  // when 'finish' is emitted\n  this.finished = false;\n\n  // should we decode strings into buffers before passing to _write?\n  // this is here so that some node-core streams can optimize string\n  // handling at a lower level.\n  var noDecode = options.decodeStrings === false;\n  this.decodeStrings = !noDecode;\n\n  // Crypto is kind of old and crusty.  Historically, its default string\n  // encoding is 'binary' so we have to make this configurable.\n  // Everything else in the universe uses 'utf8', though.\n  this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n  // not an actual buffer we keep track of, but a measurement\n  // of how much we're waiting to get pushed to some underlying\n  // socket or file.\n  this.length = 0;\n\n  // a flag to see when we're in the middle of a write.\n  this.writing = false;\n\n  // when true all writes will be buffered until .uncork() call\n  this.corked = 0;\n\n  // a flag to be able to tell if the onwrite cb is called immediately,\n  // or on a later tick.  We set this to true at first, because any\n  // actions that shouldn't happen until \"later\" should generally also\n  // not happen before the first write call.\n  this.sync = true;\n\n  // a flag to know if we're processing previously buffered items, which\n  // may call the _write() callback in the same tick, so that we don't\n  // end up in an overlapped onwrite situation.\n  this.bufferProcessing = false;\n\n  // the callback that's passed to _write(chunk,cb)\n  this.onwrite = function (er) {\n    onwrite(stream, er);\n  };\n\n  // the callback that the user supplies to write(chunk,encoding,cb)\n  this.writecb = null;\n\n  // the amount that is being written when _write is called.\n  this.writelen = 0;\n\n  this.bufferedRequest = null;\n  this.lastBufferedRequest = null;\n\n  // number of pending user-supplied write callbacks\n  // this must be 0 before 'finish' can be emitted\n  this.pendingcb = 0;\n\n  // emit prefinish if the only thing we're waiting for is _write cbs\n  // This is relevant for synchronous Transform streams\n  this.prefinished = false;\n\n  // True if the error was already emitted and should not be thrown again\n  this.errorEmitted = false;\n\n  // count buffered requests\n  this.bufferedRequestCount = 0;\n\n  // allocate the first CorkedRequest, there is always\n  // one allocated and free to use, and we maintain at most two\n  this.corkedRequestsFree = new CorkedRequest(this);\n}\n\nWritableState.prototype.getBuffer = function getBuffer() {\n  var current = this.bufferedRequest;\n  var out = [];\n  while (current) {\n    out.push(current);\n    current = current.next;\n  }\n  return out;\n};\n\n(function () {\n  try {\n    Object.defineProperty(WritableState.prototype, 'buffer', {\n      get: internalUtil.deprecate(function () {\n        return this.getBuffer();\n      }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.')\n    });\n  } catch (_) {}\n})();\n\n// Test _writableState for inheritance to account for Duplex streams,\n// whose prototype chain only points to Readable.\nvar realHasInstance;\nif (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {\n  realHasInstance = Function.prototype[Symbol.hasInstance];\n  Object.defineProperty(Writable, Symbol.hasInstance, {\n    value: function (object) {\n      if (realHasInstance.call(this, object)) return true;\n\n      return object && object._writableState instanceof WritableState;\n    }\n  });\n} else {\n  realHasInstance = function (object) {\n    return object instanceof this;\n  };\n}\n\nfunction Writable(options) {\n  Duplex = Duplex || __webpack_require__(597);\n\n  // Writable ctor is applied to Duplexes, too.\n  // `realHasInstance` is necessary because using plain `instanceof`\n  // would return false, as no `_writableState` property is attached.\n\n  // Trying to use the custom `instanceof` for Writable here will also break the\n  // Node.js LazyTransform implementation, which has a non-trivial getter for\n  // `_writableState` that would lead to infinite recursion.\n  if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {\n    return new Writable(options);\n  }\n\n  this._writableState = new WritableState(options, this);\n\n  // legacy.\n  this.writable = true;\n\n  if (options) {\n    if (typeof options.write === 'function') this._write = options.write;\n\n    if (typeof options.writev === 'function') this._writev = options.writev;\n  }\n\n  Stream.call(this);\n}\n\n// Otherwise people can pipe Writable streams, which is just wrong.\nWritable.prototype.pipe = function () {\n  this.emit('error', new Error('Cannot pipe, not readable'));\n};\n\nfunction writeAfterEnd(stream, cb) {\n  var er = new Error('write after end');\n  // TODO: defer error events consistently everywhere, not just the cb\n  stream.emit('error', er);\n  processNextTick(cb, er);\n}\n\n// If we get something that is not a buffer, string, null, or undefined,\n// and we're not in objectMode, then that's an error.\n// Otherwise stream chunks are all considered to be of length=1, and the\n// watermarks determine how many objects to keep in the buffer, rather than\n// how many bytes or characters.\nfunction validChunk(stream, state, chunk, cb) {\n  var valid = true;\n  var er = false;\n  // Always throw error if a null is written\n  // if we are not in object mode then throw\n  // if it is not a buffer, string, or undefined.\n  if (chunk === null) {\n    er = new TypeError('May not write null values to stream');\n  } else if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n    er = new TypeError('Invalid non-string/buffer chunk');\n  }\n  if (er) {\n    stream.emit('error', er);\n    processNextTick(cb, er);\n    valid = false;\n  }\n  return valid;\n}\n\nWritable.prototype.write = function (chunk, encoding, cb) {\n  var state = this._writableState;\n  var ret = false;\n\n  if (typeof encoding === 'function') {\n    cb = encoding;\n    encoding = null;\n  }\n\n  if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;\n\n  if (typeof cb !== 'function') cb = nop;\n\n  if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) {\n    state.pendingcb++;\n    ret = writeOrBuffer(this, state, chunk, encoding, cb);\n  }\n\n  return ret;\n};\n\nWritable.prototype.cork = function () {\n  var state = this._writableState;\n\n  state.corked++;\n};\n\nWritable.prototype.uncork = function () {\n  var state = this._writableState;\n\n  if (state.corked) {\n    state.corked--;\n\n    if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);\n  }\n};\n\nWritable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {\n  // node::ParseEncoding() requires lower case.\n  if (typeof encoding === 'string') encoding = encoding.toLowerCase();\n  if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);\n  this._writableState.defaultEncoding = encoding;\n  return this;\n};\n\nfunction decodeChunk(state, chunk, encoding) {\n  if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {\n    chunk = bufferShim.from(chunk, encoding);\n  }\n  return chunk;\n}\n\n// if we're already writing something, then just put this\n// in the queue, and wait our turn.  Otherwise, call _write\n// If we return false, then we need a drain event, so set that flag.\nfunction writeOrBuffer(stream, state, chunk, encoding, cb) {\n  chunk = decodeChunk(state, chunk, encoding);\n\n  if (Buffer.isBuffer(chunk)) encoding = 'buffer';\n  var len = state.objectMode ? 1 : chunk.length;\n\n  state.length += len;\n\n  var ret = state.length < state.highWaterMark;\n  // we must ensure that previous needDrain will not be reset to false.\n  if (!ret) state.needDrain = true;\n\n  if (state.writing || state.corked) {\n    var last = state.lastBufferedRequest;\n    state.lastBufferedRequest = new WriteReq(chunk, encoding, cb);\n    if (last) {\n      last.next = state.lastBufferedRequest;\n    } else {\n      state.bufferedRequest = state.lastBufferedRequest;\n    }\n    state.bufferedRequestCount += 1;\n  } else {\n    doWrite(stream, state, false, len, chunk, encoding, cb);\n  }\n\n  return ret;\n}\n\nfunction doWrite(stream, state, writev, len, chunk, encoding, cb) {\n  state.writelen = len;\n  state.writecb = cb;\n  state.writing = true;\n  state.sync = true;\n  if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);\n  state.sync = false;\n}\n\nfunction onwriteError(stream, state, sync, er, cb) {\n  --state.pendingcb;\n  if (sync) processNextTick(cb, er);else cb(er);\n\n  stream._writableState.errorEmitted = true;\n  stream.emit('error', er);\n}\n\nfunction onwriteStateUpdate(state) {\n  state.writing = false;\n  state.writecb = null;\n  state.length -= state.writelen;\n  state.writelen = 0;\n}\n\nfunction onwrite(stream, er) {\n  var state = stream._writableState;\n  var sync = state.sync;\n  var cb = state.writecb;\n\n  onwriteStateUpdate(state);\n\n  if (er) onwriteError(stream, state, sync, er, cb);else {\n    // Check if we're actually ready to finish, but don't emit yet\n    var finished = needFinish(state);\n\n    if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {\n      clearBuffer(stream, state);\n    }\n\n    if (sync) {\n      /*<replacement>*/\n      asyncWrite(afterWrite, stream, state, finished, cb);\n      /*</replacement>*/\n    } else {\n        afterWrite(stream, state, finished, cb);\n      }\n  }\n}\n\nfunction afterWrite(stream, state, finished, cb) {\n  if (!finished) onwriteDrain(stream, state);\n  state.pendingcb--;\n  cb();\n  finishMaybe(stream, state);\n}\n\n// Must force callback to be called on nextTick, so that we don't\n// emit 'drain' before the write() consumer gets the 'false' return\n// value, and has a chance to attach a 'drain' listener.\nfunction onwriteDrain(stream, state) {\n  if (state.length === 0 && state.needDrain) {\n    state.needDrain = false;\n    stream.emit('drain');\n  }\n}\n\n// if there's something in the buffer waiting, then process it\nfunction clearBuffer(stream, state) {\n  state.bufferProcessing = true;\n  var entry = state.bufferedRequest;\n\n  if (stream._writev && entry && entry.next) {\n    // Fast case, write everything using _writev()\n    var l = state.bufferedRequestCount;\n    var buffer = new Array(l);\n    var holder = state.corkedRequestsFree;\n    holder.entry = entry;\n\n    var count = 0;\n    while (entry) {\n      buffer[count] = entry;\n      entry = entry.next;\n      count += 1;\n    }\n\n    doWrite(stream, state, true, state.length, buffer, '', holder.finish);\n\n    // doWrite is almost always async, defer these to save a bit of time\n    // as the hot path ends with doWrite\n    state.pendingcb++;\n    state.lastBufferedRequest = null;\n    if (holder.next) {\n      state.corkedRequestsFree = holder.next;\n      holder.next = null;\n    } else {\n      state.corkedRequestsFree = new CorkedRequest(state);\n    }\n  } else {\n    // Slow case, write chunks one-by-one\n    while (entry) {\n      var chunk = entry.chunk;\n      var encoding = entry.encoding;\n      var cb = entry.callback;\n      var len = state.objectMode ? 1 : chunk.length;\n\n      doWrite(stream, state, false, len, chunk, encoding, cb);\n      entry = entry.next;\n      // if we didn't call the onwrite immediately, then\n      // it means that we need to wait until it does.\n      // also, that means that the chunk and cb are currently\n      // being processed, so move the buffer counter past them.\n      if (state.writing) {\n        break;\n      }\n    }\n\n    if (entry === null) state.lastBufferedRequest = null;\n  }\n\n  state.bufferedRequestCount = 0;\n  state.bufferedRequest = entry;\n  state.bufferProcessing = false;\n}\n\nWritable.prototype._write = function (chunk, encoding, cb) {\n  cb(new Error('_write() is not implemented'));\n};\n\nWritable.prototype._writev = null;\n\nWritable.prototype.end = function (chunk, encoding, cb) {\n  var state = this._writableState;\n\n  if (typeof chunk === 'function') {\n    cb = chunk;\n    chunk = null;\n    encoding = null;\n  } else if (typeof encoding === 'function') {\n    cb = encoding;\n    encoding = null;\n  }\n\n  if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);\n\n  // .end() fully uncorks\n  if (state.corked) {\n    state.corked = 1;\n    this.uncork();\n  }\n\n  // ignore unnecessary end() calls.\n  if (!state.ending && !state.finished) endWritable(this, state, cb);\n};\n\nfunction needFinish(state) {\n  return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;\n}\n\nfunction prefinish(stream, state) {\n  if (!state.prefinished) {\n    state.prefinished = true;\n    stream.emit('prefinish');\n  }\n}\n\nfunction finishMaybe(stream, state) {\n  var need = needFinish(state);\n  if (need) {\n    if (state.pendingcb === 0) {\n      prefinish(stream, state);\n      state.finished = true;\n      stream.emit('finish');\n    } else {\n      prefinish(stream, state);\n    }\n  }\n  return need;\n}\n\nfunction endWritable(stream, state, cb) {\n  state.ending = true;\n  finishMaybe(stream, state);\n  if (cb) {\n    if (state.finished) processNextTick(cb);else stream.once('finish', cb);\n  }\n  state.ended = true;\n  stream.writable = false;\n}\n\n// It seems a linked list but it is not\n// there will be only 2 of these for each stream\nfunction CorkedRequest(state) {\n  var _this = this;\n\n  this.next = null;\n  this.entry = null;\n\n  this.finish = function (err) {\n    var entry = _this.entry;\n    _this.entry = null;\n    while (entry) {\n      var cb = entry.callback;\n      state.pendingcb--;\n      cb(err);\n      entry = entry.next;\n    }\n    if (state.corkedRequestsFree) {\n      state.corkedRequestsFree.next = _this;\n    } else {\n      state.corkedRequestsFree = _this;\n    }\n  };\n}\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(200), __webpack_require__(364).setImmediate))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTk4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fd3JpdGFibGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQSBiaXQgc2ltcGxlciB0aGFuIHJlYWRhYmxlIHN0cmVhbXMuXG4vLyBJbXBsZW1lbnQgYW4gYXN5bmMgLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIGNiKSwgYW5kIGl0J2xsIGhhbmRsZSBhbGxcbi8vIHRoZSBkcmFpbiBldmVudCBlbWlzc2lvbiBhbmQgYnVmZmVyaW5nLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gV3JpdGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGFzeW5jV3JpdGUgPSAhcHJvY2Vzcy5icm93c2VyICYmIFsndjAuMTAnLCAndjAuOS4nXS5pbmRleE9mKHByb2Nlc3MudmVyc2lvbi5zbGljZSgwLCA1KSkgPiAtMSA/IHNldEltbWVkaWF0ZSA6IHByb2Nlc3NOZXh0VGljaztcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIER1cGxleDtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5Xcml0YWJsZS5Xcml0YWJsZVN0YXRlID0gV3JpdGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGludGVybmFsVXRpbCA9IHtcbiAgZGVwcmVjYXRlOiByZXF1aXJlKCd1dGlsLWRlcHJlY2F0ZScpXG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtO1xuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBTdHJlYW0gPSByZXF1aXJlKCdzdCcgKyAncmVhbScpO1xuICB9IGNhdGNoIChfKSB7fSBmaW5hbGx5IHtcbiAgICBpZiAoIVN0cmVhbSkgU3RyZWFtID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuICB9XG59KSgpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGJ1ZmZlclNoaW0gPSByZXF1aXJlKCdidWZmZXItc2hpbXMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFdyaXRhYmxlLCBTdHJlYW0pO1xuXG5mdW5jdGlvbiBub3AoKSB7fVxuXG5mdW5jdGlvbiBXcml0ZVJlcShjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRoaXMuY2h1bmsgPSBjaHVuaztcbiAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICB0aGlzLmNhbGxiYWNrID0gY2I7XG4gIHRoaXMubmV4dCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIHdyaXRlKCkgc3RhcnRzIHJldHVybmluZyBmYWxzZVxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIHRoYXQgd2UgYWx3YXlzIHJldHVybiBmYWxzZSBpZlxuICAvLyB0aGUgZW50aXJlIGJ1ZmZlciBpcyBub3QgZmx1c2hlZCBpbW1lZGlhdGVseSBvbiB3cml0ZSgpXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfiB+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIC8vIGRyYWluIGV2ZW50IGZsYWcuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2U7XG4gIC8vIGF0IHRoZSBzdGFydCBvZiBjYWxsaW5nIGVuZCgpXG4gIHRoaXMuZW5kaW5nID0gZmFsc2U7XG4gIC8vIHdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWRcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICAvLyB3aGVuICdmaW5pc2gnIGlzIGVtaXR0ZWRcbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIHNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgdmFyIG5vRGVjb2RlID0gb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIG5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMDtcblxuICAvLyBhIGZsYWcgdG8gc2VlIHdoZW4gd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHdyaXRlLlxuICB0aGlzLndyaXRpbmcgPSBmYWxzZTtcblxuICAvLyB3aGVuIHRydWUgYWxsIHdyaXRlcyB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsIC51bmNvcmsoKSBjYWxsXG4gIHRoaXMuY29ya2VkID0gMDtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyBhIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCdzIHBhc3NlZCB0byBfd3JpdGUoY2h1bmssY2IpXG4gIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uIChlcikge1xuICAgIG9ud3JpdGUoc3RyZWFtLCBlcik7XG4gIH07XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQgdGhlIHVzZXIgc3VwcGxpZXMgdG8gd3JpdGUoY2h1bmssZW5jb2RpbmcsY2IpXG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG5cbiAgLy8gdGhlIGFtb3VudCB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4gd2hlbiBfd3JpdGUgaXMgY2FsbGVkLlxuICB0aGlzLndyaXRlbGVuID0gMDtcblxuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG5cbiAgLy8gbnVtYmVyIG9mIHBlbmRpbmcgdXNlci1zdXBwbGllZCB3cml0ZSBjYWxsYmFja3NcbiAgLy8gdGhpcyBtdXN0IGJlIDAgYmVmb3JlICdmaW5pc2gnIGNhbiBiZSBlbWl0dGVkXG4gIHRoaXMucGVuZGluZ2NiID0gMDtcblxuICAvLyBlbWl0IHByZWZpbmlzaCBpZiB0aGUgb25seSB0aGluZyB3ZSdyZSB3YWl0aW5nIGZvciBpcyBfd3JpdGUgY2JzXG4gIC8vIFRoaXMgaXMgcmVsZXZhbnQgZm9yIHN5bmNocm9ub3VzIFRyYW5zZm9ybSBzdHJlYW1zXG4gIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2FpblxuICB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8vIGNvdW50IGJ1ZmZlcmVkIHJlcXVlc3RzXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuXG4gIC8vIGFsbG9jYXRlIHRoZSBmaXJzdCBDb3JrZWRSZXF1ZXN0LCB0aGVyZSBpcyBhbHdheXNcbiAgLy8gb25lIGFsbG9jYXRlZCBhbmQgZnJlZSB0byB1c2UsIGFuZCB3ZSBtYWludGFpbiBhdCBtb3N0IHR3b1xuICB0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO1xufVxuXG5Xcml0YWJsZVN0YXRlLnByb3RvdHlwZS5nZXRCdWZmZXIgPSBmdW5jdGlvbiBnZXRCdWZmZXIoKSB7XG4gIHZhciBjdXJyZW50ID0gdGhpcy5idWZmZXJlZFJlcXVlc3Q7XG4gIHZhciBvdXQgPSBbXTtcbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBvdXQucHVzaChjdXJyZW50KTtcbiAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICB9XG4gIHJldHVybiBvdXQ7XG59O1xuXG4oZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0YXRlLnByb3RvdHlwZSwgJ2J1ZmZlcicsIHtcbiAgICAgIGdldDogaW50ZXJuYWxVdGlsLmRlcHJlY2F0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ1ZmZlcigpO1xuICAgICAgfSwgJ193cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyICcgKyAnaW5zdGVhZC4nKVxuICAgIH0pO1xuICB9IGNhdGNoIChfKSB7fVxufSkoKTtcblxuLy8gVGVzdCBfd3JpdGFibGVTdGF0ZSBmb3IgaW5oZXJpdGFuY2UgdG8gYWNjb3VudCBmb3IgRHVwbGV4IHN0cmVhbXMsXG4vLyB3aG9zZSBwcm90b3R5cGUgY2hhaW4gb25seSBwb2ludHMgdG8gUmVhZGFibGUuXG52YXIgcmVhbEhhc0luc3RhbmNlO1xuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmhhc0luc3RhbmNlICYmIHR5cGVvZiBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXSA9PT0gJ2Z1bmN0aW9uJykge1xuICByZWFsSGFzSW5zdGFuY2UgPSBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLCBTeW1ib2wuaGFzSW5zdGFuY2UsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gKG9iamVjdCkge1xuICAgICAgaWYgKHJlYWxIYXNJbnN0YW5jZS5jYWxsKHRoaXMsIG9iamVjdCkpIHJldHVybiB0cnVlO1xuXG4gICAgICByZXR1cm4gb2JqZWN0ICYmIG9iamVjdC5fd3JpdGFibGVTdGF0ZSBpbnN0YW5jZW9mIFdyaXRhYmxlU3RhdGU7XG4gICAgfVxuICB9KTtcbn0gZWxzZSB7XG4gIHJlYWxIYXNJbnN0YW5jZSA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgdGhpcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gV3JpdGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIC8vIFdyaXRhYmxlIGN0b3IgaXMgYXBwbGllZCB0byBEdXBsZXhlcywgdG9vLlxuICAvLyBgcmVhbEhhc0luc3RhbmNlYCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB1c2luZyBwbGFpbiBgaW5zdGFuY2VvZmBcbiAgLy8gd291bGQgcmV0dXJuIGZhbHNlLCBhcyBubyBgX3dyaXRhYmxlU3RhdGVgIHByb3BlcnR5IGlzIGF0dGFjaGVkLlxuXG4gIC8vIFRyeWluZyB0byB1c2UgdGhlIGN1c3RvbSBgaW5zdGFuY2VvZmAgZm9yIFdyaXRhYmxlIGhlcmUgd2lsbCBhbHNvIGJyZWFrIHRoZVxuICAvLyBOb2RlLmpzIExhenlUcmFuc2Zvcm0gaW1wbGVtZW50YXRpb24sIHdoaWNoIGhhcyBhIG5vbi10cml2aWFsIGdldHRlciBmb3JcbiAgLy8gYF93cml0YWJsZVN0YXRlYCB0aGF0IHdvdWxkIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICBpZiAoIXJlYWxIYXNJbnN0YW5jZS5jYWxsKFdyaXRhYmxlLCB0aGlzKSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKSB7XG4gICAgcmV0dXJuIG5ldyBXcml0YWJsZShvcHRpb25zKTtcbiAgfVxuXG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUgPSBuZXcgV3JpdGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTtcblxuICAvLyBsZWdhY3kuXG4gIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRlID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZSA9IG9wdGlvbnMud3JpdGU7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGV2ID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZXYgPSBvcHRpb25zLndyaXRldjtcbiAgfVxuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBPdGhlcndpc2UgcGVvcGxlIGNhbiBwaXBlIFdyaXRhYmxlIHN0cmVhbXMsIHdoaWNoIGlzIGp1c3Qgd3JvbmcuXG5Xcml0YWJsZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZScpKTtcbn07XG5cbmZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBjYikge1xuICB2YXIgZXIgPSBuZXcgRXJyb3IoJ3dyaXRlIGFmdGVyIGVuZCcpO1xuICAvLyBUT0RPOiBkZWZlciBlcnJvciBldmVudHMgY29uc2lzdGVudGx5IGV2ZXJ5d2hlcmUsIG5vdCBqdXN0IHRoZSBjYlxuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO1xufVxuXG4vLyBJZiB3ZSBnZXQgc29tZXRoaW5nIHRoYXQgaXMgbm90IGEgYnVmZmVyLCBzdHJpbmcsIG51bGwsIG9yIHVuZGVmaW5lZCxcbi8vIGFuZCB3ZSdyZSBub3QgaW4gb2JqZWN0TW9kZSwgdGhlbiB0aGF0J3MgYW4gZXJyb3IuXG4vLyBPdGhlcndpc2Ugc3RyZWFtIGNodW5rcyBhcmUgYWxsIGNvbnNpZGVyZWQgdG8gYmUgb2YgbGVuZ3RoPTEsIGFuZCB0aGVcbi8vIHdhdGVybWFya3MgZGV0ZXJtaW5lIGhvdyBtYW55IG9iamVjdHMgdG8ga2VlcCBpbiB0aGUgYnVmZmVyLCByYXRoZXIgdGhhblxuLy8gaG93IG1hbnkgYnl0ZXMgb3IgY2hhcmFjdGVycy5cbmZ1bmN0aW9uIHZhbGlkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGNiKSB7XG4gIHZhciB2YWxpZCA9IHRydWU7XG4gIHZhciBlciA9IGZhbHNlO1xuICAvLyBBbHdheXMgdGhyb3cgZXJyb3IgaWYgYSBudWxsIGlzIHdyaXR0ZW5cbiAgLy8gaWYgd2UgYXJlIG5vdCBpbiBvYmplY3QgbW9kZSB0aGVuIHRocm93XG4gIC8vIGlmIGl0IGlzIG5vdCBhIGJ1ZmZlciwgc3RyaW5nLCBvciB1bmRlZmluZWQuXG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0nKTtcbiAgfSBlbHNlIGlmICghQnVmZmVyLmlzQnVmZmVyKGNodW5rKSAmJiB0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmIGNodW5rICE9PSB1bmRlZmluZWQgJiYgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgfVxuICBpZiAoZXIpIHtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgcHJvY2Vzc05leHRUaWNrKGNiLCBlcik7XG4gICAgdmFsaWQgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gdmFsaWQ7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciByZXQgPSBmYWxzZTtcblxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkgZW5jb2RpbmcgPSAnYnVmZmVyJztlbHNlIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuXG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIGNiID0gbm9wO1xuXG4gIGlmIChzdGF0ZS5lbmRlZCkgd3JpdGVBZnRlckVuZCh0aGlzLCBjYik7ZWxzZSBpZiAodmFsaWRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGNiKSkge1xuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHJldCA9IHdyaXRlT3JCdWZmZXIodGhpcywgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIHN0YXRlLmNvcmtlZCsrO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnVuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkLS07XG5cbiAgICBpZiAoIXN0YXRlLndyaXRpbmcgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSk7XG4gIH1cbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2RpbmcgPSBmdW5jdGlvbiBzZXREZWZhdWx0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgLy8gbm9kZTo6UGFyc2VFbmNvZGluZygpIHJlcXVpcmVzIGxvd2VyIGNhc2UuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSBlbmNvZGluZyA9IGVuY29kaW5nLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghKFsnaGV4JywgJ3V0ZjgnLCAndXRmLTgnLCAnYXNjaWknLCAnYmluYXJ5JywgJ2Jhc2U2NCcsICd1Y3MyJywgJ3Vjcy0yJywgJ3V0ZjE2bGUnLCAndXRmLTE2bGUnLCAncmF3J10uaW5kZXhPZigoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKSkgPiAtMSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZykge1xuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgc3RhdGUuZGVjb2RlU3RyaW5ncyAhPT0gZmFsc2UgJiYgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGNodW5rID0gYnVmZmVyU2hpbS5mcm9tKGNodW5rLCBlbmNvZGluZyk7XG4gIH1cbiAgcmV0dXJuIGNodW5rO1xufVxuXG4vLyBpZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgc29tZXRoaW5nLCB0aGVuIGp1c3QgcHV0IHRoaXNcbi8vIGluIHRoZSBxdWV1ZSwgYW5kIHdhaXQgb3VyIHR1cm4uICBPdGhlcndpc2UsIGNhbGwgX3dyaXRlXG4vLyBJZiB3ZSByZXR1cm4gZmFsc2UsIHRoZW4gd2UgbmVlZCBhIGRyYWluIGV2ZW50LCBzbyBzZXQgdGhhdCBmbGFnLlxuZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNodW5rID0gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZyk7XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICBzdGF0ZS5sZW5ndGggKz0gbGVuO1xuXG4gIHZhciByZXQgPSBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAvLyB3ZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cbiAgaWYgKCFyZXQpIHN0YXRlLm5lZWREcmFpbiA9IHRydWU7XG5cbiAgaWYgKHN0YXRlLndyaXRpbmcgfHwgc3RhdGUuY29ya2VkKSB7XG4gICAgdmFyIGxhc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBuZXcgV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIGxhc3QubmV4dCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgd3JpdGV2LCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgc3RhdGUud3JpdGVsZW4gPSBsZW47XG4gIHN0YXRlLndyaXRlY2IgPSBjYjtcbiAgc3RhdGUud3JpdGluZyA9IHRydWU7XG4gIHN0YXRlLnN5bmMgPSB0cnVlO1xuICBpZiAod3JpdGV2KSBzdHJlYW0uX3dyaXRldihjaHVuaywgc3RhdGUub253cml0ZSk7ZWxzZSBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSk7XG4gIHN0YXRlLnN5bmMgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYjtcbiAgaWYgKHN5bmMpIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO2Vsc2UgY2IoZXIpO1xuXG4gIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSkge1xuICBzdGF0ZS53cml0aW5nID0gZmFsc2U7XG4gIHN0YXRlLndyaXRlY2IgPSBudWxsO1xuICBzdGF0ZS5sZW5ndGggLT0gc3RhdGUud3JpdGVsZW47XG4gIHN0YXRlLndyaXRlbGVuID0gMDtcbn1cblxuZnVuY3Rpb24gb253cml0ZShzdHJlYW0sIGVyKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHN5bmMgPSBzdGF0ZS5zeW5jO1xuICB2YXIgY2IgPSBzdGF0ZS53cml0ZWNiO1xuXG4gIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSk7XG5cbiAgaWYgKGVyKSBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKTtlbHNlIHtcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBhY3R1YWxseSByZWFkeSB0byBmaW5pc2gsIGJ1dCBkb24ndCBlbWl0IHlldFxuICAgIHZhciBmaW5pc2hlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuXG4gICAgaWYgKCFmaW5pc2hlZCAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkge1xuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIC8qPHJlcGxhY2VtZW50PiovXG4gICAgICBhc3luY1dyaXRlKGFmdGVyV3JpdGUsIHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICAvKjwvcmVwbGFjZW1lbnQ+Ki9cbiAgICB9IGVsc2Uge1xuICAgICAgICBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZCkgb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpO1xuICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgY2IoKTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbi8vIE11c3QgZm9yY2UgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIG5leHRUaWNrLCBzbyB0aGF0IHdlIGRvbid0XG4vLyBlbWl0ICdkcmFpbicgYmVmb3JlIHRoZSB3cml0ZSgpIGNvbnN1bWVyIGdldHMgdGhlICdmYWxzZScgcmV0dXJuXG4vLyB2YWx1ZSwgYW5kIGhhcyBhIGNoYW5jZSB0byBhdHRhY2ggYSAnZHJhaW4nIGxpc3RlbmVyLlxuZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW4pIHtcbiAgICBzdGF0ZS5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKTtcbiAgfVxufVxuXG4vLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0O1xuXG4gIGlmIChzdHJlYW0uX3dyaXRldiAmJiBlbnRyeSAmJiBlbnRyeS5uZXh0KSB7XG4gICAgLy8gRmFzdCBjYXNlLCB3cml0ZSBldmVyeXRoaW5nIHVzaW5nIF93cml0ZXYoKVxuICAgIHZhciBsID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsKTtcbiAgICB2YXIgaG9sZGVyID0gc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlO1xuICAgIGhvbGRlci5lbnRyeSA9IGVudHJ5O1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIGJ1ZmZlcltjb3VudF0gPSBlbnRyeTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB0cnVlLCBzdGF0ZS5sZW5ndGgsIGJ1ZmZlciwgJycsIGhvbGRlci5maW5pc2gpO1xuXG4gICAgLy8gZG9Xcml0ZSBpcyBhbG1vc3QgYWx3YXlzIGFzeW5jLCBkZWZlciB0aGVzZSB0byBzYXZlIGEgYml0IG9mIHRpbWVcbiAgICAvLyBhcyB0aGUgaG90IHBhdGggZW5kcyB3aXRoIGRvV3JpdGVcbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgICBpZiAoaG9sZGVyLm5leHQpIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IGhvbGRlci5uZXh0O1xuICAgICAgaG9sZGVyLm5leHQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdChzdGF0ZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFNsb3cgY2FzZSwgd3JpdGUgY2h1bmtzIG9uZS1ieS1vbmVcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIHZhciBjaHVuayA9IGVudHJ5LmNodW5rO1xuICAgICAgdmFyIGVuY29kaW5nID0gZW50cnkuZW5jb2Rpbmc7XG4gICAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICAgIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICAgICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIC8vIGlmIHdlIGRpZG4ndCBjYWxsIHRoZSBvbndyaXRlIGltbWVkaWF0ZWx5LCB0aGVuXG4gICAgICAvLyBpdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdCBkb2VzLlxuICAgICAgLy8gYWxzbywgdGhhdCBtZWFucyB0aGF0IHRoZSBjaHVuayBhbmQgY2IgYXJlIGN1cnJlbnRseVxuICAgICAgLy8gYmVpbmcgcHJvY2Vzc2VkLCBzbyBtb3ZlIHRoZSBidWZmZXIgY291bnRlciBwYXN0IHRoZW0uXG4gICAgICBpZiAoc3RhdGUud3JpdGluZykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW50cnkgPT09IG51bGwpIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB9XG5cbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPSBlbnRyeTtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobmV3IEVycm9yKCdfd3JpdGUoKSBpcyBub3QgaW1wbGVtZW50ZWQnKSk7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRldiA9IG51bGw7XG5cbldyaXRhYmxlLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmICh0eXBlb2YgY2h1bmsgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGNodW5rO1xuICAgIGNodW5rID0gbnVsbDtcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCkgdGhpcy53cml0ZShjaHVuaywgZW5jb2RpbmcpO1xuXG4gIC8vIC5lbmQoKSBmdWxseSB1bmNvcmtzXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQgPSAxO1xuICAgIHRoaXMudW5jb3JrKCk7XG4gIH1cblxuICAvLyBpZ25vcmUgdW5uZWNlc3NhcnkgZW5kKCkgY2FsbHMuXG4gIGlmICghc3RhdGUuZW5kaW5nICYmICFzdGF0ZS5maW5pc2hlZCkgZW5kV3JpdGFibGUodGhpcywgc3RhdGUsIGNiKTtcbn07XG5cbmZ1bmN0aW9uIG5lZWRGaW5pc2goc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLmVuZGluZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID09PSBudWxsICYmICFzdGF0ZS5maW5pc2hlZCAmJiAhc3RhdGUud3JpdGluZztcbn1cblxuZnVuY3Rpb24gcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5wcmVmaW5pc2hlZCkge1xuICAgIHN0YXRlLnByZWZpbmlzaGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbmVlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuICBpZiAobmVlZCkge1xuICAgIGlmIChzdGF0ZS5wZW5kaW5nY2IgPT09IDApIHtcbiAgICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKTtcbiAgICAgIHN0YXRlLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmVlZDtcbn1cblxuZnVuY3Rpb24gZW5kV3JpdGFibGUoc3RyZWFtLCBzdGF0ZSwgY2IpIHtcbiAgc3RhdGUuZW5kaW5nID0gdHJ1ZTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIGlmIChjYikge1xuICAgIGlmIChzdGF0ZS5maW5pc2hlZCkgcHJvY2Vzc05leHRUaWNrKGNiKTtlbHNlIHN0cmVhbS5vbmNlKCdmaW5pc2gnLCBjYik7XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICBzdHJlYW0ud3JpdGFibGUgPSBmYWxzZTtcbn1cblxuLy8gSXQgc2VlbXMgYSBsaW5rZWQgbGlzdCBidXQgaXQgaXMgbm90XG4vLyB0aGVyZSB3aWxsIGJlIG9ubHkgMiBvZiB0aGVzZSBmb3IgZWFjaCBzdHJlYW1cbmZ1bmN0aW9uIENvcmtlZFJlcXVlc3Qoc3RhdGUpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB0aGlzLm5leHQgPSBudWxsO1xuICB0aGlzLmVudHJ5ID0gbnVsbDtcblxuICB0aGlzLmZpbmlzaCA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICB2YXIgZW50cnkgPSBfdGhpcy5lbnRyeTtcbiAgICBfdGhpcy5lbnRyeSA9IG51bGw7XG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICAgIHN0YXRlLnBlbmRpbmdjYi0tO1xuICAgICAgY2IoZXJyKTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICB9XG4gICAgaWYgKHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSkge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQgPSBfdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gX3RoaXM7XG4gICAgfVxuICB9O1xufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fd3JpdGFibGUuanNcbi8vIG1vZHVsZSBpZCA9IDU5OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 599 */
/***/ function(module, exports) {

    eval("/* WEBPACK VAR INJECTION */(function(global) {\n/**\n * Module exports.\n */\n\nmodule.exports = deprecate;\n\n/**\n * Mark that a method should not be used.\n * Returns a modified function which warns once by default.\n *\n * If `localStorage.noDeprecation = true` is set, then it is a no-op.\n *\n * If `localStorage.throwDeprecation = true` is set, then deprecated functions\n * will throw an Error when invoked.\n *\n * If `localStorage.traceDeprecation = true` is set, then deprecated functions\n * will invoke `console.trace()` instead of `console.error()`.\n *\n * @param {Function} fn - the function to deprecate\n * @param {String} msg - the string to print to the console when `fn` is invoked\n * @returns {Function} a new \"deprecated\" version of `fn`\n * @api public\n */\n\nfunction deprecate (fn, msg) {\n  if (config('noDeprecation')) {\n    return fn;\n  }\n\n  var warned = false;\n  function deprecated() {\n    if (!warned) {\n      if (config('throwDeprecation')) {\n        throw new Error(msg);\n      } else if (config('traceDeprecation')) {\n        console.trace(msg);\n      } else {\n        console.warn(msg);\n      }\n      warned = true;\n    }\n    return fn.apply(this, arguments);\n  }\n\n  return deprecated;\n}\n\n/**\n * Checks `localStorage` for boolean values for the given `name`.\n *\n * @param {String} name\n * @returns {Boolean}\n * @api private\n */\n\nfunction config (name) {\n  // accessing global.localStorage can trigger a DOMException in sandboxed iframes\n  try {\n    if (!global.localStorage) return false;\n  } catch (_) {\n    return false;\n  }\n  var val = global.localStorage[name];\n  if (null == val) return false;\n  return String(val).toLowerCase() === 'true';\n}\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTk5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy91dGlsLWRlcHJlY2F0ZS9icm93c2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlcHJlY2F0ZTtcblxuLyoqXG4gKiBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuICogUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLm5vRGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLnRocm93RGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gZGVwcmVjYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgdGhyb3cgYW4gRXJyb3Igd2hlbiBpbnZva2VkLlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2UudHJhY2VEZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBkZXByZWNhdGVkIGZ1bmN0aW9uc1xuICogd2lsbCBpbnZva2UgYGNvbnNvbGUudHJhY2UoKWAgaW5zdGVhZCBvZiBgY29uc29sZS5lcnJvcigpYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIHRoZSBmdW5jdGlvbiB0byBkZXByZWNhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgLSB0aGUgc3RyaW5nIHRvIHByaW50IHRvIHRoZSBjb25zb2xlIHdoZW4gYGZuYCBpcyBpbnZva2VkXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGEgbmV3IFwiZGVwcmVjYXRlZFwiIHZlcnNpb24gb2YgYGZuYFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkZXByZWNhdGUgKGZuLCBtc2cpIHtcbiAgaWYgKGNvbmZpZygnbm9EZXByZWNhdGlvbicpKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAoY29uZmlnKCd0aHJvd0RlcHJlY2F0aW9uJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKGNvbmZpZygndHJhY2VEZXByZWNhdGlvbicpKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2Fybihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn1cblxuLyoqXG4gKiBDaGVja3MgYGxvY2FsU3RvcmFnZWAgZm9yIGJvb2xlYW4gdmFsdWVzIGZvciB0aGUgZ2l2ZW4gYG5hbWVgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvbmZpZyAobmFtZSkge1xuICAvLyBhY2Nlc3NpbmcgZ2xvYmFsLmxvY2FsU3RvcmFnZSBjYW4gdHJpZ2dlciBhIERPTUV4Y2VwdGlvbiBpbiBzYW5kYm94ZWQgaWZyYW1lc1xuICB0cnkge1xuICAgIGlmICghZ2xvYmFsLmxvY2FsU3RvcmFnZSkgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB2YWwgPSBnbG9iYWwubG9jYWxTdG9yYWdlW25hbWVdO1xuICBpZiAobnVsbCA9PSB2YWwpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIFN0cmluZyh2YWwpLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi91dGlsLWRlcHJlY2F0ZS9icm93c2VyLmpzXG4vLyBtb2R1bGUgaWQgPSA1OTlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 600 */
/***/ function(module, exports, __webpack_require__) {

    eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar Buffer = __webpack_require__(591).Buffer;\n\nvar isBufferEncoding = Buffer.isEncoding\n  || function(encoding) {\n       switch (encoding && encoding.toLowerCase()) {\n         case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true;\n         default: return false;\n       }\n     }\n\n\nfunction assertEncoding(encoding) {\n  if (encoding && !isBufferEncoding(encoding)) {\n    throw new Error('Unknown encoding: ' + encoding);\n  }\n}\n\n// StringDecoder provides an interface for efficiently splitting a series of\n// buffers into a series of JS strings without breaking apart multi-byte\n// characters. CESU-8 is handled as part of the UTF-8 encoding.\n//\n// @TODO Handling all encodings inside a single object makes it very difficult\n// to reason about this code, so it should be split up in the future.\n// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code\n// points as used by CESU-8.\nvar StringDecoder = exports.StringDecoder = function(encoding) {\n  this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');\n  assertEncoding(encoding);\n  switch (this.encoding) {\n    case 'utf8':\n      // CESU-8 represents each of Surrogate Pair by 3-bytes\n      this.surrogateSize = 3;\n      break;\n    case 'ucs2':\n    case 'utf16le':\n      // UTF-16 represents each of Surrogate Pair by 2-bytes\n      this.surrogateSize = 2;\n      this.detectIncompleteChar = utf16DetectIncompleteChar;\n      break;\n    case 'base64':\n      // Base-64 stores 3 bytes in 4 chars, and pads the remainder.\n      this.surrogateSize = 3;\n      this.detectIncompleteChar = base64DetectIncompleteChar;\n      break;\n    default:\n      this.write = passThroughWrite;\n      return;\n  }\n\n  // Enough space to store all bytes of a single character. UTF-8 needs 4\n  // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).\n  this.charBuffer = new Buffer(6);\n  // Number of bytes received for the current incomplete multi-byte character.\n  this.charReceived = 0;\n  // Number of bytes expected for the current incomplete multi-byte character.\n  this.charLength = 0;\n};\n\n\n// write decodes the given buffer and returns it as JS string that is\n// guaranteed to not contain any partial multi-byte characters. Any partial\n// character found at the end of the buffer is buffered up, and will be\n// returned when calling write again with the remaining bytes.\n//\n// Note: Converting a Buffer containing an orphan surrogate to a String\n// currently works, but converting a String to a Buffer (via `new Buffer`, or\n// Buffer#write) will replace incomplete surrogates with the unicode\n// replacement character. See https://codereview.chromium.org/121173009/ .\nStringDecoder.prototype.write = function(buffer) {\n  var charStr = '';\n  // if our last write ended with an incomplete multibyte character\n  while (this.charLength) {\n    // determine how many remaining bytes this buffer has to offer for this char\n    var available = (buffer.length >= this.charLength - this.charReceived) ?\n        this.charLength - this.charReceived :\n        buffer.length;\n\n    // add the new bytes to the char buffer\n    buffer.copy(this.charBuffer, this.charReceived, 0, available);\n    this.charReceived += available;\n\n    if (this.charReceived < this.charLength) {\n      // still not enough chars in this buffer? wait for more ...\n      return '';\n    }\n\n    // remove bytes belonging to the current character from the buffer\n    buffer = buffer.slice(available, buffer.length);\n\n    // get the character that was split\n    charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);\n\n    // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character\n    var charCode = charStr.charCodeAt(charStr.length - 1);\n    if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n      this.charLength += this.surrogateSize;\n      charStr = '';\n      continue;\n    }\n    this.charReceived = this.charLength = 0;\n\n    // if there are no more bytes in this buffer, just emit our char\n    if (buffer.length === 0) {\n      return charStr;\n    }\n    break;\n  }\n\n  // determine and set charLength / charReceived\n  this.detectIncompleteChar(buffer);\n\n  var end = buffer.length;\n  if (this.charLength) {\n    // buffer the incomplete character bytes we got\n    buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);\n    end -= this.charReceived;\n  }\n\n  charStr += buffer.toString(this.encoding, 0, end);\n\n  var end = charStr.length - 1;\n  var charCode = charStr.charCodeAt(end);\n  // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character\n  if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n    var size = this.surrogateSize;\n    this.charLength += size;\n    this.charReceived += size;\n    this.charBuffer.copy(this.charBuffer, size, 0, size);\n    buffer.copy(this.charBuffer, 0, 0, size);\n    return charStr.substring(0, end);\n  }\n\n  // or just emit the charStr\n  return charStr;\n};\n\n// detectIncompleteChar determines if there is an incomplete UTF-8 character at\n// the end of the given buffer. If so, it sets this.charLength to the byte\n// length that character, and sets this.charReceived to the number of bytes\n// that are available for this character.\nStringDecoder.prototype.detectIncompleteChar = function(buffer) {\n  // determine how many bytes we have to check at the end of this buffer\n  var i = (buffer.length >= 3) ? 3 : buffer.length;\n\n  // Figure out if one of the last i bytes of our buffer announces an\n  // incomplete char.\n  for (; i > 0; i--) {\n    var c = buffer[buffer.length - i];\n\n    // See http://en.wikipedia.org/wiki/UTF-8#Description\n\n    // 110XXXXX\n    if (i == 1 && c >> 5 == 0x06) {\n      this.charLength = 2;\n      break;\n    }\n\n    // 1110XXXX\n    if (i <= 2 && c >> 4 == 0x0E) {\n      this.charLength = 3;\n      break;\n    }\n\n    // 11110XXX\n    if (i <= 3 && c >> 3 == 0x1E) {\n      this.charLength = 4;\n      break;\n    }\n  }\n  this.charReceived = i;\n};\n\nStringDecoder.prototype.end = function(buffer) {\n  var res = '';\n  if (buffer && buffer.length)\n    res = this.write(buffer);\n\n  if (this.charReceived) {\n    var cr = this.charReceived;\n    var buf = this.charBuffer;\n    var enc = this.encoding;\n    res += buf.slice(0, cr).toString(enc);\n  }\n\n  return res;\n};\n\nfunction passThroughWrite(buffer) {\n  return buffer.toString(this.encoding);\n}\n\nfunction utf16DetectIncompleteChar(buffer) {\n  this.charReceived = buffer.length % 2;\n  this.charLength = this.charReceived ? 2 : 0;\n}\n\nfunction base64DetectIncompleteChar(buffer) {\n  this.charReceived = buffer.length % 3;\n  this.charLength = this.charReceived ? 3 : 0;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjAwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9zdHJpbmdfZGVjb2Rlci9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxudmFyIGlzQnVmZmVyRW5jb2RpbmcgPSBCdWZmZXIuaXNFbmNvZGluZ1xuICB8fCBmdW5jdGlvbihlbmNvZGluZykge1xuICAgICAgIHN3aXRjaCAoZW5jb2RpbmcgJiYgZW5jb2RpbmcudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgY2FzZSAnaGV4JzogY2FzZSAndXRmOCc6IGNhc2UgJ3V0Zi04JzogY2FzZSAnYXNjaWknOiBjYXNlICdiaW5hcnknOiBjYXNlICdiYXNlNjQnOiBjYXNlICd1Y3MyJzogY2FzZSAndWNzLTInOiBjYXNlICd1dGYxNmxlJzogY2FzZSAndXRmLTE2bGUnOiBjYXNlICdyYXcnOiByZXR1cm4gdHJ1ZTtcbiAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTtcbiAgICAgICB9XG4gICAgIH1cblxuXG5mdW5jdGlvbiBhc3NlcnRFbmNvZGluZyhlbmNvZGluZykge1xuICBpZiAoZW5jb2RpbmcgJiYgIWlzQnVmZmVyRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpO1xuICB9XG59XG5cbi8vIFN0cmluZ0RlY29kZXIgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBlZmZpY2llbnRseSBzcGxpdHRpbmcgYSBzZXJpZXMgb2Zcbi8vIGJ1ZmZlcnMgaW50byBhIHNlcmllcyBvZiBKUyBzdHJpbmdzIHdpdGhvdXQgYnJlYWtpbmcgYXBhcnQgbXVsdGktYnl0ZVxuLy8gY2hhcmFjdGVycy4gQ0VTVS04IGlzIGhhbmRsZWQgYXMgcGFydCBvZiB0aGUgVVRGLTggZW5jb2RpbmcuXG4vL1xuLy8gQFRPRE8gSGFuZGxpbmcgYWxsIGVuY29kaW5ncyBpbnNpZGUgYSBzaW5nbGUgb2JqZWN0IG1ha2VzIGl0IHZlcnkgZGlmZmljdWx0XG4vLyB0byByZWFzb24gYWJvdXQgdGhpcyBjb2RlLCBzbyBpdCBzaG91bGQgYmUgc3BsaXQgdXAgaW4gdGhlIGZ1dHVyZS5cbi8vIEBUT0RPIFRoZXJlIHNob3VsZCBiZSBhIHV0Zjgtc3RyaWN0IGVuY29kaW5nIHRoYXQgcmVqZWN0cyBpbnZhbGlkIFVURi04IGNvZGVcbi8vIHBvaW50cyBhcyB1c2VkIGJ5IENFU1UtOC5cbnZhciBTdHJpbmdEZWNvZGVyID0gZXhwb3J0cy5TdHJpbmdEZWNvZGVyID0gZnVuY3Rpb24oZW5jb2RpbmcpIHtcbiAgdGhpcy5lbmNvZGluZyA9IChlbmNvZGluZyB8fCAndXRmOCcpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXS8sICcnKTtcbiAgYXNzZXJ0RW5jb2RpbmcoZW5jb2RpbmcpO1xuICBzd2l0Y2ggKHRoaXMuZW5jb2RpbmcpIHtcbiAgICBjYXNlICd1dGY4JzpcbiAgICAgIC8vIENFU1UtOCByZXByZXNlbnRzIGVhY2ggb2YgU3Vycm9nYXRlIFBhaXIgYnkgMy1ieXRlc1xuICAgICAgdGhpcy5zdXJyb2dhdGVTaXplID0gMztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgLy8gVVRGLTE2IHJlcHJlc2VudHMgZWFjaCBvZiBTdXJyb2dhdGUgUGFpciBieSAyLWJ5dGVzXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAyO1xuICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IHV0ZjE2RGV0ZWN0SW5jb21wbGV0ZUNoYXI7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgLy8gQmFzZS02NCBzdG9yZXMgMyBieXRlcyBpbiA0IGNoYXJzLCBhbmQgcGFkcyB0aGUgcmVtYWluZGVyLlxuICAgICAgdGhpcy5zdXJyb2dhdGVTaXplID0gMztcbiAgICAgIHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIgPSBiYXNlNjREZXRlY3RJbmNvbXBsZXRlQ2hhcjtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aGlzLndyaXRlID0gcGFzc1Rocm91Z2hXcml0ZTtcbiAgICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEVub3VnaCBzcGFjZSB0byBzdG9yZSBhbGwgYnl0ZXMgb2YgYSBzaW5nbGUgY2hhcmFjdGVyLiBVVEYtOCBuZWVkcyA0XG4gIC8vIGJ5dGVzLCBidXQgQ0VTVS04IG1heSByZXF1aXJlIHVwIHRvIDYgKDMgYnl0ZXMgcGVyIHN1cnJvZ2F0ZSkuXG4gIHRoaXMuY2hhckJ1ZmZlciA9IG5ldyBCdWZmZXIoNik7XG4gIC8vIE51bWJlciBvZiBieXRlcyByZWNlaXZlZCBmb3IgdGhlIGN1cnJlbnQgaW5jb21wbGV0ZSBtdWx0aS1ieXRlIGNoYXJhY3Rlci5cbiAgdGhpcy5jaGFyUmVjZWl2ZWQgPSAwO1xuICAvLyBOdW1iZXIgb2YgYnl0ZXMgZXhwZWN0ZWQgZm9yIHRoZSBjdXJyZW50IGluY29tcGxldGUgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuXG4gIHRoaXMuY2hhckxlbmd0aCA9IDA7XG59O1xuXG5cbi8vIHdyaXRlIGRlY29kZXMgdGhlIGdpdmVuIGJ1ZmZlciBhbmQgcmV0dXJucyBpdCBhcyBKUyBzdHJpbmcgdGhhdCBpc1xuLy8gZ3VhcmFudGVlZCB0byBub3QgY29udGFpbiBhbnkgcGFydGlhbCBtdWx0aS1ieXRlIGNoYXJhY3RlcnMuIEFueSBwYXJ0aWFsXG4vLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGlzIGJ1ZmZlcmVkIHVwLCBhbmQgd2lsbCBiZVxuLy8gcmV0dXJuZWQgd2hlbiBjYWxsaW5nIHdyaXRlIGFnYWluIHdpdGggdGhlIHJlbWFpbmluZyBieXRlcy5cbi8vXG4vLyBOb3RlOiBDb252ZXJ0aW5nIGEgQnVmZmVyIGNvbnRhaW5pbmcgYW4gb3JwaGFuIHN1cnJvZ2F0ZSB0byBhIFN0cmluZ1xuLy8gY3VycmVudGx5IHdvcmtzLCBidXQgY29udmVydGluZyBhIFN0cmluZyB0byBhIEJ1ZmZlciAodmlhIGBuZXcgQnVmZmVyYCwgb3Jcbi8vIEJ1ZmZlciN3cml0ZSkgd2lsbCByZXBsYWNlIGluY29tcGxldGUgc3Vycm9nYXRlcyB3aXRoIHRoZSB1bmljb2RlXG4vLyByZXBsYWNlbWVudCBjaGFyYWN0ZXIuIFNlZSBodHRwczovL2NvZGVyZXZpZXcuY2hyb21pdW0ub3JnLzEyMTE3MzAwOS8gLlxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgdmFyIGNoYXJTdHIgPSAnJztcbiAgLy8gaWYgb3VyIGxhc3Qgd3JpdGUgZW5kZWQgd2l0aCBhbiBpbmNvbXBsZXRlIG11bHRpYnl0ZSBjaGFyYWN0ZXJcbiAgd2hpbGUgKHRoaXMuY2hhckxlbmd0aCkge1xuICAgIC8vIGRldGVybWluZSBob3cgbWFueSByZW1haW5pbmcgYnl0ZXMgdGhpcyBidWZmZXIgaGFzIHRvIG9mZmVyIGZvciB0aGlzIGNoYXJcbiAgICB2YXIgYXZhaWxhYmxlID0gKGJ1ZmZlci5sZW5ndGggPj0gdGhpcy5jaGFyTGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQpID9cbiAgICAgICAgdGhpcy5jaGFyTGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQgOlxuICAgICAgICBidWZmZXIubGVuZ3RoO1xuXG4gICAgLy8gYWRkIHRoZSBuZXcgYnl0ZXMgdG8gdGhlIGNoYXIgYnVmZmVyXG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCB0aGlzLmNoYXJSZWNlaXZlZCwgMCwgYXZhaWxhYmxlKTtcbiAgICB0aGlzLmNoYXJSZWNlaXZlZCArPSBhdmFpbGFibGU7XG5cbiAgICBpZiAodGhpcy5jaGFyUmVjZWl2ZWQgPCB0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAgIC8vIHN0aWxsIG5vdCBlbm91Z2ggY2hhcnMgaW4gdGhpcyBidWZmZXI/IHdhaXQgZm9yIG1vcmUgLi4uXG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIGJ5dGVzIGJlbG9uZ2luZyB0byB0aGUgY3VycmVudCBjaGFyYWN0ZXIgZnJvbSB0aGUgYnVmZmVyXG4gICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKGF2YWlsYWJsZSwgYnVmZmVyLmxlbmd0aCk7XG5cbiAgICAvLyBnZXQgdGhlIGNoYXJhY3RlciB0aGF0IHdhcyBzcGxpdFxuICAgIGNoYXJTdHIgPSB0aGlzLmNoYXJCdWZmZXIuc2xpY2UoMCwgdGhpcy5jaGFyTGVuZ3RoKS50b1N0cmluZyh0aGlzLmVuY29kaW5nKTtcblxuICAgIC8vIENFU1UtODogbGVhZCBzdXJyb2dhdGUgKEQ4MDAtREJGRikgaXMgYWxzbyB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXJcbiAgICB2YXIgY2hhckNvZGUgPSBjaGFyU3RyLmNoYXJDb2RlQXQoY2hhclN0ci5sZW5ndGggLSAxKTtcbiAgICBpZiAoY2hhckNvZGUgPj0gMHhEODAwICYmIGNoYXJDb2RlIDw9IDB4REJGRikge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoICs9IHRoaXMuc3Vycm9nYXRlU2l6ZTtcbiAgICAgIGNoYXJTdHIgPSAnJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0aGlzLmNoYXJSZWNlaXZlZCA9IHRoaXMuY2hhckxlbmd0aCA9IDA7XG5cbiAgICAvLyBpZiB0aGVyZSBhcmUgbm8gbW9yZSBieXRlcyBpbiB0aGlzIGJ1ZmZlciwganVzdCBlbWl0IG91ciBjaGFyXG4gICAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBjaGFyU3RyO1xuICAgIH1cbiAgICBicmVhaztcbiAgfVxuXG4gIC8vIGRldGVybWluZSBhbmQgc2V0IGNoYXJMZW5ndGggLyBjaGFyUmVjZWl2ZWRcbiAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIpO1xuXG4gIHZhciBlbmQgPSBidWZmZXIubGVuZ3RoO1xuICBpZiAodGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgLy8gYnVmZmVyIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlciBieXRlcyB3ZSBnb3RcbiAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCwgZW5kKTtcbiAgICBlbmQgLT0gdGhpcy5jaGFyUmVjZWl2ZWQ7XG4gIH1cblxuICBjaGFyU3RyICs9IGJ1ZmZlci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCBlbmQpO1xuXG4gIHZhciBlbmQgPSBjaGFyU3RyLmxlbmd0aCAtIDE7XG4gIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChlbmQpO1xuICAvLyBDRVNVLTg6IGxlYWQgc3Vycm9nYXRlIChEODAwLURCRkYpIGlzIGFsc28gdGhlIGluY29tcGxldGUgY2hhcmFjdGVyXG4gIGlmIChjaGFyQ29kZSA+PSAweEQ4MDAgJiYgY2hhckNvZGUgPD0gMHhEQkZGKSB7XG4gICAgdmFyIHNpemUgPSB0aGlzLnN1cnJvZ2F0ZVNpemU7XG4gICAgdGhpcy5jaGFyTGVuZ3RoICs9IHNpemU7XG4gICAgdGhpcy5jaGFyUmVjZWl2ZWQgKz0gc2l6ZTtcbiAgICB0aGlzLmNoYXJCdWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIHNpemUsIDAsIHNpemUpO1xuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgMCwgMCwgc2l6ZSk7XG4gICAgcmV0dXJuIGNoYXJTdHIuc3Vic3RyaW5nKDAsIGVuZCk7XG4gIH1cblxuICAvLyBvciBqdXN0IGVtaXQgdGhlIGNoYXJTdHJcbiAgcmV0dXJuIGNoYXJTdHI7XG59O1xuXG4vLyBkZXRlY3RJbmNvbXBsZXRlQ2hhciBkZXRlcm1pbmVzIGlmIHRoZXJlIGlzIGFuIGluY29tcGxldGUgVVRGLTggY2hhcmFjdGVyIGF0XG4vLyB0aGUgZW5kIG9mIHRoZSBnaXZlbiBidWZmZXIuIElmIHNvLCBpdCBzZXRzIHRoaXMuY2hhckxlbmd0aCB0byB0aGUgYnl0ZVxuLy8gbGVuZ3RoIHRoYXQgY2hhcmFjdGVyLCBhbmQgc2V0cyB0aGlzLmNoYXJSZWNlaXZlZCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzXG4vLyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgY2hhcmFjdGVyLlxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZGV0ZWN0SW5jb21wbGV0ZUNoYXIgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgLy8gZGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIHdlIGhhdmUgdG8gY2hlY2sgYXQgdGhlIGVuZCBvZiB0aGlzIGJ1ZmZlclxuICB2YXIgaSA9IChidWZmZXIubGVuZ3RoID49IDMpID8gMyA6IGJ1ZmZlci5sZW5ndGg7XG5cbiAgLy8gRmlndXJlIG91dCBpZiBvbmUgb2YgdGhlIGxhc3QgaSBieXRlcyBvZiBvdXIgYnVmZmVyIGFubm91bmNlcyBhblxuICAvLyBpbmNvbXBsZXRlIGNoYXIuXG4gIGZvciAoOyBpID4gMDsgaS0tKSB7XG4gICAgdmFyIGMgPSBidWZmZXJbYnVmZmVyLmxlbmd0aCAtIGldO1xuXG4gICAgLy8gU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTgjRGVzY3JpcHRpb25cblxuICAgIC8vIDExMFhYWFhYXG4gICAgaWYgKGkgPT0gMSAmJiBjID4+IDUgPT0gMHgwNikge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoID0gMjtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIDExMTBYWFhYXG4gICAgaWYgKGkgPD0gMiAmJiBjID4+IDQgPT0gMHgwRSkge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoID0gMztcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIDExMTEwWFhYXG4gICAgaWYgKGkgPD0gMyAmJiBjID4+IDMgPT0gMHgxRSkge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoID0gNDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGk7XG59O1xuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBpZiAoYnVmZmVyICYmIGJ1ZmZlci5sZW5ndGgpXG4gICAgcmVzID0gdGhpcy53cml0ZShidWZmZXIpO1xuXG4gIGlmICh0aGlzLmNoYXJSZWNlaXZlZCkge1xuICAgIHZhciBjciA9IHRoaXMuY2hhclJlY2VpdmVkO1xuICAgIHZhciBidWYgPSB0aGlzLmNoYXJCdWZmZXI7XG4gICAgdmFyIGVuYyA9IHRoaXMuZW5jb2Rpbmc7XG4gICAgcmVzICs9IGJ1Zi5zbGljZSgwLCBjcikudG9TdHJpbmcoZW5jKTtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuXG5mdW5jdGlvbiBwYXNzVGhyb3VnaFdyaXRlKGJ1ZmZlcikge1xuICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xufVxuXG5mdW5jdGlvbiB1dGYxNkRldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGJ1ZmZlci5sZW5ndGggJSAyO1xuICB0aGlzLmNoYXJMZW5ndGggPSB0aGlzLmNoYXJSZWNlaXZlZCA/IDIgOiAwO1xufVxuXG5mdW5jdGlvbiBiYXNlNjREZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIpIHtcbiAgdGhpcy5jaGFyUmVjZWl2ZWQgPSBidWZmZXIubGVuZ3RoICUgMztcbiAgdGhpcy5jaGFyTGVuZ3RoID0gdGhpcy5jaGFyUmVjZWl2ZWQgPyAzIDogMDtcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9zdHJpbmdfZGVjb2Rlci9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNjAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 601 */
/***/ function(module, exports, __webpack_require__) {

    eval("// a transform stream is a readable/writable stream where you do\n// something with the data.  Sometimes it's called a \"filter\",\n// but that's not a great name for it, since that implies a thing where\n// some bits pass through, and others are simply ignored.  (That would\n// be a valid example of a transform, of course.)\n//\n// While the output is causally related to the input, it's not a\n// necessarily symmetric or synchronous transformation.  For example,\n// a zlib stream might take multiple plain-text writes(), and then\n// emit a single compressed chunk some time in the future.\n//\n// Here's how this works:\n//\n// The Transform stream has all the aspects of the readable and writable\n// stream classes.  When you write(chunk), that calls _write(chunk,cb)\n// internally, and returns false if there's a lot of pending writes\n// buffered up.  When you call read(), that calls _read(n) until\n// there's enough pending readable data buffered up.\n//\n// In a transform stream, the written data is placed in a buffer.  When\n// _read(n) is called, it transforms the queued up data, calling the\n// buffered _write cb's as it consumes chunks.  If consuming a single\n// written chunk would result in multiple output chunks, then the first\n// outputted bit calls the readcb, and subsequent chunks just go into\n// the read buffer, and will cause it to emit 'readable' if necessary.\n//\n// This way, back-pressure is actually determined by the reading side,\n// since _read has to be called to start processing a new chunk.  However,\n// a pathological inflate type of transform can cause excessive buffering\n// here.  For example, imagine a stream where every byte of input is\n// interpreted as an integer from 0-255, and then results in that many\n// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in\n// 1kb of data being output.  In this case, you could write a very small\n// amount of input, and end up with a very large amount of output.  In\n// such a pathological inflating mechanism, there'd be no way to tell\n// the system to stop doing the transform.  A single 4MB write could\n// cause the system to run out of memory.\n//\n// However, even in such a pathological case, only a single written chunk\n// would be consumed, and then the rest would wait (un-transformed) until\n// the results of the previous transformed chunk were consumed.\n\n'use strict';\n\nmodule.exports = Transform;\n\nvar Duplex = __webpack_require__(597);\n\n/*<replacement>*/\nvar util = __webpack_require__(594);\nutil.inherits = __webpack_require__(440);\n/*</replacement>*/\n\nutil.inherits(Transform, Duplex);\n\nfunction TransformState(stream) {\n  this.afterTransform = function (er, data) {\n    return afterTransform(stream, er, data);\n  };\n\n  this.needTransform = false;\n  this.transforming = false;\n  this.writecb = null;\n  this.writechunk = null;\n  this.writeencoding = null;\n}\n\nfunction afterTransform(stream, er, data) {\n  var ts = stream._transformState;\n  ts.transforming = false;\n\n  var cb = ts.writecb;\n\n  if (!cb) return stream.emit('error', new Error('no writecb in Transform class'));\n\n  ts.writechunk = null;\n  ts.writecb = null;\n\n  if (data !== null && data !== undefined) stream.push(data);\n\n  cb(er);\n\n  var rs = stream._readableState;\n  rs.reading = false;\n  if (rs.needReadable || rs.length < rs.highWaterMark) {\n    stream._read(rs.highWaterMark);\n  }\n}\n\nfunction Transform(options) {\n  if (!(this instanceof Transform)) return new Transform(options);\n\n  Duplex.call(this, options);\n\n  this._transformState = new TransformState(this);\n\n  var stream = this;\n\n  // start out asking for a readable event once data is transformed.\n  this._readableState.needReadable = true;\n\n  // we have implemented the _read method, and done the other things\n  // that Readable wants before the first _read call, so unset the\n  // sync guard flag.\n  this._readableState.sync = false;\n\n  if (options) {\n    if (typeof options.transform === 'function') this._transform = options.transform;\n\n    if (typeof options.flush === 'function') this._flush = options.flush;\n  }\n\n  // When the writable side finishes, then flush out anything remaining.\n  this.once('prefinish', function () {\n    if (typeof this._flush === 'function') this._flush(function (er, data) {\n      done(stream, er, data);\n    });else done(stream);\n  });\n}\n\nTransform.prototype.push = function (chunk, encoding) {\n  this._transformState.needTransform = false;\n  return Duplex.prototype.push.call(this, chunk, encoding);\n};\n\n// This is the part where you do stuff!\n// override this function in implementation classes.\n// 'chunk' is an input chunk.\n//\n// Call `push(newChunk)` to pass along transformed output\n// to the readable side.  You may call 'push' zero or more times.\n//\n// Call `cb(err)` when you are done with this chunk.  If you pass\n// an error, then that'll put the hurt on the whole operation.  If you\n// never call cb(), then you'll never get another chunk.\nTransform.prototype._transform = function (chunk, encoding, cb) {\n  throw new Error('_transform() is not implemented');\n};\n\nTransform.prototype._write = function (chunk, encoding, cb) {\n  var ts = this._transformState;\n  ts.writecb = cb;\n  ts.writechunk = chunk;\n  ts.writeencoding = encoding;\n  if (!ts.transforming) {\n    var rs = this._readableState;\n    if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);\n  }\n};\n\n// Doesn't matter what the args are here.\n// _transform does all the work.\n// That we got here means that the readable side wants more data.\nTransform.prototype._read = function (n) {\n  var ts = this._transformState;\n\n  if (ts.writechunk !== null && ts.writecb && !ts.transforming) {\n    ts.transforming = true;\n    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);\n  } else {\n    // mark that we need a transform, so that any data that comes in\n    // will get processed, now that we've asked for it.\n    ts.needTransform = true;\n  }\n};\n\nfunction done(stream, er, data) {\n  if (er) return stream.emit('error', er);\n\n  if (data !== null && data !== undefined) stream.push(data);\n\n  // if there's nothing in the write buffer, then that means\n  // that nothing more will ever be provided\n  var ws = stream._writableState;\n  var ts = stream._transformState;\n\n  if (ws.length) throw new Error('Calling transform done when ws.length != 0');\n\n  if (ts.transforming) throw new Error('Calling transform done when still transforming');\n\n  return stream.push(null);\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjAxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGEgdHJhbnNmb3JtIHN0cmVhbSBpcyBhIHJlYWRhYmxlL3dyaXRhYmxlIHN0cmVhbSB3aGVyZSB5b3UgZG9cbi8vIHNvbWV0aGluZyB3aXRoIHRoZSBkYXRhLiAgU29tZXRpbWVzIGl0J3MgY2FsbGVkIGEgXCJmaWx0ZXJcIixcbi8vIGJ1dCB0aGF0J3Mgbm90IGEgZ3JlYXQgbmFtZSBmb3IgaXQsIHNpbmNlIHRoYXQgaW1wbGllcyBhIHRoaW5nIHdoZXJlXG4vLyBzb21lIGJpdHMgcGFzcyB0aHJvdWdoLCBhbmQgb3RoZXJzIGFyZSBzaW1wbHkgaWdub3JlZC4gIChUaGF0IHdvdWxkXG4vLyBiZSBhIHZhbGlkIGV4YW1wbGUgb2YgYSB0cmFuc2Zvcm0sIG9mIGNvdXJzZS4pXG4vL1xuLy8gV2hpbGUgdGhlIG91dHB1dCBpcyBjYXVzYWxseSByZWxhdGVkIHRvIHRoZSBpbnB1dCwgaXQncyBub3QgYVxuLy8gbmVjZXNzYXJpbHkgc3ltbWV0cmljIG9yIHN5bmNocm9ub3VzIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsXG4vLyBhIHpsaWIgc3RyZWFtIG1pZ2h0IHRha2UgbXVsdGlwbGUgcGxhaW4tdGV4dCB3cml0ZXMoKSwgYW5kIHRoZW5cbi8vIGVtaXQgYSBzaW5nbGUgY29tcHJlc3NlZCBjaHVuayBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZS5cbi8vXG4vLyBIZXJlJ3MgaG93IHRoaXMgd29ya3M6XG4vL1xuLy8gVGhlIFRyYW5zZm9ybSBzdHJlYW0gaGFzIGFsbCB0aGUgYXNwZWN0cyBvZiB0aGUgcmVhZGFibGUgYW5kIHdyaXRhYmxlXG4vLyBzdHJlYW0gY2xhc3Nlcy4gIFdoZW4geW91IHdyaXRlKGNodW5rKSwgdGhhdCBjYWxscyBfd3JpdGUoY2h1bmssY2IpXG4vLyBpbnRlcm5hbGx5LCBhbmQgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSdzIGEgbG90IG9mIHBlbmRpbmcgd3JpdGVzXG4vLyBidWZmZXJlZCB1cC4gIFdoZW4geW91IGNhbGwgcmVhZCgpLCB0aGF0IGNhbGxzIF9yZWFkKG4pIHVudGlsXG4vLyB0aGVyZSdzIGVub3VnaCBwZW5kaW5nIHJlYWRhYmxlIGRhdGEgYnVmZmVyZWQgdXAuXG4vL1xuLy8gSW4gYSB0cmFuc2Zvcm0gc3RyZWFtLCB0aGUgd3JpdHRlbiBkYXRhIGlzIHBsYWNlZCBpbiBhIGJ1ZmZlci4gIFdoZW5cbi8vIF9yZWFkKG4pIGlzIGNhbGxlZCwgaXQgdHJhbnNmb3JtcyB0aGUgcXVldWVkIHVwIGRhdGEsIGNhbGxpbmcgdGhlXG4vLyBidWZmZXJlZCBfd3JpdGUgY2IncyBhcyBpdCBjb25zdW1lcyBjaHVua3MuICBJZiBjb25zdW1pbmcgYSBzaW5nbGVcbi8vIHdyaXR0ZW4gY2h1bmsgd291bGQgcmVzdWx0IGluIG11bHRpcGxlIG91dHB1dCBjaHVua3MsIHRoZW4gdGhlIGZpcnN0XG4vLyBvdXRwdXR0ZWQgYml0IGNhbGxzIHRoZSByZWFkY2IsIGFuZCBzdWJzZXF1ZW50IGNodW5rcyBqdXN0IGdvIGludG9cbi8vIHRoZSByZWFkIGJ1ZmZlciwgYW5kIHdpbGwgY2F1c2UgaXQgdG8gZW1pdCAncmVhZGFibGUnIGlmIG5lY2Vzc2FyeS5cbi8vXG4vLyBUaGlzIHdheSwgYmFjay1wcmVzc3VyZSBpcyBhY3R1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSByZWFkaW5nIHNpZGUsXG4vLyBzaW5jZSBfcmVhZCBoYXMgdG8gYmUgY2FsbGVkIHRvIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgY2h1bmsuICBIb3dldmVyLFxuLy8gYSBwYXRob2xvZ2ljYWwgaW5mbGF0ZSB0eXBlIG9mIHRyYW5zZm9ybSBjYW4gY2F1c2UgZXhjZXNzaXZlIGJ1ZmZlcmluZ1xuLy8gaGVyZS4gIEZvciBleGFtcGxlLCBpbWFnaW5lIGEgc3RyZWFtIHdoZXJlIGV2ZXJ5IGJ5dGUgb2YgaW5wdXQgaXNcbi8vIGludGVycHJldGVkIGFzIGFuIGludGVnZXIgZnJvbSAwLTI1NSwgYW5kIHRoZW4gcmVzdWx0cyBpbiB0aGF0IG1hbnlcbi8vIGJ5dGVzIG9mIG91dHB1dC4gIFdyaXRpbmcgdGhlIDQgYnl0ZXMge2ZmLGZmLGZmLGZmfSB3b3VsZCByZXN1bHQgaW5cbi8vIDFrYiBvZiBkYXRhIGJlaW5nIG91dHB1dC4gIEluIHRoaXMgY2FzZSwgeW91IGNvdWxkIHdyaXRlIGEgdmVyeSBzbWFsbFxuLy8gYW1vdW50IG9mIGlucHV0LCBhbmQgZW5kIHVwIHdpdGggYSB2ZXJ5IGxhcmdlIGFtb3VudCBvZiBvdXRwdXQuICBJblxuLy8gc3VjaCBhIHBhdGhvbG9naWNhbCBpbmZsYXRpbmcgbWVjaGFuaXNtLCB0aGVyZSdkIGJlIG5vIHdheSB0byB0ZWxsXG4vLyB0aGUgc3lzdGVtIHRvIHN0b3AgZG9pbmcgdGhlIHRyYW5zZm9ybS4gIEEgc2luZ2xlIDRNQiB3cml0ZSBjb3VsZFxuLy8gY2F1c2UgdGhlIHN5c3RlbSB0byBydW4gb3V0IG9mIG1lbW9yeS5cbi8vXG4vLyBIb3dldmVyLCBldmVuIGluIHN1Y2ggYSBwYXRob2xvZ2ljYWwgY2FzZSwgb25seSBhIHNpbmdsZSB3cml0dGVuIGNodW5rXG4vLyB3b3VsZCBiZSBjb25zdW1lZCwgYW5kIHRoZW4gdGhlIHJlc3Qgd291bGQgd2FpdCAodW4tdHJhbnNmb3JtZWQpIHVudGlsXG4vLyB0aGUgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgdHJhbnNmb3JtZWQgY2h1bmsgd2VyZSBjb25zdW1lZC5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcblxudmFyIER1cGxleCA9IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFRyYW5zZm9ybSwgRHVwbGV4KTtcblxuZnVuY3Rpb24gVHJhbnNmb3JtU3RhdGUoc3RyZWFtKSB7XG4gIHRoaXMuYWZ0ZXJUcmFuc2Zvcm0gPSBmdW5jdGlvbiAoZXIsIGRhdGEpIHtcbiAgICByZXR1cm4gYWZ0ZXJUcmFuc2Zvcm0oc3RyZWFtLCBlciwgZGF0YSk7XG4gIH07XG5cbiAgdGhpcy5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHRoaXMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG4gIHRoaXMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRoaXMud3JpdGVlbmNvZGluZyA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpIHtcbiAgdmFyIHRzID0gc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG5cbiAgdmFyIGNiID0gdHMud3JpdGVjYjtcblxuICBpZiAoIWNiKSByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdubyB3cml0ZWNiIGluIFRyYW5zZm9ybSBjbGFzcycpKTtcblxuICB0cy53cml0ZWNodW5rID0gbnVsbDtcbiAgdHMud3JpdGVjYiA9IG51bGw7XG5cbiAgaWYgKGRhdGEgIT09IG51bGwgJiYgZGF0YSAhPT0gdW5kZWZpbmVkKSBzdHJlYW0ucHVzaChkYXRhKTtcblxuICBjYihlcik7XG5cbiAgdmFyIHJzID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBycy5yZWFkaW5nID0gZmFsc2U7XG4gIGlmIChycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykge1xuICAgIHN0cmVhbS5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBUcmFuc2Zvcm0ob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVHJhbnNmb3JtKSkgcmV0dXJuIG5ldyBUcmFuc2Zvcm0ob3B0aW9ucyk7XG5cbiAgRHVwbGV4LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUgPSBuZXcgVHJhbnNmb3JtU3RhdGUodGhpcyk7XG5cbiAgdmFyIHN0cmVhbSA9IHRoaXM7XG5cbiAgLy8gc3RhcnQgb3V0IGFza2luZyBmb3IgYSByZWFkYWJsZSBldmVudCBvbmNlIGRhdGEgaXMgdHJhbnNmb3JtZWQuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyB3ZSBoYXZlIGltcGxlbWVudGVkIHRoZSBfcmVhZCBtZXRob2QsIGFuZCBkb25lIHRoZSBvdGhlciB0aGluZ3NcbiAgLy8gdGhhdCBSZWFkYWJsZSB3YW50cyBiZWZvcmUgdGhlIGZpcnN0IF9yZWFkIGNhbGwsIHNvIHVuc2V0IHRoZVxuICAvLyBzeW5jIGd1YXJkIGZsYWcuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fdHJhbnNmb3JtID0gb3B0aW9ucy50cmFuc2Zvcm07XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoID0gb3B0aW9ucy5mbHVzaDtcbiAgfVxuXG4gIC8vIFdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZmluaXNoZXMsIHRoZW4gZmx1c2ggb3V0IGFueXRoaW5nIHJlbWFpbmluZy5cbiAgdGhpcy5vbmNlKCdwcmVmaW5pc2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2goZnVuY3Rpb24gKGVyLCBkYXRhKSB7XG4gICAgICBkb25lKHN0cmVhbSwgZXIsIGRhdGEpO1xuICAgIH0pO2Vsc2UgZG9uZShzdHJlYW0pO1xuICB9KTtcbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHJldHVybiBEdXBsZXgucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBjaHVuaywgZW5jb2RpbmcpO1xufTtcblxuLy8gVGhpcyBpcyB0aGUgcGFydCB3aGVyZSB5b3UgZG8gc3R1ZmYhXG4vLyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGluIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyAnY2h1bmsnIGlzIGFuIGlucHV0IGNodW5rLlxuLy9cbi8vIENhbGwgYHB1c2gobmV3Q2h1bmspYCB0byBwYXNzIGFsb25nIHRyYW5zZm9ybWVkIG91dHB1dFxuLy8gdG8gdGhlIHJlYWRhYmxlIHNpZGUuICBZb3UgbWF5IGNhbGwgJ3B1c2gnIHplcm8gb3IgbW9yZSB0aW1lcy5cbi8vXG4vLyBDYWxsIGBjYihlcnIpYCB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoaXMgY2h1bmsuICBJZiB5b3UgcGFzc1xuLy8gYW4gZXJyb3IsIHRoZW4gdGhhdCdsbCBwdXQgdGhlIGh1cnQgb24gdGhlIHdob2xlIG9wZXJhdGlvbi4gIElmIHlvdVxuLy8gbmV2ZXIgY2FsbCBjYigpLCB0aGVuIHlvdSdsbCBuZXZlciBnZXQgYW5vdGhlciBjaHVuay5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRocm93IG5ldyBFcnJvcignX3RyYW5zZm9ybSgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMud3JpdGVjYiA9IGNiO1xuICB0cy53cml0ZWNodW5rID0gY2h1bms7XG4gIHRzLndyaXRlZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgaWYgKCF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICh0cy5uZWVkVHJhbnNmb3JtIHx8IHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59O1xuXG4vLyBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBhcmdzIGFyZSBoZXJlLlxuLy8gX3RyYW5zZm9ybSBkb2VzIGFsbCB0aGUgd29yay5cbi8vIFRoYXQgd2UgZ290IGhlcmUgbWVhbnMgdGhhdCB0aGUgcmVhZGFibGUgc2lkZSB3YW50cyBtb3JlIGRhdGEuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHRzLndyaXRlY2h1bmsgIT09IG51bGwgJiYgdHMud3JpdGVjYiAmJiAhdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdHMudHJhbnNmb3JtaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl90cmFuc2Zvcm0odHMud3JpdGVjaHVuaywgdHMud3JpdGVlbmNvZGluZywgdHMuYWZ0ZXJUcmFuc2Zvcm0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG1hcmsgdGhhdCB3ZSBuZWVkIGEgdHJhbnNmb3JtLCBzbyB0aGF0IGFueSBkYXRhIHRoYXQgY29tZXMgaW5cbiAgICAvLyB3aWxsIGdldCBwcm9jZXNzZWQsIG5vdyB0aGF0IHdlJ3ZlIGFza2VkIGZvciBpdC5cbiAgICB0cy5uZWVkVHJhbnNmb3JtID0gdHJ1ZTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZG9uZShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIGlmIChlcikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcblxuICBpZiAoZGF0YSAhPT0gbnVsbCAmJiBkYXRhICE9PSB1bmRlZmluZWQpIHN0cmVhbS5wdXNoKGRhdGEpO1xuXG4gIC8vIGlmIHRoZXJlJ3Mgbm90aGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyLCB0aGVuIHRoYXQgbWVhbnNcbiAgLy8gdGhhdCBub3RoaW5nIG1vcmUgd2lsbCBldmVyIGJlIHByb3ZpZGVkXG4gIHZhciB3cyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHRzID0gc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZTtcblxuICBpZiAod3MubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ0NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMCcpO1xuXG4gIGlmICh0cy50cmFuc2Zvcm1pbmcpIHRocm93IG5ldyBFcnJvcignQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHN0aWxsIHRyYW5zZm9ybWluZycpO1xuXG4gIHJldHVybiBzdHJlYW0ucHVzaChudWxsKTtcbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qc1xuLy8gbW9kdWxlIGlkID0gNjAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 602 */
/***/ function(module, exports, __webpack_require__) {

    eval("// a passthrough stream.\n// basically just the most minimal sort of Transform stream.\n// Every written chunk gets output as-is.\n\n'use strict';\n\nmodule.exports = PassThrough;\n\nvar Transform = __webpack_require__(601);\n\n/*<replacement>*/\nvar util = __webpack_require__(594);\nutil.inherits = __webpack_require__(440);\n/*</replacement>*/\n\nutil.inherits(PassThrough, Transform);\n\nfunction PassThrough(options) {\n  if (!(this instanceof PassThrough)) return new PassThrough(options);\n\n  Transform.call(this, options);\n}\n\nPassThrough.prototype._transform = function (chunk, encoding, cb) {\n  cb(null, chunk);\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjAyLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gYSBwYXNzdGhyb3VnaCBzdHJlYW0uXG4vLyBiYXNpY2FsbHkganVzdCB0aGUgbW9zdCBtaW5pbWFsIHNvcnQgb2YgVHJhbnNmb3JtIHN0cmVhbS5cbi8vIEV2ZXJ5IHdyaXR0ZW4gY2h1bmsgZ2V0cyBvdXRwdXQgYXMtaXMuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYXNzVGhyb3VnaDtcblxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vX3N0cmVhbV90cmFuc2Zvcm0nKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pO1xuXG5mdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpIHJldHVybiBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucyk7XG5cbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5cblBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzXG4vLyBtb2R1bGUgaWQgPSA2MDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 603 */
/***/ function(module, exports, __webpack_require__) {

    eval("module.exports = __webpack_require__(598)\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjAzLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vd3JpdGFibGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi9saWIvX3N0cmVhbV93cml0YWJsZS5qc1wiKVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWRhYmxlLXN0cmVhbS93cml0YWJsZS5qc1xuLy8gbW9kdWxlIGlkID0gNjAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 604 */
/***/ function(module, exports, __webpack_require__) {

    eval("module.exports = __webpack_require__(597)\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjA0LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vZHVwbGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vbGliL19zdHJlYW1fZHVwbGV4LmpzXCIpXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhZGFibGUtc3RyZWFtL2R1cGxleC5qc1xuLy8gbW9kdWxlIGlkID0gNjA0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 605 */
/***/ function(module, exports, __webpack_require__) {

    eval("module.exports = __webpack_require__(601)\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjA1LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vdHJhbnNmb3JtLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzXCIpXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhZGFibGUtc3RyZWFtL3RyYW5zZm9ybS5qc1xuLy8gbW9kdWxlIGlkID0gNjA1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 606 */
/***/ function(module, exports, __webpack_require__) {

    eval("module.exports = __webpack_require__(602)\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjA2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcGFzc3Rocm91Z2guanMiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qc1wiKVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWRhYmxlLXN0cmVhbS9wYXNzdGhyb3VnaC5qc1xuLy8gbW9kdWxlIGlkID0gNjA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 607 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });\n\nvar _react = __webpack_require__(174);var _react2 = _interopRequireDefault(_react);\nvar _reactDom = __webpack_require__(205);var _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _NotificationIcon = __webpack_require__(608);var _NotificationIcon2 = _interopRequireDefault(_NotificationIcon);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} /* global $ */\n\nvar NotificationIcon = {\n  unreadNotificationsCount: null,\n\n  init: function init(serverData) {\n    var self = NotificationIcon;\n    self.unreadNotificationsCount = serverData.unreadNotificationsCount;\n    self.render();\n  },\n  render: function render() {var newUnreadCount = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n    if (newUnreadCount !== null) {\n      NotificationIcon.unreadNotificationsCount = newUnreadCount;\n    }\n\n    if (_Active2.default.Mapper !== null) {\n      _reactDom2.default.render(_react2.default.createElement(_NotificationIcon2.default, {\n        unreadNotificationsCount: NotificationIcon.unreadNotificationsCount }),\n      $('#notification_icon').get(0));\n    }\n  } };exports.default =\n\n\nNotificationIcon;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjA3LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvR2xvYmFsVUkvTm90aWZpY2F0aW9uSWNvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBnbG9iYWwgJCAqL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJ1xuXG5pbXBvcnQgQWN0aXZlIGZyb20gJy4uL0FjdGl2ZSdcbmltcG9ydCBOb3RpZmljYXRpb25JY29uQ29tcG9uZW50IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvTm90aWZpY2F0aW9uSWNvbidcblxuY29uc3QgTm90aWZpY2F0aW9uSWNvbiA9IHtcbiAgdW5yZWFkTm90aWZpY2F0aW9uc0NvdW50OiBudWxsLFxuXG4gIGluaXQ6IGZ1bmN0aW9uKHNlcnZlckRhdGEpIHtcbiAgICBjb25zdCBzZWxmID0gTm90aWZpY2F0aW9uSWNvblxuICAgIHNlbGYudW5yZWFkTm90aWZpY2F0aW9uc0NvdW50ID0gc2VydmVyRGF0YS51bnJlYWROb3RpZmljYXRpb25zQ291bnRcbiAgICBzZWxmLnJlbmRlcigpXG4gIH0sXG4gIHJlbmRlcjogZnVuY3Rpb24obmV3VW5yZWFkQ291bnQgPSBudWxsKSB7XG4gICAgaWYgKG5ld1VucmVhZENvdW50ICE9PSBudWxsKSB7XG4gICAgICBOb3RpZmljYXRpb25JY29uLnVucmVhZE5vdGlmaWNhdGlvbnNDb3VudCA9IG5ld1VucmVhZENvdW50XG4gICAgfVxuXG4gICAgaWYgKEFjdGl2ZS5NYXBwZXIgIT09IG51bGwpIHtcbiAgICAgIFJlYWN0RE9NLnJlbmRlcihSZWFjdC5jcmVhdGVFbGVtZW50KE5vdGlmaWNhdGlvbkljb25Db21wb25lbnQsIHtcbiAgICAgICAgdW5yZWFkTm90aWZpY2F0aW9uc0NvdW50OiBOb3RpZmljYXRpb25JY29uLnVucmVhZE5vdGlmaWNhdGlvbnNDb3VudFxuICAgICAgfSksICQoJyNub3RpZmljYXRpb25faWNvbicpLmdldCgwKSlcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTm90aWZpY2F0aW9uSWNvblxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9HbG9iYWxVSS9Ob3RpZmljYXRpb25JY29uLmpzIl0sIm1hcHBpbmdzIjoiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 608 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _react = __webpack_require__(174);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\n\nNotificationIcon = function (_Component) {_inherits(NotificationIcon, _Component);\n  function NotificationIcon(props) {_classCallCheck(this, NotificationIcon);var _this = _possibleConstructorReturn(this, (NotificationIcon.__proto__ || Object.getPrototypeOf(NotificationIcon)).call(this,\n    props));_this.\n\n\n\n\n\n    render = function () {\n      var linkClasses = 'notificationsIcon upperRightEl upperRightIcon ';\n\n      if (_this.props.unreadNotificationsCount > 0) {\n        linkClasses += 'unread';\n      } else {\n        linkClasses += 'read';\n      }\n\n      return (\n        _react2.default.createElement('a', { className: linkClasses, href: '/notifications' },\n          _react2.default.createElement('div', { className: 'tooltipsUnder' }, 'Notifications'),\n\n\n          _this.props.unreadNotificationsCount === 0 ? null :\n          _react2.default.createElement('div', { className: 'unread-notifications-dot' })));\n\n\n\n\n    };_this.state = {};return _this;}return NotificationIcon;}(_react.Component);\n\n\nNotificationIcon.propTypes = {\n  unreadNotificationsCount: _react.PropTypes.number };exports.default =\n\n\nNotificationIcon;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjA4LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvY29tcG9uZW50cy9Ob3RpZmljYXRpb25JY29uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBQcm9wVHlwZXMsIENvbXBvbmVudCB9IGZyb20gJ3JlYWN0J1xuXG5jbGFzcyBOb3RpZmljYXRpb25JY29uIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyID0gKCkgPT4ge1xuICAgIGxldCBsaW5rQ2xhc3NlcyA9ICdub3RpZmljYXRpb25zSWNvbiB1cHBlclJpZ2h0RWwgdXBwZXJSaWdodEljb24gJ1xuXG4gICAgaWYgKHRoaXMucHJvcHMudW5yZWFkTm90aWZpY2F0aW9uc0NvdW50ID4gMCkge1xuICAgICAgbGlua0NsYXNzZXMgKz0gJ3VucmVhZCdcbiAgICB9IGVsc2Uge1xuICAgICAgbGlua0NsYXNzZXMgKz0gJ3JlYWQnXG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxhIGNsYXNzTmFtZT17bGlua0NsYXNzZXN9IGhyZWY9XCIvbm90aWZpY2F0aW9uc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRvb2x0aXBzVW5kZXJcIj5cbiAgICAgICAgICBOb3RpZmljYXRpb25zXG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7dGhpcy5wcm9wcy51bnJlYWROb3RpZmljYXRpb25zQ291bnQgPT09IDAgPyBudWxsIDogKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidW5yZWFkLW5vdGlmaWNhdGlvbnMtZG90XCI+PC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L2E+XG5cbiAgICApXG4gIH1cbn1cblxuTm90aWZpY2F0aW9uSWNvbi5wcm9wVHlwZXMgPSB7XG4gIHVucmVhZE5vdGlmaWNhdGlvbnNDb3VudDogUHJvcFR5cGVzLm51bWJlclxufVxuXG5leHBvcnQgZGVmYXVsdCBOb3RpZmljYXRpb25JY29uXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvTm90aWZpY2F0aW9uSWNvbi5qcyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 609 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _backbone = __webpack_require__(1);var _backbone2 = _interopRequireDefault(_backbone);\n\n\nvar _Loading = __webpack_require__(368);var _Loading2 = _interopRequireDefault(_Loading);\n\nvar _Map = __webpack_require__(370);var _Map2 = _interopRequireDefault(_Map);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}try {_backbone2.default.$ = window.$;} catch (err) {}\n\nvar MapCollection = _backbone2.default.Collection.extend({\n  model: _Map2.default,\n  initialize: function initialize(models, options) {\n    this.id = options.id;\n    this.sortBy = options.sortBy;\n\n    if (options.mapperId) {\n      this.mapperId = options.mapperId;\n    }\n\n    // this.page represents the NEXT page to fetch\n    this.page = models.length > 0 ? models.length < 20 ? 'loadedAll' : 2 : 1;\n  },\n  url: function url() {\n    if (!this.mapperId) {\n      return '/explore/' + this.id + '.json';\n    } else {\n      return '/explore/mapper/' + this.mapperId + '.json';\n    }\n  },\n  comparator: function comparator(a, b) {\n    a = a.get(this.sortBy);\n    b = b.get(this.sortBy);\n    var temp;\n    if (this.sortBy === 'name') {\n      a = a ? a.toLowerCase() : '';\n      b = b ? b.toLowerCase() : '';\n    } else {\n      // this is for updated_at and created_at\n      temp = a;\n      a = b;\n      b = temp;\n      a = new Date(a).getTime();\n      b = new Date(b).getTime();\n    }\n    return a > b ? 1 : a < b ? -1 : 0;\n  },\n  getMaps: function getMaps(cb) {\n    var self = this;\n\n    _Loading2.default.show();\n\n    if (this.page !== 'loadedAll') {\n      var numBefore = this.length;\n      this.fetch({\n        remove: false,\n        silent: true,\n        data: { page: this.page },\n        success: function success(collection, response, options) {\n          // you can pass additional options to the event you trigger here as well\n          if (collection.length - numBefore < 20) {\n            self.page = 'loadedAll';\n          } else {\n            self.page += 1;\n          }\n          self.trigger('successOnFetch', cb);\n        },\n        error: function error(collection, response, options) {\n          // you can pass additional options to the event you trigger here as well\n          self.trigger('errorOnFetch');\n        } });\n\n    } else {\n      self.trigger('successOnFetch', cb);\n    }\n  } });exports.default =\n\n\nMapCollection;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjA5LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvRGF0YU1vZGVsL01hcENvbGxlY3Rpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhY2tib25lIGZyb20gJ2JhY2tib25lJ1xudHJ5IHsgQmFja2JvbmUuJCA9IHdpbmRvdy4kIH0gY2F0Y2ggKGVycikge31cblxuaW1wb3J0IExvYWRpbmcgZnJvbSAnLi4vTG9hZGluZydcblxuaW1wb3J0IE1hcCBmcm9tICcuL01hcCdcblxuY29uc3QgTWFwQ29sbGVjdGlvbiA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcbiAgbW9kZWw6IE1hcCxcbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24obW9kZWxzLCBvcHRpb25zKSB7XG4gICAgdGhpcy5pZCA9IG9wdGlvbnMuaWRcbiAgICB0aGlzLnNvcnRCeSA9IG9wdGlvbnMuc29ydEJ5XG5cbiAgICBpZiAob3B0aW9ucy5tYXBwZXJJZCkge1xuICAgICAgdGhpcy5tYXBwZXJJZCA9IG9wdGlvbnMubWFwcGVySWRcbiAgICB9XG5cbiAgICAvLyB0aGlzLnBhZ2UgcmVwcmVzZW50cyB0aGUgTkVYVCBwYWdlIHRvIGZldGNoXG4gICAgdGhpcy5wYWdlID0gbW9kZWxzLmxlbmd0aCA+IDAgPyAobW9kZWxzLmxlbmd0aCA8IDIwID8gJ2xvYWRlZEFsbCcgOiAyKSA6IDFcbiAgfSxcbiAgdXJsOiBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMubWFwcGVySWQpIHtcbiAgICAgIHJldHVybiAnL2V4cGxvcmUvJyArIHRoaXMuaWQgKyAnLmpzb24nXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnL2V4cGxvcmUvbWFwcGVyLycgKyB0aGlzLm1hcHBlcklkICsgJy5qc29uJ1xuICAgIH1cbiAgfSxcbiAgY29tcGFyYXRvcjogZnVuY3Rpb24oYSwgYikge1xuICAgIGEgPSBhLmdldCh0aGlzLnNvcnRCeSlcbiAgICBiID0gYi5nZXQodGhpcy5zb3J0QnkpXG4gICAgdmFyIHRlbXBcbiAgICBpZiAodGhpcy5zb3J0QnkgPT09ICduYW1lJykge1xuICAgICAgYSA9IGEgPyBhLnRvTG93ZXJDYXNlKCkgOiAnJ1xuICAgICAgYiA9IGIgPyBiLnRvTG93ZXJDYXNlKCkgOiAnJ1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGlzIGlzIGZvciB1cGRhdGVkX2F0IGFuZCBjcmVhdGVkX2F0XG4gICAgICB0ZW1wID0gYVxuICAgICAgYSA9IGJcbiAgICAgIGIgPSB0ZW1wXG4gICAgICBhID0gKG5ldyBEYXRlKGEpKS5nZXRUaW1lKClcbiAgICAgIGIgPSAobmV3IERhdGUoYikpLmdldFRpbWUoKVxuICAgIH1cbiAgICByZXR1cm4gYSA+IGIgPyAxIDogYSA8IGIgPyAtMSA6IDBcbiAgfSxcbiAgZ2V0TWFwczogZnVuY3Rpb24oY2IpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXNcblxuICAgIExvYWRpbmcuc2hvdygpXG5cbiAgICBpZiAodGhpcy5wYWdlICE9PSAnbG9hZGVkQWxsJykge1xuICAgICAgdmFyIG51bUJlZm9yZSA9IHRoaXMubGVuZ3RoXG4gICAgICB0aGlzLmZldGNoKHtcbiAgICAgICAgcmVtb3ZlOiBmYWxzZSxcbiAgICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgICBkYXRhOiB7IHBhZ2U6IHRoaXMucGFnZSB9LFxuICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihjb2xsZWN0aW9uLCByZXNwb25zZSwgb3B0aW9ucykge1xuICAgICAgICAgIC8vIHlvdSBjYW4gcGFzcyBhZGRpdGlvbmFsIG9wdGlvbnMgdG8gdGhlIGV2ZW50IHlvdSB0cmlnZ2VyIGhlcmUgYXMgd2VsbFxuICAgICAgICAgIGlmIChjb2xsZWN0aW9uLmxlbmd0aCAtIG51bUJlZm9yZSA8IDIwKSB7XG4gICAgICAgICAgICBzZWxmLnBhZ2UgPSAnbG9hZGVkQWxsJ1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxmLnBhZ2UgKz0gMVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZWxmLnRyaWdnZXIoJ3N1Y2Nlc3NPbkZldGNoJywgY2IpXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBmdW5jdGlvbihjb2xsZWN0aW9uLCByZXNwb25zZSwgb3B0aW9ucykge1xuICAgICAgICAgIC8vIHlvdSBjYW4gcGFzcyBhZGRpdGlvbmFsIG9wdGlvbnMgdG8gdGhlIGV2ZW50IHlvdSB0cmlnZ2VyIGhlcmUgYXMgd2VsbFxuICAgICAgICAgIHNlbGYudHJpZ2dlcignZXJyb3JPbkZldGNoJylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi50cmlnZ2VyKCdzdWNjZXNzT25GZXRjaCcsIGNiKVxuICAgIH1cbiAgfVxufSlcblxuZXhwb3J0IGRlZmF1bHQgTWFwQ29sbGVjdGlvblxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9EYXRhTW9kZWwvTWFwQ29sbGVjdGlvbi5qcyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 610 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _omit2 = __webpack_require__(371);var _omit3 = _interopRequireDefault(_omit2);\nvar _backbone = __webpack_require__(1);var _backbone2 = _interopRequireDefault(_backbone);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}\ntry {_backbone2.default.$ = window.$;} catch (err) {}\n\nvar Message = _backbone2.default.Model.extend({\n  urlRoot: '/messages',\n  blacklist: ['created_at', 'updated_at'],\n  toJSON: function toJSON(options) {\n    return (0, _omit3.default)(this.attributes, this.blacklist);\n  } });exports.default =\n\n\nMessage;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjEwLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvRGF0YU1vZGVsL01lc3NhZ2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0IEJhY2tib25lIGZyb20gJ2JhY2tib25lJ1xudHJ5IHsgQmFja2JvbmUuJCA9IHdpbmRvdy4kIH0gY2F0Y2ggKGVycikge31cblxuY29uc3QgTWVzc2FnZSA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG4gIHVybFJvb3Q6ICcvbWVzc2FnZXMnLFxuICBibGFja2xpc3Q6IFsnY3JlYXRlZF9hdCcsICd1cGRhdGVkX2F0J10sXG4gIHRvSlNPTjogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBfLm9taXQodGhpcy5hdHRyaWJ1dGVzLCB0aGlzLmJsYWNrbGlzdClcbiAgfVxufSlcblxuZXhwb3J0IGRlZmF1bHQgTWVzc2FnZVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9EYXRhTW9kZWwvTWVzc2FnZS5qcyJdLCJtYXBwaW5ncyI6IjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 611 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _backbone = __webpack_require__(1);var _backbone2 = _interopRequireDefault(_backbone);\n\n\nvar _Message = __webpack_require__(610);var _Message2 = _interopRequireDefault(_Message);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}try {_backbone2.default.$ = window.$;} catch (err) {}\n\nvar MessageCollection = _backbone2.default.Collection.extend({\n  model: _Message2.default,\n  url: '/messages' });exports.default =\n\n\nMessageCollection;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjExLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvRGF0YU1vZGVsL01lc3NhZ2VDb2xsZWN0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYWNrYm9uZSBmcm9tICdiYWNrYm9uZSdcbnRyeSB7IEJhY2tib25lLiQgPSB3aW5kb3cuJCB9IGNhdGNoIChlcnIpIHt9XG5cbmltcG9ydCBNZXNzYWdlIGZyb20gJy4vTWVzc2FnZSdcblxuY29uc3QgTWVzc2FnZUNvbGxlY3Rpb24gPSBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7XG4gIG1vZGVsOiBNZXNzYWdlLFxuICB1cmw6ICcvbWVzc2FnZXMnXG59KVxuXG5leHBvcnQgZGVmYXVsdCBNZXNzYWdlQ29sbGVjdGlvblxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9EYXRhTW9kZWwvTWVzc2FnZUNvbGxlY3Rpb24uanMiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 612 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _omit2 = __webpack_require__(371);var _omit3 = _interopRequireDefault(_omit2);var _templateObject = _taggedTemplateLiteral(['\\n      <li data-id=\"', '\">\\n        <img src=\"', '\" data-id=\"', '\" alt=\"', '\" />\\n        <p>', '</p>\\n      </li>'], ['\\n      <li data-id=\"', '\">\\n        <img src=\"', '\" data-id=\"', '\" alt=\"', '\" />\\n        <p>', '</p>\\n      </li>']);\nvar _backbone = __webpack_require__(1);var _backbone2 = _interopRequireDefault(_backbone);\n\nvar _outdent = __webpack_require__(148);var _outdent2 = _interopRequireDefault(_outdent);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}function _taggedTemplateLiteral(strings, raw) {return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } }));}try {_backbone2.default.$ = window.$;} catch (err) {}\n\nvar Mapper = _backbone2.default.Model.extend({\n  urlRoot: '/users',\n  blacklist: ['created_at', 'updated_at'],\n  toJSON: function toJSON(options) {\n    return (0, _omit3.default)(this.attributes, this.blacklist);\n  },\n  prepareLiForFilter: function prepareLiForFilter() {\n    return (0, _outdent2.default)(_templateObject,\n    this.id,\n    this.get('image'), this.id, this.get('name'),\n    this.get('name'));\n\n  } });exports.default =\n\n\nMapper;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjEyLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvRGF0YU1vZGVsL01hcHBlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgQmFja2JvbmUgZnJvbSAnYmFja2JvbmUnXG50cnkgeyBCYWNrYm9uZS4kID0gd2luZG93LiQgfSBjYXRjaCAoZXJyKSB7fVxuaW1wb3J0IG91dGRlbnQgZnJvbSAnb3V0ZGVudCdcblxuY29uc3QgTWFwcGVyID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcbiAgdXJsUm9vdDogJy91c2VycycsXG4gIGJsYWNrbGlzdDogWydjcmVhdGVkX2F0JywgJ3VwZGF0ZWRfYXQnXSxcbiAgdG9KU09OOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIF8ub21pdCh0aGlzLmF0dHJpYnV0ZXMsIHRoaXMuYmxhY2tsaXN0KVxuICB9LFxuICBwcmVwYXJlTGlGb3JGaWx0ZXI6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBvdXRkZW50YFxuICAgICAgPGxpIGRhdGEtaWQ9XCIke3RoaXMuaWR9XCI+XG4gICAgICAgIDxpbWcgc3JjPVwiJHt0aGlzLmdldCgnaW1hZ2UnKX1cIiBkYXRhLWlkPVwiJHt0aGlzLmlkfVwiIGFsdD1cIiR7dGhpcy5nZXQoJ25hbWUnKX1cIiAvPlxuICAgICAgICA8cD4ke3RoaXMuZ2V0KCduYW1lJyl9PC9wPlxuICAgICAgPC9saT5gXG4gIH1cbn0pXG5cbmV4cG9ydCBkZWZhdWx0IE1hcHBlclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9EYXRhTW9kZWwvTWFwcGVyLmpzIl0sIm1hcHBpbmdzIjoiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 613 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _backbone = __webpack_require__(1);var _backbone2 = _interopRequireDefault(_backbone);\n\n\nvar _Mapper = __webpack_require__(612);var _Mapper2 = _interopRequireDefault(_Mapper);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}try {_backbone2.default.$ = window.$;} catch (err) {}\n\nvar MapperCollection = _backbone2.default.Collection.extend({\n  model: _Mapper2.default,\n  url: '/users' });exports.default =\n\n\nMapperCollection;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjEzLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvRGF0YU1vZGVsL01hcHBlckNvbGxlY3Rpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhY2tib25lIGZyb20gJ2JhY2tib25lJ1xudHJ5IHsgQmFja2JvbmUuJCA9IHdpbmRvdy4kIH0gY2F0Y2ggKGVycikge31cblxuaW1wb3J0IE1hcHBlciBmcm9tICcuL01hcHBlcidcblxuY29uc3QgTWFwcGVyQ29sbGVjdGlvbiA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcbiAgbW9kZWw6IE1hcHBlcixcbiAgdXJsOiAnL3VzZXJzJ1xufSlcblxuZXhwb3J0IGRlZmF1bHQgTWFwcGVyQ29sbGVjdGlvblxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9EYXRhTW9kZWwvTWFwcGVyQ29sbGVjdGlvbi5qcyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 614 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _templateObject = _taggedTemplateLiteral(['\\n      <li data-id=\"', '\">\\n        <img src=\"', '\" data-id=\"', '\" alt=\"', '\" />\\n        <p>', '</p>\\n      </li>'], ['\\n      <li data-id=\"', '\">\\n        <img src=\"', '\" data-id=\"', '\" alt=\"', '\" />\\n        <p>', '</p>\\n      </li>']);var _backbone = __webpack_require__(1);var _backbone2 = _interopRequireDefault(_backbone);\n\nvar _outdent = __webpack_require__(148);var _outdent2 = _interopRequireDefault(_outdent);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}function _taggedTemplateLiteral(strings, raw) {return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } }));}try {_backbone2.default.$ = window.$;} catch (err) {}\n\nvar Metacode = _backbone2.default.Model.extend({\n  initialize: function initialize() {\n    var image = new window.Image();\n    image.crossOrigin = 'Anonymous';\n    image.src = this.get('icon');\n    this.set('image', image);\n  },\n  prepareLiForFilter: function prepareLiForFilter() {\n    return (0, _outdent2.default)(_templateObject,\n    this.id,\n    this.get('icon'), this.id, this.get('name'),\n    this.get('name').toLowerCase());\n\n  } });exports.default =\n\n\nMetacode;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjE0LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvRGF0YU1vZGVsL01ldGFjb2RlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYWNrYm9uZSBmcm9tICdiYWNrYm9uZSdcbnRyeSB7IEJhY2tib25lLiQgPSB3aW5kb3cuJCB9IGNhdGNoIChlcnIpIHt9XG5pbXBvcnQgb3V0ZGVudCBmcm9tICdvdXRkZW50J1xuXG5jb25zdCBNZXRhY29kZSA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpbWFnZSA9IG5ldyB3aW5kb3cuSW1hZ2UoKVxuICAgIGltYWdlLmNyb3NzT3JpZ2luID0gJ0Fub255bW91cydcbiAgICBpbWFnZS5zcmMgPSB0aGlzLmdldCgnaWNvbicpXG4gICAgdGhpcy5zZXQoJ2ltYWdlJywgaW1hZ2UpXG4gIH0sXG4gIHByZXBhcmVMaUZvckZpbHRlcjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG91dGRlbnRgXG4gICAgICA8bGkgZGF0YS1pZD1cIiR7dGhpcy5pZH1cIj5cbiAgICAgICAgPGltZyBzcmM9XCIke3RoaXMuZ2V0KCdpY29uJyl9XCIgZGF0YS1pZD1cIiR7dGhpcy5pZH1cIiBhbHQ9XCIke3RoaXMuZ2V0KCduYW1lJyl9XCIgLz5cbiAgICAgICAgPHA+JHt0aGlzLmdldCgnbmFtZScpLnRvTG93ZXJDYXNlKCl9PC9wPlxuICAgICAgPC9saT5gXG4gIH1cbn0pXG5cbmV4cG9ydCBkZWZhdWx0IE1ldGFjb2RlXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL01ldGFtYXBzL0RhdGFNb2RlbC9NZXRhY29kZS5qcyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 615 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _backbone = __webpack_require__(1);var _backbone2 = _interopRequireDefault(_backbone);\n\n\nvar _Metacode = __webpack_require__(614);var _Metacode2 = _interopRequireDefault(_Metacode);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}try {_backbone2.default.$ = window.$;} catch (err) {}\n\nvar MetacodeCollection = _backbone2.default.Collection.extend({\n  model: _Metacode2.default,\n  url: '/metacodes',\n  comparator: function comparator(a, b) {\n    a = a.get('name').toLowerCase();\n    b = b.get('name').toLowerCase();\n    return a > b ? 1 : a < b ? -1 : 0;\n  } });exports.default =\n\n\nMetacodeCollection;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjE1LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvRGF0YU1vZGVsL01ldGFjb2RlQ29sbGVjdGlvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmFja2JvbmUgZnJvbSAnYmFja2JvbmUnXG50cnkgeyBCYWNrYm9uZS4kID0gd2luZG93LiQgfSBjYXRjaCAoZXJyKSB7fVxuXG5pbXBvcnQgTWV0YWNvZGUgZnJvbSAnLi9NZXRhY29kZSdcblxuY29uc3QgTWV0YWNvZGVDb2xsZWN0aW9uID0gQmFja2JvbmUuQ29sbGVjdGlvbi5leHRlbmQoe1xuICBtb2RlbDogTWV0YWNvZGUsXG4gIHVybDogJy9tZXRhY29kZXMnLFxuICBjb21wYXJhdG9yOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgYSA9IGEuZ2V0KCduYW1lJykudG9Mb3dlckNhc2UoKVxuICAgIGIgPSBiLmdldCgnbmFtZScpLnRvTG93ZXJDYXNlKClcbiAgICByZXR1cm4gYSA+IGIgPyAxIDogYSA8IGIgPyAtMSA6IDBcbiAgfVxufSlcblxuZXhwb3J0IGRlZmF1bHQgTWV0YWNvZGVDb2xsZWN0aW9uXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL01ldGFtYXBzL0RhdGFNb2RlbC9NZXRhY29kZUNvbGxlY3Rpb24uanMiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 616 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _omit2 = __webpack_require__(371);var _omit3 = _interopRequireDefault(_omit2);\nvar _backbone = __webpack_require__(1);var _backbone2 = _interopRequireDefault(_backbone);\n\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _Engine = __webpack_require__(150);var _Engine2 = _interopRequireDefault(_Engine);\nvar _Filter = __webpack_require__(356);var _Filter2 = _interopRequireDefault(_Filter);\nvar _TopicCard = __webpack_require__(566);var _TopicCard2 = _interopRequireDefault(_TopicCard);\nvar _Visualize = __webpack_require__(561);var _Visualize2 = _interopRequireDefault(_Visualize);\n\nvar _index = __webpack_require__(149);var _index2 = _interopRequireDefault(_index);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}try {_backbone2.default.$ = window.$;} catch (err) {}\n\nvar Topic = _backbone2.default.Model.extend({\n  urlRoot: '/topics',\n  blacklist: ['node', 'created_at', 'updated_at', 'user_name', 'user_image', 'map_count', 'synapse_count'],\n  toJSON: function toJSON(options) {\n    return (0, _omit3.default)(this.attributes, this.blacklist);\n  },\n  initialize: function initialize() {\n    if (this.isNew()) {\n      this.set({\n        'user_id': _Active2.default.Mapper.id,\n        'desc': this.get('desc') || '',\n        'link': this.get('link') || '',\n        'permission': _Active2.default.Map ? _Active2.default.Map.get('permission') : 'commons' });\n\n    }\n\n    this.on('changeByOther', this.updateCardView);\n    this.on('change', this.updateNodeView);\n    this.on('change:metacode_id', _Filter2.default.checkMetacodes, this);\n  },\n  authorizeToEdit: function authorizeToEdit(mapper) {\n    if (mapper && (\n    this.get('user_id') === mapper.get('id') ||\n    this.get('permission') === 'commons' ||\n    this.get('collaborator_ids').includes(mapper.get('id')))) {\n      return true;\n    } else {\n      return false;\n    }\n  },\n  authorizeToShow: function authorizeToShow(mapper) {\n    if (this.get('permission') !== 'private' || mapper && this.get('collaborator_ids').includes(mapper.get('id')) || this.get('user_id') === mapper.get('id')) return true;else\n    return false;\n  },\n  authorizePermissionChange: function authorizePermissionChange(mapper) {\n    if (mapper && this.get('user_id') === mapper.get('id')) return true;else\n    return false;\n  },\n  getDate: function getDate() {},\n  getMetacode: function getMetacode() {\n    return _index2.default.Metacodes.get(this.get('metacode_id'));\n  },\n  getMapping: function getMapping() {\n    if (!_Active2.default.Map) return false;\n\n    return _index2.default.Mappings.findWhere({\n      map_id: _Active2.default.Map.id,\n      mappable_type: 'Topic',\n      mappable_id: this.isNew() ? this.cid : this.id });\n\n  },\n  createNode: function createNode() {\n    var mapping;\n    var node = {\n      adjacencies: [],\n      id: this.isNew() ? this.cid : this.id,\n      name: this.get('name') };\n\n\n    if (_Active2.default.Map) {\n      mapping = this.getMapping();\n      node.data = {\n        $mapping: null,\n        $mappingID: mapping.id };\n\n    }\n\n    return node;\n  },\n  updateNode: function updateNode() {\n    var mapping;\n    var node = this.get('node');\n    node.setData('topic', this);\n\n    if (_Active2.default.Map) {\n      mapping = this.getMapping();\n      node.setData('mapping', mapping);\n    }\n\n    return node;\n  },\n  updateViews: function updateViews() {\n    var onPageWithTopicCard = _Active2.default.Map || _Active2.default.Topic;\n    var node = this.get('node');\n    // update topic card, if this topic is the one open there\n    if (onPageWithTopicCard && this === _TopicCard2.default.openTopicCard) {\n      _TopicCard2.default.showCard(node);\n    }\n\n    // update the node on the map\n    if (onPageWithTopicCard && node) {\n      node.name = this.get('name');\n      _Visualize2.default.mGraph.plot();\n    }\n  },\n  updateCardView: function updateCardView() {\n    var onPageWithTopicCard = _Active2.default.Map || _Active2.default.Topic;\n    var node = this.get('node');\n    // update topic card, if this topic is the one open there\n    if (onPageWithTopicCard && this === _TopicCard2.default.openTopicCard) {\n      _TopicCard2.default.showCard(node);\n    }\n  },\n  updateNodeView: function updateNodeView() {\n    var onPageWithTopicCard = _Active2.default.Map || _Active2.default.Topic;\n    var node = this.get('node');\n\n    // update the node on the map\n    if (onPageWithTopicCard && node) {\n      node.name = this.get('name');\n      _Visualize2.default.mGraph.plot();\n    }\n  } });exports.default =\n\n\nTopic;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjE2LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvRGF0YU1vZGVsL1RvcGljLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCdcbmltcG9ydCBCYWNrYm9uZSBmcm9tICdiYWNrYm9uZSdcbnRyeSB7IEJhY2tib25lLiQgPSB3aW5kb3cuJCB9IGNhdGNoIChlcnIpIHt9XG5cbmltcG9ydCBBY3RpdmUgZnJvbSAnLi4vQWN0aXZlJ1xuaW1wb3J0IEVuZ2luZSBmcm9tICcuLi9FbmdpbmUnXG5pbXBvcnQgRmlsdGVyIGZyb20gJy4uL0ZpbHRlcidcbmltcG9ydCBUb3BpY0NhcmQgZnJvbSAnLi4vVG9waWNDYXJkJ1xuaW1wb3J0IFZpc3VhbGl6ZSBmcm9tICcuLi9WaXN1YWxpemUnXG5cbmltcG9ydCBEYXRhTW9kZWwgZnJvbSAnLi9pbmRleCdcblxuY29uc3QgVG9waWMgPSBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoe1xuICB1cmxSb290OiAnL3RvcGljcycsXG4gIGJsYWNrbGlzdDogWydub2RlJywgJ2NyZWF0ZWRfYXQnLCAndXBkYXRlZF9hdCcsICd1c2VyX25hbWUnLCAndXNlcl9pbWFnZScsICdtYXBfY291bnQnLCAnc3luYXBzZV9jb3VudCddLFxuICB0b0pTT046IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gXy5vbWl0KHRoaXMuYXR0cmlidXRlcywgdGhpcy5ibGFja2xpc3QpXG4gIH0sXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLmlzTmV3KCkpIHtcbiAgICAgIHRoaXMuc2V0KHtcbiAgICAgICAgJ3VzZXJfaWQnOiBBY3RpdmUuTWFwcGVyLmlkLFxuICAgICAgICAnZGVzYyc6IHRoaXMuZ2V0KCdkZXNjJykgfHwgJycsXG4gICAgICAgICdsaW5rJzogdGhpcy5nZXQoJ2xpbmsnKSB8fCAnJyxcbiAgICAgICAgJ3Blcm1pc3Npb24nOiBBY3RpdmUuTWFwID8gQWN0aXZlLk1hcC5nZXQoJ3Blcm1pc3Npb24nKSA6ICdjb21tb25zJ1xuICAgICAgfSlcbiAgICB9XG5cbiAgICB0aGlzLm9uKCdjaGFuZ2VCeU90aGVyJywgdGhpcy51cGRhdGVDYXJkVmlldylcbiAgICB0aGlzLm9uKCdjaGFuZ2UnLCB0aGlzLnVwZGF0ZU5vZGVWaWV3KVxuICAgIHRoaXMub24oJ2NoYW5nZTptZXRhY29kZV9pZCcsIEZpbHRlci5jaGVja01ldGFjb2RlcywgdGhpcylcbiAgfSxcbiAgYXV0aG9yaXplVG9FZGl0OiBmdW5jdGlvbihtYXBwZXIpIHtcbiAgICBpZiAobWFwcGVyICYmXG4gICAgICAodGhpcy5nZXQoJ3VzZXJfaWQnKSA9PT0gbWFwcGVyLmdldCgnaWQnKSB8fFxuICAgICAgdGhpcy5nZXQoJ3Blcm1pc3Npb24nKSA9PT0gJ2NvbW1vbnMnIHx8XG4gICAgICB0aGlzLmdldCgnY29sbGFib3JhdG9yX2lkcycpLmluY2x1ZGVzKG1hcHBlci5nZXQoJ2lkJykpKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9LFxuICBhdXRob3JpemVUb1Nob3c6IGZ1bmN0aW9uKG1hcHBlcikge1xuICAgIGlmICh0aGlzLmdldCgncGVybWlzc2lvbicpICE9PSAncHJpdmF0ZScgfHwgKG1hcHBlciAmJiB0aGlzLmdldCgnY29sbGFib3JhdG9yX2lkcycpLmluY2x1ZGVzKG1hcHBlci5nZXQoJ2lkJykpIHx8IHRoaXMuZ2V0KCd1c2VyX2lkJykgPT09IG1hcHBlci5nZXQoJ2lkJykpKSByZXR1cm4gdHJ1ZVxuICAgIGVsc2UgcmV0dXJuIGZhbHNlXG4gIH0sXG4gIGF1dGhvcml6ZVBlcm1pc3Npb25DaGFuZ2U6IGZ1bmN0aW9uKG1hcHBlcikge1xuICAgIGlmIChtYXBwZXIgJiYgdGhpcy5nZXQoJ3VzZXJfaWQnKSA9PT0gbWFwcGVyLmdldCgnaWQnKSkgcmV0dXJuIHRydWVcbiAgICBlbHNlIHJldHVybiBmYWxzZVxuICB9LFxuICBnZXREYXRlOiBmdW5jdGlvbigpIHt9LFxuICBnZXRNZXRhY29kZTogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIERhdGFNb2RlbC5NZXRhY29kZXMuZ2V0KHRoaXMuZ2V0KCdtZXRhY29kZV9pZCcpKVxuICB9LFxuICBnZXRNYXBwaW5nOiBmdW5jdGlvbigpIHtcbiAgICBpZiAoIUFjdGl2ZS5NYXApIHJldHVybiBmYWxzZVxuXG4gICAgcmV0dXJuIERhdGFNb2RlbC5NYXBwaW5ncy5maW5kV2hlcmUoe1xuICAgICAgbWFwX2lkOiBBY3RpdmUuTWFwLmlkLFxuICAgICAgbWFwcGFibGVfdHlwZTogJ1RvcGljJyxcbiAgICAgIG1hcHBhYmxlX2lkOiB0aGlzLmlzTmV3KCkgPyB0aGlzLmNpZCA6IHRoaXMuaWRcbiAgICB9KVxuICB9LFxuICBjcmVhdGVOb2RlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbWFwcGluZ1xuICAgIHZhciBub2RlID0ge1xuICAgICAgYWRqYWNlbmNpZXM6IFtdLFxuICAgICAgaWQ6IHRoaXMuaXNOZXcoKSA/IHRoaXMuY2lkIDogdGhpcy5pZCxcbiAgICAgIG5hbWU6IHRoaXMuZ2V0KCduYW1lJylcbiAgICB9XG5cbiAgICBpZiAoQWN0aXZlLk1hcCkge1xuICAgICAgbWFwcGluZyA9IHRoaXMuZ2V0TWFwcGluZygpXG4gICAgICBub2RlLmRhdGEgPSB7XG4gICAgICAgICRtYXBwaW5nOiBudWxsLFxuICAgICAgICAkbWFwcGluZ0lEOiBtYXBwaW5nLmlkXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGVcbiAgfSxcbiAgdXBkYXRlTm9kZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIG1hcHBpbmdcbiAgICB2YXIgbm9kZSA9IHRoaXMuZ2V0KCdub2RlJylcbiAgICBub2RlLnNldERhdGEoJ3RvcGljJywgdGhpcylcblxuICAgIGlmIChBY3RpdmUuTWFwKSB7XG4gICAgICBtYXBwaW5nID0gdGhpcy5nZXRNYXBwaW5nKClcbiAgICAgIG5vZGUuc2V0RGF0YSgnbWFwcGluZycsIG1hcHBpbmcpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGVcbiAgfSxcbiAgdXBkYXRlVmlld3M6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvblBhZ2VXaXRoVG9waWNDYXJkID0gQWN0aXZlLk1hcCB8fCBBY3RpdmUuVG9waWNcbiAgICB2YXIgbm9kZSA9IHRoaXMuZ2V0KCdub2RlJylcbiAgICAvLyB1cGRhdGUgdG9waWMgY2FyZCwgaWYgdGhpcyB0b3BpYyBpcyB0aGUgb25lIG9wZW4gdGhlcmVcbiAgICBpZiAob25QYWdlV2l0aFRvcGljQ2FyZCAmJiB0aGlzID09PSBUb3BpY0NhcmQub3BlblRvcGljQ2FyZCkge1xuICAgICAgVG9waWNDYXJkLnNob3dDYXJkKG5vZGUpXG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIHRoZSBub2RlIG9uIHRoZSBtYXBcbiAgICBpZiAob25QYWdlV2l0aFRvcGljQ2FyZCAmJiBub2RlKSB7XG4gICAgICBub2RlLm5hbWUgPSB0aGlzLmdldCgnbmFtZScpXG4gICAgICBWaXN1YWxpemUubUdyYXBoLnBsb3QoKVxuICAgIH1cbiAgfSxcbiAgdXBkYXRlQ2FyZFZpZXc6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvblBhZ2VXaXRoVG9waWNDYXJkID0gQWN0aXZlLk1hcCB8fCBBY3RpdmUuVG9waWNcbiAgICB2YXIgbm9kZSA9IHRoaXMuZ2V0KCdub2RlJylcbiAgICAvLyB1cGRhdGUgdG9waWMgY2FyZCwgaWYgdGhpcyB0b3BpYyBpcyB0aGUgb25lIG9wZW4gdGhlcmVcbiAgICBpZiAob25QYWdlV2l0aFRvcGljQ2FyZCAmJiB0aGlzID09PSBUb3BpY0NhcmQub3BlblRvcGljQ2FyZCkge1xuICAgICAgVG9waWNDYXJkLnNob3dDYXJkKG5vZGUpXG4gICAgfVxuICB9LFxuICB1cGRhdGVOb2RlVmlldzogZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9uUGFnZVdpdGhUb3BpY0NhcmQgPSBBY3RpdmUuTWFwIHx8IEFjdGl2ZS5Ub3BpY1xuICAgIHZhciBub2RlID0gdGhpcy5nZXQoJ25vZGUnKVxuXG4gICAgLy8gdXBkYXRlIHRoZSBub2RlIG9uIHRoZSBtYXBcbiAgICBpZiAob25QYWdlV2l0aFRvcGljQ2FyZCAmJiBub2RlKSB7XG4gICAgICBub2RlLm5hbWUgPSB0aGlzLmdldCgnbmFtZScpXG4gICAgICBWaXN1YWxpemUubUdyYXBoLnBsb3QoKVxuICAgIH1cbiAgfVxufSlcblxuZXhwb3J0IGRlZmF1bHQgVG9waWNcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBmcm9udGVuZC9zcmMvTWV0YW1hcHMvRGF0YU1vZGVsL1RvcGljLmpzIl0sIm1hcHBpbmdzIjoiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 617 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _backbone = __webpack_require__(1);var _backbone2 = _interopRequireDefault(_backbone);\n\n\nvar _Topic = __webpack_require__(616);var _Topic2 = _interopRequireDefault(_Topic);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}try {_backbone2.default.$ = window.$;} catch (err) {}\n\nvar TopicCollection = _backbone2.default.Collection.extend({\n  model: _Topic2.default,\n  url: '/topics' });exports.default =\n\n\nTopicCollection;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjE3LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvRGF0YU1vZGVsL1RvcGljQ29sbGVjdGlvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmFja2JvbmUgZnJvbSAnYmFja2JvbmUnXG50cnkgeyBCYWNrYm9uZS4kID0gd2luZG93LiQgfSBjYXRjaCAoZXJyKSB7fVxuXG5pbXBvcnQgVG9waWMgZnJvbSAnLi9Ub3BpYydcblxuY29uc3QgVG9waWNDb2xsZWN0aW9uID0gQmFja2JvbmUuQ29sbGVjdGlvbi5leHRlbmQoe1xuICBtb2RlbDogVG9waWMsXG4gIHVybDogJy90b3BpY3MnXG59KVxuXG5leHBvcnQgZGVmYXVsdCBUb3BpY0NvbGxlY3Rpb25cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBmcm9udGVuZC9zcmMvTWV0YW1hcHMvRGF0YU1vZGVsL1RvcGljQ29sbGVjdGlvbi5qcyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 618 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _omit2 = __webpack_require__(371);var _omit3 = _interopRequireDefault(_omit2);var _templateObject = _taggedTemplateLiteral(['\\n      <li data-id=\"', '\">\\n        <img src=\"', '\" alt=\"synapse icon\" />\\n        <p>', '</p>\\n      </li>'], ['\\n      <li data-id=\"', '\">\\n        <img src=\"', '\" alt=\"synapse icon\" />\\n        <p>', '</p>\\n      </li>']);\nvar _outdent = __webpack_require__(148);var _outdent2 = _interopRequireDefault(_outdent);\nvar _backbone = __webpack_require__(1);var _backbone2 = _interopRequireDefault(_backbone);\n\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _Filter = __webpack_require__(356);var _Filter2 = _interopRequireDefault(_Filter);\nvar _SynapseCard = __webpack_require__(569);var _SynapseCard2 = _interopRequireDefault(_SynapseCard);\nvar _Visualize = __webpack_require__(561);var _Visualize2 = _interopRequireDefault(_Visualize);\n\nvar _index = __webpack_require__(149);var _index2 = _interopRequireDefault(_index);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}function _taggedTemplateLiteral(strings, raw) {return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } }));}try {_backbone2.default.$ = window.$;} catch (err) {}\n\nvar Synapse = _backbone2.default.Model.extend({\n  urlRoot: '/synapses',\n  blacklist: ['edge', 'created_at', 'updated_at'],\n  toJSON: function toJSON(options) {\n    return (0, _omit3.default)(this.attributes, this.blacklist);\n  },\n  initialize: function initialize() {\n    if (this.isNew()) {\n      this.set({\n        'user_id': _Active2.default.Mapper.id,\n        'permission': _Active2.default.Map ? _Active2.default.Map.get('permission') : 'commons',\n        'category': 'from-to' });\n\n    }\n    this.on('changeByOther', this.updateCardView);\n    this.on('change', this.updateEdgeView);\n    this.on('change:desc', _Filter2.default.checkSynapses, this);\n  },\n  prepareLiForFilter: function prepareLiForFilter() {\n    return (0, _outdent2.default)(_templateObject,\n    this.get('desc'),\n    _index2.default.synapseIconUrl,\n    this.get('desc'));\n\n  },\n  authorizeToEdit: function authorizeToEdit(mapper) {\n    if (mapper && (this.get('permission') === 'commons' || this.get('collaborator_ids').includes(mapper.get('id')) || this.get('user_id') === mapper.get('id'))) return true;else\n    return false;\n  },\n  authorizeToShow: function authorizeToShow(mapper) {\n    if (this.get('permission') !== 'private' || mapper && this.get('collaborator_ids').includes(mapper.get('id')) || this.get('user_id') === mapper.get('id')) return true;else\n    return false;\n  },\n  authorizePermissionChange: function authorizePermissionChange(mapper) {\n    if (mapper && this.get('user_id') === mapper.get('id')) return true;else\n    return false;\n  },\n  getTopic1: function getTopic1() {\n    return _index2.default.Topics.get(this.get('topic1_id'));\n  },\n  getTopic2: function getTopic2() {\n    return _index2.default.Topics.get(this.get('topic2_id'));\n  },\n  getDirection: function getDirection() {\n    var t1 = this.getTopic1();\n    var t2 = this.getTopic2();\n\n    return t1 && t2 ? [\n    t1.get('node').id,\n    t2.get('node').id] :\n    false;\n  },\n  getMapping: function getMapping() {\n    if (!_Active2.default.Map) return false;\n\n    return _index2.default.Mappings.findWhere({\n      map_id: _Active2.default.Map.id,\n      mappable_type: 'Synapse',\n      mappable_id: this.isNew() ? this.cid : this.id });\n\n  },\n  createEdge: function createEdge(providedMapping) {\n    var mapping, mappingID;\n    var synapseID = this.isNew() ? this.cid : this.id;\n\n    var edge = {\n      nodeFrom: this.get('topic1_id'),\n      nodeTo: this.get('topic2_id'),\n      data: {\n        $synapses: [],\n        $synapseIDs: [synapseID] } };\n\n\n\n    if (_Active2.default.Map && providedMapping) {\n      mapping = providedMapping;\n      mappingID = mapping.isNew() ? mapping.cid : mapping.id;\n      edge.data.$mappings = [];\n      edge.data.$mappingIDs = [mappingID];\n    }\n\n    return edge;\n  },\n  updateEdge: function updateEdge() {\n    var mapping;\n    var edge = this.get('edge');\n    edge.data.$synapses = edge.data.$synapses || [];\n    edge.getData('synapses').push(this);\n\n    if (_Active2.default.Map) {\n      mapping = this.getMapping();\n      edge.data.$mappings = edge.data.$mappings || [];\n      edge.getData('mappings').push(mapping);\n    }\n\n    return edge;\n  },\n  updateViews: function updateViews() {\n    this.updateCardView();\n    this.updateEdgeView();\n  },\n  updateCardView: function updateCardView() {\n    var onPageWithSynapseCard = _Active2.default.Map || _Active2.default.Topic;\n    var edge = this.get('edge');\n\n    // update synapse card, if this synapse is the one open there\n    if (onPageWithSynapseCard && edge === _SynapseCard2.default.openSynapseCard) {\n      _SynapseCard2.default.showCard(edge);\n    }\n  },\n  updateEdgeView: function updateEdgeView() {\n    var onPageWithSynapseCard = _Active2.default.Map || _Active2.default.Topic;\n    var edge = this.get('edge');\n\n    // update the edge on the map\n    if (onPageWithSynapseCard && edge) {\n      _Visualize2.default.mGraph.plot();\n    }\n  } });exports.default =\n\n\nSynapse;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjE4LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvRGF0YU1vZGVsL1N5bmFwc2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0IG91dGRlbnQgZnJvbSAnb3V0ZGVudCdcbmltcG9ydCBCYWNrYm9uZSBmcm9tICdiYWNrYm9uZSdcbnRyeSB7IEJhY2tib25lLiQgPSB3aW5kb3cuJCB9IGNhdGNoIChlcnIpIHt9XG5cbmltcG9ydCBBY3RpdmUgZnJvbSAnLi4vQWN0aXZlJ1xuaW1wb3J0IEZpbHRlciBmcm9tICcuLi9GaWx0ZXInXG5pbXBvcnQgU3luYXBzZUNhcmQgZnJvbSAnLi4vU3luYXBzZUNhcmQnXG5pbXBvcnQgVmlzdWFsaXplIGZyb20gJy4uL1Zpc3VhbGl6ZSdcblxuaW1wb3J0IERhdGFNb2RlbCBmcm9tICcuL2luZGV4J1xuXG5jb25zdCBTeW5hcHNlID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcbiAgdXJsUm9vdDogJy9zeW5hcHNlcycsXG4gIGJsYWNrbGlzdDogWydlZGdlJywgJ2NyZWF0ZWRfYXQnLCAndXBkYXRlZF9hdCddLFxuICB0b0pTT046IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gXy5vbWl0KHRoaXMuYXR0cmlidXRlcywgdGhpcy5ibGFja2xpc3QpXG4gIH0sXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLmlzTmV3KCkpIHtcbiAgICAgIHRoaXMuc2V0KHtcbiAgICAgICAgJ3VzZXJfaWQnOiBBY3RpdmUuTWFwcGVyLmlkLFxuICAgICAgICAncGVybWlzc2lvbic6IEFjdGl2ZS5NYXAgPyBBY3RpdmUuTWFwLmdldCgncGVybWlzc2lvbicpIDogJ2NvbW1vbnMnLFxuICAgICAgICAnY2F0ZWdvcnknOiAnZnJvbS10bydcbiAgICAgIH0pXG4gICAgfVxuICAgIHRoaXMub24oJ2NoYW5nZUJ5T3RoZXInLCB0aGlzLnVwZGF0ZUNhcmRWaWV3KVxuICAgIHRoaXMub24oJ2NoYW5nZScsIHRoaXMudXBkYXRlRWRnZVZpZXcpXG4gICAgdGhpcy5vbignY2hhbmdlOmRlc2MnLCBGaWx0ZXIuY2hlY2tTeW5hcHNlcywgdGhpcylcbiAgfSxcbiAgcHJlcGFyZUxpRm9yRmlsdGVyOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gb3V0ZGVudGBcbiAgICAgIDxsaSBkYXRhLWlkPVwiJHt0aGlzLmdldCgnZGVzYycpfVwiPlxuICAgICAgICA8aW1nIHNyYz1cIiR7RGF0YU1vZGVsLnN5bmFwc2VJY29uVXJsfVwiIGFsdD1cInN5bmFwc2UgaWNvblwiIC8+XG4gICAgICAgIDxwPiR7dGhpcy5nZXQoJ2Rlc2MnKX08L3A+XG4gICAgICA8L2xpPmBcbiAgfSxcbiAgYXV0aG9yaXplVG9FZGl0OiBmdW5jdGlvbihtYXBwZXIpIHtcbiAgICBpZiAobWFwcGVyICYmICh0aGlzLmdldCgncGVybWlzc2lvbicpID09PSAnY29tbW9ucycgfHwgdGhpcy5nZXQoJ2NvbGxhYm9yYXRvcl9pZHMnKS5pbmNsdWRlcyhtYXBwZXIuZ2V0KCdpZCcpKSB8fCB0aGlzLmdldCgndXNlcl9pZCcpID09PSBtYXBwZXIuZ2V0KCdpZCcpKSkgcmV0dXJuIHRydWVcbiAgICBlbHNlIHJldHVybiBmYWxzZVxuICB9LFxuICBhdXRob3JpemVUb1Nob3c6IGZ1bmN0aW9uKG1hcHBlcikge1xuICAgIGlmICh0aGlzLmdldCgncGVybWlzc2lvbicpICE9PSAncHJpdmF0ZScgfHwgKG1hcHBlciAmJiB0aGlzLmdldCgnY29sbGFib3JhdG9yX2lkcycpLmluY2x1ZGVzKG1hcHBlci5nZXQoJ2lkJykpIHx8IHRoaXMuZ2V0KCd1c2VyX2lkJykgPT09IG1hcHBlci5nZXQoJ2lkJykpKSByZXR1cm4gdHJ1ZVxuICAgIGVsc2UgcmV0dXJuIGZhbHNlXG4gIH0sXG4gIGF1dGhvcml6ZVBlcm1pc3Npb25DaGFuZ2U6IGZ1bmN0aW9uKG1hcHBlcikge1xuICAgIGlmIChtYXBwZXIgJiYgdGhpcy5nZXQoJ3VzZXJfaWQnKSA9PT0gbWFwcGVyLmdldCgnaWQnKSkgcmV0dXJuIHRydWVcbiAgICBlbHNlIHJldHVybiBmYWxzZVxuICB9LFxuICBnZXRUb3BpYzE6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBEYXRhTW9kZWwuVG9waWNzLmdldCh0aGlzLmdldCgndG9waWMxX2lkJykpXG4gIH0sXG4gIGdldFRvcGljMjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIERhdGFNb2RlbC5Ub3BpY3MuZ2V0KHRoaXMuZ2V0KCd0b3BpYzJfaWQnKSlcbiAgfSxcbiAgZ2V0RGlyZWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdDEgPSB0aGlzLmdldFRvcGljMSgpXG4gICAgdmFyIHQyID0gdGhpcy5nZXRUb3BpYzIoKVxuXG4gICAgcmV0dXJuIHQxICYmIHQyID8gW1xuICAgICAgdDEuZ2V0KCdub2RlJykuaWQsXG4gICAgICB0Mi5nZXQoJ25vZGUnKS5pZFxuICAgIF0gOiBmYWxzZVxuICB9LFxuICBnZXRNYXBwaW5nOiBmdW5jdGlvbigpIHtcbiAgICBpZiAoIUFjdGl2ZS5NYXApIHJldHVybiBmYWxzZVxuXG4gICAgcmV0dXJuIERhdGFNb2RlbC5NYXBwaW5ncy5maW5kV2hlcmUoe1xuICAgICAgbWFwX2lkOiBBY3RpdmUuTWFwLmlkLFxuICAgICAgbWFwcGFibGVfdHlwZTogJ1N5bmFwc2UnLFxuICAgICAgbWFwcGFibGVfaWQ6IHRoaXMuaXNOZXcoKSA/IHRoaXMuY2lkIDogdGhpcy5pZFxuICAgIH0pXG4gIH0sXG4gIGNyZWF0ZUVkZ2U6IGZ1bmN0aW9uKHByb3ZpZGVkTWFwcGluZykge1xuICAgIHZhciBtYXBwaW5nLCBtYXBwaW5nSURcbiAgICB2YXIgc3luYXBzZUlEID0gdGhpcy5pc05ldygpID8gdGhpcy5jaWQgOiB0aGlzLmlkXG5cbiAgICB2YXIgZWRnZSA9IHtcbiAgICAgIG5vZGVGcm9tOiB0aGlzLmdldCgndG9waWMxX2lkJyksXG4gICAgICBub2RlVG86IHRoaXMuZ2V0KCd0b3BpYzJfaWQnKSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgJHN5bmFwc2VzOiBbXSxcbiAgICAgICAgJHN5bmFwc2VJRHM6IFtzeW5hcHNlSURdXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKEFjdGl2ZS5NYXAgJiYgcHJvdmlkZWRNYXBwaW5nKSB7XG4gICAgICBtYXBwaW5nID0gcHJvdmlkZWRNYXBwaW5nXG4gICAgICBtYXBwaW5nSUQgPSBtYXBwaW5nLmlzTmV3KCkgPyBtYXBwaW5nLmNpZCA6IG1hcHBpbmcuaWRcbiAgICAgIGVkZ2UuZGF0YS4kbWFwcGluZ3MgPSBbXVxuICAgICAgZWRnZS5kYXRhLiRtYXBwaW5nSURzID0gW21hcHBpbmdJRF1cbiAgICB9XG5cbiAgICByZXR1cm4gZWRnZVxuICB9LFxuICB1cGRhdGVFZGdlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbWFwcGluZ1xuICAgIHZhciBlZGdlID0gdGhpcy5nZXQoJ2VkZ2UnKVxuICAgIGVkZ2UuZGF0YS4kc3luYXBzZXMgPSBlZGdlLmRhdGEuJHN5bmFwc2VzIHx8IFtdXG4gICAgZWRnZS5nZXREYXRhKCdzeW5hcHNlcycpLnB1c2godGhpcylcblxuICAgIGlmIChBY3RpdmUuTWFwKSB7XG4gICAgICBtYXBwaW5nID0gdGhpcy5nZXRNYXBwaW5nKClcbiAgICAgIGVkZ2UuZGF0YS4kbWFwcGluZ3MgPSBlZGdlLmRhdGEuJG1hcHBpbmdzIHx8IFtdXG4gICAgICBlZGdlLmdldERhdGEoJ21hcHBpbmdzJykucHVzaChtYXBwaW5nKVxuICAgIH1cblxuICAgIHJldHVybiBlZGdlXG4gIH0sXG4gIHVwZGF0ZVZpZXdzOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnVwZGF0ZUNhcmRWaWV3KClcbiAgICB0aGlzLnVwZGF0ZUVkZ2VWaWV3KClcbiAgfSxcbiAgdXBkYXRlQ2FyZFZpZXc6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvblBhZ2VXaXRoU3luYXBzZUNhcmQgPSBBY3RpdmUuTWFwIHx8IEFjdGl2ZS5Ub3BpY1xuICAgIHZhciBlZGdlID0gdGhpcy5nZXQoJ2VkZ2UnKVxuXG4gICAgLy8gdXBkYXRlIHN5bmFwc2UgY2FyZCwgaWYgdGhpcyBzeW5hcHNlIGlzIHRoZSBvbmUgb3BlbiB0aGVyZVxuICAgIGlmIChvblBhZ2VXaXRoU3luYXBzZUNhcmQgJiYgZWRnZSA9PT0gU3luYXBzZUNhcmQub3BlblN5bmFwc2VDYXJkKSB7XG4gICAgICBTeW5hcHNlQ2FyZC5zaG93Q2FyZChlZGdlKVxuICAgIH1cbiAgfSxcbiAgdXBkYXRlRWRnZVZpZXc6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvblBhZ2VXaXRoU3luYXBzZUNhcmQgPSBBY3RpdmUuTWFwIHx8IEFjdGl2ZS5Ub3BpY1xuICAgIHZhciBlZGdlID0gdGhpcy5nZXQoJ2VkZ2UnKVxuXG4gICAgLy8gdXBkYXRlIHRoZSBlZGdlIG9uIHRoZSBtYXBcbiAgICBpZiAob25QYWdlV2l0aFN5bmFwc2VDYXJkICYmIGVkZ2UpIHtcbiAgICAgIFZpc3VhbGl6ZS5tR3JhcGgucGxvdCgpXG4gICAgfVxuICB9XG59KVxuXG5leHBvcnQgZGVmYXVsdCBTeW5hcHNlXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL01ldGFtYXBzL0RhdGFNb2RlbC9TeW5hcHNlLmpzIl0sIm1hcHBpbmdzIjoiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 619 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _backbone = __webpack_require__(1);var _backbone2 = _interopRequireDefault(_backbone);\n\n\nvar _Synapse = __webpack_require__(618);var _Synapse2 = _interopRequireDefault(_Synapse);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}try {_backbone2.default.$ = window.$;} catch (err) {}\n\nvar SynapseCollection = _backbone2.default.Collection.extend({\n  model: _Synapse2.default,\n  url: '/synapses' });exports.default =\n\n\nSynapseCollection;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjE5LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvRGF0YU1vZGVsL1N5bmFwc2VDb2xsZWN0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYWNrYm9uZSBmcm9tICdiYWNrYm9uZSdcbnRyeSB7IEJhY2tib25lLiQgPSB3aW5kb3cuJCB9IGNhdGNoIChlcnIpIHt9XG5cbmltcG9ydCBTeW5hcHNlIGZyb20gJy4vU3luYXBzZSdcblxuY29uc3QgU3luYXBzZUNvbGxlY3Rpb24gPSBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7XG4gIG1vZGVsOiBTeW5hcHNlLFxuICB1cmw6ICcvc3luYXBzZXMnXG59KVxuXG5leHBvcnQgZGVmYXVsdCBTeW5hcHNlQ29sbGVjdGlvblxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9EYXRhTW9kZWwvU3luYXBzZUNvbGxlY3Rpb24uanMiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 620 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _omit2 = __webpack_require__(371);var _omit3 = _interopRequireDefault(_omit2);\nvar _backbone = __webpack_require__(1);var _backbone2 = _interopRequireDefault(_backbone);\n\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _Map = __webpack_require__(369);var _Map2 = _interopRequireDefault(_Map);\nvar _Synapse = __webpack_require__(354);var _Synapse2 = _interopRequireDefault(_Synapse);\nvar _Topic = __webpack_require__(571);var _Topic2 = _interopRequireDefault(_Topic);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}try {_backbone2.default.$ = window.$;} catch (err) {}\n\nvar Mapping = _backbone2.default.Model.extend({\n  urlRoot: '/mappings',\n  blacklist: ['created_at', 'updated_at'],\n  toJSON: function toJSON(options) {\n    return (0, _omit3.default)(this.attributes, this.blacklist);\n  },\n  initialize: function initialize() {\n    if (this.isNew()) {\n      this.set({\n        'user_id': _Active2.default.Mapper.id,\n        'map_id': _Active2.default.Map ? _Active2.default.Map.id : null });\n\n    }\n  },\n  getMap: function getMap(callback) {\n    _Map2.default.get(this.get('map_id'), callback);\n  },\n  getMappable: function getMappable(callback) {\n    if (this.get('mappable_type') === 'Topic') {\n      _Topic2.default.get(this.get('mappable_id'), callback);\n    } else\n    if (this.get('mappable_type') === 'Synapse') {\n      _Synapse2.default.get(this.get('mappable_id'), callback);\n    }\n  } });exports.default =\n\n\nMapping;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjIwLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvRGF0YU1vZGVsL01hcHBpbmcuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0IEJhY2tib25lIGZyb20gJ2JhY2tib25lJ1xudHJ5IHsgQmFja2JvbmUuJCA9IHdpbmRvdy4kIH0gY2F0Y2ggKGVycikge31cblxuaW1wb3J0IEFjdGl2ZSBmcm9tICcuLi9BY3RpdmUnXG5pbXBvcnQgTWFwIGZyb20gJy4uL01hcCdcbmltcG9ydCBTeW5hcHNlIGZyb20gJy4uL1N5bmFwc2UnXG5pbXBvcnQgVG9waWMgZnJvbSAnLi4vVG9waWMnXG5cbmNvbnN0IE1hcHBpbmcgPSBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoe1xuICB1cmxSb290OiAnL21hcHBpbmdzJyxcbiAgYmxhY2tsaXN0OiBbJ2NyZWF0ZWRfYXQnLCAndXBkYXRlZF9hdCddLFxuICB0b0pTT046IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gXy5vbWl0KHRoaXMuYXR0cmlidXRlcywgdGhpcy5ibGFja2xpc3QpXG4gIH0sXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLmlzTmV3KCkpIHtcbiAgICAgIHRoaXMuc2V0KHtcbiAgICAgICAgJ3VzZXJfaWQnOiBBY3RpdmUuTWFwcGVyLmlkLFxuICAgICAgICAnbWFwX2lkJzogQWN0aXZlLk1hcCA/IEFjdGl2ZS5NYXAuaWQgOiBudWxsXG4gICAgICB9KVxuICAgIH1cbiAgfSxcbiAgZ2V0TWFwOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgIE1hcC5nZXQodGhpcy5nZXQoJ21hcF9pZCcpLCBjYWxsYmFjaylcbiAgfSxcbiAgZ2V0TWFwcGFibGU6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuZ2V0KCdtYXBwYWJsZV90eXBlJykgPT09ICdUb3BpYycpIHtcbiAgICAgIFRvcGljLmdldCh0aGlzLmdldCgnbWFwcGFibGVfaWQnKSwgY2FsbGJhY2spXG4gICAgfVxuICAgIGVsc2UgaWYgKHRoaXMuZ2V0KCdtYXBwYWJsZV90eXBlJykgPT09ICdTeW5hcHNlJykge1xuICAgICAgU3luYXBzZS5nZXQodGhpcy5nZXQoJ21hcHBhYmxlX2lkJyksIGNhbGxiYWNrKVxuICAgIH1cbiAgfVxufSlcblxuZXhwb3J0IGRlZmF1bHQgTWFwcGluZ1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9EYXRhTW9kZWwvTWFwcGluZy5qcyJdLCJtYXBwaW5ncyI6IjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 621 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _backbone = __webpack_require__(1);var _backbone2 = _interopRequireDefault(_backbone);\n\n\nvar _Mapping = __webpack_require__(620);var _Mapping2 = _interopRequireDefault(_Mapping);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}try {_backbone2.default.$ = window.$;} catch (err) {}\n\nvar MappingCollection = _backbone2.default.Collection.extend({\n  model: _Mapping2.default,\n  url: '/mappings' });exports.default =\n\n\nMappingCollection;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjIxLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvRGF0YU1vZGVsL01hcHBpbmdDb2xsZWN0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYWNrYm9uZSBmcm9tICdiYWNrYm9uZSdcbnRyeSB7IEJhY2tib25lLiQgPSB3aW5kb3cuJCB9IGNhdGNoIChlcnIpIHt9XG5cbmltcG9ydCBNYXBwaW5nIGZyb20gJy4vTWFwcGluZydcblxuY29uc3QgTWFwcGluZ0NvbGxlY3Rpb24gPSBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7XG4gIG1vZGVsOiBNYXBwaW5nLFxuICB1cmw6ICcvbWFwcGluZ3MnXG59KVxuXG5leHBvcnQgZGVmYXVsdCBNYXBwaW5nQ29sbGVjdGlvblxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9EYXRhTW9kZWwvTWFwcGluZ0NvbGxlY3Rpb24uanMiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 622 */
/***/ function(module, exports) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var Debug = function Debug() {var arg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.Metamaps;\n  if (arg === undefined && typeof window !== 'undefined') arg = window.Metamaps;\n  console.debug(arg);\n  console.debug('Metamaps Version: ' + arg.ServerData.VERSION);\n  console.debug('Build: ' + arg.ServerData.BUILD);\n  console.debug('Last Updated: ' + arg.ServerData.LAST_UPDATED);\n};exports.default =\n\nDebug;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjIyLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvRGVidWcuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgRGVidWcgPSBmdW5jdGlvbihhcmcgPSB3aW5kb3cuTWV0YW1hcHMpIHtcbiAgaWYgKGFyZyA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSBhcmcgPSB3aW5kb3cuTWV0YW1hcHNcbiAgY29uc29sZS5kZWJ1ZyhhcmcpXG4gIGNvbnNvbGUuZGVidWcoYE1ldGFtYXBzIFZlcnNpb246ICR7YXJnLlNlcnZlckRhdGEuVkVSU0lPTn1gKVxuICBjb25zb2xlLmRlYnVnKGBCdWlsZDogJHthcmcuU2VydmVyRGF0YS5CVUlMRH1gKVxuICBjb25zb2xlLmRlYnVnKGBMYXN0IFVwZGF0ZWQ6ICR7YXJnLlNlcnZlckRhdGEuTEFTVF9VUERBVEVEfWApXG59XG5cbmV4cG9ydCBkZWZhdWx0IERlYnVnXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL01ldGFtYXBzL0RlYnVnLmpzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 623 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _Control = __webpack_require__(27);var _Control2 = _interopRequireDefault(_Control);\nvar _Create = __webpack_require__(173);var _Create2 = _interopRequireDefault(_Create);\nvar _DataModel = __webpack_require__(149);var _DataModel2 = _interopRequireDefault(_DataModel);\nvar _JIT = __webpack_require__(355);var _JIT2 = _interopRequireDefault(_JIT);\nvar _Mobile = __webpack_require__(624);var _Mobile2 = _interopRequireDefault(_Mobile);\nvar _Realtime = __webpack_require__(435);var _Realtime2 = _interopRequireDefault(_Realtime);\nvar _Selected = __webpack_require__(353);var _Selected2 = _interopRequireDefault(_Selected);\nvar _Topic = __webpack_require__(571);var _Topic2 = _interopRequireDefault(_Topic);\nvar _Util = __webpack_require__(410);var _Util2 = _interopRequireDefault(_Util);\nvar _Visualize = __webpack_require__(561);var _Visualize2 = _interopRequireDefault(_Visualize);\nvar _GlobalUI = __webpack_require__(362);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} /* global $ */\n\nvar Listeners = {\n  init: function init() {\n    var self = this;\n    $(document).on('keydown', function (e) {\n      if (!(_Active2.default.Map || _Active2.default.Topic)) return;\n\n      var onCanvas = e.target.tagName === 'BODY';\n\n      switch (e.which) {\n        case 13: // if enter key is pressed\n          // prevent topic creation if sending a message\n          if (e.target.className !== 'chat-input') {\n            _JIT2.default.enterKeyHandler(e);\n          }\n          break;\n        case 27: // if esc key is pressed\n          _JIT2.default.escKeyHandler();\n          break;\n        case 46: // if DEL is pressed\n          e.preventDefault();\n          _Control2.default.deleteSelected();\n          break;\n        case 65: // if a or A is pressed\n          if ((e.ctrlKey || e.metaKey) && onCanvas) {\n            var nodesCount = Object.keys(_Visualize2.default.mGraph.graph.nodes).length;\n            var selectedNodesCount = _Selected2.default.Nodes.length;\n            e.preventDefault();\n\n            // Hit Ctrl+A once to select all nodes\n            _Control2.default.deselectAllNodes();\n            _Visualize2.default.mGraph.graph.eachNode(function (node) {\n              _Control2.default.selectNode(node, e);\n            });\n\n            // Hitting Ctrl+A a second time will select all edges too\n            _Control2.default.deselectAllEdges();\n            if (nodesCount === selectedNodesCount) {\n              _DataModel2.default.Synapses.models.forEach(function (synapse) {\n                var topic1id = synapse.get('topic1_id');\n                var topic2id = synapse.get('topic2_id');\n                var edge = _Visualize2.default.mGraph.graph.edges[topic1id][topic2id];\n                _Control2.default.selectEdge(edge, e);\n              });\n            }\n\n            _Visualize2.default.mGraph.plot();\n          }\n\n          break;\n        case 68: // if d or D is pressed\n          if (e.ctrlKey || e.metaKey) {\n            e.preventDefault();\n            _Control2.default.deleteSelected();\n          }\n          break;\n        case 69: // if e or E is pressed\n          if ((e.ctrlKey || e.metaKey) && _Active2.default.Map) {\n            e.preventDefault();\n            _JIT2.default.zoomExtents(null, _Visualize2.default.mGraph.canvas);\n            break;\n          }\n          if (e.altKey && _Active2.default.Topic) {\n            e.preventDefault();\n\n            if (_Active2.default.Topic) {\n              self.centerAndReveal(_Selected2.default.Nodes, {\n                center: true,\n                reveal: false });\n\n            }\n            break;\n          }\n          break;\n        case 72: // if h or H is pressed\n          if (e.ctrlKey || e.metaKey) {\n            e.preventDefault();\n            _Control2.default.hideSelectedNodes();\n            _Control2.default.hideSelectedEdges();\n          }\n          break;\n        case 77: // if m or M is pressed\n          if (e.ctrlKey || e.metaKey) {\n            e.preventDefault();\n            _Control2.default.removeSelectedNodes();\n            _Control2.default.removeSelectedEdges();\n          }\n          break;\n        case 82: // if r or R is pressed\n          if (e.altKey && _Active2.default.Topic) {\n            e.preventDefault();\n            self.centerAndReveal(_Selected2.default.Nodes, {\n              center: false,\n              reveal: true });\n\n          }\n          break;\n        case 84: // if t or T is pressed\n          if (e.altKey && _Active2.default.Topic) {\n            e.preventDefault();\n            self.centerAndReveal(_Selected2.default.Nodes, {\n              center: true,\n              reveal: true });\n\n          }\n          break;\n        case 191: // if / is pressed\n          if (e.ctrlKey || e.metaKey) {\n            _GlobalUI.Search.focus();\n          }\n          break;\n        default:\n          // console.log(e.which)\n          break;}\n\n    });\n    $(window).resize(function () {\n      if (_Visualize2.default && _Visualize2.default.mGraph) {\n        _Util2.default.resizeCanvas(_Visualize2.default.mGraph.canvas);\n        _Create2.default.newSynapse.updateForm();\n        _Create2.default.newTopic.position();\n      }\n\n      if (_Active2.default.Map && _Realtime2.default.inConversation) _Realtime2.default.positionVideos();\n      _Mobile2.default.resizeTitle();\n    });\n  },\n  centerAndReveal: function centerAndReveal(nodes, opts) {\n    if (nodes.length < 1) return;\n    var node = nodes[nodes.length - 1];\n    if (opts.center && opts.reveal) {\n      _Topic2.default.centerOn(node.id, function () {\n        _Topic2.default.fetchRelatives(nodes);\n      });\n    } else if (opts.center) {\n      _Topic2.default.centerOn(node.id);\n    } else if (opts.reveal) {\n      _Topic2.default.fetchRelatives(nodes);\n    }\n  } };exports.default =\n\n\nListeners;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjIzLmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvTGlzdGVuZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGdsb2JhbCAkICovXG5cbmltcG9ydCBBY3RpdmUgZnJvbSAnLi9BY3RpdmUnXG5pbXBvcnQgQ29udHJvbCBmcm9tICcuL0NvbnRyb2wnXG5pbXBvcnQgQ3JlYXRlIGZyb20gJy4vQ3JlYXRlJ1xuaW1wb3J0IERhdGFNb2RlbCBmcm9tICcuL0RhdGFNb2RlbCdcbmltcG9ydCBKSVQgZnJvbSAnLi9KSVQnXG5pbXBvcnQgTW9iaWxlIGZyb20gJy4vTW9iaWxlJ1xuaW1wb3J0IFJlYWx0aW1lIGZyb20gJy4vUmVhbHRpbWUnXG5pbXBvcnQgU2VsZWN0ZWQgZnJvbSAnLi9TZWxlY3RlZCdcbmltcG9ydCBUb3BpYyBmcm9tICcuL1RvcGljJ1xuaW1wb3J0IFV0aWwgZnJvbSAnLi9VdGlsJ1xuaW1wb3J0IFZpc3VhbGl6ZSBmcm9tICcuL1Zpc3VhbGl6ZSdcbmltcG9ydCB7IFNlYXJjaCB9IGZyb20gJy4vR2xvYmFsVUknXG5cbmNvbnN0IExpc3RlbmVycyA9IHtcbiAgaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzXG4gICAgJChkb2N1bWVudCkub24oJ2tleWRvd24nLCBmdW5jdGlvbihlKSB7XG4gICAgICBpZiAoIShBY3RpdmUuTWFwIHx8IEFjdGl2ZS5Ub3BpYykpIHJldHVyblxuXG4gICAgICBjb25zdCBvbkNhbnZhcyA9IGUudGFyZ2V0LnRhZ05hbWUgPT09ICdCT0RZJ1xuICAgICAgXG4gICAgICBzd2l0Y2ggKGUud2hpY2gpIHtcbiAgICAgICAgY2FzZSAxMzogLy8gaWYgZW50ZXIga2V5IGlzIHByZXNzZWRcbiAgICAgICAgICAvLyBwcmV2ZW50IHRvcGljIGNyZWF0aW9uIGlmIHNlbmRpbmcgYSBtZXNzYWdlXG4gICAgICAgICAgaWYgKGUudGFyZ2V0LmNsYXNzTmFtZSAhPT0gJ2NoYXQtaW5wdXQnKSB7XG4gICAgICAgICAgICBKSVQuZW50ZXJLZXlIYW5kbGVyKGUpXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjc6IC8vIGlmIGVzYyBrZXkgaXMgcHJlc3NlZFxuICAgICAgICAgIEpJVC5lc2NLZXlIYW5kbGVyKClcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ2OiAvLyBpZiBERUwgaXMgcHJlc3NlZFxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgIENvbnRyb2wuZGVsZXRlU2VsZWN0ZWQoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNjU6IC8vIGlmIGEgb3IgQSBpcyBwcmVzc2VkXG4gICAgICAgICAgaWYgKChlLmN0cmxLZXkgfHwgZS5tZXRhS2V5KSAmJiBvbkNhbnZhcykge1xuICAgICAgICAgICAgY29uc3Qgbm9kZXNDb3VudCA9IE9iamVjdC5rZXlzKFZpc3VhbGl6ZS5tR3JhcGguZ3JhcGgubm9kZXMpLmxlbmd0aFxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWROb2Rlc0NvdW50ID0gU2VsZWN0ZWQuTm9kZXMubGVuZ3RoXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcblxuICAgICAgICAgICAgLy8gSGl0IEN0cmwrQSBvbmNlIHRvIHNlbGVjdCBhbGwgbm9kZXNcbiAgICAgICAgICAgIENvbnRyb2wuZGVzZWxlY3RBbGxOb2RlcygpXG4gICAgICAgICAgICBWaXN1YWxpemUubUdyYXBoLmdyYXBoLmVhY2hOb2RlKG5vZGUgPT4ge1xuICAgICAgICAgICAgICBDb250cm9sLnNlbGVjdE5vZGUobm9kZSwgZSlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIC8vIEhpdHRpbmcgQ3RybCtBIGEgc2Vjb25kIHRpbWUgd2lsbCBzZWxlY3QgYWxsIGVkZ2VzIHRvb1xuICAgICAgICAgICAgQ29udHJvbC5kZXNlbGVjdEFsbEVkZ2VzKClcbiAgICAgICAgICAgIGlmIChub2Rlc0NvdW50ID09PSBzZWxlY3RlZE5vZGVzQ291bnQpIHtcbiAgICAgICAgICAgICAgRGF0YU1vZGVsLlN5bmFwc2VzLm1vZGVscy5mb3JFYWNoKHN5bmFwc2UgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvcGljMWlkID0gc3luYXBzZS5nZXQoJ3RvcGljMV9pZCcpXG4gICAgICAgICAgICAgICAgY29uc3QgdG9waWMyaWQgPSBzeW5hcHNlLmdldCgndG9waWMyX2lkJylcbiAgICAgICAgICAgICAgICBjb25zdCBlZGdlID0gVmlzdWFsaXplLm1HcmFwaC5ncmFwaC5lZGdlc1t0b3BpYzFpZF1bdG9waWMyaWRdXG4gICAgICAgICAgICAgICAgQ29udHJvbC5zZWxlY3RFZGdlKGVkZ2UsIGUpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFZpc3VhbGl6ZS5tR3JhcGgucGxvdCgpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA2ODogLy8gaWYgZCBvciBEIGlzIHByZXNzZWRcbiAgICAgICAgICBpZiAoZS5jdHJsS2V5IHx8IGUubWV0YUtleSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICBDb250cm9sLmRlbGV0ZVNlbGVjdGVkKClcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA2OTogLy8gaWYgZSBvciBFIGlzIHByZXNzZWRcbiAgICAgICAgICBpZiAoKGUuY3RybEtleSB8fCBlLm1ldGFLZXkpICYmIEFjdGl2ZS5NYXApIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgSklULnpvb21FeHRlbnRzKG51bGwsIFZpc3VhbGl6ZS5tR3JhcGguY2FudmFzKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGUuYWx0S2V5ICYmIEFjdGl2ZS5Ub3BpYykge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAgICAgICAgIGlmIChBY3RpdmUuVG9waWMpIHtcbiAgICAgICAgICAgICAgc2VsZi5jZW50ZXJBbmRSZXZlYWwoU2VsZWN0ZWQuTm9kZXMsIHtcbiAgICAgICAgICAgICAgICBjZW50ZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgcmV2ZWFsOiBmYWxzZVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA3MjogLy8gaWYgaCBvciBIIGlzIHByZXNzZWRcbiAgICAgICAgICBpZiAoZS5jdHJsS2V5IHx8IGUubWV0YUtleSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICBDb250cm9sLmhpZGVTZWxlY3RlZE5vZGVzKClcbiAgICAgICAgICAgIENvbnRyb2wuaGlkZVNlbGVjdGVkRWRnZXMoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDc3OiAvLyBpZiBtIG9yIE0gaXMgcHJlc3NlZFxuICAgICAgICAgIGlmIChlLmN0cmxLZXkgfHwgZS5tZXRhS2V5KSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgIENvbnRyb2wucmVtb3ZlU2VsZWN0ZWROb2RlcygpXG4gICAgICAgICAgICBDb250cm9sLnJlbW92ZVNlbGVjdGVkRWRnZXMoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDgyOiAvLyBpZiByIG9yIFIgaXMgcHJlc3NlZFxuICAgICAgICAgIGlmIChlLmFsdEtleSAmJiBBY3RpdmUuVG9waWMpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgc2VsZi5jZW50ZXJBbmRSZXZlYWwoU2VsZWN0ZWQuTm9kZXMsIHtcbiAgICAgICAgICAgICAgY2VudGVyOiBmYWxzZSxcbiAgICAgICAgICAgICAgcmV2ZWFsOiB0cnVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDg0OiAvLyBpZiB0IG9yIFQgaXMgcHJlc3NlZFxuICAgICAgICAgIGlmIChlLmFsdEtleSAmJiBBY3RpdmUuVG9waWMpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgc2VsZi5jZW50ZXJBbmRSZXZlYWwoU2VsZWN0ZWQuTm9kZXMsIHtcbiAgICAgICAgICAgICAgY2VudGVyOiB0cnVlLFxuICAgICAgICAgICAgICByZXZlYWw6IHRydWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMTkxOiAvLyBpZiAvIGlzIHByZXNzZWRcbiAgICAgICAgICBpZiAoZS5jdHJsS2V5IHx8IGUubWV0YUtleSkge1xuICAgICAgICAgICAgU2VhcmNoLmZvY3VzKClcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhlLndoaWNoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfSlcbiAgICAkKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKFZpc3VhbGl6ZSAmJiBWaXN1YWxpemUubUdyYXBoKSB7XG4gICAgICAgIFV0aWwucmVzaXplQ2FudmFzKFZpc3VhbGl6ZS5tR3JhcGguY2FudmFzKVxuICAgICAgICBDcmVhdGUubmV3U3luYXBzZS51cGRhdGVGb3JtKClcbiAgICAgICAgQ3JlYXRlLm5ld1RvcGljLnBvc2l0aW9uKClcbiAgICAgIH1cblxuICAgICAgaWYgKEFjdGl2ZS5NYXAgJiYgUmVhbHRpbWUuaW5Db252ZXJzYXRpb24pIFJlYWx0aW1lLnBvc2l0aW9uVmlkZW9zKClcbiAgICAgIE1vYmlsZS5yZXNpemVUaXRsZSgpXG4gICAgfSlcbiAgfSxcbiAgY2VudGVyQW5kUmV2ZWFsOiBmdW5jdGlvbihub2Rlcywgb3B0cykge1xuICAgIGlmIChub2Rlcy5sZW5ndGggPCAxKSByZXR1cm5cbiAgICB2YXIgbm9kZSA9IG5vZGVzW25vZGVzLmxlbmd0aCAtIDFdXG4gICAgaWYgKG9wdHMuY2VudGVyICYmIG9wdHMucmV2ZWFsKSB7XG4gICAgICBUb3BpYy5jZW50ZXJPbihub2RlLmlkLCBmdW5jdGlvbigpIHtcbiAgICAgICAgVG9waWMuZmV0Y2hSZWxhdGl2ZXMobm9kZXMpXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAob3B0cy5jZW50ZXIpIHtcbiAgICAgIFRvcGljLmNlbnRlck9uKG5vZGUuaWQpXG4gICAgfSBlbHNlIGlmIChvcHRzLnJldmVhbCkge1xuICAgICAgVG9waWMuZmV0Y2hSZWxhdGl2ZXMobm9kZXMpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExpc3RlbmVyc1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9MaXN0ZW5lcnMuanMiXSwibWFwcGluZ3MiOiI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 624 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });\n\nvar _Active = __webpack_require__(6);var _Active2 = _interopRequireDefault(_Active);\nvar _Map = __webpack_require__(369);var _Map2 = _interopRequireDefault(_Map);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} /* global $ */\n\nvar Mobile = {\n  init: function init() {\n    var self = Mobile;\n\n    $('#menu_icon').click(self.toggleMenu);\n    $('#mobile_menu li a').click(self.liClick);\n    $('#header_content').click(self.titleClick);\n    self.resizeTitle();\n  },\n  resizeTitle: function resizeTitle() {\n    // the 70 relates to padding\n    $('#header_content').width($(document).width() - 70);\n  },\n  liClick: function liClick() {\n    var self = Mobile;\n    $('#header_content').html($(this).text());\n    self.toggleMenu();\n  },\n  toggleMenu: function toggleMenu() {\n    $('#mobile_menu').toggleClass('visible');\n  },\n  titleClick: function titleClick() {\n    if (_Active2.default.Map) {\n      _Map2.default.InfoBox.open();\n    }\n  } };exports.default =\n\n\nMobile;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjI0LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvTW9iaWxlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGdsb2JhbCAkICovXG5cbmltcG9ydCBBY3RpdmUgZnJvbSAnLi9BY3RpdmUnXG5pbXBvcnQgTWFwIGZyb20gJy4vTWFwJ1xuXG5jb25zdCBNb2JpbGUgPSB7XG4gIGluaXQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gTW9iaWxlXG5cbiAgICAkKCcjbWVudV9pY29uJykuY2xpY2soc2VsZi50b2dnbGVNZW51KVxuICAgICQoJyNtb2JpbGVfbWVudSBsaSBhJykuY2xpY2soc2VsZi5saUNsaWNrKVxuICAgICQoJyNoZWFkZXJfY29udGVudCcpLmNsaWNrKHNlbGYudGl0bGVDbGljaylcbiAgICBzZWxmLnJlc2l6ZVRpdGxlKClcbiAgfSxcbiAgcmVzaXplVGl0bGU6IGZ1bmN0aW9uKCkge1xuICAgIC8vIHRoZSA3MCByZWxhdGVzIHRvIHBhZGRpbmdcbiAgICAkKCcjaGVhZGVyX2NvbnRlbnQnKS53aWR0aCgkKGRvY3VtZW50KS53aWR0aCgpIC0gNzApXG4gIH0sXG4gIGxpQ2xpY2s6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gTW9iaWxlXG4gICAgJCgnI2hlYWRlcl9jb250ZW50JykuaHRtbCgkKHRoaXMpLnRleHQoKSlcbiAgICBzZWxmLnRvZ2dsZU1lbnUoKVxuICB9LFxuICB0b2dnbGVNZW51OiBmdW5jdGlvbigpIHtcbiAgICAkKCcjbW9iaWxlX21lbnUnKS50b2dnbGVDbGFzcygndmlzaWJsZScpXG4gIH0sXG4gIHRpdGxlQ2xpY2s6IGZ1bmN0aW9uKCkge1xuICAgIGlmIChBY3RpdmUuTWFwKSB7XG4gICAgICBNYXAuSW5mb0JveC5vcGVuKClcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTW9iaWxlXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZnJvbnRlbmQvc3JjL01ldGFtYXBzL01vYmlsZS5qcyJdLCJtYXBwaW5ncyI6Ijs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 625 */
/***/ function(module, exports, __webpack_require__) {

    eval("'use strict';Object.defineProperty(exports, \"__esModule\", { value: true });var _size2 = __webpack_require__(626);var _size3 = _interopRequireDefault(_size2);\n\nvar _JIT = __webpack_require__(170);var _JIT2 = _interopRequireDefault(_JIT);\n\nvar _Visualize = __webpack_require__(561);var _Visualize2 = _interopRequireDefault(_Visualize);\nvar _JIT3 = __webpack_require__(355);var _JIT4 = _interopRequireDefault(_JIT3);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}\n\nvar Organize = {\n  arrange: function arrange(layout, centerNode) {\n    // first option for layout to implement is 'grid', will do an evenly spaced grid with its center at the 0,0 origin\n    if (layout === 'grid') {(function () {\n        var numNodes = (0, _size3.default)(_Visualize2.default.mGraph.graph.nodes); // this will always be an integer, the # of nodes on your graph visualization\n        var numColumns = Math.floor(Math.sqrt(numNodes)); // the number of columns to make an even grid\n        var GRIDSPACE = 400;\n        var row = 0;\n        var column = 0;\n        _Visualize2.default.mGraph.graph.eachNode(function (n) {\n          if (column === numColumns) {\n            column = 0;\n            row += 1;\n          }\n          var newPos = new _JIT2.default.Complex();\n          newPos.x = column * GRIDSPACE;\n          newPos.y = row * GRIDSPACE;\n          n.setPos(newPos, 'end');\n          column += 1;\n        });\n        _Visualize2.default.mGraph.animate(_JIT4.default.ForceDirected.animateSavedLayout);})();\n    } else if (layout === 'grid_full') {(function () {\n        // this will always be an integer, the # of nodes on your graph visualization\n        var numNodes = (0, _size3.default)(_Visualize2.default.mGraph.graph.nodes);\n        var numColumns = Math.floor(Math.sqrt(numNodes)); // the number of columns to make an even grid\n        var height = _Visualize2.default.mGraph.canvas.getSize(0).height;\n        var width = _Visualize2.default.mGraph.canvas.getSize(0).width;\n        var totalArea = height * width;\n        var cellArea = totalArea / numNodes;\n        var ratio = height / width;\n        var cellWidth = Math.sqrt(cellArea / ratio);\n        var cellHeight = cellArea / cellWidth;\n        var GRIDSPACE = 400;\n        var row = Math.floor(height / cellHeight);\n        var column = Math.floor(width / cellWidth);\n        var totalCells = row * column;\n\n        if (totalCells) {\n          _Visualize2.default.mGraph.graph.eachNode(function (n) {\n            if (column === numColumns) {\n              column = 0;\n              row += 1;\n            }\n            var newPos = new _JIT2.default.Complex();\n            newPos.x = column * GRIDSPACE;\n            newPos.y = row * GRIDSPACE;\n            n.setPos(newPos, 'end');\n            column += 1;\n          });\n        }\n        _Visualize2.default.mGraph.animate(_JIT4.default.ForceDirected.animateSavedLayout);})();\n    } else if (layout === 'radial') {\n      var centerX = centerNode.getPos().x;\n      var centerY = centerNode.getPos().y;\n      centerNode.setPos(centerNode.getPos(), 'end');\n\n      console.log(centerNode.adjacencies);\n      var lineLength = 200;\n      var usedNodes = {};\n      usedNodes[centerNode.id] = centerNode;\n      var radial = function radial(node, level, degree) {\n        if (level === 1) {\n          var numLinksTemp = (0, _size3.default)(node.adjacencies);\n          var angleTemp = 2 * Math.PI / numLinksTemp;\n        } else {\n          angleTemp = 2 * Math.PI / 20;\n        }\n        node.eachAdjacency(function (a) {\n          var isSecondLevelNode = centerNode.adjacencies[a.nodeTo.id] !== undefined && level > 1;\n          if (usedNodes[a.nodeTo.id] === undefined && !isSecondLevelNode) {\n            var newPos = new _JIT2.default.Complex();\n            newPos.x = level * lineLength * Math.sin(degree) + centerX;\n            newPos.y = level * lineLength * Math.cos(degree) + centerY;\n            a.nodeTo.setPos(newPos, 'end');\n            usedNodes[a.nodeTo.id] = a.nodeTo;\n\n            radial(a.nodeTo, level + 1, degree);\n            degree += angleTemp;\n          }\n        });\n      };\n      radial(centerNode, 1, 0);\n      _Visualize2.default.mGraph.animate(_JIT4.default.ForceDirected.animateSavedLayout);\n    } else if (layout === 'center_viewport') {(function () {\n        var lowX = 0;\n        var lowY = 0;\n        var highX = 0;\n        var highY = 0;\n\n        _Visualize2.default.mGraph.graph.eachNode(function (n) {\n          if (n.id === 1) {\n            lowX = n.getPos().x;\n            lowY = n.getPos().y;\n            highX = n.getPos().x;\n            highY = n.getPos().y;\n          }\n          if (n.getPos().x < lowX) lowX = n.getPos().x;\n          if (n.getPos().y < lowY) lowY = n.getPos().y;\n          if (n.getPos().x > highX) highX = n.getPos().x;\n          if (n.getPos().y > highY) highY = n.getPos().y;\n        });\n        console.log(lowX, lowY, highX, highY);})();\n    } else {\n      window.alert('please call function with a valid layout dammit!');\n    }\n  } };exports.default =\n\n\nOrganize;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjI1LmpzIiwic291cmNlcyI6WyJmcm9udGVuZC9zcmMvTWV0YW1hcHMvT3JnYW5pemUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJ1xuXG5pbXBvcnQgJGppdCBmcm9tICcuLi9wYXRjaGVkL0pJVCdcblxuaW1wb3J0IFZpc3VhbGl6ZSBmcm9tICcuL1Zpc3VhbGl6ZSdcbmltcG9ydCBKSVQgZnJvbSAnLi9KSVQnXG5cbmNvbnN0IE9yZ2FuaXplID0ge1xuICBhcnJhbmdlOiBmdW5jdGlvbihsYXlvdXQsIGNlbnRlck5vZGUpIHtcbiAgICAvLyBmaXJzdCBvcHRpb24gZm9yIGxheW91dCB0byBpbXBsZW1lbnQgaXMgJ2dyaWQnLCB3aWxsIGRvIGFuIGV2ZW5seSBzcGFjZWQgZ3JpZCB3aXRoIGl0cyBjZW50ZXIgYXQgdGhlIDAsMCBvcmlnaW5cbiAgICBpZiAobGF5b3V0ID09PSAnZ3JpZCcpIHtcbiAgICAgIGNvbnN0IG51bU5vZGVzID0gXy5zaXplKFZpc3VhbGl6ZS5tR3JhcGguZ3JhcGgubm9kZXMpIC8vIHRoaXMgd2lsbCBhbHdheXMgYmUgYW4gaW50ZWdlciwgdGhlICMgb2Ygbm9kZXMgb24geW91ciBncmFwaCB2aXN1YWxpemF0aW9uXG4gICAgICBjb25zdCBudW1Db2x1bW5zID0gTWF0aC5mbG9vcihNYXRoLnNxcnQobnVtTm9kZXMpKSAvLyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgdG8gbWFrZSBhbiBldmVuIGdyaWRcbiAgICAgIGNvbnN0IEdSSURTUEFDRSA9IDQwMFxuICAgICAgbGV0IHJvdyA9IDBcbiAgICAgIGxldCBjb2x1bW4gPSAwXG4gICAgICBWaXN1YWxpemUubUdyYXBoLmdyYXBoLmVhY2hOb2RlKGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgaWYgKGNvbHVtbiA9PT0gbnVtQ29sdW1ucykge1xuICAgICAgICAgIGNvbHVtbiA9IDBcbiAgICAgICAgICByb3cgKz0gMVxuICAgICAgICB9XG4gICAgICAgIHZhciBuZXdQb3MgPSBuZXcgJGppdC5Db21wbGV4KClcbiAgICAgICAgbmV3UG9zLnggPSBjb2x1bW4gKiBHUklEU1BBQ0VcbiAgICAgICAgbmV3UG9zLnkgPSByb3cgKiBHUklEU1BBQ0VcbiAgICAgICAgbi5zZXRQb3MobmV3UG9zLCAnZW5kJylcbiAgICAgICAgY29sdW1uICs9IDFcbiAgICAgIH0pXG4gICAgICBWaXN1YWxpemUubUdyYXBoLmFuaW1hdGUoSklULkZvcmNlRGlyZWN0ZWQuYW5pbWF0ZVNhdmVkTGF5b3V0KVxuICAgIH0gZWxzZSBpZiAobGF5b3V0ID09PSAnZ3JpZF9mdWxsJykge1xuICAgICAgLy8gdGhpcyB3aWxsIGFsd2F5cyBiZSBhbiBpbnRlZ2VyLCB0aGUgIyBvZiBub2RlcyBvbiB5b3VyIGdyYXBoIHZpc3VhbGl6YXRpb25cbiAgICAgIGNvbnN0IG51bU5vZGVzID0gXy5zaXplKFZpc3VhbGl6ZS5tR3JhcGguZ3JhcGgubm9kZXMpXG4gICAgICBjb25zdCBudW1Db2x1bW5zID0gTWF0aC5mbG9vcihNYXRoLnNxcnQobnVtTm9kZXMpKSAvLyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgdG8gbWFrZSBhbiBldmVuIGdyaWRcbiAgICAgIGNvbnN0IGhlaWdodCA9IFZpc3VhbGl6ZS5tR3JhcGguY2FudmFzLmdldFNpemUoMCkuaGVpZ2h0XG4gICAgICBjb25zdCB3aWR0aCA9IFZpc3VhbGl6ZS5tR3JhcGguY2FudmFzLmdldFNpemUoMCkud2lkdGhcbiAgICAgIGNvbnN0IHRvdGFsQXJlYSA9IGhlaWdodCAqIHdpZHRoXG4gICAgICBjb25zdCBjZWxsQXJlYSA9IHRvdGFsQXJlYSAvIG51bU5vZGVzXG4gICAgICBjb25zdCByYXRpbyA9IGhlaWdodCAvIHdpZHRoXG4gICAgICBjb25zdCBjZWxsV2lkdGggPSBNYXRoLnNxcnQoY2VsbEFyZWEgLyByYXRpbylcbiAgICAgIGNvbnN0IGNlbGxIZWlnaHQgPSBjZWxsQXJlYSAvIGNlbGxXaWR0aFxuICAgICAgY29uc3QgR1JJRFNQQUNFID0gNDAwXG4gICAgICBsZXQgcm93ID0gTWF0aC5mbG9vcihoZWlnaHQgLyBjZWxsSGVpZ2h0KVxuICAgICAgbGV0IGNvbHVtbiA9IE1hdGguZmxvb3Iod2lkdGggLyBjZWxsV2lkdGgpXG4gICAgICBjb25zdCB0b3RhbENlbGxzID0gcm93ICogY29sdW1uXG5cbiAgICAgIGlmICh0b3RhbENlbGxzKSB7XG4gICAgICAgIFZpc3VhbGl6ZS5tR3JhcGguZ3JhcGguZWFjaE5vZGUoZnVuY3Rpb24obikge1xuICAgICAgICAgIGlmIChjb2x1bW4gPT09IG51bUNvbHVtbnMpIHtcbiAgICAgICAgICAgIGNvbHVtbiA9IDBcbiAgICAgICAgICAgIHJvdyArPSAxXG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBuZXdQb3MgPSBuZXcgJGppdC5Db21wbGV4KClcbiAgICAgICAgICBuZXdQb3MueCA9IGNvbHVtbiAqIEdSSURTUEFDRVxuICAgICAgICAgIG5ld1Bvcy55ID0gcm93ICogR1JJRFNQQUNFXG4gICAgICAgICAgbi5zZXRQb3MobmV3UG9zLCAnZW5kJylcbiAgICAgICAgICBjb2x1bW4gKz0gMVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgVmlzdWFsaXplLm1HcmFwaC5hbmltYXRlKEpJVC5Gb3JjZURpcmVjdGVkLmFuaW1hdGVTYXZlZExheW91dClcbiAgICB9IGVsc2UgaWYgKGxheW91dCA9PT0gJ3JhZGlhbCcpIHtcbiAgICAgIHZhciBjZW50ZXJYID0gY2VudGVyTm9kZS5nZXRQb3MoKS54XG4gICAgICB2YXIgY2VudGVyWSA9IGNlbnRlck5vZGUuZ2V0UG9zKCkueVxuICAgICAgY2VudGVyTm9kZS5zZXRQb3MoY2VudGVyTm9kZS5nZXRQb3MoKSwgJ2VuZCcpXG5cbiAgICAgIGNvbnNvbGUubG9nKGNlbnRlck5vZGUuYWRqYWNlbmNpZXMpXG4gICAgICB2YXIgbGluZUxlbmd0aCA9IDIwMFxuICAgICAgdmFyIHVzZWROb2RlcyA9IHt9XG4gICAgICB1c2VkTm9kZXNbY2VudGVyTm9kZS5pZF0gPSBjZW50ZXJOb2RlXG4gICAgICB2YXIgcmFkaWFsID0gZnVuY3Rpb24obm9kZSwgbGV2ZWwsIGRlZ3JlZSkge1xuICAgICAgICBpZiAobGV2ZWwgPT09IDEpIHtcbiAgICAgICAgICB2YXIgbnVtTGlua3NUZW1wID0gXy5zaXplKG5vZGUuYWRqYWNlbmNpZXMpXG4gICAgICAgICAgdmFyIGFuZ2xlVGVtcCA9IDIgKiBNYXRoLlBJIC8gbnVtTGlua3NUZW1wXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYW5nbGVUZW1wID0gMiAqIE1hdGguUEkgLyAyMFxuICAgICAgICB9XG4gICAgICAgIG5vZGUuZWFjaEFkamFjZW5jeShmdW5jdGlvbihhKSB7XG4gICAgICAgICAgdmFyIGlzU2Vjb25kTGV2ZWxOb2RlID0gKGNlbnRlck5vZGUuYWRqYWNlbmNpZXNbYS5ub2RlVG8uaWRdICE9PSB1bmRlZmluZWQgJiYgbGV2ZWwgPiAxKVxuICAgICAgICAgIGlmICh1c2VkTm9kZXNbYS5ub2RlVG8uaWRdID09PSB1bmRlZmluZWQgJiYgIWlzU2Vjb25kTGV2ZWxOb2RlKSB7XG4gICAgICAgICAgICB2YXIgbmV3UG9zID0gbmV3ICRqaXQuQ29tcGxleCgpXG4gICAgICAgICAgICBuZXdQb3MueCA9IGxldmVsICogbGluZUxlbmd0aCAqIE1hdGguc2luKGRlZ3JlZSkgKyBjZW50ZXJYXG4gICAgICAgICAgICBuZXdQb3MueSA9IGxldmVsICogbGluZUxlbmd0aCAqIE1hdGguY29zKGRlZ3JlZSkgKyBjZW50ZXJZXG4gICAgICAgICAgICBhLm5vZGVUby5zZXRQb3MobmV3UG9zLCAnZW5kJylcbiAgICAgICAgICAgIHVzZWROb2Rlc1thLm5vZGVUby5pZF0gPSBhLm5vZGVUb1xuXG4gICAgICAgICAgICByYWRpYWwoYS5ub2RlVG8sIGxldmVsICsgMSwgZGVncmVlKVxuICAgICAgICAgICAgZGVncmVlICs9IGFuZ2xlVGVtcFxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJhZGlhbChjZW50ZXJOb2RlLCAxLCAwKVxuICAgICAgVmlzdWFsaXplLm1HcmFwaC5hbmltYXRlKEpJVC5Gb3JjZURpcmVjdGVkLmFuaW1hdGVTYXZlZExheW91dClcbiAgICB9IGVsc2UgaWYgKGxheW91dCA9PT0gJ2NlbnRlcl92aWV3cG9ydCcpIHtcbiAgICAgIGxldCBsb3dYID0gMFxuICAgICAgbGV0IGxvd1kgPSAwXG4gICAgICBsZXQgaGlnaFggPSAwXG4gICAgICBsZXQgaGlnaFkgPSAwXG5cbiAgICAgIFZpc3VhbGl6ZS5tR3JhcGguZ3JhcGguZWFjaE5vZGUoZnVuY3Rpb24obikge1xuICAgICAgICBpZiAobi5pZCA9PT0gMSkge1xuICAgICAgICAgIGxvd1ggPSBuLmdldFBvcygpLnhcbiAgICAgICAgICBsb3dZID0gbi5nZXRQb3MoKS55XG4gICAgICAgICAgaGlnaFggPSBuLmdldFBvcygpLnhcbiAgICAgICAgICBoaWdoWSA9IG4uZ2V0UG9zKCkueVxuICAgICAgICB9XG4gICAgICAgIGlmIChuLmdldFBvcygpLnggPCBsb3dYKSBsb3dYID0gbi5nZXRQb3MoKS54XG4gICAgICAgIGlmIChuLmdldFBvcygpLnkgPCBsb3dZKSBsb3dZID0gbi5nZXRQb3MoKS55XG4gICAgICAgIGlmIChuLmdldFBvcygpLnggPiBoaWdoWCkgaGlnaFggPSBuLmdldFBvcygpLnhcbiAgICAgICAgaWYgKG4uZ2V0UG9zKCkueSA+IGhpZ2hZKSBoaWdoWSA9IG4uZ2V0UG9zKCkueVxuICAgICAgfSlcbiAgICAgIGNvbnNvbGUubG9nKGxvd1gsIGxvd1ksIGhpZ2hYLCBoaWdoWSlcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmFsZXJ0KCdwbGVhc2UgY2FsbCBmdW5jdGlvbiB3aXRoIGEgdmFsaWQgbGF5b3V0IGRhbW1pdCEnKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBPcmdhbml6ZVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGZyb250ZW5kL3NyYy9NZXRhbWFwcy9Pcmdhbml6ZS5qcyJdLCJtYXBwaW5ncyI6Ijs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 626 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseKeys = __webpack_require__(104),\n    getTag = __webpack_require__(109),\n    isArrayLike = __webpack_require__(108),\n    isString = __webpack_require__(627),\n    stringSize = __webpack_require__(628);\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    setTag = '[object Set]';\n\n/**\n * Gets the size of `collection` by returning its length for array-like\n * values or the number of own enumerable string keyed properties for objects.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @returns {number} Returns the collection size.\n * @example\n *\n * _.size([1, 2, 3]);\n * // => 3\n *\n * _.size({ 'a': 1, 'b': 2 });\n * // => 2\n *\n * _.size('pebbles');\n * // => 7\n */\nfunction size(collection) {\n  if (collection == null) {\n    return 0;\n  }\n  if (isArrayLike(collection)) {\n    return isString(collection) ? stringSize(collection) : collection.length;\n  }\n  var tag = getTag(collection);\n  if (tag == mapTag || tag == setTag) {\n    return collection.size;\n  }\n  return baseKeys(collection).length;\n}\n\nmodule.exports = size;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjI2LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvc2l6ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUtleXMgPSByZXF1aXJlKCcuL19iYXNlS2V5cycpLFxuICAgIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzU3RyaW5nID0gcmVxdWlyZSgnLi9pc1N0cmluZycpLFxuICAgIHN0cmluZ1NpemUgPSByZXF1aXJlKCcuL19zdHJpbmdTaXplJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJztcblxuLyoqXG4gKiBHZXRzIHRoZSBzaXplIG9mIGBjb2xsZWN0aW9uYCBieSByZXR1cm5pbmcgaXRzIGxlbmd0aCBmb3IgYXJyYXktbGlrZVxuICogdmFsdWVzIG9yIHRoZSBudW1iZXIgb2Ygb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgZm9yIG9iamVjdHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29sbGVjdGlvbiBzaXplLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnNpemUoWzEsIDIsIDNdKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnNpemUoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAqIC8vID0+IDJcbiAqXG4gKiBfLnNpemUoJ3BlYmJsZXMnKTtcbiAqIC8vID0+IDdcbiAqL1xuZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKSB7XG4gIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICByZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbikgPyBzdHJpbmdTaXplKGNvbGxlY3Rpb24pIDogY29sbGVjdGlvbi5sZW5ndGg7XG4gIH1cbiAgdmFyIHRhZyA9IGdldFRhZyhjb2xsZWN0aW9uKTtcbiAgaWYgKHRhZyA9PSBtYXBUYWcgfHwgdGFnID09IHNldFRhZykge1xuICAgIHJldHVybiBjb2xsZWN0aW9uLnNpemU7XG4gIH1cbiAgcmV0dXJuIGJhc2VLZXlzKGNvbGxlY3Rpb24pLmxlbmd0aDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaXplO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9zaXplLmpzXG4vLyBtb2R1bGUgaWQgPSA2MjZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

/***/ },
/* 627 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseGetTag = __webpack_require__(20),\n    isArray = __webpack_require__(86),\n    isObjectLike = __webpack_require__(26);\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n  return typeof value == 'string' ||\n    (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nmodule.exports = isString;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjI3LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNTdHJpbmcuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN0cmluZ2AgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN0cmluZywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3RyaW5nKDEpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fFxuICAgICghaXNBcnJheSh2YWx1ZSkgJiYgaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzdHJpbmdUYWcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3RyaW5nO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9pc1N0cmluZy5qc1xuLy8gbW9kdWxlIGlkID0gNjI3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 628 */
/***/ function(module, exports, __webpack_require__) {

    eval("var asciiSize = __webpack_require__(629),\n    hasUnicode = __webpack_require__(630),\n    unicodeSize = __webpack_require__(631);\n\n/**\n * Gets the number of symbols in `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the string size.\n */\nfunction stringSize(string) {\n  return hasUnicode(string)\n    ? unicodeSize(string)\n    : asciiSize(string);\n}\n\nmodule.exports = stringSize;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjI4LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0cmluZ1NpemUuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGFzY2lpU2l6ZSA9IHJlcXVpcmUoJy4vX2FzY2lpU2l6ZScpLFxuICAgIGhhc1VuaWNvZGUgPSByZXF1aXJlKCcuL19oYXNVbmljb2RlJyksXG4gICAgdW5pY29kZVNpemUgPSByZXF1aXJlKCcuL191bmljb2RlU2l6ZScpO1xuXG4vKipcbiAqIEdldHMgdGhlIG51bWJlciBvZiBzeW1ib2xzIGluIGBzdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICovXG5mdW5jdGlvbiBzdHJpbmdTaXplKHN0cmluZykge1xuICByZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgPyB1bmljb2RlU2l6ZShzdHJpbmcpXG4gICAgOiBhc2NpaVNpemUoc3RyaW5nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpbmdTaXplO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fc3RyaW5nU2l6ZS5qc1xuLy8gbW9kdWxlIGlkID0gNjI4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ },
/* 629 */
/***/ function(module, exports, __webpack_require__) {

    eval("var baseProperty = __webpack_require__(134);\n\n/**\n * Gets the size of an ASCII `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\nvar asciiSize = baseProperty('length');\n\nmodule.exports = asciiSize;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjI5LmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FzY2lpU2l6ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fYmFzZVByb3BlcnR5Jyk7XG5cbi8qKlxuICogR2V0cyB0aGUgc2l6ZSBvZiBhbiBBU0NJSSBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAqL1xudmFyIGFzY2lpU2l6ZSA9IGJhc2VQcm9wZXJ0eSgnbGVuZ3RoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYXNjaWlTaXplO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2xvZGFzaC9fYXNjaWlTaXplLmpzXG4vLyBtb2R1bGUgaWQgPSA2Mjlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 630 */
/***/ function(module, exports) {

    eval("/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n    rsComboMarksRange = '\\\\u0300-\\\\u036f',\n    reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n    rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n    rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsZWJ = '\\\\u200d';\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n  return reHasUnicode.test(string);\n}\n\nmodule.exports = hasUnicode;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjMwLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc1VuaWNvZGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNoYXJhY3RlciBjbGFzc2VzLiAqL1xudmFyIHJzQXN0cmFsUmFuZ2UgPSAnXFxcXHVkODAwLVxcXFx1ZGZmZicsXG4gICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgcmVDb21ib0hhbGZNYXJrc1JhbmdlID0gJ1xcXFx1ZmUyMC1cXFxcdWZlMmYnLFxuICAgIHJzQ29tYm9TeW1ib2xzUmFuZ2UgPSAnXFxcXHUyMGQwLVxcXFx1MjBmZicsXG4gICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgIHJzVmFyUmFuZ2UgPSAnXFxcXHVmZTBlXFxcXHVmZTBmJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xudmFyIHJzWldKID0gJ1xcXFx1MjAwZCc7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBzdHJpbmdzIHdpdGggW3plcm8td2lkdGggam9pbmVycyBvciBjb2RlIHBvaW50cyBmcm9tIHRoZSBhc3RyYWwgcGxhbmVzXShodHRwOi8vZWV2LmVlL2Jsb2cvMjAxNS8wOS8xMi9kYXJrLWNvcm5lcnMtb2YtdW5pY29kZS8pLiAqL1xudmFyIHJlSGFzVW5pY29kZSA9IFJlZ0V4cCgnWycgKyByc1pXSiArIHJzQXN0cmFsUmFuZ2UgICsgcnNDb21ib1JhbmdlICsgcnNWYXJSYW5nZSArICddJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBzdHJpbmdgIGNvbnRhaW5zIFVuaWNvZGUgc3ltYm9scy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYSBzeW1ib2wgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzVW5pY29kZShzdHJpbmcpIHtcbiAgcmV0dXJuIHJlSGFzVW5pY29kZS50ZXN0KHN0cmluZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzVW5pY29kZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX2hhc1VuaWNvZGUuanNcbi8vIG1vZHVsZSBpZCA9IDYzMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 631 */
/***/ function(module, exports) {

    eval("/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n    rsComboMarksRange = '\\\\u0300-\\\\u036f',\n    reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n    rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n    rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n    rsCombo = '[' + rsComboRange + ']',\n    rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n    rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n    rsNonAstral = '[^' + rsAstralRange + ']',\n    rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n    rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n    rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n    rsOptVar = '[' + rsVarRange + ']?',\n    rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n    rsSeq = rsOptVar + reOptMod + rsOptJoin,\n    rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/**\n * Gets the size of a Unicode `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\nfunction unicodeSize(string) {\n  var result = reUnicode.lastIndex = 0;\n  while (reUnicode.test(string)) {\n    ++result;\n  }\n  return result;\n}\n\nmodule.exports = unicodeSize;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjMxLmpzIiwic291cmNlcyI6WyIvaG9tZS91YnVudHUvd29ya3NwYWNlL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3VuaWNvZGVTaXplLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbnZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgIHJzQ29tYm9NYXJrc1JhbmdlID0gJ1xcXFx1MDMwMC1cXFxcdTAzNmYnLFxuICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgIHJzQ29tYm9SYW5nZSA9IHJzQ29tYm9NYXJrc1JhbmdlICsgcmVDb21ib0hhbGZNYXJrc1JhbmdlICsgcnNDb21ib1N5bWJvbHNSYW5nZSxcbiAgICByc1ZhclJhbmdlID0gJ1xcXFx1ZmUwZVxcXFx1ZmUwZic7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc0FzdHJhbCA9ICdbJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNDb21ibyA9ICdbJyArIHJzQ29tYm9SYW5nZSArICddJyxcbiAgICByc0ZpdHogPSAnXFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdJyxcbiAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgIHJzTm9uQXN0cmFsID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNSZWdpb25hbCA9ICcoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9JyxcbiAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIHJlZ2V4ZXMuICovXG52YXIgcmVPcHRNb2QgPSByc01vZGlmaWVyICsgJz8nLFxuICAgIHJzT3B0VmFyID0gJ1snICsgcnNWYXJSYW5nZSArICddPycsXG4gICAgcnNPcHRKb2luID0gJyg/OicgKyByc1pXSiArICcoPzonICsgW3JzTm9uQXN0cmFsLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc09wdFZhciArIHJlT3B0TW9kICsgJykqJyxcbiAgICByc1NlcSA9IHJzT3B0VmFyICsgcmVPcHRNb2QgKyByc09wdEpvaW4sXG4gICAgcnNTeW1ib2wgPSAnKD86JyArIFtyc05vbkFzdHJhbCArIHJzQ29tYm8gKyAnPycsIHJzQ29tYm8sIHJzUmVnaW9uYWwsIHJzU3VyclBhaXIsIHJzQXN0cmFsXS5qb2luKCd8JykgKyAnKSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIFtzdHJpbmcgc3ltYm9sc10oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtdW5pY29kZSkuICovXG52YXIgcmVVbmljb2RlID0gUmVnRXhwKHJzRml0eiArICcoPz0nICsgcnNGaXR6ICsgJyl8JyArIHJzU3ltYm9sICsgcnNTZXEsICdnJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgc2l6ZSBvZiBhIFVuaWNvZGUgYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gKi9cbmZ1bmN0aW9uIHVuaWNvZGVTaXplKHN0cmluZykge1xuICB2YXIgcmVzdWx0ID0gcmVVbmljb2RlLmxhc3RJbmRleCA9IDA7XG4gIHdoaWxlIChyZVVuaWNvZGUudGVzdChzdHJpbmcpKSB7XG4gICAgKytyZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1bmljb2RlU2l6ZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9sb2Rhc2gvX3VuaWNvZGVTaXplLmpzXG4vLyBtb2R1bGUgaWQgPSA2MzFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ }
/******/ ]);